web2py-2.12.3.orig/0000755000000000000000000000000012601572550012447 5ustar rootrootweb2py-2.12.3.orig/anyserver.py0000664000000000000000000003124512564727252015057 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- """ This file is part of the web2py Web Framework Copyrighted by Massimo Di Pierro License: LGPLv3 (http://www.gnu.org/licenses/lgpl.html) This file is based, although a rewrite, on MIT-licensed code from the Bottle web framework. """ import os import sys import optparse import urllib path = os.path.dirname(os.path.abspath(__file__)) os.chdir(path) sys.path = [path] + [p for p in sys.path if not p == path] class Servers: @staticmethod def cgi(app, address=None, **options): from wsgiref.handlers import CGIHandler CGIHandler().run(app) # Just ignore host and port here @staticmethod def flup(app, address, **options): import flup.server.fcgi flup.server.fcgi.WSGIServer(app, bindAddress=address).run() @staticmethod def wsgiref(app, address, **options): # pragma: no cover from wsgiref.simple_server import make_server, WSGIRequestHandler options = {} class QuietHandler(WSGIRequestHandler): def log_request(*args, **kw): pass options['handler_class'] = QuietHandler srv = make_server(address[0], address[1], app, **options) srv.serve_forever() @staticmethod def cherrypy(app, address, **options): from cherrypy import wsgiserver server = wsgiserver.CherryPyWSGIServer(address, app) server.start() @staticmethod def rocket(app, address, **options): from gluon.rocket import CherryPyWSGIServer server = CherryPyWSGIServer(address, app) server.start() @staticmethod def rocket_with_repoze_profiler(app, address, **options): from gluon.rocket import CherryPyWSGIServer from repoze.profile.profiler import AccumulatingProfileMiddleware from gluon.settings import global_settings global_settings.web2py_crontype = 'none' wrapped = AccumulatingProfileMiddleware( app, log_filename='wsgi.prof', discard_first_request=True, flush_at_shutdown=True, path='/__profile__' ) server = CherryPyWSGIServer(address, wrapped) server.start() @staticmethod def paste(app, address, **options): options = {} from paste import httpserver from paste.translogger import TransLogger httpserver.serve(app, host=address[0], port=address[1], **options) @staticmethod def fapws(app, address, **options): import fapws._evwsgi as evwsgi from fapws import base evwsgi.start(address[0], str(address[1])) evwsgi.set_base_module(base) def app(environ, start_response): environ['wsgi.multiprocess'] = False return app(environ, start_response) evwsgi.wsgi_cb(('', app)) evwsgi.run() @staticmethod def gevent(app, address, **options): options = options['options'] workers = options.workers from gevent import pywsgi from gevent.pool import Pool pywsgi.WSGIServer(address, app, spawn=workers and Pool( int(options.workers)) or 'default', log=None).serve_forever() @staticmethod def bjoern(app, address, **options): import bjoern bjoern.run(app, *address) @staticmethod def tornado(app, address, **options): import tornado.wsgi import tornado.httpserver import tornado.ioloop container = tornado.wsgi.WSGIContainer(app) server = tornado.httpserver.HTTPServer(container) server.listen(address=address[0], port=address[1]) tornado.ioloop.IOLoop.instance().start() @staticmethod def twisted(app, address, **options): from twisted.web import server, wsgi from twisted.python.threadpool import ThreadPool from twisted.internet import reactor thread_pool = ThreadPool() thread_pool.start() reactor.addSystemEventTrigger('after', 'shutdown', thread_pool.stop) factory = server.Site(wsgi.WSGIResource(reactor, thread_pool, app)) reactor.listenTCP(address[1], factory, interface=address[0]) reactor.run() @staticmethod def diesel(app, address, **options): from diesel.protocols.wsgi import WSGIApplication app = WSGIApplication(app, port=address[1]) app.run() @staticmethod def gunicorn(app, address, **options): options = {} from gunicorn.app.base import Application config = {'bind': "%s:%d" % address} config.update(options) sys.argv = ['anyserver.py'] class GunicornApplication(Application): def init(self, parser, opts, args): return config def load(self): return app g = GunicornApplication() g.run() @staticmethod def eventlet(app, address, **options): from eventlet import wsgi, listen wsgi.server(listen(address), app) @staticmethod def mongrel2(app, address, **options): import uuid sys.path.append(os.path.abspath(os.path.dirname(__file__))) from mongrel2 import handler conn = handler.Connection(str(uuid.uuid4()), "tcp://127.0.0.1:9997", "tcp://127.0.0.1:9996") mongrel2_handler(app, conn, debug=False) @staticmethod def motor(app, address, **options): #https://github.com/rpedroso/motor import motor app = motor.WSGIContainer(app) http_server = motor.HTTPServer(app) http_server.listen(address=address[0], port=address[1]) #http_server.start(2) motor.IOLoop.instance().start() @staticmethod def pulsar(app, address, **options): from pulsar.apps import wsgi sys.argv = ['anyserver.py'] s = wsgi.WSGIServer(callable=app, bind="%s:%d" % address) s.start() @staticmethod def waitress(app, address, **options): from waitress import serve serve(app, host=address[0], port=address[1], _quiet=True) def mongrel2_handler(application, conn, debug=False): """ Based on : https://github.com/berry/Mongrel2-WSGI-Handler/blob/master/wsgi-handler.py WSGI handler based on the Python wsgiref SimpleHandler. A WSGI application should return a iterable op StringTypes. Any encoding must be handled by the WSGI application itself. """ from wsgiref.handlers import SimpleHandler try: import cStringIO as StringIO except: import StringIO # TODO - this wsgi handler executes the application and renders a page # in memory completely before returning it as a response to the client. # Thus, it does not "stream" the result back to the client. It should be # possible though. The SimpleHandler accepts file-like stream objects. So, # it should be just a matter of connecting 0MQ requests/response streams to # the SimpleHandler requests and response streams. However, the Python API # for Mongrel2 doesn't seem to support file-like stream objects for requests # and responses. Unless I have missed something. while True: if debug: print "WAITING FOR REQUEST" # receive a request req = conn.recv() if debug: print "REQUEST BODY: %r\n" % req.body if req.is_disconnect(): if debug: print "DISCONNECT" continue # effectively ignore the disconnect from the client # Set a couple of environment attributes a.k.a. header attributes # that are a must according to PEP 333 environ = req.headers environ['SERVER_PROTOCOL'] = 'HTTP/1.1' # SimpleHandler expects a server_protocol, lets assume it is HTTP 1.1 environ['REQUEST_METHOD'] = environ['METHOD'] if ':' in environ['Host']: environ['SERVER_NAME'] = environ['Host'].split(':')[0] environ['SERVER_PORT'] = environ['Host'].split(':')[1] else: environ['SERVER_NAME'] = environ['Host'] environ['SERVER_PORT'] = '' environ['SCRIPT_NAME'] = '' # empty for now environ['PATH_INFO'] = urllib.unquote(environ['PATH']) if '?' in environ['URI']: environ['QUERY_STRING'] = environ['URI'].split('?')[1] else: environ['QUERY_STRING'] = '' if 'Content-Length' in environ: environ['CONTENT_LENGTH'] = environ[ 'Content-Length'] # necessary for POST to work with Django environ['wsgi.input'] = req.body if debug: print "ENVIRON: %r\n" % environ # SimpleHandler needs file-like stream objects for # requests, errors and responses reqIO = StringIO.StringIO(req.body) errIO = StringIO.StringIO() respIO = StringIO.StringIO() # execute the application handler = SimpleHandler(reqIO, respIO, errIO, environ, multithread=False, multiprocess=False) handler.run(application) # Get the response and filter out the response (=data) itself, # the response headers, # the response status code and the response status description response = respIO.getvalue() response = response.split("\r\n") data = response[-1] headers = dict([r.split(": ") for r in response[1:-2]]) code = response[0][9:12] status = response[0][13:] # strip BOM's from response data # Especially the WSGI handler from Django seems to generate them (2 actually, huh?) # a BOM isn't really necessary and cause HTML parsing errors in Chrome and Safari # See also: http://www.xs4all.nl/~mechiel/projects/bomstrip/ # Although I still find this a ugly hack, it does work. data = data.replace('\xef\xbb\xbf', '') # Get the generated errors errors = errIO.getvalue() # return the response if debug: print "RESPONSE: %r\n" % response if errors: if debug: print "ERRORS: %r" % errors data = "%s\r\n\r\n%s" % (data, errors) conn.reply_http( req, data, code=code, status=status, headers=headers) def run(servername, ip, port, softcron=True, logging=False, profiler=None, options=None): if servername == 'gevent': from gevent import monkey monkey.patch_all() elif servername == 'eventlet': import eventlet eventlet.monkey_patch() import gluon.main if logging: application = gluon.main.appfactory(wsgiapp=gluon.main.wsgibase, logfilename='httpserver.log', profiler_dir=profiler) else: application = gluon.main.wsgibase if softcron: from gluon.settings import global_settings global_settings.web2py_crontype = 'soft' getattr(Servers, servername)(application, (ip, int(port)), options=options) def main(): usage = "python anyserver.py -s tornado -i 127.0.0.1 -p 8000 -l -P" try: version = open('VERSION','r') except IOError: version = '' parser = optparse.OptionParser(usage, None, optparse.Option, version) parser.add_option('-l', '--logging', action='store_true', default=False, dest='logging', help='log into httpserver.log') parser.add_option('-P', '--profiler', default=False, dest='profiler_dir', help='profiler dir') servers = ', '.join(x for x in dir(Servers) if not x[0] == '_') parser.add_option('-s', '--server', default='rocket', dest='server', help='server name (%s)' % servers) parser.add_option('-i', '--ip', default='127.0.0.1', dest='ip', help='ip address') parser.add_option('-p', '--port', default='8000', dest='port', help='port number') parser.add_option('-w', '--workers', default=None, dest='workers', help='number of workers number') (options, args) = parser.parse_args() print 'starting %s on %s:%s...' % ( options.server, options.ip, options.port) run(options.server, options.ip, options.port, logging=options.logging, profiler=options.profiler_dir, options=options) if __name__ == '__main__': main() web2py-2.12.3.orig/NEWINSTALL0000664000000000000000000000000112564727440014053 0ustar rootroot web2py-2.12.3.orig/LICENSE0000664000000000000000000001525212564727252013474 0ustar rootroot## Web2py License Web2py is Licensed under the LGPL license version 3 (http://www.gnu.org/licenses/lgpl.html) Copyrighted (c) by Massimo Di Pierro (2007-2013) ### On Commercial Redistribution In accordance with LGPL you may: - redistribute web2py with your apps (including official web2py binary versions) - release your applications which use official web2py libraries under any license you wish But you must: - make clear in the documentation that your application uses web2py - release any modification of the web2py libraries under the LGPLv3 license THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. (Earlier versions of web2py, 1.0.*-1.90.*, were released under the GPL2 license plus a commercial exception which, for practical purposes, was very similar to the current LPGLv3) ### Licenses for third party contributed software web2py contains third party software under the gluon/contrib/ folder. Each file/module in contrib is distributed with web2py under its original license. Here we list some of them. #### gluon.contrib.simplejson LICENSE Copyright (c) 2006 Bob Ippolito - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #### gluon.contrib.rss2.py (originally PyRSS2Gen) LICENSE This is copyright (c) by Dalke Scientific Software, LLC and released under the BSD license. See the file LICENSE in the distribution or for details. #### gluon.contrib.markdown (markdown2) LICENSE MIT License from from #### gluon.contrib.feedparser LICENSE Copyright (c) 2002-2005, Mark Pilgrim All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #### gluon.wsgiserver.py LICENSE (borrowed from cherrypy) Copyright (c) 2004, CherryPy Team (team@cherrypy.org) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the CherryPy Team nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #### gluon.contrib.pam LICENSE Copyright (C) 2007-2009 Chris AtLee Licensed under the MIT license #### gluon.contrib.shell LICENSE Copyright (C) by Google inc. Apache 2.0 Lincense #### The javascript licenses are in the code itself web2py-2.12.3.orig/scripts/0000755000000000000000000000000012601572550014136 5ustar rootrootweb2py-2.12.3.orig/scripts/cpdb.py0000664000000000000000000005713212564727264015446 0ustar rootrootimport os import sys from collections import deque import argparse import cStringIO import operator import cPickle as pickle from collections import deque import math import re import cmd try: import pyreadline as readline except ImportError: import readline try: from gluon import DAL except ImportError as err: print('gluon path not found') class refTable(object): def __init__(self): self.columns = None self.rows = None def getcolHeader(self, colHeader): return ' | '.join('**%s**' % item for item in colHeader) def wrapTable( self, rows, hasHeader=False, headerChar='-', delim=' | ', justify='left', separateRows=False, prefix='', postfix='', wrapfunc=lambda x: x): def rowWrapper(row): '''--- newRows is returned like [['w'], ['x'], ['y'], ['z']] ---''' newRows = [wrapfunc(item).split('\n') for item in row] self.rows = newRows '''--- rowList gives like newRows but formatted like [[w, x, y, z]] ---''' rowList = [[substr or '' for substr in item] for item in map(None, *newRows)] return rowList logicalRows = [rowWrapper(row) for row in rows] columns = map(None, *reduce(operator.add, logicalRows)) self.columns = columns maxWidths = [max( [len(str (item)) for item in column] ) for column in columns] rowSeparator = headerChar * (len(prefix) +len(postfix) + sum(maxWidths) + len(delim) * (len(maxWidths) - 1)) justify = {'center': str.center, 'right': str.rjust, 'left': str.ljust }[justify.lower()] output = cStringIO.StringIO() if separateRows: print >> output, rowSeparator for physicalRows in logicalRows: for row in physicalRows: print >> output,\ prefix + delim.join([ justify(str(item), width) for ( item, width) in zip(row, maxWidths)] ) + postfix if separateRows or hasHeader: print >> output, rowSeparator hasHeader = False return output.getvalue() def wrap_onspace(self, text, width): return reduce(lambda line, word, width=width: '%s%s%s' % ( line, ' ' if len(line.rsplit('\n')[-1]+word.split('\n')[0])>=width else '\n', word), text.split(' ')) def wrap_onspace_strict(self, text, width): wordRegex = re.compile(r'\S{' + str(width) + r',}') return self.wrap_onspace( wordRegex.sub( lambda m: self. wrap_always( m.group(), width), text ), width) def wrap_always(self, text, width): return '\n'.join( [text[width * i:width * (i + 1 )] for i in xrange( int(math.ceil(1. * len( text) / width)))]) class tableHelper(): def __init__(self): self.oTable = refTable() def getAsRows(self, data): return [row.strip().split(',') for row in data.splitlines()] def getTable_noWrap(self, data, header=None): rows = self.getAsRows(data) if header is not None: hRows = [header] + rows else: hRows = rows table = self.oTable.wrapTable(hRows, hasHeader=True) return table def getTable_Wrap(self, data, wrapStyle, header=None, width=65): wrapper = None if len(wrapStyle) > 1: rows = self.getAsRows(data) if header is not None: hRows = [header] + rows else: hRows = rows for wrapper in (self.oTable.wrap_always, self.oTable.wrap_onspace, self.oTable.wrap_onspace_strict): return self.oTable.wrapTable(hRows, hasHeader=True, separateRows=True, prefix='| ', postfix=' |', wrapfunc=lambda x: wrapper(x, width)) else: return self.getTable_noWrap(data, header) def getAsErrorTable(self, err): return self.getTable_Wrap(err, None) class console: def __init__(self, prompt, banner=None): self.prompt = prompt self.banner = banner self.commands = {} self.commandSort = [] self.db = None for i in dir(self): if "cmd_" == i[:4]: cmd = i.split("cmd_")[1].lower() self.commands[cmd] = getattr(self, i) try: self.commandSort.append((int(self .commands[cmd].__doc__.split( "|")[0]), cmd)) except: pass self.commandSort.sort() self.commandSort = [i[1] for i in self.commandSort] self.var_DEBUG = False self.var_tableStyle = '' self.configvars = {} for i in dir(self): if "var_" == i[:4]: var = i.split("var_")[1] self.configvars[var] = i def setBanner(self, banner): self.banner = banner def execCmd(self, db): self.db = db print self.banner while True: try: command = raw_input(self.prompt) try: self.execCommand(command) except: self.execute(command) except KeyboardInterrupt: break except EOFError: break except Exception, a: self.printError(a) print ("\r\n\r\nBye!...") sys.exit(0) def printError(self, err): sys.stderr.write("Error: %s\r\n" % err) if self.var_DEBUG: pass def execute(self, cmd): try: if not '-table ' in cmd: exec cmd else: file = None table = None fields = [] items = cmd.split() invalidParams = [] table = self.getTable(items[1]) allowedParams = ['fields', 'file'] for i in items: if '=' in i and not i.split('=')[0] in allowedParams: try: invalidParams.append(i) except Exception, err: raise Exception('invalid parameter\n%s' % i) else: if 'file=' in i: file = os.path.abspath(i.split('=')[0].strip()) if 'fields=' in i: for field in i.split('=')[1].split(): if field in self.db[table].fields: fields.append(field.strip()) if len(invalidParams) > 0: print('the following parameter(s) is not valid\n%s' % ','.join(invalidParams)) else: try: self.cmd_table(table, file, fields) except Exception, err: print('could not generate table for table %s\n%s' % (table, err)) except Exception, err: print('sorry, can not do that!\n%s' % err) def getTable(self, tbl): for mTbl in db.tables: if tbl in mTbl: if mTbl.startswith(tbl): return mTbl def execCommand(self, cmd): words = cmd.split(" ") words = [i for i in words if i] if not words: return cmd, parameters = words[0].lower(), words[1:] if not cmd in self.commands: raise Exception( "Command %s not found. Try 'help'\r\n" % cmd) self.commands[cmd](*parameters) '''--- DEFAULT COMMANDS (begins with cmd_) ---''' def cmd_clear(self, numlines=100): """-5|clear|clear the screen""" if os.name == "posix": '''--- Unix/Linux/MacOS/BSD/etc ---''' os.system('clear') elif os.name in ("nt", "dos", "ce"): '''--- Windows ---''' os.system('CLS') else: '''--- Fallback for other operating systems. ---''' print '\n' * numlines def cmd_table(self, tbl, file=None, fields=[]): """-4|-table [TABLENAME] optional[file=None] [fields=None]|\ the default tableStyle is no_wrap - use the 'set x y' command to change the style\n\ style choices: \twrap_always \twrap_onspace \twrap_onspace_strict \tno_wrap (value '')\n \t the 2nd optional param is a path to a file where the table will be written \t the 3rd optional param is a list of fields you want displayed\n""" table = None for mTbl in db.tables: if tbl in mTbl: if mTbl.startswith(tbl): table = mTbl break oTable = tableHelper() '''--- tablestyle: wrap_always wrap_onspace wrap_onspace_strict or set set to "" for no wrapping ---''' tableStyle = self.var_tableStyle filedNotFound = [] table_fields = None if len(fields) == 0: table_fields = self.db[table].fields else: table_fields = fields for field in fields: if not field in self.db[table].fields: filedNotFound.append(field) if len(filedNotFound) == 0: rows = self.db(self.db[table].id > 0).select() rows_data = [] for row in rows: rowdata = [] for f in table_fields: rowdata.append(str(row[f])) rows_data.append(','.join(rowdata)) data = '\n'.join(rows_data) dataTable = oTable.getTable_Wrap(data, tableStyle, table_fields) print('TABLE %s\n%s' % (table, dataTable)) if file is not None: try: tail, head = os.path.split(file) try: os.makedirs(tail) except: 'do nothing, folders exist' oFile = open(file, 'w') oFile.write('TABLE: %s\n%s' % (table, dataTable)) oFile.close() print('%s has been created and populated with all available data from table %2\n' % (file, table)) except Exception, err: print("EXCEPTION: could not create table %s\n%s" % (table, err)) else: print('the following fields are not valid [%s]' % (','.join(filedNotFound))) def cmd_help(self, *args): '''-3|help|Show's help''' alldata = [] lengths = [] for i in self.commandSort: alldata.append( self.commands[i].__doc__.split("|")[1:]) for i in alldata: if len(i) > len(lengths): for j in range(len(i) - len(lengths)): lengths.append(0) j = 0 while j < len(i): if len(i[j]) > lengths[j]: lengths[j] = len(i[j]) j += 1 print ("-" * (lengths[0] + lengths[1] + 4)) for i in alldata: print (("%-" + str(lengths[0]) + "s - %-" + str( lengths[1]) + "s") % (i[0], i[1])) if len(i) > 2: for j in i[2:]: print (("%" + str(lengths[ 0] + 9) + "s* %s") % (" ", j)) print def cmd_vars(self, *args): '''-2|vars|Show variables''' print ("variables\r\n" + "-" * 79) for i, j in self.configvars.items(): value = self.parfmt(repr(getattr(self, j)), 52) print ("| %20s | %52s |" % (i, value[0])) for k in value[1:]: print ("| %20s | %52s |" % ("", k)) if len(value) > 1: print("| %20s | %52s |" % ("", "")) print ("-" * 79) def parfmt(self, txt, width): res = [] pos = 0 while True: a = txt[pos:pos + width] if not a: break res.append(a) pos += width return res def cmd_set(self, *args): '''-1|set [variable_name] [value]|Set configuration variable value|Values are an expressions (100 | string.lower('ABC') | etc.''' value = " ".join(args[1:]) if args[0] not in self.configvars: setattr(self, "var_{0}" % (args[0]), eval(value)) setattr(self, "var_{0}" % (args[0]), eval(value)) def cmd_clearscreen(self, numlines=50): '''---Clear the console. ---''' if os.name == "posix": '''--- Unix/Linux/MacOS/BSD/etc ---''' os.system('clear') elif os.name in ("nt", "dos", "ce"): '''--- Windows ---''' os.system('CLS') else: '''--- Fallback for other operating systems. ---''' print '\n' * numlines class dalShell(console): def __init__(self): pass def shell(self, db): console.__init__(self, prompt=">>> ", banner='dal interactive shell') self.execCmd(db) class setCopyDB(): def __init__(self): '''--- non source or target specific vars ---''' self.strModel = None self.dalPath = None self.db = None '''--- source vars ---''' self.sourceModel = None self.sourceFolder = None self.sourceConnectionString = None self.sourcedbType = None self.sourcedbName = None '''--- target vars ---''' self.targetdbType = None self.targetdbName = None self.targetModel = None self.targetFolder = None self.targetConnectionString = None self.truncate = False def _getDal(self): mDal = None if self.dalPath is not None: global DAL sys.path.append(self.dalPath) mDal = __import__( 'dal', globals={}, locals={}, fromlist=['DAL'], level=0) DAL = mDal.DAL return mDal def instDB(self, storageFolder, storageConnectionString, autoImport): self.db = DAL(storageConnectionString, folder=os.path.abspath( storageFolder), auto_import=autoImport) return self.db def delete_DB_tables(self, storageFolder, storageType): print 'delete_DB_tablesn\n\t%s\n\t%s' % (storageFolder, storageType) dataFiles = [storageType, "sql.log"] try: for f in os.listdir(storageFolder): if ".table" in f: fTable = "%s/%s" % (storageFolder, f) os.remove(fTable) print('deleted %s' % (fTable)) for dFile in dataFiles: os.remove("%s/%s" % (storageFolder, dFile)) print('deleted %s' % ( "%s/%s" % (storageFolder, dFile))) except Exception, errObj: print(str(errObj)) def truncatetables(self, tables=[]): if len(tables) != 0: try: print 'table value: %s' % (tables) for tbl in self.db.tables: for mTbl in tables: if mTbl.startswith(tbl): self.db[mTbl].truncate() except Exception, err: print('EXCEPTION: %s' % (err)) else: try: for tbl in self.db.tables: self.db[tbl].truncate() except Exception, err: print('EXCEPTION: %s' % (err)) def copyDB(self): other_db = DAL("%s://%s" % ( self.targetdbType, self.targetdbName), folder=self.targetFolder) print 'creating tables...' for table in self.db: other_db.define_table( table._tablename, *[field for field in table]) ''' should there be an option to truncAte target DB? if yes, then change args to allow for choice and set self.trancate to the art value if self.truncate==True: other_db[table._tablename].truncate() ''' print 'exporting data...' self.db.export_to_csv_file(open('tmp.sql', 'wb')) print 'importing data...' other_db.import_from_csv_file(open('tmp.sql', 'rb')) other_db.commit() print 'done!' print 'Attention: do not run this program again or you end up with duplicate records' def createfolderPath(self, folder): try: if folder is not None: os.makedirs(folder) except Exception, err: pass if __name__ == '__main__': oCopy = setCopyDB() db = None targetDB = None dbfolder = None clean = False model = None truncate = False parser = argparse.ArgumentParser(description='\ samplecmd line:\n\ -f ./blueLite/db_storage -i -y sqlite://storage.sqlite -Y sqlite://storage2.sqlite -d ./blueLite/pyUtils/sql/blueSQL -t True', epilog='') reqGroup = parser.add_argument_group('Required arguments') reqGroup.add_argument('-f', '--sourceFolder', required=True, help="path to the 'source' folder of the 'source' DB") reqGroup.add_argument('-F', '--targetFolder', required=False, help="path to the 'target' folder of the 'target' DB") reqGroup.add_argument('-y', '--sourceConnectionString', required=True, help="source db connection string ()\n\ ------------------------------------------------\n\ \ sqlite://storage.db\n\ mysql://username:password@localhost/test\n\ postgres://username:password@localhost/test\n\ mssql://username:password@localhost/test\n\ firebird://username:password@localhost/test\n\ oracle://username/password@test\n\ db2://username:password@test\n\ ingres://username:password@localhost/test\n\ informix://username:password@test\n\ \ ------------------------------------------------") reqGroup.add_argument('-Y', '--targetConnectionString', required=True, help="target db type (sqlite,mySql,etc.)") autoImpGroup = parser.add_argument_group('optional args (auto_import)') autoImpGroup.add_argument('-a', '--autoimport', required=False, help='set to True to bypass loading of the model') """ *** removing -m/-M options for now --> i need a better regex to match db.define('bla')...with optional db.commit() modelGroup=parser.add_argument_group('optional args (create model)') modelGroup.add_argument('-m','--sourcemodel'\ ,required=False\ ,help='to create a model from an existing model, point to the source model') modelGroup.add_argument('-M','--targetmodel'\ ,required=False\ ,help='to create a model from an existing model, point to the target model') """ miscGroup = parser.add_argument_group('optional args/tasks') miscGroup.add_argument('-i', '--interactive', required=False, action='store_true', help='run in interactive mode') miscGroup.add_argument( '-d', '--dal', required=False, help='path to dal.py') miscGroup.add_argument('-t', '--truncate', choices=['True', 'False'], help='delete the records but *not* the table of the SOURCE DB') miscGroup.add_argument('-b', '--tables', required=False, type=list, help='optional list (comma delimited) of SOURCE tables to truncate, defaults to all') miscGroup.add_argument('-c', '--clean', required=False, help='delete the DB,tables and the log file, WARNING: this is unrecoverable') args = parser.parse_args() db = None mDal = None try: oCopy.sourceFolder = args.sourceFolder oCopy.targetFolder = args.sourceFolder sourceItems = args.sourceConnectionString.split('://',1) oCopy.sourcedbType = sourceItems[0] oCopy.sourcedbName = sourceItems[1] targetItems = args.targetConnectionString.split('://',1) oCopy.targetdbType = targetItems[0] oCopy.targetdbName = targetItems[1] except Exception, err: print('EXCEPTION: %s' % (err)) if args.dal: try: autoImport = True if args.autoimport: autoImport = args.autoimport #sif not DAL in globals: #if not sys.path.__contains__(): oCopy.dalPath = args.dal mDal = oCopy._getDal() db = oCopy.instDB(args.sourceFolder, args.sourceConnectionString, autoImport) except Exception, err: print('EXCEPTION: could not set DAL\n%s' % (err)) if args.truncate: try: if args.truncate: if args.tables: tables = args.tables.strip().split(',') else: oCopy.truncatetables([]) except Exception, err: print('EXCEPTION: could not truncate tables\n%s' % (err)) try: if args.clean: oCopy.delete_DB_tables(oCopy.targetFolder, oCopy.targetType) except Exception, err: print('EXCEPTION: could not clean db\n%s' % (err)) """ *** goes with -m/-M options... removed for now if args.sourcemodel: try: oCopy.sourceModel=args.sourcemodel oCopy.targetModel=args.sourcemodel oCopy.createModel() except Exception, err: print('EXCEPTION: could not create model\n\ source model: %s\n\ target model: %s\n\ {2}' % (args.sourcemodel,args.targetmodel,err)) """ if args.sourceFolder: try: oCopy.sourceFolder = os.path.abspath(args.sourceFolder) oCopy.createfolderPath(oCopy.sourceFolder) except Exception, err: print('EXCEPTION: could not create folder path\n%s' % (err)) else: oCopy.dbStorageFolder = os.path.abspath(os.getcwd()) if args.targetFolder: try: oCopy.targetFolder = os.path.abspath(args.targetFolder) oCopy.createfolderPath(oCopy.targetFolder) except Exception, err: print('EXCEPTION: could not create folder path\n%s' % (err)) if not args.interactive: try: oCopy.copyDB() except Exception, err: print('EXCEPTION: could not make a copy of the database\n%s' % (err)) else: s = dalShell() s.shell(db) web2py-2.12.3.orig/scripts/setup-ubuntu-12-04-redmine-unicorn-web2py-uwsgi-nginx.sh0000664000000000000000000004300512564727264026412 0ustar rootroot#!/bin/bash # ------------------------------------------------------------------------------ # Description : Installation and basic configuration of web2py, uWSGI, Redmine, # Unicorn, Nginx and PostgreSQL. # Usage : Copy the script in /home/username and run it as root, you may # need to allow exectuion (chmod +x). Ex.: # sudo ./setup-ubuntu-12-04-redmine-unicorn-web2py-uwsgi-nginx.sh # File : setup-ubuntu-12-04-redmine-unicorn-web2py-uwsgi-nginx.sh # Author : Richard V?zina # Email : ml.richard.vezina@gmail.com # Copyright : Richard V?zina # Date : ven 28 d?c 2012 13:27:11 EST # Disclaimers : This script is provided "as is", without warranty of any kind. # Licence : CC BY-NC 2.5 CA # ------------------------------------------------------------------------------ echo 'setup-ubuntu-12-04-redmine-unicorn-web2py-uwsgi-nginx.sh' echo 'Requires Ubuntu = 12.04 (May works with 12.10 not tested) and installs Redmine + Unicorn + Web2py + uWSGI + Nginx + PostgreSQL' # Check if user has root privileges if [[ $EUID -ne 0 ]]; then echo "You must run the script as root or using sudo" exit 1 fi # ------------------------------------------------------------------------------ # We concentrate here user prompts!! # Get Redmine Postgres Database Password echo -e "Redmine Postgres Database Password: \c " read REDMINEPASSWORD # Get Web2py Admin Password echo -e "Web2py Admin Password: \c " read PW cd ~ openssl genrsa 1024 > self_signed.key chmod 400 self_signed.key openssl req -new -x509 -nodes -sha1 -days 1780 -key self_signed.key > self_signed.cert openssl x509 -noout -fingerprint -text < self_signed.cert > self_signed.info # ------------------------------------------------------------------------------ apt-get update apt-get -y upgrade apt-get autoremove apt-get autoclean apt-get -y install postgresql apt-get -y install nginx-full apt-get -y install build-essential python-dev libxml2-dev python-pip unzip apt-get -y install ruby1.9.3 # Ref.: http://askubuntu.com/questions/137485/rails-3-not-using-rvm apt-get -y install libpq-dev # Required for gem1.9.3 install pg Ref.: http://stackoverflow.com/questions/6040583/unable-to-install-pg-gem-on-ubuntu-cant-find-the-libpq-fe-h-header gem1.9.3 install rails --no-rdoc --no-ri # For testing (faster) --no-rdoc --no-ri gem1.9.3 install unicorn --no-rdoc --no-ri # For testing (faster) --no-rdoc --no-ri gem1.9.3 install pg --no-rdoc --no-ri # For testing (faster) --no-rdoc --no-ri cd /opt wget http://rubyforge.org/frs/download.php/76627/redmine-2.2.0.tar.gz wget http://rubyforge.org/frs/download.php/76628/redmine-2.2.0.tar.gz.md5 md5sum --check redmine-2.2.0.tar.gz.md5 > redmine_md5_checked_successfully if [ -f redmine_md5_checked_successfully ] then tar xvfz redmine-2.2.0.tar.gz rm redmine_md5_checked_successfully else echo "Redmine md5 check sum failed..." exit 1 fi cd redmine-2.2.0 bundle install --without development test rmagick sqlite mysql mkdir /var/www ln -s /opt/redmine-2.2.0/public /var/www/redmine chown -R www-data.www-data /var/www chown -R www-data.www-data /opt/redmine-2.2.0/public # To avoid prompt during execution of the script use psql instead of createuser #echo "Enter a postgres redmine user password twice:" #createuser -P -S -D -R -l -e redmine # createuser switch: -P --pwprompt -S --no-superuser -D --no-createdb -R --no-createrole -l --login -e --echo sudo -u postgres psql -c "CREATE ROLE redmine LOGIN; ALTER ROLE redmine WITH ENCRYPTED PASSWORD '$REDMINEPASSWORD';" # createdb wouldn't work without having root password #createdb -U postgres -w -E UTF8 -O redmine -e redmine # createdb switch: -U username --username=username -w --no-password -E Encoding -O owner --owner=owner -e --echo sudo -u postgres psql -c "CREATE DATABASE redmine WITH ENCODING='UTF8' OWNER=redmine;" cd /opt/redmine-2.2.0/config # Here we change related to an issue with new rails version as far as I understand # Ref1.: http://www.redmine.org/projects/redmine/wiki/HowTo_Install_Redmine_in_a_sub-URI # Preferred solution used # Ref2.: http://www.redmine.org/issues/12102 # JS and CSS was not working until I add this line 'RedmineApp::Application.routes.default_scope = { :path => "/redmine", :shallow_path => "/redmine" }' before 'RedmineApp::Application.initialize!' cp environment.rb environment.rb_original # Backup default environment.rb sed '/RedmineApp::Application.initialize!/c \RedmineApp::Application.routes.default_scope = { :path => "/redmine", :shallow_path => "/redmine" }\nRedmineApp::Application.initialize!\nRedmine::Utils::relative_url_root = "/redmine"' environment.rb_original > environment.rb # Now we configure Redmine database access #nano database.yml # paste : echo 'production: adapter: postgresql database: redmine host: localhost username: redmine password: "'$REDMINEPASSWORD'" encoding: utf8' > database.yml rake generate_secret_token RAILS_ENV=production rake db:migrate RAILS_ENV=production rake redmine:load_default_data mkdir /opt/redmine-2.2.0/tmp/pids #mkdir /opt/redmine-2.2.0/log # if not there cd /opt/redmine-2.2.0/config # Create Unicorn specific Redmine config in /opt/redmine-2.2.0/config/unicorn.rb echo '#unicorn.rb Starts here worker_processes 1 working_directory "/opt/redmine-2.2.0" # needs to be the correct directory for redmine # This loads the application in the master process before forking # worker processes # Read more about it here: # http://unicorn.bogomips.org/Unicorn/Configurator.html preload_app true timeout 45 # This is where we specify the socket. # We will point the upstream Nginx module to this socket later on listen "/tmp/unicorn_rails.socket", :backlog => 64 #directory structure needs to be created. pid "/opt/redmine-2.2.0/tmp/pids/unicorn_rails.pid" # make sure this points to a valid directory. Make sure it is named the same as the real process name in order to allow init.d script start-stop-daemon command to kill unicorn process properly # Set the path of the log files inside the log folder of the testapp stderr_path "/opt/redmine-2.2.0/log/unicorn_rails.stderr.log" stdout_path "/opt/redmine-2.2.0/log/unicorn_rails.stdout.log" before_fork do |server, worker| # This option works in together with preload_app true setting # What is does is prevent the master process from holding # the database connection defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect! end after_fork do |server, worker| # Here we are establishing the connection after forking worker # processes defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection # change below if your redmine instance is running differently worker.user('\''www-data'\'', '\''www-data'\'') if Process.euid == 0 end #unicorn.rb Ends here' > unicorn.rb chown www-data:www-data unicorn.rb chown -R www-data:www-data /opt/redmine-2.2.0/tmp mkdir /etc/unicorn # Set some config for Unicorn in /etc/unicorn/redmine echo 'RAILS_ROOT=/opt/redmine-2 RAILS_ENV=production' > /etc/unicorn/redmine # Create a Unicorn Redmine start script in /etc/init.d/redmine echo '#! /bin/sh ### BEGIN INIT INFO # Provides: redmine # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: redmine initscript # Description: This script startup unicorn server and redmine and should # be placed in /etc/init.d. ### END INIT INFO # ------------------------------------------------------------------------------ # Author: Richard V?zina # Base on Ubuntu 12.04 : /etc/init.d/skeleton # ven 21 d?c 2012 11:08:31 EST # ------------------------------------------------------------------------------ # Do NOT "set -e" # PATH should only include /usr/* if it runs after the mountnfs.sh script APP=/opt/redmine-2.2.0/ PATH=/sbin:/usr/sbin:/bin:/usr/bin DESC="Unicorn and Redmine" NAME=unicorn_rails DAEMON=/usr/local/bin/$NAME DAEMON_ARGS=" -E production -c $APP/config/unicorn.rb -D" PIDFILE=/opt/redmine-2.2.0/tmp/pids/$NAME.pid SCRIPTNAME=/etc/init.d/redmine # Exit if the package is not installed [ -x "$DAEMON" ] || exit 0 # Read configuration variable file if it is present [ -r /etc/default/$NAME ] && . /etc/default/$NAME # Load the VERBOSE setting and other rcS variables . /lib/init/vars.sh # Define LSB log_* functions. # Depend on lsb-base (>= 3.2-14) to ensure that this file is present # and status_of_proc is working. . /lib/lsb/init-functions # # Function that starts the daemon/service # do_start() { # Return # 0 if daemon has been started # 1 if daemon was already running # 2 if daemon could not be started start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \ || return 1 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \ $DAEMON_ARGS \ || return 2 # Add code here, if necessary, that waits for the process to be ready # to handle requests from services started subsequently which depend # on this one. As a last resort, sleep for some time. } # # Function that stops the daemon/service # do_stop() { # Return # 0 if daemon has been stopped # 1 if daemon was already stopped # 2 if daemon could not be stopped # other if a failure occurred start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME RETVAL="$?" [ "$RETVAL" = 2 ] && return 2 # Wait for children to finish too if this is a daemon that forks # and if the daemon is only ever run from this initscript. # If the above conditions are not satisfied then add some other code # that waits for the process to drop all resources that could be # needed by services started subsequently. A last resort is to # sleep for some time. start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON [ "$?" = 2 ] && return 2 # Many daemons don'\''t delete their pidfiles when they exit. rm -f $PIDFILE return "$RETVAL" } # # Function that sends a SIGHUP to the daemon/service # do_reload() { # # If the daemon can reload its configuration without # restarting (for example, when it is sent a SIGHUP), # then implement that here. # start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME return 0 } case "$1" in start) [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" do_start case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; stop) [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" do_stop case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; status) status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? ;; #reload|force-reload) # # If do_reload() is not implemented then leave this commented out # and leave '\''force-reload'\'' as an alias for '\''restart'\''. # #log_daemon_msg "Reloading $DESC" "$NAME" #do_reload #log_end_msg $? #;; restart|force-reload) # # If the "reload" option is implemented then remove the # '\''force-reload'\'' alias # log_daemon_msg "Restarting $DESC" "$NAME" do_stop case "$?" in 0|1) do_start case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; # Old process is still running *) log_end_msg 1 ;; # Failed to start esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; *) #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2 echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 exit 3 ;; esac :' > /etc/init.d/redmine chmod +x /etc/init.d/redmine # Backup default Nginx site and replace it cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default_original rm /etc/nginx/sites-available/default # Create configuration file /etc/nginx/sites-available/default echo 'upstream unicorn_server { # This is the socket we configured in unicorn.rb server unix:/tmp/unicorn_rails.socket fail_timeout=0; } server { listen 80; #return 301 https://192.168.1.126$request_uri; # http://$hostname$request_uri; # idem #http://wiki.nginx.org/Pitfalls#Taxing_Rewrites charset utf-8; server_name localhost; # $hostname; root /var/www; access_log /var/log/nginx/yoursite.access.log; error_log /var/log/nginx/yoursite.error.log; #to enable correct use of response.static_version location ~* /(\w+)/static(?:/_[\d]+\.[\d]+\.[\d]+)?/(.*)$ { alias /home/www-data/web2py/applications/$1/static/$2; expires max; } location ~^\/(?!redmine(.*)) { #uwsgi_pass 127.0.0.1:9001; uwsgi_pass unix:///tmp/web2py.socket; include uwsgi_params; uwsgi_param UWSGI_SCHEME $scheme; uwsgi_param SERVER_SOFTWARE nginx/$nginx_version; } location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; if (!-f $request_filename) { proxy_pass http://unicorn_server; break; } } } server { listen 443 default_server ssl; charset utf-8; server_name localhost; # $hostname; root /var/www; ssl_certificate /etc/nginx/ssl/self_signed.cert; ssl_certificate_key /etc/nginx/ssl/self_signed.key; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_ciphers ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA; ssl_protocols SSLv3 TLSv1; keepalive_timeout 70; location ~* /(\w+)/static(?:/_[\d]+\.[\d]+\.[\d]+)?/(.*)$ { alias /home/www-data/web2py/applications/$1/static/$2; expires max; } location ~^\/(?!redmine(.*)) { #uwsgi_pass 127.0.0.1:9001; uwsgi_pass unix:///tmp/web2py.socket; include uwsgi_params; uwsgi_param UWSGI_SCHEME $scheme; uwsgi_param SERVER_SOFTWARE nginx/$nginx_version; } location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; if (!-f $request_filename) { proxy_pass http://unicorn_server; break; } } }' >/etc/nginx/sites-available/default #ln -s /etc/nginx/sites-available/web2py /etc/nginx/sites-enabled/web2py #rm /etc/nginx/sites-enabled/default # We copy ssl files we previously created if [ -f /etc/nginx/ssl ] then cp ~/self_signed.* /etc/nginx/ssl/ rm ~/self_signed.* else mkdir /etc/nginx/ssl cp ~/self_signed.* /etc/nginx/ssl/ rm ~/self_signed.* fi pip install setuptools --no-use-wheel --upgrade PIPPATH=`which pip` $PIPPATH install --upgrade uwsgi # Prepare folders for uwsgi sudo mkdir /etc/uwsgi sudo mkdir /var/log/uwsgi # Create configuration file /etc/uwsgi/web2py.xml echo ' /tmp/web2py.socket /home/www-data/web2py/ /=wsgihandler:application 4 60 8 1 /tmp/stats.socket 2000 512 256 192 www-data www-data 0 0 -1 -1 -1 python /home/www-data/web2py/web2py.py -Q -S welcome -M -R scripts/sessions2trash.py -A -o ' > /etc/uwsgi/web2py.xml #Create a configuration file for uwsgi in emperor-mode #for Upstart in /etc/init/uwsgi-emperor.conf echo '# Emperor uWSGI script description "uWSGI Emperor" start on runlevel [2345] stop on runlevel [06] ## #remove the comments in the next section to enable static file compression for the welcome app #in that case, turn on gzip_static on; on /etc/nginx/nginx.conf ## #pre-start script # python /home/www-data/web2py/web2py.py -S welcome -R scripts/zip_static_files.py # chown -R www-data:www-data /home/www-data/web2py/* #end script respawn exec uwsgi --master --die-on-term --emperor /etc/uwsgi --logto /var/log/uwsgi/uwsgi.log ' > /etc/init/uwsgi-emperor.conf # Install Web2py mkdir /home/www-data cd /home/www-data wget http://web2py.com/examples/static/web2py_src.zip unzip web2py_src.zip rm web2py_src.zip chown -R www-data:www-data web2py cd /home/www-data/web2py mv handlers/wsgihandler.py wsgihandler.py sudo -u www-data python -c "from gluon.main import save_password; save_password('$PW',443)" /etc/init.d/redmine start start uwsgi-emperor /etc/init.d/nginx restart ufw allow 80 # Or check your firewall configuration web2py-2.12.3.orig/scripts/sync_languages.py0000775000000000000000000000401512564727264017533 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- # TODO: Comment this code import sys import shutil import os from gluon.languages import findT sys.path.insert(0, '.') def sync_language(d, data): ''' this function makes sure a translated string will be prefered over an untranslated string when syncing languages between apps. when both are translated, it prefers the latter app, as did the original script ''' for key in data: # if this string is not in the allready translated data, add it if key not in d: d[key] = data[key] # see if there is a translated string in the original list, but not in the new list elif ( ((d[key] != '') or (d[key] != key)) and ((data[key] == '') or (data[key] == key)) ): d[key] = d[key] # any other case (wether there is or there isn't a translated string) else: d[key] = data[key] return d def sync_main(file, apps): d = {} for app in apps: path = 'applications/%s/' % app findT(path, file) langfile = open(os.path.join(path, 'languages', '%s.py' % file)) try: data = eval(langfile.read()) finally: langfile.close() d = sync_language(d, data) path = 'applications/%s/' % apps[-1] file1 = os.path.join(path, 'languages', '%s.py' % file) f = open(file1, 'w') try: f.write('# coding: utf8\n') f.write('{\n') keys = d.keys() keys.sort() for key in keys: f.write("'''%s''':'''%s''',\n" % (key.replace("'", "\\'"), str(d[key].replace("'", "\\'")))) f.write('}\n') finally: f.close() oapps = reversed(apps[:-1]) for app in oapps: path2 = 'applications/%s/' % app file2 = os.path.join(path2, 'languages', '%s.py' % file) if file1 != file2: shutil.copyfile(file1, file2) if __name__ == "__main__": file = sys.argv[1] apps = sys.argv[2:] sync_main(file, apps) web2py-2.12.3.orig/scripts/standalone_exe_cxfreeze.py0000664000000000000000000000327212564727264021416 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- """ Usage: Install cx_Freeze: http://cx-freeze.sourceforge.net/ Copy script to the web2py directory c:\Python27\python standalone_exe_cxfreeze.py build_exe """ from cx_Freeze import setup, Executable from gluon.import_all import base_modules, contributed_modules from gluon.fileutils import readlines_file from glob import glob import fnmatch import os import shutil import sys import re #read web2py version from VERSION file web2py_version_line = readlines_file('VERSION')[0] #use regular expression to get just the version number v_re = re.compile('[0-9]+\.[0-9]+\.[0-9]+') web2py_version = v_re.search(web2py_version_line).group(0) base = None if sys.platform == 'win32': base = "Win32GUI" base_modules.remove('macpath') buildOptions = dict( compressed=True, excludes=["macpath", "PyQt4"], includes=base_modules, include_files=[ 'applications', 'ABOUT', 'LICENSE', 'VERSION', 'logging.example.conf', 'options_std.py', 'app.example.yaml', 'queue.example.yaml', ], # append any extra module by extending the list below - # "contributed_modules+["lxml"]" packages=contributed_modules, ) setup( name="Web2py", version=web2py_version, author="Massimo DiPierro", description="web2py web framework", license="LGPL v3", options=dict(build_exe=buildOptions), executables=[Executable("web2py.py", base=base, compress=True, icon="web2py.ico", targetName="web2py.exe", copyDependentFiles=True)], ) web2py-2.12.3.orig/scripts/setup-web2py-ubuntu.sh0000664000000000000000000001026112564727264020376 0ustar rootrootecho "This script will: 1) install all modules need to run web2py on Ubuntu 14.04 2) install web2py in /home/www-data/ 3) create a self signed ssl certificate 4) setup web2py with mod_wsgi 5) overwrite /etc/apache2/sites-available/default 6) restart apache. You may want to read this script before running it. Press a key to continue...[ctrl+C to abort]" read CONFIRM #!/bin/bash # optional # dpkg-reconfigure console-setup # dpkg-reconfigure timezoneconf # nano /etc/hostname # nano /etc/network/interfaces # nano /etc/resolv.conf # reboot now # ifconfig eth0 echo "installing useful packages" echo "==========================" apt-get update apt-get -y install ssh apt-get -y install zip unzip apt-get -y install tar apt-get -y install openssh-server apt-get -y install build-essential apt-get -y install python #apt-get -y install python2.5 apt-get -y install ipython apt-get -y install python-dev apt-get -y install postgresql apt-get -y install apache2 apt-get -y install libapache2-mod-wsgi apt-get -y install python2.5-psycopg2 apt-get -y install postfix apt-get -y install wget apt-get -y install python-matplotlib apt-get -y install python-reportlab apt-get -y install mercurial /etc/init.d/postgresql restart # optional, uncomment for emacs # apt-get -y install emacs # optional, uncomment for backups using samba # apt-get -y install samba # apt-get -y install smbfs echo "downloading, installing and starting web2py" echo "===========================================" cd /home mkdir www-data cd www-data rm web2py_src.zip* wget http://web2py.com/examples/static/web2py_src.zip unzip web2py_src.zip mv web2py/handlers/wsgihandler.py web2py/wsgihandler.py chown -R www-data:www-data web2py echo "setting up apache modules" echo "=========================" a2enmod ssl a2enmod proxy a2enmod proxy_http a2enmod headers a2enmod expires a2enmod wsgi a2enmod rewrite # for 14.04 mkdir /etc/apache2/ssl echo "creating a self signed certificate" echo "==================================" openssl genrsa 1024 > /etc/apache2/ssl/self_signed.key chmod 400 /etc/apache2/ssl/self_signed.key openssl req -new -x509 -nodes -sha1 -days 365 -key /etc/apache2/ssl/self_signed.key > /etc/apache2/ssl/self_signed.cert openssl x509 -noout -fingerprint -text < /etc/apache2/ssl/self_signed.cert > /etc/apache2/ssl/self_signed.info echo "rewriting your apache config file to use mod_wsgi" echo "=================================================" echo ' WSGIDaemonProcess web2py user=www-data group=www-data RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L] CustomLog /var/log/apache2/access.log common ErrorLog /var/log/apache2/error.log SSLEngine on SSLCertificateFile /etc/apache2/ssl/self_signed.cert SSLCertificateKeyFile /etc/apache2/ssl/self_signed.key WSGIProcessGroup web2py WSGIScriptAlias / /home/www-data/web2py/wsgihandler.py WSGIPassAuthorization On AllowOverride None Require all denied Require all granted AliasMatch ^/([^/]+)/static/(?:_[\d]+.[\d]+.[\d]+/)?(.*) \ /home/www-data/web2py/applications/$1/static/$2 Options -Indexes ExpiresActive On ExpiresDefault "access plus 1 hour" Require all granted CustomLog /var/log/apache2/ssl-access.log common ErrorLog /var/log/apache2/error.log ' > /etc/apache2/sites-available/default.conf # FOR 14.04 sudo rm /etc/apache2/sites-enabled/* # FOR 14.04 sudo a2ensite default # FOR 14.04 # echo "setting up PAM" # echo "================" # sudo apt-get install pwauth # sudo ln -s /etc/apache2/mods-available/authnz_external.load /etc/apache2/mods-enabled # ln -s /etc/pam.d/apache2 /etc/pam.d/httpd # usermod -a -G shadow www-data echo "restarting apache" echo "================" /etc/init.d/apache2 restart cd /home/www-data/web2py sudo -u www-data python -c "from gluon.widget import console; console();" sudo -u www-data python -c "from gluon.main import save_password; save_password(raw_input('admin password: '),443)" echo "done!" web2py-2.12.3.orig/scripts/cpplugin.py0000664000000000000000000000152712564727264016354 0ustar rootrootimport sys import glob import os import shutil name = sys.argv[1] app = sys.argv[2] dest = sys.argv[3] a = glob.glob( 'applications/%(app)s/*/plugin_%(name)s.*' % dict(app=app, name=name)) b = glob.glob( 'applications/%(app)s/*/plugin_%(name)s/*' % dict(app=app, name=name)) for f in a: print 'cp %s ...' % f, shutil.copyfile(f, os.path.join('applications', dest, *f.split('/')[2:])) print 'done' for f in b: print 'cp %s ...' % f, path = f.split('/') for i in range(3, len(path)): try: os.mkdir(os.path.join('applications', dest, *path[2:i])) except: pass path = os.path.join('applications', dest, *f.split('/')[2:]) if os.path.isdir(f): if not os.path.exists(path): shutil.copytree(f, path) else: shutil.copyfile(f, path) print 'done' web2py-2.12.3.orig/scripts/update-web2py.sh0000775000000000000000000000254312564727264017207 0ustar rootroot#!/bin/bash # # update-web2py.sh # 2009-12-16 # # install in web2py/.. or web2py/ or web2py/scripts as update-web2py.sh # make executable: chmod +x web2py.sh # # save a snapshot of current web2py/ as web2py/../web2py-version.zip # download the current stable version of web2py # unzip downloaded version over web2py/ # TARGET=web2py if [ ! -d $TARGET ]; then # in case we're in web2py/ if [ -f ../$TARGET/VERSION ]; then cd .. # in case we're in web2py/scripts elif [ -f ../../$TARGET/VERSION ]; then cd ../.. fi fi read a VERSION c < $TARGET/VERSION SAVE=$TARGET-$VERSION URL=http://www.web2py.com/examples/static/web2py_src.zip ZIP=`basename $URL` SAVED="" # Save a zip archive of the current version, # but don't overwrite a previous save of the same version. # if [ -f $SAVE.zip ]; then echo "Remove or rename $SAVE.zip first" >&2 exit 1 fi if [ -d $TARGET ]; then echo -n ">>Save old version: " >&2 cat $TARGET/VERSION >&2 zip -q -r $SAVE.zip $TARGET SAVED=$SAVE.zip fi # # Download the new version. # echo ">>Download latest web2py release:" >&2 curl -O $URL # # Unzip into web2py/ # unzip -q -o $ZIP rm $ZIP echo -n ">>New version: " >&2 cat $TARGET/VERSION >&2 if [ "$SAVED" != "" ]; then echo ">>Old version saved as $SAVED" fi web2py-2.12.3.orig/scripts/update_web2py.py0000664000000000000000000000161712564727264017305 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- """ crontab -e * 3 * * * root path/to/this/file """ USER = 'www-data' TMPFILENAME = 'web2py_src_update.zip' import sys import os import urllib import zipfile if len(sys.argv) > 1 and sys.argv[1] == 'nightly': version = 'http://web2py.com/examples/static/nightly/web2py_src.zip' else: version = 'http://web2py.com/examples/static/web2py_src.zip' realpath = os.path.realpath(__file__) path = os.path.dirname(os.path.dirname(os.path.dirname(realpath))) os.chdir(path) try: old_version = open('web2py/VERSION', 'r').read().strip() except IOError: old_version = '' open(TMPFILENAME, 'wb').write(urllib.urlopen(version).read()) new_version = zipfile.ZipFile(TMPFILENAME).read('web2py/VERSION').strip() if new_version > old_version: os.system('sudo -u %s unzip -o %s' % (USER, TMPFILENAME)) os.system('apachectl restart | apache2ctl restart') web2py-2.12.3.orig/scripts/setup-web2py-cloudfoundry.sh0000775000000000000000000000051112564727264021571 0ustar rootrootread -p "Please choose a Web2Py Administrator password:" passwd echo "web: python web2py.py -a '$passwd' -i 0.0.0.0 -p \$PORT" > Procfile mkdir vendor pip install --download vendor -r requirements.txt read -p "Please choose a CF application name:" appname cf push $appname -b https://github.com/cloudfoundry/buildpack-python.git web2py-2.12.3.orig/scripts/setup-virtualenv-web2py.sh0000664000000000000000000000551212564727264021256 0ustar rootroot# # Author: Christopher Steel # Organization: Voice of Access # Date: 2010-11-24 # License: Same as Web2py, MIT / GNU # Email: Christopher DOT Steel AT Voice of Access DOT org # # This script will : # download and install virtualenv # start a virtual environment # move into the virtual environment # download and install latest stable version of web2py # start web2py in the virtual environment # # To disactivate the virtual environment, shut down web2py # and type 'disactivate' at the command line. # # Testing: # OS X # should work on POSIX systems # # Usage: # create a directory to hold your virtual environments, for example # /home/user_name/virtual_environments # place this script in the directory and make it executable # chmod +x web2py-install-virtualenv.sh customize the variables below to meet your needs # execute from terminal # ./web2py-install-virtualenv.sh # relax... ################ VARIABLES # Change to reflect version changes etc. # # name for your virtual environment ENV=VIRTUAL_ENV # version to install APP_NAME=virtualenv VER=1.5.1 DIR=${APP_NAME}-${VER} EXT=tar.gz ARCHIVE=${APP_NAME}-${VER}.${EXT} # md5 sum, see end of url from pypi MD5_SUM=3daa1f449d5d2ee03099484cecb1c2b7 ################ # echo 'downloading' ${ARCHIVE} echo '================================' echo `wget http://pypi.python.org/packages/source/v/virtualenv/${ARCHIVE}` md5 ${ARCHIVE} echo 'MD5 ('${ARCHIVE}') =' ${MD5_SUM} echo 'unarchive' ${ARCHIVE} echo '=================================' tar xvfz ${ARCHIVE} echo ' comparing md5 sums' echo '=================================' md5 ${ARCHIVE} echo 'MD5 ('${ARCHIVE}') =' ${MD5_SUM} #echo 'installing compatibility modules' #echo '================================' #virtualenv/bin/easy_install -U pysqlite hashlib #echo 'Installing distribute' #echo '=====================' #echo 'Creating Environment' #echo '=====================' #echo `python ./${DIRAPP_NAME}-${VER}/virtualenv.py --distribute ${ENV}` echo 'Start virtual environment' echo '=========================' virtualenv --no-site-packages ${ENV} RUN_THIS='source ${ENV}/bin/activate' `echo source ${ENV}/bin/activate` echo 'Moving into virtual environment directory' echo '=========================================' cd ${ENV} echo 'downloading web2py' echo '==================' wget http://web2py.com/examples/static/web2py_src.zip unzip web2py_src.zip cd web2py echo 'to deactivate your virtual environment' echo 'shutdown web2py and then type "deactivate"' echo '==========================================' read -p "Press any key to start web2py…" echo 'starting web2py' echo '===============' ../bin/python2.5 web2py.py web2py-2.12.3.orig/scripts/dict_diff.py0000664000000000000000000000734412564727264016451 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- ''' @author: Pierre Thibault (pierre.thibault1 -at- gmail.com) @license: MIT @since: 2011-06-17 Usage: dict_diff [OPTION]... dict1 dict2 Show the differences for two dictionaries. -h, --help Display this help message. dict1 and dict2 are two web2py dictionary files to compare. These are the files located in the "languages" directory of a web2py app. The tools show the differences between the two files. ''' __docformat__ = "epytext en" import getopt import os.path import sys def main(argv): """Parse the arguments and start the main process.""" try: opts, args = getopt.getopt(argv, "h", ["help"]) except getopt.GetoptError: exit_with_parsing_error() for opt, arg in opts: arg = arg # To avoid a warning from Pydev if opt in ("-h", "--help"): usage() sys.exit() if len(args) == 2: params = list(get_dicts(*args)) params.extend(get_dict_names(*args)) compare_dicts(*params) else: exit_with_parsing_error() def exit_with_parsing_error(): """Report invalid arguments and usage.""" print("Invalid argument(s).") usage() sys.exit(2) def usage(): """Display the documentation""" print(__doc__) def get_dicts(dict_path1, dict_path2): """ Parse the dictionaries. @param dict_path1: The path to the first dictionary. @param dict_path2: The path to the second dictionary. @return: The two dictionaries as a sequence. """ return eval(open(dict_path1).read()), eval(open(dict_path2).read()) def get_dict_names(dict1_path, dict2_path): """ Get the name of the dictionaries for the end user. Use the base name of the files. If the two base names are identical, returns "dict1" and "dict2." @param dict1_path: The path to the first dictionary. @param dict2_path: The path to the second dictionary. @return: The two dictionary names as a sequence. """ dict1_name = os.path.basename(dict1_path) dict2_name = os.path.basename(dict2_path) if dict1_name == dict2_name: dict1_name = "dict1" dict2_name = "dict2" return dict1_name, dict2_name def compare_dicts(dict1, dict2, dict1_name, dict2_name): """ Compare the two dictionaries. Print out the result. @param dict1: The first dictionary. @param dict1: The second dictionary. @param dict1_name: The name of the first dictionary. @param dict2_name: The name of the second dictionary. """ dict1_keyset = set(dict1.keys()) dict2_keyset = set(dict2.keys()) print_key_diff(dict1_keyset - dict2_keyset, dict1_name, dict2_name) print_key_diff(dict2_keyset - dict1_keyset, dict2_name, dict1_name) print "Value differences:" has_value_differences = False for key in dict1_keyset & dict2_keyset: if dict1[key] != dict2[key]: print " %s:" % (key,) print " %s: %s" % (dict1_name, dict1[key],) print " %s: %s" % (dict2_name, dict2[key],) print has_value_differences = True if not has_value_differences: print " None" def print_key_diff(key_diff, dict1_name, dict2_name): """ Prints the keys in the first dictionary and are in the second dictionary. @param key_diff: Keys in dictionary 1 not in dictionary 2. @param dict1_name: Name used for the first dictionary. @param dict2_name: Name used for the second dictionary. """ print "Keys in %s not in %s:" % (dict1_name, dict2_name) if len(key_diff): for key in key_diff: print " %s" % (key,) else: print " None" print if __name__ == "__main__": main(sys.argv[1:]) # Start the process (without the application name) web2py-2.12.3.orig/scripts/tickets2db.py0000775000000000000000000000255712564727264016600 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import os import time import stat import datetime from gluon.utils import md5_hash from gluon.restricted import RestrictedError, TicketStorage from gluon import DAL SLEEP_MINUTES = 5 errors_path = os.path.join(request.folder, 'errors') try: db_string = open(os.path.join(request.folder, 'private', 'ticket_storage.txt')).read().replace('\r', '').replace('\n', '').strip() except: db_string = 'sqlite://storage.db' db_path = os.path.join(request.folder, 'databases') tk_db = DAL(db_string, folder=db_path, auto_import=True) ts = TicketStorage(db=tk_db) tk_table = ts._get_table( db=tk_db, tablename=ts.tablename, app=request.application) hashes = {} while 1: if request.tickets_db: print "You're storing tickets yet in database" sys.exit(1) for file in os.listdir(errors_path): filename = os.path.join(errors_path, file) modified_time = os.stat(filename)[stat.ST_MTIME] modified_time = datetime.datetime.fromtimestamp(modified_time) ticket_id = file ticket_data = open(filename).read() tk_table.insert(ticket_id=ticket_id, ticket_data=ticket_data, created_datetime=modified_time ) tk_db.commit() os.unlink(filename) time.sleep(SLEEP_MINUTES * 60) web2py-2.12.3.orig/scripts/setup-web2py-debian-sid.sh0000664000000000000000000001066712564727264021065 0ustar rootrootecho "This script will: 1) install all modules need to run web2py on Ubuntu/Debian 2) install web2py in /home/www-data/ 3) create a self signed ssl certificate 4) setup web2py with mod_wsgi 5) overwrite /etc/apache2/sites-available/default 6) restart apache. You may want to read this script before running it. Press a key to continue...[ctrl+C to abort]" read CONFIRM #!/bin/bash # optional # dpkg-reconfigure console-setup # dpkg-reconfigure timezoneconf # nano /etc/hostname # nano /etc/network/interfaces # nano /etc/resolv.conf # reboot now # ifconfig eth0 echo "installing useful packages" echo "==========================" apt-get update apt-get -y install ssh apt-get -y install zip unzip apt-get -y install tar apt-get -y install openssh-server apt-get -y install build-essential apt-get -y install ipython apt-get -y install python-dev apt-get -y install postgresql apt-get -y install apache2 apt-get -y install libapache2-mod-wsgi apt-get -y install python-psycopg2 apt-get -y install postfix apt-get -y install wget apt-get -y install python-matplotlib apt-get -y install python-reportlab apt-get -y install mercurial /etc/init.d/postgresql restart # optional, uncomment for emacs # apt-get -y install emacs # optional, uncomment for backups using samba # apt-get -y install samba # apt-get -y install smbfs echo "downloading, installing and starting web2py" echo "===========================================" cd /home mkdir www-data cd www-data rm web2py_src.zip* wget http://web2py.com/examples/static/web2py_src.zip unzip web2py_src.zip mv web2py/handlers/wsgihandler.py web2py/wsgihandler.py chown -R www-data:www-data web2py echo "setting up apache modules" echo "=========================" a2enmod ssl a2enmod proxy a2enmod proxy_http a2enmod headers a2enmod expires a2enmod wsgi mkdir /etc/apache2/ssl echo "creating a self signed certificate" echo "==================================" openssl genrsa 1024 > /etc/apache2/ssl/self_signed.key chmod 400 /etc/apache2/ssl/self_signed.key openssl req -new -x509 -nodes -sha1 -days 365 -key /etc/apache2/ssl/self_signed.key > /etc/apache2/ssl/self_signed.cert openssl x509 -noout -fingerprint -text < /etc/apache2/ssl/self_signed.cert > /etc/apache2/ssl/self_signed.info echo "rewriting your apache config file to use mod_wsgi" echo "=================================================" echo ' ServerName YourServerName WSGIDaemonProcess web2py user=www-data group=www-data display-name=%{GROUP} WSGIProcessGroup web2py WSGIScriptAlias / /home/www-data/web2py/wsgihandler.py Require all denied Require all granted AliasMatch ^/([^/]+)/static/(?:_[\d]+.[\d]+.[\d]+/)?(.*) \ /home/www-data/web2py/applications/$1/static/$2 Options -Indexes Require all granted Require all denied Require all denied CustomLog /var/log/apache2/access.log common ErrorLog /var/log/apache2/error.log ServerName YourServerName SSLEngine on SSLCertificateFile /etc/apache2/ssl/self_signed.cert SSLCertificateKeyFile /etc/apache2/ssl/self_signed.key WSGIProcessGroup web2py WSGIScriptAlias / /home/www-data/web2py/wsgihandler.py AllowOverride None Require all denied Require all granted AliasMatch ^/([^/]+)/static/(?:_[\d]+.[\d]+.[\d]+/)?(.*) \ /home/www-data/web2py/applications/$1/static/$2 Require all granted CustomLog /var/log/apache2/access.log common ErrorLog /var/log/apache2/error.log ' > /etc/apache2/sites-available/default # echo "setting up PAM" # echo "================" # sudo apt-get install pwauth # sudo ln -s /etc/apache2/mods-available/authnz_external.load /etc/apache2/mods-enabled # ln -s /etc/pam.d/apache2 /etc/pam.d/httpd # usermod -a -G shadow www-data echo "restarting apache" echo "================" /etc/init.d/apache2 restart cd /home/www-data/web2py sudo -u www-data python -c "from gluon.widget import console; console();" sudo -u www-data python -c "from gluon.main import save_password; save_password(raw_input('admin password: '),443)" echo "done!" web2py-2.12.3.orig/scripts/cleancss.py0000775000000000000000000000173212564727264016327 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import re filename = sys.argv[1] datafile = open(filename, 'r') try: data = '\n' + datafile.read() finally: datafile.close() SPACE = '\n ' if '-n' in sys.argv[1:] else ' ' data = re.compile('(?.*)').sub('/* \g */', data) data = re.compile('[ ]+').sub(' ', data) data = re.compile('\s*{\s*').sub(' {' + SPACE, data) data = re.compile('\s*;\s*').sub(';' + SPACE, data) data = re.compile(',\s*').sub(', ', data) data = re.compile('\s*\*/\s*').sub('*/' + SPACE, data) data = re.compile('\s*}\s*').sub(SPACE + '}\n', data) data = re.compile('\n\s*\n').sub('\n', data) data = re.compile(';\s+/\*').sub('; /*', data) data = re.compile('\*/\s+/\*').sub(' ', data) data = re.compile('[ ]+\n').sub('\n', data) data = re.compile('\n\s*/[\*]+(?P.*?)[\*]+/', re.DOTALL).sub( '\n/*\g*/\n', data) data = re.compile('[ \t]+(?P\S.+?){').sub(' \g{', data) data = data.replace('}', '}\n') print data web2py-2.12.3.orig/scripts/extract_sqlite_models.py0000664000000000000000000000757012564727264021135 0ustar rootroot# -*- coding: utf-8 -*- ''' Create the web2py model code needed to access your sqlite legacy db. Usage: python extract_sqlite_models.py Access your tables with: legacy_db(legacy_db.mytable.id>0).select() extract_sqlite_models.py -- Copyright (C) Michele Comitini This code is distributed with web2py. The regexp code and the dictionary type map was extended from extact_mysql_models.py that comes with web2py. extact_mysql_models.py is Copyright (C) Falko Krause. ''' import re import sys import sqlite3 data_type_map = dict( varchar='string', int='integer', integer='integer', tinyint='integer', smallint='integer', mediumint='integer', bigint='integer', float='double', double='double', char='string', decimal='integer', date='date', time='time', timestamp='datetime', datetime='datetime', binary='blob', blob='blob', tinyblob='blob', mediumblob='blob', longblob='blob', text='text', tinytext='text', mediumtext='text', longtext='text', bit='boolean', nvarchar='text', numeric='decimal(30,15)', real='decimal(30,15)', ) def get_foreign_keys(sql_lines): fks = dict() for line in sql_lines[1:-1]: hit = re.search(r'FOREIGN\s+KEY\s+\("(\S+)"\)\s+REFERENCES\s+"(\S+)"\s+\("(\S+)"\)', line) if hit: fks[hit.group(1)] = hit.groups()[1:] return fks def sqlite(database_name): conn = sqlite3.connect(database_name) c = conn.cursor() r = c.execute(r"select name,sql from sqlite_master where type='table' and not name like '\_%' and not lower(name) like 'sqlite_%'") tables = r.fetchall() connection_string = "legacy_db = DAL('sqlite://%s')" % database_name.split('/')[-1] legacy_db_table_web2py_code = [] for table_name, sql_create_stmnt in tables: if table_name.startswith('_'): continue if 'CREATE' in sql_create_stmnt: # check if the table exists #remove garbage lines from sql statement sql_lines = sql_create_stmnt.split('\n') sql_lines = [x for x in sql_lines if not( x.startswith('--') or x.startswith('/*') or x == '')] #generate the web2py code from the create statement web2py_table_code = '' fields = [] fks = get_foreign_keys(sql_lines) for line in sql_lines[1:-1]: if re.search('KEY', line) or re.search('PRIMARY', line) or re.search('"ID"', line) or line.startswith(')'): continue hit = re.search(r'\[(\S+)\]\s+(\w+(\(\S+\))?),?( .*)?', line) if hit is not None: name, d_type = hit.group(1), hit.group(2) d_type = re.sub(r'(\w+)\(.*', r'\1', d_type) name = unicode(re.sub('`', '', name)) if name in fks.keys(): if fks[name][1].lower() == 'id': field_type = 'reference %s' % (fks[name][0]) else: field_type = 'reference %s.%s' % (fks[name][0], fks[name][1]) else: field_type = data_type_map[d_type.lower()] web2py_table_code += "\n Field('%s','%s')," % ( name, field_type) web2py_table_code = "legacy_db.define_table('%s',%s\n migrate=False)" % (table_name, web2py_table_code) legacy_db_table_web2py_code.append(web2py_table_code) #---------------------------------------- #write the legacy db to file legacy_db_web2py_code = connection_string + "\n\n" legacy_db_web2py_code += "\n\n#--------\n".join( legacy_db_table_web2py_code) return legacy_db_web2py_code if len(sys.argv) < 2: print 'USAGE:\n\n extract_mysql_models.py data_basename\n\n' else: print "# -*- coding: utf-8 -*-" print sqlite(sys.argv[1]) web2py-2.12.3.orig/scripts/layout_make.py0000775000000000000000000000576512564727264017060 0ustar rootrootimport glob import os import zipfile import sys import re from BeautifulSoup import BeautifulSoup as BS def head(styles): title = '{{=response.title or request.application}}' items = '\n'.join(["{{response.files.append(URL(request.application,'static','%s'))}}" % (style) for style in styles]) loc = """""" return "\n%s\n%s\n{{include 'web2py_ajax.html'}}\n%s" % (title, items, loc) def content(): return """
{{=response.flash or ''}}
{{include}}""" def process(folder): indexfile = open(os.path.join(folder, 'index.html'), 'rb') try: soup = BS(indexfile.read()) finally: indexfile.close() styles = [x['href'] for x in soup.findAll('link')] soup.find('head').contents = BS(head(styles)) try: soup.find( 'h1').contents = BS('{{=response.title or request.application}}') soup.find('h2').contents = BS( "{{=response.subtitle or '=response.subtitle'}}") except: pass for match in (soup.find('div', id='menu'), soup.find('div', {'class': 'menu'}), soup.find('div', id='nav'), soup.find('div', {'class': 'nav'})): if match: match.contents = BS('{{=MENU(response.menu)}}') break done = False for match in (soup.find('div', id='content'), soup.find('div', {'class': 'content'}), soup.find('div', id='main'), soup.find('div', {'class': 'main'})): if match: match.contents = BS(content()) done = True break if done: page = soup.prettify() page = re.compile("\s*\{\{=response\.flash or ''\}\}\s*", re.MULTILINE)\ .sub("{{=response.flash or ''}}", page) print page else: raise Exception("Unable to convert") if __name__ == '__main__': if len(sys.argv) < 2: print """USAGE: 1) start a new web2py application 2) Download a sample free layout from the web into the static/ folder of your web2py application (make sure a sample index.html is there) 3) run this script with python layout_make.py /path/to/web2py/applications/app/static/ > /path/to/web2py/applications/app/views/layout.html """ elif not os.path.exists(sys.argv[1]): print 'Folder %s does not exist' % sys.argv[1] else: process(sys.argv[1]) web2py-2.12.3.orig/scripts/import_static.py0000664000000000000000000000656512564727264017423 0ustar rootrootimport os import sys import glob import shutil import re regex_link = re.compile("""(href|src)\s*=\s*("|')(.+?)("|')""") def getname(filename): return re.compile('\W').sub('',filename.split('/')[-1].rsplit('.',1)[0]) def make_controller(html_files): controller = '' for filename in html_files: name = getname(filename) controller += 'def %s():\n return locals()\n\n' % name return controller def fix_links(html,prefix): def fix(match): href,link = match.group(1), match.group(3) if not '://' in link: if link.lower().endswith('.html') and not '/' in link: link = "{{=URL('%s','%s')}}" % (prefix, getname(link)) elif link.startswith('./'): link = "{{=URL('static','%s/%s')}}" % (prefix,link[2:]) elif link.startswith('/'): link = "{{=URL('static','%s/%s')}}" % (prefix,link[1:]) else: link = "{{=URL('static','%s/%s')}}" % (prefix,link) return '%s="%s"' % (href,link) return regex_link.sub(fix,html) def make_views(html_files,prefix): views = {} layout_name = os.path.join(prefix,'layout.html') extend = "{{extend '%s'}}" % layout_name for filename in html_files: html = open(filename).read() name = getname(filename) views[os.path.join(prefix,name+'.html')] = fix_links(html,prefix) start = stop = None k = 0 while start is None or stop is None: try: if start is None: if len(set(v[k] for v in views.values()))>1: start=k if stop is None: if len(set(v[len(v)-k] for v in views.values()))>1: stop=k except: if start is None: start = k if stop is None: stop = k k+=1 header = footer = '' for name in views: html = views[name] n = len(html) header, views[name], footer = \ html[:start], extend+html[start:n-stop], html[n-stop:] layout_html = header+'{{include}}'+footer views[layout_name] = layout_html return views def recursive_overwrite(src, dest, ignore=None): if os.path.isdir(src): if not os.path.isdir(dest): os.makedirs(dest) files = os.listdir(src) if ignore is not None: ignored = ignore(src, files) else: ignored = set() for f in files: if f not in ignored: recursive_overwrite(os.path.join(src, f), os.path.join(dest, f), ignore) else: shutil.copyfile(src, dest) def convert(source, destination,prefix='imported'): html_files = glob.glob(os.path.join(source,'*.html')) static_folder = os.path.join(destination,'static',prefix) recursive_overwrite(source,static_folder) controller = make_controller(html_files) views = make_views(html_files,prefix) controller_filename = os.path.join(destination,'controllers',prefix+'.py') open(controller_filename,'w').write(controller) for name in views: fullname = os.path.join(destination,'views',name) if not os.path.exists(os.path.split(fullname)[0]): os.makedirs(os.path.split(fullname)[0]) open(fullname,'w').write(views[name]) convert(sys.argv[1],sys.argv[2]) web2py-2.12.3.orig/scripts/setup-shared-hosting-2.4.sh0000664000000000000000000000054712564727264021074 0ustar rootroot# install virtualenv easy_install virtualenv python virtualenv.py w2env # install missing modules w2env/bin/easy_install -U pysqlite hashlib # donwload web2py and unpack wget http://web2py.com/examples/static/web2py_src.zip unzip web2py_src.zip cd web2py # start web2py using command-line script w2env/bin/python web2py.py -i 0.0.0.0 -p 8123 -a 'adminpasswd' web2py-2.12.3.orig/scripts/setup-scheduler-centos.sh0000664000000000000000000000217012564727264021115 0ustar rootroot#!/bin/sh # # Author: Tyrone Hattingh # web2py issue: http://code.google.com/p/web2py/issues/detail?id=867 # # 1) vi web2py-scheduler # 2) Paste in the above # 3) Add in the following 2 lines in the web2py-scheduler file # (required for centos i believe): # # # chkconfig: 2345 90 10 # # description: web2py-scheduler # # 4) make it executable with # # chmod 755 web2py-scheduler # # 5) add it to startup with # # chkconfig --add web2py-scheduler # DAEMON=/usr/local/bin/python PARAMETERS="/var/www/html/web2py/web2py.py -K init" LOGFILE=/var/log/web2py-scheduler.log start() { echo -n "starting up $DAEMON" RUN=`$DAEMON $PARAMETERS > $LOGFILE 2>&1` if [ "$?" -eq 0 ]; then echo " Done." else echo " FAILED." fi } stop() { killall $DAEMON } status() { killall -0 $DAEMON if [ "$?" -eq 0 ]; then echo "Running." else echo "Not Running." fi } case "$1" in start) start ;; restart) stop sleep 2 start ;; stop) stop ;; status) status ;; *) echo "usage : $0 start|restart|stop|status" ;; esac exit 0 web2py-2.12.3.orig/scripts/setup-web2py-nginx-uwsgi-centos64.sh0000664000000000000000000001357312564727264023007 0ustar rootroot#!/bin/bash # Autor: Nilton OS -- www.linuxpro.com.br echo 'setup-web2py-nginx-uwsgi-centos64.sh' echo 'Support CentOS 6.4' echo 'Installs Nginx 1.4.1 + uWSGI + Web2py' # Get Web2py Admin Password echo -e "Web2py Admin Password: \c " read PW echo -e "Set Server Name Ex: web2py.domain.com : \c " read SERVER_FQDN echo -e "Set Server IP: \c " read SERVER_IP echo "" >>/etc/hosts echo "$SERVER_IP $SERVER_FQDN" >>/etc/hosts yum update -y yum install -y http://mirror-fpt-telecom.fpt.net/fedora/epel/6/i386/epel-release-6-8.noarch.rpm yum clean all yum install -y gcc libxml2-devel python-devel python-pip PyXML unzip make sudo ## 64Bits System ## yum install -y http://nginx.org/packages/rhel/6/x86_64/RPMS/nginx-1.4.1-1.el6.ngx.x86_64.rpm yum install -y http://nginx.org/packages/rhel/6/i386/RPMS/nginx-1.4.1-1.el6.ngx.i386.rpm pip-python install --upgrade pip PIPPATH=`which pip` $PIPPATH install --upgrade uwsgi # Prepare folders for uwsgi mkdir /etc/uwsgi mkdir /var/log/uwsgi mkdir -p /var/www/ #usermod -a -G apache nginx mkdir -p /etc/nginx/ssl/ cd /etc/nginx/ssl openssl genrsa 1024 > web2py.key && chmod 400 web2py.key openssl req -new -x509 -nodes -sha1 -days 1780 -key web2py.key > web2py.crt openssl x509 -noout -fingerprint -text < web2py.crt > web2py.info echo 'server { listen YOUR_SERVER_IP:80; server_name YOUR_SERVER_FQDN; #to enable correct use of response.static_version location ~* /(\w+)/static(?:/_[\d]+\.[\d]+\.[\d]+)?/(.*)$ { alias /var/www/web2py/applications/$1/static/$2; expires max; } location / { #uwsgi_pass 127.0.0.1:9001; uwsgi_pass unix:///var/www/web2py/logs/web2py.socket; include /etc/nginx/uwsgi_params; uwsgi_param UWSGI_SCHEME $scheme; uwsgi_param SERVER_SOFTWARE nginx/$nginx_version; ### remove the comments if you use uploads (max 10 MB) #client_max_body_size 10m; ### } } server { listen YOUR_SERVER_IP:443 default_server ssl; server_name YOUR_SERVER_FQDN; ssl_certificate /etc/nginx/ssl/web2py.crt; ssl_certificate_key /etc/nginx/ssl/web2py.key; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_ciphers ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA; ssl_protocols SSLv3 TLSv1; keepalive_timeout 70; location ~* /(\w+)/static(?:/_[\d]+\.[\d]+\.[\d]+)?/(.*)$ { alias /var/www/web2py/applications/$1/static/$2; expires max; } location / { #uwsgi_pass 127.0.0.1:9001; uwsgi_pass unix:///var/www/web2py/logs/web2py.socket; include /etc/nginx/uwsgi_params; uwsgi_param UWSGI_SCHEME $scheme; uwsgi_param SERVER_SOFTWARE nginx/$nginx_version; ### remove the comments if you use uploads (max 10 MB) #client_max_body_size 10m; ### } }' >/etc/nginx/conf.d/web2py.conf sed -i "s/YOUR_SERVER_IP/$SERVER_IP/" /etc/nginx/conf.d/web2py.conf sed -i "s/YOUR_SERVER_FQDN/$SERVER_FQDN/" /etc/nginx/conf.d/web2py.conf # Create configuration file /etc/uwsgi/web2py.ini echo '[uwsgi] socket = /var/www/web2py/logs/%n.socket pythonpath = /var/www/web2py/ mount = /=wsgihandler:application processes = 4 master = true harakiri = 60 reload-mercy = 8 cpu-affinity = 1 stats = /tmp/%n.stats.socket max-requests = 2000 limit-as = 512 reload-on-as = 256 reload-on-rss = 192 uid = nginx gid = nginx cron = 0 0 -1 -1 -1 python /var/www/web2py/web2py.py -Q -S welcome -M -R scripts/sessions2trash.py -A -o no-orphans = true chmod-socket = 666 ' >/etc/uwsgi/web2py.ini cd /var/www/ curl --progress -O http://web2py.com/examples/static/web2py_src.zip unzip web2py_src.zip && rm -rf web2py_src.zip # Download latest version of sessions2trash.py mv web2py/handlers/wsgihandler.py web2py/wsgihandler.py chown -R nginx:nginx web2py cd /var/www/web2py sudo -u nginx python -c "from gluon.main import save_password; save_password('$PW',443)" ## Daemons /start/stop echo '#!/bin/sh # Autor: Nilton OS -- www.linuxpro.com.br # # ### BEGIN INIT INFO # Provides: uwsgi # Required-Start: $syslog $remote_fs # Should-Start: $time ypbind smtp # Required-Stop: $syslog $remote_fs # Should-Stop: ypbind smtp # Default-Start: 3 5 # Default-Stop: 0 1 2 6 ### END INIT INFO # Source function library. . /etc/rc.d/init.d/functions # Check for missing binaries (stale symlinks should not happen) UWSGI_BIN=`which uwsgi` test -x $UWSGI_BIN || { echo "$UWSGI_BIN not installed"; if [ "$1" = "stop" ]; then exit 0; else exit 5; fi; } UWSGI_EMPEROR_MODE=true UWSGI_VASSALS="/etc/uwsgi/" UWSGI_OPTIONS="--enable-threads --logto /var/log/uwsgi/uwsgi.log" lockfile=/var/lock/subsys/uwsgi UWSGI_OPTIONS="$UWSGI_OPTIONS --autoload" if [ "$UWSGI_EMPEROR_MODE" = "true" ] ; then UWSGI_OPTIONS="$UWSGI_OPTIONS --emperor $UWSGI_VASSALS" fi case "$1" in start) echo -n "Starting uWSGI " daemon $UWSGI_BIN $UWSGI_OPTIONS & ;; stop) echo -n "Shutting down uWSGI " killproc $UWSGI_BIN ;; restart) $0 stop $0 start ;; status) echo -n "Checking for service uWSGI " status $UWSGI_BIN ;; *) echo "Usage: $0 {start|stop|status|restart}" exit 1 ;; esac exit 0 '> /etc/init.d/uwsgi chmod +x /etc/init.d/uwsgi /etc/init.d/uwsgi start /etc/init.d/nginx start /etc/init.d/iptables stop chkconfig --del iptables chkconfig --levels 235 uwsgi on chkconfig --levels 235 nginx on ## you can reload uwsgi with #/etc/init.d/uwsgi restart ## to reload web2py only (without restarting uwsgi) # touch /etc/uwsgi/web2py.ini web2py-2.12.3.orig/scripts/extract_pgsql_models.py0000664000000000000000000002402412564727264020753 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- """Create web2py model (python code) to represent PostgreSQL tables. Features: * Uses ANSI Standard INFORMATION_SCHEMA (might work with other RDBMS) * Detects legacy "keyed" tables (not having an "id" PK) * Connects directly to running databases, no need to do a SQL dump * Handles notnull, unique and referential constraints * Detects most common datatypes and default values * Support PostgreSQL columns comments (ie. for documentation) Requeriments: * Needs PostgreSQL pyscopg2 python connector (same as web2py) * If used against other RDBMS, import and use proper connector (remove pg_ code) Created by Mariano Reingart, based on a script to "generate schemas from dbs" (mysql) by Alexandre Andrade """ _author__ = "Mariano Reingart " HELP = """ USAGE: extract_pgsql_models db host port user passwd Call with PostgreSQL database connection parameters, web2py model will be printed on standard output. EXAMPLE: python extract_pgsql_models.py mydb localhost 5432 reingart saraza """ # Config options DEBUG = False # print debug messages to STDERR SCHEMA = 'public' # change if not using default PostgreSQL schema # Constant for Field keyword parameter order (and filter): KWARGS = ('type', 'length', 'default', 'required', 'ondelete', 'notnull', 'unique', 'label', 'comment') import sys def query(conn, sql, *args): "Execute a SQL query and return rows as a list of dicts" cur = conn.cursor() ret = [] try: if DEBUG: print >> sys.stderr, "QUERY: ", sql % args cur.execute(sql, args) for row in cur: dic = {} for i, value in enumerate(row): field = cur.description[i][0] dic[field] = value if DEBUG: print >> sys.stderr, "RET: ", dic ret.append(dic) return ret finally: cur.close() def get_tables(conn, schema=SCHEMA): "List table names in a given schema" rows = query(conn, """SELECT table_name FROM information_schema.tables WHERE table_schema = %s ORDER BY table_name""", schema) return [row['table_name'] for row in rows] def get_fields(conn, table): "Retrieve field list for a given table" if DEBUG: print >> sys.stderr, "Processing TABLE", table rows = query(conn, """ SELECT column_name, data_type, is_nullable, character_maximum_length, numeric_precision, numeric_precision_radix, numeric_scale, column_default FROM information_schema.columns WHERE table_name=%s ORDER BY ordinal_position""", table) return rows def define_field(conn, table, field, pks): "Determine field type, default value, references, etc." f = {} ref = references(conn, table, field['column_name']) if ref: f.update(ref) elif field['column_default'] and \ field['column_default'].startswith("nextval") and \ field['column_name'] in pks: # postgresql sequence (SERIAL) and primary key! f['type'] = "'id'" elif field['data_type'].startswith('character'): f['type'] = "'string'" if field['character_maximum_length']: f['length'] = field['character_maximum_length'] elif field['data_type'] in ('text', ): f['type'] = "'text'" elif field['data_type'] in ('boolean', 'bit'): f['type'] = "'boolean'" elif field['data_type'] in ('integer', 'smallint', 'bigint'): f['type'] = "'integer'" elif field['data_type'] in ('double precision', 'real'): f['type'] = "'double'" elif field['data_type'] in ('timestamp', 'timestamp without time zone'): f['type'] = "'datetime'" elif field['data_type'] in ('date', ): f['type'] = "'date'" elif field['data_type'] in ('time', 'time without time zone'): f['type'] = "'time'" elif field['data_type'] in ('numeric', 'currency'): f['precision'] = field['numeric_precision'] f['scale'] = field['numeric_scale'] or 0 f['type'] = "'decimal({},{})'".format(f['precision'],f['scale']) elif field['data_type'] in ('bytea', ): f['type'] = "'blob'" elif field['data_type'] in ('point', 'lseg', 'polygon', 'unknown', 'USER-DEFINED'): f['type'] = "" # unsupported? else: raise RuntimeError("Data Type not supported: %s " % str(field)) try: if field['column_default']: if field['column_default'] == "now()": d = "request.now" elif field['column_default'] == "true": d = "True" elif field['column_default'] == "false": d = "False" else: d = repr(eval(field['column_default'])) f['default'] = str(d) except (ValueError, SyntaxError): pass except Exception, e: raise RuntimeError( "Default unsupported '%s'" % field['column_default']) if not field['is_nullable']: f['notnull'] = "True" comment = get_comment(conn, table, field) if comment is not None: f['comment'] = repr(comment) return f def is_unique(conn, table, field): "Find unique columns (incomplete support)" rows = query(conn, """ SELECT information_schema.constraint_column_usage.column_name FROM information_schema.table_constraints NATURAL JOIN information_schema.constraint_column_usage WHERE information_schema.table_constraints.table_name=%s AND information_schema.constraint_column_usage.column_name=%s AND information_schema.table_constraints.constraint_type='UNIQUE' ;""", table, field['column_name']) return rows and True or False def get_comment(conn, table, field): "Find the column comment (postgres specific)" rows = query(conn, """ SELECT d.description AS comment FROM pg_class c JOIN pg_description d ON c.oid=d.objoid JOIN pg_attribute a ON c.oid = a.attrelid WHERE c.relname=%s AND a.attname=%s AND a.attnum = d.objsubid ;""", table, field['column_name']) return rows and rows[0]['comment'] or None def primarykeys(conn, table): "Find primary keys" rows = query(conn, """ SELECT information_schema.constraint_column_usage.column_name FROM information_schema.table_constraints NATURAL JOIN information_schema.constraint_column_usage WHERE information_schema.table_constraints.table_name=%s AND information_schema.table_constraints.constraint_type='PRIMARY KEY' ;""", table) return [row['column_name'] for row in rows] def references(conn, table, field): "Find a FK (fails if multiple)" rows1 = query(conn, """ SELECT table_name, column_name, constraint_name, update_rule, delete_rule, ordinal_position FROM information_schema.key_column_usage NATURAL JOIN information_schema.referential_constraints NATURAL JOIN information_schema.table_constraints WHERE information_schema.key_column_usage.table_name=%s AND information_schema.key_column_usage.column_name=%s AND information_schema.table_constraints.constraint_type='FOREIGN KEY' ;""", table, field) if len(rows1) == 1: rows2 = query(conn, """ SELECT table_name, column_name, * FROM information_schema.constraint_column_usage WHERE constraint_name=%s """, rows1[0]['constraint_name']) row = None if len(rows2) > 1: row = rows2[int(rows1[0]['ordinal_position']) - 1] keyed = True if len(rows2) == 1: row = rows2[0] keyed = False if row: if keyed: # THIS IS BAD, DON'T MIX "id" and primarykey!!! ref = {'type': "'reference %s.%s'" % (row['table_name'], row['column_name'])} else: ref = {'type': "'reference %s'" % (row['table_name'],)} if rows1[0]['delete_rule'] != "NO ACTION": ref['ondelete'] = repr(rows1[0]['delete_rule']) return ref elif rows2: raise RuntimeError("Unsupported foreign key reference: %s" % str(rows2)) elif rows1: raise RuntimeError("Unsupported referential constraint: %s" % str(rows1)) def define_table(conn, table): "Output single table definition" fields = get_fields(conn, table) pks = primarykeys(conn, table) print "db.define_table('%s'," % (table, ) for field in fields: fname = field['column_name'] fdef = define_field(conn, table, field, pks) if fname not in pks and is_unique(conn, table, field): fdef['unique'] = "True" if fdef['type'] == "'id'" and fname in pks: pks.pop(pks.index(fname)) print " Field('%s', %s)," % (fname, ', '.join(["%s=%s" % (k, fdef[k]) for k in KWARGS if k in fdef and fdef[k]])) if pks: print " primarykey=[%s]," % ", ".join(["'%s'" % pk for pk in pks]) print " migrate=migrate)" print def define_db(conn, db, host, port, user, passwd): "Output database definition (model)" dal = 'db = DAL("postgres://%s:%s@%s:%s/%s", pool_size=10)' print dal % (user, passwd, host, port, db) print print "migrate = False" print for table in get_tables(conn): define_table(conn, table) if __name__ == "__main__": if len(sys.argv) < 6: print HELP else: # Parse arguments from command line: db, host, port, user, passwd = sys.argv[1:6] # Make the database connection (change driver if required) import psycopg2 cnn = psycopg2.connect(database=db, host=host, port=port, user=user, password=passwd, ) # Start model code generation: define_db(cnn, db, host, port, user, passwd) web2py-2.12.3.orig/scripts/tickets2slack.py0000775000000000000000000000442112564727264017300 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- # # Post error tickets to slack on a 5 minute schedule. # # Proper use depends on having created a web-hook through Slack, and having set # that value in your app's model as the value of global_settings.slack_hook. # Details on creating web-hooks can be found at https://slack.com/integrations # # requires the Requests module for posting to slack, other requirements are # standard or provided by web2py # # Usage (on Unices), replace myapp with the name of your application and run: # nohup python web2py.py -S myapp -M -R scripts/tickets2slack.py & import sys import os import time import pickle import json try: import requests except ImportError as e: print "missing module 'Requests', aborting." sys.exit(1) from gluon import URL from gluon.utils import md5_hash from gluon.restricted import RestrictedError from gluon.settings import global_settings path = os.path.join(request.folder, 'errors') sent_errors_file = os.path.join(path, 'slack_errors.pickle') hashes = {} if os.path.exists(sent_errors_file): try: with open(sent_errors_file, 'rb') as f: hashes = pickle.load(f) except Exception as _: pass # ## CONFIGURE HERE SLEEP_MINUTES = 5 ALLOW_DUPLICATES = False global_settings.slack_hook = global_settings.slack_hook or \ 'https://hooks.slack.com/services/your_service' # ## END CONFIGURATION while 1: for file_name in os.listdir(path): if file_name == 'slack_errors.pickle': continue if not ALLOW_DUPLICATES: key = md5_hash(file_name) if key in hashes: continue hashes[key] = 1 error = RestrictedError() try: error.load(request, request.application, file_name) except Exception as _: continue # not an exception file? url = URL(a='admin', f='ticket', args=[request.application, file], scheme=True) payload = json.dumps(dict(text="Error in %(app)s.\n%(url)s" % dict(app=request.application, url=url))) requests.post(global_settings.slack_hook, data=dict(payload=payload)) with open(sent_errors_file, 'wb') as f: pickle.dump(hashes, f) time.sleep(SLEEP_MINUTES * 60) web2py-2.12.3.orig/scripts/manage.py0000664000000000000000000000714712564727264015767 0ustar rootrootimport os import glob import zipfile import urllib import tempfile import shutil def copytree(src, dst): names = os.listdir(src) ignored_names = set() errors = [] if not os.path.exists(dst): os.makedirs(dst) for name in names: srcname = os.path.join(src, name) dstname = os.path.join(dst, name) if os.path.isdir(srcname): copytree(srcname, dstname) else: shutil.copy2(srcname, dstname) class W2PInstance(object): SOURCES = {'stable':'http://web2py.com/examples/static/web2py_src.zip', 'nightly':'http://web2py.com/examples/static/nightly/web2py_src.zip', 'trunk':'https://github.com/web2py/web2py/archive/master.zip'} def __init__(self,path): self.path = path def warn(self,message="system going down soon"): apps = glob.glob(os.path.join(self.path,'applications','*')) for app in apps: if os.path.isdir(app): open(os.path.join(app,'notifications.txt'),'w').write(message) def install(self,source='stable'): if not os.path.exists(self.path): os.mkdir(self.path) tmpdir = tempfile.mkdtemp() link = self.SOURCES[source] srcfile = os.path.join(tmpdir,'web2py_src.zip') print 'downloading...' open(srcfile,'wb').write(urllib.urlopen(link).read()) print 'extracing...' zipfile.ZipFile(srcfile,'r').extractall(tmpdir) print 'copying...' copytree(os.path.join(tmpdir,'web2py'),self.path) def upgrade(self,source='stable'): self.install(source) def upgrade_tmp(self,source,common=False): tmpdir = tempfile.mkdtemp() link = self.SOURCES[source] srcfile = os.path.join(tmpdir,'web2py_src.zip') print 'copying production...' copytree(self.path,os.path.join(tmpdir,'web2py')) tmpdir_web2py = os.path.join(tmpdir,'web2py') tmp_web2py = W2PInstance(tempdir_web2py) tmp_web2py.clear_sessions() tmp_web2py.clear_cache() tmp_web2py.clear_error() print 'downloading...' open(srcfile,'wb').write(urllib.urlopen(link).read()) print 'extracing...' zipfile.ZipFile(srcfile,'r').extractall(tmpdir) print 'running tests...' try: olddir = os.getcwd() os.chdir(tempdir_web2py) ret = os.system("PYTHONPATH=. python -m unittest -v gluon.tests") # eventually start web2py and run functional tests finally: os.chrid(olddir) if ret: sys.exit(ret and 1) copytree(os.path.join(tmpdir,'web2py'),self.path) def clear_sessions(self): files = glob.glob(os.path.join(self.path,'applications','*','sessions','*')) for file in files: try: os.unlink(file) except: pass def clear_cache(self): files = glob.glob(os.path.join(self.path,'applications','*','cache','*')) for file in files: try: os.unlink(file) except: pass def clear_errors(self): files = glob.glob(os.path.join(self.path,'applications','*','errors','*')) for file in files: try: os.unlink(file) except: pass web2py = W2PInstance('/Users/massimodipierro/Downloads/web2py') #web2py.install() web2py.clear_sessions() """ {{ import os _notifications = os.path.join(request.folder,'notifications.txt') if os.path.exixts(_notifications): response.flash = response.flash or open(_notifications).read() pass }} """ web2py-2.12.3.orig/scripts/zip_static_files.py0000664000000000000000000000305112564727264020060 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- ## launch with python web2py.py -S myapp -R scripts/zip_static_files.py import os import gzip def zip_static(filelist=[]): tsave = 0 for fi in filelist: extension = os.path.splitext(fi) extension = len(extension) > 1 and extension[1] or None if not extension or extension not in ALLOWED_EXTS: print 'skipping %s' % os.path.basename(fi) continue fstats = os.stat(fi) atime, mtime = fstats.st_atime, fstats.st_mtime gfi = fi + '.gz' if os.path.isfile(gfi): zstats = os.stat(gfi) zatime, zmtime = zstats.st_atime, zstats.st_mtime if zatime == atime and zmtime == mtime: print 'skipping %s, already gzipped to the latest version' % os.path.basename(fi) continue print 'gzipping %s to %s' % ( os.path.basename(fi), os.path.basename(gfi)) f_in = open(fi, 'rb') f_out = gzip.open(gfi, 'wb') f_out.writelines(f_in) f_out.close() f_in.close() os.utime(gfi, (atime, mtime)) saved = fstats.st_size - os.stat(gfi).st_size tsave += saved print 'saved %s KB' % (int(tsave) / 1000.0) if __name__ == '__main__': ALLOWED_EXTS = ['.css', '.js'] static_path = os.path.abspath(os.path.join(request.folder, 'static')) filelist = [] for root, dir, files in os.walk(static_path): for file in files: filelist.append(os.path.join(root, file)) zip_static(filelist) web2py-2.12.3.orig/scripts/setup-web2py-centos7.sh0000664000000000000000000001534512564727264020446 0ustar rootrootecho "This script will: 1) Install modules needed to run web2py on Fedora and CentOS/RHEL 2) Install Python 2.6 to /opt and recompile wsgi if not provided 2) Install web2py in /opt/web-apps/ 3) Configure SELinux and iptables 5) Create a self signed ssl certificate 6) Setup web2py with mod_wsgi 7) Create virtualhost entries so that web2py responds for '/' 8) Restart Apache. You should probably read this script before running it. Although SELinux permissions changes have been made, further SELinux changes will be required for your personal apps. (There may also be additional changes required for the bundled apps.) As a last resort, SELinux can be disabled. A simple iptables configuration has been applied. You may want to review it to verify that it meets your needs. Finally, if you require a proxy to access the Internet, please set up your machine to do so before running this script. (author: berubejd) Press ENTER to continue...[ctrl+C to abort]" read CONFIRM #!/bin/bash # (modified for centos7: Dragan (spamperakojotgenije@gmail.com) ### ### Phase 0 - This may get messy. Lets work from a temporary directory ### current_dir=`pwd` if [ -d /tmp/setup-web2py/ ]; then mv /tmp/setup-web2py/ /tmp/setup-web2py.old/ fi mkdir -p /tmp/setup-web2py cd /tmp/setup-web2py ### ### Phase 1 - Requirements installation ### echo echo " - Installing packages" echo # Verify packages are up to date yum update # Install required packages yum install httpd mod_ssl mod_wsgi wget python unzip ### ### Phase 2 - Install web2py ### echo echo " - Downloading, installing, and starting web2py" echo # Create web-apps directory, if required if [ ! -d "/opt/web-apps" ]; then mkdir -p /opt/web-apps chmod 755 /opt chmod 755 /opt/web-apps fi cd /opt/web-apps # Download web2py if [ -e web2py_src.zip* ]; then rm web2py_src.zip* fi wget http://web2py.com/examples/static/web2py_src.zip unzip web2py_src.zip mv web2py/handlers/wsgihandler.py web2py/wsgihandler.py chown -R apache:apache web2py ### ### Phase 3 - Setup SELinux context ### ### SELinux doesn't behave well with web2py, for details ### see https://groups.google.com/forum/?fromgroups#!searchin/web2py/selinux/web2py/_thPGA9YhK4/dSnvF3D_lswJ ### ### For now you'll have to disable SELinux # Allow http_tmp_exec required for wsgi RETV=`setsebool -P httpd_tmp_exec on > /dev/null 2>&1; echo $?` if [ ! ${RETV} -eq 0 ]; then # CentOS doesn't support httpd_tmp_exec cd /tmp/setup-web2py # Create the SELinux policy cat > httpd.te < /etc/httpd/ssl/self_signed.key openssl req -new -x509 -nodes -sha1 -days 365 -key /etc/httpd/ssl/self_signed.key > /etc/httpd/ssl/self_signed.cert openssl x509 -noout -fingerprint -text < /etc/httpd/ssl/self_signed.cert > /etc/httpd/ssl/self_signed.info chmod 400 /etc/httpd/ssl/self_signed.* ### ### Phase 6 - Configure Apache ### echo echo " - Configure Apache to use mod_wsgi" echo # Create config if [ -e /etc/httpd/conf.d/welcome.conf ]; then mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.disabled fi cat > /etc/httpd/conf.d/default.conf < WSGIDaemonProcess web2py user=apache group=apache WSGIProcessGroup web2py WSGIScriptAlias / /opt/web-apps/web2py/wsgihandler.py WSGIPassAuthorization On AllowOverride None Order Allow,Deny Deny from all Require all granted Allow from all AliasMatch ^/([^/]+)/static/(?:_[\d]+.[\d]+.[\d]+/)?(.*) /opt/web-apps/web2py/applications/\$1/static/\$2 Options -Indexes Order Allow,Deny Allow from all Require all granted Deny from all Deny from all CustomLog /var/log/httpd/access_log common ErrorLog /var/log/httpd/error_log SSLEngine on SSLCertificateFile /etc/httpd/ssl/self_signed.cert SSLCertificateKeyFile /etc/httpd/ssl/self_signed.key WSGIProcessGroup web2py WSGIScriptAlias / /opt/web-apps/web2py/wsgihandler.py WSGIPassAuthorization On AllowOverride None Order Allow,Deny Deny from all Require all granted Allow from all AliasMatch ^/([^/]+)/static/(?:_[\d]+.[\d]+.[\d]+/)?(.*) /opt/web-apps/web2py/applications/\$1/static/\$2 Options -Indexes ExpiresActive On ExpiresDefault "access plus 1 hour" Order Allow,Deny Allow from all Require all granted CustomLog /var/log/httpd/access_log common ErrorLog /var/log/httpd/error_log EOF # Fix wsgi socket locations echo "WSGISocketPrefix run/wsgi" >> /etc/httpd/conf.d/wsgi.conf # Restart Apache to pick up changes systemctl restart httpd.service ### ### Phase 7 - Setup web2py admin password ### echo echo " - Setup web2py admin password" echo cd /opt/web-apps/web2py sudo -u apache python -c "from gluon.main import save_password; save_password(raw_input('admin password: '),443)" ### ### Phase 8 - Verify that required services start at boot ### /sbin/chkconfig iptables on /sbin/chkconfig httpd on ### ### Phase 999 - Done! ### # Change back to original directory cd ${current_directory} echo " - Complete!" echo web2py-2.12.3.orig/scripts/bench.py0000664000000000000000000000045712564727264015613 0ustar rootrootimport time import sys import urllib2 import urllib2 n = int(sys.argv[1]) url = sys.argv[2] headers = {"Accept-Language": "en"} req = urllib2.Request(url, None, headers) t0 = time.time() for k in xrange(n): data = urllib2.urlopen(req).read() print (time.time() - t0) / n if n == 1: print data web2py-2.12.3.orig/scripts/sessions2trash.py0000775000000000000000000001754012564727264017532 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- """ sessions2trash.py Run this script in a web2py environment shell e.g. python web2py.py -S app If models are loaded (-M option) auth.settings.expiration is assumed for sessions without an expiration. If models are not loaded, sessions older than 60 minutes are removed. Use the --expiration option to override these values. Typical usage: # Delete expired sessions every 5 minutes nohup python web2py.py -S app -M -R scripts/sessions2trash.py & # Delete sessions older than 60 minutes regardless of expiration, # with verbose output, then exit. python web2py.py -S app -M -R scripts/sessions2trash.py -A -o -x 3600 -f -v # Delete all sessions regardless of expiry and exit. python web2py.py -S app -M -R scripts/sessions2trash.py -A -o -x 0 # Delete session in a module (move to the modules folder) from sessions2trash import single_loop def delete_sessions(): single_loop(auth.settings.expiration) """ from __future__ import with_statement import sys import os sys.path.append(os.path.join(*__file__.split(os.sep)[:-2] or ['.'])) from gluon import current from gluon.storage import Storage from optparse import OptionParser import cPickle import datetime import os import stat import time EXPIRATION_MINUTES = 60 SLEEP_MINUTES = 5 VERSION = 0.3 class SessionSet(object): """Class representing a set of sessions""" def __init__(self, expiration, force, verbose): self.expiration = expiration self.force = force self.verbose = verbose def get(self): """Get session files/records.""" raise NotImplementedError def trash(self): """Trash expired sessions.""" now = datetime.datetime.now() for item in self.get(): status = 'OK' last_visit = item.last_visit_default() try: session = item.get() if session.auth: if session.auth.expiration and not self.force: self.expiration = session.auth.expiration if session.auth.last_visit: last_visit = session.auth.last_visit except: pass age = 0 if last_visit: age = total_seconds(now - last_visit) if age > self.expiration or not self.expiration: item.delete() status = 'trashed' if self.verbose > 1: print 'key: %s' % str(item) print 'expiration: %s seconds' % self.expiration print 'last visit: %s' % str(last_visit) print 'age: %s seconds' % age print 'status: %s' % status print '' elif self.verbose > 0: print('%s %s' % (str(item), status)) class SessionSetDb(SessionSet): """Class representing a set of sessions stored in database""" def __init__(self, expiration, force, verbose): SessionSet.__init__(self, expiration, force, verbose) def get(self): """Return list of SessionDb instances for existing sessions.""" sessions = [] table = current.response.session_db_table if table: for row in table._db(table.id > 0).select(): sessions.append(SessionDb(row)) return sessions class SessionSetFiles(SessionSet): """Class representing a set of sessions stored in flat files""" def __init__(self, expiration, force, verbose): SessionSet.__init__(self, expiration, force, verbose) def cleanup_empty_folders(self, root_path): for path, dirs, files in os.walk(root_path, topdown=False): for d in dirs: dd = os.path.join(path, d) if not os.listdir(dd): os.rmdir(dd) def get(self): """Return list of SessionFile instances for existing sessions.""" root_path = os.path.join(current.request.folder, 'sessions') for path, dirs, files in os.walk(root_path, topdown=False): for x in files: yield SessionFile(os.path.join(path, x)) self.cleanup_empty_folders(root_path) class SessionDb(object): """Class representing a single session stored in database""" def __init__(self, row): self.row = row def delete(self): table = current.response.session_db_table self.row.delete_record() table._db.commit() def get(self): session = Storage() session.update(cPickle.loads(self.row.session_data)) return session def last_visit_default(self): if isinstance(self.row.modified_datetime, datetime.datetime): return self.row.modified_datetime else: try: return datetime.datetime.strptime(self.row.modified_datetime, '%Y-%m-%d %H:%M:%S.%f') except: print 'failed to retrieve last modified time (value: %s)' % self.row.modified_datetime def __str__(self): return self.row.unique_key class SessionFile(object): """Class representing a single session stored as a flat file""" def __init__(self, filename): self.filename = filename def delete(self): try: os.unlink(self.filename) except: pass def get(self): session = Storage() with open(self.filename, 'rb+') as f: session.update(cPickle.load(f)) return session def last_visit_default(self): return datetime.datetime.fromtimestamp( os.stat(self.filename)[stat.ST_MTIME]) def __str__(self): return self.filename def total_seconds(delta): """ Adapted from Python 2.7's timedelta.total_seconds() method. Args: delta: datetime.timedelta instance. """ return (delta.microseconds + (delta.seconds + (delta.days * 24 * 3600)) * 10 ** 6) / 10 ** 6 def single_loop(expiration=None, force=False, verbose=False): if expiration is None: try: expiration = auth.settings.expiration except: expiration = EXPIRATION_MINUTES * 60 set_files = SessionSetFiles(expiration, force, verbose) set_files.trash() set_db = SessionSetDb(expiration, force, verbose) set_db.trash() def main(): """Main processing.""" usage = '%prog [options]' + '\nVersion: %s' % VERSION parser = OptionParser(usage=usage) parser.add_option('-f', '--force', action='store_true', dest='force', default=False, help=('Ignore session expiration. ' 'Force expiry based on -x option or auth.settings.expiration.') ) parser.add_option('-o', '--once', action='store_true', dest='once', default=False, help='Delete sessions, then exit.', ) parser.add_option('-s', '--sleep', dest='sleep', default=SLEEP_MINUTES * 60, type="int", help='Number of seconds to sleep between executions. Default 300.', ) parser.add_option('-v', '--verbose', default=0, action='count', help="print verbose output, a second -v increases verbosity") parser.add_option('-x', '--expiration', dest='expiration', default=None, type="int", help='Expiration value for sessions without expiration (in seconds)', ) (options, unused_args) = parser.parse_args() expiration = options.expiration while True: single_loop(expiration, options.force, options.verbose) if options.once: break else: if options.verbose: print 'Sleeping %s seconds' % (options.sleep) time.sleep(options.sleep) if __name__ == '__main__': main() web2py-2.12.3.orig/scripts/setup-web2py-nginx-uwsgi-ubuntu.sh0000664000000000000000000001471112564727264022657 0ustar rootroot#!/bin/bash echo 'setup-web2py-nginx-uwsgi-ubuntu-precise.sh' echo 'Requires Ubuntu > 12.04 and installs Nginx + uWSGI + Web2py' # Check if user has root privileges if [[ $EUID -ne 0 ]]; then echo "You must run the script as root or using sudo" exit 1 fi # Get Web2py Admin Password echo -e "Web2py Admin Password: \c " read PW # Upgrade and install needed software apt-get update apt-get -y upgrade apt-get autoremove apt-get autoclean apt-get -y install nginx-full apt-get -y install build-essential python-dev libxml2-dev python-pip unzip pip install setuptools --no-use-wheel --upgrade PIPPATH=`which pip` $PIPPATH install --upgrade uwsgi # Create common nginx sections mkdir /etc/nginx/conf.d/web2py echo ' gzip_static on; gzip_http_version 1.1; gzip_proxied expired no-cache no-store private auth; gzip_disable "MSIE [1-6]\."; gzip_vary on; ' > /etc/nginx/conf.d/web2py/gzip_static.conf echo ' gzip on; gzip_disable "msie6"; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; ' > /etc/nginx/conf.d/web2py/gzip.conf # Create configuration file /etc/nginx/sites-available/web2py echo 'server { listen 80; server_name $hostname; ###to enable correct use of response.static_version location ~* ^/(\w+)/static(?:/_[\d]+\.[\d]+\.[\d]+)?/(.*)$ { alias /home/www-data/web2py/applications/$1/static/$2; expires max; ### if you want to use pre-gzipped static files (recommended) ### check scripts/zip_static_files.py and remove the comments # include /etc/nginx/conf.d/web2py/gzip_static.conf; } ### ###if you use something like myapp = dict(languages=['en', 'it', 'jp'], default_language='en') in your routes.py #location ~* ^/(\w+)/(en|it|jp)/static/(.*)$ { # alias /home/www-data/web2py/applications/$1/; # try_files static/$2/$3 static/$3 =404; #} ### location / { #uwsgi_pass 127.0.0.1:9001; uwsgi_pass unix:///tmp/web2py.socket; include uwsgi_params; uwsgi_param UWSGI_SCHEME $scheme; uwsgi_param SERVER_SOFTWARE nginx/$nginx_version; ###remove the comments to turn on if you want gzip compression of your pages # include /etc/nginx/conf.d/web2py/gzip.conf; ### end gzip section ### remove the comments if you use uploads (max 10 MB) #client_max_body_size 10m; ### } } server { listen 443 default_server ssl; server_name $hostname; ssl_certificate /etc/nginx/ssl/web2py.crt; ssl_certificate_key /etc/nginx/ssl/web2py.key; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_ciphers ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; keepalive_timeout 70; location / { #uwsgi_pass 127.0.0.1:9001; uwsgi_pass unix:///tmp/web2py.socket; include uwsgi_params; uwsgi_param UWSGI_SCHEME $scheme; uwsgi_param SERVER_SOFTWARE nginx/$nginx_version; ###remove the comments to turn on if you want gzip compression of your pages # include /etc/nginx/conf.d/web2py/gzip.conf; ### end gzip section ### remove the comments if you want to enable uploads (max 10 MB) #client_max_body_size 10m; ### } ###to enable correct use of response.static_version location ~* ^/(\w+)/static(?:/_[\d]+\.[\d]+\.[\d]+)?/(.*)$ { alias /home/www-data/web2py/applications/$1/static/$2; expires max; ### if you want to use pre-gzipped static files (recommended) ### check scripts/zip_static_files.py and remove the comments # include /etc/nginx/conf.d/web2py/gzip_static.conf; } ### }' >/etc/nginx/sites-available/web2py ln -s /etc/nginx/sites-available/web2py /etc/nginx/sites-enabled/web2py rm /etc/nginx/sites-enabled/default mkdir /etc/nginx/ssl cd /etc/nginx/ssl openssl genrsa 1024 > web2py.key chmod 400 web2py.key openssl req -new -x509 -nodes -sha1 -days 1780 -key web2py.key > web2py.crt openssl x509 -noout -fingerprint -text < web2py.crt > web2py.info # Prepare folders for uwsgi sudo mkdir /etc/uwsgi sudo mkdir /var/log/uwsgi # Create configuration file /etc/uwsgi/web2py.ini echo '[uwsgi] socket = /tmp/web2py.socket pythonpath = /home/www-data/web2py/ mount = /=wsgihandler:application processes = 4 master = true harakiri = 60 reload-mercy = 8 cpu-affinity = 1 stats = /tmp/stats.socket max-requests = 2000 limit-as = 512 reload-on-as = 256 reload-on-rss = 192 uid = www-data gid = www-data touch-reload = /home/www-data/web2py/routes.py cron = 0 0 -1 -1 -1 python /home/www-data/web2py/web2py.py -Q -S welcome -M -R scripts/sessions2trash.py -A -o no-orphans = true ' >/etc/uwsgi/web2py.ini #Create a configuration file for uwsgi in emperor-mode #for Upstart in /etc/init/uwsgi-emperor.conf echo '# Emperor uWSGI script description "uWSGI Emperor" start on runlevel [2345] stop on runlevel [06] ## #remove the comments in the next section to enable static file compression for the welcome app #in that case, turn on gzip_static on; on /etc/nginx/nginx.conf ## #pre-start script # python /home/www-data/web2py/web2py.py -S welcome -R scripts/zip_static_files.py # chown -R www-data:www-data /home/www-data/web2py/* #end script respawn exec uwsgi --master --die-on-term --emperor /etc/uwsgi --logto /var/log/uwsgi/uwsgi.log ' > /etc/init/uwsgi-emperor.conf # Install Web2py mkdir /home/www-data cd /home/www-data wget http://web2py.com/examples/static/web2py_src.zip unzip web2py_src.zip mv web2py/handlers/wsgihandler.py web2py/wsgihandler.py rm web2py_src.zip chown -R www-data:www-data web2py cd /home/www-data/web2py sudo -u www-data python -c "from gluon.main import save_password; save_password('$PW',443)" start uwsgi-emperor /etc/init.d/nginx restart ## you can reload uwsgi with # restart uwsgi-emperor ## and stop it with # stop uwsgi-emperor ## to reload web2py only (without restarting uwsgi) # touch /etc/uwsgi/web2py.ini web2py-2.12.3.orig/scripts/parse_top_level_domains.py0000664000000000000000000000177412564727264021434 0ustar rootroot#!/bin/env python # -*- coding: utf-8 -*- """ Use to update official_top_level_domains in gluon/validators.py """ import itertools import operator import urllib2 LIMIT = 70 PREFIX = ' ' TLDS_URL = 'http://data.iana.org/TLD/tlds-alpha-by-domain.txt' resp = urllib2.urlopen(TLDS_URL) content = resp.read() valid_lines = [a.strip().lower() for a in content.split('\n') if a.strip() and a.strip()[0] != '#'] valid_lines += ['localhost'] print 'Fetched TLDs are %s' % len(valid_lines) results = [list(g) for k, g in itertools.groupby(sorted(valid_lines), key=operator.itemgetter(0))] output = [] line = "'%s', " for a in results: output.append('%s# %s' % (PREFIX, a[-1][0])) thisline = PREFIX for c in a: newline = thisline + line % c if len(newline) > 70: output.append(thisline[:-1]) thisline = PREFIX + line % c else: thisline += line % c if thisline: output.append(thisline[:-1]) print '[\n' + '\n'.join(output)[:-1] + '\n]' web2py-2.12.3.orig/scripts/setup-web2py-fedora-ami.sh0000775000000000000000000002336512564727264021074 0ustar rootrootecho "This script will: 1) Install modules needed to run web2py on Fedora and CentOS/RHEL 2) Install Python 2.6 to /opt and recompile wsgi if not provided 2) Install web2py in /opt/web-apps/ 3) Configure SELinux and iptables 5) Create a self signed ssl certificate 6) Setup web2py with mod_wsgi 7) Create virtualhost entries so that web2py responds for '/' 8) Restart Apache. You should probably read this script before running it. Although SELinux permissions changes have been made, further SELinux changes will be required for your personal apps. (There may also be additional changes required for the bundled apps.) As a last resort, SELinux can be disabled. A simple iptables configuration has been applied. You may want to review it to verify that it meets your needs. Finally, if you require a proxy to access the Internet, please set up your machine to do so before running this script. (author: Charles Law as berubejd) Press ENTER to continue...[ctrl+C to abort]" read CONFIRM #!/bin/bash ### ### Phase 0 - This may get messy. Lets work from a temporary directory ### current_dir=`pwd` if [ -d /tmp/setup-web2py/ ]; then mv /tmp/setup-web2py/ /tmp/setup-web2py.old/ fi mkdir -p /tmp/setup-web2py cd /tmp/setup-web2py ### ### Phase 1 - Requirements installation ### echo echo " - Installing packages" echo # Verify packages are up to date yum update # Install required packages yum install httpd mod_ssl mod_wsgi wget python # Verify we have at least Python 2.5 typeset -i version_major typeset -i version_minor version=`rpm --qf %{Version} -q python` version_major=`echo ${version} | awk '{split($0, parts, "."); print parts[1]}'` version_minor=`echo ${version} | awk '{split($0, parts, "."); print parts[2]}'` if [ ! ${version_major} -ge 2 -o ! ${version_minor} -ge 5 ]; then # Setup 2.6 in /opt - based upon # http://markkoberlein.com/getting-python-26-with-django-11-together-on # Check for earlier Python 2.6 install if [ -e /opt/python2.6 ]; then # Is Python already installed? RETV=`/opt/python2.6/bin/python -V > /dev/null 2>&1; echo $?` if [ ${RETV} -eq 0 ]; then python_installed='True' else mv /opt/python2.6 /opt/python2.6-old fi fi # Install Python 2.6 if it doesn't exist already if [ ! "${python_installed}" == "True" ]; then # Install requirements for the Python build yum install sqlite-devel zlib-devel mkdir -p /opt/python2.6 # Download and install wget http://www.python.org/ftp/python/2.6.4/Python-2.6.4.tgz tar -xzf Python-2.6.4.tgz cd Python-2.6.4 ./configure --prefix=/opt/python2.6 --with-threads --enable-shared --with-zlib=/usr/include make && make install cd /tmp/setup-web2py fi # Create links for Python 2.6 # even if it was previously installed just to be sure ln -s /opt/python2.6/lib/libpython2.6.so /usr/lib ln -s /opt/python2.6/lib/libpython2.6.so.1.0 /usr/lib ln -s /opt/python2.6/bin/python /usr/local/bin/python ln -s /opt/python2.6/bin/python /usr/bin/python2.6 ln -s /opt/python2.6/lib/python2.6.so /opt/python2.6/lib/python2.6/config/ # Update linker for new libraries /sbin/ldconfig # Rebuild wsgi to take advantage of Python 2.6 yum install httpd-devel cd /tmp/setup-web2py wget http://modwsgi.googlecode.com/files/mod_wsgi-3.3.tar.gz tar -xzf mod_wsgi-3.3.tar.gz cd mod_wsgi-3.3 ./configure --with-python=/usr/local/bin/python make && make install echo "LoadModule wsgi_module modules/mod_wsgi.so" > /etc/httpd/conf.d/wsgi.conf cd /tmp/setup-web2py fi ### MySQL install untested! # Install mysql packages (optional) #yum install mysql mysql-server # Enable mysql to start at boot (optional) #chkconfig --levels 235 mysqld on #service mysqld start # Configure mysql security settings (not really optional if mysql installed) #/usr/bin/mysql_secure_installation ### ### Phase 2 - Install web2py ### echo echo " - Downloading, installing, and starting web2py" echo # Create web-apps directory, if required if [ ! -d "/opt/web-apps" ]; then mkdir -p /opt/web-apps chmod 755 /opt chmod 755 /opt/web-apps fi cd /opt/web-apps # Download web2py if [ -e web2py_src.zip* ]; then rm web2py_src.zip* fi wget http://web2py.com/examples/static/web2py_src.zip unzip web2py_src.zip mv web2py/handlers/wsgihandler.py web2py/wsgihandler.py chown -R apache:apache web2py ### ### Phase 3 - Setup SELinux context ### # Set context for Python libraries if Python 2.6 installed if [ -d /opt/python2.6 ]; then cd /opt/python2.6 chcon -R -t lib_t lib/ fi # Allow http_tmp_exec required for wsgi RETV=`setsebool -P httpd_tmp_exec on > /dev/null 2>&1; echo $?` if [ ! ${RETV} -eq 0 ]; then # CentOS doesn't support httpd_tmp_exec cd /tmp/setup-web2py # Create the SELinux policy cat > httpd.te < iptables.rules < /etc/httpd/ssl/self_signed.key openssl req -new -x509 -nodes -sha1 -days 365 -key /etc/httpd/ssl/self_signed.key > /etc/httpd/ssl/self_signed.cert openssl x509 -noout -fingerprint -text < /etc/httpd/ssl/self_signed.cert > /etc/httpd/ssl/self_signed.info chmod 400 /etc/httpd/ssl/self_signed.* ### ### Phase 6 - Configure Apache ### echo echo " - Configure Apache to use mod_wsgi" echo # Create config if [ -e /etc/httpd/conf.d/welcome.conf ]; then mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.disabled fi cat > /etc/httpd/conf.d/default.conf < WSGIDaemonProcess web2py user=apache group=apache WSGIProcessGroup web2py WSGIScriptAlias / /opt/web-apps/web2py/wsgihandler.py AllowOverride None Order Allow,Deny Deny from all Allow from all AliasMatch ^/([^/]+)/static/(?:_[\d]+.[\d]+.[\d]+/)?(.*) \ /opt/web-apps/web2py/applications/\$1/static/\$2 Options -Indexes Order Allow,Deny Allow from all Deny from all Deny from all CustomLog /var/log/httpd/access_log common ErrorLog /var/log/httpd/error_log SSLEngine on SSLCertificateFile /etc/httpd/ssl/self_signed.cert SSLCertificateKeyFile /etc/httpd/ssl/self_signed.key WSGIProcessGroup web2py WSGIScriptAlias / /opt/web-apps/web2py/wsgihandler.py AllowOverride None Order Allow,Deny Deny from all Allow from all AliasMatch ^/([^/]+)/static/(?:_[\d]+.[\d]+.[\d]+/)?(.*) \ /opt/web-apps/web2py/applications/\$1/static/\$2 Options -Indexes ExpiresActive On ExpiresDefault "access plus 1 hour" Order Allow,Deny Allow from all CustomLog /var/log/httpd/access_log common ErrorLog /var/log/httpd/error_log EOF # Fix wsgi socket locations echo "WSGISocketPrefix run/wsgi" >> /etc/httpd/conf.d/wsgi.conf # Restart Apache to pick up changes service httpd restart ### ### Phase 7 - Setup web2py admin password ### echo echo " - Setup web2py admin password" echo cd /opt/web-apps/web2py sudo -u apache python -c "from gluon.main import save_password; save_password(raw_input('admin password: '),443)" ### ### Phase 8 - Verify that required services start at boot ### /sbin/chkconfig iptables on /sbin/chkconfig httpd on ### ### Phase 999 - Done! ### # Change back to original directory cd ${current_directory} echo " - Complete!" echo web2py-2.12.3.orig/scripts/fixws.py0000775000000000000000000000120612564727264015670 0ustar rootrootimport sys import glob def read_fileb(filename, mode='rb'): f = open(filename, mode) try: return f.read() finally: f.close() def write_fileb(filename, value, mode='wb'): f = open(filename, mode) try: f.write(value) finally: f.close() for filename in glob.glob(sys.argv[1]): data1 = read_fileb(filename) write_fileb(filename + '.bak2', data1) data2lines = read_fileb(filename).strip().split('\n') data2 = '\n'.join([line.rstrip( ).replace('\t', ' ' * 2) for line in data2lines]) + '\n' write_fileb(filename, data2) print filename, len(data1) - len(data2) web2py-2.12.3.orig/scripts/web2py-lock.sh0000664000000000000000000000064112564727264016647 0ustar rootrootchown -R nobody:nobody *.py chown -R nobody:nobody gluon chown -R nobody:nobody scripts chown -R nobody:nobody applications/*/modules/ chown -R nobody:nobody applications/*/models/ chown -R nobody:nobody applications/*/controllers/ chown -R nobody:nobody applications/*/views/ chown -R nobody:nobody applications/*/static/ chown -R nobody:nobody applications/*/cron/ echo "unlock with chown -R www-data:www-data ./" web2py-2.12.3.orig/scripts/web2py.fedora.sh0000664000000000000000000000345212564727264017163 0ustar rootroot#!/bin/bash # # /etc/rc.d/init.d/web2pyd # # Starts the Web2py Daemon on Fedora (Red Hat Linux) # # To execute automatically at startup # # sudo chkconfig --add web2pyd # # chkconfig: 2345 90 10 # description: Web2py Daemon # processname: web2pyd # pidfile: /var/lock/subsys/web2pyd source /etc/rc.d/init.d/functions RETVAL=0 NAME=web2pyd DESC="Web2py Daemon" DAEMON_DIR="/usr/lib/web2py" ADMINPASS="admin" #ADMINPASS="\" PIDFILE=/var/run/$NAME.pid PORT=8001 PYTHON=python cd $DAEMON_DIR start() { echo -n $"Starting $DESC ($NAME): " daemon --check $NAME $PYTHON $DAEMON_DIR/web2py.py -Q --nogui -a $ADMINPASS -d $PIDFILE -p $PORT & RETVAL=$? if [ $RETVAL -eq 0 ]; then touch /var/lock/subsys/$NAME fi echo return $RETVAL } stop() { echo -n $"Shutting down $DESC ($NAME): " killproc -p "$PIDFILE" -d 3 "$NAME" echo if [ $RETVAL -eq 0 ]; then rm -f /var/lock/subsys/$NAME rm -f $PIDFILE fi return $RETVAL } restart() { stop start } status() { if [ -r "$PIDFILE" ]; then pid=`cat $PIDFILE` fi if [ $pid ]; then echo "$NAME (pid $pid) is running..." else echo "$NAME is stopped" fi } case "$1" in start) start;; stop) stop;; status) status;; restart) restart;; condrestart) [ -e /var/lock/subsys/$NAME ] && restart RETVAL=$? ;; *) echo $"Usage: $0 {start|stop|restart|condrestart|status}" RETVAL=1 ;; esac exit $RETVAL web2py-2.12.3.orig/scripts/web2py.archlinux.sh0000775000000000000000000000205212564727264017716 0ustar rootroot#!/bin/bash # the script should be run # from WEB2PY root directory prog="web2py.py" chmod +x $prog function web2py_start { nohup python2 ./$prog -a "" >>/dev/null 2>/dev/null & pid=`pgrep -f $prog | tail -1` if [ "x$pid" != "x$$" ] then echo "WEB2PY has been started (pid $pid). Stop it with '$0 stop'" else echo "Failed to start WEB2PY." fi } function web2py_stop { pid="`pgrep -f $prog | grep -v $$`" if [ "x$pid" == "x" ] then echo "No WEB2PY processes to stop." else kill -15 $pid # Wait for web2py to shut down gracefully. sleep 2 pid="`pgrep -f $prog | head -1`" if [ "x$pid" == "x" ] then echo "WEB2PY has been stopped." else echo "Failed to stop WEB2PY. (Possibly, only one of several web2py processes was killed.)" echo "Still running:" pgrep -af $prog fi fi } case "$1" in start) web2py_start ;; stop) web2py_stop ;; restart) web2py_stop web2py_start ;; *) echo "Usage: $0 [start|stop|restart]" ;; esac exit 0 web2py-2.12.3.orig/scripts/contentparser.py0000775000000000000000000001041312564727264017417 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- import cStringIO import re import sys import tarfile import urllib import xml.parsers.expat as expat """ Update script for contenttype.py module. Usage: python contentupdate.py /path/to/contenttype.py If no path is specified, script will look for contenttype.py in current working directory. Internet connection is required to perform the update. """ OVERRIDE = [ ('.pdb', 'chemical/x-pdb'), ('.xyz', 'chemical/x-pdb') ] class MIMEParser(dict): def __start_element_handler(self, name, attrs): if name == 'mime-type': if self.type: for extension in self.extensions: self[extension] = self.type self.type = attrs['type'].lower() self.extensions = [] elif name == 'glob': pattern = attrs['pattern'] if pattern.startswith('*.'): self.extensions.append(pattern[1:].lower()) def __init__(self, fileobj): dict.__init__(self) self.type = '' self.extensions = '' parser = expat.ParserCreate() parser.StartElementHandler = self.__start_element_handler parser.ParseFile(fileobj) for extension, contenttype in OVERRIDE: self[extension] = contenttype if __name__ == '__main__': try: path = sys.argv[1] except: path = 'contenttype.py' vregex = re.compile('database version (?P.+?)\.?\n') sys.stdout.write('Checking contenttype.py database version:') sys.stdout.flush() try: pathfile = open(path) try: current = pathfile.read() finally: pathfile.close() cversion = re.search(vregex, current).group('version') sys.stdout.write('\t[OK] version %s\n' % cversion) except Exception, e: sys.stdout.write('\t[ERROR] %s\n' % e) exit() sys.stdout.write('Checking freedesktop.org database version:') sys.stdout.flush() try: search = re.search( '(?Phttp://freedesktop.org/.+?/shared-mime-info-(?P.+?)\.tar\.(?P[gb]z2?))', urllib.urlopen('http://www.freedesktop.org/wiki/Software/shared-mime-info').read()) url = search.group('url') assert url is not None nversion = search.group('version') assert nversion is not None ftype = search.group('type') assert ftype is not None sys.stdout.write('\t[OK] version %s\n' % nversion) except: sys.stdout.write('\t[ERROR] unknown version\n') exit() if cversion == nversion: sys.stdout.write('\nContenttype.py database is up to date\n') exit() try: raw_input('\nContenttype.py database updates are available from:\n%s (approx. 0.5MB)\nPress enter to continue or CTRL-C to quit now\nWARNING: this will replace contenttype.py file content IN PLACE' % url) except: exit() sys.stdout.write('\nDownloading new database:') sys.stdout.flush() fregex = re.compile('^.*/freedesktop\.org\.xml$') try: io = cStringIO.StringIO() io.write(urllib.urlopen(url).read()) sys.stdout.write('\t[OK] done\n') except Exception, e: sys.stdout.write('\t[ERROR] %s\n' % e) exit() sys.stdout.write('Installing new database:') sys.stdout.flush() try: tar = tarfile.TarFile.open(fileobj=io, mode='r:%s' % ftype) try: for content in tar.getnames(): if fregex.match(content): xml = tar.extractfile(content) break finally: tar.close() data = MIMEParser(xml) io = cStringIO.StringIO() io.write('CONTENT_TYPE = {\n') for key in sorted(data): io.write(' \'%s\': \'%s\',\n' % (key, data[key])) io.write(' }') io.seek(0) contenttype = open('contenttype.py', 'w') try: contenttype.write(re.sub(vregex, 'database version %s.\n' % nversion, re.sub('CONTENT_TYPE = \{(.|\n)+?\}', io.getvalue(), current))) finally: contenttype.close() if not current.closed: current.close() sys.stdout.write('\t\t\t[OK] done\n') except Exception, e: sys.stdout.write('\t\t\t[ERROR] %s\n' % e) web2py-2.12.3.orig/scripts/setup-web2py-fedora.sh0000664000000000000000000002341212564727264020316 0ustar rootrootecho "This script will: 1) Install modules needed to run web2py on Fedora and CentOS/RHEL 2) Install Python 2.6 to /opt and recompile wsgi if not provided 2) Install web2py in /opt/web-apps/ 3) Configure SELinux and iptables 5) Create a self signed ssl certificate 6) Setup web2py with mod_wsgi 7) Create virtualhost entries so that web2py responds for '/' 8) Restart Apache. You should probably read this script before running it. Although SELinux permissions changes have been made, further SELinux changes will be required for your personal apps. (There may also be additional changes required for the bundled apps.) As a last resort, SELinux can be disabled. A simple iptables configuration has been applied. You may want to review it to verify that it meets your needs. Finally, if you require a proxy to access the Internet, please set up your machine to do so before running this script. (author: berubejd) Press ENTER to continue...[ctrl+C to abort]" read CONFIRM #!/bin/bash ### ### Phase 0 - This may get messy. Lets work from a temporary directory ### current_dir=`pwd` if [ -d /tmp/setup-web2py/ ]; then mv /tmp/setup-web2py/ /tmp/setup-web2py.old/ fi mkdir -p /tmp/setup-web2py cd /tmp/setup-web2py ### ### Phase 1 - Requirements installation ### echo echo " - Installing packages" echo # Verify packages are up to date yum update # Install required packages yum install httpd mod_ssl mod_wsgi wget python # Verify we have at least Python 2.5 typeset -i version_major typeset -i version_minor version=`rpm --qf %{Version} -q python` version_major=`echo ${version} | awk '{split($0, parts, "."); print parts[1]}'` version_minor=`echo ${version} | awk '{split($0, parts, "."); print parts[2]}'` if [ ! ${version_major} -ge 2 -o ! ${version_minor} -ge 5 ]; then # Setup 2.6 in /opt - based upon # http://markkoberlein.com/getting-python-26-with-django-11-together-on # Check for earlier Python 2.6 install if [ -e /opt/python2.6 ]; then # Is Python already installed? RETV=`/opt/python2.6/bin/python -V > /dev/null 2>&1; echo $?` if [ ${RETV} -eq 0 ]; then python_installed='True' else mv /opt/python2.6 /opt/python2.6-old fi fi # Install Python 2.6 if it doesn't exist already if [ ! "${python_installed}" == "True" ]; then # Install requirements for the Python build yum install sqlite-devel zlib-devel mkdir -p /opt/python2.6 # Download and install wget http://www.python.org/ftp/python/2.6.4/Python-2.6.4.tgz tar -xzf Python-2.6.4.tgz cd Python-2.6.4 ./configure --prefix=/opt/python2.6 --with-threads --enable-shared --with-zlib=/usr/include make && make install cd /tmp/setup-web2py fi # Create links for Python 2.6 # even if it was previously installed just to be sure ln -s /opt/python2.6/lib/libpython2.6.so /usr/lib ln -s /opt/python2.6/lib/libpython2.6.so.1.0 /usr/lib ln -s /opt/python2.6/bin/python /usr/local/bin/python ln -s /opt/python2.6/bin/python /usr/bin/python2.6 ln -s /opt/python2.6/lib/python2.6.so /opt/python2.6/lib/python2.6/config/ # Update linker for new libraries /sbin/ldconfig # Rebuild wsgi to take advantage of Python 2.6 yum install httpd-devel cd /tmp/setup-web2py wget http://modwsgi.googlecode.com/files/mod_wsgi-3.3.tar.gz tar -xzf mod_wsgi-3.3.tar.gz cd mod_wsgi-3.3 ./configure --with-python=/usr/local/bin/python make && make install echo "LoadModule wsgi_module modules/mod_wsgi.so" > /etc/httpd/conf.d/wsgi.conf cd /tmp/setup-web2py fi ### MySQL install untested! # Install mysql packages (optional) #yum install mysql mysql-server # Enable mysql to start at boot (optional) #chkconfig --levels 235 mysqld on #service mysqld start # Configure mysql security settings (not really optional if mysql installed) #/usr/bin/mysql_secure_installation ### ### Phase 2 - Install web2py ### echo echo " - Downloading, installing, and starting web2py" echo # Create web-apps directory, if required if [ ! -d "/opt/web-apps" ]; then mkdir -p /opt/web-apps chmod 755 /opt chmod 755 /opt/web-apps fi cd /opt/web-apps # Download web2py if [ -e web2py_src.zip* ]; then rm web2py_src.zip* fi wget http://web2py.com/examples/static/web2py_src.zip unzip web2py_src.zip mv web2py/handlers/wsgihandler.py web2py/wsgihandler.py chown -R apache:apache web2py ### ### Phase 3 - Setup SELinux context ### # Set context for Python libraries if Python 2.6 installed if [ -d /opt/python2.6 ]; then cd /opt/python2.6 chcon -R -t lib_t lib/ fi # Allow http_tmp_exec required for wsgi RETV=`setsebool -P httpd_tmp_exec on > /dev/null 2>&1; echo $?` if [ ! ${RETV} -eq 0 ]; then # CentOS doesn't support httpd_tmp_exec cd /tmp/setup-web2py # Create the SELinux policy cat > httpd.te < iptables.rules < /etc/httpd/ssl/self_signed.key openssl req -new -x509 -nodes -sha1 -days 365 -key /etc/httpd/ssl/self_signed.key > /etc/httpd/ssl/self_signed.cert openssl x509 -noout -fingerprint -text < /etc/httpd/ssl/self_signed.cert > /etc/httpd/ssl/self_signed.info chmod 400 /etc/httpd/ssl/self_signed.* ### ### Phase 6 - Configure Apache ### echo echo " - Configure Apache to use mod_wsgi" echo # Create config if [ -e /etc/httpd/conf.d/welcome.conf ]; then mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.disabled fi cat > /etc/httpd/conf.d/default.conf < WSGIDaemonProcess web2py user=apache group=apache WSGIProcessGroup web2py WSGIScriptAlias / /opt/web-apps/web2py/wsgihandler.py WSGIPassAuthorization On AllowOverride None Order Allow,Deny Deny from all Allow from all AliasMatch ^/([^/]+)/static/(?:_[\d]+.[\d]+.[\d]+/)?(.*) /opt/web-apps/web2py/applications/\$1/static/\$2 Options -Indexes Order Allow,Deny Allow from all Deny from all Deny from all CustomLog /var/log/httpd/access_log common ErrorLog /var/log/httpd/error_log SSLEngine on SSLCertificateFile /etc/httpd/ssl/self_signed.cert SSLCertificateKeyFile /etc/httpd/ssl/self_signed.key WSGIProcessGroup web2py WSGIScriptAlias / /opt/web-apps/web2py/wsgihandler.py WSGIPassAuthorization On AllowOverride None Order Allow,Deny Deny from all Allow from all AliasMatch ^/([^/]+)/static/(?:_[\d]+.[\d]+.[\d]+/)?(.*) /opt/web-apps/web2py/applications/\$1/static/\$2 Options -Indexes ExpiresActive On ExpiresDefault "access plus 1 hour" Order Allow,Deny Allow from all CustomLog /var/log/httpd/access_log common ErrorLog /var/log/httpd/error_log EOF # Fix wsgi socket locations echo "WSGISocketPrefix run/wsgi" >> /etc/httpd/conf.d/wsgi.conf # Restart Apache to pick up changes service httpd restart ### ### Phase 7 - Setup web2py admin password ### echo echo " - Setup web2py admin password" echo cd /opt/web-apps/web2py sudo -u apache python -c "from gluon.main import save_password; save_password(raw_input('admin password: '),443)" ### ### Phase 8 - Verify that required services start at boot ### /sbin/chkconfig iptables on /sbin/chkconfig httpd on ### ### Phase 999 - Done! ### # Change back to original directory cd ${current_directory} echo " - Complete!" echo web2py-2.12.3.orig/scripts/rmorphans.py0000664000000000000000000000145312564727264016542 0ustar rootrootimport os import sys paths = [sys.argv[1]] paths1 = [] paths2 = [] while paths: path = paths.pop() for filename in os.listdir(path): fullname = os.path.join(path, filename) if os.path.isdir(fullname): paths.append(fullname) else: extension = filename.split('.')[-1] if extension.lower() in ('png', 'gif', 'jpg', 'jpeg', 'js', 'css'): paths1.append((filename, fullname)) if extension.lower() in ('css', 'js', 'py', 'html'): paths2.append(fullname) for filename, fullname in paths1: for otherfullname in paths2: if open(otherfullname).read().find(filename) >= 0: break else: print fullname # os.system('hg rm '+fullname) # os.system('rm '+fullname) web2py-2.12.3.orig/scripts/extract_oracle_models.py0000664000000000000000000002457112564727264021101 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- """Create web2py model (python code) to represent Oracle 11g tables. Features: * Uses Oracle's metadata tables * Detects legacy "keyed" tables (not having an "id" PK) * Connects directly to running databases, no need to do a SQL dump * Handles notnull, unique and referential constraints * Detects most common datatypes and default values * Documents alternative datatypes as comments Requeriments: * Needs Oracle cx_Oracle python connector (same as web2py) Created by Oscar Fonts, based on extract_pgsql_models by Mariano Reingart, based in turn on a script to "generate schemas from dbs" (mysql) by Alexandre Andrade """ _author__ = "Oscar Fonts " HELP = """ USAGE: extract_oracle_models db host port user passwd Call with Oracle database connection parameters, web2py model will be printed on standard output. EXAMPLE: python extract_oracle_models.py ORCL localhost 1521 user password """ # Config options DEBUG = False # print debug messages to STDERR # Constant for Field keyword parameter order (and filter): KWARGS = ('type', 'length', 'default', 'required', 'ondelete', 'notnull', 'unique', 'label', 'comment') import sys def query(conn, sql, *args): "Execute a SQL query and return rows as a list of dicts" cur = conn.cursor() ret = [] try: if DEBUG: print >> sys.stderr, "QUERY: ", sql , args cur.execute(sql, args) for row in cur: dic = {} for i, value in enumerate(row): field = cur.description[i][0] dic[field] = value if DEBUG: print >> sys.stderr, "RET: ", dic ret.append(dic) return ret except cx_Oracle.DatabaseError, exc: error, = exc.args print >> sys.stderr, "Oracle-Error-Message:", error.message finally: cur.close() def get_tables(conn): "List table names in a given schema" rows = query(conn, """SELECT TABLE_NAME FROM USER_TABLES ORDER BY TABLE_NAME""") return [row['TABLE_NAME'] for row in rows] def get_fields(conn, table): "Retrieve field list for a given table" if DEBUG: print >> sys.stderr, "Processing TABLE", table rows = query(conn, """ SELECT COLUMN_NAME, DATA_TYPE, NULLABLE AS IS_NULLABLE, CHAR_LENGTH AS CHARACTER_MAXIMUM_LENGTH, DATA_PRECISION AS NUMERIC_PRECISION, DATA_SCALE AS NUMERIC_SCALE, DATA_DEFAULT AS COLUMN_DEFAULT FROM USER_TAB_COLUMNS WHERE TABLE_NAME=:t """, table) return rows def define_field(conn, table, field, pks): "Determine field type, default value, references, etc." f = {} ref = references(conn, table, field['COLUMN_NAME']) # Foreign Keys if ref: f.update(ref) # PK & Numeric & autoincrement => id elif field['COLUMN_NAME'] in pks and \ field['DATA_TYPE'] in ('INT', 'NUMBER') and \ is_autoincrement(conn, table, field): f['type'] = "'id'" # Other data types elif field['DATA_TYPE'] in ('BINARY_DOUBLE'): f['type'] = "'double'" elif field['DATA_TYPE'] in ('CHAR','NCHAR'): f['type'] = "'string'" f['comment'] = "'Alternative types: boolean, time'" elif field['DATA_TYPE'] in ('BLOB', 'CLOB'): f['type'] = "'blob'" f['comment'] = "'Alternative types: text, json, list:*'" elif field['DATA_TYPE'] in ('DATE'): f['type'] = "'datetime'" f['comment'] = "'Alternative types: date'" elif field['DATA_TYPE'] in ('FLOAT'): f['type'] = "'float'" elif field['DATA_TYPE'] in ('INT'): f['type'] = "'integer'" elif field['DATA_TYPE'] in ('NUMBER'): f['type'] = "'bigint'" elif field['DATA_TYPE'] in ('NUMERIC'): f['type'] = "'decimal'" f['precision'] = field['NUMERIC_PRECISION'] f['scale'] = field['NUMERIC_SCALE'] or 0 elif field['DATA_TYPE'] in ('VARCHAR2','NVARCHAR2'): f['type'] = "'string'" if field['CHARACTER_MAXIMUM_LENGTH']: f['length'] = field['CHARACTER_MAXIMUM_LENGTH'] f['comment'] = "'Other possible types: password, upload'" else: f['type'] = "'blob'" f['comment'] = "'WARNING: Oracle Data Type %s was not mapped." % \ str(field['DATA_TYPE']) + " Using 'blob' as fallback.'" try: if field['COLUMN_DEFAULT']: if field['COLUMN_DEFAULT'] == "sysdate": d = "request.now" elif field['COLUMN_DEFAULT'].upper() == "T": d = "True" elif field['COLUMN_DEFAULT'].upper() == "F": d = "False" else: d = repr(eval(field['COLUMN_DEFAULT'])) f['default'] = str(d) except (ValueError, SyntaxError): pass except Exception, e: raise RuntimeError( "Default unsupported '%s'" % field['COLUMN_DEFAULT']) if not field['IS_NULLABLE']: f['notnull'] = "True" return f def is_unique(conn, table, field): "Find unique columns" rows = query(conn, """ SELECT COLS.COLUMN_NAME FROM USER_CONSTRAINTS CONS, ALL_CONS_COLUMNS COLS WHERE CONS.OWNER = COLS.OWNER AND CONS.CONSTRAINT_NAME = COLS.CONSTRAINT_NAME AND CONS.CONSTRAINT_TYPE = 'U' AND COLS.TABLE_NAME = :t AND COLS.COLUMN_NAME = :c """, table, field['COLUMN_NAME']) return rows and True or False # Returns True when a "BEFORE EACH ROW INSERT" trigger is found and: # a) it mentions the "NEXTVAL" keyword (used by sequences) # b) it operates on the given table and column # # On some (inelegant) database designs, SEQUENCE.NEXTVAL is called directly # from each "insert" statement, instead of using triggers. Such cases cannot # be detected by inspecting Oracle's metadata tables, as sequences are not # logically bound to any specific table or field. def is_autoincrement(conn, table, field): "Find auto increment fields (best effort)" rows = query(conn, """ SELECT TRIGGER_NAME FROM USER_TRIGGERS, (SELECT NAME, LISTAGG(TEXT, ' ') WITHIN GROUP (ORDER BY LINE) TEXT FROM USER_SOURCE WHERE TYPE = 'TRIGGER' GROUP BY NAME ) TRIGGER_DEFINITION WHERE TRIGGER_NAME = NAME AND TRIGGERING_EVENT = 'INSERT' AND TRIGGER_TYPE = 'BEFORE EACH ROW' AND TABLE_NAME = :t AND UPPER(TEXT) LIKE UPPER('%.NEXTVAL%') AND UPPER(TEXT) LIKE UPPER('%:NEW.' || :c || '%') """, table, field['COLUMN_NAME']) return rows and True or False def primarykeys(conn, table): "Find primary keys" rows = query(conn, """ SELECT COLS.COLUMN_NAME FROM USER_CONSTRAINTS CONS, ALL_CONS_COLUMNS COLS WHERE COLS.TABLE_NAME = :t AND CONS.CONSTRAINT_TYPE = 'P' AND CONS.OWNER = COLS.OWNER AND CONS.CONSTRAINT_NAME = COLS.CONSTRAINT_NAME """, table) return [row['COLUMN_NAME'] for row in rows] def references(conn, table, field): "Find a FK (fails if multiple)" rows1 = query(conn, """ SELECT COLS.CONSTRAINT_NAME, CONS.DELETE_RULE, COLS.POSITION AS ORDINAL_POSITION FROM USER_CONSTRAINTS CONS, ALL_CONS_COLUMNS COLS WHERE COLS.TABLE_NAME = :t AND COLS.COLUMN_NAME = :c AND CONS.CONSTRAINT_TYPE = 'R' AND CONS.OWNER = COLS.OWNER AND CONS.CONSTRAINT_NAME = COLS.CONSTRAINT_NAME """, table, field) if len(rows1) == 1: rows2 = query(conn, """ SELECT COLS.TABLE_NAME, COLS.COLUMN_NAME FROM USER_CONSTRAINTS CONS, ALL_CONS_COLUMNS COLS WHERE CONS.CONSTRAINT_NAME = :k AND CONS.R_CONSTRAINT_NAME = COLS.CONSTRAINT_NAME ORDER BY COLS.POSITION ASC """, rows1[0]['CONSTRAINT_NAME']) row = None if len(rows2) > 1: row = rows2[int(rows1[0]['ORDINAL_POSITION']) - 1] keyed = True if len(rows2) == 1: row = rows2[0] keyed = False if row: if keyed: # THIS IS BAD, DON'T MIX "id" and primarykey!!! ref = {'type': "'reference %s.%s'" % (row['TABLE_NAME'], row['COLUMN_NAME'])} else: ref = {'type': "'reference %s'" % (row['TABLE_NAME'],)} if rows1[0]['DELETE_RULE'] != "NO ACTION": ref['ondelete'] = repr(rows1[0]['DELETE_RULE']) return ref elif rows2: raise RuntimeError("Unsupported foreign key reference: %s" % str(rows2)) elif rows1: raise RuntimeError("Unsupported referential constraint: %s" % str(rows1)) def define_table(conn, table): "Output single table definition" fields = get_fields(conn, table) pks = primarykeys(conn, table) print "db.define_table('%s'," % (table, ) for field in fields: fname = field['COLUMN_NAME'] fdef = define_field(conn, table, field, pks) if fname not in pks and is_unique(conn, table, field): fdef['unique'] = "True" if fdef['type'] == "'id'" and fname in pks: pks.pop(pks.index(fname)) print " Field('%s', %s)," % (fname, ', '.join(["%s=%s" % (k, fdef[k]) for k in KWARGS if k in fdef and fdef[k]])) if pks: print " primarykey=[%s]," % ", ".join(["'%s'" % pk for pk in pks]) print " migrate=migrate)" print def define_db(conn, db, host, port, user, passwd): "Output database definition (model)" dal = 'db = DAL("oracle://%s/%s@%s:%s/%s", pool_size=10)' print dal % (user, passwd, host, port, db) print print "migrate = False" print for table in get_tables(conn): define_table(conn, table) if __name__ == "__main__": if len(sys.argv) < 6: print HELP else: # Parse arguments from command line: db, host, port, user, passwd = sys.argv[1:6] # Make the database connection (change driver if required) import cx_Oracle dsn = cx_Oracle.makedsn(host, port, db) cnn = cx_Oracle.connect(user, passwd, dsn) # Start model code generation: define_db(cnn, db, host, port, user, passwd) web2py-2.12.3.orig/scripts/writedoc.py0000664000000000000000000000275712564727264016361 0ustar rootrootimport os import sys import glob sys.path.append(os.path.join(os.path.split(__file__)[0],'..')) from gluon.html import CODE def main(path): models = glob.glob(os.path.join(path,'models','*.py')) controllers = glob.glob(os.path.join(path,'controllers','*.py')) views = glob.glob(os.path.join(path,'views','*.html')) modules = glob.glob(os.path.join(path,'modules','*.py')) models.sort() controllers.sort() views.sort() modules.sort() print '' print '

Models

' for filename in models: print '

%s

' % filename[len(path):] print CODE(open(filename).read(),language='web2py').xml() print '

Layout Views

' for filename in views: print '

%s

' % filename[len(path):] print CODE(open(filename).read(),language='html').xml() print '

Controllers and Views

' for filename in controllers: print '

%s

' % filename[len(path):] print CODE(open(filename).read(),language='web2py') views = glob.glob(os.path.join(path,'views','*','*.html')) views.sort() for filename in views: print '

%s

' % filename[len(path):] print CODE(open(filename).read(),language='html').xml() print '

Modules

' for filename in modules: print '

%s

' % filename[len(path):] print CODE(open(filename).read(),language='python').xml() print '' if __name__=='__main__': main(sys.argv[1]) web2py-2.12.3.orig/scripts/setup-web2py-nginx-uwsgi-on-centos.sh0000664000000000000000000002162712564727264023246 0ustar rootroot#!/bin/bash # ------------------------------------------------------------------- # Description : Installation and basic configuration of web2py, # uWSGI, andNGINX. # in CentOS 5.x GNU/Linux # Usage : Copy the script in /home/username and run it as root, # you may need to allow execution (chmod +x) # # WARNING: This script was modified to install compiled # versions of Python and other packages that may be # available at your Centos package repository. # This change was made in order to get the latest # stable libraries available for avoiding compatibility # # A bug was reported for the 2.7.3 version of python # here http://bugs.python.org/issue14572 # in case you choose to change to VERSION=2.7 # (see below) mind that the automatic patch applied # could not work for your environment. By default, # Python 2.6 is installed. # # It was originally posted in this web2py-users group # thread: https://groups.google.com/forum/?fromgroups# # !topic/web2py/O4c4Jfr18tM # # There are lots of subtleties of ownership, and one # has to take care when installing python 2.6 not to # stop the systems python2.4 from working. # # NOTE: The only thing that should need changing for # each installation is the $BASEARCH (base # architecture) # of the machine. This is determined by doing uname -i. # This is needed for the nginx installation. # # File : setup-web2py-nginx-uwsgi-on-centos.sh # Author : Peter Hutchinson # Modified by : Alan Etkin # Email : spametki@gmail.com # Copyright : web2py # Date : 2013-01-28 # Disclaimers : This script is provided "as is", without warranty of # any kind. # Licence : BSD # ------------------------------------------------------------------- # Retrieve base architecture BASEARCH=$(uname -i) # Get Web2py Admin Password echo -e "Enter a password for web2py admin app: \c " read PW echo 'Install development tools (it should take a while)' yum install gcc gdbm-devel readline-devel ncurses-devel zlib-devel \ bzip2-devel sqlite-devel db4-devel openssl-devel tk-devel bluez-libs-devel #================================= # You can change Python and uWSGI options # to fit your deployment needs. # Python options PREFIX=2.6 VERSION=2.6.8 # uWSGI options version=uwsgi-1.2.4 echo "Install python $PREFIX without overwriting python 2.4 (no, really, this will take a while too)" mkdir ~/src chmod 777 ~/src cd ~/src wget http://www.python.org/ftp/python/$VERSION/Python-$VERSION.tgz tar xvfz Python-$VERSION.tgz cd Python-$VERSION if [ "$VERSION" == "2.7.3" ]; then echo "Applying patch for sqlite3 bug from post http://bugs.python.org/msg161076" curl -sk https://raw.github.com/gist/2727063/ | patch -p1 fi ./configure --prefix=/opt/python$PREFIX --with-threads --enable-shared make #The altinstall ensures that python2.4 is left okay make altinstall echo "/opt/python$PREFIX/lib">/etc/ld.so.conf.d/opt-python$PREFIX.conf ldconfig #create alias so that python 2.x can be run with 'python2.x' alias -p python$PREFIX="/opt/python$/bin/python$PREFIX" ln -s /opt/python$PREFIX/bin/python$PREFIX /usr/bin/python$PREFIX echo 'Install uwsgi' $version cd ~ curl -O http://projects.unbit.it/downloads/$version.tar.gz tar zxvf $version.tar.gz mkdir /opt/uwsgi-python cp -R ./$version/* /opt/uwsgi-python cd /opt/uwsgi-python echo "build using python $PREFIX" python$PREFIX uwsgiconfig.py --build useradd uwsgi echo "Create and own uwsgi log" # Note this log will need emptying from time to time touch /var/log/uwsgi.log chown uwsgi /var/log/uwsgi.log echo "Install web2py" cd /opt mkdir ./web-apps cd ./web-apps curl -O http://www.web2py.com/examples/static/web2py_src.zip unzip web2py_src.zip mv web2py/handlers/wsgihandler.py web2py/wsgihandler.py echo "Set the ownership for web2py application to uwsgi" chown -R uwsgi /opt/web-apps/web2py cd /opt/web-apps/web2py chmod -R u+rwx ./applications echo "Now creating the admin password and creating the scaffolding app package" sudo -u uwsgi python$PREFIX -c "from gluon.main import save_password;from gluon import widget;save_password('$PW',443);widget.console()" echo "Now install nginx" cd /etc/yum.repos.d echo "[nginx]">nginx.repo echo "baseurl=http://nginx.org/packages/centos/5/$BASEARCH/">>nginx.repo echo "gpgcheck=0">>nginx.repo echo "enabled=1">>nginx.repo yum install nginx echo "We don't want the defaults, so remove them" cd /etc/nginx/conf.d mv default.conf default.conf.o mv example_ssl.conf example_ssl.conf.o echo " The following configuration files are also needed The options for uwsgi are in the following file. Other options could be included. " echo "uwsgi_for_nginx.conf" echo " [uwsgi] uuid=uwsgi pythonpath = /opt/web-apps/web2py module = wsgihandler socket=127.0.0.1:9001 harakiri 60 harakiri-verbose enable-threads daemonize = /var/log/uwsgi.log " > /opt/uwsgi-python/uwsgi_for_nginx.conf chmod 755 /opt/uwsgi-python/uwsgi_for_nginx.conf echo " The next configuration file is for nginx, and goes in /etc/nginx/conf.d It serves the static directory of applications directly. I have not set up ssl because I access web2py admin by using ssh tunneling and the web2py rocket server. It should be straightforward to set up the ssl server however. " echo "web2py.conf" echo ' server { listen 80; server_name $hostname; location ~* /(\w+)/static(?:/_[\d]+\.[\d]+\.[\d]+)?/(.*)$ { alias /opt/web-apps/web2py/applications/$1/static/$2; expires max; } location / { uwsgi_pass 127.0.0.1:9001; include uwsgi_params; } } server { listen 443; server_name $hostname; ssl on; ssl_certificate /etc/nginx/ssl/web2py.cert; ssl_certificate_key /etc/nginx/ssl/web2py.key; location / { uwsgi_pass 127.0.0.1:9001; include uwsgi_params; uwsgi_param UWSGI_SCHEME $scheme; } location ~* /(\w+)/static(?:/_[\d]+\.[\d]+\.[\d]+)?/(.*)$ { alias /opt/web-apps/web2py/applications/$1/static/$2; expires max; } } ' > /etc/nginx/conf.d/web2py.conf echo "Auto-signed ssl certs" mkdir /etc/nginx/ssl echo "creating a self signed certificate" echo "==================================" openssl genrsa 1024 > /etc/nginx/ssl/web2py.key chmod 400 /etc/nginx/ssl/web2py.key openssl req -new -x509 -nodes -sha1 -days 365 -key /etc/nginx/ssl/web2py.key > /etc/nginx/ssl/web2py.cert openssl x509 -noout -fingerprint -text < /etc/nginx/ssl/web2py.cert > /etc/nginx/ssl/web2py.info echo "uwsgi as service" echo ' #!/bin/bash # uwsgi - Use uwsgi to run python and wsgi web apps. # # chkconfig: - 85 15 # description: Use uwsgi to run python and wsgi web apps. # processname: uwsgi # author: Roman Vasilyev # Source function library. . /etc/rc.d/init.d/functions ########################### PATH=/opt/uwsgi-python:/sbin:/bin:/usr/sbin:/usr/bin PYTHONPATH=/home/www-data/web2py MODULE=wsgihandler PROG=/opt/uwsgi-python/uwsgi OWNER=uwsgi NAME=uwsgi DESC=uwsgi DAEMON_OPTS="-s 127.0.0.1:9001 -M 4 -t 30 -A 4 -p 16 -b 32768 -d \ /var/log/$NAME.log --pidfile /var/run/$NAME.pid --uid $OWNER \ --ini-paste /opt/uwsgi-python/uwsgi_for_nginx.conf" ############################## [ -f /etc/sysconfig/uwsgi ] && . /etc/sysconfig/uwsgi lockfile=/var/lock/subsys/uwsgi start () { echo -n "Starting $DESC: " daemon $PROG $DAEMON_OPTS retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval } stop () { echo -n "Stopping $DESC: " killproc $PROG retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval } reload () { echo "Reloading $NAME" killproc $PROG -HUP RETVAL=$? echo } restart () { stop start } rh_status () { status $PROG } rh_status_q() { rh_status >/dev/null 2>&1 } case "$1" in start) rh_status_q && exit 0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart|force-reload) $1 ;; reload) rh_status_q || exit 7 $1 ;; status) rh_status ;; *) echo "Usage: $0 {start|stop|restart|reload|force-reload|status}" >&2 exit 2 ;; esac exit 0 ' > /etc/init.d/uwsgi chmod 755 /etc/init.d/uwsgi chkconfig --add uwsgi chkconfig uwsgi on echo " You can test it with service uwsgi start and stop it similarly. Nginx has automatically been set up as a service if you want to start it run service nginx start You should find the web2py welcome app will be displayed at your web address. As they are both services, they should automatically start on a system reboot. If you already had a server running, such as apache, you would need to stop that and turn its service off before running nginx. " echo "Turning off apache service" service httpd stop chkconfig httpd off cd ~ echo " Installation complete. You might want to restart your server running reboot as superuser " web2py-2.12.3.orig/scripts/setup-web2py-nginx-uwsgi-opensuse.sh0000664000000000000000000001416712564727264023203 0ustar rootroot#!/bin/bash echo 'setup-web2py-nginx-uwsgi-opensuse.sh' echo 'Requires OpenSUSE 12.3 32Bits and installs Nginx + uWSGI + Web2py' # Get Web2py Admin Password echo -e "Web2py Admin Password: \c " read PW zypper clean && zypper refresh && zypper up zypper in -y nginx python-xml python-pip unzip sudo zypper in -y gcc python-devel libxml2-devel python-pip unzip pip install --upgrade pip PIPPATH=`which pip` $PIPPATH install --upgrade uwsgi # Prepare folders for uwsgi mkdir /etc/uwsgi mkdir /var/log/uwsgi usermod -G www nginx mkdir -p /etc/nginx/vhosts.d/ mkdir -p /etc/nginx/ssl/ cd /etc/nginx/ssl openssl genrsa 1024 > web2py.key chmod 400 web2py.key openssl req -new -x509 -nodes -sha1 -days 1780 -key web2py.key > web2py.crt openssl x509 -noout -fingerprint -text < web2py.crt > web2py.info echo 'server { listen 80; server_name $hostname; #to enable correct use of response.static_version location ~* /(\w+)/static(?:/_[\d]+\.[\d]+\.[\d]+)?/(.*)$ { alias /srv/www/web2py/applications/$1/static/$2; expires max; } location / { #uwsgi_pass 127.0.0.1:9001; uwsgi_pass unix:///tmp/web2py.socket; include /etc/nginx/uwsgi_params; uwsgi_param UWSGI_SCHEME $scheme; uwsgi_param SERVER_SOFTWARE nginx/$nginx_version; } } server { listen 443 default_server ssl; server_name $hostname; ssl_certificate /etc/nginx/ssl/web2py.crt; ssl_certificate_key /etc/nginx/ssl/web2py.key; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_ciphers ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA; ssl_protocols SSLv3 TLSv1; keepalive_timeout 70; location ~* /(\w+)/static(?:/_[\d]+\.[\d]+\.[\d]+)?/(.*)$ { alias /srv/www/web2py/applications/$1/static/$2; expires max; } location / { #uwsgi_pass 127.0.0.1:9001; uwsgi_pass unix:///tmp/web2py.socket; include /etc/nginx/uwsgi_params; uwsgi_param UWSGI_SCHEME $scheme; uwsgi_param SERVER_SOFTWARE nginx/$nginx_version; } }' >/etc/nginx/vhosts.d/web2py.conf # Create configuration file /etc/uwsgi/web2py.xml echo ' /tmp/web2py.socket /srv/www/web2py/ /=wsgihandler:application 4 60 8 1 /tmp/stats.socket 2000 512 256 192 nginx www 0 0 -1 -1 -1 python /srv/www/web2py/web2py.py -Q -S welcome -M -R scripts/sessions2trash.py -A -o ' >/etc/uwsgi/web2py.xml cd /srv/www/ wget http://web2py.com/examples/static/web2py_src.zip unzip web2py_src.zip rm web2py_src.zip mv web2py/handlers/wsgihandler.py web2py/wsgihandler.py chown -R nginx:www web2py cd /srv/www/web2py sudo -u nginx python -c "from gluon.main import save_password; save_password('$PW',443)" ## Daemons /start/stop echo '#!/bin/sh # Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany. # # Author: James Oakley # # /etc/init.d/uwsgi # and its symbolic link # /(usr/)sbin/rcuwsgi # # LSB compatible service control script; see http://www.linuxbase.org/spec/ # ### BEGIN INIT INFO # Provides: uwsgi # Required-Start: $syslog $remote_fs # Should-Start: $time ypbind smtp # Required-Stop: $syslog $remote_fs # Should-Stop: ypbind smtp # Default-Start: 3 5 # Default-Stop: 0 1 2 6 # Short-Description: Application Container Server for Networked/Clustered Web Applications # Description: Application Container Server for Networked/Clustered Web Applications ### END INIT INFO # Check for missing binaries (stale symlinks should not happen) UWSGI_BIN=/usr/bin/uwsgi test -x $UWSGI_BIN || { echo "$UWSGI_BIN not installed"; if [ "$1" = "stop" ]; then exit 0; else exit 5; fi; } UWSGI_EMPEROR_MODE=true UWSGI_VASSALS="/etc/uwsgi/" UWSGI_OPTIONS="--logto /var/log/uwsgi/uwsgi.log" UWSGI_OPTIONS="$UWSGI_OPTIONS --autoload" if [ "$UWSGI_EMPEROR_MODE" = "true" ] ; then UWSGI_OPTIONS="$UWSGI_OPTIONS --emperor $UWSGI_VASSALS" fi . /etc/rc.status rc_reset case "$1" in start) echo -n "Starting uWSGI " /sbin/startproc $UWSGI_BIN $UWSGI_OPTIONS rc_status -v ;; stop) echo -n "Shutting down uWSGI " /sbin/killproc $UWSGI_BIN rc_status -v ;; try-restart|condrestart) if test "$1" = "condrestart"; then echo "${attn} Use try-restart ${done}(LSB)${attn} rather than condrestart ${warn}(RH)${norm}" fi $0 status if test $? = 0; then $0 restart else rc_reset fi rc_status ;; restart) $0 stop $0 start rc_status ;; force-reload) echo -n "Reload service uWSGI " /sbin/killproc -HUP $UWSGI_BIN rc_status -v ;; reload) echo -n "Reload service uWSGI " /sbin/killproc -HUP $UWSGI_BIN rc_status -v ;; status) echo -n "Checking for service uWSGI " /sbin/checkproc $UWSGI_BIN rc_status -v ;; probe) echo -n "uWSGI does not support probe " rc_failed 3 rc_status -v ;; *) echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe}" exit 1 ;; esac rc_exit '> /etc/init.d/uwsgi chmod +x /etc/init.d/uwsgi /etc/init.d/uwsgi start /etc/init.d/nginx restart chkconfig --add uwsgi chkconfig --add nginx ## you can reload uwsgi with #/etc/init.d/uwsgi restart ## to reload web2py only (without restarting uwsgi) # touch /etc/uwsgi/web2py.xml web2py-2.12.3.orig/scripts/extract_mysql_models.py0000664000000000000000000001061412564727264020772 0ustar rootroot''' Create the web2py code needed to access your mysql legacy db. To make this work all the legacy tables you want to access need to have an "id" field. This plugin needs: mysql mysqldump installed and globally available. Under Windows you will probably need to add the mysql executable directory to the PATH variable, you will also need to modify mysql to mysql.exe and mysqldump to mysqldump.exe below. Just guessing here :) Access your tables with: legacy_db(legacy_db.mytable.id>0).select() If the script crashes this is might be due to that fact that the data_type_map dictionary below is incomplete. Please complete it, improve it and continue. Created by Falko Krause, minor modifications by Massimo Di Pierro and Ron McOuat ''' import subprocess import re import sys data_type_map = dict( varchar='string', int='integer', integer='integer', tinyint='integer', smallint='integer', mediumint='integer', bigint='integer', float='double', double='double', char='string', decimal='integer', date='date', #year = 'date', time='time', timestamp='datetime', datetime='datetime', binary='blob', blob='blob', tinyblob='blob', mediumblob='blob', longblob='blob', text='text', tinytext='text', mediumtext='text', longtext='text', ) def mysql(database_name, username, password): p = subprocess.Popen(['mysql', '--user=%s' % username, '--password=%s' % password, '--execute=show tables;', database_name], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) sql_showtables, stderr = p.communicate() tables = [re.sub( '\|\s+([^\|*])\s+.*', '\1', x) for x in sql_showtables.split()[1:]] connection_string = "legacy_db = DAL('mysql://%s:%s@localhost/%s')" % ( username, password, database_name) legacy_db_table_web2py_code = [] for table_name in tables: #get the sql create statement p = subprocess.Popen(['mysqldump', '--user=%s' % username, '--password=%s' % password, '--skip-add-drop-table', '--no-data', database_name, table_name], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) sql_create_stmnt, stderr = p.communicate() if 'CREATE' in sql_create_stmnt: # check if the table exists #remove garbage lines from sql statement sql_lines = sql_create_stmnt.split('\n') sql_lines = filter( lambda x: not(x in ('','\r') or x[:2] in ('--','/*')), sql_lines) #generate the web2py code from the create statement web2py_table_code = '' table_name = re.search( 'CREATE TABLE .(\S+). \(', sql_lines[0]).group(1) fields = [] for line in sql_lines[1:-1]: if re.search('KEY', line) or re.search('PRIMARY', line) or re.search(' ID', line) or line.startswith(')'): continue hit = re.search('(\S+)\s+(\S+)(,| )( .*)?', line) if hit is not None: name, d_type = hit.group(1), hit.group(2) d_type = re.sub(r'(\w+)\(.*', r'\1', d_type) name = re.sub('`', '', name) web2py_table_code += "\n Field('%s','%s')," % ( name, data_type_map[d_type]) web2py_table_code = "legacy_db.define_table('%s',%s\n migrate=False)" % (table_name, web2py_table_code) legacy_db_table_web2py_code.append(web2py_table_code) #---------------------------------------- #write the legacy db to file legacy_db_web2py_code = connection_string + "\n\n" legacy_db_web2py_code += "\n\n#--------\n".join( legacy_db_table_web2py_code) return legacy_db_web2py_code regex = re.compile('(.*?):(.*?)@(.*)') if len(sys.argv) < 2 or not regex.match(sys.argv[1]): print 'USAGE:\n\n extract_mysql_models.py username:password@data_basename\n\n' else: m = regex.match(sys.argv[1]) print mysql(m.group(3), m.group(1), m.group(2)) web2py-2.12.3.orig/scripts/autoroutes.py0000664000000000000000000001164312564727264016745 0ustar rootroot# -*- coding: utf-8 -*- ''' autoroutes writes routes for you based on a simpler routing configuration file called routes.conf. Example: ----- BEGIN routes.conf------- 127.0.0.1 /examples/default domain1.com /app1/default domain2.com /app2/default domain3.com /app3/default ----- END ---------- It maps a domain (the left-hand side) to an app (one app per domain), and shortens the URLs for the app by removing the listed path prefix. That means: http://domain1.com/index is mapped to /app1/default/index http://domain2.com/index is mapped to /app2/default/index It preserves admin, appadmin, static files, favicon.ico and robots.txt: http://domain1.com/favicon.ico /welcome/static/favicon.ico http://domain1.com/robots.txt /welcome/static/robots.txt http://domain1.com/admin/... /admin/... http://domain1.com/appadmin/... /app1/appadmin/... http://domain1.com/static/... /app1/static/... and vice-versa. To use, cp scripts/autoroutes.py routes.py and either edit the config string below, or set config = "" and edit routes.conf ''' config = ''' 127.0.0.1 /examples/default domain1.com /app1/default domain2.com /app2/default domain3.com /app3/defcon3 ''' if not config.strip(): try: config_file = open('routes.conf', 'r') try: config = config_file.read() finally: config_file.close() except: config = '' def auto_in(apps): routes = [ ('/robots.txt', '/welcome/static/robots.txt'), ('/favicon.ico', '/welcome/static/favicon.ico'), ('/admin$anything', '/admin$anything'), ] for domain, path in [x.strip().split() for x in apps.split('\n') if x.strip() and not x.strip().startswith('#')]: if not path.startswith('/'): path = '/' + path if path.endswith('/'): path = path[:-1] app = path.split('/')[1] routes += [ ('.*:https?://(.*\.)?%s:$method /' % domain, '%s' % path), ('.*:https?://(.*\.)?%s:$method /static/$anything' % domain, '/%s/static/$anything' % app), ('.*:https?://(.*\.)?%s:$method /appadmin/$anything' % domain, '/%s/appadmin/$anything' % app), ('.*:https?://(.*\.)?%s:$method /$anything' % domain, '%s/$anything' % path), ] return routes def auto_out(apps): routes = [] for domain, path in [x.strip().split() for x in apps.split('\n') if x.strip() and not x.strip().startswith('#')]: if not path.startswith('/'): path = '/' + path if path.endswith('/'): path = path[:-1] app = path.split('/')[1] routes += [ ('/%s/static/$anything' % app, '/static/$anything'), ('/%s/appadmin/$anything' % app, '/appadmin/$anything'), ('%s/$anything' % path, '/$anything'), ] return routes routes_in = auto_in(config) routes_out = auto_out(config) def __routes_doctest(): ''' Dummy function for doctesting autoroutes.py. Use filter_url() to test incoming or outgoing routes; filter_err() for error redirection. filter_url() accepts overrides for method and remote host: filter_url(url, method='get', remote='0.0.0.0', out=False) filter_err() accepts overrides for application and ticket: filter_err(status, application='app', ticket='tkt') >>> filter_url('http://domain1.com/favicon.ico') 'http://domain1.com/welcome/static/favicon.ico' >>> filter_url('https://domain2.com/robots.txt') 'https://domain2.com/welcome/static/robots.txt' >>> filter_url('http://domain3.com/fcn') 'http://domain3.com/app3/defcon3/fcn' >>> filter_url('http://127.0.0.1/fcn') 'http://127.0.0.1/examples/default/fcn' >>> filter_url('HTTP://DOMAIN.COM/app/ctr/fcn') 'http://domain.com/app/ctr/fcn' >>> filter_url('http://domain.com/app/ctr/fcn?query') 'http://domain.com/app/ctr/fcn?query' >>> filter_url('http://otherdomain.com/fcn') 'http://otherdomain.com/fcn' >>> regex_filter_out('/app/ctr/fcn') '/app/ctr/fcn' >>> regex_filter_out('/app1/ctr/fcn') '/app1/ctr/fcn' >>> filter_url('https://otherdomain.com/app1/default/fcn', out=True) '/fcn' >>> filter_url('http://otherdomain.com/app2/ctr/fcn', out=True) '/app2/ctr/fcn' >>> filter_url('http://domain1.com/app1/default/fcn?query', out=True) '/fcn?query' >>> filter_url('http://domain2.com/app3/defcon3/fcn#anchor', out=True) '/fcn#anchor' ''' pass if __name__ == '__main__': try: import gluon.main except ImportError: import sys import os os.chdir(os.path.dirname(os.path.dirname(__file__))) sys.path.append(os.path.dirname(os.path.dirname(__file__))) import gluon.main from gluon.rewrite import regex_select, load, filter_url, regex_filter_out regex_select() # use base routing parameters load(routes=__file__) # load this file import doctest doctest.testmod() web2py-2.12.3.orig/scripts/web2py.ubuntu.sh0000775000000000000000000001437312564727264017254 0ustar rootroot#! /bin/sh ### BEGIN INIT INFO # startup script for Ubuntu and Debian Linux servers # # To use this file # cp ubuntu.sh /etc/init.d/web2py # # To automatitcally start at reboot # sudo update-rc.d web2py defaults # # Provides: web2py # Required-Start: $local_fs $remote_fs # Required-Stop: $local_fs $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: S 0 1 6 # Short-Description: web2py initscript # Description: This file starts up the web2py server. ### END INIT INFO # Author: Mark Moore PATH=/usr/sbin:/usr/bin:/sbin:/bin DESC="Web Framework" NAME=web2py PIDDIR=/var/run/$NAME PIDFILE=$PIDDIR/$NAME.pid SCRIPTNAME=/etc/init.d/$NAME DAEMON=/usr/bin/python DAEMON_DIR=/usr/lib/$NAME DAEMON_ARGS="web2py.py --password= --pid_filename=$PIDFILE" DAEMON_USER=web2py # Exit if the package is not installed [ -x "$DAEMON" ] || exit 0 # Read configuration variable file if it is present [ -r /etc/default/$NAME ] && . /etc/default/$NAME # Load the VERBOSE setting and other rcS variables [ -f /etc/default/rcS ] && . /etc/default/rcS # Define LSB log_* functions. # Depend on lsb-base (>= 3.0-6) to ensure that this file is present. . /lib/lsb/init-functions # # Function that starts the daemon/service # do_start() { # Return # 0 if daemon has been started # 1 if daemon was already running # 2 if daemon could not be started # The PIDDIR should normally be created during installation. This # fixes things just in case. [ -d $PIDDIR ] || mkdir -p $PIDDIR [ -n "$DAEMON_USER" ] && chown --recursive $DAEMON_USER $PIDDIR # Check to see if the daemon is already running. start-stop-daemon --stop --test --quiet --pidfile $PIDFILE \ && return 1 start-stop-daemon --start --quiet -m --pidfile $PIDFILE \ ${DAEMON_USER:+--chuid $DAEMON_USER} --chdir $DAEMON_DIR \ --background --exec $DAEMON -- $DAEMON_ARGS \ || return 2 return 0; } # # Function that stops the daemon/service # do_stop() { # Return # 0 if daemon has been stopped # 1 if daemon was already stopped # 2 if daemon could not be stopped # other if a failure occurred start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE RETVAL=$? # Many daemons don't delete their pidfiles when they exit. rm -f $PIDFILE return "$RETVAL" } # # Function that restarts the daemon/service # do_restart() { # Return # 0 if daemon was (re-)started # 1 if daemon was not strated or re-started do_stop case "$?" in 0|1) do_start case "$?" in 0) RETVAL=0 ;; 1) RETVAL=1 ;; # Old process is still running *) RETVAL=1 ;; # Failed to start esac ;; *) RETVAL=1 ;; # Failed to stop esac return "$RETVAL" } # # Function that sends a SIGHUP to the daemon/service # do_reload() { # # If the daemon can reload its configuration without # restarting (for example, when it is sent a SIGHUP), # then implement that here. # start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE return 0 } # # Function that queries the status of the daemon/service # do_status() { # Return # 0 if daemon is responding and OK # 1 if daemon is not responding, but PIDFILE exists # 2 if daemon is not responding, but LOCKFILE exists # 3 if deamon is not running # 4 if daemon status is unknown # Check to see if the daemon is already running. start-stop-daemon --stop --test --quiet --pidfile $PIDFILE \ && return 0 [ -f $PIDFILE ] && return 1 return 3 } case "$1" in start) [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" do_start RETVAL=$? [ "$VERBOSE" != no ] && case "$RETVAL" in 0|1) log_end_msg 0 ;; *) log_end_msg 1 ;; esac exit "$RETVAL" ;; stop) [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" do_stop RETVAL=$? [ "$VERBOSE" != no ] && case "$RETVAL" in 0|1) log_end_msg 0 ;; *) log_end_msg 1 ;; esac exit "$RETVAL" ;; #reload|force-reload) # # If do_reload() is not implemented then leave this commented out # and leave 'force-reload' as an alias for 'restart'. # #[ "$VERBOSE" != no ] && log_daemon_msg "Reloading $DESC" "$NAME" #do_reload #RETVAL=$? #[ "$VERBOSE" != no ] && log_end_msg $? #exit "$RETVAL" #;; restart|force-reload) # # If the "reload" option is implemented then remove the # 'force-reload' alias # [ "$VERBOSE" != no ] && log_daemon_msg "Restarting $DESC" "$NAME" do_restart RETVAL=$? [ "$VERBOSE" != no ] && log_end_msg "$RETVAL" exit "$RETVAL" ;; status) do_status RETVAL=$? [ "$VERBOSE" != no ] && case "$RETVAL" in 0) log_success_msg "$NAME is running" ;; *) log_failure_msg "$NAME is not running" ;; esac exit "$RETVAL" ;; *) echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload|status}" >&2 exit 3 ;; esac : # This was based off /etc/init.d/skeleton from the Ubuntu 8.04 Hardy release. # (md5sum: da0162012b6a916bdbd4e2580282af78). If we notice that changes, we # should re-examine things. # The configuration at the very top seems to be documented as part of the # Linux Standard Base (LSB) Specification. See section 20.6 Facility Names # in particular. This is also where I got the spec for the status parm. # References: # http://refspecs.linux-foundation.org/LSB_3.2.0/LSB-Core-generic/LSB-Core-generic.pdf # Debian Policy SysV init: http://www.debian.org/doc/debian-policy/ch-opersys.html#s-sysvinit # Examine files in /usr/share/doc/sysv-rc/ web2py-2.12.3.orig/scripts/setup-web2py-heroku.sh0000664000000000000000000000066112564727264020354 0ustar rootrootread -p "Choose your admin password?" passwd sudo pip install virtualenv virtualenv venv --distribute source venv/bin/activate sudo pip install psycopg2 pip freeze > requirements.txt echo "web: python web2py.py -a '$passwd' -i 0.0.0.0 -p \$PORT" > Procfile git init git add . git add Procfile git commit -a -m "first commit" heroku create git push heroku master heroku addons:add heroku-postgresql:dev heroku scale web=1 heroku open web2py-2.12.3.orig/scripts/make_min_web2py.py0000664000000000000000000000501412564727264017576 0ustar rootrootUSAGE = """ from web2py main folder python scripts/make_min_web2py.py /path/to/minweb2py it will mkdir minweb2py and build a minimal web2py installation - no admin, no examples, one line welcome - no scripts - drops same rarely used contrib modules - more modules could be dropped but minimal difference """ # files to include from top level folder (default.py will be rebuilt) REQUIRED = """ VERSION web2py.py anyserver.py applications/__init__.py applications/welcome/controllers/default.py handlers/fcgihandler.py handlers/gaehandler.py handlers/wsgihandler.py """ # files and folders to exclude from gluon folder (comment with # if needed) IGNORED = """ gluon/contrib/websocket_messaging.py gluon/contrib/feedparser.py gluon/contrib/generics.py gluon/contrib/gql.py gluon/contrib/populate.py gluon/contrib/sms_utils.py gluon/contrib/spreadsheet.py gluon/tests/ gluon/contrib/markdown/ gluon/contrib/pyfpdf/ gluon/contrib/pymysql/ gluon/contrib/pyrtf/ gluon/contrib/pysimplesoap/ """ import sys import os import shutil import glob def main(): global REQUIRED, IGNORED if len(sys.argv) < 2: print USAGE # make target folder target = sys.argv[1] os.mkdir(target) # change to os specificsep REQUIRED = REQUIRED.replace('/', os.sep) IGNORED = IGNORED.replace('/', os.sep) # make a list of all files to include files = [x.strip() for x in REQUIRED.split('\n') if x and not x[0] == '#'] ignore = [x.strip() for x in IGNORED.split('\n') if x and not x[0] == '#'] def accept(filename): for p in ignore: if filename.startswith(p): return False return True pattern = os.path.join('gluon', '*.py') while True: newfiles = [x for x in glob.glob(pattern) if accept(x)] if not newfiles: break files += newfiles pattern = os.path.join(pattern[:-3], '*.py') # copy all files, make missing folder, build default.py files.sort() defaultpy = os.path.join( 'applications', 'welcome', 'controllers', 'default.py') for f in files: dirs = f.split(os.path.sep) for i in range(1, len(dirs)): try: os.mkdir(target + os.sep + os.path.join(*dirs[:i])) except OSError: pass if f == defaultpy: open(os.path.join( target, f), 'w').write('def index(): return "hello"\n') else: shutil.copyfile(f, os.path.join(target, f)) if __name__ == '__main__': main() web2py-2.12.3.orig/scripts/cleanjs.py0000664000000000000000000000065212564727264016150 0ustar rootrootimport re def cleanjs(text): text = re.sub('\s*}\s*', '\n}\n', text) text = re.sub('\s*{\s*', ' {\n', text) text = re.sub('\s*;\s*', ';\n', text) text = re.sub('\s*,\s*', ', ', text) text = re.sub('\s*(?P
[\+\-\*/\=]+)\s*', ' \g ', text) lines = text.split('\n') text = '' indent = 0 for line in lines: rline = line.strip() if rline: pass return text web2py-2.12.3.orig/scripts/setup-web2py-nginx-uwsgi-centos7.sh0000664000000000000000000001502512564727264022716 0ustar rootroot#!/bin/bash # This script will install web2py with nginx+uwsgi on centos 7 # This script is based on excellent tutorial by Justin Ellingwood on # https://www.digitalocean.com/community/tutorials/how-to-deploy-web2py-python-applications-with-uwsgi-and-nginx-on-centos-7 # # Phase 1: First, let's ask a few things # read -p "Enter username under which web2py will be installed [web2py]: " USERNAME USERNAME=${USERNAME:-web2py} read -p "Enter path where web2py will be installed [/opt/web2py_apps]: " WEB2PY_PATH WEB2PY_PATH=${WEB2PY_PATH:-/opt/web2py_apps} read -p "Web2py subdirectory will be called: [web2py]: " WEB2PY_APP WEB2PY_APP=${WEB2PY_APP:-web2py} read -p "Enter your web2py admin password: " WEB2PY_PASS read -p "Enter your domain name: " YOUR_SERVER_DOMAIN # open new user useradd -d $WEB2PY_PATH $USERNAME # if it's not already open, let's create a directory for web2py mkdir -p $WEB2PY_PATH # now let's create a self signed certificate cd $WEB2PY_PATH openssl req -x509 -new -newkey rsa:4096 -days 3652 -nodes -keyout $WEB2PY_APP.key -out $WEB2PY_APP.crt # # phase 2: That was all the input that we needed so let's install the components # echo "Installing necessary components" # Verify packages are up to date yum -y upgrade # Install required packages yum install -y epel-release yum install -y python-devel python-pip gcc nginx wget unzip python-psycopg2 MySQL-python # download and unzip web2py echo "Downloading web2py" cd $WEB2PY_PATH wget http://web2py.com/examples/static/web2py_src.zip unzip web2py_src.zip rm web2py_src.zip # preparing wsgihandler chown -R $USERNAME.$USERNAME $WEB2PY_PATH/$WEB2PY_APP mv $WEB2PY_PATH/$WEB2PY_APP/handlers/wsgihandler.py $WEB2PY_PATH/$WEB2PY_APP # now let's install uwsgi pip install uwsgi # preparing directories mkdir -p /etc/uwsgi/sites mkdir -p /var/log/uwsgi mkdir -p /etc/nginx/ssl/ # # Phase 3: Ok, everything is installed now so we'll configure things # # Create configuration file for uwsgi in /etc/uwsgi/$WEB2PY_APP.ini echo '[uwsgi] chdir = WEB2PY_PATH_PLACEHOLDER/WEB2PY_APP_PLACEHOLDER module = wsgihandler:application master = true processes = 5 uid = USERNAME_PLACEHOLDER socket = /run/uwsgi/WEB2PY_APP_PLACEHOLDER.sock chown-socket = USERNAME_PLACEHOLDER:nginx chmod-socket = 660 vacuum = true ' >/etc/uwsgi/sites/$WEB2PY_APP.ini sed -i "s@WEB2PY_PATH_PLACEHOLDER@$WEB2PY_PATH@" /etc/uwsgi/sites/$WEB2PY_APP.ini sed -i "s@WEB2PY_APP_PLACEHOLDER@$WEB2PY_APP@" /etc/uwsgi/sites/$WEB2PY_APP.ini sed -i "s@USERNAME_PLACEHOLDER@$USERNAME@" /etc/uwsgi/sites/$WEB2PY_APP.ini # Create a daemon configuration file for uwsgi cat > /etc/systemd/system/uwsgi.service < /etc/nginx/nginx.conf <,|:)\s*').sub('\g ', text) text = re.compile('\s*;\s*').sub(';\n ', text) text = re.compile('\s*\{\s*').sub(' {\n ', text) text = re.compile('\s*\}\s*').sub('\n}\n\n', text) return text def cleanhtml(text): text = text.lower() r = re.compile('\', re.DOTALL) scripts = r.findall(text) text = r.sub('' coffee_template = '' typescript_template = '' less_template = '' css_inline = '' js_inline = '' template_mapping = { 'css': css_template, 'js': js_template, 'coffee': coffee_template, 'ts': typescript_template, 'less': less_template, 'css:inline': css_inline, 'js:inline': js_inline } # IMPORTANT: # this is required so that pickled dict(s) and class.__dict__ # are sorted and web2py can detect without ambiguity when a session changes class SortingPickler(Pickler): def save_dict(self, obj): self.write(EMPTY_DICT if self.bin else MARK + DICT) self.memoize(obj) self._batch_setitems([(key, obj[key]) for key in sorted(obj)]) SortingPickler.dispatch = copy.copy(Pickler.dispatch) SortingPickler.dispatch[DictionaryType] = SortingPickler.save_dict def sorting_dumps(obj, protocol=None): file = cStringIO.StringIO() SortingPickler(file, protocol).dump(obj) return file.getvalue() # END ##################################################################### def copystream_progress(request, chunk_size=10 ** 5): """ Copies request.env.wsgi_input into request.body and stores progress upload status in cache_ram X-Progress-ID:length and X-Progress-ID:uploaded """ env = request.env if not env.get('CONTENT_LENGTH', None): return cStringIO.StringIO() source = env['wsgi.input'] try: size = int(env['CONTENT_LENGTH']) except ValueError: raise HTTP(400, "Invalid Content-Length header") try: # Android requires this dest = tempfile.NamedTemporaryFile() except NotImplementedError: # and GAE this dest = tempfile.TemporaryFile() if not 'X-Progress-ID' in request.get_vars: copystream(source, dest, size, chunk_size) return dest cache_key = 'X-Progress-ID:' + request.get_vars['X-Progress-ID'] cache_ram = CacheInRam(request) # same as cache.ram because meta_storage cache_ram(cache_key + ':length', lambda: size, 0) cache_ram(cache_key + ':uploaded', lambda: 0, 0) while size > 0: if size < chunk_size: data = source.read(size) cache_ram.increment(cache_key + ':uploaded', size) else: data = source.read(chunk_size) cache_ram.increment(cache_key + ':uploaded', chunk_size) length = len(data) if length > size: (data, length) = (data[:size], size) size -= length if length == 0: break dest.write(data) if length < chunk_size: break dest.seek(0) cache_ram(cache_key + ':length', None) cache_ram(cache_key + ':uploaded', None) return dest class Request(Storage): """ Defines the request object and the default values of its members - env: environment variables, by gluon.main.wsgibase() - cookies - get_vars - post_vars - vars - folder - application - function - args - extension - now: datetime.datetime.now() - utcnow : datetime.datetime.utcnow() - is_local - is_https - restful() """ def __init__(self, env): Storage.__init__(self) self.env = Storage(env) self.env.web2py_path = global_settings.applications_parent self.env.update(global_settings) self.cookies = Cookie.SimpleCookie() self._get_vars = None self._post_vars = None self._vars = None self._body = None self.folder = None self.application = None self.function = None self.args = List() self.extension = 'html' self.now = datetime.datetime.now() self.utcnow = datetime.datetime.utcnow() self.is_restful = False self.is_https = False self.is_local = False self.global_settings = settings.global_settings self._uuid = None def parse_get_vars(self): """Takes the QUERY_STRING and unpacks it to get_vars """ query_string = self.env.get('QUERY_STRING', '') dget = urlparse.parse_qs(query_string, keep_blank_values=1) # Ref: https://docs.python.org/2/library/cgi.html#cgi.parse_qs get_vars = self._get_vars = Storage(dget) for (key, value) in get_vars.iteritems(): if isinstance(value, list) and len(value) == 1: get_vars[key] = value[0] def parse_post_vars(self): """Takes the body of the request and unpacks it into post_vars. application/json is also automatically parsed """ env = self.env post_vars = self._post_vars = Storage() body = self.body # if content-type is application/json, we must read the body is_json = env.get('content_type', '')[:16] == 'application/json' if is_json: try: json_vars = sj.load(body) except: # incoherent request bodies can still be parsed "ad-hoc" json_vars = {} pass # update vars and get_vars with what was posted as json if isinstance(json_vars, dict): post_vars.update(json_vars) body.seek(0) # parse POST variables on POST, PUT, BOTH only in post_vars if (body and not is_json and env.request_method in ('POST', 'PUT', 'DELETE', 'BOTH')): query_string = env.pop('QUERY_STRING', None) dpost = cgi.FieldStorage(fp=body, environ=env, keep_blank_values=1) try: post_vars.update(dpost) except: pass if query_string is not None: env['QUERY_STRING'] = query_string # The same detection used by FieldStorage to detect multipart POSTs body.seek(0) def listify(a): return (not isinstance(a, list) and [a]) or a try: keys = sorted(dpost) except TypeError: keys = [] for key in keys: if key is None: continue # not sure why cgi.FieldStorage returns None key dpk = dpost[key] # if an element is not a file replace it with # its value else leave it alone pvalue = listify([(_dpk if _dpk.filename else _dpk.value) for _dpk in dpk] if isinstance(dpk, list) else (dpk if dpk.filename else dpk.value)) if len(pvalue): post_vars[key] = (len(pvalue) > 1 and pvalue) or pvalue[0] @property def body(self): if self._body is None: try: self._body = copystream_progress(self) except IOError: raise HTTP(400, "Bad Request - HTTP body is incomplete") return self._body def parse_all_vars(self): """Merges get_vars and post_vars to vars """ self._vars = copy.copy(self.get_vars) for key, value in self.post_vars.iteritems(): if key not in self._vars: self._vars[key] = value else: if not isinstance(self._vars[key], list): self._vars[key] = [self._vars[key]] self._vars[key] += value if isinstance(value, list) else [value] @property def get_vars(self): """Lazily parses the query string into get_vars """ if self._get_vars is None: self.parse_get_vars() return self._get_vars @property def post_vars(self): """Lazily parse the body into post_vars """ if self._post_vars is None: self.parse_post_vars() return self._post_vars @property def vars(self): """Lazily parses all get_vars and post_vars to fill vars """ if self._vars is None: self.parse_all_vars() return self._vars @property def uuid(self): """Lazily uuid """ if self._uuid is None: self.compute_uuid() return self._uuid def compute_uuid(self): self._uuid = '%s/%s.%s.%s' % ( self.application, self.client.replace(':', '_'), self.now.strftime('%Y-%m-%d.%H-%M-%S'), web2py_uuid()) return self._uuid def user_agent(self): from gluon.contrib import user_agent_parser session = current.session user_agent = session._user_agent if user_agent: return user_agent user_agent = user_agent_parser.detect(self.env.http_user_agent) for key, value in user_agent.items(): if isinstance(value, dict): user_agent[key] = Storage(value) user_agent = session._user_agent = Storage(user_agent) return user_agent def requires_https(self): """ If request comes in over HTTP, redirects it to HTTPS and secures the session. """ cmd_opts = global_settings.cmd_options # checking if this is called within the scheduler or within the shell # in addition to checking if it's not a cronjob if ((cmd_opts and (cmd_opts.shell or cmd_opts.scheduler)) or global_settings.cronjob or self.is_https): current.session.secure() else: current.session.forget() redirect(URL(scheme='https', args=self.args, vars=self.vars)) def restful(self): def wrapper(action, self=self): def f(_action=action, _self=self, *a, **b): self.is_restful = True method = _self.env.request_method if len(_self.args) and '.' in _self.args[-1]: _self.args[-1], _, self.extension = self.args[-1].rpartition('.') current.response.headers['Content-Type'] = \ contenttype('.' + _self.extension.lower()) rest_action = _action().get(method, None) if not (rest_action and method == method.upper() and callable(rest_action)): raise HTTP(405, "method not allowed") try: return rest_action(*_self.args, **getattr(_self, 'vars', {})) except TypeError, e: exc_type, exc_value, exc_traceback = sys.exc_info() if len(traceback.extract_tb(exc_traceback)) == 1: raise HTTP(400, "invalid arguments") else: raise f.__doc__ = action.__doc__ f.__name__ = action.__name__ return f return wrapper class Response(Storage): """ Defines the response object and the default values of its members response.write( ) can be used to write in the output html """ def __init__(self): Storage.__init__(self) self.status = 200 self.headers = dict() self.headers['X-Powered-By'] = 'web2py' self.body = cStringIO.StringIO() self.session_id = None self.cookies = Cookie.SimpleCookie() self.postprocessing = [] self.flash = '' # used by the default view layout self.meta = Storage() # used by web2py_ajax.html self.menu = [] # used by the default view layout self.files = [] # used by web2py_ajax.html self._vars = None self._caller = lambda f: f() self._view_environment = None self._custom_commit = None self._custom_rollback = None self.generic_patterns = ['*'] self.delimiters = ('{{', '}}') self.formstyle = 'table3cols' self.form_label_separator = ': ' def write(self, data, escape=True): if not escape: self.body.write(str(data)) else: self.body.write(xmlescape(data)) def render(self, *a, **b): from compileapp import run_view_in if len(a) > 2: raise SyntaxError( 'Response.render can be called with two arguments, at most') elif len(a) == 2: (view, self._vars) = (a[0], a[1]) elif len(a) == 1 and isinstance(a[0], str): (view, self._vars) = (a[0], {}) elif len(a) == 1 and hasattr(a[0], 'read') and callable(a[0].read): (view, self._vars) = (a[0], {}) elif len(a) == 1 and isinstance(a[0], dict): (view, self._vars) = (None, a[0]) else: (view, self._vars) = (None, {}) self._vars.update(b) self._view_environment.update(self._vars) if view: import cStringIO (obody, oview) = (self.body, self.view) (self.body, self.view) = (cStringIO.StringIO(), view) run_view_in(self._view_environment) page = self.body.getvalue() self.body.close() (self.body, self.view) = (obody, oview) else: run_view_in(self._view_environment) page = self.body.getvalue() return page def include_meta(self): s = "\n" for meta in (self.meta or {}).iteritems(): k, v = meta if isinstance(v, dict): s += '\n' else: s += '\n' % (k, xmlescape(v)) self.write(s, escape=False) def include_files(self, extensions=None): """ Includes files (usually in the head). Can minify and cache local files By default, caches in ram for 5 minutes. To change, response.cache_includes = (cache_method, time_expire). Example: (cache.disk, 60) # caches to disk for 1 minute. """ files = [] ext_files = [] has_js = has_css = False for item in self.files: if isinstance(item, (list, tuple)): ext_files.append(item) continue if extensions and not item.rpartition('.')[2] in extensions: continue if item in files: continue if item.endswith('.js'): has_js = True if item.endswith('.css'): has_css = True files.append(item) if have_minify and ((self.optimize_css and has_css) or (self.optimize_js and has_js)): # cache for 5 minutes by default key = hashlib.md5(repr(files)).hexdigest() cache = self.cache_includes or (current.cache.ram, 60 * 5) def call_minify(files=files): return minify.minify(files, URL('static', 'temp'), current.request.folder, self.optimize_css, self.optimize_js) if cache: cache_model, time_expire = cache files = cache_model('response.files.minified/' + key, call_minify, time_expire) else: files = call_minify() files.extend(ext_files) s = [] for item in files: if isinstance(item, str): f = item.lower().split('?')[0] ext = f.rpartition('.')[2] # if static_version we need also to check for # static_version_urls. In that case, the _.x.x.x # bit would have already been added by the URL() # function if self.static_version and not self.static_version_urls: item = item.replace( '/static/', '/static/_%s/' % self.static_version, 1) tmpl = template_mapping.get(ext) if tmpl: s.append(tmpl % item) elif isinstance(item, (list, tuple)): f = item[0] tmpl = template_mapping.get(f) if tmpl: s.append(tmpl % item[1]) self.write(''.join(s), escape=False) def stream(self, stream, chunk_size=DEFAULT_CHUNK_SIZE, request=None, attachment=False, filename=None ): """ If in a controller function:: return response.stream(file, 100) the file content will be streamed at 100 bytes at the time Args: stream: filename or read()able content chunk_size(int): Buffer size request: the request object attachment(bool): prepares the correct headers to download the file as an attachment. Usually creates a pop-up download window on browsers filename(str): the name for the attachment Note: for using the stream name (filename) with attachments the option must be explicitly set as function parameter (will default to the last request argument otherwise) """ headers = self.headers # for attachment settings and backward compatibility keys = [item.lower() for item in headers] if attachment: if filename is None: attname = "" else: attname = filename headers["Content-Disposition"] = \ 'attachment;filename="%s"' % attname if not request: request = current.request if isinstance(stream, (str, unicode)): stream_file_or_304_or_206(stream, chunk_size=chunk_size, request=request, headers=headers, status=self.status) # ## the following is for backward compatibility if hasattr(stream, 'name'): filename = stream.name if filename and not 'content-type' in keys: headers['Content-Type'] = contenttype(filename) if filename and not 'content-length' in keys: try: headers['Content-Length'] = \ os.path.getsize(filename) except OSError: pass env = request.env # Internet Explorer < 9.0 will not allow downloads over SSL unless caching is enabled if request.is_https and isinstance(env.http_user_agent, str) and \ not re.search(r'Opera', env.http_user_agent) and \ re.search(r'MSIE [5-8][^0-9]', env.http_user_agent): headers['Pragma'] = 'cache' headers['Cache-Control'] = 'private' if request and env.web2py_use_wsgi_file_wrapper: wrapped = env.wsgi_file_wrapper(stream, chunk_size) else: wrapped = streamer(stream, chunk_size=chunk_size) return wrapped def download(self, request, db, chunk_size=DEFAULT_CHUNK_SIZE, attachment=True, download_filename=None): """ Example of usage in controller:: def download(): return response.download(request, db) Downloads from http://..../download/filename """ from pydal.exceptions import NotAuthorizedException, NotFoundException current.session.forget(current.response) if not request.args: raise HTTP(404) name = request.args[-1] items = re.compile('(?P.*?)\.(?P.*?)\..*').match(name) if not items: raise HTTP(404) (t, f) = (items.group('table'), items.group('field')) try: field = db[t][f] except AttributeError: raise HTTP(404) try: (filename, stream) = field.retrieve(name, nameonly=True) except NotAuthorizedException: raise HTTP(403) except NotFoundException: raise HTTP(404) except IOError: raise HTTP(404) headers = self.headers headers['Content-Type'] = contenttype(name) if download_filename is None: download_filename = filename if attachment: headers['Content-Disposition'] = \ 'attachment; filename="%s"' % download_filename.replace('"', '\"') return self.stream(stream, chunk_size=chunk_size, request=request) def json(self, data, default=None): if 'Content-Type' not in self.headers: self.headers['Content-Type'] = 'application/json' return json(data, default=default or custom_json) def xmlrpc(self, request, methods): """ assuming:: def add(a, b): return a+b if a controller function \"func\":: return response.xmlrpc(request, [add]) the controller will be able to handle xmlrpc requests for the add function. Example:: import xmlrpclib connection = xmlrpclib.ServerProxy( 'http://hostname/app/contr/func') print connection.add(3, 4) """ return handler(request, self, methods) def toolbar(self): from gluon.html import DIV, SCRIPT, BEAUTIFY, TAG, A BUTTON = TAG.button admin = URL("admin", "default", "design", extension='html', args=current.request.application) from gluon.dal import DAL dbstats = [] dbtables = {} infos = DAL.get_instances() for k, v in infos.iteritems(): dbstats.append(TABLE(*[TR(PRE(row[0]), '%.2fms' % (row[1]*1000)) for row in v['dbstats']])) dbtables[k] = dict(defined=v['dbtables']['defined'] or '[no defined tables]', lazy=v['dbtables']['lazy'] or '[no lazy tables]') u = web2py_uuid() backtotop = A('Back to top', _href="#totop-%s" % u) # Convert lazy request.vars from property to Storage so they # will be displayed in the toolbar. request = copy.copy(current.request) request.update(vars=current.request.vars, get_vars=current.request.get_vars, post_vars=current.request.post_vars) return DIV( BUTTON('design', _onclick="document.location='%s'" % admin), BUTTON('request', _onclick="jQuery('#request-%s').slideToggle()" % u), BUTTON('response', _onclick="jQuery('#response-%s').slideToggle()" % u), BUTTON('session', _onclick="jQuery('#session-%s').slideToggle()" % u), BUTTON('db tables', _onclick="jQuery('#db-tables-%s').slideToggle()" % u), BUTTON('db stats', _onclick="jQuery('#db-stats-%s').slideToggle()" % u), DIV(BEAUTIFY(request), backtotop, _class="w2p-toolbar-hidden", _id="request-%s" % u), DIV(BEAUTIFY(current.session), backtotop, _class="w2p-toolbar-hidden", _id="session-%s" % u), DIV(BEAUTIFY(current.response), backtotop, _class="w2p-toolbar-hidden", _id="response-%s" % u), DIV(BEAUTIFY(dbtables), backtotop, _class="w2p-toolbar-hidden", _id="db-tables-%s" % u), DIV(BEAUTIFY(dbstats), backtotop, _class="w2p-toolbar-hidden", _id="db-stats-%s" % u), SCRIPT("jQuery('.w2p-toolbar-hidden').hide()"), _id="totop-%s" % u ) class Session(Storage): """ Defines the session object and the default values of its members (None) - session_storage_type : 'file', 'db', or 'cookie' - session_cookie_compression_level : - session_cookie_expires : cookie expiration - session_cookie_key : for encrypted sessions in cookies - session_id : a number or None if no session - session_id_name : - session_locked : - session_masterapp : - session_new : a new session obj is being created - session_hash : hash of the pickled loaded session - session_pickled : picked session if session in cookie: - session_data_name : name of the cookie for session data if session in db: - session_db_record_id - session_db_table - session_db_unique_key if session in file: - session_file - session_filename """ def connect(self, request=None, response=None, db=None, tablename='web2py_session', masterapp=None, migrate=True, separate=None, check_client=False, cookie_key=None, cookie_expires=None, compression_level=None ): """ Used in models, allows to customize Session handling Args: request: the request object response: the response object db: to store/retrieve sessions in db (a table is created) tablename(str): table name masterapp(str): points to another's app sessions. This enables a "SSO" environment among apps migrate: passed to the underlying db separate: with True, creates a folder with the 2 initials of the session id. Can also be a function, e.g. :: separate=lambda(session_name): session_name[-2:] check_client: if True, sessions can only come from the same ip cookie_key(str): secret for cookie encryption cookie_expires: sets the expiration of the cookie compression_level(int): 0-9, sets zlib compression on the data before the encryption """ from gluon.dal import Field request = request or current.request response = response or current.response masterapp = masterapp or request.application cookies = request.cookies self._unlock(response) response.session_masterapp = masterapp response.session_id_name = 'session_id_%s' % masterapp.lower() response.session_data_name = 'session_data_%s' % masterapp.lower() response.session_cookie_expires = cookie_expires response.session_client = str(request.client).replace(':', '.') response.session_cookie_key = cookie_key response.session_cookie_compression_level = compression_level # check if there is a session_id in cookies try: old_session_id = cookies[response.session_id_name].value except KeyError: old_session_id = None response.session_id = old_session_id # if we are supposed to use cookie based session data if cookie_key: response.session_storage_type = 'cookie' elif db: response.session_storage_type = 'db' else: response.session_storage_type = 'file' # why do we do this? # because connect may be called twice, by web2py and in models. # the first time there is no db yet so it should do nothing if (global_settings.db_sessions is True or masterapp in global_settings.db_sessions): return if response.session_storage_type == 'cookie': # check if there is session data in cookies if response.session_data_name in cookies: session_cookie_data = cookies[response.session_data_name].value else: session_cookie_data = None if session_cookie_data: data = secure_loads(session_cookie_data, cookie_key, compression_level=compression_level) if data: self.update(data) response.session_id = True # else if we are supposed to use file based sessions elif response.session_storage_type == 'file': response.session_new = False response.session_file = None # check if the session_id points to a valid sesion filename if response.session_id: if not regex_session_id.match(response.session_id): response.session_id = None else: response.session_filename = \ os.path.join(up(request.folder), masterapp, 'sessions', response.session_id) try: response.session_file = \ recfile.open(response.session_filename, 'rb+') portalocker.lock(response.session_file, portalocker.LOCK_EX) response.session_locked = True self.update(pickle.load(response.session_file)) response.session_file.seek(0) oc = response.session_filename.split('/')[-1].split('-')[0] if check_client and response.session_client != oc: raise Exception("cookie attack") except: response.session_id = None if not response.session_id: uuid = web2py_uuid() response.session_id = '%s-%s' % (response.session_client, uuid) separate = separate and (lambda session_name: session_name[-2:]) if separate: prefix = separate(response.session_id) response.session_id = '%s/%s' % (prefix, response.session_id) response.session_filename = \ os.path.join(up(request.folder), masterapp, 'sessions', response.session_id) response.session_new = True # else the session goes in db elif response.session_storage_type == 'db': if global_settings.db_sessions is not True: global_settings.db_sessions.add(masterapp) # if had a session on file alreday, close it (yes, can happen) if response.session_file: self._close(response) # if on GAE tickets go also in DB if settings.global_settings.web2py_runtime_gae: request.tickets_db = db if masterapp == request.application: table_migrate = migrate else: table_migrate = False tname = tablename + '_' + masterapp table = db.get(tname, None) # Field = db.Field if table is None: db.define_table( tname, Field('locked', 'boolean', default=False), Field('client_ip', length=64), Field('created_datetime', 'datetime', default=request.now), Field('modified_datetime', 'datetime'), Field('unique_key', length=64), Field('session_data', 'blob'), migrate=table_migrate, ) table = db[tname] # to allow for lazy table response.session_db_table = table if response.session_id: # Get session data out of the database try: (record_id, unique_key) = response.session_id.split(':') record_id = long(record_id) except (TypeError, ValueError): record_id = None # Select from database if record_id: row = table(record_id, unique_key=unique_key) # Make sure the session data exists in the database if row: # rows[0].update_record(locked=True) # Unpickle the data session_data = pickle.loads(row.session_data) self.update(session_data) response.session_new = False else: record_id = None if record_id: response.session_id = '%s:%s' % (record_id, unique_key) response.session_db_unique_key = unique_key response.session_db_record_id = record_id else: response.session_id = None response.session_new = True # if there is no session id yet, we'll need to create a # new session else: response.session_new = True # set the cookie now if you know the session_id so user can set # cookie attributes in controllers/models # cookie will be reset later # yet cookie may be reset later # Removed comparison between old and new session ids - should send # the cookie all the time if isinstance(response.session_id, str): response.cookies[response.session_id_name] = response.session_id response.cookies[response.session_id_name]['path'] = '/' if cookie_expires: response.cookies[response.session_id_name]['expires'] = \ cookie_expires.strftime(FMT) session_pickled = pickle.dumps(self, pickle.HIGHEST_PROTOCOL) response.session_hash = hashlib.md5(session_pickled).hexdigest() if self.flash: (response.flash, self.flash) = (self.flash, None) def renew(self, clear_session=False): if clear_session: self.clear() request = current.request response = current.response session = response.session masterapp = response.session_masterapp cookies = request.cookies if response.session_storage_type == 'cookie': return # if the session goes in file if response.session_storage_type == 'file': self._close(response) uuid = web2py_uuid() response.session_id = '%s-%s' % (response.session_client, uuid) separate = (lambda s: s[-2:]) if session and response.session_id[2:3] == "/" else None if separate: prefix = separate(response.session_id) response.session_id = '%s/%s' % \ (prefix, response.session_id) response.session_filename = \ os.path.join(up(request.folder), masterapp, 'sessions', response.session_id) response.session_new = True # else the session goes in db elif response.session_storage_type == 'db': table = response.session_db_table # verify that session_id exists if response.session_file: self._close(response) if response.session_new: return # Get session data out of the database if response.session_id is None: return (record_id, sep, unique_key) = response.session_id.partition(':') if record_id.isdigit() and long(record_id) > 0: new_unique_key = web2py_uuid() row = table(record_id) if row and row.unique_key == unique_key: table._db(table.id == record_id).update(unique_key=new_unique_key) else: record_id = None if record_id: response.session_id = '%s:%s' % (record_id, new_unique_key) response.session_db_record_id = record_id response.session_db_unique_key = new_unique_key else: response.session_new = True def _fixup_before_save(self): response = current.response rcookies = response.cookies if self._forget and response.session_id_name in rcookies: del rcookies[response.session_id_name] elif self._secure and response.session_id_name in rcookies: rcookies[response.session_id_name]['secure'] = True def clear_session_cookies(self): request = current.request response = current.response session = response.session masterapp = response.session_masterapp cookies = request.cookies rcookies = response.cookies # if not cookie_key, but session_data_name in cookies # expire session_data_name from cookies if response.session_data_name in cookies: rcookies[response.session_data_name] = 'expired' rcookies[response.session_data_name]['path'] = '/' rcookies[response.session_data_name]['expires'] = PAST if response.session_id_name in rcookies: del rcookies[response.session_id_name] def save_session_id_cookie(self): request = current.request response = current.response session = response.session masterapp = response.session_masterapp cookies = request.cookies rcookies = response.cookies # if not cookie_key, but session_data_name in cookies # expire session_data_name from cookies if not response.session_cookie_key: if response.session_data_name in cookies: rcookies[response.session_data_name] = 'expired' rcookies[response.session_data_name]['path'] = '/' rcookies[response.session_data_name]['expires'] = PAST if response.session_id: rcookies[response.session_id_name] = response.session_id rcookies[response.session_id_name]['path'] = '/' expires = response.session_cookie_expires if isinstance(expires, datetime.datetime): expires = expires.strftime(FMT) if expires: rcookies[response.session_id_name]['expires'] = expires def clear(self): # see https://github.com/web2py/web2py/issues/735 response = current.response if response.session_storage_type == 'file': target = recfile.generate(response.session_filename) try: os.unlink(target) except: pass elif response.session_storage_type == 'db': table = response.session_db_table if response.session_id: (record_id, sep, unique_key) = response.session_id.partition(':') if record_id.isdigit() and long(record_id) > 0: table._db(table.id == record_id).delete() Storage.clear(self) def is_new(self): if self._start_timestamp: return False else: self._start_timestamp = datetime.datetime.today() return True def is_expired(self, seconds=3600): now = datetime.datetime.today() if not self._last_timestamp or \ self._last_timestamp + datetime.timedelta(seconds=seconds) > now: self._last_timestamp = now return False else: return True def secure(self): self._secure = True def forget(self, response=None): self._close(response) self._forget = True def _try_store_in_cookie(self, request, response): if self._forget or self._unchanged(response): # self.clear_session_cookies() self.save_session_id_cookie() return False name = response.session_data_name compression_level = response.session_cookie_compression_level value = secure_dumps(dict(self), response.session_cookie_key, compression_level=compression_level) rcookies = response.cookies rcookies.pop(name, None) rcookies[name] = value rcookies[name]['path'] = '/' expires = response.session_cookie_expires if isinstance(expires, datetime.datetime): expires = expires.strftime(FMT) if expires: rcookies[name]['expires'] = expires return True def _unchanged(self, response): session_pickled = pickle.dumps(self, pickle.HIGHEST_PROTOCOL) response.session_pickled = session_pickled session_hash = hashlib.md5(session_pickled).hexdigest() return response.session_hash == session_hash def _try_store_in_db(self, request, response): # don't save if file-based sessions, # no session id, or session being forgotten # or no changes to session (Unless the session is new) if (not response.session_db_table or self._forget or (self._unchanged(response) and not response.session_new)): if (not response.session_db_table and global_settings.db_sessions is not True and response.session_masterapp in global_settings.db_sessions): global_settings.db_sessions.remove(response.session_masterapp) # self.clear_session_cookies() self.save_session_id_cookie() return False table = response.session_db_table record_id = response.session_db_record_id if response.session_new: unique_key = web2py_uuid() else: unique_key = response.session_db_unique_key session_pickled = response.session_pickled or pickle.dumps(self, pickle.HIGHEST_PROTOCOL) dd = dict(locked=False, client_ip=response.session_client, modified_datetime=request.now, session_data=session_pickled, unique_key=unique_key) if record_id: if not table._db(table.id == record_id).update(**dd): record_id = None if not record_id: record_id = table.insert(**dd) response.session_id = '%s:%s' % (record_id, unique_key) response.session_db_unique_key = unique_key response.session_db_record_id = record_id self.save_session_id_cookie() return True def _try_store_in_cookie_or_file(self, request, response): if response.session_storage_type == 'file': return self._try_store_in_file(request, response) if response.session_storage_type == 'cookie': return self._try_store_in_cookie(request, response) def _try_store_in_file(self, request, response): try: if (not response.session_id or self._forget or self._unchanged(response)): # self.clear_session_cookies() self.save_session_id_cookie() return False if response.session_new or not response.session_file: # Tests if the session sub-folder exists, if not, create it session_folder = os.path.dirname(response.session_filename) if not os.path.exists(session_folder): os.mkdir(session_folder) response.session_file = recfile.open(response.session_filename, 'wb') portalocker.lock(response.session_file, portalocker.LOCK_EX) response.session_locked = True if response.session_file: session_pickled = response.session_pickled or pickle.dumps(self, pickle.HIGHEST_PROTOCOL) response.session_file.write(session_pickled) response.session_file.truncate() finally: self._close(response) self.save_session_id_cookie() return True def _unlock(self, response): if response and response.session_file and response.session_locked: try: portalocker.unlock(response.session_file) response.session_locked = False except: # this should never happen but happens in Windows pass def _close(self, response): if response and response.session_file: self._unlock(response) try: response.session_file.close() del response.session_file except: pass def pickle_session(s): return Session, (dict(s),) copy_reg.pickle(Session, pickle_session) web2py-2.12.3.orig/gluon/packages/0000775000000000000000000000000012564727264015367 5ustar rootrootweb2py-2.12.3.orig/gluon/packages/dal/0000775000000000000000000000000012564727436016130 5ustar rootrootweb2py-2.12.3.orig/gluon/packages/dal/setup.cfg0000664000000000000000000000007412564727434017750 0ustar rootroot[aliases] release = egg_info -RDb '' [wheel] universal = 1 web2py-2.12.3.orig/gluon/packages/dal/CHANGES0000664000000000000000000000604312564727432017122 0ustar rootrootpydal changelog =============== Version 15.07 ------------- Released on July 10th 2015 - Added `smart_query` support for 'contains' on fields of type 'list:string' - Implemented correct escaping for 'LIKE' (see https://github.com/web2py/pydal/issues/212) - Added support for `ondelete` with fields of type 'list:reference' on `MongoDBAdapter` - Improved `BasicStorage` performance - Added arithmetic expressions support on `MongoDBAdapter` - Added aggregations support on `MongoDBAdapter` - `Table.validate_and_insert` and `Table.validate_and_update` methods now validates also empty fields - Added support for expression operators on `MongoDBAdapter` - Several bugfixes Version 15.05.29 ---------------- Released on May 29th 2015 - Fixed a unicode error with `PostgreSQLAdapter` introduced with 15.05 Version 15.05.26 ---------------- Released on May 26th 2015 - Fixed `DAL.__getattr__` - Fixed backward compatibility breaks introduced with 15.05 Version 15.05 ------------- Released on May 23rd 2015 - Fixed True/False expressions in MSSQL - Introduced `iterselect()` and `IterRows` - Extended `SQLCustomType` to support `widget` & `represent` attributes - Updated `MongoDBAdapter` to support pymongo 3.0 - Implemented JSON serialization for objects - Refactored many internal objects to improve performance - Added python 3.x support (experimental) - Several fixes and improvements to `MongoDBAdapter` - Implemented unicode handling in MSSQL (experimental) via mssql4n and mssql3n adapters Notes: These adapters will probably become the de-facto standard for MSSQL handling; any other adapter will continue to be supported just for legacy databases - Restricted table and field names to "valid" ones Notes: the "dotted-notation-friendly" syntax for names means anything: - alphanumeric - not starting with underscore or an integer `rname` attribute is intended to be used for anything else Version 15.03 ------------- Released on March 23rd 2015 - Fixed `redefine` with lazy tables - Added tests for `update_or_insert`, `bulk_insert`, `validate_and_update_or_insert` - Enhanced connections open/close flow - Enhanced logging flow - Refactored google adapters: `ndb` is now used by default - Added default representation for `reference` fields - Fixed some caching issues when using `pickle` - Several improvements and fixes in `MongoDBAdapter` Version 15.02.27 ---------------- Released on February 27th 2015 - Fixed a connection bug - Fixed a security flaw which could lead to db password storing in cache Version 15.02 ------------- Released on February 11th 2015 - Updated pg8000 support in `PostgreSQLAdapter` - Fixed `ilike` for `Field` type 'list:string' in `PostgreSQLAdapter` - Added case sensitive/insensitive tests for `contains` - Fixed expression evaluation on `PostgreSQLAdapter` - Fixed `common_filter` issue in `_enable_record_versioning` - Removed contrib drivers - Fixed `uuid` attribute of `DAL` class - Added caching tests Version 0.12.25 --------------- Released on December 25th 2014 First public preview release. web2py-2.12.3.orig/gluon/packages/dal/setup.py0000664000000000000000000000324012564727434017637 0ustar rootroot""" pyDAL is a pure Python Database Abstraction Layer. It dynamically generates the SQL in real time using the specified dialect for the database back end, so that you do not have to write SQL code or learn different SQL dialects (the term SQL is used generically), and your code will be portable among different types of databases. pyDAL comes from the original web2py's DAL, with the aim of being wide-compatible. pyDAL doesn't require web2py and can be used in any Python context. Links ----- * `website `_ * `documentation `_ """ from setuptools import setup setup( name='pyDAL', version='15.07', url='https://github.com/web2py/pydal', license='BSD', author='Massimo Di Pierro', author_email='mdipierro@cs.depaul.edu', maintainer='Giovanni Barillari', maintainer_email='gi0baro@d4net.org', description='a pure Python Database Abstraction Layer', long_description=__doc__, packages=['pydal', 'pydal.adapters', 'pydal.helpers', 'pydal.contrib'], include_package_data=True, zip_safe=False, platforms='any', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Web Environment', 'Intended Audience :: Developers', 'License :: OSI Approved :: BSD License', 'Operating System :: OS Independent', 'Programming Language :: Python', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 3', 'Topic :: Database :: Front-Ends', 'Topic :: Software Development :: Libraries :: Python Modules' ] ) web2py-2.12.3.orig/gluon/packages/dal/LICENSE0000664000000000000000000000322712564727432017135 0ustar rootrootCopyright (c) 2014 by Massimo Di Pierro and contributors. See AUTHORS for more details. Some rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * The names of the contributors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. pyDAL contains third party software in the 'contrib' directory: each file/module in this directory is distributed under its original license. web2py-2.12.3.orig/gluon/packages/dal/pydal/0000775000000000000000000000000012564727434017237 5ustar rootrootweb2py-2.12.3.orig/gluon/packages/dal/pydal/__init__.py0000664000000000000000000000022712564727432021347 0ustar rootrootfrom .base import DAL from .objects import Field from .helpers.classes import SQLCustomType from .helpers.methods import geoPoint, geoLine, geoPolygon web2py-2.12.3.orig/gluon/packages/dal/pydal/_gae.py0000664000000000000000000000063612564727432020507 0ustar rootroot# -*- coding: utf-8 -*- try: from new import classobj from google.appengine.ext import db as gae from google.appengine.ext import ndb from google.appengine.api import namespace_manager, rdbms from google.appengine.api.datastore_types import Key # for belongs on ID from google.appengine.ext.ndb.polymodel import PolyModel as NDBPolyModel except ImportError: gae = None Key = None web2py-2.12.3.orig/gluon/packages/dal/pydal/contrib/0000775000000000000000000000000012564727432020675 5ustar rootrootweb2py-2.12.3.orig/gluon/packages/dal/pydal/contrib/__init__.py0000664000000000000000000000000012564727432022774 0ustar rootrootweb2py-2.12.3.orig/gluon/packages/dal/pydal/contrib/portalocker.py0000664000000000000000000000762712564727432023610 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- """ Cross-platform (posix/nt) API for flock-style file locking. Synopsis:: import portalocker file = open(\"somefile\", \"r+\") portalocker.lock(file, portalocker.LOCK_EX) file.seek(12) file.write(\"foo\") file.close() If you know what you're doing, you may choose to:: portalocker.unlock(file) before closing the file, but why? Methods:: lock( file, flags ) unlock( file ) Constants:: LOCK_EX LOCK_SH LOCK_NB I learned the win32 technique for locking files from sample code provided by John Nielsen in the documentation that accompanies the win32 modules. Author: Jonathan Feinberg Version: $Id: portalocker.py,v 1.3 2001/05/29 18:47:55 Administrator Exp $ """ import logging import platform logger = logging.getLogger("web2py") os_locking = None try: import google.appengine os_locking = 'gae' except: try: import fcntl os_locking = 'posix' except: try: import win32con import win32file import pywintypes os_locking = 'windows' except: pass if os_locking == 'windows': LOCK_EX = win32con.LOCKFILE_EXCLUSIVE_LOCK LOCK_SH = 0 # the default LOCK_NB = win32con.LOCKFILE_FAIL_IMMEDIATELY # is there any reason not to reuse the following structure? __overlapped = pywintypes.OVERLAPPED() def lock(file, flags): hfile = win32file._get_osfhandle(file.fileno()) win32file.LockFileEx(hfile, flags, 0, 0x7fff0000, __overlapped) def unlock(file): hfile = win32file._get_osfhandle(file.fileno()) win32file.UnlockFileEx(hfile, 0, 0x7fff0000, __overlapped) elif os_locking == 'posix': LOCK_EX = fcntl.LOCK_EX LOCK_SH = fcntl.LOCK_SH LOCK_NB = fcntl.LOCK_NB def lock(file, flags): fcntl.flock(file.fileno(), flags) def unlock(file): fcntl.flock(file.fileno(), fcntl.LOCK_UN) else: if platform.system() == 'Windows': logger.error('no file locking, you must install the win32 extensions from: http://sourceforge.net/projects/pywin32/files/') elif os_locking != 'gae': logger.debug('no file locking, this will cause problems') LOCK_EX = None LOCK_SH = None LOCK_NB = None def lock(file, flags): pass def unlock(file): pass class LockedFile(object): def __init__(self, filename, mode='rb'): self.filename = filename self.mode = mode self.file = None if 'r' in mode: self.file = open(filename, mode) lock(self.file, LOCK_SH) elif 'w' in mode or 'a' in mode: self.file = open(filename, mode.replace('w', 'a')) lock(self.file, LOCK_EX) if not 'a' in mode: self.file.seek(0) self.file.truncate(0) else: raise RuntimeError("invalid LockedFile(...,mode)") def read(self, size=None): return self.file.read() if size is None else self.file.read(size) def readline(self): return self.file.readline() def readlines(self): return self.file.readlines() def write(self, data): self.file.write(data) self.file.flush() def close(self): if not self.file is None: unlock(self.file) self.file.close() self.file = None def __del__(self): if not self.file is None: self.close() def read_locked(filename): fp = LockedFile(filename, 'rb') data = fp.read() fp.close() return data def write_locked(filename, data): fp = LockedFile(filename, 'wb') data = fp.write(data) fp.close() if __name__ == '__main__': import sys f = LockedFile('test.txt', mode='wb') f.write('test ok') f.close() f = LockedFile('test.txt', mode='rb') sys.stdout.write(f.read()+'\n') f.close() web2py-2.12.3.orig/gluon/packages/dal/pydal/contrib/ordereddict.py0000664000000000000000000000777612564727432023560 0ustar rootroot# Copyright (c) 2009 Raymond Hettinger # # Permission is hereby granted, free of charge, to any person # obtaining a copy of this software and associated documentation files # (the "Software"), to deal in the Software without restriction, # including without limitation the rights to use, copy, modify, merge, # publish, distribute, sublicense, and/or sell copies of the Software, # and to permit persons to whom the Software is furnished to do so, # subject to the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES # OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR # OTHER DEALINGS IN THE SOFTWARE. from UserDict import DictMixin class OrderedDict(dict, DictMixin): def __init__(self, *args, **kwds): if len(args) > 1: raise TypeError('expected at most 1 arguments, got %d' % len(args)) try: self.__end except AttributeError: self.clear() self.update(*args, **kwds) def clear(self): self.__end = end = [] end += [None, end, end] # sentinel node for doubly linked list self.__map = {} # key --> [key, prev, next] dict.clear(self) def __setitem__(self, key, value): if key not in self: end = self.__end curr = end[1] curr[2] = end[1] = self.__map[key] = [key, curr, end] dict.__setitem__(self, key, value) def __delitem__(self, key): dict.__delitem__(self, key) key, prev, next = self.__map.pop(key) prev[2] = next next[1] = prev def __iter__(self): end = self.__end curr = end[2] while curr is not end: yield curr[0] curr = curr[2] def __reversed__(self): end = self.__end curr = end[1] while curr is not end: yield curr[0] curr = curr[1] def popitem(self, last=True): if not self: raise KeyError('dictionary is empty') if last: key = reversed(self).next() else: key = iter(self).next() value = self.pop(key) return key, value def __reduce__(self): items = [[k, self[k]] for k in self] tmp = self.__map, self.__end del self.__map, self.__end inst_dict = vars(self).copy() self.__map, self.__end = tmp if inst_dict: return (self.__class__, (items,), inst_dict) return self.__class__, (items,) def keys(self): return list(self) setdefault = DictMixin.setdefault update = DictMixin.update pop = DictMixin.pop values = DictMixin.values items = DictMixin.items iterkeys = DictMixin.iterkeys itervalues = DictMixin.itervalues iteritems = DictMixin.iteritems def __repr__(self): if not self: return '%s()' % (self.__class__.__name__,) return '%s(%r)' % (self.__class__.__name__, self.items()) def copy(self): return self.__class__(self) @classmethod def fromkeys(cls, iterable, value=None): d = cls() for key in iterable: d[key] = value return d def __eq__(self, other): if isinstance(other, OrderedDict): if len(self) != len(other): return False for p, q in zip(self.items(), other.items()): if p != q: return False return True return dict.__eq__(self, other) def __ne__(self, other): return not self == other web2py-2.12.3.orig/gluon/packages/dal/pydal/contrib/mockimaplib.py0000664000000000000000000002453312564727432023545 0ustar rootroot# -*- encoding: utf-8 -*- from imaplib import ParseFlags # mockimaplib: A very simple mock server module for imap client APIs # Copyright (C) 2014 Alan Etkin # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation, either version 3 of the # License, or(at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this program. If not, see # """ mockimaplib allows you to test applications connecting to a dummy imap service. For more details on the api subset implemented, refer to the imaplib docs. The client should configure a dictionary to map imap string queries to sets of entries stored in a message dummy storage dictionary. The module includes a small set of default message records (SPAM and MESSAGES), two mailboxes (Draft and INBOX) and a list of query/resultset entries (RESULTS). Usage: >>> import mockimaplib >>> connection = mockimaplib.IMAP4_SSL() >>> connection.login(, ) None >>> connection.select("INBOX") ("OK", ... ) # fetch commands specifying single uid or message id # will try to get messages recorded in SPAM >>> connection.uid(...) # returns a string list of matching message ids >>> connection.search() ("OK", ... "1 2 ... n") """ MESSAGES = ( 'MIME-Version: 1.0\r\nReceived: by 10.140.91.199 with HTTP; Mon, 27 Jan 2014 13:52:30 -0800 (PST)\r\nDate: Mon, 27 Jan 2014 19:52:30 -0200\r\nDelivered-To: nurse@example.com\r\nMessage-ID: <10101010101010010000010101010001010101001010010000001@mail.example.com>\r\nSubject: spam1\r\nFrom: Mr. Gumby \r\nTo: The nurse \r\nContent-Type: text/plain; charset=ISO-8859-1\r\n\r\nNurse!\r\n\r\n\r\n', 'MIME-Version: 1.0\r\nReceived: by 10.140.91.199 with HTTP; Mon, 27 Jan 2014 13:52:47 -0800 (PST)\r\nDate: Mon, 27 Jan 2014 19:52:47 -0200\r\nDelivered-To: nurse@example.com\r\nMessage-ID: <101010101010100100000101010100010101010010100100000010@mail.example.com>\r\nSubject: spam2\r\nFrom: Mr. Gumby \r\nTo: The nurse \r\nContent-Type: text/plain; charset=ISO-8859-1\r\n\r\nNurse, nurse!', 'MIME-Version: 1.0\r\nReceived: by 10.140.91.199 with HTTP; Mon, 27 Jan 2014 13:54:54 -0800 (PST)\r\nDate: Mon, 27 Jan 2014 19:54:54 -0200\r\nDelivered-To: nurse@example.com\r\nMessage-ID: <1010101010101001000001010101000101010100101001000000101@mail.example.com>\r\nSubject: spamalot1\r\nFrom: Mr. Gumby \r\nTo: The nurse \r\nContent-Type: text/plain; charset=ISO-8859-1\r\n\r\nNurse!\r\n\r\n\r\n', 'MIME-Version: 1.0\r\n\r\nReceived: by 10.140.91.199 with HTTP; Mon, 27 Jan 2014 13:54:54 -0800 (PST)\r\nDate: Mon, 27 Jan 2014 19:54:54 -0200\r\nDelivered-To: nurse@example.com\r\nMessage-ID: <101010101010100100000101010100010101010010100100000010101@mail.example.com>\r\nSubject: spamalot2\r\nFrom: Mr. Gumby \r\nTo: The nurse \r\nContent-Type: text/plain; charset=ISO-8859-1\r\n\r\nNurse! ... Nurse! ... Nurse!\r\n\r\n\r\n') SPAM = { "INBOX": [ {"uid": "483209", "headers": MESSAGES[0], "complete": MESSAGES[0], "flags": ""}, {"uid": "483211", "headers": MESSAGES[1], "complete": MESSAGES[1], "flags": ""}, {"uid": "483225", "headers": MESSAGES[2], "complete": MESSAGES[2], "flags": ""}], "Draft":[ {"uid": "483432", "headers": MESSAGES[3], "complete": MESSAGES[3], "flags": ""},] } RESULTS = { # : [ | , ...] "INBOX": { "(ALL)": (1, 2, 3), "(1:3)": (1, 2, 3)}, "Draft": { "(1:1)": (1,)}, } class Connection(object): """Dummy connection object for the imap client. By default, uses the module SPAM and RESULT sets (use Connection.setup for custom values)""" def login(self, user, password): pass def __init__(self): self._readonly = False self._mailbox = None self.setup() def list(self): return ('OK', ['(\\HasNoChildren) "/" "%s"' % key for key in self.spam]) def select(self, tablename, readonly=False): self._readonly = readonly """args: mailbox, boolean result[1][0] -> int last message id / mailbox lenght result[0] = 'OK' """ self._mailbox = tablename return ('OK', (len(SPAM[self._mailbox]), None)) def uid(self, command, uid, arg): """ args: command: "search" | "fetch" uid: None | uid parts: "(ALL)" | "(RFC822 FLAGS)" | "(RFC822.HEADER FLAGS)" "search", None, "(ALL)" -> ("OK", ("uid_1 uid_2 ... uid_", None)) "search", None, "" -> ("OK", ("uid_1 uid_2 ... uid_n", None)) "fetch", uid, parts -> ("OK", ((" ...", ""), "") [0] [1][0][0] [1][0][1] [1][1] """ if command == "search": return self._search(arg) elif command == "fetch": return self._fetch(uid, arg) def _search(self, query): return ("OK", (" ".join([str(item["uid"]) for item in self._get_messages(query)]), None)) def _fetch(self, value, arg): try: message = self.spam[self._mailbox][value - 1] message_id = value except TypeError: for x, item in enumerate(self.spam[self._mailbox]): if item["uid"] == value: message = item message_id = x + 1 break parts = "headers" if arg in ("(ALL)", "(RFC822 FLAGS)"): parts = "complete" return ("OK", (("%s " % message_id, message[parts]), message["flags"])) def _get_messages(self, query): if query.strip().isdigit(): return [self.spam[self._mailbox][int(query.strip()) - 1],] elif query[1:-1].strip().isdigit(): return [self.spam[self._mailbox][int(query[1:-1].strip()) -1],] elif query[1:-1].replace("UID", "").strip().isdigit(): for item in self.spam[self._mailbox]: if item["uid"] == query[1:-1].replace("UID", "").strip(): return [item,] messages = [] try: for m in self.results[self._mailbox][query]: try: self.spam[self._mailbox][m - 1]["id"] = m messages.append(self.spam[self._mailbox][m - 1]) except TypeError: for x, item in enumerate(self.spam[self._mailbox]): if item["uid"] == m: item["id"] = x + 1 messages.append(item) break except IndexError: # message removed pass return messages except KeyError: raise ValueError("The client issued an unexpected query: %s" % query) def setup(self, spam={}, results={}): """adds custom message and query databases or sets the values to the module defaults. """ self.spam = spam self.results = results if not spam: for key in SPAM: self.spam[key] = [] for d in SPAM[key]: self.spam[key].append(d.copy()) if not results: for key in RESULTS: self.results[key] = RESULTS[key].copy() def search(self, first, query): """ args: first: None query: string with mailbox query (flags, date, uid, id, ...) example: '2:15723 BEFORE 27-Jan-2014 FROM "gumby"' result[1][0] -> "id_1 id_2 ... id_n" """ messages = self._get_messages(query) ids = " ".join([str(item["id"]) for item in messages]) return ("OK", (ids, None)) def append(self, mailbox, flags, struct_time, message): """ result, data = self.connection.append(mailbox, flags, struct_time, message) if result == "OK": uid = int(re.findall("\d+", str(data))[-1]) """ last = self.spam[mailbox][-1] try: uid = int(last["uid"]) +1 except ValueError: alluids = [] for _mailbox in self.spam.keys(): for item in self.spam[_mailbox]: try: alluids.append(int(item["uid"])) except: pass if len(alluids) > 0: uid = max(alluids) + 1 else: uid = 1 flags = "FLAGS " + flags item = {"uid": str(uid), "headers": message, "complete": message, "flags": flags} self.spam[mailbox].append(item) return ("OK", "spam spam %s spam" % uid) def store(self, *args): """ implements some flag commands args: ("", "<+|->FLAGS", "(\\Flag1 \\Flag2 ... \\Flagn)") """ message = self.spam[self._mailbox][int(args[0] - 1)] old_flags = ParseFlags(message["flags"]) flags = ParseFlags("FLAGS" + args[2]) if args[1].strip().startswith("+"): message["flags"] = "FLAGS (%s)" % " ".join(set(flags + old_flags)) elif args[1].strip().startswith("-"): message["flags"] = "FLAGS (%s)" % " ".join([flag for flag in old_flags if not flag in flags]) def expunge(self): """implements removal of deleted flag messages""" for x, item in enumerate(self.spam[self._mailbox]): if "\\Deleted" in item["flags"]: self.spam[self._mailbox].pop(x) class IMAP4(object): """>>> connection = IMAP4() # creates the dummy imap4 client object""" def __new__(self, *args, **kwargs): # args: (server, port) return Connection() IMAP4_SSL = IMAP4 web2py-2.12.3.orig/gluon/packages/dal/pydal/contrib/reserved_sql_keywords.py0000664000000000000000000006452012564727434025705 0ustar rootroot# encoding utf-8 __author__ = "Thadeus Burgess " # we classify as "non-reserved" those key words that are explicitly known # to the parser but are allowed as column or table names. Some key words # that are otherwise non-reserved cannot be used as function or data type n # ames and are in the nonreserved list. (Most of these words represent # built-in functions or data types with special syntax. The function # or type is still available but it cannot be redefined by the user.) # Labeled "reserved" are those tokens that are not allowed as column or # table names. Some reserved key words are allowable as names for # functions or data typesself. # Note at the bottom of the list is a dict containing references to the # tuples, and also if you add a list don't forget to remove its default # set of COMMON. # Keywords that are adapter specific. Such as a list of "postgresql" # or "mysql" keywords # These are keywords that are common to all SQL dialects, and should # never be used as a table or column. Even if you use one of these # the cursor will throw an OperationalError for the SQL syntax. from .._compat import PY2 if not PY2: from functools import reduce COMMON = set(( 'SELECT', 'INSERT', 'DELETE', 'UPDATE', 'DROP', 'CREATE', 'ALTER', 'WHERE', 'FROM', 'INNER', 'JOIN', 'AND', 'OR', 'LIKE', 'ON', 'IN', 'SET', 'BY', 'GROUP', 'ORDER', 'LEFT', 'OUTER', 'IF', 'END', 'THEN', 'LOOP', 'AS', 'ELSE', 'FOR', 'CASE', 'WHEN', 'MIN', 'MAX', 'DISTINCT', )) POSTGRESQL = set(( 'FALSE', 'TRUE', 'ALL', 'ANALYSE', 'ANALYZE', 'AND', 'ANY', 'ARRAY', 'AS', 'ASC', 'ASYMMETRIC', 'AUTHORIZATION', 'BETWEEN', 'BIGINT', 'BINARY', 'BIT', 'BOOLEAN', 'BOTH', 'CASE', 'CAST', 'CHAR', 'CHARACTER', 'CHECK', 'COALESCE', 'COLLATE', 'COLUMN', 'CONSTRAINT', 'CREATE', 'CROSS', 'CURRENT_CATALOG', 'CURRENT_DATE', 'CURRENT_ROLE', 'CURRENT_SCHEMA', 'CURRENT_TIME', 'CURRENT_TIMESTAMP', 'CURRENT_USER', 'DEC', 'DECIMAL', 'DEFAULT', 'DEFERRABLE', 'DESC', 'DISTINCT', 'DO', 'ELSE', 'END', 'EXCEPT', 'EXISTS', 'EXTRACT', 'FETCH', 'FLOAT', 'FOR', 'FOREIGN', 'FREEZE', 'FROM', 'FULL', 'GRANT', 'GREATEST', 'GROUP', 'HAVING', 'ILIKE', 'IN', 'INITIALLY', 'INNER', 'INOUT', 'INT', 'INTEGER', 'INTERSECT', 'INTERVAL', 'INTO', 'IS', 'ISNULL', 'JOIN', 'LEADING', 'LEAST', 'LEFT', 'LIKE', 'LIMIT', 'LOCALTIME', 'LOCALTIMESTAMP', 'NATIONAL', 'NATURAL', 'NCHAR', 'NEW', 'NONE', 'NOT', 'NOTNULL', 'NULL', 'NULLIF', 'NUMERIC', 'OFF', 'OFFSET', 'OLD', 'ON', 'ONLY', 'OR', 'ORDER', 'OUT', 'OUTER', 'OVERLAPS', 'OVERLAY', 'PLACING', 'POSITION', 'PRECISION', 'PRIMARY', 'REAL', 'REFERENCES', 'RETURNING', 'RIGHT', 'ROW', 'SELECT', 'SESSION_USER', 'SETOF', 'SIMILAR', 'SMALLINT', 'SOME', 'SUBSTRING', 'SYMMETRIC', 'TABLE', 'THEN', 'TIME', 'TIMESTAMP', 'TO', 'TRAILING', 'TREAT', 'TRIM', 'UNION', 'UNIQUE', 'USER', 'USING', 'VALUES', 'VARCHAR', 'VARIADIC', 'VERBOSE', 'WHEN', 'WHERE', 'WITH', 'XMLATTRIBUTES', 'XMLCONCAT', 'XMLELEMENT', 'XMLFOREST', 'XMLPARSE', 'XMLPI', 'XMLROOT', 'XMLSERIALIZE', )) POSTGRESQL_NONRESERVED = set(( 'A', 'ABORT', 'ABS', 'ABSENT', 'ABSOLUTE', 'ACCESS', 'ACCORDING', 'ACTION', 'ADA', 'ADD', 'ADMIN', 'AFTER', 'AGGREGATE', 'ALIAS', 'ALLOCATE', 'ALSO', 'ALTER', 'ALWAYS', 'ARE', 'ARRAY_AGG', 'ASENSITIVE', 'ASSERTION', 'ASSIGNMENT', 'AT', 'ATOMIC', 'ATTRIBUTE', 'ATTRIBUTES', 'AVG', 'BACKWARD', 'BASE64', 'BEFORE', 'BEGIN', 'BERNOULLI', 'BIT_LENGTH', 'BITVAR', 'BLOB', 'BOM', 'BREADTH', 'BY', 'C', 'CACHE', 'CALL', 'CALLED', 'CARDINALITY', 'CASCADE', 'CASCADED', 'CATALOG', 'CATALOG_NAME', 'CEIL', 'CEILING', 'CHAIN', 'CHAR_LENGTH', 'CHARACTER_LENGTH', 'CHARACTER_SET_CATALOG', 'CHARACTER_SET_NAME', 'CHARACTER_SET_SCHEMA', 'CHARACTERISTICS', 'CHARACTERS', 'CHECKED', 'CHECKPOINT', 'CLASS', 'CLASS_ORIGIN', 'CLOB', 'CLOSE', 'CLUSTER', 'COBOL', 'COLLATION', 'COLLATION_CATALOG', 'COLLATION_NAME', 'COLLATION_SCHEMA', 'COLLECT', 'COLUMN_NAME', 'COLUMNS', 'COMMAND_FUNCTION', 'COMMAND_FUNCTION_CODE', 'COMMENT', 'COMMIT', 'COMMITTED', 'COMPLETION', 'CONCURRENTLY', 'CONDITION', 'CONDITION_NUMBER', 'CONFIGURATION', 'CONNECT', 'CONNECTION', 'CONNECTION_NAME', 'CONSTRAINT_CATALOG', 'CONSTRAINT_NAME', 'CONSTRAINT_SCHEMA', 'CONSTRAINTS', 'CONSTRUCTOR', 'CONTAINS', 'CONTENT', 'CONTINUE', 'CONVERSION', 'CONVERT', 'COPY', 'CORR', 'CORRESPONDING', 'COST', 'COUNT', 'COVAR_POP', 'COVAR_SAMP', 'CREATEDB', 'CREATEROLE', 'CREATEUSER', 'CSV', 'CUBE', 'CUME_DIST', 'CURRENT', 'CURRENT_DEFAULT_TRANSFORM_GROUP', 'CURRENT_PATH', 'CURRENT_TRANSFORM_GROUP_FOR_TYPE', 'CURSOR', 'CURSOR_NAME', 'CYCLE', 'DATA', 'DATABASE', 'DATE', 'DATETIME_INTERVAL_CODE', 'DATETIME_INTERVAL_PRECISION', 'DAY', 'DEALLOCATE', 'DECLARE', 'DEFAULTS', 'DEFERRED', 'DEFINED', 'DEFINER', 'DEGREE', 'DELETE', 'DELIMITER', 'DELIMITERS', 'DENSE_RANK', 'DEPTH', 'DEREF', 'DERIVED', 'DESCRIBE', 'DESCRIPTOR', 'DESTROY', 'DESTRUCTOR', 'DETERMINISTIC', 'DIAGNOSTICS', 'DICTIONARY', 'DISABLE', 'DISCARD', 'DISCONNECT', 'DISPATCH', 'DOCUMENT', 'DOMAIN', 'DOUBLE', 'DROP', 'DYNAMIC', 'DYNAMIC_FUNCTION', 'DYNAMIC_FUNCTION_CODE', 'EACH', 'ELEMENT', 'EMPTY', 'ENABLE', 'ENCODING', 'ENCRYPTED', 'END-EXEC', 'ENUM', 'EQUALS', 'ESCAPE', 'EVERY', 'EXCEPTION', 'EXCLUDE', 'EXCLUDING', 'EXCLUSIVE', 'EXEC', 'EXECUTE', 'EXISTING', 'EXP', 'EXPLAIN', 'EXTERNAL', 'FAMILY', 'FILTER', 'FINAL', 'FIRST', 'FIRST_VALUE', 'FLAG', 'FLOOR', 'FOLLOWING', 'FORCE', 'FORTRAN', 'FORWARD', 'FOUND', 'FREE', 'FUNCTION', 'FUSION', 'G', 'GENERAL', 'GENERATED', 'GET', 'GLOBAL', 'GO', 'GOTO', 'GRANTED', 'GROUPING', 'HANDLER', 'HEADER', 'HEX', 'HIERARCHY', 'HOLD', 'HOST', 'HOUR', # 'ID', 'IDENTITY', 'IF', 'IGNORE', 'IMMEDIATE', 'IMMUTABLE', 'IMPLEMENTATION', 'IMPLICIT', 'INCLUDING', 'INCREMENT', 'INDENT', 'INDEX', 'INDEXES', 'INDICATOR', 'INFIX', 'INHERIT', 'INHERITS', 'INITIALIZE', 'INPUT', 'INSENSITIVE', 'INSERT', 'INSTANCE', 'INSTANTIABLE', 'INSTEAD', 'INTERSECTION', 'INVOKER', 'ISOLATION', 'ITERATE', 'K', 'KEY', 'KEY_MEMBER', 'KEY_TYPE', 'LAG', 'LANCOMPILER', 'LANGUAGE', 'LARGE', 'LAST', 'LAST_VALUE', 'LATERAL', 'LC_COLLATE', 'LC_CTYPE', 'LEAD', 'LENGTH', 'LESS', 'LEVEL', 'LIKE_REGEX', 'LISTEN', 'LN', 'LOAD', 'LOCAL', 'LOCATION', 'LOCATOR', 'LOCK', 'LOGIN', 'LOWER', 'M', 'MAP', 'MAPPING', 'MATCH', 'MATCHED', 'MAX', 'MAX_CARDINALITY', 'MAXVALUE', 'MEMBER', 'MERGE', 'MESSAGE_LENGTH', 'MESSAGE_OCTET_LENGTH', 'MESSAGE_TEXT', 'METHOD', 'MIN', 'MINUTE', 'MINVALUE', 'MOD', 'MODE', 'MODIFIES', 'MODIFY', 'MODULE', 'MONTH', 'MORE', 'MOVE', 'MULTISET', 'MUMPS', # 'NAME', 'NAMES', 'NAMESPACE', 'NCLOB', 'NESTING', 'NEXT', 'NFC', 'NFD', 'NFKC', 'NFKD', 'NIL', 'NO', 'NOCREATEDB', 'NOCREATEROLE', 'NOCREATEUSER', 'NOINHERIT', 'NOLOGIN', 'NORMALIZE', 'NORMALIZED', 'NOSUPERUSER', 'NOTHING', 'NOTIFY', 'NOWAIT', 'NTH_VALUE', 'NTILE', 'NULLABLE', 'NULLS', 'NUMBER', 'OBJECT', 'OCCURRENCES_REGEX', 'OCTET_LENGTH', 'OCTETS', 'OF', 'OIDS', 'OPEN', 'OPERATION', 'OPERATOR', 'OPTION', 'OPTIONS', 'ORDERING', 'ORDINALITY', 'OTHERS', 'OUTPUT', 'OVER', 'OVERRIDING', 'OWNED', 'OWNER', 'P', 'PAD', 'PARAMETER', 'PARAMETER_MODE', 'PARAMETER_NAME', 'PARAMETER_ORDINAL_POSITION', 'PARAMETER_SPECIFIC_CATALOG', 'PARAMETER_SPECIFIC_NAME', 'PARAMETER_SPECIFIC_SCHEMA', 'PARAMETERS', 'PARSER', 'PARTIAL', 'PARTITION', 'PASCAL', 'PASSING', # 'PASSWORD', 'PATH', 'PERCENT_RANK', 'PERCENTILE_CONT', 'PERCENTILE_DISC', 'PLANS', 'PLI', 'POSITION_REGEX', 'POSTFIX', 'POWER', 'PRECEDING', 'PREFIX', 'PREORDER', 'PREPARE', 'PREPARED', 'PRESERVE', 'PRIOR', 'PRIVILEGES', 'PROCEDURAL', 'PROCEDURE', 'PUBLIC', 'QUOTE', 'RANGE', 'RANK', 'READ', 'READS', 'REASSIGN', 'RECHECK', 'RECURSIVE', 'REF', 'REFERENCING', 'REGR_AVGX', 'REGR_AVGY', 'REGR_COUNT', 'REGR_INTERCEPT', 'REGR_R2', 'REGR_SLOPE', 'REGR_SXX', 'REGR_SXY', 'REGR_SYY', 'REINDEX', 'RELATIVE', 'RELEASE', 'RENAME', 'REPEATABLE', 'REPLACE', 'REPLICA', 'RESET', 'RESPECT', 'RESTART', 'RESTRICT', 'RESULT', 'RETURN', 'RETURNED_CARDINALITY', 'RETURNED_LENGTH', 'RETURNED_OCTET_LENGTH', 'RETURNED_SQLSTATE', 'RETURNS', 'REVOKE', # 'ROLE', 'ROLLBACK', 'ROLLUP', 'ROUTINE', 'ROUTINE_CATALOG', 'ROUTINE_NAME', 'ROUTINE_SCHEMA', 'ROW_COUNT', 'ROW_NUMBER', 'ROWS', 'RULE', 'SAVEPOINT', 'SCALE', 'SCHEMA', 'SCHEMA_NAME', 'SCOPE', 'SCOPE_CATALOG', 'SCOPE_NAME', 'SCOPE_SCHEMA', 'SCROLL', 'SEARCH', 'SECOND', 'SECTION', 'SECURITY', 'SELF', 'SENSITIVE', 'SEQUENCE', 'SERIALIZABLE', 'SERVER', 'SERVER_NAME', 'SESSION', 'SET', 'SETS', 'SHARE', 'SHOW', 'SIMPLE', 'SIZE', 'SOURCE', 'SPACE', 'SPECIFIC', 'SPECIFIC_NAME', 'SPECIFICTYPE', 'SQL', 'SQLCODE', 'SQLERROR', 'SQLEXCEPTION', 'SQLSTATE', 'SQLWARNING', 'SQRT', 'STABLE', 'STANDALONE', 'START', 'STATE', 'STATEMENT', 'STATIC', 'STATISTICS', 'STDDEV_POP', 'STDDEV_SAMP', 'STDIN', 'STDOUT', 'STORAGE', 'STRICT', 'STRIP', 'STRUCTURE', 'STYLE', 'SUBCLASS_ORIGIN', 'SUBLIST', 'SUBMULTISET', 'SUBSTRING_REGEX', 'SUM', 'SUPERUSER', 'SYSID', 'SYSTEM', 'SYSTEM_USER', 'T', # 'TABLE_NAME', 'TABLESAMPLE', 'TABLESPACE', 'TEMP', 'TEMPLATE', 'TEMPORARY', 'TERMINATE', 'TEXT', 'THAN', 'TIES', 'TIMEZONE_HOUR', 'TIMEZONE_MINUTE', 'TOP_LEVEL_COUNT', 'TRANSACTION', 'TRANSACTION_ACTIVE', 'TRANSACTIONS_COMMITTED', 'TRANSACTIONS_ROLLED_BACK', 'TRANSFORM', 'TRANSFORMS', 'TRANSLATE', 'TRANSLATE_REGEX', 'TRANSLATION', 'TRIGGER', 'TRIGGER_CATALOG', 'TRIGGER_NAME', 'TRIGGER_SCHEMA', 'TRIM_ARRAY', 'TRUNCATE', 'TRUSTED', 'TYPE', 'UESCAPE', 'UNBOUNDED', 'UNCOMMITTED', 'UNDER', 'UNENCRYPTED', 'UNKNOWN', 'UNLISTEN', 'UNNAMED', 'UNNEST', 'UNTIL', 'UNTYPED', 'UPDATE', 'UPPER', 'URI', 'USAGE', 'USER_DEFINED_TYPE_CATALOG', 'USER_DEFINED_TYPE_CODE', 'USER_DEFINED_TYPE_NAME', 'USER_DEFINED_TYPE_SCHEMA', 'VACUUM', 'VALID', 'VALIDATOR', 'VALUE', 'VAR_POP', 'VAR_SAMP', 'VARBINARY', 'VARIABLE', 'VARYING', 'VERSION', 'VIEW', 'VOLATILE', 'WHENEVER', 'WHITESPACE', 'WIDTH_BUCKET', 'WINDOW', 'WITHIN', 'WITHOUT', 'WORK', 'WRAPPER', 'WRITE', 'XML', 'XMLAGG', 'XMLBINARY', 'XMLCAST', 'XMLCOMMENT', 'XMLDECLARATION', 'XMLDOCUMENT', 'XMLEXISTS', 'XMLITERATE', 'XMLNAMESPACES', 'XMLQUERY', 'XMLSCHEMA', 'XMLTABLE', 'XMLTEXT', 'XMLVALIDATE', 'YEAR', 'YES', 'ZONE', )) #Thanks villas FIREBIRD = set(( 'ABS', 'ACTIVE', 'ADMIN', 'AFTER', 'ASCENDING', 'AUTO', 'AUTODDL', 'BASED', 'BASENAME', 'BASE_NAME', 'BEFORE', 'BIT_LENGTH', 'BLOB', 'BLOBEDIT', 'BOOLEAN', 'BOTH', 'BUFFER', 'CACHE', 'CHAR_LENGTH', 'CHARACTER_LENGTH', 'CHECK_POINT_LEN', 'CHECK_POINT_LENGTH', 'CLOSE', 'COMMITTED', 'COMPILETIME', 'COMPUTED', 'CONDITIONAL', 'CONNECT', 'CONTAINING', 'CROSS', 'CSTRING', 'CURRENT_CONNECTION', 'CURRENT_ROLE', 'CURRENT_TRANSACTION', 'CURRENT_USER', 'DATABASE', 'DB_KEY', 'DEBUG', 'DESCENDING', 'DISCONNECT', 'DISPLAY', 'DO', 'ECHO', 'EDIT', 'ENTRY_POINT', 'EVENT', 'EXIT', 'EXTERN', 'FALSE', 'FETCH', 'FILE', 'FILTER', 'FREE_IT', 'FUNCTION', 'GDSCODE', 'GENERATOR', 'GEN_ID', 'GLOBAL', 'GROUP_COMMIT_WAIT', 'GROUP_COMMIT_WAIT_TIME', 'HELP', 'IF', 'INACTIVE', 'INDEX', 'INIT', 'INPUT_TYPE', 'INSENSITIVE', 'ISQL', 'LC_MESSAGES', 'LC_TYPE', 'LEADING', 'LENGTH', 'LEV', 'LOGFILE', 'LOG_BUFFER_SIZE', 'LOG_BUF_SIZE', 'LONG', 'LOWER', 'MANUAL', 'MAXIMUM', 'MAXIMUM_SEGMENT', 'MAX_SEGMENT', 'MERGE', 'MESSAGE', 'MINIMUM', 'MODULE_NAME', 'NOAUTO', 'NUM_LOG_BUFS', 'NUM_LOG_BUFFERS', 'OCTET_LENGTH', 'OPEN', 'OUTPUT_TYPE', 'OVERFLOW', 'PAGE', 'PAGELENGTH', 'PAGES', 'PAGE_SIZE', 'PARAMETER', # 'PASSWORD', 'PLAN', 'POST_EVENT', 'QUIT', 'RAW_PARTITIONS', 'RDB$DB_KEY', 'RECORD_VERSION', 'RECREATE', 'RECURSIVE', 'RELEASE', 'RESERV', 'RESERVING', 'RETAIN', 'RETURN', 'RETURNING_VALUES', 'RETURNS', # 'ROLE', 'ROW_COUNT', 'ROWS', 'RUNTIME', 'SAVEPOINT', 'SECOND', 'SENSITIVE', 'SHADOW', 'SHARED', 'SHELL', 'SHOW', 'SINGULAR', 'SNAPSHOT', 'SORT', 'STABILITY', 'START', 'STARTING', 'STARTS', 'STATEMENT', 'STATIC', 'STATISTICS', 'SUB_TYPE', 'SUSPEND', 'TERMINATOR', 'TRAILING', 'TRIGGER', 'TRIM', 'TRUE', 'TYPE', 'UNCOMMITTED', 'UNKNOWN', 'USING', 'VARIABLE', 'VERSION', 'WAIT', 'WEEKDAY', 'WHILE', 'YEARDAY', )) FIREBIRD_NONRESERVED = set(( 'BACKUP', 'BLOCK', 'COALESCE', 'COLLATION', 'COMMENT', 'DELETING', 'DIFFERENCE', 'IIF', 'INSERTING', 'LAST', 'LEAVE', 'LOCK', 'NEXT', 'NULLIF', 'NULLS', 'RESTART', 'RETURNING', 'SCALAR_ARRAY', 'SEQUENCE', 'STATEMENT', 'UPDATING', 'ABS', 'ACCENT', 'ACOS', 'ALWAYS', 'ASCII_CHAR', 'ASCII_VAL', 'ASIN', 'ATAN', 'ATAN2', 'BACKUP', 'BIN_AND', 'BIN_OR', 'BIN_SHL', 'BIN_SHR', 'BIN_XOR', 'BLOCK', 'CEIL', 'CEILING', 'COLLATION', 'COMMENT', 'COS', 'COSH', 'COT', 'DATEADD', 'DATEDIFF', 'DECODE', 'DIFFERENCE', 'EXP', 'FLOOR', 'GEN_UUID', 'GENERATED', 'HASH', 'IIF', 'LIST', 'LN', 'LOG', 'LOG10', 'LPAD', 'MATCHED', 'MATCHING', 'MAXVALUE', 'MILLISECOND', 'MINVALUE', 'MOD', 'NEXT', 'OVERLAY', 'PAD', 'PI', 'PLACING', 'POWER', 'PRESERVE', 'RAND', 'REPLACE', 'RESTART', 'RETURNING', 'REVERSE', 'ROUND', 'RPAD', 'SCALAR_ARRAY', 'SEQUENCE', 'SIGN', 'SIN', 'SINH', 'SPACE', 'SQRT', 'TAN', 'TANH', 'TEMPORARY', 'TRUNC', 'WEEK', )) # Thanks Jonathan Lundell MYSQL = set(( 'ACCESSIBLE', 'ADD', 'ALL', 'ALTER', 'ANALYZE', 'AND', 'AS', 'ASC', 'ASENSITIVE', 'BEFORE', 'BETWEEN', 'BIGINT', 'BINARY', 'BLOB', 'BOTH', 'BY', 'CALL', 'CASCADE', 'CASE', 'CHANGE', 'CHAR', 'CHARACTER', 'CHECK', 'COLLATE', 'COLUMN', 'CONDITION', 'CONSTRAINT', 'CONTINUE', 'CONVERT', 'CREATE', 'CROSS', 'CURRENT_DATE', 'CURRENT_TIME', 'CURRENT_TIMESTAMP', 'CURRENT_USER', 'CURSOR', 'DATABASE', 'DATABASES', 'DAY_HOUR', 'DAY_MICROSECOND', 'DAY_MINUTE', 'DAY_SECOND', 'DEC', 'DECIMAL', 'DECLARE', 'DEFAULT', 'DELAYED', 'DELETE', 'DESC', 'DESCRIBE', 'DETERMINISTIC', 'DISTINCT', 'DISTINCTROW', 'DIV', 'DOUBLE', 'DROP', 'DUAL', 'EACH', 'ELSE', 'ELSEIF', 'ENCLOSED', 'ESCAPED', 'EXISTS', 'EXIT', 'EXPLAIN', 'FALSE', 'FETCH', 'FLOAT', 'FLOAT4', 'FLOAT8', 'FOR', 'FORCE', 'FOREIGN', 'FROM', 'FULLTEXT', 'GRANT', 'GROUP', 'HAVING', 'HIGH_PRIORITY', 'HOUR_MICROSECOND', 'HOUR_MINUTE', 'HOUR_SECOND', 'IF', 'IGNORE', 'IGNORE_SERVER_IDS', 'IGNORE_SERVER_IDS', 'IN', 'INDEX', 'INFILE', 'INNER', 'INOUT', 'INSENSITIVE', 'INSERT', 'INT', 'INT1', 'INT2', 'INT3', 'INT4', 'INT8', 'INTEGER', 'INTERVAL', 'INTO', 'IS', 'ITERATE', 'JOIN', 'KEY', 'KEYS', 'KILL', 'LEADING', 'LEAVE', 'LEFT', 'LIKE', 'LIMIT', 'LINEAR', 'LINES', 'LOAD', 'LOCALTIME', 'LOCALTIMESTAMP', 'LOCK', 'LONG', 'LONGBLOB', 'LONGTEXT', 'LOOP', 'LOW_PRIORITY', 'MASTER_HEARTBEAT_PERIOD', 'MASTER_HEARTBEAT_PERIOD', 'MASTER_SSL_VERIFY_SERVER_CERT', 'MATCH', 'MAXVALUE', 'MAXVALUE', 'MEDIUMBLOB', 'MEDIUMINT', 'MEDIUMTEXT', 'MIDDLEINT', 'MINUTE_MICROSECOND', 'MINUTE_SECOND', 'MOD', 'MODIFIES', 'NATURAL', 'NO_WRITE_TO_BINLOG', 'NOT', 'NULL', 'NUMERIC', 'ON', 'OPTIMIZE', 'OPTION', 'OPTIONALLY', 'OR', 'ORDER', 'OUT', 'OUTER', 'OUTFILE', 'PRECISION', 'PRIMARY', 'PROCEDURE', 'PURGE', 'RANGE', 'READ', 'READ_WRITE', 'READS', 'REAL', 'REFERENCES', 'REGEXP', 'RELEASE', 'RENAME', 'REPEAT', 'REPLACE', 'REQUIRE', 'RESIGNAL', 'RESIGNAL', 'RESTRICT', 'RETURN', 'REVOKE', 'RIGHT', 'RLIKE', 'SCHEMA', 'SCHEMAS', 'SECOND_MICROSECOND', 'SELECT', 'SENSITIVE', 'SEPARATOR', 'SET', 'SHOW', 'SIGNAL', 'SIGNAL', 'SMALLINT', 'SPATIAL', 'SPECIFIC', 'SQL', 'SQL_BIG_RESULT', 'SQL_CALC_FOUND_ROWS', 'SQL_SMALL_RESULT', 'SQLEXCEPTION', 'SQLSTATE', 'SQLWARNING', 'SSL', 'STARTING', 'STRAIGHT_JOIN', 'TABLE', 'TERMINATED', 'THEN', 'TINYBLOB', 'TINYINT', 'TINYTEXT', 'TO', 'TRAILING', 'TRIGGER', 'TRUE', 'UNDO', 'UNION', 'UNIQUE', 'UNLOCK', 'UNSIGNED', 'UPDATE', 'USAGE', 'USE', 'USING', 'UTC_DATE', 'UTC_TIME', 'UTC_TIMESTAMP', 'VALUES', 'VARBINARY', 'VARCHAR', 'VARCHARACTER', 'VARYING', 'WHEN', 'WHERE', 'WHILE', 'WITH', 'WRITE', 'XOR', 'YEAR_MONTH', 'ZEROFILL', )) MSSQL = set(( 'ADD', 'ALL', 'ALTER', 'AND', 'ANY', 'AS', 'ASC', 'AUTHORIZATION', 'BACKUP', 'BEGIN', 'BETWEEN', 'BREAK', 'BROWSE', 'BULK', 'BY', 'CASCADE', 'CASE', 'CHECK', 'CHECKPOINT', 'CLOSE', 'CLUSTERED', 'COALESCE', 'COLLATE', 'COLUMN', 'COMMIT', 'COMPUTE', 'CONSTRAINT', 'CONTAINS', 'CONTAINSTABLE', 'CONTINUE', 'CONVERT', 'CREATE', 'CROSS', 'CURRENT', 'CURRENT_DATE', 'CURRENT_TIME', 'CURRENT_TIMESTAMP', 'CURRENT_USER', 'CURSOR', 'DATABASE', 'DBCC', 'DEALLOCATE', 'DECLARE', 'DEFAULT', 'DELETE', 'DENY', 'DESC', 'DISK', 'DISTINCT', 'DISTRIBUTED', 'DOUBLE', 'DROP', 'DUMMY', 'DUMP', 'ELSE', 'END', 'ERRLVL', 'ESCAPE', 'EXCEPT', 'EXEC', 'EXECUTE', 'EXISTS', 'EXIT', 'FETCH', 'FILE', 'FILLFACTOR', 'FOR', 'FOREIGN', 'FREETEXT', 'FREETEXTTABLE', 'FROM', 'FULL', 'FUNCTION', 'GOTO', 'GRANT', 'GROUP', 'HAVING', 'HOLDLOCK', 'IDENTITY', 'IDENTITY_INSERT', 'IDENTITYCOL', 'IF', 'IN', 'INDEX', 'INNER', 'INSERT', 'INTERSECT', 'INTO', 'IS', 'JOIN', 'KEY', 'KILL', 'LEFT', 'LIKE', 'LINENO', 'LOAD', 'NATIONAL ', 'NOCHECK', 'NONCLUSTERED', 'NOT', 'NULL', 'NULLIF', 'OF', 'OFF', 'OFFSETS', 'ON', 'OPEN', 'OPENDATASOURCE', 'OPENQUERY', 'OPENROWSET', 'OPENXML', 'OPTION', 'OR', 'ORDER', 'OUTER', 'OVER', 'PERCENT', 'PLAN', 'PRECISION', 'PRIMARY', 'PRINT', 'PROC', 'PROCEDURE', 'PUBLIC', 'RAISERROR', 'READ', 'READTEXT', 'RECONFIGURE', 'REFERENCES', 'REPLICATION', 'RESTORE', 'RESTRICT', 'RETURN', 'REVOKE', 'RIGHT', 'ROLLBACK', 'ROWCOUNT', 'ROWGUIDCOL', 'RULE', 'SAVE', 'SCHEMA', 'SELECT', 'SESSION_USER', 'SET', 'SETUSER', 'SHUTDOWN', 'SOME', 'STATISTICS', 'SYSTEM_USER', 'TABLE', 'TEXTSIZE', 'THEN', 'TO', 'TOP', 'TRAN', 'TRANSACTION', 'TRIGGER', 'TRUNCATE', 'TSEQUAL', 'UNION', 'UNIQUE', 'UPDATE', 'UPDATETEXT', 'USE', 'USER', 'VALUES', 'VARYING', 'VIEW', 'WAITFOR', 'WHEN', 'WHERE', 'WHILE', 'WITH', 'WRITETEXT', )) ORACLE = set(( 'ACCESS', 'ADD', 'ALL', 'ALTER', 'AND', 'ANY', 'AS', 'ASC', 'AUDIT', 'BETWEEN', 'BY', 'CHAR', 'CHECK', 'CLUSTER', 'COLUMN', 'COMMENT', 'COMPRESS', 'CONNECT', 'CREATE', 'CURRENT', 'DATE', 'DECIMAL', 'DEFAULT', 'DELETE', 'DESC', 'DISTINCT', 'DROP', 'ELSE', 'EXCLUSIVE', 'EXISTS', 'FILE', 'FLOAT', 'FOR', 'FROM', 'GRANT', 'GROUP', 'HAVING', 'IDENTIFIED', 'IMMEDIATE', 'IN', 'INCREMENT', 'INDEX', 'INITIAL', 'INSERT', 'INTEGER', 'INTERSECT', 'INTO', 'IS', 'LEVEL', 'LIKE', 'LOCK', 'LONG', 'MAXEXTENTS', 'MINUS', 'MLSLABEL', 'MODE', 'MODIFY', 'NOAUDIT', 'NOCOMPRESS', 'NOT', 'NOWAIT', 'NULL', 'NUMBER', 'OF', 'OFFLINE', 'ON', 'ONLINE', 'OPTION', 'OR', 'ORDER', 'PCTFREE', 'PRIOR', 'PRIVILEGES', 'PUBLIC', 'RAW', 'RENAME', 'RESOURCE', 'REVOKE', 'ROW', 'ROWID', 'ROWNUM', 'ROWS', 'SELECT', 'SESSION', 'SET', 'SHARE', 'SIZE', 'SMALLINT', 'START', 'SUCCESSFUL', 'SYNONYM', 'SYSDATE', 'TABLE', 'THEN', 'TO', 'TRIGGER', 'UID', 'UNION', 'UNIQUE', 'UPDATE', 'USER', 'VALIDATE', 'VALUES', 'VARCHAR', 'VARCHAR2', 'VIEW', 'WHENEVER', 'WHERE', 'WITH', )) SQLITE = set(( 'ABORT', 'ACTION', 'ADD', 'AFTER', 'ALL', 'ALTER', 'ANALYZE', 'AND', 'AS', 'ASC', 'ATTACH', 'AUTOINCREMENT', 'BEFORE', 'BEGIN', 'BETWEEN', 'BY', 'CASCADE', 'CASE', 'CAST', 'CHECK', 'COLLATE', 'COLUMN', 'COMMIT', 'CONFLICT', 'CONSTRAINT', 'CREATE', 'CROSS', 'CURRENT_DATE', 'CURRENT_TIME', 'CURRENT_TIMESTAMP', 'DATABASE', 'DEFAULT', 'DEFERRABLE', 'DEFERRED', 'DELETE', 'DESC', 'DETACH', 'DISTINCT', 'DROP', 'EACH', 'ELSE', 'END', 'ESCAPE', 'EXCEPT', 'EXCLUSIVE', 'EXISTS', 'EXPLAIN', 'FAIL', 'FOR', 'FOREIGN', 'FROM', 'FULL', 'GLOB', 'GROUP', 'HAVING', 'IF', 'IGNORE', 'IMMEDIATE', 'IN', 'INDEX', 'INDEXED', 'INITIALLY', 'INNER', 'INSERT', 'INSTEAD', 'INTERSECT', 'INTO', 'IS', 'ISNULL', 'JOIN', 'KEY', 'LEFT', 'LIKE', 'LIMIT', 'MATCH', 'NATURAL', 'NO', 'NOT', 'NOTNULL', 'NULL', 'OF', 'OFFSET', 'ON', 'OR', 'ORDER', 'OUTER', 'PLAN', 'PRAGMA', 'PRIMARY', 'QUERY', 'RAISE', 'REFERENCES', 'REGEXP', 'REINDEX', 'RELEASE', 'RENAME', 'REPLACE', 'RESTRICT', 'RIGHT', 'ROLLBACK', 'ROW', 'SAVEPOINT', 'SELECT', 'SET', 'TABLE', 'TEMP', 'TEMPORARY', 'THEN', 'TO', 'TRANSACTION', 'TRIGGER', 'UNION', 'UNIQUE', 'UPDATE', 'USING', 'VACUUM', 'VALUES', 'VIEW', 'VIRTUAL', 'WHEN', 'WHERE', )) MONGODB_NONRESERVED = set(('SAFE',)) # remove from here when you add a list. JDBCSQLITE = SQLITE DB2 = INFORMIX = INGRES = JDBCPOSTGRESQL = COMMON ADAPTERS = { 'sqlite': SQLITE, 'mysql': MYSQL, 'postgres': POSTGRESQL, 'postgres_nonreserved': POSTGRESQL_NONRESERVED, 'oracle': ORACLE, 'mssql': MSSQL, 'mssql2': MSSQL, 'db2': DB2, 'informix': INFORMIX, 'firebird': FIREBIRD, 'firebird_embedded': FIREBIRD, 'firebird_nonreserved': FIREBIRD_NONRESERVED, 'ingres': INGRES, 'ingresu': INGRES, 'jdbc:sqlite': JDBCSQLITE, 'jdbc:postgres': JDBCPOSTGRESQL, 'common': COMMON, 'mongodb_nonreserved': MONGODB_NONRESERVED } ADAPTERS['all'] = reduce(lambda a, b: a.union(b), ( x for x in ADAPTERS.values())) web2py-2.12.3.orig/gluon/packages/dal/pydal/adapters/0000775000000000000000000000000012564727432021040 5ustar rootrootweb2py-2.12.3.orig/gluon/packages/dal/pydal/adapters/postgres.py0000664000000000000000000004422712564727432023271 0ustar rootroot# -*- coding: utf-8 -*- import re from .._globals import IDENTITY from ..drivers import psycopg2_adapt from .._compat import PY2 from ..helpers.methods import varquote_aux from .base import BaseAdapter from ..objects import Expression class PostgreSQLAdapter(BaseAdapter): drivers = ('psycopg2','pg8000') QUOTE_TEMPLATE = '"%s"' support_distributed_transaction = True types = { 'boolean': 'CHAR(1)', 'string': 'VARCHAR(%(length)s)', 'text': 'TEXT', 'json': 'TEXT', 'password': 'VARCHAR(%(length)s)', 'blob': 'BYTEA', 'upload': 'VARCHAR(%(length)s)', 'integer': 'INTEGER', 'bigint': 'BIGINT', 'float': 'FLOAT', 'double': 'FLOAT8', 'decimal': 'NUMERIC(%(precision)s,%(scale)s)', 'date': 'DATE', 'time': 'TIME', 'datetime': 'TIMESTAMP', 'id': 'SERIAL PRIMARY KEY', 'reference': 'INTEGER REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s %(null)s %(unique)s', 'list:integer': 'TEXT', 'list:string': 'TEXT', 'list:reference': 'TEXT', 'geometry': 'GEOMETRY', 'geography': 'GEOGRAPHY', 'big-id': 'BIGSERIAL PRIMARY KEY', 'big-reference': 'BIGINT REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s %(null)s %(unique)s', 'reference FK': ', CONSTRAINT "FK_%(constraint_name)s" FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference TFK': ' CONSTRAINT "FK_%(foreign_table)s_PK" FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_table)s (%(foreign_key)s) ON DELETE %(on_delete_action)s', } def varquote(self, name): return varquote_aux(name, '"%s"') def adapt(self, obj): if self.driver_name == 'psycopg2': adapted = psycopg2_adapt(obj) adapted.prepare(self.connection) rv = adapted.getquoted() if not PY2: if isinstance(rv, bytes): return rv.decode('utf-8') return rv elif self.driver_name == 'pg8000': return "'%s'" % obj.replace("%", "%%").replace("'", "''") else: return "'%s'" % obj.replace("'", "''") def sequence_name(self, table): return self.QUOTE_TEMPLATE % (table + '_id_seq') def RANDOM(self): return 'RANDOM()' def ADD(self, first, second): t = first.type if t in ('text','string','password', 'json', 'upload','blob'): return '(%s || %s)' % (self.expand(first), self.expand(second, t)) else: return '(%s + %s)' % (self.expand(first), self.expand(second, t)) def distributed_transaction_begin(self, key): return def prepare(self,key): self.execute("PREPARE TRANSACTION '%s';" % key) def commit_prepared(self,key): self.execute("COMMIT PREPARED '%s';" % key) def rollback_prepared(self,key): self.execute("ROLLBACK PREPARED '%s';" % key) def create_sequence_and_triggers(self, query, table, **args): # following lines should only be executed if table._sequence_name does not exist # self.execute('CREATE SEQUENCE %s;' % table._sequence_name) # self.execute("ALTER TABLE %s ALTER COLUMN %s SET DEFAULT NEXTVAL('%s');" \ # % (table._tablename, table._fieldname, table._sequence_name)) self.execute(query) REGEX_URI = re.compile('^(?P[^:@]+)(\:(?P[^@]*))?@(?P[^\:@]+)(\:(?P[0-9]+))?/(?P[^\?]+)(\?sslmode=(?P.+))?$') def __init__(self, db,uri, pool_size=0, folder=None, db_codec ='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, srid=4326, after_connection=None): self.db = db self.dbengine="postgres" self.uri = uri if do_connect: self.find_driver(adapter_args, uri) self.pool_size = pool_size self.folder = folder self.db_codec = db_codec self._after_connection = after_connection self.srid = srid self.find_or_make_work_folder() self._last_insert = None # for INSERT ... RETURNING ID self.TRUE_exp = 'TRUE' self.FALSE_exp = 'FALSE' ruri = uri.split('://',1)[1] m = self.REGEX_URI.match(ruri) if not m: raise SyntaxError("Invalid URI string in DAL") user = credential_decoder(m.group('user')) if not user: raise SyntaxError('User required') password = credential_decoder(m.group('password')) if not password: password = '' host = m.group('host') if not host: raise SyntaxError('Host name required') db = m.group('db') if not db: raise SyntaxError('Database name required') port = m.group('port') or '5432' sslmode = m.group('sslmode') driver_args['database'] = db driver_args['user'] = user driver_args['host'] = host driver_args['port'] = int(port) driver_args['password'] = password if sslmode: driver_args['sslmode'] = sslmode # choose diver according uri if self.driver: self.__version__ = "%s %s" % (self.driver.__name__, self.driver.__version__) else: self.__version__ = None def connector(driver_args=driver_args): return self.driver.connect(**driver_args) self.connector=connector if do_connect: self.reconnect() def after_connection(self): #self.connection.set_client_encoding('UTF8') #pg8000 doesn't have a native set_client_encoding self.execute("SET CLIENT_ENCODING TO 'UTF8'") self.execute("SET standard_conforming_strings=on;") self.try_json() def _insert(self, table, fields): table_rname = table.sqlsafe if fields: keys = ','.join(f.sqlsafe_name for f, v in fields) values = ','.join(self.expand(v, f.type) for f, v in fields) if hasattr(table, '_id'): self._last_insert = (table._id, 1) return 'INSERT INTO %s(%s) VALUES (%s) RETURNING %s;' % ( table_rname, keys, values, self.QUOTE_TEMPLATE % table._id.name) else: self._last_insert = None return 'INSERT INTO %s(%s) VALUES (%s);' % (table_rname, keys, values) else: self._last_insert return self._insert_empty(table) def lastrowid(self, table=None): if self._last_insert: return int(self.cursor.fetchone()[0]) else: self.execute("select lastval()") return int(self.cursor.fetchone()[0]) def try_json(self): if self.driver_name == "pg8000": supports_json = self.connection._server_version >= "9.2.0" elif (self.driver_name == "psycopg2" and self.driver.__version__ >= "2.0.12"): supports_json = self.connection.server_version >= 90200 elif self.driver_name == "zxJDBC": supports_json = self.connection.dbversion >= "9.2.0" else: supports_json = None if supports_json: self.types["json"] = "JSON" if ((self.driver_name == "psycopg2" and self.driver.__version__ >= '2.5.0') or (self.driver_name == "pg8000" and self.driver.__version__ >= '1.10.2')): self.driver_auto_json = ['loads'] else: self.db.logger.debug("Your database version does not support the JSON" " data type (using TEXT instead)") def LIKE(self, first, second, escape=None): """Case sensitive like operator""" if isinstance(second, Expression): second = self.expand(second, 'string') else: second = self.expand(second, 'string') if escape is None: escape = '\\' second = second.replace(escape, escape * 2) if first.type not in ('string', 'text', 'json'): return "(%s LIKE %s ESCAPE '%s')" % ( self.CAST(self.expand(first), 'CHAR(%s)' % first.length), second, escape ) else: return "(%s LIKE %s ESCAPE '%s')" % (self.expand(first), second, escape) def ILIKE(self, first, second, escape=None): """Case sensitive like operator""" if isinstance(second, Expression): second = self.expand(second, 'string') else: second = self.expand(second, 'string') if escape is None: escape = '\\' second = second.replace(escape, escape * 2) if first.type not in ('string', 'text', 'json', 'list:string'): return "(%s ILIKE %s ESCAPE '%s')" % ( self.CAST(self.expand(first), 'CHAR(%s)' % first.length), second, escape ) else: return "(%s ILIKE %s ESCAPE '%s')" % (self.expand(first), second, escape) def REGEXP(self,first,second): return '(%s ~ %s)' % (self.expand(first), self.expand(second,'string')) # GIS functions def ST_ASGEOJSON(self, first, second): """ http://postgis.org/docs/ST_AsGeoJSON.html """ return 'ST_AsGeoJSON(%s,%s,%s,%s)' %(second['version'], self.expand(first), second['precision'], second['options']) def ST_ASTEXT(self, first): """ http://postgis.org/docs/ST_AsText.html """ return 'ST_AsText(%s)' %(self.expand(first)) def ST_X(self, first): """ http://postgis.org/docs/ST_X.html """ return 'ST_X(%s)' %(self.expand(first)) def ST_Y(self, first): """ http://postgis.org/docs/ST_Y.html """ return 'ST_Y(%s)' %(self.expand(first)) def ST_CONTAINS(self, first, second): """ http://postgis.org/docs/ST_Contains.html """ return 'ST_Contains(%s,%s)' %(self.expand(first), self.expand(second, first.type)) def ST_DISTANCE(self, first, second): """ http://postgis.org/docs/ST_Distance.html """ return 'ST_Distance(%s,%s)' %(self.expand(first), self.expand(second, first.type)) def ST_EQUALS(self, first, second): """ http://postgis.org/docs/ST_Equals.html """ return 'ST_Equals(%s,%s)' %(self.expand(first), self.expand(second, first.type)) def ST_INTERSECTS(self, first, second): """ http://postgis.org/docs/ST_Intersects.html """ return 'ST_Intersects(%s,%s)' %(self.expand(first), self.expand(second, first.type)) def ST_OVERLAPS(self, first, second): """ http://postgis.org/docs/ST_Overlaps.html """ return 'ST_Overlaps(%s,%s)' %(self.expand(first), self.expand(second, first.type)) def ST_SIMPLIFY(self, first, second): """ http://postgis.org/docs/ST_Simplify.html """ return 'ST_Simplify(%s,%s)' %(self.expand(first), self.expand(second, 'double')) def ST_SIMPLIFYPRESERVETOPOLOGY(self, first, second): """ http://postgis.org/docs/ST_SimplifyPreserveTopology.html """ return 'ST_SimplifyPreserveTopology(%s,%s)' %(self.expand(first), self.expand(second, 'double')) def ST_TOUCHES(self, first, second): """ http://postgis.org/docs/ST_Touches.html """ return 'ST_Touches(%s,%s)' %(self.expand(first), self.expand(second, first.type)) def ST_WITHIN(self, first, second): """ http://postgis.org/docs/ST_Within.html """ return 'ST_Within(%s,%s)' %(self.expand(first), self.expand(second, first.type)) def ST_DWITHIN(self, first, tup): """ http://postgis.org/docs/ST_DWithin.html """ second, third = tup return 'ST_DWithin(%s,%s,%s)' %(self.expand(first), self.expand(second, first.type), self.expand(third, 'double')) def represent(self, obj, fieldtype): field_is_type = fieldtype.startswith if field_is_type('geo'): srid = 4326 # postGIS default srid for geometry geotype, parms = fieldtype[:-1].split('(') parms = parms.split(',') if len(parms) >= 2: schema, srid = parms[:2] if field_is_type('geometry'): value = "ST_GeomFromText('%s',%s)" %(obj, srid) elif field_is_type('geography'): value = "ST_GeogFromText('SRID=%s;%s')" %(srid, obj) # else: # raise SyntaxError('Invalid field type %s' %fieldtype) return value return BaseAdapter.represent(self, obj, fieldtype) def _drop(self, table, mode='restrict'): if mode not in ['restrict', 'cascade', '']: raise ValueError('Invalid mode: %s' % mode) return ['DROP TABLE ' + table.sqlsafe + ' ' + str(mode) + ';'] def execute(self, *a, **b): if PY2 and self.driver_name == "pg8000": a = list(a) a[0] = a[0].decode('utf8') return BaseAdapter.execute(self, *a, **b) class NewPostgreSQLAdapter(PostgreSQLAdapter): drivers = ('psycopg2','pg8000') types = { 'boolean': 'CHAR(1)', 'string': 'VARCHAR(%(length)s)', 'text': 'TEXT', 'json': 'TEXT', 'password': 'VARCHAR(%(length)s)', 'blob': 'BYTEA', 'upload': 'VARCHAR(%(length)s)', 'integer': 'INTEGER', 'bigint': 'BIGINT', 'float': 'FLOAT', 'double': 'FLOAT8', 'decimal': 'NUMERIC(%(precision)s,%(scale)s)', 'date': 'DATE', 'time': 'TIME', 'datetime': 'TIMESTAMP', 'id': 'SERIAL PRIMARY KEY', 'reference': 'INTEGER REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s %(null)s %(unique)s', 'list:integer': 'BIGINT[]', 'list:string': 'TEXT[]', 'list:reference': 'BIGINT[]', 'geometry': 'GEOMETRY', 'geography': 'GEOGRAPHY', 'big-id': 'BIGSERIAL PRIMARY KEY', 'big-reference': 'BIGINT REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s %(null)s %(unique)s', 'reference FK': ', CONSTRAINT "FK_%(constraint_name)s" FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference TFK': ' CONSTRAINT "FK_%(foreign_table)s_PK" FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_table)s (%(foreign_key)s) ON DELETE %(on_delete_action)s', } def parse_list_integers(self, value, field_type): return value def parse_list_references(self, value, field_type): return [self.parse_reference(r, field_type[5:]) for r in value] def parse_list_strings(self, value, field_type): return value def represent(self, obj, fieldtype): field_is_type = fieldtype.startswith if field_is_type('list:'): if not obj: obj = [] elif not isinstance(obj, (list, tuple)): obj = [obj] if field_is_type('list:string'): obj = map(str,obj) else: obj = map(int,obj) return 'ARRAY[%s]' % ','.join(repr(item) for item in obj) return PostgreSQLAdapter.represent(self, obj, fieldtype) def CONTAINS(self, first, second, case_sensitive=True): if first.type.startswith('list'): f = self.expand(second, 'string') s = self.ANY(first) if case_sensitive is True: return self.EQ(f, s) else: return self.ILIKE(f, s, escape='\\') else: return PostgreSQLAdapter.CONTAINS(self, first, second, case_sensitive=case_sensitive) def ANY(self, first): return "ANY(%s)" % self.expand(first) def ILIKE(self, first, second, escape=None): if first and 'type' not in first: args = (first, self.expand(second)) ilike = '(%s ILIKE %s)' % args else: ilike = PostgreSQLAdapter.ILIKE(self, first, second, escape=escape) return ilike def EQ(self, first, second=None): if first and 'type' not in first: eq = '(%s = %s)' % (first, self.expand(second)) else: eq = PostgreSQLAdapter.EQ(self, first, second) return eq class JDBCPostgreSQLAdapter(PostgreSQLAdapter): drivers = ('zxJDBC',) REGEX_URI = re.compile('^(?P[^:@]+)(\:(?P[^@]*))?@(?P[^\:/]+)(\:(?P[0-9]+))?/(?P.+)$') def __init__(self,db,uri,pool_size=0,folder=None,db_codec ='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, after_connection=None ): self.db = db self.dbengine = "postgres" self.uri = uri if do_connect: self.find_driver(adapter_args,uri) self.pool_size = pool_size self.folder = folder self.db_codec = db_codec self._after_connection = after_connection self.find_or_make_work_folder() ruri = uri.split('://',1)[1] m = self.REGEX_URI.match(ruri) if not m: raise SyntaxError("Invalid URI string in DAL") user = credential_decoder(m.group('user')) if not user: raise SyntaxError('User required') password = credential_decoder(m.group('password')) if not password: password = '' host = m.group('host') if not host: raise SyntaxError('Host name required') db = m.group('db') if not db: raise SyntaxError('Database name required') port = m.group('port') or '5432' msg = ('jdbc:postgresql://%s:%s/%s' % (host, port, db), user, password) def connector(msg=msg,driver_args=driver_args): return self.driver.connect(*msg,**driver_args) self.connector = connector if do_connect: self.reconnect() def after_connection(self): self.connection.set_client_encoding('UTF8') self.execute('BEGIN;') self.execute("SET CLIENT_ENCODING TO 'UNICODE';") self.try_json() web2py-2.12.3.orig/gluon/packages/dal/pydal/adapters/teradata.py0000664000000000000000000000544212564727432023204 0ustar rootroot# -*- coding: utf-8 -*- from .._globals import IDENTITY from ..connection import ConnectionPool from .base import BaseAdapter class TeradataAdapter(BaseAdapter): drivers = ('pyodbc',) types = { 'boolean': 'CHAR(1)', 'string': 'VARCHAR(%(length)s)', 'text': 'VARCHAR(2000)', 'json': 'VARCHAR(4000)', 'password': 'VARCHAR(%(length)s)', 'blob': 'BLOB', 'upload': 'VARCHAR(%(length)s)', 'integer': 'INT', 'bigint': 'BIGINT', 'float': 'REAL', 'double': 'DOUBLE', 'decimal': 'NUMERIC(%(precision)s,%(scale)s)', 'date': 'DATE', 'time': 'TIME', 'datetime': 'TIMESTAMP', # Modified Constraint syntax for Teradata. # Teradata does not support ON DELETE. 'id': 'INT GENERATED ALWAYS AS IDENTITY', # Teradata Specific 'reference': 'INT', 'list:integer': 'VARCHAR(4000)', 'list:string': 'VARCHAR(4000)', 'list:reference': 'VARCHAR(4000)', 'geometry': 'ST_GEOMETRY', 'big-id': 'BIGINT GENERATED ALWAYS AS IDENTITY', # Teradata Specific 'big-reference': 'BIGINT', 'reference FK': ' REFERENCES %(foreign_key)s', 'reference TFK': ' FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_table)s (%(foreign_key)s)', } def __init__(self,db,uri,pool_size=0,folder=None,db_codec ='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, after_connection=None): self.db = db self.dbengine = "teradata" self.uri = uri if do_connect: self.find_driver(adapter_args,uri) self.pool_size = pool_size self.folder = folder self.db_codec = db_codec self._after_connection = after_connection self.find_or_make_work_folder() ruri = uri.split('://', 1)[1] def connector(cnxn=ruri,driver_args=driver_args): return self.driver.connect(cnxn,**driver_args) self.connector = connector if do_connect: self.reconnect() def close(self,action='commit',really=True): # Teradata does not implicitly close off the cursor # leading to SQL_ACTIVE_STATEMENTS limit errors self.cursor.close() ConnectionPool.close(self, action, really) def LEFT_JOIN(self): return 'LEFT OUTER JOIN' # Similar to MSSQL, Teradata can't specify a range (for Pageby) def select_limitby(self, sql_s, sql_f, sql_t, sql_w, sql_o, limitby): if limitby: (lmin, lmax) = limitby sql_s += ' TOP %i' % lmax return 'SELECT %s %s FROM %s%s%s;' % (sql_s, sql_f, sql_t, sql_w, sql_o) def _truncate(self, table, mode=''): tablename = table._tablename return ['DELETE FROM %s ALL;' % (tablename)] web2py-2.12.3.orig/gluon/packages/dal/pydal/adapters/mssql.py0000664000000000000000000010041112564727432022546 0ustar rootroot# -*- coding: utf-8 -*- import re import sys from .._globals import IDENTITY from .._compat import PY2, to_unicode, iteritems, integer_types from ..objects import Expression from ..helpers.methods import varquote_aux from .base import BaseAdapter long = integer_types[-1] class MSSQLAdapter(BaseAdapter): drivers = ('pyodbc',) T_SEP = 'T' QUOTE_TEMPLATE = '"%s"' types = { 'boolean': 'BIT', 'string': 'VARCHAR(%(length)s)', 'text': 'TEXT', 'json': 'TEXT', 'password': 'VARCHAR(%(length)s)', 'blob': 'IMAGE', 'upload': 'VARCHAR(%(length)s)', 'integer': 'INT', 'bigint': 'BIGINT', 'float': 'FLOAT', 'double': 'FLOAT', 'decimal': 'NUMERIC(%(precision)s,%(scale)s)', 'date': 'DATETIME', 'time': 'CHAR(8)', 'datetime': 'DATETIME', 'id': 'INT IDENTITY PRIMARY KEY', 'reference': 'INT %(null)s %(unique)s, CONSTRAINT %(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'list:integer': 'TEXT', 'list:string': 'TEXT', 'list:reference': 'TEXT', 'geometry': 'geometry', 'geography': 'geography', 'big-id': 'BIGINT IDENTITY PRIMARY KEY', 'big-reference': 'BIGINT %(null)s %(unique)s, CONSTRAINT %(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference FK': ', CONSTRAINT FK_%(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference TFK': ' CONSTRAINT FK_%(foreign_table)s_PK FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_table)s (%(foreign_key)s) ON DELETE %(on_delete_action)s', } def concat_add(self,tablename): return '; ALTER TABLE %s ADD ' % tablename def varquote(self,name): return varquote_aux(name,'[%s]') def EXTRACT(self,field,what): return "DATEPART(%s,%s)" % (what, self.expand(field)) def LEFT_JOIN(self): return 'LEFT OUTER JOIN' def RANDOM(self): return 'NEWID()' def ALLOW_NULL(self): return ' %s' % 'NULL' def CAST(self, first, second): return first # apparently no cast necessary in MSSQL def SUBSTRING(self,field,parameters): return 'SUBSTRING(%s,%s,%s)' % (self.expand(field), parameters[0], parameters[1]) def PRIMARY_KEY(self,key): return 'PRIMARY KEY CLUSTERED (%s)' % key def AGGREGATE(self, first, what): if what == 'LENGTH': what = 'LEN' return "%s(%s)" % (what, self.expand(first)) def LENGTH(self, first): return "LEN(%s)" % self.expand(first) def select_limitby(self, sql_s, sql_f, sql_t, sql_w, sql_o, limitby): if limitby: (lmin, lmax) = limitby sql_s += ' TOP %i' % lmax return 'SELECT %s %s FROM %s%s%s;' % (sql_s, sql_f, sql_t, sql_w, sql_o) TRUE = 1 FALSE = 0 REGEX_DSN = re.compile('^(?P.+)$') REGEX_URI = re.compile('^(?P[^:@]+)(\:(?P[^@]*))?@(?P[^\:/]+)(\:(?P[0-9]+))?/(?P[^\?]+)(\?(?P.*))?$') REGEX_ARGPATTERN = re.compile('(?P[^=]+)=(?P[^&]*)') def __init__(self, db, uri, pool_size=0, folder=None, db_codec='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, srid=4326, after_connection=None): self.TRUE_exp = '1=1' self.FALSE_exp = '1=0' self.db = db self.dbengine = "mssql" self.uri = uri if do_connect: self.find_driver(adapter_args,uri) self.pool_size = pool_size self.folder = folder self.db_codec = db_codec self._after_connection = after_connection self.srid = srid self.find_or_make_work_folder() ruri = uri.split('://', 1)[1] if '@' not in ruri: try: m = self.REGEX_DSN.match(ruri) if not m: raise SyntaxError( 'Parsing uri string(%s) has no result' % self.uri) dsn = m.group('dsn') if not dsn: raise SyntaxError('DSN required') except SyntaxError: e = sys.exc_info()[1] self.db.logger.error('NdGpatch error') raise e # was cnxn = 'DSN=%s' % dsn cnxn = dsn else: m = self.REGEX_URI.match(ruri) if not m: raise SyntaxError( "Invalid URI string in DAL: %s" % self.uri) user = credential_decoder(m.group('user')) if not user: raise SyntaxError('User required') password = credential_decoder(m.group('password')) if not password: password = '' host = m.group('host') if not host: raise SyntaxError('Host name required') db = m.group('db') if not db: raise SyntaxError('Database name required') port = m.group('port') or '1433' # Parse the optional url name-value arg pairs after the '?' # (in the form of arg1=value1&arg2=value2&...) # Default values (drivers like FreeTDS insist on uppercase parameter keys) argsdict = { 'DRIVER':'{SQL Server}' } urlargs = m.group('urlargs') or '' for argmatch in self.REGEX_ARGPATTERN.finditer(urlargs): argsdict[str(argmatch.group('argkey')).upper()] = argmatch.group('argvalue') urlargs = ';'.join(['%s=%s' % (ak, av) for (ak, av) in iteritems(argsdict)]) cnxn = 'SERVER=%s;PORT=%s;DATABASE=%s;UID=%s;PWD=%s;%s' \ % (host, port, db, user, password, urlargs) def connector(cnxn=cnxn,driver_args=driver_args): return self.driver.connect(cnxn, **driver_args) self.connector = connector if do_connect: self.reconnect() def lastrowid(self, table): #self.execute('SELECT @@IDENTITY;') self.execute('SELECT SCOPE_IDENTITY();') return long(self.cursor.fetchone()[0]) def rowslice(self, rows, minimum=0, maximum=None): if maximum is None: return rows[minimum:] return rows[minimum:maximum] def EPOCH(self, first): return "DATEDIFF(second, '1970-01-01 00:00:00', %s)" % self.expand(first) def CONCAT(self, *items): return '(%s)' % ' + '.join(self.expand(x, 'string') for x in items) def REGEXP(self, first, second): second = self.expand(second, 'string').replace('\\', '\\\\') second = second.replace('%', '\%').replace('*', '%').replace('.', '_') return "(%s LIKE %s ESCAPE '\\')" % (self.expand(first), second) def mssql_like_normalizer(self, term): term = term.replace('[', '[[]') return term def like_escaper_default(self, term): if isinstance(term, Expression): return term term = term.replace('\\', '\\\\') term = term.replace('%', '\%').replace('_', '\_') return self.mssql_like_normalizer(term) def LIKE(self, first, second, escape=None): """Case sensitive like operator""" if isinstance(second, Expression): second = self.expand(second, 'string') else: second = self.expand(second, 'string') if escape is None: escape = '\\' second = second.replace(escape, escape * 2) return "(%s LIKE %s ESCAPE '%s')" % (self.expand(first), second, escape) def ILIKE(self, first, second, escape=None): """Case insensitive like operator""" if isinstance(second, Expression): second = self.expand(second, 'string') else: second = self.expand(second, 'string').lower() if escape is None: escape = '\\' second = second.replace(escape, escape*2) return "(LOWER(%s) LIKE %s ESCAPE '%s')" % (self.expand(first), second, escape) def STARTSWITH(self, first, second): return "(%s LIKE %s ESCAPE '\\')" % (self.expand(first), self.expand(self.like_escaper_default(second)+'%', 'string')) def ENDSWITH(self, first, second): return "(%s LIKE %s ESCAPE '\\')" % (self.expand(first), self.expand('%'+self.like_escaper_default(second), 'string')) def CONTAINS(self, first, second, case_sensitive=True): if first.type in ('string', 'text', 'json'): if isinstance(second, Expression): second = Expression(second.db, self.CONCAT('%',Expression( second.db, self.REPLACE(second,('%','\%'))),'%')) else: second = '%'+self.like_escaper_default(str(second))+'%' elif first.type.startswith('list:'): if isinstance(second,Expression): second = Expression(second.db, self.CONCAT( '%|',Expression(second.db, self.REPLACE( Expression(second.db, self.REPLACE( second,('%','\%'))),('|','||'))),'|%')) else: second = str(second).replace('|', '||') second = '%|'+self.like_escaper_default(second)+'|%' op = case_sensitive and self.LIKE or self.ILIKE return op(first, second, escape='\\') # GIS Spatial Extensions # No STAsGeoJSON in MSSQL def ST_ASTEXT(self, first): return '%s.STAsText()' %(self.expand(first)) def ST_CONTAINS(self, first, second): return '%s.STContains(%s)=1' %(self.expand(first), self.expand(second, first.type)) def ST_DISTANCE(self, first, second): return '%s.STDistance(%s)' %(self.expand(first), self.expand(second, first.type)) def ST_EQUALS(self, first, second): return '%s.STEquals(%s)=1' %(self.expand(first), self.expand(second, first.type)) def ST_INTERSECTS(self, first, second): return '%s.STIntersects(%s)=1' %(self.expand(first), self.expand(second, first.type)) def ST_OVERLAPS(self, first, second): return '%s.STOverlaps(%s)=1' %(self.expand(first), self.expand(second, first.type)) # no STSimplify in MSSQL def ST_TOUCHES(self, first, second): return '%s.STTouches(%s)=1' %(self.expand(first), self.expand(second, first.type)) def ST_WITHIN(self, first, second): return '%s.STWithin(%s)=1' %(self.expand(first), self.expand(second, first.type)) def represent(self, obj, fieldtype): field_is_type = fieldtype.startswith if field_is_type('geometry'): srid = 0 # MS SQL default srid for geometry geotype, parms = fieldtype[:-1].split('(') if parms: srid = parms return "geometry::STGeomFromText('%s',%s)" %(obj, srid) elif fieldtype == 'geography': srid = 4326 # MS SQL default srid for geography geotype, parms = fieldtype[:-1].split('(') if parms: srid = parms return "geography::STGeomFromText('%s',%s)" %(obj, srid) # else: # raise SyntaxError('Invalid field type %s' %fieldtype) return "geometry::STGeomFromText('%s',%s)" %(obj, srid) return BaseAdapter.represent(self, obj, fieldtype) class MSSQL3Adapter(MSSQLAdapter): """Experimental support for pagination in MSSQL Requires MSSQL >= 2005, uses `ROW_NUMBER()` """ types = { 'boolean': 'BIT', 'string': 'VARCHAR(%(length)s)', 'text': 'VARCHAR(MAX)', 'json': 'VARCHAR(MAX)', 'password': 'VARCHAR(%(length)s)', 'blob': 'IMAGE', 'upload': 'VARCHAR(%(length)s)', 'integer': 'INT', 'bigint': 'BIGINT', 'float': 'FLOAT', 'double': 'FLOAT', 'decimal': 'NUMERIC(%(precision)s,%(scale)s)', 'date': 'DATETIME', 'time': 'TIME(7)', 'datetime': 'DATETIME', 'id': 'INT IDENTITY PRIMARY KEY', 'reference': 'INT %(null)s %(unique)s, CONSTRAINT %(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'list:integer': 'VARCHAR(MAX)', 'list:string': 'VARCHAR(MAX)', 'list:reference': 'VARCHAR(MAX)', 'geometry': 'geometry', 'geography': 'geography', 'big-id': 'BIGINT IDENTITY PRIMARY KEY', 'big-reference': 'BIGINT %(null)s %(unique)s, CONSTRAINT %(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference FK': ', CONSTRAINT FK_%(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference TFK': ' CONSTRAINT FK_%(foreign_table)s_PK FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_table)s (%(foreign_key)s) ON DELETE %(on_delete_action)s', } def select_limitby(self, sql_s, sql_f, sql_t, sql_w, sql_o, limitby): if limitby: (lmin, lmax) = limitby if lmin == 0: sql_s += ' TOP %i' % lmax return 'SELECT %s %s FROM %s%s%s;' % (sql_s, sql_f, sql_t, sql_w, sql_o) lmin += 1 sql_o_inner = sql_o[sql_o.find('ORDER BY ')+9:] sql_g_inner = sql_o[:sql_o.find('ORDER BY ')] sql_f_outer = ['f_%s' % f for f in range(len(sql_f.split(',')))] sql_f_inner = [f for f in sql_f.split(',')] sql_f_iproxy = ['%s AS %s' % (o, n) for (o, n) in zip(sql_f_inner, sql_f_outer)] sql_f_iproxy = ', '.join(sql_f_iproxy) sql_f_oproxy = ', '.join(sql_f_outer) return 'SELECT %s %s FROM (SELECT %s ROW_NUMBER() OVER (ORDER BY %s) AS w_row, %s FROM %s%s%s) TMP WHERE w_row BETWEEN %i AND %s;' % (sql_s,sql_f_oproxy,sql_s,sql_f,sql_f_iproxy,sql_t,sql_w,sql_g_inner,lmin,lmax) return 'SELECT %s %s FROM %s%s%s;' % (sql_s,sql_f,sql_t,sql_w,sql_o) def rowslice(self,rows,minimum=0,maximum=None): return rows class MSSQL4Adapter(MSSQLAdapter): """Support for "native" pagination Requires MSSQL >= 2012, uses `OFFSET ... ROWS ... FETCH NEXT ... ROWS ONLY` """ types = { 'boolean': 'BIT', 'string': 'VARCHAR(%(length)s)', 'text': 'VARCHAR(MAX)', 'json': 'VARCHAR(MAX)', 'password': 'VARCHAR(%(length)s)', 'blob': 'IMAGE', 'upload': 'VARCHAR(%(length)s)', 'integer': 'INT', 'bigint': 'BIGINT', 'float': 'FLOAT', 'double': 'FLOAT', 'decimal': 'NUMERIC(%(precision)s,%(scale)s)', 'date': 'DATETIME', 'time': 'TIME(7)', 'datetime': 'DATETIME', 'id': 'INT IDENTITY PRIMARY KEY', 'reference': 'INT %(null)s %(unique)s, CONSTRAINT %(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'list:integer': 'VARCHAR(MAX)', 'list:string': 'VARCHAR(MAX)', 'list:reference': 'VARCHAR(MAX)', 'geometry': 'geometry', 'geography': 'geography', 'big-id': 'BIGINT IDENTITY PRIMARY KEY', 'big-reference': 'BIGINT %(null)s %(unique)s, CONSTRAINT %(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference FK': ', CONSTRAINT FK_%(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference TFK': ' CONSTRAINT FK_%(foreign_table)s_PK FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_table)s (%(foreign_key)s) ON DELETE %(on_delete_action)s', } def select_limitby(self, sql_s, sql_f, sql_t, sql_w, sql_o, limitby): if limitby: (lmin, lmax) = limitby if lmin == 0: #top is still slightly faster, especially because #web2py's default to fetch references is to not specify #an orderby clause sql_s += ' TOP %i' % lmax else: if not sql_o: #if there is no orderby, we can't use the brand new statements #that being said, developer chose its own poison, so be it random sql_o += ' ORDER BY %s' % self.RANDOM() sql_o += ' OFFSET %i ROWS FETCH NEXT %i ROWS ONLY' % (lmin, lmax - lmin) return 'SELECT %s %s FROM %s%s%s;' % \ (sql_s, sql_f, sql_t, sql_w, sql_o) def rowslice(self, rows, minimum=0, maximum=None): return rows class MSSQL2Adapter(MSSQLAdapter): drivers = ('pyodbc',) types = { 'boolean': 'BIT', 'string': 'NVARCHAR(%(length)s)', 'text': 'NTEXT', 'json': 'NTEXT', 'password': 'NVARCHAR(%(length)s)', 'blob': 'IMAGE', 'upload': 'NVARCHAR(%(length)s)', 'integer': 'INT', 'bigint': 'BIGINT', 'float': 'FLOAT', 'double': 'FLOAT', 'decimal': 'NUMERIC(%(precision)s,%(scale)s)', 'date': 'DATETIME', 'time': 'CHAR(8)', 'datetime': 'DATETIME', 'id': 'INT IDENTITY PRIMARY KEY', 'reference': 'INT %(null)s %(unique)s, CONSTRAINT %(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'list:integer': 'NTEXT', 'list:string': 'NTEXT', 'list:reference': 'NTEXT', 'geometry': 'geometry', 'geography': 'geography', 'big-id': 'BIGINT IDENTITY PRIMARY KEY', 'big-reference': 'BIGINT %(null)s %(unique)s, CONSTRAINT %(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference FK': ', CONSTRAINT FK_%(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference TFK': ' CONSTRAINT FK_%(foreign_table)s_PK FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_table)s (%(foreign_key)s) ON DELETE %(on_delete_action)s', } def represent(self, obj, fieldtype): value = BaseAdapter.represent(self, obj, fieldtype) if fieldtype in ('string', 'text', 'json') and value[:1] == "'": value = 'N' + value return value def execute(self, *a, **b): if PY2: newa = list(a) newa[0] = to_unicode(newa[0]) a = tuple(newa) return self.log_execute(*a, **b) #return self.log_execute(a.decode('utf8')) def ILIKE(self, first, second, escape=None): """Case insensitive like operator""" if isinstance(second, Expression): second = self.expand(second, 'string') else: second = self.expand(second, 'string').lower() if escape is None: escape = '\\' second = second.replace(escape, escape*2) if second.startswith("n'"): second = "N'" + second[2:] return "(LOWER(%s) LIKE %s ESCAPE '%s')" % (self.expand(first), second, escape) class MSSQLNAdapter(MSSQLAdapter): drivers = ('pyodbc',) """Experimental: base class for handling unicode in MSSQL by default. Needs lots of testing. Try this on a fresh (or on a legacy) database. Using this in a database handled previously with non-unicode aware adapter is NOT supported """ types = { 'boolean': 'BIT', 'string': 'NVARCHAR(%(length)s)', 'text': 'NTEXT', 'json': 'NTEXT', 'password': 'NVARCHAR(%(length)s)', 'blob': 'IMAGE', 'upload': 'NVARCHAR(%(length)s)', 'integer': 'INT', 'bigint': 'BIGINT', 'float': 'FLOAT', 'double': 'FLOAT', 'decimal': 'NUMERIC(%(precision)s,%(scale)s)', 'date': 'DATETIME', 'time': 'CHAR(8)', 'datetime': 'DATETIME', 'id': 'INT IDENTITY PRIMARY KEY', 'reference': 'INT %(null)s %(unique)s, CONSTRAINT %(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'list:integer': 'NTEXT', 'list:string': 'NTEXT', 'list:reference': 'NTEXT', 'geometry': 'geometry', 'geography': 'geography', 'big-id': 'BIGINT IDENTITY PRIMARY KEY', 'big-reference': 'BIGINT %(null)s %(unique)s, CONSTRAINT %(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference FK': ', CONSTRAINT FK_%(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference TFK': ' CONSTRAINT FK_%(foreign_table)s_PK FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_table)s (%(foreign_key)s) ON DELETE %(on_delete_action)s', } def represent(self, obj, fieldtype): value = BaseAdapter.represent(self, obj, fieldtype) if fieldtype in ('string', 'text', 'json') and value[:1] == "'": value = 'N' + value return value def execute(self, *a, **b): if PY2: newa = list(a) newa[0] = to_unicode(newa[0]) a = tuple(newa) return self.log_execute(*a, **b) def ILIKE(self, first, second, escape=None): """Case insensitive like operator""" if isinstance(second, Expression): second = self.expand(second, 'string') else: second = self.expand(second, 'string').lower() if escape is None: escape = '\\' second = second.replace(escape, escape*2) if second.startswith("n'"): second = "N'" + second[2:] return "(LOWER(%s) LIKE %s ESCAPE '%s')" % (self.expand(first), second, escape) class MSSQL3NAdapter(MSSQLNAdapter): drivers = ('pyodbc',) """Experimental support for pagination in MSSQL Experimental: see MSSQLNAdapter docstring for warnings Requires MSSQL >= 2005, uses `ROW_NUMBER()` """ types = { 'boolean': 'BIT', 'string': 'NVARCHAR(%(length)s)', 'text': 'NVARCHAR(MAX)', 'json': 'NVARCHAR(MAX)', 'password': 'NVARCHAR(%(length)s)', 'blob': 'IMAGE', 'upload': 'NVARCHAR(%(length)s)', 'integer': 'INT', 'bigint': 'BIGINT', 'float': 'FLOAT', 'double': 'FLOAT', 'decimal': 'NUMERIC(%(precision)s,%(scale)s)', 'date': 'DATETIME', 'time': 'TIME(7)', 'datetime': 'DATETIME', 'id': 'INT IDENTITY PRIMARY KEY', 'reference': 'INT %(null)s %(unique)s, CONSTRAINT %(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'list:integer': 'NVARCHAR(MAX)', 'list:string': 'NVARCHAR(MAX)', 'list:reference': 'NVARCHAR(MAX)', 'geometry': 'geometry', 'geography': 'geography', 'big-id': 'BIGINT IDENTITY PRIMARY KEY', 'big-reference': 'BIGINT %(null)s %(unique)s, CONSTRAINT %(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference FK': ', CONSTRAINT FK_%(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference TFK': ' CONSTRAINT FK_%(foreign_table)s_PK FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_table)s (%(foreign_key)s) ON DELETE %(on_delete_action)s', } def select_limitby(self, sql_s, sql_f, sql_t, sql_w, sql_o, limitby): if limitby: (lmin, lmax) = limitby if lmin == 0: sql_s += ' TOP %i' % lmax return 'SELECT %s %s FROM %s%s%s;' % (sql_s, sql_f, sql_t, sql_w, sql_o) lmin += 1 sql_o_inner = sql_o[sql_o.find('ORDER BY ')+9:] sql_g_inner = sql_o[:sql_o.find('ORDER BY ')] sql_f_outer = ['f_%s' % f for f in range(len(sql_f.split(',')))] sql_f_inner = [f for f in sql_f.split(',')] sql_f_iproxy = ['%s AS %s' % (o, n) for (o, n) in zip(sql_f_inner, sql_f_outer)] sql_f_iproxy = ', '.join(sql_f_iproxy) sql_f_oproxy = ', '.join(sql_f_outer) return 'SELECT %s %s FROM (SELECT %s ROW_NUMBER() OVER (ORDER BY %s) AS w_row, %s FROM %s%s%s) TMP WHERE w_row BETWEEN %i AND %s;' % (sql_s,sql_f_oproxy,sql_s,sql_f,sql_f_iproxy,sql_t,sql_w,sql_g_inner,lmin,lmax) return 'SELECT %s %s FROM %s%s%s;' % (sql_s,sql_f,sql_t,sql_w,sql_o) def rowslice(self,rows,minimum=0,maximum=None): return rows class MSSQL4NAdapter(MSSQLNAdapter): """Experimental: see MSSQLNAdapter docstring for warnings Support for "native" pagination Unicode-compatible version Requires MSSQL >= 2012, uses `OFFSET ... ROWS ... FETCH NEXT ... ROWS ONLY` After careful testing, this should be the de-facto adapter for recent MSSQL backends """ types = { 'boolean': 'BIT', 'string': 'NVARCHAR(%(length)s)', 'text': 'NVARCHAR(MAX)', 'json': 'NVARCHAR(MAX)', 'password': 'NVARCHAR(%(length)s)', 'blob': 'IMAGE', 'upload': 'NVARCHAR(%(length)s)', 'integer': 'INT', 'bigint': 'BIGINT', 'float': 'FLOAT', 'double': 'FLOAT', 'decimal': 'NUMERIC(%(precision)s,%(scale)s)', 'date': 'DATE', 'time': 'TIME(7)', 'datetime': 'DATETIME', 'id': 'INT IDENTITY PRIMARY KEY', 'reference': 'INT %(null)s %(unique)s, CONSTRAINT %(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'list:integer': 'NVARCHAR(MAX)', 'list:string': 'NVARCHAR(MAX)', 'list:reference': 'NVARCHAR(MAX)', 'geometry': 'geometry', 'geography': 'geography', 'big-id': 'BIGINT IDENTITY PRIMARY KEY', 'big-reference': 'BIGINT %(null)s %(unique)s, CONSTRAINT %(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference FK': ', CONSTRAINT FK_%(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference TFK': ' CONSTRAINT FK_%(foreign_table)s_PK FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_table)s (%(foreign_key)s) ON DELETE %(on_delete_action)s', } def select_limitby(self, sql_s, sql_f, sql_t, sql_w, sql_o, limitby): if limitby: (lmin, lmax) = limitby if lmin == 0: #top is still slightly faster, especially because #web2py's default to fetch references is to not specify #an orderby clause sql_s += ' TOP %i' % lmax else: if not sql_o: #if there is no orderby, we can't use the brand new statements #that being said, developer chose its own poison, so be it random sql_o += ' ORDER BY %s' % self.RANDOM() sql_o += ' OFFSET %i ROWS FETCH NEXT %i ROWS ONLY' % (lmin, lmax - lmin) return 'SELECT %s %s FROM %s%s%s;' % \ (sql_s, sql_f, sql_t, sql_w, sql_o) def rowslice(self, rows, minimum=0, maximum=None): return rows class VerticaAdapter(MSSQLAdapter): drivers = ('pyodbc',) T_SEP = ' ' types = { 'boolean': 'BOOLEAN', 'string': 'VARCHAR(%(length)s)', 'text': 'BYTEA', 'json': 'VARCHAR(%(length)s)', 'password': 'VARCHAR(%(length)s)', 'blob': 'BYTEA', 'upload': 'VARCHAR(%(length)s)', 'integer': 'INT', 'bigint': 'BIGINT', 'float': 'FLOAT', 'double': 'DOUBLE PRECISION', 'decimal': 'DECIMAL(%(precision)s,%(scale)s)', 'date': 'DATE', 'time': 'TIME', 'datetime': 'DATETIME', 'id': 'IDENTITY', 'reference': 'INT REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'list:integer': 'BYTEA', 'list:string': 'BYTEA', 'list:reference': 'BYTEA', 'big-reference': 'BIGINT REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', } def EXTRACT(self, first, what): return "DATE_PART('%s', TIMESTAMP %s)" % (what, self.expand(first)) def _truncate(self, table, mode=''): tablename = table._tablename return ['TRUNCATE %s %s;' % (tablename, mode or '')] def select_limitby(self, sql_s, sql_f, sql_t, sql_w, sql_o, limitby): if limitby: (lmin, lmax) = limitby sql_o += ' LIMIT %i OFFSET %i' % (lmax - lmin, lmin) return 'SELECT %s %s FROM %s%s%s;' % \ (sql_s, sql_f, sql_t, sql_w, sql_o) def lastrowid(self, table): self.execute('SELECT LAST_INSERT_ID();') return long(self.cursor.fetchone()[0]) def execute(self, a): return self.log_execute(a) class SybaseAdapter(MSSQLAdapter): drivers = ('Sybase') types = { 'boolean': 'BIT', 'string': 'CHAR VARYING(%(length)s)', 'text': 'TEXT', 'json': 'TEXT', 'password': 'CHAR VARYING(%(length)s)', 'blob': 'IMAGE', 'upload': 'CHAR VARYING(%(length)s)', 'integer': 'INT', 'bigint': 'BIGINT', 'float': 'FLOAT', 'double': 'FLOAT', 'decimal': 'NUMERIC(%(precision)s,%(scale)s)', 'date': 'DATETIME', 'time': 'CHAR(8)', 'datetime': 'DATETIME', 'id': 'INT IDENTITY PRIMARY KEY', 'reference': 'INT NULL, CONSTRAINT %(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'list:integer': 'TEXT', 'list:string': 'TEXT', 'list:reference': 'TEXT', 'geometry': 'geometry', 'geography': 'geography', 'big-id': 'BIGINT IDENTITY PRIMARY KEY', 'big-reference': 'BIGINT NULL, CONSTRAINT %(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference FK': ', CONSTRAINT FK_%(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference TFK': ' CONSTRAINT FK_%(foreign_table)s_PK FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_table)s (%(foreign_key)s) ON DELETE %(on_delete_action)s', } def __init__(self, db, uri, pool_size=0, folder=None, db_codec='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, srid=4326, after_connection=None): self.db = db self.dbengine = "sybase" self.uri = uri if do_connect: self.find_driver(adapter_args, uri) self.pool_size = pool_size self.folder = folder self.db_codec = db_codec self._after_connection = after_connection self.srid = srid self.find_or_make_work_folder() # ## read: http://bytes.com/groups/python/460325-cx_oracle-utf8 ruri = uri.split('://', 1)[1] if '@' not in ruri: try: m = self.REGEX_DSN.match(ruri) if not m: raise SyntaxError( 'Parsing uri string(%s) has no result' % self.uri) dsn = m.group('dsn') if not dsn: raise SyntaxError('DSN required') except SyntaxError: e = sys.exc_info()[1] self.db.logger.error('NdGpatch error') raise e else: m = self.REGEX_URI.match(uri) if not m: raise SyntaxError( "Invalid URI string in DAL: %s" % self.uri) user = credential_decoder(m.group('user')) if not user: raise SyntaxError('User required') password = credential_decoder(m.group('password')) if not password: password = '' host = m.group('host') if not host: raise SyntaxError('Host name required') db = m.group('db') if not db: raise SyntaxError('Database name required') port = m.group('port') or '1433' dsn = 'sybase:host=%s:%s;dbname=%s' % (host, port, db) driver_args.update(user=credential_decoder(user), passwd=credential_decoder(password)) def connector(dsn=dsn, driver_args=driver_args): return self.driver.connect(dsn, **driver_args) self.connector = connector if do_connect: self.reconnect() web2py-2.12.3.orig/gluon/packages/dal/pydal/adapters/sapdb.py0000664000000000000000000000756512564727432022520 0ustar rootroot# -*- coding: utf-8 -*- import re from .._globals import IDENTITY from .base import BaseAdapter class SAPDBAdapter(BaseAdapter): drivers = ('sapdb',) support_distributed_transaction = False types = { 'boolean': 'CHAR(1)', 'string': 'VARCHAR(%(length)s)', 'text': 'LONG', 'json': 'LONG', 'password': 'VARCHAR(%(length)s)', 'blob': 'LONG', 'upload': 'VARCHAR(%(length)s)', 'integer': 'INT', 'bigint': 'BIGINT', 'float': 'FLOAT', 'double': 'DOUBLE PRECISION', 'decimal': 'FIXED(%(precision)s,%(scale)s)', 'date': 'DATE', 'time': 'TIME', 'datetime': 'TIMESTAMP', 'id': 'INT PRIMARY KEY', 'reference': 'INT, FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'list:integer': 'LONG', 'list:string': 'LONG', 'list:reference': 'LONG', 'big-id': 'BIGINT PRIMARY KEY', 'big-reference': 'BIGINT, FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', } def sequence_name(self,table): return (self.QUOTE_TEMPLATE + '_id_Seq') % table def select_limitby(self, sql_s, sql_f, sql_t, sql_w, sql_o, limitby): if limitby: (lmin, lmax) = limitby if len(sql_w) > 1: sql_w_row = sql_w + ' AND w_row > %i' % lmin else: sql_w_row = 'WHERE w_row > %i' % lmin return '%s %s FROM (SELECT w_tmp.*, ROWNO w_row FROM (SELECT %s FROM %s%s%s) w_tmp WHERE ROWNO=%i) %s %s %s;' % (sql_s, sql_f, sql_f, sql_t, sql_w, sql_o, lmax, sql_t, sql_w_row, sql_o) return 'SELECT %s %s FROM %s%s%s;' % (sql_s, sql_f, sql_t, sql_w, sql_o) def create_sequence_and_triggers(self, query, table, **args): # following lines should only be executed if table._sequence_name does not exist self.execute('CREATE SEQUENCE %s;' % table._sequence_name) self.execute("ALTER TABLE %s ALTER COLUMN %s SET DEFAULT NEXTVAL('%s');" \ % (table._tablename, table._id.name, table._sequence_name)) self.execute(query) REGEX_URI = re.compile('^(?P[^:@]+)(\:(?P[^@]*))?@(?P[^\:@]+)(\:(?P[0-9]+))?/(?P[^\?]+)(\?sslmode=(?P.+))?$') def __init__(self,db,uri,pool_size=0,folder=None,db_codec ='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, after_connection=None): self.db = db self.dbengine = "sapdb" self.uri = uri if do_connect: self.find_driver(adapter_args,uri) self.pool_size = pool_size self.folder = folder self.db_codec = db_codec self._after_connection = after_connection self.find_or_make_work_folder() ruri = uri.split('://',1)[1] m = self.REGEX_URI.match(ruri) if not m: raise SyntaxError("Invalid URI string in DAL") user = credential_decoder(m.group('user')) if not user: raise SyntaxError('User required') password = credential_decoder(m.group('password')) if not password: password = '' host = m.group('host') if not host: raise SyntaxError('Host name required') db = m.group('db') if not db: raise SyntaxError('Database name required') def connector(user=user, password=password, database=db, host=host, driver_args=driver_args): return self.driver.Connection(user, password, database, host, **driver_args) self.connector = connector if do_connect: self.reconnect() def lastrowid(self,table): self.execute("select %s.NEXTVAL from dual" % table._sequence_name) return long(self.cursor.fetchone()[0]) web2py-2.12.3.orig/gluon/packages/dal/pydal/adapters/firebird.py0000664000000000000000000001614612564727432023210 0ustar rootroot# -*- coding: utf-8 -*- import re from .._globals import IDENTITY from ..objects import Expression from .base import BaseAdapter class FireBirdAdapter(BaseAdapter): drivers = ('kinterbasdb','firebirdsql','fdb','pyodbc') commit_on_alter_table = True support_distributed_transaction = True types = { 'boolean': 'CHAR(1)', 'string': 'VARCHAR(%(length)s)', 'text': 'BLOB SUB_TYPE 1', 'json': 'BLOB SUB_TYPE 1', 'password': 'VARCHAR(%(length)s)', 'blob': 'BLOB SUB_TYPE 0', 'upload': 'VARCHAR(%(length)s)', 'integer': 'INTEGER', 'bigint': 'BIGINT', 'float': 'FLOAT', 'double': 'DOUBLE PRECISION', 'decimal': 'DECIMAL(%(precision)s,%(scale)s)', 'date': 'DATE', 'time': 'TIME', 'datetime': 'TIMESTAMP', 'id': 'INTEGER PRIMARY KEY', 'reference': 'INTEGER REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'list:integer': 'BLOB SUB_TYPE 1', 'list:string': 'BLOB SUB_TYPE 1', 'list:reference': 'BLOB SUB_TYPE 1', 'big-id': 'BIGINT PRIMARY KEY', 'big-reference': 'BIGINT REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', } def sequence_name(self,tablename): return ('genid_' + self.QUOTE_TEMPLATE) % tablename def trigger_name(self,tablename): return 'trg_id_%s' % tablename def RANDOM(self): return 'RAND()' def EPOCH(self, first): return "DATEDIFF(second, '1970-01-01 00:00:00', %s)" % self.expand(first) def NOT_NULL(self,default,field_type): return 'DEFAULT %s NOT NULL' % self.represent(default,field_type) def SUBSTRING(self,field,parameters): return 'SUBSTRING(%s from %s for %s)' % (self.expand(field), parameters[0], parameters[1]) def LENGTH(self, first): return "CHAR_LENGTH(%s)" % self.expand(first) def CONTAINS(self,first,second,case_sensitive=False): if first.type.startswith('list:'): second = Expression(None,self.CONCAT('|',Expression( None,self.REPLACE(second,('|','||'))),'|')) return '(%s CONTAINING %s)' % (self.expand(first), self.expand(second, 'string')) def _drop(self,table,mode): sequence_name = table._sequence_name return ['DROP TABLE %s %s;' % (table.sqlsafe, mode), 'DROP GENERATOR %s;' % sequence_name] def select_limitby(self, sql_s, sql_f, sql_t, sql_w, sql_o, limitby): if limitby: (lmin, lmax) = limitby sql_s = ' FIRST %i SKIP %i %s' % (lmax - lmin, lmin, sql_s) return 'SELECT %s %s FROM %s%s%s;' % (sql_s, sql_f, sql_t, sql_w, sql_o) def _truncate(self,table,mode = ''): return ['DELETE FROM %s;' % table._tablename, 'SET GENERATOR %s TO 0;' % table._sequence_name] REGEX_URI = re.compile('^(?P[^:@]+)(\:(?P[^@]*))?@(?P[^\:/]+)(\:(?P[0-9]+))?/(?P.+?)(\?set_encoding=(?P\w+))?$') def __init__(self,db,uri,pool_size=0,folder=None,db_codec ='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, after_connection=None): self.db = db self.dbengine = "firebird" self.uri = uri if do_connect: self.find_driver(adapter_args,uri) self.pool_size = pool_size self.folder = folder self.db_codec = db_codec self._after_connection = after_connection self.find_or_make_work_folder() ruri = uri.split('://',1)[1] m = self.REGEX_URI.match(ruri) if not m: raise SyntaxError("Invalid URI string in DAL: %s" % self.uri) user = credential_decoder(m.group('user')) if not user: raise SyntaxError('User required') password = credential_decoder(m.group('password')) if not password: password = '' host = m.group('host') if not host: raise SyntaxError('Host name required') port = int(m.group('port') or 3050) db = m.group('db') if not db: raise SyntaxError('Database name required') charset = m.group('charset') or 'UTF8' driver_args.update(dsn='%s/%s:%s' % (host,port,db), user = credential_decoder(user), password = credential_decoder(password), charset = charset) def connector(driver_args=driver_args): return self.driver.connect(**driver_args) self.connector = connector if do_connect: self.reconnect() def create_sequence_and_triggers(self, query, table, **args): tablename = table._tablename sequence_name = table._sequence_name trigger_name = table._trigger_name self.execute(query) self.execute('create generator %s;' % sequence_name) self.execute('set generator %s to 0;' % sequence_name) self.execute('create trigger %s for %s active before insert position 0 as\nbegin\nif(new.id is null) then\nbegin\nnew.id = gen_id(%s, 1);\nend\nend;' % (trigger_name, tablename, sequence_name)) def lastrowid(self,table): sequence_name = table._sequence_name self.execute('SELECT gen_id(%s, 0) FROM rdb$database' % sequence_name) return long(self.cursor.fetchone()[0]) class FireBirdEmbeddedAdapter(FireBirdAdapter): drivers = ('kinterbasdb','firebirdsql','fdb','pyodbc') REGEX_URI = re.compile('^(?P[^:@]+)(\:(?P[^@]*))?@(?P[^\?]+)(\?set_encoding=(?P\w+))?$') def __init__(self,db,uri,pool_size=0,folder=None,db_codec ='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, after_connection=None): self.db = db self.dbengine = "firebird" self.uri = uri if do_connect: self.find_driver(adapter_args,uri) self.pool_size = pool_size self.folder = folder self.db_codec = db_codec self._after_connection = after_connection self.find_or_make_work_folder() ruri = uri.split('://',1)[1] m = self.REGEX_URI.match(ruri) if not m: raise SyntaxError( "Invalid URI string in DAL: %s" % self.uri) user = credential_decoder(m.group('user')) if not user: raise SyntaxError('User required') password = credential_decoder(m.group('password')) if not password: password = '' pathdb = m.group('path') if not pathdb: raise SyntaxError('Path required') charset = m.group('charset') if not charset: charset = 'UTF8' host = '' driver_args.update(host=host, database=pathdb, user=credential_decoder(user), password=credential_decoder(password), charset=charset) def connector(driver_args=driver_args): return self.driver.connect(**driver_args) self.connector = connector if do_connect: self.reconnect() web2py-2.12.3.orig/gluon/packages/dal/pydal/adapters/sqlite.py0000664000000000000000000002475712564727432022732 0ustar rootroot# -*- coding: utf-8 -*- import copy import datetime import locale import platform import re import sys import time from .._compat import PY2, pjoin from .._globals import IDENTITY from .base import BaseAdapter class SQLiteAdapter(BaseAdapter): drivers = ('sqlite2','sqlite3') can_select_for_update = None # support ourselves with BEGIN TRANSACTION def EXTRACT(self,field,what): return "web2py_extract('%s',%s)" % (what, self.expand(field)) @staticmethod def web2py_extract(lookup, s): table = { 'year': (0, 4), 'month': (5, 7), 'day': (8, 10), 'hour': (11, 13), 'minute': (14, 16), 'second': (17, 19), } try: if lookup != 'epoch': (i, j) = table[lookup] return int(s[i:j]) else: return time.mktime(datetime.datetime.strptime(s, '%Y-%m-%d %H:%M:%S').timetuple()) except: return None @staticmethod def web2py_regexp(expression, item): return re.compile(expression).search(item) is not None def __init__(self, db, uri, pool_size=0, folder=None, db_codec ='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, after_connection=None): self.db = db self.dbengine = "sqlite" self.uri = uri self.adapter_args = adapter_args if do_connect: self.find_driver(adapter_args) self.pool_size = 0 self.folder = folder self.db_codec = db_codec self._after_connection = after_connection self.find_or_make_work_folder() path_encoding = sys.getfilesystemencoding() \ or locale.getdefaultlocale()[1] or 'utf8' if uri.startswith('sqlite:memory'): self.dbpath = ':memory:' else: self.dbpath = uri.split('://',1)[1] if self.dbpath[0] != '/': if PY2: self.dbpath = pjoin( self.folder.decode(path_encoding).encode('utf8'), self.dbpath) else: self.dbpath = pjoin(self.folder, self.dbpath) if not 'check_same_thread' in driver_args: driver_args['check_same_thread'] = False if not 'detect_types' in driver_args and do_connect: driver_args['detect_types'] = self.driver.PARSE_DECLTYPES def connector(dbpath=self.dbpath, driver_args=driver_args): return self.driver.Connection(dbpath, **driver_args) self.connector = connector if do_connect: self.reconnect() def after_connection(self): self.connection.create_function('web2py_extract', 2, SQLiteAdapter.web2py_extract) self.connection.create_function("REGEXP", 2, SQLiteAdapter.web2py_regexp) if self.adapter_args.get('foreign_keys',True): self.execute('PRAGMA foreign_keys=ON;') def _truncate(self, table, mode=''): tablename = table._tablename return ['DELETE FROM %s;' % tablename, "DELETE FROM sqlite_sequence WHERE name='%s';" % tablename] def REGEXP(self,first,second): return '(%s REGEXP %s)' % (self.expand(first), self.expand(second,'string')) def delete(self, tablename, query): # SQLite requires its own delete to handle CASCADE db = self.db table = db[tablename] deleted = [x[table._id.name] for x in db(query).select(table._id)] counter = super(SQLiteAdapter, self).delete(tablename, query) if counter: for field in table._referenced_by: if field.type == 'reference '+ tablename \ and field.ondelete == 'CASCADE': db(field.belongs(deleted)).delete() return counter def select(self, query, fields, attributes): """ Simulate `SELECT ... FOR UPDATE` with `BEGIN IMMEDIATE TRANSACTION`. Note that the entire database, rather than one record, is locked (it will be locked eventually anyway by the following UPDATE). """ if attributes.get('for_update', False) and not 'cache' in attributes: self.execute('BEGIN IMMEDIATE TRANSACTION;') return super(SQLiteAdapter, self).select(query, fields, attributes) SPATIALLIBS = { 'Windows':'libspatialite', 'Linux':'libspatialite.so', 'Darwin':'libspatialite.dylib' } class SpatiaLiteAdapter(SQLiteAdapter): drivers = ('sqlite3','sqlite2') types = copy.copy(BaseAdapter.types) types.update(geometry='GEOMETRY') def __init__(self, db, uri, pool_size=0, folder=None, db_codec ='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, srid=4326, after_connection=None): self.db = db self.dbengine = "spatialite" self.uri = uri if do_connect: self.find_driver(adapter_args) self.pool_size = 0 self.folder = folder self.db_codec = db_codec self._after_connection = after_connection self.find_or_make_work_folder() self.srid = srid path_encoding = sys.getfilesystemencoding() \ or locale.getdefaultlocale()[1] or 'utf8' if uri.startswith('spatialite:memory'): self.dbpath = ':memory:' else: self.dbpath = uri.split('://',1)[1] if self.dbpath[0] != '/': self.dbpath = pjoin( self.folder.decode(path_encoding).encode('utf8'), self.dbpath) if not 'check_same_thread' in driver_args: driver_args['check_same_thread'] = False if not 'detect_types' in driver_args and do_connect: driver_args['detect_types'] = self.driver.PARSE_DECLTYPES def connector(dbpath=self.dbpath, driver_args=driver_args): return self.driver.Connection(dbpath, **driver_args) self.connector = connector if do_connect: self.reconnect() def after_connection(self): self.connection.enable_load_extension(True) # for Windows, rename libspatialite-2.dll to libspatialite.dll # Linux uses libspatialite.so # Mac OS X uses libspatialite.dylib libspatialite = SPATIALLIBS[platform.system()] self.execute(r'SELECT load_extension("%s");' % libspatialite) self.connection.create_function('web2py_extract', 2, SQLiteAdapter.web2py_extract) self.connection.create_function("REGEXP", 2, SQLiteAdapter.web2py_regexp) # GIS functions def ST_ASGEOJSON(self, first, second): return 'AsGeoJSON(%s,%s,%s)' %(self.expand(first), second['precision'], second['options']) def ST_ASTEXT(self, first): return 'AsText(%s)' %(self.expand(first)) def ST_CONTAINS(self, first, second): return 'Contains(%s,%s)' %(self.expand(first), self.expand(second, first.type)) def ST_DISTANCE(self, first, second): return 'Distance(%s,%s)' %(self.expand(first), self.expand(second, first.type)) def ST_EQUALS(self, first, second): return 'Equals(%s,%s)' %(self.expand(first), self.expand(second, first.type)) def ST_INTERSECTS(self, first, second): return 'Intersects(%s,%s)' %(self.expand(first), self.expand(second, first.type)) def ST_OVERLAPS(self, first, second): return 'Overlaps(%s,%s)' %(self.expand(first), self.expand(second, first.type)) def ST_SIMPLIFY(self, first, second): return 'Simplify(%s,%s)' %(self.expand(first), self.expand(second, 'double')) def ST_TOUCHES(self, first, second): return 'Touches(%s,%s)' %(self.expand(first), self.expand(second, first.type)) def ST_WITHIN(self, first, second): return 'Within(%s,%s)' %(self.expand(first), self.expand(second, first.type)) def represent(self, obj, fieldtype): field_is_type = fieldtype.startswith if field_is_type('geo'): srid = 4326 # Spatialite default srid for geometry geotype, parms = fieldtype[:-1].split('(') parms = parms.split(',') if len(parms) >= 2: schema, srid = parms[:2] # if field_is_type('geometry'): value = "ST_GeomFromText('%s',%s)" %(obj, srid) # elif field_is_type('geography'): # value = "ST_GeogFromText('SRID=%s;%s')" %(srid, obj) # else: # raise SyntaxError, 'Invalid field type %s' %fieldtype return value return BaseAdapter.represent(self, obj, fieldtype) class JDBCSQLiteAdapter(SQLiteAdapter): drivers = ('zxJDBC_sqlite',) def __init__(self, db, uri, pool_size=0, folder=None, db_codec='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, after_connection=None): self.db = db self.dbengine = "sqlite" self.uri = uri if do_connect: self.find_driver(adapter_args) self.pool_size = pool_size self.folder = folder self.db_codec = db_codec self._after_connection = after_connection self.find_or_make_work_folder() path_encoding = sys.getfilesystemencoding() \ or locale.getdefaultlocale()[1] or 'utf8' if uri.startswith('sqlite:memory'): self.dbpath = ':memory:' else: self.dbpath = uri.split('://',1)[1] if self.dbpath[0] != '/': self.dbpath = pjoin( self.folder.decode(path_encoding).encode('utf8'), self.dbpath) def connector(dbpath=self.dbpath,driver_args=driver_args): return self.driver.connect( self.driver.getConnection('jdbc:sqlite:'+dbpath), **driver_args) self.connector = connector if do_connect: self.reconnect() def after_connection(self): # FIXME http://www.zentus.com/sqlitejdbc/custom_functions.html for UDFs self.connection.create_function('web2py_extract', 2, SQLiteAdapter.web2py_extract) def execute(self, a): return self.log_execute(a) web2py-2.12.3.orig/gluon/packages/dal/pydal/adapters/ingres.py0000664000000000000000000001465312564727432022712 0ustar rootroot# -*- coding: utf-8 -*- from .._globals import IDENTITY from ..drivers import pyodbc from .base import BaseAdapter # NOTE invalid database object name (ANSI-SQL wants # this form of name to be a delimited identifier) INGRES_SEQNAME='ii***lineitemsequence' class IngresAdapter(BaseAdapter): drivers = ('pyodbc',) types = { 'boolean': 'CHAR(1)', 'string': 'VARCHAR(%(length)s)', 'text': 'CLOB', 'json': 'CLOB', 'password': 'VARCHAR(%(length)s)', ## Not sure what this contains utf8 or nvarchar. Or even bytes? 'blob': 'BLOB', 'upload': 'VARCHAR(%(length)s)', ## FIXME utf8 or nvarchar... or blob? what is this type? 'integer': 'INTEGER4', # or int8... 'bigint': 'BIGINT', 'float': 'FLOAT', 'double': 'FLOAT8', 'decimal': 'NUMERIC(%(precision)s,%(scale)s)', 'date': 'ANSIDATE', 'time': 'TIME WITHOUT TIME ZONE', 'datetime': 'TIMESTAMP WITHOUT TIME ZONE', 'id': 'int not null unique with default next value for %s' % INGRES_SEQNAME, 'reference': 'INT, FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'list:integer': 'CLOB', 'list:string': 'CLOB', 'list:reference': 'CLOB', 'big-id': 'bigint not null unique with default next value for %s' % INGRES_SEQNAME, 'big-reference': 'BIGINT, FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference FK': ', CONSTRAINT FK_%(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference TFK': ' CONSTRAINT FK_%(foreign_table)s_PK FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_table)s (%(foreign_key)s) ON DELETE %(on_delete_action)s', ## FIXME TODO } def LEFT_JOIN(self): return 'LEFT OUTER JOIN' def RANDOM(self): return 'RANDOM()' def select_limitby(self, sql_s, sql_f, sql_t, sql_w, sql_o, limitby): if limitby: (lmin, lmax) = limitby fetch_amt = lmax - lmin if fetch_amt: sql_s += ' FIRST %d ' % (fetch_amt, ) if lmin: # Requires Ingres 9.2+ sql_o += ' OFFSET %d' % (lmin, ) return 'SELECT %s %s FROM %s%s%s;' % (sql_s, sql_f, sql_t, sql_w, sql_o) def __init__(self,db,uri,pool_size=0,folder=None,db_codec ='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, after_connection=None): self.db = db self.dbengine = "ingres" self._driver = pyodbc self.uri = uri if do_connect: self.find_driver(adapter_args,uri) self.pool_size = pool_size self.folder = folder self.db_codec = db_codec self._after_connection = after_connection self.find_or_make_work_folder() connstr = uri.split(':', 1)[1] # Simple URI processing connstr = connstr.lstrip() while connstr.startswith('/'): connstr = connstr[1:] if '=' in connstr: # Assume we have a regular ODBC connection string and just use it ruri = connstr else: # Assume only (local) dbname is passed in with OS auth database_name = connstr default_driver_name = 'Ingres' vnode = '(local)' servertype = 'ingres' ruri = 'Driver={%s};Server=%s;Database=%s' % (default_driver_name, vnode, database_name) def connector(cnxn=ruri,driver_args=driver_args): return self.driver.connect(cnxn,**driver_args) self.connector = connector # TODO if version is >= 10, set types['id'] to Identity column, see http://community.actian.com/wiki/Using_Ingres_Identity_Columns if do_connect: self.reconnect() def create_sequence_and_triggers(self, query, table, **args): # post create table auto inc code (if needed) # modify table to btree for performance.... # Older Ingres releases could use rule/trigger like Oracle above. if hasattr(table,'_primarykey'): modify_tbl_sql = 'modify %s to btree unique on %s' % \ (table._tablename, ', '.join(["'%s'" % x for x in table.primarykey])) self.execute(modify_tbl_sql) else: tmp_seqname='%s_iisq' % table._tablename query=query.replace(INGRES_SEQNAME, tmp_seqname) self.execute('create sequence %s' % tmp_seqname) self.execute(query) self.execute('modify %s to btree unique on %s' % (table._tablename, 'id')) def lastrowid(self,table): tmp_seqname='%s_iisq' % table self.execute('select current value for %s' % tmp_seqname) return long(self.cursor.fetchone()[0]) # don't really need int type cast here... class IngresUnicodeAdapter(IngresAdapter): drivers = ('pyodbc',) types = { 'boolean': 'CHAR(1)', 'string': 'NVARCHAR(%(length)s)', 'text': 'NCLOB', 'json': 'NCLOB', 'password': 'NVARCHAR(%(length)s)', ## Not sure what this contains utf8 or nvarchar. Or even bytes? 'blob': 'BLOB', 'upload': 'VARCHAR(%(length)s)', ## FIXME utf8 or nvarchar... or blob? what is this type? 'integer': 'INTEGER4', # or int8... 'bigint': 'BIGINT', 'float': 'FLOAT', 'double': 'FLOAT8', 'decimal': 'NUMERIC(%(precision)s,%(scale)s)', 'date': 'ANSIDATE', 'time': 'TIME WITHOUT TIME ZONE', 'datetime': 'TIMESTAMP WITHOUT TIME ZONE', 'id': 'INTEGER4 not null unique with default next value for %s'% INGRES_SEQNAME, 'reference': 'INTEGER4, FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'list:integer': 'NCLOB', 'list:string': 'NCLOB', 'list:reference': 'NCLOB', 'big-id': 'BIGINT not null unique with default next value for %s'% INGRES_SEQNAME, 'big-reference': 'BIGINT, FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference FK': ', CONSTRAINT FK_%(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference TFK': ' CONSTRAINT FK_%(foreign_table)s_PK FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_table)s (%(foreign_key)s) ON DELETE %(on_delete_action)s', ## FIXME TODO } web2py-2.12.3.orig/gluon/packages/dal/pydal/adapters/__init__.py0000664000000000000000000000504612564727432023156 0ustar rootroot# -*- coding: utf-8 -*- from .._gae import gae from .sqlite import SQLiteAdapter, SpatiaLiteAdapter, JDBCSQLiteAdapter from .mysql import MySQLAdapter from .postgres import PostgreSQLAdapter, NewPostgreSQLAdapter, \ JDBCPostgreSQLAdapter from .oracle import OracleAdapter from .mssql import MSSQLAdapter, MSSQL2Adapter, MSSQL3Adapter, MSSQL4Adapter, \ MSSQLNAdapter, MSSQL3NAdapter, MSSQL4NAdapter, VerticaAdapter, SybaseAdapter from .firebird import FireBirdAdapter from .informix import InformixAdapter, InformixSEAdapter from .db2 import DB2Adapter from .teradata import TeradataAdapter from .ingres import IngresAdapter, IngresUnicodeAdapter from .sapdb import SAPDBAdapter from .cubrid import CubridAdapter from .couchdb import CouchDBAdapter from .mongo import MongoDBAdapter from .imap import IMAPAdapter ADAPTERS = { 'sqlite': SQLiteAdapter, 'spatialite': SpatiaLiteAdapter, 'sqlite:memory': SQLiteAdapter, 'spatialite:memory': SpatiaLiteAdapter, 'mysql': MySQLAdapter, 'postgres': PostgreSQLAdapter, 'postgres:psycopg2': PostgreSQLAdapter, 'postgres:pg8000': PostgreSQLAdapter, 'postgres2:psycopg2': NewPostgreSQLAdapter, 'postgres2:pg8000': NewPostgreSQLAdapter, 'oracle': OracleAdapter, 'mssql': MSSQLAdapter, 'mssql2': MSSQL2Adapter, 'mssql3': MSSQL3Adapter, 'mssql4': MSSQL4Adapter, 'mssqln' : MSSQLNAdapter, 'mssql3n' : MSSQL3NAdapter, 'mssql4n' : MSSQL4NAdapter, 'vertica': VerticaAdapter, 'sybase': SybaseAdapter, 'db2:ibm_db_dbi': DB2Adapter, 'db2:pyodbc': DB2Adapter, 'teradata': TeradataAdapter, 'informix': InformixAdapter, 'informix-se': InformixSEAdapter, 'firebird': FireBirdAdapter, 'firebird_embedded': FireBirdAdapter, 'ingres': IngresAdapter, 'ingresu': IngresUnicodeAdapter, 'sapdb': SAPDBAdapter, 'cubrid': CubridAdapter, 'jdbc:sqlite': JDBCSQLiteAdapter, 'jdbc:sqlite:memory': JDBCSQLiteAdapter, 'jdbc:postgres': JDBCPostgreSQLAdapter, 'couchdb': CouchDBAdapter, 'mongodb': MongoDBAdapter, 'imap': IMAPAdapter } #: load google adapters if needed if gae is not None: from .google_adapters import GoogleDatastoreAdapter, GoogleSQLAdapter # discouraged, for backward compatibility ADAPTERS['gae'] = GoogleDatastoreAdapter # add gae adapters ADAPTERS['google:datastore'] = GoogleDatastoreAdapter ADAPTERS['google:datastore+ndb'] = GoogleDatastoreAdapter ADAPTERS['google:sql'] = GoogleSQLAdapter else: #: make the import available for BaseAdapter GoogleDatastoreAdapter = None web2py-2.12.3.orig/gluon/packages/dal/pydal/adapters/imap.py0000664000000000000000000012377312564727432022355 0ustar rootroot# -*- coding: utf-8 -*- import datetime import re import sys from .._globals import IDENTITY, GLOBAL_LOCKER from .._compat import PY2, integer_types, basestring from ..connection import ConnectionPool from ..objects import Field, Query, Expression from ..helpers.classes import SQLALL from ..helpers.methods import use_common_filters from .base import NoSQLAdapter long = integer_types[-1] class IMAPAdapter(NoSQLAdapter): """ IMAP server adapter This class is intended as an interface with email IMAP servers to perform simple queries in the web2py DAL query syntax, so email read, search and other related IMAP mail services (as those implemented by brands like Google(r), and Yahoo!(r) can be managed from web2py applications. The code uses examples by Yuji Tomita on this post: http://yuji.wordpress.com/2011/06/22/python-imaplib-imap-example-with-gmail/#comment-1137 and is based in docs for Python imaplib, python email and email IETF's (i.e. RFC2060 and RFC3501) This adapter was tested with a small set of operations with Gmail(r). Other services requests could raise command syntax and response data issues. It creates its table and field names "statically", meaning that the developer should leave the table and field definitions to the DAL instance by calling the adapter's .define_tables() method. The tables are defined with the IMAP server mailbox list information. .define_tables() returns a dictionary mapping dal tablenames to the server mailbox names with the following structure: {: str } Here is a list of supported fields: =========== ============== =========== Field Type Description =========== ============== =========== uid string answered boolean Flag created date content list:string A list of dict text or html parts to string cc string bcc string size integer the amount of octets of the message* deleted boolean Flag draft boolean Flag flagged boolean Flag sender string recent boolean Flag seen boolean Flag subject string mime string The mime header declaration email string The complete RFC822 message (*) attachments list Each non text part as dict encoding string The main detected encoding =========== ============== =========== (*) At the application side it is measured as the length of the RFC822 message string WARNING: As row id's are mapped to email sequence numbers, make sure your imap client web2py app does not delete messages during select or update actions, to prevent updating or deleting different messages. Sequence numbers change whenever the mailbox is updated. To avoid this sequence numbers issues, it is recommended the use of uid fields in query references (although the update and delete in separate actions rule still applies). :: # This is the code recommended to start imap support # at the app's model: imapdb = DAL("imap://user:password@server:port", pool_size=1) # port 993 for ssl imapdb.define_tables() Here is an (incomplete) list of possible imap commands:: # Count today's unseen messages # smaller than 6000 octets from the # inbox mailbox q = imapdb.INBOX.seen == False q &= imapdb.INBOX.created == datetime.date.today() q &= imapdb.INBOX.size < 6000 unread = imapdb(q).count() # Fetch last query messages rows = imapdb(q).select() # it is also possible to filter query select results with limitby and # sequences of mailbox fields set.select(, limitby=(, )) # Mark last query messages as seen messages = [row.uid for row in rows] seen = imapdb(imapdb.INBOX.uid.belongs(messages)).update(seen=True) # Delete messages in the imap database that have mails from mr. Gumby deleted = 0 for mailbox in imapdb.tables deleted += imapdb(imapdb[mailbox].sender.contains("gumby")).delete() # It is possible also to mark messages for deletion instead of ereasing them # directly with set.update(deleted=True) # This object give access # to the adapter auto mailbox # mapped names (which native # mailbox has what table name) imapdb.mailboxes # tablename, server native name pairs # To retrieve a table native mailbox name use: imapdb.
.mailbox ### New features v2.4.1: # Declare mailboxes statically with tablename, name pairs # This avoids the extra server names retrieval imapdb.define_tables({"inbox": "INBOX"}) # Selects without content/attachments/email columns will only # fetch header and flags imapdb(q).select(imapdb.INBOX.sender, imapdb.INBOX.subject) """ drivers = ('imaplib',) types = { 'string': str, 'text': str, 'date': datetime.date, 'datetime': datetime.datetime, 'id': long, 'boolean': bool, 'integer': int, 'bigint': long, 'blob': str, 'list:string': str } dbengine = 'imap' REGEX_URI = re.compile('^(?P[^:]+)(\:(?P[^@]*))?@(?P[^\:@]+)(\:(?P[0-9]+))?$') def __init__(self, db, uri, pool_size=0, folder=None, db_codec ='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, after_connection=None): super(IMAPAdapter, self).__init__( db=db, uri=uri, pool_size=pool_size, folder=folder, db_codec=db_codec, credential_decoder=credential_decoder, driver_args=driver_args, adapter_args=adapter_args, do_connect=do_connect, after_connection=after_connection) # db uri: user@example.com:password@imap.server.com:123 # TODO: max size adapter argument for preventing large mail transfers if do_connect: self.find_driver(adapter_args) self.credential_decoder = credential_decoder self.driver_args = driver_args self.adapter_args = adapter_args self.mailbox_size = None self.static_names = None self.charset = sys.getfilesystemencoding() # imap class self.imap4 = None uri = uri.split("://")[1] """ MESSAGE is an identifier for sequence number""" self.flags = {'deleted': '\\Deleted', 'draft': '\\Draft', 'flagged': '\\Flagged', 'recent': '\\Recent', 'seen': '\\Seen', 'answered': '\\Answered'} self.search_fields = { 'id': 'MESSAGE', 'created': 'DATE', 'uid': 'UID', 'sender': 'FROM', 'to': 'TO', 'cc': 'CC', 'bcc': 'BCC', 'content': 'TEXT', 'size': 'SIZE', 'deleted': '\\Deleted', 'draft': '\\Draft', 'flagged': '\\Flagged', 'recent': '\\Recent', 'seen': '\\Seen', 'subject': 'SUBJECT', 'answered': '\\Answered', 'mime': None, 'email': None, 'attachments': None } db['_lastsql'] = '' m = self.REGEX_URI.match(uri) user = m.group('user') password = m.group('password') host = m.group('host') port = int(m.group('port')) over_ssl = False if port==993: over_ssl = True driver_args.update(host=host,port=port, password=password, user=user) def connector(driver_args=driver_args): # it is assumed sucessful authentication alLways # TODO: support direct connection and login tests if over_ssl: self.imap4 = self.driver.IMAP4_SSL else: self.imap4 = self.driver.IMAP4 connection = self.imap4(driver_args["host"], driver_args["port"]) data = connection.login(driver_args["user"], driver_args["password"]) # static mailbox list connection.mailbox_names = None # dummy dbapi functions connection.cursor = lambda : self.fake_cursor connection.close = lambda : None connection.commit = lambda : None return connection self.db.define_tables = self.define_tables self.connector = connector if do_connect: self.reconnect() def reconnect(self, f=None): """ IMAP4 Pool connection method imap connection lacks of self cursor command. A custom command should be provided as a replacement for connection pooling to prevent uncaught remote session closing """ if getattr(self, 'connection', None) is not None: return if f is None: f = self.connector if not self.pool_size: self.connection = f() self.cursor = self.connection.cursor() else: POOLS = ConnectionPool.POOLS uri = self.uri while True: GLOBAL_LOCKER.acquire() if not uri in POOLS: POOLS[uri] = [] if POOLS[uri]: self.connection = POOLS[uri].pop() GLOBAL_LOCKER.release() self.cursor = self.connection.cursor() if self.cursor and self.check_active_connection: try: # check if connection is alive or close it result, data = self.connection.list() except: # Possible connection reset error # TODO: read exception class self.connection = f() break else: GLOBAL_LOCKER.release() self.connection = f() self.cursor = self.connection.cursor() break self.after_connection_hook() def get_last_message(self, tablename): last_message = None # request mailbox list to the server if needed. if not isinstance(self.connection.mailbox_names, dict): self.get_mailboxes() try: result = self.connection.select( self.connection.mailbox_names[tablename]) last_message = int(result[1][0]) # Last message must be a positive integer if last_message == 0: last_message = 1 except (IndexError, ValueError, TypeError, KeyError): e = sys.exc_info()[1] self.db.logger.debug("Error retrieving the last mailbox" + " sequence number. %s" % str(e)) return last_message def get_uid_bounds(self, tablename): if not isinstance(self.connection.mailbox_names, dict): self.get_mailboxes() # fetch first and last messages # return (first, last) messages uid's last_message = self.get_last_message(tablename) result, data = self.connection.uid("search", None, "(ALL)") uid_list = data[0].strip().split() if len(uid_list) <= 0: return None else: return (uid_list[0], uid_list[-1]) def convert_date(self, date, add=None, imf=False): if add is None: add = datetime.timedelta() """ Convert a date object to a string with d-Mon-Y style for IMAP or the inverse case add adds to the date object """ months = [None, "JAN","FEB","MAR","APR","MAY","JUN", "JUL", "AUG","SEP","OCT","NOV","DEC"] if isinstance(date, basestring): # Prevent unexpected date response format try: if "," in date: dayname, datestring = date.split(",") else: dayname, datestring = None, date date_list = datestring.strip().split() year = int(date_list[2]) month = months.index(date_list[1].upper()) day = int(date_list[0]) hms = list(map(int, date_list[3].split(":"))) return datetime.datetime(year, month, day, hms[0], hms[1], hms[2]) + add except (ValueError, AttributeError, IndexError) as e: self.db.logger.error("Could not parse date text: %s. %s" % (date, e)) return None elif isinstance(date, (datetime.date, datetime.datetime)): if imf: date_format = "%a, %d %b %Y %H:%M:%S %z" else: date_format = "%d-%b-%Y" return (date + add).strftime(date_format) else: return None @staticmethod def header_represent(f, r): from email.header import decode_header text, encoding = decode_header(f)[0] if encoding: text = text.decode(encoding).encode('utf-8') return text def encode_text(self, text, charset, errors="replace"): """ convert text for mail to unicode""" if text is None: text = "" if PY2: if isinstance(text, str): if charset is None: text = unicode(text, "utf-8", errors) else: text = unicode(text, charset, errors) else: raise Exception("Unsupported mail text type %s" % type(text)) return text.encode("utf-8") else: if isinstance(text, bytes): return text.decode("utf-8") return text def get_charset(self, message): charset = message.get_content_charset() return charset def get_mailboxes(self): """ Query the mail database for mailbox names """ if self.static_names: # statically defined mailbox names self.connection.mailbox_names = self.static_names return self.static_names.keys() mailboxes_list = self.connection.list() self.connection.mailbox_names = dict() mailboxes = list() x = 0 for item in mailboxes_list[1]: x = x + 1 item = item.strip() if not "NOSELECT" in item.upper(): sub_items = item.split("\"") sub_items = [sub_item for sub_item in sub_items \ if len(sub_item.strip()) > 0] # mailbox = sub_items[len(sub_items) -1] mailbox = sub_items[-1].strip() # remove unwanted characters and store original names # Don't allow leading non alphabetic characters mailbox_name = re.sub('^[_0-9]*', '', re.sub('[^_\w]','',re.sub('[/ ]','_',mailbox))) mailboxes.append(mailbox_name) self.connection.mailbox_names[mailbox_name] = mailbox return mailboxes def get_query_mailbox(self, query): nofield = True tablename = None attr = query while nofield: if hasattr(attr, "first"): attr = attr.first if isinstance(attr, Field): return attr.tablename elif isinstance(attr, Query): pass else: return None else: return None return tablename def is_flag(self, flag): if self.search_fields.get(flag, None) in self.flags.values(): return True else: return False def define_tables(self, mailbox_names=None): """ Auto create common IMAP fileds This function creates fields definitions "statically" meaning that custom fields as in other adapters should not be supported and definitions handled on a service/mode basis (local syntax for Gmail(r), Ymail(r) Returns a dictionary with tablename, server native mailbox name pairs. """ if mailbox_names: # optional statically declared mailboxes self.static_names = mailbox_names else: self.static_names = None if not isinstance(self.connection.mailbox_names, dict): self.get_mailboxes() names = self.connection.mailbox_names.keys() for name in names: self.db.define_table("%s" % name, Field("uid", writable=False), Field("created", "datetime", writable=False), Field("content", "text", writable=False), Field("to", writable=False), Field("cc", writable=False), Field("bcc", writable=False), Field("sender", writable=False), Field("size", "integer", writable=False), Field("subject", writable=False), Field("mime", writable=False), Field("email", "text", writable=False, readable=False), Field("attachments", "text", writable=False, readable=False), Field("encoding", writable=False), Field("answered", "boolean"), Field("deleted", "boolean"), Field("draft", "boolean"), Field("flagged", "boolean"), Field("recent", "boolean", writable=False), Field("seen", "boolean") ) # Set a special _mailbox attribute for storing # native mailbox names self.db[name].mailbox = \ self.connection.mailbox_names[name] # decode quoted printable self.db[name].to.represent = self.db[name].cc.represent = \ self.db[name].bcc.represent = self.db[name].sender.represent = \ self.db[name].subject.represent = self.header_represent # Set the db instance mailbox collections self.db.mailboxes = self.connection.mailbox_names return self.db.mailboxes def create_table(self, *args, **kwargs): # not implemented # but required by DAL pass def select(self, query, fields, attributes): """ Searches and Fetches records and return web2py rows """ # move this statement elsewhere (upper-level) if use_common_filters(query): query = self.common_filter(query, [self.get_query_mailbox(query),]) import email # get records from imap server with search + fetch # convert results to a dictionary tablename = None fetch_results = list() if isinstance(query, Query): tablename = self.get_table(query) mailbox = self.connection.mailbox_names.get(tablename, None) if mailbox is None: raise ValueError("Mailbox name not found: %s" % mailbox) else: # select with readonly result, selected = self.connection.select(mailbox, True) if result != "OK": raise Exception("IMAP error: %s" % selected) self.mailbox_size = int(selected[0]) search_query = "(%s)" % str(query).strip() search_result = self.connection.uid("search", None, search_query) # Normal IMAP response OK is assumed (change this) if search_result[0] == "OK": # For "light" remote server responses just get the first # ten records (change for non-experimental implementation) # However, light responses are not guaranteed with this # approach, just fewer messages. limitby = attributes.get('limitby', None) messages_set = search_result[1][0].split() # descending order messages_set.reverse() if limitby is not None: # TODO: orderby, asc/desc, limitby from complete message set messages_set = messages_set[int(limitby[0]):int(limitby[1])] # keep the requests small for header/flags if any([(field.name in ["content", "size", "attachments", "email"]) for field in fields]): imap_fields = "(RFC822 FLAGS)" else: imap_fields = "(RFC822.HEADER FLAGS)" if len(messages_set) > 0: # create fetch results object list # fetch each remote message and store it in memmory # (change to multi-fetch command syntax for faster # transactions) for uid in messages_set: # fetch the RFC822 message body typ, data = self.connection.uid("fetch", uid, imap_fields) if typ == "OK": fr = {"message": int(data[0][0].split()[0]), "uid": long(uid), "email": email.message_from_string(data[0][1]), "raw_message": data[0][1]} fr["multipart"] = fr["email"].is_multipart() # fetch flags for the message if PY2: fr["flags"] = self.driver.ParseFlags(data[1]) else: fr["flags"] = self.driver.ParseFlags( bytes(data[1], "utf-8")) fetch_results.append(fr) else: # error retrieving the message body raise Exception("IMAP error retrieving the body: %s" % data) else: raise Exception("IMAP search error: %s" % search_result[1]) elif isinstance(query, (Expression, basestring)): raise NotImplementedError() else: raise TypeError("Unexpected query type") imapqry_dict = {} imapfields_dict = {} if len(fields) == 1 and isinstance(fields[0], SQLALL): allfields = True elif len(fields) == 0: allfields = True else: allfields = False if allfields: colnames = ["%s.%s" % (tablename, field) for field in self.search_fields.keys()] else: colnames = ["%s.%s" % (tablename, field.name) for field in fields] for k in colnames: imapfields_dict[k] = k imapqry_list = list() imapqry_array = list() for fr in fetch_results: attachments = [] content = [] size = 0 n = int(fr["message"]) item_dict = dict() message = fr["email"] uid = fr["uid"] charset = self.get_charset(message) flags = fr["flags"] raw_message = fr["raw_message"] # Return messages data mapping static fields # and fetched results. Mapping should be made # outside the select function (with auxiliary # instance methods) # pending: search flags states trough the email message # instances for correct output # preserve subject encoding (ASCII/quoted printable) if "%s.id" % tablename in colnames: item_dict["%s.id" % tablename] = n if "%s.created" % tablename in colnames: item_dict["%s.created" % tablename] = self.convert_date(message["Date"]) if "%s.uid" % tablename in colnames: item_dict["%s.uid" % tablename] = uid if "%s.sender" % tablename in colnames: # If there is no encoding found in the message header # force utf-8 replacing characters (change this to # module's defaults). Applies to .sender, .to, .cc and .bcc fields item_dict["%s.sender" % tablename] = message["From"] if "%s.to" % tablename in colnames: item_dict["%s.to" % tablename] = message["To"] if "%s.cc" % tablename in colnames: if "Cc" in message.keys(): item_dict["%s.cc" % tablename] = message["Cc"] else: item_dict["%s.cc" % tablename] = "" if "%s.bcc" % tablename in colnames: if "Bcc" in message.keys(): item_dict["%s.bcc" % tablename] = message["Bcc"] else: item_dict["%s.bcc" % tablename] = "" if "%s.deleted" % tablename in colnames: item_dict["%s.deleted" % tablename] = "\\Deleted" in flags if "%s.draft" % tablename in colnames: item_dict["%s.draft" % tablename] = "\\Draft" in flags if "%s.flagged" % tablename in colnames: item_dict["%s.flagged" % tablename] = "\\Flagged" in flags if "%s.recent" % tablename in colnames: item_dict["%s.recent" % tablename] = "\\Recent" in flags if "%s.seen" % tablename in colnames: item_dict["%s.seen" % tablename] = "\\Seen" in flags if "%s.subject" % tablename in colnames: item_dict["%s.subject" % tablename] = message["Subject"] if "%s.answered" % tablename in colnames: item_dict["%s.answered" % tablename] = "\\Answered" in flags if "%s.mime" % tablename in colnames: item_dict["%s.mime" % tablename] = message.get_content_type() if "%s.encoding" % tablename in colnames: item_dict["%s.encoding" % tablename] = charset # Here goes the whole RFC822 body as an email instance # for controller side custom processing # The message is stored as a raw string # >> email.message_from_string(raw string) # returns a Message object for enhanced object processing if "%s.email" % tablename in colnames: # WARNING: no encoding performed (raw message) item_dict["%s.email" % tablename] = raw_message # Size measure as suggested in a Velocity Reviews post # by Tim Williams: "how to get size of email attachment" # Note: len() and server RFC822.SIZE reports doesn't match # To retrieve the server size for representation would add a new # fetch transaction to the process for part in message.walk(): maintype = part.get_content_maintype() if ("%s.attachments" % tablename in colnames) or \ ("%s.content" % tablename in colnames): payload = part.get_payload(decode=True) if payload: filename = part.get_filename() values = {"mime": part.get_content_type()} if ((filename or not "text" in maintype) and ("%s.attachments" % tablename in colnames)): values.update({"payload": payload, "filename": filename, "encoding": part.get_content_charset(), "disposition": part["Content-Disposition"]}) attachments.append(values) elif (("text" in maintype) and ("%s.content" % tablename in colnames)): values.update({"text": self.encode_text(payload, self.get_charset(part))}) content.append(values) if "%s.size" % tablename in colnames: if part is not None: size += len(str(part)) item_dict["%s.content" % tablename] = content item_dict["%s.attachments" % tablename] = attachments item_dict["%s.size" % tablename] = size imapqry_list.append(item_dict) # extra object mapping for the sake of rows object # creation (sends an array or lists) for item_dict in imapqry_list: imapqry_array_item = list() for fieldname in colnames: imapqry_array_item.append(item_dict[fieldname]) imapqry_array.append(imapqry_array_item) # parse result and return a rows object colnames = colnames processor = attributes.get('processor',self.parse) return processor(imapqry_array, fields, colnames) def insert(self, table, fields): def add_payload(message, obj): payload = Message() encoding = obj.get("encoding", "utf-8") if encoding and (encoding.upper() in ("BASE64", "7BIT", "8BIT", "BINARY")): payload.add_header("Content-Transfer-Encoding", encoding) else: payload.set_charset(encoding) mime = obj.get("mime", None) if mime: payload.set_type(mime) if "text" in obj: payload.set_payload(obj["text"]) elif "payload" in obj: payload.set_payload(obj["payload"]) if "filename" in obj and obj["filename"]: payload.add_header("Content-Disposition", "attachment", filename=obj["filename"]) message.attach(payload) mailbox = table.mailbox d = dict(((k.name, v) for k, v in fields)) date_time = d.get("created") or datetime.datetime.now() struct_time = date_time.timetuple() if len(d) > 0: message = d.get("email", None) attachments = d.get("attachments", []) content = d.get("content", []) flags = " ".join(["\\%s" % flag.capitalize() for flag in ("answered", "deleted", "draft", "flagged", "recent", "seen") if d.get(flag, False)]) if not message: from email.message import Message mime = d.get("mime", None) charset = d.get("encoding", None) message = Message() message["from"] = d.get("sender", "") message["subject"] = d.get("subject", "") message["date"] = self.convert_date(date_time, imf=True) if mime: message.set_type(mime) if charset: message.set_charset(charset) for item in ("to", "cc", "bcc"): value = d.get(item, "") if isinstance(value, basestring): message[item] = value else: message[item] = ";".join([i for i in value]) if (not message.is_multipart() and (not message.get_content_type().startswith( "multipart"))): if isinstance(content, basestring): message.set_payload(content) elif len(content) > 0: message.set_payload(content[0]["text"]) else: [add_payload(message, c) for c in content] [add_payload(message, a) for a in attachments] message = message.as_string() result, data = self.connection.append(mailbox, flags, struct_time, message) if result == "OK": uid = int(re.findall("\d+", str(data))[-1]) return self.db(table.uid==uid).select(table.id).first().id else: raise Exception("IMAP message append failed: %s" % data) else: raise NotImplementedError("IMAP empty insert is not implemented") def update(self, tablename, query, fields): # TODO: the adapter should implement an .expand method commands = list() rowcount = 0 if use_common_filters(query): query = self.common_filter(query, [tablename,]) mark = [] unmark = [] if query: for item in fields: field = item[0] name = field.name value = item[1] if self.is_flag(name): flag = self.search_fields[name] if (value is not None) and (flag != "\\Recent"): if value: mark.append(flag) else: unmark.append(flag) result, data = self.connection.select( self.connection.mailbox_names[tablename]) string_query = "(%s)" % query result, data = self.connection.search(None, string_query) store_list = [item.strip() for item in data[0].split() if item.strip().isdigit()] # build commands for marked flags for number in store_list: result = None if len(mark) > 0: commands.append((number, "+FLAGS", "(%s)" % " ".join(mark))) if len(unmark) > 0: commands.append((number, "-FLAGS", "(%s)" % " ".join(unmark))) for command in commands: result, data = self.connection.store(*command) if result == "OK": rowcount += 1 else: raise Exception("IMAP storing error: %s" % data) return rowcount def count(self,query,distinct=None): counter = 0 tablename = self.get_query_mailbox(query) if query and tablename is not None: if use_common_filters(query): query = self.common_filter(query, [tablename,]) result, data = self.connection.select(self.connection.mailbox_names[tablename]) string_query = "(%s)" % query result, data = self.connection.search(None, string_query) store_list = [item.strip() for item in data[0].split() if item.strip().isdigit()] counter = len(store_list) return counter def delete(self, tablename, query): counter = 0 if query: if use_common_filters(query): query = self.common_filter(query, [tablename,]) result, data = self.connection.select(self.connection.mailbox_names[tablename]) string_query = "(%s)" % query result, data = self.connection.search(None, string_query) store_list = [item.strip() for item in data[0].split() if item.strip().isdigit()] for number in store_list: result, data = self.connection.store(number, "+FLAGS", "(\\Deleted)") if result == "OK": counter += 1 else: raise Exception("IMAP store error: %s" % data) if counter > 0: result, data = self.connection.expunge() return counter def BELONGS(self, first, second): result = None name = self.search_fields[first.name] if name == "MESSAGE": values = [str(val) for val in second if str(val).isdigit()] result = "%s" % ",".join(values).strip() elif name == "UID": values = [str(val) for val in second if str(val).isdigit()] result = "UID %s" % ",".join(values).strip() else: raise Exception("Operation not supported") # result = "(%s %s)" % (self.expand(first), self.expand(second)) return result def CONTAINS(self, first, second, case_sensitive=False): # silently ignore, only case sensitive result = None name = self.search_fields[first.name] if name in ("FROM", "TO", "SUBJECT", "TEXT"): result = "%s \"%s\"" % (name, self.expand(second)) else: if first.name in ("cc", "bcc"): result = "%s \"%s\"" % (first.name.upper(), self.expand(second)) elif first.name == "mime": result = "HEADER Content-Type \"%s\"" % self.expand(second) else: raise Exception("Operation not supported") return result def GT(self, first, second): result = None name = self.search_fields[first.name] if name == "MESSAGE": last_message = self.get_last_message(first.tablename) result = "%d:%d" % (int(self.expand(second)) + 1, last_message) elif name == "UID": # GT and LT may not return # expected sets depending on # the uid format implemented try: pedestal, threshold = self.get_uid_bounds(first.tablename) except TypeError: e = sys.exc_info()[1] self.db.logger.debug("Error requesting uid bounds: %s", str(e)) return "" try: lower_limit = int(self.expand(second)) + 1 except (ValueError, TypeError): e = sys.exc_info()[1] raise Exception("Operation not supported (non integer UID)") result = "UID %s:%s" % (lower_limit, threshold) elif name == "DATE": result = "SINCE %s" % self.convert_date(second, add=datetime.timedelta(1)) elif name == "SIZE": result = "LARGER %s" % self.expand(second) else: raise Exception("Operation not supported") return result def GE(self, first, second): result = None name = self.search_fields[first.name] if name == "MESSAGE": last_message = self.get_last_message(first.tablename) result = "%s:%s" % (self.expand(second), last_message) elif name == "UID": # GT and LT may not return # expected sets depending on # the uid format implemented try: pedestal, threshold = self.get_uid_bounds(first.tablename) except TypeError: e = sys.exc_info()[1] self.db.logger.debug("Error requesting uid bounds: %s", str(e)) return "" lower_limit = self.expand(second) result = "UID %s:%s" % (lower_limit, threshold) elif name == "DATE": result = "SINCE %s" % self.convert_date(second) else: raise Exception("Operation not supported") return result def LT(self, first, second): result = None name = self.search_fields[first.name] if name == "MESSAGE": result = "%s:%s" % (1, int(self.expand(second)) - 1) elif name == "UID": try: pedestal, threshold = self.get_uid_bounds(first.tablename) except TypeError: e = sys.exc_info()[1] self.db.logger.debug("Error requesting uid bounds: %s", str(e)) return "" try: upper_limit = int(self.expand(second)) - 1 except (ValueError, TypeError): e = sys.exc_info()[1] raise Exception("Operation not supported (non integer UID)") result = "UID %s:%s" % (pedestal, upper_limit) elif name == "DATE": result = "BEFORE %s" % self.convert_date(second) elif name == "SIZE": result = "SMALLER %s" % self.expand(second) else: raise Exception("Operation not supported") return result def LE(self, first, second): result = None name = self.search_fields[first.name] if name == "MESSAGE": result = "%s:%s" % (1, self.expand(second)) elif name == "UID": try: pedestal, threshold = self.get_uid_bounds(first.tablename) except TypeError: e = sys.exc_info()[1] self.db.logger.debug("Error requesting uid bounds: %s", str(e)) return "" upper_limit = int(self.expand(second)) result = "UID %s:%s" % (pedestal, upper_limit) elif name == "DATE": result = "BEFORE %s" % self.convert_date(second, add=datetime.timedelta(1)) else: raise Exception("Operation not supported") return result def NE(self, first, second=None): if (second is None) and isinstance(first, Field): # All records special table query if first.type == "id": return self.GE(first, 1) result = self.NOT(self.EQ(first, second)) result = result.replace("NOT NOT", "").strip() return result def EQ(self,first,second): name = self.search_fields[first.name] result = None if name is not None: if name == "MESSAGE": # query by message sequence number result = "%s" % self.expand(second) elif name == "UID": result = "UID %s" % self.expand(second) elif name == "DATE": result = "ON %s" % self.convert_date(second) elif name in self.flags.values(): if second: result = "%s" % (name.upper()[1:]) else: result = "NOT %s" % (name.upper()[1:]) else: raise Exception("Operation not supported") else: raise Exception("Operation not supported") return result def AND(self, first, second): result = "%s %s" % (self.expand(first), self.expand(second)) return result def OR(self, first, second): result = "OR %s %s" % (self.expand(first), self.expand(second)) return "%s" % result.replace("OR OR", "OR") def NOT(self, first): result = "NOT %s" % self.expand(first) return result web2py-2.12.3.orig/gluon/packages/dal/pydal/adapters/oracle.py0000664000000000000000000001773112564727432022670 0ustar rootroot# -*- coding: utf-8 -*- import base64 import datetime import re from .._globals import IDENTITY from ..drivers import cx_Oracle from .base import BaseAdapter class OracleAdapter(BaseAdapter): drivers = ('cx_Oracle',) commit_on_alter_table = False types = { 'boolean': 'CHAR(1)', 'string': 'VARCHAR2(%(length)s)', 'text': 'CLOB', 'json': 'CLOB', 'password': 'VARCHAR2(%(length)s)', 'blob': 'CLOB', 'upload': 'VARCHAR2(%(length)s)', 'integer': 'INT', 'bigint': 'NUMBER', 'float': 'FLOAT', 'double': 'BINARY_DOUBLE', 'decimal': 'NUMERIC(%(precision)s,%(scale)s)', 'date': 'DATE', 'time': 'CHAR(8)', 'datetime': 'DATE', 'id': 'NUMBER PRIMARY KEY', 'reference': 'NUMBER, CONSTRAINT %(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'list:integer': 'CLOB', 'list:string': 'CLOB', 'list:reference': 'CLOB', 'big-id': 'NUMBER PRIMARY KEY', 'big-reference': 'NUMBER, CONSTRAINT %(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference FK': ', CONSTRAINT FK_%(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference TFK': ' CONSTRAINT FK_%(foreign_table)s_PK FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_table)s (%(foreign_key)s) ON DELETE %(on_delete_action)s', } def trigger_name(self,tablename): return '%s_trigger' % tablename def LEFT_JOIN(self): return 'LEFT OUTER JOIN' def RANDOM(self): return 'dbms_random.value' def NOT_NULL(self,default,field_type): return 'DEFAULT %s NOT NULL' % self.represent(default,field_type) def REGEXP(self, first, second): return 'REGEXP_LIKE(%s, %s)' % (self.expand(first), self.expand(second, 'string')) def _drop(self,table,mode): sequence_name = table._sequence_name return ['DROP TABLE %s %s;' % (table.sqlsafe, mode), 'DROP SEQUENCE %s;' % sequence_name] def select_limitby(self, sql_s, sql_f, sql_t, sql_w, sql_o, limitby): if limitby: (lmin, lmax) = limitby if len(sql_w) > 1: sql_w_row = sql_w + ' AND w_row > %i' % lmin else: sql_w_row = 'WHERE w_row > %i' % lmin return 'SELECT %s %s FROM (SELECT w_tmp.*, ROWNUM w_row FROM (SELECT %s FROM %s%s%s) w_tmp WHERE ROWNUM<=%i) %s %s %s;' % (sql_s, sql_f, sql_f, sql_t, sql_w, sql_o, lmax, sql_t, sql_w_row, sql_o) return 'SELECT %s %s FROM %s%s%s;' % (sql_s, sql_f, sql_t, sql_w, sql_o) def constraint_name(self, tablename, fieldname): constraint_name = BaseAdapter.constraint_name(self, tablename, fieldname) if len(constraint_name)>30: constraint_name = '%s_%s__constraint' % (tablename[:10], fieldname[:7]) return constraint_name def represent_exceptions(self, obj, fieldtype): if fieldtype == 'blob': obj = base64.b64encode(str(obj)) return ":CLOB('%s')" % obj elif fieldtype == 'date': if isinstance(obj, (datetime.date, datetime.datetime)): obj = obj.isoformat()[:10] else: obj = str(obj) return "to_date('%s','yyyy-mm-dd')" % obj elif fieldtype == 'datetime': if isinstance(obj, datetime.datetime): obj = obj.isoformat()[:19].replace('T',' ') elif isinstance(obj, datetime.date): obj = obj.isoformat()[:10]+' 00:00:00' else: obj = str(obj) return "to_date('%s','yyyy-mm-dd hh24:mi:ss')" % obj return None def __init__(self,db,uri,pool_size=0,folder=None,db_codec ='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, after_connection=None): self.db = db self.dbengine = "oracle" self.uri = uri if do_connect: self.find_driver(adapter_args,uri) self.pool_size = pool_size self.folder = folder self.db_codec = db_codec self._after_connection = after_connection self.find_or_make_work_folder() self.test_query = 'SELECT 1 FROM DUAL;' ruri = uri.split('://',1)[1] if not 'threaded' in driver_args: driver_args['threaded']=True def connector(uri=ruri,driver_args=driver_args): return self.driver.connect(uri,**driver_args) self.connector = connector if do_connect: self.reconnect() def after_connection(self): self.execute("ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';") self.execute("ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS';") oracle_fix = re.compile("[^']*('[^']*'[^']*)*\:(?PCLOB\('([^']+|'')*'\))") def execute(self, command, args=None): args = args or [] i = 1 while True: m = self.oracle_fix.match(command) if not m: break command = command[:m.start('clob')] + str(i) + command[m.end('clob'):] args.append(m.group('clob')[6:-2].replace("''", "'")) i += 1 if command[-1:]==';': command = command[:-1] return self.log_execute(command, args) def create_sequence_and_triggers(self, query, table, **args): tablename = table._rname or table._tablename id_name = table._id.name sequence_name = table._sequence_name trigger_name = table._trigger_name self.execute(query) self.execute('CREATE SEQUENCE %s START WITH 1 INCREMENT BY 1 NOMAXVALUE MINVALUE -1;' % sequence_name) self.execute(""" CREATE OR REPLACE TRIGGER %(trigger_name)s BEFORE INSERT ON %(tablename)s FOR EACH ROW DECLARE curr_val NUMBER; diff_val NUMBER; PRAGMA autonomous_transaction; BEGIN IF :NEW.%(id)s IS NOT NULL THEN EXECUTE IMMEDIATE 'SELECT %(sequence_name)s.nextval FROM dual' INTO curr_val; diff_val := :NEW.%(id)s - curr_val - 1; IF diff_val != 0 THEN EXECUTE IMMEDIATE 'alter sequence %(sequence_name)s increment by '|| diff_val; EXECUTE IMMEDIATE 'SELECT %(sequence_name)s.nextval FROM dual' INTO curr_val; EXECUTE IMMEDIATE 'alter sequence %(sequence_name)s increment by 1'; END IF; END IF; SELECT %(sequence_name)s.nextval INTO :NEW.%(id)s FROM DUAL; END; """ % dict(trigger_name=trigger_name, tablename=tablename, sequence_name=sequence_name,id=id_name)) def lastrowid(self,table): sequence_name = table._sequence_name self.execute('SELECT %s.currval FROM dual;' % sequence_name) return long(self.cursor.fetchone()[0]) #def parse_value(self, value, field_type, blob_decode=True): # if blob_decode and isinstance(value, cx_Oracle.LOB): # try: # value = value.read() # except self.driver.ProgrammingError: # # After a subsequent fetch the LOB value is not valid anymore # pass # return BaseAdapter.parse_value(self, value, field_type, blob_decode) def _fetchall(self): if any(x[1]==cx_Oracle.LOB for x in self.cursor.description): return [tuple([(c.read() if type(c) == cx_Oracle.LOB else c) \ for c in r]) for r in self.cursor] else: return self.cursor.fetchall() def sqlsafe_table(self, tablename, ot=None): if ot is not None: return (self.QUOTE_TEMPLATE + ' ' \ + self.QUOTE_TEMPLATE) % (ot, tablename) return self.QUOTE_TEMPLATE % tablename web2py-2.12.3.orig/gluon/packages/dal/pydal/adapters/informix.py0000664000000000000000000001206012564727432023244 0ustar rootroot# -*- coding: utf-8 -*- import datetime import re from .._globals import IDENTITY from .base import BaseAdapter class InformixAdapter(BaseAdapter): drivers = ('informixdb',) types = { 'boolean': 'CHAR(1)', 'string': 'VARCHAR(%(length)s)', 'text': 'BLOB SUB_TYPE 1', 'json': 'BLOB SUB_TYPE 1', 'password': 'VARCHAR(%(length)s)', 'blob': 'BLOB SUB_TYPE 0', 'upload': 'VARCHAR(%(length)s)', 'integer': 'INTEGER', 'bigint': 'BIGINT', 'float': 'FLOAT', 'double': 'DOUBLE PRECISION', 'decimal': 'NUMERIC(%(precision)s,%(scale)s)', 'date': 'DATE', 'time': 'CHAR(8)', 'datetime': 'DATETIME', 'id': 'SERIAL', 'reference': 'INTEGER REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'list:integer': 'BLOB SUB_TYPE 1', 'list:string': 'BLOB SUB_TYPE 1', 'list:reference': 'BLOB SUB_TYPE 1', 'big-id': 'BIGSERIAL', 'big-reference': 'BIGINT REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference FK': 'REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s CONSTRAINT FK_%(table_name)s_%(field_name)s', 'reference TFK': 'FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_table)s (%(foreign_key)s) ON DELETE %(on_delete_action)s CONSTRAINT TFK_%(table_name)s_%(field_name)s', } def RANDOM(self): return 'Random()' def NOT_NULL(self,default,field_type): return 'DEFAULT %s NOT NULL' % self.represent(default,field_type) def select_limitby(self, sql_s, sql_f, sql_t, sql_w, sql_o, limitby): if limitby: (lmin, lmax) = limitby fetch_amt = lmax - lmin dbms_version = int(self.connection.dbms_version.split('.')[0]) if lmin and (dbms_version >= 10): # Requires Informix 10.0+ sql_s += ' SKIP %d' % (lmin, ) if fetch_amt and (dbms_version >= 9): # Requires Informix 9.0+ sql_s += ' FIRST %d' % (fetch_amt, ) return 'SELECT %s %s FROM %s%s%s;' % (sql_s, sql_f, sql_t, sql_w, sql_o) def represent_exceptions(self, obj, fieldtype): if fieldtype == 'date': if isinstance(obj, (datetime.date, datetime.datetime)): obj = obj.isoformat()[:10] else: obj = str(obj) return "to_date('%s','%%Y-%%m-%%d')" % obj elif fieldtype == 'datetime': if isinstance(obj, datetime.datetime): obj = obj.isoformat()[:19].replace('T',' ') elif isinstance(obj, datetime.date): obj = obj.isoformat()[:10]+' 00:00:00' else: obj = str(obj) return "to_date('%s','%%Y-%%m-%%d %%H:%%M:%%S')" % obj return None REGEX_URI = re.compile('^(?P[^:@]+)(\:(?P[^@]*))?@(?P[^\:/]+)(\:(?P[0-9]+))?/(?P.+)$') def __init__(self,db,uri,pool_size=0,folder=None,db_codec ='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, after_connection=None): self.db = db self.dbengine = "informix" self.uri = uri if do_connect: self.find_driver(adapter_args,uri) self.pool_size = pool_size self.folder = folder self.db_codec = db_codec self._after_connection = after_connection self.find_or_make_work_folder() self.test_query = 'SELECT COUNT(*) FROM systables;' ruri = uri.split('://',1)[1] m = self.REGEX_URI.match(ruri) if not m: raise SyntaxError( "Invalid URI string in DAL: %s" % self.uri) user = credential_decoder(m.group('user')) if not user: raise SyntaxError('User required') password = credential_decoder(m.group('password')) if not password: password = '' host = m.group('host') if not host: raise SyntaxError('Host name required') db = m.group('db') if not db: raise SyntaxError('Database name required') user = credential_decoder(user) password = credential_decoder(password) dsn = '%s@%s' % (db,host) driver_args.update(user=user,password=password) def connector(dsn=dsn,driver_args=driver_args): return self.driver.connect(dsn,**driver_args) self.connector = connector if do_connect: self.reconnect() def execute(self,command): if command[-1:]==';': command = command[:-1] return self.log_execute(command) def lastrowid(self,table): return self.cursor.sqlerrd[1] class InformixSEAdapter(InformixAdapter): """ work in progress """ def select_limitby(self, sql_s, sql_f, sql_t, sql_w, sql_o, limitby): return 'SELECT %s %s FROM %s%s%s;' % \ (sql_s, sql_f, sql_t, sql_w, sql_o) def rowslice(self,rows,minimum=0,maximum=None): if maximum is None: return rows[minimum:] return rows[minimum:maximum] web2py-2.12.3.orig/gluon/packages/dal/pydal/adapters/mongo.py0000664000000000000000000015154712564727432022546 0ustar rootroot# -*- coding: utf-8 -*- import datetime import re from .._globals import IDENTITY from .._compat import integer_types, basestring, PY2 from ..objects import Table, Query, Field, Expression, Row from ..helpers.classes import SQLALL, Reference from ..helpers.methods import use_common_filters, xorify from .base import NoSQLAdapter try: from bson import Binary from bson.binary import USER_DEFINED_SUBTYPE except: class Binary(object): pass USER_DEFINED_SUBTYPE = 0 long = integer_types[-1] class MongoDBAdapter(NoSQLAdapter): drivers = ('pymongo',) driver_auto_json = ['loads', 'dumps'] uploads_in_blob = False types = { 'boolean': bool, 'string': str, 'text': str, 'json': str, 'password': str, 'blob': str, 'upload': str, 'integer': long, 'bigint': long, 'float': float, 'double': float, 'date': datetime.date, 'time': datetime.time, 'datetime': datetime.datetime, 'id': long, 'reference': long, 'list:string': list, 'list:integer': list, 'list:reference': list, } GROUP_MARK = "__#GROUP#__" AS_MARK = "__#AS#__" REGEXP_MARK1 = "__#REGEXP_1#__" REGEXP_MARK2 = "__#REGEXP_2#__" def __init__(self, db, uri='mongodb://127.0.0.1:5984/db', pool_size=0, folder=None, db_codec='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, after_connection=None): super(MongoDBAdapter, self).__init__( db=db, uri=uri, pool_size=pool_size, folder=folder, db_codec=db_codec, credential_decoder=credential_decoder, driver_args=driver_args, adapter_args=adapter_args, do_connect=do_connect, after_connection=after_connection) if do_connect: self.find_driver(adapter_args) from pymongo import version if 'fake_version' in driver_args: version = driver_args['fake_version'] if int(version.split('.')[0]) < 3: raise Exception( "pydal requires pymongo version >= 3.0, found '%s'" % version) import random from bson.objectid import ObjectId from bson.son import SON import pymongo.uri_parser from pymongo.write_concern import WriteConcern m = pymongo.uri_parser.parse_uri(uri) self.epoch = datetime.datetime.fromtimestamp(0) self.SON = SON self.ObjectId = ObjectId self.random = random self.WriteConcern = WriteConcern self.dbengine = 'mongodb' db['_lastsql'] = '' self.db_codec = 'UTF-8' self.find_or_make_work_folder() # this is the minimum amount of replicates that it should wait # for on insert/update self.minimumreplication = adapter_args.get('minimumreplication', 0) # by default all inserts and selects are performed asynchronous, # but now the default is # synchronous, except when overruled by either this default or # function parameter self.safe = 1 if adapter_args.get('safe', True) else 0 if isinstance(m, tuple): m = {"database": m[1]} if m.get('database') is None: raise SyntaxError("Database is required!") def connector(uri=self.uri, m=m): driver = self.driver.MongoClient(uri, w=self.safe)[m.get('database')] driver.cursor = lambda: self.fake_cursor driver.close = lambda: None driver.commit = lambda: None return driver self.connector = connector self.reconnect() # _server_version is a string like '3.0.3' or '2.4.12' self._server_version = self.connection.command("serverStatus")['version'] self.server_version = tuple( [int(x) for x in self._server_version.split('.')]) self.server_version_major = ( self.server_version[0] + self.server_version[1] / 10.0) def object_id(self, arg=None): """ Convert input to a valid Mongodb ObjectId instance self.object_id("") -> ObjectId (not unique) instance """ if not arg: arg = 0 if isinstance(arg, basestring): # we assume an integer as default input rawhex = len(arg.replace("0x", "").replace("L", "")) == 24 if arg.isdigit() and (not rawhex): arg = int(arg) elif arg == "": arg = int("0x%s" % "".join([self.random.choice("0123456789abcdef") for x in range(24)]), 0) elif arg.isalnum(): if not arg.startswith("0x"): arg = "0x%s" % arg try: arg = int(arg, 0) except ValueError as e: raise ValueError( "invalid objectid argument string: %s" % e) else: raise ValueError("Invalid objectid argument string. " + "Requires an integer or base 16 value") elif isinstance(arg, self.ObjectId): return arg if not isinstance(arg, (int, long)): try: if isinstance(arg, Row): return self.object_id(long(arg)) except: pass raise TypeError("object_id argument must be of type " + "ObjectId or an objectid representable integer") hexvalue = hex(arg)[2:].rstrip('L').zfill(24) return self.ObjectId(hexvalue) def parse_reference(self, value, field_type): # here we have to check for ObjectID before base parse if isinstance(value, self.ObjectId): value = long(str(value), 16) return super(MongoDBAdapter, self).parse_reference(value, field_type) def parse_id(self, value, field_type): if isinstance(value, self.ObjectId): value = long(str(value), 16) return super(MongoDBAdapter, self).parse_id(value, field_type) def represent(self, obj, fieldtype): if isinstance(obj, self.ObjectId): value = obj elif fieldtype == 'id': value = self.object_id(obj) elif fieldtype in ['double', 'float']: value = float(obj) elif fieldtype == 'date': if obj is None: return None # this piece of data can be stripped off based on the fieldtype t = datetime.time(0, 0, 0) # mongodb doesn't have a date object and so it must datetime, # string or integer return datetime.datetime.combine(obj, t) elif fieldtype == 'time': if obj is None: return None # this piece of data can be stripped off based on the fieldtype d = datetime.date(2000, 1, 1) # mongodb doesn't have a time object and so it must datetime, # string or integer return datetime.datetime.combine(d, obj) elif fieldtype == "blob": if isinstance(obj, basestring) and obj == '': obj = None return MongoBlob(obj) # reference types must be converted to ObjectID elif isinstance(fieldtype, basestring): if fieldtype.startswith('list:reference'): value = [self.object_id(v) for v in obj] elif fieldtype.startswith("reference") or fieldtype == "id": value = self.object_id(obj) else: value = NoSQLAdapter.represent(self, obj, fieldtype) elif isinstance(fieldtype, Table): raise NotImplementedError("How did you reach this line of code???") value = self.object_id(obj) else: value = NoSQLAdapter.represent(self, obj, fieldtype) return value def parse_blob(self, value, field_type): return MongoBlob.decode(value) REGEX_SELECT_AS_PARSER = re.compile("\\'" + AS_MARK + "\\': \\'(\\S+)\\'") def _regex_select_as_parser(self, colname): return self.REGEX_SELECT_AS_PARSER.search(colname) def _get_collection(self, tablename, safe=None): ctable = self.connection[tablename] if safe is not None and safe != self.safe: wc = self.WriteConcern(w=self._get_safe(safe)) ctable = ctable.with_options(write_concern=wc) return ctable def _get_safe(self, val=None): if val is None: return self.safe return 1 if val else 0 def create_table(self, table, migrate=True, fake_migrate=False, polymodel=None): table._dbt = None class Expanded (object): """ Class to encapsulate a pydal expression and track the parse expansion and its results. """ def __init__ (self, adapter, crud, query, fields=(), tablename=None, groupby=None): self.adapter = adapter self._parse_data = {'pipeline': False, 'need_group': True if groupby else False} self.crud = crud self.groupby = groupby if crud == 'update': self.values = [(f[0], self.annotate_expression(f[1])) for f in (fields or [])] self.fields = [f[0] for f in self.values] else: self.fields = [self.annotate_expression(f) for f in (fields or [])] self.tablename = tablename or adapter.get_table(query, *self.fields) if use_common_filters(query): query = adapter.common_filter(query, [self.tablename]) self.query = self.annotate_expression(query) # expand the query self.pipeline = [] self.query_dict = adapter.expand(self.query) self.field_dicts = adapter.SON() self.field_groups = self.adapter.SON() self.field_groups['_id'] = self.adapter.SON() if self._parse_data['pipeline']: # if the query needs the aggregation engine, set that up self._build_pipeline_query() # expand the fields for the aggregation engine self._expand_fields(None) else: # expand the fields try: self._expand_fields(self._fields_loop_abort) except StopIteration: # if the fields needs the aggregation engine, set that up self.field_dicts = self.adapter.SON() if self.query_dict: self.pipeline = [{'$match': self.query_dict}] self.query_dict = {} # expand the fields for the aggregation engine self._expand_fields(None) if not self._parse_data['pipeline']: if crud == 'update': # do not update id fields for fieldname in ("_id", "id"): if fieldname in self.field_dicts: self.field_dicts.delete(fieldname) else: if crud == 'update': self._add_all_fields_projection(self.field_dicts) self.field_dicts = adapter.SON() elif crud == 'select': if len(self.field_groups) > 1: if not self.groupby: self.field_groups['_id'] = None else: self.field_dicts['_id'] = False self.pipeline.append({'$group': self.field_groups}) if self.field_dicts: self.pipeline.append({'$project': self.field_dicts}) self.field_dicts = adapter.SON() elif crud == 'count': self.pipeline.append( {'$group': {"_id": None, 'count': {"$sum": 1}}}) #elif crud == 'delete': # pass def _build_pipeline_query(self): # search for anything needing the $match stage. # currently only '$regex' requires the match stage def parse_need_match_stage(items, parent, parent_key): need_match = False non_matched_indices = [] if isinstance(items, list): indices = range(len(items)) elif isinstance(items, dict): indices = items.keys() else: return for i in indices: if parse_need_match_stage(items[i], items, i): need_match = True elif i not in [MongoDBAdapter.REGEXP_MARK1, MongoDBAdapter.REGEXP_MARK2]: non_matched_indices.append(i) if i == MongoDBAdapter.REGEXP_MARK1: need_match = True self.query_dict['project'].update(items[i]) parent[parent_key] = items[MongoDBAdapter.REGEXP_MARK2] if need_match: for i in non_matched_indices: name = str(items[i]) self.query_dict['project'][name] = items[i] items[i] = {name: True} if parent is None and self.query_dict['project']: self.query_dict['match'] = items return need_match expanded = self.adapter.expand(self.query) if MongoDBAdapter.REGEXP_MARK1 in expanded: # the REGEXP_MARK is at the top of the tree, so can just split # the regex over a '$project' and a '$match' self.query_dict = None match = expanded[MongoDBAdapter.REGEXP_MARK2] project = expanded[MongoDBAdapter.REGEXP_MARK1] else: self.query_dict = {'project': {}, 'match': {}} if parse_need_match_stage(expanded, None, None): project = self.query_dict['project'] match = self.query_dict['match'] else: project = {'__query__': expanded} match = {'__query__': True} if self.crud in ['select', 'update']: self._add_all_fields_projection(project) else: self.pipeline.append({'$project': project}) self.pipeline.append({'$match': match}) self.query_dict = None def _expand_fields(self, mid_loop): if self.crud == 'update': mid_loop = mid_loop or self._fields_loop_update_pipeline for field, value in self.values: self._expand_field(field, value, mid_loop) elif self.crud == 'select': mid_loop = mid_loop or self._fields_loop_select_pipeline for field in self.fields: self._expand_field(field, field, mid_loop) elif self.fields: raise RuntimeError(self.crud + " not supported with fields") def _expand_field(self, field, value, mid_loop): expanded = {} if isinstance(field, Field): expanded = self.adapter.expand(value, field.type) elif isinstance(field, Expression): expanded = self.adapter.expand(field) field.name = str(expanded) if mid_loop: expanded = mid_loop(expanded, field, value) self.field_dicts[field.name] = expanded def _fields_loop_abort(self, expanded, *args): # if we need the aggregation engine, then start over if self._parse_data['pipeline']: raise StopIteration() return expanded def _fields_loop_update_pipeline(self, expanded, field, value): if not isinstance(value, Expression): if self.adapter.server_version_major >= 2.6: expanded = {'$literal': expanded} # '$literal' not present in server versions < 2.6 elif field.type in ['string', 'text', 'password']: expanded = {'$concat': [expanded]} elif field.type in ['integer', 'bigint', 'float', 'double']: expanded = {'$add': [expanded]} elif field.type == 'boolean': expanded = {'$and': [expanded]} elif field.type in ['date', 'time', 'datetime']: expanded = {'$add': [expanded]} else: raise RuntimeError("updating with expressions not " + "supported for field type '" + "%s' in MongoDB version < 2.6" % field.type) return expanded def _fields_loop_select_pipeline(self, expanded, field, value): # search for anything needing $group def parse_groups(items, parent, parent_key): for item in items: if isinstance(items[item], list): for list_item in items[item]: if isinstance(list_item, dict): parse_groups(list_item, items[item], items[item].index(list_item)) elif isinstance(items[item], dict): parse_groups(items[item], items, item) if item == MongoDBAdapter.GROUP_MARK: name = str(items[item]) self.field_groups[name] = items[item] parent[parent_key] = '$' + name return items if MongoDBAdapter.AS_MARK in field.name: # The AS_MARK in the field name is used by base to alias the # result, we don't actually need the AS_MARK in the parse tree # so we remove it here. if isinstance(expanded, list): # AS mark is first element in list, drop it expanded = expanded[1] elif MongoDBAdapter.AS_MARK in expanded: # AS mark is element in dict, drop it del expanded[MongoDBAdapter.AS_MARK] else: # ::TODO:: should be possible to do this... raise SyntaxError("AS() not at top of parse tree") if MongoDBAdapter.GROUP_MARK in expanded: # the GROUP_MARK is at the top of the tree, so can just pass # the group result straight through the '$project' stage self.field_groups[field.name] = expanded[MongoDBAdapter.GROUP_MARK] expanded = 1 elif MongoDBAdapter.GROUP_MARK in field.name: # the GROUP_MARK is not at the top of the tree, so we need to # pass the group results through to a '$project' stage. expanded = parse_groups(expanded, None, None) elif self._parse_data['need_group']: if field in self.groupby: # this is a 'groupby' field self.field_groups['_id'][field.name] = expanded expanded = '$_id.' + field.name else: raise SyntaxError("field '%s' not in groupby" % field) return expanded def _add_all_fields_projection(self, fields): for fieldname in self.adapter.db[self.tablename].fields: # add all fields to projection to pass them through if fieldname not in fields and fieldname not in ("_id", "id"): fields[fieldname] = 1 self.pipeline.append({'$project': fields}) def annotate_expression(self, expression): def mark_has_field(expression): if not isinstance(expression, (Expression, Query)): return False first_has_field = mark_has_field(expression.first) second_has_field = mark_has_field(expression.second) expression.has_field = (isinstance(expression, Field) or first_has_field or second_has_field) return expression.has_field def add_parse_data(child, parent): if isinstance(child, (Expression, Query)): child.parse_root = parent.parse_root child.parse_parent = parent child.parse_depth = parent.parse_depth + 1 child._parse_data = parent._parse_data add_parse_data(child.first, child) add_parse_data(child.second, child) if isinstance(expression, (Expression, Query)): expression.parse_root = expression expression.parse_depth = -1 expression._parse_data = self._parse_data add_parse_data(expression, expression) mark_has_field(expression) return expression def get_collection(self, safe=None): return self.adapter._get_collection(self.tablename, safe) @staticmethod def parse_data(expression, attribute, value=None): if isinstance(expression, (list, tuple)): ret = False for e in expression: ret = MongoDBAdapter.parse_data(e, attribute, value) or ret return ret if value is not None: try: expression._parse_data[attribute] = value except AttributeError: return None try: return expression._parse_data[attribute] except (AttributeError, TypeError): return None @staticmethod def has_field(expression): try: return expression.has_field except AttributeError: return False def expand(self, expression, field_type=None): if isinstance(expression, Field): if expression.type == 'id': result = "_id" else: result = expression.name if self.parse_data(expression, 'pipeline'): # field names as part of expressions need to start with '$' result = '$' + result elif isinstance(expression, (Expression, Query)): try: first = expression.first second = expression.second except AttributeError: return self.expand(MongoDBAdapter.Expanded( self, '', expression), field_type).query if isinstance(first, Field) and "reference" in first.type: # cast to Mongo ObjectId if isinstance(second, (tuple, list, set)): second = [self.object_id(item) for item in expression.second] else: second = self.object_id(expression.second) op = expression.op optional_args = expression.optional_args or {} if second is not None: result = op(first, second, **optional_args) elif first is not None: result = op(first, **optional_args) elif isinstance(op, str): result = op else: result = op(**optional_args) elif isinstance(expression, MongoDBAdapter.Expanded): expression.query = (self.expand(expression.query, field_type)) result = expression elif field_type: result = self.represent(expression, field_type) elif isinstance(expression, (list, tuple)): result = [self.represent(item, field_type) for item in expression] else: result = expression return result def drop(self, table, mode=''): ctable = self.connection[table._tablename] ctable.drop() self._drop_cleanup(table) return def truncate(self, table, mode, safe=None): ctable = self.connection[table._tablename] ctable.delete_many({}) def count(self, query, distinct=None, snapshot=True): if distinct: raise RuntimeError("COUNT DISTINCT not supported") if not isinstance(query, Query): raise SyntaxError("Type '%s' not supported in count" % type(query)) expanded = MongoDBAdapter.Expanded(self, 'count', query) ctable = expanded.get_collection() if not expanded.pipeline: return ctable.count(filter=expanded.query_dict) else: for record in ctable.aggregate(expanded.pipeline): return record['count'] return 0 def select(self, query, fields, attributes, snapshot=False): mongofields_dict = self.SON() new_fields, mongosort_list = [], [] # try an orderby attribute orderby = attributes.get('orderby', False) limitby = attributes.get('limitby', False) groupby = attributes.get('groupby', False) # distinct = attributes.get('distinct', False) if 'for_update' in attributes: self.db.logger.warning('mongodb does not support for_update') for key in set(attributes.keys())-set(('limitby', 'orderby', 'groupby', 'for_update')): if attributes[key] is not None: if key in ['join', 'left']: raise MongoDBAdapter.NotOnNoSqlError( "Attribute '%s' not Supported on NoSQL databases" % key) self.db.logger.warning( 'select attribute not implemented: %s' % key) if orderby: if snapshot: raise RuntimeError("snapshot and orderby are mutually exclusive") if isinstance(orderby, (list, tuple)): orderby = xorify(orderby) if str(orderby) == '': # !!!! need to add 'random' mongosort_list = self.RANDOM() else: for f in self.expand(orderby).split(','): include = 1 if f.startswith('-'): include = -1 f = f[1:] if f.startswith('$'): f = f[1:] mongosort_list.append((f, include)) for item in fields: if isinstance(item, SQLALL): new_fields += item._table else: new_fields.append(item) fields = new_fields if isinstance(query, Query): tablename = self.get_table(query) elif len(fields) != 0: if isinstance(fields[0], Expression): tablename = self.get_table(fields[0]) else: tablename = fields[0].tablename else: raise SyntaxError("The table name could not be found in " + "the query nor from the select statement.") if query: if use_common_filters(query): query = self.common_filter(query, [tablename]) expanded = MongoDBAdapter.Expanded( self, 'select', query, fields or self.db[tablename], groupby=groupby) ctable = self.connection[tablename] modifiers = {'snapshot':snapshot} if not expanded.pipeline: if limitby: limitby_skip, limitby_limit = limitby[0], int(limitby[1]) - 1 else: limitby_skip = limitby_limit = 0 mongo_list_dicts = ctable.find( expanded.query_dict, expanded.field_dicts, skip=limitby_skip, limit=limitby_limit, sort=mongosort_list, modifiers=modifiers) null_rows = [] else: if mongosort_list: sortby_dict = self.SON() for f in mongosort_list: sortby_dict[f[0]] = f[1] expanded.pipeline.append({'$sort': sortby_dict}) if limitby and limitby[1]: expanded.pipeline.append({'$limit': limitby[1]}) if limitby and limitby[0]: expanded.pipeline.append({'$skip': limitby[0]}) mongo_list_dicts = ctable.aggregate(expanded.pipeline) null_rows = [(None,)] rows = [] # populate row in proper order # Here we replace ._id with .id to follow the standard naming colnames = [] newnames = [] for field in expanded.fields: if hasattr(field, "tablename"): if field.name in ('id', '_id'): # Mongodb reserved uuid key colname = (tablename + '.' + 'id', '_id') else: colname = (tablename + '.' + field.name, field.name) elif not isinstance(query, Expression): colname = (field.name, field.name) colnames.append(colname[1]) newnames.append(colname[0]) for record in mongo_list_dicts: row = [] for colname in colnames: try: value = record[colname] except: value = None row.append(value) rows.append(row) if not rows: rows = null_rows processor = attributes.get('processor', self.parse) result = processor(rows, fields, newnames, blob_decode=True) return result def insert(self, table, fields, safe=None): """Safe determines whether a asynchronous request is done or a synchronous action is done For safety, we use by default synchronous requests""" values = {} safe = self._get_safe(safe) ctable = self._get_collection(table._tablename, safe) for k, v in fields: if k.name not in ["id", "safe"]: fieldname = k.name fieldtype = table[k.name].type values[fieldname] = self.represent(v, fieldtype) result = ctable.insert_one(values) if result.acknowledged: Oid = result.inserted_id rid = Reference(long(str(Oid), 16)) (rid._table, rid._record) = (table, None) return rid else: return None def update(self, tablename, query, fields, safe=None): # return amount of adjusted rows or zero, but no exceptions # @ related not finding the result if not isinstance(query, Query): raise RuntimeError("Not implemented") safe = self._get_safe(safe) if safe: amount = 0 else: amount = self.count(query, distinct=False) if amount == 0: return amount expanded = MongoDBAdapter.Expanded(self, 'update', query, fields) ctable = expanded.get_collection(safe) if expanded.pipeline: try: for doc in ctable.aggregate(expanded.pipeline): result = ctable.replace_one({'_id': doc['_id']}, doc) if safe and result.acknowledged: amount += result.matched_count return amount except Exception as e: # TODO Reverse update query to verify that the query succeeded raise RuntimeError("uncaught exception when updating rows: %s" % e) else: try: result = ctable.update_many( filter=expanded.query_dict, update={'$set': expanded.field_dicts}) if safe and result.acknowledged: amount = result.matched_count return amount except Exception as e: # TODO Reverse update query to verify that the query succeeded raise RuntimeError("uncaught exception when updating rows: %s" % e) def delete(self, tablename, query, safe=None): if not isinstance(query, Query): raise RuntimeError("query type %s is not supported" % type(query)) safe = self._get_safe(safe) expanded = MongoDBAdapter.Expanded(self, 'delete', query) ctable = expanded.get_collection(safe) if expanded.pipeline: deleted = [x['_id'] for x in ctable.aggregate(expanded.pipeline)] else: deleted = [x['_id'] for x in ctable.find(expanded.query_dict)] # find references to deleted items db = self.db table = db[tablename] cascade = [] set_null = [] for field in table._referenced_by: if field.type == 'reference '+ tablename: if field.ondelete == 'CASCADE': cascade.append(field) if field.ondelete == 'SET NULL': set_null.append(field) cascade_list = [] set_null_list = [] for field in table._referenced_by_list: if field.type == 'list:reference '+ tablename: if field.ondelete == 'CASCADE': cascade_list.append(field) if field.ondelete == 'SET NULL': set_null_list.append(field) # perform delete result = ctable.delete_many({"_id": { "$in": deleted }}) if result.acknowledged: amount = result.deleted_count else: amount = len(deleted) # clean up any references if amount and deleted: # ::TODO:: test if deleted references cascade def remove_from_list(field, deleted, safe): for delete in deleted: modify = {field.name: delete} dtable = self._get_collection(field.tablename, safe) result = dtable.update_many( filter=modify, update={'$pull': modify}) # for cascaded items, if the reference is the only item in the list, # then remove the entire record, else delete reference from the list for field in cascade_list: for delete in deleted: modify = {field.name: [delete]} dtable = self._get_collection(field.tablename, safe) result = dtable.delete_many(filter=modify) remove_from_list(field, deleted, safe) for field in set_null_list: remove_from_list(field, deleted, safe) for field in cascade: db(field.belongs(deleted)).delete() for field in set_null: db(field.belongs(deleted)).update(**{field.name:None}) return amount def bulk_insert(self, table, items): return [self.insert(table, item) for item in items] ## OPERATORS def needs_mongodb_aggregation_pipeline(f): def mark_pipeline(self, first, *args, **kwargs): self.parse_data(first, 'pipeline', True) if len(args) > 0: self.parse_data(args[0], 'pipeline', True) return f(self, first, *args, **kwargs) return mark_pipeline def INVERT(self, first): #print "in invert first=%s" % first return '-%s' % self.expand(first) def NOT(self, first): op = self.expand(first) op_k = list(op)[0] op_body = op[op_k] r = None if type(op_body) is list: # apply De Morgan law for and/or # not(A and B) -> not(A) or not(B) # not(A or B) -> not(A) and not(B) not_op = '$and' if op_k == '$or' else '$or' r = {not_op: [self.NOT(first.first), self.NOT(first.second)]} else: try: sub_ops = list(op_body.keys()) if len(sub_ops) == 1 and sub_ops[0] == '$ne': r = {op_k: op_body['$ne']} except AttributeError: r = {op_k: {'$ne': op_body}} if r is None: r = {op_k: {'$not': op_body}} return r def AND(self, first, second): # pymongo expects: .find({'$and': [{'x':'1'}, {'y':'2'}]}) if isinstance(second, bool): if second: return self.expand(first) return self.NE(first, first) return {'$and': [self.expand(first), self.expand(second)]} def OR(self, first, second): # pymongo expects: .find({'$or': [{'name':'1'}, {'name':'2'}]}) if isinstance(second, bool): if not second: return self.expand(first) return True return {'$or': [self.expand(first), self.expand(second)]} def BELONGS(self, first, second): if isinstance(second, str): # this is broken, the only way second is a string is if it has # been converted to SQL. This no worky. This might be made to # work if _select did not return SQL. raise RuntimeError("nested queries not supported") items = [self.expand(item, first.type) for item in second] return {self.expand(first): {"$in": items}} def validate_second(f): def check_second(*args, **kwargs): if len(args) < 3 or args[2] is None: raise RuntimeError("Cannot compare %s with None" % args[1]) return f(*args, **kwargs) return check_second def check_fields_for_cmp(f): def check_fields(self, first, second=None, *args, **kwargs): if (self.parse_data((first, second), 'pipeline')): pipeline = True elif not isinstance(first, Field) or self.has_field(second): pipeline = True self.parse_data((first, second), 'pipeline', True) else: pipeline = False return f(self, first, second, *args, pipeline=pipeline, **kwargs) return check_fields def CMP_OPS_AGGREGATION_PIPELINE(self, op, first, second): try: type = first.type except: type = None return {op: [self.expand(first), self.expand(second, type)]} @check_fields_for_cmp def EQ(self, first, second=None, pipeline=False): if pipeline: return self.CMP_OPS_AGGREGATION_PIPELINE('$eq', first, second) return {self.expand(first): self.expand(second, first.type)} @check_fields_for_cmp def NE(self, first, second=None, pipeline=False): if pipeline: return self.CMP_OPS_AGGREGATION_PIPELINE('$ne', first, second) return {self.expand(first): {'$ne': self.expand(second, first.type)}} @validate_second @check_fields_for_cmp def LT(self, first, second=None, pipeline=False): if pipeline: return self.CMP_OPS_AGGREGATION_PIPELINE('$lt', first, second) return {self.expand(first): {'$lt': self.expand(second, first.type)}} @validate_second @check_fields_for_cmp def LE(self, first, second=None, pipeline=False): if pipeline: return self.CMP_OPS_AGGREGATION_PIPELINE('$lte', first, second) return {self.expand(first): {'$lte': self.expand(second, first.type)}} @validate_second @check_fields_for_cmp def GT(self, first, second=None, pipeline=False): if pipeline: return self.CMP_OPS_AGGREGATION_PIPELINE('$gt', first, second) return {self.expand(first): {'$gt': self.expand(second, first.type)}} @validate_second @check_fields_for_cmp def GE(self, first, second=None, pipeline=False): if pipeline: return self.CMP_OPS_AGGREGATION_PIPELINE('$gte', first, second) return {self.expand(first): {'$gte': self.expand(second, first.type)}} @needs_mongodb_aggregation_pipeline def ADD(self, first, second): op_code = '$add' for field in [first, second]: try: if field.type in ['string', 'text', 'password']: op_code = '$concat' break except: pass return {op_code: [self.expand(first), self.expand(second, first.type)]} @needs_mongodb_aggregation_pipeline def SUB(self, first, second): return {'$subtract': [ self.expand(first), self.expand(second, first.type)]} @needs_mongodb_aggregation_pipeline def MUL(self, first, second): return {'$multiply': [ self.expand(first), self.expand(second, first.type)]} @needs_mongodb_aggregation_pipeline def DIV(self, first, second): return {'$divide': [ self.expand(first), self.expand(second, first.type)]} @needs_mongodb_aggregation_pipeline def MOD(self, first, second): return {'$mod': [ self.expand(first), self.expand(second, first.type)]} _aggregate_map = { 'SUM': '$sum', 'MAX': '$max', 'MIN': '$min', 'AVG': '$avg', } @needs_mongodb_aggregation_pipeline def AGGREGATE(self, first, what): if what == 'ABS': return {"$cond": [ {"$lt": [self.expand(first), 0]}, {"$subtract": [0, self.expand(first)]}, self.expand(first) ]} try: expanded = {self._aggregate_map[what]: self.expand(first)} except KeyError: raise NotImplementedError("'%s' not implemented" % what) self.parse_data(first, 'need_group', True) return {MongoDBAdapter.GROUP_MARK: expanded} @needs_mongodb_aggregation_pipeline def COUNT(self, first, distinct=None): if distinct: raise NotImplementedError("distinct not implemented for count op") self.parse_data(first, 'need_group', True) return {MongoDBAdapter.GROUP_MARK: {"$sum": 1}} _extract_map = { 'dayofyear': '$dayOfYear', 'day': '$dayOfMonth', 'dayofweek': '$dayOfWeek', 'year': '$year', 'month': '$month', 'week': '$week', 'hour': '$hour', 'minute': '$minute', 'second': '$second', 'millisecond': '$millisecond', 'string': '$dateToString', } @needs_mongodb_aggregation_pipeline def EXTRACT(self, first, what): try: return {self._extract_map[what]: self.expand(first)} except KeyError: raise NotImplementedError("EXTRACT(%s) not implemented" % what) @needs_mongodb_aggregation_pipeline def EPOCH(self, first): return {"$divide": [{"$subtract": [self.expand(first), self.epoch]}, 1000]} def CASE(self, query, true, false): return Expression(self.db, self.EXPAND_CASE, query, (true, false)) @needs_mongodb_aggregation_pipeline def EXPAND_CASE(self, query, true_false): return {"$cond": [self.expand(query), self.expand(true_false[0]), self.expand(true_false[1])]} @needs_mongodb_aggregation_pipeline def AS(self, first, second): # put the AS_MARK into the structure. The 'AS' name will be parsed # later from the string of the field name. if isinstance(first, Field): return [{MongoDBAdapter.AS_MARK: second}, self.expand(first)] else: result = self.expand(first) result[MongoDBAdapter.AS_MARK] = second return result # We could implement an option that simulates a full featured SQL # database. But I think the option should be set explicit or # implemented as another library. def ON(self, first, second): raise MongoDBAdapter.NotOnNoSqlError() def COMMA(self, first, second): # returns field name lists, to be separated via split(',') return '%s,%s' % (self.expand(first), self.expand(second)) #TODO verify full compatibilty with official SQL Like operator def _build_like_regex(self, first, second, case_sensitive=True, escape=None, ends_with=False, starts_with=False, whole_string=True, like_wildcards=False): import re base = self.expand(second, 'string') need_regex = (whole_string or not case_sensitive or starts_with or ends_with or like_wildcards and ('_' in base or '%' in base)) if not need_regex: return base else: expr = re.escape(base) if like_wildcards: if escape: # protect % and _ which are escaped expr = expr.replace(escape+'\\%', '%') if PY2: expr = expr.replace(escape+'\\_', '_') elif escape+'_' in expr: set_aside = str(self.object_id('')) while set_aside in expr: set_aside = str(self.object_id('')) expr = expr.replace(escape+'_', set_aside) else: set_aside = None expr = expr.replace('\\%', '.*') if PY2: expr = expr.replace('\\_', '.') else: expr = expr.replace('_', '.') if escape: # convert to protected % and _ expr = expr.replace('%', '\\%') if PY2: expr = expr.replace('_', '\\_') elif set_aside: expr = expr.replace(set_aside, '_') if starts_with: pattern = '^%s' elif ends_with: pattern = '%s$' elif whole_string: pattern = '^%s$' else: pattern = '%s' return self.REGEXP(first, pattern % expr, case_sensitive) def LIKE(self, first, second, case_sensitive=True, escape=None): return self._build_like_regex(first, second, case_sensitive=case_sensitive, escape=escape, like_wildcards=True) def ILIKE(self, first, second, escape=None): return self.LIKE(first, second, case_sensitive=False, escape=escape) def STARTSWITH(self, first, second): return self._build_like_regex(first, second, starts_with=True) def ENDSWITH(self, first, second): return self._build_like_regex(first, second, ends_with=True) #TODO verify full compatibilty with official oracle contains operator def CONTAINS(self, first, second, case_sensitive=True): if isinstance(second, self.ObjectId): ret = {self.expand(first): second} elif isinstance(second, Field): if second.type in ['string', 'text']: if isinstance(first, Field): if first.type in ['list:string', 'string', 'text']: ret = {'$where': "this.%s.indexOf(this.%s) > -1" % (first.name, second.name)} else: raise NotImplementedError("field.CONTAINS() not " + "implemented for field type of '%s'" % first.type) else: raise NotImplementedError( "x.CONTAINS() not implemented for x type of '%s'" % type(first)) elif second.type in ['integer', 'bigint']: ret = {'$where': "this.%s.indexOf(this.%s + '') > -1" % (first.name, second.name)} else: raise NotImplementedError( "CONTAINS(field) not implemented for field type '%s'" % second.type) elif isinstance(second, (basestring, int)): whole_string = (isinstance(first, Field) and first.type == 'list:string') ret = self._build_like_regex(first, second, case_sensitive=case_sensitive, whole_string=whole_string) # first.type in ('string', 'text', 'json', 'upload') # or first.type.startswith('list:'): else: raise NotImplementedError( "CONTAINS() not implemented for type '%s'" % type(second)) return ret @needs_mongodb_aggregation_pipeline def SUBSTRING(self, field, parameters): def parse_parameters(pos0, length): """ The expression object can return these as string based expressions. We can't use that so we have to tease it apart. These are the possibilities: pos0 = '(%s - %d)' % (self.len(), abs(start) - 1) pos0 = start + 1 length = self.len() length = '(%s - %d - %s)' % (self.len(), abs(stop) - 1, pos0) length = '(%s - %s)' % (stop + 1, pos0) Two of these five require the length of the string which is not supported by Mongo, so for now these cause an Exception and won't reach here. If this were to ever be supported it may require a change to Expression.__getitem__ so that it either returned the base expression to be expanded here, or converted length to a string to be parsed back to a call to STRLEN() """ if isinstance(length, basestring): return (pos0 - 1, eval(length)) else: # take the rest of the string return (pos0 - 1, -1) parameters = parse_parameters(*parameters) return {'$substr': [self.expand(field), parameters[0], parameters[1]]} @needs_mongodb_aggregation_pipeline def LOWER(self, first): return {'$toLower': self.expand(first)} @needs_mongodb_aggregation_pipeline def UPPER(self, first): return {'$toUpper': self.expand(first)} def REGEXP(self, first, second, case_sensitive=True): """ MongoDB provides regular expression capabilities for pattern matching strings in queries. MongoDB uses Perl compatible regular expressions (i.e. 'PCRE') version 8.36 with UTF-8 support. """ if (isinstance(first, Field) and first.type in ['integer', 'bigint', 'float', 'double']): return {'$where': "RegExp('%s').test(this.%s + '')" % (self.expand(second, 'string'), first.name)} expanded_first = self.expand(first) regex_second = {'$regex': self.expand(second, 'string')} if not case_sensitive: regex_second['$options'] = 'i' if (self.parse_data((first, second), 'pipeline')): name = str(expanded_first) return {MongoDBAdapter.REGEXP_MARK1: {name: expanded_first}, MongoDBAdapter.REGEXP_MARK2: {name: regex_second}} try: return {expanded_first: regex_second} except TypeError: # if first is not hashable, then will need the pipeline self.parse_data((first, second), 'pipeline', True) return {} def LENGTH(self, first): """ https://jira.mongodb.org/browse/SERVER-5319 https://github.com/afchin/mongo/commit/f52105977e4d0ccb53bdddfb9c4528a3f3c40bdf """ raise NotImplementedError() def RANDOM(self): """ ORDER BY RANDOM() https://github.com/mongodb/cookbook/blob/master/content/patterns/random-attribute.txt https://jira.mongodb.org/browse/SERVER-533 http://stackoverflow.com/questions/19412/how-to-request-a-random-row-in-sql """ raise NotImplementedError() class NotOnNoSqlError(NotImplementedError): def __init__(self, message=None): if message is None: message = "Not Supported on NoSQL databases" super(MongoDBAdapter.NotOnNoSqlError, self).__init__(message) class MongoBlob(Binary): MONGO_BLOB_BYTES = USER_DEFINED_SUBTYPE MONGO_BLOB_NON_UTF8_STR = USER_DEFINED_SUBTYPE + 1 def __new__(cls, value): # return None and Binary() unmolested if value is None or isinstance(value, Binary): return value # bytearray is marked as MONGO_BLOB_BYTES if isinstance(value, bytearray): return Binary.__new__(cls, bytes(value), MongoBlob.MONGO_BLOB_BYTES) # return non-strings as Binary(), eg: PY3 bytes() if not isinstance(value, basestring): return Binary(value) # if string is encodable as UTF-8, then return as string try: value.encode('utf-8') return value except UnicodeDecodeError: # string which can not be UTF-8 encoded, eg: pickle strings return Binary.__new__(cls, value, MongoBlob.MONGO_BLOB_NON_UTF8_STR) def __repr__(self): return repr(MongoBlob.decode(self)) @staticmethod def decode(value): if isinstance(value, Binary): if value.subtype == MongoBlob.MONGO_BLOB_BYTES: return bytearray(value) if value.subtype == MongoBlob.MONGO_BLOB_NON_UTF8_STR: return str(value) return value web2py-2.12.3.orig/gluon/packages/dal/pydal/adapters/db2.py0000664000000000000000000001000212564727432022052 0ustar rootroot# -*- coding: utf-8 -*- import base64 import datetime from .._globals import IDENTITY from .base import BaseAdapter class DB2Adapter(BaseAdapter): drivers = ('ibm_db_dbi', 'pyodbc') types = { 'boolean': 'CHAR(1)', 'string': 'VARCHAR(%(length)s)', 'text': 'CLOB', 'json': 'CLOB', 'password': 'VARCHAR(%(length)s)', 'blob': 'BLOB', 'upload': 'VARCHAR(%(length)s)', 'integer': 'INT', 'bigint': 'BIGINT', 'float': 'REAL', 'double': 'DOUBLE', 'decimal': 'NUMERIC(%(precision)s,%(scale)s)', 'date': 'DATE', 'time': 'TIME', 'datetime': 'TIMESTAMP', 'id': 'INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL', 'reference': 'INT, FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'list:integer': 'CLOB', 'list:string': 'CLOB', 'list:reference': 'CLOB', 'big-id': 'BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL', 'big-reference': 'BIGINT, FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference FK': ', CONSTRAINT FK_%(constraint_name)s FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference TFK': ' CONSTRAINT FK_%(foreign_table)s_PK FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_table)s (%(foreign_key)s) ON DELETE %(on_delete_action)s', } def LEFT_JOIN(self): return 'LEFT OUTER JOIN' def RANDOM(self): return 'RAND()' def select_limitby(self, sql_s, sql_f, sql_t, sql_w, sql_o, limitby): if limitby: (lmin, lmax) = limitby sql_o += ' FETCH FIRST %i ROWS ONLY' % lmax return 'SELECT %s %s FROM %s%s%s;' % (sql_s, sql_f, sql_t, sql_w, sql_o) def represent_exceptions(self, obj, fieldtype): if fieldtype == 'blob': obj = base64.b64encode(str(obj)) return "BLOB('%s')" % obj elif fieldtype == 'datetime': if isinstance(obj, datetime.datetime): obj = obj.isoformat()[:19].replace('T','-').replace(':','.') elif isinstance(obj, datetime.date): obj = obj.isoformat()[:10]+'-00.00.00' return "'%s'" % obj return None def __init__(self,db,uri,pool_size=0,folder=None,db_codec ='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, after_connection=None): self.db = db self.dbengine = "db2" self.uri = uri if do_connect: self.find_driver(adapter_args,uri) self.pool_size = pool_size self.folder = folder self.db_codec = db_codec self._after_connection = after_connection self.find_or_make_work_folder() self.test_query = 'SELECT 1 FROM (VALUES ( 1 ));' ruri = uri.split('://', 1)[1] def connector(cnxn=ruri,driver_args=driver_args): if self.driver_name == 'ibm_db_dbi': vars = cnxn.split(";") cnxn = {} for var in vars: v = var.split('=') cnxn[v[0].lower()] = v[1] return self.driver.connect(cnxn['dsn'], cnxn['uid'], cnxn['pwd'], **driver_args) else: return self.driver.connect(cnxn, **driver_args) self.connector = connector if do_connect: self.reconnect() def execute(self,command,placeholders=None): if command[-1:]==';': command = command[:-1] if placeholders: return self.log_execute(command, placeholders) return self.log_execute(command) def lastrowid(self,table): self.execute('SELECT DISTINCT IDENTITY_VAL_LOCAL() FROM %s;' % table) return long(self.cursor.fetchone()[0]) def rowslice(self,rows,minimum=0,maximum=None): if maximum is None: return rows[minimum:] return rows[minimum:maximum] web2py-2.12.3.orig/gluon/packages/dal/pydal/adapters/cubrid.py0000664000000000000000000000376012564727432022670 0ustar rootroot# -*- coding: utf-8 -*- import re from .._globals import IDENTITY from .mysql import MySQLAdapter class CubridAdapter(MySQLAdapter): drivers = ('cubriddb',) REGEX_URI = re.compile('^(?P[^:@]+)(\:(?P[^@]*))?@(?P[^\:/]+)(\:(?P[0-9]+))?/(?P[^?]+)(\?set_encoding=(?P\w+))?$') def __init__(self, db, uri, pool_size=0, folder=None, db_codec='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, after_connection=None): self.db = db self.dbengine = "cubrid" self.uri = uri if do_connect: self.find_driver(adapter_args,uri) self.pool_size = pool_size self.folder = folder self.db_codec = db_codec self._after_connection = after_connection self.find_or_make_work_folder() ruri = uri.split('://',1)[1] m = self.REGEX_URI.match(ruri) if not m: raise SyntaxError( "Invalid URI string in DAL: %s" % self.uri) user = credential_decoder(m.group('user')) if not user: raise SyntaxError('User required') password = credential_decoder(m.group('password')) if not password: password = '' host = m.group('host') if not host: raise SyntaxError('Host name required') db = m.group('db') if not db: raise SyntaxError('Database name required') port = int(m.group('port') or '30000') user = credential_decoder(user) passwd = credential_decoder(password) def connector(host=host,port=port,db=db, user=user,passwd=passwd,driver_args=driver_args): return self.driver.connect(host,port,db,user,passwd,**driver_args) self.connector = connector if do_connect: self.reconnect() def after_connection(self): self.execute('SET FOREIGN_KEY_CHECKS=1;') self.execute("SET sql_mode='NO_BACKSLASH_ESCAPES';") web2py-2.12.3.orig/gluon/packages/dal/pydal/adapters/google_adapters.py0000664000000000000000000005524712564727432024566 0ustar rootroot# -*- coding: utf-8 -*- import os import re from .._compat import pjoin from .._globals import IDENTITY, THREAD_LOCAL from .._gae import classobj, gae, ndb, namespace_manager, NDBPolyModel, rdbms from ..objects import Table, Field, Expression, Query from ..helpers.classes import SQLCustomType, SQLALL, \ Reference, UseDatabaseStoredFile, FakeDriver from ..helpers.methods import use_common_filters, xorify from ..helpers.gae import NDBDecimalProperty from ..helpers.serializers import serializers from .base import NoSQLAdapter from .mysql import MySQLAdapter class GoogleSQLAdapter(UseDatabaseStoredFile, MySQLAdapter): uploads_in_blob = True REGEX_URI = re.compile('^(?P.*)/(?P.*)$') def clear_cache(self): ndb.get_context().clear_cache() def ignore_cache_for(self, entities = None): entities = entities or [] ndb.get_context().set_cache_policy(lambda key: key.kind() not in entities) def __init__(self, db, uri='google:sql://realm:domain/database', pool_size=0, folder=None, db_codec='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, after_connection=None): self.db = db self.dbengine = "mysql" self.uri = uri self.pool_size = pool_size self.db_codec = db_codec self._after_connection = after_connection if do_connect: self.find_driver(adapter_args, uri) self.folder = folder or pjoin('$HOME',THREAD_LOCAL.folder.split( os.sep+'applications'+os.sep,1)[1]) ruri = uri.split("://")[1] m = self.REGEX_URI.match(ruri) if not m: raise SyntaxError("Invalid URI string in SQLDB: %s" % self.uri) instance = credential_decoder(m.group('instance')) self.dbstring = db = credential_decoder(m.group('db')) driver_args['instance'] = instance if not 'charset' in driver_args: driver_args['charset'] = 'utf8' self.createdb = createdb = adapter_args.get('createdb',True) if not createdb: driver_args['database'] = db def connector(driver_args=driver_args): return rdbms.connect(**driver_args) self.connector = connector if do_connect: self.reconnect() def after_connection(self): if self.createdb: # self.execute('DROP DATABASE %s' % self.dbstring) self.execute('CREATE DATABASE IF NOT EXISTS %s' % self.dbstring) self.execute('USE %s' % self.dbstring) self.execute("SET FOREIGN_KEY_CHECKS=1;") self.execute("SET sql_mode='NO_BACKSLASH_ESCAPES';") def execute(self, command, *a, **b): return self.log_execute(command.decode('utf8'), *a, **b) def find_driver(self,adapter_args,uri=None): self.adapter_args = adapter_args self.driver = "google" class GoogleDatastoreAdapter(NoSQLAdapter): """ This now always uses NDB since there is no reason to use DB: You can enable NDB as follows: db = DAL('google:datastore') You can also pass optional ndb_settings: db = DAL('google:datastore', adapter_args = {'ndb_settings': ndb_settings}) ndb_settings is optional and can be used for per model caching settings. ndb_settings must be a dict in this form:: ndb_settings = {:{:}} See: https://developers.google.com/appengine/docs/python/ndb/cache """ MAX_FETCH_LIMIT = 1000000 uploads_in_blob = True types = {} def file_exists(self, filename): pass def file_open(self, filename, mode='rb', lock=True): pass def file_close(self, fileobj): pass REGEX_NAMESPACE = re.compile('.*://(?P.+)') def __init__(self,db,uri,pool_size=0,folder=None,db_codec ='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, after_connection=None): self.types.update({ 'boolean': ndb.BooleanProperty, 'string': (lambda **kwargs: ndb.StringProperty(**kwargs)), 'text': ndb.TextProperty, 'json': ndb.TextProperty, 'password': ndb.StringProperty, 'blob': ndb.BlobProperty, 'upload': ndb.StringProperty, 'integer': ndb.IntegerProperty, 'bigint': ndb.IntegerProperty, 'float': ndb.FloatProperty, 'double': ndb.FloatProperty, 'decimal': NDBDecimalProperty, 'date': ndb.DateProperty, 'time': ndb.TimeProperty, 'datetime': ndb.DateTimeProperty, 'id': None, 'reference': ndb.IntegerProperty, 'list:string': (lambda **kwargs: ndb.StringProperty(repeated=True,default=None, **kwargs)), 'list:integer': (lambda **kwargs: ndb.IntegerProperty(repeated=True,default=None, **kwargs)), 'list:reference': (lambda **kwargs: ndb.IntegerProperty(repeated=True,default=None, **kwargs)), }) super(GoogleDatastoreAdapter, self).__init__( db=db, uri=uri, pool_size=pool_size, folder=folder, db_codec='UTF-8', credential_decoder=credential_decoder, driver_args=driver_args, adapter_args=adapter_args, do_connect=do_connect, after_connection=after_connection) self.dbengine = 'google:datastore' db['_lastsql'] = '' match = self.REGEX_NAMESPACE.match(uri) if match: namespace_manager.set_namespace(match.group('namespace')) self.ndb_settings = adapter_args.get('ndb_settings') # connections and reconnect are not required for Datastore dbs self.connector = FakeDriver self.reconnect() def parse_id(self, value, field_type): return value def represent(self, obj, fieldtype, tablename=None): if isinstance(obj, ndb.Key): return obj elif fieldtype == 'id' and tablename: if isinstance(obj, list): return [self.represent(item,fieldtype,tablename) for item in obj] elif obj is None: return None else: return ndb.Key(tablename, long(obj)) elif fieldtype == "json": return serializers.json(obj) elif isinstance(obj, (Expression, Field)): raise SyntaxError("non supported on GAE") elif isinstance(fieldtype, gae.Property): return obj elif fieldtype.startswith('list:') and not isinstance(obj, list): if fieldtype=='list:string': return str(obj) else: return long(obj) else: obj = NoSQLAdapter.represent(self, obj, fieldtype) return obj def create_table(self,table,migrate=True,fake_migrate=False, polymodel=None): myfields = {} for field in table: if isinstance(polymodel,Table) and field.name in polymodel.fields(): continue attr = {} if isinstance(field.custom_qualifier, dict): #this is custom properties to add to the GAE field declartion attr = field.custom_qualifier field_type = field.type if isinstance(field_type, SQLCustomType): ftype = self.types[field_type.native or field_type.type](**attr) elif isinstance(field_type, ndb.Property): ftype = field_type elif field_type.startswith('id'): continue elif field_type.startswith('decimal'): precision, scale = field_type[7:].strip('()').split(',') precision = int(precision) scale = int(scale) dec_cls = NDBDecimalProperty ftype = dec_cls(precision, scale, **attr) elif field_type.startswith('reference'): if field.notnull: attr = dict(required=True) ftype = self.types[field_type[:9]](**attr) elif field_type.startswith('list:reference'): if field.notnull: attr['required'] = True ftype = self.types[field_type[:14]](**attr) elif field_type.startswith('list:'): ftype = self.types[field_type](**attr) elif not field_type in self.types\ or not self.types[field_type]: raise SyntaxError('Field: unknown field type: %s' % field_type) else: ftype = self.types[field_type](**attr) myfields[field.name] = ftype if not polymodel: model_cls = ndb.Model table._tableobj = classobj(table._tablename, (model_cls, ), myfields) # Set NDB caching variables if self.ndb_settings and (table._tablename in self.ndb_settings): for k, v in self.ndb_settings.iteritems(): setattr(table._tableobj, k, v) elif polymodel==True: pm_cls = NDBPolyModel table._tableobj = classobj(table._tablename, (pm_cls, ), myfields) elif isinstance(polymodel,Table): table._tableobj = classobj(table._tablename, (polymodel._tableobj, ), myfields) else: raise SyntaxError("polymodel must be None, True, a table or a tablename") return None def expand(self,expression,field_type=None): if expression is None: return None elif isinstance(expression,Field): if expression.type in ('text', 'blob', 'json'): raise SyntaxError('AppEngine does not index by: %s' % expression.type) return expression.name elif isinstance(expression, (Expression, Query)): if not expression.second is None: return expression.op(expression.first, expression.second) elif not expression.first is None: return expression.op(expression.first) else: return expression.op() elif field_type: return self.represent(expression,field_type) elif isinstance(expression,(list,tuple)): return ','.join([self.represent(item,field_type) for item in expression]) elif hasattr(expression, "_FilterNode__name"): # check for _FilterNode__name to avoid explicit import of FilterNode return expression else: raise NotImplementedError def AND(self,first,second): first = self.expand(first) second = self.expand(second) # none means lack of query (true) if first == None: return second return ndb.AND(first, second) def OR(self,first,second): first = self.expand(first) second = self.expand(second) # none means lack of query (true) if first == None or second == None: return None return ndb.OR(first, second) GAE_FILTER_OPTIONS = { '=': lambda a,b: a==b, '>': lambda a,b: a>b, '<': lambda a,b: a=': lambda a,b: a>=b, '!=': lambda a,b: a!=b, 'in': lambda a,b: a.IN(b), } def gaef(self,first, op, second): name = first.name if first.name != 'id' else 'key' if name == 'key' and op in ('>','!=') and second in (0,'0', None): return None field = getattr(first.table._tableobj, name) value = self.represent(second,first.type,first._tablename) token = self.GAE_FILTER_OPTIONS[op](field,value) return token def EQ(self,first,second=None): return self.gaef(first,'=',second) def NE(self,first,second=None): return self.gaef(first,'!=',second) def LT(self,first,second=None): return self.gaef(first,'<',second) def LE(self,first,second=None): return self.gaef(first,'<=',second) def GT(self,first,second=None): return self.gaef(first,'>',second) def GE(self,first,second=None): return self.gaef(first,'>=',second) def INVERT(self,first): return '-%s' % first.name def COMMA(self,first,second): return '%s, %s' % (first,second) def BELONGS(self,first,second=None): if not isinstance(second,(list, tuple, set)): raise SyntaxError("Not supported") if not isinstance(second, list): second = list(second) if len(second) == 0: # return a filter which will return a null set f = self.EQ(first,0) f.filter_all = True return f return self.gaef(first,'in',second) def CONTAINS(self,first,second,case_sensitive=False): # silently ignoring: GAE can only do case sensitive matches! if not first.type.startswith('list:'): raise SyntaxError("Not supported") return self.gaef(first,'=',second) def NOT(self, first): op, f, s = first.op, first.first, first.second if op in [self.OR, self.AND]: not_op = self.AND if op == self.OR else self.OR r = not_op(self.NOT(f), self.NOT(s)) elif op == self.EQ: r = self.gaef(f, '!=', s) elif op == self.NE: r = self.gaef(f, '=', s) elif op == self.LT: r = self.gaef(f, '>=', s) elif op == self.LE: r = self.gaef(f, '>', s) elif op == self.GT: r = self.gaef(f, '<=', s) elif op == self.GE: r = self.gaef(f, '<', s) else: # TODO the IN operator must be split into a sequence of # (field!=value) AND (field!=value) AND ... raise NotImplementedError return r def truncate(self,table,mode): self.db(self.db._adapter.id_query(table)).delete() def select_raw(self,query,fields=None,attributes=None,count_only=False): db = self.db fields = fields or [] attributes = attributes or {} args_get = attributes.get new_fields = [] for item in fields: if isinstance(item,SQLALL): new_fields += item._table else: new_fields.append(item) fields = new_fields if query: tablename = self.get_table(query) elif fields: tablename = fields[0].tablename query = db._adapter.id_query(fields[0].table) else: raise SyntaxError("Unable to determine a tablename") if query: if use_common_filters(query): query = self.common_filter(query,[tablename]) #tableobj is a GAE/NDB Model class (or subclass) tableobj = db[tablename]._tableobj filters = self.expand(query) ## DETERMINE PROJECTION projection = None if len(db[tablename].fields) == len(fields): # getting all fields, not a projection query projection = None elif args_get('projection') == True: projection = [] for f in fields: if f.type in ['text', 'blob', 'json']: raise SyntaxError( "text and blob field types not allowed in projection queries") else: projection.append(f.name) elif args_get('filterfields') is True: projection = [] for f in fields: projection.append(f.name) # real projection's can't include 'id'. # it will be added to the result later if projection and args_get('projection') == True: query_projection = filter(lambda p: p != db[tablename]._id.name, projection) else: query_projection = None ## DONE WITH PROJECTION cursor = args_get('reusecursor') cursor = cursor if isinstance(cursor, str) else None qo = ndb.QueryOptions(projection=query_projection, cursor=cursor) if filters == None: items = tableobj.query(default_options=qo) elif hasattr(filters,'filter_all') and filters.filter_all: items = [] elif (hasattr(filters,'_FilterNode__name') and filters._FilterNode__name=='__key__' and filters._FilterNode__opsymbol=='='): item = ndb.Key.from_old_key(filters._FilterNode__value).get() items = [item] if item else [] else: items = tableobj.query(filters, default_options=qo) if count_only: items = [len(items) if isinstance(items,list) else items.count()] elif not isinstance(items,list): if args_get('left', None): raise SyntaxError('Set: no left join in appengine') if args_get('groupby', None): raise SyntaxError('Set: no groupby in appengine') orderby = args_get('orderby', False) if orderby: if isinstance(orderby, (list, tuple)): orderby = xorify(orderby) if isinstance(orderby,Expression): orderby = self.expand(orderby) orders = orderby.split(', ') tbl = tableobj for order in orders: order = str(order) desc = order[:1] == '-' name = order[1 if desc else 0:].split('.')[-1] if name == 'id': o = -tbl._key if desc else tbl._key else: o = -getattr(tbl, name) if desc else getattr(tbl, name) items = items.order(o) if args_get('limitby', None): (lmin, lmax) = attributes['limitby'] limit, fetch_args = lmax-lmin, {'offset':lmin,'keys_only':True} keys, cursor, more = items.fetch_page(limit,**fetch_args) items = ndb.get_multi(keys) # cursor is only useful if there was a limit and we # didn't return all results if args_get('reusecursor'): db['_lastcursor'] = cursor return (items, tablename, projection or db[tablename].fields) def select(self,query,fields,attributes): """ This is the GAE version of select. Some notes to consider: - db['_lastsql'] is not set because there is not SQL statement string for a GAE query - 'nativeRef' is a magical fieldname used for self references on GAE - optional attribute 'projection' when set to True will trigger use of the GAE projection queries. note that there are rules for what is accepted imposed by GAE: each field must be indexed, projection queries cannot contain blob or text fields, and you cannot use == and also select that same field. see https://developers.google.com/appengine/docs/python/datastore/queries#Query_Projection - optional attribute 'filterfields' when set to True web2py will only parse the explicitly listed fields into the Rows object, even though all fields are returned in the query. This can be used to reduce memory usage in cases where true projection queries are not usable. - optional attribute 'reusecursor' allows use of cursor with queries that have the limitby attribute. Set the attribute to True for the first query, set it to the value of db['_lastcursor'] to continue a previous query. The user must save the cursor value between requests, and the filters must be identical. It is up to the user to follow google's limitations: https://developers.google.com/appengine/docs/python/datastore/queries#Query_Cursors """ (items, tablename, fields) = self.select_raw(query,fields,attributes) # self.db['_lastsql'] = self._select(query,fields,attributes) rows = [[(t==self.db[tablename]._id.name and item) or \ (t=='nativeRef' and item) or getattr(item, t) \ for t in fields] for item in items] colnames = ['%s.%s' % (tablename, t) for t in fields] processor = attributes.get('processor',self.parse) return processor(rows,fields,colnames,False) def parse_list_integers(self, value, field_type): return value[:] def parse_list_strings(self, value, field_type): return value[:] def count(self,query,distinct=None,limit=None): if distinct: raise RuntimeError("COUNT DISTINCT not supported") (items, tablename, fields) = self.select_raw(query,count_only=True) return items[0] def delete(self,tablename, query): """ This function was changed on 2010-05-04 because according to http://code.google.com/p/googleappengine/issues/detail?id=3119 GAE no longer supports deleting more than 1000 records. """ # self.db['_lastsql'] = self._delete(tablename,query) (items, tablename, fields) = self.select_raw(query) # items can be one item or a query if not isinstance(items,list): # use a keys_only query to ensure that this runs as a datastore # small operations leftitems = items.fetch(1000, keys_only=True) counter = 0 while len(leftitems): counter += len(leftitems) ndb.delete_multi(leftitems) leftitems = items.fetch(1000, keys_only=True) else: counter = len(items) ndb.delete_multi([item.key for item in items]) return counter def update(self,tablename,query,update_fields): # self.db['_lastsql'] = self._update(tablename,query,update_fields) (items, tablename, fields) = self.select_raw(query) counter = 0 for item in items: for field, value in update_fields: setattr(item, field.name, self.represent(value,field.type)) item.put() counter += 1 self.db.logger.info(str(counter)) return counter def insert(self,table,fields): dfields=dict((f.name,self.represent(v,f.type)) for f,v in fields) # table._db['_lastsql'] = self._insert(table,fields) tmp = table._tableobj(**dfields) tmp.put() key = tmp.key rid = Reference(key.id()) (rid._table, rid._record, rid._gaekey) = (table, None, key) return rid def bulk_insert(self,table,items): parsed_items = [] for item in items: dfields=dict((f.name,self.represent(v,f.type)) for f,v in item) parsed_items.append(table._tableobj(**dfields)) return ndb.put_multi(parsed_items) web2py-2.12.3.orig/gluon/packages/dal/pydal/adapters/mysql.py0000664000000000000000000001164712564727432022570 0ustar rootroot# -*- coding: utf-8 -*- import re from .._globals import IDENTITY from ..helpers.methods import varquote_aux from .base import BaseAdapter class MySQLAdapter(BaseAdapter): drivers = ('MySQLdb','pymysql', 'mysqlconnector') commit_on_alter_table = True support_distributed_transaction = True types = { 'boolean': 'CHAR(1)', 'string': 'VARCHAR(%(length)s)', 'text': 'LONGTEXT', 'json': 'LONGTEXT', 'password': 'VARCHAR(%(length)s)', 'blob': 'LONGBLOB', 'upload': 'VARCHAR(%(length)s)', 'integer': 'INT', 'bigint': 'BIGINT', 'float': 'FLOAT', 'double': 'DOUBLE', 'decimal': 'NUMERIC(%(precision)s,%(scale)s)', 'date': 'DATE', 'time': 'TIME', 'datetime': 'DATETIME', 'id': 'INT AUTO_INCREMENT NOT NULL', 'reference': 'INT %(null)s %(unique)s, INDEX %(index_name)s (%(field_name)s), FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'list:integer': 'LONGTEXT', 'list:string': 'LONGTEXT', 'list:reference': 'LONGTEXT', 'big-id': 'BIGINT AUTO_INCREMENT NOT NULL', 'big-reference': 'BIGINT %(null)s %(unique)s, INDEX %(index_name)s (%(field_name)s), FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference FK': ', CONSTRAINT `FK_%(constraint_name)s` FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', } QUOTE_TEMPLATE = "`%s`" def varquote(self,name): return varquote_aux(name,'`%s`') def RANDOM(self): return 'RAND()' def SUBSTRING(self,field,parameters): return 'SUBSTRING(%s,%s,%s)' % (self.expand(field), parameters[0], parameters[1]) def EPOCH(self, first): return "UNIX_TIMESTAMP(%s)" % self.expand(first) def CONCAT(self, *items): return 'CONCAT(%s)' % ','.join(self.expand(x,'string') for x in items) def REGEXP(self,first,second): return '(%s REGEXP %s)' % (self.expand(first), self.expand(second,'string')) def CAST(self, first, second): if second=='LONGTEXT': second = 'CHAR' return 'CAST(%s AS %s)' % (first, second) def _drop(self,table,mode): # breaks db integrity but without this mysql does not drop table table_rname = table.sqlsafe return ['SET FOREIGN_KEY_CHECKS=0;','DROP TABLE %s;' % table_rname, 'SET FOREIGN_KEY_CHECKS=1;'] def _insert_empty(self, table): return 'INSERT INTO %s VALUES (DEFAULT);' % (table.sqlsafe) def distributed_transaction_begin(self,key): self.execute('XA START;') def prepare(self,key): self.execute("XA END;") self.execute("XA PREPARE;") def commit_prepared(self,key): self.execute("XA COMMIT;") def rollback_prepared(self,key): self.execute("XA ROLLBACK;") REGEX_URI = re.compile('^(?P[^:@]+)(\:(?P[^@]*))?@(?P[^\:/]+)(\:(?P[0-9]+))?/(?P[^?]+)(\?set_encoding=(?P\w+))?$') def __init__(self,db,uri,pool_size=0,folder=None,db_codec ='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, after_connection=None): self.db = db self.dbengine = "mysql" self.uri = uri if do_connect: self.find_driver(adapter_args,uri) self.pool_size = pool_size self.folder = folder self.db_codec = db_codec self._after_connection = after_connection self.find_or_make_work_folder() ruri = uri.split('://',1)[1] m = self.REGEX_URI.match(ruri) if not m: raise SyntaxError( "Invalid URI string in DAL: %s" % self.uri) user = credential_decoder(m.group('user')) if not user: raise SyntaxError('User required') password = credential_decoder(m.group('password')) if not password: password = '' host = m.group('host') if not host: raise SyntaxError('Host name required') db = m.group('db') if not db: raise SyntaxError('Database name required') port = int(m.group('port') or '3306') charset = m.group('charset') or 'utf8' driver_args.update(db=db, user=credential_decoder(user), passwd=credential_decoder(password), host=host, port=port, charset=charset) def connector(driver_args=driver_args): return self.driver.connect(**driver_args) self.connector = connector if do_connect: self.reconnect() def after_connection(self): self.execute('SET FOREIGN_KEY_CHECKS=1;') self.execute("SET sql_mode='NO_BACKSLASH_ESCAPES';") web2py-2.12.3.orig/gluon/packages/dal/pydal/adapters/base.py0000664000000000000000000023611712564727432022336 0ustar rootroot# -*- coding: utf-8 -*- import re import os import sys import locale import datetime import decimal import copy import time import base64 import types import json from .._compat import PY2, pjoin, exists, pickle, hashlib_md5, iterkeys, \ iteritems, with_metaclass, to_unicode, integer_types, basestring, \ string_types from .._globals import IDENTITY from .._load import portalocker from ..connection import ConnectionPool from ..objects import Expression, Field, Query, Table, Row, FieldVirtual, \ FieldMethod, LazyReferenceGetter, LazySet, VirtualCommand, Rows, IterRows from ..helpers.regex import REGEX_NO_GREEDY_ENTITY_NAME, REGEX_TYPE, \ REGEX_SELECT_AS_PARSER from ..helpers.methods import xorify, use_common_filters, bar_encode, \ bar_decode_integer, bar_decode_string from ..helpers.classes import SQLCustomType, SQLALL, Reference, \ RecordUpdater, RecordDeleter, NullDriver, FakeCursor from ..helpers.serializers import serializers long = integer_types[-1] TIMINGSSIZE = 100 CALLABLETYPES = (types.LambdaType, types.FunctionType, types.BuiltinFunctionType, types.MethodType, types.BuiltinMethodType) SELECT_ARGS = set( ('orderby', 'groupby', 'limitby', 'required', 'cache', 'left', 'distinct', 'having', 'join', 'for_update', 'processor', 'cacheable', 'orderby_on_limitby')) class AdapterMeta(type): """Metaclass to support manipulation of adapter classes. At the moment is used to intercept `entity_quoting` argument passed to DAL. """ def __call__(cls, *args, **kwargs): uploads_in_blob = kwargs.get('adapter_args', {}).get( 'uploads_in_blob', cls.uploads_in_blob) cls.uploads_in_blob = uploads_in_blob entity_quoting = kwargs.get('entity_quoting', False) if 'entity_quoting' in kwargs: del kwargs['entity_quoting'] obj = super(AdapterMeta, cls).__call__(*args, **kwargs) if not entity_quoting: quot = obj.QUOTE_TEMPLATE = '%s' regex_ent = r'(\w+)' else: quot = obj.QUOTE_TEMPLATE regex_ent = REGEX_NO_GREEDY_ENTITY_NAME obj.REGEX_TABLE_DOT_FIELD = re.compile( r'^' + quot % regex_ent + r'\.' + quot % regex_ent + r'$') return obj class BaseAdapter(with_metaclass(AdapterMeta, ConnectionPool)): driver_auto_json = [] driver = None driver_name = None drivers = () # list of drivers from which to pick connection = None commit_on_alter_table = False support_distributed_transaction = False uploads_in_blob = False can_select_for_update = True dbpath = None folder = None connector = lambda *args, **kwargs: None # __init__ should override this TRUE_exp = '1' FALSE_exp = '0' TRUE = 'T' FALSE = 'F' T_SEP = ' ' QUOTE_TEMPLATE = '"%s"' test_query = 'SELECT 1;' types = { 'boolean': 'CHAR(1)', 'string': 'CHAR(%(length)s)', 'text': 'TEXT', 'json': 'TEXT', 'password': 'CHAR(%(length)s)', 'blob': 'BLOB', 'upload': 'CHAR(%(length)s)', 'integer': 'INTEGER', 'bigint': 'INTEGER', 'float':'DOUBLE', 'double': 'DOUBLE', 'decimal': 'DOUBLE', 'date': 'DATE', 'time': 'TIME', 'datetime': 'TIMESTAMP', 'id': 'INTEGER PRIMARY KEY AUTOINCREMENT', 'reference': 'INTEGER REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s %(null)s %(unique)s', 'list:integer': 'TEXT', 'list:string': 'TEXT', 'list:reference': 'TEXT', # the two below are only used when DAL(...bigint_id=True) and replace 'id','reference' 'big-id': 'INTEGER PRIMARY KEY AUTOINCREMENT', 'big-reference': 'INTEGER REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s %(null)s %(unique)s', 'reference FK': ', CONSTRAINT "FK_%(constraint_name)s" FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', } def isOperationalError(self,exception): if not hasattr(self.driver, "OperationalError"): return None return isinstance(exception, self.driver.OperationalError) def isProgrammingError(self,exception): if not hasattr(self.driver, "ProgrammingError"): return None return isinstance(exception, self.driver.ProgrammingError) def id_query(self, table): pkeys = getattr(table,'_primarykey',None) if pkeys: return table[pkeys[0]] != None else: return table._id != None def adapt(self, obj): return "'%s'" % obj.replace("'", "''") def smart_adapt(self, obj): if isinstance(obj,(int,float)): return str(obj) return self.adapt(str(obj)) def file_exists(self, filename): #to be used ONLY for files that on GAE may not be on filesystem return exists(filename) def file_open(self, filename, mode='rb', lock=True): #to be used ONLY for files that on GAE may not be on filesystem if lock: fileobj = portalocker.LockedFile(filename,mode) else: fileobj = open(filename,mode) return fileobj def file_close(self, fileobj): #to be used ONLY for files that on GAE may not be on filesystem if fileobj: fileobj.close() def file_delete(self, filename): os.unlink(filename) def find_driver(self, adapter_args, uri=None): self.adapter_args = adapter_args if getattr(self, 'driver', None) is not None: return drivers_available = [driver for driver in self.drivers if driver in iterkeys(self.db._drivers_available)] if uri: items = uri.split('://', 1)[0].split(':') request_driver = items[1] if len(items) > 1 else None else: request_driver = None request_driver = request_driver or adapter_args.get('driver') if request_driver: if request_driver in drivers_available: self.driver_name = request_driver #self.driver = globals().get(request_driver) self.driver = self.db._drivers_available[request_driver] else: raise RuntimeError("driver %s not available" % request_driver) elif drivers_available: self.driver_name = drivers_available[0] #self.driver = globals().get(self.driver_name) self.driver = self.db._drivers_available[self.driver_name] else: raise RuntimeError("no driver available %s" % str(self.drivers)) def log(self, message, table=None): """ Logs migrations It will not log changes if logfile is not specified. Defaults to sql.log """ isabs = None logfilename = self.adapter_args.get('logfile','sql.log') writelog = bool(logfilename) if writelog: isabs = os.path.isabs(logfilename) if table and table._dbt and writelog and self.folder: if isabs: table._loggername = logfilename else: table._loggername = pjoin(self.folder, logfilename) logfile = self.file_open(table._loggername, 'ab') logfile.write(message) self.file_close(logfile) def __init__(self, db, uri, pool_size=0, folder=None, db_codec='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, after_connection=None): self.db = db self.dbengine = "None" self.uri = uri self.pool_size = pool_size self.folder = folder self.db_codec = db_codec self._after_connection = after_connection self.connection = None self.cursor = None if uri == "None": self.connector = NullDriver self.reconnect() def sequence_name(self,tablename): return self.QUOTE_TEMPLATE % ('%s_sequence' % tablename) def trigger_name(self,tablename): return '%s_sequence' % tablename def varquote(self,name): return name def create_table(self, table, migrate=True, fake_migrate=False, polymodel=None): db = table._db fields = [] # PostGIS geo fields are added after the table has been created postcreation_fields = [] sql_fields = {} sql_fields_aux = {} TFK = {} tablename = table._tablename sortable = 0 types = self.types for field in table: sortable += 1 field_name = field.name field_type = field.type if isinstance(field_type,SQLCustomType): ftype = field_type.native or field_type.type elif field_type.startswith(('reference', 'big-reference')): if field_type.startswith('reference'): referenced = field_type[10:].strip() type_name = 'reference' else: referenced = field_type[14:].strip() type_name = 'big-reference' if referenced == '.': referenced = tablename constraint_name = self.constraint_name(tablename, field_name) # if not '.' in referenced \ # and referenced != tablename \ # and hasattr(table,'_primarykey'): # ftype = types['integer'] #else: try: rtable = db[referenced] rfield = rtable._id rfieldname = rfield.name rtablename = referenced except (KeyError, ValueError, AttributeError) as e: self.db.logger.debug('Error: %s' % e) try: rtablename,rfieldname = referenced.split('.') rtable = db[rtablename] rfield = rtable[rfieldname] except Exception as e: self.db.logger.debug('Error: %s' %e) raise KeyError('Cannot resolve reference %s in %s definition' % (referenced, table._tablename)) # must be PK reference or unique if getattr(rtable, '_primarykey', None) and rfieldname in rtable._primarykey or \ rfield.unique: ftype = types[rfield.type[:9]] % \ dict(length=rfield.length) # multicolumn primary key reference? if not rfield.unique and len(rtable._primarykey)>1: # then it has to be a table level FK if rtablename not in TFK: TFK[rtablename] = {} TFK[rtablename][rfieldname] = field_name else: ftype = ftype + \ types['reference FK'] % dict( constraint_name = constraint_name, # should be quoted foreign_key = rtable.sqlsafe + ' (' + rfield.sqlsafe_name + ')', table_name = table.sqlsafe, field_name = field.sqlsafe_name, on_delete_action=field.ondelete) else: # make a guess here for circular references if referenced in db: id_fieldname = db[referenced]._id.sqlsafe_name elif referenced == tablename: id_fieldname = table._id.sqlsafe_name else: #make a guess id_fieldname = self.QUOTE_TEMPLATE % 'id' #gotcha: the referenced table must be defined before #the referencing one to be able to create the table #Also if it's not recommended, we can still support #references to tablenames without rname to make #migrations and model relationship work also if tables #are not defined in order if referenced == tablename: real_referenced = db[referenced].sqlsafe else: real_referenced = (referenced in db and db[referenced].sqlsafe or referenced) rfield = db[referenced]._id ftype_info = dict( index_name = self.QUOTE_TEMPLATE % (field_name+'__idx'), field_name = field.sqlsafe_name, constraint_name = self.QUOTE_TEMPLATE % constraint_name, foreign_key = '%s (%s)' % (real_referenced, rfield.sqlsafe_name), on_delete_action=field.ondelete, ) ftype_info['null'] = ' NOT NULL' if field.notnull else self.ALLOW_NULL() ftype_info['unique'] = ' UNIQUE' if field.unique else '' ftype = types[type_name] % ftype_info elif field_type.startswith('list:reference'): ftype = types[field_type[:14]] elif field_type.startswith('decimal'): precision, scale = map(int,field_type[8:-1].split(',')) ftype = types[field_type[:7]] % \ dict(precision=precision,scale=scale) elif field_type.startswith('geo'): if not hasattr(self,'srid'): raise RuntimeError('Adapter does not support geometry') srid = self.srid geotype, parms = field_type[:-1].split('(') if not geotype in types: raise SyntaxError( 'Field: unknown field type: %s for %s' \ % (field_type, field_name)) ftype = types[geotype] if self.dbengine == 'postgres' and geotype == 'geometry': if self.ignore_field_case is True: field_name = field_name.lower() # parameters: schema, srid, dimension dimension = 2 # GIS.dimension ??? parms = parms.split(',') if len(parms) == 3: schema, srid, dimension = parms elif len(parms) == 2: schema, srid = parms else: schema = parms[0] ftype = "SELECT AddGeometryColumn ('%%(schema)s', '%%(tablename)s', '%%(fieldname)s', %%(srid)s, '%s', %%(dimension)s);" % types[geotype] ftype = ftype % dict(schema=schema, tablename=tablename, fieldname=field_name, srid=srid, dimension=dimension) postcreation_fields.append(ftype) elif not field_type in types: raise SyntaxError('Field: unknown field type: %s for %s' % \ (field_type, field_name)) else: ftype = types[field_type]\ % dict(length=field.length) if not field_type.startswith('id') and \ not field_type.startswith(('reference', 'big-reference')): if field.notnull: ftype += ' NOT NULL' else: ftype += self.ALLOW_NULL() if field.unique: ftype += ' UNIQUE' if field.custom_qualifier: ftype += ' %s' % field.custom_qualifier # add to list of fields sql_fields[field_name] = dict( length=field.length, unique=field.unique, notnull=field.notnull, sortable=sortable, type=str(field_type), sql=ftype) if field.notnull and not field.default is None: # Caveat: sql_fields and sql_fields_aux # differ for default values. # sql_fields is used to trigger migrations and sql_fields_aux # is used for create tables. # The reason is that we do not want to trigger # a migration simply because a default value changes. not_null = self.NOT_NULL(field.default, field_type) ftype = ftype.replace('NOT NULL', not_null) sql_fields_aux[field_name] = dict(sql=ftype) # Postgres - PostGIS: # geometry fields are added after the table has been created, not now if not (self.dbengine == 'postgres' and \ field_type.startswith('geom')): fields.append('%s %s' % (field.sqlsafe_name, ftype)) other = ';' # backend-specific extensions to fields if self.dbengine == 'mysql': if not hasattr(table, "_primarykey"): fields.append('PRIMARY KEY (%s)' % (self.QUOTE_TEMPLATE % table._id.name)) engine = self.adapter_args.get('engine','InnoDB') other = ' ENGINE=%s CHARACTER SET utf8;' % engine fields = ',\n '.join(fields) for rtablename in TFK: rfields = TFK[rtablename] pkeys = [self.QUOTE_TEMPLATE % pk for pk in db[rtablename]._primarykey] fkeys = [self.QUOTE_TEMPLATE % rfields[k].name for k in pkeys ] fields = fields + ',\n ' + \ types['reference TFK'] % dict( table_name = table.sqlsafe, field_name=', '.join(fkeys), foreign_table = table.sqlsafe, foreign_key = ', '.join(pkeys), on_delete_action = field.ondelete) table_rname = table.sqlsafe if getattr(table,'_primarykey',None): query = "CREATE TABLE %s(\n %s,\n %s) %s" % \ (table.sqlsafe, fields, self.PRIMARY_KEY(', '.join([self.QUOTE_TEMPLATE % pk for pk in table._primarykey])),other) else: query = "CREATE TABLE %s(\n %s\n)%s" % \ (table.sqlsafe, fields, other) if self.uri.startswith('sqlite:///') \ or self.uri.startswith('spatialite:///'): if PY2: path_encoding = sys.getfilesystemencoding() \ or locale.getdefaultlocale()[1] or 'utf8' dbpath = self.uri[9:self.uri.rfind('/')].decode( 'utf8').encode(path_encoding) else: dbpath = self.uri[9:self.uri.rfind('/')] else: dbpath = self.folder if not migrate: return query elif self.uri.startswith('sqlite:memory')\ or self.uri.startswith('spatialite:memory'): table._dbt = None elif isinstance(migrate, string_types): table._dbt = pjoin(dbpath, migrate) else: table._dbt = pjoin( dbpath, '%s_%s.table' % (table._db._uri_hash, tablename)) if not table._dbt or not self.file_exists(table._dbt): if table._dbt: self.log('timestamp: %s\n%s\n' % (datetime.datetime.today().isoformat(), query), table) if not fake_migrate: self.create_sequence_and_triggers(query,table) table._db.commit() # Postgres geom fields are added now, # after the table has been created for query in postcreation_fields: self.execute(query) table._db.commit() if table._dbt: tfile = self.file_open(table._dbt, 'wb') pickle.dump(sql_fields, tfile) self.file_close(tfile) if fake_migrate: self.log('faked!\n', table) else: self.log('success!\n', table) else: tfile = self.file_open(table._dbt, 'rb') try: sql_fields_old = pickle.load(tfile) except EOFError: self.file_close(tfile) raise RuntimeError('File %s appears corrupted' % table._dbt) self.file_close(tfile) if sql_fields != sql_fields_old: self.migrate_table( table, sql_fields, sql_fields_old, sql_fields_aux, None, fake_migrate=fake_migrate ) return query def migrate_table( self, table, sql_fields, sql_fields_old, sql_fields_aux, logfile, fake_migrate=False, ): # logfile is deprecated (moved to adapter.log method) db = table._db db._migrated.append(table._tablename) tablename = table._tablename def fix(item): k,v=item if not isinstance(v,dict): v=dict(type='unknown',sql=v) if self.ignore_field_case is not True: return k, v return k.lower(),v # make sure all field names are lower case to avoid # migrations because of case cahnge sql_fields = dict(map(fix, iteritems(sql_fields))) sql_fields_old = dict(map(fix, iteritems(sql_fields_old))) sql_fields_aux = dict(map(fix, iteritems(sql_fields_aux))) if db._debug: db.logger.debug('migrating %s to %s' % (sql_fields_old,sql_fields)) keys = list(sql_fields.keys()) for key in sql_fields_old: if not key in keys: keys.append(key) new_add = self.concat_add(tablename) metadata_change = False sql_fields_current = copy.copy(sql_fields_old) for key in keys: query = None if not key in sql_fields_old: sql_fields_current[key] = sql_fields[key] if self.dbengine in ('postgres',) and \ sql_fields[key]['type'].startswith('geometry'): # 'sql' == ftype in sql query = [ sql_fields[key]['sql'] ] else: query = ['ALTER TABLE %s ADD %s %s;' % \ (table.sqlsafe, key, sql_fields_aux[key]['sql'].replace(', ', new_add))] metadata_change = True elif self.dbengine in ('sqlite', 'spatialite'): if key in sql_fields: sql_fields_current[key] = sql_fields[key] metadata_change = True elif not key in sql_fields: del sql_fields_current[key] ftype = sql_fields_old[key]['type'] if (self.dbengine in ('postgres',) and ftype.startswith('geometry')): geotype, parms = ftype[:-1].split('(') schema = parms.split(',')[0] query = [ "SELECT DropGeometryColumn ('%(schema)s', \ '%(table)s', '%(field)s');" % dict(schema=schema, table=tablename, field=key) ] elif self.dbengine in ('firebird',): query = ['ALTER TABLE %s DROP %s;' % (self.QUOTE_TEMPLATE % tablename, self.QUOTE_TEMPLATE % key)] else: query = ['ALTER TABLE %s DROP COLUMN %s;' % (self.QUOTE_TEMPLATE % tablename, self.QUOTE_TEMPLATE % key)] metadata_change = True elif sql_fields[key]['sql'] != sql_fields_old[key]['sql'] \ and not (key in table.fields and isinstance(table[key].type, SQLCustomType)) \ and not sql_fields[key]['type'].startswith('reference')\ and not sql_fields[key]['type'].startswith('double')\ and not sql_fields[key]['type'].startswith('id'): sql_fields_current[key] = sql_fields[key] t = tablename tt = sql_fields_aux[key]['sql'].replace(', ', new_add) if self.dbengine in ('firebird',): drop_expr = 'ALTER TABLE %s DROP %s;' else: drop_expr = 'ALTER TABLE %s DROP COLUMN %s;' key_tmp = key + '__tmp' query = ['ALTER TABLE %s ADD %s %s;' % (self.QUOTE_TEMPLATE % t, self.QUOTE_TEMPLATE % key_tmp, tt), 'UPDATE %s SET %s=%s;' % (self.QUOTE_TEMPLATE % t, self.QUOTE_TEMPLATE % key_tmp, self.QUOTE_TEMPLATE % key), drop_expr % (self.QUOTE_TEMPLATE % t, self.QUOTE_TEMPLATE % key), 'ALTER TABLE %s ADD %s %s;' % (self.QUOTE_TEMPLATE % t, self.QUOTE_TEMPLATE % key, tt), 'UPDATE %s SET %s=%s;' % (self.QUOTE_TEMPLATE % t, self.QUOTE_TEMPLATE % key, self.QUOTE_TEMPLATE % key_tmp), drop_expr % (self.QUOTE_TEMPLATE % t, self.QUOTE_TEMPLATE % key_tmp)] metadata_change = True elif sql_fields[key]['type'] != sql_fields_old[key]['type']: sql_fields_current[key] = sql_fields[key] metadata_change = True if query: self.log('timestamp: %s\n' % datetime.datetime.today().isoformat(), table) db['_lastsql'] = '\n'.join(query) for sub_query in query: self.log(sub_query + '\n', table) if fake_migrate: if db._adapter.commit_on_alter_table: self.save_dbt(table,sql_fields_current) self.log('faked!\n', table) else: self.execute(sub_query) # Caveat: mysql, oracle and firebird # do not allow multiple alter table # in one transaction so we must commit # partial transactions and # update table._dbt after alter table. if db._adapter.commit_on_alter_table: db.commit() self.save_dbt(table,sql_fields_current) self.log('success!\n', table) elif metadata_change: self.save_dbt(table,sql_fields_current) if metadata_change and not (query and db._adapter.commit_on_alter_table): db.commit() self.save_dbt(table,sql_fields_current) self.log('success!\n', table) def save_dbt(self,table, sql_fields_current): tfile = self.file_open(table._dbt, 'wb') pickle.dump(sql_fields_current, tfile) self.file_close(tfile) def LOWER(self, first): return 'LOWER(%s)' % self.expand(first) def UPPER(self, first): return 'UPPER(%s)' % self.expand(first) def COUNT(self, first, distinct=None): return ('COUNT(%s)' if not distinct else 'COUNT(DISTINCT %s)') \ % self.expand(first) def EXTRACT(self, first, what): return "EXTRACT(%s FROM %s)" % (what, self.expand(first)) def EPOCH(self, first): return self.EXTRACT(first, 'epoch') def LENGTH(self, first): return "LENGTH(%s)" % self.expand(first) def AGGREGATE(self, first, what): return "%s(%s)" % (what, self.expand(first)) def JOIN(self): return 'JOIN' def LEFT_JOIN(self): return 'LEFT JOIN' def RANDOM(self): return 'Random()' def NOT_NULL(self, default, field_type): return 'NOT NULL DEFAULT %s' % self.represent(default,field_type) def COALESCE(self, first, second): expressions = [self.expand(first)]+[self.expand(e) for e in second] return 'COALESCE(%s)' % ','.join(expressions) def COALESCE_ZERO(self, first): return 'COALESCE(%s,0)' % self.expand(first) def RAW(self, first): return first def ALLOW_NULL(self): return '' def SUBSTRING(self, field, parameters): return 'SUBSTR(%s,%s,%s)' % (self.expand(field), parameters[0], parameters[1]) def PRIMARY_KEY(self, key): return 'PRIMARY KEY(%s)' % key # SQL statement for dropping table def _drop(self, table, mode): return ['DROP TABLE %s;' % table.sqlsafe] # PYDAL cleanup def _drop_cleanup(self, table): db = table._db del db[table._tablename] del db.tables[db.tables.index(table._tablename)] db._remove_references_to(table) if table._dbt: self.file_delete(table._dbt) self.log('success!\n', table) return def drop(self, table, mode=''): db = table._db queries = self._drop(table, mode) for query in queries: if table._dbt: self.log(query + '\n', table) self.execute(query) db.commit() self._drop_cleanup(table) return def _insert(self, table, fields): table_rname = table.sqlsafe if fields: keys = ','.join(f.sqlsafe_name for f, v in fields) values = ','.join(self.expand(v, f.type) for f, v in fields) return 'INSERT INTO %s(%s) VALUES (%s);' % (table_rname, keys, values) else: return self._insert_empty(table) def _insert_empty(self, table): return 'INSERT INTO %s DEFAULT VALUES;' % (table.sqlsafe) def insert(self, table, fields): query = self._insert(table,fields) try: self.execute(query) except Exception: e = sys.exc_info()[1] if hasattr(table,'_on_insert_error'): return table._on_insert_error(table,fields,e) raise e if hasattr(table, '_primarykey'): mydict = dict([(k[0].name, k[1]) for k in fields if k[0].name in table._primarykey]) if mydict != {}: return mydict id = self.lastrowid(table) if hasattr(table, '_primarykey') and len(table._primarykey) == 1: id = {table._primarykey[0]: id} if not isinstance(id, (int, long)): return id rid = Reference(id) (rid._table, rid._record) = (table, None) return rid def bulk_insert(self, table, items): return [self.insert(table,item) for item in items] def NOT(self, first): return '(NOT %s)' % self.expand(first) def AND(self, first, second): return '(%s AND %s)' % (self.expand(first), self.expand(second)) def OR(self, first, second): return '(%s OR %s)' % (self.expand(first), self.expand(second)) def BELONGS(self, first, second): if isinstance(second, str): return '(%s IN (%s))' % (self.expand(first), second[:-1]) if not second: return '(1=0)' items = ','.join(self.expand(item, first.type) for item in second) return '(%s IN (%s))' % (self.expand(first), items) def REGEXP(self, first, second): """Regular expression operator""" raise NotImplementedError def like_escaper_default(self, term): if isinstance(term, Expression): return term term = term.replace('\\', '\\\\') term = term.replace('%', '\%').replace('_', '\_') return term def LIKE(self, first, second, escape=None): """Case sensitive like operator""" if isinstance(second, Expression): second = self.expand(second, 'string') else: second = self.expand(second, 'string') if escape is None: escape = '\\' second = second.replace(escape, escape * 2) return "(%s LIKE %s ESCAPE '%s')" % (self.expand(first), second, escape) def ILIKE(self, first, second, escape=None): """Case insensitive like operator""" if isinstance(second, Expression): second = self.expand(second, 'string') else: second = self.expand(second, 'string').lower() if escape is None: escape = '\\' second = second.replace(escape, escape*2) return "(LOWER(%s) LIKE %s ESCAPE '%s')" % (self.expand(first), second, escape) def STARTSWITH(self, first, second): return "(%s LIKE %s ESCAPE '\\')" % (self.expand(first), self.expand(self.like_escaper_default(second)+'%', 'string')) def ENDSWITH(self, first, second): return "(%s LIKE %s ESCAPE '\\')" % (self.expand(first), self.expand('%'+self.like_escaper_default(second), 'string')) def CONTAINS(self, first, second, case_sensitive=True): if first.type in ('string','text', 'json'): if isinstance(second,Expression): second = Expression(second.db, self.CONCAT('%',Expression( second.db, self.REPLACE(second,('%','\%'))),'%')) else: second = '%'+self.like_escaper_default(str(second))+'%' elif first.type.startswith('list:'): if isinstance(second,Expression): second = Expression(second.db, self.CONCAT( '%|',Expression(second.db, self.REPLACE( Expression(second.db, self.REPLACE( second,('%','\%'))),('|','||'))),'|%')) else: second = str(second).replace('|', '||') second = '%|'+self.like_escaper_default(second)+'|%' op = case_sensitive and self.LIKE or self.ILIKE return op(first,second,escape='\\') def EQ(self, first, second=None): if second is None: return '(%s IS NULL)' % self.expand(first) return '(%s = %s)' % (self.expand(first), self.expand(second, first.type)) def NE(self, first, second=None): if second is None: return '(%s IS NOT NULL)' % self.expand(first) return '(%s <> %s)' % (self.expand(first), self.expand(second, first.type)) def LT(self,first,second=None): if second is None: raise RuntimeError("Cannot compare %s < None" % first) return '(%s < %s)' % (self.expand(first), self.expand(second,first.type)) def LE(self,first,second=None): if second is None: raise RuntimeError("Cannot compare %s <= None" % first) return '(%s <= %s)' % (self.expand(first), self.expand(second,first.type)) def GT(self,first,second=None): if second is None: raise RuntimeError("Cannot compare %s > None" % first) return '(%s > %s)' % (self.expand(first), self.expand(second,first.type)) def GE(self,first,second=None): if second is None: raise RuntimeError("Cannot compare %s >= None" % first) return '(%s >= %s)' % (self.expand(first), self.expand(second,first.type)) def is_numerical_type(self, ftype): return ftype in ('integer','boolean','double','bigint') or \ ftype.startswith('decimal') def REPLACE(self, first, tup): second, third = tup return 'REPLACE(%s,%s,%s)' % (self.expand(first,'string'), self.expand(second,'string'), self.expand(third,'string')) def CONCAT(self, *items): return '(%s)' % ' || '.join(self.expand(x,'string') for x in items) def ADD(self, first, second): if self.is_numerical_type(first.type) or isinstance(first.type, Field): return '(%s + %s)' % (self.expand(first), self.expand(second, first.type)) else: return self.CONCAT(first, second) def SUB(self, first, second): return '(%s - %s)' % (self.expand(first), self.expand(second, first.type)) def MUL(self, first, second): return '(%s * %s)' % (self.expand(first), self.expand(second, first.type)) def DIV(self, first, second): return '(%s / %s)' % (self.expand(first), self.expand(second, first.type)) def MOD(self, first, second): return '(%s %% %s)' % (self.expand(first), self.expand(second, first.type)) def AS(self, first, second): return '%s AS %s' % (self.expand(first), second) def ON(self, first, second): table_rname = self.table_alias(first) if use_common_filters(second): second = self.common_filter(second,[first._tablename]) return ('%s ON %s') % (self.expand(table_rname), self.expand(second)) def INVERT(self, first): return '%s DESC' % self.expand(first) def COMMA(self, first, second): return '%s, %s' % (self.expand(first), self.expand(second)) def CAST(self, first, second): return 'CAST(%s AS %s)' % (first, second) def expand(self, expression, field_type=None, colnames=False): if isinstance(expression, Field): et = expression.table if not colnames: table_rname = et._ot and self.QUOTE_TEMPLATE % et._tablename \ or et._rname or self.QUOTE_TEMPLATE % et._tablename rv = '%s.%s' % (table_rname, expression._rname or (self.QUOTE_TEMPLATE % (expression.name))) else: rv = '%s.%s' % (self.QUOTE_TEMPLATE % et._tablename, self.QUOTE_TEMPLATE % expression.name) if field_type == 'string' and expression.type not in ( 'string', 'text', 'json', 'password'): rv = self.CAST(rv, self.types['text']) elif isinstance(expression, (Expression, Query)): first = expression.first second = expression.second op = expression.op optional_args = expression.optional_args or {} if second is not None: rv = op(first, second, **optional_args) elif first is not None: rv = op(first, **optional_args) elif isinstance(op, str): if op.endswith(';'): op = op[:-1] rv = '(%s)' % op else: rv = op() elif field_type: rv = self.represent(expression, field_type) elif isinstance(expression, (list, tuple)): rv = ','.join(self.represent(item, field_type) for item in expression) elif isinstance(expression, bool): rv = self.db._adapter.TRUE_exp if expression else \ self.db._adapter.FALSE_exp else: rv = expression return str(rv) def table_alias(self, tbl): if not isinstance(tbl, Table): tbl = self.db[tbl] return tbl.sqlsafe_alias def alias(self, table, alias): """ Given a table object, makes a new table object with alias name. """ other = copy.copy(table) other['_ot'] = other._ot or other.sqlsafe other['ALL'] = SQLALL(other) other['_tablename'] = alias for fieldname in other.fields: other[fieldname] = copy.copy(other[fieldname]) other[fieldname]._tablename = alias other[fieldname].tablename = alias other[fieldname].table = other table._db[alias] = other return other def _truncate(self, table, mode=''): return ['TRUNCATE TABLE %s %s;' % (table.sqlsafe, mode or '')] def truncate(self, table, mode= ' '): # Prepare functions "write_to_logfile" and "close_logfile" try: queries = table._db._adapter._truncate(table, mode) for query in queries: self.log(query + '\n', table) self.execute(query) self.log('success!\n', table) finally: pass def _update(self, tablename, query, fields): if query: if use_common_filters(query): query = self.common_filter(query, [tablename]) sql_w = ' WHERE ' + self.expand(query) else: sql_w = '' sql_v = ','.join(['%s=%s' % (field.sqlsafe_name, self.expand(value, field.type)) \ for (field, value) in fields]) tablename = self.db[tablename].sqlsafe return 'UPDATE %s SET %s%s;' % (tablename, sql_v, sql_w) def update(self, tablename, query, fields): sql = self._update(tablename, query, fields) try: self.execute(sql) except Exception: e = sys.exc_info()[1] table = self.db[tablename] if hasattr(table,'_on_update_error'): return table._on_update_error(table,query,fields,e) raise e try: return self.cursor.rowcount except: return None def _delete(self, tablename, query): if query: if use_common_filters(query): query = self.common_filter(query, [tablename]) sql_w = ' WHERE ' + self.expand(query) else: sql_w = '' tablename = self.db[tablename].sqlsafe return 'DELETE FROM %s%s;' % (tablename, sql_w) def delete(self, tablename, query): sql = self._delete(tablename, query) self.execute(sql) try: counter = self.cursor.rowcount except: counter = None return counter def get_table(self, *queries): tablenames = self.tables(*queries) if len(tablenames)==1: return tablenames[0] elif len(tablenames)<1: raise RuntimeError("No table selected") else: raise RuntimeError("Too many tables selected (%s)" % str(tablenames)) def expand_all(self, fields, tablenames): db = self.db new_fields = [] append = new_fields.append for item in fields: if isinstance(item,SQLALL): new_fields += item._table elif isinstance(item,str): m = self.REGEX_TABLE_DOT_FIELD.match(item) if m: tablename,fieldname = m.groups() append(db[tablename][fieldname]) else: append(Expression(db,lambda item=item:item)) else: append(item) # ## if no fields specified take them all from the requested tables if not new_fields: for table in tablenames: for field in db[table]: append(field) return new_fields def _select(self, query, fields, attributes): tables = self.tables for key in set(attributes.keys())-SELECT_ARGS: raise SyntaxError('invalid select attribute: %s' % key) args_get = attributes.get tablenames = tables(query) tablenames_for_common_filters = tablenames for field in fields: for tablename in tables(field): if not tablename in tablenames: tablenames.append(tablename) if len(tablenames) < 1: raise SyntaxError('Set: no tables selected') def colexpand(field): return self.expand(field, colnames=True) self._colnames = list(map(colexpand, fields)) def geoexpand(field): if isinstance(field.type,str) and field.type.startswith('geo') and isinstance(field, Field): field = field.st_astext() return self.expand(field) sql_f = ', '.join(map(geoexpand, fields)) sql_o = '' sql_s = '' left = args_get('left', False) inner_join = args_get('join', False) distinct = args_get('distinct', False) groupby = args_get('groupby', False) orderby = args_get('orderby', False) having = args_get('having', False) limitby = args_get('limitby', False) orderby_on_limitby = args_get('orderby_on_limitby', True) for_update = args_get('for_update', False) if self.can_select_for_update is False and for_update is True: raise SyntaxError('invalid select attribute: for_update') if distinct is True: sql_s += 'DISTINCT' elif distinct: sql_s += 'DISTINCT ON (%s)' % distinct if inner_join: icommand = self.JOIN() if not isinstance(inner_join, (tuple, list)): inner_join = [inner_join] ijoint = [t._tablename for t in inner_join if not isinstance(t,Expression)] ijoinon = [t for t in inner_join if isinstance(t, Expression)] itables_to_merge={} #issue 490 [itables_to_merge.update( dict.fromkeys(tables(t))) for t in ijoinon] ijoinont = [t.first._tablename for t in ijoinon] [itables_to_merge.pop(t) for t in ijoinont if t in itables_to_merge] #issue 490 iimportant_tablenames = ijoint + ijoinont + list(itables_to_merge.keys()) iexcluded = [t for t in tablenames if not t in iimportant_tablenames] if left: join = attributes['left'] command = self.LEFT_JOIN() if not isinstance(join, (tuple, list)): join = [join] joint = [t._tablename for t in join if not isinstance(t, Expression)] joinon = [t for t in join if isinstance(t, Expression)] #patch join+left patch (solves problem with ordering in left joins) tables_to_merge={} [tables_to_merge.update( dict.fromkeys(tables(t))) for t in joinon] joinont = [t.first._tablename for t in joinon] [tables_to_merge.pop(t) for t in joinont if t in tables_to_merge] tablenames_for_common_filters = [t for t in tablenames if not t in joinont ] important_tablenames = joint + joinont + list(tables_to_merge.keys()) excluded = [t for t in tablenames if not t in important_tablenames ] else: excluded = tablenames if use_common_filters(query): query = self.common_filter(query,tablenames_for_common_filters) sql_w = ' WHERE ' + self.expand(query) if query else '' JOIN = ' CROSS JOIN ' if inner_join and not left: # Wrap table references with parenthesis (approach 1) # sql_t = ', '.join([self.table_alias(t) for t in iexcluded + \ # itables_to_merge.keys()]) # sql_t = '(%s)' % sql_t # or approach 2: Use 'JOIN' instead comma: sql_t = JOIN.join([self.table_alias(t) for t in iexcluded + list(itables_to_merge.keys())]) for t in ijoinon: sql_t += ' %s %s' % (icommand, t) elif not inner_join and left: sql_t = JOIN.join([self.table_alias(t) for t in excluded + \ list(tables_to_merge.keys())]) if joint: sql_t += ' %s %s' % (command, ','.join([t for t in joint])) for t in joinon: sql_t += ' %s %s' % (command, t) elif inner_join and left: all_tables_in_query = set(important_tablenames + \ iimportant_tablenames + \ tablenames) tables_in_joinon = set(joinont + ijoinont) tables_not_in_joinon = \ all_tables_in_query.difference(tables_in_joinon) sql_t = JOIN.join([self.table_alias(t) for t in tables_not_in_joinon]) for t in ijoinon: sql_t += ' %s %s' % (icommand, t) if joint: sql_t += ' %s %s' % (command, ','.join([t for t in joint])) for t in joinon: sql_t += ' %s %s' % (command, t) else: sql_t = ', '.join(self.table_alias(t) for t in tablenames) if groupby: if isinstance(groupby, (list, tuple)): groupby = xorify(groupby) sql_o += ' GROUP BY %s' % self.expand(groupby) if having: sql_o += ' HAVING %s' % attributes['having'] if orderby: if isinstance(orderby, (list, tuple)): orderby = xorify(orderby) if str(orderby) == '': sql_o += ' ORDER BY %s' % self.RANDOM() else: sql_o += ' ORDER BY %s' % self.expand(orderby) if (limitby and not groupby and tablenames and orderby_on_limitby and not orderby): sql_o += ' ORDER BY %s' % ', '.join( [self.db[t].sqlsafe + '.' + self.db[t][x].sqlsafe_name for t in tablenames for x in ( hasattr(self.db[t], '_primarykey') and self.db[t]._primarykey or ['_id'] ) ] ) # oracle does not support limitby sql = self.select_limitby(sql_s, sql_f, sql_t, sql_w, sql_o, limitby) if for_update and self.can_select_for_update is True: sql = sql.rstrip(';') + ' FOR UPDATE;' return sql def select_limitby(self, sql_s, sql_f, sql_t, sql_w, sql_o, limitby): if limitby: (lmin, lmax) = limitby sql_o += ' LIMIT %i OFFSET %i' % (lmax - lmin, lmin) return 'SELECT %s %s FROM %s%s%s;' % \ (sql_s, sql_f, sql_t, sql_w, sql_o) def _fetchall(self): return self.cursor.fetchall() def _fetchone(self): return self.cursor.fetchone() def _select_aux(self, sql, fields, attributes): args_get = attributes.get cache = args_get('cache',None) if not cache: self.execute(sql) rows = self._fetchall() else: if isinstance(cache, dict): cache_model = cache['model'] time_expire = cache['expiration'] key = cache.get('key') if not key: key = self.uri + '/' + sql + '/rows' key = hashlib_md5(key).hexdigest() else: (cache_model, time_expire) = cache key = self.uri + '/' + sql + '/rows' key = hashlib_md5(key).hexdigest() def _select_aux2(): self.execute(sql) return self._fetchall() rows = cache_model(key,_select_aux2,time_expire) if isinstance(rows,tuple): rows = list(rows) limitby = args_get('limitby', None) or (0,) rows = self.rowslice(rows,limitby[0],None) processor = args_get('processor', self.parse) cacheable = args_get('cacheable',False) return processor(rows,fields,self._colnames,cacheable=cacheable) def select(self, query, fields, attributes): """ Always returns a Rows object, possibly empty. """ sql = self._select(query, fields, attributes) cache = attributes.get('cache', None) if cache and attributes.get('cacheable',False): del attributes['cache'] (cache_model, time_expire) = cache key = self.uri + '/' + sql key = hashlib_md5(key).hexdigest() args = (sql,fields,attributes) return cache_model( key, lambda self=self,args=args:self._select_aux(*args), time_expire) else: return self._select_aux(sql,fields,attributes) def iterselect(self, query, fields, attributes): sql = self._select(query, fields, attributes) cacheable = attributes.get('cacheable', False) return self.iterparse(sql, fields, self._colnames, cacheable=cacheable) def _count(self, query, distinct=None): tablenames = self.tables(query) if query: if use_common_filters(query): query = self.common_filter(query, tablenames) sql_w = ' WHERE ' + self.expand(query) else: sql_w = '' sql_t = ','.join(self.table_alias(t) for t in tablenames) if distinct: if isinstance(distinct,(list, tuple)): distinct = xorify(distinct) sql_d = self.expand(distinct) return 'SELECT count(DISTINCT %s) FROM %s%s;' % \ (sql_d, sql_t, sql_w) return 'SELECT count(*) FROM %s%s;' % (sql_t, sql_w) def count(self, query, distinct=None): self.execute(self._count(query, distinct)) return self.cursor.fetchone()[0] def tables(self, *queries): tables = set() for query in queries: if isinstance(query, Field): tables.add(query.tablename) elif isinstance(query, (Expression, Query)): if not query.first is None: tables = tables.union(self.tables(query.first)) if not query.second is None: tables = tables.union(self.tables(query.second)) return list(tables) def commit(self): if self.connection: return self.connection.commit() def rollback(self): if self.connection: return self.connection.rollback() def close_connection(self): if self.connection: r = self.connection.close() self.connection = None return r def distributed_transaction_begin(self, key): return def prepare(self, key): if self.connection: self.connection.prepare() def commit_prepared(self, key): if self.connection: self.connection.commit() def rollback_prepared(self, key): if self.connection: self.connection.rollback() def concat_add(self, tablename): return ', ADD ' def constraint_name(self, table, fieldname): return '%s_%s__constraint' % (table,fieldname) def create_sequence_and_triggers(self, query, table, **args): self.execute(query) def log_execute(self, *a, **b): if not self.connection: raise ValueError(a[0]) if not self.connection: return None command = a[0] if hasattr(self,'filter_sql_command'): command = self.filter_sql_command(command) if self.db._debug: self.db.logger.debug('SQL: %s' % command) self.db._lastsql = command t0 = time.time() ret = self.cursor.execute(command, *a[1:], **b) self.db._timings.append((command,time.time()-t0)) del self.db._timings[:-TIMINGSSIZE] return ret def execute(self, *a, **b): return self.log_execute(*a, **b) def execute_test_query(self): return self.execute(self.test_query) def represent(self, obj, fieldtype): field_is_type = fieldtype.startswith if isinstance(obj, CALLABLETYPES): obj = obj() if isinstance(fieldtype, SQLCustomType): value = fieldtype.encoder(obj) if value and fieldtype.type in ('string', 'text', 'json'): return self.adapt(value) return value or 'NULL' if isinstance(obj, (Expression, Field)): return str(obj) if field_is_type('list:'): if not obj: obj = [] elif not isinstance(obj, (list, tuple)): obj = [obj] if field_is_type('list:string'): if PY2: try: obj = map(str, obj) except: obj = map(lambda x: unicode(x).encode(self.db_codec), obj) else: obj = list(map(str,obj)) else: obj = list(map(int,[o for o in obj if o != ''])) # we don't want to bar_encode json objects if isinstance(obj, (list, tuple)) and (not fieldtype == "json"): obj = bar_encode(obj) if obj is None: return 'NULL' if obj == '' and not fieldtype[:2] in ['st', 'te', 'js', 'pa', 'up']: return 'NULL' r = self.represent_exceptions(obj, fieldtype) if r is not None: return r if fieldtype == 'boolean': if obj and not str(obj)[:1].upper() in '0F': return self.smart_adapt(self.TRUE) else: return self.smart_adapt(self.FALSE) if fieldtype == 'id' or fieldtype == 'integer': return str(long(obj)) if field_is_type('decimal'): return str(obj) elif field_is_type('reference'): # reference # check for tablename first referenced = fieldtype[9:].strip() if referenced in self.db.tables: return str(long(obj)) p = referenced.partition('.') if p[2] != '': try: ftype = self.db[p[0]][p[2]].type return self.represent(obj, ftype) except (ValueError, KeyError): return repr(obj) elif isinstance(obj, (Row, Reference)): return str(obj['id']) return str(long(obj)) elif fieldtype == 'double': return repr(float(obj)) if PY2 and isinstance(obj, unicode): obj = obj.encode(self.db_codec) if fieldtype == 'blob': if PY2: obj = base64.b64encode(str(obj)) else: obj = base64.b64encode(obj.encode('utf-8')) elif fieldtype == 'date': if isinstance(obj, (datetime.date, datetime.datetime)): obj = obj.isoformat()[:10] else: obj = str(obj) elif fieldtype == 'datetime': if isinstance(obj, datetime.datetime): obj = obj.isoformat(self.T_SEP)[:19] elif isinstance(obj, datetime.date): obj = obj.isoformat()[:10]+self.T_SEP+'00:00:00' else: obj = str(obj) elif fieldtype == 'time': if isinstance(obj, datetime.time): obj = obj.isoformat()[:10] else: obj = str(obj) elif fieldtype == 'json': if not 'dumps' in self.driver_auto_json: # always pass a string JSON string obj = serializers.json(obj) if PY2: if not isinstance(obj, bytes): obj = bytes(obj) try: obj.decode(self.db_codec) except: obj = obj.decode('latin1').encode(self.db_codec) else: obj = to_unicode(obj) return self.adapt(obj) def represent_exceptions(self, obj, fieldtype): return None def lastrowid(self, table): return self.cursor.lastrowid def rowslice(self, rows, minimum=0, maximum=None): """ By default this function does nothing; overload when db does not do slicing. """ return rows def parse_value(self, value, field_type, blob_decode=True): if field_type != 'blob' and isinstance(value, str): try: value = value.decode(self.db._db_codec) except Exception: pass if PY2 and isinstance(value, unicode): value = value.encode('utf-8') if isinstance(field_type, SQLCustomType): value = field_type.decoder(value) if not isinstance(field_type, str) or value is None: return value elif field_type in ('string', 'text', 'password', 'upload', 'dict'): return value elif field_type.startswith('geo'): return value elif field_type == 'blob' and not blob_decode: return value else: key = REGEX_TYPE.match(field_type).group(0) return self.parsemap[key](value,field_type) def parse_reference(self, value, field_type): referee = field_type[10:].strip() if not '.' in referee: value = Reference(value) value._table, value._record = self.db[referee], None return value def parse_boolean(self, value, field_type): return value == self.TRUE or str(value)[:1].lower() == 't' def parse_date(self, value, field_type): if isinstance(value, datetime.datetime): # Extract the date portion from the datetime return value.date() if not isinstance(value, (datetime.date,datetime.datetime)): (y, m, d) = map(int, str(value)[:10].strip().split('-')) value = datetime.date(y, m, d) return value def parse_time(self, value, field_type): if isinstance(value, datetime.datetime): # Extract the time portion from the datetime return value.time() if not isinstance(value, datetime.time): time_items = list(map(int,str(value)[:8].strip().split(':')[:3])) if len(time_items) == 3: (h, mi, s) = time_items else: (h, mi, s) = time_items + [0] value = datetime.time(h, mi, s) return value def parse_datetime(self, value, field_type): if not isinstance(value, datetime.datetime): value = str(value) date_part,time_part,timezone = value[:10],value[11:19],value[19:] if '+' in timezone: ms,tz = timezone.split('+') h,m = tz.split(':') dt = datetime.timedelta(seconds=3600*int(h)+60*int(m)) elif '-' in timezone: ms,tz = timezone.split('-') h,m = tz.split(':') dt = -datetime.timedelta(seconds=3600*int(h)+60*int(m)) else: dt = None (y, m, d) = map(int,date_part.split('-')) time_parts = time_part and time_part.split(':')[:3] or (0,0,0) while len(time_parts)<3: time_parts.append(0) time_items = map(int,time_parts) (h, mi, s) = time_items value = datetime.datetime(y, m, d, h, mi, s) if dt: value = value + dt return value def parse_blob(self, value, field_type): if PY2: return base64.b64decode(str(value)) else: # TODO # better implement the check, this is for py3.3.x and psycopg2 # (why is not bytes/str) ? if not isinstance(value, (bytes, str)): value = bytes(value) return base64.b64decode(value).decode('utf-8') def parse_decimal(self, value, field_type): decimals = int(field_type[8:-1].split(',')[-1]) if self.dbengine in ('sqlite', 'spatialite'): value = ('%.' + str(decimals) + 'f') % value if not isinstance(value, decimal.Decimal): value = decimal.Decimal(str(value)) return value def parse_list_integers(self, value, field_type): value = bar_decode_integer(value) return value def parse_list_references(self, value, field_type): value = bar_decode_integer(value) return [self.parse_reference(r, field_type[5:]) for r in value] def parse_list_strings(self, value, field_type): value = bar_decode_string(value) return value def parse_id(self, value, field_type): return long(value) def parse_integer(self, value, field_type): return long(value) def parse_double(self, value, field_type): return float(value) def parse_json(self, value, field_type): if not 'loads' in self.driver_auto_json: if not isinstance(value, basestring): raise RuntimeError('json data not a string') if PY2 and isinstance(value, unicode): value = value.encode('utf-8') value = json.loads(value) return value def build_parsemap(self): self.parsemap = { 'id':self.parse_id, 'integer':self.parse_integer, 'bigint':self.parse_integer, 'float':self.parse_double, 'double':self.parse_double, 'reference':self.parse_reference, 'boolean':self.parse_boolean, 'date':self.parse_date, 'time':self.parse_time, 'datetime':self.parse_datetime, 'blob':self.parse_blob, 'decimal':self.parse_decimal, 'json':self.parse_json, 'list:integer':self.parse_list_integers, 'list:reference':self.parse_list_references, 'list:string':self.parse_list_strings, } def _parse(self, row, tmps, fields, colnames, blob_decode, cacheable, fields_virtual, fields_lazy): """ Return a parsed row """ new_row = Row() for (j,colname) in enumerate(colnames): value = row[j] tmp = tmps[j] tablename = None if tmp: (tablename,fieldname,table,field,ft) = tmp colset = new_row.get(tablename, None) if colset is None: colset = new_row[tablename] = Row() value = self.parse_value(value,ft,blob_decode) if field.filter_out: value = field.filter_out(value) colset[fieldname] = value # for backward compatibility if ft=='id' and fieldname!='id' and \ not 'id' in table.fields: colset['id'] = value if ft == 'id' and not cacheable: if self.dbengine == 'google:datastore': id = value.key.id() colset[fieldname] = id colset.gae_item = value else: id = value colset.update_record = RecordUpdater(colset,table,id) colset.delete_record = RecordDeleter(table,id) if table._db._lazy_tables: colset['__get_lazy_reference__'] = LazyReferenceGetter(table, id) for rfield in table._referenced_by: referee_link = self.db._referee_name and \ self.db._referee_name % dict( table=rfield.tablename,field=rfield.name) if (referee_link and not referee_link in colset and referee_link != tablename): colset[referee_link] = LazySet(rfield,id) else: if not '_extra' in new_row: new_row['_extra'] = Row() value = self.parse_value(value, fields[j].type,blob_decode) new_row['_extra'][colname] = value new_column_name = self._regex_select_as_parser(colname) if not new_column_name is None: column_name = new_column_name.groups(0) setattr(new_row,column_name[0],value) for tablename in fields_virtual.keys(): for f, v in fields_virtual[tablename]: try: new_row[tablename][f] = v.f(new_row) except (AttributeError, KeyError): pass # not enough fields to define virtual field for f, v in fields_lazy[tablename]: try: new_row[tablename][f] = (v.handler or VirtualCommand)(v.f, new_row) except (AttributeError, KeyError): pass # not enough fields to define virtual field return new_row def _regex_select_as_parser(self, colname): return REGEX_SELECT_AS_PARSER.search(colname) def _parse_expand_colnames(self, colnames): """ - Expand a list of colnames into a list of (tablename, fieldname, table_obj, field_obj, field_type) - Create a list of table for virtual/lazy fields """ fields_virtual = {} fields_lazy = {} tmps = [] for colname in colnames: col_m = self.REGEX_TABLE_DOT_FIELD.match(colname) if not col_m: tmps.append(None) else: tablename, fieldname = col_m.groups() table = self.db[tablename] field = table[fieldname] ft = field.type tmps.append((tablename, fieldname, table, field, ft)) if tablename not in fields_virtual: fields_virtual[tablename] = [(f,v) for (f,v) in table.iteritems() if isinstance(v,FieldVirtual)] fields_lazy[tablename] = [(f,v) for (f,v) in table.iteritems() if isinstance(v,FieldMethod)] return (fields_virtual, fields_lazy, tmps) def parse(self, rows, fields, colnames, blob_decode=True, cacheable = False): new_rows = [] (fields_virtual, fields_lazy, tmps) = self._parse_expand_colnames(colnames) for row in rows: new_row = self._parse(row, tmps, fields, colnames, blob_decode, cacheable, fields_virtual, fields_lazy) new_rows.append(new_row) rowsobj = Rows(self.db, new_rows, colnames, rawrows=rows) # Old stype virtual fields for tablename in fields_virtual.keys(): table = self.db[tablename] ### old style virtual fields for item in table.virtualfields: try: rowsobj = rowsobj.setvirtualfields(**{tablename:item}) except (KeyError, AttributeError): # to avoid breaking virtualfields when partial select pass return rowsobj def iterparse(self, sql, fields, colnames, blob_decode=True, cacheable=False): """ Iterator to parse one row at a time. It doen't support the old style virtual fields """ return IterRows(self.db, sql, fields, colnames, blob_decode, cacheable) def common_filter(self, query, tablenames): tenant_fieldname = self.db._request_tenant for tablename in tablenames: table = self.db[tablename] # deal with user provided filters if table._common_filter != None: query = query & table._common_filter(query) # deal with multi_tenant filters if tenant_fieldname in table: default = table[tenant_fieldname].default if not default is None: newquery = table[tenant_fieldname] == default if query is None: query = newquery else: query = query & newquery return query def CASE(self,query,t,f): def represent(x): types = {type(True):'boolean',type(0):'integer',type(1.0):'double'} if x is None: return 'NULL' elif isinstance(x,Expression): return str(x) else: return self.represent(x,types.get(type(x),'string')) return Expression(self.db,'CASE WHEN %s THEN %s ELSE %s END' % \ (self.expand(query),represent(t),represent(f))) def sqlsafe_table(self, tablename, ot=None): if ot is not None: return ('%s AS ' + self.QUOTE_TEMPLATE) % (ot, tablename) return self.QUOTE_TEMPLATE % tablename def sqlsafe_field(self, fieldname): return self.QUOTE_TEMPLATE % fieldname def can_join(self): return True class NoSQLAdapter(BaseAdapter): can_select_for_update = False QUOTE_TEMPLATE = '%s' def __init__(self, db, uri, pool_size=0, folder=None, db_codec='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, after_connection=None): super(NoSQLAdapter, self).__init__( db=db, uri=uri, pool_size=pool_size, folder=folder, db_codec=db_codec, credential_decoder=credential_decoder, driver_args=driver_args, adapter_args=adapter_args, do_connect=do_connect, after_connection=after_connection) self.fake_cursor = FakeCursor() def id_query(self, table): return table._id > 0 def execute_test_query(self): ''' NoSql DBs don't have a universal query language. Override this specifc driver if need to test connection status. Throw exception on failure. ''' return None def represent(self, obj, fieldtype): field_is_type = fieldtype.startswith if isinstance(obj, CALLABLETYPES): obj = obj() if isinstance(fieldtype, SQLCustomType): return fieldtype.encoder(obj) is_string = isinstance(fieldtype,str) is_list = is_string and field_is_type('list:') if is_list: if not obj: obj = [] if not isinstance(obj, (list, tuple)): obj = [obj] obj = [item for item in obj if item is not None] if obj == '' and not \ (is_string and fieldtype[:2] in ['st','te', 'pa','up']): return None if not obj is None: if isinstance(obj, list) and not is_list: obj = [self.represent(o, fieldtype) for o in obj] elif fieldtype in ('integer','bigint','id'): obj = long(obj) elif fieldtype == 'double': obj = float(obj) elif is_string and field_is_type('reference'): if isinstance(obj, (Row, Reference)): obj = obj['id'] obj = long(obj) elif fieldtype == 'boolean': if obj and not str(obj)[0].upper() in '0F': obj = True else: obj = False elif fieldtype == 'date': if not isinstance(obj, datetime.date): (y, m, d) = map(int,str(obj).strip().split('-')) obj = datetime.date(y, m, d) elif isinstance(obj,datetime.datetime): (y, m, d) = (obj.year, obj.month, obj.day) obj = datetime.date(y, m, d) elif fieldtype == 'time': if not isinstance(obj, datetime.time): time_items = list(map(int,str(obj).strip().split(':')[:3])) if len(time_items) == 3: (h, mi, s) = time_items else: (h, mi, s) = time_items + [0] obj = datetime.time(h, mi, s) elif fieldtype == 'datetime': if not isinstance(obj, datetime.datetime): (y, m, d) = map(int,str(obj)[:10].strip().split('-')) time_items = list(map(int,str(obj)[11:].strip().split(':')[:3])) while len(time_items)<3: time_items.append(0) (h, mi, s) = time_items obj = datetime.datetime(y, m, d, h, mi, s) elif fieldtype == 'blob': pass elif fieldtype == 'json': if isinstance(obj, basestring): obj = to_unicode(obj) obj = json.loads(obj) elif is_string and field_is_type('list:string'): return list(map(to_unicode,obj)) elif is_list: return list(map(int,obj)) else: obj = to_unicode(obj) return obj def _insert(self,table,fields): return 'insert %s in %s' % (fields, table) def _count(self,query,distinct=None): return 'count %s' % repr(query) def _select(self,query,fields,attributes): return 'select %s where %s' % (repr(fields), repr(query)) def _delete(self,tablename, query): return 'delete %s where %s' % (repr(tablename),repr(query)) def _update(self,tablename,query,fields): return 'update %s (%s) where %s' % (repr(tablename), repr(fields),repr(query)) def commit(self): """ remember: no transactions on many NoSQL """ pass def rollback(self): """ remember: no transactions on many NoSQL """ pass def close_connection(self): """ remember: no transactions on many NoSQL """ pass def parse_list_integers(self, value, field_type): return value def parse_list_references(self, value, field_type): return [self.parse_reference(r, field_type[5:]) for r in value] def parse_list_strings(self, value, field_type): return value # these functions should never be called! def OR(self,first,second): raise SyntaxError("Not supported") def AND(self,first,second): raise SyntaxError("Not supported") def AS(self,first,second): raise SyntaxError("Not supported") def ON(self,first,second): raise SyntaxError("Not supported") def STARTSWITH(self,first,second=None): raise SyntaxError("Not supported") def ENDSWITH(self,first,second=None): raise SyntaxError("Not supported") def ADD(self,first,second): raise SyntaxError("Not supported") def SUB(self,first,second): raise SyntaxError("Not supported") def MUL(self,first,second): raise SyntaxError("Not supported") def DIV(self,first,second): raise SyntaxError("Not supported") def LOWER(self,first): raise SyntaxError("Not supported") def UPPER(self,first): raise SyntaxError("Not supported") def EXTRACT(self,first,what): raise SyntaxError("Not supported") def LENGTH(self, first): raise SyntaxError("Not supported") def AGGREGATE(self,first,what): raise SyntaxError("Not supported") def LEFT_JOIN(self): raise SyntaxError("Not supported") def RANDOM(self): raise SyntaxError("Not supported") def SUBSTRING(self,field,parameters): raise SyntaxError("Not supported") def PRIMARY_KEY(self,key): raise SyntaxError("Not supported") def ILIKE(self,first,second): raise SyntaxError("Not supported") def drop(self,table,mode): raise SyntaxError("Not supported") def migrate_table(self,*a,**b): raise SyntaxError("Not supported") def distributed_transaction_begin(self,key): raise SyntaxError("Not supported") def prepare(self,key): raise SyntaxError("Not supported") def commit_prepared(self,key): raise SyntaxError("Not supported") def rollback_prepared(self,key): raise SyntaxError("Not supported") def concat_add(self,table): raise SyntaxError("Not supported") def constraint_name(self, table, fieldname): raise SyntaxError("Not supported") def create_sequence_and_triggers(self, query, table, **args): pass def log_execute(self,*a,**b): raise SyntaxError("Not supported") def execute(self,*a,**b): raise SyntaxError("Not supported") def represent_exceptions(self, obj, fieldtype): raise SyntaxError("Not supported") def lastrowid(self,table): raise SyntaxError("Not supported") def rowslice(self,rows,minimum=0,maximum=None): raise SyntaxError("Not supported") def can_join(self): return False web2py-2.12.3.orig/gluon/packages/dal/pydal/adapters/couchdb.py0000664000000000000000000001753712564727432023036 0ustar rootroot# -*- coding: utf-8 -*- import datetime from .._globals import IDENTITY from .._compat import integer_types from ..drivers import couchdb from ..objects import Field, Query from ..helpers.classes import SQLALL from ..helpers.methods import uuid2int from ..helpers.serializers import serializers from .base import BaseAdapter, NoSQLAdapter, SELECT_ARGS long = integer_types[-1] class CouchDBAdapter(NoSQLAdapter): drivers = ('couchdb',) uploads_in_blob = True types = { 'boolean': bool, 'string': str, 'text': str, 'json': str, 'password': str, 'blob': str, 'upload': str, 'integer': long, 'bigint': long, 'float': float, 'double': float, 'date': datetime.date, 'time': datetime.time, 'datetime': datetime.datetime, 'id': long, 'reference': long, 'list:string': list, 'list:integer': list, 'list:reference': list, } def file_exists(self, filename): pass def file_open(self, filename, mode='rb', lock=True): pass def file_close(self, fileobj): pass def expand(self,expression,field_type=None): if isinstance(expression,Field): if expression.type=='id': return "%s._id" % expression.tablename return BaseAdapter.expand(self,expression,field_type) def AND(self,first,second): return '(%s && %s)' % (self.expand(first),self.expand(second)) def OR(self,first,second): return '(%s || %s)' % (self.expand(first),self.expand(second)) def EQ(self,first,second): if second is None: return '(%s == null)' % self.expand(first) return '(%s == %s)' % (self.expand(first),self.expand(second,first.type)) def NE(self,first,second): if second is None: return '(%s != null)' % self.expand(first) return '(%s != %s)' % (self.expand(first),self.expand(second,first.type)) def COMMA(self,first,second): return '%s + %s' % (self.expand(first),self.expand(second)) def represent(self, obj, fieldtype): value = NoSQLAdapter.represent(self, obj, fieldtype) if fieldtype == 'id': return repr(str(long(value))) elif fieldtype in ('date', 'time', 'datetime', 'boolean'): return serializers.json(value) return repr(not isinstance(value, unicode) and value or value and value.encode('utf8')) def __init__(self,db,uri='couchdb://127.0.0.1:5984', pool_size=0,folder=None,db_codec ='UTF-8', credential_decoder=IDENTITY, driver_args={}, adapter_args={}, do_connect=True, after_connection=None): super(CouchDBAdapter, self).__init__( db=db, uri=uri, pool_size=pool_size, folder=folder, db_codec=db_codec, credential_decoder=credential_decoder, driver_args=driver_args, adapter_args=adapter_args, do_connect=do_connect, after_connection=after_connection) if do_connect: self.find_driver(adapter_args) self.dbengine = 'couchdb' db['_lastsql'] = '' self.db_codec = 'UTF-8' url='http://'+uri[10:] def connector(url=url,driver_args=driver_args): driver = self.driver.Server(url,**driver_args) driver.cursor = lambda : self.fake_cursor driver.close = lambda : None driver.commit = lambda : None return driver self.reconnect(connector) def create_table(self, table, migrate=True, fake_migrate=False, polymodel=None): if migrate: try: self.connection.create(table._tablename) except: pass def insert(self,table,fields): id = uuid2int(self.db.uuid()) ctable = self.connection[table._tablename] values = dict((k.name,self.represent(v,k.type)) for k,v in fields) values['_id'] = str(id) ctable.save(values) return id def _select(self,query,fields,attributes): if not isinstance(query,Query): raise SyntaxError("Not Supported") for key in set(attributes.keys())-SELECT_ARGS: raise SyntaxError('invalid select attribute: %s' % key) new_fields=[] for item in fields: if isinstance(item,SQLALL): new_fields += item._table else: new_fields.append(item) def uid(fd): return fd=='id' and '_id' or fd def get(row,fd): return fd=='id' and long(row['_id']) or row.get(fd,None) fields = new_fields tablename = self.get_table(query) fieldnames = [f.name for f in (fields or self.db[tablename])] colnames = ['%s.%s' % (tablename,k) for k in fieldnames] fields = ','.join(['%s.%s' % (tablename,uid(f)) for f in fieldnames]) fn="(function(%(t)s){if(%(query)s)emit(%(order)s,[%(fields)s]);})" %\ dict(t=tablename, query=self.expand(query), order='%s._id' % tablename, fields=fields) return fn, colnames def select(self,query,fields,attributes): if not isinstance(query,Query): raise SyntaxError("Not Supported") fn, colnames = self._select(query,fields,attributes) tablename = colnames[0].split('.')[0] ctable = self.connection[tablename] rows = [cols['value'] for cols in ctable.query(fn)] processor = attributes.get('processor',self.parse) return processor(rows,fields,colnames,False) def delete(self,tablename,query): if not isinstance(query,Query): raise SyntaxError("Not Supported") if query.first.type=='id' and query.op==self.EQ: id = query.second tablename = query.first.tablename assert(tablename == query.first.tablename) ctable = self.connection[tablename] try: del ctable[str(id)] return 1 except couchdb.http.ResourceNotFound: return 0 else: tablename = self.get_table(query) rows = self.select(query,[self.db[tablename]._id],{}) ctable = self.connection[tablename] for row in rows: del ctable[str(row.id)] return len(rows) def update(self,tablename,query,fields): if not isinstance(query,Query): raise SyntaxError("Not Supported") if query.first.type=='id' and query.op==self.EQ: id = query.second tablename = query.first.tablename ctable = self.connection[tablename] try: doc = ctable[str(id)] for key,value in fields: doc[key.name] = self.represent(value,self.db[tablename][key.name].type) ctable.save(doc) return 1 except couchdb.http.ResourceNotFound: return 0 else: tablename = self.get_table(query) rows = self.select(query,[self.db[tablename]._id],{}) ctable = self.connection[tablename] table = self.db[tablename] for row in rows: doc = ctable[str(row.id)] for key,value in fields: doc[key.name] = self.represent(value,table[key.name].type) ctable.save(doc) return len(rows) def count(self,query,distinct=None): if distinct: raise RuntimeError("COUNT DISTINCT not supported") if not isinstance(query,Query): raise SyntaxError("Not Supported") tablename = self.get_table(query) rows = self.select(query,[self.db[tablename]._id],{}) return len(rows) web2py-2.12.3.orig/gluon/packages/dal/pydal/_globals.py0000664000000000000000000000027112564727432021371 0ustar rootrootimport threading GLOBAL_LOCKER = threading.RLock() THREAD_LOCAL = threading.local() DEFAULT = lambda: None def IDENTITY(x): return x def OR(a,b): return a|b def AND(a,b): return a&b web2py-2.12.3.orig/gluon/packages/dal/pydal/connection.py0000664000000000000000000001102612564727432021746 0ustar rootroot# -*- coding: utf-8 -*- import os from ._compat import exists from ._globals import GLOBAL_LOCKER, THREAD_LOCAL from .helpers.classes import UseDatabaseStoredFile class ConnectionPool(object): POOLS = {} check_active_connection = True @staticmethod def set_folder(folder): THREAD_LOCAL.folder = folder def close(self, action='commit', really=True): #: if we have an action (commit, rollback), try to execute it succeeded = True if action: try: if callable(action): action(self) else: getattr(self, action)() except: #: connection had some problems, we want to drop it succeeded = False #: if we have pools, we should recycle the connection (but only when # we succeded in `action`, if any and `len(pool)` is good) if self.pool_size and succeeded: GLOBAL_LOCKER.acquire() pool = ConnectionPool.POOLS[self.uri] if len(pool) < self.pool_size: pool.append(self.connection) really = False GLOBAL_LOCKER.release() #: closing the connection when we `really` want to, in particular: # - when we had an exception running `action` # - when we don't have pools # - when we have pools but they're full if really: try: self.close_connection() except: pass #: always unset `connection` attribute self.connection = None @staticmethod def close_all_instances(action): """ to close cleanly databases in a multithreaded environment """ dbs = getattr(THREAD_LOCAL, 'db_instances', {}).items() for db_uid, db_group in dbs: for db in db_group: if hasattr(db, '_adapter'): db._adapter.close(action) getattr(THREAD_LOCAL, 'db_instances', {}).clear() getattr(THREAD_LOCAL, 'db_instances_zombie', {}).clear() if callable(action): action(None) return def find_or_make_work_folder(self): #this actually does not make the folder. it has to be there self.folder = getattr(THREAD_LOCAL, 'folder', '') if os.path.isabs(self.folder) and \ isinstance(self, UseDatabaseStoredFile) and \ self.folder.startswith(os.getcwd()): self.folder = os.path.relpath(self.folder, os.getcwd()) # Creating the folder if it does not exist if False and self.folder and not exists(self.folder): os.mkdir(self.folder) def after_connection_hook(self): """Hook for the after_connection parameter""" if callable(self._after_connection): self._after_connection(self) self.after_connection() def after_connection(self): #this it is supposed to be overloaded by adapters pass def reconnect(self, f=None): """ Defines: `self.connection` and `self.cursor` if `self.pool_size>0` it will try pull the connection from the pool if the connection is not active (closed by db server) it will loop if not `self.pool_size` or no active connections in pool makes a new one """ if getattr(self, 'connection', None) is not None: return if f is None: f = self.connector # if not hasattr(self, "driver") or self.driver is None: # LOGGER.debug("Skipping connection since there's no driver") # return if not self.pool_size: self.connection = f() self.cursor = self.connection.cursor() else: uri = self.uri POOLS = ConnectionPool.POOLS while True: GLOBAL_LOCKER.acquire() if uri not in POOLS: POOLS[uri] = [] if POOLS[uri]: self.connection = POOLS[uri].pop() GLOBAL_LOCKER.release() self.cursor = self.connection.cursor() try: if self.check_active_connection: self.execute_test_query() break except: pass else: GLOBAL_LOCKER.release() self.connection = f() self.cursor = self.connection.cursor() break self.after_connection_hook() web2py-2.12.3.orig/gluon/packages/dal/pydal/_load.py0000664000000000000000000000061112564727432020663 0ustar rootroot# -*- coding: utf-8 -*- # load modules with contrib fallback try: from collections import OrderedDict except: from .contrib.ordereddict import OrderedDict from .contrib import portalocker # TODO: uncomment the lines below when contrib/portalocker will be # inline with the one shipped with pip #try: # import portalocker #except ImportError: # from .contrib import portalocker web2py-2.12.3.orig/gluon/packages/dal/pydal/helpers/0000775000000000000000000000000012564727434020701 5ustar rootrootweb2py-2.12.3.orig/gluon/packages/dal/pydal/helpers/classes.py0000664000000000000000000003132712564727434022716 0ustar rootroot# -*- coding: utf-8 -*- import copy import marshal import struct import traceback from .._compat import PY2, exists, copyreg, integer_types, implements_bool, \ iterkeys, itervalues, iteritems from .serializers import serializers long = integer_types[-1] @implements_bool class BasicStorage(object): def __init__(self, *args, **kwargs): return self.__dict__.__init__(*args, **kwargs) def __contains__(self, item): return self.__dict__.__contains__(item) def __getitem__(self, key): return self.__dict__.__getitem__(str(key)) def __getattr__(self, key): try: return self.__dict__.__getitem__(str(key)) except: raise AttributeError __setitem__ = object.__setattr__ def __delitem__(self, key): self.__dict__.__delitem__(key) def __bool__(self): return len(self.__dict__) > 0 __iter__ = lambda self: self.__dict__.__iter__() __str__ = lambda self: self.__dict__.__str__() __repr__ = lambda self: self.__dict__.__repr__() has_key = __contains__ def get(self, key, default=None): return self.__dict__.get(key, default) def update(self, *args, **kwargs): return self.__dict__.update(*args, **kwargs) def keys(self): return self.__dict__.keys() def iterkeys(self): return iterkeys(self.__dict__) def values(self): return self.__dict__.values() def itervalues(self): return itervalues(self.__dict__) def items(self): return self.__dict__.items() def iteritems(self): return iteritems(self.__dict__) pop = lambda self, *args, **kwargs: self.__dict__.pop(*args, **kwargs) clear = lambda self, *args, **kwargs: self.__dict__.clear(*args, **kwargs) copy = lambda self, *args, **kwargs: self.__dict__.copy(*args, **kwargs) def pickle_basicstorage(s): return BasicStorage, (dict(s),) copyreg.pickle(BasicStorage, pickle_basicstorage) class Serializable(object): def as_dict(self, flat=False, sanitize=True): return self.__dict__ def as_xml(self, sanitize=True): return serializers.xml(self.as_dict(flat=True, sanitize=sanitize)) def as_json(self, sanitize=True): return serializers.json(self.as_dict(flat=True, sanitize=sanitize)) def as_yaml(self, sanitize=True): return serializers.yaml(self.as_dict(flat=True, sanitize=sanitize)) class Reference(long): def __allocate(self): if not self._record: self._record = self._table[long(self)] if not self._record: raise RuntimeError( "Using a recursive select but encountered a broken " + "reference: %s %d" % (self._table, long(self)) ) def __getattr__(self, key): if key == 'id': return long(self) if key in self._table: self.__allocate() if self._record: # to deal with case self.update_record() return self._record.get(key, None) else: return None def get(self, key, default=None): return self.__getattr__(key, default) def __setattr__(self, key, value): if key.startswith('_'): long.__setattr__(self, key, value) return self.__allocate() self._record[key] = value def __getitem__(self, key): if key == 'id': return long(self) self.__allocate() return self._record.get(key, None) def __setitem__(self, key, value): self.__allocate() self._record[key] = value def Reference_unpickler(data): return marshal.loads(data) def Reference_pickler(data): try: marshal_dump = marshal.dumps(long(data)) except AttributeError: marshal_dump = 'i%s' % struct.pack(' 0: data, self.p = self.data[self.p:i], i else: data, self.p = self.data[self.p:], len(self.data) return data def write(self, data): self.data += data def close_connection(self): if self.db is not None: self.db.executesql( "DELETE FROM web2py_filesystem WHERE path='%s'" % self.filename ) query = "INSERT INTO web2py_filesystem(path,content) VALUES ('%s','%s')"\ % (self.filename, self.data.replace("'", "''")) self.db.executesql(query) self.db.commit() self.db = None def close(self): self.close_connection() @staticmethod def exists(db, filename): if exists(filename): return True DatabaseStoredFile.try_create_web2py_filesystem(db) query = "SELECT path FROM web2py_filesystem WHERE path='%s'" % filename try: if db.executesql(query): return True except Exception as e: if not (db._adapter.isOperationalError(e) or db._adapter.isProgrammingError(e)): raise # no web2py_filesystem found? tb = traceback.format_exc() db.logger.error("Could not retrieve %s\n%s" % (filename, tb)) return False class UseDatabaseStoredFile: def file_exists(self, filename): return DatabaseStoredFile.exists(self.db, filename) def file_open(self, filename, mode='rb', lock=True): return DatabaseStoredFile(self.db, filename, mode) def file_close(self, fileobj): fileobj.close_connection() def file_delete(self, filename): query = "DELETE FROM web2py_filesystem WHERE path='%s'" % filename self.db.executesql(query) self.db.commit() web2py-2.12.3.orig/gluon/packages/dal/pydal/helpers/__init__.py0000664000000000000000000000000012564727434023000 0ustar rootrootweb2py-2.12.3.orig/gluon/packages/dal/pydal/helpers/methods.py0000664000000000000000000002546712564727434022734 0ustar rootroot# -*- coding: utf-8 -*- import uuid import re from .._compat import iteritems, integer_types from .regex import REGEX_NOPASSWD, REGEX_UNPACK, REGEX_CONST_STRING, REGEX_W from .classes import SQLCustomType # from ..objects import Field, Table PLURALIZE_RULES = [ (re.compile('child$'), re.compile('child$'), 'children'), (re.compile('oot$'), re.compile('oot$'), 'eet'), (re.compile('ooth$'), re.compile('ooth$'), 'eeth'), (re.compile('l[eo]af$'), re.compile('l([eo])af$'), 'l\\1aves'), (re.compile('sis$'), re.compile('sis$'), 'ses'), (re.compile('man$'), re.compile('man$'), 'men'), (re.compile('ife$'), re.compile('ife$'), 'ives'), (re.compile('eau$'), re.compile('eau$'), 'eaux'), (re.compile('lf$'), re.compile('lf$'), 'lves'), (re.compile('[sxz]$'), re.compile('$'), 'es'), (re.compile('[^aeioudgkprt]h$'), re.compile('$'), 'es'), (re.compile('(qu|[^aeiou])y$'), re.compile('y$'), 'ies'), (re.compile('$'), re.compile('$'), 's'), ] def pluralize(singular, rules=PLURALIZE_RULES): for line in rules: re_search, re_sub, replace = line plural = re_search.search(singular) and re_sub.sub(replace, singular) if plural: return plural def hide_password(uri): if isinstance(uri, (list, tuple)): return [hide_password(item) for item in uri] return REGEX_NOPASSWD.sub('******', uri) def cleanup(text): """ Validates that the given text is clean: only contains [0-9a-zA-Z_] """ # if not REGEX_ALPHANUMERIC.match(text): # raise SyntaxError('invalid table or field name: %s' % text) return text def list_represent(values, row=None): return ', '.join(str(v) for v in (values or [])) def xorify(orderby): if not orderby: return None orderby2 = orderby[0] for item in orderby[1:]: orderby2 = orderby2 | item return orderby2 def use_common_filters(query): return (query and hasattr(query, 'ignore_common_filters') and \ not query.ignore_common_filters) def bar_escape(item): return str(item).replace('|', '||') def bar_encode(items): return '|%s|' % '|'.join(bar_escape(item) for item in items if str(item).strip()) def bar_decode_integer(value): long = integer_types[-1] if not hasattr(value, 'split') and hasattr(value, 'read'): value = value.read() return [long(x) for x in value.split('|') if x.strip()] def bar_decode_string(value): return [x.replace('||', '|') for x in REGEX_UNPACK.split(value[1:-1]) if x.strip()] def archive_record(qset, fs, archive_table, current_record): tablenames = qset.db._adapter.tables(qset.query) if len(tablenames) != 1: raise RuntimeError("cannot update join") for row in qset.select(): fields = archive_table._filter_fields(row) for k, v in iteritems(fs): if fields[k] != v: fields[current_record] = row.id archive_table.insert(**fields) break return False def smart_query(fields, text): from ..objects import Field, Table if not isinstance(fields, (list, tuple)): fields = [fields] new_fields = [] for field in fields: if isinstance(field, Field): new_fields.append(field) elif isinstance(field, Table): for ofield in field: new_fields.append(ofield) else: raise RuntimeError("fields must be a list of fields") fields = new_fields field_map = {} for field in fields: n = field.name.lower() if not n in field_map: field_map[n] = field n = str(field).lower() if not n in field_map: field_map[n] = field constants = {} i = 0 while True: m = REGEX_CONST_STRING.search(text) if not m: break text = text[:m.start()]+('#%i' % i)+text[m.end():] constants[str(i)] = m.group()[1:-1] i += 1 text = re.sub('\s+', ' ', text).lower() for a, b in [('&', 'and'), ('|', 'or'), ('~', 'not'), ('==', '='), ('<', '<'), ('>', '>'), ('<=', '<='), ('>=', '>='), ('<>', '!='), ('=<', '<='), ('=>', '>='), ('=', '='), (' less or equal than ', '<='), (' greater or equal than ', '>='), (' equal or less than ', '<='), (' equal or greater than ', '>='), (' less or equal ', '<='), (' greater or equal ', '>='), (' equal or less ', '<='), (' equal or greater ', '>='), (' not equal to ', '!='), (' not equal ', '!='), (' equal to ', '='), (' equal ', '='), (' equals ', '='), (' less than ', '<'), (' greater than ', '>'), (' starts with ', 'startswith'), (' ends with ', 'endswith'), (' not in ', 'notbelongs'), (' in ', 'belongs'), (' is ', '=')]: if a[0] == ' ': text = text.replace(' is'+a, ' %s ' % b) text = text.replace(a, ' %s ' % b) text = re.sub('\s+', ' ', text).lower() text = re.sub('(?P[\<\>\!\=])\s+(?P[\<\>\!\=])', '\g\g', text) query = field = neg = op = logic = None for item in text.split(): if field is None: if item == 'not': neg = True elif not neg and not logic and item in ('and', 'or'): logic = item elif item in field_map: field = field_map[item] else: raise RuntimeError("Invalid syntax") elif not field is None and op is None: op = item elif not op is None: if item.startswith('#'): if not item[1:] in constants: raise RuntimeError("Invalid syntax") value = constants[item[1:]] else: value = item if field.type in ('text', 'string', 'json'): if op == '=': op = 'like' if op == '=': new_query = field == value elif op == '<': new_query = field < value elif op == '>': new_query = field > value elif op == '<=': new_query = field <= value elif op == '>=': new_query = field >= value elif op == '!=': new_query = field != value elif op == 'belongs': new_query = field.belongs(value.split(',')) elif op == 'notbelongs': new_query = ~field.belongs(value.split(',')) elif field.type == 'list:string': if op == 'contains': new_query = field.contains(value) else: raise RuntimeError("Invalid operation") elif field.type in ('text', 'string', 'json'): if op == 'contains': new_query = field.contains(value) elif op == 'like': new_query = field.ilike(value) elif op == 'startswith': new_query = field.startswith(value) elif op == 'endswith': new_query = field.endswith(value) else: raise RuntimeError("Invalid operation") elif field._db._adapter.dbengine=='google:datastore' and \ field.type in ('list:integer', 'list:string', 'list:reference'): if op == 'contains': new_query = field.contains(value) else: raise RuntimeError("Invalid operation") else: raise RuntimeError("Invalid operation") if neg: new_query = ~new_query if query is None: query = new_query elif logic == 'and': query &= new_query elif logic == 'or': query |= new_query field = op = neg = logic = None return query def auto_validators(field): db = field.db field_type = field.type #: don't apply default validation on custom types if isinstance(field_type, SQLCustomType): if hasattr(field_type, 'validator'): return field_type.validator else: field_type = field_type.type elif not isinstance(field_type, str): return [] #: if a custom method is provided, call it if callable(db.validators_method): return db.validators_method(field) #: apply validators from validators dict if present if not db.validators or not isinstance(db.validators, dict): return [] field_validators = db.validators.get(field_type, []) if not isinstance(field_validators, (list, tuple)): field_validators = [field_validators] return field_validators def _fieldformat(r, id): row = r(id) if not row: return str(id) elif hasattr(r, '_format') and isinstance(r._format, str): return r._format % row elif hasattr(r, '_format') and callable(r._format): return r._format(row) else: return str(id) class _repr_ref(object): def __init__(self, ref=None): self.ref = ref def __call__(self, value, row=None): return value if value is None else _fieldformat(self.ref, value) class _repr_ref_list(_repr_ref): def __call__(self, value, row=None): if not value: return None refs = None db, id = self.ref._db, self.ref._id if db._adapter.dbengine == 'google:datastore': def count(values): return db(id.belongs(values)).select(id) rx = range(0, len(value), 30) refs = reduce(lambda a, b: a & b, [count(value[i:i+30]) for i in rx]) else: refs = db(id.belongs(value)).select(id) return refs and ', '.join( _fieldformat(self.ref, x.id) for x in value) or '' def auto_represent(field): if field.represent: return field.represent if field.db and field.type.startswith('reference') and \ field.type.find('.') < 0 and field.type[10:] in field.db.tables: referenced = field.db[field.type[10:]] return _repr_ref(referenced) elif field.db and field.type.startswith('list:reference') and \ field.type.find('.') < 0 and field.type[15:] in field.db.tables: referenced = field.db[field.type[15:]] return _repr_ref_list(referenced) return field.represent def varquote_aux(name, quotestr='%s'): return name if REGEX_W.match(name) else quotestr % name def uuid2int(uuidv): return uuid.UUID(uuidv).int def int2uuid(n): return str(uuid.UUID(int=n)) # Geodal utils def geoPoint(x, y): return "POINT (%f %f)" % (x, y) def geoLine(*line): return "LINESTRING (%s)" % ','.join("%f %f" % item for item in line) def geoPolygon(*line): return "POLYGON ((%s))" % ','.join("%f %f" % item for item in line) web2py-2.12.3.orig/gluon/packages/dal/pydal/helpers/serializers.py0000664000000000000000000000353612564727434023616 0ustar rootrootimport datetime import decimal import json as jsonlib from .._compat import PY2, integer_types long = integer_types[-1] class Serializers(object): _custom_ = {} def _json_parse(self, o): if hasattr(o, 'custom_json') and callable(o.custom_json): return o.custom_json() if isinstance(o, (datetime.date, datetime.datetime, datetime.time)): return o.isoformat()[:19].replace('T', ' ') elif isinstance(o, long): return int(o) elif isinstance(o, decimal.Decimal): return str(o) elif isinstance(o, set): return list(o) elif hasattr(o, 'as_list') and callable(o.as_list): return o.as_list() elif hasattr(o, 'as_dict') and callable(o.as_dict): return o.as_dict() if self._custom_.get('json') is not None: return self._custom_['json'](o) raise TypeError(repr(o) + " is not JSON serializable") def __getattr__(self, name): if self._custom_.get(name) is not None: return self._custom_[name] raise NotImplementedError("No "+str(name)+" serializer available.") def json(self, value): value = jsonlib.dumps(value, default=self._json_parse) rep28 = r'\u2028' rep29 = r'\2029' if PY2: rep28 = rep28.decode('raw_unicode_escape') rep29 = rep29.decode('raw_unicode_escape') return value.replace(rep28, '\\u2028').replace(rep29, '\\u2029') def yaml(self, value): if self._custom_.get('yaml') is not None: return self._custom_.get('yaml')(value) try: from yaml import dump except ImportError: raise NotImplementedError("No yaml serializer available.") return dump(value) serializers = Serializers() web2py-2.12.3.orig/gluon/packages/dal/pydal/helpers/regex.py0000664000000000000000000000246312564727434022372 0ustar rootroot# -*- coding: utf-8 -*- import re REGEX_TYPE = re.compile('^([\w\_\:]+)') REGEX_DBNAME = re.compile('^(\w+)(\:\w+)*') REGEX_W = re.compile('^\w+$') REGEX_TABLE_DOT_FIELD = re.compile('^(\w+)\.([^.]+)$') REGEX_NO_GREEDY_ENTITY_NAME = r'(.+?)' REGEX_UPLOAD_PATTERN = re.compile('(?P
[\w\-]+)\.(?P[\w\-]+)\.(?P[\w\-]+)(\.(?P\w+))?\.\w+$') REGEX_CLEANUP_FN = re.compile('[\'"\s;]+') REGEX_UNPACK = re.compile('(?\w{1,5})$') REGEX_QUOTES = re.compile("'[^']*'") REGEX_ALPHANUMERIC = re.compile('^[0-9a-zA-Z]\w*$') REGEX_PASSWORD = re.compile('\://([^:@]*)\:') REGEX_NOPASSWD = re.compile('\/\/[\w\.\-]+[\:\/](.+)(?=@)') # was '(?<=[\:\/])([^:@/]+)(?=@.+)' REGEX_VALID_TB_FLD = re.compile(r'^[^\d_][_0-9a-zA-Z]*\Z') web2py-2.12.3.orig/gluon/packages/dal/pydal/helpers/gae.py0000664000000000000000000000174012564727434022011 0ustar rootrootimport decimal from .._gae import ndb #TODO Needs more testing class NDBDecimalProperty(ndb.StringProperty): """ NDB decimal implementation """ data_type = decimal.Decimal def __init__(self, precision, scale, **kwargs): d = '1.' for x in range(scale): d += '0' self.round = decimal.Decimal(d) def _to_base_type(self, value): if value is None or value == '': return None else: return str(value) def _from_base_type(self, value): if value is None or value == '': return None else: return decimal.Decimal(value).quantize(self.round) def _validate(self, value): if value is None or isinstance(value, decimal.Decimal): return value elif isinstance(value, basestring): return decimal.Decimal(value) raise TypeError("Property %s must be a Decimal or string." % self._name) web2py-2.12.3.orig/gluon/packages/dal/pydal/drivers.py0000664000000000000000000000702212564727434021270 0ustar rootroot# -*- coding: utf-8 -*- from ._gae import gae DRIVERS = {} if gae is not None: DRIVERS['google'] = gae psycopg2_adapt = None cx_Oracle = None pyodbc = None couchdb = None is_jdbc = False else: try: from pysqlite2 import dbapi2 as sqlite2 DRIVERS['sqlite2'] = sqlite2 except ImportError: pass try: from sqlite3 import dbapi2 as sqlite3 DRIVERS['sqlite3'] = sqlite3 except ImportError: pass try: import pymysql DRIVERS['pymysql'] = pymysql except ImportError: pass try: import MySQLdb DRIVERS['MySQLdb'] = MySQLdb except ImportError: pass try: import mysql.connector as mysqlconnector DRIVERS["mysqlconnector"] = mysqlconnector except ImportError: pass try: import psycopg2 from psycopg2.extensions import adapt as psycopg2_adapt DRIVERS['psycopg2'] = psycopg2 except ImportError: psycopg2_adapt = None try: import pg8000 DRIVERS['pg8000'] = pg8000 except ImportError: pass try: import cx_Oracle DRIVERS['cx_Oracle'] = cx_Oracle except ImportError: cx_Oracle = None try: import pyodbc DRIVERS['pyodbc'] = pyodbc #DRIVERS.append('DB2(pyodbc)') #DRIVERS.append('Teradata(pyodbc)') #DRIVERS.append('Ingres(pyodbc)') except ImportError: try: import pypyodbc as pyodbc DRIVERS['pyodbc'] = pyodbc except ImportError: pyodbc = None try: import ibm_db_dbi DRIVERS['ibm_db_dbi'] = ibm_db_dbi except ImportError: pass try: import Sybase DRIVERS['Sybase'] = Sybase except ImportError: pass try: import kinterbasdb DRIVERS['kinterbasdb'] = kinterbasdb #DRIVERS.append('Firebird(kinterbasdb)') except ImportError: pass try: import fdb DRIVERS['fdb'] = fdb except ImportError: pass try: import firebirdsql DRIVERS['firebirdsql'] = firebirdsql except ImportError: pass try: import informixdb #LOGGER.warning('Informix support is experimental') DRIVERS['informixdb'] = informixdb except ImportError: pass try: import sapdb DRIVERS['sapdb'] = sapdb #LOGGER.warning('SAPDB support is experimental') except ImportError: pass try: import cubriddb DRIVERS['cubriddb'] = cubriddb #LOGGER.warning('Cubrid support is experimental') except ImportError: pass try: from com.ziclix.python.sql import zxJDBC import java.sql # Try sqlite jdbc driver from http://www.zentus.com/sqlitejdbc/ from org.sqlite import JDBC # required by java.sql; ensure we have it zxJDBC_sqlite = java.sql.DriverManager DRIVERS['zxJDBC'] = zxJDBC #DRIVERS.append('SQLite(zxJDBC)') #LOGGER.warning('zxJDBC support is experimental') is_jdbc = True except ImportError: is_jdbc = False try: import couchdb DRIVERS['couchdb'] = couchdb except ImportError: couchdb = None try: import pymongo DRIVERS['pymongo'] = pymongo except: pass try: import imaplib DRIVERS['imaplib'] = imaplib except: pass # for backward compatibility? def get_driver(name): return DRIVERS.get(name) web2py-2.12.3.orig/gluon/packages/dal/pydal/exceptions.py0000664000000000000000000000017312564727434021773 0ustar rootroot# -*- coding: utf-8 -*- class NotFoundException(Exception): pass class NotAuthorizedException(Exception): pass web2py-2.12.3.orig/gluon/packages/dal/pydal/objects.py0000664000000000000000000030743212564727434021253 0ustar rootroot# -*- coding: utf-8 -*- import base64 import cgi import copy import csv import datetime import decimal import os import shutil import sys import types from ._compat import PY2, StringIO, pjoin, exists, hashlib_md5, \ integer_types, basestring, iteritems, xrange, implements_iterator, \ implements_bool, copyreg, reduce from ._globals import DEFAULT, IDENTITY, AND, OR from ._gae import Key from .exceptions import NotFoundException, NotAuthorizedException from .helpers.regex import REGEX_TABLE_DOT_FIELD, REGEX_ALPHANUMERIC, \ REGEX_PYTHON_KEYWORDS, REGEX_STORE_PATTERN, REGEX_UPLOAD_PATTERN, \ REGEX_CLEANUP_FN, REGEX_VALID_TB_FLD from .helpers.classes import Reference, MethodAdder, SQLCallableList, SQLALL, \ Serializable, BasicStorage from .helpers.methods import list_represent, bar_decode_integer, \ bar_decode_string, bar_encode, archive_record, cleanup, \ use_common_filters, pluralize from .helpers.serializers import serializers long = integer_types[-1] DEFAULTLENGTH = {'string': 512, 'password': 512, 'upload': 512, 'text': 2**15, 'blob': 2**31} class Row(BasicStorage): """ A dictionary that lets you do d['a'] as well as d.a this is only used to store a `Row` """ def __getitem__(self, k): key = str(k) _extra = super(Row, self).get('_extra', None) if _extra is not None: v = _extra.get(key, DEFAULT) if v != DEFAULT: return v try: return super(Row, self).__getitem__(k) except KeyError: pass m = REGEX_TABLE_DOT_FIELD.match(key) if m: try: e = super(Row, self).__getitem__(m.group(1)) return e[m.group(2)] except (KeyError, TypeError): pass key = m.group(2) try: return super(Row, self).__getitem__(key) except KeyError: pass try: e = super(Row, self).get('__get_lazy_reference__') if e is not None and callable(e): self[key] = e(key) return self[key] except Exception as e: raise e raise KeyError __str__ = __repr__ = lambda self: '' % self.as_dict(custom_types=[LazySet]) __int__ = lambda self: self.get('id') __long__ = lambda self: long(self.get('id')) __call__ = __getitem__ def __getattr__(self, k): try: return self.__getitem__(k) except KeyError: raise AttributeError def __copy__(self): return Row(self) def __eq__(self, other): try: return self.as_dict() == other.as_dict() except AttributeError: return False def get(self, key, default=None): try: return self.__getitem__(key) except(KeyError, AttributeError, TypeError): return default def as_dict(self, datetime_to_str=False, custom_types=None): SERIALIZABLE_TYPES = [str, int, float, bool, list, dict] if PY2: SERIALIZABLE_TYPES += [unicode, long] if isinstance(custom_types,(list,tuple,set)): SERIALIZABLE_TYPES += custom_types elif custom_types: SERIALIZABLE_TYPES.append(custom_types) d = dict(self) for k in list(d.keys()): v=d[k] if d[k] is None: continue elif isinstance(v,Row): d[k]=v.as_dict() elif isinstance(v,Reference): d[k]=long(v) elif isinstance(v,decimal.Decimal): d[k]=float(v) elif isinstance(v, (datetime.date, datetime.datetime, datetime.time)): if datetime_to_str: d[k] = v.isoformat().replace('T',' ')[:19] elif not isinstance(v,tuple(SERIALIZABLE_TYPES)): del d[k] return d def as_xml(self, row_name="row", colnames=None, indent=' '): def f(row,field,indent=' '): if isinstance(row,Row): spc = indent+' \n' items = [f(row[x],x,indent+' ') for x in row] return '%s<%s>\n%s\n%s' % ( indent, field, spc.join(item for item in items if item), indent, field) elif not callable(row): if REGEX_ALPHANUMERIC.match(field): return '%s<%s>%s' % (indent,field,row,field) else: return '%s%s' % \ (indent,field,row) else: return None return f(self, row_name, indent=indent) def as_json(self, mode="object", default=None, colnames=None, serialize=True, **kwargs): """ serializes the row to a JSON object kwargs are passed to .as_dict method only "object" mode supported `serialize = False` used by Rows.as_json TODO: return array mode with query column order mode and colnames are not implemented """ item = self.as_dict(**kwargs) if serialize: return serializers.json(item) else: return item def pickle_row(s): return Row, (dict(s),) copyreg.pickle(Row, pickle_row) class Table(Serializable, BasicStorage): """ Represents a database table Example:: You can create a table as:: db = DAL(...) db.define_table('users', Field('name')) And then:: db.users.insert(name='me') # print db.users._insert(...) to see SQL db.users.drop() """ def __init__( self, db, tablename, *fields, **args): """ Initializes the table and performs checking on the provided fields. Each table will have automatically an 'id'. If a field is of type Table, the fields (excluding 'id') from that table will be used instead. Raises: SyntaxError: when a supplied field is of incorrect type. """ # import DAL here to avoid circular imports from .base import DAL super(Table, self).__init__() self._actual = False # set to True by define_table() self._db = db self._tablename = tablename if (not isinstance(tablename, str) or hasattr(DAL, tablename) or not REGEX_VALID_TB_FLD.match(tablename) or REGEX_PYTHON_KEYWORDS.match(tablename) ): raise SyntaxError('Field: invalid table name: %s, ' 'use rname for "funny" names' % tablename) self._ot = None self._rname = args.get('rname') self._sequence_name = (args.get('sequence_name') or db and db._adapter.sequence_name(self._rname or tablename)) self._trigger_name = (args.get('trigger_name') or db and db._adapter.trigger_name(tablename)) self._common_filter = args.get('common_filter') self._format = args.get('format') self._singular = args.get( 'singular', tablename.replace('_', ' ').capitalize()) self._plural = args.get( 'plural', pluralize(self._singular.lower()).capitalize()) # horrible but for backard compatibility of appamdin: if 'primarykey' in args and args['primarykey'] is not None: self._primarykey = args.get('primarykey') self._before_insert = [] self._before_update = [Set.delete_uploaded_files] self._before_delete = [Set.delete_uploaded_files] self._after_insert = [] self._after_update = [] self._after_delete = [] self.add_method = MethodAdder(self) fieldnames, newfields=set(), [] _primarykey = getattr(self, '_primarykey', None) if _primarykey is not None: if not isinstance(_primarykey, list): raise SyntaxError( "primarykey must be a list of fields from table '%s'" % tablename) if len(_primarykey) == 1: self._id = [f for f in fields if isinstance(f, Field) and f.name ==_primarykey[0]][0] elif not [f for f in fields if (isinstance(f, Field) and f.type == 'id') or (isinstance(f, dict) and f.get("type", None) == "id")]: field = Field('id', 'id') newfields.append(field) fieldnames.add('id') self._id = field virtual_fields = [] def include_new(field): newfields.append(field) fieldnames.add(field.name) if field.type == 'id': self._id = field for field in fields: if isinstance(field, (FieldMethod, FieldVirtual)): virtual_fields.append(field) elif isinstance(field, Field) and not field.name in fieldnames: if field.db is not None: field = copy.copy(field) include_new(field) elif isinstance(field, Table): table = field for field in table: if not field.name in fieldnames and not field.type == 'id': t2 = not table._actual and self._tablename include_new(field.clone(point_self_references_to=t2)) elif isinstance(field, dict) and not field['fieldname'] in fieldnames: include_new(Field(**field)) elif not isinstance(field, (Field, Table)): raise SyntaxError( 'define_table argument is not a Field or Table: %s' % field) fields = newfields tablename = tablename self._fields = SQLCallableList() self.virtualfields = [] fields = list(fields) if db and db._adapter.uploads_in_blob is True: uploadfields = [f.name for f in fields if f.type == 'blob'] for field in fields: fn = field.uploadfield if isinstance(field, Field) and field.type == 'upload'\ and fn is True and not field.uploadfs: fn = field.uploadfield = '%s_blob' % field.name if isinstance(fn, str) and not fn in uploadfields and not field.uploadfs: fields.append(Field(fn, 'blob', default='', writable=False, readable=False)) fieldnames_set = set() reserved = dir(Table) + ['fields'] if (db and db.check_reserved): check_reserved = db.check_reserved_keyword else: def check_reserved(field_name): if field_name in reserved: raise SyntaxError("field name %s not allowed" % field_name) for field in fields: field_name = field.name check_reserved(field_name) if db and db._ignore_field_case: fname_item = field_name.lower() else: fname_item = field_name if fname_item in fieldnames_set: raise SyntaxError("duplicate field %s in table %s" % (field_name, tablename)) else: fieldnames_set.add(fname_item) self.fields.append(field_name) self[field_name] = field if field.type == 'id': self['id'] = field field.tablename = field._tablename = tablename field.table = field._table = self field.db = field._db = db self.ALL = SQLALL(self) if _primarykey is not None: for k in _primarykey: if k not in self.fields: raise SyntaxError( "primarykey must be a list of fields from table '%s " % tablename) else: self[k].notnull = True for field in virtual_fields: self[field.name] = field @property def fields(self): return self._fields def update(self, *args, **kwargs): raise RuntimeError("Syntax Not Supported") def _enable_record_versioning(self, archive_db=None, archive_name='%(tablename)s_archive', is_active='is_active', current_record='current_record', current_record_label=None): db = self._db archive_db = archive_db or db archive_name = archive_name % dict(tablename=self._tablename) if archive_name in archive_db.tables(): return # do not try define the archive if already exists fieldnames = self.fields() same_db = archive_db is db field_type = self if same_db else 'bigint' clones = [] for field in self: nfk = same_db or not field.type.startswith('reference') clones.append( field.clone(unique=False, type=field.type if nfk else 'bigint') ) archive_db.define_table( archive_name, Field(current_record, field_type, label=current_record_label), *clones, **dict(format=self._format)) self._before_update.append( lambda qset, fs, db=archive_db, an=archive_name, cn=current_record: archive_record(qset, fs, db[an], cn)) if is_active and is_active in fieldnames: self._before_delete.append( lambda qset: qset.update(is_active=False)) newquery = lambda query, t=self, name=self._tablename: \ reduce(AND, [db[tn].is_active == True for tn in db._adapter.tables(query) if tn == name or getattr(db[tn],'_ot',None)==name]) query = self._common_filter if query: self._common_filter = lambda q: reduce(AND, [query(q), newquery(q)]) else: self._common_filter = newquery def _validate(self, **vars): errors = Row() for key, value in iteritems(vars): value, error = self[key].validate(value) if error: errors[key] = error return errors def _create_references(self): db = self._db pr = db._pending_references self._referenced_by_list = [] self._referenced_by = [] self._references = [] for field in self: #fieldname = field.name ##FIXME not used ? field_type = field.type if isinstance(field_type, str) and ( field_type.startswith('reference ') or field_type.startswith('list:reference ')): is_list = field_type[:15] == 'list:reference ' if is_list: ref = field_type[15:].strip() else: ref = field_type[10:].strip() if not ref: SyntaxError('Table: reference to nothing: %s' % ref) if '.' in ref: rtablename, throw_it, rfieldname = ref.partition('.') else: rtablename, rfieldname = ref, None if not rtablename in db: pr[rtablename] = pr.get(rtablename, []) + [field] continue rtable = db[rtablename] if rfieldname: if not hasattr(rtable, '_primarykey'): raise SyntaxError( 'keyed tables can only reference other keyed tables (for now)') if rfieldname not in rtable.fields: raise SyntaxError( "invalid field '%s' for referenced table '%s'" " in table '%s'" % (rfieldname, rtablename, self._tablename) ) rfield = rtable[rfieldname] else: rfield = rtable._id if is_list: rtable._referenced_by_list.append(field) else: rtable._referenced_by.append(field) field.referent = rfield self._references.append(field) else: field.referent = None if self._tablename in pr: referees = pr.pop(self._tablename) for referee in referees: if referee.type.startswith('list:reference '): self._referenced_by_list.append(referee) else: self._referenced_by.append(referee) def _filter_fields(self, record, id=False): return dict([(k, v) for (k, v) in iteritems(record) if k in self.fields and (self[k].type!='id' or id)]) def _build_query(self,key): """ for keyed table only """ query = None for k,v in iteritems(key): if k in self._primarykey: if query: query = query & (self[k] == v) else: query = (self[k] == v) else: raise SyntaxError( 'Field %s is not part of the primary key of %s' % (k,self._tablename) ) return query def __getitem__(self, key): if not key: return None elif isinstance(key, dict): """ for keyed table """ query = self._build_query(key) return self._db(query).select( limitby=(0, 1), orderby_on_limitby=False ).first() else: try: isgoogle = 'google' in self._db._drivers_available and \ isinstance(key, Key) except: isgoogle = False if str(key).isdigit() or isgoogle: return self._db(self._id == key).select( limitby=(0, 1), orderby_on_limitby=False ).first() else: return super(Table, self).__getitem__(key) def __call__(self, key=DEFAULT, **kwargs): for_update = kwargs.get('_for_update', False) if '_for_update' in kwargs: del kwargs['_for_update'] orderby = kwargs.get('_orderby', None) if '_orderby' in kwargs: del kwargs['_orderby'] if not key is DEFAULT: if isinstance(key, Query): record = self._db(key).select( limitby=(0,1), for_update=for_update, orderby=orderby, orderby_on_limitby=False).first() elif not str(key).isdigit(): record = None else: record = self._db(self._id == key).select( limitby=(0,1), for_update=for_update, orderby=orderby, orderby_on_limitby=False).first() if record: for k,v in iteritems(kwargs): if record[k]!=v: return None return record elif kwargs: query = reduce(lambda a,b:a&b,[self[k]==v for k,v in iteritems(kwargs)]) return self._db(query).select(limitby=(0,1),for_update=for_update, orderby=orderby, orderby_on_limitby=False).first() else: return None def __setitem__(self, key, value): if isinstance(key, dict) and isinstance(value, dict): """ option for keyed table """ if set(key.keys()) == set(self._primarykey): value = self._filter_fields(value) kv = {} kv.update(value) kv.update(key) if not self.insert(**kv): query = self._build_query(key) self._db(query).update(**self._filter_fields(value)) else: raise SyntaxError( 'key must have all fields from primary key: %s'% (self._primarykey)) elif str(key).isdigit(): if key == 0: self.insert(**self._filter_fields(value)) elif self._db(self._id == key)\ .update(**self._filter_fields(value)) is None: raise SyntaxError('No such record: %s' % key) else: if isinstance(key, dict): raise SyntaxError( 'value must be a dictionary: %s' % value) super(Table, self).__setitem__(str(key), value) def __setattr__(self, key, value): if key[:1]!='_' and key in self: raise SyntaxError('Object exists and cannot be redefined: %s' % key) super(Table, self).__setattr__(key, value) def __delitem__(self, key): if isinstance(key, dict): query = self._build_query(key) if not self._db(query).delete(): raise SyntaxError('No such record: %s' % key) elif not str(key).isdigit() or \ not self._db(self._id == key).delete(): raise SyntaxError('No such record: %s' % key) def __iter__(self): for fieldname in self.fields: yield self[fieldname] def __repr__(self): return '
' % (self._tablename, ','.join(self.fields())) def __str__(self): if self._ot is not None: ot = self._ot if 'Oracle' in str(type(self._db._adapter)): return '%s %s' % (ot, self._tablename) return '%s AS %s' % (ot, self._tablename) return self._tablename @property def sqlsafe(self): rname = self._rname if rname: return rname return self._db._adapter.sqlsafe_table(self._tablename) @property def sqlsafe_alias(self): rname = self._rname ot = self._ot if rname and not ot: return rname return self._db._adapter.sqlsafe_table(self._tablename, self._ot) def _drop(self, mode=''): return self._db._adapter._drop(self, mode) def drop(self, mode=''): return self._db._adapter.drop(self,mode) def _listify(self, fields, update=False): new_fields = {} # format: new_fields[name] = (field,value) # store all fields passed as input in new_fields for name in fields: if not name in self.fields: if name != 'id': raise SyntaxError( 'Field %s does not belong to the table' % name) else: field = self[name] value = fields[name] if field.filter_in: value = field.filter_in(value) new_fields[name] = (field, value) # check all fields that should be in the table but are not passed to_compute = [] for ofield in self: name = ofield.name if not name in new_fields: # if field is supposed to be computed, compute it! if ofield.compute: # save those to compute for later to_compute.append((name, ofield)) # if field is required, check its default value elif not update and not ofield.default is None: value = ofield.default fields[name] = value new_fields[name] = (ofield, value) # if this is an update, user the update field instead elif update and not ofield.update is None: value = ofield.update fields[name] = value new_fields[name] = (ofield, value) # if the field is still not there but it should, error elif not update and ofield.required: raise RuntimeError( 'Table: missing required field: %s' % name) # now deal with fields that are supposed to be computed if to_compute: row = Row(fields) for name, ofield in to_compute: # try compute it try: row[name] = new_value = ofield.compute(row) new_fields[name] = (ofield, new_value) except (KeyError, AttributeError): # error silently unless field is required! if ofield.required: raise SyntaxError('unable to compute field: %s' % name) return list(new_fields.values()) def _attempt_upload(self, fields): for field in self: if field.type == 'upload' and field.name in fields: value = fields[field.name] if not (value is None or isinstance(value, str)): if hasattr(value, 'file') and hasattr(value, 'filename'): new_name = field.store(value.file, filename=value.filename) elif isinstance(value,dict): if 'data' in value and 'filename' in value: stream = StringIO(value['data']) new_name = field.store(stream, filename=value['filename']) else: new_name = None elif hasattr(value, 'read') and hasattr(value, 'name'): new_name = field.store(value, filename=value.name) else: raise RuntimeError("Unable to handle upload") fields[field.name] = new_name def _defaults(self, fields): "If there are no fields/values specified, return table defaults" fields = copy.copy(fields) for field in self: if (not field.name in fields and field.type != "id" and field.compute is not None and field.default is not None): fields[field.name] = field.default return fields def _insert(self, **fields): fields = self._defaults(fields) return self._db._adapter._insert(self, self._listify(fields)) def insert(self, **fields): fields = self._defaults(fields) self._attempt_upload(fields) if any(f(fields) for f in self._before_insert): return 0 ret = self._db._adapter.insert(self, self._listify(fields)) if ret and self._after_insert: fields = Row(fields) [f(fields, ret) for f in self._after_insert] return ret def _validate_fields(self, fields, defattr='default'): response = Row() response.id, response.errors = None, Row() new_fields = copy.copy(fields) for fieldname in self.fields: default = getattr(self[fieldname], defattr) if callable(default): default = default() raw_value = fields.get(fieldname, default) value, error = self[fieldname].validate(raw_value) if error: response.errors[fieldname] = "%s" % error elif value is not None: new_fields[fieldname] = value return response, new_fields def validate_and_insert(self, **fields): response, new_fields = self._validate_fields(fields) if not response.errors: response.id = self.insert(**new_fields) return response def validate_and_update(self, _key=DEFAULT, **fields): response, new_fields = self._validate_fields(fields, 'update') #: select record(s) for update if _key is DEFAULT: record = self(**fields) elif isinstance(_key, dict): record = self(**_key) else: record = self(_key) #: do the update if not response.errors and record: if '_id' in self: myset = self._db(self._id == record[self._id.name]) else: query = None for key, value in iteritems(_key): if query is None: query = getattr(self, key) == value else: query = query & (getattr(self, key) == value) myset = self._db(query) response.id = myset.update(**new_fields) return response def update_or_insert(self, _key=DEFAULT, **values): if _key is DEFAULT: record = self(**values) elif isinstance(_key, dict): record = self(**_key) else: record = self(_key) if record: record.update_record(**values) newid = None else: newid = self.insert(**values) return newid def validate_and_update_or_insert(self, _key=DEFAULT, **fields): if _key is DEFAULT or _key == '': primary_keys = {} for key, value in iteritems(fields): if key in self._primarykey: primary_keys[key] = value if primary_keys != {}: record = self(**primary_keys) _key = primary_keys else: required_keys = {} for key, value in iteritems(fields): if getattr(self, key).required: required_keys[key] = value record = self(**required_keys) _key = required_keys elif isinstance(_key, dict): record = self(**_key) else: record = self(_key) if record: response = self.validate_and_update(_key, **fields) if hasattr(self, '_primarykey'): primary_keys = {} for key in self._primarykey: primary_keys[key] = getattr(record, key) response.id = primary_keys else: response = self.validate_and_insert(**fields) return response def bulk_insert(self, items): """ here items is a list of dictionaries """ listify_items = [self._listify(item) for item in items] if any(f(item) for item in items for f in self._before_insert):return 0 ret = self._db._adapter.bulk_insert(self, listify_items) ret and [[f(item,ret[k]) for k,item in enumerate(items)] for f in self._after_insert] return ret def _truncate(self, mode=None): return self._db._adapter._truncate(self, mode) def truncate(self, mode=None): return self._db._adapter.truncate(self, mode) def import_from_csv_file( self, csvfile, id_map=None, null='', unique='uuid', id_offset=None, # id_offset used only when id_map is None *args, **kwargs ): """ Import records from csv file. Column headers must have same names as table fields. Field 'id' is ignored. If column names read 'table.file' the 'table.' prefix is ignored. - 'unique' argument is a field which must be unique (typically a uuid field) - 'restore' argument is default False; if set True will remove old values in table first. - 'id_map' if set to None will not map ids The import will keep the id numbers in the restored table. This assumes that there is an field of type id that is integer and in incrementing order. Will keep the id numbers in restored table. """ delimiter = kwargs.get('delimiter', ',') quotechar = kwargs.get('quotechar', '"') quoting = kwargs.get('quoting', csv.QUOTE_MINIMAL) restore = kwargs.get('restore', False) if restore: self._db[self].truncate() reader = csv.reader(csvfile, delimiter=delimiter, quotechar=quotechar, quoting=quoting) colnames = None if isinstance(id_map, dict): if not self._tablename in id_map: id_map[self._tablename] = {} id_map_self = id_map[self._tablename] def fix(field, value, id_map, id_offset): list_reference_s='list:reference' if value == null: value = None elif field.type=='blob': value = base64.b64decode(value) elif field.type=='double' or field.type=='float': if not value.strip(): value = None else: value = float(value) elif field.type in ('integer','bigint'): if not value.strip(): value = None else: value = long(value) elif field.type.startswith('list:string'): value = bar_decode_string(value) elif field.type.startswith(list_reference_s): ref_table = field.type[len(list_reference_s):].strip() if id_map is not None: value = [id_map[ref_table][long(v)] \ for v in bar_decode_string(value)] else: value = [v for v in bar_decode_string(value)] elif field.type.startswith('list:'): value = bar_decode_integer(value) elif id_map and field.type.startswith('reference'): try: value = id_map[field.type[9:].strip()][long(value)] except KeyError: pass elif id_offset and field.type.startswith('reference'): try: value = id_offset[field.type[9:].strip()]+long(value) except KeyError: pass return (field.name, value) def is_id(colname): if colname in self: return self[colname].type == 'id' else: return False first = True unique_idx = None for lineno, line in enumerate(reader): if not line: break if not colnames: # assume this is the first line of the input, contains colnames colnames = [x.split('.',1)[-1] for x in line][:len(line)] cols, cid = [], None for i,colname in enumerate(colnames): if is_id(colname): cid = i elif colname in self.fields: cols.append((i,self[colname])) if colname == unique: unique_idx = i else: # every other line contains instead data items = [] for i, field in cols: try: items.append(fix(field, line[i], id_map, id_offset)) except ValueError: raise RuntimeError("Unable to parse line:%s field:%s value:'%s'" % (lineno+1,field,line[i])) if not (id_map or cid is None or id_offset is None or unique_idx): csv_id = long(line[cid]) curr_id = self.insert(**dict(items)) if first: first = False # First curr_id is bigger than csv_id, # then we are not restoring but # extending db table with csv db table id_offset[self._tablename] = (curr_id-csv_id) \ if curr_id>csv_id else 0 # create new id until we get the same as old_id+offset while curr_id/./uuid_key[:2] # directory) uploadfs=None # a pyfilesystem where to store upload ) to be used as argument of `DAL.define_table` """ def __init__( self, fieldname, type='string', length=None, default=DEFAULT, required=False, requires=DEFAULT, ondelete='CASCADE', notnull=False, unique=False, uploadfield=True, widget=None, label=None, comment=None, writable=True, readable=True, update=None, authorize=None, autodelete=False, represent=None, uploadfolder=None, uploadseparate=False, uploadfs=None, compute=None, custom_store=None, custom_retrieve=None, custom_retrieve_file_properties=None, custom_delete=None, filter_in=None, filter_out=None, custom_qualifier=None, map_none=None, rname=None ): self._db = self.db = None # both for backward compatibility self.op = None self.first = None self.second = None if PY2 and isinstance(fieldname, unicode): try: fieldname = str(fieldname) except UnicodeEncodeError: raise SyntaxError('Field: invalid unicode field name') self.name = fieldname = cleanup(fieldname) if (not isinstance(fieldname, str) or hasattr(Table, fieldname) or not REGEX_VALID_TB_FLD.match(fieldname) or REGEX_PYTHON_KEYWORDS.match(fieldname) ): raise SyntaxError('Field: invalid field name: %s, ' 'use rname for "funny" names' % fieldname) if not isinstance(type, (Table, Field)): self.type = type else: self.type = 'reference %s' % type self.length = length if not length is None else DEFAULTLENGTH.get(self.type, 512) self.default = default if default != DEFAULT else (update or None) self.required = required # is this field required self.ondelete = ondelete.upper() # this is for reference fields only self.notnull = notnull self.unique = unique self.uploadfield = uploadfield self.uploadfolder = uploadfolder self.uploadseparate = uploadseparate self.uploadfs = uploadfs self.widget = widget self.comment = comment self.writable = writable self.readable = readable self.update = update self.authorize = authorize self.autodelete = autodelete self.represent = list_represent if represent is None and \ type in ('list:integer', 'list:string') else represent self.compute = compute self.isattachment = True self.custom_store = custom_store self.custom_retrieve = custom_retrieve self.custom_retrieve_file_properties = custom_retrieve_file_properties self.custom_delete = custom_delete self.filter_in = filter_in self.filter_out = filter_out self.custom_qualifier = custom_qualifier self.label = (label if label is not None else fieldname.replace('_', ' ').title()) self.requires = requires if requires is not None else [] self.map_none = map_none self._rname = rname def set_attributes(self, *args, **attributes): self.__dict__.update(*args, **attributes) def clone(self, point_self_references_to=False, **args): field = copy.copy(self) if point_self_references_to and \ field.type == 'reference %s'+field._tablename: field.type = 'reference %s' % point_self_references_to field.__dict__.update(args) return field def store(self, file, filename=None, path=None): if self.custom_store: return self.custom_store(file, filename, path) if isinstance(file, cgi.FieldStorage): filename = filename or file.filename file = file.file elif not filename: filename = file.name filename = os.path.basename(filename.replace('/', os.sep).replace('\\', os.sep)) m = REGEX_STORE_PATTERN.search(filename) extension = m and m.group('e') or 'txt' uuid_key = self._db.uuid().replace('-', '')[-16:] encoded_filename = base64.b16encode(filename).lower() newfilename = '%s.%s.%s.%s' % \ (self._tablename, self.name, uuid_key, encoded_filename) newfilename = newfilename[:(self.length - 1 - len(extension))] + '.' + extension self_uploadfield = self.uploadfield if isinstance(self_uploadfield, Field): blob_uploadfield_name = self_uploadfield.uploadfield keys = {self_uploadfield.name: newfilename, blob_uploadfield_name: file.read()} self_uploadfield.table.insert(**keys) elif self_uploadfield is True: if path: pass elif self.uploadfolder: path = self.uploadfolder elif self.db._adapter.folder: path = pjoin(self.db._adapter.folder, '..', 'uploads') else: raise RuntimeError( "you must specify a Field(...,uploadfolder=...)") if self.uploadseparate: if self.uploadfs: raise RuntimeError("not supported") path = pjoin(path, "%s.%s" % ( self._tablename, self.name), uuid_key[:2] ) if not exists(path): os.makedirs(path) pathfilename = pjoin(path, newfilename) if self.uploadfs: dest_file = self.uploadfs.open(newfilename, 'wb') else: dest_file = open(pathfilename, 'wb') try: shutil.copyfileobj(file, dest_file) except IOError: raise IOError( 'Unable to store file "%s" because invalid permissions, ' 'readonly file system, or filename too long' % pathfilename) dest_file.close() return newfilename def retrieve(self, name, path=None, nameonly=False): """ If `nameonly==True` return (filename, fullfilename) instead of (filename, stream) """ self_uploadfield = self.uploadfield if self.custom_retrieve: return self.custom_retrieve(name, path) if self.authorize or isinstance(self_uploadfield, str): row = self.db(self == name).select().first() if not row: raise NotFoundException if self.authorize and not self.authorize(row): raise NotAuthorizedException file_properties = self.retrieve_file_properties(name, path) filename = file_properties['filename'] if isinstance(self_uploadfield, str): # ## if file is in DB stream = StringIO(row[self_uploadfield] or '') elif isinstance(self_uploadfield, Field): blob_uploadfield_name = self_uploadfield.uploadfield query = self_uploadfield == name data = self_uploadfield.table(query)[blob_uploadfield_name] stream = StringIO(data) elif self.uploadfs: # ## if file is on pyfilesystem stream = self.uploadfs.open(name, 'rb') else: # ## if file is on regular filesystem # this is intentially a sting with filename and not a stream # this propagates and allows stream_file_or_304_or_206 to be called fullname = pjoin(file_properties['path'], name) if nameonly: return (filename, fullname) stream = open(fullname, 'rb') return (filename, stream) def retrieve_file_properties(self, name, path=None): m = REGEX_UPLOAD_PATTERN.match(name) if not m or not self.isattachment: raise TypeError('Can\'t retrieve %s file properties' % name) self_uploadfield = self.uploadfield if self.custom_retrieve_file_properties: return self.custom_retrieve_file_properties(name, path) if m.group('name'): try: filename = base64.b16decode(m.group('name'), True) filename = REGEX_CLEANUP_FN.sub('_', filename) except (TypeError, AttributeError): filename = name else: filename = name # ## if file is in DB if isinstance(self_uploadfield, (str, Field)): return dict(path=None, filename=filename) # ## if file is on filesystem if not path: if self.uploadfolder: path = self.uploadfolder else: path = pjoin(self.db._adapter.folder, '..', 'uploads') if self.uploadseparate: t = m.group('table') f = m.group('field') u = m.group('uuidkey') path = pjoin(path, "%s.%s" % (t, f), u[:2]) return dict(path=path, filename=filename) def formatter(self, value): requires = self.requires if value is None: return self.map_none if not requires: return value if not isinstance(requires, (list, tuple)): requires = [requires] elif isinstance(requires, tuple): requires = list(requires) else: requires = copy.copy(requires) requires.reverse() for item in requires: if hasattr(item, 'formatter'): value = item.formatter(value) return value def validate(self, value): if not self.requires or self.requires == DEFAULT: return ((value if value != self.map_none else None), None) requires = self.requires if not isinstance(requires, (list, tuple)): requires = [requires] for validator in requires: (value, error) = validator(value) if error: return (value, error) return ((value if value != self.map_none else None), None) def count(self, distinct=None): return Expression(self.db, self.db._adapter.COUNT, self, distinct, 'integer') def as_dict(self, flat=False, sanitize=True): attrs = ( 'name', 'authorize', 'represent', 'ondelete', 'custom_store', 'autodelete', 'custom_retrieve', 'filter_out', 'uploadseparate', 'widget', 'uploadfs', 'update', 'custom_delete', 'uploadfield', 'uploadfolder', 'custom_qualifier', 'unique', 'writable', 'compute', 'map_none', 'default', 'type', 'required', 'readable', 'requires', 'comment', 'label', 'length', 'notnull', 'custom_retrieve_file_properties', 'filter_in') serializable = (int, long, basestring, float, tuple, bool, type(None)) def flatten(obj): if isinstance(obj, dict): return dict((flatten(k), flatten(v)) for k, v in obj.items()) elif isinstance(obj, (tuple, list, set)): return [flatten(v) for v in obj] elif isinstance(obj, serializable): return obj elif isinstance(obj, (datetime.datetime, datetime.date, datetime.time)): return str(obj) else: return None d = dict() if not (sanitize and not (self.readable or self.writable)): for attr in attrs: if flat: d.update({attr: flatten(getattr(self, attr))}) else: d.update({attr: getattr(self, attr)}) d["fieldname"] = d.pop("name") return d def __bool__(self): return True def __str__(self): try: return '%s.%s' % (self.tablename, self.name) except: return '.%s' % self.name @property def sqlsafe(self): if self._table: return self._table.sqlsafe + '.' + \ (self._rname or self._db._adapter.sqlsafe_field(self.name)) return '.%s' % self.name @property def sqlsafe_name(self): return self._rname or self._db._adapter.sqlsafe_field(self.name) class Query(Serializable): """ Necessary to define a set. It can be stored or can be passed to `DAL.__call__()` to obtain a `Set` Example: Use as:: query = db.users.name=='Max' set = db(query) records = set.select() """ def __init__( self, db, op, first=None, second=None, ignore_common_filters=False, **optional_args ): self.db = self._db = db self.op = op self.first = first self.second = second self.ignore_common_filters = ignore_common_filters self.optional_args = optional_args def __repr__(self): from .adapters.base import BaseAdapter return '' % BaseAdapter.expand(self.db._adapter,self) def __str__(self): return str(self.db._adapter.expand(self)) def __and__(self, other): return Query(self.db,self.db._adapter.AND,self,other) __rand__ = __and__ def __or__(self, other): return Query(self.db,self.db._adapter.OR,self,other) __ror__ = __or__ def __invert__(self): if self.op==self.db._adapter.NOT: return self.first return Query(self.db,self.db._adapter.NOT,self) def __eq__(self, other): return repr(self) == repr(other) def __ne__(self, other): return not (self == other) def case(self,t=1,f=0): return self.db._adapter.CASE(self,t,f) def as_dict(self, flat=False, sanitize=True): """Experimental stuff This allows to return a plain dictionary with the basic query representation. Can be used with json/xml services for client-side db I/O Example: Usage:: q = db.auth_user.id != 0 q.as_dict(flat=True) { "op": "NE", "first":{ "tablename": "auth_user", "fieldname": "id" }, "second":0 } """ SERIALIZABLE_TYPES = (tuple, dict, set, list, int, long, float, basestring, type(None), bool) def loop(d): newd = dict() for k, v in d.items(): if k in ("first", "second"): if isinstance(v, self.__class__): newd[k] = loop(v.__dict__) elif isinstance(v, Field): newd[k] = {"tablename": v._tablename, "fieldname": v.name} elif isinstance(v, Expression): newd[k] = loop(v.__dict__) elif isinstance(v, SERIALIZABLE_TYPES): newd[k] = v elif isinstance(v, (datetime.date, datetime.time, datetime.datetime)): newd[k] = unicode(v) if PY2 else str(v) elif k == "op": if callable(v): newd[k] = v.__name__ elif isinstance(v, basestring): newd[k] = v else: pass # not callable or string elif isinstance(v, SERIALIZABLE_TYPES): if isinstance(v, dict): newd[k] = loop(v) else: newd[k] = v return newd if flat: return loop(self.__dict__) else: return self.__dict__ class Set(Serializable): """ Represents a set of records in the database. Records are identified by the `query=Query(...)` object. Normally the Set is generated by `DAL.__call__(Query(...))` Given a set, for example:: myset = db(db.users.name=='Max') you can:: myset.update(db.users.name='Massimo') myset.delete() # all elements in the set myset.select(orderby=db.users.id, groupby=db.users.name, limitby=(0,10)) and take subsets: subset = myset(db.users.id<5) """ def __init__(self, db, query, ignore_common_filters = None): self.db = db self._db = db # for backward compatibility self.dquery = None # if query is a dict, parse it if isinstance(query, dict): query = self.parse(query) if not ignore_common_filters is None and \ use_common_filters(query) == ignore_common_filters: query = copy.copy(query) query.ignore_common_filters = ignore_common_filters self.query = query def __repr__(self): from .adapters.base import BaseAdapter return '' % BaseAdapter.expand(self.db._adapter,self.query) def __call__(self, query, ignore_common_filters=False): if query is None: return self elif isinstance(query,Table): query = self.db._adapter.id_query(query) elif isinstance(query,str): query = Expression(self.db,query) elif isinstance(query,Field): query = query!=None if self.query: return Set(self.db, self.query & query, ignore_common_filters=ignore_common_filters) else: return Set(self.db, query, ignore_common_filters=ignore_common_filters) def _count(self,distinct=None): return self.db._adapter._count(self.query,distinct) def _select(self, *fields, **attributes): adapter = self.db._adapter tablenames = adapter.tables(self.query, attributes.get('join',None), attributes.get('left',None), attributes.get('orderby',None), attributes.get('groupby',None)) fields = adapter.expand_all(fields, tablenames) return adapter._select(self.query,fields,attributes) def _delete(self): db = self.db tablename = db._adapter.get_table(self.query) return db._adapter._delete(tablename,self.query) def _update(self, **update_fields): db = self.db tablename = db._adapter.get_table(self.query) fields = db[tablename]._listify(update_fields,update=True) return db._adapter._update(tablename,self.query,fields) def as_dict(self, flat=False, sanitize=True): if flat: uid = dbname = uri = None codec = self.db._db_codec if not sanitize: uri, dbname, uid = (self.db._dbname, str(self.db), self.db._db_uid) d = {"query": self.query.as_dict(flat=flat)} d["db"] = {"uid": uid, "codec": codec, "name": dbname, "uri": uri} return d else: return self.__dict__ def parse(self, dquery): "Experimental: Turn a dictionary into a Query object" self.dquery = dquery return self.build(self.dquery) def build(self, d): "Experimental: see .parse()" op, first, second = (d["op"], d["first"], d.get("second", None)) left = right = built = None if op in ("AND", "OR"): if not (type(first), type(second)) == (dict, dict): raise SyntaxError("Invalid AND/OR query") if op == "AND": built = self.build(first) & self.build(second) else: built = self.build(first) | self.build(second) elif op == "NOT": if first is None: raise SyntaxError("Invalid NOT query") built = ~self.build(first) else: # normal operation (GT, EQ, LT, ...) for k, v in {"left": first, "right": second}.items(): if isinstance(v, dict) and v.get("op"): v = self.build(v) if isinstance(v, dict) and ("tablename" in v): v = self.db[v["tablename"]][v["fieldname"]] if k == "left": left = v else: right = v if hasattr(self.db._adapter, op): opm = getattr(self.db._adapter, op) if op == "EQ": built = left == right elif op == "NE": built = left != right elif op == "GT": built = left > right elif op == "GE": built = left >= right elif op == "LT": built = left < right elif op == "LE": built = left <= right elif op in ("JOIN", "LEFT_JOIN", "RANDOM", "ALLOW_NULL"): built = Expression(self.db, opm) elif op in ("LOWER", "UPPER", "EPOCH", "PRIMARY_KEY", "COALESCE_ZERO", "RAW", "INVERT"): built = Expression(self.db, opm, left) elif op in ("COUNT", "EXTRACT", "AGGREGATE", "SUBSTRING", "REGEXP", "LIKE", "ILIKE", "STARTSWITH", "ENDSWITH", "ADD", "SUB", "MUL", "DIV", "MOD", "AS", "ON", "COMMA", "NOT_NULL", "COALESCE", "CONTAINS", "BELONGS"): built = Expression(self.db, opm, left, right) # expression as string elif not (left or right): built = Expression(self.db, op) else: raise SyntaxError("Operator not supported: %s" % op) return built def isempty(self): return not self.select(limitby=(0,1), orderby_on_limitby=False) def count(self,distinct=None, cache=None): db = self.db if cache: sql = self._count(distinct=distinct) if isinstance(cache,dict): cache_model = cache['model'] time_expire = cache['expiration'] key = cache.get('key') if not key: key = db._uri + '/' + sql key = hashlib_md5(key).hexdigest() else: cache_model, time_expire = cache key = db._uri + '/' + sql key = hashlib_md5(key).hexdigest() return cache_model( key, (lambda self=self,distinct=distinct: \ db._adapter.count(self.query,distinct)), time_expire) return db._adapter.count(self.query,distinct) def select(self, *fields, **attributes): adapter = self.db._adapter tablenames = adapter.tables(self.query, attributes.get('join',None), attributes.get('left',None), attributes.get('orderby',None), attributes.get('groupby',None)) fields = adapter.expand_all(fields, tablenames) return adapter.select(self.query,fields,attributes) def iterselect(self, *fields, **attributes): adapter = self.db._adapter tablenames = adapter.tables(self.query, attributes.get('join',None), attributes.get('left',None), attributes.get('orderby',None), attributes.get('groupby',None)) fields = adapter.expand_all(fields, tablenames) return adapter.iterselect(self.query,fields,attributes) def nested_select(self,*fields,**attributes): return Expression(self.db,self._select(*fields,**attributes)) def delete(self): db = self.db tablename = db._adapter.get_table(self.query) table = db[tablename] if any(f(self) for f in table._before_delete): return 0 ret = db._adapter.delete(tablename,self.query) ret and [f(self) for f in table._after_delete] return ret def update(self, **update_fields): db = self.db tablename = db._adapter.get_table(self.query) table = db[tablename] table._attempt_upload(update_fields) if any(f(self,update_fields) for f in table._before_update): return 0 fields = table._listify(update_fields,update=True) if not fields: raise SyntaxError("No fields to update") ret = db._adapter.update("%s" % table._tablename,self.query,fields) ret and [f(self,update_fields) for f in table._after_update] return ret def update_naive(self, **update_fields): """ Same as update but does not call table._before_update and _after_update """ tablename = self.db._adapter.get_table(self.query) table = self.db[tablename] fields = table._listify(update_fields,update=True) if not fields: raise SyntaxError("No fields to update") ret = self.db._adapter.update("%s" % table,self.query,fields) return ret def validate_and_update(self, **update_fields): tablename = self.db._adapter.get_table(self.query) response = Row() response.errors = Row() new_fields = copy.copy(update_fields) for key,value in iteritems(update_fields): value,error = self.db[tablename][key].validate(value) if error: response.errors[key] = '%s' % error else: new_fields[key] = value table = self.db[tablename] if response.errors: response.updated = None else: if not any(f(self, new_fields) for f in table._before_update): table._attempt_upload(new_fields) fields = table._listify(new_fields,update=True) if not fields: raise SyntaxError("No fields to update") ret = self.db._adapter.update(tablename,self.query,fields) ret and [f(self,new_fields) for f in table._after_update] else: ret = 0 response.updated = ret return response def delete_uploaded_files(self, upload_fields=None): table = self.db[self.db._adapter.tables(self.query)[0]] # ## mind uploadfield==True means file is not in DB if upload_fields: fields = list(upload_fields) # Explicity add compute upload fields (ex: thumbnail) fields += [f for f in table.fields if table[f].compute is not None] else: fields = table.fields fields = [f for f in fields if table[f].type == 'upload' and table[f].uploadfield == True and table[f].autodelete] if not fields: return False for record in self.select(*[table[f] for f in fields]): for fieldname in fields: field = table[fieldname] oldname = record.get(fieldname, None) if not oldname: continue if (upload_fields and fieldname in upload_fields and oldname == upload_fields[fieldname]): continue if field.custom_delete: field.custom_delete(oldname) else: uploadfolder = field.uploadfolder if not uploadfolder: uploadfolder = pjoin( self.db._adapter.folder, '..', 'uploads') if field.uploadseparate: items = oldname.split('.') uploadfolder = pjoin( uploadfolder, "%s.%s" % (items[0], items[1]), items[2][:2]) oldpath = pjoin(uploadfolder, oldname) if exists(oldpath): os.unlink(oldpath) return False class LazyReferenceGetter(object): def __init__(self, table, id): self.db, self.tablename, self.id = table._db, table._tablename, id def __call__(self, other_tablename): if self.db._lazy_tables is False: raise AttributeError() table = self.db[self.tablename] other_table = self.db[other_tablename] for rfield in table._referenced_by: if rfield.table == other_table: return LazySet(rfield, self.id) raise AttributeError() class LazySet(object): def __init__(self, field, id): self.db, self.tablename, self.fieldname, self.id = \ field.db, field._tablename, field.name, id def _getset(self): query = self.db[self.tablename][self.fieldname]==self.id return Set(self.db,query) def __repr__(self): return repr(self._getset()) def __call__(self, query, ignore_common_filters=False): return self._getset()(query, ignore_common_filters) def _count(self,distinct=None): return self._getset()._count(distinct) def _select(self, *fields, **attributes): return self._getset()._select(*fields,**attributes) def _delete(self): return self._getset()._delete() def _update(self, **update_fields): return self._getset()._update(**update_fields) def isempty(self): return self._getset().isempty() def count(self,distinct=None, cache=None): return self._getset().count(distinct,cache) def select(self, *fields, **attributes): return self._getset().select(*fields,**attributes) def nested_select(self,*fields,**attributes): return self._getset().nested_select(*fields,**attributes) def delete(self): return self._getset().delete() def update(self, **update_fields): return self._getset().update(**update_fields) def update_naive(self, **update_fields): return self._getset().update_naive(**update_fields) def validate_and_update(self, **update_fields): return self._getset().validate_and_update(**update_fields) def delete_uploaded_files(self, upload_fields=None): return self._getset().delete_uploaded_files(upload_fields) class VirtualCommand(object): def __init__(self,method,row): self.method=method self.row=row def __call__(self,*args,**kwargs): return self.method(self.row,*args,**kwargs) @implements_bool class BasicRows(object): """ Abstract class for Rows and IterRows """ def __bool__(self): return True if self.first() is not None else False def __str__(self): """ Serializes the table into a csv file """ s = StringIO() self.export_to_csv_file(s) return s.getvalue() def as_trees(self, parent_name='parent_id', children_name='children', render=False): """ returns the data as list of trees. :param parent_name: the name of the field holding the reference to the parent (default parent_id). :param children_name: the name where the children of each row will be stored as a list (default children). :param render: whether we will render the fields using their represent (default False) can be a list of fields to render or True to render all. """ roots = [] drows = {} rows = list(self.render(fields=None if render is True else render)) \ if render else self for row in rows: drows[row.id] = row row[children_name] = [] for row in rows: parent = row[parent_name] if parent is None: roots.append(row) else: drows[parent][children_name].append(row) return roots def as_list(self, compact=True, storage_to_dict=True, datetime_to_str=False, custom_types=None): """ Returns the data as a list or dictionary. Args: storage_to_dict: when True returns a dict, otherwise a list datetime_to_str: convert datetime fields as strings """ (oc, self.compact) = (self.compact, compact) if storage_to_dict: items = [item.as_dict(datetime_to_str, custom_types) for item in self] else: items = [item for item in self] self.compact = oc return items def as_dict(self, key='id', compact=True, storage_to_dict=True, datetime_to_str=False, custom_types=None): """ Returns the data as a dictionary of dictionaries (storage_to_dict=True) or records (False) Args: key: the name of the field to be used as dict key, normally the id compact: ? (default True) storage_to_dict: when True returns a dict, otherwise a list(default True) datetime_to_str: convert datetime fields as strings (default False) """ # test for multiple rows multi = False f = self.first() if f and isinstance(key, basestring): multi = any([isinstance(v, f.__class__) for v in f.values()]) if ("." not in key) and multi: # No key provided, default to int indices def new_key(): i = 0 while True: yield i i += 1 key_generator = new_key() key = lambda r: key_generator.next() rows = self.as_list(compact, storage_to_dict, datetime_to_str, custom_types) if isinstance(key, str) and key.count('.') == 1: (table, field) = key.split('.') return dict([(r[table][field], r) for r in rows]) elif isinstance(key, str): return dict([(r[key], r) for r in rows]) else: return dict([(key(r), r) for r in rows]) def xml(self, strict=False, row_name='row', rows_name='rows'): """ Serializes the table using sqlhtml.SQLTABLE (if present) """ if not strict and not self.db.has_representer('rows_xml'): strict = True if strict: return '<%s>\n%s\n' % ( rows_name, '\n'.join( row.as_xml( row_name=row_name, colnames=self.colnames ) for row in self), rows_name ) rv = self.db.represent('rows_xml', self) if hasattr(rv, 'xml') and callable(getattr(rv, 'xml')): return rv.xml() return rv def as_xml(self, row_name='row', rows_name='rows'): return self.xml(strict=True, row_name=row_name, rows_name=rows_name) def as_json(self, mode='object', default=None): """ Serializes the rows to a JSON list or object with objects mode='object' is not implemented (should return a nested object structure) """ items = [record.as_json( mode=mode, default=default, serialize=False, colnames=self.colnames ) for record in self] return serializers.json(items) def export_to_csv_file(self, ofile, null='', *args, **kwargs): """ Exports data to csv, the first line contains the column names Args: ofile: where the csv must be exported to null: how null values must be represented (default '') delimiter: delimiter to separate values (default ',') quotechar: character to use to quote string values (default '"') quoting: quote system, use csv.QUOTE_*** (default csv.QUOTE_MINIMAL) represent: use the fields .represent value (default False) colnames: list of column names to use (default self.colnames) This will only work when exporting rows objects!!!! DO NOT use this with db.export_to_csv() """ delimiter = kwargs.get('delimiter', ',') quotechar = kwargs.get('quotechar', '"') quoting = kwargs.get('quoting', csv.QUOTE_MINIMAL) represent = kwargs.get('represent', False) writer = csv.writer(ofile, delimiter=delimiter, quotechar=quotechar, quoting=quoting) def unquote_colnames(colnames): unq_colnames = [] for col in colnames: m = self.db._adapter.REGEX_TABLE_DOT_FIELD.match(col) if not m: unq_colnames.append(col) else: unq_colnames.append('.'.join(m.groups())) return unq_colnames colnames = kwargs.get('colnames', self.colnames) write_colnames = kwargs.get('write_colnames', True) # a proper csv starting with the column names if write_colnames: writer.writerow(unquote_colnames(colnames)) def none_exception(value): """ Returns a cleaned up value that can be used for csv export: - unicode text is encoded as such - None values are replaced with the given representation (default ) """ if value is None: return null elif PY2 and isinstance(value, unicode): return value.encode('utf8') elif isinstance(value, Reference): return long(value) elif hasattr(value, 'isoformat'): return value.isoformat()[:19].replace('T', ' ') elif isinstance(value, (list, tuple)): # for type='list:..' return bar_encode(value) return value repr_cache = {} for record in self: row = [] for col in colnames: m = self.db._adapter.REGEX_TABLE_DOT_FIELD.match(col) if not m: row.append(record._extra[col]) else: (t, f) = m.groups() field = self.db[t][f] if isinstance(record.get(t, None), (Row, dict)): value = record[t][f] else: value = record[f] if field.type == 'blob' and value is not None: value = base64.b64encode(value) elif represent and field.represent: if field.type.startswith('reference'): if field not in repr_cache: repr_cache[field] = {} if value not in repr_cache[field]: repr_cache[field][value] = field.represent( value, record ) value = repr_cache[field][value] else: value = field.represent(value, record) row.append(none_exception(value)) writer.writerow(row) # for consistent naming yet backwards compatible as_csv = __str__ json = as_json class Rows(BasicRows): """ A wrapper for the return value of a select. It basically represents a table. It has an iterator and each row is represented as a `Row` dictionary. """ # ## TODO: this class still needs some work to care for ID/OID def __init__(self, db=None, records=[], colnames=[], compact=True, rawrows=None): self.db = db self.records = records self.colnames = colnames self.compact = compact self.response = rawrows def __repr__(self): return '' % len(self.records) def setvirtualfields(self, **keyed_virtualfields): """ For reference:: db.define_table('x',Field('number','integer')) if db(db.x).isempty(): [db.x.insert(number=i) for i in range(10)] from gluon.dal import lazy_virtualfield class MyVirtualFields(object): # normal virtual field (backward compatible, discouraged) def normal_shift(self): return self.x.number+1 # lazy virtual field (because of @staticmethod) @lazy_virtualfield def lazy_shift(instance,row,delta=4): return row.x.number+delta db.x.virtualfields.append(MyVirtualFields()) for row in db(db.x).select(): print row.number, row.normal_shift, row.lazy_shift(delta=7) """ if not keyed_virtualfields: return self for row in self.records: for (tablename, virtualfields) in iteritems(keyed_virtualfields): attributes = dir(virtualfields) if tablename not in row: box = row[tablename] = Row() else: box = row[tablename] updated = False for attribute in attributes: if attribute[0] != '_': method = getattr(virtualfields, attribute) if hasattr(method, '__lazy__'): box[attribute] = VirtualCommand(method, row) elif type(method) == types.MethodType: if not updated: virtualfields.__dict__.update(row) updated = True box[attribute] = method() return self def __and__(self, other): if self.colnames != other.colnames: raise Exception('Cannot & incompatible Rows objects') records = self.records+other.records return Rows(self.db, records, self.colnames, compact=self.compact or other.compact) def __or__(self, other): if self.colnames != other.colnames: raise Exception('Cannot | incompatible Rows objects') records = [record for record in other.records if record not in self.records] records = self.records + records return Rows(self.db, records, self.colnames, compact=self.compact or other.compact) def __len__(self): return len(self.records) def __getslice__(self, a, b): return Rows(self.db, self.records[a:b], self.colnames, compact=self.compact) def __getitem__(self, i): row = self.records[i] keys = list(row.keys()) if self.compact and len(keys) == 1 and keys[0] != '_extra': return row[keys[0]] return row def __iter__(self): """ Iterator over records """ for i in xrange(len(self)): yield self[i] def __eq__(self, other): if isinstance(other, Rows): return (self.records == other.records) else: return False def column(self, column=None): return [r[str(column) if column else self.colnames[0]] for r in self] def first(self): if not self.records: return None return self[0] def last(self): if not self.records: return None return self[-1] def find(self, f, limitby=None): """ Returns a new Rows object, a subset of the original object, filtered by the function `f` """ if not self: return Rows(self.db, [], self.colnames, compact=self.compact) records = [] if limitby: a, b = limitby else: a, b = 0, len(self) k = 0 for i, row in enumerate(self): if f(row): if a <= k: records.append(self.records[i]) k += 1 if k == b: break return Rows(self.db, records, self.colnames, compact=self.compact) def exclude(self, f): """ Removes elements from the calling Rows object, filtered by the function `f`, and returns a new Rows object containing the removed elements """ if not self.records: return Rows(self.db, [], self.colnames, compact=self.compact) removed = [] i = 0 while i < len(self): row = self[i] if f(row): removed.append(self.records[i]) del self.records[i] else: i += 1 return Rows(self.db, removed, self.colnames, compact=self.compact) def sort(self, f, reverse=False): """ Returns a list of sorted elements (not sorted in place) """ rows = Rows(self.db, [], self.colnames, compact=self.compact) # When compact=True, iterating over self modifies each record, # so when sorting self, it is necessary to return a sorted # version of self.records rather than the sorted self directly. rows.records = [r for (r, s) in sorted(zip(self.records, self), key=lambda r: f(r[1]), reverse=reverse)] return rows def group_by_value(self, *fields, **args): """ Regroups the rows, by one of the fields """ one_result = False if 'one_result' in args: one_result = args['one_result'] def build_fields_struct(row, fields, num, groups): ''' helper function: ''' if num > len(fields)-1: if one_result: return row else: return [row] key = fields[num] value = row[key] if value not in groups: groups[value] = build_fields_struct(row, fields, num+1, {}) else: struct = build_fields_struct(row, fields, num+1, groups[value]) # still have more grouping to do if type(struct) == type(dict()): groups[value].update() # no more grouping, first only is off elif type(struct) == type(list()): groups[value] += struct # no more grouping, first only on else: groups[value] = struct return groups if len(fields) == 0: return self # if select returned no results if not self.records: return {} grouped_row_group = dict() # build the struct for row in self: build_fields_struct(row, fields, 0, grouped_row_group) return grouped_row_group def render(self, i=None, fields=None): """ Takes an index and returns a copy of the indexed row with values transformed via the "represent" attributes of the associated fields. Args: i: index. If not specified, a generator is returned for iteration over all the rows. fields: a list of fields to transform (if None, all fields with "represent" attributes will be transformed) """ if i is None: return (self.render(i, fields=fields) for i in range(len(self))) if not self.db.has_representer('rows_render'): raise RuntimeError("Rows.render() needs a `rows_render` \ representer in DAL instance") row = copy.deepcopy(self.records[i]) keys = list(row.keys()) tables = [f.tablename for f in fields] if fields \ else [k for k in keys if k != '_extra'] for table in tables: repr_fields = [f.name for f in fields if f.tablename == table] \ if fields else [k for k in row[table].keys() if (hasattr(self.db[table], k) and isinstance(self.db[table][k], Field) and self.db[table][k].represent)] for field in repr_fields: row[table][field] = self.db.represent( 'rows_render', self.db[table][field], row[table][field], row[table]) if self.compact and len(keys) == 1 and keys[0] != '_extra': return row[keys[0]] return row @implements_iterator class IterRows(BasicRows): def __init__(self, db, sql, fields, colnames, blob_decode, cacheable): self.db = db self.fields = fields self.colnames = colnames self.blob_decode = blob_decode self.cacheable = cacheable (self.fields_virtual, self.fields_lazy, self.tmps) = \ self.db._adapter._parse_expand_colnames(colnames) self.db._adapter.execute(sql) self._head = None self.last_item = None self.last_item_id = None self.compact = True def __next__(self): db_row = self.db._adapter._fetchone() if db_row is None: raise StopIteration row = self.db._adapter._parse(db_row, self.tmps, self.fields, self.colnames, self.blob_decode, self.cacheable, self.fields_virtual, self.fields_lazy) if self.compact: # The following is to translate # # in # # normally accomplished by Rows.__get_item__ keys = list(row.keys()) if len(keys) == 1 and keys[0] != '_extra': row = row[keys[0]] return row def __iter__(self): if self._head: yield self._head row = next(self) while row is not None: yield row row = next(self) return def first(self): if self._head is None: try: self._head = next(self) except StopIteration: # TODO should I raise something? return None return self._head def __getitem__(self, key): if not isinstance(key, (int, long)): raise TypeError if key == self.last_item_id: return self.last_item n_to_drop = key if self.last_item_id is not None: if self.last_item_id < key: n_to_drop -= (self.last_item_id + 1) else: raise IndexError # fetch and drop the first key - 1 elements for i in xrange(n_to_drop): self.db._adapter._fetchone() row = next(self) if row is None: raise IndexError else: self.last_item_id = key self.last_item = row return row # # rowcount it doesn't seem to be reliable on all drivers # def __len__(self): # return self.db._adapter.cursor.rowcount web2py-2.12.3.orig/gluon/packages/dal/pydal/base.py0000664000000000000000000013561412564727432020533 0ustar rootroot# -*- coding: utf-8 -*- """ | This file is part of the web2py Web Framework | Copyrighted by Massimo Di Pierro | License: LGPLv3 (http://www.gnu.org/licenses/lgpl.html) | This file contains the DAL support for many relational databases, including: - SQLite & SpatiaLite - MySQL - Postgres - Firebird - Oracle - MS SQL - DB2 - Interbase - Ingres - Informix (9+ and SE) - SapDB (experimental) - Cubrid (experimental) - CouchDB (experimental) - MongoDB (in progress) - Google:nosql - Google:sql - Teradata - IMAP (experimental) Example of usage:: >>> # from dal import DAL, Field ### create DAL connection (and create DB if it doesn't exist) >>> db = DAL(('sqlite://storage.sqlite','mysql://a:b@localhost/x'), ... folder=None) ### define a table 'person' (create/alter as necessary) >>> person = db.define_table('person',Field('name','string')) ### insert a record >>> id = person.insert(name='James') ### retrieve it by id >>> james = person(id) ### retrieve it by name >>> james = person(name='James') ### retrieve it by arbitrary query >>> query = (person.name=='James') & (person.name.startswith('J')) >>> james = db(query).select(person.ALL)[0] ### update one record >>> james.update_record(name='Jim') ### update multiple records by query >>> db(person.name.like('J%')).update(name='James') 1 ### delete records by query >>> db(person.name.lower() == 'jim').delete() 0 ### retrieve multiple records (rows) >>> people = db(person).select(orderby=person.name, ... groupby=person.name, limitby=(0,100)) ### further filter them >>> james = people.find(lambda row: row.name == 'James').first() >>> print james.id, james.name 1 James ### check aggregates >>> counter = person.id.count() >>> print db(person).select(counter).first()(counter) 1 ### delete one record >>> james.delete_record() 1 ### delete (drop) entire database table >>> person.drop() Supported DAL URI strings:: 'sqlite://test.db' 'spatialite://test.db' 'sqlite:memory' 'spatialite:memory' 'jdbc:sqlite://test.db' 'mysql://root:none@localhost/test' 'postgres://mdipierro:password@localhost/test' 'postgres:psycopg2://mdipierro:password@localhost/test' 'postgres:pg8000://mdipierro:password@localhost/test' 'jdbc:postgres://mdipierro:none@localhost/test' 'mssql://web2py:none@A64X2/web2py_test' 'mssql2://web2py:none@A64X2/web2py_test' # alternate mappings 'mssql3://web2py:none@A64X2/web2py_test' # better pagination (requires >= 2005) 'mssql4://web2py:none@A64X2/web2py_test' # best pagination (requires >= 2012) 'oracle://username:password@database' 'firebird://user:password@server:3050/database' 'db2:ibm_db_dbi://DSN=dsn;UID=user;PWD=pass' 'db2:pyodbc://driver=DB2;hostname=host;database=database;uid=user;pwd=password;port=port' 'firebird://username:password@hostname/database' 'firebird_embedded://username:password@c://path' 'informix://user:password@server:3050/database' 'informixu://user:password@server:3050/database' # unicode informix 'ingres://database' # or use an ODBC connection string, e.g. 'ingres://dsn=dsn_name' 'google:datastore' # for google app engine datastore (uses ndb by default) 'google:sql' # for google app engine with sql (mysql compatible) 'teradata://DSN=dsn;UID=user;PWD=pass; DATABASE=database' # experimental 'imap://user:password@server:port' # experimental 'mongodb://user:password@server:port/database' # experimental For more info:: help(DAL) help(Field) """ import copy import glob import logging import socket import threading import time import traceback import urllib from uuid import uuid4 from ._compat import PY2, pickle, hashlib_md5, pjoin, copyreg, integer_types, \ with_metaclass from ._globals import GLOBAL_LOCKER, THREAD_LOCAL, DEFAULT from ._load import OrderedDict from .helpers.classes import Serializable, SQLCallableList, BasicStorage from .helpers.methods import hide_password, smart_query, auto_validators, \ auto_represent from .helpers.regex import REGEX_PYTHON_KEYWORDS, REGEX_DBNAME, \ REGEX_SEARCH_PATTERN, REGEX_SQUARE_BRACKETS from .helpers.serializers import serializers from .objects import Table, Field, Row, Set from .adapters import ADAPTERS from .adapters.base import BaseAdapter long = integer_types[-1] TABLE_ARGS = set( ('migrate', 'primarykey', 'fake_migrate', 'format', 'redefine', 'singular', 'plural', 'trigger_name', 'sequence_name', 'fields', 'common_filter', 'polymodel', 'table_class', 'on_define', 'rname')) class MetaDAL(type): def __call__(cls, *args, **kwargs): #: intercept arguments for DAL costumisation on call intercepts = [ 'logger', 'representers', 'serializers', 'uuid', 'validators', 'validators_method'] intercepted = [] for name in intercepts: val = kwargs.get(name) if val: intercepted.append((name, val)) del kwargs[name] for tup in intercepted: setattr(cls, tup[0], tup[1]) obj = super(MetaDAL, cls).__call__(*args, **kwargs) return obj class DAL(with_metaclass(MetaDAL, Serializable, BasicStorage)): """ An instance of this class represents a database connection Args: uri(str): contains information for connecting to a database. Defaults to `'sqlite://dummy.db'` Note: experimental: you can specify a dictionary as uri parameter i.e. with:: db = DAL({"uri": "sqlite://storage.sqlite", "tables": {...}, ...}) for an example of dict input you can check the output of the scaffolding db model with db.as_dict() Note that for compatibility with Python older than version 2.6.5 you should cast your dict input keys to str due to a syntax limitation on kwarg names. for proper DAL dictionary input you can use one of:: obj = serializers.cast_keys(dict, [encoding="utf-8"]) #or else (for parsing json input) obj = serializers.loads_json(data, unicode_keys=False) pool_size: How many open connections to make to the database object. folder: where .table files will be created. Automatically set within web2py. Use an explicit path when using DAL outside web2py db_codec: string encoding of the database (default: 'UTF-8') table_hash: database identifier with .tables. If your connection hash change you can still using old .tables if they have db_hash as prefix check_reserved: list of adapters to check tablenames and column names against sql/nosql reserved keywords. Defaults to `None` - 'common' List of sql keywords that are common to all database types such as "SELECT, INSERT". (recommended) - 'all' Checks against all known SQL keywords - ''' Checks against the specific adapters list of keywords - '_nonreserved' Checks against the specific adapters list of nonreserved keywords. (if available) migrate: sets default migrate behavior for all tables fake_migrate: sets default fake_migrate behavior for all tables migrate_enabled: If set to False disables ALL migrations fake_migrate_all: If set to True fake migrates ALL tables attempts: Number of times to attempt connecting auto_import: If set to True, tries import automatically table definitions from the databases folder (works only for simple models) bigint_id: If set, turn on bigint instead of int for id and reference fields lazy_tables: delaya table definition until table access after_connection: can a callable that will be executed after the connection Example: Use as:: db = DAL('sqlite://test.db') or:: db = DAL(**{"uri": ..., "tables": [...]...}) # experimental db.define_table('tablename', Field('fieldname1'), Field('fieldname2')) """ serializers = None validators = None validators_method = None representers = {} uuid = lambda x: str(uuid4()) logger = logging.getLogger("pyDAL") Table = Table def __new__(cls, uri='sqlite://dummy.db', *args, **kwargs): if not hasattr(THREAD_LOCAL, 'db_instances'): THREAD_LOCAL.db_instances = {} if not hasattr(THREAD_LOCAL, 'db_instances_zombie'): THREAD_LOCAL.db_instances_zombie = {} if uri == '': db_uid = kwargs['db_uid'] # a zombie must have a db_uid! if db_uid in THREAD_LOCAL.db_instances: db_group = THREAD_LOCAL.db_instances[db_uid] db = db_group[-1] elif db_uid in THREAD_LOCAL.db_instances_zombie: db = THREAD_LOCAL.db_instances_zombie[db_uid] else: db = super(DAL, cls).__new__(cls) THREAD_LOCAL.db_instances_zombie[db_uid] = db else: db_uid = kwargs.get('db_uid', hashlib_md5(repr(uri)).hexdigest()) if db_uid in THREAD_LOCAL.db_instances_zombie: db = THREAD_LOCAL.db_instances_zombie[db_uid] del THREAD_LOCAL.db_instances_zombie[db_uid] else: db = super(DAL, cls).__new__(cls) db_group = THREAD_LOCAL.db_instances.get(db_uid, []) db_group.append(db) THREAD_LOCAL.db_instances[db_uid] = db_group db._db_uid = db_uid return db @staticmethod def set_folder(folder): # ## this allows gluon to set a folder for this thread # ## <<<<<<<<< Should go away as new DAL replaces old sql.py BaseAdapter.set_folder(folder) @staticmethod def get_instances(): """ Returns a dictionary with uri as key with timings and defined tables:: {'sqlite://storage.sqlite': { 'dbstats': [(select auth_user.email from auth_user, 0.02009)], 'dbtables': { 'defined': ['auth_cas', 'auth_event', 'auth_group', 'auth_membership', 'auth_permission', 'auth_user'], 'lazy': '[]' } } } """ dbs = getattr(THREAD_LOCAL, 'db_instances', {}).items() infos = {} for db_uid, db_group in dbs: for db in db_group: if not db._uri: continue k = hide_password(db._adapter.uri) infos[k] = dict( dbstats = [(row[0], row[1]) for row in db._timings], dbtables = {'defined': sorted( list(set(db.tables)-set(db._LAZY_TABLES.keys()))), 'lazy': sorted(db._LAZY_TABLES.keys())}) return infos @staticmethod def distributed_transaction_begin(*instances): if not instances: return thread_key = '%s.%s' % (socket.gethostname(), threading.currentThread()) keys = ['%s.%i' % (thread_key, i) for (i,db) in instances] instances = enumerate(instances) for (i, db) in instances: if not db._adapter.support_distributed_transaction(): raise SyntaxError( 'distributed transaction not suported by %s' % db._dbname) for (i, db) in instances: db._adapter.distributed_transaction_begin(keys[i]) @staticmethod def distributed_transaction_commit(*instances): if not instances: return instances = enumerate(instances) thread_key = '%s.%s' % (socket.gethostname(), threading.currentThread()) keys = ['%s.%i' % (thread_key, i) for (i,db) in instances] for (i, db) in instances: if not db._adapter.support_distributed_transaction(): raise SyntaxError( 'distributed transaction not suported by %s' % db._dbanme) try: for (i, db) in instances: db._adapter.prepare(keys[i]) except: for (i, db) in instances: db._adapter.rollback_prepared(keys[i]) raise RuntimeError('failure to commit distributed transaction') else: for (i, db) in instances: db._adapter.commit_prepared(keys[i]) return def __init__(self, uri='sqlite://dummy.db', pool_size=0, folder=None, db_codec='UTF-8', check_reserved=None, migrate=True, fake_migrate=False, migrate_enabled=True, fake_migrate_all=False, decode_credentials=False, driver_args=None, adapter_args=None, attempts=5, auto_import=False, bigint_id=False, debug=False, lazy_tables=False, db_uid=None, do_connect=True, after_connection=None, tables=None, ignore_field_case=True, entity_quoting=False, table_hash=None): if uri == '' and db_uid is not None: return super(DAL, self).__init__() from .drivers import DRIVERS, is_jdbc self._drivers_available = DRIVERS if not decode_credentials: credential_decoder = lambda cred: cred else: credential_decoder = lambda cred: urllib.unquote(cred) self._folder = folder if folder: self.set_folder(folder) self._uri = uri self._pool_size = pool_size self._db_codec = db_codec self._lastsql = '' self._timings = [] self._pending_references = {} self._request_tenant = 'request_tenant' self._common_fields = [] self._referee_name = '%(table)s' self._bigint_id = bigint_id self._debug = debug self._migrated = [] self._LAZY_TABLES = {} self._lazy_tables = lazy_tables self._tables = SQLCallableList() self._driver_args = driver_args self._adapter_args = adapter_args self._check_reserved = check_reserved self._decode_credentials = decode_credentials self._attempts = attempts self._do_connect = do_connect self._ignore_field_case = ignore_field_case if not str(attempts).isdigit() or attempts < 0: attempts = 5 if uri: uris = isinstance(uri, (list, tuple)) and uri or [uri] error = '' connected = False for k in range(attempts): for uri in uris: try: if is_jdbc and not uri.startswith('jdbc:'): uri = 'jdbc:'+uri self._dbname = REGEX_DBNAME.match(uri).group() if not self._dbname in ADAPTERS: raise SyntaxError("Error in URI '%s' or database not supported" % self._dbname) # notice that driver args or {} else driver_args # defaults to {} global, not correct kwargs = dict(db=self,uri=uri, pool_size=pool_size, folder=folder, db_codec=db_codec, credential_decoder=credential_decoder, driver_args=driver_args or {}, adapter_args=adapter_args or {}, do_connect=do_connect, after_connection=after_connection, entity_quoting=entity_quoting) self._adapter = ADAPTERS[self._dbname](**kwargs) types = ADAPTERS[self._dbname].types # copy so multiple DAL() possible self._adapter.types = copy.copy(types) self._adapter.build_parsemap() self._adapter.ignore_field_case = ignore_field_case if bigint_id: if 'big-id' in types and 'reference' in types: self._adapter.types['id'] = types['big-id'] self._adapter.types['reference'] = types['big-reference'] connected = True break except SyntaxError: raise except Exception: tb = traceback.format_exc() self.logger.debug('DEBUG: connect attempt %i, connection error:\n%s' % (k, tb)) if connected: break else: time.sleep(1) if not connected: raise RuntimeError("Failure to connect, tried %d times:\n%s" % (attempts, tb)) else: self._adapter = BaseAdapter(db=self,pool_size=0, uri='None',folder=folder, db_codec=db_codec, after_connection=after_connection, entity_quoting=entity_quoting) migrate = fake_migrate = False adapter = self._adapter self._uri_hash = table_hash or hashlib_md5(adapter.uri).hexdigest() self.check_reserved = check_reserved if self.check_reserved: from .contrib.reserved_sql_keywords import ADAPTERS as RSK self.RSK = RSK self._migrate = migrate self._fake_migrate = fake_migrate self._migrate_enabled = migrate_enabled self._fake_migrate_all = fake_migrate_all if self.serializers is not None: for k, v in self.serializers.items(): serializers._custom_[k] = v if auto_import or tables: self.import_table_definitions(adapter.folder, tables=tables) @property def tables(self): return self._tables def import_table_definitions(self, path, migrate=False, fake_migrate=False, tables=None): if tables: for table in tables: self.define_table(**table) else: pattern = pjoin(path,self._uri_hash+'_*.table') for filename in glob.glob(pattern): tfile = self._adapter.file_open(filename, 'r') try: sql_fields = pickle.load(tfile) name = filename[len(pattern)-7:-6] mf = [(value['sortable'], Field(key, type=value['type'], length=value.get('length',None), notnull=value.get('notnull',False), unique=value.get('unique',False))) \ for key, value in sql_fields.iteritems()] mf.sort(lambda a,b: cmp(a[0],b[0])) self.define_table(name,*[item[1] for item in mf], **dict(migrate=migrate, fake_migrate=fake_migrate)) finally: self._adapter.file_close(tfile) def check_reserved_keyword(self, name): """ Validates `name` against SQL keywords Uses self.check_reserve which is a list of operators to use. """ for backend in self.check_reserved: if name.upper() in self.RSK[backend]: raise SyntaxError( 'invalid table/column name "%s" is a "%s" reserved SQL/NOSQL keyword' % (name, backend.upper())) def parse_as_rest(self,patterns,args,vars,queries=None,nested_select=True): """ Example: Use as:: db.define_table('person',Field('name'),Field('info')) db.define_table('pet', Field('ownedby',db.person), Field('name'),Field('info') ) @request.restful() def index(): def GET(*args,**vars): patterns = [ "/friends[person]", "/{person.name}/:field", "/{person.name}/pets[pet.ownedby]", "/{person.name}/pets[pet.ownedby]/{pet.name}", "/{person.name}/pets[pet.ownedby]/{pet.name}/:field", ("/dogs[pet]", db.pet.info=='dog'), ("/dogs[pet]/{pet.name.startswith}", db.pet.info=='dog'), ] parser = db.parse_as_rest(patterns,args,vars) if parser.status == 200: return dict(content=parser.response) else: raise HTTP(parser.status,parser.error) def POST(table_name,**vars): if table_name == 'person': return db.person.validate_and_insert(**vars) elif table_name == 'pet': return db.pet.validate_and_insert(**vars) else: raise HTTP(400) return locals() """ db = self re1 = REGEX_SEARCH_PATTERN re2 = REGEX_SQUARE_BRACKETS def auto_table(table,base='',depth=0): patterns = [] for field in db[table].fields: if base: tag = '%s/%s' % (base,field.replace('_','-')) else: tag = '/%s/%s' % (table.replace('_','-'),field.replace('_','-')) f = db[table][field] if not f.readable: continue if f.type=='id' or 'slug' in field or f.type.startswith('reference'): tag += '/{%s.%s}' % (table,field) patterns.append(tag) patterns.append(tag+'/:field') elif f.type.startswith('boolean'): tag += '/{%s.%s}' % (table,field) patterns.append(tag) patterns.append(tag+'/:field') elif f.type in ('float','double','integer','bigint'): tag += '/{%s.%s.ge}/{%s.%s.lt}' % (table,field,table,field) patterns.append(tag) patterns.append(tag+'/:field') elif f.type.startswith('list:'): tag += '/{%s.%s.contains}' % (table,field) patterns.append(tag) patterns.append(tag+'/:field') elif f.type in ('date','datetime'): tag+= '/{%s.%s.year}' % (table,field) patterns.append(tag) patterns.append(tag+'/:field') tag+='/{%s.%s.month}' % (table,field) patterns.append(tag) patterns.append(tag+'/:field') tag+='/{%s.%s.day}' % (table,field) patterns.append(tag) patterns.append(tag+'/:field') if f.type in ('datetime','time'): tag+= '/{%s.%s.hour}' % (table,field) patterns.append(tag) patterns.append(tag+'/:field') tag+='/{%s.%s.minute}' % (table,field) patterns.append(tag) patterns.append(tag+'/:field') tag+='/{%s.%s.second}' % (table,field) patterns.append(tag) patterns.append(tag+'/:field') if depth>0: for f in db[table]._referenced_by: tag+='/%s[%s.%s]' % (table,f.tablename,f.name) patterns.append(tag) patterns += auto_table(table,base=tag,depth=depth-1) return patterns if patterns == 'auto': patterns=[] for table in db.tables: if not table.startswith('auth_'): patterns.append('/%s[%s]' % (table,table)) patterns += auto_table(table,base='',depth=1) else: i = 0 while i2: pattern, basequery, exposedfields = pattern[0:3] otable=table=None if not isinstance(queries,dict): dbset=db(queries) if basequery is not None: dbset = dbset(basequery) i=0 tags = pattern[1:].split('/') if len(tags)!=len(args): continue for tag in tags: if re1.match(tag): # print 're1:'+tag tokens = tag[1:-1].split('.') table, field = tokens[0], tokens[1] if not otable or table == otable: if len(tokens)==2 or tokens[2]=='eq': query = db[table][field]==args[i] elif tokens[2]=='ne': query = db[table][field]!=args[i] elif tokens[2]=='lt': query = db[table][field]args[i] elif tokens[2]=='ge': query = db[table][field]>=args[i] elif tokens[2]=='le': query = db[table][field]<=args[i] elif tokens[2]=='year': query = db[table][field].year()==args[i] elif tokens[2]=='month': query = db[table][field].month()==args[i] elif tokens[2]=='day': query = db[table][field].day()==args[i] elif tokens[2]=='hour': query = db[table][field].hour()==args[i] elif tokens[2]=='minute': query = db[table][field].minutes()==args[i] elif tokens[2]=='second': query = db[table][field].seconds()==args[i] elif tokens[2]=='startswith': query = db[table][field].startswith(args[i]) elif tokens[2]=='contains': query = db[table][field].contains(args[i]) else: raise RuntimeError("invalid pattern: %s" % pattern) if len(tokens)==4 and tokens[3]=='not': query = ~query elif len(tokens)>=4: raise RuntimeError("invalid pattern: %s" % pattern) if not otable and isinstance(queries,dict): dbset = db(queries[table]) if basequery is not None: dbset = dbset(basequery) dbset=dbset(query) else: raise RuntimeError("missing relation in pattern: %s" % pattern) elif re2.match(tag) and args[i]==tag[:tag.find('[')]: ref = tag[tag.find('[')+1:-1] if '.' in ref and otable: table,field = ref.split('.') selfld = '_id' if db[table][field].type.startswith('reference '): refs = [ x.name for x in db[otable] if x.type == db[table][field].type ] else: refs = [ x.name for x in db[table]._referenced_by if x.tablename==otable ] if refs: selfld = refs[0] if nested_select: try: dbset=db(db[table][field].belongs(dbset._select(db[otable][selfld]))) except ValueError: return Row({'status':400,'pattern':pattern, 'error':'invalid path','response':None}) else: items = [item.id for item in dbset.select(db[otable][selfld])] dbset=db(db[table][field].belongs(items)) else: table = ref if not otable and isinstance(queries,dict): dbset = db(queries[table]) dbset=dbset(db[table]) elif tag==':field' and table: # print 're3:'+tag field = args[i] if not field in db[table]: break # hand-built patterns should respect .readable=False as well if not db[table][field].readable: return Row({'status':418,'pattern':pattern, 'error':'I\'m a teapot','response':None}) try: distinct = vars.get('distinct', False) == 'True' offset = long(vars.get('offset',None) or 0) limits = (offset,long(vars.get('limit',None) or 1000)+offset) except ValueError: return Row({'status':400,'error':'invalid limits','response':None}) items = dbset.select(db[table][field], distinct=distinct, limitby=limits) if items: return Row({'status':200,'response':items, 'pattern':pattern}) else: return Row({'status':404,'pattern':pattern, 'error':'no record found','response':None}) elif tag != args[i]: break otable = table i += 1 if i == len(tags) and table: if hasattr(db[table], '_id'): ofields = vars.get('order', db[table]._id.name).split('|') else: ofields = vars.get('order', db[table]._primarykey[0]).split('|') try: orderby = [db[table][f] if not f.startswith('~') else ~db[table][f[1:]] for f in ofields] except (KeyError, AttributeError): return Row({'status':400,'error':'invalid orderby','response':None}) if exposedfields: fields = [field for field in db[table] if str(field).split('.')[-1] in exposedfields and field.readable] else: fields = [field for field in db[table] if field.readable] count = dbset.count() try: offset = long(vars.get('offset',None) or 0) limits = (offset,long(vars.get('limit',None) or 1000)+offset) except ValueError: return Row({'status':400,'error':'invalid limits','response':None}) #if count > limits[1]-limits[0]: # return Row({'status':400,'error':'too many records','response':None}) try: response = dbset.select(limitby=limits,orderby=orderby,*fields) except ValueError: return Row({'status':400,'pattern':pattern, 'error':'invalid path','response':None}) return Row({'status':200,'response':response, 'pattern':pattern,'count':count}) return Row({'status':400,'error':'no matching pattern','response':None}) def define_table( self, tablename, *fields, **args ): if not fields and 'fields' in args: fields = args.get('fields',()) if not isinstance(tablename, str): if isinstance(tablename, unicode): try: tablename = str(tablename) except UnicodeEncodeError: raise SyntaxError("invalid unicode table name") else: raise SyntaxError("missing table name") elif hasattr(self,tablename) or tablename in self.tables: if args.get('redefine',False): delattr(self, tablename) else: raise SyntaxError('table already defined: %s' % tablename) elif tablename.startswith('_') or hasattr(self,tablename) or \ REGEX_PYTHON_KEYWORDS.match(tablename): raise SyntaxError('invalid table name: %s' % tablename) elif self.check_reserved: self.check_reserved_keyword(tablename) else: invalid_args = set(args)-TABLE_ARGS if invalid_args: raise SyntaxError('invalid table "%s" attributes: %s' \ % (tablename,invalid_args)) if self._lazy_tables and tablename not in self._LAZY_TABLES: self._LAZY_TABLES[tablename] = (tablename,fields,args) table = None else: table = self.lazy_define_table(tablename,*fields,**args) if not tablename in self.tables: self.tables.append(tablename) return table def lazy_define_table( self, tablename, *fields, **args ): args_get = args.get common_fields = self._common_fields if common_fields: fields = list(fields) + list(common_fields) table_class = args_get('table_class',Table) table = table_class(self, tablename, *fields, **args) table._actual = True self[tablename] = table # must follow above line to handle self references table._create_references() for field in table: if field.requires == DEFAULT: field.requires = auto_validators(field) if field.represent is None: field.represent = auto_represent(field) migrate = self._migrate_enabled and args_get('migrate',self._migrate) if migrate and not self._uri in (None,'None') \ or self._adapter.dbengine=='google:datastore': fake_migrate = self._fake_migrate_all or \ args_get('fake_migrate',self._fake_migrate) polymodel = args_get('polymodel',None) try: GLOBAL_LOCKER.acquire() self._lastsql = self._adapter.create_table( table,migrate=migrate, fake_migrate=fake_migrate, polymodel=polymodel) finally: GLOBAL_LOCKER.release() else: table._dbt = None on_define = args_get('on_define',None) if on_define: on_define(table) return table def as_dict(self, flat=False, sanitize=True): db_uid = uri = None if not sanitize: uri, db_uid = (self._uri, self._db_uid) db_as_dict = dict( tables=[], uri=uri, db_uid=db_uid, **dict( [(k, getattr(self, "_" + k, None)) for k in [ 'pool_size', 'folder', 'db_codec', 'check_reserved', 'migrate', 'fake_migrate', 'migrate_enabled', 'fake_migrate_all', 'decode_credentials', 'driver_args', 'adapter_args', 'attempts', 'bigint_id', 'debug', 'lazy_tables', 'do_connect']])) for table in self: db_as_dict["tables"].append(table.as_dict(flat=flat, sanitize=sanitize)) return db_as_dict def __contains__(self, tablename): try: return tablename in self.tables except AttributeError: # The instance has no .tables attribute yet return False def __iter__(self): for tablename in self.tables: yield self[tablename] def __getitem__(self, key): return self.__getattr__(str(key)) def __getattr__(self, key): if object.__getattribute__(self, '_lazy_tables') and \ key in object.__getattribute__(self, '_LAZY_TABLES'): tablename, fields, args = self._LAZY_TABLES.pop(key) return self.lazy_define_table(tablename, *fields, **args) return super(DAL, self).__getattr__(key) def __setattr__(self, key, value): if key[:1] != '_' and key in self: raise SyntaxError( 'Object %s exists and cannot be redefined' % key) return super(DAL, self).__setattr__(key, value) def __repr__(self): if hasattr(self, '_uri'): return '' % hide_password(self._adapter.uri) else: return '' % self._db_uid def smart_query(self, fields, text): return Set(self, smart_query(fields, text)) def __call__(self, query=None, ignore_common_filters=None): if isinstance(query, Table): query = self._adapter.id_query(query) elif isinstance(query, Field): query = query!=None elif isinstance(query, dict): icf = query.get("ignore_common_filters") if icf: ignore_common_filters = icf return Set(self, query, ignore_common_filters=ignore_common_filters) def commit(self): self._adapter.commit() def rollback(self): self._adapter.rollback() def close(self): self._adapter.close() if self._db_uid in THREAD_LOCAL.db_instances: db_group = THREAD_LOCAL.db_instances[self._db_uid] db_group.remove(self) if not db_group: del THREAD_LOCAL.db_instances[self._db_uid] def executesql(self, query, placeholders=None, as_dict=False, fields=None, colnames=None, as_ordered_dict=False): """ Executes an arbitrary query Args: query (str): the query to submit to the backend placeholders: is optional and will always be None. If using raw SQL with placeholders, placeholders may be a sequence of values to be substituted in or, (if supported by the DB driver), a dictionary with keys matching named placeholders in your SQL. as_dict: will always be None when using DAL. If using raw SQL can be set to True and the results cursor returned by the DB driver will be converted to a sequence of dictionaries keyed with the db field names. Results returned with as_dict=True are the same as those returned when applying .to_list() to a DAL query. If "as_ordered_dict"=True the behaviour is the same as when "as_dict"=True with the keys (field names) guaranteed to be in the same order as returned by the select name executed on the database. fields: list of DAL Fields that match the fields returned from the DB. The Field objects should be part of one or more Table objects defined on the DAL object. The "fields" list can include one or more DAL Table objects in addition to or instead of including Field objects, or it can be just a single table (not in a list). In that case, the Field objects will be extracted from the table(s). Note: if either `fields` or `colnames` is provided, the results will be converted to a DAL `Rows` object using the `db._adapter.parse()` method colnames: list of field names in tablename.fieldname format Note: It is also possible to specify both "fields" and the associated "colnames". In that case, "fields" can also include DAL Expression objects in addition to Field objects. For Field objects in "fields", the associated "colnames" must still be in tablename.fieldname format. For Expression objects in "fields", the associated "colnames" can be any arbitrary labels. DAL Table objects referred to by "fields" or "colnames" can be dummy tables and do not have to represent any real tables in the database. Also, note that the "fields" and "colnames" must be in the same order as the fields in the results cursor returned from the DB. """ adapter = self._adapter if placeholders: adapter.execute(query, placeholders) else: adapter.execute(query) if as_dict or as_ordered_dict: if not hasattr(adapter.cursor,'description'): raise RuntimeError("database does not support executesql(...,as_dict=True)") # Non-DAL legacy db query, converts cursor results to dict. # sequence of 7-item sequences. each sequence tells about a column. # first item is always the field name according to Python Database API specs columns = adapter.cursor.description # reduce the column info down to just the field names fields = colnames or [f[0] for f in columns] if len(fields) != len(set(fields)): raise RuntimeError("Result set includes duplicate column names. Specify unique column names using the 'colnames' argument") #: avoid bytes strings in columns names (py3) if columns and not PY2: for i in range(0, len(fields)): if isinstance(fields[i], bytes): fields[i] = fields[i].decode("utf8") # will hold our finished resultset in a list data = adapter._fetchall() # convert the list for each row into a dictionary so it's # easier to work with. row['field_name'] rather than row[0] if as_ordered_dict: _dict = OrderedDict else: _dict = dict return [_dict(zip(fields,row)) for row in data] try: data = adapter._fetchall() except: return None if fields or colnames: fields = [] if fields is None else fields if not isinstance(fields, list): fields = [fields] extracted_fields = [] for field in fields: if isinstance(field, Table): extracted_fields.extend([f for f in field]) else: extracted_fields.append(field) if not colnames: colnames = ['%s.%s' % (f.tablename, f.name) for f in extracted_fields] data = adapter.parse( data, fields=extracted_fields, colnames=colnames) return data def _remove_references_to(self, thistable): for table in self: table._referenced_by = [field for field in table._referenced_by if not field.table==thistable] def has_representer(self, name): return callable(self.representers.get(name)) def represent(self, name, *args, **kwargs): return self.representers[name](*args, **kwargs) def export_to_csv_file(self, ofile, *args, **kwargs): step = long(kwargs.get('max_fetch_rows,',500)) write_colnames = kwargs['write_colnames'] = \ kwargs.get("write_colnames", True) for table in self.tables: ofile.write('TABLE %s\r\n' % table) query = self._adapter.id_query(self[table]) nrows = self(query).count() kwargs['write_colnames'] = write_colnames for k in range(0,nrows,step): self(query).select(limitby=(k,k+step)).export_to_csv_file( ofile, *args, **kwargs) kwargs['write_colnames'] = False ofile.write('\r\n\r\n') ofile.write('END') def import_from_csv_file(self, ifile, id_map=None, null='', unique='uuid', map_tablenames=None, ignore_missing_tables=False, *args, **kwargs): #if id_map is None: id_map={} id_offset = {} # only used if id_map is None map_tablenames = map_tablenames or {} for line in ifile: line = line.strip() if not line: continue elif line == 'END': return elif not line.startswith('TABLE ') or \ not line[6:] in self.tables: raise SyntaxError('invalid file format') else: tablename = line[6:] tablename = map_tablenames.get(tablename,tablename) if tablename is not None and tablename in self.tables: self[tablename].import_from_csv_file( ifile, id_map, null, unique, id_offset, *args, **kwargs) elif tablename is None or ignore_missing_tables: # skip all non-empty lines for line in ifile: if not line.strip(): break else: raise RuntimeError("Unable to import table that does not exist.\nTry db.import_from_csv_file(..., map_tablenames={'table':'othertable'},ignore_missing_tables=True)") def can_join(self): return self._adapter.can_join() def DAL_unpickler(db_uid): return DAL('', db_uid=db_uid) def DAL_pickler(db): return DAL_unpickler, (db._db_uid,) copyreg.pickle(DAL, DAL_pickler, DAL_unpickler) web2py-2.12.3.orig/gluon/packages/dal/pydal/_compat.py0000664000000000000000000000417612564727432021241 0ustar rootrootimport sys import hashlib import os PY2 = sys.version_info[0] == 2 _identity = lambda x: x if PY2: import cPickle as pickle from cStringIO import StringIO import copy_reg as copyreg reduce = reduce hashlib_md5 = hashlib.md5 iterkeys = lambda d: d.iterkeys() itervalues = lambda d: d.itervalues() iteritems = lambda d: d.iteritems() integer_types = (int, long) string_types = (str, unicode) basestring = basestring xrange = xrange def to_unicode(obj): if isinstance(obj, str): return obj.decode('utf8') if not isinstance(obj, unicode): return unicode(obj) return obj def implements_iterator(cls): cls.next = cls.__next__ del cls.__next__ return cls def implements_bool(cls): cls.__nonzero__ = cls.__bool__ del cls.__bool__ return cls else: import pickle from io import StringIO import copyreg from functools import reduce hashlib_md5 = lambda s: hashlib.md5(bytes(s, 'utf8')) iterkeys = lambda d: iter(d.keys()) itervalues = lambda d: iter(d.values()) iteritems = lambda d: iter(d.items()) integer_types = (int,) string_types = (str,) basestring = str xrange = range def to_unicode(obj): if isinstance(obj, bytes): return obj.decode('utf8') if not isinstance(obj, str): return str(obj) return obj implements_iterator = _identity implements_bool = _identity def with_metaclass(meta, *bases): """Create a base class with a metaclass.""" # This requires a bit of explanation: the basic idea is to make a dummy # metaclass for one level of class instantiation that replaces itself with # the actual metaclass. class metaclass(meta): __call__ = type.__call__ __init__ = type.__init__ def __new__(cls, name, this_bases, d): if this_bases is None: return type.__new__(cls, name, (), d) return meta(name, bases, d) return metaclass('temporary_class', None, {}) # shortcuts pjoin = os.path.join exists = os.path.exists web2py-2.12.3.orig/gluon/packages/dal/AUTHORS0000664000000000000000000000050712564727432017176 0ustar rootroot- Massimo Di Pierro - Giovanni Barillari - Simone Bizzoto - Paolo Valleri - Niall Sweeny for MS SQL support - Marcel Leuthi for Oracle support - Chris Clark - clach05 - Denes Lengyel web2py-2.12.3.orig/gluon/packages/dal/appveyor.yml0000664000000000000000000000171512564727432020520 0ustar rootrootbuild: false services: - mssql2014 environment: matrix: - PYTHON: "C:/Python27" adapter: "mssql" - PYTHON: "C:/Python27" adapter: "mssqln" - PYTHON: "C:/Python33" adapter: "mssql" - PYTHON: "C:/Python33" adapter: "mssqln" - PYTHON: "C:/Python34" adapter: "mssql" - PYTHON: "C:/Python34" adapter: "mssqln" clone_depth: 50 init: - "ECHO %PYTHON%" - set PATH=%PYTHON%;%PYTHON%\Scripts;%PATH% install: - ps: Start-FileDownload https://bootstrap.pypa.io/get-pip.py - python get-pip.py - pip install tox==1.9.2 - pip install codecov before_test: - ps: | while($LASTEXITCODE -ne 0) { & sqlcmd -S "(local)\SQL2014" -b -U "sa" -P "Password12!" -Q "CREATE DATABASE pydal COLLATE Latin1_General_CS_AS;" -d "master" sleep 10; $val++; Write-Host Waiting ... $val; if($val -ge 10) {break} } test_script: - tox -e coverage-%adapter% after_test: - codecovweb2py-2.12.3.orig/gluon/packages/dal/README.md0000664000000000000000000000421112564727432017401 0ustar rootroot# pyDAL pyDAL is a pure Python Database Abstraction Layer. It dynamically generates the SQL in real time using the specified dialect for the database back end, so that you do not have to write SQL code or learn different SQL dialects (the term SQL is used generically), and your code will be portable among different types of databases. pyDAL comes from the original web2py's DAL, with the aim of being wide-compatible. pyDAL doesn't require web2py and can be used in any Python context. [![pip version](https://img.shields.io/pypi/v/pydal.svg?style=flat-square)](https://pypi.python.org/pypi/pydal) [![Build Status](https://img.shields.io/travis/web2py/pydal/master.svg?style=flat-square&label=Travis-CI)](https://travis-ci.org/web2py/pydal) [![MS Build Status](https://img.shields.io/appveyor/ci/web2py/pydal/master.svg?style=flat-square&label=Appveyor-CI)](https://ci.appveyor.com/project/web2py/pydal) [![Coverage Status](https://img.shields.io/codecov/c/github/web2py/pydal.svg?style=flat-square)](https://codecov.io/github/web2py/pydal) [![API Docs Status](https://readthedocs.org/projects/pydal/badge/?version=latest&style=flat-square)](http://pydal.rtfd.org/) ## Installation You can install pyDAL using pip: pip install pyDAL ## Usage and documentation Here is a quick example: >>> from pydal import DAL, Field >>> db = DAL('sqlite://storage.db') >>> db.define_table('thing',Field('name')) >>> db.thing.insert(name='Chair') >>> query = db.thing.name.startswith('C') >>> rows = db(query).select() >>> print rows[0].name Chair >>> db.commit() The complete documentation is available on http://www.web2py.com/books/default/chapter/29/06/the-database-abstraction-layer ## What's in the box? A little *taste* of pyDAL features: * Transactions * Aggregates * Inner Joins * Outer Joins * Nested Selects ## Which databases are supported? pyDAL actually support these databases: * sqlite * postgresql * mysql * mssql * db2 * firebird * sybase * oracle * informix * teradata * sapdb * ingres * cubrid * imap * mongodb ## License pyDAL is released under the BSD-3c License. For further details, please check the `LICENSE` file. web2py-2.12.3.orig/gluon/packages/dal/tox.ini0000664000000000000000000000217712564727434017450 0ustar rootroot[tox] envlist = {py26,py27,pypy,py33,py34}-{sqlite,mongo,postgresPG8000,mysql}, {py26,py27,py33,py34}-{postgres,postgres2}, {py26,py27,pypy}-imap, py27-{google,mssql} [testenv] setenv = sqlite: DB=sqlite:///tmp/storage.sqlite mysql: DB=mysql://root:@localhost/pydal postgres: DB=postgres://postgres:@localhost/pydal postgresPG8000: DB=postgres:pg8000://postgres:@localhost/pydal postgres2: DB=postgres2:psycopg2://postgres:@localhost/pydal google: DB=google:datastore mongo: DB=mongodb://localhost/pydal imap: DB=imap://imap:imap@localhost:993 mssql: DB=mssql4://sa:Password12!@(local)\SQL2014/pydal mssqln: DB=mssql4n://sa:Password12!@(local)\SQL2014/pydal deps = py26: unittest2 mysql: pymysql postgres: psycopg2 postgres2: psycopg2 postgresPG8000: pg8000 google: pyyaml mongo: pymongo mssql: pypyodbc mssqln: pypyodbc coverage: coverage commands = py26: {envpython} -m unittest2.__main__ -v tests py27,pypy,py33,py34: {envpython} -m unittest -v tests coverage: coverage erase coverage: coverage run -m unittest -v tests coverage: coverage combine web2py-2.12.3.orig/gluon/packages/dal/docs/0000775000000000000000000000000012564727432017054 5ustar rootrootweb2py-2.12.3.orig/gluon/packages/dal/docs/pydal.helpers.rst0000664000000000000000000000123012564727432022354 0ustar rootrootpydal.helpers package ========================= Submodules ---------- pydal.helpers.classes module -------------------------------- .. automodule:: pydal.helpers.classes :members: :undoc-members: :show-inheritance: pydal.helpers.methods module -------------------------------- .. automodule:: pydal.helpers.methods :members: :undoc-members: :show-inheritance: pydal.helpers.regex module ------------------------------ .. automodule:: pydal.helpers.regex :members: :undoc-members: :show-inheritance: Module contents --------------- .. automodule:: pydal.helpers :members: :undoc-members: :show-inheritance: web2py-2.12.3.orig/gluon/packages/dal/docs/pydal.adapters.rst0000664000000000000000000000542212564727432022524 0ustar rootrootpydal.adapters package ========================== Submodules ---------- pydal.adapters.base module ------------------------------ .. automodule:: pydal.adapters.base :members: :undoc-members: :show-inheritance: pydal.adapters.couchdb module --------------------------------- .. automodule:: pydal.adapters.couchdb :members: :undoc-members: :show-inheritance: pydal.adapters.cubrid module -------------------------------- .. automodule:: pydal.adapters.cubrid :members: :undoc-members: :show-inheritance: pydal.adapters.db2 module ----------------------------- .. automodule:: pydal.adapters.db2 :members: :undoc-members: :show-inheritance: pydal.adapters.firebird module ---------------------------------- .. automodule:: pydal.adapters.firebird :members: :undoc-members: :show-inheritance: pydal.adapters.google_adapters module ----------------------------------------- Adapter for GAE pydal.adapters.imap module ------------------------------ .. automodule:: pydal.adapters.imap :members: :undoc-members: :show-inheritance: pydal.adapters.informix module ---------------------------------- .. automodule:: pydal.adapters.informix :members: :undoc-members: :show-inheritance: pydal.adapters.ingres module -------------------------------- .. automodule:: pydal.adapters.ingres :members: :undoc-members: :show-inheritance: pydal.adapters.mongo module ------------------------------- .. automodule:: pydal.adapters.mongo :members: :undoc-members: :show-inheritance: pydal.adapters.mssql module ------------------------------- .. automodule:: pydal.adapters.mssql :members: :undoc-members: :show-inheritance: pydal.adapters.mysql module ------------------------------- .. automodule:: pydal.adapters.mysql :members: :undoc-members: :show-inheritance: pydal.adapters.oracle module -------------------------------- .. automodule:: pydal.adapters.oracle :members: :undoc-members: :show-inheritance: pydal.adapters.postgres module --------------------------------- .. automodule:: pydal.adapters.postgres :members: :undoc-members: :show-inheritance: pydal.adapters.sapdb module ------------------------------- .. automodule:: pydal.adapters.sapdb :members: :undoc-members: :show-inheritance: pydal.adapters.sqlite module -------------------------------- .. automodule:: pydal.adapters.sqlite :members: :undoc-members: :show-inheritance: pydal.adapters.teradata module ---------------------------------- .. automodule:: pydal.adapters.teradata :members: :undoc-members: :show-inheritance: Module contents --------------- .. automodule:: pydal.adapters :members: :undoc-members: :show-inheritance: web2py-2.12.3.orig/gluon/packages/dal/docs/index.rst0000664000000000000000000000150112564727432020712 0ustar rootroot Welcome to pyDAL's API documentation! ====================================== Contents: .. toctree:: :maxdepth: 4 Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` Subpackages ----------- .. toctree:: pydal.adapters pydal.helpers Submodules ---------- pydal.base module --------------------- .. automodule:: pydal.base :members: :undoc-members: :show-inheritance: pydal.connection module --------------------------- .. automodule:: pydal.connection :members: :undoc-members: :show-inheritance: pydal.objects module ------------------------ .. automodule:: pydal.objects :members: :undoc-members: :show-inheritance: Module contents --------------- .. automodule:: pydal :members: :undoc-members: :show-inheritance: web2py-2.12.3.orig/gluon/packages/dal/docs/conf.py0000664000000000000000000001741612564727432020364 0ustar rootroot# -*- coding: utf-8 -*- # # web2py documentation build configuration file, created by # sphinx-quickstart on Sun Aug 18 20:05:19 2013. # # 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, shutil on_rtd = os.environ.get('READTHEDOCS', None) == 'True' if not on_rtd: # only import and set the theme if we're building docs locally import sphinx_rtd_theme html_theme = 'sphinx_rtd_theme' html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] # 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.insert(0, os.path.abspath('..')) import pkg_resources version_ = pkg_resources.get_distribution('pyDAL').version release_ = version_ # -- 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.coverage', 'sphinx.ext.viewcode', 'sphinxcontrib.napoleon'] # 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'pyDAL' copyright = u'2014, web2py-developers' # 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_ # The full version, including alpha/beta/rc tags. release = 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 = [] # If true, keep warnings as "system message" paragraphs in the built documents. #keep_warnings = False # -- Options for HTML output --------------------------------------------------- # 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 = None # 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 = False # 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 = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'pyDALdoc' # -- Options for LaTeX output -------------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). #'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). #'pointsize': '10pt', # Additional stuff for the LaTeX preamble. #'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ('index', 'pydal.tex', u'pyDAL Documentation', u'web2py-developers', '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 # 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', 'pyDAL', u'pyDAL Documentation', [u'web2py-developers'], 1) ] # If true, show URL addresses after external links. #man_show_urls = False # -- Options for Texinfo output ------------------------------------------------ # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ('index', 'pyDAL', u'pyDAL Documentation', u'web2py-developers', 'pyDAL', 'pyDAL', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. #texinfo_appendices = [] # If false, no module index is generated. #texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. #texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. #texinfo_no_detailmenu = False web2py-2.12.3.orig/gluon/packages/dal/docs/requirements.txt0000664000000000000000000000003512564727432022336 0ustar rootrootsphinxcontrib-napoleon>=0.2.4web2py-2.12.3.orig/gluon/packages/dal/docs/Makefile0000664000000000000000000001514612564727432020523 0ustar rootroot# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # User-friendly check for sphinx-build ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) endif # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext 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 " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " xml to make Docutils-native XML files" @echo " pseudoxml to make pseudoxml-XML files for display purposes" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" 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/gluon.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/gluon.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/gluon" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/gluon" @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." latexpdfja: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through platex and dvipdfmx..." $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja @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." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." 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." xml: $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml @echo @echo "Build finished. The XML files are in $(BUILDDIR)/xml." pseudoxml: $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml @echo @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." web2py-2.12.3.orig/gluon/packages/dal/MANIFEST.in0000664000000000000000000000024612564727432017664 0ustar rootrootinclude LICENSE include AUTHORS include CHANGES recursive-include tests * recursive-exclude tests .DS_Store recursive-include docs * recursive-exclude docs .DS_Store web2py-2.12.3.orig/gluon/packages/dal/tests/0000775000000000000000000000000012564727434017270 5ustar rootrootweb2py-2.12.3.orig/gluon/packages/dal/tests/smart_query.py0000664000000000000000000003103712564727434022221 0ustar rootrootfrom ._compat import unittest from ._adapt import DEFAULT_URI, IS_GAE, IS_IMAP, drop from pydal._compat import integer_types from pydal import DAL, Field from pydal.helpers.methods import smart_query @unittest.skipIf(IS_IMAP, "Skip nosql") class TestSmartQuery(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) # ----------------------------------------------------------------------------- # Seems further imports are required for the commented field types below # db.define_table('referred_table', # Field('represent_field', 'string')) # NOTE : Don't forget to uncomment the line # drop(db.referred_table) at the very end below # if the above are uncommented db.define_table('a_table', Field('string_field', 'string'), Field('text_field', 'text'), Field('boolean_field', 'boolean'), Field('integer_field', 'integer'), Field('double_field', 'double'), # Field('decimal_field', 'decimal'), # Field('date_field', 'date'), # Field('time_field', 'time'), # Field('datetime_field', 'datetime'), # Field('reference_field', 'reference referred_table'), # Field('list_string_field', 'list:string'), # Field('list_integer_field', 'list:integer'), # Field('list_reference_field', 'list:reference referred_table') ) fields = [db.a_table.id, db.a_table.string_field, db.a_table.text_field, db.a_table.boolean_field, db.a_table.integer_field, db.a_table.double_field, # db.a_table.decimal_field, # db.a_table.date_field, # db.a_table.time_field, # db.a_table.reference_field, # db.a_table.list_string_field, # db.a_table.list_integer_field, # db.a_table.list_reference_field ] # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # Test with boolean field # Operator under test # operators = \ # [(' starts with ','startswith'), # (' ends with ','endswith'), # ('contains', 'N/A'), # ('like', 'N/A') # ] # # keywords = 'a_table.boolean_field = True' q = (db.a_table.boolean_field == True) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) if not IS_GAE: # Test string field query # starts with keywords = 'a_table.string_field starts with "pydal"' q = (db.a_table.string_field.startswith('pydal')) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # ends with keywords = 'a_table.string_field ends with "Rocks!!"' q = (db.a_table.string_field.endswith('Rocks!!')) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # contains keywords = 'a_table.string_field contains "Rocks"' q = (db.a_table.string_field.contains('Rocks')) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # Don't work for some reason # # like # keywords = 'a_table.string_field like "%Rocks%"' # q = (db.a_table.string_field.like('%Rocks%')) # smart_q = smart_query(fields, keywords) # self.assertTrue(smart_q == q) # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # Tests with integer field # For generating these tests # def generate_tests(): # operators = \ # [('=', '='), # ('==', '='), # (' is ','='), # (' equal ', '='), # (' equals ', '='), # (' equal to ', '='), # ('<>', '!='), # (' not equal ', '!='), # (' not equal to ', '!='), # ('<', '<'), # (' less than ', '<'), # ('<=', '<='), # ('=<', '<='), # (' less or equal ', '<='), # (' less or equal than ', '<='), # (' equal or less ', '<='), # (' equal or less than ', '<='), # ('>', '>'), # (' greater than ', '>'), # ('=>', '>='), # ('>=', '>='), # (' greater or equal ', '>='), # (' greater or equal than ', '>='), # (' equal or greater ', '>='), # (' equal or greater than ', '>=')] # JUST APPEND MORE OPERATORS HERE # # for op in operators: # print """ # # {op} # keywords = 'a_table.integer_field {test_op} 1' # q = (db.a_table.integer_field {result_op} 1) # smart_q = smart_query(fields, keywords) # self.assertTrue(smart_q == q)""".format(op=op, # test_op=op[0], # result_op='==' if op[1] == '=' else op[1]) # ('=', '=') keywords = 'a_table.integer_field = 1' q = (db.a_table.integer_field == 1) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # ('==', '=') keywords = 'a_table.integer_field == 1' q = (db.a_table.integer_field == 1) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # (' is ','=') keywords = 'a_table.integer_field is 1' q = (db.a_table.integer_field == 1) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # (' equal ', '=') keywords = 'a_table.integer_field equal 1' q = (db.a_table.integer_field == 1) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # (' equals ', '=') keywords = 'a_table.integer_field equals 1' q = (db.a_table.integer_field == 1) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # (' equal to ', '=') keywords = 'a_table.integer_field equal to 1' q = (db.a_table.integer_field == 1) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # This one not allow over integer it seems # # ('<>', '!=') # keywords = 'a_table.integer_field <> 1' # q = (db.a_table.integer_field != 1) # smart_q = smart_query(fields, keywords) # self.assertTrue(smart_q == q) # (' not equal ', '!=') keywords = 'a_table.integer_field not equal 1' q = (db.a_table.integer_field != 1) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # (' not equal to ', '!=') keywords = 'a_table.integer_field not equal to 1' q = (db.a_table.integer_field != 1) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # ('<', '<') keywords = 'a_table.integer_field < 1' q = (db.a_table.integer_field < 1) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # (' less than ', '<') keywords = 'a_table.integer_field less than 1' q = (db.a_table.integer_field < 1) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # ('<=', '<=') keywords = 'a_table.integer_field <= 1' q = (db.a_table.integer_field <= 1) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # This one is invalid, maybe we should remove it from smart_query # # ('=<', '<=') # keywords = 'a_table.integer_field =< 1' # q = (db.a_table.integer_field <= 1) # smart_q = smart_query(fields, keywords) # self.assertTrue(smart_q == q) # (' less or equal ', '<=') keywords = 'a_table.integer_field less or equal 1' q = (db.a_table.integer_field <= 1) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # (' less or equal than ', '<=') keywords = 'a_table.integer_field less or equal than 1' q = (db.a_table.integer_field <= 1) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # (' equal or less ', '<=') keywords = 'a_table.integer_field equal or less 1' q = (db.a_table.integer_field <= 1) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # (' equal or less than ', '<=') keywords = 'a_table.integer_field equal or less than 1' q = (db.a_table.integer_field <= 1) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # ('>', '>') keywords = 'a_table.integer_field > 1' q = (db.a_table.integer_field > 1) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # (' greater than ', '>') keywords = 'a_table.integer_field greater than 1' q = (db.a_table.integer_field > 1) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # This one is invalid, maybe we should remove it from smart_query # # ('=>', '>=') # keywords = 'a_table.integer_field => 1' # q = (db.a_table.integer_field >= 1) # smart_q = smart_query(fields, keywords) # self.assertTrue(smart_q == q) # ('>=', '>=') keywords = 'a_table.integer_field >= 1' q = (db.a_table.integer_field >= 1) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # (' greater or equal ', '>=') keywords = 'a_table.integer_field greater or equal 1' q = (db.a_table.integer_field >= 1) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # (' greater or equal than ', '>=') keywords = 'a_table.integer_field greater or equal than 1' q = (db.a_table.integer_field >= 1) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # (' equal or greater ', '>=') keywords = 'a_table.integer_field equal or greater 1' q = (db.a_table.integer_field >= 1) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # (' equal or greater than ', '>=') keywords = 'a_table.integer_field equal or greater than 1' q = (db.a_table.integer_field >= 1) smart_q = smart_query(fields, keywords) self.assertEqual(smart_q, q) # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # Belongs and not belongs # NOTE : The below tests don't works # Issue : https://github.com/web2py/pydal/issues/161 # (' in ', 'belongs') -> field.belongs(1, 2, 3) # keywords = 'a_table.integer_field in "1, 2, 3"' # q = (db.a_table.integer_field.belongs([1, 2, 3])) # smart_q = smart_query(fields, keywords) # self.assertEqual(smart_q, q) # keywords = 'a_table.id in "1, 2, 3"' # q = (db.a_table.id.belongs([1, 2, 3])) # smart_q = smart_query(fields, keywords) # self.assertEqual(smart_q, q) # # # (' not in ' , 'notbelongs'), # keywords = 'a_table.integer_field not in "1, 2, 3"' # q = (~db.a_table.id.belongs([1, 2, 3])) # smart_q = smart_query(fields, keywords) # self.assertTrue(smart_q == q) # ----------------------------------------------------------------------------- # cleanup table drop(db.a_table) # drop(db.referred_table) # ----------------------------------------------------------------------------- if __name__ == '__main__': unittest.main() web2py-2.12.3.orig/gluon/packages/dal/tests/__init__.py0000664000000000000000000000031012564727434021373 0ustar rootrootfrom ._adapt import NOSQL if NOSQL: from .nosql import * else: from .sql import * from .base import * from .validation import * from .caching import TestCache from .smart_query import * web2py-2.12.3.orig/gluon/packages/dal/tests/sql.py0000664000000000000000000025207512564727434020454 0ustar rootroot# -*- coding: utf-8 -*- """ Basic unit tests """ from __future__ import print_function import sys import os import glob import datetime from pydal._compat import PY2, basestring, StringIO, integer_types from pydal import DAL, Field from pydal.helpers.classes import SQLALL from pydal.objects import Table from ._compat import unittest from ._adapt import DEFAULT_URI, IS_POSTGRESQL, IS_SQLITE long = integer_types[-1] print('Testing against %s engine (%s)' % (DEFAULT_URI.partition(':')[0], DEFAULT_URI)) ALLOWED_DATATYPES = [ 'string', 'text', 'integer', 'boolean', 'double', 'blob', 'date', 'time', 'datetime', 'upload', 'password', 'json', 'bigint' ] def setUpModule(): pass def tearDownModule(): if os.path.isfile('sql.log'): os.unlink('sql.log') for a in glob.glob('*.table'): os.unlink(a) class TestFields(unittest.TestCase): def testFieldName(self): """ - a "str" something - not a method or property of Table - "dotted-notation" friendly: - a valid python identifier - not a python keyword - not starting with underscore or an integer - not containing dots Basically, anything alphanumeric, no symbols, only underscore as punctuation """ # Check that Fields cannot start with underscores self.assertRaises(SyntaxError, Field, '_abc', 'string') # Check that Fields cannot contain punctuation other than underscores self.assertRaises(SyntaxError, Field, 'a.bc', 'string') # Check that Fields cannot be a name of a method or property of Table for x in ['drop', 'on', 'truncate']: self.assertRaises(SyntaxError, Field, x, 'string') # Check that Fields allows underscores in the body of a field name. self.assertTrue(Field('a_bc', 'string'), "Field isn't allowing underscores in fieldnames. It should.") # Check that Field names don't allow a python keyword self.assertRaises(SyntaxError, Field, 'True', 'string') self.assertRaises(SyntaxError, Field, 'elif', 'string') self.assertRaises(SyntaxError, Field, 'while', 'string') # Check that Field names don't allow a non-valid python identifier non_valid_examples = ["1x", "xx$%@%", "xx yy", "yy\na", "yy\n"] for a in non_valid_examples: self.assertRaises(SyntaxError, Field, a, 'string') # Check that Field names don't allow a unicode string non_valid_examples = non_valid_examples = ["ℙƴ☂ℌøἤ", u"ℙƴ☂ℌøἤ", u'àè', u'ṧøмℯ', u'тεṧт', u'♥αłüℯṧ', u'ℊεᾔ℮яαт℮∂', u'♭ƴ', u'ᾔ☤ρℌℓ☺ḓ'] for a in non_valid_examples: self.assertRaises(SyntaxError, Field, a, 'string') def testFieldTypes(self): # Check that string, and password default length is 512 for typ in ['string', 'password']: self.assertTrue(Field('abc', typ).length == 512, "Default length for type '%s' is not 512 or 255" % typ) # Check that upload default length is 512 self.assertTrue(Field('abc', 'upload').length == 512, "Default length for type 'upload' is not 512") # Check that Tables passed in the type creates a reference self.assertTrue(Field('abc', Table(None, 'temp')).type == 'reference temp', 'Passing a Table does not result in a reference type.') def testFieldLabels(self): # Check that a label is successfully built from the supplied fieldname self.assertTrue(Field('abc', 'string').label == 'Abc', 'Label built is incorrect') self.assertTrue(Field('abc_def', 'string').label == 'Abc Def', 'Label built is incorrect') def testFieldFormatters(self): # Formatter should be called Validator # Test the default formatters for typ in ALLOWED_DATATYPES: f = Field('abc', typ) if typ not in ['date', 'time', 'datetime']: isinstance(f.formatter('test'), str) else: isinstance(f.formatter(datetime.datetime.now()), str) def testRun(self): """Test all field types and their return values""" db = DAL(DEFAULT_URI, check_reserved=['all']) for ft in ['string', 'text', 'password', 'upload', 'blob']: db.define_table('tt', Field('aa', ft, default='')) self.assertEqual(db.tt.insert(aa='x'), 1) self.assertEqual(db().select(db.tt.aa)[0].aa, 'x') db.tt.drop() db.define_table('tt', Field('aa', 'integer', default=1)) self.assertEqual(db.tt.insert(aa=3), 1) self.assertEqual(db().select(db.tt.aa)[0].aa, 3) db.tt.drop() db.define_table('tt', Field('aa', 'string')) ucs = 'A\xc3\xa9 A' self.assertEqual(db.tt.insert(aa=ucs), 1) self.assertEqual(db().select(db.tt.aa)[0].aa, ucs) self.assertEqual(db().select(db.tt.aa.with_alias('zz'))[0].zz, ucs) db.tt.drop() db.define_table('tt', Field('aa', 'double', default=1)) self.assertEqual(db.tt.insert(aa=3.1), 1) self.assertEqual(db().select(db.tt.aa)[0].aa, 3.1) db.tt.drop() db.define_table('tt', Field('aa', 'boolean', default=True)) self.assertEqual(db.tt.insert(aa=True), 1) self.assertEqual(db().select(db.tt.aa)[0].aa, True) db.tt.drop() db.define_table('tt', Field('aa', 'json', default={})) # test different python objects for correct serialization in json objs = [ {'a' : 1, 'b' : 2}, [1, 2, 3], 'abc', True, False, None, 11, 14.3, long(11) ] for obj in objs: rtn_id = db.tt.insert(aa=obj) rtn = db(db.tt.id == rtn_id).select().first().aa self.assertEqual(obj, rtn) db.tt.drop() db.define_table('tt', Field('aa', 'date', default=datetime.date.today())) t0 = datetime.date.today() self.assertEqual(db.tt.insert(aa=t0), 1) self.assertEqual(db().select(db.tt.aa)[0].aa, t0) db.tt.drop() db.define_table('tt', Field('aa', 'datetime', default=datetime.datetime.today())) t0 = datetime.datetime( 1971, 12, 21, 10, 30, 55, 0, ) self.assertEqual(db.tt.insert(aa=t0), 1) self.assertEqual(db().select(db.tt.aa)[0].aa, t0) ## Row APIs row = db().select(db.tt.aa)[0] self.assertEqual(db.tt[1].aa,t0) self.assertEqual(db.tt['aa'],db.tt.aa) self.assertEqual(db.tt(1).aa,t0) self.assertTrue(db.tt(1,aa=None)==None) self.assertFalse(db.tt(1,aa=t0)==None) self.assertEqual(row.aa,t0) self.assertEqual(row['aa'],t0) self.assertEqual(row['tt.aa'],t0) self.assertEqual(row('tt.aa'),t0) ## Lazy and Virtual fields db.tt.b = Field.Virtual(lambda row: row.tt.aa) db.tt.c = Field.Lazy(lambda row: row.tt.aa) row = db().select(db.tt.aa)[0] self.assertEqual(row.b,t0) self.assertEqual(row.c(),t0) db.tt.drop() db.define_table('tt', Field('aa', 'time', default='11:30')) t0 = datetime.time(10, 30, 55) self.assertEqual(db.tt.insert(aa=t0), 1) self.assertEqual(db().select(db.tt.aa)[0].aa, t0) db.tt.drop() db.close() class TestTables(unittest.TestCase): def testTableNames(self): """ - a "str" something - not a method or property of DAL - "dotted-notation" friendly: - a valid python identifier - not a python keyword - not starting with underscore or an integer - not containing dots Basically, anything alphanumeric, no symbols, only underscore as punctuation """ # Check that Tables cannot start with underscores self.assertRaises(SyntaxError, Table, None, '_abc') # Check that Tables cannot contain punctuation other than underscores self.assertRaises(SyntaxError, Table, None, 'a.bc') # Check that Tables cannot be a name of a method or property of DAL for x in ['define_table', 'tables', 'as_dict']: self.assertRaises(SyntaxError, Table, None, x) # Check that Table allows underscores in the body of a field name. self.assertTrue(Table(None, 'a_bc'), "Table isn't allowing underscores in tablename. It should.") # Check that Table names don't allow a python keyword self.assertRaises(SyntaxError, Table, None, 'True') self.assertRaises(SyntaxError, Table, None, 'elif') self.assertRaises(SyntaxError, Table, None, 'while') # Check that Table names don't allow a non-valid python identifier non_valid_examples = ["1x", "xx$%@%", "xx yy", "yy\na", "yy\n"] for a in non_valid_examples: self.assertRaises(SyntaxError, Table, None, a) # Check that Table names don't allow a unicode string non_valid_examples = ["ℙƴ☂ℌøἤ", u"ℙƴ☂ℌøἤ", u'àè', u'ṧøмℯ', u'тεṧт', u'♥αłüℯṧ', u'ℊεᾔ℮яαт℮∂', u'♭ƴ', u'ᾔ☤ρℌℓ☺ḓ'] for a in non_valid_examples: self.assertRaises(SyntaxError, Table, None, a) class TestAll(unittest.TestCase): def setUp(self): self.pt = Table(None,'PseudoTable',Field('name'),Field('birthdate')) def testSQLALL(self): ans = 'PseudoTable.id, PseudoTable.name, PseudoTable.birthdate' self.assertEqual(str(SQLALL(self.pt)), ans) class TestTable(unittest.TestCase): def testTableCreation(self): # Check for error when not passing type other than Field or Table self.assertRaises(SyntaxError, Table, None, 'test', None) persons = Table(None, 'persons', Field('firstname','string'), Field('lastname', 'string')) # Does it have the correct fields? self.assertTrue(set(persons.fields).issuperset(set(['firstname', 'lastname']))) # ALL is set correctly self.assertTrue('persons.firstname, persons.lastname' in str(persons.ALL)) def testTableAlias(self): db = DAL(DEFAULT_URI, check_reserved=['all']) persons = Table(db, 'persons', Field('firstname', 'string'), Field('lastname', 'string')) aliens = persons.with_alias('aliens') # Are the different table instances with the same fields self.assertTrue(persons is not aliens) self.assertTrue(set(persons.fields) == set(aliens.fields)) db.close() def testTableInheritance(self): persons = Table(None, 'persons', Field('firstname', 'string'), Field('lastname', 'string')) customers = Table(None, 'customers', Field('items_purchased', 'integer'), persons) self.assertTrue(set(customers.fields).issuperset(set( ['items_purchased', 'firstname', 'lastname']))) class TestInsert(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa')) self.assertEqual(db.tt.insert(aa='1'), 1) self.assertEqual(db.tt.insert(aa='1'), 2) self.assertEqual(db.tt.insert(aa='1'), 3) self.assertEqual(db(db.tt.aa == '1').count(), 3) self.assertEqual(db(db.tt.aa == '2').isempty(), True) self.assertEqual(db(db.tt.aa == '1').update(aa='2'), 3) self.assertEqual(db(db.tt.aa == '2').count(), 3) self.assertEqual(db(db.tt.aa == '2').isempty(), False) self.assertEqual(db(db.tt.aa == '2').delete(), 3) self.assertEqual(db(db.tt.aa == '2').isempty(), True) db.tt.drop() db.close() class TestSelect(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa')) self.assertEqual(db.tt.insert(aa='1'), 1) self.assertEqual(db.tt.insert(aa='2'), 2) self.assertEqual(db.tt.insert(aa='3'), 3) self.assertEqual(db(db.tt.id > 0).count(), 3) self.assertEqual(db(db.tt.id > 0).select(orderby=~db.tt.aa | db.tt.id)[0].aa, '3') self.assertEqual(len(db(db.tt.id > 0).select(limitby=(1, 2))), 1) self.assertEqual(db(db.tt.id > 0).select(limitby=(1, 2))[0].aa, '2') self.assertEqual(len(db().select(db.tt.ALL)), 3) self.assertEqual(db(db.tt.aa == None).count(), 0) self.assertEqual(db(db.tt.aa != None).count(), 3) self.assertEqual(db(db.tt.aa > '1').count(), 2) self.assertEqual(db(db.tt.aa >= '1').count(), 3) self.assertEqual(db(db.tt.aa == '1').count(), 1) self.assertEqual(db(db.tt.aa != '1').count(), 2) self.assertEqual(db(db.tt.aa < '3').count(), 2) self.assertEqual(db(db.tt.aa <= '3').count(), 3) self.assertEqual(db(db.tt.aa > '1')(db.tt.aa < '3').count(), 1) self.assertEqual(db((db.tt.aa > '1') & (db.tt.aa < '3')).count(), 1) self.assertEqual(db((db.tt.aa > '1') | (db.tt.aa < '3')).count(), 3) self.assertEqual(db((db.tt.aa > '1') & ~(db.tt.aa > '2')).count(), 1) self.assertEqual(db(~(db.tt.aa > '1') & (db.tt.aa > '2')).count(), 0) # Test for REGEX_TABLE_DOT_FIELD self.assertEqual(db(db.tt).select('tt.aa').first()[db.tt.aa], '1') db.tt.drop() db.close() def testTestQuery(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db._adapter.execute_test_query() db.close() def testListInteger(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa', 'list:integer')) l=[1,2,3,4,5] db.tt.insert(aa=l) self.assertEqual(db(db.tt).select('tt.aa').first()[db.tt.aa],l) db.tt.drop() db.close() def testListString(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa', 'list:string')) l=['a', 'b', 'c'] db.tt.insert(aa=l) self.assertEqual(db(db.tt).select('tt.aa').first()[db.tt.aa],l) db.tt.drop() db.close() def testListReference(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('t0', Field('aa', 'string')) db.define_table('tt', Field('t0_id', 'list:reference t0')) id_a=db.t0.insert(aa='test') l=[id_a] db.tt.insert(t0_id=l) self.assertEqual(db(db.tt).select(db.tt.t0_id).first()[db.tt.t0_id],l) db.tt.drop() db.t0.drop() db.close() class TestAddMethod(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa')) @db.tt.add_method.all def select_all(table,orderby=None): return table._db(table).select(orderby=orderby) self.assertEqual(db.tt.insert(aa='1'), 1) self.assertEqual(db.tt.insert(aa='2'), 2) self.assertEqual(db.tt.insert(aa='3'), 3) self.assertEqual(len(db.tt.all()), 3) db.tt.drop() db.close() class TestBelongs(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa')) self.assertEqual(db.tt.insert(aa='1'), 1) self.assertEqual(db.tt.insert(aa='2'), 2) self.assertEqual(db.tt.insert(aa='3'), 3) self.assertEqual(db(db.tt.aa.belongs(('1', '3'))).count(), 2) self.assertEqual(db(db.tt.aa.belongs(db(db.tt.id > 2)._select(db.tt.aa))).count(), 1) self.assertEqual(db(db.tt.aa.belongs(db(db.tt.aa.belongs(('1', '3')))._select(db.tt.aa))).count(), 2) self.assertEqual(db(db.tt.aa.belongs(db(db.tt.aa.belongs(db (db.tt.aa.belongs(('1', '3')))._select(db.tt.aa)))._select( db.tt.aa))).count(), 2) db.tt.drop() db.close() class TestContains(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa', 'list:string'), Field('bb','string')) self.assertEqual(db.tt.insert(aa=['aaa','bbb'],bb='aaa'), 1) self.assertEqual(db.tt.insert(aa=['bbb','ddd'],bb='abb'), 2) self.assertEqual(db.tt.insert(aa=['eee','aaa'],bb='acc'), 3) self.assertEqual(db(db.tt.aa.contains('aaa')).count(), 2) self.assertEqual(db(db.tt.aa.contains('bbb')).count(), 2) self.assertEqual(db(db.tt.aa.contains('aa')).count(), 0) self.assertEqual(db(db.tt.bb.contains('a')).count(), 3) self.assertEqual(db(db.tt.bb.contains('b')).count(), 1) self.assertEqual(db(db.tt.bb.contains('d')).count(), 0) self.assertEqual(db(db.tt.aa.contains(db.tt.bb)).count(), 1) #case-sensitivity tests, if 1 it isn't is_case_insensitive = db(db.tt.bb.like('%AA%')).count() if is_case_insensitive: self.assertEqual(db(db.tt.aa.contains('AAA')).count(), 2) self.assertEqual(db(db.tt.bb.contains('A')).count(), 3) else: self.assertEqual(db(db.tt.aa.contains('AAA', case_sensitive=True)).count(), 0) self.assertEqual(db(db.tt.bb.contains('A', case_sensitive=True)).count(), 0) self.assertEqual(db(db.tt.aa.contains('AAA', case_sensitive=False)).count(), 2) self.assertEqual(db(db.tt.bb.contains('A', case_sensitive=False)).count(), 3) db.tt.drop() # string field contains string field db.define_table('tt', Field('aa'), Field('bb')) db.tt.insert(aa='aaa', bb='%aaa') db.tt.insert(aa='aaa', bb='aaa') self.assertEqual(db(db.tt.aa.contains(db.tt.bb)).count(), 1) db.tt.drop() #escaping db.define_table('tt', Field('aa')) db.tt.insert(aa='perc%ent') db.tt.insert(aa='percent') db.tt.insert(aa='percxyzent') db.tt.insert(aa='under_score') db.tt.insert(aa='underxscore') db.tt.insert(aa='underyscore') self.assertEqual(db(db.tt.aa.contains('perc%ent')).count(), 1) self.assertEqual(db(db.tt.aa.contains('under_score')).count(), 1) db.tt.drop() db.close() class TestLike(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa')) self.assertEqual(db.tt.insert(aa='abc'), 1) self.assertEqual(db(db.tt.aa.like('a%')).count(), 1) self.assertEqual(db(db.tt.aa.like('%b%')).count(), 1) self.assertEqual(db(db.tt.aa.like('%c')).count(), 1) self.assertEqual(db(db.tt.aa.like('%d%')).count(), 0) #DAL maps like() (and contains(), startswith(), endswith()) #to the LIKE operator, that in ANSI-SQL is case-sensitive #There are backends supporting case-sensitivity by default #and backends that needs additional care to turn #case-sensitivity on. To discern among those, let's run #this query comparing previously inserted 'abc' with 'ABC': #if the result is 0, then the backend recognizes #case-sensitivity, if 1 it isn't is_case_insensitive = db(db.tt.aa.like('%ABC%')).count() if is_case_insensitive: self.assertEqual(db(db.tt.aa.like('A%')).count(), 1) self.assertEqual(db(db.tt.aa.like('%B%')).count(), 1) self.assertEqual(db(db.tt.aa.like('%C')).count(), 1) self.assertEqual(db(db.tt.aa.like('A%', case_sensitive=False)).count(), 1) self.assertEqual(db(db.tt.aa.like('%B%', case_sensitive=False)).count(), 1) self.assertEqual(db(db.tt.aa.like('%C', case_sensitive=False)).count(), 1) self.assertEqual(db(db.tt.aa.upper().like('A%')).count(), 1) self.assertEqual(db(db.tt.aa.upper().like('%B%')).count(),1) self.assertEqual(db(db.tt.aa.upper().like('%C')).count(), 1) else: self.assertEqual(db(db.tt.aa.like('A%')).count(), 0) self.assertEqual(db(db.tt.aa.like('%B%')).count(), 0) self.assertEqual(db(db.tt.aa.like('%C')).count(), 0) self.assertEqual(db(db.tt.aa.like('A%', case_sensitive=False)).count(), 1) self.assertEqual(db(db.tt.aa.like('%B%', case_sensitive=False)).count(), 1) self.assertEqual(db(db.tt.aa.like('%C', case_sensitive=False)).count(), 1) self.assertEqual(db(db.tt.aa.upper().like('A%')).count(), 1) self.assertEqual(db(db.tt.aa.upper().like('%B%')).count(),1) self.assertEqual(db(db.tt.aa.upper().like('%C')).count(), 1) # startswith endswith tests self.assertEqual(db(db.tt.aa.startswith('a')).count(), 1) self.assertEqual(db(db.tt.aa.endswith('c')).count(), 1) self.assertEqual(db(db.tt.aa.startswith('c')).count(), 0) self.assertEqual(db(db.tt.aa.endswith('a')).count(), 0) db(db.tt.id>0).delete() # test escaping term = 'ahbc'.replace('h', '\\') #funny but to avoid any doubts... db.tt.insert(aa='a%bc') db.tt.insert(aa=term) self.assertEqual(db(db.tt.aa.like('%ax%bc%', escape='x')).count(), 1) self.assertEqual(db(db.tt.aa.like('%'+term+'%')).count(), 1) db(db.tt.id>0).delete() # test "literal" like, i.e. exactly as LIKE in the backend db.tt.insert(aa='perc%ent') db.tt.insert(aa='percent') db.tt.insert(aa='percxyzent') db.tt.insert(aa='under_score') db.tt.insert(aa='underxscore') db.tt.insert(aa='underyscore') self.assertEqual(db(db.tt.aa.like('%perc%ent%')).count(), 3) self.assertEqual(db(db.tt.aa.like('%under_score%')).count(), 3) db(db.tt.id>0).delete() # escaping with startswith and endswith db.tt.insert(aa='%percent') db.tt.insert(aa='xpercent') db.tt.insert(aa='discount%') db.tt.insert(aa='discountx') self.assertEqual(db(db.tt.aa.endswith('discount%')).count(), 1) self.assertEqual(db(db.tt.aa.like('discount%%')).count(), 2) self.assertEqual(db(db.tt.aa.startswith('%percent')).count(), 1) self.assertEqual(db(db.tt.aa.like('%%percent')).count(), 2) db.tt.drop() db.define_table('tt', Field('aa', 'integer')) self.assertEqual(db.tt.insert(aa=1111111111), 1) self.assertEqual(db(db.tt.aa.like('1%')).count(), 1) self.assertEqual(db(db.tt.aa.like('2%')).count(), 0) db.tt.drop() db.close() class TestDatetime(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa', 'datetime')) self.assertEqual(db.tt.insert(aa=datetime.datetime(1971, 12, 21, 11, 30)), 1) self.assertEqual(db.tt.insert(aa=datetime.datetime(1971, 11, 21, 10, 30)), 2) self.assertEqual(db.tt.insert(aa=datetime.datetime(1970, 12, 21, 9, 30)), 3) self.assertEqual(db(db.tt.aa == datetime.datetime(1971, 12, 21, 11, 30)).count(), 1) self.assertEqual(db(db.tt.aa.year() == 1971).count(), 2) self.assertEqual(db(db.tt.aa.month() == 12).count(), 2) self.assertEqual(db(db.tt.aa.day() == 21).count(), 3) self.assertEqual(db(db.tt.aa.hour() == 11).count(), 1) self.assertEqual(db(db.tt.aa.minutes() == 30).count(), 3) self.assertEqual(db(db.tt.aa.seconds() == 0).count(), 3) self.assertEqual(db(db.tt.aa.epoch()<365*24*3600).count(),1) db.tt.drop() db.close() class TestExpressions(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa', 'integer')) self.assertEqual(db.tt.insert(aa=1), 1) self.assertEqual(db.tt.insert(aa=2), 2) self.assertEqual(db.tt.insert(aa=3), 3) self.assertEqual(db(db.tt.aa == 3).update(aa=db.tt.aa + 1), 1) self.assertEqual(db(db.tt.aa == 4).count(), 1) self.assertEqual(db(db.tt.aa == -2).count(), 0) sum = (db.tt.aa + 1).sum() self.assertEqual(db(db.tt.aa == 2).select(sum).first()[sum], 3) self.assertEqual(db(db.tt.aa == -2).select(sum).first()[sum], None) # Test basic expressions evaluated at python level self.assertEqual(db((1==1) & (db.tt.id>0)).count(), 3) db.tt.drop() db.close() def testSubstring(self): db = DAL(DEFAULT_URI, check_reserved=['all']) t0 = db.define_table('t0', Field('name')) input_name = "web2py" t0.insert(name=input_name) exp_slice = t0.name.lower()[4:6] exp_slice_no_max = t0.name.lower()[4:] exp_slice_neg_max = t0.name.lower()[2:-2] exp_slice_neg_start = t0.name.lower()[-2:] exp_item = t0.name.lower()[3] out = db(t0).select(exp_slice, exp_item, exp_slice_no_max, exp_slice_neg_max, exp_slice_neg_start).first() self.assertEqual(out[exp_slice], input_name[4:6]) self.assertEqual(out[exp_item], input_name[3]) self.assertEqual(out[exp_slice_no_max], input_name[4:]) self.assertEqual(out[exp_slice_neg_max], input_name[2:-2]) self.assertEqual(out[exp_slice_neg_start], input_name[-2:]) t0.drop() db.close() def testOps(self): db = DAL(DEFAULT_URI, check_reserved=['all']) t0 = db.define_table('t0', Field('vv', 'integer')) self.assertEqual(db.t0.insert(vv=1), 1) self.assertEqual(db.t0.insert(vv=2), 2) self.assertEqual(db.t0.insert(vv=3), 3) sum = db.t0.vv.sum() count=db.t0.vv.count() avg=db.t0.vv.avg() op = sum/count op1 = (sum/count).with_alias('tot') self.assertEqual(db(t0).select(op).first()[op], 2) self.assertEqual(db(t0).select(op1).first()[op1], 2) op2 = avg*count self.assertEqual(db(t0).select(op2).first()[op2], 6) # the following is not possible at least on sqlite sum = db.t0.vv.sum().with_alias('s') count=db.t0.vv.count().with_alias('c') op = sum/count #self.assertEqual(db(t0).select(op).first()[op], 2) t0.drop() db.close() class TestJoin(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('t1', Field('aa')) db.define_table('t2', Field('aa'), Field('b', db.t1)) i1 = db.t1.insert(aa='1') i2 = db.t1.insert(aa='2') i3 = db.t1.insert(aa='3') db.t2.insert(aa='4', b=i1) db.t2.insert(aa='5', b=i2) db.t2.insert(aa='6', b=i2) self.assertEqual(len(db(db.t1.id == db.t2.b).select(orderby=db.t1.aa | db.t2.aa)), 3) self.assertEqual(db(db.t1.id == db.t2.b).select(orderby=db.t1.aa | db.t2.aa)[2].t1.aa, '2') self.assertEqual(db(db.t1.id == db.t2.b).select(orderby=db.t1.aa | db.t2.aa)[2].t2.aa, '6') self.assertEqual(len(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)), 4) self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[2].t1.aa, '2') self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[2].t2.aa, '6') self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[3].t1.aa, '3') self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[3].t2.aa, None) self.assertEqual(len(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)), 3) self.assertEqual(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)[0]._extra[db.t2.id.count()], 1) self.assertEqual(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)[1]._extra[db.t2.id.count()], 2) self.assertEqual(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)[2]._extra[db.t2.id.count()], 0) db.t2.drop() db.t1.drop() db.define_table('person',Field('name')) id = db.person.insert(name="max") self.assertEqual(id.name,'max') db.define_table('dog',Field('name'),Field('ownerperson','reference person')) db.dog.insert(name='skipper',ownerperson=1) row = db(db.person.id==db.dog.ownerperson).select().first() self.assertEqual(row[db.person.name],'max') self.assertEqual(row['person.name'],'max') db.dog.drop() self.assertEqual(len(db.person._referenced_by),0) db.person.drop() db.close() class TestMinMaxSumAvg(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa', 'integer')) self.assertEqual(db.tt.insert(aa=1), 1) self.assertEqual(db.tt.insert(aa=2), 2) self.assertEqual(db.tt.insert(aa=3), 3) s = db.tt.aa.min() self.assertEqual(db(db.tt.id > 0).select(s)[0]._extra[s], 1) self.assertEqual(db(db.tt.id > 0).select(s).first()[s], 1) self.assertEqual(db().select(s).first()[s], 1) s = db.tt.aa.max() self.assertEqual(db().select(s).first()[s], 3) s = db.tt.aa.sum() self.assertEqual(db().select(s).first()[s], 6) s = db.tt.aa.count() self.assertEqual(db().select(s).first()[s], 3) s = db.tt.aa.avg() self.assertEqual(db().select(s).first()[s], 2) db.tt.drop() db.close() class TestMigrations(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa'), migrate='.storage.table') db.commit() db.close() db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa'), Field('b'), migrate='.storage.table') db.commit() db.close() db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa'), Field('b', 'text'), migrate='.storage.table') db.commit() db.close() db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa'), migrate='.storage.table') db.tt.drop() db.commit() db.close() def tearDown(self): if os.path.exists('.storage.db'): os.unlink('.storage.db') if os.path.exists('.storage.table'): os.unlink('.storage.table') class TestReference(unittest.TestCase): def testRun(self): scenarios = ( (True, 'CASCADE'), (False, 'CASCADE'), (False, 'SET NULL'), ) for (b, ondelete) in scenarios: db = DAL(DEFAULT_URI, check_reserved=['all'], bigint_id=b) if DEFAULT_URI.startswith('mssql'): #multiple cascade gotcha for key in ['reference','reference FK']: db._adapter.types[key]=db._adapter.types[key].replace( '%(on_delete_action)s','NO ACTION') db.define_table('tt', Field('name'), Field('aa','reference tt',ondelete=ondelete)) db.commit() x = db.tt.insert(name='xxx') self.assertEqual(x.id, 1) self.assertEqual(x['id'], 1) x.aa = x self.assertEqual(x.aa, 1) x.update_record() x1 = db.tt[1] self.assertEqual(x1.aa, 1) self.assertEqual(x1.aa.aa.aa.aa.aa.aa.name, 'xxx') y=db.tt.insert(name='yyy', aa = x1) self.assertEqual(y.aa, x1.id) if not DEFAULT_URI.startswith('mssql'): self.assertEqual(db.tt.insert(name='zzz'), 3) self.assertEqual(db(db.tt.name).count(), 3) db(db.tt.id == x).delete() expected_count = { 'SET NULL': 2, 'NO ACTION': 2, 'CASCADE': 1, } self.assertEqual(db(db.tt.name).count(), expected_count[ondelete]) if ondelete == 'SET NULL': self.assertEqual(db(db.tt.name == 'yyy').select()[0].aa, None) db.tt.drop() db.commit() db.close() class TestClientLevelOps(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa')) db.commit() db.tt.insert(aa="test") rows1 = db(db.tt.id<0).select() rows2 = db(db.tt.id>0).select() self.assertNotEqual(rows1, rows2) rows1 = db(db.tt.id>0).select() rows2 = db(db.tt.id>0).select() self.assertEqual(rows1, rows2) rows3 = rows1 & rows2 self.assertEqual(len(rows3), 2) rows4 = rows1 | rows2 self.assertEqual(len(rows4), 1) rows5 = rows1.find(lambda row: row.aa=="test") self.assertEqual(len(rows5), 1) rows6 = rows2.exclude(lambda row: row.aa=="test") self.assertEqual(len(rows6), 1) rows7 = rows5.sort(lambda row: row.aa) self.assertEqual(len(rows7), 1) def represent(f, v, r): return str(v) db.representers = { 'rows_render': represent, } rows = db(db.tt.id>0).select() rows.render(i=0) rows = db(db.tt.id>0).select() rows.compact=False row = rows[0] self.assertIn('tt', row) self.assertIn('id', row.tt) self.assertNotIn('id', row) rows.compact=True row = rows[0] self.assertNotIn('tt', row) self.assertIn('id', row) rows = db(db.tt.id>0).select(db.tt.id.max()) rows.compact=False row = rows[0] self.assertNotIn('tt', row) self.assertIn('_extra', row) rows = db(db.tt.id>0).select(db.tt.id.max()) rows.compact=True row = rows[0] self.assertNotIn('tt', row) self.assertIn('_extra', row) db.tt.drop() db.define_table('tt', Field('aa'), Field.Virtual('bb', lambda row: ':p')) db.tt.insert(aa="test") rows = db(db.tt.id>0).select() row = rows.first() self.assertNotIn('tt', row) self.assertIn('id', row) self.assertIn('bb', row) rows.compact = False row = rows.first() self.assertIn('tt', row) self.assertEqual(len(row.keys()), 1) self.assertIn('id', row.tt) self.assertIn('bb', row.tt) self.assertNotIn('id', row) self.assertNotIn('bb', row) db.tt.drop() db.commit() db.close() class TestVirtualFields(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa')) db.commit() db.tt.insert(aa="test") class Compute: def a_upper(row): return row.tt.aa.upper() db.tt.virtualfields.append(Compute()) assert db(db.tt.id>0).select().first().a_upper == 'TEST' db.tt.drop() db.commit() db.close() class TestComputedFields(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa'), Field('bb',default='x'), Field('cc',compute=lambda r: r.aa+r.bb)) db.commit() id = db.tt.insert(aa="z") self.assertEqual(db.tt[id].cc,'zx') db.tt.drop() db.commit() # test checking that a compute field can refer to earlier-defined computed fields db.define_table('tt', Field('aa'), Field('bb',default='x'), Field('cc',compute=lambda r: r.aa+r.bb), Field('dd',compute=lambda r: r.bb + r.cc)) db.commit() id = db.tt.insert(aa="z") self.assertEqual(db.tt[id].dd,'xzx') db.tt.drop() db.commit() db.close() class TestCommonFilters(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('t1', Field('aa', 'integer')) db.define_table('t2', Field('aa', 'integer'), Field('b', db.t1)) i1 = db.t1.insert(aa=1) i2 = db.t1.insert(aa=2) i3 = db.t1.insert(aa=3) db.t2.insert(aa=4, b=i1) db.t2.insert(aa=5, b=i2) db.t2.insert(aa=6, b=i2) db.t1._common_filter = lambda q: db.t1.aa>1 self.assertEqual(db(db.t1).count(),2) self.assertEqual(db(db.t1).count(),2) q = db.t2.b==db.t1.id self.assertEqual(db(q).count(),2) self.assertEqual(db(q).count(),2) self.assertEqual(len(db(db.t1).select(left=db.t2.on(q))),3) db.t2._common_filter = lambda q: db.t2.aa<6 self.assertEqual(db(q).count(),1) self.assertEqual(db(q).count(),1) self.assertEqual(len(db(db.t1).select(left=db.t2.on(q))),2) # test delete self.assertEqual(db(db.t2).count(),2) db(db.t2).delete() self.assertEqual(db(db.t2).count(),0) db.t2._common_filter = None self.assertEqual(db(db.t2).count(),1) # test update db.t2.insert(aa=4, b=i1) db.t2.insert(aa=5, b=i2) db.t2._common_filter = lambda q: db.t2.aa<6 self.assertEqual(db(db.t2).count(),2) db(db.t2).update(aa=6) self.assertEqual(db(db.t2).count(),0) db.t2._common_filter = None self.assertEqual(db(db.t2).count(),3) db.t2.drop() db.t1.drop() db.close() class TestImportExportFields(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('person', Field('name')) db.define_table('pet',Field('friend',db.person),Field('name')) for n in range(2): db(db.pet).delete() db(db.person).delete() for k in range(10): id = db.person.insert(name=str(k)) db.pet.insert(friend=id,name=str(k)) db.commit() stream = StringIO() db.export_to_csv_file(stream) db(db.pet).delete() db(db.person).delete() stream = StringIO(stream.getvalue()) db.import_from_csv_file(stream) assert db(db.person.id==db.pet.friend)(db.person.name==db.pet.name).count()==10 db.pet.drop() db.person.drop() db.commit() db.close() class TestImportExportUuidFields(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('person', Field('name'),Field('uuid')) db.define_table('pet',Field('friend',db.person),Field('name')) for n in range(2): db(db.pet).delete() db(db.person).delete() for k in range(10): id = db.person.insert(name=str(k),uuid=str(k)) db.pet.insert(friend=id,name=str(k)) db.commit() stream = StringIO() db.export_to_csv_file(stream) stream = StringIO(stream.getvalue()) db.import_from_csv_file(stream) assert db(db.person).count()==10 assert db(db.person.id==db.pet.friend)(db.person.name==db.pet.name).count()==20 db.pet.drop() db.person.drop() db.commit() db.close() class TestDALDictImportExport(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('person', Field('name', default="Michael"),Field('uuid')) db.define_table('pet',Field('friend',db.person),Field('name')) dbdict = db.as_dict(flat=True, sanitize=False) assert isinstance(dbdict, dict) uri = dbdict["uri"] assert isinstance(uri, basestring) and uri assert len(dbdict["tables"]) == 2 assert len(dbdict["tables"][0]["fields"]) == 3 assert dbdict["tables"][0]["fields"][1]["type"] == db.person.name.type assert dbdict["tables"][0]["fields"][1]["default"] == db.person.name.default db2 = DAL(**dbdict) assert len(db.tables) == len(db2.tables) assert hasattr(db2, "pet") and isinstance(db2.pet, Table) assert hasattr(db2.pet, "friend") and isinstance(db2.pet.friend, Field) db.pet.drop() db.commit() db2.commit() have_serializers = True try: import serializers dbjson = db.as_json(sanitize=False) assert isinstance(dbjson, basestring) and len(dbjson) > 0 unicode_keys = True if sys.version < "2.6.5": unicode_keys = False db3 = DAL(**serializers.loads_json(dbjson, unicode_keys=unicode_keys)) assert hasattr(db3, "person") and hasattr(db3.person, "uuid") and\ db3.person.uuid.type == db.person.uuid.type db3.person.drop() db3.commit() db3.close() except ImportError: pass mpfc = "Monty Python's Flying Circus" dbdict4 = {"uri": DEFAULT_URI, "tables":[{"tablename": "tvshow", "fields": [{"fieldname": "name", "default":mpfc}, {"fieldname": "rating", "type":"double"}]}, {"tablename": "staff", "fields": [{"fieldname": "name", "default":"Michael"}, {"fieldname": "food", "default":"Spam"}, {"fieldname": "tvshow", "type": "reference tvshow"}]}]} db4 = DAL(**dbdict4) assert "staff" in db4.tables assert "name" in db4.staff assert db4.tvshow.rating.type == "double" assert (db4.tvshow.insert(), db4.tvshow.insert(name="Loriot"), db4.tvshow.insert(name="Il Mattatore")) == (1, 2, 3) assert db4(db4.tvshow).select().first().id == 1 assert db4(db4.tvshow).select().first().name == mpfc db4.staff.drop() db4.tvshow.drop() db4.commit() dbdict5 = {"uri": DEFAULT_URI} db5 = DAL(**dbdict5) assert db5.tables in ([], None) assert not (str(db5) in ("", None)) dbdict6 = {"uri": DEFAULT_URI, "tables":[{"tablename": "staff"}, {"tablename": "tvshow", "fields": [{"fieldname": "name"}, {"fieldname": "rating", "type":"double"} ] }] } db6 = DAL(**dbdict6) assert len(db6["staff"].fields) == 1 assert "name" in db6["tvshow"].fields assert db6.staff.insert() is not None assert db6(db6.staff).select().first().id == 1 db6.staff.drop() db6.tvshow.drop() db6.commit() db.close() db2.close() db4.close() db5.close() db6.close() class TestSelectAsDict(unittest.TestCase): def testSelect(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table( 'a_table', Field('b_field'), Field('a_field'), ) db.a_table.insert(a_field="aa1", b_field="bb1") rtn = db.executesql("SELECT id, b_field, a_field FROM a_table", as_dict=True) self.assertEqual(rtn[0]['b_field'], 'bb1') rtn = db.executesql("SELECT id, b_field, a_field FROM a_table", as_ordered_dict=True) self.assertEqual(rtn[0]['b_field'], 'bb1') self.assertEqual(list(rtn[0].keys()), ['id', 'b_field', 'a_field']) db.a_table.drop() db.close() class TestRNameTable(unittest.TestCase): #tests for highly experimental rname attribute def testSelect(self): db = DAL(DEFAULT_URI, check_reserved=['all']) rname = db._adapter.__class__.QUOTE_TEMPLATE % 'a very complicated tablename' db.define_table( 'easy_name', Field('a_field'), rname=rname ) rtn = db.easy_name.insert(a_field='a') self.assertEqual(rtn.id, 1) rtn = db(db.easy_name.a_field == 'a').select() self.assertEqual(len(rtn), 1) self.assertEqual(rtn[0].id, 1) self.assertEqual(rtn[0].a_field, 'a') db.easy_name.insert(a_field='b') rtn = db(db.easy_name.id > 0).delete() self.assertEqual(rtn, 2) rtn = db(db.easy_name.id > 0).count() self.assertEqual(rtn, 0) db.easy_name.insert(a_field='a') db.easy_name.insert(a_field='b') rtn = db(db.easy_name.id > 0).count() self.assertEqual(rtn, 2) rtn = db(db.easy_name.a_field == 'a').update(a_field='c') rtn = db(db.easy_name.a_field == 'c').count() self.assertEqual(rtn, 1) rtn = db(db.easy_name.a_field != 'c').count() self.assertEqual(rtn, 1) avg = db.easy_name.id.avg() rtn = db(db.easy_name.id > 0).select(avg) self.assertEqual(rtn[0][avg], 3) rname = db._adapter.__class__.QUOTE_TEMPLATE % 'this is the person table' db.define_table( 'person', Field('name', default="Michael"), Field('uuid'), rname=rname ) rname = db._adapter.__class__.QUOTE_TEMPLATE % 'this is the pet table' db.define_table( 'pet', Field('friend','reference person'), Field('name'), rname=rname ) michael = db.person.insert() #default insert john = db.person.insert(name='John') luke = db.person.insert(name='Luke') #michael owns Phippo phippo = db.pet.insert(friend=michael, name="Phippo") #john owns Dunstin and Gertie dunstin = db.pet.insert(friend=john, name="Dunstin") gertie = db.pet.insert(friend=john, name="Gertie") rtn = db(db.person.id == db.pet.friend).select(orderby=db.person.id|db.pet.id) self.assertEqual(len(rtn), 3) self.assertEqual(rtn[0].person.id, michael) self.assertEqual(rtn[0].person.name, 'Michael') self.assertEqual(rtn[0].pet.id, phippo) self.assertEqual(rtn[0].pet.name, 'Phippo') self.assertEqual(rtn[1].person.id, john) self.assertEqual(rtn[1].person.name, 'John') self.assertEqual(rtn[1].pet.name, 'Dunstin') self.assertEqual(rtn[2].pet.name, 'Gertie') #fetch owners, eventually with pet #main point is retrieving Luke with no pets rtn = db(db.person.id > 0).select( orderby=db.person.id|db.pet.id, left=db.pet.on(db.person.id == db.pet.friend) ) self.assertEqual(rtn[0].person.id, michael) self.assertEqual(rtn[0].person.name, 'Michael') self.assertEqual(rtn[0].pet.id, phippo) self.assertEqual(rtn[0].pet.name, 'Phippo') self.assertEqual(rtn[3].person.name, 'Luke') self.assertEqual(rtn[3].person.id, luke) self.assertEqual(rtn[3].pet.name, None) #lets test a subquery subq = db(db.pet.name == "Gertie")._select(db.pet.friend) rtn = db(db.person.id.belongs(subq)).select() self.assertEqual(rtn[0].id, 2) self.assertEqual(rtn[0]('person.name'), 'John') #as dict rtn = db(db.person.id > 0).select().as_dict() self.assertEqual(rtn[1]['name'], 'Michael') #as list rtn = db(db.person.id > 0).select().as_list() self.assertEqual(rtn[0]['name'], 'Michael') #isempty rtn = db(db.person.id > 0).isempty() self.assertEqual(rtn, False) #join argument rtn = db(db.person).select(orderby=db.person.id|db.pet.id, join=db.pet.on(db.person.id==db.pet.friend)) self.assertEqual(len(rtn), 3) self.assertEqual(rtn[0].person.id, michael) self.assertEqual(rtn[0].person.name, 'Michael') self.assertEqual(rtn[0].pet.id, phippo) self.assertEqual(rtn[0].pet.name, 'Phippo') self.assertEqual(rtn[1].person.id, john) self.assertEqual(rtn[1].person.name, 'John') self.assertEqual(rtn[1].pet.name, 'Dunstin') self.assertEqual(rtn[2].pet.name, 'Gertie') #aliases if DEFAULT_URI.startswith('mssql'): #multiple cascade gotcha for key in ['reference','reference FK']: db._adapter.types[key]=db._adapter.types[key].replace( '%(on_delete_action)s','NO ACTION') rname = db._adapter.__class__.QUOTE_TEMPLATE % 'the cubs' db.define_table('pet_farm', Field('name'), Field('father','reference pet_farm'), Field('mother','reference pet_farm'), rname=rname ) minali = db.pet_farm.insert(name='Minali') osbert = db.pet_farm.insert(name='Osbert') #they had a cub selina = db.pet_farm.insert(name='Selina', father=osbert, mother=minali) father = db.pet_farm.with_alias('father') mother = db.pet_farm.with_alias('mother') #fetch pets with relatives rtn = db().select( db.pet_farm.name, father.name, mother.name, left=[ father.on(father.id == db.pet_farm.father), mother.on(mother.id == db.pet_farm.mother) ], orderby=db.pet_farm.id ) self.assertEqual(len(rtn), 3) self.assertEqual(rtn[0].pet_farm.name, 'Minali') self.assertEqual(rtn[0].father.name, None) self.assertEqual(rtn[0].mother.name, None) self.assertEqual(rtn[1].pet_farm.name, 'Osbert') self.assertEqual(rtn[2].pet_farm.name, 'Selina') self.assertEqual(rtn[2].father.name, 'Osbert') self.assertEqual(rtn[2].mother.name, 'Minali') #clean up db.pet_farm.drop() db.pet.drop() db.person.drop() db.easy_name.drop() db.close() def testJoin(self): db = DAL(DEFAULT_URI, check_reserved=['all']) rname = db._adapter.__class__.QUOTE_TEMPLATE % 'this is table t1' rname2 = db._adapter.__class__.QUOTE_TEMPLATE % 'this is table t2' db.define_table('t1', Field('aa'), rname=rname) db.define_table('t2', Field('aa'), Field('b', db.t1), rname=rname2) i1 = db.t1.insert(aa='1') i2 = db.t1.insert(aa='2') i3 = db.t1.insert(aa='3') db.t2.insert(aa='4', b=i1) db.t2.insert(aa='5', b=i2) db.t2.insert(aa='6', b=i2) self.assertEqual(len(db(db.t1.id == db.t2.b).select(orderby=db.t1.aa | db.t2.aa)), 3) self.assertEqual(db(db.t1.id == db.t2.b).select(orderby=db.t1.aa | db.t2.aa)[2].t1.aa, '2') self.assertEqual(db(db.t1.id == db.t2.b).select(orderby=db.t1.aa | db.t2.aa)[2].t2.aa, '6') self.assertEqual(len(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)), 4) self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[2].t1.aa, '2') self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[2].t2.aa, '6') self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[3].t1.aa, '3') self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[3].t2.aa, None) self.assertEqual(len(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)), 3) self.assertEqual(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)[0]._extra[db.t2.id.count()], 1) self.assertEqual(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)[1]._extra[db.t2.id.count()], 2) self.assertEqual(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)[2]._extra[db.t2.id.count()], 0) db.t2.drop() db.t1.drop() db.define_table('person',Field('name'), rname=rname) id = db.person.insert(name="max") self.assertEqual(id.name,'max') db.define_table('dog',Field('name'),Field('ownerperson','reference person'), rname=rname2) db.dog.insert(name='skipper',ownerperson=1) row = db(db.person.id==db.dog.ownerperson).select().first() self.assertEqual(row[db.person.name],'max') self.assertEqual(row['person.name'],'max') db.dog.drop() self.assertEqual(len(db.person._referenced_by),0) db.person.drop() db.close() class TestRNameFields(unittest.TestCase): # tests for highly experimental rname attribute def testSelect(self): db = DAL(DEFAULT_URI, check_reserved=['all']) rname = db._adapter.__class__.QUOTE_TEMPLATE % 'a very complicated fieldname' rname2 = db._adapter.__class__.QUOTE_TEMPLATE % 'rrating from 1 to 10' db.define_table( 'easy_name', Field('a_field', rname=rname), Field('rating', 'integer', rname=rname2, default=2) ) rtn = db.easy_name.insert(a_field='a') self.assertEqual(rtn.id, 1) rtn = db(db.easy_name.a_field == 'a').select() self.assertEqual(len(rtn), 1) self.assertEqual(rtn[0].id, 1) self.assertEqual(rtn[0].a_field, 'a') db.easy_name.insert(a_field='b') rtn = db(db.easy_name.id > 0).delete() self.assertEqual(rtn, 2) rtn = db(db.easy_name.id > 0).count() self.assertEqual(rtn, 0) db.easy_name.insert(a_field='a') db.easy_name.insert(a_field='b') rtn = db(db.easy_name.id > 0).count() self.assertEqual(rtn, 2) rtn = db(db.easy_name.a_field == 'a').update(a_field='c') rtn = db(db.easy_name.a_field == 'c').count() self.assertEqual(rtn, 1) rtn = db(db.easy_name.a_field != 'c').count() self.assertEqual(rtn, 1) avg = db.easy_name.id.avg() rtn = db(db.easy_name.id > 0).select(avg) self.assertEqual(rtn[0][avg], 3) avg = db.easy_name.rating.avg() rtn = db(db.easy_name.id > 0).select(avg) self.assertEqual(rtn[0][avg], 2) rname = db._adapter.__class__.QUOTE_TEMPLATE % 'this is the person name' db.define_table( 'person', Field('name', default="Michael", rname=rname), Field('uuid') ) rname = db._adapter.__class__.QUOTE_TEMPLATE % 'this is the pet name' db.define_table( 'pet', Field('friend','reference person'), Field('name', rname=rname) ) michael = db.person.insert() #default insert john = db.person.insert(name='John') luke = db.person.insert(name='Luke') #michael owns Phippo phippo = db.pet.insert(friend=michael, name="Phippo") #john owns Dunstin and Gertie dunstin = db.pet.insert(friend=john, name="Dunstin") gertie = db.pet.insert(friend=john, name="Gertie") rtn = db(db.person.id == db.pet.friend).select(orderby=db.person.id|db.pet.id) self.assertEqual(len(rtn), 3) self.assertEqual(rtn[0].person.id, michael) self.assertEqual(rtn[0].person.name, 'Michael') self.assertEqual(rtn[0].pet.id, phippo) self.assertEqual(rtn[0].pet.name, 'Phippo') self.assertEqual(rtn[1].person.id, john) self.assertEqual(rtn[1].person.name, 'John') self.assertEqual(rtn[1].pet.name, 'Dunstin') self.assertEqual(rtn[2].pet.name, 'Gertie') #fetch owners, eventually with pet #main point is retrieving Luke with no pets rtn = db(db.person.id > 0).select( orderby=db.person.id|db.pet.id, left=db.pet.on(db.person.id == db.pet.friend) ) self.assertEqual(rtn[0].person.id, michael) self.assertEqual(rtn[0].person.name, 'Michael') self.assertEqual(rtn[0].pet.id, phippo) self.assertEqual(rtn[0].pet.name, 'Phippo') self.assertEqual(rtn[3].person.name, 'Luke') self.assertEqual(rtn[3].person.id, luke) self.assertEqual(rtn[3].pet.name, None) #lets test a subquery subq = db(db.pet.name == "Gertie")._select(db.pet.friend) rtn = db(db.person.id.belongs(subq)).select() self.assertEqual(rtn[0].id, 2) self.assertEqual(rtn[0]('person.name'), 'John') #as dict rtn = db(db.person.id > 0).select().as_dict() self.assertEqual(rtn[1]['name'], 'Michael') #as list rtn = db(db.person.id > 0).select().as_list() self.assertEqual(rtn[0]['name'], 'Michael') #isempty rtn = db(db.person.id > 0).isempty() self.assertEqual(rtn, False) #join argument rtn = db(db.person).select(orderby=db.person.id|db.pet.id, join=db.pet.on(db.person.id==db.pet.friend)) self.assertEqual(len(rtn), 3) self.assertEqual(rtn[0].person.id, michael) self.assertEqual(rtn[0].person.name, 'Michael') self.assertEqual(rtn[0].pet.id, phippo) self.assertEqual(rtn[0].pet.name, 'Phippo') self.assertEqual(rtn[1].person.id, john) self.assertEqual(rtn[1].person.name, 'John') self.assertEqual(rtn[1].pet.name, 'Dunstin') self.assertEqual(rtn[2].pet.name, 'Gertie') #aliases rname = db._adapter.__class__.QUOTE_TEMPLATE % 'the cub name' if DEFAULT_URI.startswith('mssql'): #multiple cascade gotcha for key in ['reference','reference FK']: db._adapter.types[key]=db._adapter.types[key].replace( '%(on_delete_action)s','NO ACTION') db.define_table('pet_farm', Field('name', rname=rname), Field('father','reference pet_farm'), Field('mother','reference pet_farm'), ) minali = db.pet_farm.insert(name='Minali') osbert = db.pet_farm.insert(name='Osbert') #they had a cub selina = db.pet_farm.insert(name='Selina', father=osbert, mother=minali) father = db.pet_farm.with_alias('father') mother = db.pet_farm.with_alias('mother') #fetch pets with relatives rtn = db().select( db.pet_farm.name, father.name, mother.name, left=[ father.on(father.id == db.pet_farm.father), mother.on(mother.id == db.pet_farm.mother) ], orderby=db.pet_farm.id ) self.assertEqual(len(rtn), 3) self.assertEqual(rtn[0].pet_farm.name, 'Minali') self.assertEqual(rtn[0].father.name, None) self.assertEqual(rtn[0].mother.name, None) self.assertEqual(rtn[1].pet_farm.name, 'Osbert') self.assertEqual(rtn[2].pet_farm.name, 'Selina') self.assertEqual(rtn[2].father.name, 'Osbert') self.assertEqual(rtn[2].mother.name, 'Minali') #clean up db.pet_farm.drop() db.pet.drop() db.person.drop() db.easy_name.drop() db.close() def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) rname = db._adapter.__class__.QUOTE_TEMPLATE % 'a very complicated fieldname' for ft in ['string', 'text', 'password', 'upload', 'blob']: db.define_table('tt', Field('aa', ft, default='', rname=rname)) self.assertEqual(db.tt.insert(aa='x'), 1) self.assertEqual(db().select(db.tt.aa)[0].aa, 'x') db.tt.drop() db.define_table('tt', Field('aa', 'integer', default=1, rname=rname)) self.assertEqual(db.tt.insert(aa=3), 1) self.assertEqual(db().select(db.tt.aa)[0].aa, 3) db.tt.drop() db.define_table('tt', Field('aa', 'double', default=1, rname=rname)) self.assertEqual(db.tt.insert(aa=3.1), 1) self.assertEqual(db().select(db.tt.aa)[0].aa, 3.1) db.tt.drop() db.define_table('tt', Field('aa', 'boolean', default=True, rname=rname)) self.assertEqual(db.tt.insert(aa=True), 1) self.assertEqual(db().select(db.tt.aa)[0].aa, True) db.tt.drop() db.define_table('tt', Field('aa', 'json', default={}, rname=rname)) self.assertEqual(db.tt.insert(aa={}), 1) self.assertEqual(db().select(db.tt.aa)[0].aa, {}) db.tt.drop() db.define_table('tt', Field('aa', 'date', default=datetime.date.today(), rname=rname)) t0 = datetime.date.today() self.assertEqual(db.tt.insert(aa=t0), 1) self.assertEqual(db().select(db.tt.aa)[0].aa, t0) db.tt.drop() db.define_table('tt', Field('aa', 'datetime', default=datetime.datetime.today(), rname=rname)) t0 = datetime.datetime( 1971, 12, 21, 10, 30, 55, 0, ) self.assertEqual(db.tt.insert(aa=t0), 1) self.assertEqual(db().select(db.tt.aa)[0].aa, t0) ## Row APIs row = db().select(db.tt.aa)[0] self.assertEqual(db.tt[1].aa,t0) self.assertEqual(db.tt['aa'],db.tt.aa) self.assertEqual(db.tt(1).aa,t0) self.assertTrue(db.tt(1,aa=None)==None) self.assertFalse(db.tt(1,aa=t0)==None) self.assertEqual(row.aa,t0) self.assertEqual(row['aa'],t0) self.assertEqual(row['tt.aa'],t0) self.assertEqual(row('tt.aa'),t0) self.assertTrue('aa' in row) self.assertTrue('pydal' not in row) self.assertTrue(hasattr(row, 'aa')) self.assertFalse(hasattr(row, 'pydal')) ## Lazy and Virtual fields db.tt.b = Field.Virtual(lambda row: row.tt.aa) db.tt.c = Field.Lazy(lambda row: row.tt.aa) row = db().select(db.tt.aa)[0] self.assertEqual(row.b,t0) self.assertEqual(row.c(),t0) db.tt.drop() db.define_table('tt', Field('aa', 'time', default='11:30', rname=rname)) t0 = datetime.time(10, 30, 55) self.assertEqual(db.tt.insert(aa=t0), 1) self.assertEqual(db().select(db.tt.aa)[0].aa, t0) db.tt.drop() db.close() def testInsert(self): db = DAL(DEFAULT_URI, check_reserved=['all']) rname = db._adapter.__class__.QUOTE_TEMPLATE % 'a very complicated fieldname' db.define_table('tt', Field('aa', rname=rname)) self.assertEqual(db.tt.insert(aa='1'), 1) self.assertEqual(db.tt.insert(aa='1'), 2) self.assertEqual(db.tt.insert(aa='1'), 3) self.assertEqual(db(db.tt.aa == '1').count(), 3) self.assertEqual(db(db.tt.aa == '2').isempty(), True) self.assertEqual(db(db.tt.aa == '1').update(aa='2'), 3) self.assertEqual(db(db.tt.aa == '2').count(), 3) self.assertEqual(db(db.tt.aa == '2').isempty(), False) self.assertEqual(db(db.tt.aa == '2').delete(), 3) self.assertEqual(db(db.tt.aa == '2').isempty(), True) db.tt.drop() db.close() def testJoin(self): db = DAL(DEFAULT_URI, check_reserved=['all']) rname = db._adapter.__class__.QUOTE_TEMPLATE % 'this is field aa' rname2 = db._adapter.__class__.QUOTE_TEMPLATE % 'this is field b' db.define_table('t1', Field('aa', rname=rname)) db.define_table('t2', Field('aa', rname=rname), Field('b', db.t1, rname=rname2)) i1 = db.t1.insert(aa='1') i2 = db.t1.insert(aa='2') i3 = db.t1.insert(aa='3') db.t2.insert(aa='4', b=i1) db.t2.insert(aa='5', b=i2) db.t2.insert(aa='6', b=i2) self.assertEqual(len(db(db.t1.id == db.t2.b).select(orderby=db.t1.aa | db.t2.aa)), 3) self.assertEqual(db(db.t1.id == db.t2.b).select(orderby=db.t1.aa | db.t2.aa)[2].t1.aa, '2') self.assertEqual(db(db.t1.id == db.t2.b).select(orderby=db.t1.aa | db.t2.aa)[2].t2.aa, '6') self.assertEqual(len(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)), 4) self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[2].t1.aa, '2') self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[2].t2.aa, '6') self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[3].t1.aa, '3') self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[3].t2.aa, None) self.assertEqual(len(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)), 3) self.assertEqual(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)[0]._extra[db.t2.id.count()], 1) self.assertEqual(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)[1]._extra[db.t2.id.count()], 2) self.assertEqual(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)[2]._extra[db.t2.id.count()], 0) db.t2.drop() db.t1.drop() db.define_table('person',Field('name', rname=rname)) id = db.person.insert(name="max") self.assertEqual(id.name,'max') db.define_table('dog',Field('name', rname=rname),Field('ownerperson','reference person', rname=rname2)) db.dog.insert(name='skipper',ownerperson=1) row = db(db.person.id==db.dog.ownerperson).select().first() self.assertEqual(row[db.person.name],'max') self.assertEqual(row['person.name'],'max') db.dog.drop() self.assertEqual(len(db.person._referenced_by),0) db.person.drop() db.close() class TestQuoting(unittest.TestCase): # tests for case sensitivity def testCase(self): db = DAL(DEFAULT_URI, check_reserved=['all'], ignore_field_case=False, entity_quoting=True) if DEFAULT_URI.startswith('mssql'): #multiple cascade gotcha for key in ['reference','reference FK']: db._adapter.types[key]=db._adapter.types[key].replace( '%(on_delete_action)s','NO ACTION') t0 = db.define_table('t0', Field('f', 'string')) t1 = db.define_table('b', Field('B', t0), Field('words', 'text')) blather = 'blah blah and so' t0[0] = {'f': 'content'} t1[0] = {'B': int(t0[1]['id']), 'words': blather} r = db(db.t0.id==db.b.B).select() self.assertEqual(r[0].b.words, blather) t1.drop() t0.drop() # test field case try: t0 = db.define_table('table_is_a_test', Field('a_a'), Field('a_A')) except Exception as e: # some db does not support case sensitive field names mysql is one of them. if DEFAULT_URI.startswith('mysql:') or DEFAULT_URI.startswith('sqlite:'): db.rollback() return raise e t0[0] = dict(a_a = 'a_a', a_A='a_A') self.assertEqual(t0[1].a_a, 'a_a') self.assertEqual(t0[1].a_A, 'a_A') t0.drop() db.close() def testPKFK(self): # test primary keys db = DAL(DEFAULT_URI, check_reserved=['all'], ignore_field_case=False) if DEFAULT_URI.startswith('mssql'): #multiple cascade gotcha for key in ['reference','reference FK']: db._adapter.types[key]=db._adapter.types[key].replace( '%(on_delete_action)s','NO ACTION') # test table without surrogate key. Length must is limited to # 100 because of MySQL limitations: it cannot handle more than # 767 bytes in unique keys. t0 = db.define_table('t0', Field('Code', length=100), primarykey=['Code']) t2 = db.define_table('t2', Field('f'), Field('t0_Code', 'reference t0')) t3 = db.define_table('t3', Field('f', length=100), Field('t0_Code', t0.Code), primarykey=['f']) t4 = db.define_table('t4', Field('f', length=100), Field('t0', t0), primarykey=['f']) try: t5 = db.define_table('t5', Field('f', length=100), Field('t0', 'reference no_table_wrong_reference'), primarykey=['f']) except Exception as e: self.assertTrue(isinstance(e, KeyError)) if DEFAULT_URI.startswith('mssql'): #there's no drop cascade in mssql t3.drop() t4.drop() t2.drop() t0.drop() else: t0.drop('cascade') t2.drop() t3.drop() t4.drop() db.close() class TestTableAndFieldCase(unittest.TestCase): """ at the Python level we should not allow db.C and db.c because of .table conflicts on windows but it should be possible to map two different names into distinct tables "c" and "C" at the Python level By default Python models names should be mapped into lower case table names and assume case insensitivity. """ def testme(self): return class TestQuotesByDefault(unittest.TestCase): """ all default tables names should be quoted unless an explicit mapping has been given for a table. """ def testme(self): return class TestGis(unittest.TestCase): def testGeometry(self): from pydal import geoPoint, geoLine, geoPolygon if not IS_POSTGRESQL: return db = DAL(DEFAULT_URI, check_reserved=['all']) t0 = db.define_table('t0', Field('point', 'geometry()')) t1 = db.define_table('t1', Field('line', 'geometry(public, 4326, 2)')) t2 = db.define_table('t2', Field('polygon', 'geometry(public, 4326, 2)')) t0.insert(point=geoPoint(1,1)) text = db(db.t0.id).select(db.t0.point.st_astext()).first()[db.t0.point.st_astext()] self.assertEqual(text, "POINT(1 1)") t1.insert(line=geoLine((1,1),(2,2))) text = db(db.t1.id).select(db.t1.line.st_astext()).first()[db.t1.line.st_astext()] self.assertEqual(text, "LINESTRING(1 1,2 2)") t2.insert(polygon=geoPolygon((0,0),(2,0),(2,2),(0,2),(0,0))) text = db(db.t2.id).select(db.t2.polygon.st_astext()).first()[db.t2.polygon.st_astext()] self.assertEqual(text, "POLYGON((0 0,2 0,2 2,0 2,0 0))") query = t0.point.st_intersects(geoLine((0,0),(2,2))) output = db(query).select(db.t0.point).first()[db.t0.point] self.assertEqual(output, "POINT(1 1)") query = t2.polygon.st_contains(geoPoint(1,1)) n = db(query).count() self.assertEqual(n, 1) x=t0.point.st_x() y=t0.point.st_y() point = db(t0.id).select(x, y).first() self.assertEqual(point[x], 1) self.assertEqual(point[y], 1) t0.drop() t1.drop() t2.drop() db.close() def testGeometryCase(self): from pydal import geoPoint, geoLine, geoPolygon if not IS_POSTGRESQL: return db = DAL(DEFAULT_URI, check_reserved=['all'], ignore_field_case=False) t0 = db.define_table('t0', Field('point', 'geometry()'), Field('Point', 'geometry()')) t0.insert(point=geoPoint(1,1)) t0.insert(Point=geoPoint(2,2)) t0.drop() db.close() def testGisMigration(self): if not IS_POSTGRESQL: return for b in [True, False]: db = DAL(DEFAULT_URI, check_reserved=['all'], ignore_field_case=b) t0 = db.define_table('t0', Field('Point', 'geometry()')) db.commit() db.close() db = DAL(DEFAULT_URI, check_reserved=['all'], ignore_field_case=b) t0 = db.define_table('t0', Field('New_point', 'geometry()')) t0.drop() db.commit() db.close() class TestSQLCustomType(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) from pydal.helpers.classes import SQLCustomType native_double = "double" native_string = "string" if hasattr(db._adapter, 'types'): native_double = db._adapter.types['double'] native_string = db._adapter.types['string'] % {'length': 256} basic_t = SQLCustomType(type = "double", native = native_double) basic_t_str = SQLCustomType(type = "string", native = native_string) t0=db.define_table('t0', Field("price", basic_t), Field("product", basic_t_str)) r_id = t0.insert(price=None, product=None) row = db(t0.id == r_id).select(t0.ALL).first() self.assertEqual(row['price'], None) self.assertEqual(row['product'], None) r_id = t0.insert(price=1.2, product="car") row=db(t0.id == r_id).select(t0.ALL).first() self.assertEqual(row['price'], 1.2) self.assertEqual(row['product'], 'car') t0.drop() import zlib compressed = SQLCustomType( type ='text', native='text', encoder =(lambda x: zlib.compress(x or '', 1)), decoder = (lambda x: zlib.decompress(x)) ) t1=db.define_table('t0',Field('cdata', compressed)) #r_id=t1.insert(cdata="car") #row=db(t1.id == r_id).select(t1.ALL).first() #self.assertEqual(row['cdata'], "'car'") t1.drop() db.close() class TestLazy(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all'], lazy_tables=True) t0 = db.define_table('t0', Field('name')) self.assertTrue(('t0' in db._LAZY_TABLES.keys())) db.t0.insert(name='1') self.assertFalse(('t0' in db._LAZY_TABLES.keys())) db.t0.drop() db.close() def testLazyGetter(self): db=DAL(DEFAULT_URI, lazy_tables=True) db.define_table('tt', Field('value', 'integer')) db.define_table('ttt', Field('value', 'integer'), Field('tt_id', 'reference tt'), ) # Force table definition db.ttt.value.writable=False idd=db.tt.insert(value=0) db.ttt.insert(tt_id=idd) db.ttt.drop() db.tt.drop() db.close() def testRowNone(self): db=DAL(DEFAULT_URI, lazy_tables=True) tt = db.define_table('tt', Field('value', 'integer')) db.tt.insert(value=None) row = db(db.tt).select(db.tt.ALL).first() self.assertEqual(row.value, None) self.assertEqual(row[db.tt.value], None) self.assertEqual(row['tt.value'], None) self.assertEqual(row.get('tt.value'), None) self.assertEqual(row['value'], None) self.assertEqual(row.get('value'), None) db.tt.drop() db.close() def testRowExtra(self): db=DAL(DEFAULT_URI, lazy_tables=True) tt = db.define_table('tt', Field('value', 'integer')) db.tt.insert(value=1) row = db(db.tt).select('value').first() self.assertEqual(row.value, 1) db.tt.drop() db.close() class TestRedefine(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all'], lazy_tables=True, migrate=False) db.define_table('t_a', Field('code')) self.assertTrue('code' in db.t_a) self.assertTrue('code' in db['t_a']) db.define_table('t_a', Field('code_a'), redefine=True) self.assertFalse('code' in db.t_a) self.assertFalse('code' in db['t_a']) self.assertTrue('code_a' in db.t_a) self.assertTrue('code_a' in db['t_a']) db.close() class TestUpdateInsert(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) t0 = db.define_table('t0', Field('name')) i_id = t0.update_or_insert((t0.id == 1), name='web2py') u_id = t0.update_or_insert((t0.id == i_id), name='web2py2') self.assertTrue(i_id != None) self.assertTrue(u_id == None) self.assertTrue(db(t0).count() == 1) self.assertTrue(db(t0.name == 'web2py').count() == 0) self.assertTrue(db(t0.name == 'web2py2').count() == 1) db.t0.drop() db.close() class TestBulkInsert(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) t0 = db.define_table('t0', Field('name')) global ctr ctr = 0 def test_after_insert(i, r): self.assertIsInstance(i, dict) global ctr ctr += 1 return True t0._after_insert.append(test_after_insert) items = [{'name':'web2py_%s' % pos} for pos in range(0, 10, 1)] t0.bulk_insert(items) self.assertTrue(db(t0).count() == len(items)) for pos in range(0, 10, 1): self.assertTrue(db(t0.name == 'web2py_%s' % pos).count() == 1) self.assertTrue(ctr == len(items)) db.t0.drop() db.close() class TestRecordVersioning(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('t0', Field('name'), Field('is_active', writable=False,readable=False,default=True)) db.t0._enable_record_versioning(archive_name='t0_archive') self.assertTrue('t0_archive' in db) i_id = db.t0.insert(name='web2py1') db.t0.insert(name='web2py2') db(db.t0.name == 'web2py2').delete() self.assertEqual(len(db(db.t0).select()), 1) self.assertEqual(db(db.t0).count(), 1) db(db.t0.id == i_id).update(name='web2py3') self.assertEqual(len(db(db.t0).select()), 1) self.assertEqual(db(db.t0).count(), 1) self.assertEqual(len(db(db.t0_archive).select()), 2) self.assertEqual(db(db.t0_archive).count(), 2) db.t0_archive.drop() db.t0.drop() db.close() @unittest.skipIf(IS_SQLITE, "Skip sqlite") class TestConnection(unittest.TestCase): def testRun(self): # check connection is no longer active after close db = DAL(DEFAULT_URI, check_reserved=['all']) connection = db._adapter.connection db.close() self.assertRaises(Exception, connection.commit) # check connection are reused with pool_size connections = set() for a in range(10): db2 = DAL(DEFAULT_URI, check_reserved=['all'], pool_size=5) c = db2._adapter.connection connections.add(c) db2.close() self.assertEqual(len(connections), 1) c = connections.pop() c.commit() c.close() # check correct use of pool_size dbs = [] for a in range(10): db3 = DAL(DEFAULT_URI, check_reserved=['all'], pool_size=5) dbs.append(db3) for db in dbs: db.close() self.assertEqual(len(db3._adapter.POOLS[DEFAULT_URI]), 5) for c in db3._adapter.POOLS[DEFAULT_URI]: c.close() db3._adapter.POOLS[DEFAULT_URI] = [] # Clean close if a connection is broken (closed explicity) for a in range(10): db4 = DAL(DEFAULT_URI, check_reserved=['all'], pool_size=5) db4._adapter.connection.close() db4.close() self.assertEqual(len(db4._adapter.POOLS[DEFAULT_URI]), 0) class TestSerializers(unittest.TestCase): def testAsJson(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('date_field', 'datetime')) db.tt.insert(date_field=datetime.datetime.now()) rows = db().select(db.tt.ALL) j=rows.as_json() import json #standard library json.loads(j) db.tt.drop() db.close() def testSelectIterselect(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('tt')) db.tt.insert(tt='pydal') methods = ['as_dict', 'as_csv', 'as_json', 'as_xml', 'as_list'] for method in methods: rows = db(db.tt).select() rowsI = db(db.tt).iterselect() self.assertEqual(getattr(rows, method)(), getattr(rowsI, method)(), 'failed %s' % method) db.tt.drop() db.close() class TestIterselect(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) t0 = db.define_table('t0', Field('name')) names = ['web2py', 'pydal', 'Massimo'] for n in names: t0.insert(name=n) rows = db(db.t0).select(orderby=db.t0.id) for pos, r in enumerate(rows): self.assertEqual(r.name, names[pos]) # Testing basic iteration rows = db(db.t0).iterselect(orderby=db.t0.id) for pos, r in enumerate(rows): self.assertEqual(r.name, names[pos]) # Testing IterRows.first before basic iteration rows = db(db.t0).iterselect(orderby=db.t0.id) self.assertEqual(rows.first().name, names[0]) self.assertEqual(rows.first().name, names[0]) for pos, r in enumerate(rows): self.assertEqual(r.name, names[pos]) # Testing IterRows.__nonzero__ before basic iteration rows = db(db.t0).iterselect(orderby=db.t0.id) if rows: for pos, r in enumerate(rows): self.assertEqual(r.name, names[pos]) # Empty iterRows rows = db(db.t0.name=="IterRows").iterselect(orderby=db.t0.id) self.assertEqual(bool(rows), False) for pos, r in enumerate(rows): self.assertEqual(r.name, names[pos]) # Testing IterRows.__getitem__ rows = db(db.t0).iterselect(orderby=db.t0.id) self.assertEqual(rows[0].name, names[0]) self.assertEqual(rows[1].name, names[1]) # recall the same item self.assertEqual(rows[1].name, names[1]) self.assertEqual(rows[2].name, names[2]) self.assertRaises(IndexError, rows.__getitem__, 1) # Testing IterRows.next() rows = db(db.t0).iterselect(orderby=db.t0.id) for n in names: self.assertEqual(next(rows).name, n) self.assertRaises(StopIteration, next, rows) # Testing IterRows.compact rows = db(db.t0).iterselect(orderby=db.t0.id) rows.compact = False for n in names: self.assertEqual(next(rows).t0.name, n) t0.drop() db.close() return if __name__ == '__main__': unittest.main() tearDownModule() web2py-2.12.3.orig/gluon/packages/dal/tests/_adapt.py0000664000000000000000000000142612564727434021075 0ustar rootrootimport os DEFAULT_URI = os.getenv('DB', 'sqlite:memory') NOSQL = any([name in DEFAULT_URI for name in ("datastore", "mongodb", "imap")]) IS_IMAP = "imap" in DEFAULT_URI IS_GAE = "datastore" in DEFAULT_URI IS_MONGODB = "mongodb" in DEFAULT_URI IS_POSTGRESQL = 'postgres' in DEFAULT_URI IS_SQLITE = 'sqlite' in DEFAULT_URI IS_MSSQL = 'mssql' in DEFAULT_URI def drop(table, cascade=None): if NOSQL and not (IS_MONGODB): # GAE drop/cleanup is not implemented db = table._db db[table]._common_filter = None db(table).delete() del db[table._tablename] del db.tables[db.tables.index(table._tablename)] db._remove_references_to(table) else: if cascade: table.drop(cascade) else: table.drop() web2py-2.12.3.orig/gluon/packages/dal/tests/nosql.py0000664000000000000000000025651212564727434021011 0ustar rootroot# -*- coding: utf-8 -*- """ Unit tests for NoSQL adapters """ from __future__ import print_function import sys import os import glob import datetime from ._compat import unittest from pydal._compat import PY2, basestring, StringIO, integer_types long = integer_types[-1] from pydal import DAL, Field from pydal.objects import Table, Query, Expression from pydal.helpers.classes import SQLALL from ._adapt import DEFAULT_URI, IS_IMAP, drop, IS_GAE, IS_MONGODB if IS_IMAP: from pydal.adapters import IMAPAdapter from pydal.contrib import mockimaplib IMAPAdapter.driver = mockimaplib elif IS_MONGODB: from pydal.adapters import MongoDBAdapter elif IS_GAE: # setup GAE dummy database from google.appengine.ext import testbed gaetestbed = testbed.Testbed() gaetestbed.activate() gaetestbed.init_datastore_v3_stub() gaetestbed.init_memcache_stub() print('Testing against %s engine (%s)' % (DEFAULT_URI.partition(':')[0], DEFAULT_URI)) ALLOWED_DATATYPES = [ 'string', 'text', 'integer', 'boolean', 'double', 'blob', 'date', 'time', 'datetime', 'upload', 'password', 'json', ] def setUpModule(): if not IS_IMAP: db = DAL(DEFAULT_URI, check_reserved=['all']) def clean_table(db, tablename): db.define_table(tablename) drop(db[tablename]) for tablename in ['tt', 't0', 't1', 't2', 't3', 't4', 'easy_name', 'tt_archive', 'pet_farm']: clean_table(db, tablename) db.close() def tearDownModule(): if os.path.isfile('sql.log'): os.unlink('sql.log') for a in glob.glob('*.table'): os.unlink(a) @unittest.skipIf(not IS_MONGODB, "Skipping MongoDB Tests") class TestMongo(unittest.TestCase): """ Tests specific to MongoDB, error and side path exercisers, etc """ def testVersionCheck(self): driver_args={'fake_version': '2.9 Phony'} with self.assertRaises(Exception): db = DAL(DEFAULT_URI, attempts=1, check_reserved=['all'], driver_args=driver_args) def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa', 'reference')) with self.assertRaises(ValueError): db.tt.insert(aa='x') with self.assertRaises(ValueError): db.tt.insert(aa='_') with self.assertRaises(TypeError): db.tt.insert(aa=3.1) self.assertEqual(isinstance(db.tt.insert(aa=''), long), True) self.assertEqual(isinstance(db.tt.insert(aa='1'), long), True) self.assertEqual(isinstance(db.tt.insert(aa='0x1'), long), True) try: self.assertEqual(db(db.tt.aa+1==1).update(aa=0), 0) except: with self.assertRaises(RuntimeError): self.assertEqual(db(db.tt.aa+1==1).update(aa=0), 0) drop(db.tt) db.define_table('tt', Field('aa', 'date')) self.assertEqual(isinstance(db.tt.insert(aa=None), long), True) self.assertEqual(db().select(db.tt.aa)[0].aa, None) drop(db.tt) db.define_table('tt', Field('aa', 'time')) self.assertEqual(isinstance(db.tt.insert(aa=None), long), True) self.assertEqual(db().select(db.tt.aa)[0].aa, None) with self.assertRaises(RuntimeError): db(db.tt.aa <= None).count() with self.assertRaises(NotImplementedError): db._adapter.select(Query(db, db._adapter.AGGREGATE, db.tt.aa, 'UNKNOWN'), [db.tt.aa], {}) with self.assertRaises(NotImplementedError): db._adapter.select(Expression(db, db._adapter.EXTRACT, db.tt.aa, 'UNKNOWN', 'integer'), [db.tt.aa], {}) drop(db.tt) db.define_table('tt', Field('aa', 'integer')) case=(db.tt.aa == 0).case(db.tt.aa + 2) with self.assertRaises(SyntaxError): db(case).count() drop(db.tt) db.define_table('tt', Field('aa'), Field('bb', 'integer'), Field('cc', 'list:integer')) db.tt.insert(aa="aa") with self.assertRaises(NotImplementedError): db((db.tt.aa+1).contains(db.tt.aa)).count() with self.assertRaises(NotImplementedError): db(db.tt.cc.contains(db.tt.aa)).count() with self.assertRaises(NotImplementedError): db(db.tt.aa.contains(db.tt.cc)).count() with self.assertRaises(NotImplementedError): db(db.tt.aa.contains(1.0)).count() with self.assertRaises(NotImplementedError): db().select(db.tt.aa.lower()[4:-1]).first() with self.assertRaises(RuntimeError): db(db.tt.aa.belongs(db()._select(db.tt.aa))).count() with self.assertRaises(RuntimeError): db(db.tt.aa.lower()).update(aa='bb') with self.assertRaises(NotImplementedError): db().select(orderby='') with self.assertRaises(RuntimeError): MongoDBAdapter.Expanded(db._adapter, 'delete', Query(db, db._adapter.EQ, db.tt.aa, 'x'), [True]) drop(db.tt) db.close() for safe in [False, True, False]: db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa')) self.assertEqual(isinstance(db.tt.insert(aa='x'), long), True) with self.assertRaises(RuntimeError): db._adapter.delete('tt', 'x', safe=safe) self.assertEqual(db._adapter.delete( 'tt', Query(db, db._adapter.EQ, db.tt.aa, 'x'), safe=safe), 1) self.assertEqual(db(db.tt.aa=='x').count(), 0) self.assertEqual(db._adapter.update('tt', Query(db, db._adapter.EQ, db.tt.aa, 'x'), db['tt']._listify({'aa':'x'}), safe=safe), 0) drop(db.tt) db.close() def testJoin(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa', 'integer'), Field('b', 'reference tt')) i1 = db.tt.insert(aa=1) db.tt.insert(aa=4, b=i1) q = db.tt.b==db.tt.id with self.assertRaises(MongoDBAdapter.NotOnNoSqlError): db(db.tt).select(left=db.tt.on(q)) with self.assertRaises(MongoDBAdapter.NotOnNoSqlError): db(db.tt).select(join=db.tt.on(q)) with self.assertRaises(MongoDBAdapter.NotOnNoSqlError): db(db.tt).select(db.tt.on(q)) self.assertEqual(db(db.tt).count(), 2) db.tt.truncate() self.assertEqual(db(db.tt).count(), 0) drop(db.tt) db.close() @unittest.skipIf(IS_IMAP, "Skip IMAP") class TestFields(unittest.TestCase): def testFieldName(self): # Check that Fields cannot start with underscores self.assertRaises(SyntaxError, Field, '_abc', 'string') # Check that Fields cannot contain punctuation other than underscores self.assertRaises(SyntaxError, Field, 'a.bc', 'string') # Check that Fields cannot be a name of a method or property of Table for x in ['drop', 'on', 'truncate']: self.assertRaises(SyntaxError, Field, x, 'string') # Check that Fields allows underscores in the body of a field name. self.assertTrue(Field('a_bc', 'string'), "Field isn't allowing underscores in fieldnames. It should.") # Check that Field names don't allow a python keyword self.assertRaises(SyntaxError, Field, 'True', 'string') self.assertRaises(SyntaxError, Field, 'elif', 'string') self.assertRaises(SyntaxError, Field, 'while', 'string') # Check that Field names don't allow a non-valid python identifier non_valid_examples = ["1x", "xx$%@%", "xx yy", "yy\na", "yy\n"] for a in non_valid_examples: self.assertRaises(SyntaxError, Field, a, 'string') # Check that Field names don't allow a unicode string non_valid_examples = non_valid_examples = ["ℙƴ☂ℌøἤ", u"ℙƴ☂ℌøἤ", u'àè', u'ṧøмℯ', u'тεṧт', u'♥αłüℯṧ', u'ℊεᾔ℮яαт℮∂', u'♭ƴ', u'ᾔ☤ρℌℓ☺ḓ'] for a in non_valid_examples: self.assertRaises(SyntaxError, Field, a, 'string') def testFieldTypes(self): # Check that string, and password default length is 512 for typ in ['string', 'password']: self.assertTrue(Field('abc', typ).length == 512, "Default length for type '%s' is not 512 or 255" % typ) # Check that upload default length is 512 self.assertTrue(Field('abc', 'upload').length == 512, "Default length for type 'upload' is not 512") # Check that Tables passed in the type creates a reference self.assertTrue(Field('abc', Table(None, 'temp')).type == 'reference temp', 'Passing a Table does not result in a reference type.') def testFieldLabels(self): # Check that a label is successfully built from the supplied fieldname self.assertTrue(Field('abc', 'string').label == 'Abc', 'Label built is incorrect') self.assertTrue(Field('abc_def', 'string').label == 'Abc Def', 'Label built is incorrect') def testFieldFormatters(self): # Formatter should be called Validator # Test the default formatters for typ in ALLOWED_DATATYPES: f = Field('abc', typ) if typ not in ['date', 'time', 'datetime']: isinstance(f.formatter('test'), str) else: isinstance(f.formatter(datetime.datetime.now()), str) def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) import pickle # some db's only support milliseconds datetime_datetime_today = datetime.datetime.today() datetime_datetime_today = datetime_datetime_today.replace( microsecond = datetime_datetime_today.microsecond - datetime_datetime_today.microsecond % 1000) insert_vals = [ ('string', 'x', ''), ('string', 'A\xc3\xa9 A', ''), ('text', 'x', ''), ('password', 'x', ''), ('upload', 'x', ''), ('double', 3.1, 1), ('integer', 3, 1), ('boolean', True, True), ('date', datetime.date.today(), datetime.date.today()), ('datetime', datetime.datetime(1971, 12, 21, 10, 30, 55, 0), datetime_datetime_today), ('time', datetime_datetime_today.time(), datetime_datetime_today.time()), ('blob', 'x', ''), ('blob', b'xyzzy', ''), # pickling a tuple will create a string which is not UTF-8 able. ('blob', pickle.dumps((0,), pickle.HIGHEST_PROTOCOL), ''), ] if not IS_GAE: # these are unsupported by GAE insert_vals.append(('blob', bytearray('a','utf-8'), '')) insert_vals.append(('json', {'a': 'b', 'c': [1, 2]}, {})) for iv in insert_vals: db.define_table('tt', Field('aa', iv[0], default=iv[2])) # empty string stored to blob returns None default_return = None if iv[0] == 'blob' and iv[2] == '' else iv[2] self.assertTrue(isinstance(db.tt.insert(), long)) self.assertTrue(isinstance(db.tt.insert(aa=iv[1]), long)) self.assertEqual(db().select(db.tt.aa)[0].aa, default_return) self.assertEqual(db().select(db.tt.aa)[1].aa, iv[1]) if not IS_GAE: ## field aliases row = db().select(db.tt.aa.with_alias('zz'))[1] self.assertEqual(row['zz'], iv[1]) drop(db.tt) ## Row APIs db.define_table('tt', Field('aa', 'datetime', default=datetime.datetime.today())) t0 = datetime.datetime(1971, 12, 21, 10, 30, 55, 0) id = db.tt.insert(aa=t0) self.assertEqual(isinstance(id, long), True) row = db().select(db.tt.aa)[0] self.assertEqual(db.tt[id].aa,t0) self.assertEqual(db.tt['aa'],db.tt.aa) self.assertEqual(db.tt(id).aa,t0) self.assertTrue(db.tt(id,aa=None)==None) self.assertFalse(db.tt(id,aa=t0)==None) self.assertEqual(row.aa,t0) self.assertEqual(row['aa'],t0) self.assertEqual(row['tt.aa'],t0) self.assertEqual(row('tt.aa'),t0) ## Lazy and Virtual fields db.tt.b = Field.Virtual(lambda row: row.tt.aa) db.tt.c = Field.Lazy(lambda row: row.tt.aa) row = db().select(db.tt.aa)[0] self.assertEqual(row.b,t0) self.assertEqual(row.c(),t0) drop(db.tt) db.define_table('tt', Field('aa', 'time', default='11:30')) t0 = datetime.time(10, 30, 55) self.assertEqual(isinstance(db.tt.insert(aa=t0), long), True) self.assertEqual(db().select(db.tt.aa)[0].aa, t0) drop(db.tt) db.close() @unittest.skipIf(IS_IMAP, "Skip IMAP") class TestTables(unittest.TestCase): def testTableNames(self): # Check that Tables cannot start with underscores self.assertRaises(SyntaxError, Table, None, '_abc') # Check that Tables cannot contain punctuation other than underscores self.assertRaises(SyntaxError, Table, None, 'a.bc') # Check that Tables cannot be a name of a method or property of DAL for x in ['define_table', 'tables', 'as_dict']: self.assertRaises(SyntaxError, Table, None, x) # Check that Table allows underscores in the body of a field name. self.assertTrue(Table(None, 'a_bc'), "Table isn't allowing underscores in tablename. It should.") # Check that Table names don't allow a python keyword self.assertRaises(SyntaxError, Table, None, 'True') self.assertRaises(SyntaxError, Table, None, 'elif') self.assertRaises(SyntaxError, Table, None, 'while') # Check that Table names don't allow a non-valid python identifier non_valid_examples = ["1x", "xx$%@%", "xx yy", "yy\na", "yy\n"] for a in non_valid_examples: self.assertRaises(SyntaxError, Table, None, a) # Check that Table names don't allow a unicode string non_valid_examples = ["ℙƴ☂ℌøἤ", u"ℙƴ☂ℌøἤ", u'àè', u'ṧøмℯ', u'тεṧт', u'♥αłüℯṧ', u'ℊεᾔ℮яαт℮∂', u'♭ƴ', u'ᾔ☤ρℌℓ☺ḓ'] for a in non_valid_examples: self.assertRaises(SyntaxError, Table, None, a) @unittest.skipIf(IS_IMAP, "Skip IMAP") class TestAll(unittest.TestCase): def setUp(self): self.pt = Table(None,'PseudoTable',Field('name'),Field('birthdate')) def testSQLALL(self): ans = 'PseudoTable.id, PseudoTable.name, PseudoTable.birthdate' self.assertEqual(str(SQLALL(self.pt)), ans) @unittest.skipIf(IS_IMAP, "Skip IMAP") class TestTable(unittest.TestCase): def testTableCreation(self): # Check for error when not passing type other than Field or Table self.assertRaises(SyntaxError, Table, None, 'test', None) persons = Table(None, 'persons', Field('firstname','string'), Field('lastname', 'string')) # Does it have the correct fields? self.assertTrue(set(persons.fields).issuperset(set(['firstname', 'lastname']))) # ALL is set correctly self.assertTrue('persons.firstname, persons.lastname' in str(persons.ALL)) def testTableAlias(self): db = DAL(DEFAULT_URI, check_reserved=['all']) persons = Table(db, 'persons', Field('firstname', 'string'), Field('lastname', 'string')) aliens = persons.with_alias('aliens') # Are the different table instances with the same fields self.assertTrue(persons is not aliens) self.assertTrue(set(persons.fields) == set(aliens.fields)) db.close() def testTableInheritance(self): persons = Table(None, 'persons', Field('firstname', 'string'), Field('lastname', 'string')) customers = Table(None, 'customers', Field('items_purchased', 'integer'), persons) self.assertTrue(set(customers.fields).issuperset(set( ['items_purchased', 'firstname', 'lastname']))) class TestInsert(unittest.TestCase): def testRun(self): if IS_IMAP: imap = DAL(DEFAULT_URI) imap.define_tables() self.assertEqual(imap.Draft.insert(to="nurse@example.com", subject="Nurse!", sender="gumby@example.com", content="Nurse!\r\nNurse!"), 2) self.assertEqual(imap.Draft[2].subject, "Nurse!") self.assertEqual(imap.Draft[2].sender, "gumby@example.com") self.assertEqual(isinstance(imap.Draft[2].uid, long), True) self.assertEqual(imap.Draft[2].content[0]["text"], "Nurse!\r\nNurse!") imap.close() else: db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa')) self.assertEqual(isinstance(db.tt.insert(aa='1'), long), True) self.assertEqual(isinstance(db.tt.insert(aa='1'), long), True) self.assertEqual(isinstance(db.tt.insert(aa='1'), long), True) self.assertEqual(db(db.tt.aa == '1').count(), 3) self.assertEqual(db(db.tt.aa == '2').isempty(), True) self.assertEqual(db(db.tt.aa == '1').update(aa='2'), 3) self.assertEqual(db(db.tt.aa == '2').count(), 3) self.assertEqual(db(db.tt.aa == '2').isempty(), False) self.assertEqual(db(db.tt.aa == '2').delete(), 3) self.assertEqual(db(db.tt.aa == '2').isempty(), True) drop(db.tt) db.close() @unittest.skipIf(IS_IMAP, "Skip IMAP") class TestSelect(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa')) self.assertEqual(isinstance(db.tt.insert(aa='1'), long), True) self.assertEqual(isinstance(db.tt.insert(aa='2'), long), True) self.assertEqual(isinstance(db.tt.insert(aa='3'), long), True) self.assertEqual(db(db.tt.id > 0).count(), 3) self.assertEqual(db(db.tt.aa).count(), 3) self.assertEqual(db(db.tt.id).count(), 3) self.assertEqual(db(db.tt.id!=None).count(), 3) self.assertEqual(db(db.tt.id > 0).select(orderby=~db.tt.aa | db.tt.id)[0].aa, '3') self.assertEqual(db(db.tt.id > 0).select(orderby=~db.tt.aa)[0].aa, '3') self.assertEqual(len(db(db.tt.id > 0).select(limitby=(1, 2))), 1) self.assertEqual(db(db.tt.id > 0).select(limitby=(1, 2))[0].aa, '2') self.assertEqual(len(db().select(db.tt.ALL)), 3) self.assertEqual(db(db.tt.aa == None).count(), 0) self.assertEqual(db(db.tt.aa != None).count(), 3) self.assertEqual(db(db.tt.aa > '1').count(), 2) self.assertEqual(db(db.tt.aa >= '1').count(), 3) self.assertEqual(db(db.tt.aa == '1').count(), 1) self.assertEqual(db(db.tt.aa != '1').count(), 2) self.assertEqual(db(db.tt.aa < '3').count(), 2) self.assertEqual(db(db.tt.aa <= '3').count(), 3) self.assertEqual(db(db.tt.aa > '1')(db.tt.aa < '3').count(), 1) self.assertEqual(db((db.tt.aa > '1') & (db.tt.aa < '3')).count(), 1) self.assertEqual(db((db.tt.aa > '1') | (db.tt.aa < '3')).count(), 3) # Test not operator self.assertEqual(db(~(db.tt.aa != '1')).count(), 1) self.assertEqual(db(~(db.tt.aa == '1')).count(), 2) self.assertEqual(db((db.tt.aa > '1') & ~(db.tt.aa > '2')).count(), 1) self.assertEqual(db(~(db.tt.aa > '1') & (db.tt.aa > '2')).count(), 0) self.assertEqual(db(~((db.tt.aa < '1') | (db.tt.aa > '2'))).count(), 2) self.assertEqual(db(~((db.tt.aa >= '1') & (db.tt.aa <= '2'))).count(), 1) drop(db.tt) db.close() def testListInteger(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa', 'list:integer')) l=[0,1,2,3,4,5] db.tt.insert(aa=l) self.assertEqual(db(db.tt).select('tt.aa').first()[db.tt.aa],l) drop(db.tt) db.close() def testListString(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa', 'list:string')) l=['a', 'b', 'c'] db.tt.insert(aa=l) self.assertEqual(db(db.tt).select('tt.aa').first()[db.tt.aa],l) drop(db.tt) db.close() def testListReference(self): db = DAL(DEFAULT_URI, check_reserved=['all']) on_deletes = ( 'CASCADE', 'SET NULL', ) for ondelete in on_deletes: db.define_table('t0', Field('aa', 'string')) db.define_table('tt', Field('t0_id', 'list:reference t0', ondelete=ondelete)) id_a1=db.t0.insert(aa='test1') id_a2=db.t0.insert(aa='test2') ref1=[id_a1] ref2=[id_a2] ref3=[id_a1, id_a2] db.tt.insert(t0_id=ref1) self.assertEqual( db(db.tt).select(db.tt.t0_id).last()[db.tt.t0_id], ref1) db.tt.insert(t0_id=ref2) self.assertEqual( db(db.tt).select(db.tt.t0_id).last()[db.tt.t0_id], ref2) db.tt.insert(t0_id=ref3) self.assertEqual( db(db.tt).select(db.tt.t0_id).last()[db.tt.t0_id], ref3) if IS_MONGODB: self.assertEqual(db(db.tt.t0_id.contains(id_a1)).count(), 2) self.assertEqual(db(db.tt.t0_id.contains(id_a2)).count(), 2) db(db.t0.aa == 'test1').delete() if ondelete == 'SET NULL': self.assertEqual(db(db.tt).count(), 3) self.assertEqual(db(db.tt).select()[0].t0_id, []) if ondelete == 'CASCADE': self.assertEqual(db(db.tt).count(), 2) self.assertEqual(db(db.tt).select()[0].t0_id, ref2) drop(db.tt) drop(db.t0) db.close() @unittest.skipIf(IS_GAE, "no groupby in appengine") def testGroupBy(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa'), Field('bb', 'integer'), Field('cc', 'integer')) db.tt.insert(aa='1', bb=1, cc=1) db.tt.insert(aa='1', bb=2, cc=1) db.tt.insert(aa='1', bb=3, cc=1) db.tt.insert(aa='1', bb=4, cc=1) db.tt.insert(aa='2', bb=1, cc=1) db.tt.insert(aa='2', bb=2, cc=1) db.tt.insert(aa='2', bb=3, cc=1) db.tt.insert(aa='3', bb=1, cc=1) db.tt.insert(aa='3', bb=2, cc=1) db.tt.insert(aa='4', bb=1, cc=1) result = db().select(db.tt.aa, db.tt.bb.sum(), groupby=db.tt.aa) self.assertEqual(len(result), 4) result = db().select(db.tt.aa, db.tt.bb.sum(), groupby=db.tt.aa, orderby=db.tt.aa) self.assertEqual(tuple(result.response[2]), ('3', 3)) result = db().select(db.tt.aa, db.tt.bb.sum(), groupby=db.tt.aa, orderby=~db.tt.aa) self.assertEqual(tuple(result.response[1]), ('3', 3)) result = db().select(db.tt.aa, db.tt.bb, db.tt.cc.sum(), groupby=db.tt.aa|db.tt.bb, orderby=(db.tt.aa|~db.tt.bb)) self.assertEqual(tuple(result.response[4]), ('2', 3, 1)) result = db().select(db.tt.aa, db.tt.bb.sum(), groupby=db.tt.aa, orderby=~db.tt.aa, limitby=(1,2)) self.assertEqual(len(result), 1) self.assertEqual(tuple(result.response[0]), ('3', 3)) db.tt.drop() db.close() @unittest.skipIf(IS_IMAP, "TODO: IMAP test") class TestAddMethod(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa')) @db.tt.add_method.all def select_all(table,orderby=None): return table._db(table).select(orderby=orderby) self.assertEqual(isinstance(db.tt.insert(aa='1'), long), True) self.assertEqual(isinstance(db.tt.insert(aa='2'), long), True) self.assertEqual(isinstance(db.tt.insert(aa='3'), long), True) self.assertEqual(len(db.tt.all()), 3) drop(db.tt) db.close() @unittest.skipIf(IS_IMAP, "TODO: IMAP test") class TestBelongs(unittest.TestCase): def __init__(self, *args, **vars): unittest.TestCase.__init__(self, *args, **vars) self.db = None def setUp(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa')) self.i_id = db.tt.insert(aa='1') self.assertEqual(isinstance(self.i_id, long), True) self.assertEqual(isinstance(db.tt.insert(aa='2'), long), True) self.assertEqual(isinstance(db.tt.insert(aa='3'), long), True) self.db = db def testRun(self): db = self.db self.assertEqual(db(db.tt.aa.belongs(('1', '3'))).count(), 2) self.assertEqual(db(db.tt.aa.belongs(['1', '3'])).count(), 2) self.assertEqual(db(db.tt.aa.belongs(['1', '3'])).count(), 2) self.assertEqual(db(db.tt.id.belongs([self.i_id])).count(), 1) self.assertEqual(db(db.tt.id.belongs([])).count(), 0) @unittest.skipIf(IS_GAE or IS_MONGODB, "Datastore/Mongodb belongs() does not accept nested queries") def testNested(self): db = self.db self.assertEqual(db(db.tt.aa.belongs(db(db.tt.id == self.i_id)._select(db.tt.aa))).count(), 1) self.assertEqual(db(db.tt.aa.belongs(db(db.tt.aa.belongs(('1', '3')))._select(db.tt.aa))).count(), 2) self.assertEqual(db(db.tt.aa.belongs(db(db.tt.aa.belongs(db (db.tt.aa.belongs(('1', '3')))._select(db.tt.aa)))._select( db.tt.aa))).count(), 2) def tearDown(self): db = self.db drop(db.tt) db.close() self.db = None @unittest.skipIf(IS_GAE or IS_IMAP, "Contains not supported on GAE Datastore. TODO: IMAP tests") class TestContains(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa', 'list:string'), Field('bb','string')) self.assertEqual(isinstance(db.tt.insert(aa=['aaa','bbb'],bb='aaa'), long), True) self.assertEqual(isinstance(db.tt.insert(aa=['bbb','ddd'],bb='abb'), long), True) self.assertEqual(isinstance(db.tt.insert(aa=['eee','aaa'],bb='acc'), long), True) self.assertEqual(db(db.tt.aa.contains('aaa')).count(), 2) self.assertEqual(db(db.tt.aa.contains('bbb')).count(), 2) self.assertEqual(db(db.tt.aa.contains('aa')).count(), 0) self.assertEqual(db(db.tt.bb.contains('a')).count(), 3) self.assertEqual(db(db.tt.bb.contains('b')).count(), 1) self.assertEqual(db(db.tt.bb.contains('d')).count(), 0) self.assertEqual(db(db.tt.aa.contains(db.tt.bb)).count(), 1) # case-sensitivity tests, if 1 it isn't is_case_insensitive = db(db.tt.bb.contains('AAA', case_sensitive=True)).count() if is_case_insensitive: self.assertEqual(db(db.tt.aa.contains('AAA')).count(), 2) self.assertEqual(db(db.tt.bb.contains('A')).count(), 3) else: self.assertEqual(db(db.tt.aa.contains('AAA', case_sensitive=True)).count(), 0) self.assertEqual(db(db.tt.bb.contains('A', case_sensitive=True)).count(), 0) self.assertEqual(db(db.tt.aa.contains('AAA', case_sensitive=False)).count(), 2) self.assertEqual(db(db.tt.bb.contains('A', case_sensitive=False)).count(), 3) db.tt.drop() # integers in string fields db.define_table('tt', Field('aa', 'list:string'), Field('bb','string'), Field('cc','integer')) self.assertEqual(isinstance(db.tt.insert(aa=['123','456'],bb='123', cc=12), long), True) self.assertEqual(isinstance(db.tt.insert(aa=['124','456'],bb='123', cc=123), long), True) self.assertEqual(isinstance(db.tt.insert(aa=['125','457'],bb='23', cc=125), long), True) self.assertEqual(db(db.tt.aa.contains(123)).count(), 1) self.assertEqual(db(db.tt.aa.contains(23)).count(), 0) self.assertEqual(db(db.tt.aa.contains(db.tt.cc)).count(), 1) self.assertEqual(db(db.tt.bb.contains(123)).count(), 2) self.assertEqual(db(db.tt.bb.contains(23)).count(), 3) self.assertEqual(db(db.tt.bb.contains(db.tt.cc)).count(), 2) db.tt.drop() # string field contains string field db.define_table('tt', Field('aa'), Field('bb')) db.tt.insert(aa='aaa', bb='%aaa') db.tt.insert(aa='aaa', bb='aaa') self.assertEqual(db(db.tt.aa.contains(db.tt.bb)).count(), 1) drop(db.tt) # escaping db.define_table('tt', Field('aa')) db.tt.insert(aa='perc%ent') db.tt.insert(aa='percent') db.tt.insert(aa='percxyzent') db.tt.insert(aa='under_score') db.tt.insert(aa='underxscore') db.tt.insert(aa='underyscore') self.assertEqual(db(db.tt.aa.contains('perc%ent')).count(), 1) self.assertEqual(db(db.tt.aa.contains('under_score')).count(), 1) drop(db.tt) db.close() @unittest.skipIf(IS_GAE, "Like not supported on GAE Datastore.") @unittest.skipIf(IS_IMAP, "TODO: IMAP test") class TestLike(unittest.TestCase): def setUp(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa')) self.assertEqual(isinstance(db.tt.insert(aa='abc'), long), True) self.db = db def tearDown(self): db = self.db drop(db.tt) db.close() self.db = None def testRun(self): db = self.db self.assertEqual(db(db.tt.aa.like('a%')).count(), 1) self.assertEqual(db(db.tt.aa.like('%b%')).count(), 1) self.assertEqual(db(db.tt.aa.like('%c')).count(), 1) self.assertEqual(db(db.tt.aa.like('%d%')).count(), 0) self.assertEqual(db(db.tt.aa.like('ab_')).count(), 1) self.assertEqual(db(db.tt.aa.like('a_c')).count(), 1) self.assertEqual(db(db.tt.aa.like('_bc')).count(), 1) self.assertEqual(db(db.tt.aa.like('A%', case_sensitive=False)).count(), 1) self.assertEqual(db(db.tt.aa.like('%B%', case_sensitive=False)).count(), 1) self.assertEqual(db(db.tt.aa.like('%C', case_sensitive=False)).count(), 1) self.assertEqual(db(db.tt.aa.ilike('A%')).count(), 1) self.assertEqual(db(db.tt.aa.ilike('%B%')).count(), 1) self.assertEqual(db(db.tt.aa.ilike('%C')).count(), 1) #DAL maps like() (and contains(), startswith(), endswith()) #to the LIKE operator, that in ANSI-SQL is case-sensitive #There are backends supporting case-sensitivity by default #and backends that needs additional care to turn #case-sensitivity on. To discern among those, let's run #this query comparing previously inserted 'abc' with 'ABC': #if the result is 0, then the backend recognizes #case-sensitivity, if 1 it isn't is_case_insensitive = db(db.tt.aa.like('%ABC%')).count() self.assertEqual(db(db.tt.aa.like('A%')).count(), is_case_insensitive) self.assertEqual(db(db.tt.aa.like('%B%')).count(), is_case_insensitive) self.assertEqual(db(db.tt.aa.like('%C')).count(), is_case_insensitive) def testUpperLower(self): db = self.db self.assertEqual(db(db.tt.aa.upper().like('A%')).count(), 1) self.assertEqual(db(db.tt.aa.upper().like('%B%')).count(),1) self.assertEqual(db(db.tt.aa.upper().like('%C')).count(), 1) self.assertEqual(db(db.tt.aa.lower().like('%c')).count(), 1) def testStartsEndsWith(self): db = self.db self.assertEqual(db(db.tt.aa.startswith('a')).count(), 1) self.assertEqual(db(db.tt.aa.endswith('c')).count(), 1) self.assertEqual(db(db.tt.aa.startswith('c')).count(), 0) self.assertEqual(db(db.tt.aa.endswith('a')).count(), 0) def testEscaping(self): db = self.db term = 'ahbc'.replace('h', '\\') #funny but to avoid any doubts... db.tt.insert(aa='a%bc') db.tt.insert(aa='a_bc') db.tt.insert(aa=term) self.assertEqual(db(db.tt.aa.like('%ax%bc%', escape='x')).count(), 1) self.assertEqual(db(db.tt.aa.like('%ax_bc%', escape='x')).count(), 1) self.assertEqual(db(db.tt.aa.like('%'+term+'%')).count(), 1) db(db.tt.id>0).delete() # test "literal" like, i.e. exactly as LIKE in the backend db.tt.insert(aa='perc%ent') db.tt.insert(aa='percent') db.tt.insert(aa='percxyzent') db.tt.insert(aa='under_score') db.tt.insert(aa='underxscore') db.tt.insert(aa='underyscore') self.assertEqual(db(db.tt.aa.like('%perc%ent%')).count(), 3) self.assertEqual(db(db.tt.aa.like('%under_score%')).count(), 3) db(db.tt.id>0).delete() # escaping with startswith and endswith db.tt.insert(aa='%percent') db.tt.insert(aa='xpercent') db.tt.insert(aa='discount%') db.tt.insert(aa='discountx') self.assertEqual(db(db.tt.aa.endswith('discount%')).count(), 1) self.assertEqual(db(db.tt.aa.like('discount%%')).count(), 2) self.assertEqual(db(db.tt.aa.startswith('%percent')).count(), 1) self.assertEqual(db(db.tt.aa.like('%%percent')).count(), 2) def testRegexp(self): db = self.db db(db.tt.id>0).delete() db.tt.insert(aa='%percent') db.tt.insert(aa='xpercent') db.tt.insert(aa='discount%') db.tt.insert(aa='discountx') try: self.assertEqual(db(db.tt.aa.regexp('count')).count(), 2) except NotImplementedError: pass else: self.assertEqual(db(db.tt.aa.lower().regexp('count')).count(), 2) self.assertEqual(db(db.tt.aa.upper().regexp('COUNT') & db.tt.aa.lower().regexp('count')).count(), 2) self.assertEqual(db(db.tt.aa.upper().regexp('COUNT') | (db.tt.aa.lower()=='xpercent')).count(), 3) def testLikeInteger(self): db = self.db db.tt.drop() db.define_table('tt', Field('aa', 'integer')) self.assertEqual(isinstance(db.tt.insert(aa=1111111111), long), True) self.assertEqual(isinstance(db.tt.insert(aa=1234567), long), True) self.assertEqual(db(db.tt.aa.like('1%')).count(), 2) self.assertEqual(db(db.tt.aa.like('1_3%')).count(), 1) self.assertEqual(db(db.tt.aa.like('2%')).count(), 0) self.assertEqual(db(db.tt.aa.like('_2%')).count(), 1) self.assertEqual(db(db.tt.aa.like('12%')).count(), 1) self.assertEqual(db(db.tt.aa.like('012%')).count(), 0) self.assertEqual(db(db.tt.aa.like('%45%')).count(), 1) self.assertEqual(db(db.tt.aa.like('%54%')).count(), 0) @unittest.skipIf(IS_IMAP, "TODO: IMAP test") class TestDatetime(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa', 'datetime')) self.assertEqual(isinstance(db.tt.insert(aa=datetime.datetime(1971, 12, 21, 11, 30)), long), True) self.assertEqual(isinstance(db.tt.insert(aa=datetime.datetime(1971, 11, 21, 10, 30)), long), True) self.assertEqual(isinstance(db.tt.insert(aa=datetime.datetime(1970, 12, 21, 9, 31)), long), True) self.assertEqual(db(db.tt.aa == datetime.datetime(1971, 12, 21, 11, 30)).count(), 1) self.assertEqual(db(db.tt.aa >= datetime.datetime(1971, 1, 1)).count(), 2) if IS_MONGODB: self.assertEqual(db(db.tt.aa.year() == 1971).count(), 2) self.assertEqual(db(db.tt.aa.month() > 11).count(), 2) self.assertEqual(db(db.tt.aa.day() >= 21).count(), 3) self.assertEqual(db(db.tt.aa.hour() < 10).count(), 1) self.assertEqual(db(db.tt.aa.minutes() <= 30).count(), 2) self.assertEqual(db(db.tt.aa.seconds() != 31).count(), 3) self.assertEqual(db(db.tt.aa.epoch() < 365*24*3600).delete(), 1) drop(db.tt) db.define_table('tt', Field('aa', 'time')) t0 = datetime.time(10, 30, 55) db.tt.insert(aa=t0) self.assertEqual(db().select(db.tt.aa)[0].aa, t0) drop(db.tt) db.define_table('tt', Field('aa', 'date')) t0 = datetime.date.today() db.tt.insert(aa=t0) self.assertEqual(db().select(db.tt.aa)[0].aa, t0) drop(db.tt) db.close() @unittest.skipIf(IS_GAE or IS_IMAP, "Expressions are not supported") class TestExpressions(unittest.TestCase): def testRun(self): if IS_MONGODB: DAL_OPTS = ( (True, {'adapter_args': {'safe': True}}), (False, {'adapter_args': {'safe': False}}), ) for dal_opt in DAL_OPTS: db = DAL(DEFAULT_URI, check_reserved=['all'], **dal_opt[1]) db.define_table('tt', Field('aa', 'integer'), Field('bb', 'integer'), Field('cc')) self.assertEqual(isinstance(db.tt.insert(aa=1), long), dal_opt[0]) self.assertEqual(isinstance(db.tt.insert(aa=2), long), dal_opt[0]) self.assertEqual(isinstance(db.tt.insert(aa=3), long), dal_opt[0]) # test update self.assertEqual(db(db.tt.aa == 3).update(aa=db.tt.aa + 1, bb=db.tt.aa - 1), 1) self.assertEqual(db(db.tt.aa == 4).count(), 1) self.assertEqual(db(db.tt.bb == 2).count(), 1) self.assertEqual(db(db.tt.aa == -2).count(), 0) self.assertEqual(db(db.tt.aa == 4).update(aa=db.tt.aa * 2, bb=5), 1) self.assertEqual(db(db.tt.bb == 5).count(), 1) self.assertEqual(db(db.tt.aa + 1 == 9).count(), 1) self.assertEqual(db(db.tt.aa + 1 == 9).update(aa=db.tt.aa - 2, cc='cc'), 1) self.assertEqual(db(db.tt.cc == 'cc').count(), 1) self.assertEqual(db(db.tt.aa == 6).count(), 1) self.assertEqual(db(db.tt.aa == 6).update(aa=db.tt.aa / 2 + 4, bb=db.tt.aa * (db.tt.bb - 3)), 1) self.assertEqual(db(db.tt.bb == 12).count(), 1) self.assertEqual(db(db.tt.aa == 7).count(), 1) self.assertEqual(db(db.tt.aa == 7).update(aa=db.tt.aa % 4, cc=db.tt.cc + '1' +'1'), 1) self.assertEqual(db(db.tt.cc == 'cc11').count(), 1) self.assertEqual(db(db.tt.aa == 3).count(), 1) # test comparsion expression based count self.assertEqual(db(db.tt.aa != db.tt.aa).count(), 0) self.assertEqual(db(db.tt.aa == db.tt.aa).count(), 3) # test select aggregations sum = (db.tt.aa + 1).sum() self.assertEqual(db(db.tt.aa + 1 >= 3).select(sum).first()[sum], 7) self.assertEqual(db(db.tt.aa * 2 == -2).select(sum).first()[sum], None) count=db.tt.aa.count() avg=db.tt.aa.avg() min=db.tt.aa.min() max=db.tt.aa.max() result = db(db.tt).select(sum, count, avg, min, max).first() self.assertEqual(result[sum], 9) self.assertEqual(result[count], 3) self.assertEqual(result[avg], 2) self.assertEqual(result[min], 1) self.assertEqual(result[max], 3) # Test basic expressions evaluated at python level self.assertEqual(db((1==1) & (db.tt.aa >= 2)).count(), 2) self.assertEqual(db((1==1) | (db.tt.aa >= 2)).count(), 3) self.assertEqual(db((1==0) & (db.tt.aa >= 2)).count(), 0) self.assertEqual(db((1==0) | (db.tt.aa >= 2)).count(), 2) # test abs() self.assertEqual(db(db.tt.aa == 2).update(aa=db.tt.aa*-10), 1) abs=db.tt.aa.abs().with_alias('abs') result = db(db.tt.aa == -20).select(abs).first() self.assertEqual(result[abs], 20) self.assertEqual(result['abs'], 20) abs=db.tt.aa.abs()/10+5 exp=abs.min()*2+1 result = db(db.tt.aa == -20).select(exp).first() self.assertEqual(result[exp], 15) # test case() case=(db.tt.aa > 2).case(db.tt.aa + 2, db.tt.aa - 2).with_alias('case') result = db().select(case) self.assertEqual(len(result), 3) self.assertEqual(result[0][case], -1) self.assertEqual(result[0]['case'], -1) self.assertEqual(result[1]['case'], -22) self.assertEqual(result[2]['case'], 5) # test expression based delete self.assertEqual(db(db.tt.aa + 1 >= 4).count(), 1) self.assertEqual(db(db.tt.aa + 1 >= 4).delete(), 1) self.assertEqual(db(db.tt.aa).count(), 2) # cleanup drop(db.tt) db.close() def testUpdate(self): db = DAL(DEFAULT_URI, check_reserved=['all']) # some db's only support milliseconds datetime_datetime_today = datetime.datetime.today() datetime_datetime_today = datetime_datetime_today.replace( microsecond = datetime_datetime_today.microsecond - datetime_datetime_today.microsecond % 1000) update_vals = ( ('float', 1.0), ('string', 'x'), ('text', 'x'), ('password', 'x'), ('integer', 1), ('bigint', 1), ('float', 1.0), ('double', 1.0), ('boolean', True), ('date', datetime.date.today()), ('datetime', datetime.datetime(1971, 12, 21, 10, 30, 55, 0)), ('time', datetime_datetime_today.time()) ) for uv in update_vals: db.define_table('tt', Field('aa', 'integer', default=0), Field('bb', uv[0])) self.assertTrue(isinstance(db.tt.insert(bb=uv[1]), long)) self.assertEqual(db(db.tt.aa + 1 == 1).select(db.tt.bb)[0].bb, uv[1]) self.assertEqual(db(db.tt.aa + 1 == 1).update(bb=uv[1]), 1) self.assertEqual(db(db.tt.aa / 3 == 0).select(db.tt.bb)[0].bb, uv[1]) drop(db.tt) db.close() def testSubstring(self): if IS_MONGODB: # MongoDB does not support string length end = 3 else: end = -2 db = DAL(DEFAULT_URI, check_reserved=['all']) t0 = db.define_table('t0', Field('name')) input_name = "web2py" t0.insert(name=input_name) exp_slice = t0.name.lower()[4:6] exp_slice_no_max = t0.name.lower()[4:] exp_slice_neg_max = t0.name.lower()[2:end] exp_slice_neg_start = t0.name.lower()[end:] exp_item = t0.name.lower()[3] out = db(t0).select(exp_slice, exp_item, exp_slice_no_max, exp_slice_neg_max, exp_slice_neg_start).first() self.assertEqual(out[exp_slice], input_name[4:6]) self.assertEqual(out[exp_item], input_name[3]) self.assertEqual(out[exp_slice_no_max], input_name[4:]) self.assertEqual(out[exp_slice_neg_max], input_name[2:end]) self.assertEqual(out[exp_slice_neg_start], input_name[end:]) t0.drop() db.close() def testOps(self): db = DAL(DEFAULT_URI, check_reserved=['all']) t0 = db.define_table('t0', Field('vv', 'integer')) self.assertTrue(isinstance(db.t0.insert(vv=1), long)) self.assertTrue(isinstance(db.t0.insert(vv=2), long)) self.assertTrue(isinstance(db.t0.insert(vv=3), long)) sum = db.t0.vv.sum() count = db.t0.vv.count() avg=db.t0.vv.avg() op = sum/count op1 = (sum/count).with_alias('tot') self.assertEqual(db(t0).select(op).first()[op], 2) self.assertEqual(db(t0).select(op1).first()[op1], 2) self.assertEqual(db(t0).select(op1).first()['tot'], 2) op2 = avg*count self.assertEqual(db(t0).select(op2).first()[op2], 6) # the following is not possible at least on sqlite sum = db.t0.vv.sum().with_alias('s') count = db.t0.vv.count().with_alias('c') op = sum/count with self.assertRaises(SyntaxError): self.assertEqual(db(t0).select(op).first()[op], 2) t0.drop() db.close() @unittest.skip("JOIN queries are not supported") class TestJoin(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('t1', Field('aa')) db.define_table('t2', Field('aa'), Field('b', db.t1)) i1 = db.t1.insert(aa='1') i2 = db.t1.insert(aa='2') i3 = db.t1.insert(aa='3') db.t2.insert(aa='4', b=i1) db.t2.insert(aa='5', b=i2) db.t2.insert(aa='6', b=i2) self.assertEqual(len(db(db.t1.id == db.t2.b).select(orderby=db.t1.aa | db.t2.aa)), 3) self.assertEqual(db(db.t1.id == db.t2.b).select(orderby=db.t1.aa | db.t2.aa)[2].t1.aa, '2') self.assertEqual(db(db.t1.id == db.t2.b).select(orderby=db.t1.aa | db.t2.aa)[2].t2.aa, '6') self.assertEqual(len(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)), 4) self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[2].t1.aa, '2') self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[2].t2.aa, '6') self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[3].t1.aa, '3') self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[3].t2.aa, None) self.assertEqual(len(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)), 3) self.assertEqual(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)[0]._extra[db.t2.id.count()], 1) self.assertEqual(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)[1]._extra[db.t2.id.count()], 2) self.assertEqual(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)[2]._extra[db.t2.id.count()], 0) drop(db.t2) drop(db.t1) db.define_table('person',Field('name')) id = db.person.insert(name="max") self.assertEqual(id.name,'max') db.define_table('dog',Field('name'),Field('ownerperson','reference person')) db.dog.insert(name='skipper',ownerperson=1) row = db(db.person.id==db.dog.ownerperson).select().first() self.assertEqual(row[db.person.name],'max') self.assertEqual(row['person.name'],'max') drop(db.dog) self.assertEqual(len(db.person._referenced_by),0) drop(db.person) db.close() @unittest.skipIf(IS_GAE or IS_IMAP, 'TODO: Datastore throws "AttributeError: Row object has no attribute _extra"') class TestMinMaxSumAvg(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa', 'integer')) self.assertEqual(isinstance(db.tt.insert(aa=1), long), True) self.assertEqual(isinstance(db.tt.insert(aa=2), long), True) self.assertEqual(isinstance(db.tt.insert(aa=3), long), True) s = db.tt.aa.min() self.assertEqual(db(db.tt.id > 0).select(s)[0]._extra[s], 1) self.assertEqual(db(db.tt.id > 0).select(s).first()[s], 1) self.assertEqual(db().select(s).first()[s], 1) s = db.tt.aa.max() self.assertEqual(db().select(s).first()[s], 3) s = db.tt.aa.sum() self.assertEqual(db().select(s).first()[s], 6) s = db.tt.aa.count() self.assertEqual(db().select(s).first()[s], 3) s = db.tt.aa.avg() self.assertEqual(db().select(s).first()[s], 2) drop(db.tt) db.close() @unittest.skipIf(IS_IMAP, "Skip IMAP") class TestMigrations(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa'), migrate='.storage.table') db.commit() db.close() db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa'), Field('b'), migrate='.storage.table') db.commit() db.close() db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa'), Field('b', 'text'), migrate='.storage.table') db.commit() db.close() db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa'), migrate='.storage.table') drop(db.tt) db.commit() db.close() def tearDown(self): if os.path.exists('.storage.db'): os.unlink('.storage.db') if os.path.exists('.storage.table'): os.unlink('.storage.table') @unittest.skipIf(IS_IMAP, "Skip IMAP") class TestReference(unittest.TestCase): def testRun(self): scenarios = ( (True, 'CASCADE'), (False, 'CASCADE'), (False, 'SET NULL'), ) for (b, ondelete) in scenarios: db = DAL(DEFAULT_URI, check_reserved=['all'], bigint_id=b) db.define_table('tt', Field('name'), Field('aa','reference tt',ondelete=ondelete)) db.commit() x = db.tt.insert(name='xxx') self.assertTrue(isinstance(x, long)) self.assertEqual(x.id, x) self.assertEqual(x['id'], x) x.aa = x x.update_record() x1 = db.tt[x] self.assertEqual(x1.aa, x) self.assertEqual(x1.aa.aa.aa.aa.aa.aa.name, 'xxx') y=db.tt.insert(name='yyy', aa = x1) self.assertEqual(y.aa, x1.id) self.assertTrue(isinstance(db.tt.insert(name='zzz'), long)) self.assertEqual(db(db.tt.name).count(), 3) if IS_MONGODB: db(db.tt.id == x).delete() expected_count = { 'SET NULL': 2, 'CASCADE': 1, } self.assertEqual(db(db.tt.name).count(), expected_count[ondelete]) if ondelete == 'SET NULL': self.assertEqual(db(db.tt.name == 'yyy').select()[0].aa, 0) drop(db.tt) db.commit() db.close() @unittest.skipIf(IS_IMAP, "Skip IMAP") class TestClientLevelOps(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa')) db.commit() db.tt.insert(aa="test") rows1 = db(db.tt.aa=='test').select() rows2 = db(db.tt.aa=='test').select() rows3 = rows1 & rows2 assert len(rows3) == 2 rows4 = rows1 | rows2 assert len(rows4) == 1 rows5 = rows1.find(lambda row: row.aa=="test") assert len(rows5) == 1 rows6 = rows2.exclude(lambda row: row.aa=="test") assert len(rows6) == 1 rows7 = rows5.sort(lambda row: row.aa) assert len(rows7) == 1 drop(db.tt) db.commit() db.close() @unittest.skipIf(IS_IMAP, "TODO: IMAP test") class TestVirtualFields(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa')) db.commit() db.tt.insert(aa="test") class Compute: def a_upper(row): return row.tt.aa.upper() db.tt.virtualfields.append(Compute()) assert db(db.tt.id>0).select().first().a_upper == 'TEST' drop(db.tt) db.commit() db.close() @unittest.skipIf(IS_IMAP, "TODO: IMAP test") class TestComputedFields(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa'), Field('bb',default='x'), Field('cc',compute=lambda r: r.aa+r.bb)) db.commit() id = db.tt.insert(aa="z") self.assertEqual(db.tt[id].cc,'zx') drop(db.tt) db.commit() # test checking that a compute field can refer to earlier-defined computed fields db.define_table('tt', Field('aa'), Field('bb',default='x'), Field('cc',compute=lambda r: r.aa+r.bb), Field('dd',compute=lambda r: r.bb + r.cc)) db.commit() id = db.tt.insert(aa="z") self.assertEqual(db.tt[id].dd,'xzx') drop(db.tt) db.commit() db.close() @unittest.skipIf(IS_IMAP, "TODO: IMAP test") class TestCommonFilters(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('t1', Field('aa', 'integer')) db.define_table('t2', Field('aa', 'integer'), Field('b', db.t1)) i1 = db.t1.insert(aa=1) i2 = db.t1.insert(aa=2) i3 = db.t1.insert(aa=3) db.t2.insert(aa=4, b=i1) db.t2.insert(aa=5, b=i2) db.t2.insert(aa=6, b=i2) db.t1._common_filter = lambda q: db.t1.aa>1 self.assertEqual(db(db.t1).count(),2) self.assertEqual(db(db.t1).count(),2) db.t2._common_filter = lambda q: db.t2.aa<6 # test delete self.assertEqual(db(db.t2).count(),2) db(db.t2).delete() self.assertEqual(db(db.t2).count(),0) db.t2._common_filter = None self.assertEqual(db(db.t2).count(),1) # test update db.t2.insert(aa=4, b=i1) db.t2.insert(aa=5, b=i2) db.t2._common_filter = lambda q: db.t2.aa<6 self.assertEqual(db(db.t2).count(),2) db(db.t2).update(aa=6) self.assertEqual(db(db.t2).count(),0) db.t2._common_filter = None self.assertEqual(db(db.t2).count(),3) drop(db.t2) drop(db.t1) db.close() @unittest.skipIf(IS_IMAP, "Skip IMAP test") class TestImportExportFields(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('person', Field('name')) db.define_table('pet',Field('friend',db.person),Field('name')) for n in range(2): db(db.pet).delete() db(db.person).delete() for k in range(10): id = db.person.insert(name=str(k)) db.pet.insert(friend=id,name=str(k)) db.commit() stream = StringIO() db.export_to_csv_file(stream) db(db.pet).delete() db(db.person).delete() stream = StringIO(stream.getvalue()) db.import_from_csv_file(stream) assert db(db.person).count()==10 assert db(db.pet.name).count()==10 drop(db.pet) drop(db.person) db.commit() db.close() @unittest.skipIf(IS_IMAP, "Skip IMAP test") class TestImportExportUuidFields(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('person', Field('name'),Field('uuid')) db.define_table('pet',Field('friend',db.person),Field('name')) for n in range(2): db(db.pet).delete() db(db.person).delete() for k in range(10): id = db.person.insert(name=str(k),uuid=str(k)) db.pet.insert(friend=id,name=str(k)) db.commit() stream = StringIO() db.export_to_csv_file(stream) db(db.person).delete() db(db.pet).delete() stream = StringIO(stream.getvalue()) db.import_from_csv_file(stream) assert db(db.person).count()==10 assert db(db.pet).count()==10 drop(db.pet) drop(db.person) db.commit() db.close() @unittest.skipIf(IS_IMAP, "Skip IMAP test") class TestDALDictImportExport(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('person', Field('name', default="Michael"),Field('uuid')) db.define_table('pet',Field('friend',db.person),Field('name')) dbdict = db.as_dict(flat=True, sanitize=False) assert isinstance(dbdict, dict) uri = dbdict["uri"] assert isinstance(uri, basestring) and uri assert len(dbdict["tables"]) == 2 assert len(dbdict["tables"][0]["fields"]) == 3 assert dbdict["tables"][0]["fields"][1]["type"] == db.person.name.type assert dbdict["tables"][0]["fields"][1]["default"] == db.person.name.default db2 = DAL(**dbdict) assert len(db.tables) == len(db2.tables) assert hasattr(db2, "pet") and isinstance(db2.pet, Table) assert hasattr(db2.pet, "friend") and isinstance(db2.pet.friend, Field) drop(db.pet) db.commit() db2.commit() have_serializers = True try: import serializers dbjson = db.as_json(sanitize=False) assert isinstance(dbjson, basestring) and len(dbjson) > 0 unicode_keys = True if sys.version < "2.6.5": unicode_keys = False db3 = DAL(**serializers.loads_json(dbjson, unicode_keys=unicode_keys)) assert hasattr(db3, "person") and hasattr(db3.person, "uuid") and\ db3.person.uuid.type == db.person.uuid.type drop(db3.person) db3.commit() db3.close() except ImportError: pass mpfc = "Monty Python's Flying Circus" dbdict4 = {"uri": DEFAULT_URI, "tables":[{"tablename": "tvshow", "fields": [{"fieldname": "name", "default":mpfc}, {"fieldname": "rating", "type":"double"}]}, {"tablename": "staff", "fields": [{"fieldname": "name", "default":"Michael"}, {"fieldname": "food", "default":"Spam"}, {"fieldname": "tvshow", "type": "reference tvshow"}]}]} db4 = DAL(**dbdict4) assert "staff" in db4.tables assert "name" in db4.staff assert db4.tvshow.rating.type == "double" assert (isinstance(db4.tvshow.insert(), long), isinstance(db4.tvshow.insert(name="Loriot"), long), isinstance(db4.tvshow.insert(name="Il Mattatore"), long)) == (True, True, True) assert isinstance(db4(db4.tvshow).select().first().id, long) == True assert db4(db4.tvshow).select().first().name == mpfc drop(db4.staff) drop(db4.tvshow) db4.commit() dbdict5 = {"uri": DEFAULT_URI} db5 = DAL(**dbdict5) assert db5.tables in ([], None) assert not (str(db5) in ("", None)) dbdict6 = {"uri": DEFAULT_URI, "tables":[{"tablename": "staff"}, {"tablename": "tvshow", "fields": [{"fieldname": "name"}, {"fieldname": "rating", "type":"double"} ] }] } db6 = DAL(**dbdict6) assert len(db6["staff"].fields) == 1 assert "name" in db6["tvshow"].fields assert db6.staff.insert() is not None assert isinstance(db6(db6.staff).select().first().id, long) == True drop(db6.staff) drop(db6.tvshow) db6.commit() db.close() db2.close() db4.close() db5.close() db6.close() @unittest.skipIf(IS_IMAP, "TODO: IMAP test") class TestSelectAsDict(unittest.TestCase): def testSelect(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table( 'a_table', Field('b_field'), Field('a_field'), ) db.a_table.insert(a_field="aa1", b_field="bb1") rtn = db(db.a_table).select(db.a_table.id, db.a_table.b_field, db.a_table.a_field).as_list() self.assertEqual(rtn[0]['b_field'], 'bb1') keys = rtn[0].keys() self.assertEqual(len(keys), 3) self.assertEqual(("id" in keys, "b_field" in keys, "a_field" in keys), (True, True, True)) drop(db.a_table) db.close() @unittest.skipIf(IS_IMAP, "TODO: IMAP test") class TestRNameTable(unittest.TestCase): #tests for highly experimental rname attribute def testSelect(self): db = DAL(DEFAULT_URI, check_reserved=['all']) rname = db._adapter.QUOTE_TEMPLATE % 'a very complicated tablename' db.define_table( 'easy_name', Field('a_field'), rname=rname ) rtn = db.easy_name.insert(a_field='a') self.assertEqual(isinstance(rtn.id, long), True) rtn = db(db.easy_name.a_field == 'a').select() self.assertEqual(len(rtn), 1) self.assertEqual(isinstance(rtn[0].id, long), True) self.assertEqual(rtn[0].a_field, 'a') db.easy_name.insert(a_field='b') self.assertEqual(db(db.easy_name).count(), 2) rtn = db(db.easy_name.a_field == 'a').update(a_field='c') self.assertEqual(rtn, 1) #clean up drop(db.easy_name) db.close() @unittest.skip("JOIN queries are not supported") def testJoin(self): db = DAL(DEFAULT_URI, check_reserved=['all']) rname = db._adapter.QUOTE_TEMPLATE % 'this is table t1' rname2 = db._adapter.QUOTE_TEMPLATE % 'this is table t2' db.define_table('t1', Field('aa'), rname=rname) db.define_table('t2', Field('aa'), Field('b', db.t1), rname=rname2) i1 = db.t1.insert(aa='1') i2 = db.t1.insert(aa='2') i3 = db.t1.insert(aa='3') db.t2.insert(aa='4', b=i1) db.t2.insert(aa='5', b=i2) db.t2.insert(aa='6', b=i2) self.assertEqual(len(db(db.t1.id == db.t2.b).select(orderby=db.t1.aa | db.t2.aa)), 3) self.assertEqual(db(db.t1.id == db.t2.b).select(orderby=db.t1.aa | db.t2.aa)[2].t1.aa, '2') self.assertEqual(db(db.t1.id == db.t2.b).select(orderby=db.t1.aa | db.t2.aa)[2].t2.aa, '6') self.assertEqual(len(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)), 4) self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[2].t1.aa, '2') self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[2].t2.aa, '6') self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[3].t1.aa, '3') self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[3].t2.aa, None) self.assertEqual(len(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)), 3) self.assertEqual(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)[0]._extra[db.t2.id.count()], 1) self.assertEqual(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)[1]._extra[db.t2.id.count()], 2) self.assertEqual(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)[2]._extra[db.t2.id.count()], 0) drop(db.t2) drop(db.t1) db.define_table('person',Field('name'), rname=rname) id = db.person.insert(name="max") self.assertEqual(id.name,'max') db.define_table('dog',Field('name'),Field('ownerperson','reference person'), rname=rname2) db.dog.insert(name='skipper',ownerperson=1) row = db(db.person.id==db.dog.ownerperson).select().first() self.assertEqual(row[db.person.name],'max') self.assertEqual(row['person.name'],'max') drop(db.dog) self.assertEqual(len(db.person._referenced_by),0) drop(db.person) db.close() @unittest.skipIf(IS_IMAP, "TODO: IMAP test") @unittest.skipIf(IS_GAE, 'TODO: Datastore AGGREGATE Not Supported') class TestRNameFields(unittest.TestCase): # tests for highly experimental rname attribute def testSelect(self): db = DAL(DEFAULT_URI, check_reserved=['all']) rname = db._adapter.__class__.QUOTE_TEMPLATE % 'a very complicated fieldname' rname2 = db._adapter.__class__.QUOTE_TEMPLATE % 'rating from 1 to 10' db.define_table( 'easy_name', Field('a_field', rname=rname), Field('rating', 'integer', rname=rname2, default=2) ) rtn = db.easy_name.insert(a_field='a') self.assertEqual(isinstance(rtn.id, long), True) rtn = db(db.easy_name.a_field == 'a').select() self.assertEqual(len(rtn), 1) self.assertEqual(isinstance(rtn[0].id, long), True) self.assertEqual(rtn[0].a_field, 'a') db.easy_name.insert(a_field='b') rtn = db(db.easy_name.id > 0).delete() self.assertEqual(rtn, 2) rtn = db(db.easy_name.id > 0).count() self.assertEqual(rtn, 0) db.easy_name.insert(a_field='a') db.easy_name.insert(a_field='b') rtn = db(db.easy_name.id > 0).count() self.assertEqual(rtn, 2) rtn = db(db.easy_name.a_field == 'a').update(a_field='c') rtn = db(db.easy_name.a_field == 'c').count() self.assertEqual(rtn, 1) rtn = db(db.easy_name.a_field != 'c').count() self.assertEqual(rtn, 1) avg = db.easy_name.rating.avg() rtn = db(db.easy_name.id > 0).select(avg) self.assertEqual(rtn[0][avg], 2) rname = db._adapter.__class__.QUOTE_TEMPLATE % 'this is the person name' db.define_table( 'person', Field('name', default="Michael", rname=rname), Field('uuid') ) michael = db.person.insert() #default insert john = db.person.insert(name='John') luke = db.person.insert(name='Luke') rtn = db(db.person.id > 0).select() self.assertEqual(len(rtn), 3) self.assertEqual(rtn[0].id, michael) self.assertEqual(rtn[0].name, 'Michael') self.assertEqual(rtn[1].id, john) self.assertEqual(rtn[1].name, 'John') #fetch owners, eventually with pet #main point is retrieving Luke with no pets rtn = db(db.person.id > 0).select() self.assertEqual(rtn[0].id, michael) self.assertEqual(rtn[0].name, 'Michael') self.assertEqual(rtn[2].name, 'Luke') self.assertEqual(rtn[2].id, luke) #as dict rtn = db(db.person.id > 0).select().as_dict() self.assertEqual(rtn[michael]['name'], 'Michael') #as list rtn = db(db.person.id > 0).select().as_list() self.assertEqual(rtn[0]['name'], 'Michael') #isempty rtn = db(db.person.id > 0).isempty() self.assertEqual(rtn, False) #clean up drop(db.person) drop(db.easy_name) db.close() @unittest.skipIf(IS_GAE, 'TODO: Datastore does not accept dict objects as json field input.') def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) rname = db._adapter.QUOTE_TEMPLATE % 'a very complicated fieldname' for ft in ['string', 'text', 'password', 'upload', 'blob']: db.define_table('tt', Field('aa', ft, default='', rname=rname)) self.assertEqual(isinstance(db.tt.insert(aa='x'), long), True) self.assertEqual(db().select(db.tt.aa)[0].aa, 'x') drop(db.tt) db.define_table('tt', Field('aa', 'integer', default=1, rname=rname)) self.assertEqual(isinstance(db.tt.insert(aa=3), long), True) self.assertEqual(db().select(db.tt.aa)[0].aa, 3) drop(db.tt) db.define_table('tt', Field('aa', 'double', default=1, rname=rname)) self.assertEqual(isinstance(db.tt.insert(aa=3.1), long), True) self.assertEqual(db().select(db.tt.aa)[0].aa, 3.1) drop(db.tt) db.define_table('tt', Field('aa', 'boolean', default=True, rname=rname)) self.assertEqual(isinstance(db.tt.insert(aa=True), long), True) self.assertEqual(db().select(db.tt.aa)[0].aa, True) drop(db.tt) db.define_table('tt', Field('aa', 'json', default={}, rname=rname)) self.assertEqual(isinstance(db.tt.insert(aa={}), long), True) self.assertEqual(db().select(db.tt.aa)[0].aa, {}) drop(db.tt) db.define_table('tt', Field('aa', 'date', default=datetime.date.today(), rname=rname)) t0 = datetime.date.today() self.assertEqual(isinstance(db.tt.insert(aa=t0), long), True) self.assertEqual(db().select(db.tt.aa)[0].aa, t0) drop(db.tt) db.define_table('tt', Field('aa', 'datetime', default=datetime.datetime.today(), rname=rname)) t0 = datetime.datetime( 1971, 12, 21, 10, 30, 55, 0, ) id = db.tt.insert(aa=t0) self.assertEqual(db().select(db.tt.aa)[0].aa, t0) ## Row APIs row = db().select(db.tt.aa)[0] self.assertEqual(db.tt[id].aa,t0) self.assertEqual(db.tt['aa'],db.tt.aa) self.assertEqual(db.tt(id).aa,t0) self.assertTrue(db.tt(id,aa=None)==None) self.assertFalse(db.tt(id,aa=t0)==None) self.assertEqual(row.aa,t0) self.assertEqual(row['aa'],t0) self.assertEqual(row['tt.aa'],t0) self.assertEqual(row('tt.aa'),t0) ## Lazy and Virtual fields db.tt.b = Field.Virtual(lambda row: row.tt.aa) db.tt.c = Field.Lazy(lambda row: row.tt.aa) row = db().select(db.tt.aa)[0] self.assertEqual(row.b,t0) self.assertEqual(row.c(),t0) drop(db.tt) db.define_table('tt', Field('aa', 'time', default='11:30', rname=rname)) t0 = datetime.time(10, 30, 55) self.assertEqual(isinstance(db.tt.insert(aa=t0), long), True) self.assertEqual(db().select(db.tt.aa)[0].aa, t0) drop(db.tt) db.close() def testInsert(self): db = DAL(DEFAULT_URI, check_reserved=['all']) rname = db._adapter.QUOTE_TEMPLATE % 'a very complicated fieldname' db.define_table('tt', Field('aa', rname=rname)) self.assertEqual(isinstance(db.tt.insert(aa='1'), long), True) self.assertEqual(isinstance(db.tt.insert(aa='1'), long), True) self.assertEqual(isinstance(db.tt.insert(aa='1'), long), True) self.assertEqual(db(db.tt.aa == '1').count(), 3) self.assertEqual(db(db.tt.aa == '2').isempty(), True) self.assertEqual(db(db.tt.aa == '1').update(aa='2'), 3) self.assertEqual(db(db.tt.aa == '2').count(), 3) self.assertEqual(db(db.tt.aa == '2').isempty(), False) self.assertEqual(db(db.tt.aa == '2').delete(), 3) self.assertEqual(db(db.tt.aa == '2').isempty(), True) drop(db.tt) db.close() @unittest.skip("JOIN queries are not supported") def testJoin(self): db = DAL(DEFAULT_URI, check_reserved=['all']) rname = db._adapter.QUOTE_TEMPLATE % 'this is field aa' rname2 = db._adapter.QUOTE_TEMPLATE % 'this is field b' db.define_table('t1', Field('aa', rname=rname)) db.define_table('t2', Field('aa', rname=rname), Field('b', db.t1, rname=rname2)) i1 = db.t1.insert(aa='1') i2 = db.t1.insert(aa='2') i3 = db.t1.insert(aa='3') db.t2.insert(aa='4', b=i1) db.t2.insert(aa='5', b=i2) db.t2.insert(aa='6', b=i2) self.assertEqual(len(db(db.t1.id == db.t2.b).select(orderby=db.t1.aa | db.t2.aa)), 3) self.assertEqual(db(db.t1.id == db.t2.b).select(orderby=db.t1.aa | db.t2.aa)[2].t1.aa, '2') self.assertEqual(db(db.t1.id == db.t2.b).select(orderby=db.t1.aa | db.t2.aa)[2].t2.aa, '6') self.assertEqual(len(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)), 4) self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[2].t1.aa, '2') self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[2].t2.aa, '6') self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[3].t1.aa, '3') self.assertEqual(db().select(db.t1.ALL, db.t2.ALL, left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa | db.t2.aa)[3].t2.aa, None) self.assertEqual(len(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)), 3) self.assertEqual(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)[0]._extra[db.t2.id.count()], 1) self.assertEqual(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)[1]._extra[db.t2.id.count()], 2) self.assertEqual(db().select(db.t1.aa, db.t2.id.count(), left=db.t2.on(db.t1.id == db.t2.b), orderby=db.t1.aa, groupby=db.t1.aa)[2]._extra[db.t2.id.count()], 0) drop(db.t2) drop(db.t1) db.define_table('person',Field('name', rname=rname)) id = db.person.insert(name="max") self.assertEqual(id.name,'max') db.define_table('dog',Field('name', rname=rname),Field('ownerperson','reference person', rname=rname2)) db.dog.insert(name='skipper',ownerperson=1) row = db(db.person.id==db.dog.ownerperson).select().first() self.assertEqual(row[db.person.name],'max') self.assertEqual(row['person.name'],'max') drop(db.dog) self.assertEqual(len(db.person._referenced_by),0) drop(db.person) db.close() @unittest.skipIf(IS_IMAP, "TODO: IMAP test") class TestQuoting(unittest.TestCase): # tests for case sensitivity def testCase(self): return db = DAL(DEFAULT_URI, check_reserved=['all'], ignore_field_case=False) # test table case t0 = db.define_table('B', Field('f', 'string')) t1 = db.define_table('b', Field('B', t0), Field('words', 'text')) blather = 'blah blah and so' t0[0] = {'f': 'content'} t1[0] = {'B': int(t0[1]['id']), 'words': blather} r = db(db.B.id==db.b.B).select() self.assertEqual(r[0].b.words, blather) drop(t1) drop(t0) # test field case t0 = db.define_table('table is a test', Field('a_a'), Field('a_A')) t0[0] = dict(a_a='a_a', a_A='a_A') self.assertEqual(t0[1].a_a, 'a_a') self.assertEqual(t0[1].a_A, 'a_A') drop(t0) db.close() def testPKFK(self): # test primary keys db = DAL(DEFAULT_URI, check_reserved=['all'], ignore_field_case=False) # test table without surrogate key. Length must is limited to # 100 because of MySQL limitations: it cannot handle more than # 767 bytes in unique keys. t0 = db.define_table('t0', Field('Code', length=100), primarykey=['Code']) t2 = db.define_table('t2', Field('f'), Field('t0_Code', 'reference t0')) t3 = db.define_table('t3', Field('f', length=100), Field('t0_Code', t0.Code), primarykey=['f']) t4 = db.define_table('t4', Field('f', length=100), Field('t0', t0), primarykey=['f']) try: t5 = db.define_table('t5', Field('f', length=100), Field('t0', 'reference no_table_wrong_reference'), primarykey=['f']) except Exception as e: self.assertTrue(isinstance(e, KeyError)) drop(t0, 'cascade') drop(t2) drop(t3) drop(t4) db.close() class TestTableAndFieldCase(unittest.TestCase): """ at the Python level we should not allow db.C and db.c because of .table conflicts on windows but it should be possible to map two different names into distinct tables "c" and "C" at the Python level By default Python models names should be mapped into lower case table names and assume case insensitivity. """ def testme(self): return class TestQuotesByDefault(unittest.TestCase): """ all default tables names should be quoted unless an explicit mapping has been given for a table. """ def testme(self): return @unittest.skipIf(IS_IMAP, "TODO: IMAP test") class TestRecordVersioning(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) tt = db.define_table('tt', Field('name'), Field('is_active', 'boolean', default=True)) db.tt._enable_record_versioning(archive_name='tt_archive') self.assertTrue('tt_archive' in db) i_id = db.tt.insert(name='web2py1') db.tt.insert(name='web2py2') db(db.tt.name == 'web2py2').delete() self.assertEqual(len(db(db.tt).select()), 1) self.assertEqual(db(db.tt).count(), 1) db(db.tt.id == i_id).update(name='web2py3') self.assertEqual(len(db(db.tt).select()), 1) self.assertEqual(db(db.tt).count(), 1) self.assertEqual(len(db(db.tt_archive).select()), 2) self.assertEqual(db(db.tt_archive).count(), 2) drop(db.tt_archive) # it allows tt to be dropped db.tt._before_delete = [] drop(tt) db.close() @unittest.skipIf(IS_IMAP, "TODO: IMAP test") class TestConnection(unittest.TestCase): def testRun(self): # check for adapter reconnect without parameters db1 = DAL(DEFAULT_URI, check_reserved=['all']) db1.define_table('tt', Field('aa', 'integer')) self.assertEqual(isinstance(db1.tt.insert(aa=1), long), True) self.assertEqual(db1(db1.tt.aa == 1).count(), 1) drop(db1.tt) db1._adapter.close() db1._adapter.reconnect() db1.define_table('tt', Field('aa', 'integer')) self.assertEqual(isinstance(db1.tt.insert(aa=1), long), True) self.assertEqual(db1(db1.tt.aa == 1).count(), 1) drop(db1.tt) db1.close() # check connection are reused with pool_size connections = {} for a in range(10): db2 = DAL(DEFAULT_URI, check_reserved=['all'], pool_size=5) c = db2._adapter.connection connections[id(c)] = c db2.close() self.assertEqual(len(connections), 1) c = [connections[x] for x in connections][0] c.commit() c.close() # check correct use of pool_size dbs = [] for a in range(10): db3 = DAL(DEFAULT_URI, check_reserved=['all'], pool_size=5) dbs.append(db3) for db in dbs: db.close() self.assertEqual(len(db3._adapter.POOLS[DEFAULT_URI]), 5) for c in db3._adapter.POOLS[DEFAULT_URI]: c.close() db3._adapter.POOLS[DEFAULT_URI] = [] @unittest.skipIf(IS_IMAP, "TODO: IMAP test") class TestBasicOps(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) tt = db.define_table('tt', Field('name'), Field('is_active', 'boolean', default=True)) i_id = db.tt.insert(name='web2py1') db.tt.insert(name='web2py2') db(db.tt.name == 'web2py2').delete() self.assertEqual(len(db(db.tt).select()), 1) self.assertEqual(db(db.tt).count(), 1) db(db.tt.id == i_id).update(name='web2py3') self.assertEqual(len(db(db.tt).select()), 1) self.assertEqual(db(db.tt).count(), 1) drop(tt) db.close() @unittest.skipIf(IS_IMAP, "TODO: IMAP test") @unittest.skipIf(IS_GAE, 'TODO: Datastore "unsupported operand type"') class TestSQLCustomType(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) from pydal.helpers.classes import SQLCustomType native_double = "double" native_string = "string" if hasattr(db._adapter, 'types'): native_double = db._adapter.types['double'] try: native_string = db._adapter.types['string'] % {'length': 256} except: native_string = db._adapter.types['string'] basic_t = SQLCustomType(type = "double", native = native_double) basic_t_str = SQLCustomType(type = "string", native = native_string) t0=db.define_table('t0', Field("price", basic_t), Field("product", basic_t_str)) r_id = t0.insert(price=None, product=None) row = db(t0.id == r_id).select(t0.ALL).first() self.assertEqual(row['price'], None) self.assertEqual(row['product'], None) r_id = t0.insert(price=1.2, product="car") row=db(t0.id == r_id).select(t0.ALL).first() self.assertEqual(row['price'], 1.2) self.assertEqual(row['product'], 'car') t0.drop() db.close() @unittest.skipIf(IS_GAE or IS_IMAP, "Skip test lazy") class TestLazy(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all'], lazy_tables=True) t0 = db.define_table('t0', Field('name')) self.assertTrue(('t0' in db._LAZY_TABLES.keys())) db.t0.insert(name='1') self.assertFalse(('t0' in db._LAZY_TABLES.keys())) db.t0.drop() db.close() def testLazyGetter(self): db=DAL(DEFAULT_URI, lazy_tables=True) db.define_table('tt', Field('value', 'integer')) db.define_table('ttt', Field('value', 'integer'), Field('tt_id', 'reference tt'), ) # Force table definition db.ttt.value.writable=False idd=db.tt.insert(value=0) db.ttt.insert(tt_id=idd) db.ttt.drop() db.tt.drop() db.close() def testRowNone(self): db=DAL(DEFAULT_URI, lazy_tables=True) tt = db.define_table('tt', Field('value', 'integer')) db.tt.insert(value=None) row = db(db.tt).select(db.tt.ALL).first() self.assertEqual(row.value, None) self.assertEqual(row[db.tt.value], None) self.assertEqual(row['tt.value'], None) self.assertEqual(row.get('tt.value'), None) self.assertEqual(row['value'], None) self.assertEqual(row.get('value'), None) db.tt.drop() db.close() class TestRedefine(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all'], lazy_tables=True, migrate=False) db.define_table('t_a', Field('code')) self.assertTrue('code' in db.t_a) self.assertTrue('code' in db['t_a']) db.define_table('t_a', Field('code_a'), redefine=True) self.assertFalse('code' in db.t_a) self.assertFalse('code' in db['t_a']) self.assertTrue('code_a' in db.t_a) self.assertTrue('code_a' in db['t_a']) db.close() @unittest.skipIf(IS_IMAP, "TODO: IMAP test") class TestUpdateInsert(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) t0 = db.define_table('t0', Field('name')) i_id = db.t0.update_or_insert((db.t0.id == 1), name='web2py') u_id = db.t0.update_or_insert((db.t0.id == i_id), name='web2py2') self.assertTrue(i_id != None) self.assertTrue(u_id == None) self.assertEqual(len(db(db.t0).select()), 1) self.assertEqual(db(db.t0).count(), 1) self.assertEqual(db(db.t0.name == 'web2py').count(), 0) self.assertEqual(db(db.t0.name == 'web2py2').count(), 1) drop(t0) db.close() @unittest.skipIf(IS_IMAP, "TODO: IMAP test") class TestBulkInsert(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) t0 = db.define_table('t0', Field('name')) global ctr ctr = 0 def test_after_insert(i, r): self.assertIsInstance(i, dict) global ctr ctr += 1 return True t0._after_insert.append(test_after_insert) items = [{'name':'web2py_%s' % pos} for pos in range(0, 10, 1)] t0.bulk_insert(items) self.assertTrue(db(t0).count() == len(items)) for pos in range(0, 10, 1): self.assertEqual(len(db(t0.name == 'web2py_%s' % pos).select()), 1) self.assertEqual(db(t0.name == 'web2py_%s' % pos).count(), 1) self.assertTrue(ctr == len(items)) drop(t0) db.close() if __name__ == '__main__': unittest.main() tearDownModule() web2py-2.12.3.orig/gluon/packages/dal/tests/caching.py0000664000000000000000000000255412564727434021244 0ustar rootrootimport time from pydal import DAL, Field from ._compat import unittest from ._adapt import DEFAULT_URI, IS_IMAP, drop class SimpleCache(object): storage = {} def clear(self): self.storage.clear() def __call__(self, key, f, time_expire=300): dt = time_expire now = time.time() item = self.storage.get(key, None) if item and f is None: del self.storage[key] if f is None: return None if item and (dt is None or item[0] > now - dt): return item[1] value = f() self.storage[key] = (now, value) return value @unittest.skipIf(IS_IMAP, "TODO: IMAP test") class TestCache(unittest.TestCase): def testRun(self): cache = SimpleCache() db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('aa')) db.tt.insert(aa='1') r0 = db().select(db.tt.ALL) r1 = db().select(db.tt.ALL, cache=(cache, 1000)) self.assertEqual(len(r0), len(r1)) r2 = db().select(db.tt.ALL, cache=(cache, 1000)) self.assertEqual(len(r0), len(r2)) r3 = db().select(db.tt.ALL, cache=(cache, 1000), cacheable=True) self.assertEqual(len(r0), len(r3)) r4 = db().select(db.tt.ALL, cache=(cache, 1000), cacheable=True) self.assertEqual(len(r0), len(r4)) drop(db.tt) web2py-2.12.3.orig/gluon/packages/dal/tests/base.py0000664000000000000000000000612512564727434020560 0ustar rootroot# -*- coding: utf-8 -*- from ._compat import unittest from ._adapt import DEFAULT_URI, drop, IS_MSSQL from pydal import DAL, Field from pydal._compat import PY2 class TestReferenceNOTNULL(unittest.TestCase): #1:N not null def testRun(self): for ref, bigint in [('reference', False), ('big-reference', True)]: db = DAL(DEFAULT_URI, check_reserved=['all'], bigint_id=bigint) db.define_table('tt', Field('vv')) db.define_table('ttt', Field('vv'), Field('tt_id', '%s tt' % ref, notnull=True)) self.assertRaises(Exception, db.ttt.insert, vv='pydal') # The following is mandatory for backends as PG to close the aborted transaction db.commit() drop(db.ttt) drop(db.tt) db.close() class TestReferenceUNIQUE(unittest.TestCase): # 1:1 relation def testRun(self): for ref, bigint in [('reference', False), ('big-reference', True)]: db = DAL(DEFAULT_URI, check_reserved=['all'], bigint_id=bigint) db.define_table('tt', Field('vv')) db.define_table('ttt', Field('vv'), Field('tt_id', '%s tt' % ref, unique=True)) id_i = db.tt.insert(vv='pydal') # Null tt_id db.ttt.insert(vv='pydal') # first insert is OK db.ttt.insert(tt_id=id_i) self.assertRaises(Exception, db.ttt.insert, tt_id=id_i) # The following is mandatory for backends as PG to close the aborted transaction db.commit() drop(db.ttt) drop(db.tt) db.close() class TestReferenceUNIQUENotNull(unittest.TestCase): # 1:1 relation not null def testRun(self): for ref, bigint in [('reference', False), ('big-reference', True)]: db = DAL(DEFAULT_URI, check_reserved=['all'], bigint_id=bigint) db.define_table('tt', Field('vv')) db.define_table('ttt', Field('vv'), Field('tt_id', '%s tt' % ref, unique=True, notnull=True)) self.assertRaises(Exception, db.ttt.insert, vv='pydal') db.commit() id_i = db.tt.insert(vv='pydal') # first insert is OK db.ttt.insert(tt_id=id_i) self.assertRaises(Exception, db.ttt.insert, tt_id=id_i) # The following is mandatory for backends as PG to close the aborted transaction db.commit() drop(db.ttt) drop(db.tt) db.close() @unittest.skipIf(IS_MSSQL and not PY2, "Skip unicode on py3 and MSSQL") class TestUnicode(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('tt', Field('vv')) vv = 'ἀγοραζε' id_i = db.tt.insert(vv=vv) row = db(db.tt.id == id_i).select().first() self.assertEqual(row.vv, vv) db.commit() drop(db.tt) db.close() web2py-2.12.3.orig/gluon/packages/dal/tests/_compat.py0000664000000000000000000000013712564727434021265 0ustar rootrootimport sys if sys.version < "2.7": import unittest2 as unittest else: import unittest web2py-2.12.3.orig/gluon/packages/dal/tests/validation.py0000664000000000000000000000672612564727434022007 0ustar rootrootimport re from ._compat import unittest from ._adapt import DEFAULT_URI, NOSQL, IS_IMAP, drop from pydal._compat import integer_types from pydal import DAL, Field long = integer_types[-1] regex_isint = re.compile('^[+-]?\d+$') def range_error_message(error_message, what_to_enter, minimum, maximum): "build the error message for the number range validators" if error_message is None: error_message = 'Enter ' + what_to_enter if minimum is not None and maximum is not None: error_message += ' between %(min)g and %(max)g' elif minimum is not None: error_message += ' greater than or equal to %(min)g' elif maximum is not None: error_message += ' less than or equal to %(max)g' if type(maximum) in integer_types: maximum -= 1 return error_message % dict(min=minimum, max=maximum) class IS_INT_IN_RANGE(object): def __init__(self, minimum=None, maximum=None, error_message=None): self.minimum = int(minimum) if minimum is not None else None self.maximum = int(maximum) if maximum is not None else None self.error_message = range_error_message( error_message, 'an integer', self.minimum, self.maximum) def __call__(self, value): if regex_isint.match(str(value)): v = int(value) if ((self.minimum is None or v >= self.minimum) and (self.maximum is None or v < self.maximum)): return (v, None) return (value, self.error_message) @unittest.skipIf(IS_IMAP, "TODO: IMAP test") class TestValidateAndInsert(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) db.define_table('val_and_insert', Field('aa'), Field('bb', 'integer', requires=IS_INT_IN_RANGE(1, 5))) rtn = db.val_and_insert.validate_and_insert(aa='test1', bb=2) if NOSQL: self.assertEqual(isinstance(rtn.id, long), True) else: self.assertEqual(rtn.id, 1) #errors should be empty self.assertEqual(len(rtn.errors.keys()), 0) #this insert won't pass rtn = db.val_and_insert.validate_and_insert(bb="a") #the returned id should be None self.assertEqual(rtn.id, None) #an error message should be in rtn.errors.bb self.assertNotEqual(rtn.errors.bb, None) #cleanup table drop(db.val_and_insert) @unittest.skipIf(IS_IMAP, "TODO: IMAP test") class TestValidateUpdateInsert(unittest.TestCase): def testRun(self): db = DAL(DEFAULT_URI, check_reserved=['all']) t1 = db.define_table('t1', Field('int_level', 'integer', requires=IS_INT_IN_RANGE(1, 5))) i_response = t1.validate_and_update_or_insert((t1.int_level == 1), int_level=1) u_response = t1.validate_and_update_or_insert((t1.int_level == 1), int_level=2) e_response = t1.validate_and_update_or_insert((t1.int_level == 1), int_level=6) self.assertTrue(i_response.id != None) self.assertTrue(u_response.id != None) self.assertTrue(e_response.id == None and len(e_response.errors.keys()) != 0) self.assertEqual(len(db(t1).select()), 1) self.assertEqual(db(t1).count(), 1) self.assertEqual(db(t1.int_level == 1).count(), 0) self.assertEqual(db(t1.int_level == 6).count(), 0) self.assertEqual(db(t1.int_level == 2).count(), 1) drop(db.t1) return web2py-2.12.3.orig/gluon/serializers.py0000664000000000000000000001600412564727264016520 0ustar rootroot""" This file is part of the web2py Web Framework Copyrighted by Massimo Di Pierro License: LGPLv3 (http://www.gnu.org/licenses/lgpl.html) """ import datetime import decimal from gluon.storage import Storage from gluon.html import TAG, XmlComponent, xmlescape from gluon.languages import lazyT import gluon.contrib.rss2 as rss2 try: # try external module import simplejson as json_parser except ImportError: try: # try stdlib (Python >= 2.6) import json as json_parser except: # fallback to pure-Python module import gluon.contrib.simplejson as json_parser # simplejson >= 2.1.3 needs use_decimal = False # to stringify decimals decimal_false_option = json_parser.__version__.split('.') >= ['2', '1', '3'] have_yaml = True try: import yaml as yamlib except ImportError: have_yaml = False def cast_keys(o, cast=str, encoding="utf-8"): """ Builds a new object with type keys. Use this function if you are in Python < 2.6.5 This avoids syntax errors when unpacking dictionary arguments. Args: o: is the object input cast: (defaults to str) is an object type or function which supports conversion such as: converted = cast(o) encoding: (defaults to utf-8) is the encoding for unicode keys. This is not used for custom cast functions """ if isinstance(o, (dict, Storage)): if isinstance(o, dict): newobj = dict() else: newobj = Storage() for k, v in o.items(): if (cast == str) and isinstance(k, unicode): key = k.encode(encoding) else: key = cast(k) newobj[key] = cast_keys(v, cast=cast, encoding=encoding) elif isinstance(o, (tuple, set, list)): newobj = [] for item in o: newobj.append(cast_keys(item, cast=cast, encoding=encoding)) if isinstance(o, tuple): newobj = tuple(newobj) elif isinstance(o, set): newobj = set(newobj) else: # no string cast (unknown object) newobj = o return newobj def loads_json(o, unicode_keys=True, **kwargs): # deserialize a json string result = json_parser.loads(o, **kwargs) if not unicode_keys: # filter non-str keys in dictionary objects result = cast_keys(result, encoding=kwargs.get("encoding", "utf-8")) return result def custom_json(o): if hasattr(o, 'custom_json') and callable(o.custom_json): return o.custom_json() if isinstance(o, (datetime.date, datetime.datetime, datetime.time)): return o.isoformat()[:19].replace('T', ' ') elif isinstance(o, (int, long)): return int(o) elif isinstance(o, decimal.Decimal): return str(o) elif isinstance(o, lazyT): return str(o) elif isinstance(o, XmlComponent): return str(o) elif isinstance(o, set): return list(o) elif hasattr(o, 'as_list') and callable(o.as_list): return o.as_list() elif hasattr(o, 'as_dict') and callable(o.as_dict): return o.as_dict() else: raise TypeError(repr(o) + " is not JSON serializable") def xml_rec(value, key, quote=True): if hasattr(value, 'custom_xml') and callable(value.custom_xml): return value.custom_xml() elif isinstance(value, (dict, Storage)): return TAG[key](*[TAG[k](xml_rec(v, '', quote)) for k, v in value.items()]) elif isinstance(value, list): return TAG[key](*[TAG.item(xml_rec(item, '', quote)) for item in value]) elif hasattr(value, 'as_list') and callable(value.as_list): return str(xml_rec(value.as_list(), '', quote)) elif hasattr(value, 'as_dict') and callable(value.as_dict): return str(xml_rec(value.as_dict(), '', quote)) else: return xmlescape(value, quote) def xml(value, encoding='UTF-8', key='document', quote=True): return ('' % encoding) + str(xml_rec(value, key, quote)) def json(value, default=custom_json): if decimal_false_option: value = json_parser.dumps(value, default=default, use_decimal=False) else: value = json_parser.dumps(value, default=default) # replace JavaScript incompatible spacing # http://timelessrepo.com/json-isnt-a-javascript-subset return value.replace(ur'\u2028', '\\u2028').replace(ur'\2029', '\\u2029') def csv(value): return '' def ics(events, title=None, link=None, timeshift=0, calname=True, **ignored): title = title or '(unknown)' if link and not callable(link): link = lambda item, prefix=link: prefix.replace( '[id]', str(item['id'])) s = 'BEGIN:VCALENDAR' s += '\nVERSION:2.0' if not calname is False: s += '\nX-WR-CALNAME:%s' % (calname or title) s += '\nSUMMARY:%s' % title s += '\nPRODID:Generated by web2py' s += '\nCALSCALE:GREGORIAN' s += '\nMETHOD:PUBLISH' for item in events: s += '\nBEGIN:VEVENT' s += '\nUID:%s' % item['id'] if link: s += '\nURL:%s' % link(item) shift = datetime.timedelta(seconds=3600 * timeshift) start = item['start_datetime'] + shift stop = item['stop_datetime'] + shift s += '\nDTSTART:%s' % start.strftime('%Y%m%dT%H%M%S') s += '\nDTEND:%s' % stop.strftime('%Y%m%dT%H%M%S') s += '\nSUMMARY:%s' % item['title'] s += '\nEND:VEVENT' s += '\nEND:VCALENDAR' return s def safe_encode(text): if not isinstance(text, (str, unicode)): text = str(text) try: text = text.encode('utf8','replace') except ValueError: new_text = '' for c in text: try: new_text += c.encode('utf8') except: new_text += '?' text = new_text return text def rss(feed): if not 'entries' in feed and 'items' in feed: feed['entries'] = feed['items'] def safestr(obj, key, default=''): return safe_encode(obj.get(key,'')) now = datetime.datetime.now() rss = rss2.RSS2(title=safestr(feed,'title'), link=safestr(feed,'link'), description=safestr(feed,'description'), lastBuildDate=feed.get('created_on', now), items=[rss2.RSSItem( title=safestr(entry,'title','(notitle)'), link=safestr(entry,'link'), description=safestr(entry,'description'), pubDate=entry.get('created_on', now) ) for entry in feed.get('entries', [])]) return rss.to_xml(encoding='utf8') def yaml(data): if have_yaml: return yamlib.dump(data) else: raise ImportError("No YAML serializer available") def loads_yaml(data): if have_yaml: return yamlib.load(data) else: raise ImportError("No YAML serializer available") web2py-2.12.3.orig/gluon/template.py0000664000000000000000000007557212564727264016016 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- """ | This file is part of the web2py Web Framework | License: LGPLv3 (http://www.gnu.org/licenses/lgpl.html) | Author: Thadeus Burgess | Contributors: | - Massimo Di Pierro for creating the original gluon/template.py | - Jonathan Lundell for extensively testing the regex on Jython. | - Limodou (creater of uliweb) who inspired the block-element support for web2py. Templating syntax ------------------ """ import os import cgi import logging from re import compile, sub, escape, DOTALL try: import cStringIO as StringIO except: from io import StringIO try: # have web2py from gluon.restricted import RestrictedError from gluon.globals import current except ImportError: # do not have web2py current = None def RestrictedError(a, b, c): logging.error(str(a) + ':' + str(b) + ':' + str(c)) return RuntimeError class Node(object): """ Basic Container Object """ def __init__(self, value=None, pre_extend=False): self.value = value self.pre_extend = pre_extend def __str__(self): return str(self.value) class SuperNode(Node): def __init__(self, name='', pre_extend=False): self.name = name self.value = None self.pre_extend = pre_extend def __str__(self): if self.value: return str(self.value) else: # raise SyntaxError("Undefined parent block ``%s``. \n" % self.name + "You must define a block before referencing it.\nMake sure you have not left out an ``{{end}}`` tag." ) return '' def __repr__(self): return "%s->%s" % (self.name, self.value) def output_aux(node, blocks): # If we have a block level # If we can override this block. # Override block from vars. # Else we take the default # Else its just a string return (blocks[node.name].output(blocks) if node.name in blocks else node.output(blocks)) \ if isinstance(node, BlockNode) \ else str(node) class BlockNode(Node): """ Block Container. This Node can contain other Nodes and will render in a hierarchical order of when nodes were added. ie:: {{ block test }} This is default block test {{ end }} """ def __init__(self, name='', pre_extend=False, delimiters=('{{', '}}')): """ name - Name of this Node. """ self.nodes = [] self.name = name self.pre_extend = pre_extend self.left, self.right = delimiters def __repr__(self): lines = ['%sblock %s%s' % (self.left, self.name, self.right)] lines += [str(node) for node in self.nodes] lines.append('%send%s' % (self.left, self.right)) return ''.join(lines) def __str__(self): """ Get this BlockNodes content, not including child Nodes """ return ''.join(str(node) for node in self.nodes if not isinstance(node, BlockNode)) def append(self, node): """ Adds an element to the nodes. Args: node: Node object or string to append. """ if isinstance(node, str) or isinstance(node, Node): self.nodes.append(node) else: raise TypeError("Invalid type; must be instance of ``str`` or ``BlockNode``. %s" % node) def extend(self, other): """ Extends the list of nodes with another BlockNode class. Args: other: BlockNode or Content object to extend from. """ if isinstance(other, BlockNode): self.nodes.extend(other.nodes) else: raise TypeError( "Invalid type; must be instance of ``BlockNode``. %s" % other) def output(self, blocks): """ Merges all nodes into a single string. Args: blocks: Dictionary of blocks that are extending from this template. """ return ''.join(output_aux(node, blocks) for node in self.nodes) class Content(BlockNode): """ Parent Container -- Used as the root level BlockNode. Contains functions that operate as such. Args: name: Unique name for this BlockNode """ def __init__(self, name="ContentBlock", pre_extend=False): self.name = name self.nodes = [] self.blocks = {} self.pre_extend = pre_extend def __str__(self): return ''.join(output_aux(node, self.blocks) for node in self.nodes) def _insert(self, other, index=0): """ Inserts object at index. """ if isinstance(other, (str, Node)): self.nodes.insert(index, other) else: raise TypeError( "Invalid type, must be instance of ``str`` or ``Node``.") def insert(self, other, index=0): """ Inserts object at index. You may pass a list of objects and have them inserted. """ if isinstance(other, (list, tuple)): # Must reverse so the order stays the same. other.reverse() for item in other: self._insert(item, index) else: self._insert(other, index) def append(self, node): """ Adds a node to list. If it is a BlockNode then we assign a block for it. """ if isinstance(node, (str, Node)): self.nodes.append(node) if isinstance(node, BlockNode): self.blocks[node.name] = node else: raise TypeError("Invalid type, must be instance of ``str`` or ``BlockNode``. %s" % node) def extend(self, other): """ Extends the objects list of nodes with another objects nodes """ if isinstance(other, BlockNode): self.nodes.extend(other.nodes) self.blocks.update(other.blocks) else: raise TypeError( "Invalid type; must be instance of ``BlockNode``. %s" % other) def clear_content(self): self.nodes = [] class TemplateParser(object): """Parse all blocks Args: text: text to parse context: context to parse in path: folder path to templates writer: string of writer class to use lexers: dict of custom lexers to use. delimiters: for example `('{{','}}')` _super_nodes: a list of nodes to check for inclusion this should only be set by "self.extend" It contains a list of SuperNodes from a child template that need to be handled. """ default_delimiters = ('{{', '}}') r_tag = compile(r'(\{\{.*?\}\})', DOTALL) r_multiline = compile(r'(""".*?""")|(\'\'\'.*?\'\'\')', DOTALL) # These are used for re-indentation. # Indent + 1 re_block = compile('^(elif |else:|except:|except |finally:).*$', DOTALL) # Indent - 1 re_unblock = compile('^(return|continue|break|raise)( .*)?$', DOTALL) # Indent - 1 re_pass = compile('^pass( .*)?$', DOTALL) def __init__(self, text, name="ParserContainer", context=dict(), path='views/', writer='response.write', lexers={}, delimiters=('{{', '}}'), _super_nodes = [], ): # Keep a root level name. self.name = name # Raw text to start parsing. self.text = text # Writer to use (refer to the default for an example). # This will end up as # "%s(%s, escape=False)" % (self.writer, value) self.writer = writer # Dictionary of custom name lexers to use. if isinstance(lexers, dict): self.lexers = lexers else: self.lexers = {} # Path of templates self.path = path # Context for templates. self.context = context # allow optional alternative delimiters if delimiters != self.default_delimiters: escaped_delimiters = (escape(delimiters[0]), escape(delimiters[1])) self.r_tag = compile(r'(%s.*?%s)' % escaped_delimiters, DOTALL) elif hasattr(context.get('response', None), 'delimiters'): if context['response'].delimiters != self.default_delimiters: delimiters = context['response'].delimiters escaped_delimiters = ( escape(delimiters[0]), escape(delimiters[1])) self.r_tag = compile(r'(%s.*?%s)' % escaped_delimiters, DOTALL) self.delimiters = delimiters # Create a root level Content that everything will go into. self.content = Content(name=name) # Stack will hold our current stack of nodes. # As we descend into a node, it will be added to the stack # And when we leave, it will be removed from the stack. # self.content should stay on the stack at all times. self.stack = [self.content] # This variable will hold a reference to every super block # that we come across in this template. self.super_nodes = [] # This variable will hold a reference to the child # super nodes that need handling. self.child_super_nodes = _super_nodes # This variable will hold a reference to every block # that we come across in this template self.blocks = {} # Begin parsing. self.parse(text) def to_string(self): """ Returns the parsed template with correct indentation. Used to make it easier to port to python3. """ return self.reindent(str(self.content)) def __str__(self): "Makes sure str works exactly the same as python 3" return self.to_string() def __unicode__(self): "Makes sure str works exactly the same as python 3" return self.to_string() def reindent(self, text): """ Reindents a string of unindented python code. """ # Get each of our lines into an array. lines = text.split('\n') # Our new lines new_lines = [] # Keeps track of how many indents we have. # Used for when we need to drop a level of indentation # only to reindent on the next line. credit = 0 # Current indentation k = 0 ################# # THINGS TO KNOW ################# # k += 1 means indent # k -= 1 means unindent # credit = 1 means unindent on the next line. for raw_line in lines: line = raw_line.strip() # ignore empty lines if not line: continue # If we have a line that contains python code that # should be unindented for this line of code. # and then reindented for the next line. if TemplateParser.re_block.match(line): k = k + credit - 1 # We obviously can't have a negative indentation k = max(k, 0) # Add the indentation! new_lines.append(' ' * (4 * k) + line) # Bank account back to 0 again :( credit = 0 # If we are a pass block, we obviously de-dent. if TemplateParser.re_pass.match(line): k -= 1 # If we are any of the following, de-dent. # However, we should stay on the same level # But the line right after us will be de-dented. # So we add one credit to keep us at the level # while moving back one indentation level. if TemplateParser.re_unblock.match(line): credit = 1 k -= 1 # If we are an if statement, a try, or a semi-colon we # probably need to indent the next line. if line.endswith(':') and not line.startswith('#'): k += 1 # This must come before so that we can raise an error with the # right content. new_text = '\n'.join(new_lines) if k > 0: self._raise_error('missing "pass" in view', new_text) elif k < 0: self._raise_error('too many "pass" in view', new_text) return new_text def _raise_error(self, message='', text=None): """ Raises an error using itself as the filename and textual content. """ raise RestrictedError(self.name, text or self.text, message) def _get_file_text(self, filename): """ Attempts to open ``filename`` and retrieve its text. This will use self.path to search for the file. """ # If they didn't specify a filename, how can we find one! if not filename.strip(): self._raise_error('Invalid template filename') # Allow Views to include other views dynamically context = self.context if current and not "response" in context: context["response"] = getattr(current, 'response', None) # Get the filename; filename looks like ``"template.html"``. # We need to eval to remove the quotes and get the string type. filename = eval(filename, context) # Allow empty filename for conditional extend and include directives. if not filename: return '' # Get the path of the file on the system. filepath = self.path and os.path.join(self.path, filename) or filename # try to read the text. try: fileobj = open(filepath, 'rb') text = fileobj.read() fileobj.close() except IOError: self._raise_error('Unable to open included view file: ' + filepath) return text def include(self, content, filename): """ Includes ``filename`` here. """ text = self._get_file_text(filename) t = TemplateParser(text, name=filename, context=self.context, path=self.path, writer=self.writer, delimiters=self.delimiters) content.append(t.content) def extend(self, filename): """ Extends `filename`. Anything not declared in a block defined by the parent will be placed in the parent templates `{{include}}` block. """ # If no filename, create a dummy layout with only an {{include}}. text = self._get_file_text(filename) or '%sinclude%s' % tuple(self.delimiters) # Create out nodes list to send to the parent super_nodes = [] # We want to include any non-handled nodes. super_nodes.extend(self.child_super_nodes) # And our nodes as well. super_nodes.extend(self.super_nodes) t = TemplateParser(text, name=filename, context=self.context, path=self.path, writer=self.writer, delimiters=self.delimiters, _super_nodes=super_nodes) # Make a temporary buffer that is unique for parent # template. buf = BlockNode( name='__include__' + filename, delimiters=self.delimiters) pre = [] # Iterate through each of our nodes for node in self.content.nodes: # If a node is a block if isinstance(node, BlockNode): # That happens to be in the parent template if node.name in t.content.blocks: # Do not include it continue if isinstance(node, Node): # Or if the node was before the extension # we should not include it if node.pre_extend: pre.append(node) continue # Otherwise, it should go int the # Parent templates {{include}} section. buf.append(node) else: buf.append(node) # Clear our current nodes. We will be replacing this with # the parent nodes. self.content.nodes = [] t_content = t.content # Set our include, unique by filename t_content.blocks['__include__' + filename] = buf # Make sure our pre_extended nodes go first t_content.insert(pre) # Then we extend our blocks t_content.extend(self.content) # Work off the parent node. self.content = t_content def parse(self, text): # Basically, r_tag.split will split the text into # an array containing, 'non-tag', 'tag', 'non-tag', 'tag' # so if we alternate this variable, we know # what to look for. This is alternate to # line.startswith("{{") in_tag = False extend = None pre_extend = True # Use a list to store everything in # This is because later the code will "look ahead" # for missing strings or brackets. ij = self.r_tag.split(text) # j = current index # i = current item stack = self.stack for j in range(len(ij)): i = ij[j] if i: if not stack: self._raise_error('The "end" tag is unmatched, please check if you have a starting "block" tag') # Our current element in the stack. top = stack[-1] if in_tag: line = i # Get rid of delimiters line = line[len(self.delimiters[0]): \ -len(self.delimiters[1])].strip() # This is bad juju, but let's do it anyway if not line: continue # We do not want to replace the newlines in code, # only in block comments. def remove_newline(re_val): # Take the entire match and replace newlines with # escaped newlines. return re_val.group(0).replace('\n', '\\n') # Perform block comment escaping. # This performs escaping ON anything # in between """ and """ line = sub(TemplateParser.r_multiline, remove_newline, line) if line.startswith('='): # IE: {{=response.title}} name, value = '=', line[1:].strip() else: v = line.split(' ', 1) if len(v) == 1: # Example # {{ include }} # {{ end }} name = v[0] value = '' else: # Example # {{ block pie }} # {{ include "layout.html" }} # {{ for i in range(10): }} name = v[0] value = v[1] # This will replace newlines in block comments # with the newline character. This is so that they # retain their formatting, but squish down to one # line in the rendered template. # First check if we have any custom lexers if name in self.lexers: # Pass the information to the lexer # and allow it to inject in the environment # You can define custom names such as # '{{<.< tokens = line.split('\n') # We need to look for any instances of # for i in range(10): # = i # pass # So we can properly put a response.write() in place. continuation = False len_parsed = 0 for k, token in enumerate(tokens): token = tokens[k] = token.strip() len_parsed += len(token) if token.startswith('='): if token.endswith('\\'): continuation = True tokens[k] = "\n%s(%s" % ( self.writer, token[1:].strip()) else: tokens[k] = "\n%s(%s)" % ( self.writer, token[1:].strip()) elif continuation: tokens[k] += ')' continuation = False buf = "\n%s" % '\n'.join(tokens) top.append(Node(buf, pre_extend=pre_extend)) else: # It is HTML so just include it. buf = "\n%s(%r, escape=False)" % (self.writer, i) top.append(Node(buf, pre_extend=pre_extend)) # Remember: tag, not tag, tag, not tag in_tag = not in_tag # Make a list of items to remove from child to_rm = [] # Go through each of the children nodes for node in self.child_super_nodes: # If we declared a block that this node wants to include if node.name in self.blocks: # Go ahead and include it! node.value = self.blocks[node.name] # Since we processed this child, we don't need to # pass it along to the parent to_rm.append(node) # Remove some of the processed nodes for node in to_rm: # Since this is a pointer, it works beautifully. # Sometimes I miss C-Style pointers... I want my asterisk... self.child_super_nodes.remove(node) # If we need to extend a template. if extend: self.extend(extend) # We need this for integration with gluon def parse_template(filename, path='views/', context=dict(), lexers={}, delimiters=('{{', '}}') ): """ Args: filename: can be a view filename in the views folder or an input stream path: is the path of a views folder context: is a dictionary of symbols used to render the template lexers: dict of custom lexers to use delimiters: opening and closing tags """ # First, if we have a str try to open the file if isinstance(filename, str): try: fp = open(os.path.join(path, filename), 'rb') text = fp.read() fp.close() except IOError: raise RestrictedError(filename, '', 'Unable to find the file') else: text = filename.read() # Use the file contents to get a parsed template and return it. return str(TemplateParser(text, context=context, path=path, lexers=lexers, delimiters=delimiters)) def get_parsed(text): """ Returns the indented python code of text. Useful for unit testing. """ return str(TemplateParser(text)) class DummyResponse(): def __init__(self): self.body = StringIO.StringIO() def write(self, data, escape=True): if not escape: self.body.write(str(data)) elif hasattr(data, 'xml') and callable(data.xml): self.body.write(data.xml()) else: # make it a string if not isinstance(data, (str, unicode)): data = str(data) elif isinstance(data, unicode): data = data.encode('utf8', 'xmlcharrefreplace') data = cgi.escape(data, True).replace("'", "'") self.body.write(data) class NOESCAPE(): """ A little helper to avoid escaping. """ def __init__(self, text): self.text = text def xml(self): return self.text # And this is a generic render function. # Here for integration with gluon. def render(content="hello world", stream=None, filename=None, path=None, context={}, lexers={}, delimiters=('{{', '}}'), writer='response.write' ): """ Generic render function Args: content: default content stream: file-like obj to read template from filename: where to find template path: base path for templates context: env lexers: custom lexers to use delimiters: opening and closing tags writer: where to inject the resulting stream Example:: >>> render() 'hello world' >>> render(content='abc') 'abc' >>> render(content="abc'") "abc'" >>> render(content=''''a"'bc''') 'a"'bc' >>> render(content='a\\nbc') 'a\\nbc' >>> render(content='a"bcd"e') 'a"bcd"e' >>> render(content="'''a\\nc'''") "'''a\\nc'''" >>> render(content="'''a\\'c'''") "'''a\'c'''" >>> render(content='{{for i in range(a):}}{{=i}}
{{pass}}', context=dict(a=5)) '0
1
2
3
4
' >>> render(content='{%for i in range(a):%}{%=i%}
{%pass%}', context=dict(a=5),delimiters=('{%','%}')) '0
1
2
3
4
' >>> render(content="{{='''hello\\nworld'''}}") 'hello\\nworld' >>> render(content='{{for i in range(3):\\n=i\\npass}}') '012' """ # here to avoid circular Imports try: from globals import Response except ImportError: # Working standalone. Build a mock Response object. Response = DummyResponse # Add it to the context so we can use it. if not 'NOESCAPE' in context: context['NOESCAPE'] = NOESCAPE # save current response class if context and 'response' in context: old_response_body = context['response'].body context['response'].body = StringIO.StringIO() else: old_response_body = None context['response'] = Response() # If we don't have anything to render, why bother? if not content and not stream and not filename: raise SyntaxError("Must specify a stream or filename or content") # Here for legacy purposes, probably can be reduced to # something more simple. close_stream = False if not stream: if filename: stream = open(filename, 'rb') close_stream = True elif content: stream = StringIO.StringIO(content) # Execute the template. code = str(TemplateParser(stream.read( ), context=context, path=path, lexers=lexers, delimiters=delimiters, writer=writer)) try: exec(code) in context except Exception: # for i,line in enumerate(code.split('\n')): print i,line raise if close_stream: stream.close() # Returned the rendered content. text = context['response'].body.getvalue() if old_response_body is not None: context['response'].body = old_response_body return text if __name__ == '__main__': import doctest doctest.testmod() web2py-2.12.3.orig/gluon/decoder.py0000664000000000000000000000567412564727264015604 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- """ Caller will hand this library a buffer and ask it to either convert it or auto-detect the type. Based on http://code.activestate.com/recipes/52257/ Licensed under the PSF License """ import codecs # None represents a potentially variable byte. "##" in the XML spec... autodetect_dict = { # bytepattern : ("name", (0x00, 0x00, 0xFE, 0xFF): ("ucs4_be"), (0xFF, 0xFE, 0x00, 0x00): ("ucs4_le"), (0xFE, 0xFF, None, None): ("utf_16_be"), (0xFF, 0xFE, None, None): ("utf_16_le"), (0x00, 0x3C, 0x00, 0x3F): ("utf_16_be"), (0x3C, 0x00, 0x3F, 0x00): ("utf_16_le"), (0x3C, 0x3F, 0x78, 0x6D): ("utf_8"), (0x4C, 0x6F, 0xA7, 0x94): ("EBCDIC") } def autoDetectXMLEncoding(buffer): """ buffer -> encoding_name The buffer should be at least 4 bytes long. Returns None if encoding cannot be detected. Note that encoding_name might not have an installed decoder (e.g. EBCDIC) """ # a more efficient implementation would not decode the whole # buffer at once but otherwise we'd have to decode a character at # a time looking for the quote character...that's a pain encoding = "utf_8" # according to the XML spec, this is the default # this code successively tries to refine the default # whenever it fails to refine, it falls back to # the last place encoding was set. if len(buffer) >= 4: bytes = (byte1, byte2, byte3, byte4) = tuple(map(ord, buffer[0:4])) enc_info = autodetect_dict.get(bytes, None) if not enc_info: # try autodetection again removing potentially # variable bytes bytes = (byte1, byte2, None, None) enc_info = autodetect_dict.get(bytes) else: enc_info = None if enc_info: encoding = enc_info # we've got a guess... these are #the new defaults # try to find a more precise encoding using xml declaration secret_decoder_ring = codecs.lookup(encoding)[1] (decoded, length) = secret_decoder_ring(buffer) first_line = decoded.split("\n")[0] if first_line and first_line.startswith(u" -1: quote_char, rest = (first_line[quote_pos], first_line[quote_pos + 1:]) encoding = rest[:rest.find(quote_char)] return encoding def decoder(buffer): encoding = autoDetectXMLEncoding(buffer) return buffer.decode(encoding).encode('utf8') web2py-2.12.3.orig/gluon/contrib/0000775000000000000000000000000012564727264015251 5ustar rootrootweb2py-2.12.3.orig/gluon/contrib/pbkdf2.py0000664000000000000000000001170712564727262016777 0ustar rootroot# -*- coding: utf-8 -*- """ pbkdf2 ~~~~~~ This module implements pbkdf2 for Python. It also has some basic tests that ensure that it works. The implementation is straightforward and uses stdlib only stuff and can be easily be copy/pasted into your favourite application. Use this as replacement for bcrypt that does not need a c implementation of a modified blowfish crypto algo. Example usage: >>> pbkdf2_hex('what i want to hash', 'the random salt') 'fa7cc8a2b0a932f8e6ea42f9787e9d36e592e0c222ada6a9' How to use this: 1. Use a constant time string compare function to compare the stored hash with the one you're generating:: def safe_str_cmp(a, b): if len(a) != len(b): return False rv = 0 for x, y in izip(a, b): rv |= ord(x) ^ ord(y) return rv == 0 2. Use `os.urandom` to generate a proper salt of at least 8 byte. Use a unique salt per hashed password. 3. Store ``algorithm$salt:costfactor$hash`` in the database so that you can upgrade later easily to a different algorithm if you need one. For instance ``PBKDF2-256$thesalt:10000$deadbeef...``. :copyright: (c) Copyright 2011 by Armin Ronacher. :license: BSD, see LICENSE for more details. """ import hmac try: from hashlib import sha1 except ImportError: # hashlib not available. Use the old sha module. import sha as sha1 from struct import Struct from operator import xor from itertools import izip, starmap from collections import deque _pack_int = Struct('>I').pack try: from Crypto.Util.strxor import strxor except ImportError: def strxor(a, b): return ''.join(chr(xor(ord(x), ord(y))) for x,y in izip(a, b)) def pbkdf2_hex(data, salt, iterations=1000, keylen=24, hashfunc=None): """Like :func:`pbkdf2_bin` but returns a hex encoded string.""" return pbkdf2_bin(data, salt, iterations, keylen, hashfunc).encode('hex') def pbkdf2_bin(data, salt, iterations=1000, keylen=24, hashfunc=None): """Returns a binary digest for the PBKDF2 hash algorithm of `data` with the given `salt`. It iterates `iterations` time and produces a key of `keylen` bytes. By default SHA-1 is used as hash function, a different hashlib `hashfunc` can be provided. """ hashfunc = hashfunc or sha1 mac = hmac.new(data, None, hashfunc) def _pseudorandom(x, mac=mac): h = mac.copy() h.update(x) return h.digest() buf = deque() for block in xrange(1, -(-keylen // mac.digest_size) + 1): rv = u = _pseudorandom(salt + _pack_int(block)) for i in xrange(iterations - 1): u = _pseudorandom(u) rv = strxor(rv, u) buf.extend(rv) return ''.join(buf)[:keylen] def test(): failed = [] def check(data, salt, iterations, keylen, expected): rv = pbkdf2_hex(data, salt, iterations, keylen) if rv != expected: print 'Test failed:' print ' Expected: %s' % expected print ' Got: %s' % rv print ' Parameters:' print ' data=%s' % data print ' salt=%s' % salt print ' iterations=%d' % iterations print failed.append(1) # From RFC 6070 check('password', 'salt', 1, 20, '0c60c80f961f0e71f3a9b524af6012062fe037a6') check('password', 'salt', 2, 20, 'ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957') check('password', 'salt', 4096, 20, '4b007901b765489abead49d926f721d065a429c1') check('passwordPASSWORDpassword', 'saltSALTsaltSALTsaltSALTsaltSALTsalt', 4096, 25, '3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038') check('pass\x00word', 'sa\x00lt', 4096, 16, '56fa6aa75548099dcc37d7f03425e0c3') # This one is from the RFC but it just takes for ages check('password', 'salt', 16777216, 20, 'eefe3d61cd4da4e4e9945b3d6ba2158c2634e984') # From Crypt-PBKDF2 check('password', 'ATHENA.MIT.EDUraeburn', 1, 16, 'cdedb5281bb2f801565a1122b2563515') check('password', 'ATHENA.MIT.EDUraeburn', 1, 32, 'cdedb5281bb2f801565a1122b25635150ad1f7a04bb9f3a333ecc0e2e1f70837') check('password', 'ATHENA.MIT.EDUraeburn', 2, 16, '01dbee7f4a9e243e988b62c73cda935d') check('password', 'ATHENA.MIT.EDUraeburn', 2, 32, '01dbee7f4a9e243e988b62c73cda935da05378b93244ec8f48a99e61ad799d86') check('password', 'ATHENA.MIT.EDUraeburn', 1200, 32, '5c08eb61fdf71e4e4ec3cf6ba1f5512ba7e52ddbc5e5142f708a31e2e62b1e13') check('X' * 64, 'pass phrase equals block size', 1200, 32, '139c30c0966bc32ba55fdbf212530ac9c5ec59f1a452f5cc9ad940fea0598ed1') check('X' * 65, 'pass phrase exceeds block size', 1200, 32, '9ccad6d468770cd51b10e6a68721be611a8b4d282601db3b36be9246915ec82a') raise SystemExit(bool(failed)) if __name__ == '__main__': test() web2py-2.12.3.orig/gluon/contrib/generics.py0000664000000000000000000000474012564727262017425 0ustar rootroot# fix response import os from gluon import current, HTTP from gluon.html import markmin_serializer, TAG, HTML, BODY, UL, XML, H1 from gluon.contrib.fpdf import FPDF, HTMLMixin from gluon.sanitizer import sanitize from gluon.contrib.markmin.markmin2latex import markmin2latex from gluon.contrib.markmin.markmin2pdf import markmin2pdf def wrapper(f): def g(data): try: output = f(data) return XML(ouput) except (TypeError, ValueError), e: raise HTTP(405, '%s serialization error' % e) except ImportError, e: raise HTTP(405, '%s not available' % e) except Exception, e: raise HTTP(405, '%s error' % e) return g def latex_from_html(html): markmin = TAG(html).element('body').flatten(markmin_serializer) return XML(markmin2latex(markmin)) def pdflatex_from_html(html): if os.system('which pdflatex > /dev/null') == 0: markmin = TAG(html).element('body').flatten(markmin_serializer) out, warnings, errors = markmin2pdf(markmin) if errors: current.response.headers['Content-Type'] = 'text/html' raise HTTP(405, HTML(BODY(H1('errors'), UL(*errors), H1('warnings'), UL(*warnings))).xml()) else: return XML(out) def pyfpdf_from_html(html): request = current.request def image_map(path): if path.startswith('/%s/static/' % request.application): return os.path.join(request.folder, path.split('/', 2)[2]) return 'http%s://%s%s' % (request.is_https and 's' or '', request.env.http_host, path) class MyFPDF(FPDF, HTMLMixin): pass pdf = MyFPDF() pdf.add_page() # pyfpdf needs some attributes to render the table correctly: html = sanitize( html, allowed_attributes={ 'a': ['href', 'title'], 'img': ['src', 'alt'], 'blockquote': ['type'], 'td': ['align', 'bgcolor', 'colspan', 'height', 'width'], 'tr': ['bgcolor', 'height', 'width'], 'table': ['border', 'bgcolor', 'height', 'width'], }, escape=False) pdf.write_html(html, image_map=image_map) return XML(pdf.output(dest='S')) def pdf_from_html(html): # try use latex and pdflatex if os.system('which pdflatex > /dev/null') == 0: return pdflatex_from_html(html) else: return pyfpdf_from_html(html) web2py-2.12.3.orig/gluon/contrib/redis_session.py0000664000000000000000000002261312564727262020476 0ustar rootroot""" Developed by niphlod@gmail.com """ import redis from gluon import current from gluon.storage import Storage import time import logging import thread logger = logging.getLogger("web2py.session.redis") locker = thread.allocate_lock() def RedisSession(*args, **vars): """ Usage example: put in models from gluon.contrib.redis_session import RedisSession sessiondb = RedisSession('localhost:6379',db=0, session_expiry=False, password=None) session.connect(request, response, db = sessiondb) Simple slip-in storage for session """ locker.acquire() try: instance_name = 'redis_instance_' + current.request.application if not hasattr(RedisSession, instance_name): setattr(RedisSession, instance_name, RedisClient(*args, **vars)) return getattr(RedisSession, instance_name) finally: locker.release() class RedisClient(object): meta_storage = {} MAX_RETRIES = 5 RETRIES = 0 _release_script = None def __init__(self, server='localhost:6379', db=None, debug=False, session_expiry=False, with_lock=False, password=None): """session_expiry can be an integer, in seconds, to set the default expiration of sessions. The corresponding record will be deleted from the redis instance, and there's virtually no need to run sessions2trash.py """ self.server = server self.password = password self.db = db or 0 host, port = (self.server.split(':') + ['6379'])[:2] port = int(port) self.debug = debug if current and current.request: self.app = current.request.application else: self.app = '' self.r_server = redis.Redis(host=host, port=port, db=self.db, password=self.password) if with_lock: RedisClient._release_script = self.r_server.register_script(_LUA_RELEASE_LOCK) self.tablename = None self.session_expiry = session_expiry self.with_lock = with_lock def get(self, what, default): return self.tablename def Field(self, fieldname, type='string', length=None, default=None, required=False, requires=None): return None def define_table(self, tablename, *fields, **args): if not self.tablename: self.tablename = MockTable( self, self.r_server, tablename, self.session_expiry, self.with_lock) return self.tablename def __getitem__(self, key): return self.tablename def __call__(self, where=''): q = self.tablename.query return q def commit(self): # this is only called by session2trash.py pass class MockTable(object): def __init__(self, db, r_server, tablename, session_expiry, with_lock=False): self.db = db self.r_server = r_server self.tablename = tablename # set the namespace for sessions of this app self.keyprefix = 'w2p:sess:%s' % tablename.replace( 'web2py_session_', '') # fast auto-increment id (needed for session handling) self.serial = "%s:serial" % self.keyprefix # index of all the session keys of this app self.id_idx = "%s:id_idx" % self.keyprefix # remember the session_expiry setting self.session_expiry = session_expiry self.with_lock = with_lock def __call__(self, record_id, unique_key=None): # Support DAL shortcut query: table(record_id) # This will call the __getattr__ below # returning a MockQuery q = self.id # Instructs MockQuery, to behave as db(table.id == record_id) q.op = 'eq' q.value = record_id q.unique_key = unique_key row = q.select() return row[0] if row else Storage() def __getattr__(self, key): if key == 'id': # return a fake query. We need to query it just by id for normal operations self.query = MockQuery( field='id', db=self.r_server, prefix=self.keyprefix, session_expiry=self.session_expiry, with_lock=self.with_lock, unique_key=self.unique_key ) return self.query elif key == '_db': # needed because of the calls in sessions2trash.py and globals.py return self.db def insert(self, **kwargs): # usually kwargs would be a Storage with several keys: # 'locked', 'client_ip','created_datetime','modified_datetime' # 'unique_key', 'session_data' # retrieve a new key newid = str(self.r_server.incr(self.serial)) key = self.keyprefix + ':' + newid if self.with_lock: key_lock = key + ':lock' acquire_lock(self.r_server, key_lock, newid) with self.r_server.pipeline() as pipe: # add it to the index pipe.sadd(self.id_idx, key) # set a hash key with the Storage pipe.hmset(key, kwargs) if self.session_expiry: pipe.expire(key, self.session_expiry) pipe.execute() if self.with_lock: release_lock(self.r_server, key_lock, newid) return newid class MockQuery(object): """a fake Query object that supports querying by id and listing all keys. No other operation is supported """ def __init__(self, field=None, db=None, prefix=None, session_expiry=False, with_lock=False, unique_key=None): self.field = field self.value = None self.db = db self.keyprefix = prefix self.op = None self.session_expiry = session_expiry self.with_lock = with_lock self.unique_key = unique_key def __eq__(self, value, op='eq'): self.value = value self.op = op def __gt__(self, value, op='ge'): self.value = value self.op = op def select(self): if self.op == 'eq' and self.field == 'id' and self.value: # means that someone wants to retrieve the key self.value key = self.keyprefix + ':' + str(self.value) if self.with_lock: acquire_lock(self.db, key + ':lock', self.value) rtn = self.db.hgetall(key) if rtn: if self.unique_key: # make sure the id and unique_key are correct if rtn['unique_key'] == self.unique_key: rtn['update_record'] = self.update # update record support else: rtn = None return [Storage(rtn)] if rtn else [] elif self.op == 'ge' and self.field == 'id' and self.value == 0: # means that someone wants the complete list rtn = [] id_idx = "%s:id_idx" % self.keyprefix # find all session keys of this app allkeys = self.db.smembers(id_idx) for sess in allkeys: val = self.db.hgetall(sess) if not val: if self.session_expiry: # clean up the idx, because the key expired self.db.srem(id_idx, sess) continue val = Storage(val) # add a delete_record method (necessary for sessions2trash.py) val.delete_record = RecordDeleter( self.db, sess, self.keyprefix) rtn.append(val) return rtn else: raise Exception("Operation not supported") def update(self, **kwargs): # means that the session has been found and needs an update if self.op == 'eq' and self.field == 'id' and self.value: key = self.keyprefix + ':' + str(self.value) if not self.db.exists(key): return None with self.db.pipeline() as pipe: pipe.hmset(key, kwargs) if self.session_expiry: pipe.expire(key, self.session_expiry) rtn = pipe.execute()[0] if self.with_lock: release_lock(self.db, key + ':lock', self.value) return rtn def delete(self, **kwargs): # means that we want this session to be deleted if self.op == 'eq' and self.field == 'id' and self.value: id_idx = "%s:id_idx" % self.keyprefix key = self.keyprefix + ':' + str(self.value) with self.db.pipeline() as pipe: pipe.delete(key) pipe.srem(id_idx, key) rtn = pipe.execute() return rtn[1] class RecordDeleter(object): """Dumb record deleter to support sessions2trash.py""" def __init__(self, db, key, keyprefix): self.db, self.key, self.keyprefix = db, key, keyprefix def __call__(self): id_idx = "%s:id_idx" % self.keyprefix # remove from the index self.db.srem(id_idx, self.key) # remove the key itself self.db.delete(self.key) def acquire_lock(conn, lockname, identifier, ltime=10): while True: if conn.set(lockname, identifier, ex=ltime, nx=True): return identifier time.sleep(.01) _LUA_RELEASE_LOCK = """ if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end """ def release_lock(conn, lockname, identifier): return RedisClient._release_script( keys=[lockname], args=[identifier], client=conn) web2py-2.12.3.orig/gluon/contrib/pymysql/0000775000000000000000000000000012564727262016765 5ustar rootrootweb2py-2.12.3.orig/gluon/contrib/pymysql/err.py0000664000000000000000000001035112564727262020127 0ustar rootrootimport struct try: StandardError, Warning except ImportError: try: from exceptions import StandardError, Warning except ImportError: import sys e = sys.modules['exceptions'] StandardError = e.StandardError Warning = e.Warning from constants import ER import sys class MySQLError(StandardError): """Exception related to operation with MySQL.""" class Warning(Warning, MySQLError): """Exception raised for important warnings like data truncations while inserting, etc.""" class Error(MySQLError): """Exception that is the base class of all other error exceptions (not Warning).""" class InterfaceError(Error): """Exception raised for errors that are related to the database interface rather than the database itself.""" class DatabaseError(Error): """Exception raised for errors that are related to the database.""" class DataError(DatabaseError): """Exception raised for errors that are due to problems with the processed data like division by zero, numeric value out of range, etc.""" class OperationalError(DatabaseError): """Exception raised for errors that are related to the database's operation and not necessarily under the control of the programmer, e.g. an unexpected disconnect occurs, the data source name is not found, a transaction could not be processed, a memory allocation error occurred during processing, etc.""" class IntegrityError(DatabaseError): """Exception raised when the relational integrity of the database is affected, e.g. a foreign key check fails, duplicate key, etc.""" class InternalError(DatabaseError): """Exception raised when the database encounters an internal error, e.g. the cursor is not valid anymore, the transaction is out of sync, etc.""" class ProgrammingError(DatabaseError): """Exception raised for programming errors, e.g. table not found or already exists, syntax error in the SQL statement, wrong number of parameters specified, etc.""" class NotSupportedError(DatabaseError): """Exception raised in case a method or database API was used which is not supported by the database, e.g. requesting a .rollback() on a connection that does not support transaction or has transactions turned off.""" error_map = {} def _map_error(exc, *errors): for error in errors: error_map[error] = exc _map_error(ProgrammingError, ER.DB_CREATE_EXISTS, ER.SYNTAX_ERROR, ER.PARSE_ERROR, ER.NO_SUCH_TABLE, ER.WRONG_DB_NAME, ER.WRONG_TABLE_NAME, ER.FIELD_SPECIFIED_TWICE, ER.INVALID_GROUP_FUNC_USE, ER.UNSUPPORTED_EXTENSION, ER.TABLE_MUST_HAVE_COLUMNS, ER.CANT_DO_THIS_DURING_AN_TRANSACTION) _map_error(DataError, ER.WARN_DATA_TRUNCATED, ER.WARN_NULL_TO_NOTNULL, ER.WARN_DATA_OUT_OF_RANGE, ER.NO_DEFAULT, ER.PRIMARY_CANT_HAVE_NULL, ER.DATA_TOO_LONG, ER.DATETIME_FUNCTION_OVERFLOW) _map_error(IntegrityError, ER.DUP_ENTRY, ER.NO_REFERENCED_ROW, ER.NO_REFERENCED_ROW_2, ER.ROW_IS_REFERENCED, ER.ROW_IS_REFERENCED_2, ER.CANNOT_ADD_FOREIGN) _map_error(NotSupportedError, ER.WARNING_NOT_COMPLETE_ROLLBACK, ER.NOT_SUPPORTED_YET, ER.FEATURE_DISABLED, ER.UNKNOWN_STORAGE_ENGINE) _map_error(OperationalError, ER.DBACCESS_DENIED_ERROR, ER.ACCESS_DENIED_ERROR, ER.TABLEACCESS_DENIED_ERROR, ER.COLUMNACCESS_DENIED_ERROR) del _map_error, ER def _get_error_info(data): errno = struct.unpack('= 65 and byte2int(data) <= 122: #data.isalnum(): return data return '.' try: print "packet length %d" % len(data) print "method call[1]: %s" % sys._getframe(1).f_code.co_name print "method call[2]: %s" % sys._getframe(2).f_code.co_name print "method call[3]: %s" % sys._getframe(3).f_code.co_name print "method call[4]: %s" % sys._getframe(4).f_code.co_name print "method call[5]: %s" % sys._getframe(5).f_code.co_name print "-" * 88 except ValueError: pass dump_data = [data[i:i+16] for i in xrange(len(data)) if i%16 == 0] for d in dump_data: print ' '.join(map(lambda x:"%02X" % byte2int(x), d)) + \ ' ' * (16 - len(d)) + ' ' * 2 + \ ' '.join(map(lambda x:"%s" % is_ascii(x), d)) print "-" * 88 print "" def _scramble(password, message): if password == None or len(password) == 0: return int2byte(0) if DEBUG: print 'password=' + password stage1 = sha_new(password).digest() stage2 = sha_new(stage1).digest() s = sha_new() s.update(message) s.update(stage2) result = s.digest() return _my_crypt(result, stage1) def _my_crypt(message1, message2): length = len(message1) result = struct.pack('B', length) for i in xrange(length): x = (struct.unpack('B', message1[i:i+1])[0] ^ \ struct.unpack('B', message2[i:i+1])[0]) result += struct.pack('B', x) return result # old_passwords support ported from libmysql/password.c SCRAMBLE_LENGTH_323 = 8 class RandStruct_323(object): def __init__(self, seed1, seed2): self.max_value = 0x3FFFFFFFL self.seed1 = seed1 % self.max_value self.seed2 = seed2 % self.max_value def my_rnd(self): self.seed1 = (self.seed1 * 3L + self.seed2) % self.max_value self.seed2 = (self.seed1 + self.seed2 + 33L) % self.max_value return float(self.seed1) / float(self.max_value) def _scramble_323(password, message): hash_pass = _hash_password_323(password) hash_message = _hash_password_323(message[:SCRAMBLE_LENGTH_323]) hash_pass_n = struct.unpack(">LL", hash_pass) hash_message_n = struct.unpack(">LL", hash_message) rand_st = RandStruct_323(hash_pass_n[0] ^ hash_message_n[0], hash_pass_n[1] ^ hash_message_n[1]) outbuf = StringIO.StringIO() for _ in xrange(min(SCRAMBLE_LENGTH_323, len(message))): outbuf.write(int2byte(int(rand_st.my_rnd() * 31) + 64)) extra = int2byte(int(rand_st.my_rnd() * 31)) out = outbuf.getvalue() outbuf = StringIO.StringIO() for c in out: outbuf.write(int2byte(byte2int(c) ^ byte2int(extra))) return outbuf.getvalue() def _hash_password_323(password): nr = 1345345333L add = 7L nr2 = 0x12345671L for c in [byte2int(x) for x in password if x not in (' ', '\t')]: nr^= (((nr & 63)+add)*c)+ (nr << 8) & 0xFFFFFFFF nr2= (nr2 + ((nr2 << 8) ^ nr)) & 0xFFFFFFFF add= (add + c) & 0xFFFFFFFF r1 = nr & ((1L << 31) - 1L) # kill sign bits r2 = nr2 & ((1L << 31) - 1L) # pack return struct.pack(">LL", r1, r2) def pack_int24(n): return struct.pack('BBB', n&0xFF, (n>>8)&0xFF, (n>>16)&0xFF) def unpack_uint16(n): return struct.unpack(' len(self.__data): raise Exception('Invalid advance amount (%s) for cursor. ' 'Position=%s' % (length, new_position)) self.__position = new_position def rewind(self, position=0): """Set the position of the data buffer cursor to 'position'.""" if position < 0 or position > len(self.__data): raise Exception("Invalid position to rewind cursor to: %s." % position) self.__position = position def peek(self, size): """Look at the first 'size' bytes in packet without moving cursor.""" result = self.__data[self.__position:(self.__position+size)] if len(result) != size: error = ('Result length not requested length:\n' 'Expected=%s. Actual=%s. Position: %s. Data Length: %s' % (size, len(result), self.__position, len(self.__data))) if DEBUG: print error self.dump() raise AssertionError(error) return result def get_bytes(self, position, length=1): """Get 'length' bytes starting at 'position'. Position is start of payload (first four packet header bytes are not included) starting at index '0'. No error checking is done. If requesting outside end of buffer an empty string (or string shorter than 'length') may be returned! """ return self.__data[position:(position+length)] def read_length_coded_binary(self): """Read a 'Length Coded Binary' number from the data buffer. Length coded numbers can be anywhere from 1 to 9 bytes depending on the value of the first byte. """ c = byte2int(self.read(1)) if c == NULL_COLUMN: return None if c < UNSIGNED_CHAR_COLUMN: return c elif c == UNSIGNED_SHORT_COLUMN: return unpack_uint16(self.read(UNSIGNED_SHORT_LENGTH)) elif c == UNSIGNED_INT24_COLUMN: return unpack_int24(self.read(UNSIGNED_INT24_LENGTH)) elif c == UNSIGNED_INT64_COLUMN: # TODO: what was 'longlong'? confirm it wasn't used? return unpack_int64(self.read(UNSIGNED_INT64_LENGTH)) def read_length_coded_string(self): """Read a 'Length Coded String' from the data buffer. A 'Length Coded String' consists first of a length coded (unsigned, positive) integer represented in 1-9 bytes followed by that many bytes of binary data. (For example "cat" would be "3cat".) """ length = self.read_length_coded_binary() if length is None: return None return self.read(length) def is_ok_packet(self): return byte2int(self.get_bytes(0)) == 0 def is_eof_packet(self): return byte2int(self.get_bytes(0)) == 254 # 'fe' def is_resultset_packet(self): field_count = byte2int(self.get_bytes(0)) return field_count >= 1 and field_count <= 250 def is_error_packet(self): return byte2int(self.get_bytes(0)) == 255 def check_error(self): if self.is_error_packet(): self.rewind() self.advance(1) # field_count == error (we already know that) errno = unpack_uint16(self.read(2)) if DEBUG: print "errno = %d" % errno raise_mysql_exception(self.__data) def dump(self): dump_packet(self.__data) class FieldDescriptorPacket(MysqlPacket): """A MysqlPacket that represents a specific column's metadata in the result. Parsing is automatically done and the results are exported via public attributes on the class such as: db, table_name, name, length, type_code. """ def __init__(self, *args): MysqlPacket.__init__(self, *args) self.__parse_field_descriptor() def __parse_field_descriptor(self): """Parse the 'Field Descriptor' (Metadata) packet. This is compatible with MySQL 4.1+ (not compatible with MySQL 4.0). """ self.catalog = self.read_length_coded_string() self.db = self.read_length_coded_string() self.table_name = self.read_length_coded_string() self.org_table = self.read_length_coded_string() self.name = self.read_length_coded_string().decode(self.connection.charset) self.org_name = self.read_length_coded_string() self.advance(1) # non-null filler self.charsetnr = struct.unpack(' 2: use_unicode = True if compress or named_pipe: raise NotImplementedError, "compress and named_pipe arguments are not supported" if ssl and (ssl.has_key('capath') or ssl.has_key('cipher')): raise NotImplementedError, 'ssl options capath and cipher are not supported' self.ssl = False if ssl: if not SSL_ENABLED: raise NotImplementedError, "ssl module not found" self.ssl = True client_flag |= SSL for k in ('key', 'cert', 'ca'): v = None if ssl.has_key(k): v = ssl[k] setattr(self, k, v) if read_default_group and not read_default_file: if sys.platform.startswith("win"): read_default_file = "c:\\my.ini" else: read_default_file = "/etc/my.cnf" if read_default_file: if not read_default_group: read_default_group = "client" cfg = ConfigParser.RawConfigParser() cfg.read(os.path.expanduser(read_default_file)) def _config(key, default): try: return cfg.get(read_default_group,key) except: return default user = _config("user",user) passwd = _config("password",passwd) host = _config("host", host) db = _config("db",db) unix_socket = _config("socket",unix_socket) port = int(_config("port", port)) charset = _config("default-character-set", charset) self.host = host self.port = port self.user = user or DEFAULT_USER self.password = passwd self.db = db self.unix_socket = unix_socket if charset: self.charset = charset self.use_unicode = True else: self.charset = DEFAULT_CHARSET self.use_unicode = False if use_unicode is not None: self.use_unicode = use_unicode client_flag |= CAPABILITIES client_flag |= MULTI_STATEMENTS if self.db: client_flag |= CONNECT_WITH_DB self.client_flag = client_flag self.cursorclass = cursorclass self.connect_timeout = connect_timeout self._connect() self._result = None self._affected_rows = 0 self.host_info = "Not connected" self.messages = [] self.set_charset(charset) self.encoders = encoders self.decoders = conv self.autocommit(False) if sql_mode is not None: c = self.cursor() c.execute("SET sql_mode=%s", (sql_mode,)) self.commit() if init_command is not None: c = self.cursor() c.execute(init_command) self.commit() def close(self): ''' Send the quit message and close the socket ''' if self.socket is None: raise Error("Already closed") send_data = struct.pack('= i + 1: i += 1 self.server_capabilities = struct.unpack('= i+12-1: rest_salt = data[i:i+12] self.salt += rest_salt def get_server_info(self): return self.server_version Warning = Warning Error = Error InterfaceError = InterfaceError DatabaseError = DatabaseError DataError = DataError OperationalError = OperationalError IntegrityError = IntegrityError InternalError = InternalError ProgrammingError = ProgrammingError NotSupportedError = NotSupportedError # TODO: move OK and EOF packet parsing/logic into a proper subclass # of MysqlPacket like has been done with FieldDescriptorPacket. class MySQLResult(object): def __init__(self, connection): from weakref import proxy self.connection = proxy(connection) self.affected_rows = None self.insert_id = None self.server_status = 0 self.warning_count = 0 self.message = None self.field_count = 0 self.description = None self.rows = None self.has_next = None self.unbuffered_active = False def __del__(self): if self.unbuffered_active: self._finish_unbuffered_query() def read(self): self.first_packet = self.connection.read_packet() # TODO: use classes for different packet types? if self.first_packet.is_ok_packet(): self._read_ok_packet() else: self._read_result_packet() def init_unbuffered_query(self): self.unbuffered_active = True self.first_packet = self.connection.read_packet() if self.first_packet.is_ok_packet(): self._read_ok_packet() self.unbuffered_active = False else: self.field_count = byte2int(self.first_packet.read(1)) self._get_descriptions() # Apparently, MySQLdb picks this number because it's the maximum # value of a 64bit unsigned integer. Since we're emulating MySQLdb, # we set it to this instead of None, which would be preferred. self.affected_rows = 18446744073709551615 def _read_ok_packet(self): ok_packet = OKPacketWrapper(self.first_packet) self.affected_rows = ok_packet.affected_rows self.insert_id = ok_packet.insert_id self.server_status = ok_packet.server_status self.warning_count = ok_packet.warning_count self.message = ok_packet.message def _check_packet_is_eof(self, packet): if packet.is_eof_packet(): eof_packet = EOFPacketWrapper(packet) self.warning_count = eof_packet.warning_count self.has_next = eof_packet.has_next return True return False def _read_result_packet(self): self.field_count = byte2int(self.first_packet.read(1)) self._get_descriptions() self._read_rowdata_packet() def _read_rowdata_packet_unbuffered(self): # Check if in an active query if self.unbuffered_active == False: return # EOF packet = self.connection.read_packet() if self._check_packet_is_eof(packet): self.unbuffered_active = False self.rows = None return row = [] for field in self.fields: data = packet.read_length_coded_string() converted = None if field.type_code in self.connection.decoders: converter = self.connection.decoders[field.type_code] if DEBUG: print "DEBUG: field=%s, converter=%s" % (field, converter) if data != None: converted = converter(self.connection, field, data) row.append(converted) self.affected_rows = 1 self.rows = tuple((row)) if DEBUG: self.rows def _finish_unbuffered_query(self): # After much reading on the MySQL protocol, it appears that there is, # in fact, no way to stop MySQL from sending all the data after # executing a query, so we just spin, and wait for an EOF packet. while self.unbuffered_active: packet = self.connection.read_packet() if self._check_packet_is_eof(packet): self.unbuffered_active = False # TODO: implement this as an iteratable so that it is more # memory efficient and lower-latency to client... def _read_rowdata_packet(self): """Read a rowdata packet for each data row in the result set.""" rows = [] while True: packet = self.connection.read_packet() if self._check_packet_is_eof(packet): break row = [] for field in self.fields: data = packet.read_length_coded_string() converted = None if field.type_code in self.connection.decoders: converter = self.connection.decoders[field.type_code] if DEBUG: print "DEBUG: field=%s, converter=%s" % (field, converter) if data != None: converted = converter(self.connection, field, data) row.append(converted) rows.append(tuple(row)) self.affected_rows = len(rows) self.rows = tuple(rows) if DEBUG: self.rows def _get_descriptions(self): """Read a column descriptor packet for each column in the result.""" self.fields = [] description = [] for i in xrange(self.field_count): field = self.connection.read_packet(FieldDescriptorPacket) self.fields.append(field) description.append(field.description()) eof_packet = self.connection.read_packet() assert eof_packet.is_eof_packet(), 'Protocol error, expecting EOF' self.description = tuple(description) web2py-2.12.3.orig/gluon/contrib/pymysql/times.py0000664000000000000000000000054412564727262020463 0ustar rootrootfrom time import localtime from datetime import date, datetime, time, timedelta Date = date Time = time TimeDelta = timedelta Timestamp = datetime def DateFromTicks(ticks): return date(*localtime(ticks)[:3]) def TimeFromTicks(ticks): return time(*localtime(ticks)[3:6]) def TimestampFromTicks(ticks): return datetime(*localtime(ticks)[:6]) web2py-2.12.3.orig/gluon/contrib/pymysql/__init__.py0000664000000000000000000001054312564727262021101 0ustar rootroot''' PyMySQL: A pure-Python drop-in replacement for MySQLdb. Copyright (c) 2010 PyMySQL contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ''' VERSION = (0, 5, None) from constants import FIELD_TYPE from converters import escape_dict, escape_sequence, escape_string from err import Warning, Error, InterfaceError, DataError, \ DatabaseError, OperationalError, IntegrityError, InternalError, \ NotSupportedError, ProgrammingError, MySQLError from times import Date, Time, Timestamp, \ DateFromTicks, TimeFromTicks, TimestampFromTicks import sys try: frozenset except NameError: from sets import ImmutableSet as frozenset try: from sets import BaseSet as set except ImportError: from sets import Set as set threadsafety = 1 apilevel = "2.0" paramstyle = "format" class DBAPISet(frozenset): def __ne__(self, other): if isinstance(other, set): return super(DBAPISet, self).__ne__(self, other) else: return other not in self def __eq__(self, other): if isinstance(other, frozenset): return frozenset.__eq__(self, other) else: return other in self def __hash__(self): return frozenset.__hash__(self) STRING = DBAPISet([FIELD_TYPE.ENUM, FIELD_TYPE.STRING, FIELD_TYPE.VAR_STRING]) BINARY = DBAPISet([FIELD_TYPE.BLOB, FIELD_TYPE.LONG_BLOB, FIELD_TYPE.MEDIUM_BLOB, FIELD_TYPE.TINY_BLOB]) NUMBER = DBAPISet([FIELD_TYPE.DECIMAL, FIELD_TYPE.DOUBLE, FIELD_TYPE.FLOAT, FIELD_TYPE.INT24, FIELD_TYPE.LONG, FIELD_TYPE.LONGLONG, FIELD_TYPE.TINY, FIELD_TYPE.YEAR]) DATE = DBAPISet([FIELD_TYPE.DATE, FIELD_TYPE.NEWDATE]) TIME = DBAPISet([FIELD_TYPE.TIME]) TIMESTAMP = DBAPISet([FIELD_TYPE.TIMESTAMP, FIELD_TYPE.DATETIME]) DATETIME = TIMESTAMP ROWID = DBAPISet() def Binary(x): """Return x as a binary type.""" return str(x) def Connect(*args, **kwargs): """ Connect to the database; see connections.Connection.__init__() for more information. """ from connections import Connection return Connection(*args, **kwargs) def get_client_info(): # for MySQLdb compatibility return '%s.%s.%s' % VERSION connect = Connection = Connect # we include a doctored version_info here for MySQLdb compatibility version_info = (1,2,2,"final",0) NULL = "NULL" __version__ = get_client_info() def thread_safe(): return True # match MySQLdb.thread_safe() def install_as_MySQLdb(): """ After this function is called, any application that imports MySQLdb or _mysql will unwittingly actually use """ sys.modules["MySQLdb"] = sys.modules["_mysql"] = sys.modules["pymysql"] __all__ = [ 'BINARY', 'Binary', 'Connect', 'Connection', 'DATE', 'Date', 'Time', 'Timestamp', 'DateFromTicks', 'TimeFromTicks', 'TimestampFromTicks', 'DataError', 'DatabaseError', 'Error', 'FIELD_TYPE', 'IntegrityError', 'InterfaceError', 'InternalError', 'MySQLError', 'NULL', 'NUMBER', 'NotSupportedError', 'DBAPISet', 'OperationalError', 'ProgrammingError', 'ROWID', 'STRING', 'TIME', 'TIMESTAMP', 'Warning', 'apilevel', 'connect', 'connections', 'constants', 'converters', 'cursors', 'escape_dict', 'escape_sequence', 'escape_string', 'get_client_info', 'paramstyle', 'threadsafety', 'version_info', "install_as_MySQLdb", "NULL","__version__", ] web2py-2.12.3.orig/gluon/contrib/pymysql/README.rst0000775000000000000000000000220612564727262020457 0ustar rootroot==================== PyMySQL Installation ==================== .. contents:: .. This package contains a pure-Python MySQL client library. Documentation on the MySQL client/server protocol can be found here: http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol If you would like to run the test suite, edit the config parameters in pymysql/tests/base.py. The goal of pymysql is to be a drop-in replacement for MySQLdb and work on CPython 2.3+, Jython, IronPython, PyPy and Python 3. We test for compatibility by simply changing the import statements in the Django MySQL backend and running its unit tests as well as running it against the MySQLdb and myconnpy unit tests. Requirements ------------- + Python 2.4 or higher * http://www.python.org/ * 2.6 is the primary test environment. * MySQL 4.1 or higher * protocol41 support, experimental 4.0 support Installation ------------ # easy_install pymysql # ... or ... # python setup.py install Python 3.0 Support ------------------ Simply run the build-py3k.sh script from the local directory. It will build a working package in the ./py3k directory. web2py-2.12.3.orig/gluon/contrib/pymysql/util.py0000664000000000000000000000051112564727262020311 0ustar rootrootimport struct def byte2int(b): if isinstance(b, int): return b else: return struct.unpack("!B", b)[0] def int2byte(i): return struct.pack("!B", i) def join_bytes(bs): if len(bs) == 0: return "" else: rv = bs[0] for b in bs[1:]: rv += b return rv web2py-2.12.3.orig/gluon/contrib/pymysql/charset.py0000664000000000000000000003410312564727262020771 0ustar rootrootMBLENGTH = { 8:1, 33:3, 88:2, 91:2 } class Charset: def __init__(self, id, name, collation, is_default): self.id, self.name, self.collation = id, name, collation self.is_default = is_default == 'Yes' class Charsets: def __init__(self): self._by_id = {} def add(self, c): self._by_id[c.id] = c def by_id(self, id): return self._by_id[id] def by_name(self, name): for c in self._by_id.values(): if c.name == name and c.is_default: return c _charsets = Charsets() """ Generated with: mysql -N -s -e "select id, character_set_name, collation_name, is_default from information_schema.collations order by id;" | python -c "import sys for l in sys.stdin.readlines(): id, name, collation, is_default = l.split(chr(9)) print '_charsets.add(Charset(%s, \'%s\', \'%s\', \'%s\'))' \ % (id, name, collation, is_default.strip()) " """ _charsets.add(Charset(1, 'big5', 'big5_chinese_ci', 'Yes')) _charsets.add(Charset(2, 'latin2', 'latin2_czech_cs', '')) _charsets.add(Charset(3, 'dec8', 'dec8_swedish_ci', 'Yes')) _charsets.add(Charset(4, 'cp850', 'cp850_general_ci', 'Yes')) _charsets.add(Charset(5, 'latin1', 'latin1_german1_ci', '')) _charsets.add(Charset(6, 'hp8', 'hp8_english_ci', 'Yes')) _charsets.add(Charset(7, 'koi8r', 'koi8r_general_ci', 'Yes')) _charsets.add(Charset(8, 'latin1', 'latin1_swedish_ci', 'Yes')) _charsets.add(Charset(9, 'latin2', 'latin2_general_ci', 'Yes')) _charsets.add(Charset(10, 'swe7', 'swe7_swedish_ci', 'Yes')) _charsets.add(Charset(11, 'ascii', 'ascii_general_ci', 'Yes')) _charsets.add(Charset(12, 'ujis', 'ujis_japanese_ci', 'Yes')) _charsets.add(Charset(13, 'sjis', 'sjis_japanese_ci', 'Yes')) _charsets.add(Charset(14, 'cp1251', 'cp1251_bulgarian_ci', '')) _charsets.add(Charset(15, 'latin1', 'latin1_danish_ci', '')) _charsets.add(Charset(16, 'hebrew', 'hebrew_general_ci', 'Yes')) _charsets.add(Charset(18, 'tis620', 'tis620_thai_ci', 'Yes')) _charsets.add(Charset(19, 'euckr', 'euckr_korean_ci', 'Yes')) _charsets.add(Charset(20, 'latin7', 'latin7_estonian_cs', '')) _charsets.add(Charset(21, 'latin2', 'latin2_hungarian_ci', '')) _charsets.add(Charset(22, 'koi8u', 'koi8u_general_ci', 'Yes')) _charsets.add(Charset(23, 'cp1251', 'cp1251_ukrainian_ci', '')) _charsets.add(Charset(24, 'gb2312', 'gb2312_chinese_ci', 'Yes')) _charsets.add(Charset(25, 'greek', 'greek_general_ci', 'Yes')) _charsets.add(Charset(26, 'cp1250', 'cp1250_general_ci', 'Yes')) _charsets.add(Charset(27, 'latin2', 'latin2_croatian_ci', '')) _charsets.add(Charset(28, 'gbk', 'gbk_chinese_ci', 'Yes')) _charsets.add(Charset(29, 'cp1257', 'cp1257_lithuanian_ci', '')) _charsets.add(Charset(30, 'latin5', 'latin5_turkish_ci', 'Yes')) _charsets.add(Charset(31, 'latin1', 'latin1_german2_ci', '')) _charsets.add(Charset(32, 'armscii8', 'armscii8_general_ci', 'Yes')) _charsets.add(Charset(33, 'utf8', 'utf8_general_ci', 'Yes')) _charsets.add(Charset(34, 'cp1250', 'cp1250_czech_cs', '')) _charsets.add(Charset(35, 'ucs2', 'ucs2_general_ci', 'Yes')) _charsets.add(Charset(36, 'cp866', 'cp866_general_ci', 'Yes')) _charsets.add(Charset(37, 'keybcs2', 'keybcs2_general_ci', 'Yes')) _charsets.add(Charset(38, 'macce', 'macce_general_ci', 'Yes')) _charsets.add(Charset(39, 'macroman', 'macroman_general_ci', 'Yes')) _charsets.add(Charset(40, 'cp852', 'cp852_general_ci', 'Yes')) _charsets.add(Charset(41, 'latin7', 'latin7_general_ci', 'Yes')) _charsets.add(Charset(42, 'latin7', 'latin7_general_cs', '')) _charsets.add(Charset(43, 'macce', 'macce_bin', '')) _charsets.add(Charset(44, 'cp1250', 'cp1250_croatian_ci', '')) _charsets.add(Charset(45, 'utf8mb4', 'utf8mb4_general_ci', 'Yes')) _charsets.add(Charset(46, 'utf8mb4', 'utf8mb4_bin', '')) _charsets.add(Charset(47, 'latin1', 'latin1_bin', '')) _charsets.add(Charset(48, 'latin1', 'latin1_general_ci', '')) _charsets.add(Charset(49, 'latin1', 'latin1_general_cs', '')) _charsets.add(Charset(50, 'cp1251', 'cp1251_bin', '')) _charsets.add(Charset(51, 'cp1251', 'cp1251_general_ci', 'Yes')) _charsets.add(Charset(52, 'cp1251', 'cp1251_general_cs', '')) _charsets.add(Charset(53, 'macroman', 'macroman_bin', '')) _charsets.add(Charset(54, 'utf16', 'utf16_general_ci', 'Yes')) _charsets.add(Charset(55, 'utf16', 'utf16_bin', '')) _charsets.add(Charset(56, 'utf16le', 'utf16le_general_ci', 'Yes')) _charsets.add(Charset(57, 'cp1256', 'cp1256_general_ci', 'Yes')) _charsets.add(Charset(58, 'cp1257', 'cp1257_bin', '')) _charsets.add(Charset(59, 'cp1257', 'cp1257_general_ci', 'Yes')) _charsets.add(Charset(60, 'utf32', 'utf32_general_ci', 'Yes')) _charsets.add(Charset(61, 'utf32', 'utf32_bin', '')) _charsets.add(Charset(62, 'utf16le', 'utf16le_bin', '')) _charsets.add(Charset(63, 'binary', 'binary', 'Yes')) _charsets.add(Charset(64, 'armscii8', 'armscii8_bin', '')) _charsets.add(Charset(65, 'ascii', 'ascii_bin', '')) _charsets.add(Charset(66, 'cp1250', 'cp1250_bin', '')) _charsets.add(Charset(67, 'cp1256', 'cp1256_bin', '')) _charsets.add(Charset(68, 'cp866', 'cp866_bin', '')) _charsets.add(Charset(69, 'dec8', 'dec8_bin', '')) _charsets.add(Charset(70, 'greek', 'greek_bin', '')) _charsets.add(Charset(71, 'hebrew', 'hebrew_bin', '')) _charsets.add(Charset(72, 'hp8', 'hp8_bin', '')) _charsets.add(Charset(73, 'keybcs2', 'keybcs2_bin', '')) _charsets.add(Charset(74, 'koi8r', 'koi8r_bin', '')) _charsets.add(Charset(75, 'koi8u', 'koi8u_bin', '')) _charsets.add(Charset(77, 'latin2', 'latin2_bin', '')) _charsets.add(Charset(78, 'latin5', 'latin5_bin', '')) _charsets.add(Charset(79, 'latin7', 'latin7_bin', '')) _charsets.add(Charset(80, 'cp850', 'cp850_bin', '')) _charsets.add(Charset(81, 'cp852', 'cp852_bin', '')) _charsets.add(Charset(82, 'swe7', 'swe7_bin', '')) _charsets.add(Charset(83, 'utf8', 'utf8_bin', '')) _charsets.add(Charset(84, 'big5', 'big5_bin', '')) _charsets.add(Charset(85, 'euckr', 'euckr_bin', '')) _charsets.add(Charset(86, 'gb2312', 'gb2312_bin', '')) _charsets.add(Charset(87, 'gbk', 'gbk_bin', '')) _charsets.add(Charset(88, 'sjis', 'sjis_bin', '')) _charsets.add(Charset(89, 'tis620', 'tis620_bin', '')) _charsets.add(Charset(90, 'ucs2', 'ucs2_bin', '')) _charsets.add(Charset(91, 'ujis', 'ujis_bin', '')) _charsets.add(Charset(92, 'geostd8', 'geostd8_general_ci', 'Yes')) _charsets.add(Charset(93, 'geostd8', 'geostd8_bin', '')) _charsets.add(Charset(94, 'latin1', 'latin1_spanish_ci', '')) _charsets.add(Charset(95, 'cp932', 'cp932_japanese_ci', 'Yes')) _charsets.add(Charset(96, 'cp932', 'cp932_bin', '')) _charsets.add(Charset(97, 'eucjpms', 'eucjpms_japanese_ci', 'Yes')) _charsets.add(Charset(98, 'eucjpms', 'eucjpms_bin', '')) _charsets.add(Charset(99, 'cp1250', 'cp1250_polish_ci', '')) _charsets.add(Charset(101, 'utf16', 'utf16_unicode_ci', '')) _charsets.add(Charset(102, 'utf16', 'utf16_icelandic_ci', '')) _charsets.add(Charset(103, 'utf16', 'utf16_latvian_ci', '')) _charsets.add(Charset(104, 'utf16', 'utf16_romanian_ci', '')) _charsets.add(Charset(105, 'utf16', 'utf16_slovenian_ci', '')) _charsets.add(Charset(106, 'utf16', 'utf16_polish_ci', '')) _charsets.add(Charset(107, 'utf16', 'utf16_estonian_ci', '')) _charsets.add(Charset(108, 'utf16', 'utf16_spanish_ci', '')) _charsets.add(Charset(109, 'utf16', 'utf16_swedish_ci', '')) _charsets.add(Charset(110, 'utf16', 'utf16_turkish_ci', '')) _charsets.add(Charset(111, 'utf16', 'utf16_czech_ci', '')) _charsets.add(Charset(112, 'utf16', 'utf16_danish_ci', '')) _charsets.add(Charset(113, 'utf16', 'utf16_lithuanian_ci', '')) _charsets.add(Charset(114, 'utf16', 'utf16_slovak_ci', '')) _charsets.add(Charset(115, 'utf16', 'utf16_spanish2_ci', '')) _charsets.add(Charset(116, 'utf16', 'utf16_roman_ci', '')) _charsets.add(Charset(117, 'utf16', 'utf16_persian_ci', '')) _charsets.add(Charset(118, 'utf16', 'utf16_esperanto_ci', '')) _charsets.add(Charset(119, 'utf16', 'utf16_hungarian_ci', '')) _charsets.add(Charset(120, 'utf16', 'utf16_sinhala_ci', '')) _charsets.add(Charset(121, 'utf16', 'utf16_german2_ci', '')) _charsets.add(Charset(122, 'utf16', 'utf16_croatian_ci', '')) _charsets.add(Charset(123, 'utf16', 'utf16_unicode_520_ci', '')) _charsets.add(Charset(124, 'utf16', 'utf16_vietnamese_ci', '')) _charsets.add(Charset(128, 'ucs2', 'ucs2_unicode_ci', '')) _charsets.add(Charset(129, 'ucs2', 'ucs2_icelandic_ci', '')) _charsets.add(Charset(130, 'ucs2', 'ucs2_latvian_ci', '')) _charsets.add(Charset(131, 'ucs2', 'ucs2_romanian_ci', '')) _charsets.add(Charset(132, 'ucs2', 'ucs2_slovenian_ci', '')) _charsets.add(Charset(133, 'ucs2', 'ucs2_polish_ci', '')) _charsets.add(Charset(134, 'ucs2', 'ucs2_estonian_ci', '')) _charsets.add(Charset(135, 'ucs2', 'ucs2_spanish_ci', '')) _charsets.add(Charset(136, 'ucs2', 'ucs2_swedish_ci', '')) _charsets.add(Charset(137, 'ucs2', 'ucs2_turkish_ci', '')) _charsets.add(Charset(138, 'ucs2', 'ucs2_czech_ci', '')) _charsets.add(Charset(139, 'ucs2', 'ucs2_danish_ci', '')) _charsets.add(Charset(140, 'ucs2', 'ucs2_lithuanian_ci', '')) _charsets.add(Charset(141, 'ucs2', 'ucs2_slovak_ci', '')) _charsets.add(Charset(142, 'ucs2', 'ucs2_spanish2_ci', '')) _charsets.add(Charset(143, 'ucs2', 'ucs2_roman_ci', '')) _charsets.add(Charset(144, 'ucs2', 'ucs2_persian_ci', '')) _charsets.add(Charset(145, 'ucs2', 'ucs2_esperanto_ci', '')) _charsets.add(Charset(146, 'ucs2', 'ucs2_hungarian_ci', '')) _charsets.add(Charset(147, 'ucs2', 'ucs2_sinhala_ci', '')) _charsets.add(Charset(148, 'ucs2', 'ucs2_german2_ci', '')) _charsets.add(Charset(149, 'ucs2', 'ucs2_croatian_ci', '')) _charsets.add(Charset(150, 'ucs2', 'ucs2_unicode_520_ci', '')) _charsets.add(Charset(151, 'ucs2', 'ucs2_vietnamese_ci', '')) _charsets.add(Charset(159, 'ucs2', 'ucs2_general_mysql500_ci', '')) _charsets.add(Charset(160, 'utf32', 'utf32_unicode_ci', '')) _charsets.add(Charset(161, 'utf32', 'utf32_icelandic_ci', '')) _charsets.add(Charset(162, 'utf32', 'utf32_latvian_ci', '')) _charsets.add(Charset(163, 'utf32', 'utf32_romanian_ci', '')) _charsets.add(Charset(164, 'utf32', 'utf32_slovenian_ci', '')) _charsets.add(Charset(165, 'utf32', 'utf32_polish_ci', '')) _charsets.add(Charset(166, 'utf32', 'utf32_estonian_ci', '')) _charsets.add(Charset(167, 'utf32', 'utf32_spanish_ci', '')) _charsets.add(Charset(168, 'utf32', 'utf32_swedish_ci', '')) _charsets.add(Charset(169, 'utf32', 'utf32_turkish_ci', '')) _charsets.add(Charset(170, 'utf32', 'utf32_czech_ci', '')) _charsets.add(Charset(171, 'utf32', 'utf32_danish_ci', '')) _charsets.add(Charset(172, 'utf32', 'utf32_lithuanian_ci', '')) _charsets.add(Charset(173, 'utf32', 'utf32_slovak_ci', '')) _charsets.add(Charset(174, 'utf32', 'utf32_spanish2_ci', '')) _charsets.add(Charset(175, 'utf32', 'utf32_roman_ci', '')) _charsets.add(Charset(176, 'utf32', 'utf32_persian_ci', '')) _charsets.add(Charset(177, 'utf32', 'utf32_esperanto_ci', '')) _charsets.add(Charset(178, 'utf32', 'utf32_hungarian_ci', '')) _charsets.add(Charset(179, 'utf32', 'utf32_sinhala_ci', '')) _charsets.add(Charset(180, 'utf32', 'utf32_german2_ci', '')) _charsets.add(Charset(181, 'utf32', 'utf32_croatian_ci', '')) _charsets.add(Charset(182, 'utf32', 'utf32_unicode_520_ci', '')) _charsets.add(Charset(183, 'utf32', 'utf32_vietnamese_ci', '')) _charsets.add(Charset(192, 'utf8', 'utf8_unicode_ci', '')) _charsets.add(Charset(193, 'utf8', 'utf8_icelandic_ci', '')) _charsets.add(Charset(194, 'utf8', 'utf8_latvian_ci', '')) _charsets.add(Charset(195, 'utf8', 'utf8_romanian_ci', '')) _charsets.add(Charset(196, 'utf8', 'utf8_slovenian_ci', '')) _charsets.add(Charset(197, 'utf8', 'utf8_polish_ci', '')) _charsets.add(Charset(198, 'utf8', 'utf8_estonian_ci', '')) _charsets.add(Charset(199, 'utf8', 'utf8_spanish_ci', '')) _charsets.add(Charset(200, 'utf8', 'utf8_swedish_ci', '')) _charsets.add(Charset(201, 'utf8', 'utf8_turkish_ci', '')) _charsets.add(Charset(202, 'utf8', 'utf8_czech_ci', '')) _charsets.add(Charset(203, 'utf8', 'utf8_danish_ci', '')) _charsets.add(Charset(204, 'utf8', 'utf8_lithuanian_ci', '')) _charsets.add(Charset(205, 'utf8', 'utf8_slovak_ci', '')) _charsets.add(Charset(206, 'utf8', 'utf8_spanish2_ci', '')) _charsets.add(Charset(207, 'utf8', 'utf8_roman_ci', '')) _charsets.add(Charset(208, 'utf8', 'utf8_persian_ci', '')) _charsets.add(Charset(209, 'utf8', 'utf8_esperanto_ci', '')) _charsets.add(Charset(210, 'utf8', 'utf8_hungarian_ci', '')) _charsets.add(Charset(211, 'utf8', 'utf8_sinhala_ci', '')) _charsets.add(Charset(212, 'utf8', 'utf8_german2_ci', '')) _charsets.add(Charset(213, 'utf8', 'utf8_croatian_ci', '')) _charsets.add(Charset(214, 'utf8', 'utf8_unicode_520_ci', '')) _charsets.add(Charset(215, 'utf8', 'utf8_vietnamese_ci', '')) _charsets.add(Charset(223, 'utf8', 'utf8_general_mysql500_ci', '')) _charsets.add(Charset(224, 'utf8mb4', 'utf8mb4_unicode_ci', '')) _charsets.add(Charset(225, 'utf8mb4', 'utf8mb4_icelandic_ci', '')) _charsets.add(Charset(226, 'utf8mb4', 'utf8mb4_latvian_ci', '')) _charsets.add(Charset(227, 'utf8mb4', 'utf8mb4_romanian_ci', '')) _charsets.add(Charset(228, 'utf8mb4', 'utf8mb4_slovenian_ci', '')) _charsets.add(Charset(229, 'utf8mb4', 'utf8mb4_polish_ci', '')) _charsets.add(Charset(230, 'utf8mb4', 'utf8mb4_estonian_ci', '')) _charsets.add(Charset(231, 'utf8mb4', 'utf8mb4_spanish_ci', '')) _charsets.add(Charset(232, 'utf8mb4', 'utf8mb4_swedish_ci', '')) _charsets.add(Charset(233, 'utf8mb4', 'utf8mb4_turkish_ci', '')) _charsets.add(Charset(234, 'utf8mb4', 'utf8mb4_czech_ci', '')) _charsets.add(Charset(235, 'utf8mb4', 'utf8mb4_danish_ci', '')) _charsets.add(Charset(236, 'utf8mb4', 'utf8mb4_lithuanian_ci', '')) _charsets.add(Charset(237, 'utf8mb4', 'utf8mb4_slovak_ci', '')) _charsets.add(Charset(238, 'utf8mb4', 'utf8mb4_spanish2_ci', '')) _charsets.add(Charset(239, 'utf8mb4', 'utf8mb4_roman_ci', '')) _charsets.add(Charset(240, 'utf8mb4', 'utf8mb4_persian_ci', '')) _charsets.add(Charset(241, 'utf8mb4', 'utf8mb4_esperanto_ci', '')) _charsets.add(Charset(242, 'utf8mb4', 'utf8mb4_hungarian_ci', '')) _charsets.add(Charset(243, 'utf8mb4', 'utf8mb4_sinhala_ci', '')) _charsets.add(Charset(244, 'utf8mb4', 'utf8mb4_german2_ci', '')) _charsets.add(Charset(245, 'utf8mb4', 'utf8mb4_croatian_ci', '')) _charsets.add(Charset(246, 'utf8mb4', 'utf8mb4_unicode_520_ci', '')) _charsets.add(Charset(247, 'utf8mb4', 'utf8mb4_vietnamese_ci', '')) def charset_by_name(name): return _charsets.by_name(name) def charset_by_id(id): return _charsets.by_id(id) web2py-2.12.3.orig/gluon/contrib/pymysql/CHANGELOG0000775000000000000000000000323012564727262020200 0ustar rootrootChanges -------- 0.4 -Miscellaneous bug fixes -Implementation of SSL support -Implementation of kill() -Cleaned up charset functionality -Fixed BIT type handling -Connections raise exceptions after they are close()'d -Full Py3k and unicode support 0.3 -Implemented most of the extended DBAPI 2.0 spec including callproc() -Fixed error handling to include the message from the server and support multiple protocol versions. -Implemented ping() -Implemented unicode support (probably needs better testing) -Removed DeprecationWarnings -Ran against the MySQLdb unit tests to check for bugs -Added support for client_flag, charset, sql_mode, read_default_file, use_unicode, cursorclass, init_command, and connect_timeout. -Refactoring for some more compatibility with MySQLdb including a fake pymysql.version_info attribute. -Now runs with no warnings with the -3 command-line switch -Added test cases for all outstanding tickets and closed most of them. -Basic Jython support added. -Fixed empty result sets bug. -Integrated new unit tests and refactored the example into one. -Fixed bug with decimal conversion. -Fixed string encoding bug. Now unicode and binary data work! -Added very basic docstrings. 0.2 -Changed connection parameter name 'password' to 'passwd' to make it more plugin replaceable for the other mysql clients. -Changed pack()/unpack() calls so it runs on 64 bit OSes too. -Added support for unix_socket. -Added support for no password. -Renamed decorders to decoders. -Better handling of non-existing decoder. web2py-2.12.3.orig/gluon/contrib/pymysql/converters.py0000664000000000000000000002456312564727262021543 0ustar rootrootimport re import datetime import time import sys from constants import FIELD_TYPE, FLAG from charset import charset_by_id PYTHON3 = sys.version_info[0] > 2 try: set except NameError: try: from sets import BaseSet as set except ImportError: from sets import Set as set ESCAPE_REGEX = re.compile(r"[\0\n\r\032\'\"\\]") ESCAPE_MAP = {'\0': '\\0', '\n': '\\n', '\r': '\\r', '\032': '\\Z', '\'': '\\\'', '"': '\\"', '\\': '\\\\'} def escape_item(val, charset): if type(val) in [tuple, list, set]: return escape_sequence(val, charset) if type(val) is dict: return escape_dict(val, charset) if PYTHON3 and hasattr(val, "decode") and not isinstance(val, unicode): # deal with py3k bytes val = val.decode(charset) encoder = encoders[type(val)] val = encoder(val) if type(val) in [str, int]: return val val = val.encode(charset) return val def escape_dict(val, charset): n = {} for k, v in val.items(): quoted = escape_item(v, charset) n[k] = quoted return n def escape_sequence(val, charset): n = [] for item in val: quoted = escape_item(item, charset) n.append(quoted) return "(" + ",".join(n) + ")" def escape_set(val, charset): val = map(lambda x: escape_item(x, charset), val) return ','.join(val) def escape_bool(value): return str(int(value)) def escape_object(value): return str(value) def escape_int(value): return value escape_long = escape_object def escape_float(value): return ('%.15g' % value) def escape_string(value): return ("'%s'" % ESCAPE_REGEX.sub( lambda match: ESCAPE_MAP.get(match.group(0)), value)) def escape_unicode(value): return escape_string(value) def escape_None(value): return 'NULL' def escape_timedelta(obj): seconds = int(obj.seconds) % 60 minutes = int(obj.seconds // 60) % 60 hours = int(obj.seconds // 3600) % 24 + int(obj.days) * 24 return escape_string('%02d:%02d:%02d' % (hours, minutes, seconds)) def escape_time(obj): s = "%02d:%02d:%02d" % (int(obj.hour), int(obj.minute), int(obj.second)) if obj.microsecond: s += ".%f" % obj.microsecond return escape_string(s) def escape_datetime(obj): return escape_string(obj.strftime("%Y-%m-%d %H:%M:%S")) def escape_date(obj): return escape_string(obj.strftime("%Y-%m-%d")) def escape_struct_time(obj): return escape_datetime(datetime.datetime(*obj[:6])) def convert_datetime(connection, field, obj): """Returns a DATETIME or TIMESTAMP column value as a datetime object: >>> datetime_or_None('2007-02-25 23:06:20') datetime.datetime(2007, 2, 25, 23, 6, 20) >>> datetime_or_None('2007-02-25T23:06:20') datetime.datetime(2007, 2, 25, 23, 6, 20) Illegal values are returned as None: >>> datetime_or_None('2007-02-31T23:06:20') is None True >>> datetime_or_None('0000-00-00 00:00:00') is None True """ if not isinstance(obj, unicode): obj = obj.decode(connection.charset) if ' ' in obj: sep = ' ' elif 'T' in obj: sep = 'T' else: return convert_date(connection, field, obj) try: ymd, hms = obj.split(sep, 1) return datetime.datetime(*[ int(x) for x in ymd.split('-')+hms.split(':') ]) except ValueError: return convert_date(connection, field, obj) def convert_timedelta(connection, field, obj): """Returns a TIME column as a timedelta object: >>> timedelta_or_None('25:06:17') datetime.timedelta(1, 3977) >>> timedelta_or_None('-25:06:17') datetime.timedelta(-2, 83177) Illegal values are returned as None: >>> timedelta_or_None('random crap') is None True Note that MySQL always returns TIME columns as (+|-)HH:MM:SS, but can accept values as (+|-)DD HH:MM:SS. The latter format will not be parsed correctly by this function. """ try: microseconds = 0 if not isinstance(obj, unicode): obj = obj.decode(connection.charset) if "." in obj: (obj, tail) = obj.split('.') microseconds = int(tail) hours, minutes, seconds = obj.split(':') tdelta = datetime.timedelta( hours = int(hours), minutes = int(minutes), seconds = int(seconds), microseconds = microseconds ) return tdelta except ValueError: return None def convert_time(connection, field, obj): """Returns a TIME column as a time object: >>> time_or_None('15:06:17') datetime.time(15, 6, 17) Illegal values are returned as None: >>> time_or_None('-25:06:17') is None True >>> time_or_None('random crap') is None True Note that MySQL always returns TIME columns as (+|-)HH:MM:SS, but can accept values as (+|-)DD HH:MM:SS. The latter format will not be parsed correctly by this function. Also note that MySQL's TIME column corresponds more closely to Python's timedelta and not time. However if you want TIME columns to be treated as time-of-day and not a time offset, then you can use set this function as the converter for FIELD_TYPE.TIME. """ try: microseconds = 0 if "." in obj: (obj, tail) = obj.split('.') microseconds = int(tail) hours, minutes, seconds = obj.split(':') return datetime.time(hour=int(hours), minute=int(minutes), second=int(seconds), microsecond=microseconds) except ValueError: return None def convert_date(connection, field, obj): """Returns a DATE column as a date object: >>> date_or_None('2007-02-26') datetime.date(2007, 2, 26) Illegal values are returned as None: >>> date_or_None('2007-02-31') is None True >>> date_or_None('0000-00-00') is None True """ try: if not isinstance(obj, unicode): obj = obj.decode(connection.charset) return datetime.date(*[ int(x) for x in obj.split('-', 2) ]) except ValueError: return None def convert_mysql_timestamp(connection, field, timestamp): """Convert a MySQL TIMESTAMP to a Timestamp object. MySQL >= 4.1 returns TIMESTAMP in the same format as DATETIME: >>> mysql_timestamp_converter('2007-02-25 22:32:17') datetime.datetime(2007, 2, 25, 22, 32, 17) MySQL < 4.1 uses a big string of numbers: >>> mysql_timestamp_converter('20070225223217') datetime.datetime(2007, 2, 25, 22, 32, 17) Illegal values are returned as None: >>> mysql_timestamp_converter('2007-02-31 22:32:17') is None True >>> mysql_timestamp_converter('00000000000000') is None True """ if not isinstance(timestamp, unicode): timestamp = timestamp.decode(connection.charset) if timestamp[4] == '-': return convert_datetime(connection, field, timestamp) timestamp += "0"*(14-len(timestamp)) # padding year, month, day, hour, minute, second = \ int(timestamp[:4]), int(timestamp[4:6]), int(timestamp[6:8]), \ int(timestamp[8:10]), int(timestamp[10:12]), int(timestamp[12:14]) try: return datetime.datetime(year, month, day, hour, minute, second) except ValueError: return None def convert_set(s): return set(s.split(",")) def convert_bit(connection, field, b): #b = "\x00" * (8 - len(b)) + b # pad w/ zeroes #return struct.unpack(">Q", b)[0] # # the snippet above is right, but MySQLdb doesn't process bits, # so we shouldn't either return b def convert_characters(connection, field, data): field_charset = charset_by_id(field.charsetnr).name if field.flags & FLAG.SET: return convert_set(data.decode(field_charset)) if field.flags & FLAG.BINARY: return data if connection.use_unicode: data = data.decode(field_charset) elif connection.charset != field_charset: data = data.decode(field_charset) data = data.encode(connection.charset) return data def convert_int(connection, field, data): return int(data) def convert_long(connection, field, data): return long(data) def convert_float(connection, field, data): return float(data) encoders = { bool: escape_bool, int: escape_int, long: escape_long, float: escape_float, str: escape_string, unicode: escape_unicode, tuple: escape_sequence, list:escape_sequence, set:escape_sequence, dict:escape_dict, type(None):escape_None, datetime.date: escape_date, datetime.datetime : escape_datetime, datetime.timedelta : escape_timedelta, datetime.time : escape_time, time.struct_time : escape_struct_time, } decoders = { FIELD_TYPE.BIT: convert_bit, FIELD_TYPE.TINY: convert_int, FIELD_TYPE.SHORT: convert_int, FIELD_TYPE.LONG: convert_long, FIELD_TYPE.FLOAT: convert_float, FIELD_TYPE.DOUBLE: convert_float, FIELD_TYPE.DECIMAL: convert_float, FIELD_TYPE.NEWDECIMAL: convert_float, FIELD_TYPE.LONGLONG: convert_long, FIELD_TYPE.INT24: convert_int, FIELD_TYPE.YEAR: convert_int, FIELD_TYPE.TIMESTAMP: convert_mysql_timestamp, FIELD_TYPE.DATETIME: convert_datetime, FIELD_TYPE.TIME: convert_timedelta, FIELD_TYPE.DATE: convert_date, FIELD_TYPE.SET: convert_set, FIELD_TYPE.BLOB: convert_characters, FIELD_TYPE.TINY_BLOB: convert_characters, FIELD_TYPE.MEDIUM_BLOB: convert_characters, FIELD_TYPE.LONG_BLOB: convert_characters, FIELD_TYPE.STRING: convert_characters, FIELD_TYPE.VAR_STRING: convert_characters, FIELD_TYPE.VARCHAR: convert_characters, #FIELD_TYPE.BLOB: str, #FIELD_TYPE.STRING: str, #FIELD_TYPE.VAR_STRING: str, #FIELD_TYPE.VARCHAR: str } conversions = decoders # for MySQLdb compatibility try: # python version > 2.3 from decimal import Decimal def convert_decimal(connection, field, data): data = data.decode(connection.charset) return Decimal(data) decoders[FIELD_TYPE.DECIMAL] = convert_decimal decoders[FIELD_TYPE.NEWDECIMAL] = convert_decimal def escape_decimal(obj): return unicode(obj) encoders[Decimal] = escape_decimal except ImportError: pass web2py-2.12.3.orig/gluon/contrib/pymysql/cursors.py0000664000000000000000000003145412564727262021046 0ustar rootroot# -*- coding: utf-8 -*- import struct import re try: import cStringIO as StringIO except ImportError: import StringIO from err import Warning, Error, InterfaceError, DataError, \ DatabaseError, OperationalError, IntegrityError, InternalError, \ NotSupportedError, ProgrammingError insert_values = re.compile(r'\svalues\s*(\(.+\))', re.IGNORECASE) class Cursor(object): ''' This is the object you use to interact with the database. ''' def __init__(self, connection): ''' Do not create an instance of a Cursor yourself. Call connections.Connection.cursor(). ''' from weakref import proxy self.connection = proxy(connection) self.description = None self.rownumber = 0 self.rowcount = -1 self.arraysize = 1 self._executed = None self.messages = [] self.errorhandler = connection.errorhandler self._has_next = None self._rows = () def __del__(self): ''' When this gets GC'd close it. ''' self.close() def close(self): ''' Closing a cursor just exhausts all remaining data. ''' if not self.connection: return try: while self.nextset(): pass except: pass self.connection = None def _get_db(self): if not self.connection: self.errorhandler(self, ProgrammingError, "cursor closed") return self.connection def _check_executed(self): if not self._executed: self.errorhandler(self, ProgrammingError, "execute() first") def setinputsizes(self, *args): """Does nothing, required by DB API.""" def setoutputsizes(self, *args): """Does nothing, required by DB API.""" def nextset(self): ''' Get the next query set ''' if self._executed: self.fetchall() del self.messages[:] if not self._has_next: return None connection = self._get_db() connection.next_result() self._do_get_result() return True def execute(self, query, args=None): ''' Execute a query ''' from sys import exc_info conn = self._get_db() charset = conn.charset del self.messages[:] # TODO: make sure that conn.escape is correct if isinstance(query, unicode): query = query.encode(charset) if args is not None: if isinstance(args, tuple) or isinstance(args, list): escaped_args = tuple(conn.escape(arg) for arg in args) elif isinstance(args, dict): escaped_args = dict((key, conn.escape(val)) for (key, val) in args.items()) else: #If it's not a dictionary let's try escaping it anyways. #Worst case it will throw a Value error escaped_args = conn.escape(args) query = query % escaped_args result = 0 try: result = self._query(query) except: exc, value, tb = exc_info() del tb self.messages.append((exc,value)) self.errorhandler(self, exc, value) self._executed = query return result def executemany(self, query, args): ''' Run several data against one query ''' del self.messages[:] #conn = self._get_db() if not args: return #charset = conn.charset #if isinstance(query, unicode): # query = query.encode(charset) self.rowcount = sum([ self.execute(query, arg) for arg in args ]) return self.rowcount def callproc(self, procname, args=()): """Execute stored procedure procname with args procname -- string, name of procedure to execute on server args -- Sequence of parameters to use with procedure Returns the original args. Compatibility warning: PEP-249 specifies that any modified parameters must be returned. This is currently impossible as they are only available by storing them in a server variable and then retrieved by a query. Since stored procedures return zero or more result sets, there is no reliable way to get at OUT or INOUT parameters via callproc. The server variables are named @_procname_n, where procname is the parameter above and n is the position of the parameter (from zero). Once all result sets generated by the procedure have been fetched, you can issue a SELECT @_procname_0, ... query using .execute() to get any OUT or INOUT values. Compatibility warning: The act of calling a stored procedure itself creates an empty result set. This appears after any result sets generated by the procedure. This is non-standard behavior with respect to the DB-API. Be sure to use nextset() to advance through all result sets; otherwise you may get disconnected. """ conn = self._get_db() for index, arg in enumerate(args): q = "SET @_%s_%d=%s" % (procname, index, conn.escape(arg)) if isinstance(q, unicode): q = q.encode(conn.charset) self._query(q) self.nextset() q = "CALL %s(%s)" % (procname, ','.join(['@_%s_%d' % (procname, i) for i in range(len(args))])) if isinstance(q, unicode): q = q.encode(conn.charset) self._query(q) self._executed = q return args def fetchone(self): ''' Fetch the next row ''' self._check_executed() if self._rows is None or self.rownumber >= len(self._rows): return None result = self._rows[self.rownumber] self.rownumber += 1 return result def fetchmany(self, size=None): ''' Fetch several rows ''' self._check_executed() end = self.rownumber + (size or self.arraysize) result = self._rows[self.rownumber:end] if self._rows is None: return None self.rownumber = min(end, len(self._rows)) return result def fetchall(self): ''' Fetch all the rows ''' self._check_executed() if self._rows is None: return None if self.rownumber: result = self._rows[self.rownumber:] else: result = self._rows self.rownumber = len(self._rows) return result def scroll(self, value, mode='relative'): self._check_executed() if mode == 'relative': r = self.rownumber + value elif mode == 'absolute': r = value else: self.errorhandler(self, ProgrammingError, "unknown scroll mode %s" % mode) if r < 0 or r >= len(self._rows): self.errorhandler(self, IndexError, "out of range") self.rownumber = r def _query(self, q): conn = self._get_db() self._last_executed = q conn.query(q) self._do_get_result() return self.rowcount def _do_get_result(self): conn = self._get_db() self.rowcount = conn._result.affected_rows self.rownumber = 0 self.description = conn._result.description self.lastrowid = conn._result.insert_id self._rows = conn._result.rows self._has_next = conn._result.has_next def __iter__(self): return iter(self.fetchone, None) Warning = Warning Error = Error InterfaceError = InterfaceError DatabaseError = DatabaseError DataError = DataError OperationalError = OperationalError IntegrityError = IntegrityError InternalError = InternalError ProgrammingError = ProgrammingError NotSupportedError = NotSupportedError class DictCursor(Cursor): """A cursor which returns results as a dictionary""" def execute(self, query, args=None): result = super(DictCursor, self).execute(query, args) if self.description: self._fields = [ field[0] for field in self.description ] return result def fetchone(self): ''' Fetch the next row ''' self._check_executed() if self._rows is None or self.rownumber >= len(self._rows): return None result = dict(zip(self._fields, self._rows[self.rownumber])) self.rownumber += 1 return result def fetchmany(self, size=None): ''' Fetch several rows ''' self._check_executed() if self._rows is None: return None end = self.rownumber + (size or self.arraysize) result = [ dict(zip(self._fields, r)) for r in self._rows[self.rownumber:end] ] self.rownumber = min(end, len(self._rows)) return tuple(result) def fetchall(self): ''' Fetch all the rows ''' self._check_executed() if self._rows is None: return None if self.rownumber: result = [ dict(zip(self._fields, r)) for r in self._rows[self.rownumber:] ] else: result = [ dict(zip(self._fields, r)) for r in self._rows ] self.rownumber = len(self._rows) return tuple(result) class SSCursor(Cursor): """ Unbuffered Cursor, mainly useful for queries that return a lot of data, or for connections to remote servers over a slow network. Instead of copying every row of data into a buffer, this will fetch rows as needed. The upside of this, is the client uses much less memory, and rows are returned much faster when traveling over a slow network, or if the result set is very big. There are limitations, though. The MySQL protocol doesn't support returning the total number of rows, so the only way to tell how many rows there are is to iterate over every row returned. Also, it currently isn't possible to scroll backwards, as only the current row is held in memory. """ def close(self): conn = self._get_db() conn._result._finish_unbuffered_query() try: if self._has_next: while self.nextset(): pass except: pass def _query(self, q): conn = self._get_db() self._last_executed = q conn.query(q, unbuffered=True) self._do_get_result() return self.rowcount def read_next(self): """ Read next row """ conn = self._get_db() conn._result._read_rowdata_packet_unbuffered() return conn._result.rows def fetchone(self): """ Fetch next row """ self._check_executed() row = self.read_next() if row is None: return None self.rownumber += 1 return row def fetchall(self): """ Fetch all, as per MySQLdb. Pretty useless for large queries, as it is buffered. See fetchall_unbuffered(), if you want an unbuffered generator version of this method. """ rows = [] while True: row = self.fetchone() if row is None: break rows.append(row) return tuple(rows) def fetchall_unbuffered(self): """ Fetch all, implemented as a generator, which isn't to standard, however, it doesn't make sense to return everything in a list, as that would use ridiculous memory for large result sets. """ row = self.fetchone() while row is not None: yield row row = self.fetchone() def fetchmany(self, size=None): """ Fetch many """ self._check_executed() if size is None: size = self.arraysize rows = [] for i in range(0, size): row = self.read_next() if row is None: break rows.append(row) self.rownumber += 1 return tuple(rows) def scroll(self, value, mode='relative'): self._check_executed() if not mode == 'relative' and not mode == 'absolute': self.errorhandler(self, ProgrammingError, "unknown scroll mode %s" % mode) if mode == 'relative': if value < 0: self.errorhandler(self, NotSupportedError, "Backwards scrolling not supported by this cursor") for i in range(0, value): self.read_next() self.rownumber += value else: if value < self.rownumber: self.errorhandler(self, NotSupportedError, "Backwards scrolling not supported by this cursor") end = value - self.rownumber for i in range(0, end): self.read_next() self.rownumber = value web2py-2.12.3.orig/gluon/contrib/pymysql/constants/0000775000000000000000000000000012564727262021001 5ustar rootrootweb2py-2.12.3.orig/gluon/contrib/pymysql/constants/ER.py0000664000000000000000000002767712564727262021704 0ustar rootroot ERROR_FIRST = 1000 HASHCHK = 1000 NISAMCHK = 1001 NO = 1002 YES = 1003 CANT_CREATE_FILE = 1004 CANT_CREATE_TABLE = 1005 CANT_CREATE_DB = 1006 DB_CREATE_EXISTS = 1007 DB_DROP_EXISTS = 1008 DB_DROP_DELETE = 1009 DB_DROP_RMDIR = 1010 CANT_DELETE_FILE = 1011 CANT_FIND_SYSTEM_REC = 1012 CANT_GET_STAT = 1013 CANT_GET_WD = 1014 CANT_LOCK = 1015 CANT_OPEN_FILE = 1016 FILE_NOT_FOUND = 1017 CANT_READ_DIR = 1018 CANT_SET_WD = 1019 CHECKREAD = 1020 DISK_FULL = 1021 DUP_KEY = 1022 ERROR_ON_CLOSE = 1023 ERROR_ON_READ = 1024 ERROR_ON_RENAME = 1025 ERROR_ON_WRITE = 1026 FILE_USED = 1027 FILSORT_ABORT = 1028 FORM_NOT_FOUND = 1029 GET_ERRNO = 1030 ILLEGAL_HA = 1031 KEY_NOT_FOUND = 1032 NOT_FORM_FILE = 1033 NOT_KEYFILE = 1034 OLD_KEYFILE = 1035 OPEN_AS_READONLY = 1036 OUTOFMEMORY = 1037 OUT_OF_SORTMEMORY = 1038 UNEXPECTED_EOF = 1039 CON_COUNT_ERROR = 1040 OUT_OF_RESOURCES = 1041 BAD_HOST_ERROR = 1042 HANDSHAKE_ERROR = 1043 DBACCESS_DENIED_ERROR = 1044 ACCESS_DENIED_ERROR = 1045 NO_DB_ERROR = 1046 UNKNOWN_COM_ERROR = 1047 BAD_NULL_ERROR = 1048 BAD_DB_ERROR = 1049 TABLE_EXISTS_ERROR = 1050 BAD_TABLE_ERROR = 1051 NON_UNIQ_ERROR = 1052 SERVER_SHUTDOWN = 1053 BAD_FIELD_ERROR = 1054 WRONG_FIELD_WITH_GROUP = 1055 WRONG_GROUP_FIELD = 1056 WRONG_SUM_SELECT = 1057 WRONG_VALUE_COUNT = 1058 TOO_LONG_IDENT = 1059 DUP_FIELDNAME = 1060 DUP_KEYNAME = 1061 DUP_ENTRY = 1062 WRONG_FIELD_SPEC = 1063 PARSE_ERROR = 1064 EMPTY_QUERY = 1065 NONUNIQ_TABLE = 1066 INVALID_DEFAULT = 1067 MULTIPLE_PRI_KEY = 1068 TOO_MANY_KEYS = 1069 TOO_MANY_KEY_PARTS = 1070 TOO_LONG_KEY = 1071 KEY_COLUMN_DOES_NOT_EXITS = 1072 BLOB_USED_AS_KEY = 1073 TOO_BIG_FIELDLENGTH = 1074 WRONG_AUTO_KEY = 1075 READY = 1076 NORMAL_SHUTDOWN = 1077 GOT_SIGNAL = 1078 SHUTDOWN_COMPLETE = 1079 FORCING_CLOSE = 1080 IPSOCK_ERROR = 1081 NO_SUCH_INDEX = 1082 WRONG_FIELD_TERMINATORS = 1083 BLOBS_AND_NO_TERMINATED = 1084 TEXTFILE_NOT_READABLE = 1085 FILE_EXISTS_ERROR = 1086 LOAD_INFO = 1087 ALTER_INFO = 1088 WRONG_SUB_KEY = 1089 CANT_REMOVE_ALL_FIELDS = 1090 CANT_DROP_FIELD_OR_KEY = 1091 INSERT_INFO = 1092 UPDATE_TABLE_USED = 1093 NO_SUCH_THREAD = 1094 KILL_DENIED_ERROR = 1095 NO_TABLES_USED = 1096 TOO_BIG_SET = 1097 NO_UNIQUE_LOGFILE = 1098 TABLE_NOT_LOCKED_FOR_WRITE = 1099 TABLE_NOT_LOCKED = 1100 BLOB_CANT_HAVE_DEFAULT = 1101 WRONG_DB_NAME = 1102 WRONG_TABLE_NAME = 1103 TOO_BIG_SELECT = 1104 UNKNOWN_ERROR = 1105 UNKNOWN_PROCEDURE = 1106 WRONG_PARAMCOUNT_TO_PROCEDURE = 1107 WRONG_PARAMETERS_TO_PROCEDURE = 1108 UNKNOWN_TABLE = 1109 FIELD_SPECIFIED_TWICE = 1110 INVALID_GROUP_FUNC_USE = 1111 UNSUPPORTED_EXTENSION = 1112 TABLE_MUST_HAVE_COLUMNS = 1113 RECORD_FILE_FULL = 1114 UNKNOWN_CHARACTER_SET = 1115 TOO_MANY_TABLES = 1116 TOO_MANY_FIELDS = 1117 TOO_BIG_ROWSIZE = 1118 STACK_OVERRUN = 1119 WRONG_OUTER_JOIN = 1120 NULL_COLUMN_IN_INDEX = 1121 CANT_FIND_UDF = 1122 CANT_INITIALIZE_UDF = 1123 UDF_NO_PATHS = 1124 UDF_EXISTS = 1125 CANT_OPEN_LIBRARY = 1126 CANT_FIND_DL_ENTRY = 1127 FUNCTION_NOT_DEFINED = 1128 HOST_IS_BLOCKED = 1129 HOST_NOT_PRIVILEGED = 1130 PASSWORD_ANONYMOUS_USER = 1131 PASSWORD_NOT_ALLOWED = 1132 PASSWORD_NO_MATCH = 1133 UPDATE_INFO = 1134 CANT_CREATE_THREAD = 1135 WRONG_VALUE_COUNT_ON_ROW = 1136 CANT_REOPEN_TABLE = 1137 INVALID_USE_OF_NULL = 1138 REGEXP_ERROR = 1139 MIX_OF_GROUP_FUNC_AND_FIELDS = 1140 NONEXISTING_GRANT = 1141 TABLEACCESS_DENIED_ERROR = 1142 COLUMNACCESS_DENIED_ERROR = 1143 ILLEGAL_GRANT_FOR_TABLE = 1144 GRANT_WRONG_HOST_OR_USER = 1145 NO_SUCH_TABLE = 1146 NONEXISTING_TABLE_GRANT = 1147 NOT_ALLOWED_COMMAND = 1148 SYNTAX_ERROR = 1149 DELAYED_CANT_CHANGE_LOCK = 1150 TOO_MANY_DELAYED_THREADS = 1151 ABORTING_CONNECTION = 1152 NET_PACKET_TOO_LARGE = 1153 NET_READ_ERROR_FROM_PIPE = 1154 NET_FCNTL_ERROR = 1155 NET_PACKETS_OUT_OF_ORDER = 1156 NET_UNCOMPRESS_ERROR = 1157 NET_READ_ERROR = 1158 NET_READ_INTERRUPTED = 1159 NET_ERROR_ON_WRITE = 1160 NET_WRITE_INTERRUPTED = 1161 TOO_LONG_STRING = 1162 TABLE_CANT_HANDLE_BLOB = 1163 TABLE_CANT_HANDLE_AUTO_INCREMENT = 1164 DELAYED_INSERT_TABLE_LOCKED = 1165 WRONG_COLUMN_NAME = 1166 WRONG_KEY_COLUMN = 1167 WRONG_MRG_TABLE = 1168 DUP_UNIQUE = 1169 BLOB_KEY_WITHOUT_LENGTH = 1170 PRIMARY_CANT_HAVE_NULL = 1171 TOO_MANY_ROWS = 1172 REQUIRES_PRIMARY_KEY = 1173 NO_RAID_COMPILED = 1174 UPDATE_WITHOUT_KEY_IN_SAFE_MODE = 1175 KEY_DOES_NOT_EXITS = 1176 CHECK_NO_SUCH_TABLE = 1177 CHECK_NOT_IMPLEMENTED = 1178 CANT_DO_THIS_DURING_AN_TRANSACTION = 1179 ERROR_DURING_COMMIT = 1180 ERROR_DURING_ROLLBACK = 1181 ERROR_DURING_FLUSH_LOGS = 1182 ERROR_DURING_CHECKPOINT = 1183 NEW_ABORTING_CONNECTION = 1184 DUMP_NOT_IMPLEMENTED = 1185 FLUSH_MASTER_BINLOG_CLOSED = 1186 INDEX_REBUILD = 1187 MASTER = 1188 MASTER_NET_READ = 1189 MASTER_NET_WRITE = 1190 FT_MATCHING_KEY_NOT_FOUND = 1191 LOCK_OR_ACTIVE_TRANSACTION = 1192 UNKNOWN_SYSTEM_VARIABLE = 1193 CRASHED_ON_USAGE = 1194 CRASHED_ON_REPAIR = 1195 WARNING_NOT_COMPLETE_ROLLBACK = 1196 TRANS_CACHE_FULL = 1197 SLAVE_MUST_STOP = 1198 SLAVE_NOT_RUNNING = 1199 BAD_SLAVE = 1200 MASTER_INFO = 1201 SLAVE_THREAD = 1202 TOO_MANY_USER_CONNECTIONS = 1203 SET_CONSTANTS_ONLY = 1204 LOCK_WAIT_TIMEOUT = 1205 LOCK_TABLE_FULL = 1206 READ_ONLY_TRANSACTION = 1207 DROP_DB_WITH_READ_LOCK = 1208 CREATE_DB_WITH_READ_LOCK = 1209 WRONG_ARGUMENTS = 1210 NO_PERMISSION_TO_CREATE_USER = 1211 UNION_TABLES_IN_DIFFERENT_DIR = 1212 LOCK_DEADLOCK = 1213 TABLE_CANT_HANDLE_FT = 1214 CANNOT_ADD_FOREIGN = 1215 NO_REFERENCED_ROW = 1216 ROW_IS_REFERENCED = 1217 CONNECT_TO_MASTER = 1218 QUERY_ON_MASTER = 1219 ERROR_WHEN_EXECUTING_COMMAND = 1220 WRONG_USAGE = 1221 WRONG_NUMBER_OF_COLUMNS_IN_SELECT = 1222 CANT_UPDATE_WITH_READLOCK = 1223 MIXING_NOT_ALLOWED = 1224 DUP_ARGUMENT = 1225 USER_LIMIT_REACHED = 1226 SPECIFIC_ACCESS_DENIED_ERROR = 1227 LOCAL_VARIABLE = 1228 GLOBAL_VARIABLE = 1229 NO_DEFAULT = 1230 WRONG_VALUE_FOR_VAR = 1231 WRONG_TYPE_FOR_VAR = 1232 VAR_CANT_BE_READ = 1233 CANT_USE_OPTION_HERE = 1234 NOT_SUPPORTED_YET = 1235 MASTER_FATAL_ERROR_READING_BINLOG = 1236 SLAVE_IGNORED_TABLE = 1237 INCORRECT_GLOBAL_LOCAL_VAR = 1238 WRONG_FK_DEF = 1239 KEY_REF_DO_NOT_MATCH_TABLE_REF = 1240 OPERAND_COLUMNS = 1241 SUBQUERY_NO_1_ROW = 1242 UNKNOWN_STMT_HANDLER = 1243 CORRUPT_HELP_DB = 1244 CYCLIC_REFERENCE = 1245 AUTO_CONVERT = 1246 ILLEGAL_REFERENCE = 1247 DERIVED_MUST_HAVE_ALIAS = 1248 SELECT_REDUCED = 1249 TABLENAME_NOT_ALLOWED_HERE = 1250 NOT_SUPPORTED_AUTH_MODE = 1251 SPATIAL_CANT_HAVE_NULL = 1252 COLLATION_CHARSET_MISMATCH = 1253 SLAVE_WAS_RUNNING = 1254 SLAVE_WAS_NOT_RUNNING = 1255 TOO_BIG_FOR_UNCOMPRESS = 1256 ZLIB_Z_MEM_ERROR = 1257 ZLIB_Z_BUF_ERROR = 1258 ZLIB_Z_DATA_ERROR = 1259 CUT_VALUE_GROUP_CONCAT = 1260 WARN_TOO_FEW_RECORDS = 1261 WARN_TOO_MANY_RECORDS = 1262 WARN_NULL_TO_NOTNULL = 1263 WARN_DATA_OUT_OF_RANGE = 1264 WARN_DATA_TRUNCATED = 1265 WARN_USING_OTHER_HANDLER = 1266 CANT_AGGREGATE_2COLLATIONS = 1267 DROP_USER = 1268 REVOKE_GRANTS = 1269 CANT_AGGREGATE_3COLLATIONS = 1270 CANT_AGGREGATE_NCOLLATIONS = 1271 VARIABLE_IS_NOT_STRUCT = 1272 UNKNOWN_COLLATION = 1273 SLAVE_IGNORED_SSL_PARAMS = 1274 SERVER_IS_IN_SECURE_AUTH_MODE = 1275 WARN_FIELD_RESOLVED = 1276 BAD_SLAVE_UNTIL_COND = 1277 MISSING_SKIP_SLAVE = 1278 UNTIL_COND_IGNORED = 1279 WRONG_NAME_FOR_INDEX = 1280 WRONG_NAME_FOR_CATALOG = 1281 WARN_QC_RESIZE = 1282 BAD_FT_COLUMN = 1283 UNKNOWN_KEY_CACHE = 1284 WARN_HOSTNAME_WONT_WORK = 1285 UNKNOWN_STORAGE_ENGINE = 1286 WARN_DEPRECATED_SYNTAX = 1287 NON_UPDATABLE_TABLE = 1288 FEATURE_DISABLED = 1289 OPTION_PREVENTS_STATEMENT = 1290 DUPLICATED_VALUE_IN_TYPE = 1291 TRUNCATED_WRONG_VALUE = 1292 TOO_MUCH_AUTO_TIMESTAMP_COLS = 1293 INVALID_ON_UPDATE = 1294 UNSUPPORTED_PS = 1295 GET_ERRMSG = 1296 GET_TEMPORARY_ERRMSG = 1297 UNKNOWN_TIME_ZONE = 1298 WARN_INVALID_TIMESTAMP = 1299 INVALID_CHARACTER_STRING = 1300 WARN_ALLOWED_PACKET_OVERFLOWED = 1301 CONFLICTING_DECLARATIONS = 1302 SP_NO_RECURSIVE_CREATE = 1303 SP_ALREADY_EXISTS = 1304 SP_DOES_NOT_EXIST = 1305 SP_DROP_FAILED = 1306 SP_STORE_FAILED = 1307 SP_LILABEL_MISMATCH = 1308 SP_LABEL_REDEFINE = 1309 SP_LABEL_MISMATCH = 1310 SP_UNINIT_VAR = 1311 SP_BADSELECT = 1312 SP_BADRETURN = 1313 SP_BADSTATEMENT = 1314 UPDATE_LOG_DEPRECATED_IGNORED = 1315 UPDATE_LOG_DEPRECATED_TRANSLATED = 1316 QUERY_INTERRUPTED = 1317 SP_WRONG_NO_OF_ARGS = 1318 SP_COND_MISMATCH = 1319 SP_NORETURN = 1320 SP_NORETURNEND = 1321 SP_BAD_CURSOR_QUERY = 1322 SP_BAD_CURSOR_SELECT = 1323 SP_CURSOR_MISMATCH = 1324 SP_CURSOR_ALREADY_OPEN = 1325 SP_CURSOR_NOT_OPEN = 1326 SP_UNDECLARED_VAR = 1327 SP_WRONG_NO_OF_FETCH_ARGS = 1328 SP_FETCH_NO_DATA = 1329 SP_DUP_PARAM = 1330 SP_DUP_VAR = 1331 SP_DUP_COND = 1332 SP_DUP_CURS = 1333 SP_CANT_ALTER = 1334 SP_SUBSELECT_NYI = 1335 STMT_NOT_ALLOWED_IN_SF_OR_TRG = 1336 SP_VARCOND_AFTER_CURSHNDLR = 1337 SP_CURSOR_AFTER_HANDLER = 1338 SP_CASE_NOT_FOUND = 1339 FPARSER_TOO_BIG_FILE = 1340 FPARSER_BAD_HEADER = 1341 FPARSER_EOF_IN_COMMENT = 1342 FPARSER_ERROR_IN_PARAMETER = 1343 FPARSER_EOF_IN_UNKNOWN_PARAMETER = 1344 VIEW_NO_EXPLAIN = 1345 FRM_UNKNOWN_TYPE = 1346 WRONG_OBJECT = 1347 NONUPDATEABLE_COLUMN = 1348 VIEW_SELECT_DERIVED = 1349 VIEW_SELECT_CLAUSE = 1350 VIEW_SELECT_VARIABLE = 1351 VIEW_SELECT_TMPTABLE = 1352 VIEW_WRONG_LIST = 1353 WARN_VIEW_MERGE = 1354 WARN_VIEW_WITHOUT_KEY = 1355 VIEW_INVALID = 1356 SP_NO_DROP_SP = 1357 SP_GOTO_IN_HNDLR = 1358 TRG_ALREADY_EXISTS = 1359 TRG_DOES_NOT_EXIST = 1360 TRG_ON_VIEW_OR_TEMP_TABLE = 1361 TRG_CANT_CHANGE_ROW = 1362 TRG_NO_SUCH_ROW_IN_TRG = 1363 NO_DEFAULT_FOR_FIELD = 1364 DIVISION_BY_ZERO = 1365 TRUNCATED_WRONG_VALUE_FOR_FIELD = 1366 ILLEGAL_VALUE_FOR_TYPE = 1367 VIEW_NONUPD_CHECK = 1368 VIEW_CHECK_FAILED = 1369 PROCACCESS_DENIED_ERROR = 1370 RELAY_LOG_FAIL = 1371 PASSWD_LENGTH = 1372 UNKNOWN_TARGET_BINLOG = 1373 IO_ERR_LOG_INDEX_READ = 1374 BINLOG_PURGE_PROHIBITED = 1375 FSEEK_FAIL = 1376 BINLOG_PURGE_FATAL_ERR = 1377 LOG_IN_USE = 1378 LOG_PURGE_UNKNOWN_ERR = 1379 RELAY_LOG_INIT = 1380 NO_BINARY_LOGGING = 1381 RESERVED_SYNTAX = 1382 WSAS_FAILED = 1383 DIFF_GROUPS_PROC = 1384 NO_GROUP_FOR_PROC = 1385 ORDER_WITH_PROC = 1386 LOGGING_PROHIBIT_CHANGING_OF = 1387 NO_FILE_MAPPING = 1388 WRONG_MAGIC = 1389 PS_MANY_PARAM = 1390 KEY_PART_0 = 1391 VIEW_CHECKSUM = 1392 VIEW_MULTIUPDATE = 1393 VIEW_NO_INSERT_FIELD_LIST = 1394 VIEW_DELETE_MERGE_VIEW = 1395 CANNOT_USER = 1396 XAER_NOTA = 1397 XAER_INVAL = 1398 XAER_RMFAIL = 1399 XAER_OUTSIDE = 1400 XAER_RMERR = 1401 XA_RBROLLBACK = 1402 NONEXISTING_PROC_GRANT = 1403 PROC_AUTO_GRANT_FAIL = 1404 PROC_AUTO_REVOKE_FAIL = 1405 DATA_TOO_LONG = 1406 SP_BAD_SQLSTATE = 1407 STARTUP = 1408 LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR = 1409 CANT_CREATE_USER_WITH_GRANT = 1410 WRONG_VALUE_FOR_TYPE = 1411 TABLE_DEF_CHANGED = 1412 SP_DUP_HANDLER = 1413 SP_NOT_VAR_ARG = 1414 SP_NO_RETSET = 1415 CANT_CREATE_GEOMETRY_OBJECT = 1416 FAILED_ROUTINE_BREAK_BINLOG = 1417 BINLOG_UNSAFE_ROUTINE = 1418 BINLOG_CREATE_ROUTINE_NEED_SUPER = 1419 EXEC_STMT_WITH_OPEN_CURSOR = 1420 STMT_HAS_NO_OPEN_CURSOR = 1421 COMMIT_NOT_ALLOWED_IN_SF_OR_TRG = 1422 NO_DEFAULT_FOR_VIEW_FIELD = 1423 SP_NO_RECURSION = 1424 TOO_BIG_SCALE = 1425 TOO_BIG_PRECISION = 1426 M_BIGGER_THAN_D = 1427 WRONG_LOCK_OF_SYSTEM_TABLE = 1428 CONNECT_TO_FOREIGN_DATA_SOURCE = 1429 QUERY_ON_FOREIGN_DATA_SOURCE = 1430 FOREIGN_DATA_SOURCE_DOESNT_EXIST = 1431 FOREIGN_DATA_STRING_INVALID_CANT_CREATE = 1432 FOREIGN_DATA_STRING_INVALID = 1433 CANT_CREATE_FEDERATED_TABLE = 1434 TRG_IN_WRONG_SCHEMA = 1435 STACK_OVERRUN_NEED_MORE = 1436 TOO_LONG_BODY = 1437 WARN_CANT_DROP_DEFAULT_KEYCACHE = 1438 TOO_BIG_DISPLAYWIDTH = 1439 XAER_DUPID = 1440 DATETIME_FUNCTION_OVERFLOW = 1441 CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG = 1442 VIEW_PREVENT_UPDATE = 1443 PS_NO_RECURSION = 1444 SP_CANT_SET_AUTOCOMMIT = 1445 MALFORMED_DEFINER = 1446 VIEW_FRM_NO_USER = 1447 VIEW_OTHER_USER = 1448 NO_SUCH_USER = 1449 FORBID_SCHEMA_CHANGE = 1450 ROW_IS_REFERENCED_2 = 1451 NO_REFERENCED_ROW_2 = 1452 SP_BAD_VAR_SHADOW = 1453 TRG_NO_DEFINER = 1454 OLD_FILE_FORMAT = 1455 SP_RECURSION_LIMIT = 1456 SP_PROC_TABLE_CORRUPT = 1457 SP_WRONG_NAME = 1458 TABLE_NEEDS_UPGRADE = 1459 SP_NO_AGGREGATE = 1460 MAX_PREPARED_STMT_COUNT_REACHED = 1461 VIEW_RECURSIVE = 1462 NON_GROUPING_FIELD_USED = 1463 TABLE_CANT_HANDLE_SPKEYS = 1464 NO_TRIGGERS_ON_SYSTEM_SCHEMA = 1465 USERNAME = 1466 HOSTNAME = 1467 WRONG_STRING_LENGTH = 1468 ERROR_LAST = 1468 web2py-2.12.3.orig/gluon/contrib/pymysql/constants/CLIENT.py0000664000000000000000000000070312564727262022331 0ustar rootroot LONG_PASSWORD = 1 FOUND_ROWS = 1 << 1 LONG_FLAG = 1 << 2 CONNECT_WITH_DB = 1 << 3 NO_SCHEMA = 1 << 4 COMPRESS = 1 << 5 ODBC = 1 << 6 LOCAL_FILES = 1 << 7 IGNORE_SPACE = 1 << 8 PROTOCOL_41 = 1 << 9 INTERACTIVE = 1 << 10 SSL = 1 << 11 IGNORE_SIGPIPE = 1 << 12 TRANSACTIONS = 1 << 13 SECURE_CONNECTION = 1 << 15 MULTI_STATEMENTS = 1 << 16 MULTI_RESULTS = 1 << 17 CAPABILITIES = LONG_PASSWORD|LONG_FLAG|TRANSACTIONS| \ PROTOCOL_41|SECURE_CONNECTION web2py-2.12.3.orig/gluon/contrib/pymysql/constants/SERVER_STATUS.py0000664000000000000000000000051712564727262023467 0ustar rootroot SERVER_STATUS_IN_TRANS = 1 SERVER_STATUS_AUTOCOMMIT = 2 SERVER_MORE_RESULTS_EXISTS = 8 SERVER_QUERY_NO_GOOD_INDEX_USED = 16 SERVER_QUERY_NO_INDEX_USED = 32 SERVER_STATUS_CURSOR_EXISTS = 64 SERVER_STATUS_LAST_ROW_SENT = 128 SERVER_STATUS_DB_DROPPED = 256 SERVER_STATUS_NO_BACKSLASH_ESCAPES = 512 SERVER_STATUS_METADATA_CHANGED = 1024 web2py-2.12.3.orig/gluon/contrib/pymysql/constants/__init__.py0000664000000000000000000000000012564727262023100 0ustar rootrootweb2py-2.12.3.orig/gluon/contrib/pymysql/constants/FLAG.py0000664000000000000000000000032612564727262022065 0ustar rootrootNOT_NULL = 1 PRI_KEY = 2 UNIQUE_KEY = 4 MULTIPLE_KEY = 8 BLOB = 16 UNSIGNED = 32 ZEROFILL = 64 BINARY = 128 ENUM = 256 AUTO_INCREMENT = 512 TIMESTAMP = 1024 SET = 2048 PART_KEY = 16384 GROUP = 32767 UNIQUE = 65536 web2py-2.12.3.orig/gluon/contrib/pymysql/constants/COMMAND.py0000664000000000000000000000070412564727262022432 0ustar rootroot COM_SLEEP = 0x00 COM_QUIT = 0x01 COM_INIT_DB = 0x02 COM_QUERY = 0x03 COM_FIELD_LIST = 0x04 COM_CREATE_DB = 0x05 COM_DROP_DB = 0x06 COM_REFRESH = 0x07 COM_SHUTDOWN = 0x08 COM_STATISTICS = 0x09 COM_PROCESS_INFO = 0x0a COM_CONNECT = 0x0b COM_PROCESS_KILL = 0x0c COM_DEBUG = 0x0d COM_PING = 0x0e COM_TIME = 0x0f COM_DELAYED_INSERT = 0x10 COM_CHANGE_USER = 0x11 COM_BINLOG_DUMP = 0x12 COM_TABLE_DUMP = 0x13 COM_CONNECT_OUT = 0x14 COM_REGISTER_SLAVE = 0x15 web2py-2.12.3.orig/gluon/contrib/pymysql/constants/FIELD_TYPE.py0000664000000000000000000000055112564727262023040 0ustar rootroot DECIMAL = 0 TINY = 1 SHORT = 2 LONG = 3 FLOAT = 4 DOUBLE = 5 NULL = 6 TIMESTAMP = 7 LONGLONG = 8 INT24 = 9 DATE = 10 TIME = 11 DATETIME = 12 YEAR = 13 NEWDATE = 14 VARCHAR = 15 BIT = 16 NEWDECIMAL = 246 ENUM = 247 SET = 248 TINY_BLOB = 249 MEDIUM_BLOB = 250 LONG_BLOB = 251 BLOB = 252 VAR_STRING = 253 STRING = 254 GEOMETRY = 255 CHAR = TINY INTERVAL = ENUM web2py-2.12.3.orig/gluon/contrib/pymysql/tests/0000775000000000000000000000000012564727262020127 5ustar rootrootweb2py-2.12.3.orig/gluon/contrib/pymysql/tests/test_issues.py0000664000000000000000000002446612564727262023067 0ustar rootrootimport pymysql from pymysql.tests import base import unittest import sys try: import imp reload = imp.reload except AttributeError: pass import datetime # backwards compatibility: if not hasattr(unittest, "skip"): unittest.skip = lambda message: lambda f: f class TestOldIssues(base.PyMySQLTestCase): def test_issue_3(self): """ undefined methods datetime_or_None, date_or_None """ conn = self.connections[0] c = conn.cursor() c.execute("create table issue3 (d date, t time, dt datetime, ts timestamp)") try: c.execute("insert into issue3 (d, t, dt, ts) values (%s,%s,%s,%s)", (None, None, None, None)) c.execute("select d from issue3") self.assertEqual(None, c.fetchone()[0]) c.execute("select t from issue3") self.assertEqual(None, c.fetchone()[0]) c.execute("select dt from issue3") self.assertEqual(None, c.fetchone()[0]) c.execute("select ts from issue3") self.assertTrue(isinstance(c.fetchone()[0], datetime.datetime)) finally: c.execute("drop table issue3") def test_issue_4(self): """ can't retrieve TIMESTAMP fields """ conn = self.connections[0] c = conn.cursor() c.execute("create table issue4 (ts timestamp)") try: c.execute("insert into issue4 (ts) values (now())") c.execute("select ts from issue4") self.assertTrue(isinstance(c.fetchone()[0], datetime.datetime)) finally: c.execute("drop table issue4") def test_issue_5(self): """ query on information_schema.tables fails """ con = self.connections[0] cur = con.cursor() cur.execute("select * from information_schema.tables") def test_issue_6(self): """ exception: TypeError: ord() expected a character, but string of length 0 found """ conn = pymysql.connect(host="localhost",user="root",passwd="",db="mysql") c = conn.cursor() c.execute("select * from user") conn.close() def test_issue_8(self): """ Primary Key and Index error when selecting data """ conn = self.connections[0] c = conn.cursor() c.execute("""CREATE TABLE `test` (`station` int(10) NOT NULL DEFAULT '0', `dh` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `echeance` int(1) NOT NULL DEFAULT '0', `me` double DEFAULT NULL, `mo` double DEFAULT NULL, PRIMARY KEY (`station`,`dh`,`echeance`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;""") try: self.assertEqual(0, c.execute("SELECT * FROM test")) c.execute("ALTER TABLE `test` ADD INDEX `idx_station` (`station`)") self.assertEqual(0, c.execute("SELECT * FROM test")) finally: c.execute("drop table test") def test_issue_9(self): """ sets DeprecationWarning in Python 2.6 """ try: reload(pymysql) except DeprecationWarning: self.fail() def test_issue_10(self): """ Allocate a variable to return when the exception handler is permissive """ conn = self.connections[0] conn.errorhandler = lambda cursor, errorclass, errorvalue: None cur = conn.cursor() cur.execute( "create table t( n int )" ) cur.execute( "create table t( n int )" ) def test_issue_13(self): """ can't handle large result fields """ conn = self.connections[0] cur = conn.cursor() try: cur.execute("create table issue13 (t text)") # ticket says 18k size = 18*1024 cur.execute("insert into issue13 (t) values (%s)", ("x" * size,)) cur.execute("select t from issue13") # use assertTrue so that obscenely huge error messages don't print r = cur.fetchone()[0] self.assertTrue("x" * size == r) finally: cur.execute("drop table issue13") def test_issue_14(self): """ typo in converters.py """ self.assertEqual('1', pymysql.converters.escape_item(1, "utf8")) self.assertEqual('1', pymysql.converters.escape_item(1L, "utf8")) self.assertEqual('1', pymysql.converters.escape_object(1)) self.assertEqual('1', pymysql.converters.escape_object(1L)) def test_issue_15(self): """ query should be expanded before perform character encoding """ conn = self.connections[0] c = conn.cursor() c.execute("create table issue15 (t varchar(32))") try: c.execute("insert into issue15 (t) values (%s)", (u'\xe4\xf6\xfc',)) c.execute("select t from issue15") self.assertEqual(u'\xe4\xf6\xfc', c.fetchone()[0]) finally: c.execute("drop table issue15") def test_issue_16(self): """ Patch for string and tuple escaping """ conn = self.connections[0] c = conn.cursor() c.execute("create table issue16 (name varchar(32) primary key, email varchar(32))") try: c.execute("insert into issue16 (name, email) values ('pete', 'floydophone')") c.execute("select email from issue16 where name=%s", ("pete",)) self.assertEqual("floydophone", c.fetchone()[0]) finally: c.execute("drop table issue16") @unittest.skip("test_issue_17() requires a custom, legacy MySQL configuration and will not be run.") def test_issue_17(self): """ could not connect mysql use passwod """ conn = self.connections[0] host = self.databases[0]["host"] db = self.databases[0]["db"] c = conn.cursor() # grant access to a table to a user with a password try: c.execute("create table issue17 (x varchar(32) primary key)") c.execute("insert into issue17 (x) values ('hello, world!')") c.execute("grant all privileges on %s.issue17 to 'issue17user'@'%%' identified by '1234'" % db) conn.commit() conn2 = pymysql.connect(host=host, user="issue17user", passwd="1234", db=db) c2 = conn2.cursor() c2.execute("select x from issue17") self.assertEqual("hello, world!", c2.fetchone()[0]) finally: c.execute("drop table issue17") def _uni(s, e): # hack for py3 if sys.version_info[0] > 2: return unicode(bytes(s, sys.getdefaultencoding()), e) else: return unicode(s, e) class TestNewIssues(base.PyMySQLTestCase): def test_issue_34(self): try: pymysql.connect(host="localhost", port=1237, user="root") self.fail() except pymysql.OperationalError, e: self.assertEqual(2003, e.args[0]) except: self.fail() def test_issue_33(self): conn = pymysql.connect(host="localhost", user="root", db=self.databases[0]["db"], charset="utf8") c = conn.cursor() try: c.execute(_uni("create table hei\xc3\x9fe (name varchar(32))", "utf8")) c.execute(_uni("insert into hei\xc3\x9fe (name) values ('Pi\xc3\xb1ata')", "utf8")) c.execute(_uni("select name from hei\xc3\x9fe", "utf8")) self.assertEqual(_uni("Pi\xc3\xb1ata","utf8"), c.fetchone()[0]) finally: c.execute(_uni("drop table hei\xc3\x9fe", "utf8")) @unittest.skip("This test requires manual intervention") def test_issue_35(self): conn = self.connections[0] c = conn.cursor() print "sudo killall -9 mysqld within the next 10 seconds" try: c.execute("select sleep(10)") self.fail() except pymysql.OperationalError, e: self.assertEqual(2013, e.args[0]) def test_issue_36(self): conn = self.connections[0] c = conn.cursor() # kill connections[0] c.execute("show processlist") kill_id = None for id,user,host,db,command,time,state,info in c.fetchall(): if info == "show processlist": kill_id = id break # now nuke the connection conn.kill(kill_id) # make sure this connection has broken try: c.execute("show tables") self.fail() except: pass # check the process list from the other connection try: c = self.connections[1].cursor() c.execute("show processlist") ids = [row[0] for row in c.fetchall()] self.assertFalse(kill_id in ids) finally: del self.connections[0] def test_issue_37(self): conn = self.connections[0] c = conn.cursor() self.assertEqual(1, c.execute("SELECT @foo")) self.assertEqual((None,), c.fetchone()) self.assertEqual(0, c.execute("SET @foo = 'bar'")) c.execute("set @foo = 'bar'") def test_issue_38(self): conn = self.connections[0] c = conn.cursor() datum = "a" * 1024 * 1023 # reduced size for most default mysql installs try: c.execute("create table issue38 (id integer, data mediumblob)") c.execute("insert into issue38 values (1, %s)", (datum,)) finally: c.execute("drop table issue38") def disabled_test_issue_54(self): conn = self.connections[0] c = conn.cursor() big_sql = "select * from issue54 where " big_sql += " and ".join("%d=%d" % (i,i) for i in xrange(0, 100000)) try: c.execute("create table issue54 (id integer primary key)") c.execute("insert into issue54 (id) values (7)") c.execute(big_sql) self.assertEqual(7, c.fetchone()[0]) finally: c.execute("drop table issue54") class TestGitHubIssues(base.PyMySQLTestCase): def test_issue_66(self): conn = self.connections[0] c = conn.cursor() self.assertEqual(0, conn.insert_id()) try: c.execute("create table issue66 (id integer primary key auto_increment, x integer)") c.execute("insert into issue66 (x) values (1)") c.execute("insert into issue66 (x) values (1)") self.assertEqual(2, conn.insert_id()) finally: c.execute("drop table issue66") __all__ = ["TestOldIssues", "TestNewIssues", "TestGitHubIssues"] if __name__ == "__main__": import unittest unittest.main() web2py-2.12.3.orig/gluon/contrib/pymysql/tests/test_SSCursor.py0000775000000000000000000000707112564727262023273 0ustar rootrootimport sys try: from pymysql.tests import base import pymysql.cursors except: # For local testing from top-level directory, without installing sys.path.append('../pymysql') from pymysql.tests import base import pymysql.cursors class TestSSCursor(base.PyMySQLTestCase): def test_SSCursor(self): affected_rows = 18446744073709551615 conn = self.connections[0] data = [ ('America', '', 'America/Jamaica'), ('America', '', 'America/Los_Angeles'), ('America', '', 'America/Lima'), ('America', '', 'America/New_York'), ('America', '', 'America/Menominee'), ('America', '', 'America/Havana'), ('America', '', 'America/El_Salvador'), ('America', '', 'America/Costa_Rica'), ('America', '', 'America/Denver'), ('America', '', 'America/Detroit'),] try: cursor = conn.cursor(pymysql.cursors.SSCursor) # Create table cursor.execute(('CREATE TABLE tz_data (' 'region VARCHAR(64),' 'zone VARCHAR(64),' 'name VARCHAR(64))')) # Test INSERT for i in data: cursor.execute('INSERT INTO tz_data VALUES (%s, %s, %s)', i) self.assertEqual(conn.affected_rows(), 1, 'affected_rows does not match') conn.commit() # Test fetchone() iter = 0 cursor.execute('SELECT * FROM tz_data') while True: row = cursor.fetchone() if row is None: break iter += 1 # Test cursor.rowcount self.assertEqual(cursor.rowcount, affected_rows, 'cursor.rowcount != %s' % (str(affected_rows))) # Test cursor.rownumber self.assertEqual(cursor.rownumber, iter, 'cursor.rowcount != %s' % (str(iter))) # Test row came out the same as it went in self.assertEqual((row in data), True, 'Row not found in source data') # Test fetchall cursor.execute('SELECT * FROM tz_data') self.assertEqual(len(cursor.fetchall()), len(data), 'fetchall failed. Number of rows does not match') # Test fetchmany cursor.execute('SELECT * FROM tz_data') self.assertEqual(len(cursor.fetchmany(2)), 2, 'fetchmany failed. Number of rows does not match') # So MySQLdb won't throw "Commands out of sync" while True: res = cursor.fetchone() if res is None: break # Test update, affected_rows() cursor.execute('UPDATE tz_data SET zone = %s', ['Foo']) conn.commit() self.assertEqual(cursor.rowcount, len(data), 'Update failed. affected_rows != %s' % (str(len(data)))) # Test executemany cursor.executemany('INSERT INTO tz_data VALUES (%s, %s, %s)', data) self.assertEqual(cursor.rowcount, len(data), 'executemany failed. cursor.rowcount != %s' % (str(len(data)))) finally: cursor.execute('DROP TABLE tz_data') cursor.close() __all__ = ["TestSSCursor"] if __name__ == "__main__": import unittest unittest.main() web2py-2.12.3.orig/gluon/contrib/pymysql/tests/__init__.py0000664000000000000000000000055312564727262022243 0ustar rootrootfrom pymysql.tests.test_issues import * from pymysql.tests.test_example import * from pymysql.tests.test_basic import * from pymysql.tests.test_DictCursor import * import sys if sys.version_info[0] == 2: # MySQLdb tests were designed for Python 3 from pymysql.tests.thirdparty import * if __name__ == "__main__": import unittest unittest.main() web2py-2.12.3.orig/gluon/contrib/pymysql/tests/test_example.py0000664000000000000000000000121112564727262023166 0ustar rootrootimport pymysql from pymysql.tests import base class TestExample(base.PyMySQLTestCase): def test_example(self): conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='mysql') cur = conn.cursor() cur.execute("SELECT Host,User FROM user") # print cur.description # r = cur.fetchall() # print r # ...or... u = False for r in cur.fetchall(): u = u or conn.user in r self.assertTrue(u) cur.close() conn.close() __all__ = ["TestExample"] if __name__ == "__main__": import unittest unittest.main() web2py-2.12.3.orig/gluon/contrib/pymysql/tests/test_DictCursor.py0000775000000000000000000000510012564727262023620 0ustar rootrootfrom pymysql.tests import base import pymysql.cursors import datetime class TestDictCursor(base.PyMySQLTestCase): def test_DictCursor(self): #all assert test compare to the structure as would come out from MySQLdb conn = self.connections[0] c = conn.cursor(pymysql.cursors.DictCursor) # create a table ane some data to query c.execute("""CREATE TABLE dictcursor (name char(20), age int , DOB datetime)""") data = (("bob",21,"1990-02-06 23:04:56"), ("jim",56,"1955-05-09 13:12:45"), ("fred",100,"1911-09-12 01:01:01")) bob = {'name':'bob','age':21,'DOB':datetime.datetime(1990, 02, 6, 23, 04, 56)} jim = {'name':'jim','age':56,'DOB':datetime.datetime(1955, 05, 9, 13, 12, 45)} fred = {'name':'fred','age':100,'DOB':datetime.datetime(1911, 9, 12, 1, 1, 1)} try: c.executemany("insert into dictcursor values (%s,%s,%s)", data) # try an update which should return no rows c.execute("update dictcursor set age=20 where name='bob'") bob['age'] = 20 # pull back the single row dict for bob and check c.execute("SELECT * from dictcursor where name='bob'") r = c.fetchone() self.assertEqual(bob,r,"fetchone via DictCursor failed") # same again, but via fetchall => tuple) c.execute("SELECT * from dictcursor where name='bob'") r = c.fetchall() self.assertEqual((bob,),r,"fetch a 1 row result via fetchall failed via DictCursor") # same test again but iterate over the c.execute("SELECT * from dictcursor where name='bob'") for r in c: self.assertEqual(bob, r,"fetch a 1 row result via iteration failed via DictCursor") # get all 3 row via fetchall c.execute("SELECT * from dictcursor") r = c.fetchall() self.assertEqual((bob,jim,fred), r, "fetchall failed via DictCursor") #same test again but do a list comprehension c.execute("SELECT * from dictcursor") r = [x for x in c] self.assertEqual([bob,jim,fred], r, "list comprehension failed via DictCursor") # get all 2 row via fetchmany c.execute("SELECT * from dictcursor") r = c.fetchmany(2) self.assertEqual((bob,jim), r, "fetchmany failed via DictCursor") finally: c.execute("drop table dictcursor") __all__ = ["TestDictCursor"] if __name__ == "__main__": import unittest unittest.main() web2py-2.12.3.orig/gluon/contrib/pymysql/tests/test_basic.py0000664000000000000000000002167212564727262022631 0ustar rootrootfrom pymysql.tests import base from pymysql import util import time import datetime class TestConversion(base.PyMySQLTestCase): def test_datatypes(self): """ test every data type """ conn = self.connections[0] c = conn.cursor() c.execute("create table test_datatypes (b bit, i int, l bigint, f real, s varchar(32), u varchar(32), bb blob, d date, dt datetime, ts timestamp, td time, t time, st datetime)") try: # insert values v = (True, -3, 123456789012, 5.7, "hello'\" world", u"Espa\xc3\xb1ol", "binary\x00data".encode(conn.charset), datetime.date(1988,2,2), datetime.datetime.now(), datetime.timedelta(5,6), datetime.time(16,32), time.localtime()) c.execute("insert into test_datatypes (b,i,l,f,s,u,bb,d,dt,td,t,st) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)", v) c.execute("select b,i,l,f,s,u,bb,d,dt,td,t,st from test_datatypes") r = c.fetchone() self.assertEqual(util.int2byte(1), r[0]) self.assertEqual(v[1:8], r[1:8]) # mysql throws away microseconds so we need to check datetimes # specially. additionally times are turned into timedeltas. self.assertEqual(datetime.datetime(*v[8].timetuple()[:6]), r[8]) self.assertEqual(v[9], r[9]) # just timedeltas self.assertEqual(datetime.timedelta(0, 60 * (v[10].hour * 60 + v[10].minute)), r[10]) self.assertEqual(datetime.datetime(*v[-1][:6]), r[-1]) c.execute("delete from test_datatypes") # check nulls c.execute("insert into test_datatypes (b,i,l,f,s,u,bb,d,dt,td,t,st) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)", [None] * 12) c.execute("select b,i,l,f,s,u,bb,d,dt,td,t,st from test_datatypes") r = c.fetchone() self.assertEqual(tuple([None] * 12), r) c.execute("delete from test_datatypes") # check sequence type c.execute("insert into test_datatypes (i, l) values (2,4), (6,8), (10,12)") c.execute("select l from test_datatypes where i in %s order by i", ((2,6),)) r = c.fetchall() self.assertEqual(((4,),(8,)), r) finally: c.execute("drop table test_datatypes") def test_dict(self): """ test dict escaping """ conn = self.connections[0] c = conn.cursor() c.execute("create table test_dict (a integer, b integer, c integer)") try: c.execute("insert into test_dict (a,b,c) values (%(a)s, %(b)s, %(c)s)", {"a":1,"b":2,"c":3}) c.execute("select a,b,c from test_dict") self.assertEqual((1,2,3), c.fetchone()) finally: c.execute("drop table test_dict") def test_string(self): conn = self.connections[0] c = conn.cursor() c.execute("create table test_dict (a text)") test_value = "I am a test string" try: c.execute("insert into test_dict (a) values (%s)", test_value) c.execute("select a from test_dict") self.assertEqual((test_value,), c.fetchone()) finally: c.execute("drop table test_dict") def test_integer(self): conn = self.connections[0] c = conn.cursor() c.execute("create table test_dict (a integer)") test_value = 12345 try: c.execute("insert into test_dict (a) values (%s)", test_value) c.execute("select a from test_dict") self.assertEqual((test_value,), c.fetchone()) finally: c.execute("drop table test_dict") def test_big_blob(self): """ test tons of data """ conn = self.connections[0] c = conn.cursor() c.execute("create table test_big_blob (b blob)") try: data = "pymysql" * 1024 c.execute("insert into test_big_blob (b) values (%s)", (data,)) c.execute("select b from test_big_blob") self.assertEqual(data.encode(conn.charset), c.fetchone()[0]) finally: c.execute("drop table test_big_blob") def test_untyped(self): """ test conversion of null, empty string """ conn = self.connections[0] c = conn.cursor() c.execute("select null,''") self.assertEqual((None,u''), c.fetchone()) c.execute("select '',null") self.assertEqual((u'',None), c.fetchone()) def test_datetime(self): """ test conversion of null, empty string """ conn = self.connections[0] c = conn.cursor() c.execute("select time('12:30'), time('23:12:59'), time('23:12:59.05100')") self.assertEqual((datetime.timedelta(0, 45000), datetime.timedelta(0, 83579), datetime.timedelta(0, 83579, 51000)), c.fetchone()) class TestCursor(base.PyMySQLTestCase): # this test case does not work quite right yet, however, # we substitute in None for the erroneous field which is # compatible with the DB-API 2.0 spec and has not broken # any unit tests for anything we've tried. #def test_description(self): # """ test description attribute """ # # result is from MySQLdb module # r = (('Host', 254, 11, 60, 60, 0, 0), # ('User', 254, 16, 16, 16, 0, 0), # ('Password', 254, 41, 41, 41, 0, 0), # ('Select_priv', 254, 1, 1, 1, 0, 0), # ('Insert_priv', 254, 1, 1, 1, 0, 0), # ('Update_priv', 254, 1, 1, 1, 0, 0), # ('Delete_priv', 254, 1, 1, 1, 0, 0), # ('Create_priv', 254, 1, 1, 1, 0, 0), # ('Drop_priv', 254, 1, 1, 1, 0, 0), # ('Reload_priv', 254, 1, 1, 1, 0, 0), # ('Shutdown_priv', 254, 1, 1, 1, 0, 0), # ('Process_priv', 254, 1, 1, 1, 0, 0), # ('File_priv', 254, 1, 1, 1, 0, 0), # ('Grant_priv', 254, 1, 1, 1, 0, 0), # ('References_priv', 254, 1, 1, 1, 0, 0), # ('Index_priv', 254, 1, 1, 1, 0, 0), # ('Alter_priv', 254, 1, 1, 1, 0, 0), # ('Show_db_priv', 254, 1, 1, 1, 0, 0), # ('Super_priv', 254, 1, 1, 1, 0, 0), # ('Create_tmp_table_priv', 254, 1, 1, 1, 0, 0), # ('Lock_tables_priv', 254, 1, 1, 1, 0, 0), # ('Execute_priv', 254, 1, 1, 1, 0, 0), # ('Repl_slave_priv', 254, 1, 1, 1, 0, 0), # ('Repl_client_priv', 254, 1, 1, 1, 0, 0), # ('Create_view_priv', 254, 1, 1, 1, 0, 0), # ('Show_view_priv', 254, 1, 1, 1, 0, 0), # ('Create_routine_priv', 254, 1, 1, 1, 0, 0), # ('Alter_routine_priv', 254, 1, 1, 1, 0, 0), # ('Create_user_priv', 254, 1, 1, 1, 0, 0), # ('Event_priv', 254, 1, 1, 1, 0, 0), # ('Trigger_priv', 254, 1, 1, 1, 0, 0), # ('ssl_type', 254, 0, 9, 9, 0, 0), # ('ssl_cipher', 252, 0, 65535, 65535, 0, 0), # ('x509_issuer', 252, 0, 65535, 65535, 0, 0), # ('x509_subject', 252, 0, 65535, 65535, 0, 0), # ('max_questions', 3, 1, 11, 11, 0, 0), # ('max_updates', 3, 1, 11, 11, 0, 0), # ('max_connections', 3, 1, 11, 11, 0, 0), # ('max_user_connections', 3, 1, 11, 11, 0, 0)) # conn = self.connections[0] # c = conn.cursor() # c.execute("select * from mysql.user") # # self.assertEqual(r, c.description) def test_fetch_no_result(self): """ test a fetchone() with no rows """ conn = self.connections[0] c = conn.cursor() c.execute("create table test_nr (b varchar(32))") try: data = "pymysql" c.execute("insert into test_nr (b) values (%s)", (data,)) self.assertEqual(None, c.fetchone()) finally: c.execute("drop table test_nr") def test_aggregates(self): """ test aggregate functions """ conn = self.connections[0] c = conn.cursor() try: c.execute('create table test_aggregates (i integer)') for i in xrange(0, 10): c.execute('insert into test_aggregates (i) values (%s)', (i,)) c.execute('select sum(i) from test_aggregates') r, = c.fetchone() self.assertEqual(sum(range(0,10)), r) finally: c.execute('drop table test_aggregates') def test_single_tuple(self): """ test a single tuple """ conn = self.connections[0] c = conn.cursor() try: c.execute("create table mystuff (id integer primary key)") c.execute("insert into mystuff (id) values (1)") c.execute("insert into mystuff (id) values (2)") c.execute("select id from mystuff where id in %s", ((1,),)) self.assertEqual([(1,)], list(c.fetchall())) finally: c.execute("drop table mystuff") __all__ = ["TestConversion","TestCursor"] if __name__ == "__main__": import unittest unittest.main() web2py-2.12.3.orig/gluon/contrib/pymysql/tests/base.py0000664000000000000000000000110212564727262021405 0ustar rootrootimport pymysql import unittest class PyMySQLTestCase(unittest.TestCase): # Edit this to suit your test environment. databases = [ {"host":"localhost","user":"root", "passwd":"","db":"test_pymysql", "use_unicode": True}, {"host":"localhost","user":"root","passwd":"","db":"test_pymysql2"}] def setUp(self): self.connections = [] for params in self.databases: self.connections.append(pymysql.connect(**params)) def tearDown(self): for connection in self.connections: connection.close() web2py-2.12.3.orig/gluon/contrib/fpdf/0000775000000000000000000000000012564727262016166 5ustar rootrootweb2py-2.12.3.orig/gluon/contrib/fpdf/php.py0000664000000000000000000000243012564727262017326 0ustar rootroot#!/usr/bin/env python # -*- coding: latin-1 -*- # fpdf php helpers: def substr(s, start, length=-1): if length < 0: length=len(s)-start return s[start:start+length] def sprintf(fmt, *args): return fmt % args def print_r(array): if not isinstance(array, dict): array = dict([(k, k) for k in array]) for k, v in array.items(): print "[%s] => %s" % (k, v), def UTF8ToUTF16BE(instr, setbom=True): "Converts UTF-8 strings to UTF16-BE." outstr = "" if (setbom): outstr += "\xFE\xFF"; if not isinstance(instr, unicode): instr = instr.decode('UTF-8') outstr += instr.encode('UTF-16BE') return outstr def UTF8StringToArray(instr): "Converts UTF-8 strings to codepoints array" return [ord(c) for c in instr] # ttfints php helpers: def die(msg): raise RuntimeError(msg) def str_repeat(s, count): return s * count def str_pad(s, pad_length=0, pad_char= " ", pad_type= +1 ): if pad_type<0: # pad left return s.rjust(pad_length, pad_char) elif pad_type>0: # pad right return s.ljust(pad_length, pad_char) else: # pad both return s.center(pad_length, pad_char) strlen = count = lambda s: len(s)web2py-2.12.3.orig/gluon/contrib/fpdf/fonts.py0000664000000000000000000006371612564727262017706 0ustar rootroot#!/usr/bin/env python # -*- coding: latin-1 -*- # Fonts: fpdf_charwidths = {} fpdf_charwidths['courier']={} for i in xrange(0,256): fpdf_charwidths['courier'][chr(i)]=600 fpdf_charwidths['courierB']=fpdf_charwidths['courier'] fpdf_charwidths['courierI']=fpdf_charwidths['courier'] fpdf_charwidths['courierBI']=fpdf_charwidths['courier'] fpdf_charwidths['helvetica']={ '\x00':278,'\x01':278,'\x02':278,'\x03':278,'\x04':278,'\x05':278,'\x06':278,'\x07':278,'\x08':278,'\t':278,'\n':278,'\x0b':278,'\x0c':278,'\r':278,'\x0e':278,'\x0f':278,'\x10':278,'\x11':278,'\x12':278,'\x13':278,'\x14':278,'\x15':278, '\x16':278,'\x17':278,'\x18':278,'\x19':278,'\x1a':278,'\x1b':278,'\x1c':278,'\x1d':278,'\x1e':278,'\x1f':278,' ':278,'!':278,'"':355,'#':556,'$':556,'%':889,'&':667,'\'':191,'(':333,')':333,'*':389,'+':584, ',':278,'-':333,'.':278,'/':278,'0':556,'1':556,'2':556,'3':556,'4':556,'5':556,'6':556,'7':556,'8':556,'9':556,':':278,';':278,'<':584,'=':584,'>':584,'?':556,'@':1015,'A':667, 'B':667,'C':722,'D':722,'E':667,'F':611,'G':778,'H':722,'I':278,'J':500,'K':667,'L':556,'M':833,'N':722,'O':778,'P':667,'Q':778,'R':722,'S':667,'T':611,'U':722,'V':667,'W':944, 'X':667,'Y':667,'Z':611,'[':278,'\\':278,']':278,'^':469,'_':556,'`':333,'a':556,'b':556,'c':500,'d':556,'e':556,'f':278,'g':556,'h':556,'i':222,'j':222,'k':500,'l':222,'m':833, 'n':556,'o':556,'p':556,'q':556,'r':333,'s':500,'t':278,'u':556,'v':500,'w':722,'x':500,'y':500,'z':500,'{':334,'|':260,'}':334,'~':584,'\x7f':350,'\x80':556,'\x81':350,'\x82':222,'\x83':556, '\x84':333,'\x85':1000,'\x86':556,'\x87':556,'\x88':333,'\x89':1000,'\x8a':667,'\x8b':333,'\x8c':1000,'\x8d':350,'\x8e':611,'\x8f':350,'\x90':350,'\x91':222,'\x92':222,'\x93':333,'\x94':333,'\x95':350,'\x96':556,'\x97':1000,'\x98':333,'\x99':1000, '\x9a':500,'\x9b':333,'\x9c':944,'\x9d':350,'\x9e':500,'\x9f':667,'\xa0':278,'\xa1':333,'\xa2':556,'\xa3':556,'\xa4':556,'\xa5':556,'\xa6':260,'\xa7':556,'\xa8':333,'\xa9':737,'\xaa':370,'\xab':556,'\xac':584,'\xad':333,'\xae':737,'\xaf':333, '\xb0':400,'\xb1':584,'\xb2':333,'\xb3':333,'\xb4':333,'\xb5':556,'\xb6':537,'\xb7':278,'\xb8':333,'\xb9':333,'\xba':365,'\xbb':556,'\xbc':834,'\xbd':834,'\xbe':834,'\xbf':611,'\xc0':667,'\xc1':667,'\xc2':667,'\xc3':667,'\xc4':667,'\xc5':667, '\xc6':1000,'\xc7':722,'\xc8':667,'\xc9':667,'\xca':667,'\xcb':667,'\xcc':278,'\xcd':278,'\xce':278,'\xcf':278,'\xd0':722,'\xd1':722,'\xd2':778,'\xd3':778,'\xd4':778,'\xd5':778,'\xd6':778,'\xd7':584,'\xd8':778,'\xd9':722,'\xda':722,'\xdb':722, '\xdc':722,'\xdd':667,'\xde':667,'\xdf':611,'\xe0':556,'\xe1':556,'\xe2':556,'\xe3':556,'\xe4':556,'\xe5':556,'\xe6':889,'\xe7':500,'\xe8':556,'\xe9':556,'\xea':556,'\xeb':556,'\xec':278,'\xed':278,'\xee':278,'\xef':278,'\xf0':556,'\xf1':556, '\xf2':556,'\xf3':556,'\xf4':556,'\xf5':556,'\xf6':556,'\xf7':584,'\xf8':611,'\xf9':556,'\xfa':556,'\xfb':556,'\xfc':556,'\xfd':500,'\xfe':556,'\xff':500} fpdf_charwidths['helveticaB']={ '\x00':278,'\x01':278,'\x02':278,'\x03':278,'\x04':278,'\x05':278,'\x06':278,'\x07':278,'\x08':278,'\t':278,'\n':278,'\x0b':278,'\x0c':278,'\r':278,'\x0e':278,'\x0f':278,'\x10':278,'\x11':278,'\x12':278,'\x13':278,'\x14':278,'\x15':278, '\x16':278,'\x17':278,'\x18':278,'\x19':278,'\x1a':278,'\x1b':278,'\x1c':278,'\x1d':278,'\x1e':278,'\x1f':278,' ':278,'!':333,'"':474,'#':556,'$':556,'%':889,'&':722,'\'':238,'(':333,')':333,'*':389,'+':584, ',':278,'-':333,'.':278,'/':278,'0':556,'1':556,'2':556,'3':556,'4':556,'5':556,'6':556,'7':556,'8':556,'9':556,':':333,';':333,'<':584,'=':584,'>':584,'?':611,'@':975,'A':722, 'B':722,'C':722,'D':722,'E':667,'F':611,'G':778,'H':722,'I':278,'J':556,'K':722,'L':611,'M':833,'N':722,'O':778,'P':667,'Q':778,'R':722,'S':667,'T':611,'U':722,'V':667,'W':944, 'X':667,'Y':667,'Z':611,'[':333,'\\':278,']':333,'^':584,'_':556,'`':333,'a':556,'b':611,'c':556,'d':611,'e':556,'f':333,'g':611,'h':611,'i':278,'j':278,'k':556,'l':278,'m':889, 'n':611,'o':611,'p':611,'q':611,'r':389,'s':556,'t':333,'u':611,'v':556,'w':778,'x':556,'y':556,'z':500,'{':389,'|':280,'}':389,'~':584,'\x7f':350,'\x80':556,'\x81':350,'\x82':278,'\x83':556, '\x84':500,'\x85':1000,'\x86':556,'\x87':556,'\x88':333,'\x89':1000,'\x8a':667,'\x8b':333,'\x8c':1000,'\x8d':350,'\x8e':611,'\x8f':350,'\x90':350,'\x91':278,'\x92':278,'\x93':500,'\x94':500,'\x95':350,'\x96':556,'\x97':1000,'\x98':333,'\x99':1000, '\x9a':556,'\x9b':333,'\x9c':944,'\x9d':350,'\x9e':500,'\x9f':667,'\xa0':278,'\xa1':333,'\xa2':556,'\xa3':556,'\xa4':556,'\xa5':556,'\xa6':280,'\xa7':556,'\xa8':333,'\xa9':737,'\xaa':370,'\xab':556,'\xac':584,'\xad':333,'\xae':737,'\xaf':333, '\xb0':400,'\xb1':584,'\xb2':333,'\xb3':333,'\xb4':333,'\xb5':611,'\xb6':556,'\xb7':278,'\xb8':333,'\xb9':333,'\xba':365,'\xbb':556,'\xbc':834,'\xbd':834,'\xbe':834,'\xbf':611,'\xc0':722,'\xc1':722,'\xc2':722,'\xc3':722,'\xc4':722,'\xc5':722, '\xc6':1000,'\xc7':722,'\xc8':667,'\xc9':667,'\xca':667,'\xcb':667,'\xcc':278,'\xcd':278,'\xce':278,'\xcf':278,'\xd0':722,'\xd1':722,'\xd2':778,'\xd3':778,'\xd4':778,'\xd5':778,'\xd6':778,'\xd7':584,'\xd8':778,'\xd9':722,'\xda':722,'\xdb':722, '\xdc':722,'\xdd':667,'\xde':667,'\xdf':611,'\xe0':556,'\xe1':556,'\xe2':556,'\xe3':556,'\xe4':556,'\xe5':556,'\xe6':889,'\xe7':556,'\xe8':556,'\xe9':556,'\xea':556,'\xeb':556,'\xec':278,'\xed':278,'\xee':278,'\xef':278,'\xf0':611,'\xf1':611, '\xf2':611,'\xf3':611,'\xf4':611,'\xf5':611,'\xf6':611,'\xf7':584,'\xf8':611,'\xf9':611,'\xfa':611,'\xfb':611,'\xfc':611,'\xfd':556,'\xfe':611,'\xff':556 } fpdf_charwidths['helveticaBI']={ '\x00':278,'\x01':278,'\x02':278,'\x03':278,'\x04':278,'\x05':278,'\x06':278,'\x07':278,'\x08':278,'\t':278,'\n':278,'\x0b':278,'\x0c':278,'\r':278,'\x0e':278,'\x0f':278,'\x10':278,'\x11':278,'\x12':278,'\x13':278,'\x14':278,'\x15':278, '\x16':278,'\x17':278,'\x18':278,'\x19':278,'\x1a':278,'\x1b':278,'\x1c':278,'\x1d':278,'\x1e':278,'\x1f':278,' ':278,'!':333,'"':474,'#':556,'$':556,'%':889,'&':722,'\'':238,'(':333,')':333,'*':389,'+':584, ',':278,'-':333,'.':278,'/':278,'0':556,'1':556,'2':556,'3':556,'4':556,'5':556,'6':556,'7':556,'8':556,'9':556,':':333,';':333,'<':584,'=':584,'>':584,'?':611,'@':975,'A':722, 'B':722,'C':722,'D':722,'E':667,'F':611,'G':778,'H':722,'I':278,'J':556,'K':722,'L':611,'M':833,'N':722,'O':778,'P':667,'Q':778,'R':722,'S':667,'T':611,'U':722,'V':667,'W':944, 'X':667,'Y':667,'Z':611,'[':333,'\\':278,']':333,'^':584,'_':556,'`':333,'a':556,'b':611,'c':556,'d':611,'e':556,'f':333,'g':611,'h':611,'i':278,'j':278,'k':556,'l':278,'m':889, 'n':611,'o':611,'p':611,'q':611,'r':389,'s':556,'t':333,'u':611,'v':556,'w':778,'x':556,'y':556,'z':500,'{':389,'|':280,'}':389,'~':584,'\x7f':350,'\x80':556,'\x81':350,'\x82':278,'\x83':556, '\x84':500,'\x85':1000,'\x86':556,'\x87':556,'\x88':333,'\x89':1000,'\x8a':667,'\x8b':333,'\x8c':1000,'\x8d':350,'\x8e':611,'\x8f':350,'\x90':350,'\x91':278,'\x92':278,'\x93':500,'\x94':500,'\x95':350,'\x96':556,'\x97':1000,'\x98':333,'\x99':1000, '\x9a':556,'\x9b':333,'\x9c':944,'\x9d':350,'\x9e':500,'\x9f':667,'\xa0':278,'\xa1':333,'\xa2':556,'\xa3':556,'\xa4':556,'\xa5':556,'\xa6':280,'\xa7':556,'\xa8':333,'\xa9':737,'\xaa':370,'\xab':556,'\xac':584,'\xad':333,'\xae':737,'\xaf':333, '\xb0':400,'\xb1':584,'\xb2':333,'\xb3':333,'\xb4':333,'\xb5':611,'\xb6':556,'\xb7':278,'\xb8':333,'\xb9':333,'\xba':365,'\xbb':556,'\xbc':834,'\xbd':834,'\xbe':834,'\xbf':611,'\xc0':722,'\xc1':722,'\xc2':722,'\xc3':722,'\xc4':722,'\xc5':722, '\xc6':1000,'\xc7':722,'\xc8':667,'\xc9':667,'\xca':667,'\xcb':667,'\xcc':278,'\xcd':278,'\xce':278,'\xcf':278,'\xd0':722,'\xd1':722,'\xd2':778,'\xd3':778,'\xd4':778,'\xd5':778,'\xd6':778,'\xd7':584,'\xd8':778,'\xd9':722,'\xda':722,'\xdb':722, '\xdc':722,'\xdd':667,'\xde':667,'\xdf':611,'\xe0':556,'\xe1':556,'\xe2':556,'\xe3':556,'\xe4':556,'\xe5':556,'\xe6':889,'\xe7':556,'\xe8':556,'\xe9':556,'\xea':556,'\xeb':556,'\xec':278,'\xed':278,'\xee':278,'\xef':278,'\xf0':611,'\xf1':611, '\xf2':611,'\xf3':611,'\xf4':611,'\xf5':611,'\xf6':611,'\xf7':584,'\xf8':611,'\xf9':611,'\xfa':611,'\xfb':611,'\xfc':611,'\xfd':556,'\xfe':611,'\xff':556} fpdf_charwidths['helveticaI']={ '\x00':278,'\x01':278,'\x02':278,'\x03':278,'\x04':278,'\x05':278,'\x06':278,'\x07':278,'\x08':278,'\t':278,'\n':278,'\x0b':278,'\x0c':278,'\r':278,'\x0e':278,'\x0f':278,'\x10':278,'\x11':278,'\x12':278,'\x13':278,'\x14':278,'\x15':278, '\x16':278,'\x17':278,'\x18':278,'\x19':278,'\x1a':278,'\x1b':278,'\x1c':278,'\x1d':278,'\x1e':278,'\x1f':278,' ':278,'!':278,'"':355,'#':556,'$':556,'%':889,'&':667,'\'':191,'(':333,')':333,'*':389,'+':584, ',':278,'-':333,'.':278,'/':278,'0':556,'1':556,'2':556,'3':556,'4':556,'5':556,'6':556,'7':556,'8':556,'9':556,':':278,';':278,'<':584,'=':584,'>':584,'?':556,'@':1015,'A':667, 'B':667,'C':722,'D':722,'E':667,'F':611,'G':778,'H':722,'I':278,'J':500,'K':667,'L':556,'M':833,'N':722,'O':778,'P':667,'Q':778,'R':722,'S':667,'T':611,'U':722,'V':667,'W':944, 'X':667,'Y':667,'Z':611,'[':278,'\\':278,']':278,'^':469,'_':556,'`':333,'a':556,'b':556,'c':500,'d':556,'e':556,'f':278,'g':556,'h':556,'i':222,'j':222,'k':500,'l':222,'m':833, 'n':556,'o':556,'p':556,'q':556,'r':333,'s':500,'t':278,'u':556,'v':500,'w':722,'x':500,'y':500,'z':500,'{':334,'|':260,'}':334,'~':584,'\x7f':350,'\x80':556,'\x81':350,'\x82':222,'\x83':556, '\x84':333,'\x85':1000,'\x86':556,'\x87':556,'\x88':333,'\x89':1000,'\x8a':667,'\x8b':333,'\x8c':1000,'\x8d':350,'\x8e':611,'\x8f':350,'\x90':350,'\x91':222,'\x92':222,'\x93':333,'\x94':333,'\x95':350,'\x96':556,'\x97':1000,'\x98':333,'\x99':1000, '\x9a':500,'\x9b':333,'\x9c':944,'\x9d':350,'\x9e':500,'\x9f':667,'\xa0':278,'\xa1':333,'\xa2':556,'\xa3':556,'\xa4':556,'\xa5':556,'\xa6':260,'\xa7':556,'\xa8':333,'\xa9':737,'\xaa':370,'\xab':556,'\xac':584,'\xad':333,'\xae':737,'\xaf':333, '\xb0':400,'\xb1':584,'\xb2':333,'\xb3':333,'\xb4':333,'\xb5':556,'\xb6':537,'\xb7':278,'\xb8':333,'\xb9':333,'\xba':365,'\xbb':556,'\xbc':834,'\xbd':834,'\xbe':834,'\xbf':611,'\xc0':667,'\xc1':667,'\xc2':667,'\xc3':667,'\xc4':667,'\xc5':667, '\xc6':1000,'\xc7':722,'\xc8':667,'\xc9':667,'\xca':667,'\xcb':667,'\xcc':278,'\xcd':278,'\xce':278,'\xcf':278,'\xd0':722,'\xd1':722,'\xd2':778,'\xd3':778,'\xd4':778,'\xd5':778,'\xd6':778,'\xd7':584,'\xd8':778,'\xd9':722,'\xda':722,'\xdb':722, '\xdc':722,'\xdd':667,'\xde':667,'\xdf':611,'\xe0':556,'\xe1':556,'\xe2':556,'\xe3':556,'\xe4':556,'\xe5':556,'\xe6':889,'\xe7':500,'\xe8':556,'\xe9':556,'\xea':556,'\xeb':556,'\xec':278,'\xed':278,'\xee':278,'\xef':278,'\xf0':556,'\xf1':556, '\xf2':556,'\xf3':556,'\xf4':556,'\xf5':556,'\xf6':556,'\xf7':584,'\xf8':611,'\xf9':556,'\xfa':556,'\xfb':556,'\xfc':556,'\xfd':500,'\xfe':556,'\xff':500} fpdf_charwidths['symbol']={ '\x00':250,'\x01':250,'\x02':250,'\x03':250,'\x04':250,'\x05':250,'\x06':250,'\x07':250,'\x08':250,'\t':250,'\n':250,'\x0b':250,'\x0c':250,'\r':250,'\x0e':250,'\x0f':250,'\x10':250,'\x11':250,'\x12':250,'\x13':250,'\x14':250,'\x15':250, '\x16':250,'\x17':250,'\x18':250,'\x19':250,'\x1a':250,'\x1b':250,'\x1c':250,'\x1d':250,'\x1e':250,'\x1f':250,' ':250,'!':333,'"':713,'#':500,'$':549,'%':833,'&':778,'\'':439,'(':333,')':333,'*':500,'+':549, ',':250,'-':549,'.':250,'/':278,'0':500,'1':500,'2':500,'3':500,'4':500,'5':500,'6':500,'7':500,'8':500,'9':500,':':278,';':278,'<':549,'=':549,'>':549,'?':444,'@':549,'A':722, 'B':667,'C':722,'D':612,'E':611,'F':763,'G':603,'H':722,'I':333,'J':631,'K':722,'L':686,'M':889,'N':722,'O':722,'P':768,'Q':741,'R':556,'S':592,'T':611,'U':690,'V':439,'W':768, 'X':645,'Y':795,'Z':611,'[':333,'\\':863,']':333,'^':658,'_':500,'`':500,'a':631,'b':549,'c':549,'d':494,'e':439,'f':521,'g':411,'h':603,'i':329,'j':603,'k':549,'l':549,'m':576, 'n':521,'o':549,'p':549,'q':521,'r':549,'s':603,'t':439,'u':576,'v':713,'w':686,'x':493,'y':686,'z':494,'{':480,'|':200,'}':480,'~':549,'\x7f':0,'\x80':0,'\x81':0,'\x82':0,'\x83':0, '\x84':0,'\x85':0,'\x86':0,'\x87':0,'\x88':0,'\x89':0,'\x8a':0,'\x8b':0,'\x8c':0,'\x8d':0,'\x8e':0,'\x8f':0,'\x90':0,'\x91':0,'\x92':0,'\x93':0,'\x94':0,'\x95':0,'\x96':0,'\x97':0,'\x98':0,'\x99':0, '\x9a':0,'\x9b':0,'\x9c':0,'\x9d':0,'\x9e':0,'\x9f':0,'\xa0':750,'\xa1':620,'\xa2':247,'\xa3':549,'\xa4':167,'\xa5':713,'\xa6':500,'\xa7':753,'\xa8':753,'\xa9':753,'\xaa':753,'\xab':1042,'\xac':987,'\xad':603,'\xae':987,'\xaf':603, '\xb0':400,'\xb1':549,'\xb2':411,'\xb3':549,'\xb4':549,'\xb5':713,'\xb6':494,'\xb7':460,'\xb8':549,'\xb9':549,'\xba':549,'\xbb':549,'\xbc':1000,'\xbd':603,'\xbe':1000,'\xbf':658,'\xc0':823,'\xc1':686,'\xc2':795,'\xc3':987,'\xc4':768,'\xc5':768, '\xc6':823,'\xc7':768,'\xc8':768,'\xc9':713,'\xca':713,'\xcb':713,'\xcc':713,'\xcd':713,'\xce':713,'\xcf':713,'\xd0':768,'\xd1':713,'\xd2':790,'\xd3':790,'\xd4':890,'\xd5':823,'\xd6':549,'\xd7':250,'\xd8':713,'\xd9':603,'\xda':603,'\xdb':1042, '\xdc':987,'\xdd':603,'\xde':987,'\xdf':603,'\xe0':494,'\xe1':329,'\xe2':790,'\xe3':790,'\xe4':786,'\xe5':713,'\xe6':384,'\xe7':384,'\xe8':384,'\xe9':384,'\xea':384,'\xeb':384,'\xec':494,'\xed':494,'\xee':494,'\xef':494,'\xf0':0,'\xf1':329, '\xf2':274,'\xf3':686,'\xf4':686,'\xf5':686,'\xf6':384,'\xf7':384,'\xf8':384,'\xf9':384,'\xfa':384,'\xfb':384,'\xfc':494,'\xfd':494,'\xfe':494,'\xff':0} fpdf_charwidths['times']={ '\x00':250,'\x01':250,'\x02':250,'\x03':250,'\x04':250,'\x05':250,'\x06':250,'\x07':250,'\x08':250,'\t':250,'\n':250,'\x0b':250,'\x0c':250,'\r':250,'\x0e':250,'\x0f':250,'\x10':250,'\x11':250,'\x12':250,'\x13':250,'\x14':250,'\x15':250, '\x16':250,'\x17':250,'\x18':250,'\x19':250,'\x1a':250,'\x1b':250,'\x1c':250,'\x1d':250,'\x1e':250,'\x1f':250,' ':250,'!':333,'"':408,'#':500,'$':500,'%':833,'&':778,'\'':180,'(':333,')':333,'*':500,'+':564, ',':250,'-':333,'.':250,'/':278,'0':500,'1':500,'2':500,'3':500,'4':500,'5':500,'6':500,'7':500,'8':500,'9':500,':':278,';':278,'<':564,'=':564,'>':564,'?':444,'@':921,'A':722, 'B':667,'C':667,'D':722,'E':611,'F':556,'G':722,'H':722,'I':333,'J':389,'K':722,'L':611,'M':889,'N':722,'O':722,'P':556,'Q':722,'R':667,'S':556,'T':611,'U':722,'V':722,'W':944, 'X':722,'Y':722,'Z':611,'[':333,'\\':278,']':333,'^':469,'_':500,'`':333,'a':444,'b':500,'c':444,'d':500,'e':444,'f':333,'g':500,'h':500,'i':278,'j':278,'k':500,'l':278,'m':778, 'n':500,'o':500,'p':500,'q':500,'r':333,'s':389,'t':278,'u':500,'v':500,'w':722,'x':500,'y':500,'z':444,'{':480,'|':200,'}':480,'~':541,'\x7f':350,'\x80':500,'\x81':350,'\x82':333,'\x83':500, '\x84':444,'\x85':1000,'\x86':500,'\x87':500,'\x88':333,'\x89':1000,'\x8a':556,'\x8b':333,'\x8c':889,'\x8d':350,'\x8e':611,'\x8f':350,'\x90':350,'\x91':333,'\x92':333,'\x93':444,'\x94':444,'\x95':350,'\x96':500,'\x97':1000,'\x98':333,'\x99':980, '\x9a':389,'\x9b':333,'\x9c':722,'\x9d':350,'\x9e':444,'\x9f':722,'\xa0':250,'\xa1':333,'\xa2':500,'\xa3':500,'\xa4':500,'\xa5':500,'\xa6':200,'\xa7':500,'\xa8':333,'\xa9':760,'\xaa':276,'\xab':500,'\xac':564,'\xad':333,'\xae':760,'\xaf':333, '\xb0':400,'\xb1':564,'\xb2':300,'\xb3':300,'\xb4':333,'\xb5':500,'\xb6':453,'\xb7':250,'\xb8':333,'\xb9':300,'\xba':310,'\xbb':500,'\xbc':750,'\xbd':750,'\xbe':750,'\xbf':444,'\xc0':722,'\xc1':722,'\xc2':722,'\xc3':722,'\xc4':722,'\xc5':722, '\xc6':889,'\xc7':667,'\xc8':611,'\xc9':611,'\xca':611,'\xcb':611,'\xcc':333,'\xcd':333,'\xce':333,'\xcf':333,'\xd0':722,'\xd1':722,'\xd2':722,'\xd3':722,'\xd4':722,'\xd5':722,'\xd6':722,'\xd7':564,'\xd8':722,'\xd9':722,'\xda':722,'\xdb':722, '\xdc':722,'\xdd':722,'\xde':556,'\xdf':500,'\xe0':444,'\xe1':444,'\xe2':444,'\xe3':444,'\xe4':444,'\xe5':444,'\xe6':667,'\xe7':444,'\xe8':444,'\xe9':444,'\xea':444,'\xeb':444,'\xec':278,'\xed':278,'\xee':278,'\xef':278,'\xf0':500,'\xf1':500, '\xf2':500,'\xf3':500,'\xf4':500,'\xf5':500,'\xf6':500,'\xf7':564,'\xf8':500,'\xf9':500,'\xfa':500,'\xfb':500,'\xfc':500,'\xfd':500,'\xfe':500,'\xff':500} fpdf_charwidths['timesB']={ '\x00':250,'\x01':250,'\x02':250,'\x03':250,'\x04':250,'\x05':250,'\x06':250,'\x07':250,'\x08':250,'\t':250,'\n':250,'\x0b':250,'\x0c':250,'\r':250,'\x0e':250,'\x0f':250,'\x10':250,'\x11':250,'\x12':250,'\x13':250,'\x14':250,'\x15':250, '\x16':250,'\x17':250,'\x18':250,'\x19':250,'\x1a':250,'\x1b':250,'\x1c':250,'\x1d':250,'\x1e':250,'\x1f':250,' ':250,'!':333,'"':555,'#':500,'$':500,'%':1000,'&':833,'\'':278,'(':333,')':333,'*':500,'+':570, ',':250,'-':333,'.':250,'/':278,'0':500,'1':500,'2':500,'3':500,'4':500,'5':500,'6':500,'7':500,'8':500,'9':500,':':333,';':333,'<':570,'=':570,'>':570,'?':500,'@':930,'A':722, 'B':667,'C':722,'D':722,'E':667,'F':611,'G':778,'H':778,'I':389,'J':500,'K':778,'L':667,'M':944,'N':722,'O':778,'P':611,'Q':778,'R':722,'S':556,'T':667,'U':722,'V':722,'W':1000, 'X':722,'Y':722,'Z':667,'[':333,'\\':278,']':333,'^':581,'_':500,'`':333,'a':500,'b':556,'c':444,'d':556,'e':444,'f':333,'g':500,'h':556,'i':278,'j':333,'k':556,'l':278,'m':833, 'n':556,'o':500,'p':556,'q':556,'r':444,'s':389,'t':333,'u':556,'v':500,'w':722,'x':500,'y':500,'z':444,'{':394,'|':220,'}':394,'~':520,'\x7f':350,'\x80':500,'\x81':350,'\x82':333,'\x83':500, '\x84':500,'\x85':1000,'\x86':500,'\x87':500,'\x88':333,'\x89':1000,'\x8a':556,'\x8b':333,'\x8c':1000,'\x8d':350,'\x8e':667,'\x8f':350,'\x90':350,'\x91':333,'\x92':333,'\x93':500,'\x94':500,'\x95':350,'\x96':500,'\x97':1000,'\x98':333,'\x99':1000, '\x9a':389,'\x9b':333,'\x9c':722,'\x9d':350,'\x9e':444,'\x9f':722,'\xa0':250,'\xa1':333,'\xa2':500,'\xa3':500,'\xa4':500,'\xa5':500,'\xa6':220,'\xa7':500,'\xa8':333,'\xa9':747,'\xaa':300,'\xab':500,'\xac':570,'\xad':333,'\xae':747,'\xaf':333, '\xb0':400,'\xb1':570,'\xb2':300,'\xb3':300,'\xb4':333,'\xb5':556,'\xb6':540,'\xb7':250,'\xb8':333,'\xb9':300,'\xba':330,'\xbb':500,'\xbc':750,'\xbd':750,'\xbe':750,'\xbf':500,'\xc0':722,'\xc1':722,'\xc2':722,'\xc3':722,'\xc4':722,'\xc5':722, '\xc6':1000,'\xc7':722,'\xc8':667,'\xc9':667,'\xca':667,'\xcb':667,'\xcc':389,'\xcd':389,'\xce':389,'\xcf':389,'\xd0':722,'\xd1':722,'\xd2':778,'\xd3':778,'\xd4':778,'\xd5':778,'\xd6':778,'\xd7':570,'\xd8':778,'\xd9':722,'\xda':722,'\xdb':722, '\xdc':722,'\xdd':722,'\xde':611,'\xdf':556,'\xe0':500,'\xe1':500,'\xe2':500,'\xe3':500,'\xe4':500,'\xe5':500,'\xe6':722,'\xe7':444,'\xe8':444,'\xe9':444,'\xea':444,'\xeb':444,'\xec':278,'\xed':278,'\xee':278,'\xef':278,'\xf0':500,'\xf1':556, '\xf2':500,'\xf3':500,'\xf4':500,'\xf5':500,'\xf6':500,'\xf7':570,'\xf8':500,'\xf9':556,'\xfa':556,'\xfb':556,'\xfc':556,'\xfd':500,'\xfe':556,'\xff':500} fpdf_charwidths['timesBI']={ '\x00':250,'\x01':250,'\x02':250,'\x03':250,'\x04':250,'\x05':250,'\x06':250,'\x07':250,'\x08':250,'\t':250,'\n':250,'\x0b':250,'\x0c':250,'\r':250,'\x0e':250,'\x0f':250,'\x10':250,'\x11':250,'\x12':250,'\x13':250,'\x14':250,'\x15':250, '\x16':250,'\x17':250,'\x18':250,'\x19':250,'\x1a':250,'\x1b':250,'\x1c':250,'\x1d':250,'\x1e':250,'\x1f':250,' ':250,'!':389,'"':555,'#':500,'$':500,'%':833,'&':778,'\'':278,'(':333,')':333,'*':500,'+':570, ',':250,'-':333,'.':250,'/':278,'0':500,'1':500,'2':500,'3':500,'4':500,'5':500,'6':500,'7':500,'8':500,'9':500,':':333,';':333,'<':570,'=':570,'>':570,'?':500,'@':832,'A':667, 'B':667,'C':667,'D':722,'E':667,'F':667,'G':722,'H':778,'I':389,'J':500,'K':667,'L':611,'M':889,'N':722,'O':722,'P':611,'Q':722,'R':667,'S':556,'T':611,'U':722,'V':667,'W':889, 'X':667,'Y':611,'Z':611,'[':333,'\\':278,']':333,'^':570,'_':500,'`':333,'a':500,'b':500,'c':444,'d':500,'e':444,'f':333,'g':500,'h':556,'i':278,'j':278,'k':500,'l':278,'m':778, 'n':556,'o':500,'p':500,'q':500,'r':389,'s':389,'t':278,'u':556,'v':444,'w':667,'x':500,'y':444,'z':389,'{':348,'|':220,'}':348,'~':570,'\x7f':350,'\x80':500,'\x81':350,'\x82':333,'\x83':500, '\x84':500,'\x85':1000,'\x86':500,'\x87':500,'\x88':333,'\x89':1000,'\x8a':556,'\x8b':333,'\x8c':944,'\x8d':350,'\x8e':611,'\x8f':350,'\x90':350,'\x91':333,'\x92':333,'\x93':500,'\x94':500,'\x95':350,'\x96':500,'\x97':1000,'\x98':333,'\x99':1000, '\x9a':389,'\x9b':333,'\x9c':722,'\x9d':350,'\x9e':389,'\x9f':611,'\xa0':250,'\xa1':389,'\xa2':500,'\xa3':500,'\xa4':500,'\xa5':500,'\xa6':220,'\xa7':500,'\xa8':333,'\xa9':747,'\xaa':266,'\xab':500,'\xac':606,'\xad':333,'\xae':747,'\xaf':333, '\xb0':400,'\xb1':570,'\xb2':300,'\xb3':300,'\xb4':333,'\xb5':576,'\xb6':500,'\xb7':250,'\xb8':333,'\xb9':300,'\xba':300,'\xbb':500,'\xbc':750,'\xbd':750,'\xbe':750,'\xbf':500,'\xc0':667,'\xc1':667,'\xc2':667,'\xc3':667,'\xc4':667,'\xc5':667, '\xc6':944,'\xc7':667,'\xc8':667,'\xc9':667,'\xca':667,'\xcb':667,'\xcc':389,'\xcd':389,'\xce':389,'\xcf':389,'\xd0':722,'\xd1':722,'\xd2':722,'\xd3':722,'\xd4':722,'\xd5':722,'\xd6':722,'\xd7':570,'\xd8':722,'\xd9':722,'\xda':722,'\xdb':722, '\xdc':722,'\xdd':611,'\xde':611,'\xdf':500,'\xe0':500,'\xe1':500,'\xe2':500,'\xe3':500,'\xe4':500,'\xe5':500,'\xe6':722,'\xe7':444,'\xe8':444,'\xe9':444,'\xea':444,'\xeb':444,'\xec':278,'\xed':278,'\xee':278,'\xef':278,'\xf0':500,'\xf1':556, '\xf2':500,'\xf3':500,'\xf4':500,'\xf5':500,'\xf6':500,'\xf7':570,'\xf8':500,'\xf9':556,'\xfa':556,'\xfb':556,'\xfc':556,'\xfd':444,'\xfe':500,'\xff':444} fpdf_charwidths['timesI']={ '\x00':250,'\x01':250,'\x02':250,'\x03':250,'\x04':250,'\x05':250,'\x06':250,'\x07':250,'\x08':250,'\t':250,'\n':250,'\x0b':250,'\x0c':250,'\r':250,'\x0e':250,'\x0f':250,'\x10':250,'\x11':250,'\x12':250,'\x13':250,'\x14':250,'\x15':250, '\x16':250,'\x17':250,'\x18':250,'\x19':250,'\x1a':250,'\x1b':250,'\x1c':250,'\x1d':250,'\x1e':250,'\x1f':250,' ':250,'!':333,'"':420,'#':500,'$':500,'%':833,'&':778,'\'':214,'(':333,')':333,'*':500,'+':675, ',':250,'-':333,'.':250,'/':278,'0':500,'1':500,'2':500,'3':500,'4':500,'5':500,'6':500,'7':500,'8':500,'9':500,':':333,';':333,'<':675,'=':675,'>':675,'?':500,'@':920,'A':611, 'B':611,'C':667,'D':722,'E':611,'F':611,'G':722,'H':722,'I':333,'J':444,'K':667,'L':556,'M':833,'N':667,'O':722,'P':611,'Q':722,'R':611,'S':500,'T':556,'U':722,'V':611,'W':833, 'X':611,'Y':556,'Z':556,'[':389,'\\':278,']':389,'^':422,'_':500,'`':333,'a':500,'b':500,'c':444,'d':500,'e':444,'f':278,'g':500,'h':500,'i':278,'j':278,'k':444,'l':278,'m':722, 'n':500,'o':500,'p':500,'q':500,'r':389,'s':389,'t':278,'u':500,'v':444,'w':667,'x':444,'y':444,'z':389,'{':400,'|':275,'}':400,'~':541,'\x7f':350,'\x80':500,'\x81':350,'\x82':333,'\x83':500, '\x84':556,'\x85':889,'\x86':500,'\x87':500,'\x88':333,'\x89':1000,'\x8a':500,'\x8b':333,'\x8c':944,'\x8d':350,'\x8e':556,'\x8f':350,'\x90':350,'\x91':333,'\x92':333,'\x93':556,'\x94':556,'\x95':350,'\x96':500,'\x97':889,'\x98':333,'\x99':980, '\x9a':389,'\x9b':333,'\x9c':667,'\x9d':350,'\x9e':389,'\x9f':556,'\xa0':250,'\xa1':389,'\xa2':500,'\xa3':500,'\xa4':500,'\xa5':500,'\xa6':275,'\xa7':500,'\xa8':333,'\xa9':760,'\xaa':276,'\xab':500,'\xac':675,'\xad':333,'\xae':760,'\xaf':333, '\xb0':400,'\xb1':675,'\xb2':300,'\xb3':300,'\xb4':333,'\xb5':500,'\xb6':523,'\xb7':250,'\xb8':333,'\xb9':300,'\xba':310,'\xbb':500,'\xbc':750,'\xbd':750,'\xbe':750,'\xbf':500,'\xc0':611,'\xc1':611,'\xc2':611,'\xc3':611,'\xc4':611,'\xc5':611, '\xc6':889,'\xc7':667,'\xc8':611,'\xc9':611,'\xca':611,'\xcb':611,'\xcc':333,'\xcd':333,'\xce':333,'\xcf':333,'\xd0':722,'\xd1':667,'\xd2':722,'\xd3':722,'\xd4':722,'\xd5':722,'\xd6':722,'\xd7':675,'\xd8':722,'\xd9':722,'\xda':722,'\xdb':722, '\xdc':722,'\xdd':556,'\xde':611,'\xdf':500,'\xe0':500,'\xe1':500,'\xe2':500,'\xe3':500,'\xe4':500,'\xe5':500,'\xe6':667,'\xe7':444,'\xe8':444,'\xe9':444,'\xea':444,'\xeb':444,'\xec':278,'\xed':278,'\xee':278,'\xef':278,'\xf0':500,'\xf1':500, '\xf2':500,'\xf3':500,'\xf4':500,'\xf5':500,'\xf6':500,'\xf7':675,'\xf8':500,'\xf9':500,'\xfa':500,'\xfb':500,'\xfc':500,'\xfd':444,'\xfe':500,'\xff':444} fpdf_charwidths['zapfdingbats']={ '\x00':0,'\x01':0,'\x02':0,'\x03':0,'\x04':0,'\x05':0,'\x06':0,'\x07':0,'\x08':0,'\t':0,'\n':0,'\x0b':0,'\x0c':0,'\r':0,'\x0e':0,'\x0f':0,'\x10':0,'\x11':0,'\x12':0,'\x13':0,'\x14':0,'\x15':0, '\x16':0,'\x17':0,'\x18':0,'\x19':0,'\x1a':0,'\x1b':0,'\x1c':0,'\x1d':0,'\x1e':0,'\x1f':0,' ':278,'!':974,'"':961,'#':974,'$':980,'%':719,'&':789,'\'':790,'(':791,')':690,'*':960,'+':939, ',':549,'-':855,'.':911,'/':933,'0':911,'1':945,'2':974,'3':755,'4':846,'5':762,'6':761,'7':571,'8':677,'9':763,':':760,';':759,'<':754,'=':494,'>':552,'?':537,'@':577,'A':692, 'B':786,'C':788,'D':788,'E':790,'F':793,'G':794,'H':816,'I':823,'J':789,'K':841,'L':823,'M':833,'N':816,'O':831,'P':923,'Q':744,'R':723,'S':749,'T':790,'U':792,'V':695,'W':776, 'X':768,'Y':792,'Z':759,'[':707,'\\':708,']':682,'^':701,'_':826,'`':815,'a':789,'b':789,'c':707,'d':687,'e':696,'f':689,'g':786,'h':787,'i':713,'j':791,'k':785,'l':791,'m':873, 'n':761,'o':762,'p':762,'q':759,'r':759,'s':892,'t':892,'u':788,'v':784,'w':438,'x':138,'y':277,'z':415,'{':392,'|':392,'}':668,'~':668,'\x7f':0,'\x80':390,'\x81':390,'\x82':317,'\x83':317, '\x84':276,'\x85':276,'\x86':509,'\x87':509,'\x88':410,'\x89':410,'\x8a':234,'\x8b':234,'\x8c':334,'\x8d':334,'\x8e':0,'\x8f':0,'\x90':0,'\x91':0,'\x92':0,'\x93':0,'\x94':0,'\x95':0,'\x96':0,'\x97':0,'\x98':0,'\x99':0, '\x9a':0,'\x9b':0,'\x9c':0,'\x9d':0,'\x9e':0,'\x9f':0,'\xa0':0,'\xa1':732,'\xa2':544,'\xa3':544,'\xa4':910,'\xa5':667,'\xa6':760,'\xa7':760,'\xa8':776,'\xa9':595,'\xaa':694,'\xab':626,'\xac':788,'\xad':788,'\xae':788,'\xaf':788, '\xb0':788,'\xb1':788,'\xb2':788,'\xb3':788,'\xb4':788,'\xb5':788,'\xb6':788,'\xb7':788,'\xb8':788,'\xb9':788,'\xba':788,'\xbb':788,'\xbc':788,'\xbd':788,'\xbe':788,'\xbf':788,'\xc0':788,'\xc1':788,'\xc2':788,'\xc3':788,'\xc4':788,'\xc5':788, '\xc6':788,'\xc7':788,'\xc8':788,'\xc9':788,'\xca':788,'\xcb':788,'\xcc':788,'\xcd':788,'\xce':788,'\xcf':788,'\xd0':788,'\xd1':788,'\xd2':788,'\xd3':788,'\xd4':894,'\xd5':838,'\xd6':1016,'\xd7':458,'\xd8':748,'\xd9':924,'\xda':748,'\xdb':918, '\xdc':927,'\xdd':928,'\xde':928,'\xdf':834,'\xe0':873,'\xe1':828,'\xe2':924,'\xe3':924,'\xe4':917,'\xe5':930,'\xe6':931,'\xe7':463,'\xe8':883,'\xe9':836,'\xea':836,'\xeb':867,'\xec':867,'\xed':696,'\xee':696,'\xef':874,'\xf0':0,'\xf1':874, '\xf2':760,'\xf3':946,'\xf4':771,'\xf5':865,'\xf6':771,'\xf7':888,'\xf8':967,'\xf9':888,'\xfa':831,'\xfb':873,'\xfc':927,'\xfd':970,'\xfe':918,'\xff':0} web2py-2.12.3.orig/gluon/contrib/fpdf/__init__.py0000664000000000000000000000047512564727262020305 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- "FPDF for python" __license__ = "LGPL 3.0" __version__ = "1.7" from fpdf import * try: from html import HTMLMixin except ImportError: import warnings warnings.warn("web2py gluon package not installed, required for html2pdf") from template import Template web2py-2.12.3.orig/gluon/contrib/fpdf/fpdf.py0000664000000000000000000021311412564727262017461 0ustar rootroot#!/usr/bin/env python # -*- coding: latin-1 -*- # **************************************************************************** # * Software: FPDF for python * # * Version: 1.7.1 * # * Date: 2010-09-10 * # * Last update: 2012-08-16 * # * License: LGPL v3.0 * # * * # * Original Author (PHP): Olivier PLATHEY 2004-12-31 * # * Ported to Python 2.4 by Max (maxpat78@yahoo.it) on 2006-05 * # * Maintainer: Mariano Reingart (reingart@gmail.com) et al since 2008 est. * # * NOTE: 'I' and 'D' destinations are disabled, and simply print to STDOUT * # **************************************************************************** from datetime import datetime import math import errno import os, sys, zlib, struct, re, tempfile, struct try: import cPickle as pickle except ImportError: import pickle # Check if PIL is available (tries importing both pypi version and corrected or manually installed versions). # Necessary for JPEG and GIF support. try: try: import Image except: from PIL import Image except ImportError: Image = None from ttfonts import TTFontFile from fonts import fpdf_charwidths from php import substr, sprintf, print_r, UTF8ToUTF16BE, UTF8StringToArray # Global variables FPDF_VERSION = '1.7.1' FPDF_FONT_DIR = os.path.join(os.path.dirname(__file__),'font') SYSTEM_TTFONTS = None PY3K = sys.version_info >= (3, 0) def set_global(var, val): globals()[var] = val class FPDF(object): "PDF Generation class" def __init__(self, orientation='P',unit='mm',format='A4'): # Some checks self._dochecks() # Initialization of properties self.offsets={} # array of object offsets self.page=0 # current page number self.n=2 # current object number self.buffer='' # buffer holding in-memory PDF self.pages={} # array containing pages self.orientation_changes={} # array indicating orientation changes self.state=0 # current document state self.fonts={} # array of used fonts self.font_files={} # array of font files self.diffs={} # array of encoding differences self.images={} # array of used images self.page_links={} # array of links in pages self.links={} # array of internal links self.in_footer=0 # flag set when processing footer self.lastw=0 self.lasth=0 # height of last cell printed self.font_family='' # current font family self.font_style='' # current font style self.font_size_pt=12 # current font size in points self.underline=0 # underlining flag self.draw_color='0 G' self.fill_color='0 g' self.text_color='0 g' self.color_flag=0 # indicates whether fill and text colors are different self.ws=0 # word spacing self.angle=0 # Standard fonts self.core_fonts={'courier':'Courier','courierB':'Courier-Bold','courierI':'Courier-Oblique','courierBI':'Courier-BoldOblique', 'helvetica':'Helvetica','helveticaB':'Helvetica-Bold','helveticaI':'Helvetica-Oblique','helveticaBI':'Helvetica-BoldOblique', 'times':'Times-Roman','timesB':'Times-Bold','timesI':'Times-Italic','timesBI':'Times-BoldItalic', 'symbol':'Symbol','zapfdingbats':'ZapfDingbats'} # Scale factor if(unit=='pt'): self.k=1 elif(unit=='mm'): self.k=72/25.4 elif(unit=='cm'): self.k=72/2.54 elif(unit=='in'): self.k=72 else: self.error('Incorrect unit: '+unit) # Page format if(isinstance(format,basestring)): format=format.lower() if(format=='a3'): format=(841.89,1190.55) elif(format=='a4'): format=(595.28,841.89) elif(format=='a5'): format=(420.94,595.28) elif(format=='letter'): format=(612,792) elif(format=='legal'): format=(612,1008) else: self.error('Unknown page format: '+format) self.fw_pt=format[0] self.fh_pt=format[1] else: self.fw_pt=format[0]*self.k self.fh_pt=format[1]*self.k self.fw=self.fw_pt/self.k self.fh=self.fh_pt/self.k # Page orientation orientation=orientation.lower() if(orientation=='p' or orientation=='portrait'): self.def_orientation='P' self.w_pt=self.fw_pt self.h_pt=self.fh_pt elif(orientation=='l' or orientation=='landscape'): self.def_orientation='L' self.w_pt=self.fh_pt self.h_pt=self.fw_pt else: self.error('Incorrect orientation: '+orientation) self.cur_orientation=self.def_orientation self.w=self.w_pt/self.k self.h=self.h_pt/self.k # Page margins (1 cm) margin=28.35/self.k self.set_margins(margin,margin) # Interior cell margin (1 mm) self.c_margin=margin/10.0 # line width (0.2 mm) self.line_width=.567/self.k # Automatic page break self.set_auto_page_break(1,2*margin) # Full width display mode self.set_display_mode('fullwidth') # Enable compression self.set_compression(1) # Set default PDF version number self.pdf_version='1.3' def set_margins(self, left,top,right=-1): "Set left, top and right margins" self.l_margin=left self.t_margin=top if(right==-1): right=left self.r_margin=right def set_left_margin(self, margin): "Set left margin" self.l_margin=margin if(self.page>0 and self.x0): #Page footer self.in_footer=1 self.footer() self.in_footer=0 #close page self._endpage() #Start new page self._beginpage(orientation) #Set line cap style to square self._out('2 J') #Set line width self.line_width=lw self._out(sprintf('%.2f w',lw*self.k)) #Set font if(family): self.set_font(family,style,size) #Set colors self.draw_color=dc if(dc!='0 G'): self._out(dc) self.fill_color=fc if(fc!='0 g'): self._out(fc) self.text_color=tc self.color_flag=cf #Page header self.header() #Restore line width if(self.line_width!=lw): self.line_width=lw self._out(sprintf('%.2f w',lw*self.k)) #Restore font if(family): self.set_font(family,style,size) #Restore colors if(self.draw_color!=dc): self.draw_color=dc self._out(dc) if(self.fill_color!=fc): self.fill_color=fc self._out(fc) self.text_color=tc self.color_flag=cf def header(self): "Header to be implemented in your own inherited class" pass def footer(self): "Footer to be implemented in your own inherited class" pass def page_no(self): "Get current page number" return self.page def set_draw_color(self, r,g=-1,b=-1): "Set color for all stroking operations" if((r==0 and g==0 and b==0) or g==-1): self.draw_color=sprintf('%.3f G',r/255.0) else: self.draw_color=sprintf('%.3f %.3f %.3f RG',r/255.0,g/255.0,b/255.0) if(self.page>0): self._out(self.draw_color) def set_fill_color(self,r,g=-1,b=-1): "Set color for all filling operations" if((r==0 and g==0 and b==0) or g==-1): self.fill_color=sprintf('%.3f g',r/255.0) else: self.fill_color=sprintf('%.3f %.3f %.3f rg',r/255.0,g/255.0,b/255.0) self.color_flag=(self.fill_color!=self.text_color) if(self.page>0): self._out(self.fill_color) def set_text_color(self, r,g=-1,b=-1): "Set color for text" if((r==0 and g==0 and b==0) or g==-1): self.text_color=sprintf('%.3f g',r/255.0) else: self.text_color=sprintf('%.3f %.3f %.3f rg',r/255.0,g/255.0,b/255.0) self.color_flag=(self.fill_color!=self.text_color) def get_string_width(self, s): "Get width of a string in the current font" cw=self.current_font['cw'] w=0 l=len(s) if self.unifontsubset: for char in s: char = ord(char) if len(cw) > char: w += cw[char] # ord(cw[2*char])<<8 + ord(cw[2*char+1]) #elif (char>0 and char<128 and isset($cw[chr($char)])) { $w += $cw[chr($char)]; } elif (self.current_font['desc']['MissingWidth']) : w += self.current_font['desc']['MissingWidth'] #elif (isset($this->CurrentFont['MissingWidth'])) { $w += $this->CurrentFont['MissingWidth']; } else: w += 500 else: for i in xrange(0, l): w += cw.get(s[i],0) return w*self.font_size/1000.0 def set_line_width(self, width): "Set line width" self.line_width=width if(self.page>0): self._out(sprintf('%.2f w',width*self.k)) def line(self, x1,y1,x2,y2): "Draw a line" self._out(sprintf('%.2f %.2f m %.2f %.2f l S',x1*self.k,(self.h-y1)*self.k,x2*self.k,(self.h-y2)*self.k)) def _set_dash(self, dash_length=False, space_length=False): if(dash_length and space_length): s = sprintf('[%.3f %.3f] 0 d', dash_length*self.k, space_length*self.k) else: s = '[] 0 d' self._out(s) def dashed_line(self, x1,y1,x2,y2, dash_length=1, space_length=1): """Draw a dashed line. Same interface as line() except: - dash_length: Length of the dash - space_length: Length of the space between dashes""" self._set_dash(dash_length, space_length) self.line(x1, y1, x2, y2) self._set_dash() def rect(self, x,y,w,h,style=''): "Draw a rectangle" if(style=='F'): op='f' elif(style=='FD' or style=='DF'): op='B' else: op='S' self._out(sprintf('%.2f %.2f %.2f %.2f re %s',x*self.k,(self.h-y)*self.k,w*self.k,-h*self.k,op)) def add_font(self, family, style='', fname='', uni=False): "Add a TrueType or Type1 font" family = family.lower() if (fname == ''): fname = family.replace(' ','') + style.lower() + '.pkl' if (family == 'arial'): family = 'helvetica' style = style.upper() if (style == 'IB'): style = 'BI' fontkey = family+style if fontkey in self.fonts: # Font already added! return if (uni): global SYSTEM_TTFONTS if os.path.exists(fname): ttffilename = fname elif (FPDF_FONT_DIR and os.path.exists(os.path.join(FPDF_FONT_DIR, fname))): ttffilename = os.path.join(FPDF_FONT_DIR, fname) elif (SYSTEM_TTFONTS and os.path.exists(os.path.join(SYSTEM_TTFONTS, fname))): ttffilename = os.path.join(SYSTEM_TTFONTS, fname) else: raise RuntimeError("TTF Font file not found: %s" % fname) unifilename = os.path.splitext(ttffilename)[0] + '.pkl' name = '' if os.path.exists(unifilename): fh = open(unifilename) try: font_dict = pickle.load(fh) finally: fh.close() else: ttf = TTFontFile() ttf.getMetrics(ttffilename) desc = { 'Ascent': int(round(ttf.ascent, 0)), 'Descent': int(round(ttf.descent, 0)), 'CapHeight': int(round(ttf.capHeight, 0)), 'Flags': ttf.flags, 'FontBBox': "[%s %s %s %s]" % ( int(round(ttf.bbox[0], 0)), int(round(ttf.bbox[1], 0)), int(round(ttf.bbox[2], 0)), int(round(ttf.bbox[3], 0))), 'ItalicAngle': int(ttf.italicAngle), 'StemV': int(round(ttf.stemV, 0)), 'MissingWidth': int(round(ttf.defaultWidth, 0)), } # Generate metrics .pkl file font_dict = { 'name': re.sub('[ ()]', '', ttf.fullName), 'type': 'TTF', 'desc': desc, 'up': round(ttf.underlinePosition), 'ut': round(ttf.underlineThickness), 'ttffile': ttffilename, 'fontkey': fontkey, 'originalsize': os.stat(ttffilename).st_size, 'cw': ttf.charWidths, } try: fh = open(unifilename, "w") pickle.dump(font_dict, fh) fh.close() except IOError, e: if not e.errno == errno.EACCES: raise # Not a permission error. del ttf if hasattr(self,'str_alias_nb_pages'): sbarr = range(0,57) # include numbers in the subset! else: sbarr = range(0,32) self.fonts[fontkey] = { 'i': len(self.fonts)+1, 'type': font_dict['type'], 'name': font_dict['name'], 'desc': font_dict['desc'], 'up': font_dict['up'], 'ut': font_dict['ut'], 'cw': font_dict['cw'], 'ttffile': font_dict['ttffile'], 'fontkey': fontkey, 'subset': sbarr, 'unifilename': unifilename, } self.font_files[fontkey] = {'length1': font_dict['originalsize'], 'type': "TTF", 'ttffile': ttffilename} self.font_files[fname] = {'type': "TTF"} else: fontfile = open(fname) try: font_dict = pickle.load(fontfile) finally: fontfile.close() self.fonts[fontkey] = {'i': len(self.fonts)+1} self.fonts[fontkey].update(font_dict) if (diff): #Search existing encodings d = 0 nb = len(self.diffs) for i in xrange(1, nb+1): if(self.diffs[i] == diff): d = i break if (d == 0): d = nb + 1 self.diffs[d] = diff self.fonts[fontkey]['diff'] = d filename = font_dict.get('filename') if (filename): if (type == 'TrueType'): self.font_files[filename]={'length1': originalsize} else: self.font_files[filename]={'length1': size1, 'length2': size2} def set_font(self, family,style='',size=0): "Select a font; size given in points" family=family.lower() if(family==''): family=self.font_family if(family=='arial'): family='helvetica' elif(family=='symbol' or family=='zapfdingbats'): style='' style=style.upper() if('U' in style): self.underline=1 style=style.replace('U','') else: self.underline=0 if(style=='IB'): style='BI' if(size==0): size=self.font_size_pt #Test if font is already selected if(self.font_family==family and self.font_style==style and self.font_size_pt==size): return #Test if used for the first time fontkey=family+style if fontkey not in self.fonts: #Check if one of the standard fonts if fontkey in self.core_fonts: if fontkey not in fpdf_charwidths: #Load metric file name=os.path.join(FPDF_FONT_DIR,family) if(family=='times' or family=='helvetica'): name+=style.lower() execfile(name+'.font') if fontkey not in fpdf_charwidths: self.error('Could not include font metric file for'+fontkey) i=len(self.fonts)+1 self.fonts[fontkey]={'i':i,'type':'core','name':self.core_fonts[fontkey],'up':-100,'ut':50,'cw':fpdf_charwidths[fontkey]} else: self.error('Undefined font: '+family+' '+style) #Select it self.font_family=family self.font_style=style self.font_size_pt=size self.font_size=size/self.k self.current_font=self.fonts[fontkey] self.unifontsubset = (self.fonts[fontkey]['type'] == 'TTF') if(self.page>0): self._out(sprintf('BT /F%d %.2f Tf ET',self.current_font['i'],self.font_size_pt)) def set_font_size(self, size): "Set font size in points" if(self.font_size_pt==size): return self.font_size_pt=size self.font_size=size/self.k if(self.page>0): self._out(sprintf('BT /F%d %.2f Tf ET',self.current_font['i'],self.font_size_pt)) def add_link(self): "Create a new internal link" n=len(self.links)+1 self.links[n]=(0,0) return n def set_link(self, link,y=0,page=-1): "Set destination of internal link" if(y==-1): y=self.y if(page==-1): page=self.page self.links[link]=[page,y] def link(self, x,y,w,h,link): "Put a link on the page" if not self.page in self.page_links: self.page_links[self.page] = [] self.page_links[self.page] += [(x*self.k,self.h_pt-y*self.k,w*self.k,h*self.k,link),] def text(self, x, y, txt=''): "Output a string" txt = self.normalize_text(txt) if (self.unifontsubset): txt2 = self._escape(UTF8ToUTF16BE(txt, False)) for uni in UTF8StringToArray(txt): self.current_font['subset'].append(uni) else: txt2 = self._escape(txt) s=sprintf('BT %.2f %.2f Td (%s) Tj ET',x*self.k,(self.h-y)*self.k, txt2) if(self.underline and txt!=''): s+=' '+self._dounderline(x,y,txt) if(self.color_flag): s='q '+self.text_color+' '+s+' Q' self._out(s) def rotate(self, angle, x=None, y=None): if x is None: x = self.x if y is None: y = self.y; if self.angle!=0: self._out('Q') self.angle = angle if angle!=0: angle *= math.pi/180; c = math.cos(angle); s = math.sin(angle); cx = x*self.k; cy = (self.h-y)*self.k s = sprintf('q %.5F %.5F %.5F %.5F %.2F %.2F cm 1 0 0 1 %.2F %.2F cm',c,s,-s,c,cx,cy,-cx,-cy) self._out(s) def accept_page_break(self): "Accept automatic page break or not" return self.auto_page_break def cell(self, w,h=0,txt='',border=0,ln=0,align='',fill=0,link=''): "Output a cell" txt = self.normalize_text(txt) k=self.k if(self.y+h>self.page_break_trigger and not self.in_footer and self.accept_page_break()): #Automatic page break x=self.x ws=self.ws if(ws>0): self.ws=0 self._out('0 Tw') self.add_page(self.cur_orientation) self.x=x if(ws>0): self.ws=ws self._out(sprintf('%.3f Tw',ws*k)) if(w==0): w=self.w-self.r_margin-self.x s='' if(fill==1 or border==1): if(fill==1): if border==1: op='B' else: op='f' else: op='S' s=sprintf('%.2f %.2f %.2f %.2f re %s ',self.x*k,(self.h-self.y)*k,w*k,-h*k,op) if(isinstance(border,basestring)): x=self.x y=self.y if('L' in border): s+=sprintf('%.2f %.2f m %.2f %.2f l S ',x*k,(self.h-y)*k,x*k,(self.h-(y+h))*k) if('T' in border): s+=sprintf('%.2f %.2f m %.2f %.2f l S ',x*k,(self.h-y)*k,(x+w)*k,(self.h-y)*k) if('R' in border): s+=sprintf('%.2f %.2f m %.2f %.2f l S ',(x+w)*k,(self.h-y)*k,(x+w)*k,(self.h-(y+h))*k) if('B' in border): s+=sprintf('%.2f %.2f m %.2f %.2f l S ',x*k,(self.h-(y+h))*k,(x+w)*k,(self.h-(y+h))*k) if(txt!=''): if(align=='R'): dx=w-self.c_margin-self.get_string_width(txt) elif(align=='C'): dx=(w-self.get_string_width(txt))/2.0 else: dx=self.c_margin if(self.color_flag): s+='q '+self.text_color+' ' # If multibyte, Tw has no effect - do word spacing using an adjustment before each space if (self.ws and self.unifontsubset): for uni in UTF8StringToArray(txt): self.current_font['subset'].append(uni) space = self._escape(UTF8ToUTF16BE(' ', False)) s += sprintf('BT 0 Tw %.2F %.2F Td [',(self.x + dx) * k,(self.h - (self.y + 0.5*h+ 0.3 * self.font_size)) * k) t = txt.split(' ') numt = len(t) for i in range(numt): tx = t[i] tx = '(' + self._escape(UTF8ToUTF16BE(tx, False)) + ')' s += sprintf('%s ', tx); if ((i+1)0): #Go to next line self.y+=h if(ln==1): self.x=self.l_margin else: self.x+=w def multi_cell(self, w, h, txt='', border=0, align='J', fill=0, split_only=False): "Output text with automatic or explicit line breaks" txt = self.normalize_text(txt) ret = [] # if split_only = True, returns splited text cells cw=self.current_font['cw'] if(w==0): w=self.w-self.r_margin-self.x wmax=(w-2*self.c_margin)*1000.0/self.font_size s=txt.replace("\r",'') nb=len(s) if(nb>0 and s[nb-1]=="\n"): nb-=1 b=0 if(border): if(border==1): border='LTRB' b='LRT' b2='LR' else: b2='' if('L' in border): b2+='L' if('R' in border): b2+='R' if ('T' in border): b=b2+'T' else: b=b2 sep=-1 i=0 j=0 l=0 ns=0 nl=1 while(i0): self.ws=0 if not split_only: self._out('0 Tw') if not split_only: self.cell(w,h,substr(s,j,i-j),b,2,align,fill) else: ret.append(substr(s,j,i-j)) i+=1 sep=-1 j=i l=0 ns=0 nl+=1 if(border and nl==2): b=b2 continue if(c==' '): sep=i ls=l ns+=1 if self.unifontsubset: l += self.get_string_width(c) / self.font_size*1000.0 else: l += cw.get(c,0) if(l>wmax): #Automatic line break if(sep==-1): if(i==j): i+=1 if(self.ws>0): self.ws=0 if not split_only: self._out('0 Tw') if not split_only: self.cell(w,h,substr(s,j,i-j),b,2,align,fill) else: ret.append(substr(s,j,i-j)) else: if(align=='J'): if ns>1: self.ws=(wmax-ls)/1000.0*self.font_size/(ns-1) else: self.ws=0 if not split_only: self._out(sprintf('%.3f Tw',self.ws*self.k)) if not split_only: self.cell(w,h,substr(s,j,sep-j),b,2,align,fill) else: ret.append(substr(s,j,sep-j)) i=sep+1 sep=-1 j=i l=0 ns=0 nl+=1 if(border and nl==2): b=b2 else: i+=1 #Last chunk if(self.ws>0): self.ws=0 if not split_only: self._out('0 Tw') if(border and 'B' in border): b+='B' if not split_only: self.cell(w,h,substr(s,j,i-j),b,2,align,fill) self.x=self.l_margin else: ret.append(substr(s,j,i-j)) return ret def write(self, h, txt='', link=''): "Output text in flowing mode" txt = self.normalize_text(txt) cw=self.current_font['cw'] w=self.w-self.r_margin-self.x wmax=(w-2*self.c_margin)*1000.0/self.font_size s=txt.replace("\r",'') nb=len(s) sep=-1 i=0 j=0 l=0 nl=1 while(iwmax): #Automatic line break if(sep==-1): if(self.x>self.l_margin): #Move to next line self.x=self.l_margin self.y+=h w=self.w-self.r_margin-self.x wmax=(w-2*self.c_margin)*1000.0/self.font_size i+=1 nl+=1 continue if(i==j): i+=1 self.cell(w,h,substr(s,j,i-j),0,2,'',0,link) else: self.cell(w,h,substr(s,j,sep-j),0,2,'',0,link) i=sep+1 sep=-1 j=i l=0 if(nl==1): self.x=self.l_margin w=self.w-self.r_margin-self.x wmax=(w-2*self.c_margin)*1000.0/self.font_size nl+=1 else: i+=1 #Last chunk if(i!=j): self.cell(l/1000.0*self.font_size,h,substr(s,j),0,0,'',0,link) def image(self, name, x=None, y=None, w=0,h=0,type='',link=''): "Put an image on the page" if not name in self.images: #First use of image, get info if(type==''): pos=name.rfind('.') if(not pos): self.error('image file has no extension and no type was specified: '+name) type=substr(name,pos+1) type=type.lower() if(type=='jpg' or type=='jpeg'): info=self._parsejpg(name) elif(type=='png'): info=self._parsepng(name) else: #Allow for additional formats #maybe the image is not showing the correct extension, #but the header is OK, succeed_parsing = False #try all the parsing functions parsing_functions = [self._parsejpg,self._parsepng,self._parsegif] for pf in parsing_functions: try: info = pf(name) succeed_parsing = True break; except: pass #last resource if not succeed_parsing: mtd='_parse'+type if not hasattr(self,mtd): self.error('Unsupported image type: '+type) info=getattr(self, mtd)(name) mtd='_parse'+type if not hasattr(self,mtd): self.error('Unsupported image type: '+type) info=getattr(self, mtd)(name) info['i']=len(self.images)+1 self.images[name]=info else: info=self.images[name] #Automatic width and height calculation if needed if(w==0 and h==0): #Put image at 72 dpi w=info['w']/self.k h=info['h']/self.k elif(w==0): w=h*info['w']/info['h'] elif(h==0): h=w*info['h']/info['w'] # Flowing mode if y is None: if (self.y + h > self.page_break_trigger and not self.in_footer and self.accept_page_break()): #Automatic page break x = self.x self.add_page(self.cur_orientation) self.x = x y = self.y self.y += h if x is None: x = self.x self._out(sprintf('q %.2f 0 0 %.2f %.2f %.2f cm /I%d Do Q',w*self.k,h*self.k,x*self.k,(self.h-(y+h))*self.k,info['i'])) if(link): self.link(x,y,w,h,link) def ln(self, h=''): "Line Feed; default value is last cell height" self.x=self.l_margin if(isinstance(h, basestring)): self.y+=self.lasth else: self.y+=h def get_x(self): "Get x position" return self.x def set_x(self, x): "Set x position" if(x>=0): self.x=x else: self.x=self.w+x def get_y(self): "Get y position" return self.y def set_y(self, y): "Set y position and reset x" self.x=self.l_margin if(y>=0): self.y=y else: self.y=self.h+y def set_xy(self, x,y): "Set x and y positions" self.set_y(y) self.set_x(x) def output(self, name='',dest=''): "Output PDF to some destination" #Finish document if necessary if(self.state<3): self.close() dest=dest.upper() if(dest==''): if(name==''): name='doc.pdf' dest='I' else: dest='F' if dest=='I': print self.buffer elif dest=='D': print self.buffer elif dest=='F': #Save to local file f=open(name,'wb') if(not f): self.error('Unable to create output file: '+name) if PY3K: # TODO: proper unicode support f.write(self.buffer.encode("latin1")) else: f.write(self.buffer) f.close() elif dest=='S': #Return as a string return self.buffer else: self.error('Incorrect output destination: '+dest) return '' def normalize_text(self, txt): "Check that text input is in the correct format/encoding" # - for TTF unicode fonts: unicode object (utf8 encoding) # - for built-in fonts: string instances (latin 1 encoding) if self.unifontsubset and isinstance(txt, str): txt = txt.decode('utf8') elif not self.unifontsubset and isinstance(txt, unicode) and not PY3K: txt = txt.encode('latin1') return txt def _dochecks(self): #Check for locale-related bug # if(1.1==1): # self.error("Don\'t alter the locale before including class file"); #Check for decimal separator if(sprintf('%.1f',1.0)!='1.0'): import locale locale.setlocale(locale.LC_NUMERIC,'C') def _getfontpath(self): return FPDF_FONT_DIR+'/' def _putpages(self): nb=self.page if hasattr(self,'str_alias_nb_pages'): # Replace number of pages in fonts using subsets (unicode) alias = UTF8ToUTF16BE(self.str_alias_nb_pages, False); r = UTF8ToUTF16BE(str(nb), False) for n in xrange(1, nb+1): self.pages[n] = self.pages[n].replace(alias, r) # Now repeat for no pages in non-subset fonts for n in xrange(1,nb+1): self.pages[n]=self.pages[n].replace(self.str_alias_nb_pages,str(nb)) if(self.def_orientation=='P'): w_pt=self.fw_pt h_pt=self.fh_pt else: w_pt=self.fh_pt h_pt=self.fw_pt if self.compress: filter='/Filter /FlateDecode ' else: filter='' for n in xrange(1,nb+1): #Page self._newobj() self._out('<>>>' else: l=self.links[pl[4]] if l[0] in self.orientation_changes: h=w_pt else: h=h_pt annots+=sprintf('/Dest [%d 0 R /XYZ 0 %.2f null]>>',1+2*l[0],h-l[1]*self.k) self._out(annots+']') if(self.pdf_version>'1.3'): self._out('/Group <>') self._out('/Contents '+str(self.n+1)+' 0 R>>') self._out('endobj') #Page content if self.compress: p = zlib.compress(self.pages[n]) else: p = self.pages[n] self._newobj() self._out('<<'+filter+'/Length '+str(len(p))+'>>') self._putstream(p) self._out('endobj') #Pages root self.offsets[1]=len(self.buffer) self._out('1 0 obj') self._out('<>') self._out('endobj') def _putfonts(self): nf=self.n for diff in self.diffs: #Encodings self._newobj() self._out('<>') self._out('endobj') for name,info in self.font_files.iteritems(): if 'type' in info and info['type'] != 'TTF': #Font file embedding self._newobj() self.font_files[name]['n']=self.n font='' f=open(self._getfontpath()+name,'rb',1) if(not f): self.error('Font file not found') font=f.read() f.close() compressed=(substr(name,-2)=='.z') if(not compressed and 'length2' in info): header=(ord(font[0])==128) if(header): #Strip first binary header font=substr(font,6) if(header and ord(font[info['length1']])==128): #Strip second binary header font=substr(font,0,info['length1'])+substr(font,info['length1']+6) self._out('<>') self._putstream(font) self._out('endobj') for k,font in self.fonts.iteritems(): #Font objects self.fonts[k]['n']=self.n+1 type=font['type'] name=font['name'] if(type=='core'): #Standard font self._newobj() self._out('<>') self._out('endobj') elif(type=='Type1' or type=='TrueType'): #Additional Type1 or TrueType font self._newobj() self._out('<>') self._out('endobj') #Widths self._newobj() cw=font['cw'] s='[' for i in xrange(32,256): # Get doesn't rise exception; returns 0 instead of None if not set s+=str(cw.get(chr(i)) or 0)+' ' self._out(s+']') self._out('endobj') #Descriptor self._newobj() s='<>') self._out('endobj') elif (type == 'TTF'): self.fonts[k]['n'] = self.n + 1 ttf = TTFontFile() fontname = 'MPDFAA' + '+' + font['name'] subset = font['subset'] del subset[0] ttfontstream = ttf.makeSubset(font['ttffile'], subset) ttfontsize = len(ttfontstream) fontstream = zlib.compress(ttfontstream) codeToGlyph = ttf.codeToGlyph ##del codeToGlyph[0] # Type0 Font # A composite font - a font composed of other fonts, organized hierarchically self._newobj() self._out('<>') self._out('endobj') # CIDFontType2 # A CIDFont whose glyph descriptions are based on TrueType font technology self._newobj() self._out('<>') self._out('endobj') # ToUnicode self._newobj() toUni = "/CIDInit /ProcSet findresource begin\n" \ "12 dict begin\n" \ "begincmap\n" \ "/CIDSystemInfo\n" \ "<> def\n" \ "/CMapName /Adobe-Identity-UCS def\n" \ "/CMapType 2 def\n" \ "1 begincodespacerange\n" \ "<0000> \n" \ "endcodespacerange\n" \ "1 beginbfrange\n" \ "<0000> <0000>\n" \ "endbfrange\n" \ "endcmap\n" \ "CMapName currentdict /CMap defineresource pop\n" \ "end\n" \ "end" self._out('<>') self._putstream(toUni) self._out('endobj') # CIDSystemInfo dictionary self._newobj() self._out('<>') self._out('endobj') # Font descriptor self._newobj() self._out('<>') self._out('endobj') # Embed CIDToGIDMap # A specification of the mapping from CIDs to glyph indices cidtogidmap = ''; cidtogidmap = ["\x00"] * 256*256*2 for cc, glyph in codeToGlyph.items(): cidtogidmap[cc*2] = chr(glyph >> 8) cidtogidmap[cc*2 + 1] = chr(glyph & 0xFF) cidtogidmap = zlib.compress(''.join(cidtogidmap)); self._newobj() self._out('<>') self._putstream(cidtogidmap) self._out('endobj') #Font file self._newobj() self._out('<>') self._putstream(fontstream) self._out('endobj') del ttf else: #Allow for additional types mtd='_put'+type.lower() if(not method_exists(self,mtd)): self.error('Unsupported font type: '+type) self.mtd(font) def _putTTfontwidths(self, font, maxUni): cw127fname = os.path.splitext(font['unifilename'])[0] + '.cw127.pkl' if (os.path.exists(cw127fname)): fh = open(cw127fname); try: font_dict = pickle.load(fh) finally: fh.close() rangeid = font_dict['rangeid'] range_ = font_dict['range'] prevcid = font_dict['prevcid'] prevwidth = font_dict['prevwidth'] interval = font_dict['interval'] range_interval = font_dict['range_interval'] startcid = 128 else: rangeid = 0 range_ = {} range_interval = {} prevcid = -2 prevwidth = -1 interval = False startcid = 1 cwlen = maxUni + 1 # for each character for cid in range(startcid, cwlen): if (cid==128 and not os.path.exists(cw127fname)): try: fh = open(cw127fname, "wb") font_dict = {} font_dict['rangeid'] = rangeid font_dict['prevcid'] = prevcid font_dict['prevwidth'] = prevwidth font_dict['interval'] = interval font_dict['range_interval'] = range_interval font_dict['range'] = range_ pickle.dump(font_dict, fh) fh.close() except IOError, e: if not e.errno == errno.EACCES: raise # Not a permission error. if (font['cw'][cid] == 0): continue width = font['cw'][cid] if (width == 65535): width = 0 if (cid > 255 and (cid not in font['subset']) or not cid): # continue if ('dw' not in font or (font['dw'] and width != font['dw'])): if (cid == (prevcid + 1)): if (width == prevwidth): if (width == range_[rangeid][0]): range_.setdefault(rangeid, []).append(width) else: range_[rangeid].pop() # new range rangeid = prevcid range_[rangeid] = [prevwidth, width] interval = True range_interval[rangeid] = True else: if (interval): # new range rangeid = cid range_[rangeid] = [width] else: range_[rangeid].append(width) interval = False else: rangeid = cid range_[rangeid] = [width] interval = False prevcid = cid prevwidth = width prevk = -1 nextk = -1 prevint = False for k, ws in sorted(range_.items()): cws = len(ws) if (k == nextk and not prevint and (not k in range_interval or cws < 3)): if (k in range_interval): del range_interval[k] range_[prevk] = range_[prevk] + range_[k] del range_[k] else: prevk = k nextk = k + cws if (k in range_interval): prevint = (cws > 3) del range_interval[k] nextk -= 1 else: prevint = False w = [] for k, ws in sorted(range_.items()): if (len(set(ws)) == 1): w.append(' %s %s %s' % (k, k + len(ws) - 1, ws[0])) else: w.append(' %s [ %s ]\n' % (k, ' '.join([str(int(h)) for h in ws]))) ## self._out('/W [%s]' % ''.join(w)) def _putimages(self): filter='' if self.compress: filter='/Filter /FlateDecode ' for filename,info in self.images.iteritems(): self._putimage(info) del info['data'] if 'smask' in info: del info['smask'] def _putimage(self, info): if 'data' in info: self._newobj() info['n']=self.n self._out('<>') if('trns' in info and isinstance(info['trns'], list)): trns='' for i in xrange(0,len(info['trns'])): trns+=str(info['trns'][i])+' '+str(info['trns'][i])+' ' self._out('/Mask ['+trns+']') if('smask' in info): self._out('/SMask ' + str(self.n+1) + ' 0 R'); self._out('/Length '+str(len(info['data']))+'>>') self._putstream(info['data']) self._out('endobj') # Soft mask if('smask' in info): dp = '/Predictor 15 /Colors 1 /BitsPerComponent 8 /Columns ' + str(info['w']) smask = {'w': info['w'], 'h': info['h'], 'cs': 'DeviceGray', 'bpc': 8, 'f': info['f'], 'dp': dp, 'data': info['smask']} self._putimage(smask) #Palette if(info['cs']=='Indexed'): self._newobj() filter = self.compress and '/Filter /FlateDecode ' or '' if self.compress: pal=zlib.compress(info['pal']) else: pal=info['pal'] self._out('<<'+filter+'/Length '+str(len(pal))+'>>') self._putstream(pal) self._out('endobj') def _putxobjectdict(self): for image in self.images.values(): self._out('/I'+str(image['i'])+' '+str(image['n'])+' 0 R') def _putresourcedict(self): self._out('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]') self._out('/Font <<') for font in self.fonts.values(): self._out('/F'+str(font['i'])+' '+str(font['n'])+' 0 R') self._out('>>') self._out('/XObject <<') self._putxobjectdict() self._out('>>') def _putresources(self): self._putfonts() self._putimages() #Resource dictionary self.offsets[2]=len(self.buffer) self._out('2 0 obj') self._out('<<') self._putresourcedict() self._out('>>') self._out('endobj') def _putinfo(self): self._out('/Producer '+self._textstring('PyFPDF '+FPDF_VERSION+' http://pyfpdf.googlecode.com/')) if hasattr(self,'title'): self._out('/Title '+self._textstring(self.title)) if hasattr(self,'subject'): self._out('/Subject '+self._textstring(self.subject)) if hasattr(self,'author'): self._out('/Author '+self._textstring(self.author)) if hasattr (self,'keywords'): self._out('/Keywords '+self._textstring(self.keywords)) if hasattr(self,'creator'): self._out('/Creator '+self._textstring(self.creator)) self._out('/CreationDate '+self._textstring('D:'+datetime.now().strftime('%Y%m%d%H%M%S'))) def _putcatalog(self): self._out('/Type /Catalog') self._out('/Pages 1 0 R') if(self.zoom_mode=='fullpage'): self._out('/OpenAction [3 0 R /Fit]') elif(self.zoom_mode=='fullwidth'): self._out('/OpenAction [3 0 R /FitH null]') elif(self.zoom_mode=='real'): self._out('/OpenAction [3 0 R /XYZ null null 1]') elif(not isinstance(self.zoom_mode,basestring)): self._out('/OpenAction [3 0 R /XYZ null null '+(self.zoom_mode/100)+']') if(self.layout_mode=='single'): self._out('/PageLayout /SinglePage') elif(self.layout_mode=='continuous'): self._out('/PageLayout /OneColumn') elif(self.layout_mode=='two'): self._out('/PageLayout /TwoColumnLeft') def _putheader(self): self._out('%PDF-'+self.pdf_version) def _puttrailer(self): self._out('/Size '+str(self.n+1)) self._out('/Root '+str(self.n)+' 0 R') self._out('/Info '+str(self.n-1)+' 0 R') def _enddoc(self): self._putheader() self._putpages() self._putresources() #Info self._newobj() self._out('<<') self._putinfo() self._out('>>') self._out('endobj') #Catalog self._newobj() self._out('<<') self._putcatalog() self._out('>>') self._out('endobj') #Cross-ref o=len(self.buffer) self._out('xref') self._out('0 '+(str(self.n+1))) self._out('0000000000 65535 f ') for i in xrange(1,self.n+1): self._out(sprintf('%010d 00000 n ',self.offsets[i])) #Trailer self._out('trailer') self._out('<<') self._puttrailer() self._out('>>') self._out('startxref') self._out(o) self._out('%%EOF') self.state=3 def _beginpage(self, orientation): self.page+=1 self.pages[self.page]='' self.state=2 self.x=self.l_margin self.y=self.t_margin self.font_family='' #Page orientation if(not orientation): orientation=self.def_orientation else: orientation=orientation[0].upper() if(orientation!=self.def_orientation): self.orientation_changes[self.page]=1 if(orientation!=self.cur_orientation): #Change orientation if(orientation=='P'): self.w_pt=self.fw_pt self.h_pt=self.fh_pt self.w=self.fw self.h=self.fh else: self.w_pt=self.fh_pt self.h_pt=self.fw_pt self.w=self.fh self.h=self.fw self.page_break_trigger=self.h-self.b_margin self.cur_orientation=orientation def _endpage(self): #End of page contents self.state=1 def _newobj(self): #Begin a new object self.n+=1 self.offsets[self.n]=len(self.buffer) self._out(str(self.n)+' 0 obj') def _dounderline(self, x,y,txt): #Underline text up=self.current_font['up'] ut=self.current_font['ut'] w=self.get_string_width(txt)+self.ws*txt.count(' ') return sprintf('%.2f %.2f %.2f %.2f re f',x*self.k,(self.h-(y-up/1000.0*self.font_size))*self.k,w*self.k,-ut/1000.0*self.font_size_pt) def _parsejpg(self, filename): # Extract info from a JPEG file if Image is None: self.error('PIL not installed') try: f = open(filename, 'rb') im = Image.open(f) except Exception, e: self.error('Missing or incorrect image file: %s. error: %s' % (filename, str(e))) else: a = im.size # We shouldn't get into here, as Jpeg is RGB=8bpp right(?), but, just in case... bpc=8 if im.mode == 'RGB': colspace='DeviceRGB' elif im.mode == 'CMYK': colspace='DeviceCMYK' else: colspace='DeviceGray' # Read whole file from the start f.seek(0) data = f.read() f.close() return {'w':a[0],'h':a[1],'cs':colspace,'bpc':bpc,'f':'DCTDecode','data':data} def _parsegif(self, filename): # Extract info from a GIF file (via PNG conversion) if Image is None: self.error('PIL is required for GIF support') try: im = Image.open(filename) except Exception, e: self.error('Missing or incorrect image file: %s. error: %s' % (filename, str(e))) else: # Use temporary file f = tempfile.NamedTemporaryFile(delete=False, suffix=".png") tmp = f.name f.close() if "transparency" in im.info: im.save(tmp, transparency = im.info['transparency']) else: im.save(tmp) info = self._parsepng(tmp) os.unlink(tmp) return info def _parsepng(self, name): #Extract info from a PNG file if name.startswith("http://") or name.startswith("https://"): import urllib f = urllib.urlopen(name) else: f=open(name,'rb') if(not f): self.error("Can't open image file: "+name) #Check signature if(f.read(8)!='\x89'+'PNG'+'\r'+'\n'+'\x1a'+'\n'): self.error('Not a PNG file: '+name) #Read header chunk f.read(4) if(f.read(4)!='IHDR'): self.error('Incorrect PNG file: '+name) w=self._freadint(f) h=self._freadint(f) bpc=ord(f.read(1)) if(bpc>8): self.error('16-bit depth not supported: '+name) ct=ord(f.read(1)) if(ct==0 or ct==4): colspace='DeviceGray' elif(ct==2 or ct==6): colspace='DeviceRGB' elif(ct==3): colspace='Indexed' else: self.error('Unknown color type: '+name) if(ord(f.read(1))!=0): self.error('Unknown compression method: '+name) if(ord(f.read(1))!=0): self.error('Unknown filter method: '+name) if(ord(f.read(1))!=0): self.error('Interlacing not supported: '+name) f.read(4) dp='/Predictor 15 /Colors ' if colspace == 'DeviceRGB': dp+='3' else: dp+='1' dp+=' /BitsPerComponent '+str(bpc)+' /Columns '+str(w)+'' #Scan chunks looking for palette, transparency and image data pal='' trns='' data='' n=1 while n != None: n=self._freadint(f) type=f.read(4) if(type=='PLTE'): #Read palette pal=f.read(n) f.read(4) elif(type=='tRNS'): #Read transparency info t=f.read(n) if(ct==0): trns=[ord(substr(t,1,1)),] elif(ct==2): trns=[ord(substr(t,1,1)),ord(substr(t,3,1)),ord(substr(t,5,1))] else: pos=t.find('\x00') if(pos!=-1): trns=[pos,] f.read(4) elif(type=='IDAT'): #Read image data block data+=f.read(n) f.read(4) elif(type=='IEND'): break else: f.read(n+4) if(colspace=='Indexed' and not pal): self.error('Missing palette in '+name) f.close() info = {'w':w,'h':h,'cs':colspace,'bpc':bpc,'f':'FlateDecode','dp':dp,'pal':pal,'trns':trns,} if(ct>=4): # Extract alpha channel data = zlib.decompress(data) color = ''; alpha = ''; if(ct==4): # Gray image length = 2*w for i in range(h): pos = (1+length)*i color += data[pos] alpha += data[pos] line = substr(data, pos+1, length) color += re.sub('(.).',lambda m: m.group(1),line, flags=re.DOTALL) alpha += re.sub('.(.)',lambda m: m.group(1),line, flags=re.DOTALL) else: # RGB image length = 4*w for i in range(h): pos = (1+length)*i color += data[pos] alpha += data[pos] line = substr(data, pos+1, length) color += re.sub('(.{3}).',lambda m: m.group(1),line, flags=re.DOTALL) alpha += re.sub('.{3}(.)',lambda m: m.group(1),line, flags=re.DOTALL) del data data = zlib.compress(color) info['smask'] = zlib.compress(alpha) if (self.pdf_version < '1.4'): self.pdf_version = '1.4' info['data'] = data return info def _freadint(self, f): #Read a 4-byte integer from file try: return struct.unpack('>I', f.read(4))[0] except: return None def _textstring(self, s): #Format a text string return '('+self._escape(s)+')' def _escape(self, s): #Add \ before \, ( and ) return s.replace('\\','\\\\').replace(')','\\)').replace('(','\\(').replace('\r','\\r') def _putstream(self, s): self._out('stream') self._out(s) self._out('endstream') def _out(self, s): #Add a line to the document if(self.state==2): self.pages[self.page]+=s+"\n" else: self.buffer+=str(s)+"\n" def interleaved2of5(self, txt, x, y, w=1.0, h=10.0): "Barcode I2of5 (numeric), adds a 0 if odd lenght" narrow = w / 3.0 wide = w # wide/narrow codes for the digits bar_char={'0': 'nnwwn', '1': 'wnnnw', '2': 'nwnnw', '3': 'wwnnn', '4': 'nnwnw', '5': 'wnwnn', '6': 'nwwnn', '7': 'nnnww', '8': 'wnnwn', '9': 'nwnwn', 'A': 'nn', 'Z': 'wn'} self.set_fill_color(0) code = txt # add leading zero if code-length is odd if len(code) % 2 != 0: code = '0' + code # add start and stop codes code = 'AA' + code.lower() + 'ZA' for i in xrange(0, len(code), 2): # choose next pair of digits char_bar = code[i] char_space = code[i+1] # check whether it is a valid digit if not char_bar in bar_char.keys(): raise RuntimeError ('Char "%s" invalid for I25: ' % char_bar) if not char_space in bar_char.keys(): raise RuntimeError ('Char "%s" invalid for I25: ' % char_space) # create a wide/narrow-seq (first digit=bars, second digit=spaces) seq = '' for s in xrange(0, len(bar_char[char_bar])): seq += bar_char[char_bar][s] + bar_char[char_space][s] for bar in xrange(0, len(seq)): # set line_width depending on value if seq[bar] == 'n': line_width = narrow else: line_width = wide # draw every second value, the other is represented by space if bar % 2 == 0: self.rect(x, y, line_width, h, 'F') x += line_width def code39(self, txt, x, y, w=1.5, h=5.0): "Barcode 3of9" wide = w narrow = w / 3.0 gap = narrow bar_char={'0': 'nnnwwnwnn', '1': 'wnnwnnnnw', '2': 'nnwwnnnnw', '3': 'wnwwnnnnn', '4': 'nnnwwnnnw', '5': 'wnnwwnnnn', '6': 'nnwwwnnnn', '7': 'nnnwnnwnw', '8': 'wnnwnnwnn', '9': 'nnwwnnwnn', 'A': 'wnnnnwnnw', 'B': 'nnwnnwnnw', 'C': 'wnwnnwnnn', 'D': 'nnnnwwnnw', 'E': 'wnnnwwnnn', 'F': 'nnwnwwnnn', 'G': 'nnnnnwwnw', 'H': 'wnnnnwwnn', 'I': 'nnwnnwwnn', 'J': 'nnnnwwwnn', 'K': 'wnnnnnnww', 'L': 'nnwnnnnww', 'M': 'wnwnnnnwn', 'N': 'nnnnwnnww', 'O': 'wnnnwnnwn', 'P': 'nnwnwnnwn', 'Q': 'nnnnnnwww', 'R': 'wnnnnnwwn', 'S': 'nnwnnnwwn', 'T': 'nnnnwnwwn', 'U': 'wwnnnnnnw', 'V': 'nwwnnnnnw', 'W': 'wwwnnnnnn', 'X': 'nwnnwnnnw', 'Y': 'wwnnwnnnn', 'Z': 'nwwnwnnnn', '-': 'nwnnnnwnw', '.': 'wwnnnnwnn', ' ': 'nwwnnnwnn', '*': 'nwnnwnwnn', '$': 'nwnwnwnnn', '/': 'nwnwnnnwn', '+': 'nwnnnwnwn', '%': 'nnnwnwnwn'} self.set_fill_color(0) code = txt code = code.upper() for i in xrange (0, len(code), 2): char_bar = code[i] if not char_bar in bar_char.keys(): raise RuntimeError ('Char "%s" invalid for Code39' % char_bar) seq= '' for s in xrange(0, len(bar_char[char_bar])): seq += bar_char[char_bar][s] for bar in xrange(0, len(seq)): if seq[bar] == 'n': line_width = narrow else: line_width = wide if bar % 2 == 0: self.rect(x, y, line_width, h, 'F') x += line_width x += gap web2py-2.12.3.orig/gluon/contrib/fpdf/template.py0000664000000000000000000002724512564727262020365 0ustar rootroot# -*- coding: iso-8859-1 -*- "PDF Template Helper for FPDF.py" __author__ = "Mariano Reingart " __copyright__ = "Copyright (C) 2010 Mariano Reingart" __license__ = "LGPL 3.0" import sys,os,csv from fpdf import FPDF def rgb(col): return (col // 65536), (col // 256 % 256), (col% 256) class Template: def __init__(self, infile=None, elements=None, format='A4', orientation='portrait', title='', author='', subject='', creator='', keywords=''): if elements: self.elements = elements self.keys = [v['name'].lower() for v in self.elements] self.handlers = {'T': self.text, 'L': self.line, 'I': self.image, 'B': self.rect, 'BC': self.barcode, } self.pg_no = 0 self.texts = {} pdf = self.pdf = FPDF(format=format,orientation=orientation, unit="mm") pdf.set_title(title) pdf.set_author(author) pdf.set_creator(creator) pdf.set_subject(subject) pdf.set_keywords(keywords) def parse_csv(self, infile, delimiter=",", decimal_sep="."): "Parse template format csv file and create elements dict" keys = ('name','type','x1','y1','x2','y2','font','size', 'bold','italic','underline','foreground','background', 'align','text','priority', 'multiline') self.elements = [] for row in csv.reader(open(infile, 'rb'), delimiter=delimiter): kargs = {} for i,v in enumerate(row): if not v.startswith("'") and decimal_sep!=".": v = v.replace(decimal_sep,".") else: v = v if v=='': v = None else: v = eval(v.strip()) kargs[keys[i]] = v self.elements.append(kargs) self.keys = [v['name'].lower() for v in self.elements] def add_page(self): self.pg_no += 1 self.texts[self.pg_no] = {} def __setitem__(self, name, value): if self.has_key(name): if isinstance(value,unicode): value = value.encode("latin1","ignore") elif value is None: value = "" else: value = str(value) self.texts[self.pg_no][name.lower()] = value # setitem shortcut (may be further extended) set = __setitem__ def has_key(self, name): return name.lower() in self.keys def __getitem__(self, name): if self.has_key(name): key = name.lower() if key in self.texts: # text for this page: return self.texts[self.pg_no][key] else: # find first element for default text: elements = [element for element in self.elements if element['name'].lower() == key] if elements: return elements[0]['text'] def split_multicell(self, text, element_name): "Divide (\n) a string using a given element width" pdf = self.pdf element = [element for element in self.elements if element['name'].lower() == element_name.lower()][0] style = "" if element['bold']: style += "B" if element['italic']: style += "I" if element['underline']: style += "U" pdf.set_font(element['font'],style,element['size']) align = {'L':'L','R':'R','I':'L','D':'R','C':'C','':''}.get(element['align']) # D/I in spanish if isinstance(text, unicode): text = text.encode("latin1","ignore") else: text = str(text) return pdf.multi_cell(w=element['x2']-element['x1'], h=element['y2']-element['y1'], txt=text,align=align,split_only=True) def render(self, outfile, dest="F"): pdf = self.pdf for pg in range(1, self.pg_no+1): pdf.add_page() pdf.set_font('Arial','B',16) pdf.set_auto_page_break(False,margin=0) for element in sorted(self.elements,key=lambda x: x['priority']): # make a copy of the element: element = dict(element) element['text'] = self.texts[pg].get(element['name'].lower(), element['text']) if 'rotate' in element: pdf.rotate(element['rotate'], element['x1'], element['y1']) self.handlers[element['type'].upper()](pdf, **element) if 'rotate' in element: pdf.rotate(0) return pdf.output(outfile, dest) def text(self, pdf, x1=0, y1=0, x2=0, y2=0, text='', font="arial", size=10, bold=False, italic=False, underline=False, align="", foreground=0, backgroud=65535, multiline=None, *args, **kwargs): if text: if pdf.text_color!=rgb(foreground): pdf.set_text_color(*rgb(foreground)) if pdf.fill_color!=rgb(backgroud): pdf.set_fill_color(*rgb(backgroud)) font = font.strip().lower() if font == 'arial black': font = 'arial' style = "" for tag in 'B', 'I', 'U': if (text.startswith("<%s>" % tag) and text.endswith("" %tag)): text = text[3:-4] style += tag if bold: style += "B" if italic: style += "I" if underline: style += "U" align = {'L':'L','R':'R','I':'L','D':'R','C':'C','':''}.get(align) # D/I in spanish pdf.set_font(font,style,size) ##m_k = 72 / 2.54 ##h = (size/m_k) pdf.set_xy(x1,y1) if multiline is None: # multiline==None: write without wrapping/trimming (default) pdf.cell(w=x2-x1,h=y2-y1,txt=text,border=0,ln=0,align=align) elif multiline: # multiline==True: automatic word - warp pdf.multi_cell(w=x2-x1,h=y2-y1,txt=text,border=0,align=align) else: # multiline==False: trim to fit exactly the space defined text = pdf.multi_cell(w=x2-x1, h=y2-y1, txt=text, align=align, split_only=True)[0] print "trimming: *%s*" % text pdf.cell(w=x2-x1,h=y2-y1,txt=text,border=0,ln=0,align=align) #pdf.Text(x=x1,y=y1,txt=text) def line(self, pdf, x1=0, y1=0, x2=0, y2=0, size=0, foreground=0, *args, **kwargs): if pdf.draw_color!=rgb(foreground): #print "SetDrawColor", hex(foreground) pdf.set_draw_color(*rgb(foreground)) #print "SetLineWidth", size pdf.set_line_width(size) pdf.line(x1, y1, x2, y2) def rect(self, pdf, x1=0, y1=0, x2=0, y2=0, size=0, foreground=0, backgroud=65535, *args, **kwargs): if pdf.draw_color!=rgb(foreground): pdf.set_draw_color(*rgb(foreground)) if pdf.fill_color!=rgb(backgroud): pdf.set_fill_color(*rgb(backgroud)) pdf.set_line_width(size) pdf.rect(x1, y1, x2-x1, y2-y1) def image(self, pdf, x1=0, y1=0, x2=0, y2=0, text='', *args,**kwargs): pdf.image(text,x1,y1,w=x2-x1,h=y2-y1,type='',link='') def barcode(self, pdf, x1=0, y1=0, x2=0, y2=0, text='', font="arial", size=1, foreground=0, *args, **kwargs): if pdf.draw_color!=rgb(foreground): pdf.set_draw_color(*rgb(foreground)) font = font.lower().strip() if font == 'interleaved 2of5 nt': pdf.interleaved2of5(text,x1,y1,w=size,h=y2-y1) if __name__ == "__main__": # generate sample invoice (according Argentina's regulations) import random from decimal import Decimal f = Template(format="A4", title="Sample Invoice", author="Sample Company", subject="Sample Customer", keywords="Electronic TAX Invoice") f.parse_csv(infile="invoice.csv", delimiter=";", decimal_sep=",") detail = "Lorem ipsum dolor sit amet, consectetur. " * 30 items = [] for i in range(1, 30): ds = "Sample product %s" % i qty = random.randint(1,10) price = round(random.random()*100,3) code = "%s%s%02d" % (chr(random.randint(65,90)), chr(random.randint(65,90)),i) items.append(dict(code=code, unit='u', qty=qty, price=price, amount=qty*price, ds="%s: %s" % (i,ds))) # divide and count lines lines = 0 li_items = [] for it in items: qty = it['qty'] code = it['code'] unit = it['unit'] for ds in f.split_multicell(it['ds'], 'item_description01'): # add item description line (without price nor amount) li_items.append(dict(code=code, ds=ds, qty=qty, unit=unit, price=None, amount=None)) # clean qty and code (show only at first) unit = qty = code = None # set last item line price and amount li_items[-1].update(amount = it['amount'], price = it['price']) obs="\nDetail:\n\n" + detail for ds in f.split_multicell(obs, 'item_description01'): li_items.append(dict(code=code, ds=ds, qty=qty, unit=unit, price=None, amount=None)) # calculate pages: lines = len(li_items) max_lines_per_page = 24 pages = lines / (max_lines_per_page - 1) if lines % (max_lines_per_page - 1): pages = pages + 1 # completo campos y hojas for page in range(1, pages+1): f.add_page() f['page'] = 'Page %s of %s' % (page, pages) if pages>1 and page page * (max_lines_per_page - 1): break if it['amount']: total += Decimal("%.6f" % it['amount']) if k > (page - 1) * (max_lines_per_page - 1): li += 1 if it['qty'] is not None: f['item_quantity%02d' % li] = it['qty'] if it['code'] is not None: f['item_code%02d' % li] = it['code'] if it['unit'] is not None: f['item_unit%02d' % li] = it['unit'] f['item_description%02d' % li] = it['ds'] if it['price'] is not None: f['item_price%02d' % li] = "%0.3f" % it['price'] if it['amount'] is not None: f['item_amount%02d' % li] = "%0.2f" % it['amount'] if pages == page: f['net'] = "%0.2f" % (total/Decimal("1.21")) f['vat'] = "%0.2f" % (total*(1-1/Decimal("1.21"))) f['total_label'] = 'Total:' else: f['total_label'] = 'SubTotal:' f['total'] = "%0.2f" % total f.render("./invoice.pdf") if sys.platform.startswith("linux"): os.system("evince ./invoice.pdf") else: os.system("./invoice.pdf") web2py-2.12.3.orig/gluon/contrib/fpdf/ttfonts.py0000664000000000000000000011767612564727262020263 0ustar rootroot#****************************************************************************** # TTFontFile class # # This class is based on The ReportLab Open Source PDF library # written in Python - http://www.reportlab.com/software/opensource/ # together with ideas from the OpenOffice source code and others. # # Version: 1.04 # Date: 2011-09-18 # Author: Ian Back # License: LGPL # Copyright (c) Ian Back, 2010 # Ported to Python 2.7 by Mariano Reingart (reingart@gmail.com) on 2012 # This header must be retained in any redistribution or # modification of the file. # #****************************************************************************** from struct import pack, unpack, unpack_from import re import warnings from php import die, substr, str_repeat, str_pad, strlen, count # Define the value used in the "head" table of a created TTF file # 0x74727565 "true" for Mac # 0x00010000 for Windows # Either seems to work for a font embedded in a PDF file # when read by Adobe Reader on a Windows PC(!) _TTF_MAC_HEADER = False # TrueType Font Glyph operators GF_WORDS = (1 << 0) GF_SCALE = (1 << 3) GF_MORE = (1 << 5) GF_XYSCALE = (1 << 6) GF_TWOBYTWO = (1 << 7) def sub32(x, y): xlo = x[1] xhi = x[0] ylo = y[1] yhi = y[0] if (ylo > xlo): xlo += 1 << 16 yhi += 1 reslo = xlo-ylo if (yhi > xhi): xhi += 1 << 16 reshi = xhi-yhi reshi = reshi & 0xFFFF return (reshi, reslo) def calcChecksum(data): if (strlen(data) % 4): data += str_repeat("\0", (4-(len(data) % 4))) hi=0x0000 lo=0x0000 for i in range(0, len(data), 4): hi += (ord(data[i])<<8) + ord(data[i+1]) lo += (ord(data[i+2])<<8) + ord(data[i+3]) hi += lo >> 16 lo = lo & 0xFFFF hi = hi & 0xFFFF return (hi, lo) class TTFontFile: def __init__(self): self.maxStrLenRead = 200000 # Maximum size of glyf table to read in as string (otherwise reads each glyph from file) def getMetrics(self, file): self.filename = file self.fh = open(file,'rb') self._pos = 0 self.charWidths = [] self.glyphPos = {} self.charToGlyph = {} self.tables = {} self.otables = {} self.ascent = 0 self.descent = 0 self.TTCFonts = {} self.version = version = self.read_ulong() if (version==0x4F54544F): die("Postscript outlines are not supported") if (version==0x74746366): die("ERROR - TrueType Fonts Collections not supported") if (version not in (0x00010000,0x74727565)): die("Not a TrueType font: version=" + version) self.readTableDirectory() self.extractInfo() self.fh.close() def readTableDirectory(self, ): self.numTables = self.read_ushort() self.searchRange = self.read_ushort() self.entrySelector = self.read_ushort() self.rangeShift = self.read_ushort() self.tables = {} for i in range(self.numTables): record = {} record['tag'] = self.read_tag() record['checksum'] = (self.read_ushort(),self.read_ushort()) record['offset'] = self.read_ulong() record['length'] = self.read_ulong() self.tables[record['tag']] = record def get_table_pos(self, tag): offset = self.tables[tag]['offset'] length = self.tables[tag]['length'] return (offset, length) def seek(self, pos): self._pos = pos self.fh.seek(self._pos) def skip(self, delta): self._pos = self._pos + delta self.fh.seek(self._pos) def seek_table(self, tag, offset_in_table = 0): tpos = self.get_table_pos(tag) self._pos = tpos[0] + offset_in_table self.fh.seek(self._pos) return self._pos def read_tag(self): self._pos += 4 return self.fh.read(4) def read_short(self): self._pos += 2 s = self.fh.read(2) a = (ord(s[0])<<8) + ord(s[1]) if (a & (1 << 15) ): a = (a - (1 << 16)) return a def unpack_short(self, s): a = (ord(s[0])<<8) + ord(s[1]) if (a & (1 << 15) ): a = (a - (1 << 16)) return a def read_ushort(self): self._pos += 2 s = self.fh.read(2) return (ord(s[0])<<8) + ord(s[1]) def read_ulong(self): self._pos += 4 s = self.fh.read(4) # if large uInt32 as an integer, PHP converts it to -ve return (ord(s[0])*16777216) + (ord(s[1])<<16) + (ord(s[2])<<8) + ord(s[3]) # 16777216 = 1<<24 def get_ushort(self, pos): self.fh.seek(pos) s = self.fh.read(2) return (ord(s[0])<<8) + ord(s[1]) def get_ulong(self, pos): self.fh.seek(pos) s = self.fh.read(4) # iF large uInt32 as an integer, PHP converts it to -ve return (ord(s[0])*16777216) + (ord(s[1])<<16) + (ord(s[2])<<8) + ord(s[3]) # 16777216 = 1<<24 def pack_short(self, val): if (val<0): val = abs(val) val = ~val val += 1 return pack(">H",val) def splice(self, stream, offset, value): return substr(stream,0,offset) + value + substr(stream,offset+strlen(value)) def _set_ushort(self, stream, offset, value): up = pack(">H", value) return self.splice(stream, offset, up) def _set_short(self, stream, offset, val): if (val<0): val = abs(val) val = ~val val += 1 up = pack(">H",val) return self.splice(stream, offset, up) def get_chunk(self, pos, length): self.fh.seek(pos) if (length <1): return '' return (self.fh.read(length)) def get_table(self, tag): (pos, length) = self.get_table_pos(tag) if (length == 0): die('Truetype font (' + self.filename + '): error reading table: ' + tag) self.fh.seek(pos) return (self.fh.read(length)) def add(self, tag, data): if (tag == 'head') : data = self.splice(data, 8, "\0\0\0\0") self.otables[tag] = data ############################################/ ############################################/ ############################################/ def extractInfo(self): #################/ # name - Naming table #################/ self.sFamilyClass = 0 self.sFamilySubClass = 0 name_offset = self.seek_table("name") format = self.read_ushort() if (format != 0): die("Unknown name table format " + format) numRecords = self.read_ushort() string_data_offset = name_offset + self.read_ushort() names = {1:'',2:'',3:'',4:'',6:''} K = names.keys() nameCount = len(names) for i in range(numRecords): platformId = self.read_ushort() encodingId = self.read_ushort() languageId = self.read_ushort() nameId = self.read_ushort() length = self.read_ushort() offset = self.read_ushort() if (nameId not in K): continue N = '' if (platformId == 3 and encodingId == 1 and languageId == 0x409): # Microsoft, Unicode, US English, PS Name opos = self._pos self.seek(string_data_offset + offset) if (length % 2 != 0): die("PostScript name is UTF-16BE string of odd length") length /= 2 N = '' while (length > 0): char = self.read_ushort() N += (chr(char)) length -= 1 self._pos = opos self.seek(opos) elif (platformId == 1 and encodingId == 0 and languageId == 0): # Macintosh, Roman, English, PS Name opos = self._pos N = self.get_chunk(string_data_offset + offset, length) self._pos = opos self.seek(opos) if (N and names[nameId]==''): names[nameId] = N nameCount -= 1 if (nameCount==0): break if (names[6]): psName = names[6] elif (names[4]): psName = re.sub(' ','-',names[4]) elif (names[1]): psName = re.sub(' ','-',names[1]) else: psName = '' if (not psName): die("Could not find PostScript font name") self.name = psName if (names[1]): self.familyName = names[1] else: self.familyName = psName if (names[2]): self.styleName = names[2] else: self.styleName = 'Regular' if (names[4]): self.fullName = names[4] else: self.fullName = psName if (names[3]): self.uniqueFontID = names[3] else: self.uniqueFontID = psName if (names[6]): self.fullName = names[6] #################/ # head - Font header table #################/ self.seek_table("head") self.skip(18) self.unitsPerEm = unitsPerEm = self.read_ushort() scale = 1000 / float(unitsPerEm) self.skip(16) xMin = self.read_short() yMin = self.read_short() xMax = self.read_short() yMax = self.read_short() self.bbox = [(xMin*scale), (yMin*scale), (xMax*scale), (yMax*scale)] self.skip(3*2) indexToLocFormat = self.read_ushort() glyphDataFormat = self.read_ushort() if (glyphDataFormat != 0): die('Unknown glyph data format ' + glyphDataFormat) #################/ # hhea metrics table #################/ # ttf2t1 seems to use this value rather than the one in OS/2 - so put in for compatibility if ("hhea" in self.tables): self.seek_table("hhea") self.skip(4) hheaAscender = self.read_short() hheaDescender = self.read_short() self.ascent = (hheaAscender *scale) self.descent = (hheaDescender *scale) #################/ # OS/2 - OS/2 and Windows metrics table #################/ if ("OS/2" in self.tables): self.seek_table("OS/2") version = self.read_ushort() self.skip(2) usWeightClass = self.read_ushort() self.skip(2) fsType = self.read_ushort() if (fsType == 0x0002 or (fsType & 0x0300) != 0): die('ERROR - Font file ' + self.filename + ' cannot be embedded due to copyright restrictions.') self.restrictedUse = True self.skip(20) sF = self.read_short() self.sFamilyClass = (sF >> 8) self.sFamilySubClass = (sF & 0xFF) self._pos += 10 #PANOSE = 10 byte length panose = self.fh.read(10) self.skip(26) sTypoAscender = self.read_short() sTypoDescender = self.read_short() if (not self.ascent): self.ascent = (sTypoAscender*scale) if (not self.descent): self.descent = (sTypoDescender*scale) if (version > 1): self.skip(16) sCapHeight = self.read_short() self.capHeight = (sCapHeight*scale) else: self.capHeight = self.ascent else: usWeightClass = 500 if (not self.ascent): self.ascent = (yMax*scale) if (not self.descent): self.descent = (yMin*scale) self.capHeight = self.ascent self.stemV = 50 + int(pow((usWeightClass / 65.0),2)) #################/ # post - PostScript table #################/ self.seek_table("post") self.skip(4) self.italicAngle = self.read_short() + self.read_ushort() / 65536.0 self.underlinePosition = self.read_short() * scale self.underlineThickness = self.read_short() * scale isFixedPitch = self.read_ulong() self.flags = 4 if (self.italicAngle!= 0): self.flags = self.flags | 64 if (usWeightClass >= 600): self.flags = self.flags | 262144 if (isFixedPitch): self.flags = self.flags | 1 #################/ # hhea - Horizontal header table #################/ self.seek_table("hhea") self.skip(32) metricDataFormat = self.read_ushort() if (metricDataFormat != 0): die('Unknown horizontal metric data format '.metricDataFormat) numberOfHMetrics = self.read_ushort() if (numberOfHMetrics == 0): die('Number of horizontal metrics is 0') #################/ # maxp - Maximum profile table #################/ self.seek_table("maxp") self.skip(4) numGlyphs = self.read_ushort() #################/ # cmap - Character to glyph index mapping table #################/ cmap_offset = self.seek_table("cmap") self.skip(2) cmapTableCount = self.read_ushort() unicode_cmap_offset = 0 unicode_cmap_offset12 = 0 for i in range(cmapTableCount): platformID = self.read_ushort() encodingID = self.read_ushort() offset = self.read_ulong() save_pos = self._pos if platformID == 3 and encodingID == 10: # Microsoft, UCS-4 format = self.get_ushort(cmap_offset + offset) if (format == 12): if not unicode_cmap_offset12: unicode_cmap_offset12 = cmap_offset + offset break if ((platformID == 3 and encodingID == 1) or platformID == 0): # Microsoft, Unicode format = self.get_ushort(cmap_offset + offset) if (format == 4): if (not unicode_cmap_offset): unicode_cmap_offset = cmap_offset + offset break self.seek(save_pos) if not unicode_cmap_offset and not unicode_cmap_offset12: die('Font (' + self.filename + ') does not have cmap for Unicode (platform 3, encoding 1, format 4, or platform 3, encoding 10, format 12, or platform 0, any encoding, format 4)') glyphToChar = {} charToGlyph = {} if unicode_cmap_offset12: self.getCMAP12(unicode_cmap_offset12, glyphToChar, charToGlyph) else: self.getCMAP4(unicode_cmap_offset, glyphToChar, charToGlyph) #################/ # hmtx - Horizontal metrics table #################/ self.getHMTX(numberOfHMetrics, numGlyphs, glyphToChar, scale) ############################################/ ############################################/ def makeSubset(self, file, subset): self.filename = file self.fh = open(file ,'rb') self._pos = 0 self.charWidths = [] self.glyphPos = {} self.charToGlyph = {} self.tables = {} self.otables = {} self.ascent = 0 self.descent = 0 self.skip(4) self.maxUni = 0 self.readTableDirectory() #################/ # head - Font header table #################/ self.seek_table("head") self.skip(50) indexToLocFormat = self.read_ushort() glyphDataFormat = self.read_ushort() #################/ # hhea - Horizontal header table #################/ self.seek_table("hhea") self.skip(32) metricDataFormat = self.read_ushort() orignHmetrics = numberOfHMetrics = self.read_ushort() #################/ # maxp - Maximum profile table #################/ self.seek_table("maxp") self.skip(4) numGlyphs = self.read_ushort() #################/ # cmap - Character to glyph index mapping table #################/ cmap_offset = self.seek_table("cmap") self.skip(2) cmapTableCount = self.read_ushort() unicode_cmap_offset = 0 unicode_cmap_offset12 = 0 for i in range(cmapTableCount): platformID = self.read_ushort() encodingID = self.read_ushort() offset = self.read_ulong() save_pos = self._pos if platformID == 3 and encodingID == 10: # Microsoft, UCS-4 format = self.get_ushort(cmap_offset + offset) if (format == 12): if not unicode_cmap_offset12: unicode_cmap_offset12 = cmap_offset + offset break if ((platformID == 3 and encodingID == 1) or platformID == 0): # Microsoft, Unicode format = self.get_ushort(cmap_offset + offset) if (format == 4): unicode_cmap_offset = cmap_offset + offset break self.seek(save_pos ) if not unicode_cmap_offset and not unicode_cmap_offset12: die('Font (' + self.filename + ') does not have cmap for Unicode (platform 3, encoding 1, format 4, or platform 3, encoding 10, format 12, or platform 0, any encoding, format 4)') glyphToChar = {} charToGlyph = {} if unicode_cmap_offset12: self.getCMAP12(unicode_cmap_offset12, glyphToChar, charToGlyph) else: self.getCMAP4(unicode_cmap_offset, glyphToChar, charToGlyph) self.charToGlyph = charToGlyph #################/ # hmtx - Horizontal metrics table #################/ scale = 1 # not used self.getHMTX(numberOfHMetrics, numGlyphs, glyphToChar, scale) #################/ # loca - Index to location #################/ self.getLOCA(indexToLocFormat, numGlyphs) subsetglyphs = [(0, 0)] # special "sorted dict"! subsetCharToGlyph = {} for code in subset: if (code in self.charToGlyph): if (self.charToGlyph[code], code) not in subsetglyphs: subsetglyphs.append((self.charToGlyph[code], code)) # Old Glyph ID => Unicode subsetCharToGlyph[code] = self.charToGlyph[code] # Unicode to old GlyphID self.maxUni = max(self.maxUni, code) (start,dummy) = self.get_table_pos('glyf') subsetglyphs.sort() glyphSet = {} n = 0 fsLastCharIndex = 0 # maximum Unicode index (character code) in this font, according to the cmap subtable for platform ID 3 and platform- specific encoding ID 0 or 1. for originalGlyphIdx, uni in subsetglyphs: fsLastCharIndex = max(fsLastCharIndex , uni) glyphSet[originalGlyphIdx] = n # old glyphID to new glyphID n += 1 codeToGlyph = {} for uni, originalGlyphIdx in sorted(subsetCharToGlyph.items()): codeToGlyph[uni] = glyphSet[originalGlyphIdx] self.codeToGlyph = codeToGlyph for originalGlyphIdx, uni in subsetglyphs: nonlocals = {'start': start, 'glyphSet': glyphSet, 'subsetglyphs': subsetglyphs} self.getGlyphs(originalGlyphIdx, nonlocals) numGlyphs = numberOfHMetrics = len(subsetglyphs) #tables copied from the original tags = ['name'] for tag in tags: self.add(tag, self.get_table(tag)) tags = ['cvt ', 'fpgm', 'prep', 'gasp'] for tag in tags: if (tag in self.tables): self.add(tag, self.get_table(tag)) # post - PostScript opost = self.get_table('post') post = "\x00\x03\x00\x00" + substr(opost,4,12) + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" self.add('post', post) # Sort CID2GID map into segments of contiguous codes if 0 in codeToGlyph: del codeToGlyph[0] #unset(codeToGlyph[65535]) rangeid = 0 range_ = {} prevcid = -2 prevglidx = -1 # for each character for cid, glidx in sorted(codeToGlyph.items()): if (cid == (prevcid + 1) and glidx == (prevglidx + 1)): range_[rangeid].append(glidx) else: # new range rangeid = cid range_[rangeid] = [] range_[rangeid].append(glidx) prevcid = cid prevglidx = glidx # cmap - Character to glyph mapping - Format 4 (MS / ) segCount = len(range_) + 1 # + 1 Last segment has missing character 0xFFFF searchRange = 1 entrySelector = 0 while (searchRange * 2 <= segCount ): searchRange = searchRange * 2 entrySelector = entrySelector + 1 searchRange = searchRange * 2 rangeShift = segCount * 2 - searchRange length = 16 + (8*segCount ) + (numGlyphs+1) cmap = [0, 1, # Index : version, number of encoding subtables 3, 1, # Encoding Subtable : platform (MS=3), encoding (Unicode) 0, 12, # Encoding Subtable : offset (hi,lo) 4, length, 0, # Format 4 Mapping subtable: format, length, language segCount*2, searchRange, entrySelector, rangeShift] range_ = sorted(range_.items()) # endCode(s) for start, subrange in range_: endCode = start + (len(subrange)-1) cmap.append(endCode) # endCode(s) cmap.append(0xFFFF) # endCode of last Segment cmap.append(0) # reservedPad # startCode(s) for start, subrange in range_: cmap.append(start) # startCode(s) cmap.append(0xFFFF) # startCode of last Segment # idDelta(s) for start, subrange in range_: idDelta = -(start-subrange[0]) n += count(subrange) cmap.append(idDelta) # idDelta(s) cmap.append(1) # idDelta of last Segment # idRangeOffset(s) for subrange in range_: cmap.append(0) # idRangeOffset[segCount] Offset in bytes to glyph indexArray, or 0 cmap.append(0) # idRangeOffset of last Segment for subrange, glidx in range_: cmap.extend(glidx) cmap.append(0) # Mapping for last character cmapstr = '' for cm in cmap: if cm >= 0: cmapstr += pack(">H", cm) else: try: cmapstr += pack(">h", cm) except: warnings.warn("cmap value too big/small: %s" % cm) cmapstr += pack(">H", -cm) self.add('cmap', cmapstr) # glyf - Glyph data (glyfOffset,glyfLength) = self.get_table_pos('glyf') if (glyfLength < self.maxStrLenRead): glyphData = self.get_table('glyf') offsets = [] glyf = '' pos = 0 hmtxstr = '' xMinT = 0 yMinT = 0 xMaxT = 0 yMaxT = 0 advanceWidthMax = 0 minLeftSideBearing = 0 minRightSideBearing = 0 xMaxExtent = 0 maxPoints = 0 # points in non-compound glyph maxContours = 0 # contours in non-compound glyph maxComponentPoints = 0 # points in compound glyph maxComponentContours = 0 # contours in compound glyph maxComponentElements = 0 # number of glyphs referenced at top level maxComponentDepth = 0 # levels of recursion, set to 0 if font has only simple glyphs self.glyphdata = {} for originalGlyphIdx, uni in subsetglyphs: # hmtx - Horizontal Metrics hm = self.getHMetric(orignHmetrics, originalGlyphIdx) hmtxstr += hm offsets.append(pos) try: glyphPos = self.glyphPos[originalGlyphIdx] glyphLen = self.glyphPos[originalGlyphIdx + 1] - glyphPos except IndexError: warnings.warn("missing glyph %s" % (originalGlyphIdx)) glyphLen = 0 if (glyfLength < self.maxStrLenRead): data = substr(glyphData,glyphPos,glyphLen) else: if (glyphLen > 0): data = self.get_chunk(glyfOffset+glyphPos,glyphLen) else: data = '' if (glyphLen > 0): up = unpack(">H", substr(data,0,2))[0] if (glyphLen > 2 and (up & (1 << 15)) ): # If number of contours <= -1 i.e. composiste glyph pos_in_glyph = 10 flags = GF_MORE nComponentElements = 0 while (flags & GF_MORE): nComponentElements += 1 # number of glyphs referenced at top level up = unpack(">H", substr(data,pos_in_glyph,2)) flags = up[0] up = unpack(">H", substr(data,pos_in_glyph+2,2)) glyphIdx = up[0] self.glyphdata.setdefault(originalGlyphIdx, {}).setdefault('compGlyphs', []).append(glyphIdx) try: data = self._set_ushort(data, pos_in_glyph + 2, glyphSet[glyphIdx]) except KeyError: data = 0 warnings.warn("missing glyph data %s" % glyphIdx) pos_in_glyph += 4 if (flags & GF_WORDS): pos_in_glyph += 4 else: pos_in_glyph += 2 if (flags & GF_SCALE): pos_in_glyph += 2 elif (flags & GF_XYSCALE): pos_in_glyph += 4 elif (flags & GF_TWOBYTWO): pos_in_glyph += 8 maxComponentElements = max(maxComponentElements, nComponentElements) glyf += data pos += glyphLen if (pos % 4 != 0): padding = 4 - (pos % 4) glyf += str_repeat("\0",padding) pos += padding offsets.append(pos) self.add('glyf', glyf) # hmtx - Horizontal Metrics self.add('hmtx', hmtxstr) # loca - Index to location locastr = '' if (((pos + 1) >> 1) > 0xFFFF): indexToLocFormat = 1 # long format for offset in offsets: locastr += pack(">L",offset) else: indexToLocFormat = 0 # short format for offset in offsets: locastr += pack(">H",(offset/2)) self.add('loca', locastr) # head - Font header head = self.get_table('head') head = self._set_ushort(head, 50, indexToLocFormat) self.add('head', head) # hhea - Horizontal Header hhea = self.get_table('hhea') hhea = self._set_ushort(hhea, 34, numberOfHMetrics) self.add('hhea', hhea) # maxp - Maximum Profile maxp = self.get_table('maxp') maxp = self._set_ushort(maxp, 4, numGlyphs) self.add('maxp', maxp) # OS/2 - OS/2 os2 = self.get_table('OS/2') self.add('OS/2', os2 ) self.fh.close() # Put the TTF file together stm = self.endTTFile('') return stm ######################################### # Recursively get composite glyph data def getGlyphData(self, originalGlyphIdx, nonlocals): # &maxdepth, &depth, &points, &contours nonlocals['depth'] += 1 nonlocals['maxdepth'] = max(nonlocals['maxdepth'], nonlocals['depth']) if (len(self.glyphdata[originalGlyphIdx]['compGlyphs'])): for glyphIdx in self.glyphdata[originalGlyphIdx]['compGlyphs']: self.getGlyphData(glyphIdx, nonlocals) elif ((self.glyphdata[originalGlyphIdx]['nContours'] > 0) and nonlocals['depth'] > 0): # simple contours += self.glyphdata[originalGlyphIdx]['nContours'] points += self.glyphdata[originalGlyphIdx]['nPoints'] nonlocals['depth'] -= 1 ######################################### # Recursively get composite glyphs def getGlyphs(self, originalGlyphIdx, nonlocals): # &start, &glyphSet, &subsetglyphs) try: glyphPos = self.glyphPos[originalGlyphIdx] glyphLen = self.glyphPos[originalGlyphIdx + 1] - glyphPos except IndexError: warnings.warn("missing glyph %s" % (originalGlyphIdx)) return if (not glyphLen): return self.seek(nonlocals['start'] + glyphPos) numberOfContours = self.read_short() if (numberOfContours < 0): self.skip(8) flags = GF_MORE while (flags & GF_MORE): flags = self.read_ushort() glyphIdx = self.read_ushort() if (glyphIdx not in nonlocals['glyphSet']): nonlocals['glyphSet'][glyphIdx] = len(nonlocals['subsetglyphs']) # old glyphID to new glyphID nonlocals['subsetglyphs'].append((glyphIdx, 1)) savepos = self.fh.tell() self.getGlyphs(glyphIdx, nonlocals) self.seek(savepos) if (flags & GF_WORDS): self.skip(4) else: self.skip(2) if (flags & GF_SCALE): self.skip(2) elif (flags & GF_XYSCALE): self.skip(4) elif (flags & GF_TWOBYTWO): self.skip(8) ######################################### def getHMTX(self, numberOfHMetrics, numGlyphs, glyphToChar, scale): start = self.seek_table("hmtx") aw = 0 self.charWidths = [0] * 256*256*2 nCharWidths = 0 if ((numberOfHMetrics*4) < self.maxStrLenRead): data = self.get_chunk(start,(numberOfHMetrics*4)) arr = unpack(">" + "H" * (len(data)/2), data) else: self.seek(start) for glyph in range(numberOfHMetrics): if ((numberOfHMetrics*4) < self.maxStrLenRead): aw = arr[(glyph*2)] # PHP starts arrays from index 0!? +1 else: aw = self.read_ushort() lsb = self.read_ushort() if (glyph in glyphToChar or glyph == 0): if (aw >= (1 << 15) ): aw = 0 # 1.03 Some (arabic) fonts have -ve values for width # although should be unsigned value - comes out as e.g. 65108 (intended -50) if (glyph == 0): self.defaultWidth = scale*aw continue for char in glyphToChar[glyph]: if (char != 0 and char != 65535): w = int(round(scale*aw)) if (w == 0): w = 65535 if (char < 196608): self.charWidths[char] = w nCharWidths += 1 data = self.get_chunk((start+numberOfHMetrics*4),(numGlyphs*2)) arr = unpack(">" + "H" * (len(data)/2), data) diff = numGlyphs-numberOfHMetrics for pos in range(diff): glyph = pos + numberOfHMetrics if (glyph in glyphToChar): for char in glyphToChar[glyph]: if (char != 0 and char != 65535): w = int(round(scale*aw)) if (w == 0): w = 65535 if (char < 196608): self.charWidths[char] = w nCharWidths += 1 # NB 65535 is a set width of 0 # First bytes define number of chars in font self.charWidths[0] = nCharWidths def getHMetric(self, numberOfHMetrics, gid): start = self.seek_table("hmtx") if (gid < numberOfHMetrics): self.seek(start+(gid*4)) hm = self.fh.read(4) else: self.seek(start+((numberOfHMetrics-1)*4)) hm = self.fh.read(2) self.seek(start+(numberOfHMetrics*2)+(gid*2)) hm += self.fh.read(2) return hm def getLOCA(self, indexToLocFormat, numGlyphs): start = self.seek_table('loca') self.glyphPos = [] if (indexToLocFormat == 0): data = self.get_chunk(start,(numGlyphs*2)+2) arr = unpack(">" + "H" * (len(data)/2), data) for n in range(numGlyphs): self.glyphPos.append((arr[n] * 2)) # n+1 !? elif (indexToLocFormat == 1): data = self.get_chunk(start,(numGlyphs*4)+4) arr = unpack(">" + "L" * (len(data)/4), data) for n in range(numGlyphs): self.glyphPos.append((arr[n])) # n+1 !? else: die('Unknown location table format ' + indexToLocFormat) # CMAP Format 4 def getCMAP4(self, unicode_cmap_offset, glyphToChar, charToGlyph): self.maxUniChar = 0 self.seek(unicode_cmap_offset + 2) length = self.read_ushort() limit = unicode_cmap_offset + length self.skip(2) segCount = self.read_ushort() / 2 self.skip(6) endCount = [] for i in range(segCount): endCount.append(self.read_ushort()) self.skip(2) startCount = [] for i in range(segCount): startCount.append(self.read_ushort()) idDelta = [] for i in range(segCount): idDelta.append(self.read_short()) # ???? was unsigned short idRangeOffset_start = self._pos idRangeOffset = [] for i in range(segCount): idRangeOffset.append(self.read_ushort()) for n in range(segCount): endpoint = (endCount[n] + 1) for unichar in range(startCount[n], endpoint, 1): if (idRangeOffset[n] == 0): glyph = (unichar + idDelta[n]) & 0xFFFF else: offset = (unichar - startCount[n]) * 2 + idRangeOffset[n] offset = idRangeOffset_start + 2 * n + offset if (offset >= limit): glyph = 0 else: glyph = self.get_ushort(offset) if (glyph != 0): glyph = (glyph + idDelta[n]) & 0xFFFF charToGlyph[unichar] = glyph if (unichar < 196608): self.maxUniChar = max(unichar,self.maxUniChar) glyphToChar.setdefault(glyph, []).append(unichar) # CMAP Format 12 def getCMAP12(self, unicode_cmap_offset, glyphToChar, charToGlyph): self.maxUniChar = 0 # table (skip format version, should be 12) self.seek(unicode_cmap_offset + 2) # reserved self.skip(2) # table length length = self.read_ulong() # language (should be 0) self.skip(4) # groups count grpCount = self.read_ulong() if 2 + 2 + 4 + 4 + 4 + grpCount * 3 * 4 > length: die("TTF format 12 cmap table too small") for n in range(grpCount): startCharCode = self.read_ulong() endCharCode = self.read_ulong() glyph = self.read_ulong() for unichar in range(startCharCode, endCharCode + 1): charToGlyph[unichar] = glyph if (unichar < 196608): self.maxUniChar = max(unichar, self.maxUniChar) glyphToChar.setdefault(glyph, []).append(unichar) glyph += 1 # Put the TTF file together def endTTFile(self, stm): stm = '' numTables = count(self.otables) searchRange = 1 entrySelector = 0 while (searchRange * 2 <= numTables): searchRange = searchRange * 2 entrySelector = entrySelector + 1 searchRange = searchRange * 16 rangeShift = numTables * 16 - searchRange # Header if (_TTF_MAC_HEADER): stm += (pack(">LHHHH", 0x74727565, numTables, searchRange, entrySelector, rangeShift)) # Mac else: stm += (pack(">LHHHH", 0x00010000 , numTables, searchRange, entrySelector, rangeShift)) # Windows # Table directory tables = self.otables offset = 12 + numTables * 16 sorted_tables = sorted(tables.items()) for tag, data in sorted_tables: if (tag == 'head'): head_start = offset stm += tag checksum = calcChecksum(data) stm += pack(">HH", checksum[0],checksum[1]) stm += pack(">LL", offset, strlen(data)) paddedLength = (strlen(data)+3)&~3 offset = offset + paddedLength # Table data for tag, data in sorted_tables: data += "\0\0\0" stm += substr(data,0,(strlen(data)&~3)) checksum = calcChecksum(stm) checksum = sub32((0xB1B0,0xAFBA), checksum) chk = pack(">HH", checksum[0],checksum[1]) stm = self.splice(stm,(head_start + 8),chk) return stm if __name__ == '__main__': ttf = TTFontFile() ttffile = 'DejaVuSansCondensed.ttf'; ttf.getMetrics(ttffile) # test basic metrics: assert round(ttf.descent, 0) == -236 assert round(ttf.capHeight, 0) == 928 assert ttf.flags == 4 assert [round(i, 0) for i in ttf.bbox] == [-918, -415, 1513, 1167] assert ttf.italicAngle == 0 assert ttf.stemV == 87 assert round(ttf.defaultWidth, 0) == 540 assert round(ttf.underlinePosition, 0) == -63 assert round(ttf.underlineThickness, 0) == 44 # test char widths 8(against binary file generated by tfpdf.php): assert ''.join(ttf.charWidths) == open("dejavusanscondensed.cw.dat").read() web2py-2.12.3.orig/gluon/contrib/fpdf/html.py0000664000000000000000000003427212564727262017514 0ustar rootroot# -*- coding: latin-1 -*- "HTML Renderer for FPDF.py" __author__ = "Mariano Reingart " __copyright__ = "Copyright (C) 2010 Mariano Reingart" __license__ = "LGPL 3.0" # Inspired by tuto5.py and several examples from fpdf.org, html2fpdf, etc. from fpdf import FPDF from HTMLParser import HTMLParser DEBUG = False def px2mm(px): return int(px)*25.4/72.0 def hex2dec(color = "#000000"): if color: r = int(color[1:3], 16) g = int(color[3:5], 16) b = int(color[5:7], 16) return r, g, b class HTML2FPDF(HTMLParser): "Render basic HTML to FPDF" def __init__(self, pdf, image_map=None): HTMLParser.__init__(self) self.style = {} self.pre = False self.href = '' self.align = '' self.page_links = {} self.font = None self.font_stack = [] self.pdf = pdf self.image_map = image_map or (lambda src: src) self.r = self.g = self.b = 0 self.indent = 0 self.bullet = [] self.set_font("times", 12) self.font_face = "times" # initialize font self.color = 0 #initialize font color self.table = None # table attributes self.table_col_width = None # column (header) widths self.table_col_index = None # current column index self.td = None # cell attributes self.th = False # header enabled self.tr = None self.theader = None # table header cells self.tfooter = None # table footer cells self.thead = None self.tfoot = None self.theader_out = self.tfooter_out = False self.hsize = dict(h1=2, h2=1.5, h3=1.17, h4=1, h5=0.83, h6=0.67) def width2mm(self, length): if length[-1]=='%': total = self.pdf.w - self.pdf.r_margin - self.pdf.l_margin if self.table['width'][-1]=='%': total *= int(self.table['width'][:-1])/100.0 return int(length[:-1]) * total / 101.0 else: return int(length) / 6.0 def handle_data(self, txt): if self.td is not None: # drawing a table? if 'width' not in self.td and 'colspan' not in self.td: try: l = [self.table_col_width[self.table_col_index]] except IndexError: raise RuntimeError("Table column/cell width not specified, unable to continue") elif 'colspan' in self.td: i = self.table_col_index colspan = int(self.td['colspan']) l = self.table_col_width[i:i+colspan] else: l = [self.td.get('width','240')] w = sum([self.width2mm(lenght) for lenght in l]) h = int(self.td.get('height', 0)) / 4 or self.h*1.30 self.table_h = h border = int(self.table.get('border', 0)) if not self.th: align = self.td.get('align', 'L')[0].upper() border = border and 'LR' else: self.set_style('B',True) border = border or 'B' align = self.td.get('align', 'C')[0].upper() bgcolor = hex2dec(self.td.get('bgcolor', self.tr.get('bgcolor', ''))) # parsing table header/footer (drawn later): if self.thead is not None: self.theader.append(((w,h,txt,border,0,align), bgcolor)) if self.tfoot is not None: self.tfooter.append(((w,h,txt,border,0,align), bgcolor)) # check if reached end of page, add table footer and header: height = h + (self.tfooter and self.tfooter[0][0][1] or 0) if self.pdf.y+height>self.pdf.page_break_trigger and not self.th: self.output_table_footer() self.pdf.add_page() self.theader_out = self.tfooter_out = False if self.tfoot is None and self.thead is None: if not self.theader_out: self.output_table_header() self.box_shadow(w, h, bgcolor) if DEBUG: print "td cell", self.pdf.x, w, txt, "*" self.pdf.cell(w,h,txt,border,0,align) elif self.table is not None: # ignore anything else than td inside a table pass elif self.align: if DEBUG: print "cell", txt, "*" self.pdf.cell(0,self.h,txt,0,1,self.align[0].upper(), self.href) else: txt = txt.replace("\n"," ") if self.href: self.put_link(self.href,txt) else: if DEBUG: print "write", txt, "*" self.pdf.write(self.h,txt) def box_shadow(self, w, h, bgcolor): if DEBUG: print "box_shadow", w, h, bgcolor if bgcolor: fill_color = self.pdf.fill_color self.pdf.set_fill_color(*bgcolor) self.pdf.rect(self.pdf.x, self.pdf.y, w, h, 'F') self.pdf.fill_color = fill_color def output_table_header(self): if self.theader: b = self.b x = self.pdf.x self.pdf.set_x(self.table_offset) self.set_style('B',True) for cell, bgcolor in self.theader: self.box_shadow(cell[0], cell[1], bgcolor) self.pdf.cell(*cell) self.set_style('B',b) self.pdf.ln(self.theader[0][0][1]) self.pdf.set_x(self.table_offset) #self.pdf.set_x(x) self.theader_out = True def output_table_footer(self): if self.tfooter: x = self.pdf.x self.pdf.set_x(self.table_offset) #TODO: self.output_table_sep() for cell, bgcolor in self.tfooter: self.box_shadow(cell[0], cell[1], bgcolor) self.pdf.cell(*cell) self.pdf.ln(self.tfooter[0][0][1]) self.pdf.set_x(x) if int(self.table.get('border', 0)): self.output_table_sep() self.tfooter_out = True def output_table_sep(self): self.pdf.set_x(self.table_offset) x1 = self.pdf.x y1 = self.pdf.y w = sum([self.width2mm(lenght) for lenght in self.table_col_width]) self.pdf.line(x1,y1,x1+w,y1) def handle_starttag(self, tag, attrs): attrs = dict(attrs) if DEBUG: print "STARTTAG", tag, attrs if tag=='b' or tag=='i' or tag=='u': self.set_style(tag,1) if tag=='a': self.href=attrs['href'] if tag=='br': self.pdf.ln(5) if tag=='p': self.pdf.ln(5) if attrs: if attrs: self.align = attrs.get('align') if tag in self.hsize: k = self.hsize[tag] self.pdf.ln(5*k) self.pdf.set_text_color(150,0,0) self.pdf.set_font_size(12 * k) if attrs: self.align = attrs.get('align') if tag=='hr': self.put_line() if tag=='pre': self.pdf.set_font('Courier','',11) self.pdf.set_font_size(11) self.set_style('B',False) self.set_style('I',False) self.pre = True if tag=='blockquote': self.set_text_color(100,0,45) self.pdf.ln(3) if tag=='ul': self.indent+=1 self.bullet.append('\x95') if tag=='ol': self.indent+=1 self.bullet.append(0) if tag=='li': self.pdf.ln(self.h+2) self.pdf.set_text_color(190,0,0) bullet = self.bullet[self.indent-1] if not isinstance(bullet, basestring): bullet += 1 self.bullet[self.indent-1] = bullet bullet = "%s. " % bullet self.pdf.write(self.h,'%s%s ' % (' '*5*self.indent, bullet)) self.set_text_color() if tag=='font': # save previous font state: self.font_stack.append((self.font_face, self.font_size, self.color)) if 'color' in attrs: self.color = hex2dec(attrs['color']) self.set_text_color(*color) self.color = color if 'face' in attrs: face = attrs.get('face').lower() self.pdf.set_font(face) self.font_face = face if 'size' in attrs: size = int(attrs.get('size')) self.pdf.set_font(self.font_face, size=int(size)) self.font_size = size if tag=='table': self.table = dict([(k.lower(), v) for k,v in attrs.items()]) if not 'width' in self.table: self.table['width'] = '100%' if self.table['width'][-1]=='%': w = self.pdf.w - self.pdf.r_margin - self.pdf.l_margin w *= int(self.table['width'][:-1])/100.0 self.table_offset = (self.pdf.w-w)/2.0 self.table_col_width = [] self.theader_out = self.tfooter_out = False self.theader = [] self.tfooter = [] self.thead = None self.tfoot = None self.table_h = 0 self.pdf.ln() if tag=='tr': self.tr = dict([(k.lower(), v) for k,v in attrs.items()]) self.table_col_index = 0 self.pdf.set_x(self.table_offset) if tag=='td': self.td = dict([(k.lower(), v) for k,v in attrs.items()]) if tag=='th': self.td = dict([(k.lower(), v) for k,v in attrs.items()]) self.th = True if 'width' in self.td: self.table_col_width.append(self.td['width']) if tag=='thead': self.thead = {} if tag=='tfoot': self.tfoot = {} if tag=='img': if 'src' in attrs: x = self.pdf.get_x() y = self.pdf.get_y() w = px2mm(attrs.get('width', 0)) h = px2mm(attrs.get('height',0)) if self.align and self.align[0].upper() == 'C': x = (self.pdf.w-x)/2.0 - w/2.0 self.pdf.image(self.image_map(attrs['src']), x, y, w, h, link=self.href) self.pdf.set_x(x+w) self.pdf.set_y(y+h) if tag=='b' or tag=='i' or tag=='u': self.set_style(tag, True) if tag=='center': self.align = 'Center' def handle_endtag(self, tag): #Closing tag if DEBUG: print "ENDTAG", tag if tag=='h1' or tag=='h2' or tag=='h3' or tag=='h4': self.pdf.ln(6) self.set_font() self.set_style() self.align = None if tag=='pre': self.pdf.set_font(self.font or 'Times','',12) self.pdf.set_font_size(12) self.pre=False if tag=='blockquote': self.set_text_color(0,0,0) self.pdf.ln(3) if tag=='strong': tag='b' if tag=='em': tag='i' if tag=='b' or tag=='i' or tag=='u': self.set_style(tag, False) if tag=='a': self.href='' if tag=='p': self.align='' if tag in ('ul', 'ol'): self.indent-=1 self.bullet.pop() if tag=='table': if not self.tfooter_out: self.output_table_footer() self.table = None self.th = False self.theader = None self.tfooter = None self.pdf.ln() if tag=='thead': self.thead = None if tag=='tfoot': self.tfoot = None if tag=='tbody': # draw a line separator between table bodies self.pdf.set_x(self.table_offset) self.output_table_sep() if tag=='tr': h = self.table_h if self.tfoot is None: self.pdf.ln(h) self.tr = None if tag=='td' or tag=='th': if self.th: if DEBUG: print "revert style" self.set_style('B', False) # revert style self.table_col_index += int(self.td.get('colspan','1')) self.td = None self.th = False if tag=='font': # recover last font state face, size, color = self.font_stack.pop() if face: self.pdf.set_text_color(0,0,0) self.color = None self.set_font(face, size) self.font = None if tag=='center': self.align = None def set_font(self, face=None, size=None): if face: self.font_face = face if size: self.font_size = size self.h = size / 72.0*25.4 if DEBUG: print "H", self.h self.pdf.set_font(self.font_face or 'times','',12) self.pdf.set_font_size(self.font_size or 12) self.set_style('u', False) self.set_style('b', False) self.set_style('i', False) self.set_text_color() def set_style(self, tag=None, enable=None): #Modify style and select corresponding font if tag: t = self.style.get(tag.lower()) self.style[tag.lower()] = enable style='' for s in ('b','i','u'): if self.style.get(s): style+=s if DEBUG: print "SET_FONT_STYLE", style self.pdf.set_font('',style) def set_text_color(self, r=None, g=0, b=0): if r is None: self.pdf.set_text_color(self.r,self.g,self.b) else: self.pdf.set_text_color(r, g, b) self.r = r self.g = g self.b = b def put_link(self, url, txt): #Put a hyperlink self.set_text_color(0,0,255) self.set_style('u', True) self.pdf.write(5,txt,url) self.set_style('u', False) self.set_text_color(0) def put_line(self): self.pdf.ln(2) self.pdf.line(self.pdf.get_x(),self.pdf.get_y(),self.pdf.get_x()+187,self.pdf.get_y()) self.pdf.ln(3) class HTMLMixin(object): def write_html(self, text, image_map=None): "Parse HTML and convert it to PDF" h2p = HTML2FPDF(self, image_map) h2p.feed(text) web2py-2.12.3.orig/gluon/contrib/spreadsheet.py0000664000000000000000000007464112564727264020146 0ustar rootroot# -*- coding: utf-8 -*- """ Developed by Massimo Di Pierro, optional component of web2py, BSDv3 license. """ import re import pickle import copy import simplejson def quote(text): return str(text).replace('\\', '\\\\').replace("'", "\\'") class Node: def __init__(self, name, value, url='.', readonly=False, active=True, onchange=None, **kwarg): self.url = url self.name = name self.value = str(value) self.computed_value = '' self.incoming = {} self.outcoming = {} self.readonly = readonly self.active = active self.onchange = onchange self.size = 4 self.locked = False def xml(self): return """ """ % (self.name, self.name, self.computed_value, self.size, self.url, self.name, self.url, self.name, self.url, self.name, (self.readonly and 'readonly ') or '') def __repr__(self): return '%s:%s' % (self.name, self.computed_value) class Sheet: """ Basic class for creating web spreadsheets New features: -dal spreadsheets: It receives a Rows object instance and presents the selected data in a cell per field basis (table rows are sheet rows as well) Input should be short extension data as numeric data or math expressions but can be anything supported by unicode. -row(), column() and matrix() class methods: These new methods allow to set bulk data sets without calling .cell() for each node Example:: # controller from gluon.contrib.spreadsheet import Sheet def callback(): return cache.ram('sheet1', lambda: None, None).process(request) def index(): # standard spreadsheet method sheet = cache.ram('sheet1', lambda: Sheet(10, 10, URL(r=request, f='callback')), 0) #sheet.cell('r0c3', value='=r0c0+r0c1+r0c2', readonly=True) return dict(sheet=sheet) def index(): # database spreadsheet method sheet = cache.ram('sheet1', lambda: Sheet(10, 10, URL(r=request, f='callback'), data=db(db.mydata).select()), 0) return dict(sheet=sheet) # view {{extend 'layout.html'}} {{=sheet}} or insert invidivual cells via {{=sheet.nodes['r0c0']}} Sheet stores a JavaScript w2p_spreadsheet_data object for retrieving data updates from the client. The data structure of the js object is as follows: # columns: a dict with colname, column index map # colnames: a dict with column index, colname map # id_columns: list with id columns # id_colnames: dict with id colname: column index map # cells: dict of "rncn": value pairs # modified: dict of modified cells for client-side Also, there is a class method Sheet.update(data) that processes the json data as sent by the client and returns a set of db modifications (see the method help for more details) client JavaScript objects: -var w2p_spreadsheet_data Stores cell updates by key and Used for updated cells control -var w2p_spreadsheet_update_button Stores the id of the update command Used for event binding (update click) var w2p_spreadsheet_update_result object attributes: modified - n updated records errors - n errors message - a message for feedback and errors Stores the ajax db update call returned stats and the db_callback string js Used after calling w2p_spreadsheet_update_db() -function w2p_spreadsheet_update_cell(a) Used for responding to normal cell events (encapsulates old behavior) -function w2p_spreadsheet_update_db_callback(result) Called after a background db update -function w2p_spreadsheet_update_db() Called for updating the database with client data First method: Sending data trough a form helper: (the data payload must be inserted in a form field before submission) -Applying db changes made client-side Example controller: ... # present a submit button with the spreadsheet form = SQLFORM.factory(Field("", "text", readable=False, writable=False, formname="")) # submit button label form.elements("input [type=submit]").attributes["_value"] = \ T("Update database") form.elements("textarea")[0].attributes["_style"] = "display: none;" w2p_spreadsheet_update_script = SCRIPT(''' jQuery( function(){ jQuery("").submit(function(){ jQuery("[name=]").val(JSON.stringify( w2p_spreadsheet_data) ); }); } ); ''') # retrieve changes if form.process().accepted: data = form.vars. changes = Sheet.updated(data) # Do db I/O: for table, rows in changes.iteritems(): for row, values in rows.iteritems(): db[table][row].update_record(**values) # the action view should expose {{=form}}, {{=sheet}}, {{=myscript}} return dict(form=form, sheet=sheet, myscript=w2p_spreadseet_update_script) Second method: Sending data updates with .ajax() -spreadsheet page's view: {{ =INPUT(_type="button", _value="update data", _id="w2p_spreadsheet_update_data") }} {{=SCRIPT(''' jQuery(function(){ jQuery("#w2p_spreadsheet_update_data").click( function(){ jQuery.ajax({url: "%s", type: "POST", data: {data: JSON.stringify(w2p_spreadsheet_data)} } ); } ); }); ''' % URL(c="default", f="modified"))}} -controller: modified function def modified(): data = request.vars.data changes = Sheet.updated(data) # (for db I/O see first method) return "ok" Third method: When creating a Sheet instance, pass a kwarg update_button=
{{if security_notice or disclosure_notice:}}
{{if security_notice:}}

Security Notice

For your security we process all payments using a service called Stripe. Thanks to Stripe your credit card information is communicated directly between your Web Browser and the payment processor, Stripe, without going through our server. Since we never see your card information nobody can steal it through us. Stripe is PCI compliant and so are we.

{{pass}} {{if disclosure_notice:}}

Disclosure Notice

We do store other information about your purchase including your name, a description of the purchase, the time when it was processed, and the amount paid. This information is necessary to provide our services and for accounting purposes. We do not disclose this information to third parties unless required to operate our services or accounting purposes.

{{pass}}
{{pass}} """ if __name__ == '__main__': key = raw_input('user>') d = Stripe(key).charge(100) print 'charged', d['paid'] s = Stripe(key).check(d[u'id']) print 'paid', s['paid'], s['amount'], s['currency'] s = Stripe(key).refund(d[u'id']) print 'refunded', s['refunded'] web2py-2.12.3.orig/gluon/contrib/websocket_messaging.py0000664000000000000000000002076412564727264021657 0ustar rootroot# -*- coding: utf-8 -*- #!/usr/bin/env python """ This file is part of the web2py Web Framework Copyrighted by Massimo Di Pierro License: LGPLv3 (http://www.gnu.org/licenses/lgpl.html) Attention: Requires Chrome or Safari. For IE of Firefox you need https://github.com/gimite/web-socket-js 1) install tornado (requires Tornado 3.0 or later) easy_install tornado 2) start this app: python gluon/contrib/websocket_messaging.py -k mykey -p 8888 3) from any web2py app you can post messages with from gluon.contrib.websocket_messaging import websocket_send websocket_send('http://127.0.0.1:8888', 'Hello World', 'mykey', 'mygroup') 4) from any template you can receive them with When the server posts a message, all clients connected to the page will popup an alert message Or if you want to send json messages and store evaluated json in a var called data: - All communications between web2py and websocket_messaging will be digitally signed with hmac. - All validation is handled on the web2py side and there is no need to modify websocket_messaging.py - Multiple web2py instances can talk with one or more websocket_messaging servers. - "ws://127.0.0.1:8888/realtime/" must be contain the IP of the websocket_messaging server. - Via group='mygroup' name you can support multiple groups of clients (think of many chat-rooms) Here is a complete sample web2py action: def index(): form=LOAD('default', 'ajax_form', ajax=True) script=SCRIPT(''' jQuery(document).ready(function(){ var callback=function(e){alert(e.data)}; if(!$.web2py.web2py_websocket('ws://127.0.0.1:8888/realtime/mygroup', callback)) alert("html5 websocket not supported by your browser, try Google Chrome"); }); ''') return dict(form=form, script=script) def ajax_form(): form=SQLFORM.factory(Field('message')) if form.accepts(request,session): from gluon.contrib.websocket_messaging import websocket_send websocket_send( 'http://127.0.0.1:8888', form.vars.message, 'mykey', 'mygroup') return form https is possible too using 'https://127.0.0.1:8888' instead of 'http://127.0.0.1:8888', but need to be started with python gluon/contrib/websocket_messaging.py -k mykey -p 8888 -s keyfile.pem -c certfile.pem for secure websocket do: web2py_websocket('wss://127.0.0.1:8888/realtime/mygroup',callback) Acknowledgements: Tornado code inspired by http://thomas.pelletier.im/2010/08/websocket-tornado-redis/ """ import tornado.httpserver import tornado.websocket import tornado.ioloop import tornado.web import hmac import sys import optparse import urllib import time listeners, names, tokens = {}, {}, {} def websocket_send(url, message, hmac_key=None, group='default'): sig = hmac_key and hmac.new(hmac_key, message).hexdigest() or '' params = urllib.urlencode( {'message': message, 'signature': sig, 'group': group}) f = urllib.urlopen(url, params) data = f.read() f.close() return data class PostHandler(tornado.web.RequestHandler): """ only authorized parties can post messages """ def post(self): if hmac_key and not 'signature' in self.request.arguments: self.send_error(401) if 'message' in self.request.arguments: message = self.request.arguments['message'][0] group = self.request.arguments.get('group', ['default'])[0] print '%s:MESSAGE to %s:%s' % (time.time(), group, message) if hmac_key: signature = self.request.arguments['signature'][0] if not hmac.new(hmac_key, message).hexdigest() == signature: self.send_error(401) for client in listeners.get(group, []): client.write_message(message) class TokenHandler(tornado.web.RequestHandler): """ if running with -t post a token to allow a client to join using the token the message here is the token (any uuid) allows only authorized parties to joins, for example, a chat """ def post(self): if hmac_key and not 'message' in self.request.arguments: self.send_error(401) if 'message' in self.request.arguments: message = self.request.arguments['message'][0] if hmac_key: signature = self.request.arguments['signature'][0] if not hmac.new(hmac_key, message).hexdigest() == signature: self.send_error(401) tokens[message] = None class DistributeHandler(tornado.websocket.WebSocketHandler): def check_origin(self, origin): return True def open(self, params): group, token, name = params.split('/') + [None, None] self.group = group or 'default' self.token = token or 'none' self.name = name or 'anonymous' # only authorized parties can join if DistributeHandler.tokens: if not self.token in tokens or not token[self.token] is None: self.close() else: tokens[self.token] = self if not self.group in listeners: listeners[self.group] = [] # notify clients that a member has joined the groups for client in listeners.get(self.group, []): client.write_message('+' + self.name) listeners[self.group].append(self) names[self] = self.name print '%s:CONNECT to %s' % (time.time(), self.group) def on_message(self, message): pass def on_close(self): if self.group in listeners: listeners[self.group].remove(self) del names[self] # notify clients that a member has left the groups for client in listeners.get(self.group, []): client.write_message('-' + self.name) print '%s:DISCONNECT from %s' % (time.time(), self.group) # if your webserver is different from tornado server uncomment this # or override using something more restrictive: # http://tornado.readthedocs.org/en/latest/websocket.html#tornado.websocket.WebSocketHandler.check_origin # def check_origin(self, origin): # return True if __name__ == "__main__": usage = __doc__ version = "" parser = optparse.OptionParser(usage, None, optparse.Option, version) parser.add_option('-p', '--port', default='8888', dest='port', help='socket') parser.add_option('-l', '--listen', default='0.0.0.0', dest='address', help='listener address') parser.add_option('-k', '--hmac_key', default='', dest='hmac_key', help='hmac_key') parser.add_option('-t', '--tokens', action='store_true', default=False, dest='tokens', help='require tockens to join') parser.add_option('-s', '--sslkey', default=False, dest='keyfile', help='require ssl keyfile full path') parser.add_option('-c', '--sslcert', default=False, dest='certfile', help='require ssl certfile full path') (options, args) = parser.parse_args() hmac_key = options.hmac_key DistributeHandler.tokens = options.tokens urls = [ (r'/', PostHandler), (r'/token', TokenHandler), (r'/realtime/(.*)', DistributeHandler)] application = tornado.web.Application(urls, auto_reload=True) if options.keyfile and options.certfile: ssl_options = dict(certfile=options.certfile, keyfile=options.keyfile) else: ssl_options = None http_server = tornado.httpserver.HTTPServer(application, ssl_options=ssl_options) http_server.listen(int(options.port), address=options.address) tornado.ioloop.IOLoop.instance().start() web2py-2.12.3.orig/gluon/contrib/redis_cache.py0000664000000000000000000002361312564727262020057 0ustar rootroot""" Developed by niphlod@gmail.com Released under web2py license because includes gluon/cache.py source code """ import redis from redis.exceptions import ConnectionError from gluon import current from gluon.cache import CacheAbstract try: import cPickle as pickle except: import pickle import time import re import logging import thread import random logger = logging.getLogger("web2py.cache.redis") locker = thread.allocate_lock() def RedisCache(*args, **vars): """ Usage example: put in models from gluon.contrib.redis_cache import RedisCache cache.redis = RedisCache('localhost:6379',db=None, debug=True, with_lock=True, password=None) :param db: redis db to use (0..16) :param debug: if True adds to stats() the total_hits and misses :param with_lock: sets the default locking mode for creating new keys. By default is False (usualy when you choose Redis you do it for performances reason) When True, only one thread/process can set a value concurrently When you use cache.redis directly you can use value = cache.redis('mykey', lambda: time.time(), with_lock=True) to enforce locking. The with_lock parameter overrides the one set in the cache.redis instance creation cache.redis.stats() returns a dictionary with statistics of Redis server with one additional key ('w2p_keys') showing all keys currently set from web2py with their TTL A little wording on how keys are stored (and why the cache_it() function and the clear() one look a little bit convoluted): there are a lot of libraries that just store values and then use the KEYS command to delete it. Until recent releases of this module, that technique was used here too. In the need of deleting specific keys in a database with zillions keys in it (other web2py apps, other applications in the need of a Redis stack) the KEYS command is slow (it needs to scan every key in the database). So, we use Redis 'sets' to store keys in "buckets"... - every key created gets "indexed" in a bucket - all buckets are indexed in a fixed key that never expires - all keys generated within the same minute go in the same bucket - every bucket is then set to expire when every key within it is expired When we need to clear() cached keys: - we tell Redis to SUNION all buckets - gives us just the keys that are not expired yet - buckets that are expired are removed from the fixed set - we scan the keys and then delete them """ locker.acquire() try: instance_name = 'redis_instance_' + current.request.application if not hasattr(RedisCache, instance_name): setattr(RedisCache, instance_name, RedisClient(*args, **vars)) return getattr(RedisCache, instance_name) finally: locker.release() class RedisClient(object): meta_storage = {} MAX_RETRIES = 5 RETRIES = 0 def __init__(self, server='localhost:6379', db=None, debug=False, with_lock=False, password=None): self.server = server self.password = password self.db = db or 0 host, port = (self.server.split(':') + ['6379'])[:2] port = int(port) self.request = current.request self.debug = debug self.with_lock = with_lock self.prefix = "w2p:%s:" % (self.request.application) if self.request: app = self.request.application else: app = '' if not app in self.meta_storage: self.storage = self.meta_storage[app] = { CacheAbstract.cache_stats_name: { 'hit_total': 0, 'misses': 0, }} else: self.storage = self.meta_storage[app] self.cache_set_key = 'w2p:%s:___cache_set' % (self.request.application) self.r_server = redis.Redis(host=host, port=port, db=self.db, password=self.password) def initialize(self): pass def __call__(self, key, f, time_expire=300, with_lock=None): if with_lock is None: with_lock = self.with_lock if time_expire is None: time_expire = 24 * 60 * 60 newKey = self.__keyFormat__(key) value = None ttl = 0 try: #is there a value obj = self.r_server.get(newKey) #what's its ttl if obj: ttl = self.r_server.ttl(newKey) if ttl > time_expire: obj = None if obj: #was cached if self.debug: self.r_server.incr('web2py_cache_statistics:hit_total') value = pickle.loads(obj) elif f is None: #delete and never look back self.r_server.delete(newKey) else: #naive distributed locking if with_lock: lock_key = '%s:__lock' % newKey try: while True: lock = self.r_server.setnx(lock_key, 1) if lock: value = self.cache_it(newKey, f, time_expire) break else: time.sleep(0.2) #did someone else create it in the meanwhile ? obj = self.r_server.get(newKey) if obj: value = pickle.loads(obj) break finally: self.r_server.delete(lock_key) else: #without distributed locking value = self.cache_it(newKey, f, time_expire) return value except ConnectionError: return self.retry_call(key, f, time_expire, with_lock) def cache_it(self, key, f, time_expire): if self.debug: self.r_server.incr('web2py_cache_statistics:misses') cache_set_key = self.cache_set_key expireat = int(time.time() + time_expire) + 120 bucket_key = "%s:%s" % (cache_set_key, expireat / 60) value = f() value_ = pickle.dumps(value, pickle.HIGHEST_PROTOCOL) if time_expire == 0: time_expire = 1 self.r_server.setex(key, value_, time_expire) #print '%s will expire on %s: it goes in bucket %s' % (key, time.ctime(expireat)) #print 'that will expire on %s' % (bucket_key, time.ctime(((expireat/60) + 1)*60)) p = self.r_server.pipeline() #add bucket to the fixed set p.sadd(cache_set_key, bucket_key) #sets the key p.setex(key, value_, time_expire) #add the key to the bucket p.sadd(bucket_key, key) #expire the bucket properly p.expireat(bucket_key, ((expireat/60) + 1)*60) p.execute() return value def retry_call(self, key, f, time_expire, with_locking): self.RETRIES += 1 if self.RETRIES <= self.MAX_RETRIES: logger.error("sleeping %s seconds before reconnecting" % (2 * self.RETRIES)) time.sleep(2 * self.RETRIES) self.__init__(self.server, self.db, self.debug, self.with_lock) return self.__call__(key, f, time_expire, with_locking) else: self.RETRIES = 0 raise ConnectionError('Redis instance is unavailable at %s' % ( self.server)) def increment(self, key, value=1): try: newKey = self.__keyFormat__(key) return self.r_server.incr(newKey, value) except ConnectionError: return self.retry_increment(key, value) def retry_increment(self, key, value): self.RETRIES += 1 if self.RETRIES <= self.MAX_RETRIES: logger.error("sleeping some seconds before reconnecting") time.sleep(2 * self.RETRIES) self.__init__(self.server, self.db, self.debug, self.with_lock) return self.increment(key, value) else: self.RETRIES = 0 raise ConnectionError('Redis instance is unavailable at %s' % ( self.server)) def clear(self, regex): """ Auxiliary function called by `clear` to search and clear cache entries """ r = re.compile(regex) #get all buckets buckets = self.r_server.smembers(self.cache_set_key) #get all keys in buckets if buckets: keys = self.r_server.sunion(buckets) else: return prefix = self.prefix pipe = self.r_server.pipeline() for a in keys: if r.match(str(a).replace(prefix, '', 1)): pipe.delete(a) if random.randrange(0,100) < 10: #do this just once in a while (10% chance) self.clear_buckets(buckets) pipe.execute() def clear_buckets(self, buckets): p = self.r_server.pipeline() for b in buckets: if not self.r_server.exists(b): p.srem(self.cache_set_key, b) p.execute() def delete(self, key): newKey = self.__keyFormat__(key) return self.r_server.delete(newKey) def stats(self): statscollector = self.r_server.info() if self.debug: statscollector['w2p_stats'] = dict( hit_total=self.r_server.get( 'web2py_cache_statistics:hit_total'), misses=self.r_server.get('web2py_cache_statistics:misses') ) statscollector['w2p_keys'] = dict() for a in self.r_server.keys("w2p:%s:*" % ( self.request.application)): statscollector['w2p_keys']["%s_expire_in_sec" % (a)] = self.r_server.ttl(a) return statscollector def __keyFormat__(self, key): return '%s%s' % (self.prefix, key.replace(' ', '_')) web2py-2.12.3.orig/gluon/contrib/timecollect.py0000664000000000000000000000666712564727264020146 0ustar rootroot# Only Python 2.6 and up, because of NamedTuple. import time from collections import namedtuple Score = namedtuple('Score', ['tag', 'stamp']) class TimeCollector(object): def __init__(self): '''The first time stamp is created here''' self.scores = [Score(tag='start', stamp=time.clock())] def addStamp(self, description): '''Adds a new time stamp, with a description.''' self.scores.append(Score(tag=description, stamp=time.clock())) def _stampDelta(self, index1, index2): '''Private utility function to clean up this common calculation.''' return self.scores[index1].stamp - self.scores[index2].stamp def getReportItems(self, orderByCost=True): '''Returns a list of dicts. Each dict has start (ms), end (ms), delta (ms), perc (%), tag (str) ''' self.scores.append(Score(tag='finish', stamp=time.clock())) total_time = self._stampDelta(-1, 0) data = [] for i in range(1, len(self.scores)): delta = self._stampDelta(i, i - 1) if abs(total_time) < 1e-6: perc = 0 else: perc = delta / total_time * 100 data.append( dict( start=self._stampDelta(i - 1, 0) * 1000, end=self._stampDelta(i, 0) * 1000, delta=delta * 1000, perc=perc, tag=self.scores[i].tag ) ) if orderByCost: data.sort(key=lambda x: x['perc'], reverse=True) return data def getReportLines(self, orderByCost=True): '''Produces a report of logged time-stamps as a list of strings. if orderByCost is False, then the order of the stamps is chronological.''' data = self.getReportItems(orderByCost) headerTemplate = '%10s | %10s | %10s | %11s | %-30s' headerData = ('Start(ms)', 'End(ms)', 'Delta(ms)', 'Time Cost', 'Description') bodyTemplate = '%(start)10.0f | %(end)10.0f | %(delta)10.0f |' \ + ' %(perc)10.0f%% | %(tag)-30s' return [headerTemplate % headerData] + [bodyTemplate % d for d in data] def getReportText(self, **kwargs): return '\n'.join(self.getReportLines(**kwargs)) def restart(self): self.scores = [Score(tag='start', stamp=time.clock())] if __name__ == '__main__': print('') print('Testing:') print('') # First create the collector t = TimeCollector() x = [i for i in range(1000)] # Every time some work gets done, add a stamp t.addStamp('Initialization Section') x = [i for i in range(10000)] t.addStamp('A big loop') x = [i for i in range(100000)] t.addStamp('calling builder function') # Finally, obtain the results print('') print(t.getReportText()) # If you want to measure something else in the same scope, you can # restart the collector. t.restart() x = [i for i in range(1000000)] t.addStamp('Part 2') x = [i for i in range(1000000)] t.addStamp('Cleanup') # And once again report results print('') print(t.getReportText()) t.restart() for y in range(1, 200, 20): x = [i for i in range(10000) * y] t.addStamp('Iteration when y = ' + str(y)) print('') # You can turn off ordering of results print(t.getReportText(orderByCost=False)) web2py-2.12.3.orig/gluon/contrib/populate.py0000664000000000000000000554543212564727262017474 0ustar rootrootimport re import cPickle import random import datetime IUP = {'shoebill':{'a':1,'187':1},'trout-like':{'parr':1},'fig.':{'19':1},'mcintosh.':{'the':1,'illustration':1},'chiasmodon':{'niger':2},'yellow':{'and':4,'giant':1,'green':2,'red':1,'spots':1},'four':{'brightly':1,'hundred':1,'haunts':1,'feet':1,'solutions':2,'hours.':1,'things':1,'long':1,'.':2,'legs':1,'inches':4,'thousand':1,'million':1,'pairs':2,'hours':1,'satellites':1,'tufts':1,'great':1,'main':1,'of':1,'months':1,'days':1,'times':4,'volumes':1,'inches.':1,'frilled':2,'or':3},'snapping-blades':{'the':1},'aegir':{'on':4},'hanging':{'down':1,'on':2},'bird--evidences':{'of':1},'canes':{'venatici':1},'inheritance.':{'looking':1},'electricity':{'and':5,'belong':1,'is':4,'rotating':2,'held':1,'as':1,'sec':1,'in':1,'yet':1,'predominates':1,'from':1,'there':1,'.':9,'to':1,'which':4,';':4,'has':1,'we':1,'that':1,'here':1,'i.e':1,'like':1,'repel':1,'the':2,'or':1,'attracting':1},'similarity':{'of':3,'between':1},'sunlit':{'side':1},'superficially':{'indistinguishable':1,'like':1},'out-breeding':{'among':1,'when':1,'exogamy':1},'lord':{'popular':1,'kelvin':5,'avebury':1},'non-intelligent':{'experiments':1},'flicking':{'out':1},'meadows':{'and':2,'an':1},'sinking':{'down':2,'according':1,'in':1},'digit':{'of':1,'well':1},'co-operation':{'of':2},'oceans':{'lie':1,'of':1,'there':1,'are':1,'goes':1,'must':1},'pigment':{'and':1,'is':2,'.':1,'as':1,'which':1,';':1},'figs':{'.':1},'fingers.':{'but':1},'experimentally':{'on':1},'bringing':{'of':1,'about':1,'the':2},'elevations':{'and':1,'of':1},'meadow.':{'in':1},'internally':{'hot':1},'whitman':{'says':1,'took':1},'colour--the':{'result':2},'stars.':{'yet':1},'persisted':{'as':1,'until':1},'chameleons':{'the':1,'.':1},'intensification':{'of':1},'succession':{'giving':1,'of':5,'the':1,'has':1,'.':1},'tube--the':{'walls':1},'ultra-violet':{'and':1,'light':1,'waves--which':1,'or':1,'waves':1},'straight':{'ahead':1,'drop':1,'lines':1,'down':1,'through':1,'in':1,'path':2,'line':1,'legs':1,'along':1},'spiders':{'about':1,'were':1,'it':1,'.':1,'scorpions':1,'are':1,'have':1,'in':1},'specially':{'protected':1,'adapted':1},'symmetry.':{'illustration':1},'stiffens':{'.':1},'270':{'a':1,'silk':1,'reproduced':1},'271':{'electrical':1,'from':1},'second':{'and':5,'layer':1,'when':1,'year':1,'extinction':1,'yet':1,'any':1,'group':1,'would':3,'there':1,'question':2,'.':10,'to':1,'millennium':1,'which':1,';':1,'then':1,'we':1,'advantage':1,'that':1,'class':1,'screen.':1,'interglacial':1,'every':1,'longest':1,'not':1,'cousin':1,'copy':1,'opportunity':1,'by':1,'a':1,'great':1,'these':1,'of':1,'or':1,'preparation':1,'printing':1,'error':1,'position':1,'the':2,'chapter':1,'photograph':2},'attended':{'the':1,'by':2},'274':{'photo':1},'275':{'from':1},'278':{'hours':1,'photo':1},'279':{'rotating':1,'the':2},'inanimate':{'world':1},'dormancy':{'.':1},'errors':{'a':1,'in':1},'semicircular':{'canals':1},'phalangers':{'and':1,'flying':1},'thunder':{'and':1,'means':1},'nature.':{'the':1,'typical':1,'what':1,'illustration':1,'one':1},'contributed':{'every':1},'fingers':{'and':6,'to':1,';':1,'2':1,'knocking':1},'lowliness':{'.':1},'fossil':{'horses':1,'remains':2,'series':1,'forms':2,'scorpions':1,'of':2,'species':1},'increasing':{'control--a':1,'temperature':1,'facility':1,'intelligence':1,'complexity':2,'fullness':1,'the':1,'with':1,'day':1},'inducement':{'many':1},'surface--the':{'photosphere--is':1},'chins':{'and':1},'error':{'a':1,'we':1,'is':1,'here':1,'method':2,'to':1,';':1,'or':1,'must':1},'here':{'and':5,'says':1,'is':5,'within':1,'some':1,'it':1,'anticipating':1,'go':1,'seen':1,'again':4,'for':1,'also':1,'rather':1,'concerned':1,'since':1,'.':1,'to':3,'only':2,'cockchafers':1,'you':1,'was':2,'refer':1,'we':2,'let':1,'with':1,'nor':1,'a':1,'of':1,'spontaneously':1,'the':2,'stimulating':1,'are':1},'atoms':{'and':10,'being':1,'is':1,'an':1,'270':1,'whilst':1,'exist':1,'are':4,'have':1,'in':3,'seem':1,'seek':1,'containing':1,'indivisible':1,'from':1,'appear':1,'would':1,'with':1,'had':1,'.':5,'which':2,'got':1,';':2,'has':1,'was':1,'into':1,'do':2,'form':1,'were':4,'but':1,'atoms':2,'break':1,'most':1,'they':1,'put':1,'come':1,'themselves':1,'he':1,'for':1,'of':33,'enter':1,'the':2,'first':1,'at':1},'reported':{'to':1,'in':1,'that':1},'china':{'and':1},'evolutionist':{'s':1,'ideas':1,'suggestion':1},'fire.':{'chief':1,'saturn':1},'substance':{'in':1,'both':1,'from':2,'would':1,'is':1,'after':1,'glowing':1,'reaches':1,'.':3,'will':1,'to':1,'as':2,'but':1,'which':2,'were':1,'known':1,'has':1,'by':1},'contribute.':{'another':1},'k':{'.':1},'second--more':{'than':1},'reports':{'performances':1},'controversy':{'as':1},'forbes':{'observed':1,'tells':1,'history':1},'symmetrical':{'fishes.':1},'heidelbergensis':{'discovered':1},'appropriately':{'giants':1},'divide':{'a':1,'in':1},'owed':{'to':1},'explained':{'on':1,'because':1,'presently':1,'that':1,'later':1,'in':4,'by':1},'lengthen':{'the':1},'replace':{'the':4,'it':1},'brought':{'about':3,'to':3,'into':2,'up':1,'us':1,'their':1,'outside':1,'near':2,'through':1,'together':1,'in':1,'the':1,'its':1},'larger.':{'6':1},'female.':{'the':1},'obligation':{'works':1},'unit':{'body':1,'of':1,'for':1,'areas':1},'disproved--e.g':{'.':1},'spoke':{'of':3},'temperature.':{'if':1},'1892':{'.':1},'occupying':{'a':1},'vol':{'.':4},'untie':{'knots':1},'therefore':{'there':1,'is':2,'it':1,'one':2,'as':1,'are':2,'have':1,'even':1,'little':1,'since':1,'to':1,'survey':1,'means':1,'more':1,'form':1,'that':7,'imagine':1,'not':1,'conspicuous':1,'must':1,'a':2,'always':1,'so':1,'contain':1,'the':1,'called':1},'strike':{'a':1,'to':1,'the':2},'fossiliferous':{'beds':1},'until':{'comparatively':1,'some':1,'it':7,'one':1,'discovered':1,'at':3,'in':1,'its':2,'there':1,'when':1,'finally':1,'we':1,'recently':1,'that':1,'they':5,'such':1,'inconceivable':1,'a':3,'both':1,'i':1,'near':1,'the':3,'once':1},'skill.':{'illustration':1},'females':{'go':1,'the':1,'who':1,'use':1},'9.':{'instinctive':1},'successful':{'hunting':1,'accomplishment':2,'.':1,'notably':1,'race':1,'animal':1,'in':1,'performance':1,';':2,'class':1},'brings':{'about':1,'his':1,'this':1,'them':1,'us':1,'obvious':1,'the':1},'whirling':{'nebulae.':1,'gaseous':1,'streams':1,'motions':1,'electrons':1,'ring':1,'round':1},'glass':{'and':1,'on':1,'by':1,'blown':1,'wall':1,'of':1,'tube':1,'jar':1,'prism':3,'vulcanite':1,'.':2,'walls':1,'vibrate':1,'prism--a':1,'the':2,'tubes':1,'model':2},'inwards':{'each':1},'91':{'photo':1,'after':1,'pictorial':1},'90':{'photo':1,'from':1,'days':2,'per':1},'midst':{'of':1},'92':{'830':2,'as':1,'fossil':1},'95':{'photo':1,'from':1},'immature':{'sperm':1,'egg':1,'larval':1},'circumstances':{'and':1,'of':1,'it':1,'however':1,'indicate':1,'as':1},'locked':{'up':3},'mimickers':{'do':1,'live':1,'though':1,'survive--although':1},'pursue':{'further':1,'the':1},'accomplishment':{'of':2,'would':1},'plunged':{'in':1},'tell-tale':{'evidence':2},'temperatures':{'and':2,'as':1,'enormously':1,'but':1,';':1},'concepts':{'differ':1,'or':1},'plunges':{'into':1},'example':{'a':2,'passes':1,'of':5,'is':1,'three':1,'.':1,'the':1,'out':1},'type.':{'there':1,'steps':1,'it':1,'illustration':1},'encouragement.':{'evidences':1},'nitrates':{'which':1},'organized':{'under':1},'shore.':{'the':1},'dragons':{'and':1,'a':1,'for':1,'stalking':1,'which':1,'the':1,'or':1},'glued':{'to':1,'together':2},'caution':{'is':2,':':1,'in':2},'kingdoms':{'to':1},'want':{'to':1,'that':1},'oil-sheet':{'by':1},'absolute':{'cold':1,'calm':1,'zero':2},'disappearing.':{'thus':1},'travel':{'from':2,'for':1,'that':2,'fifteen':1,'is':1,'it':1,'.':2,'through':1,'at':3,'in':3,'rapidly':1,'with':1,'by':1,'round':1},'drying':{'up':1},'feature':{'of':2,'is':1,'in':2,'that':1},'machine':{'and':1,'readable':1,'which':1,'in':1},'how':{'beautiful':1,'this':2,'all':2,'useful':1,'striking':1,'vertebrates':1,'abundantly':1,'it':6,'long':4,'in':1,'curious':1,'your':1,'their':2,'thoroughly':1,'sunlight':1,'.':1,'to':9,'much':1,'--all':1,'he':1,'admirable':1,'is':1,'whipped':1,'noble':1,'we':4,'express':1,'do':4,'men':1,'but':1,'soon':1,'magnetism':1,'important':1,'infinite':1,'man':1,'a':1,'like':2,'these':2,'many':4,'could':2,'well':1,'swiftly':1,'did':1,'electrons':1,'can':1,'the':14,'professor':1,'are':2},'krait':{':':2,'should':1},'hop':{'.':1},'significance':{'of':3,'is':1,'.':1,'was':1,'that':1},'mueller':{'where':1},'uselessness':{'of':1},'utilise':{'their':1,'the':7,'atomic':1,'directly':1},'ptarmigan':{'very':1,'moults':1},'diagram':{'a':1,'and':1,'illustrating':3,'illustrates':2,'of':10,'showing':3,'.':4,'fig':2,'shows':2,'is':3,'constructed':1},'dinosaurs':{'and':1,'it':1,'which':1,'in':1},'wrong':{'and':1,'side':1,'though':1},'lattice-work':{'than':1,'but':1},'destined':{'to':3,'within':1},'twined':{'round':1},'pearl-bearing':{'river-mussels':1},'factor.':{'we':1},'types':{'and':2,'we':1,'like':2,'especially':1,'that':2,'of':10,'it':1,'.':2,'are':3,'which':3,'suited':1,'the':1,'has':1,'nearly':1},'calves':{'young':1},'effective':{'and':1,'substitutes':1,'ways':1,'camouflaging':1,'flying':1,'.':1,'action':1,';':1,'response':1},'endeavoured':{'instead':1},'attracts':{'every':1},'headquarters':{'of':1},'specks':{'faintly':1},'keeps':{'the':1,'as':1,'an':1},'back--till':{'we':1},'wing':{'and':1,'remains':1,'of':4,'is':3,'.':3,'while':1,'action':1,'has':1,'was':2},'wind':{'and':3,'tugs':1,'from':1,'around':1,'that':1,'pay':1,'.':1,'falls':1},'wine':{'decanter':1},'ovule':{'so':1},'restriction':{'attendant':1},'school.':{'as':1},'effect.':{'the':1,'illustration':1},'vary':{'a':1,'enormously':1,'.':1},'halfpennies':{'.':1},'microbe':{'or':1},'fore-limbs':{'and':3,'a':1,'emerging':1,'of':1},'elevated':{'into':1},'rewarded':{'the':2},'throne.':{'illustration':1},'wrought':{'on':1,'out':2,'in':1},'admirably':{'suited':1},'matures':{'or':1},'fit':{'and':2,'effected':1,'variations':1,'will':1,'to':2,'beautiful':1,'lasts':1,'the':1},'bodies--evolution':{'of':2},'heretofore':{'unimagined':1},'fix':{'dates':1,'after':1,'the':1},'occupations':{'and':1,'whether':1},'survivors':{'in':1},'woolly-haired':{'africans':1,'african':1},'anticipations':{'at':1},'fig':{'4':1,'.':36},'nobler':{'more':1},'hidden':{'disc':1,'from':1,'secrets.':1,'or':1},'alpine':{'heights':1},'admirable':{'indeed':1,'is':1,'adjustment':1,'in':1},'easier':{'to':4,'for':1},'bristle':{'.':1},'bolton.':{'the':3,'orang-utan':1,'chimpanzee':1,'cassowary':1},'f.r.s':{'.':1},'effects':{'and':1,'on':1,'from':1,'of':2,'due':1,'.':1,'are':1},'stars;':{'their':1},'coal-fields':{'is':1,'can':1},'devices.':{'vii':1,'illustration':1},'prize':{'is':1},'represents':{'a':2,'the':4,'an':1},'educable.':{'illustration':1},'humming-birds':{'we':1},'arrow':{'round':1,'shows':1},'obdurate':{'solid':1},'burial':{'customs':1},'financial':{'support':1},'telescope':{'and':1,'because':1,'show':1,'developed':1,'is':4,'it':1,'depends':1,'at':1,'in':1,'takes':1,'49':1,'remains':1,'.':3,':':1,'was':1,'brings':1,'construction':2,'with':1,'of':1,'mount':2,'weigh':1,'the':2},'garment':{'of':5,'by':1,'.':1},'spider':{'called':1,'203':1,'has':1,'that':1,'may':2,'dr':1,'ascends':1,'after':1,'reaches':1,'sunning':2,'jerks':1,'to':4,'s':1,'which':1,'--brushes':1,'with':1,'is':1,'ornithoscatoides':1},'parasites':{'a':1,'have':1,'may':1,'casual':1,'as':1,'are':2,'which':1,'or':1,'often':1},'armour--the':{'sea-urchin':1},'contracting':{'striped':1,'muscles':1,'mass':1,'the':1,'its':1},'depositing':{'eggs':1},'laboratory':{'cambridge':1,'would':1,'had':1,'but':1,'.':1,'at':1,'in':1,';':1,'or':1},'nerve-cell':{'s.c.':1,'m.c.':1,'a.c.':1},'message':{'travels':3,'is':2,'reaches':1},'borne':{'on':1,'just':1,'away':1,'in':1,'usually':1,'by':2,'out':1},'speed.':{'in':1},'excepting':{'the':1},'ice-sheets':{'retreated':1},'unrelated':{'types':1},'adapt':{'itself':1},'centauri':{'4.29':1,'estimated':1},'foundation':{'and':3,'web':1,'makes':1,'is':2,'as':1,'.':3,'project':1,'how':1,'s':3,'at':1,'in':1,'the':5,'was':1,'or':1,'are':1,'anyone':1},'stamping':{'a':1},'assured':{'that':1},'waddle':{'130':1},'strata':{'of':3,'is':1,'when':1,'contained':1,'have':1,';':1,'with':1},'solution':{'containing':1,'that':1,'may':1,'of':4,'within':1,'when':1,'has':1,'was':1},'sensory':{'nerve-fibre':2,'nerve-cell':1,'equipment':1,'nerve-cells':1,'stimulus':1,'fibres':1,'alertness':1},'born.':{'but':1},'crowned':{'with':1},'estimate':{'and':1,'obtained':1,'being':1,'how':1,'this':1,'of':2,'its':1,'these':1,'by':1},'universally':{'true':1},'enormous':{'distances':2,'energy':1,'number':1,'disc-like':1,'pressure--2-1':1,'size':1,'infantile':2,'vibration':1,'speed':1,'depths.':1,'amount':2,'increase':1,'pressures':1,'role':1,'store':1,'dilatable':1,'pressure':1,'jets':1,'velocities':1,'length':1,'activity':1,'velocity':1,'the':1},'bates':{'tells':1,'but':1},'exposing':{'it':1},'merychippus':{';':1,'miocene':1},'shelves':{'of':1},'hind-limbs':{'of':2},'perhaps.':{'moreover':1},'elements--we':{'have':1},'disturbed':{'development':1,'and':1,'.':2},'tempting':{'but':1,'one':1},'ineffectively':{'or':1},'speeds':{'to':1},'appreciable':{'atmosphere':1},'gas-bubbles':{'and':1,'in':1},'wasp':{'or':1,'beetle':2},'subtlety':{'in':1,'that':1},'maladies':{'to':1},'channels':{'or':1},'spinning':{'slowly':1,'threads':1,'round':1},'179':{'a':1,'photograph':1,'reproduced':1},'178':{'photo':1,'after':1},'likes.':{'illustration':1},'175':{'after':1},'174':{'after':1},'flagella':{'.':1},'172':{'000':1,'piltdown':1},'171':{'reproduced':1},'170':{'after':1,'from':1},'bitten':{'by':1},'service':{'to':1,'in':2,'abroad':1,'.':1},'similarly':{'for':1,'suggest':1,'when':1,'our':1,'the':3,'adapted':1,'out':1},'cooling':{'and':1,'white-hot':1,'of':3,'metal':1,'but':1,'down':3,'earth':1,'the':1},'needed':{'.':1,'for':1,'in':1},'master':{'of':1,'the':2,'different':1},'blossoms':{'.':1},'gilbert':{'white':1},'legs':{'and':4,'on':1,'free':1,'.':3,'to':1,'indents':1,'so':1,'are':1,'out':1},'genesis':{'of':1,'.':1},'treasure-house':{'of':1},'listen':{'it':1},'rewards':{'to':1},'fibrous':{'husk':1},'wisdom':{'of':1,'in':1},'egg-producer':{'.':1},'motionless':{'on':1,'at':1,'that':1},'predictable':{'and':1},'collaterals':{'hundreds':1,'.':1},'scarborough':{'and':2},'positively':{'say':2,'that':1,'into':1,'charged':1},'insect-visitors':{';':1},'surer':{'by':1},'showed':{'a':1,'on':1,'great':1,'for':1,'that':9,'is':1,'how':2,'simian':1,'the':1},'miniatures':{'of':1},'tree':{'and':2,'217':1,'notice':1,'of':5,'into':1,'struggles':1,'but':1,'.':2,'to':3,'near':1,'i.e':1,'with':1,'is':2,'before':1},'likely':{'to':5,'that':1,'unless':1,'it':1,'however':1},'idly':{'on':1,'why':1},'project':{'gutenberg-tm':56,'gutenberg':29,'gutenberg:':1,'gutenberg-tm.':1,'from':1},'fly-trap':{'77':1,'when':1,'one':1},'feeling':{'and':2,'of':1,'is':1,'.':1,'their':2,'things':1,'or':1},'acquisition':{'almost':1,'of':1,'made':1,'associated':1,'by':1},'life--the':{'first':2},'groaning':{'and':3},'objects':{'and':1,'do':1,'for':1,'very':1,'but':1,'.':2,'271':1,'take':1,'in':2},'similitude':{'of':2},'oxygen-capture':{';':1},'spectrum':{'and':2,'rays':1,'provides':1,'of':4,'is':2,'emitted':1,'analysis':2,'.':3,'will':1,'as':1,'are':1,'have':1,'the':2},'controversy.':{'in':1},'antagonistic':{'substances':1},'well.':{'illustration':1},'constricted':{'off':1},'oxygen-combustion':{'the':1},'dozen':{'eggs':1,'classes':1,'by':1,'years':1},'affairs':{'on':1,';':1,'would':1},'wholesome':{'superstitions':1},'yolk-forming':{'and':1},'person':{'often':1,'you':1,'or':3,'can':1},'eagerly':{'following':1},'metallic':{'vapours':1},'toothed':{'whales':1,'bird':2,'birds':1},'australia--all':{'sometimes':1},'absorbed':{'but':1,'so':1,'in':1,';':1,'with':1,'by':2},'doors':{'and':1,'of':1,'.':1,'depositing':1,'which':1,'were':1},'season':{'209':1,'it':1,'illustration':1},'concedes':{'the':1},'rhodesia':{'very':1,'178':1},'shall':{'be':2,'we':1,'deal':1,'give':1,'predict':1,'explain':2,'never':1,'content':1,'see':11,'have':1,'not':1,'see.':2,'find':2,'refer':1},'screwing':{'the':1,'it':1},'object':{'and':1,'we':1,'of':2,'.':1,'to':1,'too':1,'in':2,'drawn':1},'diminishing':{'in':1},'victoria':{'b':1,'british':2},'gill-cavity':{'and':1},'mouth':{'and':5,'of':1,'is':1,'there':2,'.':6,'allied':1,'are':1,'in':1,'the':1,'where':1,'into':1,'came':1},'long.':{'in':1},'letter':{'is':1,'there':1,'o':2},'drought':{'and':2,'is':1,'frost':1,'by':1,'extremes':1},'hide-and-seek':{'game':1},'difficulties.':{'illustration':1},'expound':{'their':1},'redistribution':{'is':1},'episode':{'in':1},'available.':{'many':1},'professor':{'holmes':2,'and':1,'thomas':2,'j':3,'tacchini':1,'rayleigh':1,'michael':1,'frederick':1,'chamberlin':1,'yerkes':3,'hickson':1,'starling':1,'lull':3,'church':2,'soddy':3,'eddington':4,'sir':8,'le':1,'royal':1,'young':1,'pickering':1,'soddy.':1,'john':1,'gamble':2,'soddy--as':1,'oscar':1,'perrin':1,'william':1,'flinders':1,'buller':1,'wood':1,'thorndike':3,'e':2,'whitman':1,'h':2,'later':1,'poulton':1,'l':2,'curie':1,'s':1,'r':6,'bayliss':1,'w':3,'of':3,'schuchert':2,'percival':2,'left':1,'schwalbe':1,'lloyd':2},'nineteenth':{'century.':2,'century':6},'mating':{'.':1},'incomplete':{'inaccurate':1,'.':1},'marvel':{'that':1},'hobhouse':{'has':1,'had':1},'insects':{'and':5,'belonging':1,'related':1,'extinct':1,'spring-tails':1,'pterodactyls':1,'whose':1,'by':2,'appear':1,'perhaps':1,'divided':1,'.':3,'to':1,'only':1,'which':1,'birds':1,'we':1,'that':2,'rest':1,'such':1,'with':1,'than':1,'on':1,'made':1,'like':1,'could':1,'carries':1,'can':1,'the':2,'where':1,'spend':1},'sea-snakes':{'such':1},'feather-stars':{'on':1},'apace':{'there':1},'touches':{'the':1,'some':1,'one':1},'flagellates--the':{'originators':1},'methods--one':{'using':1},'shuffling':{'a':1,'the':1},'quaint':{'insects':1,'lop-eared':1,'ways':1,'explorer':1,'creatures':2},'unrest.':{'many':1},'character':{'of':1,'set':1,'except':1},'bush':{'in':1},'touched':{'it.':1,'on':1,'by':1},'rich':{'repertory':1,'inheritance':1,'area':1,'seaweed':1,'in':4},'rice':{';':1},'plate':{'and':2,'reveals':1,'may':1,'of':3,'is':1,'there':1,'however':1,'.':4,'underneath':1,'to':1,'goes':1,';':1,'has':1,'holder':1},'well-advanced':{'stage':1},'wide':{'of':1,'range':2,'spread':1,'departures':1,'apart':1},'foremost':{'living':1},'pocket':{'and':1,'of':1,'is':1},'insect.':{'masking':1},'altogether':{'and':1,'we':1,'from':1,'obscure.':1,'there':1,'.':1,'lies':1,'inattentive.':1,'extinct':1,'the':1,'apart':1},'tips':{'of':1,'form':1},'transmissible.':{'given':1},'societies':{'.':1},'greens':{'and':1},'dipnoi':{'which':1},'patch':{'of':2,'which':1},'men.':{'we':1,'the':1},'fitly':{'use':1},'release':{'date':1,'harness':1},'them.':{'1':1,'we':1,'clodd':1},'hasten':{'matters':1,'however':1},'lesson.':{'we':1},'circling':{'eddies':1,'round':1},'protists':{'the':1,'which':1},'evolutionism':{'with':1},'traverse':{'matter':1,'we':1},'fair':{'to':1},'radium':{'and':6,'discharges':1,'270':1,'as':1,'sec':1,'in':1,'salts':1,'passes':2,'rays':8,'began':1,'that':1,'when':1,'.':2,'to':1,'rays.':1,'john':2,'was':2,'generates':1,'captivated':1,'may':1,'now':1,'a':1,'implied':1,'the':2,'or':2},'niche':{'of':2,'among':1},'radius':{'and':1},'result':{'we':1,'of':10,'is':1,'when':1,'.':1,'will':4,'as':1,'strange':1,'which':1,'in':1,'not':1,'was':2},'fail':{'to':4},'nocturnal':{'birds':1,'animal':1},'skulls':{'high':1,'of':1,'.':1},'best':{'methods':1,'for':1,'of':2,'explanation':1,'.':1,'to':1,'while':1,'suited':1,'thermometer':1,'illustrations':1,'i.e':1,'has':1,'dress':1,'conductors.':1},'oceanic':{'islands':1},'rings':{'and':1,'from':1,'of':1,'mighty':1,'are':1,'in':1,'the':1,'round':1},'frond-like':{'tassels':1,'tags':1},'stealthy':{';':1,'stalking':1},'pressures':{'the':1,'that':1},'score':{'of':1,'but':1,'which':1},'conceptual':{'as':1,'inference':1,'inference--or':1},'propagated':{';':1},'circulating':{'at':1,'the':1,'round':1,'as':1,'in':1},'glasgow':{'and':1},'magnesium':{';':1},'preserve':{'free':1},'claws':{'on':3,'especially':1,'.':1},'men':{'and':2,'indicated':1,'it':1,'as':1,'at':1,'have':1,'oftener':1,'still':1,'ancient':1,'.':5,'to':1,'that--':1,'who':4,'proving':1,'but':2,'arose':1,'with':1,'like':2,'of':19,'s':1,'so':1,'were':1,'the':1,'powers':1,'or':1},'extend':{'far':1,'our':1,'the':1,'towards':1,'outwards':1},'nature':{'and':3,'because':1,'less':1,'is':1,'some':1,'depends':1,'acts':1,'draws':1,'would':1,'there':1,'had':1,'.':5,'which':1,'messrs':2,'drawn':1,';':1,'has':2,'was':3,'more':1,'never':1,'but':1,'includes':1,'november':1,'the':1,'a':1,'about':1,'of':28,'s':8,'ninety-two':1,'messrs.':2,'or':1,'involves':2},'blood-containing':{'tufts':1},'twinkling':{'of':1},'cards':{'and':1,'with':1,'but':1,'.':1,'are':1,'come':1},'extent':{'and':1,'on':2,'what':1,'gauged':1,'of':1,'able':1,'intelligently':1,'by':1,'to':1,';':1,'permitted':1},'carbon':{'immersed':1,'compounds':4,'hydrogen':1,'until':1,'dioxide':1},'debt':{'repaid':1},'well-lighted':{'surface':1},'tyranny':{'of':3},'outcome':{'of':12,'is':2},'sacrificing':{'accuracy':1},'refinement':{'and':1},'country':{'then':1,'of':1,'to':1,'outside':1,'in':2,'nothing':1,'the':1},'conclusions':{'are':1,'which':1},'heating':{'process':1},'tree-toads':{'tree-snakes':1},'dents':{'or':1},'argue':{'fire':1},'adapted':{'for':14,'many':1,'.':1,'to':12,'itself':1,'so':1,'in':1},'asked':{'perhaps':1,'to':1,'what':1,'for':3},'exogamy':{'tending':1},'vain':{'and':1},'canyon':{'60':1,'many':1},'259':{'professor':1},'irresponsibly':{'they':1},'252':{'reproduced':1},'250':{'what':1,'000':2,'miles':1,'fathoms':2,'the':1,'inconceivable':1},'251':{'a':1},'grazing':{'mammals':1,'the':1,'herds':1,'bison':2,'in':1},'254':{'photo':1,'from':1,'reproduced':1},'255':{'reproduced':1},'101':{'after':1},'berenices':{'is':1,'.':1},'union':{'of':3,'with':1},'fro':{'about':1,'more':1},'.':{'secondly':1,'all':12,'three-toed':2,'sci':2,'skeleton':1,'chain':1,'holman':1,'mcintosh.':2,'four':1,'zinc':1,'foundations':1,'contributions':1,'magnifying':1,'certainly':1,'fahr.':1,'father':1,'young':2,'miall':1,'to':27,'finally':2,'romanes':1,'lord':1,'non-intelligent':1,'protective':1,'7':4,'very':5,'every':12,'dando':1,'radio-active':1,'well-finished':1,'f.r.s':1,'louis':1,'laying':1,'t.':1,'p':9,'hickson':1,'small':2,'indemnity':1,'round':1,'upper':1,'feathers':1,'yerkes':1,'electricians':1,'further':1,'langmuir':1,'blue':1,'what':24,'17.--a':1,'pariasaurus':1,'paintings':1,'section':1,'above':3,'dr.':1,'new':3,'movement':1,'cheetahs':1,'sci.':1,'men':1,'here':10,'hundreds':1,'anthropology':2,'let':7,'others':3,'along':3,'f.r.s.':1,'neville':1,'daughter':1,'dividing':1,'chalmers':1,'k':1,'compliance':1,'forbes':3,'usually':1,'adopting':1,'holmes':1,'saunders':3,'24.--the':1,'berridge':8,'newby':1,'cuttlefishes':1,'everybody':1,'from':21,'russell':3,'would':1,'remains':1,'positive':1,'two':5,'anatomical':1,'examination':1,'therefore':2,'6':6,'taken':2,'until':2,'on':19,'flying':3,'inclined':1,'berridge.':10,'chimpanzee':1,'lodge':1,'everywhere':1,'hilger':2,'baby':2,'bates':2,'ward':21,'huxley':3,'dando.':3,'none':2,'animals':2,'f':5,'this':102,'science':5,'when':39,'piltdown':1,'3--the':1,'making':1,'male':1,'history':3,'frogs':1,'high':1,'something':1,'story':1,'presently':1,'sir':2,'end':1,'starch':1,'astronomers':3,'how':7,'orang-utan':1,'occasionally':1,'s.':1,'intelligent':1,'side-view':2,'millikan':2,'information':3,'slipher':1,'perrin':1,'after':15,'deep-sea':1,'waves':1,'such':10,'man':4,'a':95,'forestier':3,'light':6,'clavius':1,'osborn':3,'so':24,'kippax':1,'iii.':1,'sc':1,'evolutionary':1,'barnard':2,'pelican':1,'indeed':4,'21.--typical':1,'murray':2,'thomson':7,'helena':1,'experiments':2,'still':2,'its':14,'soddy':1,'before':1,'25':1,'27':1,'21':1,'22':1,'28':1,'wilkinson.':2,'lowell':5,'23.--star':1,'fabre.':2,'26.--a':1,'estuaries':1,'they':99,'compound':1,'not':6,'olcott':1,'now':23,'nor':2,'nos':1,'6.--solar':1,'f.e.s.':1,'james':1,'radiant':1,'reid.':2,'scharff':1,'associative':1,'weighs':1,'everyone':2,'directly':1,'needless':2,'series':2,'fish':1,'journ':2,'macmillan':3,'12.--jupiter':1,'owing':1,'our':5,'hart':1,'special':2,'out':2,'living':4,'9.--the':1,'furthermore':1,'since':2,'may':1,'america.':3,'safety':1,'rational':1,'10.--solar':1,'sluggish':1,'red':1,'7.--the':1,'quite':1,'fourteen':1,'extraordinary':1,'experimenting':1,'besides':6,'put':3,'detecting':2,'keith':1,'ll.d':2,'organic':1,'g':1,'where':2,'hence':5,'first':3,'18.--a':1,'copper':1,'already':1,'plainly':1,'thereafter':1,'one':16,'another':9,'mercury':1,'given':2,'ancient':2,'limited':2,'similarly':4,'anyone':2,'their':13,'2':23,'caterpillars':1,'white':1,'speaking':2,'x-rays':2,'that':23,'19.--comet':1,'part':2,'somewhat':1,'gilbert':1,'11':1,'10':2,'13':2,'b':7,'15':1,'14':2,'17':1,'16':2,'second':2,'project':3,'matter':2,'r':3,'algol':1,'other':4,'are':1,'and':41,'clerk-maxwell':3,'ltd.':2,'pliocene':1,'ages':4,'lull':4,'sentences':1,'1':26,'apparently':1,'any':1,'viewed':1,'eels':1,'u.s':1,'mic':1,'gravity':1,'note':5,'also':1,'without':4,'take':1,'sirius':1,'even':16,'play':2,'unless':4,'wilson.':2,'though':1,'price':1,'who':2,'hincks':1,'most':6,'combustion':1,'nothing':1,'america':1,'nutritive':1,'constitution':1,'firelight':1,'22.--a':1,'dragon-flies':1,'professor':12,'later':2,'heat':2,'looked':1,'25--giant':1,'electrons':7,'prout':1,'normally':1,'laws':1,'stones':1,'hobhouse':1,'aquatic':1,'charles':2,'14.--the':1,'lloyd':1,'uranus':1,'earth':1,'hinkins':2,'copyright':1,'duncan':1,'only':4,'going':2,'molecules':2,'humdrum':1,'thompson':1,'8':5,'4.--the':1,'darwin':4,'thousands':1,'combe':1,'do':3,'his':1,'fossil':1,'meanwhile':2,'15.--mars':1,'there':106,'watch':1,'watson':1,'12':2,'nearly':2,'distinctly':1,'during':3,'silk':2,'dr':1,'crabs':1,'evolution':3,'h':27,'girdled':1,'twice':2,'discs':1,'20.--comet':1,'she':8,'gibson':1,'1922':1,'intelligence':1,'radium':2,'notice':3,'j.':2,'sec':1,'mud-nests':1,'mcgregor.':12,'5.--diagram':1,'tropisms':1,'federal':1,'artificial':1,'birds':1,'3':19,'between':5,'probably':2,'email':1,'crookes':2,'we':115,'tylor':1,'fox-bat':1,'however':5,'8.--the':1,'atoms':2,'both':7,'c':18,'wallace':1,'many':17,'taking':1,'according':6,'s':21,'1.--diagrams':1,'johnstone':1,'otherwise':1,'among':4,'goodrich':1,'simple':4,'had':1,'jeans':1,'whatever':3,'pycraft':1,'church':1,'moreover':9,'newbigin':1,'broadening':1,'marett':1,'geddes':1,'much':5,'sponges':1,'bragg':2,'life':3,'modern':1,'partly':1,'c.':1,'four-toed':1,'luther':1,'13.--saturn':1,'shepstone.':6,'races':1,'despite':1,'an':14,'161':1,'those':4,'sound':1,'adaptations':1,'unlike':1,'these':36,'lightner':1,'16.--the':1,'n':2,'while':2,'suppose':1,'viii':1,'2.--the':1,'fore-limb':2,'then':4,'vol':1,'vi':1,'is':4,'thus':48,'it':317,'iv':2,'ii':2,'middle':2,'in':152,'mcgregor':2,'if':76,'jenner':1,'headley':1,'perhaps':13,'things':1,'make':1,'sollas':1,'babies':1,'9':2,'several':1,'yucca':1,'higher':1,'ball':1,'see':4,'kelvin':1,'v.':1,'kinnaman':1,'moving':2,'lower':2,'i':3,'no':11,'mccabe':1,'contact':1,'furneaux':1,'comparisons':1,'the':569,'redistribution':1,'just':2,'being':1,'generally':1,'rest':1,'ideas':1,'disguise':1,'ritchie':2,'years':1,'paul':1,'yet':11,'like':1,'smith':1,'except':2,'potential':1,'4':15,'5':8,'putnam':2,'possibly':1,'boxes':1,'royalty':2,'five':1,'6.':1,'apart':4,'tail':1,'d':1,'lightning':1,'enregistered':1,'arthur':7,'donations':1,'t':1,'interbreeding':1,'webb':1,'old':1,'flattely':1,'triceratops':1,'some':37,'jupiter':2,'easygoing':1,'gradually':1,'for':44,'shall':1,'skeletons':1,'everything':2,'does':1,'subtlest':1,'newcomb':2,'11.--mars':1,'each':13,'illustration':2,'subconscious':1,'great':1,'although':4,'affording':1,'by':18,'macpherson.':1,'actual':1,'extending':1,'of':25,'o':1,'sea-horse':1,'whence':3,'larmor':1,'gregory':1,'consequently':1,'or':6,'naturalists':1,'serviss':1,'kapp':1,'reactions':1,'within':3,'chemists':1,'mic.':1,'mills.':2,'haddon':2,'protozoa':1,'swimmers':1,'nowadays':1,'theoretically':1,'technically':1,'doubtless':1,'linnaeus':1,'additional':1,'her':1,'placing':1,'brute':1,'long':1,'why':2,'moseley':3,'daniell':1,'stars':1,'duffus.':2,'energy':3,'naturally':1,'lowest':1,'gluten':1,'mammals':1,'but':138,'cloth':1,'curiously':1,'white.':1,'with':8,'he':39,'october':1,'whether':5,'j':40,'up':1,'idiosyncrasies':1,'stages':1,'similar':2,'sometimes':6,'taste':1,'certain':1,'metals':1,'general':2,'as':35,'ether':1,'at':22,'adams':2,'again':1,'compared':2,'curie':1,'9.':1,'c.:':1,'pickering':1,'electrical':1,'you':12,'picture':1,'energetic':1,'carpenter':1,'marshes':1,'fishes':2,'ramsay':1,'building':1,'e':5,'glass':1,'persistent':1,'together':1,'brocklehurst.':4,'mckready':1,'functionless':1,'keane':1,'once':1},'much':{'indebted':1,'harm':1,'smaller':2,'less':4,'wall':1,'intelligence':1,'subtlety':1,'alive':1,'parasites':1,'as':5,'disarranged':1,'right':1,'in':5,'sought':1,'beyond':1,'exhausted':1,'if':1,'nearer':2,'use':1,'cut':1,'from':1,'for':4,'.':2,'better':1,'to':10,'changed':1,'change':1,'progress':1,';':1,'has':1,'dreaded':1,'energy':2,'more':24,'scepticism':1,'used':2,'paperwork':1,'greater':5,'trace':1,'that':1,'importance':2,'gliding':1,'is':1,'controversy':1,'damaged':1,'denser':1,'speculation':1,'bigger':1,'simpler':1,'a':1,'on':1,'surer':1,'faster':1,'of':5,'larger':2,'stronger':1,'greater--a':1,'easier':1,'so':1,'truth':1,'light':1,'the':3,'movement':1},'pedigree--man':{'s':1},'104':{'after':1},'sponges':{'stinging':1,'zoophytes':1,'jellyfishes':1,'spongillidae':1,'are':1,'corals':1,'jellyfish':1},'smolts':{'and':1,'which':1},'fry':{'become':1,'about':2,'rises':1,'ltd.':2},'105':{'an':1},'exactness':{'with':1},'life':{'and':15,'among':1,'because':1,'although':1,'exists':1,'is':6,'it':1,'lies':1,'namely':1,'through':4,'are':3,'in':13,'palaeozoic':1,'best':1,'if':1,'depend':1,'for':1,'to':4,'remains':1,'began':1,'there':2,'had':1,'1914':1,'1':1,'.':17,'of':19,'whole':1,'which':3,';':4,'before':1,'was':2,'as':4,'than':1,'that':1,'after':1,'possible':1,'illustration':1,'but':4,'utterly':1,'during':1,'166':1,'continued':1,'by':1,'a':1,'on':18,'depends.':1,'has':4,'animals':1,'1921':2,'many':1,'depends':2,'will':1,'s':1,'can':1,'though':1,'each':1,'at':1,'taxed':1,'the':3,'history':1,'where':1,'or':1,'72':1},'latro':{'that':2},'retrospect':{'looking':1},'in-breeding':{'endogamy':1,'tended':1},'conifers':{'and':1,'ginkgos':1,'shall':1},'luther':{'the':1,'burbank':1},'shepstone.':{'light':1,'the':2,'modern':1,'100-inch':1,'lightning':1},'connaissance':{'du':1},'tree-mice':{'tree-porcupines':1},'child':{'of':4,'s':4,'does':1,'.':1,'that':1},'chili':{'where':1},'spin':{'round':1},'breast-pocket':{';':1},'control--a':{'promise':1},'adaptations':{'and':1,'of':1,'or':1,'to':5,'which':1,'such':1,'by':1},'heidelberg':{'man':5,':':2,'was':1,'sand-pit':1,'in':2},'contemp':{'.':1},'viii':{'foundations':1,'.':2},'flooding':{'space':1},'elaborate':{'burial':1},'picturing':{'a':1},'remembering':{'the':1,'that':1},'played':{'an':1},'equator':{'and':1,'of':1,'.':1,'seems':1,'i.e':1},'photographer.':{'as':1},'obeying':{'the':2},'player':{'is':1},'australia':{'perhaps':2,'is':1,'190':1,'it':1,'to':1,'neoceratodus':1,'which':1,'the':1,'95':1},'anticipating':{'the':1,'we':1},'south.':{'illustration':1},'plants.':{'sec':1,'illustration':1},'said.':{'illustration':1},'open-water':{'period':1,'turtles':1},'damaged':{'disk':1,'by':1},'feebler':{'and':1,'until':1},'things':{'and':6,'endowed':1,'is':1,'effectively':1,'as':1,'are':1,'in':2,'dr':1,'.':6,'to':1,'which':2,'wildly':1,';':1,'was':1,'horses':1,'do':1,'we':3,'that':5,'with':1,'you':1,'he':1,'on':1,'like':1,'e.g':1,'without':1,'mixed':1,'or':1},'format':{'other':1,'with':1,'used':1,'must':1},'killdeer':{'plover':1},'dissimilars':{'tends':1},'clucking':{'of':1},'gateways':{'to':1,'of':3},'double-breathers':{'dipnoi':1},'elliott':{'fry.':2,'fry':1},'emphatic':{'notice':1,'rejection':1},'european':{'fauna':1,'lynx':1},'increased.':{'electrons':1,'illustration':1},'fairly':{'what':1,'complicated':1,'mastered':1},'typhoid':{'fever':1},'georgics':{'to':1},'middle-aged':{'and':1},'effectively':{'to':1,'e.g':1,'conquered.':1,'.':1},'pioneers':{'men':1},'race-history':{'.':1},'tune':{'to':1},'registering':{'steps':1},'stupendous':{'energy':1,'collection':1,'.':1},'matters':{'little':1,'greatly':1},'erectus':{'found':1},'-mammal':{'and':1},'raindrops':{'and':1},'opinions':{'with':1},'boyhood':{'the':1},'sea-skimmers':{'halobatidae':1},'sleeps':{'upright':1},'golden':{'draperies':1,'plover':1,'age':5,'eagles.':1,';':1},'expensively':{'for':1},'distribute':{'a':1,'this':1,'copies':1,'it':1,'the':1,'or':2},'rotated':{'that':1},'beset':{'with':1},'disguise':{'and':1,'besides':1,'is':1,'.':3,'sec':1,'which':1,'differs':1,'the':1,'with':1,'or':1},'neanderthalers':{'and':1},'falcon':{'s':2},'glue-like':{'threads':1},'hen-pigeon':{'may':1},'rushing':{'torrent':1},'succeeding':{'ages':2},'lasso':{'minute':1},'99712':{'.':1},'spectacles':{'in':1},'seal':{'right':1},'old-fashioned':{'type':1,'way':1},'had':{'gone':2,'remained':1,'appeared':2,'dived':1,'some':1,'few':1,'increased':1,'brought':1,'wit':1,'at':1,'human':1,'seen':1,'swallowed':1,'enjoyed':1,'to':8,'really':1,'established':1,'given':1,'surmised':1,'proceeded':1,'rushed':1,'there':2,'been':18,'anatomical':1,'their':5,'only':1,'definitely':1,'emerged':1,'probably':1,'learned':2,'mainly':1,'claws':2,'his':1,'tried':1,'feathers':1,'gathered':1,'never':1,'extended':1,'anticipated':1,'its':4,'haunted':1,'no':4,'survived':1,'become':2,'not':6,'suspected':1,'disappeared':1,'undoubtedly':1,'a':10,'discovered':1,'great':2,'these':1,'many':1,'actually':1,'fish-like':1,'large':1,'passed':2,'teeth':2,'found':1,'the':1,'pulled':1,'waited':1,'something':1},'salmon--forming':{'new':1},'thickening':{'or':1},'saturn--the':{'moon--the':1},'collections':{'of':1},'easy':{'business':1,'for':1,'haunt':1,'.':4,'to':6,'times--glacial':1},'irresponsive':{'.':1},'botanists':{'that':1},'east':{'has':1,'when':1,'are':1,'which':1},'eocene':{'and':1,'n':1,'era':1,'n.':1,'period':1},'good-humoured':{'talkativeness':1},'up--a':{'clever':1},'elevation':{'and':1,'of':2},'survival':{'of':1,'with':1,'.':2},'semi-fluid':{'carbon':1},'possible':{'origin':1,'and':1,'instruments':1,'it':1,'according':1,'are':1,'in':1,'moreover':1,'yet':1,'enemies':1,'again':1,'evolution.':1,'for':4,'basis':1,'favouring':1,'.':1,'colours':1,'to':13,'that':6,'however':1,'but':1,'a':1,'kind':1,'outline':1,'when':1,'haunts':1,'seeds':1,'steps':1,'victory':1,'error':1,'or':1},'knife-blade-like':{'to':2,'larva':2},'firmer':{'though':1},'possibly':{'run':1,'show':1,'there':1,'outside':1,'attain':1,'have':1,'in':1},'indicative':{'not':1,'of':1},'birth':{'and':2,'of':2,'gestation':1,'.':3,'to':1,'the':1,'with':1},'shadow':{'and':1,'cast':2,'across':1,'on':1},'unique':{'and':1,'solution':1,'in':1,'property':1,'ensemble':1,'discovery':1},'12:30':{'p.m':1},'occurring':{'in':2},'desire':{'to':3,'that':1},'skull-walls':{'sir':1},'collection.':{'a':1,'lord':2,'charles':1,'sir':1,'j':1},'process--a':{'process':1,'building':1},'enregistered':{'reactions':1,'rhythms':1,'hereditarily':1,'it':1,'instinctive':2,'reactions.':1},'steps':{'followed':1,'of':1,'per':1,'which':1,'in':9,'by':1},'beneficial':{'partnerships':1,'partnership':1,'external':1,'.':1},'right':{'and':1,'into':1,'we':1,'as':1,'at':1,'in':1,'out':1,'indicate':1,'away':1,'to':2,'answer':1,'has':1,'146':1,'resting':1,'direction':1,'hand':1,'angles':4,'path':1,'with':1,'this':1,'of':4,'or':2},'old':{'quarters':1,'philosophical':1,'before':1,'terrestrial':1,'lady':1,'young':2,'.':1,'to':1,'going':1,'which':1,'entomologist':1,'editions':1,';':1,'red':2,'showing':1,'middle-aged':1,'they':1,'world':2,'with':2,'stone':4,'land':1,'word':1,'could':1,'haunts':1,'race':1,'so':1,'margin':1,'view':1},'creek':{'.':1},'crowd':{'of':1},'people':{'then':1,'would':1,'213':1,'just':1,'their':1,'arguing':1,'who':1,'.':1,'start':1,'s':1,'know':1,'have':3,'in':1,'fail':1,'wrongly':1},'predominance':{'of':1},'crown':{'of':3,'corona':1,'but':1},'deflection':{'of':3},'crows':{'but':1},'dragons--the':{'first':1},'animate':{'nature':5},'creep':{'slowly':1,'up':2},'enemies':{'a':1,'and':1,'for':1,'who':1,'except':1,'but':1,'.':5,'as':1,'which':1},'for':{'all':6,'aquatic':2,'untold':1,'unseen':1,'accurate':1,'seizing':4,'years':3,'egg-laying':1,'not':1,'existence.':2,'converting':1,'its':11,'negligence':1,'current':1,'rapid':1,'knowledge':1,'instance':25,'body-making.':1,'reasons':1,'believing':1,'capturing':1,'pursuing':1,'grasping':1,'weeks':1,'thousands':3,'over':3,'them':1,'good':1,'worse':1,'food':7,'gauging':1,'balancing':2,'existence--which':1,'every':3,'nearly':2,'they':8,'half':2,'mixing':4,'highly':1,'several':2,'identifying':3,'humming-birds':1,'this':8,'miles':1,'common':1,'activity':2,'speculation':1,'bone':2,'dexterity':1,'another':2,'intelligence':1,'radium':1,'some':4,'catching':4,'jupiter':1,'vocal':1,'existence':13,'our':4,'sport':2,'special':1,'blood-vessel':1,'crunching':1,'what':2,'three':1,'giving':1,'drifting':1,'brief':1,'increase':1,'new':3,'allowing':1,'receiving':1,'ever':4,'safety.':1,'measuring':1,'we':4,'reproduction':1,'parental':1,'example.':1,'terse':1,'of':1,'here':2,'water':2,'feeding':1,'nowhere':1,'although':3,'sedentary':1,'science':2,'dry':1,'comparison':1,'enormous':1,'actual':1,'respiration':1,'branch-gripping':1,'many':12,'violence':1,'adventures':1,'generations':1,'swimming':2,'nerve':1,'striking':1,'keenness':1,'obtaining':1,'seven':1,'one':1,'learning':1,'accepting':1,'.':1,'millions':14,'life--the':2,'man--the':1,'additional':1,'her':2,'their':2,'race-history':1,'there':8,'copies':2,'long':2,'by':1,'whom':1,'much':1,'motility':1,'themselves':1,'analysing':3,'fourteen':1,'hearing.':1,'more':6,'free':1,'exploring':1,'excavating':2,'himself':1,'north':1,'that':4,'ages':3,'releasing':1,'instance.':1,'about':1,'it':29,'carrying':1,'observations':1,'chasing':1,'coal--dissipation':1,'considerable':1,'it--radium.':1,'plants':1,'keeping':1,'animals':1,'thirty':1,'these':4,'us.':1,'access':1,'generating':1,'sifting':2,'life--water':1,'project':1,'while':1,'future':1,'midday':1,'thirty-five':1,'aesthetic':1,'life.':1,'example':6,'are':1,'and':1,'bearing':1,'amenity':1,'almost':1,'alongside':1,'mind':1,'life':6,'avoiding':1,'an':6,'as':2,'his':1,'evening':1,'something':2,'in':5,'counting':2,'any':5,'if':2,'utility':2,'us':3,'climate':1,'granted':1,'when':1,'offspring':1,'how':1,'damages':1,'holding':2,'so':1,'profiting':1,'higher':2,'supersaturated':1,'unpalatability':1,'centuries':1,'food.':1,'most':1,'moving':1,'two':1,'supposing':3,'such':1,'foothold':1,'sally':1,'man':8,'a':49,'muscle':1,'natural':1,'observation':1,'professor':2,'itself':2,'coal':2,'shore':1,'engulfing':1,'five':1,'fresh':1,'the':104,'crayfish':1,'playing':1},'bottom':{'may':1,'of':1,'and':1,'than':1,'.':2},'fox':{'all':2,'plays':1,'the':1,'or':1},'individuals':{'die':1,'who':1,'are':1,'each':1},'exposition':{'to':1},'landscape':{'effects':1},'invasions':{'of':1,'there':1},'surging':{'fire.':1},'man--body':{'and':1},'monkey-ape-man':{'.':1},'palatable':{'and':3,'butterflies':1,'flesh':1},'substitutes':{'for':2},'energy':{'and':7,'all':1,'force':1,'is':16,'it':2,'an':1,'produced':2,'as':4,'are':3,'in':6,'go':1,'if':1,'by':2,'or':1,'from':2,'would':2,'come':1,'since':1,'had':3,'expressed':1,'.':18,'to':3,'is.':1,'which':10,'tends':1,'streams':1,';':2,'has':1,'energy':1,'287':1,'greater.':1,'we':2,'that':4,'may':4,'sufficient':1,'derived':1,'but':1,'cannot':2,'let':1,'such':1,'originated':1,'than':1,'nor':1,'must':1,'a':1,'brought':1,':':1,'locked':2,'like':2,'this':1,'of':40,'into':1,'later':1,'equal':1,'across':1,'will':1,'so':1,'can':1,'ineffectively':1,'the':1,'disappears':1,'could':1,'came':1,'for':1},'dental':{'troubles.':1},'unfrozen':{'at':1},'life-or-death':{'quality':1},'substituted':{'for':1},'shifting':{'of':1},'losing':{'a':1,'the':1,'its':1},'memorable':{'because':1},'joule':{'who':1},'tide-producing':{'power':1},'emits':{'when':1,'rays--the':1},'shaken':{'.':1},'restlessness':{';':1,'an':1},'predisposition':{'to':1},'opossums':{'feigning':2,'are':2},'o':{'.':3,'as':1,'there':1,'in':1},'oneness':{'of':1},'wave-length':{'of':2,'is':1,'corresponds':1},'herring-gull':{'is':1},'slightly':{'from':1,'changed':1,'developed.':1,'simplified.':1},'lamprey':{'.':1},'raised':{'to':1,'higher':1,'from':1,'in':2,'many':1},'cloud-screen.':{'illustration':1},'statements':{'concerning':1,'that':1,'might':1,'.':1},'facility':{'of':2,'in':1},'non-protrusive':{'face':1},'son':{'of':1},'beings':{'on':1,'whose':1,'in':1},'raises':{'the':1},'sow':{'broadcast':1,'and':1,'again.':1},'spores':{'and':1,'of':1},'pairs':{'of':3},'shoots':{'and':1,'from':1},'polaris':{'76':1},'fields.':{'virgil':1},'fabric':{'of':1},'wonder-horse':{'with':1},'support':{'and':3,'a':1,'life':1,'of':1,'its':1,'to':1,'the':1,'has':1,';':1},'constantly':{'driven':1,'pouring':2,'rising':1,'splitting':1,'for':1},'width':{'.':1},'grasping':{'of':1,'the':1,'lifting':1},'physicists':{'and':3,'did':1,'of':4,'who':1,'but':1,'to':1},'greatness':{'and':1},'resulted':{'from':1,'in':2},'music':{'of':1,'had':1},'telegraph':{'and':1,'cables':1},'offer':{'serious':1,'rewards':1,'was':1,'no':1},'fascination':{'about':1},'forming':{'associations':2,'what':1,'good':1,'useful':1,'these':1,'of':1,'an':1,'part':1,'in':1,'vegetable':1,'new':1,'the':2,'ordinary':1},'shoot':{'out':3},'hemisphere':{'learned':1,'throughout':1},'thickness.':{'a':1},'survive':{'douching':1,'for':1,'being':1,'when':1,'prolonged':2,'but':1,'.':1,'high':1,'without':1,'the':2},'beech':{'a':1},'statement.':{'illustration':1},'otter':{'a':1,'is':1,'one':1,'239':1,'which':1,'or':1},'week':{'four':1,'or':2,'in':1},'death--procession':{'of':1},'inside':{'and':2,'a':2,'is':1,'are':1,'have':1,'the':3},'arrow-worms':{'in':1},'devices':{'it':1,'adaptations':1,'which':1,'.':1},'lays':{'stress':1,'her':2,'many':1,'an':1,'the':2,'its':1},'masterfulness':{'of':1},'soldering':{'of':1},'palm':{'and':2,'of':1},'procyon':{'10.5':1},'cormorants':{'and':1},'150':{'to':1,'000':5},'153':{'anatomical':1},'later':{'chapter':1,'on':2,'differ':1,'on.':1,'sir':1,'section':1,'there':1,'ages':1,'.':3,'discovered':1,'to':1,'stage':3,'which':1,'in':3,'the':2,'still':1,'than':1,'christened':1,'section.':1},'proved':{'what':1,'that':2,'very':1,'of':1,'equal':1,'but':1,'.':1,'to':2,'as':1,'too':1},'157':{'side-view':1,'photo':1,'the':1,'after':1},'156':{'photo':2},'158':{'darwin':1},'as-is':{'with':1},'palm;':{'and':1},'proves':{'fatal.':1},'exist':{'on':2,'all':1,'there':1,'would':1,'since':1,'.':2,'in':4,'between':1,'apart':1},'melan':{'dr':1},'sprouts':{'kale':1},'redolent':{'of':1},'stolidity':{'gives':1},'floor':{'of':7,'.':2},'glacier':{'that':1},'negatively-electrified':{'body':1,'ones':1},'uttered':{'until':1},'flood':{'of':4,'in':1},'nestling':{'bittern':1},'beginning--whatever':{'we':1},'deep-seated':{'connection':1,'difference':1},'entomologist':{'mr':1},'irresistible':{'.':1},'superfluous':{'length':1,'twig':1},'roll':{'themselves':1,'over':1},'friar-birds':{'of':1},'thoroughgoing':{'internal':1},'palms':{'and':1},'non-moulting':{'winged':1},'teats':{'injects':1},'mariner':{'s':1},'transported':{'in':1},'irs.':{'the':1},'scale':{'on':1,'we':1,'far':1,'of':4,'is':1,'in':2,'but':1,'to':1,'each':1,'the':4},'intent':{'efforts':1},'foot-print':{'of':1},'variable':{'monitor':2,'hare':2,'as':1,'stars':3,'in':1,'new':1,'before':1,'stock':1},'cleaver':{'of':1},'commensalism':{'with':1,'eating':1,'i.e.':1,'where':1},'fastened':{'to':1,'by':1,'up':1,'on':1},'microbes':{'such':1,'invading':1,'to':1},'packets':{'one':1},'coastlines':{'.':1},'ottawa':{'by':1},'time':{'and':11,'is':3,'it':2,'as':6,'in':5,'immemorial.':1,'thought':1,'rapidly':1,'for':1,'their':1,'with':3,'since':1,'when':5,'.':7,'to':5,'onwards':1,'swift':1,';':1,'until':1,'ahead.':1,'we':2,'energy':1,'that':5,'very':1,'than':1,'however':2,'much':1,'great':1,'a':1,'they':1,'during':1,'come':1,'by':1,'nor':1,'ago':1,'wide':1,'immemorial':1,'last':1,'like':2,'showed':1,'of':11,'required':1,'reminding':1,'appearing':1,'so':1,'she':1,'were':1,'about':1,'the':12,'or':1},'adult':{'and':1,'eel':1,'life':1,'by':1,'.':2},'peacock':{'and':1,'for':1},'irrigation':{'of':1},'chain':{'of':2,'instincts':1,'.':1},'perch':{'when':1},'colour-change':{'bony':1,'is':2,'sometimes':1,'expresses':1,':':2,'occurs':1},'lawlessly':{'they':1},'activated':{'by':1},'crocodile':{'pipes':1,'is':2,'would':1},'avalanche':{'.':1},'skate':{'and':1,'places':1},'93':{'000':2},'witmer.':{'peter':1},'ebooks.':{'':1},'hold':{'a':1,'all':1,'that':1,'of':2,'it':1,'their':2,'in':1,'the':1},'rottenness':{'eaters':1},'methodically':{'onwards':1},'94':{'photo':1,'from':1},'efficiencies':{'supply':1},'209':{'a':1,'homing':1},'chequered':{'by':1,'but':1},'walking-fish':{'or':2},'separated.':{'perhaps':1},'downloading':{'copying':1},'gisbert':{'electricity':1},'navigable':{'kingdom':1},'choice':{'of':1},'92.9':{'1.00':1},'gloomy':{'prognostications':1,'gorilla.':1},'bustle':{'of':1},'fullest':{'ears':1},'right-handed':{'and':1},'exact':{'and':1,'intensity':1,'it':1,'limits':1},'minute':{'and':2,'signs':1,'tag--but':1,'unicellular':1,'planets':1,'in':1,'diamond-like':1,'surfaces':1,'living':1,'rays':1,'organisms':2,'measurements':1,'.':1,'particles':1,'molecules':1,'6':1,'fragments':1,'that':1,'crustaceans':3,'after':1,'but':1,'hand':1,'waves':1,'satellites':1,'atoms':1,'transparent':2,'animals':2,'atom':1,'traces':1,'or':1},'tear':{'into':1,'asunder':1,'them':1,'are':1},'leave':{'me':1,'them':1,'this':1,'well':1,'atoms':1,'their':1,'the':4,'open':1,'him':1,'creatures':1},'solved':{'four':2,'there':1,'it':1},'settle':{'these':1,'on':1,'down':3},'team':{'at':2},'depository':{'of':2,'the':1,';':1,'he':1},'speculation':{'and':1,'about':1,'.':3,'is':2,'that':1},'unpaying':{'boarders':1},'prevent':{'you':1},'thinkers':{'the':1,'since':1,'have':2},'occurrence':{'of':5,'.':1},'chimpanzee--and':{'it':1},'insignificant':{'compared':1,'one':1},'trails':{'a':1},'milligram':{'of':1},'gnawed':{'the':1},'roof':{'of':3},'depressions':{'of':1},'mind--even':{'in':1},'parachuting':{'animals':1,'.':1},'educate':{'the':1},'leaf-butterfly':{'kallima':1},'axes':{'follow':1,'of':1},'melt':{'in':1},'current':{'rang':1,'is':6,'intellectual':1,'through':1,'275':1,'in':2,'279':1,'seems':1,'exhibits':1,'.':4,'to':1,'is.':1,'which':1,'instead':1,'was':2,'therefore':1,'donation':1,'not':1,'with':1,'the':2,'of':3,'passing':1,'where':1},'remembered':{'that':4},'looking':{'is':1,'backwards':6,'at':3,'extraordinarily':1},'period--its':{'length':1},'falling':{'and':1,'on':1,'stone':2,'into':1,'body':1,'water':2,'weights':1,'between':1,'particles':1},'ground':{'a':1,'on':2,'what':1,'his':1,'again.':1,'would':1,'though':1,'is':1,'or':2,'when':1,'by':1,'pushed':1,'as':1,'flapping':1,'in':1,'has':1,'the':2,'.':5,'was':1,'generate':1,'he':1},'coccyx':{'at':1},'climbs':{'on':2,'the':2,'up':1},'honour':{'of':1},'mauer.':{'d-e.':1},'understanding':{'and':1,'of':1},'exceptions':{'the':1,'as':1,'that':2},'magnetism':{'and':1,'we':1,'gravitation':1,'is':3,'supposes':1,'.':1,'differs':1,'he':1},'nemesis':{'of':2},'yards':{'and':1,'a':1,'off':1},'address':{'specified':1},'alone':{'is':2,'.':4,'swamp':1,'the':1,'has':1,'by':2},'along':{'a':3,'copper':1,'many':1,'lines':1,'two':1,'an':1,'its':1,'at':1,'which':3,'certain':2,'the':15,'with':9,'by':2},'dwindling':{'counterpart':1,'relic':1,'of':1,'structure--the':1,'race':1,'relics':1,'structures':1,'resources':1,'must':1},'anchoring':{'structures':1},'momentous':{'event':1,'step':1,'.':1,'except':1,'that':1},'testings':{'.':1},'neville':{'extinct':1},'brilliant':{'workers':1,'young':1,'or':1,'early':1,'experiment':1,'photosphere':1,'failures':1,'conquest':1,'coloration':1,'redness':1},'studied':{'a':1,'the':1,'was':1,'by':1},'wherever':{'the':2,'there':1},'commonly':{'found':1,'accepted':1},'brazilian':{'forest':1},'accomplished':{'in':1,'if':1},'ineffective':{'way':1,'movements':1},'vitiated':{'air':1},'studies':{'of':1},'unification.':{'we':1},'tasks':{'of':2},'love':{'as':1,'.':1,'hunger':1},'prefer':{'to':1},'relations.':{'when':1},'betraying':{'its':1},'deep-water':{'marine':1},'sky':{'means--light':1,'means':1,'no':1,'.':2,'will':1,'to':1,'overhead':2,'at':1,'in':1,'probably':1,'where':1},'engrain':{'capacities':1},'working':{'from':1,'of':2,'into':1,'methodically':1,'against':1,'powerfully':1,'which':1,'or':1,'out':1},'mankind--steps':{'in':1},'formulated':{'the':2},'positive':{'and':7,'knowledge':2,'electricity':6,'particles':1,'charge':1,'in':1,'the':1,';':1},'-fish':{'embryo':1},'anatomical':{'distinctions':1,'proof':2,'genius.':1,'structure':1,'evidence':1},'vigour':{'and':1,'of':1,'.':1},'down-breaking':{'disruptive':1},'opposed':{'to':1},'films':{'of':2},'scope':{'to':1},'theoretical':{'basis':1},'ten-miles-wide':{'moons':1},'perishes':{'for':1},'periophthalmus':{'of':1,'common':2},'chapters--the':{'feeding':1},'afford':{'food':1,'a':1,'to':2},'apparent':{'strokes':1,'suddenness':1,'.':1,'motion':1,'to':1,'stroke':1,'motions':1,'exceptions':1,'creeping':1},'assimilation':{'exceeding':1},'validity':{'there':1},'minnows':{'and':2,'learned':1,'were':1},'appendix':{'alone':1,'at':1,'which':1},'everywhere':{'forming':1,'there':1,'like':1,'in':1},'virtue':{'of':5,'as':1},'blood.':{'as':1},'disparagement':{'tentative':1},'easiest':{'of':1},'petrel':{'the':1,'or':2,'is':1},'logos':{'which':1,'.':1},'modernised':{'types':1},'originally':{'a':2,'derived':2,'intelligent':1,'supposed':1},'rutherford':{'and':2,'sir':1,'246':1,'one':2,'christened':1},'imagination.':{'the':1,'organic':1},'moulted':{'which':1,'in':1},'life--water':{'that':1},'believes':{'that':1},'printing':{'august':1,'april':4,'may':1,'june':4,'september':1,'sept':1},'values':{'most--control':1},'slowness':{'.':1},'stature':{'and':1,'than':1,'human':1},'believed':{'not':1,'to':1,'by':2,'that':2},'admired':{'the':1},'short-limbed':{'but':1},'frogs':{'and':3,'a':1,'show':1,'may':1,'sometimes':1,'herald':1,'jumping':1,'have':1,'meet':1,'along':1},'bulkiest':{'structure':1},'parachute':{'of':1,';':1,'wing':1,'before':1},'locks':{'.':1},'one--the':{'old':1},'238':{'photo':2,'whereas':1},'239':{'photo':1},'unveiled':{'in':1,'.':1},'allowed':{'to':1,'aliens':1,'for':1,'her':1,'of':1},'evidently':{'light':1,'puzzled':1},'232':{'photo':2},'233':{'photo':4},'winter':{'and':4,'by':2,'in':1,'of':1,'within':1,'freeze':1,'scene':2,'whiteness':1,'plumage':2,'.':1,'are':1,'sets':1,'nor':1,'the':1,'has':1,'dress':1,';':1,'retreat':1},'venation':{'of':1},'chromatophores':{'and':1,'in':1},'foul':{'waterholes':1,'with':1},'protozoon':{'and':1,'has':1,'or':1,'.':1},'s.':{'fairbanks':1,'illustration':1},'elephant':{'and':2,'rhinoceros':1,'a':1,'.':1,'helping':1,'at':1,'they':1,'was':1},'northwards':{'for':1},'divides':{'and':1,'into':2,'is':1},'edinburgh':{'the':1},'snaps':{'secure':1},'explores':{'a':1},'explorer':{'which':1},'motive-force':{'in':1},'spot':{'and':1,'on':2,'23':1,'though':1,'at':1,'where':1},'convincingly':{'the':1},'muellerian':{'after':1},'date':{'living':1,'from':1,'for':1,'on':1,'of':2,'contact':1,'at':1,':':1},'such':{'ingenious':1,'and':1,'remarkable':1,'publications':1,'constituents':1,'is':5,'metals':1,'well-known':2,'contrasts':1,'as':72,'diverse':1,'are':1,'planets':1,'in':1,'speed':1,'birds':1,'enemies':1,'dense':1,'things':1,'phrases':1,'unity':1,'wonderfully':1,'way':1,'instruments':2,'if':1,'conditions':1,'important':1,'movement':1,'that':3,'rock':1,'apparent':1,'furnaces':1,'depths':1,'wave-motions':1,'races':1,'fishes':1,'cases':2,'intelligent':1,'active':1,'stage':1,'a':19,'dangers':1,'changes':1,'occasions':1,'damage.':1,'betelgeux':1,'cells':1,'motion':1,'thing':4,'states':1,'hard-and-fast':1,'temperatures':2,'time':1,'similar':1,'order':1},'behaviour--experimenting':{'learning':1},'truly':{'wonderful':3},'data':{'transcription':1,'for':1},'codes':{'that':1},'lids':{'to':1,';':1},'waggons':{'at':1},'sy':{'1':1,'2':1},'forestier':{'of':3},'varieties':{'of':1,'which':1,'altogether':1},'conscious':{'guile':1,'agent':1,'imitation':1},'naturae':{'meaning':1,'the':1},'st':{'.':2},'inhabiting':{'this':1,'the':2},'castings':{'and':1},'remoter':{'part':1},'so':{'chicks':1,'they':2,'among':1,'fond':1,'subtle':1,'still':1,'generous':1,'slow':1,'young':1,'late':1,'to':3,'differently':1,'rich':1,'he':1,'clouded':1,'do':2,'good':1,'far':14,'safe':1,'apt':1,'closely':1,'vast':2,'easily':1,'like':2,'keenly':1,'shaped':1,'forth':3,'large':1,'stupid':1,'she':1,'small':2,'where':1,'simple.':1,'often':1,'attenuated':1,'are':1,'helpless':1,'pronounced':1,'for':1,'restricted':1,'below':1,'does':1,';':1,'numerous':1,'common':2,'we':6,'recently':1,'inextricably':1,'completely':1,'rapid':1,'strong':1,'by':1,'momentous':1,'gained':1,'on':16,'great':3,'many':7,'sensitive':1,'rudely':1,'striking':1,'powerful':1,'marked':2,'one':1,'long':3,'quickly':1,'readily':1,'fast':1,'from':1,'there':4,'sunlight':1,'.':3,'much':15,'clever':3,'that':43,'forming':1,'minute':1,'motionless':1,'mounted':1,'inconspicuous':1,'wide':1,'arranged':1,'this':1,'up':1,'will':1,'while':1,'obvious':1,'of':1,'similar':1,'bright--the':1,'is':3,'it':8,'an':1,'effectively':1,'as':6,'in':4,'clearly':1,'relatively':1,'proceeds':1,'very':3,'hot':1,'absorbed':1,'instead':1,'firmly':1,'watery':1,'may':1,'important':1,'conspicuous':1,'a':2,'short':1,'crowded':1,'clear':1,'well':1,'near':2,'deeply':1,'species':1,'fresh':1,'the':8},'sc':{'the':1},'mud-flats':{';':1},'pulled':{'.':1,'down':1,'twice':1,'at':1,'the':3,'by':4},'outflowing':{'network':2},'unsolicited':{'donations':1},'lighter':{'and':1,'materials':2,'in':1,'atomic':2,'.':1},'differences':{'separating':1,'of':3,'in':3,'between':2},'below.':{'1.f.':1,'illustration':2,'1.c':1},'copious':{'supply':1},'course':{'and':1,'associated':1,'is':1,'it':2,'an':1,'are':1,'in':1,'confirms':1,'her':1,'unknown':1,'there':2,'been':1,'to':2,'only':1,'5':1,'easy':1,'has':1,'be':2,'we':3,'cannot':1,'not':1,'with':1,'by':1,'he':2,'a':2,'for':3,'of':24,'the':2},'experiments':{'suggested':1,'towards':1,'proved':1,'chiefly':1,'showed':1,'that':1,'of':5,'in':4,'enabled':1,'.':4,'indicate':1,'without':1,'have':1,'which':1,'usually':1,'checked':1,'with':2},'frequents':{'two':1},'insurgence':{'and':2,'of':2},'tendency':{'to':11,'that':1,'among':1,'by':1,'of':2},'solitary':{'bit':1,'or':1},'limbs':{'is':1,'to':2,'at':1,';':1,'with':1,'or':1},'derive':{'their':1,'from':1},'yawning':{'in':2},'thumb':{'and':5,'th':1},'did.':{'looking':1},'hot':{'and':2,'gaseous':1,'for':1,'gas':1,'when':1,'but':1,'.':2,'as':1,'weather':1,'earth':1,'cinder':1,'or':1,'bodies':1},'decreases':{'.':1},'attraction':{'produces':1,'of':1,'is':1,'.':1,'can':1,'between':2},'creations':{'of':1,'.':1},'dwarfs':{'.':1},'constitutes':{'matter':2,'one':2},'instantly':{'fly':1},'conveying':{'it':1},'thereby':{'buoyed':1,'escapes':1},'earth--the':{'earth-knot':1},'youth.':{'sec':1},'experiment.':{'we':1},'indigenous':{'wild':2},'records':{'of':2,'the':1,'or':1,'.':1},'year.':{'in':1},'overpowering':{'and':1,'its':1},'water-shrew.':{'freshwater':1},'sorted':{'out':2},'twilight':{'by':1,'no':1},'runners':{'that':1},'one-seventh':{'and':1},'find.':{'fresh':1},'creation.':{'the':1},'establishing':{'itself':1,'or':1,'associations.':1},'veins':{'on':1,'of':1},'instability':{'and':1},'eighty-seven--and':{'that':1},'quarter':{'of':4,'days':2},'habitat-zones':{'and':1},'limb.':{'it':1},'turtle':{'found':1,'the':1,'that':1,'which':1,'of':1},'square':{'of':1,'.':1,'miles':2,'inch':2,'our':1,'the':1},'retrieve':{'its':1,'her':1},'receipt':{'of':1,'that':1},'parachutists--':{'flying':1},'prisms':{'the':1,'are':1},'woodcraft':{'the':1},'owing':{'to':4,'in':1},'entering':{'a':1,'the':4,'into':1},'beetle':{'running':1,'which':4},'instinct--the':{'mind':1},'neighbourhood':{'of':1},'crowding':{'there':1},'river-tortoises':{'which':1},'abide':{'by':1},'collisions':{'.':1},'contained':{'good':1,'meat':1,'in':4},'protections':{'against':1},'washington.':{'illustration':1},'suggesting':{'that':2},'granites':{'while':1},'ascendant':{'and':1},'soap-bubble':{'.':2},'siege':{'are':1},'million':{'millions':1,'square':1,'million':2,'stars.':1,'volts':1,'is':1,'trillion':1,'atoms':1,'meteorites':1,'miles':3,'electrons':1,'stars':1,'in':1,'horsepower':1,'250':1,'years':9,'.':1,'times':6},'envelop':{'the':1},'possibility':{'of':12,'is':1,'that':2,'in':1},'quite':{'uninterested':1,'certain':5,'direct':1,'comfortable':1,'as':1,'clever':1,'at':1,'impossible':1,'extinct':1,'indifferent':1,'readily':1,'different':5,'emancipated':1,'artificial':1,'difficult':1,'separated':1,'independent':1,'sure':2,'possible':2,'lively.':1,'invisible':1,'apart':3,'a':2,'easily':1,'novel':1,'clear':1,'so':3,'fundamental':1,'obscure':1,'away':1},'disintegrates':{'generates':1},'complicated':{'and':2,'elements':1,'than':1,'convolutions.':1,'atoms':1,'to':1,'atom':1,'cases':1,'wave':1,'by':1},'besides':{'even':1,'all':1,'his':1,'her':1,'turtles':1,'that':1,'this':1,'monkeys--in':1,'violent':1,'sunlight':1,'.':2,'these':1,'acting':1,'pulling':1,'struggle':1,'which':1,'instinctive':1,'the':4,'perceptual':1,'those':1},'remainder':{'of':1},'seventy':{'or':1},'vivum':{'e':1},'shores':{'and':1,'going':1,'which':1,'.':1},'training':{'given':1,'they':1,'nor':1,'.':1},'possum':{'lying':1},'tree-sloths':{'for':1,'tree-shrews':1},'undisguised':{'shore-animals':1},'ostrich':{'and':1,'with':1},'wanderers':{'.':1},'disguises':{'which':1},'massive':{'bulk':1,'jaws':1,'lower':1,'face':1},'routes':{'became':1,'round':1},'learning.':{'vi':1,'vii':1,'illustration':1,'animal':1},'puny':{'infant':1},'toads--it':{'serves':1},'emotion':{'as':1,'is':1},'saving':{'the':2,'clauses.':1},'symmetry':{'of':1,'is':1,'.':1,'well':1,'must':1},'serpent':{';':1},'spoken':{'of':1,'language':1},'one':{'over':1,'atom':3,'not':1,'mile':3,'whose':1,'cut':1,'group':1,'championed':1,'except':1,'should':3,'to':2,'primordial':2,'main':1,'might':2,'resting-place':1,'digit':1,'animal':1,'big':1,'colour--the':2,'answer':1,'year.':1,'cannot':1,'half':1,'foot':1,'rotation':2,'day':4,'three-hundredth':1,'reality--the':1,'name':1,'magnet':1,'fitness':1,'served':1,'side':5,'kernel':1,'revolution':1,'telescope':1,'second':1,'martian':1,'year':1,'close':1,'thinks':2,'living':1,'for':1,'disease':1,'time.':1,'discovers':1,'above':1,'example':1,'consisting':1,'body':6,'we':1,'state':1,'million':2,'here':1,'objects':1,'illustration':1,'key':1,'put':1,'sadly':1,'by':1,'momentous':1,'extreme':1,'on':4,'substance':1,'asks':1,'of':101,'local':1,'thing':3,'s':2,'place':3,'or':1,'comes':1,'family':1,'embodiment':2,'another':16,'comprises':1,'pulls':1,'cloud':1,'from':3,'would':3,'hundred-thousandth':1,'.':7,'water-shed':1,'crab':1,'half-hour':1,'was':2,'toe':1,'direction':1,'knows':2,'form':1,'that':3,'successful':1,'thousand':2,'but':1,'another.':1,'manifestation':1,'hopes':1,'line':1,'with':3,'must':1,'kind':3,'has':1,'type':1,'as':1,'will':1,'near':1,'obvious':1,'can':6,'country':1,'piece':1,'remembers':1,'and':8,'pound':3,'stream':2,'is':8,'hardly':1,'say':1,'way':2,'at':2,'in':3,'helium':1,'globe.':1,'end':6,'parish':1,'food-plant':1,'other':1,'which':3,'inch':1,'physical':1,'week':1,'snail':1,'may':1,'after':1,'molecule':1,'hand':2,'plane':3,'such':1,'class':2,'man':2,'planet':1,'owns':1,'colour':3,'electron':1,'element':1,'more':1,'time':5,'the':1,'lined':1,'egg':1,'order':1},'spanish':{'don.':1},'open':{'pipe':1,'sea':25,'jaws':1,'waters':2,'there':1,'up':1,'one':1,'water':1,'atlantic':1,'sea.':1,'doors':1,'sea--the':1,'the':1,'gateways':1},'city':{'ut':1,'like':1},'bite':{'of':1,'at':1},'indicate':{'a':2,'the':4,'that':1,'first':1,'an':1},'2':{'and':4,'among':1,'show':1,'gradual':1,'in':1,'it':1,'chromosomes.':3,'feet':1,'tons':1,'jupiter':2,'escape':1,'paternal':1,'egg':1,'nebulae':1,'factors':1,'physiological':1,'.':11,'0':1,'3':1,'holding':1,'newly':1,'500':3,'we':2,'maternal':1,'inches':2,'respectively':1,'instinctive':1,'canals':1,'with':1,'by':1,'a':1,'represents':1,'of':3,'the':13,'changes':1},'vapoury':{'tail':1},'stuffed':{'their':1},'bits':{'.':1},'lingering':{'influence':1,'here':1},'vapours':{'and':1,'that':1,'of':1,'whirling':1,'imaginable':1,'.':1,'above':1},'on.':{'we':1,'there':1,'illustration':1,'sec':1,'in':1,'the':3,'recent':1},'viviparous':{'the':1},'gently.':{'these':1},'proving':{'everything':1,'trying':1,'itself':1},'s.c.':{'on':1},'herds':{'extended':1},'absorbs':{'most':1,'the':2,'all':1},'photographic':{'emulsions':1,'plate':11,'negative':1},'structure.':{'differences':1,'in':1},'vapour.':{'millions':1},'meteors':{'and':2,'what':1,'showing':2,':':1,'approach':1,'or':2},'third':{'and':2,'case':1,'layer':1,'eyelid':2,'form':1,'of':3,'night':2,'rings':1,'digit':1,'haunt':1,'trial':1,'printing':1,'great':1,'have':1,'atom':1,'answer':1,'interglacial':3},'depressed':{'into':1},'himself.':{'when':1},'weapons--the':{'sea-anemone':1},'siding':{'we':1},'future':{'and':1,'for':1,'reproductive':1,'of':1,'holds':1,'.':6,'access':1,'cannot':1,'let':1,'need':1,'research':1,'generations.':1},'17-1':{'2':1},'trekking':{'to':1},'college':{'of':2,'observatory.':4},'wandering':{'about':1,'amoeboid':2,'.':1},'johnstone':{'j':1},'prospect':{'for':3,'.':1},'thousandths':{'of':1},'royalties':{'.':1,'under':1},'sac':{'beneath':1},'turned':{'towards':1,'from':1,'into':5,'round':1,'to':1,'sharply':1,'rapidly':2,'the':1,'its':1},'argument':{'supposes':1,'implies':1},'alley':{'at':1},'auroral':{'displays':1},'say':{'just':1,'is':1,'some':1,'it':2,'an':1,'brain':1,'as':1,'at':2,'in':1,'our':1,'its':1,'what':2,'for':1,'sodium':1,'much':2,'began':1,'there':3,'ignorabimus.':1,'.':2,'other':1,'therefore':1,':':1,'reflex':1,'more':4,'presently.':1,'we':2,'full':1,'that':26,'mammals':1,'here':1,'unification':1,'they':3,'half':1,'by':1,'a':1,'about':1,'like':1,'of':5,'enthusiastic':1,'according':1,'without':1,'ignoramus':1,'the':9},'buried':{'and':1,'eggs':1,'his':1,'egg':1,'alive':1},'horsepower':{'.':1},'1':{'and':3,'testing':1,'it':2,'an':1,'100th':1,'drawings':1,'in':1,'before':2,'67':2,'25':1,'giant':1,'for':1,'no':1,'sun':1,'except':1,'.':10,'1':1,'to':1,'340':1,'mars':1,'progress':1,'we':1,'300':1,'dam':1,'67000':1,'but':1,'000':2,'125':2,'367':1,'drought':1,'20417':1,'with':1,'by':1,'evolution':1,'1800':1,'of':4,'35':1,'1845':1,'the':12,'two':1},'sap':{'reminding':1,'and':1,'which':1},'saw':{'and':1,'a':1,'all':1,'that':1,'may':1,'is':1,'earlier':1,'about':2,'heard':1,'combine':1,'in':2,'the':1,'has':1,'was':1},'1903.':{'illustration':1},'law.':{'if':1},'unsuitable':{'and':1,'pools':1},'downwards':{'on':1,'along':1,'at':1},'aside':{'to':1,'conventional':1,'only':1},'zoo':{'with':1,'were':1},'note':{'that':1,'of':2,'is':2,'its':1,'how':2,'the':9,'still':1,'by':1},'take':{'frogs':1,'it':1,'an':3,'as':1,'in':1,'our':2,'its':1,'what':1,'from':1,'rather':1,'long':1,'1':1,'to':2,'much':1,'400':1,'place.':1,'photographs':1,'centuries':1,'advantage':1,'between':2,'about':1,'leaps':1,'one':1,'a':6,'great':2,'light':1,'up':1,'us':1,'place':1,'five':1,'the':10,'root':2,'50':1},'fruit-fly':{'drosophila':1},'wanting':{'of':1},'powers--man':{'still':2},'butterfly':{'kallima':2,'showed':1,'which':1,'an':1},'scents.':{'the':1},'hunt':{'insects':1,'from':1},'wilson.':{'peripatus':1,'rock':1},'opposite':{'pans':1,'direction':2,'electric':1,'ways':1,'of':1,'ends':1,'side':2,'picture.':1,'directions':3,'page':1},'knew':{'to':1,'what':1,'.':1,'but':1,'less':1},'molecule':{'of':4,'is':2,'contains':1,'as':1,'every':1,'therefore':1,':':1,'with':1},'talk':{'of':1},'detect':{'and':2,'a':2,'them':1,'less':1,'this':1,'as':2,'such':1,'the':2},'printed':{'cards':1,'on':2,';':1,'and':1,'editions':1},'remarks':{'of':1},'inserted':{'nuts':1},'pages':{'for':1},'adaptability':{'of':1},'average':{'distance':1,'would':1,'level':1,'of':1,'men':1,'molecule':1,'height':1,'depth':1,'5':1,'human':1,'estimate':1,'organism':1},'drive':{'electric':1},'crowd--we':{'cannot':1},'unabated':{'to':1},'messier':{'31':2},'atlantic':{'and':1,'cod-banks':1,'some':1,'.':1,'crowds':1,'overcome':1},'salt':{'and':1,'did':1,'of':1,'lake':2,'.':1,'water':2,'projects':1},'laws':{'and':1,'of':5,'alone':1,'regulating':1,'in':1},'walking':{'and':2,'on':1,'wood':1,'powers':2,'movements':1},'pencilled':{'above.':1},'definite':{'direction':2,'constant':1,'periodic':1,'positions':1,'function--we':1,'answers':1,'possibilities':1,'entities':1,'step':1,'race':1,'figures':1,'nervous':1,'learning':2,'mammals':2,'routes':1,'position':2,'concentric':1,'type':1,'order':1,'bronze':1},'imagines':{'when':1},'friction':{'and':1,'on':1,'.':1,'when':1,'of':1},'far-reaching':{'importance':1,'influences.':1,'with':1,'discoveries':1,'consequences':2},'bright':{'star':1,'globe':1,'lines':5,'central':1,'white':1,'cloudlets':1,'image':1},'fiord':{'estuary':1},'scarce':{'as':1,'multiplying':1},'imagined':{'the':1,'entity':1},'beetles':{'and':1},'slot':{'and':1,'of':1},'colony-making':{'protozoon':1},'slow':{'and':1,'like':1,'boiling':1,'one':1,'down':2,'to':3,'as':1,'vibrations':1,'although':1,'changes':1},'representation':{'of':6,'to-day':1},'gravers':{'and':1},'fox-terrier':{'turned':1},'liberation':{'and':1},'going':{'on':17,'appearing':1,'that':1,'back':5,'one':2,'to':4,'through':1,'farther':1,'on.':8,'beyond':1,'outward':1,'concern':1},'uppermost':{'portion':1,'layer':1},'helmholtz':{'lord':1},'dispute':{'as':1,'the':1},'evolution--but':{'even':1},'hindmost':{'pair':1},'guarded':{'against':1},'tail.':{'now':1,'it':1,'but':1,'man':1},'infallibly':{'between':1},'genera':{'and':1},'eel-fare':{'includes':1},'freezing':{'.':1,'point':1},'theory--had':{'a':1},'also--protection':{'for':1},'clearest':{'realities':1},'shallow-water':{'species':1},'keenly':{'aware':1},'parasitic':{'sporozoa':1,'death':1},'toads':{'newts':1,'and':2,'jump':1,'sometimes':1},'absurdly':{'small':1},'liable':{'to':3,'such':1},'where':{'and':1,'copper':1,'words':1,'it':10,'deep':1,'an':1,'sea':1,'any':1,'dense':1,'no':1,'there':5,'its':1,'their':1,'does':3,'routine':1,'you':1,'alertness':1,'we':3,'very':1,'they':2,'alone':1,'instinctive':1,'a':3,'this':2,'these':1,'each':1,'the':24},'sake--imitation--the':{'mind':1},'vision':{'and':1,'is':3,'holds':1,'than':1,'in':1},'press.':{'comparative':1},'proof--man':{'s':1},'attenuated':{'that':1},'electrons--and':{'the':1},'reign.':{'they':1},'silurian':{'and':1,'the':1,'when':1,'period':2,'rocks':1},'up':{'and':8,'individually':1,'intelligence':2,'into':14,'it':1,'general':1,'light-waves':1,'at':1,'questions':1,'in':10,'impressions':1,'rivulets':1,'the':26,'any':1,'living':1,'what':1,'from':2,'for':2,'how':1,'.':5,'to':8,'between':1,'estuaries':1,'new':1,'energy':1,'his':1,'an':1,'substances':1,'our':2,'nonproprietary':1,'trees':1,'but':1,'such':1,'one':1,'with':6,'by':10,'a':9,'on':5,'organic':1,'these':1,'light':1,'leaves':1,'carbon':3,'so':2,'of':9,'again':2,'everything':1,'photosynthesis':1,'or':4},'distended.':{'eventually':1},'impressions':{'go':1,'of':1,'.':1},'hastened':{'the':1},'830':{'000':2},'inequalities':{'of':1,'in':1},'compounds':{'to':1,'from':1,'activated':1,'like':1,'out':1},'representatives':{'of':3,'sometimes':1,'had':1,'except':1,'.':1},'under-skin':{'or':1,'.':1},'secondaries':{'are':1},'dormitory':{'instead':1},'--which':{'have':1},'moons':{'we':1,'of':4,'four':1,'to':1,'which':2,'certain':1,'round':1},'affecting':{'it':1,'nerve-cells':1},'man.':{'a':1,'on':1,'animals':1,'pariasaurus':1,'4':1,'triceratops':1,'it':1,'deperet':1,'according':1,'1':1,'illustration':1,'such':1,'eocene':1,'man':1},'volvox':{'a':1,'69':1,'the':1,'is':1,'.':1},'fir':{'cones':1},'spectroscopy':{'is':1},'vertical':{'line':1,'bars':1},'screen':{'and':1,'we':1,'for':1,'means':1,'where':1,'is':1,'.':4,'through':1,'which':1,'producing':1,'make':1,'glowed':1},'dome':{'like':1,'.':1},'ancestors--a':{'wolf':1},'big-brain':{'type':4},'proterozoic':{'ages':1,'eras':1,'era':1},'jets':{'of':2,'or':1},'engravings.':{'factors':1},'spark':{'on':1,'this':1,'.':1,'271':1,'274':1,'consists':1,'an':1,'or':1},'well-protected':{'pupa':1},'concentrated':{'upon':2},'circumference':{'so':1,'.':1},'many':{'insects':1,'instincts':1,'years':1,'bivalves':1,'experiments':2,'facts':1,'contributions':1,'birds':4,'young':2,'forms':4,'parts':2,'anticipations':1,'reptiles':2,'inventions':1,'thousands':2,'which':1,'tenses':1,'very':1,'crustaceans':1,'portions':1,'more.':1,'far-reaching':1,'minute':1,'fossils':1,'nerve-endings':1,'countries':1,'corners':1,'miles':2,'brownish':1,'small':4,'freshwater':1,'generations':1,'people':1,'animals':9,'fish':1,'parasites':1,'individual':1,'universes':2,'hundredfold':1,'creatures':2,'oceanic':1,'for':1,'ways':1,'migrations':1,'new':1,'open-sea':1,'levels--the':1,'we':1,'were':2,'hours':1,'broken':1,'directions.':1,'yards':1,'directions':3,'about':1,'brilliant':1,'of':23,'months':2,'haunts':1,'times':3,'shore-animals':2,'tree-loving':1,'already':1,'useful':1,'annelids':1,'another':1,'fees':1,'protozoa':2,'establish':1,'millions':5,'ancient':1,'would':1,'.':1,'tropical':1,'stars':2,'dangers':1,'more':1,'acquisitions':2,'that':2,'mammals':3,'regard':1,'sciences.':1,'amphibians':1,'cases':9,'an':1,'plants':1,'prehistoric':1,'unsegmented':1,'places':1,'apples':1,'planes':1,'drops':1,'similar':2,'and':2,'likewise':1,'days':3,'have':1,'domesticated':1,'occur':1,'different':5,'things':1,'shore':1,'astronomers':4,'other':9,'doors':1,'units':1,'mysteries':1,'kinds':1,'thoroughgoing':1,'eggs':1,'swiftly':1,'problems':1,'important':1,'waves':1,'fishes':1,'types':2,'a':3,'land':1,'minutes':1,'sometimes':1,'peculiarities':1,'electrons':1,'nuclei':1},'moon.':{'illustration':1},'estimates.':{'the':1},'thickly':{'peopled':2},'s':{'chicks':1,'atmosphere':3,'skeleton':1,'sentence':1,'stinging-cells':1,'instincts':1,'sheltering':1,'brain':3,'snapping-blades':1,'hairs--an':1,'skin':2,'chicken':2,'visceral':1,'principal':1,'web':3,'anvil':1,'interesting':1,'instruction':1,'monkeys':1,'hidden':1,'real':1,'beginnings.':1,'return':1,'orbit':1,'arboreal':3,'big':1,'theory--had':1,'famous':2,'shell--there':1,'sons':2,'moods':1,'saying':1,'hands':1,'press':7,'world':1,'rotation':4,'continued':1,'day':4,'runs':1,'establishment':1,'cry':1,'solution':1,'experiments':1,'activity':1,'sake--imitation--the':1,'ceaseless':1,'mental':2,'energy':2,'mongoose':1,'notice':1,'past':1,'affiliation':1,'books':1,'mighty':1,'year':1,'laboratory':1,'indirect':1,'ascent':2,'arm':1,'shining':1,'pedigree':2,'apparatus':2,'nebula':6,'crust':4,'finger':1,'rational':1,';':2,'eggs':1,'discovery':1,'body':8,'prerogative.':1,'theory':2,'leg':1,'beak-like':1,'men':4,'behaviour':1,'magnetism':2,'compass':1,'dwindling':1,'tide-producing':1,'intense':1,'advance':2,'great':2,'derivation':1,'side':1,'croaking-sacs':1,'patagium':1,'action':1,'history':2,'frequent':1,'skill':1,'point':4,'feelings':1,'inquisitive':1,'long':2,'beak':2,'theory.':1,'story':1,'sake':1,'initial':1,'frog':1,'.':26,'dropping':1,'pedigree--man':1,'structure':1,'danger-note':1,'white':1,'store':1,'mundane':1,'eyes':2,'hard':1,'flight':1,'relationship':4,'cluck':1,'training':1,'shard':1,'bulk':1,'heat':2,'surface':19,'ear':1,'food-canal':1,'essays':1,'he':1,'pull':2,'wise':1,'skull':3,'solid':2,'gravitational':1,'bill':12,'fly-trap':1,'light':4,'propeller':1,'head.':1,'earth.':1,'ein':1,'and':1,'words:':1,'discovery.':1,'ingenuity':1,'horns':1,'escape':1,'mind':3,'head':3,'apartness':1,'dog':1,'shell':1,'at':1,'cathedral':1,'wonderful':1,'clothing':1,'laws.':1,'movements':2,'cage':1,'rays':5,'maxim:':1,'diurnal':1,'inheritance':1,'heat.':1,'forceps':1,'blood-relationship':1,'food':1,'strange':1,'animal':1,'hedgehog-like':1,'predestined':1,'civilisation':1,'composition':1,'conclusion':1,'vestigial':1,'nest':1,'philosophy':1,'reach':1,'hand':1,'ancestors':4,'mouth':1,'device':1,'does;':1,'sand-grouse':1,'descent':3,'mysteries':2,'remote':1,'expert':1,'foot':1,'undeniable':1,'age':2,'handiness.':1,'coastlines':1,'star-book':1,'mass':1,'gill-plates.':1,'the':2,'wing':4,'goals':1},'mane':{'reaching':1},'expended':{'their':1},'flipper':{'of':3},'expression':{'of':6,'is':1,'as':1,'are':1,'familiar':1,'instinctive':1,'has':1},'moon;':{'it':1},'riddle':{'that':1},'stoats':{'hares':1},'ants':{'and':5,'beneath':1,'bees':3,'are':1,'hive':1},'air-breathing':{'insects':1,'arthropods':3,'amphibians':1,'invertebrates':1},'boar':{'and':1,'below':1,'coloured':1,'were':1},'extinct':{'and':2,'reptile':2,'apes':1,'animals':2,'volcanoes':1,'fish':1,'flying':3,'leaving':1,'monsters':1,'neanderthal':1,'reptiles':1,'types--':1,'race':1,'in':1,'not':1,'vegetarian':2,'type':1,'or':1,'pterodactyls':1,'flightless':2},'twig':{'and':1,'breaks':1,'for':1},'want.':{'illustration':1},'fitful':{'gleams':2},'collides':{'with':1},'cetaceans':{'some':1},'stretch':{'of':1,'vast':1},'mounting':{'of':1},'lettering':{'to':1},'diurnal':{'tint.':1,'variation':1},'collided':{'with':1},'combined':{'to':1,'operation':1},'finger-tip':{'they':1},'reflective':{'one':1},'covering':{'and':1,'many':1,'is':1,'of':2},'recaptures':{'it':1},'day--a':{'long':1},'enable':{'their':1,'the':1,'us':4},'gist':{'of':2},'lakelets':{'of':1},'thousand':{'and':1,'or':2,'trillion':2,'of':1,'cells':2,'million':2,'together':1,'years':10,'millions':1,'miles':3,'.':1,'steep':1,'thousand':1,'generations':1,'times':6},'formed':{'a':1,'then':1,'has':1,'from':3,'float':1,'young':1,'it':1,'solids':1,'at':1,'sandstones':1,'in':2,'the':4,'.':2,'by':2},'haunt':{'forever':1,'for':1,'of':8,'some':1,'stops':1,'includes':1,'so':1,'which':1,'has':1},'photos':{':':5},'indents':{'the':1},'observe':{'these':1,'and':1,'in':1},'infusorians':{'to':1,'like':1},'diffuse':{'and':1,'gas':1},'co-ordination':{'of':1},'prominence':{'to':1,'by':1,'would':1},'intimately':{'associated':1,'bound':1},'dints':{'impressed':1,'have':1},'confidently':{'say':1},'situation':{'.':5,'for':1,'in':1},'region':{'smaller':1,'of':5,'is':1,'when':1,'to':1,'at':1,'known':1,'the':4,'called':1,'south':2},'girth':{'.':1},'concatenation':{'of':1},'birth.':{'enough':1},'regularity':{'of':1},'rock-cod':{'requires':1},'ascii':{'start':1,'or':2},'adopted.':{'the':1},'binary':{'compressed':1},'beginning.':{'in':1},'shuts':{'on':1},'preparatory':{'to':1},'perpetually':{'giving':1},'coconuts':{'is':1},'emulsions':{'can':1},'way.':{'this':1,'bearing':1},'wires':{'as':1,'are':1,'in':1},'sickness':{'.':5},'edges':{'and':1,'of':4},'advertisement':{'impressing':2},'six':{'meant':1,'feet':1,'great':1,'main':1,'inches':1,'very':1,'thousand':1,'months':1,'quite':1,'colours':1,'to':2,'miles':1,'greatly':1,'years':1,'weeks':1,'stages':2},'volcanoes':{'.':1},'tentacle':{'touches':1},'know':{'and':2,'almost':1,'indeed':1,'is':1,'it':4,'not':1,'as':2,'are':1,'in':1,'if':1,'fire':1,'what':1,'from':1,'their':1,'when':3,'gases':1,'.':3,'to':2,'outside':1,';':1,'be':1,'that':17,'very':1,'but':1,'nothing':1,'now':2,'with':1,'a':1,'also':1,'about':1,'to-day':2,'whether':3,'of':4,'no':1,'definitely':2,'far':1,'life.':1,'the':5,'nothing.':1,'something':1},'peculiarities':{'and':1,'of':5,'.':1,'say':1,'in':2,'such':1},'costs':{'and':2},'engulfing':{'and':1,'large':1,'in':1},'unimagined':{'.':1},'persistently':{'used':1,'resorted':1},'216':{'photo':2},'summer':{'and':2,'full':1,'darkness':1,'of':1,'green-flies':1,'months':1,'scene':2,'day':1,'plumage':1,'s':1,'does':1,'at':1,'weather.':1,'than':1},'followed.':{'illustration':1},'manifold':{'significance.':1,'influence':1},'213':{'photo':2},'being':{'already':1,'closely':1,'swept':2,'blown':1,'unpalatable':1,'able':1,'moved':1,'investigated.':1,'an':3,'held':1,'as':1,'set':2,'dried':2,'human':1,'nonplussed':1,'swallowed':2,'any':1,'given':1,'built':1,'to':1,'washed':2,'due':1,'continually':1,'liberated':1,'outside':1,'incessantly':1,'deposited':1,'surveyed':1,'endowed':1,'polygamous':1,'more':2,'a':1,'affected':1,'evolved':1,'that':3,'very':1,'mammals':1,'formed':1,'what':1,'driven':1,'imperfectly':1,'nourished':1,'dissipated':1,'on':1,'than':1,'regrown':1,'thrown':1,'begins':2,'devoured':1,'indivisible':1,'embryos':1,'frozen':2,'consumed':1,'utilised':1,'replaced':1,'greatly':1,'hurled':1,'each':1,'quick':1,'the':3,'left':1,'reinforced':1},'drone-fly':{'is':1},'slime':{'from':1},'rest':{'and':1,'repair':1,'assured':1,'of':5,'is':1,'belong':1,'.':3,'till':1,'through':1,'in':1},'steamer':{'and':1},'crust.':{'on':1},'potentiality':{'of':1},'aspect.':{'illustration':1},'water-basins':{'or':1},'ligula':{'or':1},'weekly':{'nature':1},'occasional':{'light':1,'flash':1,'traces':1},'tactility':{'.':2},'geological':{'clock':1,'time-table':1,'estimates.':1,'tree':1,'middle':1,'periods':1,'time':1,'past.':1},'silver':{'on':1,'mirror':1},'instrument':{'and':1,'again':1,'used':2,'for':3,'that':1,'of':3,'however':1,'to':1,'which':2,'in':1,'the':2,'has':1,'ever':1,'gets':1},'formative':{'times':1},'continuation':{'of':2},'prominently':{'whenever':1,'displaying':1},'form-resemblance.':{'illustration':1},'skies':{'.':1},'aspects':{'of':3,'matter':1,'folk':1,'.':1},'around':{'sun':1,'the':8,'its':1,'us':1,'an':2},'decomposed':{'into':1},'dart':{'to':1},'dark':{'sprawling':1,'and':1,'absorbing':1,'spots--they':1,'in':1,'silent':1,'nebula':1,'moorland':1,'spots':1,'forms':1,'to':1,'only':1,'parts':1,'stars':1,';':1,'body':1,'bands':2,'water':1,'heat':1,'lines.':1,'markings':1,'areas':1,'varieties':1,'corners':1,'region':1,'fringe':1,'lines':3,'matter':1,'of':1},'bandage':{'which':1},'vacuum':{'tube--the':1,'tube':7,'tubes':1,'.':2},'world':{'and':2,'would':1,'new.':1,'throwing':1,'is':4,'within':1,'an':1,'as':1,'are':2,'in':2,'provokes':1,'if':1,'wondered':1,'internat':1,'when':1,'.':13,'without':1,'too':1,'which':2,';':2,'was':1,'over':1,'then':1,'knows':1,'means':1,'becomes':1,'who':1,'but':2,'than':2,'like':1,'a':1,'about':1,'for':2,'of':7,'professor':1,'monkeys':3,'will':1,'s':1,'became':1,'can':2,'always':1,'biological':1,'the':2,'entered':1,'settled':1,'came':1,'once':1},'breakage':{'plane':1},'vague':{'idea':1},'dare':{'not':1,'say':1,'one':1},'sensational':{'stories':1,'estimates':1,'discoveries':1},'60':{'spotted':1,'000':2,'reproduced':1,'days':1},'fossils':{'we':1,'e.g':1,'of':1,'when':1,'but':1,'coloured':1,'.':1,'in':1,'binding':1,'many':1,'by':1},'pole':{'to':2,';':1,'of':5,'was':1,'in':1},'claw':{'it':1},'stationary':{'.':1},'clap':{'of':1},'65':{'photo':1,'reproduced':1},'satisfactory':{'and':1,'fossils':1,'or':1,'way':1},'fives':{'or':1},'wattle':{'or':1},'law--senses':{'of':1},'lobster':{'swimming':1},'all-pervading':{'similitude':2},'diving':{'in':1,'flying':1,'capacity':1,'but':1,'suit':1},'racial':{'evolution':2,'profit.':1,'ventures':1,'strains':1,'vigour':1,'change':2,'qualities':1,'process':1,'qualities--notably':1},'armoured':{'fishes':1},'thinks':{'of':1,'the':1,'that':3,'less':1},'wrongly':{'call':1,'shows':1},'dissociated':{'and':1},'dimensions':{'11':1,'this':1,'.':2,'cannot':1,'in':1,'than':1},'cavity':{'the':2},'memories':{'and':1,'of':3},'noon':{'of':1},'tree-snake':{'is':1},'nook':{'of':1},'favourite':{'answer':1},'semotilus':{'atromaculatus':2},'918':{'miles':1},'happened':{'to':2,'over':1,'later':1,'in':2,'one':1},'levels--the':{'tendency':1},'transmutation':{'of':1,'brighten':1,'would':2},'refer':{'to':3,'throughout':1},'scientific':{'glories':1,'methods':1,'habit':2,'mind':2,'imagination':1,'caution':1,'weekly':1,'instruments.':1,'ideas':6,'way':1,'description':1,'description.':1,'american.':1,'men':2,'problems':1,'hypothesis':1,'statement.':1,'spirit':1,'man':1,'acquisitions':1,'definition':1,'study':1,'american':1,'way.':1,'spectator':1,'position':1},'power':{'used':1,'from':1,'stations':1,'of':37,'stations.':1,'that':1,'to':1,'enough':1,'in':1,'or':1,'is':2},'intimate':{'physiological':1,'part':1,'partnership':3,'physiology':1},'sprung':{'from':1},'precious.':{'illustration':1},'endogamy':{'tending':1},'five.':{'if':1},'lens':{'and':2,'weighs':1,'of':1,'is':1,'two':1,'.':3,'four':1,'near':1,'however':1,'at':2,'resolved':1,';':1,'called':1},'stone':{'implements':3,'and':1,'neolithic':1,'curlews':1,'generates':1,'hunting':1,'resting':1,'of':1,'age':3,'implements--knives':1,'until':1,'to':1,'running':1,'.':1,'into':1,'living':1,'the':2,'trying':1,'its':1,'or':1,'age.':3},'origins':{'are':1},'swarms':{'of':1},'industry':{'and':1},'slender':{'stream':1},'side':{'and':5,'for':1,'tells':1,'of':19,'actions':1,'.':8,'to':9,'below':1,'so':2,'are':1,'veins':1,';':1,'must':1,'was':2,'by':1,'view':1},'practicable':{'to':1},'act':{'though':1,'of':2,'was':1,'against':1,'as':2,'together':1,'experimentally':1,'instinctively':1,'with':1},'composed--':{'one':1},'johnston':{'in':1},'--brushes':{'off':1},'puzzle-box':{'at':1},'diversely':{'adapted':1},'fundraising':{'.':1},'burning':{'and':1,'coal':1,'wood':1,'of':1},'image':{'and':1,'of':2,'.':1},'electricity.':{'what':1,'4':1},'surinam':{'toad':4},'carey':{'s':2},'mic.':{'sci.':1},'sneering':{'curl':1},'wave-movements':{'on':1},'lively':{'cheerful':1,'and':1,'commotion':1,'.':1},'wade':{'cautiously':1},'excrementitious':{'material':1},'snakes':{'are':3,'.':1},'tropical':{'shores':1,'africa':2},'repertory.':{'from':1,'according':1},'her':{'and':1,'silken':1,'family':2,'supply':1,'almost':1,'advantage.':1,'hand.':1,'mind':1,'hindmost':1,'young':1,'chin':1,'in':1,'arm':1,'web':1,'ancestors':1,'two':1,'stealthy':1,'short':1,'to':2,'tail':1,'eggs':6,'body':2,'life':1,'maternal':1,'offer':1,'nest':1,'attention':1,'back':2,'behaviour':1,'nimble':1,'mouth-parts':1,'intent':1,'beak':1,'instinctive':1,'teacher':2,'clumps':1,'a':1,'perceptions':1,'cocoon':1,'limits':1,'performances':1,'except':1,'range':1,'race':1,'teeth':1,'mouth':1,'relation':1},'bristles':{'.':1},'reflectors':{'and':1,'.':1},'symbiosis':{'.':1},'secretion':{'such':1,'of':1},'hen':{'leave':1,'there':1,'which':1},'bubble':{'would':1,'of':3,'ascends':1,'coloured':1,'as':1,'are':1,'were':1,'the':1,'is':2},'survives':{'in':1},'journ':{'.':2},'continents':{'and':4,'are':1,'.':1},'secreted':{'strange':1,'from':2,'by':1},'semnopithecus':{'entellus':1},'mammals':{'and':9,'among':1,'there':2,'besides':1,'show':2,'enjoy':1,'it':1,'as':2,'including':1,'are':3,'have':2,'in':1,'ourselves':1,'whose':1,'by':2,'from':1,'hoofed':1,'did.':1,'burrowers':1,'.':13,'to':2,'master':1,'emerged':1,';':2,'save':1,'is':1,'we':2,'repeat':1,'which':1,'may':1,'but':1,'like':9,'arose':1,'they':2,'such':4,'flowering':1,'now':1,'adaptive':1,'possess':1,'off':1,'especially':1,'e.g':1,'these':1,'always':1,'will':1,'very':1,'the':2,'furnish':1},'nitrogenous':{'waste':2,'material':1},'foreheads':{'well-marked':1},'another.':{'investigation':1,'sec':1,'besides':1,'illustration':1},'survived':{'and':1},'elimination':{'of':3},'mice':{'learn':1},'with':{'all':8,'pointing':1,'less':1,'frontispiece.':1,'over':1,'particular':1,'worms':2,'yellow':1,'far-reaching':1,'hind-legs':1,'experiments':1,'human':1,'signs':1,'alternative':1,'its':12,'colour-associations':1,'one':4,'cave-bear':1,'remarkable':1,'decomposing':1,'much':5,'young':2,'reason--lays':1,'better':1,'insects':1,'neighbours':1,'internal':1,'microscopic':1,'4':3,'disgust':1,'gravel':1,'instincts':1,'awareness':2,'alternating':2,'them':3,'his':11,'increased':1,'permission':1,'arboreal':1,'capacities':1,'longish':1,'balancing':1,'negative':1,'words':2,'instinctive':1,'silk':1,'motor':1,'progressive':1,'sense-organs':1,'ageing':1,'large':4,'this':11,'coco-nut':1,'each':1,'perceptual':1,'traces':1,'engravings':1,'mental':1,'intelligence':2,'energy':2,'hard':1,'some':6,'plumage':1,'us':1,'our':3,'instinct--the':1,'rough':1,'folk':1,'planetesimal':1,'what':3,'definite':1,'fingers':2,'worship':1,'difficulties':1,'rational':1,'numerous':2,'public':1,'scientific':1,'zest':1,'cellulose':1,'seaweeds':1,'out-flowing':1,'extraordinary':1,'compressed':1,'tartan':1,'by':1,'universals.':1,'both':1,'great':7,'freshwater':2,'distinctness':1,'many':3,'parts':1,'motion':1,'benevolence':2,'grain':1,'greatly':1,'atoms.':1,'warning':1,'or':2,'embryo':1,'copper':1,'equally':1,'there':1,'peculiar':1,'sweet':1,'powerful':1,'marked':1,'hearing':1,'sympathy':2,'unicellular':1,'another':4,'such':3,'faraday':1,'.':1,'open':1,'your':1,'fossil-bearing':1,'startling':1,'little':1,'her':3,'shells':1,'positive':1,'flying':1,'two':1,'particulars':1,'anyone':1,'their':9,'2':2,'which':17,'reptiles':1,'vapours':1,'life':1,'only':1,'that':1,'becoming':1,'apparent':1,'flinty':1,'stone':1,'amphibians':1,'it':7,'offers':1,'determination':1,'external':1,'excellent':1,'prodigious':2,'an':11,'active':2,'considerable':2,'those':2,'animals':1,'adaptations':1,'glory':1,'these':4,'instinct':2,'sea-anemones':1,'project':2,'matter':2,'paragraph':2,'temperatures':1,'wicketed':1,'concepts':1,'wild':1,'about':1,'more':6,'beliefs':1,'something':2,'and':1,'associated':1,'protrusive':1,'almost':2,'certain':3,'universal':1,'suggestions':2,'few':1,'general':4,'as':1,'breathing':1,'numbers':1,'aristotle':1,'in':6,'partner':2,'mediocre':1,'agility':1,'any':2,'currents':1,'masterly':1,'astonishing':1,'different':2,'awkward':1,'no':2,'unsuitable':1,'ideas':1,'immense':1,'pectoral':1,'food':1,'other':3,'coconuts':1,'animal':1,'ordinary':1,'enormous':1,'calendar-keeping':1,'rude':1,'opposite':1,'mentality':1,'unsurpassed':1,'most':1,'mankind':1,'moss':1,'mendel':1,'astronomy':1,'buttonholes':1,'man':2,'a':72,'short':1,'branches':1,'traps':1,'conscious':1,'others.':1,'professor':1,'incredible':1,'eddies':1,'peculiarities':1,'points':1,'electrons':2,'very':1,'the':149,'mating':1,'reserve':1},'pull':{'of':3,'acting':1,'which':1,'each':1,'the':3,'than':2},'rush':{'violently':1,'through':1,'of':2},'october':{'10':1,'3':2,'5':2},'stoneless':{'plum':1},'world-cloud':{'of':1},'universe--astronomical':{'instruments.':1},'nearest':{'planet':1,'to':5,'star':2,'stars':2,'of':1},'agree':{'rather':1,'to':7,'.':1,'with':1,'that':2},'darker':{'in':1},'gone':{'furthest':1,'far':1,'back.':1,'to':1,'through':1,'in':1,'wild':2,'further':1,'beyond':1,'by':1},'haunts--such':{'as':1},'certain':{'comets':1,'individuality':1,'abilities':1,'hormones--itself':1,'facial':1,'repertory':1,'is':2,'pre-arrangements':1,'number':1,'actions':1,'sounds':1,'internal':1,'depth':1,'from':1,'degree':2,'microbes':1,'that':15,'peculiarities':1,'parts':1,'black':1,'units':1,'ancestor':1,'lichens':1,'long-headed':1,'backgrounds':1,'we':1,'clever':1,'kinds':1,'desires':1,'substances':1,'ductless':1,'however':1,'effective':1,'atoms':1,'sensory':1,'dinosaurs':1,'chemicals':1,'words':1,'cases':3,'minerals':1,'types':2,'areas':1,'plants':1,'dark':2,'kind':1,'difficulties':1,'predisposition':1,'commands':1,'lines':2,'strange':1,'amount':7,'implied':1,'limit':1,'of':1,'fixed':1},'ak':{'99712':1},'cuttles':{'or':1},'am':{'of':1},'an':{'ovule':1,'impression':4,'atmosphere':1,'evolutionary':1,'earthworm':5,'astronomical':1,'egg-cell':1,'infant':3,'aquatic':1,'atomic':2,'intricate':2,'earth':1,'abundant':2,'imagined':1,'outer':1,'anvil':1,'interesting':13,'apple--out':1,'endeavour':1,'instrument':4,'advanced':1,'easy':2,'orange':1,'electrical':2,'adequate':1,'unprecedented':1,'equilibrium':1,'increased':2,'advantage':1,'arboreal':3,'inspiriting':1,'indubitable':1,'educative':1,'account':1,'indigenous':2,'answer':3,'unimportant':1,'historic':1,'asymmetrical':1,'aerolite.':1,'awful':1,'instinctive':2,'emergence':1,'antiquity':2,'association':1,'eye-piece':1,'old-established':1,'evolution':1,'onion':1,'organ':3,'extremely':1,'unnecessary':1,'absurdly':1,'emphatic':1,'intensification':1,'activity':1,'entirely':2,'automatic':3,'essential':3,'associative':1,'adaptation':1,'unsatisfied':1,'abbreviated':1,'old':1,'x-ray':2,'insignificant':1,'energy':2,'animalcule':1,'hour.':1,'inkling':2,'astronomer':2,'individual':5,'all-pervading':2,'exuberant':1,'ascent':1,'extinct':5,'electric':20,'index':1,'apparatus':2,'opaque':1,'open':1,'ice':1,'hereditary':1,'increase':2,'appreciative':1,'indian':1,'eight-armed':2,'economical':1,'inborn':2,'indication':1,'antler':1,'increasing':2,'eagle':1,'evolving':2,'earlier':4,'explosive':1,'aeroplane':2,'intimate':1,'ever-lengthening':1,'exudation':1,'illustration':6,'outfit':1,'egg':1,'extraordinary':2,'experimenting':1,'immature':2,'expansion':2,'arithmetical':1,'invisible':2,'entrancing':1,'exciting':2,'advance':1,'enormous':10,'instant':1,'indivisible':1,'envelope.':1,'exceptionally':1,'amount':1,'ineffective':1,'anthropoid':3,'invitation':1,'offshoot':1,'observation':1,'expression':1,'elongated':1,'untutored':1,'utterly':1,'exuberance':1,'intellectual':1,'echo':1,'active':1,'appropriate':1,'eleventh':1,'extraneous':1,'eventful':2,'elementary':1,'inorganic':3,'immensely':1,'electronic':1,'ether':4,'ancient':3,'elastic':1,'eclipse.':1,'alligator':2,'unknown':1,'indispensable':1,'outline':2,'approximate':1,'immense':7,'intermediate':1,'examination':2,'inner':2,'interest':1,'ounce':1,'egg-layer':1,'exploring':1,'extensive':1,'imperfect':2,'amoeba':1,'inclined':1,'immediate':1,'idea':1,'appreciation':1,'external':2,'impulse':2,'atom':16,'upright':1,'improved':1,'institution':1,'encyclopaedia':1,'otter':1,'abundance':1,'exception':1,'apprenticeship':2,'hour':2,'eclipse':3,'harmonious':1,'obvious':1,'empty':2,'historical':1,'emotional':1,'outflame':1,'average':2,'undercharged':1,'assemblage':1,'enforced':1,'angel':1,'almost':2,'expanding':1,'expedient':1,'ant':3,'aristotle':1,'element':2,'apparently':1,'everyday':1,'open-water':1,'angle':2,'infantile':1,'awkward':1,'alphabet':1,'eloquent':1,'american':2,'event':1,'instance':1,'epoch':1,'internal':2,'inquiry':1,'oar':1,'animal':19,'elephant':1,'inch':19,'ordinary':6,'intelligent':6,'explanation':2,'unutterably':1,'independent':1,'extended':1,'easygoing':1,'opposite':1,'actual':2,'object':3,'astounding':2,'insect':5,'important':6,'appreciable':1,'advertisement':1,'infinite':3,'alpha':1,'irretraceable':1,'advantageous':1,'older':1,'undeniable':1,'age':2,'electron':8,'innocent-looking':1,'ocean':2,'intruder.':1,'exceedingly':1,'experimental':2,'african':2,'inhabitant':1,'opportunity':2,'order':1},'as':{'peacock':1,'all':2,'hunger':1,'being':1,'when':2,'mackerel':1,'dancers':1,'soon':1,'rest':1,'symbols':2,'brain':1,'bright':1,'dog':1,'vastly':1,'go':1,'graptolites':1,'expressions':1,'fine':1,'yet':4,'before':2,'one':6,'slow':1,'thrilling':1,'greenwich':1,'fit':1,'sodium':2,'possible.':1,'deposits':1,'examples':2,'to':38,'must':1,'wood':1,'smolts':1,'molecules':1,'ours':1,'gills':1,'has':6,'noctiluca':1,'frogs':1,'good':1,'pre-dravidians.':1,'easily':1,'very':1,'big':1,'locusts':1,'sappers':1,'possible':2,'dark':1,'every':1,'nearly':1,'they':17,'instinctive':1,'now':1,'dr':1,'crabs':1,'worlds':1,'evolution':1,'fossils':1,'heat-waves':1,'cavendish':1,'gifted':1,'modern':1,'large':3,'rods.':1,'stuff':1,'mind-body':1,'relics':1,'each':1,'beasts':1,'amoebae':1,'imprints':1,'mathematical':1,'reactions':1,'set':3,'rats':1,'grouse':1,'curved':1,'radium':2,'creation':1,'some':1,'dead':1,'parasites':1,'miniatures':1,'among':1,'are':2,'specified':1,'body-mind':1,'our':2,'fear':1,'best':1,'happens':2,'established':1,'shown':9,'palaeolithic':1,'for':1,'1850':1,'fingers':1,'food':3,'may':1,'health':1,'monkeyish':1,'copper':1,'public':1,'iron--and':1,'can':1,'granites':1,'we':59,'wheat':1,'inert':1,'cauliflower':1,'nature':1,'equivalent':1,'valuable':1,'atoms':1,'water':2,'basalts':1,'members':1,'represented':1,'oxalic':1,'safer':1,'dwindling':1,'by':1,'change':1,'on':1,'great':2,'kids':1,'of':1,'taking':1,'chamberlin':1,'thinking':1,'cormorants':1,'other':1,'grilse.':1,'peripatus':1,'heavy':2,'equally':1,'there':6,'bricks':1,'explained':1,'powerful':2,'marked':1,'parachutists':1,'walt':1,'freely':1,'einstein':1,'thick':1,'obliging':1,'earthworms':1,'he':3,'described':1,'crocodiles':1,'distinct':1,'twenty':1,'cradles':1,'two':1,'long':9,'quickly':1,'their':4,'much':4,'sponges':1,'man':1,'was':1,'empty':1,'clever':1,'corresponding':1,'that':7,'leptocephali':1,'shoots':1,'mentality':1,'about':1,'amphibians':1,'glass':1,'heat':2,'regards':11,'external':1,'mounted':1,'with':1,'those':9,'inconspicuous':1,'darwin':2,'hour':1,'brusque':1,'reliable':1,'this':2,'sea-anemones':1,'lungbooks':1,'will':1,'matter':3,'projecting':1,'thin':1,'many':6,'cats':1,'primitive':2,'refractors':1,'distinguished':2,'ants':2,'something':2,'collecting':1,'stubborn':1,'bullhead':1,'defined':1,'is':11,'year':1,'it':60,'an':14,'professor':5,'well.':1,'pieces':1,'numbers':1,'aristotle':1,'in':30,'handle':1,'lambs':1,'any':1,'if':16,'cave-men':1,'sir':3,'different':1,'compared':2,'no':1,'shell-shock':1,'means':1,'uranium':1,'far':5,'internal':1,'useless':1,'pure':1,'elephant':1,'resembling':1,'you':2,'volplanes':1,'higher':1,'open-water':1,'used':1,'beauty':1,'though':1,'contrasted':1,'mutual':1,'rain':1,'most':2,'but':1,'significant':1,'such':2,'elvers':1,'commensalism':1,'probable':1,'a':95,'crystals':1,'safe':1,'pithecanthropus':1,'light':1,'clear':1,'sun-spots':1,'well':11,'grilse':1,'donkeys':1,'having':1,'beds':1,'these':2,'electrons':1,'mechanical':1,'at':1,'the':98,'drawing':1,'restored':2},'associating':{'certain':1},'at':{'distances':1,'all':21,'rest':2,'four':1,'london':1,'its':10,'20':1,'work.':2,'mauer':2,'paris':1,'those':1,'heidelberg':1,'dates':1,'seventy':1,'his':2,'washington.':1,'mathura':1,'birth':1,'half':1,'12:30':1,'least.':1,'colonising':1,'night':9,'fixed':1,'right':4,'learning':1,'some':4,'coldrum':1,'home':4,'once.':1,'sunrise':1,'3':1,'various':3,'between':1,'nine':2,'each':1,'things--that':1,'hundreds':1,'here':1,'nightfall':1,'by':3,'great':2,'last':4,'many':2,'dublin':1,'so':1,'times':1,'http:':6,'first':9,'cambridge':1,'successive':1,'one':6,'another':2,'250':2,'total':2,'from':1,'twenty':1,'three':1,'least':20,'.':1,'their':2,'2':1,'186':2,'gibraltar':1,'leisure.':1,'500':1,'flight':1,'www.gutenberg.org':2,'that':6,'about':1,'but':1,'92':1,'present':12,'this':7,'work':3,'piltdown':1,'abrupt':1,'4557':1,'1.':1,'and':1,'it':1,'an':7,'niagara':1,'in':1,'any':9,'these':3,'different':4,'no':3,'perhaps':1,'things':1,'other':3,'sobral':2,'which':3,'new':1,'ordinary':1,'enormous':1,'simplicity':1,'opposite':1,'our':1,'earlier':1,'hand':2,'most':1,'two':1,'last--that':1,'such':1,'a':43,'lower':1,'e':1,'ottawa':1,'st':1,'809':1,'sunset':1,'the':123,'drawing':1,'once':11},'fumbling':{'at':1},'walks':{'of':1,'slowly':1,'erect':1},'watched':{'and':1},'tranquil':{'world':1},'dawn':{'of':10,'breaking':1,'to':1},'uplifts':{'of':1},'collie':{'at':1},'pliohippus':{'about':1},'2001':{'the':1},'predestined':{'plan.':1},'puppy':{'came':1},'contemporaries':{'in':1},'fry.':{'sir':1,'j':1,'but':1},'indemnify':{'and':1},'vocabulary':{'so':1},'walk.':{'how':1},'terra':{'firma':3},'gifts':{'as':1},'herbs':{'and':1},'environing':{'difficulties':2},'dives--':{'--carrying':1},'waterhouse':{'hawkins':1},'partitioned':{'box':1},'tricks':{'given':1},'mask':{'their':1,'the':1},'mimic':{'the':1,'is':1},'mass':{'and':3,'condensed':1,'of':20,'is':2,'spinning':1,'333':1,'persisted':1,'in':2,'gave':2},'dislodgment':{'is':1},'original':{'ancestors':1,'form':2,'plain':1,'nebula':1,'crust':1,'moorings':1,'greek':1,'peculiarities':1,'cradle':2,'home':3,'hole':1,'first':1},'external':{'methods':1,'opening':1,'hangers-on':1,'of':1,'partnership':1,'pouch;':1,'registration':1,'gills':2,'pouch':1,'method':1},'period--the':{'twenty':1},'sci':{'.':2},'consider':{'a':1,'what':1,'that':1,'.':1,'possibilities.':1,'the':7,'man':1},'elements.':{'sec':1},'31900':{'4':1},'instincts':{'and':1,'where':1,'are':1,'but':1,'.':2},'landlocked':{'corners':1,'dwindling':1},'debris':{'and':1,'of':1},'upkeep':{'of':1},'welfare':{'of':2},'reasoning':{'that':1,'man':1,'.':1},'causes':{'and':1,'of':1,'sleeping':4,'.':1,'the':1,'an':3},'particles':{'and':2,'move':1,'as':1,'are':4,'suspended':1,'in':2,'250':1,'even':1,'.':3,'which':3,'travelling':2,'was':1,'more':1,'may':1,'upon':1,'he':1,'on':1,'of':17,'will':1,'were':2,'the':2,'or':1},'careful':{'and':1,'comparison':1,'reading':1,'calculation':1,'observers':1,'piecing':1,'experiments':1,'way':1,'education':1},'disciples':{'of':1},'hunting':{'enabling':1,'on':1,'leopards':2,'or':2,'small':1},'spirit':{'of':4,'.':2},'to':{'all':6,'consider':4,'remarkable':1,'land-snails':1,'relieve':1,'yellow':1,'four':2,'mild':1,'skate':1,'go':13,'follow':1,'discern':1,'whose':1,'calculate':2,'animal':1,'paris':1,'shrinkage':1,'send':1,'environment':4,'charge':1,'reptiles':1,'swoop':1,'vegetation.':1,'include':1,'crest':4,'shoot':1,'point':3,'arboreal':2,'dispense':2,'induce':1,'me':2,'smack':1,'every':2,'trough':1,'fall':4,'affect':2,'converge':1,'monkeys':2,'look':6,'exaggerate':1,'tear':1,'try':2,'this':19,'settle':2,'us.':1,'speculation':1,'tortoises':2,'prevent':1,'force':1,'ten':1,'discover':4,'jump':1,'surrounding':1,'pass':7,'link':1,'further':2,'changefulness':1,'folk':1,'paralyse':1,'inspire.':1,'what':5,'giving':1,'disentangle':1,'asia':1,'him.':1,'experiment':4,'new':3,'alertness':1,'elsewhere.':1,'fend':1,'berthelot':1,'slow':2,'sink':1,'making':1,'evolutionist':1,'100':1,'fifteen':1,'interpret':1,'wait':1,'dry':9,'great':4,'receive':2,'30':1,'alaska':1,'anchor':1,'credit':3,'amount':1,'social':1,'climb':1,'otters':1,'changes':1,'say--of':1,'secure':2,'complying':1,'africa':1,'replace':2,'put':3,'decrease':2,'instinct--a':1,'establish':2,'estimate':3,'manipulate':1,'everybody':1,'use':5,'proceed':1,'prove':1,'two':5,'almost':1,'live':4,'doubt':2,'call':2,'strike':3,'survive':2,'themselves':1,'evolve.':1,'tell':4,'more':4,'breathe':5,'substances':1,'expose':1,'impress':1,'about':2,'extinction.':1,'particular':2,'scale.':1,'hold':1,'effort':1,'fly':2,'account':6,'pursue':1,'science':1,'work':2,'pieces--a':1,'reproduce':1,'learn':15,'meet':5,'pick':1,'control':2,'compare':1,'type.':1,'tap':1,'give':17,'sense':1,'accept':2,'pieces':1,'high':1,'his':10,'something':2,'slip':1,'arise':2,'handle':1,'keep':4,'attract':1,'occur':2,'huge':1,'end':2,'sit':1,'provide':3,'travel':10,'1':1,'how':1,'vital':1,'hop':1,'answer':4,'over-population':1,'stir':1,'both.':1,'utilise':5,'sir':2,'lag':1,'eighty':1,'germinal':1,'moult':1,'produce':1,'lighting':1,'lay':2,'date':1,'such':2,'bloom':1,'grow':1,'man':15,'a':76,'attempt':2,'remember':1,'light':5,'spout':1,'element':2,'inquire':4,'maintain':2,'deposit':1,'allow':4,'enter':3,'order':1,'punting':1,'contraction.':1,'help':3,'move':7,'vary':1,'stability':1,'insurgence':1,'its':16,'perfect':1,'26':1,'fit':2,'fix':3,'water-weed':1,'equalise':1,'absence':1,'overcome':1,'them':6,'good':1,'return':5,'greater':1,'introduce':1,'break':3,'mention':1,'conquer':2,'half':1,'accumulate':2,'speculate':2,'realize':1,'maintaining':1,'possess':3,'subtler':1,'form.':1,'evade':2,'condense':2,'vibrations':1,'realise':5,'each':2,'cliffs':1,'side':5,'mean':3,'square':1,'retrieve':2,'mental':2,'generation':2,'recapitulate':1,'tip':2,'expect':2,'measure':3,'our':13,'happen':1,'witness':1,'clothe':1,'depress':1,'profit':2,'open':3,'abide':1,'strangers':1,'sustain':1,'adapt':1,'7':1,'impart':1,'medicine':1,'twenty-five':1,'cause':1,'red':1,'metchnikoff':1,'assist':1,'associate':2,'interpose':1,'given':1,'sneak':2,'reason':1,'base':1,'struggle':1,'ask':2,'obliteration':1,'cough':1,'generate':1,'reflect':1,'prepare':1,'language':1,'david':1,'turn':4,'place':2,'deep-sea':1,'loud':1,'think':12,'south':1,'predominate':1,'feed':3,'striking':1,'feel':3,'one':6,'another':13,'carry':4,'radiate':1,'ring':1,'fiji':1,'172':1,'millions':1,'guess':1,'their':13,'bite':1,'construct':2,'anyone':1,'indicate':2,'master':2,'king-crabs':1,'white':1,'bits':1,'listen':1,'efface':1,'nutrition':1,'hug':1,'x-rays':1,'that':11,'continuous':1,'serve':2,'direct':1,'part':2,'peck':1,'insect-visitors--began':1,'10':1,'require':1,'tree':2,'project':3,'matter':1,'fruits':2,'gigantic':1,'and':6,'exert':1,'modern':1,'say':46,'lull':1,'have':19,'accompany':1,'any':2,'eels':1,'offer':1,'isolate':1,'gravity':1,'note':1,'blushing':1,'build':5,'which':31,'destroy':2,'begin':8,'acquire':1,'electric':1,'trace':2,'wind-blown':1,'reach':7,'complexity.':1,'most':3,'detect':4,'eight':1,'glow':6,'expound':1,'seize':1,'professor':1,'gather':2,'science.':1,'drive':1,'face':3,'furnish':1,'weigh':1,'justify':2,'institutions':1,'incomplete':1,'show':14,'fifty':1,'bring':3,'determine':3,'tree.':1,'melt':1,'earth':2,'find':19,'wriggle':1,'generation.':1,'knowledge':1,'environing':1,'explain':9,'storms':1,'eat':1,'surroundings':1,'betray':1,'darwin':3,'hope':1,'do':17,'waltz':1,'hit':2,'get':17,'beat':1,'express':1,'watch':1,'bear':3,'instinctive':1,'dr':1,'him':3,'comply':1,'reveal':1,'evolution':1,'investigate':1,'release':1,'them.':1,'freshwater':1,'where':2,'respond':1,'traverse':1,'set':1,'resist':1,'see':9,'sea':3,'violet':1,'fail':1,'find.':1,'gravitation':1,'sail':1,'birds':2,'pressures':1,'various':1,'conceptual':1,'donate':2,'glasgow':1,'man.':3,'notice':8,'extend':1,'parental':1,'deliver':1,'succeed':1,'wear':2,'travellers':1,'distinguish':2,'come':3,'improve':1,'both':2,'protect':3,'last':3,'many':2,'contract':1,'laplace':1,'plants':1,'admit':2,'cylindrical':2,'lash':1,'swallow':1,'radio-activity':1,'supply':2,'smother':1,'kin-sympathy':1,'subscribe':1,'pole':2,'air-breathing':3,'250':1,'technicalities':1,'speak':5,'decline':1,'raise':2,'deep':1,'teach':1,'create':2,'three':1,'.':2,'whom':1,'much':1,'change':2,'mars':2,'waste':1,'500':1,'life':2,'describe':3,'flight':1,'amphibians':1,'assert':1,'observe':2,'understand':9,'reason.':1,'an':14,'diffuse':1,'those':6,'sound':1,'adaptations':1,'these':2,'leave':4,'twigs':1,'britain':1,'near':1,'suppose':9,'guide':2,'spawn':4,'apprehend':1,'lapland':1,'it':7,'sting':1,'itself':2,'blame.':1,'everyday':1,'capture':4,'different':1,'develop':1,'perform':1,'suggest':3,'make':23,'cross':1,'unite':1,'check':1,'them--as':1,'split':1,'copying':1,'crustaceans':1,'several':1,'dusk':1,'kelvin':1,'nest':1,'drink':1,'hang':1,'effect':1,'viewing':1,'moving':1,'experiment.':1,'patagonia':1,'expend':1,'in':1,'miss':1,'mother':1,'very':2,'the':388,'left':1,'mingle':1,'being':1,'uranium':1,'accurate':1,'obtain':1,'rest':1,'electrification':1,'select':1,'harmonise':1,'identify':1,'human':2,'colonise':2,'fearful':1,'readers':2,'conclude':1,'deposits':1,'board':1,'snap':1,'save':2,'humanity':1,'scientific':1,'take':11,'swim':1,'read':4,'big':2,'possible':1,'dart':1,'five':1,'know':8,'decipher.':1,'press':1,'immediately':1,'tick':2,'insert':1,'rotate':6,'backboned':1,'electronic':1,'hunt':1,'tons':1,'roll':1,'collect':2,'continue':2,'seashore':1,'soft':1,'herons':1,'side--a':1,'shed':1,'right':1,'deal':8,'titan':1,'some':21,'play':2,'certain':1,'deduce':1,'convey':1,'escape':1,'star':1,'scale':2,'avoid':2,'separate':1,'ether':1,'leap':1,'behave':1,'cloud':1,'quote':1,'prof':1,'warranties':1,'trout':1,'illustrate':2,'be':180,'incandescence':1,'obey':2,'reaching':1,'rock':1,'breed.':1,'utter':1,'become':7,'instinct':3,'littoral':1,'five.':1,'throw':4,'shine':1,'stone':1,'age.':1,'conceal':1,'practical':1,'her':2,'act':2,'or':3,'imitation':1,'within':1,'guard':1,'promise':1,'sow':1,'excrementitious':1,'propel':1,'acquiesce':1,'support':2,'transform':1,'sunlight':2,'start':2,'suit':1,'enregister':3,'attach':1,'manufacture':1,'north':2,'complete':2,'form':13,'educate':1,'ascend':1,'believe':6,'regard':1,'heat':2,'hear':1,'another.':2,'heap':1,'atom':4,'promote':1,'considerable':2,'donate.':1,'count':3,'folk-ways':1,'us':24,'record':1,'convince':1,'grasp':2,'demonstrate':1,'stages':2,'similar':2,'agree':1,'150':3,'cover':3,'year':1,'rubble':1,'muscular':1,'disease':1,'as':1,'exist':4,'paraguay':1,'domesticated':1,'trip':1,'fill':2,'discriminate':5,'inborn':1,'compel':1,'other':8,'5':1,'branch':2,'test':1,'you':5,'shrink':2,'picture':1,'repeat':1,'indemnify':1,'mankind':1,'living':1,'walk.':1,'drift':1,'terra':3,'overtax':1,'recognise':6,'scores':1,'astronomy':1,'land':3,'sail.':1,'cling':2,'assume':1,'age':2,'lift':2,'time':1},'tail':{'and':2,'often':1,'is':1,'it':1,'as':1,'are':1,'in':1,'if':1,'from':1,'seems':1,'two':1,'.':5,'rivals':1,'which':2,';':1,'by':1,'projects':1,'a':1,'always':1,'coiled':1,'of':2,'served':1},'postglacial':{'times.':1},'th':{'.':1},'lankester':{'to':1,'has':1,'says:':1,'between':1},'animals--birds':{'and':1},'degeneration':{'may':1},'case':{'we':2,'better.':1,'although':1,'no':1,'these':1,'of':38,'is':2,'there':1,'it':3,'.':3,'leads':1,'to':1,'that':1,'however':2,'they':1,'in':2,'known':1,'probably':1,'the':2,'with':2,'than':1},'cause.':{'section':1},'cloud-belts':{'and':1},'puzzled':{'over':1,'when':1},'discrepant':{'.':1},'floated':{'on':1},'square-jawed':{'short-limbed':1},'trillions':{'of':9},'c-f.':{'the':1},'interpreting':{'the':1,'in':1},'instinct.':{'the':1},'m.d':{'.':2},'condition':{'of':2,'the':1,'had':1,';':1,'.':1},'s.f.':{'3':1},'accompanying':{'diagram':1},'marvellous':{'still':1,'atom':1},'ageing':{'.':1},'laying':{'down':2,'aside':1},'joined':{'to':1,'them--a':1},'large':{'and':3,'telescope':1,'insects':1,'fish':2,'in':1,'colony':2,'number':6,'bath':1,'brain':1,'as':3,'planets':1,'mirror':2,'skulls':1,'size':2,'rhinoceros':1,'scale':3,'heads':1,'lungs':1,'ventral':1,'masses':1,'proportion':1,'.':2,'terminal':1,'internal':1,'red':2,'we':1,'testes':1,'degree':1,'that':1,'quantities':1,'eggs':1,'ovaries':1,'however':1,'haunt':1,'lens':4,'meteorites':1,'coil':1,'marine':2,'telescopes':1,'areas':1,'a':1,'animals':1,'eye-sockets':1,'gape':2,'ones.':1,'magnet':1,'gibbon':1,'amount':1,'amphibian':1,'of':1,'excesses':1,'ready-made':1,'section':1,'anthropoid':1},'dinosaur':{'about':1,'reptiles.':1,'stock':1},'sand':{'and':3,'of':1,'over':1,'so':1,'.':2},'swirling':{'seething':1},'three-millionth':{'of':2,'part':1},'harry':{'johnston':1},'small':{'and':2,'shark':1,'family':2,'insects':1,'ears':1,'spider':2,'one':1,'bright':1,'spiders':1,'such':1,'globes':1,'intestine':1,'patch':1,'frog-hoppers':1,'creatures':1,'web':1,'compared':1,'group':1,'pin':2,'organisms':1,'water-animals':1,'gossamer':1,'organism':1,'per':1,'.':3,'particles':3,'to':3,'individuals':1,'vocabulary--he':1,'fraction':3,'units':1,'figures':1,';':1,'molecules':1,'coal-field':1,'tortoise-shell':1,'polyps':1,'fry.':1,'ripples':1,'multiple':1,'minority':1,'degree':1,'that':2,'may':1,'mammals':3,'tides':2,'whirling':1,'but':2,'it':1,'lens':1,'moths':1,'scale':2,'fishes':2,'number':1,'importance':1,'quantity':2,'volume':1,'about':1,'animals':4,'pests':1,'bullet':1,'items':1,'batteries':1,'corona':1,'bee':1,'staff.':1,'part':2,'donations':1,'anthropoid':1,'shore-animals':2,'arboreal':1,'sea-anemone-like':2,'marble--there':1,'crab':3,'are':1},'mammal':{'and':1,'essentially':1,'sucks':1,'is':1,'when':1,'mind':1,'s':1,'as':1,'mind.':1,'in':1,'the':1,'stocks':1,'with':1},'autotomy.':{'in':1},'abbreviated':{'recapitulation':1},'quicker':{'than':1},'methodical':{'habits':1},'proof--embryological':{'proof--man':1},'197':{'diagram':1,'000':1},'196':{'the':1},'191':{'hornbill':1,'life-history':1,'avocet':1,'spoonbill':1,'puffin':1,'falcon':1},'hour.':{'these':1,'the':1},'193':{'early':1},'192':{'hind-leg':1,'photo':1},'past':{'and':5,'a':1,'all':1,'generation.':1,'in':1,'century.':1,'ages--for':1,'generation':1,'there':1,'upon':1,'it':1,'amphibians':1,'one':1,'.':3,'at':1,'which':1,'time':1,'the':1,'still':1,';':1,'persisting':1},'displays':{'its':1,'.':1},'pass':{'on':2,'gradually':1,'from':3,'vertically':1,'suddenly':1,'over':1,'amongst':1,'by':1,'to':4,'behind':1,'through':11,'between':1,'along':2,'straight':1,'before':1},'situated':{'near':1,'at':1},'17.--a':{'map':1},'richard':{'owen':1},'clock':{'we':1,'would':1,'.':1,'struck':1,'beating':1,';':1},'section':{'of':2,'later':1,'1':1,'3':2,'2':1,'through':3,'4':2,'5':1},'reproduction':{'a':1,'both':1,'from':1,'for':1,'may':1,'is':2,'.':5,'which':1},'scientists':{'confront':1},'method':{'and':1,'used':1,'that':1,'simple':1,'of':6,'is':2,'exactly':1,'.':1,'namely':1,'much':1,'are':1,'which':1,'you':1,'was':2,'by':2,'if':1},'contrast':{'this':1,'to':3,'with':1,'between':2},'revealing':{'an':2},'full':{'and':1,'on':1,'terms':2,'license':1,'inheritance':1,'of':5,'stop':1,'stop.':1,'project':7,'flood':1,'daylight':1,'individual':1,'fathoms':1,'extent':1,'refund':2,'dawn':1,'resources':1},'escaping':{'pursuit':1},'installations':{'.':1},'argonaut':{'in':1},'leaping':{'a':1,'at':2},'7.--the':{'visible':1},'hours':{'on':1,'we':1,'from':1,'afterwards':1,'immediately':1,'of':1,'after':1,'days':1,'forty':1,'early':1,'to':1,'old':1,'in':1,'it':1,'i.e':1,';':1,'.':4,'until':1,'before':2},'concluding':{'this':1},'november':{'19':2,'6':1},'transformation':{'of':5,'comes':1,'such':1},'refractors':{'and':1,'are':1},'riviera':{';':1},'introductory':{'note':1,'the':1},'compliance':{'with':2,'requirements':1,'for':1,'.':1},'247':{'photo':2},'experience':{'and':2,'or':1,'for':1,'though':1,'of':1,'no':1,'it':1,'but':1,'.':1,'to':1,'nothing':1,'which':2,'in':2,'not':1,'known':1,'with':1,'by':1},'anthropologists':{'and':1},'bulges':{';':1},'periodic':{'shrinkages':1,'the':1,'variations':1,'tax':1},'social':{'group':1,'intercourse':2,'becoming':1,'person.':1,'face':1,'environment':1,'life--of':1,'systems':1,'heritage':2,'institutions--all':1},'action':{'and':2,'on':1,'like':2,'facility':1,'not':1,'of':4,'is':1,'it':1,'.':4,'how':1,'in':1,'following':1,';':1,'by':1},'matter--but':{'no':1},'slope':{'to':1,'from':2,'of':1},'struggle':{'all':1,'through':1,'for':21,'against':2,'out':1},'followed':{'on':1,'rapidly':1,'that':1,'with':1,'in':1,'some':1,'up':1,'without':1,'year':1,'from':1,'the':2,'was':1,'by':2,'roentgen':1},'moorland':{'.':1},'vii':{'the':1,'.':2},'aeschylus':{'gave':1},'hard-and-fast':{'boundary':1,'lines':1},'beheld':{'in':1},'pulls':{'the':2,'every':1},'substance.':{'it':1},'coercion':{'and':1},'nerve-centres':{'keep':1},'eddington':{'even':1,'of':1,'professor':1,'tells':1},'granular':{'appearance':1},'attendance':{'on':1,'fertilises':1},'magnitude--and':{'these':1},'educability.':{'young':1},'petroleum':{'ten':1},'6':{'1914.':1,'and':1,'great':1,'inches':1,'then':1,'.':5,'1919':1,'tadpole':1,'other':1,'the':2},'evolve.':{'viii':1},'more':{'limited':1,'developed':1,'accurate':2,'dynamic':1,'purely':1,'distant':1,'abundant':1,'rapid':4,'rapidly':2,'knowledge':1,'fit':2,'interesting':3,'complex':4,'passive':1,'to':3,'willing':1,'convoluted':1,'portentous':1,'inconspicuous':1,'familiar':1,'courage':1,'nearly':1,'trouble':1,'advanced':1,'debatable':1,'generalised':1,'masters':1,'like':3,'oxygen':1,'marvellous':1,'fully':1,'radiant':1,'loosely':1,'prolonged':1,'possibilities':1,'economically':1,'intelligence':2,'energy':1,'direct':2,'likely':2,'intelligible.':1,'besides.':1,'advantageous':1,'sail':1,'uniform':1,';':2,'numerous':3,'advantageously':1,'we':1,'explosive':1,'intimate':1,'importance':1,'masterful':1,'free':3,'atoms':2,'curved':1,'complicated':5,'besides':4,'flowering':1,'intelligent':1,'intense':1,'promiseful':1,'chapter':1,'about':3,'of':5,'thickly':1,'sensitive':3,'smoke':1,'adapted':1,'or':14,'frequent':1,'and':10,'primitive':2,'powerful':2,'marked':1,'highly':2,'quickly':2,'readily':3,'startling':1,'ancient':1,'illumined':1,'erect':1,'.':4,'wonderful':2,'resolute':1,'dome-like':1,'vigorous':1,'complete':2,'successful':1,'continuous':1,'mentality':1,'conspicuously':1,'but':1,'strenuous':4,'upright':1,'natural':1,'general':1,'than':64,'must':1,'parts':1,'romantic':1,'instructive':1,'grey':1,'discriminating':1,'matter':1,'actively':1,'promising':2,'drops':1,'ascetic':1,'varied.':1,'conjectural':1,'certain':1,'it':1,'comfortable':1,'in':1,'controlled':4,'convenient':1,'emancipated':1,'eloquent':2,'till':1,'vital':2,'gateways':1,'which':1,'so':1,'smell':1,'difficult':3,'clear-cut':1,'felt':1,'convincing':1,'alert':1,'important':3,'blood':1,'nutritive':1,'freely':1,'remote':1,'for':1,'effective':1,'mobile':1,'light':1,'definitely':1,'electrons':3,'wide-awake':1,'the':2,'marsupials':1},'door':{'and':1,'is':1,'two':1,'.':1},'testes':{'.':1},'substances':{'such':1,'or':1,'like':1,'give':1,'this':1,'disintegrate':1,'near':1,'but':1,'coloured':1,'as':1,'therefore':1,'permeating':1,'which':2,'in':1,'become':1,'the':1,'has':1,';':2,'are':5},'inquisitiveness':{'a':1,'and':1},'company':{'as':1,'with':1},'berridge.':{'shoebill':1,'woolly':1,'young':1,'surinam':1,'an':1,'common':1,'harpy-eagle':1,'the':3},'one-sided':{'as':1},'tested':{'for':1,'.':1},'foundations':{'of':4},'stampings':{'.':1},'keeping':{'this':1,'the':3,'his':1},'fatal':{'as':1,'.':1},'science':{'and':1,'lenard':1,'liquefies':1,'vol':3,'is':8,'it':1,'an':1,'produced':1,'as':1,'in':1,'should':1,'for':1,'introduction':1,'.':4,'to':1,'which':1,'surpasses':1,'has':3,'was':1,'naturally':1,'we':1,'after':1,'that':1,'who':1,'but':1,'tries':1,'were':1,'arrived':1,'encourages':1,'must':1,'a':1,'on':1,'this':1,'ever':2,'reads':1,'so':1,'of':5,'the':2,'makes':1},'centrifugal':{'force':1},'agoing.':{'illustration':2},'indicating':{'the':1,'that':1},'evolved':{'a':1,'and':2,'we':1,'from':5,'all':1,'but':1,'one':1,'reptiles':1,'amphibians':1,'hand':1,'in':2,'.':2,'or':1},'learn':{'and':2,'all':1,'more':2,'that':4,'.':1,'to':7,'its':2,'how':3,'the':2,'an':1,'with':1,'by':2,'quite':1,'if':1},'knocked':{'it':1},'lamp-shell':{'lingulella':1,'ligula':1},'male':{'and':2,'parent':1,'with':1,'of':3,'fish':2,'who':2,'or':1,'sea-horse':1,'mounts':1,'s':2,'helps':1,'kurtus':1,';':1,'has':3,'makes':1,'side':1},'plants--romance':{'of':1},'beautiful':{'and':2,'stone':1,'spectacles':1,'zoological':1,'is':2,'object':1,'one':1,'flint-shelled':1,'experiments':4,'green':1,'are':1,'sight':1,'pink-flush':1,'cradle':1,'brine-shrimp':1,'robe':1,'red':1,'opalina':1},'stated':{'that':1},'cosmic':{'dust':2,'rubbish':1},'wave.':{'illustration':1},'brain-mind':{'we':1},'suggestions':{'may':1,'of':2,'have':1},'accept':{'a':1,'the':1,'all':1},'states':{'and':2,'do':1,'we':1,'copyright':1,'of':2,'who':1,'.':3,'to':1,'without':2,'swims':1,'the':1,'where':1,'check':1},'obliquely':{'on':1},'sense':{'separated':1,'a':1,'and':2,'still':1,'of':19,'except':1,'but':1,'one':1,'born':1,'which':1,'in':1,'it':2,'such':1,'the':1,'.':2},'plan.':{'in':1},'dress':{'is':3,'it':1,'that':1},'struck.':{'there':1},'salts':{'of':3,'but':2,'.':2,'to':1,'as':1,'using':1},'axis':{'cylinder':1,'that':1,'of':3,'is':1,'but':1,'.':2,'to':1,'as':1,'at':1,'in':4,'once':3},'huge':{'electric':4,'paw':1,'family.':1,'agglomerations':1,'increase':1,'carcase':1,'crocodilian':1,'cavern':1,'three-horned':1,'extinct':2,'sieve':1,'electronic':1,'infantile':1},'respective':{'bodies':1},'instruments.':{'ii':1,'the':1},'imminent':{'destruction':1},'emancipated':{'more':1,'from':1,'.':1},'fruition':{'of':1},'gannets':{'and':1},'oligocene':{'the':1,'times':1,'period':1,'n':1},'glowing':{'metal':1,'into':1,'gas':1,'gases':4,'coal':1,'mass':2,'in':1,'hydrogen':4,'with':1},'cling':{'to':1,'on':1,'together':3,'firmly':1},'relinquished':{'the':1},'creature':{'and':2,'being':1,'is':3,'fond':1,'as':2,'standing':1,'from':1,'.':4,'to':2,'too':1,'expresses':1,'save':1,'reproduced':1,'eminently':1,'that':2,'with':3,'has':2,'like':1,'retreated':1,'whether':1,'of':2,'sometimes':1,'s':2,'the':1,'profits':1},'rungs':{'of':2},'plant':{'and':2,'we':1,'would':1,'may':1,'of':1,'about':1,'called':2,'as':1,'preparing':1,'or':1},'salt.':{'this':1},'lanky':{'legs':1},'intended':{'to':2},'thickened':{'skin':1},'perrin':{'the':1,'jean':1},'plane':{'of':6,'is':1,'namely':1,'.':1,'near':1,'in':1,'the':1},'waves':{'and':4,'longer':1,'give':1,'is':1,'whatever':1,'see':1,'are':5,'in':4,'279':1,'still':1,'ether':1,'from':1,'breaking':1,'.':9,'1':1,'sparkle':1,'only':1,'too':1,'which':5,';':1,'cause':1,'sent':1,'we':1,'used':1,'that':1,'our':1,'enter':1,'like':1,'five':1,'they':3,'must':1,'carried':1,'are--measuring':1,'light':1,'culminating':1,'transmitted':2,'can':1,'of':11,'the':4,'its':1,'or':1},'mendel':{'.':1},'acquisitions':{'gradually':1,'that':1,'of':3,'as':1,'in':1,'the':2},'resemble':{'a':2,'the':1},'boarders':{'those':1},'register':{'themselves':1,'the':2},'tentacles':{'and':1,'around':1,'some':1,'it':1,'can':1,'radiate':1,'round':1,'minute':1,'are':1},'cases.':{'using':1,'the':1},'fundamental':{'substance':1,'to':1,'nature':1,'importance':1,'instruments':1,'food-supply':1,'bodily':1,'entities--matter':1,'entities':2,'unity':1,'way':2,'existences':2,'facts':1,'impressions':1,'realities':1,'matter':1},'triassic.':{'comparatively':1},'grasshoppers':{'orthoptera':1},'replied':{'is':1},'passages':{'and':1},'barnard':{'yerkes':2},'self-destructively':{'would':1},'incessantly':{'bombarded':1},'reminded':{'that':1,'in':1},'trade':{'from':1},'attitude':{'and':1,'of':1,'as':2,'there':1},'paper':{'on':1,'nautilus':3,'bait':1,'exactly':1,'packet':1,'.':1,'were':1,'in':1,'edition.':1,'lying':1},'signs':{'and':1,'of':1,'printed':1},'looks.':{'illustration':1},'its':{'precise':1,'summer':1,'walking':1,'remarkable':1,'disturbances':1,'constituents':1,'beak':1,'mission':1,'years':1,'four':1,'brain':1,'shape':1,'disc':1,'existence.':1,'victim':2,'skin':2,'existence':1,'partisans':1,'previous':1,'completion':1,'particles':2,'limbs':2,'different-lengthed':1,'outer':1,'thumb':1,'anvil':2,'striking':1,'possessors':1,'young':3,'environment':4,'surroundings':2,'tail':2,'concavity':1,'microscopic':1,'molecules':1,'tail.':1,'gyges':1,'gills':2,'main':1,'position--it':1,'first':1,'giants':1,'breathing':1,'victims':2,'cloud-belts':1,'reptilian':1,'means':1,'far':1,'big':2,'oceans':1,'mouth':2,'young.':1,'germ-cells':1,'encircling':1,'emerald':1,'rotation':1,'far-reaching':1,'wings':4,'retreat':1,'lineage':1,'evolution':1,'name':1,'course':2,'bearings':1,'solution':1,'possibilities':1,'race':2,'activity':1,'soft':1,'lesson.':1,'exquisite':1,'ears':1,'upper':2,'habitat':1,'appearance':1,'energy':3,'fully-formed':1,'back':1,'collaterals':1,'prolonged':1,'opposite':1,'legacy':1,'bare':1,'measurement':1,'home':1,'functioning':1,'mother':3,'best':3,'mottled':1,'cilia':1,'leaf':1,'probable':1,'borrowed':1,'endowment':1,'self-effacement':1,'intimate':1,'definite':2,'frond-like':1,'dormitory':1,'venom':1,'new':1,'peg':1,'hind-legs':2,'speed':1,'body':7,'core':1,'toes':1,'business':1,'leg':1,'strata':1,'atoms':3,'extraordinary':2,'magnetism':1,'salient':1,'formation':1,'egg-cocoons':1,'trunk':1,'early':1,'path':2,'canals':1,'whiteness':1,'evolution.':1,'colours':1,'enormous':1,'shaggy':1,'brilliant':1,'many':2,'leaves':1,'parts':4,'greater':1,'counterpart':1,'wave-length':1,'pattern':1,'nucleus':1,'tongue':2,'whole':2,'relatives.':1,'origin':1,'diameter':1,'primitive':1,'own':18,'heart':1,'marginal':1,'coming':1,'habitual':1,'primary':3,'race.':1,'height':1,'utilisation':1,'date':1,'eggs':2,'brain.':1,'formidable':1,'owner':2,'table':1,'mere':1,'size':3,'wings.':1,'strong':2,'eye':1,'temperature':2,'width':1,'tremendous':1,'own.':1,'two':1,'spiral':1,'long':2,'plains':1,'secret':1,'wonderful':1,'prey':1,'pool':1,'way':5,'typical':1,'diving-bell':1,'legs':1,'voracity':1,'501':1,'interests':1,'mountains':1,'head':1,'stomach':1,'fiery':1,'high-pitched':1,'wits':1,'successful':1,'feathers':1,'great':1,'validity':1,'climax.':1,'neighbour':2,'heat':3,'cranial':1,'tentative':1,'constituent':1,'hole':1,'highest':1,'effort':1,'present':3,'kind':1,'lifetime':1,'skull':2,'characteristic':1,'straight':1,'bill':1,'attached':1,'gravitational':2,'father':1,'nine':1,'vitality.':1,'growing':1,'distribution':2,'millennia':1,'history':1,'predecessor':1,'climax':4,'influence':1,'faintness':1,'surface':7,'general':1,'return':1,'partner':1,'comparative':1,'sharp':1,'mouth.':1,'dress':1,'own--a':1,'swim-bladder':2,'huge':1,'ancestors':1,'stolidity':1,'winter':2,'paw':2,'flight':2,'air-dome':1,'centre.':1,'bell-like':1,'shoulders':1,'forests':1,'reality':1,'arboreal':1,'relatives':1,'strange':1,'sentiments':1,'special':1,'influences':1,'talons':1,'estuaries':1,'mammoth':1,'ordinary':1,'axis':13,'composition':2,'development':1,'immediate':1,'electric':1,'beginnings':1,'centre':4,'neck.':1,'nest':2,'teeth':1,'reach':1,'surface--before':1,'substitute':1,'companion':1,'gill-cavity':1,'dimensions':1,'journey':3,'moving':1,'colouring':1,'saucer-shaped':1,'share':1,'movements':2,'capacity':1,'burrow':2,'structure':1,'eyes':1,'so-called':1,'short':1,'branches':2,'gullet':1,'surprising':1,'revelations':1,'light':3,'colour':5,'starting-point':1,'life':2,'persistent':1,'benefactress':1,'tale':1,'inhabitants':1,'edge':1,'mass':2,'greatest':1,'broad':1,'volunteers':1,'path.':1,'original':3,'immensity':1,'function.':1},'roots':{'and':1,'to':2,'of':2},'imaginings':{'of':1},'rapidly':{'and':4,'on':2,'we':1,'towards':1,'altering':1,'revolving':1,'between':1,'round':1,'to':1,'in':1,'changing':1,'revolved':1,'alter':1},'shifts':{'the':1,'for':4},'man-ape':{'and':1,'to':1},'coarser':{'vibrations':1},'conjugation':{'of':1},'bell-animalcules':{'a':1},'adepts':{'at':1,'in':1},'isaac':{'newton':5},'travelling':{'and':2,'rapidly':1,'faster':1,'at':5,'the':1,'with':1,'round':2},'pinions':{'.':1},'atom--that':{'what':1},'formosa':{'those':1},'tentatively':{'just':1,'sets':1},'lowell':{'evolution':1,'made':2,'who':1,'to':1,'mars':1,'observatory.':1},'entire':{'shell':2,'uselessness':1,'system':1,'absence':1,'cessation':1,'belt':1},'secondarily':{'wingless.':1},'agitated':{'and':2,'communicate':1,';':1,'electrons':1},'saltatory':{'display':1},'iridescent':{'colours':1},'weeds':{'in':1},'speculate':{'where':1,'that':1},'laboratory.':{'a':1,'an':1},'sea-urchins':{'sea-lilies':1,'and':1,'we':1},'cambrian':{'and':1,'period':5,'correspond':1,'to':1,'reached':1,'the':1},'likeness':{'to':2},'fowlers':{'and':1},'all.':{'sec':1},'loosely':{'connected':1,'.':1},'20417.txt':{'or':1},'piping':{'cry':1},'nautiloids':{'and':1,'to':1,'began':1},'found':{'the':2,'is':1,'it':1,'an':1,'at':2,'in':22,'close':1,'next':1,'its':1,'elsewhere':1,'for':1,'their':1,'there':1,'long':1,'well-formed':1,'to':4,'out':1,'vigorous':1,'around':1,'in:':1,'that':11,'far':1,'gliding':1,'however':1,'but':1,'hundreds':1,'most':1,'everywhere':1,'not':1,'along':1,'quite':1,'by':2,'he':1,'a':5,'on':3,'practically':1,'no':1,'up':1,'.':2,'eighty-seven--and':1,'e.g':1},'energetically':{'rub':1,'through':1},'physiologically':{'expensive':1,'best':2,'.':1},'reactions':{'and':2,'to':1,'.':2,'which':1,'between':2},'england':{'and':1,'.':1},'oyster-catcher':{'and':1},'resolute':{'.':1},'fewer':{'and':1,'mistakes':1},'measurement':{'.':1},'blues':{'and':1,'are':1},'niger':{'120':1,'is':1},'really':{'a':1,'radiating':1,'taking':1,'move':1,'had':1,'occurred':1,'two':1,'excessively':1,'tell':1,'are':2,'travelling':1,'gigantic':1,'important':1},'try':{'to':4,'walking':1},'neanderthal':{'and':2,'men':4,'race':2,'ravine':1,'species':2,'man':10},'psychology':{'and':1,'that':1},'sea-meadows':{'and':1,'of':1,'as':1,'to':1},'boxed-in':{'energy':1},'research':{'on':1,'.':2,'as':1,'justified':1,'has':1,'shows':1,'must':1},'misses':{'the':1},'reward.':{'the':1},'kelvin':{'and':2,'who':1,'56':1,'one':1,'s':1,'lord':1},'denoted':{'by':1},'climatic':{'conditions':2},'occurs':{'even':1,'on':2,'about':2,'from':1,'is':1,'in':1,'with':1},'chapelle-aux-saints':{'175':1,'the':1},'belief':{'is':1,'that':2,'in':2},'risen':{'three':1},'drifting':{'past':1,'life':2},'porcelain':{'are':1},'qualify':{'the':1},'gravelly':{'bed':1},'imagine':{'them':1,'that':2,'could':1,'some':1,'how':2,'the':1},'stomach':{'and':1,'to':1},'rises':{'a':1,'to':5,'and':2,'why':1,'.':2},'occur.':{'illustration':1},'producers':{'using':1,'or':1},'albatross':{'and':1,':':2},'reared':{'themselves':1},'retained':{'in':1},'english':{'serial':1,'character':1,'disciples':1},'w':{'.':30},'expedient':{'by':1,'.':1},'mangrove-trees':{'or':1,'.':1},'exhibited':{'by':1,'in':1},'delicate':{'embryo':1,'body':1,'shell':2,'larva':1,'ctenophores':1,'experiment':1,'build':1,'films':1},'impart':{'violent':1},'reversing':{'layer':2},'slipped':{'on':1,'over':1,'from':1},'thereafter':{'perhaps':1},'mimetic':{'resemblance':1},'number':{'and':2,'on':1,'develop':1,'being':1,'of':42,'is':3,'one':1,'she':1,'which':1,'mr':1,'not':1,'.':2},'slipper':{'animalcule':3},'animals--beginnings':{'of':2},'annelids':{'related':1},'star-clouds':{'will':1},'differ':{'considerably':1,'from':1,'chiefly':1,'rather':1,'as':1,'very':1,'only':1,'greatly':1,'in':3},'heads':{'and':1,'the':1,'selected':1,'breaking':1,'it':1},'world...':{'.':1},'introduction':{'of':2,'3':1,'there':1,'every':1},'cradles':{'for':1},'calculations':{'based':1,'show':1},'essays':{'on':1},'molecular':{'motion.':1,'reality':1,'motion':1,'motions.':1,'motions':2,'disintegration':1,'movement':1},'elaboration':{'known':1},'relationship':{'and':1,'with':6,'between':1},'immediate':{'access':2,'surroundings':1,'precursors':2,'cradle':1,'circle':1},'appreciation':{'of':5},'self-mutilation':{'or':1},'zeppelin':{'or':1},'licensed':{'works':1},'calendar-keeping':{'and':1},'modes':{'of':6},'diffusion':{'or':1},'ungrateful':{'to':1},'observatory':{'greenwich.':6,'of':2,'victoria':2,'near':1,'fig':1,'such':1,'the':1,'or':1,'at':1},'vocal':{'and':1,'organs':2,'cords':2,'powers':1},'determined':{'beyond':1,'by':1},'fishermen':{'whom':1},'hot.':{'crossing':1},'algol':{'is':2,'has':1},'remembers':{'that':1},'streamed':{'night':1},'possibilities.':{'illustration':1},'well-developed':{'forehead':1,'head':1,'luminous':1,'form':1},'colour-resemblance':{'was':1},'vitally':{'interlinked':1,'important':1},'germ-cells--the':{'ovum':1},'reorganisation':{'which':1},'cleverness':{'.':1,'it':1,'in':1},'odd':{'cells':1,'which':1},'fashion.':{'finally':1},'internat':{'.':1},'commotion':{'is':1},'silvery':{'jacket':1,'air-bubble--air':1,'smolts':1,'halo':1},'also':{'among':1,'rang':1,'because':1,'followed':1,'unpalatable':1,'land-snails':1,'contribute.':1,'in':5,'it':1,'marked':1,'one':1,'mild':1,'are':1,'pass':1,'seen':1,'visible.':1,'handicapped':1,'opened':1,'for':3,'belong':1,'able':1,'due':1,'anatomical':1,'to':3,'implied':1,'aerates':1,'burrow.':1,'caused':2,'has':1,'more':1,'breathe':1,'be':6,'noteworthy.':1,'towards':1,'that':1,'very':3,'offered':1,'formed':1,'serve':1,'cheaper':1,'react':1,'produce':1,'rudimentary':1,'govern':1,'known':1,'necessary':1,'the':8,'proceed':1,'a':3,'on':1,'arranged':1,'driving':1,'showed':1,'receive':1,'of':3,'drop':1,'will':1,'defective':1,'became':1,'involved':1,'found':1,'enacted':1,'changes':1,'experimental':1,'something':1},'internal':{'surfaces':4,'partnership':1,'furnishings':1,'revenue':1,'tides':1,'adjustments':1,'as':1,'surface':1,'parasites':1,'source':1,'heat':3,'secretions':1,'game':2,'atomic':1,'secretion':1,'experimenting':1,'gills':1,'structure':2,'unpaying':1},'centrosomes':{'one':1},'seized':{'the':1,'by':2},'play':{'a':2,'among':1,'we':1,'for':1,'of':3,'is':2,'an':2},'index':{'of':1},'swiftly':{'gliding':1,'electrons':1},'nasal':{'bones':1},'complexity.':{'corpuscles':1},'virus':{'or':1},'plan':{'.':1},'accepting':{'unsolicited':1,'it':1},'colliding':{'and':1,'of':1},'head-end':{'remains':1},'demand':{'a':2,'which':1},'galway':{'that':1},'whalebone':{'whales':2,'plates':2},'lessons':{'both':1,'for':1,'of':1,'began':1,'had':1,'learned':1},'long-headed':{'square-jawed':1},'sometimes':{'work':1,'almost':1,'hard':1,'marked':1,'one':1,'niggardly':1,'as':1,'manages':1,'at':1,'have':1,'seen':1,'sought':1,'slumped':1,'happens':2,'to':4,'leading':1,'make':1,'there':1,'justifies':1,'few':1,'only':1,'much':1,'helps':1,'replaced':1,'several':1,'thousands':1,'difficult':1,'swim':1,'alongside':1,'far':1,'however':1,'but':1,'sooner':1,'they':1,'competitive':1,'an':1,'a':2,'many':1,'no':1,'constitutional':1,'used':2,'deposit':1,'found':1,'the':4},'cover':{'the':2,'itself':1,'in':1,'an':1},'firma':{'and':2,'also':1},'artistic':{'race':2,'drawings':1,'sense':1},'donkeys':{'.':1},'attacking':{'a':2},'hydatina--has':{'nine':1},'far-flung':{'fire-mists':1},'golf':{'ball':2},'hoar-frost':{'or':1},'gold':{'constituted':1,'leaf':2,'is':2,'.':1,'will':1,'to':1,'in':1,'has':1,'into':1},'evaporation':{'and':1},'agassiz':{'once':1},'fatal.':{'it':1},'pill-like':{'ball':1},'hinkins':{'son.':2},'impact':{'of':2},'ape-man':{'reconstructed':1,'to':1,'as':2,'and':1},'food-signal':{'.':1},'spineless':{'cactus':1},'writes':{':':1,'so':1},'fauna--the':{'two':1},'failed':{'.':1},'life--of':{'which':1},'factor':{'which':1,'that':1},'indifference':{'to':1,'that':1},'armour':{'of':1,'or':1},'giants':{'and':2,'over':1},'noctiluca':{'whose':1,'which':1},'sand-pit':{'at':2,'must':1},'dependent':{'on':6},'liquid':{'and':1,'we':1,'when':1,'air':3,'can':1,'cling':1,';':1,'the':1,'.':3,'or':2},'adventurers':{'all':1},'flowing':{'of':1,'through':1,'out':2},'sunny':{'side':1,'bank':1},'clavius':{'the':1},'oceans.':{'they':1},'closely':{'comparable':2,'investigated':1,'corresponding':1,'resemble':1,'interwoven':1,'wrapped':2,'to':2,'resembling':1,'similar':2},'compass':{'and':1,'there':1,'possible':1},'man-of-war':{'there':1,'119':1},'4230':{'2':1},'enemy':{'home.':1},'devoured':{'by':1,'.':1},'avocet':{'s':2},'progressive':{'evolution':1,'mammals':1,'conquest':2,'mammals.':1,'.':1,'simian':1},'paddling':{'with':1,'in':1},'body.':{'this':1,'what':2,'illustration':1,'if':1},'sojourn':{'.':1},'surrendering':{'the':1},'croatia':{'and':1},'liver-fluke':{'of':1},'obscure':{'the':1,'but':2},'river':{'and':2,'heads':1,'.':3,'in':1,'the':1,'or':2},'approaching':{'the':1},'bulky':{'fuel':1},'body':{'and':14,'equally':1,'up':1,'acquired':1,'is':14,'thus':1,'one':1,'as':3,'at':1,'during':2,'in':1,'into':1,'if':1,'again':1,'containing':1,'or':2,'from':2,'possible.':1,'that':2,'decreases':1,'.':15,'to':6,'which':3,'engulfing':1,'before':1,'was':1,'until':1,'shows':1,'locate':1,'do':1,'though':1,'may':2,'becomes':1,'breaks':1,'of':11,'but':4,'were':1,'such':1,'with':2,'by':3,'sways':1,'on':1,'has':2,'always':2,'might':2,'could':2,'say':1,'worth':1,'will':1,'so':3,'overcharged':1,'keeps':1,'far':1,'the':1,'clearness':1,'called':1,'elongated':1,'are':2},'delicately':{'and':2,'built':2},'set':{'off':1,'encoding':1,'of':5,'up':4,'free':3,'electrons':1,'in':6,'forth':8,'apart':1},'ferments':{'.':1},'temperatures.':{'but':1},'enabled':{'to':3,'physicists':1,'us':1},'vertebrates':{'are':1,'or':1,'arose':1,'except':1},'sex':{'another':1,'for':1,'often':1},'see':{'among':1,'right':1,'reference':1,'is':1,'in':7,'it':1,'billions':1,'at':2,'signs':1,'our':1,'.':1,'theoretically':1,'if':1,'again':1,'what':5,'for':1,'explain':1,'that':12,'when':1,'next':1,'how':3,'much':1,'fig':1,'evidences':1,'sections':1,'into':1,'life':1,'means':1,'edge-on':1,'photograph':1,'diagram':1,'them':1,'violet.':1,'now':1,'a':8,'on':2,'evolution':1,'this':2,'later':1,'us':1,'whether':1,'paragraph':2,'so':1,'these':1,'the':7},'sec':{'.':77},'migration':{'and':1,';':1,'or':1,'up':1,'in':2},'sea':{'and':15,'cambridge':1,'salt':1,'is':2,'it':1,'117':1,'including':1,'are':3,'in':3,'.':13,'by':1,'stood':1,'for':2,'pelagic':1,'there':2,'shore':1,'should':1,'to':3,'2':1,'too':1,'has':1,'was':1,'we':1,'that':1,'very':1,'but':2,'others':1,'128':1,'rises':1,'desert':1,'a':2,'especially':1,'of':2,'as':2,'while':1,'gathers':1,'does':1,'usually':1,'the':9,'where':1,'or':2},'aberdeen':{'with':1},'outward':{'behaviour':1,'from':1,'by':1},'shower':{'of':3},'eminently':{'educable.':1,'educable':1},'foraminifer':{'polystomella':2},'taming':{'of':1},'jewels.':{'there':1},'dilutes':{'as':1},'exudation':{'of':1},'endure':{'the':1},'europe':{'a':1,'from':2,'for':1,'.':2,'so':1,'have':1,'were':1,'such':1,'slopes':1,'was':2,'or':1},'jaws.':{'power':1},'eustachian':{'tube':2},'incident':{'is':1},'mingling':{'of':1,'with':1},'things--that':{'fits':1},'energy--may':{'appear':1},'prospects':{'of':1},'lingulella':{'of':1},'improved':{'nervous':1,'habits':1,'by':1},'barely':{'separated':1},'harpy':{'occurs':1},'possible.':{'the':3,'for':1,'illustration':1},'connection':{'with':12,'however':1,'between':2},'amoeba':{'pelomyxa':1,'is':1,'61':1,'greatly':1,'overtakes':1,'pursues':1},'lash':{'large':1,'or':1},'everything.':{'sheer':1},'whole':{'prospect':1,'solar':1,'follows':1,'series':1,'is':1,'creation':1,'it':3,'earth':6,'floating':1,'civilisation':1,'declined':1,'physical':1,'stretch':1,'integrative':1,'to':1,'of':4,'world.':1,'body':1,'we':1,'universe.':1,'originated':1,'sufficient':1,'material':2,'but':1,'grilse':1,'somewhat':1,'world':3,'structure':1,'simpler':1,'a':1,'progressive':1,'bubble':1,'thing':1,'truth':1,'universe':3,'the':1,'extent':1,'or':1,'history':2},'1919':{'to':1,':':1,'.':1,'one':1},'loaf':{'taken':1},'volcanic':{'material':1,'ash':1,'gases':1,'activity':1},'bell':{'be':1,'becomes':1,'is':1,'however':1,'at':1,'which':1,'the':1,'its':1},'etre':{'of':1},'seems':{'a':1,'little':1,'transitional':1,'that':8,'almost':1,'certain':1,'clear':1,'no':2,'possible':1,'an':1,'to':19,'so':1,'at':1,'permissible':1,'of':1,'not':1,'impossible':1,'highly':1,'far':1},'acted':{'on':1},'corresponds':{'to':5,'with':1},'race.':{'the':1},'hollow':{'caves':1,'flattened':1},'unicellular':{'and':1,'protozoa':1,'plants':1,'algae':2},'agents':{'and':1},'adaptation':{'of':2,'to':5,'.':1},'church':{'pictures':1,'is':1,'there':1},'sees':{'and':1},'reflective--which':{'is':1},'belt':{'of':1,'the':1},'moon--the':{'mountains':1,'earth':1},'publishing':{'co':2},'originators':{'of':3},'lizards':{'and':2,'paddling':1,'the':1,'turtles':1},'acceptance':{'.':1},'clay.':{'the':1},'intricacies':{'of':1},'extravagant':{'in':1},'scions':{'of':1},'extreme':{'changes':1,'is':2,'end':1,'cold--an':1,'rarity':1},'firm':{'of':1,'fulcrum':1,'basis':1},'resting':{'on':2,'or':1,'during':1},'pliocene':{'and':1,'that':1,'period':1,'.':1,'as':1,'were':1,'before':1,'n':1,'or':1,'times':1},'squirrel':{'and':2,'making':1,'is':2,'with':1},'high-pitched':{'voice':1},'fire':{'a':1,'on':1,'and':1,'for':2,'is':1,'but':1,'as':1,'which':1,';':2,'until':1},'amphibians':{'and':4,'frogs':1,'some':1,'known':1,'as':1,'before':1,'sprang':2,'fed':1,'from':1,'for':1,'had':1,'.':4,'which':1,'was':1,'we':1,'towards':1,'led':1,'that':1,'burrowing':1,'altogether':1,'fishes':1,'with':3,'by':1,'retained':1,'implied':1,'were':1,'called':1},'fritz':{'mueller':1},'races':{'brethren':1,'and':1,'to-day':1,'of':6,'than':1,'met':1,'as':1,'--which':1,'go':1,'the':1,'or':2,'must':1},'representative':{'and':1,'of':6,'fauna':1,'illustrations':1,'--from':1},'formless':{'gaseous':1},'sixes':{'fives':1},'handling':{'organ':1},'uncertain':{'.':2,'some':1,'but':1,'ground':1},'7700':{'0':1},'reliable':{'a':1,'calculations':1},'admire':{'in':1},'receive':{'specific':1,'a':1,'the':3,'from':1,'them':1},'formats':{'will':1,'readable':1},'amniota':{'in':1},'projecting':{'filaments':1,'upper':1,'wire':1},'robin':{'redbreast':1},'secluded':{'retreat.':1},'pound':{'of':5,'to':1},'jettisons':{'the':1},'agitation':{'of':1},'moth':{'emerges':1,'emerging':1,'e.g':1,'is':1,'should':1,'76':1,'are':1,'the':1,'has':2,'settled':1,'automatically':1},'von':{'indetal':1},'owen':{'said':1},'binding':{'the':1},'level.':{'yet':1},'36':{'seconds':1,'photo':1},'feather-wing':{'a':1},'cerebrum':{'the':1},'owes':{'much':1},'beautifully':{'worked':1,'modified':2},'vanish':{'.':1},'acquires':{'a':1},'greenwich.':{'comet':1,'the':1,'fig':3,'typical':1},'processes--':{'1':1},'cyclostomes':{'such':1},'shorten':{'and':1},'beune':{'throughout':1,'179':1},'shorter':{'and':4,'the':1,'in':1,'period--its':1,'waves':3},'read':{'partly':1,'that':2,'these':1,'it':1,'this':1,'understand':1,'the':3,'by':1},'pecking':{'scratching':1},'serum':{'of':1},'survey':{'of':4,'the':1},'specimen':{'of':3},'knitting':{'needle':1},'snail':{'chopped':1,'and':2,'is':1,'s':2},'comprehensive':{'articles':1},'blue-greens':{'harmonise':1},'alert':{'very':1,';':1,'than':1},'viewing':{'displaying':1},'levels':{'.':2,'in':1},'leaps':{'violently':1,'along':1,'from':2,'through':1},'necessity':{'and':1,'has':1,'for':2},'mussel':{'cannot':1,'.':2},'recent':{'observation':1,'advances':2,'study':1,'eclipse':1,'discovery':1,'british':1,'times':3,'discoveries':3,';':1,'years':5,'research':2,'achievement':1,'view':1},'race-continuing':{'adaptations':1},'expend':{'this':1,'considerable':1},'inches.':{'i':1,'illustration':1},'food-plant':{'to':1,'in':1},'concrete':{'suggestions':1,'mental':1},'regulating':{'and':1,'charities':1},'qualities--notably':{'health':1},'ltd.':{'a':1,'electric':1,'this':1,'professor':1,'charles':1,'an':1,'rotating':1,'the':3},'crayfish':{'and':1},'body-building':{'by':1},'woodward':{'s':1},'abbreviation':{'the':1},'hercules':{'a':1,'108':1,'37':1},'spinners':{'let':1},'plant-like':{'animal':2},'tribe.':{'keen':1},'readers':{'who':1,'wishing':1},'recommended':{'to':1},'making.':{'but':1},'resemblances':{'to':1},'causing':{'an':1},'parents':{'and':2,'bring':1,'thrusting':2,'in':1},'types--':{'lost':1},'physics--the':{'wonders':1},'sojourning':{'for':1},'surprised':{'by':1},'putnam':{'s':2},'provisional.':{'illustration':1},'clutches':{'.':1},'victims':{'such':1,'or':1},'demands':{'.':1,'general':1},'couple':{'of':1},'wives':{'are':1},'stockholm.':{'a':1,'wing':1},'suffering':{'from':1},'sea-lettuce':{'or':1},'shading':{'off':1},'emergence':{'of':11},'projects':{'freely':1,'from':1},'heightened':{'.':1},'sorting':{'out':2},'imposed':{'by':1},'dislodged':{'sea-anemone':1},'hue.':{'there':1},'aridity':{'set':1,'led':1},'sulphite':{'screen':1},'communications':{'in':1},'well-poised':{'head':1},'continue':{'consistently':1,'on':1,'its':2,'to':5},'spiny':{'ant-eaters':1},'exquisitely':{'beautiful':1},'tribes':{'of':1},'horsetails':{'which':1},'disorder':{'and':1,'of':1},'interbreeding':{'of':1,'.':1},'irresistibly':{'suggests':1},'methods':{'and':1,'we':1,'used':1,'like':1,'that':1,'of':10,'is':1,'it':1,'.':3,'to':1,'have':1,'really':1},'spring':{'and':2,'wheat':2,'of':1,'tides':2,'tide':2,'flower-perfumed':1,'out':1},'leptocephali':{'a':1},'obscure.':{'seasonal':1,'when':1,'illustration':1,'hunger':1},'mighty':{'theory':1,'swarms':1,'globe':1,'dead':1,'swarm':1,'flame':1,'animal':1,'shadow':1},'sight':{'and':2,'this':1,'of':1,'who':1,'.':2,'in':2,'not':1,'hearing':1,'more':2},'steam-engine':{'.':1},'curious':{'about':1,'organ':1,'sideways':2,'is':1,'blood-containing':1,'thing':1},'battalion':{'of':1},'committing':{'ourselves':1},'gill-clefts--':{'a':1},'stamens':{'kneads':1,'holding':1},'measurements':{'1':1,'at':1,'which':1,'.':1},'behave':{'as':2,'like':1},'newcomb':{'popular':1,'is':1,'the':1},'dating':{'from':1},'lowell.':{'the':1},'answers.':{'the':1},'inclination':{'to':1},'be':{'invariable':1,'splitting':1,'founded':1,'sunk':1,'spaced':1,'reshufflings':1,'poorly':1,'compact':1,'to':2,'fatal':1,'separated.':1,'brown':1,'counted.':2,'radio-active':1,'exact':1,'transformed.':1,'illustrated':1,'perceived':2,'dealt':4,'small':1,'ultra-violet':1,'noted':4,'ten':1,'invaded':1,'dried':1,'picked':2,'further':1,'estimated':1,'expressive':1,'even':2,'giving':1,'beaten':1,'liberated':1,'prejudicially':1,'learned':2,'told':2,'met':1,'active':1,'implicit':1,'obtained':1,'great':1,'broken':4,'involved':1,'accomplished':1,'periodic':1,'settled':1,'composed':1,'named':1,'followed':2,'explained':3,'visible':4,'readily':2,'fed':1,'working':1,'positive':1,'wiped':1,'two':2,'therefore':1,'taken':4,'more':6,'inclined':1,'suffused':1,'known':1,'producing':1,'modified':1,'evolved':1,'following':1,'cited':1,'something':1,'allowed':1,'terrestrial':1,'influenced':1,'white-hot.':1,'unavailable.':1,'six':1,'1':1,'located':1,'called--it':1,'fostered':1,'undergoing':1,'reconciled':1,'earlier':1,'wrong':1,'understanded':1,'waves':1,'a':27,'overtaken':1,'light':1,'rather':1,'so':2,'pulled':1,'counted':2,'over':1,'interpreted':1,'produced':2,'still':2,'negotiated':1,'actually':1,'better':1,'permanent':1,'overcome':1,'affected':1,'easily':2,'indivisible.':1,'always':1,'identified':1,'applied':1,'found':11,'physiologically':1,'suspended':1,'investigated':1,'our':2,'avoided':1,'borne':1,'shown':3,'washed':1,'hastily':1,'content':2,'laid':1,'believed.':1,'given':1,'completely':1,'put':3,'universally':1,'enormous':1,'created':4,'blown':1,'omitted':2,'one':4,'done':2,'adopted':1,'directly':1,'impossible':2,'earthworms':1,'little':2,'approximately':1,'too':7,'final':1,'discovered':2,'that':11,'released':1,'somewhat':1,'eliminated':2,'convinced':1,'ungrateful':1,'frankly':1,'splendidly':1,'determined':1,'supposed':1,'17-1':1,'and':1,'lightly':1,'well':1,'confessed':1,'turned':2,'buried':1,'seen':22,'clearly':2,'built':1,'thoroughly':1,'able':5,'lit':1,'absorbed':1,'green':1,'sure':2,'clearer':1,'paid':1,'said':19,'nothing':1,'measured':2,'considered':4,'calculated':1,'sometimes':1,'inferred':1,'looked':1,'accounted':2,'left':3,'shot':1,'supported':1,'fifty':1,'rotating':1,'carefully':1,'enormously':1,'slow':2,'based':1,'going':1,'judged':2,'credulous':1,'employed':1,'guarded':1,'exceptional':1,'between':2,'liable':1,'nibbled':1,'delicately':1,'set':1,'swept':1,'seas':1,'observed':2,'luminous':2,'best':1,'subject':1,'invoked':1,'halved':1,'enough':1,'unable':1,'allotted':1,'drawn':3,'profitable':1,'we':1,'renamed.':1,'however':2,'clues':1,'improved':1,'many':1,'called':14,'plants':1,'conquered':1,'adapted':1,'asked':3,'otherwise':1,'regulated':1,'deflected':1,'associated':4,'unearthed':1,'destroyed':2,'described':6,'three':2,'quickly':1,'recognised':2,'expected':1,'copied':1,'life':3,'robbed':1,'sufficient':1,'gas':1,'worked':1,'present':1,'inconspicuous':1,'sound':1,'abandoned':2,'freely':2,'almost':1,'violently':1,'thus':1,'helped':1,'examined':2,'in':8,'reminded':1,'linked':1,'stimulated':2,'patient':1,'split':2,'agitated':1,'several':3,'difficult':1,'used':5,'upon':1,'compared':2,'arrived':1,'prophesied':1,'circumvented':1,'kept':1,'older':1,'changes':1,'constitutional':1,'thought':3,'very':11,'the':11,'realised':1,'departed':1,'less':1,'stored':1,'handed':1,'useful':4,'recapitulated':1,'rapid':1,'regarded':7,'lured':1,'transformed':2,'easy':1,'engulfed':1,'increased':1,'read':1,'dissected':1,'required.':1,'dark':1,'accepted':2,'advanced':1,'necessary':1,'like':4,'admitted':5,'either':1,'translated':3,'simply':1,'reduced':1,'right':1,'often':1,'exposed':1,'some':2,'understood':2,'curious':1,'dissociated':1,'gradually':1,'expressing':1,'eating':1,'bold':1,'remembered':4,'analysed':1,'precious.':1,'accompanied':1,'about':2,'cautious':1,'carried':1,'getting':1,'entailed':1,'of':6,'discussed':2,'urged':1,'avoided.':1,'within':1,'bound':2,'due':1,'.':4,'mere':1,'indispensable':1,'there':1,'noticed':3,'much':2,'infected':1,':':1,'forming':1,'satisfactorily':1,'removed':1,'true':4,'made':11,'arranged':1,'embedded':1,'placed':3,'below':1,'converted':2,'mature':1,'pumped':1,'clear':1,'darker':1,'proud':1,'proved':1,'moved':1,'slowing':1,'an':5,'as':5,'at':2,'constructed':1,'effected':1,'beyond':1,'inborn':1,'no':15,'discerned':1,'when':1,'dimmed':1,'other':1,'transported':1,'included':1,'fastened':1,'utilised':2,'doubted':1,'far':1},'paloloworm':{'of':1},'obscures':{'them':1},'agreement':{'and':2,'disclaim':1,'by':1,'for':2,'shall':2,'amongst':1,'.':3,'will':1,'you':3,'the':1,'with':1,'violates':1,'nor':1,'before':1},'departures':{'among':1,'from':2,'of':2,'or':2,'behaviour-variations':1,'they':1,'in':2,'occur':1},'1919.':{'taken':1},'method.':{'illustration':1},'tidal':{'action':1,'energy':1,'river':1,'theory':1,'waves':1},'-273':{'deg':1},'by':{'saying':1,'all':4,'endeavour':2,'less':1,'being':3,'gradual':1,'both':1,'seizing':1,'worms':1,'rest':1,'rotating':1,'experiments':1,'animals':1,'ice':1,'human':1,'disadvantageous':1,'glue-like':1,'budding':3,'abundant':1,'its':4,'pterodactyls':1,'homology':2,'limbs':1,'dividing':2,'consistently':1,'dubois':1,'glowing':1,'passage':2,'coaxing':1,'insects':2,'other':2,'reptiles':1,'helmholtz':1,'hideous':1,'meadows':1,'it.':1,'division':1,'them':1,'someone':1,'influences':1,'means':18,'food':1,'overflows':1,'dr.':1,'permission':20,'cutting':1,'friction':1,'prof':5,'instinctive':1,'dr':4,'day':4,'association':1,'viscid':2,'moist':1,'name':1,'profound':1,'h':1,'bay':1,'involution':1,'surrendering':1,'vibrations':2,'ductless':1,'bats':1,'mr':3,'automatic':1,'legions':1,'liberating':1,'immigrants':1,'ferments':1,'burying':1,'intelligence':1,'radium':1,'some':7,'rivers':1,'crows':1,'full':1,'sight':1,'defences':1,'our':5,'civilisation':1,'tracheate':1,'intercrossing':1,'even':1,'what':2,'still':1,'superposing':1,'ejecting':2,'driving':1,'deliberate':1,'memories':1,'circulating':1,'representatives':1,'artificial':1,'birds':2,'e-mail':1,'acting':1,'experiment':2,'various':3,'vascular':1,'out-side':1,'new':1,'falling':2,'reading':2,'numerous':2,'u.s':1,'contrast':1,'columbus':1,'blowing':1,'scientific':1,'cellulose':1,'nature':2,'men':2,'water':1,'pressure':1,'experimenting':2,'threads':1,'others':3,'holding':1,'hiding':1,'comparison':1,'great':1,'accident':1,'your':1,'g':1,'freely':1,'ribs':1,'larger':1,'lichens':1,'experience':8,'plunging':1,'periodic':1,'radiation':1,'social':1,'passing':3,'changes':1,'frequent':1,'this':3,'discharging':1,'volcanic':1,'gas-bubbles':1,'burning':1,'striking':1,'suddenly':1,'churning':1,'powerful':1,'one':2,'spinning':1,'very':1,'air-breathing':1,'incandescent':1,'motor':1,'such':3,'collisions':1,'shortening':1,'revolutionising':1,'relapses':1,'squirting':1,'considering':1,'accumulating':1,'to':1,'taking':1,'people':1,'two':3,'.':1,'their':6,'cooling':1,'physicists':1,'calculations':1,'which':13,'dalton':1,'themselves':1,'variational':1,'reflex':1,'more':1,'introducing':1,'endeavour.':1,'that':2,'fire':1,'frost':1,'amphibians':1,'jellyfishes':1,'heat':2,'carrying':1,'blood.':1,'domestication.':1,'careful':1,'travelling':1,'those':1,'plants':2,'keeping':1,'migrants':1,'applying':1,'understanding.':1,'contracting':1,'solid':1,'thousands':1,'severe':1,'air-tubes':1,'air':2,'gills':2,'many':6,'growing':1,'making':2,'providing':1,'laplace':1,'clock-work':1,'imitation':1,'and':4,'firing':1,'roentgen.':1,'biologists':1,'almost':1,'j':19,'it':1,'an':6,'collision':1,'pressing':1,'grazing':1,'numbers':1,'planets':1,'sense':1,'anything':1,'any':2,'increased':1,'terrestrial':1,'sir':2,'different':2,'beginning.':1,'no':1,'studying':1,'tucking':1,'sending':1,'uranium':1,'ideas':4,'astronomers':1,'brian':2,'mr.':1,'strange':1,'geographical':1,'peoples':1,'over-population':1,'absorbing':1,'smell':2,'continuous':1,'accidental':1,'students':1,'amphibians.':1,'hand':1,'watching':1,'chance':3,'gravitation':1,'moving':1,'kin':1,'coercion':1,'successive':2,'fishes':1,'changing':1,'causing':1,'inconceivable':1,'moons':1,'man':4,'a':57,'night':3,'using':4,'fully':1,'pithecanthropus':1,'professor':7,'circumventing':1,'itself':3,'hungry':1,'sudden':1,'these':1,'peculiarities':1,'big-brained':1,'far':1,'fresh':1,'the':161,'starting':1,'drawing':1,'contingents':1},'analysing':{'light':4,'portion':1},'evolved--destined':{'in':1},'anything':{'and':1,'for':1,'was':1,'wot':1,'into':1,'else':1,'the':1,'with':1},'modernity':{'in':1},'nautilus':{'a':1,'nautilus':1,'pompilius':1,'is':1,'it':1,'186':3,'argonauta':2,'the':1,'hardly':1,'or':1,'are':1},'ear-bones':{'of':1},'deserves':{'to':1},'hatched':{'larvae':1,'salmon':1,'.':1,'bird':2,'in':1,';':1,'the':1},'repair':{';':1,'change':1},'into':{'flippers':2,'gold':1,'being':1,'ocean-troughs':1,'existence':1,'its':10,'masses':1,'lake':1,'forms':1,'internal':1,'combination-boxes':1,'sound':1,'his':1,'very':2,'dark':1,'boxes':1,'every':2,'shreds.':1,'this':2,'glass-eels':1,'activity':2,'freshwater':1,'unit-bodies':1,'reactions':1,'smaller':1,'radium':1,'some':2,'zones':1,'our':1,'canada':1,'organisms':1,'space':4,'definite':1,'safety':1,'new':2,'fragments':1,'red':1,'power':1,'water':1,'active':2,'simpler':1,'about':1,'many':1,'mutually':1,'connection':1,'one':4,'puzzle-boxes':1,'another':1,'thick':1,'little':1,'man--the':1,'distinct':1,'two':11,'their':3,'stars':1,'white':1,'energy':2,'empty':1,'continents':1,'account.':1,'heat':1,'races':1,'pieces':1,'plants':1,'these':1,'work':1,'britain':1,'this.':1,'matter':1,'gigantic':1,'something':3,'gas.':1,'it':5,'deep':1,'an':3,'as':1,'itself':1,'eras':1,'close':2,'mountain':1,'different':1,'things':1,'unity':1,'vital':1,'electrical':1,'which':2,'emphatic':1,'independent':1,'effect':1,'waves':1,'dust':1,'such':1,'extremely':1,'man':1,'a':24,'varieties':1,'electrons':1,'the':45},'encasements':{'with':1},'appropriate':{'action':1,'trigger-pulling':1,'trigger':1,'conditions':1,'one':1},'chalk-forming':{'animals':3,'foraminifera':1},'primarily':{'restricted':1},'repaid':{'when':1},'harnessed':{'electricity':1},'claspers':{'and':1},'spending':{'our':1},'gases':{'on':1,'from':1,'exposed':1,'of':1,'is':2,'in':1,'.':3,'spread':1,'can':1,'which':1,'between':1,'with':1,'into':1},'thirdly':{'every':1,'when':1},'double-armed':{'spiral':1},'burrow.':{'evolution':1},'suit':{'and':2,'of':2,'various':1},':':{'seasonal':1,'summer':1,'all':1,'skeleton':1,'photo':80,'magnetic':1,'rotating':2,'rischgitz':6,'disintegration':1,'its':1,'before':1,'death':1,'baron':1,'royal':8,'hermit-crab':1,'to':1,'only':1,'fig':11,'stephen':2,'darwin':1,'dead-leaf':1,'protective':2,'wave':1,'early':1,'falcon':1,'silk':1,'minute':1,'james':7,'cagcombe':2,'vortex':1,'h':6,'side-view':1,'greenland':1,'life-history':1,'national':2,'spoonbill':1,'yerkes':3,'astrophysical':2,'jupiter':1,'are':1,'leadbeater.':2,'conjectures':1,'what':2,'paintings':1,'ten-armed':1,'new':10,'discovery':2,'volvox':1,'variability':1,'we':3,'full':1,'reproduced':11,'underwood':2,'harvard':4,'ernest':2,'by':1,'suggested':1,'c':2,'improved':1,'g':6,'o':2,'whence':1,'pictorial':1,'hence':1,'origin':1,'pelican':1,'elliot':1,'surinam':1,'lafayette.':1,'proterospongia':1,'throughout':1,'from':13,'there':1,'imperial':4,'storm':1,'inclined':1,'flinty':1,'albatross':1,'photos':2,'true':1,'photograph':3,'avocet':1,'f':2,'this':1,'science':1,'mount':8,'j':24,'will':1,'w':22,'reproduction':1,'gambier':6,'making':1,'male':1,'laplace':1,'http:':1,'and':1,'nautilus':1,'is':1,'modern':1,'thus':1,'it':2,'surface':1,'an':5,'arrangements':1,'niagara':1,'british':12,'in':1,'woodpecker':1,'ascii':1,'if':1,'dying':1,'january':1,'six':1,'when':1,'puffin':1,'1':4,'how':2,'rischgitz.':2,'lafayette':1,'elliott':3,'lick':4,'hornbill':1,'electric':1,'okapi':1,'after':6,'diagram':5,'genealogical':1,'restoration':2,'such':1,'inconceivable':1,'man':1,'a':28,'natural':2,'for':2,'whenever':1,'light':1,'professor':3,'daily':2,'electrons':1,'english':1,'the':38,'egg':1,'wing':1},'opens':{'and':1,'many':1,'with':1,'up':1},'considerably':{'in':1,'less':1},'excavating':{'a':2},'elsewhere':{'as':1,'.':1,'in':1,'e.g':1},'inches':{'high':1,'square':2,'off':1,'of':1,'away':2,'long':5,'one':1,'shorter':1,'to':1,'below':1,'long.':1,'in':7,';':1,'per':1},'vicissitudes.':{'the':1},'slums':{'in':1},'moon--meteors':{'and':1},'archaic':{'mammals':1,'animal':1},'link':{'lives':1},'pacific':{'and':1,'golden':1,'west':1,'oceans':1,'oceans.':1,'ocean':1,'in':1},'legs.':{'illustration':1},'atom':{'and':5,'is':7,'within':1,'it':1,'as':2,'itself':1,'are':1,'in':2,'passes':1,'amounts':1,'there':1,'.':6,'to':6,'which':1,';':2,':':1,'was':3,'energy':1,'gives':1,'known':2,'such':1,'by':1,'a':1,'of':17,'can':1,'were':1,'the':4,'or':1},'coldest':{'places':1},'line':{'represents':1,'or':1,'from':1,'that':1,'of':21,'is':2,'capable':1,'but':1,'.':2,'to':1,'can':1,'altogether':1,'seen':1,'the':1,'gave':1,'with':2,'between':1,'across':1,'at':1},'considerable':{'and':1,'force':1,'mental':1,'evidence':1,'periods':1,'.':1,'strength':1,'uniformity':1,'heights':1,'dispersion':1,'results.':1,'degree':1,'loss':1,'fascination':1,'part':1,'effort':2,'distance':3,'amount':2,'magnitude':2,'time':2,'aid':1,'changes':1,'quantity':2},'posted':{'on':1,'with':3,'at':1},'open.':{'but':1},'ut':{'84116':1},'spectroscope':{'and':3,'reveals':1,'we':3,'enables':1,'splits':1,'for':1,'49':1,'any':1,'is':5,'in':1,'it':1,'an':1,'will':3,';':2,'can':1,'which':1,'sorts':2,'the':2,'.':3,'by':1,'shows':1},'burrows':{'circulating':1},'moths.':{'illustration':1},'us':{'and':6,'consider':2,'plainly':1,'feel':1,'is':2,'others':1,'phenomena':1,'back':2,'see':2,'through':1,'something':1,'directly':1,'in':2,'pulls':1,'precisely':1,'its':1,'select':1,'even':1,'better':1,'by':2,'for':2,'how':2,'inquire':1,'there':1,'when':1,'except':1,'.':11,'particles':1,'to':19,'take':2,';':1,'across':1,'picture':1,'return':2,'little.':1,'that':7,'very':2,'some':1,'stop':1,'bear':1,'indulge':1,'not':1,'with':3,'than':2,'a':8,'on':1,'about':1,'to-day':1,'remember':1,'this':1,'many':1,'as':2,'keep':1,'try':1,'turn':1,'so':1,'of':2,'the':3,'once':1,'say':2,'at':2},'paired':{'fins':1},'ball.':{'illustration':1},'mature':{'sperm-cell':1,'egg-cell':1,'animal':1,'.':1},'laplace':{'10':1,'s':3,'one':1,'spoke':1,'to':1},'side.':{'--i':1,'--1':1},'storing':{'fishes':2,'up':1},'genial':{'climatic':1},'aerial':{'and':1,'but':1,'journeys':2},'protrusive':{'lips':1,'face':2},'creature.':{'there':1,'sec':1},'defined':{'is':1,'primitive':1},'likewise':{'a':2,'have--there':1,'evolution':1,'react':1,'connected':1,'crumbs':1,'were':1,'simpler':1},'influence':{'and':2,'on':1,'of':5,'well':1,'retreats':1,'will':1,'in':1,'the':1,'or':1,'must':1},'surpassing':{'themselves':1},'char':{'that':1},'duration':{'of':2},'diverse':{'forms':2,'territory':1,'description':1,'angles':1,'results':1},'nautical':{'almanac':2},'pontobdella':{'an':1},'living.':{'some':1,'parental':1},'element.':{'two':1},'intrepid':{'explorers':1},'puzzling':{'and':1,'phenomenon':1},'tuft':{'as':1},'fixing':{'itself':1},'uranium':{'and':1,'then':1,'x.':1,'for':1,'would':1,'may':1,'should':1,'itself':1,'salt':1,'.':3,'spontaneously':1,'are':1,'in':1,'has':1,'changes':1,'by':1,'he':1},'preventing':{'their':1,'the':1},'close-packed':{'refractive':1},'conceptions':{'of':1},'points':{'one':1,'we':1,'that':1,'clearly':1,'of':4,'away':1,'back':1,'should':1,'to':2,'in':1,'forward':1,'.':1,'or':2,'out':3},'sails':{'for':1},'revision':{'.':1},'elements':{'a':1,'on':2,'commands':1,'for':1,'oxygen':1,'that':1,'may':1,'sun':1,'into':1,'in':2,'about':1,'.':2,'to':1,'as':2,'are':4,'have':1,'each':1,'it':1,'such':1},'small-brained':{'archaic':1},'energetic':{'particles':1,'men':1,'electrons':1,'actions':1},'beginnings':{'of':4,'.':1,'on':1},'sal-ammoniac':{'but':1},'faintly':{'lit':1,'visible':2},'bibliographies':{'appended':1},'habits--the':{'truly':1},'sides':{'and':1,'of':7,'nor':1,'to':1},'ago':{'and':2,'is':2,'in':3,'it':2,'as':1,'at':1,'178':1,'174':1,'for':1,'regarded':1,'when':3,'.':10,'to':1,'that':1,'may':1,'illustration':1,'they':1,'others':1,'with':1,'a':1,'showed':1,'the':4,'or':1,'are':1},'furthest':{'in':1},'land':{'and':3,'ran':1,'is':2,'surface':1,'skimming':1,'at':2,'have':1,'.':11,'bridges':1,'tending':1,'to':1,'there':1,'had':3,'actually':1,'also':1,'5':1,'between':1,'has':3,'was':2,'over':1,'meant':1,'but':1,'by':1,'continued':1,'than':2,'plants':1,'flora':1,'animals':10,'should':2,'animals--the':1,'leaving':1,'implied':1,'many':2},'sail.':{'the':1},'reasoned':{'discourse':2},'marble--there':{'are':1},'rescued':{'triumphantly':1},'diffraction':{'grating':2},'walked':{'about':1,'through':1},'cryptozoic':{'or':1},'opposing':{'the':1},'came':{'a':2,'about':6,'from':3,'barking':1,'into':1,'to':11,'slowly':1,'in':1,'first':1,'before':1},'harks':{'back':1},'fresh':{'waters--the':1,'racial':1,'contacts':1,'starts':1,'waters':2,'air':1,'water':7,'invention':1,'gulps':1,'offshoot':1,'supplies':1,'experiments':1,'expression':1,'or':2},'having':{'a':4,'little':1,'implies':1,'no':1,'comparatively':1,'somehow':1,'to':1,'only':1,'entangled':1,'planets':1,'not':1,'learned':1,'the':2},'placentals--show':{'a':1},'repeopled':{'by':1},'hampton':{'court':3},'code':{'of':1},'partial':{'counts':1,'eclipse':1,'or':1},'rubbish':{'is':1},'illustrates':{'very':1,'the':3,'part':1,'evolution':1},'scooped':{'the':1,'out':1},'knotted':{'spiral':1},'results':{'a':1,'what':1,'which':1,'of':6,'in':1,'.':2,'to':1,'are':2,'have':1,'were':1,'affecting':1,'the':2},'existing':{'lizards':1},'illustrated':{'and':1,'on':1,'when':1,'its':1,'in':1,'the':1,'by':3},'stops':{'struggling':1,'with':1,'its':1},'broader':{'palates':1},'dainty':{'and':1},'seemed':{'then':1,'for':1,'no':1,'almost':1,'to':2,'so':1},'tearing':{'small':2,'away':1},'club-mosses':{'and':1},'iii':{'adaptations':1,'.':2},'concerned':{'chiefly':1,'is':1,'here':1,'simply':1,';':1,'with':1},'hunger':{'and':2,'is':2,'in':1},'rufous':{'brown':1},'young':{'and':2,'emerge':1,'mound-birds':1,'reeds':1,'cheetahs':2,'water-bird':1,'fish':1,'woodpeckers':1,'orang':1,'foxes':1,'one':2,'crocodile':2,'as':1,'ducklings':1,'at':1,'in':2,'earth':1,'herring':1,'birds':5,'creatures':2,'eels':4,'described':1,'for':1,'liberated':1,'perhaps':1,'bittern':2,'frog':1,'.':4,'crocodiles':1,'fishes.':1,'fry':1,'bird':1,'elver':1,'then':1,'life':1,'thrush':1,'form':1,'that':1,'mammals':1,'ones':17,'twined':1,'text-book':1,'man':1,'a':1,'about':1,'animals':1,'turtles':1,'e.g':1,'this':1,'science':1,'frog-hopper':1,'toads':1,'moorhen':1,'plovers':1,'can':2,'mammal':1,'the':1,'stages':1,'are':3},'send':{'donations':1,'it':1,'out':2},'universes--':{'island-universes':1},'citing':{'these':1},'outwards':{'from':1,'for':1},'resources':{'and':1,'of':2,'upon':1,'are':1,'more':1},'inference.':{'on':1},'matter--other':{'new':1},'garden':{'on':1},'continues':{'to':3,'the':1,'sitting':1},'waters.':{'the':1},'mouth-parts':{'the':1,'.':1},'mixing':{'colours':4,'with':1,'in':1},'continued':{'and':1,'elevation':1,'conquest':1,'.':1,'to':3,'through':1,'in':1,'the':1,'over':1},'minerals':{'the':1,'.':1},'squids':{'various':1},'archaeopteryx':{'jurassic':1,'after':1,'.':1,'91':1,'the':1,'was':1},'earth-knot':{'of':1},'back-teeth':{'were':1},'anxious':{'warning':1},'race':{'because':1,'is':1,'depends':1,'well-defined':1,'owes':1,'if':1,'living':2,'would':2,'since':1,'.':9,'to':2,'which':1,'between':1,'was':1,'lived':1,'that':1,'after':2,'but':1,'includes':2,'they':1,'now':1,'by':1,'possess':1,'a':1,'of':3,'as':1,'without':2,'through':1,'or':3,'say':1},'trypanosome':{'which':2,'that':1},'others--the':{'placentals--show':1},'trypanosoma':{'gambiense':2},'mediterranean':{'region':1,'or':1,'for':1},'wavy-to':{'curly-haired':1},'unprofitable':{'for':1},'imply':{'enormous':1,'an':1,'ether':1,'it':1},'burrower':{'which':1},'munitions':{'which':1},'primeval':{'supporting':1,'coherence':1,'vegetation':1,'amphibians':1,'stuff':2},'make.':{'the':1},'that.':{'now':1},'apparatus':{'and':1,'for':3,'being':1,'of':1,'to':1,'which':1,'fine':1,'by':1},'waning':{'of':2,'remain':1},'expressed':{'by':1,'is':1,'.':1,'itself':1,'in':1,'along':1,'the':1},'hereditary':{'and':1,'enregistration':1,'obligations':1,'items':1,'pre-arrangements':1,'qualities':1,'capacity':1,'or':1,'enemies':1},'consistently':{'the':1,'presenting':1,'offer':1},'vapours--the':{'reversing':1},'indestructible':{'and':1,'it':1},'expresses':{'emotion':1,'the':1,'itself':2,'his':1,'its':1},'guinea-pigs':{'we':1},'bird':{'flies':1,'multiplying':1,'into':1,'dived':1,'it':1,'migration':1,'in':3,'feeding':2,'had':1,'sails':1,'.':5,'to':2,'without':1,'has':3,'was':2,'shows':1,'then':1,'we':1,'showing':2,'but':1,'with':1,'than':1,'about':1,'mimicry':2,'archaeopteryx':2,'of':6,'looked':1,'s':8,'allied':1,'the':1,'or':2,'hesperornis':2},'thin':{'dry':1,'atmosphere':1,'gas':1,'gases':1,'as':1,'sheets':1,'coatings':1,'out':1},'scenery':{'on':1,'effects':1,'if':1},'advantageously':{'sensitive':1},'scepticism':{'at':1},'led':{'eventually':3,'.':1,'to':7,'our':1,'was':1,'by':1},'license.':{'1.e.6':1},'convergences':{'and':1},'leg':{'to':1,'is':2,'but':1,'.':1,'broken':1,'in':1,'across':1},'respectively':{'.':1},'gathered':{'five':1,'together':1,'obviously':1},'dressed':{'but':1},'let':{'go':1,'the':2,'themselves':1,'them':2,'us':20},'octave':{'of':1},'consideration':{'of':2,'that':1},'invented':{'to':1,'cannot':1,'by':1,'something':1},'fifteen':{'thousand':1,'or':1,'miles':1,'in':1,'minutes':2,'feet--the':1},'physiology':{'and':2,'of':1,'would':1,'.':1},'darwinism':{'and':1},'substratum':{'on':1,'was':1,'.':1},'great':{'restriction':1,'evolutionary':2,'deliberateness':1,'effect.':1,'friction':1,'swooping':1,'philosopher':1,'skill':1,'speed':2,'projection':1,'resemblance':1,'patches':1,'density':1,'distances;':1,'auk':1,'storms':1,'improvement':1,'source':1,'collections':1,'majority':5,'division':2,'advantage':2,'advances':1,'oceans':1,'theme.':1,'coal-fields':1,'school':1,'clouds':1,'gift':1,'naturalist':1,'investigator':1,'aridity':1,'rocks':1,'excellence':1,'red':1,'truth':1,'waterfalls':1,'biological':1,'river':2,'italian':1,'dexterity':1,'wariness':1,'thinkers':1,'telescope':1,'deal':4,'series':1,'globe':1,'yerkes':1,'astronomer':1,'individual':1,'measure':1,'racial':1,'factors':1,'cerebral':1,'nebula':4,'southward':1,'ice':4,'abysses':4,'increase':1,'importance':4,'leap':2,'difficulties':3,'safety':1,'steps':8,'contrast':2,'claws':2,'beetling':1,'scientific':1,'power':1,'educability':1,'french':2,'difficulty':1,'reason':1,'extent':1,'congestion':1,'cities':1,'orb':1,'change':1,'advance':1,'search':1,'piece':1,'cavities':1,'pressure':1,'many':1,'step':5,'range':1,'comet':2,'canopy':1,'changes':1,'tongues':1,'groups':1,'unrest.':1,'height':1,'channels':1,'improvements':1,'doctrine':1,'illumination':1,'ridge':1,'service':2,'outbreaks':1,'depths.':1,'question':1,'nebular':1,'.':3,'swarm':1,'secret':2,'development':1,'interest':5,'brazilian':1,'length':1,'100-inch':1,'war':2,'fire-mists':1,'gaseous':1,'fiery':1,'quantities':1,'whirling':2,'it':1,'bulk':1,'part':3,'gain':1,'wheatfields':1,'abundance':1,'divisions':1,'fold':1,'deeps':2,'plain':1,'strides':1,'official':1,'value':1,'excitement':1,'sun-spot':2,'freedom':1,'refractors':1,'and':2,'tracts':1,'discovery.':1,'comet--the':1,'modern':1,'influence':1,'haunt':1,'haunts':1,'cluster':1,'as':4,'reptiles.':1,'glaciation':1,'numbers':1,'in':1,'diversity':2,'cleverness':1,'continents':1,'pink':1,'compared':1,'club-moss':1,'variety':3,'things':1,'forests':1,'flood':1,'electrical':1,'significance':1,'intelligence':1,'physical':1,'scarlet':2,'staying':1,'ball':1,'volumes':1,'disadvantages':1,'invasions':1,'gallery':1,'spot':1,'claw':1,'falls':1,'depths':2,'leaps':1,'invasion':2,'bustard.':1,'types':1,'acquisitions':2,'zooelogical':1,'accumulations':1,'complexity':1,'races':1,'mass':1,'fundamental':1,'velocity':1,'laboratories':1,'salt':1},'engage':{'the':1},'credits':{'every':1},'technical':{'section':1,'improvements':1},'involved':{'astronomers':1,'a':2,'this':1,'in':3},'resulting':{'from':1,'spectrum':1},'opinion':{'seems':1,'as':1,'now':1,'says':1,'about':1},'residents':{'in':2},'amphibians;':{'but':1},'pleistocene':{'perhaps':3,'period':2,'while':1,'era':1,'or':1,'before':1},'involves':{'a':1,'much':1,'hard':1,'nutritive':1},'holmes':{'kept':1,'writes':1,'poked':1},'chains':{'bind':1,'is':1,'or':1,'which':1},'halfpenny':{'it':1},'complying':{'with':3},'333':{'432':1},'mariners':{'before':1},'it--whatever':{'that':1},'hedgehog-like':{'test':1},'tools':{';':1},'fit.':{'at':1},'standing':{'stones':1,'on':1,'out':1,'with':1,'before':1},'bloweth':{'where':1},'recalling':{'even':1,'the':1},'whipping':{'in':1},'self-luminous':{'.':1},'next':{'set':1,'generation':1,'period':1,'grade':1,'stroke.':1,'year':1,'tooth':1,'to':2,'few':1,';':1,'article.':1,'notice':1,'that':1,'moult':1,'chapter.':1,'atom':1,'great':1,'room':1,'morning':1,'offshoot':1,'the':1,'page':1},'eleven':{'years':1},'doubt':{'and':1,'about':1,'for':1,'that':20,'whether':1,'many':1,'there':1,'some':1,'it':1,'as':7,'at':1,'the':1,'by':1},'animal.':{'illustration':1},'doubling':{'of':1},'midday':{'work':1},'pencil':{'on':1,'upon':1},'occurred':{'about':1,'without':1,'in':1,'the':1,'along':1,'more':1},'bodily':{'and':4,'life':2,'frame':2,'immortality':1,'attributes':1,'along':1},'carrying':{'a':1,'them':3,'her':2,'an':1,'the':1,'its':2},'extinction.':{'the':1},'baby':{'reveals':1,'orang':2,'had':1,'orang-utan':2,'chimpanzees':2,'learning':1},'balls':{'on':1},'animals':{'show':2,'abundant':1,'had':1,'should':1,'to':5,'overcome':1,'take':1,'division':1,'breathing':1,'showing':1,'cannot':1,'not':2,'monkeys':1,'like':6,'where':1,'enjoy':1,'illustrating':1,'often':1,'191':1,'began--a':1,'namely':1,'sec':1,'are':12,'living':5,'hide':1,'lead':1,'below':1,'tend':2,';':2,'we':2,'were':4,'however':1,'illustration':1,'sink':1,'put':1,'come':2,'on':2,'began.':1,'e.g':2,'of':7,'allied':1,'or':5,'secure':1,'physophora':2,'61':1,'1872':1,'protozoa':1,'illustrate':1,'from':2,'would':2,'there':4,'.':14,'live':2,'themselves':1,'was':1,'that':3,'but':1,'with':2,'must':2,'made':1,'these':1,'say':1,'remain':1,'learn':1,'called':1,'and':16,'do':1,'likewise':2,'is':6,'it':2,'as':1,'have':19,'in':5,'radiolarians':1,'thoroughly':1,'began':1,'burrow':1,'globigerinid':1,'which':7,'many':1,'important':1,'such':5,'man':1,'a':2,'lower':1,'especially':1,'together':2,'without':1,'the':5,'left':1},'retreated':{'northwards':1,'within':1},'this':{'freak':1,'impression':1,'selection':1,'phenomenon':1,'being':1,'when':1,'sporting':1,'leads':1,'distant':1,'consists':1,'earth':1,'oldest':1,'reasoning':1,'tendency':1,'seemed':1,'colony-making':1,'certainly':1,'outer':2,'advance--the':1,'work.':3,'common':1,'sheaf':1,'state':3,'instrument':2,'magnetic':1,'does':2,'has':5,'might':2,'over':1,'happened':1,'kingdom':1,'then':1,'good':1,'greater':1,'advantage':1,'means':5,'very':1,'period':5,'early':2,'hermon':1,'diary':1,'probably':1,'not':1,'world':2,';':1,'vapour':1,'organ':1,'progressive':1,'did':1,'pinch':1,'pillar':1,'dinosaur':1,'stuff':1,'she':1,'reasonable':1,'succession':1,'small':1,'ultra-violet':1,'movement':2,'page':1,'view':3,'system':1,'the':6,'namely':1,'picture':2,'colossal':1,'garment':1,'globe':1,'notochord':1,'persistent':1,'relative':1,'second':1,'owing':1,'result':1,'mirror':1,'ruse':1,'belief':1,'blue':1,'project':3,'still':1,'for':1,'waning':1,'distinctive':1,'away':1,'thickness':1,'case':8,'time.':1,'race':1,'vascular':1,'new':2,'falling':1,'before':1,'method':2,'law':1,'discovery':2,'body':1,'variability':1,'wheat':1,'theory':9,'fish':1,'creature--far':1,'applies':2,'agreement':16,'possibility':1,'like':1,'extraordinary':1,'surely':1,'web':1,'marquis':1,'vigorous':1,'path':1,'estimate':2,'respect':2,'by':1,'change':2,'stage':1,'chapter':1,'on':1,'great':3,'substance':1,'license':2,'argument':1,'of':2,'motion':3,'quaint':1,'range':1,'regular':1,'lively':1,'pictorial':1,'argue':1,'makes':2,'or':1,'inference':1,'family':1,'point':9,'simple':3,'image':1,'within':2,'colony':1,'number':1,'incessant':2,'will':2,'fiery':1,'raises':1,'littoral':1,'inorganic':1,'drawing':2,'electronic':3,'attendant':1,'sympathetic':1,'little':1,'ancient':1,'lens':2,'would':2,'attraction':1,'important':1,'outline':5,'question':3,'spiral':1,'.':2,'immense':1,'wonderful':2,'low':1,'statement':1,'ocean':1,'mysterious':1,'australian':1,'scheme':1,'was':15,'energy':7,'minor':1,'gives':1,'sort':2,'direction':1,'partly':1,'way':11,'that':4,'explanation':1,'continuous':1,'gas':1,'took':1,'but':1,'haunt':1,'implied':1,'instrument.':1,'reason.':1,'particular':1,'implies':3,'rivalry':1,'white':2,'must':2,'steel':1,'pull':3,'kind':5,'made':1,'conception':1,'conviction':1,'characteristic':1,'work':11,'sifting':1,'air':1,'planet':1,'below':1,'paragraph':1,'fertilisation':1,'can':3,'cannot':1,'were':2,'merely':1,'property':1,'x-ray':2,'distance':6,'and':3,'layer':2,'constant':1,'resemblance':1,'century':1,'process':1,'molecular':1,'is':63,'modern':1,'turned':1,'it':5,'swarm':1,'an':1,'sample':1,'cluster':1,'as':1,'ether':1,'at':2,'file':2,'sense':3,'relic':1,'mysteriously':1,'apparently':1,'internal':1,'film':1,'absolute':1,'again':2,'law.':1,'moves':1,'twofold':1,'woodpecker':1,'age-old':1,':':2,'eloquent':1,'radiation':1,'thorough':1,'any':1,'note':1,'field':1,'strange':2,'inquiry':1,'ante-natal':1,'answer':1,'subject':1,'shows':1,'conclusion':1,'tension':1,'neolithic':1,'book':3,'living':1,'may':7,'ebook':6,'to':3,'diagram':2,'scale':2,'nucleus':1,'purpose':2,'position':1,'discharge':1,'bodily':1,'opportunity':1,'wonder-world':1,'a':1,'in':2,'amoeboid':1,'observation':1,'imply':1,'light':1,'voice':1,'shift.':1,'dog':1,'obviously':1,'points':1,'principle':1,'time':2,'velocity':1,'effect':2,'egg':1,'order':1,'fact':4},'cuvier':{'1769-1832':2},'pour':{'from':1},'reproduce':{'it.':1,'tell':1},'publications':{'as':1},'of':{'dissolution':1,'comparatively':1,'four':4,'straws':1,'chameleons':1,'electricity':18,'ceylon':1,'out-breeding':2,'lord':1,'arboreal':4,'pigment':2,'thinopus':1,'every':2,'radio-active':3,'vastly':1,'monkeys':5,'kataleptic':1,'unrelated':1,'relics':3,'venus':5,'clothes':1,'force':2,'senescence':1,'infancy':1,'direct':1,'surrounding':1,'second':1,'microscopists':1,'even':1,'change.':1,'organisms':2,'thunder':1,'nature.':2,'asia':1,'children':2,'change;':1,'salt-accumulation':1,'fossil':1,'new':6,'increasing':3,'ever':2,'men':7,'unexhausted':1,'atoms':25,'anthropology':1,'100':1,'cardboard':1,'dry':2,'luther':1,'light.':3,'smoke':1,'changes':1,'golden':1,'feelings':1,'patience':1,'negative':5,'civilisation.':1,'telegraph':1,'thorndike':1,'musk':2,'x-rays--the':1,'glass':3,'continual':3,'things.':1,'93':1,'92':1,'work':3,'mammalian':1,'parachuting--a':1,'mr':1,'radiance':2,'india':1,'corroborating':1,'present-day':2,'absolute':1,'reptiles--snakes':1,'nuts':1,'damages.':1,'how':2,'messrs':1,'ordinary':1,'after':1,'vicious':1,'long-continued':1,'parallel':1,'types':1,'effective':1,'carbonic':1,'order':1,'wind':1,'over':7,'crumbs':1,'symmetry':2,'bodies--evolution':2,'better':2,'them':36,'widely':1,'penetration':2,'molecules.':1,'pinkish':1,'silver':1,'oxygen':7,'brightness':1,'each':10,'telescope':2,'spider':2,'parasites':1,'armour--the':1,'hive-bees':1,'forty':1,'particles':3,'heavenly':1,'millions':6,'stamping':1,'turning':1,'monkeys--activity':1,'eternal':1,'strata':3,'free':2,'sensory':1,'struggle':1,'mastering':1,'calcareous':1,'detecting':3,'monkey':2,'enormous':2,'perhaps.':1,'cosmic':1,'days':1,'hearing':4,'another':3,'scissors':1,'thick':1,'electronic':4,'mercury':2,'ten':2,'pelagic':1,'legs':3,'dogs':1,'hydatina--has':1,'project':8,'matter':67,'torpedo-net.':1,'iron':10,'feeling':3,'oxygen-capture':1,'mind':10,'spectrum':1,'controversy.':1,'oxygen-combustion':1,'relatively':1,'affairs':3,'snow':3,'metallic':1,'chitin':2,'australia--all':1,'knowledge--the':1,'blue':1,'anatomy':1,'drought':2,'nutritive':3,'observation':1,'fitter':1,'professor':4,'metal':1,'swamps':1,'dover':1,'pollen':1,'hunger':1,'insects':8,'nerve-cells':3,'counteractive':1,'lessons':1,'latent':1,'sugar':1,'structure.':1,'fluid':1,'energy--what':2,'tuberculosis':1,'saturn':2,'dr':1,'to-day--the':1,'fields':1,'shape':1,'progress.':2,'architecture':2,'freshwater':1,'steam':3,'head-brains':1,'radium':15,'testing':1,'combustion':2,'rings':1,'artificial':1,'paternal':1,'luminescent':1,'finger':1,'caves':1,'profitable':1,'nature':18,'were':2,'wear':1,'carbon':1,'flowering':3,'caledonia':1,'out-flowing':1,'climate':3,'air--a':1,'distinction':1,'inquisitive':1,'tons':2,'250':1,'merchantibility':1,'three':2,'quickly':1,'much':4,'sponges':1,'parents':1,'life':50,'in-breeding':2,'chili':1,'air':8,'horse-power':1,'zoologists':1,'balance':1,'amphibians--the':1,'remembering':1,'seven':1,'is':1,'it':16,'brake':1,'in':1,'comparative':1,'things':5,'daughter-units':1,'damages':1,'colonies':1,'capacities':1,'typhoid':1,'rain':1,'hand':1,'kin':1,'patagonia':1,'turtle-backs':1,'opportunity':1,'butter':1,'engrained':1,'neptune':1,'contact':1,'greatest':1,'the':1665,'kinship':1,'deep-red':1,'indigo':2,'newton':2,'disguise':3,'human':9,'life-preserving':1,'yet':1,'evolution.':5,'vibration':1,'leibnitz':1,'alchemy':1,'transformed':1,'innocent':1,'humanity':1,'survival':1,'possible':3,'it--for':1,'desire':1,'melting':2,'insurgence':1,'plants--romance':1,'haunts--such':1,'homing':1,'people':1,'dead':2,'deflection':1,'jupiter':5,'escape':1,'animate':4,'proceeding':1,'ice':1,'everything':1,'conquering':2,'man--body':1,'palatable':1,'losing':1,'self-preserving':1,'primitive':4,'successive':3,'obtaining':2,'intellectual':1,'bats':2,'palaeozoic':1,'support':2,'flying':2,'jealousy':1,'sunlight':2,'grasping':1,'head':2,'forming':4,'becoming':3,'heat':14,'solar':1,'crystal':1,'meteorites.':1,'temper':1,'paragraphs':1,'muscular':1,'evidence':2,'prayer':1,'physical':1,'discriminate':1,'lungs':1,'inborn':1,'no':4,'font-de-gaume':2,'reality':1,'tin':1,'holding':1,'smell':5,'white-hot':2,'clear-cut':1,'diet':1,'rising':1,'authorities':1,'to-day':15,'potato':1,'time':10,'serious':1,'remarkable':2,'colour-change':2,'varying':1,'computation':1,'skin':7,'passage':1,'reptiles':6,'protective':3,'exact':1,'feeble':1,'minute':5,'level':1,'magnet':1,'coincidences':1,'excellence':1,'slouching':1,'backboneless':2,'speculation':1,'perceptual':2,'tortoises':1,'thinkers':1,'radium.':1,'mind--even':1,'bacteria':1,'water-plants':1,'constitution':1,'uniform':2,'wave-motion':1,'falling':1,'flame.':1,'tibet':1,'hairs':1,'mauer.':1,'water':19,'meteorites':3,'magnetism':1,'galileo':1,'change':4,'box':1,'brilliant':1,'smoke-like':1,'exploitation':1,'sex--beginning':2,'ineffective':1,'locomotion':2,'useful':2,'relations.':1,'illumination':1,'sympathetic':1,'working':2,'positive':8,'uncritical':1,'france':3,'prey':2,'assimilation':1,'cases':2,'capturing':2,'haddington':1,'avoiding':1,'nature--on':1,'inveterate':1,'stature':1,'following':1,'making':4,'warm-bloodedness':1,'breeds':1,'spy':1,'development--that':1,'238':1,'mankind--steps':1,'hydrogen':9,'rays':3,'winter':1,'condensation.':1,'species':4,'vital':3,'huge':2,'may':1,'mankind':3,'such':9,'man':52,'natural':6,'neck':1,'liquid':1,'st':1,'lagoon':1,'years':25,'course':35,'experiments':1,'cold':3,'still':3,'birds':13,'limbs':1,'apes':3,'forms':1,'physics--research':1,'ours':3,'fire-mist':1,'years--but':1,'tails':1,'half':1,'twilight':1,'name':1,'times':4,'creation.':1,'establishing':2,'rock':1,'square':1,'elephants':1,'receipt':2,'prisms':2,'woodcraft':1,'catching':1,'entering':1,'wheat--changes':1,'living':17,'space':10,'these--which':1,'looking':3,'receiving':1,'picture-logic':1,'california':1,'marine':1,'advance':2,'sparrows':1,'language':1,'tree-sloths':1,'british':1,'motion':6,'thing':1,'deep-sea':1,'learning.':1,'adventure':4,'surviving':1,'coming':1,'one':18,'gases':1,'them--':1,'field-voles':1,'rome':1,'size':2,'little':5,'man--the':1,'anyone':2,'cooling':1,'2':1,'alfred':1,'white':1,'exploring':1,'that':14,'centipedes':1,'flowers':1,'eohippus':1,'12':1,'meteors':5,'third':1,'sailing':1,'three-spined':2,'trekking':1,'cards':1,'gigantic':3,'wandering':1,'and':3,'gathering':1,'chlorophyll':1,'psychical':1,'any':20,'1903.':1,'bavaria':1,'coal':3,'efficient':1,'physiologists':1,'equipment':1,'potential':1,'hydrogen--which':1,'invertebrate':1,'printed':1,'men--conspicuous':1,'america':2,'greyish':1,'dragon-flies':1,'average':1,'later':1,'science.':2,'wing':1,'salt':2,'precise':2,'far-reaching':1,'bright':2,'uranus':1,'slow':2,'only':1,'wood':1,'flood.':1,'awareness':1,'masking':1,'space.':1,'nearly':3,'lighter':3,'primates':2,'aluminum':1,'miles':13,'girdles':1,'vision':4,'famine':1,'weapons--the':1,'registering':1,'ways':2,'definite':2,'colours':2,'man.':7,'crookes':1,'vertical':1,'parental':10,'style':1,'dome':1,'rapidly':1,'cities':1,'vaporous':1,'many':15,'contract':1,'disappointment':1,'equatorials':1,'expression':2,'radio-activity':3,'bricks':1,'colony':1,'ants':2,'60':1,'air-breathing':2,'straws.':1,'learning':3,'67':1,'extinct':2,'technicalities':1,'one-celled':2,'mars':10,'reflex':2,'500':2,'observers':1,'external':1,'attentive':1,'diffuse':1,'those':9,'sound':1,'specialised':1,'these':71,'danger.':1,'life.':5,'mound':1,'trackless':1,'sudden':1,'ferns':1,'rock-cod':1,'helium':2,'everyday':1,'movements':1,'different':15,'lava':1,'shifts':2,'speech':1,'intermediary':1,'noble':1,'oil':6,'arctic':2,'insects.':1,'persons':1,'fruit':2,'delicate':1,'waves.':1,'implements':1,'fixing':1,'bodies':2,'summer':1,'being':8,'slime':1,'actions':1,'violent':3,'touch':1,'water-basins':1,'death':3,'thinking':4,'rose':1,'geological':1,'clay.':1,'4':3,'grip':1,'around':1,'larva':1,'crustaceans':1,'dark':3,'quickness':1,'using':1,'meaning':1,'acute':1,'fossils':2,'heat-waves':1,'heredity':2,'lightning':1,'donations':1,'coal--a':1,'chronology':1,'racial':3,'ascent':2,'self-effacement':1,'semotilus':2,'critical':1,'expressing':1,'transmutation':2,'measuring':1,'iron-forming':1,'wheat':2,'scientific':3,'uneasy':1,'sixty':2,'stone':2,'beavers':1,'chamberlin':2,'mutually':1,'corals':1,'or':3,'cambridge':2,'goethe':1,'communication':3,'electricity.':1,'wave-movements':1,'your':1,'mental':2,'her':8,'camouflaging':1,'dispersion':1,'low':1,'stars':16,'energy':35,'continents':1,'wits':1,'mammals':9,'water-vapour':1,'practically':1,'grass':1,'taste':2,'certain':5,'deep':1,'general':2,'as':1,'lichen':1,'associating':1,'planets':1,'retiring':1,'meteorites--pieces':1,'deviation':1,'separate':1,'teeth':2,'fresh':1,'rainbow-colour':1,'building':3,'condensation':2,'remote':1,'bilateral':1,'dislodgment':1,'starting':1,'all':34,'suns':1,'worms':2,'seals':1,'zinc':4,'reasoning':1,'careful':1,'red-hot':2,'meteorites--a':1,'wyoming':1,'postglacial':1,'devonian':1,'very':6,'combustible':1,'fat':1,'coloured':2,'trillions':5,'interpreting':2,'instinct.':1,'condition':1,'elusiveness.':1,'prolonged':2,'large':4,'dinosaur':1,'sand':2,'small':10,'mount':2,'rats':1,'methodical':1,'past':2,'invention':2,'1904-5':1,'further':1,'creatures':2,'babylonia':1,'what':25,'sun':1,'emotions':1,'thickness':1,'public':1,'movement':7,'condensed':1,'escaping':1,'malaria':1,'answers':1,'behaviour':14,'1843':1,'compliance':2,'experimenting':3,'miniature':2,'social':2,'action':2,'matter--but':1,'sticking':1,'family':3,'transit':1,'africa':1,'inorganic':2,'eye':1,'discriminative':1,'distinct':1,'petroleum':1,'two':7,'comparing':1,'promoting':2,'minor':1,'more':5,'horses':2,'substances':2,'chimpanzee':2,'particular':2,'stampings':1,'weathering':1,'science':29,'nine':1,'spontaneous':1,'beautiful':1,'messages':1,'stinging':3,'niagara':3,'sharp':1,'flint':1,'offspring':2,'terrestrial':6,'viviparity':1,'glowing':7,'civilisation':2,'germinal':1,'blood':1,'waves':10,'prospecting':1,'a':310,'life-forms':1,'pithecanthropus':8,'sun-spots':2,'renewing':1,'shore':1,'tentacles':2,'cases.':1,'perception':2,'healthfulness':1,'music.':1,'egg':2,'playing':2,'paper':3,'existence':1,'its':73,'club-mosses':1,'25':2,'26':1,'20':1,'solving':1,'gentleness.':1,'late':1,'microscopic':3,'it.':1,'good':2,'food':13,'compound':1,'association':4,'instructions':1,'mystery':1,'exquisite':1,'predatory':1,'heavy':1,'england':2,'restless':2,'nitrogenous':1,'fish':1,'hard':1,'energy.':1,'trilobites--jointed-footed':1,'neanderthal':3,'research':1,'nautiloids':2,'safety':3,'7':1,'celebes':1,'meteoric':2,'rejuvenescence':1,'bass':1,'extraordinary':2,'reason':2,'rainbow-tinted':1,'metamorphosis':1,'computers':1,'round':1,'copper':4,'limestone':1,'mimetic':1,'soapy':1,'star-clouds':1,'earthworms':1,'horse':3,'temperature':6,'twenty':2,'186':4,'gibraltar':1,'einstein.':1,'molecular':1,'aristocracy':1,'relationship':1,'1919':1,'1918':1,'part':1,'half-made':1,'sheer':2,'dissection--or':1,'egg-cells':2,'messrs.':1,'ages':7,'germ-cells--the':1,'atoms--the':2,'flaming':2,'scotland':2,'moist':1,'labour':6,'useless':2,'sea-perches':1,'eggs':7,'most':5,'achievement':1,'branching':1,'galway':1,'evolution--factors':1,'mobile':1,'seething':1,'electrons':32,'physics':6,'lying':2,'stones':1,'hoar-frost':1,'gold':6,'disturbances':2,'to-day.':1,'hereditary':3,'fine':1,'giant':2,'securing':1,'mauer':1,'nervous':2,'fishes--the':1,'less':1,'gills':1,'darwin':3,'his':27,'trees':2,'germ-cells':2,'rest':1,'instinctive':5,'silk':4,'stone.':1,'birds.':1,'common':2,'activity':2,'experiments;':1,'body':4,'art':1,'intelligence':12,'sex':1,'individual':5,'aberdeen':1,'practice':1,'gravitation':3,'pictures':2,'classes':1,'various':8,'conditions':1,'europe':3,'responses':1,'craters':1,'invisible':1,'both':2,'attainment':1,'foreign':1,'tactility':1,'amoeba':2,'experimental':1,'distress':1,'supply':1,'simple':3,'whatever':2,'whelk':2,'unicellular':1,'incandescent':1,'zeta':2,'decline':1,'damp':1,'brick':1,'meeting':1,'treatment':1,'modern':20,'flight':11,'fire':3,'gas':8,'amphibians':8,'reason.':1,'magnetised':1,'plants':4,'opportunity.':1,'solid':4,'straight':1,'ape-like':1,'lenard':1,'moth':1,'itself':2,'currents':1,'saline':1,'communal':1,'trial':2,'pecking':1,'yucca':1,'higher':5,'development':3,'brooding':1,'moving':4,'birch':1,'recent':5,'lower':2,'luminescence':1,'sight.':1,'chickens':1,'concrete':1,'body-building':1,'pigeons':2,'matter.':4,'space;':1,'atomic':1,'matter;':1,'praying':1,'letting':1,'cut':1,'internal':5,'deliberately':1,'heidelberg':3,'chess':1,'australia':7,'reptilian':1,'showing':1,'stockholm.':2,'life--a':1,'wings':1,'insect':1,'ponds':1,'individuals':1,'mathematical':2,'methods':1,'spring':1,'creation':4,'some':25,'yolk':3,'sight':3,'curious':1,'sieves':1,'pitchblende':2,'civilization':1,'300':2,'lakes':1,'tidal':2,'starlings':1,'intense':1,'analysing':1,'feigning':1,'prothyl':1,'modernity':1,'deepish':1,'chaps.':1,'naturalists':1,'chalk-forming':2,'deep-violet':1,'statistics':1,'placing':1,'long':3,'mimicry':2,'mountains':1,'inches':1,'adjusting':1,'frost':1,'fisheries':1,'atom':1,'energy--traceable':1,'migrating':1,'considerable':2,'hair':1,'skull':2,'characteristic':2,'spectroscope':1,'sifting':3,'us':3,'similar':2,'non-living':1,'flow':1,'sepia':1,'warning':2,'dragging':1,'whirligig':2,'tentative':1,'heat.':1,'endurance':1,'uranium':3,'occasional':1,'explaining':3,'elements':2,'energetic':1,'problems':1,'astronomy.':1,'allowing':1,'fishes':11,'cuttlefish':1,'structure':3,'temperament':1,'land':4,'reasoned':2,'age':1,'attaining':2,'conjugal':1,'ready-made':1,'knotted':1,'existing':1,'disintegration':1,'rufous':1,'young':2,'stable':1,'indicating':1,'breathing':1,'matter--other':1,'moribund':1,'putting':3,'intelligence--of':1,'minerals':1,'race':1,'smaller':1,'gripping':1,'rivers':2,'fermenting':1,'unavailable':1,'opaque':1,'giving':2,'slight':1,'habituation':1,'atoms--different':1,'experiment':1,'bird':1,'scenery':1,'let':2,'fifteen':1,'physiology':1,'extreme':1,'great':21,'evolution--the':1,'amphibians.':1,'haunts':1,'leaving':1,'evading':2,'stars--the':3,'opinion':2,'marmosets':1,'it--whatever':1,'tools':1,'cloud':2,'lime':2,'use':2,'from':4,'doubt':1,'contentment':1,'crab':1,'oily':1,'visibility':2,'bodily':1,'opposing':1,'animals':21,'this':81,'us.':1,'crickets':1,'reeds':2,'calculation':1,'high':3,'birnam':1,'something':4,'water.':3,'sir':7,'counting':1,'six':2,'animal':17,'hormones':2,'intelligent':4,'tension':1,'maternal':1,'them--simple':1,'sugar-bird':1,'primers':1,'tethering':1,'light':49,'lines':1,'predacious':1,'evolutionary':1,'unpalatable':1,'130':1,'agricultural':1,'ease.':1,'burning':1,'la':2,'water-weed':2,'surgeons':1,'vibration.':1,'labor':1,'instruments':1,'derivative':1,'greater':1,'material':2,'billiard':1,'rotation':2,'day':1,'worlds':2,'profound':2,'slipping':1,'truth':2,'pools':1,'lung':1,'evolution--how':1,'doing':3,'cultivated':2,'whitish':1,'books':2,'separating':2,'our':53,'sexual':1,'special':2,'gossamer':4,'time.':1,'exporting':1,'red':7,'lizzie':2,'electricity--electric':1,'mares':1,'organic':4,'behaviour.':2,'south':1,'disembodied':2,'activity.':1,'quality':2,'ancient':5,'nebulae':3,'all--the':1,'their':48,'nebular':1,'time--man':1,'mankind--notably':1,'hearing.':1,'inner':1,'x-rays':9,'negro':1,'manipulation':1,'branches':1,'july':2,'shrapnel':1,'isolation':1,'reproduction':1,'negatively':1,'steep':1,'poisons':1,'apparently':1,'food-supply':1,'gravity':2,'which':46,'unsettled':1,'soap':2,'vegetation':4,'digestive':2,'cracking':1,'preliminary':2,'sally':1,'dorsal':1,'volunteers':1,'disease':1,'mechanical':3,'mother-of-pearl':1,'fact':2,'atmosphere':1,'charles':1,'woolly':1,'seaweed':3,'utter':1,'fear':1,'trying':1,'knowledge':4,'millennia':1,'surroundings':1,'spontaneity':1,'molecules':3,'emitting':1,'thousands':6,'means':1,'perfection':2,'words':2,'crabs':1,'evolution':46,'brain':1,'numerous':1,'amphibia':1,'light--is':1,'view':8,'multiplying':3,'elusiveness':2,'powder':1,'violet':2,'humane':1,'wire':2,'genius':1,'mind.':3,'identification':1,'routine':1,'progress':2,'open-sea':2,'joy':1,'agencies':1,'pilgrims':1,'equal':2,'migration.':1,'passing':3,'preparedness':1,'stars--to':1,'sea-worms':1,'tremendous':1,'armadillos':1,'immense':1,'waste':1,'phosphorescent':1,'antlers':1,'sex--emotions':1,'environment.':1,'tactics--self-effacement':1,'an':58,'volunteer':1,'economised':1,'asexual':1,'air-tubes':1,'britain':1,'wild':2,'almost':1,'surface':1,'zoophytes':1,'perhaps':1,'forceps':1,'ante-natal':3,'habitats':1,'locomotion.':1,'neolithic':2,'lichen;':1,'cubic':1,'clouds--some':1,'colouring':1,'dust':4,'britain.':1,'whale':2,'poultry':1,'colour':8,'nebulous':2,'thought':3,'position':4,'flesh':1,'domestic':1,'radium--the':1,'sea-dust':2,'skill':2,'rapid':2,'battery':1,'slits':1,'government':1,'utah':1,'mistake.':1,'facial':1,'backboned':2,'perpetual':1,'electrons.':4,'works':1,'soft':2,'inexperienced':1,'replacement':3,'feelers.':1,'phenomena':2,'gossamer.':1,'ideals':2,'homo':1,'kinds':2,'peter':1,'recognition':1,'lead':1,'cabbages':1,'ether':3,'mutation':1,'reaching':1,'cellulose':1,'stellar':2,'pressure':2,'enregistering':1,'instinct':4,'about':8,'rare':1,'getting':5,'mendelism':1,'biscuit':1,'sea-horse':1,'swimming':1,'warranty':1,'reptile':1,'washington':1,'promise':1,'registration':2,'protozoa':2,'properties--ready':1,'mississippi':1,'spiral':2,'invisibility':5,'fundy':1,'north':2,'interest':3,'surgeons.':1,'hundreds':2,'shark-like':1,'marquis':2,'cells':3,'variations':1,'graphite':1,'penetrating':1,'rabbits':2,'universal':1,'reptiles.':1,'periods':1,'ink':1,'crystals':2,'agriculture':1,'40':1,'other':7,'branch':1,'disposing':1,'star':1,'tides':4,'astronomy':5,'coloration':1,'association--why':1,'15-20':1,'liver':1},'newts':{'and':1},'scatter':{'over':1,'them':1},'weaker':{'stocks':1},'bent':{'out':2},'reeds':{';':1,'the':1,'are':1,'143':1},'process':{'and':2,'by':1,'like':1,'for':1,'may':1,'of':22,'is':2,'had':1,'.':3,'does':2,'went':1,'has':2,'was':1,'the':1,'advanced':1},'lock':{'that':1},'slim':{'contracting':1},'purposes':{'of':1,'which':1,'.':1},'pieces':{'and':1,'because':1,'of':11,'is':1,'.':1,';':1},'high':{'and':2,'rounded':2,'authority':1,'rate':1,'frequency':1,'something':1,'speed':2,'forehead':1,'temperature':1,'there':1,'.':3,'chemical':1,';':2,'mountains':2,'degree':1,'water':5,'foreheads':1,'perfection':1,'places':1,'level':3,'grounds':1,'at':1},'slip':{'down':1,'into':1},'class.':{'a':1},'educational':{'corporation':1},'sand-grouse':{'into':1},'mutually':{'beneficial':4},'destroying':{'sheep':1},'cycads':{'and':1,'our':1,'which':1},'astronomers':{'rely':1,'regard':1,'calculate':1,'wondered':1,'that':1,'of':1,'believe':4,'who':2,'prefer':1,'we':1,'however':1,'to':2,'now':1,'have':4,'in':1,'hold':1,'.':1,'think':6},'pair':{'of':5},'animal':{'and':6,'settles':1,'often':1,'family':1,'intelligence':1,'is':10,'it':1,'accumulates':1,'one':1,'as':2,'in':2,'frequents':1,'plankton.':1,'life--story':1,'well':1,'will':1,'enters':1,'from':1,'world...':1,'world--even':1,'ways':1,'heat.':1,'except':1,'.':3,'to':2,'or':3,'which':1,'youth.':1,';':1,'has':3,'divides':1,'more':1,'kingdom':4,'play':1,'complete':1,'may':4,'about':1,'but':1,'aware':1,'behaviour':6,'heat':1,'races':1,'lives':2,'tended':1,'somewhat':1,'instinct':2,'world':1,'with':2,'population':3,'a':3,'evolution':1,'microbes':1,'of':4,'could':1,'depending':1,'life':8,'behaviour.':4,'like':6,'remains':1,'s':3,'can':1,'man':1,'trypanosome':1,'the':1,'makes':2,'called':2},'hormones':{'has':1,'or':2,'which':1},'mysteries':{'of':1,'the':1,'which':1,'.':1},'palates':{'than':1},'establishment':{'of':13},'paler':{'type':1},'yellowish':{'then':1,'tinge':1},'stow':{'them':1},'await':{'an':1},'tied':{'on':1},'purpose.':{'1.f.5':1},'permanent':{'inhabitants':1,'caterpillar':1,'as':1,'future':1,'markings':1,'in':1,'residents':2},'lines.':{'these':1,'in':1},'men--primitive':{'men--races':1},'fits':{'the':1},'cabbage':{'found':1},'hawk':{'moth':1},'solidarity':{'with':1},'varied':{'from':3,'face':1,'electrical':1,'at':1,'in':1,'stock':1},'ingersoll':{'s':2},'voracity':{'.':1},'prawns':{'and':2},'element':{'from':1,'giving':2,'is':3,'after':1,'uranium':1,'.':3,'as':1,'going':2,'can':1,'in':7,'known':1,';':1,'into':1},'allow':{'them':1,'for':1,'disclaimers':1,'chemical':1,'part':1,'the':3,';':1},'okapi':{'and':2,'is':1,'was':1},'alloy':{'that':1},'food-canals':{'to':1},'volunteers':{'and':4,'associated':1,'with':1},'moulton.':{'according':1},'counted':{'the':1,'by':1,'for':1,'.':1},'archimedes':{'.':1},'thigh':{'on':1},'produces':{'a':2,'the':2,'only':1,'tides':2,'its':1},'frontispiece.':{'illustration':1},'phalanger':{'flying':1},'peck':{'their':1,'without':1},'move':{'on':1,'about':4,'towards':1,'up':1,'to':1,'through':1,'at':1,'in':1,'the':1,'with':1,'across':1},'produced':{'a':1,'on':2,'and':1,'by':13,'in':2},'nerve-cord':{'.':1},'existence.':{'when':1,'5':1,'if':1},'triassic':{'blue':1,'reptile':2,'for':1,'mammals':1,'when':1,'period':2,'era':1,'attained':1,'precede':1},'perfect':{'weather':1,'.':1},'saturn':{'and':1,'886.0':1,'is':3,'next':1,'itself':1,'uranus':1,'in':1,'november':1,'revolve':1},'broiling':{'heat':1},'progeny':{'from':1},'surgeons':{'of':1},'equalise':{'temperatures.':1},'coral-reefs':{'where':1,'are':1},'hermit-crab':{'and':3,'which':1,'stock.':1,'fixes':1,'s':1,'passed':1,'with':2},'meantime':{'with':1},'degrees':{'a':1,'from':1,'of':2,'.':1,'below':1,'centigrade':1},'spoiling':{'the':1},'instruments':{'and':2,'multiplied':1,'great':1,'used':1,'would':1,'for':1,'have':1,'of':2,'.':2,'as':1,'cannot':1,'sec':1,'are':2,'which':1,'or':1,'can':1},'tubeful':{'of':1},'derivative':{'works':3},'forest':{'and':1,'life':1,'to':1,'tract':2,'.':2,'primeval.':1,'in':1,'was':1},'rill.':{'no':1},'piecing':{'together':1},'existences':{'such':1,'which':1},'outlined':{'it':1,'.':1},'innermost':{'region':1},'ship':{'and':1,'when':1,'without':1,'through':1,'.':1},'billiard':{'table':1,'balls':1},'snake':{'to':1,'dasypeltis':1,'with':2,'pushes':1},'rotation':{'on':1,'increased':1,'caused':1,'it':1,'.':3,'of':6,'than':1},'cage':{'professor':1,'in':1},'realize':{'the':1},'intelligent':{'and':2,'control':1,'use':1,'interest':1,'they':1,'efficiency':1,'educability':1,'way':1,'attention':1,'beings':1,'actions':2,'behaviour':4,'appreciation':2,'insect':1,'student-citizen':1,'learning':1,'activity':1,'device':1,'learning.':1,'creatures':1},'traced':{'on':1,'back':1,'its':1},'concave':{'and':1},'sufficiently':{'close':1,'generous':1,'shallow':1,'hard':1,'low':1},'vibrations':{'and':1,'of':1,'in':2,'constituting':1,'must':1},'truth':{'that':1,'of':1,'though':1,'but':1,'they':1,'in':4},'invertebrates':{'and':1},'persia':{'turkestan':1},'accompanied':{'by':2},'beneath':{'shines':1,'the':8},'stock':{'separated':1,'and':3,'of':4,'spreading':1,'took':1,'marked':1,'.':5,'to':2,'as':1,'common':1,'in':1,';':1,'has':1,'was':1,'the':4},'traces':{'of':4,'are':1,'which':1,'in':1},'enigmatic':{'objects':1},'profile':{'view':4},'salps':{'related':1},'beginner':{'s':1},'doing':{'clever':1,'damage.':1,'things':1,'work':1,'when':1,'.':1,'this':1,'apparently':1},'sidelight':{'on':1},'society':{'society':1,'the':1,'made':1},'frequency':{'of':2,';':1},'static':{'to':1},'irritation':{'may':1},'agriculture':{';':2},'wander':{'separately':1},'witness':{'a':1,'an':1},'fundamentally':{'instinctive':1},'colour-varieties':{'there':1,'which':1},'knickerbocker':{'press':1},'bad':{'debts.':1,'business':1},'venom':{'on':1},'dominated':{'by':1},'adaptive':{'to':1,'radiation.':1,'device--more':1},'architecture':{'though':2},'harvest-mouse':{'constructing':1},'shut':{'our':1,'to':1,'their':1},'thrush':{'seized':1,'s':3,'managed':1,'at':2,'which':1},'perish':{'if':1},'incalculable':{'and':1,'abundance':1,'millions':1},'decay.':{'sec':1},'body-cavity':{'fluid':1},'surely':{'a':1,'follows':1,'is':1,'have':1,'the':1,'difficult':1},'steering':{'.':1},'shortest':{'waves':2,'.':1},'things.':{'lord':1,'reliable':1,'contrast':1},'apprehend.':{'the':1},'pursuits.':{'everything':1},'could':{'just':1,'be':20,'it':2,'resist':1,'see':2,'skate':1,'exist':1,'at':1,'have':1,'measure':1,'extract':1,'use':1,'make':2,'actually':1,'survive':1,'then':1,'we':1,'run':1,'form':1,'stop':1,'discover':1,'possibly':2,'produce':2,'not':8,'believe':1,'fly':2,'photograph':2,'boast':1,'keep':1,'harness':1,'support':1},'tube-feet':{'are':1},'david':{'fife':2},'length':{'and':1,'about':1,'may':1,'of':14,'is':1,'.':6,'as':1,'7':1,'were':1,';':1,'has':1},'removing':{'any':1},'stimulate':{'organs':1},'gamekeeper':{'but':1},'granules.':{'from':1},'respond':{'to':1,'when':1},'blown':{'by':1,'to':1,'into':1,'away':2,'back':1},'scene':{'of':1,'showing':1,'with':1,'in':6},'earth':{'and':21,'receives':1,'often':1,'escapes':1,'revolves':1,'is':13,'within':1,'rotated':1,'it':4,'slowing':3,'down':1,'as':2,'259':1,'are':2,'in':4,'yet':1,'before':1,'even':1,'passes':1,'from':4,'for':3,'to':4,'giving':1,'began':1,'there':3,'when':3,'except':1,'.':36,'how':1,'does':1,'take':1,'which':5,'mars':1,'passing':2,';':3,'must':1,'was':3,'naturally':1,'circles':1,'became':1,'we':3,'turning':1,'passed':1,'that':1,'may':1,'completed':1,'were':3,'but':2,'92.9':1,'although':2,'included':1,'during':2,'on':2,'with':3,'by':1,'he':1,'a':1,'rotating':1,'has':2,'to-day':2,'would':3,'14':1,'always':1,'did':3,'of':2,'no':1,'itself':2,'against':1,'will':3,'s':24,'owing':1,'so':1,'had':2,'intercepts':1,'the':6,'pulled':1,'or':2,'turns':1,'at':3},'owner':{'and':1,'would':1,'of':3,'.':1,'s':1,'any':1},'blows':{'its':1},'scent':{'a':1,'of':1,'no':1},'interest.':{'as':1},'buoyed':{'up':1},'two.':{'illustration':1,'but':1},'light--visible':{'and':1},'fascinating':{'study':1,'tantalising':1,'spectacle':2},'behaves':{'so':1,'in':1},'system':{'and':7,'comets':1,'is':2,'as':2,'sec':1,'are':3,'in':2,'would':1,'once':1,'there':1,'.':11,'to':1,'revolving':1,'has':1,'was':2,'then':1,'we':1,'full':1,'ranged':1,'formed':1,'but':2,'with':1,'by':1,'must':1,'for':1,'of':9,'will':1,'the':5,'mean':1,'at':1},'sea-lilies':{'crustaceans':1,'water-fleas':1},'world--even':{'the':1},'opossum':{'carrying':2},'time--man':{'s':1},'king-crabs':{'.':1},'travelled':{'far':1,'at':1},'egg-layer':{'in':1},'thick.':{'the':1,'we':1},'interests':{'it':1},'accompany':{'actual':1},'stars':{'and':5,'comets':1,'enormously':1,'show':1,'being':1,'is':1,'within':1,'visible':1,'as':1,'sec':1,'are':13,'have':1,'in':4,'whose':1,'tending':1,'appear':1,'stretch':1,'circulating':1,'.':13,'to':1,'varies':1,'does':1,'which':6,'going':1,'themselves':1,'has':3,'across':1,'can':1,'we':3,'form':1,'that':1,'forming':1,'let':1,'with':1,';':2,'a':1,'pull':1,':':2,'like':1,'of':1,'into':1,'will':1,'thin':1,'were':2,'the':4,'planet':1,'or':3,'at':1},'quarry':{'.':1},'depressing':{'energy':1},'stimulation--giving':{'off':1},'prominent.':{'the':1,'5':1},'steel':{'we':1,'civilisation':1},'quietness':{'of':1},'migrating':{'of':1,'from':1},'poulton':{'s':1},'extraordinarily':{'efficient':1,'mammal-like':1,'like':2,'gaunt':1},'wicketed':{'sides':1},'negatively':{'electrified.':1,'charged':1},'steep':{'and':1,'mountain':1,'ladder':2,'cliff':1},'torrent':{'.':1},'undercharged':{'body':1},'ingenious':{'methods':2},'platypus':{'of':3},'partnership':{'commensalism':1,'is':2,'with':3,'between':2},'poisons':{'including':1,'which':1,'.':1},'gently':{'through':1,'with':1},'gentle':{'reactions':1},'affinities':{'both':1,'to':1},'clearly':{'necessary':1,'that':1,'defined':1,'of':1,'showing':1,'marked':1,'or':1,'seen':1,'visible':1,'in':2,'drawn':1,'worked':1,'outlined':1},'viewed':{'copied':1,'or':1},'food-debris':{'millennium':1},'depict':{'quite':1},'studying':{'head':1,'the':2},'possibility.':{'it':1},'mechanism':{'of':1},'decomposing':{'animal':1},'ashore':{'.':1},'photosphere':{'that':2,'there':2,'but':1,'.':2,'surrounding':1,'as':1,';':1,'beneath':1,'shows':1},'scooping':{'in':2,'out':1},'sirius':{'the':1,'8.7':1},'persistence':{'of':1},'accuracy':{'when':1,'than':1,'.':1},'worldwide':{'task':1},'brazil':{'18':1},'regard':{'them':1,'these':1,'it':1,'to':15,'as':1,'the':3},'shaped':{'as':2,'like':1,'something':1,'in':1},'seed-box':{'but':1,'.':1},'device':{'whereby':1,'for':1,'this':1,'of':1,'is':1,'to':1},'so-called':{'flying':1,'abdominal':1,'grouse':1,'chameleon':1,'sargasso':1,'rings':1,'electro-magnetic':1,'rays':1,'anvil':1},'river-mussels':{'yielded':1},'predacious':{'creatures':1},'tramps':{'the':1},'bred':{'to':1},'stronger':{'and':1,'.':1,'should':1},'curiously':{'enough':1,'wasplike':1},'face':{'a':2,'tentatively':1,'set':1,'certain':1,'is':1,'illustration':1,'.':1,'to':4,'allowing':1,'directly':1,'of':4,'166':1,'with':1,'region':2},'perceiving':{'moving':1},'kipling':{'s':1},'mechanical':{'skill':1,'energy':5,'apparatus':2,'means':1},'wounded':{'in':2},'brer':{'rabbit--who':1},'fact':{'a':1,'about':5,'led':1,'for':1,'that':35,'remains':1,'of':8,'is':16,'less':1,'means.':1,'.':2,'to':1,'so':1,'too':1,'which':1,'in':1,'emphasized':1,'was':1,'the':1},'atmosphere':{'and':4,'heavy':1,'all':1,'from':1,'of':3,'is':1,'it':1,'but':1,'.':4,'will':2,'without':1,'envelops':1,'catch':1,'absorbs':1,'the':1,'rises':1,'was':1,'or':1,'nor':1},'best-defined':{'period':1},'nest-building':{'and':1,'in':1},'woolly':{'rhinoceros':2,'opossum':2,'caterpillars':1},'bring':{'me':1,'about':3,'modern':1,'down':3,'their':1,'forth':2},'14.--the':{'moon':1},'evolutionary':{'prospect':3,'process':1,'results':1,'spiral':1,'tack':1,'steps':1,'significance':1,'method':1,'change':1},'manchester':{'used':1,'chemist':1},'lloyd':{'morgan':4},'rough':{'surfaces':1,'awns':1},'principal':{'of':1,'office':1},'trying':{'time':1,'to':7,'first':1,'it':1,'one':1},'championed':{'evolutionism':1},'jaw':{'and':1,'from':1,'of':3,'belong':1,'seems':1,'but':1,'which':1,'the':1},'jar':{'and':1,'the':1},'should':{'it':2,'see':3,'expect':2,'have':7,'go':1,'find':1,'differ':1,'there':1,'also':2,'naturally':1,'be':19,'get':2,'they':1,'not':4,'fly':1,'remember':1,'gather':1,'say':2,'experience':1,'greatly':1,'think':1,'at':1},'buttons':{'on':1,'occasionally':1},'unpalatable':{'mimicked':1,'insects':1,'things':1,'.':2,'sponge':1,'caterpillars':1,'or':1},'planted':{'in':1},'molecules':{'is':1,'deep':1,'as':1,'are':2,'have':2,'in':2,'250':1,'travel':1,'.':4,'thick.':1,'cling':1,'into':1,'then':1,'which':2,'form':1,'that':1,'cannot':1,'let':1,'by':1,'of':16,'large':1,'small':1,'at':1},'volts':{'.':1},'hope':{'to':1,'that':4,'.':1},'meant':{'a':2,'even':1,'for':1,'many':1,'to':3,'much':2,'utilising':1,'entering':1,'in':1,'the':3,'total':1,'transcending':1,'by':3,'more':1},'handle':{'there':1,'off':1,'than':1,'in':1},'means':{'over':1,'an':3,'in':1,'any':1,'power.':1,'for':3,'no':1,'.':1,'much':1,'girdling':1,'more':1,'we':1,'that':15,'half':1,'losing':1,'a':5,'mastery':1,'of':30,'foresight':1,'were':1,'making':1,'the':5,'first':1},'intellectually':{'.':1},'prohibition':{'against':1},'fronds':{'are':1},'a.c.':{'.':1},'h':{'the':1,';':1,'.':43},'molecule.':{'single':1},'taxes':{'on':1,'.':1},'summon':{'it':1},'hemispheres':{'and':1,'destined':1},'are.':{'for':1},'coco-nut':{'fibre':1,'shell':1,'palm':1},'stuff':{'from':2,'which':1,'into':1,'.':1,'they':1,';':1,'began':1,'out':1},'bayliss':{'has':1},'inter-relation':{'established':1},'memory-image':{'of':1},'tap.':{'watch':1},'strengthened':{'when':1},'frame':{'the':2},'shreds':{'as':1},'packet':{'containing':1,'no':1,'turned':1,'though':1},'elusiveness':{'there':1,'so':1},'bolivia.':{'illustration':1},'5.--diagram':{'showing':1},'once.':{'in':1},'carboniferous':{'blue':1,'flora':1,'forests':1,'period':4,'epoch':1,'eras':1,'were':1,'the':2,'.':1,'era':1},'frog-hoppers':{'while':1},'packed':{'with':1,'together':1},'ascends.':{'illustration':1},'wire':{'or':1,'that':1,'is':1,'an':1,'to':1,'so':1,'they':2,'between':1,'leaves':1,'the':2,'its':1},'growths':{'on':1},'jurassic':{'archaeopteryx':1,'is':1,'period':2,'yellow':1,'era':1,'which':1},'nuclear':{'bodies':1},'migrations':{'were':1,'are':1,'have':1,'occurred':1},'germ-cell':{'just':1},'quickest':{'to':1},'white-hot':{'metal':2,'hydrogen':1,'iron':1,'.':1},'membrane':{'and':1},'open-sea':{'or':1,'animals':4,'cetaceans':1,'crustaceans':1,'young':1,'knife-blade-like':1,'prawns':1,'bacteria':1},'self-preservative':{'fashion':1},'email':{'contact':1,'newsletter':1,'business':1},'ends':{'and':2,'on':1,'of':2,'marked':1,'lizzie':1},'explosive':{'manifesting':1,'life':1,'rush':1,'by':1},'trilobite':{'90':1,'trilobites':1,'in':1},'ancestry--are':{'branches':1},'seaweeds':{'and':2,'among':1,'are':1,'which':1,'growing':1,'the':1},'ignorance':{'of':1,'preyed':1},'wave-motions':{'of':1,'are':1,'can':1},'wingless':{'insects':1,'larval':1,'creatures':1},'hoatzin':{'inhabits':2},'reappears':{'in':1},'restrictions':{'whatsoever':2},'drum':{'to':2},'migration.':{'looking':1},'figures':{'to':1,'we':1,'with':1,'are':3,'.':1},'cinder':{'.':1},'humanoid':{'to':2,'precursors':1,'stock':4},'adjusted':{'on':2,'coloration':1,'in':1},'co':{'.':2},'conflagration':{'had':1,'that':1},'conclude':{'our':1,'that':1},'ca':{'the':1},'mid-rib':{'and':2},'vibration.':{'no':1},'sea-worms':{';':1},'cv':{'the':1},'hawkins':{'from':1},'palm-bones':{'and':1,'the':1,'cmc':1},'8.7':{'procyon':1},'trigger-pulling':{'.':1},'dazzling':{'light':1},'body-cells.':{'it':1},'poured':{'a':1,'on':1},'looting':{'and':1},'duckweed':{'usually':1},'feather':{'as':1,'which':1},'waste':{'matter':2,'energy':1,'to':1,'heat':1,'products':1,'its':1},'descent.':{'retrospect':1},'c.':{'punnett':1},'coherence':{'of':2},'mammals.':{'the':1,'now':1,'what':1,'cretaceous':1},'tycho':{'upper':1},'neighbour':{'succeed':1,'.':1},'accident':{';':1,'.':1},'forests.':{'the':1},'domestication.':{'instinctive':1},'expounded':{'with':1},'spain':{'this':1,'showing':2,'179':1,'show':1},'gradual':{'building':1,'unfolding':1,'evolution':1,'establishment':1,'alterations':1,'sifting':1,'increase':2,'migration':1,'emancipation':1,'shading':1,'assortment':1,'ascent':1,'emergence':1,'change':2},'nerve-fibre':{'branches':1,'ends':1,'s.f.':1,'from':1,'or':1},'triggers':{'of':1},'reminiscence':{'as':1},'lung-fishes':{'or':1,'that':1},'lichen':{'and':1,'where':1},'pictures':{'guesses':1,'for':1,'that':1,'of':1,'.':2,'they':1,'the':1},'deductible':{'to':1},'discoveries':{'made':2,'which':2,'that':1,'of':4,'.':1,'have':2,'in':2},'spectrum--should':{'be':1},'salmo':{'all':1},'omne':{'vivum':1},'vm':{';':1},'adventures':{'at':1},'excessively':{'small':1,'minute':3},'raison':{'d':1},'jenner':{'weir':1},'carbohydrates':{'e.g':1},'of.':{'a':1},'fashioning':{'of':1,'beautifully':1},'spends':{'the':1},'romance':{'of':5,'to':1},'concealed':{'among':1,'beneath':1},'colony.':{'within':1},'estuaries':{'and':3,'while':1,'are':1,'penetrated':1},'outbreak':{'must':1},'nebulae.':{'some':1,'illustration':1,'in':1},'unimaginable':{'energy':1},'lichen;':{'one':1},'mud-skipper':{'periophthalmus':3},'emotionally':{'excited':1},'dusk':{'of':1,'is':1,'does':1},'wisest':{'not':1},'upon':{'it.':1,'a':3,'them':1,'another':1,'marquis':1,'insects':1,'men':1,'request':1,'it':3,'one':1,'water':1,'and':1,'as':1,'itself':1,'they':1,'the':26,'an':1,'its':3,'by':2},'v.':{'experiential':1},'infinite':{'temporal':1,'space':2,'in':1,'number':1,'time':1},'britain.':{'iv':1},'identity':{'of':1},'transformation--the':{'heat':1},'genus':{'eoanthropus':1,'oncorhynchus':1,'which':1},'off':{'and':1,'the':19,'into':1,'as':2,'at':2,'another':1,'in':4,'throughout':1,'fine':1,'again':1,'rays':1,'from':8,'intruders':2,'.':3,'other':1,'crowds':1,'neolithic':1,'his':1,'intruding':1,'half':1,'such':1,'by':3,'a':4,'on':1,'natural':1,'this':1,'of':1,'electrons':1,'gigantic':1},'mention':{'briefly':1,'the':1,'one':1},'tinge':{'is':1,'.':1},'colour':{'and':9,'almost':1,'is':1,'as':1,'in':1,'affects':1,'that':1,'.':6,'also':1,'does':1,'permanently':1,'disclosed':1,'which':1,'has':1,'seen.':1,'gives':1,'be':2,'corresponding':2,'means':1,'becoming':1,'with':1,'a':1,'being':1,'yellow-brown':1,'of':8,'depends':1,'the':1,'changes':2},'polyp':{'about':1},'directly.':{'some':1},'patterns':{'.':1},'cutting':{'down':1,'off':1,'at':1},'ear-passage':{'to':1,'into':1},'drawing':{'a':1,'shows.':1,'planetesimals':1,'food':1,'flying':1,'their':2,'by':4,'shows':2},'asymmetrical':{'flat-fish':1},'reefs':{'that':1},'negligence':{'strict':1},'flesh':{'and':2,'exposed':1,'of':1,'but':1,'are':1,'or':1,'available.':1},'moments':{'at':1},'gulls':{'pick':1},'flywheel':{'a':1,'and':1,'would':1,'.':2,'or':1,'if':1},'sea-dust':{'and':1,'always':1,'which':1,'.':1},'rooms':{'but':1},'predicts':{'the':1},'years':{'and':3,'required':1,'ago--a':1,'acquired':1,'life':1,'comprised':1,'1921':1,'as':1,'are':1,'in':4,'old':2,'yet':1,'before':4,'mercury':1,'invented':1,'would':1,'till':1,'with':1,'there':1,'.':13,'to':7,';':2,'must':1,'we':1,'ago.':3,'may':2,'after':1,'reached':1,'but':2,'it':1,'sink':1,'during':1,'elapsed':1,'dr':1,'he':1,'ago':28,'for':1,'these':1,'of':4,'work':1,'dealt':1,'the':4,'or':1},'paul':{'s':1},'glue':{'probably':1},'web':{'on':1,'of':2,'is':3,'site':4,'page':1,'which':1,'has':1,'pages':1},'generous':{'to':1,'lines':1,'if':1},'bibliography':{'elmhirst':1,'the':2,'darwin':1,'arrhenius':1},'lanugo':{'which':1},'apple--out':{'of':1},'transparent':{'layers':1,'all':1,'coating':1,'arrow-worm':1,'early':2,'azure':1,'open-sea':1},'ichthyosaurs':{'plesiosaurs':1},'combine':{'and':1,'to':1},'wet':{'cloth':1,'all':1,'weather':1,'moss':1},'5':{'and':1,'what':1,'has':1,'ft':1,'limbless':1,'1909':2,'mind':1,'per':1,'.':8,'feet':2,'matter':1,'000':5,'5':1,'in':1,'the':1,'mimicry':1,'500':1,'shows':1},'practise':{'self-effacement':1,'parental':1},'increased':{'power':1,'freedom':1,'its':1,'liberation':1,'masterliness':1,'difficulties':1,'at':1,'in':1,'our':1,'the':2,'still':1,'by':1,'production':1},'government':{'or':1},'biologists':{'have':1,'that':1},'new--a':{'restless':1},'smithsonian':{'report':10},'mathura':{'on':1},'increases':{'our':1,'.':1,'in':1},'five':{'digits':1,'hundred':3,'minutes':1,'of':1,'million':1,'times':3,'feet':1,'to':1,'straws':1,'she':2,'in':1,'--and':1,'vertebrae':1,'years':1,'.':1,'or':3,'millions':1},'belgium':{'the':1},'tick':{'a':1,'for':1,'one':1},'descendant':{'of':2},'backboned':{'race':1,'animals':9,'animals.':1},'onion':{'round':1},'258':{'the':1,'electrons':1},'parasite':{'and':1,'to':1,'from':1,'like':1},'glass-eels':{'about':1},'two-thousandths':{'of':1},'ductless':{'glands':2},'nerves':{'and':1,'of':1,'which':1,'.':1},'inexperienced':{'enemies':1},'replacement':{'of':1,'copy':2,'or':3},'gaining':{'a':1,'strength':2},'indications':{'even':1},'habitat':{'and':1,'penetrate':1,'or':1},'underwent':{'great':1,'an':1},'gossamer.':{'on':1},'daylight':{'.':1},'choosing':{'times':1},'paving-stones':{'green':1},'restlessness.':{'they':1},'transport':{'as':1},'avoid':{'a':1,'the':2,'reading':1},'dago':{'dagoes':1},'mars.':{'but':1},'does':{'we':1,'no':1,'this':4,'energy':1,'comparatively':1,'it':2,'but':1,'.':3,'much':1,'so':4,'at':2,'cannot':1,'in':1,'not':35,'the':1,'its':1},'passion':{'plunged':1},'cylindrical.':{'5':1},'mammoth.':{'the':1},'biology':{'of':1,'in':1},'blowing':{'upon':1},'predispositions':{'to':1,'of':1},'selecting':{'individual':1,'out':1},'tenability':{'of':1},'performances.':{'a':1},'pressure':{'and':2,'would':1,'inside':1,'so':1,'in':2,'the':2,'etc.':1,'currents':1},'enregistering':{'these':1,'the':1,'within':1},'century.':{'during':1,'illustration':2},'abdominal':{'ribs':1},'germination':{'and':1},'r':{'and':1,'.':14},'cribb.':{'boiling':1,'transformation':1},'hiding':{'them':1},'gained':{'most':1,'racial':1,'considerable':1,'proof':1},'mammoths':{'.':1},'asks':{'at':1,'why':1,'that':1},'seeds':{'and':1,'because':1,'for':1,'of':3,'.':1,'can':1,'become':1,'themselves':1,'with':1},'bounded':{'by':1},'swimming':{'and':2,'gently.':1,'experience':1,'ostrich':1,'persons':1,'near':1,'in':5,'diving':1,'across':1},'letters':{'of':2,'in':1},'elephants.':{'the':1},'hermit-crabs':{'hide':1,'place':1,'it':1,'have':1},'lung':{'and':1,'the':1,'.':1},'tiny':{'knob':1,'bags':1,'freshwater':1,'rill.':1,'irregular':1,'shift':1,'molecules':1,'fragments':1,'drops':1,'whirlpool':1},'cultivated':{'plants':6,'the':1,'wheat':1,'ear.':1,'in':1},'protozoa':{'and':2,'to-day':1,'which':1,'is':1,'should':1,'to':1,'as':1,'are':1,'sponges':1,'in':2,'animals':1,':':1,'like':1},'offices.':{'sec':1},'swimmers':{'and':2,'include':1,'nekton':1},'charities':{'and':1},'mere':{'density':1,'molluscs':1,'bulk':1,'visible':1,'cooling':1,'specks':1,'position':1,'association':1},'parentage':{'of':2},'67000':{'inch':1},'larvae':{'hanging':1,'or':1,'which':3,'in':1},'slow-worm':{'is':1},'half-monkeys':{'or':1},'larval':{'state':1,'stages':2,'salmon':1,'period':1,'stage':1},'spots':{'and':1,'on':2,'like':1,'of':1,'or':1,'increase':1,'are':1,'which':1,'the':2,'where':1,';':1,'must':1},'scanty':{'remains':2,'and':1,'fossil':1,'plankton':1},'recognised':{'and':1,'for':1,'as':1,'in':2,'moreover':1,'by':2},'hundred-millionth':{'of':1},'place.':{'illustration':1,'one':1},'specimens':{'of':1,'in':1,'were':1},'naturally':{'prolific':1,'give':1,'trails':1,'finds':1,'expect':1,'came':1,'appears':1,'opens':1,'he':1},'function':{'of':1,'in':1},'funnel':{'through':1},'cosmopolitan':{'in':1},'surgeons.':{'every':1},'washerwoman':{'and':1},'construction':{'underwent':1,'from':1,'of':2},'convergence':{'the':1},'basin':{'of':1},'contraction.':{'uranium':1},'count':{'them':1,'the':1,'for':3},'marquis':{'wheat':4,'.':1},'evident':{'in':1},'shrunk':{'by':1},'gravitational':{'pull':2,'influence':2,'theory':1,'attraction':2},'official':{'project':1,'observatory':1,'version':1,'page':1},'smooth':{'continuance':1,'carapaces':1,'formation':1,'atoms':1},'triumphant':{'flight':1},'excitement':{'though':1,'.':1},'placed':{'a':1,'on':3,'them':2,'for':1,'exactly':1,'an':1,'to':1,'at':1,'in':2},'frugivorous':{'stock':1},'convince':{'us':1},'monument':{'of':1},'problem':{'no':1,'of':10,'could':1,'.':2,'as':1,'surely':1,'the':1,'is':2},'profusion':{'.':1},'bearing':{'protrusible':1,'on':1,'batteries':1,'this':1,'the':1},'irish':{'elk':1},'ferocious.':{'embryological':1},'recognize':{'water':1},'nearness':{'to':1,'of':2},'rubble':{'innumerable':1},'faintness':{'.':1},'slowing':{'down':8,'down--the':1},'arms.':{'this':1},'beach.':{'but':1},'leptocephalus.':{'2':1},'aristotle':{'observed':1,'s':1,'or':1},'ink':{'in':1},'www.gutenberg.org':{'this':1,'title':1,'you':1,'2':1,'1.e.2':1},'effected':{'a':2,'within':1,'by':3,'in':1},'planting':{'it':1},'expensiveness':{'of':1},'readjustments':{'of':1},'radiolarians':{'and':1,'of':1,'with':1},'variety':{'and':1,'of':16,'is':1,'after':1,'surpassed':1,'.':2,'has':1,'with':1},'tenth':{'printing':1},'eastern':{'baltic':1},'forests':{'and':2,'a':1,'from':1,'which':1,'that':1,'of':4,'there':1,'.':1,'roamed':1,'in':1,'the':2,'he':1},'slumbers':{'in':1},'reach.':{'animal':1},'details':{'of':2,'is':1,'revealed':1},'behold':{'a':1},'thickness--a':{'sea':1},'outlines':{'of':1,'at':1,'spectroscopy':1},'repeat':{'all':1,'gives':1,'that':1},'again.':{'moreover':1,'illustration':2,'that':1},'in:':{'http:':1},'tides':{'and':3,'we':1,'which':2,'than':1,'of':1,'had':1,'it':1,'but':1,'.':6,'will':1,'to':1,'ranked':1,'are':4,'have':1,'act':1,'at':1,';':1,':':1,'the':1,'290':1,'must':1},'casque':{'is':1},'subtlest':{'of':1},'again:':{'the':1},'in.':{'with':1},'13.--saturn':{'november':1},'ideals':{'which':1,'in':2},'shattering':{'itself':1},'veil':{'of':1},'coloration':{'and':1,':':2,'is':1,'when':1,'serves':1,'coloured':1,'will':1,'the':1,'.':1,'or':3},'exposure':{'to':1,'of':1},'draperies':{'gliding':1},'bivalve':{'mollusc':1,'shell.':1},'lasted':{'beyond':1,'or':1,'for':1},'rule':{'and':1,'feed':1,'we':1,'that':1,'is':1,'two':1,'exist':1,'in':1,';':1,'out':1},'eddies':{'of':1,'rising':1},'pitt':{'offered':1},'gardens':{'in':1},'practicability':{'of':1},'three-toed':{'horse':2},'surrounding':{'stimuli.':1,'space':2,'colour':1,'flesh':1,'them--are':1,'sky--this':1,'world':1,'the':2,'gravel':1,'conditions':1,'ether':1,'bodies':1},'magnetic':{'force':1,'storm':1,'circuits':1,'phenomena':1,'sense':1,'storms':2,'effect':1,'deflection':2,'field':7,'circuit':2,'field--which':1,'action':1},'saves':{'their':1},'desirable':{'for':1},'rapid':{'and':3,'abbreviation':1,'precisely':1,'often':1,'power':1,'striking':1,'colour-change':3,'series':1,'that':2,'passage':1,'motion':1,'as':1,'way':1,'waves--the':1,'elimination':1,'succession':1,'changes':1,'than':1,'change':1,'movement':1},'nursery':{'for':1},'controversial':{'stage':1},'crete':{'greece':1},'oldest':{'known':3,'of':1,'rocks':1,'stars':1,'egyptian':1},'worked':{'flints':1,'up':1,'itself':1,'steadily':1,'the':1,'by':1,'out.':1,'out':8},'1915.':{'a':1,'magnetic':1,'electrons':1,'geological':1},'ceases':{'to':1,'.':1},'physiological':{'life':1,'expensiveness':1,'point':1,'equilibrium':1,'partnership':1,'evidence':1,'characters.':1,'inequilibrium':1,'action':2,'difference':2,'types':1,'proof':1},'ventral':{'lungs':2,'scales':1},'centrosome':{'introduced':1},'neighbours':{'of':1,'.':1},'microscopist':{'named':1},'mckready':{'a':1},'diverted':{'into':1},'worth':{'remembering':1,'dwelling':1,'having':1,'.':1},'alternating':{'current':1,'occurrence':1,'yellow':2},'them--which':{'give':1},'aurora':{'borealis':4,'is':1},'waters--the':{'dry':1},'impinged':{'on':1},'coal-measures':{'the':2,'were':1},'alevins':{'which':1},'slowed':{'down--sometimes':1},'exaggerate':{'the':1},'pinch':{'of':2},'cmc':{';':1},'globule':{'about':1},'nondescript':{'not':1},'jungle-fowl':{'of':1},'290':{'photo':1,'the':1},'291':{'photo':1},'dwindled':{'away':1,'vestiges':1},'speck':{'of':2,'against':1},'tree-kangaroos':{'tree-sloths':1},'labyrinthodonts':{'some':1},'surmounting':{'the':1},'overlying--the':{'photosphere':1},'seas.':{'perhaps':1,'evolution':1,'like':1,'recent':1},'microscopists':{'and':1},'------':{'------':2,'866400':1,'2163':1},'others.':{'1.d':1},'them--are':{'of':1},'alsatian':{'wolf-dog':2},'neap':{'tides':1},'580':{'000':1},'calcium':{'vapour':1},'gatepost':{'208':1,'the':1},'lizard':{'which':2,'is':1,'they':1,'chlamydosaurus':1,'draco':1,'called':1},'consequent':{'changes':1,'aridity':1},'lampreys':{'petromyzon':2},'glands':{'notably':1,'such':1,'of':1,'on':1},'salt-accumulation':{'is':1},'reconstruction':{'of':2,'by':2},'toll':{'to':1},'suppose':{'for':1,'that':8,'it':1,'at':1,'each':1,'the':2},'consisting':{'of':2},'told':{'edited':1,'in':1,'author':1,'us':1,'that':1},'crunch':{'with':1},'machine.':{'a':1},'simultaneously':{'.':1},'sinks':{'down':1,'again':1,'and':1,'into':1},'lithosphere':{'is':1},'human':{'and':1,'embryo':7,'development.':1,'ingenuity':1,'being':2,'sense':1,'mind':2,'society':1,'beings':2,'thought.':2,'in':3,'knowledge.':1,'use':1,'eye':2,'ovum':1,'remains':2,'.':1,'tail':1,'civilisation.':1,'progress':5,'type':1,'body':3,'progress.':1,'kind':1,'gestures':1,'races':1,'blood':3,'characters':1,'ear':2,'mind.':1,'evolution':1,'branches':1,'evolution--factors':1,'skull':4,'brain':4,'was':2,'ascent.':1,'face':1,'race':3,'limit':1,'qualities':1,'teeth':1,'life.':1,'institutions':1},'kindred':{'and':1,'on':1,'animals':1,'especially':1,'.':1},'residual':{'gases':1},'out-flowing':{'lobes':1,'processes':1},'protection':{'for':1,'of':2,'possessed':1,'.':1,'also--protection':1,'implied':1,'every':1,'before':1},'pursuit':{'and':1},'ploughed':{'field':1},'promiseful':{'life':1},'obtained':{'our':1,'by':1,'would':1,'.':1},'aerial.':{'the':1},'daughter':{'colonies':1},'items':{'and':1,'among':1,'are':1,'tend':1},'frog-hopper':{'becomes':1,'makes':1},'anchor':{'.':1},'smoke':{'a':1,'no':1,'in':1,'that':1},'browsing':{'by':1},'bettered':{'surroundings':1},'otters':{'and':1,'it':1,'foxes':1},'glittering':{'points':1},'diameter':{'and':1,'for':1,'of':7,'is':2,'there':1,'number':1,'.':4,'lifts':1,'are':1,';':2,'one':1,'whereas':1},'secure':{'a':1,'and':1,'that':1,'survival':1,'evidence.':1,'position':1,'the':4,'floating':1},'discontinuous':{'variation':1},'-cell':{'with':2},'highly':{'probable':8,'endowed':1,'interesting':1,'magnified.':1,'developed':3,'probably':1,'intelligent':1,'specialized':2,'perfected':1},'lafayette.':{'the':1},'opportunities':{'to':1,'animals':1,'for':1,'.':1},'glance':{'at':1},'total':{'loss':1,'or':1,'of':2,'energy':1,'number':1,'thickness':2,'amount':1,'solar':2,'emancipation':1,'length':1,'age':1,'as':1,'quantity':1},'experimentation':{'in':1},'plot':{'at':1},'answers-back':{'that':1},'alligator':{'yawning':2},'grounds':{'of':1,'.':1},'negative':{'and':1,'electricity':10,'electricity.':1,'taken':1,'pole':2,'are':1,'units':1,'the':1},'reid.':{'sir':1,'common':1},'crocodilian':{'various':1},'mightiest':{'elevators':1},'knoll':{'and':1},'girdling':{'the':2},'thorndike':{'s':1,'says':1,'hits':1,'is':1},'recuperate':{'by':1},'separated':{'from':2,'freshwater':1,'off':4,'by':1,'.':2},'traceable':{'back':1},'ascribe':{'it':1},'aware':{'of':7,'that':1},'separates':{'the':1,'monkeys':1,'it':1},'continual':{'sinking':1,'motion':1,'motion.':1,'occurrence':1},'allies':{';':1,'in':1},'dando.':{'orang-utan':1,'young':1,'chimpanzee':1},'society.':{'professor':2},'twenty-one':{'miles--in':1},'antenna-bearing':{'segmented':1},'crest':{'to':4,'.':1,'so':1,'or':1,'of':1},'books.':{'each':1},'work':{'and':7,'associated':2,'is':6,'within':1,'as':1,'in':8,'any':1,'electronically':2,'out':2,';':2,'from':1,'recorded':1,'.':10,'to':2,'offers':1,'which':1,'under':1,'you':2,'if':1,'badly':1,'that':1,'may':1,'with':1,'by':1,'on':3,'b':1,'of':6,'well':2,'against':1,'without':2,'can':1,'the':3,'or':8},'eclipse':{'may':2,'of':7},'worm':{'invasion':1,'the':1,'on':1,'.':1},'worn':{'down':1,'and':1},'theories':{'may':1,'of':5,'to':1,'have':1,'dispense':1,'put':1},'mammalian':{'heart':1,'evolution':1,'mother':1,'golden':1},'eighteen':{'to':1},'era':{'and':2,'what':1,'there':1,'miocene':1,'jurassic':1,'of':2,'silurian':1,'when':1,'corresponds':1,'.':6,'in':3,'after':1},'transparency':{'or':1},'already':{'a':2,'existed':1,'we':1,'learnt':1,'likened':1,'spoken':1,'use':1,'dead':1,'and':1,'known':1,'been':1,'have':1,'mentioned':1,'seen':1,'the':1,'referred':2,'at':1},'ascetic':{'non-growing':1},'radiance':{'from':2},'indicated':{'to':1,'by':3,'in':1},'cited':{'as':1},'india':{'146':1,'and':1,'into':1,'it':1,'malay':1,'persia':1,'.':1},'indicates':{'a':3,'the':2},'fanciful':{'imaginings':1},'present-day':{'and':1,'forms':1,'animals':1,'science':1,'theories':1,'survivors':1,'mud-fishes':1},'immemorial.':{'in':1},'aerated':{'and':1},'handiness.':{'the':1},'inhabitants':{'of':2,'is':1},'finger-post':{'on':1},'crumbs':{'from':3},'egyptian':{'tombs':1},'nuts':{'these':1,'it':1,'193':1,'for':1},'makes':{'a':4,'and':1,'for.':1,'for':1,'no':2,'this':1,'adjusting':1,'some':1,'it':5,'us':1,'an':1,'against':1,'the':9,'tree-stems':1,'its':3,'more':1},'far':{'and':1,'less':1,'over':3,'back':1,'as':9,'at':1,'in':1,'south.':1,'beyond':1,'out':1,'given':1,'end':1,'for':1,'away':2,'since':1,'exceeding':1,'been':1,'.':2,'behind':1,'too':4,'above':2,'surpasses':1,'east':3,'more':5,'north':3,'greater':1,'that':1,'from':6,'transcending':1,'advanced':1,'on':1,'off':1,'ahead':1,'up':2,'below':2,'swing':1,'the':3,'south':1},'aerates':{'the':1,'them':1},'ordinary':{'fish':1,'tissues':1,'flower-vase':1,'single':1,'questions':1,'education':1,'tadpoles':1,'temperature':1,'chemical':1,'way':2,'mammals':1,'conditions':1,'protozoon':1,'life':2,'star':1,'wheats':1,'big':1,'routine':1,'pressure':1,'routine--not':1,'bony':1,'cells':2,'standards':1,'matter':3,'familiar':1,'mammal':1,'acceptation':1},'beach':{'which':1,'.':1},'gamble':{'writes':1,'continues':1},'discoveries.':{'already':1},'guanin':{'.':1},'fever':{'and':1},'transforming':{'the':1},'ladder':{'of':3},'after':{'and':1,'all':2,'they':3,'generation':1,'some':1,'it':1,'an':1,'satisfaction':1,'itself':1,'well-being':1,'lull':2,'another':7,'our':1,'repeated':1,'its':2,'what':1,'death':1,'fuller':1,'her':1,'cache':1,'hour':1,'by':1,'their':2,'millennium':1,'which':1,'marsh':2,'sojourning':1,'he':2,'head':1,'his':2,'branch':1,'undergoing':1,'that':2,'max':2,'william':2,'fritz':1,'five':1,'nearly':1,'birth':2,'new':1,'fifteen':1,'themselves':1,'man':1,'a':10,'spawning':2,'exposing':1,'being':1,'this':1,'floods':1,'professor':2,'prolonged':1,'element':1,'planet':1,'race':1,'t':2,'mr':1,'the':14,'marsh.':2,'wandering':1,'age':2,'lloyd':1},'movable':{'tongue':1,'.':1},'customs':{'point':1},'lay':{'their':2,'eggs':1,'there':1,'them':1,'emphasis':1},'outbursts':{'of':2,'have':1},'maxim:':{'it':1},'law':{'of':3,'.':1,'in':1,'but':1,'that':1},'meaningful':{'situation':1},'nipped':{'in':1},'elusive':{'and':1,'.':1},'cools':{'to':1},'appreciate':{'water':1,'a':1,'the':1},'greek':{'helios':1,'logos':1,'word':1,'tortoise':1,'eagle':1,'alphabet':1,'philosophers':1,'meaning':1,'thinkers':1},'verb':{'to':1},'green':{'chlorophyll':1,'yellow':1,'in':3,'plants.':1,'blue':2,'flagellates--the':1,'surroundings':1,'variety':1,'tree-snake':1,'frog':1,'hydra':2,'herbage':1,'plants':2,'ball':1,'seaweeds':1,'pigment':2,'ones':1,'phase':1,'box':1,'on':1,'grains':1,'of':1,'leaves':2,'lizard':1,'alga':1,'or':2},'parish':{'to':1},'coral-snake':{'can':1},'order':{'and':2,'than':1,'that':1,'diverging':2,'of':12,'is':1,'.':1,'to':4,'in':1,'the':1,'monkeys':1},'sandstones':{'and':2,'mudstones':1},'office':{'is':2},'borealis':{'the':1,'is':1,'would':1,'coloured':1},'satisfied':{'with':1},'pascal':{'s':1},'ancients':{'seem':1,'were':1},'japan':{'to':1},'bubbles':{'which':1},'breeding-place':{'represents':1,'corresponds':1},'yellow-crowned':{'penguin':2},'sheaf':{'of':2},'production':{'of':3,'as':1,'promotion':1},'precipitate':{'when':1,'which':1,'.':2},'split':{'so':1,'off':1,'up':5,'longitudinally.':1},'then':{'there':5,'rubs':1,'they':2,'able':1,'is':3,'violet':1,'it':8,'are':2,'have':2,'another--to':1,'consists':1,'follow':1,'intact':1,'find':1,'waited':1,'for':1,'may':1,'since':2,'uranium':1,'to':4,'another':1,'has':1,'sent':1,'supposed':1,'be':3,'we':3,'partly':1,'that':2,'our':1,'pecked':1,'took':1,'drew':1,'sprinkle':1,'imperfectly':1,'visits':1,'although':1,'endure':1,'dives--':1,'diminish':1,'unless':1,'he':2,'illustration':1,'perceived':1,'necessary':1,'succeeded':1,'wafts':1,'follows':1,'inhabiting':1,'departs':2,'a':2,'so':1,'red':1,'the':7,'round':1,'comes':1,'arose':1},'them':{'and':9,'the':3,'penetrating':1,'on':2,'insulators':1,'stream':1,'show':2,'is':2,'fall':1,'an':1,'down':1,'against':1,'as':3,'116':1,'including':1,'are':7,'have':4,'in':9,'protecting':1,'32':1,'before':2,'even':1,'sir':1,'he':1,'astronomy':1,'from':2,'would':1,'no':1,'perhaps':1,'deeply':1,'away':1,'there':1,'when':2,'off':1,'.':19,'up':2,'to':8,'call':1,'which':1,'black':1,';':2,'sluggish.':1,'was':1,'until':1,'more':1,'weigh':2,'that':2,'may':1,'after':1,'bipeds--we':1,'illustration':1,'were':1,'jumping':1,'if':1,'know':1,'they':1,'coming':1,'such':1,'now':1,'with':2,'by':2,'apart':1,'a':2,'both':1,'about':1,'give':1,'for':2,'indifferent.':1,'face':1,'always':1,'into':1,'but':1,'namely':1,'together':1,'grows':1,'though':1,'electrically':1,'conquer':1,'gigantic':1,'requires':1},'affected':{'by':4},'babies':{'born':1},'fragment':{'of':2},'locusts':{'and':1,';':1},'safe':{'and':1,'among':1,'both':1,'situations':1,'to':5,'as':1,'cradle':2,'in':2},'fabre.':{'a':1,'the':1},'young.':{'our':1,'the':1,'sec':1},'band':{'of':1,'across':1},'giraffe':{'the':1,'s':1,'coloured':1},'reconverted':{'in':1},'sack':{'of':1},'they':{'represent':2,'all':2,'show':4,'move':1,'soon':1,'go':2,'find':1,'seemed':1,'derive':1,'also':3,'swam':2,'had':5,'send':1,'actually':1,'only':1,'persist':1,'practise':1,'happened':1,'grip':1,'eventually':1,'return':1,'get':2,'propelled':1,'cannot':3,'please.':1,'affect':1,'now':1,'possess':3,'perceived':1,'showed':1,'called':1,'did':3,'die':2,'seldom':1,'hunt':1,'settle':1,'found':2,'require':1,'enjoy':1,'successively':1,'often':1,'began':3,'resist':1,'imply':1,'decided':1,'are':130,'pass':4,'differ':2,'what':1,'said':1,'stood':1,'appear':2,'served':1,'tend':1,'attracted':1,'experiment':1,'radiated':1,'got':1,'learned':1,'ever':1,'correct':1,'can':13,'crunch':1,'obey':1,'never':1,'analysed':1,'disappeared':2,'were':27,'succeed':1,'let':1,'sink':1,'become':3,'put':2,'wanted':1,'come':1,'tenant':1,'receive':1,'could':4,'keep':1,'turn':1,'range':1,'act':2,'usually':1,'think':1,'feed':3,'emerge':1,'secure':1,'render':1,'point':1,'walk':1,'fast':1,'sow':1,'beheld':1,'reached':1,'illustrate':3,'use':1,'would':9,'create':1,'breed':1,'vibrate':1,'mark':1,'swarm':1,'call':1,'too':2,'then':1,'strike':1,'inflate':1,'tell':1,'therefore':1,'manufacture':1,'enable':1,'form':4,'fall':1,'corresponded':1,'must':5,'count':1,'account':1,'include':1,'look':3,'consist':2,'wish':1,'mount':1,'originate':1,'see':1,'will':5,'remain':1,'supposed':1,'learn':1,'meet':1,'emit':1,'and':1,'sometimes':2,'proved':1,'do':9,'likewise':1,'escape':2,'say':1,'have':33,'need':3,'seem':4,'made':6,'cool':1,'occur':1,'fill':1,'lie':1,'squat':1,'migrated':1,'built':1,'deserve':1,'travel':2,'generally':1,'extracted':1,'split':1,'test':1,'roll':1,'begin':2,'may':12,'absorb':1,'knew':1,'reach':5,'gradually':2,'reflect':1,'produce':2,'develop':1,'grow':1,'died':1,'varied':1,'cause':3,'give':4,'remember':1,'resemble':2,'nevertheless':1,'register':1,'appreciate':1,'correspond':1,'walked':1,'directly':1,'justify':1,'make':3,'came':1,'left':1},'molecules.':{'there':1,'illustration':1},'lifelong':{'study':1,'external':1},'bank':{'and':3,'or':1,'.':1},'bread':{'of':1},'1.00':{'7918':1},'rocky':{'shore-pool':1,'peninsula':1,'slopes':1},'oxygen':{'and':1,'available':1,'form':2,'of':1,'.':3,'to':1,'dissolved':1,'at':1,'which':1,'in':1,'taken':1,'than':1},'respiration.':{'illustration':1},'reasonably':{'that':1,'interpreted':1},'classified':{'.':1},'backgrounds':{'such':1},'l':{'bearing':1,'.':3},'rocks':{'and':4,'on':1,'since':1,'like':1,'may':1,'of':1,'is':2,'there':1,'according':1,'but':1,'.':1,'to':1,'were':1,'so':1,'are':1,'have':1,'which':1},'--':{'fig':1,'moon':1},'reasonable':{'objection':1,'to':1,'compass':1,'fee':1,'view':1},'heaved':{'off':1},'feeds':{'on':1,'are':1,'.':1},'associative':{'cell':1,'or':2,'learning.':1},'lifted':{'into':1,'off':1},'shows.':{'sec':1},'voyages':{'discovering':1},'prawn':{'hippolyte':1,'s':1,'takes':1,'.':1},'12.--jupiter':{'showing':1},'webbed':{'fingers':1},'pigments':{'enable':1,'compounded':1},'network':{'of':4},'forty':{'seconds':1,'inches.':1,'minutes':1,'inches':1},'fellows':{'can':1},'strangers':{'it':1},'vulgalis':{'1':1},'moisture':{'and':1,'heat':1,'about':1,'in':1},'medicine':{'but':1},'forth':{'and':1,'on':1,'.':1,'their':1,'in':8,';':1,'its':2,'the':1},'swamped':{'by':1},'disputed':{'whether':1,'and':1,'that':1},'nowadays':{'called':1,'an':1},'built.':{'illustration':1},'tops':{'of':1},'monkeys--activity':{'both':1,'for':1},'sunning':{'her':2},'admits':{'of':1},'forcibly':{'ejected':1},'detecting':{'a':2,'this':1,'the':1,'by':1,'its':1},'nebulae':{'and':1,'we':1,'from':1,'like':1,'would':1,'may':1,'is':1,'there':1,'it':1,'.':1,'as':1,'promise':1,'fig':1,'besides':1,'such':1,'are':5},'rarity':{'of':3},'created':{'to':1,'from':2,'or':2,'nor':1,'in':1},'appendages':{'and':1,'the':1},'shunted':{'.':1},'creates':{'a':1},'baltic':{'to':1,'.':1,'must':1},'clouding':{'after':1},'18.--a':{'diagram':1},'render':{'the':1},'synonymous':{'with':1},'another':{'remarkable':1,'feature':1,'aspect':1,'cuts':1,'glimpse':1,'source':1,'factor':1,'save':1,'very':1,'specimen':1,'they':1,'sowing':1,'lost':1,'solution':1,'truth':1,'works':1,'side':3,'fascinating':1,'series':1,'mighty':1,'are':1,'flower':1,'plays':1,'for':1,'though':1,'expressed':1,'experiment':1,'new':1,';':1,'method':2,'note--that':1,'fourteen':1,'on':1,'of':2,'distinguished':2,'thing':1,'s':1,'tack':1,'place':2,'consequence':1,'or':1,'inducing':1,'ring':1,'quality':1,'from':2,'one--of':1,'there':2,'.':10,'way':6,'was':1,'that':1,'four-toed':1,'but':1,'part':4,'solar':1,'with':1,'flightless':2,'kind':2,'has':1,'word':1,'example':2,'acquisition':2,'and':8,'is':1,'modern':1,'it':1,'deep':1,'high':1,'as':1,'in':2,'turn':1,'possibility.':1,'till':2,'amoeba':1,'star':3,'trundles':1,'molecule':1,'effect':1,'offshoot':1,'important':1,'interval':1,'portion':1,'time':2,'the':1,'having':1,'lying':1},'twig-like':{'angle':1},'thick':{'for':1,'as':1,'but':1,'.':1,'enough':1,'treacly':1,'in':1,'mist':1,'or':1,'vapours':1},'tangle':{'of':1},'electronic':{'constitution':1,'cyclones':1,'work':11,'works.':1,'activity':1,'works':15},'illustrate':{'a':1,'evolution':1,'natural':1,'we':1,'.':1,'the':6},'power.':{'the':1},'approximately':{'and':1,'equally':1,'22':1,'calculated':1,'twenty-seven':1,'to':3,'278':1},'youthfulness':{'a':1},'colossal':{'expenditure':1,'family':1,'reservoir':1},'accretion':{'may':1,'of':1},'compromise':{'is':1},'observations':{'bearing':1,'showing':1,'he':1,'furnish':1,'of':1},'inflate':{'their':1},'john':{'and':1,'dalton':1,'the':1,'murray':3,'dewey':1},'dogs':{'are':1,'do':1,'for':1,'have':1,'elephants':1},'kiwi':{'another':2},'intestine':{'with':1},'happily':{'included':1},'diversified':{'ooze':1},'rejected':{';':1},'nurse-frog':{'alytes':1},'scorpions':{'and':2},'cereal':{'.':2},'corresponded':{'to':1},'flightless':{'and':1,'toothed':2,'bird':2,'wings':1},'greater.':{'and':1},'guile':{'illustration':1},'magnet':{'and':1,'a':1,'is':4,'there':1,'.':4,'to':1,'62':1,'279':1,'the':2,'282':1,'lifting':1},'air.':{'the':1,'iv':1},'preformed':{'weak':1,'bandage':1},'damage.':{'1.f.3':1,'it':1},'unmistakably':{'to':1},'iron':{'and':2,'copper':2,'last.':1,'an':1,'are':1,'in':1,'further':1,'blue':1,'for':1,'behaves':1,'should':1,'to':1,'which':1,'you':1,'has':1,'until':1,'filings':2,'but':1,'would':1,'age':1,'will':1,'or':2,'attracting':1},'tackled':{'a':1},'contrasted':{'with':3},'powers':{'156':1,'of':1,'is':1,'.':1,'note':1,'hitherto':1},'encumbered':{'with':1,'by':1},'regulus':{'98.8':1},'respecting':{'the':1},'lull':{'and':2,'organic':1,'calls':1,'to':1,'s':1,'describes':1,'the':1,'r':1,'points':1},'vigorous':{'and':2,'palaeolithic':1,'as':1,'but':1,'race--many':1,'race':1,'animal':1,'the':1},'contents':{'introduction':1,'is':1},'forced':{'to':1,'the':1,'molten':1},'strength':{'and':1,'enormous':1,'prompted':1,'unabated':1,'of':1,'able':1,'to':1,'in':1,'the':1},'prehensile':{'suckers':1,'tail':2},'convenient':{'to':1,'unit':1},'latter':{'will':1,'is':2,'there':1,'we':1,'part':2},'half-brutish':{'prehistoric':1},'little.':{'illustration':1},'foam-bells':{'on':1},'subjects':{'with':1},'forces':{'of':7,'animals':1},'transmit':{'vibrations.':1},'swims':{'on':1,'about':1,'right':1,'well':1,'actively':1,'in':1,'with':1},'explanation':{'even':1,'we':1,'that':1,'of':3,'what':1,'.':1,'to':1,'offers':1,'once':1},'circles':{'without':1,'round':3},'benefactress':{'while':1},'ebook':{'outline':2,'for':1,'of':2,'is':2,'complying':1,'20417':1,'or':2},'anatomy':{'physiology':1,'.':1},'extending':{'below':1},'echoes':{'of':1},'phase':{'amid':1,'adapted':1,'of':1},'nutritive':{'reproductive':1,'chains':3,'material':2,'yolk':1,'sea-dust':1,'contributions':1},'grave':{'difficulties':1,'error':1},'nostrils':{'very':1,'on':1},'calculated':{'and':1,'to':1,'that':3,'using':1,'.':1},'inferred':{'from':3},'swamp':{'and':2,'our':1,'.':1},'accounted':{'for':3,'for--may':1},'deeply':{'saturating':1,'being':1,'into':4,'here':1,'buried':1,'with':1},'eel.':{'illustration':1},'notion':{'of':3},'fitted':{'a':1,'to':1},'reserve':{'.':1},'spectroscopic':{'point':1},'eminent':{'astronomers':3,'physicists':1},'sea-anemone':{'a':1,'may':1,'is':2,'gripped':1,'s':1,'72':1,'which':1,'sixty':1,'with':1,'can':1},'subtle':{'processes':1,'that':1,'inter-relations':2,'chemical':1,'cleaver':1,'inter-relations--the':1},'enjoyed':{'about':1},'sharks':{'the':1},'resemblance':{'142':1,'to':7,'being':1,'of':1,'is':2,'in':2,'camouflage':1,'lies':1,'so':1,'between':3,';':1,'hawk':1,'tells':1},'vaporised':{'by':1},'guidance':{'of':1},'appended':{'to':1},'entities--matter':{'ether':1},'geologist':{'utilises':1,'is':1},'deepest':{'sense.':1},'clefts':{'openings':1,'are':1},'pursuing':{'food':1,'what':1},'adequate':{'idea':1,'for':1,'lasting':1},'dynamo--magnetism--ether':{'and':1},'position--it':{'is':1},'fathoms':{'and':1,'though':1,'it':1,'five':1,'have':1,'so':1,';':1},'predecessor':{'.':1},'do':{'and':2,'nothing':2,'in':3,'.':5,'copyright':1,'when':2,'actually':1,'stories':1,'we':7,'that':1,'very':2,'they':2,'not':56,'with':9,'man':1,'occur.':1,'keeping':1,'practically':1,'this':4,'still.':1,'so':2,'the':2,'or':1,'otherwise':1},'leisure':{'to':1,'time--wherein':1,';':1},'yielded':{'to':1,'two':1},'space--ether':{'pervades':1},'watson':{'showed':1},'haunted':{'the':1},'roundabout':{'road':1},'conservator':{'of':1},'vividly':{'what':1,'interprets':1},'du':{'temps':1},'dr':{'.':18},'runs':{'through':1,'totteringly':1,'so':1,'for':1,'in':1},'tantalising':{'dream':1},'sky.':{'the':1},'web-footed':{'bird':1},'irregularities':{'of':1},'iron--and':{'is':1},'rung':{'on':1,'or':1},'voice--surely':{'one':1},'analytical':{'work':1},'freshwater':{'animals':5,'snail':1,'basins':2,'mammals':1,'fish':1,'polyp':1,'mussels.':1,'but':1,'.':1,'hydra':2,'race':1,'floods':1,'mussel':2},'steam':{'and':2,'or':2,'which':1},'captures':{'its':1},'venatici':{'is':1},'observer':{'the':1,'through':1},'condensed':{'and':2,'matter':1,'the':1,'to':1,'in':1},'observed':{'that':4,'phenomena':2,'had':1,'however':1,'one':1,'through':1,'in':1,'the':1,'.':1,'with':1,'by':1,'more':1},'tree-sloth':{'of':1},'arthropods':{'and':1,'such':1,'like':1,'which':1},'donations.':{'to':1},'torrents':{'of':1},'cattle':{';':1,'the':1},'miserable':{'specimen':1},'disappear.':{'illustration':1},'draws':{'for':1},'1917.':{'a':1,'this':1,'glass':1},'away':{'and':2,'the':3,'into':2,'back':1,'an':2,'down':1,'in':5,'from':10,'beneath':1,'when':2,'.':8,'chewing':1,'under':1,'is':1,'trillions':1,'altogether':1,'immediately':1,'by':3,'e.g':1,'many':1,'leaving':1,'entirely':1,'or':3},'sites':{'of':1},'unable':{'to':3},'drawn':{'on':2,'across':1,'into':3,'approximately':3,'.':1,'to':1,'in':4,'engraved':2,'by':2,'out':1},'previous':{'chapter':4,'energy':1,'experience':1,'one--the':1,'article':1,'line':1,'page':1,'day--a':1},'encounters':{'occur':1},'hatching.':{'reflex':1},'co.':{'harpy-eagle':1,'penguins':1},'circle--which':{'means':1},'we':{'forget':1,'soon':1,'discovered':1,'not':1,'go':3,'follow':1,'find':18,'discern':1,'had':2,'should':18,'to':2,'include':1,'might':3,'hope':2,'then':2,'get':18,'read':1,'watch':2,'cannot':29,'know':50,'presume':1,'mentioned.':1,'judge':1,'now':6,'dare':2,'arrange':1,'easily':1,'ever':1,'conceive':1,'leave':1,'continue':1,'lose':1,'found':2,'hasten':1,'mean':6,'often':1,'ascend':1,'briefly':1,'see':36,'are':47,'pass':2,'fail':1,'penetrated':1,'will':5,'detect':1,'confess':1,'may':41,'state':1,'learned':1,'approach':1,'exercise':1,'refer':1,'notice':1,'knew':1,'learn':1,'ascribed':1,'here':1,'imagine':1,'put':2,'come':3,'obtained':1,'received':1,'study':2,'owe':6,'agree':1,'turn':4,'usually':2,'think':6,'already':1,'can':39,'feel':1,'lengthen':1,'actually':1,'miss':2,'speak':6,'stare':1,'use':3,'described':1,'spoke':1,'would':3,'next':1,'start':1,'live':1,'call':26,'breathe':1,'wish':1,'understand':2,'gain':1,'believe':4,'must':42,'count':1,'look':4,'recall':1,'handle.':1,'aim':1,'suppose':1,'ought':1,'were':3,'could':13,'expect':1,'control':1,'compare':1,'have':124,'do':24,'almost':1,'describe':1,'moved':1,'consider':4,'say':6,'want':1,'need':4,'seem':3,'saw':13,'thought':1,'no':1,'belong':1,'take':4,'behold':1,'picture':1,'draw':2,'repeat':1,'connect':1,'utilise':1,'shall':23,'confined':1,'stop':1,'await':1,'reach':4,'reflect':2,'admire':1,'lay':1,'recognise':1,'remember':1,'emphasise':1,'reproduce':1,'allow':2,'hear':1},'rudimentary':{'gills':1},'terms':{'imposed':1,'of':21,'will':1,'experimenting':1,'from':1,'than':1},'discussion.':{'some':1},'wm':{'.':1},'bipeds--we':{'must':1},'enters':{'a':1,'the':3},'travellers':{'which':1},'clues':{'which':1,'in':1},'caledonia':{'which':1},'stricter':{'sense':1},'linkage':{'of':1,'between':1},'kitchen':{'.':1},'received':{'opinion':1,'the':4,'from':1,'written':1,'less':1},'climate':{'and':4,'a':1,'calls':1,'for':1,'of':2,'is':1,'became':1,'has':2},'pelomyxa':{'sometimes':1},'cox':{'arrangement':1},'ill':{'all':1,'suited':1},'nordics':{'afghans':1},'germinates':{'after':1},'cod':{'feeding':1,'family':1},'receives':{'a':1,'160':1},'unsunned':{'.':1},'disappears':{'before':1,'from':2,'in':1},'collecting':{'into':1,'centre':1,'centres':1},'tough':{'living':1},'soap':{'made':1,'bubble':4,'which':1},'ganymede':{'a':1},'engulfs':{'its':1,'it':1},'tons':{'on':2,'.':1,'in':1,'to':1,'of':6},'866400':{'--':1},'eventful':{'life-history':1,'thing':1,'day':1,'retention':1},'merchantibility':{'or':1},'speak':{'of':12,'the':1,'picturesquely':1,'unpacked':1,'got':1},'broadening':{'still':1},'sperm-cells.':{'the':1},'engines':{'.':1},'flexible':{'mounting':1},'thrice':{'the':1},'leech':{'called':1},'spermatozoon':{'has':1,'fertilises':1,'or':1},'repelled':{'by':1},'families':{'genera':1,'like':2},'innocent':{'seaweed':1,'creatures':1},'plebeian':{'crab-apple':1},'attacked':{'by':1,'however':1},'concerning':{'life':1,'tax':1,'the':1},'overtax':{'the':1},'millionth':{'of':2},'coherent':{'vane':1,'.':1},'them--a':{'common':1},'elvers':{'come':1,'snuggle':1,'.':1},'applied':{'to':7,'the':2,'however':1},'has':{'migrated':1,'enormously':1,'just':1,'developed':1,'over':1,'discovered':2,'ceased':2,'its':10,'captured':2,'certainly':1,'much':2,'torn':1,'had':3,'laid':1,'destroyed':1,'to':14,'only':2,'suffered':1,'guided':1,'happened':1,'meant':2,'his':1,'far':1,'attained.':1,'begun.':1,'five':1,'got':1,'not':8,'sorted':1,'now':3,'continued':1,'learned':2,'four':2,'annihilated':1,'lost':2,'always':2,'solved':1,'mastered':1,'become':14,'cooled':1,'declared':1,'often':3,'ten':1,'some':1,'somehow':1,'calculated':1,'gnawed':1,'begun':1,'led':2,'penetrated':2,'even':1,'shown':3,'said':2,'for':1,'frond-like':1,'yet':1,'written':2,'various':1,'moons':1,'probably':1,';':2,'ever':3,'claws':1,'attended':1,'recently':2,'risen':1,'however':1,'disappeared':1,'broken':1,'found':2,'put':1,'dissipated':1,'come':5,'thrown':2,'received':1,'great':1,'mingled':1,'language':1,'of':3,'changed':3,'conquered':2,'consequently':1,'raised':1,'already':1,'followed':1,'slipped':2,'instruments':1,'transit':1,'two':3,'brought':2,'agreed':1,'been':136,'reached':2,'precisely':1,'spawned':1,'given':5,'from':1,'fallen':1,'harnessed':1,'remained':1,'three':1,'long':1,'screened':1,'2':1,'wonderfully':1,'therefore':1,'passed':1,'taken':5,'slowly':1,'entered':2,'.':1,'more':2,'suggested':1,'himself':1,'thus':1,'completed':1,'occurred':1,'but':1,'known':1,'worked':1,'gills':1,'arisen':1,'carried':1,'made':3,'this':1,'shrunk':1,'moulted':1,'nine':1,'many':1,'tackled':1,'called':1,'gone':5,'proved':1,'played':1,'almost':4,'likewise':1,'turned':1,'an':4,'helped':1,'in':3,'affinities':1,'occupied':1,'shown.':1,'grown':1,'influenced':1,'built':1,'no':3,'divided':3,'also':1,'absorbed':1,'adapted':1,'degenerated':1,'effected':1,'added':2,'gradually':1,'eight':1,'plenty':1,'a':20,'succeeded':3,'endeavoured':1,'moved':1,'upset':1,'implied':2,'so':3,'very':1,'the':8,'realised':1,'left':1},'conviction':{'the':1,'that':1},'comprehension.':{'illustration':1},'air':{'and':4,'all':1,'there':3,'just':2,'is':6,'reaches':1,'as':1,'through':1,'at':3,'in':3,'from':1,'acts':2,'when':1,'.':13,'to':1,'which':3,'6':1,';':2,'has':4,'was':1,'into':1,'be':1,'we':1,'over':1,'goes':1,'on':1,'but':1,'underneath':1,'262':1,'struggle':1,'waves':1,'with':2,'by':3,'must':1,'a':3,'water':5,'of':1,'35':1,'loses':1,'will':1,'the':2,'or':1},'aim':{'of':2,'at':1},'voluminous':{';':1},'abrupt':{'and':1},'applies':{'also':1,'the':1,'whatever':1,'to':3},'aid':{'of':1,'.':1},'voice':{'we':1,'rose':1,'is':1,'broadened':1,'due':1,'but':1,'.':1,'became':1,'expresses':1,'the':1,'was':2,'becoming':1},'amphibians--the':{'reptilian':1},'cavern':{'of':3,'the':2,'179':1},'cylinder':{'of':1},'plover':{'has':1,'from':1},'have':{'planetary':2,'followed.':1,'quoted':1,'migrated':1,'scattered':1,'discovered':4,'sunk':2,'mentioned':2,'its':1,'just':9,'regarded':1,'had':2,'to':14,'only':4,'spread':2,'meant':2,'then':1,'good':1,'returned':1,'very':3,'furnaces':1,'words':1,'shared':1,'not':12,'now':1,'illustrated':3,'failed':1,'lost':1,'ceased':1,'always':1,'traced':1,'prolonged':1,'watched':1,'mastered':1,'dealt':1,'served':1,'cooled':3,'dwindled':1,'tenanted':1,'often':1,'burst':1,'acquired':1,'some':2,'direct':1,'identified':1,'carefully':1,'taught':2,'safeguarded':1,'further':1,'living':1,'shown':4,'said':9,'discovered--pulling':1,'missed':1,'apparatus':1,'definite':1,'behind':1,'won':1,'emerged':1,'moons':1,'rotted':1,'got':4,'learned':1,'ever':1,'told':1,'we':1,'full':1,'originated':1,'peculiarly':1,'sprung':1,'here':1,'reason':2,'will':1,'found':7,'put':3,'proceeded':1,'come':4,'gained':2,'on':2,'great':1,'reared':1,'journeyed':1,'of':4,'changed':1,'greatly':1,'conquered':1,'fallen':1,'already':5,'gone':3,'appeared':1,'delighted':1,'visible':1,'maintained':1,'another':2,'reached':1,'risen.':1,'given':2,'described':1,'become':8,'exposed':1,'three':1,'been':88,'their':7,'recognised':1,'combined':1,'passed':1,'resulted':1,'travelled':1,'closed':1,'thrown':1,'from':1,'lived':2,'lungs':1,'both':1,'moved':1,'differences':1,'occurred':1,'but':1,'taken':2,'heat':1,'races':1,'protections':1,'known':1,'probably':1,'worked':1,'removed':1,'entered':3,'arisen':4,'partially':1,'made':6,'succeeded':2,'this':1,'neap':1,'considered':1,'evolved':2,'many':2,'more':1,'called':1,'at':1,'admired':1,'seven':1,'chlorophyll':1,'proved':4,'remained':2,'is':1,'thus':1,'an':3,'astonished':1,'heard':2,'as':1,'something':1,'planets':1,'in':9,'seen':18,'apparently':1,'any':1,'grown':1,'varied':2,'inborn':1,'no':14,'rather':1,'lit':1,'also':2,'stimulated':1,'read':1,'several':1,'used':1,'what':2,'most':1,'discredited':1,'plenty':1,'nothing':1,'such':1,'yielded':1,'revealed':1,'a':25,'profited':1,'scarcely':1,'to-day':3,'bilateral':2,'stupendous':1,'nevertheless':1,'thought':1,'implied':1,'so':1,'lamented':1,'mechanical':1,'the':5,'counted':1,'bodies':1,'left':2},'crowning':{'instance':1,'examples':1,'advantage':1},'exceptionally':{'smooth':1},'sting':{'the':1,'which':1,'.':1},'trilobites':{'crustaceans':1,'illustration':1,'were':1},'brake':{'on':1,'.':1},'blame.':{'after':1},'comparative':{'anatomy':1,'distances':1,'nearness':1,'psychology':1,'sizes':3},'undulatory':{'movement':1},'brilliantly':{'luminous':1},'m.c.':{'.':1},'descent':{'of':6,'that':1,'from':1,'to':1},'conclusions.':{'the':1},'patent':{'and':1},'demonstration':{'of':1},'centre.':{'as':1},'punctuation':{'of':1},'varies':{'as':1,'.':1,'greatly':1,'periodically':1},'parasitism':{'it':1},'diplodocus':{'as':1},'sheltered':{'may':1,'life':1},'accumulating':{'a':1,'and':1,'age':1,'.':1},'monarch':{'of':1},'lithium':{'three':1},'crevices':{'among':1},'wheel':{'be':1,'rapidly':1,'that':1,'when':1,'is':1,'turned':1,'will':1,'as':3,'animalcule':1,'was':1},'independent':{'methods--one':1,'of':1,'orbits':1,'stellar':1,'lives':1,'existence':1},'86500':{'9':1},'hang':{'on':1},'evil':{'associations':1},'hand':{'feed':1,'and':8,'holds':1,'is':1,'some':1,'gregariousness':1,'as':2,'in':2,'miss':1,'from':1,'there':1,'when':3,'.':1,'till':1,';':1,'was':2,'thus':1,'it':1,'with':1,'made':1,'of':8,'sometimes':1,'so':1,'the':2,'where':1},'kinnaman':{'taught':1},'patagonia':{'there':1,'.':1},'nip':{';':1},'centred':{'in':1},'kept':{'lizzie':1,'from':2,'by':1,'for':1},'whereby':{'new':1,'the':1,'distinctively':1,'energy':1},'likes--and':{'the':1},'engrained':{'instinctive':1,'enregistered.':1},'wisps':{'of':1},'contact':{'information':1,'sy':2,'links':1,'information:':1,'.':1,'the':1,'with':2},'elongated':{'and':1,'palm-bones':1,'mobile':1,'outermost':3,'oval':1,'bodies':1},'furneaux':{'life':1},'centres':{'of':7,'drawing':1},'the':{'limited':1,'practicability':1,'psycho-analyst':1,'magnetic':5,'comparatively':1,'dynamic':1,'four':3,'chameleons':1,'aegir':4,'controversial':1,'oldest':6,'muzzle':1,'brackish':1,'physiological':3,'similarity':2,'sunlit':1,'fine-grained':1,'thinnest':2,'under':3,'humerus':1,'risk':5,'arboreal':5,'aurora':5,'oceans':1,'pigment':1,'smack':1,'coal-measures':1,'gratification':1,'east.':1,'fingers.':1,'conception':2,'bringing':1,'monkeys':2,'vast':9,'internally':1,'prize':1,'parrot':1,'present.':1,'correct':1,'danger-signal':1,'succession':2,'jumna':1,'jungle-fowl':1,'breast-bone':3,'cave-lion':1,'achievements':2,'force':3,'monotonous':1,'faintest':1,'excited':1,'feathers':6,'seas.':2,'nail':2,'surrounding':9,'second':18,'street':2,'infiltration':1,'inanimate':1,'blue':6,'change.':1,'unborn':3,'beaten':1,'consequent':1,'rest.':1,'reconstruction':2,'chromosphere':4,'new':21,'net':1,'protozoon':1,'surface--the':1,'evolving':1,'lithosphere':1,'men':6,'residual':1,'atoms':26,'seven-weeks-old':1,'protection':2,'ploughed':1,'aid':1,'active':4,'evolutionist':2,'cardboard':1,'contraction':2,'dry':19,'connaissance':1,'surface-atoms':1,'frog-hopper':1,'light.':1,'credit':3,'changes':5,'skull-cap':3,'diameter':3,'stray':1,'straw':1,'highly':1,'skull-walls':1,'visible':2,'medium':5,'total':6,'unit':2,'answers-back':1,'remainder':1,'arms':6,'dog-toothed':1,'mightiest':1,'calm':1,'water-spider':2,'type':2,'pistil':1,'females':3,'lungs':1,'wary':1,'horsetail':1,'whirling':1,'glass':6,'warm':2,'adult':3,'continual':1,'organic':1,'midst':1,'circumstances':1,'abundance':3,'word':10,'mimickers':4,'accomplishment':1,'eclipse':1,'worm':3,'roof':3,'theories':2,'mammalian':1,'era':2,'appendage':1,'animal.':1,'clock-work':1,'mud-fishes':1,'phrase':7,'alternating':1,'allantois':2,'serpent':1,'climax':3,'shore.':1,'powerfulness':1,'caution':1,'oil-sheet':1,'present-day':4,'advancing':3,'absolute':2,'end':22,'thing':2,'song':1,'nuts':2,'very':19,'hot':1,'significance':3,'answer':9,'ordinary':12,'ancestor':1,'massive':2,'poker':4,'rise':2,'minority':1,'mouths':2,'ptarmigan':2,'abdomen':1,'diagram':9,'dinosaurs':1,'wrong':2,'pearl-bearing':1,'vase':1,'domed':2,'types':1,'amoeboid':1,'leplay':1,'third':11,'spout':1,'headquarters':1,'greek':7,'green':8,'ultimate':4,'things':1,'sun.':13,'order':9,'wind':9,'blind':1,'interpretation':3,'alternation':1,'sheltering':1,'orang':7,'underside':1,'fore-limbs':4,'thesis':1,'ancients':2,'spontaneous':2,'famille':1,'breeding-place':2,'fit':1,'crew':1,'better':2,'woolly-haired':1,'production':3,'hidden':1,'gateways':1,'sea-water':3,'swim-bladder':1,'combination':2,'tree-stems':1,'young.':1,'revelations':1,'giraffe':1,'effects':2,'monarch':1,'stars;':1,'bank':2,'bread':1,'shadows':1,'dingo':2,'rocks':9,'good':4,'fertilised':8,'victory':1,'arrow':2,'side':4,'associative':1,'telescope.':1,'development':10,'telescope':10,'series':2,'principles':3,'solution':4,'contracting':1,'wave-lengths':1,'laboratory':3,'dawn':9,'ring':2,'pigments':1,'gibbon':5,'quality':5,'ice-sheets':1,'method':9,'reader':6,'heavenly':2,'revolving':1,'newly':4,'size':25,'langur':1,'foundation':12,'perception':1,'carcass':1,'wave-length.':1,'eternal':1,'strata':1,'free':4,'standard':1,'sensory':3,'skin.':1,'ancient':6,'formation':5,'struggle':15,'estimate':1,'heat':11,'ultra-violet':1,'publication':1,'enormous':5,'grasses':1,'days':1,'adjustment':1,'baltic':2,'purpose':2,'arrows':1,'wasp':2,'unlit':1,'peculiarity':1,'scissors':1,'thick':1,'ditch':2,'electronic':2,'mercury':1,'pelagic':1,'top':11,'neck':4,'heights':1,'legs':2,'genesis':1,'vapoury':1,'kiwi':2,'fiery':1,'instreaming':1,'fibrous':1,'diversified':1,'sciences.':1,'bell.':1,'floor.':1,'wisdom':1,'nurse-frog':1,'glumes':1,'somewhat':2,'evil':1,'peculiar':2,'flightless':1,'distance':13,'yerkes':7,'tree':2,'atom.':1,'final':5,'project':31,'matter':7,'flame':1,'historical':2,'shore-waters':1,'feeling':1,'acquisition':1,'groaning':1,'pliocene':5,'mind':18,'spectrum':9,'raw':4,'seed':1,'manner':1,'nervures':1,'rock-pool':1,'relatively':8,'strength':1,'prehensile':1,'thoroughly':1,'latter':7,'potentialities':1,'snow':3,'sound':3,'toothed':1,'subjects':1,'doors':2,'beta-rays':1,'shallow':2,'permian':8,'multicellular':1,'king-crab':1,'centres':1,'changefulness':1,'vermiform':2,'mouth':10,'letter':2,'echoes':1,'coil':4,'nutritive':1,'refractor':2,'ultramicroscope':1,'photosphere.':1,'episode':1,'professor':1,'metal':3,'dog':5,'orderly':1,'points':2,'principle':5,'sun':188,'nineteenth':8,'notion':2,'marvel':1,'pollen':1,'spikelets':1,'insects':2,'sea-anemone':4,'attempts':1,'subtle':1,'availability':1,'lessons':1,'ear.':1,'resemblance':5,'quaint':2,'pleistocene':2,'sentence':1,'geologist':2,'fifty-foot':2,'rich':1,'gods':1,'population':3,'plate':4,'mixture':2,'above':11,'fluid':2,'foremost':1,'bat':3,'covering':1,'bay':1,'discs':1,'contrast':2,'freshwater':6,'ears':1,'lettering':1,'observer':1,'habit':5,'radium':4,'outgoing':1,'zones':1,'tree-sloth':1,'full':14,'radius':1,'result':15,'disturbing':1,'rarity':2,'best':4,'subject':4,'pebbles':1,'capacity':2,'palaeolithic':2,'rings':1,'artificial':1,'paternal':1,'mud':7,'score':2,'toad':3,'simplest':9,'approach':1,'hatching.':1,'discovery':23,'terms':12,'nature':23,'confusion':1,'weak':1,'physicist':5,'sand-crab':1,'lurching':1,'larynx':1,'aquarium':1,'extent':2,'carbon':1,'flowering':1,'debt':1,'well-lighted':1,'kitchen':1,'tyranny':3,'behaviour':16,'climate':3,'outcome':13,'sperm-producer':1,'triggers':1,'earth.':7,'heating':1,'feathering':1,'cod':2,'distinction':2,'genus':1,'fore-leg':2,'repertory':1,'discolorations':1,'inquisitive':1,'purling':1,'path':5,'grazing':1,'sperm-cells.':1,'basis':3,'union':3,'three':6,'tiny':3,'trigger':6,'interest':1,'fry':2,'exactness':1,'spermatozoon':3,'life':7,'beach.':1,'deeper':2,'plebeian':1,'eastern':1,'abyssal':1,'conifers':1,'millionth':2,'mazy':1,'child':6,'elvers':1,'centrosome':1,'ether.':1,'exception':1,'adaptations':1,'air':39,'aim':1,'neat':1,'fainter':1,'property':1,'study':6,'natives':1,'seven':3,'crowning':1,'equator':5,'photographer.':1,'player':1,'comparative':3,'undulatory':1,'mouse':1,'descent':2,'belle':1,'punctuation':1,'daughter-units':2,'siamang':1,'complex':1,'peopling':3,'belly':1,'reptilian':2,'vegetable':1,'snow-line':1,'several':1,'european':2,'wheel':7,'independent':1,'georgics':1,'milky':13,'tops':1,'rain':1,'hand':9,'characters':1,'tune':1,'tassel':3,'stimuli':1,'ocean':5,'materials':1,'greatest':13,'arrow-worms':1,'claims':1,'marsupials':1,'musical':1,'left':5,'sea-skimmers':1,'just':1,'planetesimals':1,'vaporisation':1,'sporting':1,'mending':1,'disguise':2,'neanderthalers':1,'human':25,'facts':15,'yes':1,'emergence':7,'previous':3,'thyroid':3,'terrific':1,'hills':2,'infinitely':1,'old-fashioned':1,'royal':1,'salmon--forming':1,'evidences':3,'thickening':1,'long-lost':1,'board':1,'gaboon':2,'east':1,'eocene':2,'laying':1,'elevation':1,'advances':1,'survival':1,'sussex':1,'vulture':1,'possible':3,'forester':1,'photosphere':9,'birth':2,'partridge':1,'shadow':2,'rough-and-tumble':1,'shoulder':1,'war.':2,'insurgent':1,'precise':3,'sand-hoppers':2,'autumn.':1,'x-rays.':1,'enregistered':2,'mosquito':2,'night':1,'amoebae':1,'portuguese':2,'right':12,'old':13,'people':2,'crown':2,'dead':1,'clawed':1,'winds':1,'inorganic':2,'rill':1,'intellect':1,'orchid':1,'dense':1,'rhine':1,'bottom':6,'ear':7,'opposite':5,'fox':2,'distrust':1,'ice':3,'flounder':2,'loins':1,'tertiary':1,'seals.':1,'colour-cells':2,'beating':2,'monkey-ape-man':1,'palatable':1,'energy':36,'illustration':5,'cork':1,'shifting':1,'capacious':1,'flinty-shelled':1,'blackest':1,'properties':2,'chapter':1,'skin-twitching':1,'limitation':1,'boiling':1,'cloudlets':1,'ribs':1,'o':1,'wave-length':1,'horizon':1,'herring-gull':1,'efforts':1,'ores':1,'lamprey':1,'primitive':3,'cloud-screen.':1,'dilemma':1,'variations':1,'scantier':1,'peppered':1,'son':1,'contrasts':1,'bricks.':1,'doctrine':1,'spores':1,'palaeozoic':4,'indispensable':1,'flying':9,'sunlight':7,'class':2,'conservation':1,'physicists':2,'fraction':1,'dorsal':1,'war':4,'lowest':5,'head':8,'marten':1,'form':10,'fully-formed':1,'becoming':1,'differences':2,'peninsula':1,'quiet-flowing':1,'same.':1,'solar':35,'minuteness':2,'true':5,'otter':3,'continuance':3,'reproductive':2,'ancestral':1,'bounds':1,'centipede':1,'economic':1,'bird-dropping':1,'egg-eating':1,'palm':1,'cosmos':1,'stages':1,'temper':1,'passenger':1,'juvenile':2,'strengthening':1,'hotter':1,'heidelberg':4,'seeds--and':1,'mirror':2,'palm;':1,'evidence':2,'candle':1,'ship':3,'physical':4,'mediterranean':3,'solicitation':1,'inborn':3,'floor':8,'font-de-gaume':2,'negatively-electrified':1,'tip':4,'reality':3,'successful':2,'nestling':1,'setting':2,'papers':1,'superfluous':1,'robber-crab':5,'picture':7,'ordovician':2,'palms':1,'teats':1,'braking':1,'diet':1,'genealogical':2,'irs.':1,'dullest':1,'discharge':2,'thorax':1,'immemorial':1,'stamens':2,'bullet':2,'daily':1,'collared':1,'gorilla':4,'reception':1,'time':19,'skull-cap.':1,'serious':1,'nuclei':1,'tigris':1,'breadth':1,'irrigation':1,'concept':1,'chain':1,'limbless':1,'colour-change':1,'varying':3,'brownian':4,'focus':1,'hind-legs':2,'nerve-cord.':1,'skin':14,'jointed-footed':1,'primeval':4,'retention':1,'layers':2,'inverse':1,'essentials':1,'father':5,'passage':4,'environment':4,'unpleasant':1,'reptiles':2,'walking-fish':2,'ulna':1,'division':1,'protective':2,'month.':1,'advantage':2,'rotifer--we':1,'liability':1,'aesop':3,'first-known':1,'nesting':1,'exact':2,'minute':3,'cool':1,'dim':1,'level':4,'sedimentary':3,'gum':1,'magnet':4,'crustacean':1,'backboneless':2,'speculation':1,'accumulation':1,'upper':23,'work':19,'occurrence':3,'findings':1,'full-grown':2,'piltdown':5,'hair.':1,'trent':4,'bacteria':2,'spectral':1,'leaf-butterfly':1,'constitution':4,'assistance':1,'axes':1,'stomach.':1,'current':6,'supporting':2,'coccyx':1,'honour':1,'hairs':3,'evolution-idea':4,'anvil.':1,'whiteness':1,'water':49,'guise':1,'cave-bear':1,'twentieth':1,'address':1,'dwindling':2,'teacher':1,'change':5,'pearly':8,'brilliant':1,'shift':2,'dublin':1,'trial':2,'stomachs':1,'suggestion':3,'weird':1,'copper.':1,'mimicked':4,'elect':1,'seashore':8,'littoral':2,'cuttlefishes':3,'working':2,'sake':1,'positive':2,'anatomical':2,'prey':2,'flaunting':1,'negroes':1,'australian':6,'angels':1,'fish-eating':1,'diurnal':1,'water-ouzel':1,'apparent':3,'malay':1,'minnows':2,'appendix':1,'virtue':1,'cases':1,'easiest':1,'opossums':2,'sum-total':1,'sea-anemones':2,'cat':1,'hardest':2,'jetsam':1,'mortality':1,'following':6,'making':7,'fauna':6,'coral':3,'stimulating':1,'streak':1,'heart':6,'portals':1,'wrist-bones':1,'reflector':2,'figure':5,'frogs':1,'bulkiest':1,'stroke':1,'chin':1,'octopus.':1,'rays':15,'requirements':1,'winter':5,'comb-bearers':1,'inheritance':1,'dispositions':1,'means':4,'species':3,'chemical':6,'vital':5,'candle.':1,'fourth':4,'elephant':4,'dominance':1,'economy':1,'burrowing':1,'southern':3,'date':2,'behaviour--experimenting':1,'man':6,'branches':10,'outline':9,'liquid':4,'unimportant':1,'corona':3,'darkened':1,'african':2,'basket':1,'bolometer':1,'outflowing':2,'shield':1,'gradual':6,'pointed':1,'years':1,'brain':23,'experiments':6,'statements':1,'cold':4,'insurgence':2,'birds':3,'tendency':5,'nucleus.':2,'solitary':1,'limbs':1,'ice-fields':2,'thumb':5,'rhizopods':2,'interesting':3,'presence':4,'flesh-and-blood':1,'aquitania':1,'attraction':1,'creations':1,'spacious':1,'main':28,'meridian':2,'bird.':1,'evolution':45,'records':3,'archaeozoic':1,'tails':1,'water-shrew.':1,'not':1,'widespread':1,'halo':1,'term':2,'name':4,'seaweed-growing':1,'advent':1,'gill-slits':1,'careless':1,'jellyfish':2,'rock':9,'turtle':2,'sugary':2,'square':3,'reeds':1,'torch':1,'treacherous':3,'challenger':1,'fires':1,'year':6,'monitors':1,'neighbourhood':1,'living':18,'factors':6,'amnion':2,'greeks':3,'increase':2,'miles':1,'ladder':1,'overflowing':1,'ascendant':1,'theory':14,'soap-bubble':1,'divergence':3,'possibility':12,'quite':1,'quart':2,'intruding':1,'advantages':2,'sunlight.':1,'fuller':1,'obligation':1,'marine':2,'inevitable':1,'card':2,'care':1,'advance':2,'language':1,'selections':1,'transition':5,'british':5,'ostrich':1,'motion':2,'disguises':1,'place':8,'invalidity':1,'deep-sea':4,'close-set':1,'star':6,'frequent':2,'first':71,'origin':14,'one':21,'long':15,'conifer':1,'message':6,'open':29,'millions':3,'sheep':3,'little':5,'law':3,'silent':1,'spiral.':1,'bite':1,'callous':1,'plastic':1,'stimulation':1,'plains':2,'cooling':2,'2':1,'pockets.':1,'moisture':1,'white':11,'lingering':1,'vapours':1,'gravelly':1,'eyes':8,'way':18,'starfish':1,'brains':2,'canine':1,'seat':3,'photographic':9,'splendid':1,'pterodactyls':2,'cracks':1,'effective':1,'three-spined':1,'crowded':1,'coco-palm':1,'future':11,'fertilisation':1,'cards':2,'gigantic':1,'mariner':1,'photosynthesis':1,'sublime':3,'coconut':1,'rooks':1,'spectroscope:':1,'ant':3,'spectroscope.':1,'lens-shaped':2,'buried':1,'maximum':1,'zoo':1,'snout':2,'sciences':1,'potential':1,'fracture':1,'online':2,'interior':7,'performance':2,'jungle':5,'closer':1,'sure':1,'chromosomes':1,'normal':4,'azores':1,'indelible':2,'price':1,'molecule':1,'falls':2,'visitors':1,'beta':5,'successive':5,'pair':1,'thigh-bone':1,'average':7,'freshwaters':9,'hungry':1,'bustard':1,'tooth':1,'idea.':1,'quiescent':2,'salt':1,'laws':4,'detective':1,'walking':1,'discoverer':1,'merit':1,'gill-cover.':1,'bright':3,'threshold':1,'line':7,'ground':23,'slot':2,'nemesis':2,'ratio':2,'gulf':1,'germ-cell':1,'treasure':1,'proportion':2,'only':13,'down-breaking':1,'black':5,'uppermost':1,'down-rushing':1,'lighted':1,'supra-renal':2,'bittern':1,'freezing':1,'midriff':1,'truly':1,'duckmole':4,'remoter':1,'mud-flats':1,'negative':4,'lighter':2,'primates':4,'clearest':1,'pollen-nucleus':1,'fanciful':1,'parasitic':1,'morning':2,'naked':2,'penguins':1,'sea--the':2,'london':1,'pituitary':1,'vision':1,'kernel':1,'oven':1,'seas':6,'lancelets':1,'silurian':4,'stars--or':1,'relative':4,'1921':1,'stigma':1,'concentric':1,'wonder':2,'ways':5,'subsequent':1,'sites':1,'under-skin':2,'colours':4,'outside':4,'chimpanzees':1,'moons':2,'man.':2,'volvox':1,'notice':1,'parent':10,'eye':20,'screen':7,'rapidly':1,'big-brain':4,'sea.':5,'proterozoic':1,'article':2,'cities':1,'dates':1,'successes':1,'many':1,'region':2,'sodium':1,'quiet':1,'altamira':4,'man-ape':2,'flipper':3,'wheels':1,'expression':4,'surface.':2,'moon;':1,'generalisation':1,'brightly':1,'color':1,'colony':3,'period':7,'spinthariscope':1,'learning':1,'boar':1,'constant':1,'pod':1,'skeletons':2,'sun-spots':1,'fitful':2,'late':5,'west':3,'shortening':2,'combined':1,'reflex':1,'exhaustion':1,'fiftieth':1,'direction':9,'gist':2,'circumference':2,'haunt':1,'sea-horses':1,'external':3,'infusorians':1,'careful':2,'spirit':2,'robber':1,'case':37,'breast.':1,'caucasians':1,'developing':4,'co-ordination':1,'mount':4,'prominence':1,'dints':1,'situation':2,'margin':3,'moon.':1,'coolest':2,'characteristics':2,'nautical':2,'middle':5,'regularity':1,'sudden':3,'tse-tse':1,'eras':1,'unsounded':1,'beaver':5,'jackdaw':1,'floating':6,'movements':9,'rungs':2,'helmet':1,'different':8,'alphabet':1,'same':99,'eggs--up':1,'food':10,'inquiry':2,'agitated':1,'grain':1,'status':1,'oyster-catcher':1,'oil':1,'vestigial':2,'arctic':1,'director':1,'running':1,'edges':5,'delicate':3,'equatorials':1,'changing':2,'perennial':1,'constitutional':1,'severe':2,'frontispiece':1,'bottle':1,'model':1,'otherwise':1,'bodies':1,'overcrowding':2,'summer':3,'money':1,'armour':1,'egg-cell':1,'rest':6,'down-drifting':1,'rule.':1,'potentiality':1,'differentiation':1,'speed':16,'captured':1,'death':2,'widest':3,'hint':1,'bricks':3,'golden':1,'geological':6,'meteorite':1,'hind':2,'dovecot':1,'heavier':3,'skies':1,'real':2,'bitterling':3,'spectacular':1,'rules':1,'outermost':1,'non-digitate':1,'tissues':2,'early':13,'water-measurers':1,'vacuum':1,'cavern':3,'world':46,'part':7,'left-hand':3,'sensational':1,'fossils':2,'oxygen':3,'exquisitely':1,'velocities':1,'multifarious':1,'sieves':1,'benefit':1,'downward':1,'sharp':1,'twelve':1,'night-light':1,'exposed':1,'splash':1,'cathode':1,'pacific':2,'astronomer':6,'duration':1,'pasture':1,'racial':1,'ascent':6,'extinct':3,'gross':1,'calculating':1,'prolific':2,'intricacy':1,'memories':2,'tube':11,'moon':76,'pioneer':3,'critical':2,'lunar':2,'particles':12,'others--the':1,'welcome':1,'wheat':2,'buckling':1,'power':16,'sixth':2,'nails':1,'stereotyped':2,'substratum':1,'broken':1,'alps':1,'resurrection':1,'comparison':1,'stone':1,'ear-trumpet':2,'central':9,'piety':1,'insect':9,'shrimp':1,'addition':1,'wolf':3,'act':3,'pre-human':1,'amber':1,'freeing':1,'lands':2,'fertile':2,'sea-grass':1,'burning':1,'instruments':1,'spreading':1,'surinam':1,'spinal':4,'sneering':1,'rising':1,'elementary':1,'mark':1,'shrinking':2,'shells':1,'bristles':1,'literal':1,'dispersion':1,'strict':3,'world--weighs':1,'low':1,'stars':39,'house':2,'macaques':1,'hen':1,'bubble':4,'fish':6,'continents':3,'mammals':4,'prawn':1,'manipulative':2,'strenuous':1,'elimination':1,'parasites':2,'hottest':1,'land.':1,'wild.':1,'pull':1,'largest':9,'circulation':2,'stoneless':1,'multiplicity':1,'electroscope':1,'nearest':7,'pre-cambrian':1,'grasp':1,'shell.':1,'grass':3,'mimicked.':1,'moles':2,'vedda':1,'dangerous':1,'sinking':1,'lingula':1,'deep':10,'general':23,'imagination':3,'sun--measuring':1,'at':1,'planets':19,'cathedral':1,'corresponding':3,'film':3,'tedious':1,'beds':2,'inflated':1,'shore-haunt':6,'field':4,'prism':3,'polar':8,'vocabulary':1,'bacillus':1,'shelter':2,'planet.':1,'carnegie':2,'important':5,'nucleus':12,'marshes':1,'environing':1,'queensland':1,'sun--a':1,'pool':3,'network':1,'building':1,'condensation':2,'remote':1,'difficulties':7,'mimic':2,'tree-tops':1,'ovary':1,'starting':1,'original':13,'pheasant':1,'skeleton':2,'founder':1,'peacock':1,'lack':1,'muscle-fibres':1,'milt':1,'month':9,'light-waves':1,'upkeep':1,'welfare':2,'plodding':1,'causes':1,'synthetic':2,'stored-up':1,'number':14,'remarkable':2,'inexhaustible':2,'former':1,'tail':10,'boiling-point':1,'friction':1,'safety':3,'presentation':1,'activities':1,'turnips':1,'worse':1,'devonian':8,'chameleon':2,'far':9,'coloured':5,'worm.':1,'psychologist':1,'verb':1,'fan':1,'sandstones':1,'fall':3,'difference':2,'forking':1,'accompanying':1,'stimulus':2,'ceaseless':1,'list':1,'applicable':1,'caucasian':1,'large':9,'sand':1,'three-millionth':3,'small':11,'mammal':6,'locomotive':2,'trumpeting':1,'still':2,'fringing':1,'cannonade':1,'197':1,'reins':2,'past':16,'intricate':1,'rate':10,'invention':1,'double-slide':2,'creatures':1,'lung-fishes':1,'swampy':1,'darkness':2,'consumers':1,'clock':3,'deeply':1,'crust':2,'emotions':1,'thickness':3,'public':3,'multitude':1,'movement':2,'creature.':1,'toes':1,'malaria':2,'martians':1,'compilation':1,'loose':3,'component':1,'answers':3,'hours':1,'threads':2,'trunk':1,'directions':1,'strong':2,'transformation':2,'search':2,'teeth':5,'difficulty':1,'riviera':1,'experimenting':3,'unproved':1,'amount':3,'social':3,'action':4,'slope':2,'narrow':2,'elongated':2,'cataract':1,'tides.':1,'family':1,'spawning':3,'utilisation':2,'chalk':1,'globes':2,'vertebrae':2,'extinction':1,'herring':1,'life-histories':2,'taker':1,'eye--we':1,'two':30,'almost':4,'cultivation':1,'soil':3,'mysterious':4,'jurassic.':1,'ovules':2,'minor':1,'more':18,'scotia':1,'door':2,'substances':1,'text.':3,'emission':1,'chimpanzee':5,'instrumental':1,'stick':3,'particular':9,'foundations':1,'straight-haired':1,'weathering':3,'presumed':1,'fleece':1,'primate':2,'science':3,'centrifugal':1,'moisture-laden':1,'lung-fish':1,'lamp-shell':2,'male':18,'radiations':1,'history':14,'beautiful':6,'shark':1,'nautilus':1,'brown':8,'wave.':1,'brain-mind':1,'autumn':2,'sphere':1,'sense':10,'pond':3,'dress':1,'offspring':2,'salts':3,'axis':1,'terrestrial':4,'huge':3,'upbuilding':1,'starting-point':2,'breaking':1,'milk':1,'oligocene':2,'everyday':2,'glowing':2,'friction.':1,'sacred':1,'freezing-point':3,'daughter-cells':1,'creature':17,'simplicity':1,'plant':5,'salt.':1,'paloloworm':1,'trial-and-error':1,'triumphs':2,'plane':1,'pupae':1,'adventure':1,'polynesian':1,'waves':20,'invasion':4,'inconceivable':1,'a':1,'short':4,'dispersion--that':1,'coat':1,'spectra':1,'buns':1,'coal':1,'shore':34,'tentacles':2,'fundamental':8,'egg':4,'triassic.':1,'bustle':1,'pans':1,'infant':1,'earthworm':3,'help':1,'copper':1,'winged':1,'much-disputed':1,'mission':1,'cross':2,'attitude':1,'scientist':1,'lanugo':1,'existence':5,'kinetic':1,'visceral':1,'roots':2,'thirtieth':2,'arteries':1,'thrilling':1,'systema':1,'tickings':1,'lateral':1,'conjugation':1,'actually':2,'bell-animalcules':1,'absence':4,'parts':4,'microscopic':4,'founders':1,'mammal--instinctive':1,'partitions':1,'sheaves':1,'lowell':1,'evening':1,'reappearance':1,'motley':1,'males':2,'primary':5,'framework':2,'walls':5,'iridescent':1,'foot':2,'linking':1,'adventurous':1,'association':2,'cambrian':8,'mystery':2,'slipper':3,'mathematician':3,'ashes':1,'positions':1,'neanderthalers--the':1,'cavendish':1,'physiologically':1,'heavy':3,'reactions':1,'mental':4,'weight':1,'wall-like':1,'colder':1,'hare':3,'notochord':3,'ripple':1,'balance':3,'event':1,'croaking':2,'really':1,'mottled':1,'neanderthal':12,'pigeon':3,'abysses':3,'nautiloids':1,'fountain':1,'dying':1,'issue':1,'prominences':1,'meteoric':1,'foreground':1,'belief':1,'protruding':1,'story':19,'extraordinary':4,'reason':8,'base':6,'brightest':1,'members':7,'heads':2,'earliest':7,'beginning':39,'revolutionary':1,'producers':2,'albatross':1,'american':1,'fruit':1,'circuit':2,'expedient':1,'mangrove-trees':2,'solidly':1,'knots':2,'flood':1,'reversing':1,'moorhen':2,'probability':5,'radical':1,'bullies':1,'song-thrush':2,'antiquity':2,'well-known':3,'dust':2,'scots':1,'warty':3,'soapy':1,'earthworms':2,'idea':10,'horse':10,'tadpoles':2,'temperature':16,'introduction':2,'leading':1,'light-gatherer':1,'least':5,'assumption':1,'statement':2,'scheme':1,'danger-call':1,'muscles':3,'storm':2,'glow':1,'tides--another':1,'immediate':3,'basal':1,'treasures':1,'parr':1,'rifle':1,'prodigious':1,'selenium-cell':1,'modes':1,'kind':5,'observatory':1,'tunic':1,'kindly':1,'parent--little':1,'double':2,'vocal':1,'recording':1,'contrary':1,'risks':5,'egg-cells':1,'head.':1,'playing':3,'anthropoid':10,'stickleback':3,'outstanding':1,'heaviest':3,'ages':8,'well-developed':1,'colour-resemblance':1,'elaboration':1,'egg.':3,'hare--with':1,'organs':1,'gathering':1,'mountain':5,'dancing':3,'speculative':1,'cave':1,'peculiarities':1,'majority':3,'internal':4,'lip':1,'useless':1,'day.':1,'play':3,'electric':13,'capillaries':1,'eggs':21,'measures':1,'salmon':17,'depths':5,'most':67,'alpha':2,'extremely':2,'approved':1,'head-end':1,'equatorial':2,'whalebone':1,'prolongation':2,'clear':1,'instrument':6,'transmissibility':1,'seething':1,'electrons':15,'artistic':1,'velocity':5,'notch':1,'organism':6,'stones':5,'far-flung':1,'open-minded.':1,'gold':1,'fins':1,'wayside':1,'relation':2,'heavens':18,'fine':7,'find':1,'impact':2,'giant':1,'copyright':6,'spineless':1,'nervous':1,'earth-moon':1,'experiment':3,'quadrupedal':1,'circle':1,'indifference':1,'cromagnards':1,'hip':1,'dominant':1,'gains':3,'permission':2,'adventurers':1,'sunny':1,'shore-pools':3,'germ-cells':6,'earth--as':1,'actions':1,'compass':1,'journey.':1,'eye-piece':3,'chick':1,'sleeve':1,'body.':1,'alteration':1,'underlying':1,'common':9,'liver-fluke':1,'river':6,'californian':1,'rhodesian':4,'bars':1,'estuaries':1,'intelligence':3,'touch':2,'individual':15,'migration':1,'long-fingered':1,'walking-stick':1,'close':1,'precursors':1,'arm':3,'spirited':1,'probable':1,'distinctive':1,'taming':1,'smallest':8,'various':13,'conditions':7,'aeons':1,'supposed':1,'beetling':3,'iron':5,'unconscious':2,'web':1,'sole':2,'jaws.':1,'craters':1,'spectroscopic':1,'eustachian':2,'incident':1,'invisible':7,'inertia':1,'colonisation':1,'prospects':1,'last':16,'reverse':1,'distinctively':1,'annual':1,'harpy':1,'sensitive':1,'connection':2,'amoeba':1,'picture.':1,'earth--an':1,'cloud-like':1,'whole':42,'experimental':1,'sloth':1,'point':6,'simple':7,'others':1,'proton':1,'newborn':2,'unicellular':1,'puzzle-boxes':1,'incandescent':1,'unsuccessful':1,'lamprey--a':1,'startling':1,'moon--the':1,'java':8,'miocene':3,'originators':2,'crocodiles':1,'damp':1,'vertebrate':1,'intricacies':1,'secret':6,'maintenance':1,'widening':1,'yolk-laden':1,'empty':4,'modern':25,'flight':1,'squirrel':2,'fire':2,'gas':2,'amphibians':4,'gap':1,'races':1,'formless':1,'indivisible':1,'plants':5,'top--the':1,'solid':5,'straight':1,'bill':1,'routes':1,'pace':1,'error':1,'robin':1,'underground':2,'fore-limb':3,'century':1,'moth':2,'obstacle':2,'cerebrum':1,'simian':3,'atom--the':1,'currents':1,'twofold':1,'forewing':1,'undersides':1,'beune':2,'shorter':1,'stimulated':1,'shad':1,'ray':3,'yucca':6,'composition':2,'higher':14,'unwary':1,'used':1,'optic':1,'u.s.':1,'moving':6,'user':1,'dark':9,'lower':16,'older':1,'spectrum.':1,'people.':1,'consistence':1,'obviously':1,'person':4,'edge':5,'meridian.':1,'scouring':1,'distances':4,'endeavour':1,'migratory':1,'matter.':1,'isolated':1,'shape':7,'atomic':2,'questions':1,'useful':2,'praying':2,'continent':2,'spinners':1,'profitable':3,'superficial':1,'conclusions':1,'scales':3,'humanoid':3,'source':8,'parents':3,'remaining':3,'silken':2,'overhanging':1,'forces':6,'big':11,'sensatory':1,'game':1,'necessary':1,'bit':1,'earth--making':2,'wings':11,'vapour':1,'ponds':1,'photosphere--the':1,'tail.':2,'neanderthaler':1,'shapes':1,'bootlace':1,'well-poised':1,'individuals':1,'popular':3,'disorder':1,'essential':9,'gibbon.':1,'methods':3,'course':24,'spring':3,'last.':1,'back':15,'yolk':1,'diamond.':1,'martian':1,'mighty':1,'sight':1,'steam-engine':1,'curious':1,'gradually':1,'scale':6,'microbes':1,'flux':1,'fifty-millionth':1,'bushy-tailed':1,'pounding':1,'comet':5,'egg-shell':2,'scaly':1,'life-history':3,'object':3,'universe.':3,'protrusible':1,'nasal':1,'agreement':1,'forming':1,'stem':1,'step':1,'more-pork':1,'race--there':1,'nerves':1,'tidal':1,'intense':1,'analysing':1,'web-wing':1,'tortuous':1,'ear-bones':1,'range':2,'gamma':1,'conquest':5,'appropriate':2,'chalk-forming':2,'deep-violet':1,'question':12,'gases':1,'frog':4,'mimicry':2,'mountains':4,'glamour':1,'moon--meteors':1,'atlantic':5,'legs.':1,'atom':27,'adults':1,'coldest':1,'crane':2,'dull':1,'drifters':1,'skull':5,'characteristic':2,'spectroscope':32,'sifting':4,'stalking':1,'planet':17,'exploration':1,'mature':1,'diameter.':1,'sea-urchin':1,'x-ray':1,'non-living':1,'aerial':1,'protrusive':1,'flow':5,'paving-stones':1,'influence':2,'entrance':3,'metals':1,'char':1,'problem.':1,'single':1,'diving':1,'kidney':1,'cotton':1,'rainbow':4,'intrepid':1,'puzzling':1,'prerogative':1,'uranium':2,'occasional':1,'reputation':1,'electrical':1,'amphibian':2,'milk-glands':1,'elements':4,'small-brained':1,'energetic':1,'beginnings':3,'crouching':1,'backbone':8,'problems':1,'lens':2,'meaning':9,'restoration':7,'fruit-fly':1,'fishes':8,'stoppages':1,'sides':4,'structure':8,'land':7,'age':8,'orbit':2,'unhatched':2,'big-brained':2,'once':3,'hampton':2,'saying':1,'results':9,'mantle':2,'aristocrat':1,'conservative':1,'disintegration':2,'magnifying':1,'depletion':1,'young':42,'arid':2,'cradle':5,'blaze':1,'masculine':2,'coco-palms':1,'details':2,'gravel':1,'little-brain':5,'stupefying':1,'breathing':2,'club-moss':1,'wave':1,'electron':19,'entire':7,'archaeopteryx':2,'stiff':1,'fur':1,'button':1,'anxious':1,'race':10,'verdict':1,'sedentary':3,'poles.':1,'blood-fluid':1,'elk':1,'smaller':5,'booty':1,'lightest':3,'procession':3,'euphrates':1,'rivers':9,'noise':1,'munitions':1,'sifting-out':1,'makers':1,'scientific':9,'south':10,'zest':1,'opaque':1,'waning':1,'paddle':1,'hereditary':1,'ape-man':1,'indian':3,'poles':4,'flowing':1,'bird':18,'body':50,'hypothesis':3,'degree':3,'leg':4,'kangaroo':1,'outlying':1,'youngest':2,'growing':1,'river.':1,'boot.':1,'separation':2,'frilled':1,'consideration':1,'physiology':1,'little-brained':1,'extreme':1,'stellar':4,'great':80,'northern':1,'wandering':1,'larger':5,'haunts':3,'resulting':1,'mussel':1,'guidance':1,'apple':1,'danger':1,'round-mouths':1,'wit':3,'motor':5,'oval':2,'precursor':1,'singing':1,'ape':2,'nest':13,'use':9,'fee':2,'adaptation':2,'stream':8,'remains':9,'cretaceous':3,'next':14,'few':1,'contractile':1,'crab':9,'vehicle':2,'eagles':1,'doubling':1,'simpler':2,'mammoth':2,'sort':1,'grandest':3,'clever':1,'inclined':4,'rarest':1,'bodily':2,'rabbit':1,'baby':1,'gambian':2,'harvest':2,'sea-floor':2,'animals':11,'embryos':5,'lapse':1,'recession':1,'obvious':1,'thin':1,'closing':3,'interlinked':1,'proof':1,'control':3,'weaker':1,'corpuscular':1,'process':10,'purposes':1,'pieces':1,'high':5,'electro-magnet':1,'non-radiant':1,'water.':1,'bones':2,'wonderful':7,'voice':8,'class.':1,'united':13,'varied':2,'defective':1,'shasta':1,'nearness':2,'arrangement':4,'cycads':1,'need':2,'seeds':4,'forest':7,'animal':43,'hormones':1,'mysteries':1,'intelligent':2,'stock':1,'cave-men':1,'maternal':1,'yolk-sac':1,'gill-clefts':1,'waters':7,'thunderstorm':2,'collection':2,'tack':1,'wrist':2,'trees':7,'multiplication':4,'venation':1,'famous':2,'snail':3,'light':39,'lines':6,'interrupted':1,'element':3,'chief':9,'okapi':2,'alloy':1,'locomotor':2,'mud-minnows':1,'immensity':1,'longest':7,'spider':8,'evolutionary':4,'thigh':1,'unpalatable':1,'minnow':1,'egg-laying':1,'nerve-cord':1,'earth':193,'triassic':6,'polished':1,'brittle':1,'bunch':1,'industries':1,'1':2,'outer':7,'exclusion':1,'positively-electrified':1,'coral-reefs':2,'hermit-crab':7,'meantime':1,'beginning--whatever':1,'permanent':1,'duckweed':1,'molten':1,'world.':2,'image':1,'originator':2,'epoch-making':1,'junction':1,'future.':1,'orthodox':1,'dam':1,'material':9,'innermost':1,'cock-paidle':1,'phagocytes':1,'snake':1,'hands':2,'front':6,'rotation':5,'cage':1,'day':15,'articles':1,'crumb-of-bread':1,'mastery':2,'establishment':9,'university':2,'sky.':1,'concave':1,'blazing':1,'vibrations':1,'trap':1,'truth':1,'pools':3,'cocoon':1,'paler':1,'traces':1,'erratic':1,'female':12,'tension':1,'scanty':3,'globe':6,'cultivated':1,'mollusc':1,'frequency':1,'sands':2,'irregularities':1,'special':1,'ebooks':1,'suctorial':2,'cerebral':1,'knickerbocker':1,'inch':1,'gossamer':1,'protoplasm':1,'cross-fertilisation':1,'oriental':1,'pendent':1,'adaptive':1,'cause':2,'red':9,'harvest-mouse':1,'thrush':6,'spot':2,'withering':1,'activity':3,'incalculable':1,'body-cavity':1,'usual':7,'qui':1,'primus':1,'sitting':1,'shortest':3,'young--a':1,'allies':1,'g':1,'route':1,'area':4,'times':2,'length':9,'keel':1,'modernising':1,'barriers':1,'empire.':1,'gamekeeper':1,'embryo':6,'finest':3,'baleen':1,'powerful':1,'scene':2,'bonnet':1,'improvements':1,'placental':1,'owner':4,'scent':1,'two.':1,'salient':1,'monkey':2,'system':4,'ripples':1,'nebular':8,'accretion':1,'caterpillars':2,'under-water':1,'nut':2,'inner':7,'shell':12,'x-rays':8,'explanation':4,'secretion':1,'natural':12,'waist':1,'plumage':1,'photograph':5,'glow-worm':1,'quietness':1,'isolation':1,'well-established':1,'discriminating':1,'heavens.':1,'dynamo':3,'stricter':1,'steep':2,'spurs':1,'ingenious':1,'imaginative':2,'sea':46,'lightly':1,'wood-cock':1,'partnership':1,'poisons':1,'variable':2,'mongolian':1,'throat':1,'apparently':2,'bark':1,'seed-box':2,'complete':3,'pollen-tubes':1,'eye-hole':1,'outward':1,'pectoral':1,'ungirt':1,'tree-frogs':1,'centre':8,'digestive':1,'eight':2,'roadside':1,'flat-fish':1,'emancipation':2,'cleverest':2,'food-canals':1,'profoundest':1,'ancestors':5,'so-called':6,'inexorable':1,'consequences':2,'deccan':1,'ovum-producer':1,'face':3,'animal--perhaps':1,'mechanical':1,'occasion':3,'fact':31,'impression':4,'atmosphere':9,'selection':1,'best-defined':1,'chances':1,'text':4,'woolly':1,'pinhead':1,'sabre-toothed':1,'seaweed':3,'rough':1,'darkest':1,'photograph.':1,'principal':1,'water-vapour':2,'knowledge':1,'jaw':4,'mid-europe':1,'jar':1,'surroundings':3,'insectivores':1,'molecules':17,'inherited':1,'b':1,'local':1,'hope':2,'photographs':2,'handle':2,'exceptional':1,'familiar':2,'background':3,'words':2,'striped':1,'emmer':1,'areas':1,'processes':1,'belts':1,'numerous':4,'cells':1,'taxes':1,'insectivorous':1,'coco-nut':1,'stuff':3,'inter-relation':1,'limpet':1,'making.':1,'embryonic':1,'generations':1,'view':4,'spotted':1,'interstices':1,'universe--the':2,'packet':1,'distantly':1,'intensity':3,'legacy':1,'cenozoic':3,'violet':1,'cleverer':2,'luminous':2,'carboniferous':13,'humblest':2,'nebulae':1,'wire':5,'pedigree':1,'jurassic':5,'pattern':1,'nebula':5,'genius':1,'state':5,'quickest':1,'carapace':2,'hebrides':1,'routine':3,'progress':3,'open-sea':2,'kidneys':3,'attention':3,'explosive':1,'ability':1,'rotating':1,'importance':4,'hurrying':1,'seaweeds':2,'kea':2,'efficiency':1,'wingless':1,'hoatzin':2,'acquisitions':2,'key':3,'eyes.':1,'precious':2,'swift':1,'problem':14,'sediments':1,'limits':5,'cranial':1,'minds':2,'pulp':1,'figures':1,'sexes':2,'plankton':1,'chest':2,'conflagration':1,'wall':2,'wavy-to':1,'mid-rib':2,'animalcule':1,'table':1,'zinc':4,'provinces':1,'palm-bones':1,'tremendous':1,'discrimination':2,'trademark':3,'dazzling':1,'immense':4,'reindeer':2,'squatting':1,'slowly':1,'curtain':1,'feather':1,'waste':1,'senses':3,'controlled':1,'received':1,'coherence':1,'sub-aquatic':1,'bulk':1,'environment.':1,'angler':3,'food-canal':5,'present':15,'associated':1,'crowds':1,'appearance':5,'will':1,'country':1,'wild':8,'discoveries':2,'supply':2,'comets':1,'spectrum--should':1,'food-debris':1,'streams':2,'chaotic':1,'blood':20,'bumbling':1,'surface':50,'raison':1,'bugbear':1,'greater':1,'watchful':1,'jaws':1,'pit':1,'carbohydrates':1,'richness':1,'radiation':2,'forceps':2,'fashioning':1,'romance':5,'strange':1,'exuberance':1,'flower':2,'geographical':1,'ante-natal':2,'well-grown':1,'firmament':1,'neolithic':3,'ball':1,'dusk':2,'appearances':2,'effect':6,'experimenter':1,'colouring':1,'student':2,'fierce':2,'frequently':1,'whale':3,'wonder-world':1,'colour':12,'banded':1,'larvae':1,'ear-passage':2,'english':2,'position':1,'wreckage':1,'drawing':1,'latest':2,'reefs':1,'enormously':4,'flesh':2,'wren':1,'faunal':1,'domestic':1,'flywheel':2,'satellites':1,'ermine':2,'stored':1,'distant':3,'inturned':1,'cuckoo-spit':2,'protecting':1,'glue':1,'wrens--to':1,'grappling':1,'rapid':2,'ovum':3,'work.':1,'antarctic':2,'bell':5,'sky':7,'deposits':2,'transparent':3,'reasons':3,'wet':2,'usage':1,'ought':1,'characteristically':1,'meteor':1,'fate':2,'disappearance':1,'biologists':1,'smithsonian':10,'originative':1,'prominent':2,'loss':1,'backboned':1,'like':11,'success':1,'safest':1,'parasite':2,'colonising':1,'leaves':2,'works':2,'soft':4,'radiant':1,'heel':2,'wonders':3,'glare':2,'ages--evolution':1,'thymus':1,'phenomena':4,'mosquitoes':1,'eventfulness':1,'growth':3,'warmer':1,'past.':1,'proper':2,'trammels':1,'employment':1,'mother':12,'recognition':1,'possibilities':1,'leaf':6,'broad':4,'separate':1,'ether':27,'tadpole':3,'magnitude':2,'board.':1,'fruition':1,'biology':1,'scapula':1,'butterfish':1,'decline':1,'tenability':1,'paper':4,'pressure':3,'host':5,'instinct':2,'germination':1,'brain-box':1,'dredge':1,'transformations':1,'actual':8,'extension':2,'electron--the':1,'universe':37,'certainty':1,'preen':1,'andes':1,'carrier':1,'dominion':1,'rock-record':1,'flattened':1,'tongue':3,'contending':1,'letters':1,'fresh':2,'primal':1,'chemists':1,'wearisome':1,'promise':1,'erect':3,'times.':1,'registration':1,'protozoa':3,'swimmers':1,'mere':4,'endeavours':1,'parentage':1,'sticklebacks':2,'additional':2,'zoologist':1,'slow-worm':1,'museum':2,'larval':3,'spiral':3,'spots':4,'continental':1,'much':4,'invisibility':1,'cell.':1,'biggest':2,'maze':1,'breeding':4,'mouth.':3,'function':1,'funnel':1,'north':11,'gait':1,'repeated':1,'construction':1,'highest':8,'bug':1,'bud':1,'eel':2,'tactics':2,'cohesion':1,'places':2,'volplaning':1,'gravitational':3,'official':2,'smooth':1,'triumphant':1,'poker.':1,'record':1,'projecting':1,'lynx':2,'static':1,'distribution':1,'piece':4,'stirring':1,'supreme':1,'mesozoic':7,'universal':5,'penny':2,'whelk':2,'persistent':1,'water-vole':1,'ten-millionth':1,'elaborate':1,'tide.':1,'education':1,'domesticated':1,'atom--that':1,'mutual':2,'variety':4,'deadly':1,'fore-arm':3,'forests':2,'other':65,'boom':1,'branch':3,'mass':8,'wing':5,'chemist':1,'conclusion':6,'sunshine':2,'kinds':1,'tides':17,'variation':1,'enlargement':2,'astronomy':1,'exposure':1,'ranks':2,'space':1,'pigment-cells':1,'rule':4,'forest.':1,'eighties.':1,'inset':1,'half-second':1,'meteoritic':1,'sun--the':2},'marsupials':{'insectivorous':1,'on':1,'where':1},'musical':{'genius':2},'kinship':{'would':1},'deep-red':{'light':1,'waves':1},'unified':{'by':1},'macaque':{'second':1,'genus':1},'indigo':{'and':1,'to':1,'salicylic':1,'for':1,'in':1},'kale':{'and':1},'quoted':{'tells':1},'photo':{'press':1,':':164,'press.':1},'newton':{'because':1,'for':4,'except':1,'s':1,'taught':1,'worked':1,'was':1},'wasps':{'exhibit':1,';':1,'are':1,'.':1},'cap.':{'illustration':1},'thanks':{'to':2},'victim':{'to':1,'unawares.':1,'.':1},'upturned':{'side':1},'triticum':{'hermonis':1},'electronically':{'the':1,'in':1},'thyroid':{'and':1,'the':1,'.':1},'fearful':{'crime':1},'hills':{'and':2,'the':1},'evidences':{'perhaps':1,'of':5},'passive':{'the':1,'drifters':1,'in':1},'alchemy':{'but':1},'belongs':{'to':1,'was':1,'illustrates':1},'transformed':{'for':1,'descendants':1,'into':2,'directly':1,'guise':1,'by':1,'descendant':1},'board':{'a':1,'nail':1,'ship':1,'with':1,'in':1},'marginal':{'tentacles':1},'industrious':{'but':1},'openings':{'from':1},'photographed':{'from':1,'in':2},'boxed':{'in':1},'them--as':{'a':1},'required.':{'it':1},'caps':{'may':1,'on':1},'it--for':{'several':1},'fusion':{'of':3},'god.':{'nevertheless':1},'argonauta':{'an':2},'cape':{'colony':1},'rough-and-tumble':{'conditions':2},'retreat':{'but':1,'.':1},'hairless':{'whale':1},'utilisation':{'of':2,'was':1},'insurgent':{'nature':1},'cooler':{'vapours--the':1,'than':1,'they':1},'lapsed':{'intelligence':1},'sand-hoppers':{'and':1,'when':1},'evidence.':{'experiments':1},'homing':{'pigeons':1,'pigeon':2},'night':{'and':5,'means':1,'of':1,'is':2,'between':1,'when':2,'algol':1,'.':3,'to':2,'year':1,'the':1,'with':1,'or':1},'security':{'not':1,'that':1},'amoebae':{'and':2,'in':1},'cooled':{'down':2,'and':1,'so':1,'at':1},'dentition':{'but':2},'webb':{'celestial':1},'portuguese':{'man-of-war':2,'men-of-war':1},'bricks.':{'in':1},'lashes':{'or':1},'sends':{'to':1,'on':1},'3030':{'0':1},'1909':{'showing':1,'23':1},'fully-formed':{'creature.':1,'eel.':1,'young':1},'odours':{'a':1},'minnow--the':{'mind':1},'lashed':{'cells':1},'waves--which':{'are':1},'vertebrae':{'forming':1,'of':1,'as':1,'which':1,'.':2},'rill':{'of':1},'orchid':{'perched':1},'signifying':{'particular':1},'asking':{'the':1,'an':1},'lassoes':{'on':1},'month.':{'surprising':1},'colour-cells':{'chromatophores':1,'in':1},'beating':{'seconds':1,'heart':1,'of':1},'columbus':{'voyages':1,'.':1},'states.':{'1.e':1},'view':{'and':2,'that':6,'of':17,'is':3,'primary':1,'.':1,'will':1,'their':1,'maintained':1,'does':1,'which':1,'instinctive':1},'confer':{'upon':1},'illustration':{'24':1,'and':2,'144':2,':':233,'20':1,'that':1,'may':1,'158':1,'showing':2,'indicates':1,'74':1,'168':1,'of':10,'252':1,'280':1,'92':1,'172':1,'is':3,'shows':3},'constructive':{'chemical':1,'possibilities':1},'--these':{'also':1},'six.':{'beyond':1,'it':1},'peer':{'of':1},'taker':{'of':1},'post':{'shows':1},'properties':{'and':1,'of':1,'utterly':1,'attributed':1},'takes':{'stones':1,'on':1,'in':1,'up':1,'approximately':2,'air':1,'to':4,'place':1,'a':3,'time':2,'fresh':1,'the':1,'place.':1,'its':1,'at':1},'chaff':{'separated':1},'theirs':{'certainly':1},'coral':{'and':1,'islands':2,'built':2,'have':1},'months':{'and':1,'within':1,'old':2,'of':3,'after':1,'in':2,'from':1,'the':1,'before':1,'more':1},'constituting':{'that':1},'gentler':{'hills':1},'self-preserving':{'and':1},'horizon':{'the':1},'octopus':{'attacking':2},'serviss':{'curiosities':1},'considerations':{'there':1},'dilemma':{'of':1},'scantier':{'light':1},'pays':{'an':1},'crittur':{'on':1},'float':{'idly':1,'apart':1},'bound':{'to':3,'into':1,'up':1,'by':3},'gearing':{'it':1},'loin':{'and':1},'capped':{'with':1},'magnified.':{'is':1,'the':2,'illustration':1},'formidable':{'forelegs':1,'teeth.':1},'palaeozoic':{'the':1,'nine':1,'mesozoic':1,'era':4},'tint.':{'thus':1},'strangely':{'limited':1,'regular':1},'fight':{'but':1},'conservation':{'of':1},'way':{'and':6,'rooks':1,'specially':1,'remarkable':1,'acquired':1,'into':1,'we':5,'see':1,'through':2,'are':1,'in':10,'offshore.':1,'herring-gulls':1,'from':3,'for':2,'how':1,'there':1,'.':14,'note':1,'to':7,'which':4,'14':1,'out':1,'was':1,'over':1,'gave':1,'round.':1,'begins':1,'comparable':1,'arises':1,'aspects':2,'extend':1,'that':3,'ancestral.':1,'however':1,'but':1,'it':1,'never':1,'along':1,'with':4,'by':1,'he':1,'a':1,'like':1,'of':24,'as':2,'so':1,'back':1,'each':1,'the':7},'wax':{'from':1},'editions':{'will':2,'all':1,'means':1},'dorsal':{'vertebrae':2},'was':{'all':1,'just':2,'less':2,'caused':1,'able':1,'satisfied':1,'discovered':8,'astonished':2,'taken--the':1,'stored':1,'through':1,'still':2,'nearer':1,'certainly':1,'vigorously':1,'also':3,'thinking':1,'much':1,'regarded':1,'exercising':1,'actually':1,'to':3,'finally':1,'spread':1,'bridged':1,'hidden':1,'foster-parent':1,'sent':1,'brown':1,'watching':1,'prevented':2,'replaced':1,'possible':1,'possibly':1,'five':1,'altogether':1,'not':16,'during':2,'associated':2,'now':2,'continued':2,'killed':1,'forty-five':1,'wont':1,'rotating':2,'like':2,'shaped':2,'heaved':1,'joined':1,'twice':1,'found':6,'entirely':1,'spotted':1,'the':49,'set':2,'often':1,'hinted':1,'achieved':1,'absolutely':2,'hard':1,'some':1,'somehow':1,'dead':1,'observed':1,'born':1,'semi-tropical':1,'taught':1,'enhanced':1,'further':1,'extended':1,'perfected':1,'out':1,'established':1,'ultimately':1,'said':1,'imported':1,'placed':2,'unable':1,'probably':8,'neither':1,'ever':1,'filled':1,'freed':1,'condensed':1,'felt':2,'never':2,'quite':1,'by':3,'following':1,'protection':1,'practically':1,'sixty':1,'drawn':1,'joule':1,'promptly':1,'beginning':1,'implicit':1,'suggested':1,'on':1,'about':2,'grist':1,'created':1,'of':1,'barely':1,'later':1,'accomplished':1,'conveyed':1,'unknown':1,'asked':1,'first':1,'composed':1,'raised':1,'already':1,'followed':1,'merely':1,'marked':2,'one':5,'brought':2,'soaring':1,'because':1,'done':1,'cultivated':1,'elementary':1,'proved':2,'noticed':3,'repopulation':1,'doubtless':2,'once':5,'given':3,'invented':2,'from':1,'twenty':1,'due':2,'long':1,'quickly':1,'going':1,'punished':1,'too':4,'taken':2,'formed':1,'laboriously':1,'until':1,'opposed':1,'only':3,'that':4,'happily':1,'mind':2,'offered':1,'continuous':1,'but':2,'direct':1,'repeated':1,'part':2,'known':3,'trying':1,'true':1,'travelling':1,'he':2,'applied':2,'made':4,'this':1,'crossed':1,'originally':3,'immaterial':1,'premature':1,'sometimes':1,'cast':1,'near':1,'accustomed':1,'believed':1,'making':1,'called':2,'at':3,'150':1,'discovered.':1,'constant':1,'then':2,'almost':1,'thus':1,'it':2,'slowing':1,'an':5,'something':1,'in':9,'distinguishable':1,'any':3,'constructed':1,'effected':1,'dimly':1,'no':7,'perhaps':2,'when':1,'isolated':1,'evidently':1,'shorter':1,'.':2,'ordinary':1,'first--began':1,'fairly':1,'used':1,'tried':1,'emotionally':1,'living':1,'conceived':1,'upon':1,'most':2,'moving':1,'destined':2,'propagated':1,'aware':1,'subsequently':1,'a':40,'off':1,'happening':1,'largely':1,'broadened':1,'stronger':1,'or':1,'exceedingly':1,'implied':1,'so':4,'persistently':2,'very':4,'underrated':1,'swimming':1,'sounded':1,'refused':1,'repeopled':1},'war':{'would':1,'mr':1,'museum.':4,'note':1,'to':1,'in':1,'was':1,'254':1},'lowest':{'mammals':1,'pleistocene':1,'there':1,'.':1,'tide':1,'human':1,'arm':1,'first':1},'gaseous':{'state':1,'nebula':3,'nebulae':2,'ring':1,'.':1},'wheatfields':{'were':1},'afresh':{'and':1,'to':1},'fish-eater':{';':1},'becoming':{'longer.':1,'a':2,'longer':1,'suddenly':1,'of':1,'stereotyped':1,'.':2,'almost':1,'complicated':1,'either':1,'in':2,'linking':1,'adapted':1,'more':1},'converse':{'process--a':1},'peninsula':{'of':1,'it':1},'mysterious':{'phases':1,'rays':3,'force':1,'sailing':1,'universe':1,'as':1,'manifestations':2,'forces':1,'cold':1},'quiet-flowing':{'stretches':1},'needles':{'and':1,';':1},'same.':{'a':1},'astonished':{'to':2,'euclid':1},'true':{'flier':2,'is':1,'sense':2,'multicellular':1,'as':2,'in':4,'even':1,'to':1,'ventral':2,'nature':2,'when':1,'.':4,'also':1,'water-spider':1,'circle':1,'bird.':1,'we':1,'flight':1,'that':6,'men':1,'but':1,'fishes':1,'lids':1,'of':6,'mimicry.':1,'the':1,'or':1},'absent':{'of':1,'from':1},'edition.':{'most':1},'reproductive':{'and':1,'cells':1,'organs':3},'ancestral':{'forms':2,'home':1,'stocks':1},'maximum':{'abundance':1,'as':1,'sparseness':1,'in':1,'disclaimer':1},'arc-lamp':{'is':1},'generosity':{'which':1},'emotional':{'art':1,'halo':1},'emit':{'light':2,'but':1},'hotter':{'and':1,'than':1,'.':2,'at':1,'the':1,'until':1},'frederick':{'matter':1,'soddy':1},'muscular':{'appendages':1,'arrangements':1,'system':1},'evidence':{'for':2,'e.g':1,'of':12,'is':1,'there':1,'1':1,'to':1,'that':3,'are':1,'in':2,'suggesting':1,'the':1,';':1},'guessed':{'at':1},'juice.':{'illustration':1},'promised':{'land':2},'prayer':{';':1},'20':{'of':1,'000':1,'reproduced':1,'ounces':1},'life--story':{'of':1},'archive':{'foundation':12,'foundation.':1},'physical':{'and':2,'strength':1,'laboratory.':2,'constitution':1,'basis':1,'universe':1,'environment':1,'renaissance':1,'peculiarities':1,'medium':2,'fact':1,'type':1,'laboratory':1,'conditions':1,'change':1},'curiosities':{'of':1},'dimly':{'guessed':1,'unveiled':1,'aware':1},'dying':{'a':1,'--the':1,'suns':2,'of':1,'sec':1,'sun':1},'40-inch':{'refracting':2,'refractor':2},'reality':{'even':1,'of':3,'one':1,'by':1,'.':3},'pickering':{'thinks':1,'another':1},'holding':{'a':2,'firm':1,'them':2,'her':1,'on':1,'up':1,'fast':3,'their':1},'test':{'the':1,'variations':1,'what':1},'shrink':{'amazingly':1,'into':1,'by':1,'in':1},'robber-crab':{'birgus':2,'as':1,'with':1,'which':2,'for':1},'ordovician':{'the':1,'period':3},'brothers':{'may':1,'.':1},'welcome':{'realisation':1},'convincing':{'impression':1,'enough':1,'quality':1,'though':1},'anatomist':{'sir':1},'walton':{'the':1},'scores':{'of':3},'dissipation':{'of':1},'ours.':{'sec':1},'promise.':{'each':1},'kelts':{'after':1},'interval':{'of':1},'together':{'and':5,'as':5,'result':1,'in':4,'again':2,'by':3,'make':1,'.':3,'to':2,'you':1,'ever':1,'do':1,'again.':1,'but':1,'they':1,'with':2,';':1,'a':3,'of':1,'loosely':1,'so':3,'the':1},'brocklehurst.':{'a':2,'the':2},'beds':{'of':5,'which':1,'were':1},'reception':{'that':1},'sporozoa':{'like':1},'marinus':{'120':1,'which':1},'tigris':{'and':1},'concept':{'and':1,'of':1,'man':1},'impulse':{'to':2,'or':2},'phosphorescence':{'.':1},'aptitudes--power':{'of':1},'dance':{'but':1},'fulcrum':{'for':1},'brownian':{'movement':5},'contingencies--the':{'risk':1},'dalton':{'who':1,'.':1},'tenable':{'now.':1},'layers':{'that':2,'of':4,'into':1,'envelop':1,'.':1,'below':1},'certainly':{'they':1,'scanty':1,'serve':1,'due':1,'been':1,'one':2,'deserves':1,'is--but':1,'not':1,'white':1,'an':1,'was':1,'tells':1},'zone':{'on':1,'there':1,'was':1,'between':1},'shrinkage':{'of':2,'.':1},'hump':{'would':1},'flash':{'from':1,'across':1,'lasts':1},'absorbing':{'dry':1,'matter':1,'some':1},'fog':{'as':1},'permanently':{'like':1},'rhythm':{'which':1},'division':{'of':7,'or':2},'protective':{'resemblance':9,'significance--called':1,'capacity':1,'coloration':6},'sockets':{'along':1},'diminish':{'to':1},'particles.':{'the':1,'they':1},'liability':{'to':2,'costs':1,'breach':1},'aesop':{'prawn':3},'corals.':{'the':1},'mendelism':{'and':1},'trouble':{'than':1},'maternal':{'chromosomes.':1,'call':1,'virtue':1,'care.':1,'origin.':1,'affection':1,'care':1},'brows':{'and':1},'feeble':{'and':1,'current':1,'life':1},'rotating':{'on':1,'about':1,'quicker':1,'faster':2,'very':1,'flywheel':2,'disc':4,'earth':1,'immensely':1,'with':1,'round':3},'perceived':{'the':1,'.':2,'what':1,'either':1},'respiratory':{'system':1,'surface':1},'scandinavia':{'showing':2,'138':1,'141':1},'presented':{'alternately':1,'them':1,'simultaneously':1},'altering':{'the':1},'turns':{'on':2,'always':1,'upon':1,'to':1,'the':1,'round':1},'gun':{'that':1},'gum':{'is':1},'ox':{'and':1},'p':{'.':10},'means--resides':{'in':1},'revolutionised':{'physics':1},'gut':{'is':1,'which':1},'sloths':{'and':1},'woven':{'somehow':1},'upper':{'side.':1,'atmosphere':1,'eyelid':1,'fish':1,'pliocene':1,'reaches':3,'corner':1,'arm':1,'or':2,'pleistocene':2,'cretaceous':1,'regions':1,'parts':2,'lip':3,';':1,'hand':1,'diagram':1,'part':2,'surface':4,'cambrian':1,'photograph':1,'air':1,'side':1},'revolution':{'of':1,'diameter':1,'in':3},'full-grown':{'fish':1,'salmon':1,'shore-crab':1,'individual':1,'the':1,'creature':1},'penetrates':{'the':1},'spoonbill':{'s':2},'d':{'etre':1,'.':1},'niggardly':{'for':1},'affiliation':{'to':1,'with':1},'semi-tropical':{'for':1},'cost':{'and':2,'fee':1,'when':1,'but':1},'change-provoking':{'cross-fertilisation.':1},'helpless':{'that':1},'penetrated':{'further':1,'into':3},'cargo':{'that':1},'appear':{'and':1,'a':1,'it':1,'.':1,'to':9,'as':1,'much':1,'denser':1,'prominently':1,'white':1},'assistance':{'they':1},'burrowers':{'and':1,'like':1},'uniform':{'and':2,'set':1,'temperature':9,'teeth':1},'wave-motion':{'in':1},'eight-armed':{'cuttlefish':2},'illustrations':{'facing':1,'of':2,'all':1,'are':1,'among':1},'shared':{'the':1,'with':1,'equally':1,'by':1},'flame.':{'perhaps':1},'sea-cucumbers':{'lamp-shells':1},'institutions--all':{'must':1},'alertness':{'and':1,'of':1,'along':1,'is':1},'safety.':{'we':1},'supporting':{'and':1,'axis':3},'anvil.':{'as':1},'whiteness':{'may':1,'makes':1,'.':1},'disclaim':{'all':1},'suckers':{'which':1},'sieve':{'incalculable':1},'teacher':{'and':1,'always':1,'the':1,'between':1},'change':{'whose':1,'by':1,'abundant':1,'from':1,'of':9,'into':1,'in':6,'but':1,'.':2,'produced':1,'till':1,'every':1,'they':1,'reorganisation':1,'need':1,'the':1,':':1,'its':2,';':2,'is':1},'sending':{'a':1,'out':1},'illustration.':{'such':1},'flames':{'are':1,'rose':1,'from':1,'peeping':1,'of':1},'impatiently':{'postulated':1},'precursor':{'of':1},'twenty-seven':{'of':1},'vibrating':{'or':1},'trial':{'and':5,'of':1,'the':1,'was':1},'pictorial':{'diagram':1,'representation':3},'usually':{'about':1,'formed':1,'in':3,'longer':1,'produces':1,'very':1,'regarded':2,'work':1,'credited':1,'back':1,'rank':1,'less':1,'multiplies':1,'coming':1,'got':1,'given':1,'disappears':1,'creep':1,'mean':1},'locomotion':{'and':1,'becomes':1,'it':1,'192':1,'which':2,'the':1},'432':{'times':1},'inference':{'we':1,'when':1,'but':1,'.':1,'reason':1,'in':1,'not':1,'or':1},'saunders':{'with':1,'hit':1,'so':1},'stimulus.':{'2':1},'keenness':{'of':1},'sign':{'of':2},'marked':{'a':1,'on':1,'superficial':1,'off':2,'and':1,'d.p.':1,'h':1,'differences':1,'up':1,'vm':1,'by':8,'rotting':1,'fusion':1,'5':1,'in':3,'the':2,'changes':1,'than':1,'as':1},'outfly':{'a':1},'italians':{'punics':1},'seashore':{'and':2,'animals':1,'into':1,'.':1,'sponge':1,'to':1,'through':1,'struggle':1,'in':1,'birds':1},'comets--millions':{'of':1},'capacious':{'and':1,'mouth':1},'illumination':{'is':1,'or':1,'would':1},'rarely':{'seen':1,'over':1,'hinted':1,'dying':1},'pressure--2-1':{'2':1},'stingy':{'for':1},'cuttlefishes':{'which':1,'are':1,'have':1,'in':1,'the':1,'where':1,'by':1},'terminal':{'chamber':1},'breed.':{'there':1},'stereoscopic':{'vision':1},'primrose':{'among':1},'prove':{'to':1,'the':3,'his':1,'that':2},'time-table':{'the':1},'territories':{'of':1},'live':{'a':1,'on':4,'equally':1,'for':1,'independent':1,'far':1,'is':1,'there':2,'among':1,'much':1,'in':5,'the':1,'comfortably':1},'spontaneity':{'on':1},'wonderfully':{'supplemented':1,'rapid':1,'complete':1,'energetic':1},'bluffing':{'on':1},'1.e.8.':{'1.b':1},'angels':{'crowned':1},'entrance':{'and':1,'to':2},'water-ouzel':{'or':1},'cluck':{'when':1},'regrowing':{'them':2},'envelope':{'immediately':1,'or':1,'stops':1,'of':1},'planarian':{'worms':1},'clue':{'to':2},'grilse':{'and':1,'stage':1},'envelops':{'our':1,'the':1},'clumps':{'of':1},'duck-ponds':{'or':1},'migrants':{'from':1},'haddington':{'of':1},'nature--on':{'which':1},'theory--spiral':{'nebulae--the':1},'wolf-dog':{'226':1,'an':1},'cat':{'a':1,'could':1,'has':1,'or':2},'hardest':{'solid':1,'steel':1},'gathers':{'on':1,'more':1},'can':{'control':1,'now':2,'think':1,'divide':1,'be':63,'almost':1,'move':1,'notice':1,'sting':2,'replenish':1,'outfly':1,'say':5,'harness':1,'exist':1,'expect':1,'have':1,'re-utilise':1,'go':1,'dissolve':1,'to-day':1,'discern':1,'glimpse':1,'detect':2,'from':1,'calculate':1,'no':1,'always':1,'transfer':1,'make':4,'offer':1,'help':1,'only':5,'continually':1,'also':2,'live':1,'call':2,'therefore':1,'transmit':1,'survive':5,'hardly':4,'tell':3,'hope':1,'take':2,'breathe':1,'do':4,'we':1,'trace':1,'get':2,'afford':1,'never':1,'use':1,'discover':1,'observe':1,'unfurl':1,'recognise':1,'imagine':4,'distinguish':1,'affect':1,'copy':1,'fly':1,'reveal':1,'extend':1,'in':2,'apprehend.':1,'receive':1,'ever':1,'conceive':1,'work':1,'well':1,'see':4,'retain':1,'grind':1,'credit':1,'remain':1,'succeed':1,'form':1,'confidently':1,'easily':4,'become':1,'weigh':1,'the':1,'assign':1,'travel':1},'thirty-five':{'seconds':1,'minutes':1},'metamorphosis':{'the':1,'.':1},'stimulating':{'and':1,'conditions':1,'change':1},'http:':{'www.pgdp.net':2,'www.pglaf.org.':1,'www.gutenberg.org':2,'gutenberg.org':1,'pglaf.org':4},'heart':{'a':1,'for':1,'of':5,'there':1,'it':1,'.':1,'true':1,'or':1},'pauses':{'in':1},'expanding':{'during':1,'fan':1},'apartness':{'there':1,'from':1},'heard':{'not':1,'of':2,'the':1,'felt':1,'than':1},'chin':{'and':1,'process':1,'.':3},'clothing':{'and':1,'with':1},'occur':{'and':2,'only':1,'also':1,'near':1,'in':4,':':1},'candle;':{'the':1},'infantile':{'call':1,'mortality':3},'dispositions':{'of':1},'discussion':{'of':1,'there':1},'starch':{'and':1,'molecule':1,'.':1},'sandstone':{'was':1,'or':1},'condensation.':{'spiral':1},'offspring':{'and':1,'for':1,'of':1,'is':2,'.':2,'mate':1,'at':1},'nowhere':{'do':1},'despair':{'returned':1},'candle.':{'it':1},'actual':{'photographs':1,'distance':1,'solution...':1,'constitution':1,'temperature':2,'centre':1,'photograph':1,'entity':1,'direct':1,'observations':1,'historical':1,'mechanical':1,'precipitate':1,'dimensions':1},'future.':{'4':1},'familiar':{'case':1,'hum':1,'is':1,'in':2,'type':1,'with':3,'example':1,'fact':1},'over-population':{'and':1,'in':1},'brine-shrimp':{'artemia':1},'dominance':{'of':1},'economy':{'of':2},'gonads':{'only':1},'product':{'which':1},'burrowing':{'mammals':1,'reptiles':1,'parrot':1,'amphibians':1,'birds':1},'southern':{'europe':1,'india':1,'asia':1,'hemisphere':1,'representative':1,'sea':2},'unobtrusive':{'appearance':1},'disgusted':{'next':1},'significance.':{'it':1,'they':1},'produce':{'a':3,'what':1,'very':1,'light':1,'tides':1,'seeds':1,'in':1,'our':1,'the':2,'helium':1},'flourish':{'sometimes':1,'alongside':1},'mentality':{'and':1,'cannot':1,'.':1},'lifting':{'scrap':1,'handling':1},'upbuilding':{'constructive':1},'visitors':{'and':2,'.':1,'are':1,'have':1,'threw':1},'remember':{'how':1,'the':3,'that':3,'sally':1,'their':1},'whenever':{'the':2,'there':1,'any':1},'corona':{'of':2,'is':1,'stretching':1,'which':1,'that':1},'rather':{'a':1,'we':1,'ferocious.':1,'grouselike':1,'longer':1,'that':1,'humdrum':1,'more':2,'than':9,'to':1,'far-fetched':1,'excitedly':1,'in':4,'paltry':1,'eventful':1,'nondescript':1,'simpler':1,'with':1,'the':1,'trout-like':1,'like':1},'conquests':{'of':1},'punting':{'when':1,'sculling':1},'typical':{'plants':1,'spectra':1,'craters':1,'districts':1,'expression':1,'assemblage':1},'no.':{'bred':1},'serving':{'as':1,'the':1},'iii.':{'trial-and-error':1},'indeed':{'what':2,'climate':1,'made':1,'beyond':1,'that':1,'many':1,'no':1,'we':1,'unsurpassable':1,'will':1,'.':1,'safety':1,'they':1,'always':1,'our':1,'the':1,'believe':1,'if':1},'beak':{'and':1,'is':1,'.':1,'under':1},'well-illumined':{'seaweed-growing':1},'playful':{'such':1,'creature':1},'brain':{'and':9,'weighs':1,'is':7,'as':2,'are':1,'should':1,'from':2,'.':2,'does':3,'which':4,'instead':1,';':2,'has':1,'was':2,'shows':1,'development':2,'than':1,'receiving':1,'of':3,'could':1,'inferred':1,'cast':1},'stile':{'which':1},'hairs--an':{'alga':1},'nitrogen':{'of':1},'cold':{'and':1,'on':2,'poker':1,'outer':1,'for':2,'light':1,'.':1,'water':1,'to':1,'weather':1,'iron':2,'of':3,'dark':1,'absorbs':1,'luminosity':1,'yet':1,'came':1},'still':{'and':1,'atmosphere':1,'smaller':3,'being':2,'progressing.':1,'some':1,'it':1,'probing':1,'say':1,'exist':1,'farther':1,'in':3,'further':3,'nearer':1,'bears':2,'unknown':1,'.':3,'shorter':3,'to':1,'going':1,'goes':1,'persist':1,'molten':1,'was':1,'unstereotyped':1,'more':3,'we':1,'himself':1,'very':3,'continuing':1,'plays--the':1,'but':1,'particular':1,'not':1,'with':1,'the':2,'possess':1,'a':1,'made':1,'uncertain':1,'flourished':1,'room':1,'at':1,'tower':1,'feeling':1,'soft':1,'are':1},'birds':{'and':23,'feed':1,'because':1,'often':1,'show':1,'being':1,'is':3,'191':1,'it':1,'as':2,'are':4,'sight':1,'in':1,'carry':1,'seem':1,'its':1,'little':1,'squat':1,'for':1,'how':1,'make':2,'there':1,'.':2,'to':1,'find':1,';':1,'was':1,'evolved':2,'reaching':1,'may':1,'pick':1,'illustration':1,'like':7,'bolt':1,'such':1,'than':1,'must':1,'a':1,'that':4,'of':2,'turn':1,'have':2,'learn':1,'the':1,'where':1,'came':1},'statuettes':{'representing':1},'nucleus.':{'the':1,'illustration':1},'culmination':{'of':1},'tending':{'on':1,'toward':1,'to':3},'curly':{'greens':1},'rhizopods':{'such':1,'with':1},'willow':{'fertile':1,'grouse':2},'forms':{'and':6,'e.g.':1,'almost':1,'over':1,'it':2,'are':1,'arise':1,'kinetic':1,'again':1,'from':2,'.':2,'which':1,'tends':1,';':1,'we':1,'may':1,'daughter-buds':1,'a':7,'like':2,'of':22,'possessed':1,'so':1,'the':1,'or':1},'immortality':{'of':1},'suffocate':{'.':1},'spacious':{'bountiful':1,'cranial':1},'physics--research':{'and':1},'bird.':{'experiments':1,'illustration':2},'pruned':{'off':1},'speeding':{'toward':1},'inter-relations':{'such':1,'.':2,'where':1,'between':1,'simpler':1},'introduce':{'domesticated':1,'us':1,'an':1},'archaeozoic':{'and':1,'ages':1},'tails':{'of':1,'can':1,'.':1},'half':{'a':7,'old':1,'that':1,'of':3,'days':1,'an':3,'hours':2,'to':1,'tons':1,'miles':1,'mile':1,'the':4,'years':1,'out':1},'not':{'represent':1,'all':4,'clog':1,'help':1,'limited':2,'being':1,'indeed':2,'armour':1,'fall':1,'held':1,'through':1,'go':2,'follow':3,'yet':5,'also':1,'convinced':1,'less':5,'young':1,'mathematically':1,'to':11,'only':16,'stand':1,'touched':1,'easy':1,'attained':1,'include':1,'then':2,'unfitting':1,'closed':1,'knock':1,'very':9,'void':1,'material':2,'stop':1,'possible':2,'possibly':1,'open.':1,'know':13,'altogether':1,'accumulate':1,'affect':2,'one':2,'discuss':1,'easily':3,'practise':1,'necessary':1,'like':1,'tear':1,'fully':2,'try':1,'pursue':1,'feel':1,'stopped':1,'always':3,'small':1,'become':1,'entirely':1,'fixed':1,'mean':1,'exceed':1,'related':1,'certain':1,'know.':1,'likely':1,'sure':1,'exist.':2,'functioning':1,'packed':1,'even':3,'appear':2,'for':2,'uniform':1,'liberated':1,'radiated':1,'suggesting':1,'got':2,'be':20,'we':1,'disputed':1,'intelligent.':1,'cellulose':1,'however':1,'hundreds':1,'met':1,'necessarily':3,'attend':1,'backed':1,'quite':4,'come':1,'by':5,'momentous':1,'wait':1,'suggested':1,'on':2,'essentially':1,'indivisible':2,'many':1,'emit':1,'amount':1,'sweat':1,'permit':2,'undergo':1,'think':1,'burning':1,'gone':1,'previously':1,'requiring':1,'merely':2,'bound':1,'highly':1,'visible':1,'been':3,'carry':1,'impossible':1,'want.':1,'readily':3,'given':1,'wanted':1,'from':1,'droop':1,'prove':2,'assumed':1,'there':1,'self-luminous':1,'citing':1,'long':1,'throw':1,'cooling':1,'change':1,'strong':1,'suit':1,'show':2,'survive':1,'themselves':1,'molecular':1,'depreciate':1,'too':1,'a':16,'solicit':2,'received':1,'with':2,'ascribe':1,'but':1,'taken':1,'understand':1,'dwell':1,'catch':1,'copy':1,'true':1,'save':1,'unlike':1,'solid':1,'require':3,'imply':1,'will':1,'greatly':1,'how':1,'of':2,'more':6,'agree':3,'say':1,'and':1,'claim':1,'troublesome':1,'fit.':1,'give':1,'judge':1,'salmo':1,'arise':1,'share':1,'it':1,'an':3,'involve':1,'as':4,'exist':1,'at':2,'have':5,'in':5,'seen':1,'seem':4,'occupied':1,'any':2,'instinctively':1,'terrestrial':1,'conspicuous':1,'want':1,'perhaps':1,'sprawl.':1,'travel':1,'get':1,'able':1,'till':2,'interested':1,'take':2,'cling':1,'contain':1,'wanting':1,'shirk':1,'difficult':1,'used':1,'intended':1,'see':1,'dive':1,'after':1,'charge':2,'produce':2,'moving':1,'uncommon':1,'recognise':1,'revolve':1,'unlink':1,'nipped':1,'known':2,'pure-bred':1,'lead':3,'surprising':3,'clear':1,'lose':1,'flow':1,'asked':1,'without':1,'so':10,'allow':1,'far':1,'hear':1,'the':16,'make':3,'talk':1,'nearly':3},'ritchie':{'a':1,'s':1,'well':1},'courtship':{'or':1},'now':{'and':4,'studying.':1,'who':1,'exists':1,'be':2,'is':4,'successfully':1,'it':6,'an':2,'observed':1,'known':4,'as':1,'at':1,'a':1,'in':2,'our':1,'disappear':1,'if':1,'extinct--taking':1,'what':3,'based':1,'just':1,'to':3,'much':1,'there':3,'able':1,'send':1,'.':2,'extinct.':1,'that':1,'recognised':1,'pretty':1,'mars':1,'taken':1,'announce':1,'occurs':1,'crookes':1,'do':1,'we':4,'used':1,'complete':1,'slight':1,'evolving':1,'lights':1,'regard':1,'but':1,'permanent':1,'moving':1,'know':4,'accompanied':1,'represented':1,'one':1,'between':1,'unavailable':1,'concentrated':1,'high':1,'made':1,'this':5,'going':2,'other':1,'these':1,'suppose':1,'can':1,'believed':2,'let':2,'the':9,'assume':1,'called':1},'provision':{'of':1},'left--to':{'snap':1},'nor':{'do':1,'certainty':1,'like':1,'would':1,'hibernates':1,'very':1,'indeed':1,'is':1,'knew':1,'surface':1,'destroyed':1,'to':1,'explain':1,'does':1,'in':3,'of':2,'has':1,'any':1},'nos':{'.':2},'lineage':{'for':1},'it--a':{'natural':1,'mind':1},'sea-butterflies':{'on':1},'seaweed-growing':{'shelf':2,'area':1},'drop':{'of':2,'inwards':1,'out':1},'form.':{'it':1},'cagcombe':{'co.':2},'intrigued':{'at':1},'bursts':{'through':1},'luminosity':{'a':1,'indefinitely':1,'we':1,'due':1},'cusps':{'on':1},'entirely':{'different':3,'marine.':1,'dependent':1,'absent;':1,'random':1,'fluid':1,'unsolved.':1,'electrical':1,'in':1,'new':1,'dissipated':1,'with':1,'out':1},'cliffs':{'of':1,'there':1},'last':{'and':1,'twelve':1,'ten':1,'century':1,'is':1,'haunt':1,'indefinitely.':1,'questions':1,'one':1,'for':1,'twenty':1,'doubt':1,'it':1,'glacial':1,'has':1,'two.':1,'hit':1,'period':1,'arose':3,'dwindling':1,'with':1,'great':2,'chamber':1},'side-view':{'of':5},'domain':{'and':1,'to':1,'does':1,'in':3,'print':1,'works':1,'ebooks':1},'fired':{'it':1},'advantage.':{'perhaps':1},'green-flies':{'which':1},'sugars':{'and':1},'dagoes':{'he':1},'challenger':{'expedition':1},'fires':{'of':1},'year':{'and':4,'old':1,'grouse':1,'this':1,'energy':1,'there':1,'but':1,'one':2,'to':1,'out':2,'are':1,'they':1,'in':3,'followed':1,'the':1,'.':4,'encased':1,'before':1},'happen':{'as':1,'when':1,'if':1},'avoided':{'the':1},'monitors':{'are':1},'wheat--changes':{'in':1},'shown':{'a':1,'and':1,'faint':1,'that':7,'also':1,'there':1,'an':1,'to':1,'greatly':1,'at':2,'opposite':1,'in':11,'the':1,'.':1,'arno':1,'clearly':1,'remaining':1},'rude':{'stone':1},'space':{'and':5,'on':1,'that':1,'with':1,'straight':1,'in':2,'it':1,'can':1,'.':8,'yet':1,'are':1,'above':1,'between':1,'at':1,'during':1,'the':1,'shows':1,'where':1,'by':1,'is':3,'circular':1},'amnion':{'and':1,'which':1},'furthermore':{'there':1,'they':1},'inconceivably':{'small':3,'distant':1,'greater':1},'equatorially':{';':1},'hastily':{'referred':1},'increase':{'to':1,'rather':1,'of':6,'their':1,'in':3,'our':1},'kingdom.':{'on':1,'j':1},'rational':{'device':1,'conduct':3},'receiving':{'no':1,'stimuli':1,'tidings':1,'olfactory':1,'it':1,'contributions':1},'shows':{'a':3,'the':17,'great':1,'that':6,'any':1,'many':1,'some':1,'two':1,'an':1,'how':1,'definitely':1,'certain':1,'affinities':1,'clearly':1,'positively':1},'inevitably':{'lead':1},'e.':{'rutherford':1},'eighty-eight':{'of':1},'glass--the':{'stopper':1},'divergence':{'arboreal':1,'of':3},'animals.':{'the':1,'senses':1,'sec':1},'quart':{'.':2},'intruding':{'fishes':1,'bacteria':1,'parasites':1},'directions.':{'this':1,'so':1},'advantages':{'being':1,'of':1,'.':1},'taxed':{'no':1},'animals;':{'of':1,'it':1},'marine':{'animals':3,'family':1,'organisms':1,'lampreys':2,'fish':4,'but':1,'.':1,'leech':1},'inevitable':{'stoppage':1,'processes':1},'card':{'says':1,'tea':1,'is':1,'donations.':1,'in':1,'prof':1,'was':1},'care':{'and':3,'on':1,'associated':2,'in':1,'mammals':1,'is':1,'there':1,'it':1,'.':3,'as':2,'so':1,'which':1,'of':2,'exhibited':1},'vestige':{'and':1,'of':3,'in':1},'reflect':{'the':4,'that':2},'rearrangements':{';':1},'fixed':{'paths':1,'angle':1,'like':1,'for':1,'faith':1,'to':1,'distances':1,'limits':1,'vegetation--a':1,'in':3,'stage':1},'stage.':{'the':1},'selections':{'made':1},'transition':{'to':2,'.':1,'from':2,'which':1,'stage':1},'british':{'columbia.':2,'nightjar':1,'starfish':2,'guiana':2,'salterns':1,'museum':14,'coasts':1,'sailor':1,'average':1,'association':2},'invitation':{'to':1},'lighting':{'on':2},'domed':{'and':1,'web':1,'cranial':1,'than':1},'hesperornis':{'100':1,'after':1},'suffice':{'to':1,'of':1},'sprawling':{'blotch':1},'flying':{'and':2,'phalanger':1,'fish':2,'dragons':5,'past':1,'debris':1,'bats':1,'in':1,'birds':2,'frog':2,'reptiles':1,'under':1,'bird':1,'dragons--the':1,'squirrel':2,'crouching':1,'mammals':1,'jumps':1,'tree-toad':1,'fishes':2,'squirrels':1,'creatures.':2,'dragon':4,'matter':1,'lizard':1,'reptiles.':1,'lemurs':1,'phalangers':2,'round':1},'striking':{'and':1,'confirmation':1,'resemblance':2,'novelties':1,'of':1,'is':1,'illustration':1,'.':1,'instances':1,'as':1,'fact':1,'devices':1,'are':2,'feature.':1,'the':3,'difference':1,'coloration':1,'proof':1},'omitted':{'the':2},'comprised':{'only':1,'in':1},'brain.':{'the':1},'directly':{'and':1,'towards':1,'into':1,'important':1,'between':3,'pitted':1,'the':1,'or':3,'apart':1},'comprises':{'a':1,'the':1},'impossible':{'even':1,'on':1,'we':2,'because':1,'for':1,'but':1,'.':3,'to':7,'in':1},'ring':{'and':2,'a':1,'getting':1,'of':3,'into':1,'up':1,'.':1,'which':1},'drove':{'our':1},'size':{'and':6,'is':1,'it':1,'shape':1,'are':1,'in':1,'compared':1,'from':1,'possible.':1,'except':1,'.':4,'only':1,'has':1,'though':1,'after':1,'but':1,'101':1,'with':2,'covering':1,'of':22,'as':2,'mass':1,'the':1},'sheep':{'horses':1,'contrasted':1,'.':3,'in':1,'tearing':1,'or':1},'cerebration':{'at':1},'sheer':{'dexterity':2,'intelligence.':1,'quickness':1},'air-sacs':{'in':1},'checked':{'in':1},'silent':{'laboratories':1,'monotonous':1},'apple.':{'of':1},'caught':{'and':2,'a':1,'its':1,'on':1},'breed':{'.':1},'callous':{'rough-and-tumble':1},'longitudinally.':{'the':1},'wing-span':{'of':1},'flint':{'and':1,'implements':1,'implement.':1},'joseph':{'evolution':1},'melanocetus':{'indicus':1,'murrayi':1},'friend':{'the':1,'or':1},'nutrition':{'and':1},'x.':{'this':1},'rock-dove':{'just':1},'mostly':{'confined':1,'on':1,'caught':1,'white':1,'in':1},'that':{'all':14,'spiders':1,'go':2,'causes':1,'physiological':1,'suits':2,'to':2,'reptiles':1,'under':1,'degeneration':1,'case':1,'coloured':1,'every':10,'fall':1,'affect':1,'monkeys':1,'minute':1,'did':2,'herbert':1,'small':1,'round':1,'full-grown':1,'crop':1,'further':1,'creatures':1,'even':4,'pale-white':1,'apparatus':1,'assisted':1,'asia':2,'goes':2,'new':1,'body':1,'sinks':1,'climbs':3,'here':1,'atoms':1,'along':1,'change':1,'convert':1,'substance':2,'ichneumon':1,'wherever':1,'experience':1,'electricity':1,'locomotion':1,'makes':2,'followed':1,'trained':1,'bloweth':1,'from':1,'would':2,'prove':2,'remains':2,'live':3,'therefore':1,'mysterious':1,'substances':1,'marks':1,'particular':1,'90':1,'93':1,'must':1,'account':1,'animals':4,'this':20,'science':2,'piltdown':1,'can':5,'meet':1,'indicated':1,'frogs':2,'allowed':1,'high':1,'arise':1,'evidently':1,'viviparity':1,'end':1,'damage':1,'seeds':2,'movements':1,'intelligent':1,'swayed':1,'may':3,'after':3,'curiosity':1,'man':16,'a':32,'light':6,'sun-spots':1,'life':2,'green':1,'unsteady':1,'over':1,'produced':1,'experiments':1,'during':1,'carnivores':1,'existence':1,'rewarded':2,'birds':5,'before':1,'group':1,'forms':1,'vast':1,'covered':2,'might':3,'pays.':1,'evolution':6,'they':70,'not':1,'each':2,'went':3,'energy':4,'constitute':1,'our':8,'out':1,'living':3,'percepts':1,'flowed':1,'supports':1,'given':1,'put':1,'could':3,'length':1,'throws':1,'already':2,'number':1,'one':4,'long':1,'size':1,'little':1,'toy':1,'leading':1,'system':1,'hangs':1,'their':6,'gives':1,'eyes':1,'that':1,'took':1,'part':1,'flowers':1,'distance':4,'kind':1,'require':1,'tree':1,'matter':1,'were':2,'enables':1,'and':1,'ages':1,'have':11,'wallowed':1,'any':1,'-':1,'ideas':1,'cropped':1,'build':2,'which':7,'mammals':2,'play':1,'unless':1,'though':1,'object':1,'what':1,'falls':2,'most':2,'letter':1,'device':1,'extremely':1,'manifested':1,'gather':1,'steady':1,'electrons':2,'came':1,'gold':1,'insects':1,'means--resides':1,'only':2,'molecules':2,'8':1,'inhabit':1,'he':8,'local':1,'meant':1,'his':2,'sense':1,'skims':1,'means':1,'nearly':1,'instinctive':1,'dr':1,'runs':1,'she':2,'contain':1,'where':1,'aspect':1,'intelligence':1,'radium':2,'depends':2,'individual':2,'are':7,'tender':1,'definite':1,'its':2,'halves':1,'outside':1,'various':1,'between':3,'neither':1,'we':42,'nature':1,'originated':1,'multiplies':1,'come':2,'both':4,'many':6,'s':1,'figures':1,'expended':1,'comes':1,'otherwise':1,'among':2,'point':1,'whatever':1,'height':1,'regulated':1,'ether':1,'.':2,'interest':1,'mars':1,'empty':1,'direction':1,'flight':1,'amphibians':1,'engage':1,'lives':2,'sound':1,'these':12,'will':2,'while':8,'intercepts':1,'discoveries':1,'century':1,'light.':1,'is':51,'it':73,'experts':1,'in':27,'if':11,'different':1,'develop':1,'make':4,'grows':1,'neolithic':1,'used':1,'moment':1,'necessity':1,'supposing':1,'recent':1,'dark':1,'no':5,'sound-waves':1,'the':305,'bodies':1,'left':2,'just':2,'when':13,'distant':1,'questions':1,'speed':1,'death':1,'field':1,'had':6,'has':13,'gave':1,'increased':1,'early':2,'elapses':1,'like':1,'often':1,'ascend':1,'lingers':1,'happens':1,'provided':1,'leaf':1,'for':3,'does':2,'although':2,'instinct':2,'littoral':1,'by':2,'on':3,'about':1,'central':1,'of':52,'wave-length':1,'primitive':1,'within':1,'promise':1,'spores':1,'sticklebacks':1,'her':1,'there':47,'gases':1,'was':8,'opens':1,'form':1,'some':15,'amongst':1,'atom':1,'remote':1,'with':1,'partially':1,'made':1,'flit':1,'variations':1,'planet':1,'below':1,'attaches':1,'universal':1,'body-making':1,'deep':1,'an':6,'as':7,'exist':1,'at':7,'walks':1,'again':1,'variety':1,'uranium':1,'slumbers':1,'other':1,'you':4,'star':1,'visits':1,'develops':1,'fishes':2,'implies':1,'lead':1,'age':1,'depth':1,'time':1,'once':2},'brains':{'a':1,'and':2,'about':1,'from':1,'of':2,'is':1,'.':1,'occupying':1,'more':1},'kangaroo-like':{'fashion':1},'bees.':{'sheer':1},'eliminated':{'while':1,'in':1},'flowers':{'and':5,'yet':1,'in':1},'than':{'all':2,'uranium':1,'fifty':1,'light-waves':2,'birds':1,'before':1,'25':1,'to':5,'self-fertilisation':1,'ours':1,'seen.':1,'evolution--but':1,'very':1,'five':1,'occasional':1,'they':4,'half':1,'one':3,'55':1,'twice':1,'she':1,'science':1,'seventeen':1,'violet-light':1,'are':1,'our':1,'parachuting':1,'what':1,'its':1,'across':1,'we':3,'full':1,'300':1,'men':1,'efficiency':1,'others':2,'might':1,'100':2,'by':2,'anything':1,'of':1,'himself.':1,'34':1,'bricks':1,'two':4,'decrease':1,'learning':1,'one-millionth':1,'reflective--which':1,'from':1,'her':1,'twenty':1,'support':1,'there':1,'three':3,'cats':1,'500':1,'life':1,'that':7,'understand':1,'with':1,'those':4,'women':1,'sound':1,'non-existence':1,'thirty':1,'this':3,'plain':1,'replaced':1,'many':1,'my':1,'collecting':1,'seven':1,'guesses':1,'is':9,'radial':1,'it':3,'an':7,'as':1,'itself':1,'three-chambered.':1,'at':1,'fumbling':1,'in':15,'any':4,'tentative':1,'when':2,'regions':1,'arboreal':1,'another':1,'142':1,'eighty':2,'variation':1,'eight':1,'a':23,'elusive':1,'counterbalances':1,'-200':1,'the':52},'rugged':{'.':1},'artificer':{'fashioning':1},'accordance':{'with':3},'three-spined':{'and':1,'stickleback':2},'shunting':{'waggons':1},'dawn.':{'in':1},'apples':{'and':1},'fruits':{'and':1,'the':1,'191':1},'accessed':{'displayed':1},'photosynthesis':{'carbon':1,'that':1,'.':1,'i.e':1},'sublime':{'process':2,'device':1,'indifference':1,'movement':1},'dipnoan':{'which':1},'troublesome':{'as':1},'chlorophyll':{';':1,'that':1,'or':2,'which':1,'in':1},'angel':{'in':1},'remained':{'naked':1,'flat':1,'unchanged':1,'plastic--a':1,'at':1},'caterpillars.':{'of':1},'interpretation':{'of':6,'is':1},'lens-shaped':{'middle':1,'portion':1,'formation':1,'system':1},'anger':{'and':1},'wallowed':{'in':1},'recover':{'itself':1},'slab':{'of':1},'lumps':{'of':1},'erectus.':{'3':1},'overcoming':{'the':1},'shark':{'and':1,'his':1},'snout':{'the':1,'was':1,'region':1},'equipment':{'is':1,'including':1,'especially':1,'.':2},'mr.':{'waterhouse':1},'repeatedly':{'pruned':1,'changed':1,'shot':1,'against':1},'online':{'distributed':2,'at':3,'payments':1},'mediterraneans':{'semites':1},'hornbill':{'s':2},'begin':{'to':10,'with':6,'at':1,'afresh':1},'price':{'essence':1,'paid':1},'evaporate':{'altogether':1},'ultramicroscope':{'have':1},'men--conspicuous':{'amongst':1},'america':{'and':3,'a':1,'introductory':1,'africa':1,'.':2,'the':2,'by':1,'is':1},'greyish':{'jelly':1,'zone':1},'forever':{'unseen':1},'music.':{'illustration':1},'dream':{'that':1,'.':1},'freshwaters':{'and':1,'afforded':1,'form':1,'is':1,'.':2,'including':1,'4':1,'the':1},'steady':{'flow':1,'rhythmical':1,'renewal':1},'tooth':{'and':3,'is':1,'catches':1},'sunset':{'mean':1},'hurled':{'against':1,'out':1},'pattern':{'to':1,'is':1,'of':1,'.':1},'dust--that':{'it':1},'honour.':{'what':1},'discoverer':{'of':2},'fifty':{'thousandths':1,'eggs':1,'years':3,'feet':1,'miles':4,'fathoms':1},'discovered':{'and':3,'a':2,'about':1,'or':1,'star':1,'that':2,'it':1,'whatever':1,'an':1,'near':1,'until':1,'then':1,'in':12,'new':2,'the':4,'.':5,'by':2},'227':{'photo':1,'from':1},'226':{'photo':1},'fifth':{'printing':1},'crashing':{'along':1},'gnaw':{'the':1,'through':1},'ratio':{'of':1,'for':2,'to':1},'darwinism.':{'iii':1},'title':{':':1},'proportion':{'shown':1,'that':1,'of':1,'to':2,'as':1,'at':1},'jolt':{'that':1},'only':{'and':1,'exposed':1,'certain':1,'is':1,'coming':1,'competition':1,'one':13,'beginning':1,'as':3,'animals':1,'are':1,'planets':1,'in':4,'globes':1,'happen':1,'large':1,'differ':1,'from':2,'for':2,'shifts':1,'twenty':1,'make':1,'though':1,'when':2,'two':1,'been':1,'inferred':1,'to':6,'that':3,'without':1,'extravagant':1,'4':1,'way':1,'gradually':1,'mean':1,'profiting':1,'infer':1,'plants':1,'return':1,'206':1,'pours':1,'liberated':1,'apparent':1,'dimly':1,'but':1,'possible':2,'approaches':1,'a':28,'waves':1,'method.':1,'during':2,'shadow':1,'an':3,'with':1,'by':3,'minute':1,'fly':1,'on':1,'about':1,'luminescence':1,'backboned':1,'working':1,'thirty':1,'be':1,'of':4,'supporting':1,'required':2,'half':1,'different':1,'travels':1,'matter':1,'maintain':1,'were':1,'found':1,'the':5,'say':1,'or':1,'meaning':1,'once':4},'self-forgetful':{'and':1},'essence':{'of':1},'thompson':{'silvanus':1},'orthoptera':{'have':1},'220':{'the':1},'seen.':{'the':1,'illustration':1},'continuance':{'of':5},'shepherding':{';':1},'15.--mars':{'1':1},'warm-blooded':{'.':1,'creature':1},'cannot':{'and':1,'all':1,'give':2,'indeed':1,'in':1,'discover':1,'replace':1,'go':3,'see':1,'expect':1,'have':2,'enumerate':1,'fail':1,'follow':1,'even':1,'guess':1,'make':1,'continue':2,'survive':1,'tell':1,'swim':1,'be':26,'shut':1,'dispense':1,'however':1,'here':1,'possibly':1,'succeed':1,'put':1,'now':1,'come':1,'positively':2,'of':1,'conceive':1,'say':4,'evade':1,'think':2,'leave':2,'settle':1,'avoid':2,'travel':1},'genealogy':{'which':1},'appreciatively':{'in':1},'exactitude':{'and':1},'seldom':{'coincides':1,'spends':1,'if':1},'girdled':{'about':1},'baits':{'of':1},'prevents':{'bleeding':1},'sea--the':{'fresh':1,'shallow':1,'open':1,'deep':1},'girdles':{'of':1},'pituitary':{'and':1},'burst':{'into':2},'physically':{'far':1},'lancelets':{'and':1},'famine':{'or':1},'namely':{'portions':1,'that':1,'air':1,'in':1,'the':6,'sexual':1,'experimental':1},'actively':{'and':1,'hunts':1,'from':1},'sticklebacks.':{'after':1},'successive':{'ages--the':1,'series':1,'rings':1,'strata':2,'steps':1,'periods':1,'sets':1,'stages':1,'conquests':1,'incarnations':2},'sport':{'and':1,'for':1},'key--a':{'way':1},'concern':{'the':1,'for':1},'sprawl.':{'they':1},'justifies':{'itself':1},'colours':{'and':4,'then':1,'from':2,'which':2,'apart':1,'sometimes':1,'correspond':1,'.':11,'observed':1,'will':2,'are':1,'produced':1,'in':1,'alone':1,'283':1,'coloured':1,'with':1,'the':2,'red':1,'gives':1},'3':{'and':4,'below.':1,'1908':2,'educational':1,'rapid':1,'from':1,'hillock':1,'.':11,'3':1,'4':1,'we':1,'inches':1,'000':1,'letter':1,'variable':1,'now':1,'with':1,'by':1,'man':1,'evolution':1,'i':1,'of':2,'making':1,'the':11,'minutes':1,'drawing':1},'between':{'stones':1,'summer':1,'ten':1,'intelligence':1,'modern':1,'mind':1,'worms':1,'one':1,'tide':1,'our':1,'its':1,'tide-marks':1,'different':1,'flowers':2,'two':5,'physiology':1,'certain':1,'raising':1,'stars':1,'mars':1,'red':2,'a':3,'them':5,'that':1,'atoms':1,'it':1,'members':1,'shadow':1,'water-weeds':1,'fifteen':1,'day':1,'minute':1,'man':3,'plants':2,'loss':1,'one-seventh':1,'this':2,'hungry':1,'us':4,'these':3,'those':1,'common':2,'mother':2,'the':32,'male':1},'kneads':{'it':1},'justified':{'his':1,'by':1},'whipped':{'egg':1},'notice':{'what':1,'that':5,'this':1,'of':2,'is':2,'in':5,'how':1,'therefore':1,'another':1,'certain':1,'the':6,':':1,';':1,'indicating':1},'article':{'on':2,'is':1,'dealing':1},'profitless':{'stimuli':1},'stages':{'still':1,'e.g':1,'of':5,'when':1,'it':1,'through':1,'at':1,'which':1,'in':9,':':1,'until':1},'strides':{'associated':1},'cycad':{'flora':1},'systema':{'naturae':2},'altamira':{'cave':4},'enabling':{'the':1},'sparseness':{'in':1},'comet':{'and':1,'october':1,'for':1,'that':1,'september':1,'of':1,'is':1,'s':1,'.':1,'fig.':1,'approaches':1,'the':1,'dashes':1},'wheels':{'go':1},'already.':{'among':1},'comes':{'a':3,'and':1,'about':1,'from':1,'into':1,'within':2,'back':1,'.':1,'to':3,'through':1,'directly':1,'close':1,'the':1,'out':2},'mites':{'many':1},'passenger':{'pigeon':1},'jeans':{'says':1},'juvenile':{'stages':2},'learning':{'a':1,'by':7,'from':1,'intelligently.':1,'to':5,'thinking':1,'tricks':1,'there':1,'but':1,'.':1,'trial':1,'at':1,'the':1,'or':1},'moreover':{'even':1,'climate':1,'that':3,'meteorites':1,'there':2,'their':1,'as':2,'every':1,'they':1,'the':2,'if':1},'actually':{'standing':1,'do':2,'fly.':1,'longer':1,'dividing':1,'consort':1,'settled':1,'caught':1,'observed':2,'implied':1,'lives':1,'stuffed':1,'in':1,'observing':1},'sun-spots':{'appear':1,'that':1,'is':2,'rise':1,'it':1,'.':1,'are':1,'where':1},'oliver':{'lodge':2,'electrons':1},'cares':{'.':1},'mimicry--the':{'subject':1},'markedly':{'contrasted':1,'from':1,'in':1},'jerks':{'a':1,'itself':1,'its':1},'punished':{'by':1},'rotting':{'or':1,'.':1},'dangers':{'.':1,'e.g':1},'exhaustion':{'of':1},'gill-breathing':{'and':1},'angles--that':{'is':1},'observers':{'who':1,'that':1},'stephen':{'cribb.':2},'textbook':{'organic':1},'rubs':{'it':1},'stems':{'of':1,'gave':1},'suspected':{'that':1,'.':1},'water-animals':{'.':1},'realities':{'in':1,'.':1},'prehistoric':{'skulls':1,'brothers':1,'human':2,'metallurgists':1},'developing':{'organs':1,'eggs':1,'egg':1,'human':1},'these':{'flaming':1,'partial':1,'planetesimals':1,'magnetic':1,'forests':1,'four':1,'not':1,'motions':1,'facts':2,'tropisms':1,'its':1,'before':2,'layers':1,'middlemen':1,'giant':1,'daughter-buds':1,'infinitely':1,'quaint':2,'greeks':1,'masses':1,'show':1,'young':1,'forms':2,'to':1,'twig-insects':1,'spirals':1,'clusters':1,'include':1,'moorhens':1,'rodents':1,'exalted':2,'questions':2,'dark':1,'gloomy':1,'effects':2,'words':2,'radio-active':1,'instinctive':1,'fragments':2,'vast':1,'vapour':1,'shallow-water':1,'variable':1,'sources':1,'large':1,'small':1,'works':1,'embryonic':1,'mean':1,'methods':1,'are':16,'instances':1,'concern':1,'gill-slits':1,'three':4,'palaeolithic':1,'organisms':1,'self-effacing':1,'shallow':1,'particles':4,'various':2,'moons':1,'open-sea':1,'illustrate':1,'encounters':1,'red':2,'mercury':1,'we':1,'men':1,'agencies':1,'atoms':2,'wingless':1,'threads':1,'represented':1,'tidal':1,'craters':1,'great':1,'last':1,'flames':1,'brilliant':1,'could':1,'haunts':1,'strange':2,'extremes':1,'streams':1,'dents':1,'efforts':1,'wonders':1,'considerations':1,'reasons':1,'instruments':3,'marvels':1,'spiral':2,'invisible':1,'gases':1,'protozoa':1,'ether':1,'technically':1,'ring-formations':1,'little':2,'ancient':1,'from':1,'entities':1,'outbreaks':1,'there':4,'two':9,'spots':1,'.':1,'stuck':1,'observations':1,'fiery':1,'reflex':1,'manufacture':1,'enable':1,'vigorous':1,'stars':2,'form':1,'that':1,'formed':1,'minute':1,'cases':1,'sleeping':1,'with':2,'must':1,'portions':1,'was':1,'cells':1,'variations':1,'will':1,'regions':1,'replaced':1,'thin':1,'were':4,'coral':1,'and':1,'seven':2,'planets':1,'is':3,'it':1,'days':1,'pieces':1,'have':5,'in':2,'need':1,'x-rays':1,'pages.':1,'paths':1,'rays':2,'requirements':1,'inborn':2,'perhaps':1,'things':3,'cave':1,'struggles':1,'astronomers':1,'sciences':1,'amazing':1,'other':1,'details':1,'which':1,'papers':1,'units':1,'green':2,'several':2,'higher':1,'play':1,'elements':1,'vestigial':2,'may':1,'long':1,'eight':1,'delicate':1,'half-brutish':1,'waves':3,'fishes':2,'types':2,'so-called':1,'enregistrations':1,'spectra':1,'lines':3,'lasted':1,'substances':2,'chemical':3,'points':2,'electrons':7,'bodies':1,'allow':1,'tentatives':1,'the':2,'molluscs':1},'danger.':{'illustration':1},'handicapped':{'by':1},'biped':{'and':1,'202':1,'when':1},'care.':{'but':1,'illustration':1},'coolest':{'and':1,'places':1},'ein':{'or':1},'ocean-basins.':{'beginnings':1},'soil':{'of':1,'the':3,'by':1,'.':1},'startling':{'results.':1,'in':1,'effect':1,'rapidity':1,'.':1},'100th':{'of':1},'eras':{'marked':1,'.':2,'eighteen':1,'passed':1,'in':1,'with':1},'beaver':{'will':1,'not':1,'the':2,'shore-frequenting':1,'220':1},'property':{'infringement':1,'of':4,'trademark':1,'common':1,'which':1},'helium':{'and':1,'from':1,'could':1,'gas':1,'by':1},'thrills':{'the':1},'generously':{'.':1},'cromagnon':{'man':2},'develop':{'and':2,'into':2,'without':1,'inside':1,'in':2},'inquire':{'how':3,'into':1,'however':1,'what':2},'intelligently':{'appreciate':1,'.':1},'epoch':{'now':1,'in':1},'inquiry':{'into':1,'was':1,'is':2,'called':1},'streams':{'and':1,'of':4,'.':1,'bring':2,'in':1,'encounter':1,'out':1},'gorging':{'itself':1},'noble':{'giants.':1,'qualities':2,'in':1},'investigated':{'to':1,'.':1},'centuries':{'astronomers':1,'to':2,'unavailable':1},'arctic':{'plants':1,'fox':2,'foxes':1,'ocean':1,'forms':1,'terns':1},'foam':{'beneath':1,'it':1},'unconvincing':{'.':1},'fruit':{'to':1,'it':1,'but':1,'.':1},'attributes':{'as':1},'solicitation':{'requirements':1},'passing':{'on':1,'from':2,'two':1,'quickly':1,'down':1,'to':1,'through':5,'stars':1,'in':1,'an':1,'cloud':1,'before':1},'traps':{'and':1},'framework':{'of':1,'in':1},'charges':{'and':1,'of':3,'within':1,'carried':1,'.':1},'constitutional':{'sometimes':1,'changes':1,'rhythm':1},'breezy':{'morning':1},'severe':{'processes':1,'winter':2,'for':1,'interglacial':1,'in':1,'cold':2,'conditions':1},'luminous':{'body':1,'and':1,'interpretation':1,'body.':1,'envelope':1,'after':1,'spot':1,'.':1,'to':1,'cloud-like':1,';':1,'organs':1,'the':1,'fact':1},'laboratories':{'of':2},'charged':{'particles':1,'with':1,'nucleus':1},'heaps':{'them':1},'three-chambered':{'heart':2},'last.':{'the':1,'there':1},'aeration':{'is':1},'transmitting':{'waves':1},'cromagnards':{'probably':1,'in':1,'.':1},'dancers':{'in':1},'valuable':{'food-plant':1,'practically':1},'electrification':{'like':1},'accumulate':{'on':1,'any':1,'.':1},'rule.':{'getting':1},'ounces':{';':1,'at':1},'touch':{'of':3,'the':1,'is':1,'came':1,'.':1},'speed':{'a':1,'we':2,'that':1,'of':15,'is':1,'though':1,'given':1,'.':3,'to':1,'as':1,'increases':1,'which':1,'in':1,'has':1,'with':1,'or':2,'round':1},'death':{'and':2,'a':2,'of':3,'is':3,'there':2,'when':1,'but':1,'.':3,'as':1,'sec':1,'are':1,'208':1,'the':1,'should':1,'similar':1,'becoming':1},'legitimately':{'inquire':1},'thinking':{'about':1,'of':3,'is':1,'.':2,';':1,'feeling':2},'darkness--an':{'eternal':1},'starlings':{'in':1},'improvement':{'where':1,'e.g':1},'journey.':{'we':1},'treatment':{'and':1,'of':1},'versa':{'some':1},'dovecot':{'to':1},'struck':{'only':1,'in':1},'real':{'wealth':1,'nature':2,'food':1,'men':1,'seeds':1,'sense':1,'progress':1},'spectacular':{'display':2,'element':1},'larva':{'about':1,'e.g':1,'called':1,'transparent':1,'that':1},'rules':{'is':1,'set':1},'outermost':{'finger':3,'moons':1},'stung':{'by':1},'epoch-making':{'step':1,'experimental':1},'discontinue':{'all':1},'absorptive':{'wall':1},'early':{'embryo':1,'summer':1,'atmosphere':1,'instruments':1,'pliocene':2,'chapters':1,'years':1,'triassic':1,'in':1,'stage.':1,'instrument':1,'reptiles':1,'ripening':1,'stage':2,'vegetation':1,'life-history':2,'neolithic':1,'waters':1,'men':1,'community':1,'man':1,'stone':2,'forking':1,'days':2,'youth':1,'greek':1,'victorian':1,'offshoot':2,'or':1},'quickness':{'of':1,'correlated':1,'.':1},'broader.':{'other':1},'decipher.':{'another':1},'using':{'a':2,'up.':1,'them':1,'and':1,'these':1,'or':1,'their':2,'electricity':1,'the':3,'any':1},'lady':{'came':1},'ruled':{'by':1},'inevitableness':{'of':1},'learnedly':{'called':1},'heat-waves':{'and':1,'.':1},'nerve-endings':{'on':1},'pounds':{'and':3,'of':4,'.':1},'smell':{'and':1,'less':1,'of':1,'that':1,'.':1,'in':2,'detecting':1,'or':1},'velocities':{'and':1,'with':1,'from':1},'streamers':{'which':1},'system.':{'the':3,'several':1,'what':1,'illustration':1,'in':1},'benefit':{'is':1,'in':1},'t':{'our':1,'.':3,'of':1},'fully':{'formed':1,'into':1,'explained':1,'appreciate':1,'aware':1,'absorbed':1,'in':1,'.':1},'downward':{'current':1,'currents':1},'twelve':{'hours':1,'different':1},'exposed':{'on':1,'it':1,'rocks':1,'to':3,'at':1,'the':1},'coal--a':{'chemical':1},'cathode':{'gave':1},'chronology':{'do':1},'astronomer':{'simon':1,'takes':1,'calls':2,'means':1,'h':1,'seldom':1,'.':1,'offers':1,'said':1,'has':1,'despairing':1},'shore-pool':{'and':1},'1859':{'made':1,'.':1},'salicylic':{'acid':1},'unlocked':{'.':1},'1850':{'.':1},'recorded':{'.':1,'in':1},'1856':{'in':1},'conservative':{'and':1,'animals':1,'type':1,'anatomist':1},'clear-cut':{'perceptual':1,'ideas':1,'.':1},'iron-forming':{'bacteria':1},'wheat':{'and':3,'a':1,'in':2,'which':1,'on':1,'of':1,'is':2,'that':1,'it':1,'1919':1,'emerged':1,'were':1,'harvest':1,'with':1,'called':1,'before':1},'business':{'office':1,'that':1,'of':1,'.':1,'pglaf.org':1,'in':1},'sixth':{'printing':1,'day':1,'month':1},'equivalent':{'to':1},'uneasy':{'and':1,'restlessness':1},'sixty':{'millions.':1,'miles':2,'years':1},'exciting':{'chapter':1,'race':1},'throw':{'off':1,'light':1,'it':1,'much':1,'dust':1,'prickly':1},'comparison':{'of':1,'the':1,'.':1,'with':3,'should':1},'ear-trumpet':{'or':1,'man':1},'central':{'and':1,'body':2,'stomach':1,'sun':1,'region':1,'java.':1,'europe':1,'fire.':1,'portion':1,'part':1,'nucleus':2,'africa':1,'biological':1,'lens-shaped':2,'mass':1,'fact':1},'piety':{'of':1},'tentatives':{'have':1,'.':1},'wolf':{'a':1,'the':1,'.':2},'greatly':{'increased.':1,'and':1,'economised':1,'from':1,'increased':2,'for':1,'restricted':1,'enlarged':1,'according':1,'by':1,'misjudge':1,'increases':1,'magnified.':2,'in':1,'affect':1,'reduced':1,'elongated':1,'encouraged':1},'bright-green':{'hue':1},'predatory':{'creatures':1,'animal':1,'cuttlefishes':1},'freeing':{'of':1},'outlook':{'on':1},'whole.':{'geologists':1},'kapp':{'gisbert':1},'goethe':{'s':1},'skunks':{'magpies':1},'rolling':{'stone':1},'heated':{'.':1},'elementary':{'exposition':1,'can':1,'fact':1},'shrinking':{'the':1,'mass':1},'your':{'poker':1,'possession.':1,'written':1,'country':1,'equipment.':1,'use':1,'applicable':1,'pocket':1,'state':1,'periodic':1,'nerves':1,'cold':1,'hand':1,'efforts':1},'stare':{'at':1},'risen.':{'one':1},'fast':{'and':1,'line--are':1,'that':2,'bound':1,'.':1,'to':1},'log':{'ready':1},'prepare':{'or':1,'your':1},'area':{'and':2,'of':5,'varies':1,'.':1,'as':1,'are':1,'which':2,'by':1},'stoppage':{'of':1},'start':{'a':2,'of':1,'at':1,'the':1,':':1,'with':1},'cats':{'and':2},'low':{'and':2,'flat':1,'temperatures':1,'temperature':1,'form':1,'level':3,'nest-building':1,'grounds':1,'when':1,'forests':1,'gap':1,'chemical':1,'to':1,'quiet-looking':1,'retreating':1,'psychical':1,'the':1,'on':1,'type':1,'order':1,'degree':1},'lot':{'of':2},'colder':{'water':1,'.':1},'jones':{'has':1},'philosophers':{'but':1},'posterior':{'claspers':1},'manipulative':{'intelligence':1,'skill':1,'expertness':1},'1871--a':{'book':1},'body-cells':{';':1},'two-thirds':{'of':2},'water-vapour':{'gathers':1,'which':1,'in':1},'hottest':{'.':1},'playsomest':{'crittur':1},'sea-level':{'.':1},'circulation':{'of':2},'species.':{'sec':1,'it':1},'star.':{'this':1},'phosphorescent':{'things':1,'animals;':1,'at':1},'waltzing':{'mouse':1},'embedded':{'in':2},'waste-product':{'called':1},'beliefs':{'concerning':1},'euplectella':{'a':2},'vedda':{'of':1},'600':{'a':2,'miles':1,'000':1},'describe':{'this':1,'even':1,'the':1,'it':1,'as':1},'moved':{'slightly':1,'still':1,'slowly':1,'forwards':1,'weigh':1},'sheath':{'which':1},'moves':{'and':1,'only':1},'extinct--taking':{'us':1},'innings':{'.':1},'plants--the':{'first':2},'alligator-like':{'forms':1},'thither':{'rather':1,'somewhat':1},'you':{'already':1,'give':1,'within':1,'distribute':1,'share':1,'begin':2,'press':1,'are':4,'have':6,'in':1,'carefully':1,'follow':1,'will':1,'derive':1,'from':1,'for':2,'provide':3,'pay':1,'indicate':1,'charge':1,'take':1,'do':4,'notice':1,'cause.':1,'may':9,'beat':1,'as-is':1,'pick':1,'paid':3,'discover':1,'produce':1,'put':2,'hold':1,'with':1,'comply':2,'must':6,'a':1,'received':3,'prepare':1,'receive':1,'wish':1,'like':1,'cannot':1,'can':9,'learn':1,'agree':4},'forcing':{'us':1},'poor':{'.':1,'endowment':1,'in':2},'polar':{'bear':5,'ocean':1,'cap.':1,'snow-caps':1,'caps':2,'areas':1},'466':{'sirius':1},'bacillus':{'of':1},'drift':{'across':1,'but':1,'which':1},'carpenter':{'who':1},'flattened':{'shape':1,'tips':1,'sacs':1},'suited':{'to':3,'for':9,'certain':1},'queensland':{'one':1,'mudfish':1},'pool':{'on':1,'almost':1,'of':1,'is':1,'.':1,'swamp':1,'in':1},'ramsay':{'discovered':1,'and':1},'building':{'of':2,'material':1,'up':7},'bulk':{'of':4,'under':1},'condensation':{'of':1,'would':1,'they':1,'.':1},'sperm-cells':{'distinct':2,'.':1},'controlled':{'and':2,'activities':1,'life':1,'then':1,'movements':1,'more':1},'profits':{'you':1,'by':1},'doubted':{'even':1},'signalling':{'to':1},'strings':{'round':1},'since':{'lessons':1,'then':1,'we':2,'sheep-ranches':1,'many':2,'noon':1,'there':1,'it':4,'rain':1,'matter':1,'disappeared.':1,'all':1,'man':1,'the':8,'darwin':1,'extinct':2,'if':1},'contemporaneously':{'with':2},'skeleton':{'and':1,'remains':1,'musculature':1,'of':4,'tend':1,'in':1,'or':2},'pointing':{'out':1},'breadth':{'of':1},'splitting':{'the':1,'into':1,'up':2},'month':{'and':2,'because':1,'old':1,'increased':1,'of':2,'began':1,'but':1,'.':1,'became':1},'ceased':{'to':5,'it':1},'thoughtful':{'men.':1},'re-utilise':{'.':1},'revealed':{'down':1,'to':1,'themselves':1,'itself':1},'asterias':{'forreri':2},'carpet':{'of':2},'keith':{'and':1,'pithecanthropus':1,'pictures':1,'arthur':1,';':1,'m.d':2,'says:':1},'referring':{'it':1},'cliff':{'.':1},'unenforceability':{'of':1},'wyoming':{'u.s.a.':1},'talkativeness':{'.':1},'deep-rooted':{'corresponding':1},'boiling-point':{'of':1,'while':1},'solicit':{'donations':1,'contributions':1},'sustain':{'it':1},'thomson.':{'i':1},'divisions':{'of':1},'very':{'precise':1,'permeable':1,'hooky':1,'remarkable':5,'distant':1,'carefully':1,'tough':1,'uniform':1,'fine':4,'profitable':1,'rapid':2,'rapidly':1,'educable':2,'interesting':11,'young':2,'peculiar':1,'passive':1,'deep-rooted':1,'masculine':1,'inconspicuous':4,'good':2,'dust':1,'far':4,'discrepant':1,'early':1,'nearly':1,'closely':1,'vividly':1,'highly':1,'feeble':1,'minute':2,'brightly':1,'dim':1,'like':4,'profound':1,'numerous':3,'imperious':1,'large':4,'common':3,'liable':1,'quick':1,'antique':1,'dilute':1,'old':1,'often':3,'innocent':1,'unprofitable':1,'changeful':1,'likely':1,'convincingly':1,'miserable':1,'heavy':1,'gradually':1,'dense':1,'prolific':2,'poisonous':2,'definite':1,'near':1,'conservative':1,'simplest':1,'crude':1,'sluggish':1,'palatable':1,'intimate':1,'notable':1,'weak':1,'voracious':1,'small':9,'completely':1,'slow':2,'active':3,'eventful':1,'strong':3,'beginning':2,'momentous':1,'great':3,'instant':1,'reverse':1,'many':1,'distinctively':1,'inexpensive':1,'practical':1,'sensitive':4,'greatly':2,'slightly':1,'hearty--we':1,'puny':1,'first':1,'favoured':1,'primitive':1,'useful':3,'striking':4,'simple':4,'image':1,'powerful':1,'apt':1,'obscure--sometimes':1,'forcibly':1,'finely':1,'complex':2,'readily':2,'sensible':1,'little':4,'ancient':2,'basis':1,'distinct':1,'own.':1,'faint':2,'markedly':1,'long':6,'plastic':1,'marked.':1,'literal':1,'much':9,'slowly':2,'low':5,'perfectly':1,'protuberant':1,'easy':2,'successful':3,'shallow':1,'feminine':1,'representative':2,'considerable':1,'gradually.':1,'uncertain':2,'instructive':2,'characteristic':1,'largely':1,'intimately':1,'suggestive':1,'obvious':2,'thin':1,'promising':1,'beautiful':3,'heart':1,'aerial':1,'compact':1,'violently':1,'slim':1,'few':1,'high':2,'effectively':1,'variable':2,'close':1,'tranquil':1,'different':9,'keen':2,'unsuitable':1,'eloquent':1,'utilitarian':1,'hot':4,'vital':1,'grand':1,'unpromising':1,'ordinary':1,'difficult':4,'fairly':1,'opposite':1,'convincing':1,'alert':1,'important':7,'sagacious':1,'fierce':1,'frequently':1,'conspicuous':1,'dark':1,'short':2,'advantageous':1,'effective':1,'crowded':1,'mobile':1,'vigorously':1,'well':2,'severe':1,'serious':2,'incomplete':1},'indubitable':{'multicellular':1,'dynamical':1,'.':1},'bombarded':{'by':2},'coloured':{'and':1,'on':1,'reproductive':1,'lights':1,'illustration':13,'cloth':1,'flowers--attractive':1,'discs':1,'objects':1,'tree-frogs':1,'cardboard':1,'disc':1,'frontispiece':1},'oncorhynchus':{'not':1},'balancing':{'and':1,'on':2,'themselves':1,'not':1,'the':1},'minded':{'of':1},'decide':{'upon':1},'10.--solar':{'prominences':1},'cross-striped':{'quickly':1},'generalised':{'not':1,'percept':1,'humanoid':2,'members':1},'obvious':{'limitation':1,'advantage':1,'that':1,'when':1,'.':1,'advantages':1,'therefore':1,'factor':1,'fact':1},'deficient':{'in':1},'louis':{'agassiz':1,'robinson':1},'ceaseless':{'sifting.':1,'process':1},'elusiveness.':{'v':1},'retrogressions':{'in':1},'mile':{'a':1,'all':2,'towards':1,'would':1,'away':1,'per':1,'.':1,'high.':1},'plain':{'and':1,'story':2,'that':4,'is':1,'account':1,'enough':1,'vanilla':2},'locomotive':{'publishing':2},'trumpeting':{'with':1},'brittle-star':{'and':1},'salterns':{'has':1},'torpedo-net.':{'they':1},'disintegration.':{'there':1},'4557':{'melan':1},'casual':{'and':1},'bass':{'which':1},'inspire.':{'subsequent':1},'darkness':{'and':1,'of':2,'.':1,'was':1,'in':2},'consumers':{'.':1},'witnessed':{'.':1},'emotions':{'ideas':1,'but':1,'.':1,'in':1,'such':1,'beyond':1},'thickness':{'would':1,'of':8,'is':2,'.':1,';':1,'he':1},'him.':{'instantaneously':1,'illustration':1},'argyroneta':{'natans':1},'learned':{'for':2,'to':9,'that':2,'.':1,'their':1,'in':2,';':1,'its':1},'elsewhere.':{'the':1,'as':1},'edited':{'by':1},'loose':{'and':4,'spiral.':1,'sort':1,'behind.':1,'network':1},'answers':{'back':2,'.':1,'to':1,'are':1,'the':1,'must':1,'come':1,'first':1},'elmhirst':{'r':1},'11.86':{'86500':1},'trunk':{'till':1,'it':1},'lull.':{'1':1,'what':1},'i.e':{'.':14},'strong':{'desire':1,'pectoral':1,'vigorous':1,'shoulders.':1,'power':1,'that':1,'reasons':1,'jaws':1,'magnetic':1,'radiation':1,'tendency':2,'evidence':2,'feet':1,'enough':2,'artistic':2,'currents':1,'the':1,'.':2,'carapace':1,'man':1},'interposed':{'a':1},'creeps':{'close':1},'ahead':{'of':1,'in':1,'.':1},'disclaimers':{'of':1},'vegetarian':{'the':1,'scooping':1,'or':1,'triassic':2},'whine':{'about':1},'experimenting':{'and':3,'mood':1,'of':1,'.':1,'as':1,'which':1,'in':1,'rises':1,'with':3,'or':1,'more':1},'unproved':{'hypothesis':1},'soldier':{'wounded':2},'amount':{'generation':1,'of':18,'.':1,'to':2,'which':1,'proportional':1},'successors':{'whatsoever':1,'would':1},'helps':{'to':4,'the':1,'us':1},'tides.':{'illustration':1},'family':{'and':2,'spawn':1,'cares':1,'of':4,'is':1,'perceive':1,'relations':1,'.':2,'124':1,'are':1,'life.':1,'one':1,'affection':1,'swimming':1},'requiring':{'to':1,'no':1},'ask':{'the':1,'.':1},'trained':{'police':1,'animals':1,'to':1},'globes':{'and':1,'of':2,'in':2},'spawned':{'or':1},'conventional':{'modes':1},'ash':{'by':1},'flaws':{'in':1},'discriminative':{'absorption':1},'0':{'earth':1,'venus':1,'4':1},'revelation':{'of':1},'eye--we':{'have':1},'contains':{'about':1,'several':1,'an':1,'no':1,'billions':1,'.001':1,'.':1,'as':1,'ingested':1},'bask':{'on':1},'almost':{'all':5,'constant':1,'suddenly':1,'certain':3,'universal':1,'bound':1,'noisy':1,'confined':1,'see':1,'grazing':1,'at':1,'invisible.':1,'impossible':1,'wholly':1,'uncatchable':1,'as':3,'incredible':1,'cylindrical.':1,'exclusively':1,'surpassed':1,'to':1,'black':1,'girdling':1,'automatic.':1,'circular':1,'complete':1,'any':1,'formed':1,'completely':1,'sagacious':1,'nothing':1,'unique':2,'hairless':1,'a':2,'perfectly':1,'wise':1,'instantaneously':2,'perceptible':1,'no':3,'equal':1,'daily':1,'conquered':1,'ready-made':1,'invisible':2,'squirrel-like':1,'say':1},'unpleasant':{'expressions':1},'vi':{'evolution':1,'.':3},'taken':{'a':1,'by':5,'from':1,'generously':1,'for':1,'that':1,'into':2,'as':1,'.':1,'to':3,'charge':1,'at':7,'in':5,'the':2,'more':1,'any':1,'nearly':1,'out':1},'injury':{'or':1},'temps':{'would':1},'polyps':{'whose':1,'each':2},'stock--an':{'anthropoid':1},'lichens':{'and':1,'on':1},'globe.':{'for':1},'ejected':{'in':1},'site':{'and':1,'www.gutenberg.org':1,'of':2,'includes':1,'which':1,'often':1},'instrumental':{'music':2},'tapeworm':{'certainly':1},'moistened':{'finger-tip':1},'broke':{'up':1},'mounted':{'on':1,'equatorially':1,'batteries':1,'that':1},'producing':{'a':1,'visible':1,'x-rays':1,'an':1},'weathering':{'of':2,'now':1,'have':1},'cremated':{'every':1},'helped':{'by':2,'success':1,'us':1},'rotifer--we':{'are':1},'wafts':{'into':1},'sweeps':{'this':1},'egg-shell':{'and':1,'just':1},'moisture-laden':{'air':1},'nine':{'and':2,'thousand':1,'months':2,'to':1,'moons':1,'cases':1,'hundred':2},'propounded':{'to':1},'spontaneous':{'generation':1,'breaking':1,'above':1,'change':1},'history':{'an':1,'for':1,'no':1,'of':25,'museum':4,'museum.':2,'back':1,'behind':2,'which':1,'in':1,'.':13,'called':1},'f3':{'.':1},'pushes':{'itself':1},'gas.':{'but':1,'illustration':1},'stinging':{'animals':1,'cells':2,'tentacles':1,'lassoes':1},'eclipsed.':{'illustration':1},'pushed':{'will':1,'along':1,'it':1,'out':1},'sun-spot':{'of':2,'is':1},'phrase':{'and':1,'project':4,'has':1,'.':1},'lacks':{'both':1},'species':{'and':1,'1859':2,'use':2,'waddle':1,'off':1,'descent':1,'e.g':1,'perhaps':2,'of':4,'is':1,'there':1,'discover':1,'.':2,'in':1,'represented':1,'what':1,';':2,'hitherto':1,'the':2},'firmly':{'and':1,'established':1,'on':1,'that':1,'.':1,'to':1},'viviparity':{'is':1,'.':1,'the':1,'naturally':1},'starting-point':{'of':1,'the':1,'they':1},'lithographic':{'stones':1},'surpassed':{'only':1,'expectations':1},'friction.':{'but':1},'freezing-point':{'of':1,'or':1,'.':2},'surpasses':{'that':1,'in':1},'daughter-cells':{'into':1},'millikan':{'s':2},'ft':{'.':2},'tried':{'a':1,'and':1,'for':1,'one':1,'to':1,'as':1},'fv':{'contains':1},'communicating':{'cells':1,'nerve-cell':1},'derived':{'energy':1,'from':3,'infinitely':2},'sneak':{'upon':2},'gestation':{'is':1},'triumphs':{'of':5},'consequence':{'of':2,'the':1,'has':1,'enormously':1},'tries':{'to':2},'invasion':{'of':3,'was':1,'due':2,'which':2},'horizontal':{'bar':1,'except':1},'inconceivable':{'distances':1,'ages':1,'.':1,'to':1,'numbers':2,'velocity':1},'a':{'limited':1,'hampton':1,'code':1,'partial':1,'skeleton':2,'remarkable':9,'defenceless':1,'magnetic':7,'varying':1,'focus':2,'month':1,'sequoia':1,'mild':3,'mile':4,'higher':12,'zinc':1,'sweep':1,'dish':1,'golf':2,'conservative':1,'carpet':2,'compact':1,'glimpse':5,'preformed':2,'chain':2,'physiological':3,'pouch':3,'young':4,'passage':1,'granular':1,'tail':2,'cradle':1,'microscopist':1,'stable':1,'fountain':1,'friendly':1,'trilobite':2,'descendant--the':1,'brown':4,'string':1,'deeper':1,'chameleon':4,'very':59,'sun-spot':1,'wave':2,'soapy':1,'smack':1,'graphic':1,'fan':1,'leisurely':1,'microbe':1,'tank':1,'difference':2,'continued':1,'feeble':1,'minute':4,'cool':1,'generalised':3,'sea-anemone':3,'speed':5,'respiratory':1,'beginning':1,'parrot':1,'naturalist':1,'stimulus':1,'skeletal':1,'shock':1,'list':3,'gun':1,'cloudy':1,'large':32,'farthing--contains':1,'swirling':1,'starlit':1,'key--a':1,'succession':1,'small':24,'lever':1,'perceptual':1,'pool':1,'pterodactyl':2,'veritable':3,'bull-terrier':1,'force':1,'meadow':1,'full-grown':2,'trend':2,'crow':2,'sea-squirt':1,'sensation':3,'crop':1,'milligram':1,'past':1,'widened':1,'second':27,'burrower':1,'subtle':1,'further':2,'estimated':1,'port':1,'theory':3,'blue':4,'cargo':1,'stately':1,'clock':1,'waning':1,'fine':7,'section':1,'gatepost':2,'crust':1,'lizard':1,'thickness':2,'cell':2,'reconstruction':2,'new':31,'falling':3,'row':1,'method':2,'multitude':4,'body':19,'condensed':1,'full':3,'trypanosome':1,'degree':3,'compilation':1,'loose':2,'birthplace':1,'fifteenth':1,'drawing':2,'plant-like':2,'protection':1,'tangent':2,'free':4,'separate':6,'tremor':1,'strong':8,'four-chambered':1,'teacher':1,'light-year':1,'sensory':2,'great':39,'substance':4,'survivor':1,'brilliant':3,'study':2,'larger':4,'slave':1,'second--more':1,'soldier':2,'simultaneous':1,'survey':3,'suggestion':4,'social':2,'real':1,'narrow':5,'pathological':1,'steady':1,'diameter':4,'showing':1,'land-crab':1,'useful':4,'secure':1,'halfpenny':1,'stimulus.':1,'discontinuous':1,'fauna--the':1,'loose-limbed':1,'layer':1,'marked':1,'decrease':1,'motor':1,'limb':1,'glance':1,'total':3,'unit':1,'fee':3,'lens':5,'vivid':1,'distinct':3,'revelation':1,'faint':1,'visit':1,'charge':2,'frog':7,'distributing':1,'few':40,'sample':1,'saucerful':1,'centre':1,'knoll':1,'diving-bell':1,'stage':2,'type':3,'more':14,'sort':15,'flat':1,'clever':1,'door':1,'rich':2,'conductor':1,'successful':1,'whirling':1,'screen.':1,'chimpanzee':1,'bodily':1,'fan-like':1,'moistened':1,'surface':1,'rabbit':1,'particular':6,'baby':1,'coyote':1,'hole':2,'hold':1,'rivalry':1,'fly':2,'rebounding':1,'frequently':1,'flora':1,'word':1,'primate':1,'needle':1,'work':2,'stroke':1,'cat':3,'mammalian':1,'suggestive':1,'sudden':3,'thin':1,'universe':1,'chin':2,'fauna':2,'male':2,'history':2,'decorative':1,'continuity':1,'reflector':1,'stream':6,'process':5,'climax':3,'share':1,'parachute':3,'beautiful':3,'minimum':2,'caution':2,'sense':5,'pond':3,'story':1,'hydrogen':1,'species':1,'masterly':1,'terrestrial':2,'huge':8,'united':1,'winter':3,'defective':1,'keen':1,'rather':3,'finger-post':1,'discussion':1,'coot':1,'copious':1,'solidifying':1,'far':1,'hot':1,'pair':2,'forest':2,'fourth':4,'widespread':1,'native':1,'civilisation':1,'stock':3,'mould':1,'yellowish':1,'plant':1,'dull-red':1,'maternal':1,'scion':1,'candle;':1,'thickened':1,'tse-tse':2,'spot':1,'movable':1,'collection':1,'narrow-beaked':1,'diagram':3,'deep-sea':1,'lot':2,'lattice-work':2,'bird-dropping':3,'horizontal':1,'coloured':1,'spiral':7,'man':8,'a':1,'free-swimming':1,'short':9,'natural':2,'liquid':5,'conscious':1,'light':1,'projecting':1,'complexity':1,'green':4,'skilful':1,'deterioration':1,'basket':1,'diary':1,'coral-snake':1,'dream':1,'wing':1,'hen-pigeon':1,'wine':1,'plaice':1,'sperm-cell':1,'shield':1,'feather-wing':1,'double-breather':1,'gradual':6,'minnow':2,'billion':2,'cross':1,'brain':2,'stile':1,'paper':2,'thinning':1,'cold':1,'still':1,'tendency':4,'bunch':3,'chemical':6,'some':2,'group':4,'fit':1,'positively-electrified':1,'glowing':1,'roving':1,'better':2,'window':1,'permanent':1,'microscopic':1,'vast':6,'tubeful':1,'precipitate':1,'main':1,'puzzle':1,'finer':1,'non':1,'good':19,'return':1,'greater':6,'fragment':2,'safe':1,'hunter':1,'number':19,'band':2,'caterpillar':2,'billiard':1,'flint':1,'snake':1,'stout':1,'half':9,'foot':5,'lifelong':1,'day':2,'bank':1,'successor':1,'bony':2,'rocky':2,'profound':1,'mastery':4,'degree.':1,'male-producing':1,'potassium':1,'lifetime':1,'seashore.':1,'hundredth':1,'jellyfish':3,'promise':1,'creature':4,'meal':1,'predatory':1,'turtle':2,'week':3,'molecule.':1,'mental':1,'beginner':1,'map':1,'scanty':1,'garment':6,'fish':6,'hard':1,'spider':7,'related':1,'solution':1,'ball':1,'year':5,'laboratory':1,'first-class':1,'special':2,'magnet':7,'flower':2,'lobster':1,'truly':1,'pigeon':3,'day.':1,'time.':1,'race':2,'flattening':1,'portentous':1,'wide':2,'mammal':1,'brilliantly':1,'sluggish':1,'red':6,'common':12,'foundation':2,'fly.':1,'thrush':1,'belief':2,'many-celled':1,'zoological':1,'southern':1,'million':13,'little':31,'possibility':2,'quite':1,'paralysing':1,'backboneless':2,'reason':1,'lump':1,'hollowed-out':1,'plague':1,'region':2,'cough':1,'marine':3,'wall':3,'monkey':6,'vestige':3,'unique':3,'fixed':2,'yard':1,'hostile':1,'rule':4,'perceptible':1,'moment':6,'british':2,'thing':1,'length':1,'keel':1,'place':2,'nebula':7,'tempting':1,'consequence':1,'weakling':1,'user':2,'blind':3,'copper':3,'sheep-driving':1,'limestone':2,'surviving':1,'striking':7,'spoken':1,'wasp':1,'prehistoric':2,'powerful':4,'scene':2,'sack':1,'system':3,'well-known':1,'fertilised':1,'light-brown':1,'lighter.':1,'spanish':1,'twig-like':1,'ring':2,'tangle':1,'cogged':1,'romance':1,'hood':1,'speck':1,'sheep':1,'city':1,'given':1,'fuller':1,'temperature':1,'swarm':2,'leading':1,'brisker':1,'wing-span':1,'colossal':1,'nebular':1,'wonderful':6,'ton':3,'too':1,'storm':1,'periwinkle':1,'white':7,'compartment':1,'final':1,'friend':2,'low':7,'sex-call':2,'million.':1,'shell':4,'vigorous':1,'fraction':1,'starfish':2,'that':1,'tool':2,'shallow':1,'japanese':3,'crevice':1,'vegetarian':2,'reflecting':1,'zeppelin':1,'somewhat':1,'rifle':4,'prodigious':3,'copy':4,'photographic':3,'peculiar':5,'positively':1,'population':1,'distance':6,'bodyguard':1,'hundred':13,'third':6,'body.':1,'double':1,'tree':7,'rate':2,'medley':1,'bee':2,'youth':1,'matter':9,'legacy':1,'treasure-house':1,'recapitulation':2,'gigantic':4,'steep':1,'distinguished':1,'sublime':1,'collecting':1,'brittle-star':1,'withered':1,'modern':4,'defect':2,'glass':4,'direct':1,'rat':1,'ramifying':1,'sharp':1,'manner':2,'uganda':1,'gaseous':3,'breezy':1,'slab':1,'dozen':4,'conspicuous':1,'female--first':1,'convenient':1,'speculative':1,'shore':1,'soap-bubble':1,'silvery':3,'walk':1,'fish-eater':1,'high':8,'useless':1,'satisfactory':1,'long-drawn-out':1,'soap':4,'propitious':1,'butterfly':1,'memory':1,'continuous':2,'multiple':1,'normal':1,'coconut':1,'leaf.':1,'molecule':5,'boiling':1,'reef-building':2,'regular':1,'connected':1,'non-protrusive':1,'device':1,'coin':1,'hide-and-seek':1,'model':5,'wind.':1,'refractor':1,'known':1,'so-called':1,'piping':1,'thigh-bone':1,'surprising':1,'washerwoman':1,'mobile':2,'heartening':1,'clear':4,'later':6,'metal':1,'dog':6,'wasp-like':2,'tooth':1,'pipe':1,'short-lived':1,'reputation':2,'mammoth':2,'principle':1,'foster-mother':1,'distinctive':2,'velocity':3,'typical':1,'salt':1,'moon':1,'night.':1,'quantity':1,'refund':5,'selected':1,'particularly':1,'sparrow':3,'visitor':1,'manifestation':3,'skin-wing':1,'rotating':2,'bright':1,'shore-pool.':1,'seaweed':1,'constituent':1,'velvety':1,'corner':2,'pill-like':1,'uniform':4,'feat':1,'hustler':1,'staff':1,'current':4,'giant':4,'longer':1,'latent':1,'knowledge':1,'copyright':2,'series':6,'nervous':2,'less':2,'proportion':1,'jolt':1,'fluid':1,'considerable':12,'fox-terrier':1,'winged':1,'bush':1,'going':1,'black':1,'meteorite':1,'pretty':1,'spice':1,'female-producing':1,'ball-room':1,'plate':2,'single-chambered':1,'loss':2,'well-advanced':1,'means':5,'solution.':1,'familiar':1,'vascular':1,'sunny':1,'kind':8,'warm-blooded':1,'pocket':1,'whistle':1,'b':1,'roundabout':1,'measured':2,'silk':1,'spur':1,'live-and-let-live':1,'target':1,'flywheel':1,'bar':1,'progressive':2,'covering':1,'cry':1,'median':2,'violent':4,'doubled':1,'bird':11,'microscope':1,'groove':1,'bison':2,'troop':1,'memory-image':1,'freshwater':2,'web-wing':1,'human':5,'fascinating':1,'habit':1,'flash.':1,'nut':1,'globe':1,'canine':1,'richer':1,'relative':1,'computer':1,'result':2,'frog-like':1,'close':2,'luminous':3,'nocturnal':1,'wonder':1,'peanut':1,'shower':3,'crown':1,'wire':2,'capacity':3,'probable':1,'crooked':1,'subsequent':1,'century':1,'monstrous':1,'definite':6,'seventieth':1,'case':3,'state':10,'proof':1,'hiss':1,'promised':2,'progress':1,'mouthful':1,'perfectly':1,'lethargic':1,'crookes':2,'measurable':2,'notice':1,'recently':1,'cauliflower':1,'parental':1,'fold':1,'screen':3,'weak':2,'dome':1,'veil':1,'rapid':3,'conflagration':1,'waste-product':1,'flowering':1,'swift':2,'problem':2,'colonisation':1,'deep-water':1,'drum':2,'cliff.':1,'country':4,'pre-material':1,'strange':2,'waterfall':2,'quadruped':1,'sensitive':1,'connection':1,'grain':4,'mane':1,'retrograde':1,'lash':1,'comet':4,'passing':1,'whole':8,'humanoid':2,'photograph':9,'stony':1,'cooling':1,'dago':1,'point':3,'simple':9,'continuation':2,'colony':3,'donkey':1,'tapeworm':1,'height':8,'newborn':1,'moot':1,'written':1,'learning':2,'path':2,'greenish':1,'sea-cucumber':2,'hermit-crab':1,'grazing':2,'millimetre':2,'dwindling':3,'deep':1,'basis':2,'tremendous':3,'prelude':1,'damp':1,'tiny':5,'legend':1,'protozoon':1,'reduction':1,'much':5,'newt':1,'certain':18,'reflective':1,'feather':1,'reflex':3,'board':1,'firm':2,'box':2,'direction':1,'penny':2,'corresponding':1,'squirrel':1,'wood-snail':1,'brush':1,'thousand':15,'gas':4,'search':1,'spectrum':1,'coherent':1,'representative':2,'child':3,'laying':1,'careful':3,'land':1,'sound':3,'specialised':1,'novel':3,'conception':1,'remote':1,'solid':4,'plain':3,'straight':3,'prominence':1,'reminiscence':1,'form-resemblance.':1,'technical':1,'while':3,'teaspoonful':1,'biped':3,'voice':2,'cock':1,'guide':1,'mistake':2,'key':2,'food-signal':1,'pound':3,'project':5,'crowning':1,'moth':1,'it':1,'bipedal':1,'quiet':1,'tell-tale':1,'brake':1,'in':1,'twig':2,'simian':6,'property':1,'receptacle':1,'floating':1,'helmet':1,'different':5,'shooting':1,'descent':1,'trial':1,'domesticated':3,'roman':1,'check':1,'member':2,'motley':1,'unity':3,'complex':2,'diplodocus':1,'widely':1,'grand':1,'heavier':1,'web':1,'relatively':5,'yucca':1,'specimen':1,'difficult':2,'wheel':3,'satellite':1,'current.':1,'temporary':2,'cubic':3,'nest':8,'collie':1,'hand':2,'running':1,'dynamo.':1,'moving':1,'delicate':2,'climbing':1,'whale':4,'railway':1,'single':15,'destruction':1,'lower':7,'suitable':1,'stupendous':1,'flattish':1,'weapon':1,'disembodied':1,'tentacle':1,'skull-cap':1,'spoonful':1,'glorious':1,'partner':1,'position':3,'the':1,'reward':1,'musical':1,'left':1,'summer':2,'manifold':2,'kettle':4,'canal':1,'bristle':1,'being':1,'sporting':1,'newton':1,'morsel':1,'loaf':1,'three-chambered':2,'disguise':1,'steamer':1,'victim':1,'touch':1,'jackal':1,'rushing':1,'previous':6,'blow':1,'tailless':1,'disturbance':1,'wedge-shaped':1,'hint':2,'general':5,'bell':2,'master-key':1,'pitcher-plant':1,'silver':1,'straw':1,'spread':2,'transformed':2,'galloping':2,'ray':7,'5':1,'room--pour':1,'transformation':2,'finder':1,'kingdom':1,'puzzle-box':1,'nightjar':1,'fire':2,'format':1,'big':11,'couple':1,'knife-blade-like':1,'period':8,'dark':2,'cromagnon':2,'fusion':2,'royalty':1,'god.':1,'background':1,'vacuum':8,'text-book':1,'world':1,'part':1,'crusher':1,'vague':1,'name':1,'desire':1,'satisfaction':1,'necessary':1,'dislodged':1,'particle':2,'cock-pigeon':1,'signal':2,'performing':1,'sound--':1,'diffraction':1,'specific':2,'soup-plate':1,'vortex':1,'cotton-reel':2,'security':2,'soft':2,'replacement':3,'mathematical':1,'reaches':1,'right':2,'trained':1,'people':1,'prolonged':1,'process--a':1,'plausible':1,'wattle':1,'fully-formed':1,'library':3,'muscle-fibre':1,'sponge':1,'pack':1,'mighty':4,'second.':4,'mirror':4,'diving':1,'battalion':1,'bigger':1,'transparent':1,'saucer':1,'savage':1,'lung.':1,'dense':1,'calculating':1,'prolific':1,'curious':3,'broad':1,'tube':4,'footing':1,'fox':1,'nook':1,'favourite':1,'critical':2,'mutation':1,'changeful':1,'starch':1,'repeopling':1,'transmutation':1,'trap':1,'beetle':1,'knitting-needle':1,'thunderstorm':1,'reasonable':2,'power':2,'slight':3,'notable':4,'pupil':1,'cork':1,'life-or-death':1,'step':1,'caricature':1,'chick':1,'peer':1,'tidal':1,'revolution':3,'chapter':2,'plastic':1,'stone':5,'quarter':4,'central':1,'cigarette':1,'heat-measuring':1,'of':1,'biscuit':1,'bit':3,'slender':1,'greatly':1,'nucleus':5,'bright-green':1,'basin':1,'provisional':1,'pre-human':1,'swimming':1,'heavy':1,'primitive':2,'whole.':1,'cell-wall':1,'predominance':1,'colour':2,'variable':1,'wrack':1,'lung':2,'lively':1,'female':4,'cultivated':1,'pivot':3,'.':16,'telescope':3,'strangely':1,'minute.':1,'weight':2,'well-developed':1,'wonder-horse':1,'grave':1,'tennis':1,'question':1,'reindeer':1,'long':27,'fight':1,'continental':1,'standstill':1,'sea-spider':1,'double-armed':1,'hundred-millionth':1,'house':2,'bubble':2,'hare':1,'bud':1,'greyish':1,'medium':3,'relic':1,'complete':2,'form':2,'voracious':1,'magnificent':1,'registered':2,'converse':1,'neanderthal':1,'triangular':1,'mysterious':1,'cloud':1,'billion.':1,'game':2,'dead':7,'boon':1,'sprinkling':1,'line':9,'true':5,'dull':5,'versatile':1,'luxuriant':1,'continuance':1,'minnow--the':1,'rush':1,'partitioned':1,'genealogy':1,'flood':1,'characteristic':4,'spectroscope':1,'purpose':1,'maximum':3,'supple':1,'planet':2,'crystal':1,'growth':2,'limit':1,'centenarian':1,'mature':2,'monument':1,'soldering':1,'water-bag':1,'distribution':1,'piece':15,'similar':3,'leaf':7,'strongly':1,'stock--an':1,'constant':3,'flow':5,'universal':2,'measure':1,'brightly':1,'whelk':2,'sticky':1,'scientific':1,'diamond':4,'well-defined':1,'leptocephalus.':1,'home':5,'sheath':1,'ship':1,'horse':5,'living.':2,'curtain':1,'film':2,'physical':2,'water-filled':1,'brick':1,'variety':5,'glacier':1,'way':6,'there':1,'prerogative':1,'fruit-laden':1,'portion':1,'reality':2,'neolithic':1,'field':3,'prism':2,'setting':2,'stagnant':1,'branch':5,'most':6,'puppy':1,'superfluous':1,'sufficient':2,'10':1,'polar':1,'quintillion':1,'star':10,'phoenix':1,'living':3,'shelter':1,'flinty':1,'preceding':1,'planet.':1,'drift':1,'prepared':1,'choice':1,'scale':1,'recent':5,'fresh':2,'rolling':1,'yorkshire':1,'hair':1,'score':1,'sneeze':1,'concatenation':1,'source':2,'tree.':1,'vaseline':1,'meteor':1,'bivalve':2,'lead':1,'bullet':2,'dogma':1,'deep-seated':1,'movement-controlling':1,'yacht':1,'jelly':1,'drifting':1,'gorilla':2,'depth':1,'train':1,'mass':5,'fact':2,'time':17,'big-brained':1,'stick':1},'pithecanthropus':{'erectus':1,'erectus.':1,'.':1,'the':8,'was':1,'seem':1},'spectra':{'of':2,'six':1,'.':1,'corresponds':1,'36':1},'bugs':{'ever':1},'renewing':{'the':1},'deterioration':{'of':1,'the':1},'healthfulness':{'and':1},'egg':{'and':1,'a':1,'shed':1,'just':1,'for':1,'of':2,'is':1,'-cell':1,'should':1,'to':1,'which':1,'in':1,'depository':5,'signalling':1,'has':1},'chicks':{'peck':1,'had':1},'earthworm':{'is':1,'.':1,'1':1,'76':1,'s':2,'72':1,'half':1,'fragments':1,'or':1,'earthworms':1},'help':{'preserve':1,'them':1,'of':1,'flotation':1,'it':1,'to':2,'see':1,'produce':1,'in':2,'the':1},'reservoir':{'of':3},'hierarchy':{'of':1},'soon':{'a':1,'picked':1,'began':1,'it':1,'to':1,'as':1,'became':1,'realise':1,'learn':2,'learned':1,'has':1,'was':1,'appears':1,'partially':1},'indistinguishable':{'but':1},'held':{'closely':1,'to':1,'back':1,'together':2,'up':1,'their':1,'above':1,'by':1},'committed':{'to':1},'three-horned':{'skull':1},'kinetic':{'and':1,'energy':3},'liquefies':{'gases':1},'positively-electrified':{'body':1,'atoms':2},'tickings':{'of':1},'lateral':{'line':2},'solving':{'the':1},'teeming':{'.':1},'gentleness.':{'illustration':1},'absence':{'of':7,'or':1},'disclosed':{'by':1},'founders':{'of':1},'peanuts':{'which':1},'mammal--instinctive':{'aptitudes--power':1},'finer':{'world':1,'form':1},'evening':{'work':1,'star':1,'primrose':1},'food':{'and':10,'accentuated':1,'danger':1,'requiring':1,'into':1,'within':1,'it':1,'are':1,'in':3,'consists':1,'crisis':1,'note':1,'vacuole':1,'from':3,'for':2,'there':2,'.':2,'particles':2,'outside':1,'going':1,'was':1,'is':2,'on':1,'shelter':1,'but':1,'227':1,'with':1,'by':1,'enemy':1,'like':1,'largely':1,'many':1,'inside':1,'near':1,'without':1,'the':1,'or':3},'theory--the':{'structure':1},'pglaf':{'owns':1},'floating':{'plants':2,'and':1,'log':1,'sea-meadows':4,'dead':1,'buns':1,'seaweed':1,'in':1,'dust':1,'bacteria':1,'out':1},'anticipated':{'forty-one':1},'permissible':{'to':1},'foot':{'and':2,'flat':2,'of':2,'but':1,'high':2,'became':1,'long':1,'in':2},'feet':{'and':2,'four':2,'from':3,'just':1,'of':1,'whereas':1,'long':2,'.':5,'high':2,'deep':1,'7':1,'in':2,'or':1,'are':2},'stopper':{'of':1},'finite':{'or':1},'dulled':{'by':1},'occasions':{'we':1},'male-producing':{'egg':1},'enlarged':{'pectoral':1,'illustration':1,'in':1},'infer':{'this':1},'flowers--attractive':{'to':1},'stopped':{'until':1},'radial':{';':1,'animals':1,'canals':1},'neanderthalers--the':{'general':1},'dominating':{'the':1},'referred':{'to':3,'to.':1},'heavy':{'great':1,'blankets':1,'gas':1,'brain':2,'as':2,'complicated':1,'with':1,'ape':1},'transcribe':{'and':1},'matthew.':{'diagram':1,'1':1},'restless':{'inquisitiveness':2,'experimenting':1},'jaws':{'and':1,'shaped':1,'of':2,'.':1,'engulfing':1,'which':1,';':1},'down--the':{'day':1},'sulked':{'for':1},'energy.':{'sec':1},'ball':{'revealing':2,'and':1,'of':4,'found':1,'the':2,'or':1},'punitive':{'or':1},'trilobites--jointed-footed':{'antenna-bearing':1},'beyond':{'a':1,'even':1,'that':2,'this':1,'radium':1,'science.':1,'possibility':1,'its':1,'these':1,'which':1,'our':4,'the':6,'playing':1,'ordinary':1},'event':{'when':1,'seems':1,'than':1,'which':1},'oviparous':{';':1},'unsurpassed':{'gifts':1},'percepts':{'and':1},'crustacean':{'s':1},'surrounded':{'by':3},'abysses':{'and':1,'from':1,'of':1,'took':1,'.':1,'so':1,'are':1,'the':1},'america.':{'3':1,'2':1,'4':1,'6':1},'coincidences':{'.':1},'safety':{'on':1,'for':1,'of':3,'is':2,'within':1,'.':1,'until':1,'or':1,'first':1},'7':{'and':1,'palaeolithic':1,'inches':1,'why':1,'.':3,'000':1,'918':1,'1871':1,'250':1,'with':1,'the':2,'250000':1},'brownish':{'caterpillars':1},'sharp-eyed':{'enemies':1},'house-flies':{'and':1},'issue':{'of':2},'meteoric':{'matter':3},'metchnikoff':{'the':1},'drink':{'from':1},'inert':{'matter':2,'just':1,'in':1},'protruding':{'bag':1},'lights':{'as':1,'the':2},'schwalbe':{'has':1},'backboneless':{'stocks':1,'animals':3,'or':1,'animal':2},'reason':{'for':6,'to':9,'being':1,'of':2,'is':4,'in':1,'but':1,'.':1,'how':1,'--an':1,'i.e':1,'quite':1,'why':2},'base':{'and':1,'of':5,'an':1},'jaw.':{'illustration':1},'brightest':{'star':1},'put':{'a':2,'on':6,'her':1,'into':1,'out':2,'some':1,'it':3,'together':3,'two':1,'to':2,'together.':1,'zinc':1,'in':2,'forward':1,'our':1,'the':5,'themselves':1,'safely':1,'your':1,'evenly':1},'earliest':{'known':3,'remains':1,'inhabitants':1,'metal':1,'representatives':1},'algae':{'and':2,'symbiosis':1,'.':1},'revolutionary':{'changes':1},'capacities.':{'body':1},'perceptible':{'to':1,'impression':1},'persuading':{'some':1},'tortoises':{'to':1,'from':2},'fifty-four':{'muscles':1},'american':{'killdeer':1,'monkey':1,'forests':1,'monkeys':1,'.':1,'minnows':1,'astronomer':1,'tree-frogs':1,'continent':1},'conquered.':{'it':1},'daisy':{'are':1},'undergo':{'disintegration.':1},'zoophyte':{'called':2,'.':2},'assign':{'no':1},'most...':{'.':1},'partnerships':{'between':1},'knots':{'subsequently':1,'or':1,'smoke':1,'for':1},'probability':{'is':4,'that':1,'the':1,'in':1},'encoding':{':':1},'knocking':{'off':1},'reflected':{'rays':1,'from':3,'back':1,'to':1,'depends':1,'through':1},'antiquity':{'and':1,'of':3,'the':1,'with':1},'moorings':{'.':1},'elder':{'brothers':1},'unexpected':{'manoeuvres':1},'incubated':{'in':1},'warty':{'chameleon':3,'creature':1},'1871':{'when':1},'mist':{'that':1},'miss':{'gertrude':1,'the':1,'part':1,'frances':1},'ninth':{'printing':1},'foraminifera':{'and':1,';':1,'each':2},'utters':{'instinctively':1},'horse':{'and':7,'eohippus':1,'use':1,'merychippus':1,'orohippus':1,'of':2,'showing':2,'pliohippus':1,'running':1,'.':1,'shunting':1,'will':1,'s':1,'mesohippus':1,'a':1,'have':1,'which':1,'has':1,'beginning':2,'or':1,'is':1},'pelagica':{'this':1,'125':1},'findings':{'of':1},'interwoven':{'with':1,'that':1},'obedience':{'to':1},'483.3':{'11.86':1},'wonderful':{'instruments':1,'modern':1,'cluster':1,'devices':1,'colour-scheme':1,'fabric':1,'to':1,'system':1,'.':1,'instrument':3,'new':1,'elements':1,'intellectually':1,'revelations':1,'photograph':1,'corona':1,'manifestations':1,'mass':1,'source':1,'piece':1,'changes':1,'discoveries':1,'x-ray':2,'result':1},'gibraltar':{'professor':1,'so':1},'einstein.':{'illustration':1},'scheme':{'represents':1,'of':1},'danger-call':{'of':1},'passed':{'and':5,'perhaps':1,'down':1,'to':1,'as':1,'through':3,'the':2,'by':1,'before':2},'pure-bred':{'wheat':1},'measurable':{'.':1,'quantity':2},'basal':{'appetites':1},'1918':{'flew':1,'upwards':1},'blindly':{'and':1},'1911':{'showing':1,'23':1},'half-made':{'wing':1},'1912':{'.':1,'in':1},'1914':{'this':1,'and':1,'41':1,'an':1},'1917':{'a':1,'we':1,'upwards':1},'grew':{'to':1,'wheat':1,'by':1,'up':1},'tunic':{'of':1},'kindly':{'emotions':1},'grey':{'red':1,'in':1},'haddock':{'or':1},'intensities':{'of':1},'toward':{'the':2,'death':1,'increasing':1,'us':1},'stickleback':{'enters':2,'being':1,'of':1,'is':2,'s':1,'making':2},'fisheries':{'in':1},'withered':{'leaf':1,'herbage':1},'clerk-maxwell':{'james':1,'246':1,'one':1},'bells.':{'in':1},'alongside':{'of':3},'juice':{'has':1},'sentences':{'of':1,'were':1},'events':{'included':1},'concentration':{'than':1},'organs':{'and':1,'of':1,'pass':1,'but':1,'.':4,'in':1,'throughout':1,'or':1},'gathering':{'light':1,'some':1,'round':1,'to':1,'of':1},'atoms--the':{'energy':1,'discovery':1},'lid':{'.':1},'lie':{'on':1,'disregarded':1,'outside':1,'low':1,'in':1,';':1,'at':1},'u.s':{'.':2},'speculative':{'and':1,'picture':1,'point':1},'flaming':{'jets':1,'hydrogen':2},'scotland':{'1920':1,'s':1,'since':2,'were':1,'.':1},'camouflage':{'and':1,'a':1},'lit':{'our':1,'the':1,'by':1,'up':1},'relieved':{'of':1,'by':2},'labour':{'and':2,'becomes':1,'has':1,'set':1,'.':1},'lip':{'of':1,'the':1,'which':1,'but':1},'useless':{'vestige':1,'responses':1,'movements.':1,'halfpennies':1,'heat':1,'movements':2},'command':{'travels':2},'presently.':{'regions':1,'if':1},'embryological':{'evidence':1,'proof':1},'towards':{'a':1,'what':2,'or':1,'becoming':1,'us':2,'fruit-eating':1,'him.':1,'flesh-eating':1,'harmony':1,'nobler':1,'the':17,'increasing':1,'clothing':1,'its':2,'those':1},'figures--bison':{'reindeer':1},'quote':{'professor':1,'the':1},'literal':{'demonstration':1,'blood-relationship':1},'systems':{'comes':1},'indefinitely.':{'the':1},'eaten':{'or':1},'position':{'and':1,'would':1,'these':1,'of':3,'is':2,'.':1,'held':1,'as':1,'in':1,'invisible':1,'increasing':1,'where':1,'into':1},'alpha':{'the':2,'rays':1,'particle':1,'centauri':2},'approved':{'fashion':1},'19.--comet':{'september':1},'muscle':{'and':1,'for':1,'which':1,'blood-vessel':1},'evolution--factors':{'in':2},'prolongation':{'of':2},'mobile':{'ribs':1,'vehicle':1,'pigment-cells':1,'.':1,'water':2,'in':1,'tongue':1},'performances':{'and':1,'depended':1},'clear':{'and':2,'for':1,'that':8,'ideas':1,'illustration':1,'.':2,'water':1,'as':1,'without':1,'adaptation':1,'in':1,'passage':1,'why':2},'broadened':{'and':1,'out':1},'snapping':{'at':1},'25--giant':{'spiral':1},'electrons':{'and':7,'copper':1,'all':1,'being':1,'possessing':1,'move':1,'moving':1,'it':2,'an':2,'produced':2,'streaming':2,'as':2,'are':7,'in':6,'particles':1,'compose':1,'from':8,'would':1,'electricity':1,'flying':1,'circulating':1,'travel.':1,'.':11,'rushes':1,'to':2,'behind':1,'without':1,'therefore':1,'contained':1,'revolving':1,';':2,'has':3,'pass':1,'is':2,'do':1,'may':1,'circulated':1,'but':2,'263':1,'267':1,'revolve':1,'now':1,'spin':1,'a':1,'rush':1,'resulting':1,'receive':1,'leave':1,'into':1,'258':1,'across':1,'will':1,'continue':1,'so':1,'were':1,'become':1,'increase':1,'or':3},'foster-mother':{'hen':1},'velocity':{'for':1,'of':8,'sufficient':1,'.':2,'which':1,'beyond':1,'masses':1},'usual':{'interchange':1,'direction':1,'definite':1,'difficulty':1,'mode':1,'way':1,'shortness':1,'notion':1},'tubes':{'and':1,'.':1,'by':1,'until':1},'one-eighth':{'of':1},'phenomenon':{'of':1,'is':1,'.':1},'registers':{'the':1,'itself':1},'caries':{'hitherto':1},'velvety':{'skin':1},'stores':{'of':3,'nor':1},'heavens':{'we':1,'7':1,'being':1,'is':1,'.':5,'are':1,'constitutes':1,'which':2,'the':1,'more':1,'with':1,'along':1,'at':1},'164.78':{'34800':1},'wriggle':{'through':1,'up':1},'debts.':{'moreover':1},'with.':{'in':1},'betokens':{'a':1},'northern':{'hemisphere':1,'rhodesia':2,'spain':4,'lakes':1},'duncan':{'.':1},'series':{'of':13,'is':1,'e.g':1,'.':2},'distances;':{'the':1},'less':{'satisfactory':1,'secure':1,'striking':1,'expensively':1,'successfully':1,'powerful':1,'genial':1,'likely':1,'definite':1,'in':1,'radiation':1,'clearly':1,'protrusive':1,'prolific':1,'domed':2,'able':1,'.':2,'moist':1,'stable':2,';':1,'degree':1,'continuous':1,'accurately':1,'important':4,'strenuous':1,'known':1,'regular.':1,'than':17,'conspicuous':1,'aimless':1,'central':1,'fit':2,'brusque':1,'of':3,'steady':1,'severe':1,'promising':1,'the':1,'spontaneous':1},'darted':{'furiously':1},'orbits.':{'circling':1,'yet':1},'surveyed':{'.':1},'pretty':{'generally':1,'fluorescence':1,'pieces':1},'quadrupedal':{'fashion':1},'circle':{'this':1,'of':1,'here':1,'are':1,'round':3,'shows':1},'darwin':{'origin':1,'sir':1,'said':1,'showed':3,'charles':1,'56':1,'observed':1,'s':9,'greatest':1,'in':1,'the':3,'called':1},'ball-room':{'.':1},'dominant':{'spring':1,'reptiles':1},'meanwhile':{'the':1,'we':1,'it':1},'trees':{'a':2,'and':2,'like':1,'with':1,'of':1,'.':2,'where':2,'were':1,'the':1,'has':1,'was':1,'why':1},'famous':{'jesuit':1,'theory':1,'form':1,'of':1,'for':4,'book':1,'manchester':1},'feels':{'for':2},'combinations':{'of':1},'during':{'a':3,'her':1,'eclipses':1,'this':3,'many':1,'an':2,'these':1,'which':5,'the':19,'its':2},'molten':{'interior':1,'matter':1,'by':1},'birds.':{'during':1,'according':1,'it':1},'catches':{'a':1,'the':1},'intrude':{'on':1},'alteration':{'modification':1,'of':1},'flight.':{'illustration':1},'underlying':{'photosphere':1},'withdrawal':{'of':1},'hours--a':{'prodigious':1},'hobbled':{'with':1},'seventeen':{'and':1,'years':1},'religiosa':{'a':1,'138':1},'electro-magnet':{'and':1},'throwing':{'the':1,'off':1},'plausible':{'view':1},'culture':{'gave':1,'migrating':1,'.':1},'invisible.':{'the':2,'sec':1,'illustration':1},'close':{'and':1,'rapidly':1,'indeed':1,'enough':1,'together':1,'to':3,'resemblances':1,'contact':2,'at':1,'reproduction':1,'of':1,'resemblance':1,'by':2},'plankton.':{'hunger':1},'gravitation':{'that':1,'of':1,'is':1,'.':3,'to':1,';':1,'etc.':1},'probable':{'date':1,'age':1,'that':12,'period':1,'however':2},'plasticity':{'of':1,'.':2},'not-living':{'material':1,'materials':1},'tibet':{'indo-china':1},'seventieth':{'of':1},'educability':{'is':1,'but':1,'.':1},'won':{'most':1},'years.':{'and':1,'in':1},'probably':{'associated':1,'illustrates':1,'an':1,'not':1,'are':1,'begun':1,'in':2,'cloud':1,'profitable':1,'from':2,'adapted':1,'there':1,'when':1,'indicate':1,'much':2,'helps':1,'survive':1,'means':2,'lived':1,'that':2,'far':1,'safe':2,'clearer':1,'less':1,'connected':1,'represented':1,'during':1,'breeding':1,'intrinsically':1,'a':3,'did':1,'of':2,'taking':1,'preyed':1,'suggests':1,'points':1,'evolved':2,'the':3,'encased':1,'counted':1,'came':1},'conditions':{'and':1,'that':2,'this':1,'of':15,'when':1,'culminating':1,'.':5,'will':1,'while':1,'internal':1,'are':4,'they':1,'in':2,'reached':1,'the':1,'our':1},'aeons':{'of':1},'ps':{'.':1},'stagnation':{'.':1},'egg-cells':{'and':4},'fox-bat':{'with':1},'missing':{'an':1},'description.':{'it':1},'moults':{'three':1},'craters':{'and':1,'on':1,'indicated':1,'of':3,'.':1,'which':1},'ranked':{'amongst':1},'basalts':{'.':1},'invisible':{'and':2,'because':1,'star':1,'thread':1,'visible':2,'light':2,'gas':1,'against':1,'.':3,'particles':1,'to':1,'rays':1,'electrons':1,'but':1,'molecules':1,'waves':1,'world':1,'medium':1,'if':1},'both':{'jaws':2,'is':1,'in':1,'are':1,'paragraphs':1,'birds':1,'cases--marvellous':1,'from':1,'ways':1,'when':2,'.':1,';':1,'difficult':1,'eyes':2,'his':1,'kinds':1,'photography':1,'chimpanzee':1,'minnows':1,'adult':1,'cases':3,'with':1,'sides':2,'man':1,'on':1,'processes':1,'land':1,'these':3,'of':4,'hemispheres':1,'below':1,'time':1,'small':1,'the':2,'fertility':1,'herons':1},'humidity.':{'there':1},'gaunt':{'and':1},'greater--a':{'sudden':1},'sensitive':{'and':1,'period--the':1,'bromogelatine':1,'hairs':1,'no':1,'to':2,'that':1,'line':1,'than':3},'picture.':{'b':1,'illustration':2},'vaster':{'irregular':1},'experimental':{'plot':1,'discoverer':1,'study':1,'men':1,'character':1,'evidence':1,'behaviour':1,'initiative':1,'way':1,'embryology':1,'conditions':1,'devices.':1,'proof':1},'battery':{'consisted':1},'hewn':{'but':1},'whatever':{'be':1,'kind':1,'medium':1,'means':1,'advances':1,'colour':1,'number':1,'part':1,'way':1,'sets':1,'the':1},'chromosomes.':{'3':1,'5':1,'illustration':1,'6':1},'galileo':{'s':1,'who':1},'climbers':{'of':1,'in':1},'undulating':{'flashes':1},'revolutionising':{'our':1},'persecuted':{'.':1},'described':{'on':1,'later':1,'it':1,'one':1,'to':1,'as':3,'without':1,'stars':1,'in':4,'the':1,'.':1,'by':1},'stamp':{'of':2},'damp':{'meadow.':1,'weather.':1,'grass':1,'meadow-grass':1},'exert':{'this':1,'a':1},'geddes':{'and':1},'describes':{'the':1},'maintenance':{'of':1},'territory':{'we':1},'empty':{'available':1,'shell':2,'space':2,'of':1,'nest':2,'space--ether':1,'coco-nut':1,'infinite':1,'chambers':1,'the':1,'tubular':1},'jesuit':{'astronomer':1},'lived':{'on':1,'like':1,'for':1,'there':1,'.':1,'in':3,'100':1,'between':1},'partly':{'on':2,'because':9,'opened':1,'due':2,'accounts':1,'by':2},'success.':{'the':1},'intelligently.':{'intelligence':1},'freezing-point.':{'the':1},'exempt':{'status':2,'from':1},'permeating':{'the':1},'else':{'it':1,'soon':1,'in':2,'.':1,'seek':1,'mere':1},'lives':{'a':1,'on':2,'there.':1,'for':1,'inside':1,'together':1,'.':3,'at':1,'which':1,'in':4,'or':1},'liver':{'and':1},'magnetised':{'iron':1},'look':{'towards':1,'like':1,'for':3,'exactly':1,'.':1,'to':1,'at':4,'forward':2,'further':1,'precisely':1,'after':3,'more':1},'opportunity.':{'there':1},'ape-like':{'and':1,'eyebrow':1},'pace':{'sternly':1,'of':1},'while':{'and':1,'all':1,'contemporaneously':2,'energy':1,'some':1,'it':1,'one':1,'at':1,'zinc':1,'in':1,'our':1,'neanderthal':1,'her':1,'there':1,'two':1,'to':1,'we':1,'they':2,'others':2,'monkeys':1,'a':2,'on':1,'fleas':1,'these':1,'many':1,'this':1,'the':12,'similar':1},'ought':{'to':4,'definitely':1},'286':{'transformation':1},'mitchell':{'it':1},'guide':{'the':1,'him':1,'.':1},'pack':{'of':1},'albatros':{'fashion.':1},'forelegs':{'as':1},'selected':{'spot':1,'was':1},'dictum':{'that':1},'fed.':{'the':1},'overlooked':{'the':1},'geologists':{'to':1,'cannot':1},'reads':{'the':1,'like':1},'ready':{'to':4,'way':1},'simian':{'tribe.':1,'branch':1,'stock--physiological':1,'characters':1,'line':1,'type':1,'stock':5},'communal':{'life.':1},'predominates':{'.':1},'forewing':{'.':1},'belong':{'to':6,'as':1,'.':1},'unpromising':{'haunt':1},'shad':{'which':1},'grand':{'hardwood':1,'total':1,'.':1},'modification':{'or':1},'composition':{'of':3,'what':1,'was':1,'we':1},'clearness':{'and':1},'hind-leg':{'of':2},'used':{'on':1,'we':1,'for':6,'fire':1,'is':1,'up':2,'.':1,'to':14,'as':4,'threads':1,'in':10,'such':1,'the':1,'was':1,'by':5,'if':1},'temporary':{'and':2,'diseased':1,'nest':1},'suggestion':{'of':5,'that':2,'was':1,'.':1},'optic':{'nerve':1},'tube.':{'it':1},'u.s.':{'unless':1},'wilson':{'a':1,'observatory':2,'reflector':1,'45':1,'reflecting':1,'california':2,'observatory.':8},'000':{'and':1,'barrels':1,'miles':35,'years.':1,'pounds':3,'of':6,'times':3,'feet':1,'to':6,'000':20,'miles--eighteen':1,'are':1,'atoms.':1,'inch':2,'deg':2,'years':17,'bushels':2},'uses':{'it':1},'cleaning':{'the':1},'saucer-shaped':{'body':1},'assortment':{'of':1},'brussels':{'sprouts':1},'tufts':{'growing':1,'of':1,'in':1},'changed.':{'we':1},'luminescence':{'will':1,'makes':1,'that':1},'older':{'astronomers':1,'and':1,'loess':1,'yucca':1,'than':1},'spectrum.':{'that':1},'copper.':{'illustration':1},'consistence':{'of':1},'obviously':{'that':1,'much':1,'means':2,'desirable':1,'depends':1,'complex':1,'the':1,'must':1},'segmented':{'marine':1},'forms.':{'illustration':1},'calcutta':{'which':1,'.':1},'suddenness':{'the':1,'like':1},'scouring':{'a':1,'tide':1},'distances':{'and':1,'distance':1,'from':5,'of':3,'within':1,'deriving':1,'are':1,'which':1,'between':1,'the':1,'with':1},'alytes':{'not':1},'cave':{'in':2,'drawings':1,'northern':4,'.':1},'judgments':{'about':1,'expressed':1,'in':1},'migratory':{'flight':1},'overflows':{'over':1},'rabbit--who':{'by':1},'quarters':{';':1},'perforating':{'the':1},'planetoids':{'splashed':1,'or':1},'useful':{'and':1,'associations':2,'ready-made':1,'branches':1,'means':1,'pennies':1,'teeth':1,'law--senses':1,'to':6,'deposit':1,'advertisement':1,'in':3,'offices.':1,'law':1,'quality':1,'first':1},'praying':{'mantis':3},'informal':{'introductions':1},'possessors':{'to':1,'back':1,'than':1},'stock--physiological':{'proof--embryological':1},'debatable':{'questions':1},'remaining':{'on':1,'six.':2,'provisions.':1},'elver':{'at':1},'unravelled':{';':1},'march':{'23':2},'insert':{'here':1},'reptilian':{'splendour.':1,'mind--mind':1,'life':1,'mind':1,'features':1},'showing':{'a':10,'division':1,'seven':2,'him':1,'upper':1,'gradual':2,'that':1,'evolution':1,'marked':1,'.':1,'how':1,'various':2,'no':1,'under':1,'in':1,'variable':1,'what':1,'the':16,'many':1,'their':1,'trout':1},'game':{'of':4,';':1,'or':1},'wiser':{'than':1},'text-book':{'of':2},'damage':{'or':1},'distance.':{'illustration':1},'wings':{'of':3,'is':2,'turned':1,'it':1,'.':4,'suggests':1,'while':1,'are':3,'have':1,'in':1,'the':1},'translucent':{'blue':1},'ponds':{'and':1,'where':1,'they':1,'.':1},'fore-limb':{'and':1,'of':2,'is':1,'has':2,'transformed':1},'long-drawn-out':{'sublime':1},'pillar':{'to':1,'the':1,'parallel':1},'resorted':{'to':1},'holes':{'and':1},'manifest':{'themselves':1},'eel':{'and':1,'is':1,'early':1,'haddock':1,'anguilla':2,'ever':2},'popular':{'lectures':1,'astronomy':1,'idea':1,'sense':1,'interpreter':1,'estimation':1},'death-feigning':{'for':1},'minced':{'snail':1},'mathematical':{'discussion.':1,'astronomers':1,'genius':1,'points':1,'consequence':1,'astronomy':1,'reasoning':1},'wrack':{'behind':1},'cones':{'and':1,'to':1},'negative.':{'a':1},'creation':{'of':1,':':1,'when':1,'.':3},'some':{'pollen':1,'remarkable':1,'insects':2,'cromagnards':1,'muscle-fibres':1,'worms':1,'parts':4,'years':2,'volcanic':1,'cases':10,'knowledge':1,'hint':1,'interesting':1,'young':1,'improvement':1,'source':1,'writers':1,'black':1,'botanists':1,'deep-seated':1,'thousands':1,'dispute':1,'which':1,'food':1,'leisure':1,'dark':2,'they':1,'radio-active':1,'uncertain':1,'adventurous':1,'stimulus':1,'deficient':1,'miles':1,'truth':1,'small':2,'force':1,'people':1,'animals':4,'idea':2,'namely':1,'are':3,'measure':8,'disturbing':1,'nocturnal':1,'creatures':1,'respects':3,'organisms':1,'solemn':1,'anatomists':1,'eminent':2,'uniform':2,'fossil':1,'new':4,';':1,'twenty-five':1,'sluggish':1,'trout':1,'degree':2,'men':1,'lakes':1,'quite':1,'water':1,'extraordinary':1,'reason':1,'extent':5,'path':1,'canals':2,'strong':1,'great':2,'thirty':1,'of':55,'region':1,'undisguised':1,'aboriginal':1,'butterflies':1,'place':1,'deep-sea':1,'other':15,'mound-birds':1,'members':1,'striking':1,'simple':2,'fishes':3,'hermit-crabs':2,'carry':1,'ape':1,'little':1,'nebulae':2,'would':2,'harmless':1,'lizards':1,'unknown':1,'long':1,'way':5,'more':1,'sort':8,'that':1,'vanishing':1,'mammals':2,'explanation':1,'precision':1,'races':1,'particular':1,'prodigious':1,'primeval':2,'careful':1,'spirit':1,'task.':1,'150':1,'distance':2,'kind':5,'word':1,'solid':1,'theories':1,'nine':1,'were':1,'beautiful':2,'imaginative':1,'larger':1,'beetles':1,'process':1,'modern':1,'geologists':1,'states':1,'say':1,'have':2,'regulate':1,'species':2,'education':1,'considerable':1,'detail':1,'astronomers':4,'very':1,'strange':1,'electrical':1,'animal':1,'semi-fluid':1,'intelligent':1,'day':2,'fairly':1,'unimaginable':1,'kinds':2,'earlier':1,'delicacy':1,'secluded':1,'waves':1,'authorities':6,'such':2,'land':1,'dragon-flies':1,'surprising':1,'magical':2,'think':1,'fundamental':3,'time':1,'wood-snails':1,'eighty-odd':2,'bodies':1,'typical':1},'yolk':{'fully':1,';':1,'has':1,'y.s.':1,'.':1},'apes--gorilla':{'orang':1},'urgent':{'need':1},'lips':{'and':2,'four':1,'audibly':1},'economic':{'and':1},'besides.':{'interpretation':1},'nerve-fibres':{'one':1},'lingers':{'in':1},'body-mind':{'.':1},'universes':{'why':1,'comparable':1,'.':1,'like':1,'in':1},'bruising':{'the':2},'savage':{'nature':1},'nonproprietary':{'or':1},'fifty-millionth':{'of':1},'pitchblende':{'about':1,'which':1},'exceeding':{'the':1,'that':1},'competitions':{'arose':1},'pounding':{'breakers':1},'civilization':{'.':1},'sympathetic':{'ganglia':1,'colouring':1},'claimed':{'that':1},'knitting-needle':{'in':1},'eating':{'at':2,'one':1},'protrusible':{'tongue':1,'tentacles':1},'processing':{'or':1},'lakes':{'and':1,'there':1,'are':2},'stem':{'still':1,'diverged':1,'help':1,'goes':1,'.':2},'step':{'meant':1,'towards':1,'two-thirds':1,'which':1,'in':6,'toward':1,'was':3},'lasts':{'till':1,'through':1,'no':1},'become':{'equally':1,'words':1,'beautifully':2,'satisfactory':1,'an':1,'at':1,'sea':1,'in':3,'luminous':1,'living':1,'bipeds':1,'unavailable':2,'unavailable.':1,'burrowers':1,'silvery':1,'shorter':2,'permanent':1,'fatal':1,'more':3,'real':1,'yellowish':1,'separate':1,'secondarily':1,'invisible--just':1,'faintly':1,'steadied':1,'parr':1,'utterly':1,'not':1,'instinctive':1,'dissipated':1,'quite':1,'invisible.':1,'a':13,'organically':1,'perfectly':1,'like':1,'liquid':1,'of':1,'large':1,'the':2,'adapted':1},'abroad':{'during':1},'facility:':{'http:':1},'shine':{'very':1,'out':1},'faith':{'that':1},'76':{'photo':1,'the':1,'venus':1,'capella':1},'entailed':{'on':1},'prothyl':{'as':1},'warm-bloodedness':{'is':2},'four-footed':{'ancestry':1},'chaps.':{'illustration':1},'silence':{'and':1,'immense':1},'seeing':{'there':1,'it':1},'baboons':{'.':1},'visit':{'to':1,':':1,'http:':1},'within':{'into':1,'60':1,'as':2,'itself':2,'.':1,'their':2,'which':2,'themselves':1,'them':2,'his':1,'reach':1,'five':2,'90':2,'recent':1,'a':7,'about':2,'limits':1,'this':1,'30':1,'bounds':1,'reasonable':1,'the':20,'fixed':1},'libelled':{'as':1},'encircling':{'rampart':1},'one-millionth':{'of':2},'france':{'and':3,'in':3},'smells':{'indeed':1},'theory.':{'the':1,'while':1,'illustration':1},'statistics':{'worked':1},'feelers.':{'illustration':1},'renewal':{'.':1},'sea-snail':{'and':1,'.':1},'transcending':{'the':1,'anything':1},'placing':{'a':1,'the':1},'moseley':{'found':1,'s':1,'some':1},'heritage':{'not':1,'much':1},'spawning':{'none':1,'solution':1,'.':1,'beds':1,'are':1,'method':1},'revolving':{'very':1,'as':1,'electrons':1,'in':1,'round':1,'blades':1},'tortoise-shell':{'butterfly':1},'manufacture':{'and':1,'subtle':1,'much':1,'chlorophyll':1},'himself':{'and':1,'established':1,'educated':1,'the':1,'.':1,'in':1,';':1,'by':1},'registered':{'on':1,'trademark':2},'frost':{'and':1,'acting':1,'but':1},'torch':{'of':1},'shore-crab':{'is':1,'shows':1,'.':1},'properly':{'the':1},'authority':{'on':2,'thinks':1},'newer':{'loess':1},'hares':{'and':1},'dull':{'sheaths':1,'white':3,'red-hot':1,'red':1,'.':1},'zooelogical':{'discoveries':1},'lamp-shells':{'trilobites':1,'molluscs':1},'folk-ways':{'to':1},'drifters':{'the':1,'or':1,'plankton':1},'skull':{'and':6,'represents':1,'from':1,'then':1,'of':2,'is':2,'was':3,'.':3,'discovered':2,'looks':1,'which':1,'the':2,'with':1,'warns':1,'170':1},'circuits':{'as':1},'sifting':{'process':1,'.':1,'to':1,'continue':1,'which':3,'the':2,'by':1,'out':3},'foresight':{'and':1,'to':1,'means':1},'state--':{'radiant':1},'cautiously':{'out':1},'similar':{'palatable':1,'needs':1,'disturbance':1,'inference':1,'adaptations':1,'organisms':1,'sedimentary':1,'performances.':1,'processes':1,'results':1,'forms':2,'to':5,'experiments':1,'statements':1,'in':1,'things.':1,'disorders':1,'pieces':1,'conditions':1,'deposits':1,'stage':1},'non-living':{'sea-dust':1,'world.':1},'adults':{'of':1,'the':1,'like':1},'introducing':{'dust':1,'2':1},'metals':{'afforded':1,'would':1,'began':1,'but':1,'as':1,'were':1,';':1,'seem':1,'the':1},'unwise':{'to':1},'1894':{'in':1},'1895':{'sir':1,'roentgen':1},'1896':{'becquerel':1},'1890':{'that':1},'shown.':{'in':1},'kidney':{'filters':1},'cotton':{'packet':1,'were':1},'ancestors':{'a':1,'belonged.':1,'breathing':1,'on':1,'may':1,'of':5,'.':4,'which':1,'were':2,'during':1},'amounts':{'almost':1,'according':1},'heat.':{'recent':1,'illustration':1,'that':1},'prerogative':{'of':2},'mantises':{'which':1},'dissolved':{'away':2,'in':2,'salts':1,'out':1},'electrical':{'industries':1,'force':1,'installations':1,'nature':1,'influence':1,'energy':2,'phenomena.':1,'phenomena':2,'.':1,'cell':1,'attraction':2,'storm':1},'themselves.':{'illustration':1},'milk-glands':{'of':1},'dashes':{'round':1},'bodies.':{'4':1},'draw':{'water':1,'this':1,'a':1,'back':1},'clean':{'and':1},'calculating':{'boy':2},'crouching':{'bird':1,'lying':1},'potentialities':{'of':1},'triumph':{'that':1},'visits':{'us':1,'another':1},'frances':{'pitt':1},'william':{'king':1,'james':1,'bragg':2,'leche':2,'ramsay':1,'crookes':5},'astronomy.':{'ball':1},'chameleon':{'140':1,'attacked':1,'may':1,'is':2,'.':1,'s':1,'which':1,'in':1,'the':1,'inflated':1,'anolis':1},'does;':{'with':1},'cuttlefish':{'do':1,'or':4,'swimming':1},'structure':{'201':1,'and':3,'or':1,'would':1,'do':1,'far':1,'of':8,'is':1,'between':1,'mainly':1,'.':4,'adaptation':1,'which':1,'in':1,';':1,'has':1,'the':1},'independently':{'established':1,'darting':1},'correlated':{'with':1},'e':{';':1,'vivo':1,'.':9},'practically':{'a':1,'dates':1,'cosmopolitan':1,'anything':1,'certain':2,'extinguished':1,'all':1,'as':1,'every':4,'invisible.':1,'invisible':1,'the':1,'ready-made':1,'illimitable':1},'physics':{'and':2,'is':1,'.':1,'cannot':1,'so':1,'at':1,'has':1,'with':1,'are':1},'portentous':{'furnace':1,'event':1,'mines':1},'required':{'to':2,'five':1,'by':1,'thirty-five':1,'for':3},'resolving':{'to':1,'the':1},'orbit':{'to':1,'of':2,'round':1,'.':1},'utilised':{'to':1,'we':1,'by':1,'directly.':1},'depth':{'of':2,'the':1,'limit':1,'.':1},'night.':{'meteors':1,'higher':1},'utilises':{'the':1},'ignorant':{'of':2},'underrated':{'.':1},'berries':{'and':1},'requires':{'to':2,'the':1,'for':1,'ten':2},'sounded':{'by':1},'evenly':{'together':1},'gr':{'granules.':1},'cheerful':{'and':1},'34800':{'1':1},'go':{'and':1,'into':3,'back':4,'down':2,'through':3,'farther':2,'irresponsibly':1,'in':2,'out':2,'their':1,'up-stream':1,'since':1,'to':4,'too':1,'forward':1,'round.':1,'badly':1,'far':2,'free':1,'hand':1,'they':1,'a':1,'on':8,'fully':1,'straight':1,'up':1,'so':1,'deeply':1,'wrong:':1,'the':1,'round':2},'compact':{'little':2,'readily':1},'birthplace':{'after':1,'where':1,'.':1},'baron':{'cuvier':2},'arid':{'and':1,'summer':1},'suits':{'their':1,'the':1},'task.':{'quick':1},'friendly':{'home':1},'fond':{'of':3},'moribund':{'animalcules':1},'rebounding':{'branch':1},'1796':{'the':1},'miners':{'when':1},'wave':{'would':1,'thunder':1,'of':1,'.':1,'shapes':3,'forms.':1},'board.':{'the':1},'trough':{'to':1,'is':1,'in':1},'more.':{'there':1,'sec':1},'whirlpools':{'.':1,'in':1},'scrapers':{'gravers':1},'stiff':{'when':1,'tail-feathers':1},'positions':{'of':1,'towards':1,'so':1,'.':2},'button':{'at':1},'michael':{'s':1,'hart':1},'hive':{'bees':1},'tree.':{'the':1,'sec':1},'verdict':{'omne':1},'sedentary':{'plants':1,'sea-squirts':1,'sponges':1,'or':1,'types':1},'betelgeux':{'has':1},'deg.-34':{'deg':1},'teeth.':{'adaptations':1,'illustration':1},'dilute':{'substances':1},'booty':{'.':1},'detaches':{'a':1},'gumboil':{'too':1},'picked':{'them':1,'off':1,'it':1,'up':3},'creatures--the':{'first':1},'notwithstanding':{'our':1},'fishermen;':{'without':1},'plays':{'possum.':1,'upon':2,'its':1,'an':2},'paintings':{'on':2},'opaque':{'covering':1,'substances.':1,'substance':1,'with':1,'substances':2},'b-c.':{'older':1},'atoms--different':{'kinds':1},'cell':{'that':1,'to':1,'as':1,'in':2,'the':1,'has':1,'come':1},'prejudicially':{'affected':1},'experiment':{'and':1,'showed':1,'would':1,'that':1,'with':1,'.':4,'will':1,'2':1,'which':1,'in':1,';':1,'has':3,'was':2,'he':1},'poles':{'of':3,'especially':1,'.':1},'rotted':{'into':1},';':{'just':1,'indeed':1,'soon':1,'yet':3,'before':1,'copernicus':1,'interesting':1,'3':3,'to':2,'out-breeding':1,'4':2,'8':1,'his':1,'rational':1,'meanwhile':1,'food':1,'they':25,'not':1,'nor':1,'h':1,'where':1,'round':1,'energy':1,'some':4,'ourselves':1,'out':1,'even':2,'living':1,'what':2,'organisms':1,'its':2,'enough':1,'discovers':1,'7':2,'probably':1,'we':7,'here':1,'water':3,'others':2,'by':5,'on':4,'c':1,'of':2,'larger':1,'or':1,'simple':1,'ca':1,'one':3,'another':2,'mercury':1,'from':1,'there':11,'two':1,'thirdly':1,'2':4,'therefore':1,'6':2,'corresponding':1,'that':12,'ages':1,'but':39,'those':1,'he':3,'sound':1,'b':2,'mc':1,'this':3,'while':1,'r':1,'and':61,'almost':1,'thus':1,'it':51,'an':1,'as':1,'at':1,'in':17,'partly':1,'if':6,'perhaps':4,'foretells':1,'how':1,'5':2,'which':2,'9':1,'though':3,'gradually':1,'most':1,'man':1,'a':7,'lower':1,'short':1,'for':3,'sometimes':2,'so':1,'the':65},'completion':{'assuming':1},'melancholy':{'the':1,'in':1},'cellulose':{'walls':2,'but':2},'filings':{'on':1,'arrange':1},'commercial':{'redistribution.':1},'fifteenth':{'of':1},'arrow-worm':{'and':1},'following':{'short':1,'for':1,'that':1,'this':1,'list':1,'professor':1,'sentence':1,'definite':1,'up':2,':':1,'which':1,'each':1,'the':3,'stages':1},'boot.':{'sec':1},'collar-bone':{'which':1},'canals':{'and':2,'of':1,'running':1,'have':1,'.':2},'water-weeds':{';':1},'convert':{'even':1,'to':1,'nitrogenous':1},'indivisible':{'thing':1,'.':3,'particle':1,'they':1,'in':1},'anvil':{'a':1,'the':1,'could':1,'221':1,'.':1},'haunts':{'and':1,'both':1,'of':5,'there':1,'.':2,'untenable':1,'are':1,'in':1,'the':1,'or':1},'animalcules':{'especially':1,'which':1},'benevolence':{'which':2},'repel':{'one':1},'products':{'the':1},'stars--the':{'shape':1,'nebular':1,'age':1},'hearty--we':{'might':1},'stump-like':{'legs':1},'daybreak':{'and':1},'addresses':{'.':2},'danger':{'home':1,'but':1,'of':1},'foothold':{'and':2,'to':1,'in':2},'limited--there':{'are':1},'wit':{'of':2,'enough':1,'to':1},'vegetation--a':{'very':1},'singing':{'of':1},'cloud':{'and':1,'formations.':1,'of':1,'to':2,'32':1,'not':1,'makes':1,'or':2},'reflector':{'differ':1,'of':1,'.':1,'at':1,'instead':1,'the':1,'has':1},'remains':{'adjusted':1,'bring':1,'as':2,'are':1,'in':1,'unaltered':1,'to':1,'known':1,'that':1,'very':1,'occurred':1,'unfrozen':1,'164':1,'quite':1,'with':1,'man':1,'a':2,'obscure.':1,'of':7,'clear':1,'were':2,'found':4,'the':1,'fixed':1,'stationary':1,'consisted':2},'hydra':{'growing':1,'and':1,'72':1,'a':1,'many':1},'contentment':{'.':1},'crab':{'and':1,'then':1,'gets':1,'on':1,'these':1,'is':3,'continues':1,'soon':1,'to':1,'s':2,'116':1,'has':1,'prefers':1,'must':1},'vehicle':{'and':1,'of':2},'stage':{'and':1,'what':1,'or':1,'fastened':1,'like':2,'of':4,'is':1,'there':1,'.':1,'in':4,';':1,'its':1,'before':1},'depreciate':{'the':1},'started':{'the':1,'his':1,'with':1,'less':1},'becomes':{'a':4,'limited':1,'gradually':1,'feebler':1,'lead':2,'very':1,'radium':2,'hard':1,'uranium':1,'electrified':1,'possible':1,'shorter':1,'much':1,'impure.':1,'radiated':1,'negatively':1,'aware':1,'the':5,'great.':1,'more':4},'visibility':{'are':1,'but':1},'43.4':{'alpha':1},'rivalry':{'of':2},'huxley':{'regarded':1,'1825-95':2,'by':2,'called':1},'sea-floor':{'and':1,'a':1},'crosses':{'a':1,'the':2},'consort':{'with':1},'lapse':{'of':1},'averaged':{'off.':1},'recession':{'of':1},'3--the':{'moon':1},'meet':{'and':1,'exceptional':1,'this':1,'where':1,'their':1,'frequently':1,'the':3,'with':1},'nurture':{'habits':1,'seems':1},'drops':{'of':2,'as':1},'control':{'a':1,'of':2,'over':1,'in':1,'but':1,'.':1,'as':1,'each':1,'the':1},'corpuscular':{'theory':1},'escapes':{'this':1,'attention':1,'from':1,'by':1,'.':1},'escaped':{'and':1},'his':{'chariot':1,'magnetic':1,'actions':1,'hind-legs':1,'polish':1,'throne.':1,'previous':1,'pectoral':1,'limbs':1,'rapid':1,'disposal':1,'beagle':1,'kingdom.':1,'astonishment':1,'world.':1,'grip':1,'plate':1,'big':2,'navigable':1,'wives':1,'famous':1,'breast':1,'facial':1,'vacuum':1,'foot':2,'experiments.':1,'distrust':1,'science':1,'fertility':1,'teeth.':1,'ethical':1,'lowly':2,'infancy':1,'best--':1,'dead':1,'affiliation':1,'cost':1,'living':1,'pedigree':1,'tube':1,'fingers':1,'lowliness':1,'conduct':2,'origin.':1,'achievements':1,'theory':1,'business':1,'dental':1,'behaviour':1,'ancestry':1,'flanks':1,'eye':2,'tortoise':1,'conviction':1,'pursuits.':1,'messages':1,'interesting':1,'or':1,'origin':1,'own':3,'family':1,'bonnet':1,'erect':1,'god-like':2,'refined':1,'greatness.':1,'mental':2,'parentage':1,'fields.':1,'monkey':1,'own.':1,'brute':1,'long':1,'milieu':1,'observations':1,'greatness':1,'right.':1,'telegraph':1,'descent.':1,'head':3,'relationship':1,'bodily':2,'hole':1,'breast-pocket':1,'structure.':1,'encouragement.':1,'work':1,'individual':1,'more':1,'eyes':1,'domesticated':1,'everyday':1,'innings':1,'leisure-time':1,'electro-magnetic':1,'power':2,'faults':1,'reach.':1,'arguments':1,'answer':1,'stock':1,'development':2,'noble':2,'elbows':1,'social':1,'hand':1,'mouse-pupil':1,'mouth':2,'mate':2,'solidarity':1,'attempt':1,'observation':1,'charges':1,'starting':1,'chickens':1,'daily':1,'hypotheses':1,'fundamental':1,'tubes':1,'left':1},'pulling':{'things':1,'the':2},'sought':{'after':1,'out':1},'cave-men':{'of':1,'lived':1,'or':1,'show':1},'herring-gulls':{'lift':1},'embodiment':{'to':1,'or':2,'of':1},'defective':{'you':1,'work':1,'or':2},'digested':{'or':1},'confessed':{'that':2},'andes':{'.':1},'arrangement':{'of':4,'is':1,'there':1,'by':1},'solidifying':{'of':1},'located':{'on':1,'in':1,'at':2,'also':1},'sentiments':{';':1,'in':1},'instinctively':{'a':1,'recognize':1,'as':1,'for':1,'but':1},'re-use':{'it':2},'circular':{'magnetic':1,'orbit':1,'craters':1},'pink':{'mouth':1},'fostered':{'and':1,'not':1},'furiously':{'upon':1},'thunderstorm':{'we':2,'.':1},'trinil':{'in':1},'regrown':{'double.':1,'.':1},'sugar-bird':{'in':1},'free-swimming':{'larval':1,'larvae':1},'1.88':{'4230':1},'gulps':{'.':1},'conspicuousness':{'serves':1},'divided':{'their':1,'the':1,'into':5,'.':1},'immensity':{'of':1,'is':1},'least':{'meant':1,'a':3,'cold':1,'within':1,'600':2,'has':1,'interesting':1,'half':1,'there':1,'twenty':1,'one':1,'as':1,'of':2,'two':1,'in':1,'progress':1,'tremor':1,'.':2,'the':1,'by':1,'inclination':1},'astronomical':{'instruments':1,'society.':2,'instrument':1},'spots--they':{'are':1},'sperm':{'-cell':1},'boils':{'because':1},'primates':{'and':1,'sprang':2,'began':1,'soon':1,'.':1,'emerged':1,'in':1,'was':1},'including':{'climate':1,'shrews':1,'that':1,'some':1,'life':1,'legal':2,'obsolete':1,'checks':1,'but':1,'how':1,'the':5,'river':1,'outdated':1,'any':1},'obelia':{'68':1,'consisting':1},'converting':{'it':1},'facilitates':{'the':1},'brittle':{'spikelet-bearing':1},'avebury':{'s':1},'27-1':{'2':1},'outer':{'layers':1,'and':1,'stream':1,'space':1,'envelope':1,'one-mile':1,'crust':1,'surface':1,'crust.':1,'mile':1,'world':2,'ring':1},'exclusion':{'or':1},'thence':{'to':1},'up-stream':{'as':1},'masses':{'and':2,'of':6,'the':2,'or':1,'a':1},'water-weed':{';':1,'glued':2},'brook':{'of':1},'him':{'and':1,'partly':1,'of':1,'.':2,'how':1,'which':1,'in':1,'with':2},'registration.':{'illustration':1},'pre-dravidians':{'and':1},'master.':{'learning':1},'dead-leaf':{'butterfly':2},'popularly':{'known':1,'supposed':1},'shasta':{'daisy':1},'hills.':{'the':1},'rising':{'and':2,'from':1,'into':1,'sometimes':2,'water':1,'to':1,'in':1},'africa.':{'illustration':2},'stout':{'knitting':1},'hands':{'and':1,'did':1,'.':1,'in':1,'of':1},'front':{'and':3,'of':3,'door':1,'side':1,'.':1},'revealed.':{'even':1,'illustration':1},'masters':{'of':1},'f.e.s.':{'a':5,'diagram':1,'protective':1,'earthworm':1,'when':1,'hermit-crab':1,'hind-leg':1,'glass':1,'green':1,'new':1,'the':5,'trypanosoma':1,'venus':1},'mastery':{'of':5,'by':1,'.':1},'university':{'of':2,'library':3,'10':1},'plate-holder':{'on':1},'magnitude':{'and':2,'of':1,'what':1,'which':1},'mode':{'of':1},'pools':{'and':1,'of':2,'it':1,'dried':1,'which':1,'in':1},'evolution--how':{'it':1},'legions':{'of':1},'upward':{'and':2,'to':1,'at':1},'mare.':{'illustration':1},'map':{'of':2},'globe':{'and':1,'from':1,'like':1,'turns':1,'.':3,'will':1,'to':1,'bounded':1,'which':1,'was':1},'steadied':{'into':1},'mollusc':{'and':1,'s':1,'shells':1},'sands':{'of':2},'measure':{'be':1,'them':1,'for':1,'this':1,'speed':1,'explained':1,'it':1,'.':2,'how':1,'controlling':1,'unveiled':1,'dependent':1,'the':1,'with':1,'climb':1},'separating':{'the':1,'from':1,'positively-electrified':1},'special':{'protective':1,'vertical':1,'danger':1,'rules':1,'study':1,'protection':1,'interest':1,'make-up':1,'skin-leaves':1,'photographic':1,'properties':1},'143':{'protective':1},'ejecting':{'beta':1,'an':1},'vaporisation':{'of':1},'9.--the':{'great':1},'confess':{'to':1},'protoplasm':{'which':1,'flowing':1},'may':{'afterwards':1,'consider':1,'obtain':1,'rest':1,'bring':1,'go':2,'follow':2,'still':2,'find':1,'help':1,'29':2,'charge':1,'choose':1,'save':1,'swim':1,'do':1,'get':1,'read':1,'express':1,'mention':2,'not':4,'tend':1,'fitly':1,'realise':1,'contain':1,'become':3,'mean':1,'traverse':1,'set':1,'we':1,'see':1,'1924':1,'pass':6,'creep':1,'even':1,'by':1,'yet':1,'wriggle':1,'approach':1,'refer':1,'make':3,'be':124,'notice':1,'extend':1,'associate':1,'here':1,'qualify':1,'distinguish':1,'bask':1,'change':1,'convert':1,'keep':1,'credit':1,'place':1,'retain':1,'safely':1,'think':1,'elect':1,'divide':1,'conclude':1,'merely':1,'determine':1,'speak':4,'use':2,'raise':1,'prove':2,'there':2,'add':1,'.':1,'call':1,'therefore':1,'only':1,'form':2,'serve':1,'hear':1,'gain':1,'demand':1,'copy':2,'look':2,'remain':1,'suppose':1,'learn':3,'spawn':1,'give':3,'escape':1,'it':1,'say':3,'at':1,'have':27,'seem':3,'seek':1,'occur':2,'lie':1,'turn':2,'perhaps':1,'travel':1,'also':3,'take':1,'rise':1,'quote':1,'produce':2,'recognise':1,'assume':1,'well':3,'roughly':1,'spend':2},'time.':{'the':2,'illustration':1,'in':1},'pendent':{'whalebone':1},'cause':{'a':3,'and':1,'clouds':1,'of':2,'tiny':1,'chemical':1,'to':1,'the':1,'bodies':1},'achievements':{'of':2,'so':1},'fly.':{'the':1,'illustration':1},'that--':{'first':1},'withering':{'leaves':1,'leaf':1},'completely':{'disappear':1,'invisible.':1,'mysterious':1,'camouflaged.':1,'worked':1,'empty':1},'ancestry':{'of':2,'.':1,'but':1,'in':1},'egg-cocoons':{'in':1},'x':{'indicates':1},'mares':{'brought':1},'spongillidae':{'the':1},'hostile':{'way':1},'determining':{'the':1},'route':{'of':1},'times':{'and':4,'among':1,'smaller':5,'over':1,'it':1,'as':7,'thinner':2,'human':1,'in':3,'still':1,'from':1,'for':2,'whipping':1,'there':1,'when':1,'long':1,'.':2,'cooling':1,'until':1,'more':1,'we':2,'around':1,'that':6,'lizzie':1,'rise':1,'during':1,'emergence':1,'longer':1,'a':3,'faster':1,'of':3,'the':6,'round':1},'counterpart':{'of':1,'in':1},'keen':{'and':2,'a':1,'senses':1,'struggle':2,'are':1},'keel':{'on':1,'which':1,'for':1,'if':1},'apennines':{'have':1},'glories':{'of':1},'sargasso':{'sea.':1,'weed':2},'fertilises':{'these':1,'the':2},'baleen':{'whale':1},'possessing':{'the':1,'with':1},'powerful':{'a':1,'telescopes.':1,'muscles':1,'friar-birds':1,'leg':1,'strokes':1,'legs':1,'tides':1,'factors':1,'possible':1,'agencies':1,'magnet':1,'microscope':1,'current':1,'as':1,'.':1,'than':2,'lens':1},'disembodied':{'electricity':2,'atom':1},'fertilised':{'egg-cell':7,'egg':2,'ovum':2,'by':1},'light-brown':{'colour':1},'lighter.':{'the':1},'proterospongia':{'69':1,'one':1},'activity.':{'this':1},'precisely':{'the':2,'because':1,'controlled':1,'like':1},'quality':{'and':1,'which':2,'that':1,'of':4,'is':1,'.':2,'they':1,'in':1,'than':1},'suck':{'.':1},'long':{'slope':1,'golden':1,'strings':1,'afterwards':1,'weighs':1,'process':2,'series':1,'is':1,'ages':4,'it':2,'as':6,'gristly':1,'summer':1,'result':1,'another':1,'curved':1,'lifetime':1,'racial':1,'tubular':1,'arm':1,'before':3,'story':1,'gamut':1,'pedigree':1,'prehensile':1,'ones':1,'since':3,'.':4,'to':4,'tail':1,'low':1,'way':3,'time':2,'has':1,'red':1,'stilt-like':1,'ago':12,'begin':1,'run':2,'arboreal':1,'history':2,'inclined':1,'after':1,'body':1,'haunt':1,'ovipositor':1,'step':1,'journey':2,'threads':1,'with':1,'day':1,'chapter':1,'on':1,'and':3,'like':1,'stalks':2,'we':1,'the':1,'lizard-like':2,'face':2,'range':1,'branched':1,'period':2,'night.':1,'night':1,'periods':1,'rising':1,'tongue':1,'narrow':1,'summer.':1,'or':1,'pre-human':1,'are':1},'bears':{'very':1,'the':1,'in':2},'dove':{'and':1},'land--the':{'air.':1},'relations':{'and':1,'making':1,'of':1,'with':1,'to':1},'well-formed':{'when':1},'attach':{'to':1},'attack':{'it':1},'fishes.':{'eventually':1,'there':1,'cambrian':1},'declines':{'to':1},'wrapped':{'up':4,'it':1},'perfectly':{'still':1,'aerated':1,'straightforward':1,'circular':1},'final':{'spectrum':1,'.':1,'dispersion':1,'stable':1,'answer':1,'clue':1,'unification.':1},'circulate':{'round':1},'hydrosphere':{'.':1},'2-1':{'2':1},'rays--the':{'alpha':1},'exactly':{'like':1,'where':1,'equal':1,'the':2,'balance':1,'similar':1},'well-finished':{'statuettes':1},'stress':{'on':1},'lists':{'of':1},'feint':{'towards':1},'chemicals':{'which':1},'manipulation':{'of':1,'another':1},'natural':{'process':1,'spectrum':1,'rate':1,'leafy':1,'knowable':1,'size':1,'death':7,'inheritance.':1,'inheritance':2,'question':1,'to':1,'reduction':1,'therefore':1,'size.':1,'conditions':2,'resources':1,'surroundings.':1,'death.':1,'law':1,'death--procession':1,'reflex':1,'history':22},'waist':{'of':1},'photograph':{'a':1,'from':2,'reproduced':1,'of':11,'showing':4,'below.':1,'tied':1,'an':1,'note':1,'255':1,'attaining':1,'are':1,'taken':4,'the':3,'.':1,'shows':3,'clearly':1,'is':2,'fig':1},'glow-worm':{'or':1},'well-established':{'jellyfish':1},'bed':{'of':1},'bee':{';':1,'or':1,'can':1,'.':1},'providing':{'large':1,'access':2,'it':1,'copies':1},'distinguished':{'from':2,'of':1,'astronomers':1,'physicists':1,'solar':1,'anthropologist':1,'man':1},'spurs':{'of':1},'exhibit':{'in':1,'pieces':1},'enforced':{'descent':1},'lightly':{'built':3},'unchanged':{'since':1},'abyssal':{'area':1},'yielding':{'and':1},'p.m':{'.':1},'nototrema':{'there':1},'need':{'and':2,'a':1,'for':3,'be':1,'is':1,'.':1,'not':6,'foundations':1,'hardly':4},'precursors':{'of':4},'screw':{'in':1},'student-citizen':{'otherwise':1},'pursued':{'by':1},'able':{'even':1,'to':36,'with':2,'artificially':1,'in':1},'darkened':{'nest':1},'celandine':{'with':1},'instance':{'a':1,'by':1,'iron':1,'that':3,'of':6,'is':2,'in':4,'when':1,'having':1,'will':1,'how':2,'which':2,'have':1,'were':1,'the':1,'.':1,'was':1,'occurs':1,'to':1,'must':1},'relatives':{'there':1,'some':1,'like':1,'illustrate':1},'rischgitz.':{'professor':1,'baron':1},'pursues':{'a':1,'it':1,'another':1},'blades':{'of':1},'lectures':{'and':1},'moths':{'in':1,'are':1,'that':1},'connected':{'to':2,'story':1,'with':4,'by':1},'last--that':{'is':1},'learnt':{'something':1},'intrinsic':{'racial':1},'gallery':{'there':1},'speed--and':{'must':1},'enregistrations':{'are':1},'radiating':{'away':1,'heat':1,'or':1},'ovum-producer':{'for':1},'upset':{'both':1},'prickle':{'or':1},'astonishing':{'fact':1,'rapidity':1},'prickly':{'fruits':1},'se':{'.':1},'wot':{'isn':1},'impression':{'147':1,'that':1,'of':7,'is':1,'when':1,'illustration':1,'which':1,'on':1,'left':1},'emerging':{';':1,'from':4},'sent':{'on':1,'an':1,'to':1,'through':1,'forth':1,'out':1},'multicellular':{'animals':7},'influences.':{'but':1},'well-being':{'throughout':1},'pigling':{'creeps':1},'graptolites':{'and':1},'slow.':{'illustration':1},'based':{'on':5,'upon':1},'sheriff':{'of':1},'millennia':{'of':1,'in':1},'brighten':{'almost':1},'bases':{'embedded':1},'bud':{'a':1,'by':1},'inherited':{'nature.':1,'from':1},'attained':{'dark':1,'to':3,'a':1,'by':1},'employed':{'and':1,'to':1,'the':1,'in':1},'mortality':{'and':1,'had':1,'hardly':1,'.':1},'seizing':{'and':2,'every':1,'killing':2},'120':{'large':1,'deep-sea':1,'the':1,'flinty':1},'121':{'the':1,'egg':1},'123':{'miles':1},'124':{'photo':1,'woolly':1},'125':{'of':1,'albatross':1,'000':1,'storm':1},'sifting--the':{'groaning':1},'128':{'the':1},'thomson':{'sir':2,'evolution':1,'end':1,'262':1,'this':1,'was':1,'professor':1,'j':1,'regius':1,'as':1,'release':1,'imagined':1,'experimental':1,'darwinism':1},'endless':{'nooks':1,'disturbances':1},'three-hundredth':{'of':1},'gutenberg:':{'1.e.1':1},'processes':{'on':1,'that':1,'of':6,'into':1,'.':1,'to':1,'are':2,'which':1,'such':1},'automatic.':{'upper':1},'gutenberg.org':{'license':1},'trucks':{'.':1},'imperious':{'for':1},'introductions':{'to':1,'like':2,'too--the':1},'she':{'flies':2,'often':1,'soon':1,'at':1,'picked':1,'reached':1,'would':1,'had':2,'handed':1,'does':2,'got':2,'has':1,'was':4,'secures':1,'gave':1,'then':1,'never':1,'very':1,'brushes':1,'flew':1,'wanted':1,'succeeded':1,'presented':1,'did':2,'ever':1,'applies':1},'contain':{'a':1,'wheat':1,'within':1,'electrons':1,'defects':1,'more':2},'amphibia':{'senses':1},'embryonic':{'gill-clefts':1,'food-canal':1,'reptiles':1},'spotted':{'and':1,'leopard':1,'.':1},'multiplying':{'usually':1,'the':2,'by':2,'but':1},'burying':{'them':1},'34.7':{'smaller':1},'cuts':{'both':1,'the':1,'off':2,'it':1},'canine':{'tooth':2,'teeth':1},'inkling':{'of':1,'that':1},'breathe':{'dry':5,'on':1,'depend':1,'oxygen':1},'photosphere--is':{'of':1},'legacy':{'of':4,';':1},'powder':{'to':1,'which':1},'frog-like':{'mouth':1},'humane':{'sentiments':1},'surmised':{'about':1},'unconscious':{'elimination':1,'co-operation':2},'apes--the':{'gorilla':2,'gibbon':1},'southward':{'migration':1},'tend':{'to':15,'toward':1},'state':{'of':23,'visit':1,'applicable':1,'.':3,'to':1,'as':1,'in':1,'growing':1,'such':1,'s':1,'law':1,'the':2},'mind.':{'and':1,'there':1,'other':1,'sec':1,'viii':1,'another':1,'in':1},'carapace':{'of':1,'is':1,'or':1},'allotted':{'to':1},'tens':{'of':2},'neither':{'atmosphere':1,'stores':1,'very':1,'agreement':1,'aspect':1,'in':1},'kidneys':{'are':1,'the':1,'at':2,'.':1},'generations.':{'this':1,'to':1},'comparable':{'on':1,'in':2,'to':4},'attention':{'saving':1,'they':1,'may':1,'of':2,'to':1,'at':1,'decide':1,';':1},'renamed.':{'creating':1},'constituted':{'of':2},'importance':{'and':1,'on':1,'though':1,'becomes':1,'is':1,'were':1,'when':1,'namely':1,'to':1,'as':1,'of':6,'too':1,'in':1,'was':1,'than':1},'hurrying':{'streams':1},'edge-on':{'to':1,'44':1,'notice':1,'of':1},'8.--the':{'sun':1},'efficiency':{'and':1,'of':1,'is':1,'.':1,'in':1},'key':{'to':2,'after':1,'from':1,'opening':1,'.':1},'group':{'and':1,'always':2,'of':6,'only.':1,'the':1,'or':1},'precious':{'and':1,'to':1,'animal':1,'contents':1},'distribution':{'and':1,'underwent':1,'of':6,'.':1,'must':1},'secchi':{'the':1},'hits':{'the':1},'sediments':{'were':1},'limits':{'of':7,'the':1,'in':1,'that':1},'mongol':{'australian':1},'minds':{'of':2,'the':1},'preyed':{'upon':2},'strains':{'of':1,'differing':1,'that':1},'admit':{'a':1,'of':3,'the':1,'that':1,'to':1},'manifestations':{'and':1,'of':1,'in':1},'joy.':{'finally':1},'plankton':{'and':1,'is':1,'as':1,'.':1},'estimation':{'.':1},'torn':{'off':1},'studying.':{'some':1},'886.0':{'29.46':1},'colonisation':{'of':1,'was':1},'habitual':{'surroundings':1,'intelligent':1},'penetrating':{'deeply':1,'consequences':1,'opaque':1},'kin-sympathy':{'and':1},'distinguish':{'the':1,'six':1,'several':1,'different':1},'preparedness':{'until':1},'together.':{'except':1},'sea-cucumber':{'119':1,'it':1},'sense.':{'bibliography':1},'tread':{'of':1},'gregarious.':{'the':1},'addition':{'to':5,'that':1,'it':1,'of':1},'disintegrate':{'much':1,'under':1},'own.':{'the':1,'contents':1,'illustration':1},'cent':{'of':1,'selection':1,'.':3},'immense':{'extent':1,'distance':1,'stretches':1,'darkness':1,'distances':1,'column':1,'void':1,'fossilized':1,'amount':1,'importance':1,'rate':1,'mass':1,'monotony':1,'sea':1,'outbursts':2,'velocity':1,'electrical':1,'accumulation':1,'upward':1},'slowly':{'and':1,'on':1,'about':1,'dying':1,'creeping':1,'into':1,'changed':1,'it':1,'back':1,'down':1,'dissolved':1,'dissolve':1,'changing':1,'worked':1,'.':1,'taking':1},'flinders':{'petrie':1},'dead.':{'illustration':1},'shoulders':{';':1},'senses':{'and':2,'do':1,'recognise':1,'of':4,'.':1,'besides':1,'to':1,'which':1,'in':1,'touch':1,'interpret':1},'diversity':{'and':1,'in':1},'digged':{'and':1},'releasing':{'electrons':1},'four-toed':{'horse':2},'176-177':{'side':1},'expenditure':{'possible.':1},'1769-1832':{'86':1,'one':1},'mail':{'.':1},'mammals--with':{'their':1},'novel':{'and':1,'situation':1,'restlessness.':1,'way':1},'unsegmented':{'worms':1},'domestication':{'illustrate':1},'asexual':{'reproduction':4},'air-tubes':{'blood-channels':1,'takes':1,'or':1},'16.--the':{'moon':1},'chalk':{'cliffs':1},'ten-millionth':{'of':1},'owns':{'a':2},'comets':{'and':2,'is':1,'or':1,'we':1,'.':1},'ago--a':{'few':1},'tide.':{'arctic':1},'inhabits':{'british':2},'surface':{'and':8,'among':1,'often':1,'is':4,'it':1,'an':1,'through':2,'are':1,'in':2,'trailing':1,'millions':1,'from':1,'.':19,'to':3,'does':1,'therefore':1,'which':2,';':2,'was':1,'waters':2,'resembles':1,'but':2,'water':1,'by':4,'must':2,'of':27,'receives':1,'were':1,'the':2,'or':1,'bodies':1,'view':2},'examined':{'to':1,'must':1,'.':1},'lambs':{'and':1,'.':1},'conical':{'projection':1,'teeth':1},'inference--or':{'reason':1},'capture':{'small':1,'and':1,'especially':1,'air.':1},'shooting':{'star':1,'outwards':1,'stars':1,'out':1},'zoophytes':{'corals':1,'and':1},'above.':{'illustration':1},'began':{'on':1,'their':2,'long':1,'.':2,'to':25,'as':1,'in':3,'the':3,'with':2},'views':{'and':1,'we':1,'with':1,'.':1},'parts':{'and':1,'about':1,'to':1,'of':13,'company':1,'was':1,'.':1,'sufficiently':1,'only':1,'take':1,'which':1,'in':2,'ebbs':1,';':1,'save':1,'fluctuate':1,'are':3},'ante-natal':{'life':4,'sleep':1,'period':1,'hood':1},'underground':{'world':2},'party':{'distributing':1},'chlamydosaurus':{'of':1},'tapped':{'supplies':1},'capelle':{'in':1},'experimented':{'on':1,'with':1},'formations.':{'illustration':2},'appearances':{'may':2},'effect':{'and':1,'on':3,'would':1,'may':1,'of':5,'when':1,'.':1,'owing':1,'which':3,'movement':1,'measured':1,'than':1,'before':1},'clouds--some':{'with':1},'compared':{'to':4,'with':8},'surroundings.':{'the':1},'colouring':{'this':1,'remains':1,'the':1,'was':1,'of':1},'prophesied':{'for':1},'fierce':{'and':2,'flood':1},'frequently':{'transfer':1,'spread':1,'recurrent':2,'doubled':1},'destruction':{'of':1,'the':1},'poultry':{'are':2},'scarcely':{'taken':1},'reflection':{'of':1,'.':1},'cliff-loving':{'bird':1},'i':{'am':1,'had':1,'.':4,'came':1,'have':1,'the':1,'was':1,'present':1},'obstacles':{'.':1},'well':{'and':4,'named':1,'says':1,'developed':6,'illustrated':1,'known':2,'as':8,'dried':1,'have':1,'in':2,'shown':1,'able':1,'.':2,'to':1,'be':2,'afford':1,'concealed':1,'suited':3,'alone':1,'advanced':1,'placed':1,'protected':1,'accustomed':1,'mixed':1,'adapted':3},'shell--there':{'is':1},'nebulous':{'matter':2},'rife':{';':1,'in':1},'mccabe':{'a':1,'joseph':1},'years--but':{'in':1},'deadly':{'trypanosome':1},'glowed':{'under':1},'neutralised':{'and':1},'45':{'photo':1},'enormously':{'great':1,'slow':1,'greater':1,'.':2,'high':1,'enlarged':1,'denser':1,'distended.':1,'elongated':3,'increased':1},'increasingly':{'a':1},'accurate':{'analytical':1,'to':1,'measurements':1,'student':1},'mistaken':{'.':1},'leisure-time':{'observations':1},'radium--the':{'discovery':1},'sources':{'of':2},'ermine':{'is':1,'has':1,'mainly':1},'mistakes':{'often':1,'like':1,'that':1},'distant':{'planet':1,'aquatic':1,'star':1,'planets':1,'from':2,'ages':1,'past':1,'shores':1,'blaze':2,'stars':2,'date':1,'world':1},'skill':{'and':1,'.':1,'as':1,'without':1,'they':1,'in':2,'the':1},'jackal':{'and':1},'recapitulated':{'by':1},'grappling':{'and':1,'tentacles':1},'1.f.1':{'.':1},'1.f.6':{'.':1},'ovum':{'and':1,'introducing':1,'from':1,'is':1,'or':1,'with':1,'divides':1},'1.f.4':{'.':1},'density':{'heat':1,'stretching':1,';':1},'deposits':{'of':1,'which':3,'would':1,'were':1},'lured':{'upwards':1},'extends':{'not':2,'from':1,'at':1},'maintaining':{'tax':1},'recapitulates':{'at':1},'size.':{'illustration':1},'warrant':{'for':2},'clouded':{'that':1},'fate':{'of':2,'with':1,'by':1},'disappearance':{'of':2,'as':1},'devised':{'by':1},'utah':{'.':1},'propelled':{'themselves':1},'fats':{'and':1},'262':{'electrons':1,'from':1},'historic':{'interest':1},'267':{'arrangements':1,'disintegration':1},'contingents':{'from':1},'burden':{'and':1},'propeller':{'.':1},'immediately':{'preceding':1,'has':1,'lying':1,'for':1,'.':1},'crusher':{'is':1},'prominent':{'eyebrow':2},'loss':{'of':6,'there':1,'in':1},'fleas':{'and':1},'necessary':{'mathematical':1,'for':1,'that':1,'may':1,'it':1,'.':2,'to':9,'in':1,'apprenticeship':1},'lost':{'and':1,'faunas':1,'is':1,'some':1,'three':2,'races':1,'so':1,'or':1},'sizes':{'of':5,'according':1,'which':1},'ctenophores':{';':1,'or':1},'exhausted':{'by':1,'are':1},'payments':{'and':1,'must':1,'should':1},'lose':{'all':1,'one-millionth':1},'page':{'34.':1,'.':2,'also':1,'are':1,'280':1,'the':1,'92':1,'at':2},'likes':{'to':1},'therein':{'lays':1},'shed':{'germ-cells':1,'in':1,'.':1},'glare':{'of':2,'out':1},'offshore.':{'conditions':1},'arrows':{'tycho':1},'belonged':{'.':1},'phenomena':{'and':1,'then':1,'may':1,'of':3,'studied':1,'near':1,'.':1,'as':1,'cannot':1,'including':1,'are':3,'in':2,'not':1,'mean':1},'library':{'very':1,'of':2,'.':3},'husk':{'.':1},'warmer':{'water':1},'home':{'for':4,'of':1,'university':3,'.':5,'in':5,'anger':1,'was':1,'or':1},'peter':{'perhaps':1,'could':1,'was':1,'which':1},'planetesimal':{'dust':1},'scales':{'and':1,'to':1,'of':1,'shows':1},'before.':{'illustration':1},'projection':{'of':2},'broad':{'flat':1,'massive':1,'way':1,'outlines':2,'fact':2,'saucers':1},'kettle':{'on':2,'over':1,'containing':1},'cabbages':{'such':1},'injects':{'the':1},'appreciative':{'awareness':1},'tadpole':{'becomes':1,'has':1,'with':1,'mouth':1},'fountain':{'of':4},'mutation':{'and':1,'is':1},'demonstrated':{';':1},'limitations':{'are':1,'.':1},'incandescence':{'and':1},'inaccurate':{'or':1},'butterfish':{'or':1},'reaching':{'a':1,'to':1,'the':1,'which':1,'project':1},'millions.':{'the':1},'expansion':{'of':3},'imperfectly':{'known':1,'finished':1,'warm-blooded':1},'instinct':{'and':3,'may':1,'is':2,'by':2,'to':1,'as':1,'cannot':1,'in':1,';':1,'with':1,'professor':1},'stows':{'this':1},'sways':{'from':1},'macpherson.':{'illustration':1},'embryos':{'of':4,'an':1,'that':1},'freedom':{'and':1,'of':3,'understanding':1,'in':1},'interlinked':{'system':1,'in':1},'discovered.':{'primitive':1,'illustration':1},'chance':{'on':1,'as':1,'.':1},'flesh-and-blood':{'natural':1},'dominion':{'astrophysical':1},'tongue':{'a':1,'on':1,'and':1,'of':2,'upon':1,'ending':1,'can':1,'which':2},'liberating':{'the':1,'egg-cells':1},'equally':{'spaced':1,'illumined':1,'well':1,'large':1,'stimulated':1,'important':1,'unwise':1,'by':1},'contending':{'theories':1},'cell-wall':{'of':1},'crossland':{'observed':1},'previously':{'unknown':1,'in':1},'primal':{'mud':1},'washington':{':':1},'due':{'to':28,'as':1},'scharff':{'r':1},'times.':{'there':1,'b-c.':1,'illustration':1,'one':1,'c-f.':1,'the':1},'additions':{'or':1},'properties--ready':{'to':1},'endeavours':{'which':1},'utility':{'the':1,'for':1},'doubtless':{'a':1,'this':1,'discover':1,'as':1,'in':1,'gets':1,'present':1},'mississippi':{'and':1},'additional':{'distance':1,'cost':1,'terms':2,'weight':1,'contact':1},'zoologist':{'in':1,'means':1},'museum':{'and':1,'natural':14,'of':3,'57':1,'after':2,'it':1},'phrases':{'as':1},'associates.':{'in':1},'noticed':{'that':4,'already':1,'in':1,'by':1,'.':1},'night--relieved':{'only':1},'daniell':{'alfred':1},'inner':{'upper':1,'life':3,'aspects':1,'stream':1,'one':1,'aspect':1,'ear':1,'or':1},'cell.':{'this':1},'reiteration':{'of':1},'crushing':{'seeds':1},'north':{'and':1,'europe':3,'from':1,'scandinavia':4,'e.g':1,'when':1,'pole':2,'pacific':1,'an':1,'to':1,'1500':1,'sea':2,'in':1,'227':1,'american':1,'america':4,'or':2},'gluten':{'albumin':1},'make-up':{'which':1},'triangular':{'piece':1},'fountains':{'of':1},'gait':{'is':1,'human':1,'but':1},'gain':{'of':1,'leisure':1,'an':1},'sprinkling':{'of':1},'highest':{'level':1,'of':2,'up':1,'reaches':1,'brilliancy':1,'octave':1,'authorities':1,'line':1,'animals--birds':1},'eat':{'it':1,'in':1},'he':{'replied':1,'discovered':1,'ceased':1,'differs':1,'had':7,'destroyed':1,'belongs':1,'constitutes':1,'has':16,'then':2,'means':1,'produced':1,'did':2,'revolutionised':1,'found':4,'went':1,'traces':1,'reduced':1,'says':3,'often':1,'declines':1,'estimated':1,'thinks':1,'puts':1,'learns':1,'wondered':1,'induces':1,'laid':1,'does':2,'got':3,'shows':1,'measures':1,'chose':1,'reacts':1,'maintains':1,'disappeared':1,'approaches':1,'interposed':1,'asks':1,'poured':1,'could':1,'became':1,'confronted':1,'asked':1,'first':2,'one':1,'likes':1,'cultivated':1,'considers':1,'passes':1,'would':2,'jerks':1,'much':1,'wrapped':1,'was':8,'knows':2,'took':3,'repeatedly':2,'worked':1,'must':1,'plants':1,'made':1,'showed':1,'believes':1,'will':1,'arranges':1,'can':5,'of':1,'plunges':1,'called':2,'and':1,'is':7,'walks':1,'thus':1,'buried':1,'allowed':1,'claimed':1,'tells':1,'said.':1,'drained':1,'began':1,'also':2,'speaks':1,'tapped':1,'concedes':1,'used':1,'may':1,'who':1,'drives':1,'accurately':1,'tries':1,'said':1,'likes--and':1,'so':1,'lays':1,'fitted':1,'once':1},'volplaning':{'of':1,'parachutists':1},'cells':{'and':2,'on':2,'kept':1,'boxed':1,'that':1,'of':4,'showing':1,'no':1,'together':1,'.':5,'marked':1,'but':1,'have':1,'which':2,';':2,'whereas':1,'are':3},'two-spined':{'sticklebacks':1},'exerts':{'a':1},'stories':{'of':1,'if':1},'pumped':{'although':1,'out':1},'eyes.':{'furthermore':1},'piece':{'of':29,'became':1},'display':{'perform':1,'of':3,'.':1,'in':1},'neanderthalensis':{'first':1},'cheek-bones':{'and':1},'universal':{'inevitableness':1,'commodity':1,'freedom':1,'acceptance':1,'or':1,'attraction':1,'carrier':1,'open':1,'ether':3},'penny':{'you':1,'in':3},'climax.':{'the':1},'lobes':{'ps':1,'l':1},'crystals':{'and':1,'of':1,'the':1,'or':1,'in':1},'education':{'and':1,'of':3,'included':1,'she':1},'draco':{'volans':2},'heat--forms':{'of':1},'forest.':{'there':1},'functions':{'of':1,'alike':1,'.':1},'apple-trees':{'of':1},'vibrations.':{'the':1},'offensive':{'persons':1},'vacuole':{'cv':1,'fv':1},'onwards':{'it':1,'.':1},'meteor':{'reached':1,'shattering':1},'chemist':{'use':1,'john':1,'was':1,'but':1},'disposing':{'of':1},'over':{'and':8,'all':3,'fifty':2,'diverse':1,'80':1,'functioning':1,'their':1,'again':5,'space':1,'two':4,'.':1,'to':4,'2':1,'8':1,'200':1,'life':1,'hundreds':1,'five':2,'a':6,'new':1,'100':1,'one':1,'11':1,'31':1,'30':1,'taut':1,'the':23,'800':1,'its':2},'star':{'and':2,'distances':1,'appeared':1,'had':3,'is':4,'corresponds':1,'cluster':1,'as':1,'registers':1,'at':2,'in':2,'sinks':1,'whose':1,'for':2,'perhaps':1,'seems':1,'due':1,'.':6,'to':2,'goes':1,'clusters':1,'which':1,'light-years':1,'means':1,'may':1,'but':1,'it':1,'revealed':1,'crosses':1,'clouds':1,'of':1,'against':1,'near':1,'following':1,'algol':1,'makes':1,'or':2},'scrutinising':{'these':1},'living':{'and':1,'flesh':1,'tissues':1,'mainly':1,'an':1,'at':2,'creatures--the':1,'images':1,'ape':1,'organisms':1,'things':2,'representatives':3,'.':2,'creatures':32,'creature':8,'body':1,'a':1,'we':1,'adaptations':1,'form':1,'fire':1,'in':5,'material':1,'hand':3,'burden':1,'to-day':1,'to-day.':1,'man':1,'plants':1,'on':4,'fossils':1,'for':1,'creatures.':1,'items':1,'microcosm':1,'anthropologists':1,'matter':9,'materials':1,'organism':1},'vega':{'34.7':1},'gradations':{'of':1,'from':1},'stag':{'and':1},'pathways':{'marked':1},'out.':{'if':1},'drainpipes':{'to':1},'dewey':{'that':1},'persistent':{'nevertheless':1,'patience':1,'experiment':1,'death-feigning':1,'grasp':1,'tendency':1},'eighties.':{'it':1},'inset':{'circle':1},'15-20':{'feet':1},'determination':{'to':1},'skimming':{'on':1},'indirectly':{'into':1,'from':1,'the':1,'hastened':1},'disruptive':{'chemical':1},'secondly':{'it':1},'saturating':{'outside':1},'psycho-analyst':{'must':1},'is--but':{'it':1},'mackerel':{'and':1},'better.':{'now':1},'dynamic':{'.':1,'systema':1},'unfurl':{'more':1},'straws':{'he':1,'were':1,'she':1,'.':2},'rampart':{'is':1},'shrinkages':{'which':1},'up.':{'the':1},'whose':{'distance':1,'luminescence':1,'skull':3,'origins':1,'point':1,'fine':1,'warm-bloodedness':1,'stinging':1,'atoms':1,'instrumental':1,'motions':1,'webbed':1,'movements':1,'type':1,'gravitational':1,'mental':1},'gamut':{'between':1},'calculate':{'how':1,'the':1,'your':1,'that':1},'swam':{'close':1,'instinctively':1},'auk':{'were':1},'berridge':{'f.z.s.':8},'bragg':{'247':1,'one':1,'says':1,'that':1},'miall':{'l':1},'presents':{'a':1,'the':1},'fine-grained':{'lithographic':1},'investigation':{'shows':1,'.':1},'vocabulary--he':{'has':1},'teaching':{'very':1},'bird--too':{'far':1},'descendant--the':{'modern':1},'updated':{'editions':1},'hind-limb':{'of':1},'counted.':{'but':1,'in':1},'void':{'the':1,'.':1},'cockchafers':{'are':1},'vase':{'which':1},'thinopus':{'the':1},'smack':{'of':2,'their':1},'asia.':{'man':1},'nourished':{'from':1},'govern':{'what':1},'radio-active':{'substance':1,'substances':3,'.':1,'matter':1,'elements':4,'or':1,'bodies':2},'affect':{'a':2,'our':1,'the':5,'your':1},'vast':{'and':1,'stores':2,'reservoir':1,'disturbances':1,'process':1,'energy':1,'as':1,'numbers':1,'crowd':1,'masses':1,'regions':1,'majority':1,'figures':1,'structures':1,'vegetation':1,'whirlpool':1,'medium':1,'that':2,'new':1,'population':1,'streams':1,'changes':1},'transformed.':{'before':1},'kataleptic':{'state':1},'baking':{'qualities':1},'naturalist':{'louis':1,'of':1},'crops':{'with':1},'conductor--six':{'times':1},'present.':{'the':1},'herbert':{'spencer':1},'indefinitely':{'.':1,'in':1},'danger-signal':{'sounds':1},'1859.':{'heritable':1},'greenish':{'plants':1,'warty':1,'phosphorescence':1},'employees':{'expend':1,'are':1},'breast-bone':{';':1,'has':1,'it':1,'.':1},'clothes':{'it':1},'favoured':{'the':1,'speculation':1},'carnivore':{'by':1},'force':{'and':2,'them':1,'proceed':1,'developed':1,'between':1,'due':1,'but':1,'equal':1,'at':1,'which':1,'of':3,'.':2},'senescence':{'but':1},'concise':{'view':1},'dome-like':{'and':1},'japanese':{'deep-sea':2,'variety':1},'current--the':{'dynamo--magnetism--ether':1},'intelligible.':{'sec':1},'hundredfold':{'in':1},'cactus':{'and':1},'even':{'thinner':1,'learning':1,'ten':2,'less':1,'it':1,'an':1,'as':1,'planetoids':1,'through':1,'at':5,'picked':1,'in':9,'before':1,'cut':1,'wholesome':1,'for':1,'make':1,'when':7,'gases':1,'by':1,'to':4,'then':1,'routine':1,'if':6,'more':6,'picture':1,'his':1,'greater':1,'though':1,'after':1,'suffused':1,'rise':1,'although':1,'suck':1,'with':2,'than':1,'conspicuous':1,'hints':1,'a':8,'on':1,'several':1,'liquid':1,'these':2,'of':4,'proud':1,'against':1,'this':1,'without':1,'vaster':1,'the':17,'calculates':1},'unborn':{'young.':1,'reptile':1,'child':1,'offspring':1,'.':1},'asia':{'and':2,'that':1,'is':1,'africa':1,'.':2,'in':1,'was':1,'minor':1},'liberated':{'and':2,'on':1,'from':3,'eggs':1,'when':1,'were':1},'haze':{'and':1},'rest.':{'illustration':1},'reverently':{'and':1},'dr.':{'schoetensack':1,'cyril':1,'romanes':1},'new':{'corner':1,'ebooks.':1,'knowledge':4,'forms':1,'surroundings':1,'physics--the':1,'world.':1,'associations':1,'views':1,'food':1,'revelations':1,'ones':1,'world':2,'devices.':1,'worlds':1,'corners':1,'freedom.':1,'parasite':1,'possibilities':1,'microscope':1,'habits':2,'view':5,'body':1,'domain':1,'methods':1,'habitat':1,'generation':2,'parasites':1,'individualities':1,'home':1,'ebooks':1,'psychology':1,'habits--experiments':1,'competitions':1,'method':1,'discovery':1,'rhodesian':1,'theory':1,'leg':1,'joy':1,'objects':1,'york':11,'linkage':1,'computers':1,'haunts':1,'kingdoms':1,'72-inch':1,'factor.':1,'kinds':1,'or':1,'departures':10,'one':2,'use':1,'nebulae':1,'area':1,'.':2,'territories':1,'card':1,'interest':1,'suit':1,'shell':1,'clue':1,'zealand.':1,'lives':2,'kind':1,'conception':3,'star.':1,'variations':2,'devices':2,'state--':1,'cards':1,'property':2,'and':2,'permutations':1,'discoveries.':1,'sense':1,'flora.':1,'rays':1,'variety':2,'views--the':1,'feature':1,'inquiry':1,'gateways':1,'doors':1,'development':1,'elements':1,'star':1,'opportunity':1,'zealand':2,'modes':1,'light':2,'departure':2,'element':1,'materials':1,'physics':1},'net':{'detaches':1,'result':1},'ever':{'because':1,'tap':1,'show':1,'within':1,'discover':1,'in':1,'seen':2,'matures':1,'imminent':1,'been':1,'.':2,'take':1,'be':1,'life':1,'lived':1,'devised':1,'thrown':1,'perceived':1,'made':1,'rescued':1,'resolving':1,'rose':1,'passing':1,'arising':1,'could':1,'comes':1,'realised':1},'evolving':{'and':1,'brain':1,'set':1,'system':1,'on':1},'muzzle':{'region':1},'seventh':{'printing':1},'never':{'even':1,'nearer':1,'absent':1,'like':1,'ceases':1,'less':1,'becomes':2,'getting':1,'see':1,'been':1,'germinates':1,'completely':1,'understand':1,'showed':1,'mixing':1,'learned':1,'more':1,'focussed':1,'at':1},'drew':{'this':1,'the':1},'anthropology':{'will':1,'home':1,'and':1,'.':1},'met':{'the':1,'with':2,'by':1,'in':2},'108':{'600':1},'active':{'development':1,'and':1,'life':1,'links':2,'for':1,'cuttles':1,'protozoa':1,'strenuous':1,'cooperative':1,'in':1,'deep-sea':1,'the':1,'swimmers':1,'nor':1},'100':{'tons.':1,'miles':1,'000':9,'after':1},'cardboard':{'and':1,'we':1,'were':1},'interpret':{'as':1,'except':1},'contraction':{'process':1,'of':1,'is':1,'and':1},'dry':{'land':27,'land--the':1,'season':1,'work':1,'air':10,'land.':2,'branch':1,'pasture':1,'ground':3,'was':1,'air--by':1,'after':1},'plates':{'hanging':1,'form':1,'exposed':1},'-reptile':{'embryo':1},'buckled':{'up':1},'rests':{'and':1,'on':2},'light.':{'we':1,'no':1,'all':1,'illustration':1,'it':1,'now':1},'credit':{'of':3,'the':3,'amphibians':1,'card':1,'man':1},'permit':{'of':1,'all':1},'california':{'is':1,'has':1,'.':1},'adopting':{'this':1},'suitable':{'site':1},'fell':{'on':1,'near':2},'eyebrows':{'of':1},'growth.':{'under':1},'mobility':{'very':1},'mail.':{'the':1},'war.':{'the':1,'illustration':1},'peahen':{'stag':1},'god-like':{'intellect':2},'protozoa.':{'the':1},'counts':{'we':1,'rarely':1,'for':1},'lung.':{'it':1},'circumvent':{'the':1},'tertiary':{'strata':1,'times.':1,'era':1},'head-on':{'fashion':1},'is--substitutes':{'for':1},'duck-billed':{'platypus':3},'wingless.':{'it':1},'invaders':{'of':1},'dog-toothed':{'cynodonts':1},'duesseldorf.':{'according':1},'stinging-cells':{'the':1},'overhead':{'at':1,'means':1},'calm':{'and':1,'of':1,'unbroken':1},'cassowary':{'201':1,'its':1},'water-spider':{'argyroneta':1,'the':1,'conquering':1},'right.':{'illustration':1},'type':{'is':1,'reaches':1,'say':1,'have':1,'in':2,'should':1,'relatively':1,'from':1,'for':1,'.':2,'intermediate':1,'rich':1,'has':2,'was':1,'we':1,'but':1,'marked':1,'known':1,'such':1,'with':1,'must':1,'off':1,'like':1,'of':9,'equal':1,'makes':1,'finds':1},'tell':{'all':1,'for':1,'us':6,'at':1,'the':4,'where':1},'gorilla.':{'activity':1},'peeping':{'above':1,'out':1},'lungs':{'a':2,'as':1,'where':1,'but':1,'.':1},'wary':{'trout':1},'oscar':{'riddle':1},'expose':{'the':1},'under':{'a':2,'stones':1,'different':1,'his':1,'her':2,'this':3,'surface':2,'side':1,'water':2,'parts':1,'stimulation--giving':1,'our':2,'the':15,'its':1},'dogma':{'of':1},'warm':{'countries':1,'moist':1,'volcanic':1,'shallows':1},'bipedal':{'dinosaur':1,'progression--always':1,'erect':1},'spawning-pond':{'from':1},'ward':{'f.e.s.':20,'.':1},'latent':{'indefinitely':1,'life':1,'state':1},'flora':{'and':1,';':1,'as':1,'which':1},'room':{'and':1,'we':1,'for':1,'in':1},'civilisations':{'and':1,'of':1},'suggestive':{'fact':2},'guise':{'of':1,'would':1},'root':{'and':2},'humerus':{'or':1},'allantois':{'is':1,'persist':1},'squirting':{'jets':1},'give':{'and':1,'just':1,'certain':1,'modern':1,'it':2,'an':1,'in':1,'out':1,'her':3,'six':1,'definite':1,'to':1,'way':1,'you':1,'more':1,'notice':1,'very':1,'rise':8,'them':1,'such':1,'a':4,'off':2,'prominence':1,'up':2,'us':3,'way.':1,'the':7,'utterance':1},'climax':{'and':1,'among':1,'of':3,'in':5},'involve':{'any':1},'fizzing':{'about':1},'down-stream.':{'1':1},'advancing':{'slope':1,'dog':1,'troop':1},'masterly':{'skill':1,'book':1},'halobatidae':{'wingless':1},'january':{'30':1,'21':1,'22':1,'6':1},'shell-shock':{'is':1},'coral-snakes':{'cobras':1},'faults':{'he':1},'amazing':{'particles':1,'quantities':1},'messrs':{'.':3},'answer':{'even':2,'and':1,'them':1,'forecloses':1,'that':1,'follows':1,'is':7,'back':2,'.':1,'to':4,'first':1,'opens':1,'must':2},'willing--has':{'come':1},'blanket':{'of':2},'minority':{'have':1,'give':1},'undergoing':{'disintegration':2,'disintegration--and':1,'radical':1},'reconciled':{'.':1},'abdomen':{'beneath':1},'food.':{'illustration':1},'long-continued':{'structure':1},'curiosity':{'and':1,'are':1,'its':1},'mud-minnows':{'did':1},'amoeboid':{'cells':4,'line':1},'overtaken':{'.':1},'still;':{'but':1},'descends':{'again':1},'think':{'to':1,'for':1,'that':12,'of':19,'less':1,'.':2,'also':1,'they':2,'clearly':1},'still.':{'and':1},'maintain':{'a':1,'the':1,'that':2},'frequent':{'meals.':1,'paddling':1,'changefulness':1,'occurrence':1,'exhibition':1},'1872':{'charles':1},'carbonic':{'acid':2},'inhabitant':{'of':1},'overtakes':{'it':1},'operations':{'on':1},'fife':{'started':1,'which':1,'in':1},'enter':{'suddenly':1,'our':1,'into':2,'the':2,'deeply':1},'sheltering':{'blanket':1,'is':1},'co-operating':{'with':2},'murray':{'sir':2,'called':1,'.':2},'helena':{'the':1},'hibernation':{'.':1},'down.':{'some':1,'however':1,'illustration':1},'budding':{'or':1,'.':2},'copyright':{'status':1,'royalties':1,'notice':1,'agreement':1,'research':1,'1922':1,'in':2,'holder':4,'or':1,'laws':2},'partisans':{'at':1},'famille':{'lieu':1},'before':{'the':13,'they':5,'it':4,'an':1,'birth.':1,'betraying':1,'our':3,'birds':1,'that.':1,'proceeding':1,'matter':1,'with':1,'there':7,'.':3,'anyone':1,'their':1,'reptiles':1,'you':2,'man':1,'was':1,'we':2,'downloading':1,'reaching':1,'mammals':1,'birth':3,'amphibians':1,'water':1,'heat':1,'them':1,'but':1,'hatching':2,'true':1,'him':1,'he':1,'anything':1,'i':1,'this':1,'she':1,'passing':2,'or':3},'10.5':{'regulus':1},'gyges':{'ring':1},'crew':{'of':1},'better':{'case':1,'by':1,'still;':1,'brains':2,'is':1,'than':1,'forms':1,'to':2,'brain':1,'insertion':2,'teeth':1,'method':1,'or':1,'heel':1},'differently':{'from':1},'persist':{'not':1,'there':1,'when':1},'weeks':{'old':2,'perhaps':1,'removing':1,'when':1,'of':1,'or':1},'overcome':{'the':3,'in':1},'donors':{'in':1},'23.--star':{'cluster':1},'disintegration--and':{'the':1},'swim-bladder':{'of':1,'into':1,'which':1},'combination':{'of':3,'which':1},'within.':{'but':1},'strangest':{'of':1},'caterpillar':{'and':1,'on':1,'.':1},'weaponless':{'animal':1},'indulge':{'for':1},'bluish':{'colour':1},'secured.':{'there':1},'bony':{'fish':3,'collar':1,'flat-fishes':1},'meat':{'and':1,'darted':1},'brightness':{'in':1},'indivisible.':{'the':1},'fogs':{'were':1},'arrested':{'defective':1,'.':1},'proofreading':{'team':2},'mounts':{'guard':3},'went':{'before':1,'on':4,'towards':2,'through':1,'out':1},'meal':{'.':1},'bone':{'and':1,'for':2,'of':1,'u':1,'which':1,'in':1,'the':1,'muscle':1},'mean':{'and':1,'distance':1,'great':1,'save':1,'that':7,'stagnation':1,'one':1,'1':1,'to':1,'so':1,'not':1,'the':1,'.':1,'by':3},'telescope.':{'illustration:':1,'but':1},'afforded':{'the':1,'much':1,'by':3},'problems.':{'sec':1},'successively':{'worked':1},'suspended':{'particles':2,'at':1,'for':1,'in':1},'conifer':{'and':1},'principles':{'employed':1,'of':2},'hive-bees':{'italians':1},'taught':{'to':2,'two':1,'us':1,'that':2},'wave-lengths':{'.':3,'that':1},'first-class':{'sensory':1,'cereal':1},'extract':{'from':1},'conspicuous.':{'at':1},'conjectures':{'which':1},'superposing':{'a':1},'restricted':{'to':2,'that':1,'.':1},'content':{'even':1,'to':2,'ourselves':1,'for':1},'sparkle':{'in':1},'cave-man':{'may':1},'is.':{'energy':1,'let':1},'reader':{'a':1,'who':1,'may':1,'imagines':1,'an':1,'will':1,'to':1},'surprise':{'none':1},'sluggish':{'fishes':1,'turtle':1,'the':1,'animals':1,'creatures':1},'langur':{'monkeys':1},'turning':{'upon':1,'off':1,'the':1,'every':1,'up':1},'meridian.':{'the':1},'hangers-on':{'and':1},'wave-length.':{'deep-red':1},'ascending':{'the':1},'skin.':{'but':1},'246':{'photo':2},'240':{'white':1},'243':{'the':1},'telescopes':{'begins':1,'and':1,'smaller':1,'for':1,'of':2,'.':1,'at':1},'shaggy':{'hair':1},'began.':{'archaeozoic':1,'ordovician':1},'starts':{'as':1,'.':1},'messages':{'from':1,'.':3},'thus':{'diverts':1,'set':1,'just':1,'produces':1,'certain':1,'some':1,'it':4,'separated':1,'as':2,'at':2,'sir':1,'from':2,'appear':1,'securing':2,'no':2,'began':1,'there':5,'uranium':2,'two':1,'been':1,'to':1,'helps':1,'molecules':1,'volvox':1,'we':12,'arises':1,'form':1,'again':1,'becomes':1,'formed':1,'possible':1,'completely':1,'although':1,'fishes':1,'flowers':1,'producing':2,'a':1,'animals':1,'driving':1,'this':1,'professor':2,'shunted':1,'ascertain':1,'the':12,'spiders':1},'isn':{'t':1},'survive--although':{'they':1},'arrived':{'at':3},'cave-lion':{'and':1,'cave-hyaena':1},'loud':{'noises':1},'user':{'provide':1,'to':1,'who':1},'untutored':{'bird':1},'features':{'and':1,'of':3,'there':1,'but':1,'so':1,'which':1,'such':1,';':1},'grade':{'bring':1},'unlit':{'lamp':1},'peculiarity':{'of':1},'disappearing':{'a':1},'enumerate':{'the':1},'radiate':{'away':1,'long':1,'out':1},'immensely':{'large':1,'larger':1,'greater':1,'faster':1},'ditch':{'or':1,'.':1},'hood':{'is':1,'spread':1,'called':1,'or':1},'monotonous':{'world':1,'green':1},'anyone':{'providing':1,'may':1,'.':1,'anywhere':2,'can':2,'in':1,'else':1},'pelagic':{'plants':1,'life':1,'bird':2,'haunt':1,'area':1},'84116':{'801':1},'shiver':{'.':1},'periwinkle':{'or':1},'witnessing':{'the':1},'dwell':{'too':1},'growth':{'and':1,'of':6},'fiery':{'tongues':1,'vapour.':1,'fate':1,'journey':1,'eruptions':1,'outbreak':1},'radiation':{'and':1,'from':2,'of':2,'.':1,'cannot':1,'in':1},'ages--the':{'procession':1},'feathers':{'of':2,'proving':1,'.':1,'are':2,'have':1,'91':1,'the':1,'or':1},'pre-material':{'world':1},'floor.':{'jasper':1},'digs':{'away':1},'glumes':{'or':1},'somewhat':{'like':2,'suddenly':1,'of':1,'as':1,'higher':1,'in':1,'simpler':1,'difficult':2},'feature.':{'some':1},'conger-eels':{'and':1},'brazil.':{'the':1},'peculiar':{'and':1,'people':2,'physiological':1,'characteristics':1,'interest':2,'bones':1,'cases':1,'circumstances':1},'begins':{'on':1,'his':1,'.':1,'to':2,'as':1,'at':1,'in':1},'distance':{'a':1,'and':3,'towards':1,'from':8,'that':1,'of':13,'is':2,'in':2,'thus':1,'period':1,'.':5,'varies':1,'between':1,'it':2,'plays':1,'the':3,'once':1,'was':1,'away':1,'more':1},'creatures.':{'we':1,'the':1,'illustration':2},'dredge':{'has':1},'structures':{'and':5,'reveal':1,'inherited':1,'are':1,'tend':1},'regularised':{'and':1},'sea-serpents':{'terrestrial':1},'preparation':{'for':2},'matter':{'and':16,'chlorophyll':1,'says':1,'exists':1,'is':14,'it':1,'four':1,'as':2,'itself':1,'exist':1,'are':7,'have':3,'in':7,'consists':2,'throughout':1,'ether':2,'254':1,'if':1,'cannot':1,'from':2,'there':2,'.':18,'contained':1,'therefore':1,'which':7,'flowing':1,';':1,'really':1,'was':3,'into':2,'passed':1,'energy':1,'that':4,'may':1,'than':1,'of':10,'however':2,'but':2,'quite':1,'were':2,'cutting':1,'moving':1,'here':1,'itself.':3,'not':1,'end':1,'along':3,'by':1,'a':1,'on':1,':':2,'this':1,'ever':1,'attracts':1,'required':1,'up':1,'agoing.':1,'or':2,'trillions':1,'so':1,'can':1,'contain':1,'through':1,'the':2,'out':1,'reduced':1},'messengers':{'regulate':1,'from':1,'are':1,'which':2,'more':1},'silly':{'ants':1},'shore-waters':{'to':1},'hailstones':{'on':1},'enables':{'the':2,'them':1,'us':3,'it':1},'extracting':{'the':1},'chrysalis':{'probably':1},'recommence':{'when':1},'membranes':{'the':1,'vocal':1},'modern':{'mathematical':1,'researches':1,'mammals':1,'brain...':1,'times.':1,'comparative':1,'times':2,'birds':2,'size':1,'horse':4,'representatives':1,'philosopher':1,'spectroscopist':1,'astronomers':1,'investigation':1,'physicists':1,'instruments':1,'flowering':1,'type':5,'divers':1,'tree-shrews':1,'civilisation--coal':1,'life':1,'theory':2,'brains':1,'line':1,'giant':1,'direct-reading':2,'physicist':1,'binoculars':1,'world':1,'estimate':1,'astronomy':6,'telescopes':1,'man':10,'advance':1,'observatory':1,'language':1,'species.':1,'science':8,'industry':1,'science.':1,'diffraction':1,'british':1,'theories':1,'bird':3,'man.':1,'dynamo':1,'representation':1,'history':1,'physics':1,'view':1},'mind':{'and':3,'among':1,'is':3,'at':1,'in':6,'seemed':1,'from':1,'for':1,'.':12,'which':1,'has':4,'we':4,'205':1,'that':3,'cannot':1,'let':1,'the':2,'a':1,':':1,'of':15,'craves':1,'can':1,'entirely':1,'out':1},'eyes':{'and':4,'the':1,'of':5,'could':1,'.':5,'to':1,'are':3,'become':1,'protrude':1,';':1,'themselves':1,'having':1},'rigorous':{'boundary':1},'seed':{'being':1,'was':1,'for':1},'nervures':{'on':1},'seen':{'among':1,'emerging':1,'sometimes':1,'gripping':1,'just':1,'is':2,'an':1,'as':1,'full':1,'through':1,'at':4,'another':1,'in':15,'shooting':1,'its':1,'even':1,'what':2,'from':1,'for':2,'to':5,'giving':1,'when':2,'.':5,'how':1,'enough':1,'under':1,'energy':1,'we':1,'towards':1,'that':5,'edge-on':2,'but':1,'quite':1,'boys':1,'every':1,'entangled':1,'by':2,'a':1,'on':5,'washing':1,'driving':1,'of':1,'later':1,'making':1,'the':3,'or':1,'are':1},'seem':{'strangely':1,'do':1,'we':1,'for':1,'always':1,'bound':1,'early':1,'to':18,'bad':1,'does':1,'in':1},'grind':{'a':1},'seek':{'to':1,'any':1,'out':1},'tells':{'and':1,'of':2,'its':1,'us':6},'starfish':{'is':1,'sea-lilies':1,'acorn-shell':1,'which':2,'with':1,'called':1,'asterias':2},'point.':{'and':1},'chest':{'and':1,'.':1},'chess':{'with':1},'blotched':{'by':1},'permian':{'light':1,'period':3,'ice':2,'.':1,'reptiles':1,'the':1,'was':1},'established':{'on':1,'all':1,'may':1,'is':1,'between':1,'an':1,'.':2,'in':3,'themselves':1,'one':1,'by':2,'fact':1},'changefulness':{'and':1,'of':2,'rather':1},'vermiform':{'appendix':2},'regular':{'flux':1,'relation':1,'orbit':1,'movement':1},'meaning':{'of':10,'the':2,'.':1,'an':1},'see.':{'as':1,'that':1},'promising.':{'illustration':1},'refractor':{'and':1,'is':3,'measures':1,'the':1,'48':1},'zealand':{'is':1,'which':1},'broadcast':{'in':1},'observation':{'and':1,'on':1,'by':1,'that':1,'.':1,'or':1},'consumed':{'and':1},'deliberate':{'introductions':1},'m':{'and':1,'.':1},'dog':{'scouring':1,'and':4,'shown':1,'turning':1,'that':2,'of':2,'professor':1,'or':2,'as':1,'carrying':1,'at':1,'a':1,'in':1,'van':1,'the':1,'has':3,';':1},'breathes':{'dry':1,'by':1},'definitely':{'formulated':1,'proved':1,'begun':1,'that':2,'free':1,'guiding':1,'the':1},'principle':{'we':1,'of':2,'is':1,'can':1,'which':2,'applies':1,';':1},'molluscs':{'and':1,'.':1,'are':1,'ascidians':1,'in':1},'dover':{'and':1},'planetary':{'system.':1,'families':2,'nucleus':1},'aquatic':{'ancestors':1,'animals':1,'insects':1,'surinam':1,'ancestry':2,'locomotion':2},'rayleigh':{'stated':1},'visitor':{'gave':1},'probe':{'for':1},'skin-wing':{'a':1},'ending':{'in':1},'brilliancy':{'.':1},'attempts':{'to':4,'made':1,'at':1,'have':1},'fungas':{'spots':1},'counteractive':{'measures':1},'creature--far':{'from':1},'ear.':{'illustration':2},'representing':{'nude':1,'one':1},'explain':{'what':1,'presently':1,'for':1,'this':3,'how':1,'the':6,'why':1},'folded':{'in':1},'sugar':{'fats':1,'.':1},'judged':{'as':1,'from':1,'by':1},'above':{'and':1,'distances':1,'all':1,'is':1,'seven':2,'our':1,'scale':1,'shrinkage':1,'six':1,'them':1,'illustration':2,'it':1,'diagram':1,'five':1,'with':1,'boiling-point':1,'sea-level':1,'a':1,'illustration.':1,'these':1,'pictorial':1,'them.':1,'the':12},'compounded':{'of':2,'so':1},'indicus':{'--are':1},'morsel':{'of':1},'chromosphere':{'great':1,'extends':1,'are':1,'.':1},'stop':{'and':1,'vii':1,'when':1,'but':1,'at':1,'the':2},'perceive':{'a':1,'their':1},'coast':{'of':1},'12':{'is':1,'000':2,'what':1},'energy--what':{'a':1,'heat':1},'21.--typical':{'spectra':1},'ignoble':{'creatures':1},'comply':{'with':5,'either':1},'bat':{'the':1,'flying':1,'s':1,'shares':1},'bar':{'of':1,'.':1},'17':{'origin':1,'1905':2},'room--pour':{'molecules':1},'fields':{'.':1},'bay':{'and':1,'of':1},'bag':{'of':1,'containing':1},'microscope':{'behaving':1,'these':1,'which':1},'discs':{'of':1,'that':1,'.':1},'troop':{'of':1,'masked':1},'18':{'photo':1,'solar':1},'fertility':{'and':1,'in':1},'upwards':{'and':3,'of':2,'from':1,'that':1},'ears':{'and':2,'of':2,'.':1},'ethical':{'face':1},'head-brains':{'the':1},'reference':{'to':1,'has':1,'in':1},'testing':{'probing':1,'all':2},'alterations':{'would':1,'in':1},'tag--but':{'larger':1},'zones':{'of':1,'each':1},'decided':{'to':1,'that':1},'interruptions':{'of':1},'subject':{'and':1,'we':1,'of':2,'is':2,'here':1,'to':4,'as':1,'deeply':1},'pebbles':{'gripped':1,'.':1},'voyage':{'found':1,'darwin':1},'said':{'and':1,'is':1,'some':1,'in':1,'what':2,'for':2,'there':2,'long':1,'.':1,'to':9,'enough':1,':':1,'that':19,'but':1,'a':1,'about':1,'like':1,'of':2,'later':1,'so':1,'the':4,'consisted':1},'scrap':{'from':1},'sail':{'or':1,'in':1},'artificial':{'floor':1,'light':2,'fogs':1,'light.':1,'surroundings':1,'item':1,'transmutation':1},'pets':{'of':1},'simplest':{'forms':2,'animals':1,'form':2,'of':2,'possible':1,'multicellular':1,'bacteria':1,'creatures':1},'unsolved.':{'the':1},'sorts':{'and':1,'of':4,'occupations':1,'out':2},'polygamous':{'.':1},'lethargic':{'state':1},'profitable':{'to':3,'movements':1,'habit':2,'one':1},'cleverer':{'mammals':1,'animals':1,'than':1},'venture':{'out':1},'mountain-top-like':{'cusps':1},'physicist':{'and':1,'set':1,'brings':1,'.':1,'to':1,'has':1},'harvard':{'college':4},'386':{'times':1},'cousin':{'to':1},'motto':{'in':1},'suggested':{'genealogical':2,'this':1,'that':6,'however':1,'.':1,'to':1,'at':1,'another':1,'in':2,'by':2},'air--a':{'globule':1},'sperm-producer':{'and':2},'canines':{'and':1},'against':{'a':5,'downward-projecting':1,'branches':1,'her':1,'instability':1,'these':1,'certain':1,'it':1,'evaporation':1,'their':1,'intensities':1,'of':1,'accepting':1,'the':17,'one':2},'feathering':{'of':1},'puffin':{'s':2},'1.--diagrams':{'of':1},'distinction':{'of':1,'has':1,'so':1},'confronted':{'his':1},'simplified.':{'we':1},'fore-leg':{'of':1,'has':1},'appeared':{'suddenly':1,'upon':1,'related':1,'.':2,'to':1,'in':1,'inconceivable':1,'or':1},'repertory':{'of':5},'buries':{'itself':1},'incessant':{'colliding':1,'movement':2},'inquisitive':{'insects':1,'adults':1,'interest':1},'purling':{'brook':1},'lick':{'observatory.':4},'initiative':{';':1,'so':1},'lowly':{'forms':1,'origin.':2},'ether':{'and':11,'because':1,'exists':1,'disturbances':1,'is':2,'surrounding':1,'as':1,'are':1,'carry':1,'if':1,'permeates':1,'what':1,'disturbance':4,'.':8,'2':1,'which':1,'flowing':1,';':3,'has':2,'was':2,'then':1,'may':1,'but':2,'waves':2,'he':1,'by':2,'must':1,'of':2,'carries':1,'light':1,'or':1},'now.':{'the':1},'recognises':{'the':1},'puts':{'a':1,'the':1,'his':1,'forth':1,'it':2},'basis':{'of':5,'for':5,'but':1},'ramifying':{'system':1},'three':{'and':3,'cautions':1,'letters':1,'reasons':1,'arms':2,'feet':2,'in':2,'females':1,'species':1,'centuries':1,'different':1,'or':3,'dimensions':3,'distinct':2,'fingers':1,'to':3,'wonderful':1,'weeks':3,'hundred':3,'conditions':1,'lowest':1,'aspects':1,'complete':1,'inches':2,'thousand':3,'great':4,'atoms':1,'hours':1,'semicircular':1,'pairs':1,'months':2,'times':5,'chief':1,'miles':1,'fundamental':1,'quarter':1,'other':1},'erect':{'posture':1,'after':1,'lines':1,'attitude':2,'the':1,'he':1,'consisted':1},'milieu':{'.':1},'chrysanthemum':{'of':1},'trigger':{'of':4,'is':1,'which':1,'.':1},'interest':{'and':2,':':1,'for':3,'that':2,'of':2,'is':1,'us':1,'.':4,'to':3,'are':1,'in':5,'increasing':1,'was':1,'or':1},'entered':{'our':1,'into':2,'upon':1,'so':1,'on':1},'chaffinch':{'disguise':1},'threw':{'in':1},'light-year':{'is':1},'deeper':{'down':1,'and':1,'waters':1,'hollows':1},'quantities':{'not':1,'of':2,'pour':1,'destined':1},'sunshine':{'then':1,'of':1},'cold--an':{'eternal':1},'meadow-grass':{'before':1},'locations':{'where':1,'.':1},'168':{'profile':1},'164':{'suggested':1,'the':1},'165':{'the':1},'166':{'photo':2},'167':{'photo':1},'160':{'professor':1,'000':1,'tons':1},'161':{'photo':1,'after':1},'encyclopaedia':{'giving':1},'ether.':{'waves':1},'exception':{'and':1,'of':1},'were--the':{'working':1},'tank':{'of':1},'winding':{'in':1},'originate':{'and':1,'is':1},'spontaneously':{'and':1,'become':1,'or':1,'liberated':1,'becomes':1},'horse-power':{'in':1},'near':{'them':1,'that':2,'scarborough':2,'duesseldorf.':1,'victoria':1,'relative':1,'its':1,'shore':1,'at':2,'enough':2,'the':18,'with':1,'heidelberg':3,'as':2},'neat':{'way':1},'aeroplane':{'s':1,'in':1},'balance':{'of':1,';':1,'used':1,'between':1,'.':2},'study':{'and':1,'rabbits':1,'in':1,'of':12,'under':1,'mammals':1,'.':1,'which':1,'leading':1},'twenty-four':{'hours':2},'spawn':{'and':1,'only':1,'in':4,'.':3},'longer.':{'illustrations':1},'seven':{'hours':2,'different':1,'rays':1,'neck':1,'inches':1,'months':1,'two':1,'colours':5,'other':1,'planets':1,'stages':2},'thought.':{'sec':1,'yet':1},'mexico':{'to':1,'by':1},'diaphragm':{'came':1},'is':{'all':4,'evidence':5,'believed':3,'caused':2,'comparatively':2,'four':1,'remarkably':1,'abundant':2,'looking':1,'certainly':5,'inverse':1,'electricity':2,'concerned':2,'young':2,'to':52,'thinnest':1,'preserved':1,'inconspicuous':1,'worth':2,'tethered':1,'worse':1,'outside':1,'very':48,'indubitable':1,'radio-active':1,'vastly':1,'continued':1,'illustrated':1,'asexual':1,'probably':7,'woven':1,'familiarly':1,'smaller':1,'insignificant':1,'overlying--the':1,'past':1,'likely':1,'utter':1,'estimated':1,'situated':2,'shining':1,'even':2,'established':1,'what':7,'necessary.':1,'comparable':1,'beaten':1,'contributed':1,'expressed':1,'liberated':1,'above':1,'shared':2,'falling':1,'ever':1,'melancholy':1,'never':5,'leaping':1,'desired':1,'learnedly':1,'represented':5,'obtained':1,'great':5,'commonly':1,'descended':1,'usually':3,'conveniently':1,'composed':6,'love':1,'suddenly':1,'merely':1,'explained':2,'apt':3,'highly':10,'brought':4,'rarely':2,'from':4,'would':1,'superficially':1,'two':1,'doubt':1,'therefore':1,'taken':1,'unthinkable':1,'lessened':2,'more':23,'rich':1,'started':1,'pursuing':1,'one-sided':1,'suffused':1,'varying':1,'known':11,'given':4,'carried':2,'locked':1,'room':1,'this':6,'moulted':1,'itself':1,'obvious':1,'can':1,'growing':1,'making':2,'stimulating':1,'proof':2,'nearest':2,'bent':1,'pushed':2,'something':2,'wonderful':2,'struck.':1,'huge':1,'rather':4,'divided':1,'breaking':1,'fortunate':1,'1':1,'located':2,'instead':1,'left--to':1,'maternal':1,'intended':1,'inconceivably':1,'derived':2,'movable':1,'disgusted':1,'eighty-eight':1,'coming':1,'such':4,'horizontal':1,'inconceivable':1,'revealed':1,'a':196,'short':1,'natural':3,'effective':1,'yielding':1,'fortunately':1,'so':21,'pulled':4,'secured':1,'justifiable':2,'unpalatable':1,'indeed':1,'mainly':3,'discharging':1,'produced':3,'held':1,'through':3,'committed':1,'still':9,'its':5,'admirably':1,'superior':1,'26':1,'how':2,'susceptible':1,'interesting':14,'actually':1,'better':2,'covered':1,'travelling':2,'admirable':1,'easier':3,'then':4,'popularly':1,'affected':1,'greater':2,'thereby':1,'food':1,'safe':4,'wise':1,'not':79,'now':18,'always':7,'reasonably':1,'tenanted':1,'arrested':1,'establishing':1,'transmitted':1,'reasonable':1,'radial':1,'found':6,'entirely':4,'physiologically':1,'afforded':3,'doing':1,'there':10,'crushing':1,'related':2,'our':3,'beyond':5,'thick':2,'really':4,'living':1,'shown':5,'surrounded':3,'content':1,'contained':1,'denoted':1,'revolving':1,'twenty-five':1,'borne':2,'disputed':2,'built.':1,'incalculable':1,'quite':10,'reason':3,'surely':2,'struggle':2,'intensely':1,'thrown':1,'enormous':1,'organic':1,'keen':2,'disturbed':2,'moving':5,'assuredly':1,'most...':1,'first':1,'complete.':1,'constantly':4,'blown':1,'synonymous':1,'reflected':6,'one':23,'well-known':1,'done':1,'sunlight':1,'another':13,'impossible':8,'immensely':1,'discharged':1,'bitten':1,'little':3,'necessarily':2,'needed':1,'unknown':2,'their':2,'2':1,'too':3,'passed':1,'molecular':1,'vigorous':1,'that':76,'relieved':2,'continuous':2,'wisdom':1,'wasted':2,'prodigious':1,'undoubtedly':2,'flightless':1,'16':1,'divisible':1,'double':1,'enabled':2,'slowed':1,'866':1,'matter':2,'supposed':5,'historical':1,'accessed':1,'and':2,'unrestricted.':1,'gathering':2,'lightly':1,'turned':2,'vitally':1,'unlikely':2,'cleaned':1,'imperfect':2,'obviously':3,'apparently':1,'any':3,'relatively':1,'forced':1,'built':2,'efficient':1,'thoroughly':1,'able':5,'snow':1,'also':18,'trying--the':1,'absorbed':2,'embryological':1,'sure':1,'diminishing':1,'-273':1,'most':5,'connected':1,'printed':1,'nothing':7,'alpha':1,'measured':1,'conspicuous':2,'considered':1,'calculated':1,'sometimes':8,'repeated':1,'dissolved':1,'accounted':1,'normally':1,'lying':1,'precise':1,'particularly':2,'supported':1,'scattered':1,'discovered':2,'scarce':2,'enormously':2,'nearer':1,'founded.':1,'shuffling':1,'with':2,'excessively':1,'enough':6,'unhappy':1,'only':19,'going':7,'touched':1,'molecules':1,'regrowing':2,'adequate':1,'evinced':1,'meant':5,'compounded':2,'exceptional':1,'dependent':1,'familiar':2,'famous':3,'unimportant':1,'123':1,'nearly':1,'closely':5,'drawn':2,'instinctive':2,'dr':1,'justified':1,'beset':1,'evolution':2,'instructive':2,'influenced':1,'common':2,'rung':1,'characteristic':3,'fixed':2,'steam':1,'strengthened':1,'swept':1,'physically':1,'condensed':1,'observed':1,'are':1,'enhanced':1,'tender':1,'close':1,'luminous':1,'forthcoming':1,'best':1,'subject':2,'said':5,'probable':4,'distinctive':1,'missing':1,'continually':1,'written':1,'between':2,'conceptual':2,'progress':2,'neither':1,'available':1,'we':1,'reproduced':1,'nature':2,'tending':1,'however':5,'efficiency':1,'386':1,'suggested':4,'both':1,'essentially':2,'reported':2,'freely':1,'ill':1,'thickly':1,'against':1,'called':21,'sensitive':1,'passing':1,'among':2,'volcanic':1,'simple':1,'acted':1,'maintained':1,'simply':4,'learning':3,'associated':2,'pouring':1,'described':1,'capable':1,'scented':1,'due':5,'.':3,'recognised':1,'hardly':6,'resting':1,'life':2,'partly':5,'sufficient':5,'formed':2,'an':40,'diverted':1,'applied':3,'these':3,'plain':6,'eclipsed':1,'intimately':1,'reflex':1,'64-6221541':1,'flooding':1,'taking':1,'owed':1,'almost':8,'endowed':1,'thus':4,'it':7,'according':1,'helped':1,'good':2,'clinging':1,'in':33,'ready':1,'if':2,'tumbled':1,'perhaps':3,'occupied':1,'limited--there':1,'clearly':1,'solidary':1,'capped':1,'split':2,'finite':1,'difficult':6,'independent':1,'used':7,'wisest':1,'running':2,'arrived':1,'climbing':1,'circumvented':1,'centred':1,'lower':2,'largely':2,'paralysed':1,'humanly':1,'well':10,'magnified':1,'rife':1,'without':1,'the':158,'left':3,'departed':1,'just':5,'less':4,'being':3,'profoundly':1,'disguise':1,'stored':1,'atomic':1,'rocked':1,'behind':1,'useful':1,'renewed':1,'corroborated':1,'possible.':1,'passive':1,'spread':1,'transformed':1,'easy':2,'born':1,'struck':1,'increased':1,'loss':1,'showing':1,'decomposed':1,'possible':15,'marked':2,'advanced':1,'acute':1,'sorting':1,'necessary':7,'like':11,'lost':2,'shaped':1,'cooler':1,'admittedly':1,'62':1,'lapsed':1,'fully':1,'soft':1,'essential':1,'towards':2,'right':1,'often':22,'some':4,'somehow':1,'urgent':1,'added':2,'jupiter':1,'52':1,'perfected':1,'irresistible':1,'provided':1,'gradually':3,'condensed--who':1,'for':4,'unlocked':1,'recorded':1,'critical':1,'masked':2,'conquering':1,'good.':1,'freed':1,'indestructible':2,'peculiarly':2,'continuing':1,'broken':4,'worthy':1,'by':3,'on':6,'about':8,'mingled':3,'anything':1,'getting':1,'of':16,'mutually':1,'steadily':2,'introduced':1,'consequently':1,'swimming':1,'diversely':1,'equally':1,'within':1,'bound':1,'because':2,'lively':1,'primarily':1,'einstein':1,'nowadays':1,'doubtless':2,'seen':18,'indispensable':1,'flying':1,'long':1,'much':12,'infected':1,'low':1,':':4,'considerably':1,'complete':1,'secreted':1,'abundantly':1,'constituted':1,'heat':1,'true':20,'considerable':3,'posted':3,'absent':1,'made':10,'arranged':1,'evident':1,'obscure.':2,'whether':2,'dangerous':1,'placed':3,'converted':1,'emotional':1,'clear':7,'hotter':2,'certain':9,'slowing':1,'general':1,'transfused':2,'as':9,'at':11,'effected':2,'again':1,'raised':1,'inborn':2,'no':60,'unaccustomed':1,'out':1,'poor':1,'white-hot':1,'convincing':1,'ultimately':1,'generated':1,'important':2,'suited':3,'included':1,'aware':1,'promising.':1,'to-day':1,'happening':1,'practically':6,'cohesion':1,'ascertained':1,'implied':1,'time':1,'far':5},'it':{'holds':1,'illustrates':2,'scooped':1,'over':1,'fall':1,'splitting':1,'leads':1,'boils':1,'through':2,'looks':8,'cuts':1,'consists':2,'facilitates':1,'agrees':1,'causes':1,'crashing':1,'sprang':1,'sinks':1,'burns':1,'betokens':1,'furnished':1,'seems':23,'should':3,'forms':4,'to':18,'only':2,'spread':1,'firmly':1,'positively':1,'easy':1,'under':2,'8':1,'hammers':2,'has':82,'might':6,'sent':1,'gave':1,'meant':3,'then':1,'his':1,'wished':1,'goes':3,'listeth':1,'means':7,'contracts':2,'breaks':1,'continues':1,'stop':1,'possible':8,'flew':1,'engulfs':2,'matters':1,'cannot':5,'they':1,'altogether':2,'not':2,'meets.':1,'now':3,'neither':1,'discovered':1,'necessary':1,'went':2,'lies':1,'did':3,'always':2,'fixes':1,'serves':1,'loses':2,'herald':1,'off':1,'expels':1,'turns':1,'found':2,'feeds':2,'works':1,'mean':1,'reveals':1,'often':5,'exists':1,'sends':1,'folds':1,'acquires':1,'back':1,'alive':1,'differs':1,'used':1,'swims':3,'are':1,'picked':1,'reached':2,'collects':1,'out':1,'ascends.':1,'what':1,'probable':1,'for':4,'profit':1,'away':2,'revolves':1,'stops':1,'climbs':1,'misses':1,'does':14,'provides':2,'without':2,'got':1,';':1,'seemed':1,'ever':1,'occurs':4,'shows':2,'be':5,'we':1,'give':2,'led':2,'chose':1,'passes':3,'pours':1,'jumps':1,'works--the':1,'disintegrates':1,'works.':1,'surely':1,'put':1,'refers':1,'emits':1,'change':1,'takes':6,'on':6,'dates':1,'hunts':1,'consisted':1,'limits':1,'rests':1,'could':2,'settles':2,'approaches':1,'against':2,'must':20,'suggests':1,'became':5,'greatly':1,'usually':1,'leaps':1,'makes':2,'finds':1,'comes':4,'being':1,'own':1,'afterwards':1,'weighs':1,'had':17,'into':6,'were.':1,'corresponds':1,'reaches':1,'one':1,'running':1,'skips':1,'casts':1,'likes.':1,'impossible':3,'.':31,'doubtless':1,'utters':1,'rises':3,'from':3,'collides':1,'would':23,'remains':4,'expands':1,'there':1,'chooses':1,'vibrate':1,'by':2,'fully':1,'belongs':1,'appears':3,'recognised':1,'furnishes':2,'tells':1,'grew':1,'hardly':1,'until':1,'perishes':1,'slips':1,'that':3,'becomes':2,'contains':3,'convinces':1,'took':1,'strikes':1,'gently':1,'implied':1,'lives':3,'stiffens':1,'probably':1,'with':2,'than':1,'present':1,'he':1,'begins':1,'save':1,'were':18,'builds':1,'looks.':1,'was':98,'originate':1,'bids':1,'up':3,'promotes':1,'will':20,'exerts':1,'can':19,'applies':1,'about':1,'happened':1,'leaves':1,'breeds':1,'and':12,'buries':1,'changed':1,'go':1,'jettisons':1,'escapes':2,'almost':1,'is':473,'occupies':2,'thus':1,'naturally':1,'or':1,'an':1,'as':7,'at':1,'in':13,'need':4,'follows':4,'made':1,'proceeds':1,'if':1,'gives':2,'again':4,'needs':1,'shuts':1,'thereby':1,'amounts':1,'began':4,'acts':1,'when':3,'aside':1,'intelligently':1,'also':1,'parts':1,'which':1,'brings':1,'you':1,'gets':2,'pecked':1,'pursues':1,'practicable':1,'effected':1,'looked.':1,'wrongly':1,'radiates':1,'may':59,'fails':1,'occurred':1,'develops':1,'grows':2,'uses':1,'thrills':1,'contain':1,'concentrating':1,'died':1,'glow':1,'a':2,'implies':1,'advantageous':1,'records':1,'behaves':1,'clear':2,'sometimes':4,'flow':1,'breathes':1,'obviously':1,'more':1,'points':1,'so':2,'fitted':1,'harks':1,'the':4,'once':2,'requires':1,'possesses':1,'came':2,'repeatedly':1},'iv':{'the':1,'.':3},'ii':{'the':1,'.':3},'clinging':{'to':1},'in':{'limited':2,'all':20,'evidence':1,'skeleton':1,'particular':2,'four':2,'sleep':1,'canes':1,'hunting':1,'reptiles':1,'those':3,'masculine':1,'very':4,'indubitable':1,'duck-ponds':1,'every':5,'asia.':1,'hibernating':1,'monkeys':3,'minute':1,'archaeopteryx':1,'apprehension':1,'succession':2,'relation':1,'sedentary':1,'pterodactyl':1,'revolution':1,'ten':4,'dealing':2,'rivers':2,'cost':1,'nests':1,'what':2,'constitution':1,'nature.':2,'favour':1,'asia':2,'uniform':1,'new':3,'nails':1,'contrast':1,'movement':2,'body':1,'degree':2,'ninety-nine':1,'atoms':1,'water':2,'others':1,'directions':1,'fifteen':2,'great':7,'bygone':1,'northern':2,'healthy':1,'compliance':2,'miniature':1,'amount':2,'action':2,'locomotion':2,'mistake':2,'amphibians;':1,'diameter':14,'egypt':1,'africa':3,'gristly':2,'1907':2,'1900':2,'1901':1,'attendance':2,'from':2,'two':3,'cretaceous':1,'france':3,'comparing':1,'doubt':1,'black':1,'fossiliferous':1,'more':2,'horses':1,'pencil':1,'bodily':1,'glass':1,'warm':2,'virtue':3,'varying':1,'andalusia':1,'keeping':1,'animals':3,'this':48,'facilitating':1,'paragraph':6,'nine':1,'stature':2,'following':1,'making':4,'nurture':1,'control':1,'figure':1,'process':5,'persuading':1,'india':1,'pieces':1,'autumn':1,'orion':2,'times':2,'spite':6,'winter':5,'destroying':1,'six':1,'machine':1,'buns':1,'vital':1,'animal':2,'elephant':1,'ordinary':1,'civilisation':1,'edinburgh':1,'southern':1,'orbits':1,'unawares':1,'mankind':4,'waves':1,'1887':1,'such':8,'response':1,'trinil':1,'man':19,'a':188,'short':3,'natural':2,'outline':1,'so':1,'order':7,'typical':1,'imagining':1,'reproduced':1,'breaking':1,'september':1,'hand.':2,'years':1,'radio-active':3,'pascal':1,'existence':1,'cold':1,'its':36,'apes':1,'interesting':1,'amazing':1,'writing':3,'forms':1,'fig':1,'travelling':1,'admirable':1,'them':3,'good':1,'greater':2,'similar':1,'practice':1,'underneath':1,'overpowering':1,'not':1,'courtship':1,'sea-urchins':1,'respiration.':1,'all.':1,'truth':1,'each':3,'pools':2,'liberating':1,'doing':1,'year':1,'our':16,'operation':1,'1898.':1,'special':1,'canada':1,'living':2,'space':4,'safety':2,'kent':3,'millions':1,'turning':1,'monkeys--activity':1,'others--which':1,'little':1,'reason':1,'fastening':1,'organic':4,'e.g':1,'determining':1,'cosmic':1,'british':1,'behaviour.':1,'motion':1,'turn':4,'length':7,'place':1,'consequence':2,'locating':1,'south':1,'flying':1,'faculty':1,'number':6,'one':14,'dominating':1,'another':11,'precisely':1,'quality':1,'sockets':1,'size':11,'horse':1,'obedience':1,'their':35,'sumatra':1,'intermediate':1,'fiery':1,'reign.':1,'white':1,'store':1,'exploring':1,'that':5,'relieved':1,'kangaroo-like':1,'1918':1,'part':6,'western':1,'conger-eels':1,'1912':2,'1917':1,'kind':3,'accordance':3,'isolation':1,'matter':1,'supposed':1,'gigantic':2,'photosynthesis':1,'and':7,'modern':8,'mind':5,'locations':1,'interruptions':1,'any':19,'domestication':1,'relatively':2,'strength':1,'studying':1,'suddenness':1,'scotland':3,'isolated':1,'moist':1,'perigord':1,'internal':1,'which':43,'forming':2,'green':1,'circles':3,'inky':1,'play':1,'permian':1,'opposite':2,'scotland.':1,'most':15,'nothing':1,'difficulties.':1,'whalebone':1,'professor':1,'perceiving':1,'section':2,'fact':5,'quantity':1,'saying':2,'walking':1,'insects':2,'brief':1,'multicellular':1,'manchester':1,'prodigious':1,'changeful':1,'subtle':1,'thickness':3,'fine':1,'gilded':1,'knowledge':1,'stormy':1,'situations':1,'proportion':2,'considerable':1,'surroundings':1,'flood.':1,'darwin':1,'abeyance.':1,'photographs':1,'his':23,'exceptional':2,'expectation':2,'trees':2,'nearly':1,'words':1,'conjunction':1,'areas':1,'evolution':12,'luminosity':1,'violent':2,'flight.':1,'insectivorous':1,'miles':1,'croatia':1,'common':1,'activity':1,'view':1,'unison':1,'multiplying':1,'reference':1,'habit':1,'electrons--and':1,'intelligence':3,'radium':1,'silurian':1,'relative':1,'1921':5,'migration':1,'andromeda':2,'creating':1,'combustion':1,'ways':1,'opening':1,'birds--intelligence':1,'birds':14,'3':1,'various':4,'crookes':1,'europe':5,'we':1,'terms':4,'august':1,'parental':1,'ignorance':1,'queensland':1,'coma':2,'cities':1,'both':6,'many':26,'connection':8,'whole':1,'experimental':2,'point':1,'simple':1,'sweet':1,'vain':1,'ants':3,'height':1,'concluding':1,'adaptation':3,'scottish':1,'majestic':1,'extinct':1,'ether':5,'adults':1,'considering':2,'late':1,'unusual':1,'java':3,'addition':6,'damp':1,'three':6,'.':1,'tropical':2,'interest':2,'bewildering':1,'empty':1,'life':4,'sufficient':1,'search':1,'amphibians':1,'1864':1,'1869':1,'1868':1,'general':2,'captivity':2,'respiration':1,'plants':1,'sixes':1,'prehistoric':1,'these':10,'britain':4,'air':1,'lesser':1,'formats':1,'wild':3,'picturing':1,'girth':1,'albatros':1,'almost':1,'is':1,'it':7,'bipedal':1,'itself':2,'1895':2,'different':4,'locomotion;':1,'estuaries':1,'several':1,'crevices':1,'higher':1,'development':1,'safe':1,'leopard':1,'cleaning':1,'recent':1,'lower':1,'colour':6,'contact':2,'regulating':1,'biology.':1,'the':800,'chemistry':1,'summer':3,'less':2,'being':4,'ideas':1,'front':3,'shape':1,'hercules':3,'distant':1,'human':5,'succeeding':2,'rapid':3,'gentleness':1,'evolution.':1,'thinking':1,'alternate':1,'wet':1,'showing':2,'sussex':2,'early':2,'vacuum':1,'belgium':1,'cape':1,'hollow':1,'dreams':1,'ponds':1,'backboned':1,'brain-development':1,'lightning':1,'true':1,'either':2,'popular':1,'65':1,'methods':1,'some':52,'choosing':1,'sight':1,'illumination':1,'proper':2,'ourselves':3,'preparing':1,'dense':1,'dimensions':1,'for':2,'broad':1,'normal':1,'fluids':1,'1856':1,'tertiary':1,'cuttlefishes':1,'intimate':1,'miles.':1,'of':1,'agreement':1,'illustration':1,'constructive':1,'broken':2,'by':2,'comparison':3,'about':1,'central':3,'getting':3,'freedom':1,'hot':1,'gentler':1,'despair':1,'ox':1,'vogue':1,'or':1,'swimming':1,'1859.':1,'gearing':1,'fishes':3,'bats':1,'lieu':2,'your':2,'ontario':1,'her':5,'shells':1,'support':1,'sargasso':2,'question':1,'war':1,'north':6,'form':1,'mammals':4,'regard':15,'gait':1,'wireless':1,'1871--a':1,'thickness.':1,'with':1,'themselves':2,'partially':1,'blanketing':1,'places':3,'dordogne':1,'iron-mines':1,'diameter.':1,'laplace':1,'nature':8,'constant':1,'mesozoic':1,'certain':5,'paragraphs':1,'an':21,'as':2,'1894':1,'kind.':1,'1896':1,'work':1,'mutual':1,'inborn':1,'no':2,'overcoming':1,'peace':1,'erecting':1,'reality':1,'other':21,'electrical':2,'themselves.':1,'thickness--a':1,'conclusion':2,'gaining':1,'explaining':1,'star':1,'scrutinising':1,'sal-ammoniac':1,'shore-pools':1,'william':1,'scores':1,'variable':1,'astronomy':2,'structure':5,'building':2,'remote':1,'ancestral':1,'holes':1,'2001':1,'thames':1,'time':4,'fresh':7,'starting':1,'having':5},'unbranched':{'radial':1},'mouse':{'as':1,'is':1,'which':1,'chose':1},'boom':{'of':1},'disappear':{'for':1,'in':1},'if':{'unimpeded':1,'all':5,'it':25,'one':5,'nothing':3,'as':2,'at':1,'in':2,'our':2,'hydrogen':1,'any':5,'no':1,'there':8,'to':1,'going':1,'instead':1,'white':1,'ever':1,'division':1,'we':39,'that':2,'painted':2,'after':1,'every':1,'they':15,'progress':1,'not':1,'an':6,'you':17,'he':1,'a':11,'substances':1,'this':2,'light':1,'asexual':1,'she':3,'the':49},'grown':{'to':1,'now':1},'them--or':{'great':1},'belle':{'vue':1},'make':{'aerial':1,'mental':1,'some':1,'it':11,'society':1,'itself':1,'its':1,'galls':1,'for':4,'no':1,'any':2,'their':1,'new':1,'instinctively':1,'more':2,'to':1,'nothing':1,'themselves':1,'a':11,'up':8,'fewer':1,'mistakes':1,'donations':1,'the':9,'shows':1},'respectively.':{'the':1},'solidary':{'with':1},'concavity':{'.':1},'belly':{'very':1},'mixtures':{'of':1},'vegetable':{'mould':1,'matter':1,'kingdom.':1},'colonies':{'communities':1,'inside':1},'grows':{'hotter':1,'larger.':1,'hotter.':1,'to':1,'broader.':1,'old':1,'until':1,'out':1},'bells':{'drove':1},'evolve':{'such':1,'in':1,'.':1},'dissolution':{'must':1},'differing':{'for':1},'delight':{'in':1},'renaissance':{'of':1},'waterfall':{'is':1,'or':1},'sea-water':{';':1,'with':1,'back':1},'kin':{'by':1,'at':1},'supposing':{'our':1,'the':1,'that':3},'opportunity':{'and':1,'for':2,'of':1,'to':2,'during':1,'was':1},'butter':{'in':1},'bell.':{'copper':1},'changes':{'and':1,'again':1,'from':1,'e.g':1,'very':1,'of':7,'that':2,'.':3,'to':1,'as':1,'are':1,'which':1,'in':9,'occurring':1,'involved':1,'with':1,'wrought':2,'endless':1},'stimuli':{'and':1,'to':1,'from':1},'neptune':{'and':1,'2971.6':1,'quite':1,'s':1,'.':1,'by':1},'sea-anemone-like':{'polyps':2},'skull-cap':{'a':1,'indicates':1,'thigh-bone':1,'157':1},'809':{'north':1},'materials':{'nearer':1,'deeper':1,'for':1,'that':1,'this':1,'of':2,'are':1,'have':1,'such':2,'or':1},'impure.':{'the':1},'qualities':{'not':1,'of':1,'with':2,'sir':1,'.':2},'bootlace':{'and':1},'claims':{'of':1},'801':{'596-1887':1},'800':{'illustrations':1,'trillion':1},'left':{'and':4,'wall':1,'is':1,'it':2,'high':1,'alone':2,'at':1,'in':1,'only':1,'out':1,'isolated':1,'their':1,'behind':3,'his':1,'showing':1,'free':1,'else':1,'not':1,'hand':1,'a':1,'severely':1,'of':1,'having':1,'the':2,'side':1},'just':{'one':1,'as':28,'examined':1,'mentioned':3,'seen':1,'before':1,'detect':1,'two':1,'been':2,'foam-bells':1,'liberated':1,'peeping':1,'means':1,'outlined':1,'said':1,'mentioned.':1,'a':1,'on':1,'like':3,'this':1,'leaving':1,'dealt':1,'the':1},'sentence':{':':1,'set':1,'with':1},'ignorabimus.':{'a':1},'sporting':{'jellyfish':1,'or':1,'stock':1},'presume':{'that':1},'longish':{'hair':1},'fife--a':{'first-class':1},'identify':{'do':1},'salivary':{'juice':1},'fullness':{'freedom':1},'facts':{'and':3,'appear':1,'that':1,'of':2,'is':2,'there':1,'favour':1,'.':2,'to':2,'are':2,'point':1,'suggest':1,'not':1,'with':1,'recall':1},'yes':{'card':1},'yet':{'there':1,'just':1,'it':6,'discovered':1,'as':1,'at':1,'another':1,'in':1,'its':1,'even':1,'again':1,'would':1,'flash':1,'admit':1,'been':1,'to':1,'without':1,'passed':1,'stable':1,'we':2,'greater':1,'that':1,'here':1,'discover':1,'met':1,'they':1,'not':1,'now':1,'the':8,'man':1,'a':2,'steadfastly':1,'this':1,'many':1,'possessed':1,'studied':1,'these':1,'remain':1,'definitely':1,'she':1,'though':1,'found':1,'unborn':1},'infinitely':{'small':1,'long':2,'minute':1},'agile':{'hunters':1,'clever':1},'regarded':{'as':13,'the':2},'royal':{'astronomical':2,'observatory':6,'college':2},'long-lost':{'heir':1},'save':{'them':1,'that':1,'in':1,'it':1,'itself':1,'blood':1,'time':1,'fun':1,'the':1,'its':1,'man':1},'resting-place':{';':1},'ago.':{'when':1,'illustration':2},'nightjar':{'with':1,'.':1},'seventy-five':{'inches':1},'loose-limbed':{'fellow':1},'roadside':{'we':1},'forester':{'or':1},'gyrating':{'with':1},'background':{'and':1,'of':2,'professor':1,'parallax':1,'.':1},'destroy':{'a':1,'energy':1,'all':2},'hibernating':{'mammals':1},'dreamt':{'much':1},'grape-sugar':{'.':1},'dreams':{'mixed':1},'shoulder':{'.':1},'ascent.':{'illustration':1},'post-glacial':{'pleistocene':2},'nude':{'female':1},'autumn.':{'we':1},'manual':{'of':1},'unnecessary':{'display':1},'x-rays.':{'below':1},'admittedly':{'provisional.':1},'signal':{'noli':1,'illustration':1,'for':1},'greenland':{'whale':2},'deal':{'about':1,'of':5,'is':1,'.':1,'in':1,'further':1,'the':1,':':1,'with':8,'more':1},'sound--':{'five':1},'deaf':{'for':1},'somehow':{'condensed;':1,'associated':1,'breaking':1,'been':1,'underneath':1,'connected':1,'or':1},'dead':{'plants':1,'star':4,'stars':1,'forests':1,'cuticle':1,'.':1,'matter':1,'reverently':1,'fishes':1,'world':3,'animals.':1,'herring':1,'or':1,'before':1},'jupiter':{'and':3,'shine':1,'saturn':1,'from':1,'23':1,'is':3,'however':1,'.':2,'s':1,'which':1,'in':1,'the':1,'483.3':1,'as':1},'paragraphs':{'1.e.1':2,'1.e.8':1},'chromosomes':{'represented':1,'nuclear':1,'2':1,'lie':1},'disadvantage--a':{'broiling':1},'shapes':{'of':1,'282':1,'.':1,'in':1,'wave-motions':1},'dense':{'by':1,'waters':1,'forests':1,'or':1,'moisture':1,'region':1,'masses':1},'stations.':{'what':1},'normal':{'development':1,'number':1,'routine':1,'baby':1,'path':1,'condition':1,'circumstances':1},'distrust':{'which':1,'for':1},'nerve-cord.':{'4':1},'flounder':{'is':2},'conquering':{'them':1,'time':1,'the':2,'two':1,'space':1},'scotland.':{'what':1},'bold':{'enough':1},'novelties':{'may':1,'.':1,'or':1,'that':1},'burn':{'itself':1},'34':{'000':1},'translated':{'the':1,'mind.':1,'into':1},'bolt':{'escaped':1,'their':1},'tartan':{';':1},'flinty-shelled':{'radiolarians':1},'invertebrate':{'stocks':1,'animals':1},'bury':{'their':1},'air--by':{'means':1},'skin-twitching':{'muscle':1},'flourished':{'probably':1,'in':1},'conceal':{'.':1},'acceptation':{'of':1},'ribs':{'and':1,'of':1,';':1,'are':1,'.':1},'azure':{'blue':1},'islands':{'and':1,'off':1,'of':1,'but':1,'.':3,'in':1},'plesiosaurs':{'dinosaurs':1},'little-changed':{'descendant':1},'automatically':{'to':1,'adjusts':1},'ores':{'of':1},'nerve':{'to':1,'for':1,'man':1},'thinner':{'and':1,'as':1,'than':3},'for.':{'information':1},'formerly':{'had':1},'intellectual':{'keys':1,'tool':1,'property':2,'adventure':1,'coin':1},'chooses':{'for':1},'down':{'and':7,'into':1,'it':1,'as':1,'sec':1,'at':1,'in':2,'before':1,'even':1,'again':1,'from':2,'their':1,'when':1,'.':4,'to':9,'behind':1,';':2,'more':1,'towards':1,'unless':1,'upon':1,'losing':1,'with':1,'by':4,'a':1,'on':5,'branches':1,'these':1,'of':5,'taking':1,'without':1,'many':1,'the':20},'lies':{'in':1,'safe':1,'.':2,'at':1,'between':1,'the':1},'doctrine':{'of':2},'lieu':{'of':2,'travail':1},'refined':{'methods':1},'crab-apple':{'of':1},'ring-formations':{'on':1},'weathered':{'by':1},'amazingly':{'.':1},'initial':{'picture.':1},'jealousy':{'and':1},'approximate':{'and':1,'way':1},'saucerful':{'.':1},'fraction':{'1':1,'of':3,'about':1},'marten':{'for':1},'form':{'and':2,'accessible':1,'is':2,'some':1,'an':2,'as':1,'including':1,'are':1,'any':1,'what':1,'no':2,'.':5,'molecules':2,'we':2,'that':1,'atoms':1,'water':1,'part':2,'reappears':1,'a':16,'fossils':1,'this':1,'of':20,'centres':1,'the':9,'or':1,'once':1},'pinna':{'a':1},'analyse':{'it':1},'feminine':{'structures':1,'characters':1,'.':1},'powerfully':{'along':1},'snow-caps':{'in':1},'magellanic':{'cloud':1},'minuteness':{'of':2},'221':{'photo':1},'evinced':{'and':1},'manatees':{'and':1},'builds':{'up':1},'understood':{'before.':1,'unless':1,'that':1,'when':1,'to':1,'as':1},'harmony':{'and':2},'attached':{'to':3,'full':1},'bounds':{'of':1,'until':1},'pistil':{'thus':1},'centipede':{'s':1},'bird-dropping':{'perhaps':1,'on':2,'spider':1},'egg-eating':{'african':1},'cosmos':{'more':1},'attaches':{'to':1},'temper':{'rather':1,'the':1,'but':1,'.':1},'fractions':{'showing':1},'strengthening':{'of':1},'sticks':{'to':1},'discovery.':{'certain':1,'2':1},'seeds--and':{'resolving':1},'covers':{'them':1,'the':1},'sticky':{'club':1},'gland':{'of':1,'.':1},'mediocre':{'stock':1},'marking':{'the':1},'profit.':{'illustration':1},'discriminate':{'infallibly':1,'differences':1,'sifting':1,'between':1,'cards':1,'the':1},'x-rays--the':{'discovery':1},'font-de-gaume':{'on':2,'cavern':2},'generally':{'described':1,'burst':1,'correspond':1,'deep':1,'as':1,'accepted':1,'adopted.':1},'handed':{'a':1,'on':1,'over':3},'carnivorous':{'confined':1,'turtles':1},'mediaeval':{'and':1},'delivered':{'up':1},'dies':{'to':1},'felt':{'thought':1,'.':1,'than':1,'that':1},'diet':{'mainly':1,'in':1},'genealogical':{'tree':6},'journey':{';':1,'through':1,'round':1,'.':3},'routine--not':{'that':1},'authorities':{'on':1,'neanderthal':1,'recently':1,'referring':1,'is':1,'there':1,'regard':1,'who':1,'have':1,'the':1,'include':1,'think':1},'died':{'away':1,'when':1,'suffered':1,'.':1},'billion':{'is':1,'the':1},'immemorial':{'and':1,'spawning':1},'happening':{'to':1,'is':1},'potato':{'and':1},'assume':{'different':1,'its':1,'that':1},'blushing':{'but':1},'microcosm':{'only':1},'daily':{'.':1,'paper':1,'mail':1,'i.e':1,'mail.':1,'round':1},'jacket':{'and':1},'gorilla':{'g':1,'inhabiting':2,'.':1,'brain':1,'s':1,'164':1,'the':2,'man':3},'almanac':{'and':1,'.':1},'teeth':{'and':3,'on':2,'that':1,'of':1,'.':5,'obeying':1,'till':1,'without':1,'so':1,'are':3,'which':2,'in':3,'fixed':1},'skull-cap.':{'illustration':1},'restored':{'.':2,'it':1,'by':1},'milt':{'and':1},'managed':{'to':1},'limbless':{'lizard':1,'larva':1},'woodwork':{'knew':1},'relieve':{'the':1},'vestiges':{'have':1},'pierces':{'with':1},'hind-legs':{'and':5,'about':1},'manages':{'to':1},'skin':{'and':5,'able':1,'is':1,'pushed':1,'as':1,'are':1,'when':1,'responds':1,'.':2,'to':1,'was':1,'extended':1,'becomes':1,'during':1,'with':1,'minute':1,'begins':1,'on':1,'of':2,'involved':1,'the':1,'or':1},'leche':{'of':2},'shot':{'out':4,'in':1,'humming-bird':1},'mill':{'in':1,'.':1},'abundant':{'modern':1,'from':1,'material':1,'evidence':1,'flux':1,'near':1,'representation':2,'oxygenation':1},'milk':{'.':2},'resourceful':{'of':1},'retention':{'of':2},'anticipation':{'of':1},'depend':{'on':4},'disorders':{'are':1},'educable':{'and':1,'loquacious':1,'creature':1,'.':1},'pouch':{'and':2,'83':1,'the':1,'on':1},'father':{'secchi':1,'of':1,'sea-horse':1,'s':1,'lumpsucker':1,';':1,'stickleback':1,'was':1,'sea-spider':1},'travel.':{'but':1},'answered':{'that':1},'finally':{'and':1,'we':1,'marquis':1,'becomes':1,'there':1,'it':2,'discover':1,'to':1,'words':1,'resulted':1,'become':1,'the':1},'appendicitis':{'.':1},'reptiles':{'and':7,'appeared':1,'some':1,'are':1,'in':4,'birds':2,'before':2,'suggest':1,'when':1,'.':1,'finding':1,';':1,'burrowing':1,'but':2,'such':2,'with':1,'on':1,'e.g':1,'did':1,'of':1,'the':1,'or':1},'swoop':{'from':1},'marks':{'on':1,'most':1,'with':1,'an':1},'vegetation.':{'the':1,'illustration':1,'they':1},'suffered':{'and':1,'from':1},'must':{'often':1,'give':1,'describe':1,'influence':1,'it':1,'one':1,'recall':1,'exist':1,'at':1,'have':17,'go':1,'still':1,'open':1,'find':1,'use':1,'necessarily':1,'appear':1,'suffice':2,'point':1,'also':4,'live':1,'therefore':1,'include':1,'be':59,'draw':1,'move':1,'return':1,'extend':1,'rise':1,'gradually':1,'however':2,'surely':1,'struggle':1,'recognise':4,'imagine':1,'not':11,'affect':1,'come':1,'comply':2,'look':2,'convert':1,'remember':3,'of':1,'require':1,'leave':1,'admit':3,'always':4,'cease':1,'first':3,'obtain':1,'think':3,'sink':1},'fancied':{'there':1},'abundance':{'of':5,'so':1,'at':1},'mud-turtle':{'or':1},'string':{'of':1,'beads':1},'einstein--the':{'tides--origin':1},'theme.':{'when':1},'soapy':{'water':1,'froth':1,'film':1},'figment':{'of':1},'first-known':{'bird':1},'merit':{'of':1},'word':{'development':1,'obviously':1,'about':1,'now':1,'like':1,'for':1,'pencilled':1,'may':1,'processing':1,'atom.':1,'surface':1,'atoms':1,'specificity':1,'.':1,'s':1,'learn':1,'need':1,'has':1,'history':1},'dim':{'and':1,'luminous':1,'at':1},'banished':{'from':1},'did':{'fly':1,'naturally':1,'great':1,'good':1,'service':1,'this':1,'all':1,'long':1,'it':1,'to':1,'much':1,'exist':1,'at':1,'they':1,'not':14,'.':1,'really':1},'die':{';':1,'after':1,'or':1,'.':2},'cavendish':{'professor':1,'physical':1},'travels':{'from':1,'straight':1,'down':2,'at':3,'in':2,'along':2,'by':2},'item':{'in':1},'excellence':{'and':1,'that':1},'perceptual':{'inference.':1,'inference':5,'influence.':1},'round':{'and':3,'it':7,'at':1,'planets':1,'in':3,'its':2,'rapidly':1,'would':1,'.':1,'which':1,'mars':1,'hers.':1,'them':2,'his':1,'that':2,'each':1,'a':5,'on':2,'about':1,'this':2,'smooth':1,'these':1,'centres':1,'the':38},'attracting':{'other':1,'or':1},'talked':{'of':1},'dealing':{'with':4,'from':1},'radium.':{'the':1},'run':{'to':1,'leap':1,'on':2},'langmuir':{'has':1},'bipeds':{'and':1},'adds':{'to':1},'1910.':{'illustration':1},'heaviest':{'and':1,'uranium':1,'.':1},'favour':{'of':1,'the':2,'in':1},'rub':{'it':1},'international':{'donations':1},'filled':{'with':1},'dwarf':{'a':1},'fibre':{'.':1},'mr':{'.':11},'appetites':{'of':1},'french':{'mathematician':1,'copper':1,'authority':1},'tangent':{'is':1,'.':1},'congestion':{'and':1},'four-chambered':{'mammalian':1},'nooks':{'of':1},'wait':{'for':2},'box':{'and':3,'of':1,'containing':1,'green':1,'.':1},'boy':{'a':1,'or':1},'cranial':{'cavity':2,'walls':1,'capacity':1},'1924':{'the':1,'made':1},'shift':{'of':2,'against':1},'intelligence.':{'illustration':1},'works.':{'sec':1,'1.e.9':1,'professor':1,'-':1},'animals--the':{'most':1,'flying':1},'smoke-like':{'haze':1},'exploitation':{'is':1},'simultaneous':{'discharge':1},'atoms.':{'molecules':1,'illustration':1},'conveniently':{'divided':2},'hither':{'and':2},'adjustable':{'in':1},'elect':{'to':1,'were':1},'merely':{'passes':1,'striking':1,'of':1,'that':1,'approximate':1,'air':1,'as':1,'have':1,'represented':1,'finger-posts':1,'means':1,'the':3},'reef-building':{'coral':2},'everybody':{'knows':1,'.':1},'coaxing':{'he':1},'wealth':{'of':1},'sake':{'of':1,'professor':1,'there':1},'hundred-thousandth':{'part':1},'uncritical':{'generosity':1},'--are':{'related':1},'trilobites.':{'looking':1},'ways.':{'iii':1},'flaunting':{'conspicuousness':1},'100-inch':{'telescope':2,'reflector':1},'phosphorescent--they':{'become':1},'cooperated':{'with':1},'lessened':{';':1,'by':1},'alpines':{'and':1},'fish-eating':{'turtles':1},'sharing':{'project':1},'labyrinth':{'if':1},'malay':{'and':1,'to':1,'islands':1},'rigid':{'during':1},'knowledge--the':{'senses':1},'effort':{'to':2,'good':1,'.':1,'much':1},'robe':{'of':1},'capturing':{'a':2,'the':1},'bushels':{'of':1,';':1},'fly':{'off':4,'for':1,'far':3,'into':2,'spreads':1,'.':1,'which':2,'in':1,'flicking':1,'once':1},'flagellum':{'by':1},'avoiding':{'death':1,'enemies':1},'sum-total':{'of':1},'amarus':{'a':1,'124':1},'reappear':{'perhaps':1,'at':1},'growing':{'on':1,'point':1,'over':1,'moulting':1,'stronger':1,'period':1,'to':1,'under':1,'thicker':1,'out':1},'making':{'a':5,'great':1,'towards':1,'daring':1,'these':1,'of':7,'cache':1,'life':1,'what':1,'it':1,'antagonistic':1,'more':1,'experiments':1,'them':1,'sentences':1,'the':10,'.':1,'intelligent':1,'animate':1,'tentatives--new':1},'thicknesses':{'of':1},'sea-spider':{'carries':1,'or':1},'claim':{'a':1},'portals':{'were':1},'bullhead':{'and':1},'predict':{'the':1},'596-1887':{'email':1},'permutations':{'and':1},'agent':{'or':1,'.':1},'sample':{'sent':1,'david':1},'stroke.':{'illustration':1},'1.f.':{'1.f.1':1},'above--that':{'is':1},'redness':{'.':1},'pages.':{'illustration':1},'rays':{'streamed':1,'visible':1,'see':1,'are':5,'have':1,'in':1,'carry':1,'out':1,'from':2,'their':1,'had':2,'except':2,'.':5,'to':3,'poured':1,'which':1,'was':1,'crookes':1,'passed':1,'that':2,'becomes':1,'emitted':1,'but':1,'263':1,'impinged':1,'carrying':1,'post':1,'must':1,'shoot':1,'diverging':1,'of':4,'as':2,'will':1,'were':2,'at':1,'the':2,'consisted':1},'comb-bearers':{'or':1},'get':{'crumbs':1,'into':3,'mind':1,'an':2,'at':3,'another':1,'in':3,'out':3,'even':1,'little':1,'from':1,'two':1,'much':1,'white':1,'more':1,'good':1,'some':2,'free':1,'correspondingly':1,'plenty':2,'a':8,'both':1,'about':1,'this':1,'the':3,'farther':1},'mongols':{'include':1,'curly-or':1},'till':{'a':1,'we':1,'daybreak':1,'there':1,'all':2,'dawn.':1,'only':1,'the':5,'he':1},'orang-utan':{'a':1,'3':1,'4':1,'232':1,'233':2},'1.e.9':{'.':1},'1.e.8':{'or':2,'.':1},'pure':{'radium':1},'skates':{'and':1},'1.e.5':{'.':1},'1.e.4':{'.':1},'1.e.7':{'and':1,'or':1,'.':1},'1.e.6':{'.':1},'1.e.1':{'through':2,'with':1,'.':1},'1.e.3':{'.':1},'1.e.2':{'.':1},'146':{'the':1,'protective':1},'147':{'cuckoo-spit':1,'photo':2},'144':{'dead-leaf':1,'another':1},'142':{'photo':1,'000':1},'swayed':{'their':1},'140':{'photo':1,'photos':1},'141':{'protective':1},'strokes':{'and':1,'of':2},'max':{'schultze':2},'accessory':{'factors':1},'mankind':{'given':1,'evolution':1,'though':1,'migrations':1,'.':3,'so':1,'at':1,'the':1,'or':1},'gill-plates.':{'illustration':1},'grow':{'down':1,'for':1,'older':1,'it':1,'large':1,'in':1,'out':1},'jellyfish':{'easily':1,'starfish':1,'is':1,'there':1,'it':1,'aurelia':1,'has':1,'with':1},'scrambling':{'on':1},'aimless':{'wandering':1},'neck':{'and':1,'passes':1,'of':1,'.':1,'vertebrae':1,'or':1},'johnson':{'and':2},'duckmole':{'and':2,'or':3},'tale':{'.':1},'idea--of':{'taking':1},'sun--measuring':{'the':1},'rarified':{'form':1},'deposit':{'on':1,'in':1,'their':1},'african':{'representative':1,'mudfish':1,'race':1,'snake':1,'the':1,'ape':1},'basket':{'a':1,'of':1,'euplectella':2,'on':1},'mottlings':{'especially':1},'proposal':{'.':1},'development.':{'continental':1},'shield':{':':1,'.':1},'cathedral':{'would':1,'each':1},'civilisation.':{'pleistocene':1,'before':1},'pointed':{'ear':1,'out':2},'wishing':{'to':1},'entity':{'just':1,'that':1,'.':1,'to':2,'which':2,'providing':1},'stability':{'and':1},'globe-fishes':{'which':1},'rings.':{'illustration':1},'planetesimals':{'into':1,'formed':1,'which':1},'pitch':{'.':1},'differs':{'from':3,'greatly':1},'tropisms':{'a':1,'obligatory':1,'play':1,'.':1},'mind--mind':{'in':1},'rhinoceros':{'had':1,'the':1,'bison':1,'irish':1},'ice-fields':{'of':1,'cleared':1},'police':{'dog':1},'monitor':{'varanus':2},'interesting':{'and':1,'because':1,'saving':1,'give':1,'is':1,'sidelight':1,'questions':1,'in':2,'birds':1,'subject':1,'information':1,'glimpse':1,'ways':1,'point':3,'to':16,'way':2,'living':1,'minor':1,'case':1,'that':1,'gradations':1,'archaic':1,'than':1,'condition':1,'recent':1,'chapter':1,'picture':1,'outcome':1,'consequences':1,'study':2,'work':1,'circumstance':1,'race':1,'greenish':1,'problem':1,'works':1,'discoveries':1,'fact':5},'yorkshire':{'stream':1},'consequential':{'punitive':1},'ours':{'would':1,'does':1,'judged':1,'but':1,'are':1},'main':{'layers':2,'use':1,'force':1,'methods':1,'primate':1,'motive-force':1,'lines':2,'processes--':1,'stem':2,'seat':1,'trends':1,'mass':2,'pg':1,'groups':1,'stems':1,'chapters--the':1,'line':14,'one':1,'types':1,'scientific':1},'captivated':{'the':1},'fire-mist':{'that':1},'sooner':{'or':2},'gregariousness':{'and':1},'begun.':{'splitting':1},'markings':{'and':1,'on':1},'leopards':{'238':1,'trained':1},'killed':{'on':1,'by':1,'in':1},'possess':{'a':2,'what':1,'well-developed':1,'.':1,'in':1,'the':3,'an':1},'stock--common':{'to':1},'obviates':{'any':1},'meets.':{'these':1},'thymus':{'gland':1},'careless':{'statement':1},'rock':{'formations.':1,'to':1,'of':1,'kangaroo':2,'record':5,'whence':1,'many':1,'dove':1,'or':1},'vogue':{'but':1},'sheep-ranches':{'were':1},'eyelid':{'is':1,'used':1,'in':1},'elephants':{'and':1,'what':1,'the':1,'is':1,'.':1},'water-bird':{'such':1},'treacherous':{'internal':1,'ooze':2},'tobogganing':{'on':1},'richly':{'endowed':1},'unlock':{'locks':1},'glaciation':{'had':1},'sifted':{'and':1,'again':1,'.':3,'for':1,'out':1},'telescoped':{'manner':1},'description':{'aeschylus':1,'from':1,'.':1},'canada':{'and':1,'about':1},'emerges':{'the':1,'from':1},'afghans':{'alpines':1},'greeks':{'applied':1,'of':1,'said':1,'thought':1},'interference':{'as':1,'with':1},'miles':{'and':1,'into':1,'deep':2,'an':1,'winding':1,'distant':1,'per':4,'in':13,'odd':1,'out':1,'away.':1,'from':5,'would':1,'away':9,'long':1,'.':9,'to':1,'above':3,';':1,'was':1,'across':1,'though':1,'coloured':1,'driven':1,'satellites':1,'a':17,'wide':1,'getting':1,'of':8,'the':2,'or':1,'at':1},'emerged':{'a':1,'on':1,'about':1,'rich':1,'in':1},'dioxide':{'and':1},'correct':{'path':1,'the':1},'assurance':{'the':1},'behaving':{'to':1},'earlier':{'a':1,'chapter':1,'form':1,'generation':1,'organisation':1,'page':1,'stages':1,'or':1},'telegraphy':{'and':1},'sideways':{'towards':1,'scooping':2},'atomism.':{'an':1},'electrically':{'and':1},'imaginable':{'.':1},'paralysing':{'effect':1},'surface-atoms':{'of':1},'existed.':{'even':1},'sunlight.':{'saturn':1},'cough':{'or':2},'orb':{'on':1},'advance':{'and':1,'towards':1,'of':3,'is':1,'in':2,'has':2},'grist':{'to':1},'derivation':{'from':1},'language':{'and':1,'logos':1,'of':1,'there':1,'to':1,'as':1,':':1},'thing':{'and':1,'we':1,'works':1,'to':3,'may':1,'is':1,'.':2,'did':1,'as':3,'existed.':1,'has':1,'yet':1,'happened':1},'invalidity':{'or':1},'2971.6':{'164.78':1},'alevin':{'encumbered':1},'assuredly':{'much':1},'waited':{'on':1,'in':1},'first':{'and':3,'discovered.':1,'telescope':1,'bird--was':1,'beholding':1,'animals':5,'preparation':1,'crop':1,'dynasty':1,'observed':1,'known':6,'animals--beginnings':2,'view':1,'sight':3,'such':1,'alternative':1,'amphibians.':1,'vital':1,'creatures':1,'terrestrial':1,'living':4,'plants--the':2,'one-toed':1,'organisms':1,'make':1,'there':3,'question':1,'three':2,'.':1,'to':3,'prism':1,'became':1,'reptiles':1,'finger':2,'time':6,'learned':1,'if':1,'was':1,'bird':2,'body':1,'be':2,'men':1,'wheat':1,'that':1,'mammal':1,'becomes':2,'voice--surely':1,'divergence':1,'use':1,'but':1,'step':2,'part':1,'sir':1,'amphibians':2,'atom':1,'fishes':1,'invasion':1,'printing':1,'one':1,'come':1,'bronze':1,'a':2,'great':5,'backboned':1,'impressive':1,'showed':1,'gale':1,'successes':1,'of':2,'books.':1,'formed':1,'discoveries':1,'thought':1,'plants':1,'definitely':1,'place':2,'evolved':1,'error':1,'fishes.':1,'found':1,'the':2,'quarter':1,'called':1,'two':1,'know':1},'dwelling':{'on':1},'americana':{'with':2},'discharges':{'at':1},'miocene':{'and':2,'n':1,'was':1,'or':1,'others':1},'arrhenius':{'svante':1},'amidst':{'the':1},'violet-light':{'waves':1},'specificity':{'which':1},'carry':{'them':1,'his':1,'many':1,'messages':1,'it':2,'us':1,'an':1,'their':2,'out':1},'sounds':{'and':2,'on':1,'become':1,'were':1,'except':1,'two':1,'are':1,'in':1,'such':1,'the':1,'.':1},'fiji':{'.':1},'rome':{'observed':1,'were':1},'discharged':{'by':2,'.':1},'interchange':{'of':2},'little':{'reptile':2,'secure':1,'family':1,'taste':1,'of':1,'is':2,'mud-turtle':1,'colony':2,'primitive':1,'evidence':1,'likely':1,'books':1,'creatures.':1,'in':3,'conical':1,'species':1,'lid':1,'glimpse':1,'books--an':1,'monkey':1,'plankton':1,'detail':1,'chemical':1,'lower':1,'doubt':4,'finger':1,'colony.':1,'units':1,'bubble':1,'over':1,'store':1,'more':1,'plate':1,'ball':1,'garden':1,'fish':1,'that':1,'structure':1,'mammals':1,'wax':1,'use':1,'glass':1,'ferment':1,'resemblance':1,'dull':1,'pool':1,'room':1,'building':1,'about':1,'freshwater':1,'like':1,'grains':1,'uneasy':1,'whether':1,'scraping':1,'patch':1,'green':1,'ten-miles-wide':1,'pockets':2,'pinch':1,'the':1,'piece':2,'book':1},'man--the':{'culmination':1,'fountain':1,'metal':1},'unduly':{'obscure':1},'parallel':{'to':2,'wires':1},'1a':{'fore-limb':1},'plains':{'and':3,'to':1,'were':1},'pockets.':{'in':1},'alfred':{'a':1,'russel':1},'speaking':{'of':2},'mining':{'no':1},'dived':{'and':1,'appropriately.':1,'disappeared':1},'american.':{'professor':1},'continuous':{'and':3,'natural':1,'relationship':1,'since':1,'gradations':1,'.':1,'current':1,'accretion':1,'night':1,'raft':1},'accurately':{'the':1,'measured':1},'crevice':{'of':1},'ridges.':{'illustration':1},'undoubtedly':{'great':1,'radio-active--then':1,'an':1},'splendid':{'failures':2},'11':{'feet':1,'the':1,'magnetism':1},'10':{'what':1,'ft':1,'photo':2,'professor':1,'.':1,'feet':1,'000':3,'uranus':1,'1910.':1},'13':{'is':1,'substitutes':1},'cracks':{'of':1},'15':{'matter':1,'from':1},'14':{'dissipation':1,'photo':1,'the':1,'you':1},'sailing':{'of':1,'round':1},'16':{'rise':1,'minutes':1,'until':1},'19':{'1911':2,'photo':2,'consists':1},'scraping':{'of':1},'coco-palm':{'for':1},'victorian':{'.':1},'protected':{'and':1,'as':1,'e.g':1},'fertilisation':{'may':1,'of':1,'it':1},'centigrade':{'below':1},'were':{'all':3,'shot':1,'being':2,'soon':1,'forests':1,'discovered':1,'introductions':1,'through':1,'handed':1,'jointed-footed':1,'still':2,'birds':1,'waiting':1,'teeming':1,'destroyed':3,'to':1,'microscopic':1,'dead.':1,'employed':1,'hidden':1,'surprised':1,'presently':1,'very':3,'wiser':1,'not':5,'hunted':1,'like':1,'presented':2,'always':2,'porous':1,'intrigued':1,'found':4,'entirely':1,'prompted':1,'somehow':1,'born':1,'sifted':1,'borne':1,'even':1,'established':2,'opened':1,'for':1,'wrought':1,'laid':3,'dominated':1,'probably':4,'neither':1,'involved':3,'fed':1,'free':1,'quite':1,'met':1,'experimenting':1,'imperfectly':1,'represented':1,'atoms':1,'beginning':1,'gained':1,'on':1,'about':1,'feeling':1,'evolved--destined':1,'indivisible':1,'broken':1,'many':2,'substituted':1,'streams':1,'usually':1,'symmetrical':1,'first':2,'composed':1,'raised':2,'afterwards':1,'slipped':1,'suddenly':1,'within':1,'marked':2,'due':1,'brought':2,'done':1,'suspended':1,'often':1,'ichthyosaurs':1,'given':1,'ancient':1,'from':1,'hunters':1,'three':1,'approximately':1,'.':1,'few':1,'much':1,'too':1,'fish-lizards':1,'taken':1,'reptiles':1,'minor':1,'composed.':1,'separated':1,'formed':4,'amphibians':2,'it':1,'overcrowded':1,'trying':1,'true':2,'expounded':1,'electrified':1,'made':6,'these':1,'originally':1,'created':1,'extraordinarily':1,'replaced':3,'evolved':2,'of':4,'prematurely':1,'more':1,'buried':1,'crowning':1,'almost':1,'composed--':1,'an':2,'entombed':1,'as':1,'at':2,'in':5,'bones':1,'sharp':1,'no':1,'breaking':1,'able':4,'continually':1,'eagerly':1,'also':4,'prospecting':1,'accumulating':1,'several':1,'rediscovered':1,'gaining':1,'living':2,'immersed':1,'after':1,'most':1,'connected':1,'rejected':1,'eaten':1,'fishes':2,'such':1,'twenty-nine':1,'a':2,'succeeded':1,'largely':1,'later':1,'magnified':1,'so':3,'the':11,'left':3,'once':3},'gigantic':{'flywheel':1,'eye':1,'streamers':1,'orbits.':1,'sun':1,'orbits':1,'.':1,'magnet':1,'glowing':1,'shreds':1,'bubbles':1,'intellect':1,'as':1,'size':2},'proofread':{'public':1},'1.':{'illustration':1},'awns':{'or':1},'coconut':{'palm':1,'from':1},'conjectural':{'.':1},'mundane':{'goal':1},'occupies':{'only':1,'more':2,'an':1},'lice':{'have':1},'entombed':{'in':1},'kurtus':{'carries':1},'metcalf':{'outline':1},'spectacle':{'again':1,'197':1,'is':1},'occupied':{'the':1,'by':2},'euclid':{'or':1},'hitherto':{'known':1,'unknown':1,'shut':1,'we':1,'the':1},'intruder.':{'when':1},'bavaria':{'and':1},'efficient':{'to':1,'answers':1,'they':1},'isolate':{'it':1},'potential':{'energy':3,'.':1},'interior':{'of':4,'is':1,'yet':1,'energy':1,'periodically':1},'performance':{'of':1,'was':1,'hundreds':1},'inveterate':{'enemies':1},'volplanes':{'in':1},'jungle':{'fowl':1,'of':1,'ends':1,'folk':1,'tribes':1},'201':{'photo':2},'200':{'well-marked':1,'cassowary':1},'203':{'jackdaw':1},'202':{'a':1,'the':1},'205':{'a':1},'norman':{'lockyer':2,'inorganic':1},'trace':{'of':5,'the':1,'some':1,'any':1},'206':{'.':1},'arguing':{'whether':1},'208':{'photo':1,'from':1},'correlation':{'of':1},'paid':{'a':1,'for':3,'within':1,'toll':1,'the':1,'by':1},'blackest':{'ignorance':1},'beta':{'and':2,'rays':3,'electrons':1},'sheets':{'of':1},'tract':{'of':2},'contrasts':{'as':1,'in':1,'between':1},'conspicuous':{'and':3,'on':1,'is':1,'material':1,'canines':1,'against':1,'60':1,'black':1,'during':1},'especially':{'among':1,'from':1,'for':1,'prominent.':1,'on':1,'of':1,'when':3,'as':1,'commercial':1,'in':4,'those':2,'look':1},'surprising':{'power':1,'that':2,'when':1,'as':1,'effects':1,'fact':1},'fills':{'the':1},'bustard':{'the':1},'hedgehog':{'mole':1},'alone.':{'the':1},'precise':{'origin':1,'needs':1,'unless':1,'scientific':1,'form-resemblance':1,'object':1,'mechanism':1,'anthropology':1,'time':1,'studies':1,'answers.':1,'vision':1},'grouselike':{'above':1},'show':{'intelligence':1,'evidence':1,'even':1,'gill-clefts--':1,'what':2,'no':2,'interesting':1,'definite':1,'.':1,'to':1,';':1,'that':9,'notable':1,'how':2,'not':1,'man':1,'a':4,'on':1,'great':2,'this':1,'arrested':1,'us':1,'face':1,'without':1,'artistic':1,'teeth':1,'the':6},'gill-cover.':{'the':1},'forbidding':{'by':1},'drawings':{'and':1,'over':1,'by':2},'uranus':{'and':1,'neptune':1,'is':1,'1781.9':1,'.':1},'saying':{'nothing':2,'.':1,'merely':1,':':2,'that':4},'threshold':{'of':1},'corner':{'and':1,'of':5,'near':1,'at':1},'gaseous.':{'now':1},'directions--an':{'alternating':1},'fend':{'for':1},'stormy':{'weather':1},'plume':{'or':1},'treasure':{'at':1},'storms':{'on':1,'.':1,'to':1,'manifest':1},'enough':{'even':1,'has':2,'for':2,'of':2,'when':1,'however':1,'.':1,'to':17,'in':1,'the':1,'air':1},'either':{'case':1,'solitary':1,'of':2,'packet':1,'plants':1,'in':1,'the':1,'with':1,'before':1},'black':{'and':2,'body':1,'quills':1,'tip':1,'spots':2,'.':2,'surroundings':1,'stuff':2,'marks':1,'tips':1,'patch':1,'or':1},'germs':{'of':1},'down-rushing':{'water':1},'pegged':{'down':1},'abeyance.':{'disappearance':1},'awareness':{'and':2,'of':2,'.':1},'single-chambered':{'shell':1},'bittern':{'and':2,'begin':2,'is':1},'contracts':{'and':1,'under':1},'persisting':{'in':1},'midriff':{'or':1},'unimportant':{'and':1,'elements':1,'bladder':1},'nearly':{'a':2,'all':5,'every':1,'thirty':1,'everything':1,'twenty':1,'three':1,'related':2,'up':1,'twice':1,'so':3,'4':1,'9':1,'186':1,'the':2,'any':1,'two':1},'distinctly':{'later':1},'conjunction':{'with':1},'secondary':{'bodies':1},'pollen-nucleus':{'of':1},'bearings':{'cannot':1},'median':{'section':2},'yield':{'us':1},'morning':{'and':1,'coat':1,'especially':1,'to':1},'stupid':{'as':1,'bird':1},'photographically':{'reduced':1},'kernel':{'of':1,'is':1,'divides':1},'declared':{'that':1},'milling':{'and':1},'seas':{'and':2,'many':1,'had':1,'.':1,'to':1,'became':1,'are':1,'were':1,'went':1,':':1,'phosphorescent':1},'seat':{'of':4},'relative':{'distances':2,'sizes':2,'peace':1,'to':1,'absence':1,'in':1,'fixity':1,'shortness':1,'beginning':1},'j.':{'thomson':2},'mud-nests':{'or':1},'mcgregor.':{'profile':2,'a':1,'photograph':1,'sand-pit':1,'piltdown':3,'restoration':1,'the':3},'unaltered':{'.':1},'sameness':{'and':1},'permeates':{'all':1},'steadfast':{'sign':1},'eoliths':{'.':1},'habits--experiments':{'in':1},'behind':{'and':1,'both':1,'them':1,'it--a':2,'it':2,'us':1,'.':2,'while':1,'the':5},'chimpanzees':{'photos':1,'233':1,'but':1,'in':1},'radiated':{'away':2,'by':1,'in':1},'accustomed':{'to':2},'reading':{'of':1,'the':1,'ourselves':1,'anything':1,'or':1},'across':{'a':3,'space':3,'it':2,'the':11,'its':1,'empty':1},'roentgen':{'discovered':2,'s':1},'deletions':{'to':1},'august':{'1922':1,'1924':1},'parent':{'on':1,'of':5,'colony':1,'s':2,'has':1,'until':1},'parental':{'care.':1,'call':1,'care':17},'ascribed':{'the':1},'sea.':{'the':3,'2':2,'conquest':1,'proterozoic':1,'land':1},'tree-lizards':{'tree-kangaroos':1},'killing':{'and':2,'out':1},'dates':{'we':1,'from':3,'except':1,'varying':1},'vaporous':{'matter':1},'feelers':{'whereas':1},'diameter.':{'the':1,'innumerable':1},'diamond.':{'as':1},'according':{'to':24},'disappointment':{'when':1},'among':{'strongly':1,'all':1,'aquatic':1,'simple':1,'domestic':1,'them':1,'spiders':1,'domesticated':1,'birds':1,'cuttlefishes':1,'terrestrial':1,'lizards':1,'animals--by':1,'other':1,'which':2,'plant':1,'mammals':1,'mammals.':1,'dissimilars':1,'animals':4,'monkeys':1,'plants':3,'backboned':1,'this':1,'cosmic':1,'sand':1,'kindred':2,'the':21},'stretches':{'of':3,'from':1},'mound-birds':{'of':1,'young':1},'terse':{'and':1},'function--we':{'may':1},'flower-vase':{'well':1},'parachutists':{'and':1,'climbers':1},'maintained':{'this':1,'that':2,'by':1,'in':1},'stretched':{'in':1},'spans':{'the':1},'associated':{'a':1,'files':1,'his':1,'is':1,'enlargement':1,'reduction':1,'in':3,'the':2,'with':17},'reason--lays':{'her':1},'technicalities':{'.':1,'in':1},'considering':{'the':3},'sensible':{'things':1},'millimetre':{'and':1,'is':1},'caricature':{'of':1},'capable':{'of':3},'one-celled':{'plants--paint':1,'marine':2,'organism':1,'animal':1,'animalcules':1},'conditions.':{'illustration':2},'wilkinson.':{'jackdaw':1,'two':1},'mark':{'races':1,'individuals':1,'.':1},'attaching':{'too':1},'marked.':{'it':1},'mars':{'and':7,'is':3,'it':1,'maintained':1,'jupiter':1,'at':1,'141.5':1,'in':1,'there':1,'29':1,'.':2,'to':1,'going':1,';':1,'showing':1,'on':1,'october':1,'as':1,'were':1,'--jupiter':1,'the':1,'makes':1,'are':1},'tree-shrews':{'tupaia':1,'tree-mice':1,'hedgehog':1},'fiftieth':{'trip':1},'educated':{'who':1},'nautilus.':{'keen':1},'offered':{'some':1,'by':2,'for':1},'suns.':{'our':1},'dangerous':{'and':1,'to':1,'motto':1,'days':1,'maladies':1},'gripped':{'and':1,'in':1},'hippolyte':{'of':1,'which':1},'cod-banks':{'is':1},'dramatic':{'discoveries':1},'wake':{'of':1},'it.':{'the':1,'there':1,'whereupon':1,'other':1,'sun-spots':1},'captivity':{'has':1,'.':1},'sound':{'and':1,'conception':1,'though':1,'of':3,'.':3,'travels':1,'cannot':1,'another':1,'consists':1,'has':1,'judgment':1,'or':1},'turtles':{'and':3,'lay':1,'have':1,'which':1},'cannonade':{'of':1},'humming-bird':{'moths':1},'promising':{'wild':1,'a':1,'as':1,'.':1},'awakened':{'from':1},'margin':{'of':3,'are':1,'interlock':1},'luidia':{'which':1},'eventually':{'there':1,'like':1,'formed':1,'it':1,'to':3,'succeed':1,'they':1,'the':1,'creep':1,'after':1},'characteristics':{'of':2,'which':1,'e.g':1},'sleeping':{'prawns':1,'sickness':5},'strain':{'and':1},'sudden':{'and':2,'protrusion':1,'throwing':1,'irruption':1,'irritation':1,'withdrawal':1,'beginning':1,'acquisition':1,'movement':1},'tse-tse':{'fly':3},'dangerously':{'.':1},'ferns':{'conifers':1},'jackdaw':{'is':1,'balancing':2},'everyday':{'functions':1,'life':1,'intellectual':1,'bodily':1,'routine':1,'conditions':1},'movements':{'and':7,'on':1,'by':2,'that':3,'of':7,'is':1,'should':1,'how':1,'as':1,'implied':1,'are':2,'which':2,'in':1,'.':1,'until':1},'bags':{'of':1},'different':{'and':1,'set':1,'physiological':1,'methods':1,'instruments':1,'wave-lengths':2,'ages':1,'metals':1,'fellow':1,'rate':1,'manner':1,'times.':1,'in':3,'kinds':9,'as':1,'colours':5,'functions':1,'rays':1,'from':7,'ways':3,'relations':1,'.':3,'forms':1,'parts':1,'rates':1,'sedimentary':1,'105':1,'degrees':2,'main':1,'sections':1,'temperature.':1,'tacks':2,'idea--of':1,'aspects':1,'substances':4,'solution':1,'lines.':1,'groups':1,'fishes':1,'world':2,'rivers':1,'types':3,'areas':1,'lengths':2,'sizes':1,'this':1,'habitat-zones':1,'countries':2,'lines':2,'haunts':1,'thicknesses':1,'patterns':1,'length':1,'levels':2,'velocities':1,'latitudes':1,'terms':1},'paw':{'and':1,'to':1,'in':1},'pay':{'a':1,'out':1,'no':1},'oven':{'at':1},'same':{'and':1,'impression':1,'macaque':1,'facility':1,'appearance':1,'is':7,'table':1,'primary':2,'general':1,'attitude':2,'mistakes':1,'in':1,'bones':1,'corner':1,'face':3,'speed':1,'disadvantage--a':1,'as':3,'size':1,'story':1,'rays':1,'temperature':2,'opaque':1,'interesting':1,'nature':1,'proportion':1,'.':2,'state':1,'experiment':1,'way':9,'must':1,'conditions':1,'side':2,'foundation':1,'sex':1,'animal':1,'power':1,'format':1,'nest':1,'material':1,'gas':2,'effect':1,'period':1,'moment':1,'everywhere':1,'waves':1,'stem':1,'distance.':1,'day':1,'change':1,'stage':1,'kind':3,'type':1,'lines':1,'shape':1,'element':1,'magnet':1,'thing':1,'place':1,'principle':1,'fundamental':1,'time':8,'species':1,'applies':1,'table.':1,'essential':1},'eggs--up':{'towards':1},'thinning':{'of':1},'speech':{'.':1},'arguments':{'on':1,'.':1},'--all':{'the':1},'played--for':{'better':1},'intermediary':{'associative':1},'movement.':{'under':1},'extended':{'on':1,'tail':1,'from':1,'the':1,'their':1},'73000':{'10':1},'prominences':{'22':1,'these':1,'of':1,'which':3,'seen':2,'shooting':1,'ever':1},'assist':{'in':1},'companion':{'and':1},'running':{'on':2,'from':1,'no':1,'birds':1,'water':1,'leap':1,'leaps':1,'down.':2,'across':1,'down':2},'dynamo.':{'by':1,'illustration':1},'driven':{'outward':1,'by':2},'is--should':{'evolve':1},'waves.':{'the':1},'ripening':{'hard':1},'break':{'out':1,'up':2,'one':1},'largely':{'a':2,'feed':1,'based':1,'due':2,'with':1,'by':1},'roughly':{'group':1},'spoonful':{'of':1},'objection':{'there':1},'frontispiece':{'laplace':1,'.':1},'bottle':{'containing':1,'upside':1},'repulsive':{'or':1},'consisted':{'of':5,'only':2,'in':1},'generalisation':{'that':1},'money':{'paid':2,'if':1},'adjustments':{'which':1},'egg-cell':{'a':1,'certain':1,'within':1,'.':3,'fertilised':1,'in':1,'with':2,'divides':1},'down-drifting':{'food':1},'aspect':{'of':5,'can':1},'multiples':{'of':1},'sprang':{'the':1,'from':4,'but':1},'pinkish':{'eggs':1},'beagle':{'voyage':1},'crocodiles':{'and':1,'a':1,'there':1,'bury':1},'dipper':{'and':1,'or':1},'4':{'and':4,'another':1,'our':1,'living':1,'depict':1,'from':1,'tentative':1,'there':1,'.':11,'1':1,'500':1,'chromosomes':3,'information':1,'forming':1,'000':1,'external':1,'by':2,'a':2,'likeness':1,'this':1,'neptune':1,'the':6,'drawing':1},'grating':{'instead':1,'is':1},'pupa':{'stage':1},'extensive':{'repertory.':1},'heavier':{'to':1,'the':1,'materials':2,'more':1,'atoms':1},'pill':{'fizzing':1},'grip':{'and':1,'the':3},'1914.':{'baby':1,'4':1,'nos':1},'bitterling':{'cannot':1,'rhodeus':2},'tenses':{'.':1},'dissected':{'out':1},'tissues':{'and':1,'no':1,'of':1,'.':1,'to':1,'are':1,'or':1},'sight.':{'the':1},'water-measurers':{'in':1},'long-haired':{'angoras':1},'disadvantageous':{'dints':1},'aiming':{'at':1},'blankets':{'otherwise':1},'thames':{'gravels':1},'vertically':{'through':1},'dingo':{'or':2},'identifying':{'a':1,'different':1,'substances':1},'brain-development':{';':1},'serves':{'as':5},'lightning':{'278':1,'of':1,'in':1,'.':1},'facing':{'towards':1,'page':1},'chamber':{'only':1,'that':1},'behaviour-variations':{'which':1},'nose':{'that':1},'spinthariscope':{'making':1},'ascends':{'to':1,'into':1},'hunterian':{'professor':1},'mimicry.':{'colour':1},'flattely':{'and':1},'reveals':{'to':1,'the':2,'about':1},'alternately':{'and':1},'titan':{'a':1},'ascend':{'to':1,'the':2},'second.':{'their':1,'the':2,'sir':1},'specified':{'in':2},'images':{'of':1,';':1},'pasture':{'.':2},'ascent':{'of':7,'.':2,'not':1,'the':1,'by':1,'170':1},'gross':{'profits':1},'entities':{'of':1,'really':1,'.':1,'in':1},'apprenticeship--an':{'apprenticeship':1},'bubbles.':{'illustration':1},'footing':{'on':1},'fluids':{'and':1,'.':1},'considers':{'is':1},'pioneer':{'scorpion':1,'backboned':1,'animal':1},'critical':{'scientific':1,'discussion':1,'to':1,'time':1,'velocity':1,'spirit':1,'testings':1},'lunar':{'dawn':1,'apennines':1},'expressing':{'themselves':1,'or':1,'judgments':1,'feelings':1},'pipes':{'from':1,'by':1},'aboriginal':{'races':1},'rooks':{'and':1,'nests':1,'deal':1},'measuring':{'the':1,'does':1,'from':1,'it':2},'prerogative.':{'the':1},'buckling':{'up':1},'seconds':{';':1,'later':1,'takes':1,'.':2},'manufactured':{'by':1},'each':{'and':1,'other.':2,'foot':1,'pole':1,'constituent':1,'limb':1,'subject':1,'standing':1,'variety':1,'distinct':1,'incipient':1,'flash':1,'spiral':1,'.':2,'cell':2,'to':1,'prism':1,'other':9,'brick':1,'is':2,'foot.':1,'body':1,'star':1,'sinks':1,'molecule':1,'kind':2,'electrified':1,'electron':1,'descending':1,'atom':2,'date':1,'article':1,'with':3,'case':1,'independently':1,'substance':1,'particle':2,'of':11,'age':1,'tenanted':1,'metal':1,'element':2,'wave-length':1,'shade':2,'about':3,'side':1,'limb.':1},'notable':{'differences':1,'was':1,'feature':3,'power':1},'unusual':{'circumstances':1},'notably':{'the':3,'to-day':1,'planarians':1,'those':1},'trials':{'was':1},'arithmetical':{'question':1},'refers':{'to':1,'in':1},'stock--some':{'of':1},'psychical':{'level.':1,'research':1},'staff.':{'please':1},'stations':{'.':1},'instantaneously':{'into':1,'.':1,'he':1},'fringe':{'round':1},'insect':{'living':1,'lived':1,'flight':1,'larvae':3,'may':1,'is':1,'.':1,'visitors':3,'s':6,'lighting':1,'are':1,'pierces':1,'has':1,'with':1},'mixes':{'with':1},'practical':{'proposal':1,'judgments':1,'interest':1,'disappearance':1},'pockets':{'on':2},'west':{'of':1,'indian':1,'salt':1,'at':1,'coast':1},'corals':{'and':1,'worms':1,'which':1},'lasting':{'power':1},'provisional':{'picture':1},'road':{'home':1},'cautions':{'to':1},'lands':{'and':1,'in':1},'fertile':{'soil':1,'land':1,'meadows':1},'sea-grass':{'a':1,'area.':1,'red':1},'spreading':{'over':1,'meadows':1},'bountiful':{'and':1},'mills.':{'sir':1,'professor':1},'haddon':{'a':2},'gambiense':{'very':1,'69':1},'einstein':{'s':1,'has':1,'the':1,'who':1},'shortening':{'of':2,'the':1},'bon':{'has':1},'shells':{'of':1,'keeping':1,'are':3,'like':1},'camouflaging':{'giving':2,'and':1,'but':1},'brute':{'associates.':1,'man':1},'appears':{'on':1,'melancholy':1,'that':2,'to':1,'therefore':1,'the':1,'or':1},'caterpillars':{'and':2,'of':1,'to':1,'through':1,'they':1,'fasten':1},'laboriously':{'manufacture':1,'taught':1},'deepened':{'interest':1},'granules':{'and':1,'are':2},'unsettled':{'parts':1},'strikes':{'these':1,'the':1,'it':1},'white.':{'and':1,'banded':1},'trouble--an':{'instance':1},'land.':{'ages':1,'illustration':1,'getting':1},'spice':{'of':1},'arranged':{'his':1,'in':5},'romantic':{'and':1},'reflex':{'arc':2,'actions':8,'.':1,'action.':1,'action':4,'response':1,'chains':1,'than':1},'vice':{'versa':1},'dordogne':{'galley':1},'arranges':{'the':1},'pre-cambrian':{'eras':1},'blackbird':{'a':1},'shell.':{'the':1,'sec':1},'mimicked.':{'the':1},'moles':{'freshwater':1,'are':1},'affection':{'for':1,'.':1},'celestial':{'objects':1},'deliberation':{'and':1},'travailing':{'becomes':1,';':1,'of':1},'fanwise':{'to':1},'deer':{'of':1,'rabbit':1},'body-making':{'is':1},'deep':{'and':1,'water':2,'cups':1,'retreat.':1,'waters':3,'isolated':1,'waters.':1,'dark':1,'reason':1,'so':1,'sea':6,'in':2,'sea--the':1,'borings':1,'cold':1,'difference':1,'lake':1,'lying':1},'general':{'and':1,'impression':1,'outlook':1,'glare':1,'features':1,'symmetry':1,'trend':1,'life':1,'statements':1,'information':1,'question':1,'ideas':7,'relations':1,'statement':1,'significance':1,'public':2,'conclusion':1,'direction':1,'terms':3,'way':5,'very':1,'reader':1,'agreement':1,'flattened':1,'astronomy':1,'outlines':1,'we':1,'colour':2,'lines':1,'rule':1,'method':1,'aim':1,'agreement.':1,'succession':1,'opinion':1,'fact':1},'imagination':{'to':1,'.':1,'of':2},'examine':{'one':1},'planets':{'and':5,'they':1,'back':1,'spinning':1,'including':1,'are':2,'in':1,'seem':1,'what':1,'from':1,'would':3,'.':4,'to':1,'drawn':2,'life':1,'showing':1,'but':1,'five':1,'besides':1,'put':3,'of':3,'together':1,'or':1,'venus':1,'round':1},'lifetime':{'will':1,'namely':1,'by':1,'.':1},'cables':{'but':1},'film':{'and':1,'of':3,'is':1,'cling':1,'on':1},'fill':{'every':3},'tedious':{'time':1},'again':{'and':6,'as':3,'are':1,'in':5,'from':1,'knowledge':1,'would':1,'there':3,'.':1,'to':2,'does':1,'recaptures':1,'meant':1,'be':1,'we':3,'after':1,'led':1,'elsewhere':1,'that':1,'becomes':1,'never':1,'but':1,'with':1,'for':1,'many':1,'the':5,'having':1},'gbnewby':{'pglaf.org':1},'retiring':{'disposition':1},'field':{'and':3,'around':1,'of':6,'is':2,'it':1,'.':2,'as':2,'book':1,'240':1,'seen':2},'prism':{'and':1,'we':2,'produces':1,'into':1,'.':3,'entering':1,'separates':1,'is':1},'unaccustomed':{'and':1},'salamanders':{'of':1},'carapaces':{'form':1},'lafayette':{'alsatian':1},'coughing':{'or':1},'shelter':{'and':1,'of':2,'with':1,'for':1},'planet.':{'so':1,'if':1},'deriving':{'their':1},'important':{'stones':1,'and':2,'because':1,'is':5,'idea':1,'general':1,'phase':1,'as':1,'in':2,'mill':1,'activity--that':1,'for':2,'to':6,'role':1,'parting':1,'was':1,'however':1,'part':4,'food-plants':1,'parasites':1,'than':1,'linkage':1,'acquisitions':1,'advance':1,'acquisition':1,'the':1,'fact':6},'itself.':{'forms':1,'of':1,'but':1,'in':1},'tackle':{'the':1},'rainbow-colour':{'.':1},'revolve':{'the':1,'round':2},'sun--a':{'kind':1},'sneeze':{'on':1,'.':1},'hoofed':{'mammals':2},'remote':{'aquatic':1,'star':1,'age':1,'antiquity':1,'future':1,'ancestors.':1,'the':1},'recapitulation':{'of':3},'casts':{'off':1},'innocent-looking':{'little':1},'burrow':{'becomes':1,'which':1,'in':1},'u':{'of':1,'the':1},'resembles':{'a':1},'ovary':{'.':1},'once':{'and':3,'adjusted':1,'useful':1,'one':1,'rotating':1,'understood':1,'in':8,'said':1,'.':1,'attained':1,'got':1,';':1,':':1,'was':2,'tell':1,'more':4,'dominant':1,'that':1,'very':2,'eight':1,'they':1,'represented':1,'a':2,'on':1,'made':1,'effective':1,'larger':1,'rule':1,'every':1,'pulled':1,'or':1},'starting':{'a':1,'new':2,'point':1,'of':1},'represent':{'the':1,'stars':1,'tentative':1},'pheasant':{'and':1,'for':1},'forget':{'the':1},'founder':{'of':1},'suns':{'many':2,'.':1,'in':1},'invariable':{'.':1},'worms':{'and':2,'like':1,'that':1,'sea-cucumbers':1,'of':1,'began':1,'but':1,'.':1,'notably':1,'to':3,'2':1,'starfishes':1,'were':1,'requires':1},'founded':{'on':1},'sunk':{'very':1,'into':1,'in':1},'cooperative':{'relations':1},'expressions':{'of':3,'have':1},'plodding':{'methods':1},'shattered':{'to':1},'red-hot':{'ball':1,'gas':2,'.':1},'brain-box':{'and':1},'inexhaustible':{'fountain':1,'floating':1,'stores':1},'former':{'.':1},'bushmen':{'.':1},'those':{'upper':1,'pieces':1,'produced':1,'excessively':1,'farther':1,'in':1,'fine':1,'whose':1,'two':1,'regions':1,'immense':1,'contained':1,'other':1,'which':3,'between':1,'open-sea':1,'we':2,'kinds':2,'elsewhere':1,'that':13,'mammals':1,'offered':1,'who':3,'problems':1,'provided':1,'now':1,'with':1,'sensational':1,'great':1,'made':1,'of':15,'days':1,'glittering':1,'called':1,'bodies':1,'at':1},'hideous':{'and':1},'turnips':{'devouring':1},'distorting':{'effect':1},'straightforward':{'.':1},'sitting':{'a':1,'among':1,'figure':1,'for':1,'156':1,'the':1},'worm.':{'the':1},'interglacial':{'period.':1,'period':1,'times':1,'times.':1,'.':1,'or':1},'sun.':{'a':1,'look':1,'this':1,'it':1,'illustration':1,'one':1,'to':1,'sec':1,'but':1,'our':1,'the':2,'laplace':1},'fall':{'a':1,'on':4,'casting':1,'is':2,'upon':2,'suggested':1,'together':1,'down':1,'without':1,'from':1,'into':4},'difference':{'and':2,'is':1,'between':4,'to':1,'saturates':1,'does':1,'in':2},'expulsive':{'force':1},'mild':{'current':1,'moist':1,'electric':1,'temperatures':1,'of':1},'forking':{'of':2},'washing':{'the':1},'benevolent':{'visitors':1},'skeletal':{'rod':1},'applicable':{'to':1,'state':1,'taxes':1},'grubs':{'and':1},'camouflaged.':{'the':1},'hollowed-out':{'cotton-reel':1},'inorganic':{'world':1,'evolution':7,'groaning':1},'economically':{';':1},'pterodactyl':{'and':1,'or':2,'wing':1},'range.':{'the':1},'selected.':{'illustration':1},'aristocrat':{'apple-trees':1},'zero':{'of':2},'perception':{'and':1,'of':1,'rapidity':1},'further':{'and':3,'slowing':1,'down':1,'books':1,'human':1,'out':1,'knowledge':1,'for':2,'opportunities':1,'experiment':1,'until':1,'revision':1,'advantage':1,'complicated':1,'with':1,'contraction':1,'inland':1,'heightened':1,'ahead':1,'found':1,'the':1,'discovery':1,'changes':1},'double-slide':{'plate':1,'plate-holder':1},'creatures':{'and':4,'appeared':1,'it':1,'sec':1,'are':3,'have':3,'in':2,'if':1,'living':1,'from':1,'varied':1,'to':1,'began':1,'there':1,'.':6,'superficially':1,'which':3,'return':1,'that':1,'may':2,'act':2,'upon':2,'but':1,'let':1,'penetrate':1,'not':1,'such':1,'with':3,'by':1,'a':1,'on':1,'like':3,'of':4,'make':2,'turn':1,'were':1,'dance':1,'the':2,'round':1},'cilia':{'shown':1,'when':1},'stood':{'in':1,'at':1,'round':1},'short-lived':{'fishes':1,'relic':1},'swamps':{'and':1,'low':1},'storks':{'and':1,'pelicans':1},'associate':{'certain':1,'the':1,'particular':1},'caffeine':{'and':1},'everlasting':{'hills.':1},'schoetensack':{'.':1},'movement':{'and':6,'all':1,'is':4,'at':1,'in':2,'251':1,'if':1,'from':1,'for':1,'recalling':1,'.':1,'which':1,';':1,'was':1,'but':1,'a':1,'on':1,'of':6,'creates':1,'can':1,'the':1,'or':1},'outgoing':{'tide':1},'malaria':{'rife':1,'respectively.':1,'from':1,'organism':2},'martians':{'draw':1},'compilation':{'of':1,'copyright':1},'calculates':{'that':1},'component':{'cells':1},'ranges':{'and':2},'favourable':{'for':1},'cylindrical':{'.':2},'operating':{'on':1},'capacities--limited':{'when':1},'standard':{'of':2,';':1},'advance--the':{'central':1},'search':{'of':1,'after':1,'for':1,'facility:':1,'.':2},'tortoise':{'and':1,'of':1,':':1,'in':1,'has':1},'ichneumon':{'grubs':1},'cock':{'with':1},'stretching':{'as':1,'from':1,'for':1},'gleams':{'of':2},'milky':{'way':15},'formation':{'of':7,'due':1,'ten':1,'in':1},'narrow':{'and':1,'core':2,'like':1,'zone':1,'crowded':1,'sheaf':1,'passage':2,'marshes':1},'beak-like':{'jaws':1},'pathological':{'variation':1},'splashes':{'in':1},'24.--the':{'great':1},'transit':{'instruments':1,'is':1,'no':1},'mastering':{'the':1},'africa':{'a':1,'and':1,'india':1,'but':1,'coloured':1,'to':1,'asia':2,';':1,'where':1},'fastening':{'them':1,'pieces':1},'most--control':{'freedom':1},'empties':{'are':1},'extinction':{'of':1,'in':1},'establish':{'themselves':2,'race':1},'readily':{'separated':1,'lifted':1,'because':1,'heard':1,'swamped':1,'classified':1,'utilised.':1,'evaporate':1,'.':1,'understood':1,'see':1,'seen':1,'captured':1},'eye':{'and':3,'sees':1,'is':1,'are':1,'in':1,'.':6,'birds':1,'there':1,'next':1,'to':1,'which':2,';':2,'has':1,'that':1,'may':1,'fell':1,'continued':1,'by':1,'these':1,'of':1,'can':1,'the':1,'glued':1},'uniformity':{'and':1},'distinct':{'and':2,'individuality':1,'elements':1,'from':2,'species.':1,'sensation':1,'ancestors--a':1,'as':1,'classes':1,'tails':1,'sparks':1,'species':1},'hillock':{'of':1},'wiped':{'out':1},'destination':{'and':1},'two':{'years':1,'straws':2,'fore-limbs':1,'fine':1,'feather-stars':1,'forms':1,'molecules':1,'main':2,'photographs':2,'moorhens':1,'doors':1,'very':1,'minute':1,'feet':3,'positions':1,'spiny':1,'humps':2,'lashes':1,'phenomena':1,'back':1,'elements':1,'magnets':1,'creatures':1,'fingers':2,'halves':1,'chimpanzees':1,'new':1,'revolved':1,'ends':2,'electricities':1,'answers':1,'atoms':2,'hours':3,'wave-motions':1,'terminals':1,'groups':4,'others':1,'quite':2,'come':1,'days':1,'opossums':2,'of':4,'months':2,'haunts':1,'extremes':1,'streams':1,'or':11,'comes':1,'reflected':1,'screens':1,'skeletons':1,'millions':1,'working':1,'spiral':1,'long':1,'.':3,'macaques':1,'stars':2,'which':1,'hundred':7,'fractions':1,'eyes':1,'inches':4,'painted':1,'thousand':3,'exactly':1,'races':1,'cases':2,'cells':1,'shelves':1,'classes':1,'minutes':1,'and':8,'suggestions':1,'metals':1,'pieces':2,'periods':1,'have':1,'in':1,'paths':1,'different':5,'perhaps':1,'things':1,'widely':1,'lithium':1,'centrosomes':1,'facts.':1,'wires':1,'kinds':6,'opposite':1,'eggs':1,'teeth':1,'sides':3,'types':3,'together':3,'chief':1,'points':3,'sets':2,'serious':1,'the':1,'bodies':2,'foetal':1},'comparing':{'these':1,'notes':1,'reptiles':1},'cultivation':{'of':1},'endowed':{'with':4,'monkeys':1},'raft':{'across':1},'ovules':{'within':1,'in':1},'lapland':{'.':1},'leisure.':{'along':1},'unlink':{'or':1},'ahead.':{'the':1},'diamond':{'the':1,'point':1,'267':1,'.':1},'staggering':{'.':1},'views--the':{'nature':1},'chimpanzee':{'and':3,'illustrating':2,'157':1,'sitting':2,'is':1,'there':1,'.':1,'gorilla':2,'s':2,'2':2,'238':1,'at':1,'the':1,'an':1,'called':1,'233':1},'magpies':{'coral-snakes':1},'controlling':{'his':1,'nerve-centres':1},'particular':{'they':1,'some':1,'paper':1,'substance.':1,'sounds':1,'things':2,'emotions':1,'colours':1,'instance':1,'state':1,'difficulties':1,'interest':1,'conditions':1,'crab':1,'combination':1,'men':1,'atoms':1,'words':1,'circumstances':1,'case':1,'kind':4,'spawning-pond':1,'items':1,'moorhen':1,'place':1,'piece':1,'order':1},'straight-haired':{'mongols':2},'it--radium.':{'that':1},'none':{'being':1,'of':6,'the':1,'knew':1,'.':1},'hour':{'passes':1,'later':1,'would':1,'radium':1,'after':1,'.':1,'at':1},'middle':{'and':1,'zone':1,'of':2,'pleistocene':1,'ages':1,'oligocene':1,'.':1,'eocene':1},'recall':{'the':3},'sucks':{'in':1,'its':1,'milk':1},'cochroaches':{'and':1},'guards':{'them':2,'the':1},'remain':{'true.':1,'to-day':1,'inert':1,'just':1,'very':1,'freely':1,'together':1,'quite':2,'coherent':1,'in':2,'latent':1,'ether':1,'glorious':1,'apart':1},'pressing':{'a':1},'taut':{';':1,'or':1,'membranes':1},'pink-flush':{'on':1},'nothing.':{'evolution':1,'it':1},'specialized':{'in':2},'marble':{'for':1},'deg':{'.':6},'stubborn':{'as':1},'compare':{'with':2,'the':1,'jupiter':1},'gravels':{'in':1},'share':{'of':2,'it':1,'appreciatively':1,'in':1},'shard':{'the':1},'sphere':{'of':1},'minimum':{'the':1,'without':1},'numbers':{'and':2,'go':1,'above':1,'of':4},'hours.':{'at':1},'sharp':{'mountain-top-like':1,'prickle':1,'mouth-parts':1,'teeth':1,'nip':1,'conical':1,'points':1},'robinson':{'showed':1},'needs':{'to':2,'with':1,'occurring':1},'awkward':{'situation':1,'alacrity':1,'feint':1},'receptacle':{'for':1},'1873-6':{'gave':1},'acts':{'on':1,'as':4,'upon':1,'in':1},'responsibilities':{'.':1},'procellaria':{'pelagica':2},'sacred':{'river-tortoises':1},'profiting':{'by':2},'stir':{'water':1},'ensemble':{'of':1},'indian':{'and':2,'islands':1,'macaque':1,'ocean':1},'advice':{'to':1},'genius.':{'illustration':1},'narrow-beaked':{'crab':1},'tangere':{'leave':1},'blood':{'and':1,'corpuscles':2,'from':1,'relationship':1,'of':5,'is':1,'never':1,'it':1,'throughout':1,'.':4,'to':1,'as':1,'goes':2,'injected':1,'the':1,'has':1,'bringing':1,'or':3},'polynesian':{'mariners':1},'coming':{'and':1,'from':1,'down':2,'to':1,'with':1,'by':1,'out':1},'bloom':{'with':1},'response':{'to':1,'the':1,'from':1},'alps':{'at':1},'reappeared':{'his':1},'crowded':{'meteors':1,'when':1,'with':1,'haunt':1,'difficult':1},'coat':{'to':1,'used':1,'helps':1},'eats':{'its':1},'dragon':{'the':1,'flying':1,'draco':1,'94':1},'coal':{'burns':1,'consider':1,'would':1,'supply':1,'derived':1,'deposits':1,'for':1,'which':1,'.':3,'or':1},'skilful':{'artificer':1},'playing':{'mammals':1,'is':1,'period':2,'possum':1,'the':1,'with':2},'covered':{'a':1,'great':1,'over':1,'all':1,'everything':1,'the':3},'chopped':{'earthworm':1},'infant':{'and':1,'s':1,'.':1,'about':1,'three':1},'rounded':{'skull':2},'winged':{'phase':1,'snails':1,'insect.':1},'much-disputed':{'lines':1},'hypertext':{'form':1},'quiet-looking':{'cloud':1},'lumpsucker':{'mounts':1,'guards':1},'through':{'and':2,'it':3,'one':1,'our':1,'any':2,'unthinkably':1,'space':1,'.':1,'which':3,'orange':1,'1.e.7':2,'them':3,'his':1,'trees':1,'estuaries':1,'every':1,'but':1,'denser':1,'contrasts':1,'an':4,'a':19,'stone':1,'glass':1,'these':2,'air':2,'this':2,'the':54,'stages':1,'its':3,'bodies':1},'lava':{'rising':1},'filters':{'and':1},'existence':{'what':1,'135':1,'of':6,'is':3,'it':1,'.':2,'namely':1,'without':1,'are':1,'animal':1,'in':2,';':1,'by':1,'as':1,'if':2},'visceral':{'clefts':2},'bell-like':{'blossoms':1},'soddy':{'has':1,'frederick':1,'have':1,'puts':1,'one':1},'24':{'the':1,'were':1},'25':{'and':1,'of':1,'trillions':1,'000':6},'26':{'and':1,'we':1,'000':2,'tons':1},'27':{'illustration:':1,'000':1},'thrilling':{'a':1,'story':1},'21':{'1914.':1,'.':1},'22':{'from':1,'would':1,'tons.':1,'yerkes':1,'miles':1,'2007':1},'sodium':{'is':1,'lines':1,'iron':2},'rigel':{'466':1},'physophora':{'hydrostatica':2},'28':{'the':1,'deg.-34':1,'mars':1},'29':{'1919':1,'a':1,'drawings':1,'1908':2,'1919.':1},'late':{'polished':1,'professor':3,'years':1,'autumn':1,'as':1,'triassic':1,'.':1},'detected':{'a':1,'anywhere':1},'microscopic':{'cilia':1,'burdens':1,'organisms':1,'food':1,'study':1,'globules':1,'fertilised':1,'animal':3,'each':1,'animals':1,'algae':1},'--and':{'that':1},'bugbear':{'it':1},'sheaves':{'in':1},'triumphantly':{'from':1},'beginnings.':{'our':1},'good':{'and':1,'atmosphere':1,'old':2,'deal':6,'reasons':1,'idea':1,'as':3,'seed':2,'in':1,'insulators':1,'will':1,'touches':1,'.':2,'instance':1,'samples':1,';':2,'conditions':1,'eyes':1,'send-off':2,'illustration':1,'reason':1,'restoration':1,'purpose':1,'pair':1,'many':1,'second':1,'example':2,'practical':1,'conductor--six':1,'temper':1,'heel':1},'seeking':{'rather':1,'automatically':1},'gardens.':{'the':1},'sappers':{'and':1},'noticing':{'the':1,'that':1},'walls':{'and':1,'of':6,'so':1,'are':1,'nor':1},'compound':{'reflex':2},'olcott':{'field':1},'detach':{'or':1},'struggling':{'too':1},'association':{'a':1,'established':1,'and':1,'of':2,'professor':1,'when':1,'to':1,'which':1,'between':1,'meeting':1},'limpet':{'s':1},'mystery':{'of':1,'they':1,'drowned':1,'.':1},'easily':{'tamed':1,'be':1,'acquiesce':1,'blown':1,'supported':1,'washed':1,'selected.':1,'called':1,'as':1,'disturbed':1,'part':1,'seen':1,'get':1,'find':1,'comply':1},'deteriorates':{'.':1},'fish-like':{'characters':1},'evade':{'the':3},'abdomen--for':{'the':1},'ashes':{'of':1},'habits':{'and':5,'all':1,'there':1,'.':2,'while':1,'which':1,';':1},'2a':{'orohippus':1},'repeating':{'the':1},'possession.':{'if':1},'exquisite':{'tactility':1,'refinements':1},'horsetail':{'and':1},'harm':{'in':1},'everyone':{'is':2,'who':2,'recognises':1,'knows':1},'mental':{'activities':1,'life':2,'endeavour':1,'ability':1,'inheritance':1,'pictures':1,'subtlety':1,'life;':1,'equipment':2,'experimenting':1,'health':1,'aspect':1,'activity':1,'images':1,'aspect.':1,'mill':1,'endowment':1,'side':2,'powers':1,'qualities':1},'hundred':{'and':2,'trillion':4,'varieties':1,'strokes':1,'of':1,'thousand':2,'million':4,'years':2,'ways':1,'planetoids':1,'degrees':2,'stars':1,'in':1,'miles':3,'the':1,'times':1,'odd':1,'generations.':1,'millions':1},'hare':{'willow':2,'it':1,'.':1,'may':1,'s':1,'in':2,'the':1,'or':1},'hard':{'and':2,'saying':1,'work':2,'times':1,'substratum':1,'to':4,'in':2,'legs':1,'or':1,'red':2},'idea':{'that':4,'of':13,'is':1,'but':1,'how':1,'has':1,'was':1,'or':1},'foxes':{'and':2,'stoats':1},'macmillan':{'the':2,'.':4},'oil':{'on':2,'from':1,'is':1,'upon':1,'down':1,'must':1},'schuchert':{'again:':1,'s':1},'connect':{'them':1},'ripple':{'of':1},'hart':{'the':1,'is':1},'antarctic':{'circle--which':1,'shore':1},'shoulders.':{'the':1},'flower':{'and':4,'puts':1,'is':1,'.':1,'basket':3,'collects':1},'associations.':{'there':1},'pigeon':{'a':1,'because':1,'212':2,'gliding':1,'is':1,'continues':1,'s':1,'but':1,'brooding':1,'carrier':1,'which':1},'acting':{'on':3,'upon':2},'49.4':{'rigel':1},'flowed':{'along':1},'print':{'editions':1},'three-quarter':{'days':1},'waterholes':{'full':1},'rejuvenescence':{'e.g':1},'circumstance':{'that':1},'dealt':{'with.':1,'with':6},'extraordinary':{'protrusion':1,'strength':1,'proceeding':1,'power':1,'variety':1,'educability':1,'things':2,'results':1,'vigour':1,'therefore':1,'interest':1,'outbursts':1,'properties':1,'adaptability':1},'terminals':{'thus':1,'.':1},'members':{'of':12,'at':1},'backed':{'by':3},'entrancing':{'interest.':1},'beginning':{'again':1,'for':1,'this':1,'of':35,'when':1,'it':1,'.':1,'to':5,'at':1,'in':2,'was':2,'with':2},'poles.':{'our':1,'there':1},'demands.':{'as':1},'snails':{'various':1,'or':1},'omit':{'one':1},'brain...':{'.':1},'audacity':{'to':1},'72-inch':{'reflector':1},'varanus':{'139':1,'the':1},'down--sometimes':{'dangerously':1},'exercising':{'the':1},'reinforced':{'by':1},'copper':{'and':1,'wires':1,'coin--smaller':1,'that':1,'immersed':1,'in':1,'together':1,'.':1,'age.':1,'wire':3,'zinc':2,'were':1,'beech':1,'age':1,'is':5,'came':1},'bullies':{'of':1},'disregarded':{'only':1},'instances':{'of':1,'where':1,'must':1},'7918':{'1':1},'done':{'is':1,'.':1,'to':1,'as':1,'with':1,'by':1},'vibrate':{'about':1,'.':1,'in':1},'climbing':{'grasping':1,'up':1},'cups':{'whereas':1},'island-universes':{'they':1},'family.':{'viviparity':1},'light-gatherer':{'.':1},'construct':{'a':2},'hollows':{'of':1},'obligatory':{'movements':1},'183':{'evolutionary':1},'assumption':{'of':2},'186':{'photograph':1,'nautilus':1,'shoebill':1,'000':7},'187':{'photo':1},'statement':{'will':1,'that':4,'often':1,'in':1},'185':{'000':1},'rates':{'.':1},'compartment':{'a':1,'b':1,'was':1},'too':{'faint':3,'plainly':1,'simple':1,'soon':2,'high':2,'inhospitable':1,'cold':3,'thick':1,'stingy':1,'easygoing':1,'little':1,'deeply':1,'there':1,'long':1,'hot':2,'much':6,'sheltered':1,'was':1,'complete':1,'shallow':1,'generous':1,'complicated':1,'closely':1,'precious':1,'great':1,'short':1,'large':1,'severe':1,'were':2,'small':2,'serious':1,'soft':1},'muscles':{'and':4,'of':2,'to':1,'going':1,'are':1,'which':1,'in':1,'than':1,'at':1},'travail':{'of':1},'lightest':{'hydrogen':1,'atom':2},'needle':{'on':1,'magnified.':1,'.':1},'park':{'in':1},'procession':{'of':3,'or':1},'part':{'the':1,'corresponding':1,'for':1,'vaporised':1,'of':54,'into':1,'in':3,'.':1,'to':3,'at':1,'under':1,'obscure':1,'with':4,'company':1},'parr':{'become':1,'about':1,'which':1},'prodigious':{'expulsive':1,'speed--and':1,'speed.':1,'outpour':1,'quantities':1,'age':1,'.':1,'scale.':1,'rapidity':2},'selenium-cell':{'which':1},'believe':{'that':11,'in':1,'an':1,'to':1,'were':1,'the':1,'by':1},'don.':{'it':1},'jump':{'at':1,'out':1},'supposes':{'that':2},'b':{'c':1,'that':1,'of':1,'showing':1,'there':1,'when':2,'it':1,'.':7,'in':1,'some':1,'alteration':1,'others':1},'parent--little':{'likely':1},'damages':{'even':1,'costs':1,'-':1},'clodd':{'story':1},'866':{'000':1},'recording':{'of':1},'dissection--or':{'screwing':1},'totteringly':{'for':1},'supposed':{'that':4,'dead':1,'to':4,'indication':1,'have':1,'the':1,'he':1},'messrs.':{'macmillan':3},'treated':{'merely':1},'anthropoid':{'embryo':1,'stock--common':1,'apes':7,'apes--the':3,'type.':1,'apes.':1,'ape':4},'rhacophorus':{'that':1},'efface':{'itself':1},'trifles':{'felted':1},'pre-existing':{'organisms':1},'ages':{'and':3,'set':1,'afterwards':1,'is':1,'sec':2,'in':1,'before':1,'living':1,'organisms':1,'there':1,'had':1,'.':4,'to':2,'which':3,';':2,'has':1,'was':1,'be':1,'we':1,'passed':6,'necessity':1,'along':1,'he':1,'ago':2,'many':1,'of':1,'the':3,'or':1},'left-handed':{'vortices':1},'egg.':{'very':1,'8':1,'3':1},'paltry':{'pigmies':1},'agee':{'when':1},'confirms':{'our':1},'fading':{'away':1},'paths':{'a':1,'of':1,'round':1,'pursued':1},'acid':{'and':1,'water':1,'indigo':1,'caffeine':1},'built':{'a':1,'and':1,'elastic':1,'on':1,'of':1,'up':10,'as':1,';':1,'with':1},'depending':{'upon':1},'trip':{'sideways':1,'which':1},'majority':{'of':7,'is':1,'are':1},'lifts':{'a':2,'the':1},'build':{'a':2,'up':5,'but':1},'deepening':{'hold':1},'sea-perches':{'live':1},'facts.':{'sec':1},'unpalatability':{'or':1},'easygoing':{'kind':1,'conditions':2,'the':1,'swimmers--for':1},'capillaries':{'of':1},'sciences.':{'the':1,'it':1},'eggs':{'and':5,'into':1,'are':2,'have':1,'in':7,'close':1,'during':1,'lie':1,'develop':3,'perhaps':1,'two':1,'.':5,'to':1,'only':1,'which':4,';':1,'77':1,'i.e':1,'with':1,'by':2,'a':1,'on':1,'of':2,'inside':2,'attached':1,'were':1,'or':4},'trains':{'lit':1,'of':1,'and':1},'salmon':{'spawn':2,'do':1,'in':1,'of':1,'is':1,'196':1,'surmounting':1,'leaping':2,'.':1,'1':1,'s':1,'keeps':1,'fry':1,'still':1,'was':1,'or':1,'as':2},'tail-feathers':{'braced':1},'took':{'origin':1,'a':1,'his':1,'longer':1,'advantage':2,'no':1,'flying':1,'up':1,'element':1,'as':1,'place':2,'so':1,'the':2},'depths':{'of':4,'showing':1,'119':1,';':1,'whence':1},'most':{'obdurate':1,'beautiful':2,'primitive':4,'debased':2,'remarkable':4,'people':4,'powerful':4,'valuable':1,'far-reaching':1,'multicellular':1,'bones':1,'inconspicuous':1,'diverse':1,'distant':3,'commonly':1,'abstruse':1,'intricate':1,'fishes':1,'birds':2,'resourceful':1,'impressive':2,'living':1,'salient':1,'daring':1,'patent':1,'interesting':2,'favour':1,'chemical':1,'to':1,'complex':1,'attractive':1,'laborious':1,'mammals':2,'mysterious':3,'promise.':1,'important':8,'difficult':1,'we':1,'popularly':1,'general':1,'scientific':1,'spectacular':2,'intimate':1,'successful':1,'familiar':1,'apparent':1,'convincing':1,'significant':1,'notably':1,'eminent':2,'part':1,'enduring':1,'recent':1,'authorities':1,'cases':9,'trying':1,'monkeys':1,'fascinating':2,'puzzling':1,'a':1,'land':1,'animals':2,'playsomest':1,'effective':2,'famous':1,'marvellous':1,'of':16,'signal':1,'countries':1,'metals':1,'enemies.':1,'distinguished':3,'project':1,'solid':2,'severe':1,'dramatic':1,'tempting':1,'distinctive':1,'ancient':3,'astonishing':1,'essential':1,'extraordinary':1},'petromyzon':{'marinus':2},'significant':{'as':1,'periods':1},'fluctuate':{'the':1},'branching':{'air-tubes':1},'transmissibility':{'of':1},'charitable':{'donations':1},'seething':{'foam':1,'mass':1,'vapours':1},'mammoth':{'drawn':2,'tube':1,'woolly':1,'age':1,'the':1},'weigh':{'a':2,'about':1,'only':1,'them':1,'approximately':1},'overcrowding':{'of':2},'organism':{'explores':1,'reproduced':1,'that':1,'may':1,'is':2,'acts':1,'which':1,';':1,'plays':1,'the':2,'its':1},'thomas':{'henry':2},'secrets.':{'the':1},'particularly':{'rich':1,'characteristic':1,'fond':1,'disposed':1,'important':1,'suited':1,'in':1,'memorable':1},'217':{'the':1},'obligations':{'and':1,'has':1},'fins':{'and':1,'on':1,'used':1,'of':1,'as':1,'taut':2},'scattered':{'the':1,'throughout':1,'was':1,'hither':1,'in':1},'converge':{'in':1},'wasted':{'in':1,'.':1},'shore-pool.':{'sec':1},'relation':{'to':3,'between':3},'carefully':{'just':1,'read':1,'there':1,'considered':1,'examine':1,'drawn':2},'212':{'photo':2},'amphibians.':{'as':1,'palaeozoic':1,'in':1},'fine':{'art':1,'crown':1,'results':1,'textbook':1,'powder':1,'suspended':1,'children':1,'creatures':1,'bulbs':1,'inequalities':1,'particles':2,'enough':1,'details':1,'vapour-like':1,'specimens':1,'product':1,'description':1,'brains':1,'time-recording':1,'translucent':1,'cross-striped':1,'photograph':1,'sections':1,'work':1,'balance':1,'example':1},'find':{'all':1,'some':1,'it':2,'in':3,'any':1,'out':4,'no':2,'two':1,'their':2,'enough':1,'much':1,'if':1,'reflex':1,'them':1,'that':11,'they':1,'included':1,'by':2,'a':4,'none':1,'these':2,'solid':1,'the':5},'downward-projecting':{'sharp':1},'giant':{'recently':1,'instruments':1,'spiral':3,'amphibians':1,'planet':1,'amoeba':1,'reptiles':2,'stars':1,'elephant':1,'whirlpools':1,'reptiles.':1},'double.':{'after':1},'depended':{'and':1,'on':1},'dividing':{'the':1,'into':2,'themselves':1,'as':1},'nervous':{'disturbance':1,'restlessness':1,'system.':1,'system':4,'excitement':1,'rhythm.':1},'bird--was':{'about':1},'distributed':{'old-fashioned':1,'project':1,'to':1,'proofreading':2,'in':1,'throughout':1,'by':1},'unhappy':{'over':1},'lockyer':{'sir':1,'detected':1,'pointed':1},'convoluted':{'.':1},'eruptions':{'at':1},'credulous':{'and':1},'8':{'and':1,'with':1,'there':1,'.':2,'in.':1,'other':1,'100':1,'minutes':2},'gills':{'again':1,'except':1,'.':3,'are':1,'which':2,';':3},'stringops':{'and':1},'merged':{'into':1},'indetal':{'is':1},'forreri':{'which':2},'dust':{'and':1,'no':1,'of':4,'.':2,'to':1,'at':1,'although':1,'in':5},'permission':{'and':1,'from':8,'for':1,'of':15,'.':1,'in':1},'express':{'a':2,'and':1,'the':1,'themselves':1,'or':1},'water-vole':{'and':1},'shore-pools':{'and':2,'makes':1,'in':1},'cheaper':{'.':1},'courage':{'and':1},'breast':{'pocket':1},'silk':{'tassel':4,'from':1,'handkerchief':1,'.':2,'threads':1,'across':1},'target':{'on':1},'transitional':{'experience':1,'between':1},'experiments.':{'illustration':1},'freedom.':{'the':1},'doubled':{'straw':1,'their':1,'over':1},'1825-95':{'86':1,'one':1},'common':{'and':1,'among':1,'habit':1,'is':1,'in':1,'at':2,'sense':1,'insectivore':1,'knowledge':1,'to':4,'chameleon':2,'foraminifer':2,'frog':1,'.':1,'hydra':1,'assumption':1,'animal':1,'chaffinch':1,'stock':1,'mud-skipper':1,'starfish':2,'centre':1,'showing':1,'ancestry--are':1,'shore-crab':2,'objects':2,'drone-fly':1,'from':1,'telescopes':1,'otter':2,'accident':1,'basis':1,'eel':3,'ancestry':1},'doubles':{'of':1},'experiments;':{'and':1},'immigrants':{'from':1},'tended':{'to':2},'disc-like':{'collection':1},'lion':{'.':1},'individual':{'is':1,'life':2,'at':1,'in':1,'movements':1,'from':1,'stands':1,'opportunities':1,'to':1,'stars':1,'has':1,'development':6,'variability':1,'plant':1,'hairs':1,'but':1,'atoms':1,'nurture':1,'types':1,'these':1,'work':1,'experience':3,'liberty':1,'project':2,'habits':1,'can':1,'the':1,'works':1,'ears':1},'starfishes':{'is':1,'spend':1,'sea-urchins':1},'medley':{'of':1},'long-fingered':{'pterodactyl':1},'tender':{'plant':1,'all':1},'forthcoming':{'for':1},'hole':{'and':2,'is':2,'before':1,'only':1,'in':1},'rays.':{'illustration':1},'gunnel':{'escape':1},'degree':{'of':12,'an':1,'which':1,'in':1,'not':1,'the':1,'.':1,'than':2},'halved':{'along':1},'please':{'read':1,'visit':1,'check':1},'splendidly':{'active':1},'halves':{'of':1,'the':1},'smallest':{'particle':2,'web-footed':1,'atom.':1,'french':1,'atom':2,'known':1},'planarians':{'and':1},'vascular':{'hood':2,'tufts':1},'to.':{'during':1},'mouthful':{'of':1},'donate':{'royalties':1,'section':1,'please':1},'sexual':{'reproduction':2},'beetling':{'ape-like':1,'eyebrows':1,'brows':1,'eyebrow':2},'historical':{'evolution':1,'succession':1,'or':1,'fact':1,'evidence':1},'masterful':{'more':1},'deliberately':{'selecting':1},'vanishing':{'mammals':1},'half-hour':{'longer':1},'reverse':{'the':1,'.':1},'journeyed':{'three':1},'annual':{'amount':1},'sons.':{'professor':1,'skeletons':1},'foreign':{'elements':1},'quadruped':{'.':1},'protopterus':{'91':1,'it':1},'elliot':{'fry':1},'point':{'and':1,'on':3,'we':1,'to':9,'that':1,'very':1,'of':9,'is':7,'though':1,'it':1,'.':5,'sound':1,'let':1,'the':3,'forty-five':1,'where':1,'out':1},'simple':{'protists':1,'and':2,'calculation':1,'instincts':1,'worms':1,'one':1,'multicellular':1,'as':1,'bibliographies':1,'creatures':3,'living':1,'many-celled':1,'one-celled':1,'there':1,'ideas':1,'process':1,'book':1,'electrical':1,'animal':1,'maze':2,';':1,'reflex':3,'sort':2,'experiment':1,'worm-types.':1,'that':1,'labyrinth':1,'but':2,'wave':1,'consideration':1,'cases':1,'flagellates':1,'outline':1,'tentatives':1,'form':1,'beginnings':1,'problem':1,'piece':1,'predatory':1},'unremitting':{'vibration':1},'smother':{'many':1},'knipe':{'s':6},'newborn':{'earth--the':1,'cuttlefish':1,'pigling':1},'electrons.':{'this':1,'when':1,'sec':1,'it':1,'illustration':1},'simply':{'a':1,'because':1,'that':2,'to':1,'thin':1,'with':1,'told':2},'unsuccessful':{'movements':1},'zeta':{'orionis':2},'throughout':{'and':1,'set':1,'that':1,'to':1,'the':13,'numerous':1,'its':1},'suppressing':{'useless':1},'expensive':{'and':1},'transformations':{'of':1},'meteorite':{'i.e':1,'or':1,'which':3},'create':{'fresh':1,'are':1,'or':2},'vertebrate':{'race':1,'at':1,'characters':1},'screened':{'the':1},'rivals':{'a':1,'in':2},'secret':{'of':6,'under':1,'from':1,'was':1,'phosphorus':1},'dropping':{'on':1},'stoat':{'becomes':1},'experiments--indications':{'of':1},'astonishment':{'a':1},'slips':{'down':1},'doles':{'of':1},'gas':{'and':3,'shot':1,'less':1,'expanding':1,'is':1,'it':1,'four':1,'as':1,'at':1,'in':3,'still':1,'would':1,'no':2,'there':1,'when':1,'.':2,'glowing':1,'which':1,';':1,'was':1,'be':1,'they':1,'absorbs':1,'about':1,'bill':1,'identified':1,'will':1,'were':1,'the':2,'cooled':1},'gap':{'to':1,'between':1},'vane':{'for':1},'waves--the':{'ultra-violet':1},'tupaia':{'began':1},'likened':{'our':1},'top--the':{'falling':1},'grains':{'of':2},'solid':{'body':2,'core':1,'and':1,'or':1,'liquid':1,'gold':1,'body.':1,'of':1,'could':1,'crust':2,'.':1,'substratum':1,'matter':1,'iron':1,'in':1,'earth':5,';':1,'earth--a':1,'the':1,'is':1,'ground':1},'tree-porcupines':{'and':1},'bill':{'and':1,'adapted':12,'where':1,'would':1},'eclipsed':{'when':1},'cluster':{'of':3,'is':1,'in':3},'plovers':{'lie':1},'replaced':{'by':9},'teaspoonful':{'of':1},'rhinoderma':{'of':1},'schultze':{'.':2},'eclipses':{'can':1},'manner':{'of':3,'away':1,'.':1,'born.':1,'at':1,'rarely':1},'youthful':{'stages':1},'adjusts':{'its':1},'debased':{'with':2},'century':{'we':1,'telescope':1,'that':2,'when':1,'.':4,'the':1,'was':1},'violently':{'and':3,'agitated':3},'metazoa':{'.':1},'regius':{'professor':1},'itself':{'and':3,'because':1,'is':3,'back':1,'an':1,'as':2,'registers':1,'through':1,'at':1,'in':5,'out':1,'again':1,'what':1,'for':1,'.':4,'to':6,'which':2,';':1,'millions':1,'until':1,'more':3,'tentatively':1,'that':1,'along':1,'with':3,'by':1,'he':1,'a':1,'on':1,'up':1,'the':2,'or':1},'atom--the':{'new':1},'saline':{'matter':2},'salina':{'that':1},'evading':{'this':1,'or':1},'discourse':{'.':2},'copying':{'and':1,'distributing':1,'displaying':1,'or':1},'leisurely':{'life':1},'ray':{'of':10,'lankester':4},'sapiens':{'the':1},'alertness.':{'ii':1},'non-digitate':{'paired':1},'eels':{'ascending':1,'are':1,'seem':1,'circumvent':1,'or':1,'illustrate':1},'keys':{'by':1},'leopard':{'is':1,'the':1},'deperet':{'transformation':1},'moment':{'a':1,'to':1,'.':1,'how':1,'s':1,'in':1,'the':3,'by':1},'purpose':{'and':1,'of':1,'is':1,'and--it':1,'here':1,'.':1,'they':1,'such':1,'the':1,'with':1},'timid':{'orioles':1},'circumvented':{'by':1,'.':1},'predecessors':{'rather':1,'of':2,'we':1},'gestures':{'and':1},'organically':{'enregistered':1},'task':{'of':1},'noli':{'me':1},'craves':{'for':1},'gambier':{'bolton.':6},'thoroughly':{'terrestrial':1,'aquatic':1,'aerial':1,'well':2,'it':1,'erect':1,'protected':1},'chemistry':{'and':1,'.':2},'spend':{'their':2,'much':1,'half':1},'examining':{'a':1},'matter.':{'a':1,'lockyer':1,'hitherto':1,'so':1,'another':1,'he':1},'snow':{'mouse':1,';':1,'upon':1,'or':1,'.':4},'profoundly':{'and':1,'influenced':1},'shape':{'and':2,'irresistibly':1,'from':1,'for':1,'that':1,'of':6,'they':1,'changes':1,'change':1},'atomic':{'theory':1,'weight':3,'energy':3,'weights':1,'numbers':1,'in':1,'reservoirs':1},'matter;':{'a':1},'alternative':{'reactions':1,'pathways':1,'but':1,'between':1},'unawares.':{'professor':1},'riki-tiki-tavi':{'which':1},'apes.':{'man':1},'timber':{'for':1},'letting':{'it':1},'superficial':{'differences':1,'work':1,'resemblance':1,'.':1},'cut':{'glass--the':1,'the':1,'up':1,'that':1},'developed.':{'nor':1},'alternate':{'directions--an':1,'format':1},'hereditarily':{'.':1},'source':{'may':1,'of':15,'which':1},'twig-insects':{'put':1},'follow.':{'since':1},'round-mouths':{'cyclostomes':1},'snap':{'at':1,'in':1},'hydrosphere.':{'formative':1},'ganglia':{'.':1},'excited':{';':1,'clucking':1},'silken':{'balloon.':1,'threads':1,'cocoon--the':1},'overhanging':{'bank':1},'big':{'and':1,'telescope':1,'spring':2,'canine':1,'sea-anemone':1,'brain':3,'as':1,'legacy':1,'simply':1,'seal':1,'toe.':1,'clock':1,'forehead':1,'toe':2,'robber-crab':2,'full':1,'brains':2,'lens':1,'with':1,'collar':1,'tree':1,'worm':1,'eyebrow':1,'seeds':1,'fact':5},'adventures.':{'there':1},'smallness':{'by':1},'far-fetched':{'and':1},'disappeared.':{'there':1},'life--a':{'progress':1},'bit':{'of':5},'stingless':{'.':1},'knock':{'over':1,'against':1},'photosphere--the':{'sun':1},'degenerated':{'in':1},'follows':{'a':1,'on':1,'from':2,'that':3,'an':1,'therefore':1,'the':1},'flux':{'and':1,'is':1,'in':1},'indication':{'of':2,'that':1},'beyond-blue':{'waves':1},'cotton-reel':{'as':1,'attached':2},'cloudlets':{'cannot':1,'come':1},'complicated.':{'sec':1},'gibbon.':{'bone':1},'valleys':{'.':1},'often':{'beautiful':1,'exhibit':1,'flies':1,'followed':1,'flapped':1,'pays':1,'overlooked':1,'float':1,'some':1,'libelled':1,'crop':1,'an':1,'say':1,'been':2,'vitally':1,'at':2,'in':2,'touch':1,'seen':1,'dug':1,'nests':1,'linked':1,'seems':1,'forced':1,'given':1,'from':1,'also':1,'apparently':1,'faint':1,'reminded':1,'outside':1,'expressed':1,'find':1,'attracted':1,'only':1,'complex':1,'easy':1,'buys':1,'got':1,'swims':1,'gets':1,'intelligent':1,'grows':1,'shows':1,'poor':1,'badly':1,'attended':1,'to':1,'make.':1,'very':3,'great':1,'safe':1,'about':2,'it':1,'saves':1,'succeed':1,'a':3,'become':1,'not':1,'associated':1,'revealed.':1,'subtle':1,'is':1,'fly':1,'and':1,'made':2,'created':1,'did':1,'of':1,'when':1,'with':4,'reads':1,'different':1,'adjust':1,'so':1,'.':1,'found':3,'lined':1,'involves':1,'referred':1},'absolutely':{'true':1,'essential':1},'hair-like':{'whilst':1},'triceratops':{':':2},'abundantly':{'these':1,'tenanted':1},'back':{'and':6,'into':1,'as':1,'at':1,'in':1,'our':1,'still':1,'again':2,'from':2,'for':1,'downwards':2,'.':1,'to':20,'which':1,';':1,'over':1,'becomes':1,'illustration':1,'125':1,'affording':1,'with':1,'by':3,'of':11,'sometimes':1,'became':1,'teeth':2,'the':1,'or':1},'evolution--there':{'is':1},'martian':{'day':2},'examples':{'of':5},'mirror':{'and':1,'for':1,'produces':1,'is':4,'.':1,'the':1,'than':1},'candle':{'but':1},'ourselves':{'to':2,'into':1,'here':2,'.':1,'how':1,'the':2,'quite':1},'pronounced':{'that':1},'crooked':{'stick':1},'condensed--who':{'can':1},'contacts':{'between':1},'affects':{'the':1},'per':{'hour':1,'second':3,'cent':5,'hour.':1,'step':1,'minute':1},'brain-case':{'of':2},'too--the':{'rabbit':1},'eliminate':{'useless':1},'king-crab':{'limulus':1},'peg':{'pulls':1},'11.--mars':{'october':1},'good.':{'bibliography':1},'scaly':{'fore-limbs':1,'covering':1},'stilt-like':{'legs':1},'life-history':{'of':7,'into':1,'.':1,'for':1,'to':1},'patient':{'with':1},'magnifies':{'this':1},'300':{'000':2,'chickens':1,'times':2},'peculiarly':{'interesting':1,'penetrating':1,'liable':1},'continuing':{'the':1,'.':1,'before':1},'fed':{'on':1,'when':1,'by':1,'.':1},'subconscious':{'cerebration':1},'more-pork':{'or':3},'flanks':{'and':1},'times--glacial':{'and':1},'feigning':{'death':3},'web-wing':{'of':1,'or':1},'nematodes':{'many':1},'piled':{'around':1},'ounce':{'or':1},'offshoot':{'is':1,'from':5},'consequently':{'the':1,'good':1,'changed.':1},'tree-loving':{'animals':1},'aliens':{'like':1},'night-light':{'noctiluca':1},'invading':{'the':1},'inhospitable':{'had':1},'gramme':{'of':1,'.':1},'relapses':{'to':1},'realisation':{'of':1},'deep-violet':{'light-waves':1,'waves':2},'ontario':{'about':1},'live-and-let-live':{'compromise':1},'plane.':{'the':1},'drosophila':{'among':1},'mudstones':{'and':2,'which':1},'trying--the':{'deep':1},'infected':{'with':1,'by':1},'manifested':{'by':1,'in':1},'checks':{'online':1},'forward':{'past':1,'to':2,'as':1,'by':1,'.':1},'examination':{'of':4},'adjusting':{'their':1,'its':1},'exterminated':{'the':1},'niagara':{'we':1,';':1,'are':1,'for':1,'falls':2},'boys':{'place':1},'quiescent':{'well-protected':1,'pupae':1},'hopes':{'that':1},'role':{'of':1,'in':2},'hipparion':{';':1},'directed':{'forwards':1},'blanketing':{'the':1},'non-existence':{'they':1},'rejection':{'of':1},'casein':{'which':1},'detachable':{'electrons':1},'generating':{'strong':1},'lungbooks':{'.':1},'planet':{'and':3,'on':1,'from':1,'around':1,'turns':1,'is':3,'after':1,'neptune':1,'but':2,'.':4,'will':1,'to':2,'s':1,'so':1,'always':1,'venus':2,'might':1,'the':1},'fitter':{'folk':1},'exploration':{'of':2},'planes':{'.':1},'water-bag':{'over':1},'groove':{'.':1},'sea-urchin':{'s':2,'which':1},'recognition':{'among':1,'of':2},'sort':{'and':1,'of':28,'when':1,'at':1,'may':1},'constant':{'interchange':1,'movement.':1,'temporary':1,'temperature':1,'state':2,'able':1,'spectrum':1,'effect':1,'amount':1,'in':1,'movement':1},'punnett':{'that':1},'expedition':{'1873-6':1},'metal':{'tags':1,'uranium':1,'globe':1,'that':1,'ages':1,'to':1,'ages.':1,'displays':1,'the':1,'vapour':1,'is':1,'vapours':1},'scarlet':{'solar':2},'single':{'word':2,'cubic':1,'molecule':1,'young':1,'feature':1,'cell':2,'prism':1,'electron':1,'grain':4,'gramme':1,'leaf':1,'atoms':1,'cell--a':1},'clever':{'synthetic':1,'associations':1,'dwarf':1,'things':2,'dog':2,'as':4,'in':1,'creatures':1},'curl':{'of':1},'dragging':{'effect':1},'prevail':{'.':1},'brethren':{'by':1},'corners':{'being':1,'of':3,'in':1},'biology.':{'the':1},'dimmed':{'by':1},'teemed':{'with':1},'confine':{'ourselves':1},'explaining':{'a':1,'positive':2,'the':1},'best--':{'a':1},'accidental':{'introductions':1,'discovery':1},'neck.':{'illustration':1},'heir':{'is':1},'surface--before':{'in':1},'prepared':{'chemical':1,'the':1,'spectrum':1},'lively.':{'illustration':1},'restoration':{'of':1,'by':3,'modelled':6,'shows':1},'relatives.':{'illustration':1},'utterly':{'dependent':1,'extinct':1,'beyond':1,'artificial':1},'fishes':{'and':5,'emerge':1,'appeared':1,'is':1,'191':1,'it':1,'as':1,'are':2,'in':2,'moreover':1,'saw':1,'before':1,'perhaps':1,'pay':1,'there':2,'had':1,'.':5,'to':2,'much':1,'which':3,'crustaceans':2,'probably':1,'was':1,'do':1,'we':1,'utilise':1,'that':1,'becomes':1,'males':1,'120':1,'cannot':1,'fishes':1,'such':1,'hold':1,'continued':1,'a':1,'like':3,'these':1,'of':1,'could':1,'will':1,'near':2,'were':3,'the':3},'stoppages':{'register':1},'desert':{'where':1},'worsted':{'instinctive':1,'mistake':1},'implies':{'a':2,'ability':1,'that':2,'rather':1,'certain':1,'becoming':1,'an':1,'complexity':1,'if':1},'vehicles':{'of':2},'speculations':{'.':1},'responded':{'to':1},'ascertained':{'is':1},'unhatched':{'crocodile':1,'or':1},'presenting':{'the':1},'ignoramus':{':':1},'failures':{'notably':1,'which':2,'that':1},'ready-made':{'capacities':1,'centres':1,'responses':1,'cleverness':1,'or':2},'tube':{'and':3,'a':1,'fertilises':1,'that':1,'of':1,'began':2,'258':1,'.':5,'bringing':1,'s':1,'as':1,'are':1,'which':1,'leading':1,'from':1,';':1,'with':1,'the':2,'is':1,'at':1},'discards':{'when':1},'tombs':{'that':1},'commoner':{'still':1,'sight':1},'telescope--the':{'largest':1},'served':{'as':3,'for':1,'an':1},'intricate':{'canal':1,'colony':2,'branches':1},'vicious':{'circle':1,'snaps':1},'disintegration':{'or':1,'that':1,'of':3,'.':1,'vital':1,'proceeds':1},'interlock':{'preventing':1},'compose':{'atoms':1},'peanut':{'and':1},'literary':{'archive':13},'blaze':{'of':1,'had':1,'means':1},'masculine':{'and':3,'features':1},'weather':{'conditions':1,'comes':1,'.':3},'gravel':{'and':1,'by':1,'.':1},'coal-field':{'.':1},'little-brain':{'type':5},'stupefying':{'effect':1},'random':{'.':1},'presently':{'the':2,'recognised':1,'what':1,'.':2},'listeth':{'and':1},'time-recording':{'machine':1},'putting':{'food':1,'themselves':1,'two':2},'aerolite.':{'sec':1},'intelligence--of':{'putting':1},'arrange':{'a':1,'themselves':1,'the':1},'severely':{'alone':1},'origin.':{'the':1,'we':1,'none':1,'7':1},'diverging':{'towards':2,'from':1},'shock':{'and':1,'or':1},'mottled':{'brown':1,'appearance':1},'penguins':{'come':1,'are':3},'murrayi':{'and':1},'believed.':{'sec':1},'unsatisfied':{'tendency':1},'orohippus':{'a':1,';':1},'bleeding':{'a':1},'crow':{'and':1,';':1},'other.':{'the':1,'there':1},'crop':{'of':2,'up--a':1,'up':2},'rivers':{'and':4,'from':1,'of':2,'but':1,'.':4,'to':1,'as':1,'in':2,'with':1,'or':1},'frog-mouth':{'sleeps':1},'insertion':{'of':2},'exuberant':{'radiation':1},'laws.':{'the':1},'nests':{'on':2,'or':1,'swaying':1},'pale-white':{'belt':1},'zest':{'with':1,'.':1},'giving':{'condensed':1,'animals':2,'these':1,'rise':4,'up':1,'us':1,'an':1,'birth':1,'off':2,'the':2,'out':1},'assisted':{'the':1},'fat':{'below':1,'.':1},'habituation':{'the':1},'paddle':{'of':1,'which':1},'access':{'to':10},'away--you':{'may':1},'crossed':{'by':1},'3a':{'mesohippus':1},'exercise':{'fifty-four':1},'rhodesian':{'cave-man':1,'man':4},'beasts':{'of':1,'have':1},'works--the':{'furnishings':1},'pelage':{'than':1},'outlying':{'electrons':3},'nimble':{'and':1},'river.':{'2':1},'intercept':{'some':1},'sink':{'and':1,'from':1,'away':1,'down':1,'to':3,'in':1,'beyond':1},'others':{'likewise':1,'as':2,'are':3,'have':2,'in':3,'rapidly':1,'for':1,'there':1,'.':4,'to':1,'which':1,'regard':1,'that':2,'read':1,'who':1,'such':1,'worked':1,'like':4,'thought':1,'suggests':1,'remain':1,'were':2,'at':1,'the':1,'weaves':1,'or':1,'climbers':1},'tremor':{'it':1,'.':1},'safer':{'to':1},'implicit':{'in':2},'widening':{'spread':1},'respiration':{'and':1,'than':1},'stalks':{'a':1,'which':1},'broken':{'and':2,'down':2,'off':2,'shells':1,'up':6,'.':1,'past':1,'their':1,'hill':2,'empties':1},'33':{'photo':2},'32':{'a':1,'comet':1,'600':1},'31':{'15':1,'735':1,'vast':1},'30':{'000-50':1,'1885':1,'000':2,'days':1},'37':{'photo':2},'alaska':{'and':1},'35':{'feet':1,'tons.':1,'000':1},'redbreast':{'and':1},'wasplike':{'which':1},'climb':{'on':1,'the':1,'up':1},'tubercles':{'on':1},'composed':{'of':13,'.':1},'named':{'coronium.':1,'the':1,'darwin':1,'20417.txt':1,'brown':1},'land-crab':{'birgus':1},'67.2':{'0.62':1},'sculling':{'and':1},'vulcanite':{'and':1},'decrease':{'of':1,'until':2,'in':1},'names':{'in':1},'oval':{'and':1,'than':1,'.':1},'tap':{'this':2},'lime':{'the':1,'64':1},'links':{'and':1,'to':1,'or':1},'readable':{'by':1,'form':1},'cretaceous':{'white':1,'there':1,'strata':1,'era':1,'period':2},'themselves':{'nearest':1,'into':3,'pass':1,'as':1,'are':3,'have':1,'in':6,'go':1,'if':1,'from':1,'.':5,'to':1,'adequate':1,'traceable':1,'then':1,'we':1,'very':1,'sufficient':1,'affording':1,'by':3,'whenever':1,'of':1,'up':1,'spontaneously':1,'unmistakably':1,'so':1,'energetically':1},'pre-arrangements':{'of':2,'we':1},'oily':{'water':1},'excitedly':{'.':1},'engender':{'where':1},'ancestral.':{'the':1},'myriads':{'of':1},'magnesium.':{'illustration':1},'proton':{'.':1},'train':{'travelling':1,'.':1},'indifferent':{'or':1},'batesian':{'after':1},'harvest':{'of':1,'at':1,'field':1},'elbow-room':{'for':1},'hints':{'of':1},'swooping':{'gull':1,'leaps':1,'87':1},'account':{'of':4,'has':1,'for':8},'understanding.':{'for':1},'f':{'.':7},'crickets':{'and':2},'pelicans':{'and':1},'non-radiant':{'matter':1},'closing':{'of':1,'words':2},'continuity':{'of':1},'experiential':{'learning.':1},'violence':{'.':1},'instinct--a':{'useful':1},'e.g.':{'nitrates':1},'proportions':{'on':2,'for':1},'reconstructed':{'from':2},'renewed':{'our':1},'mixture':{'of':2},'water.':{'the':2,'illustration':3,'in':1},'bones':{'and':2,'e.g':1,'of':2,'some':1,'.':1,'running':1,'slowly':1},'native':{'of':1},'daring':{'operations':1,'of':1},'democracy':{'.':1},'noises':{'does':1},'holds':{'a':1,'also':1,'its':1,'together':1,'in':1},'regions':{'of':3,'to-day.':1,'are':1,'or':1,'empty':1,'farther':1},'flood.':{'there':1,'sec':1},'lamp':{'and':1},'proceeded':{'far':1,'further':1},'called--it':{'will':1},'furnace':{'the':1,'like':1},'imprints':{'from':1},'says:':{'all':1,'they':1},'watery':{'with':1},'dull-red':{'heat':1},'gill-clefts':{'are':1,'they':1},'waters':{'and':1,'that':1,'afford':1,'of':5,'allows':1,'.':4,'under':2,'covered':2,'the':1,'beyond':1,'where':1,'quite':1},'philosophy':{'of':1},'collection':{'will':1,'of':4,'so':1,'are':1,'.':1},'mixed':{';':1,'all':1,'together':1},'them--simple':{'one-celled':1},'united':{'states':13,'states.':1},'preferred':{'to':1},'multiplication':{'of':4,'into':1,'takes':1,'covers':1},'soup-plate':{'but':1},'primers':{'beginning':1},'chasing':{'mates':1},'tethering':{'the':1},'bind':{'animals':1,'long':1},'lines':{'and':2,'it':1,'replace':1,'not':1,'as':1,'are':3,'have':1,'in':2,'birds':1,'would':1,'.':3,'to':2,'which':1,'drawn':1,'we':1,'they':1,'fishes':1,'he':1,'on':2,'of':7,'will':1,'placed':1,'became':1,'the':2},'correspond':{'to':4},'chief':{'among':1,'use':1,'kinds':1,'scientific':1,'importance':1,'executive':1,'theories':1,'four':1,'plains':2,'reason':1,'classes':2,'stocks':1},'counterbalances':{'its':1},'stony':{'meteorite':1},'subsequently':{'fed.':1,'ignored':1},'lined':{'with':2},'furnish':{'a':1,'the':2,'data':1},'motions.':{'sec':1},'africans':{'straight-haired':1},'lens.':{'a':1},'symbols':{'of':1,'help':1},'alacrity':{'towards':1,'with':1},'horns':{'but':1},'agricultural':{'pioneers':1},'bunch':{'of':4},'industries':{'of':1,'.':1},'bridges':{'the':1,'were':1,'he':1},'negotiated':{'he':1},'le':{'verrier':1,'bon':1},'lb':{'.':1},'la':{'chapelle-aux-saints':2},'labor':{'in':1},'age':{'and':4,'just':1,'it':1,'as':1,'in':5,'whereas':1,'seems':1,'.':4,'to':3,'which':1,';':2,'has':1,'was':1,'more':1,'that':1,'after':2,'amphibians':1,'by':1,'dates':1,'of':13,'could':1,'lasted':1,'without':1,'the':2},'squatting':{'figure':1},'marsh':{'and':2,'birds.':1,'.':1},'bridged':{'very':1},'diverts':{'.':1},'junction':{'of':1},'greater':{'distance':2,'distorting':1,'plasticity':1,'intelligence':1,'in':1,'antiquity--perhaps':1,'celandine':1,'resistance':1,'possibilities':1,'rate':1,'part':2,'mass':1,'compactness':1,'interest':2,'activity':1,'concentration':1,'than':7,'accuracy':1},'descendants':{'as':1,'to-day':1,'.':1},'faunas':{'of':1},'dam':{'of':1,'.':1},'gauging':{'their':1},'cock-paidle':{'probably':1,'or':1},'phagocytes':{'may':1,'which':1},'accumulates':{'a':1},'faunal':{'drift':1},'day':{'and':10,'is':3,'it':2,'comprised':1,'as':1,'are':1,'in':1,'seem':1,'from':1,'for':1,'rather':1,'when':3,'long':1,'.':7,'also':1,'therefore':1,'covered':1,';':1,'was':1,'we':2,'alighting':1,'becoming':2,'sink':1,'one':1,'by':2,'he':1,'of':1,'equal':2,'were':1,'the':2},'6.--solar':{'prominences':1},'least.':{'these':1},'radiant':{'heat':2,'matter.':1,'than':1,'element':1},'tenanted':{'and':1,'the':1,'to-day':1,'by':1},'identified':{'an':1,'by':2,'.':1},'blazing':{'star':1},'exploring':{'new':1,'the':1,'with':1,'habit':1},'slipping':{'down':2,'back':1},'harness':{'this':1,'and':1,'the':1},'integumentary':{'structures':1},'references':{'to':2},'giants.':{'thus':1},'jasper':{'did':1,'studied':1},'movement-controlling':{'organ':1},'vestigial':{'muscles':1,'structures':4,'third':1},'attendant':{'on':1,'field':1},'pivot':{'the':1,'through':2},'slumped':{'together':1},'tubular':{'sea-anemone':1,'shells':1},'suctorial':{'mouth':1,'tube-feet':1},'kids':{'and':1,'foals':1},'inch':{'and':2,'less':1,'of':3,'long':2,'.':6,'at':1,'in':7,'thick':3,'one':2,'or':1,'thick.':1},'wholly':{'of':1},'mate':{'and':1,'kith':1,'s':1,'has':1},'oriental':{'race':1},'technically':{'this':1,'called':1},'red':{'and':4,'fife':1,'spring':1,'deer':1,'yellow':1,'disc':1,'at':1,'tumultuous':1,'mouth.':1,'giant':1,'end':1,'sandstone':2,'.':3,'glowing':1,'stars':3,'orange':1,'star':3,'on':1,'prominences':1,'spot':1,'seaweeds':1,'ones':1,'blood':1,'waves':1,'fife--a':1,'card':1,'a':1,'worsted':2,'flames':3,'glory':1,'light':1,'region':1,'will':1,'calcutta':2,'the':1,'tinge':1,'or':3,'seaweed':1},'approached':{'too':1},'many-celled':{'wheel':1,'animals':1,'organism':1,'animal':1,'creature':1},'lizzie':{'had':1,'the':1,'never':1,'was':2,'s':1},'others--which':{'is':1},'discover':{'a':1,'that':2,'this':1,'differences':1,'some':3,'their':1,'how':1,'in':1,'the':2},'fourteen':{'hours':1,'days':2,'or':1},'coronium.':{'measuring':1,'we':1},'approaches':{'to':1,'the':3},'electricity--electric':{'current--the':1},'trends':{'of':1},'qui':{'vive':1},'likelihood':{'far':1,'the':2},'young--a':{'use':1},'backwards':{'and':1,'we':3,'for':1,'over':1,'when':1,'it':1},'yard':{'in':1},'mortar':{'of':2},'chicken':{'procellaria':2},'allied':{'to':4},'barriers':{'.':1,'must':1},'retain':{'a':1,'their':1},'mammal-like':{'and':1},'empire.':{'he':1},'south':{'sir':1,'poles.':1,'of':4,'africa.':1,'american':3,'pacific':1,'.':3,'pole':1,'poles':1,'in':1,'america':4},'predominate':{'over':1},'complete.':{'illustration':1},'rudely':{'dressed':1,'shaken':1},'finest':{'triumphs':1,'measurements':1,'exhibition':1,'gold':1},'braced':{'against':1},'investigated.':{'ether':1},'condensed;':{'but':1},'food-plants':{'of':1},'improvements':{'and':1,'like':1,'in':2},'sacs':{'which':1},'reached':{'a':1,'then':1,'about':1,'animals':1,'this':1,'their':1,'nearly':1,'immediately':1,'the':4,'its':1},'michelson':{'and':1},'humblest':{'living':2},'ancient':{'copper':1,'type.':1,'seas':3,'astronomer':1,'seashore':1,'human':1,'extinct':1,'times':1,'skeletons':1,'hunters':1,'crust':1,'peoples':1,'mediaeval':1,'life':1,'amphibians':1,'days.':1,'sea.':1,'than':1,'types':4,'days':2,'civilisations':2,'rocks':1,'beds':1},'sadly':{'impressed':1},'monkey':{'and':1,'has':1,'b':2,'that':1,'of':1,'there':1,'it':1,'an':1,'how':1,'s':3,'which':1,';':1,'.':2,'yet':1,'as':1},'guiana':{'82':1,'the':1},'all--the':{'atom':1},'ripples':{'measuring':1,'in':1},'hotter.':{'it':1},'nebular':{'theory.':2,'theory':2,'region':2,'theory--spiral':1,'gases':1,'hypothesis':4,'mass':1},'intermediate':{'positions':1,'layer':1,'between':1},'sky--this':{'we':1},'anatomises':{'the':1},'completed':{'a':1,'her':1},'acquire':{'kinetic':1,'the':1},'negro':{'and':1},'device--more':{'reflex':1},'environmental':{'sometimes':1},'slopes':{'down':1,'of':1},'plumage':{'like':1,'of':1,'is':1,'are':1,'makes':2,'or':1},'bodyguard':{'of':1},'furnishings':{'of':2},'kant':{'had':1},'shrapnel':{'which':1},'brusque':{'variations':2},'lizard-like':{'tail.':1,'tail':1},'depends':{'on':10,'all':1,'partly':1,'upon':4,'.':2,'to':1},'heavens.':{'of':1},'light':{'and':12,'emerging':1,'besides':1,'previously':1,'penetrates':1,'is':14,'coming':1,'reaches':1,'an':1,'visible':1,'as':1,'rings.':1,'are':4,'in':3,'consists':2,'our':1,'passes':2,'differ':2,'rays':1,'from':10,'tread':1,'would':1,'electricity':1,'travel':1,'there':1,'wave-lengths.':1,'sunlight':1,'.':14,'to':3,'returns':1,'production':1,'which':7,'according':1,'travelling':1,'has':3,'was':1,'into':1,'red':1,'more':1,'body':2,'then':1,'we':1,'283':1,'travelled':1,'that':4,'may':1,'becomes':1,'gathered':1,'emitted':1,'took':1,'but':2,'falls':2,'magnetism':1,'will':3,'falling':1,'waves':2,'i.e':1,'with':1,';':4,'upwards':1,'a':1,'on':9,'made':1,'takes':3,'of':20,'radiant':1,'depends':1,'against':1,'reduced':1,'travels':2,'without':2,'so':1,'can':1,'many':1,'the':4,'or':1,'comes':1},'lurching':{'movements':1},'flashes':{'of':1},'anthropologist':{'professor':1},'imaginative':{'range':1,'or':1,'minds':1},'involution':{'but':1},'wood-cock':{'which':1},'curves':{'of':1},'comfortable':{'far':1,'as':1},'tide':{'and':2,'the':2,'in':1,'or':1,'out':1},'corrupt':{'data':1},'comfortably':{'in':1},'astrophysical':{'observatory':3},'unlikely':{'that':2},'uganda':{'bug':1},'sporadic':{'and':1,'members':1},'throat':{'bulges':1},'curved':{'bodies.':1,'pillar':1,'on':1,'than':1,'fingers':1},'activity--that':{'of':1},'complete':{'and':1,'living':1,'proof':1,'stereoscopic':1,'reflection':1,'absorption':1,'.':2,'pace':1,'revolutions':1,'master':1,'fossil':1,'in':1,'one':1,'its':1,'change':1,'theory':2},'mic':{'.':1},'wits':{'and':1,';':1,'in':1,'when':1,'.':1},'gravity':{'pressure':1,'is':1,'.':1,'near':2,'the':1},'provokes':{'simple':1},'pectoral':{'fins':5,'muscles':1},'gliding':{'on':1,'from':2,'alligator-like':1,'one':1},'rediscovered':{'by':1},'jumna':{'doles':1},'unless':{'a':1,'we':2,'indeed':1,'there':2,'it':1,'they':1,'our':1,'the':3,'you':3},'trundles':{'about':1},'mathematician':{'leibnitz':1,'le':1,'can':2,'.':1},'mimics':{'they':1},'eight':{'large':1,'unbranched':1,'of':1,'months':1,'years':1,'feet':1,'sense-organs':1,'tons':1,'branched':1,'planets':2,'the':1},'peppered':{'moth':1},'cleverest':{'animals':1,'monkey':1},'sally':{'the':1,'some':1,'above':1},'plastic--a':{'generalised':1},'profoundest':{'of':1},'palaeolithic':{'and':1,'cave-men':2,'men':1,'culture':1,'peoples':1},'firelight':{'must':1},'inexorable':{'laws':1},'gullet':{'unbroken':1},'heartening':{'encouragement':1},'enthusiastic':{'.':1},'gather':{'to':1,'the':2,'round':1,'on':1},'request':{'of':1},'disease':{'and':1,'is':1,'after':1,'.':2},'animal--perhaps':{'the':1},'park.':{'profile':1,'side-view':1,'chimpanzee':3,'surface':1,'comparisons':1,'the':3},'artificially':{'and':1,'to':1,'it':1},'occasion':{'and':1,'on':1,'.':1,'suggested':1,'of':1},'normally':{'a':1,'concealed':1,'handed':1},'ten-armed':{'cuttlefish':2},'true.':{'if':1},'area.':{'swimmers':1,'it':1},'selection':{'of':3,'advantage':1},'kith':{'and':1},'text':{'to':1,'emits':1,'.':2},'supported':{'on':1,'in':1,'like':1,'by':1},'braking':{'action':1},'pinhead':{'brain':1},'continually':{'added':1,'being':2,'recuperate':1,'worn':1,'tends':1,'changing':1,'passing':1,'travelling':3},'thicker':{'fur':1},'staff':{'shows':1},'wear':{'and':1,'any':2},'knowledge':{'and':1,'be':1,'means':2,'respecting':1,'advances':1,'is':1,'there':1,'had':1,'it':1,'but':1,'.':2,'may':1,'that':2,'were':1,'extends':1,'of':13,'the':1,'has':1,'as':1,'more':1},'sparks':{'which':1},'scorpion':{'we':1},'luminescent':{'and':1,'animals':1},'body-making.':{'in':1},'insectivores':{'not':1,'and':1,'including':1},'fatiguing':{'exertions':1},'emitting':{'light':1,'rays':1},'wild.':{'two':1},'hand.':{'attempts':1,'cross-fertilisation':1,'half':1},'inferior':{'either':1},'equilibrium':{'positions':1,'has':1,'results':1,'otherwise':1},'photographs':{'we':1,'show':2,'of':1,'.':1,'fig':1,'taken':2,'by':1,'figs':1},'coin--smaller':{'than':1},'exceptional':{'and':1,'spring':1,'auroral':1,'in':1,'cases':2,'conditions':1},'beat':{'a':1,'things':1,'it':1},'photography':{'and':1},'bear':{'and':2,'on':1,'of':2,'straight':1,'illustration':1,'to':1,'numerous':1,'in':3,'the':1,'was':1},'perfection':{';':1,'is':1,'in':1,'by':1,'.':1},'swiftest':{'flywheel':1},'stigma':{'the':1},'striped':{'tiger':1,'muscles':1,'muscle':1},'halo':{'surrounding':1,'there':1,'such':1},'areas':{'and':1,'differ':1,'land':1,'corresponding':1,'was':1,'of':1,'.':1,'to':1,'at':1,'known':1,'where':1,'or':1},'crabs':{'and':1,'are':1,'that':1},'egg-laying':{'is':1,'.':1},'caves':{'unsunned':1,'in':1},'organ':{'of':3,'is':1,'called':1,'for':1,'.':1},'pglaf.org':{'fundraising':1,'for':1,'section':1,'.':1,'while':1,'donate':1},'fixes':{'a':1,'to':1,'sea-anemones':1},'shore-animals':{';':1,'e.g':1,'which':1,'have':1,'.':1},'eyebrow':{'ridges.':1,'ridges':6},'saturates':{'through':1},'excesses':{'of':1},'light--is':{'the':1},'gibson':{'gives':1},'cave-hyaena':{'mammoth':1},'farthest':{'out':1},'exists':{'because':1,'there':1,'only':1,'as':1,'in':2,'the':1},'universe--the':{'evolution':1,'solar':2},'national':{'physical':2},'flapped':{'very':1},'inextricably':{'interwoven':1},'carnivores':{'and':1},'intensity':{'of':4},'cenozoic':{'making':1,'began':1,'era':1,'or':1,'eras':1},'enhanced':{'by':2},'greece':{'and':2},'ruse':{'succeeded':1},'36.0':{'0.24':1},'shallows':{'.':1},'phases':{'of':1},'pedigree':{'of':1,'the':2,'.':2,'is':1,'must':1},'apparently':{'clever':1,'red-hot':1,'unconscious':1,'simple':1,'inexhaustible':1,'instantaneous':1,'in':1,'served':1,'you':1,'sluggish':1,'inevitable':1},'nebula':{'and':1,'what':1,'round':1,'march':2,'although':1,'of':1,'57':1,'we':1,'but':1,'.':2,'seen':2,'to':7,'need':1,'which':1,'in':8,'it':1,'revolving':1,'has':2,'laplace':1,'is':4},'difficulties':{'and':5,'may':1,'of':5,'is':1,'in':1,'when':1,'.':1,'are':3,'have':1,'were':1,'the':1},'routine':{'and':1,'cannot':1,'is':3,'.':1,'became':1,'so':2,'activity':1,'instinctive':1,'has':1,'metabolism':1},'progress':{'we':1,'towards':2,'unless':1,'demands.':1,'many':1,'is':1,'of':4,'.':5,'depends':1,'have':1,'in':3,';':1,'has':1,'was':1},'boundary':{'line':1,'lines':1},'janes':{'leonard':2},'various':{'distances':1,'methods':2,'elements.':1,'conditions.':1,'proportions':1,'intervals':1,'human':1,'subtle':1,'racial':1,'classes':1,'physical':1,'layers':1,'forms':5,'concrete':1,'ways':1,'interesting':1,'flying':1,'ways.':1,'colours':2,'parts':1,'electrical':1,'open-sea':1,'kinds':4,'bolts':1,'mammals':1,'atoms':1,'races':1,'fishes':1,'shore-haunts.':1,'stocks':1,'articles':1,'processes':1,'places':1,'departments':1,'theories':1,'lengths':2,'experiments':1,'formats':1,'stages':1,'other':1},'reproduced':{'in':3,'from':7,'below.':1,'by':18},'cauliflower':{'sticking':1,'and':1},'superior':{'to':1},'emitted':{'by':3},'deliver':{'insects':1},'willing':{'to':2,'is':1},'nightfall':{'hippolyte':1},'exist.':{'there':1,'some':1},'guiding':{'his':2},'sharply':{'away':1},'asunder':{'the':1},'freely':{'and':1,'available':1,'sharing':1,'distributed':1,'as':1,'suspended.':1,'shared':1,'round':1},'taking':{'a':1,'longer':1,'advantage':2,'it':1,'running':1,'place':2,'5':1,'the':2,'care':1},'equal':{'weight':1,'pieces':1,'to':7,'length':1,'perfection':1,'.':1},'attributed':{'this':1,'to':1},'pulp':{'.':1},'flesh-eating':{'and':1},'sexes':{'and':1,'wander':1},'wringing':{'the':1},'swim':{'much':1,'at':1,'against':1,'for':1},'conquered':{'and':1,'the':3,'one':1},'swallow':{'a':1},'temporal':{'or':1},'glorious':{'failures':1,'display':1},'otherwise':{'would':1,'there':1,'when':1,'quite':1,'the':3,'called':1},'basins':{':':1,'.':1},'acorn-shell':{'and':1},'heritable':{'novelties':1},'deflected':{'as':2},'unearthed':{'.':1},'pouring':{'floods':1,'out':2},'marett':{'r':1},'tremendous':{'energy':3,'movements':1,'question':1,'but':1,'movement':1},'everything--so':{'there':1},'muddy':{'feet':1,'precipitate':1},'copies':{'of':7},'armadillos':{'.':1},'migrate':{'about':1},'dogfish':{'have':1},'natans':{'stands':1},'curtain':{'of':1,'floating':1},'copied':{'and':1,'or':1},'sluggish.':{'animals':1},'home.':{'long':1},'herbage':{'fastening':1,'and':1,'by':1,'.':1},'composed.':{'the':1},'antlers':{'in':1},'arises':{'what':1,'from':1},'sex--emotions':{'of':1},'looked.':{'using':1},'essentially':{'a':1,'of':2,'the':1,'wrapped':1,'is--should':1},'assert':{'themselves':1},'finished':{'and':1},'angles':{'to':4,'which':1},'angler':{'of':1,'s':2},'fellow':{'short':1,'from':1},'food-canal':{'and':3,'a':1,'the':1,'muscular':1,'.':2},'arisen':{'as':1,'in':1,'from':1,'by':1,'.':1},'volunteer':{'support.':1},'homes':{'of':1,'from':1},'economised':{'reproduction':2},'splits':{'up':1},'article.':{'bibliography':1},'appearance':{'and':1,'we':1,'very':1,'of':5,'.':2,'habits':2,'cloaked':1,'which':1,'in':1},'value':{'.':1,'or':1,'in':1},'promotes':{'both':1},'dendrites':{'of':1},'amenity':{'.':1},'file':{'or':1,'should':1},'chaotic':{'molecular':1},'squid':{'in':2},'weighed':{'but':1},'arrangements':{'of':2,'for':1},'arabia':{'ceylon':1},'partner':{'s':1,'sea-anemones':2,'.':1},'tumbled':{'into':1},'watchful':{'mother':1},'physiologists':{'like':1},'locomotion;':{'new':1},'mid-europe':{'red':1},'jurassic.':{'for':1},'prognostications':{'as':1},'well-grown':{'fishes':1},'felted':{'together':1},'aquitania':{'is':1},'locomotion.':{'illustration':1},'twelfth':{'printing':1},'neolithic':{'age':1,'days':1,'community':1,'.':1,'culture':1,'men.':1,'times':1,'man':6},'material':{'and':2,'in':1,'which':4,'e.g':2,'things':2,'is':1,'of':2,'particles.':1,'particles':1,'studying':1,'aspect':1,'universe':5,'such':1,'throughout':2,'than':1,'resources':2},'soddy--as':{'any':1},'cubic':{'inch':2,'inches':2,'centimetre':2},'absent;':{'stars':1},'water-filled':{'quarry':1},'binoculars':{'is':1},'discredited':{'atomism.':1},'26.--a':{'spiral':1},'judgment':{'on':1},'buttonholes':{'at':1},'nevertheless':{'these':1,'all':1,'been':1,'master.':1},'pompilius':{'common':1},'weapon':{'on':1},'capella':{'49.4':1},'treacly':{'fluids':1},'thought':{'and':2,'even':1,'that':3,'of':2,'is':1,'it':1,'.':1,'to':1,'was':1,'they':1,'hydrogen':1},'exceedingly':{'small':2},'sets':{'of':3,'off':1,'up':1,'in':1},'comparisons':{'of':2},'wreckage':{'of':1},'arising':{'afresh':1},'latest':{'and':1,'measurements':1},'appropriately.':{'birds':1},'barking':{'down':1},'humdrum':{'non-plastic':1,'race':1},'executive':{'and':1},'domestic':{'pigeons':1,'rabbits':1,'dog':1},'harpy-eagle':{'216':1,'clean':1},'bivalves':{'and':1},'stored':{'may':1,'away':1,'up':2,'for':1},'books':{'may':1,'recommended':1,'now':1,'are':1,'.':1},'protecting':{'blanket':1,'them':1},'swimming-bells':{'and':1},'wrens--to':{'try':1},'one-toed':{'horse':1},'work.':{'1.e.4':1,'the':2,'there':1,'-':1,'first':1},'absorption':{'of':2,'was':1},'onward':{'.':1},'lake':{'and':1,'pond':1,'of':1,'constance':1,'city':1},'mathematically':{'satisfactory':1},'add':{'just':1},'work;':{'the':1},'slits':{'the':1},'spirals':{'present':1,'in':1},'warns':{'us':1},'280':{'wave':1,'in':1},'283':{'photo':1,'niagara':1},'282':{'the':2},'287':{'photo':2},'incarnations':{'and':1,'one':1},'resolved':{'into':1,'the':1,'in':1},'worlds':{'and':1,'in':3,'sec':1,'.':1},'hermonis':{'and':1},'refinements':{'are':1},'mutations':{'and':1,'then':1,'whatever':1},'royalty':{'fee':1,'payments':2},'98.8':{'arcturus':1},'elapses':{'between':1},'implements--knives':{'scrapers':1},'jupiter.':{'the':1},'audibly':{'when':1},'capacities':{'of':4,'work':1,'but':3,'are':1,'usually':1,';':1},'like':{'plaice':2,'deliberateness':1,'toads':1,'london':1,'fungas':1,'birds':1,'shuffling':1,'to':2,'insectivores':1,'very':1,'duckmole':1,'sandstones':1,'one':1,'minute':1,'patrick':1,'globe-fishes':1,'shapes':1,'sloths':1,'amoebae':1,'rats':2,'partridges':1,'sugars':1,'some':3,'sea-squirts':1,'jupiter':1,'our':5,'bark':1,'ourselves':1,'poisonous':1,'its':2,'asking':1,'trout':1,'volvox':1,'opening':1,'of':1,'carnivorous':1,'great':1,'flames':1,'many':1,'otters':1,'ants':1,'skunks':1,'chlorophyll':1,'house-flies':1,'mercury':1,'whales':1,'.':3,'white':1,'genesis':1,'pallas':1,'that':6,'centipedes':1,'coughing':1,'fountains':1,'glass':1,'those':1,'he':1,'this':2,'starts':1,'sea-anemones':1,'matter':4,'fallow':1,'silly':1,'were':1,'and':2,'rooks':1,'certain':1,'is':1,'it':2,'an':8,'as':1,'which':2,'skates':1,'but':1,'waves':1,'fishes':1,'ours.':1,'a':44,'wisps':1,'professor':2,'dog':1,'kipling':1,'so':1,'raindrops':1,'the':56,'brer':1},'success':{'and':1,'of':1,'is':1,'to':1,'as':1,'in':1,'has':1},'spiral.':{'thus':1,'but':1},'porous':{'like':1},'admitted':{'of':1,'that':5},'ozone':{';':1},'radio-active--then':{'we':1},'chick':{'does':1,'out':1},'works':{'and':1,'in':7,'its':1,'if':1,'even':1,'provided':1,'based':2,'harmless':1,'.':2,'to':1,'only':1,';':1,'unless':1,'that':2,'1.a':1,'from':1,'with':1,'by':2,'posted':1,'on':1,'possessed':1,'reports':1,'so':1,'mr':1,'calculated':1},'soft':{'food':1,'soil':1,'muddy':1,'tail':2,'.':1,'to':1,'enough':1,'parts':2,'moss':1,'browns':1,'silvery-looking':1,'abdomen--for':1},'heel':{'a':1,'of':2,'than':1},'italian':{'scientist':1},'accessible':{'by':1},'simple.':{'the':1},'propel':{'our':1},'alive':{'.':1,'at':1,'are':1},'hair':{'and':1,'is':1,'woolly-haired':1,'in':1,'the':1,';':1},'convey':{'an':1},'convex':{'curves':1},'proper':{'answer':1,'proportions':2,'number':1,'way':1,'time':1},'happens':{'for':1,'that':2,'certain':1,'is':1,'.':2,'in':1},'0.24':{'3030':1},'students':{'of':1},'masked':{'their':1,'by':2},'economical':{'reduction':1},'assuming':{'reasonably':1},'results.':{'fog':1,'but':1},'mind-body':{'at':1},'snuggle':{'under':1},'overcharged':{'with':1},'manifesting':{'itself':1},'noise':{'of':1,'.':1},'slight':{'changes':1,'as':1,'improvements':1,'keel':1,'fluttering':1,'clouding':1},'ever-lengthening':{'tail':1},'combative':{'creature':1},'stellar':{'universe.':1,'universe--the':1,'spectra':1,'system':1,'universe':5,'universes':1,'astronomy':1},'crossing':{'the':1},'host':{'of':1,'is':2,'s':1,'for':1,'.':1},'although':{'we':5,'modern':1,'thirsty':1,'all':1,'there':2,'great':1,'it':1,'at':1,'they':1,'mr':1,'small':2,'our':1,'the':8},'worthy':{'of':1},'periodically':{';':1,'bursts':1,'in':1,'pass':1},'christened':{'coronium.':1,'them':1,'electrons':1},'about':{'among':2,'seven':2,'because':1,'twenty-one':1,'ten':1,'on':3,'the':47,'energy':1,'within':1,'all':1,'10':1,'two':6,'60':1,'as':1,'two-thousandths':1,'sec':1,'35':1,'in':3,'our':2,'shooting':1,'its':1,'sun-spots':2,'six':3,'for':1,'eleven':1,'ways':1,'twenty':2,'there':1,'forty':1,'40':1,'.':2,'1':3,'their':1,'3':1,'5':3,'4':1,'which':3,'9':3,'electrons':1,'more':1,'twenty-five':1,'thirty-two':1,'500':1,'equilibrium':1,'life':2,'2-1':1,'an':2,'to':1,'580':1,'that':3,'very':1,'constantly':1,'after':1,'eighty':1,'new':1,'it':1,'them':1,'two-thirds':1,'variable':1,'100':1,'one':5,'with':3,'by':4,'elevations':1,'a':15,'four':2,'12':1,'48':1,'thirty':1,'twice':1,'we':2,'1842':1,'56':1,'half':2,'us':1,'project':2,'these':2,'donations':2,'three':5,'fundamental':1,'things':1,'nine':1,'800':1,'fifty':3},'quills':{'.':1},'branch-gripping':{'member':1,'.':1},'electron--the':{'electron':1},'certainty':{'and':1,'as':1,'has':1},'introduces':{'into':1},'preen':{'gland':1},'avoided.':{'when':1},'rock-record':{'which':1},'introduced':{'perhaps':1,'into':1,'by':1},'fitnesses':{'have':1},'ways':{'and':2,'we':1,'that':1,'of':10,'.':4,'as':1,'including':1,'in':7},'marshes':{'and':1,'fed':1,'resounded':1,'were':1},'dubois':{'in':1},'sense-organs':{'the':1,'round':1},'rhythmical':{'rise':1},'billions':{'of':3},'chemists':{'and':1,'said':1,'of':1,'who':1,'should':1,'physicists':1,'.':1},'guard':{'over':2,'is':1,'against':1},'female':{'or':1,'with':1,'where':1,'is':1,'only':1,'covers':1,'.':1,'s':1,'paper':1,'figures':1,'makes':1,'in':1,'carries':1,'stickleback':2,'yucca':1,'side':1,'at':1},'quickly':{'from':1,'that':1,'contracting':2,'as':1,'recognised':1,'moving':1,'in':1,'coiled':1,'than':2},'kallima':{'inachis':2,'conspicuously':1},'cross-fertilisation':{'of':1,'is':2},'minute.':{'in':1},'punics':{'and':1},'sticklebacks':{'are':1,'learned':1,'were':1,'live':1,'in':1},'ridge':{'for':1},'mazy':{'passages':1},'elastic':{'solid':1,'wings':1},'rushed':{'into':1},'outline':{'we':1,'like':1,'of':17,'is':2,'it':1,'will':1,'where':1,'its':1},'condense':{'it':1,'round':1},'rushes':{'on':1,'through':1,'round':1},'bees':{'and':4,'may':1,'richly':1,'which':1,';':1,'by':1},'development':{'and':1,'has':1,'often':1,'for':1,'of':18,'leaves':1,'should':1,'certain':2,'which':1,'in':1,'.':4,'is':2,'man':1},'biggest':{'gulf':1,'fact':1},'maze':{'and':1,'a':1,'in':1,'by':1,'.':1},'duffus.':{'cuckoo-spit':1,'chimpanzee':1},'woodpecker':{'inserted':1,'hammering':2},'mcgregor':{'from':2},'but':{'all':3,'particularly':1,'among':1,'able':1,'move':1,'worms':1,'bright':1,'its':4,'before':1,'also':1,'electricity':1,'agile':1,'enough':1,'evidences':1,'to':5,'only':3,'has':1,'giants':1,'eventually':2,'very':1,'sooner':1,'quickness':1,'they':19,'new':1,'not':5,'during':1,'now':2,'necessary':1,'like':1,'profound':1,'light-waves':1,'these':9,'she':2,'each':1,'because':1,'farthest':1,'some':4,'imply':1,'are':2,'our':2,'best':1,'even':4,'what':7,'for':2,'since':2,'remain':3,'birds':1,'behind':1,'difficulties':1,'between':1,'probably':1,'millions':1,'movement':1,'we':23,'eminently':1,'nature':1,'little':1,'here':2,'although':3,'others':1,'along':1,'contraction':1,'on':2,'about':1,'many':3,'omit':1,'usually':1,'adapted':1,'naturalists':1,'copper':1,'contains':1,'besides':1,'one':4,'learning':1,'your':1,'often':3,'startling':1,'given':1,'air-sacs':1,'would':1,'few':1,'positive':1,'devouring':1,'there':46,'three':1,'their':3,'was':3,'more':1,'survives':1,'lived':1,'that':4,'blindly':1,'careful':1,'with':1,'those':1,'he':6,'plants':1,'none':2,'whether':1,'science':2,'this':11,'will':2,'while':3,'of':2,'constant':1,'remained':1,'is':1,'it':74,'an':2,'as':7,'at':2,'in':16,'if':11,'different':1,'no':4,'perhaps':5,'when':10,'astronomers':1,'how':3,'another':1,'other':1,'which':2,'you':1,'relatively':1,'inconceivably':1,'ultimately':1,'most':2,'why':2,'man':5,'a':10,'expert':1,'slightly':1,'splendid':1,'enter':1,'the':90},'reminds':{'us':1},'repeated':{'trials':1,'over':1,'until':1,'but':1,'many':1},'billion.':{'illustration':1},'plague':{'of':1},'bug':{'closely':1,'actually':1},'versatile':{'life':1},'partially':{'eclipsed.':1,'reappeared':1,'collided':1,'landlocked':1,'dried-up':1},'constitute':{'light':1,'as':1,'heat':1,'matter':1},'wise':{'and':1,'saying':1,'enough':1},'glory':{'and':1,'that':1},'wish':{'to':1,'however':1,'they':1},'j':{'.':98},'variations':{'and':2,'often':1,'that':1,'are':4,'which':1,'in':3,'or':3},'lynx':{'and':1,'the':2},'minutes':{'and':1,'saving':1,'for':1,'hard':1,'.':5,'holding':1,'in':1,'the':1,';':1,'before':1},'squat':{';':1,'motionless':2},'supreme':{'synthesis':1},'rabbits':{'and':2,';':1,'.':1},'pin':{'s':2},'swimmers--for':{'there':1},'transfused':{'into':2},'reptiles.':{'triassic':1,'carboniferous':1,'permian':1,'illustration':1,'in':1},'well-defined':{'and':1,'hereditary':1},'periods':{'of':4,'but':1,'to':1,'in':1,'the':1,'if':1},'141.5':{'1.88':1},'our':{'planetary':1,'atmosphere':5,'boyhood':1,'flesh':1,'rooms':1,'human':1,'skin':1,'earth':6,'admiration.':1,'web':1,'knowledge':11,'conclusions':1,'energies':1,'dipper':1,'consideration':1,'views':3,'very':1,'oceans':1,'photograph':1,'dark':1,'coal-measures':1,'hands':1,'foot':1,'coal-fields':1,'problems.':1,'solid':1,'race':2,'common':2,'small':1,'telegraphic':1,'bone':1,'methods':1,'colossal':1,'legacy':1,'blues':2,'sun':8,'artificial':1,'moon':2,'finger':3,'new':1,'email':1,'universe.':2,'belief':1,'power':1,'attention':1,'craters':1,'stellar':2,'heads':1,'estimate':1,'cities':1,'hours':1,'great':2,'central':1,'water-oceans.':1,'universe':7,'days':2,'forbears':1,'physiological':1,'survey':1,'steadily':1,'successors':1,'whole':1,'first':2,'own':15,'point':1,'instruments':2,'primary':1,'system':6,'feet':1,'elder':1,'cultivated':1,'total':1,'kind':1,'mental':1,'little':1,'eye':1,'flying':1,'charts':1,'wonderful':2,'way':1,'time':1,'scope':1,'sort':1,'eyes':4,'shell':1,'gas':1,'appreciation':1,'solar':9,'present':1,'apprehension':1,'admiration':1,'comprehension.':1,'imagination.':1,'universe--astronomical':1,'future':1,'exploration':1,'life.':1,'problem':1,'average':1,'mud-fishes':1,'frogs':3,'modern':3,'mind':2,'metals':1,'general':1,'sudden':1,'experience':2,'orchards':1,'domesticated':1,'terrestrial':1,'ancestors':1,'winter':1,'conclusions.':1,'ideas':1,'food':1,'conceptions':1,'largest':1,'ordinary':2,'civilisation':1,'bells':1,'investigations':1,'senses':4,'milky':1,'hand':1,'shores':1,'most':2,'purpose':1,'predecessors':1,'age':1,'coal':1,'chief':1,'greatest':1,'trains':2},'paraguay':{'and':1},'mysteriously':{'regular':1,'from':2},'pit':{'the':1,'whence':1},'proceeds':{'to':1,'what':1,'the':1},'48':{'the':1,'ounces':1},'49':{'photo':1,'by':1},'corporation':{'organized':1},'44':{'photo':1},'fore-arm':{';':2,'.':1},'fruit-laden':{'branch':1},'detail':{'to':1,'so':1,'which':1,'such':1},'40':{'photo':1,'are':1,'tons.':1},'41':{'photo':1},'sandy':{'shores':1,'loess':1,'places':1},'tree-tops':{'express':1},'out':{'and':6,'among':1,'is':1,'into':1,'some':1,'as':4,'at':4,'in':12,'sounds':1,'still':1,'apparently':1,'its':5,'saline':1,'light-waves':1,'from':9,'for':3,'their':1,'1890':1,'there':1,'had':1,'three':1,'.':5,'to':4,'those':1,';':2,'pre-eminent':1,'until':1,'more':1,'we':1,'his':1,'that':6,'very':1,'measures':1,'about':1,'fat':1,'how':2,'heat':1,'waves':1,'during':1,'profitless':1,'with':2,'by':3,'vast':1,'he':1,'a':9,'on':2,'great':1,'like':1,'these':1,'of':54,'according':1,'whether':1,'streams':1,'the':9,'are':2},'quintillion':{'atoms':1},'conveys':{'that':1},'period.':{'illustration':1},'functionless':{'letters':1},'dilatable':{'sac':1},'variation':{'being':1,'of':2,';':1,'in':1},'enlargement':{'of':3},'d-e.':{'an':1},'death.':{'this':1},'astronomy':{'and':1,'be':1,'that':1,'this':1,'of':1,'.':9,'deals':1,'to':1,'as':1,'at':1,'which':1,'the':1,'has':1,'by':1,'are':1},'keane':{'a':1},'race--many':{'animal':1},'pupil':{'the':1},'4a':{'hypohippus':1},'limited':{'warranty':1,'right':2,'.':1,'to':3,'as':1,'extent':1,'than':1,'areas':2},'gossamer':{'forms':1,'the':1,'202':1,'spiders':2,'.':1},'oxygenation':{'and':1},'holman':{'matter':1},'comparatively':{'dry':1,'little':1,'everlasting':1,'shallow':1,'large':1,'few':1,'narrow':1,'recent':2},'dynasty':{'and':1},'neoceratodus':{'has':1,'by':1},'sleep':{'and':1,'the':1},'admiration.':{'sec':1},'poorly':{'developed':2},'belonged.':{'when':1},'flash.':{'it':1},'feeding':{'growing':1,'on':2,'purposes':1,'chiefly':1},'patches':{'of':1,'in':1,'on':1},'paris':{'also':1,'as':1},'34.':{'illustration':1},'ceylon':{'and':1,'the':1},'charles':{'darwin':4,'r':1,'e':1,'descent':1},'thinnest':{'vapours':1,'part':1,'parts':1,'.':1},'340':{'000':1},'whatsoever':{'we':1,'.':2},'caused':{'a':1,'though':1,'this':1,'when':1,'to':1,'in':2,'by':1},'elapsed':{'before':1},'comet--the':{'stellar':1},'risk':{'of':6},'arboreal':{'and':1,'life':5,'apprenticeship--an':1,'mammals':1,'evolution':1,'.':2,'insectivores':1,'habits':2,'apprenticeship--tentative':1,'mother':1,'apprenticeship':8,'marsupials':1},'dispense':{'energy':1,'with':2,'largely':1},'brackish':{'water':1,'swamp':1},'rise':{'and':1,'great':1,'enormously':1,'very':1,'of':8,'into':1,'.':2,'to':17,'in':1},'lurk':{'among':1},'hermon':{'there':1,'grass':1,'.':1},'every':{'ten':1,'laboratory':2,'house':1,'haunt':1,'one':1,'second':1,'human':1,'year':3,'corner':1,'element':2,'species':1,'physical':1,'now':2,'many-celled':3,'atom.':1,'addition':1,'question':1,'two':1,'port':1,'chemical':1,'few':1,'gramme':1,'other':2,'animal':3,'empty':1,'niche':3,'amateur':1,'form':1,'class':1,'gas':1,'possible':1,'killing':1,'protection':1,'atom':1,'vigorous':1,'hole':2,'twenty-thousandth':1,'opportunity':1,'day':4,'man':1,'kind':1,'substance':3,'instant':1,'third':2,'hour':1,'particle':3,'arc-lamp':1,'glowing':1,'introduction':1,'part':1,'bone':1,'time':1,'star':1,'side':4,'clap':1,'twenty-four':2},'gratification':{'of':1},'east.':{'illustration':1},'slipperiness':{'.':1},'monkeys':{'and':5,'is':1,'it':2,'sec':1,'at':1,'have':2,'securing':1,'.':3,'may':1,'other':1,'which':1,';':1,'semnopithecus':1,'learn':1,'but':1,'such':1,'than':1,'on':1,'leaving':1,'were':1,'very':1,'the':2,'where':1,'or':1,'are':2},'encounter':{'the':1},'discovers':{'the':1,'when':1},'school':{'in':1},'parrot':{'of':1,'s':2,'belongs':1,'which':1,'s-beak':1,'stringops':1},'conceive':{'of':2,'the':1,'then':1},'loess':{'of':1,'either':1,'sandy':1},'apprehension':{'so':1,'.':1},'hickson':{'s':1,'puts':1},'relics':{'of':3,'vestigial':1,'.':1},'venus':{'and':1,'flower':3,'67.2':1,'is':1,'s':1,'fly-trap':2,'earth':1,'the':3,'are':1},'humps':{'daily':1,'were':1},'degeneracy':{'in':1},'enjoy':{'pulling':1,'.':2},'veritable':{'museum':2,'physical':1},'zinc':{'and':8,'is':2,'sulphite':1,'which':1,'pass':1,'has':1},'faintest':{'stars':1},'infancy':{'is':1,'would':1},'estimates':{'which':1},'direct':{'and':2,'a':1,'knowledge':1,'descendants':1,'there':1,'competition':1,'passage':1,'to':1,'appropriate':1,'four-footed':1,'statement':1,'indirect':1,'traces':1,'or':1},'nail':{'and':1,'on':1,'as':1,'pulled':1},'yerkes':{'experimented':1,'observatory':1,'studied':1,'40-inch':4,'changed':1,'observatory.':9,'has':1,'refractor':2},'electricians':{'have':1},'street':{'a':1,'or':1},'infiltration':{'of':1},'estimated':{'to':2,'the':3,'fig':1,'that':2},'expressive':{'of':1},'shining':{'disc':1,'through':1},'blue':{'and':2,'box':1,'butterfly':1,'chequer':1,'fit':1,'in':1,'sky':6,'.':1,'hot':1,'disc':1,'green':1,'waves':1,'indigo':1,'the':1,':':1,'or':1,'reptiles':1},'change.':{'a':1,'sec':1},'hide':{'their':2},'pariasaurus':{':':2},'organisms':{'and':1,'to-day':1,'which':4,'of':1,'upon':1,'it':1,'.':1,'are':1,'have':2,'i.e':1,'found':1,'seem':1,'has':1},'solemn':{'occasion':1,'slowness':1},'beaten':{'into':2,'grain':1,'out':1},'revolves':{'round':2},'museum.':{'a':1,'meteorite':1,'carrier':2,'homing':1,'yellow-crowned':1},'liberty':{'.':1},'children':{'and':1,'who':1,'should':1},'characters.':{'in':1},'zoologists':{'with':1},'change;':{'variability--evolution':1},'conduct':{'man':1,'.':1,'in':1,'but':1,'demands':1},'ebbs':{'and':1},'supplies':{'of':1,'the':1,'.':1},'revolved':{'will':1,'on':1,'round':1},'reacts':{'cannot':1},'electricities':{'in':1},'unexhausted':{'possibilities':1},'hundreds':{'and':1,'of':15,'but':1},'seven-weeks-old':{'human':1},'resounded':{'to':1},'represented':{'as':2,'by':9,'for':1,'in':4},'path':{'followed':2,'of':6,'when':1,'marked':1,'round':2,'closely':1,'from':1,'the':1,'by':1,'if':1},'shortness':{'of':2},'through.':{'light':1},'digits':{'of':1,'on':1},'wood-snail':{'in':1},'earth--a':{'transition':1},'distinctness':{'.':1},'ventures':{'were':1},'tons.':{'the':2,'illustration':2},'leaves':{'and':3,'a':1,'or':1,'fanwise':1,'us':1,'one':1,'which':1,'the':1,'.':2,';':2},'settles':{'down':3},'mantis':{'on':1,'religiosa':2,'mantis':2},'mistake':{'to':2,'for':2,'but':1},'settled':{'down':2,'the':1,'within':1},'svante':{'worlds':1},'substances.':{'in':1},'stray':{'present-day':1,'erratic':1},'straw':{'looked':1,'as':1,'so':1},'plants--paint':{'the':1},'equipment.':{'1.f.2':1},'feelings':{'and':2,'such':1,'it':1,'in':1},'patience':{'and':2,'of':1,'were':1},'miles--eighteen':{'times':1},'anyhow':{'as':1},'greatness.':{'it':1},'ape-man--an':{'early':2},'scaffolding':{'but':1},'would':{'help':1,'do':2,'cover':1,'thus':1,'it':1,'one':1,'say':2,'cease':2,'have':15,'in':1,'go':1,'seem':4,'provoke':1,'yet':1,'witness':1,'doubtless':1,'certainly':1,'still':2,'appear':3,'lead':1,'also':1,'estimate':1,'disintegrate':1,'make':2,'unduly':1,'favour':1,'tend':3,'increase':1,'consistently':1,'only':1,'shiver':1,'take':12,'fade':1,'recover':1,'probably':1,'include':1,'cause':1,'shrink':2,'therefore':1,'then':2,'begin':2,'survive':1,'that':1,'mean--matter':1,'burn':1,'confer':1,'obtain':1,'evolve':1,'a':1,'fall':1,'not':9,'penetrate':1,'be':45,'tick':1,'fly':2,'on':1,'frequently':1,'give':3,'like':2,'tear':1,'require':2,'no':1,'account':1,'yield':1,'explode':1,'suppose':1,'contain':1,'become':1,'inevitably':1,'instantly':1,'mean':3},'palings':{'and':1},'distributing':{'a':1,'medium':1,'this':1,'performing':1,'or':1,'project':2,'any':1},'smelted':{'together':1},'romanes':{'used':2},'preserved':{'namely':1,'except':1},'musk':{'will':1,'in':1},'ages--for':{'britain':1},'beauty':{'became':1},'ll.d':{'.':2},'correspondingly':{'longer':1},'arms':{'and':3,'emerging':1,'into':1,'bear':1,'.':1,'which':1,'not':1,'or':1},'excellent':{'milling':1},'20417':{'produced':1,'language':1},'outdated':{'equipment':1},'off.':{'peculiarities':1},'me':{'alone':1,'tangere':1,'a':1,'that':2},'mc':{'the':1},'piltdown':{'man':6,'skull':5,'.':1},'parachuting--a':{'persistence':1},'henry':{'huxley':2},'appendage':{'which':1},'ernest':{'h':2,'rutherford':6},'my':{'own':1},'latitudes':{'appear':1},'clock-work':{'started':1,'so':1},'mud-fishes':{'do':1,';':1,'of':1,'are':1,'or':1},'decorative':{'plume':1},'ingenuity':{'patience':1,'has':1},'powerfulness':{'of':1},'orion':{'the':1,'40':1},'keep':{'them':1,'up':2,'two':1,'their':1,'time':1,'the':3,'themselves':1,'ebooks':1},'attract':{'them':1,'any':1},'returned':{'to':2,'.':1},'ones':{'and':1,'on':2,'about':1,'made':1,'develop':1,'is':2,'pass':1,'make':1,'.':2,'below':1,'are':5,'hatching':2,'in':1,'go':1,'such':1,'come':1,'creeping':1,'first':1},'progression--always':{'a':1},'end':{'all':1,'which':1,'being':1,'of':32,'were':1,'it':1,'against':1,'.':3,'to':2,'they':1,'in':1,'fishes':1,'the':1},'telephonic':{'communications':1},'returning':{'half':1},'intruders':{'with':1,'.':1},'damages.':{'if':1},'particulars':{';':1},'buns':{'without':1,'some':1,'ashore':1},'writers':{'have':1},'modernising':{'of':1},'widespread':{'and':2},'ancestor':{'of':2,'from':1},'badly':{'stung':1,'when':1,'agee':1},'poker':{'again':1,'into':1,'loses':1,'is':2,'in':1},'both.':{'monkeys':1},'scion':{'of':1},'mouths':{'of':2,'on':1},'erected':{'on':1},'invisible--just':{'as':1},'albumin':{'casein':1},'delicacy':{'in':1},'confirmed':{'as':1,'by':1},'lump':{'of':1},'jumping':{'out':2},'poked':{'it':1},'system--with':{'all':2},'leplay':{'school.':1},'amid':{'the':1,'green':1},'spout':{'.':1,'in':1},'hypotheses':{'and':1,'which':1},'perform':{'all':1,'distribute':1},'complexity':{'and':2,'of':3,'possible':1,'or':1},'upside':{'down':1},'eurypterids':{'or':1},'decreasing':{'coal':1},'diary':{'of':1,'is':1},'squirrel-like':{'marmosets':1},'unsteady':{'slippery':1},'flippers':{'which':1,'for':1},'recurrent':{'stimulus':1,'vicissitudes.':1},'untold':{'ages':1},'daughter-units':{'thus':1,'are':1,'that':1},'alternation':{'of':1},'orang':{'and':2,'notice':1,'is':1,'chimpanzee':2,'.':1,'will':1,'are':1,'the':2,'has':2,'than':1,'232':1},'underside':{'of':1},'inattentive.':{'of':1},'london':{'bridge':1,'the':1,'as':1,'zoological':1},'thesis':{'that':1},'terns':{'spending':1},'beside':{'it':1},'daughter-buds':{'go':1,'living':1},'borneo':{'living':1},'anolis':{'of':1},'expectations':{'there':1},'exhibits':{'a':1,'an':1},'writing':{'without':1,'from':1,'or':1},'destroyed':{'and':1,'for':1,'it':1,'but':1,'.':1,'to':1,'the':1,'was':1,'by':2},'trams':{'in':1},'fade':{'entirely':1},'400':{'000':1},'peopling':{'of':4},'centimetre':{'of':2},'250000':{'inch':1},'prevented':{'by':2},'direct-reading':{'spectroscope':2},'tree-stems':{'and':2},'revelations':{'of':2,'it':1,'to':1},'diseased':{'condition':1},'flotation':{'and':1},'skin-leaves':{'about':1},'shadows':{'are':1},'ingested':{'food':1},'swaying':{'on':1},'potatoes':{'settling':1},'water-fleas':{'and':1},'explode':{'and':1,'them':1},'instant':{'of':1,';':1,'it':1},'victory':{'is':1,'alike':1},'fitness':{'of':1,'for':1,'follows':1},'unit-bodies':{'.':1},'attained.':{'now':1},'notifies':{'you':1},'wariness':{'is':1},'flat-fish':{'has':1,'does':1,'like':1},'verrier':{'discovered':1},'provisions.':{'1.f.6':1},'emphasise':{'as':1},'member':{'and':1,'of':2,'.':2},'magnets':{'.':1},'defences':{'of':1},'clothe':{'itself':1},'depress':{'one':1},'gutenberg-tm.':{'1.e.5':1},'gibbon':{'and':1,'is':2,'orang':2,'which':1,'others':1},'driving':{'water':1,'away':1,'off':1,'the':1},'god':{'s':1},'washed':{'away.':1,'away':2,'down-stream.':1},'integrative':{';':1},'day.':{'there':1,'bibliography':1,'but':1},'laid':{'within':1,'it':1,'down':4,'in':2,'the':1,'or':1},'adjust':{'themselves':1},'millennium':{'b.c':2,'further':1,'after':1},'heavenly':{'body':1,'bodies':3},'got':{'possession':1,'a':4,'his':1,'from':1,'apparatus':1,'no':1,'very':1,'into':1,'loose':1,'it':2,'together':1,'the':3,'their':1,'started':1,'green':1,'nothing':1,'rid':2,'across':1,'films':1},'newly':{'born':1,'hatched':4},'twenty-five':{'trillion':1,'tons':1,'miles':1,'million':1},'independence':{'of':1},'splashed':{'into':1},'provide':{'access':1,'a':4,'volunteers':1,'in':1},'carcass':{';':1},'eternal':{'night':1,';':1,'night--relieved':1,'winter':1,'possible':1},'free':{'from':2,'for':1,'oxygen':1,'air':1,'if':1,'.':1,'access':1,'to':3,'future':1,'agents':1,'nitrogen':1,';':1,'hand':4,'distribution':3,'has':1,'intercrossing':1,'anyhow':1,'swimming':1},'carcase':{'of':1},'masterliness':{'of':1},'whereupon':{'the':1},'rain':{'of':1,'dissolving':1,'each':1,'began':1,'to':1},'biological':{'conditions':1,'idea':1,'necessity':1,'ideas--the':1},'calcareous':{'algae':1},'wanted':{'and':1,'.':2},'publication':{'of':1},'solution...':{'.':1},'grasses':{'and':1},'inexpensive':{'physiologically':1},'days':{'and':1,'old':2,'it':1,'in':2,'there':1,'when':1,'29':1,'.':5,'note':1,'to':2,'weeks':1,'then':1,'fourteen':1,'with':1,'he':1,'on':1,'longer':1,'of':5,'stand':1,'were':1,'following':1,'the':1},'rang':{'our':1,'up':1},'appeals':{'to':2},'possibility--involution':{'rather':1},'researches':{'have':1},'primary':{'reservoir':1,'occupations':1,'meaning':1,'emotions':1,'entity':2,'colours':3,'source':1,'reason':1,'atomic':1},'rank':{'mammals':1},'hearing':{'and':1,'this':1,'is':1,'.':1,'heard':1,'are':1,';':1,'has':1,'comes':1},'staying':{'power':1},'philosophical':{'dictum':1},'adopted':{'by':1},'scissors':{'fall.':1,'.':1},'redivides;':{'there':1},'mercury':{'the':2,'is':1,'it':1,'.':1,'s':2,'between':1,'venus':1,'36.0':1},'magnificent':{'spread':1},'toy':{'of':1},'discriminates':{'between':1},'top':{'with':1,'of':9,'end':1,'are':1},'sumatra':{'and':1},'heights':{'of':1,'holding':1,'above':1},'ton':{'of':1,'or':1,'to':1},'motility':{'are':1,'in':1},'wildly':{'down':1},'variational':{'uplifts':1},'unbroken':{'and':1,'silence':1},'toe':{'to':1,'is':1,'reaches':1},'instreaming':{'multitude':1},'tool':{'is':1,'in':1,'.':2},'brushes':{'off':1},'serve':{'to':1,'as':3,'its':1},'conspicuously':{'as':1,'coloured':1},'190':{'photo':1,'the':1},'western':{'and':1},'injected':{'into':1},'mankind--notably':{'the':1},'frankly':{'answered':1},'divisible':{'into':1},'immaterial':{'.':1},'cogged':{'wheel':1},'classes':{'of':2,'into':1,'called':1,'so':1,'which':1,'orders':1},'flame':{'shattered':1,'is':1,'was':1},'hearing.':{'instinctive':1,'power':1},'bridge':{'the':1,'for':1},'donkey':{'grazing':1},'fashion':{'so':1,'of':1,'with':1,'.':2},'handkerchief':{'.':1},'ran':{'riot':1},'progressing.':{'b':1},'agility':{'.':1,'that':1},'raw':{'material':1,'materials':3},'rat':{'or':1},'regulate':{'what':1,'growth':1,'the':1},'leafy':{'surroundings':1},'relatively':{'poor':2,'great':1,'slow':1,'easygoing':1,'less':2,'cooler':1,'shallow':4,'well':1,'uniform':1,'naked':1,'simple':1,'safe':1,'short':1,'larger':1,'small':1,'recent':2,'more':2},'reminding':{'him':1,'one':1},'-':{'of':1,'you':5,'except':1,'if':1},'isolated':{'ponds':1,'from':1,'northern':1,'here':1,'districts':1,'alpine':1},'thorough':{'aeration':1},'curly-haired':{'australian':1},'perigord':{'mentone':1},'rodents':{'and':1,'are':1},'hatch':{'inside':1,'from':1,'out':1},'world.':{'besides':1,'it':1,'illustration':1,'but':1,'another':1,'if':1,'physical':1},'effectiveness':{'of':1},'douching':{'with':1},'beta-rays':{'from':1},'propitious':{'environment':1},'greatest':{'mathematical':1,'distance':1,'accuracy':1,'reflector':1,'density':1,'of':4,'prominences':1,'triumphs':1,'instrument':1,'physicists':1,'in':1,'authorities':1,'were--the':1,'scientific':1},'though':{'it':9,'in':1,'still':1,'its':1,'there':1,'their':1,'other':1,'more':1,'we':3,'viviparous':1,'that':1,'very':1,'most':1,'they':5,'not':1,'now':1,'man':1,'a':1,'this':1,'many':1,'these':1,'the':9},'picturesquely':{'the':1},'leaf.':{'illustration':1},'tree-snakes':{'tree-lizards':1},'swampy':{'low':1},'glimpses':{'of':1},'plays--the':{'reindeer':1},'plenty':{'of':4},'coil':{'of':3,'is':1,'thus':1},'coin':{'and':1,'through':1},'parting':{'of':1},'glow':{'as':1,'made':1,'with':3,'into':1,'.':2},'lift':{'a':1,'it':1,'sea-urchins':1},'flow':{'of':10,'is':2,'in':1,'or':1,'.':1},'spencer':{'formulated':1},'unwary':{'person':1},'curie':{'and':1,'was':1},'orderly':{'hierarchy':1},'reputation':{'of':1,';':1,'for':1},'gratefully':{'accepted':1},'constance':{'or':1},'chariot':{'and':1},'bait':{'and':1},'spikelets':{'in':1},'manifestation':{'of':3,'in':1},'solutions':{'are':2},'nerve-cells':{'and':4,'an':1,'in':1,'.':1},'mingle':{'with':1},'observatory.':{'a':3,'giant':1,'star':1,'diagram':1,'meteorite':1,'3':1,'jupiter':1,'fig':10,'solar':1,'mars':1,'the':4,'100-inch':1},'endowment':{'of':2,'.':1},'availability':{'of':1},'founded.':{'if':1},'spite':{'of':6},'flat-fishes':{'we':1,'like':1},'situations':{';':1,'which':1},'institution':{'of':1,'at':1,'for':1},'turkestan':{'and':1},'fifty-foot':{'beach':2},'disgust':{'.':1},'gods':{'.':1},'lodge':{'reminds':1,'has':1,'sir':1},'announce':{'every':1},'insect-visitors--began':{'to':1},'borrowed':{'house':1,'shell':1},'waltz':{'round':1},'solution.':{'imitation':1},'nerve-cell.':{'7':1},'watch':{'a':4,'.':1},'fluid':{'water':1,'the':2,'that':1,'was':1,'.':1},'system--regions':{'of':1},'existence--which':{'includes':1},'shutting':{'out':1},'tuberculosis':{'.':1},'despite':{'these':1},'report':{'1914.':1,'1915.':4,'1917.':3,'1917':1,'1914':1},'knocks':{'it':1},'wavy-haired':{'pre-dravidians':1},'gutenberg-tm':{'and':1,'web':1,'license.':1,'concept':2,'name':1,'license':7,'is':1,'work':5,'trademark':4,'s':1,'collection':2,'mission':2,'project':1,'depends':1,'including':1,'works.':2,'works':3,'electronic':18,'ebooks':2},'beads':{'screw':1},'to-day--the':{'elk':1},'countries':{'a':1,'of':1,'there':1,'are':1,'.':1},'rowing':{'and':1},'taken--the':{'emergence':1},'public':{'is':1,'would':1,'support':1,'domain':8},'twice':{'.':1,'as':2,'they':1,'during':1,'the':2,'or':1},'progress.':{'vi':1,'sec':1,'conquering':1},'automatic':{'machine':2,'internal':1,'machine.':1},'farther':{'and':3,'away.':1,'from':2,'away':2,'back':2,'in':1,'north':1},'new.':{'the':1,'illustration':1},'swept':{'down':1,'away':1,'slowly':1,'out':1},'habit':{'a':1,'and':1,'may':1,'of':8,'some':1,'amongst':1,'which':1,'has':1},'nut':{'and':2,'drop':1},'send-off':{'in':2},'retreat.':{'the':1,'another':1},'resist':{'such':1,'the':1,'snapping':1},'t.':{'hobhouse':1},'sea-squirts':{'and':1,';':1,'which':1},'life-preserving':{'value':1},'volans':{'of':1,'which':1},'disturbing':{'influence':2},'discriminating':{'and':1,'quality':1},'combustion':{'is':2,'as':2,'it':1},'capacity':{'and':1,'about':1,'for':3,'that':1,'of':1,'is':1,'.':2,'in':1,'the':1},'ranged':{'one':1},'paternal':{'origin':1,'and':1,'care':1},'mud':{'and':3,'getting':1,'encasements':1,'when':1,'.':2,'that':1,'or':1},'wave-lengths.':{'light-waves':1,'light--visible':1},'finger':{'and':3,'on':1,'from':2,'would':1,'joints':1,'.':1,'usually':1,';':1},'monkeyish':{'features':1},'367':{'000':1},'stored-up':{'energy':1},'approach':{'of':1,'the':2,'160':1,'by':1,'us':1},'discovery':{'and':1,'has':2,'that':2,'of':29,'site':2,'to':1,'which':1,'in':1,'go':1,':':1},'guesses':{'as':1,'or':1},'elk':{'and':2,'the':1},'confusion':{'of':1},'incarnation':{'to':1},'weak':{'and':1,'breakage':1,'keel':1,'plane':1,'one':1},'however':{'composed':1,'and':1,'there':4,'is':1,'it':4,'say':2,'another':1,'in':1,'if':1,'different':1,'acknowledge':2,'interesting':1,'faint':1,'long':1,'by':3,'to':1,'only':2,'slowly':1,'take':1,'that':8,'continuous':1,'what':1,'following':1,'they':2,'not':1,'with':1,'than':1,'a':2,'on':1,'this':1,'enabled':1,'as':1,'so':2,'things':1,'small':1,'the':7},'sand-crab':{'takes':1},'larynx':{'.':1},'aquarium':{'.':1},'consists':{'almost':1,'of':11,'essentially':2,'chiefly':1},'flowering':{'plants':7,'plant':1,'plants.':1},'newt':{'or':1},'improve':{'the':1},'protect':{'the':3},'rhythms':{'.':1},'irregular':{'stretches':1,'speck':1},'jelly':{'about':1,'.':1},'threads':{'used':1,'secreted':3,'of':4,'.':1,'sink':1,'the':2,'are':1},'expense':{'to':1},'frequenting':{'forests':1},'diversity.':{'thus':1},'goodrich':{'evolution':1},'discolorations':{'produced':1},'starling':{'and':1},'majestic':{'spirals':1},'trust':{'.':1},'utilised.':{'indeed':1},'colour-scheme':{'of':1},'influence.':{'illustration':1},'phyllopteryx':{'has':1},'cockroaches':{'to':1,'.':1},'been':{'unified':1,'shot':1,'able':6,'pointed':1,'named':1,'profoundly':1,'attempts':2,'elevated':1,'mentioned':1,'wrought':1,'subjected':1,'written':3,'to':3,'detected':1,'going':3,'transformed':1,'attained':1,'emitting':1,'fancied':1,'unravelled':1,'secured.':1,'very':4,'familiar':2,'reconverted':1,'got':1,'vastly':1,'hitherto':1,'adventurous':1,'rotating':1,'lost':1,'banished':1,'dulled':1,'traced':2,'retrogressions':1,'solved':3,'slipping':1,'found':9,'discussing':2,'interbreeding':1,'achieved':1,'some':1,'briefly':1,'understood':1,'invaded':1,'added':2,'sifted':1,'estimated':1,'borne':1,'established':1,'shown':2,'said':4,'witnessed':1,'beaten':1,'expressed':1,'laid':1,'progress':1,'burned':1,'induced':1,'numerous':1,'blotched':1,'demonstrated':1,'recently':3,'opening':1,'analysed':1,'broken':1,'drawn':1,'colonised':2,'christened':1,'suggested':4,'on':1,'great':1,'buckled':1,'many':1,'greatly':1,'introduced':1,'reached.':1,'examining':1,'raised':1,'followed':1,'adepts':1,'hewn':1,'explained':1,'one':3,'brought':1,'visible':1,'done':1,'capacious':1,'.':1,'given':1,'invented':1,'flaws':1,'weathered':1,'exposed':1,'noticed':2,'smelted':1,'much':2,'slowly':1,'taken':2,'fortuitous':1,'more':1,'life':1,'gaseous':1,'discovered':1,'enough':1,'successful':2,'registered':1,'tested':1,'part':1,'known':7,'suspected':1,'worked':1,'true':1,'chequered':1,'applied':1,'made':10,'abandoned':1,'impatiently':1,'regularised':1,'evolved':3,'pumped':1,'propounded':1,'making':1,'called':1,'and':1,'resolved':1,'proved':1,'indicated':1,'exhausted':1,'turned':1,'an':3,'as':2,'at':3,'in':4,'seen':1,'constricted':1,'clearly':1,'if':1,'different':2,'no':1,'emancipated':1,'that':2,'generally':2,'handed':1,'any':2,'hot':1,'speeding':1,'digged':1,'fostered':1,'used':2,'tried':2,'confirmed':1,'prepared':1,'moving':1,'throughout':1,'measured':1,'recent':1,'a':11,'stupendous':1,'described':2,'slightly':1,'calculated':2,'required':1,'becoming':1,'thought':1,'dissolved':1,'so':4,'the':7},'legend':{'of':1},'were.':{'the':1},'spread':{'and':1,'from':1,'of':3,'over':2,'until':1,'underneath':1,'to':2,'through':2,'table':1,'public':1,'out':3},'expected':{'when':1},'poker.':{'they':1},'pallas':{'s':1},'pecked':{'at':2},'bladder':{'growing':1},'uncommon':{'on':1},'gaboon':{'in':2},'proportional':{'to':1},'catch':{'this':1,'small':1,'the':1},'own--a':{'fore-limb':1},'ancestors.':{'given':1},'deeps':{'the':1,'3':1,'are':1},'5a':{'merychippus':1},'lessen':{'the':1},'n':{'is':1,'.':5},'ape':{'and':2,'frequenting':1,'or':1,'for':1,'.':1,'s':1,'s.':1,'man':2,'agree':1,'at':1},'fallow':{'deer':1},'gave':{'off':6,'of':1,'rise':2,'most':1,'place':1,'the':3},'precede':{'the':1},'natives':{'of':1},'cyclones':{'.':1},'cast':{'.':1,'aside':1,'by':2},'jellyfishes':{'the':1,'swimming-bells':1,'worms':1},'expenses':{'including':2},'experts':{'should':1},'decanter':{'for':1},'www.pglaf.org.':{'section':1},'significance--called':{'the':1},'containing':{'a':3,'meat':1,'liquid':1,'very':1,'say':1,'the':1,'more':1},'headley':{'life':1},'circumventing':{'the':1},'suggest':{'the':4,'that':3},'underwood.':{'boiling':1,'the':1},'sollas':{'w':1},'linked':{'to':1,'together':1},'forehead':{'and':2,'a':1,'the':1,'without':1,'beetling':1},'utilitarian':{'in':1},'complex':{'and':2,'fur':1,'of':2,'problems':2,'.':3,'forms':1,'as':1,'nucleus':1,'brains':1},'gambian':{'mud-fish':2},'advances':{'the':3,'that':1,'but':1,'came':1,'in':2},'scapula':{'or':1},'snow-line':{'.':1},'several':{'millions':1,'colours':2,'kinds':1,'centuries':1,'cells':1,'sometimes':1,'human':1,'times':1,'hours':2,'enregistered':1,'complex':1,'printed':1,'molecules':1,'cases':1,'years':1,'thousands':1,'other':1,'transparent':1,'more':1},'satellite':{'of':1},'peaks':{'.':1},'pick':{'them':1,'up':2,'out':1},'constantly--either':{'spontaneously':1},'mouse-pupil':{'with':1},'characters':{'even':1,'of':1,'is':1,'.':1,'such':1,'swarming':1},'darwin.':{'illustration':1},'cycle':{'thread':1},'mentioning':{'birds':1},'tassel':{'being':1,'discharged':2,'branches':1,'electrified':2,'strikes':1},'staving':{'off':1},'paralysed':{'and':2},'possessed':{'of':1,'by':1,'in':2},'boxes':{'golden':1,'similar':1,'difficult':1},'rock-pool':{'where':1},'wide-awake':{'more':1},'mother':{'and':7,'digs':1,'for':1,'places':1,'that':1,'may':1,'of':1,'orang':1,'spider':1,'carey':2,'s':2,'so':1,'are':1,'tramps':1,'earth':1,'.':2},'unification':{'but':1},'jean':{'brownian':1},'photosphere.':{'above--that':1},'possesses':{'.':1,'an':1},'seasonal':{'colour-change':2,'change':1},'food-supply':{'.':2},'departed':{'from':2},'mending':{'of':1,';':1},'harmonise':{'with':2},'eye-hole':{'of':1},'partridge':{'sitting':1},'foundation.':{'-':1},'rivulets':{'and':1},'tailless':{'cat':1},'insectivore':{'stock':1},'evolution.':{'we':1,'metcalf':1,'parasitism':1,'this':1,'hutchinson':1,'illustration':1,'mccabe':1,'v':1,'the':1,'darwin':1,'iii':1,'osborn':1},'vibration':{'increased.':1,'of':1,';':1,'.':1},'master-key':{'that':1},'leibnitz':{'s':1,'who':1},'triangular-shaped':{'piece':1},'apart':{'and':1,'from':14,'of':3,'continuing':1,'.':2,'the':2},'interprets':{'be':1},'humanity':{'of':1,'into':1,'.':1},'foot.':{'there':1},'casting':{'themselves':1},'tracheae':{'.':1},'breaks':{'making':1,'off':2,'up':1,'across':1,'under':1},'sussex':{'and':1,'weald--hinted':1,'in':1},'vulture':{'is':1},'chitin':{'which':1,'.':1},'flattish':{'web':1},'expels':{'vitiated':1},'descending':{'element':1},'judge':{'the':1,'animals':1},'burns':{'the':1,'without':1},'advanced':{'and':1,'again':1,'life':1,'knowledge':1,'.':1,'to':1,'than':1},'foster-parent':{'to':1},'melting':{'ice.':1,'ice':1},'appearing':{'and':1,'on':1,'more':1},'angoras':{'and':1},'gift':{'follows':1},'55':{'cubic':1},'57':{'photo':2},'gifted':{'a':1},'50':{'states':1,'000':1},'53':{'the':1},'52':{'inches':1},'specific':{'gravity':2,'permission':1},'gristly':{'fishes':2,'rod':1},'mosquito':{'is':1,'introduces':1},'fixity':{'of':1},'56':{'photo':2,'lb':1},'outpour':{'of':1},'over-anxious':{'on':1},'successfully':{'applied':1,'by':1},'sponge':{'121':1,'illustration':1,'.':1,'to':1,'densely':1,'which':1,'has':1,'or':2},'clawed':{'mammals':1},'cessation':{'of':1},'finger-posts':{'for':1},'indirect':{'consequential':1,'interference':1,'in':1},'guess':{'and':1,'what':1},'tracheate':{'arthropods':1},'intellect':{'who':1,'which':3},'rapidity':{'and':1,'of':1,';':1,'illustrating':1,'.':1},'first--began':{'to':1},'drowned':{'himself':1},'proceeding':{'to':1,'is':1,'in':1},'rhine':{'and':1},'hibernates':{'but':1},'self-effacing':{'flat-fishes':1},'ear':{'and':1,'a':1,'of':2,'well':1,'marked':1,'to':1,'below':1,'which':1,'in':1,'has':1,'160':1,'came':1},'ice':{'and':1,'when':1,'is':1,'ages':4,'it':1,'.':2,'age.':2,'age':5,'287':1,'travel':1},'everything':{'and':1,'appeals':1,'that':1,'is':1,'as':1,'depends':1,'in':1,'not':1,';':1,'teemed':1},'loins':{'of':1},'select':{'a':1,'the':3},'seals.':{'almost':1},'cord':{'and':1,'lies':1,'the':1,'then':1},'core':{'to':2,'is':1,'254':1,'illustration':1,'left':1},'antiquity--perhaps':{'30':1},'disappeared':{'and':1,'from':1,'leaving':1,'somewhat':1,'.':1,'with':1},'littoral':{'animals':1,'haunts':1,'zone':1,'area':3},'permitted':{'by':2},'chapter':{'on':1,':':1,'give':1,'is':1,'in':7,'one':1,'to':1,'how':2,'.':1,'has':1,'was':1,'more':1},'limitation':{'of':2,'set':1,'permitted':1,'in':1},'attacks':{'the':1},'plum':{'and':1},'spikelet-bearing':{'axis':1},'burbank':{'such':1},'plunging':{'into':1},'coiled':{'round':1,'up':1},'steadily':{'accumulating':1,'through':1,'radiating':1,'decreasing':1},'efforts':{'project':1,'of':1,'and':1,'her':1},'alga':{'like':1,'which':1},'sept':{'.':1},'osborn':{'h':2,'s':4,'points':2,'calls':1},'antique':{'types':1},'primitive':{'animals':1,'nebulae':1,'instrument':1,'insects':1,'constituents':1,'men':3,'mammals':2,'.':3,'forms':1,'bushmen':1,'heat':1,'races':1,'bolt':1,'culture':1,'peoples':1,'mammal':1,'collaterals':1,'creatures':1,'type':1,'types':2,'man':2},'cracking':{'the':1},'presence':{'of':4,'.':1},'orders':{'of':2,'families':1,'like':1},'puzzle':{'in':1},'visible':{'and':2,'on':2,'all':2,'from':1,'266':1,'light':1,'radium':1,'spots':1,'.':2,'to':3,'surface':3,'suspended':1,'in':1,'tens':1,'by':1,'at':2},'bath':{'nor':1},'finely':{'developed':1},'bats':{'certainly':1,'for':1,'.':2,';':1,'volplaning':1,'or':1,'involves':1},'existed':{'.':1},'rely':{'to':1},'weald--hinted':{'at':1},'outbreaks':{'on':1,'of':1},'indispensable':{'as':1,'role':1,'sociality':1,'if':1},'sneezing':{'and':1},'transform':{'mechanical':1},'sunlight':{'and':1,'for':2,'is':2,'reflected':1,'to':2,'can':2,'which':3,'in':2,'has':1,'into':1,'are':1,'he':1},'why':{'a':1,'do':1,'we':1,'animals':1,'they':1,'for':1,'this':1,'is':2,'there':1,'some':1,'it':2,'should':4,'most':1,'so':1,'iron':1,'not':1,'our':1,'the':2,'he':1},'stuck':{'together':1},'tacks':{'of':2},'partridges':{'respond':1},'metabolism':{'.':1},'synthesis':{'the':1},'round.':{'c':1,'in':1},'head':{'and':2,'weighted':1,'from':1,'just':1,'157':1,'of':6,'is':2,'after':1,'downwards':1,'to':1,'when':1,'65':1,'they':1,'the':1,'with':1,';':1,'shows':1},'medium':{'and':1,'on':1,'we':1,'that':1,'of':3,'called':1,'through':1,'a':1,'you':1,'throughout':1,'with':2,'or':1},'amateur':{'knows':1},'hydrogen--which':{'consists':1},'java.':{'2':1},'wireless':{'he':1,'telegraphy':1},'heat':{'and':9,'because':1,'being':1,'is':4,'as':1,'are':1,'in':2,'our':1,'.':9,'is--substitutes':1,'rays':1,'from':4,'for':1,'to':2,'there':1,'had':1,'continually':1,'how':1,'only':1,'radiated':1,';':3,'has':1,'energy':12,'that':1,'becomes':1,'introduce':1,'heat':1,'radiations':1,'by':1,'like':2,'on':2,'would':1,'of':4,'could':1,'chiefly':2,'so':1,'light':1,'the':1,'changes':1,'or':2},'silvery-looking':{'light':1},'hear':{'a':1,'about':1,'the':1,'it':1},'satisfactorily':{'accounted':1},'heap':{'it':1},'manoeuvres':{'she':1},'removed':{'all':1,'in':1,'from':1,'.':1},'donate.':{'international':1},'luxuriant':{'vegetation':1},'admiration':{';':1},'indo-china':{'china':1},'portions':{'and':1,'reached':1,'of':1},'consequences':{'may':1,'.':2,'to':1,'as':1,'follow.':1,'have':1},'born':{'a':1,'and':1,'like':1,'of':1,'in':1,'.':1,'as':1,'so':1,'child':1},'bids':{'fair':1},'vivo':{'as':1},'meteorites.':{'every':1},'undeniable':{'endeavour':1,'apartness':1},'disturbances':{'and':1,'of':3,'we':1,'are':1,'man':1},'prematurely':{'and':1},'brightly':{'illumined':2,'but':1,'coloured':3},'furs':{'.':1},'roamed':{'many':1},'escape':{'the':4,'.':1,'from':3,'between':1},'everest':{'would':1},'0.62':{'7700':1},'scotia':{'voyage':1},'universes.':{'illustration':1},'shines':{'through':1},'entellus':{'venture':1},'furl':{'if':1},'constructed':{'to':1,';':1,'from':1},'looked':{'a':1,'upon':1,'at':1,'like':1},'planets--venus--is':{'there':1},'inborn':{'inspirations':1,'predispositions':2,'novelties':1,'engrained':1,'repertory':1,'capacities':2,'pre-arrangements':1,'efficiencies':1,'impulse':1,'in':1,'not':1,';':1,'changes':1,'or':1,'powers':1},'no':{'atmosphere':1,'less':3,'lack':1,'resistance':1,'commoner':1,'hibernation':1,'facts':1,'nearer':1,'glimpse':1,'effort':1,'better':1,'tail':1,'other':3,'warrant':2,'real':1,'sound':1,'return':1,'animal':1,'descendants':1,'trees':1,'figment':1,'instinctive':2,'difference':2,'twilight':1,'bigger':1,'particle':1,'success':1,'yucca':1,'cry':1,'eel':1,'indication':1,'nerves':1,'bulky':1,'scenery':1,'right':1,'hard':1,'idea':1,'sign':1,'cost':2,'escape':1,'employment':1,'bacteria':1,'enemies':1,'blue':1,'living':2,'thoroughfare':1,'steadfast':1,'opening':1,'definite':2,'spur':1,'kidneys':1,'movement':1,'body':1,'noise':1,'cleverer':1,'power':1,'parental':1,'attention':1,'use':3,'twinkling':1,'difficulty':2,'reason':4,'chapter':1,'restrictions':2,'great':1,'actual':1,'feelers':1,'certainty':1,'transition':1,'motion':1,'connection':1,'place':1,'nervous':1,'successors':1,'transit':1,'one':16,'such':6,'sounds':1,'scent':1,'ether':1,'landscape':1,'exertions':1,'jugglery':1,'additional':1,'union':1,'discrimination':1,'doubt':28,'positive':1,'interest':1,'more':5,'remedies':1,'life':2,'tissues':1,'way':1,'reaction':2,'training':1,'direct':2,'adult':1,'true':1,'plants':2,'animals':2,'conception':1,'cells':1,'air':1,'individual':1,'risks':1,'chlorophyll-possessing':1,'proof':2,'larger':3,'deliberation':1,'lock':1,'modern':3,'mind':1,'mining':1,'evidence':4,'chin':1,'sense':1,'ready':1,'floating':1,'organs':1,'check':1,'winter':1,'depth':1,'chemical':1,'vital':1,'branch':1,'intelligent':1,'plant':1,'star':1,'crowding':1,'trace':3,'backbone':1,'vicious':1,'prohibition':1,'pouch':1,'representations':1,'slums':1,'man':1,'diffusion':1,'longer':8,'rotting':1,'light':2,'shore':1,'fresh':1},'whereas':{'on':1,'lead':1,'these':1,'in':2,'others':1,'the':3},'tip':{'of':5,'t':1,'to':2,'.':1},'perfected':{'on':1,'scientific':1,'by':1},'tin':{'with':1},'setting':{'apart':3,'forth':1,'in':1},'sobral':{'brazil':1,'brazil.':1},'globigerinid':{'foraminifera':1},'investigations':{'in':1},'papers':{'and':1,'the':1},'pipa':{'the':1,'americana':2},'picture':{'represents':1,'these':1,'of':11,'is':1,'acts':1,'an':1,'the':2,'with':1,'shows':1},'ceasing.':{'where':1},'worm-types.':{'among':1},'toad':{'and':1,'winds':1,'s':1,'pipa':3,'looks':1},'preceding':{'state':1,'neanderthal':2,'the':1},'uniformly':{'around':1},'emission':{'came':1},'flower-perfumed':{'nor':1},'leonard':{'johnson':2},'ridges':{'and':3,'the':2,'which':1},'dullest':{'red':1},'discharge':{'takes':1,'of':3,'travels':1,'through':1,'in':4,'with':1},'suffused':{'with':3},'thorax':{'.':1},'buller':{'s':1},'to-day':{'and':2,'is':2,'as':1,'are':2,'in':1,'there':1,'.':13,'attack':1,'recapitulates':1,':':1,'mostly':1,'that':2,'very':1,'after':1,'but':1,'such':1,'by':1,'104':1,'a':2,'about':1,'of':2,'shall':1},'longer':{'be':2,'what':1,'redolent':1,'than':7,'in':1,'deny':1,'or':1,'to':3,'because':1,'at':1,'waves':1,'the':1,'.':1,'emit':1},'n.':{'america.':1},'1800':{'of':1},'vigorously':{'.':1,'continued':1,'for':1,'that':1},'changed':{'and':1,'by':1,'from':1,'but':1,'.':1,'in':1,'the':3,'its':1},'hypohippus':{';':1},'serious':{'and':1,'errors':1,'business':1,'nervous':1,'friction':1,'responsibilities':1,'difficulties':1},'nuclei':{'then':1,'within':1},'undoubted':{'but':1},'remarkable':{'plants':1,'and':2,'bony':1,'physical':1,'knowledge':2,'success':2,'habit':2,'appearance':2,'metamorphosis':1,'combination':1,'results':1,'discovery':2,'except':1,'power':3,'exuberance':1,'perfection':1,'words':1,'locomotor':1,'.':2,'sucking':1},'varying':{'forms':2,'nature':1,'notably':1,'magnitude--and':1,'degrees':1,'situation':1,'with':1},'rod':{'which':1,'.':1},'focus':{'of':1,'whence':1,'within':1},'leads':{'to':2,'one':1,'us':2,'on':1},'inspirations':{'of':1},'computation':{'.':1},'coyote':{'.':1},'jointed-footed':{'invaders':1,'animals':1},'dragon-flies':{'and':2,'are':1},'displaying':{'the':1,'performing':2,'or':1},'tucking':{'it':1},'injure':{'their':1},'doom':{'by':1},'books--an':{'outline':1},'essentials':{'of':1},'ascidians':{'and':1},'fahr.':{'due':1},'metallurgists':{'and':1},'passage':{'from':6,'of':3,'is':2,'onward':1,'direct':1,'in':2},'environment':{'and':4,'we':2,'adaptations':1,'where':1,'acts':1,'.':3,'to':1,'113':1,'which':1,'making':1,';':1,'education':1,'with':1},'charge':{'and':1,'on':1,'anything':1,'for':1,'was':1,'of':3,'to':1,'a':3,'with':1},'promoting':{'the':1,'free':1},'discovering':{'new':1},'hammers':{'on':1,'until':1,'it':1},'ulna':{'of':1,'bone':1},'advantage':{'for':1,'may':2,'of':7,'over':2,'here':1,';':1,'was':1,'is':1},'coot':{'swims':1},'exalted':{'powers--man':2},'inspiriting':{'picture':1},'fleece':{'cutting':1},'untenable':{';':1},'nesting':{'behaviour':1},'refractive':{'granules':1},'regular.':{'now':1},'roving':{'animal':1},'cool':{'and':1,'mass':1,'gas':1},'annihilated':{'distance':1},'clouds':{'of':3,'which':1,'in':1},'impressive':{'triumphs':1,'picture':1,'nebula':1},'level':{'and':1,'on':3,'of':5,'is':1,'there':1,'up':1,'.':3,'at':1,'the':1,';':1,'man':1},'sedimentary':{'rocks':6},'hawaii':{'to':1},'cloudy':{'precipitate':1},'standards':{'is':1,'are':1},'starlit':{'night':1},'slouching':{'gait':1},'vicissitudes':{'due':1},'quick':{'to':5,'or':1},'lever':{'against':1},'accumulation':{'of':2},'bull-terrier':{'called':1},'illustrating':{'the':5,'walking':2,'animal':1},'trend':{'of':3},'becquerel':{'brought':1,'was':1},'obsolete':{'old':1},'inland':{'and':1,'the':1,'than':1},'widened':{'and':1},'invaded':{'age':1,'by':1},'dried':{'and':1,'up':4},'hair.':{'the':1},'trent':{'the':1,'291':1,'290':1,'an':1},'danger-note':{'.':1},'bacteria':{'and':1,'serving':1,'that':1,'of':2,'though':1,'.':1,'can':1,'have':1,'in':1},'substitute':{'the':1},'spectral':{'lines':1},'water-plants':{';':1},'stands':{'about':1,'unique':1,'by':2,'apart':1},'stomach.':{'4':1},'structure--the':{'remains':1},'extinct.':{'unfortunately':1,'others':1},'paragraph':{'1.f.3':3,'1.e.1.':1,'to':1,'1.e':1,'f3':1,'1.e.8':1,'1.c':1,'1.e.8.':1,'1.e.1':1},'goes':{'on':6,'back':1,'leaving':1,'down':1,'to':4,'as':1,'without':1,'through':1},'bearers':{'and':1},'illimitable':{'.':1},'morgan':{'observed':1,'s':1,'who':1,'was':1},'intelligent.':{'sec':1},'ninety-nine':{'cases':1},'mean--matter':{'ether':1},'evolution-idea':{'to':1,'is':2,'has':1},'water':{'and':15,'brightly':1,'because':1,'furnished':1,'being':1,'is':5,'spider':1,'held':1,'as':2,'owing':1,'through':1,'are':1,'in':5,'earth':1,'out':2,'even':1,'will':1,'from':4,'would':2,'to':8,'remains':1,'began':1,'that':4,'28':1,'.':28,'how':1,'only':1,'offers':1,'which':2,';':5,'gets':1,'was':1,'into':2,'do':1,'than':1,'though':1,'may':1,'but':3,'gently':1,'flows':1,'came':1,'rises':1,'with':2,'by':1,'nor':1,'a':2,'on':3,'periodically':1,'has':1,'animals':1,'for':4,'you':1,'fills':1,'did':1,'of':2,'seldom':1,'vigorously':1,'occurs':1,'sometimes':1,'where':1,'near':1,'became':1,'so':1,'can':2,'were':1,'at':3,'beneath':1,'disappears':1,'or':2,'comes':1,'first':1},'meteorites':{'is':1,'it':1,'every':1,'are':1,'have':1,'enter':1,'or':1},'generation.':{'the':1,'they':1},'twentieth':{'trial':1},'groups':{'of':4,'are':2,'drifting':1},'cyril':{'crossland':1},'dissipated':{'as':2,'the':1,'.':1},'cork':{'she':1,'out':1},'f.r.s.':{'conservator':1},'one--of':{'protective':1},'pearly':{'nautilus':7,'nautilus.':1},'bygone':{'ages':1},'thirty':{'miles':1,'million':4,'stars':1,'deep':1,'years':4},'healthy':{'lives':1},'chalmers':{'mitchell':1},'blotch':{'on':1},'sex--beginning':{'of':2},'stomachs':{'of':1},'descended':{'and':1,'from':6},'weird':{'ways':1,'peaks':1},'illustrations.':{'1':1},'say--of':{'various':1},'emerge':{'the':2,'before':1,'from':1,'as':1,'in':1},'credited':{'with':1},'threes':{'and':1},'semang':{'and':1},'swallowed':{'and':1,'by':1,'one':1},'crisis':{'in':1},'wings.':{'vi':1},'bulbs':{'on':1},'russell':{'has':1,'sons.':2},'atom.':{'how':1,'the':1,'like':1,'an':1},'percept':{'of':1},'prey':{'of':1,'by':1,'working':1,'.':3},'memory':{'of':1},'negroes':{'and':1},'lycosa':{'lying':1},'australian':{'and':1,'mudfish':1,'race':1,'more-pork':2,'frilled':2,'the':1,'species':1},'diagrams':{'of':1},'conductor':{'of':1},'bristle-tails':{'show':1},'fuel':{'.':1},'flapping':{'their':1},'southwards':{'following':1,'.':1},'sequoia':{'or':1},'cases':{'is':2,'within':1,'it':4,'purely':1,'at':1,'in':3,'yet':1,'its':1,'out':2,'no':1,'rather':1,'there':2,'two':1,'.':3,'to':1,'supplanted':1,'much':1,'which':1,'under':1,'relatively':1,'be':1,'we':2,'that':2,'stow':1,'however':4,'they':1,'measured':1,'than':1,'like':1,'especially':1,'e.g':3,'this':1,'of':3,'the':9,'where':3},'andalusia':{'arabia':1},'autumn':{'gales':1,';':1,'or':1,'they':1},'diagram.':{'the':1},'collision':{'with':2},'thousands':{'being':1,'of':17,'but':1},'reflux':{'of':1},'modified':{'and':1,'for':2},'means.':{'sec':1},'handle.':{'in':1},'districts':{'here':1,'.':1},'jetsam':{'that':1},'female-producing':{'egg':1},'wrong:':{'hence':1},'fauna':{'of':5,'is':1,'there':1,'namely':1,'.':1,'contemp':1,'as':2,'does':1,'bodily':1},'attain':{'a':1},'streak':{'of':1},'hutchinson':{'h':1},'wrist-bones':{'with':1},'stream':{'and':1,'sometimes':1,'gripping':1,'seeking':1,'of':7,'there':1,'some':1,'.':1,'relative':1,'that':1,'going':1,'the':1,'with':1,'or':1,'ought':1,'through.':1},'irruption':{'of':1},'supra-renal':{'and':1,'.':1},'and--it':{'smells':1},'coal--dissipation':{'of':1},'amalgams':{'and':1},'stroke':{'of':4},'performed':{'viewed':1},'octopus.':{'shifts':1},'flora.':{'the':1},'provoke':{'new':1,'them':1},'hydrogen':{'and':3,'uniting':1,'19':1,'travel':1,'atom':1,'gas':4,'.':2,'to':1,'rising':2,'at':3,'were':1,'so':1,'was':1},'requirements':{'of':1,'we':1,'are':1,'.':1},'white-hot.':{'they':1},'mole':{'and':1},'secured':{'in':1},'eloquent':{'vestige':1,'anticipation':1,'detail':1,'instance':1,'in':1,'than':1},'innumerable':{'tons':1,'methods':1,'minute':1},'fishes--a':{'very':1},'ginkgos':{'and':1},'vital':{'and':1,'activities':1,'processes':2,'power':1,'importance':2,'inter-relations':2,'than':1,'to':1,'connection':1,'interest':1,'activity':1,'laboratory':1,'process':1,'sounds':1,'economy':1},'fourth':{'and':1,'great':2,'haunt':1,'ice':1,'state':3,'printing':1,'millennium':1,'glacial':1},'speaks':{'of':1},'reactions.':{'3':1},'secures':{'the':1},'unutterably':{'stupid':1},'information':{'is':2,'about':6,'can':1},'digesting':{'intruding':1,'them':1},'larmor':{'suggested':1},'eighty':{'figures--bison':1,'distinct':1,'different':1,'miles':1,'million':1},'unawares':{'.':1},'apprenticeship':{'and':2,'often':1,'of':1,'since':1,'.':1,'to':1,'at':1,'in':1,'during':2,'the':1},'eighth':{'printing':1},'branches':{'and':1,'down':1,'still':1,'that':1,'of':6,'in':1,'.':2,'will':1,'gives':2,'firmly':1,'at':1,'hanging':1,'must':1,'come':1,'or':2,'out':1},'drained':{'swamps':1},'commodity':{'on':1},'joint':{'to':1},'enemies.':{'when':1,'if':1},'branched':{'and':2},'lagoon':{'and':1},'water-oceans.':{'in':1},'lamented':{'the':1},'imagining':{'how':1},'estuary':{'and':1},'furnished':{'the':1,'them':1,'an':1},'constituents':{'may':1,'and':1,'.':1,'of':1},'mainly':{'composed':1,'among':1,'arboreal':1,'vegetarian':1,'to':1,'in':2,'vertical;':1,'by':1},'discharging':{'them':1,'sepia':1},'ocean-troughs':{'and':1},'furnishes':{'a':2},'ducklings':{'catch':1},'motions':{'would':1,'of':2,'can':1,'which':1,'along':1,'are':1},'weather.':{'there':2},'side--a':{'mobility':1},'pre-eminent':{'as':1,'e.g':1},'pterodactyls':{'varied':1,'could':1,'had':1,'birds':2,'by':1,'gave':1},'supplemented':{'the':1},'emmer':{'which':1},'wallace':{'maintained':1,'was':1,'darwinism.':1},'organisation':{'than':1},'mantle':{'of':1,'as':1},'offers':{'to':2,'the':1,'grave':1,'an':1},'marvels':{'the':1},'meridian':{'while':1,'.':1},'whirlpool':{'of':1,'or':1},'employment':{'of':2},'pre-dravidians.':{'the':1},'obtaining':{'a':2,'considerable':1},'motion.':{'the':2},'photograph.':{'illustration':2},'evolution':{'and':2,'particularly':1,'is':13,'states':1,'as':1,'are':1,'in':8,'home':1,'if':2,'from':1,'no':1,'remains':1,'there':3,'.':12,'current':1,'to':4,'that':2,'going':11,'fig':1,'which':2,';':1,'has':6,'was':6,'real':1,'we':1,'led':1,'theory':3,'means':1,'but':3,'quite':1,'not':1,'animals':1,'1917':1,'chequered':1,'a':1,':':1,'implies':1,'especially':1,'practically':1,'of':54,'introductory':1,'53':1,'element':2,'will':1,'so':1,'agoing.':1,'though':1,'the':4},'delighted':{'darwin.':1},'underneath':{'things':1,'the':2,'her':1,'.':1},'expertness':{'the':1},'conquer':{'every':2,'for':1},'browns':{'and':1},'sowing':{'and':1,'but':1},'term':{'race':1,'commensalism':1},'name':{'given':1,'from':2,'for':1,'of':1,'cock-paidle':1,'electrons':1,'which':1,'mare.':1,'associated':1,'primates':1},'civilisation':{'of':1,'is':1,'there':1,'here':1,'.':1,'depends':2,'the':1,'more':1},'advent':{'of':1},'possibilities':{'and':1,'of':3,'.':1,'are':1,'in':1,'probably':1},'realise':{'of':1,'the':3,'what':1,'that':3},'telegraphic':{'and':1},'individually':{'and':1},'weighted':{'with':1},'gape':{'and':1,'two':1},'woodpeckers':{'are':1},'sprinkle':{'iron':1},'catching':{'and':2,'small':4,'the':2,'with':1,'some':1},'begun':{'to':1,'before':1,'some':1,'.':1},'distributor':{'under':1},'tumultuous':{'surging':1},'y.s.':{'which':1,'.':1},'ultimately':{'composed':1,'the':1,'dispensed':1},'intercourse':{'and':1,'.':1},'factors':{'and':1,'would':1,'that':2,'of':2,'which':1,'in':5,'the':1},'profit':{'a':1,'by':2,'501':1},'these--which':{'illustrate':1},'attracted':{'to':1,'one':1},'parallax':{'the':1},'kent':{'dating':1,'but':1,'cro-magnon':1},'picture-logic':{'which':1},'overflowing':{'waters':1},'eagle':{'lifts':1,'or':1},'--the':{'mind':1,'planets--venus--is':1},'performing':{'distributing':1,'other':1,'displaying':1,'chimpanzee':1,'copying':1},'theory':{'is':7,'as':1,'sec':1,'in':1,'bears':1,'.':1,'which':3,';':1,'has':1,'was':1,'more':1,'we':1,'provides':1,'that':5,'1796':1,'but':2,'vividly':1,'nor':1,'a':1,'implies':1,'of':16,'or':1},'stimuli.':{'animals':1},'interpose':{'when':1},'ascertain':{'how':1},'electrified':{'270':1,'and':1,'the':1,'with':1,'will':1},'gizzard--certainly':{'the':1},'explorers':{'of':1},'reptiles--snakes':{'lizards':1},'importance.':{'difficulties':1,'sec':1},'www.pgdp.net':{'updated':1,'illustration':1},'corroborating':{'individual':1},'motion':{'and':2,';':2,'would':1,'was':1,'whether':1,'of':3,'is':2,'within':1,'or':1,'to':1,'as':2,'than':1,'in':1,'into':1,'the':1,'.':3,'ever':1,'kinetic':1,'are':1},'turn':{'on':1,'form':1,'stiff':1,'of':3,'is':1,'it':1,'the':2,'to':4,'are':1,'in':1,'into':1,'making':1,'white':1,'with':1,'round':1,'becomes':1,'once':1},'butterflies':{'allied':1,'are':3},'place':{'and':2,'is':1,'inaccessible':1,'it':1,'itself':1,'in':1,'end':1,'for':3,'remains':1,'there':2,'favouring':1,'preventing':1,'to':4,'work;':1,';':1,'let':1,'by':1,'a':1,'on':1,'of':9,'work':1,'sea-anemones':1,'the':1,'where':1,'or':1},'retreating':{'forehead':1},'swing':{'of':1,'to':1},'deep-sea':{'life':1,'animals':2,'fish':3,'sponge':2,'corals.':1,'are':1,'fishes':2,'fauna':1},'gradually.':{'when':1},'close-set':{'eyes':1},'saucers':{'.':1},'weakling':{'it':1},'origin':{'and':3,'of':19,'is':1,'there':1,'direct':1,'are':1,'the':1},'pelican':{'s':2},'surviving':{'the':1,'symbol':1},'revenue':{'service':1},'faculty':{'in':1,'if':1},'greatest.':{'v':1},'soaring':{'upward':1},'them--':{'melanocetus':1},'array':{'of':1},'field-voles':{'perhaps':1},'george':{'h':1},'millions':{'of':39,'the':1,'is':1,'.':1},'gertrude':{'white':1},'given':{'because':1,'over':1,'sense-presentation':1,'as':2,'in':1,'.':1,'to':8,'illustrations':1,'conditions':1,'variability':1,'away--you':1,'sufficient':1,'rise':1,'but':1,'part':1,'an':2,'by':2,'a':5,'off':1,'up':1,'us':2,'place':2,'the':3},'necessarily':{'be':1,'progressive':1,'keep':1,'progressive;':1,'cooling':1,'difficult':1},'persons.':{'the':1},'marine.':{'in':1},'croaking-sacs':{'which':1},'trillion':{'100':1,'miles':5,'revolutions':1,'molecules':1,'waves':1},'tides--origin':{'of':1},'plastic':{'and':3,'appreciation':1,'stock--some':1},'stimulation':{'proves':1},'hardwood':{'forests':1},'returns':{'to':1,'.':1},'virgil':{'refers':1},'fortuitous':{'.':1},'legally':{'required':1},'white':{'and':1,'polar':1,'one':2,'hair':1,'ermine':1,'in':1,'dress':1,'surfaces':1,'winter':1,'except':1,'.':2,'surroundings':1,'combine':1,'stars':2,'cross':1,'save':1,'body':1,'then':1,'star':1,'of':1,'but':1,'pigment':1,'heat':2,'wake':1,'pelage':1,'background':1,'remarks':1,'with':1,'by':1,'card':1,'plumage':1,'fur':1,'coat':1,'colour':1,'will':2,'s':1,'mass':1,'light':9,'blackbird':1,'the':1,'or':1,'blood':1},'anguilla':{'vulgaris':1,'vulgalis':1},'farthing--contains':{'an':1},'gives':{'a':7,'rise':1,'up':1,'us':5,'.':1,'place':1,'the':2},'sex-call':{';':1,'.':1},'million.':{'there':1},'hug':{'the':1},'aurelia':{'.':1},'centipedes':{'and':2,'millipedes':1,'spiders':1},'hum':{'comparable':1},'circulated':{'round':1},'released':{'from':1},'suspended.':{'the':1},'freeze':{'throughout':1},'holder':{'found':1,'the':1,'.':1,'your':1,'on':1},'intrinsically':{'too':1},'population':{'consists':1,'of':5,'could':1,'contains':1,'.':1},'eohippus':{'about':1,';':1},'unfortunately':{'the':1,'we':1},'require':{'a':1,'extension':1,'no':1,'fifty':1,'to':3,'much':1,'such':1,'intelligent':1},'pigmy':{'representatives':1},'modelled':{'by':6},'computer':{'virus':1,'codes':1},'ooze':{'likewise':1,'so':1,'of':1},'aesthetic':{'reasons':1},'proteins':{'e.g':1},'1.e.9.':{'1.e.8':1,'1.e.3':1},'earth.':{'a':1,'we':1,'is':1,'it':1,'illustration':1,'making':1,'the':1,'establishment':1},'and':{'discards':1,'all':10,'pheasant':1,'consider':1,'caused':1,'stems':1,'results':1,'foul':1,'four':1,'crocodile':1,'avalanche':1,'debris':1,'broader':1,'dainty':1,'go':3,'honour.':1,'nematodes':1,'decisions':1,'causes':2,'skeleton':1,'hold':4,'depend':1,'hunting':1,'educable':1,'shrinkage':1,'father':1,'young':4,'send':1,'squirrels':2,'to':29,'finally':5,'reptiles':1,'skill.':1,'stable':1,'portentous':1,'hammers':1,'cochroaches':1,'sent':1,'ulna':1,'activities':1,'protective':1,'presently':1,'club-moss':1,'very':4,'einstein--the':1,'miners':1,'wave':1,'interglacial':1,'coal-measures':1,'fall':2,'mixing':1,'more.':1,'soles':1,'monkeys':2,'minute':2,'respiratory':1,'baking':1,'parrot':1,'ceased':1,'tear':1,'michael':1,'joined':1,'culminating':2,'large':1,'these':13,'sand':1,'guiding':1,'small':2,'venus':1,'mammoth.':1,'snails':1,'round':1,'degeneracy':1,'favoured':1,'smaller':2,'illustrating':1,'ten':1,'concise':1,'imagination.':1,'becquerel':1,'measurable':1,'seas.':1,'second':2,'notwithstanding':1,'further':1,'nests':1,'perish':1,'even':12,'established':2,'what':10,'stood':1,'constitution':2,'voluminous':1,'giving':1,'storks':1,'fingers':1,'emotions':1,'hereditary':1,'white-hot':1,'salamanders':1,'above':2,'new':5,'3a':1,'cycad':1,'guinea-pigs':1,'bird':2,'alertness':1,'scenery':1,'brain-case':2,'toes':5,'malaria':1,'gathered':1,'concepts':1,'here':2,'hundreds':2,'water':8,'reported':1,'humidity.':1,'let':3,'others':12,'lull.':2,'strong':2,'anchoring':1,'extreme':1,'dry':3,'great':1,'substance':1,'broken':1,'technical':1,'employees':2,'whine':1,'36':1,'animals--the':1,'apes':5,'credit':1,'smoke':1,'browsing':1,'bettered':1,'weird':1,'otters':1,'makes':1,'beautiful.':1,'sticking':1,'control':1,'adjustable':1,'love':2,'waves--light--what':1,'family':1,'distributed':2,'bathers':1,'feelings':1,'peahen':1,'retires':1,'preparatory':1,'comets--millions':1,'sugar':1,'herring':1,'select':1,'ape':1,'standing':1,'use':1,'from':10,'takes':1,'working':1,'distinct':1,'positive':1,'continuous':1,'give':3,'two':6,'trilobites.':1,'distributing':1,'ocean-basins.':1,'live':2,'touched':1,'untie':1,'therefore':6,'taken':2,'tell':1,'more':23,'brings':2,'habits--the':1,'about':1,'chimpanzee':2,'jellyfishes':1,'magnesium.':1,'carrying':2,'big':1,'rabbit':1,'lawlessly':1,'hjort':1,'tearing':2,'must':1,'swooping':2,'metazoa':1,'animals':15,'fro.':1,'this':23,'work':2,'sucks':2,'london':1,'guards':2,'diverse':1,'crickets':1,'can':2,'mr':1,'knocked':1,'making':2,'fauna':1,'scatter':2,'mud-fishes':1,'beautiful':1,'sinking':2,'squat':1,'escapes':1,'of':27,'share':1,'purposes':1,'accept':1,'pieces':1,'parachute':1,'heard':1,'rise':1,'masterfulness':1,'bones':1,'every':4,'provoke':1,'hydrogen':1,'offspring':2,'salts':5,'firmly':1,'sir':1,'winter':2,'decaying':1,'telephonic':1,'rather':1,'breaking':2,'gannets':1,'oligocene':1,'species':1,'fishes--a':1,'cycads':2,'hot':1,'occasionally':1,'aerates':1,'animal':1,'elephant':1,'relinquished':1,'willing--has':1,'expresses':1,'oceans':1,'maternal':1,'utilise':3,'inconceivably':2,'may':7,'digesting':2,'burrowing':1,'after':3,'southern':2,'permanent':2,'produce':1,'space.':1,'curiosity':2,'coming':1,'such':2,'flourish':2,'grow':2,'lids':1,'man':4,'a':67,'short':1,'calves':1,'remember':1,'third':2,'pithecanthropus':1,'light':6,'register':1,'descends':1,'think':1,'eye':2,'perhaps':5,'complexity':2,'gloomy':1,'so':35,'silence':1,'back--till':1,'reflux':1,'first':1,'moulton.':1,'make':1,'furnish':1,'grasshoppers':1,'digested':1,'help':1,'furnished':1,'unpalatable':3,'indeed':1,'over':5,'altogether':1,'orang':1,'soon':1,'years':2,'produced':1,'bounding':1,'toads':3,'thinner':1,'including':1,'looks':1,'drifters':1,'cuts':3,'mottlings':1,'still':1,'its':17,'roots':1,'before':2,'chemical':2,'26':1,'27':1,'curly':1,'thence':1,'willow':1,'mites':1,'coarser':1,'forms':2,'saturn--the':1,'absence':1,'dogfish':1,'marsh':1,'dwarfs':1,'hind-limb':1,'societies':1,'admirable':1,'no':12,'formosa':1,'finer':1,'then':22,'evening':1,'return':2,'fourth':1,'seeking':1,'africa.':1,'saltatory':1,'inter-relations':1,'kin.':1,'giraffe':2,'elephants.':1,'they':26,'not':5,'now':1,'lifelong':1,'smoothness':1,'down':2,'obviates':1,'bluffing':1,'rocky':1,'oxygen':1,'mathematician':1,'hunterian':1,'proteins':1,'identified':1,'composition':1,'explode':1,'did':1,'someone':1,'habits':2,'2a':1,'realise':1,'each':3,'veins':1,'feeds':1,'higher':4,'erratic':1,'lively':1,'enigmatic':1,'reactions':1,'clams':1,'matthew.':2,'snakes':3,'weight':1,'elephants':3,'there':42,'energy':8,'hard':1,'prolonged':1,'tobogganing':1,'unlock':1,'catching':4,'fewer':1,'primates':1,'year':2,'our':4,'beyond':2,'primitive':4,'conspicuous.':1,'out':2,'living':1,'opened':1,'present':2,'since':3,'research':1,'looking':1,'transforming':1,'laid':1,'mate':1,'pool':1,'got':4,'get':1,'receiving':1,'cause':1,'caucasian':1,'red':1,'shows':2,'buds':1,'turning':1,'inert':1,'telescoped':1,'horse':2,'decay.':1,'quite':1,'backboneless':1,'reason':1,'complicated':1,'splashes':1,'besides':1,'backed':2,'animals;':1,'cattle':1,'steering':1,'swimming':2,'lifts':1,'delight':1,'importance.':1,'organic':1,'mortar':2,'could':2,'put':3,'success':1,'keep':1,'motion':3,'turn':1,'butterflies':1,'massive':1,'withering':1,'hence':1,'stone':1,'pterosaurs':1,'zoophyte':1,'throws':1,'south':3,'toads--it':1,'knots':1,'copper':2,'finest':1,'possessing':1,'waves':2,'delicately':1,'one':7,'feet':1,'will':4,'unexpected':1,'disappearing':1,'another':7,'carry':2,'gripping':1,'blows':1,'ways':1,'earthworms':1,'size':2,'sheep':1,'continental':1,'given':3,'tadpoles':1,'monkey':1,'similarly':1,'apple.':1,'opportunity':1,'caught':1,'relations':1,'plastic':1,'1a':1,'their':23,'2':6,'wasps':4,'motility':1,'democracy':1,'embryology':1,'anatomises':1,'dogs':3,'opening':1,'gives':1,'muscles':1,'imperfect':1,'starfish':1,'that':57,'brains':1,'needle':1,'screwing':1,'bees.':1,'folded':1,'part':2,'because':2,'cereal':1,'manipulation':1,'rivers':3,'white':3,'explodes':1,'lays':2,'distance':1,'kind':1,'legs':1,'meteors':1,'looting':1,'showed':1,'depressed':1,'sea-squirts':1,'vocal':1,'instincts--of':1,'project':1,'matter':1,'future':1,'magnesium':1,'iron':1,'arboreal':1,'starfishes':1,'hailstones':1,'proofread':1,'dusty':1,'anthropoid':2,'extracting':1,'manatees':1,'dust--that':1,'sea':1,'7a':1,'violets':1,'gate-posts':1,'modern':1,'mind':4,'lice':1,'bugs':1,'disguise--other':1,'gentle':1,'say':1,'have':4,'need':1,'vigorous':1,'fishes':1,'clearly':1,'relatively':1,'forced':1,'strength':1,'built':1,'-':1,'peculiarities':1,'also':8,'fitting':1,'internal':1,'take':1,'which':5,'deepening':1,'swims':1,'foot--an':1,'surfaces':1,'begin':1,'shallow':1,'lion':1,'though':2,'any':5,'proving':1,'who':1,'fishermen;':1,'falls':2,'creek':1,'most':5,'microbic':1,'eight':1,'printed':1,'nothing':1,'foothold':2,'measured':2,'why':4,'behaviour.':1,'mineral':1,'feminine':2,'mobile':2,'pulled':1,'backwards':1,'sometimes':5,'hungry':1,'absorbing':1,'solemn':1,'dissolved':1,'reflecting':1,'electrons':3,'punting':1,'hurled':1,'distinctive':1,'velocity':1,'europe.':1,'physics':1,'molluscs':1,'repeatedly':1,'precise':3,'saying':2,'permeable':1,'selection':1,'one-eighth':1,'show':1,'insects':3,'disappear.':1,'scattered':1,'fifty':2,'discovered':1,'bring':2,'attempts':1,'fiord':1,'seaweed':1,'carefully':2,'corner':2,'continually':1,'find':1,'slow.':1,'sea-snakes':1,'sharks':1,'nearer':1,'judgments':1,'quaint':1,'varied':1,'heavily':1,'grotesque':1,'gouging':1,'should':1,'surroundings':2,'only':4,'going':1,'black':1,'deepest':1,'molecules':4,'germs':1,'uppermost':1,'pegged':1,'rice':1,'local':1,'do':2,'his':5,'means':1,'beat':1,'tissues':1,'leisure':1,'famous':1,'explosively':1,'rest':1,'lighter':1,'swiftest':1,'combinations':1,'instinctive':1,'thomson':1,'dr':1,'falling':1,'endless':1,'birds.':1,'playful':1,'evolution':1,'progressive':1,'alacrity':1,'exactitude':1,'kidneys':1,'rowing':1,'mathematicians':1,'eyebrow':1,'segregating':1,'she':1,'quaternary':1,'eventually':3,'through':1,'fixed':1,'farther':3,'body':1,'bars':1,'official':1,'predicts':1,'seas':2,'intelligence':1,'radium':2,'bears':1,'bolivia.':1,'decided':1,'cenozoic':1,'sea-serpents':1,'snow-capped':1,'violet':2,'collects':1,'frequency':1,'pliocene':1,'best':1,'sameness':1,'pebbles':1,'closes':1,'combustion':1,'brave':1,'inequalities':1,'plasticity':2,'rugged':1,'pattern':2,'away':1,'trilobite':1,'stealthy':1,'gaseous.':1,'weapons':1,'north-west':2,'3':5,'mind.':1,'various':1,'gases':1,'closed':1,'between':2,'progress':1,'open-sea':1,'timber':1,'birds':4,'beasts':1,'crookes':1,'we':37,'men':1,'explosive':1,'parental':1,'importance':1,'sole':2,'industrious':1,'craters':2,'fishermen':1,'saturn':4,'death':3,'drew':1,'energy--may':1,'proterozoic':1,'invisible':3,'carbon':1,'carnivorous':1,'come':2,'bronze':1,'c':2,'enables':3,'cox':1,'mongol':1,'borneo':1,'according':2,'attributed':1,'sea-urchin':1,'became':2,'figures':1,'wringing':1,'everything.':1,'loose':1,'comes':1,'unconvincing':1,'wade':1,'stretches':1,'diversity.':1,'simple':3,'structure':2,'fitness':1,'ganymede':1,'america':1,'lake':1,'moreover':1,'extinct':1,'suppressing':1,'ether':1,'better':1,'steamships':1,'described':1,'raise':2,'one-celled':1,'travailing':3,'fro':2,'three':3,'been':1,'jerks':1,'immense':1,'willing':2,'slowly':1,'sponges':1,'likewise':1,'degrees':1,'herbage':2,'spacious':1,'6a':1,'caterpillars.':1,'partly':5,'success.':1,'lakelets':1,'turned':2,'conifers':1,'mammals.':1,'amphibians':2,'drainpipes':1,'made':3,'kids':1,'demand':1,'sifting--the':1,'worked':1,'left-handed':1,'food-canal':1,'mammals--with':1,'spain':1,'inconspicuous':2,'plants':3,'tide':1,'heavier':2,'uncertain':1,'caucasians':1,'frozen':1,'leave':1,'sex':1,'as':16,'morley':1,'air':1,'growth.':1,'calcium':1,'while':1,'lichen':1,'cannot':3,'many':11,'wild':1,'valleys':1,'voice':1,'toothed':1,'leaves':1,'at':6,'comets':2,'streams':1,'palings':1,'almost':2,'soil':1,'is':33,'thus':7,'it':79,'expenses':2,'weighed':1,'trilobites':1,'against':2,'knocks':1,'in':42,'beaver':1,'vanish':1,'currents':1,'if':13,'different':1,'feebler':1,'cools':1,'inquire':1,'muscle-cells':4,'granted':1,'bat':1,'fading':1,'cultivated':3,'unity':1,'complex':1,'grand':1,'vegetable':1,'joy.':1,'gorging':1,'engravings.':1,'day':1,'difficult':2,'development':1,'alertness.':1,'used':1,'see':2,'planting':1,'comprehensive':1,'blue-greens':1,'blue':2,'hotter':1,'drives':1,'flows':1,'hand':1,'director':1,'much':1,'moving':1,'purpose':1,'dark':3,'brussels':1,'timid':1,'climb':1,'warming':1,'cycle':1,'poultry':1,'race-continuing':1,'narrow':1,'off':1,'modes':1,'cliff-loving':1,'changes':2,'variety':1,'neptune':2,'without':4,'severe':1,'rome':1,'trains':1,'position':1,'the':357,'chemistry':2,'drawing':2,'heaps':1,'indigo':1,'birth':1,'just':2,'flesh':1,'being':1,'uranium':1,'licensed':1,'distribute':3,'adjusted':1,'actions':1,'disguise':1,'violent':1,'radio-activity':1,'distant':1,'circling':1,'human':3,'touch':1,'useful':1,'skill':1,'yet':11,'captured':1,'addresses':2,'migration':1,'superficial':2,'enters':1,'evolution.':1,'legitimately':1,'far-reaching':1,'had':2,'melanocetus':1,'undulating':1,'crocodiles':1,'lets':1,'potential':1,'4':2,'easy':1,'hind':1,'usage':1,'hydrosphere.':1,'has':3,'5a':1,'peanuts':1,'good-humoured':1,'australia':1,'rodents':1,'depends':2,'transitional':1,'bristle-tails':1,'babylonia':1,'discontinue':1,'absorptive':1,'regard':1,'early':1,'sparrows':1,'ultra-violet':1,'facial':1,'dreamt':1,'grape-sugar':1,'redistributing':1,'string':1,'apart':2,'loss':1,'phenomena':1,'tail':1,'stingless':1,'lost':1,'ill':1,'cooler':1,'beyond-blue':1,'reduces':1,'sizes':1,'tend':1,'loses':1,'harmonising':1,'donations':3,'electro-magnetic':1,'night':2,'nerves':1,'downward':1,'disorder':1,'dentition':2,'newton':1,'portuguese':1,'performing':1,'old':1,'often':8,'habitat':1,'scents.':1,'hair-like':1,'difficulties':1,'some':15,'back':3,'pacific':3,'mosquitoes':1,'ideals':1,'understood':1,'therein':1,'towards':1,'jupiter':2,'convex':1,'duration':1,'diving':2,'bruising':1,'recognition':1,'feeling':1,'einstein':1,'dimensions':1,'for':5,'broad':1,'ice':1,'moon':5,'when':13,'critical':1,'passion':1,'meaningful':1,'conquering':1,'starch':1,'27-1':1,'nose':1,'limitations':2,'be':1,'depressions':1,'novelties':1,'selecting':1,'combative':1,'lakes':1,'expansion':1,'pressure':1,'enregistering':1,'fullest':1,'although':2,'become':6,'drawn':3,'stows':1,'repair':1,'by':14,'hearing':2,'on':9,'mammoths':1,'energetically':1,'would':1,'branch-gripping':1,'temper':1,'reappear':2,'theirs':1,'moths':1,'side':1,'cockroaches':2,'whence':1,'spreads':1,'three-quarter':1,'piled':1,'little-changed':1,'gamma':3,'plan':1,'heavy':1,'rats':1,'baboons':1,'sea-grass':1,'trademark':1,'into':2,'good':1,'habituations':1,'intellectual':1,'negative':7,'chemists':2,'spinal':1,'everyone':3,'bats':2,'rapid':1,'sow':1,'formidable':1,'financial':1,'error':5,'cross-fertilisation':1,'mental':2,'arctic':2,'deep-violet':1,'sticklebacks':1,'expositor':1,'chrysanthemum':1,'well-developed':1,'flying':4,'vigour':1,'fast':1,'reflectors':1,'rushes':1,'mudstones':2,'bees':5,'caterpillars':1,'physicists':1,'stars':3,'spring':1,'molecular':1,'wonderfully':1,'was':3,'fish':1,'naturally':1,'endeavour.':1,'deepened':1,'form':4,'kittens':1,'mammals':14,'spirit':1,'magnetism':1,'analyse':1,'within':2,'wireless':1,'mysterious':1,'heat':5,'brain':1,'competition':1,'flexible':1,'fastened':1,'ear':1,'with':15,'eat':1,'he':14,'balancing':1,'pull':1,'swamp':1,'places':1,'whether':1,'dangerous':2,'two-spined':1,'hind-limbs':2,'social':2,'up':1,'sticklebacks.':1,'foresight':2,'placed':2,'growth':1,'those':4,'shape':1,'how':7,'acting':1,'distribution':2,'piece':1,'similar':5,'professor':3,'storing':2,'proud':1,'constant':2,'mimicry--the':1,'taste':1,'certain':1,'measure':1,'porcelain':1,'deep':1,'an':11,'proper':2,'female':1,'senses':1,'periods':2,'planets':1,'crystals':2,'domesticated':1,'are':16,'struggled':1,'again':1,'functions':1,'ancestors':1,'readjustments':1,'entirely':1,'charitable':1,'mantises':1,'thither':2,'power':1,'other':21,'5':1,'adventure':1,'holding':3,'becomes':1,'u':1,'you':4,'smell':1,'chemist':1,'horsetails':1,'gaining':1,'consequent':1,'formed':1,'ordovician':1,'accidental':1,'shelter':1,'uniformly':1,'inherently':1,'planarian':1,'runs':3,'walton':1,'insect':1,'marshes':1,'scores':1,'lasso':1,'stocks':1,'carries':1,'died':2,'began':5,'your':1,'independently':1,'breaks':2,'faster':1,'sperm-cells':3,'practically':3,'controlled':1,'dog':1,'mme':1,'persistent':1,'walked':1,'gorilla':2,'ensuring':1,'redivides;':1,'conveying':1,'time':1,'fresh':1,'indirectly':1,'chimpanzee--and':1,'4a':1},'sea-gooseberries':{'which':1},'spectroscope:':{'it':1},'froth':{'which':1},'silvanus':{'p':1},'ant':{'to':2,'the':1,'has':1,'where':1,'.':1},'spectroscope.':{'we':1},'fall.':{'we':1},'mates':{'.':1},'any':{'woodwork':1,'money':2,'alternative':1,'snout':1,'hint':1,'alternate':1,'had':1,'permanent':1,'very':1,'pigment':1,'provision':1,'day':1,'condition':1,'sufficiently':1,'bad':1,'inherent':1,'disclaimer':1,'nitrogenous':1,'people':1,'idea':1,'rate':2,'distributor':1,'living':2,'mud':1,'body':1,'scientific':1,'use':3,'understanding':1,'protection':1,'collection':1,'monkey':1,'on':1,'substance':3,'country':1,'length':1,'suggestion':1,'copper':1,'statements':1,'point':1,'character':1,'one':3,'learning':1,'fees':1,'quality':1,'given':1,'additional':1,'zoologist':1,'cooling':1,'way':3,'suit':1,'white':1,'waste':1,'type':1,'more':2,'files':1,'hydrosphere':1,'muscles':1,'corresponding':1,'statement':1,'form':1,'ordinary':1,'apparent':2,'direct':1,'part':2,'virtue':1,'particular':2,'copy':1,'case':8,'kind':4,'word':1,'hour':1,'work':2,'project':3,'record':1,'of':3,'age':1,'sense':1,'influence':1,'defect':1,'agent':1,'rigorous':1,'in':1,'binary':1,'angle':1,'member':1,'other':16,'you':1,'star':1,'trace':1,'rain':1,'purpose.':1,'moment':2,'purpose':1,'necessity':1,'conscious':1,'light':1,'colour':1,'person':1,'time':1,'representation':1,'volunteers':1,'irregularity':1},'confirmation':{'of':2},'transcription':{'errors':1},'ideas':{'and':4,'meant':1,'what':1,'of':8,'is':1,'when':1,'but':2,'.':4,'are':1,'in':3,';':1,'or':1},'form-resemblance':{'for':1},'sciences':{'study':1,'forcing':1},'emphasis':{'on':1},'mesohippus':{'about':1,';':1},'fracture':{'of':1},'thermometer':{'seem':1},'resembling':{'a':1,'in':1},'shafts.':{'then':1},'primaries':{'pr':1},'inky':{'darkness':1},'sure':{'on':1,'that':2,'of':1,'but':1,'.':2,'effectiveness':1},'multiple':{'of':1,'pedigree':1},'nebulae--the':{'birth':1},'azores':{'or':1},'indelible':{'stamp':2},'harmonious':{'mingling':1},'clearer':{'to':2},'falls':{'on':1,'about':1,'of':4,'obliquely':1,'as':1,'they':1,'the':2,'286':1,'more':1},'hincks':{'astronomy':1},'boiling':{'a':2,'of':1,'point.':1,'ocean':1},'donation':{'methods':1},'multiply':{'quickly':1},'cleared':{'off':1},'spectroscopist':{'is':1},'dried-up':{'and':1},'study.':{'i':1},'thigh-bone':{'and':2,'indicates':1},'considered':{'what':1,'opaque':1,'only':1,'.':2,'also':1,'as':1,'they':1,'by':1},'proud':{'as':1,'.':1,'that':1},'science.':{'these':1,'the':1,'bibliography':1,'it':1,'illustration':1},'hungry':{'sharp-eyed':1,'hermit-crabs':1,'animals':1,'eyes':1},'idea.':{'what':1},'vulgaris':{'200':1},'prout':{'suggested':1},'quantity':{'of':7,';':1,'.':2},'detective':{'story':1},'pans':{'of':1,'as':1},'permeable':{'materials':1,'so':1},'spaced':{'from':1,'with':1},'solar':{'atmosphere':1,'observer':1,'system.':4,'phenomena':2,'prominences':4,'eclipse':3,'system':34,'surface':1,'system--regions':1,'electrons':1,'envelope':1,'spectrum':3,'system--with':2,'tides':1},'radiation.':{'that':1},'inshore':{'waters':1},'hustler':{'given':1},'homology':{'essential':2},'protrusion':{'of':2},'gulf':{'was':1,'in':1},'richness':{'of':1},'gull':{'with':1},'written':{'a':1,'confirmation':1,'recently':1,'explanation':2,'.':1,'in':2,'with':1,'by':1},'crime':{'and':1},'double-breather':{'dipnoan':1,'showing':1},'wood':{'jones':1,'of':1,'or':3,'but':1},'believing':{'that':1},'dreaded':{'it':1},'lighted':{'gas':1},'closed':{'the':1,'with':1,'in':1},'ink-bags':{'are':1,'.':1},'masking':{'the':1,'for':1},'expectation':{'of':2},'space.':{'many':1,'the':1},'bolometer':{'which':1},'radiations':{'the':1,'he':1},'vive':{'ready':1},'space;':{'and':1},'antler':{'or':1},'telescopes.':{'telescopes':1},'reveal':{'to':1,'the':1,'his':1},'reality--the':{'life':1},'aluminum':{'in':1},'floods':{'to':1,'or':1,'of':1},'naked':{'eye':2,'with':1,'body.':1},'scots':{'name':1},'bison':{'and':2,'delicately':2,'above':1,'.':1},'big-brained':{'modernised':1,'skulls':1,'extremely':1,'chimpanzee':1},'pouch;':{'while':1},'fainter':{'of':1},'borings':{'might':1},'orioles':{'.':1},'discussing':{'telescopes':1,'.':1},'ignored':{'.':1},'beholding':{'they':1},'encourages':{'us':1},'foetal':{'membrane':1,'membranes':1},'stars--or':{'rather':1},'1920':{'in':1},'1921':{'attention':1,'176-177':1,'.':4,'in':2,'the':1,'meeting':1},'1922':{'by':1,'third':1,'sixth':1,'seventh':1,'ninth':1,'twelfth':1,'second':1,'eleventh':1,'fourth':1,'tenth':1,'eighth':1,'fifth':1},'disarranged':{'.':1},'enregistered.':{'in':1},'obliging':{'in':1},'collects':{'a':1,'pollen':1,'some':1},'violates':{'the':1},'encouraged':{'by':1},'surfaces':{'and':1,'hooky':1,'for':1,'of':2,'reflect':1,'in':1,'such':2},'fails':{'to':1},'invoked':{'to':1},'crystal':{'we':1,'between':1},'federal':{'tax':1,'laws':1},'subsequent':{'research':1,'eras':1,'stage':1},'birds--intelligence':{'co-operating':1},'weapons':{'and':1,'or':1},'north-west':{'australia':2},'outside':{'and':1,'we':1,'his':1,'scientific':1,'these':1,'of':2,'it':1,'himself':1,'influences':1,'our':1,'nothing':1,'world':2,'the':6},'ages.':{'illustration':1},'hiss':{'.':1},'crookes':{'and':1,'sir':1,'experimented':1,'talked':1,'tube.':1,'tube':1,'had':1,'preferred':1,'247':1,'used':1,'but':1,'in':1,'really':1,'tubes':1,'at':1},'multiplied':{'by':1},'tylor':{'e':1},'hundredth':{'but':1},'originated':{'a':1,'from':1,'by':1,'in':1},'one-mile':{'thickness':1},'densely':{'packed':1},'kea':{'or':1,'parrot':1},'multiplies':{'by':1,'in':1},'coma':{'berenices':2},'oxalic':{'acid':1},'cities':{'150':1,'because':1,'.':1,'to':1,'of':1},'come':{'and':1,'nearest':1,'into':4,'back':3,'in':2,'mysteriously':1,'out':2,'from':2,'for':1,'next':1,'to':13,'under':1,'more':1,'up-stream.':1,'presently':1,'nutritive':1,'those':1,'a':1,'about':2,'up':2,'together':3,'near':2,'.':1},'reaction':{'of':2,'between':1,'at':1,'or':1},'pests':{'were':1},'successes':{'but':1,'.':1},'primus':{'berry':1},'23':{'photo':2,'saturn':1,'1914':2,'000':1},'water-ouzel--a':{'bird':1},'quiet':{'upper':1,'unobtrusive':1},'contract':{'.':1,'except':1,'it':1},'energies':{'light':1},'berry':{'the':1},'equatorials':{'and':1,'.':1},'railway':{'siding':1,'trucks':1},'utterance':{'to':1},'surface.':{'this':1,'open-sea':1},'radio-activity':{';':1,'has':4,'we':1,'were':1},'afterwards':{'found':1,'recommence':1,'it':2,'words':1,'requires':1},'bricks':{'of':2,'out':1,'are':2,'each':1},'course.':{'this':1},'employee':{'of':1},'colony':{'of':10,'is':2,'.':1,'are':1,';':1,'south':1},'period':{'often':1,'is':2,'as':1,'including':1,'in':2,'before':2,'perhaps':1,'there':2,'when':1,'.':1,'peopling':1,'which':1,'reptiles':1,';':1,'has':1,'was':7,'we':2,'that':5,'rise':5,'during':1,'a':1,'land':1,'showed':1,'e.g':1,'of':16,'either':1,'through':1,'the':5,'90':1,'first':2},'6.':{'enregistered':1},'satisfaction':{'and':1,'in':1,'.':1},'61':{'diagram':1,'a':1},'62':{'feet':1,'inches':1},'64':{'from':1},'straws.':{'the':1},'67':{'miles':1,'000':2},'68':{'photo':1},'69':{'green':1,'reproduced':1,'proterospongia':1},'pod':{'.':1},'skeletons':{'of':5,'are':1},'noisy':{'with':1},'song-thrush':{'when':1,'takes':1},'blend':{'into':1},'pilgrims':{'for':1},'deposited':{'as':1,'in':1},'cords':{'stretched':1,'.':1},'hardly':{'even':1,'be':6,'needs':1,'necessary':2,'pauses':1,'conceive':1,'seems':1,'change':1,'imagine':1,'counts':1,'tenable':1,'inferior':1,'too':1},'500':{'pounds':1,'000':4,'to':1,'miles':1,'fathoms':3,'yards':1,'extinct':1,'deg':1},'501':{'c':2},'6a':{'hipparion':1},'direction':{'towards':1,'whereby':2,'that':1,'of':6,'is':1,'when':1,'.':2,'as':1,'contrary':1,'in':4,'taken':1,';':1},'forecloses':{'the':1},'robbed':{'of':1},'radiates':{'heat':1},'tiger':{'begins':1,'the':1},'implied':{'a':3,'getting':1,'many':1,'.':4,'including':1,'in':2,'an':3,'was':1,'warranties':1},'sea-horses':{'phyllopteryx':1},'eaters':{'in':1},'attentive':{'persistent':1},'squirrels':{'quickly':1,'which':1,'.':1},'robber':{'crab':1},'paying':{'any':1,'copyright':1},'specialised':{'member':1,'instincts':1},'caucasians':{'we':1,'include':1},'mount':{'on':1,'wilson':16,'hermon':2,'everest':1},'twigs':{'very':1},'life;':{'precise':1},'premature':{'to':1},'vegetation--an':{'awkward':1},'slippery':{'bridge':1},'life.':{'origin':1,'wallace':1,'similarly':1,'many':1,'there':1,'wherever':1,'it':1,'illustration':1,'sec':2,'they':1,'volunteers':1,'if':1},'mound':{'.':1},'hunts':{'small':1,'vigorously':1},'focussed':{'on':1},'trackless':{'waste':1},'another--to':{'pass':1},'person.':{'besides':1},'someone':{'not':1,'said':1},'anti-bodies':{'which':1},'unsounded':{'i.e':1},'uncatchable':{'in':1},'meals.':{'there':1},'helmet':{'or':1,'.':1},'revolutions':{'a':1,'round':1},'author':{':':1},'alphabet':{'of':2,'the':1},'granted':{'tax':1,'but':1},'skips':{'the':1,'about':1},'knowable':{'way':1},'motley':{'crowd--we':1,'into':1},'a-b.':{'newer':1},'buys':{'a':1},'implement.':{'on':1},'generated':{':':1},'status':{'of':2,'with':1,'by':1},'wall-like':{'formation':1},'males':{'six':1,'especially':1,'that':1},'disadvantages':{'for':1},'pays.':{'when':1},'nest':{'and':2,'or':2,'to':1,'else':1,'of':3,'into':1,'191':1,'.':2,'how':1,'while':1,'which':2,'in':5,';':1,'several':1,'with':2,'the':6,'is':1,'out':1},'insects.':{'whether':1,'mesozoic':1,'devonian':1},'tree-toad':{'whose':1},'drives':{'off':2},'weed':{'120':1,'.':1},'director':{'of':1,'gbnewby':1},'persons':{'bearing':1,';':1,'is':1},'arose':{'and':1,'what':1,'we':1,'.':1,'as':1,'races':1,'various':1,'the':3,'or':1},'changing':{'natural':1,'energy':1,'process':1,'colour':1,'conditions':1,'its':1},'implements':{'a':1,'instruments':1,'were':1,'or':1,'.':1},'marsh.':{'the':1,'six':1},'perennial':{'tendency':1},'safely':{'be':1,'away':1},'shift.':{'we':1},'magical':{'glass':1,'way':1},'without':{'saying':1,'seeing':1,'being':2,'intelligence':1,'ceasing.':1,'an':2,'as':1,'at':1,'further':1,'domesticated':1,'any':6,'heat--forms':1,'trying':1,'thinking':1,'there':1,'.':4,'doing':1,'charge':1,'much':1,'too':1,'fatiguing':1,'prominently':1,'reading':1,'measuring':1,'mentioning':1,'them':2,'committing':1,'permission':1,'sufficient':1,'significance':1,'noticing':1,'free':1,'heat':2,'a':3,'supposing':1,'disparagement':1,'complying':1,'trouble--an':1,'conspicuous':1,'sacrificing':1,'paying':2,'wide':1,'that':1,'getting':1,'stimulus':1,'this':1,'fertilisation':1,'the':7,'having':1},'model':{'of':2,'is':1,'by':4,'seen':1},'reward':{'and':1,'of':1},'bodies':{'and':1,'certain':1,'held':1,'are':3,'in':1,'whose':1,'would':1,'had':1,'.':1,'behave':1,'which':1,'has':1,'we':1,'dependent':1,'acquire':1,'but':1,'fall':1,'represented':1,'i.e':1,'with':1,'like':1,'considered':1,'of':2,'up':2,'the':2,'having':1},'justify':{'themselves':1,'the':2,'all':1},'clog':{'the':1},'when':{'and':1,'this':4,'all':1,'full-grown':1,'dealing':1,'it':34,'competition':1,'one':3,'appropriate':1,'jupiter':1,'something':1,'human':1,'in':2,'seen':1,'cold':2,'abundant':1,'its':1,'even':1,'compared':2,'to':1,'observing':1,'caught':2,'there':6,'young':2,'sunlight':1,'birds':2,'needed':1,'only':3,'bombarded':1,'sponges':1,'lizzie':1,'tens':1,'you':3,'he':9,'resting':1,'we':31,'his':1,'scientific':1,'parental':1,'liberated':1,'however':2,'atoms':1,'water':1,'moving':2,'two':2,'they':16,'put':1,'an':7,'with':1,'man':3,'a':19,'great':1,'revolved':1,'animals':1,'these':2,'of':1,'professor':1,'applied':1,'she':2,'baits':1,'enough':1,'small':1,'hot.':1,'the':82,'grass':1,'at':1},'guided':{'astronomers':1},'actions':{'and':4,'among':1,'show':1,'becoming':1,'but':1,'.':4,'cease':1,'are':1,'which':2,'living':1,';':1},'violent':{'and':1,'death':1,'end':3,'disturbances':1,'agitation':1,'motion':3,'discharge':1,'movement':1},'cease':{'to':1,'is':1,'in':1,'using':1},'anamnia':{'the':1},'mongoose':{'riki-tiki-tavi':1},'differentiation':{'of':1,'.':1},'polish':{'wife':1},'colonise':{'the':2},'captured':{'a':2,'arm':1,'for':1,'.':1},'blow':{'from':1},'gentleness':{';':1},'widest':{'and':1,'array':1,'variety':1},'hint':{'of':5},'--from':{'unicellular':1},'rose':{'and':1,'on':1,'above':1,'in':1},'favouring':{'certain':1,'the':1},'except':{'about':1,'for':3,'that':6,'electricity':1,'when':1,'in':8,'upon':1,'to':1,'as':1,'red':1,'violet':1,'the':7,'those':1,'man':1},'great.':{'illustration':1},'lets':{'it':1},'interested':{'in':1},'samples':{'of':1},'hind':{'part':1,'end':1,'.':1},'engulfed':{'.':1},'stagnant':{'lifeless':1},'nekton':{'and':1},'sociality':{'.':1},'men-of-war':{';':1},'kingdom':{'we':1,'of':1,'.':2,'not':1,'the':1,'where':1},'crustaceans':{'and':3,'lamp-shells':1,'insects':1,'insect':2,'can':1,'which':2,';':1},'confines':{'the':1},'action.':{'what':1},'confined':{'to':2,'so':1,'our':1},'characteristically':{'vital':1},'shore-haunts.':{'following':1},'accepted':{'theory':1,'that':1,'it':1,'but':1,'which':1,'in':1},'left-hand':{'photograph':2,'side':1},'acute':{'senses':1,'especially':1},'standstill':{'that':1},'particle':{'that':1,'of':8,'is':1,'which':1,'becomes':1,'was':1},'harmonising':{'the':1},'patrick':{'sheriff':1},'reduces':{'to':1,'friction':1},'multifarious':{'tasks':1},'sieves':{'with':1,'by':1},'sternly':{'regulated':1},'petrie':{'has':1},'donations':{'received':1,'from':2,'1':1,'to':4,'can':1,'in':2,'or':1,'are':2},'always':{'new.':1,'human':1,'being':1,'have':1,'in':5,'ring':1,'giving':1,'regarded':1,'had':1,'tend':1,'presents':1,'to':2,'setting':1,'black':1,'going':2,'receiving':1,'that':1,'clear-cut':1,'refused':1,'lives':1,'recognise':1,'put':1,'envelops':1,'aiming':1,'present':2,'a':1,'on':1,'turns':1,'or':1,'overlappings':1,'remain':1,'points':1,'so':1,'hobbled':1,'the':2,'think':1},'tower':{'above':1},'reduced':{'to':3,'the':1,'from':1,'for':1,'.':1},'burdens':{'of':1},'competition':{'e.g':1,'is':1,'but':1,'.':1,'in':1,'or':1},'deduce':{'more':1},'respect':{'most':1,'with':1},'oftener':{'than':1},'intact':{'ones':1},'leadbeater.':{'an':2},'chewing':{'a':1},'provided':{'to':1,'you':1,'that':1,'by':1,'in':1},'mood':{'at':1},'prolific':{'and':2,'multiplication':2,'early':1,'have':1,'though':1},'defenceless':{'weaponless':1},'legal':{'fees':2},'moon':{'and':4,'because':1,'exert':1,'28':1,'is':5,'newton':1,'it':1,'as':1,'at':2,'entering':2,'------':1,'32':1,'are':1,'passes':1,'from':1,'takes':1,'would':1,'began':1,'when':1,'.':15,'to':1,'of':1,'fig':1,'mars':1,';':1,':':1,'was':6,'split':1,'do':1,'we':1,'nearer':1,'may':1,'showing':1,'were':2,'took':1,'but':7,'crosses':2,'gets':1,'by':1,'partially':1,'has':2,'turns':1,'s':6,'act':1,'the':2,'makes':1,'farther':1},'depletion':{'of':1},'moot':{'point':1},'provides':{'the':3,'means':1},'out-side':{'influences':1},'freed':{'from':2},'lop-eared':{'forms':1},'ovaries':{'and':1},'nails':{'and':1,'in':1},'stereotyped':{'routine':1,'was':1,'bee':1},'communicate':{'some':1},'voracious':{'and':1,'insect':1},'journeyman':{'.':1},'resurrection':{'of':1},'affording':{'food':1,'most':1,'as':1},'on':{'all':1,'minced':1,'september':1,'isolated':1,'disguise':2,'through':1,'human':2,'earth':5,'its':31,'apace':1,'dividing':1,'true':1,'young':1,'better':1,'to':21,'board':2,'stable':1,'photographs':1,'brown':1,'them':3,'his':4,'around':1,'returning':1,'possible':1,'trees':2,'firmer':1,'sea-lettuce':1,'five':1,'probably':1,'radio-active':1,'one':5,'jupiter.':1,'evolution':3,'likeness':1,'january':1,'sufficiently':1,'sand':2,'each':5,'small':1,'them.':1,'entirely':1,'page':1,'saturn.':1,'transcribe':1,'some':4,'biology':1,'yerkes':2,'individual':1,'entering':1,'our':2,'special':1,'creatures':1,'what':1,'for':2,'god':1,'mars.':1,'ice':3,'various':1,'affecting':1,'progress':1,';':2,'receiving':1,'red':1,'can':1,'columbus':1,'wheat':2,'whose':1,'evolving':1,'atoms':1,'water':1,'by':3,'dry':4,'both':2,'backwards':1,'repeating':1,'leaves':1,'american':1,'islands':2,'passing':2,'or':1,'this':11,'striking':1,'hearing':1,'another':3,'einstein':1,'trust':1,'from':2,'her':3,'their':10,'top':1,'there':1,'two':1,'.':12,'183':1,'moisture':1,'mars':10,'until':1,'life':1,'clever':1,'that':3,'mammals':1,'exactly':1,'back':1,'bipedal':1,'with':1,'those':1,'must':1,'plants':2,'account':2,'these':4,'mount':2,'up':1,'air':2,'three':1,'under':1,'and':3,'withered':1,'gate-posts':1,'in':9,'surpassing':1,'slowing':1,'an':10,'protective':1,'planets':1,'further':1,'floating':1,'any':1,'different':3,'inborn':1,'wits':1,'radiation':1,'snow':1,'close-packed':1,'other':1,'sandy':2,'animal':1,'accumulating':1,'towards':1,'lanky':1,'it':8,'herbs':1,'itself.':1,'occasion':1,'such':1,'intrinsic':1,'parallel':1,'a':63,'land':6,'to-day':1,'decaying':1,'we':1,'which':18,'green':2,'every':4,'the':294,'berries':1,'again.':1},'beavers':{'who':1},'discussed':{'elsewhere.':1,'separately':1,'in':2},'chamberlin':{'and':1,'s':1,'says':2},'shrimp':{'net':1},'20417.zip':{'this':1},'whence':{'the':3,'man':1,'is':2,'they':2,'he':1},'stop.':{'illustration':1},'stand':{'in':1,'out':1,'alone.':1},'prism--a':{'triangular-shaped':1},'discrimination':{'of':1,'with':1,'between':1},'gregory':{'b':1},'investigators':{'professor':1,'.':1},'or':{'partial':1,'suns':1,'four':3,'nursery':1,'go':2,'layers':1,'brackish':1,'hunting':2,'electricity':1,'unenforceability':1,'young':2,'to':10,'under':1,'teaching':1,'division':1,'devonian':1,'fall':1,'animals':2,'whirlpools':1,'elevations':1,'squids':1,'alevins':1,'redistribute':1,'corpuscles':1,'clouds':1,'die':1,'frozen':1,'glaciations':1,'greenish':1,'small':1,'mammal':1,'autotomy.':1,'caries':1,'upper':1,'frog-mouth':1,'pass':2,'further':1,'even':16,'what':1,'adds':1,'fitnesses':1,'pipes':1,'paddle':1,'access':1,'above':1,'new':3,'thereabouts':1,'movement':1,'segmentation':1,'men':1,'water':1,'protection':1,'along':1,'extreme':1,'sending':1,'thirty':2,'brilliant':1,'wherever':1,'experience':1,'patagium':1,'formation':1,'threes':1,'feelings':1,'semang':1,'total':1,'herring':1,'tertiary':1,'engrain':1,'use':2,'from':5,'two':4,'distributing':3,'almost':2,'more':8,'becomes':1,'envelope':1,'about':1,'train':1,'rabbit':1,'breach':1,'glad':1,'must':1,'flagellum':1,'strain':1,'averaged':1,'can':1,'nothing.':1,'marble':1,'mud-fishes':1,'proprietary':1,'brown':1,'pulling':1,'something':1,'serum':1,'axis':1,'disappearing.':1,'six':3,'chemical':2,'how':2,'fourth':1,'re-use':2,'stock':1,'gonads':1,'communicating':2,'after':3,'eighty':1,'mankind':1,'a':33,'elusive':1,'light':2,'hypotheses':1,'coal':2,'so':4,'deterioration':1,'playing':1,'foetal':1,'refund':3,'sperm-cell':1,'evolutionary':1,'self-destructively':1,'rottenness':1,'double-breather':1,'hypertext':1,'years':1,'lumpsucker':1,'secondaries':1,'pterodactyls':2,'group':1,'lateral':1,'destroyed':2,'animal':1,'pglaf':1,'repulsive':1,'they':1,'weeds':1,'not':2,'detach':1,'adventurous':1,'bubbles.':1,'magnitude':1,'fitness':1,'beneath':1,'mental':1,'agriculture':1,'out':1,'dying':1,'cause':1,'alevin':1,'shut':1,'approached':1,'siege':1,'eternal':1,'rotifer':1,'duck-billed':3,'telescopes':1,'nebulae':1,'rearrangements':1,'wanderers':1,'audacity':1,'disturbed':1,'lemurs':1,'stone':1,'unborn':1,'zoophyte':3,'south':1,'emotion':1,'blown':1,'another':1,'flagella':1,'foraminifera':2,'monkey':1,'pelagic':1,'anyone':1,'their':2,'185':1,'white':1,'muscles':1,'immediate':1,'sea-scorpions':1,'egg-producer':1,'patches':1,'meteors':1,'grey':1,'actively':1,'iron':1,'were':1,'providing':2,'sea-gooseberries':1,'chrysalis':1,'shell':2,'have':2,'cleverness':1,'organs':1,'any':9,'built':1,'lumps':1,'camouflage':1,'gunnel':1,'take':1,'online':3,'destroy':2,'spawns':1,'primaries':1,'easygoing':1,'centres':2,'breaking':1,'invertebrate':1,'successive':1,'measured':1,'darkness':1,'sea-butterflies':1,'nostrils':1,'later':3,'dissolved':1,'electrons':1,'salt':1,'planetary':1,'distributed:':1,'nest-building':1,'bright':1,'archimedes':1,'seaweed':1,'entity':3,'find':1,'only':3,'wood':1,'black':1,'employee':1,'shepherding':1,'fossil':1,'get':1,'eel-fare':1,'fronds':1,'cannot':1,'preparing':1,'instinctive':2,'primates':1,'stone.':1,'devoured':1,'amid':1,'parasitic':1,'remove':1,'twice':1,'steam':1,'kernel':1,'seventeen':1,'ebb':1,'intelligence':1,'testing':1,'computer':1,'are':2,'corrupt':1,'eoliths':1,'federal':1,'away':1,'rings':1,'waltzing':1,'its':1,'weapons':1,'mud':1,'between':1,'nestor':1,'across':1,'deletions':1,'incarnation':1,'creating':2,'sole':1,'podargus':2,'invisible':2,'1.e.9.':2,'sperm-producer':1,'many':3,'region':1,'water-ouzel--a':1,'strains':2,'expense':1,'expression':1,'experimental':1,'mutating':1,'among':1,'adjusted':1,'mutations':3,'whatever':1,'extinct':2,'late':1,'gregarious.':1,'one-celled':1,'create':1,'three':5,'protoplasm':1,'thrice':1,'rather':1,'general':1,'else':1,'elvers':1,'homes':1,'solid':1,'dendrites':1,'replaced':1,'argonaut':1,'wild':2,'layer':1,'diaphragm':1,'is':1,'squid':2,'it':5,'cluster':1,'to-morrow':1,'anti-bodies':1,'in':14,'if':1,'damaged':1,'perhaps':1,'cromagnard':3,'shorter':1,'dermis':1,'double-breathers':1,'big':1,'mud-skipper':2,'prominences':1,'foam':1,'infinite':1,'staving':1,'reflection':1,'charges':4,'well':1,'command':2,'comes':1,'mother':2,'the':23,'left':1,'less':14,'cromagnards':1,'distribute':2,'egg-cell':1,'obtain':1,'fishing':1,'anamnia':1,'multiples':1,'vibration':1,'absorption':1,'killed':1,'dipper':1,'irresponsive':1,'humanity':1,'photographed':1,'tracheae':1,'early':1,'possibly':1,'gyrating':1,'five':2,'using':1,'modifications':1,'appearing':1,'feral':2,'post-glacial':2,'incidental':1,'eel':1,'vortex':1,'ctenophores':1,'often':1,'crown':1,'dead':1,'sponge':1,'indirect':1,'bruising':1,'for':2,'memories':1,'does':1,'glacial':1,'disproved--e.g':1,'enregistering':1,'by':10,'on':5,'limitation':3,'chaff':1,'central':1,'of':11,'20417.zip':1,'octopus':2,'sea-grass':1,'down':1,'because':3,'determine':1,'protozoa':1,'additions':1,'her':1,'camouflaging':2,'incipient':1,'sneezing':1,'was':2,'pinna':1,'some':3,'amongst':1,'heat':1,'shoulder-blade':1,'trying':1,'with':3,'whether':1,'dangerous':1,'variations':2,'frugivorous':1,'associated':1,'taste':1,'an':3,'as':3,'furl':1,'again':1,'dimly':1,'inborn':1,'when':3,'other':8,'dies':1,'casque':1,'nucleus':2,'pycnogon':1,'sneeze':1,'vice':1,'vehicles':1,'implied':1,'indirectly':3},'amber':{'trade':1},'cambridge':{'university':1,'manual':1,'.':3},'columbia.':{'the':1,'fig':1},'communication':{'that':1,'between':2},'charts':{'we':1},'spinal':{'canal':1,'cord':4},'clams':{'in':1},'accounts':{'for':1},'determine':{'the':3,'what':1,'survival':1},'cro-magnon':{'in':1},'speculated':{'on':1},'theoretically':{'a':1,'that':1},'buds':{'out':1},'pycnogon':{'walking':1},'whales':{'and':1,'great':1,'.':1,'which':1,'largely':1},'distinctions':{'except':1},'strictly':{'marine':1},'there':{'and':1,'emerge':1,'exists':2,'being':1,'had':4,'is':259,'191':1,'results':2,'one':1,'diverged':2,'are':142,'have':7,'in':3,'.':5,'any':2,'seemed':1,'emerges':1,'rises':1,'appear':1,'would':2,'seems':7,'been':2,'actually':1,'may':10,'only':1,'other':1,'probably':2,';':1,'has':12,'was':42,'ought':1,'be':1,'life':2,'an':1,'intervened':1,'some':1,'took':1,'illustration':1,'soon':1,'depressing':1,'cannot':1,'lives':1,'arose':2,'they':1,'not':5,'now':1,'comes':1,'depended':1,'a':3,'on':1,'are.':1,'should':3,'could':2,'will':5,'remain':2,'must':7,'can':11,'evolved':4,'were':26,'the':1,'might':1,'makes':1,'came':3},'disposed':{'to':2},'dispersion':{'is':3,'can':1},'strict':{'liability':1,'sense':3},'world--weighs':{'nearly':1},'house':{'of':1,'.':2,'to':1,'against':1,'on':1},'macaques':{'and':1,'the':1},'fish':{'and':2,'is':4,'it':2,'117':1,'at':1,'118':1,'firmly':1,'takes':1,'lizards':1,'flying':1,'when':1,'.':2,'to':2,'which':4,'probably':1,'has':1,'arges':1,'stock':1,'that':1,'ceratodus':1,'chiasmodon':2,'with':2,'like':1,'of':1,'larger':1,'grows':1,'the':3,'male':1,'makes':1,'called':1},'eoanthropus':{'expresses':1},'relic':{'of':3,'were':1},'kittens':{'or':1},'account.':{'since':1},'troubles.':{'another':1},'amongst':{'fishes':1,'the':8,'themselves':1,'them':1,'all':1},'instrument.':{'a':1},'strenuous':{'life.':1,'life':3,'conditions':1,'time':2},'promote':{'variability':1},'faster':{'and':1,'than':4,'.':2},'applying':{'severe':1},'bullet':{'and':1,'thirty':1,'leaves':1,'illustration':1,'one':1,'itself':1,'does':1,'the':1},'multiplicity':{'.':1},'electroscope':{'is':1},'centenarian':{'tortoise':1},'grasp':{'begins':1,'probably':1,'the':1,'an':1},'grass':{'and':2,'gathering':1,'forming':1,'the':1,'was':1,'he':1},'creeping':{'of':1,'about':1,'upwards':1},'strongly':{'developed':1,'illumined':1},'accentuated':{'by':1},'words:':{'bone':1},'stock.':{'every':1},'taste':{'do':1,'may':1,'of':1,'seems':1,'which':1,'in':1},'yacht':{'and':1},'lingula':{'of':1},'tactics--self-effacement':{'on':1},'britain':{'and':2,'do':1,'we':1,'just':1,'it':1,'has':1,'having':1},'curly-or':{'wavy-haired':1},'diverged':{'far':1,'the':2,'from':1},'orchards':{'descended':1},'corresponding':{'ratio':1,'magnetic':1,'to':10,'bright':1,'stages':1,'hump':1},'russel':{'wallace':1},'operation':{'of':1,'to-day':1},'collared':{'lashed':1},'deserve':{'for':1},'discerned':{'in':1},'shore-haunt':{'and':2,'littoral':1,'as':1,'are':1,'exhibits':1},'compel':{'the':1},'erecting':{'standing':1},'spring-tails':{'and':1},'blackish-grey':{'.':1},'f.z.s.':{'seasonal':1,'professor':1,'banded':1,'rock':1,'the':3,'woodpecker':1},'meteorites--pieces':{'of':1},'cock-pigeon':{'very':1},'deviation':{'it':1},'briefly':{'the':1,'discussed':1,'outline':1},'separate':{'and':1,'animals':1,'study.':1,'engines':1,'tuft':1,'whirling':1,'off':1,'entity':1,'universes--':1,'threads':1,'molecules':1,'existence':1,'genus':1},'manipulate':{'puzzle-boxes':1},'symbol':{'of':1},'carnegie':{'institution':2},'includes':{'not':1,'information':1,'all':2,'thousands':1,'the':2},'gutenberg':{'web':1,'associated':1,'license':3,'is':3,'ebook':4,'literary':13,'are':1,'you':1,'volunteers':1,'appears':1},'nucleus':{'and':2,'then':1,'we':1,'gr':1,'rather':1,'of':5,'is':1,'but':1,'.':4,'to':1,'are':1,'in':1,'into':1,';':1,'has':1,'or':3},'recognise':{'a':1,'both':1,'them':1,'that':1,'these':1,'an':1,'as':2,'progress':1,'the':6,'accessory':1},'fasten':{'themselves':1},'included':{'a':1,'was':1,'with':2,'.':2,'in':2,'the':1,'has':1,'numerous':1},'stocks':{'began.':1,'of':3,'began':1,'within':1,'it':1,'but':1},'irretraceable':{'course.':1},'bustard.':{'such':1},'atromaculatus':{'121':1,'in':1},'missed':{';':1},'meadow':{'it':1},'bilateral':{'symmetry.':1,'symmetry':2},'calls':{'of':1,'the':3,'it':1,'adaptive':1},'wife':{'took':1},'splendour.':{'they':1},'environment.':{'1':1,'sec':1},'eighty-odd':{'chemical':2},'migrated':{'to':1,'from':2},'all':{'opinions':1,'over':3,'mending':1,'four':1,'thoughtful':1,'through':3,'its':2,'except':2,'monkeys':1,'forms':1,'to':3,'only':1,'reptiles':2,'easy':1,'circle':1,'his':5,'liability':2,'they':1,'day':2,'processes':1,'50':1,'these':6,'works':1,'cells':1,'mean':1,'angles--that':1,'because':1,'energy':1,'hard':1,'phenomena':1,'are':1,'our':3,'shoots':1,'enemies':1,'respects':1,'space':1,'access':1,'outside':1,';':3,'be':1,'we':1,'scientific':1,'here':1,'atoms':2,'magnetism':2,'directions.':1,'members':1,'clues':1,'directions':3,'along':1,'likelihood':3,'things.':1,'mingled':1,'of':7,'round':3,'speeds':1,'probability':2,'point':1,'three':1,'chemists':1,'references':2,'sounds':1,'use':1,'her':1,'flying':1,'copies':2,'.':7,'scions':1,'conceivable':1,'molecular':2,'was':1,'life':2,'that':3,'but':2,'cases':2,'white':3,'those':2,'inconspicuous':1,'animals':2,'this':4,'originally':2,'appearance':2,'air':1,'matter':7,'were':1,'meet':1,'stages':2,'at':2,'and':1,'associated':1,'sorts':6,'is':3,'modern':2,'it':1,'as':1,'manner':1,'walks':1,'perhaps':3,'things':4,'make':1,'when':2,'detail':1,'how':1,'other':1,'which':1,'creatures':1,'higher':2,'kinds':1,'moving':2,'such':1,'in':2,'attaining':1,'time':1,'the':81,'bodies':2},'lack':{'of':2},'muscle-fibres':{'grow':1,'in':1},'son.':{'the':1,'alsatian':1},'seals':{'and':1,'.':1},'light-waves':{'and':1,'into':1,'.':2,'are':1,'which':1,'the':2},'disc':{'and':1,'for':1,'of':4,'.':2,'eight':1,'was':1},'dish':{'and':1},'follow':{'sir':1,'that':1,'it':1,'however':1,'till':1,'the':4,'with':1,'their':1},'disk':{'or':1},'decisions':{'were':1},'synthetic':{'chemists':2,'chemist':1},'glimpse':{'of':8,'the':1,'in':1},'deliberateness':{'and':1,'.':1},'meteorites--a':{'great':1},'subjected':{'.':1},'extraneous':{'source':1},'presentation':{'of':1},'tethered':{'on':1},'activities':{'and':1,'influenced':1,'may':1,'of':1,'.':1,'implying':1,'as':1},'belonging':{'to':1},'means--light':{'without':1},'worse':{'to':1,'for':1,'.':1},'devonian':{'a':1,'age':1,'period':4,'seas.':1,'lung-fishes':1,'foot-print':1,'the':1,'red':1},'song':{'of':1},'infringement':{'a':1},'combustible':{'material':1},'educative':{'process':1},'induce':{'fresh':1},'psychologist':{'whom':1},'sons':{'new':1,'first':1},'fan':{'or':1,'like':1,'by':1},'hatching':{';':1,'out':2,'.':1},'awful':{'possibility--involution':1},'time--wherein':{'to':1},'soles':{'with':1},'rhodeus':{'amarus':2},'corpuscles':{'and':1,'called':1,'form':1,'.':1},'morley':{'tried':1},'stimulus':{'almost':1,'of':1,'.':1,'travels':1,'to':2,'such':1},'eye-sockets':{'the':1},'list':{'may':1,'of':3,'is':1,'to':1},'prolonged':{'training':1,'period':1,'ice':1,'youthfulness':1,'ante-natal':1,'the':1,'trying':1,'drought':2,'exposure':1},'rods.':{'2':1},'indemnity':{'-':1},'familiarly':{'seen':1},'dexterity':{'and':1,'until':1,'besides':1,'.':1},'lightner':{'witmer.':1},'rats':{'and':4,'learn':1},'depths.':{'a':1,'illustration':1},'ten':{'and':1,'pounds':3,'of':1,'thousand':3,'times':1,'hours':2,'to':1,'straws':1,'unseen':1,'moons':1,'hours--a':1,'our':1,'years':1,'minutes':2},'foreground':{'holding':1},'fringing':{'the':1,'teeth':1},'tea':{'or':1},'reins':{'at':1,'in':1},'breakers':{'.':1},'000-50':{'000':1},'rate':{'a':1,'from':2,'that':1,'of':15,'which':1,'than':1},'invention':{'and':1,'of':1,'.':1,'first':1,'that':1},'1904-5':{'in':1},'s-beak':{'jaws':1},'functioning':{'properly':1,'throughout':1,'.':1},'remarkably':{'representative':1},'toe.':{'illustration':1},'paralyse':{'and':1},'babylonia':{'egypt':1,'greece':1},'what':{'origin':1,'this':3,'all':1,'right':1,'followed':3,'is':49,'it':4,'evidence':1,'are':10,'in':1,'peter':1,'causes':1,'before':1,'happens':2,'sir':1,'would':1,'matter':1,'electricity':1,'agency':1,'does':1,'goes':2,'resulted':1,'new':1,'you':1,'has':4,'might':5,'energy':1,'crookes':1,'sort':1,'then':2,'we':20,'elements':2,'electric':1,'may':5,'mammals':1,'of':1,'looks':2,'took':1,'mimics':1,'heat':1,'fruit':1,'mankind':1,'they':9,'satellites':1,'an':1,'come':1,'appears':1,'those':1,'man':1,'a':7,'great':1,'animals':1,'these':1,'was':8,'professor':1,'osborn':1,'more':1,'she':2,'were':1,'happened':1,'about':1,'the':18,'gives':1,'makes':1,'could':1,'bond':1},'necessary.':{'a':1},'imported':{'from':1},'advantageous':{'to':1,'than':1,'power':1,'for':1},'sun':{'and':22,'compare':1,'already':1,'often':1,'produces':1,'is':20,'in':5,'constitute':1,'ceased':1,'as':3,'itself':2,'sec':1,'looks':1,'uranus':1,'year':1,'------':1,'our':1,'are':2,'before':1,'mercury':1,'passes':1,'from':1,'would':5,'seems':1,'.':23,'to':4,'must':2,'without':1,'which':4,'dying':2,';':1,'has':4,'was':2,'into':1,'photographed':2,'we':4,'goes':1,'that':4,'may':1,'forming':1,'obscures':1,'however':1,'but':2,'cannot':1,'every':1,'here':1,'somewhat':1,'not':1,'with':2,'nearly':1,'like':2,'a':1,'whose':1,'19':1,'18':1,'could':1,'sweeps':1,'or':1,'s':35,'became':1,'flame':1,'can':1,'have':1,'were':2,'at':2,'the':7,'called':1,'thanks':1},'sum':{'up':1},'ticks':{'of':1},'crust':{'and':2,'of':3,'.':3,'brought':1,'has':1,'with':2,'by':1},'brief':{'moments':1,'outline':1},'version':{'posted':1},'for--may':{'have':1},'maze--which':{'they':1},'discern':{'the':2,'that':1},'heat-measuring':{'instrument':1},'cheetahs':{'or':2,'occur':1},'segmentation':{'of':1},'toes':{'and':1,'a':1,'scrambling':1,'form':1,'shorten':1,'.':3,'as':1},'tags':{'of':2},'ceratodus':{'which':1},'berthelot':{'that':1},'behaviour':{'and':2,'show':1,'is':5,'reaches':1,'depends':1,'sec':1,'are':1,'had':1,'.':8,'may':3,'which':6,'was':1,'we':1,'that':1,'very':1,'but':2,'diagram':1,'76':1,'on':1,'both':1,'of':15,'without':2},'inverse':{'ratio':1,'order':1},'compressed':{'body':1,'marked':1},'directions':{'and':1,'becoming':1,'within':1,'.':3,'as':1,'indicative':1,'at':2,';':1},'steamships':{'to':1},'observing':{'carefully':1,'all':1,'the':1},'water-shed':{'to':1},'chlorophyll-possessing':{'plants':1},'29.46':{'73000':1},'difficulty':{'of':1,'is':1,'about':1,'in':3},'1843':{'had':1},'1842':{'.':1},'allows':{'life':1,'for':1},'1845':{'of':1},'miniature':{'frogs':1,'solar':1,'.':1},'extremes':{'of':1,'are':1,'to':1},'reshufflings':{'or':1},'m.f.':{'near':1},'2163':{'--':1},'cataract':{'gives':1},'sticking':{'out':3},'disposition':{'taking':1},'suddenly':{'seized':1,'fired':1,'attacked':1,'this':1,'lights':1,'into':1,'perceive':1,'being':1,'so':1,'in':1,'rising':1},'semites':{'nordics':1},'bathers':{'are':1},'screens':{'in':1},'mme':{'.':1},'color':{'of':1},'1908':{'33':2,'notice':1,'the':1},'rainbow-tinted':{'colours':1},'know.':{'the':1},'1907':{'by':2},'coatings':{'is':1},'1905':{'22':1,'illustration':1},'herring':{'and':1,'illustrations':1,'the':1,'family':1,'would':1},'1900':{'by':1,'that':1},'1901':{'but':1},'unthinkably':{'long':1},'pervades':{'everything--so':1},'proceed':{'to':1,'from':2,'at':1},'degree.':{'until':1},'faint':{'and':2,'indications':1,'star':1,'.':1,'to':2,'impressions':1,'or':1},'unthinkable':{'on':1},'minor':{'chapter':2,'invasions':1,'alterations':1,'ones':1,'idiosyncrasies':1,'speculated':1},'horses':{'and':5,'a':1,'or':1},'flat':{'forehead':1,'on':2,'as':1,'spider':1,'skull':1},'darting':{'hither':1},'knows':{'his':1,'for':1,'that':1,'of':1,'but':2,'to':1,'only':1,'how':1,'the':1,'monkeys':1},'light-years':{'polaris':1},'definition':{'is':1},'coating':{'and':1},'text.':{'illustration':3},'screen.':{'the':1,'now':1},'flit':{'by':1},'stick':{'might':1,'with':1,'so':1,'to':1,'it':1},'known':{'and':5,'sources':1,'as':10,'human':1,'in':2,'from':1,'excepting':1,'approximately':1,'.':4,'bird--evidences':1,'to':15,'only':2,'easy':1,'between':1,'bird--too':1,':':1,'type':1,'bird':4,'then':1,'that':4,'but':2,'atom':1,'predecessors':2,'on':1,'about':2,'attempt':1,'of':3,'amphibian':1,'the':1,'fact':1},'glad':{'to':1},'presumed':{'evolution':1},'primate':{'stem':2,'stock':2},'sense-presentation':{'and':1},'lung-fish':{'inside':1},'v':{'the':1,'.':2},'--jupiter':{'and':1},'excursion':{'in':1},'tennis':{'ball.':1},'computers':{'including':1,'.':1},'hormones--itself':{'of':1},'brown':{'and':2,'plants':1,'that':1,'colour':1,'variety':1,'box':1,'bear':3,'plumage':1,'ones':2,'seaweed':1,'in':1,'variable':1,';':1,'on':1,'stoat':1},'bright--the':{'light':1},'joints':{'in':1},'locating':{'sounds':1},'abandonment':{'of':1},'moorhens':{'was':1,'which':1},'protects':{'its':1},'imitation':{'counts':1,'so':1,'two':1,'but':1,'.':1},'arise':{'mysteriously':1,'from':3,'take':2,'directly':1},'pond':{'and':3,'of':1,'is':1,'it':1,'to':1,'nor':1},'air-dome':{'.':1},'mother-of-pearl':{'or':1},'terrestrial':{'plants':2,'mountains':1,'life':3,'animals':3,'rather':1,'support':1,'haunt':2,'standards':1,'dinosaurs':1,'journeyman':1,'animal':3,'backboned':1,'dragons':2},'influenced':{'all':1,'by':4},'court':{'maze':2,'maze--which':1},'goal':{'is':1},'unavailable.':{'what':1,'the':1},'breaking':{'on':2,'up':3,'down':5,'diverse':2,'down.':1,'the':1},'84.02':{'31900':1},'occasionally':{'with':1,'however':1,'in':1},'influences':{'such':1,'shutting':1,'from':1,'they':1},'extinguished':{'at':1},'shoulder-blade':{';':1},'hers.':{'illustration':1},'mould':{'so':1,'opening':1},'simplicity':{'and':1,'of':1},'sea-squirt':{'and':1},'orbits':{'.':1,'with':1,'at':1,'round':1},'trial-and-error':{'method':1,'methods':1},'twenty-thousandth':{'of':1},'moult':{'and':2},'pupae':{'tend':1,'less':1},'adventure':{'and':1,'the':1,'which':4,'.':1},'infects':{'him':1},'prospecting':{'for':1,'in':1},'concentrating':{'always':1},'profited':{'by':1},'dissolving':{'out':1},'short':{'a':1,'summer':1,'we':1,'and':2,'stump-like':1,'of':1,'powerful':1,'tail':1,'lists':1,'.':1,'list':1,'length':1,'folk':1,'words':1,'time':7,'the':1,'sojourn':1,'excursion':1,'to':1,'distance':3},'chiefly':{'on':1,'used':1,'from':1,'of':1,'through':1,'in':2,'sounds':1,'with':1},'dispersion--that':{'is':1},'prefers':{'a':1},'life-histories':{'and':1,'of':1},'departure':{'of':1,'in':1},'height':{'and':1,'of':8,'.':1,'so':1,'in':1,'the':1,'was':1},'shore':{'and':2,'area.':1,'is':4,'scene':1,'inland':1,'1921':1,'as':1,'starfishes':1,'at':1,'in':1,'.':3,'to':1,'varies':1,'hatch':1,';':1,'life':1,'seaweeds':1,'but':1,'they':1,'others':1,'come':1,'must':1,'animals':2,'of':9,'according':1,'the':1,'something':1},'conjugal':{'affection.':1},'kippax':{'call':1},'shade':{'of':2},'iron-mines':{'saturated':1},'encased':{'in':2},'plaice':{'and':2,'or':1},'indebted':{'climatic':1},'september':{'of':1,'1922':1,'29':2,'7':1},'developed':{'and':1,'on':1,'from':1,'for':1,'is':1,'except':1,'vocal':1,'.':3,'through':1,'collar-bone':1,'in':1,'along':1,'striped':1,'than':1,'more':1},'universals.':{'intelligent':1},'mission':{'of':4},'cross':{'upon':1,'x':1,'with':1,'was':1,'from':1},'gauged':{'from':1},'unfitting':{'that':1},'scientist':{'galileo':1,'is':1},'concentric':{'regions':1,'lines':1},'emphasized':{'by':1},'thirtieth':{'case':1,'forty':1},'variability--evolution':{'of':1},'style':{'.':2},'forwards':{'as':1,'for':1},'call':{'radio-activity':1,'magnetic':1,'mind':1,'life':2,'as':1,'electrons.':1,'our':2,'living':1,'gravitation':1,'them--or':1,'electro-magnetic':1,';':1,'into':2,'nebulae.':1,'neolithic':1,'himself':1,'them--which':1,'it':1,'helping':1,'them':1,'white.':1,'canals':1,'white':2,'a':2,'light':1,'ozone':1,'of':1,'the':4,'perceptual':1,'reason.':1},'susceptible':{'to':1},'fairbanks':{'ak':1},'example.':{'the':1},'obscure--sometimes':{'environmental':1},'harmless':{'from':1,'snakes':1},'strange':{'animals':2,'animal':1,'amalgams':1,'nest':1,'rings':1,'state':1,'to':2,'as':1,'objects':1,'colouring':1,'lowly':1,'spectacle':1,'creations':1,'conditions':1},'combination-boxes':{'where':1},'non-plastic':{'efficiency':1},'partitions':{'se':1},'might':{'on':1,'be':17,'almost':1,'injure':1,'speak':1,'see':1,'therefore':1,'have':2,'take':2,'happen':1,'hasten':1,'think':1,'possess':1},'alter':{'the':2},'pre-human':{'ape-man':1,'ancestor':1,'ancestors':1,'pedigree':1},'return':{'and':2,'from':1,'later':1,'to':10,'as':1,'the':1,'or':2},'sucking':{'tongue':1},'alighting':{'only':1},'hunter':{'with':1},'chalones':{'which':1},'2.--the':{'milky':1},'communities':{'and':1},'hunted':{'out':1},'adventurous':{'and':1,'life-history':1,'experiment':1,'worms':1},'bigger':{'and':1,'than':2},'instructions':{'to':1},'subtler':{'demands':1},'intricacy':{'of':1},'bolts':{'and':1},'mastered':{'the':1,'so':1,'.':1},'man':{'all':1,'over':1,'discovered':1,'whose':3,'had':3,'except':1,'forms':1,'to':3,'has':9,'noticing':1,'coloured':1,'represents':1,'did':1,'found':1,'photographically':1,'works':1,'bone':1,'often':1,'past':1,'homo':2,'sec':1,'are':2,'thinks':1,'established':1,'plays':1,'stands':2,'since':1,'does':2,'got':1,';':2,'we':2,'sprang':1,'alone':2,'appears':1,'on':2,'would':1,'of':12,'could':1,'s':48,'or':4,'first':1,'appeared':1,'171':1,'asks':1,'.':18,'too':1,':':2,'was':4,'himself':2,'knows':1,'that':1,'exterminated':1,'took':1,'but':2,'to-day':1,'167':1,'with':3,'161':1,'he':1,'plants':1,'grew':1,'these':1,'type':1,'will':2,'values':1,'were':2,'and':22,'153':1,'type.':1,'157':1,'is':11,'it':1,'an':1,'reconstructed':1,'as':2,'lived':1,'have':1,'in':5,'saw':1,'occur':1,'perhaps':2,'interferes':1,'1':1,'how':1,'a-b.':1,'interfered':1,'pursues':1,'nearer':1,'may':1,'preceding':2,'who':3,'prepared':1,'73':1,'included':1,'man':1,'a':1,'off':2,'pithecanthropus':1,'m':1,'the':7,'possesses':1,'came':1},'inherent':{'biological':1},'difficult':{'chapter':1,'on':1,'word':1,'for':3,'of':1,'question':1,'theories':1,'environment':1,'to':14,'not':1,'situation':1,'speculation':1,'conditions':1,'than':1},'saturn.':{'the':1},'constructing':{'its':1},'weighs':{'1':1,'about':3,'nearly':1},'weight':{'for':1,'of':6,'is':1,'two':1,'.':1,'they':1,'than':1},'needless':{'to':2},'generation':{'and':1,'people':1,'of':1,'is':1,'after':1,'to':3,'that':1,'have':1,'in':1,';':1,'if':1},'female--first':{'one':1},'notochord':{'is':2,'.':2},'recapitulate':{'racial':1,'in':1},'culminating':{'with':2,'in':2},'scratching':{'swimming':1},'inflated':{'and':1,'balloon.':1},'croaking':{'of':2},'wondered':{'why':1,'idly':1,'at':1},'induces':{'a':1},'progressive;':{'everything':1},'health':{'and':1,'which':1,'.':1},'hill':{'cave':2,'in':1},'absorb':{'either':1},'celebes':{'lay':1},'induced':{'to':2},'caucasian':{'arose':1,'.':1},'regards':{'many':1,'their':1,'sight':1,'wave-lengths':1,'the':4,'its':2,'size':1},'note--that':{'of':1},'exertions':{'and':1,'running':1},'lesser':{'degree':1},'coco-palms':{'has':1},'rotifer':{'is':1},'monotony':{'.':1},'tassels':{'on':1},'fuller':{'embodiment':2,'well-being.':1},'teach':{'her':1},'colonised':{'by':1,'at':1},'generate':{'heat':1,'thousands':1},'lag':{'behind':1},'thrown':{'a':1,'on':2,'dust':1,'off':1,'upon':1},'preliminary':{'training':1,'scaffolding':1},'thread':{'of':1,'needles':1},'e.g':{'.':38},'decipiens':{'and':1},'77':{'photo':1,'reproduced':1},'light--we':{'have':1},'circuit':{'of':2,';':1,'generates':1,'.':1},'twenty':{'thousand':1,'million':2,'years':5,'hours':2,'to':1,'miles':1,'or':2},'lemurs':{'and':1,'there':1},'experimenter':{'or':1},'fallen':{'and':1,'sufficiently':1},'throws':{'light':1,'it':1},'solidly':{'frozen':1},'sperm-cell':{'and':1,'adapted':1,'with':1},'sheep-driving':{'competition':1},'limestone':{'canyon':2,'which':1},'feel':{'and':1,'sure':1,'for':1,'over-anxious':1,'quite':1,'dare':1},'radical':{'difficulty':1,'changes':1},'churning':{'water':1},'linking':{'generation':1,'of':1},'well-known':{'case':1,'elements':2,'that':1,'mudfish':1,'examples':1,'soft-shell':1,'carpo-metacarpus':1},'sympathy':{'which':2},'sailor':{'expressed':1},'brave':{'self-forgetful':1},'defects':{'such':1},'fees':{'to':1,'.':1,'or':1,'that':1},'says':{'and':1,'a':1,'no.':1,'do':1,'that':3,'professor':1,'meteorites':1,'sir':1,'can':1,'the':2,';':1},'vapour-like':{'matter':1},'whale':{'and':2,'what':1,'showing':1,'there':1,'reaches':1,'.':1,'rushes':1,'the':1,'has':1,'118':1,'is':1,'must':1},'earthworms':{'and':1,'which':1,'centipedes':1,'many':1,'began':2,'have':1,'in':1},'fossil-bearing':{'rocks':1},'passes':{'a':1,'from':2,'into':1,'to':1,'near':1,'through':4,'directly':2,'between':1,'along':2,'the':1,'out':1},'story':{'of':19,'is':1,'when':1,'.':1,'will':1,'simply':2,'in':2,'the':1,'has':1,'went':1},'birgus':{'latro':2,'which':1},'temperature':{'and':3,'is':1,'it':1,'reaches':1,'say':1,'at':2,'in':1,'would':2,'seems':1,'.':7,'which':1,';':1,'was':1,'day':1,'then':1,'we':1,'falls':1,'rises':1,'than':1,'must':1,'of':10,'could':1,'allows':1,'will':1,'the':2},'redistributing':{'project':1,'or':1},'kin.':{'the':1},'leading':{'to':3,'peculiarities':1,'from':1,'authority':1},'coasts':{'but':1},'brisker':{'flow':1},'hangs':{'over':1},'swarm':{'of':3,'sometimes':1,'like':1,'has':1},'storm':{'note':1,'petrel':4,'effects':1,'they':1},'pitted':{'against':1},'soddy.':{'it':1},'aristocracy':{'and':1},'store':{'of':3,'the':1},'fire-mists':{'such':1,'would':1},'imperfect':{'core':2,';':1,'telescope':1,'the':1},'fish-lizards':{'and':1},'pump':{'.':1},'information:':{'dr':1},'convinces':{'us':1},'tugs':{'at':1},'sea-scorpions':{'belonged':1},'treasures':{'behind':1},'rifle':{'and':1,'bullet':3,'.':1},'convinced':{'of':1,'that':2},'explodes':{'without':1},'king':{'of':1},'kind':{'and':2,'we':2,'enable':1,'from':2,'whereas':1,'that':2,'of':34,'taking':1,'express':1,'upon':1,'.':2,'will':1,'set':1,'in':3,';':2,'throughout':1,'or':1,'present':1},'earth--as':{'a':1},'wonder-world':{'of':2},'double':{'this':1,'streaming':1,'blowhole':1,'fold':1,'that':1},'instruction':{'and':1},'indifferent.':{'they':1},'dispensed':{'with':1},'risks':{'and':2,'to':1,'are':1,'of':2},'coast.':{'illustration':1},'earth--an':{'electric':1},'tongues':{'of':2},'unrestricted.':{'animals':1},'7a':{'the':1},'outstanding':{'events':1},'greenwich':{'observatory':1},'disguise--other':{'kinds':1},'gale':{'bringing':1},'alike':{'of':1,'in':1},'cleaned':{'artificially':1},'shrews':{'tree-shrews':1},'cases--marvellous':{'apparatus':1},'cobras':{'brightly':1},'blowhole':{'or':1},'check':{'on':1,'the':2,'comes':1,'vegetation.':1},'interferes':{'is':1},'cropped':{'up':1},'port':{'knows':1,'in':1},'middlemen':{'is':1},'moist':{'winds':1,'and':1,'climate':2,'internal':1,'air':1},'finding':{'their':1},'interfered':{'but':1},'added':{'a':2,'to':4,'up':1},'electric':{'current':15,'power':2,'bells.':1,'bell':1,'charges':2,'shock':1,'phenomena':1,'charge':3,'magnet':1,'tram':1,'terminals':1,'dynamo.':1,'circuit':1,'trams':1,'discharge':6,'spark':8,'furnace':1},'bands':{'it':1,'140':1},'intervened':{'the':1},'instance.':{'organic':1},'measures':{'of':1,'about':1,'on':1,'the':1,'three':1},'reach':{'a':2,'and':1,'about':1,'us.':1,'us':1,'.':1,'their':1,'only':1,'but':2,'the':7,'upward':1,'out':1},'react':{'effectively':1,'on':1},'cigarette':{'and':1},'attempt':{'to':2,'at':1,'too':1},'74':{'diagram':1},'73':{'okapi':1},'72':{'photo':2,'earthworm':1,'reproduced':1},'enduring':{'satisfaction':1},'nothing':{'happens':1,'appeals':1,'like':1,'solid':1,'of':1,'had':1,'but':3,'.':6,'better':1,'more':1,'at':1,'which':1,'in':2,'colder':1,';':1,'out':2,'was':1,'gives':1},'measured':{'and':2,'cube':1,'in':2,'drop':1,'only':1,'fall':1,'the':2,'by':1,'movements':1},'achievement':{'and':1,'is':1},'constitution':{'of':10,'could':1,'which':1,'.':1},'equatorial':{'regions':1,'forests':1},'22.--a':{'nebular':1},'mineral':{'particles':1},'coincides':{'with':1},'chemical':{'reaction':3,'processes':3,'elements':3,'energy':2,'substances':1,'science':1,'screen':3,'conditions.':1,'messengers':6,'element':2,'leave':1,'transformation--the':1,'analysis':1,'routine':1,'action':1,'.':1,'changes':1,'compounds':1,'element.':1,'level':2},'zealand.':{'some':1},'amphibian':{'foot-print--an':1,'mind':1,'race':1,'in':1},'wood-snails':{'but':1},'notch':{'next':1},'artemia':{'salina':1},'institutions':{'.':1,'were':1},'lying':{'on':2,'head':1,'inert':1,'over':1,'upon':1,'beside':1,'low':3},'stones':{'and':3,'on':1,'from':1,'of':2,'.':1,'so':1,'in':1,'probably':1,';':1,'where':1,'or':1},'copy':{'and':1,'a':1,'of':2,'is':1,'upon':1,'it':2,'or':1,'in':1,'display':1,'if':1},'journeys':{'undertaken':1,'.':1},'pennies':{'and':1,'from':1},'wayside':{'.':1},'to-day.':{'as':1,'illustration':1,'an':1},'shares':{'with':1},'gilded':{'boxes':1},'securing':{'a':1,'change-provoking':1,'the':2},'mudfish':{'may':1,'of':1,'is':1,'or':1},'fishes--the':{'mind':1},'moulting':{'immature':1},'grotesque':{'delusions':1},'betray':{'themselves':1},'hip':{'joint':1},'birnam':{'when':1},'hit':{'a':1,'and':1,'upon':1,'by':1},'gains':{'of':2,'that':1},'assumed':{'on':1},'furnaces':{'as':1,'with':1},'whistle':{'is':1},'explosively':{'from':1},'longest':{'for':1,'of':1,'feathers':1,'are':1,'waves':2,'or':1,'pinions':1},'instinctive':{'aptitudes':5,'activities':1,'repertory.':1,'capacities.':1,'rather':1,'capacities':5,'due':1,'actions':1,'element':1,'behaviour':10,'obligations':1,'registration.':1,'ants':1,'capacities--limited':1,'routine':2,'capacity':2,';':1,'.':1,'awareness':1,'behaviour.':1},'shreds.':{'whenever':1},'stone.':{'and':1,'nearly':1},'eye-piece':{'magnifies':1,'.':1,'its':1,'at':1},'expositor':{'.':1},'thereabouts':{'.':1},'nibbles':{'at':1},'arges':{'that':1},'investigate':{'the':1},'ninety-two':{'elements--we':1,'.':1},'activity':{'and':1,'we':1,'which':1,'for':2,'almost':1,'heretofore':1,'is':1,'in':2,'s':2,'.':3,'also':1,'as':2,'besides':1,'of':3,'known':1,';':1,'where':1},'rischgitz':{'collection.':6},'engraved':{'on':2},'nibbled':{'away':1},'bars':{'of':1,'have':1,'which':1},'art':{'of':1,'expressing':1,'in':1},'achieved':{'.':2},'intelligence':{'and':9,'on':1,'--the':1,'deteriorates':1,'cooperated':1,'of':2,'is':2,'when':1,'what':1,'.':7,'will':1,'to':3,'increases':1,'are':1,'a':1,'in':3,'seen':1,'the':2,'--a':1,';':2,'co-operating':1},'arc':{'in':2},'bare':{'head':1},'are':{'limited':1,'all':9,'scooped':1,'caused':1,'landlocked':1,'commoner':1,'illustrated':3,'particularly':3,'poorly':1,'particles':2,'certainly':1,'concerned':3,'to':9,'preserved':1,'under':1,'worth':1,'activities':1,'comparatively':1,'seized':1,'returned':1,'sitting':1,'very':25,'trillions':1,'foul':1,'vastly':1,'vast':2,'dim':1,'clouds':1,'large':2,'quick':3,'smaller':1,'specially':1,'dealing':1,'likely':1,'further':1,'estimated':1,'giving':1,'hereditary':2,'fossil':1,'ever':1,'led':1,'loose':1,'here':3,'hundreds':5,'met':1,'others':1,'persecuted':1,'strong':3,'observing':1,'great':2,'thirty':1,'vibrating':1,'descended':5,'usually':4,'conveniently':1,'composed':2,'mimicked':1,'suddenly':1,'merely':5,'explained':1,'marked':2,'highly':1,'brought':1,'visible':2,'hard-and-fast':1,'from':1,'recalling':1,'two':11,'few':1,'wonderfully':1,'therefore':2,'taken':1,'themselves':1,'phosphorescent--they':1,'more':13,'separated':1,'staggering':1,'tested':1,'ignorant':2,'known':7,'mounted':2,'none':1,'vicissitudes':1,'excessively':1,'exceptions':2,'pent-up':1,'bent':1,'indicated':1,'oviparous':1,'tax':1,'allowed':1,'huge':1,'rather':1,'divided':1,'breaking':2,'entangled':3,'1':2,'located':2,'ordinary':1,'substances--':1,'tried':1,'undergoing':2,'inconceivably':1,'burrowing':1,'different':2,'waves':3,'such':5,'a':13,'free-swimming':1,'chiefly':2,'four':2,'crowded':1,'light':1,'so':13,'pulled':1,'minded':1,'over':1,'mainly':1,'produced':1,'held':1,'still':5,'its':2,'26':1,'interesting':1,'masses':1,'actually':2,'strange':1,'microscopic':1,'spoiling':1,'covered':1,'receptacles':1,'secondary':1,'split':1,'good':1,'locusts':1,'safe':1,'they':3,'not':35,'sorted':1,'now':11,'killed':1,'well-known':1,'always':2,'sufficiently':1,'each':1,'found':3,'entirely':1,'traces':1,'lifted':1,'doing':2,'sifted':5,'transmissible.':1,'borne':3,'living':1,'shown':2,'fundamentally':1,'content':1,'laid':2,'7':1,'induced':1,'red':1,'attended':1,'quite':4,'small':1,'put':1,'beginning':2,'cremated':1,'exhibited':1,'constantly':1,'adepts':1,'greatest.':1,'instances':1,'spots':2,'directly':1,'immensely':1,'mercury':1,'little':1,'ancient':2,'similarly':1,'unknown':1,'plastic':1,'their':3,'cooling':1,'2':1,'too':1,'wrapped':1,'legally':1,'white':1,'witnessing':1,'mostly':4,'that':1,'exactly':1,'predictable':1,'convinced':1,'peculiar':1,'double':1,'enabled':1,'extraordinarily':2,'matter':1,'determined':1,'supposed':1,'treated':1,'encumbered':1,'variable':1,'close':2,'seen':4,'clearly':2,'relatively':2,'built':3,'thoroughly':3,'speculative':1,'able':8,'also':11,'edge':1,'absorbed':1,'presently.':1,'most':1,'eight':1,'printed':1,'drought':1,'incursions':1,'extremely':1,'nutritive':1,'manifested':1,'especially':1,'considered':1,'clear':1,'sometimes':1,'repeated':1,'face':1,'short-lived':1,'points':2,'left':4,'normally':1,'molluscs':1,'shot':1,'sceptical':1,'supported':1,'scattered':1,'right-handed':1,'rotating':1,'unsurpassed.':1,'giant':1,'highest':1,'distributed':2,'outside':1,'buttons':2,'being':2,'only':5,'going':1,'employed':1,'thousands':1,'meant':1,'exceptional':1,'dependent':1,'closely':1,'altogether':1,'instinctive':1,'areas':1,'playful':1,'sheltered':1,'common':1,'rung':1,'doubles':1,'approaching':1,'set':2,'acquired':1,'observed':1,'sporadic':1,'luminous':1,'subject':1,'said':2,'prominent.':1,'circulating':1,'continually':5,'jewels.':1,'luminescent':1,'unable':1,'various':2,'markedly':1,'probably':3,'prodigally':1,'numerous':3,'we':4,'gratefully':1,'invisible':3,'precious':1,'favourable':1,'many':16,'taking':1,'equal':1,'present':2,'tree-toads':1,'adapted':3,'among':1,'hollow':1,'learning':1,'deflected':1,'ether':1,'startling':1,'there.':1,'capable':1,'tremendous':1,'due':1,'.':3,'attaching':1,'immense':3,'much':4,'slowly':1,'likewise':1,'repelled':1,'painted':1,'suns.':1,'worked':1,'those':3,'stolen':1,'these':3,'awakened':1,'seven':1,'almost':2,'violently':2,'obtrusive':1,'obeying':1,'tell-tale':1,'in':26,'ready':1,'confirmed':1,'perpetually':1,'stimulated':1,'parts':1,'arguments':1,'mixtures':1,'played--for':1,'used':3,'temporary':1,'arctic':1,'constantly--either':1,'moving':1,'kept':2,'paralysed':1,'well':2,'without':2,'the':43,'charged':1,'just':4,'less':1,'increasingly':1,'offensive':1,'mistaken':1,'reincarnated':1,'human':1,'alternative':1,'revealed.':1,'corroborated':1,'thinking':1,'agile':1,'spread':1,'exempt':1,'resolved':1,'easily':1,'dark':1,'apt':4,'long-haired':1,'accepted':1,'redistributing':1,'ruled':1,'like':4,'complicated.':1,'shed':1,'right':1,'often':16,'some':9,'neutralised':1,'amongst':3,'born':3,'universes':1,'provided':1,'gradually':1,'dense':1,'asking':1,'pre-eminent':1,'palatable':1,'slight':1,'manufactured':1,'broken':1,'on':6,'about':6,'cautious':1,'carried':3,'getting':1,'of':7,'discussed':1,'greatly':2,'connected':1,'hatched':4,'flying':2,'attached.':1,'billions':1,'three':3,'authorities':1,'mere':1,'impressed':1,'strictly':1,'there':3,'disposed':1,'long':3,'stars':3,'deposited':1,'naturally':1,'lowest':1,'complete':2,'deaf':1,'but':3,'somehow':1,'curiously':1,'removed':2,'considerable':1,'directed':1,'made':5,'arranged':2,'characteristic':1,'placed':1,'called':11,'storing':1,'vehicles':1,'affectionate':1,'certain':1,'slowing':1,'general':1,'as':8,'definite':1,'at':7,'floating':2,'no':7,'generally':1,'other':8,'blackish-grey':1,'really':3,'separate':1,'suited':1,'included':1,'--a':1,'reflectors':1,'longer':2,'practically':3,'required':1,'utilised':1,'beds':1,'far':4,'undoubted':1,'restored':1},'walking-stick':{'insects':1},'chambers':{'perforating':1},'bark':{'and':1,'of':1},'arm':{'and':1,'spawn':1,'of':2,'is':1,'stretching':1,'.':1,'skips':1,';':1},'declined':{'and':1},'crunching':{'insects.':1},'youth':{'to':1,'from':1},'learns':{'a':1,'the':1},'discovered--pulling':{'and':1},'distinctive':{'features':1,'colour':1,'spectrum':3,'arrangement':1,'peculiarities':1,'fauna':1,'is':1},'anatomists':{'have':1},'misjudge':{'our':1},'universe.':{'this':1,'but':1,'sec':1,'illustration':1,'in':1,'our':1,'are':1},'contrary':{'to':1,'has':1},'nestor':{'parrot':1},'numerous':{'and':1,'hard':1,'locations':1,'parachutists--':1,'attempts':1,'lobes':1,'prehensile':1,'ways':1,'separate':1,'young':1,'microscopic':1,'muscles':1,'kinds':1,'that':1,'hundreds':1,'gas-bubbles':1,'types':1,'ribs':1,'colour-varieties':1,'variations':1,'as':1,'mutually':1,'tubercles':1,'appendages':1},'hairs':{'may':1,'of':2,'and':1,';':1,'which':1},'vitality.':{'illustration':1},'1.f.2':{'.':1},'recently':{'named':1,'said':1,'that':1,'regarded':1,'shown':1,'been':1,'erected':1,'discovered':2,'as':1,'learned':1},'creating':{'derivative':2,'the':2},'1.f.3':{'a':1,'this':1,'the':1,'.':1},'sole':{'of':2,'which':1,'have':1,'are':1},'outfit':{'for':1},'days.':{'there':1,'sec':1},'succeed':{'not':1,'and':1,'in':3,'but':1,'.':1},'head.':{'compare':1,'illustration':1},'prelude':{'to':1},'inertia':{'of':1},'bronze':{'second':1,'was':1,'age':1},'c':{'a':1,'that':1,'of':1,'there':2,'but':1,'.':16,'thirdly':1,'3':2,'others':1,'any':1},'license':{'available':1,'and':1,'terms':1,'especially':1,'for':1,'please':1,'when':1,'.':2,'as':1,'included':2,'apply':1,'the':1,'must':1},'attainment':{'at':1},'sheaths':{'of':1},'distinctively':{'new':1,'north':1,'marine':1},'1.f.5':{'.':1},'roman':{'galley':1},'became':{'useful':1,'heated':1,'an':2,'as':1,'in':1,'extinct':2,'gradually':1,'unavailable':1,'for':1,'restricted':1,'extinct.':1,'much':1,'too':1,'easier':1,'more':2,'aware':1,'suited':1,'a':3,'longer':1,'equal':1,'enregistered':1,'the':4,'essential':1},'cloud-like':{'effect.':1,'patches':1},'bond':{'of':1,'could':1},'finds':{'its':3},'peripatus':{'a':1,'83':1,'centipedes':1,'which':2},'sloth':{'s':1},'flies':{'to':2,'into':1,'at':1,'.':1},'flier':{'.':2},'distress':{'is':1},'reasons':{'and':1,'great':1,'have':1,'for':3,'is':1,'are':2,'which':1,'why':1},'sweet':{'sap':1,'odours':1},'sweep':{'of':1},'whelk':{'on':1,'the':1,'requires':1,';':1,'or':2},'regulated':{'then':1,'harmony':1,'by':1},'incandescent':{'may':1,'world-cloud':1,'atoms':1,'gas.':1},'fibres':{'come':1},'newbigin':{'m':1},'simpler':{'and':3,'elements':1,'animals.':1,'forms':2,'so':1,'fossil':1,'in':1,'still':1},'pr':{'are':1},'decline':{'europe':1,'of':1,'sometimes':1,'markedly':1},'there.':{'so':1,'it':1},'jugglery':{'with':1},'java':{'and':1,'ape':1,'ape-man':3,'at':1,'in':1,'man':2,'ape-man--an':2},'scented':{'with':1},'illumined':{'seaweed-growing':1,';':1,'green':1,'than':1,'surface':1},'pigmies':{'of':1},'dug':{'as':1},'whom':{'we':2,'you':1,'they':1},'reduction':{'of':3,'in':1},'pg':{'search':1},'--an':{'internal':1},'brick':{'you':1,'contains':1,'moves':1},'yolk-laden':{'portion':1},'attractive':{'phenomenon':1},'affectionate':{'and':1},'flight':{'and':1,'from':1,'also':1,'may':1,'brings':1,'is':2,'.':3,'brought':1,'most':1,'as':1,'so':1,'which':2,'of':3,'implies':1,'has':1,'was':1},'flints':{'with':1},'flinty':{'sponge':1,'needles':1,'skeleton':2},'precision':{'what':1},'defect':{'you':1,'in':2},'1864':{'by':1},'temperament':{'as':1},'1869':{'that':1},'1868':{'sir':1},'depends.':{'separate':1},'plants':{'and':24,'already':1,'begun':1,'is':1,'it':2,'at':1,'have':2,'in':3,'before':1,'stands':1,'for':1,'.':5,'to':3,';':2,'laboriously':1,'may':1,'upon':1,'but':2,'such':1,'with':1,'by':1,'flourished':1,'asexual':1,'can':1,'were':2,'the':4,'or':3,'are':2},'stolen':{'by':1},'conception':{'of':6,'the':1,'.':1,'to':1},'boast':{'with':1},'yellow-brown':{'the':1},'frozen':{'gas':1,'masses':1,'hard':2,'rigid':1},'compactness':{'of':1},'intercepts':{'great':1,'all':1},'64-6221541':{'.':1},'parents.':{'strangest':1},'lenard':{'and':1,'found':1},'dublin':{'high':1,'zoo':1},'obtrusive':{'rather':1},'obstacle':{'of':1,'race':1},'rid':{'of':3},'hare--with':{'human':1},'currents':{'within':1,'of':1,'there':1,'.':1,'needed':1,'at':1,'moisture':1},'peopled':{'than':1,'.':1},'away.':{'3':1,'it':1,'illustration':1},'chapter.':{'the':1},'twofold':{'process':1,'caution':1},'illustration:':{'the':1,'star':1},'lengths':{'.':2,'part':1,'which':1,'in':1},'muscle-cells':{';':1,'which':2,'.':1},'foretells':{'the':1},'undersides':{'of':1},'blood-relationship':{'with':1,'between':1},'stimulated':{'brain':1,'cells':1,'if':1,'by':2,'to':1},'dermis':{'and':1},'widely':{'separated':1,'distributed':1,'open':1},'peoples':{'with':1,';':1,'who':1,'to-day':1,'indeed':1},'9':{'a':1,'feet':1,'inches':1,'million':1,'looking':1,'000':1,'the':1,'saturn':1},'shirk':{'the':1},'yucca':{'moth':6,'flowers':2,'flower':3,'moths.':1},'higher':{'and':3,'vertebrates':2,'still':2,'reaches':2,'apes--gorilla':1,'pitch':1,'expressions':1,'education':1,'terrestrial':1,'forms':2,'apes':2,'power':1,'there':1,'note':3,'animal':1,'life':1,'degree':1,'insects.':1,'mammals.':1,'standard':1,'adventures.':1,'controlling':1,'faculty':1,'flowering':1,'than':1,'land':1,'animals':4,'level':3,'turn':2,'centres':1,'mammal':1},'current.':{'each':1},'chequer':{'hen':1},'mountain':{'ranges':2,'hare':4,'torrents':1},'ultimate':{'particles':1,'object':1,'service':1,'atoms':1},'flows':{'as':1,'in':1},'brooding':{'on':1,'it':1},'moving':{'and':2,'speck':1,'through':1,'at':1,'rapidly':2,'hoofed':1,'her':1,'away':1,'.':1,'particles':2,'how':1,'parts':2,'body':1,'very':1,'amongst':2,'atoms':1,'water':1,'objects':2,'molecules.':1,'with':5,'on':2,'about':1,'mass':1,'toward':1,'round':1},'mistake.':{'we':1},'sagacious':{'indeed':1,'when':1},'birch':{'alder':1},'vertical;':{'the':1},'263':{'professor':1,'reproduced':1},'lower':{'and':1,'side.':1,'vertebrates':1,'surface':1,'one':1,'in':1,'female.':1,'photograph.':1,'miocene':1,'jaw':6,'vertebrate':1,'orders':2,'eocene':1,'picture':1,'ends':1,'mammals':1,'levels':1,'jaw.':1,'than':3,'types':1,'temperature':2,'photograph':1,'diagram.':1,'animals':1,'level':1,'part':1,'side':1},'people.':{'no':1},'dancing':{'mice':1,'mouse':1,'or':1},'chickens':{'that':1,'incubated':1,'in':1},'outflame':{'of':1},'analysis':{'of':1,'showing':1,'would':1},'magnified':{'to':2},'solids':{'.':1},'edge':{'on':1,'or':1,'of':5},'length.':{'now':1},'b.c':{'.':2},'beautiful.':{'in':1},'muscle-fibre':{'m.f.':1},'266':{'the':1},'pollen':{'to':1,'from':2,'.':1},'abilities':{'come':1},'endeavour':{'to':1,'after':3,'associated':1,'or':1,'.':1},'unseen':{'occupies':1,'earthworms':1,'.':1},'mimicked':{'butterflies':1,'.':2,'by':1,'for':1,'are':1},'mood.':{'certain':1},'pigeons':{'and':2,'to':1,'it':1,'were':1},'competitive':{'.':1},'reincarnated':{'in':1},'intervals':{';':1},'inachis':{'from':2},'questions':{'and':1,'besides':1,'that':1,'of':3,'introduce':1,'have':1,'with':1},'inter-relations--the':{'subject':1},'reliance':{'on':1},'continent':{'of':1,'when':1,'fixes':1,'from':1},'tamed':{'.':1},'ravine':{'near':1},'wedge-shaped':{'piece':1},'corroborated':{'or':1,'by':1},'extracted':{'from':1},'workers':{'fastened':1},'tentatives--new':{'departures':1},'ocean':{'and':1,'for':1,'of':4,'is':2,'it':1,'.':2,'s':1,'home':1},'exclusively':{'of':1},'exhibition':{'of':2},'inducing':{'strange':1},'finder':{';':1},'turtle-backs':{'is':1},'associations':{'and':1,'established':1,'of':1,'between':1,'.':1,'were':1,'such':1,'with':1},'up-stream.':{'sometimes':1},'balloon.':{'photos':1,'running':1},'sensatory':{'nerve-fibre':1},'entangled':{'and':2,'in':2,'together':1,'air':1},'earth--making':{'a':2},'modifications':{'are':1},'rotate':{'and':1,'on':3,'all':1,'at':1,'round':1},'line--are':{'represented':1},'neanderthaler':{'.':1},'confront':{'us':1},'incidental':{'damages':1},'separately':{'is':1,'.':1},'collect':{'pennies':1,'half':1},'arthur':{'the':1,'thomson':5,'keith':7,'thomson.':1,'antiquity':1},'retires':{'to':1},'under-water':{'world':1},'foot--an':{'obvious':1},'table.':{'illustration':1},'essential':{'features':2,'similarity':2,'that':1,'vertebrate':1,'to':2,'oneness':1,'part':3,'independence':1,'in':1,'bones':1,'construction':1,'difference':1,'correlation':1,'identity':1},'engravings':{';':1},'hinted':{'at':2},'feet--the':{'largest':1},'men--races':{'of':1},'eluding':{'the':1},'streaming':{'motion':1,'from':2},'newsletter':{'to':1},'hjort':{'dr':1},'saucer':{'or':1},'aptitudes':{'many':1,'what':1,'which':1,'inborn':1,'then':1},'stately':{'and':1},'gradually':{'division':1,'slow':1,'from':1,'radiating':1,'out':1,'turned':1,'as':1,'reduced':1,'cooling':1,'settle':1,'eliminate':1,'evolved':2,'curved':1,'become':1,'increasing':1,'adapted':1,'regrown':1,'realised':1},'bushy-tailed':{'almost':1},'tends':{'to':6},'prof':{'.':7},'fragments':{'a':1,'and':1,'broken':1,'doubled':1,'of':2},'pieces--a':{'kind':1},'jumps':{'along':1,'from':1},'weir':{'confessed':1},'refused':{'to':1,';':1},'race--there':{'is':1},'intense':{'white':1,'disturbance':1,'competition':1,'activity':1},'vivid':{'idea':1},'cautious':{'and':1,'for':1},'mingled':{'with':4,'together':1},'age.':{'photograph':1,'sand-pit':1,'some':1,'as':1,'cenozoic':1,'they':1,'the':1},'row':{'of':1},'tortuous':{'path':1},'firing':{'the':1},'deepish':{'water':1},'forbears':{'long':1},'penetration':{'implies':1,'.':1},'lifeless':{'world.':1},'range':{'of':7,'became':1,'in':2},'wonders':{'of':4,'that':1},'fluttering':{'.':1},'gamma':{'rays':4},'naturalists':{'who':2,'have':1},'feed':{'and':1,'on':5,'for':1,'there':1,'some':1,'at':2,'in':1},'enregistration':{'of':1},'moss':{'and':1,';':1,'by':1},'conquest':{'of':8,'implied':1,'both':1},'attached.':{'methods':1},'flagellates':{'in':1},'canal':{'in':1,'system':1,'round':1},'impressed':{'on':1,'with':1,'by':1},'acquiesce':{'as':1,'in':1},'extremely':{'rapid':1,'interesting':1,'alert':1,'rarified':1,'delicate':1,'conservative':1,'fine':1,'thin':1},'question':{'and':2,'what':1,'rises':1,'to-day':1,'that':1,'whether':2,'of':3,'is':4,'had':1,'but':1,'to':2,'as':1,'which':1,'in':2,':':2,'than':1,'must':1},'cocoon--the':{'bag':1},'cuticle':{'or':1},'enregister':{'outside':1,'ready-made':1,'or':1},'conceivable':{'ages':1},'mimicry':{'and':2,'is':1,'serves':1,'.':1,'in':1,'called':1},'sections':{'of':1,'3':1,'.':1},'files':{'of':1,'containing':1},'mountains':{'and':1,'on':1,'like':1,'of':3,'.':1,'to':1,'are':2,'the':1},'potassium':{'pill':1},'glamour':{'of':1},'cloth':{'if':1,'packets':1,'in':1},'began--a':{'small':1},'energy--traceable':{'back':1},'crane':{'and':1,'the':1},'ring-armour.':{'illustration':1},'raising':{'the':1},'penguin':{'notice':1,'213':1},'section.':{'influence':1},'nonplussed':{';':1},'consist':{'of':1,'themselves':1,'in':1},'characteristic':{'style':1,'set':1,'fossils':2,'pelagic':2,'of':4,'endeavour':1,'.':1,'contingencies--the':1,'sharp':1,'self-preservative':1,'bird':1,'population':1},'seize':{'the':1},'117':{'photo':1,'ten-armed':1},'stalking':{'about':1,'we':1,'carnivore':1},'homo':{'neanderthalensis':1,'sapiens':1,'heidelbergensis':1},'redistribution.':{'start':1},'etc.':{'are':1,'gives':1},'called':{'protists':1,'appropriately':1,'luidia':1,'nototrema':1,'negative.':1,'spring':1,'is':1,'labyrinthodonts':1,'chalones':1,'differentiation':1,'salps':1,'planets':1,'protozoa.':1,'obelia':2,'pontobdella':1,'helium':1,'zostera':1,'triticum':1,'viviparity':1,'peter':1,'informal':1,'positive':1,'educability.':1,'muellerian':1,'spiral':1,'peripatus':2,'aerial.':1,'their':1,'without':1,'pretty':1,'hormones':1,'lycosa':1,'energy':1,'red':1,'kelts':1,'we':1,'which':1,'convergences':1,'zoological':1,'glands':1,'the':23,'upon':1,'guanin':1,'learning':1,'phagocytes':1,'them':1,'amniota':1,'convergence':1,'batesian':1,'commensalism':1,'venus':1,'momentous':1,'a':5,'deeps':1,'into':1,'sun-spots':1,'chauliodus':1,'round':1,'cryptozoic':1,'physiological':1,'tropisms':2,'have':1,'were':1,'self-mutilation':1,'primitive':1,'cells':1,'experimental':1,'jasper':1},'x-ray':{'photograph':6,'spectra':1},'individuality':{':':1,'with':1},'freak':{'is':1},'sepia':{'from':2},'breast.':{'the':1},'problem.':{'1.f.4':1},'warning':{'colours':2,'note':1,'coloration':1},'reservoirs':{'of':1,'to':1},'trammels':{'of':1},'whirligig':{'beetle':2},'adams':{'10':1,'who':1},'knowledge.':{'astronomical':1},'rainbow':{'is':1,'.':1,'where':1,'in':1},'riot':{'in':1},'reason.':{'the':1,'sec':1,'what':1,'here':1},'tentative':{'men':3,'branches':1,'or':1,'experimental':1},'weight.':{'4':1},'endurance':{'patience':1},'peace':{'while':1,'or':1},'c.:':{'that':1},'reappearance':{'of':1},'club':{'can':1},'opalina':{'which':1},'income':{'.':2},'ferment':{'from':1},'intercrossing':{'or':1,'between':1},'generates':{'heat':2,'sufficient':1,'in':1},'backbone':{'and':1,'a':1,'of':1,'.':1,'which':1,'in':3,';':1},'problems':{'on':1,'that':1,'of':1,'but':1,'.':2,'which':1},'thirty-two':{'miles':1},'helping':{'to':1,'the':1},'develops':{'very':1,'into':1},'allowing':{'the':1,'elbow-room':1,'more':1},'-200':{'deg':1},'folds':{'its':1},'inventions':{'are':1},'vaseline':{'bottle':1},'fluorescence':{'on':1},'fan-like':{'cluster':1},'path.':{'there':1},'liquefy':{'air':1},'accumulations':{'of':1},'departments':{'of':1},'back.':{'the':1},'departs':{'209':1,'in':1},'appearance--an':{'epoch-making':1},'weights':{'or':1,'.':1},'well-being.':{'we':1},'hooky':{'surfaces':1,'that':1},'vue':{'gardens':1},'resistance':{'to':1,'.':1},'distributed:':{'this':1},'protuberant':{'the':1},'winds':{'rise':1,'from':1,'two':1},'open-minded.':{'the':1},'adjustment':{'to':1,'of':1},'contributions':{'and':1,'to':1,'from':3,'are':1},'magnifying':{'lens':1,'lens.':1},'tide-marks':{';':1},'copernicus':{'lower':1},'simon':{'newcomb':1},'e-mail':{'within':1},'disposal':{'however':1},'sparrow':{'to':1,'rise':1,'up':1},'deal.':{'the':1},'cradle':{'of':7,'whereas':1,'.':1,'in':1,'or':1,'is':1},'stable':{'kind':1,'lines':1,'crust':1,'.':1,'result':1,'curved':1,'stock':1,'equilibrium':1},'breach':{'of':2},'include':{'a':1,'all':1,'whales':1,'many':2,'one':1,'those':2,'the':2,'mediterraneans':1},'breathing':{'dry':1,'of':1,'by':2,'which':1,'movements':2},'wished':{'to':1},'wind.':{'in':1},'club-moss':{'forests':3},'talons':{'and':1},'alder':{'and':1},'sensation':{'of':4},'electron':{'and':3,'sir':1,'has':1,'theory':3,'theory--the':1,'is':4,'current':3,'when':1,'as':1,'.':2,'rotating':1,'to':2,'pump':1,'physicists':1,'in':1,';':1,':':1,'was':1,'merely':1,'sticks':1},'graphic':{'illustration':1},'dando':{'baby':1},'bounding':{'about':1},'posture':{'with':1},'redistribute':{'this':1},'ideas--the':{'living':1},'self-effacement':{'is':1,'often':1,'but':1},'fur':{'and':1,'of':2,'or':1},'notes':{'with':1},'phenomena.':{'sec':1},'agency.':{'yellow-crowned':1,'chimpanzee':1,'orang-utan':1,'penguins':1,'in':1,'baby':2},'deals':{'with':1,'.':1},'glaciations':{'and':1},'warranties':{'of':2,'or':1},'poisonous':{'snake':2,'species':1},'phoenix':{'electric':1},'moulding':{'effect':1},'blood-fluid':{'or':1},'noted':{'for':1,'that':4},'assemblage':{'of':2},'disclaimer':{'of':1,'or':2},'smaller':{'even':1,'and':1,'telescope':2,'cheek-bones':1,'constituents':1,'less':1,'.':1,'particles':2,'will':1,'electrons':1,'have':1,'globes':1,'magellanic':1,'particles.':1,'than':8},'gripping':{'grappling':1,'the':1,'them':1,'teeth':1},'possum.':{'the':1},'tides--another':{'instance':1},'coldrum':{'in':1},'euphrates':{'.':1},'chauliodus':{'a':1},'fold':{'of':3},'sea-anemones':{'and':1,'147':1,'we':1,'which':1,'on':2,'mask':1,'hermit-crabs':1,'they':1},'unsurpassed.':{'to':1},'protrude':{'greatly':1},'sifting-out':{'process':1},'fermenting':{'vegetation':1},'makers':{'of':1},'folk':{'or':1,'place':2,'two':1,'human':1,'in':1},'unavailable':{'the':1,'.':3,'heat':1,'energy':1,'having':1},'disentangle':{'these':1},'waiting':{'for':1},'chose':{'a':1,'compartment':2},'desires':{'.':1},'kangaroo':{'while':1,'carrying':2},'underwood':{'underwood.':2},'youngest':{'and':1,'.':1},'desired':{'.':1},'grilse.':{'in':1},'separation':{'of':2},'frilled':{'lizard':3,'lips':2},'fifteen-spined':{'stickleback':1},'--carrying':{'with':1},'fruit-eating':{'and':1},'little-brained':{'ants':1},'settling':{'on':1},'evolution--the':{'establishment':1},'survivor':{'of':1},'convolutions.':{'illustration':1},'mauer':{'near':2,'at':1},'ones.':{'various':1},'leaving':{'a':1,'no':2,'perhaps':1,'only':1,'the':2,'its':1},'suggests':{'the':3,'that':2,'motions':1,'.':1},'patagium':{'and':1,'is':1},'oar':{'reduces':1},'breeds':{'of':2,'it':1,'that':1},'hue':{'and':1,'is':1},'pent-up':{'reservoirs':1},'apple':{'.':1},'spy':{'in':1},'egypt':{'and':1,'crete':1,'the':1},'earth-moon':{'system.':1},'facilitating':{'their':1},'apt':{'to':9},'expect':{'great':1,'that':1,'very':1,'there':1,'it':1,'to':2,'much':1},'marmosets':{'and':2},'motor':{'nerve-fibre':2,'nerve-cell.':1,'nerve-cell':1,'nerve-fibres':1,'nerve-cells':2,'answer':1},'newby':{'chief':1},'apply':{'to':1},'repopulation':{'of':1},'segregating':{'their':1},'use':{'and':3,'some':1,'it':1,'at':1,'in':1,'its':1,'for':2,'to':3,'there':1,'when':1,'.':2,'their':2,'has':1,'was':1,'them':1,'unless':1,'very':1,'but':1,'part':1,'a':3,'this':3,'of':14,'carbonic':1,'the':5,'seaweed':1},'fee':{'of':1,'is':1,'as':1,'for':3,'or':2},'from':{'all':3,'being':7,'tip':2,'worms':3,'ignoble':1,'facts':1,'japan':1,'inshore':1,'its':16,'roots':2,'mingling':1,'outer':1,'electricity':1,'masses':1,'behind':1,'forms':1,'to':1,'crest':4,'photographs':2,'donors':1,'them':2,'his':1,'branch':1,'10':2,'very':1,'freezing':1,'within.':1,'five':1,'trough':1,'now':1,'monkeys':1,'sowing':1,'benevolent':1,'hawaii':1,'these':4,'slipping':1,'each':9,'where':1,'side':6,'view':1,'people':1,'generation':2,'intelligence':2,'fish':2,'some':3,'direct':1,'dead':1,'gumboil':1,'year':1,'our':4,'dawn':1,'what':3,'colour-varieties':1,'sun':1,'nebula':1,'asia':1,'your':1,'particles':1,'outside':2,'expressing':1,'public':1,'red':1,'scientific':6,'insects':1,'men':1,'seaweeds':1,'water':5,'protection':1,'great':1,'struggle':1,'others':1,'simpler':1,'both':1,'about':2,'actual':1,'experience':1,'stone':1,'railway':1,'osborn':4,'pre-human':1,'first':2,'among':1,'simple':2,'within':4,'inland':1,'one':23,'pole':2,'learning':1,'ether':1,'cloud':1,'millions':1,'ancient':1,'her':1,'body-cells.':1,'remains':2,'pre-existing':1,'three':2,'sunlight':2,'.':1,'uniting':1,'behind.':1,'which':12,'white':1,'injury':1,'specimens':1,'radium':6,'500':1,'gill-breathing':1,'elsewhere':1,'that':2,'mammals':2,'malay':1,'heat':1,'part':1,'another.':1,'body-cells':1,'atom':4,'infusorians':1,'knife-blade-like':2,'those':1,'fossil':1,'sponge':1,'animals':2,'this':7,'tree':3,'us':3,'air':2,'below':1,'diagrams':1,'more':1,'and':1,'egypt':1,'mexico':2,'certain':1,'modern':1,'india':3,'it':2,'an':2,'states':1,'collision':1,'something':3,'any':6,'sir':1,'different':1,'ancestors':1,'end':1,'negatively-electrified':1,'scotland':1,'innumerable':1,'other':5,'5':2,'copying':1,'ordinary':1,'several':1,'enormous':1,'star':1,'glands':1,'time':3,'hand':1,'eight':1,'two':2,'nothing':1,'such':3,'types':1,'man':2,'a':37,'ingersoll':2,'land':2,'natural':1,'age':3,'their':7,'without':5,'knipe':6,'not-living':2,'every':1,'the':256,'europe.':1},'figure':{'of':1,'is':2,'one':1,'2':1,'ninety-two':1,'in':1,'.':1},'animals--by':{'insects':1},'frog':{'about':1,'showed':1,'discriminates':1,'flying':1,'had':1,'catches':1,'answers':1,'192':1,'1':1,'s':1,'rhacophorus':1,'which':1,'rhinoderma':1,'the':1,'mouth.':1,'merged':1,'lays':1},'few':{'and':1,'insects':1,'years':1,'feet':2,'spiders':1,'protozoa':1,'offspring':1,'lessons':1,'things':3,'ticks':1,'opportunities':1,'astronomers':3,'rivals':1,'other':1,'black':1,'weeks':1,'hundred':2,'minor':1,'inches':1,'that':1,'thousand':1,'days.':1,'records':1,'representative':1,'yards':1,'cases':3,'now':1,'extremely':1,'conspicuous':1,'pounds':1,'of':3,'months':1,'days':4,'cases.':1,'corners':1,'exceptions':1,'minutes':1,'embryonic':1,'illustrations.':1},'apprenticeship--tentative':{'men--primitive':1},'gales':{'will':1},'diving-bell':{'to':1,'full':1},'eagles':{'gather':1},'possession':{'of':2},'grandest':{'and':1,'pictures':1,'as':1},'secretions':{'of':1},'humanly':{'impossible':1},'inclined':{'to':1,'pillar':1,'plane':6,'plane.':1},'rarest':{'type':1},'impress':{'him':1},'steadfastly':{'serving':1},'eagles.':{'similarly':1},'hilger':{'ltd.':2},'rabbit':{'and':1,'squirrel':1,'for':1,'when':1,'.':1,'which':1,'the':1},'scale.':{'sec':1,'if':1},'development--that':{'there':1},'women':{'show':1},'fro.':{'this':1},'us.':{'this':1,'the':1,'races':1,'sec':1},'getting':{'a':1,'on':4,'what':1,'thinner':1,'hotter':1,'into':3,'air':1,'possession':1,'farther':1,'wet':1,'rid':1,'out':1,'away':1,'transport':1,'at':1},'ice.':{'seeing':1},'overlappings':{'.':1},'anywhere':{'at':2,'else':1},'perched':{'on':1},'field--which':{'he':1},'three-chambered.':{'the':1},'dissolve':{'a':1,'the':1},'proof':{'of':12,'that':2},'have--there':{'is':1},'non-growing':{'non-moulting':1},'habitats':{'which':1},'proprietary':{'form':1},'mud-fish':{'protopterus':2},'thirsty':{'and':1},'calculation':{'suggests':1,'as':1,'ought':1},'inaccessible':{'to':1},'tax':{'returns':1,'deductible':1,'identification':1,'treatment':1,'exempt':2},'land-snails':{'representing':1,'for':1},'something':{'associated':1,'less':1,'is':1,'as':1,'beyond':1,'to':1,'which':1,'new':2,'has':1,'more':1,'corresponding':2,'that':3,'very':3,'new--a':1,'but':1,'else':1,'with':1,'simpler':1,'about':1,'like':6,'of':2,'could':1,'the':1},'serial':{'issue':1},'made':{'and':3,'among':1,'polished':1,'rudely':1,'it':5,'an':2,'visible':3,'incandescent':1,'in':6,'luminous':1,'their':1,'out':1,'perfect':1,'bridges':1,'till':1,'of.':1,'.':6,'1':1,'to':7,'pets':1,'man.':1,'lays':2,'do':1,'malaria':1,'that':2,'of':5,'possible':1,'but':1,'forbidding':1,'during':1,'with':1,'by':8,'a':5,'on':1,'great':1,'many':1,'clear':1,'no':1,'up':3,'large':1,'points':1,'so':2,'artificially':1,'january':2,'stone':1,'the':5,'more':1,'at':1},'sir':{'e.':1,'norman':3,'richard':1,'wm':1,'j':7,'william':8,'g':1,'arthur':7,'oliver':3,'w':3,'harry':1,'isaac':5,'ernest':6,'john':3,'george':1,'ray':4},'galls':{'on':1},'counting':{'the':1,'electrons':2},'decaying':{'vegetation--an':1,'leaves':1},'sit':{'on':1},'distinguishable':{'from':1},'justifiable':{'to':2},'past.':{'on':1,'one':1},'struggles':{'there':1,'upward':1},'moods':{'.':1},'fortunate':{'for':1},'brian':{'janes':2},'instead':{'of':8,'strong':1},'struggled':{'.':1},'substances--':{'phosphorescent':1},'tension':{'passes':1,'is':1,'grows':1},'cupboard':{'and':1},'attend':{'the':1,'too':1},'yolk-sac':{'y.s.':1},'slipher':{'of':1},'immersed':{'in':3},'masks':{'the':1},'tack':{'of':2,'however':1},'wrist':{';':1,'which':1},'understanded':{'of':1},'1887':{'michelson':1},'1885':{'another':1},'agglomerations':{'of':1},'superstitions':{'have':1},'are--measuring':{'them':1},'clauses.':{'experimentation':1},'inheritance':{'that':1,'of':1,'.':1,'which':2,'the':1,';':1},'interrupted':{'light':1},'polystomella':{'showing':2},'fortunately':{'fast':1},'ovipositor':{'inside':1},'locomotor':{'agility':1,'triumph':1,'activity':1},'summer.':{'there':1},'irregularity':{'in':1},'preparing':{'our':1,'the':2},'affection.':{'the':1},'spreads':{'sleeping':1,'out':1},'saturated':{'southwards':1},'farming':{'or':1},'minnow':{'and':1,'to':1,'could':1},'mentioned.':{'this':1,'illustration':1},'reptile':{'and':1,'from':1,'breathes':1,'but':1,'total':1,'95':1,'94':1,'at':1},'interpreted':{'to':1,'as':1},'whilst':{'its':1,'an':1},'mathematicians':{'upon':1},'130':{'000':1,'steps':1},'idiosyncrasies':{'crop':1,'.':1},'looks':{'a':1,'like':3,'less':1,'almost':1,'big':1,'after':1,'extraordinarily':1,'.':1,'as':4},'135':{'animal':1},'abstruse':{'speculations':1},'interpreter':{'.':1},'139':{'photo':1},'138':{'the':1,'protective':1},'ease.':{'more':1},'self-fertilisation':{'because':1},'primordial':{'substance':2},'choose':{'to':1},'orange':{'screen':1,'yellow':2},'clusters':{'of':1,'at':1},'receptacles':{'or':1},'forty-five':{'seconds':1,'degrees':1},'crowds':{'of':3},'refracting':{'telescope':3},'originator':{'of':2},'bumbling':{'bittern':1},'forty-one':{'years':1},'orthodox':{'head-on':1},'practice':{'however':1,'or':1},'flew':{'away':1,'round':1,'22':1},'impressing':{'other':1,'itself':1},'emerald':{'hue.':1},'satellites':{'of':3,'miles':1,'like':1},'attaining':{'a':1,'to':1,'various':1,'that':1},'successor':{'rather':1},'viscid':{'threads':2},'articles':{'will':1,'with':1,'are':1},'crumb-of-bread':{'sponge':1},'sleeve':{'.':1},'movements.':{'this':1},'profound':{'idea':1,'abysses':1,'practical':1,'.':1,'calm':1,'moulding':1},'tram':{'or':1},'seashore.':{'illustration':1},'transmitted':{'through':2,'.':1},'trap':{'formed':1,'.':1},'cocoon':{'flies':1,'when':1},'bills':{'and':1,'up':1,'upwards':2},'erratic':{'quantities':1,'scattered':1,'paths':1},'foot-print--an':{'eloquent':1},'fitting':{'their':1},'old-established':{'creature':1},'related':{'to':11,'half-monkeys':1,'fish':1,'which':1},'whitish':{'spots':1},'remove':{'the':1},'82':{'peripatus':1},'83':{'photo':1,'photograph':1},'80':{'per':1},'86':{'photo':1,'an':1},'87':{'animals':1},'ebooks':{'and':1,'unless':1,'.':1,'are':1,'in':1,'with':1},'respects':{'a':2,'very':1,'like':1},'loquacious':{'bird.':1},'cerebral':{'hemispheres':1,'advances':1},'blood-channels':{'and':1},'flattening':{'of':1},'exporting':{'a':1},'20.--comet':{'october':1},'carpo-metacarpus':{'bone':1},'supports':{'them':1},'dive':{'far':1,'neither':1},'despairing':{'of':1},'fun':{'but':1},'zoological':{'gardens.':1,'races':1,'park':1,'haunt':1,'park.':10},'pours':{'out':2},'mussels.':{'the':1},'maintains':{'that':1},'promptly':{'discovered':1},'york':{'and':1,'zoological':10},'waves--light--what':{'the':1},'obliteration':{'.':1},'tenant':{'.':1},'support.':{'project':1},'age-old':{'mystery':1},'weaves':{'its':1},'organic':{'evolution':9,'evolution.':3,'matter':1,'nature':1,'particles':1,'evolution--there':1,'dust':1},'g':{'notice':1,'.':10,'in':1},'musculature':{'integumentary':1},'curlews':{'both':1},'behaviour.':{'a':2,'evolution':1,'illustration':1,'comparing':1,'sec':1,'in':1,'the':2},'chisel-edged':{'teeth':1},'hence':{'a':1,'fall':1,'it':1,'appendicitis':1,'in':1,'the':2,'if':1},'pterosaurs':{'none':1},'californian':{'coast.':1},'incipient':{'race':1,'species':1},'embryo':{'-reptile':1,'there':2,'no':1,'-mammal':1,'is':2,'within':1,'.':3,'while':1,'of':2,'the':1,'has':1,'with':1,'-fish':1,'shows':1},'plainly':{'this':1,'how':1,'that':1},'arcturus':{'43.4':1},'pycraft':{'w':1},'echo':{'of':1},'bonnet':{'monkey':2},'foals':{'and':1,'to':1},'eleventh':{'printing':1,'moon':1},'placental':{'mammals':1},'representations':{'concerning':1},'imperial':{'war':4},'miles--in':{'itself':1},'dispersive':{'effect':1},'salient':{'aspects':1,'features':1,'examples':1},'droop':{'forward':1},'unknown':{'on':1,'gas':1,'but':1,'.':3,'to':1,'manner':1,'in':1,'until':1},'galley':{'hill':1,'.':1},'retreats':{'and':1},'their':{'distances':1,'interpretation':1,'perch':1,'orbits.':1,'boxed-in':1,'brain':1,'attempts':1,'relation':1,'salivary':1,'upturned':1,'speed':3,'lessons':2,'birthplace':2,'doom':1,'resemblance':1,'progeny':1,'masses':1,'possessors':2,'young':6,'opportunities':1,'wings':1,'environment':2,'surroundings':3,'neighbours':1,'bases':1,'parents':2,'marks':1,'resources':1,'appearance--an':1,'borrowed':1,'clutches':1,'fate':1,'distance':1,'food':4,'advances':1,'moons':1,'early':1,'smallness':1,'background':1,'hands':1,'slipperiness':1,'height':1,'day':1,'condition':1,'evolution':1,'success':1,'parrot':1,'course':1,'crops':1,'luminosity':2,'length.':1,'back-teeth':1,'activity':1,'distant':1,'bills':4,'soft':1,'breast-bone':1,'bond':1,'dwindled':1,'burrows':1,'old':1,'mental':1,'weight':1,'life-history':2,'appearance':1,'energy':3,'range.':1,'sifting':1,'relative':2,'rate':1,'individual':1,'year':1,'development':2,'foals':1,'enemies':3,'living':1,'constitution':1,'axes':1,'interference':1,'migrations':2,'artificial':1,'fellows':1,'colours':1,'wave-lengths.':1,'simplest':1,'approach':1,'bearers':1,'scaly':1,'body':2,'variability':1,'toes':1,'transparency':1,'power':3,'importance':1,'argument':1,'kindred':3,'limbs':1,'atoms':2,'behaviour':1,'host':1,'chances':1,'outlying':2,'substance':1,'allies':1,'brilliant':1,'dormancy':1,'insect':3,'discoveries':1,'motion':1,'turn':1,'length':2,'head':1,'youthful':1,'first':1,'origin':2,'golden':3,'own':9,'gizzard--certainly':1,'family':1,'presence':1,'reasons':1,'father':1,'bluish':1,'multiplication':1,'enlarged':1,'names':1,'passage':2,'size':1,'decline':1,'use':1,'palm-bones':1,'chisel-edged':1,'muddy':1,'destination':1,'secret':1,'thinnest':1,'prey':1,'predecessors':1,'way':7,'fixed':2,'repertory':1,'more':2,'function':1,'hue':1,'eyes':1,'tissues':1,'yolk-forming':1,'wits':2,'brains':1,'becoming':1,'back':1,'heat':2,'importance.':1,'lives':1,'adult':1,'impulse':1,'ring-armour.':1,'insect-visitors':1,'homes':1,'characteristic':1,'cells':3,'detachable':1,'ancestral':1,'lips':1,'vocal':1,'temperatures':1,'reproduction':1,'light':3,'photosynthesis':1,'remains':1,'parents.':1,'real':1,'furs':1,'modern':1,'mind':1,'discovery':2,'deep':1,'manner':1,'lifetime':1,'movements':2,'respective':1,'ancestors':1,'variety':1,'lengths':1,'ascent':1,'maximum':1,'arrangement':1,'pectoral':1,'field':1,'relatives':3,'numerous':1,'income':2,'tool':1,'contemporaries':1,'worldwide':1,'polar':1,'material':1,'cupboard':1,'mouths':1,'normal':1,'nest':1,'reach':1,'orbits':1,'counterparts':3,'visitors':1,'significance.':1,'strength':1,'mouth':1,'delicate':1,'ink-bags':2,'hair':1,'foothold':2,'coloration':1,'natural':1,'modes':1,'pigmy':1,'nostrils':1,'eggs':5,'life':3,'posterior':1,'incessant':1,'castings':1,'manipulative':1,'tentacles':1,'smooth':1,'mother':2,'reward':1,'wing':1,'bodies':3,'usual':1},'1500':{'west':1},'delusions':{'yet':1},'behind.':{'there':1,'illustration':1},'embryology':{'--these':1,'of':1},'unstereotyped':{'they':1},'invisibility':{'and':1,'may':1,'coloured':1,'does':1,'at':1,'.':1},'noteworthy.':{'penguins':1},'shell':{'and':3,'very':1,'of':11,'is':4,'tends':1,'against':1,'.':2,'were':1,'in':3,'not':1,'with':1,'or':1},'x-rays':{'and':2,'we':1,'ltd.':4,'were':1,'.':2,'discovered':1,'have':1,'so':1,'are':1,'they':1,'which':3,'not':1,'through':2,';':1},'bromogelatine':{'plates':1},'shelf':{'fringing':1,'around':1},'shallow':{'and':1,'there':1,'well-illumined':1,'.':1,'water':5,'trough':1,'water.':2,'pond':1,'areas':1},'reflecting':{'instrument':1,'telescope--the':1,'telescope':1,'others':1},'constituent':{'colours':1,'of':1,'element':1},'july':{'17':2},'reverses':{'its':1},'blind':{'flat-fish':1,'alley':1,'gut':2},'dynamical':{'principle':1},'succeeded':{'and':1,'sir':1,'or':1,'.':1,'every':1,'in':3,'by':1},'uninterested':{'to':1},'isolation':{'of':1,'from':1,'which':1},'richer':{'evolution':1},'instincts--of':{'insects':1},'dynamo':{'as':1,'does':1,'it':1,'which':1},'individualities':{'arise':1},'dusty':{'the':1},'varied.':{'a':1},'tracts':{'of':1},'safeguarded':{'the':1},'violets':{'would':1},'fowl':{';':1},'gate-posts':{'and':1,'green':1},'sifting.':{'but':1},'endeavour.':{'sec':1,'in':1},'mongolian':{'and':1},'germinal':{'changefulness':1,'variations':1},'siamang':{'.':1},'reaches':{'a':5,'on':1,'of':3,'it':1,'us':1,'which':1,'in':1,'such':1,'the':2,'its':3},'angle':{'and':1,'on':1,'to':2,'.':1},'pollen-tubes':{'grow':1},'agency':{'could':1},'olfactory':{'messages':1},'supplanted':{'by':1},'well-marked':{'chins':1,'breeds':1},'ungirt':{'loin':1},'which':{'all':9,'belong':2,'help':1,'just':1,'produces':2,'captures':1,'probe':1,'vary':1,'gulls':1,'leads':3,'stored':1,'thanks':1,'go':3,'still':1,'birds':1,'causes':4,'seemed':2,'bridges':1,'rapid':1,'depend':1,'had':6,'came':1,'actually':1,'forms':5,'simple':1,'only':1,'behave':1,'extends':2,'helps':1,'sulked':1,'under':1,'attained':2,'covered':1,'circle':1,'has':43,'alter':1,'happened':1,'grip':1,'eventually':1,'his':2,'means':3,'food':2,'breaks':1,'tends':1,'lurk':1,'floated':1,'confines':1,'feels':2,'cannot':5,'nearly':2,'they':19,'progress':1,'not':1,'during':1,'he':7,'now':2,'dr':1,'monkeys':1,'look':1,'indicate':2,'like':1,'did':1,'always':2,'generally':1,'modern':2,'make':4,'admitted':1,'travels':2,'this':5,'persisted':1,'she':1,'turns':1,'become':2,'speculation':1,'freshwater':1,'mount':1,'reaches':1,'often':1,'reference':1,'people':1,'sends':1,'ancestral':1,'some':4,'supplies':1,'recapitulate':1,'constitute':2,'individual':1,'lines':1,'are':66,'pass':1,'our':1,'kant':1,'parachuting':1,'even':1,'delivered':1,'plays':1,'opened':1,'lead':1,'constitutes':2,'rings':1,'its':1,'everything':1,'contained':1,'experiment':1,'huxley':1,'scientists':1,'probably':4,'learned':1,'dilutes':1,'roentgen':1,'can':2,'we':52,'led':4,'nature':2,'climbs':1,'never':2,'atoms':1,'water':2,'credits':1,'were':12,'sink':1,'lasts':1,'put':1,'from':1,'puzzled':1,'come':1,'by':5,'about':1,'enables':2,'rests':1,'deals':1,'could':4,'strikes':1,'contract':1,'mixes':1,'carries':2,'became':1,'stand':1,'professor':1,'swing':1,'usually':1,'disappears':1,'stimulate':1,'comes':1,'feed':2,'emerge':1,'radio-activity':1,'followed':1,'secure':3,'formerly':1,'supply':1,'suddenly':1,'seems':1,'habitual':1,'marked':2,'one':1,'brought':1,'lies':2,'spans':1,'comprises':1,'whalebone':1,'mark':1,'appeared':1,'presents':1,'differ':1,'light':1,'expresses':1,'takes':1,'would':8,'to':3,'there':11,'finally':1,'periodically':1,'rivals':1,'live':4,'spread':3,'slowly':1,'living':1,'grew':2,'was':18,'opens':1,'gives':1,'life':1,'enable':1,'arise':1,'molecules':1,'form':1,'afford':1,'becomes':1,'marks':1,'amphibians':1,'broke':1,'separates':2,'absorbs':1,'almost':1,'reverses':1,'must':4,'plants':2,'pull':1,'made':1,'animals':2,'unfortunately':1,'these':3,'prevents':1,'require':1,'work':1,'lessen':1,'will':7,'attacks':1,'remain':1,'lays':1,'many':1,'already':1,'meet':1,'circulate':1,'dr.':1,'hatch':1,'have':22,'bind':1,'give':3,'frogs':1,'again':1,'is':61,'occupies':1,'thus':1,'it':22,'eats':1,'helped':1,'case':1,'as':3,'lived':1,'protects':1,'at':2,'slip':1,'allowed':1,'regulate':1,'pit':1,'counteract':1,'granules':2,'lie':1,'date':1,'no':4,'suggest':1,'began':2,'holds':1,'when':2,'astronomers':2,'very':1,'take':4,'forces':1,'brings':1,'new':1,'you':2,'grows':1,'neolithic':1,'formed':2,'conveys':1,'attend':1,'though':1,'may':16,'dive':1,'faintly':1,'paid':1,'reflect':1,'most':1,'fell':2,'tackle':1,'two':1,'multiply':1,'infects':1,'grow':1,'man':8,'a':8,'demand':1,'land':2,'in':7,'i':2,'makes':7,'arrange':1,'mask':1,'lasted':1,'thought':1,'used':1,'eurypterids':1,'allow':1,'keeps':1,'masks':1,'the':57,'justify':1,'blend':1,'responded':1,'migrate':1,'once':1},'tree-frogs':{'are':2,'called':1},'spawns':{'in':1},'divers':{'come':1},'vegetation':{'marking':1,'that':1,'of':1,'only':1,'in':1,'probably':1,';':1,'lingering':1,'consisted':1},'hydrostatica':{'related':2},'centre':{'and':4,'of':4,'.':2,'to':1,'only':2,'at':1,'in':1,'or':1},'wind-blown':{'sand':1},'who':{'show':1,'is':3,'soon':1,'anticipating':1,'have':4,'estimated':1,'are':5,'intrude':1,'said':1,'described':1,'had':2,'does':1,'has':1,'lacks':1,'do':1,'knows':1,'found':1,'may':1,'came':1,'gnaw':1,'lives':1,'learns':1,'approach':1,'believe':1,'with':1,'by':2,'concentrated':1,'made':4,'to-day':1,'like':1,'was':1,'think':1,'will':1,'maintain':1,'can':1,'mounts':1,'desire':1,'agree':1,'restored':1,'notifies':1},'cohesion':{'of':1,'between':1},'1.d':{'.':1},'1.e':{'below.':1,'.':1},'microbic':{'or':1},'digestive':{'and':1,'filaments':1,'juice.':1},'1.a':{'.':1},'1.b':{'.':1},'1.c':{'below':1,'.':1},'emancipation':{'of':3,'from':1},'violet.':{'sorting':1},'class':{'a':1,'of':5,'we':1},'deny':{'a':1},'expert':{'opinion':1,'advice':1},'deccan':{'the':1},'wasp-like':{'impression':2},'.001':{'per':1},'pipe':{'to':1,'.':1},'different-lengthed':{'waves':1},'cloaked':{'by':1},'europe.':{'it':1,'illustration':1},'swarming':{'in':1},'goals':{'and':1},'unimpeded':{'five':1},'refund':{'set':1,'from':1,'of':3,'-':1,'.':2,'in':1,'described':1},'terrific':{'cold':1},'insulators':{'because':1,'for':1},'perceptions':{'and':1},'chances':{'of':1,'are':1},'sceptical':{'about':1},'agreed':{'to':1},'tidings':{'from':1},'chapters':{'of':1},'upright':{'forehead':1,'on':1,'nail':1},'purely':{'instinctive':2},'sabre-toothed':{'tiger':1},'seaweed':{'and':3,'for':1,'area':1,'of':1,'nest':1,'continues':1,'but':1,'.':1,'green':1,'nibbles':1,'each':1,'vegetation.':1,'or':1},'changeful':{'surroundings':1,'processes':1,'place':1},'utter':{'darkness--an':1,'sufficient':1,'darkness':1},'fear':{'of':2},'darkest':{'period':1},'feat':{'which':1},'agrees':{'in':1},'nearer':{'a':1,'and':1,'an':1,'to':3,'the':3,'.':1,'than':1},'cave-bear':{'became':1,'cave-lion':1},'implying':{'initiative':1},'cache':{'of':1,'after':1},'gouging':{'out':1},'surroundings':{'on':1,';':1,'like':2,'these':1,'many':1,'.':4,'admits':1,'their':1,'without':1,'including':1,'lighter':1,'in':1,'not':1,'the':4,'rests':1,'must':1},'postulated':{'by':1},'herald':{'the':1,'its':1},'inhabit':{'the':1},'local':{'influence':1,'drying':1,'changes':1,'thickness':1},'combe':{'capelle':1},'snow-capped':{'mountains':1},'dexterities':{'which':1},'helios':{'the':1},'cube':{'of':1},'skims':{'from':1},'watching':{'those':1,'in':1},'d.p.':{'it':1},'displayed':{'performed':1},'primeval.':{'the':1},'intensely':{'hot':1},'words':{'all':1,'as':1,'are':2,'what':1,'to':1,'true':1,'there':2,'.':1,'also':1,'written':1,'meant':1,'we':1,'signifying':1,'but':2,'indicative':1,'such':1,'with':1,'monkeys':1,'animals':1,'of':2,'became':1,'can':1,'positive':1,'become':1,'the':2,'or':1},'please.':{'it':1},'penetrate':{'everywhere':1,'the':1,'through':1},'spur':{'to':2},'burned':{'up':1},'ornithoscatoides':{'decipiens':1},'sweat':{'and':1},'prodigally':{'using':1},'belts':{'which':1},'monsters':{'1892':1},'insectivorous':{'and':1,'plant':1,'bats':1},'quaternary':{'at':1},'waterfalls':{'of':1},'sparrows':{'and':1,'to':1},'generations':{'reached':1,'afterwards--and':1,'yet':1,'to':1},'afterwards--and':{'suffering':1},'unison':{'with':1},'available':{'on':1,'.':1,'with':1,'for':1,'space':1},'ebb':{'of':1},'acquired':{'a':2,'an':1,'its':1,'dexterities':1},'monkeys--in':{'dogs':1},'distantly':{'related':1},'cross-fertilisation.':{'sec':1},'violet':{'then':1,'end':1,'light':1,'colour':1,'.':1,'will':1,'at':1,'the':1},'barrels':{'of':1},'this.':{'the':1},'responses':{';':1,'.':2},'closer':{'examination':1},'closes':{'with':1},'shore-frequenting':{'seals':1},'mentioned':{'that':1,'already.':1,'indicates':1,'part':1,'in':1,'the':1,'is':1},'monstrous':{'tortoise':1},'worship':{'and':1},'genius':{'a':1,'of':1,'.':1,'it':1,'than':1},'converted':{'almost':1,'into':1,'directly':1},'identification':{'number':1,'for':1},'colour-associations':{'.':1},'hebrides':{'southwards':1},'crude':{'flint':1},'limit':{'these':1,'to':1,'the':1,'.':1},'variability':{'on':1,'is':1,'.':1,'to':1,'along':1,';':1},'andromeda':{'messier':2},'ability':{'to':2,'.':1},'opening':{'and':1,'fir':1,'up':1,'to':1,'new':1,'the':2,'more':1},'joy':{'and':1,'.':1},'agencies':{'operating':1,'for':1,'.':1},'podargus':{'a':1,'190':1},'apes':{'and':6,'both':1,'from':1,'show':1,'though':1,'but':1,'.':3,'also':1,'as':2,'diverged':1,'can':1,'165':1,'monkeys':1},'hypothesis':{'that':1,'may':1,'.':3,'therefore':1,'which':1,'one':1,'apart':1},'probing':{'and':1,'its':1},'rhythm.':{'illustration':1},'air-bubble--air':{'entangled':1},'swift':{'stroke':1,'hardly':1,'runners':1,'stream':1},'commands':{'our':1,'such':1},'cliff.':{'energy':1},'acknowledge':{'as':2},'mentone':{'on':1},'grouse':{'and':2,'disease':2,'or':1},'april':{'1922':4},'grain':{'of':8,'contains':1,'planted':1,'.':1},'utilising':{'dry':1},'retrograde':{'direction':1},'canopy':{'over':1},'germ-cells':{'and':1,'do':1,'that':1,'perhaps':1,'is':1,'but':1,'are':1,'have':1,'has':1,'into':1},'mutating':{'mood.':1},'wall':{'of':7,'shown':1,'.':1},'wonder':{'of':2,'then':1},'walk':{'with':2},'walt':{'whitman':1},'subscribe':{'to':1},'heredity':{'is':1,'which':1},'stars--to':{'star':1},'animalcule':{'often':1,'is':1,'which':1,'the':1,'has':1,'or':1},'table':{'suggests':1,'colliding':1,'page':1,'.':2},'investigator':{'noted':1},'mesozoic':{'and':1,'is':1,'era':6,'three':1,'times':1},'provinces':{'and':1},'i.e.':{'eating':1},'cavities':{'in':1},'hunters':{'and':2,'fowlers':1},'trademark':{'and':2,'license':1,'copyright':1,'but':1,'.':3,'as':1,'owner':2},'window':{'.':1},'responds':{'to':1},'ant-eaters':{'lay':1},'reindeer':{'and':2,'wild':1,'men':1,'man':1},'cry':{'uttered':1,'for':1,'.':2},'735':{'years.':1},'bewildering':{'profusion':1},'twenty-nine':{'days':1},'conductors.':{'so':1},'remedies':{'for':1},'1.e.1.':{'1.e.7':1},'painted':{'on':1,'bison':1,'in':2},'sufficient':{'for':1,'supply':1,'of':1,'here':1,'to':6,'heat':1,'sounds':1,'quantity':1,'cause':1,'theoretical':1,'inducement':1,'if':1},'thrusting':{'their':2},'sub-aquatic':{'environment':1},'ensuring':{'that':1},'visible.':{'illustration':1},'present':{'features':1,'point':1,'is':4,'rate':1,'in':6,'our':1,'living':1,'unavailable':1,'when':1,'two':1,'.':2,'day.':1,'state':1,'form':2,'though':1,'after':1,'but':1,'standard':1,'purpose':1,'they':1,'trying':2,'with':1,'day':2,'stage':1,'whereby':1,'value':1,'time':1,'the':4},'inconspicuous':{'24':1,'among':2,'when':1,'against':2,'.':2,'as':1,'amidst':1,'in':2,'by':1},'interstices':{'they':1},'abandoned':{'by':1,'.':2},'unlike':{'the':2},'agreement.':{'illustration':1},'vanilla':{'ascii':2},'will':{'emerge':1,'learn':1,'deal':1,'supply':1,'almost':1,'cover':1,'pass':2,'replace':1,'say':1,'have':1,'measure':1,'radiate':1,'tend':3,'scent':1,'any':1,'select':1,'make':2,'again':1,'gradually':1,'detect':4,'proceed':1,'to':2,'prevail':1,'support':1,'show':1,'deal.':1,'.':1,'start':1,'finally':1,'suffocate':1,'take':2,'then':1,'hatch':1,'surprise':1,'confine':1,'cause':1,'tell':1,'dispute':1,'evolve':1,'notice':1,'enable':1,'return':1,'engender':1,'gnaw':1,'admit':1,'express':1,'stop':1,'rush':1,'bear':1,'intercept':1,'sink':1,'not':9,'last':1,'attract':1,'come':3,'throw':1,'summon':1,'knock':1,'do':3,'rotate':1,'give':2,'consist':1,'be':53,'science':1,'colour':1,'no':1,'liquefy':1,'spontaneously':1,'appear':1,'remain':2,'continue':2,'die':1,'become':1,'the':2,'tap.':1,'explain':1,'travel':1},'inequilibrium':{'results':1},'vastly':{'hotter':1,'greater':1,'more':3},'wild':{'plants':1,'horses':1,'life':1,'animals':1,'rock-dove':1,'nature':2,'mammals':1,'peoples':1,'dog':2,'.':1,'species':2,'wheat':1,'rabbit':1,'cattle':1,'boar':1,'life.':1,'fauna':1,'he':1,'or':2,'cabbage':1,'sheep':1},'2007':{'ebook':1},'tadpoles':{'of':1,'while':1,'are':1,'.':1},'layer':{'of':4,'is':1,'overpowering':1,'or':2,'.':2},'envelope.':{'thus':1},'zostera':{'form':1},'apprehend':{'the':1},'filaments':{'which':1,'in':1},'non':{'profit':1},'encouragement':{'to':1},'meteoritic':{'contributions':1},'life-forms':{'would':1},'perhaps':{'among':1,'all':1,'because':5,'stray':1,'is':2,'it':5,'an':3,'discovered':1,'are':1,'in':1,'25':4,'from':2,'to':1,'twenty':1,'sum':1,'there':2,'when':1,'next':1,'also':2,'too':1,'belong':1,'500':1,'we':1,'increased':1,'that':2,'300':1,'eight':1,'they':3,'100':2,'one':1,'beginning':1,'why':1,'a':6,'thirty':1,'this':2,'professor':1,'wild':1,'the':9,'came':1},'trailing':{'on':1},'cromagnard':{'representative':2,'in':1},'forceps':{'held':1,'the':1,'so':1,'.':1},'unite':{'with':1},'electro-magnetic':{'energy':1,'theory':1,'waves':2},'orionis':{'showing':1,'37':1},'unity':{'and':1,'of':1,'.':2,'at':1,';':1,'or':1},'exuberance':{'of':3},'geographical':{'barriers':1,'distribution':1},'largest':{'and':1,'in':1,'of':4,'flying':1,'refracting':1,'reflecting':1,'waves':1,'telescopes':2},'units':{'of':1,'the':1,'were':2,'or':1,'are':1},'gets':{'up':2,'worn':1,'will':1,'through':1,'the':1,'beyond':1,'its':2},'hammering':{'at':2},'firmament':{'is':1},'spirited':{'pictures':1},'elbows':{'.':1},'slave':{'of':1},'conceived':{'as':1},'overcrowded':{'or':1},'student':{'what':1,'but':1,'in':1},'vapour':{'layers':1,'shoot':1,'of':1,'to':1,'at':1,'out':1},'laborious':{'tasks':1},'collar':{'over':1,'round':1},'warming':{'the':1},'reached.':{'the':1},'banded':{'krait':3},'unpacked':{'the':1},'star-book':{'.':1},'electrified.':{'in':1},'spectator':{'after':1},'sound-waves':{'and':1},'undertaken':{'by':1},'realised':{'the':1,'in':2,'.':1},'tacchini':{'of':1},'heavily':{'armoured':1},'only.':{'3':1},'wren':{'.':1},'multitude':{'of':6},'obtain':{'a':3,'permission':2},'replenish':{'the':1},'batteries':{'of':1,'getting':1,'.':1},'fishing':{'farming':1},'rocked':{'from':1},'inturned':{'margin':1},'cuckoo-spit':{'147':1,'the':2,'on':1},'contractile':{'vacuole':1},'disturbance':{'around':2,'ceases':1,'being':1,'is':1,'which':1,'in':1,'such':1},'host.':{'illustration':1},'supply':{'will':1,'of':6,'the':4,'and':1,'our':1},'smith':{'woodward':1},'pitcher-plant':{'catching':1},'discuss':{'at':1},'book':{'and':1,'on':1,'of':2,'there':2,'it':1,'which':1,'the':1},'galloping':{'boar':2},'usage':{'spread':1,'had':1},'enacted':{'on':1},'unprecedented':{'development':1},'civilisation--coal':{'.':1},'knob':{'on':1},'wont':{'to':1},'diamond-like':{'eyes':1},'branch':{'and':4,'we':1,'after':1,'from':1,'of':3,'is':1,'within':1,'to':2,'at':1,'now':1,'or':1,'out':1},'community':{'at':1,'in':1},'facial':{'characteristics':1,'expressions':1,'expression':2},'denser':{'and':1,'along':1,'masses':1,'than':1},'press':{'professor':1,'copyright':1,'the':2,'agency.':7},'originative':{'stock':1},'feral':{'216':1,'it':1},'safest':{'coloration':1},'perpetual':{'unremitting':1},'loses':{'a':1,'weight.':1,'it':1,'least':1,'its':1},'colonising':{'of':1,'the':1},'vortex':{'may':1,'phenomena':1,'in':1},'james':{'ritchie':1,'s':8,'matter':1},'puzzle-boxes':{'and':2,'with':1},'smoothness':{'of':1},'herons':{'and':1,'storks':1},'exceed':{'20':1},'because':{'they':8,'mind':1,'it':7,'in':1,'sounds':1,'its':3,'to':1,'deeply':1,'there':1,'birds':1,'their':1,'many':2,'we':1,'some':2,'heat':2,'although':1,'he':2,'this':1,'light':1,'obviously':1,'of':8,'the':12},'ages--evolution':{'of':1},'vortices':{'or':1},'elevators':{'in':1},'scottish':{'history':1},'mosquitoes':{'which':2},'eventfulness':{'of':1},'flint-shelled':{'radiolarians':1},'116':{'a':1,'after':1},'113':{'the':1},'faraday':{'he':1},'119':{'sea-horse':1,'photo':1,'an':1},'118':{'greenland':1,'minute':1},'blood-vessel':{'nerve':1,'for':1},'gill-slits':{'of':1,'are':1},'lamprey--a':{'long':1},'leaf':{'and':1,'touches':1,'towards':1,'seventy-five':1,'is':1,'six':1,'when':1,'.':4,'near':1,'without':1,'in':2,'close':1,';':1,'before':1,'must':2},'lead':{'on':1,'has':2,'pencil':1,'these':1,'is':1,'us':3,'one':1,'.':3},'promotion':{'and':1},'high.':{'the':1},'mines':{'of':1},'philosopher':{'and':1,'professor':1},'instantaneous':{'abandonment':1},'arteries':{'of':1},'leap':{'and':2,'over':1,'due':1,'out':1},'glacial':{'climate':1,'time':1,'.':1},'repeopling':{'from':1},'trout':{'go':1,'we':1,'in':1,'or':1,'eluding':1},'locate':{'a':1},'obey':{'this':2,'an':1},'thoroughfare':{'for':1},'astounding':{'fact':2},'analysed':{'tons':1,'.':1,'in':1},'conveyed':{'by':1},'raise':{'a':1,'their':1,'the':2,'it':1},'rare':{'birds':1},'carried':{'to':2,'about':2,'by':3,'for':1,'back':1},'extension':{'of':2,'have':1},'unsurpassable':{';':1},'column':{'of':1},'universe':{'and':3,'transmitting':1,'is':13,'it':1,'an':1,'as':3,'sec':2,'are':1,'in':1,'even':1,'said':1,'opened':1,'remains':1,'tiny':1,'.':11,'how':1,'which':1,'has':1,'was':2,'comparable':1,'may':2,'why':1,'243':1,'than':1,'a':1,'of':1,'can':1,'were':2,'the':1,'or':1},'biscuit':{'from':1,'.':1},'eclipse.':{'this':1},'dependence':{'.':1},'urged':{'that':1},'sea-horse':{'is':1,'puts':2,'in':2},'carries':{'them':2,'many':1,'about':1,'in':1,'the':2,'its':1},'carrier':{'of':1,'pigeons':1,'pigeon':3},'places':{'on':2,'them':1,'for':1,'e.g':1,'of':2,'vary':1,'to':1,'have':1,'the':3,'where':1,'its':1},'wheats':{'.':1},'devouring':{'their':1,'potatoes':1},'warranty':{'or':1,'disclaimer':1},'splash':{'of':1},'own':{'and':3,'beautiful':1,'weight':2,'when':1,'mind':1,'invention':1,'in':1,'lambs':1,'.':7,'reward.':1,'before':1,'dispersive':1,'little':1,'sake':1,'distinctive':2,'definite':1,'system':2,'moon':1,'internal':1,'white':1,'was':1,'day':1,'then':1,'race':1,'that':1,'but':1,'atoms':1,'genealogical':1,'solar':2,';':1,'he':1,'kind':1,'enemies.':1,'planet':1,'circle':1},'polished':{'stones':1,'stone':2},'sugary':{'sap':2},'owe':{'to':3,'them':1,'it':1,'our':1},'habituations':{'and':1},'wearisome':{'reiteration':1},'promise':{'myriads':1,'that':1,'of':2,'is':1,'are':1,'considerable':1},'brush':{'and':1},'registration':{'of':3,';':1},'cell--a':{'fertilised':1},'to-morrow':{'might':1},'prompted':{'by':1,'reliance':1},'linnaeus':{'spoke':1},'van':{'was':1},'miles.':{'these':1},'transfer':{'energy':1,'her':1},'paperwork':{'and':1},'spiral':{'nebulae.':1,'facing':1,'nebulae':8,'nebula':11,'edge-on':1,'arms':2,'having':1,'arms.':1,'to':1,'than':1,'structure':1},'continental':{'islands':1,'masses':1,'elevation':1,'fish':1},'uniting':{'into':1,'with':1},'4.--the':{'great':1},'breeding':{'season':2,'only':1,'calls':1,'time':1},'phosphorus':{'is':1},'mouth.':{'everyone':1,'sec':1,'illustration':4},'limulus':{'may':1},'fundy':{'it':1},'dasypeltis':{'gets':1},'u.s.a.':{'this':1},'incursions':{'of':1},'volume':{'and':1},'larger':{'and':3,'animals':2,'particle':1,'variety':1,'rather':1,'of':1,'area':1,'parasite':1,'than':5,'supply':1,'in':1,'fifteen-spined':1,'.':1,'continent':1,'species':1},'counterparts':{'in':3},'millipedes':{'and':1},'shark-like':{'and':1},'tactics':{'of':1,'are':1},'instructive':{'case':1,'to':2,'because':1,'.':1},'whether':{'all':2,'gravitation':1,'hunting':1,'that':1,'these':1,'it':5,'bird':1,'we':1,'imitation':1,'they':1,'particular':1,'the':6,'astronomy':1,'similar':1,'or':1},'meeting':{'of':1,'the':1,'that':1},'fossilized':{'forests.':1},'moorhen':{'saw':1,'has':1,'dived':1,'in':1},'record':{'of':1,'is':1,'answers':1,'.':2,'how':1,'the':1,'tells':1},'below':{'and':1,'a':1,'this':1,'freezing-point.':1,'.':3,'their':1,'are':1,'freezing-point':1,'the':11},'graphite':{'similarly':1},'demonstrate':{'a':1},'percival':{'lowell':1,'lowell.':1},'arno':{'von':1},'stirring':{'times':1},'unfolding':{'of':1},'cynodonts':{'were':1},'roentgen.':{'discovery':1},'change-producing':{'factors':1},'--1':{'.':1},'pigment-cells':{'chromatophores':1,'change':1},'1781.9':{'84.02':1},'globules':{'of':1},'kind.':{'sec':1},'soft-shell':{'tortoise':1},'domesticated':{'sheep':1,'animals':7,'dog':2,'breeds':1,'type':1,'creature':1},'counteract':{'poisons':1},'limb':{';':1,'or':1},'mutual':{'benefit':1,'gravitation':1,'dependence':1,'assurance':1},'1898.':{'in':1},'incredible':{'refinement':1,'speed':1},'portion':{'consists':1,'of':5,'would':1},'other':{'all':1,'interpretation':1,'words':11,'four':1,'experiments':1,'facts':1,'birds':1,'causes':1,'chemical':1,'apes':2,'group':1,'shifts':1,'physiological':1,'interesting':1,'parts':1,'marsh':1,'main':1,'associations':1,'format':1,'inter-relations':1,'marked':1,'they':1,'new':2,'radio-active':1,'sensational':1,'worlds':1,'backboned':1,'sedimentary':1,'side':6,'investigators':2,'telescope.':1,'thinkers':1,'growths':1,'some':1,'mollusc':1,'sporadic':1,'bacteria':1,'creatures':3,'pigments':1,'organisms':1,'factors':1,'ways':3,'pictures':1,'heavenly':1,'got':1,';':3,'warranties':1,'body':1,'ends':1,'toes':1,'terms':1,'men':2,'atoms':3,'stellar':1,'objects':1,'by':1,'extreme':1,'digits':1,'great':1,'substance':1,'of':1,'haunts':1,'times':3,'thing':1,'s':1,'light--we':1,'host.':1,'useful':1,'features':1,'reasons':1,'intellectual':1,'highly':1,'fishes':1,'seashore':1,'protozoa':1,'sounds':1,'throughout':1,'persons.':1,'trifles':1,'sea-snail':2,'copies':1,'.':14,'way':4,'reptiles':1,'specimens':1,'direction':1,'senses':2,'spiral':1,'form':2,'substances':2,'mammals':7,'immediate':1,'known':1,'branches':1,'cases':9,'than':1,'circumstances':1,'animals':3,'liquid':1,'places':1,'work':2,'theories':1,'project':1,'wild':1,'stages':1,'colour':1,'and':1,'meant':1,'seven':1,'change-producing':1,'is':3,'experiments--indications':1,'it':1,'metals':2,'pieces':1,'medium':1,'universes.':1,'planets':3,'universes':1,'domesticated':1,'orders':1,'cotton':1,'end':2,'in':1,'things':1,'ideas':1,'species':1,'astronomers':2,'instance':1,'became':1,'animal':1,'party':1,'enemies':1,'intelligent':1,'creature':1,'kinds':2,'hand':9,'glimpses':1,'blood':1,'never':1,'authorities':1,'such':1,'acquisitions':1,'amoeboid':1,'modes':1,'consequences':1,'age':1,'obstacles':1,'lines':1,'shafts.':1,'fundamental':2,'mechanical':1,'the':1,'order':1,'bodies':2},'sunrise':{'the':1},'boon':{'to':1},'conclusion':{'we':1,'that':5,'is':2,'what':1,'to':1,'in':1},'supersaturated':{'vapour':1},'kinds':{'forms':1,'of':34,'neoceratodus':1,'with':1,'are':1},'june':{'1922':4},'inherently':{'liable':1},'4.29':{'vega':1},'--i':{'.':1},'supple':{'yet':1},'--a':{'sort':1,'quite':1},'opened':{'a':1,'cones':1,'up':1,'.':1,'with':1,'its':1},'association--why':{'is':1},'ranks':{'of':2},'half-second':{'that':1},'volumes':{'of':1,'g':1},'understand':{'them':1,'that':1,'very':1,'what':1,'why':2,'in':2,'not':1,'the':4,'now':1,'agree':1},'function.':{'interesting':1},'expands':{'as':1},'sun--the':{'surface':1,'planets':1},'sci.':{'volvox':1,'trypanosoma':1}} FIRST_NAMES = "James,John,Robert,Michael,William,David,Richard,Charles,Joseph,Thomas,Christopher,Daniel,Paul,Mark,Donald,George,Kenneth,Steven,Edward,Brian,Ronald,Anthony,Kevin,Jason,Matthew,Gary,Timothy,Jose,Larry,Jeffrey,Frank,Scott,Eric,Stephen,Andrew,Raymond,Gregory,Joshua,Jerry,Dennis,Walter,Patrick,Peter,Harold,Douglas,Henry,Carl,Arthur,Ryan,Roger,Joe,Juan,Jack,Albert,Jonathan,Justin,Terry,Gerald,Keith,Samuel,Willie,Ralph,Lawrence,Nicholas,Roy,Benjamin,Bruce,Brandon,Adam,Harry,Fred,Wayne,Billy,Steve,Louis,Jeremy,Aaron,Randy,Howard,Eugene,Carlos,Russell,Bobby,Victor,Martin,Ernest,Phillip,Todd,Jesse,Craig,Alan,Shawn,Clarence,Sean,Philip,Chris,Johnny,Earl,Jimmy,Antonio,Danny,Bryan,Tony,Luis,Mike,Stanley,Leonard,Nathan,Dale,Manuel,Rodney,Curtis,Norman,Allen,Marvin,Vincent,Glenn,Jeffery,Travis,Jeff,Chad,Jacob,Lee,Melvin,Alfred,Kyle,Francis,Bradley,Jesus,Herbert,Frederick,Ray,Joel,Edwin,Don,Eddie,Ricky,Troy,Randall,Barry,Alexander,Bernard,Mario,Leroy,Francisco,Marcus,Micheal,Theodore,Clifford,Miguel,Oscar,Jay,Jim,Tom,Calvin,Alex,Jon,Ronnie,Bill,Lloyd,Tommy,Leon,Derek,Warren,Darrell,Jerome,Floyd,Leo,Alvin,Tim,Wesley,Gordon,Dean,Greg,Jorge,Dustin,Pedro,Derrick,Dan,Lewis,Zachary,Corey,Herman,Maurice,Vernon,Roberto,Clyde,Glen,Hector,Shane,Ricardo,Sam,Rick,Lester,Brent,Ramon,Charlie,Tyler,Gilbert,Gene,Marc,Reginald,Ruben,Brett,Angel,Nathaniel,Rafael,Leslie,Edgar,Milton,Raul,Ben,Chester,Cecil,Duane,Franklin,Andre,Elmer,Brad,Gabriel,Ron,Mitchell,Roland,Arnold,Harvey,Jared,Adrian,Karl,Cory,Claude,Erik,Darryl,Jamie,Neil,Jessie,Christian,Javier,Fernando,Clinton,Ted,Mathew,Tyrone,Darren,Lonnie,Lance,Cody,Julio,Kelly,Kurt,Allan,Nelson,Guy,Clayton,Hugh,Max,Dwayne,Dwight,Armando,Felix,Jimmie,Everett,Jordan,Ian,Wallace,Ken,Bob,Jaime,Casey,Alfredo,Alberto,Dave,Ivan,Johnnie,Sidney,Byron,Julian,Isaac,Morris,Clifton,Willard,Daryl,Ross,Virgil,Andy,Marshall,Salvador,Perry,Kirk,Sergio,Marion,Tracy,Seth,Kent,Terrance,Rene,Eduardo,Terrence,Enrique,Freddie,Wade,Austin,Stuart,Fredrick,Arturo,Alejandro,Jackie,Joey,Nick,Luther,Wendell,Jeremiah,Evan,Julius,Dana,Donnie,Otis,Shannon,Trevor,Oliver,Luke,Homer,Gerard,Doug,Kenny,Hubert,Angelo,Shaun,Lyle,Matt,Lynn,Alfonso,Orlando,Rex,Carlton,Ernesto,Cameron,Neal,Pablo,Lorenzo,Omar,Wilbur,Blake,Grant,Horace,Roderick,Kerry,Abraham,Willis,Rickey,Jean,Ira,Andres,Cesar,Johnathan,Malcolm,Rudolph,Damon,Kelvin,Rudy,Preston,Alton,Archie,Marco,Wm,Pete,Randolph,Garry,Geoffrey,Jonathon,Felipe,Bennie,Gerardo,Ed,Dominic,Robin,Loren,Delbert,Colin,Guillermo,Earnest,Lucas,Benny,Noel,Spencer,Rodolfo,Myron,Edmund,Garrett,Salvatore,Cedric,Lowell,Gregg,Sherman,Wilson,Devin,Sylvester,Kim,Roosevelt,Israel,Jermaine,Forrest,Wilbert,Leland,Simon,Guadalupe,Clark,Irving,Carroll,Bryant,Owen,Rufus,Woodrow,Sammy,Kristopher,Mack,Levi,Marcos,Gustavo,Jake,Lionel,Marty,Taylor,Ellis,Dallas,Gilberto,Clint,Nicolas,Laurence,Ismael,Orville,Drew,Jody,Ervin,Dewey,Al,Wilfred,Josh,Hugo,Ignacio,Caleb,Tomas,Sheldon,Erick,Frankie,Stewart,Doyle,Darrel,Rogelio,Terence,Santiago,Alonzo,Elias,Bert,Elbert,Ramiro,Conrad,Pat,Noah,Grady,Phil,Cornelius,Lamar,Rolando,Clay,Percy,Dexter,Bradford,Merle,Darin,Amos,Terrell,Moses,Irvin,Saul,Roman,Darnell,Randal,Tommie,Timmy,Darrin,Winston,Brendan,Toby,Van,Abel,Dominick,Boyd,Courtney,Jan,Emilio,Elijah,Cary,Domingo,Santos,Aubrey,Emmett,Marlon,Emanuel,Jerald,Edmond,Emil,Dewayne,Will,Otto,Teddy,Reynaldo,Bret,Morgan,Jess,Trent,Humberto,Emmanuel,Stephan,Louie,Vicente,Lamont,Stacy,Garland,Miles,Micah,Efrain,Billie,Logan,Heath,Rodger,Harley,Demetrius,Ethan,Eldon,Rocky,Pierre,Junior,Freddy,Eli,Bryce,Antoine,Robbie,Kendall,Royce,Sterling,Mickey,Chase,Grover,Elton,Cleveland,Dylan,Chuck,Damian,Reuben,Stan,August,Leonardo,Jasper,Russel,Erwin,Benito,Hans,Monte,Blaine,Ernie,Curt,Quentin,Agustin,Murray,Jamal,Devon,Adolfo,Harrison,Tyson,Burton,Brady,Elliott,Wilfredo,Bart,Jarrod,Vance,Denis,Damien,Joaquin,Harlan,Desmond,Elliot,Darwin,Ashley,Gregorio,Buddy,Xavier,Kermit,Roscoe,Esteban,Anton,Solomon,Scotty,Norbert,Elvin,Williams,Nolan,Carey,Rod,Quinton,Hal,Brain,Rob,Elwood,Kendrick,Darius,Moises,Son,Marlin,Fidel,Thaddeus,Cliff,Marcel,Ali,Jackson,Raphael,Bryon,Armand,Alvaro,Jeffry,Dane,Joesph,Thurman,Ned,Sammie,Rusty,Michel,Monty,Rory,Fabian,Reggie,Mason,Graham,Kris,Isaiah,Vaughn,Gus,Avery,Loyd,Diego,Alexis,Adolph,Norris,Millard,Rocco,Gonzalo,Derick,Rodrigo,Gerry,Stacey,Carmen,Wiley,Rigoberto,Alphonso,Ty,Shelby,Rickie,Noe,Vern,Bobbie,Reed,Jefferson,Elvis,Bernardo,Mauricio,Hiram,Donovan,Basil,Riley,Ollie,Nickolas,Maynard,Scot,Vince,Quincy,Eddy,Sebastian,Federico,Ulysses,Heriberto,Donnell,Cole,Denny,Davis,Gavin,Emery,Ward,Romeo,Jayson,Dion,Dante,Clement,Coy,Odell,Maxwell,Jarvis,Bruno,Issac,Mary,Dudley,Brock,Sanford,Colby,Carmelo,Barney,Nestor,Hollis,Stefan,Donny,Art,Linwood,Beau,Weldon,Galen,Isidro,Truman,Delmar,Johnathon,Silas,Frederic,Dick,Kirby,Irwin,Cruz,Merlin,Merrill,Charley,Marcelino,Lane,Harris,Cleo,Carlo,Trenton,Kurtis,Hunter,Aurelio,Winfred,Vito,Collin,Denver,Carter,Leonel,Emory,Pasquale,Mohammad,Mariano,Danial,Blair,Landon,Dirk,Branden,Adan,Numbers,Clair,Buford,German,Bernie,Wilmer,Joan,Emerson,Zachery,Fletcher,Jacques,Errol,Dalton,Monroe,Josue,Dominique,Edwardo,Booker,Wilford,Sonny,Shelton,Carson,Theron,Raymundo,Daren,Tristan,Houston,Robby,Lincoln,Jame,Genaro,Gale,Bennett,Octavio,Cornell,Laverne,Hung,Arron,Antony,Herschel,Alva,Giovanni,Garth,Cyrus,Cyril,Ronny,Stevie,Lon,Freeman,Erin,Duncan,Kennith,Carmine,Augustine,Young,Erich,Chadwick,Wilburn,Russ,Reid,Myles,Anderson,Morton,Jonas,Forest,Mitchel,Mervin,Zane,Rich,Jamel,Lazaro,Alphonse,Randell,Major,Johnie,Jarrett,Brooks,Ariel,Abdul,Dusty,Luciano,Lindsey,Tracey,Seymour,Scottie,Eugenio,Mohammed,Sandy,Valentin,Chance,Arnulfo,Lucien,Ferdinand,Thad,Ezra,Sydney,Aldo,Rubin,Royal,Mitch,Earle,Abe,Wyatt,Marquis,Lanny,Kareem,Jamar,Boris,Isiah,Emile,Elmo,Aron,Leopoldo,Everette,Josef,Gail,Eloy,Dorian,Rodrick,Reinaldo,Lucio,Jerrod,Weston,Hershel,Barton,Parker,Lemuel,Lavern,Burt,Jules,Gil,Eliseo,Ahmad,Nigel,Efren,Antwan,Alden,Margarito,Coleman,Refugio,Dino,Osvaldo,Les,Deandre,Normand,Kieth,Ivory,Andrea,Trey,Norberto,Napoleon,Jerold,Fritz,Rosendo,Milford,Sang,Deon,Christoper,Alfonzo,Lyman,Josiah,Brant,Wilton,Rico,Jamaal,Dewitt,Carol,Brenton,Yong,Olin,Foster,Faustino,Claudio,Judson,Gino,Edgardo,Berry,Alec,Tanner,Jarred,Donn,Trinidad,Tad,Shirley,Prince,Porfirio,Odis,Maria,Lenard,Chauncey,Chang,Tod,Mel,Marcelo,Kory,Augustus,Keven,Hilario,Bud,Sal,Rosario,Orval,Mauro,Dannie,Zachariah,Olen,Anibal,Milo,Jed,Frances,Thanh,Dillon,Amado,Newton,Connie,Lenny,Tory,Richie,Lupe,Horacio,Brice,Mohamed,Delmer,Dario,Reyes,Dee,Mac,Jonah,Jerrold,Robt,Hank,Sung,Rupert,Rolland,Kenton,Damion,Chi,Antone,Waldo,Fredric,Bradly,Quinn,Kip,Burl,Walker,Tyree,Jefferey,Ahmed,Willy,Stanford,Oren,Noble,Moshe,Mikel,Enoch,Brendon,Quintin,Jamison,Florencio,Darrick,Tobias,Minh,Hassan,Giuseppe,Demarcus,Cletus,Tyrell,Lyndon,Keenan,Werner,Theo,Geraldo,Lou,Columbus,Chet,Bertram,Markus,Huey,Hilton,Dwain,Donte,Tyron,Omer,Isaias,Hipolito,Fermin,Chung,Adalberto,Valentine,Jamey,Bo,Barrett,Whitney,Teodoro,Mckinley,Maximo,Garfield,Sol,Raleigh,Lawerence,Abram,Rashad,King,Emmitt,Daron,Chong,Samual,Paris,Otha,Miquel,Lacy,Eusebio,Dong,Domenic,Darron,Buster,Antonia,Wilber,Renato,Jc,Hoyt,Haywood,Ezekiel,Chas,Florentino,Elroy,Clemente,Arden,Neville,Kelley,Edison,Deshawn,Carrol,Shayne,Nathanial,Jordon,Danilo,Claud,Val,Sherwood,Raymon,Rayford,Cristobal,Ambrose,Titus,Hyman,Felton,Ezequiel,Erasmo,Stanton,Lonny,Len,Ike,Milan,Lino,Jarod,Herb,Andreas,Walton,Rhett,Palmer,Jude,Douglass,Cordell,Oswaldo,Ellsworth,Virgilio,Toney,Nathanael,Del,Britt,Benedict,Mose,Hong,Leigh,Johnson,Isreal,Gayle,Garret,Fausto,Asa,Arlen,Zack,Warner,Modesto,Francesco,Manual,Jae,Gaylord,Gaston,Filiberto,Deangelo,Michale,Granville,Wes,Malik,Zackary,Tuan,Nicky,Eldridge,Cristopher,Cortez,Antione,Malcom,Long,Korey,Jospeh,Colton,Waylon,Von,Hosea,Shad,Santo,Rudolf,Rolf,Rey,Renaldo,Marcellus,Lucius,Lesley,Kristofer,Boyce,Benton,Man,Kasey,Jewell,Hayden,Harland,Arnoldo,Rueben,Leandro,Kraig,Jerrell,Jeromy,Hobert,Cedrick,Arlie,Winford,Wally,Patricia,Luigi,Keneth,Jacinto,Graig,Franklyn,Edmundo,Sid,Porter,Leif,Lauren,Jeramy,Elisha,Buck,Willian,Vincenzo,Shon,Michal,Lynwood,Lindsay,Jewel,Jere,Hai,Elden,Dorsey,Darell,Broderick,Alonso,Mary,Patricia,Linda,Barbara,Elizabeth,Jennifer,Maria,Susan,Margaret,Dorothy,Lisa,Nancy,Karen,Betty,Helen,Sandra,Donna,Carol,Ruth,Sharon,Michelle,Laura,Sarah,Kimberly,Deborah,Jessica,Shirley,Cynthia,Angela,Melissa,Brenda,Amy,Anna,Rebecca,Virginia,Kathleen,Pamela,Martha,Debra,Amanda,Stephanie,Carolyn,Christine,Marie,Janet,Catherine,Frances,Ann,Joyce,Diane,Alice,Julie,Heather,Teresa,Doris,Gloria,Evelyn,Jean,Cheryl,Mildred,Katherine,Joan,Ashley,Judith,Rose,Janice,Kelly,Nicole,Judy,Christina,Kathy,Theresa,Beverly,Denise,Tammy,Irene,Jane,Lori,Rachel,Marilyn,Andrea,Kathryn,Louise,Sara,Anne,Jacqueline,Wanda,Bonnie,Julia,Ruby,Lois,Tina,Phyllis,Norma,Paula,Diana,Annie,Lillian,Emily,Robin,Peggy,Crystal,Gladys,Rita,Dawn,Connie,Florence,Tracy,Edna,Tiffany,Carmen,Rosa,Cindy,Grace,Wendy,Victoria,Edith,Kim,Sherry,Sylvia,Josephine,Thelma,Shannon,Sheila,Ethel,Ellen,Elaine,Marjorie,Carrie,Charlotte,Monica,Esther,Pauline,Emma,Juanita,Anita,Rhonda,Hazel,Amber,Eva,Debbie,April,Leslie,Clara,Lucille,Jamie,Joanne,Eleanor,Valerie,Danielle,Megan,Alicia,Suzanne,Michele,Gail,Bertha,Darlene,Veronica,Jill,Erin,Geraldine,Lauren,Cathy,Joann,Lorraine,Lynn,Sally,Regina,Erica,Beatrice,Dolores,Bernice,Audrey,Yvonne,Annette,June,Samantha,Marion,Dana,Stacy,Ana,Renee,Ida,Vivian,Roberta,Holly,Brittany,Melanie,Loretta,Yolanda,Jeanette,Laurie,Katie,Kristen,Vanessa,Alma,Sue,Elsie,Beth,Jeanne,Vicki,Carla,Tara,Rosemary,Eileen,Terri,Gertrude,Lucy,Tonya,Ella,Stacey,Wilma,Gina,Kristin,Jessie,Natalie,Agnes,Vera,Willie,Charlene,Bessie,Delores,Melinda,Pearl,Arlene,Maureen,Colleen,Allison,Tamara,Joy,Georgia,Constance,Lillie,Claudia,Jackie,Marcia,Tanya,Nellie,Minnie,Marlene,Heidi,Glenda,Lydia,Viola,Courtney,Marian,Stella,Caroline,Dora,Jo,Vickie,Mattie,Terry,Maxine,Irma,Mabel,Marsha,Myrtle,Lena,Christy,Deanna,Patsy,Hilda,Gwendolyn,Jennie,Nora,Margie,Nina,Cassandra,Leah,Penny,Kay,Priscilla,Naomi,Carole,Brandy,Olga,Billie,Dianne,Tracey,Leona,Jenny,Felicia,Sonia,Miriam,Velma,Becky,Bobbie,Violet,Kristina,Toni,Misty,Mae,Shelly,Daisy,Ramona,Sherri,Erika,Katrina,Claire,Lindsey,Lindsay,Geneva,Guadalupe,Belinda,Margarita,Sheryl,Cora,Faye,Ada,Natasha,Sabrina,Isabel,Marguerite,Hattie,Harriet,Molly,Cecilia,Kristi,Brandi,Blanche,Sandy,Rosie,Joanna,Iris,Eunice,Angie,Inez,Lynda,Madeline,Amelia,Alberta,Genevieve,Monique,Jodi,Janie,Maggie,Kayla,Sonya,Jan,Lee,Kristine,Candace,Fannie,Maryann,Opal,Alison,Yvette,Melody,Luz,Susie,Olivia,Flora,Shelley,Kristy,Mamie,Lula,Lola,Verna,Beulah,Antoinette,Candice,Juana,Jeannette,Pam,Kelli,Hannah,Whitney,Bridget,Karla,Celia,Latoya,Patty,Shelia,Gayle,Della,Vicky,Lynne,Sheri,Marianne,Kara,Jacquelyn,Erma,Blanca,Myra,Leticia,Pat,Krista,Roxanne,Angelica,Johnnie,Robyn,Francis,Adrienne,Rosalie,Alexandra,Brooke,Bethany,Sadie,Bernadette,Traci,Jody,Kendra,Jasmine,Nichole,Rachael,Chelsea,Mable,Ernestine,Muriel,Marcella,Elena,Krystal,Angelina,Nadine,Kari,Estelle,Dianna,Paulette,Lora,Mona,Doreen,Rosemarie,Angel,Desiree,Antonia,Hope,Ginger,Janis,Betsy,Christie,Freda,Mercedes,Meredith,Lynette,Teri,Cristina,Eula,Leigh,Meghan,Sophia,Eloise,Rochelle,Gretchen,Cecelia,Raquel,Henrietta,Alyssa,Jana,Kelley,Gwen,Kerry,Jenna,Tricia,Laverne,Olive,Alexis,Tasha,Silvia,Elvira,Casey,Delia,Sophie,Kate,Patti,Lorena,Kellie,Sonja,Lila,Lana,Darla,May,Mindy,Essie,Mandy,Lorene,Elsa,Josefina,Jeannie,Miranda,Dixie,Lucia,Marta,Faith,Lela,Johanna,Shari,Camille,Tami,Shawna,Elisa,Ebony,Melba,Ora,Nettie,Tabitha,Ollie,Jaime,Winifred,Kristie,Marina,Alisha,Aimee,Rena,Myrna,Marla,Tammie,Latasha,Bonita,Patrice,Ronda,Sherrie,Addie,Francine,Deloris,Stacie,Adriana,Cheri,Shelby,Abigail,Celeste,Jewel,Cara,Adele,Rebekah,Lucinda,Dorthy,Chris,Effie,Trina,Reba,Shawn,Sallie,Aurora,Lenora,Etta,Lottie,Kerri,Trisha,Nikki,Estella,Francisca,Josie,Tracie,Marissa,Karin,Brittney,Janelle,Lourdes,Laurel,Helene,Fern,Elva,Corinne,Kelsey,Ina,Bettie,Elisabeth,Aida,Caitlin,Ingrid,Iva,Eugenia,Christa,Goldie,Cassie,Maude,Jenifer,Therese,Frankie,Dena,Lorna,Janette,Latonya,Candy,Morgan,Consuelo,Tamika,Rosetta,Debora,Cherie,Polly,Dina,Jewell,Fay,Jillian,Dorothea,Nell,Trudy,Esperanza,Patrica,Kimberley,Shanna,Helena,Carolina,Cleo,Stefanie,Rosario,Ola,Janine,Mollie,Lupe,Alisa,Lou,Maribel,Susanne,Bette,Susana,Elise,Cecile,Isabelle,Lesley,Jocelyn,Paige,Joni,Rachelle,Leola,Daphne,Alta,Ester,Petra,Graciela,Imogene,Jolene,Keisha,Lacey,Glenna,Gabriela,Keri,Ursula,Lizzie,Kirsten,Shana,Adeline,Mayra,Jayne,Jaclyn,Gracie,Sondra,Carmela,Marisa,Rosalind,Charity,Tonia,Beatriz,Marisol,Clarice,Jeanine,Sheena,Angeline,Frieda,Lily,Robbie,Shauna,Millie,Claudette,Cathleen,Angelia,Gabrielle,Autumn,Katharine,Summer,Jodie,Staci,Lea,Christi,Jimmie,Justine,Elma,Luella,Margret,Dominique,Socorro,Rene,Martina,Margo,Mavis,Callie,Bobbi,Maritza,Lucile,Leanne,Jeannine,Deana,Aileen,Lorie,Ladonna,Willa,Manuela,Gale,Selma,Dolly,Sybil,Abby,Lara,Dale,Ivy,Dee,Winnie,Marcy,Luisa,Jeri,Magdalena,Ofelia,Meagan,Audra,Matilda,Leila,Cornelia,Bianca,Simone,Bettye,Randi,Virgie,Latisha,Barbra,Georgina,Eliza,Leann,Bridgette,Rhoda,Haley,Adela,Nola,Bernadine,Flossie,Ila,Greta,Ruthie,Nelda,Minerva,Lilly,Terrie,Letha,Hilary,Estela,Valarie,Brianna,Rosalyn,Earline,Catalina,Ava,Mia,Clarissa,Lidia,Corrine,Alexandria,Concepcion,Tia,Sharron,Rae,Dona,Ericka,Jami,Elnora,Chandra,Lenore,Neva,Marylou,Melisa,Tabatha,Serena,Avis,Allie,Sofia,Jeanie,Odessa,Nannie,Harriett,Loraine,Penelope,Milagros,Emilia,Benita,Allyson,Ashlee,Tania,Tommie,Esmeralda,Karina,Eve,Pearlie,Zelma,Malinda,Noreen,Tameka,Saundra,Hillary,Amie,Althea,Rosalinda,Jordan,Lilia,Alana,Gay,Clare,Alejandra,Elinor,Michael,Lorrie,Jerri,Darcy,Earnestine,Carmella,Taylor,Noemi,Marcie,Liza,Annabelle,Louisa,Earlene,Mallory,Carlene,Nita,Selena,Tanisha,Katy,Julianne,John,Lakisha,Edwina,Maricela,Margery,Kenya,Dollie,Roxie,Roslyn,Kathrine,Nanette,Charmaine,Lavonne,Ilene,Kris,Tammi,Suzette,Corine,Kaye,Jerry,Merle,Chrystal,Lina,Deanne,Lilian,Juliana,Aline,Luann,Kasey,Maryanne,Evangeline,Colette,Melva,Lawanda,Yesenia,Nadia,Madge,Kathie,Eddie,Ophelia,Valeria,Nona,Mitzi,Mari,Georgette,Claudine,Fran,Alissa,Roseann,Lakeisha,Susanna,Reva,Deidre,Chasity,Sheree,Carly,James,Elvia,Alyce,Deirdre,Gena,Briana,Araceli,Katelyn,Rosanne,Wendi,Tessa,Berta,Marva,Imelda,Marietta,Marci,Leonor,Arline,Sasha,Madelyn,Janna,Juliette,Deena,Aurelia,Josefa,Augusta,Liliana,Young,Christian,Lessie,Amalia,Savannah,Anastasia,Vilma,Natalia,Rosella,Lynnette,Corina,Alfreda,Leanna,Carey,Amparo,Coleen,Tamra,Aisha,Wilda,Karyn,Cherry,Queen,Maura,Mai,Evangelina,Rosanna,Hallie,Erna,Enid,Mariana,Lacy,Juliet,Jacklyn,Freida,Madeleine,Mara,Hester,Cathryn,Lelia,Casandra,Bridgett,Angelita,Jannie,Dionne,Annmarie,Katina,Beryl,Phoebe,Millicent,Katheryn,Diann,Carissa,Maryellen,Liz,Lauri,Helga,Gilda,Adrian,Rhea,Marquita,Hollie,Tisha,Tamera,Angelique,Francesca,Britney,Kaitlin,Lolita,Florine,Rowena,Reyna,Twila,Fanny,Janell,Ines,Concetta,Bertie,Alba,Brigitte,Alyson,Vonda,Pansy,Elba,Noelle,Letitia,Kitty,Deann,Brandie,Louella,Leta,Felecia,Sharlene,Lesa,Beverley,Robert,Isabella,Herminia,Terra,Celina,Tori,Octavia,Jade,Denice,Germaine,Sierra,Michell,Cortney,Nelly,Doretha,Sydney,Deidra,Monika,Lashonda,Judi,Chelsey,Antionette,Margot,Bobby,Adelaide,Nan,Leeann,Elisha,Dessie,Libby,Kathi,Gayla,Latanya,Mina,Mellisa,Kimberlee,Jasmin,Renae,Zelda,Elda,Ma,Justina,Gussie,Emilie,Camilla,Abbie,Rocio,Kaitlyn,Jesse,Edythe,Ashleigh,Selina,Lakesha,Geri,Allene,Pamala,Michaela,Dayna,Caryn,Rosalia,Sun,Jacquline,Rebeca,Marybeth,Krystle,Iola,Dottie,Bennie,Belle,Aubrey,Griselda,Ernestina,Elida,Adrianne,Demetria,Delma,Chong,Jaqueline,Destiny,Arleen,Virgina,Retha,Fatima,Tillie,Eleanore,Cari,Treva,Birdie,Wilhelmina,Rosalee,Maurine,Latrice,Yong,Jena,Taryn,Elia,Debby,Maudie,Jeanna,Delilah,Catrina,Shonda,Hortencia,Theodora,Teresita,Robbin,Danette,Maryjane,Freddie,Delphine,Brianne,Nilda,Danna,Cindi,Bess,Iona,Hanna,Ariel,Winona,Vida,Rosita,Marianna,William,Racheal,Guillermina,Eloisa,Celestine,Caren,Malissa,Lona,Chantel,Shellie,Marisela,Leora,Agatha,Soledad,Migdalia,Ivette,Christen,Athena,Janel,Chloe,Veda,Pattie,Tessie,Tera,Marilynn,Lucretia,Karrie,Dinah,Daniela,Alecia,Adelina,Vernice,Shiela,Portia,Merry,Lashawn,Devon,Dara,Tawana,Oma,Verda,Christin,Alene,Zella,Sandi,Rafaela,Maya,Kira,Candida,Alvina,Suzan,Shayla,Lyn,Lettie,Alva,Samatha,Oralia,Matilde,Madonna,Larissa,Vesta,Renita,India,Delois,Shanda,Phillis,Lorri,Erlinda,Cruz,Cathrine,Barb,Zoe,Isabell,Ione,Gisela,Charlie,Valencia,Roxanna,Mayme,Kisha,Ellie,Mellissa,Dorris,Dalia,Bella,Annetta,Zoila,Reta,Reina,Lauretta,Kylie,Christal,Pilar,Charla,Elissa,Tiffani,Tana,Paulina,Leota,Breanna,Jayme,Carmel,Vernell,Tomasa,Mandi,Dominga,Santa,Melodie,Lura,Alexa,Tamela,Ryan,Mirna,Kerrie,Venus,Noel,Felicita,Cristy,Carmelita,Berniece,Annemarie,Tiara,Roseanne,Missy,Cori,Roxana,Pricilla,Kristal,Jung,Elyse,Haydee,Aletha,Bettina,Marge,Gillian,Filomena,Charles,Zenaida,Harriette,Caridad,Vada,Una,Aretha,Pearline,Marjory,Marcela,Flor,Evette,Elouise,Alina,Trinidad,David,Damaris,Catharine,Carroll,Belva,Nakia,Marlena,Luanne,Lorine,Karon,Dorene,Danita,Brenna,Tatiana,Sammie,Louann,Loren,Julianna,Andria,Philomena,Lucila,Leonora,Dovie,Romona,Mimi,Jacquelin,Gaye,Tonja,Misti,Joe,Gene,Chastity,Stacia,Roxann,Micaela,Nikita,Mei,Velda,Marlys,Johnna,Aura,Lavern,Ivonne,Hayley,Nicki,Majorie,Herlinda,George,Alpha,Yadira,Perla,Gregoria,Daniel,Antonette,Shelli,Mozelle,Mariah,Joelle,Cordelia,Josette,Chiquita,Trista,Louis,Laquita,Georgiana,Candi,Shanon,Lonnie,Hildegard,Cecil,Valentina,Stephany,Magda,Karol,Gerry,Gabriella,Tiana,Roma,Richelle,Ray,Princess,Oleta,Jacque,Idella,Alaina,Suzanna,Jovita,Blair,Tosha,Raven,Nereida,Marlyn,Kyla,Joseph,Delfina,Tena,Stephenie,Sabina,Nathalie,Marcelle,Gertie,Darleen,Thea,Sharonda,Shantel,Belen,Venessa,Rosalina,Ona,Genoveva,Corey,Clementine,Rosalba,Renate,Renata,Mi,Ivory,Georgianna,Floy,Dorcas,Ariana,Tyra,Theda,Mariam,Juli,Jesica,Donnie,Vikki,Verla,Roselyn,Melvina,Jannette,Ginny,Debrah,Corrie,Asia,Violeta,Myrtis,Latricia,Collette,Charleen,Anissa,Viviana,Twyla,Precious,Nedra,Latonia,Lan,Hellen,Fabiola,Annamarie,Adell,Sharyn,Chantal,Niki,Maud,Lizette,Lindy,Kia,Kesha,Jeana,Danelle,Charline,Chanel,Carrol,Valorie,Lia,Dortha,Cristal,Sunny,Leone,Leilani,Gerri,Debi,Andra,Keshia,Ima,Eulalia,Easter,Dulce,Natividad,Linnie,Kami,Georgie,Catina,Brook,Alda,Winnifred,Sharla,Ruthann,Meaghan,Magdalene,Lissette,Adelaida,Venita,Trena,Shirlene,Shameka,Elizebeth,Dian,Shanta,Mickey,Latosha,Carlotta,Windy,Soon,Rosina,Mariann,Leisa,Jonnie,Dawna,Cathie,Billy,Astrid,Sidney,Laureen,Janeen,Holli,Fawn,Vickey,Teressa,Shante,Rubye,Marcelina,Chanda,Cary,Terese,Scarlett,Marty,Marnie,Lulu,Lisette,Jeniffer,Elenor,Dorinda,Donita,Carman,Bernita,Altagracia,Aleta,Adrianna,Zoraida,Ronnie,Nicola,Lyndsey,Kendall,Janina,Chrissy,Ami,Starla,Phylis,Phuong,Kyra,Charisse,Blanch,Sanjuanita,Rona,Nanci,Marilee,Maranda,Cory,Brigette,Sanjuana,Marita,Kassandra,Joycelyn,Ira,Felipa,Chelsie,Bonny,Mireya,Lorenza,Kyong,Ileana,Candelaria,Tony,Toby,Sherie,Ok,Mark,Lucie,Leatrice,Lakeshia,Gerda,Edie,Bambi,Marylin,Lavon,Hortense,Garnet,Evie,Tressa,Shayna,Lavina,Kyung,Jeanetta,Sherrill,Shara,Phyliss,Mittie,Anabel,Alesia,Thuy,Tawanda,Richard,Joanie,Tiffanie,Lashanda,Karissa,Enriqueta,Daria,Daniella,Corinna,Alanna,Abbey,Roxane,Roseanna,Magnolia,Lida,Kyle,Joellen,Era,Coral,Carleen,Tresa,Peggie,Novella,Nila,Maybelle,Jenelle,Carina,Nova,Melina,Marquerite,Margarette,Josephina,Evonne,Devin,Cinthia,Albina,Toya,Tawnya,Sherita,Santos,Myriam,Lizabeth,Lise,Keely,Jenni,Giselle,Cheryle,Ardith,Ardis,Alesha,Adriane,Shaina,Linnea,Karolyn,Hong,Florida,Felisha,Dori,Darci,Artie,Armida,Zola,Xiomara,Vergie,Shamika,Nena,Nannette,Maxie,Lovie,Jeane,Jaimie,Inge,Farrah,Elaina,Caitlyn,Starr,Felicitas,Cherly,Caryl,Yolonda,Yasmin,Teena,Prudence,Pennie,Nydia,Mackenzie,Orpha,Marvel,Lizbeth,Laurette,Jerrie,Hermelinda,Carolee,Tierra,Mirian,Meta,Melony,Kori,Jennette,Jamila,Ena,Anh,Yoshiko,Susannah,Salina,Rhiannon,Joleen,Cristine,Ashton,Aracely,Tomeka,Shalonda,Marti,Lacie,Kala,Jada,Ilse,Hailey,Brittani,Zona,Syble,Sherryl,Randy,Nidia,Marlo,Kandice,Kandi,Deb,Dean,America,Alycia,Tommy,Ronna,Norene,Mercy,Jose,Ingeborg,Giovanna,Gemma,Christel,Audry,Zora,Vita,Van,Trish,Stephaine,Shirlee,Shanika,Melonie,Mazie,Jazmin,Inga,Hoa,Hettie,Geralyn,Fonda,Estrella,Adella,Su,Sarita,Rina,Milissa,Maribeth,Golda,Evon,Ethelyn,Enedina,Cherise,Chana,Velva,Tawanna,Sade,Mirta,Li,Karie,Jacinta,Elna,Davina,Cierra,Ashlie,Albertha,Tanesha,Stephani,Nelle,Mindi,Lu,Lorinda,Larue,Florene,Demetra,Dedra,Ciara,Chantelle,Ashly,Suzy,Rosalva,Noelia,Lyda,Leatha,Krystyna,Kristan,Karri,Darline,Darcie,Cinda,Cheyenne,Cherrie,Awilda,Almeda,Rolanda,Lanette,Jerilyn,Gisele,Evalyn,Cyndi,Cleta,Carin,Zina,Zena,Velia,Tanika,Paul,Charissa,Thomas,Talia,Margarete,Lavonda,Kaylee,Kathlene,Jonna,Irena,Ilona,Idalia,Candis,Candance,Brandee,Anitra,Alida,Sigrid,Nicolette,Maryjo,Linette,Hedwig,Christiana,Cassidy,Alexia,Tressie,Modesta,Lupita,Lita,Gladis,Evelia,Davida,Cherri,Cecily,Ashely,Annabel,Agustina,Wanita,Shirly,Rosaura,Hulda,Eun,Bailey,Yetta,Verona,Thomasina,Sibyl,Shannan,Mechelle,Lue,Leandra,Lani,Kylee,Kandy,Jolynn,Ferne,Eboni,Corene,Alysia,Zula,Nada,Moira,Lyndsay,Lorretta,Juan,Jammie,Hortensia,Gaynell,Cameron,Adria,Vina,Vicenta,Tangela,Stephine,Norine,Nella,Liana,Leslee,Kimberely,Iliana,Glory,Felica,Emogene,Elfriede,Eden,Eartha,Carma,Bea,Ocie,Marry,Lennie,Kiara,Jacalyn,Carlota,Arielle,Yu,Star,Otilia,Kirstin,Kacey,Johnetta,Joey,Joetta,Jeraldine,Jaunita,Elana,Dorthea,Cami,Amada,Adelia,Vernita,Tamar,Siobhan,Renea,Rashida,Ouida,Odell,Nilsa,Meryl,Kristyn,Julieta,Danica,Breanne,Aurea,Anglea,Sherron,Odette,Malia,Lorelei,Lin,Leesa,Kenna,Kathlyn,Fiona,Charlette,Suzie,Shantell,Sabra,Racquel,Myong,Mira,Martine,Lucienne,Lavada,Juliann,Johnie,Elvera,Delphia,Clair,Christiane,Charolette,Carri,Augustine,Asha,Angella,Paola,Ninfa,Leda,Lai,Eda,Sunshine,Stefani,Shanell,Palma,Machelle,Lissa,Kecia,Kathryne,Karlene,Julissa,Jettie,Jenniffer,Hui,Corrina,Christopher,Carolann,Alena,Tess,Rosaria,Myrtice,Marylee,Liane,Kenyatta,Judie,Janey,In,Elmira,Eldora,Denna,Cristi,Cathi,Zaida,Vonnie,Viva,Vernie,Rosaline,Mariela,Luciana,Lesli,Karan,Felice,Deneen,Adina,Wynona,Tarsha,Sheron,Shasta,Shanita,Shani,Shandra,Randa,Pinkie,Paris,Nelida,Marilou,Lyla,Laurene,Laci,Joi,Janene,Dorotha,Daniele,Dani,Carolynn,Carlyn,Berenice,Ayesha,Anneliese,Alethea,Thersa,Tamiko,Rufina,Oliva,Mozell,Marylyn,Madison,Kristian,Kathyrn,Kasandra,Kandace,Janae,Gabriel,Domenica,Debbra,Dannielle,Chun,Buffy,Barbie,Arcelia,Aja,Zenobia,Sharen,Sharee,Patrick,Page,My,Lavinia,Kum,Kacie,Jackeline,Huong,Felisa,Emelia,Eleanora,Cythia,Cristin,Clyde,Claribel,Caron,Anastacia,Zulma,Zandra,Yoko,Tenisha,Susann,Sherilyn,Shay,Shawanda,Sabine,Romana,Mathilda,Linsey,Keiko,Joana,Isela,Gretta,Georgetta,Eugenie,Dusty,Desirae,Delora,Corazon,Antonina,Anika,Willene,Tracee,Tamatha,Regan,Nichelle,Mickie,Maegan,Luana,Lanita,Kelsie,Edelmira,Bree,Afton,Teodora,Tamie,Shena,Meg,Linh,Keli,Kaci,Danyelle,Britt,Arlette,Albertine,Adelle,Tiffiny,Stormy,Simona,Numbers,Nicolasa,Nichol,Nia,Nakisha,Mee,Maira,Loreen,Kizzy,Johnny,Jay,Fallon,Christene,Bobbye,Anthony,Ying,Vincenza,Tanja,Rubie,Roni,Queenie,Margarett,Kimberli,Irmgard,Idell,Hilma,Evelina,Esta,Emilee,Dennise,Dania,Carl,Carie,Antonio,Wai,Sang,Risa,Rikki,Particia,Mui,Masako,Mario,Luvenia,Loree,Loni,Lien,Kevin,Gigi,Florencia,Dorian,Denita,Dallas,Chi,Billye,Alexander,Tomika,Sharita,Rana,Nikole,Neoma,Margarite,Madalyn,Lucina,Laila,Kali,Jenette,Gabriele,Evelyne,Elenora,Clementina,Alejandrina,Zulema,Violette,Vannessa,Thresa,Retta,Pia,Patience,Noella,Nickie,Jonell,Delta,Chung,Chaya,Camelia,Bethel,Anya,Andrew,Thanh,Suzann,Spring,Shu,Mila,Lilla,Laverna,Keesha,Kattie,Gia,Georgene,Eveline,Estell,Elizbeth,Vivienne,Vallie,Trudie,Stephane,Michel,Magaly,Madie,Kenyetta,Karren,Janetta,Hermine,Harmony,Drucilla,Debbi,Celestina,Candie,Britni,Beckie,Amina,Zita,Yun,Yolande,Vivien,Vernetta,Trudi,Sommer,Pearle,Patrina,Ossie,Nicolle,Loyce,Letty,Larisa,Katharina,Joselyn,Jonelle,Jenell,Iesha,Heide,Florinda,Florentina,Flo,Elodia,Dorine,Brunilda,Brigid,Ashli,Ardella,Twana,Thu,Tarah,Sung,Shea,Shavon,Shane,Serina,Rayna,Ramonita,Nga,Margurite,Lucrecia,Kourtney,Kati,Jesus,Jesenia,Diamond,Crista,Ayana,Alica,Alia,Vinnie,Suellen,Romelia,Rachell,Piper,Olympia,Michiko,Kathaleen,Jolie,Jessi,Janessa,Hana,Ha,Elease,Carletta,Britany,Shona,Salome,Rosamond,Regena,Raina,Ngoc,Nelia,Louvenia,Lesia,Latrina,Laticia,Larhonda,Jina,Jacki,Hollis,Holley,Emmy,Deeann,Coretta,Arnetta,Velvet,Thalia,Shanice,Neta,Mikki,Micki,Lonna,Leana,Lashunda,Kiley,Joye,Jacqulyn,Ignacia,Hyun,Hiroko,Henry,Henriette,Elayne,Delinda,Darnell,Dahlia,Coreen,Consuela,Conchita,Celine,Babette,Ayanna,Anette,Albertina,Skye,Shawnee,Shaneka,Quiana,Pamelia,Min,Merri,Merlene,Margit,Kiesha,Kiera,Kaylene,Jodee,Jenise,Erlene,Emmie,Else,Daryl,Dalila,Daisey,Cody,Casie,Belia,Babara,Versie,Vanesa,Shelba,Shawnda,Sam,Norman,Nikia,Naoma,Marna,Margeret,Madaline,Lawana,Kindra,Jutta,Jazmine,Janett,Hannelore,Glendora,Gertrud,Garnett,Freeda,Frederica,Florance,Flavia,Dennis,Carline,Beverlee,Anjanette,Valda,Trinity,Tamala,Stevie,Shonna,Sha,Sarina,Oneida,Micah,Merilyn,Marleen,Lurline,Lenna,Katherin,Jin,Jeni,Hae,Gracia,Glady,Farah,Eric,Enola,Ema,Dominque,Devona,Delana,Cecila,Caprice,Alysha,Ali,Alethia,Vena,Theresia,Tawny,Song,Shakira,Samara,Sachiko,Rachele,Pamella,Nicky,Marni,Mariel,Maren,Malisa,Ligia,Lera,Latoria,Larae,Kimber,Kathern,Karey,Jennefer,Janeth,Halina,Fredia,Delisa,Debroah,Ciera,Chin,Angelika,Andree,Altha,Yen,Vivan,Terresa,Tanna,Suk,Sudie,Soo,Signe,Salena,Ronni,Rebbecca,Myrtie,Mckenzie,Malika,Maida,Loan,Leonarda,Kayleigh,France,Ethyl,Ellyn,Dayle,Cammie,Brittni,Birgit,Avelina,Asuncion,Arianna,Akiko,Venice,Tyesha,Tonie,Tiesha,Takisha,Steffanie,Sindy,Santana,Meghann,Manda,Macie,Lady,Kellye,Kellee,Joslyn,Jason,Inger,Indira,Glinda,Glennis,Fernanda,Faustina,Eneida,Elicia,Dot,Digna,Dell,Arletta,Andre,Willia,Tammara,Tabetha,Sherrell,Sari,Refugio,Rebbeca,Pauletta,Nieves,Natosha,Nakita,Mammie,Kenisha,Kazuko,Kassie,Gary,Earlean,Daphine,Corliss,Clotilde,Carolyne,Bernetta,Augustina,Audrea,Annis,Annabell,Yan,Tennille,Tamica,Selene,Sean,Rosana,Regenia,Qiana,Markita,Macy,Leeanne,Laurine,Kym,Jessenia,Janita,Georgine,Genie,Emiko,Elvie,Deandra,Dagmar,Corie,Collen,Cherish,Romaine,Porsha,Pearlene,Micheline,Merna,Margorie,Margaretta,Lore,Kenneth,Jenine,Hermina,Fredericka,Elke,Drusilla,Dorathy,Dione,Desire,Celena,Brigida,Angeles,Allegra,Theo,Tamekia,Synthia,Stephen,Sook,Slyvia,Rosann,Reatha,Raye,Marquetta,Margart,Ling,Layla,Kymberly,Kiana,Kayleen,Katlyn,Karmen,Joella,Irina,Emelda,Eleni,Detra,Clemmie,Cheryll,Chantell,Cathey,Arnita,Arla,Angle,Angelic,Alyse,Zofia,Thomasine,Tennie,Son,Sherly,Sherley,Sharyl,Remedios,Petrina,Nickole,Myung,Myrle,Mozella,Louanne,Lisha,Latia,Lane,Krysta,Julienne,Joel,Jeanene,Jacqualine,Isaura,Gwenda,Earleen,Donald,Cleopatra,Carlie,Audie,Antonietta,Alise,Alex,Verdell,Val,Tyler,Tomoko,Thao,Talisha,Steven,So,Shemika,Shaun,Scarlet,Savanna,Santina,Rosia,Raeann,Odilia,Nana,Minna,Magan,Lynelle,Le,Karma,Joeann,Ivana,Inell,Ilana,Hye,Honey,Hee,Gudrun,Frank,Dreama,Crissy,Chante,Carmelina,Arvilla,Arthur,Annamae,Alvera,Aleida,Aaron,Yee,Yanira,Vanda,Tianna,Tam,Stefania,Shira,Perry,Nicol,Nancie,Monserrate,Minh,Melynda,Melany,Matthew,Lovella,Laure,Kirby,Kacy,Jacquelynn,Hyon,Gertha,Francisco,Eliana,Christena,Christeen,Charise,Caterina,Carley,Candyce,Arlena,Ammie,Yang,Willette,Vanita,Tuyet,Tiny,Syreeta,Silva,Scott,Ronald,Penney,Nyla,Michal,Maurice,Maryam,Marya,Magen,Ludie,Loma,Livia,Lanell,Kimberlie,Julee,Donetta,Diedra,Denisha,Deane,Dawne,Clarine,Cherryl,Bronwyn,Brandon,Alla,Valery,Tonda,Sueann,Soraya,Shoshana,Shela,Sharleen,Shanelle,Nerissa,Micheal,Meridith,Mellie,Maye,Maple,Magaret,Luis,Lili,Leonila,Leonie,Leeanna,Lavonia,Lavera,Kristel,Kathey,Kathe,Justin,Julian,Jimmy,Jann,Ilda,Hildred,Hildegarde,Genia,Fumiko,Evelin,Ermelinda,Elly,Dung,Doloris,Dionna,Danae,Berneice,Annice,Alix,Verena,Verdie,Tristan,Shawnna,Shawana,Shaunna,Rozella,Randee,Ranae,Milagro,Lynell,Luise,Louie,Loida,Lisbeth,Karleen,Junita,Jona,Isis,Hyacinth,Hedy,Gwenn,Ethelene,Erline,Edward,Donya,Domonique,Delicia,Dannette,Cicely,Branda,Blythe,Bethann,Ashlyn,Annalee,Alline,Yuko,Vella,Trang,Towanda,Tesha,Sherlyn,Narcisa,Miguelina,Meri,Maybell,Marlana,Marguerita,Madlyn,Luna,Lory,Loriann,Liberty,Leonore,Leighann,Laurice,Latesha,Laronda,Katrice,Kasie,Karl,Kaley,Jadwiga,Glennie,Gearldine,Francina,Epifania,Dyan,Dorie,Diedre,Denese,Demetrice,Delena,Darby,Cristie,Cleora,Catarina,Carisa,Bernie,Barbera,Almeta,Trula,Tereasa,Solange,Sheilah,Shavonne,Sanora,Rochell,Mathilde,Margareta,Maia,Lynsey,Lawanna,Launa,Kena,Keena,Katia,Jamey,Glynda,Gaylene,Elvina,Elanor,Danuta,Danika,Cristen,Cordie,Coletta,Clarita,Carmon,Brynn,Azucena,Aundrea,Angele,Yi,Walter,Verlie,Verlene,Tamesha,Silvana,Sebrina,Samira,Reda,Raylene,Penni,Pandora,Norah,Noma,Mireille,Melissia,Maryalice,Laraine,Kimbery,Karyl,Karine,Kam,Jolanda,Johana,Jesusa,Jaleesa,Jae,Jacquelyne,Irish,Iluminada,Hilaria,Hanh,Gennie,Francie,Floretta,Exie,Edda,Drema,Delpha,Bev,Barbar,Assunta,Ardell,Annalisa,Alisia,Yukiko,Yolando,Wonda,Wei,Waltraud,Veta,Tequila,Temeka,Tameika,Shirleen,Shenita,Piedad,Ozella,Mirtha,Marilu,Kimiko,Juliane,Jenice,Jen,Janay,Jacquiline,Hilde,Fe,Fae,Evan,Eugene,Elois,Echo,Devorah,Chau,Brinda,Betsey,Arminda,Aracelis,Apryl,Annett,Alishia,Veola,Usha,Toshiko,Theola,Tashia,Talitha,Shery,Rudy,Renetta,Reiko,Rasheeda,Omega,Obdulia,Mika,Melaine,Meggan,Martin,Marlen,Marget,Marceline,Mana,Magdalen,Librada,Lezlie,Lexie,Latashia,Lasandra,Kelle,Isidra,Isa,Inocencia,Gwyn,Francoise,Erminia,Erinn,Dimple,Devora,Criselda,Armanda,Arie,Ariane,Angelo,Angelena,Allen,Aliza,Adriene,Adaline,Xochitl,Twanna,Tran,Tomiko,Tamisha,Taisha,Susy,Siu,Rutha,Roxy,Rhona,Raymond,Otha,Noriko,Natashia,Merrie,Melvin,Marinda,Mariko,Margert,Loris,Lizzette,Leisha,Kaila,Ka,Joannie,Jerrica,Jene,Jannet,Janee,Jacinda,Herta,Elenore,Doretta,Delaine,Daniell,Claudie,China,Britta,Apolonia,Amberly,Alease,Yuri,Yuk,Wen,Waneta,Ute,Tomi,Sharri,Sandie,Roselle,Reynalda,Raguel,Phylicia,Patria,Olimpia,Odelia,Mitzie,Mitchell,Miss,Minda,Mignon,Mica,Mendy,Marivel,Maile,Lynetta,Lavette,Lauryn,Latrisha,Lakiesha,Kiersten,Kary,Josphine,Jolyn,Jetta,Janise,Jacquie,Ivelisse,Glynis,Gianna,Gaynelle,Emerald,Demetrius,Danyell,Danille,Dacia,Coralee,Cher,Ceola,Brett,Bell,Arianne,Aleshia,Yung,Williemae,Troy,Trinh,Thora,Tai,Svetlana,Sherika,Shemeka,Shaunda,Roseline,Ricki,Melda,Mallie,Lavonna,Latina,Larry,Laquanda,Lala,Lachelle,Klara,Kandis,Johna,Jeanmarie,Jaye,Hang,Grayce,Gertude,Emerita,Ebonie,Clorinda,Ching,Chery,Carola,Breann,Blossom,Bernardine,Becki,Arletha,Argelia,Ara,Alita,Yulanda,Yon,Yessenia,Tobi,Tasia,Sylvie,Shirl,Shirely,Sheridan,Shella,Shantelle,Sacha,Royce,Rebecka,Reagan,Providencia,Paulene,Misha,Miki,Marline,Marica,Lorita,Latoyia,Lasonya,Kerstin,Kenda,Keitha,Kathrin,Jaymie,Jack,Gricelda,Ginette,Eryn,Elina,Elfrieda,Danyel,Cheree,Chanelle,Barrie,Avery,Aurore,Annamaria,Alleen,Ailene,Aide,Yasmine,Vashti,Valentine,Treasa,Tory,Tiffaney,Sheryll,Sharie,Shanae,Sau,Raisa,Pa,Neda,Mitsuko,Mirella,Milda,Maryanna,Maragret,Mabelle,Luetta,Lorina,Letisha,Latarsha,Lanelle,Lajuana,Krissy,Karly,Karena,Jon,Jessika,Jerica,Jeanelle,January,Jalisa,Jacelyn,Izola,Ivey,Gregory,Euna,Etha,Drew,Domitila,Dominica,Daina,Creola,Carli,Camie,Bunny,Brittny,Ashanti,Anisha,Aleen,Adah,Yasuko,Winter,Viki,Valrie,Tona,Tinisha,Thi,Terisa,Tatum,Taneka,Simonne,Shalanda,Serita,Ressie,Refugia,Paz,Olene,Na,Merrill,Margherita,Mandie,Man,Maire,Lyndia,Luci,Lorriane,Loreta,Leonia,Lavona,Lashawnda,Lakia,Kyoko,Krystina,Krysten,Kenia,Kelsi,Jude,Jeanice,Isobel,Georgiann,Genny,Felicidad,Eilene,Deon,Deloise,Deedee,Dannie,Conception,Clora,Cherilyn,Chang,Calandra,Berry,Armandina,Anisa,Ula,Timothy,Tiera,Theressa,Stephania,Sima,Shyla,Shonta,Shera,Shaquita,Shala,Sammy,Rossana,Nohemi,Nery,Moriah,Melita,Melida,Melani,Marylynn,Marisha,Mariette,Malorie,Madelene,Ludivina,Loria,Lorette,Loralee,Lianne,Leon,Lavenia,Laurinda,Lashon,Kit,Kimi,Keila,Katelynn,Kai,Jone,Joane,Ji,Jayna,Janella,Ja,Hue,Hertha,Francene,Elinore,Despina,Delsie,Deedra,Clemencia,Carry,Carolin,Carlos,Bulah,Brittanie,Bok,Blondell,Bibi,Beaulah,Beata,Annita,Agripina,Virgen,Valene,Un,Twanda,Tommye,Toi,Tarra,Tari,Tammera,Shakia,Sadye,Ruthanne,Rochel,Rivka,Pura,Nenita,Natisha,Ming,Merrilee,Melodee,Marvis,Lucilla,Leena,Laveta,Larita,Lanie,Keren,Ileen,Georgeann,Genna,Genesis,Frida,Ewa,Eufemia,Emely,Ela,Edyth,Deonna,Deadra,Darlena,Chanell,Chan,Cathern,Cassondra,Cassaundra,Bernarda,Berna,Arlinda,Anamaria,Albert,Wesley,Vertie,Valeri,Torri,Tatyana,Stasia,Sherise,Sherill,Season,Scottie,Sanda,Ruthe,Rosy,Roberto,Robbi,Ranee,Quyen,Pearly,Palmira,Onita,Nisha,Niesha,Nida,Nevada,Nam,Merlyn,Mayola,Marylouise,Maryland,Marx,Marth,Margene,Madelaine,Londa,Leontine,Leoma,Leia,Lawrence,Lauralee,Lanora,Lakita,Kiyoko,Keturah,Katelin,Kareen,Jonie,Johnette,Jenee,Jeanett,Izetta,Hiedi,Heike,Hassie,Harold,Giuseppina,Georgann,Fidela,Fernande,Elwanda,Ellamae,Eliz,Dusti,Dotty,Cyndy,Coralie,Celesta,Argentina,Alverta,Xenia,Wava,Vanetta,Torrie,Tashina,Tandy,Tambra,Tama,Stepanie,Shila,Shaunta,Sharan,Shaniqua,Shae,Setsuko,Serafina,Sandee,Rosamaria,Priscila,Olinda,Nadene,Muoi,Michelina,Mercedez,Maryrose,Marin,Marcene,Mao,Magali,Mafalda,Logan,Linn,Lannie,Kayce,Karoline,Kamilah,Kamala,Justa,Joline,Jennine,Jacquetta,Iraida,Gerald,Georgeanna,Franchesca,Fairy,Emeline,Elane,Ehtel,Earlie,Dulcie,Dalene,Cris,Classie,Chere,Charis,Caroyln,Carmina,Carita,Brian,Bethanie,Ayako,Arica,An,Alysa,Alessandra,Akilah,Adrien,Zetta,Youlanda,Yelena,Yahaira,Xuan,Wendolyn,Victor,Tijuana,Terrell,Terina,Teresia,Suzi,Sunday,Sherell,Shavonda,Shaunte,Sharda,Shakita,Sena,Ryann,Rubi,Riva,Reginia,Rea,Rachal,Parthenia,Pamula,Monnie,Monet,Michaele,Melia,Marine,Malka,Maisha,Lisandra,Leo,Lekisha,Lean,Laurence,Lakendra,Krystin,Kortney,Kizzie,Kittie,Kera,Kendal,Kemberly,Kanisha,Julene,Jule,Joshua,Johanne,Jeffrey,Jamee,Han,Halley,Gidget,Galina,Fredricka,Fleta,Fatimah,Eusebia,Elza,Eleonore,Dorthey,Doria,Donella,Dinorah,Delorse,Claretha,Christinia,Charlyn,Bong,Belkis,Azzie,Andera,Aiko,Adena,Yer,Yajaira,Wan,Vania,Ulrike,Toshia,Tifany,Stefany,Shizue,Shenika,Shawanna,Sharolyn,Sharilyn,Shaquana,Shantay,See,Rozanne,Roselee,Rickie,Remona,Reanna,Raelene,Quinn,Phung,Petronila,Natacha,Nancey,Myrl,Miyoko,Miesha,Merideth,Marvella,Marquitta,Marhta,Marchelle,Lizeth,Libbie,Lahoma,Ladawn,Kina,Katheleen,Katharyn,Karisa,Kaleigh,Junie,Julieann,Johnsie,Janean,Jaimee,Jackqueline,Hisako,Herma,Helaine,Gwyneth,Glenn,Gita,Eustolia,Emelina,Elin,Edris,Donnette,Donnetta,Dierdre,Denae,Darcel,Claude,Clarisa,Cinderella,Chia,Charlesetta,Charita,Celsa,Cassy,Cassi,Carlee,Bruna,Brittaney,Brande,Billi,Bao,Antonetta,Angla,Angelyn,Analisa,Alane,Wenona,Wendie,Veronique,Vannesa,Tobie,Tempie,Sumiko,Sulema,Sparkle,Somer,Sheba,Shayne,Sharice,Shanel,Shalon,Sage,Roy,Rosio,Roselia,Renay,Rema,Reena,Porsche,Ping,Peg,Ozie,Oretha,Oralee,Oda,Nu,Ngan,Nakesha,Milly,Marybelle,Marlin,Maris,Margrett,Maragaret,Manie,Lurlene,Lillia,Lieselotte,Lavelle,Lashaunda,Lakeesha,Keith,Kaycee,Kalyn,Joya,Joette,Jenae,Janiece,Illa,Grisel,Glayds,Genevie,Gala,Fredda,Fred,Elmer,Eleonor,Debera,Deandrea,Dan,Corrinne,Cordia,Contessa,Colene,Cleotilde,Charlott,Chantay,Cecille,Beatris,Azalee,Arlean,Ardath,Anjelica,Anja,Alfredia,Aleisha,Adam,Zada,Yuonne,Xiao,Willodean,Whitley,Vennie,Vanna,Tyisha,Tova,Torie,Tonisha,Tilda,Tien,Temple,Sirena,Sherril,Shanti,Shan,Senaida,Samella,Robbyn,Renda,Reita,Phebe,Paulita,Nobuko,Nguyet,Neomi,Moon,Mikaela,Melania,Maximina,Marg,Maisie,Lynna,Lilli,Layne,Lashaun,Lakenya,Lael,Kirstie,Kathline,Kasha,Karlyn,Karima,Jovan,Josefine,Jennell,Jacqui,Jackelyn,Hyo,Hien,Grazyna,Florrie,Floria,Eleonora,Dwana,Dorla,Dong,Delmy,Deja,Dede,Dann,Crysta,Clelia,Claris,Clarence,Chieko,Cherlyn,Cherelle,Charmain,Chara,Cammy,Bee,Arnette,Ardelle,Annika,Amiee,Amee,Allena,Yvone,Yuki,Yoshie,Yevette,Yael,Willetta,Voncile,Venetta,Tula,Tonette,Timika,Temika,Telma,Teisha,Taren,Ta,Stacee,Shin,Shawnta,Saturnina,Ricarda,Pok,Pasty,Onie,Nubia,Mora,Mike,Marielle,Mariella,Marianela,Mardell,Many,Luanna,Loise,Lisabeth,Lindsy,Lilliana,Lilliam,Lelah,Leigha,Leanora,Lang,Kristeen,Khalilah,Keeley,Kandra,Junko,Joaquina,Jerlene,Jani,Jamika,Jame,Hsiu,Hermila,Golden,Genevive,Evia,Eugena,Emmaline,Elfreda,Elene,Donette,Delcie,Deeanna,Darcey,Cuc,Clarinda,Cira,Chae,Celinda,Catheryn,Catherin,Casimira,Carmelia,Camellia,Breana,Bobette,Bernardina,Bebe,Basilia,Arlyne,Amal,Alayna,Zonia,Zenia,Yuriko,Yaeko,Wynell,Willow,Willena,Vernia,Tu,Travis,Tora,Terrilyn,Terica,Tenesha,Tawna,Tajuana,Taina,Stephnie,Sona,Sol,Sina,Shondra,Shizuko,Sherlene,Sherice,Sharika,Rossie,Rosena,Rory,Rima,Ria,Rheba,Renna,Peter,Natalya,Nancee,Melodi,Meda,Maxima,Matha,Marketta,Maricruz,Marcelene,Malvina,Luba,Louetta,Leida,Lecia,Lauran,Lashawna,Laine,Khadijah,Katerine,Kasi,Kallie,Julietta,Jesusita,Jestine,Jessia,Jeremy,Jeffie,Janyce,Isadora,Georgianne,Fidelia,Evita,Eura,Eulah,Estefana,Elsy,Elizabet,Eladia,Dodie,Dion,Dia,Denisse,Deloras,Delila,Daysi,Dakota,Curtis,Crystle,Concha,Colby,Claretta,Chu,Christia,Charlsie,Charlena,Carylon,Bettyann,Asley,Ashlea,Amira,Ai,Agueda,Agnus,Yuette,Vinita,Victorina,Tynisha,Treena,Toccara,Tish,Thomasena,Tegan,Soila,Shiloh,Shenna,Sharmaine,Shantae,Shandi,September,Saran,Sarai,Sana,Samuel,Salley,Rosette,Rolande,Regine,Otelia,Oscar,Olevia,Nicholle,Necole,Naida,Myrta,Myesha,Mitsue,Minta,Mertie,Margy,Mahalia,Madalene,Love,Loura,Lorean,Lewis,Lesha,Leonida,Lenita,Lavone,Lashell,Lashandra,Lamonica,Kimbra,Katherina,Karry,Kanesha,Julio,Jong,Jeneva,Jaquelyn,Hwa,Gilma,Ghislaine,Gertrudis,Fransisca,Fermina,Ettie,Etsuko,Ellis,Ellan,Elidia,Edra,Dorethea,Doreatha,Denyse,Denny,Deetta,Daine,Cyrstal,Corrin,Cayla,Carlita,Camila,Burma,Bula,Buena,Blake,Barabara,Avril,Austin,Alaine,Zana,Wilhemina,Wanetta,Virgil,Vi,Veronika,Vernon,Verline,Vasiliki,Tonita,Tisa,Teofila,Tayna,Taunya,Tandra,Takako,Sunni,Suanne,Sixta,Sharell,Seema,Russell,Rosenda,Robena,Raymonde,Pei,Pamila,Ozell,Neida,Neely,Mistie,Micha,Merissa,Maurita,Maryln,Maryetta,Marshall,Marcell,Malena,Makeda,Maddie,Lovetta,Lourie,Lorrine,Lorilee,Lester,Laurena,Lashay,Larraine,Laree,Lacresha,Kristle,Krishna,Keva,Keira,Karole,Joie,Jinny,Jeannetta,Jama,Heidy,Gilberte,Gema,Faviola,Evelynn,Enda,Elli,Ellena,Divina,Dagny,Collene,Codi,Cindie,Chassidy,Chasidy,Catrice,Catherina,Cassey,Caroll,Carlena,Candra,Calista,Bryanna,Britteny,Beula,Bari,Audrie,Audria,Ardelia,Annelle,Angila,Alona,Allyn".split(',') LAST_NAMES="Smith,Johnson,Williams,Jones,Brown,Davis,Miller,Wilson,Moore,Taylor,Anderson,Thomas,Jackson,White,Harris,Martin,Thompson,Garcia,Martinez,Robinson,Clark,Rodriguez,Lewis,Lee,Walker,Hall,Allen,Young,Hernandez,King,Wright,Lopez,Hill,Scott,Green,Adams,Baker,Gonzalez,Nelson,Carter,Mitchell,Perez,Roberts,Turner,Phillips,Campbell,Parker,Evans,Edwards,Collins,Stewart,Sanchez,Morris,Rogers,Reed,Cook,Morgan,Bell,Murphy,Bailey,Rivera,Cooper,Richardson,Cox,Howard,Ward,Torres,Peterson,Gray,Ramirez,James,Watson,Brooks,Kelly,Sanders,Price,Bennett,Wood,Barnes,Ross,Henderson,Coleman,Jenkins,Perry,Powell,Long,Patterson,Hughes,Flores,Washington,Butler,Simmons,Foster,Gonzales,Bryant,Alexander,Russell,Griffin,Diaz,Hayes,Myers,Ford,Hamilton,Graham,Sullivan,Wallace,Woods,Cole,West,Jordan,Owens,Reynolds,Fisher,Ellis,Harrison,Gibson,Mcdonald,Cruz,Marshall,Ortiz,Gomez,Murray,Freeman,Wells,Webb,Simpson,Stevens,Tucker,Porter,Hunter,Hicks,Crawford,Henry,Boyd,Mason,Morales,Kennedy,Warren,Dixon,Ramos,Reyes,Burns,Gordon,Shaw,Holmes,Rice,Robertson,Hunt,Black,Daniels,Palmer,Mills,Nichols,Grant,Knight,Ferguson,Rose,Stone,Hawkins,Dunn,Perkins,Hudson,Spencer,Gardner,Stephens,Payne,Pierce,Berry,Matthews,Arnold,Wagner,Willis,Ray,Watkins,Olson,Carroll,Duncan,Snyder,Hart,Cunningham,Bradley,Lane,Andrews,Ruiz,Harper,Fox,Riley,Armstrong,Carpenter,Weaver,Greene,Lawrence,Elliott,Chavez,Sims,Austin,Peters,Kelley,Franklin,Lawson,Fields,Gutierrez,Ryan,Schmidt,Carr,Vasquez,Castillo,Wheeler,Chapman,Oliver,Montgomery,Richards,Williamson,Johnston,Banks,Meyer,Bishop,Mccoy,Howell,Alvarez,Morrison,Hansen,Fernandez,Garza,Harvey,Little,Burton,Stanley,Nguyen,George,Jacobs,Reid,Kim,Fuller,Lynch,Dean,Gilbert,Garrett,Romero,Welch,Larson,Frazier,Burke,Hanson,Day,Mendoza,Moreno,Bowman,Medina,Fowler,Brewer,Hoffman,Carlson,Silva,Pearson,Holland,Douglas,Fleming,Jensen,Vargas,Byrd,Davidson,Hopkins,May,Terry,Herrera,Wade,Soto,Walters,Curtis,Neal,Caldwell,Lowe,Jennings,Barnett,Graves,Jimenez,Horton,Shelton,Barrett,Obrien,Castro,Sutton,Gregory,Mckinney,Lucas,Miles,Craig,Rodriquez,Chambers,Holt,Lambert,Fletcher,Watts,Bates,Hale,Rhodes,Pena,Beck,Newman,Haynes,Mcdaniel,Mendez,Bush,Vaughn,Parks,Dawson,Santiago,Norris,Hardy,Love,Steele,Curry,Powers,Schultz,Barker,Guzman,Page,Munoz,Ball,Keller,Chandler,Weber,Leonard,Walsh,Lyons,Ramsey,Wolfe,Schneider,Mullins,Benson,Sharp,Bowen,Daniel,Barber,Cummings,Hines,Baldwin,Griffith,Valdez,Hubbard,Salazar,Reeves,Warner,Stevenson,Burgess,Santos,Tate,Cross,Garner,Mann,Mack,Moss,Thornton,Dennis,Mcgee,Farmer,Delgado,Aguilar,Vega,Glover,Manning,Cohen,Harmon,Rodgers,Robbins,Newton,Todd,Blair,Higgins,Ingram,Reese,Cannon,Strickland,Townsend,Potter,Goodwin,Walton,Rowe,Hampton,Ortega,Patton,Swanson,Joseph,Francis,Goodman,Maldonado,Yates,Becker,Erickson,Hodges,Rios,Conner,Adkins,Webster,Norman,Malone,Hammond,Flowers,Cobb,Moody,Quinn,Blake,Maxwell,Pope,Floyd,Osborne,Paul,Mccarthy,Guerrero,Lindsey,Estrada,Sandoval,Gibbs,Tyler,Gross,Fitzgerald,Stokes,Doyle,Sherman,Saunders,Wise,Colon,Gill,Alvarado,Greer,Padilla,Simon,Waters,Nunez,Ballard,Schwartz,Mcbride,Houston,Christensen,Klein,Pratt,Briggs,Parsons,Mclaughlin,Zimmerman,French,Buchanan,Moran,Copeland,Roy,Pittman,Brady,Mccormick,Holloway,Brock,Poole,Frank,Logan,Owen,Bass,Marsh,Drake,Wong,Jefferson,Park,Morton,Abbott,Sparks,Patrick,Norton,Huff,Clayton,Massey,Lloyd,Figueroa,Carson,Bowers,Roberson,Barton,Tran,Lamb,Harrington,Casey,Boone,Cortez,Clarke,Mathis,Singleton,Wilkins,Cain,Bryan,Underwood,Hogan,Mckenzie,Collier,Luna,Phelps,Mcguire,Allison,Bridges,Wilkerson,Nash,Summers,Atkins,Wilcox,Pitts,Conley,Marquez,Burnett,Richard,Cochran,Chase,Davenport,Hood,Gates,Clay,Ayala,Sawyer,Roman,Vazquez,Dickerson,Hodge,Acosta,Flynn,Espinoza,Nicholson,Monroe,Wolf,Morrow,Kirk,Randall,Anthony,Whitaker,Oconnor,Skinner,Ware,Molina,Kirby,Huffman,Bradford,Charles,Gilmore,Dominguez,Oneal,Bruce,Lang,Combs,Kramer,Heath,Hancock,Gallagher,Gaines,Shaffer,Short,Wiggins,Mathews,Mcclain,Fischer,Wall,Small,Melton,Hensley,Bond,Dyer,Cameron,Grimes,Contreras,Christian,Wyatt,Baxter,Snow,Mosley,Shepherd,Larsen,Hoover,Beasley,Glenn,Petersen,Whitehead,Meyers,Keith,Garrison,Vincent,Shields,Horn,Savage,Olsen,Schroeder,Hartman,Woodard,Mueller,Kemp,Deleon,Booth,Patel,Calhoun,Wiley,Eaton,Cline,Navarro,Harrell,Lester,Humphrey,Parrish,Duran,Hutchinson,Hess,Dorsey,Bullock,Robles,Beard,Dalton,Avila,Vance,Rich,Blackwell,York,Johns,Blankenship,Trevino,Salinas,Campos,Pruitt,Moses,Callahan,Golden,Montoya,Hardin,Guerra,Mcdowell,Carey,Stafford,Gallegos,Henson,Wilkinson,Booker,Merritt,Miranda,Atkinson,Orr,Decker,Hobbs,Preston,Tanner,Knox,Pacheco,Stephenson,Glass,Rojas,Serrano,Marks,Hickman,English,Sweeney,Strong,Prince,Mcclure,Conway,Walter,Roth,Maynard,Farrell,Lowery,Hurst,Nixon,Weiss,Trujillo,Ellison,Sloan,Juarez,Winters,Mclean,Randolph,Leon,Boyer,Villarreal,Mccall,Gentry,Carrillo,Kent,Ayers,Lara,Shannon,Sexton,Pace,Hull,Leblanc,Browning,Velasquez,Leach,Chang,House,Sellers,Herring,Noble,Foley,Bartlett,Mercado,Landry,Durham,Walls,Barr,Mckee,Bauer,Rivers,Everett,Bradshaw,Pugh,Velez,Rush,Estes,Dodson,Morse,Sheppard,Weeks,Camacho,Bean,Barron,Livingston,Middleton,Spears,Branch,Blevins,Chen,Kerr,Mcconnell,Hatfield,Harding,Ashley,Solis,Herman,Frost,Giles,Blackburn,William,Pennington,Woodward,Finley,Mcintosh,Koch,Best,Solomon,Mccullough,Dudley,Nolan,Blanchard,Rivas,Brennan,Mejia,Kane,Benton,Joyce,Buckley,Haley,Valentine,Maddox,Russo,Mcknight,Buck,Moon,Mcmillan,Crosby,Berg,Dotson,Mays,Roach,Church,Chan,Richmond,Meadows,Faulkner,Oneill,Knapp,Kline,Barry,Ochoa,Jacobson,Gay,Avery,Hendricks,Horne,Shepard,Hebert,Cherry,Cardenas,Mcintyre,Whitney,Waller,Holman,Donaldson,Cantu,Terrell,Morin,Gillespie,Fuentes,Tillman,Sanford,Bentley,Peck,Key,Salas,Rollins,Gamble,Dickson,Battle,Santana,Cabrera,Cervantes,Howe,Hinton,Hurley,Spence,Zamora,Yang,Mcneil,Suarez,Case,Petty,Gould,Mcfarland,Sampson,Carver,Bray,Rosario,Macdonald,Stout,Hester,Melendez,Dillon,Farley,Hopper,Galloway,Potts,Bernard,Joyner,Stein,Aguirre,Osborn,Mercer,Bender,Franco,Rowland,Sykes,Benjamin,Travis,Pickett,Crane,Sears,Mayo,Dunlap,Hayden,Wilder,Mckay,Coffey,Mccarty,Ewing,Cooley,Vaughan,Bonner,Cotton,Holder,Stark,Ferrell,Cantrell,Fulton,Lynn,Lott,Calderon,Rosa,Pollard,Hooper,Burch,Mullen,Fry,Riddle,Levy,David,Duke,Odonnell,Guy,Michael,Britt,Frederick,Daugherty,Berger,Dillard,Alston,Jarvis,Frye,Riggs,Chaney,Odom,Duffy,Fitzpatrick,Valenzuela,Merrill,Mayer,Alford,Mcpherson,Acevedo,Donovan,Barrera,Albert,Cote,Reilly,Compton,Raymond,Mooney,Mcgowan,Craft,Cleveland,Clemons,Wynn,Nielsen,Baird,Stanton,Snider,Rosales,Bright,Witt,Stuart,Hays,Holden,Rutledge,Kinney,Clements,Castaneda,Slater,Hahn,Emerson,Conrad,Burks,Delaney,Pate,Lancaster,Sweet,Justice,Tyson,Sharpe,Whitfield,Talley,Macias,Irwin,Burris,Ratliff,Mccray,Madden,Kaufman,Beach,Goff,Cash,Bolton,Mcfadden,Levine,Good,Byers,Kirkland,Kidd,Workman,Carney,Dale,Mcleod,Holcomb,England,Finch,Head,Burt,Hendrix,Sosa,Haney,Franks,Sargent,Nieves,Downs,Rasmussen,Bird,Hewitt,Lindsay,Le,Foreman,Valencia,Oneil,Delacruz,Vinson,Dejesus,Hyde,Forbes,Gilliam,Guthrie,Wooten,Huber,Barlow,Boyle,Mcmahon,Buckner,Rocha,Puckett,Langley,Knowles,Cooke,Velazquez,Whitley,Noel,Vang,Shea,Rouse,Hartley,Mayfield,Elder,Rankin,Hanna,Cowan,Lucero,Arroyo,Slaughter,Haas,Oconnell,Minor,Kendrick,Shirley,Kendall,Boucher,Archer,Boggs,Odell,Dougherty,Andersen,Newell,Crowe,Wang,Friedman,Bland,Swain,Holley,Felix,Pearce,Childs,Yarbrough,Galvan,Proctor,Meeks,Lozano,Mora,Rangel,Bacon,Villanueva,Schaefer,Rosado,Helms,Boyce,Goss,Stinson,Smart,Lake,Ibarra,Hutchins,Covington,Reyna,Gregg,Werner,Crowley,Hatcher,Mackey,Bunch,Womack,Polk,Jamison,Dodd,Childress,Childers,Camp,Villa,Dye,Springer,Mahoney,Dailey,Belcher,Lockhart,Griggs,Costa,Connor,Brandt,Winter,Walden,Moser,Tracy,Tatum,Mccann,Akers,Lutz,Pryor,Law,Orozco,Mcallister,Lugo,Davies,Shoemaker,Madison,Rutherford,Newsome,Magee,Chamberlain,Blanton,Simms,Godfrey,Flanagan,Crum,Cordova,Escobar,Downing,Sinclair,Donahue,Krueger,Mcginnis,Gore,Farris,Webber,Corbett,Andrade,Starr,Lyon,Yoder,Hastings,Mcgrath,Spivey,Krause,Harden,Crabtree,Kirkpatrick,Hollis,Brandon,Arrington,Ervin,Clifton,Ritter,Mcghee,Bolden,Maloney,Gagnon,Dunbar,Ponce,Pike,Mayes,Heard,Beatty,Mobley,Kimball,Butts,Montes,Herbert,Grady,Eldridge,Braun,Hamm,Gibbons,Seymour,Moyer,Manley,Herron,Plummer,Elmore,Cramer,Gary,Rucker,Hilton,Blue,Pierson,Fontenot,Field,Rubio,Grace,Goldstein,Elkins,Wills,Novak,John,Hickey,Worley,Gorman,Katz,Dickinson,Broussard,Fritz,Woodruff,Crow,Christopher,Britton,Forrest,Nance,Lehman,Bingham,Zuniga,Whaley,Shafer,Coffman,Steward,Delarosa,Nix,Neely,Numbers,Mata,Manuel,Davila,Mccabe,Kessler,Emery,Bowling,Hinkle,Welsh,Pagan,Goldberg,Goins,Crouch,Cuevas,Quinones,Mcdermott,Hendrickson,Samuels,Denton,Bergeron,Lam,Ivey,Locke,Haines,Thurman,Snell,Hoskins,Byrne,Milton,Winston,Arthur,Arias,Stanford,Roe,Corbin,Beltran,Chappell,Hurt,Downey,Dooley,Tuttle,Couch,Payton,Mcelroy,Crockett,Groves,Clement,Leslie,Cartwright,Dickey,Mcgill,Dubois,Muniz,Erwin,Self,Tolbert,Dempsey,Cisneros,Sewell,Latham,Garland,Vigil,Tapia,Sterling,Rainey,Norwood,Lacy,Stroud,Meade,Amos,Tipton,Lord,Kuhn,Hilliard,Bonilla,Teague,Courtney,Gunn,Ho,Greenwood,Correa,Reece,Weston,Poe,Trent,Pineda,Phipps,Frey,Kaiser,Ames,Paige,Gunter,Schmitt,Milligan,Espinosa,Carlton,Bowden,Vickers,Lowry,Pritchard,Costello,Piper,Mcclellan,Lovell,Drew,Sheehan,Quick,Hatch,Dobson,Singh,Jeffries,Hollingsworth,Sorensen,Meza,Fink,Donnelly,Burrell,Bruno,Tomlinson,Colbert,Billings,Ritchie,Helton,Sutherland,Peoples,Mcqueen,Gaston,Thomason,Mckinley,Givens,Crocker,Vogel,Robison,Dunham,Coker,Swartz,Keys,Lilly,Ladner,Hannah,Willard,Richter,Hargrove,Edmonds,Brantley,Albright,Murdock,Boswell,Muller,Quintero,Padgett,Kenney,Daly,Connolly,Pierre,Inman,Quintana,Lund,Barnard,Villegas,Simons,Land,Huggins,Tidwell,Sanderson,Bullard,Mcclendon,Duarte,Draper,Meredith,Marrero,Dwyer,Abrams,Stover,Goode,Fraser,Crews,Bernal,Smiley,Godwin,Fish,Conklin,Mcneal,Baca,Esparza,Crowder,Bower,Nicholas,Chung,Brewster,Mcneill,Dick,Rodrigues,Leal,Coates,Raines,Mccain,Mccord,Miner,Holbrook,Swift,Dukes,Carlisle,Aldridge,Ackerman,Starks,Ricks,Holliday,Ferris,Hairston,Sheffield,Lange,Fountain,Marino,Doss,Betts,Kaplan,Carmichael,Bloom,Ruffin,Penn,Kern,Bowles,Sizemore,Larkin,Dupree,Jewell,Silver,Seals,Metcalf,Hutchison,Henley,Farr,Castle,Mccauley,Hankins,Gustafson,Deal,Curran,Ash,Waddell,Ramey,Cates,Pollock,Major,Irvin,Cummins,Messer,Heller,Dewitt,Lin,Funk,Cornett,Palacios,Galindo,Cano,Hathaway,Singer,Pham,Enriquez,Aaron,Salgado,Pelletier,Painter,Wiseman,Blount,Hand,Feliciano,Temple,Houser,Doherty,Mead,Mcgraw,Toney,Swan,Melvin,Capps,Blanco,Blackmon,Wesley,Thomson,Mcmanus,Fair,Burkett,Post,Gleason,Rudolph,Ott,Dickens,Cormier,Voss,Rushing,Rosenberg,Hurd,Dumas,Benitez,Arellano,Story,Marin,Caudill,Bragg,Jaramillo,Huerta,Gipson,Colvin,Biggs,Vela,Platt,Cassidy,Tompkins,Mccollum,Kay,Gabriel,Dolan,Daley,Crump,Street,Sneed,Kilgore,Grove,Grimm,Davison,Brunson,Prater,Marcum,Devine,Kyle,Dodge,Stratton,Rosas,Choi,Tripp,Ledbetter,Lay,Hightower,Haywood,Feldman,Epps,Yeager,Posey,Sylvester,Scruggs,Cope,Stubbs,Richey,Overton,Trotter,Sprague,Cordero,Butcher,Burger,Stiles,Burgos,Woodson,Horner,Bassett,Purcell,Haskins,Gee,Akins,Abraham,Hoyt,Ziegler,Spaulding,Hadley,Grubbs,Sumner,Murillo,Zavala,Shook,Lockwood,Jarrett,Driscoll,Dahl,Thorpe,Sheridan,Redmond,Putnam,Mcwilliams,Mcrae,Cornell,Felton,Romano,Joiner,Sadler,Hedrick,Hager,Hagen,Fitch,Coulter,Thacker,Mansfield,Langston,Guidry,Ferreira,Corley,Conn,Rossi,Lackey,Cody,Baez,Saenz,Mcnamara,Darnell,Michel,Mcmullen,Mckenna,Mcdonough,Link,Engel,Browne,Roper,Peacock,Eubanks,Drummond,Stringer,Pritchett,Parham,Mims,Landers,Ham,Grayson,Stacy,Schafer,Egan,Timmons,Ohara,Keen,Hamlin,Finn,Cortes,Mcnair,Louis,Clifford,Nadeau,Moseley,Michaud,Rosen,Oakes,Kurtz,Jeffers,Calloway,Beal,Bautista,Winn,Suggs,Stern,Stapleton,Lyles,Laird,Montano,Diamond,Dawkins,Roland,Hagan,Goldman,Bryson,Barajas,Lovett,Segura,Metz,Lockett,Langford,Hinson,Eastman,Rock,Hooks,Woody,Smallwood,Shapiro,Crowell,Whalen,Triplett,Hooker,Chatman,Aldrich,Cahill,Youngblood,Ybarra,Stallings,Sheets,Samuel,Reeder,Person,Pack,Lacey,Connelly,Bateman,Abernathy,Winkler,Wilkes,Masters,Hackett,Granger,Gillis,Schmitz,Sapp,Napier,Souza,Lanier,Gomes,Weir,Otero,Ledford,Burroughs,Babcock,Ventura,Siegel,Dugan,Clinton,Christie,Bledsoe,Atwood,Wray,Varner,Spangler,Otto,Anaya,Staley,Kraft,Fournier,Eddy,Belanger,Wolff,Thorne,Bynum,Burnette,Boykin,Swenson,Purvis,Pina,Khan,Duvall,Darby,Xiong,Kauffman,Ali,Yu,Healy,Engle,Corona,Benoit,Valle,Steiner,Spicer,Shaver,Randle,Lundy,Dow,Chin,Calvert,Staton,Neff,Kearney,Darden,Oakley,Medeiros,Mccracken,Crenshaw,Block,Beaver,Perdue,Dill,Whittaker,Tobin,Cornelius,Washburn,Hogue,Goodrich,Easley,Bravo,Dennison,Vera,Shipley,Kerns,Jorgensen,Crain,Abel,Villalobos,Maurer,Longoria,Keene,Coon,Sierra,Witherspoon,Staples,Pettit,Kincaid,Eason,Madrid,Echols,Lusk,Wu,Stahl,Currie,Thayer,Shultz,Sherwood,Mcnally,Seay,North,Maher,Kenny,Hope,Gagne,Barrow,Nava,Myles,Moreland,Honeycutt,Hearn,Diggs,Caron,Whitten,Westbrook,Stovall,Ragland,Queen,Munson,Meier,Looney,Kimble,Jolly,Hobson,London,Goddard,Culver,Burr,Presley,Negron,Connell,Tovar,Marcus,Huddleston,Hammer,Ashby,Salter,Root,Pendleton,Oleary,Nickerson,Myrick,Judd,Jacobsen,Elliot,Bain,Adair,Starnes,Sheldon,Matos,Light,Busby,Herndon,Hanley,Bellamy,Jack,Doty,Bartley,Yazzie,Rowell,Parson,Gifford,Cullen,Christiansen,Benavides,Barnhart,Talbot,Mock,Crandall,Connors,Bonds,Whitt,Gage,Bergman,Arredondo,Addison,Marion,Lujan,Dowdy,Jernigan,Huynh,Bouchard,Dutton,Rhoades,Ouellette,Kiser,Rubin,Herrington,Hare,Denny,Blackman,Babb,Allred,Rudd,Paulson,Ogden,Koenig,Jacob,Irving,Geiger,Begay,Parra,Champion,Lassiter,Hawk,Esposito,Cho,Waldron,Vernon,Ransom,Prather,Keenan,Jean,Grover,Chacon,Vick,Sands,Roark,Parr,Mayberry,Greenberg,Coley,Bruner,Whitman,Skaggs,Shipman,Means,Leary,Hutton,Romo,Medrano,Ladd,Kruse,Friend,Darling,Askew,Valentin,Schulz,Alfaro,Tabor,Mohr,Gallo,Bermudez,Pereira,Isaac,Bliss,Reaves,Flint,Comer,Boston,Woodall,Naquin,Guevara,Earl,Delong,Carrier,Pickens,Brand,Tilley,Schaffer,Read,Lim,Knutson,Fenton,Doran,Chu,Vogt,Vann,Prescott,Mclain,Landis,Corcoran,Ambrose,Zapata,Hyatt,Hemphill,Faulk,Call,Dove,Boudreaux,Aragon,Whitlock,Trejo,Tackett,Shearer,Saldana,Hanks,Gold,Driver,Mckinnon,Koehler,Champagne,Bourgeois,Pool,Keyes,Goodson,Foote,Early,Lunsford,Goldsmith,Flood,Winslow,Sams,Reagan,Mccloud,Hough,Esquivel,Naylor,Loomis,Coronado,Ludwig,Braswell,Bearden,Sherrill,Huang,Fagan,Ezell,Edmondson,Cyr,Cronin,Nunn,Lemon,Guillory,Grier,Dubose,Traylor,Ryder,Dobbins,Coyle,Aponte,Whitmore,Smalls,Rowan,Malloy,Cardona,Braxton,Borden,Humphries,Carrasco,Ruff,Metzger,Huntley,Hinojosa,Finney,Madsen,Hong,Hills,Ernst,Dozier,Burkhart,Bowser,Peralta,Daigle,Whittington,Sorenson,Saucedo,Roche,Redding,Loyd,Fugate,Avalos,Waite,Lind,Huston,Hay,Benedict,Hawthorne,Hamby,Boyles,Boles,Regan,Faust,Crook,Beam,Barger,Hinds,Gallardo,Elias,Willoughby,Willingham,Wilburn,Eckert,Busch,Zepeda,Worthington,Tinsley,Russ,Li,Hoff,Hawley,Carmona,Varela,Rector,Newcomb,Mallory,Kinsey,Dube,Whatley,Strange,Ragsdale,Ivy,Bernstein,Becerra,Yost,Mattson,Ly,Felder,Cheek,Luke,Handy,Grossman,Gauthier,Escobedo,Braden,Beckman,Mott,Hillman,Gil,Flaherty,Dykes,Doe,Stockton,Stearns,Lofton,Kitchen,Coats,Cavazos,Beavers,Barrios,Tang,Parish,Mosher,Lincoln,Cardwell,Coles,Burnham,Weller,Lemons,Beebe,Aguilera,Ring,Parnell,Harman,Couture,Alley,Schumacher,Redd,Dobbs,Blum,Blalock,Merchant,Ennis,Denson,Cottrell,Chester,Brannon,Bagley,Aviles,Watt,Sousa,Rosenthal,Rooney,Dietz,Blank,Paquette,Mcclelland,Duff,Velasco,Lentz,Grubb,Burrows,Barbour,Ulrich,Shockley,Rader,German,Beyer,Mixon,Layton,Altman,Alonzo,Weathers,Titus,Stoner,Squires,Shipp,Priest,Lipscomb,Cutler,Caballero,Zimmer,Willett,Thurston,Storey,Medley,Lyle,Epperson,Shah,Mcmillian,Baggett,Torrez,Laws,Hirsch,Dent,Corey,Poirier,Peachey,Jacques,Farrar,Creech,Barth,Trimble,France,Dupre,Albrecht,Sample,Lawler,Crisp,Conroy,Chadwick,Wetzel,Nesbitt,Murry,Jameson,Wilhelm,Patten,Minton,Matson,Kimbrough,Iverson,Guinn,Gale,Fortune,Croft,Toth,Pulliam,Nugent,Newby,Littlejohn,Dias,Canales,Bernier,Baron,Barney,Singletary,Renteria,Pruett,Mchugh,Mabry,Landrum,Brower,Weldon,Stoddard,Ruth,Cagle,Stjohn,Scales,Kohler,Kellogg,Hopson,Gant,Tharp,Gann,Zeigler,Pringle,Hammons,Fairchild,Deaton,Chavis,Carnes,Rowley,Matlock,Libby,Kearns,Irizarry,Carrington,Starkey,Pepper,Lopes,Jarrell,Fay,Craven,Beverly,Baum,Spain,Littlefield,Linn,Humphreys,Hook,High,Etheridge,Cuellar,Chastain,Chance,Bundy,Speer,Skelton,Quiroz,Pyle,Portillo,Ponder,Moulton,Machado,Liu,Killian,Hutson,Hitchcock,Ellsworth,Dowling,Cloud,Burdick,Spann,Pedersen,Levin,Leggett,Hayward,Hacker,Dietrich,Beaulieu,Barksdale,Wakefield,Snowden,Paris,Briscoe,Bowie,Berman,Ogle,Mcgregor,Laughlin,Helm,Burden,Wheatley,Schreiber,Pressley,Parris,Ng,Alaniz,Agee,Urban,Swann,Snodgrass,Schuster,Radford,Monk,Mattingly,Main,Lamar,Harp,Girard,Cheney,Yancey,Wagoner,Ridley,Lombardo,Lau,Hudgins,Gaskins,Duckworth,Coe,Coburn,Willey,Prado,Newberry,Magana,Hammonds,Elam,Whipple,Slade,Serna,Ojeda,Liles,Dorman,Diehl,Angel,Upton,Reardon,Michaels,Kelsey,Goetz,Eller,Bauman,Baer,Augustine,Layne,Hummel,Brenner,Amaya,Adamson,Ornelas,Dowell,Cloutier,Christy,Castellanos,Wing,Wellman,Saylor,Orourke,Moya,Montalvo,Kilpatrick,Harley,Durbin,Shell,Oldham,Kang,Garvin,Foss,Branham,Bartholomew,Templeton,Maguire,Holton,Alonso,Rider,Monahan,Mccormack,Beaty,Anders,Streeter,Nieto,Nielson,Moffett,Lankford,Keating,Heck,Gatlin,Delatorre,Callaway,Adcock,Worrell,Unger,Robinette,Nowak,Jeter,Brunner,Ashton,Steen,Parrott,Overstreet,Nobles,Montanez,Luther,Clevenger,Brinkley,Trahan,Quarles,Pickering,Pederson,Jansen,Grantham,Gilchrist,Crespo,Aiken,Schell,Schaeffer,Lorenz,Leyva,Harms,Dyson,Wallis,Pease,Leavitt,Hyman,Cheng,Cavanaugh,Batts,Warden,Seaman,Rockwell,Quezada,Paxton,Linder,Houck,Fontaine,Durant,Caruso,Adler,Pimentel,Mize,Lytle,Donald,Cleary,Cason,Acker,Switzer,Salmon,Isaacs,Higginbotham,Han,Waterman,Vandyke,Stamper,Sisk,Shuler,Riddick,Redman,Mcmahan,Levesque,Hatton,Bronson,Bollinger,Arnett,Okeefe,Gerber,Gannon,Farnsworth,Baughman,Silverman,Satterfield,Royal,Mccrary,Kowalski,Joy,Grigsby,Greco,Cabral,Trout,Rinehart,Mahon,Linton,Gooden,Curley,Baugh,Wyman,Weiner,Schwab,Schuler,Morrissey,Mahan,Coy,Bunn,Andrew,Thrasher,Spear,Waggoner,Shelley,Robert,Qualls,Purdy,Mcwhorter,Mauldin,Mark,Jordon,Gilman,Perryman,Newsom,Menard,Martino,Graf,Billingsley,Artis,Simpkins,Salisbury,Quintanilla,Gilliland,Fraley,Foust,Crouse,Scarborough,Ngo,Grissom,Fultz,Rico,Marlow,Markham,Madrigal,Lawton,Barfield,Whiting,Varney,Schwarz,Huey,Gooch,Arce,Wheat,Truong,Poulin,Mackenzie,Leone,Hurtado,Selby,Gaither,Fortner,Culpepper,Coughlin,Brinson,Boudreau,Barkley,Bales,Stepp,Holm,Tan,Schilling,Morrell,Kahn,Heaton,Gamez,Douglass,Causey,Brothers,Turpin,Shanks,Schrader,Meek,Isom,Hardison,Carranza,Yanez,Way,Scroggins,Schofield,Runyon,Ratcliff,Murrell,Moeller,Irby,Currier,Butterfield,Yee,Ralston,Pullen,Pinson,Estep,East,Carbone,Lance,Hawks,Ellington,Casillas,Spurlock,Sikes,Motley,Mccartney,Kruger,Isbell,Houle,Francisco,Burk,Bone,Tomlin,Shelby,Quigley,Neumann,Lovelace,Fennell,Colby,Cheatham,Bustamante,Skidmore,Hidalgo,Forman,Culp,Bowens,Betancourt,Aquino,Robb,Rea,Milner,Martel,Gresham,Wiles,Ricketts,Gavin,Dowd,Collazo,Bostic,Blakely,Sherrod,Power,Kenyon,Gandy,Ebert,Deloach,Cary,Bull,Allard,Sauer,Robins,Olivares,Gillette,Chestnut,Bourque,Paine,Lyman,Hite,Hauser,Devore,Crawley,Chapa,Vu,Tobias,Talbert,Poindexter,Millard,Meador,Mcduffie,Mattox,Kraus,Harkins,Choate,Bess,Wren,Sledge,Sanborn,Outlaw,Kinder,Geary,Cornwell,Barclay,Adam,Abney,Seward,Rhoads,Howland,Fortier,Easter,Benner,Vines,Tubbs,Troutman,Rapp,Noe,Mccurdy,Harder,Deluca,Westmoreland,South,Havens,Guajardo,Ely,Clary,Seal,Meehan,Herzog,Guillen,Ashcraft,Waugh,Renner,Milam,Jung,Elrod,Churchill,Buford,Breaux,Bolin,Asher,Windham,Tirado,Pemberton,Nolen,Noland,Knott,Emmons,Cornish,Christenson,Brownlee,Barbee,Waldrop,Pitt,Olvera,Lombardi,Gruber,Gaffney,Eggleston,Banda,Archuleta,Still,Slone,Prewitt,Pfeiffer,Nettles,Mena,Mcadams,Henning,Gardiner,Cromwell,Chisholm,Burleson,Box,Vest,Oglesby,Mccarter,Malcolm,Lumpkin,Larue,Grey,Wofford,Vanhorn,Thorn,Teel,Swafford,Stclair,Stanfield,Ocampo,Herrmann,Hannon,Arsenault,Roush,Mcalister,Hiatt,Gunderson,Forsythe,Duggan,Delvalle,Cintron,Wilks,Weinstein,Uribe,Rizzo,Noyes,Mclendon,Gurley,Bethea,Winstead,Maples,Harry,Guyton,Giordano,Alderman,Valdes,Polanco,Pappas,Lively,Grogan,Griffiths,Bobo,Arevalo,Whitson,Sowell,Rendon,Matthew,Julian,Fernandes,Farrow,Edmond,Benavidez,Ayres,Alicea,Stump,Smalley,Seitz,Schulte,Gilley,Gallant,Dewey,Casper,Canfield,Wolford,Omalley,Mcnutt,Mcnulty,Mcgovern,Hardman,Harbin,Cowart,Chavarria,Brink,Beckett,Bagwell,Armstead,Anglin,Abreu,Reynoso,Krebs,Jett,Hoffmann,Greenfield,Forte,Burney,Broome,Sisson,Parent,Jude,Younger,Trammell,Partridge,Marvin,Mace,Lomax,Lemieux,Gossett,Frantz,Fogle,Cooney,Broughton,Pence,Paulsen,Neil,Muncy,Mcarthur,Hollins,Edward,Beauchamp,Withers,Osorio,Mulligan,Hoyle,Foy,Dockery,Cockrell,Begley,Amador,Roby,Rains,Lindquist,Gentile,Everhart,Bohannon,Wylie,Thao,Sommers,Purnell,Palma,Fortin,Dunning,Breeden,Vail,Phelan,Phan,Marx,Cosby,Colburn,Chong,Boling,Biddle,Ledesma,Gaddis,Denney,Chow,Bueno,Berrios,Wicker,Tolliver,Thibodeaux,Nagle,Lavoie,Fisk,Do,Crist,Barbosa,Reedy,March,Locklear,Kolb,Himes,Behrens,Beckwith,Beckham,Weems,Wahl,Shorter,Shackelford,Rees,Muse,Free,Cerda,Valadez,Thibodeau,Saavedra,Ridgeway,Reiter,Mchenry,Majors,Lachance,Keaton,Israel,Ferrara,Falcon,Clemens,Blocker,Applegate,Paz,Needham,Mojica,Kuykendall,Hamel,Escamilla,Doughty,Burchett,Ainsworth,Wilbur,Vidal,Upchurch,Thigpen,Strauss,Spruill,Sowers,Riggins,Ricker,Mccombs,Harlow,Garnett,Buffington,Yi,Sotelo,Olivas,Negrete,Morey,Macon,Logsdon,Lapointe,Florence,Cathey,Bigelow,Bello,Westfall,Stubblefield,Peak,Lindley,Jeffrey,Hein,Hawes,Farrington,Edge,Breen,Birch,Wilde,Steed,Sepulveda,Reinhardt,Proffitt,Minter,Messina,Mcnabb,Maier,Keeler,Gamboa,Donohue,Dexter,Basham,Shinn,Orlando,Crooks,Cota,Borders,Bills,Bachman,Tisdale,Tavares,Schmid,Pickard,Jasper,Gulley,Fonseca,Delossantos,Condon,Clancy,Batista,Wicks,Wadsworth,New,Martell,Lo,Littleton,Ison,Haag,Folsom,Brumfield,Broyles,Brito,Mireles,Mcdonnell,Leclair,Hamblin,Gough,Fanning,Binder,Winfield,Whitworth,Soriano,Palumbo,Newkirk,Mangum,Hutcherson,Comstock,Cecil,Carlin,Beall,Bair,Wendt,Watters,Walling,Putman,Otoole,Oliva,Morley,Mares,Lemus,Keener,Jeffery,Hundley,Dial,Damico,Billups,Strother,Mcfarlane,Lamm,Eaves,Crutcher,Caraballo,Canty,Atwell,Taft,Siler,Rust,Rawls,Rawlings,Prieto,Niles,Mcneely,Mcafee,Hulsey,Harlan,Hackney,Galvez,Escalante,Delagarza,Crider,Charlton,Bandy,Wilbanks,Stowe,Steinberg,Samson,Renfro,Masterson,Massie,Lanham,Haskell,Hamrick,Fort,Dehart,Card,Burdette,Branson,Bourne,Babin,Aleman,Worthy,Tibbs,Sweat,Smoot,Slack,Paradis,Packard,Mull,Luce,Houghton,Gantt,Furman,Danner,Christianson,Burge,Broderick,Ashford,Arndt,Almeida,Stallworth,Shade,Searcy,Sager,Noonan,Mclemore,Mcintire,Maxey,Lavigne,Jobe,Ireland,Ferrer,Falk,Edgar,Coffin,Byrnes,Aranda,Apodaca,Stamps,Rounds,Peek,Olmstead,Lewandowski,Kaminski,Her,Dunaway,Bruns,Brackett,Amato,Reich,Mcclung,Lacroix,Koontz,Herrick,Hardesty,Flanders,Cousins,Close,Cato,Cade,Vickery,Shank,Nagel,Dupuis,Croteau,Cotter,Cable,Stuckey,Stine,Porterfield,Pauley,Nye,Moffitt,Lu,Knudsen,Hardwick,Goforth,Dupont,Blunt,Barrows,Barnhill,Shull,Rash,Ralph,Penny,Lorenzo,Loftis,Lemay,Kitchens,Horvath,Grenier,Fuchs,Fairbanks,Culbertson,Calkins,Burnside,Beattie,Ashworth,Albertson,Wertz,Vo,Vaught,Vallejo,Tyree,Turk,Tuck,Tijerina,Sage,Picard,Peterman,Otis,Marroquin,Marr,Lantz,Hoang,Demarco,Daily,Cone,Berube,Barnette,Wharton,Stinnett,Slocum,Scanlon,Sander,Pinto,Mancuso,Lima,Judge,Headley,Epstein,Counts,Clarkson,Carnahan,Brice,Boren,Arteaga,Adame,Zook,Whittle,Whitehurst,Wenzel,Saxton,Rhea,Reddick,Puente,Hazel,Handley,Haggerty,Earley,Devlin,Dallas,Chaffin,Cady,Ahmed,Acuna,Solano,Sigler,Pollack,Pendergrass,Ostrander,Janes,Francois,Fine,Crutchfield,Cordell,Chamberlin,Brubaker,Baptiste,Willson,Reis,Neeley,Mullin,Mercier,Lira,Layman,Keeling,Higdon,Guest,Forrester,Espinal,Dion,Chapin,Carl,Warfield,Toledo,Pulido,Peebles,Nagy,Montague,Mello,Lear,Jaeger,Hogg,Graff,Furr,Derrick,Cave,Canada,Soliz,Poore,Mendenhall,Mclaurin,Maestas,Low,Gable,Belt,Barraza,Tillery,Snead,Pond,Neill,Mcculloch,Mccorkle,Lightfoot,Hutchings,Holloman,Harness,Dorn,Council,Bock,Zielinski,Turley,Treadwell,Stpierre,Starling,Somers,Oswald,Merrick,Marquis,Ivory,Easterling,Bivens,Truitt,Poston,Parry,Ontiveros,Olivarez,Neville,Moreau,Medlin,Ma,Lenz,Knowlton,Fairley,Cobbs,Chisolm,Bannister,Woodworth,Toler,Ocasio,Noriega,Neuman,Moye,Milburn,Mcclanahan,Lilley,Hanes,Flannery,Dellinger,Danielson,Conti,Blodgett,Beers,Weatherford,Strain,Karr,Hitt,Denham,Custer,Coble,Clough,Casteel,Bolduc,Batchelor,Ammons,Whitlow,Tierney,Staten,Sibley,Seifert,Schubert,Salcedo,Mattison,Laney,Haggard,Grooms,Dix,Dees,Cromer,Cooks,Colson,Caswell,Zarate,Swisher,Stacey,Shin,Ragan,Pridgen,Mcvey,Matheny,Leigh,Lafleur,Franz,Ferraro,Dugger,Whiteside,Rigsby,Mcmurray,Lehmann,Large,Jacoby,Hildebrand,Hendrick,Headrick,Goad,Fincher,Drury,Borges,Archibald,Albers,Woodcock,Trapp,Soares,Seaton,Richie,Monson,Luckett,Lindberg,Kopp,Keeton,Hsu,Healey,Garvey,Gaddy,Fain,Burchfield,Badger,Wentworth,Strand,Stack,Spooner,Saucier,Sales,Ruby,Ricci,Plunkett,Pannell,Ness,Leger,Hoy,Freitas,Fong,Elizondo,Duval,Chun,Calvin,Beaudoin,Urbina,Stock,Rickard,Partin,Moe,Mcgrew,Mcclintock,Ledoux,Forsyth,Faison,Devries,Bertrand,Wasson,Tilton,Scarbrough,Pride,Oh,Leung,Larry,Irvine,Garber,Denning,Corral,Colley,Castleberry,Bowlin,Bogan,Beale,Baines,True,Trice,Rayburn,Parkinson,Pak,Nunes,Mcmillen,Leahy,Lea,Kimmel,Higgs,Fulmer,Carden,Bedford,Taggart,Spearman,Register,Prichard,Morrill,Koonce,Heinz,Hedges,Guenther,Grice,Findley,Earle,Dover,Creighton,Boothe,Bayer,Arreola,Vitale,Valles,See,Raney,Peter,Osgood,Lowell,Hanlon,Burley,Bounds,Worden,Weatherly,Vetter,Tanaka,Stiltner,Sell,Nevarez,Mosby,Montero,Melancon,Harter,Hamer,Goble,Gladden,Gist,Ginn,Akin,Zaragoza,Towns,Tarver,Sammons,Royster,Oreilly,Muir,Morehead,Luster,Kingsley,Kelso,Grisham,Glynn,Baumann,Alves,Yount,Tamayo,Tam,Paterson,Oates,Menendez,Longo,Hargis,Greenlee,Gillen,Desantis,Conover,Breedlove,Wayne,Sumpter,Scherer,Rupp,Reichert,Heredia,Fallon,Creel,Cohn,Clemmons,Casas,Bickford,Belton,Bach,Williford,Whitcomb,Tennant,Sutter,Stull,Sessions,Mccallum,Manson,Langlois,Keel,Keegan,Emanuel,Dangelo,Dancy,Damron,Clapp,Clanton,Bankston,Trinidad,Oliveira,Mintz,Mcinnis,Martens,Mabe,Laster,Jolley,Irish,Hildreth,Hefner,Glaser,Duckett,Demers,Brockman,Blais,Back,Alcorn,Agnew,Toliver,Tice,Song,Seeley,Najera,Musser,Mcfall,Laplante,Galvin,Fajardo,Doan,Coyne,Copley,Clawson,Cheung,Barone,Wynne,Woodley,Tremblay,Stoll,Sparrow,Sparkman,Schweitzer,Sasser,Samples,Roney,Ramon,Legg,Lai,Joe,Heim,Farias,Concepcion,Colwell,Christman,Bratcher,Alba,Winchester,Upshaw,Southerland,Sorrell,Shay,Sells,Mount,Mccloskey,Martindale,Luttrell,Loveless,Lovejoy,Linares,Latimer,Holly,Embry,Coombs,Bratton,Bostick,Boss,Venable,Tuggle,Toro,Staggs,Sandlin,Jefferies,Heckman,Griffis,Crayton,Clem,Button,Browder,Allan,Thorton,Sturgill,Sprouse,Royer,Rousseau,Ridenour,Pogue,Perales,Peeples,Metzler,Mesa,Mccutcheon,Mcbee,Jay,Hornsby,Heffner,Corrigan,Armijo,Vue,Romeo,Plante,Peyton,Paredes,Macklin,Hussey,Hodgson,Granados,Frias,Carman,Brent,Becnel,Batten,Almanza,Turney,Teal,Sturgeon,Meeker,Mcdaniels,Limon,Keeney,Kee,Hutto,Holguin,Gorham,Fishman,Fierro,Blanchette,Rodrigue,Reddy,Osburn,Oden,Lerma,Kirkwood,Keefer,Haugen,Hammett,Chalmers,Carlos,Brinkman,Baumgartner,Zhang,Valerio,Tellez,Steffen,Shumate,Sauls,Ripley,Kemper,Jacks,Guffey,Evers,Craddock,Carvalho,Blaylock,Banuelos,Balderas,Wooden,Wheaton,Turnbull,Shuman,Pointer,Mosier,Mccue,Ligon,Kozlowski,Johansen,Ingle,Herr,Briones,Southern,Snipes,Rickman,Pipkin,Peace,Pantoja,Orosco,Moniz,Lawless,Kunkel,Hibbard,Galarza,Enos,Bussey,Settle,Schott,Salcido,Perreault,Mcdougal,Mccool,Haight,Garris,Ferry,Easton,Conyers,Atherton,Wimberly,Utley,Stephen,Spellman,Smithson,Slagle,Skipper,Ritchey,Rand,Petit,Osullivan,Oaks,Nutt,Mcvay,Mccreary,Mayhew,Knoll,Jewett,Harwood,Hailey,Cardoza,Ashe,Arriaga,Andres,Zeller,Wirth,Whitmire,Stauffer,Spring,Rountree,Redden,Mccaffrey,Martz,Loving,Larose,Langdon,Humes,Gaskin,Faber,Doll,Devito,Cass,Almond,Wingfield,Wingate,Villareal,Tyner,Smothers,Severson,Reno,Pennell,Maupin,Leighton,Janssen,Hassell,Hallman,Halcomb,Folse,Fitzsimmons,Fahey,Cranford,Bolen,Battles,Battaglia,Wooldridge,Weed,Trask,Rosser,Regalado,Mcewen,Keefe,Fuqua,Echevarria,Domingo,Dang,Caro,Boynton,Andrus,Wild,Viera,Vanmeter,Taber,Spradlin,Seibert,Provost,Prentice,Oliphant,Laporte,Hwang,Hatchett,Hass,Greiner,Freedman,Covert,Chilton,Byars,Wiese,Venegas,Swank,Shrader,Roderick,Roberge,Mullis,Mortensen,Mccune,Marlowe,Kirchner,Keck,Isaacson,Hostetler,Halverson,Gunther,Griswold,Gerard,Fenner,Durden,Blackwood,Bertram,Ahrens,Sawyers,Savoy,Nabors,Mcswain,Mackay,Loy,Lavender,Lash,Labbe,Jessup,Hubert,Fullerton,Donnell,Cruse,Crittenden,Correia,Centeno,Caudle,Canady,Callender,Alarcon,Ahern,Winfrey,Tribble,Tom,Styles,Salley,Roden,Musgrove,Minnick,Fortenberry,Carrion,Bunting,Bethel,Batiste,Woo,Whited,Underhill,Stillwell,Silvia,Rauch,Pippin,Perrin,Messenger,Mancini,Lister,Kinard,Hartmann,Fleck,Broadway,Wilt,Treadway,Thornhill,Speed,Spalding,Sam,Rafferty,Pitre,Patino,Ordonez,Linkous,Kelleher,Homan,Holiday,Galbraith,Feeney,Dorris,Curtin,Coward,Camarillo,Buss,Bunnell,Bolt,Beeler,Autry,Alcala,Witte,Wentz,Stidham,Shively,Nunley,Meacham,Martins,Lemke,Lefebvre,Kaye,Hynes,Horowitz,Hoppe,Holcombe,Estrella,Dunne,Derr,Cochrane,Brittain,Bedard,Beauregard,Torrence,Strunk,Soria,Simonson,Shumaker,Scoggins,Packer,Oconner,Moriarty,Leroy,Kuntz,Ives,Hutcheson,Horan,Hales,Garmon,Fitts,Dell,Bohn,Atchison,Worth,Wisniewski,Will,Vanwinkle,Sturm,Sallee,Prosser,Moen,Lundberg,Kunz,Kohl,Keane,Jorgenson,Jaynes,Funderburk,Freed,Frame,Durr,Creamer,Cosgrove,Candelaria,Berlin,Batson,Vanhoose,Thomsen,Teeter,Sommer,Smyth,Sena,Redmon,Orellana,Maness,Lennon,Heflin,Goulet,Frick,Forney,Dollar,Bunker,Asbury,Aguiar,Talbott,Southard,Pleasant,Mowery,Mears,Lemmon,Krieger,Hickson,Gracia,Elston,Duong,Delgadillo,Dayton,Dasilva,Conaway,Catron,Bruton,Bradbury,Bordelon,Bivins,Bittner,Bergstrom,Beals,Abell,Whelan,Travers,Tejada,Pulley,Pino,Norfleet,Nealy,Maes,Loper,Held,Gerald,Gatewood,Frierson,Freund,Finnegan,Cupp,Covey,Catalano,Boehm,Bader,Yoon,Walston,Tenney,Sipes,Roller,Rawlins,Medlock,Mccaskill,Mccallister,Marcotte,Maclean,Hughey,Henke,Harwell,Gladney,Gilson,Dew,Chism,Caskey,Brandenburg,Baylor,Villasenor,Veal,Van,Thatcher,Stegall,Shore,Petrie,Nowlin,Navarrete,Muhammad,Lombard,Loftin,Lemaster,Kroll,Kovach,Kimbrell,Kidwell,Hershberger,Fulcher,Eng,Cantwell,Bustos,Boland,Bobbitt,Binkley,Wester,Weis,Verdin,Tong,Tiller,Sisco,Sharkey,Seymore,Rosenbaum,Rohr,Quinonez,Pinkston,Nation,Malley,Logue,Lessard,Lerner,Lebron,Krauss,Klinger,Halstead,Haller,Getz,Burrow,Brant,Alger,Victor,Shores,Scully,Pounds,Pfeifer,Perron,Nelms,Munn,Mcmaster,Mckenney,Manns,Knudson,Hutchens,Huskey,Goebel,Flagg,Cushman,Click,Castellano,Carder,Bumgarner,Blaine,Bible,Wampler,Spinks,Robson,Neel,Mcreynolds,Mathias,Maas,Loera,Kasper,Jose,Jenson,Florez,Coons,Buckingham,Brogan,Berryman,Wilmoth,Wilhite,Thrash,Shephard,Seidel,Schulze,Roldan,Pettis,Obryan,Maki,Mackie,Hatley,Frazer,Fiore,Falls,Chesser,Bui,Bottoms,Bisson,Benefield,Allman,Wilke,Trudeau,Timm,Shifflett,Rau,Mundy,Milliken,Mayers,Leake,Kohn,Huntington,Horsley,Hermann,Guerin,Fryer,Frizzell,Foret,Flemming,Fife,Criswell,Carbajal,Bozeman,Boisvert,Archie,Antonio,Angulo,Wallen,Tapp,Silvers,Ramsay,Oshea,Orta,Moll,Mckeever,Mcgehee,Luciano,Linville,Kiefer,Ketchum,Howerton,Groce,Gaylord,Gass,Fusco,Corbitt,Blythe,Betz,Bartels,Amaral,Aiello,Yoo,Weddle,Troy,Sun,Sperry,Seiler,Runyan,Raley,Overby,Osteen,Olds,Mckeown,Mauro,Matney,Lauer,Lattimore,Hindman,Hartwell,Fredrickson,Fredericks,Espino,Clegg,Carswell,Cambell,Burkholder,August,Woodbury,Welker,Totten,Thornburg,Theriault,Stitt,Stamm,Stackhouse,Simone,Scholl,Saxon,Rife,Razo,Quinlan,Pinkerton,Olivo,Nesmith,Nall,Mattos,Leak,Lafferty,Justus,Giron,Geer,Fielder,Eagle,Drayton,Dortch,Conners,Conger,Chau,Boatwright,Billiot,Barden,Armenta,Antoine,Tibbetts,Steadman,Slattery,Sides,Rinaldi,Raynor,Rayford,Pinckney,Pettigrew,Nickel,Milne,Matteson,Halsey,Gonsalves,Fellows,Durand,Desimone,Cowley,Cowles,Brill,Barham,Barela,Barba,Ashmore,Withrow,Valenti,Tejeda,Spriggs,Sayre,Salerno,Place,Peltier,Peel,Merriman,Matheson,Lowman,Lindstrom,Hyland,Homer,Ha,Giroux,Fries,Frasier,Earls,Dugas,Damon,Dabney,Collado,Briseno,Baxley,Andre,Word,Whyte,Wenger,Vanover,Vanburen,Thiel,Schindler,Schiller,Rigby,Pomeroy,Passmore,Marble,Manzo,Mahaffey,Lindgren,Laflamme,Greathouse,Fite,Ferrari,Calabrese,Bayne,Yamamoto,Wick,Townes,Thames,Steel,Reinhart,Peeler,Naranjo,Montez,Mcdade,Mast,Markley,Marchand,Leeper,Kong,Kellum,Hudgens,Hennessey,Hadden,Guess,Gainey,Coppola,Borrego,Bolling,Beane,Ault,Slaton,Poland,Pape,Null,Mulkey,Lightner,Langer,Hillard,Glasgow,Fabian,Ethridge,Enright,Derosa,Baskin,Alfred,Weinberg,Turman,Tinker,Somerville,Pardo,Noll,Lashley,Ingraham,Hiller,Hendon,Glaze,Flora,Cothran,Cooksey,Conte,Carrico,Apple,Abner,Wooley,Swope,Summerlin,Sturgis,Sturdivant,Stott,Spurgeon,Spillman,Speight,Roussel,Popp,Nutter,Mckeon,Mazza,Magnuson,Lanning,Kozak,Jankowski,Heyward,Forster,Corwin,Callaghan,Bays,Wortham,Usher,Theriot,Sayers,Sabo,Rupert,Poling,Nathan,Loya,Lieberman,Levi,Laroche,Labelle,Howes,Harr,Garay,Fogarty,Everson,Durkin,Dominquez,Chaves,Chambliss,Alfonso,Witcher,Wilber,Vieira,Vandiver,Terrill,Stoker,Schreiner,Nestor,Moorman,Liddell,Lew,Lawhorn,Krug,Irons,Hylton,Hollenbeck,Herrin,Hembree,Hair,Goolsby,Goodin,Gilmer,Foltz,Dinkins,Daughtry,Caban,Brim,Briley,Bilodeau,Bear,Wyant,Vergara,Tallent,Swearingen,Stroup,Sherry,Scribner,Roger,Quillen,Pitman,Monaco,Mccants,Maxfield,Martinson,Landon,Holtz,Flournoy,Brookins,Brody,Baumgardner,Angelo,Straub,Sills,Roybal,Roundtree,Oswalt,Money,Mcgriff,Mcdougall,Mccleary,Maggard,Gragg,Gooding,Godinez,Doolittle,Donato,Cowell,Cassell,Bracken,Appel,Ahmad,Zambrano,Reuter,Perea,Olive,Nakamura,Monaghan,Mickens,Mcclinton,Mcclary,Marler,Kish,Judkins,Gilbreath,Freese,Flanigan,Felts,Erdmann,Dodds,Chew,Brownell,Brazil,Boatright,Barreto,Slayton,Sandberg,Saldivar,Pettway,Odum,Narvaez,Moultrie,Montemayor,Merrell,Lees,Keyser,Hoke,Hardaway,Hannan,Gilbertson,Fogg,Dumont,Deberry,Coggins,Carrera,Buxton,Bucher,Broadnax,Beeson,Araujo,Appleton,Amundson,Aguayo,Ackley,Yocum,Worsham,Shivers,Shelly,Sanches,Sacco,Robey,Rhoden,Pender,Ochs,Mccurry,Madera,Luong,Luis,Knotts,Jackman,Heinrich,Hargrave,Gault,Forest,Comeaux,Chitwood,Child,Caraway,Boettcher,Bernhardt,Barrientos,Zink,Wickham,Whiteman,Thorp,Stillman,Settles,Schoonover,Roque,Riddell,Rey,Pilcher,Phifer,Novotny,Maple,Macleod,Hardee,Haase,Grider,Fredrick,Earnest,Doucette,Clausen,Christmas,Bevins,Beamon,Badillo,Tolley,Tindall,Soule,Snook,Sebastian,Seale,Pitcher,Pinkney,Pellegrino,Nowell,Nemeth,Nail,Mondragon,Mclane,Lundgren,Ingalls,Hudspeth,Hixson,Gearhart,Furlong,Downes,Dionne,Dibble,Deyoung,Cornejo,Camara,Brookshire,Boyette,Wolcott,Tracey,Surratt,Sellars,Segal,Salyer,Reeve,Rausch,Philips,Labonte,Haro,Gower,Freeland,Fawcett,Eads,Driggers,Donley,Collett,Cage,Bromley,Boatman,Ballinger,Baldridge,Volz,Trombley,Stonge,Silas,Shanahan,Rivard,Rhyne,Pedroza,Matias,Mallard,Jamieson,Hedgepeth,Hartnett,Estevez,Eskridge,Denman,Chiu,Chinn,Catlett,Carmack,Buie,Book,Bechtel,Beardsley,Bard,Ballou,Windsor,Ulmer,Storm,Skeen,Robledo,Rincon,Reitz,Piazza,Pearl,Munger,Moten,Mcmichael,Loftus,Ledet,Kersey,Groff,Fowlkes,Folk,Crumpton,Collette,Clouse,Bettis,Villagomez,Timmerman,Strom,Saul,Santoro,Roddy,Phillip,Penrod,Musselman,Macpherson,Leboeuf,Harless,Haddad,Guido,Golding,Fulkerson,Fannin,Dulaney,Dowdell,Deane,Cottle,Ceja,Cate,Bosley,Benge,Albritton,Voigt,Trowbridge,Soileau,Seely,Rome,Rohde,Pearsall,Paulk,Orth,Nason,Mota,Mcmullin,Marquardt,Madigan,Hoag,Gillum,Gayle,Gabbard,Fenwick,Fender,Eck,Danforth,Cushing,Cress,Creed,Cazares,Casanova,Bey,Bettencourt,Barringer,Baber,Stansberry,Schramm,Rutter,Rivero,Race,Oquendo,Necaise,Mouton,Montenegro,Miley,Mcgough,Marra,Macmillan,Lock,Lamontagne,Jasso,Jaime,Horst,Hetrick,Heilman,Gaytan,Gall,Fried,Fortney,Eden,Dingle,Desjardins,Dabbs,Burbank,Brigham,Breland,Beaman,Banner,Arriola,Yarborough,Wallin,Treat,Toscano,Stowers,Reiss,Pichardo,Orton,Mitchel,Michels,Mcnamee,Mccrory,Leatherman,Kell,Keister,Jerome,Horning,Hargett,Guay,Friday,Ferro,Deboer,Dagostino,Clemente,Christ,Carper,Bowler,Blanks,Beaudry,Willie,Towle,Tafoya,Stricklin,Strader,Soper,Sonnier,Sigmon,Schenk,Saddler,Rodman,Pedigo,Mendes,Lunn,Lohr,Lahr,Kingsbury,Jarman,Hume,Holliman,Hofmann,Haworth,Harrelson,Hambrick,Flick,Edmunds,Dacosta,Crossman,Colston,Chaplin,Carrell,Budd,Weiler,Waits,Viola,Valentino,Trantham,Tarr,Straight,Solorio,Roebuck,Powe,Plank,Pettus,Palm,Pagano,Mink,Luker,Leathers,Joslin,Hartzell,Gambrell,Fears,Deutsch,Cepeda,Carty,Caputo,Brewington,Bedell,Ballew,Applewhite,Warnock,Walz,Urena,Tudor,Reel,Pigg,Parton,Mickelson,Meagher,Mclellan,Mcculley,Mandel,Leech,Lavallee,Kraemer,Kling,Kipp,Kingston,Kehoe,Hochstetler,Harriman,Gregoire,Grabowski,Gosselin,Gammon,Fancher,Edens,Desai,Butt,Brannan,Armendariz,Woolsey,Whitehouse,Whetstone,Ussery,Towne,Tower,Testa,Tallman,Studer,Strait,Steinmetz,Sorrells,Sauceda,Rolfe,Rae,Paddock,Mitchem,Mcginn,Mccrea,Luck,Lovato,Ling,Hazen,Gilpin,Gaynor,Fike,Devoe,Delrio,Curiel,Burkhardt,Bristol,Bode,Backus,Alton,Zinn,Watanabe,Wachter,Vanpelt,Turnage,Shaner,Schroder,Sato,Riordan,Quimby,Portis,Natale,Mckoy,Mccown,Marker,Lucio,Kilmer,Karl,Hotchkiss,Hesse,Halbert,Gwinn,Godsey,Desmond,Delisle,Chrisman,Canter,Brook,Arbogast,Angell,Acree,Yancy,Woolley,Wesson,Weatherspoon,Trainor,Stockman,Spiller,Sipe,Rooks,Reavis,Propst,Porras,Neilson,Mullens,Loucks,Llewellyn,Lamont,Kumar,Koester,Klingensmith,Kirsch,Kester,Honaker,Hodson,Hennessy,Helmick,Garrity,Garibay,Fee,Drain,Casarez,Callis,Botello,Bay,Aycock,Avant,Angle,Wingard,Wayman,Tully,Theisen,Szymanski,Stansbury,Segovia,Rudy,Rainwater,Preece,Pirtle,Padron,Mincey,Mckelvey,Mathes,Marty,Larrabee,Kornegay,Klug,Judy,Ingersoll,Hecht,Germain,Eggers,Dykstra,Denis,Deering,Decoteau,Deason,Dearing,Cofield,Carrigan,Brush,Bonham,Bahr,Aucoin,Appleby,Almonte,Yager,Womble,Wimmer,Weimer,Vanderpool,Stancil,Sprinkle,Romine,Remington,Pfaff,Peckham,Olivera,Meraz,Maze,Lathrop,Koehn,Jonas,Hazelton,Halvorson,Hallock,Haddock,Ducharme,Dehaven,Colton,Caruthers,Brehm,Bosworth,Bost,Blow,Bias,Beeman,Basile,Bane,Aikens,Zachary,Wold,Walther,Tabb,Suber,Strawn,Stocks,Stocker,Shirey,Schlosser,Salvador,Riedel,Rembert,Reimer,Pyles,Pickle,Peele,Merriweather,Letourneau,Latta,Kidder,Hixon,Hillis,Hight,Herbst,Henriquez,Haygood,Hamill,Gabel,Fritts,Eubank,Duty,Dawes,Correll,Coffee,Cha,Bushey,Buchholz,Brotherton,Bridge,Botts,Barnwell,Auger,Atchley,Westphal,Veilleux,Ulloa,Truman,Stutzman,Shriver,Ryals,Prior,Pilkington,Newport,Moyers,Miracle,Marrs,Mangrum,Maddux,Lockard,Laing,Kuhl,Harney,Hammock,Hamlett,Felker,Doerr,Depriest,Carrasquillo,Carothers,Bogle,Blood,Bischoff,Bergen,Albanese,Wyckoff,Vermillion,Vansickle,Thibault,Tetreault,Stickney,Shoemake,Ruggiero,Rawson,Racine,Philpot,Paschal,Mcelhaney,Mathison,Legrand,Lapierre,Kwan,Kremer,Jiles,Hilbert,Geyer,Faircloth,Ehlers,Egbert,Desrosiers,Dalrymple,Cotten,Cashman,Cadena,Breeding,Boardman,Alcaraz,Ahn,Wyrick,Therrien,Tankersley,Strickler,Puryear,Plourde,Pattison,Pardue,Milan,Mcginty,Mcevoy,Landreth,Kuhns,Koon,Hewett,Giddens,Everette,Emerick,Eades,Deangelis,Cosme,Ceballos,Birdsong,Benham,Bemis,Armour,Anguiano,Angeles,Welborn,Tsosie,Storms,Shoup,Sessoms,Samaniego,Rood,Rojo,Rhinehart,Raby,Northcutt,Myer,Munguia,Morehouse,More,Mcdevitt,Mateo,Mallett,Lozada,Lemoine,Kuehn,Hallett,Grim,Gillard,Gaylor,Garman,Gallaher,Feaster,Faris,Darrow,Dardar,Coney,Carreon,Byron,Braithwaite,Boylan,Boyett,Born,Bixler,Bigham,Benford,Barragan,Barnum,Zuber,Wyche,Westcott,Vining,Stoltzfus,Simonds,Shupe,Sabin,Ruble,Rittenhouse,Richman,Perrone,Mulholland,Millan,Meister,Mathew,Lomeli,Kite,Jemison,Hulett,Holler,Hickerson,Herold,Hazelwood,Griffen,Gause,Forde,Eisenberg,Dilworth,Charron,Chaisson,Brodie,Bristow,Breunig,Brace,Boutwell,Bentz,Belk,Bayless,Batchelder,Baran,Baeza,Zimmermann,Weathersby,Volk,Toole,Theis,Tedesco,Shine,Searle,Schenck,Satterwhite,Sandy,Ruelas,Royce,Rankins,Partida,Nesbit,Morel,Menchaca,Levasseur,Kaylor,Johnstone,Hulse,Hollar,Hersey,Harrigan,Harbison,Guyer,Gish,Giese,Gerlach,Geller,Geisler,Falcone,Ernest,Elwell,Doucet,Deese,Darr,Corder,Chafin,Byler,Bussell,Burdett,Brasher,Bowe,Bellinger,Bastian,Barner,Alleyne,Wilborn,Weil,Wegner,Wales,Tatro,Spitzer,Smithers,Schoen,Resendez,Pete,Parisi,Overman,Obrian,Mudd,Moy,Mclaren,Mahler,Maggio,Lindner,Lalonde,Lacasse,Laboy,Killion,Kahl,Jessen,Jamerson,Houk,Henshaw,Gustin,Groom,Graber,Durst,Duenas,Davey,Cundiff,Conlon,Colunga,Coakley,Chiles,Capers,Buell,Bricker,Bissonnette,Birmingham,Bartz,Bagby,Zayas,Volpe,Treece,Toombs,Thom,Terrazas,Swinney,Skiles,Silveira,Shouse,Senn,Rambo,Ramage,Nez,Moua,Marlin,Malik,Langham,Kyles,Holston,Hoagland,Herd,Hector,Feller,Emory,Denison,Corliss,Carraway,Burford,Bickel,Ambriz,Abercrombie,Yamada,Winner,Weidner,Waddle,Verduzco,Thurmond,Swindle,Schrock,Sanabria,Rosenberger,Probst,Peabody,Olinger,Neighbors,Nazario,Mccafferty,Mcbroom,Mcabee,Mazur,Matherne,Mapes,Leverett,Killingsworth,Heisler,Griego,Grande,Gosnell,Frankel,Franke,Ferrante,Fenn,Elmer,Ehrlich,Christopherso,Chick,Chasse,Chancellor,Caton,Brunelle,Bly,Bloomfield,Babbitt,Azevedo,Abramson,Ables,Abeyta,Youmans,Wozniak,Wainwright,Summer,Stowell,Smitherman,Sites,Samuelson,Runge,Rule,Rothman,Rosenfeld,Quan,Peake,Oxford,Owings,Olmos,Munro,Moreira,Leatherwood,Larkins,Krantz,Kovacs,Kizer,Kindred,Karnes,Jaffe,Hubbell,Hosey,Hauck,Harold,Goodell,Favors,Erdman,Dvorak,Doane,Cureton,Cofer,Buehler,Bierman,Berndt,Banta,Annis,Abram,Abdullah,Warwick,Waltz,Turcotte,Trinh,Torrey,Stith,Seger,Sachs,Quesada,Pinder,Peppers,Pascual,Paschall,Parkhurst,Ozuna,Oster,Nicholls,Mortimer,Lheureux,Lavalley,Kimura,Jablonski,Haun,Gourley,Gilligan,Fix,Derby,Croy,Cotto,Cargill,Burwell,Burgett,Buckman,Brett,Booher,Adorno,Wrenn,Whittemore,Urias,Szabo,Sayles,Saiz,Rutland,Rael,Plant,Pharr,Penney,Pelkey,Ogrady,Nickell,Musick,Moats,Mather,Massa,Laurent,Kirschner,Kieffer,Kellar,Hendershot,Gott,Godoy,Gadson,Furtado,Fiedler,Erskine,Edison,Dutcher,Dever,Daggett,Chevalier,Chao,Brake,Ballesteros,Amerson,Alejandro,Wingo,Waldon,Trott,Spikes,Silvey,Showers,Schlegel,Rue,Ritz,Pepin,Pelayo,Parsley,Palermo,Moorehead,Mchale,Lett,Kocher,Kilburn,Iglesias,Humble,Hulbert,Huckaby,Hix,Haven,Hartford,Hardiman,Gurney,Grigg,Grasso,Goings,Fillmore,Farber,Depew,Dandrea,Dame,Cowen,Covarrubias,Cory,Burrus,Bracy,Ardoin,Thompkins,Suzuki,Standley,Russel,Radcliffe,Pohl,Persaud,Percy,Parenteau,Pabon,Newson,Newhouse,Napolitano,Mulcahy,Maya,Malave,Keim,Hooten,Hernandes,Heffernan,Hearne,Greenleaf,Glick,Fuhrman,Fetter,Faria,Dishman,Dickenson,Crites,Criss,Clapper,Chenault,Castor,Casto,Bugg,Bove,Bonney,Blessing,Ard,Anderton,Allgood,Alderson,Woodman,Wisdom,Warrick,Toomey,Tooley,Tarrant,Summerville,Stebbins,Sokol,Sink,Searles,Schutz,Schumann,Scheer,Remillard,Raper,Proulx,Palmore,Monroy,Miguel,Messier,Melo,Melanson,Mashburn,Manzano,Lussier,Lovely,Lien,Jenks,Huneycutt,Hartwig,Grimsley,Fulk,Fielding,Fidler,Engstrom,Eldred,Dantzler,Crandell,Ching,Calder,Brumley,Breton,Brann,Bramlett,Boykins,Bianco,Bancroft,Almaraz,Alcantar,Whitmer,Whitener,Welton,Vineyard,Su,Rahn,Paquin,Mizell,Mix,Mcmillin,Mckean,Marston,Maciel,Lundquist,Louie,Liggins,Lampkin,Kranz,Koski,Kirkham,Jiminez,Hazzard,Harrod,Graziano,Grammer,Gendron,Garrido,Fordham,Englert,Elwood,Dryden,Demoss,Deluna,Crabb,Comeau,Claudio,Brummett,Blume,Benally,Wessel,Vanbuskirk,Thorson,Stumpf,Stockwell,Rocco,Reams,Radtke,Rackley,Pelton,Niemi,Newland,Nelsen,Morrissette,Miramontes,Mcginley,Mccluskey,Marley,Marchant,Luevano,Lampe,Lail,Jeffcoat,Infante,Hu,Hinman,Gaona,Erb,Eady,Desmarais,Decosta,Dansby,Cisco,Choe,Breckenridge,Bostwick,Borg,Bianchi,Beer,Alberts,Adrian,Wilkie,Whorton,Vargo,Tait,Sylvia,Soucy,Schuman,Ousley,Mumford,Lum,Lippert,Leath,Lavergne,Laliberte,Kirksey,Kenner,Johnsen,Izzo,Hiles,Gullett,Greenwell,Gaspar,Galbreath,Gaitan,Ericson,Duck,Delapaz,Croom,Cottingham,Clift,Bushnell,Boozer,Bice,Bernardo,Beason,Arrowood,Waring,Voorhees,Truax,Shreve,Shockey,Schatz,Sandifer,Rubino,Rozier,Roseberry,Roll,Player,Pieper,Peden,Nester,Nave,Murphey,Malinowski,Macgregor,Liang,Lafrance,Kunkle,Kirkman,Jorge,Hipp,Hasty,Haddix,Gervais,Gerdes,Garfield,Gamache,Fouts,Fitzwater,Dillingham,Deming,Deanda,Cedeno,Cannady,Burson,Bouldin,Arceneaux,Woodhouse,Whitford,Wescott,Welty,Weigel,Torgerson,Toms,Surber,Sunderland,Sterner,Setzer,Salvatore,Riojas,Pumphrey,Puga,Pedro,Patch,Metts,Mcgarry,Mccandless,Magill,Lupo,Loveland,Llamas,Leclerc,Koons,Kahler,Huss,Holbert,Heintz,Haupt,Grimmett,Gaskill,Flower,Ellingson,Dorr,Dingess,Deweese,Desilva,Crossley,Cordeiro,Converse,Conde,Cheeks,Caldera,Cairns,Burmeister,Burkhalter,Brawner,Bott,Youngs,Vierra,Valladares,Tiffany,Shrum,Shropshire,Sevilla,Rusk,Roof,Rodarte,Pedraza,Nino,Montana,Merino,Mcminn,Markle,Mapp,Lucia,Lajoie,Koerner,Kittrell,Kato,Hyder,Hollifield,Heiser,Hazlett,Greenwald,Fant,Eldredge,Dreher,Delafuente,Cravens,Claypool,Beecher,Aronson,Alanis,Worthen,Wojcik,Winger,Whitacre,Wellington,Valverde,Valdivia,Troupe,Thrower,Swindell,Suttles,Suh,Stroman,Spires,Slate,Shealy,Sarver,Sartin,Sadowski,Rondeau,Rolon,Rick,Rex,Rascon,Priddy,Pine,Paulino,Nolte,Munroe,Molloy,Mellon,Mciver,Lykins,Loggins,Lillie,Lenoir,Klotz,Kempf,Jone,Hupp,Hollowell,Hollander,Haynie,Hassan,Harkness,Harker,Gottlieb,Frith,Eddins,Driskell,Doggett,Densmore,Charette,Cassady,Carrol,Byrum,Burcham,Buggs,Benn,Whitted,Warrington,Vandusen,Vaillancourt,Steger,Spell,Siebert,Scofield,Quirk,Purser,Plumb,Orcutt,Northern,Nordstrom,Mosely,Michalski,Mcphail,Mcdavid,Mccraw,Martini,Marchese,Mannino,Leo,Lefevre,Largent,Lanza,Kress,Isham,Hunsaker,Hoch,Hildebrandt,Guarino,Grijalva,Graybill,Fick,Ewell,Ewald,Deangelo,Cusick,Crumley,Coston,Cathcart,Carruthers,Bullington,Brian,Bowes,Blain,Blackford,Barboza,Yingling,Woodland,Wert,Weiland,Varga,Silverstein,Sievers,Shuster,Shumway,Scudder,Runnels,Rumsey,Renfroe,Provencher,Polley,Mohler,Middlebrooks,Kutz,Koster,Korn,Grow,Groth,Glidden,Fazio,Deen,Corn,Copper,Chipman,Chenoweth,Champlin,Cedillo,Carrero,Carmody,Buckles,Brien,Boutin,Bosch,Bill,Berkowitz,Altamirano,Wilfong,Wiegand,Waites,Truesdale,Toussaint,Tobey,Tedder,Steelman,Sirois,Schnell,Robichaud,Ridge,Richburg,Pray,Plumley,Pizarro,Piercy,Ortego,Oberg,Neace,Music,Mickey,Mertz,Mcnew,Matta,Lawyer,Lapp,Lair,Kibler,Jessie,Howlett,Hollister,Hofer,Hatten,Hagler,Germany,Falgoust,Engelhardt,Eberle,Eastwood,Dombrowski,Dinsmore,Daye,Cool,Casares,Capone,Braud,Balch,Autrey,Wendel,Tyndall,Toy,Strobel,Stoltz,Spinelli,Serrato,Rochester,Reber,Real,Rathbone,Palomino,Noah,Nickels,Mayle,Mathers,Mach,Loeffler,Littrell,Levinson,Leong,Lemire,Lejeune,Lazo,Lasley,Koller,Kennard,Jester,Hoelscher,Hintz,Hagerman,Greaves,Fore,Eudy,Engler,Corrales,Cordes,Brunet,Bidwell,Bennet,Bare,Tyrrell,Tharpe,Swinton,Stribling,Steven,Southworth,Sisneros,Shane,Savoie,Samons,Ruvalcaba,Roscoe,Ries,Ramer,Omara,Mosqueda,Millar,Mcpeak,Macomber,Luckey,Litton,Lehr,Lavin,Hubbs,Hoard,Hibbs,Hagans,Futrell,Exum,Evenson,Dicks,Culler,Chou,Carbaugh,Callen,Brashear,Bloomer,Blakeney,Bigler,Addington,Woodford,Witter,Unruh,Tolentino,Sumrall,Stgermain,Smock,Sherer,Salem,Rochelle,Rayner,Pooler,Oquinn,Nero,Milano,Mcglothlin,Mars,Linden,Kowal,Kerrigan,Ibrahim,Harvell,Hanrahan,Goodall,Geist,Fussell,Fung,Ferebee,Federico,Eley,Eggert,Dorsett,Dingman,Destefano,Colucci,Clemmer,Caesar,Burnell,Brumbaugh,Boddie,Berryhill,Avelar,Alcantara,Abbey,Winder,Winchell,Vandenberg,Trotman,Thurber,Thibeault,Stlouis,Stilwell,Sperling,Shattuck,Sarmiento,Ruppert,Rumph,Renaud,Randazzo,Rademacher,Quiles,Pearman,Palomo,Mercurio,Lowrey,Lindeman,Lawlor,Larosa,Lander,Labrecque,Kimber,Hovis,Holifield,Henninger,Hawkes,Hartfield,Hann,Hague,Genovese,Garrick,Fudge,Frink,Eddings,Dinh,Dear,Cutter,Cribbs,Constant,Calvillo,Bunton,Brodeur,Bolding,Blanding,Agosto,Zahn,Wiener,Trussell,Tew,Tello,Teixeira,Stephan,Speck,Sharma,Shanklin,Sealy,Scanlan,Santamaria,Roundy,Robichaux,Ringer,Rigney,Prevost,Polson,Philip,Pass,Nord,Moxley,Mohammed,Medford,Mccaslin,Mcardle,Macarthur,Lewin,Lasher,Ketcham,Keiser,Heine,Hackworth,Grose,Grizzle,Grass,Gillman,Gartner,Garth,Frazee,Fleury,Fast,Edson,Edmonson,Derry,Deck,Cronk,Conant,Burress,Burgin,Broom,Brockington,Bolick,Boger,Birchfield,Billington,Baily,Bahena,Armbruster,Anson,Yoho,Wilcher,Tinney,Timberlake,Thoma,Thielen,Sutphin,Stultz,Sikora,Serra,Schulman,Scheffler,Santillan,Robin,Rego,Preciado,Pinkham,Monday,Mickle,Luu,Lomas,Lizotte,Lent,Lenard,Kellerman,Keil,Juan,Johanson,Hernadez,Hartsfield,Hang,Haber,Gorski,Farkas,Eberhardt,Duquette,Delano,Cropper,Cozart,Cockerham,Chamblee,Cartagena,Cahoon,Buzzell,Brister,Brewton,Blackshear,Benfield,Aston,Ashburn,Arruda,Wetmore,Weise,Vaccaro,Tucci,Sudduth,Stromberg,Stoops,Showalter,Shears,Runion,Rowden,Rosenblum,Riffle,Renfrow,Peres,Obryant,Nicolas,Leftwich,Lark,Landeros,Kistler,Killough,Kerley,Kastner,Hoggard,Hartung,Guertin,Govan,Gatling,Gailey,Fullmer,Fulford,Flatt,Esquibel,Endicott,Edmiston,Edelstein,Dufresne,Dressler,Dickman,Chee,Busse,Bonnett,Bogart,Berard,Barrington,Arena,Anton,Yoshida,Velarde,Veach,Vanhouten,Vachon,Tolson,Tolman,Tennyson,Stites,Soler,Shutt,Ruggles,Rhone,Pegues,Ong,Neese,Muro,Moncrief,Mefford,Mcphee,Mcmorris,Mceachern,Mcclurg,Mansour,Mai,Mader,Leija,Lecompte,Lafountain,Labrie,Jaquez,Heald,Hash,Hartle,Gainer,Frisby,Farina,Eidson,Edgerton,Dyke,Durrett,Duhon,Cuomo,Cobos,Cervantez,Bybee,Brockway,Borowski,Binion,Beery,Arguello,Amaro,Acton,Yuen,Winton,Wigfall,Weekley,Vidrine,Vannoy,Tardiff,Shoop,Shilling,Schick,Sand,Safford,Prendergast,Pilgrim,Pellerin,Osuna,Nissen,Nalley,Moritz,Moller,Messner,Messick,Merry,Merrifield,Mcguinness,Matherly,Marcano,Mahone,Lemos,Lebrun,Jara,Hoffer,Hewlett,Herren,Hecker,Haws,Haug,Hack,Gwin,Gober,Gilliard,Fredette,Favela,Echeverria,Downer,Donofrio,Desrochers,Dee,Crozier,Corson,Clyde,Bechtold,Argueta,Aparicio,Zamudio,Willette,Westover,Westerman,Utter,Troyer,Thies,Tapley,Slavin,Shirk,Sandler,Roop,Rimmer,Raymer,Range,Radcliff,Otten,Moorer,Millet,Mckibben,Mccutchen,Mcavoy,Mcadoo,Mayorga,Mastin,Martineau,Marek,Madore,Leflore,Kroeger,Kennon,Jimerson,Javier,Hostetter,Hornback,Hendley,Hance,Guardado,Granado,Gowen,Goodale,Flinn,Fleetwood,Fitz,Durkee,Duprey,Dipietro,Dilley,Clyburn,Brawley,Beckley,Arana,Weatherby,Vollmer,Victoria,Vestal,Tunnell,Trigg,Tingle,Takahashi,Sweatt,Storer,Snapp,Shiver,Rooker,Red,Rathbun,Poisson,Perrine,Perri,Pastor,Parmer,Parke,Pare,Papa,Palmieri,Nottingham,Midkiff,Mecham,Mccomas,Mcalpine,Lovelady,Lillard,Lally,Knopp,Kile,Kiger,Haile,Gupta,Goldsberry,Gilreath,Fulks,Friesen,Franzen,Flack,Findlay,Ferland,Dreyer,Dore,Dennard,Deckard,Debose,Crim,Coulombe,Cork,Chancey,Cantor,Branton,Bissell,Barns,Woolard,Witham,Wasserman,Waldo,Spiegel,Shoffner,Scholz,Ruch,Rossman,Ready,Petry,Palacio,Paez,Neary,Mortenson,Millsap,Miele,Mick,Menke,Mckim,Mcanally,Martines,Manor,Malcom,Lemley,Larochelle,Klaus,Klatt,Kaufmann,Kapp,Helmer,Hedge,Halloran,Glisson,Frechette,Fontana,Enoch,Eagan,Drum,Distefano,Danley,Creekmore,Chartier,Chaffee,Carillo,Burg,Bolinger,Berkley,Benz,Basso,Bash,Barrier,Zelaya,Woodring,Witkowski,Wilmot,Wilkens,Wieland,Virgil,Verdugo,Urquhart,Tsai,Timms,Swiger,Swaim,Sussman,Scarlett,Pires,Molnar,Mcatee,Maurice,Lowder,Loos,Linker,Landes,Kingery,Keeley,Hufford,Higa,Hendren,Hammack,Hamann,Gillam,Gerhardt,Fell,Eugene,Edelman,Eby,Delk,Deans,Curl,Constantine,Cleaver,Claar,Casiano,Carruth,Carlyle,Bump,Brophy,Bolanos,Bibbs,Bessette,Beggs,Baugher,Bartel,Averill,Andresen,Amin,Alden,Adames,Wildman,Via,Valente,Turnbow,Tse,Swink,Sublett,Stroh,Stringfellow,Ridgway,Pugliese,Poteat,Pang,Ohare,Neubauer,Murchison,Mohamed,Mingo,Lucky,Lemmons,Kwon,Kellam,Kean,Jarmon,Hyden,Hudak,Hollinger,Henkel,Hemingway,Hasson,Hansel,Halter,Haire,Goodnight,Ginsberg,Gillispie,Fogel,Flory,Etter,Elledge,Eckman,Deas,Currin,Crafton,Coomer,Colter,Claxton,Bulter,Braddock,Bowyer,Blizzard,Binns,Bing,Bellows,Baskerville,Barros,Ansley,Woolf,Wight,Waldman,Wadley,Tull,Trull,Tesch,Struck,Stouffer,Stadler,Slay,Shubert,Sedillo,Santacruz,Reinke,Raleigh,Poynter,Neri,Neale,Natividad,Mowry,Moralez,Monger,Mitchum,Merryman,Manion,Macdougall,Lux,Litchfield,Ley,Levitt,Lepage,Lasalle,Laine,Khoury,Kavanagh,Karns,Ivie,Huebner,Hodgkins,Halpin,Garica,Eversole,Dutra,Dunagan,Duffey,Dillman,Dillion,Deville,Dearborn,Damato,Courson,Coulson,Burdine,Bryce,Bousquet,Bonin,Bish,Atencio,Westbrooks,Wages,Vaca,Tye,Toner,Tomas,Tillis,Swett,Surface,Struble,Stanfill,Son,Solorzano,Slusher,Sipple,Sim,Silvas,Shults,Schexnayder,Saez,Rodas,Rager,Pulver,Plaza,Penton,Paniagua,Meneses,Mcfarlin,Mcauley,Matz,Maloy,Magruder,Lohman,Landa,Lacombe,Jaimes,Hom,Holzer,Holst,Heil,Hackler,Grundy,Gregor,Gilkey,Farnham,Durfee,Dunton,Dunston,Duda,Dews,Dana,Craver,Corriveau,Conwell,Colella,Chambless,Bremer,Boutte,Bourassa,Blaisdell,Backman,Babineaux,Audette,Alleman,Towner,Taveras,Tarango,Sullins,Suiter,Stallard,Solberg,Schlueter,Poulos,Pimental,Owsley,Olivier,Okelley,Nations,Moffatt,Metcalfe,Meekins,Medellin,Mcglynn,Mccowan,Marriott,Marable,Lennox,Lamoureux,Koss,Kerby,Karp,Jason,Isenberg,Howze,Hockenberry,Highsmith,Harbour,Hallmark,Gusman,Greeley,Giddings,Gaudet,Gallup,Fleenor,Eicher,Edington,Dimaggio,Dement,Demello,Decastro,Cruise,Bushman,Brundage,Brooker,Brooke,Bourg,Board,Blackstock,Bergmann,Beaton,Banister,Argo,Appling,Wortman,Watterson,Villalpando,Tillotson,Tighe,Sundberg,Sternberg,Stamey,Speaks,Shipe,Seeger,Scarberry,Sattler,Sain,Rothstein,Poteet,Plowman,Pettiford,Penland,Peach,Partain,Pankey,Oyler,Ogletree,Ogburn,Moton,Million,Merkel,Mask,Markus,Lucier,Lazarus,Lavelle,Lakey,Kratz,Kinser,Kershaw,Josephson,Jesse,Imhoff,Ibanez,Hendry,Hammon,Frisbie,Friedrich,Frawley,Fraga,Forester,Eskew,Emmert,Drennan,Doyon,Dominick,Dandridge,Cumming,Cawley,Carvajal,Bracey,Belisle,Batey,Ahner,Wysocki,Weiser,Veliz,Tincher,Sherlock,Santo,Sansone,Sankey,Sandstrom,Sale,Rohrer,Risner,Pridemore,Pfeffer,Persinger,Peery,Oubre,Orange,Nowicki,Musgrave,Murdoch,Mullinax,Mccary,Mathieu,Livengood,Leonardo,Kyser,Klink,Kimes,Kellner,Kavanaugh,Kasten,Imes,Hoey,Hinshaw,Halley,Hake,Gurule,Grube,Grillo,Geter,Gatto,Garver,Garretson,Farwell,Eiland,Dunford,Decarlo,Corso,Core,Colman,Collard,Cleghorn,Chasteen,Cavender,Carlile,Calvo,Byerly,Brogdon,Broadwater,Breault,Bono,Bergin,Behr,Ballenger,Amick,Yan,Vice,Tamez,Stiffler,Steinke,Simmon,Shankle,Schaller,Salmons,Sackett,Saad,Rideout,Reader,Ratcliffe,Rao,Ranson,Randell,Plascencia,Petterson,Olszewski,Olney,Olguin,Nilsson,Nevels,Morelli,Montiel,Monge,Michell,Michaelson,Mertens,Mcchesney,Mcalpin,Mathewson,Lower,Loudermilk,Lineberry,Liggett,Lamp,Kinlaw,Kight,Just,Jost,Hereford,Hardeman,Halpern,Halliday,Hafer,Gaul,Friel,Freitag,Frances,Forsberg,Evangelista,Doering,Dicarlo,Dendy,Delp,Deguzman,Dameron,Curtiss,Cousin,Cosper,Charley,Cauthen,Cao,Camper,Bradberry,Bouton,Bonnell,Bixby,Bieber,Beveridge,Belle,Bedwell,Barhorst,Bannon,Baltazar,Baier,Ayotte,Attaway,Arenas,Alex,Abrego,Watford,Valley,Turgeon,Tunstall,Thaxton,Thai,Tenorio,Stotts,Sthilaire,Spiker,Shedd,Seng,Seabolt,Scalf,Salyers,Ruhl,Rowlett,Robinett,Pfister,Perlman,Pepe,Parkman,Paradise,Olin,Nunnally,Norvell,Napper,Modlin,Mckellar,Mcclean,Mascarenas,Manchester,Leibowitz,Ledezma,Kuhlman,Kobayashi,Hunley,Holmquist,Hinkley,Hazard,Hartsell,Gribble,Gravely,Fifield,Eliason,Doctor,Doak,Crossland,Cover,Clair,Carleton,Butters,Bridgeman,Bojorquez,Boggess,Banker,Auten,Woosley,Wine,Whiteley,Wexler,Twomey,Tullis,Townley,To,Standridge,Stamp,Springs,Santoyo,Rueda,Riendeau,Revell,Pless,Ottinger,Nigro,Nickles,Mulvey,Menefee,Mcshane,Mcloughlin,Mckinzie,Marrow,Markey,Mariano,Lockridge,Lipsey,Knisley,Knepper,Kitts,Kiel,Jinks,Hathcock,Godin,Gallego,Fikes,Fecteau,Estabrook,Ellinger,Dustin,Dunlop,Dudek,Diego,Countryman,Chauvin,Chatham,Bullins,Brownfield,Boughton,Bloodworth,Bibb,Baucom,Barbieri,Aubin,Armitage,Alessi,Absher,Abbate,Zito,Woolery,Wiggs,Wacker,Violette,Tynes,Tolle,Telles,Tarter,Swarey,Strode,Stockdale,Stella,Stalnaker,Spina,Schiff,Saari,Risley,Reading,Rameriz,Rakes,Pettaway,Penner,Paulus,Palladino,Omeara,Montelongo,Melnick,Mehta,Mcgary,Mccourt,Mccollough,Marchetti,Manzanares,Lowther,Leiva,Lauderdale,Lafontaine,Kowalczyk,Knighton,Joubert,Jaworski,Ide,Huth,Hurdle,Hung,Housley,Hackman,Gulick,Gordy,Gilstrap,Gehrke,Gebhart,Gaudette,Foxworth,Finger,Essex,Endres,Dunkle,Clare,Cimino,Cardinal,Caddell,Brauer,Braley,Bodine,Blackmore,Belden,Backer,Ayer,Andress,Alva,Wisner,Walk,Vuong,Valliere,Twigg,Tso,Tavarez,Strahan,Steib,Staub,Sowder,Shoulders,Seiber,Schutt,Scharf,Schade,Rodriques,Risinger,Renshaw,Rath,Rahman,Presnell,Pillow,Piatt,Pasquale,Nieman,Nicol,Nevins,Milford,Mcilwain,Mcgaha,Mccully,Mccomb,Maye,Massengale,Macedo,Lines,Lesher,Leland,Kearse,Jauregui,Husted,Hudnall,Holmberg,Hertel,Hershey,Hardie,Glidewell,Frausto,Fassett,Dash,Dalessandro,Dahlgren,Corum,Constantino,Conlin,Colquitt,Colombo,Claycomb,Carley,Cardin,Cancel,Buller,Boring,Boney,Bocanegra,Blazer,Biggers,Benedetto,Araiza,Andino,Albin,Zorn,Werth,Weisman,Walley,Vanegas,Ulibarri,Towers,Towe,Tedford,Teasley,Suttle,Steffens,Stcyr,Squire,Smythe,Singley,Sifuentes,Shuck,Session,Schram,Sass,Rieger,Ridenhour,Rickert,Richerson,Rayborn,Rabe,Raab,Pendley,Pastore,Ordway,Moynihan,Mellott,Mckissick,Mcgann,Mccready,Mauney,Marrufo,List,Lenhart,Lazar,Lafave,Keele,Kautz,Jardine,Jahnke,Jacobo,Hord,Hardcastle,Hageman,Griffey,Giglio,Gehring,Fortson,Duque,Duplessis,Donner,Dicken,Derosier,Deitz,Dalessio,Cyrus,Cram,Chi,Center,Castleman,Candelario,Callison,Caceres,Bozarth,Biles,Bejarano,Beech,Bashaw,Avina,Armentrout,Angus,Alverez,Acord,Zack,Waterhouse,Vereen,Vanlandingham,Uhl,Strawser,Shotwell,Severance,Seltzer,Schoonmaker,Schock,Schaub,Schaffner,Roeder,Rodrigez,Riffe,Rhine,Rasberry,Rancourt,Railey,Quade,Pursley,Prouty,Perdomo,Oxley,Osterman,Nickens,Murphree,Mounts,Monte,Merida,Maus,Mattern,Masse,Martinelli,Mangan,Lutes,Ludwick,Loney,Laureano,Lasater,Knighten,Kissinger,Kimsey,Kessinger,Honea,Hollingshead,Hockett,Heyer,Heron,Gurrola,Gove,Glasscock,Gillett,Galan,Featherstone,Eckhardt,Duron,Dunson,Dasher,Culbreth,Cowden,Cowans,Claypoole,Churchwell,Chabot,Caviness,Cater,Caston,Callan,Byington,Burkey,Boden,Beckford,Atwater,Arms,Archambault,Alvey,Alsup,Yon,Whisenant,Weese,Voyles,Verret,Tsang,Tessier,Sweitzer,Sherwin,Shaughnessy,Revis,Remy,Prine,Philpott,Peavy,Paynter,Parmenter,Ovalle,Offutt,Nightingale,Newlin,Nakano,Myatt,Muth,Mohan,Mcmillon,Mccarley,Mccaleb,Maxson,Marinelli,Maley,Macy,Liston,Letendre,Kain,Huntsman,Hirst,Hagerty,Gulledge,Greenway,Grajeda,Gorton,Goines,Gittens,Frederickson,Fanelli,Embree,Eichelberger,Dunkin,Dull,Dixson,Dillow,Defelice,Chumley,Burleigh,Borkowski,Binette,Biggerstaff,Berglund,Beller,Audet,Arbuckle,Allain,Alfano,Zander,Youngman,Wittman,Weintraub,Vanzant,Vaden,Twitty,Trader,Toon,Till,Stollings,Standifer,Spinner,Sines,Shope,Scalise,Saville,Romans,Posada,Pisano,Otte,Nolasco,Napoli,Mier,Merkle,Mendiola,Melcher,Mejias,Mcmurry,Mccalla,Markowitz,Marine,Manis,Mallette,Macfarlane,Lough,Looper,Landin,Kittle,Kinsella,Kinnard,Hobart,Herald,Helman,Hellman,Hartsock,Halford,Hage,Gordan,Glasser,Gayton,Gattis,Gastelum,Gaspard,Frisch,Force,Fitzhugh,Eckstein,Eberly,Dowden,Despain,Crumpler,Crotty,Cornelison,Collin,Colin,Chouinard,Chamness,Catlin,Cann,Bumgardner,Budde,Branum,Bradfield,Braddy,Borst,Birdwell,Bent,Bazan,Bank,Banas,Bade,Aubrey,Arango,Ahearn,Addis,Zumwalt,Wurth,Wilk,Widener,Wagstaff,Vella,Urrutia,Terwilliger,Tart,Steinman,Staats,Sloat,Rives,Riggle,Revels,Reichard,Prickett,Poff,Pitzer,Petro,Pell,Northrup,Nicks,Moline,Mielke,Maynor,Mallon,Magness,Lingle,Lindell,Lieb,Lesko,Lebeau,Lammers,Lafond,Kiernan,Ketron,Jurado,Holmgren,Hilburn,Hayashi,Hashimoto,Harbaugh,Hans,Guillot,Gard,Froehlich,Felipe,Feinberg,Falco,Dufour,Drees,Doney,Diep,Delao,Daves,Dail,Cutting,Crowson,Coss,Congdon,Carner,Camarena,Butterworth,Burlingame,Bouffard,Bloch,Bilyeu,Barta,Bakke,Baillargeon,Avent,Aquilar,Ake,Aho,Zeringue,Yeh,Yarber,Wolfson,Wendell,Vogler,Voelker,Truss,Troxell,Thrift,Strouse,Spielman,Sistrunk,Shows,Sevigny,Schuller,Schaaf,Ruffner,Routh,Roseman,Ricciardi,Peraza,Pegram,Overturf,Olander,Odaniel,Neu,Millner,Melchor,Maxie,Marvel,Maroney,Machuca,Macaluso,Livesay,Layfield,Laskowski,Kwiatkowski,Ko,Kiley,Kilby,Julien,Hovey,Heywood,Hayman,Havard,Harville,Haigh,Hagood,Grieco,Glassman,Gebhardt,Garry,Freeze,Fleischer,Fann,Elson,Eccles,Cunha,Crumb,Crew,Blakley,Bardwell,Abshire,Woodham,Wines,Welter,Wargo,Varnado,Tutt,Traynor,Swaney,Svoboda,Stricker,Stoffel,Stambaugh,Sickler,Shackleford,Selman,Seaver,Sansom,Sanmiguel,Royston,Rourke,Rockett,Rioux,Puleo,Pitchford,Persons,Normand,Nardi,Mulvaney,Middaugh,Manners,Malek,Lodge,Leos,Lathan,Kujawa,Kimbro,Killebrew,Joshua,Houlihan,Hobby,Hinckley,Herod,Hepler,Hamner,Hammel,Hallowell,Gonsalez,Gingerich,Gambill,Funkhouser,Fricke,Fewell,Falkner,Endsley,Dulin,Drennen,Deaver,Dambrosio,Clover,Chadwell,Ceasar,Castanon,Canon,Burkes,Brune,Brisco,Brinker,Bowker,Boldt,Berner,Bee,Beaumont,Beaird,Bazemore,Barrick,Arnette,Albano,Younts,Wunderlich,Weidman,Vanness,Tu,Toland,Theobald,Stickler,Steiger,Stanger,Spies,Spector,Sollars,Smedley,Seibel,Scoville,Saito,Rye,Rummel,Rude,Rowles,Rouleau,Roos,Rogan,Roemer,Ream,Raya,Purkey,Priester,Perreira,Penick,Paulin,Parkins,Overcash,Oleson,Nicely,Neves,Muldrow,Minard,Midgett,Michalak,Melgar,Mcentire,Mcauliffe,Marti,Marte,Lydon,Lindholm,Leyba,Leader,Langevin,Lagasse,Lafayette,Kesler,Kelton,Kao,Kaminsky,Jump,Jaggers,Humbert,Huck,Howarth,Hinrichs,Higley,Gupton,Guimond,Gravois,Giguere,Fretwell,Fontes,Feeley,Faucher,Fall,Evan,Eichhorn,Ecker,Earp,Dole,Dinger,Derryberry,Demars,Deel,Copenhaver,Collinsworth,Colangelo,Cloyd,Claiborne,Caulfield,Carlsen,Calzada,Caffey,Broadus,Brenneman,Bouie,Bodnar,Blaney,Blanc,Blades,Beltz,Behling,Begin,Barahona,Yun,Yockey,Winkle,Windom,Wimer,Wilford,Wash,Villatoro,Trexler,Teran,Taliaferro,Sydnor,Swinson,Snelling,Smtih,Siu,Simonton,Simoneaux,Simoneau,Sherrer,Seavey,Scheel,Rushton,Rupe,Ruano,Rodney,Rippy,Reiner,Reiff,Rabinowitz,Quach,Penley,Odle,Nock,Minnich,Mckown,Mccarver,Mcandrew,Longley,Laux,Lamothe,Lafreniere,Kropp,Krick,Kates,Jepson,Huie,Howse,Howie,Henriques,Haydon,Haught,Hatter,Hartzog,Harkey,Grimaldo,Goshorn,Gormley,Gluck,Gilroy,Gillenwater,Giffin,Folks,Fluker,Feder,Eyre,Eshelman,Eakins,Dryer,Disney,Detwiler,Delrosario,Davisson,Celestine,Catalan,Canning,Calton,Buster,Brammer,Botelho,Blakney,Bartell,Averett,Askins,Aker,Zak,Worcester,Witmer,Wiser,Winkelman,Widmer,Whittier,Western,Weitzel,Wardell,Wagers,Ullman,Tupper,Tingley,Tilghman,Talton,Simard,Seda,Scheller,Sala,Rundell,Rost,Roa,Ribeiro,Rabideau,Primm,Porch,Polite,Pinon,Peart,Ostrom,Ober,Nystrom,Nussbaum,Nurse,Naughton,Murr,Moorhead,Monti,Monteiro,Melson,Meissner,Mclin,Mcgruder,Marotta,Makowski,Majewski,Madewell,Lunt,Lukens,Leininger,Lebel,Lakin,Laguna,Kepler,Jaques,Hunnicutt,Hungerford,Hoopes,Hertz,Heins,Hammers,Halliburton,Grosso,Gravitt,Glasper,Gideon,Gallman,Gallaway,Funke,Fulbright,Falgout,Eakin,Dostie,Dorado,Dewberry,Derose,Cutshall,Crampton,Costanzo,Colletti,Cloninger,Claytor,Chiang,Canterbury,Campagna,Burd,Brokaw,Broaddus,Bretz,Brainard,Binford,Bilbrey,Alpert,Aitken,Ahlers,Zajac,Yale,Woolfolk,Witten,Windle,Wayland,Tramel,Tittle,Talavera,Suter,Straley,Stetson,Specht,Sommerville,Soloman,So,Skeens,Sigman,Sibert,Shavers,Schuck,Schmit,Sartain,Sabol,Rosenblatt,Rollo,Rashid,Rabb,Province,Polston,Nyberg,Northrop,Navarra,Muldoon,Mulder,Mikesell,Mcdougald,Mcburney,Mauricio,Mariscal,Lui,Lozier,Lingerfelt,Legere,Latour,Lagunas,Lacour,Kurth,Ku,Killen,Kiely,Kayser,Kahle,Julius,Isley,Huertas,Hower,Hinz,Haugh,Gumm,Given,Galicia,Fortunato,Flake,Dunleavy,Duggins,Doby,Digiovanni,Devaney,Deltoro,Cribb,Crank,Corpuz,Coronel,Comfort,Coen,Charbonneau,Caine,Burchette,Blakey,Blakemore,Bergquist,Beene,Beaudette,Bayles,Ballance,Bakker,Bailes,Asberry,Arwood,Zucker,Willman,Whitesell,Wald,Walcott,Vancleave,Trump,Trail,Strasser,Simas,Shorts,Shick,Schleicher,Schaal,Saleh,Rotz,Resnick,Raphael,Rainer,Partee,Ollis,Oller,Oday,Noles,Munday,Mountain,Mong,Millican,Merwin,Mazzola,Mansell,Magallanes,Llanes,Lewellen,Lepore,Kisner,Keesee,Jim,Jeanlouis,Ingham,Hornbeck,Hermes,Hawn,Hartz,Harber,Haffner,Gutshall,Guth,Grays,Grams,Gowan,Finlay,Finkelstein,Eyler,Enloe,Dungan,Diez,Dearman,Dann,Cull,Crosson,Creek,Chronister,Cassity,Campion,Callihan,Butz,Breazeale,Blumenthal,Billy,Berkey,Batty,Batton,Barge,Arvizu,Alexis,Alderete,Aldana,Albaugh,Abernethy,Work,Wolter,Wille,Tweed,Tollefson,Thomasson,Teter,Testerman,Sproul,Spates,Southwick,Soukup,Skelly,Senter,Sealey,Sawicki,Sargeant,Rossiter,Rosemond,Repp,Pound,Pink,Pifer,Ormsby,Nickelson,Naumann,Morabito,Monzon,Millsaps,Millen,Mcelrath,Marcoux,Mantooth,Madson,Macneil,Mackinnon,Louque,Leister,Lampley,Kushner,Krouse,Kirwan,June,Jessee,Janson,Jahn,Jacquez,Islas,Hutt,Holladay,Hillyer,Hepburn,Hensel,Harrold,Guadalupe,Gingrich,Geis,Gales,Fults,Finnell,Ferri,Featherston,Epley,Ebersole,Eames,Dunigan,Drye,Dismuke,Devaughn,Delorenzo,Damiano,Confer,Collum,Clower,Clow,Claussen,Clack,Caylor,Cawthon,Casias,Carreno,Carlo,Bluhm,Bingaman,Bewley,Belew,Beckner,Beamer,Barefoot,Auld,Amey,Wolfenbarger,Wilkey,Wicklund,Waltman,Villalba,Valero,Valdovinos,Ung,Ullrich,Tyus,Twyman,Trost,Tardif,Tanguay,Stripling,Steinbach,Shumpert,Sasaki,Sappington,Sandusky,Reinhold,Reinert,Quijano,Pye,Poor,Placencia,Pinkard,Phinney,Perrotta,Pernell,Parrett,Oxendine,Owensby,Orman,Nuno,Mori,Mcroberts,Mcneese,Mckamey,Mccullum,Markel,Mardis,Maines,Lueck,Lubin,Lefler,Leffler,Lavery,Larios,Labarbera,Kershner,Josey,Jeanbaptiste,Izaguirre,Hermosillo,Haviland,Hartshorn,Hamlet,Hafner,Ginter,Getty,Franck,Fiske,Emmett,Dufrene,Doody,Davie,Dangerfield,Dahlberg,Cuthbertson,Crone,Coffelt,Claus,Chidester,Chesson,Cauley,Caudell,Cantara,Campo,Caines,Bullis,Bucci,Brochu,Bosco,Bogard,Bickerstaff,Benning,Arzola,Antonelli,Adkinson,Zellers,Wulf,Worsley,Woolridge,Whitton,Westerfield,Walczak,Vassar,Truett,Trueblood,Trawick,Townsley,Topping,Tobar,Telford,Sung,Steverson,Stagg,Sitton,Sill,Sherrell,Sergent,Schoenfeld,Sarabia,Rutkowski,Rubenstein,Rigdon,Prentiss,Pomerleau,Plumlee,Phoenix,Philbrick,Peer,Patty,Patnode,Oloughlin,Obregon,Nuss,Napoleon,Morell,Moose,Mikell,Mele,Mcinerney,Mcguigan,Mcbrayer,Lore,Lor,Look,Lollar,Lakes,Kuehl,Kinzer,Kamp,Joplin,Jacobi,Howells,Holstein,Hedden,Hassler,Harty,Halle,Greig,Granville,Gouge,Goodrum,Gerhart,Geier,Geddes,Gast,Forehand,Ferree,Fendley,Feltner,Fang,Esqueda,Encarnacion,Eichler,Egger,Edmundson,Eatmon,Dragon,Doud,Donohoe,Donelson,Dilorenzo,Digiacomo,Diggins,Delozier,Dejong,Danford,Crippen,Coppage,Cogswell,Clardy,Cioffi,Cabe,Brunette,Bresnahan,Bramble,Blomquist,Blackstone,Biller,Bevis,Bevan,Bethune,Benbow,Baty,Basinger,Balcom,Andes,Aman,Aguero,Adkisson,Yandell,Wilds,Whisenhunt,Weigand,Weeden,Voight,Villar,Trottier,Tillett,Suazo,Setser,Scurry,Schuh,Schreck,Schauer,Samora,Roane,Rinker,Reimers,Reason,Ratchford,Popovich,Parkin,Nichol,Natal,Melville,Mcbryde,Magdaleno,Loehr,Lockman,Lingo,Leduc,Larocca,Lao,Lamere,Laclair,Krall,Korte,Koger,Jumper,Jalbert,Hughs,Higbee,Henton,Heaney,Haith,Gump,Greeson,Goodloe,Gholston,Gasper,Gagliardi,Fregoso,Farthing,Fabrizio,Ensor,Elswick,Elgin,Eklund,Eaddy,Drouin,Dorton,Dizon,Derouen,Delia,Deherrera,Davy,Dark,Dampier,Cullum,Culley,Cowgill,Cardoso,Cardinale,Brodsky,Broadbent,Brimmer,Briceno,Branscum,Bolyard,Boley,Bennington,Beadle,Baur,Ballentine,Azure,Aultman,Augustus,Asuncion,Arciniega,Aguila,Aceves,Yepez,Yap,Woodrum,Wethington,Weissman,Veloz,Trusty,Troup,Trammel,Theodore,Tarpley,Stivers,Steck,Sprayberry,Spraggins,Spitler,Spiers,Sohn,Seagraves,Schiffman,Rudnick,Rizo,Riccio,Rennie,Quinton,Quackenbush,Puma,Plott,Pearcy,Parada,Paiz,Munford,Moskowitz,Mease,Mcnary,Mccusker,Matt,Lozoya,Longmire,Loesch,Lasky,Kuhlmann,Krieg,Koziol,Kowalewski,Konrad,Kindle,Jowers,Jolin,Jaco,Hua,Horgan,Hine,Hileman,Hepner,Heise,Heady,Hawkinson,Hannigan,Haberman,Guilford,Grimaldi,Gilles,Garton,Gagliano,Fruge,Follett,Fiscus,Ferretti,Ebner,Easterday,Eanes,Dirks,Dimarco,Depalma,Deforest,Dance,Cruce,Craighead,Christner,Candler,Cadwell,Burchell,Buettner,Brinton,Breed,Brazier,Brannen,Brame,Bova,Bomar,Blakeslee,Belknap,Bangs,Balzer,Athey,Armes,Alvis,Alverson,Alvardo,Alter,Zhao,Yeung,Yen,Wheelock,Westlund,Wessels,Volkman,Threadgill,Thelen,Tandy,Tague,Ta,Symons,Swinford,Sturtevant,Straka,Stier,Stagner,Segarra,Seawright,Sack,Rutan,Roux,Ringler,Riker,Ramsdell,Quattlebaum,Purifoy,Poulson,Permenter,Peloquin,Pasley,Pagel,Osman,Obannon,Nygaard,Nipper,Newcomer,Munos,Motta,Meadors,Mcquiston,Mcniel,Mcmann,Mccrae,Mayne,Matte,Martine,Lucy,Legault,Lechner,Lack,Kucera,Krohn,Kratzer,Koopman,Judson,Jeske,Horrocks,Homes,Hock,Hibbler,Hesson,Hersh,Harvin,Halvorsen,Griner,Grindle,Glen,Gladstone,Garofalo,Frampton,Forbis,Fernando,Eddington,Diorio,Dingus,Dewar,Desalvo,Curcio,Creasy,Cortese,Cordoba,Connally,Cluff,Cascio,Capuano,Canaday,Calabro,Bussard,Brayton,Borja,Bigley,Arnone,Arguelles,Acuff,Zamarripa,Wooton,Wolfgang,Widner,Wideman,Threatt,Thiele,Templin,Teeters,Synder,Swint,Swick,Sturges,Stogner,Stedman,Spratt,Six,Siegfried,Shetler,Scull,Savino,Sather,Rothwell,Rook,Rone,Rolf,Rhee,Quevedo,Privett,Pouliot,Poche,Pickel,Petrillo,Pellegrini,Peaslee,Partlow,Otey,Nunnery,Morelock,Morello,Meunier,Messinger,Mckie,Mccubbin,Mccarron,Maria,Lerch,Lavine,Laverty,Lariviere,Lamkin,Kugler,Krol,Kissel,Keeter,Hummer,Hubble,Hickox,Hetzel,Hayner,Hagy,Hadlock,Groh,Gregorio,Gottschalk,Goodsell,Gloria,Gerry,Gassaway,Garrard,Galligan,Fye,Firth,Fenderson,Feinstein,Etienne,Engleman,Emrick,Ellender,Drews,Doiron,Degraw,Deegan,Dart,Crissman,Corr,Cookson,Coil,Cleaves,Charest,Chapple,Chaparro,Castano,Carpio,Byer,Bufford,Bridgewater,Bridgers,Brandes,Borrero,Bonanno,Aube,Ancheta,Abarca,Abad,Yung,Yim,Wooster,Woodrow,Wimbush,Willhite,Willams,Wigley,Weisberg,Wardlaw,Vigue,Vanhook,Unknow,Torre,Tasker,Tarbox,Strachan,Standard,Slover,Shamblin,Semple,Schuyler,Schrimsher,Sayer,Salzman,Salomon,Rubalcava,Riles,Rickey,Reneau,Reichel,Rayfield,Rabon,Pyatt,Prindle,Poss,Polito,Plemmons,Pesce,Perrault,Pereyra,Ostrowski,Nilsen,Niemeyer,Nick,Munsey,Mundell,Moncada,Miceli,Meader,Mcmasters,Mckeehan,Matsumoto,Marron,Marden,Lizarraga,Lingenfelter,Lewallen,Laurence,Langan,Lamanna,Kovac,Kinsler,Kephart,Keown,Kass,Kammerer,Jeffreys,Hysell,Householder,Hosmer,Hardnett,Hanner,Guyette,Greening,Glazer,Ginder,Fromm,Fortuna,Fluellen,Finkle,Fey,Fessler,Essary,Eisele,Duren,Dittmer,Crochet,Cosentino,Cogan,Coelho,Cavin,Carrizales,Campuzano,Brough,Bow,Bopp,Bookman,Bobb,Blouin,Beesley,Battista,Bascom,Bakken,Badgett,Arneson,Anselmo,Albino,Ahumada,Agustin,Woodyard,Wolters,Wireman,Wilton,Willison,Warman,Wan,Waldrup,Vowell,Vantassel,Vale,Twombly,Toomer,Tennison,Teets,Tedeschi,Swanner,Swallow,Stutz,Stelly,Sheehy,Schermerhorn,Scala,Sandidge,Salters,Salo,Saechao,Roseboro,Rolle,Ressler,Renz,Renn,Redford,Raposa,Rainbolt,Pompey,Pelfrey,Orndorff,Oney,Nolin,Nimmons,Ney,Nardone,Myhre,Morman,Mines,Menjivar,Mcglone,Mccammon,Maxon,Maris,Marciano,Manus,Maiden,Lowrance,Lorenzen,Lonergan,Lollis,Littles,Lindahl,Lansing,Lamas,Lach,Kuster,Krawczyk,Knuth,Knecht,Kirkendall,Keitt,Keever,Kantor,Jarboe,Hoye,Houchens,Holter,Holsinger,Hickok,Herb,Helwig,Helgeson,Heater,Hassett,Harner,Hamman,Hames,Hadfield,Goree,Goldfarb,Gaughan,Gaudreau,Gantz,Gallion,Frady,Foti,Flesher,Ferrin,Faught,Engram,Elbert,Donegan,Desouza,Degroot,Cutright,Crowl,Criner,Coke,Coan,Clinkscales,Chewning,Chavira,Catchings,Carlock,Bye,Bulger,Buenrostro,Bramblett,Brack,Boulware,Bordeaux,Bookout,Bitner,Birt,Baranowski,Baisden,Augustin,Allmon,Alberto,Acklin,Yoakum,Wilbourn,Whisler,Weinberger,Washer,Vasques,Vanzandt,Vanatta,Troxler,Tomes,Tindle,Tims,Throckmorton,Thach,Stpeter,Stlaurent,Stenson,Spry,Spitz,Songer,Snavely,Sly,Sleeper,Shroyer,Shortridge,Shenk,Sevier,Seabrook,Scrivner,Saltzman,Rosenberry,Rockwood,Robeson,Roan,Reiser,Redwine,Ramires,Raber,Profit,Posner,Popham,Pipes,Piotrowski,Pinard,Peterkin,Pelham,Peiffer,Peay,Peavey,Nadler,Musso,Milo,Millett,Mestas,Mcgowen,Marques,Marasco,Manriquez,Manos,Mair,Lipps,Lesser,Leiker,Leeds,Krumm,Knorr,Kinslow,Kessel,Kendricks,Kelm,Ito,Irick,Ickes,Hurlburt,Horta,Hoekstra,Heuer,Helmuth,Heatherly,Hampson,Hagar,Haga,Greenlaw,Grau,Godbey,Gingras,Gillies,Gibb,Gayden,Gauvin,Garrow,Fontanez,Florio,Fleischman,Finke,Fasano,Fan,Faith,Ezzell,Ewers,Eveland,Eckenrode,Duclos,Drumm,Dimmick,Delancey,Defazio,Deacon,Dashiell,Damian,Cusack,Crowther,Crigger,Cray,Coolidge,Coldiron,Cleland,Chalfant,Cassel,Cape,Camire,Cabrales,Broomfield,Brittingham,Brisson,Brickey,Braziel,Brazell,Bragdon,Boulanger,Bos,Boman,Bohannan,Beem,Barto,Barre,Barley,Baptist,Azar,Ashbaugh,Armistead,Almazan,Adamski,Zendejas,Winburn,Willaims,Wilhoit,Westberry,Wentzel,Wendling,Wager,Visser,Vanscoy,Vankirk,Vallee,Tweedy,Thornberry,Sweeny,Stalker,Spradling,Spano,Smelser,Shim,Sechrist,Schall,Scaife,Rugg,Ruben,Rothrock,Roesler,Riehl,Ridings,Render,Ransdell,Radke,Pinero,Petree,Pendergast,Peluso,Pecoraro,Pascoe,Panek,Oshiro,Noon,Navarrette,Murguia,Moores,Moberg,Mike,Michaelis,Mcwhirter,Mcsweeney,Mcquade,Mccay,Mauk,Mariani,Marceau,Mandeville,Maeda,Lunde,Ludlow,Loeb,Lindo,Linderman,Leveille,Leith,Larock,Lambrecht,Kulp,Kinsley,Kimberlin,Kesterson,Jacinto,Ice,Hui,Hoyos,Helfrich,Hanke,Hail,Guillermo,Grisby,Goyette,Gouveia,Glazier,Gile,Gerena,Gelinas,Gasaway,Garden,Funches,Fujimoto,Flynt,Fenske,Fellers,Fehr,Eslinger,Escalera,Enciso,Duley,Dittman,Dineen,Diller,Devault,Dao,Collings,Clymer,Clowers,Chavers,Charland,Castorena,Castello,Camargo,Bunce,Bullen,Boyes,Borchers,Borchardt,Birnbaum,Birdsall,Billman,Benites,Bankhead,Ange,Ammerman,Adkison,Yuan,Winegar,Wickman,Wear,Warr,Warnke,Villeneuve,Veasey,Vassallo,Vannatta,Vadnais,Twilley,Truelove,Towery,Tomblin,Tippett,Theiss,Talkington,Talamantes,Swart,Swanger,Streit,Straw,Stines,Stabler,Spurling,Sobel,Sine,Simmers,Shippy,Shiflett,Shearin,Sauter,Sanderlin,Rusch,Runkle,Ruckman,Rorie,Roesch,Roberto,Richert,Rehm,Randel,Ragin,Quesenberry,Puentes,Plyler,Plotkin,Paugh,Oshaughnessy,Ohalloran,Norsworthy,Niemann,Nader,Moorefield,Mooneyham,Modica,Miyamoto,Mickel,Mebane,Mckinnie,Mazurek,Mancilla,Lukas,Lovins,Loughlin,Lotz,Lindsley,Liddle,Levan,Lederman,Leclaire,Lasseter,Lapoint,Lamoreaux,Lafollette,Kubiak,Kirtley,Keffer,Kaczmarek,Jennette,Housman,Honey,Hiers,Hibbert,Herrod,Hegarty,Hathorn,Harsh,Greenhaw,Grafton,Govea,Gardener,Futch,Furst,Frisbee,Fred,Franko,Forcier,Foran,Flickinger,Fairfield,Eure,Emrich,Embrey,Edgington,Ecklund,Eckard,Durante,Deyo,Delvecchio,Deeds,Dade,Currey,Cuff,Creswell,Cottrill,Casavant,Cartier,Cargile,Capel,Cammack,Calfee,Buzzard,Burse,Burruss,Brust,Brousseau,Bridwell,Braaten,Borkholder,Bloomquist,Bjork,Bartelt,Arp,Amburgey,Yeary,Yao,Whitefield,Vinyard,Vicente,Vanvalkenburg,Twitchell,Timmins,Tester,Tapper,Stringham,Starcher,Spotts,Slaugh,Simonsen,Sheffer,Sequeira,Rosati,Rode,Rhymes,Reza,Record,Quint,Pollak,Peirce,Patillo,Parkerson,Paiva,Nilson,Nice,Nevin,Narcisse,Nair,Mitton,Merriam,Merced,Meiners,Mckain,Mcelveen,Mcbeth,Marsden,Marez,Manke,Mahurin,Mabrey,Luper,Krull,Kees,Iles,Hunsicker,Hornbuckle,Holtzclaw,Hirt,Hinnant,Heston,Hering,Hemenway,Hegwood,Hearns,Halterman,Halls,Guiterrez,Grote,Granillo,Grainger,Glasco,Gilder,Garren,Garlock,Garey,Fu,Fryar,Fredricks,Fraizer,Foxx,Foshee,Ferrel,Felty,Feathers,Everitt,Evens,Esser,Elkin,Eberhart,Durso,Duguay,Driskill,Doster,Dewall,Deveau,Demps,Demaio,Delreal,Deleo,Delay,Deem,Darrah,Cumberbatch,Culberson,Cranmer,Cordle,Colgan,Chesley,Cavallo,Castellon,Castelli,Carreras,Carnell,Carmon,Carmen,Carlucci,Bottom,Bontrager,Blumberg,Blasingame,Becton,Ayon,Artrip,Arline,Andujar,Alkire,Alder,Agan,Zukowski,Zuckerman,Zehr,Wroblewski,Wrigley,Woodside,Wigginton,Westman,Westgate,Werts,Washam,Wardlow,Walser,Waiters,Teller,Tadlock,Stuck,Stringfield,Stimpson,Stickley,Starbuck,Standish,Spurlin,Spindler,Speller,Spaeth,Sotomayor,Sok,Sluder,Shryock,Shepardson,Shatley,Scannell,Santistevan,Rosner,Rolland,Rhode,Resto,Reinhard,Rathburn,Prisco,Poulsen,Pinney,Phares,Pennock,Pastrana,Oviedo,Ostler,Noto,Nauman,Mulford,Moise,Moberly,Mirabal,Ming,Metoyer,Metheny,Mentzer,Meldrum,Mcinturff,Mcelyea,Mcdougle,Massaro,Lumpkins,Loveday,Lofgren,Loe,Lirette,Lesperance,Lefkowitz,Ledger,Lauzon,Lain,Lachapelle,Kurz,Klassen,Keough,Kempton,Kaelin,Jeffords,Im,Huot,Hsieh,Hoyer,Horwitz,Hopp,Hoeft,Hennig,Haskin,Grill,Gourdine,Golightly,Girouard,Fulgham,Fritsch,Freer,Frasher,Foulk,Firestone,Fiorentino,Fedor,Feather,Ensley,Englehart,Eells,Ebel,Dunphy,Donahoe,Dimas,Dileo,Dibenedetto,Dabrowski,Crick,Coonrod,Conder,Coddington,Chunn,Choy,Chaput,Cerna,Carreiro,Calahan,Braggs,Bourdon,Boner,Bollman,Bittle,Ben,Behm,Bauder,Batt,Barreras,Aubuchon,Anzalone,Adamo,Zhou,Zerbe,Zachery,Witty,Wirt,Willcox,Westberg,Weikel,Waymire,Vroman,Vinci,Vallejos,Tutor,Truesdell,Troutt,Trotta,Tollison,Toles,Tichenor,Tai,Symonds,Surles,Sunday,Strayer,Stgeorge,Sroka,Sorrentino,Solares,Snelson,Silvestri,Sikorski,Shawver,Schumaker,Schorr,Schooley,Scates,Satterlee,Satchell,Sacks,Rymer,Roselli,Robitaille,Riegel,Richer,Regis,Reames,Provenzano,Proper,Priestley,Plaisance,Pettey,Palomares,Oman,Nowakowski,Nace,Monette,Minyard,Mclamb,Mchone,Mccarroll,Masson,Marco,Magoon,Maddy,Lundin,Loza,Licata,Lesley,Leonhardt,Lema,Landwehr,Kircher,Kinch,Karpinski,Johannsen,Hussain,Houghtaling,Hoskinson,Hollaway,Holeman,Hobgood,Hilt,Hiebert,Gros,Gram,Goggin,Gentle,Geissler,Gadbois,Gabaldon,Fleshman,Flannigan,Files,Fairman,Epp,Eilers,Dycus,Dunmire,Duffield,Dowler,Ditto,Deloatch,Dehaan,Deemer,Corner,Clayborn,Christofferso,Chilson,Chesney,Chatfield,Charlie,Caster,Carron,Canale,Camden,Buff,Brigman,Branstetter,Bosse,Borton,Bonar,Blau,Biron,Beagle,Barroso,Arvin,Arispe,Zacharias,Zabel,Yaeger,Works,Woolford,Whetzel,Weakley,Veatch,Vandeusen,Tufts,Troxel,Troche,Traver,Townsel,Tosh,Talarico,Swilley,Sterrett,Stenger,Springfield,Speakman,Sowards,Sours,Souders,Souder,Soles,Sobers,Snoddy,Smither,Sias,Shute,Shoaf,Shahan,Schuetz,Scaggs,Santini,Rosson,Rolen,Robidoux,Rentas,Recio,Pixley,Pawlowski,Pawlak,Paull,Pascal,Overbey,Orear,Oliveri,Oldenburg,Nutting,Naugle,Mote,Mossman,Moor,Misner,Milazzo,Michelson,Mei,Mcentee,Mccullar,Mccree,Mcaleer,Mazzone,Maxim,Marshal,Mandell,Manahan,Malott,Maisonet,Mailloux,Lumley,Lowrie,Louviere,Lipinski,Lindemann,Leppert,Leopold,Leasure,Leaf,Labarge,Kubik,Knisely,Knepp,Kenworthy,Kennelly,Kelch,Karg,Kanter,Ignacio,Hyer,Houchin,Hosley,Hosler,Hollon,Holleman,Heitman,Hebb,Haggins,Gwaltney,Guin,Greenman,Goulding,Gorden,Goodyear,Geraci,Georges,Gathers,Frison,Feagin,Falconer,Espada,Erving,Erikson,Eisenhauer,Eder,Ebeling,Durgin,Drown,Dowdle,Dinwiddie,Delcastillo,Dedrick,Crimmins,Covell,Cournoyer,Coria,Cohan,Cataldo,Carpentier,Canas,Campa,Brode,Brashears,Blaser,Bicknell,Berk,Bednar,Barwick,Ascencio,Althoff,Almodovar,Alamo,Zirkle,Zabala,Xu,Wolverton,Winebrenner,Wetherell,Westlake,Wegener,Weddington,Vong,Tuten,Trosclair,Trim,Tressler,Theroux,Teske,Sword,Swinehart,Swensen,Sundquist,Southall,Socha,Sizer,Silverberg,Shortt,Shimizu,Sherrard,Shen,Shaeffer,Seth,Scheid,Scheetz,Saravia,Sanner,Rubinstein,Rozell,Romer,Ringo,Rheaume,Reisinger,Raven,Randles,Pullum,Petrella,Payan,Papp,Pablo,Nordin,Norcross,Nicoletti,Nicholes,Newbold,Nakagawa,Mraz,Monteith,Milstead,Milliner,Mellen,Mccardle,Matthias,Marcy,Luft,Loo,Locker,Liptak,Lipp,Leitch,Latimore,Larrison,Landau,Laborde,Koval,Izquierdo,Hymel,Hoskin,Holte,Hoefer,Hayworth,Hausman,Harrill,Harrel,Hardt,Gully,Groover,Grinnell,Greenspan,Graver,Grandberry,Gorrell,Goldenberg,Goguen,Gilleland,Garr,Fuson,Foye,Felt,Feldmann,Everly,Dyess,Dyal,Dunnigan,Downie,Dolby,Divine,Deatherage,Dates,Danna,Cosey,Corrado,Cheever,Celaya,Caver,Cashion,Caplinger,Cansler,Byrge,Bruder,Brew,Breuer,Breslin,Brazelton,Botkin,Bonneau,Bones,Bondurant,Bohanan,Bogue,Boes,Bodner,Boatner,Blatt,Bickley,Belliveau,Beiler,Beier,Beckstead,Bart,Bang,Bachmann,Atkin,Aron,Andreas,Altizer,Alloway,Allaire,Albro,Abron,Zellmer,Yetter,Yelverton,Wiltshire,Wiens,Whidden,Wait,Viramontes,Vanwormer,Topper,Tarantino,Tanksley,Sumlin,Strauch,Strang,Stice,Spahn,Sosebee,Sigala,Shrout,Seamon,Schrum,Schneck,Schantz,Said,Ruddy,Romig,Roehl,Renninger,Reding,Pyne,Polak,Pohlman,Pasillas,Oldfield,Oldaker,Ohanlon,Ogilvie,Norberg,Nolette,Nies,Neufeld,Nellis,Mummert,Mulvihill,Mullaney,Monteleone,Mendonca,Meisner,Mcmullan,Mccluney,Mattis,Massengill,Manfredi,Luedtke,Lounsbury,Lora,Liberatore,Leek,Lease,Lazaro,Lamphere,Laforge,Kuo,Koo,Jourdan,Ismail,Iorio,Iniguez,Ikeda,Hubler,Hodgdon,Hocking,Heacock,Haslam,Haralson,Hanshaw,Hannum,Hallam,Haden,Garnes,Garces,Gammage,Gambino,Finkel,Faucett,Fahy,Esteban,Ehrhardt,Eggen,Dusek,Durrant,Dubay,Dones,Dey,Depasquale,Delucia,Degraff,Deer,Decamp,Davalos,Darwin,Dan,Cullins,Conard,Clouser,Clontz,Cifuentes,Chico,Chappel,Chaffins,Celis,Carwile,Byram,Bruggeman,Brick,Bressler,Brathwaite,Brasfield,Bradburn,Boose,Boon,Bodie,Blosser,Blas,Bise,Bertsch,Bernardi,Bernabe,Bengtson,Barrette,Astorga,Armand,Antone,Alday,Albee,Abrahamson,Yarnell,Wiltse,Wile,Wiebe,Waguespack,Vasser,Upham,Tyre,Turek,Tune,Traxler,Torain,Tomaszewski,Tinnin,Tiner,Tindell,Teed,Styron,Stahlman,Staab,Spoon,Spells,Skiba,Shih,Sheperd,Seidl,Secor,Schutte,Sanfilippo,Ruder,Rondon,Reina,Rearick,Rank,Procter,Prochaska,Pettengill,Pauly,Neilsen,Nally,Mutter,Mullenax,Morano,Meads,Mcnaughton,Mcmurtry,Mcmath,Mckinsey,Matthes,Massenburg,Marlar,Margolis,Marcos,Malin,Magallon,Mackin,Lovette,Loughran,Loring,Longstreet,Loiselle,Lenihan,Laub,Kunze,Kull,Koepke,Knights,Kerwin,Kalinowski,Kagan,Innis,Innes,Husband,Holtzman,Heinemann,Harshman,Haider,Haack,Guss,Grondin,Grissett,Greenawalt,Gravel,Goudy,Goodlett,Goldston,Gokey,Goin,Gardea,Galaviz,Gafford,Gabrielson,Furlow,Fritch,Fordyce,Folger,Elizalde,Ehlert,Eckhoff,Eccleston,Ealey,Dubin,Dolphin,Dieter,Diemer,Deschamps,Delapena,Decicco,Debolt,Daum,Cullinan,Crittendon,Crase,Cossey,Coppock,Coots,Colyer,Columbus,Cluck,Chamberland,Cane,Burkhead,Bumpus,Buchan,Borman,Bork,Boe,Birkholz,Berardi,Benda,Behnke,Barter,Auer,Amezquita,Wotring,Wirtz,Wingert,Wiesner,Whitesides,Weyant,Wainscott,Vivian,Venezia,Varnell,Tussey,Trainer,Toll,Thurlow,Tack,Tabares,Stiver,Stell,Starke,Stanhope,Stanek,Sisler,Sinnott,Sidney,Siciliano,Shehan,Selph,Seager,Scurlock,Scranton,Santucci,Santangelo,Saltsman,Ruel,Ropp,Rolling,Rogge,Rettig,Renwick,Reidy,Reider,Redfield,Quam,Premo,Port,Pier,Peet,Parente,Paolucci,Pan,Palmquist,Orme,Ohler,Ogg,Netherton,Mutchler,Morita,Mistretta,Minnis,Middendorf,Menzel,Mendosa,Mendelson,Meaux,Mcspadden,Mcquaid,Mcnatt,Manigault,Maney,Mager,Lung,Lukes,Lopresti,Liriano,Lipton,Letson,Lechuga,Lazenby,Lauria,Larimore,Kwok,Kwak,Krupp,Krupa,Krum,Kopec,Kinchen,Kifer,Kerney,Kerner,Kennison,Kegley,Kays,Karcher,Justis,Johson,Jellison,Janke,Isabell,Huskins,Holzman,Hollie,Hinojos,Highland,Hefley,He,Hatmaker,Harte,Halloway,Hallenbeck,Goodwyn,Glaspie,Gillian,Geise,Fullwood,Fryman,Frew,Frakes,Fraire,Farrer,Enlow,Engen,Ellzey,Eckles,Earles,Ealy,Dunkley,Drinkard,Dreiling,Draeger,Dinardo,Dills,Desroches,Desantiago,Current,Curlee,Crumbley,Critchlow,Coury,Courtright,Coffield,Cleek,Christen,Charpentier,Cardone,Caples,Cantin,Buntin,Bugbee,Brinkerhoff,Brackin,Bourland,Bohl,Bogdan,Blassingame,Beacham,Banning,Auguste,Andreasen,Amann,Almon,Alejo,Adelman,Abston,Zeno,Yerger,Wymer,Woodberry,Windley,Whiteaker,Westfield,Weibel,Wanner,Waldrep,Vital,Villani,Vanarsdale,Utterback,Updike,Triggs,Topete,Tolar,Tigner,Thoms,Tauber,Tarvin,Tally,Swiney,Sweatman,Studebaker,Streets,Stennett,States,Starrett,Stannard,Stalvey,Sonnenberg,Smithey,Sieber,Sickles,Shinault,Segars,Sanger,Salmeron,Rothe,Rizzi,Rine,Ricard,Restrepo,Ralls,Ragusa,Quiroga,Ping,Phung,Pero,Pegg,Pavlik,Papenfuss,Oropeza,Omar,Okane,Neer,Nee,Nathaniel,Mudge,Mozingo,Molinaro,Mikel,Mcvicker,Mcgarvey,Mcfalls,Mccraney,Matus,Magers,Llanos,Livermore,Liss,Linehan,Leto,Leitner,Laymon,Lawing,Lawerence,Lacourse,Kwong,Kollar,Kneeland,Keo,Kennett,Kellett,Kangas,Janzen,Hutter,Huse,Huling,Hoss,Hohn,Hofmeister,Hewes,Hern,Harjo,Habib,Gust,Guice,Grullon,Greggs,Grayer,Granier,Grable,Gowdy,Giannini,Getchell,Gartman,Garnica,Ganey,Gallimore,Fray,Fetters,Fergerson,Farlow,Fagundes,Exley,Esteves,Enders,Edenfield,Easterwood,Drakeford,Dipasquale,Desousa,Deshields,Deeter,Dedmon,Debord,Daughtery,Cutts,Courtemanche,Coursey,Copple,Coomes,Collis,Coll,Cogburn,Clopton,Choquette,Chaidez,Castrejon,Calhoon,Burbach,Bulloch,Buchman,Bruhn,Bohon,Blough,Bien,Belmont,Baynes,Barstow,Zeman,Zackery,Yardley,Yamashita,Wulff,Wilken,Wiliams,Wickersham,Wible,Whipkey,Wedgeworth,Walmsley,Walkup,Vreeland,Verrill,Valera,Umana,Traub,Timothy,Swingle,Swing,Summey,Stroupe,Stockstill,Steffey,Stefanski,Statler,Stapp,Speights,Sons,Solari,Soderberg,Slick,Shunk,Shorey,Shewmaker,Sheilds,Schiffer,Schank,Schaff,Sagers,Rodger,Rochon,Riser,Rickett,Reale,Raglin,Poon,Polly,Polen,Plata,Pitcock,Percival,Palen,Pahl,Orona,Oberle,Nocera,Navas,Nault,Mullings,Mouser,Moos,Montejano,Monreal,Minick,Middlebrook,Meece,Mcmillion,Mccullen,Mauck,Marshburn,Maillet,Mahaney,Magner,Maclin,Lucey,Litteral,Lippincott,Leite,Leis,Leaks,Laurie,Lamarre,Kost,Jurgens,Jesus,Jerkins,Jager,Hurwitz,Hughley,Hotaling,Horstman,Hohman,Hocker,Hively,Hipps,Hile,Hessler,Hermanson,Hepworth,Henn,Helland,Hedlund,Harkless,Haigler,Gutierez,Gum,Grindstaff,Glantz,Giardina,Gerken,Gadsden,Freda,Finnerty,Feld,Farnum,Encinas,Elton,Eager,Drakes,Dennie,Cutlip,Curtsinger,Couto,Cortinas,Corby,Choice,Chiasson,Carle,Carballo,Brindle,Borum,Bober,Blagg,Birk,Berthiaume,Beahm,Batres,Basnight,Barbara,Backes,Axtell,Aust,Au,Atterberry,Alvares,Alt,Alegria,Abe,Yow,Yip,Woodell,Wojciechowski,Winfree,Winbush,Wiest,Wesner,Wax,Wamsley,Wakeman,Verner,Truex,Trafton,Toman,Thorsen,Thor,Theus,Tellier,Tallant,Szeto,Strope,Stills,Stage,Sorg,Simkins,Shuey,Shaul,Servin,Serio,Serafin,Senior,Sebring,Salguero,Saba,Ryerson,Rudder,Ruark,Rother,Rohrbaugh,Rohrbach,Rohan,Rogerson,Risher,Rigg,Reeser,Pryce,Prokop,Prins,Priebe,Prejean,Pinheiro,Petrone,Petri,Penson,Pearlman,Parikh,Pal,Pair,Natoli,Murakami,Mullikin,Mullane,Motes,Morningstar,Monks,Mcveigh,Mcgrady,Mcgaughey,Mccurley,Masi,Marchan,Manske,Maine,Maez,Lusby,Linde,Lile,Likens,Licon,Leroux,Lemaire,Legette,Lax,Laskey,Laprade,Laplant,Lady,Kolar,Kittredge,Kinley,Kerber,Kanagy,Johannes,Jetton,Jayne,January,Janik,Ippolito,Inouye,Hunsinger,Howley,Howery,Horrell,Hoosier,Holthaus,Hiner,Hilson,Hilderbrand,Hasan,Hartzler,Harnish,Harada,Hansford,Halligan,Hagedorn,Gwynn,Gudino,Greenstein,Greear,Gracey,Goudeau,Gose,Goodner,Ginsburg,Gerth,Gerner,Fyfe,Fujii,Frier,Frenette,Folmar,Fleisher,Fleischmann,Fetzer,Fern,Eisenman,Earhart,Dupuy,Dunkelberger,Drummer,Drexler,Dillinger,Dilbeck,Diana,Dewald,Demby,Deford,Daniell,Dake,Craine,Como,Clever,Chesnut,Casady,Carstens,Carrick,Carino,Carignan,Canchola,Cale,Bushong,Burman,Buono,Brownlow,Broach,Britten,Brickhouse,Boyden,Boulton,Borne,Borland,Bohrer,Blubaugh,Bever,Berggren,Benevides,Arocho,Arends,Amezcua,Almendarez,Zalewski,Witzel,Winkfield,Wilhoite,Vara,Vangundy,Vanfleet,Vanetten,Vandergriff,Urbanski,Tyrell,Troiano,Tickle,Thibodaux,Straus,Stoneking,Stjean,Stillings,Stiff,Stange,Square,Speicher,Speegle,Sowa,Smeltzer,Slawson,Simmonds,Shuttleworth,Serpa,Senger,Seidman,Schweiger,Schloss,Schimmel,Schechter,Sayler,Sabb,Sabatini,Ronan,Rodiguez,Riggleman,Richins,Reep,Reamer,Prunty,Porath,Plunk,Piland,Philbrook,Pettitt,Perna,Peralez,Pascale,Padula,Oboyle,Nivens,Nickols,Murph,Mundt,Munden,Montijo,Mcmanis,Mcgrane,Mccrimmon,Manzi,Mangold,Malick,Mahar,Maddock,Lust,Losey,Loop,Litten,Liner,Leff,Leedy,Leavell,Ladue,Krahn,Kluge,Junker,Iversen,Imler,Hurtt,Huizar,Hubbert,Howington,Hollomon,Holdren,Hoisington,Hise,Heiden,Hauge,Hartigan,Gutirrez,Griffie,Greenhill,Gratton,Granata,Gottfried,Gertz,Gautreaux,Furry,Furey,Funderburg,Flippen,Fitzgibbon,Fergus,Felice,Eye,Dyar,Drucker,Donoghue,Dildy,Devers,Detweiler,Despres,Denby,Degeorge,Cueto,Cranston,Courville,Clukey,Cirillo,Chon,Chivers,Caudillo,Catt,Butera,Bulluck,Buckmaster,Braunstein,Bracamonte,Bourdeau,Border,Bonnette,Bobadilla,Boaz,Blackledge,Beshears,Bernhard,Bergeson,Baver,Barthel,Balsamo,Bak,Aziz,Awad,Authement,Altom,Altieri,Abels,Zigler,Zhu,Younker,Yeomans,Yearwood,Wurster,Winget,Whitsett,Wechsler,Weatherwax,Wathen,Warriner,Wanamaker,Walraven,Viens,Vandemark,Vancamp,Uchida,Triana,Tinoco,Terpstra,Tellis,Tarin,Taranto,Takacs,Studdard,Struthers,Strout,Stiller,Spataro,Soderquist,Sliger,Silberman,Shurtleff,Sheetz,Schillinger,Ritch,Reif,Raybon,Ratzlaff,Radley,Putt,Putney,Prime,Press,Pinette,Piner,Petrin,Parise,Osbourne,Nyman,Northington,Noblitt,Nishimura,Nell,Neher,Nalls,Naccarato,Mucha,Mounce,Miron,Millis,Meaney,Mcnichols,Mckinnis,Mcjunkin,Mcduffy,Max,Marcello,Manrique,Mannion,Mangual,Malveaux,Mains,Lumsden,Lucien,Lohmann,Lipe,Lightsey,Lemasters,Leist,Laxton,Laverriere,Latorre,Lamons,Kral,Kopf,Knauer,Kitt,Kaul,Karas,Kamps,Jusino,Janis,Islam,Hullinger,Huges,Hornung,Hiser,Hempel,Helsel,Hassinger,Hargraves,Hammes,Hallberg,Gutman,Gumbs,Gruver,Graddy,Gonsales,Goncalves,Glennon,Gilford,Geno,Freshour,Flippo,Fifer,Few,Fermin,Fason,Farrish,Fallin,Ewert,Estepp,Escudero,Ensminger,Emmanuel,Emberton,Elms,Ellerbe,Eide,Dysart,Dougan,Dierking,Dicus,Detrick,Deroche,Depue,Demartino,Delosreyes,Dalke,Culbreath,Crownover,Crisler,Crass,Corsi,Chagnon,Centers,Cavanagh,Casson,Carollo,Cadwallader,Burnley,Burciaga,Burchard,Broadhead,Boris,Booze,Bolte,Body,Berens,Bellman,Bellard,Baril,Arden,Antonucci,Amado,Allie,Wolfgram,Winsor,Wimbish,Wilbert,Wier,Wallach,Viveros,Vento,Varley,Vanslyke,Vangorder,Touchstone,Tomko,Tiemann,Throop,Tamura,Talmadge,Swayze,Sturdevant,Strauser,Stolz,Stenberg,Stayton,Spohn,Spillers,Spillane,Sluss,Sloane,Slavens,Simonetti,Shofner,Shead,Senecal,Seales,Schueler,Schley,Schacht,Sauve,Sarno,Salsbury,Rothschild,Rosier,Rines,Reveles,Rein,Redus,Redfern,Reck,Ranney,Raggs,Prout,Prill,Preble,Prager,Plemons,Pippen,Pilon,Piccirillo,Pewitt,Pesina,Pecora,Otani,Orsini,Ollie,Oestreich,Odea,Ocallaghan,Northup,Niehaus,Newberg,Nasser,Narron,Monarrez,Mishler,Mcsherry,Mcelfresh,Mayon,Mauer,Mattice,Mash,Marrone,Marmolejo,Marini,Marie,Mara,Malm,Machen,Lunceford,Loewen,Liverman,Litwin,Linscott,Levins,Lenox,Legaspi,Leeman,Leavy,Lannon,Lamson,Lambdin,Labarre,Knouse,Klemm,Kleinschmidt,Kirklin,Keels,Juliano,Howser,Hott,Hosier,Hosea,Hopwood,Holyfield,Hodnett,Hirsh,Heimann,Height,Heckel,Harger,Hamil,Hajek,Gurganus,Gunning,Grange,Gonzalas,Goggins,Gerow,Gaydos,Garduno,Ganley,Galey,Farner,Ester,Engles,Emond,Emert,Ellenburg,Edick,Duell,Dublin,Dorazio,Dong,Dimond,Diederich,Dewalt,Depuy,Dempster,Demaria,Dehoyos,Dearth,Dealba,Dane,Czech,Crose,Crespin,Cogdill,Clinard,Cipriano,Chretien,Chalk,Cerny,Ceniceros,Celestin,Caple,Cacho,Burrill,Buhr,Buckland,Branam,Boysen,Bovee,Boos,Boler,Blom,Blasko,Beyers,Belz,Belmonte,Bednarz,Beckmann,Beaudin,Bazile,Barbeau,Balentine,Abrahams,Able,Zielke,Yunker,Yeates,Wrobel,Wike,Whisnant,Wherry,Wagnon,Vogan,Vansant,Vannest,Vallo,Ullery,Towles,Towell,Tiger,Thill,Taormina,Tannehill,Taing,Storrs,Stickles,Stetler,Sparling,Solt,Silcox,Sheard,Shadle,Seman,Selleck,Schlemmer,Scher,Sapien,Sainz,Rumble,Roye,Rosamond,Romain,Rizzuto,Resch,Rentz,Rather,Rasch,Ranieri,Purtell,Primmer,Portwood,Pontius,Pons,Pletcher,Pledger,Pirkle,Pillsbury,Pentecost,Peng,Paxson,Ortez,Organ,Oles,Newborn,Mullett,Muirhead,Mouzon,Mork,Mollett,Mohn,Mitcham,Melillo,Mee,Medders,Mcmiller,Mccleery,Mccaughey,Manders,Mak,Maciejewski,Macaulay,Lute,Lipman,Lewter,Larocque,Langton,Kriner,Knipp,Killeen,Karn,Kalish,Kaczor,Jonson,Jerez,Jarrard,Janda,Hymes,Hollman,Hollandsworth,Holl,Hobdy,Hitch,Hennen,Hemmer,Hagins,Haddox,Guitierrez,Guernsey,Gorsuch,Gholson,Genova,Gazaway,Gauna,Gammons,Freels,Fonville,Fly,Florian,Fleet,Fetterman,Fava,Farquhar,Farish,Fabela,Escoto,Eisen,Dossett,Dority,Dorfman,Demmer,Dehn,Dawley,Darbonne,Damore,Damm,Crosley,Cron,Crompton,Crichton,Cotner,Cordon,Conerly,Colvard,Clauson,Chess,Cheeseman,Charity,Cavallaro,Castille,Cabello,Burgan,Buffum,Bruss,Brassfield,Bowerman,Bothwell,Borgen,Bonaparte,Bombard,Boivin,Boissonneault,Bogner,Bodden,Boan,Blanche,Bittinger,Bickham,Bedolla,Bale,Bainbridge,Aybar,Avendano,Ashlock,Amidon,Almanzar,Akridge,Ackermann,Zager,Yong,Xavier,Worrall,Winans,Wilsey,Wightman,Westrick,Wenner,Warne,Warford,Verville,Utecht,Upson,Tuma,Tseng,Troncoso,Trollinger,Torbert,Taulbee,Sutterfield,Stough,Storch,Stonebraker,Stolle,Stilson,Stiefel,Steptoe,Stepney,Stender,Stemple,Staggers,Spurrier,Spray,Spinney,Spengler,Smartt,Skoog,Silvis,Sieg,Shuford,Selfridge,Seguin,Sedgwick,Sease,Scotti,Schroer,Schlenker,Schill,Savarese,Sapienza,Sanson,Sandefur,Salamone,Rusnak,Rudisill,Royalty,Rothermel,Roca,Resendiz,Reliford,Rasco,Raiford,Quisenberry,Quijada,Pullins,Puccio,Postell,Poppe,Pinter,Piche,Petrucci,Pellegrin,Pelaez,Patti,Paton,Pasco,Parkes,Paden,Pabst,Orchard,Olmsted,Newlon,Mynatt,Mustafa,Mower,Morrone,Moree,Moffat,Mixson,Minner,Min,Millette,Mederos,Mcgahan,Mcconville,Maughan,Massingill,Marano,Macri,Lovern,Lichtenstein,Leonetti,Lehner,Lawley,Laramie,Lappin,Lahti,Lago,Lacayo,Kuester,Knee,Kincade,Junior,Juhl,Joslyn,Jiron,Jessop,Jerry,Jarosz,Jain,Hults,Hoge,Hodgins,Hoban,Hinkson,Hillyard,Herzig,Hervey,Henriksen,Hawker,Hause,Hard,Hankerson,Gregson,Golliday,Gilcrease,Gessner,Gerace,Garwood,Garst,Gaillard,Flinchum,Fishel,Fishback,Filkins,Fentress,Fabre,Ethier,Espana,Eisner,Ehrhart,Efird,Drennon,Dominy,Dominique,Domingue,Dipaolo,Dinan,Dimartino,Deskins,Dengler,Defreitas,Defranco,Dancer,Dahlin,Cutshaw,Cuthbert,Croyle,Crothers,Critchfield,Cowie,Costner,Coppedge,Copes,Ciccone,Champ,Cesar,Caufield,Capo,Cambron,Cambridge,Buser,Burnes,Buhl,Buendia,Brindley,Brecht,Bourgoin,Boomer,Blackshire,Birge,Benninger,Bembry,Beil,Begaye,Barrentine,Barks,Banton,Balmer,Baity,Auerbach,Ambler,Alexandre,Ackerson,Zurcher,Zell,Wynkoop,Wallick,Waid,Vos,Vizcaino,Vester,Veale,Vandermark,Vanderford,Tuthill,Trivette,Thiessen,Tewksbury,Tao,Tabron,Swim,Swasey,Swanigan,Stoughton,Stoudt,Stimson,Stecker,Stead,Stall,Spady,Souther,Smoak,Sklar,Simcox,Sidwell,Sharon,Seybert,Sesco,Seeman,Seaborn,Schwenk,Schmeling,Rossignol,Robillard,Robicheaux,Riveria,Rippeon,Ridgley,Remaley,Rehkop,Reddish,Reach,Rauscher,Rachel,Quirion,Pusey,Pruden,Pressler,Potvin,Pospisil,Paradiso,Pangburn,Palmateer,Ownby,Otwell,Osterberg,Osmond,Olsson,Old,Oberlander,Nusbaum,Novack,Nokes,Nicastro,Nehls,Nay,Naber,Mulhern,Motter,Moretz,Milian,Mercedes,Mckeel,Mcclay,Mccart,Matsuda,Mary,Martucci,Marple,Marko,Marciniak,Manes,Mancia,Maker,Macrae,Lybarger,Lint,Lineberger,Levingston,Lecroy,Lattimer,Laseter,Kulick,Krier,Knutsen,Klem,Kinne,Kinkade,Ketterman,Kerstetter,Kersten,Karam,Jury,Joshi,Jin,Jent,Jefcoat,Hillier,Hillhouse,Hettinger,Henthorn,Henline,Helzer,Heitzman,Heineman,Heenan,Haughton,Haris,Harbert,Haman,Grinstead,Gremillion,Gorby,Giraldo,Gioia,Gerardi,Geraghty,Gaunt,Gatson,Gardin,Gans,Gammill,Games,Gain,Friedlander,Frahm,Fossett,Fosdick,Forth,Forbush,Fondren,Fleckenstein,Fitchett,Filer,Feliz,Feist,Ewart,Evelyn,Esters,Elsner,Edgin,Eddie,Easterly,Dussault,Durazo,Don,Devereaux,Deshotel,Deckert,Dargan,Dare,Cornman,Conkle,Condit,Commander,Claunch,Clabaugh,Chute,Cheesman,Chea,Charney,Charleston,Casella,Carone,Carbonell,Canipe,Campana,Calles,Cabezas,Cabell,Buttram,Bustillos,Buskirk,Boyland,Bourke,Blakeley,Big,Berumen,Berrier,Bench,Belli,Behrendt,Baumbach,Bartsch,Baney,Arambula,Alldredge,Allbritton,Ziemba,Zanders,Youngquist,Yoshioka,Yohe,Wunder,Woodfin,Wojtowicz,Winkel,Wilmore,Willbanks,Wesolowski,Wendland,Walko,Votaw,Vanek,Uriarte,Urbano,Turnipseed,Triche,Trautman,Towler,Tokarz,Temples,Tefft,Teegarden,Syed,Swigart,Stryker,Stoller,Stapler,Stansfield,Smit,Smelley,Sicard,Shulman,Shew,Shear,Sheahan,Sharpton,Selvidge,Schlesinger,Savell,Sandford,Sabatino,Rosenbloom,Roepke,Rish,Rhames,Renken,Reger,Rappaport,Quarterman,Puig,Prasad,Poplar,Pizano,Pigott,Pick,Phair,Petrick,Patt,Pascua,Paramore,Papineau,Olivieri,Ogren,Norden,Noga,Nisbet,Munk,Munch,Mui,Morvant,Moro,Moloney,Merz,Meng,Meltzer,Mellinger,Mehl,Mcnealy,Mckernan,Mchaney,Mccleskey,Mcandrews,Mayton,Mayor,Markert,Maresca,Marcellus,Maner,Mandujano,Malpass,Macintyre,Lytton,Lyall,Lummus,Longshore,Longfellow,Lokey,Locher,Leverette,Lepe,Lefever,Leeson,Lederer,Lampert,Lagrone,La,Kreider,Korth,Knopf,Kleist,Kiss,Keltner,Kelling,Kaspar,Kappler,Justin,Josephs,Jiang,Huckins,Horace,Holub,Hofstetter,Hoehn,Higginson,Hennings,Heid,Havel,Hauer,Harnden,Hargreaves,Hanger,Guild,Guidi,Grate,Grandy,Grandstaff,Goza,Goodridge,Goodfellow,Goggans,Godley,Giusti,Gilyard,Geoghegan,Galyon,Gaeta,Funes,Font,Flor,Flanary,Fales,Erlandson,Ellett,Elia,Edinger,Dziedzic,Duerr,Draughn,Donoho,Dimatteo,Devos,Dematteo,Degnan,Darlington,Danis,Dam,Dahlstrom,Dahlke,Czajkowski,Cumbie,Culbert,Crosier,Croley,Corry,Clinger,Cheshire,Chalker,Cephas,Caywood,Cavalier,Capehart,Cales,Cadiz,Bussiere,Burriss,Burkart,Brundidge,Bronstein,Breeze,Bradt,Boydston,Bostrom,Borel,Bolles,Blay,Blackwelder,Bissett,Bevers,Bester,Bernardino,Benefiel,Belote,Beedle,Beckles,Baysinger,Bassler,Bartee,Barlett,Bargas,Barefield,Baptista,Arterburn,Armas,Apperson,Amoroso,Amedee,Zullo,Zellner,Yelton,Willems,Wilkin,Wiggin,Widman,Welk,Weingarten,Walla,Viers,Vess,Verdi,Veazey,Vannote,Tullos,Trudell,Trower,Trosper,Trimm,Trew,Tousignant,Topp,Tocco,Thoreson,Terhune,Tatom,Suniga,Sumter,Steeves,Stansell,Soltis,Sloss,Slaven,Sing,Shisler,Sheriff,Shanley,Servantes,Selders,Segrest,Seese,Seeber,Schaible,Savala,Sartor,Rutt,Rumbaugh,Ruis,Roten,Roessler,Ritenour,Riney,Restivo,Rene,Renard,Rakestraw,Rake,Rachal,Quiros,Pullin,Prudhomme,Primeaux,Prestridge,Presswood,Ponte,Polzin,Poarch,Pittenger,Piggott,Pickell,Phaneuf,Parvin,Parmley,Palmeri,Paisley,Ozment,Ormond,Ordaz,Ono,Olea,Obanion,Oakman,Novick,Nicklas,Nemec,Nappi,Mund,Morfin,Mera,Melgoza,Melby,Mcgoldrick,Mcelwain,Mcchristian,Mccaw,Marquart,Marlatt,Markovich,Mahr,Lupton,Lucus,Lorusso,Lerman,Leddy,Leaman,Leachman,Lavalle,Laduke,Kummer,Koury,Konopka,Koh,Koepp,Kloss,Klock,Khalil,Kernan,Kappel,Jakes,Inoue,Hutsell,Howle,Honore,Hole,Hockman,Hockaday,Hiltz,Hetherington,Hesser,Hershman,Heng,Heffron,Headen,Haskett,Hartline,Harned,Guillemette,Guglielmo,Guercio,Greenbaum,Goris,Glines,Gilmour,Gardella,Gadd,Gabler,Gabbert,Fuselier,Freudenburg,Fragoso,Follis,Flemings,Feltman,Febus,Farren,Fallis,Evert,Ekstrom,Eastridge,Dyck,Dufault,Dubreuil,Dresser,Drapeau,Domingues,Dolezal,Dinkel,Didonato,Devitt,Devane,Demott,Daughtrey,Daubert,Das,Darrell,Creason,Crary,Costilla,Chipps,Cheatwood,Carmean,Canton,Caffrey,Burgher,Buker,Brunk,Brodbeck,Brantner,Brandy,Bolivar,Boerner,Bodkin,Biel,Betty,Bencomo,Bellino,Beliveau,Beauvais,Beaupre,Baylis,Baskett,Barcus,Barbera,Baltz,Asay,Arney,Arcuri,Ankney,Agostini,Addy,Zwilling,Zubia,Zollinger,Zeitz,Yard,Yanes,Winship,Winningham,Wickline,Webre,Waddington,Vosburgh,Vessels,Verrett,Vedder,Varnum,Vandeventer,Vacca,Usry,Towry,Touchet,Tookes,Tonkin,Timko,Tibbitts,Thedford,Tarleton,Talty,Talamantez,Tafolla,Sugg,Strecker,Stirling,Steffan,Spiva,Slape,Siemens,Shatzer,Seyler,Seamans,Schmaltz,Schipper,Sasso,Sailor,Ruppe,Runner,Royals,Roudebush,Ripple,Riemer,Richarson,Revilla,Reichenbach,Ratley,Railsback,Quayle,Poplin,Poorman,Ponton,Polo,Pollitt,Poitras,Piscitelli,Piedra,Pickles,Pew,Perera,People,Penwell,Pelt,Pauline,Parkhill,Paladino,Ore,Oram,Olmo,Oliveras,Olivarria,Ogorman,Near,Naron,Na,Muncie,Mowbray,Morones,Moretti,Monn,Mitts,Minks,Minarik,Mimms,Milliron,Millington,Millhouse,Messersmith,Mcnett,Mckinstry,Mcgeorge,Mcdill,Mcateer,Mazzeo,Matchett,Mahood,Mabery,Lundell,Louden,Losoya,Lisk,Lezama,Leib,Lebo,Lanoue,Lanford,Lafortune,Kump,Krone,Kreps,Kott,Kopecky,Kolodziej,Knuckles,Kinman,Kimmons,Kelty,Kaster,Karlson,Kania,Jules,Joyal,Job,Jenner,Jasinski,Jandreau,Isenhour,Hunziker,Huhn,Houde,Houchins,Holtman,Hodo,Heyman,Hentges,Hedberg,Hayne,Haycraft,Harshbarger,Harshaw,Harriss,Haring,Hansell,Hanford,Handler,Hamburg,Hamblen,Gunnell,Groat,Gorecki,Gochenour,Gleeson,Genest,Geiser,Gabriele,Fulghum,Friese,Fridley,Freeborn,Frailey,Flaugher,Fiala,Ettinger,Etheredge,Espitia,Eriksen,Engelbrecht,Engebretson,Elie,Eickhoff,Edney,Edelen,Eberhard,Eastin,Eakes,Driggs,Doner,Donaghy,Disalvo,Deshong,Dahms,Dahlquist,Curren,Cripe,Cree,Creager,Corle,Conatser,Commons,Coggin,Coder,Coaxum,Closson,Clodfelter,Classen,Chittenden,Castilleja,Casale,Cartee,Carriere,Canup,Canizales,Burgoon,Bunger,Bugarin,Buchanon,Bruning,Bruck,Brookes,Broadwell,Brier,Brekke,Breese,Bracero,Bowley,Bowersox,Bose,Bogar,Blossom,Blauser,Blacker,Bjorklund,Belair,Baumer,Basler,Barb,Baltimore,Baize,Baden,Auman,Amundsen,Amore,Alvarenga,Adan,Adamczyk,Yerkes,Yerby,Yawn,Yamaguchi,Worthey,Wolk,Wixom,Wiersma,Wieczorek,Whiddon,Weyer,Wetherington,Wein,Watchman,Warf,Wansley,Vesely,Velazco,Vannorman,Valasquez,Utz,Urso,Turco,Turbeville,Trivett,Torrance,Toothaker,Toohey,Tondreau,Thaler,Sylvain,Swindler,Swigert,Swider,Stiner,Stever,Steffes,Stampley,Stair,Smidt,Skeete,Silvestre,Shy,Shutts,Shock,Shealey,Seigler,Schweizer,Schuldt,Schlichting,Scherr,Saulsberry,Saner,Rosin,Rosato,Roling,Rohn,Rix,Rister,Remley,Remick,Recinos,Ramm,Raabe,Pursell,Poythress,Poli,Pokorny,Plum,Pettry,Petrey,Petitt,Penman,Payson,Paquet,Pappalardo,Outland,Oscar,Orenstein,Nuttall,Nuckols,Nott,Nimmo,Murtagh,Mousseau,Moulder,Mooneyhan,Moak,Minch,Miera,Mercuri,Meighan,Mcnelly,Mcguffin,Mccreery,Mcclaskey,Man,Mainor,Luongo,Lundstrom,Loughman,Loose,Lobo,Lobb,Linhart,Liberty,Lever,Leu,Leiter,Lehoux,Lehn,Lares,Lapan,Langhorne,Lamon,Ladwig,Ladson,Kuzma,Kreitzer,Knop,Keech,Kea,Kadlec,Jo,Jhonson,Jantz,Inglis,Husk,Hulme,Housel,Hofman,Hillery,Heidenreich,Heaps,Haslett,Harting,Hartig,Hamler,Halton,Hallum,Gutierres,Guida,Guerrier,Grossi,Gress,Greenhalgh,Gravelle,Gow,Goslin,Gonyea,Gipe,Gerstner,Gasser,Garceau,Gannaway,Gama,Gallop,Gaiser,Fullilove,Foutz,Fossum,Flannagan,Farrior,Faller,Ericksen,Entrekin,Enochs,Englund,Ellenberger,Eastland,Earwood,Dudash,Du,Drozd,Desoto,Delph,Dekker,Dejohn,Degarmo,Defeo,Defalco,Deblois,Dacus,Cudd,Crossen,Crooms,Cronan,Costin,Costanza,Cordray,Comerford,Collie,Colegrove,Coldwell,Claassen,Chartrand,Castiglione,Carte,Cardella,Carberry,Capp,Capobianco,Cangelosi,Buch,Brunell,Brucker,Brockett,Brizendine,Brinegar,Brimer,Brase,Bosque,Bonk,Bolger,Bohanon,Bohan,Blazek,Berning,Bergan,Bennette,Beauchemin,Battiste,Barra,Balogh,Avis,Avallone,Aubry,Ashcroft,Asencio,Arledge,Anchondo,Amy,Alvord,Acheson,Zaleski,Yonker,Wyss,Wycoff,Woodburn,Wininger,Winders,Willmon,Wiechmann,Westley,Weatherholt,Warnick,Wardle,Warburton,Volkert,Virgin,Villanveva,Veit,Vass,Vanallen,Tung,Toribio,Toothman,Tiggs,Thornsberry,Thome,Tepper,Teeple,Tebo,Tassone,Tann,Sultan,Stucker,Stotler,Stoneman,Stehle,Stanback,Stallcup,Spurr,Speers,Spada,Solum,Smolen,Sinn,Silvernail,Sholes,Shives,Shain,Secrest,Seagle,Schuette,Schoch,Schnieders,Schild,Schiavone,Schiavo,Scharff,Santee,Sandell,Salvo,Rollings,Rollin,Rivenburg,Ritzman,Rist,Rio,Ricardo,Reynosa,Retana,Reiber,Regnier,Rarick,Ransome,Rall,Propes,Prall,Poyner,Ponds,Poitra,Plaster,Pippins,Pinion,Piccolo,Phu,Perillo,Penrose,Pendergraft,Pelchat,Peed,Patenaude,Palko,Odoms,Oddo,Novoa,Noone,Newburn,Negri,Nantz,Mosser,Moshier,Molter,Molinari,Moler,Millman,Meurer,Mendel,Mcray,Mcnicholas,Mcnerney,Mckillip,Mcilvain,Mcadory,Matter,Master,Marmol,Marinez,Manzer,Mankin,Makris,Majeski,Magnus,Maffei,Luoma,Luman,Luebke,Luby,Lomonaco,Loar,Litchford,Lintz,Licht,Levenson,Legge,Laughter,Lanigan,Krom,Kreger,Koop,Kober,Klima,Kitterman,Kinkead,Kimbell,Kilian,Kibbe,Kendig,Kemmer,Kash,Jenkin,Inniss,Hurlbut,Hunsucker,Hugo,Huckabee,Hoxie,Hoglund,Hockensmith,Hoadley,Hinkel,Higuera,Herrman,Heiner,Hausmann,Haubrich,Hassen,Hanlin,Hallinan,Haglund,Hagberg,Gullo,Gullion,Groner,Greenwalt,Grand,Goodwill,Gong,Gobert,Glowacki,Glessner,Gines,Gildersleeve,Gildea,Gerke,Gerhard,Gebhard,Gatton,Gately,Galasso,Fralick,Fouse,Fluharty,Faucette,Fairfax,Evanoff,Elser,Ellard,Egerton,Edie,Ector,Ebling,Dunkel,Duhart,Drysdale,Dostal,Dorey,Dolph,Doles,Dismukes,Digregorio,Digby,Dewees,Deramus,Denniston,Dennett,Deloney,Delaughter,Darcy,Cuneo,Cumberland,Crotts,Crosswhite,Cremeans,Creasey,Cottman,Cothern,Costales,Cosner,Corpus,Cora,Constable,Colligan,Cobble,Clutter,Chupp,Chevez,Chatmon,Chaires,Caplan,Caffee,Cabana,Burrough,Burditt,Buckler,Brunswick,Brouillard,Broady,Bowlby,Bouley,Borgman,Boltz,Boddy,Blackston,Birdsell,Bedgood,Bate,Basil,Bartos,Barriga,Barrie,Barna,Barcenas,Banach,Baccus,Auclair,Ashman,Arter,Arendt,Ansell,Allums,Allsop,Allender,Alber,Albarran,Adelson,Zoll,Wysong,Wimbley,Wildes,Whitis,Whitehill,Whicker,Weymouth,Well,Weldy,Wark,Wareham,Waddy,Viveiros,Vito,Vides,Vecchio,Vath,Vandoren,Vanderhoof,Unrein,Uecker,Tsan,Trepanier,Tregre,Torkelson,Ton,Tobler,Tineo,Timmer,Swopes,Swofford,Sweeten,Swarts,Summerfield,Sumler,Stucky,Strozier,Stigall,Stickel,Stennis,Stelzer,Steely,Solar,Slayden,Skillern,Shurtz,Shelor,Shellenbarger,Shand,Shabazz,Seo,Scroggs,Schwandt,Schrecengost,Schoenrock,Schirmer,Sandridge,Ruzicka,Rozek,Rowlands,Roser,Rosendahl,Romanowski,Romaine,Rolston,Rink,Riggio,Reichman,Redondo,Reay,Rawlinson,Raskin,Raine,Quandt,Purpura,Purdue,Pruneda,Prevatte,Prettyman,Pinedo,Pierro,Pidgeon,Phillippi,Pfeil,Penix,Peasley,Paro,Overall,Ospina,Ortegon,Ogata,Ogara,Normandin,Nordman,Nims,Nassar,Motz,Morlan,Mooring,Moles,Moir,Mizrahi,Mire,Minaya,Millwood,Mikula,Messmer,Meikle,Mctaggart,Mcgonagle,Mcewan,Mccasland,Mccane,Mccaffery,Mcalexander,Mattocks,Mattie,Matranga,Martone,Markland,Maravilla,Manno,Manly,Mancha,Mallery,Magno,Lorentz,Locklin,Livingstone,Lipford,Lininger,Line,Liao,Lepley,Leming,Lemelin,Leadbetter,Lawhon,Lattin,Langworthy,Lampman,Lambeth,Lamarr,Lahey,Krajewski,Klopp,Kinnison,Kestner,Kerry,Kennell,Karim,Jozwiak,Jakubowski,Jagger,Ivery,Ishmael,Iliff,Iddings,Hudkins,Houseman,Holz,Holderman,Hoehne,Highfill,Hiett,Heskett,Heldt,Hedman,Hayslett,Hatchell,Hasse,Hamon,Hamada,Hakala,Haislip,Haffey,Hackbarth,Guo,Gullickson,Guerrette,Guan,Greenblatt,Goudreau,Gongora,Godbout,Glaude,Gills,Gillison,Gigliotti,Gargano,Gallucci,Galli,Galante,Frasure,Fodor,Fizer,Fishburn,Finkbeiner,Finck,Fager,Estey,Espiritu,Eppinger,Epperly,Emig,Eckley,Dray,Dorsch,Dille,Devita,Deslauriers,Demery,Delorme,Delbosque,Dauphin,Dantonio,Curd,Crume,Crown,Cozad,Cossette,Comacho,Climer,Chadbourne,Cespedes,Cayton,Castaldo,Carpino,Carls,Capozzi,Canela,Cadet,Buzard,Busick,Burlison,Brinkmann,Bridgeforth,Bourbeau,Bornstein,Boots,Bonfiglio,Boice,Boese,Biondi,Bilski,Betton,Berwick,Berlanga,Behan,Becraft,Barrientez,Banh,Balke,Balderrama,Bahe,Bachand,Atlas,Armer,Arceo,Aliff,Alatorre,Zermeno,Zane,Younce,You,Yeoman,Yamasaki,Wroten,Worm,Woodby,Winer,Wilmer,Willits,Wilcoxon,Wehmeyer,Waterbury,Wass,Wann,Wake,Wachtel,Vizcarra,Vince,Victory,Veitch,Vanderbilt,Vallone,Vallery,Ureno,Tyer,Tipps,Tiedeman,Theberge,Texeira,Taub,Tapscott,Stutts,Stults,Stukes,Staff,Spink,Sottile,Smithwick,Slane,Simeone,Silvester,Siegrist,Shiffer,Sheedy,Sheaffer,Severin,Sellman,Scotto,Schupp,Schueller,Schreier,Schoolcraft,Schoenberger,Schnabel,Sangster,Samford,Saliba,Ryles,Ryans,Rossetti,Rodriguz,Risch,Riel,Rezendes,Rester,Rencher,Recker,Rathjen,Profitt,Poteete,Polizzi,Perrigo,Patridge,Osby,Orvis,Opperman,Oppenheim,Onorato,Olaughlin,Ohagan,Ogles,Oehler,Obyrne,Nuzzo,Nickle,Nease,Neagle,Navarette,Nagata,Musto,Morning,Morison,Montz,Mogensen,Mizer,Miraglia,Mingus,Migliore,Merideth,Menges,Mellor,Mcnear,Mcnab,Mcloud,Mcelligott,Mccollom,Maynes,Marquette,Markowski,Marcantonio,Mar,Maldanado,Makin,Macey,Lundeen,Lovin,Longino,Lisle,Linthicum,Limones,Lesure,Lesage,Leisure,Lauver,Laubach,Latshaw,Lary,Lapham,Lacoste,Lacher,Kutcher,Knickerbocker,Klos,Klingler,Kleiman,Kittleson,Kimbrel,Kimberly,Kemmerer,Kelson,Keese,Kam,Kallas,Jurgensen,Junkins,Juneau,Juergens,Jolliff,Jelks,Janicki,Jang,Innocent,Ingles,Inge,Huguley,Huggard,Howton,Hone,Holford,Holding,Hogle,Hipple,Heimbach,Heider,Heidel,Havener,Hattaway,Harrah,Hanscom,Hankinson,Hamdan,Gridley,Goulette,Goulart,Goodspeed,Goodrow,Go,Girardi,Gent,Gautreau,Ganz,Gandara,Gamblin,Galipeau,Fyffe,Furrow,Fulp,Fricks,Frase,Frandsen,Fout,Foulks,Fouche,Foskey,Forgey,Foor,Fobbs,Finklea,Fincham,Figueiredo,Festa,Ferrier,Fellman,Eslick,Eilerman,Eckart,Eaglin,Dunfee,Dumond,Drewry,Douse,Domino,Dimick,Diener,Dickert,Deines,Degree,Declue,Daw,Dattilo,Danko,Custodio,Cuccia,Crunk,Crispin,Corp,Cornwall,Corea,Coppin,Considine,Coniglio,Conboy,Collar,Cockrum,Clute,Clewis,Claude,Christiano,Channell,Channel,Cerrato,Cecere,Catoe,Castillon,Castile,Carstarphen,Carmouche,Caperton,Buteau,Bury,Bumpers,Brey,Brenton,Brazeal,Brassard,Brass,Braga,Bradham,Bourget,Borrelli,Borba,Boothby,Bohr,Bohm,Boehme,Bodin,Bloss,Blocher,Bizzell,Bieker,Berthelot,Bernardini,Berends,Benard,Belser,Baze,Bartling,Barrientes,Barras,Barcia,Banfield,Aurand,Artman,Arnott,Arend,Ardis,Amon,Almaguer,Allee,Albarado,Alameda,Abdo,Zuehlke,Zoeller,Yokoyama,Yocom,Wyllie,Woolum,Wint,Winland,Wink,Wilner,Wilmes,Whitlatch,Westervelt,Walthall,Walkowiak,Walburn,Viviano,Vanderhoff,Valez,Ugalde,Trumbull,Todaro,Tilford,Tidd,Tibbits,Terranova,Templeman,Tannenbaum,Talmage,Tabarez,Swearengin,Swartwood,Svendsen,Strum,Strack,Storie,Stockard,Steinbeck,Starns,Stanko,Stankiewicz,Stacks,Stach,Sproles,Spenser,Smotherman,Slusser,Sinha,Silber,Siefert,Siddiqui,Shuff,Sherburne,Seldon,Seddon,Schweigert,Schroeter,Schmucker,Saffold,Rutz,Rundle,Rosinski,Rosenow,Rogalski,Ridout,Rhymer,Replogle,Regina,Reda,Raygoza,Ratner,Rascoe,Rahm,Quincy,Quast,Pry,Pressnell,Predmore,Pou,Porto,Pleasants,Pigford,Pavone,Patnaude,Parramore,Papadopoulos,Palmatier,Ouzts,Oshields,Ortis,Olmeda,Olden,Okamoto,Norby,Nitz,Niebuhr,Nevius,Neiman,Neidig,Neece,Murawski,Mroz,Moylan,Moultry,Mosteller,Moring,Morganti,Mook,Moffet,Mettler,Merlo,Mengel,Mendelsohn,Meli,Melchior,Mcmeans,Mcfaddin,Mccullers,Mccollister,Mccloy,Mcclaine,Maury,Maser,Martelli,Manthey,Malkin,Maio,Magwood,Maginnis,Mabon,Luton,Lusher,Lucht,Lobato,Levis,Letellier,Legendre,Laurel,Latson,Larmon,Largo,Landreneau,Landgraf,Lamberson,Kurland,Kresge,Korman,Korando,Klapper,Kitson,Kinyon,Kincheloe,Kawamoto,Kawakami,Jenney,Jeanpierre,Ivers,Issa,Ince,Hugh,Hug,Honda,Hollier,Hollars,Hoerner,Hodgkinson,Hiott,Hibbitts,Herlihy,Henricks,Heavner,Hayhurst,Harvill,Harewood,Hanselman,Hanning,Gwyn,Gustavson,Grounds,Grizzard,Grinder,Graybeal,Gravley,Gorney,Goll,Goehring,Godines,Gobeil,Glickman,Giuliano,Gimbel,Gift,Geib,Gayhart,Gatti,Gains,Gadberry,Frei,Fraise,Fouch,Forst,Forsman,Folden,Fogleman,Figaro,Fetty,Feely,Fabry,Eury,Estill,Epling,Elamin,Echavarria,Dutil,Duryea,Dumais,Drago,Downard,Douthit,Doolin,Dobos,Dison,Dinges,Diebold,Desilets,Deshazo,Depaz,Degennaro,Dall,Cyphers,Cryer,Croce,Crisman,Credle,Coriell,Copp,Coop,Compos,Colmenero,Cogar,Cliff,Chapel,Carnevale,Campanella,Caley,Calderone,Burtch,Brouwer,Brehmer,Brassell,Brafford,Bourquin,Bourn,Bohnert,Blewett,Blass,Blakes,Bhakta,Besser,Berge,Bellis,Balfour,Avera,Austria,Applin,Ammon,Alsop,Aleshire,Akbar,Zoller,Zapien,Wymore,Wyble,Wolken,Wix,Wickstrom,Whobrey,Whigham,Westerlund,Welsch,Weisser,Weisner,Weinstock,Wehner,Watlington,Wakeland,Wafer,Virgen,Victorino,Veltri,Veith,Urich,Uresti,Umberger,Twedt,Tuohy,Tschida,Trumble,Troia,Tristan,Trimmer,Topps,Tonn,Tiernan,Threet,Thrall,Thetford,Teneyck,Tartaglia,Swords,Strohl,Streater,Strausbaugh,Stradley,Stonecipher,Steadham,Stansel,Stalcup,Stabile,Sprenger,Spradley,Speier,Southwood,Sorrels,Slezak,Skow,Sirmans,Simental,Silk,Sifford,Sievert,Shover,Sheley,Selzer,Scriven,Schwindt,Schwan,Schroth,Saylors,Saragosa,Sant,Salaam,Saephan,Routt,Rousey,Ros,Rolfes,Rieke,Rieder,Richeson,Redinger,Rasnick,Rapoza,Rambert,Rafael,Quist,Pyron,Punch,Pullman,Przybylski,Pridmore,Pooley,Pines,Perkinson,Perine,Perham,Pecor,Peavler,Partington,Panton,Oliverio,Olague,Ohman,Ohearn,Noyola,Nicolai,Nebel,Murtha,Muff,Mowrey,Moroney,Morgenstern,Morant,Monty,Monsour,Mohammad,Moffit,Mijares,Meriwether,Mendieta,Melendrez,Mejorado,Mckittrick,Mckey,Mckenny,Mckelvy,Mckechnie,Mcelvain,Mccoin,Mazzarella,Mazon,Maurin,Matthies,Maston,Maske,Marzano,Marmon,Marburger,Mangus,Mangino,Mallet,Luo,Losada,Londono,Lobdell,Lipson,Lesniak,Leighty,Lei,League,Lavallie,Lareau,Laperle,Lape,Laforce,Laffey,Kuehner,Kravitz,Kowalsky,Kohr,Kinsman,Keppler,Kennemer,Keiper,Keely,Kaler,Jun,Jelinek,Jarnagin,Issac,Isakson,Hypes,Hutzler,Huls,Horak,Hitz,Hice,Herrell,Henslee,Heitz,Heiss,Heiman,Hasting,Hartwick,Harmer,Harland,Hammontree,Haldeman,Hakes,Guse,Guillotte,Guard,Groleau,Greve,Greenough,Golub,Golson,Goldschmidt,Golder,Godbolt,Gilmartin,Gies,Gibby,Geren,Genthner,Gendreau,Gemmill,Gaymon,Galyean,Galeano,Friar,Folkerts,Fleeman,Fitzgibbons,Ferranti,Felan,Farrand,Eoff,Enger,Engels,Ducksworth,Duby,Dry,Drumheller,Douthitt,Doris,Donis,Dixion,Dittrich,Dials,Dessert,Descoteaux,Depaul,Denker,Demuth,Demelo,Delacerda,Deforge,Danos,Dalley,Daigneault,Cybulski,Crystal,Cristobal,Cothren,Corns,Corkery,Copas,Coco,Clubb,Clore,Chitty,Chichester,Chery,Charon,Chamber,Chace,Catanzaro,Castonguay,Cassella,Caroll,Carlberg,Cammarata,Calle,Cajigas,Byas,Buzbee,Busey,Burling,Bufkin,Brzezinski,Brun,Brickner,Brabham,Boller,Bodily,Bockman,Bleich,Blakeman,Bisbee,Bier,Bezanson,Bevilacqua,Besaw,Berrian,Berkeley,Bequette,Beauford,Baumgarten,Baudoin,Batie,Basaldua,Bardin,Bangert,Banes,Backlund,Avitia,Artz,Archey,Apel,Amico,Alam,Aden,Zebrowski,Yokota,Wormley,Wootton,Woodie,Womac,Wiltz,Wigington,Whitehorn,Whisman,Weisgerber,Weigle,Weedman,Watkin,Wasilewski,Wadlington,Wadkins,Viverette,Vidaurri,Vidales,Vezina,Vanleer,Vanhoy,Vanguilder,Vanbrunt,Uy,Updegraff,Tylor,Trinkle,Touchette,Tilson,Tilman,Tengan,Tarkington,Surrett,Super,Summy,Streetman,Straughter,Steere,Stalling,Spruell,Spadaro,Solley,Smathers,Silvera,Siems,Shreffler,Sholar,Selden,Schaper,Samayoa,Ruggeri,Rowen,Rosso,Rosenbalm,Roosevelt,Roose,Ronquillo,Rogowski,Rexford,Repass,Renzi,Renick,Renda,Rehberg,Reaper,Ranck,Raffa,Rackers,Raap,Pugsley,Puglisi,Prinz,Primus,Pounders,Pon,Pompa,Plasencia,Pipkins,Pillar,Petrosky,Pelley,Pauls,Pauli,Parkison,Parisien,Pangle,Pancoast,Palazzolo,Owenby,Overbay,Orris,Orlowski,Nipp,Newbern,Nedd,Nealon,Najar,Mysliwiec,Myron,Myres,Musson,Murrieta,Munsell,Mumma,Muldowney,Moyle,Mowen,Mose,Morejon,Moodie,Monier,Mikkelsen,Miers,Metzinger,Melin,Mcquay,Mcpeek,Mcneeley,Mcglothin,Mcghie,Mcdonell,Mccumber,Mccranie,Mcbean,Mayhugh,Marts,Marenco,Manges,Lynam,Lupien,Luff,Luebbert,Loh,Loflin,Lococo,Loch,Lis,Linke,Lightle,Lewellyn,Leishman,Lebow,Lebouef,Leanos,Lanz,Landy,Landaverde,Lacefield,Kyler,Kuebler,Kropf,Kroeker,Kluesner,Klass,Kimberling,Kilkenny,Kiker,Ketter,Kelemen,Keasler,Kawamura,Karst,Kardos,Jeremiah,Jared,Igo,Huseman,Huseby,Hurlbert,Huard,Hottinger,Hornberger,Hopps,Holdsworth,Hensen,Heilig,Heeter,Harpole,Haak,Gutowski,Gunnels,Grimmer,Grieve,Gravatt,Granderson,Gotcher,Gleaves,Genao,Garfinkel,Frerichs,Foushee,Flanery,Finnie,Feldt,Fagin,Ewalt,Ellefson,Eiler,Eckhart,Eastep,Dwight,Digirolamo,Didomenico,Devera,Delavega,Defilippo,Debusk,Daub,Damiani,Cupples,Cuddy,Crofoot,Courter,Coto,Costigan,Corning,Corman,Corlett,Cooperman,Collison,Coghlan,Cobbins,Coady,Coachman,Clothier,Client,Clear,Cipolla,Chmielewski,Chiodo,Chatterton,Chappelle,Chairez,Ceron,Casperson,Casler,Casados,Carrow,Carolina,Carlino,Carico,Cardillo,Caouette,Canto,Canavan,Cambra,Byard,Buterbaugh,Buse,Bucy,Buckwalter,Bubb,Bryd,Brissette,Brault,Bradwell,Boshears,Borchert,Blansett,Blanch,Blade,Biondo,Bilbo,Biehl,Bessey,Berta,Belles,Bella,Beeks,Beekman,Beaufort,Bayliss,Bardsley,Avilla,Astudillo,Ardito,Anwar,Antunez,Amen,Aderholt,Abate,Yowell,Yin,Yearby,Ye,Wurst,Woolverton,Woolbright,Wildermuth,Whittenburg,Whitely,Wetter,Wetherbee,Wenz,Welliver,Welling,Welcome,Wason,Warrior,Warlick,Voorhies,Vivier,Villines,Vida,Verde,Veiga,Varghese,Vanwyk,Vanwingerden,Vanhorne,Umstead,Twiggs,Tusing,Trego,Tompson,Tinkle,Thoman,Thole,Tatman,Tartt,Suda,Studley,Strock,Strawbridge,Stokely,Stec,Stang,Stalter,Speidel,Spafford,Spade,Sontag,Sokolowski,Skillman,Skelley,Skalski,Sison,Sippel,Sinquefield,Sin,Siegle,Sher,Sharrow,Setliff,Sera,Sellner,Selig,Seibold,Seery,Scriber,Schull,Schrupp,Schippers,Say,Saulsbury,Sao,Santillo,Sanor,Sancho,Rufus,Rubalcaba,Roosa,Ronk,Robbs,Roache,River,Riebe,Reinoso,Quin,Prude,Preuss,Pottorff,Pontiff,Plouffe,Picou,Picklesimer,Pettyjohn,Petti,Penaloza,Parmelee,Pardee,Palazzo,Overholt,Ogawa,Ofarrell,Nova,Nolting,Noda,Nicola,Nickson,Nevitt,Neveu,Navarre,Nam,Murrow,Munz,Mulloy,Monzo,Milliman,Metivier,Merlino,Mcpeters,Mckissack,Mckeen,Mcgurk,Mcfee,Mcfarren,Mcelwee,Mceachin,Mcdonagh,Mccarville,Mayhall,Mattoon,Martello,Marconi,Marbury,Mao,Manzella,Maly,Malec,Maitland,Maheu,Maclennan,Lyke,Luera,Loyola,Lowenstein,Losh,Lopiccolo,Longacre,Loman,Loden,Loaiza,Lieber,Libbey,Lenhardt,Lefebre,Lauterbach,Lauritsen,Lass,Larocco,Larimer,Lansford,Lanclos,Lamay,Lal,Kulikowski,Kriebel,Kosinski,Kleinman,Kleiner,Kleckner,Kistner,Kissner,Kissell,Kilroy,Kenna,Keisler,Keeble,Keaney,Kale,Joly,Jimison,Jeans,Ikner,Hursey,Hruska,Hove,Hou,Host,Hosking,Hoose,Holle,Hoeppner,Hittle,Hitchens,Hirth,Hinerman,Hilario,Higby,Hertzog,Hentz,Hensler,Heist,Heier,Hegg,Hassel,Harpe,Hara,Hank,Hain,Hagopian,Grimshaw,Grado,Gowin,Gowans,Googe,Goodlow,Goering,Gleaton,Gidley,Giannone,Gascon,Garneau,Gambrel,Galaz,Fuentez,Frisina,Fresquez,Fraher,Fitting,Feuerstein,Felten,Everman,Estell,Ertel,Erazo,Ensign,Endo,Ellerman,Eichorn,Edgell,Ebron,Eaker,Dundas,Duncanson,Duchene,Ducan,Dombroski,Doman,Dock,Dickison,Dewoody,Deloera,Delahoussaye,Dejean,Degroat,Decaro,Dearmond,Dashner,Dales,Crossett,Cressey,Cowger,Courts,Court,Cornette,Corbo,Coplin,Coover,Condie,Cokley,Cicero,Ceaser,Cannaday,Callanan,Cadle,Buscher,Bullion,Bucklin,Bruening,Bruckner,Brose,Branan,Bradway,Botsford,Bortz,Borelli,Bonetti,Bolan,Boerger,Bloomberg,Bingman,Bilger,Berns,Beringer,Beres,Beets,Beede,Beaudet,Beachum,Baughn,Bator,Bastien,Basquez,Barreiro,Barga,Baratta,Balser,Baillie,Axford,Attebery,Arakaki,Annunziata,Andrzejewski,Ament,Amendola,Adcox,Abril,Zenon,Zeitler,Zang,Zambrana,Ybanez,Yagi,Wolak,Wilcoxson,Whitesel,Whitehair,Weyand,Westendorf,Welke,Weinmann,Wei,Weesner,Weekes,Wedel,Wedding,Weatherall,Warthen,Vose,Villalta,Vila,Viator,Vaz,Valtierra,Urbanek,Tulley,Trojanowski,Trapani,Toups,Torpey,Tomita,Tindal,Tieman,Tevis,Tedrow,Taul,Tash,Tammaro,Sylva,Swiderski,Sweeting,Sund,Stutler,Stocking,Stich,Sterns,Stegner,Stalder,Splawn,Speirs,Southwell,Soltys,Smead,Slye,Skipworth,Sipos,Simmerman,Sigmund,Sidhu,Shuffler,Shingleton,Shadwick,Sermons,Seefeldt,Scipio,Schwanke,Schreffler,Schiro,Scheiber,Sandoz,Samsel,Ruddell,Royse,Rouillard,Rotella,Rosalez,Romriell,Rommel,Rizer,Riner,Rickards,Rhoton,Rhem,Reppert,Rayl,Raulston,Raposo,Rapier,Rainville,Radel,Quinney,Purdie,Puffer,Pizzo,Pincus,Petrus,Pendelton,Pendarvis,Peltz,Peguero,Peete,Patricio,Patchett,Parrino,Papke,Pam,Palafox,Ottley,Ostby,Oritz,Oren,Ogan,Odegaard,Oatman,Noell,Nida,Nicoll,Newhall,Newbill,Netzer,Nettleton,Neblett,Murley,Mungo,Mulhall,Mosca,Morissette,Morford,Montag,Monsen,Mitzel,Miskell,Minder,Mehaffey,Mcquillen,Mclennan,Mcgrail,Mccreight,Mayville,Maysonet,Maust,Mathieson,Mastrangelo,Maskell,Martina,Manz,Malmberg,Makela,Madruga,Luz,Lotts,Longnecker,Logston,Littell,Liska,Lindauer,Lillibridge,Levron,Letchworth,Lesh,Leffel,Leday,Leamon,Laura,Kulas,Kula,Kucharski,Kromer,Kraatz,Konieczny,Konen,Komar,Kivett,Kirts,Kinnear,Kersh,Keithley,Keifer,Judah,Jimenes,Jeppesen,Jasmin,Jansson,Huntsberry,Hund,Huitt,Huffine,Hosford,Hopes,Holmstrom,Hollen,Hodgin,Hirschman,Hiltner,Hilliker,Hibner,Hennis,Helt,Heidelberg,Heger,Heer,Hartness,Hardrick,Halladay,Gula,Guillaume,Guerriero,Grunewald,Grosse,Griffeth,Grenz,Grassi,Grandison,Ginther,Gimenez,Gillingham,Gillham,Gess,Gelman,Gearheart,Gaskell,Gariepy,Gamino,Gallien,Galentine,Fuquay,Froman,Froelich,Friedel,Foos,Fomby,Focht,Flythe,Fiqueroa,Filson,Filip,Fierros,Fett,Fedele,Fasching,Farney,Fargo,Everts,Even,Etzel,Elzey,Eichner,Eger,Eatman,Ducker,Duchesne,Donati,Domenech,Dollard,Dodrill,Dinapoli,Denn,Delfino,Delcid,Delaune,Delatte,Deems,Daluz,Cusson,Cullison,Cue,Cuadrado,Crumrine,Cruickshank,Crosland,Croll,Criddle,Crepeau,Coutu,Couey,Cort,Coppinger,Collman,Cockburn,Coca,Clayborne,Claflin,Cissell,Chowdhury,Chicoine,Chenier,Causby,Caulder,Cassano,Casner,Cardiel,Burner,Brunton,Bruch,Broxton,Brosius,Brooking,Branco,Bracco,Bourgault,Bosserman,Books,Bonet,Bolds,Bolander,Bohman,Boelter,Blohm,Blea,Blaise,Bischof,Billie,Beus,Bellew,Bastarache,Bast,Bartolome,Bark,Barcomb,Barco,Balls,Balk,Balas,Bakos,Avey,Atnip,Ashbrook,Arno,Arbour,Aquirre,Appell,Aldaco,Alcazar,Alban,Ahlstrom,Abadie,Zylstra,Zick,Zheng,Yother,Wyse,Wunsch,Whitty,Weist,Vrooman,Vine,Villalon,Vidrio,Vavra,Vasbinder,Vanmatre,Vandorn,Ugarte,Turberville,Tuel,Trogdon,Town,Toupin,Toone,Tolleson,Tinkham,Tinch,Tiano,Teston,Teer,Tea,Tawney,Taplin,Tant,Tansey,Swayne,Sutcliffe,Sunderman,Suits,Strothers,Stromain,Stork,Stoneburner,Stolte,Stolp,Stoehr,Stingley,Stegman,Stangl,Spinella,Spier,Soules,Sommerfield,Sipp,Simek,Siders,Shufelt,Shue,Shor,Shires,Shellenberger,Sheely,Service,Sepe,Seaberg,Schwing,Scherrer,Scalzo,Saver,Sasse,Sarvis,Santora,Sansbury,Salls,Saleem,Ryland,Rybicki,Ruggieri,Rothenberg,Rosenstein,Roquemore,Rollison,Rodden,Rivet,Rita,Ridlon,Riche,Riccardi,Reiley,Regner,Rech,Rayo,Rawley,Ranger,Raff,Radabaugh,Quon,Quill,Privette,Prange,Pickrell,Perino,Penning,Pankratz,Orlandi,Nyquist,Norrell,Noren,Naples,Nale,Nakashima,Musselwhite,Murrin,Murch,Mullinix,Mullican,Mullan,Morneau,Mondor,Molinar,Mo,Minjares,Minix,Mingle,Minchew,Mill,Milewski,Mikkelson,Mifflin,Messing,Merkley,Meis,Meas,Mcroy,Mcphearson,Mcneel,Mcmunn,Mcmorrow,Mcdorman,Mccroskey,Mccoll,Mcclusky,Mcclaran,Mccampbell,Mazzariello,Mauzy,Mauch,Mastro,Martinek,Marsala,Marcantel,Mahle,Lyda,Lucius,Luciani,Lubbers,Louder,Lobel,Linsey,Linch,Liller,Legros,Layden,Lapine,Lansberry,Lage,Laforest,Labriola,Koga,Knupp,Klimek,Kittinger,Kirchoff,Kinzel,Killinger,Kilbourne,Ketner,Kepley,Kemble,Kells,Kear,Kaya,Karsten,Kaneshiro,Kamm,Joines,Joachim,Janelle,Jacobus,Iler,Holgate,Hoar,Hisey,Hird,Hilyard,Heslin,Herzberg,Hennigan,Hegland,Hartl,Haner,Handel,Gualtieri,Greenly,Grasser,Gran,Goetsch,Godbold,Gilland,Gidney,Gibney,Giancola,Gettinger,Garzon,Garret,Galle,Galgano,Gaier,Gaertner,Fuston,Freel,Fortes,Flock,Fiorillo,Figgs,Fenstermacher,Fedler,Facer,Fabiano,Evins,Eusebio,Euler,Esquer,Enyeart,Elem,Eisenhower,Eich,Edgerly,Durocher,Durgan,Duffin,Drolet,Drewes,Dotts,Dossantos,Dolly,Dockins,Dirksen,Difiore,Dierks,Dickerman,Dice,Dery,Denault,Demaree,Delmonte,Delcambre,Days,Daulton,Darst,Dahle,Curnutt,Cully,Culligan,Cueva,Crosslin,Croskey,Cromartie,Crofts,Covin,Coutee,Countess,Cost,Coppa,Coogan,Condrey,Concannon,Coger,Cloer,Clatterbuck,Cieslak,Chumbley,Choudhury,Chiaramonte,Charboneau,Chai,Carneal,Cappello,Campisi,Callicoat,Burgoyne,Bucholz,Brumback,Brosnan,Brogden,Broder,Brendle,Breece,Bown,Bou,Boser,Bondy,Bolster,Boll,Bluford,Blandon,Biscoe,Bevill,Bence,Battin,Basel,Bartram,Barnaby,Barmore,Balbuena,Badgley,Backstrom,Auyeung,Ater,Arrellano,Arant,Ansari,Alling,Alejandre,Alcock,Alaimo,Aguinaldo,Aarons,Zurita,Zeiger,Zawacki,Yutzy,Yarger,Wygant,Wurm,Wuest,Wolfram,Witherell,Wisneski,Whitby,Whelchel,Weisz,Weisinger,Weishaar,Wehr,Wedge,Waxman,Waldschmidt,Walck,Waggener,Vosburg,Vita,Villela,Vercher,Venters,Vanscyoc,Vandyne,Valenza,Utt,Urick,Ungar,Ulm,Tumlin,Tsao,Tryon,Trudel,Treiber,Tow,Tober,Tipler,Tillson,Tiedemann,Thornley,Tetrault,Temme,Tarrance,Tackitt,Sykora,Sweetman,Swatzell,Sutliff,Suhr,Sturtz,Strub,Strayhorn,Stormer,Steveson,Stengel,Steinfeldt,Spiro,Spieker,Speth,Spero,Soza,Souliere,Soucie,Snedeker,Slifer,Skillings,Situ,Siniard,Simeon,Signorelli,Siggers,Shultis,Shrewsbury,Shippee,Shimp,Sherron,Shepler,Sharpless,Shadrick,Severt,Severs,Semon,Semmes,Seiter,Segers,Sclafani,Sciortino,Schroyer,Schrack,Schoenberg,Schober,Scheidt,Scheele,Satter,Sartori,Sarris,Sarratt,Salvaggio,Saladino,Sakamoto,Saine,Ryman,Rumley,Ruggerio,Rucks,Roughton,Room,Robards,Ricca,Rexroad,Resler,Reny,Rentschler,Redrick,Redick,Reagle,Raymo,Rape,Raker,Racette,Pyburn,Pritt,Presson,Pressman,Pough,Plain,Pisani,Perz,Perras,Pelzer,Pedrosa,Palos,Palmisano,Paille,Orem,Orbison,Oliveros,Nourse,Nordquist,Newbury,Nelligan,Nawrocki,Myler,Mumaw,Morphis,Moldenhauer,Miyashiro,Mignone,Mickelsen,Michalec,Mesta,Mcree,Mcqueary,Mcninch,Mcneilly,Mclelland,Mclawhorn,Mcgreevy,Mcconkey,Mattes,Maselli,Marten,Mart,Marcucci,Manseau,Manjarrez,Malbrough,Machin,Mabie,Lynde,Lykes,Lueras,Lokken,Loken,Linzy,Lillis,Lilienthal,Levey,Legler,Leedom,Lebowitz,Lazzaro,Larabee,Lapinski,Langner,Langenfeld,Lampkins,Lamotte,Lambright,Lagarde,Ladouceur,Labrador,Labounty,Lablanc,Laberge,Kyte,Kroon,Kron,Kraker,Kouba,Kirwin,Kincer,Kimbler,Kegler,Keach,Katzman,Katzer,Kalman,Journey,Jimmerson,Jenning,Janus,Iacovelli,Hust,Huson,Husby,Humphery,Hufnagel,Honig,Holsey,Holoman,Hohl,Hogge,Hinderliter,Hildebrant,Hick,Hey,Hemby,Helle,Heintzelman,Heidrick,Hearon,Heap,Hazelip,Hauk,Hasbrouck,Harton,Hartin,Harpster,Hansley,Hanchett,Haar,Guthridge,Gulbranson,Guill,Guerrera,Grund,Grosvenor,Grist,Grell,Grear,Granberry,Gonser,Giunta,Giuliani,Gillon,Gillmore,Gillan,Gibbon,Gettys,Gelb,Gano,Galliher,Fullen,Frese,Frates,Foxwell,Fleishman,Fleener,Fielden,Ferrera,Feng,Fells,Feemster,Fauntleroy,Fails,Evatt,Espy,Eno,Emmerich,Edwin,Edler,Eastham,Dunavant,Duca,Drinnon,Dowe,Dorgan,Dollinger,Divers,Dipalma,Difranco,Dietrick,Denzer,Demarest,Delee,Delariva,Delany,Decesare,Debellis,Deavers,Deardorff,Dawe,Darosa,Darley,Dalzell,Dahlen,Curto,Cupps,Cunniff,Cude,Crivello,Cripps,Cresswell,Cousar,Cotta,Compo,Colorado,Clyne,Clayson,Cearley,Catania,Carini,Cargo,Cantero,Cali,Buttrey,Buttler,Burpee,Bulkley,Buitron,Buda,Bublitz,Bryer,Bryden,Brouillette,Brott,Brookman,Bronk,Breshears,Brennen,Brannum,Brandl,Braman,Bracewell,Boyter,Bomberger,Bold,Bogen,Boeding,Bob,Blauvelt,Blandford,Bigger,Biermann,Bielecki,Bibby,Berthold,Berkman,Belvin,Bellomy,Beland,Behne,Beecham,Becher,Beams,Bax,Bassham,Barret,Baley,Bacchus,Auxier,Atkison,Ary,Arocha,Arechiga,Anspach,An,Algarin,Alcott,Alberty,Ager,Adolph,Ackman,Abdul,Abdallah,Zwick,Ziemer,Zastrow,Zajicek,Yokum,Yokley,Wittrock,Winebarger,Wilker,Wilham,Whitham,Wetzler,Westling,Westbury,Wendler,Wellborn,Weitzman,Weitz,Weight,Wallner,Waldroup,Vrabel,Vowels,Volker,Vitiello,Visconti,Villicana,Vibbert,Vesey,Vannatter,Vangilder,Vandervort,Vandegrift,Vanalstyne,Vallecillo,Usrey,Tynan,Turpen,Tuller,Trisler,Townson,Tillmon,Threlkeld,Thornell,Terrio,Taunton,Tarry,Tardy,Swoboda,Swihart,Sustaita,Suitt,Stuber,Strine,Stookey,Stmartin,Stiger,Stainbrook,Solem,Smail,Sligh,Siple,Sieben,Shumake,Shriner,Showman,Shiner,Sheen,Sheckler,Seim,Secrist,Scoggin,Schultheis,Schmalz,Schendel,Schacher,Savard,Saulter,Santillanes,Sandiford,Sande,Salzer,Salvato,Saltz,Sakai,Ryckman,Ryant,Ruck,Ronald,Rocker,Rittenberry,Ristau,Risk,Richart,Rhynes,Reyer,Reulet,Reser,Redington,Reddington,Rebello,Reasor,Raftery,Rabago,Raasch,Quintanar,Pylant,Purington,Provencal,Prom,Prioleau,Prestwood,Pothier,Popa,Polster,Politte,Poffenberger,Pinner,Pietrzak,Pettie,Penaflor,Pellot,Pellham,Paylor,Payeur,Papas,Paik,Oyola,Osbourn,Orzechowski,Oppenheimer,Olesen,Oja,Ohl,Nuckolls,Nordberg,Noonkester,Nold,Nitta,Niblett,Neuhaus,Nesler,Ned,Nanney,Myrie,Mutch,Motto,Mosquera,Morena,Montalto,Montagna,Mizelle,Mincy,Millikan,Millay,Miler,Milbourn,Mikels,Migues,Miesner,Mershon,Merrow,Merlin,Melia,Meigs,Mealey,Mcraney,Mcmartin,Mclachlan,Mcgeehan,Mcferren,Mcdole,Mccaulley,Mcanulty,Maziarz,Maul,Mateer,Martinsen,Marson,Mariotti,Manna,Mang,Mance,Malbon,Mah,Magnusson,Maclachlan,Macek,Lurie,Luc,Lown,Loranger,Lonon,Lisenby,Linsley,Linger,Lenk,Leavens,Learned,Lauritzen,Lathem,Lashbrook,Landman,Lamarche,Lamantia,Laguerre,Lagrange,Kogan,Klingbeil,Kist,Kimpel,Kime,Kier,Kerfoot,Kennamer,Kellems,Kammer,Kamen,Jess,Jepsen,Jarnigan,Isler,Ishee,Isabel,Hux,Hungate,Hummell,Hultgren,Huffaker,Hruby,Hover,Hornick,Hooser,Hooley,Hoggan,Hirano,Hilley,Higham,Heuser,Henrickson,Henegar,Hellwig,Heide,Hedley,Hasegawa,Hartt,Hambright,Halfacre,Hafley,Guion,Guinan,Grunwald,Grothe,Gries,Greaney,Granda,Grabill,Gothard,Gossman,Gosser,Gossard,Gosha,Goldner,Gobin,Gloss,Ginyard,Gilkes,Gilden,Gerson,Gephart,Gengler,Gautier,Gassett,Garon,Gandhi,Galusha,Gallager,Galdamez,Fulmore,Fritsche,Fowles,Foutch,Forward,Footman,Fludd,Flakes,Ferriera,Ferrero,Ferreri,Fenimore,Fegley,Fegan,Fearn,Farrier,Fansler,Fane,Falzone,Fairweather,Etherton,Elsberry,Dykema,Duppstadt,Dunnam,Dunklin,Duet,Due,Dudgeon,Dubuc,Doxey,Dory,Donmoyer,Dodgen,Disanto,Dingler,Dimattia,Dilday,Digennaro,Diedrich,Derossett,Deputy,Depp,Demasi,Degraffenreid,Deakins,Deady,Davin,Daigre,Daddario,Czerwinski,Cullens,Cubbage,Cracraft,Constance,Comes,Combest,Coletti,Coghill,Clerk,Claybrooks,Class,Christofferse,Chiesa,Chason,Chamorro,Cessna,Celentano,Cayer,Carolan,Carnegie,Capetillo,Callier,Cadogan,Caba,Byrom,Byrns,Burrowes,Burket,Burdge,Burbage,Bukowski,Buchholtz,Brunt,Brungardt,Brunetti,Brumbelow,Brugger,Broadhurst,Brigance,Brandow,Bouknight,Bottorff,Bottomley,Bosarge,Borger,Bona,Bombardier,Bologna,Boggan,Blumer,Blecha,Birney,Birkland,Betances,Beran,Benny,Benes,Belin,Belgrave,Bealer,Bauch,Bath,Bashir,Bartow,Baro,Barnhouse,Barile,Ballweg,Baisley,Bains,Baehr,Badilla,Bachus,Bacher,Bachelder,Auzenne,Aten,Astle,Allis,Agarwal,Adger,Adamek,Ziolkowski,Zinke,Zazueta,Zamorano,Younkin,Won,Wittig,Witman,Winsett,Winkles,Wiedman,Whitner,Whitcher,Wetherby,Westra,Westhoff,Wehrle,Wee,Wagaman,Voris,Vicknair,Vegas,Veasley,Vaugh,Vanish,Vanderburg,Valletta,Tunney,Trumbo,Truluck,Trueman,Truby,Trombly,Trojan,Tourville,Tostado,Tone,Titcomb,Timpson,Tignor,Thrush,Thresher,Thiede,Tews,Tamplin,Taff,Tacker,Syverson,Sylvestre,Summerall,Stumbaugh,Strouth,Straker,Stradford,Stoney,Stokley,Steinhoff,Steinberger,Stairs,Spigner,Soltero,Snively,Sletten,Sinkler,Sinegal,Simoes,Siller,Sigel,Shoe,Shire,Shinkle,Shellman,Sheller,Sheats,Sharer,Selvage,Sedlak,Sea,Schriver,Schimke,Scheuerman,Schanz,Savory,Saulters,Sauers,Sais,Rusin,Rumfelt,Ruhland,Rozar,Rosborough,Ronning,Rolph,Roloff,Rogue,Robie,Riviera,Rimer,Riehle,Ricco,Rhein,Retzlaff,Reisman,Reimann,Re,Rayes,Raub,Raminez,Quesinberry,Pua,Procopio,Priolo,Printz,Prewett,Preas,Prahl,Portugal,Poovey,Ploof,Platz,Plaisted,Pinzon,Pineiro,Pickney,Petrovich,Perl,Pehrson,Peets,Pavon,Pautz,Pascarella,Paras,Paolini,Pals,Pafford,Oyer,Ovellette,Outten,Outen,Ours,Orduna,Odriscoll,Oberlin,Nosal,Niven,Nisbett,Nevers,Nathanson,Mule,Mukai,Mozee,Mowers,Motyka,Morency,Montford,Mollica,Molden,Mitten,Miser,Mina,Millender,Midgette,Messerly,Melendy,Meisel,Meidinger,Meany,Mcnitt,Mcnemar,Mcmakin,Mcgaugh,Mccaa,Mauriello,Maudlin,Matzke,Mattia,Matteo,Matsumura,Masuda,Mangels,Maloof,Malizia,Mahmoud,Maglione,Maddix,Lucchesi,Lochner,Linquist,Lino,Lietz,Leventhal,Leopard,Lemanski,Leiser,Laury,Lauber,Lamberth,Kuss,Kung,Kulik,Kuiper,Krout,Kotter,Kort,Kohlmeier,Koffler,Koeller,Knipe,Knauss,Kleiber,Kissee,Kirst,Kirch,Kilgo,Kerlin,Kellison,Kehl,Kalb,Jorden,Jantzen,Jamar,Inabinet,Ikard,Husman,Hunsberger,Hundt,Hucks,Houtz,Houseknecht,Hoots,Hogsett,Hogans,Hintze,Hession,Henault,Hemming,Helsley,Heinen,Heffington,Heberling,Heasley,Heal,Hazley,Hazeltine,Hayton,Hayse,Hawke,Haston,Harward,Harvard,Harrow,Hanneman,Hafford,Hadnot,Guerro,Graig,Grahm,Gowins,Gordillo,Goosby,Glatt,Gibbens,Ghent,Gerrard,Germann,Geil,Gebo,Gean,Garling,Gardenhire,Garbutt,Gagner,Furguson,Funchess,Fujiwara,Fujita,Friley,Frigo,Forshee,Folkes,Filler,Fernald,Ferber,Feingold,Favorite,Faul,Farrelly,Fairbank,Failla,Estelle,Espey,Eshleman,Ertl,Erhart,Erhardt,Erbe,Elsea,Ells,Ellman,Eisenhart,Ehmann,Earnhardt,Duplantis,Dulac,Ducote,Draves,Dosch,Dolce,Divito,Ditch,Dimauro,Derringer,Demeo,Demartini,Delima,Dehner,Degen,Defrancisco,Defoor,Dedeaux,Debnam,Cypert,Cutrer,Cusumano,Custis,Croker,Courtois,Costantino,Cormack,Corbeil,Copher,Conlan,Conkling,Cogdell,Cilley,Chapdelaine,Cendejas,Castiglia,Cassette,Cashin,Carstensen,Carol,Caprio,Calcote,Calaway,Byfield,Butner,Bushway,Burritt,Browner,Brobst,Briner,Brighton,Bridger,Brickley,Brendel,Bratten,Bratt,Brainerd,Brackman,Bowne,Bouck,Borunda,Bordner,Bonenfant,Boer,Boehmer,Bodiford,Bleau,Blankinship,Blane,Blaha,Bitting,Bissonette,Bigby,Bibeau,Beverage,Bermudes,Berke,Bergevin,Bergerson,Bendel,Belville,Bechard,Bearce,Beadles,Batz,Bartlow,Barren,Ayoub,Avans,Aumiller,Arviso,Arpin,Arnwine,Armwood,Arent,Arehart,Arcand,Antle,Ambrosino,Alongi,Alm,Allshouse,Ahart,Aguon,Ziebarth,Zeledon,Zakrzewski,Yuhas,Yingst,Yedinak,Wommack,Winnett,Wingler,Wilcoxen,Whitmarsh,Whistler,Wayt,Watley,Wasser,Warkentin,Voll,Vogelsang,Voegele,Vivanco,Vinton,Villafane,Viles,Versace,Ver,Venne,Vanwagoner,Vanwagenen,Vanleuven,Vanauken,Uselton,Uren,Trumbauer,Tritt,Treadaway,Tozier,Tope,Tomczak,Tomberlin,Tomasini,Tollett,Toller,Titsworth,Tirrell,Tilly,Tavera,Tarnowski,Tanouye,Tall,Swarthout,Sutera,Surette,Styers,Styer,Stipe,Stickland,Steve,Stembridge,Stearn,Starkes,Stanberry,Stahr,Spino,Spicher,Sperber,Speece,Soo,Sonntag,Sneller,Smalling,Slowik,Slocumb,Sliva,Slemp,Slama,Sitz,Sisto,Sisemore,Sindelar,Shipton,Shillings,Sheeley,Sharber,Shaddix,Severns,Severino,Sever,Sensabaugh,Seder,Seawell,Seamons,Schrantz,Schooler,Scheffer,Scheerer,Scalia,Saum,Santibanez,Sano,Sanjuan,Sampley,Sailer,Sabella,Sabbagh,Royall,Rottman,Rivenbark,Rikard,Ricketson,Rickel,Rethman,Reily,Reddin,Reasoner,Reade,Rast,Ranallo,Rana,Quintal,Pung,Pucci,Proto,Prosperie,Prim,Preusser,Preslar,Powley,Postma,Pinnix,Pilla,Pietsch,Pickerel,Pica,Pharris,Petway,Petillo,Perin,Pereda,Pennypacker,Pennebaker,Pedrick,Patin,Patchell,Parodi,Parman,Pantano,Padua,Padro,Osterhout,Orner,Opp,Olivar,Ohlson,Odonoghue,Oceguera,Oberry,Novello,Noguera,Newquist,Newcombe,Neihoff,Nehring,Nees,Nebeker,Nau,Mundo,Mullenix,Morrisey,Moronta,Morillo,Morefield,Mongillo,Molino,Minto,Midgley,Michie,Menzies,Medved,Mechling,Mealy,Mcshan,Mcquaig,Mcnees,Mcglade,Mcgarity,Mcgahey,Mcduff,Mayweather,Mastropietro,Masten,Maranto,Maniscalco,Maize,Mahmood,Maddocks,Maday,Macha,Maag,Luken,Lopp,Lolley,Llanas,Litz,Litherland,Lindenberg,Lieu,Letcher,Lentini,Lemelle,Leet,Lecuyer,Leber,Laursen,Latch,Larrick,Lantigua,Langlinais,Lalli,Lafever,Labat,Labadie,Kurt,Krogman,Kohut,Knarr,Klimas,Klar,Kittelson,Kirschbaum,Kintzel,Kincannon,Kimmell,Killgore,Kettner,Kelsch,Karle,Kapoor,Johansson,Jock,Jenkinson,Janney,Isabelle,Iraheta,Insley,Hyslop,Hy,Human,Huckstep,Holleran,Hoerr,Hinze,Hinnenkamp,Hilger,Higgin,Hicklin,Heroux,Henkle,Helfer,Heikkinen,Heckstall,Heckler,Heavener,Haydel,Haveman,Haubert,Harrop,Harnois,Hansard,Hanover,Hammitt,Haliburton,Haefner,Hadsell,Haakenson,Guynn,Guizar,Grout,Grosz,Goo,Gomer,Golla,Godby,Glanz,Glancy,Givan,Giesen,Gerst,Gayman,Garraway,Gabor,Furness,Frisk,Fremont,Frary,Forand,Fessenden,Ferrigno,Fearon,Favreau,Faulks,Falbo,Ewen,Everton,Eurich,Etchison,Esterly,Entwistle,Ellingsworth,Elders,Ek,Eisenbarth,Edelson,Eckel,Earnshaw,Dunneback,Doyal,Donnellan,Dolin,Dibiase,Deschenes,Dermody,Denmark,Degregorio,Darnall,Dant,Dansereau,Danaher,Dammann,Dames,Czarnecki,Cuyler,Custard,Cummingham,Cuffie,Cuffee,Cudney,Cuadra,Crigler,Creger,Coughlan,Corvin,Cortright,Corchado,Connery,Conforti,Condron,Colosimo,Colclough,Cola,Cohee,Claire,Ciotti,Chill,Chien,Check,Chacko,Cevallos,Cavitt,Cavins,Castagna,Cashwell,Carrozza,Carrara,Capra,Campas,Callas,Caison,Cai,Caggiano,Cabot,Bynoe,Buswell,Burpo,Burnam,Burges,Buerger,Buelow,Bueche,Buckle,Bruni,Brummitt,Brodersen,Briese,Breit,Brakebill,Braatz,Boyers,Boughner,Borror,Borquez,Bonelli,Bohner,Blaze,Blaker,Blackmer,Bissette,Bibbins,Bhatt,Bhatia,Bessler,Bergh,Beresford,Bensen,Benningfield,Benito,Bellantoni,Behler,Beehler,Beazley,Beauchesne,Bargo,Bannerman,Baltes,Balog,Ballantyne,Bad,Axelson,Apgar,Aoki,Anstett,Alejos,Alcocer,Albury,Aichele,Ahl,Ackles,Zerangue,Zehner,Zank,Zacarias,Youngberg,Yorke,Yarbro,Xie,Wydra,Worthley,Wolbert,Wittmer,Witherington,Wishart,Wire,Winnie,Winkleman,Willilams,Willer,Wiedeman,Whittingham,Whitbeck,Whetsel,Wheless,Westerberg,Welcher,Wegman,Waterfield,Wasinger,Warfel,Wannamaker,Walborn,Wada,Vogl,Vizcarrondo,Vitela,Villeda,Veras,Venuti,Veney,Ulrey,Uhlig,Turcios,Tremper,Torian,Torbett,Thrailkill,Terrones,Teitelbaum,Teems,Tay,Swoope,Sunseri,Stutes,Stthomas,Strohm,Stroble,Striegel,Streicher,Stodola,Stinchcomb,Steves,Steppe,Stem,Steller,Staudt,Starner,Stamant,Stam,Stackpole,Sprankle,Speciale,Spahr,Sowders,Sova,Soluri,Soderlund,Slinkard,Skates,Sjogren,Sirianni,Siewert,Sickels,Sica,Shugart,Shoults,Shive,Shimer,Shier,Shield,Shepley,Sheeran,Sharper,Sevin,Severe,Seto,Segundo,Sedlacek,Scuderi,Schurman,Schuelke,Scholten,Schlater,Schisler,Schiefelbein,Schalk,Sanon,Sae,Sabala,Ruyle,Ruybal,Ruf,Rueb,Rowsey,Rosol,Rocheleau,Rishel,Rippey,Ringgold,Rieves,Ridinger,Rew,Retherford,Rempe,Reith,Rafter,Raffaele,Quinto,Putz,Purdom,Puls,Pulaski,Propp,Principato,Preiss,Prada,Polansky,Poch,Plath,Pittard,Pinnock,Pfarr,Pfannenstiel,Penniman,Pauling,Patchen,Paschke,Parkey,Pando,Overly,Ouimet,Ottman,Otter,Ostlund,Ormiston,Occhipinti,Nowacki,Norred,Noack,Nishida,Nilles,Nicodemus,Neth,Nealey,Myricks,Murff,Mungia,Mullet,Motsinger,Moscato,Mort,Morado,Moors,Monnier,Molyneux,Modzelewski,Miura,Minich,Militello,Milbrandt,Michalik,Meserve,Merle,Mendivil,Melara,Meadow,Mcnish,Mcelhannon,Mccroy,Mccrady,Mazzella,Maule,Mattera,Mathena,Matas,Mass,Mascorro,Marone,Marinello,Marguez,Marcell,Manwaring,Manhart,Mangano,Maggi,Lymon,Luter,Luse,Lukasik,Luiz,Ludlum,Luczak,Lowenthal,Lossett,Lorentzen,Loredo,Longworth,Lomanto,Lisi,Lish,Lipsky,Linck,Liedtke,Levering,Lessman,Lemond,Lembo,Ledonne,Leatham,Laufer,Lanphear,Langlais,Lando,Lamphear,Lamberton,Lafon,Lade,Lacross,Kyzer,Krok,Kring,Krell,Krehbiel,Kratochvil,Krach,Kovar,Kostka,Knudtson,Knaack,Kliebert,Klahn,Kirkley,Kimzey,Kettle,Kerrick,Kennerson,Keesler,Karlin,Kan,Jenny,Janousek,Jan,Imel,Icenhour,Hyler,Hunger,Hudock,Houpt,Hopping,Hoops,Holquin,Holiman,Holahan,Hodapp,Hires,Hillen,Hickmon,Hersom,Henrich,Helvey,Heidt,Heideman,Hedstrom,Hedin,Hebron,Hayter,Harn,Hardage,Harbor,Halsted,Hahne,Hagemann,Guzik,Guel,Groesbeck,Gritton,Grego,Graziani,Grasty,Graney,Gouin,Gossage,Golston,Goheen,Godina,Glade,Giorgi,Giambrone,Gerrity,Gerrish,Gero,Gerling,Gaulke,Garlick,Galiano,Gaiter,Gahagan,Gagnier,Friddle,Fredericksen,Franqui,Follansbee,Foerster,Flury,Fitzmaurice,Fiorini,Finlayson,Fiecke,Fickes,Fichter,Ferron,Ferdinand,Farrel,Fackler,Eyman,Escarcega,Errico,Erler,Erby,Engman,Engelmann,Elsass,Elliston,Eddleman,Eadie,Dummer,Drost,Dorrough,Dorrance,Doolan,Donalson,Domenico,Ditullio,Dittmar,Dishon,Dionisio,Dike,Devinney,Desir,Deschamp,Derrickson,Delamora,Deitch,Dechant,Dave,Danek,Dahmen,Curci,Cudjoe,Crumble,Croxton,Creasman,Craney,Crader,Cowling,Coulston,Cortina,Corlew,Corl,Copland,Convery,Cohrs,Clune,Clausing,Cipriani,Cinnamon,Cianciolo,Chubb,Chittum,Chenard,Charlesworth,Charlebois,Champine,Chamlee,Chagoya,Casselman,Cardello,Capasso,Cannella,Calderwood,Byford,Buttars,Bushee,Burrage,Buentello,Brzozowski,Bryner,Brumit,Brookover,Bronner,Bromberg,Brixey,Brinn,Briganti,Bremner,Brawn,Branscome,Brannigan,Bradsher,Bozek,Boulay,Bormann,Bongiorno,Bollin,Bohler,Bogert,Bodenhamer,Blose,Blind,Bivona,Bitter,Billips,Bibler,Benfer,Benedetti,Belue,Bellanger,Belford,Behn,Beerman,Barnhardt,Baltzell,Balling,Balducci,Bainter,Babineau,Babich,Baade,Attwood,Asmus,Asaro,Artiaga,April,Applebaum,Ang,Anding,Amar,Amaker,Allsup,Alligood,Alers,Agin,Agar,Achenbach,Abramowitz,Abbas,Aasen,Zehnder,Yopp,Yelle,Yeldell,Wynter,Woodmansee,Wooding,Woll,Winborne,Willsey,Willeford,Widger,Whiten,Whitchurch,Whang,Wen,Weissinger,Weinman,Weingartner,Weidler,Waltrip,Walt,Wagar,Wafford,Vitagliano,Villalvazo,Villacorta,Vigna,Vickrey,Vicini,Ventimiglia,Vandenbosch,Valvo,Valazquez,Utsey,Urbaniak,Unzueta,Trombetta,Trevizo,Trembley,Tremaine,Traverso,Tores,Tolan,Tillison,Tietjen,Tee,Teachout,Taube,Tatham,Tarwater,Tarbell,Sydow,Sy,Swims,Swader,Striplin,Stops,Stoltenberg,Steinhauer,Steil,Steigerwald,Starkweather,Stallman,Squier,Sparacino,Span,Spadafora,Shiflet,Shibata,Shevlin,Sherrick,Shake,Sessums,Servais,Senters,Seevers,Seelye,Searfoss,Seabrooks,Scoles,Schwager,Schrom,Schmeltzer,Scheffel,Sax,Sawin,Saterfiel,Sardina,Sanroman,Sane,Sandin,Salamanca,Saladin,Sak,Sabia,Rustin,Rushin,Ruley,Rueter,Row,Rotter,Rosenzweig,Roles,Rohe,Roder,Rockey,Ro,Riter,Rieth,Ried,Riding,Riddles,Ridder,Rennick,Remmers,Remer,Relyea,Reilley,Reder,Rasheed,Rakowski,Rabin,Queener,Pursel,Prue,Prowell,Pritts,Primo,Presler,Pouncy,Porche,Porcaro,Pollman,Pleas,Planas,Pinkley,Pinegar,Pilger,Philson,Petties,Perrodin,Pendergrast,Patao,Pasternak,Passarelli,Pasko,Parshall,Panos,Panella,Palombo,Padillo,Oyama,Overlock,Overbeck,Otterson,Orrell,Ornellas,Opitz,Okelly,Officer,Obando,Noggle,Nicosia,Netto,Negrin,Natali,Nakayama,Nagao,Nadel,Musial,Murrill,Murrah,Munsch,Mucci,Mrozek,Moyes,Mowrer,Moris,Morais,Moorhouse,Monico,Mone,Mondy,Moncayo,Mole,Miltenberger,Milsap,Milone,Millikin,Milardo,Mika,Micheals,Micco,Meyerson,Mericle,Mendell,Meinhardt,Meachum,Mcleroy,Mcgray,Mcgonigal,Maultsby,Matis,Matheney,Matamoros,Marro,Marcil,Marcial,Mantz,Mannings,Maltby,Malchow,Maiorano,Mahn,Mahlum,Maglio,Mae,Maberry,Lustig,Luellen,Longwell,Longenecker,Lofland,Locascio,Linney,Linneman,Lighty,Levell,Levay,Lenahan,Lemen,Lehto,Lebaron,Lanctot,Lamy,Lainez,Laffoon,Labombard,Kujawski,Kroger,Kreutzer,Korhonen,Kondo,Kollman,Kohan,Kogut,Knaus,Kivi,Kittel,Kinner,Kindig,Kindel,Kiesel,Kidney,Kibby,Khang,Kettler,Ketterer,Kepner,Kelliher,Keenum,Kanode,Kail,July,Juhasz,Jowett,Jolicoeur,Jeon,Iser,Ingrassia,Imai,Hutchcraft,Humiston,Hulings,Hukill,Huizenga,Hugley,Huddle,Hose,Hornyak,Hodder,Hisle,Hillenbrand,Hille,Higuchi,Hertzler,Herdon,Heppner,Hepp,Heitmann,Heckart,Hazlewood,Hayles,Hayek,Hawthorn,Hawkin,Haugland,Hasler,Harbuck,Happel,Hambly,Hambleton,Hagaman,Guzzi,Gullette,Guinyard,Grogg,Grise,Griffing,Goto,Gosney,Goods,Goley,Goldblatt,Gledhill,Girton,Giltner,Gillock,Gilham,Gilfillan,Giblin,Gentner,Gehlert,Gehl,Garten,Garney,Garlow,Garett,Galles,Galeana,Futral,Fuhr,Friedland,Franson,Fransen,Foulds,Follmer,Foland,Flax,Flavin,Firkins,Fillion,Figueredo,Ferrill,Fenster,Fenley,Fauver,Farfan,Factor,Eustice,Eppler,Engelman,Engelke,Emmer,Elzy,Ellwood,Ellerbee,Elks,Ehret,Ebbert,Durrah,Dupras,Dubuque,Dragoo,Donlon,Dolloff,Doi,Dibella,Derrico,Demko,Demar,Darrington,Czapla,Crooker,Creagh,Cranor,Craner,Crafts,Crabill,Coyer,Cowman,Cowherd,Cottone,Costillo,Coster,Costas,Cosenza,Corker,Collinson,Coello,Clingman,Clingerman,Claborn,Citizen,Chmura,Chausse,Chaudhry,Chapell,Chancy,Cerrone,Caves,Caverly,Caulkins,Carn,Campfield,Campanelli,Callaham,Cadorette,Butkovich,Buske,Burrier,Burkley,Bunyard,Budge,Buckelew,Buchheit,Broman,Brescia,Brasel,Brain,Boyster,Booe,Bonomo,Bonnet,Bondi,Bohnsack,Bobby,Blomberg,Blanford,Bilderback,Biggins,Bently,Behrends,Beegle,Bedoya,Bechtol,Beaubien,Bayerl,Baumgart,Baumeister,Barratt,Barlowe,Barkman,Barbagallo,Baldree,Baine,Bail,Baggs,Bacote,Aylward,Ashurst,Arvidson,Arthurs,Arrieta,Arrey,Arreguin,Arrant,Arner,Armor,Arizmendi,Anker,Amis,Amend,Alphin,Allbright,Aikin,Acres,Zupan,Zuchowski,Zeolla,Zanchez,Zahradnik,Zahler,Younan,Yeater,Yearta,Yarrington,Yantis,Woomer,Wollard,Wolfinger,Woerner,Witek,Wishon,Wisener,Wingerter,Willet,Wilding,Wiedemann,Weisel,Wedeking,Weary,Waybright,Wardwell,Walkins,Waldorf,Voth,Voit,Virden,Viloria,Villagran,Vasta,Vashon,Vaquera,Vantassell,Vanderlinden,Vandergrift,Vancuren,Valenta,Underdahl,Tyra,Tygart,Twining,Twiford,Turlington,Tullius,Tubman,Trowell,Trieu,Transue,Tousant,Torgersen,Tooker,Tony,Tome,Toma,Tocci,Tippins,Tinner,Timlin,Tillinghast,Tidmore,Teti,Tedrick,Tacey,Swanberg,Sunde,Summitt,Summerford,Summa,Sue,Stratman,Strandberg,Storck,Stober,Steitz,Stayer,Stauber,Staiger,Sponaugle,Spofford,Sparano,Spagnola,Sokoloski,Snay,Slough,Skowronski,Sieck,Shimkus,Sheth,Sherk,Shankles,Shakespeare,Shahid,Sevy,Sergeant,Senegal,Seiden,Seidell,Searls,Searight,Schwalm,Schug,Schilke,Schier,Scheck,Sawtelle,Santore,Santa,Sanks,Sandquist,Sanden,Saling,Sabine,Saathoff,Ryberg,Rustad,Ruffing,Rudnicki,Ruane,Rozzi,Rowse,Rosenau,Rodes,Risser,Riggin,Riess,Riese,Rhoten,Reinecke,Reigle,Reichling,Redner,Rebelo,Raynes,Raimondi,Rahe,Rada,Querry,Quellette,Pulsifer,Prochnow,Pretty,Prato,Poulton,Poudrier,Poll,Policastro,Polhemus,Polasek,Poissant,Pohlmann,Plotner,Pitkin,Pita,Pio,Pinkett,Pilot,Piekarski,Pichon,Philippe,Pfau,Petroff,Petermann,Peplinski,Peller,Pecinovsky,Pearse,Pattillo,Patague,Parlier,Parenti,Parchman,Pane,Paff,Ota,Ortner,Oros,Nolley,Noakes,Nigh,Nicolosi,Nicolay,Newnam,Netter,Nass,Napoles,Nakata,Nakamoto,Muriel,Muck,Morlock,Moraga,Montilla,Mongeau,Molitor,Mohney,Mitchener,Meyerhoff,Medel,Mcniff,Mcmonagle,Mcglown,Mcglinchey,Mcgarrity,Mccright,Mccorvey,Mcconnel,Mccargo,Mazzei,Matula,Mastroianni,Massingale,Maring,Maricle,Marc,Mans,Mannon,Mannix,Manney,Manger,Manalo,Malo,Malan,Mahony,Madril,Mackowiak,Macko,Macintosh,Lurry,Luczynski,Lucke,Lucarelli,Luca,Loud,Lou,Losee,Lorence,Loiacono,Lohse,Loder,Lipari,Linebarger,Lindamood,Limbaugh,Letts,Leleux,Leep,Leeder,Leard,Laxson,Lawry,Laverdiere,Laughton,Lastra,Kurek,Kriss,Krishnan,Kretschmer,Krebsbach,Kontos,Knobel,Knauf,Klick,Kleven,Klawitter,Kitchin,Kirkendoll,Kinkel,Kingrey,Kilbourn,Kensinger,Kennerly,Kamin,Justiniano,Jurek,Junkin,Julia,Judon,Jordahl,Jeanes,Jarrells,Jamal,Iwamoto,Isreal,Ishida,Ines,Immel,Iman,Ihle,Hyre,Hurn,Hunn,Hultman,Huffstetler,Huffer,Hubner,Howey,Horney,Hooton,Holts,Holscher,Holen,Hoggatt,Hilaire,Herz,Henne,Helstrom,Hellickson,Heinlein,Heckathorn,Heckard,Heather,Heart,Headlee,Hauptman,Haughey,Hatt,Harring,Harford,Hammill,Hamed,Halperin,Haig,Hagwood,Hagstrom,Gunnells,Gundlach,Guardiola,Greeno,Greenland,Gonce,Goldsby,Gobel,Gisi,Gillins,Gillie,Germano,Geibel,Gauger,Garriott,Garbarino,Gander,Gajewski,Funari,Fullbright,Fuell,Fritzler,Freshwater,Freas,Fortino,Forbus,Fonda,Flohr,Flemister,Fisch,Finks,Fenstermaker,Feldstein,Faw,Farhat,Farah,Fankhauser,Fagg,Fader,Exline,Emigh,Eguia,Edman,Eckler,Eastburn,Dy,Dunmore,Dubuisson,Dubinsky,Drayer,Doverspike,Doubleday,Doten,Dorner,Dolson,Dohrmann,Disla,Direnzo,Dipaola,Dines,Dickie,Diblasi,Dewolf,Desanti,Dennehy,Demming,Delker,Decola,Davilla,Davids,Daughtridge,Darville,Darland,Danzy,Dandy,Dagenais,Culotta,Cruzado,Crudup,Croswell,Coverdale,Covelli,Couts,Corbell,Coplan,Coolbaugh,Conyer,Conlee,Conigliaro,Comiskey,Coberly,Clendening,Clairmont,Cienfuegos,Chojnacki,Chilcote,Champney,Cassara,Casazza,Casado,Carew,Carbin,Carabajal,Calcagni,Cail,Caddy,Busbee,Burts,Burbridge,Bunge,Bundick,Buhler,Bucker,Bucholtz,Bruen,Broce,Brite,Brignac,Brierly,Bridgman,Braham,Bradish,Boyington,Borjas,Bonnie,Bonn,Bonhomme,Bohlen,Bogardus,Bockelman,Blick,Blackerby,Bizier,Biro,Binney,Bertolini,Bertin,Berti,Bert,Bento,Beno,Belgarde,Belding,Beckel,Becerril,Bazaldua,Bayes,Bayard,Barrus,Barris,Baros,Bara,Ballow,Balboa,Bakewell,Baginski,Badalamenti,Backhaus,Avilez,Auvil,Atteberry,Ardon,Anzaldua,Anello,Amsler,Amo,Ambrosio,Althouse,Alles,Alix,Alberti,Alberson,Aitchison,Aguinaga,Ziemann,Zickefoose,Zerr,Zeh,Zeck,Zartman,Zahm,Zabriskie,Yohn,Yellowhair,Yeaton,Yarnall,Yaple,Wolski,Wixon,Winford,Willner,Willms,Whitsitt,Wheelwright,Weyandt,Wess,Wengerd,Weatherholtz,Wattenbarger,Walrath,Walpole,Waldrip,Voges,Violet,Vinzant,Viars,Veres,Veneziano,Veillon,Vawter,Vaughns,Vanwart,Vanostrand,Valiente,Valderas,Uhrig,Tunison,Tulloch,Trostle,Treaster,Traywick,Toye,Tomson,Tomasello,Tomasek,Tippit,Tinajero,Tift,Tienda,Thorington,Thierry,Thieme,Thibeau,Thakkar,Tewell,Test,Telfer,Sweetser,Sum,Stratford,Stracener,Stoke,Stiverson,Stelling,Stefan,Stavros,Speaker,Spatz,Spagnoli,Sorge,Sober,Slevin,Slabaugh,Simson,Shupp,Shoultz,Shotts,Shiroma,Shetley,Sherrow,Sheffey,Shawgo,Shamburger,Sester,Segraves,Seelig,Seats,Scioneaux,Schwartzkopf,Schwabe,Scholes,Schmuck,Schluter,Schlecht,Schillaci,Schildgen,Schieber,Schewe,Schecter,Scarpelli,Scaglione,Sautter,Santelli,Sandman,Salmi,Sabado,Ryer,Rydberg,Ryba,Rushford,Running,Runk,Ruddick,Rotondo,Rote,Rosenfield,Roesner,Rocchio,Ritzer,Rippel,Rimes,Riffel,Richison,Ribble,Reynold,Resh,Rehn,Ratti,Rasor,Rasnake,Rappold,Rando,Radosevich,Pulice,Puff,Prichett,Pribble,Poynor,Plowden,Pitzen,Pittsley,Pitter,Pigeon,Philyaw,Philipps,Petite,Pestana,Perro,Perone,Pera,Peil,Pedone,Pawlowicz,Pattee,Parten,Parlin,Pariseau,Paredez,Pardon,Panther,Paek,Pacifico,Otts,Ostrow,Osornio,Oslund,Orso,Ooten,Onken,Oniel,Onan,Ollison,Ohlsen,Ohlinger,Odowd,Niemiec,Neubert,Nembhard,Neaves,Neathery,Nakasone,Myerson,Muto,Muntz,Munez,Mumme,Mumm,Mujica,Muise,Muench,Morriss,Molock,Mishoe,Minier,Metzgar,Mero,Meiser,Meese,Meals,Mcsween,Mcquire,Mcquinn,Mcpheeters,Mckeller,Mcilrath,Mcgown,Mcdavis,Mccuen,Mcclenton,Maxham,Matsui,Marriner,Marlette,Mantle,Mansur,Mancino,Maland,Majka,Maisch,Maheux,Madry,Madriz,Mackley,Macke,Lydick,Lutterman,Luppino,Lundahl,Lovingood,Loudon,Longmore,Lippman,Liefer,Leveque,Lescarbeau,Lemmer,Ledgerwood,Lawver,Lawrie,Lattea,Lasko,Lahman,Kulpa,Kukowski,Kukla,Kubota,Kubala,Krizan,Kriz,Krikorian,Kravetz,Kramp,Kowaleski,Knobloch,Klosterman,Kloster,Klepper,Kirven,Kinnaman,Kinnaird,Killam,Kiesling,Kesner,Keebler,Keagle,Karls,Kapinos,Kantner,Kaba,Junious,Jefferys,Jacquet,Izzi,Ishii,Irion,Ifill,Hyun,Hotard,Horman,Hoppes,Hopkin,Hokanson,Hoda,Hocutt,Hoaglin,Hites,Hirai,Hindle,Hinch,Hilty,Hild,Hier,Hickle,Hibler,Henrichs,Hempstead,Helmers,Hellard,Heims,Heidler,Hearst,Hawbaker,Hau,Harkleroad,Harari,Hanney,Hannaford,Hamid,Hamburger,Haltom,Hallford,Guilliams,Guerette,Gryder,Groseclose,Groen,Grimley,Greenidge,Greek,Graffam,Goucher,Goodenough,Goldsborough,Goldie,Gloster,Glanton,Gladson,Gladding,Ghee,Gethers,Gerstein,Geesey,Geddie,Gayer,Gaw,Gaver,Gauntt,Gartland,Garriga,Garoutte,Gao,Gan,Fronk,Fritze,Frenzel,Forgione,Fluitt,Flinchbaugh,Flach,Fiorito,Finan,Finamore,Fimbres,Fillman,File,Figeroa,Ficklin,Feher,Feddersen,Fambro,Fairbairn,Eves,Esperanza,Escalona,Elsey,Eisenstein,Ehrenberg,Eargle,Dress,Drane,Dorothy,Doria,Dogan,Dively,Dewolfe,Dettman,Desiderio,Desch,Dennen,Denk,Demaris,Delsignore,Dejarnette,Deere,Dedman,Daws,Dawn,Dauphinais,Danz,Dantin,Dannenberg,Dalby,Currence,Culwell,Cuesta,Croston,Crossno,Cromley,Crisci,Craw,Coryell,Cooter,Condra,Columbia,Colpitts,Colas,Coach,Clink,Clevinger,Clermont,Cistrunk,Cirilo,Chirico,Chiarello,Cephus,Cecena,Cavaliere,Caughey,Casimir,Carwell,Carlon,Carbonaro,Caraveo,Cantley,Callejas,Cagney,Cadieux,Cabaniss,Bushard,Burlew,Buras,Budzinski,Bucklew,Bruneau,Brummer,Brueggemann,Brotzman,Bross,Broad,Brittian,Brimage,Briles,Brickman,Breneman,Breitenstein,Brandel,Brackins,Boydstun,Botta,Bosket,Boros,Borgmann,Bordeau,Bonifacio,Bolten,Boehman,Blundell,Bloodsaw,Bjerke,Biffle,Bickett,Bickers,Beville,Bergren,Bergey,Benzing,Belfiore,Beirne,Beckert,Bebout,Baumert,Battey,Bartman,Barrs,Barriere,Barcelo,Barbe,Balliet,Baham,Babst,Auton,Asper,Asbell,Arzate,Argento,Arel,Araki,Arai,Apo,Antley,Amodeo,Ammann,Allyn,Allensworth,Aldape,Akey,Abeita,Zweifel,Zeng,Zeiler,Zamor,Zalenski,Yzaguirre,Yousef,Yetman,Yau,Wyer,Woolwine,Wohlgemuth,Wohlers,Wittenberg,Wingrove,Wind,Wimsatt,Willimas,Wilkenson,Wildey,Wilderman,Wilczynski,Wigton,Whorley,Wellons,Welles,Welle,Weirich,Weideman,Weide,Weekly,Weast,Wasmund,Warshaw,Walson,Waldner,Walch,Walberg,Wagener,Wageman,Vrieze,Vossen,Vorce,Voorhis,Vonderheide,Viruet,Vicari,Verne,Velasques,Vautour,Vartanian,Varona,Vankeuren,Vandine,Vandermeer,Ursery,Underdown,Uhrich,Uhlman,Tworek,Twine,Twellman,Tweedie,Tutino,Turmelle,Tubb,Troop,Trivedi,Triano,Trevathan,Treese,Treanor,Treacy,Traina,Topham,Toenjes,Tippetts,Tieu,Thomure,Thatch,Than,Tetzlaff,Tetterton,Tena,Tell,Teamer,Tappan,Tank,Talcott,Tagg,Szczepanski,Syring,Surace,Sulzer,Sugrue,Sugarman,Suess,Styons,Stwart,Stupka,Strey,Straube,Strate,Stoddart,Stockbridge,Stjames,Stinger,Steimle,Steenberg,Start,Stamand,Staller,Stahly,Stager,Spurgin,Sprow,Sponsler,Speas,Spainhour,Sones,Smits,Smelcer,Slovak,Slaten,Singleterry,Simien,Sidebottom,Sibrian,Shellhammer,Shelburne,Shambo,Sepeda,Seigel,Scogin,Scianna,Schmoll,Schmelzer,Scheu,Schachter,Savant,Sauseda,Satcher,Sandor,Sampsell,Rugh,Rufener,Rudolf,Rotenberry,Rossow,Rossbach,Roots,Rollman,Rodrique,Rodreguez,Rodkey,Roda,Rising,Rini,Riggan,Rients,Riedl,Rhines,Ress,Reinbold,Raschke,Rardin,Rain,Racicot,Quillin,Pushard,Primrose,Pries,Pressey,Precourt,Pratts,Postel,Poppell,Plumer,Pingree,Pieroni,Pflug,Petre,Petrarca,Peterka,Peru,Perkin,Pergande,Peranio,Penna,Pekar,Pea,Paulhus,Pasquariello,Parras,Parmentier,Para,Panzer,Pamplin,Oviatt,Osterhoudt,Ostendorf,Osmun,Ortman,Orloff,Orban,Onofrio,Olveda,Oltman,Okeeffe,Ocana,Nunemaker,Novy,Noffsinger,Nish,Niday,Nethery,Nestle,Nemitz,Neidert,Nadal,Nack,Muszynski,Munsterman,Mulherin,Mortimore,Morter,Montesino,Montalvan,Montalbano,Momon,Moman,Mom,Mogan,Minns,Millward,Milling,Michelsen,Micheal,Mewborn,Metro,Metayer,Mensch,Meloy,Meggs,Meaders,Mcsorley,Mcmenamin,Mclead,Mclauchlin,Mcguffey,Mcguckin,Mcglaughlin,Mcferron,Mcentyre,Mccrum,Mccawley,Mcbain,Mayhue,Mau,Matzen,Matton,Marsee,Marrin,Marland,Markum,Mantilla,Manfre,Malta,Makuch,Madlock,Maclaren,Macauley,Luzier,Luthy,Lufkin,Lucena,Loudin,Lothrop,Lorch,Lona,Loll,Loadholt,Lisa,Lippold,Likes,Lichtman,Liberto,Liakos,Lewicki,Levett,Level,Lentine,Leja,Legree,Lawhead,Lauro,Lauder,Lard,Lanman,Lank,Laning,Lama,Lalor,Krob,Kriger,Kriegel,Krejci,Kreisel,Kozel,Kos,Konkel,Kolstad,Koenen,Kocsis,Knoblock,Knebel,Klopfer,Klee,Kilday,Kesten,Kerbs,Kempker,Keathley,Kazee,Kawasaki,Kaur,Kamer,Kamaka,Kallenbach,Kafka,Jerrell,Jehle,Jaycox,Jardin,Jahns,Ivester,Hyppolite,Hyche,Husbands,Hur,Huppert,Hulin,Hubley,Horsey,Hornak,Holzwarth,Holmon,Hollabaugh,Holaway,Hodes,Hoak,Hinesley,Hillwig,Hillebrand,Highfield,Heslop,Herrada,Hendryx,Hellums,Heit,Heishman,Heindel,Hayslip,Hayford,Hastie,Hartgrove,Hanus,Hakim,Hains,Hadnott,Gundersen,Gulino,Guidroz,Guebert,Gressett,Greenhouse,Graydon,Gramling,Grahn,Goupil,Gory,Gorelick,Goodreau,Goodnough,Golay,Going,Goers,Glatz,Gillikin,Gieseke,Giammarino,Getman,Geronimo,Gerardo,Gensler,Gazda,Garibaldi,Gahan,Fury,Funderburke,Fukuda,Fugitt,Fuerst,Fortman,Forsgren,Formica,Fluke,Flink,Fitton,Feltz,Fekete,Feit,Fehrenbach,Farone,Farinas,Faries,Fagen,Ewin,Esquilin,Esch,Enderle,Ellery,Ellers,Ekberg,Egli,Effinger,Dymond,Dulle,Dula,Duhe,Dudney,Duane,Dowless,Dower,Dorminey,Dopp,Dooling,Domer,Disher,Dillenbeck,Difilippo,Dibernardo,Deyoe,Devillier,Denley,Deland,Defibaugh,Deeb,Debow,Dauer,Datta,Darcangelo,Daoust,Damelio,Dahm,Dahlman,Cypher,Curling,Curlin,Cupit,Culton,Cuenca,Cropp,Croke,Cremer,Crace,Cosio,Corzine,Coombe,Coman,Colone,Coloma,Collingwood,Coletta,Coderre,Cocke,Cobler,Claybrook,Circle,Cincotta,Cimmino,Christoff,Christina,Chisum,Chillemi,Chevere,Chae,Chachere,Cervone,Cermak,Cefalu,Cauble,Cather,Caso,Carns,Carcamo,Carbo,Capoccia,Capello,Capell,Canino,Cambareri,Calvi,Cabiness,Bushell,Burtt,Burstein,Burkle,Bunner,Bundren,Buechler,Bryand,Bruso,Brownstein,Brow,Brouse,Brodt,Broaden,Brisbin,Brightman,Bridgett,Brenes,Breitenbach,Brazzell,Brazee,Bramwell,Bramhall,Bradstreet,Boyton,Bowland,Boulter,Bossert,Bonura,Bonebrake,Bonacci,Boeck,Blystone,Birchard,Bilal,Biddy,Bibee,Bevans,Bethke,Bertelsen,Berney,Bergfeld,Benware,Bellon,Bellah,Been,Batterton,Barberio,Bamber,Bagdon,Badeaux,Averitt,Augsburger,Ates,Arvie,Aronowitz,Arens,Arch,Araya,Angelos,Andrada,Amell,Amante,Alvin,Almy,Almquist,Alls,Aispuro,Aguillon,Agudelo,Admire,Acy,Aceto,Abbot,Abalos,Zdenek,Zaremba,Zaccaria,Youssef,Wrona,Wrinkle,Wrede,Wotton,Woolston,Wolpert,Wollman,Wince,Wimberley,Willmore,Willetts,Wikoff,Wieder,Wickert,Whitenack,Wernick,Welte,Welden,Weiskopf,Weisenberger,Weich,Wallington,Walder,Vossler,Vore,Vigo,Vierling,Victorine,Verdun,Vencill,Vena,Vazguez,Vassel,Vanzile,Vanvliet,Vantrease,Vannostrand,Vanderveer,Vanderveen,Vancil,Uyeda,Umphrey,Uhler,Uber,Tutson,Turrentine,Tullier,Tugwell,Trundy,Tripodi,Tomer,Tomei,Tomasi,Tomaselli,Tokarski,Tisher,Tibbets,Thweatt,Thistle,Tharrington,Tesar,Telesco,Teasdale,Tatem,Taniguchi,Suriel,Sudler,Stutsman,Sturman,Strite,Strelow,Streight,Strawder,Stransky,Strahl,Stours,Stong,Stinebaugh,Stilts,Stillson,Steyer,Stelle,Steffy,Steffensmeier,Statham,Squillante,Spiess,Spargo,Southward,Soller,Soden,Snuggs,Snellgrove,Smyers,Smiddy,Slonaker,Skyles,Skowron,Sivils,Siqueiros,Siers,Siddall,Shorty,Shontz,Shingler,Shiley,Shibley,Sherard,Shelnutt,Shedrick,Shasteen,Sereno,Selke,Scovil,Scola,Schuett,Schuessler,Schreckengost,Schranz,Schoepp,Schneiderman,Schlanger,Schiele,Scheuermann,Schertz,Scheidler,Scheff,Schaner,Schamber,Scardina,Savedra,Saulnier,Sater,Sarro,Sambrano,Salomone,Sabourin,Ruud,Rutten,Ruffino,Ruddock,Rowser,Roussell,Rosengarten,Rominger,Rollinson,Rohman,Roeser,Rodenberg,Roberds,Ridgell,Rhodus,Reynaga,Rexrode,Revelle,Rempel,Remigio,Reising,Reiling,Reetz,Rayos,Ravenscroft,Ravenell,Raulerson,Rasmusson,Rask,Rase,Ragon,Quesnel,Quashie,Puzo,Puterbaugh,Ptak,Prost,Prisbrey,Principe,Pricer,Pratte,Pouncey,Portman,Pontious,Pomerantz,Platter,Planck,Pilkenton,Pilarski,Piano,Phegley,Pertuit,Perla,Penta,Pelc,Peffer,Pech,Peagler,Pavelka,Pavao,Patman,Paskett,Parrilla,Pardini,Papazian,Panter,Palin,Paley,Pai,Pages,Paetzold,Packett,Pacheo,Ostrem,Orsborn,Olmedo,Okamura,Oiler,Ohm,Oglesbee,Oatis,Oakland,Nuckles,Notter,Nordyke,Nogueira,Niswander,Nibert,Nesby,Neloms,Nading,Naab,Munns,Mullarkey,Moudy,Moret,Monnin,Molder,Modisette,Moczygemba,Moctezuma,Mischke,Miro,Mings,Milot,Milledge,Milhorn,Milera,Mieles,Mickley,Michelle,Micek,Metellus,Mersch,Merola,Mercure,Mencer,Mellin,Mell,Meinke,Mcquillan,Mcmurtrie,Mckillop,Mckiernan,Mckendrick,Mckamie,Mcilvaine,Mcguffie,Mcgonigle,Mcgarrah,Mcfetridge,Mcenaney,Mcdow,Mccutchan,Mccallie,Mcadam,Maycock,Maybee,Mattei,Massi,Masser,Masiello,Marth,Marshell,Marmo,Marksberry,Markell,Marchal,Manross,Manganaro,Mally,Mallow,Mailhot,Magyar,Madonna,Madero,Madding,Maddalena,Macfarland,Lynes,Lush,Lugar,Luckie,Lucca,Lovitt,Loveridge,Loux,Loth,Loso,Lorenzana,Lorance,Lockley,Lockamy,Littler,Litman,Litke,Liebel,Lichtenberger,Licea,Leverich,Letarte,Lesesne,Leno,Legleiter,Leffew,Laurin,Launius,Laswell,Lassen,Lasala,Laraway,Laramore,Landrith,Lancon,Lanahan,Laiche,Laford,Lachermeier,Kunst,Kugel,Kuck,Kuchta,Kube,Korus,Koppes,Kolbe,Koerber,Kochan,Knittel,Kluck,Kleve,Kleine,Kitch,Kirton,Kirker,Kintz,Kinghorn,Kindell,Kimrey,Kilduff,Kilcrease,Kicklighter,Kibble,Kervin,Keplinger,Keogh,Kellog,Keeth,Kealey,Kazmierczak,Karner,Kamel,Kalina,Kaczynski,Juel,Joye,Jerman,Jeppson,Jawad,Jasik,Jaqua,Janusz,Janco,Island,Inskeep,Inks,Ingold,Ing,Hyndman,Hymer,Hunte,Hunkins,Humber,Huffstutler,Huffines,Hudon,Hudec,Hovland,Houze,Hout,Hougland,Hopf,Hon,Holsapple,Holness,Hollenbach,Hoffmeister,Hitchings,Hirata,Hieber,Hickel,Hewey,Herriman,Hermansen,Herandez,Henze,Heffelfinger,Hedgecock,Hazlitt,Hazelrigg,Haycock,Harren,Harnage,Harling,Harcrow,Hannold,Hanline,Hanel,Hanberry,Hammersley,Hamernik,Halliwell,Hajduk,Haithcock,Haff,Hadaway,Haan,Gullatt,Guilbault,Guidotti,Gruner,Grisson,Grieves,Granato,Gracie,Grabert,Gover,Gorka,Glueck,Girardin,Giorgio,Giesler,Gersten,Gering,Geers,Gaut,Gaulin,Gaskamp,Garbett,Gallivan,Galland,Gaeth,Fullenkamp,Fullam,Friedrichs,Freire,Freeney,Fredenburg,Frappier,Fowkes,Foree,Fleurant,Fleig,Fleagle,Fitzsimons,Fischetti,Fiorenza,Finneran,Filippi,Figueras,Fesler,Fertig,Fennel,Feltmann,Felps,Felmlee,Faye,Fannon,Familia,Fairall,Fail,Fadden,Esslinger,Enfinger,Elsasser,Elmendorf,Ellisor,Einhorn,Ehrman,Egner,Edmisten,Edlund,Ebinger,Dyment,Dykeman,Durling,Dunstan,Dunsmore,Dugal,Duer,Drescher,Doyel,Down,Dossey,Donelan,Dockstader,Dobyns,Divis,Dilks,Didier,Desrosier,Desanto,Deppe,Deng,Delosh,Delange,Defrank,Debo,Dauber,Dartez,Daquila,Dankert,Dahn,Cygan,Cusic,Curfman,Croghan,Croff,Criger,Creviston,Crays,Cravey,Crandle,Crail,Crago,Craghead,Cousineau,Couchman,Cothron,Corella,Conine,Coller,Colberg,Cogley,Coatney,Coale,Clendenin,Claywell,Clagon,Cifaldi,Choiniere,Chickering,Chica,Chennault,Chavarin,Chattin,Chaloux,Challis,Cesario,Certain,Cazarez,Caughman,Catledge,Casebolt,Carrel,Carra,Carlow,Capote,Canez,Camillo,Caliendo,Calbert,Cairo,Bylsma,Bustle,Buskey,Buschman,Burkhard,Burghardt,Burgard,Buonocore,Bunkley,Bungard,Bundrick,Bumbrey,Buice,Buffkin,Brundige,Brockwell,Brion,Brin,Briant,Bredeson,Bransford,Brannock,Brakefield,Brackens,Brabant,Boxer,Bowdoin,Bouyer,Bothe,Boor,Bonavita,Bollig,Blurton,Blunk,Blanke,Blanck,Birden,Bierbaum,Bevington,Beutler,Betters,Bettcher,Bera,Benway,Bengston,Benesh,Behar,Bedsole,Becenti,Beachy,Battersby,Basta,Bartmess,Bartle,Bartkowiak,Barsky,Barrio,Barletta,Barfoot,Banegas,Ballin,Baldonado,Bal,Azcona,Avants,Austell,Aungst,Aune,Aumann,Audia,Atterbury,Asselin,Asmussen,Ashline,Asbill,Arvizo,Arnot,Ariola,Ardrey,Angstadt,Anastasio,Amsden,Amor,Amerman,Alred,Almeda,Allington,Alewine,Alcina,Alberico,Alas,Ahlgren,Aguas,Agrawal,Agosta,Adolphsen,Addie,Acre,Acey,Aburto,Abler,Zwiebel,Zuk,Zepp,Zentz,Ybarbo,Yarberry,Yamauchi,Yamashiro,Wurtz,Wronski,Worster,Wootten,Wool,Wongus,Woltz,Wolanski,Witzke,Withey,Wisecarver,Wingham,Wineinger,Winegarden,Windholz,Wilgus,Wiesen,Wieck,Widrick,Wickliffe,Whittenberg,Westby,Werley,Wengert,Wendorf,Weimar,Weick,Weckerly,Watrous,Wasden,Walford,Wainright,Wahlstrom,Wadlow,Vrba,Voisin,Vives,Vivas,Vitello,Villescas,Villavicencio,Villanova,Vialpando,Vetrano,Verona,Vensel,Vassell,Varano,Vanriper,Vankleeck,Vanduyne,Vanderpol,Vanantwerp,Valenzula,Udell,Turnquist,Tuff,Trickett,Tremble,Tramble,Tingey,Ting,Timbers,Tietz,Thon,Thiem,Then,Tercero,Tenner,Tenaglia,Teaster,Tarlton,Taitt,Taggert,Tabon,Sward,Swaby,Suydam,Surita,Suman,Sugar,Suddeth,Stumbo,Studivant,Strobl,Stretch,Streich,Stow,Stoodley,Stoecker,Stillwagon,Stickle,Stellmacher,Stefanik,Steedley,Starbird,Stake,Stainback,Stacker,Speir,Spath,Sommerfeld,Soltani,Solie,Sojka,Sobota,Sobieski,Sobczak,Smullen,Sleeth,Slaymaker,Skolnick,Skoglund,Sires,Singler,Silliman,Shrock,Shott,Shirah,Shimek,Shepperd,Sheffler,Sheeler,Sharrock,Sharman,Shalash,Seyfried,Seybold,Selander,Seip,Seifried,Sedor,Sedlock,Sebesta,Seago,Scutt,Scrivens,Sciacca,Schultze,Schoemaker,Schleifer,Schlagel,Schlachter,Schempp,Scheider,Scarboro,Santi,Sang,Sandhu,Sally,Salim,Saia,Rylander,Ryburn,Rutigliano,Ruocco,Ruland,Rudloff,Rott,Rosenburg,Rosenbeck,Romberger,Romanelli,Rohloff,Rohlfing,Rodda,Rodd,Ritacco,Rielly,Rieck,Rickles,Rickenbacker,Rhett,Respass,Reisner,Reineck,Reighard,Rehbein,Rega,Redwood,Reddix,Razor,Rawles,Raver,Rattler,Ratledge,Rathman,Ramsburg,Raisor,Radovich,Radigan,Quail,Puskar,Purtee,Priestly,Prestidge,Presti,Pressly,Pozo,Pottinger,Portier,Porta,Porcelli,Poplawski,Polin,Points,Poeppelman,Pocock,Plump,Plantz,Placek,Piro,Pinnell,Pinkowski,Pietz,Picone,Philbeck,Pflum,Peveto,Perret,Pentz,Payer,Paulette,Patlan,Paterno,Papageorge,Pae,Overmyer,Overland,Osier,Orwig,Orum,Orosz,Oquin,Opie,Oda,Ochsner,Oathout,Nygard,Norville,Northway,Niver,Nicolson,Newhart,Nery,Neitzel,Nath,Nanez,Mustard,Murnane,Mortellaro,Morreale,Morino,Moriarity,Morgado,Moorehouse,Mongiello,Molton,Mirza,Minnix,Millspaugh,Milby,Miland,Miguez,Mickles,Michaux,Mento,Melugin,Melrose,Melito,Meinecke,Mehr,Meares,Mcneece,Mckane,Mcglasson,Mcgirt,Mcgilvery,Mcculler,Mccowen,Mccook,Mcclintic,Mccallon,Mazzotta,Maza,Mayse,Mayeda,Matousek,Matley,Martyn,Maroon,Marney,Marnell,Marling,Marcelino,Manuelito,Maltos,Malson,Maire,Mahi,Maffucci,Macken,Maass,Lyttle,Lynd,Lyden,Lukasiewicz,Luebbers,Lovering,Loveall,Lords,Longtin,Lok,Lobue,Loberg,Loan,Lipka,Lion,Linen,Lightbody,Lichty,Levert,Lev,Lettieri,Letsinger,Lepak,Lemmond,Lembke,Leitz,Lasso,Lasiter,Lango,Landsman,Lamirande,Lamey,Laber,Kuta,Kulesza,Kua,Krenz,Kreiner,Krein,Kreiger,Kraushaar,Kottke,Koser,Kornreich,Kopczynski,Konecny,Kok,Koff,Koehl,Kocian,Knaub,Kmetz,Kluender,Klenke,Kleeman,Kitzmiller,Kirsh,Kilman,Kildow,Kielbasa,Ketelsen,Kesinger,Kendra,Kehr,Keef,Kauzlarich,Karter,Kahre,Junk,Jong,Jobin,Joaquin,Jinkins,Jines,Jeffress,Jaquith,Jaillet,Jablonowski,Ishikawa,Irey,Ingerson,Indelicato,In,Huntzinger,Huisman,Huett,Howson,Houge,Hosack,Hora,Hoobler,Holtzen,Holtsclaw,Hollingworth,Hollin,Hoberg,Hobaugh,Hilker,Hilgefort,Higgenbotham,Heyen,Hetzler,Hessel,Hennessee,Hendrie,Hellmann,Heft,Heesch,Haymond,Haymon,Haye,Havlik,Havis,Haverland,Haus,Harstad,Harriston,Harm,Harju,Hardegree,Hankey,Hands,Hampshire,Hammell,Hamaker,Halbrook,Halberg,Guptill,Guntrum,Gunderman,Gunder,Gularte,Guarnieri,Gu,Groll,Grippo,Greely,Grave,Gramlich,Goh,Goewey,Goetzinger,Goding,Giraud,Giefer,Giberson,Gennaro,Gemmell,Gearing,Gayles,Gaudin,Gatz,Gatts,Gasca,Garn,Gandee,Gammel,Galindez,Galati,Gagliardo,Fulop,Fukushima,Friedt,Fretz,Frenz,Freeberg,Frederic,Fravel,Fountaine,Forry,Forck,Fonner,Flippin,Flewelling,Flansburg,Filippone,Fettig,Fenlon,Felter,Felkins,Fein,Faz,Favor,Favero,Faulcon,Farver,Farless,Fahnestock,Facemire,Faas,Eyer,Evett,Every,Esses,Escareno,Ensey,Ennals,Engelking,Empey,Emily,Elvira,Ellithorpe,Effler,Edling,Edgley,Durrell,Dunkerson,Draheim,Domina,Dombrosky,Doescher,Dobbin,Divens,Dinatale,Dimitri,Dieguez,Diede,Devivo,Devilbiss,Devaul,Determan,Desjardin,Deshaies,Demo,Delpozo,Delorey,Delman,Delapp,Delamater,Deibert,Degroff,Debelak,Dapolito,Dano,Dacruz,Dacanay,Cushenberry,Cruze,Crosbie,Cregan,Cousino,Corrie,Corrao,Corney,Cookingham,Conry,Collingsworth,Coldren,Cobian,Coate,Clauss,Chrysler,Christine,Christenberry,Chmiel,Chauez,Charters,Chait,Cesare,Cella,Caya,Castenada,Cashen,Captain,Cantrelle,Canova,Candy,Canary,Campione,Camel,Calixte,Caicedo,Byerley,Buttery,Butter,Burda,Burchill,Bun,Bulmer,Bulman,Buesing,Buczek,Buckholz,Buchner,Buchler,Buban,Bryne,Brutus,Brunkhorst,Brumsey,Brumer,Brownson,Broker,Brodnax,Brezinski,Brazile,Braverman,Brasil,Branning,Bradly,Boye,Boulden,Bough,Bossard,Bosak,Borth,Borgmeyer,Borge,Blowers,Blaschke,Blann,Blankenbaker,Bisceglia,Billingslea,Bialek,Beverlin,Besecker,Berquist,Benigno,Benavente,Belizaire,Beisner,Behrman,Beausoleil,Bea,Baylon,Bayley,Bassi,Basnett,Basilio,Basden,Basco,Banerjee,Balli,Bake,Bagnell,Bady,Averette,Augusta,Arzu,Arn,Archambeault,Arboleda,Arbaugh,Arata,Antrim,Amrhein,Amerine,Alpers,Alfrey,Alcon,Albus,Albertini,Aguiniga,Aday,Acquaviva,Accardi,Zygmont,Zych,Zollner,Zobel,Zinck,Zertuche,Zaragosa,Zale,Zaldivar,Ying,Yeadon,Wykoff,Woullard,Wolfrum,Wohlford,Wison,Wiseley,Wisecup,Winchenbach,Wiltsie,Whittlesey,Whitelow,Whiteford,Wever,Westrich,Wertman,Wensel,Wenrich,Weisbrod,Weglarz,Wedderburn,Weatherhead,Wease,Warring,Wand,Wadleigh,Voltz,Vise,Villano,Vicario,Vermeulen,Vazques,Vasko,Varughese,Vangieson,Vanfossen,Vanepps,Vanderploeg,Vancleve,Valerius,Uyehara,Unsworth,Twersky,Turrell,Tuner,Tsui,Trunzo,Trousdale,Trentham,Traughber,Torgrimson,Toppin,Tokar,Tobia,Tippens,Tigue,Thong,Thiry,Thackston,Terhaar,Tenny,Tassin,Tadeo,Sweigart,Sutherlin,Sumrell,Suen,Stuhr,Strzelecki,Strosnider,Streiff,Stottlemyer,Storment,Storlie,Stonesifer,Stogsdill,Stenzel,Stemen,Stellhorn,Steidl,Stecklein,Statton,Staple,Stangle,Spratling,Spoor,Spight,Spelman,Spece,Spanos,Spadoni,Southers,Sola,Sobol,Smyre,Slaybaugh,Sizelove,Sirmons,Simington,Silversmith,Siguenza,Sieren,Shelman,Shawn,Sharples,Sharif,Shack,Seville,Sessler,Serrata,Serino,Serafini,Semien,Selvey,Seedorf,Seckman,Seawood,Screws,Screen,Scoby,Scicchitano,Schorn,Schommer,Schnitzer,Schleusner,Schlabach,Schiel,Schepers,Schaber,Scally,Sautner,Sartwell,Santerre,Sandage,Salvia,Salvetti,Salsman,Sallis,Salais,Saint,Saeger,Sable,Sabat,Saar,Ruther,Russom,Ruoff,Rumery,Rubottom,Rozelle,Rowton,Routon,Rotolo,Rostad,Roseborough,Rorick,Ronco,Rolls,Roher,Roberie,Robare,Ritts,Rison,Rippe,Rinke,Ringwood,Righter,Rieser,Rideaux,Rickerson,Renfrew,Releford,Reinsch,Reiman,Reifsteck,Reidhead,Redfearn,Reddout,Reaux,Rance,Ram,Rado,Radebaugh,Quinby,Quigg,Provo,Provenza,Provence,Prophet,Pridgeon,Praylow,Powel,Poulter,Portner,Pontbriand,Police,Poirrier,Poirer,Platero,Pixler,Pintor,Pigman,Piersall,Piel,Pichette,Phou,Phillis,Phillippe,Pharis,Phalen,Petsche,Perrier,Penfield,Pelosi,Pebley,Peat,Pawloski,Pawlik,Pavlick,Pavel,Patz,Patout,Pascucci,Pasch,Parrinello,Parekh,Pantaleo,Pannone,Pankow,Pangborn,Pagani,Pacelli,Ort,Orsi,Oriley,Orduno,Oommen,Olivero,Okada,Ocon,Ocheltree,Oberman,Nyland,Noss,Norling,Nolton,Nobile,Nitti,Nishimoto,Nghiem,Neuner,Neuberger,Neifert,Negus,Naval,Nagler,Mullally,Moulden,Morra,Morquecho,Morocco,Moots,Monica,Mizzell,Mirsky,Mirabito,Minardi,Milholland,Mikus,Mijangos,Michener,Michalek,Methvin,Merrit,Menter,Meneely,Melody,Meiers,Mehring,Mees,Medal,Mcwhirt,Mcwain,Mcphatter,Mcnichol,Mcnaught,Mclarty,Mcivor,Mcginness,Mcgaughy,Mcferrin,Mcfate,Mcclenny,Mcclard,Mccaskey,Mccallion,Mcamis,Mathisen,Marton,Marsico,Mariner,Marchi,Mani,Mangione,Magda,Macaraeg,Lupi,Lunday,Lukowski,Lucious,Locicero,Loach,Littlewood,Litt,Litle,Lipham,Linley,Lindon,Lightford,Lieser,Leyendecker,Lewey,Lesane,Lenzi,Lenart,Lena,Leisinger,Lehrman,Lefebure,Leandro,Lazard,Laycock,Laver,Launer,Lastrapes,Lastinger,Lasker,Larkey,Larger,Lanser,Lanphere,Landey,Lan,Lampton,Lamark,Lager,Kumm,Kullman,Krzeminski,Krasner,Kram,Koran,Koning,Kohls,Kohen,Kobel,Kniffen,Knick,Kneip,Knappenberger,Knack,Klumpp,Klausner,Kitamura,Kisling,Kirshner,Kinloch,Kingman,Kin,Kimery,Kestler,Kellen,Keleher,Keehn,Kearley,Kasprzak,Kary,Kampf,Kamerer,Kalis,Kahan,Kaestner,Kadel,Kabel,Junge,Juckett,Joynt,Jorstad,Jetter,Jelley,Jefferis,Jeff,Jeansonne,Janecek,Jaffee,Jacko,Izzard,Istre,Isherwood,Ipock,Iannuzzi,Hypolite,Hussein,Humfeld,Huckleberry,Hotz,Hosein,Honahni,Holzworth,Holdridge,Holdaway,Holaday,Hodak,Hitchman,Hippler,Hinchey,Hillin,Hiler,Hibdon,Hevey,Heth,Hepfer,Henneman,Hemsley,Hemmings,Hemminger,Helbert,Helberg,Heinze,Heeren,Hee,Heber,Haver,Hauff,Haswell,Harvison,Hartson,Harshberger,Harryman,Harries,Hannibal,Hane,Hamsher,Haggett,Hagemeier,Haecker,Haddon,Haberkorn,Guttman,Guttierrez,Guthmiller,Guillet,Guilbert,Gugino,Grumbles,Griffy,Gregerson,Greg,Granada,Grana,Goya,Goranson,Gonsoulin,Goettl,Goertz,Goe,Godlewski,Glandon,Glad,Gilsdorf,Gillogly,Gilkison,Giard,Giampaolo,Gheen,Gettings,Gesell,Gershon,Gaumer,Gartrell,Garside,Garrigan,Garmany,Garlitz,Garlington,Gamet,Gail,Fuss,Furlough,Funston,Funaro,Frix,Frasca,Francoeur,Forshey,Foose,Flatley,Flagler,Fils,Fillers,Fickett,Feth,Fennelly,Fencl,Felch,Fedrick,Febres,Fazekas,Farnan,Fairless,Ewan,Etsitty,Enterline,Elvin,Elsworth,Elliff,Ell,Eleby,Eldreth,Eidem,Edgecomb,Edds,Ebarb,Dworkin,Dusenberry,Durrance,Duropan,Durfey,Dungy,Dundon,Dumbleton,Duffel,Dubon,Dubberly,Droz,Drinkwater,Dressel,Doughtie,Doshier,Dorrell,Dora,Dople,Doonan,Donadio,Dollison,Doig,Ditzler,Dishner,Discher,Dimaio,Digman,Difalco,Diem,Devino,Devens,Derosia,Deppen,Depaola,Deniz,Denardo,Demos,Demay,Delgiudice,Davi,Danielsen,Dally,Dais,Dahmer,Cutsforth,Cusimano,Curington,Cumbee,Cryan,Crusoe,Crowden,Crete,Cressman,Crapo,Cowens,Coupe,Councill,Coty,Cotnoir,Correira,Copen,Consiglio,Combes,Coffer,Cockrill,Coad,Clogston,Clasen,Chock,Chesnutt,Charrier,Chain,Chadburn,Cerniglia,Cebula,Castruita,Castilla,Castaldi,Casebeer,Casagrande,Carta,Carrales,Carnley,Cardon,Carasco,Capshaw,Capron,Cappiello,Capito,Canney,Candela,Caminiti,Califano,Calico,Calabria,Caiazzo,Cahall,Buscemi,Burtner,Burgdorf,Bureau,Burdo,Buffaloe,Buchwald,Brwon,Brunke,Brummond,Brumm,Broe,Brocious,Brocato,Bro,Britain,Briski,Brisker,Brightwell,Bresett,Breiner,Brazeau,Braz,Brayman,Brandis,Bramer,Bradeen,Boyko,Bourbon,Bossi,Boshart,Bortle,Boniello,Bomgardner,Bolz,Bolenbaugh,Bohling,Bohland,Bochenek,Blust,Bloxham,Blowe,Blish,Blackwater,Bjelland,Biros,Birkhead,Biederman,Bickle,Bialaszewski,Bevil,Beverley,Beumer,Bettinger,Besse,Bernett,Bermejo,Bement,Belfield,Beckler,Beatrice,Baxendale,Batdorf,Bastin,Bashore,Bascombe,Bartlebaugh,Barsh,Ballantine,Bahl,Badon,Bachelor,Autin,Audie,Astin,Askey,Ascher,Arrigo,Arbeiter,Antes,Angers,Amburn,Amarante,Alvidrez,Althaus,Allmond,Alfieri,Aldinger,Akerley,Akana,Aikins,Ader,Acebedo,Accardo,Abila,Aberle,Abele,Abboud,Zollars,Zimmerer,Zieman,Zerby,Zelman,Zellars,Yule,Yoshimura,Yonts,Yeats,Yant,Yamanaka,Wyland,Wuensche,Worman,Wordlaw,Wohl,Winslett,Winberg,Wilmeth,Willcutt,Wiers,Wiemer,Wickwire,Wichman,Whitting,Whidbee,Westergard,Wemmer,Wellner,Weishaupt,Weinert,Weedon,Waynick,Wasielewski,Waren,Walworth,Wallingford,Walke,Waechter,Viviani,Vitti,Villagrana,Vien,Vicks,Venema,Varnes,Varnadoe,Varden,Vanpatten,Vanorden,Vanderzee,Vandenburg,Vandehey,Valls,Vallarta,Valderrama,Valade,Urman,Ulery,Tusa,Tuft,Tripoli,Trimpe,Trickey,Tortora,Torrens,Torchia,Toft,Tjaden,Tison,Tindel,Thurmon,Thode,Tardugno,Tancredi,Taketa,Taillon,Tagle,Sytsma,Symes,Swindall,Swicegood,Swartout,Sundstrom,Sumners,Sulton,Studstill,Student,Stroop,Stonerock,Stmarie,Stlawrence,Stemm,Steinhauser,Steinert,Steffensen,Stefano,Stefaniak,Starck,Stalzer,Spidle,Spake,Sowinski,Sosnowski,Sorber,Somma,Soliday,Soldner,Soja,Soderstrom,Soder,Sockwell,Sobus,Snowball,Sloop,Skeeter,Sinner,Sinkfield,Simerly,Silguero,Sigg,Siemers,Siegmund,Sidle,Shum,Sholtis,Shkreli,Sheikh,Shattles,Sharlow,Shao,Shambaugh,Shaikh,Serrao,Serafino,Selley,Selle,Seel,Sedberry,Secord,Seat,Schunk,Schuch,Schor,Scholze,Schnee,Schmieder,Schleich,Schimpf,Scherf,Satterthwaite,Sasson,Sarkisian,Sarinana,Sanzone,Salvas,Salone,Salido,Saiki,Sahr,Rusher,Rusek,Ruse,Ruppel,Rubi,Rubel,Rough,Rothfuss,Rothenberger,Rossell,Rosenquist,Rosebrook,Romito,Romines,Rolando,Rolan,Roker,Roehrig,Rockhold,Rocca,Robuck,Riss,Rinaldo,Right,Riggenbach,Rezentes,Reuther,Reuben,Renolds,Rench,Remus,Remsen,Reller,Relf,Reitzel,Reiher,Rehder,Redeker,Ramero,Rahaim,Radice,Quijas,Qualey,Purgason,Prum,Proudfoot,Prock,Probert,Printup,Primer,Primavera,Prenatt,Pratico,Polich,Podkowka,Podesta,Plattner,Plasse,Plamondon,Pittmon,Pippenger,Pineo,Pierpont,Petzold,Petz,Pettiway,Petters,Petroski,Petrik,Pesola,Pershall,Perlmutter,Penepent,Peevy,Pechacek,Pears,Peaden,Pazos,Pavia,Pascarelli,Parm,Parillo,Parfait,Paoletti,Palomba,Palencia,Pagaduan,Oxner,Overfield,Overcast,Oullette,Ouk,Ostroff,Osei,Omarah,Olenick,Olah,Odem,Nygren,Notaro,Northcott,Nodine,Nilges,Neyman,Neve,Neuendorf,Neptune,Neisler,Neault,Narciso,Naff,Muscarella,Mun,Most,Morrisette,Morphew,Morein,Mor,Montville,Montufar,Montesinos,Monterroso,Mongold,Mona,Mojarro,Moitoso,Mode,Mirarchi,Mirando,Minogue,Milici,Miga,Midyett,Michna,Mey,Meuser,Messana,Menzie,Menz,Mendicino,Melone,Mellish,Meller,Melle,Meints,Mechem,Mealer,Mcwilliam,Mcwhite,Mcquiggan,Mcphillips,Mcpartland,Mcnellis,Mcmackin,Mclaughin,Mckinny,Mckeithan,Mcguirk,Mcgillivray,Mcgarr,Mcgahee,Mcfaul,Mcfadin,Mceuen,Mccullah,Mcconico,Mcclaren,Mccaul,Mccalley,Mccalister,Mazer,Mayson,Mayhan,Maugeri,Mauger,Mattix,Mattews,Maslowski,Masek,Martir,Marsch,Marquess,Maron,Markwell,Markow,Marinaro,Marietta,Marcinek,Manner,Mannella,Mango,Mallen,Majeed,Mahnke,Mahabir,Magby,Magallan,Madere,Machnik,Lybrand,Luque,Lundholm,Lueders,Lucian,Lubinski,Lowy,Loew,Lippard,Linson,Lindblad,Lightcap,Levitsky,Levens,Leonardi,Lenton,Lengyel,Leng,Leitzel,Leicht,Leaver,Laubscher,Lashua,Larusso,Larrimore,Lanterman,Lanni,Lanasa,Lamoureaux,Lambros,Lamborn,Lamberti,Lall,Lagos,Lafuente,Laferriere,Laconte,Kyger,Kupiec,Kunzman,Kuehne,Kuder,Kubat,Krogh,Kreidler,Krawiec,Krauth,Kratky,Kottwitz,Korb,Kono,Kolman,Kolesar,Koeppel,Knapper,Klingenberg,Kjos,Keppel,Kennan,Keltz,Kealoha,Kasel,Karney,Kanne,Kamrowski,Kagawa,Joo,Johnosn,Joesph,Jilek,Jarvie,Jarret,Jansky,Jacquemin,Jacox,Jacome,Italiano,Iriarte,Ingwersen,Imboden,Iglesia,Huyser,Hurston,Hursh,Huntoon,Hudman,Hoying,Horsman,Horrigan,Hornbaker,Horiuchi,Hopewell,Hoop,Hommel,Homeyer,Holzinger,Holmer,Hollow,Hipsher,Hinchman,Hilts,Higginbottom,Hieb,Heyne,Hessling,Hesler,Hertlein,Herford,Heras,Henricksen,Hennemann,Henery,Hendershott,Hemstreet,Heiney,Heckert,Heatley,Hazell,Hazan,Hayashida,Hausler,Hartsoe,Harth,Harriott,Harriger,Harpin,Hardisty,Hardge,Hao,Hannaman,Hannahs,Hamp,Hammersmith,Hamiton,Halsell,Halderman,Hagge,Habel,Gusler,Gushiken,Gurr,Gummer,Gullick,Grunden,Grosch,Greenburg,Greb,Greaver,Gratz,Grajales,Gourlay,Gotto,Gorley,Goodpasture,Godard,Glorioso,Gloor,Glascock,Gizzi,Giroir,Gibeault,Gauldin,Gauer,Gartin,Garrels,Gamber,Gallogly,Galley,Gade,Fusaro,Fripp,Freyer,Freiberg,Franzoni,Fragale,Foston,Forti,Forness,Folts,Followell,Foard,Flom,Fling,Flett,Fleitas,Flamm,Fino,Finnen,Finchum,Filippelli,Fickel,Feucht,Feiler,Feenstra,Feagins,Faver,Faux,Faulkenberry,Farabaugh,Fandel,Fallen,Faler,Faivre,Fairey,Facey,Exner,Evensen,Erion,Erben,Epting,Epping,Ephraim,Engberg,Elsen,Ellingwood,Ellen,Eisenmann,Eichman,Ehle,Edsall,Eagles,Durall,Dupler,Dunker,Dumlao,Duford,Duffie,Dudding,Dries,Doung,Dorantes,Donahoo,Domenick,Dollins,Dobles,Dipiazza,Dino,Dimeo,Diehm,Dicicco,Devin,Devenport,Desormeaux,Derrow,Depaolo,Denver,Denise,Demas,Delpriore,Delosantos,Dela,Degreenia,Degenhardt,Defrancesco,Defenbaugh,Deets,Debonis,Deary,Dazey,Dargie,Dambrosia,Dalal,Dagen,Cun,Cuen,Crupi,Crossan,Crichlow,Creque,Coutts,Counce,Coram,Constante,Connon,Collelo,Coit,Cocklin,Coblentz,Cobey,Coard,Clutts,Clingan,Claw,Clampitt,Claeys,Ciulla,Cimini,Ciampa,Christon,Choat,Chiou,Chenail,Chavous,Catto,Catalfamo,Casterline,Cassinelli,Caspers,Carroway,Carlen,Carithers,Cappel,Calo,Callow,Calandra,Cagley,Cafferty,Byun,Byam,Buttner,Buth,Burtenshaw,Burget,Burfield,Buresh,Bunt,Bultman,Bulow,Buchta,Buchmann,Brunett,Bruemmer,Brueggeman,Britto,Briney,Brimhall,Bribiesca,Bresler,Brazan,Brashier,Brar,Brandstetter,Brandi,Boze,Boonstra,Bluitt,Blomgren,Blattner,Blasi,Bladen,Bitterman,Bilby,Bierce,Biello,Bettes,Bertone,Berrey,Bernat,Berberich,Benshoof,Bendickson,Below,Bellefeuille,Bednarski,Beddingfield,Beckerman,Beaston,Bavaro,Batalla,Basye,Baskins,Bartolotta,Bartkowski,Barranco,Barkett,Band,Banaszak,Bame,Bamberger,Balsley,Ballas,Balicki,Balding,Bald,Badura,Aymond,Aylor,Aylesworth,Axley,Axelrod,Aubert,Armond,Ariza,Apicella,Anstine,Ankrom,Angevine,Anger,Andreotti,Andrea,Alto,Alspaugh,Alpaugh,Almada,Allinder,Alexandra,Alequin,Alan,Aguillard,Agron,Agena,Afanador,Ackerley,Abrev,Abdalla,Aaronson,Zynda,Zucco,Zipp,Zetina,Zenz,Zelinski,Youngren,Yochum,Yearsley,Yankey,Woodfork,Wohlwend,Woelfel,Wiste,Wismer,Winzer,Winker,Wilkison,Wigger,Wierenga,Whipps,Wheeling,Westray,Wesch,Weld,Weible,Wedell,Weddell,Wawrzyniak,Wasko,Washinton,Wantz,Walts,Wallander,Wain,Wahlen,Wachowiak,Voshell,Viteri,Vire,Villafuerte,Vieyra,Viau,Vescio,Verrier,Verhey,Vause,Vandermolen,Vanderhorst,Valois,Valla,Valcourt,Vacek,Uzzle,Umland,Um,Ulman,Ulland,Turvey,Tuley,Trembath,Trees,Trabert,Towsend,Totman,Toews,Toby,Tito,Tisch,Tisby,Tipping,Tierce,Thivierge,Tenenbaum,Teagle,Tacy,Tabler,Szewczyk,Swearngin,Suire,Sturrock,Stubbe,Stronach,Stoute,Stoudemire,Stoneberg,Sterba,Stejskal,Steier,Stehr,Steckler,Steckel,Stearman,Steakley,Star,Stanforth,Stancill,Stalls,Srour,Sprowl,Spevak,Sole,Sokoloff,Soderman,Snover,Sleeman,Slaubaugh,Sitzman,Simpler,Simmer,Simes,Siegal,Sidoti,Sidler,Sider,Sidener,Siddiqi,Shireman,Shima,Sheroan,Shadduck,Seyal,Sentell,Sennett,Senko,Seneca,Sen,Seligman,Seipel,Seekins,Seabaugh,Scouten,Schweinsberg,Schwartzberg,Schurr,Schult,Schrick,Schoening,Schmitmeyer,Schlicher,Schlager,Schack,Schaar,Scavuzzo,Scarpa,Sassano,Santigo,Sandavol,San,Sampsel,Samms,Samet,Salzano,Salyards,Salva,Saidi,Sabir,Saam,Saab,Runions,Rundquist,Rousselle,Round,Rotunno,Roses,Rosch,Romney,Rohner,Roff,Rockhill,Rockefeller,Rocamora,Rm,Ringle,Riggie,Ricklefs,Rexroat,Reves,Revel,Reuss,Reta,Repka,Rentfro,Reineke,Recore,Recalde,Rease,Rawling,Ravencraft,Ravelo,Rappa,Randol,Ramsier,Ramerez,Rahimi,Rahim,Radney,Racey,Raborn,Rabalais,Quebedeaux,Pujol,Puchalski,Prothro,Proffit,Prigge,Prideaux,Prevo,Portales,Porco,Popovic,Popek,Popejoy,Pompei,Plumber,Plude,Platner,Plate,Pizzuto,Pizer,Pistone,Piller,Pierri,Piehl,Pickert,Piasecki,Phong,Philipp,Peugh,Pesqueira,Perrett,Perfetti,Percell,Penhollow,Pelto,Pellett,Pavlak,Paulo,Paula,Patricia,Pastorius,Parsell,Parrales,Pareja,Parcell,Pappan,Pajak,Owusu,Ovitt,Ory,Orrick,Oniell,Olliff,Olberding,Oesterling,Odwyer,Ocegueda,Obey,Obermiller,Nylander,Nulph,Nottage,Northam,Norgard,Nodal,Niel,Nicols,Newhard,Nellum,Neira,Nazzaro,Nassif,Narducci,Nalbandian,Nails,Musil,Murga,Muraoka,Mumper,Mulroy,Mountjoy,Mossey,Moreton,Morea,Montoro,Montesdeoca,Montealegre,Montanye,Montandon,Mok,Moisan,Mohl,Modesto,Modeste,Mitra,Mister,Minson,Minjarez,Milbourne,Michaelsen,Metheney,Mestre,Mescher,Mervis,Mennenga,Melgarejo,Meisinger,Meininger,Mcwaters,Mckern,Mckendree,Mchargue,Mcglothlen,Mcgibbon,Mcgavock,Mcduffee,Mcclurkin,Mccausland,Mccardell,Mccambridge,Mazzoni,Mayen,Maxton,Mawson,Mauffray,Mattinson,Mattila,Matsunaga,Mater,Mascia,Marse,Marotz,Marois,Markin,Markee,Marcinko,Marcin,Manville,Mantyla,Manser,Manry,Manderscheid,Mallari,Malia,Malecha,Malcomb,Majerus,Mailman,Macinnis,Mabey,Lyford,Luth,Lupercio,Luhman,Luedke,Lovick,Lossing,Loss,Lorraine,Lookabaugh,Longway,Lone,Loisel,Logiudice,Loffredo,Locust,Lobe,Lobaugh,Lizaola,Livers,Littlepage,Linnen,Limmer,Liebsch,Liebman,Leyden,Levitan,Levison,Levier,Leven,Levalley,Lettinga,Lessley,Lessig,Lepine,Leight,Leick,Leggio,Leffingwell,Leffert,Lefevers,Ledlow,Leaton,Leander,Leaming,Lazos,Laviolette,Lauffer,Latz,Lasorsa,Lasch,Larin,Laporta,Lanter,Langstaff,Landi,Lamica,Lambson,Lambe,Lamarca,Laman,Lamagna,Lajeunesse,Lafontant,Lafler,Labrum,Laakso,Kush,Kuether,Kuchar,Kruk,Kroner,Kroh,Kridler,Kreuzer,Kovats,Koprowski,Kohout,Knicely,Knell,Klutts,Kindrick,Kiddy,Khanna,Ketcher,Kerschner,Kerfien,Kensey,Kenley,Kenan,Kemplin,Kellerhouse,Keesling,Keep,Keena,Keas,Kaplin,Kanady,Kampen,Jutras,Jungers,Julio,Jeschke,Jen,Janowski,Janas,Iskra,Imperato,Ikerd,Igoe,Hyneman,Hynek,Husain,Hurrell,Hultquist,Hullett,Hulen,Huf,Huberty,Hoyte,Hossain,Hornstein,Hori,Hopton,Holms,Hollmann,Holdman,Holdeman,Holben,Hoffert,Himel,Hillsman,Hillary,Herdt,Hellyer,Hellen,Heister,Heimer,Heidecker,Hedgpeth,Hedgepath,Hebel,Heatwole,Hayer,Hausner,Haskew,Haselden,Hartranft,Harsch,Harres,Harps,Hardimon,Halm,Hallee,Hallahan,Hackley,Hackenberg,Hachey,Haapala,Guynes,Gunnerson,Gunby,Gulotta,Gudger,Groman,Grignon,Griebel,Gregori,Greenan,Grauer,Gourd,Gorin,Gorgone,Gooslin,Goold,Goltz,Goldberger,Gobble,Glotfelty,Glassford,Glance,Gladwin,Giuffre,Gilpatrick,Germaine,Gerdts,Genna,Geisel,Gayler,Gaunce,Gaulding,Gateley,Gassman,Gash,Garson,Garron,Garand,Gangestad,Gallow,Galbo,Gabrielli,Fullington,Fucci,Frum,Frieden,Friberg,Frasco,Francese,Fowle,Foucher,Fothergill,Foraker,Fonder,Foisy,Fogal,Flurry,Flenniken,Fitzhenry,Fishbein,Finton,Filmore,Filice,Feola,Felberbaum,Fausnaught,Fasciano,Farrah,Farquharson,Faires,Estridge,Essman,Enz,Enriques,Emmick,Ekker,Ekdahl,Eisman,Eggleton,Eddinger,Eakle,Eagar,Durio,Dunwoody,Duhaime,Duenes,Duden,Dudas,Dresher,Dresel,Doutt,Donlan,Donathan,Domke,Dobrowolski,Dingee,Dimmitt,Dimery,Dilullo,Deveaux,Devalle,Desper,Desnoyers,Desautels,Derouin,Derbyshire,Denmon,Dena,Demski,Delucca,Delpino,Delmont,Deller,Dejulio,Deibler,Dehne,Deharo,Degner,Defore,Deerman,Decuir,Deckman,Deasy,Dease,Deaner,Dawdy,Daughdrill,Darrigo,Darity,Daniele,Dalbey,Dagenhart,Daffron,Curro,Curnutte,Curatolo,Cruikshank,Crosswell,Croslin,Croney,Crofton,Criado,Crecelius,Coscia,Conniff,Commodore,Coltharp,Colonna,Collyer,Collington,Cobbley,Coache,Clonts,Cloe,Cliett,Clemans,Clara,Cid,Christo,Chrisp,China,Chiarini,Chia,Cheatam,Cheadle,Che,Chauncey,Chand,Chadd,Cervera,Cerulli,Cerezo,Cedano,Cayetano,Cawthorne,Cavalieri,Cattaneo,Caryl,Cartlidge,Carrithers,Carreira,Carranco,Cargle,Candanoza,Camille,Camburn,Calender,Calderin,Calcagno,Cahn,Cadden,Byham,Buttry,Burry,Burruel,Burkitt,Burgio,Burgener,Buescher,Buckalew,Brymer,Brumett,Brugnoli,Brugman,Brosnahan,Bronder,Broeckel,Broderson,Brisbon,Brinsfield,Brinks,Bresee,Bregman,Branner,Brambila,Brailsford,Bouska,Boster,Borucki,Bortner,Boroughs,Borgeson,Bonier,Bomba,Bolender,Boesch,Boeke,Bloyd,Bley,Binger,Billing,Bilbro,Biery,Bichrest,Bezio,Bevel,Berrett,Bermeo,Bergdoll,Bercier,Benzel,Bentler,Bennetts,Belnap,Bellini,Beitz,Behrend,Bednarczyk,Bearse,Batman,Bartolini,Bartol,Barretta,Barbero,Barbaro,Banvelos,Bankes,Ballengee,Baldon,Aye,Ausmus,Atilano,Atienza,Aschenbrenner,Arora,Armstong,Aquilino,Appleberry,Applebee,Apolinar,Antos,Angles,Andrepont,Ancona,Amesquita,Alvino,Altschuler,Allin,Alire,Ainslie,Agular,Aeschliman,Accetta,Abdulla,Abbe,Zwart,Zufelt,Zona,Zirbel,Zingaro,Zilnicki,Zenteno,Zent,Zemke,Zayac,Zarrella,Yoshimoto,Yearout,Wrench,World,Womer,Woltman,Wolin,Wolery,Woldt,Witts,Wittner,Witherow,Winward,Winrow,Wiemann,Wichmann,Whitwell,Whitelaw,Wheeless,Whalley,Wey,Wessner,Wenzl,Wene,Weatherbee,Waye,Wattles,Wanke,Walkes,Waldeck,Vonruden,Voisine,Vogus,Vittetoe,Villalva,Villacis,Victorian,Verge,Venturini,Venturi,Venson,Vanloan,Vanhooser,Vanduzer,Vandever,Vanderwal,Vanderheyden,Vanbeek,Vanbebber,Vallance,Vales,Vahle,Urbain,Upshur,Umfleet,Twist,Tsuji,Trybus,Triolo,Trimarchi,Trezza,Trenholm,Tovey,Tourigny,Torry,Torrain,Torgeson,Tongue,Tomey,Tischler,Tinkler,Tinder,Ticknor,Tibbles,Tibbals,Throneberry,Thormahlen,Thibert,Thibeaux,Theurer,Templet,Tegeler,Tavernier,Taubman,Tamashiro,Tallon,Tallarico,Taboada,Sypher,Sybert,Swyers,Switalski,Swinger,Swedberg,Suther,Surprenant,Sullen,Sulik,Sugden,Suder,Suchan,Such,Strube,Stroope,Strittmatter,Streett,Straughn,Strasburg,Stjacques,Stimage,Stimac,Stifter,Stgelais,Steinhart,Stehlik,Steffenson,Steenbergen,Stanbery,Stallone,Sprung,Spraggs,Spoto,Spilman,Speno,Spanbauer,Spalla,Spagnolo,Soliman,Solan,Sobolik,Snelgrove,Snedden,Smale,Sliter,Slankard,Sircy,Signor,Shutter,Shurtliff,Shur,Show,Shirkey,Shi,Shewmake,Shams,Shadley,Shaddox,Sgro,Serfass,Seppala,Segawa,Segalla,Seaberry,Scruton,Scism,Schwein,Schwartzman,Schwantes,Schomer,Schoenborn,Schlottmann,Schissler,Scheurer,Schepis,Scheidegger,Saunier,Sauders,Sassman,Sannicolas,Sanderfur,Salser,Sagar,Saffer,Saeed,Sadberry,Saban,Ryce,Rybak,Rux,Rumore,Rummell,Rummage,Rudasill,Rozman,Rota,Rossin,Rosell,Rosel,Romberg,Rojero,Rochin,Rochell,Robideau,Robarge,Roath,Risko,Ringel,Ringdahl,Riera,Riemann,Ribas,Revard,Renna,Renegar,Reinwald,Rehman,Regal,Reels,Ree,Redel,Reasons,Raysor,Rathke,Rapozo,Rampton,Ramaker,Rakow,Raia,Radin,Raco,Rackham,Racca,Racanelli,Rabun,Quaranta,Purves,Pundt,Protsman,Prosper,Prezioso,Presutti,President,Presgraves,Poydras,Portnoy,Portalatin,Pop,Pontes,Poehler,Poblete,Poat,Plumadore,Pleiman,Pizana,Piscopo,Piraino,Pinelli,Pillai,Picken,Picha,Piccoli,Philen,Petteway,Petros,Peskin,Perugini,Perrella,Pernice,Peper,Pensinger,Pembleton,Patron,Passman,Parrent,Panetta,Pancake,Pallas,Palka,Pais,Paglia,Padmore,Oum,Ottesen,Ost,Oser,Ortmann,Ormand,Oriol,Orick,Oler,Okafor,Ohair,Obert,Oberholtzer,Number,Nowland,Nosek,Nordeen,Nolf,Nogle,Nobriga,Nicley,Niccum,Newingham,Neumeister,Neugebauer,Netherland,Nerney,Neiss,Neis,Neider,Neeld,Nailor,Mustain,Mussman,Musante,Murton,Murden,Munyon,Muldrew,Motton,Moscoso,Moschella,Moroz,Mormon,Morelos,Morace,Moone,Montesano,Montemurro,Montas,Montalbo,Molander,Mleczko,Miyake,Mitschke,Minger,Minelli,Minear,Millener,Mihelich,Miedema,Miah,Metzer,Mery,Merrigan,Merck,Mennella,Membreno,Melecio,Melder,Mehling,Mehler,Medcalf,Meche,Mealing,Mcqueeney,Mcphaul,Mcmickle,Mcmeen,Mcmains,Mclees,Mcgowin,Mcfarlain,Mcdivitt,Mccotter,Mcconn,Mcclane,Mccaster,Mcbay,Mcbath,Mayoral,Mayeux,Matsuo,Masur,Massman,Marzette,Martensen,Marlett,Markie,Markgraf,Marcinkowski,Marchbanks,Marcella,Mansir,Mandez,Mancil,Malagon,Magnani,Madonia,Madill,Madia,Mackiewicz,Macgillivray,Macdowell,Macbeth,Mabee,Lundblad,Lovvorn,Lovings,Loreto,Linz,Linwood,Linnell,Linebaugh,Lindstedt,Lindbloom,Linda,Limberg,Liebig,Lickteig,Lichtenberg,Licari,Lex,Lewison,Levario,Levar,Lepper,Lenzen,Lenderman,Lemarr,Leinen,Leider,Legrande,Lefort,Lebleu,Leask,Learn,Leacock,Lazano,Lawalin,Laven,Laplaca,Lant,Langsam,Langone,Landress,Landen,Lande,Lamorte,Lairsey,Laidlaw,Laffin,Lackner,Lacaze,Labuda,Labree,Labella,Labar,Kyer,Kuyper,Kulinski,Kulig,Kuhnert,Kuchera,Kubicek,Kruckeberg,Kruchten,Krider,Kotch,Kornfeld,Koren,Koogler,Koll,Kole,Kohnke,Kohli,Kofoed,Koelling,Kluth,Klump,Klopfenstein,Klippel,Klinge,Klett,Klemp,Kleis,Klann,Kitzman,Kinnan,Kingsberry,Kind,Kina,Kilmon,Killpack,Kilbane,Kijowski,Kies,Kierstead,Kettering,Kesselman,Kenton,Kennington,Keniston,Kehrer,Kearl,Keala,Kassa,Kasahara,Kantz,Kalin,Kaina,Jupin,Juntunen,Juares,Joynes,Jovel,Joos,Jn,Jiggetts,Jervis,Jerabek,Jennison,Jaso,Janz,Izatt,Ishibashi,Iannotti,Hymas,Huneke,Hulet,Hougen,Horvat,Horstmann,Hopple,Holtkamp,Holsten,Hohenstein,Hoefle,Hoback,Hiney,Hiemstra,Herwig,Herter,Herriott,Hermsen,Herdman,Herder,Herbig,Hem,Helper,Helling,Helbig,Heitkamp,Heinrichs,Heinecke,Heileman,Heffley,Heavrin,Heaston,Haymaker,Hauenstein,Hartlage,Harlin,Harig,Hardenbrook,Hankin,Hamiter,Hagens,Hagel,Grizzell,Griest,Griese,Grief,Grennan,Graden,Gosse,Gorder,Goldin,Goatley,Gillespi,Gilbride,Giel,Gianni,Ghoston,Getter,Gershman,Geisinger,Gehringer,Gedeon,Gebert,Gaxiola,Gawronski,Gau,Gathright,Gatchell,Gargiulo,Garg,Galang,Gadison,Fyock,Furniss,Furby,Funnell,Frizell,Frenkel,Freeburg,Frankhouser,Franchi,Foulger,Formby,Forkey,Fonte,Folson,Follette,Flicker,Flavors,Flavell,Finegan,Fill,Filippini,Ferencz,Ference,Fennessey,Feggins,Feehan,Fazzino,Fazenbaker,Fausto,Faunce,Farraj,Farnell,Farler,Farabee,Falkowski,Facio,Etzler,Ethington,Esterline,Esper,Esker,Erxleben,Ericsson,Erick,Engh,Emling,Elridge,Ellenwood,Elfrink,Ekhoff,Eisert,Eis,Eifert,Eichenlaub,Egnor,Eggebrecht,Edlin,Edberg,Eble,Eber,Easler,Duwe,Dutta,Dutremble,Dusseault,Durney,Dunworth,Dumire,Dukeman,Dufner,Duey,Duble,Dreese,Dozal,Douville,Dougal,Doom,Done,Diver,Ditmore,Distin,Dimuzio,Dildine,Dignan,Dieterich,Dieckman,Didonna,Dhillon,Dezern,Devereux,Devall,Detty,Detamore,Derksen,Deremer,Deras,Denslow,Deno,Denicola,Denbow,Demma,Demille,Delisa,Delira,Delawder,Delara,Delahanty,Dejonge,Deininger,Dedios,Dederick,Decelles,Debus,Debruyn,Deborde,Deak,Dauenhauer,Darsey,Daring,Dansie,Dalman,Dakin,Dagley,Czaja,Cybart,Cutchin,Currington,Curbelo,Croucher,Crinklaw,Cremin,Cratty,Cranfield,Crafford,Cowher,Cowboy,Couvillion,Couturier,Counter,Corter,Coombes,Contos,Consolini,Connaughton,Conely,Coltrane,Collom,Cockett,Clepper,Cleavenger,Claro,Clarkin,Ciriaco,Ciesla,Cichon,Ciancio,Cianci,Chynoweth,Chuang,Chrzanowski,Christion,Cholewa,Chipley,Chilcott,Cheyne,Cheslock,Chenevert,Cheers,Charlot,Chagolla,Chabolla,Cesena,Cerutti,Cava,Caul,Cassone,Cassin,Cassese,Casaus,Casali,Cartledge,Carsten,Cardamone,Carcia,Carbonneau,Carboni,Carabello,Capozzoli,Capella,Cap,Cannata,Campoverde,Campeau,Cambre,Camberos,Calvery,Calnan,Calmes,Calley,Callery,Calise,Cacciotti,Cacciatore,Butterbaugh,Burgo,Burgamy,Burell,Bunde,Bumbalough,Buel,Buechner,Buchannon,Bryon,Brunn,Brost,Broadfoot,Brittan,Brevard,Breda,Brazel,Brayboy,Brasier,Boyea,Boxx,Both,Boso,Bosio,Boruff,Borda,Bongiovanni,Bolerjack,Boedeker,Blye,Blumstein,Blumenfeld,Blinn,Bleakley,Blatter,Blan,Bjornson,Bisignano,Billick,Bieniek,Bhatti,Bevacqua,Betterton,Berra,Berenbaum,Bensinger,Bennefield,Belvins,Belson,Bellin,Beighley,Beecroft,Beaudreau,Baynard,Bautch,Bausch,Basch,Bartleson,Barthelemy,Barak,Balzano,Balistreri,Bailer,Bagnall,Bagg,Bae,Auston,Augustyn,Aslinger,Ashalintubbi,Artist,Arjona,Arebalo,Arab,Appelbaum,Anna,Angst,Angert,Angelucci,Andry,Andersson,Amorim,Amavisca,Alward,Alvelo,Alvear,Alumbaugh,Alsobrook,Alli,Allgeier,Allende,Aldrete,Akiyama,Ahlquist,Adolphson,Addario,Acoff,Abelson,Abasta,Zulauf,Zirkind,Zeoli,Zemlicka,Zawislak,Zappia,Zanella,Yelvington,Yeatman,Yanni,Wragg,Wissing,Wischmeier,Wirta,Wiren,Wilmouth,Williard,Willert,Willaert,Wildt,Whelpley,Westwood,Weingart,Weidenbach,Weidemann,Weatherman,Weakland,Watwood,Wattley,Waterson,Wambach,Walzer,Waldow,Waag,Vorpahl,Volkmann,Vitolo,Visitacion,Vincelette,Vina,Viggiano,Vieth,Vidana,Vert,Verna,Verges,Verdejo,Venzon,Velardi,Varian,Vargus,Vandermeulen,Vandam,Vanasse,Vanaman,Utzinger,Uriostegui,Uplinger,Twiss,Tumlinson,Tschanz,Trunnell,Troung,Troublefield,Trojacek,Trial,Treloar,Tranmer,Touchton,Torsiello,Torina,Tootle,Toki,Toepfer,Tippin,Tippie,Thronson,Thomes,Tezeno,Texada,Testani,Tessmer,Terrel,Terra,Terlizzi,Tempel,Temblador,Tayler,Tawil,Tasch,Tames,Talor,Talerico,Swinderman,Sweetland,Swager,Sulser,Sullens,Subia,Sturgell,Stumpff,Stufflebeam,Stucki,Strohmeyer,Strebel,Straughan,Strackbein,Stobaugh,Stetz,Stelter,Steinmann,Steinfeld,Stefani,Stecher,Stanwood,Stanislawski,Stander,Speziale,Soppe,Soni,Sol,Sobotka,Snipe,Smuin,Slider,Slee,Skerrett,Sjoberg,Sittig,Simonelli,Simo,Sima,Silvio,Silverio,Silveria,Silsby,Sillman,Sienkiewicz,Sick,Sia,Shomo,Shoff,Shoener,Shiba,Sherfey,Shehane,Shawl,Sexson,Setton,Sergi,Selvy,Seiders,Seegmiller,Sebree,Seabury,Scroggin,Sconyers,Schwalb,Schurg,Schulenberg,Schuld,Schrage,Schow,Schon,Schnur,Schneller,Schmidtke,Schlatter,Schieffer,Schenkel,Scheeler,Schauwecker,Schartz,Schacherer,Scafe,Sayegh,Savidge,Saur,Sarles,Sarkissian,Sarkis,Sarcone,Sagucio,Saffell,Saenger,Sacher,Rylee,Ruvolo,Ruston,Ruple,Rulison,Ruge,Ruffo,Ruehl,Rueckert,Rudman,Rudie,Rubert,Rozeboom,Roysden,Roylance,Rothchild,Rosse,Rosecrans,Rodrick,Rodi,Rockmore,Robnett,Roberti,Rivett,Riva,Ritzel,Rierson,Ricotta,Ricken,Rezac,Rendell,Remo,Reitman,Reindl,Reeb,Reddic,Reddell,Rebuck,Reali,Raye,Raso,Ramthun,Ramsden,Rameau,Ralphs,Rak,Rago,Racz,Quinteros,Quinter,Quinley,Quiggle,Quaid,Purvines,Purinton,Purdum,Pummill,Puglia,Puett,Ptacek,Przybyla,Prowse,Providence,Prestwich,Pracht,Poutre,Poucher,Portera,Polinsky,Poage,Platts,Pineau,Pinckard,Pilson,Pilling,Pilkins,Pili,Pikes,Pigram,Pietila,Pickron,Pia,Philippi,Philhower,Pflueger,Pfalzgraf,Pettibone,Pett,Petrosino,Persing,Perrino,Perotti,Periera,Peri,Peredo,Peralto,Pennywell,Pennel,Pen,Pellegren,Pella,Pedroso,Paulos,Paulding,Pates,Pasek,Paramo,Paolino,Panganiban,Paneto,Paluch,Ozaki,Ownbey,Overfelt,Outman,Opper,Onstad,Oland,Okuda,Oertel,Oelke,Normandeau,Nordby,Nordahl,Noecker,Noblin,No,Niswonger,Nishioka,Nett,Nephew,Negley,Needles,Nedeau,Natera,Nachman,Naas,Musich,Mungin,Mourer,Mounsey,Mottola,Mothershed,Moskal,Mosbey,Morini,Moreles,Mood,Montaluo,Moneypenny,Monda,Moench,Moates,Moad,Mixer,Missildine,Misiewicz,Mirabella,Minott,Minnifield,Mincks,Milum,Milani,Mikelson,Mestayer,Mess,Mertes,Merrihew,Merlos,Meritt,Melnyk,Medlen,Meder,Mean,Mcvea,Mcquarrie,Mcquain,Mclucas,Mclester,Mckitrick,Mckennon,Mcinnes,Mcgrory,Mcgranahan,Mcglamery,Mcgivney,Mcgilvray,Mccuiston,Mccuin,Mccrystal,Mccolley,Mcclerkin,Mcclenon,Mccamey,Mcaninch,Mazariegos,Maynez,Mattioli,Mastronardi,Masone,Marzett,Marsland,Mari,Margulies,Margolin,Malatesta,Malachi,Mainer,Maietta,Magrath,Maese,Madkins,Madeiros,Madamba,Mackson,Mac,Maben,Lytch,Lundgreen,Lumb,Lukach,Luick,Luetkemeyer,Luechtefeld,Ludy,Ludden,Luckow,Lubinsky,Lowes,Lout,Lorenson,Loran,Lopinto,Looby,Lones,Livsey,Liskey,Lisby,Lintner,Lindow,Lindblom,Liming,Liechty,Leth,Lesniewski,Lenig,Lemonds,Leisy,Lehrer,Lehnen,Lehmkuhl,Leeth,Leer,Leeks,Lechler,Lebsock,Lavere,Lautenschlage,Laughridge,Lauderback,Laudenslager,Lassonde,Laroque,Laramee,Laracuente,Lapeyrouse,Lampron,Lamers,Lamer,Laino,Lague,Laguardia,Lafromboise,Lafata,Lacount,Lachowicz,Kysar,Kwiecien,Kuffel,Kueter,Kronenberg,Kristensen,Kristek,Krings,Kriesel,Krey,Krebbs,Kreamer,Krabbe,Kossman,Kosakowski,Kosak,Kopacz,Konkol,Koepsell,Koening,Koen,Knerr,Knapik,Kluttz,Klocke,Klenk,Klemme,Klapp,Kitchell,Kita,Kissane,Kirkbride,Kirchhoff,Kinter,Kinsel,Kingsland,Kimmer,Kimler,Killoran,Kieser,Khalsa,Khalaf,Kettel,Kerekes,Keplin,Kentner,Kennebrew,Kenison,Kellough,Kellman,Keatts,Keasey,Kauppi,Katon,Kari,Kanner,Kampa,Kall,Kai,Kaczorowski,Kaczmarski,Juarbe,Jordison,Jonathan,Jobst,Jezierski,Jeanbart,Jarquin,Janey,Jagodzinski,Ishak,Isett,Isa,Infantino,Imburgia,Illingworth,Hysmith,Hynson,Hydrick,Hurla,Hunton,Hunnell,Humbertson,Housand,Hottle,Hosch,Hoos,Honn,Hohlt,Hodel,Hochmuth,Hixenbaugh,Hislop,Hisaw,Hintzen,Hilgendorf,Hilchey,Higgens,Hersman,Herrara,Hendrixson,Hendriks,Hemond,Hemmingway,Heminger,Helgren,Heisey,Heilmann,Hehn,Hegna,Heffern,Hawrylak,Haverty,Hauger,Haslem,Harnett,Harb,Happ,Hanzlik,Hanway,Hanby,Hanan,Hamric,Hammaker,Halas,Hagenbuch,Hacking,Habeck,Gwozdz,Gutter,Gunia,Guise,Guadarrama,Grubaugh,Grivas,Griffieth,Grieb,Grewell,Gregorich,Grazier,Graeber,Graciano,Gowens,Goodpaster,Gondek,Gohr,Goffney,Godbee,Gitlin,Gisler,Gin,Gillyard,Gillooly,Gilchrest,Gilbo,Gierlach,Giebler,Giang,Geske,Gervasio,Gertner,Gehling,Geeter,Gaus,Gattison,Gatica,Gathings,Gath,Gassner,Gassert,Garabedian,Gamon,Gameros,Galban,Gabourel,Gaal,Fuoco,Fullenwider,Fudala,Friscia,Franceschini,Foronda,Fontanilla,Florey,Florentino,Flore,Flegle,Flecha,Fisler,Fischbach,Fiorita,Fines,Figura,Figgins,Fichera,Fester,Ferra,Fear,Fawley,Fawbush,Fausett,Farnes,Farago,Fairclough,Fahie,Fabiani,Everest,Evanson,Eutsey,Eshbaugh,Esh,Ertle,Eppley,Englehardt,Engelhard,Emswiler,Elza,Elling,Elderkin,Eland,Efaw,Edstrom,Edmund,Edgemon,Ecton,Echeverri,Ebright,Earheart,Dynes,Dygert,Dyches,Dulmage,Duhn,Duhamel,Dues,Dubrey,Dubray,Dubbs,Drone,Drey,Drewery,Dreier,Dorval,Dorough,Dorais,Donlin,Donatelli,Doke,Dohm,Doetsch,Dobek,Ditty,Disbrow,Ding,Dinardi,Dillahunty,Dillahunt,Diers,Dier,Diekmann,Diangelo,Deskin,Deschaine,Depaoli,Denner,Demyan,Demont,Demaray,Delillo,Deleeuw,Deibel,Decato,Deblasio,Debartolo,Daubenspeck,Darner,Dardon,Danziger,Danials,Damewood,Dalpiaz,Dallman,Dallaire,Cunniffe,Cumpston,Cumbo,Cubero,Cruzan,Cronkhite,Critelli,Crimi,Creegan,Crean,Craycraft,Crater,Cranfill,Coyt,Courchesne,Coufal,Corradino,Corprew,Colville,Cocco,Coby,Clinch,Clickner,Clavette,Claggett,Cirigliano,Ciesielski,Christain,Chesbro,Chavera,Chard,Casteneda,Castanedo,Cast,Casseus,Casa,Caruana,Carnero,Cappelli,Capellan,Canedy,Cancro,Camilleri,Calero,Cada,Burghart,Burbidge,Bulfer,Buis,Budniewski,Bucko,Bruney,Brugh,Brossard,Brodmerkel,Brockmann,Bring,Brigmond,Briere,Bremmer,Breck,Breau,Brautigam,Brasch,Brandenberger,Bran,Bragan,Bozell,Bowsher,Bosh,Borgia,Borey,Boomhower,Bonneville,Bonam,Bolland,Boise,Boeve,Boettger,Boersma,Boateng,Bliven,Blazier,Blanca,Blahnik,Bjornstad,Bitton,Biss,Birkett,Billingsly,Biagioni,Bettle,Bertucci,Bertolino,Bermea,Bergner,Berber,Bensley,Bendixen,Beltrami,Bellone,Belland,Bein,Behringer,Begum,Beans,Bayona,Batiz,Bassin,Baskette,Bartolomeo,Bartolo,Bartholow,Barkan,Barish,Barett,Bardo,Bamburg,Ballerini,Balla,Balis,Bakley,Bailon,Bachicha,Babiarz,Ayars,Axton,Axel,Awong,Awe,Awalt,Auslander,Ausherman,Aumick,Athens,Atha,Atchinson,Aslett,Askren,Arrowsmith,Arras,Arnhold,Armagost,Arey,Arcos,Archibeque,Antunes,Antilla,Ann,Andras,Amyx,Amison,Amero,Alzate,Alphonse,Alper,Aller,Alioto,Alexandria,Aigner,Agtarap,Agbayani,Adami,Achorn,Aceuedo,Acedo,Abundis,Aber,Abee,Zuccaro,Ziglar,Zier,Ziebell,Zieba,Zamzow,Zahl,Yurko,Yurick,Yonkers,Yerian,Yeaman,Yarman,Yann,Yahn,Yadon,Yadao,Woodbridge,Wolske,Wollenberg,Wojtczak,Wnuk,Witherite,Winther,Winick,Widell,Wickens,Whichard,Wheelis,Wesely,Wentzell,Wenthold,Wemple,Weisenburger,Wehling,Weger,Weaks,Water,Wassink,Warn,Walquist,Wadman,Wacaster,Waage,Voliva,Vlcek,Villafana,Vigliotti,Viger,Viernes,Viands,Vey,Veselka,Versteeg,Vero,Verhoeven,Vendetti,Velardo,Vatter,Vasconcellos,Varn,Vanwagner,Vanvoorhis,Vanhecke,Vanduyn,Vandervoort,Vanderslice,Valone,Vallier,Vails,Uvalle,Ursua,Urenda,Upright,Uphoff,Tustin,Turton,Turnbough,Turck,Tullio,Tuch,Truehart,Tropea,Troester,Trippe,Tricarico,Trevarthen,Trembly,Trace,Trabue,Traber,Toto,Tosi,Toal,Tinley,Tingler,Timoteo,Tiffin,Tien,Ticer,Thurgood,Thorman,Therriault,Theel,Tessman,Tekulve,Tejera,Tebbs,Tavernia,Tarpey,Tallmadge,Takemoto,Szot,Sylvest,Swindoll,Swearinger,Swantek,Swaner,Swainston,Susi,Surrette,Sur,Supple,Sullenger,Sudderth,Suddarth,Suckow,Strider,Strege,Stream,Strassburg,Stoval,Stotz,Stoneham,Stilley,Stille,Stierwalt,Stfleur,Steuck,Stermer,Stclaire,Stano,Staker,Stahler,Stablein,Srinivasan,Squillace,Sprvill,Sproull,Sprau,Sporer,Spore,Spittler,Speelman,Sparr,Sparkes,Spang,Spagnuolo,Sosinski,Sorto,Sorkin,Sondag,Sollers,Socia,Snarr,Smrekar,Smolka,Slyter,Slovinsky,Sliwa,Slavik,Slatter,Skiver,Skeem,Skala,Sitzes,Sitsler,Sitler,Sinko,Simser,Siegler,Sideris,Shrewsberry,Shoopman,Shoaff,Shira,Shindler,Shimmin,Shill,Shenkel,Shemwell,Shehorn,Severa,Sergio,Semones,Selsor,Seller,Sekulski,Segui,Sechrest,Scot,Schwer,Schwebach,Schur,Schmiesing,Schlick,Schlender,Schebler,Schear,Schapiro,Sauro,Saunder,Sauage,Satterly,Saraiva,Saracino,Saperstein,Sanmartin,Sanluis,Sandt,Sandrock,Sammet,Sama,Salk,Sakata,Saini,Sackrider,Rys,Russum,Russi,Russaw,Rozzell,Roza,Rowlette,Rothberg,Rossano,Rosebrock,Romanski,Romanik,Romani,Roma,Roiger,Roig,Roehr,Rodenberger,Rodela,Rod,Rochford,Ristow,Rispoli,Ripper,Rigo,Riesgo,Riebel,Ribera,Ribaudo,Rhoda,Reys,Resendes,Repine,Reisdorf,Reisch,Rebman,Rasmus,Raske,Ranum,Rames,Rambin,Raman,Rajewski,Raffield,Rady,Radich,Raatz,Quinnie,Pyper,Puthoff,Prow,Proehl,Pribyl,Pretti,Prete,Presby,Poyer,Powelson,Porteous,Poquette,Pooser,Pollan,Ploss,Plewa,Plants,Placide,Pion,Pinnick,Pinales,Pin,Pillot,Pille,Pilato,Piggee,Pietrowski,Piermarini,Pickford,Piccard,Phenix,Pevey,Petrowski,Petrillose,Pesek,Perrotti,Perfecto,Peppler,Peppard,Penfold,Pellitier,Pelland,Pehowic,Pedretti,Paules,Passero,Pasha,Panza,Pallante,Palau,Pakele,Pacetti,Paavola,Overy,Overson,Outler,Osegueda,Ord,Oplinger,Oldenkamp,Ok,Ohern,Oetting,Odums,Oba,Nowlen,Nowack,Nordlund,Noblett,Nobbe,Nierman,Nichelson,Niblock,Newbrough,Nest,Nemetz,Neeson,Needleman,Necessary,Navin,Nastasi,Naslund,Naramore,Nakken,Nakanishi,Najarro,Mushrush,Muma,Mulero,Morganfield,Moreman,Morain,Moquin,Montrose,Monterrosa,Monsivais,Monroig,Monje,Monfort,Moises,Moffa,Moeckel,Mobbs,Mitch,Misiak,Mires,Mirelez,Mineo,Mineau,Milnes,Mikeska,Michelin,Michalowski,Meszaros,Messineo,Meshell,Merten,Meola,Menton,Mends,Mende,Memmott,Melius,Mehan,Mcnickle,Mcmorran,Mclennon,Mcleish,Mclaine,Mckendry,Mckell,Mckeighan,Mcisaac,Mcie,Mcguinn,Mcgillis,Mcfatridge,Mcfarling,Mcelravy,Mcdonalds,Mcculla,Mcconnaughy,Mcconnaughey,Mcchriston,Mcbeath,Mayr,Matyas,Matthiesen,Matsuura,Matinez,Mathys,Matarazzo,Masker,Masden,Mascio,Martis,Marrinan,Marinucci,Margerum,Marengo,Manthe,Mansker,Manoogian,Mankey,Manigo,Manier,Mangini,Mandelbaum,Maltese,Malsam,Mallo,Maliszewski,Mainolfi,Maharaj,Maggart,Magar,Maffett,Macmaster,Macky,Macdonnell,Mable,Lyvers,Lyn,Luzzi,Lutman,Luk,Lover,Lovan,Lonzo,Longest,Longerbeam,Lofthouse,Loethen,Lodi,Llorens,Lizardo,Lizama,Liz,Litscher,Lisowski,Lipski,Lipsett,Lipkin,Linzey,Lineman,Limerick,Limb,Limas,Lige,Lierman,Liebold,Liberti,Leverton,Levene,Lesueur,Lenser,Lenker,Lemme,Legnon,Lefrancois,Ledwell,Lavecchia,Laurich,Lauricella,Latino,Lannigan,Landor,Lamprecht,Lamountain,Lamore,Lamonica,Lammert,Lamboy,Lamarque,Lamacchia,Lalley,Lagace,Lacorte,Lacomb,Kyllonen,Kyker,Kye,Kuschel,Kupfer,Kunde,Kucinski,Kubacki,Kuan,Kroenke,Krech,Koziel,Kovacich,Kothari,Koth,Kotek,Kostelnik,Kosloski,Knoles,Knabe,Kmiecik,Klingman,Kliethermes,Kleffman,Klees,Klaiber,Kittell,Kissling,Kisinger,Kintner,Kinoshita,Kiener,Khouri,Kerman,Kelii,Keirn,Keezer,Kaup,Kathan,Kaser,Karlsen,Kapur,Kandoll,Kammel,Kahele,Justesen,Jue,Jonason,Johnsrud,Joerling,Jochim,Jespersen,Jeong,Jenness,Jedlicka,Jakob,Isaman,Inghram,Ingenito,Imperial,Iadarola,Hynd,Huxtable,Huwe,Huron,Hurless,Humpal,Hughston,Hughart,Huggett,Hugar,Huether,Howdyshell,Houtchens,Houseworth,Hoskie,Holshouser,Holmen,Holloran,Hohler,Hoefler,Hodsdon,Hochman,Hjort,Hippert,Hippe,Hinzman,Hillock,Hilden,Hilde,Heyn,Heyden,Heyd,Hergert,Henrikson,Henningsen,Hendel,Helget,Helf,Helbing,Heintzman,Heggie,Hege,Hecox,Heatherington,Heare,Haxton,Haverstock,Haverly,Hatler,Haselton,Hase,Hartzfeld,Harten,Harken,Hargrow,Haran,Hanton,Hammar,Hamamoto,Halper,Halko,Hackathorn,Haberle,Haake,Gunnoe,Gunkel,Gulyas,Guiney,Guilbeau,Guider,Guerrant,Gudgel,Guarisco,Grossen,Grossberg,Gropp,Groome,Grobe,Gremminger,Greenley,Grauberger,Grabenstein,Gowers,Gostomski,Gosier,Goodenow,Gonzoles,Goliday,Goettle,Goens,Goates,Glymph,Glavin,Glassco,Gladys,Gladfelter,Glackin,Githens,Girgis,Gimpel,Gilbreth,Gilbeau,Giffen,Giannotti,Gholar,Gervasi,Gertsch,Gernatt,Gephardt,Genco,Gehr,Geddis,Gear,Gase,Garrott,Garrette,Gapinski,Ganter,Ganser,Gangi,Gangemi,Gang,Gallina,Galdi,Gailes,Gaetano,Gadomski,Gaccione,Fuschetto,Furtick,Furfaro,Fullman,Frutos,Fruchter,Frogge,Freytag,Freudenthal,Fregoe,Franzone,Frankum,Francia,Franceschi,Fraction,Forys,Forero,Folkers,Foil,Flug,Flitter,Flemons,Fitzer,Firpo,Finizio,Filiault,Figg,Fiddler,Fichtner,Fetterolf,Ferringer,Feil,Fayne,Farro,Faddis,Ezzo,Ezelle,Eynon,Evitt,Eutsler,Euell,Escovedo,Erne,Eriksson,Enriguez,Empson,Elkington,Elk,Eisenmenger,Eidt,Eichenberger,Ehrmann,Ediger,Earlywine,Eacret,Duzan,Dunnington,Duffer,Ducasse,Dubiel,Drovin,Drager,Drage,Donham,Donat,Dona,Dolinger,Dokken,Doepke,Dodwell,Docherty,Distasio,Disandro,Diniz,Digangi,Didion,Dezzutti,Devora,Detmer,Deshon,Derrigo,Dentler,Demoura,Demeter,Demeritt,Demayo,Demark,Demario,Delzell,Delnero,Delgrosso,Dejarnett,Debernardi,Dearmas,Dau,Dashnaw,Daris,Danks,Danker,Dangler,Daignault,Dafoe,Dace,Curet,Cumberledge,Culkin,Cuba,Crowner,Crocket,Crawshaw,Craun,Cranshaw,Cragle,Courser,Costella,Cornforth,Corkill,Cordy,Coopersmith,Conzemius,Connett,Connely,Condict,Condello,Concha,Comley,Colt,Collen,Cohoon,Coday,Clugston,Clowney,Clippard,Clinkenbeard,Clines,Clelland,Clause,Clapham,Clancey,Clabough,Cichy,Cicalese,Chuck,Chua,Chittick,Chisom,Chisley,Chino,Chinchilla,Cheramie,Cerritos,Cercone,Cena,Cawood,Cavness,Catanzarite,Casada,Carvell,Carp,Carmicheal,Carll,Cardozo,Caplin,Candia,Canby,Cammon,Callister,Calligan,Calkin,Caillouet,Buzzelli,Bute,Bustillo,Bursey,Burgeson,Bupp,Bulson,Bulls,Buist,Buffey,Buczkowski,Buckbee,Bucio,Brueckner,Broz,Brookhart,Brong,Brockmeyer,Broberg,Brittenham,Brisbois,Bridgmon,Bride,Breyer,Brede,Breakfield,Breakey,Brauner,Branigan,Brandewie,Branche,Brager,Brader,Bovell,Bouthot,Bostock,Bosma,Boseman,Boschee,Borthwick,Borneman,Borer,Borek,Boomershine,Boni,Bommarito,Bolman,Boleware,Boisse,Boehlke,Bodle,Blash,Blasco,Blakesley,Blacklock,Blackley,Bittick,Birks,Birdin,Bircher,Bilbao,Bick,Biby,Bertoni,Bertino,Bertini,Berson,Bern,Berkebile,Bergstresser,Benne,Benevento,Belzer,Beltre,Bellomo,Bellerose,Beilke,Begeman,Bebee,Beazer,Beaven,Beamish,Baymon,Baston,Bastidas,Basom,Basket,Basey,Bartles,Baroni,Barocio,Barnet,Barclift,Banville,Balthazor,Balleza,Balkcom,Baires,Bailiff,Bailie,Baik,Baggott,Bagen,Bachner,Babington,Babel,Asmar,Askin,Arvelo,Artega,Arrendondo,Arreaga,Arrambide,Arquette,Aronoff,Arico,Argentieri,Arevalos,Archbold,Apuzzo,Antczak,Ankeny,Angelle,Angelini,Anfinson,Amer,Amberg,Amarillas,Altier,Altenburg,Alspach,Alosa,Allsbrook,Alexopoulos,Aleem,Aldred,Albertsen,Akerson,Ainsley,Agler,Adley,Addams,Acoba,Achille,Abplanalp,Abella,Abare,Zwolinski,Zollicoffer,Zola,Zins,Ziff,Zenner,Zender,Zelnick,Zelenka,Zeches,Zaucha,Zauala,Zappa,Zangari,Zagorski,Youtsey,Yorker,Yell,Yasso,Yarde,Yarbough,Xiao,Woolever,Woodsmall,Woodfolk,Wonders,Wobig,Wixson,Wittwer,Wirtanen,Winson,Wingerd,Wilkening,Wilhelms,Wierzbicki,Wiechman,Whites,Weyrick,Wessell,Wenrick,Wenning,Weltz,Weinrich,Weiand,Wehunt,Wareing,Walth,Waibel,Wahlquist,Vona,Voelkel,Vitek,Vinsant,Vincente,Vilar,Viel,Vicars,Vermette,Verma,Vent,Venner,Veazie,Vayda,Vashaw,Varon,Vardeman,Vandevelde,Vanbrocklin,Valery,Val,Vaccarezza,Urquidez,Urie,Urbach,Uram,Ungaro,Umali,Ulsh,Tutwiler,Turnbaugh,Tumminello,Tuite,Tueller,Trulove,Troha,Trivino,Trisdale,Trippett,Tribbett,Treptow,Tremain,Travelstead,Trautwein,Trautmann,Tram,Traeger,Tonelli,Tomsic,Tomich,Tomasulo,Tomasino,Tole,Todhunter,Toborg,Tischer,Tirpak,Tircuit,Tinnon,Tinnel,Tines,Tina,Timbs,Tilden,Tiede,Thumm,Throne,Throgmorton,Thorndike,Thornburgh,Thoren,Thomann,Therrell,Thau,Thammavong,Tetrick,Tessitore,Tesreau,Teicher,Teaford,Tauscher,Tauer,Tanabe,Talamo,Takeuchi,Taite,Tadych,Sweeton,Swecker,Swartzentrube,Swarner,Surrell,Surbaugh,Suppa,Sunshine,Sumbry,Suchy,Stuteville,Studt,Stromer,Strome,Streng,Stonestreet,Stockley,Stmichel,Sticker,Stfort,Sternisha,Stensrud,Steinhardt,Steinback,Steichen,Stauble,Stasiak,Starzyk,Stango,Standerfer,Stachowiak,Springston,Spratlin,Spracklen,Sponseller,Spilker,Spiegelman,Spellacy,Speiser,Spaziani,Spader,Spackman,Space,Sorum,Sopha,Sollis,Sollenberger,Solivan,Solheim,Sokolsky,Sogge,Smyser,Smitley,Sloas,Slinker,Skora,Skiff,Skare,Siverd,Sivels,Siska,Siordia,Simmering,Simko,Sime,Silmon,Silano,Sieger,Siebold,Shukla,Shreves,Shoun,Shortle,Shonkwiler,Shoals,Shimmel,Shiel,Shieh,Sherbondy,Shenkman,Shein,Shearon,Shean,Shatz,Shanholtz,Shafran,Shaff,Shackett,Sgroi,Sewall,Severy,Sethi,Sessa,Sequra,Sepulvado,Seper,Senteno,Sendejo,Semmens,Seipp,Segler,Seegers,Sedwick,Sedore,Sechler,Sebastiano,Scovel,Scotton,Scopel,Schwend,Schwarting,Schutter,Schrier,Schons,Scholtes,Schnetzer,Schnelle,Schmutz,Schlichter,Schelling,Schams,Schamp,Scarber,Scallan,Scalisi,Scaffidi,Saxby,Sawrey,Sauvageau,Sauder,Sarrett,Sanzo,Santizo,Santella,Santander,Sandez,Sandel,Sammon,Salsedo,Salge,Sailors,Sagun,Safi,Sader,Sacchetti,Sablan,Saber,Saade,Runnion,Runkel,Rung,Rumbo,Ruesch,Ruegg,Ruckle,Ruchti,Rubens,Rubano,Rozycki,Roupe,Roufs,Rossel,Rosmarin,Rosero,Rosenwald,Roselle,Ronca,Romos,Rolla,Rohling,Rohleder,Roell,Roehm,Rochefort,Roch,Robotham,Rivenburgh,Riopel,Riederer,Ridlen,Rias,Rhudy,Reynard,Retter,Respess,Reppond,Repko,Rengifo,Reinking,Reichelt,Reeh,Redenius,Rebolledo,Raymundo,Rauh,Ratajczak,Rapley,Ranalli,Ramie,Raitt,Radloff,Radle,Rabbitt,Quay,Quant,Pusateri,Puffinberger,Puerta,Provencio,Proano,Privitera,Prenger,Prellwitz,Pousson,Potier,Poster,Portz,Portlock,Porth,Portela,Portee,Porchia,Pollick,Polinski,Polfer,Polanski,Polachek,Pluta,Plourd,Plauche,Pitner,Piontkowski,Pileggi,Pierotti,Pico,Piacente,Phinisee,Phaup,Pfost,Pettinger,Pettet,Petrich,Peto,Persley,Persad,Perlstein,Perko,Pere,Penders,Peifer,Peco,Pear,Pay,Pawley,Pash,Parrack,Parady,Papen,Pangilinan,Pandolfo,Palone,Palmertree,Padin,Ou,Ottey,Ottem,Ostroski,Ornstein,Ormonde,Onstott,Oncale,Oltremari,Olcott,Olan,Oishi,Oien,Odonell,Odonald,Ode,Obeso,Obeirne,Oatley,Nusser,Novo,Novicki,Noreen,Nora,Nitschke,Nistler,Nim,Nikkel,Niese,Nierenberg,Nield,Niedzwiecki,Niebla,Niebel,Nicklin,Neyhart,Newsum,Nevares,Nageotte,Nagai,Myung,Mutz,Murata,Muralles,Munnerlyn,Mumpower,Muegge,Muckle,Muchmore,Moulthrop,Motl,Moskos,Mortland,Morring,Mormile,Morimoto,Morikawa,Morgon,Mordecai,Montour,Mont,Mongan,Monell,Miyasato,Mish,Minshew,Mimbs,Millin,Milliard,Mihm,Middlemiss,Miano,Mew,Mesick,Merlan,Mendonsa,Mench,Melonson,Melling,Mecca,Meachem,Mctighe,Mcnelis,Mcmurtrey,Mcmurphy,Mckesson,Mckenrick,Mckelvie,Mcjunkins,Mcgory,Mcgirr,Mcgeever,Mcfield,Mcelhinney,Mccrossen,Mccommon,Mccannon,Mazyck,Mawyer,Maull,Matute,Mathies,Maschino,Marzan,Martinie,Marrotte,Marmion,Markarian,Marinacci,Margolies,Margeson,Marcia,Marcel,Marak,Maraia,Maracle,Manygoats,Mano,Manker,Mank,Mandich,Manderson,Maltz,Malmquist,Malacara,Majette,Mais,Magnan,Magliocca,Madina,Madara,Macwilliams,Macqueen,Maccallum,Lyde,Lyday,Lutrick,Lurz,Lurvey,Lumbreras,Luhrs,Luhr,Lue,Lowrimore,Lowndes,Lowers,Lourenco,Lougee,Lorona,Longstreth,Loht,Lofquist,Loewenstein,Lobos,Lizardi,Liverpool,Lionberger,Limoli,Liljenquist,Liguori,Liebl,Liburd,Leukhardt,Letizia,Lesinski,Lepisto,Lenzini,Leisenring,Leipold,Leier,Leggitt,Legare,Leaphart,Lazor,Lazaga,Lavey,Laue,Laudermilk,Lauck,Lassalle,Larsson,Larison,Lanzo,Lantzy,Lanners,Langtry,Landford,Lancour,Lamour,Lambertson,Lalone,Lairson,Lainhart,Lagreca,Lacina,Labranche,Labate,Kurtenbach,Kuipers,Kuechle,Kue,Kubo,Krinsky,Krauser,Kraeger,Kracht,Kozeliski,Kozar,Kowalik,Kotler,Kotecki,Koslosky,Kosel,Koob,Kolasinski,Koizumi,Kohlman,Koffman,Knutt,Knore,Knaff,Kmiec,Klamm,Kittler,Kitner,Kirkeby,Kiper,Kindler,Kilmartin,Killings,Killin,Kilbride,Kerchner,Kendell,Keddy,Keaveney,Kearsley,Karras,Karlsson,Karalis,Kappes,Kapadia,Kallman,Kallio,Kalil,Kader,Jurkiewicz,Joya,Johann,Jitchaku,Jillson,Jex,Jeune,Jarratt,Jarchow,Janak,Ivins,Ivans,Isenhart,Inocencio,Inoa,Imhof,Iacono,Hynds,Hutching,Hutchin,Hulsman,Hulsizer,Hueston,Huddleson,Hrbek,Howry,Housey,Hounshell,Hosick,Hortman,Horseman,Horky,Horine,Hootman,Honeywell,Honeyestewa,Holste,Holien,Holbrooks,Hoffmeyer,Hof,Hoese,Hoenig,Hirschfeld,Hildenbrand,Higson,Higney,Hibert,Hibbetts,Hewlin,Hesley,Herrold,Hermon,Heritage,Hepker,Henwood,Helbling,Heinzman,Heidtbrink,Hedger,Havey,Hatheway,Hartshorne,Harpel,Haning,Handelman,Hamalainen,Hamad,Halt,Halasz,Haigwood,Haggans,Hackshaw,Guzzo,Gunner,Gundrum,Guilbeault,Gugliuzza,Guglielmi,Gue,Guderian,Gruwell,Grunow,Grundman,Gruen,Grotzke,Grossnickle,Groomes,Grode,Grochowski,Grob,Grein,Greif,Greenwall,Greenup,Grassl,Grannis,Grandfield,Grames,Grabski,Grabe,Gouldsberry,Gotham,Gosch,Goody,Goodling,Goodermote,Gonzale,Golebiowski,Goldson,Godlove,Glanville,Gillin,Gilkerson,Giessler,Giambalvo,Giacomini,Giacobbe,Ghio,Gergen,Gentz,Genrich,Gelormino,Gelber,Geitner,Geimer,Gauthreaux,Gaultney,Garvie,Gareau,Garbo,Garbacz,Ganoe,Gangwer,Gandarilla,Galyen,Galt,Galluzzo,Gallon,Galardo,Gager,Gaddie,Gaber,Gabehart,Gaarder,Fusilier,Furnari,Furbee,Fugua,Fruth,Frohman,Friske,Frilot,Fridman,Frescas,Freier,Frayer,Franzese,Franklyn,Frankenberry,Frain,Fosse,Foresman,Forbess,Foot,Florida,Flook,Fletes,Fleer,Fleek,Fleegle,Fishburne,Fiscalini,Finnigan,Fini,Filipiak,Figueira,Fiero,Ficek,Fiaschetti,Ferren,Ferrando,Ferman,Fergusson,Fenech,Feiner,Feig,Fees,Faulds,Fate,Fariss,Fantasia,Falor,Falke,Ewings,Eversley,Everding,Eunice,Etling,Essen,Erskin,Enstrom,Enrico,Engebretsen,Ender,Emma,Eitel,Eichberger,Ehler,Eekhoff,Edrington,Edmonston,Edgmon,Edes,Eberlein,Dwinell,Dux,Dupee,Dunklee,Dunk,Dungey,Dunagin,Dumoulin,Duggar,Duenez,Dudzic,Dudenhoeffer,Ducey,Dub,Drouillard,Dreibelbis,Dreger,Dreesman,Draughon,Downen,Double,Dorminy,Dominic,Dombeck,Dolman,Doebler,Dittberner,Dishaw,Disanti,Dinicola,Dinham,Dimino,Dilling,Difrancesco,Dicello,Dibert,Deshazer,Deserio,Descoteau,Deruyter,Dering,Depinto,Dente,Demus,Demattos,Demarsico,Delude,Dekok,Debrito,Debois,Deakin,Dea,Dayley,Dawsey,Dauria,Datson,Darty,Darsow,Darragh,Darensbourg,Dalleva,Dalbec,Dadd,Cutcher,Curb,Cung,Cuello,Cuadros,Crute,Crutchley,Crispino,Crislip,Crisco,Crevier,Creekmur,Crance,Cragg,Crager,Cozby,Coyan,Coxon,Covalt,Couillard,Costley,Costilow,Cossairt,Corvino,Corigliano,Cordaro,Corbridge,Corban,Coor,Cooler,Conkel,Cong,Conary,Coltrain,Collopy,Colgin,Colen,Colbath,Coiro,Coffie,Cochrum,Cobbett,Clopper,Cliburn,Clendenon,Clemon,Clementi,Clausi,Cirino,Cina,Churn,Churchman,Chilcutt,Cherney,Cheetham,Cheatom,Chatelain,Chandra,Chalifour,Cesa,Cervenka,Cerullo,Cerreta,Cerbone,Cecchini,Ceccarelli,Cawthorn,Cavalero,Catalina,Castner,Castlen,Castine,Casimiro,Casdorph,Cartmill,Cartmell,Carro,Carriger,Carlee,Carias,Caravella,Cappas,Capen,Cantey,Canedo,Camuso,Camps,Campanaro,Camero,Cambria,Calzado,Callejo,Caligiuri,Cafaro,Cadotte,Cacace,Byrant,Busbey,Burtle,Burres,Burnworth,Burggraf,Burback,Bunte,Bunke,Bulle,Bugos,Budlong,Buckhalter,Buccellato,Brummet,Bruff,Brubeck,Brouk,Broten,Brosky,Broner,Brittle,Brislin,Brimm,Brillhart,Bridgham,Brideau,Brennecke,Brenna,Breer,Breeland,Bredesen,Branden,Brackney,Brackeen,Boza,Boyum,Bowdry,Bowdish,Bouwens,Bouvier,Bougie,Bouche,Bottenfield,Bostian,Bossie,Bosler,Boschert,Boroff,Borello,Boom,Bonser,Bonfield,Bon,Bole,Boldue,Bogacz,Boemer,Bluth,Bloxom,Blickenstaff,Blessinger,Bleazard,Blatz,Blanchet,Blacksher,Birchler,Binning,Binkowski,Biltz,Bilotta,Bilagody,Bigbee,Bieri,Biehle,Bidlack,Betker,Bethers,Bethell,Bertha,Bero,Bernacchi,Bermingham,Berkshire,Benvenuto,Bensman,Benoff,Bencivenga,Beman,Bellow,Bellany,Belflower,Belch,Bekker,Bejar,Beisel,Beichner,Began,Beedy,Beas,Beanblossom,Bawek,Baus,Baugus,Battie,Battershell,Bateson,Basque,Basford,Bartone,Barritt,Barko,Bann,Bamford,Baltrip,Balon,Balliew,Ballam,Baldus,Ayling,Avelino,Ashwell,Ashland,Arseneau,Arroyos,Armendarez,Arita,Argust,Archuletta,Arcement,Antonacci,Anthis,Antal,Annan,Andree,Anderman,Amster,Amiri,Amadon,Alveraz,Altomari,Altmann,Altenhofen,Allers,Allbee,Allaway,All,Aleo,Alcoser,Alcorta,Akhtar,Ahuna,Agramonte,Agard,Adkerson,Achord,Abt,Abdi,Abair,Zurn,Zoellner,Zirk,Zion,Zee,Zarro,Zarco,Zambo,Zaiser,Zaino,Zachry,Youd,Yonan,Yniguez,Yepes,Yeo,Yellock,Yellen,Yeatts,Yearling,Yatsko,Yannone,Wyler,Woodridge,Wolfrom,Wolaver,Wolanin,Wojnar,Wojciak,Wittmann,Wittich,Wiswell,Wisser,Wintersteen,Wineland,Willing,Willford,Wiginton,Wigfield,Wierman,Wice,Wiater,Whitsel,Whitbread,Wheller,Wettstein,Werling,Wente,Wenig,Wempe,Welz,Weinhold,Weigelt,Weichman,Wedemeyer,Weddel,Ways,Wayment,Waycaster,Wauneka,Watzka,Watton,Warnell,Warnecke,Warmack,Warder,Wands,Waldvogel,Waldridge,Wahs,Wagganer,Waddill,Vyas,Vought,Votta,Voiles,Virga,Viner,Villella,Villaverde,Villaneda,Viele,Vickroy,Vicencio,Veve,Vetere,Vermilyea,Verley,Verburg,Ventresca,Veno,Venard,Venancio,Velaquez,Veenstra,Vea,Vasil,Vanzee,Vanwie,Vantine,Vant,Vanschoyck,Vannice,Vankampen,Vanicek,Vandersloot,Vanderpoel,Vanderlinde,Vallieres,Uzzell,Uzelac,Uranga,Uptain,Updyke,Uong,Untiedt,Umbrell,Umbaugh,Umbarger,Ulysse,Ullmann,Ullah,Tutko,Turturro,Turnmire,Turnley,Turcott,Turbyfill,Turano,Tuminello,Tumbleson,Tsou,Truscott,Trulson,Troutner,Trone,Troll,Trinklein,Tremmel,Tredway,Trease,Traynham,Traw,Totty,Torti,Torregrossa,Torok,Tomkins,Tomaino,Tkach,Tirey,Tinsman,Timpe,Tiefenauer,Tiedt,Tidball,Thwaites,Thulin,Throneburg,Thorns,Thorell,Thorburn,Thiemann,Thieman,Thesing,Tham,Terrien,Terrance,Telfair,Taybron,Tasson,Tasso,Tarro,Tanenbaum,Talent,Tailor,Taddeo,Tada,Taborn,Tabios,Szekely,Szatkowski,Sylve,Swineford,Swartzfager,Swanton,Swagerty,Surrency,Sunderlin,Sumerlin,Suero,Suddith,Sublette,Stumpe,Stueve,Study,Stuckert,Strycker,Struve,Struss,Strubbe,Strough,Strothmann,Strahle,Stoutner,Stooksbury,Stones,Stonebarger,Stokey,Stoffer,Stimmel,Stief,Stephans,Stemper,Steltenpohl,Stellato,Steinle,Stegeman,Steffler,Steer,Steege,Steckman,Stapel,Stansbery,Stanaland,Stahley,Stagnaro,Stachowski,Squibb,Sprunger,Sproule,Sprehe,Spreen,Sprecher,Sposato,Spivery,Souter,Sopher,Sommerfeldt,Soffer,Snowberger,Snape,Smylie,Smyer,Smack,Slaydon,Slatton,Slaght,Skovira,Skeans,Sjolund,Sjodin,Siragusa,Singelton,Sinatra,Silis,Siebenaler,Shuffield,Shobe,Shiring,Shimabukuro,Shilts,Sherley,Sherbert,Shelden,Sheil,Shedlock,Shearn,Shaub,Sharbono,Shapley,Shands,Shaheen,Shaffner,Servantez,Sentz,Seney,Selin,Seitzinger,Seider,Sehr,Sego,Segall,Seeds,Sebastien,Scimeca,Schwenck,Schweiss,Schwark,Schwalbe,Schucker,Schronce,Schrag,Schouten,Schoppe,Schomaker,Schnarr,Schmied,Schmader,Schlicht,Schlag,Schield,Schiano,Scheve,Scherbarth,Schaumburg,Schauman,Scarpino,Savinon,Sassaman,Sarah,Saporito,Sanville,Santilli,Santaana,Sanda,Salzmann,Salman,Saks,Sagraves,Safran,Saccone,Sa,Rutty,Russett,Rupard,Rump,Rumbley,Ruffins,Ruacho,Rozema,Roxas,Routson,Rourk,Rought,Rotunda,Rotermund,Rosman,Rosette,Rork,Rooke,Rolin,Rohm,Rohlman,Rohl,Roeske,Roecker,Rober,Robenson,Riso,Rinne,Rima,Riina,Rigsbee,Riggles,Riester,Rials,Rhinehardt,Reynaud,Reyburn,Rewis,Revermann,Reutzel,Retz,Rende,Rendall,Reistad,Reinders,Reichardt,Rehrig,Rehrer,Recendez,Reamy,Raz,Rauls,Ratz,Rattray,Rasband,Rapone,Ragle,Ragins,Radican,Raczka,Rachels,Raburn,Rabren,Raboin,Ra,Quesnell,Quaintance,Puccinelli,Pruner,Prouse,Proud,Prosise,Proffer,Prochazka,Probasco,Previte,Prayer,Pour,Portell,Porcher,Popoca,Poncho,Pomroy,Poma,Polsky,Polsgrove,Polidore,Podraza,Plymale,Plescia,Pleau,Platte,Plato,Pizzi,Pinchon,Picot,Piccione,Picazo,Philibert,Phebus,Pfohl,Petell,Pesso,Pesante,Pervis,Perrins,Perley,Perkey,Pereida,Penate,Peloso,Pellerito,Peffley,Peddicord,Pecina,Peale,Peaks,Payette,Paxman,Pawlikowski,Pavy,Pavlov,Patry,Patmon,Patil,Pater,Patak,Pasqua,Pasche,Partyka,Parody,Parmeter,Pares,Pardi,Paonessa,Pao,Panozzo,Panameno,Paletta,Pait,Oyervides,Ossman,Oshima,Ortlieb,Orsak,Orleans,Onley,On,Oldroyd,Okano,Ohora,Offley,Oestreicher,Odonovan,Odham,Odegard,Obst,Obriant,Obrecht,Nuccio,Nowling,Nowden,Novelli,Novell,Nost,Norstrom,Norfolk,Nordgren,Nopper,Noller,Nisonger,Niskanen,Nienhuis,Nienaber,Neuwirth,Neumeyer,Neice,Naugher,Naiman,Nagamine,Mustin,Murrietta,Murdaugh,Munar,Mulberry,Muhlbauer,Mroczkowski,Mowdy,Mouw,Mousel,Mountcastle,Moscowitz,Mosco,Morro,Moresi,Morago,Moomaw,Montroy,Montpas,Montieth,Montanaro,Mongelli,Mon,Mollison,Mollette,Moldovan,Mohar,Mizuno,Mitchelle,Mishra,Misenheimer,Minshall,Minozzi,Minniefield,Minion,Milhous,Migliaccio,Migdal,Mickell,Meyering,Methot,Mester,Mesler,Meriweather,Mensing,Mensah,Menge,Mendola,Mendibles,Meloche,Melnik,Mellas,Meinert,Mehrhoff,Medas,Meckler,Mctague,Mcspirit,Mcshea,Mcquown,Mcquiller,Mclarney,Mckiney,Mckearney,Mcguyer,Mcfarlan,Mcfadyen,Mcdanial,Mcdanel,Mccurtis,Mccrohan,Mccorry,Mcclune,Mccant,Mccanna,Mccandlish,Mcaloon,Mayall,Maver,Maune,Matza,Matty,Matsuzaki,Matott,Mathey,Mateos,Masoner,Masino,Mas,Marzullo,Marz,Maryland,Marsolek,Marquard,Mario,Marchetta,Marberry,Manzione,Many,Manthei,Manka,Mangram,Mangle,Mangel,Mandato,Mancillas,Mammen,Malina,Maletta,Malecki,Majkut,Mages,Maestre,Macphail,Maco,Macneill,Macadam,Lysiak,Lyne,Luxton,Luptak,Lundmark,Luginbill,Lovallo,Louthan,Lousteau,Loupe,Lotti,Lopresto,Lonsdale,Longsworth,Lohnes,Loghry,Logemann,Lofaro,Loeber,Locastro,Livings,Litzinger,Litts,Liotta,Lingard,Lineback,Lindy,Lindhorst,Lill,Lide,Lickliter,Liberman,Lewinski,Levandowski,Leimbach,Leifer,Leidholt,Leiby,Leibel,Leibee,Lehrke,Lehnherr,Lego,Leese,Leen,Ledo,Lech,Leblond,Leap,Leahey,Lazzari,Lawrance,Lawlis,Lawhorne,Lawes,Lavigna,Lavell,Lauzier,Lauter,Laumann,Latsha,Latourette,Latona,Latney,Laska,Larner,Larmore,Larke,Larence,Lapier,Lanzarin,Lands,Lammey,Lamke,Laminack,Lamastus,Lamaster,Lacewell,Labarr,Laabs,Kutch,Kuper,Kuna,Kubis,Krzemien,Krupinski,Krepps,Kreeger,Kraner,Krammer,Kountz,Kothe,Korpela,Komara,Kolenda,Kolek,Kohnen,Koelzer,Koelsch,Kocurek,Knoke,Knauff,Knaggs,Knab,Kluver,Klose,Klien,Klahr,Kitagawa,Kissler,Kirstein,Kinnon,Kinnebrew,Kinnamon,Kimmins,Kilgour,Kilcoyne,Kiester,Kiehm,Kha,Kesselring,Kerestes,Kenniston,Kennamore,Kenebrew,Kelderman,Keitel,Kefauver,Katzenberger,Katt,Kast,Kassel,Kasey,Karol,Kamara,Kalmbach,Kaizer,Kaiwi,Kainz,Jurczyk,Jumonville,Juliar,Jourdain,Johndrow,Johanning,Johannesen,Joffrion,Jobes,Jerde,Jentzsch,Jenkens,Jendro,Jellerson,Jefferds,Jaure,Jaquish,Janeway,Jago,Iwasaki,Ishman,Isaza,Inmon,Inlow,Inclan,Ildefonso,Ike,Iezzi,Ianni,Iacovetto,Hyldahl,Huxhold,Huser,Humpherys,Humburg,Hult,Hullender,Hulburt,Huckabay,Howeth,Hovermale,Hoven,Houtman,Hourigan,Hosek,Hopgood,Homrich,Holstine,Holsclaw,Hokama,Hoffpauir,Hoffner,Hochstein,Hochstatter,Hochberg,Hjelm,Hiscox,Hinsley,Hinks,Hineman,Hineline,Hinck,Hilbun,Hewins,Herzing,Hertzberg,Hertenstein,Herrea,Herington,Hercules,Henrie,Henman,Hengst,Hemmen,Helmke,Helgerson,Heinsohn,Heigl,Hegstad,Heggen,Hegge,Hefti,Heathcock,Haylett,Haupert,Haufler,Hatala,Haslip,Hartless,Hartje,Hartis,Harpold,Harmsen,Harbach,Hanten,Hanington,Hammen,Hameister,Hallstrom,Habersham,Habegger,Gussman,Gundy,Guitterez,Guisinger,Guilfoyle,Groulx,Grismer,Griesbach,Grawe,Grall,Graft,Graben,Goulden,Gornick,Gori,Gookin,Gonzalaz,Gonyer,Gonder,Golphin,Goller,Goergen,Glosson,Glor,Gladin,Girdler,Gillim,Gillians,Gillaspie,Gilhooly,Gildon,Gignac,Gibler,Gibbins,Giardino,Giampietro,Gettman,Gerringer,Gerrald,Gerlich,Georgiou,Georgia,Georgi,Geiselman,Gehman,Gauze,Gangl,Gamage,Gallian,Gallen,Gallatin,Galen,Galea,Gainor,Gahr,Furbush,Fulfer,Fuhrmann,Fritter,Friis,Friendly,Friedly,Freudenberger,Frees,Freemon,Fratus,Frans,Foulke,Fosler,Forquer,Fontan,Folwell,Folds,Foeller,Fodge,Fobes,Florek,Fliss,Flight,Flesner,Flegel,Fitzloff,Fiser,First,Firmin,Firestine,Finfrock,Fineberg,Figures,Fiegel,Fickling,Fesperman,Fernadez,Felber,Feimster,Feazel,Favre,Faughn,Fatula,Fasone,Farron,Faron,Farino,Falvey,Falkenberg,Faley,Faletti,Faeth,Fackrell,Ezekiel,Espe,Eskola,Escott,Esaw,Erps,Erker,Erath,Enfield,Emfinger,Embury,Embleton,Emanuele,Em,Elvers,Ellwanger,Ellegood,Einstein,Eichinger,Egge,Egeland,Edgett,Echard,Eblen,Eastmond,Duteau,Durland,Dure,Dunlavy,Dungee,Dukette,Dugay,Duboise,Dubey,Dsouza,Druck,Dralle,Doubek,Dorta,Dorch,Dorce,Dopson,Dolney,Dockter,Distler,Diss,Dippel,Diperna,Dina,Dichiara,Dicerbo,Dewindt,Dewan,Deveney,Devargas,Deutscher,Deuel,Detter,Dess,Derrington,Deroberts,Dern,Deponte,Denogean,Denardi,Denard,Demary,Demarcus,Demarais,Delucas,Deloe,Delmonico,Delisi,Delio,Delduca,Delaine,Deihl,Dehmer,Deep,Decoste,Dechick,Decatur,Dec,Debruce,Debold,Debell,Deats,Daunt,Daquilante,Dambrosi,Damas,Dalin,Daisy,Dahman,Dahlem,Daffin,Dacquel,Cutrell,Cusano,Curtner,Currens,Curnow,Cuppett,Cummiskey,Cullers,Culhane,Crull,Crossin,Cropsey,Cromie,Crofford,Criscuolo,Crisafulli,Crego,Creeden,Covello,Covel,Corse,Correra,Corners,Cordner,Cordier,Coplen,Copeman,Contini,Conteras,Consalvo,Conduff,Condo,Compher,Comas,Colliver,Colan,Cohill,Cohenour,Cogliano,Codd,Cockayne,Clum,Clowdus,Clarida,Clance,Clairday,Clagg,Citron,Citino,Ciriello,Cicciarelli,Chrostowski,Christley,Christians,Chrisco,Chris,Chrest,Chisler,Chieffo,Cherne,Cherico,Cherian,Cheirs,Chauhan,Charter,Chamblin,Cerra,Cepero,Cellini,Celia,Celeste,Celedon,Cejka,Cavagnaro,Cauffman,Catanese,Castrillo,Castrellon,Casserly,Casino,Caseres,Carthen,Carse,Carragher,Carpentieri,Carmony,Carmer,Carlozzi,Caradine,Cappola,Capece,Capaldi,Cantres,Cantos,Canevari,Canete,Calcaterra,Cal,Cadigan,Cabbell,Byrn,Bykowski,Butchko,Busler,Bushaw,Buschmann,Burow,Buri,Burgman,Bunselmeyer,Bunning,Buhrman,Budnick,Buckson,Buckhannon,Brunjes,Brummel,Brumleve,Bruckman,Brouhard,Brougham,Brostrom,Broerman,Brocks,Brison,Brining,Brindisi,Brereton,Breon,Breitling,Breedon,Brasseaux,Branaman,Bramon,Brackenridge,Boyan,Boxley,Bouman,Bouillion,Botting,Botti,Bosshart,Borup,Borner,Bordonaro,Boot,Bonsignore,Bonsall,Bolter,Bojko,Bohne,Bohlmann,Bogus,Bogdon,Boen,Bodenschatz,Bockoven,Bobrow,Blondin,Blissett,Bligen,Blasini,Blankenburg,Bjorkman,Bistline,Bisset,Birdow,Biondolillo,Bielski,Biele,Biddix,Biddinger,Bianchini,Bevens,Bevard,Betancur,Bernskoetter,Bernet,Bernardez,Berliner,Berland,Berkheimer,Berent,Bensch,Benesch,Belleau,Bedingfield,Beckstrom,Beckim,Bechler,Beachler,Bazzell,Basa,Bartoszek,Barsch,Barrell,Barnas,Barnaba,Barillas,Barbier,Baltodano,Baltierra,Balle,Balint,Baldi,Balderson,Balderama,Baldauf,Balcazar,Balay,Baiz,Bairos,Baba,Azim,Axe,Aversa,Avellaneda,Ausburn,Aurelio,Auila,Augusto,Atwill,Artiles,Arterberry,Aro,Arnow,Arnaud,Arnall,Armando,Argyle,Ares,Arenz,Arduini,Archila,Arakawa,Appleman,Aplin,Antonini,Anstey,Anglen,Andros,Amweg,Amstutz,Amari,Amadeo,Aly,Alteri,Aloi,Allebach,Allah,Aley,Alamillo,Airhart,Ahrendt,Africa,Aegerter,Adragna,Admas,Adderly,Adderley,Addair,Abelar,Abbamonte,Abadi,Zurek,Zundel,Zuidema,Zuelke,Zuck,Zogg,Zody,Zets,Zech,Zecca,Zavaleta,Zarr,Yousif,Yoes,Yoast,Yeagley,Yaney,Yanda,Yackel,Wyles,Wyke,Woolman,Woollard,Woodis,Woodin,Wonderly,Wombles,Woloszyn,Wollam,Wnek,Wms,Wittie,Withee,Wissman,Wisham,Wintle,Winthrop,Winokur,Winch,Wilmarth,Willhoite,Wildner,Wikel,Wieser,Wien,Wicke,Wiatrek,Whitehall,Whetstine,Wheelus,Weyrauch,Weyers,Westerling,Wendelken,Welner,Welder,Weinreb,Weinheimer,Weilbacher,Weihe,Weider,Wecker,Wead,Watler,Watkinson,Wasmer,Waskiewicz,Wasik,Warneke,Wares,Wangerin,Wamble,Walken,Waker,Wakeley,Wahlgren,Wahlberg,Wagler,Wachob,Vorhies,Vonseggern,Vittitow,Virgilio,Vink,Villarruel,Villamil,Villamar,Villalovos,Vidmar,Victorero,Vespa,Vertrees,Verissimo,Veltman,Vecchione,Veals,Varrone,Varma,Vanveen,Vanterpool,Vaneck,Vandyck,Vancise,Vanausdal,Vanalphen,Valdiviezo,Urton,Urey,Updegrove,Unrue,Ulbrich,Tysinger,Tyo,Twiddy,Tunson,Trueheart,Troyan,Trier,Traweek,Trafford,Tozzi,Toulouse,Touch,Tosto,Toste,Torez,Tooke,Tonini,Tonge,Tomerlin,Tolmie,Tobe,Tippen,Tierno,Tichy,Thuss,Threat,Thran,Thornbury,Thone,Theunissen,Thelmon,Theall,Textor,Teters,Tesh,Tennis,Teng,Tench,Tekautz,Tehrani,Teat,Teas,Teare,Te,Tavenner,Tartaglione,Tanski,Tanis,Tanguma,Tangeman,Taney,Tammen,Tamburri,Tamburello,Talsma,Tallie,Takeda,Taira,Taheri,Tademy,Taddei,Taaffe,Szymczak,Szczepaniak,Szafranski,Swygert,Swem,Swartzlander,Sutley,Supernaw,Sundell,Sullivant,Suderman,Sudbury,Suares,Stueber,Stromme,Striker,Streeper,Streck,Strebe,Stonehouse,Stoia,Stohr,Stodghill,Stirewalt,Stick,Sterry,Stephanie,Stenstrom,Stene,Steinbrecher,Stear,Stdenis,Stanphill,Staniszewski,Stanard,Stahlhut,Stachowicz,Srivastava,Spong,Spomer,Spinosa,Spindel,Spera,Spark,Soward,Sopp,Sooter,Sonnek,Sonne,Soland,Sojourner,Soeder,Sobolewski,Snellings,Snare,Smola,Smetana,Smeal,Smarr,Sloma,Sligar,Skenandore,Skalsky,Sitter,Sissom,Sirko,Simkin,Silverthorn,Silman,Sikkink,Signorile,Siddens,Shumsky,Shrider,Shoulta,Shonk,Shomaker,Shippey,Shimada,Shillingburg,Shifflet,Shiels,Shepheard,Sheerin,Shedden,Sheckles,Sharrieff,Sharpley,Shappell,Shaneyfelt,Shampine,Shaefer,Shaddock,Shadd,Sforza,Severtson,Setzler,Sepich,Senne,Senatore,Sementilli,Selway,Selover,Sellick,Seigworth,Sefton,Seegars,Sebourn,Seaquist,Sealock,Seabreeze,Scriver,Scinto,Schumer,Schulke,Schryver,Schriner,Schramek,Schoon,Schoolfield,Schonberger,Schnieder,Schnider,Schlitz,Schlather,Schirtzinger,Scherman,Schenker,Scheiner,Scheible,Schaus,Schakel,Schaad,Saxe,Savely,Savary,Sardinas,Santarelli,Sanschagrin,Sans,Sanpedro,Sanjose,Sandra,Sandine,Sandigo,Sandgren,Sanderford,Sandahl,Salzwedel,Salzar,Salvino,Salvatierra,Salminen,Salierno,Salberg,Sahagun,Saelee,Sabel,Rynearson,Ryker,Rupprecht,Runquist,Rumrill,Ruhnke,Rovira,Rottenberg,Rosoff,Rosete,Rosebrough,Roppolo,Roope,Romas,Roley,Rohrback,Rohlfs,Rogriguez,Roel,Rodriguiz,Rodewald,Roback,Rizor,Ritt,Rippee,Riolo,Rinkenberger,Riggsby,Rigel,Rieman,Riedesel,Rideau,Ricke,Rhinebolt,Rheault,Revak,Relford,Reinsmith,Reichmann,Rei,Regula,Redlinger,Redhead,Rayno,Raycroft,Rave,Raus,Raupp,Rathmann,Rastorfer,Rasey,Raponi,Rantz,Ranno,Ranes,Randal,Ramp,Ramnauth,Rahal,Raddatz,Quattrocchi,Quang,Purchase,Pullis,Pulanco,Pryde,Prohaska,Primiano,Prez,Prevatt,Prechtl,Pottle,Potenza,Portes,Porowski,Poppleton,Pontillo,Pong,Polka,Politz,Politi,Poggi,Plonka,Plaskett,Placzek,Pizzuti,Pizzaro,Pisciotta,Pippens,Pinkins,Pinilla,Pini,Pingitore,Piercey,Pickup,Piccola,Piccioni,Picciano,Phy,Philps,Philp,Philo,Philmon,Philbin,Pflieger,Pezzullo,Petruso,Petrea,Petitti,Peth,Peshlakai,Peschel,Persico,Persichetti,Persechino,Perris,Perlow,Perico,Pergola,Penniston,Pembroke,Pellman,Pekarek,Peirson,Pearcey,Pealer,Pavlicek,Passino,Pasquarello,Pasion,Parzych,Parziale,Parga,Papalia,Papadakis,Paino,Pacini,Oyen,Ownes,Owczarzak,Outley,Ouelette,Ottosen,Otting,Ostwinkle,Osment,Oshita,Osario,Orlow,Oriordan,Orefice,Orantes,Oran,Orahood,Opel,Olpin,Oliveria,Okon,Okerlund,Okazaki,Ohta,Offerman,Nyce,Nutall,Northey,Norcia,Noor,Noh,Niehoff,Niederhauser,Nickolson,Nguy,Neylon,Newstrom,Nevill,Netz,Nesselrodt,Nemes,Neally,Nauyen,Nascimento,Nardella,Nanni,Myren,Murchinson,Munter,Munster,Mundschenk,Mujalli,Muckleroy,Mu,Moussa,Mouret,Moulds,Mottram,Motte,Mosey,Morre,Montreuil,Monton,Montellano,Monninger,Monhollen,Mongeon,Monestime,Monegro,Mondesir,Monceaux,Mola,Moga,Moening,Moccia,Misko,Miske,Mishaw,Minturn,Mingione,Minerva,Milstein,Milos,Milla,Milks,Milhouse,Michl,Micheletti,Michals,Mesia,Merson,Meras,Menifee,Meluso,Mella,Melick,Mehlman,Meffert,Medoza,Mecum,Meaker,Meahl,Mczeal,Mcwatters,Mcomber,Mcmonigle,Mckiddy,Mcgranor,Mcgeary,Mcgaw,Mcenery,Mcelderry,Mcduffey,Mccuistion,Mccrudden,Mccrossin,Mccosh,Mccolgan,Mcclish,Mcclenahan,Mcclam,Mccartt,Mccarrell,Mcbane,Mc,Maybury,Mayben,Maw,Maulden,Mauceri,Matko,Mathie,Matheis,Mathai,Masucci,Massiah,Martorano,Martnez,Martindelcamp,Marschke,Marovich,Markiewicz,Marinaccio,Marhefka,Marcrum,Manton,Mantel,Mannarino,Manlove,Mangham,Manasco,Malpica,Mallernee,Malinsky,Malhotra,Maish,Maisel,Mainville,Maharrey,Magid,Maertz,Mada,Maclaughlin,Macina,Macdermott,Macallister,Macadangdang,Maack,Lynk,Lydic,Luyando,Lutke,Lupinacci,Lunz,Lundsten,Lull,Lujano,Luhn,Luecke,Luebbe,Ludolph,Luckman,Lucker,Luckenbill,Luckenbach,Lucido,Lowney,Lowitz,Lovaglio,Louro,Louk,Loudy,Louderback,Lorick,Lorenzini,Lorensen,Lorenc,Lomuscio,Loguidice,Lockner,Lockart,Lochridge,Litaker,Lisowe,Liptrap,Linnane,Linhares,Lindfors,Lindenmuth,Lincourt,Lina,Like,Liew,Lies,Liebowitz,Levengood,Leskovec,Lesch,Leoni,Lennard,Legner,Leaser,Leas,Lean,Leadingham,Lazarski,Layland,Laurito,Laulu,Laughner,Laughman,Laughery,Laube,Latiolais,Lasserre,Lasser,Lars,Larrow,Larrea,Lapsley,Lantrip,Lanthier,Langwell,Langelier,Landaker,Lampi,Lamond,Lamblin,Lambie,Lakins,Laipple,Lagrimas,Lafrancois,Laffitte,Laday,Lacko,Lacava,Labor,Labianca,Kutsch,Kuske,Kunert,Kubly,Kuamoo,Krummel,Krise,Krenek,Kreiser,Krausz,Kraska,Krakowski,Kradel,Kozik,Koza,Kotowski,Koslow,Korber,Kojima,Kochel,Knabjian,Klunder,Klugh,Klinkhammer,Kliewer,Klever,Kleber,Klages,Klaas,Kizziar,Kitchel,Kishimoto,Kirschenman,Kirschenbaum,Kinnick,Kinn,Kinkle,Kiner,Kindla,Kindall,Kincaide,Kilson,Killins,Kill,Kightlinger,Kienzle,Kiah,Khim,Ketcherside,Kerl,Kelsoe,Kelker,Keizer,Keir,Keepers,Kawano,Kawa,Kaveney,Kath,Kasparek,Kaplowitz,Kantrowitz,Kant,Kanoff,Kano,Kann,Kamalii,Kalt,Kaleta,Kalbach,Kalauli,Kalata,Kalas,Kaigler,Kachel,Juran,Jubb,Jonker,Jonke,Jolivette,Joles,Joas,Jividen,Jewel,Jeffus,Jeanty,Jarvi,Jardon,Janvier,Janosko,Janoski,Janiszewski,Janish,Janek,Iwanski,Iuliano,Isabella,Irle,Ingmire,Imber,Ijames,Iiams,Ihrig,Ichikawa,Hynum,Hutzel,Hutts,Huskin,Husak,Hurndon,Huntsinger,Humm,Hulette,Huitron,Huguenin,Hugg,Hugee,Huelskamp,Huch,Howen,Hovanec,Hoston,Hostettler,Horsfall,Horodyski,Holzhauer,Hollimon,Hollender,Hogarth,Hoffelmeyer,Histand,Hissem,Hisel,Hirayama,Hinegardner,Hinde,Hinchcliffe,Hiltbrand,Hilsinger,Hillstrom,Hiley,Hickenbottom,Hickam,Hibley,Heying,Hewson,Hetland,Hersch,Herlong,Herda,Henzel,Henshall,Hendler,Hence,Helson,Helfen,Heinbach,Heikkila,Heggs,Hefferon,Hebard,Heathcote,Hearl,Heaberlin,Hauth,Hauschild,Haughney,Hauch,Hattori,Haste,Hasley,Hartpence,Harroun,Harrier,Harelson,Hardgrove,Hardel,Hansbrough,Handsome,Handshoe,Handly,Haluska,Hally,Halling,Halfhill,Halferty,Hakanson,Haist,Hairgrove,Hahner,Hagg,Hafele,Haaland,Guttierez,Gutknecht,Gunnarson,Gunlock,Gummersheimer,Gullatte,Guity,Guilmette,Guhl,Guenette,Guardino,Groshong,Grober,Gripp,Grillot,Grilli,Greulich,Gretzinger,Greenwaldt,Graven,Grassman,Granberg,Graeser,Graeff,Graef,Grabow,Grabau,Gotchy,Goswick,Gosa,Gordineer,Gorczyca,Goodchild,Golz,Gollihue,Goldwire,Goldbach,Goffredo,Glassburn,Glaeser,Gillilan,Gigante,Giere,Gieger,Gidcumb,Giarrusso,Giannelli,Gettle,Gesualdi,Geschke,Gerwig,Gervase,Geoffrion,Gentilcore,Genther,Gemes,Gemberling,Gelles,Geitz,Geeslin,Gedney,Gebauer,Gaye,Gawron,Gavia,Gautney,Gaustad,Gasmen,Gargus,Ganske,Ganger,Galvis,Gallinger,Gallichio,Galletta,Gaede,Gadlin,Gaby,Gabrielsen,Gaboriault,Furlan,Furgerson,Fujioka,Fugett,Fuehrer,Frisco,Frint,Frigon,Frevert,Frautschi,Fraker,Fradette,Foulkes,Forslund,Forni,Foo,Fontenette,Fones,Folz,Folmer,Follman,Folkman,Flourney,Flickner,Flemmings,Fleischacker,Flander,Flament,Fithian,Fister,Fiorello,Fiorelli,Fioravanti,Fieck,Ficke,Fiallos,Fiacco,Feuer,Ferrington,Fernholz,Feria,Fergurson,Feick,Febles,Favila,Faulkingham,Fath,Farnam,Falter,Fakhouri,Fairhurst,Failing,Fahs,Eva,Estrello,Essick,Espree,Esmond,Eskelson,Escue,Escatel,Erebia,Epperley,Epler,Enyart,Engelbert,Enderson,Emmitt,Emch,Elisondo,Eli,Elford,El,Ekman,Eick,Eichmann,Ehrich,Ehlen,Edwardson,Edley,Edghill,Edel,Eastes,Easterbrooks,Eagleson,Eagen,Eade,Dyle,Dutkiewicz,Dunnagan,Duncil,Duling,Drumgoole,Droney,Dreyfus,Dragan,Dowty,Doscher,Dornan,Doremus,Doogan,Donaho,Donahey,Dombkowski,Dolton,Dolen,Dobratz,Diveley,Dittemore,Ditsch,Disque,Dishmon,Disch,Dirickson,Dippolito,Dimuccio,Dilger,Diefenderfer,Dicola,Diblasio,Dibello,Devan,Dettmer,Deschner,Desbiens,Derusha,Denkins,Demonbreun,Demchak,Delucchi,Delprete,Deloy,Deliz,Deline,Delap,Deiter,Deignan,Degiacomo,Degaetano,Defusco,Dede,Deboard,Debiase,Deaville,Deadwyler,Davanzo,Daughton,Darter,Darrin,Danser,Dandrade,Dando,Dampeer,Dalziel,Dalen,Dain,Dai,Dague,Czekanski,Cutwright,Cutliff,Curle,Cuozzo,Cunnington,Cunning,Cunnigham,Cumings,Crowston,Croak,Crittle,Crispell,Crisostomo,Crear,Creach,Craigue,Crabbs,Cozzi,Cozza,Coxe,Cowsert,Coviello,Couse,Coull,Cottier,Costagliola,Corra,Corpening,Cormany,Corless,Corkern,Conteh,Conquest,Conkey,Cones,Conditt,Conaty,Colomb,Collura,Colledge,Colins,Colgate,Coleson,Colemon,Coins,Coffland,Coccia,Coast,Clougherty,Clewell,Cleckley,Cleaveland,Clarno,Clamp,Civils,Cillo,Cifelli,Ciesluk,Chum,Chui,Christison,Christiana,Chowning,Chouteau,Choung,Childres,Cherrington,Chenette,Cheeves,Cheairs,Chaddock,Cernoch,Cerino,Cazier,Cathy,Castel,Casselberry,Caserta,Carvey,Carton,Cart,Carry,Carris,Carrie,Carmant,Cariello,Cardarelli,Caras,Caracciolo,Capitano,Cantoni,Cantave,Cancio,Campillo,Cam,Callens,Caldero,Calamia,Cahee,Cahan,Cahalan,Cabanilla,Cabal,Bywater,Bynes,Byassee,Butkus,Busker,Bushby,Busack,Burtis,Burrola,Buroker,Burnias,Burn,Burlock,Burham,Burak,Bulla,Buffin,Buffa,Buening,Budney,Buchannan,Buchalter,Bua,Brule,Brugler,Broxson,Broun,Brosh,Brissey,Brisby,Brinlee,Brinkmeyer,Brimley,Brickell,Breth,Breger,Brees,Brank,Braker,Bozak,Bowlds,Bowersock,Bousman,Boushie,Botz,Bordwell,Bonkowski,Bonine,Bonifay,Bonesteel,Boldin,Bohringer,Bohlander,Boecker,Bocook,Bocock,Boblett,Bobbett,Boas,Boarman,Bleser,Blazejewski,Blaustein,Blausey,Blancarte,Blaize,Blackson,Blacketer,Blackard,Bisch,Birchett,Billa,Bilder,Bierner,Bienvenu,Bielinski,Bialas,Biagini,Beynon,Beyl,Bettini,Bethany,Betcher,Bessent,Beshara,Besch,Bernd,Bergemann,Bergeaux,Berdan,Bens,Benedicto,Bendall,Beltron,Beltram,Bellville,Beisch,Behney,Beemer,Beechler,Beckum,Becks,Batzer,Batte,Bastida,Bassette,Basley,Base,Bartosh,Bartolone,Barraclough,Barnick,Barket,Barkdoll,Baringer,Barges,Barella,Barbian,Barbati,Bannan,Banderas,Balles,Baldo,Balasubramani,Bala,Baig,Bahn,Bachmeier,Babyak,Baas,Baars,Ayuso,Axt,Avinger,Avella,Ausbrooks,Aull,Augello,Atkeson,Atkerson,Atherley,Athan,Assad,Asebedo,Arrison,Armon,Armfield,Armbrust,Arlington,Arkin,Archambeau,Antonellis,Angotti,Andy,Amorose,Amini,Amborn,Amano,Aluarez,Alma,Allgaier,Allegood,Ales,Alen,Aldama,Albertine,Aki,Aird,Ahsing,Ahmann,Aguado,Agostino,Agostinelli,Agnes,Adwell,Adsit,Adelstein,Ade,Actis,Acierno,Achee,Abbs,Abbitt,Zwagerman,Zuercher,Zinno,Zettler,Zeff,Zavalza,Zaugg,Zarzycki,Zappulla,Zanotti,Zachman,Zacher,Yundt,Yslas,Younes,Yontz,Yglesias,Yeske,Yellow,Yeargin,Yauger,Yamane,Xang,Wylam,Wrobleski,Wratchford,Worker,Woodlee,Wolsey,Wolfinbarger,Wohlenhaus,Wittler,Wittenmyer,Witkop,Wishman,Wintz,Winkelmann,Windus,Winborn,Wims,Wiltrout,Wilshire,Willmott,Williston,Wilemon,Wilbourne,Wiedyk,Widmann,Wickland,Wickes,Wichert,Whitsell,Whisenand,Whidby,Wetz,Westmeyer,Wertheim,Wernert,Werle,Werkheiser,Weng,Weldin,Weissenborn,Weingard,Weinfeld,Weihl,Weightman,Weichel,Wehrheim,Wegrzyn,Wegmann,Wearing,Waszak,Wankum,Wangler,Walthour,Waltermire,Walstad,Waldren,Walbert,Walawender,Wahlund,Wahlert,Wahlers,Wach,Vuncannon,Vroom,Vredenburgh,Vonk,Vollmar,Voisinet,Vlahos,Viscardi,Vires,Vipperman,Violante,Vidro,Vessey,Vesper,Veron,Vergari,Verbeck,Venturino,Velastegui,Vegter,Varas,Vanwey,Vanvranken,Vanvalkenbur,Vanorsdale,Vanoli,Vanochten,Vanier,Vanevery,Vane,Vanduser,Vandersteen,Vandell,Vandall,Vallot,Vallon,Vallez,Vallely,Vadenais,Uthe,Usery,Unga,Ultsch,Ullom,Tyminski,Twogood,Tursi,Turay,Tungate,Truxillo,Trulock,Trovato,Troise,Tripi,Trinks,Trimboli,Trickel,Trezise,Trefry,Treen,Trebilcock,Travieso,Trachtenberg,Touhey,Tougas,Tortorella,Tormey,Torelli,Torborg,Toran,Tomek,Tomassi,Tollerson,Tolden,Toda,Tobon,Tjelmeland,Titmus,Tilbury,Tietje,Thurner,Thum,Thrope,Thornbrough,Thibaudeau,Thackeray,Tesoro,Territo,Ternes,Teich,Tecson,Teater,Teagarden,Tatsch,Tarallo,Tapanes,Tanberg,Tamm,Sylvis,Swenor,Swedlund,Swagger,Sutfin,Sura,Sundt,Sundin,Summerson,Sumatzkuku,Sultemeier,Sulivan,Suggitt,Suermann,Sturkie,Sturgess,Stumph,Stuemke,Struckhoff,Strose,Stroder,Stride,Stricklen,Strick,Streib,Strei,Strawther,Stratis,Strahm,Stortz,Storrer,Storino,Stohler,Stohl,Stockel,Stinnette,Stile,Stieber,Stensland,Steffenhagen,Stefanowicz,Steever,Steagall,Statum,Stapley,Stanish,Standiford,Standen,Stamos,Stahlecker,Stadtler,Spratley,Spraker,Sposito,Spickard,Spehar,Spees,Spearing,Spangle,Spallone,Sox,Soulard,Sorel,Sora,Sopko,Sood,Sonnen,Som,Solly,Solesbee,Soldano,Sobey,Sobczyk,Snedegar,Sneddon,Smolinski,Smolik,Slota,Sloman,Sleigh,Slavick,Skorupski,Skolnik,Skirvin,Skeels,Skains,Skahan,Skaar,Siwiec,Siverly,Siver,Sivak,Sirk,Sinton,Sinor,Sincell,Silberstein,Sieminski,Sidelinger,Shurman,Shunnarah,Shirer,Shidler,Sherlin,Shepperson,Shemanski,Sharum,Shartrand,Shapard,Shanafelt,Shamp,Shader,Shackelton,Seyer,Seroka,Sernas,Seright,Serano,Sengupta,Semper,Selinger,Seith,Seidler,Seehusen,Seefried,Seed,Scovell,Scorzelli,Sconiers,Schwind,Schwichtenber,Schwerin,Schwenke,Schwaderer,Schussler,Schuneman,Schumpert,Schultheiss,Schroll,Schroepfer,Schroeden,Schrimpf,Schook,Schoof,Schomburg,Schoenfeldt,Schoener,Schnoor,Schmick,Schlereth,Schindele,Schildt,Schildknecht,Schemmel,Scharfenberg,Schanno,Schane,Schaer,Schad,Scearce,Scardino,Sawka,Sawinski,Savoca,Savery,Saults,Saucer,Sarpy,Saris,Sardinha,Sarafin,Sankar,Sanjurjo,Sanderfer,Sanagustin,Samudio,Sammartino,Samas,Salz,Salmen,Sallie,Salkeld,Salamon,Sakurai,Sakoda,Safley,Sada,Sachse,Ryden,Ryback,Russow,Russey,Ruprecht,Rumple,Ruffini,Rudzinski,Rudel,Rudden,Rud,Rovero,Routledge,Roussin,Rousse,Rouser,Rougeau,Rosie,Rosica,Romey,Romaniello,Rolfs,Rogoff,Rogne,Rodriquz,Rodrequez,Rodin,Rocray,Rocke,Robbin,Riviere,Rivette,Riske,Risenhoover,Rindfleisch,Rinaudo,Rimbey,Riha,Righi,Ridner,Ridling,Riden,Rhue,Reyome,Reynoldson,Reusch,Rensing,Rensch,Rennels,Renderos,Reininger,Reiners,Reigel,Rehmer,Regier,Reff,Reef,Redlin,Recchia,Reaume,Reagor,Rayne,Rawe,Rattigan,Raska,Rashed,Ranta,Ranft,Randlett,Randa,Ramiez,Ramella,Rallis,Rajan,Raisbeck,Raimondo,Raible,Ragone,Rackliffe,Quirino,Quiring,Quero,Quaife,Pyke,Purugganan,Pursifull,Purkett,Purdon,Punches,Pun,Pulos,Pulling,Puccia,Provance,Propper,Preis,Prehn,Prata,Prasek,Pranger,Pradier,Portor,Portley,Porte,Popiel,Popescu,Pomales,Polowy,Pollett,Politis,Polit,Poley,Pol,Pohler,Poggio,Poet,Podolak,Poag,Plymel,Ploeger,Planty,Piskura,Pirrone,Pirro,Piroso,Pinsky,Pile,Pilant,Pickerill,Piccolomini,Picart,Piascik,Phann,Petruzzelli,Petosa,Persson,Perretta,Perkowski,Perilli,Percifield,Perault,Peppel,Pember,Pelotte,Pelcher,Peixoto,Pehl,Peatross,Pearlstein,Peacher,Payden,Paya,Pawelek,Pavey,Pauda,Pathak,Parrillo,Parness,Parlee,Paoli,Pannebaker,Palomar,Palo,Palmberg,Paganelli,Paffrath,Padovano,Padden,Pachucki,Over,Ovando,Othman,Osowski,Osler,Osika,Orsburn,Orlowsky,Oregel,Oppelt,Opfer,Opdyke,Onell,Omer,Olivos,Okumura,Okoro,Ogas,Offer,Oelschlaeger,Odette,Oder,Ocanas,Obrion,Obarr,Oas,Oare,Nyhus,Nyenhuis,Nunnelley,Nunamaker,Nuckels,Noyd,Nowlan,Novakovich,Noteboom,Norviel,Nortz,Norment,Norland,Nolt,Nolie,Nixson,Nitka,Nissley,Nishiyama,Niland,Niewiadomski,Niemeier,Nieland,Nickey,Nicholsen,Newark,Neugent,Neto,Nerren,Nein,Neikirk,Neigh,Nedrow,Neave,Nazaire,Navaro,Navalta,Nasworthy,Nasif,Nani,Nalepa,Nakao,Nakai,Nadolny,Myklebust,Mussel,Murthy,Muratore,Murat,Mundie,Mulverhill,Muilenburg,Muetzel,Mudra,Mudgett,Mrozinski,Moura,Mottinger,Morson,Moretto,Morentin,Mordan,Mooreland,Mooers,Monts,Montone,Montondo,Montiero,Monserrate,Monie,Monat,Monares,Mollo,Mollet,Molacek,Mokry,Mohrmann,Mohabir,Mogavero,Moes,Moceri,Miyoshi,Mitzner,Misra,Mis,Mirr,Mira,Minish,Minge,Minckler,Milroy,Mille,Mileski,Milanesi,Miko,Mihok,Mihalik,Mieczkowski,Messerli,Meskill,Mesenbrink,Merton,Merryweather,Merkl,Menser,Menner,Menk,Menden,Menapace,Melbourne,Mekus,Meinzer,Mein,Meers,Mctigue,Mcquitty,Mcpheron,Mcmurdie,Mcleary,Mclafferty,Mckinzy,Mckibbin,Mckethan,Mcintee,Mcgurl,Mceachran,Mcdowall,Mcdermitt,Mccuaig,Mccreedy,Mccoskey,Mcclosky,Mcclintick,Mccleese,Mccanless,Mazzucco,Mazzocco,Mazurkiewicz,Mazariego,Mayhorn,Maxcy,Mavity,Mauzey,Maulding,Matuszewski,Mattsson,Mattke,Matsushita,Matsuno,Matsko,Matkin,Mathur,Mates,Masterman,Massett,Massart,Massari,Mashni,Martella,Marren,Margotta,Marder,Marczak,Maran,Maradiaga,Manwarren,Mantini,Manter,Mantelli,Manso,Mangone,Manfredonia,Malden,Malboeuf,Malanga,Makara,Maison,Maisano,Mairs,Mailhiot,Magri,Magic,Madron,Madole,Mackall,Macduff,Macartney,Lynds,Lusane,Luffman,Lua,Louth,Loughmiller,Lougheed,Lotspeich,Lorenzi,Loree,Loosli,Looker,Longe,Longanecker,Lonero,Lohmeyer,Loeza,Lobstein,Lobner,Lober,Littman,Litalien,Lippe,Lints,Linear,Lijewski,Ligas,Liebert,Liebermann,Liberati,Lezcano,Levinthal,Lessor,Less,Lesieur,Lenning,Lengel,Len,Lempke,Lemp,Lemar,Leitzke,Leinweber,Legrone,Lege,Leder,Lawnicki,Lauth,Laun,Laughary,Latin,Lassley,Lashway,Larrivee,Largen,Lare,Lanouette,Lanno,Langille,Langen,Landing,Lana,Lamonte,Lalin,Lala,Laible,Lafratta,Laforte,Lacuesta,Lacer,Labore,Laboe,Labeau,Kwasniewski,Kunselman,Kuhr,Kuchler,Kuc,Krugman,Kruckenberg,Krotzer,Kroemer,Krist,Krigbaum,Kreke,Kreisman,Kreisler,Kreft,Krasnow,Kras,Krag,Kouyate,Kough,Kotz,Kostura,Korner,Kornblum,Korczynski,Koppa,Kopczyk,Konz,Komorowski,Kollen,Kolander,Koepnick,Koehne,Kochis,Knoch,Knippers,Knaebel,Klipp,Klinedinst,Klimczyk,Klier,Klement,Klaphake,Kisler,Kinzie,Kines,Kindley,Kimple,Kimm,Kimbel,Kilker,Kilborn,Kibbey,Khong,Ketchie,Kerbow,Kennemore,Kennebeck,Kenneally,Kenndy,Kenmore,Kemnitz,Kemler,Kemery,Kelnhofer,Kellstrom,Kellis,Kellams,Keiter,Keirstead,Keeny,Keelin,Keefauver,Keams,Kautzman,Kaus,Katayama,Kasson,Kassim,Kasparian,Kase,Karwoski,Kapuscinski,Kaneko,Kamerling,Kamada,Kalka,Kalar,Kakacek,Kaczmarczyk,Jurica,Junes,Journell,Jolliffe,Johnsey,Joel,Jindra,Jimenz,Jette,Jesperson,Jerido,Jenrette,Jencks,Jech,Jayroe,Jayo,Jaye,Javens,Jaskot,Jaros,Jaquet,Janowiak,Jame,Jaegers,Jackel,Izumi,Ith,Italia,Irelan,Ion,Inzunza,Imoto,Imme,Iglehart,Iannone,Iannacone,Huyler,Hussaini,Hurlock,Hurlbutt,Huprich,Humphry,Hulslander,Huelsman,Hudelson,Hudecek,Hsia,Hreha,Hoyland,Howk,Housholder,Housden,Houff,Horkey,Honan,Homme,Holtzberg,Hollyfield,Hollings,Hollenbaugh,Hokenson,Hogrefe,Hogland,Hoel,Hodgkin,Hochhalter,Hjelle,Hittson,Hinderman,Hinchliffe,Hime,Hilyer,Hilby,Hibshman,Heydt,Hewell,Heward,Hetu,Hestand,Heslep,Herridge,Herner,Hernande,Hermandez,Hermance,Herbold,Heon,Henthorne,Henion,Henao,Heming,Helmkamp,Hellberg,Heidgerken,Heichel,Hehl,Hegedus,Hefty,Heckathorne,Hearron,Haymer,Haycook,Havlicek,Hausladen,Haseman,Hartsook,Hartog,Harns,Harne,Harmann,Haren,Hanserd,Hanners,Hanekamp,Hamra,Hamley,Hamelin,Hamblet,Hakimi,Hagle,Hagin,Haehn,Haeck,Hackleman,Haacke,Gulan,Guirand,Guiles,Guggemos,Guerrieri,Guerreiro,Guereca,Gudiel,Guccione,Gubler,Gruenwald,Gritz,Grieser,Grewe,Grenon,Gregersen,Grefe,Greener,Grech,Grecco,Gravette,Grassia,Granholm,Graner,Grandi,Grahan,Gradowski,Gradney,Graczyk,Gouthier,Gottschall,Goracke,Gootee,Goodknight,Goodine,Gonzalea,Gonterman,Gonalez,Gomm,Goleman,Goldtooth,Goldstone,Goldey,Golan,Goes,Goen,Goeller,Goel,Goecke,Godek,Goan,Glunz,Gloyd,Glodowski,Glinski,Glawe,Girod,Girdley,Giovanni,Gindi,Gillings,Gildner,Giger,Giesbrecht,Gierke,Gier,Giboney,Giaquinto,Giannakopoulo,Giaimo,Giaccio,Giacalone,Gessel,Gerould,Gerlt,Gerhold,Geralds,Genson,Genereux,Gellatly,Geigel,Gehrig,Gehle,Geerdes,Geagan,Gawel,Gavina,Gauss,Gatwood,Gathman,Gaster,Garske,Garratt,Garms,Garis,Gansburg,Gammell,Gambale,Gamba,Galimore,Gadway,Gadoury,Furrer,Furnish,Furino,Fullard,Fukui,Fuhrer,Fryou,Friesner,Friedli,Friedl,Friedberg,Freyermuth,Fremin,Fredell,Fraze,Franken,Fought,Foth,Fote,Fortini,Fornea,Formanek,Forker,Forgette,Folan,Foister,Foglesong,Flinck,Flewellen,Flaten,Flaig,Fitgerald,Fischels,Firman,Finstad,Finkelman,Finister,Finder,Fina,Fettes,Fetterhoff,Ferriter,Ferch,Fennessy,Feltus,Feltes,Feinman,Farve,Farry,Farrall,Farag,Falzarano,Falck,Falanga,Fakhoury,Faire,Fairbrother,Fagley,Faggins,Facteau,Ewer,Ewbank,Evola,Evener,Eustis,Eugenio,Estwick,Estel,Essa,Espinola,Escutia,Eschmann,Erpelding,Ernsberger,Erling,Entz,Enrique,Engelhart,Enbody,Emick,Elsinger,Ellinwood,Ellingsen,Ellicott,Elkind,Eisinger,Eisenbeisz,Eischen,Eimer,Eigner,Eichhorst,Ehmke,Egleston,Eggett,Ege,Efurd,Edgeworth,Eckels,Ebey,Eberling,Eagleton,Dwiggins,Dweck,Dunnings,Dunnavant,Dumler,Duman,Dugue,Duerksen,Dudeck,Dreisbach,Drawdy,Drawbaugh,Draine,Draggoo,Dowse,Dovel,Doughton,Douds,Doubrava,Dort,Dorshorst,Dornier,Doolen,Donavan,Dominque,Dominion,Dominik,Domingez,Dome,Dom,Dolder,Dold,Dobies,Dk,Diskin,Disano,Dirden,Diponio,Dipirro,Dimock,Diltz,Dillabough,Diley,Dikes,Digges,Digerolamo,Diel,Dicker,Dicharry,Dicecco,Dibartolomeo,Diamant,Dewire,Devone,Dessecker,Dertinger,Derousselle,Derk,Depauw,Depalo,Denherder,Demeyer,Demetro,Demastus,Delvillar,Deloye,Delosrios,Delgreco,Delarge,Delangel,Dejongh,Deitsch,Degiorgio,Degidio,Defreese,Defoe,Decambra,Debenedetto,Deaderick,Daza,Dauzat,Daughenbaugh,Dato,Dass,Darwish,Dantuono,Danton,Dammeyer,Daloia,Daleo,Dagg,Dacey,Curts,Cuny,Cunneen,Culverhouse,Cuervo,Cucinella,Cubit,Crumm,Crudo,Crowford,Crout,Crotteau,Crossfield,Crooke,Crom,Critz,Cristaldi,Crickmore,Cribbin,Cremeens,Crayne,Cradduck,Couvertier,Cottam,Cossio,Correy,Cordrey,Coplon,Copass,Coone,Coody,Contois,Consla,Connelley,Connard,Congo,Congleton,Condry,Conception,Coltey,Colindres,Colgrove,Colfer,Colasurdo,Cocker,Cochell,Cobbin,Clouthier,Closs,Cloonan,Clizbe,Clennon,Clayburn,Claybourn,Clausell,Clasby,Clagett,Ciskowski,Cirrincione,Cinque,Cinelli,Cimaglia,Ciaburri,Christiani,Christeson,Chladek,Chizmar,Chinnici,Chiarella,Chevrier,Cheves,Chernow,Cheong,Chelton,Charlette,Chanin,Cham,Chaligoj,Celestino,Cayce,Cavey,Cavaretta,Caughron,Catmull,Catapano,Casio,Cashaw,Carullo,Carualho,Carthon,Cartelli,Carruba,Carrere,Carolus,Carmine,Carlstrom,Carli,Carfora,Carello,Carbary,Car,Caplette,Cannell,Cancilla,Campell,Cammarota,Camilo,Camejo,Camarata,Caisse,Cacioppo,Cabbagestalk,Cabatu,Cabanas,Byles,Buxbaum,Butland,Butch,Burrington,Burnsed,Burningham,Burlingham,Burgy,Buitrago,Buffett,Bueti,Buehring,Buday,Bucks,Bucknell,Buchbinder,Bucey,Bruster,Brunston,Brumby,Bruins,Brouillet,Brosious,Broomes,Brodin,Broddy,Brochard,Britsch,Britcher,Brierley,Brezina,Bressi,Bressette,Breslow,Brenden,Breier,Brei,Braymer,Brasuell,Brash,Branscomb,Branin,Brandley,Brahler,Bracht,Bracamontes,Brabson,Boyne,Boxell,Bowery,Bovard,Boutelle,Boulette,Bottini,Botkins,Bosen,Boscia,Boscarino,Borich,Bores,Boreman,Bordoy,Bordley,Bordenet,Boquet,Boocks,Bolner,Boissy,Boilard,Bohnen,Bohall,Boening,Boccia,Boccella,Bobe,Blyth,Blitz,Blew,Blacksmith,Biviano,Bitto,Bisel,Binstock,Bines,Billiter,Bigsby,Bighorse,Bielawski,Bickmore,Bettin,Bettenhausen,Besson,Beseau,Berton,Berroa,Berntson,Bernas,Berisford,Berhow,Bergsma,Benyo,Benyard,Bente,Bennion,Benko,Belsky,Bellavance,Belasco,Belardo,Beidler,Behring,Begnaud,Bega,Befort,Beek,Bedore,Beddard,Becknell,Beardslee,Beardall,Beagan,Bayly,Bauza,Bautz,Bausman,Baumler,Batterson,Battenfield,Bassford,Basse,Basemore,Baruch,Bartholf,Bars,Barman,Baray,Barabas,Banghart,Banez,Balsam,Ballester,Ballagh,Baldock,Bagnoli,Bagheri,Bacus,Bacho,Baccam,Axson,Averhart,Aver,Ave,Austill,Auberry,Athans,Atcitty,Atay,Astarita,Ascolese,Artzer,Arts,Arrasmith,Argenbright,Aresco,Arb,Aranjo,Appleyard,Appenzeller,App,Apilado,Antonetti,Antis,Annett,Annas,Angwin,Andris,Andries,Andreozzi,Ando,Andis,Anderegg,Anastasia,Amyot,Aminov,Amelung,Amelio,Amason,Alviar,Allendorf,Allday,Alice,Aldredge,Alcivar,Alaya,Alapai,Airington,Aina,Ailor,Ahrns,Ahmadi,Agresta,Agent,Affolter,Aeschlimann,Adney,Aderhold,Adell,Adachi,Ackiss,Aben,Abdelhamid,Abar,Aase,Zorilla,Zordan,Zollman,Zoch,Zipfel,Zimmerle,Zike,Ziel,Zhong,Zens,Zelada,Zaman,Zahner,Zadora,Zachar,Zaborowski,Zabinski,Yzquierdo,Yoshizawa,Yori,Yielding,Yerton,Yehl,Yeargain,Yeakley,Yamaoka,Yagle,Yablonski,Wynia,Wyne,Wyers,Wrzesinski,Wrye,Wriston,Woolums,Woolen,Woodlock,Woodle,Wonser,Wombacher,Wollschlager,Wollen,Wolfley,Wolfer,Wisse,Wisell,Wirsing,Winstanley,Winsley,Winiecki,Winiarski,Winge,Winesett,Windell,Winberry,Willyard,Willemsen,Wilkosz,Wilensky,Wikle,Wiford,Wienke,Wieneke,Wiederhold,Wiebold,Widick,Wickenhauser,Whitrock,Whisner,Whinery,Wherley,Whedbee,Wheadon,Whary,Wessling,Wessells,Wenninger,Wendroth,Wende,Wellard,Weirick,Weinkauf,Wehrman,Weech,Weathersbee,Waterford,Warton,Warncke,Warm,Wardrip,Walstrom,Walks,Walkowski,Walcutt,Waight,Wai,Wagman,Waggett,Wadford,Vowles,Vormwald,Vondran,Vohs,Vitt,Vitalo,Viser,Vinas,Villena,Villaneuva,Villafranca,Villaflor,Vilain,Vigilante,Vicory,Viana,Vian,Vial,Verucchi,Verra,Venzke,Venske,Veley,Veile,Veeder,Vaske,Vasconez,Vargason,Varble,Vanwert,Vantol,Vanscooter,Vanmetre,Vanmaanen,Vanhise,Vanetta,Vaneaton,Vandyk,Vandriel,Vandorp,Vandewater,Vandervelden,Vanderstelt,Vanderhoef,Vanderbeck,Vanbibber,Vanalstine,Vanacore,Valdespino,Vaill,Vailes,Vagliardo,Ursini,Urrea,Urive,Uriegas,Umphress,Ucci,Uballe,Tyrone,Tynon,Twiner,Tutton,Tudela,Tuazon,Troisi,Tripplett,Trias,Trescott,Treichel,Tredo,Tranter,Tozer,Toxey,Tortorici,Tornow,Topolski,Topia,Topel,Topalian,Tonne,Tondre,Tola,Toepke,Tiu,Tisdell,Tiscareno,Thornborrow,Thomison,Thilges,Theuret,Therien,Thang,Thagard,Thacher,Texter,Terzo,Teresa,Tep,Tenpenny,Tempesta,Teetz,Teaff,Tavella,Taussig,Tatton,Tasler,Tarrence,Tardie,Tarazon,Tantillo,Tanney,Tankson,Tangen,Tamburo,Takes,Tabone,Szilagyi,Syphers,Swistak,Swiatkowski,Sweigert,Swayzer,Swapp,Svehla,Sutphen,Sutch,Susa,Surma,Surls,Sundermeyer,Sundeen,Sulek,Suite,Sughrue,Sudol,Sturms,Stupar,Stum,Stuckman,Strole,Strohman,Streed,Strebeck,Strausser,Strassel,Stpaul,Storts,Storr,Stommes,Stmary,Stjulien,Stika,Stiggers,Sthill,Stevick,Sterman,Stephany,Stepanek,Stemler,Stelman,Stelmack,Steinkamp,Steinbock,Stcroix,Stcharles,Staudinger,Starry,Stanly,Stallsworth,Stalley,Stains,Srock,Spritzer,Spracklin,Spinuzzi,Spidell,Spice,Speyrer,Sperbeck,Spendlove,Speedy,Speckman,Spargur,Spangenberg,Spaid,Sowle,Soulier,Sotolongo,Sostre,Sorey,Sonier,Somogyi,Somera,Solo,Soldo,Sofia,Soderholm,Snoots,Snooks,Snoke,Snodderly,Snide,Snee,Smoke,Smithhart,Smillie,Smay,Smallman,Sliwinski,Slentz,Sledd,Slager,Skogen,Skog,Skarda,Skalicky,Siwek,Sitterson,Sisti,Sissel,Sis,Sinopoli,Similton,Simila,Simenson,Silvertooth,Silos,Siggins,Sieler,Siburt,Sianez,Shurley,Shular,Shuecraft,Shreeves,Shon,Shollenberger,Shoen,Shishido,Shipps,Shipes,Shinall,Sherfield,Shawe,Sharrett,Sharrard,Shankman,Shan,Sham,Sessum,Serviss,Servello,Serice,Serda,Semler,Semenza,Selmon,Sellen,Seley,Seidner,Seib,Sehgal,Seelbach,Sedivy,Sebren,Sebo,Seanez,Seagroves,Seagren,Seagrave,Seabron,Schwertner,Schwegel,Schwarzer,Schrunk,Schriefer,Schreder,Schrank,Schopp,Schonfeld,Schoenwetter,Schnall,Schnackenberg,Schnack,Schmutzler,Schmierer,Schmidgall,Schlup,Schloemer,Schlitt,Schermann,Scherff,Schellenberg,Schain,Schaedler,Schabel,Scaccia,Saye,Saxman,Saurez,Sasseen,Sasnett,Sas,Sarti,Sarra,Sarber,Saran,Santoy,Santeramo,Sansoucy,Sando,Sandles,Sandburg,Sandau,Samra,Samaha,Salon,Salizar,Salam,Saindon,Sagaser,Saeteun,Sadusky,Sackman,Sabater,Saas,Ruthven,Ruszkowski,Rusche,Rumpf,Ruhter,Ruhenkamp,Rufo,Rudge,Ruddle,Rowlee,Rowand,Routhier,Rougeot,Rotramel,Rotan,Roswell,Rosten,Rosillo,Rookard,Roode,Rongstad,Rollie,Roider,Roffe,Roettger,Rodick,Rochez,Rochat,Roads,Rivkin,Rivadeneira,Riston,Risso,Rise,Rinderknecht,Riis,Riggsbee,Rifkin,Rieker,Riegle,Riedy,Richwine,Richmon,Ricciuti,Riccardo,Ricardson,Rhew,Revoir,Revier,Remsberg,Remiszewski,Rembold,Rella,Reinken,Reiland,Reidel,Reichart,Rehak,Redway,Rednour,Redifer,Redgate,Redenbaugh,Redburn,Reap,Readus,Raybuck,Rauhuff,Rauda,Ratte,Rathje,Rappley,Rands,Ramseyer,Ramseur,Ramsdale,Ramo,Ramariz,Raitz,Raisch,Rainone,Rahr,Ragasa,Rafalski,Radunz,Quenzer,Queja,Queenan,Pyun,Puz,Putzier,Puskas,Purrington,Puri,Punt,Pullar,Pruse,Pring,Primeau,Prevette,Preuett,Presto,Prestage,Pownell,Pownall,Potthoff,Potratz,Poth,Poter,Posthuma,Posen,Porritt,Popkin,Poormon,Polidoro,Poles,Polcyn,Pokora,Poer,Pluviose,Plock,Pleva,Placke,Pioli,Pingleton,Pinchback,Pinch,Pieretti,Piccone,Piatkowski,Philley,Phibbs,Phay,Phagan,Pfund,Peyer,Pettersen,Petter,Petrucelli,Petropoulos,Petras,Petix,Pester,Perks,Pepperman,Pennick,Penado,Pelot,Pelis,Peeden,Pechon,Peal,Pazmino,Patchin,Pasierb,Parran,Parilla,Pardy,Parcells,Paragas,Paradee,Papin,Panko,Pangrazio,Pangelinan,Pandya,Pancheri,Panas,Palmiter,Pallares,Palinkas,Palek,Pagliaro,Packham,Pacitti,Ozier,Overbaugh,Oursler,Ouimette,Otteson,Otsuka,Othon,Osmundson,Oroz,Orgill,Ordeneaux,Orama,Oppy,Opheim,Onkst,Oltmanns,Olstad,Olofson,Ollivier,Olen,Olejniczak,Okura,Okuna,Okey,Ohrt,Oharra,Oguendo,Ogier,Offermann,Oetzel,Oechsle,Odor,Odoherty,Oddi,Ockerman,Occhiogrosso,Obryon,Obremski,Nyreen,Nylund,Nylen,Nyholm,Nuon,Nuanes,Norrick,Noris,Nordell,Norbury,Nooner,Nono,Nomura,Nole,Nolden,Nola,Nofsinger,Nocito,Nobel,Niedbala,Niebergall,Nicolini,Nicole,Nicklaus,Nevils,Neuburger,Nemerofsky,Nemecek,Nazareno,Nastri,Nast,Nancy,Nagorski,Myre,Muzzey,Mutton,Mutschler,Muther,Musumeci,Muranaka,Muramoto,Murad,Murach,Muns,Munno,Muncrief,Mugrage,Muecke,Mozer,Moyet,Mowles,Mottern,Mosman,Mosconi,Morine,Morge,Moravec,Morad,Moneymaker,Mones,Moncur,Monarez,Molzahn,Moglia,Moesch,Mody,Modisett,Mitnick,Mithcell,Mitchiner,Mistry,Misercola,Mirabile,Minvielle,Mino,Minkler,Minifield,Minichiello,Mindell,Minasian,Milteer,Millwee,Millstein,Millien,Mikrut,Mihaly,Miggins,Michard,Mezo,Metzner,Mesquita,Mervin,Merriwether,Merk,Merfeld,Mercik,Mercadante,Mention,Menna,Mendizabal,Mender,Members,Melusky,Melquist,Mellado,Meler,Melendes,Mekeel,Meiggs,Megginson,Meck,Mcwherter,Mcwayne,Mcsparren,Mcrea,Mcneff,Mcnease,Mcmurrin,Mckeag,Mchughes,Mcguiness,Mcgilton,Mcelreath,Mcelhone,Mcelhenney,Mceldowney,Mccurtain,Mccure,Mccosker,Mccory,Mccormic,Mccline,Mccleave,Mcclatchey,Mccarney,Mccanse,Mcallen,Mazzie,Mazin,Mazanec,Mayette,Mautz,Mauser,Maun,Mattas,Mathurin,Mathiesen,Massmann,Masri,Masias,Mascolo,Mascetti,Mascagni,Marzolf,Maruska,Martain,Marta,Marszalek,Marolf,Marmas,Marlor,Markwood,Marines,Marinero,Marier,Marich,Marcom,Marciante,Marchman,Marchio,Marbach,Manzone,Mantey,Mannina,Manhardt,Manfred,Manaois,Malmgren,Mallonee,Mallin,Mallary,Malette,Makinson,Makins,Makarewicz,Mainwaring,Maida,Maiava,Magro,Magouyrk,Magett,Maeder,Madyun,Maduena,Maden,Madeira,Macnamara,Mackins,Mackel,Macinnes,Macia,Macgowan,Lyssy,Lyerly,Lyalls,Lutter,Lunney,Luksa,Ludeman,Lucidi,Lucci,Lowden,Lovier,Loughridge,Losch,Lory,Lorson,Lorenzano,Lorden,Lorber,Lopardo,Loosier,Loomer,Longsdorf,Longchamps,Loncar,Loker,Logwood,Loeffelholz,Lockmiller,Livoti,Linford,Linenberger,Lindloff,Lindenbaum,Limoges,Lilla,Liley,Lighthill,Lightbourne,Lieske,Leza,Levels,Levandoski,Leuck,Lepere,Leonhart,Lenon,Lemma,Lemler,Leising,Leinonen,Lehtinen,Lehan,Leetch,Leeming,Ledyard,Ledwith,Ledingham,Leclere,Leck,Lebert,Leandry,Lazzell,Layo,Laye,Laxen,Lawther,Lawn,Lawerance,Lavoy,Lavertu,Laverde,Lauren,Latouche,Latner,Lathen,Last,Laskin,Lashbaugh,Lascala,Larroque,Larick,Laraia,Laplume,Lanzilotta,Lannom,Landrigan,Landolt,Landess,Lancia,Lamkins,Lalla,Lalk,Lakeman,Lakatos,Laib,Lahay,Lagrave,Lagerquist,Lafoy,Lafleche,Lader,Labrada,Kwiecinski,Kutner,Kunshier,Kulakowski,Kujak,Kuehnle,Kubisiak,Krzyminski,Krugh,Krois,Kritikos,Krill,Kriener,Krewson,Kretzschmar,Kretz,Kresse,Kreiter,Kreischer,Krebel,Kraut,Krans,Kraling,Krahenbuhl,Kouns,Kotson,Kossow,Kopriva,Konkle,Kolter,Kolk,Kolich,Kohner,Koeppen,Koenigs,Kock,Kochanski,Kobus,Knowling,Knouff,Knoerzer,Knippel,Kloberdanz,Kleinert,Klarich,Klaassen,Kizzie,Kisamore,Kirn,Kiraly,Kipps,Kinson,Kinneman,Kington,Kine,Kimbriel,Kille,Kick,Kibodeaux,Khamvongsa,Keylon,Kever,Keser,Kertz,Kercheval,Kenneth,Kendrix,Kendle,Ken,Kempt,Kemple,Keesey,Keats,Keatley,Kazmierski,Kazda,Kazarian,Kawashima,Katsch,Kasun,Kassner,Kassem,Kasperski,Kasinger,Kaschak,Karels,Kantola,Kana,Kamai,Kalthoff,Kalla,Kalani,Kahrs,Kahanek,Kacher,Jurasek,Juniper,Jungels,Jukes,Juelfs,Judice,Juda,Ju,Josselyn,Jonsson,Jonak,Joens,Jobson,Jegede,Jee,Jeanjacques,Jaworowski,Jaspers,Jannsen,Janner,Jankowiak,Jank,Janiak,Jackowski,Jacklin,Jabbour,Iyer,Iveson,Ivan,Isner,Iniquez,Ingwerson,Ingber,Ina,Imbrogno,Ille,Ikehara,Iannelli,Hyson,Huxford,Huseth,Hurns,Hurney,Hurles,Hunnings,Humbarger,Hulan,Huisinga,Hughett,Hughen,Hudler,Hubiak,Hricko,How,Hoversten,Hottel,Hosaka,Horsch,Hormann,Hordge,Honzell,Homburg,Holten,Holme,Hollopeter,Hollinsworth,Hollibaugh,Holberg,Hohmann,Hoenstine,Hodell,Hodde,Hobert,Hives,Hiter,Hirko,Hipolito,Hinzmann,Hinrichsen,Hinger,Hincks,Hilz,Hilborn,Highley,Higashi,Hieatt,Hicken,Heverly,Hesch,Hervert,Hershkowitz,Herreras,Hermanns,Herget,Henriguez,Hennon,Hengel,Helmlinger,Helmig,Helen,Heldman,Heizer,Heinitz,Heifner,Heidorn,Heglin,Heffler,Hebner,Heathman,Heaslip,Hazlip,Haymes,Hayase,Hawver,Haw,Havermale,Havas,Hauber,Hashim,Hasenauer,Harvel,Hartney,Hartel,Harsha,Harpine,Harkrider,Harkin,Harer,Harclerode,Hanzely,Hanni,Hannagan,Hampel,Hammerschmidt,Hamar,Hallums,Hallin,Hainline,Haid,Haggart,Hafen,Haer,Hadiaris,Hadad,Hackford,Habeeb,Guymon,Guttery,Gunnett,Gull,Guillette,Guiliano,Guilbeaux,Guiher,Guignard,Guerry,Gude,Gucman,Guadian,Grzybowski,Grzelak,Grussendorf,Grumet,Gruenhagen,Grudzinski,Ground,Grossmann,Grof,Grisso,Grisanti,Griffitts,Griesbaum,Grella,Gregston,Graveline,Grandusky,Grandinetti,Gramm,Goynes,Gowing,Goudie,Gosman,Gort,Gorsline,Goralski,Goodstein,Goodroe,Goodlin,Goodheart,Goodhart,Gonzelez,Gonthier,Goldsworthy,Goldade,Goettel,Goerlitz,Goepfert,Goehner,Goben,Gobeille,Glock,Gliem,Gleich,Glasson,Glascoe,Gladwell,Giusto,Girdner,Gipple,Giller,Giesing,Giammona,Ghormley,Germon,Geringer,Gergely,Gerberich,Gepner,Gens,Genier,Gemme,Gelsinger,Geigle,Gebbia,Gayner,Gavitt,Gatrell,Gastineau,Gasiewski,Gascoigne,Garro,Garin,Ganong,Ganga,Galpin,Gallus,Galizia,Gajda,Gahm,Gagen,Gaffigan,Furno,Furnia,Furgason,Fronczak,Frishman,Friess,Frierdich,Fresh,Freestone,Franta,Frankovich,Fors,Forres,Forrer,Floris,Florido,Floria,Flis,Flicek,Flens,Flegal,Flamenco,Finkler,Finkenbinder,Finefrock,Filter,Filpo,Filion,Fierman,Fieldman,Ferreyra,Fernendez,Fergeson,Fera,Fencil,Feith,Feight,Federici,Federer,Fechtner,Feagan,Fausnaugh,Faubert,Fata,Farman,Farinella,Fantauzzi,Fanara,Falso,Falardeau,Fagnani,Fabro,Excell,Ewton,Evey,Everetts,Eve,Evarts,Etherington,Estremera,Estis,Estabrooks,Essig,Esplin,Espenschied,Ernzen,Erich,Eppes,Eppard,Entwisle,Emmi,Emison,Elison,Elguezabal,Eledge,Elbaz,Eisler,Eiden,Eichorst,Eichert,Egle,Eggler,Eggimann,Edey,Eckerman,Echelberger,Ebbs,Ebanks,Dziak,Dyche,Dyce,Dusch,Duross,Durley,Durate,Dunsworth,Dumke,Dulek,Duhl,Duggin,Dufford,Dudziak,Ducrepin,Dubree,Dubre,Dubie,Dubas,Droste,Drisko,Drewniak,Doxtator,Dowtin,Downum,Doubet,Dottle,Dosier,Doshi,Dorst,Dorset,Dornbusch,Doren,Donze,Donica,Domanski,Domagala,Dohse,Doerner,Doerfler,Doble,Dobkins,Dilts,Digiulio,Digaetano,Dietzel,Diddle,Dickel,Dezarn,Devoy,Devoss,Devonshire,Devon,Devilla,Devere,Deters,Desvergnes,Deshay,Desena,Deross,Der,Depedro,Densley,Demorest,Demore,Demora,Demirjian,Demerchant,Dematteis,Demateo,Delgardo,Delfavero,Delaurentis,Delamar,Delacy,Deitrich,Deisher,Degracia,Degraaf,Defries,Defilippis,Decoursey,Debruin,Debiasi,Debar,Dearden,Dealy,Dayhoff,Davino,Darvin,Darrisaw,Darbyshire,Daquino,Daprile,Danial,Danh,Danahy,Dalsanto,Dallavalle,Daine,Dagel,Dadamo,Dacy,Dacunha,Dabadie,Czyz,Cutsinger,Curney,Cuppernell,Cunliffe,Cumby,Cullop,Cullinane,Cugini,Cudmore,Cuda,Cucuzza,Cuch,Crumby,Crouser,Crock,Critton,Critchley,Cristy,Cremona,Cremar,Crehan,Creary,Crasco,Crall,Crabbe,Cozzolino,Cozier,Coyner,Couvillier,Counterman,Coulthard,Coudriet,Cottom,Corzo,Cornutt,Corkran,Cords,Corda,Copelin,Coonan,Consolo,Conrow,Conran,Connerton,Conkwright,Condren,Comp,Comly,Comisky,Colli,Collet,Colello,Colbeck,Colarusso,Coiner,Cohron,Codere,Cocks,Cobia,Cly,Cluster,Clure,Clowser,Clovis,Clingenpeel,Clenney,Clendaniel,Clemenson,Cleere,Cleckler,Claybaugh,Clason,Cirullo,Ciraulo,Ciolek,Ciampi,Christopherse,Christophe,Chovanec,Chopra,Chol,Chiem,Chestnutt,Chesterman,Chernoff,Chermak,Chelette,Checketts,Charpia,Charo,Chargois,Champman,Challender,Chafins,Cerruto,Celi,Cea,Cazenave,Cay,Cavaluzzi,Cauthon,Caudy,Catino,Caterina,Catano,Castell,Cassaro,Cassarino,Carrano,Carozza,Carow,Carmickle,Carlyon,Carlew,Cardena,Caputi,Capley,Capalbo,Canseco,Candella,Canal,Campton,Camposano,Calleros,Calleja,Callegari,Calica,Calarco,Calais,Caillier,Cahue,Cadenhead,Cadenas,Cabera,Buzzo,Busto,Bussmann,Busenbark,Burzynski,Bursley,Bursell,Burle,Burkleo,Burkette,Burczyk,Bumstead,Bullett,Buikema,Buenaventura,Buege,Buechel,Budreau,Budhram,Bucknam,Brye,Brushwood,Brumbalow,Brulotte,Bruington,Bruderer,Browns,Brougher,Bromfield,Broege,Brodhead,Brocklesby,Broadie,Brizuela,Britz,Brisendine,Brilla,Briggeman,Brierton,Bridgeford,Breyfogle,Brevig,Breuninger,Bresse,Bresette,Brelsford,Breitbach,Bread,Brayley,Braund,Branscom,Brando,Brandner,Brahm,Braboy,Brabble,Bozman,Boyte,Boynes,Boyken,Bowell,Bowan,Boutet,Bouse,Boulet,Boule,Bottcher,Bosquez,Borrell,Boria,Bordes,Borchard,Bonson,Bonino,Bonas,Bonamico,Bolstad,Bolser,Bollis,Bolich,Bolf,Boker,Boileau,Bohac,Bogucki,Bogren,Boeger,Bodziony,Bodo,Bodley,Boback,Blyther,Blight,Blenker,Blazina,Blase,Blamer,Blacknall,Blackmond,Bitz,Biser,Biscardi,Binz,Bilton,Billotte,Billafuerte,Bigford,Biegler,Bibber,Bhandari,Beyersdorf,Bevelle,Bettendorf,Bessard,Bertsche,Berne,Berlinger,Berish,Beranek,Bentson,Bentsen,Benskin,Benoy,Benoist,Benitz,Belongia,Belmore,Belka,Belen,Beitzel,Beiter,Beitel,Behrns,Beckworth,Becka,Beaudion,Beary,Beare,Beames,Beabout,Beaber,Bazzano,Bazinet,Baucum,Batrez,Baswell,Bastos,Bascomb,Bartha,Barstad,Barrilleaux,Barretto,Barresi,Barona,Barkhurst,Barke,Bardales,Barczak,Barca,Barash,Banfill,Bambino,Balonek,Balmes,Ballon,Balko,Balestrieri,Baldino,Baldelli,Baken,Baiza,Bahner,Baek,Badour,Badman,Badley,Badia,Backmon,Bacich,Bacca,Ayscue,Ayo,Aynes,Austen,Ausiello,Auringer,Auiles,Aspinwall,Askwith,Artiga,Arroliga,Arns,Arman,Arellanes,Aracena,Antwine,Antuna,Anselmi,Ansel,Annen,Angelino,Angeli,Angarola,Andrae,Amparo,Amodio,Amie,Ameen,Alwine,Alverio,Altro,Altobello,Altemus,Alquicira,Ally,Allphin,Allemand,Allam,Alessio,Akpan,Akerman,Aiona,Aikman,Agyeman,Agredano,Adamik,Adamczak,Acrey,Achilles,Acevado,Abu,Abreo,Abrahamsen,Abild,Zwicker,Zweig,Zuvich,Zumpano,Zuluaga,Zubek,Zornes,Zoglmann,Ziminski,Zimbelman,Zhanel,Zenor,Zechman,Zauner,Zamarron,Zaffino,Yusuf,Ytuarte,Yoke,Yett,Yerkovich,Yelder,Yaw,Yasuda,Yapp,Yankee,Yaden,Yackley,Yaccarino,Xia,Wytch,Wyre,Wussow,Worthing,Wormwood,Wormack,Worlds,Wordsworth,Wordell,Woodroof,Woodington,Woodhams,Wooddell,Wollner,Wojtkowski,Wojcicki,Wogan,Wlodarczyk,Wixted,Withington,Withem,Wisler,Wirick,Winterhalter,Winski,Winne,Winemiller,Wimett,Wiltfong,Willibrand,Willes,Wilkos,Wilbon,Wiktor,Wiggers,Wigg,Wiegmann,Wickliff,Wiberg,Whittler,Whittenton,Whitling,Whitledge,Whitherspoon,Whiters,Whitecotton,Whitebird,Wheary,Wetherill,Westmark,Westaby,Wertenberger,Wentland,Wenstrom,Wenker,Wellen,Weier,Wegleitner,Wedekind,Wawers,Wassel,Warehime,Wank,Wandersee,Waltmon,Waltersheid,Walbridge,Wakely,Wakeham,Wajda,Waithe,Waidelich,Wahler,Wahington,Wagster,Wadel,Vuyovich,Vuolo,Vulich,Vukovich,Volmer,Vollrath,Vollbrecht,Vogelgesang,Voeller,Vlach,Vivar,Vitullo,Vitanza,Visker,Visalli,Viray,Vinning,Viniard,Villapando,Villaman,Vier,Viar,Viall,Verstraete,Vermilya,Verdon,Venn,Velten,Velis,Vasey,Vanoven,Vanorder,Vanlue,Vanheel,Vanderwoude,Vanderheide,Vandenheuvel,Vandenbos,Vandeberg,Vandal,Vanblarcom,Vanaken,Vanacker,Vallian,Valine,Valent,Vaine,Vaile,Vadner,Uttech,Urioste,Urbanik,Unrath,Unnasch,Underkofler,Uehara,Udy,Tyrer,Tyburski,Twaddle,Turntine,Tunis,Tullock,Trunk,Tropp,Troilo,Tritsch,Triola,Trigo,Tribou,Tribley,Tri,Trethewey,Tress,Trela,Treharne,Trefethen,Trayler,Trax,Traut,Trang,Tranel,Trager,Traczyk,Towsley,Torrecillas,Tornatore,Tork,Torivio,Toriello,Tooles,Toodle,Tomme,Tolosa,Tolen,Toca,Titterington,Tipsword,Tinklenberg,Tim,Tigney,Tigert,Thygerson,Thurn,Thur,Threats,Thorstad,Thornberg,Thoresen,Thomaston,Tholen,Thicke,Theiler,Thebeau,Theaux,Thaker,Tewani,Teufel,Tetley,Terrebonne,Terrano,Terpening,Telly,Tela,Teig,Teichert,Tegethoff,Teele,Tatar,Tashjian,Tarte,Tanton,Tanimoto,Tamimi,Tamas,Talman,Taal,Szydlowski,Szostak,Swoyer,Swerdlow,Sweeden,Sweda,Swanke,Swander,Swackhammer,Suyama,Suriano,Suri,Surdam,Suprenant,Sundet,Summerton,Sult,Suleiman,Suffridge,Suby,Stych,Studeny,Stubbins,Strupp,Struckman,Strief,Strictland,Stremcha,Strehl,Stramel,Stoy,Stoutamire,Storozuk,Stordahl,Stopher,Stolley,Stolfi,Stoeger,Stockhausen,Stjulian,Stivanson,Stinton,Stinchfield,Stigler,Stieglitz,Stgermaine,Steuer,Steuber,Steuart,Stepter,Stepnowski,Stepanian,Steimer,Stefanelli,Stebner,Stears,Steans,Stayner,Staubin,Statz,Stasik,Starn,Starmer,Stargel,Stanzione,Stankovich,Stan,Stamour,Staib,Stadelman,Stadel,Stachura,Squadrito,Sprinkles,Springstead,Spragg,Spigelmyer,Spieler,Spielberg,Spaur,Sovocool,Sovereign,Soundara,Soulia,Souffrant,Sos,Sorce,Sonkin,Sodhi,Soble,Sniffen,Smouse,Smittle,Smithee,Smedick,Smaller,Slowinski,Slovacek,Slominski,Slice,Skowronek,Skokan,Skanes,Sivertson,Sinyard,Sinka,Sinard,Simonin,Simonian,Simmions,Silcott,Silberg,Siefken,Siddon,Shuttlesworth,Shubin,Shubeck,Shiro,Shiraki,Shipper,Shina,Shilt,Shikles,Shideler,Shenton,Shelvey,Shellito,Shelhorse,Shawcroft,Shatto,Shanholtzer,Shamonsky,Shall,Shadden,Seymer,Seyfarth,Sewer,Setlock,Servant,Serratos,Serr,Sepulueda,Senay,Semmel,Semans,Selvig,Selkirk,Selk,Seligson,Seldin,Seiple,Seiersen,Seidling,Seidensticker,Secker,Searson,Scordo,Scollard,Scoggan,Scobee,Sciandra,Scialdone,Schwimmer,Schwieger,Schweer,Schwanz,Schutzenhofer,Schuetze,Schrodt,Schriever,Schriber,Schremp,Schrecongost,Schraeder,Schonberg,Scholtz,Scholle,Schoettle,Schoenemann,Schoene,Schnitker,Schmuhl,Schmith,Schlotterbeck,Schleppenbach,Schlee,Schickel,Schibi,Schein,Scheide,Scheibe,Scheib,Schaumberg,Schardein,Schaalma,Scantlin,Scantlebury,Sayle,Sausedo,Saurer,Sassone,Sarracino,Saric,Sanz,Santino,Santarpia,Santano,Santaniello,Sangha,Sandvik,Sandoral,Sandobal,Sandercock,Sanantonio,Salviejo,Salsberry,Salois,Salazer,Sagon,Saglibene,Sagel,Sagal,Saetern,Saefong,Sadiq,Sabori,Saballos,Rygiel,Rushlow,Runco,Rulli,Ruller,Ruffcorn,Ruess,Ruebush,Rudlong,Rudin,Rudgers,Rudesill,Ruderman,Rucki,Rucinski,Rubner,Rubinson,Rubiano,Ruan,Roznowski,Rozanski,Rowson,Rower,Rounsaville,Roudabush,Rotundo,Rothell,Rotchford,Rosiles,Roshak,Rosetti,Rosenkranz,Rorer,Rollyson,Rokosz,Rojek,Roitman,Rohrs,Rogel,Roewe,Rodriges,Rodocker,Rodgerson,Rodan,Rodak,Rocque,Rochholz,Rochel,Robicheau,Robbinson,Roady,Ritchotte,Ripplinger,Rippetoe,Ringstaff,Ringenberg,Rinard,Rigler,Rightmire,Riesen,Riek,Ridges,Richner,Richberg,Riback,Rial,Rhyner,Rhees,Resse,Renno,Renee,Rendleman,Ren,Reisz,Reisenauer,Reinschmidt,Reins,Reinholt,Reinard,Reifsnyder,Rehfeld,Reha,Regester,Reffitt,Redler,Rediske,Reckner,Reckart,Rebolloso,Rebollar,Reasonover,Reasner,Reaser,Reano,Reagh,Raval,Ratterman,Ratigan,Rater,Rasp,Raneses,Randolf,Ramil,Ramdas,Ramberg,Rajaniemi,Rail,Raid,Raggio,Ragel,Ragain,Rade,Radaker,Racioppi,Rabinovich,Quickle,Quertermous,Queal,Quartucci,Quander,Quain,Pynes,Putzel,Purl,Pulizzi,Pugliares,Prusak,Prueter,Protano,Propps,Primack,Prieur,Presta,Preister,Prawl,Pratley,Prairie,Pozzo,Powless,Povey,Pottorf,Pote,Postley,Porzio,Ports,Portney,Ponzi,Pontoriero,Ponto,Pont,Poncedeleon,Polimeni,Polhamus,Pole,Polan,Poetker,Poellnitz,Podgurski,Plotts,Pliego,Plaugher,Plantenberg,Plair,Plagmann,Pizzitola,Pittinger,Pitcavage,Pischke,Piontek,Pintar,Pinnow,Pinneo,Pinley,Pingel,Pinello,Pimenta,Pillard,Piker,Pietras,Piere,Picasso,Phillps,Pfleger,Pfahl,Pezzuti,Petruccelli,Petrello,Peteet,Pescatore,Peruzzi,Perusse,Perotta,Perona,Perini,Peretti,Perelman,Perciful,Peppin,Pennix,Pennino,Penalosa,Pemble,Pelz,Peltzer,Pelphrey,Pelote,Pellum,Pellecchia,Pelikan,Peitz,Peels,Pebworth,Peary,Pawlicki,Pavelich,Paster,Pasquarella,Paskey,Paseur,Paschel,Parslow,Parrow,Parrot,Parlow,Parlett,Parler,Pargo,Parco,Paprocki,Panepinto,Panebianco,Pandy,Pandey,Pamphile,Pamintuan,Pamer,Paluso,Paleo,Paker,Pagett,Paczkowski,Ozburn,Ovington,Overmeyer,Ouellet,Osterlund,Oslin,Oseguera,Osaki,Orrock,Ormsbee,Orlikowski,Organista,Oregan,Orebaugh,Orabuena,Openshaw,Ontiveroz,Ondo,Omohundro,Ollom,Ollivierre,Olivencia,Oley,Olazabal,Okino,Oki,Offenberger,Oestmann,Ocker,Obar,Oakeson,Nuzum,Nurre,Nowinski,Novosel,Norquist,Nordlie,Noorani,Nonnemacher,Nolder,Njoku,Niznik,Niwa,Niss,Ninneman,Niner,Nimtz,Niemczyk,Nieder,Nicolo,Nichlos,Niblack,Newyear,Newtown,Newill,Newcom,Neverson,Neuhart,Neuenschwande,Nestler,Nenno,Nejman,Neiffer,Neidlinger,Neglia,Needs,Nearing,Nazarian,Navor,Nary,Narayan,Nangle,Nakama,Naish,Naik,Nadolski,Muscato,Murphrey,Murdick,Murchie,Muratalla,Munnis,Mundwiller,Muncey,Munce,Mullenbach,Mulhearn,Mulcahey,Muhammed,Muchow,Mountford,Moudry,Mosko,Morvay,Morrical,Morr,Moros,Mormann,Morgen,Moredock,Morden,Mordarski,Moravek,Morandi,Morale,Mooradian,Montejo,Montegut,Montan,Monsanto,Monford,Moncus,Molinas,Molek,Mohd,Moehrle,Moehring,Modzeleski,Model,Modafferi,Moala,Moake,Miyahira,Mitani,Mischel,Minges,Minella,Mimes,Milles,Milbrett,Milanes,Mikolajczyk,Mikami,Meucci,Metler,Methven,Metge,Messmore,Messerschmidt,Mesrobian,Meservey,Merseal,Menor,Menon,Menear,Melott,Melley,Melfi,Meinhart,Megivern,Megeath,Meester,Meeler,Meegan,Medoff,Medler,Meckley,Meath,Mearns,Mcquigg,Mcpadden,Mclure,Mckellips,Mckeithen,Mcglathery,Mcginnes,Mcghan,Mcdonel,Mccullom,Mccraken,Mccrackin,Mcconathy,Mccloe,Mcclaughry,Mcclaflin,Mccarren,Mccaig,Mcaulay,Mcaffee,Mazzuca,Maytubby,Mayner,Maymi,Mattiello,Matthis,Matthees,Matthai,Mathiason,Mastrogiovann,Masteller,Mashack,Marucci,Martorana,Martiniz,Marter,Martellaro,Marsteller,Marris,Marrara,Maroni,Marolda,Marocco,Maritn,Margo,Maresh,Maready,Marchione,Marbut,Maranan,Maragno,Mapps,Manrriquez,Manny,Mannis,Manni,Mangina,Manganelli,Mancera,Mamon,Maloch,Mallozzi,Maller,Majchrzak,Majano,Mainella,Mahanna,Maertens,Madon,Macumber,Macioce,Machuga,Machlin,Machida,Machala,Mabra,Lynne,Lybbert,Luvert,Lutts,Luttrull,Lupez,Lukehart,Ludewig,Luchsinger,Loyal,Lovecchio,Louissaint,Loughney,Lottie,Lostroh,Lose,Lorton,Lorette,Lopeman,Loparo,Longs,Loner,Londo,Lombera,Lokietek,Loiko,Lohrenz,Lohan,Lofties,Locklar,Lockaby,Lobianco,Loader,Loa,Llano,Livesey,Litster,Liter,Liske,Linsky,Linne,Lindbeck,Limes,Licudine,Leyua,Levie,Letterman,Leonelli,Lenzo,Lenze,Lents,Leitao,Leif,Leidecker,Leibold,Lehne,Legan,Legacy,Lefave,Leehy,Ledue,Lecount,Lecea,Leadley,Lazzara,Lazcano,Lazalde,Layer,Lavi,Lavancha,Lavan,Lav,Laude,Latu,Latty,Lato,Larranaga,Lapidus,Lapenta,Langridge,Langeveld,Langel,Lanes,Landowski,Landgren,Landfried,Lame,Lamattina,Lallier,Lairmore,Lahaie,Lagazo,Lagan,Lafoe,Lafluer,Laflame,Lafevers,Lada,Lacoss,Lachney,Labreck,Labreche,Labay,Laa,Kwasnik,Kuzyk,Kutzner,Kushnir,Kusek,Kurtzman,Kurian,Kulhanek,Kuklinski,Kuh,Kueny,Kuczynski,Kubitz,Kuang,Kruschke,Krous,Krompel,Kritz,Krimple,Kriese,Krenzer,Kreis,Kratzke,Krane,Krage,Kraebel,Kozub,Kozma,Kouri,Koudelka,Kotcher,Kotas,Kostic,Kosh,Kosar,Kopko,Kopka,Kooy,Konigsberg,Konarski,Kolmer,Kohlmeyer,Kobbe,Knoop,Knoedler,Knocke,Knipple,Knippenberg,Knickrehm,Kneisel,Kluss,Klossner,Klipfel,Klawiter,Klasen,Kittles,Kissack,Kirtland,Kirschenmann,Kirckof,Kiphart,Kinstler,Kinion,Kilton,Killman,Kiehl,Kief,Kett,Kesling,Keske,Kerstein,Kepple,Keneipp,Kempson,Kempel,Kelp,Kehm,Kehler,Keh,Keeran,Keedy,Kebert,Keast,Kearbey,Kawaguchi,Kaupu,Kauble,Katzenbach,Kate,Katcher,Kartes,Karpowicz,Karpf,Karen,Karban,Kanzler,Kanarek,Kamper,Kaman,Kalsow,Kalafut,Kaeser,Kaercher,Kaeo,Kaeding,Jurewicz,Julson,Jozwick,Jollie,Johnigan,Johll,Jochum,Jewkes,Jestes,Jeska,Jersey,Jereb,Jayson,Jaurez,Jarecki,Jansma,Janosik,Jandris,Jamin,Jahr,Jacot,Jabs,Ivens,Itson,Isenhower,Iovino,Ionescu,Ingrum,Ingels,Inch,Imrie,Imlay,Ihlenfeld,Ihde,Igou,Ibach,Huyett,Hurry,Huppe,Hultberg,Hullihen,Hugi,Hueso,Huesman,Hsiao,Hronek,Hovde,Housewright,Houlahan,Hougham,Houchen,Hostler,Hoster,Hosang,Hornik,Hornes,Horio,Honyumptewa,Honeyman,Honer,Hommerding,Holsworth,Hollobaugh,Hollinshead,Hollands,Hollan,Holecek,Holdorf,Hokes,Hogston,Hoesly,Hodkinson,Hodgman,Hodgens,Hochstedler,Hochhauser,Hobbie,Hoare,Hnat,Hiss,Hiskey,Hirschy,Hinostroza,Hink,Hing,Hillmer,Hillian,Hillerman,Hietala,Hierro,Hickling,Hickingbottom,Heye,Heubusch,Hesselschward,Herriot,Hernon,Hermida,Hermans,Hentschel,Henningson,Henneke,Henk,Heninger,Heltsley,Helmle,Helminiak,Helmes,Hellner,Hellmuth,Helke,Heitmeyer,Heird,Heinle,Heinicke,Heinandez,Heimsoth,Heimlich,Heibel,Hegyi,Heggan,Hefel,Heeralall,Hedrington,Heacox,Hazlegrove,Hazelett,Haymore,Havenhill,Hautala,Hascall,Harvie,Hartrick,Hartling,Harrer,Harles,Hargenrader,Hanshew,Hanly,Hankla,Hanisch,Hancox,Hammann,Hambelton,Halseth,Hallisey,Halleck,Hallas,Haisley,Hairr,Hainey,Hainer,Hailstock,Haertel,Guzek,Guyett,Guster,Gussler,Gurwitz,Gurka,Gunsolus,Guinane,Guiden,Gugliotti,Guevin,Guevarra,Guerard,Gudaitis,Guadeloupe,Gschwind,Grupe,Grumbach,Gruenes,Gruenberg,Grosser,Grom,Grodski,Groden,Grizzel,Gritten,Griswald,Grishaber,Grinage,Grimwood,Grims,Griffon,Griffies,Gribben,Grew,Gressley,Gren,Greenstreet,Grealish,Gravett,Grantz,Granfield,Granade,Gowell,Gossom,Gorsky,Goring,Goodnow,Goodfriend,Goodemote,Golob,Gollnick,Golladay,Goldwyn,Goldsboro,Golds,Goldrick,Gohring,Gohn,Goettsch,Goertzen,Goelz,Godinho,Goans,Glumac,Gleisner,Gleen,Glassner,Glanzer,Gladue,Gjelaj,Givhan,Girty,Girone,Girgenti,Giorgianni,Gilpatric,Gillihan,Gillet,Gilbar,Gierut,Gierhart,Gibert,Gianotti,Giannetto,Gianelli,Giambanco,Gharing,Geurts,Gettis,Gettel,Gest,Germani,Gerdis,Gerbitz,Geppert,Gennings,Gemmer,Gelvin,Gellert,Gehler,Geddings,Gearon,Geach,Gazaille,Gayheart,Gauld,Gaukel,Gaudio,Gato,Gathing,Gasque,Garstka,Garsee,Garringer,Garofano,Garo,Garnsey,Garigen,Garcias,Garbe,Ganoung,Ganfield,Ganaway,Gamero,Galuska,Galster,Gallacher,Galinski,Galimi,Galik,Galeazzi,Galdo,Galdames,Galas,Galanis,Gaglio,Gaff,Gaeddert,Gadapee,Fussner,Furukawa,Fuhs,Fuerte,Fuerstenberg,Fryrear,Fruits,Froese,Fringer,Frieson,Friesenhahn,Frieler,Friede,Freymuth,Freyman,Freudenberg,Freman,Fredricksen,Frech,Frasch,Frantum,Frankin,Franca,Frago,Fragnoli,Fouquet,Fossen,Foskett,Forner,Formosa,Formisano,Forget,Fooks,Fons,Folino,Flott,Floor,Flesch,Flener,Flemmons,Flattery,Flanagin,Flamino,Flamand,Fitzerald,Findling,Filsinger,Fillyaw,Fillinger,Fiechter,Ferre,Ferdon,Feldkamp,Fazzio,Favia,Faulconer,Faughnan,Faubel,Fassler,Faso,Farrey,Farrare,Farnworth,Farland,Fairrow,Faille,Faherty,Fagnant,Fabula,Fabbri,Eylicio,Esteve,Estala,Espericueta,Escajeda,Erlich,Equia,Epson,Enrriquez,Enomoto,Enmon,Engemann,Emmerson,Emmel,Emler,Emilio,Elstad,Ellwein,Ellerson,Eliott,Eliassen,Elchert,Eisenbeis,Eisel,Eikenberry,Eichholz,Ehmer,Edris,Edgerson,Echenique,Eberley,Eans,Dziuk,Dykhouse,Dworak,Dutt,Dupas,Duntz,Dunshee,Dunovant,Dunnaway,Dummermuth,Duerson,Duddy,Ducotey,Duchon,Duchesneau,Ducci,Dubord,Duberry,Dubach,Drummonds,Droege,Drish,Drier,Drexel,Dresch,Dresbach,Drenner,Drechsler,Dowen,Dotter,Dosreis,Doser,Dorward,Dorin,Dorf,Door,Domeier,Doler,Doleman,Dolbow,Dolbin,Dobrunz,Dobransky,Dobberstein,Dlouhy,Diosdado,Dingmann,Dimmer,Dimarino,Dimaria,Dilly,Dillenburg,Dilaura,Dieken,Dickhaus,Dibbles,Dibben,Diamante,Dewilde,Dewaard,Devich,Devenney,Devaux,Dettinger,Desroberts,Dershem,Dersch,Derita,Derickson,Depina,Deorio,Deoliveira,Denzler,Dentremont,Denoble,Demshar,Demond,Demint,Demichele,Demel,Delzer,Delval,Delorbe,Delli,Delbridge,Delanoy,Delancy,Delahoya,Dekle,Deitrick,Deis,Dehnert,Degrate,Defrance,Deetz,Deeg,Decoster,Decena,Dearment,Daughety,Datt,Darrough,Danzer,Dante,Danielovich,Dandurand,Dancause,Dalo,Dalgleish,Daisley,Daft,Dadlani,Daddona,Daddio,Dacpano,Cyprian,Cutillo,Cush,Curz,Curvin,Cuna,Cumber,Cullom,Cudworth,Cubas,Crysler,Cryderman,Crummey,Crumbly,Crookshanks,Croes,Criscione,Crimes,Crespi,Cresci,Creaser,Craton,Cramp,Cradle,Cowin,Cowdrey,Coutcher,Cotterman,Cosselman,Cosgriff,Cortner,Corsini,Corporan,Corniel,Cornick,Cordts,Cordial,Copening,Coolman,Connick,Conlisk,Conelli,Common,Comito,Colten,Colling,Colletta,Coldivar,Colclasure,Colantuono,Colaizzi,Coggeshall,Cockman,Cockfield,Cobourn,Cobo,Cobarrubias,Clyatt,Cloney,Clonch,Climes,Cleckner,Clearo,Claybourne,Clavin,Claridge,Claffey,Ciufo,Cisnero,Cipollone,Cieslik,Ciejka,Cichocki,Cicchetti,Cianflone,Chrusciel,Christesen,Chmielowiec,Chirino,Chillis,Chihuahua,Chhoun,Chevas,Chehab,Chaviano,Chavaria,Chasten,Charbonnet,Chanley,Champoux,Champa,Chalifoux,Cerio,Cedotal,Cech,Cavett,Cavendish,Catoire,Castronovo,Castellucci,Castellow,Castaner,Casso,Cassels,Cassatt,Cassar,Cashon,Cartright,Carros,Carrisalez,Carrig,Carrejo,Carnicelli,Carnett,Carlise,Carline,Carhart,Caren,Cardova,Cardell,Carchi,Caram,Caquias,Capper,Capizzi,Capano,Cannedy,Campese,Calvello,Callon,Callins,Callies,Callicutt,Calix,Calin,Califf,Calderaro,Caldeira,Cadriel,Cadmus,Cadman,Caccamise,Buys,Buttermore,Butay,Bustamente,Busa,Burmester,Burkard,Burhans,Burgert,Bure,Burdin,Bullman,Bulin,Buelna,Buehner,Budin,Buco,Buckhanon,Bryars,Brutger,Brus,Brumitt,Brum,Bruer,Brucato,Broyhill,Broy,Brownrigg,Brownie,Brossart,Brookings,Broden,Brocklehurst,Brockert,Bristo,Briskey,Brisbane,Bringle,Bries,Briar,Bressman,Bren,Branyan,Brands,Bramson,Brammell,Brallier,Bozich,Boysel,Bowthorpe,Bowron,Bowin,Boutilier,Boulos,Boullion,Boughter,Bottiglieri,Borruso,Borrow,Borreggine,Borns,Borkoski,Borghese,Borenstein,Boran,Bora,Booton,Bonvillain,Bonini,Bong,Bonello,Bolls,Boitnott,Boike,Bohnet,Bohnenkamp,Bohmer,Boeson,Boeneke,Bodey,Bocchino,Bobrowski,Bobic,Bluestein,Bloomingdale,Blogg,Blewitt,Blenman,Bleck,Blaszak,Blankenbeckle,Blando,Blanchfield,Blancato,Blalack,Blakenship,Blackett,Bisping,Birkner,Birckhead,Bingle,Bineau,Billiel,Bigness,Bies,Bierer,Bhalla,Beyerlein,Bew,Betesh,Besler,Berzins,Bertalan,Berntsen,Berna,Bergo,Berganza,Bennis,Benney,Benkert,Benjamen,Benincasa,Bengochia,Bendle,Bendana,Benchoff,Benbrook,Belsito,Belshaw,Belinsky,Belak,Bela,Beigert,Beidleman,Behen,Befus,Beel,Beebee,Bedonie,Beckstrand,Beckerle,Beato,Bears,Bauguess,Baughan,Bauerle,Battis,Batis,Bastone,Bastille,Bassetti,Bashor,Bary,Bartunek,Bartoletti,Barro,Barno,Barnicle,Barlage,Barkus,Barkdull,Bari,Barcellos,Barbarino,Baranski,Baranick,Bankert,Banchero,Ban,Bambrick,Bamberg,Bambenek,Balthrop,Balmaceda,Ballman,Balistrieri,Balcomb,Balboni,Balbi,Bakshi,Bagner,Bagent,Badasci,Bacot,Bache,Babu,Babione,Babic,Babers,Babbs,Awkward,Avitabile,Avers,Avena,Avance,Ausley,Auker,Audas,Aud,Aubut,Athearn,Atcheson,Astorino,Asplund,Aslanian,Askari,Ashmead,Asby,Asai,Arterbury,Artalejo,Arqueta,Arquero,Arostegui,Arnell,Armeli,Arista,Arender,Arca,Arballo,Aprea,Applen,Applegarth,Apfel,Antonello,Antolin,Antkowiak,Angis,Angione,Angerman,Angelilli,Andujo,Andrick,Anderberg,Amigon,Ambers,Amalfitano,Alviso,Alvez,Altice,Altes,Almarez,Allton,Allston,Allgeyer,Allegretti,Aliaga,Algood,Alberg,Albarez,Albaladejo,Akre,Aitkin,Ahles,Ahlberg,Agnello,Adrien,Adinolfi,Adamis,Abramek,Abolt,Abitong,Zurich,Zurawski,Zufall,Zubke,Zizzo,Zipperer,Zinner,Zinda,Ziller,Zill,Zevallos,Zesati,Zenzen,Zentner,Zellmann,Zelinsky,Zboral,Zarcone,Zapalac,Zaldana,Zakes,Zaker,Zahniser,Zacherl,Zabawa,Zabaneh,Yum,Youse,Youree,Younis,Yorty,Yonce,Yero,Yerkey,Yeck,Yeargan,Yauch,Yashinski,Yambo,Xiang,Wrinn,Wrightsman,Worton,Wortley,Worland,Woolworth,Woolfrey,Woodhead,Woltjer,Wolfenden,Wolden,Wolchesky,Wojick,Woessner,Witwer,Witters,Witchard,Wissler,Wisnieski,Wisinski,Winnike,Winkowski,Winkels,Wingenter,Wineman,Winegardner,Wimpy,Wilridge,Wilmont,Willy,Willians,Williamsen,Wilhide,Wilhelmsen,Wilhelmi,Wildrick,Wilden,Wiland,Wiker,Wigglesworth,Wiebusch,Widdowson,Wiant,Wiacek,Whittet,Whitter,Whitelock,Whiteis,Whiley,Westrope,Westpfahl,Westin,Wessman,Wessinger,Wesemann,Wesby,Wertheimer,Weppler,Wenke,Wengler,Wender,Welp,Weitzner,Weissberg,Weisenborn,Weipert,Weiman,Weidmann,Wehrsig,Wehrenberg,Weemes,Weeman,Wayner,Waston,Wasicek,Wascom,Wasco,Warmath,Warbritton,Waltner,Wallenstein,Waldoch,Waldal,Wala,Waide,Wadlinger,Wadhams,Vullo,Voorheis,Vonbargen,Volner,Vollstedt,Vollman,Vold,Voge,Vittorio,Virtue,Virginia,Violett,Viney,Vinciguerra,Vinal,Villata,Villarrvel,Vilanova,Vigor,Vigneault,View,Vielma,Veyna,Vessella,Versteegh,Verderber,Venier,Venice,Venditti,Velotta,Vejarano,Veil,Vecchia,Vecchi,Vastine,Vasguez,Varella,Vanry,Vannah,Vanhyning,Vanhuss,Vanhoff,Vanhoesen,Vandivort,Vandevender,Vanderlip,Vanderkooi,Vandebrink,Vancott,Vallien,Vallas,Vallandingham,Valiquette,Valasek,Vahey,Vagott,Uyematsu,Urbani,Uran,Upp,Uno,Union,Umbach,Udo,Tyon,Tyma,Twyford,Twombley,Twohig,Tutterrow,Turnes,Turkington,Turchi,Tunks,Tumey,Tumbaga,Tuinstra,Tsukamoto,Tschetter,Trussel,Trubey,Trovillion,Troth,Trostel,Tron,Trinka,Trine,Tribbey,Triarsi,Trevor,Treto,Trautz,Tragesser,Tooman,Toolson,Tonozzi,Tomkiewicz,Tomb,Tomasso,Tolin,Tolfree,Toelle,Tisor,Tiry,Tinstman,Timmermann,Tillie,Tickner,Tiburcio,Thunberg,Thronton,Thompsom,Theil,Thayne,Thaggard,Teschner,Tensley,Tenery,Tempest,Tellman,Tellado,Telep,Teigen,Teator,Teall,Tayag,Tavis,Tattersall,Tassoni,Tarshis,Tappin,Tappe,Tansley,Talone,Talford,Tainter,Taha,Taguchi,Tacheny,Tabak,Szymczyk,Szwaja,Szopinski,Sze,Syvertsen,Swogger,Switcher,Swist,Swilling,Swierczek,Swiech,Swickard,Swiatek,Swezey,Swepson,Sweezy,Swaringen,Swanagan,Swailes,Swade,Sveum,Svenningsen,Svec,Suttie,Supry,Sunga,Summerhill,Summars,Sulit,Stys,Stutesman,Stupak,Stumpo,Stuller,Stuekerjuerge,Stuckett,Stuckel,Stuchlik,Stuard,Strutton,Strop,Stromski,Stroebel,Strehlow,Strause,Strano,Straney,Stradling,Stoyle,Stormo,Stopyra,Stoots,Stoop,Stonis,Stoltenburg,Stoiber,Stoessel,Stitzer,Stien,Stichter,Stezzi,Stewert,Stepler,Steinkraus,Stegemann,Steeples,Steenburg,Steeley,Staszak,Stasko,Starkson,Stanwick,Stanke,Stanifer,Stangel,Stain,Stai,Squiers,Sprout,Springsteen,Spraglin,Spragins,Spraberry,Spoelstra,Spisak,Spirko,Spille,Spidel,Speyer,Speroni,Spenst,Speak,Spartz,Sparlin,Sparacio,Spaman,Spainhower,Sow,Souers,Souchet,Sosbee,Sorn,Sorice,Sorbo,Soqui,Somer,Solon,Soehl,Sodergren,Socorro,Sobie,Smucker,Smsith,Smoley,Smolensky,Smolenski,Smolder,Smethers,Slusar,Slowey,Slonski,Slemmons,Slatkin,Slates,Slappy,Slaney,Slagter,Slacum,Skutnik,Skrzypek,Skibbe,Sjostrom,Sjoquist,Sivret,Sitko,Sisca,Sinnett,Sineath,Simoni,Simar,Simao,Silvestro,Silleman,Silkwood,Silha,Silfies,Silberhorn,Silacci,Sigrist,Sieczkowski,Sieczka,Shure,Shulz,Shugrue,Shrode,Shown,Shovlin,Shortell,Shonka,Shiyou,Shiraishi,Shiplett,Sheu,Shermer,Sherick,Sheng,Sheeks,Shed,Sharron,Shantz,Shakir,Shaheed,Shadoan,Shadid,Shackford,Shabot,Seung,Seufert,Setty,Setters,Servis,Server,Serres,Serrell,Serpico,Serpas,Serafine,Sensenig,Senft,Semenec,Semen,Semas,Semaan,Selvera,Sellmeyer,Sek,Segar,Seever,Seeney,Seeliger,Seehafer,Seebach,Sebben,Seaward,Seary,Searl,Searby,Scotland,Scordino,Scolieri,Scolaro,Schwiebert,Schwartze,Schwaner,Schuur,Schupbach,Schumacker,Schum,Schudel,Schubbe,Schroader,Schramel,Schollmeyer,Schoenherr,Schoeffler,Schoeder,Schnurr,Schnorr,Schneeman,Schnake,Schnaible,Schmaus,Schlotter,Schinke,Schimming,Schimek,Schikora,Scheulen,Scherping,Schermer,Scherb,Schember,Schellhase,Schedler,Schanck,Schaffhauser,Schaffert,Schadler,Scarola,Scarfo,Scarff,Scantling,Scaff,Sayward,Sayas,Saxbury,Savin,Savel,Savastano,Savannah,Sault,Satre,Sarkar,Santellan,Sandmeier,Sampica,Salvesen,Saltis,Salloum,Salling,Salce,Salatino,Salata,Salamy,Safe,Sadowsky,Sadlier,Sabbatini,Sabatelli,Sabal,Sabados,Rydzewski,Rybka,Rybczyk,Ruz,Rusconi,Rupright,Rufino,Ruffalo,Rudiger,Rudig,Ruda,Rubyor,Royea,Roxberry,Rover,Rouzer,Roumeliotis,Roston,Rossmann,Rosko,Rosetta,Rosene,Rosenbluth,Roseland,Rosasco,Rosano,Rosal,Rorabaugh,Romie,Romaro,Rolstad,Rollow,Rohrich,Roghair,Rogala,Roets,Roen,Roemmich,Roelfs,Roeker,Roedl,Roedel,Rodeheaver,Roddenberry,Rockstad,Rocchi,Robirds,Robben,Robasciotti,Robaina,Rizzotto,Rizzio,Rittle,Ritcher,Rissman,Riseden,Ripa,Rion,Rintharamy,Rinehimer,Rinck,Riling,Rike,Rietschlin,Riesenberg,Riemenschneid,Rieland,Rickenbaugh,Rickenbach,Riches,Rhody,Revells,Reutter,Respress,Resnik,Renton,Remmel,Reitmeyer,Reitan,Reister,Reinstein,Reino,Reinkemeyer,Reifschneider,Reierson,Reichle,Rehmeier,Rehl,Regine,Reeds,Rede,Records,Recar,Rebeiro,Raybourn,Rawl,Rautio,Raugust,Raudenbush,Raudales,Rattan,Rashad,Rapuano,Rapoport,Rantanen,Ransbottom,Raner,Ramkissoon,Rambousek,Raio,Rainford,Radakovich,Rad,Rabenhorst,Quivers,Quispe,Quintin,Quinoes,Quince,Quilici,Quattrone,Quates,Quance,Quale,Purswell,Purpora,Pulera,Pulcher,Puckhaber,Pryer,Pruyne,Pruit,Prudencio,Prows,Protzman,Prothero,Prospero,Prosperi,Prospal,Privott,Pritchet,Priem,Prest,Prell,Preer,Pree,Preddy,Preda,Pravata,Pradhan,Potocki,Postier,Postema,Posse,Posadas,Poremba,Popper,Popichak,Ponti,Pomrenke,Pomponi,Pomarico,Pollok,Polkinghorn,Polino,Pock,Plough,Plenty,Plater,Plagman,Pipher,Pinzone,Pinkleton,Pillette,Pillers,Pill,Pilapil,Pignone,Pignatelli,Piersol,Piepho,Picton,Pickrel,Picket,Pichard,Picchi,Piatek,Pharo,Phanthanouvon,Pettingill,Pettinato,Petrovits,Pethtel,Petersheim,Pershing,Perrez,Perra,Pergram,Peretz,Perego,Perches,Pennello,Pennella,Pennant,Pendry,Penaz,Pellish,Peeks,Pecanty,Peare,Paysour,Pavlovich,Pavick,Pavelko,Paustian,Patzer,Patsy,Patete,Patadia,Paszkiewicz,Pase,Pasculli,Pascascio,Parrotte,Parlor,Parajon,Paparo,Papandrea,Paone,Pantaleon,Panning,Paniccia,Pancho,Panarello,Palmeter,Pallan,Palardy,Pahmeier,Padget,Padel,Oyster,Oya,Oxborrow,Oveson,Outwater,Ottaway,Otake,Ostermeyer,Osmer,Osinski,Osiecki,Oroak,Orndoff,Orms,Orkin,Oregon,Ordiway,Opatz,Onsurez,Onishi,Oliger,Okubo,Okoye,Ohlmann,Offord,Offner,Offerdahl,Oesterle,Oesch,Odonnel,Odeh,Odebralski,Obie,Obermeier,Oberhausen,Obenshain,Obenchain,Oats,Nute,Nulty,Norrington,Norlin,Nore,Nordling,Nordhoff,Norder,Nordan,Norals,Nogales,Noboa,Nitsche,Niermann,Nienhaus,Niedringhaus,Niedbalski,Nicolella,Nicolais,Nickleberry,Nicewander,Newfield,Neurohr,Neumeier,Netterville,Nersesian,Nern,Nerio,Nerby,Nerbonne,Neitz,Neighbours,Neighbor,Neidecker,Neat,Neason,Nead,Navratil,Naves,Nastase,Nasir,Nasca,Narine,Narimatsu,Nard,Narayanan,Nappo,Namm,Nalbone,Nakonechny,Nabarro,Myott,Muthler,Muscatello,Murriel,Murin,Murders,Muoio,Mundel,Munafo,Mulch,Mukherjee,Muffoletto,Muessig,Muckey,Mucher,Mruk,Moyd,Mowell,Mowatt,Moutray,Mourning,Mou,Motzer,Moster,Mortis,Morgenroth,Morga,Morataya,Montross,Montezuma,Monterroza,Montemarano,Montello,Montbriand,Montavon,Montaque,Monigold,Monforte,Molgard,Moleski,Mohsin,Mohead,Mofield,Moerbe,Moeder,Mochizuki,Miyazaki,Miyasaki,Mital,Miskin,Mischler,Minus,Minniear,Minero,Milosevic,Mildenhall,Mila,Mikhail,Mielsch,Midden,Michonski,Michniak,Michitsch,Michelotti,Micheli,Michelfelder,Michand,Miao,Metelus,Merkt,Merando,Meranda,Mentz,Meneley,Menaker,Memory,Melino,Meir,Mehaffy,Meehl,Meech,Meczywor,Mcweeney,Mcumber,Mcredmond,Mcneer,Mcnay,Mcmikle,Mcmaken,Mclaurine,Mclauglin,Mclaney,Mckune,Mckinnies,Mckague,Mchattie,Mcgrapth,Mcglothen,Mcgath,Mcfolley,Mcdannell,Mccurty,Mccort,Mcclymonds,Mcclimon,Mcclamy,Mccaughan,Mccartan,Mccan,Mccadden,Mcburnie,Mcburnett,Mcbryar,Mcannally,Mcalevy,Mcaleese,Maytorena,Mayrant,Mayol,Mayland,Mayeaux,Mauter,Matthewson,Mathiew,Matern,Matera,Maslow,Mashore,Masaki,Maruco,Martorell,Martenez,Marry,Marrujo,Marrison,Maroun,Markway,Markos,Markoff,Markman,Marian,Marello,Marbry,Marban,Maranda,Maphis,Manuele,Mansel,Manganello,Mandrell,Mandoza,Manard,Manago,Maltba,Mallick,Mallak,Maline,Malikowski,Majure,Majcher,Maise,Mahl,Maffit,Maffeo,Madueno,Madlem,Madariaga,Macvane,Mackler,Macconnell,Macchi,Maccarone,Lyng,Lynchard,Lura,Lunning,Luneau,Lunden,Lumbra,Lumbert,Lueth,Ludington,Luckado,Lucchini,Lucatero,Luallen,Lozeau,Lowen,Lovera,Lovelock,Louck,Lothian,Lorio,Lorimer,Lorge,Loretto,Longhenry,Lonas,Loiseau,Lohrman,Logel,Loft,Locks,Lockie,Llerena,Livington,Liuzzi,Liscomb,Lippeatt,Liou,Linhardt,Lindelof,Lindbo,Limehouse,Limage,Lillo,Lillian,Lilburn,Liggons,Lidster,Liddy,Liddick,Lich,Liberato,Lian,Lia,Leysath,Lewelling,Lesney,Leser,Lescano,Leonette,Lentsch,Lenius,Lemmo,Lemming,Lemcke,Lein,Leggette,Legerski,Legard,Leever,Leete,Ledin,Lecomte,Lecocq,Leakes,Leab,Lazarz,Layous,Lawrey,Lawery,Lauze,Lautz,Laughinghouse,Latulippe,Lattus,Lattanzio,Later,Lascano,Larmer,Laris,Larcher,Laprise,Lapin,Lapage,Lano,Langseth,Langman,Langland,Landstrom,Landsberg,Landsaw,Landram,Lamphier,Lamendola,Lamberty,Lakhani,Laker,Lajara,Lagrow,Lagman,Ladewig,Laderman,Ladden,Lacrue,Laclaire,Lachut,Lachner,Kwit,Kvamme,Kvam,Kutscher,Kushi,Kurgan,Kunsch,Kundert,Kun,Kulju,Kukene,Kudo,Kubin,Kubes,Kuberski,Krystofiak,Kruppa,Krul,Krukowski,Kruegel,Kronemeyer,Krock,Kriston,Kretzer,Krenn,Kralik,Krafft,Krabill,Kozisek,Kovich,Koverman,Kovatch,Kovarik,Kotlowski,Kosmala,Kosky,Kosir,Kosa,Korpi,Kornbluth,Koppen,Kooistra,Kohlhepp,Kofahl,Koeneman,Koebel,Koczur,Kobrin,Kobashigawa,Koba,Knuteson,Knoff,Knoble,Knipper,Knierim,Kneisley,Klusman,Kloc,Klitzing,Klinko,Klinefelter,Klemetson,Kleinpeter,Klauser,Klatte,Klaren,Klare,Kissam,Kirkhart,Kirchmeier,Kinzinger,Kindt,Kincy,Kincey,Kimoto,Killingworth,Kilcullen,Kilbury,Kietzman,Kienle,Kiedrowski,Kidane,Khamo,Khalili,Ketterling,Ketchem,Kessenich,Kessell,Kepp,Kenon,Kenning,Kennady,Kendzior,Kemppainen,Kellermann,Keirns,Keilen,Keiffer,Kehew,Keelan,Keawe,Keator,Kealy,Keady,Kathman,Kastler,Kastanes,Kassab,Karren,Karpin,Karau,Karathanasis,Kara,Kaps,Kaplun,Kapaun,Kannenberg,Kanipe,Kander,Kandel,Kanas,Kanan,Kamke,Kaltenbach,Kallenberger,Kallam,Kali,Kaley,Kafton,Kafer,Kabler,Kaaihue,Jupiter,Jundt,Jubilee,Jovanovich,Jojola,Johnstad,Jodon,Joachin,Jinright,Jew,Jessick,Jeronimo,Jerald,Jenne,Jelsma,Jeannotte,Jeangilles,Jaworsky,Jaubert,Jarry,Jarrette,Jarreau,Jarett,Janos,Janecka,Janczak,Jalomo,Jagoda,Jagla,Jacquier,Jaber,Iwata,Ivanoff,Isola,Iserman,Isais,Isaacks,Iron,Inverso,Infinger,Ibsen,Hyser,Hylan,Hybarger,Hwee,Hutchenson,Hutchcroft,Husar,Hurlebaus,Hunsley,Hunker,Hummingbird,Humberson,Hulst,Hulon,Huhtala,Hugill,Hugghins,Huffmaster,Huckeba,Hrabovsky,Howden,Hoverson,Houts,Houskeeper,Housh,Hosten,Horras,Horchler,Hor,Hopke,Hooke,Honie,Holtsoi,Holsomback,Holoway,Holmstead,Hoistion,Hohnstein,Hoheisel,Hoguet,Hoggle,Hogenson,Hoffstetter,Hoffler,Hoffa,Hofe,Hoefling,Hoague,Hizer,Hirschfield,Hironaka,Hiraldo,Hinote,Hingston,Hind,Hinaman,Hillie,Hillesheim,Hilderman,Hiestand,Heyser,Heys,Hews,Hew,Hertler,Herrero,Herrandez,Heppe,Henle,Henkensiefken,Henigan,Henandez,Henagan,Hemberger,Heman,Helser,Helmich,Hellinger,Helfrick,Heldenbrand,Heinonen,Heineck,Heikes,Heidkamp,Heglar,Heffren,Heelan,Hedgebeth,Heckmann,Heckaman,Hechmer,Hazelhurst,Hawken,Haverkamp,Havatone,Hausauer,Hasch,Harwick,Hartse,Harts,Harrower,Harle,Hargroder,Hardway,Hardinger,Hardemon,Harbeck,Hant,Hamre,Hamberg,Hallback,Haisten,Hailstone,Hahl,Hagner,Hagman,Hagemeyer,Haeussler,Hackwell,Haby,Haataja,Gverrero,Gustovich,Gustave,Guske,Gushee,Gurski,Gurnett,Gura,Gunto,Gunselman,Gugler,Gudmundson,Gudinas,Guarneri,Grumbine,Gruis,Grotz,Grosskopf,Grosman,Grosbier,Grinter,Grilley,Grieger,Grewal,Gressler,Greaser,Graus,Grasman,Graser,Grannan,Granath,Gramer,Graboski,Goyne,Gowler,Gottwald,Gottesman,Goshay,Gorr,Gorovitz,Gores,Goossens,Goodier,Goodhue,Gonzeles,Gonzalos,Gonnella,Golomb,Golick,Golembiewski,Goeke,Godzik,Goar,Glosser,Glendenning,Glendening,Glatter,Glas,Gittings,Gitter,Gisin,Giscombe,Gimlin,Gillitzer,Gillick,Gilliand,Gilb,Gigler,Gidden,Gibeau,Gibble,Gianunzio,Giannattasio,Gertelman,Gerosa,Gerold,Gerland,Gerig,Gerecke,Gerbino,Genz,Genovesi,Genet,Gelrud,Geitgey,Geiszler,Gehrlein,Gazzo,Gawrys,Gavilanes,Gaulden,Gate,Garthwaite,Garmoe,Gargis,Gara,Gannett,Galligher,Galler,Galleher,Gallahan,Galford,Gal,Gahn,Gacek,Gabert,Fuster,Furuya,Furse,Fujihara,Fuhriman,Fruit,Frueh,Fromme,From,Froemming,Friskney,Frietas,Freiler,Freelove,Freber,Frear,Frankl,Frankenfield,Franey,Francke,Foxworthy,Formella,Foringer,Forgue,Forge,Fonnesbeck,Fonceca,Folland,Fodera,Fode,Floresca,Fleurent,Fleshner,Flentge,Fleischhacker,Fleeger,Flecher,Flam,Flair,Flaim,Fivecoat,Firebaugh,Fioretti,Finucane,Filley,Figuroa,Figuerda,Fiddelke,Feurtado,Fetterly,Fessel,Femia,Feild,Fehling,Fegett,Fedde,Fechter,Fawver,Faustino,Faulhaber,Fatchett,Fassnacht,Fashaw,Fasel,Farrugia,Farran,Farness,Farhart,Farbman,Fama,Falwell,Falvo,Falling,Falkenstein,Falin,Failor,Faigin,Fagundo,Fague,Fagnan,Fagerstrom,Faden,Eytchison,Eyles,Ewy,Evon,Everage,Evangelist,Estrin,Estorga,Esponda,Espindola,Escher,Esche,Escarsega,Escandon,Erven,Erding,Eplin,Enix,Englade,Engdahl,Enck,Emmette,Embery,Emberson,Eltzroth,Else,Elsayed,Ellerby,Ellens,Elhard,Elfers,Elazegui,Eisermann,Eilertson,Eiben,Ehrhard,Ehresman,Egolf,Egnew,Eggins,Efron,Effland,Eduardo,Edminster,Edgeston,Ede,Eckstrom,Eckhard,Eckford,Echoles,Ebsen,Eatherly,Eastlick,Earnheart,Ear,Dykhuizen,Dyas,Duttweiler,Dutka,Dutch,Dusenbury,Dusenbery,Durre,Durnil,Durnell,Durie,Durhan,Durando,Dupriest,Dunsmoor,Dunseith,Dunnum,Dunman,Dunlevy,Duma,Dulude,Dulong,Duignan,Dugar,Dufek,Ducos,Duchaine,Duch,Dubow,Drowne,Dross,Drollinger,Droke,Driggars,Dredge,Drawhorn,Drach,Drabek,Doyne,Doukas,Dorvil,Dorow,Doroski,Dornak,Dormer,Dorian,Donnelson,Donna,Donn,Donivan,Dondero,Dompe,Dolle,Doakes,Diza,Dixie,Divirgilio,Ditore,Distel,Disimone,Disbro,Dipiero,Dingson,Diluzio,Dillehay,Dilbert,Digiorgio,Diflorio,Dietzler,Dietsch,Dieterle,Dierolf,Dierker,Dicostanzo,Dicesare,Dexheimer,Dewitte,Dewing,Devoti,Devincentis,Devary,Deutschman,Dettloff,Detienne,Destasio,Dest,Despard,Desmet,Deslatte,Desfosses,Derise,Derenzo,Deppner,Depolo,Denoyer,Denoon,Denno,Denne,Deniston,Denike,Denes,Demoya,Demick,Demicco,Demetriou,Demange,Delva,Delorge,Delley,Delisio,Delhoyo,Delgrande,Delgatto,Delcour,Delair,Deinert,Degruy,Degrave,Degeyter,Defino,Deffenbaugh,Deener,Decook,Decant,Deboe,Deblanc,Deatley,Dearmitt,Deale,Deaguiar,Dayan,Daus,Dauberman,Datz,Dase,Dary,Dartt,Darocha,Dario,Dari,Dardis,Dapper,Danowski,Dancel,Dami,Dallmann,Dalere,Dalba,Dakan,Daise,Dailing,Dahan,Dagnan,Daggs,Dagan,Czarkowski,Czaplinski,Cutten,Curtice,Curenton,Cure,Curboy,Cura,Culliton,Culberth,Cucchiara,Cubbison,Csaszar,Crytser,Crotzer,Crossgrove,Crosser,Croshaw,Croissant,Crocco,Critzer,Creveling,Cressy,Creps,Creese,Cratic,Crate,Craigo,Craigen,Craib,Cracchiolo,Crable,Coykendall,Cowick,Coville,Couzens,Coutch,Cousens,Cousain,Counselman,Coult,Cotterell,Cott,Cotham,Corsaut,Corriere,Corredor,Cornet,Cornelia,Corkum,Coreas,Cordoza,Corbet,Corathers,Conwill,Contreas,Consuegra,Constanza,Conolly,Conedy,Companion,Comins,Combee,Colosi,Colom,Colmenares,Collymore,Colleran,Colina,Colaw,Colatruglio,Colantro,Colantonio,Cohea,Cogill,Codner,Code,Codding,Cockram,Cocanougher,Cobine,Cluckey,Clucas,Cloward,Cloke,Clisham,Clipper,Clinebell,Cliffe,Clendenen,Cisowski,Cirelli,Ciraolo,Ciocca,Cintora,Ciesco,Cibrian,Chupka,Chugg,Christmann,Choma,Chiverton,Chirinos,Chinen,Chimenti,Chima,Cheuvront,Chesla,Chesher,Chesebro,Chern,Chehebar,Cheatum,Chastine,Chapnick,Chapelle,Chambley,Cercy,Celius,Celano,Cayea,Cavicchi,Cattell,Catanach,Catacutan,Castelluccio,Castellani,Cassmeyer,Cassetta,Cassada,Caspi,Cashmore,Casebier,Casanas,Carrothers,Carrizal,Carriveau,Carretero,Carradine,Carosella,Carnine,Carmel,Carloni,Carkhuff,Cardosi,Cardo,Carchidi,Caravello,Caranza,Carandang,Capes,Cantrall,Canpos,Canoy,Cannizzaro,Canion,Canida,Canham,Cangemi,Cange,Candle,Cancelliere,Canard,Camarda,Calverley,Calogero,Callendar,Calame,Cadrette,Cachero,Caccavale,Cabreros,Cabrero,Cabrara,Cabler,Butzer,Butte,Butrick,Butala,Bustios,Busser,Busic,Bushorn,Busher,Burmaster,Burl,Burkland,Burkins,Burkert,Burgueno,Burgraff,Buren,Burel,Burdon,Burck,Burby,Buoy,Bunk,Bumford,Bulock,Bujnowski,Buggie,Buffy,Budine,Bucciero,Bubier,Brzoska,Brydges,Brumlow,Brosseau,Brooksher,Brokke,Broeker,Brittin,Bristle,Briano,Briand,Brettschneide,Bresnan,Brentson,Brenneis,Brender,Brazle,Brassil,Brasington,Branstrom,Branon,Branker,Brandwein,Brandau,Brana,Bralley,Brailey,Brague,Brade,Bozzi,Bownds,Bowmer,Bournes,Bour,Bouchey,Botto,Boteler,Borroel,Borra,Boroski,Boothroyd,Boord,Bonny,Bonga,Bonato,Bonadonna,Bolejack,Boldman,Boiser,Boggio,Bogacki,Boerboom,Boehnlein,Boehle,Bodah,Bobst,Boak,Bluemel,Blockmon,Blitch,Blincoe,Bleier,Blaydes,Blasius,Bittel,Bir,Binsfeld,Bindel,Bilotti,Billiott,Bilbrew,Bihm,Biersner,Bielat,Bidrowski,Bickler,Biasi,Bianca,Bhola,Bhat,Bewick,Betzen,Bettridge,Betti,Betsch,Besley,Beshero,Besa,Bertoli,Berstein,Berrien,Berrie,Berrell,Bermel,Berenguer,Benzer,Bensing,Bennie,Benedix,Bemo,Belile,Beilman,Behunin,Behrmann,Bedient,Becht,Beaule,Beaudreault,Bealle,Beagley,Bayuk,Bayot,Bayliff,Baugess,Battistoni,Batrum,Basinski,Basgall,Bartolomei,Bartnik,Bartl,Bartko,Bartholomay,Barthlow,Bartgis,Barsness,Barski,Barlette,Barickman,Bargen,Bardon,Barcliff,Barbu,Barbar,Barakat,Baracani,Baraban,Banos,Banko,Bania,Bambach,Balok,Balogun,Bally,Baldini,Balck,Balcer,Balash,Baim,Bailor,Bahm,Bahar,Bagshaw,Baggerly,Badie,Badal,Backues,Babino,Ba,Aydelott,Awbrey,Aversano,Avansino,Auyon,Aukamp,Aujla,Augenstein,Astacio,Ast,Asplin,Asato,Asano,Aruizu,Artale,Arrick,Arneecher,Armelin,Armbrester,Armacost,Arkell,Argue,Argrave,Areizaga,Areas,Apolo,Anzures,Anzualda,Antwi,Antillon,Antenor,Annand,Anhalt,Angove,Anglemyer,Anglada,Angiano,Angeloni,Andaya,Ancrum,Anagnos,Ammirati,Amescua,America,Ambrosius,Amacker,Amacher,Amabile,Alvizo,Alvernaz,Alvara,Altobelli,Altobell,Althauser,Alterman,Altavilla,Alsip,Alphonso,Almeyda,Almeter,Alman,Allscheid,Allaman,Aliotta,Alicia,Aliberti,Alghamdi,Alfonzo,Albiston,Alberta,Alberding,Alarie,Alano,Aja,Ailes,Ahsan,Ahrenstorff,Ahler,Aerni,Ackland,Achor,Acero,Acebo,Ace,Abshier,Abruzzo,Abrom,Abood,Abnet,Abend,Abegg,Abbruzzese,Aaberg,Zysk,Zutell,Zumstein,Zummo,Zuhlke,Zuehlsdorff,Zuch,Zucconi,Zortman,Zohn,Ziv,Zingone,Zingg,Zingale,Zima,Zientek,Zieg,Zervas,Zerger,Zenk,Zeldin,Zeiss,Zeiders,Zediker,Zea,Zavodny,Zarazua,Zappone,Zappala,Zapanta,Zaniboni,Zanchi,Zampedri,Zaller,Zakrajsek,Zagar,Zadrozny,Zablocki,Zable,Yust,Yunk,Youngkin,Yosten,Yockers,Yochim,Yerke,Yerena,Yeast,Yanos,Yam,Wysinger,Wyner,Wrisley,Woznicki,Wortz,Worsell,Wooters,Woon,Woolcock,Woodke,Wonnacott,Wolnik,Wittstock,Witting,Witry,Witfield,Witcraft,Wissmann,Wissink,Wisehart,Wiscount,Wironen,Wipf,Winterrowd,Wingett,Windon,Windish,Windisch,Windes,Wiltbank,Willmarth,Willick,Wiler,Wieseler,Wiedmaier,Wiederstein,Wiedenheft,Wieberg,Wickware,Wickkiser,Wickell,Whittmore,Whitker,Whitegoat,Whitcraft,Whisonant,Whisby,Whetsell,Whedon,Westry,Westcoat,Wernimont,Wentling,Wendlandt,Wencl,Weisgarber,Weininger,Weikle,Weigold,Weigl,Weichbrodt,Wehrli,Wehe,Weege,Weare,Watland,Wassmann,Warzecha,Warrix,Warrell,Warnack,Waples,Wantland,Wanger,Wandrei,Wander,Wanat,Wampole,Waltjen,Walterscheid,Waligora,Walding,Waldie,Walczyk,Wakins,Waitman,Wair,Wainio,Wahpekeche,Wahlman,Wagley,Wagenknecht,Wadle,Waddoups,Wadding,Wack,Vuono,Vuillemot,Vugteveen,Vosmus,Vorkink,Vories,Vondra,Voelz,Vlashi,Vivo,Vitelli,Vitali,Viscarra,Virgo,Vinet,Vimont,Villega,Villard,Vignola,Viereck,Videtto,Vicoy,Vessell,Vescovi,Verros,Vernier,Vernaglia,Vergin,Verdone,Verdier,Verastequi,Vejar,Vasile,Vasi,Varnadore,Vardaro,Vanzanten,Vansumeren,Vanschuyver,Vanleeuwen,Vanhowe,Vanhoozer,Vaness,Vandewalker,Vandevoorde,Vandeveer,Vanderzwaag,Vanderweide,Vanderhyde,Vandellen,Vanamburg,Vanalst,Vallin,Valk,Valerie,Valentini,Valcarcel,Valasco,Valadao,Vacher,Urquijo,Unterreiner,Unsicker,Unser,Unrau,Undercoffler,Uhm,Uffelman,Uemura,Ueda,Tyszko,Tyska,Tymon,Tyce,Tyacke,Twinam,Tutas,Tussing,Turmel,Turkowski,Turkel,Turchetta,Tupick,Tumblin,Tukes,Tufte,Tufo,Tuey,Tuell,Tuckerman,Tsutsumi,Tsuchiya,Try,Trossbach,Trivitt,Trippi,Trippensee,Trimbach,Trillo,Triller,Trible,Tribe,Tribby,Trevisan,Tresch,Tramonte,Traff,Trad,Tousey,Totaro,Torregrosa,Torralba,Torn,Tolly,Tofil,Tofani,Tobiassen,Tippy,Tiogangco,Tino,Tinnes,Tingstrom,Tingen,Tine,Tindol,Tifft,Tiffee,Tiet,Thuesen,Thruston,Throndson,Thornsbury,Thornes,Thiery,Thielman,Thie,Theilen,Thede,Thate,Thane,Thalacker,Thaden,Teuscher,Terracina,Terell,Terada,Tepfer,Tennessee,Tenneson,Tenant,Temores,Temkin,Tellers,Telleria,Teaque,Tealer,Teachey,Tavakoli,Tauras,Taucher,Tator,Tartaglino,Tarpy,Tape,Tannery,Tani,Tams,Tamlin,Tambe,Tallis,Talamante,Takayama,Takaki,Takagi,Taibl,Taffe,Tadesse,Tade,Tabeling,Tabag,Szoke,Szoc,Szala,Szady,Sysak,Sylver,Syler,Swonger,Swiggett,Swensson,Sweis,Sweers,Sweene,Sweany,Sweaney,Swartwout,Swamy,Swales,Swab,Susman,Surman,Surgeon,Sundblad,Summerset,Summerhays,Sumerall,Sule,Sugimoto,Subramanian,Sturch,Stupp,Stunkard,Stumpp,Struiksma,Stropes,Stromyer,Stromquist,Strede,Strazza,Strauf,Storniolo,Storjohann,Stonum,Stonier,Stonecypher,Stoneberger,Stollar,Stokke,Stokan,Stoetzel,Stoeckel,Stockner,Stockinger,Stockholm,Stockert,Stockdill,Stobbe,Stitzel,Stitely,Stirgus,Stigers,Stettner,Stettler,Sterlin,Sterbenz,Stemp,Stelluti,Steinmeyer,Steininger,Steinauer,Steigerwalt,Steider,Steady,Stavrou,Staufenberger,Stassi,Starin,Stankus,Stanaway,Stammer,Stakem,Staino,Stahlnecker,Stagnitta,Staelens,Staal,Srsen,Sprott,Sprigg,Sprenkle,Sprenkel,Spreitzer,Spraque,Sprandel,Spotted,Sporn,Spivak,Spira,Spiewak,Spieth,Spiering,Sperow,Speh,Specking,Spease,Spead,Sparger,Spanier,Spall,Sower,Southcott,Sosna,Soran,Sookram,Sonders,Solak,Sohr,Sohl,Sofranko,Soderling,Sochor,Sobon,Smutz,Smudrick,Smithj,Smid,Slosser,Sliker,Slenker,Sleight,Sleger,Sleet,Slaby,Skousen,Skilling,Skibinski,Skeeters,Skeet,Skees,Skane,Skafidas,Sivic,Sivertsen,Sivers,Sitra,Sito,Siracusa,Sinicki,Simpers,Simley,Simbeck,Silberberg,Siever,Siegwarth,Sidman,Siddons,Siddle,Sibbett,Si,Shumard,Shubrooks,Shough,Shorb,Shoptaw,Sholty,Shoffstall,Shiverdecker,Shininger,Shimasaki,Shifrin,Shiffler,Sheston,Sherr,Sherill,Shere,Shepeard,Shelquist,Shells,Sheler,Shave,Shauf,Sharrar,Sharpnack,Shanon,Shamsiddeen,Shambley,Shallenberger,Shadler,Shaban,Sha,Sferra,Seys,Sexauer,Sevey,Severo,Setlak,Seta,Sesko,Sersen,Serratore,Serdula,Senechal,Seldomridge,Seilhamer,Seifer,Seidlitz,Sehnert,Sedam,Sebron,Seber,Sebek,Seavers,Sear,Scullark,Scroger,Scovill,Sciascia,Sciarra,Schweers,Schwarze,Schummer,Schultes,Schuchardt,Schuchard,Schrieber,Schrenk,Schreifels,Schowalter,Schoultz,Scholer,Schofill,Schoff,Schnuerer,Schnettler,Schmitke,Schmiege,Schloop,Schlinger,Schlessman,Schlesser,Schlageter,Schiess,Schiefer,Schiavoni,Scherzer,Scherich,Schechtman,Schebel,Scharpman,Schaich,Schaap,Scappaticci,Scadlock,Savocchia,Savini,Savers,Save,Savageau,Sauvage,Sause,Sauerwein,Sary,Sarwary,Sarnicola,Santone,Santoli,Santalucia,Santacruce,Sansoucie,Sankoff,Sanes,Sandri,Sanderman,Sammartano,Salmonson,Salmela,Salmans,Sallaz,Salis,Sakuma,Sakowski,Sajdak,Sahm,Sagredo,Safrit,Sade,Sackey,Sabio,Sabino,Sabina,Rybolt,Ruzzo,Ruthstrom,Ruta,Russin,Russian,Russak,Rusko,Ruskin,Rusiecki,Ruscher,Rupar,Rumberger,Rullan,Ruliffson,Ruhlman,Ruger,Rufenacht,Ruelle,Rudisell,Rudi,Rucci,Rublee,Ruberto,Rubeck,Rowett,Rouge,Rottinghaus,Roton,Rothgeb,Rothgaber,Rothermich,Rostek,Rossini,Roskelley,Rosing,Rosi,Rosewell,Rosebush,Rosberg,Roon,Ronin,Romesburg,Romelus,Rolley,Rollerson,Rollefson,Rolins,Rolens,Rois,Rohrig,Rohrbacher,Rohland,Rohen,Roh,Rogness,Roes,Roering,Roehrick,Roebke,Rodregez,Rodabaugh,Rocks,Rockingham,Roblee,Robel,Roadcap,Rizzolo,Riviezzo,Rivest,Riveron,Risto,Rissler,Risen,Rippentrop,Ripka,Rinn,Ringuette,Ringering,Rindone,Rindels,Rim,Rieffer,Riedman,Riede,Riecke,Riebow,Riddlebarger,Rhome,Rhodd,Rhatigan,Rhame,Reyers,Rewitzer,Revalee,Retzer,Rettinger,Reschke,Requa,Reper,Reopell,Renzelman,Renne,Renker,Renk,Renicker,Rendina,Rendel,Remund,Remmele,Remiasz,Remaklus,Remak,Reitsma,Reitmeier,Reiswig,Reishus,Reining,Reim,Reidinger,Reick,Reiche,Regans,Reffett,Reesor,Reekie,Redpath,Redditt,Rechtzigel,Recht,Rebel,Rearden,Raynoso,Raxter,Ratkowski,Rasulo,Rassmussen,Rassel,Raspberry,Raser,Rappleye,Rappe,Randy,Randrup,Randleman,Ramson,Rampey,Ramming,Rama,Rainier,Raider,Radziewicz,Quirarte,Quintyne,Quickel,Query,Quattrini,Quarry,Quakenbush,Quaile,Pytel,Putty,Pushaw,Pusch,Purslow,Punzo,Pullam,Pugmire,Puello,Pu,Przekop,Pruss,Pruiett,Provow,Prophete,Procaccini,Pritz,Prillaman,Priess,Pretlow,Prestia,Presha,Prescod,Preast,Praytor,Prashad,Praino,Pozzi,Pounder,Pottenger,Potash,Porada,Popplewell,Ponzo,Ponter,Pommier,Polland,Polidori,Polasky,Pola,Pok,Poitier,Poisso,Poire,Point,Pofahl,Podolsky,Podell,Plueger,Plowe,Plotz,Plotnik,Ploch,Pliska,Plessner,Plaut,Platzer,Plake,Pizzino,Pizza,Pirog,Piquette,Pipho,Pioche,Pintos,Pinkert,Pinet,Pilkerton,Pilch,Pilarz,Pignataro,Piermatteo,Picozzi,Pickler,Pickette,Pichler,Philogene,Pheasant,Phare,Phang,Pfrogner,Pfisterer,Pettinelli,Petruzzi,Petrovic,Petretti,Petermeier,Pestone,Pesterfield,Pessin,Pesch,Persky,Perruzza,Perrott,Perritt,Perretti,Perrera,Peroutka,Peroni,Peron,Peret,Perdew,Perazzo,Peppe,Peno,Penberthy,Penagos,Peles,Pelech,Peiper,Peight,Pefferman,Peddie,Peckenpaugh,Pean,Payen,Pavloski,Pavlica,Paullin,Pattie,Patteson,Passon,Passey,Passe,Passalacqua,Pasquini,Paskel,Parter,Partch,Parriott,Parrella,Parraz,Parmely,Parizo,Parisian,Papelian,Papasergi,Pantojz,Panto,Panich,Panchal,Palys,Palms,Pallone,Palinski,Pali,Palevic,Pale,Pagels,Paciorek,Pacho,Pacella,Paar,Ozbun,Overweg,Overholser,Ovalles,Outhouse,Outcalt,Otterbein,Otta,Ostergren,Osher,Osbon,Orzech,Orwick,Orrico,Oropesa,Orn,Ormes,Orillion,Opal,Onorati,Onnen,Omary,Olk,Olding,Okonski,Okimoto,Ohlrich,Ohayon,Oguin,Ogley,Oftedahl,Offen,Ofallon,Oeltjen,Odam,Ockmond,Ockimey,Ocean,Obermeyer,Oberdorf,Obanner,Oballe,Oard,Oakden,Nyhan,Nydam,Numan,Noyer,Notte,Nothstein,Notestine,Noser,Nork,Nolde,Noa,Nishihara,Nishi,Nikolic,Nihart,Nietupski,Niesen,Niehus,Niece,Nidiffer,Nicoulin,Nicolaysen,Nicklow,Nickl,Nickeson,Nichter,Nicholl,Ngyun,Newsham,Newmann,Neveux,Neuzil,Neumayer,Netland,Nessen,Nesheim,Nelli,Nelke,Necochea,Nazari,Navy,Navorro,Navarez,Navan,Natter,Natt,Nater,Nasta,Narvaiz,Nardelli,Napp,Nakahara,Nairn,Nagg,Nager,Nagano,Nafziger,Naffziger,Nadelson,Muzzillo,Murri,Murrey,Murgia,Murcia,Muno,Munier,Mulqueen,Mulliniks,Mulkins,Mulik,Muhs,Muffley,Mozell,Moynahan,Mounger,Mottley,Motil,Moseman,Moseby,Mosakowski,Morten,Mortell,Morrisroe,Morrero,Mormino,Morland,Morger,Morgenthaler,Moren,Morelle,Morawski,Morasca,Morang,Morand,Moog,Montney,Montera,Montee,Montane,Montagne,Mons,Monohan,Monnett,Monkhouse,Moncure,Momphard,Molyneaux,Molles,Mollenkopf,Molette,Moland,Mohs,Mohmand,Mohlke,Moessner,Moers,Mockus,Moccio,Mlinar,Mizzelle,Mittler,Mitri,Mitchusson,Mitchen,Mistrot,Mistler,Misch,Miriello,Minkin,Mininger,Minerich,Minehart,Minderman,Minden,Minahan,Milonas,Millon,Millholland,Milleson,Millerbernd,Millage,Militante,Milionis,Milhoan,Mildenberger,Milbury,Mikolajczak,Miklos,Mikkola,Mikes,Migneault,Mifsud,Mietus,Mieszala,Mielnicki,Midy,Michon,Michioka,Micheau,Michaeli,Micali,Methe,Metallo,Messler,Mesch,Merow,Meroney,Mergenthaler,Meres,Mercy,Menuey,Menousek,Menning,Menn,Menghini,Mendia,Memmer,Melot,Mellow,Mellenthin,Melland,Meland,Meixner,Meisenheimer,Meineke,Meinders,Mehrens,Mehlig,Meglio,Medsker,Medicine,Medero,Mederios,Meabon,Mcwright,Mcright,Mcreath,Mcrary,Mcquirter,Mcquerry,Mcquary,Mcphie,Mcnurlen,Mcnelley,Mcnee,Mcnairy,Mcmanamy,Mcmahen,Mckowen,Mckiver,Mckinlay,Mckearin,Mcirvin,Mcintrye,Mchorse,Mchaffie,Mcgroarty,Mcgoff,Mcgivern,Mceniry,Mcelhiney,Mcdiarmid,Mccullars,Mccubbins,Mccrimon,Mccovery,Mccommons,Mcclour,Mccarrick,Mccarey,Mccallen,Mcbrien,Mcarthy,Mayone,Maybin,Maximo,Maxam,Maurais,Maughn,Matzek,Matts,Matin,Mathre,Mathia,Mateen,Matava,Masso,Massar,Massanet,Masingale,Mascaro,Marthaler,Martes,Marso,Marshman,Marsalis,Marrano,Marolt,Marold,Markins,Margulis,Mardirosian,Marchiano,Marchak,Marandola,Marana,Manues,Mantis,Mante,Mansukhani,Mansi,Mannan,Maniccia,Mangine,Manery,Mandigo,Manda,Mancell,Mamo,Malstrom,Malouf,Malenfant,Malena,Maldenado,Malandruccolo,Malak,Malabanan,Makino,Maj,Maisonave,Mainord,Maino,Mainard,Maillard,Maia,Mahmud,Mahdi,Mahapatra,Mahaley,Mahaffy,Magouirk,Maglaras,Magat,Magan,Maga,Maffia,Madrazo,Madrano,Maditz,Mackert,Mackellar,Mackell,Macht,Macchia,Maccarthy,Maahs,Lytal,Lye,Luzar,Luzader,Lutjen,Lunger,Lunan,Luma,Lukins,Luhmann,Luers,Ludvigsen,Ludlam,Ludemann,Luchini,Lucente,Lubrano,Lubow,Luber,Lubeck,Lowing,Loven,Loup,Louise,Louge,Losco,Lorts,Lormand,Lorenzetti,Longford,Longden,Longbrake,Lokhmatov,Loge,Loeven,Loeser,Locket,Locey,Locatelli,Litka,Lista,Lisonbee,Lisenbee,Liscano,Liranzo,Liquori,Liptrot,Lionetti,Lio,Linscomb,Linkovich,Linington,Lingefelt,Lindler,Lindig,Lindall,Lincks,Linander,Linan,Limburg,Limbrick,Limbach,Likos,Lighthall,Liford,Lietzke,Liebe,Liddicoat,Lickley,Lichter,Libel,Lias,Liapis,Lezo,Lewan,Levitz,Levesgue,Leverson,Levander,Leuthauser,Letbetter,Lesuer,Lesmeister,Lesly,Lerer,Leppanen,Lepinski,Leota,Lenherr,Lembrick,Lelonek,Leisten,Leiss,Leins,Leingang,Leinberger,Leinbach,Leikam,Leidig,Lehtonen,Lehnert,Lehew,Legier,Lefchik,Lecy,Leconte,Lecher,Lebrecht,Leather,Leaper,Lawter,Lawrenz,Lavy,Laur,Lauderbaugh,Lauden,Laudato,Latting,Latsko,Latini,Lassere,Lasseigne,Laspina,Laso,Laslie,Laskowitz,Laske,Laser,Lasenby,Lascola,Lariosa,Larcade,Lapete,Laperouse,Lanuza,Lanting,Lantagne,Lansdale,Lanphier,Langmaid,Langella,Lanese,Landrus,Lampros,Lamens,Laizure,Laitinen,Laigle,Lahm,Lagueux,Lagorio,Lagomarsino,Lagasca,Lagana,Lafont,Laflen,Lafavor,Lafarge,Laducer,Ladnier,Ladesma,Lacognata,Lackland,Lacerte,Labuff,Laborin,Labine,Labauve,Kuzio,Kusterer,Kussman,Kusel,Kusch,Kurutz,Kurdyla,Kupka,Kunzler,Kunsman,Kuni,Kuney,Kunc,Kulish,Kuliga,Kulaga,Kuilan,Kuhre,Kuhnke,Kuemmerle,Kueker,Kudla,Kudelka,Kubinski,Kubicki,Kubal,Krzyzanowski,Krupicka,Krumwiede,Krumme,Kross,Kropidlowski,Krokos,Kroell,Kritzer,Kribs,Kreitlow,Kreisher,Kraynak,Krass,Kranzler,Kramb,Kozyra,Kozicki,Kovalik,Kovalchik,Kovacevic,Kotula,Kotrba,Koteles,Kosowski,Koskela,Kosiba,Koscinski,Kosch,Kory,Korab,Kopple,Kopper,Koppelman,Koppel,Konwinski,Kon,Kolosky,Koloski,Kolinsky,Kolinski,Kolbeck,Kolasa,Koepf,Koda,Kochevar,Kochert,Kobs,Knust,Knueppel,Knoy,Knieriem,Knier,Kneller,Knappert,Klitz,Klintworth,Klinkenberg,Klinck,Kleindienst,Kleeb,Klecker,Kjellberg,Kitten,Kitsmiller,Kisor,Kisiel,Kise,Kirbo,Kio,Kinzle,Kinkaid,Kingsford,Kingry,Kimpton,Kimel,Kimberley,Killmon,Killick,Kilgallon,Kilcher,Kihn,Kiggins,Kiecker,Kher,Khaleel,Keziah,Kettell,Ketchen,Keshishian,Kersting,Kersch,Kerins,Kercher,Keno,Kenefick,Kemph,Kempa,Kelsheimer,Kelln,Kellenberger,Kekahuna,Keisling,Keirnan,Keimig,Kehn,Keal,Ke,Kaupp,Kaufhold,Kauffmann,Katzenberg,Katona,Kaszynski,Kaszuba,Kassebaum,Kasa,Kartye,Kartchner,Karstens,Karpinsky,Karmely,Karel,Karasek,Kapral,Kaper,Kanelos,Kanahele,Kampmann,Kampe,Kalp,Kallus,Kallevig,Kallen,Kaliszewski,Kaleohano,Kalchthaler,Kalama,Kalahiki,Kaili,Kahawai,Kagey,Justiss,Jurkowski,Jurgensmeyer,Juilfs,Josue,Jopling,Jondahl,Jomes,Joice,Johannessen,Joeckel,Jezewski,Jezek,Jeswald,Jervey,Jeppsen,Jenniges,Jennifer,Jennett,Jemmott,Jeffs,Jeffry,Jaurequi,Janisch,Janick,Janice,Jacek,Jacaruso,Iwanicki,Ishihara,Isenberger,Isbister,Iruegas,Inzer,Inyart,Inscore,Innocenti,Inglish,Infantolino,Indovina,Inaba,Imondi,Imdieke,Imbert,Illes,Ida,Iarocci,Iannucci,Huver,Hutley,Husser,Husmann,Hupf,Huntsberger,Hunnewell,Hullum,Huit,Huish,Huh,Hughson,Huft,Hufstetler,Hueser,Hudnell,Hovden,Housen,Houghtling,Hoth,Hossack,Hoshaw,Horsford,Horry,Hornbacher,Horde,Hoppenstedt,Hopkinson,Honza,Honor,Homann,Holzmeister,Holycross,Holverson,Holtzlander,Holroyd,Holmlund,Hollywood,Holderness,Holderfield,Holck,Hojnacki,Hohlfeld,Hohenberger,Hoganson,Hogancamp,Hoffses,Hoerauf,Hoell,Hoefert,Hodum,Hoder,Hockenbury,Hoage,Hisserich,Hislip,Hirons,Hippensteel,Hippen,Hinkston,Hindes,Hinchcliff,Hin,Himmel,Hillberry,Hildring,Hiester,Hiefnar,Hides,Hibberd,Hibben,Heyliger,Heyl,Heyes,Hevia,Heu,Hettrick,Hert,Hersha,Hernandz,Herkel,Herber,Henscheid,Hennesy,Henly,Henegan,Henebry,Hench,Hemsath,Hemm,Hemken,Hemann,Heltzel,Hellriegel,Hejny,Heinl,Heinke,Heidinger,Hegeman,Hefferan,Hedglin,Hebdon,Hearnen,Hearing,Heape,Heagy,Headings,Headd,Hazelbaker,Havlick,Hauschildt,Haury,Hassenfritz,Hasenbeck,Haseltine,Hartstein,Hartry,Hartnell,Harston,Harpool,Harmen,Hardister,Hardey,Harders,Harbolt,Harbinson,Haraway,Haque,Hansmann,Hanser,Hansch,Hansberry,Hankel,Hanigan,Haneline,Hampe,Hamons,Hammerstone,Hammerle,Hamme,Hammargren,Hamelton,Hamberger,Hamasaki,Halprin,Halman,Hallihan,Halen,Haldane,Hails,Haifley,Hai,Hages,Hagadorn,Hadwin,Habicht,Habermehl,Gyles,Gutzman,Gutekunst,Gustason,Gusewelle,Gurnsey,Gurnee,Gunterman,Gumina,Gulliver,Gulbrandson,Guiterez,Guerino,Guedry,Gucwa,Guardarrama,Guagliano,Guadagno,Grulke,Groote,Groody,Groft,Groeneweg,Grochow,Grippe,Grimstead,Griepentrog,Greenfeld,Greenaway,Grebe,Graziosi,Graw,Gravina,Grassie,Grapes,Granzow,Grandjean,Granby,Gramacy,Graces,Gozalez,Goyer,Gotch,Gosden,Gorny,Gormont,Goodness,Goodgion,Gonya,Gonnerman,Gompert,Golish,Goligoski,Goldmann,Goike,Goetze,Godeaux,Glenna,Glaza,Glassel,Glaspy,Glander,Glady,Giumarro,Gitelman,Gisondi,Gismondi,Girvan,Girten,Gironda,Giovinco,Ginkel,Gilster,Giesy,Gierman,Giddins,Giardini,Gianino,Ghea,Geurin,Gett,Getson,Gerrero,Germond,Gere,Gentsy,Genta,Gennette,Genito,Genis,Gene,Gendler,Geltz,Geiss,Gehret,Gegenheimer,Geffert,Geeting,Gebel,Gavette,Gavenda,Gaumond,Gaudioso,Gatzke,Gatza,Gattshall,Gaton,Gatchel,Gasperi,Gaska,Gasiorowski,Garritson,Garrigus,Garnier,Garnick,Gardinier,Gardenas,Garcy,Garate,Gandolfi,Gamm,Gamel,Gambel,Gallmon,Gallemore,Gallati,Gainous,Gainforth,Gahring,Gaffey,Gaebler,Gadzinski,Gadbury,Gabri,Gabe,Gaba,Fyke,Furtaw,Furnas,Furcron,Funn,Funck,Fulwood,Fulvio,Fullmore,Fukumoto,Fuest,Fuery,Fuente,Fuel,Frymire,Frush,Frohlich,Froedge,Frodge,Fritzinger,Fricker,Frericks,Frein,Freid,Freggiaro,Fratto,Franzi,Franciscus,Fralix,Fowble,Fotheringham,Foslien,Foshie,Fortmann,Forsey,Forkner,Foppiano,Fontanetta,Fonohema,Fogler,Fockler,Fluty,Flusche,Flud,Florin,Flori,Flenory,Fleharty,Fleeks,Flaxman,Flash,Flaming,Fiumara,Fitzmorris,Finnicum,Finkley,Fineran,Fillhart,Filipi,Fijal,Fieldson,Ficken,Ficarra,Fetch,Festerman,Fess,Ferryman,Ferner,Fergason,Ferell,Fennern,Femmer,Feldmeier,Feeser,Feenan,Federick,Fedak,Febbo,Feazell,Fearing,Fazzone,Fauth,Fauset,Faurote,Faulker,Faubion,Fatzinger,Fasick,Fanguy,Fambrough,Falks,Fahl,Fabio,Faaita,Exler,Ewens,Estrado,Esten,Esteen,Esquivez,Espejo,Esmiol,Esguerra,Esco,Ertz,Erspamer,Ernstes,Erisman,Erhard,Ereaux,Ercanbrack,Erbes,Epple,Entsminger,Entriken,Enslow,Ennett,Engquist,Englebert,Englander,Engesser,Engert,Engeman,Enge,Enerson,End,Emhoff,Emge,Emerald,Elting,Ellner,Ellenberg,Ellenbecker,Elio,Elfert,Elden,Elawar,Ekstrand,Eison,Eismont,Eisenbrandt,Eiseman,Eischens,Ehrgott,Egley,Egert,Eddlemon,Economy,Eckerson,Eckersley,Eckberg,Echeverry,Eberts,Earthman,Earnhart,Eapen,Eachus,Dykas,Dust,Dusi,Durning,During,Durdan,Dunomes,Duncombe,Dume,Dullen,Dullea,Dulay,Dul,Duffett,Dubs,Dubard,Drook,Drenth,Drahos,Dragone,Downin,Downham,Dowis,Dowhower,Doward,Dovalina,Dost,Dopazo,Doose,Donson,Donnan,Dominski,Dollarhide,Dolinar,Dolecki,Dolbee,Doege,Dockus,Dobler,Dobkin,Dobias,Divoll,Diviney,Ditter,Ditman,Dissinger,Dismang,Dirlam,Dinneen,Dini,Dingwall,Dine,Din,Diloreto,Dilmore,Dillaman,Dikeman,Diiorio,Dighton,Diffley,Dieudonne,Dietel,Dieringer,Diercks,Dienhart,Diekrager,Diefendorf,Dicke,Dicamillo,Dibrito,Dibona,Dezeeuw,Dewhurst,Devins,Deviney,Deupree,Detherage,Despino,Desmith,Desjarlais,Deshner,Desha,Desanctis,Derring,Derousse,Derobertis,Deridder,Derego,Derden,Deprospero,Deprofio,Depping,Deperro,Denty,Denoncourt,Dencklau,Demler,Demirchyan,Demichiel,Demesa,Demere,Demaggio,Delung,Deluise,Delmoral,Delmastro,Delmas,Delligatti,Delle,Delena,Delasbour,Delarme,Delargy,Delagrange,Delafontaine,Deist,Deiss,Deighan,Dehoff,Degrazia,Degman,Defosses,Deforrest,Deeks,Decoux,Decarolis,Debuhr,Deberg,Debarr,Debari,Dearmon,Deare,Deardurff,Daywalt,Dayer,Davoren,Davignon,Daviau,Dauteuil,Dauterive,Daul,Darnley,Darlin,Darakjy,Dapice,Dannunzio,Danison,Daniello,Damario,Dalonzo,Dallis,Daleske,Dalenberg,Daiz,Dains,Daines,Dagnese,Dady,Dadey,Czyzewski,Czapor,Czaplewski,Czajka,Cyganiewicz,Cuttino,Cutrona,Cussins,Cusanelli,Cuperus,Cundy,Cumiskey,Cumins,Cuizon,Cuffia,Cuffe,Cuffari,Cuccaro,Cubie,Cryder,Cruson,Crounse,Cromedy,Cring,Creer,Credeur,Crea,Cozort,Cozine,Cowee,Cowdery,Coventry,Couser,Courtway,Courington,Cotman,Costlow,Costell,Corton,Corsaro,Corrieri,Corrick,Corradini,Coron,Coren,Cord,Corbi,Corado,Copus,Coppenger,Cooperwood,Coontz,Coonce,Contrera,Connealy,Conell,Comtois,Compere,Commins,Commings,Comegys,Coma,Colyar,Colo,Collister,Collick,Collella,Coler,Colborn,Cohran,Cogbill,Coffen,Cocuzzo,Clynes,Closter,Clock,Clipp,Clingingsmith,Clemence,Clayman,Classon,Clas,Clarey,Clarence,Clague,Ciubal,Citrino,Citarella,Cirone,Cipponeri,Cindrich,Cimo,Ciliberto,Cichowski,Ciccarello,Cicala,Chura,Chubbuck,Chronis,Christlieb,Chriss,Chizek,Chittester,Chiquito,Chimento,Childree,Chianese,Chevrette,Cheese,Checo,Chastang,Chargualaf,Chapmon,Chantry,Chahal,Chafetz,Cezar,Ceruantes,Cerrillo,Cerrano,Cerecedes,Cerami,Cegielski,Cavallero,Catinella,Cassata,Caslin,Casano,Casacchia,Caruth,Cartrette,Carten,Carodine,Carnrike,Carnall,Carmicle,Carlan,Carlacci,Caris,Cariaga,Cardine,Cardimino,Cardani,Carbonara,Carano,Capua,Capponi,Cappellano,Caporale,Capelli,Canupp,Cantrel,Cantone,Canterberry,Cannizzo,Cannan,Canelo,Caneer,Candill,Candee,Campbel,Caminero,Camble,Caluya,Callicott,Calk,Caito,Caffie,Caden,Cadavid,Cacy,Cachu,Cachola,Cabreja,Cabiles,Cabada,Caamano,Byran,Byon,Buyck,Bussman,Bussie,Bushner,Burston,Burnison,Burkman,Burkhammer,Bures,Burdeshaw,Bumpass,Bullinger,Bullers,Bulgrin,Bugay,Buffalo,Budak,Buczynski,Buckendorf,Buccieri,Bubrig,Brynteson,Brunz,Brunmeier,Brunkow,Brunetto,Brunelli,Brumwell,Bruggman,Brucki,Brucculeri,Brozovich,Browing,Brotman,Broda,Brocker,Broadstreet,Brix,Britson,Brinck,Brimmage,Brightly,Brierre,Bridenstine,Brezenski,Brezee,Brevik,Brest,Brentlinger,Brentley,Breidenbach,Breckel,Brech,Breaker,Brazzle,Braughton,Brauch,Brattin,Brattain,Branhan,Branford,Braner,Brander,Braly,Braegelmann,Brabec,Boyt,Boyack,Bowren,Bowl,Bovian,Boughan,Botton,Botner,Bosques,Borzea,Borre,Boron,Bornhorst,Borgstrom,Borella,Boop,Bontempo,Bonniwell,Bonnes,Bonjour,Bonillo,Bonano,Bolek,Bohol,Bohaty,Boffa,Boetcher,Boesen,Boepple,Boehler,Boedecker,Boeckx,Bodi,Boal,Bloodsworth,Bloodgood,Blome,Blockett,Blixt,Blanchett,Blackhurst,Blackaby,Bjornberg,Bitzer,Bittenbender,Bitler,Birchall,Binnicker,Binggeli,Billett,Bilberry,Bijou,Biglow,Bierly,Bielby,Biegel,Beu,Berzas,Berte,Bertagnolli,Berreth,Bernhart,Bergum,Berentson,Berenson,Berdy,Bercegeay,Bentle,Bentivegna,Bentham,Benscoter,Benns,Bennick,Benjamine,Beneze,Benett,Beneke,Bendure,Bendix,Bendick,Benauides,Belman,Bellus,Bellott,Bellefleur,Bellas,Beljan,Belgard,Beith,Beinlich,Beierle,Behme,Beevers,Beermann,Beeching,Bedward,Bedrosian,Bedner,Bedeker,Bechel,Becera,Beaubrun,Beardmore,Bealmear,Bazin,Bazer,Baumhoer,Baumgarner,Bauknecht,Battson,Battiest,Basulto,Baster,Basques,Basista,Basiliere,Bashi,Barzey,Barz,Bartus,Bartucca,Bartek,Barrero,Barreca,Barnoski,Barndt,Barklow,Baribeau,Barette,Bares,Barentine,Bareilles,Barch,Barbre,Barberi,Barbagelata,Baraw,Baratto,Baranoski,Bar,Baptise,Bankson,Bankey,Bankard,Banik,Baltzley,Ballen,Balkey,Balius,Balderston,Bakula,Bakalar,Baffuto,Baerga,Badoni,Backous,Bachtel,Bachrach,Baccari,Babine,Babilonia,Baar,Azbill,Azad,Aycox,Ayalla,Avolio,Austerberry,Aughtry,Aufderheide,Auch,Attanasio,Athayde,Atcher,Astor,Asselta,Aslin,Aslam,Ashwood,Ashraf,Ashbacher,Asbridge,Asakura,Arzaga,Arriaza,Arrez,Arrequin,Arrants,Armiger,Armenteros,Armbrister,Arko,Argumedo,Arguijo,Ardolino,Arcia,Arbizo,Aravjo,Aper,Anzaldo,Antu,Antrikin,Antony,Antonia,Antonetty,Antinoro,Anthon,Antenucci,Anstead,Annese,Ankrum,Andreason,Andrado,Andaverde,Anastos,Anable,Amsterdam,Amspoker,Amrine,Amrein,Amorin,Amel,Ambrosini,Amber,Alsbrook,Alnutt,Almasi,Allessio,Allateef,Alison,Aldous,Alderink,Aldaz,Akmal,Akard,Aiton,Aites,Ainscough,Aikey,Ahrends,Ahlm,Aguada,Agans,Adelmann,Adebisi,Addesso,Adaway,Adamaitis,Ackison,Abud,Abendroth,Abdur,Abdool,Aamodt,Zywiec,Zwiefelhofer,Zwahlen,Zunino,Zuehl,Zmuda,Zmolek,Zizza,Ziska,Zinser,Zinkievich,Zinger,Zingarelli,Ziesmer,Ziegenfuss,Ziebol,Zettlemoyer,Zettel,Zervos,Zenke,Zembower,Zelechowski,Zelasko,Zeise,Zeek,Zeeb,Zarlenga,Zarek,Zaidi,Zahnow,Zahnke,Zaharis,Zach,Zacate,Zabrocki,Zaborac,Yurchak,Yuengling,Younie,Youngers,Youell,Yott,Yoshino,Yorks,Yordy,Yochem,Yerico,Yerdon,Yeiser,Yearous,Yearick,Yeaney,Ybarro,Yasutake,Yasin,Yanke,Yanish,Yanik,Yamazaki,Yamat,Yaggi,Ximenez,Wyzard,Wynder,Wyly,Wykle,Wutzke,Wuori,Wuertz,Wuebker,Wrightsel,Worobel,Worlie,Worford,Worek,Woolson,Woodrome,Woodly,Woodling,Wontor,Wondra,Woltemath,Wollmer,Wolinski,Wolfert,Wojtanik,Wojtak,Wohlfarth,Woeste,Wobbleton,Witz,Wittmeyer,Witchey,Wisotzkey,Wisnewski,Wisman,Wirch,Wippert,Wineberg,Wimpee,Wilusz,Wiltsey,Willig,Williar,Willers,Willadsen,Wilfred,Wildhaber,Wilday,Wigham,Wiggen,Wiewel,Wieting,Wietbrock,Wiesel,Wiesehan,Wiersema,Wiegert,Widney,Widmark,Wickson,Wickings,Wichern,Whtie,Whittie,Whitlinger,Whitfill,Whitebread,Whispell,Whetten,Wheeley,Wheeles,Wheelen,Whatcott,Weyland,Weter,Westrup,Westphalen,Westly,Westland,Wessler,Wesolick,Wesler,Wesche,Werry,Wero,Wernecke,Werkhoven,Wellspeak,Wellings,Welford,Welander,Weissgerber,Weisheit,Weins,Weill,Weigner,Wehrmann,Wehrley,Wehmeier,Wege,Weers,Weavers,Watring,Wassum,Wassman,Wassil,Washabaugh,Wascher,Wary,Warth,Warbington,Wanca,Wammack,Wamboldt,Walterman,Walkington,Walkenhorst,Walinski,Wakley,Wagg,Wadell,Vuckovich,Voogd,Voller,Vokes,Vogle,Vogelsberg,Vodicka,Vissering,Visage,Vipond,Vincik,Villalona,Vil,Vickerman,Vettel,Veteto,Vessel,Vesperman,Vesco,Vertucci,Versaw,Verba,Ventris,Venecia,Vendela,Venanzi,Veldhuizen,Vehrs,Veer,Vee,Vay,Vaughen,Vasilopoulos,Vascocu,Varvel,Varno,Varlas,Varland,Vario,Vareschi,Vanwyhe,Vanweelden,Vansciver,Vannaman,Vanluven,Vanloo,Vanlaningham,Vankomen,Vanhout,Vanhampler,Vangorp,Vangorden,Vanella,Vandresar,Vandis,Vandeyacht,Vandewerker,Vandevsen,Vanderwall,Vandercook,Vanderberg,Vanbergen,Valko,Valesquez,Valeriano,Valen,Vachula,Vacha,Uzee,Uva,Uselman,Urizar,Urion,Urben,Upthegrove,Unzicker,Unsell,Unick,Umscheid,Umin,Umanzor,Ullo,Ulicki,Uhlir,Uddin,Tytler,Tymeson,Tyger,Twisdale,Twedell,Tweddle,Turrey,Tures,Turell,Tur,Tupa,Tuitt,Tuberville,Tubby,Tryner,Trumpower,Trumbore,Truly,Troglen,Troff,Troesch,Trivisonno,Tritto,Tritten,Tritle,Trippany,Tringali,Tretheway,Treon,Trench,Trejos,Tregoning,Treffert,Traycheff,Travali,Trauth,Trauernicht,Transou,Trane,Trana,Toves,Tosta,Torp,Tornquist,Tornes,Torchio,Toppings,Toor,Tooks,Tonks,Tomblinson,Tomala,Tollinchi,Tolles,Tokich,Toh,Tofte,Todman,Toddy,Titze,Timpone,Tillema,Tier,Tienken,Tiblier,Thyberg,Thursby,Thurrell,Thurm,Thruman,Thorsted,Thorley,Thomer,Thoen,Thissen,Theimer,Thee,Thayn,Thanpaeng,Thammavongsa,Thalman,Texiera,Texidor,Teverbaugh,Teska,Ternullo,Teplica,Tepe,Teno,Tenholder,Tenbusch,Tenbrink,Temby,Tejedor,Teitsworth,Teichmann,Tehan,Tegtmeyer,Tees,Teem,Tays,Taubert,Tauares,Taschler,Tartamella,Tarquinio,Tarbutton,Tappendorf,Tapija,Tansil,Tannahill,Tamondong,Talahytewa,Takashima,Taecker,Tabora,Tabin,Tabbert,Szymkowski,Szymanowski,Syversen,Syrett,Syracuse,Synnott,Sydnes,Swimm,Sweney,Swearegene,Swartzel,Swanstrom,Svedin,Suss,Suryan,Surrey,Supplice,Supnet,Suoboda,Sundby,Sumaya,Sumabat,Sulzen,Sukovaty,Sukhu,Sugerman,Sugalski,Sugai,Sudweeks,Sudbeck,Sucharski,Stutheit,Stumfoll,Stuffle,Struyk,Strutz,Strumpf,Strowbridge,Strothman,Strojny,Strohschein,Stroffolino,Stribble,Strevel,Strenke,Stremming,Strehle,Strattman,Stranak,Stram,Stracke,Stoudamire,Storks,Stopp,Stonebreaker,Stolt,Stoica,Stofer,Stockham,Stockfisch,Stjuste,Stiteler,Stiman,Stillions,Stillabower,Stierle,Sterlace,Sterk,Stepps,Stenquist,Stenner,Stellman,Steines,Steinbaugh,Steinbacher,Steiling,Steidel,Steffee,Stavinoha,Staver,Stastny,Stasiuk,Starrick,Starliper,Starlin,Staniford,Staner,Standre,Standefer,Standafer,Stanczyk,Stallsmith,Stagliano,Staehle,Staebler,Stady,Stadtmiller,Squyres,Spurbeck,Sprunk,Spranger,Spoonamore,Spoden,Spilde,Spezio,Speros,Sperandio,Specchio,Spearin,Spayer,Spallina,Spadafino,Sovie,Sotello,Sortor,Sortino,Sorrow,Soros,Sorola,Sorbello,Sonner,Sonday,Somes,Soloway,Soledad,Soens,Soellner,Soderblom,Sobin,Sniezek,Sneary,Smyly,Smutnick,Smoots,Smoldt,Smitz,Smitreski,Smallen,Smades,Slunaker,Sluka,Slown,Slovick,Slocomb,Slinger,Slife,Slicker,Sleeter,Slanker,Skufca,Skubis,Skrocki,Skov,Skjei,Skilton,Skill,Skarke,Skalka,Skalak,Skaff,Sixkiller,Sitze,Siter,Sisko,Sirman,Sirls,Sinotte,Sinon,Sincock,Sincebaugh,Simmoms,Similien,Silvius,Silton,Silloway,Sikkema,Sieracki,Sienko,Siemon,Siemer,Siefker,Sieberg,Siebens,Siebe,Sicurella,Sicola,Sickle,Shumock,Shumiloff,Shuffstall,Shuemaker,Shuart,Shu,Shroff,Shreeve,Shostak,Shortes,Shorr,Shivley,Shintaku,Shindo,Shimomura,Shiigi,Sherow,Sherburn,Shepps,Shenefield,Shelvin,Shelstad,Shelp,Sheild,Sheaman,Shaulis,Sharrer,Sharps,Sharpes,Shareef,Shappy,Shapero,Shanor,Shandy,Shad,Seyller,Severn,Sessom,Sesley,Servidio,Serrin,Sero,Serge,Septon,Septer,Sennott,Sengstock,Senff,Senese,Semprini,Semone,Sembrat,Selva,Sella,Selbig,Seiner,Seif,Seidt,Sehrt,Seemann,Seelbinder,Sedlay,Sebert,Searing,Seaholm,Seacord,Seaburg,Se,Scungio,Scroggie,Scritchfield,Scripture,Scrimpsher,Scrabeck,Score,Scorca,Scobey,Scivally,Schwulst,Schwinn,Schwieson,Schwery,Schweppe,Schwartzenbur,Schurz,Schumm,Schulenburg,Schuff,Schuerholz,Schryer,Schrager,Schorsch,Schonhardt,Schoenfelder,Schoeck,Schoeb,Schnitzler,Schnick,Schnautz,Schmig,Schmelter,Schmeichel,Schluneger,Schlosberg,Schlobohm,Schlenz,Schlembach,Schleisman,Schleining,Schleiff,Schleider,Schink,Schilz,Schiffler,Schiavi,Scheuer,Schemonia,Scheman,Schelb,Schaul,Schaufelberge,Scharer,Schardt,Scharbach,Schabacker,Scee,Scavone,Scarth,Scarfone,Scalese,Sayne,Sayed,Savitz,Satterlund,Sattazahn,Satow,Sastre,Sarr,Sarjeant,Sarff,Sardella,Santoya,Santoni,Santai,Sankowski,Sanft,Sandow,Sandoe,Sandhaus,Sandefer,Sampey,Samperi,Sammarco,Samia,Samek,Samay,Samaan,Salvadore,Saltness,Salsgiver,Saller,Salaz,Salano,Sakal,Saka,Saintlouis,Saile,Sahota,Saggese,Sagastume,Sagan,Sadri,Sadak,Sachez,Saalfrank,Saal,Saadeh,Ryu,Rynn,Ryley,Ryle,Rygg,Rybarczyk,Ruzich,Ruyter,Ruvo,Rupel,Ruopp,Rundlett,Runde,Rundall,Runck,Rukavina,Ruggiano,Rufi,Ruef,Rubright,Rubbo,Rowbottom,Route,Rotner,Rotman,Rothweiler,Rothlisberger,Rosseau,Rossean,Rossa,Roso,Rosiek,Roshia,Rosenkrans,Rosener,Rosencrantz,Rosencrans,Rosello,Roques,Rookstool,Rondo,Romasanta,Romack,Rokus,Rohweder,Rog,Roethler,Roediger,Rodwell,Rodrigus,Rodenbeck,Rodefer,Rodarmel,Rockman,Rockholt,Rockford,Rochow,Roches,Roblin,Roblez,Roble,Robers,Roat,Rizza,Rizvi,Rizk,Rixie,Riveiro,Rius,Ritschard,Ritrovato,Risi,Rishe,Rippon,Rinks,Rings,Ringley,Ringgenberg,Ringeisen,Rimando,Rilley,Rijos,Rieks,Rieken,Riechman,Riddley,Ricord,Rickabaugh,Richmeier,Richesin,Reyolds,Rexach,Revere,Requena,Reppucci,Reposa,Renzulli,Renter,Renault,Remondini,Relic,Reither,Reisig,Reifsnider,Reifer,Reibsome,Reibert,Rehor,Rehmann,Reedus,Redshaw,Redfox,Reczek,Recupero,Recor,Reckard,Recher,Rear,Realbuto,Razer,Rayman,Raycraft,Rayas,Rawle,Raviscioni,Ravetto,Ravenelle,Rauth,Raup,Rattliff,Rattley,Rathfon,Rataj,Rasnic,Rappleyea,Rapaport,Ransford,Rann,Rampersad,Ramis,Ramcharan,Rainha,Rainforth,Ragans,Ragains,Rafidi,Raffety,Raducha,Radsky,Radler,Radatz,Raczkowski,Rack,Rabenold,Quraishi,Quinerly,Quiet,Quercia,Quarnstrom,Qian,Pusser,Puppo,Pullan,Pulis,Pugel,Puccini,Puca,Pruna,Prowant,Provines,Pronk,Prinkleton,Prindall,Primas,Priesmeyer,Pridgett,Prevento,Preti,Presser,Presnall,Preseren,Presas,Presa,Prchal,Prattis,Pratillo,Praska,Prak,Powis,Powderly,Postlewait,Postle,Posch,Porteus,Portal,Porraz,Popwell,Popoff,Poplaski,Poniatoski,Pollina,Polle,Polhill,Poletti,Polaski,Pokorney,Poke,Pointdexter,Poinsette,Po,Ploszaj,Plitt,Pletz,Pletsch,Plemel,Pleitez,Playford,Plaxco,Platek,Plambeck,Plagens,Placido,Pisarski,Pinuelas,Pinnette,Pinick,Pinell,Pinciaro,Pinal,Pilz,Piltz,Pillion,Pilkinton,Pilar,Pikul,Piepenburg,Piening,Piehler,Piedrahita,Piechocki,Picknell,Picker,Pickelsimer,Pich,Picariello,Phoeuk,Phillipson,Philbert,Pherigo,Phelka,Peverini,Petronis,Petrina,Petrash,Petramale,Petraglia,Pery,Personius,Perrington,Perrill,Perpall,Perot,Perman,Peragine,Pentland,Pennycuff,Penninger,Pennie,Pennachio,Penhall,Pendexter,Pencil,Penalver,Pelzel,Pelter,Pelow,Pelo,Peli,Peinado,Pedley,Pecue,Pecore,Pechar,Peairs,Paynes,Payano,Pawelk,Pavlock,Pavlich,Pavich,Pavek,Pautler,Paulik,Patmore,Patella,Patee,Patalano,Passini,Passeri,Paskell,Parrigan,Parmar,Parayno,Paparelli,Pantuso,Pante,Panico,Panduro,Panagos,Pama,Palmo,Pallotta,Paling,Palamino,Pake,Pajtas,Pailthorpe,Pahler,Pagon,Paglinawan,Pagley,Paget,Paetz,Paet,Padley,Pacleb,Pacific,Pachelo,Pacer,Paccione,Pabey,Ozley,Ozimek,Ozawa,Owney,Outram,Oun,Ouillette,Oudekerk,Ouch,Ostrosky,Ostermiller,Ostermann,Osterloh,Osterfeld,Ossenfort,Osoria,Oshell,Orsino,Orscheln,Orrison,Ororke,Orf,Orellano,Orejuela,Ordoyne,Opsahl,Opland,Onofre,Onaga,Omahony,Olszowka,Olshan,Ollig,Oliff,Olien,Olexy,Oldridge,Oldfather,Older,Olalde,Okun,Okumoto,Oktavec,Okin,Oka,Ohme,Ohlemacher,Ohanesian,Odneal,Odgers,Oderkirk,Odden,Ocain,Obradovich,Oakey,Nussey,Nunziato,Nunoz,Nunnenkamp,Nuncio,Noviello,Novacek,Nothstine,Nostrand,Northum,Norsen,Norlander,Norkus,Norgaard,Norena,Nored,Nobrega,Niziolek,Ninnemann,Nievas,Nieratko,Nieng,Niedermeyer,Niedermaier,Nicolls,Niang,Newham,Newcome,Newberger,Nevills,Nevens,Nevel,Neumiller,Netti,Net,Nessler,Neria,Nemet,Nelon,Nellon,Neller,Neisen,Neilly,Neifer,Neid,Negro,Neering,Neehouse,Neef,Needler,Nebergall,Nealis,Naumoff,Naufzinger,Narum,Narro,Narramore,Naraine,Napps,Nansteel,Namisnak,Namanny,Nallie,Nakhle,Naito,Naccari,Nabb,Myracle,Myra,Myhand,Mwakitwile,Muzzy,Muscolino,Musco,Muscente,Muscat,Muscara,Musacchia,Musa,Murrish,Murfin,Muray,Munnelly,Munley,Munivez,Mundine,Mundahl,Munari,Mulling,Mullennex,Mullendore,Mulkhey,Mulinix,Mulders,Muhl,Muenchow,Muellner,Mudget,Mudger,Muckenfuss,Muchler,Mozena,Movius,Mouldin,Motola,Mosseri,Mossa,Moselle,Mory,Morsell,Morrish,Morles,Morie,Morguson,Moresco,Morck,Moppin,Moosman,Moons,Montuori,Montono,Montogomery,Montis,Monterio,Monter,Monsalve,Mongomery,Mongar,Mondello,Moncivais,Monard,Monagan,Molt,Mollenhauer,Moldrem,Moldonado,Molano,Mokler,Moisant,Moilanen,Mohrman,Mohamad,Moger,Mogel,Modine,Modin,Modic,Modha,Modena,Mlynek,Miya,Mittiga,Mittan,Mitcheltree,Miss,Misfeldt,Misener,Mirchandani,Miralles,Miotke,Miosky,Minty,Mintey,Mins,Minnie,Mince,Minassian,Minar,Mimis,Milon,Milloy,Millison,Milito,Milfort,Milbradt,Mikulich,Mikos,Miklas,Mihelcic,Migliorisi,Migliori,Miesch,Midura,Miclette,Michele,Michela,Micale,Mezey,Mews,Mewes,Mettert,Mesker,Mesich,Mesecher,Merthie,Mersman,Mersereau,Merrithew,Merriott,Merring,Merenda,Merchen,Mercardo,Merati,Mentzel,Mentis,Mentel,Menotti,Meno,Mengle,Mendolia,Mellick,Mellett,Melichar,Melhorn,Melendres,Melchiorre,Meitzler,Mehtani,Mehrtens,Megan,Meditz,Medeiras,Meckes,Me,Mcteer,Mctee,Mcparland,Mcniell,Mcnealey,Mcmanaway,Mcleon,Mclay,Mclavrin,Mcklveen,Mckinzey,Mcken,Mckeand,Mckale,Mcilwraith,Mcilroy,Mcgreal,Mcgougan,Mcgettigan,Mcgarey,Mcfeeters,Mcelhany,Mcdaris,Mccomis,Mccomber,Mccolm,Mccollins,Mccollin,Mccollam,Mccoach,Mcclory,Mcclennon,Mccathern,Mccarthey,Mccarson,Mccarrel,Mccargar,Mccandles,Mccamish,Mccally,Mccage,Mcbrearty,Mcaneny,Mcanallen,Mcalarney,Mcaferty,Mazzo,Mazy,Mazurowski,Mazique,Mayoras,Mayden,Maxberry,Mauller,Matusiak,Mattsen,Matthey,Matters,Matkins,Mathiasen,Mathe,Mateus,Mate,Matalka,Masullo,Massay,Mashak,Mascroft,Martinex,Martenson,Marsiglia,Marsella,Marseille,Maroudas,Marotte,Marner,Marlo,Markes,Marina,Maret,Mareno,Marean,Marcinkiewicz,Marchel,Marasigan,Manzueta,Manzanilla,Manternach,Manring,Manquero,Manoni,Manne,Mankowski,Manjarres,Mangen,Mangat,Mandonado,Mandia,Mancias,Manbeck,Mamros,Mam,Maltez,Mallia,Mallar,Malla,Mall,Malen,Malaspina,Malahan,Malagisi,Malachowski,Makowsky,Makinen,Makepeace,Majkowski,Majid,Majestic,Majercin,Maisey,Mainguy,Mailliard,Maignan,Mahlman,Maha,Magsamen,Magpusao,Magnano,Magley,Magedanz,Magarelli,Magaddino,Maenner,Madnick,Maddrey,Madaffari,Macnaughton,Macmullen,Macksey,Macknight,Macki,Macisaac,Maciejczyk,Maciag,Macho,Machenry,Machamer,Macguire,Macdougal,Macdaniel,Maccormack,Maccabe,Mabbott,Mabb,Lynott,Lyndon,Lym,Lydia,Lycan,Luy,Lutwin,Luscombe,Lusco,Lusardi,Luria,Lunetta,Lundsford,Lumas,Luisi,Luevanos,Lueckenhoff,Ludgate,Ludd,Lucherini,Lubbs,Lozado,Lovie,Lourens,Lounsberry,Loughrey,Loughary,Lotton,Losser,Loshbaugh,Loser,Loseke,Loscalzo,Los,Lortz,Loperena,Loots,Loosle,Looman,Longstaff,Longobardi,Longbottom,Lomay,Lomasney,Lohrmann,Lohmiller,Logalbo,Loetz,Loeffel,Lodwick,Lodrigue,Lockrem,Llera,Llarena,Liv,Littrel,Littmann,Lisser,Lippa,Lipner,Linnemann,Lingg,Lindemuth,Lindeen,Limbo,Lillig,Likins,Lights,Lieurance,Liesmann,Liesman,Liendo,Lickert,Lichliter,Leyvas,Leyrer,Lewy,Leubner,Letters,Lesslie,Lesnick,Lesmerises,Lerno,Lequire,Lepera,Lepard,Lenske,Leneau,Lempka,Lemmen,Lemm,Lemere,Leinhart,Leichner,Leicher,Leibman,Lehmberg,Leggins,Lebeda,Leavengood,Leanard,Lazaroff,Laventure,Lavant,Lauster,Laumea,Latigo,Lasota,Lashure,Lasecki,Lascurain,Lartigue,Larouche,Lappe,Laplaunt,Laplace,Lanum,Lansdell,Lanpher,Lanoie,Lankard,Laniado,Langowski,Langhorn,Langfield,Langfeldt,Landt,Landingham,Landerman,Landavazo,Lampo,Lampke,Lamper,Lamery,Lambey,Lamadrid,Lallemand,Laisure,Laigo,Laguer,Lagerman,Lageman,Lagares,Lacosse,Lachappelle,Labs,Laborn,Labonne,Kyung,Kuzia,Kutt,Kutil,Kus,Kurylo,Kurowski,Kuriger,Kupcho,Kulzer,Kulesa,Kules,Kuhs,Kuhne,Krutz,Krus,Krupka,Kronberg,Kromka,Kroese,Krizek,Krivanek,Krishna,Kringel,Kreiss,Kratofil,Krapp,Krakowsky,Kracke,Kozlow,Koy,Kowald,Kover,Kovaleski,Kothakota,Kosten,Koskinen,Kositzke,Korff,Korey,Korbar,Kor,Kopplin,Koplin,Koos,Konyn,Konczak,Komp,Komo,Kolber,Kolash,Kolakowski,Kohm,Kogen,Koestner,Koegler,Kodama,Kocik,Kochheiser,Kobler,Kobara,Knezevich,Kneifl,Knapchuck,Knabb,Klutz,Klugman,Klosner,Klingel,Klimesh,Klice,Kley,Kleppe,Klemke,Kleinmann,Kleinhans,Kleinberg,Kleffner,Kleckley,Klase,Kisto,Kissick,Kisselburg,Kirsten,Kirschman,Kirks,Kirkner,Kirkey,Kirchman,Kipling,Kinville,Kinnunen,Kingdom,Kimmey,Kimmerle,Kimbley,Kilty,Kilts,Killmeyer,Killilea,Killay,Kiest,Kierce,Kiepert,Kielman,Khalid,Kewal,Keszler,Kesson,Kesich,Kerwood,Kerksiek,Kerkhoff,Kerbo,Keranen,Keomuangtai,Kenter,Kennelley,Keniry,Kendzierski,Kempner,Kemmis,Kemerling,Kelsay,Kelchner,Kela,Keithly,Keipe,Kegg,Keer,Keahey,Kaywood,Kayes,Kawahara,Kasuboski,Kastendieck,Kassin,Kasprzyk,Karraker,Karnofski,Karman,Karger,Karge,Karella,Karbowski,Kapphahn,Kap,Kannel,Kamrath,Kaminer,Kamansky,Kalua,Kaltz,Kalpakoff,Kalkbrenner,Kaku,Kaib,Kaehler,Kackley,Kaber,Justo,Juris,Jurich,Jurgenson,Jurez,Junor,Juniel,Juncker,Jugo,Jubert,Jowell,Jovanovic,Josiah,Joosten,Joncas,Joma,Johnso,Johanns,Jodoin,Jockers,Joans,Jinwright,Jinenez,Jimeson,Jerrett,Jergens,Jerden,Jerdee,Jepperson,Jendras,Jeanfrancois,Jazwa,Jaussi,Jaster,Jarzombek,Jarencio,Janocha,Jakab,Jadlowiec,Jacobsma,Jach,Izaquirre,Iwaoka,Ivaska,Iturbe,Israelson,Ismael,Isles,Isachsen,Isaak,Irland,Inzerillo,Insogna,Ingegneri,Ingalsbe,Inciong,Inagaki,Idol,Icenogle,Hyon,Hyett,Hyers,Huyck,Hutti,Hutten,Hutnak,Hussar,Husky,Hurrle,Hurford,Hurde,Hupper,Hunkin,Hunkele,Hunke,Hun,Humann,Huhtasaari,Hugger,Hugel,Huge,Hufft,Huegel,Hrobsky,Hren,Hoyles,Howlin,Hovsepian,Hovenga,Hovatter,Houdek,Hotze,Hossler,Hossfeld,Hosseini,Horten,Hort,Horr,Horgen,Horen,Hoopii,Hoon,Hoogland,Hontz,Honnold,Homewood,Holway,Holtgrewe,Holtan,Holstrom,Holstege,Hollway,Hollingshed,Holling,Hollenback,Hollard,Holberton,Hoines,Hogeland,Hofstad,Hoetger,Hoen,Hoaglund,Hirota,Hintermeister,Hinnen,Hinders,Hinderer,Hinchee,Himelfarb,Himber,Hilzer,Hilling,Hillers,Hillegas,Hildinger,Hignight,Highman,Hierholzer,Heyde,Hettich,Hesketh,Herzfeld,Herzer,Hershenson,Hershberg,Hernando,Hermenegildo,Hereth,Hererra,Hereda,Herbin,Heraty,Herard,Hepa,Henschel,Henrichsen,Hennes,Henneberger,Heningburg,Henig,Hendron,Hendericks,Hemple,Hempe,Hemmingsen,Hemler,Helvie,Helmly,Helmbrecht,Heling,Helin,Helfrey,Helble,Helaire,Heizman,Heisser,Heiny,Heinbaugh,Heigh,Heidemann,Heidema,Heiberger,Hegel,Heerdt,Heeg,Heefner,Heckerman,Heckendorf,Heavin,Headman,Haynesworth,Haylock,Hayakawa,Hawksley,Hawking,Haverstick,Haut,Hausen,Hauke,Haubold,Hattan,Hattabaugh,Hasten,Hasstedt,Hashem,Haselhorst,Harrist,Harpst,Haroldsen,Harmison,Harkema,Hark,Harison,Hariri,Harcus,Harcum,Harcourt,Harcharik,Hanzel,Hanvey,Hantz,Hansche,Hansberger,Hannig,Hanken,Hanhardt,Hanf,Hanauer,Hamberlin,Halward,Halsall,Hals,Hallquist,Hallmon,Halk,Halbach,Halat,Hajdas,Hainsworth,Haik,Hahm,Hagger,Haggar,Hader,Hadel,Haddick,Hackmann,Haasch,Haaf,Guzzetta,Guzy,Gutterman,Gutmann,Gutkowski,Gustine,Gursky,Gurner,Gunsolley,Gumpert,Gumbel,Gulla,Guilmain,Guiliani,Guier,Guers,Guerero,Guerena,Guebara,Guadiana,Grunder,Grothoff,Grosland,Grosh,Groos,Grohs,Grohmann,Groepper,Grodi,Grizzaffi,Grissinger,Grippi,Grinde,Griffee,Grether,Greninger,Greigo,Gregorski,Greger,Grega,Greenberger,Graza,Grattan,Grasse,Gras,Grano,Gramby,Gradilla,Govin,Goutremout,Goulas,Gotay,Gosling,Gorey,Goren,Gordner,Goossen,Goon,Goodwater,Gonzaga,Gonyo,Gonska,Gongalves,Gomillion,Gombos,Golonka,Gollman,Goldtrap,Goldammer,Golas,Golab,Gola,Gogan,Goffman,Goeppinger,Godkin,Godette,Glore,Glomb,Glauner,Glassey,Glasner,Gividen,Giuffrida,Gishal,Giovanelli,Ginoza,Ginns,Gindlesperger,Gindhart,Gillem,Gilger,Giggey,Giebner,Gibbson,Giacomo,Giacolone,Giaccone,Giacchino,Ghere,Gherardini,Gherardi,Gfeller,Getts,Gerwitz,Gervin,Gerstle,Gerfin,Geremia,Gercak,General,Gener,Gencarelli,Gehron,Gehrmann,Geffers,Geery,Geater,Gawlik,Gaudino,Garsia,Garrahan,Garrabrant,Garofolo,Garigliano,Garfinkle,Garelick,Gardocki,Garafola,Gappa,Gantner,Ganther,Gangelhoff,Gamarra,Galstad,Gally,Gallik,Gallier,Galimba,Gali,Galassi,Gaige,Gadsby,Gabby,Gabbin,Gabak,Fyall,Furney,Funez,Fulwider,Fulson,Fukunaga,Fujikawa,Fugere,Fuertes,Fuda,Fryson,Frump,Frothingham,Froning,Froncillo,Frohling,Froberg,Froats,Fritchman,Frische,Friedrichsen,Friedmann,Fridge,Friddell,Frid,Fresch,Frentzel,Freno,Frelow,Freimuth,Freidel,Freehan,Freeby,Freeburn,Fredieu,Frederiksen,Fredeen,Frazell,Frayser,Fratzke,Frattini,Franze,Franich,Francescon,Francesco,Frames,Framer,Fraiser,Fragman,Frack,Foxe,Fowlston,Fosberg,Fortna,Fornataro,Forden,Foots,Foody,Fogt,Foglia,Fogerty,Fogelson,Flygare,Flowe,Florentine,Flinner,Flem,Flatten,Flath,Flater,Flahaven,Flad,Fjeld,Fitanides,Fistler,Fishbaugh,Firsching,Fireman,Finzel,Finical,Fingar,Filosa,Filicetti,Filby,Fierst,Fierra,Ficklen,Ficher,Fersner,Ferrufino,Ferrucci,Fero,Ferns,Ferlenda,Ferko,Fergerstrom,Ferge,Fenty,Fent,Fennimore,Fendt,Femat,Felux,Felman,Feldhaus,Feisthamel,Feijoo,Feiertag,Fehrman,Fehl,Feezell,Feeny,Feeback,Fedigan,Fedder,Fechner,Feary,Fayson,Faylor,Fauteux,Faustini,Faure,Fauci,Fauber,Fattig,Farruggio,Farrens,Fare,Faraci,Fantini,Fantin,Fanno,Fannings,Faniel,Fallaw,Falker,Falkenhagen,Fajen,Fahrner,Fabel,Fabacher,Eytcheson,Eyster,Exford,Exel,Exe,Evetts,Evenstad,Evanko,Euresti,Euber,Etcitty,Estler,Esther,Essner,Essinger,Esplain,Espenshade,Espanol,Espaillat,Escribano,Escorcia,Errington,Errett,Errera,Erlanger,Erenrich,Erekson,Erber,Entinger,Ensworth,Ensell,Enno,Ennen,Englin,Engblom,Engberson,Encinias,Enama,Emel,Elzie,Elsbree,Elmo,Elman,Elm,Ellebracht,Elkan,Elfstrom,Elerson,Eleazer,Eleam,Eldrige,Elcock,Einspahr,Eike,Eidschun,Eid,Eickman,Eichele,Eiche,Ehlke,Eguchi,Eggink,Edouard,Edgehill,Eckes,Eblin,Ebberts,Eavenson,Earvin,Eardley,Eagon,Eader,Dzubak,Dylla,Dyckman,Dwire,Dutrow,Dutile,Dusza,Dustman,Dusing,Duryee,Durupan,Durtschi,Durtsche,Durell,Dunny,Dunnegan,Dunken,Dun,Dumm,Dulak,Duker,Dukelow,Dufort,Dufilho,Duffee,Duett,Dueck,Dudzinski,Dudasik,Duckwall,Duchemin,Dubrow,Dubis,Dubicki,Duba,Drust,Druckman,Drinnen,Drewett,Drewel,Dreitzler,Dreckman,Drappo,Draffen,Drabant,Doyen,Dowding,Doub,Dorson,Dorschner,Dorrington,Dorney,Dormaier,Dorff,Dorcy,Donges,Donelly,Donel,Domangue,Dols,Dollahite,Dolese,Doldo,Doiley,Dohrman,Dohn,Doheny,Doceti,Dobry,Dobrinski,Dobey,Divincenzo,Dischinger,Dirusso,Dirocco,Dipiano,Diop,Dinitto,Dinehart,Dimsdale,Diminich,Dimalanta,Dillavou,Dilello,Difusco,Diffey,Diffenderfer,Diffee,Difelice,Difabio,Dietzman,Dieteman,Diepenbrock,Dieckmann,Dicey,Dicampli,Dibari,Diazdeleon,Diallo,Dewitz,Dewiel,Devoll,Devol,Devincent,Devier,Devendorf,Devalk,Detten,Detraglia,Dethomas,Deter,Detemple,Desler,Desharnais,Desanty,Derocco,Dermer,Derks,Derito,Derick,Derhammer,Deraney,Dequattro,Depass,Depadua,Deon,Denzel,Denyes,Denyer,Dentino,Denlinger,Deneal,Demory,Demopoulos,Demontigny,Demonte,Demeza,Delsol,Delrosso,Delpit,Delpapa,Delouise,Delone,Delo,Delmundo,Delmore,Delmar,Dellapaolera,Delfin,Delfierro,Deleonardis,Delenick,Delcarlo,Delcampo,Delcamp,Delawyer,Delaware,Delaroca,Delaluz,Delahunt,Delaguardia,Dekeyser,Dekay,Dejaeger,Dejackome,Dehay,Dehass,Degraffenried,Degenhart,Degan,Deever,Deedrick,Deckelbaum,Dechico,Decent,Dececco,Decasas,Debrock,Debona,Debeaumont,Debarros,Debaca,Dearmore,Deangelus,Dealmeida,Dawood,Davney,Daudt,Datri,Dasgupta,Darring,Darracott,Darius,Darcus,Daoud,Dansbury,Dannels,Danish,Danielski,Danehy,Dancey,Damour,Dambra,Daman,Dalcour,Daisey,Dahlheimer,Dagon,Dadisman,Dacunto,Dacamara,Dabe,Cyrulik,Cyphert,Cwik,Cussen,Curles,Curit,Curby,Curbo,Cunas,Cunard,Cunanan,Cumpton,Culcasi,Cui,Cucinotta,Cucco,Csubak,Cruthird,Crumwell,Crummitt,Crumedy,Crouthamel,Cronce,Cromack,Cristina,Crisafi,Crimin,Cresto,Crescenzo,Cremonese,Creedon,Credit,Crankshaw,Cozzens,Cove,Coval,Courtwright,Courcelle,Coupland,Counihan,Coullard,Cotrell,Cosgrave,Cornfield,Cornelio,Corish,Cordoua,Corbit,Coppersmith,Coonfield,Cools,Conville,Contrell,Contento,Conser,Conrod,Connole,Congrove,Conery,Condray,Colver,Coltman,Colflesh,Colcord,Colavito,Colar,Coile,Coggan,Coenen,Codling,Coda,Cockroft,Cockrel,Cockerill,Cocca,Coberley,Coaster,Clouden,Clos,Clive,Clish,Clint,Clinkscale,Clester,Clammer,City,Cittadino,Citrano,Ciresi,Cillis,Ciccarelli,Ciborowski,Ciarlo,Ciardullo,Chritton,Chopp,Choo,Chirco,Chilcoat,Chevarie,Cheslak,Chernak,Chay,Chatterjee,Chatten,Chatagnier,Chastin,Chappuis,Channing,Channey,Champlain,Chalupsky,Chalfin,Chaffer,Chadek,Chadderton,Cestone,Cestero,Cestari,Cerros,Cermeno,Centola,Cedrone,Cayouette,Cavan,Cavaliero,Casuse,Castricone,Castoreno,Casten,Castanada,Castagnola,Casstevens,Cassio,Cassi,Cassanova,Caspari,Casher,Cashatt,Casco,Casassa,Casad,Carville,Carvel,Cartland,Cartegena,Carsey,Carsen,Carrino,Carrilo,Carpinteyro,Carmley,Carlston,Carlsson,Carie,Cariddi,Caricofe,Carel,Cardy,Carducci,Carby,Carangelo,Capriotti,Capria,Caprario,Capelo,Canul,Cantua,Cantlow,Canny,Cangialosi,Canepa,Candland,Campolo,Campi,Camors,Camino,Camfield,Camelo,Camarero,Camaeho,Calvano,Callum,Calliste,Caldarella,Calcutt,Calcano,Caissie,Cager,Caccamo,Cabotage,Cabble,Byman,Buzby,Butkowski,Bussler,Busico,Bushy,Bushovisky,Busbin,Busard,Busalacchi,Burtman,Burrous,Burridge,Burrer,Burno,Burin,Burgette,Burdock,Burdier,Burckhard,Bunten,Bungay,Bundage,Bumby,Bultema,Bulinski,Bulan,Bukhari,Buganski,Buerkle,Buen,Buehl,Bue,Budzynski,Buckham,Bub,Bryk,Brydon,Bruyere,Brunsvold,Brunnett,Brunker,Brunfield,Brumble,Brue,Brozina,Brossman,Brosey,Brookens,Broersma,Brodrick,Brockmeier,Brockhouse,Brisky,Brinkly,Brine,Brincefield,Brighenti,Brigante,Brieno,Briede,Bridenbaugh,Bridegroom,Brickett,Bria,Breske,Brener,Brenchley,Breitkreutz,Breitbart,Breister,Breining,Breighner,Breidel,Brehon,Breheny,Breard,Brean,Breakell,Breach,Brazill,Braymiller,Braum,Brau,Brashaw,Bransom,Brandolino,Brancato,Branagan,Braff,Brading,Bracker,Brackenbury,Bracher,Braasch,Boylen,Boyda,Boyanton,Bowlus,Bowditch,Boutot,Bouthillette,Boursiquot,Bourjolly,Bouret,Bouquet,Boulerice,Bouer,Bouchillon,Bouchie,Bottin,Boteilho,Bosko,Bosack,Borys,Bors,Borla,Borjon,Borghi,Borah,Booty,Booten,Boore,Bonuz,Bonne,Bongers,Boneta,Bonawitz,Bonanni,Bomer,Bollen,Bollard,Bolla,Bolio,Boisseau,Boies,Boiani,Bohorquez,Boghossian,Boespflug,Boeser,Boehl,Boegel,Bodrick,Bodkins,Bodenstein,Bodell,Bockover,Bocci,Bobbs,Boals,Boahn,Boadway,Bluma,Bluett,Bloor,Blomker,Blevens,Blethen,Bleecker,Blayney,Blaske,Blasetti,Blancas,Blackner,Blackie,Bjorkquist,Bjerk,Bizub,Bisono,Bisges,Bisaillon,Birr,Birnie,Bires,Birdtail,Birdine,Bina,Billock,Billinger,Billig,Billet,Bigwood,Bigalk,Bielicki,Biddick,Biccum,Biafore,Bhagat,Beza,Beyah,Bex,Bevier,Bevell,Beute,Betzer,Betthauser,Bethay,Bethard,Beshaw,Bertholf,Bertels,Berridge,Bernot,Bernath,Bernabei,Berkson,Berkovitz,Berkich,Bergsten,Berget,Berezny,Berdin,Beougher,Benthin,Benhaim,Benenati,Benejan,Bemiss,Beloate,Bellucci,Bells,Bellotti,Belling,Bellido,Bellaire,Bellafiore,Bekins,Bekele,Beish,Behnken,Beerly,Beddo,Becket,Becke,Bebeau,Beauchaine,Beaucage,Beadling,Beacher,Bazar,Baysmore,Bayers,Baun,Baulch,Baucher,Batto,Baton,Bathe,Basora,Baruffi,Bartimus,Bartholemew,Barrickman,Barribeau,Barreda,Barrack,Baroody,Barness,Barn,Barmer,Barillari,Barias,Barginear,Barg,Barde,Barbone,Barbato,Barbarin,Baoloy,Bansal,Bangle,Banducci,Bandel,Bambeck,Balter,Ballif,Baller,Balladares,Balkus,Baldy,Baldivia,Balcerzak,Balazs,Baksh,Bakr,Bakemeier,Baisey,Bainer,Bailly,Bagge,Badua,Badini,Bachtell,Bachrodt,Bachorski,Bacak,Babula,Bable,Babjeck,Babecki,Azbell,Ayudan,Awai,Avita,Avino,Avellar,Auzat,Autman,Autio,Autery,Ausman,Ausland,Aulabaugh,Augle,Aughenbaugh,Augeri,Audi,Attleson,Attig,Attal,Ator,Asselmeier,Askland,Asiello,Asch,Arya,Artola,Arslanian,Arron,Arrezola,Arnesen,Arnau,Armster,Armintrout,Armento,Armato,Arkenberg,Ariaza,Arguin,Arenson,Areias,Archut,Archibold,Arave,Arand,Appelman,Appello,Antonson,Antoniewicz,Antill,Antigua,Annino,Anness,Anneler,Angustia,Angry,Angiolillo,Angelico,Andreula,Andreen,Andreassi,Andeson,Ander,Anda,Anania,Anadio,Amicone,Amenta,Alzaga,Alwardt,Aluarado,Altreche,Altic,Alsobrooks,Alpern,Almodova,Almas,Alltop,Alliston,Allio,Alipio,Alicandro,Alibozek,Alguire,Alff,Alcalde,Alborn,Albery,Alberry,Albany,Albani,Albanez,Alavi,Akkerman,Ahlheim,Agresti,Agnelli,Agilar,Agib,Aggas,Afton,Afonso,Adil,Adi,Adank,Adamsky,Acri,Accurso,Abruzzese,Abrew,Abeln,Abdullai,Abdulkarim,Abdelrahman,Abbenante,Abatiell,Abaloz,Zyskowski,Zwiefel,Zurmiller,Zupancic,Zuno,Zumsteg,Zumbrennen,Zumaya,Zullinger,Zuleger,Zozaya,Zourkos,Zorrilla,Zorko,Zolocsik,Zittel,Ziobro,Zimmerly,Zimmerli,Zillmer,Zigmond,Zierer,Zieber,Zide,Zevenbergen,Zephier,Zemel,Zelazo,Zeitlin,Zeiser,Zehring,Zeger,Zedian,Zearfoss,Zbranek,Zaya,Zatarain,Zasso,Zarn,Zarilla,Zari,Zapp,Zapf,Zanghi,Zange,Zamacona,Zalesky,Zalazar,Zaki,Zafar,Zade,Yusko,Yurman,Yurkovich,Yuhasz,Younge,Yiu,Yeasted,Yarrito,Yark,Yarboro,Yannuzzi,Yankovich,Yanagawa,Yago,Yaffe,Wyndham,Wyms,Wyand,Wuensch,Wryals,Wrubel,Worosz,Woolstenhulme,Wolpe,Wolner,Wolgamot,Wolfman,Wojtaszek,Woeppel,Woehr,Wodarski,Wizwer,Wittkop,Wisseman,Wisor,Wishum,Wischmann,Wisch,Wirkkala,Wion,Wintjen,Wintermute,Wintermantel,Winks,Winkey,Winham,Windschitl,Willow,Willitzer,Willier,Willets,Willenbrink,Willen,Willaimson,Wilfahrt,Wilenkin,Wilen,Wildeboer,Wilchek,Wigren,Wignall,Wiggington,Wierson,Wiegman,Wiegel,Widmayer,Wider,Widder,Wickey,Wickers,Wical,Whiton,Whitenton,Whiteleather,Whiston,Whirley,Whetham,Wheatly,Wetenkamp,Westenberger,Westenbarger,Westall,Werblow,Wengel,Welson,Welschmeyer,Wellmann,Wellbrock,Wela,Wekenborg,Weiter,Weisenstein,Wehmann,Weeda,Wede,Webley,Waver,Wauford,Waterworth,Watchorn,Wassinger,Wassell,Wasp,Wasiuta,Warnix,Warning,Warnes,Warmoth,Warling,Warila,Warga,Warburg,Wanzer,Want,Waner,Wanek,Walwyn,Walle,Walkner,Walin,Waletzko,Waler,Walenta,Wainer,Wailes,Wahr,Waddel,Wactor,Wachtler,Wachsman,Wachowski,Vulgamore,Vukelich,Vote,Vost,Voskamp,Vorwerk,Vongphakdy,Volpi,Volle,Volino,Voeks,Vodopich,Vittone,Virdin,Virag,Vinroe,Vinegar,Vindiola,Vilmont,Villerreal,Villaneva,Villalobas,Villada,Vilhauer,Vilchis,Vilches,Viggiani,Vig,Vieux,Viets,Vient,Vielle,Viejo,Vidovich,Vichi,Veys,Veverka,Verser,Veronesi,Vernoy,Vermont,Verhines,Verheyen,Veren,Vereb,Verano,Venuto,Ventry,Ventrone,Veltz,Velo,Velazguez,Veeser,Vassey,Vasque,Varin,Varaza,Varady,Vaquez,Vaquerano,Vansteenwyk,Vanschoick,Vanroekel,Vannorden,Vanlent,Vangrouw,Vangelder,Vanes,Vanelli,Vanderkar,Vanderbeek,Vandenburgh,Vandekieft,Vandekamp,Vancura,Vancooten,Vanconey,Vancampen,Vanaria,Valvano,Vallette,Vallero,Valiton,Valin,Valeri,Valek,Valdovino,Valdivieso,Vakas,Vagas,Vadala,Vaccarella,Vacanti,Urrabazo,Urguhart,Urda,Urbino,Urbas,Upmeyer,Umphlett,Ulerio,Uitz,Uchimura,Uccello,Tysdal,Ty,Tweedle,Turrubiates,Turrubiartes,Turri,Turnham,Turko,Turben,Tupin,Tumulty,Tuffey,Tuckey,Tuckett,Tucholski,Tubolino,Tubergen,Tsuboi,Tschumperlin,Tschoepe,Trynowski,Tryba,Truslow,Truog,Trumball,Trudelle,Trojillo,Trnka,Trizarry,Trigueiro,Trigleth,Tricomi,Tresselt,Trentacoste,Trendell,Trenary,Treml,Treleven,Treherne,Treasure,Trayer,Travino,Traugott,Trappey,Tranbarger,Tramontano,Tramell,Trainum,Traino,Traill,Trabucco,Townsell,Tourtillott,Touar,Toscani,Torrella,Torguson,Torda,Top,Toomes,Tonner,Tommasino,Tomaro,Tolve,Tolefree,Toguchi,Tofflemire,Tofanelli,Tody,Toce,Tobacco,Toan,Toalson,Tkacik,Tirone,Tipple,Tippery,Tinson,Tinnell,Timper,Timmers,Times,Timblin,Tilotta,Tillberg,Tijernia,Tigges,Tigar,Tielking,Thyng,Thonen,Thomley,Thombs,Thimmesch,Thier,Thevenin,Theodorov,Theodoropoulo,Tharnish,Tharaldson,Thackaberry,Tewari,Tetu,Tetter,Tersigni,Tepezano,Tennon,Tennent,Teichman,Teehan,Tayloe,Taus,Tatis,Tata,Tat,Tashima,Tarufelli,Tarlow,Tarkowski,Tarka,Targett,Taran,Tarabokija,Tappen,Tanzer,Tanous,Tanigawa,Taneja,Tammo,Tallerico,Tallada,Talk,Talhelm,Takehara,Takata,Tagliavia,Taffer,Tadman,Tacdol,Tacconi,Tables,Szewczak,Szeredy,Szanto,Sympson,Symmes,Syers,Sydney,Syas,Swinny,Swierk,Swendsen,Sweigard,Sweezey,Sweesy,Sween,Sweely,Sweed,Sweazy,Swauger,Swansbrough,Swango,Swanda,Swamp,Swallows,Swaggerty,Svatek,Survant,Surowka,Surina,Suozzi,Sunstrom,Sunford,Sundseth,Sundahl,Summerill,Sumida,Sumbler,Suma,Sulyma,Sulla,Sulieman,Suit,Sugiyama,Suell,Sudo,Suddreth,Sucher,Sturn,Sturkey,Studzinski,Studler,Stuckmeyer,Stryjewski,Stroy,Strotman,Strollo,Stroik,Stroede,Streeby,Stredny,Strazi,Stray,Strawderman,Straiton,Stower,Stoudmire,Stormont,Stopka,Stoneback,Stoldt,Stolarz,Stolarski,Stockmaster,Stobb,Stivason,Stirk,Stipp,Stipes,Stingel,Stike,Stiebel,Stidd,Steurer,Sterley,Sterle,Stepro,Stepovich,Stephson,Stenseth,Stenerson,Stello,Steinbrook,Steidley,Stehlin,Stegmaier,Stefanow,Steese,Steenhuis,Stavely,Stave,Stautz,Staunton,Stater,Stas,Startup,Startt,Startin,Starratt,Stargell,Starcevich,Stank,Stanis,Standing,Stancliff,Stanchfield,Stanbrough,Stakes,Stahmer,Staheli,Staebell,Stadtlander,Stadheim,Sroufe,Sroczynski,Srnsky,Sreaves,Srader,Squeo,Spuler,Sproat,Springmeyer,Sprengeler,Sport,Spolar,Spivack,Spinale,Spiegler,Spickerman,Spessard,Spenner,Speich,Spaziano,Sparaco,Spalter,Sowells,Sovich,Southmayd,Southgate,Sotto,Sotomayer,Sosaya,Sorvillo,Sorrel,Soos,Songco,Somerset,Somero,Soll,Soldan,Solarzano,Solana,Sokal,Soibelman,Soesbe,Sobotta,Sobina,Sobeck,Soard,Snorton,Snopek,Snoozy,Snethen,Smithhisler,Smee,Smaniotto,Slusarski,Slowe,Slotnick,Sleva,Sleighter,Slappey,Skyers,Skutt,Skorcz,Skoczylas,Skillicorn,Skiffington,Skibicki,Skerl,Skehan,Skalla,Siwinski,Sivley,Sittloh,Sitterly,Sith,Sit,Sise,Siroky,Sirles,Sirin,Sirignano,Siren,Sinsabaugh,Sinks,Sinisi,Sinibaldi,Singson,Sindlinger,Simpkin,Siminski,Simcoe,Siford,Siegert,Sidor,Sidhom,Siddique,Siddell,Sicotte,Sichting,Sicari,Sic,Siano,Shufflebarger,Shramek,Shortnacy,Sholler,Sholette,Sholders,Shogren,Shoenberger,Shoemate,Shoat,Shinoda,Shines,Shimshak,Shigley,Sheward,Shetrone,Shetlar,Sherretts,Sherod,Shenkle,Shely,Sheltra,Shelpman,Shellabarger,Shelite,Sheldrick,Shelburn,Sheinbein,Shebby,Shawley,Shatrau,Shartle,Sharifi,Shanker,Shami,Shamel,Shamburg,Shamas,Shallow,Shaffstall,Shadowens,Shackleton,Shaak,Seykora,Seyfert,Sevillano,Sevcik,Seubert,Seu,Setter,Sesler,Servatius,Serrant,Serramo,Serl,Serini,Serenil,Serapion,Sept,Sensibaugh,Sens,Senich,Sengbusch,Sendra,Senate,Semrau,Semrad,Sempertegui,Semons,Semke,Selma,Sellinger,Seliga,Sekel,Seilheimer,Seigfried,Seesholtz,Seefeld,Seecharran,Sedrakyan,Seavy,Search,Seamster,Seabold,Scyoc,Sculley,Scullawl,Scrogham,Scow,Scopa,Scontras,Sciulli,Sciola,Scifres,Schweyen,Schwering,Schwerdtfeger,Schweim,Schweikert,Schweder,Schwebel,Schwartzwalde,Schusterman,Schuhmann,Schuerman,Schuchman,Schrotenboer,Schreurs,Schoppert,Schopper,Schools,Schoneman,Scholfield,Schoeppner,Schoenleber,Schoeman,Schoel,Schnurbusch,Schnepel,Schnader,Schlarb,Schlappi,Schlangen,Schlaht,Schiraldi,Schinkel,Schimizzi,Schifo,Schiesher,Scheyer,Schettler,Scheppke,Schepper,Scheinost,Scheidel,Scheets,Schatzman,Scharwath,Scharp,Schaarschmidt,Schaack,Scarnato,Scarnati,Scaringi,Scarcia,Scarano,Sberna,Sawina,Sawer,Sawaya,Sawatzky,Savcedo,Sauser,Saumier,Sauchez,Sauceman,Sathre,Satawa,Sasala,Sartoris,Sare,Sarchet,Saracco,Santulli,Santory,Santorelli,Santopietro,Sansing,Sanseverino,Saniatan,Sangiacomo,Sanges,Sanfratello,Sanflippo,Sandona,Sandelin,Sandate,Samona,Sammis,Sambor,Samano,Salvitti,Salvietti,Salvi,Salum,Salsa,Salonek,Salm,Salles,Sall,Salera,Salemo,Salee,Salak,Sakihara,Sakasegawa,Sakaguchi,Sagastegui,Saeturn,Sadan,Sacayanan,Saborio,Sabeiha,Sabedra,Sabagh,Rzepecki,Rzasa,Ryser,Ryner,Rydman,Rycroft,Rybij,Ruyes,Ruttan,Russon,Rushe,Rusert,Rusell,Runnells,Rundstrom,Rumschlag,Rullman,Ruka,Ruiloba,Ruh,Ruggs,Ruffer,Ruest,Rueluas,Rueger,Ruediger,Rubinoff,Rubendall,Rozmus,Roxburgh,Rowls,Rousch,Rothove,Rotelli,Roszel,Roske,Roskam,Rosensteel,Rosendo,Roome,Rombough,Romash,Romanson,Romanello,Romance,Rolison,Rogol,Rogas,Roese,Roehrs,Roegner,Roeger,Rodrguez,Rodeman,Rodebaugh,Rockenbaugh,Rocconi,Robleto,Robateau,Roarty,Roaf,Rivenberg,Rivara,Rivali,Risse,Risby,Ripperger,Riopelle,Ringrose,Rinebarger,Rile,Riggen,Rigano,Riff,Rifenbark,Rieper,Rieffenberger,Riedmayer,Ridolfi,Ridderhoff,Rickon,Rickers,Rickels,Richoux,Richens,Ribao,Rhodarmer,Rheingans,Reznik,Reveron,Reus,Reph,Renko,Remme,Remlinger,Remke,Remily,Reitano,Reissig,Reisher,Reinitz,Reinholtz,Reines,Reigstad,Reigh,Reichelderfer,Rehnert,Rehagen,Redline,Rediger,Redhouse,Redepenning,Recla,Rechkemmer,Reando,Razavi,Rayson,Rayna,Rax,Raveling,Rauser,Rauschenberg,Raupach,Raum,Rauen,Ratulowski,Ratterree,Ratering,Rapin,Rannels,Rane,Randhawa,Ramus,Ramsfield,Rams,Ramroop,Ramano,Raj,Raina,Raikes,Ragonese,Rafaniello,Raetz,Raether,Raeside,Radwan,Radman,Rademaker,Radar,Racki,Rachlin,Rabena,Rabassa,Rabadan,Raad,Quoss,Quizon,Quito,Quintela,Quimet,Quilty,Quilimaco,Quidley,Quezaire,Quave,Quarto,Quaranto,Quandel,Qiu,Qazi,Pyrdum,Pyon,Pyeatt,Puzinski,Putnal,Punter,Pumphery,Pumper,Pump,Pummell,Pumarejo,Pulvermacher,Pultz,Pully,Pullens,Pulkrabek,Pulk,Pudlinski,Puccetti,Przygocki,Przybyszewski,Prusha,Prudente,Prucnal,Prottsman,Prosch,Prodoehl,Procell,Prinzivalli,Primes,Prey,Presnar,Presho,Prentis,Preisler,Preisel,Pratka,Pratcher,Prass,Pozzuoli,Powanda,Poundstone,Potters,Potra,Potestio,Potempa,Postlethwait,Posas,Portrum,Portland,Portilla,Portie,Popovitch,Popken,Ponzio,Pontremoli,Pontarelli,Pombo,Pomainville,Polycarpe,Pollart,Politowski,Politano,Poliquin,Polczynski,Pokoj,Poitevint,Poissonnier,Poeppel,Poellot,Poehlman,Poehlein,Podratz,Pociask,Plocher,Pline,Plessinger,Plautz,Platten,Plass,Plageman,Placko,Pizzola,Pizzella,Pittsenbarger,Pittner,Pitstick,Pitsch,Pitney,Pitaniello,Pistoresi,Pirc,Pinski,Pinera,Pincock,Pinckley,Pincince,Piliero,Pilat,Pigue,Pietschman,Pierpoint,Pierini,Picon,Picking,Picardi,Phlegm,Phippin,Phetteplace,Pharel,Pfundt,Pfluger,Pfeuffer,Pfefferle,Pezzulo,Pezzano,Peveler,Pettersson,Petsch,Petrusky,Petruska,Petrulis,Petrossian,Petroske,Petrini,Petitte,Petito,Petela,Petaccio,Pesto,Pestka,Pesta,Pessoa,Perun,Perrow,Perricone,Peros,Perney,Perlin,Perigo,Perella,Percle,Pepple,Penz,Penttila,Pensiero,Penigar,Penez,Pendrak,Penas,Pellowski,Pellow,Pellin,Pelissier,Pelini,Pekrul,Peevey,Pedraja,Pecher,Peasel,Payment,Pavolini,Paviolitis,Paulsell,Paulina,Paule,Patrum,Patrone,Patrie,Patras,Patera,Patek,Patane,Pastrano,Pastora,Passow,Passley,Passaretti,Passantino,Paske,Partible,Parsa,Parnes,Parliman,Parlato,Paravati,Paradowski,Papaleo,Papagni,Paoletta,Panzarino,Pannunzio,Panis,Pandit,Paluzzi,Palomin,Palomaki,Pallanes,Palla,Pall,Palino,Palfreyman,Palazzi,Palanza,Palagi,Painton,Pain,Pahulu,Paganico,Paeth,Padlo,Padillia,Paddy,Paddick,Paciolla,Pacholski,Paap,Paa,Owolabi,Overshown,Overocker,Overgaard,Ouchi,Ottoson,Ostrye,Osterland,Osland,Oslan,Osick,Osen,Osdoba,Osberg,Orzel,Ortmeier,Orren,Ormerod,Orio,Orgeron,Orengo,Orbaker,Opiela,Opdahl,Onks,Oltrogge,Olnick,Olivarres,Olide,Oleksy,Olaya,Okray,Okonek,Okinaka,Ojima,Ojala,Oinonen,Ohotto,Ohan,Ogwin,Ogborn,Oflaherty,Offill,Oetken,Oertle,Oehlert,Odems,Oconnel,Ocha,Ocarroll,Oby,Oblak,Oberst,Obermann,Obas,Oachs,Nydegger,Nybo,Nuuanu,Nutile,Nuse,Nuriddin,Nungesser,Nuber,Noy,Novinger,Nouri,Northan,Norseworthy,Norrod,Normington,Nori,Norenberg,Nordine,Nop,Noori,Noblet,Nives,Nist,Niskala,Nilan,Nikolai,Nigl,Nightengale,Nichole,Ni,Nhek,Ngvyen,Newville,Newsam,Newnham,Newmeyer,Newlan,Newbert,Neuschwander,Neusch,Neun,Nethken,Nethercutt,Nesser,Neske,Neman,Nelton,Nelles,Nekola,Neiling,Neeser,Neelly,Nedved,Neang,Navejar,Naveja,Nauarro,Natho,Nathe,Natcher,Naser,Nasby,Narlock,Nanton,Naillon,Naill,Naguin,Nagele,Naftzger,Naegle,Naegele,Naef,Nacke,Nabritt,Mynhier,Myart,Muzquiz,Mutty,Musolino,Mushero,Murtaugh,Murie,Muresan,Murdough,Mura,Munuz,Munstermann,Munsen,Munselle,Munise,Mungle,Munerlyn,Muncher,Mulrooney,Mullee,Mulaney,Mulanax,Muhlhauser,Muhlestein,Mugleston,Mugg,Mugford,Muckel,Mucerino,Mt,Mrotek,Mrnak,Mozdzierz,Moyler,Moury,Moulin,Moulding,Moul,Mottai,Mostyn,Mosimann,Mosholder,Mosburg,Morrisseau,Moron,Morice,Morgante,Moreta,Morcos,Morasco,Morante,Mooe,Montori,Montminy,Monteforte,Montante,Montanari,Monsees,Mondier,Monden,Monckton,Monce,Monarch,Monarca,Mompoint,Mollema,Molin,Molima,Molen,Molash,Moher,Mogle,Mogannam,Moel,Moehn,Modesitt,Mobilia,Moag,Miyagawa,Mivshek,Miu,Mittman,Mittleman,Mittelsteadt,Mittelstaedt,Mitsch,Mithell,Miscione,Mirbaha,Mirabelli,Mir,Minon,Minniti,Minnerly,Mingrone,Minervini,Minerd,Minarcin,Mimnaugh,Milord,Milnor,Milnik,Millers,Milkowski,Mikrot,Mikles,Miglorie,Mientka,Midthun,Middlesworth,Micklos,Mickler,Michetti,Michelli,Michelet,Micallef,Meyn,Meullion,Mette,Metoxen,Messore,Messano,Mesaros,Mertel,Merritts,Merrion,Merril,Mermis,Merlini,Merker,Meridith,Mergel,Merbaum,Mente,Mensi,Menninger,Mennen,Menlove,Menken,Menezes,Menette,Mendyk,Mendoca,Mendivel,Mendias,Menasco,Melloy,Mellema,Mellard,Melis,Meldahl,Melberg,Meirick,Meinel,Meiler,Meile,Meidl,Meerdink,Meer,Medus,Meduna,Medovich,Medine,Medico,Medici,Mcvaigh,Mctier,Mcquirk,Mcnight,Mcmurrey,Mcmurdo,Mcmorries,Mcmilleon,Mcmickell,Mcmicheal,Mcmeel,Mcleese,Mclee,Mclaws,Mclanahan,Mclaird,Mckusker,Mckibbens,Mckenley,Mckenize,Mckendall,Mckellop,Mckellip,Mckeirnan,Mcinvale,Mcguffee,Mcgrue,Mcgregory,Mcgrann,Mcgoey,Mcglinn,Mcgillicuddy,Mcgillen,Mcgeachy,Mcgarrell,Mcgannon,Mcgalliard,Mcfarlen,Mcevers,Mcerlean,Mcennis,Mcelvany,Mcelvaine,Mcdonal,Mcdavitt,Mccullick,Mccrone,Mccreadie,Mccoun,Mcconchie,Mcconaughy,Mcconahy,Mcconaghy,Mccomsey,Mccoggle,Mcclimans,Mccleod,Mccleaf,Mcclafferty,Mccatty,Mccarry,Mccance,Mccament,Mccaghren,Mcbreen,Mcardell,Mcabier,Mazell,Mayotte,Maybrier,Mavis,Mautone,Matuszek,Mattimoe,Mattey,Matterson,Matten,Matsushima,Matsubara,Matrone,Matras,Mato,Matier,Matheus,Massucci,Massoni,Massare,Maslin,Mashaw,Mase,Mascola,Masci,Marze,Marvray,Marusak,Martowski,Martiny,Martie,Martabano,Marsha,Marschel,Marsack,Marsac,Marohnic,Markve,Markis,Marking,Marken,Marioni,Marichalar,Margosian,Maretti,Mardesich,Marcussen,Marchessault,Marcey,Maraldo,Marafioti,Manzanero,Manwill,Manual,Manocchio,Manko,Manista,Manire,Manikowski,Manganiello,Manetta,Mandy,Mandino,Mandarino,Mancinelli,Manasse,Manary,Manalang,Malling,Mallahan,Maliska,Malet,Maleski,Maldonaldo,Malaterre,Malaney,Malagarie,Malabe,Maks,Makinster,Makar,Maita,Maiolo,Mahley,Magos,Mago,Magnotti,Magnant,Maglott,Maglori,Maenius,Madkin,Madarang,Madagan,Macrina,Macquarrie,Macphee,Macneal,Macmahon,Maclellan,Mackeen,Maciver,Machkovich,Machan,Macewen,Macera,Macer,Maceachern,Macdonell,Macaskill,Maaske,Lysaght,Lynum,Lynema,Lyas,Lutton,Luttman,Lutsky,Luthi,Lutfy,Lupoe,Lundrigan,Lunderville,Lukan,Luedeman,Ludke,Lucore,Lucksinger,Lucks,Luckner,Lucarell,Lubelski,Luarca,Luaces,Lozinski,Loynes,Lowis,Lovorn,Loverde,Lovasz,Loughery,Lotzer,Losito,Loschiavo,Lorsung,Lorquet,Lorkowski,Lorino,Lorey,Lorente,Loreman,Lopaz,Looft,Lonie,Longman,Longhofer,Longan,Lomascolo,Lomack,Lolagne,Lokaphone,Logins,Loggin,Lofredo,Loffler,Loescher,Loendorf,Locus,Lockyer,Lockheart,Lobendahn,Lobasso,Lob,Lizana,Livshits,Litzau,Litty,Litteer,Litsey,Litrenta,Litner,Liszewski,Lisman,Lisboa,Liquet,Liptok,Lineweaver,Lindenpitz,Lindel,Lime,Lillywhite,Life,Lievano,Lieblong,Liebler,Lidey,Libutti,Liborio,Libengood,Leyson,Leyland,Lewczyk,Lewark,Leviner,Levenstein,Leuenberger,Leszczynski,Lestage,Leske,Lerwick,Leray,Lepkowski,Leonor,Lenyard,Lenger,Lendon,Lemarie,Leman,Lelle,Leisner,Leisey,Leischner,Leimer,Leigers,Leiferman,Leibfried,Lehoullier,Lehnortt,Legget,Legato,Legath,Legassie,Legarreta,Leftridge,Leewright,Ledsome,Lecrone,Lecourt,Lecky,Lechman,Lebsack,Lebouf,Lebon,Leazer,Leavins,Leadbeater,Lawwill,Lawall,Lavorini,Laviero,Lavertue,Lavalais,Lautenbach,Lausier,Laurita,Lauriano,Laurange,Launey,Laughead,Laufenberg,Lauderman,Laubhan,Latunski,Latulas,Lastrape,Lastiri,Lason,Laskoski,Lasanta,Laroux,Larizza,Larive,Larish,Laquerre,Lappas,Lapilio,Lapadula,Lapa,Lanzi,Lanzafame,Lantier,Lanski,Laningham,Langon,Langdale,Landron,Landero,Landauer,Landacre,Lamport,Lamping,Lamott,Lamonda,Lammi,Lambiase,Laite,Lahaye,Laframboise,Lafone,Laferte,Laeger,Ladieu,Ladabouche,Lachat,Labonville,Labbee,Labatt,Laban,Kynaston,Kwaterski,Kuzniar,Kuthe,Kuter,Kutchar,Kurtin,Kuramoto,Kupstas,Kuperman,Kuns,Kullmann,Kuligowski,Kukielka,Kuehler,Kudrna,Kubie,Kubera,Kubas,Kuba,Kualii,Krysinski,Kryder,Kronberger,Kroft,Kroencke,Kristiansen,Krigger,Krieser,Kretschman,Krentz,Krenke,Kremers,Kreitner,Kreimer,Kray,Krawchuk,Kravs,Kranich,Krampitz,Kragh,Krager,Kozuch,Kozloski,Kozatek,Kozakiewicz,Kovalsky,Kovalcik,Kovack,Kotera,Kot,Koszyk,Kostel,Kosmicki,Koshy,Korona,Koroma,Korba,Koopmann,Konstantinidi,Kolodzik,Kolodzieski,Kolle,Kolkmann,Kolker,Kolda,Kokaly,Kofford,Koepper,Koeing,Koehnen,Kodish,Kodani,Kocur,Kocourek,Kobza,Koble,Koback,Knutzen,Knows,Knolton,Knoblauch,Knispel,Knieper,Knepshield,Klyce,Klunk,Kluka,Klostermann,Klosinski,Klish,Klint,Klinner,Klindt,Klimko,Klicker,Kleman,Kleinsorge,Kleinfelder,Kleier,Klas,Klaman,Kizzee,Kitto,Kitka,Kirtdoll,Kirscht,Kintzer,Kinstle,Kinning,Kinniburgh,Kinnett,Kinker,Kinkelaar,Kings,Kingham,Kingfisher,Kimmet,Killingbeck,Kilberg,Kikuchi,Kikkert,Kiesow,Kienitz,Kidner,Kida,Kid,Khuu,Khatak,Khaleck,Kezar,Keyton,Ketelhut,Kesley,Keshishyan,Kerzman,Kertesz,Kerslake,Kerscher,Kernes,Kerin,Ker,Kenimer,Kenfield,Kempe,Kemick,Kem,Keitsock,Keisker,Keery,Keblish,Kebalka,Kearny,Kearby,Kayler,Kavin,Kauer,Kattan,Katoa,Kassis,Kashuba,Kashan,Kartman,Karry,Karpel,Karo,Karnopp,Karmazyn,Karjala,Karcz,Karasti,Karagiannis,Kapoi,Kapanke,Kanz,Kaniewski,Kanemoto,Kaneholani,Kandt,Kampfer,Kammann,Kamler,Kamal,Kalvig,Kalmen,Kalmar,Kallstrom,Kallin,Kallbrier,Kakaviatos,Kakar,Kahahane,Kagel,Kabat,Kabanuck,Kaas,Jurczak,Jurasin,Juras,Junke,Junghans,Jungen,Jund,Juliusson,Juhnke,Juett,Jolla,Jokinen,Jokela,Joffe,Joecks,Jochumsen,Joa,Jeziorski,Jesseman,Jessamy,Jernejcic,Jergenson,Jerdon,Jensrud,Jellinek,Jedrey,Jedele,Jeannette,Jauron,Jatho,Jarrel,Januszewski,Janski,Janovsek,Janning,Janikowski,Jane,Jandres,Jamaica,Jalonen,Jainlett,Jahnsen,Jahde,Jagow,Jagielski,Jaffray,Jaecks,Jacquot,Jacoway,Jacocks,Iwami,Isadore,Irmeger,Irie,Iredale,Iqbal,Inscoe,Inklebarger,Ingemi,Immen,Imig,Imberg,Imamura,Illies,Ilacqua,Ijams,Iha,Iden,Ibraham,Ibey,Ialongo,Iafrate,Hyzer,Hyacinthe,Huyard,Huxman,Hutchkiss,Hutchingson,Husson,Hussman,Hurm,Hupka,Hunyadi,Hunstad,Humpert,Hummons,Hultz,Hulton,Hules,Huisenga,Huhta,Hugueley,Hughe,Huggler,Hufton,Huffstickler,Huddelston,Huba,Hrivnak,Hoysradt,Howorth,Howenstine,Hovda,Hourani,Houglum,Houch,Hotalen,Hosse,Horwich,Horvitz,Horoschak,Hornor,Hornbrook,Horita,Hoque,Hopman,Hoovler,Hoople,Hookfin,Honeysucker,Honeycut,Honerkamp,Homyak,Homa,Holzwart,Holzerland,Holyoke,Holtry,Holterman,Holohan,Hollinshed,Hollington,Hollenshead,Holey,Holderby,Holak,Hokkanen,Hohner,Hogsed,Hoglen,Hogen,Hogberg,Hofland,Hofius,Hoffis,Hofferber,Hoffarth,Hofacker,Hoekman,Hodor,Hochstetter,Hochnadel,Hobbins,Hoa,Hlavaty,Hittner,Hitson,Hirtz,Hirschi,Hinkes,Hinke,Hindley,Hince,Hilse,Hilke,Hilferty,Hildesheim,Hikes,Hignite,Higman,Hiemer,Hidden,Hickinbotham,Hewatt,Hetz,Hetsler,Hessian,Hershaw,Herra,Hernander,Herlocker,Hepper,Henseler,Henri,Hennick,Hennecke,Hendrikson,Henderlight,Hellstrom,Helderman,Heitland,Heistand,Heiskell,Heisinger,Heiserman,Heinritz,Heinly,Heinlen,Heimerdinger,Heimbigner,Heidbreder,Hegwer,Hedeen,Hebrank,Heberlein,Heaslet,Hearin,Hazle,Hazelbush,Hayzlett,Hayre,Haymans,Hayenga,Hayduk,Haward,Havner,Haushalter,Hauf,Hatke,Hatchel,Hassard,Haskovec,Hashmi,Harvest,Harvath,Hartill,Harteau,Harshfield,Harrigill,Harriet,Haros,Haroldson,Harmeson,Harl,Harkley,Hariston,Harington,Harian,Hargus,Hargens,Hardina,Haraldson,Harajly,Hapke,Hapeman,Hanz,Hanthorn,Hanry,Hannen,Hannasch,Hannam,Hanifan,Hanft,Handon,Handford,Hancher,Hancey,Hample,Hammrich,Hammerstrom,Hambric,Halwick,Halma,Hallgren,Hallet,Hallada,Halla,Halik,Halgas,Halcon,Halbrooks,Hakel,Hairfield,Hainesworth,Haggarty,Hagenhoff,Hagebusch,Hagadone,Haft,Haflett,Haefele,Haddow,Hackbart,Haberer,Haass,Gwinner,Gwathney,Gwartney,Gutterrez,Gutoski,Gutkin,Gutherie,Gutches,Gustus,Gustison,Gustaveson,Gurtner,Gurkin,Gummo,Gulliksen,Gulke,Guldin,Gulden,Guitierez,Guile,Guildford,Guidice,Gugerty,Guffy,Gueningsman,Gudgell,Guderjahn,Guastella,Guariglia,Guardia,Gryniuk,Grueser,Grudem,Growden,Grossett,Gropper,Gron,Grodin,Groch,Grismore,Gripper,Grinvalsky,Grima,Griffth,Griess,Greynolds,Gresh,Greminger,Gregoria,Greenwade,Greenlief,Greenier,Grayes,Gravell,Grassmyer,Grappe,Grantland,Grandin,Grandel,Grandbois,Granahan,Gramham,Graffeo,Graeter,Gradwell,Gradel,Grabo,Graban,Goy,Govoni,Governale,Govern,Gouty,Goughnour,Goude,Goubeaux,Goth,Gosline,Goslee,Goshen,Gosewisch,Gorzynski,Gortman,Gorter,Gordin,Gord,Goos,Goodwine,Goodrick,Goodley,Gombert,Goletz,Goldy,Goldthwaite,Goldthwait,Goldizen,Golar,Goist,Gofman,Goffer,Goerges,Goeltz,Goedicke,Goedecke,Godnick,Gocke,Goade,Gneiser,Gluth,Glovier,Glomski,Glodo,Gloden,Glenister,Glawson,Glasier,Gladysz,Gladstein,Gjertsen,Giudice,Gitto,Gittelman,Girvin,Girolamo,Gionfriddo,Gingell,Gimble,Gilhousen,Gilboy,Gilberti,Gigantino,Gietzen,Gieseking,Gianikas,Ghosn,Ghosh,Geyman,Gevara,Getsinger,Gessert,Gerrits,Gerrior,Geris,Gerhauser,Gerety,Genzone,Genuario,Gentles,Gentille,Genter,Genetti,Gelle,Gelfand,Gelabert,Gekas,Geck,Gearin,Gdovin,Gaydosh,Gawith,Gave,Gauntlett,Gaugler,Gaudy,Gaub,Gatten,Gathje,Gasperini,Gasner,Gasco,Gascho,Gasbarro,Garvis,Garra,Garnette,Garing,Garick,Gardunio,Gardon,Gardemal,Garde,Garczynski,Garant,Ganus,Gantnier,Ganis,Gangloff,Gangler,Ganer,Ganem,Gandolfo,Gampp,Gallihugh,Galletti,Gallenstein,Gallarello,Galla,Galka,Galayda,Galarneau,Galapon,Gaito,Gaglione,Gady,Gadsen,Gachupin,Gaboury,Futterman,Fusch,Furuta,Furth,Furber,Fune,Funai,Fuess,Frutchey,Frumkin,Fruhling,Frommer,Fromdahl,Froehner,Frizzle,Friends,Friederich,Freyre,Freilich,Fregia,Frediani,Frederico,Frater,Fraile,Foste,Fosselman,Fosnaugh,Fosburg,Fortis,Fortgang,Forstner,Forson,Forseth,Forkin,Forister,Forinash,Footer,Fontillas,Fontenelle,Fonesca,Folker,Fogerson,Fogelquist,Flye,Flummer,Floth,Floro,Florine,Flies,Flexer,Flessner,Flatness,Flank,Fland,Flahive,Flager,Fiveash,Fitzner,Fitzke,Fitcheard,Fisherman,Fishbeck,Fipps,Fiorino,Finster,Finken,Finigan,Fingal,Finer,Filsaime,Fillingim,Filipponi,Fila,Fies,Fiebelkorn,Fiducia,Fiallo,Fetherston,Fetherolf,Fesmire,Fesenmyer,Ferroni,Ferriss,Ferrini,Ferrick,Ferraris,Ferniza,Fernades,Ferdig,Ferandez,Feoli,Fenninger,Fenney,Femi,Fejes,Fehlman,Feger,Fede,Febo,Febbraio,Feasel,Feagley,Fayad,Favaloro,Fauerbach,Fauble,Fasheh,Farrant,Farra,Faro,Farinacci,Farfaglia,Farell,Farb,Farace,Fanjoy,Fangmann,Famulare,Falsetta,Fallows,Fallert,Falero,Faldyn,Falconi,Falce,Fait,Fairburn,Faiola,Faiella,Fahlsing,Faggett,Fafinski,Fadness,Fabros,Fabert,Everidge,Evaristo,Eustache,Etzkorn,Etier,Estabillo,Esquivias,Esquirel,Eslava,Eschete,Esau,Erway,Ertzbischoff,Eron,Erner,Ermitano,Ermitanio,Ermert,Erie,Erdley,Equihua,Enzor,Ensing,Enns,Engleking,Engelkes,Endlich,Endler,Emry,Emms,Emmerling,Emerich,Ellsbury,Ellie,Elizarraras,Eliot,Eliopoulos,Elery,Elek,Elderidge,Elbaum,Ekins,Ekin,Eisley,Eilderts,Eikleberry,Eigo,Eighmy,Eichel,Ehly,Egloff,Egland,Eggington,Eggenberger,Egar,Egans,Eftekhari,Efford,Eeds,Edvalson,Edin,Edgman,Edemann,Edelmann,Eddens,Eckl,Eckerle,Eckelman,Ebrahim,Eberth,Eberspacher,Ebbighausen,Ebaugh,Easly,Eash,Dzledzic,Dyett,Dyba,Dworaczyk,Duttry,Duthie,Duszynski,Duso,Dushaj,Dusett,Dus,Durman,Durkins,Durick,Duplechain,Dunnivan,Dunlow,Dunivan,Dumars,Dumaine,Duliba,Dulany,Duka,Duft,Dufrane,Duffek,Duellman,Ducking,Dubourg,Drzewiecki,Drugan,Drozdowski,Drozda,Dronet,Drilling,Driesenga,Dreyfuss,Drevs,Dreben,Draudt,Draleau,Dragos,Draghi,Doyer,Dowlin,Douma,Dotterweich,Dottavio,Doroff,Dornon,Dorland,Doop,Donndelinger,Donehoo,Donate,Donado,Dommer,Dominici,Domann,Dolio,Dolence,Doland,Dolak,Doersam,Doerrer,Doede,Dockham,Dobrich,Dobosz,Dobin,Dobbratz,Divlio,Divel,Ditzel,Disalvatore,Diotte,Dinnen,Dinkin,Dimler,Dimiceli,Dimeglio,Dimascio,Dimare,Diluca,Dilsaver,Dillen,Dilibero,Dile,Digioia,Difede,Diefenbach,Diedrick,Dickmann,Dickes,Dickason,Dicapua,Dicaprio,Dibrell,Dibley,Dibattista,Deyon,Devotie,Devoid,Deval,Detlefsen,Destro,Destiche,Desposito,Desola,Deshotels,Descombes,Deschepper,Desautel,Desano,Deroy,Derosset,Derosby,Deroeck,Derocher,Dergance,Deren,Deptula,Deprey,Depolis,Depner,Depetro,Denunzio,Densford,Dennington,Dene,Dender,Denbo,Demuro,Demoranville,Demling,Demerson,Demelis,Demeglio,Dembo,Demattia,Demarinis,Delprincipe,Deloria,Delnoce,Delmedico,Dellow,Delles,Dellavalle,Dellamora,Delguidice,Delgato,Delfs,Delcourt,Delcolle,Delbert,Delaportilla,Delahoz,Delacueva,Deisch,Deike,Degro,Degonia,Degollado,Degolier,Degirolamo,Degener,Degele,Degeest,Degeare,Defina,Defabio,Deeley,Decraene,Decou,Decorte,Declercq,Decinti,Dechambeau,Debutts,Debro,Deblieck,Deblasi,Debem,Deavila,Deases,Deangeles,Deahl,Daymude,Daven,Datil,Daros,Darnick,Darienzo,Dardy,Daponte,Dannhaus,Danneman,Danielle,Dani,Danger,Dangel,Danes,Danekas,Dandrow,Dambrose,Dalpe,Dalesandro,Daiton,Dainels,Daigh,Dahnke,Dahme,Dahling,Dagata,Dack,Czaplicki,Czachorowski,Cuttitta,Cutaia,Custance,Curless,Curie,Curi,Cupelli,Cumens,Cumbass,Cumba,Cullars,Cullar,Cukaj,Cubito,Cuascut,Crytzer,Crye,Cruzen,Cruser,Crunkleton,Crummett,Crumbliss,Cropley,Cronquist,Cronkite,Cronic,Crombie,Crockwell,Crnkovich,Critcher,Cristo,Cristales,Crisanti,Crier,Cretsinger,Crest,Creson,Crelia,Crecco,Craze,Craveiro,Cratch,Crapps,Cran,Craigmiles,Craiger,Craige,Crady,Cradic,Craddieth,Cowels,Coveney,Courcy,Coulbourne,Cotsis,Cotrone,Cotney,Cotilla,Costaneda,Costabile,Cossel,Cossa,Cos,Corte,Corsino,Corria,Cornog,Cornely,Corio,Corino,Corington,Coressel,Cordone,Corbisiero,Corbelli,Copps,Coovert,Coopwood,Cooner,Cookman,Conzales,Conver,Contratto,Conrady,Conradi,Connel,Conneely,Conmy,Comunale,Comber,Comans,Colvert,Columbo,Coluccio,Colp,Colop,Collini,College,Colestock,Colebank,Colasante,Colasacco,Colapietro,Cokeley,Coia,Cocuzza,Coalson,Co,Clowes,Cliche,Clevette,Cleven,Clerico,Clearwater,Civiello,Ciullo,Citro,Cirocco,Cioppa,Cilek,Cieszynski,Cieri,Cicerchia,Ciaschi,Ciani,Cianchetti,Chudy,Chuc,Chryst,Christodoulou,Christin,Chrisley,Chokshi,Chmela,Chkouri,Chiodini,Chio,Chimilio,Chilen,Chilek,Childrey,Chier,Chicas,Chiaro,Chiappone,Chiappinelli,Chiado,Chhom,Chesterfield,Chesteen,Cheshier,Cherrez,Cherep,Chene,Cheevers,Checkett,Cheaney,Chayka,Chawla,Chasin,Chasen,Charvat,Char,Chapoton,Chantos,Chantler,Chant,Chadez,Chad,Chaco,Chabez,Cerrito,Ceppetelli,Centanni,Celso,Cederberg,Cedar,Cecchetti,Cavel,Cavanah,Cavagna,Catus,Catton,Catterton,Catrambone,Catherwood,Catherman,Cataldi,Castellana,Castellan,Cassey,Casparis,Casilla,Cashdollar,Casaceli,Carvana,Carriedo,Carrecter,Carraher,Carrabine,Carpinelli,Carouthers,Carnovale,Carmany,Carles,Caretto,Careaga,Cardosa,Cardelli,Carbine,Carathers,Caraker,Caracci,Capuchin,Cappelletti,Capistran,Capdeville,Caparros,Canute,Cante,Canizares,Canel,Canclini,Cancino,Campus,Campise,Campen,Cammarano,Camilli,Camic,Camey,Calwell,Calvey,Calvary,Callo,Callinan,Callais,Calizo,Calixto,Calisto,Calip,Calibuso,Caira,Cahillane,Cahalane,Cahal,Caffery,Caffarelli,Cafarelli,Cadlett,Cacciatori,Cabebe,Byus,Byrnside,Byrer,Byone,Buza,Buttrum,Buttel,Butremovic,Butanda,Bustin,Bussen,Bushlen,Bushart,Burtchell,Burrel,Burnard,Burlett,Burkeen,Burce,Buote,Bunyan,Buntrock,Bunck,Bumpas,Bulleri,Buglione,Bugge,Bueter,Buerk,Buenger,Buehrle,Buechele,Budrow,Buddenhagen,Bucolo,Buchenau,Bucco,Buccino,Bubar,Bruzas,Brutsch,Bruschke,Brunot,Brungard,Brund,Bruender,Brucks,Bruchey,Brozowski,Brownd,Brothern,Broomhead,Bronw,Brom,Brog,Brodigan,Brockhaus,Brockel,Broadaway,Brletich,Briston,Brissett,Brines,Brillon,Brilliant,Brightbill,Brigges,Briel,Bresciani,Brents,Breitmeyer,Breithaupt,Breidenthal,Breden,Bredemeier,Breckinridge,Brecheisen,Brecheen,Breazeal,Bream,Brazzel,Brawdy,Brave,Brashers,Branz,Branyon,Brantz,Brannam,Brankovich,Brandle,Branchaud,Branca,Bramley,Bramante,Bramall,Brakeman,Bradby,Bozzo,Bozelle,Boyarski,Bowline,Bowey,Bowerize,Bowdon,Bowdler,Boutros,Bouten,Bourdier,Bouras,Boufford,Bottex,Bottemiller,Bothman,Botcher,Boshers,Borris,Bornemann,Bonus,Bonnot,Bonifant,Bongiardina,Bonenberger,Bonasera,Bollier,Bolar,Bokman,Bokanovich,Boissonnault,Boiles,Bohrn,Bohlke,Bogenschutz,Bogel,Bogda,Boevers,Boever,Boender,Boehringer,Boehne,Bodor,Bodda,Bodak,Bocker,Bockenkamp,Boche,Blyden,Bluto,Bludworth,Bloxsom,Blomstrom,Bloise,Bloebaum,Blier,Bleiweiss,Blegen,Bleacher,Blaum,Blasz,Blasingim,Blasengame,Blanda,Blagman,Blackstad,Blackham,Blache,Bixel,Bitters,Bissegger,Bisker,Bishoff,Bisard,Bis,Birtwell,Birley,Birkenmeier,Birkenholz,Birkeland,Birdsey,Birdo,Birdinground,Binner,Bilsborough,Billot,Billops,Billingham,Bigney,Bigg,Bienkowski,Bienek,Bielefeld,Bielec,Biddie,Bickell,Bichler,Bibo,Biava,Biagi,Biagas,Bhayani,Bez,Beyene,Beyda,Bevels,Bettner,Bettinson,Betson,Beto,Bessix,Bessire,Bertschy,Bertozzi,Bertoncini,Bertelson,Berteau,Berrong,Berrones,Berringer,Berrigan,Bernsen,Berlingeri,Berken,Berka,Berges,Bergdorf,Bergara,Bergant,Bergamini,Beren,Berdugo,Berdine,Berberian,Benvenuti,Benish,Benincase,Benek,Benedith,Bendas,Benak,Bena,Beltrame,Belsheim,Belotti,Bellrichard,Belleville,Beliles,Belgrade,Belcastro,Bekius,Bekhit,Beightol,Behel,Beetz,Bedson,Becze,Beckmeyer,Beckey,Beckers,Beckelhimer,Beccue,Beberwyk,Bebber,Beamesderfer,Beacom,Bazzle,Bazil,Baynham,Bayhonan,Bayas,Bawany,Bava,Baumgardt,Bauerkemper,Baudry,Baudino,Battko,Battisti,Batta,Bassano,Baskas,Baseler,Basanta,Bartucci,Bartron,Barthold,Bartamian,Barsalou,Barrineau,Barriger,Barreneche,Barkie,Barich,Bardes,Barbano,Baral,Baragar,Baque,Banther,Banome,Bannowsky,Banke,Baniaga,Bandley,Banahan,Banaag,Bamba,Baltzer,Balster,Balnis,Balkin,Bali,Balfe,Balerio,Balent,Baldyga,Baldor,Baldinger,Baldassano,Baldacci,Balanoff,Balado,Balaban,Balaam,Bakes,Bajwa,Baisch,Bahnsen,Bahls,Bahler,Bahamonde,Bagdasarian,Bagaoisan,Bafia,Baese,Badolato,Bado,Badder,Bacurin,Backers,Bachor,Babe,Babbit,Babauta,Baadsgaard,Azzara,Azebedo,Avril,Avello,Aveline,Authur,Ausby,Auricchio,Auna,Aukerman,Auckerman,Auck,Auble,Atterson,Attard,Aswegan,Aste,Asta,Assaf,Aspen,Asken,Asif,Asiedu,Ashner,Asel,Aschenbach,Arvay,Arvan,Artus,Artley,Arrollo,Aroyo,Aronov,Aromin,Arnsworth,Arnspiger,Arnn,Armant,Arington,Argubright,Arentz,Arcoraci,Arbuthnot,Arbo,Aquilina,Aquilera,Apt,Apsey,Appolonia,Apollo,Apana,Antista,Anshutz,Anon,Anno,Annala,Anklam,Angold,Angelone,Angeline,Angeletti,Andren,Andreadis,Andera,Andelman,Andel,Anctil,Anchors,Anacker,Ampy,Amons,Amirault,Amir,Amezaga,Ameigh,Alyea,Altvater,Altig,Altermatt,Alo,Almengor,Alme,Allvin,Allocco,Allegrini,Aliment,Algee,Alexanian,Aler,Aldo,Albero,Alarid,Akiona,Akemon,Ajello,Aitcheson,Ainley,Ailey,Ahluwalia,Ahlf,Ahlbrecht,Agundez,Agro,Agins,Aggarwal,Afalava,Adriano,Adomaitis,Adolphus,Adlam,Adie,Adey,Adduci,Addleman,Adamyan,Acothley,Acklen,Ackert,Ackerly,Acencio,Accosta,Abundiz,Abedi,Abbassi,Abbasi,Aanerud,Aakre,Aagaard,Zwickl,Zuver,Zurasky,Zumbo,Zumba,Zuckerwar,Zuccarelli,Zubris,Zoucha,Zorns,Zorc,Zitzow,Zitzloff,Zirkles,Zippe,Ziola,Zinz,Zinsmeister,Zincke,Zieschang,Zierdt,Zien,Ziemke,Zidek,Zickler,Zeuner,Zerba,Zera,Zenger,Zeltmann,Zelle,Zelinka,Zelek,Zele,Zeiner,Zeimet,Zeidler,Zecchini,Zebley,Zdanowicz,Zbell,Zaro,Zaremski,Zar,Zani,Zancanella,Zana,Zambarano,Zakar,Zadorozny,Zader,Zaccaro,Ysquierdo,Yoxall,Youst,Youngstrom,Youn,Youker,Yoss,Yoshina,Yonke,Yonemura,Yohannes,Yock,Yerhot,Yengo,Yehle,Yanofsky,Yaker,Yagues,Yach,Ya,Xue,Wyrosdick,Wygle,Wygand,Wurzer,Wurl,Wunderlin,Wunderle,Wuerth,Writer,Wrighten,Wrich,Wozny,Wozney,Wowk,Wouters,Wormington,Worf,Woolem,Woodrich,Wooderson,Wonder,Womeldorf,Wolz,Woltmann,Wolstenholme,Wollmuth,Wolle,Wolfard,Woldridge,Wojtanowski,Wojner,Woitowitz,Woehl,Wittenburg,Wittel,Witschi,Witaszek,Witaker,Wiszynski,Wiswall,Wiss,Wisher,Wisenbaker,Wires,Winsky,Winfough,Windler,Winckler,Wimes,Wiltberger,Wilm,Willrich,Willoby,Willimon,Willenborg,Wilda,Wilczewski,Wilcock,Wiggens,Wigboldy,Wiesler,Wies,Wienhoff,Wielgus,Wiebers,Wieber,Wickizer,Wichrowski,Wibbens,Whyard,Wholey,Whitsey,Whitlingum,Whitlach,Whirry,Wharry,Wharff,Whack,Weyman,Weyler,Wethje,Westveer,Westmorland,Westerhold,Wesselman,Wesloh,Wery,Wermers,Werlinger,Werksman,Wenzinger,Weninger,Wendeln,Wendelin,Wenck,Wember,Welters,Welland,Welchman,Welchel,Weitnauer,Weissler,Weinger,Weimann,Weigert,Weidert,Wehby,Wehbe,Weck,Wechter,Weaving,Weather,Weal,Weagle,Wdowiak,Wayns,Waycott,Waychoff,Waterfall,Watcher,Watahomigie,Wasowski,Wasner,Washko,Washing,Washell,Wartenberg,Warson,Warrenfeltz,Warp,Warmbrodt,Warhurst,Wardsworth,Wanzek,Wanta,Wansing,Wankel,Wangberg,Wanberg,Wamack,Waltzer,Walthers,Walterson,Walshe,Walrond,Wallschlaeger,Wallgren,Walema,Waldram,Waldhauser,Waldecker,Walby,Wakin,Wakabayashi,Wah,Wagy,Waggner,Wagenaar,Wage,Waffle,Wadzinski,Wademan,Wackerly,Wachs,Wable,Vredenburg,Vrana,Vrable,Voyer,Voto,Vosper,Vosberg,Vorhees,Voran,Vora,Vonstein,Vondoloski,Voltin,Volpicelli,Volland,Volentine,Volcko,Vojtko,Voice,Vogeler,Vizzini,Vizena,Vix,Vitko,Viste,Visor,Visco,Virock,Vinup,Vinion,Vincenzo,Villas,Villarta,Villari,Vilello,Vigne,Viener,Vielmas,Vielhauer,Viehman,Vidulich,Vidinha,Videen,Vickerson,Vicker,Vertz,Verry,Vermeesch,Verhulst,Verhoff,Verhagen,Verhaeghe,Vergo,Vergeer,Verdino,Venus,Ventrella,Ventola,Venter,Vennes,Venneri,Venditto,Velzy,Velilla,Velie,Velandia,Vecker,Vecellio,Vear,Vavricka,Vautrin,Vates,Vassall,Vasmadjides,Varty,Varriano,Varriale,Varrato,Varnedoe,Varillas,Vardaman,Varajas,Vaquero,Vanzyl,Vanvleet,Vanvleck,Vansoest,Vanskiver,Vanskike,Vanruler,Vanputten,Vanoy,Vanous,Vanoort,Vanliew,Vanlew,Vanhulle,Vanhoozier,Vanhofwegen,Vanhaitsma,Vanecek,Vandrunen,Vandixon,Vandivier,Vandiford,Vandezande,Vandewege,Vanderzanden,Vanderwerff,Vanderwerf,Vanderschel,Vandergiessen,Vandenberghe,Vandehei,Vandee,Vancheri,Vanbramer,Valsin,Valli,Valido,Valenzano,Vajda,Vaillencourt,Vacheresse,Va,Uzdygan,Uyetake,Usilton,Urueta,Ursprung,Ursiak,Urquilla,Urquidi,Urfer,Ureta,Urbancic,Ura,Upwall,Uptegrove,Uphaus,Upadhyaya,Unterburger,Unch,Unavailable,Unangst,Umphenour,Umbenhauer,Ulseth,Ulatowski,Ukosata,Uhyrek,Uhrmacher,Uhlich,Ueno,Uelmen,Udoh,Ude,Uchytil,Tzeng,Typhair,Twelves,Twehous,Tuxhorn,Turybury,Turro,Turne,Turnblom,Turkus,Turks,Turbin,Turbes,Tunick,Tumpkin,Tuholski,Tuggie,Tufnell,Tubertini,Tubaugh,Tsutsui,Tsuha,Tsuda,Tsinnie,Trupp,Trupiano,Trupia,Truner,Trundle,Trumm,Trullinger,Truell,Trucco,Trowers,Trover,Trosien,Tronnes,Trompeter,Tromp,Trolio,Troendle,Trobaugh,Triska,Trimarco,Trifiletti,Tridle,Tricoche,Tresvant,Trest,Tresler,Tresca,Tremont,Tremayne,Treinen,Treichler,Treglia,Treamer,Traxson,Traugh,Trasher,Trapasso,Trant,Trancoso,Traister,Trailor,Trageser,Traficante,Trac,Toya,Towson,Tovrea,Totherow,Tote,Tortorelli,Torri,Tornabene,Torigian,Torello,Toppa,Topor,Toothill,Toop,Tonsil,Tomsich,Tommie,Tomlison,Tolmich,Tollner,Tollefsrud,Toledano,Tolayo,Toenges,Toefield,Tock,Tobiasz,Tobery,Tobert,Toban,Toback,Tjarks,Tiznado,Titlow,Tishler,Tirabassi,Tippet,Tinkey,Timson,Timperman,Timmis,Timmermans,Timme,Timberman,Tikkanen,Tietze,Tierman,Tiberi,Thuringer,Thul,Thu,Thro,Thornwell,Thomlison,Thomlinson,Thomassen,Thimmes,Thilking,Thierman,Thielemann,Thiboutot,Thibideau,Theresa,Theard,Thavichith,Thaut,Tezak,Tetzloff,Teto,Tetlow,Tessler,Tesseyman,Teskey,Tes,Terzian,Terwillegar,Tervo,Terronez,Ternasky,Termini,Terboss,Teramoto,Tepley,Tenuta,Tenen,Tellio,Tellefson,Telecky,Tekell,Tefertiller,Teece,Tedesko,Tederous,Tebeau,Tear,Teahan,Tazewell,Tazelaar,Tavano,Tatsapaugh,Tatlock,Tataris,Tassinari,Tassie,Tarvis,Tarkey,Tarangelo,Tappa,Tanna,Tanikella,Tamblyn,Tamaro,Talyor,Tallas,Talayumptewa,Talaska,Taj,Tagliarini,Tagata,Taflinger,Taddonio,Tacderan,Tablang,Tabisula,Tabicas,Tabar,Szwed,Szumski,Szumigala,Szollosi,Szczesny,Sypniewski,Syon,Sylvan,Syal,Swor,Swoopes,Swoap,Swire,Swimmer,Swiler,Swida,Sweezer,Sweep,Sweeley,Swede,Swearengen,Sweadner,Swartzwelder,Swanhart,Sveen,Svay,Sutyak,Sutten,Sutler,Suski,Surprise,Supernault,Suozzo,Suns,Sunder,Sumney,Summarell,Sumera,Sulzbach,Sulfridge,Sukhram,Suk,Suitor,Sughroue,Sugahara,Sudlow,Sudan,Sudak,Subido,Style,Stweart,Sturz,Sturdy,Sturchio,Stulce,Stukenborg,Stuckemeyer,Stsauveur,Stroll,Strohmeier,Strissel,Strimple,Stremmel,Streczywilk,Strawhorn,Stratz,Stratos,Straton,Strassner,Strama,Strada,Stoss,Storti,Stomberg,Stolze,Stoliker,Stoler,Stolberg,Stolarik,Stohlton,Stofko,Stofflet,Stoff,Stoesser,Stoeber,Stodden,Stobierski,Stobbs,Stjohns,Stirrup,Stirman,Stinehelfer,Stimmell,Stimits,Stigger,Stiers,Stieff,Stidam,Stewarts,Stevinson,Stevey,Sterett,Ster,Steppello,Stepnoski,Stentzel,Stencil,Stencel,Stempien,Steketee,Steinbruckner,Steinborn,Steigman,Steiber,Stegent,Steffani,Steerman,Steenken,Steenhard,Steedman,Steckley,Stealey,Stayrook,Stavnes,Stauss,Stash,Stary,Stare,Stant,Stanfa,Standfield,Standberry,Standage,Stanco,Stanage,Stampe,Stamdifer,Stalworth,Stalma,Staires,Staines,Staine,Stahlberg,Stadden,Staberg,Stabel,Spurgers,Spruce,Sprinkel,Springman,Spriggle,Sporleder,Sporcic,Spontak,Sponholz,Spohr,Spittle,Spiry,Spiece,Spicuzza,Sperlich,Sperdute,Sperazza,Spelts,Speares,Speakes,Sparhawk,Spaniel,Spaar,Soyars,Soverns,Southam,Sour,Souphom,Soun,Soula,Sossamon,Sosh,Sosby,Sorsby,Soroka,Soricelli,Sorgi,Sorbera,Soplop,Soohoo,Sonoda,Sonny,Sonneborn,Somodi,Sommese,Solman,Sollie,Solla,Solina,Soliani,Soley,Solecki,Solages,Sohre,Soenksen,Sodeman,Sobiech,Soberanis,Snobeck,Snerling,Sneider,Snaza,Smolic,Smigel,Smigaj,Smiechowski,Smida,Smerkar,Smeby,Slothower,Slotemaker,Slodysko,Slivka,Slimmer,Slight,Slifko,Slayter,Slawski,Slauson,Slatten,Slain,Skultety,Skrip,Skowyra,Skorupa,Skordahl,Skomsky,Skoff,Sklenar,Skeldon,Skeesick,Skea,Skagen,Sjostrand,Sixtos,Sivyer,Siverson,Siverling,Sivan,Siva,Sitzler,Sither,Siskind,Siske,Siron,Siregar,Sirbaugh,Sirak,Siptak,Sinstack,Sins,Siniscalchi,Singlton,Sinden,Sinagra,Sina,Simpon,Simmoneau,Simler,Simkulet,Simi,Simeona,Simens,Silverstone,Silverness,Silsbee,Sillas,Sileo,Silbert,Sikula,Siglin,Sigley,Sigafus,Siew,Sietsma,Sierras,Siembida,Sieker,Siedlik,Sidur,Sidell,Siddoway,Sibille,Sibilia,Sibbald,Shusta,Shuskey,Shurts,Shryack,Shroll,Showell,Shove,Shoulars,Shortino,Shopp,Shmidt,Shiu,Shirar,Shinners,Shingles,Shinabery,Shimko,Shibles,Shertzer,Sherrin,Sherril,Shellhamer,Shellhaas,Sheldrup,Sheladia,Shehab,Sheff,Sheck,Shearman,Sheaff,Shauer,Shatswell,Shaske,Sharick,Shappard,Shallcross,Shala,Shaklee,Shakespear,Shafe,Shady,Shadwell,Shacklett,Seymor,Settlemire,Setting,Sether,Sesma,Sesareo,Seryak,Serven,Sers,Serbus,Serb,Seppi,Sephus,Sentinella,Sensel,Senf,Senato,Sempek,Semidey,Semasko,Selz,Seltz,Selmer,Selitto,Selim,Seiser,Seikel,Seigle,Seid,Segouia,Segner,Segerson,Segala,Sefcik,Seeholzer,Seegert,Sedita,Sedenko,Sedar,Secondo,Seckinger,Sebald,Seba,Seahorn,Seabright,Scotty,Scothorn,Scordato,Scoma,Scobie,Scipione,Sciara,Schwieterman,Schwendemann,Schwede,Schwartzbach,Schwarcz,Schwalen,Schutzman,Schunemann,Schulweis,Schul,Schuffert,Schuckers,Schrull,Schrubbe,Schreyer,Schreckhise,Schreader,Schoonhoven,Schoolman,Schol,Schoettmer,Schoepf,Schoenle,Schoenecker,Schobert,Schnyer,Schnoke,Schnipper,Schneiter,Schneekloth,Schnapp,Schmits,Schmelzle,Schmelz,Schmeisser,Schmeiser,Schmahl,Schlotzhauer,Schlott,Schlossberg,Schlipf,Schlicker,Schleuder,Schleimer,Schlauch,Schlau,Schlaefer,Schiesser,Schieler,Schied,Schie,Scheuvront,Scheumann,Scherz,Scheperle,Schenewerk,Schemm,Schellenger,Schaupp,Schauf,Schaudel,Schau,Schatzberg,Scharr,Schappert,Schapp,Schamel,Schallhorn,Schaefers,Schadt,Schadel,Schackow,Schabowski,Schabes,Schabert,Schab,Schaab,Scavotto,Scarver,Scarsella,Scarbro,Scampoli,Scammon,Scallon,Scalley,Scale,Scafuri,Scadden,Scacco,Sawchuk,Saviano,Saverchenko,Savelli,Savarino,Satsky,Satoe,Sarwinski,Sartorio,Sartorelli,Sarria,Saro,Sarna,Sarkin,Sarisky,Sario,Sarazin,Sara,Sapia,Santmyer,Santmier,Santillana,Santanna,Santacroce,Sansouci,Sannes,Sanez,Sandvig,Sandino,Sandella,Sanburg,Samy,Sammer,Samit,Salvucci,Salvey,Salvatori,Salvant,Salvage,Salts,Salton,Saltarelli,Salt,Salome,Sallade,Saletta,Salehi,Saleeby,Salameh,Salama,Salaiz,Salafia,Sakry,Sako,Sakash,Saitta,Sahu,Sahara,Saguil,Sagrera,Saglimben,Sagi,Saggio,Sagen,Safranek,Safko,Saeli,Sadar,Sacre,Saccardi,Saborido,Sabins,Sabet,Sabbah,Saale,Rynne,Rynders,Rylands,Rykowski,Ruzbasan,Ruwe,Rutiaga,Ruthledge,Rutecki,Rusu,Russler,Rurup,Ruozzo,Ruot,Runels,Rumphol,Rumpel,Rumpca,Rullo,Ruisi,Ruic,Ruhle,Ruffaner,Rufer,Ruetz,Ruesink,Ruehle,Ruedy,Ruden,Rubulcaba,Rua,Roya,Rowald,Rovner,Rouselle,Roura,Roulston,Rougeaux,Rotty,Rothery,Rotert,Rossler,Roskowinski,Rosiak,Rosh,Rosenstock,Roselius,Roscigno,Rosaro,Rosada,Roperto,Ropers,Rookwood,Rongo,Rondinelli,Ronda,Ronchetti,Romrell,Rollinger,Rola,Rokos,Rohwer,Rohrscheib,Rohlf,Rogal,Rogacion,Roeschley,Roers,Roemen,Roelofs,Roekle,Roehrich,Rodriguel,Rodges,Rodeen,Roddey,Roddam,Rocquemore,Rockers,Roccia,Robishaw,Robida,Robichau,Robertshaw,Roberton,Roberta,Roberg,Rob,Roary,Rizzuti,Rizal,Riveros,Rittenour,Risper,Rippin,Ripp,Riola,Riogas,Rinner,Ringus,Ringhand,Rinehardt,Rinderer,Rigotti,Righetti,Riggi,Riggans,Rigazio,Rigatti,Rifenburg,Rieu,Riehm,Riegler,Riech,Riebau,Ridgel,Ridens,Ridener,Riddel,Rickner,Richardt,Ricciardone,Rhynard,Rhyan,Rhoderick,Rho,Rheinschmidt,Rezak,Reusing,Rettkowski,Retterath,Retta,Reshid,Reppe,Repke,Reos,Reome,Rensen,Renschler,Renova,Renollet,Renison,Reninger,Rengers,Rengel,Renart,Rena,Relihan,Reisen,Reiniger,Reindel,Reil,Reier,Reh,Reggio,Regener,Reekers,Reeger,Redmann,Reddinger,Redcay,Reckling,Rebert,Reategui,Reagin,Reagen,Readnour,Razzano,Raynolds,Rayer,Raybould,Rawdon,Ravotta,Ravo,Ravitz,Ravert,Rathert,Raterman,Ratel,Raque,Rapko,Ransone,Ransburg,Rangnow,Randon,Rancifer,Ramotar,Ramones,Ramone,Ramire,Ramin,Rameres,Rakoski,Rajala,Raithel,Rainie,Rainge,Rainbow,Raigoza,Rahming,Ragazzo,Radomski,Radish,Radilla,Raden,Radde,Racano,Rabine,Rabil,Rabell,Rabasca,Quiterio,Quinzi,Quink,Quinci,Quilliams,Quiller,Quider,Quenneville,Quelch,Queeley,Quear,Quattro,Quastad,Quaglieri,Pyscher,Pust,Purtle,Purtill,Purdin,Puorto,Punja,Pullem,Pulfer,Puleio,Pujia,Puetz,Puehler,Puebla,Ptomey,Przewozman,Prysock,Pruter,Prunier,Pruess,Prudom,Pruchnik,Proveaux,Prophit,Promise,Procknow,Proby,Pro,Prive,Preziosi,Preza,Prem,Preite,Preisser,Pregler,Precella,Prazma,Prats,Prator,Prakash,Prahm,Prader,Pozniak,Poxon,Powledge,Pouge,Pott,Postlewaite,Posthumus,Posnick,Posley,Poskey,Porro,Poreda,Poppema,Popat,Pondexter,Ponciano,Pompilio,Pommer,Polosky,Pollom,Pollo,Pollica,Pollaro,Polizio,Polek,Polack,Polacek,Poirot,Poertner,Poduska,Pockrus,Pochintesta,Pluym,Pluhar,Pluck,Pliner,Pliml,Plese,Pleasent,Playle,Plasky,Plane,Plack,Pizani,Pitz,Pittari,Pitruzzello,Pistorius,Pistilli,Pisha,Piselli,Pisco,Piros,Pirone,Pirolli,Pirman,Pirkl,Pirie,Pique,Pintado,Pinkey,Pingrey,Pinger,Pinelo,Pilsner,Pilley,Pilgreen,Piles,Pila,Pignatello,Pietig,Pierrott,Pierron,Pierceall,Pieratt,Pienta,Piekos,Piechota,Picquet,Pickar,Picerno,Piceno,Phyfiher,Phorng,Phearsdorf,Pharmes,Phariss,Pfuhl,Pfenning,Pezzetti,Pevy,Petzoldt,Pettrey,Pettas,Petta,Petross,Petrochello,Petriello,Petrelli,Petch,Pestoni,Pestano,Pesick,Pesavento,Perzanowski,Perrien,Perrenoud,Perque,Peroff,Perlas,Perkerson,Perisho,Perich,Perfect,Peregrino,Peregoy,Perch,Pequeno,Penza,Pensis,Penquite,Peniston,Penister,Pendola,Pendergraph,Pelle,Pelczar,Pelch,Pela,Pehler,Pegoda,Peelle,Peeling,Pedroni,Pedlar,Pedder,Pecoraino,Peckman,Pechal,Pebsworth,Peasnall,Peasant,Pead,Peacemaker,Paytes,Paysen,Payn,Pavletic,Pavlat,Pavlas,Pavese,Paup,Paulis,Patrice,Patocka,Pat,Pastorino,Pascocello,Parthemer,Parreira,Parido,Paretti,Pardun,Parchment,Papstein,Papps,Papetti,Papakostas,Pantoni,Panik,Panfilov,Panfil,Pana,Pampusch,Pamperin,Palmitessa,Palmero,Pallett,Palilla,Palese,Palesano,Palange,Pagenkopf,Padon,Padmanabhan,Padinha,Packen,Pacitto,Pacchiana,Pabich,Oza,Oyabu,Overdorf,Ourada,Otukolo,Otterbine,Ottalagano,Oto,Other,Otano,Osting,Ostiguy,Osterholt,Osley,Oscarson,Osaile,Ortz,Ortolano,Ortea,Orte,Ortaga,Orszulak,Orser,Orihuela,Orejel,Ordorica,Ording,Ordal,Orbin,Oransky,Oppel,Onsgard,Ondrick,Olsin,Ollmann,Olives,Olavarria,Olano,Olafson,Okuno,Okuniewski,Okuhara,Okrent,Okoniewski,Okeke,Ohs,Ohotnicky,Ohno,Ohlund,Ohlendorf,Ohaire,Ogaz,Ogando,Offield,Odiorne,Oclair,Ockenfels,Ochocki,Ocamb,Ocallahan,Obleton,Oberly,Oberhelman,Oberbeck,Nylin,Nydick,Nwachukwu,Nutzmann,Nuque,Nunz,Nulle,Nuffer,Notti,Nothum,Nothnagel,Notah,Nossett,Nose,Nosbisch,Norrix,Norlien,Norkin,Nordon,Nordmeyer,Norat,Nooe,Nokleby,Nofziger,Noens,Nivison,Niu,Nittler,Nissalke,Nishikawa,Ninness,Nin,Nimon,Nifong,Niewieroski,Nietzer,Niemela,Nicolette,Nicoletta,Nico,Nickolas,Nickless,Nicklaw,Niccoli,Nibbs,Neyland,Newmark,Newey,Newbauer,Nevwirth,Neverman,Neuser,Neumaier,Neufville,Netzley,Netzel,Nettle,Neiswonger,Neiswender,Neilan,Neidhardt,Neesmith,Nebgen,Navia,Nate,Nasuti,Nasso,Nassimi,Nashe,Nases,Naro,Nardo,Narasimhan,Naqvi,Nanka,Naman,Nahrstedt,Nagura,Nagarajan,Nadile,Nabours,Nabers,Mysinger,Mynear,Muzzarelli,Muthig,Mustian,Muskus,Muskelly,Musi,Mushtaq,Musca,Murzynski,Murzyn,Murrillo,Murello,Murdy,Murakawa,Munsinger,Munnell,Munks,Munkberg,Mundorf,Mummey,Mullick,Mulkin,Mulhollen,Mulgrew,Mulderig,Mulac,Muehl,Muddiman,Muckerman,Muckenthaler,Much,Mucciolo,Mruczek,Mrazek,Mowat,Moure,Mould,Motts,Mosure,Mossor,Mossberg,Mosler,Mosha,Moscrip,Moschetti,Mosbarger,Morua,Morss,Morron,Morrall,Moroni,Morioka,Moricca,Morgensen,Morganson,Moreshead,Morely,Morch,Moras,Morar,Moranville,Moralas,Morak,Moradel,Moothart,Moonen,Monzingo,Montpetit,Montjoy,Monteagudo,Monoz,Mongrain,Mongon,Mondejar,Monas,Monachino,Momplaisir,Momin,Moment,Molpus,Molony,Molner,Molleda,Molinski,Molinelli,Molfetta,Molenda,Molchan,Mohseni,Mogg,Moerke,Moenius,Moehlman,Modugno,Modi,Modest,Moder,Moch,Moat,Miyamura,Mittlestadt,Mittelstedt,Mittelman,Mitschelen,Mitro,Mitchan,Misty,Missey,Misenhimer,Mirra,Mirjah,Mirante,Miosek,Minteer,Minrod,Minning,Minney,Minnema,Minium,Minihane,Minicucci,Minecci,Minchey,Milota,Millson,Milloway,Millonzi,Millier,Milley,Millam,Milillo,Milbrath,Mikowski,Mikola,Mikler,Mihelic,Mihaila,Miesen,Mierzejewski,Mickels,Michienzi,Michalke,Miazga,Mezydlo,Mezick,Meynard,Meylor,Mexicano,Metsker,Metrick,Meter,Mestad,Meske,Mertins,Merta,Mersinger,Merschman,Merna,Merila,Meridieth,Mergen,Merel,Menzella,Menze,Mentnech,Menson,Mensick,Mennig,Mendillo,Memos,Melroy,Melochick,Mells,Mellgren,Meline,Melich,Melena,Melchiori,Melching,Melahn,Meisler,Meinerding,Meilleur,Meidlinger,Mehner,Megrabyan,Megee,Meeuwsen,Medlar,Medick,Medema,Mechler,Mechanic,Meadowcroft,Mcpike,Mcpeake,Mcnell,Mcneary,Mcmutry,Mcmeekin,Mcmannus,Mcluen,Mclouth,Mclerran,Mcleoud,Mclagan,Mckone,Mckneely,Mckissic,Mckinnell,Mckillips,Mckibbon,Mckenty,Mckennan,Mckeeman,Mckasson,Mcinturf,Mcinerny,Mchan,Mcgurn,Mcguirl,Mcgue,Mcgrain,Mcgonnell,Mcglumphy,Mcglauflin,Mcginity,Mcgibboney,Mcgeough,Mcgauley,Mcgarvie,Mcfatter,Mcentegart,Mcenroe,Mcelmury,Mcelhinny,Mcdonnel,Mcdoniel,Mcdoe,Mcdermond,Mcdearmon,Mcdearman,Mcday,Mcdannald,Mcdaid,Mccurren,Mccrosky,Mccrane,Mccraig,Mccooey,Mccoo,Mccolpin,Mccolloch,Mcclucas,Mcclester,Mcclement,Mcclamroch,Mcclammy,Mcclallen,Mccarte,Mccaie,Mccaddon,Mcanelly,Mcalmond,Mcalary,Mazzini,Mazzarino,Mazzara,Mazzanti,Mazurk,Mazor,Mayerle,Mayenschein,Mayard,Mayans,Maxedon,Mavromatis,Mavins,Maves,Mausser,Maulsby,Matya,Matuke,Matto,Mattler,Mattiace,Matkowski,Mathern,Matero,Matchette,Matayoshi,Matar,Mastine,Massing,Massimo,Masseria,Massenberg,Massard,Masoud,Masotti,Maslak,Masey,Masella,Mascarena,Mascall,Marzella,Maryott,Marwick,Marugg,Martt,Martinis,Martian,Martha,Marstaller,Marsingill,Marsicek,Marotto,Market,Markegard,Marke,Marinella,Marien,Margison,Margheim,Margason,Margaris,Margaret,Marett,Marentes,Marcott,Marcon,Marchena,Marcellino,Mapston,Mantione,Mantanona,Mansouri,Manoi,Mankus,Mankins,Manin,Manikas,Mangieri,Manfredini,Mane,Mandt,Mandolini,Mandley,Mancina,Manas,Maltsberger,Maltais,Malmin,Mallis,Mallicoat,Malleck,Mallach,Malkowski,Malkani,Malito,Malensek,Malandra,Malander,Makos,Makanani,Maille,Mail,Maidens,Maid,Mahowald,Mahala,Mahajan,Magnotta,Maggiore,Magel,Maestos,Maerz,Maedche,Madise,Madi,Mades,Maddaloni,Madayag,Madaras,Macnair,Mackinlay,Mackesy,Machon,Machia,Machey,Machesky,Machacek,Maceyak,Macchio,Macbride,Mabray,Maasch,Lyseski,Lykken,Luzania,Luxenberg,Lutrell,Lupkes,Lupino,Lupardus,Lunnon,Lunghofer,Lundvall,Lundby,Lundborg,Lulow,Lukman,Lukin,Lukaszewski,Lukacs,Lugones,Luger,Lueder,Ludeke,Lucek,Lucchetti,Lucchese,Lozowski,Lozaro,Loyer,Lowthert,Lowdermilk,Lovitz,Lovinggood,Lovenduski,Loura,Loung,Lounder,Louks,Loughry,Loudermill,Lotta,Lostetter,Loskot,Losiewski,Lorman,Loren,Lorelli,Lorange,Lonsinger,Longinotti,Longhurst,Lomedico,Lola,Lohwasser,Lohn,Lohden,Lograsso,Logie,Loftman,Loften,Lofaso,Loewer,Loehrs,Locy,Loconte,Lockerman,Lockerby,Locken,Lobaton,Loatman,Lleras,Lizak,Livingood,Litwiler,Litvin,Littledave,Lites,Lisee,Lipszyc,Lippy,Lionello,Linsday,Linnear,Linklater,Lingbeck,Lindie,Lindenfelser,Lindenberger,Linarez,Limber,Lily,Lightning,Liffick,Lieto,Liestman,Liepins,Lieng,Liebross,Licciardi,Licavoli,Libbee,Lhuillier,Lhommedieu,Leyra,Lewman,Levreault,Levitre,Levings,Levick,Levecke,Levanger,Leval,Leva,Leuthold,Leuenthal,Letze,Letterlough,Leski,Lerwill,Lertora,Leppla,Leopoldo,Leonides,Leonardis,Lenoue,Lenoch,Lengerich,Lemont,Lemmert,Lemery,Lemaitre,Lella,Leko,Leithauser,Leisher,Leise,Leisch,Leiendecker,Leiber,Leialoha,Lehtomaki,Lehigh,Leggs,Legate,Leflar,Lefeber,Leezer,Ledden,Lecleir,Lechliter,Lebrane,Lebarron,Leason,Leapheart,Leadman,Lazarte,Lawin,Lavole,Lavesque,Laverdure,Lautner,Lauthern,Laurila,Laurendeau,Launderville,Laumeyer,Latina,Laszlo,Lassan,Larzelere,Larzazs,Larubbio,Larriuz,Larew,Laremont,Laredo,Lardizabal,Larance,Lappa,Lapolla,Lapatra,Lapaglia,Lantieri,Lannan,Lann,Langwith,Langolf,Langloss,Langlo,Langholz,Langhart,Langfitt,Langendorf,Langenbach,Langbehn,Lanehart,Landoni,Landherr,Landberg,Landazuri,Lancey,Lamus,Lamunyon,Lampitt,Lampiasi,Lammon,Lamme,Lamirand,Lambes,Lamarta,Lamarra,Lalim,Lalande,Laky,Laitila,Laidler,Laich,Lahue,Lahtinen,Lagrasse,Lagrand,Lagle,Lagerstrom,Lagerberg,Laferney,Lacson,Lachenauer,Lablue,Labean,Lab,Kuzara,Kuza,Kuy,Kutchera,Kustra,Kurtyka,Kurschner,Kurka,Kunstlinger,Kunka,Kunicki,Kunda,Kulling,Kulla,Kulbida,Kuker,Kujath,Kujala,Kuhta,Kuhner,Kuhle,Kufalk,Kuennen,Kuen,Kudley,Kucharik,Kuca,Kubic,Kryst,Krysh,Krumenauer,Kruczek,Kroschel,Kronk,Kroells,Krivak,Kristoff,Kristin,Kreuziger,Kreitz,Kreisberg,Kreiman,Kreighbaum,Kreh,Kreck,Kraszewski,Krason,Krammes,Krake,Kozusko,Kozola,Kozikowski,Kozielski,Kowis,Kowalske,Kottman,Kottler,Kottenstette,Kostelnick,Kosmowski,Koska,Kosinar,Kosik,Kosanovic,Kosanke,Kortge,Korsak,Kornbau,Kordas,Korby,Korbel,Kopperman,Koppenhaver,Kopischke,Koper,Kopelman,Kopel,Kopas,Kooser,Koors,Koor,Koone,Koogle,Konzen,Konieczka,Kondracki,Kondos,Komatsu,Kolo,Kolarik,Kolacki,Kokesh,Kohrt,Kohrs,Kogel,Kofron,Kofman,Koewler,Koetting,Koes,Koellner,Koellmann,Koczela,Kocon,Knoth,Knollman,Knoebel,Knknown,Knittle,Kniphfer,Knightly,Kniffin,Knaphus,Knaak,Kloth,Klonoski,Kloke,Kloer,Klinetob,Kliger,Klich,Kleyman,Klepchick,Klemish,Kleen,Klebe,Klakowicz,Klaft,Kithcart,Kister,Kisker,Kishel,Kishbaugh,Kirt,Kirouac,Kirley,Kirklen,Kirkegaard,Kirchen,Kipka,Kipfer,Kinsinger,Kiniry,Kinikini,Kingma,Kinderknecht,Kinahan,Kimmes,Kimak,Killiany,Killelea,Kilkus,Kilfoyle,Kiflezghie,Kiffer,Kiesewetter,Kienow,Kieler,Kiebler,Kicks,Kicker,Kibel,Kibe,Kibbee,Kiang,Khounthavong,Khatri,Khamsyuorauon,Kham,Keye,Keup,Keto,Ketch,Kess,Kerth,Kero,Kernell,Kerkvliet,Keomany,Keomanivong,Kennemur,Kennel,Kenndey,Kendi,Kempter,Kempinski,Kemna,Kellan,Keliikoa,Keledjian,Keithan,Keisel,Keib,Kehs,Kedley,Keay,Kearin,Kawulok,Kawai,Kawaa,Kava,Kaunisto,Kaumo,Kauahi,Kattner,Katra,Kastel,Kastein,Kassulke,Kassman,Kassing,Kashani,Kasch,Karty,Karstetter,Karrenberg,Karper,Karow,Karmo,Karhoff,Kardell,Kardas,Karapetian,Kapper,Kappen,Kapichok,Kanis,Kaneakua,Kanaris,Kamuda,Kamirez,Kamat,Kaloudis,Kallberg,Kallaher,Kalkwarf,Kalkman,Kalk,Kalisek,Kalehuawehe,Kalchik,Kalbfleisch,Kalberer,Kalal,Kala,Kakimoto,Kaing,Kaigle,Kahill,Kahanaoi,Kaemmerling,Kadri,Kadle,Kading,Kadi,Kadar,Kachmar,Kachiroubas,Kachelmeyer,Kaase,Juve,Juul,Justinger,Jungwirth,Jungman,Jungck,Julander,Juenemann,Jubie,Joun,Joswick,Jossund,Joss,Jory,Jonnson,Jongsma,Joliet,Johngrass,Jocoy,Jing,Jimerez,Jimbo,Jeudy,Jerowski,Jernstrom,Jernstad,Jernberg,Jeoffroy,Jentry,Jennie,Jeng,Jenaye,Jemerson,Jeltema,Jeanpaul,Jeanmard,Jax,Javery,Jaudon,Jasperse,Jasmer,Jarred,Jarrar,Jargas,Jardot,Jardell,Jaquay,Jappa,Janower,Jankoski,Janise,Jandrey,Jandl,Jakubiak,Jakobson,Jakobsen,Jahncke,Jagers,Jacobitz,Jackon,Izard,Ivel,Itzkowitz,Itani,Issacs,Isome,Isle,Islar,Isidro,Isidoro,Isch,Irvan,Irizary,Irene,Ipson,Ip,Ioele,Interiano,Insalaco,Iniestra,Ingargiola,Impson,Illiano,Iller,Illa,Ilardi,Iida,Ihrke,Igneri,Igbal,Igartua,Iffland,Idell,Iberra,Iba,Ianacone,Hysong,Hyrkas,Huzzard,Huttle,Husselbee,Husseini,Hupe,Hunzeker,Hunnicut,Humprey,Humbird,Humason,Hugle,Hufana,Huestis,Huesing,Huell,Hudy,Hudley,Hudas,Hudalla,Hudack,Huckfeldt,Hubka,Hubenthal,Huante,Hsing,Hromek,Hritz,Hrdlicka,Howzell,Howles,Howat,Hovarter,Houy,Housler,Houska,Houseal,Houlberg,Hostert,Hosman,Hoscheid,Horvers,Hortin,Hornish,Hornbeak,Hornaday,Hoppman,Hopfer,Hoot,Honts,Honsberger,Hons,Honnen,Honberger,Honahnie,Homma,Homesley,Holyoak,Holweger,Holubar,Holtzer,Holtrop,Holtberg,Holpp,Holmquest,Hollinghead,Holje,Holgerson,Holabaugh,Hoitt,Hofford,Hoffmaster,Hoffine,Hoffelt,Hoes,Hoellwarth,Hoegh,Hoegerl,Hoeger,Hodrick,Hodgkiss,Hodek,Hockey,Hobday,Hlavacek,Hlad,Hitzeman,Hitzel,Hitsman,Hissong,Hissam,Hiscock,Hirz,Hirshberg,Hipkins,Hinsch,Hinken,Hinckle,Hinchliff,Himmons,Himmelwright,Himmelspach,Himebaugh,Hilst,Hilmes,Hillsgrove,Hillestad,Hillesland,Hillegass,Hilfiger,Hilado,Highshaw,Highers,Higginbothan,Higbie,Hieronymus,Hidy,Hickory,Hickernell,Hibma,Hibbets,Heximer,Hewgley,Heutmaker,Heuschkel,Heupel,Heumann,Heuman,Hetzer,Hetherman,Hesterman,Hespe,Hertweck,Herson,Herry,Herrboldt,Herms,Hermosilla,Herl,Herbolsheimer,Herbel,Hera,Heptinstall,Heppler,Heppell,Henslin,Henschen,Hennington,Hennagir,Henkhaus,Henken,Henggeler,Hempfling,Hemmerling,Hemish,Hema,Helveston,Helsey,Helscher,Helo,Heline,Helfin,Helder,Heitner,Heiple,Heinzelman,Heinricher,Heines,Heimsness,Heiler,Heidelburg,Heiberg,Hegner,Hegler,Hefferman,Heffelbower,Heebner,Hediger,Hedding,Heckbert,Hearnsberger,Heaivilin,Heagle,Heafner,Hazelrig,Hayth,Hayoz,Haydu,Haybarger,Haya,Havers,Haverfield,Hauze,Haugabrook,Haub,Hathcoat,Hasychak,Hassin,Hassey,Hasenberg,Hasek,Harvat,Haruta,Hartvigsen,Hartong,Hartke,Harre,Harradon,Harnisch,Harmond,Harmening,Harlem,Harkrader,Harklerode,Hargitt,Hardon,Hardgrave,Hardester,Harbeson,Harben,Hanrath,Handville,Handcock,Hamza,Hamson,Hamming,Hamic,Hambley,Halphen,Halpain,Halmes,Hallaway,Hallauer,Half,Haldiman,Halbur,Hakkila,Hakimian,Haimes,Hahs,Hagmann,Hagglund,Hagert,Hagee,Hafeman,Haeber,Haddan,Hada,Hackner,Hackel,Hacher,Habisch,Haarstad,Haare,Haaker,Gyger,Guzowski,Guzi,Guzalak,Guyon,Guyll,Gutzmer,Guttirez,Gutt,Gutierrex,Gutierre,Gut,Gustis,Gushwa,Gurke,Gurevich,Gunyan,Gumz,Guisbert,Guire,Guintanilla,Guimaraes,Guillereault,Guidos,Guidera,Guffin,Guererro,Guenthner,Guedes,Guareno,Guardian,Grussing,Gruska,Grudzien,Growcock,Grossenbacher,Grosjean,Groshans,Grondahl,Grollimund,Groeneveld,Groenendyk,Grinnan,Grindell,Grindeland,Grimaud,Grigorov,Griffard,Grierson,Grich,Gribbins,Gribbin,Grever,Gretter,Grennon,Grenfell,Gremer,Greising,Greenhoward,Gravitz,Gravis,Gravino,Graubard,Grates,Granstrom,Grannell,Grandt,Granat,Grambling,Gramajo,Gralak,Graise,Grafe,Grade,Grad,Gracy,Goyco,Goyal,Govindeisami,Govert,Govero,Gouras,Goulbourne,Goularte,Gouker,Gotwalt,Gottshall,Gottsch,Gorum,Gordo,Gordils,Gorbet,Goonan,Goombi,Gooley,Goolesby,Goodlet,Goodland,Gomaz,Golt,Golombek,Golom,Golojuch,Golightley,Goldyn,Goldkamp,Goldfine,Goldermann,Goffinet,Goetter,Goethals,Goerdt,Goehl,Goedken,Goede,Goedde,Goeckel,Godshall,Godleski,Godino,Godine,Godden,Godar,Gockley,Gockel,Gochnour,Gobler,Goard,Gniewek,Gnerre,Gluszek,Glunt,Glotzbach,Glory,Glista,Glisan,Glende,Glee,Gleave,Glaus,Glau,Glassing,Gladhill,Gizzo,Giulian,Gittins,Girven,Girt,Girling,Girardot,Gipp,Giovannini,Gionet,Gins,Ginolfi,Gimar,Gilvin,Gilliom,Gilling,Gillece,Gilio,Gildow,Gilberg,Gieser,Gierisch,Gielow,Gieck,Gica,Gibboney,Giarraputo,Gianopoulos,Giannecchini,Giambruno,Ghrist,Ghiloni,Geving,Getto,Gessford,Gesner,Gesick,Gerstenkorn,Gersbach,Geroge,Gerleman,Gerl,Gerkin,Gerding,Gerchak,Georgiades,Geoffroy,Gentes,Genre,Genous,Genge,Geney,Gendusa,Gendel,Gemma,Gembler,Gemaehlich,Geldmacher,Gehris,Geffrard,Geffken,Geans,Gavel,Gavaldon,Gaughran,Gaud,Gaucin,Gauch,Gattuso,Gatliff,Gather,Gastonguay,Gassen,Gasior,Garzia,Gartz,Gartley,Garski,Garramone,Garoner,Garone,Garnow,Garley,Garibai,Garguilo,Garfunkel,Gardley,Gardecki,Garcilazo,Garbarini,Garan,Garafalo,Gani,Gandert,Gampong,Gamons,Gamma,Gambone,Gambler,Galves,Galo,Galm,Galluccio,Gallinari,Gallentine,Gallamore,Galeotti,Galella,Gajica,Gaisford,Gaietto,Gahlman,Gahl,Gaglia,Gaffke,Gaetz,Gadwah,Gabaree,Gaar,Fust,Furutani,Furner,Furnace,Furgison,Furgeson,Fundis,Fullem,Fullagar,Fujisawa,Fugit,Fugh,Fuemmeler,Fuelling,Fude,Frusci,Frosch,Frontera,Fronek,Fritzman,Fristoe,Frishkorn,Frilling,Frigge,Friels,Friehe,Friedline,Fridlington,Frezzo,Frezza,Fresta,Freise,Freiman,Freidhof,Freiberger,Freetage,Freet,Freemyer,Fredin,Fredenberg,Frayne,Fraughton,Franzel,Frankie,Frankenstein,Frankenberg,Francher,Franch,Francesconi,Franc,Fraize,Fragmin,Frabott,Foxman,Fouty,Fournet,Foulcard,Fouhy,Fougere,Fotopoulos,Forsmark,Fornell,Form,Forline,Forguson,Fontus,Fontanella,Folkner,Fok,Foggie,Fogelman,Flumerfelt,Fluegge,Fluegel,Fluck,Floe,Flocco,Flitsch,Flirt,Flinders,Fletchen,Flechsig,Flebbe,Flathers,Flatau,Flamer,Flaharty,Fladger,Fitten,Fitchpatrick,Fissori,Fissel,Fischler,Fioritto,Fiori,Fiorentini,Fiorella,Finnemore,Finkelson,Fingleton,Fingerhut,Finazzo,Filmer,Fillip,Fillingham,Filipek,Filan,Figurski,Figueron,Figueiras,Figley,Fiedor,Ficker,Fickas,Fevig,Feutz,Fetner,Fertal,Ferraiolo,Fernsler,Fernet,Fernatt,Fergusen,Ferg,Feraco,Fenny,Fengler,Felsted,Fellner,Fellin,Fellenz,Felkner,Felkel,Feliu,Feleppa,Felderman,Felde,Feigel,Feickert,Feibusch,Fedorek,Fedora,Federgreen,Fedalen,Feck,Febre,Fearnow,Feagler,Favorito,Faville,Favalora,Fauls,Faudree,Fasulo,Fassino,Farson,Farlin,Faretra,Farenbaugh,Farella,Faraone,Faragoza,Fanucchi,Fantroy,Fanny,Fangman,Famiglietti,Faltus,Faltin,Falt,Falley,Falldorf,Falick,Fala,Fahrney,Faggs,Fafard,Faes,Fadely,Fadel,Facchine,Fabionar,Ezagui,Evoy,Evilsizer,Evick,Eversoll,Eversman,Everley,Evelo,Euvrard,Eun,Etkin,Ethen,Estrela,Esteb,Estain,Estacion,Esquerra,Esposto,Espert,Eskra,Eskin,Eskenazi,Eshom,Eshenbrenner,Esera,Escobio,Eschief,Eschenbrenner,Erschen,Erlewine,Erdner,Erck,Erceg,Erbach,Epolito,Ephriam,Enwright,Enwall,Entrikin,Entress,Entler,Enstad,Engwall,Engroff,Englemann,Engelson,Enderlin,Enamorado,Emme,Emlay,Emke,Emerton,Embertson,Elworthy,Elwick,Elward,Eloy,Ellyson,Ellstrom,Ellingboe,Elliam,Elifritz,Elgart,Elerick,Eitzen,Eismann,Eisentrout,Eischeid,Eirich,Eikner,Eickhorst,Ehrler,Ehrle,Eglinton,Egerer,Egelhoff,Edmunson,Ecord,Eckrich,Eckland,Echevaria,Ebersold,Eberenz,Ebener,Ebadi,Ealand,Eaks,Eagleston,Eaglen,Eagin,Dyals,Dwelley,Duy,Duva,Dutter,Dutko,Duster,Duskin,Dusel,Durrenberger,Durke,Durian,Dupay,Duntley,Dunsford,Dundee,Dulemba,Dugi,Dufficy,Duensing,Dueno,Dueitt,Duclo,Dubrock,Dubitsky,Drumgo,Drozdowicz,Dromgoole,Drobot,Drivas,Drinkwine,Drewing,Dressman,Dreessen,Drainville,Dragna,Draffin,Dowgiallo,Dovey,Dougher,Dottin,Dossous,Dossie,Dose,Doronio,Dorning,Dorko,Dorion,Dorinirl,Doring,Doorn,Donohoo,Donnally,Donkin,Donez,Donerson,Dondlinger,Donchez,Donaway,Donatien,Donath,Dommel,Domine,Domin,Domiano,Domhoff,Domek,Doller,Dolinsky,Dolberry,Doker,Doil,Doidge,Dohman,Doeden,Dodridge,Dodgson,Dobkowski,Dobie,Dobes,Dobert,Diwan,Ditomasso,Distaffen,Distad,Dispenza,Disorbo,Diskind,Diserens,Discipio,Dirico,Dire,Dirago,Diprima,Dinwoodie,Dinn,Dinkens,Dinius,Dingeldein,Dimon,Dimitt,Dimitriadis,Dilliard,Dilick,Dilauro,Dilallo,Dilalla,Dihel,Digilio,Difonzo,Difeo,Dietze,Dietl,Diesi,Diesel,Dieppa,Dienes,Diemert,Diegel,Dieffenbacher,Diec,Dickhoff,Dickensheets,Dibonaventura,Dibblee,Dibartolo,Dibacco,Dhondt,Dewer,Develbiss,Devazier,Devara,Deuser,Deur,Deuell,Detzel,Dettling,Detro,Destine,Destefanis,Desorcy,Desomma,Deslandes,Desisto,Desiga,Deshler,Deshaw,Desgroseillie,Desaulniers,Derwitsch,Derrig,Derouchie,Dermady,Derider,Derfus,Derbes,Depperschmidt,Depoyster,Depaula,Dense,Dennin,Deniro,Denio,Dengel,Deneen,Dempsy,Demmy,Demmert,Demichelis,Demedeiros,Dembroski,Dembitzer,Demarse,Demaranville,Demagistris,Deluz,Delson,Delrossi,Delrie,Delossanto,Delos,Delmolino,Dellis,Dellarocco,Dellano,Della,Delisser,Delille,Deleston,Delerme,Deleone,Delehanty,Delbalso,Delavina,Delauter,Delashmit,Dekalb,Deguire,Degross,Degroote,Degrasse,Degrange,Degrace,Degasperis,Deffibaugh,Defaber,Decrosta,Decristoforo,Dechert,Decelle,Decapua,Decapite,Decandia,Debuse,Debruler,Deblauw,Debella,Debeer,Dayrit,Davidian,Davick,Davich,Davia,Daversa,Davern,Davault,Dautrich,Dausch,Dathe,Dastrup,Dassow,Darras,Darnold,Darks,Dargis,Dargatz,Darbouze,Dannenfelser,Dannard,Dampf,Dalzen,Dalphonse,Dalluge,Dalhover,Daivs,Dainack,Daher,Dagle,Daghita,Dagdag,Dafonseca,Daffern,Daehler,Dadson,Czuba,Czlapinski,Czarnik,Czap,Cynova,Cwiklinski,Cuzco,Cutno,Curt,Curbow,Cunninghan,Cunis,Cuningham,Cunico,Culmer,Cuhel,Cuestas,Cuebas,Cuchares,Cubr,Csizmadia,Crumpacker,Cruell,Crousore,Crosten,Crosman,Crooked,Cromuel,Cromey,Crockarell,Croan,Crissler,Crispen,Crismon,Crise,Criscillis,Crippin,Crilly,Cresta,Cregar,Cragun,Coye,Cowing,Cower,Coverstone,Coverdell,Couty,Coutant,Courtnage,Courteau,Couper,Countee,Coultas,Coughran,Cottew,Cotler,Cotelesse,Costen,Cossin,Coskrey,Cosen,Cosden,Corvera,Cortis,Corsello,Corrion,Corrigeux,Correiro,Coro,Cornetta,Corneil,Corlee,Corin,Corgan,Corfman,Corell,Cordovi,Cordia,Cordas,Corcino,Corchero,Coral,Coppolino,Coppernoll,Coppens,Coote,Cooperstein,Cooperrider,Conterras,Consolazio,Cons,Connin,Connerley,Conkin,Congress,Concienne,Conaghan,Comrey,Cominsky,Comella,Comee,Come,Combe,Coln,Collums,Collamore,Colicchio,Colee,Colding,Colder,Colbenson,Colagiovanni,Cokely,Coin,Codde,Cobrin,Coak,Cluxton,Cluesman,Clouston,Closser,Clopp,Cliatt,Clendennen,Clearman,Clattenburg,Clarks,Clapsaddle,Cius,Cira,Ciolli,Cinotti,Cimko,Cima,Cienega,Cicatello,Cicale,Ciarlante,Cianfrini,Cianciulli,Churley,Churches,Chuong,Chukes,Christou,Christescu,Christe,Chrismon,Chrisler,Choun,Chobot,Chisem,Chiong,Chimera,Chila,Chicca,Chiarito,Chhun,Chhum,Chhim,Chestang,Chesler,Cherubin,Chernosky,Cherebin,Chepiga,Chellis,Chell,Cheda,Checca,Cheater,Cheatem,Chaulk,Chaudhuri,Chauca,Chatcho,Chartraw,Charping,Charnley,Charm,Charlson,Charbonneaux,Charan,Chapp,Chango,Chanez,Chancer,Chamnanphony,Chalepah,Chaiken,Chaddlesone,Chaconas,Chabaud,Cestia,Cessor,Cervetti,Cerveny,Cerise,Cerecer,Cerasoli,Cera,Centini,Cenci,Cembura,Celli,Cederstrom,Cdebaca,Cayo,Cawthron,Caviggia,Cavers,Caveney,Causley,Caughlin,Cathie,Catan,Catala,Castrogiovann,Castleton,Castilo,Castillio,Castellaw,Castellari,Castejon,Caspersen,Casivant,Cashio,Cascioli,Casciano,Casamento,Casadei,Carwin,Carvin,Carucci,Cartin,Cartez,Carston,Carrio,Carriaga,Carretino,Carotenuto,Carosiello,Carolfi,Carnathan,Carnalla,Carnagey,Carlill,Carinio,Cariker,Caride,Care,Cardero,Cardenal,Carasquillo,Carabez,Capwell,Capurro,Capulong,Cappucci,Cappetta,Cappa,Capouch,Caporali,Caponigro,Capilla,Capata,Capan,Canzoneri,Cantine,Cantarano,Cannellos,Cannard,Cannada,Canlas,Cangey,Canaan,Campoy,Campany,Campainha,Cambi,Camba,Camastro,Camano,Calrk,Callin,Callari,Calicutt,Calemine,Caleb,Caldon,Caldas,Cajas,Cadelina,Cacal,Cabriales,Cables,Bytheway,Byland,Byes,Byan,Buzick,Buziak,Buzhardt,Butzlaff,Buttolph,Butta,Butron,Butorac,Butaud,Butac,Busuttil,Busque,Busing,Busboom,Burwood,Burright,Burri,Burrall,Burness,Burlington,Burlin,Burkham,Burick,Burich,Burgner,Burdex,Burdell,Burde,Burba,Buol,Bundi,Bulick,Bulgin,Bukovsky,Bukovac,Bujak,Bugett,Buffo,Bueschel,Bueckers,Budnik,Buckey,Buckel,Buchko,Buchinski,Buchana,Buchaman,Bucek,Buba,Bryans,Brustkern,Brussel,Brusseau,Bruntz,Brunscheen,Brunken,Brumbach,Bruess,Brueckman,Brueck,Brucken,Brozena,Brozek,Brownley,Browers,Brosman,Brosch,Broody,Brood,Bronzo,Bronn,Bromwell,Brome,Bromagen,Broll,Brofman,Broekemeier,Brodi,Brixner,Brisban,Brinkmeier,Bringham,Bridgforth,Bridgette,Breznak,Brewbaker,Breitweiser,Breiten,Breitbarth,Brehaut,Breedan,Breech,Bree,Bredernitz,Brechner,Brechbiel,Breashears,Brazinski,Brazille,Bratz,Bratu,Bratsch,Bras,Branting,Brannin,Bramsen,Brailford,Bragas,Bradney,Bradner,Bradigan,Bradica,Brad,Brabston,Bozwell,Boys,Boyn,Boyar,Boyance,Boxton,Bowering,Bowar,Bournazian,Bourgue,Bourgoine,Bourdage,Boulier,Boulds,Boulding,Bouch,Bottum,Bottorf,Botero,Bossler,Bosshardt,Bossart,Bosman,Borzillo,Borstad,Borsos,Borsellino,Borrayo,Borowiak,Borio,Borgos,Borglum,Borghoff,Boreland,Bordeleau,Borchelt,Boorman,Boole,Bookwalter,Bookhart,Bonventre,Bonucchi,Bonnema,Bongard,Bonardi,Bonadio,Bomstad,Bombaci,Bolus,Bolognese,Bolnick,Bolebruch,Boldrin,Bolder,Boje,Boho,Bohmker,Bogosh,Bognar,Bogin,Bogatitus,Bogaert,Boga,Boehmke,Boeh,Bodway,Bodemann,Bockhorst,Bochner,Bocek,Boblitt,Bobbit,Boatfield,Boast,Boardley,Bo,Blumhardt,Blower,Blondell,Bloemer,Bloczynski,Blint,Blenden,Blend,Blem,Bleininger,Bleile,Blehm,Blechman,Bleak,Blattler,Blattel,Blatherwick,Blatchley,Blasing,Blasen,Blandin,Blaire,Blad,Blackler,Bizzle,Bison,Bisogno,Bisking,Bishopp,Bischke,Biscaro,Bisarra,Birton,Birrueta,Birrell,Birklid,Binkerd,Binetti,Binegar,Bindrup,Billerbeck,Bilka,Biley,Bilecki,Biglin,Bievenue,Bierwagen,Biernat,Bienvenue,Bielik,Biedrzycki,Bideaux,Bidding,Bickman,Biber,Bibel,Biancardi,Bialy,Bialke,Bialecki,Bhattacharya,Bezak,Bevilaqua,Beuth,Beuter,Beutel,Beucler,Betties,Betteridge,Betschart,Betran,Bethley,Beteta,Beswick,Bessmer,Bessemer,Besherse,Beserra,Berver,Bertuzzi,Bertke,Berthelsen,Berthelette,Bertagna,Bersch,Berrio,Bernoski,Bernatowicz,Bernardy,Berling,Berl,Bergmeier,Bergland,Bergfield,Bergesen,Bergem,Bergantzel,Bergamo,Berdecia,Berardo,Berardino,Bequillard,Benzinger,Benyamin,Bentzen,Bennice,Benke,Benet,Beneker,Benedum,Benedick,Bend,Bencosme,Bemrose,Bemiller,Bemer,Belzung,Belmarez,Bellina,Bellendir,Bellemare,Bellantuono,Bellanca,Belkin,Belinski,Belcourt,Bejaran,Behl,Beeker,Beeghly,Bedney,Bedker,Bedeau,Beddome,Beddoe,Becvar,Beccaria,Beaz,Beaushaw,Beaulac,Beatley,Beardon,Beachem,Beachel,Bazydlo,Baydal,Baxi,Bauserman,Baudler,Batzli,Battino,Battee,Batley,Batesole,Batcher,Basurto,Basu,Bastianelli,Bassage,Basner,Bashford,Basher,Bashara,Basha,Baselice,Bartosiewicz,Bartolomucci,Bartnick,Bartholic,Barthe,Bartelson,Barsuhn,Barson,Barries,Barricelli,Barrena,Barredo,Barraz,Barrale,Baroldy,Barne,Barmettler,Barjas,Baris,Bareis,Bardach,Barcroft,Barcello,Barbuto,Barbrick,Barbo,Barbish,Barbaria,Baras,Baragona,Baquet,Banwell,Banowetz,Bandle,Bambhrolia,Balthazar,Balson,Balliett,Ballestas,Balin,Balfany,Balette,Baldrige,Baldenegro,Baldassara,Baldasaro,Balcorta,Balckwell,Balcitis,Balasco,Baka,Baish,Bainum,Bailin,Baile,Bahlmann,Baher,Bagoyo,Baggette,Bafford,Baddley,Badanguio,Badamo,Badame,Baczewski,Bacorn,Bacolor,Bacigalupi,Bachtold,Bacha,Babick,Azzano,Azua,Azhocar,Ayre,Aydt,Aydlett,Axsom,Awada,Averbach,Avenoso,Auzston,Auyong,Autaubo,Austad,Aus,Aurora,Aultz,Aulds,Auldridge,Aul,Auge,Auel,Audirsch,Audain,Auchmoody,Aubertine,Auber,Astry,Asquith,Asp,Ashdown,Asen,Aselage,Ascensio,Asam,Asad,Artuso,Artinger,Arritola,Arre,Arraiol,Arra,Arouri,Arnzen,Arntson,Arnstein,Arnoldy,Arnhart,Arnet,Armentor,Armel,Arganbright,Argall,Argabright,Arenstam,Ardinger,Arcuo,Arambulo,Aramboles,Arabian,Appelt,Appelgren,Apodoca,Ape,Anzai,Anttila,Antoniou,Antoniotti,Antonakos,Antell,Antee,Antaya,Anschutz,Ano,Annon,Anne,Annarummo,Anick,Angelovich,Anes,Androes,Andrle,Andreoli,Andreassen,Anderl,Ancira,Anastasi,Anastacio,Analla,Ana,Amunrud,Amparan,Amory,Amores,Amodei,Amdahl,Amazan,Alway,Alvira,Aluise,Altomonte,Altidor,Altadonna,Alstott,Alsina,Alshouse,Alpizar,Alonge,Almestica,Almaras,Almand,Allwardt,Allum,Allgier,Allerman,Alkbsh,Alier,Aliano,Alfson,Alfero,Alexender,Alessandro,Alesci,Aldas,Aldaba,Alcide,Alby,Albelo,Albares,Albair,Albach,Alamin,Alagna,Akuna,Akright,Akim,Akes,Aken,Akbari,Akau,Aitkins,Aita,Airola,Aines,Aimone,Ailts,Ahrent,Ahne,Ahlman,Ahlin,Aguire,Agor,Agner,Agerter,Age,Agcaoili,Afzal,Afshari,Affleck,Aduddell,Adu,Adolfo,Adolf,Adjei,Adham,Aderholdt,Adens,Adee,Adauto,Acocella,Ackroyd,Ackers,Acken,Ack,Achter,Acheampong,Aceret,Accornero,Abts,Abruzzino,Abrecht,Abramov,Aboud,Abo,Abes,Abed,Abby,Aamot,Aalbers,Zwolensky,Zwiener,Zwanzig,Zvorsky,Zutter,Zurowski,Zupfer,Zunker,Zumbach,Zubik,Zubiate,Zottola,Zoss,Zorman,Zonker,Zomer,Zollo,Zolezzi,Znidarsic,Zmijewski,Zmich,Zlaten,Zisk,Zinter,Zingler,Zindel,Zimlich,Zillman,Zilliox,Zigich,Ziesemer,Zielonka,Ziebart,Zia,Zhuang,Zeyer,Zerkle,Zepf,Zenisek,Zempel,Zemaitis,Zeltner,Zellman,Zelasco,Zeisler,Zeinert,Zeier,Zegarra,Zeeman,Zedaker,Zecher,Zeagler,Zbinden,Zaunbrecher,Zarlengo,Zannino,Zanni,Zangara,Zanetti,Zanes,Zanderigo,Zanayed,Zambito,Zalusky,Zakutney,Zaiss,Zahar,Zagrodnik,Zaeske,Zadroga,Zadeh,Zacek,Yzaquirre,Yuro,Yupe,Yunt,Yue,Youns,Youngerman,Youkhana,Yoshizumi,Yoshiyama,Yoshikawa,Yoshihara,Yore,Yoneda,Yoh,Yepsen,Yepiz,Yentzer,Yelin,Yedid,Yeddo,Yeboah,Yeah,Yauck,Yattaw,Yarrow,Yarosh,Yarn,Yanuaria,Yanko,Yampolsky,Yamin,Yamagata,Yakow,Yaegle,Yacono,Yacko,Xayavong,Wythe,Wyrich,Wydeven,Wyandt,Wurtzel,Wurdeman,Wunner,Wulffraat,Wujcik,Wry,Wrighton,Wreath,Wraight,Wragge,Woznick,Woten,Wormuth,Woofter,Woodmore,Woode,Womeldorff,Wolvin,Wolman,Wolgast,Wolfgramm,Wojtas,Wojenski,Wohletz,Woetzel,Woelke,Woelk,Woehrle,Wittlinger,Wittke,Witthuhn,Witthoft,Wittekind,Witkus,Witbeck,Wist,Wissinger,Wisnoski,Wisley,Wishard,Wish,Wipperfurth,Winterling,Winterholler,Winterfeld,Winsman,Winkenwerder,Wingerson,Winegard,Windland,Winchel,Wilmott,Willwerth,Willougby,Willinger,Willims,Williby,Willian,Williamon,Willhelm,Willging,Willens,Willenbring,Willcott,Willardson,Wilhelmy,Wildsmith,Wildoner,Wildberger,Wikholm,Wigner,Wiglesworth,Wiggett,Wiget,Wigdor,Wieman,Wied,Wieboldt,Widen,Wickett,Wickard,Wichterman,Wichland,Wicher,Whysong,Whyms,Whooper,Whooley,Whitver,Whitmoyer,Whitehorse,Whitebear,Whish,Whippo,Wheler,Whelehan,Wheetley,Wheeland,Wheelan,Whatoname,Whalan,Weygandt,Wexell,Wetherald,Westfahl,Westerholm,Westerheide,Westenhaver,Westen,Wessendorf,Wescom,Werstein,Wersal,Werra,Werntz,Wernicki,Wernett,Werger,Werber,Wenskoski,Wenk,Wendzel,Wendelboe,Wenciker,Wemhoff,Welshans,Welde,Welby,Welburn,Weisfeld,Weisenfels,Weinreich,Weikert,Weiglein,Weida,Wegweiser,Wegley,Weflen,Weeler,Wedo,Wedin,Wedgewood,Wedderspoon,Wedd,Weberg,Weathington,Wears,Weakly,Weafer,Weaber,Waz,Waxler,Wave,Wauson,Waugaman,Waterer,Wasmuth,Washmuth,Warters,Warsaw,Warns,Warnken,Warney,Wariner,Warchol,Wansitler,Wanless,Wanker,Wandrie,Wandler,Wanczyk,Waltmann,Waltersdorf,Walsworth,Walseth,Walp,Walner,Walmer,Walloch,Wallinger,Wallett,Walkley,Walkingstick,Walentoski,Walega,Wale,Waldock,Waldenmyer,Walde,Waldbauer,Walchak,Wakayama,Waiau,Waddick,Wacyk,Vreeken,Vrbka,Vradenburg,Vounas,Votolato,Vosquez,Vosika,Vorwald,Vorse,Voros,Vorgas,Vorel,Voorhes,Voncannon,Volstad,Volo,Volkmer,Volden,Volbrecht,Voisard,Voetsch,Voetberg,Voeltner,Voegeli,Vock,Vlloa,Vivona,Vivino,Vivenzio,Vitucci,Vittitoe,Viti,Viteaux,Vitatoe,Viscome,Virzi,Virula,Virrey,Virella,Virani,Viox,Violetta,Vinall,Villatora,Vilcan,Vik,Vigen,Vieths,Vielman,Vidra,Vidot,Vidalez,Vicent,Vibert,Vibbard,Veth,Vestering,Veshedsky,Versoza,Verrell,Veroeven,Vernola,Vernia,Verjan,Verity,Veriato,Verhague,Verdusco,Verderosa,Verderame,Verdell,Verch,Verbeke,Venture,Veness,Vener,Vendrick,Vences,Vellucci,Vellone,Velk,Vegh,Vedia,Vecchiarelli,Vazzana,Vaux,Vaupel,Vaudrain,Vatalaro,Vastano,Vasso,Vasiliou,Vasher,Vascones,Vas,Varuzzo,Varrelman,Varnedore,Vari,Varel,Vanwright,Vanvoorhees,Vanvolkinburg,Vantrump,Vanstraten,Vanstone,Vansice,Vanscoter,Vanscoit,Vanord,Vanoosten,Vannortwick,Vannette,Vannatten,Vanloon,Vanliere,Vanis,Vanhese,Vangalder,Vanelderen,Vandre,Vandover,Vandinter,Vandewalle,Vandevander,Vanderroest,Vandermay,Vanderloo,Vanderlee,Vanderlaan,Vandergraph,Vanderen,Vandenbrink,Vandenboom,Vandenberge,Vandel,Vandegriff,Vandale,Vanbruggen,Vanboerum,Vanbelle,Vanauker,Vanasten,Vanarsdall,Vallerand,Valladao,Valis,Valintine,Valenziano,Valentia,Valensuela,Vaisman,Vahena,Vaglienty,Vacchiano,Uziel,Uyemura,Utsler,Usie,Urzua,Ureste,Urby,Urbine,Urabe,Uptgraft,Unterzuber,Untalan,Ungerman,Ungerland,Underland,Underberg,Umholtz,Umbright,Ulwelling,Ulstad,Ulmen,Ulcena,Ulanski,Uhlenkott,Uher,Uhas,Uglow,Ugland,Uerkwitz,Uccellini,Tysarczyk,Tyron,Twymon,Twohey,Twisselman,Twichell,Tweten,Tuzzolo,Tuzzo,Tutoky,Tusler,Turnner,Turja,Turick,Turiano,Tunnicliff,Tummons,Tumlison,Tumaneng,Tuder,Tuczynski,Tuchman,Tubville,Tsukiyama,Tselee,Truxon,Truxler,Trussler,Trusler,Trusillo,Trudillo,Trude,Truchan,Trowery,Trotochaud,Tropiano,Tronstad,Trolinger,Trocinski,Triveno,Trites,Triplet,Trick,Trichell,Trichel,Trevey,Trester,Treisch,Treger,Trefz,Tredwell,Trebbe,Treakle,Travillion,Travillian,Travaglio,Trauscht,Traube,Trapper,Tranum,Trani,Train,Towlson,Towlerton,Towey,Tovmasyan,Tousley,Tourtellotte,Toure,Toulson,Totin,Tosti,Tosado,Toruno,Torrisi,Torris,Torrent,Torrado,Torner,Torino,Torell,Topolansky,Tooze,Toot,Tontarski,Tonnessen,Tonneson,Tones,Tomisin,Tomilson,Tomasetti,Tolomeo,Tollman,Tolhurst,Tolchin,Tolbent,Toher,Toffton,Toepel,Toelkes,Todorovich,Todisco,Toczek,Tockey,Tochterman,Tobiasson,Tlucek,Titzer,Titman,Tise,Tippets,Tio,Tingwald,Timmel,Timbrook,Tilmon,Tijerino,Tigerino,Tigano,Tieken,Tiegs,Tiefenbrun,Tichacek,Tica,Thurmer,Thuotte,Thramer,Thoroughman,Thornock,Thorndyke,Thongchanh,Thomen,Thoe,Thody,Thigpin,Thielemier,Thi,Therres,Thal,Thakur,Tewes,Teves,Tesmer,Teslow,Tesler,Teruel,Terron,Terris,Terre,Terrasi,Terrace,Tero,Terman,Tereska,Teresi,Tepp,Teo,Tenzer,Tennille,Tennies,Tencza,Tenamore,Tejadilla,Tecklenburg,Techaira,Tayse,Tawwater,Tavolacci,Taverner,Taurino,Taulman,Taublee,Tauarez,Tattershall,Tatsuta,Tatsuno,Taschner,Tasby,Tarrats,Tarrants,Tarone,Tarley,Taraborelli,Taper,Tanniehill,Tanks,Tankard,Tangri,Tanequodle,Tamporello,Tamer,Tamburro,Tambunga,Taliman,Talib,Talas,Takala,Takach,Taiwo,Taibi,Taghon,Tagaban,Tadena,Taccone,Taccetta,Tabatabai,Szyszka,Szmalc,Szerszen,Szczepanik,Szarek,Szafraniec,Szafran,Szablewski,Syta,Sysyn,Syndergaard,Symanski,Sylvian,Syck,Swymer,Swoffer,Swoager,Swiggum,Swiat,Swetnam,Swestka,Swentzel,Sweetwood,Swedenburg,Swearingin,Swartzendrube,Swarm,Swant,Swancey,Sverchek,Svenson,Sutor,Suthoff,Suthar,Susong,Suskin,Surra,Surano,Supplee,Supino,Sundborg,Summons,Summerour,Sumers,Sultzer,Sulouff,Sulecki,Suhoski,Suhar,Sugerak,Suganuma,Suddoth,Sudberry,Sud,Stymiest,Stvrestil,Stuve,Sturrup,Sturmer,Stumer,Stuhlsatz,Stuenkel,Studier,Stuczynski,Stubbolo,Struebing,Struchen,Strozzi,Strowder,Strohbehn,Stroer,Strobridge,Strobeck,Stritmater,Strike,Strieter,Strickling,Streu,Streifel,Straugter,Stratakos,Strasburger,Straface,Straatmann,Stpeters,Stovel,Stoudenmire,Stotsky,Stothart,Storz,Stormes,Storman,Stoppel,Stooks,Stonelake,Stonebrook,Stombaugh,Stoltzman,Stolsig,Stolpe,Stoglin,Stoffle,Stodgell,Stocke,Stirna,Stipetich,Stinner,Stimpert,Stimer,Stilphen,Stikeleather,Stifel,Stiely,Stielau,Stieger,Stidman,Stickrath,Stickman,Stickels,Stgerard,Sternberger,Stergios,Stepien,Stepanski,Stent,Stenkamp,Stenehjem,Stempel,Stemmer,Stelb,Steiskal,Steinmuller,Steinmacher,Steinhorst,Steinhaus,Steinharter,Steinhagen,Steinburg,Steifle,Stefanick,Stefanich,Steeber,Stay,Stawarz,Stavropoulos,Staves,Staup,Stauch,Staubs,Stathopoulos,Stathis,Startz,Starowitz,Starowicz,Starkie,Starcic,Stanely,Standrod,Standahl,Stanczak,Stample,Stampka,Stamer,Stallins,Stalford,Stahoski,Stagger,Stader,Staack,Srsic,Srey,Squitieri,Spyres,Spuhler,Sprouffske,Sprosty,Sprinzl,Springle,Spoth,Spletzer,Spizer,Spitsberg,Spitale,Spiroff,Spirer,Spiotta,Spinola,Spingler,Spike,Spierling,Spickler,Sphon,Spettel,Sperle,Sperka,Sperberg,Speltz,Spaw,Spasiano,Spare,Spancake,Spagna,Sowerby,Sovern,Souvannasap,Southerly,Sous,Sourwine,Soult,Sotiriou,Sothman,Sota,Sortore,Sorley,Sorin,Sorells,Soratos,Soose,Soong,Sonsino,Sonnabend,Sonia,Songster,Sondrol,Sondergaard,Soltau,Solinski,Solinger,Solid,Sojda,Sohns,Softleigh,Soffel,Soffa,Sodaro,Sodano,Soda,Sobran,Sobczynski,Sneeden,Snater,Snair,Smoker,Smithingell,Smink,Smiles,Smialek,Smetak,Smejkal,Smeck,Smaldone,Sluyter,Slot,Slostad,Slingerland,Sliffe,Slemmer,Slawter,Slavinski,Slagowski,Slaff,Skuse,Skulski,Skornia,Skolfield,Skogstad,Skinkle,Skidgel,Skeffington,Skeets,Skeele,Skarupa,Skarphol,Skaare,Sjolander,Sjaarda,Sitts,Sitterud,Sitt,Sissell,Siprasoeuth,Sipper,Sipla,Sipkema,Sinning,Sinitiere,Single,Simmens,Simm,Simiskey,Simelton,Silverthorne,Silvernale,Silvan,Siliado,Silbaugh,Siket,Siker,Sigurdson,Signore,Sigers,Siffert,Sieving,Sieverding,Sietsema,Siering,Sienicki,Siemsen,Siemonsma,Siemering,Sielski,Siedlecki,Siebers,Sidbury,Sickman,Sickinger,Sicilian,Sible,Sibilio,Sibble,Shutler,Shurgot,Shuping,Shulda,Shula,Shrieves,Shreiner,Shreckengost,Shreck,Showes,Showe,Shoupe,Shoumaker,Shortey,Shorten,Shorrock,Shorkey,Shones,Shockency,Shoats,Shivel,Shipmen,Shinsel,Shindledecker,Shinabarger,Shiminski,Shiloh,Shillingford,Shigo,Shifman,Shiers,Shibuya,Shewchuk,Shettsline,Shetter,Shetrawski,Sheffel,Sheesley,Sheekey,Sheeder,Sheares,Shauger,Sharko,Shanna,Shankin,Shani,Shandley,Shanaa,Shammo,Shamlin,Shambrook,Shadow,Shackley,Sgambati,Sferrazza,Seydel,Sewald,Sevenbergen,Sevaaetasi,Seumanu,Seuell,Settler,Setterberg,Setera,Sesso,Sesay,Servoss,Servino,Serpe,Sermeno,Serles,Serena,Serapio,Senske,Semmler,Seminole,Semel,Selvaggi,Sellai,Selissen,Seling,Seleg,Seledon,Selbo,Selan,Sekuterski,Sekula,Seiwell,Seivert,Seise,Sein,Seils,Seier,Seidita,Seiberling,Seher,Segroves,Segoviano,Segel,Segee,Seftick,Sees,Seekell,Seegobin,Seebold,Sedlack,Sedbrook,Section,Secrease,Secore,Seckler,Seastrand,Seargent,Seacrist,Seachord,Seabrooke,Scudieri,Scrim,Scozzafava,Scotten,Sconce,Scircle,Scipioni,Sciarretta,Sciallo,Schwingler,Schwinghammer,Schwingel,Schwiesow,Schweinfurth,Schweda,Schwebke,Schwarzkopf,Schwander,Schwaller,Schwall,Schut,Schurkamp,Schunter,Schulder,Schuenemann,Schue,Schuckman,Schuchart,Schroff,Schoville,Schorzman,Schorder,Schooner,Schones,Scholler,Schofell,Schoewe,Schoeninger,Schoenhals,Schoenbeck,Schoefield,Schoberg,Schnittker,Schneidermann,Schneckloth,Schnebly,Schnathorst,Schnarrs,Schnakenberg,Schmitzer,Schmidbauer,Schmeeckle,Schmeckpeper,Schmandt,Schmalzried,Schmal,Schlinker,Schliep,Schlette,Schlesier,Schleig,Schlehuber,Schlarbaum,Schlaffer,Schkade,Schissel,Schindeldecke,Schimandle,Schiermeier,Scheunemann,Scherrman,Schepp,Schemmer,Schelp,Schehr,Schayer,Schaunaman,Schauland,Schatzel,Scharrer,Scharping,Scharpf,Scharnberg,Scharmer,Scharbor,Schalow,Schaf,Schader,Schacter,Scelfo,Scarpello,Scarlet,Scaringe,Scarduzio,Scamardo,Scaman,Sbano,Sayman,Saylee,Saxena,Sawdey,Sawada,Savitsky,Savickas,Savic,Savaglio,Sauriol,Sauret,Saulo,Satar,Sasportas,Sarvas,Sarullo,Sarsfield,Sarne,Sarmento,Sarjent,Sarellano,Sardin,Saputo,Santheson,Santellana,Santarsiero,Santago,Sansalone,Sanos,Sanna,Sanko,Sanker,Sanghani,Sangalli,Sandven,Sandmann,Sandhoff,Sandelius,Sandall,Sanchious,Sancedo,Sance,Sampogna,Sampilo,Sampayan,Sampaia,Sampaga,Samo,Samlal,Samela,Samec,Samad,Salzberg,Salway,Salwasser,Salveson,Salvemini,Salus,Salquero,Salowitz,Salizzoni,Salina,Salin,Salimi,Salgero,Salemi,Salato,Salassi,Salamacha,Salahubdin,Salada,Saintignon,Saintamand,Saines,Sahl,Saha,Sagona,Sagedahl,Saffel,Saemenes,Sadow,Sadlow,Sadger,Sacramento,Sackal,Sachtleben,Sabota,Sabot,Sabe,Sabata,Sabastian,Sabad,Rzepka,Ryzinski,Rytuba,Ryon,Rynes,Rykiel,Rykert,Rykard,Rydolph,Rydell,Ruzicki,Rutko,Rutenbar,Rustrian,Rusinski,Rushmore,Rushenberg,Rushen,Ruschak,Rury,Ruper,Ruotolo,Rummerfield,Rumer,Rumbolt,Rulon,Ruleman,Rufe,Rudo,Rudkin,Rudick,Rubinich,Rubidoux,Rubero,Roys,Rowman,Rovere,Rousu,Rouillier,Rotton,Rotondi,Rothenbach,Roszell,Rossotto,Rossmiller,Rossey,Roshannon,Rosenfeldt,Roscioli,Rosander,Rorrer,Rorex,Ropes,Ropac,Rooth,Roorda,Ronsani,Ronne,Rong,Ronfeldt,Rondy,Romp,Romon,Romness,Romm,Romera,Romeiro,Rombach,Romar,Romansky,Romagnoli,Rom,Rolson,Rojos,Rohanna,Rogstad,Rogillio,Rogg,Rogacki,Roffman,Roethle,Roeth,Roetcisoender,Rodibaugh,Roderiques,Rodenburg,Rodemeyer,Rodberg,Rockovich,Rocher,Roccio,Robeck,Robe,Robayo,Robar,Rizzardo,Rivie,Rival,Ritterbush,Ritchko,Ritchhart,Ristig,Rishty,Rippstein,Rippelmeyer,Rioseco,Ringwald,Ringquist,Ringham,Rinella,Rineer,Rimple,Rilling,Rill,Rijo,Riihimaki,Riglos,Riggens,Rigaud,Rigali,Rietz,Rietdorf,Riessen,Riesgraf,Rienstra,Riekena,Riedle,Riedinger,Rieb,Rickenbaker,Richcreek,Richbourg,Riccelli,Riberdy,Ribb,Rhodie,Rheome,Rheinhardt,Rezai,Reynalds,Reyman,Reyez,Rewenko,Reville,Revello,Revelez,Reul,Resue,Restuccia,Replenski,Reon,Rentar,Rensberger,Rens,Rennaker,Renell,Remson,Rell,Relacion,Rekuc,Reker,Reitler,Reischl,Reints,Reinoehl,Reinart,Reimund,Reimold,Reikowsky,Reiger,Reifman,Reicks,Reichler,Reichhardt,Rehling,Regos,Regino,Regalbuto,Reffner,Reents,Reenders,Reeks,Reek,Reeck,Redmer,Redican,Reddoch,Reddig,Reddicks,Redbird,Rectenwald,Recek,Rebillard,Rebich,Rebeck,Reagon,Raziano,Raymore,Ravenel,Ravel,Rause,Rauschenbach,Rauer,Rauchwerger,Ratelle,Rasinski,Rasbury,Rardon,Rapson,Rapkin,Raoof,Rannells,Ranke,Rangitsch,Rangasammy,Randt,Ran,Ramser,Ramsaroop,Ramsahai,Ramrez,Rampley,Ramirec,Ramesh,Ralbovsky,Rakoczy,Rakoci,Rajwani,Rajaratnam,Raiden,Rahmani,Ragno,Raghunandan,Ragas,Ragar,Rafuse,Radvany,Rados,Radmacher,Radick,Radecki,Raczynski,Rachell,Qureshi,Quirin,Quire,Quintona,Quinnett,Quinalty,Quiambao,Quella,Quatraro,Quartararo,Qualle,Qin,Pytko,Pyer,Pyanowski,Puzio,Pushcar,Purviance,Purtlebaugh,Pupo,Pulte,Pulse,Pullom,Pullings,Pullano,Pulkkinen,Puliafico,Pulfrey,Pujols,Puhala,Puchalla,Pucciarelli,Prutzman,Prutt,Pruneau,Prucha,Provitt,Protin,Prose,Proco,Proa,Prisk,Prioletti,Priode,Prinkey,Princiotta,Prich,Pribnow,Prial,Preyer,Prestino,Pressimone,Preskitt,Preli,Preissler,Prehoda,Predovich,Precise,Prazenica,Prawdzik,Prast,Pozzobon,Pozos,Powles,Pov,Poullard,Pouch,Potucek,Postert,Posten,Posson,Posa,Portuondo,Porten,Porst,Poree,Pora,Poque,Popiolek,Poot,Poock,Pongkhamsing,Ponessa,Pone,Poncio,Polumbo,Pollutro,Pollet,Pollen,Poljak,Polemeni,Pokswinski,Poisel,Poette,Poelman,Pody,Podewils,Podaras,Pocius,Pobanz,Plympton,Ply,Plush,Plume,Pluff,Plues,Plue,Plona,Plexico,Plew,Pleiss,Pleil,Pleasanton,Plattsmier,Plathe,Plankey,Plahs,Plagge,Placker,Placha,Pizira,Piwowar,Piwetz,Pittelkow,Pitta,Pithan,Pitcherello,Pisciotti,Pipilas,Pintea,Pinta,Pinkstaff,Pinkos,Pinc,Pilotte,Pillo,Pihl,Pignotti,Piggs,Pietrzyk,Piermont,Pieczynski,Piechowski,Piech,Pickersgill,Picetti,Picciuto,Piccinini,Picarello,Picardo,Picado,Piantanida,Pianka,Pian,Phothirath,Phippard,Philman,Philipson,Philavanh,Phelts,Phanor,Phanco,Pflughoeft,Pflugh,Pfliger,Pfeister,Pfeifle,Peyre,Peyatt,Pettine,Pettett,Petru,Petronio,Petricka,Petrak,Petko,Petitto,Petersson,Pesnell,Peshek,Pesh,Pescador,Perze,Perteet,Pertee,Pert,Perschbacher,Perruzzi,Perrish,Perrigan,Perriello,Perr,Perozo,Perlich,Perking,Perkes,Perfater,Perce,Pepez,Peon,Penunuri,Penuel,Penso,Pennisi,Penkins,Penkalski,Pendon,Pellon,Pellissier,Pelino,Pel,Peick,Peguese,Peggs,Pefanis,Peeters,Peedin,Peduto,Pedulla,Pedrozo,Pedrotti,Pedroncelli,Pedrogo,Pedri,Pedregon,Pederzani,Pedde,Pecukonis,Peckler,Pecka,Pecha,Pecci,Peatman,Peals,Pazo,Paye,Pawlusiak,Pawlitschek,Pavlosky,Pavlo,Paveglio,Paulman,Paukstis,Pauk,Patts,Patter,Patriss,Patneaude,Paszek,Paswaters,Pastula,Pastuch,Pastel,Passy,Passarella,Pasquin,Pasqualetti,Pasqual,Pascuzzi,Pasceri,Parviainen,Parral,Parolini,Parmele,Parma,Parlavecchio,Parfitt,Parez,Pardieck,Pardew,Parda,Paraz,Parat,Papay,Paparello,Papaioannou,Paolello,Pansini,Panelli,Panell,Pander,Pancholi,Panaro,Panagiotopoul,Palomarez,Palmrose,Palmisciano,Palmese,Pallotto,Palleschi,Palk,Palhegyi,Palenzuela,Paleaae,Palczynski,Palakiko,Palaia,Paith,Pagonis,Pago,Pagliuca,Pagliari,Paganini,Padovani,Padfield,Padamadan,Pacquette,Paco,Packwood,Pachero,Pachar,Pacewicz,Paasch,Pa,Ozols,Ozga,Ozenne,Oxman,Overpeck,Overbeek,Overbee,Oulette,Otsu,Otremba,Otool,Otar,Otanicar,Osumi,Osucha,Ostrov,Osthoff,Ostertag,Ostergard,Ostaba,Ospital,Ososkie,Osofsky,Osisek,Oshinsky,Orzalli,Orwin,Ortwein,Ortuno,Orts,Ortell,Orpen,Ornelaz,Orewiler,Ores,Ordones,Opunui,Oppenlander,Opoien,Opalka,Ooley,Ontko,Ondrey,Omura,Omtiveros,Omland,Olup,Olthoff,Olsten,Ollila,Olivia,Olinsky,Olinick,Oleksa,Olejarz,Oldakowski,Okoronkwo,Okins,Ohmer,Ohlsson,Oherron,Oheron,Ohanian,Oganesian,Ogaldez,Oest,Oehlenschlage,Oedekerk,Odon,Odekirk,Ocran,Oconor,Obrzut,Obrist,Obringer,Oborny,Oblander,Obi,Oberley,Oberer,Obeng,Oatridge,Oajaca,Nypaver,Nuzzi,Nuzback,Nuxoll,Nussbaumer,Nurmi,Nuhn,Nugen,Nuara,Nquyen,Nozicka,Noxon,Nowick,Nowaczyk,Novielli,Novembre,November,Novas,Noun,Notto,Notowich,Norzagaray,Norway,Northover,Northcross,Norem,Nordmann,Nordenson,Nolet,Nojiri,Nohel,Noethiger,Nodd,Nitzel,Nita,Nisbit,Nina,Nikas,Nigon,Niglio,Nighswander,Nighbert,Niemietz,Niedzielski,Niederkorn,Niederhaus,Niederer,Nicometo,Nicolaides,Nickolich,Nguyn,Neyra,Neymeyer,Newmon,Newgent,Newbery,Nevala,Neuweg,Neuhoff,Neuhauser,Neubecker,Nettik,Netters,Nestingen,Nesspor,Nerad,Nenez,Neldon,Neizer,Neives,Neils,Neiger,Neidich,Neibert,Negroni,Neemann,Needle,Neeb,Nedry,Nedley,Neas,Naze,Nazaroff,Nayes,Nayar,Nattress,Natonabah,Nassr,Nasseri,Nassef,Naso,Narkier,Naret,Nardini,Nardecchia,Naragon,Naputi,Napierala,Nanny,Nanke,Namdar,Naji,Naidoo,Nahm,Nahas,Nagelschmidt,Naes,Naegeli,Nacol,Naclerio,Nachor,Nabozny,Nabarrete,Nab,Myrlie,Mykins,Muzio,Mutolo,Muta,Mustoe,Muster,Muske,Muschamp,Muscarello,Musacchio,Murzycki,Murrufo,Murnan,Muraski,Murany,Murano,Munzer,Munis,Munion,Mumby,Mumbower,Mulrain,Mullinex,Mullineaux,Mullennix,Mullahey,Mukhtar,Muina,Muha,Muehlman,Muccigrosso,Mrozoski,Mozier,Mow,Mova,Moustafa,Mousser,Mouse,Mousa,Mouritsen,Mourad,Mottet,Motten,Motamedi,Mostowy,Mostafavi,Mosiman,Moscone,Moscicki,Mosbrucker,Morva,Mortinez,Mortel,Morsey,Morrin,Morren,Morosco,Morledge,Morla,Morisky,Morishita,Morisey,Morgia,Moretta,Morera,Morenz,Mordue,Mordhorst,Mordaunt,Morber,Morawa,Moravick,Morarity,Mooty,Mooser,Moock,Moochler,Montoure,Montooth,Montonez,Montierth,Monticello,Monteverde,Monterrano,Montella,Montecillo,Monsrud,Monsma,Monserrat,Monrreal,Monro,Monetti,Mondok,Mondella,Moncion,Monaldi,Moltz,Molon,Mollicone,Molle,Moliterno,Molinere,Molinary,Molesworth,Moh,Mogush,Mogren,Moellers,Moeck,Modert,Mockbee,Mocher,Mochel,Moc,Moberley,Moan,Moallankamp,Miyose,Miyata,Miyashita,Miyagi,Mitsuda,Misumi,Missel,Miskelly,Misiaszek,Mirzadeh,Mirto,Mirsch,Mirles,Miolen,Minzel,Minutillo,Minugh,Mintzer,Minskey,Minnaert,Minkoff,Miniard,Mingledorff,Minas,Minaai,Milly,Millinor,Millie,Millerd,Millea,Milkey,Milham,Milfeld,Mileham,Milas,Milar,Milak,Mikulski,Mihara,Mihalek,Mihalchik,Mihal,Mignot,Mignano,Mighty,Miesse,Mierzwinski,Micthell,Mickus,Mickolick,Mickiewicz,Michlin,Michelena,Micha,Miccio,Micari,Mezzatesta,Mewbourn,Meuse,Meurin,Metzker,Mettling,Metting,Metters,Metropoulos,Metevia,Mesteth,Mesko,Mesi,Meserole,Mervyn,Mernin,Mermelstein,Merling,Merli,Merkowitz,Merklin,Merkerson,Merica,Merendino,Mercury,Meray,Meranto,Merancio,Mensik,Mense,Menoni,Mennie,Mengsteab,Menes,Mend,Mency,Memolo,Meltz,Meling,Melen,Melcer,Melamed,Mekee,Meiste,Meise,Meinhard,Meierotto,Mehok,Meharg,Meginnes,Meenach,Medicus,Mediano,Media,Medell,Mede,Meddaugh,Meconi,Mech,Mearse,Meardon,Mealor,Meadville,Meachen,Mcvicar,Mcsparin,Mcrorie,Mcrobbie,Mcoy,Mcowen,Mcnorton,Mcnertney,Mcnamer,Mcnail,Mcmanamon,Mcmain,Mclyman,Mcleland,Mckirgan,Mckew,Mckevitt,Mckercher,Mckensie,Mckeegan,Mckeane,Mckahan,Mcinture,Mcindoe,Mcilvenny,Mcillwain,Mciff,Mcgwin,Mcguff,Mcgrotty,Mcgrone,Mcgrant,Mcgoogan,Mcglon,Mcgloin,Mcgiveron,Mcghehey,Mcghay,Mcgavin,Mcgahen,Mcfann,Mcelwaine,Mcelduff,Mceachron,Mcdilda,Mcdermid,Mcdannold,Mcdale,Mcculough,Mccuien,Mccrumb,Mccrorey,Mccreless,Mccravy,Mccourtney,Mccorrison,Mccorkell,Mccorey,Mcconney,Mcconnaughhay,Mccollester,Mcclurkan,Mccluer,Mccloudy,Mcclenaghan,Mcclave,Mcclarnon,Mcclarin,Mcclaney,Mcclanan,Mcclair,Mcchristion,Mccaskell,Mccartha,Mccarl,Mccamant,Mccalmont,Mccalman,Mccaine,Mccahill,Mccague,Mcbrown,Mcanany,Mcalvain,Mazzurco,Mazuc,Mazo,Mazingo,Mawhorter,Mavro,Mavraganis,Mautner,Mautino,Mauceli,Matzinger,Maturi,Matturro,Mattlin,Mattheis,Matsuoka,Matsuki,Matro,Matlack,Matice,Mathson,Matheu,Mathenia,Math,Matejka,Mateja,Matanane,Masztal,Mastropaolo,Mastromarino,Mastrolia,Mastel,Massy,Massoud,Massimino,Maslanka,Masini,Mascioli,Marzec,Marvier,Maruyama,Marusarz,Marum,Martorella,Martire,Martinkus,Martinas,Martiez,Marthe,Marteney,Marschall,Marruffo,Marrazzo,Marples,Marohl,Marn,Marlborough,Markunas,Marki,Marjan,Maritnez,Marinkovic,Marineau,Margaitis,Marentis,Mare,Marcou,Marciel,Marci,Marchiori,Marchello,Marchell,Marcelle,Marcelin,Marales,Mapel,Manzanarez,Mantilia,Mansmith,Manon,Mannschreck,Mannick,Mankiewicz,Mankel,Manila,Manifold,Manha,Mangrich,Mangiapane,Mangiamele,Manera,Mandes,Mandella,Mandelik,Mandaloniz,Mand,Mancusi,Mancine,Mana,Mamula,Mammoccio,Malzhan,Malzahn,Malsom,Maloon,Malnar,Mallone,Mallinson,Mallie,Mallek,Malle,Malinoski,Malinconico,Malicoat,Malicdem,Malhi,Malfatti,Malandrino,Malamud,Malakowsky,Makovec,Makey,Majercik,Majer,Majamay,Maisenbacher,Mainey,Mailey,Mailander,Mahuna,Mahomes,Mahoe,Mahnken,Maheras,Mahaxay,Mahana,Maham,Magnia,Magni,Magnanti,Magliano,Magliacane,Maglaughlin,Magistrale,Magierski,Maggini,Magano,Mafnas,Madren,Mador,Maderios,Madena,Maddron,Madan,Madalinski,Macmanus,Maclead,Mackowski,Mackinaw,Mackessy,Mackerl,Macker,Macivor,Machold,Machain,Macedonio,Macdiarmid,Macchiaroli,Macbean,Macayan,Macari,Mabin,Mabel,Lyter,Lyster,Lysne,Lynskey,Lyness,Lyndaker,Lymaster,Lykke,Lyell,Luxmore,Luttmer,Lutgen,Lusignan,Lupold,Lungstrom,Lunford,Lundeby,Lumbard,Lule,Lukaskiewicz,Luinstra,Luevand,Luer,Lueking,Luehrs,Luecking,Ludvigson,Ludgood,Lucich,Luchetti,Lubman,Lubic,Lozito,Lowhorn,Lowd,Loverich,Loveman,Lovas,Lovaas,Louvier,Louthen,Loury,Loukanis,Loughner,Loughnane,Louato,Lotshaw,Lother,Lothamer,Loter,Losinski,Losinger,Loshek,Losecco,Lortie,Lorin,Lorent,Lorello,Loras,Lorah,Lopau,Loosen,Lontz,Longpre,Longie,Loncaric,Lombrana,Lomba,Lohrey,Lohoff,Logghe,Loges,Lofstead,Lofft,Loertscher,Loeper,Loeblein,Lodato,Lochen,Lobbins,Lobban,Lizarrago,Livigni,Livernash,Liukko,Littich,Litterer,Littau,Litchmore,Lisy,Lissy,Lishman,Lischak,Lirag,Liptow,Lins,Linkhart,Linkert,Lingren,Lingelbach,Lingel,Lingad,Linet,Linegar,Linebrink,Lindroth,Lindeland,Lindboe,Linardi,Linard,Ligman,Liggans,Lifland,Liff,Lieuallen,Liesveld,Liess,Lienhard,Liehr,Liedy,Liedke,Liebau,Lidtke,Lidstrom,Licano,Libra,Leys,Leymeister,Lewerke,Lewand,Levoci,Leviton,Levien,Leveston,Leverenz,Levere,Levangie,Leuy,Leukuma,Lettman,Letran,Letlow,Lethco,Letersky,Lestronge,Lesso,Lessey,Leshem,Lerud,Leps,Leonesio,Leones,Lento,Lente,Lennertz,Lenior,Lenhard,Lenfest,Lene,Lendrum,Lempicki,Lemonier,Lemle,Lemkau,Lemings,Lem,Lelli,Lekas,Leitten,Leitheiser,Leino,Leiner,Leinenbach,Leidy,Leidich,Leid,Leich,Lehnhoff,Leh,Legum,Legoullon,Legeyt,Legalley,Legace,Lefton,Lefthand,Leforge,Lefore,Lefleur,Leerar,Leef,Leed,Ledl,Leddon,Ledain,Leckie,Lecates,Lebeouf,Leben,Lebeck,Lebeaux,Leban,Leaverton,Learman,Leardi,Leamy,Lazare,Lazarczyk,Layssard,Layson,Layhew,Layel,Laychock,Lawernce,Lavzon,Lavalla,Lauterborn,Laut,Lauseng,Lausen,Laurino,Lauri,Laurenzano,Laurenza,Laundry,Laumbach,Lauinger,Lauenroth,Latzke,Latulipe,Lattig,Latronica,Latouf,Latko,Latiker,Lathern,Laterza,Latchaw,Lataquin,Lasure,Lashomb,Lasell,Lasasso,Lartey,Larriva,Laro,Lardner,Lardieri,Laprarie,Lapping,Lapitan,Lapeyrolerie,Lapar,Lanzetta,Lantis,Lanka,Lani,Langshaw,Langmyer,Langin,Langerman,Langeland,Langbein,Landro,Landrian,Landmesser,Landmann,Landfair,Landesberg,Lanciotti,Lamprey,Lampey,Lamos,Lamora,Lamoine,Lamfers,Lambka,Lamance,Lamana,Laliotis,Lajza,Lajaunie,Lainson,Laher,Lahar,Lagrotta,Lagrant,Lagraize,Lagnese,Lafrazia,Lafountaine,Laflin,Lafaso,Lafarga,Ladage,Lacsamana,Lacrosse,Lacrone,Lachowski,Labruyere,Labrake,Labossiere,Laba,Laack,Kyzar,Kynard,Kwek,Kuzmin,Kuttner,Kusiak,Kuser,Kuse,Kurtzer,Kurtzeborn,Kurpinski,Kurohara,Kuroda,Kurnik,Kurihara,Kurdziel,Kurban,Kuras,Kupper,Kupferer,Kupec,Kunzelman,Kunkler,Kunin,Kunesh,Kumro,Kumpf,Kulon,Kulka,Kukucka,Kuk,Kuhse,Kuhls,Kuhlo,Kuhar,Kuerbitz,Kuenzi,Kuehneman,Kudron,Kuczenski,Kuchle,Kuchenmeister,Kuchenbecker,Kucan,Kubu,Kubsch,Kubiszewski,Kubish,Kubicz,Kubick,Kubaska,Kuarez,Ksiazek,Kshywonis,Krzykowski,Krzak,Krysl,Kruzewski,Kruzan,Krumrine,Krumins,Krucker,Kroupa,Krough,Krotz,Kronstedt,Kromrey,Krogstad,Krogmann,Kroeze,Kroetz,Kroc,Kristianson,Kristen,Kriser,Krips,Kringas,Kriete,Kreuter,Kretschmann,Kresha,Kreidel,Kregger,Kreatsoulas,Kratochwil,Krasovec,Krase,Krapf,Kranawetter,Krajnik,Kozubal,Koyanagi,Kowalkowski,Kovarovic,Kovalcin,Kou,Kotzen,Kotnik,Kostelecky,Kostek,Kostecki,Kostal,Kosse,Koslowski,Koskie,Kosicki,Koshar,Kosek,Kortright,Korpal,Kornhauser,Kormos,Korinek,Korgie,Kordsmeier,Kordish,Koral,Kops,Kopps,Kopperud,Koppang,Kopfer,Kopet,Kook,Konno,Konik,Konek,Konefal,Komm,Komis,Komer,Komarek,Kolsrud,Kolp,Kolopajlo,Kollmorgen,Kolis,Kolesnik,Koles,Kolding,Kohs,Kohlhoff,Kohatsu,Kohara,Koetter,Koestler,Koepsel,Koeppe,Koenigsman,Koelewyn,Koe,Kodadek,Koci,Kochler,Kocab,Kobylinski,Kobryn,Koberg,Knower,Knollenberg,Knock,Knizley,Kniss,Knies,Knezovich,Knesek,Knepel,Knehans,Kneeskern,Knaust,Knapke,Kmet,Kluz,Klukas,Kloska,Klopf,Klinglesmith,Klinekole,Klimes,Kliment,Klimaszewski,Klepfer,Klepacki,Klepac,Klemash,Kleinkopf,Kleinknecht,Kleimola,Kleiboeker,Klei,Klehn,Klegin,Klavuhn,Klauer,Klasinski,Klasing,Klarr,Klapec,Klaass,Klaameyer,Kjelland,Kiyuna,Kitching,Kistle,Kissi,Kishi,Kirvin,Kirtner,Kirovac,Kirnon,Kirkby,Kiritsy,Kirchgesler,Kippley,Kipping,Kinzig,Kins,Kinnare,Kinna,Kingcade,Kinatyan,Kimme,Kimbrow,Kimbril,Kilzer,Kiltz,Killmer,Killibrew,Killeagle,Kilger,Kiles,Kievit,Kientzy,Kielty,Kiekbusch,Kiehne,Kiefert,Khou,Khiev,Khat,Khare,Keywan,Keyt,Kevin,Keville,Kevern,Keuler,Ketola,Ketelaar,Kertis,Kerson,Kernen,Kerkman,Kerker,Keogan,Kenwood,Kenne,Kenaan,Kempler,Kempisty,Kempfer,Kempen,Kemmerlin,Kelter,Kelman,Kellie,Keliihoomalu,Keleman,Kekiwi,Keiswetter,Keiss,Keilty,Keidong,Kegel,Keets,Keeneth,Keefner,Kedzierski,Kebort,Keate,Keat,Kazmorck,Kazi,Kaz,Kawachi,Kaushiva,Kauk,Katzner,Katzmark,Katzen,Katsuda,Kats,Kater,Katen,Kasting,Kasserman,Kassay,Kassabian,Kasprowicz,Kasperek,Kasowski,Kasmir,Kaska,Kasik,Kascak,Karth,Karsnak,Karshner,Karsh,Karmel,Karlstad,Karley,Karins,Karimi,Karcich,Karch,Karapetyan,Karakas,Kapsalis,Kappeler,Kapke,Kaperonis,Kapahu,Kanthak,Kansky,Kansas,Kanoy,Kanno,Kannady,Kandarian,Kanai,Kanae,Kanaan,Kamphoefner,Kammler,Kaminetzky,Kaminaka,Kamienski,Kamaunu,Kamakea,Kama,Kaltefleiter,Kaloustian,Kaloi,Kallmeyer,Kalisch,Kalinski,Kaliher,Kalgren,Kalfas,Kales,Kalafatis,Kagle,Kadish,Kachermeyer,Kabina,Kaawa,Kaaua,Kaatz,Juvera,Jutte,Justen,Jusko,Juriga,Jure,Jungquist,Jungbluth,Juneja,Juncaj,Juliet,Juhas,Juenger,Juell,Jucean,Jubinville,Jovich,Jorres,Joris,Jore,Jonhson,Joneson,Jonassen,Jolissaint,Jointer,Johnny,Johengen,Johar,Joh,Joern,Jodway,Jobs,Joanette,Jirik,Jirasek,Jipson,Jinkerson,Jinkens,Jiminian,Jimeno,Jiau,Jevnikar,Jessel,Jerauld,Jephson,Jentzen,Jenkerson,Jenista,Jenifer,Jemmett,Jelovich,Jehlicka,Jeffris,Jedziniak,Jeantet,Jeanclaude,Jayme,Javor,Javaux,Jaurigue,Jaureguy,Jarvinen,Jarocki,Japp,Janszen,Jansons,Jans,Jankauskas,Janka,Janhunen,Janeczek,Jandrin,Janczewski,Janack,Jamir,Jakuboski,Jakubik,Jakubek,Jahnel,Jageman,Jaenicke,Jacquem,Jacquay,Jaconski,Jacobellis,Jablon,Iyo,Ivancevic,Iurato,Iulianetti,Itri,Issler,Isla,Isip,Ishmon,Ishizu,Isgrigg,Iseri,Iseli,Iseley,Isbrecht,Isassi,Isaiah,Irsik,Irias,Inzana,Intveld,Intrieri,Interdonato,Instasi,Inscho,Ingwell,Ingebretsen,Inga,Inda,Incle,Inabinett,Imus,Immordino,Imbesi,Imbach,Illsley,Illig,Ill,Ignowski,Idler,Idleburg,Ideue,Ibara,Ianuzzi,Ianniello,Iacovone,Hyter,Hyles,Hyle,Hykes,Hyams,Huxley,Hutch,Hustead,Huscher,Hurtz,Hurse,Hurren,Huret,Huotari,Huntress,Hunting,Hunstiger,Hunking,Humpries,Humbles,Hum,Hulvey,Hulcy,Huizinga,Huhman,Huhammad,Hufty,Huesso,Hueftle,Huebschman,Huebert,Hue,Hudmon,Huberman,Hubbartt,Hubach,Hsueh,Hrycenko,Hrabal,Hoxit,Howsare,Howman,Howitt,Howerter,Houlton,Houis,Hottman,Hotovec,Hostin,Hoshall,Hosfeld,Hoschek,Horwath,Horsely,Horsburgh,Horovitz,Hornstrom,Hornbarger,Horkley,Horka,Horey,Horeth,Hordyk,Horack,Hoppin,Hoppel,Hopfensperger,Hooey,Hooe,Honhart,Honga,Honeck,Homs,Hommell,Homles,Homen,Home,Holzner,Holzheimer,Holzem,Holsopple,Holsman,Holowell,Holliway,Holizna,Holesovsky,Holderbaum,Holbach,Holan,Hoit,Hoist,Hohenbrink,Hoger,Hofmans,Hofheimer,Hoffhines,Hofbauer,Hoesing,Hoeschen,Hoerter,Hoepfner,Hoemann,Hodgeman,Hockersmith,Hochadel,Hobock,Hobel,Hluska,Hlavac,Hisrich,Hirsbrunner,Hirpara,Hire,Hinners,Hindbaugh,Himenez,Hilles,Hilleary,Hillanbrand,Hillan,Hildner,Hilding,Hilderbrandt,Hiland,Hightree,Highnote,Highberger,Higgason,Higaneda,Hidinger,Hickock,Heymann,Heusinkveld,Heusel,Heuring,Hettler,Hesseltine,Hesselink,Hesford,Herth,Herskovits,Herschell,Heroman,Hernton,Herne,Hernandaz,Hermez,Hermanstorfer,Herling,Herke,Herimann,Heriford,Hergenrader,Herforth,Herdes,Hercher,Herceg,Herbick,Hentze,Henniger,Henney,Henness,Hennegan,Henkes,Heneisen,Henderickson,Henard,Hemrick,Hemric,Hempton,Hemp,Hemme,Hemeon,Hembry,Hembrough,Hembrey,Helstad,Helmus,Hellings,Hellgren,Helie,Helgert,Helgerman,Helger,Helgason,Helfinstine,Helfgott,Helfenstein,Heldreth,Helander,Heitzmann,Heisserer,Heising,Heisel,Heinold,Heinis,Heinemeyer,Heimark,Heiliger,Heiderman,Heidenescher,Heidebrink,Hehir,Hegan,Heersink,Heep,Hedquist,Heckford,Hebets,Heberly,Heberle,Hebenstreit,Heavilin,Heartz,Heaphy,Heany,Hazer,Hazelgrove,Haynsworth,Haydock,Hawelu,Havnen,Havely,Hauss,Hausam,Haumesser,Hauman,Haulk,Hauley,Haubrick,Haubner,Hattman,Hatman,Hatherly,Hatchcock,Hastert,Hassenplug,Hasko,Haser,Haselhuhn,Hasberry,Has,Harthorne,Harthcock,Harriett,Harouff,Harootunian,Harkavy,Harell,Hardridge,Hardacre,Harborth,Haraguchi,Haptonstall,Happenny,Hantman,Hanses,Hannemann,Hannay,Hannafin,Hanle,Hangartner,Handerson,Hanberg,Hamzik,Hamstra,Hammans,Hamano,Halsema,Halonen,Halim,Halek,Haleamau,Halama,Hakeem,Hainley,Hagley,Hagist,Hagie,Haggberg,Haggan,Hagele,Hafenstein,Hafemeister,Hady,Hadges,Hadef,Hackey,Hach,Habbyshaw,Haaga,Haab,Gysin,Gwirtz,Guzzio,Guzzardo,Guzma,Gutzmann,Gutta,Gutermuth,Guterman,Gutenberger,Gurganious,Gural,Guppy,Gunzalez,Guntert,Gums,Gumb,Gullotta,Gullixson,Gulling,Gullace,Guler,Gulbransen,Guitian,Guinta,Guinasso,Guilboard,Guichard,Gugliotta,Guglielmina,Guggenheim,Gugel,Guetierrez,Guethle,Gueth,Guerrido,Gueits,Gudenkauf,Gucciardo,Guarnera,Guadagnolo,Gsell,Gschwend,Grush,Grupp,Grundmann,Grunau,Grueninger,Gruca,Groupe,Grotzinger,Grotheer,Grossmeyer,Grossetete,Grossack,Gromer,Groenke,Groening,Groehler,Groebner,Grochmal,Groby,Grobes,Gritman,Griswould,Grisset,Grime,Griffo,Griesinger,Greuel,Greth,Gressman,Gremel,Greiwe,Greis,Greil,Greife,Greider,Grefrath,Greff,Greenmyer,Greany,Grazioplene,Gravlin,Gravito,Gravert,Grav,Grater,Grap,Granzin,Grannum,Granlund,Grando,Grammes,Gramley,Grambo,Grala,Grahl,Gradwohl,Gradillas,Gradert,Graciana,Grabner,Grabinski,Grabinger,Grabel,Graaf,Gouzy,Gouger,Gottron,Gottardo,Gothro,Gosso,Gossi,Gorringe,Gorneault,Gorn,Gormly,Gorenflo,Goral,Gopen,Goosey,Goodnoe,Goodie,Goodhile,Goodfield,Goodard,Gonneville,Gongalez,Gondola,Gompf,Gommer,Gollehon,Golie,Golebiewski,Goldinger,Goldhaber,Goldfeder,Goldbaum,Golaszewski,Gojcaj,Gogerty,Goettsche,Goethe,Goessl,Godson,Godbe,Gochanour,Gocha,Gnau,Gnatek,Glud,Glorius,Glordano,Gloodt,Glod,Glinka,Glime,Gleim,Gleicher,Glazewski,Glay,Glasford,Glascott,Glanzman,Glahn,Gladish,Gjerde,Gizinski,Gitzen,Girsh,Girote,Girman,Giovino,Giovanini,Giorgini,Ginty,Ginsky,Ginnings,Gingues,Gingg,Ginger,Giner,Gimm,Gilruth,Gillund,Gillenwaters,Gilday,Gilcrest,Gilcher,Gilani,Gigstad,Giernoth,Gienger,Gidaro,Giczewski,Gibas,Giarratano,Giantonio,Giannitti,Giannetti,Giampapa,Giacopelli,Giacone,Giacomelli,Gherman,Ghera,Ghan,Gevorkyan,Gettig,Getchman,Gesinski,Gerundo,Gershenson,Gerraro,Gernert,Germundson,Gerloff,Gergel,Gerdeman,Gerdel,Geraldo,Geraldes,Georgopoulos,Georgis,Georgevic,Georgeson,Genzel,Genung,Gentzler,Gentili,Genich,Gelzinis,Geiken,Geidner,Geidl,Gehrer,Geho,Gehlbach,Geeding,Gedye,Geberth,Geathers,Gearan,Gealy,Gazzola,Gazella,Gawrych,Gavidia,Gautam,Gaumont,Gaudenzi,Gaucher,Gaubert,Gattas,Gatley,Gaters,Gatchalian,Gassel,Gasman,Gaslin,Garufi,Garriepy,Garrell,Garrand,Garnto,Garns,Garno,Garlinger,Garivay,Garhart,Gardino,Garcea,Garbin,Garaventa,Garavaglia,Garahan,Garafano,Garacia,Gapen,Ganiron,Ganino,Ganim,Gangwish,Gange,Ganes,Gandia,Gandeza,Gamlin,Gamelin,Galway,Galow,Gallob,Gallishaw,Gallinaro,Gallicchio,Gallese,Gallero,Gallegas,Galeoto,Galeas,Galbreth,Galbavy,Galavis,Galam,Gajate,Gair,Gagney,Gagel,Gagarin,Gaete,Gaetani,Gadbaw,Gack,Gabrysch,Gabardi,Fyksen,Futrelle,Furl,Furches,Furbeck,Funnye,Funicello,Fumagalli,Fullford,Fulginiti,Fulenwider,Fulena,Fugler,Fuerstenberge,Fuentas,Fucillo,Fuapau,Fryberger,Frusciante,Fruehling,Fromberg,Froeschle,Frock,Fritzgerald,Fritcher,Frisbey,Frihart,Frieling,Friedler,Frie,Fridell,Freuden,Freud,Frett,Frend,Freiling,Freije,Freie,Freidman,Freibert,Fregozo,Freehling,Fredo,Fredlund,Fredley,Frede,Freberg,Frayre,Fraunfelter,Frascella,Franssen,Frankowski,Francour,Francom,Francillon,Francey,Fraioli,Fracassa,Fostervold,Fossey,Foshay,Foscue,Forsell,Forrister,Forren,Fornicola,Fornes,Forgie,Forbs,Foppe,Foore,Fontecchio,Fongeallaz,Follick,Folio,Foder,Flyzik,Fluhman,Fluet,Flow,Floto,Floros,Floriano,Floren,Floran,Floerke,Flitcroft,Flipp,Flintroy,Fleschner,Flenner,Fleeting,Flamio,Flaggs,Flagge,Fjeseth,Fithen,Fissell,Fischman,Fire,Fioranelli,Finseth,Finocchiaro,Finerty,Fineman,Finchman,Filyaw,Filipovich,Filas,Figler,Figge,Fiers,Fiereck,Fidell,Ficorilli,Fico,Ficks,Fickle,Fialkowski,Feyen,Fetz,Fetsko,Ferullo,Fertitta,Ferriman,Ferrebee,Ferrand,Ferrales,Fernelius,Fernberg,Ferioli,Fergoson,Ferenc,Fereira,Fequiere,Fennema,Fenelus,Fenelon,Feneis,Femrite,Feltenberger,Felsenthal,Fels,Felmet,Felgenhauer,Felarca,Feiteira,Feirer,Feinen,Feigenbaum,Fehlinger,Federle,Fecko,Feavel,Featheringham,Fayer,Faxon,Faurrieta,Faull,Fatone,Fatigate,Fasy,Fasula,Fassio,Fass,Farwick,Farrill,Farquer,Farmwald,Fantozzi,Fanoele,Fannell,Fanizza,Fandrich,Fallo,Fallago,Faist,Faines,Faine,Fahrendorff,Faggard,Faessler,Fadale,Fabrizi,Eychaner,Exon,Exilus,Ewig,Evitts,Evinger,Everheart,Everhardt,Eveleth,Eveleigh,Eurbin,Esworthy,Estus,Estock,Esterbrook,Essler,Esque,Espina,Espalin,Eschenburg,Eschberger,Esbenshade,Ertley,Erstad,Erp,Eroman,Erno,Ermatinger,Erkkila,Erkela,Eriquez,Erin,Ericks,Erdahl,Ercolani,Equils,Eppinette,Eon,Enter,Enke,Engley,Englebrecht,Engleberg,Englar,Engelstad,Engelsman,Engellant,Ence,Emslie,Empie,Emoto,Emons,Emley,Emile,Embly,Embler,Emanuelson,Emal,Elzinga,Elwer,Elvis,Elvington,Elshere,Elmquist,Ellout,Ellifritz,Ellerd,Ellerbusch,Elizando,Elizabeth,Elick,Eliasen,Elgert,Elger,Elena,Elbers,Ekstein,Ekmark,Eiser,Einck,Eimers,Eilert,Eidinger,Eicke,Ehsan,Ehn,Egleton,Egel,Effner,Ednilao,Edner,Edmons,Edmister,Edmison,Edlow,Edholm,Edgeman,Edgcomb,Edell,Edelblute,Eclarinal,Eckroad,Echave,Ebesu,Eberwein,Ebeid,Ebe,Ebbing,Eastlund,Eary,Earps,Dzuro,Dziuban,Dysinger,Dyner,Dymek,Dyll,Dyl,Dydell,Dwelle,Dwan,Duvernois,Dutson,Dutro,Dutchover,Dusky,Duskey,Dusik,Dushkin,Dushane,Durrani,Duroseau,Durnford,Durk,Durepo,Duranceau,Duprat,Duplechin,Duperry,Dunscomb,Dunkleberger,Dung,Dunegan,Dundlow,Dumpson,Dumphy,Dumpert,Dumesnil,Dullum,Duldulao,Dular,Dukart,Duhan,Dugdale,Dugat,Duffney,Duesing,Duenow,Duce,Dubson,Drzewicki,Druetta,Drube,Drozdenko,Drop,Drohan,Drivers,Drinski,Driever,Drewer,Dressen,Drehmer,Drawe,Drapkin,Draney,Drahota,Dowers,Dowdall,Dovenbarger,Dousay,Douin,Doughan,Doucett,Douce,Dorshimer,Dorsaint,Dorries,Dorosky,Dorl,Dorich,Dorenfeld,Dorcelus,Dool,Donoso,Donnick,Donnely,Donart,Donalds,Donaghey,Donaghe,Dominges,Domebo,Dollings,Dolejsi,Doggette,Doell,Dockwiller,Dockal,Dobosh,Dobis,Dobiesz,Dluhy,Dixons,Divin,Diventura,Divenere,Divelbiss,Dittrick,Ditommaso,Dirosa,Dircks,Diogo,Diodonet,Dinning,Dininno,Dimodica,Dimitroff,Diminno,Dimassimo,Dillie,Dilan,Digsby,Digrande,Digmann,Digirolomo,Digian,Digiacinto,Dietzen,Dietlin,Dietert,Diersen,Dienst,Dieffenbach,Dicorcia,Dickhaut,Diberardino,Diab,Dhein,Dhar,Dhamer,Dezan,Dez,Dewispelaere,Dewhirst,Devonish,Devincenzo,Devillez,Devany,Devalcourt,Deubler,Dettori,Detone,Detommaso,Detoma,Desue,Destree,Destephen,Desso,Desselle,Desimoni,Desadier,Derham,Derfler,Dercole,Derasmo,Depugh,Deporter,Depolito,Depa,Deninno,Deni,Denenberg,Denaro,Denardis,Demry,Demro,Demmel,Demme,Demiel,Demeritte,Demarzio,Demaline,Demaine,Deluco,Delton,Delsordo,Delosa,Delongis,Delois,Deloff,Delmuro,Delmoro,Delmonaco,Delmage,Dellen,Dellaripa,Dellamore,Delhierro,Delfuente,Deleppo,Delemos,Delea,Delcarmen,Delaura,Delanuez,Delang,Delamarter,Delamare,Delage,Delacuesta,Dekorte,Dekenipp,Dekany,Deinhardt,Deily,Deierlein,Degravelle,Deglow,Degler,Degiulio,Defoore,Defonce,Deflorio,Defiore,Defilippi,Deed,Dedeke,Dedecker,Dedaj,Decost,Decillis,Dechellis,Dechaine,Decarr,Decaprio,Debutiaco,Debski,Debry,Debruhl,Debouse,Deblase,Debey,Debenedetti,Debacker,Deang,Deandrade,Deadmond,Deacy,Daykin,Dayhuff,Dayal,Davion,Davidsen,Dautremont,Daughrity,Daubs,Datwyler,Datko,Dasmann,Daruszka,Darugar,Darroch,Daro,Darkis,Daricek,Daras,Dar,Dapoz,Dapinto,Danuser,Danoff,Dankmeyer,Danesi,Danesh,Daneker,Dammen,Damien,Damberger,Dalmoro,Dallmier,Daller,Dalka,Daliva,Dahline,Dahlhauser,Daguerre,Dagrella,Dagraca,Dagesse,Dage,Daehn,Dado,Dabbraccio,Dabato,Czolba,Czepiel,Czelusniak,Czechowski,Czarny,Czar,Czapski,Cywinski,Cyran,Cypret,Cwiek,Cuzzort,Cuzzi,Cutty,Cutrone,Cuthrell,Cuthill,Cutbirth,Custeau,Cushingberry,Curvey,Curson,Currell,Curly,Curll,Curdy,Curcuru,Cupstid,Cuoco,Culverson,Culnane,Culliver,Cullivan,Culleton,Cuddeback,Cuckler,Cubillo,Cubias,Cua,Cryar,Crutsinger,Crusan,Crupe,Crummie,Cruice,Cruea,Crowthers,Crowers,Crowdis,Crovo,Croson,Crosno,Crosdale,Cronwell,Cronon,Crocetti,Crnich,Cristal,Crisson,Crismond,Crighton,Cridland,Crickard,Creten,Cretella,Crespino,Cremins,Cremers,Creehan,Creecy,Credell,Cranney,Cranker,Craker,Craffey,Cozzy,Coyazo,Coxum,Cowdin,Covino,Coven,Courtenay,Course,Courier,Courchene,Coup,Couley,Couchenour,Cotugno,Cottongim,Cotti,Cotillo,Costine,Costain,Cosmo,Coslan,Cose,Coryea,Cortwright,Corsoro,Corrente,Correl,Cornford,Corneluis,Cornelious,Corneau,Corne,Corkins,Corippo,Corgiat,Coreil,Cordwell,Cordovano,Cordill,Cordano,Corazza,Coran,Coppess,Coonrad,Coonfare,Coomber,Cooksley,Cookis,Coodey,Contrino,Contee,Consorti,Console,Conorich,Conole,Connoly,Connley,Connington,Connie,Conness,Conly,Conkright,Coner,Conchas,Comrie,Compston,Compagno,Comnick,Commiskey,Commer,Comiso,Comish,Comden,Colondres,Collica,Colleen,Colle,Collaer,Colinger,Colford,Colao,Colanero,Cohens,Cofresi,Coerver,Cockriel,Cockran,Cockerell,Cobham,Cobert,Cobern,Cobell,Clunie,Clubs,Clubbs,Cloutman,Clise,Clippinger,Clerkley,Cler,Clemmens,Clemen,Cleare,Cleamons,Claycamp,Clawges,Claverie,Clarkston,Clarity,Clantz,Clakley,Clain,Cizek,Ciuffreda,Citrone,Ciraco,Cinotto,Cini,Cinadr,Cilento,Cilano,Cihon,Ciganek,Cieslinski,Cicoria,Cicco,Cibula,Ciarrocchi,Ciak,Ciafardoni,Chubbs,Chrzan,Christophel,Christoph,Christoforou,Christel,Christan,Chreene,Chrabaszcz,Chrabasz,Chowhan,Choules,Chorney,Chorley,Cholico,Cholewinski,Cholakyan,Chojnowski,Chlebek,Chittam,Chiszar,Chisam,Chirafisi,Chiprean,Chinetti,Chimes,Chiera,Chicon,Chiarelli,Chiaravalle,Chiappetta,Chesner,Cheser,Chesbrough,Cherubino,Cherrette,Cherpak,Chelf,Cheesebrough,Cheeney,Cheely,Chean,Cheak,Chavana,Chauvette,Chatt,Chasser,Chaskey,Charriez,Chappie,Chappelear,Chapparo,Chapek,Chanoine,Chandley,Challenger,Challberg,Challacombe,Chaleun,Chainey,Chaffey,Cetta,Cerza,Cervenak,Certosimo,Cerruti,Cerqueira,Cernohous,Cereceres,Ceovantes,Ceo,Centrich,Centore,Cellucci,Ceglinski,Ceconi,Cecilio,Cecchinato,Cecchi,Cazorla,Cayne,Cayabyab,Cavill,Cavicchia,Cavez,Cavener,Cavasos,Cavaness,Cavalcante,Caulk,Caudel,Cattano,Catrett,Catlow,Catella,Cataquet,Catalino,Cataline,Catalanotto,Catalanatto,Cata,Castenanos,Castelo,Cassiday,Casparian,Casillo,Casewell,Casarrubias,Casalman,Casal,Carvalno,Carskadon,Carrus,Carrison,Carriker,Carrazco,Carratala,Carpanini,Carovski,Caroli,Carne,Carmella,Carlis,Carfagno,Carethers,Carella,Cardonia,Cardno,Carda,Carcieri,Carcano,Carcana,Carboneau,Carbon,Caravantes,Carattini,Caramanica,Capriola,Cappelluti,Capossela,Caponi,Caperon,Caper,Capati,Cantv,Cantore,Cantell,Cantatore,Cantarella,Cantadore,Canslor,Canonico,Cannonier,Cannone,Cannavo,Cannatella,Cangiano,Campoli,Campellone,Campean,Campanile,Camera,Camcam,Cambel,Calta,Callsen,Callarman,Calicott,Calhaun,Calegari,Calco,Calciano,Calabretta,Cake,Cairone,Cahela,Cagliostro,Caflisch,Cafferky,Caetano,Cadice,Caddle,Cadarette,Cackowski,Caccia,Cabrena,Cabotaje,Caborn,Caberto,Bystrom,Byndon,Buzek,Buysse,Bux,Buttrick,Buttaro,Butscher,Butsch,Butor,Butman,Buteux,Butchee,But,Bustard,Busta,Bussy,Busson,Bussing,Bussa,Busi,Buseman,Buschner,Buscaglia,Burttram,Burth,Bursch,Burnsworth,Burland,Burkowski,Burglin,Burgdorfer,Burdman,Burau,Buran,Burakowski,Buquet,Buonomo,Buntyn,Bungo,Bunche,Bunal,Bult,Bulliner,Bullaro,Bulkeley,Bulcao,Bula,Buisson,Buissereth,Bugni,Buetow,Buesgens,Budziszewski,Budinich,Buddington,Buchtel,Buchli,Buchert,Buchar,Buben,Brzuchalski,Brummell,Brull,Brudnicki,Brucz,Bruchman,Brubach,Brownwood,Browen,Browe,Brossett,Brosco,Brookshear,Brookfield,Bronstad,Bronsky,Bronaugh,Bron,Brohawn,Brogna,Brodzik,Brodsho,Brodowski,Brodnicki,Brodell,Brod,Brockney,Broas,Broadrick,Briz,Britschgi,Brint,Brinich,Bringard,Brindamour,Brincat,Brimfield,Brillant,Brilhante,Brihon,Brignoni,Brightful,Briggman,Bried,Brickle,Brickel,Brezeale,Brewen,Breutzman,Bretado,Brester,Bresko,Brennon,Brennaman,Breniser,Brendon,Brems,Breisch,Breidenstein,Brechtel,Brea,Brazington,Brazen,Brayer,Brawer,Bravata,Braune,Braunbeck,Braue,Braucht,Braseth,Brantly,Branter,Branski,Brandler,Bramham,Brahney,Bradac,Brackley,Brackey,Brackemyre,Brach,Boyarsky,Bowlan,Bowhall,Bowdre,Bovie,Bouyea,Boustead,Bourgeault,Bounthapanya,Boultinghouse,Bouillon,Boudrie,Boudinot,Bottgenbach,Bottari,Botos,Bothof,Botha,Bosten,Bostelmann,Bossley,Bossick,Bossen,Bosquet,Boscio,Bosche,Bosa,Borski,Borsh,Borowik,Borom,Borke,Borgerding,Borgatti,Bordwine,Booser,Bookbinder,Bookard,Boock,Bonte,Bonomi,Bonning,Bonito,Bonillas,Bondura,Bombich,Boltinghouse,Bollozos,Bolliger,Bollie,Bolka,Bolitho,Boldenow,Bolch,Bolay,Boissoneault,Boisjolie,Boisclair,Boie,Bohrman,Bohley,Boglioli,Boghosian,Boggus,Boggiano,Bogden,Boey,Boesenhofer,Boerst,Boerma,Boenisch,Boemig,Boebinger,Boday,Bodamer,Bocklage,Bocchini,Bobseine,Bobian,Boberg,Bobek,Blyler,Blumenstein,Bloyer,Blotter,Blore,Blomme,Blomdahl,Bliske,Blinston,Bliek,Blessman,Bleggi,Bleeker,Bledsaw,Blauch,Blaskovich,Blankley,Blankenberg,Blanken,Blakelock,Blaida,Bjorgen,Biven,Bitzel,Bittman,Bitonti,Bissen,Bisom,Bisher,Birman,Birky,Birkes,Bippus,Bintz,Bintner,Bintliff,Binnie,Binks,Binkiewicz,Binienda,Bingley,Bilotto,Billheimer,Billen,Billeck,Billeaudeau,Bilinski,Bilello,Bild,Bihari,Bigda,Biez,Bierwirth,Bierle,Bierbower,Bienenstock,Biemer,Bieler,Bielak,Bidle,Biddleman,Biddiscombe,Bicknese,Bickerton,Bickelhaupt,Bichsel,Bibles,Bibian,Biase,Biancuzzo,Biancaniello,Biamonte,Bia,Bhatnagar,Bhardwaj,Bhan,Beyett,Bewig,Beuchat,Better,Betsill,Bethey,Betenbaugh,Betance,Betacourt,Beske,Besendorfer,Besemer,Besco,Bery,Bertran,Bertling,Bertie,Bernson,Bernosky,Bernon,Berninger,Bernes,Bernecker,Bernasconi,Bernardin,Berlo,Berliew,Berky,Berhe,Berhalter,Bergsjo,Bergholm,Bergener,Bergeman,Beraun,Benward,Benusa,Bense,Bennage,Benischek,Benion,Beninato,Bengel,Benedek,Bene,Bendzus,Bendler,Bendit,Benderman,Benberry,Benallie,Bemrich,Belyea,Beltrain,Belter,Bellue,Bellocchio,Bellisle,Bellipanni,Bellion,Bellessa,Bellavia,Belay,Bejjani,Beisser,Beiriger,Beik,Beien,Behymer,Behrenwald,Behanna,Beed,Beechum,Beechner,Bednarik,Bednarek,Bedenbaugh,Becwar,Beckton,Beckom,Bech,Bebo,Beatie,Beat,Bearman,Beaner,Beakley,Beahan,Beachamp,Bazzi,Bayman,Bayardo,Bayala,Bawcum,Bavier,Bauswell,Baures,Baune,Baumgarter,Bault,Baughey,Baugatz,Bauernfeind,Bauerlein,Bau,Batun,Battistone,Batteen,Batko,Batistich,Bater,Batcheller,Batarse,Bastow,Bassuk,Bassolino,Bassel,Bason,Basilone,Basich,Bascle,Bascetta,Bartush,Bartrum,Bartlet,Barthelmes,Bartberger,Bartash,Barsoum,Barsanti,Barrott,Barrom,Barriner,Barnhurst,Barnell,Barkle,Barkes,Barillaro,Bargerstock,Barganier,Baremore,Bardney,Barda,Barbot,Barbie,Barayuga,Barager,Bantz,Bandulin,Banasiak,Balzarini,Balwin,Balton,Balsiger,Balmos,Balmir,Ballestero,Ballek,Balick,Balian,Balestra,Balensiefen,Balduf,Balckburn,Balasa,Balafoutas,Baksi,Bakowski,Baklund,Bakko,Bakey,Bakanauskas,Baj,Baio,Bainard,Baima,Baillet,Baich,Bahrmasel,Bahrke,Bahoora,Bagsby,Bagger,Badena,Badders,Backfisch,Bacik,Bachler,Bachleda,Bachhuber,Bachert,Babiracki,Baatz,Azzarito,Azzarella,Azulay,Azotea,Azeem,Ayoob,Ayola,Ayles,Ayersman,Ayaia,Axthelm,Ax,Awtry,Avrett,Avilar,Aveni,Avellino,Aurelia,Aumend,Auletta,Augustson,Augustave,Aughe,Auerswald,Aubrecht,Athalone,Atanacio,Atamian,Astrologo,Astrella,Aspinall,Asman,Ashlin,Ashenfelter,Aschenbrener,Ascheman,Ascenzo,Asante,Asa,Arvayo,Artmann,Artice,Art,Arslan,Arrott,Arrojo,Arrizola,Arriano,Arrendell,Arps,Aronstein,Aronow,Aronica,Arntz,Arnst,Arnio,Arne,Armengol,Armantrout,Arlt,Arkadie,Arjune,Arismendez,Arimas,Aries,Ariel,Argandona,Arflack,Areola,Arenales,Ardman,Arciga,Arciba,Archacki,Arcaro,Arcano,Arbogust,Arauz,Aranas,Aquil,Aquero,Apresa,Appiah,Appert,Apostal,Apodace,Apadoca,Antrobus,Antoniuk,Antione,Antinarelli,Antich,Anslow,Ansbro,Annicchiarico,Angleberger,Angelson,Angello,Andruzzi,Androsky,Androlewicz,Andrion,Andringa,Andracki,Andra,Ancelet,Anastas,Anast,Anagnost,Amsley,Amsdell,Amsberry,Amsbaugh,Amoruso,Amoa,Amici,Amesbury,Ambrosia,Ambrogi,Amack,Alvia,Alvaro,Alvanas,Altrogge,Altomare,Altmire,Altenbach,Alsheimer,Alquisira,Alouf,Aloisi,Aloe,Almiron,Allford,Allex,Allery,Allenbach,Allegrucci,Alig,Alicuben,Alfisi,Alferez,Alfandre,Alf,Alexion,Alevras,Alessandrini,Alesi,Alescio,Alegre,Alea,Aldecoa,Alcini,Albrittain,Albrashi,Alawdi,Ala,Aksamit,Akima,Akel,Akahi,Ajose,Ajayi,Aivao,Aiu,Ainge,Ailshire,Aidt,Aicklen,Ahuja,Ahr,Aholt,Agle,Agamao,Affeld,Aeschbacher,Aeling,Adriance,Adkin,Adhami,Adeyemo,Ades,Adelgren,Addicks,Adamitis,Ada,Acor,Acimovic,Accomando,Accola,Acampora,Abuaita,Abshear,Abrantes,Abramovich,Abrachinsky,Abilay,Abellera,Abeles,Abdula,Abdon,Abbed,Abati,Abascal,Aavang,Aadland,Zylka,Zwolak,Zwingman,Zwerschke,Zwack,Zurin,Zupp,Zumbrunnen,Zukoski,Zukor,Zukas,Zuanich,Zoumis,Zoulek,Zou,Zorra,Zorich,Zomorodi,Zolty,Zolondek,Zolnoske,Zoldesy,Zoldak,Zocklein,Zlotnik,Ziraldo,Zipf,Zinsli,Ziniewicz,Zindell,Zin,Zimmerebner,Zimmel,Zimm,Zills,Zilla,Zilka,Zietz,Zietlow,Ziemski,Zielesch,Zieler,Zieglen,Ziegenbein,Ziegelbauer,Ziegel,Ziech,Zicker,Zicherman,Zich,Ziccardi,Zgoda,Zeschke,Zerko,Zerhusen,Zepka,Zents,Zeni,Zeme,Zematis,Zema,Zella,Zelkin,Zelenski,Zeilinger,Zeidan,Zegarelli,Zeanah,Zdon,Zbikowski,Zazula,Zavesky,Zavasky,Zaruba,Zarrineh,Zarrillo,Zarraluqui,Zarling,Zaring,Zaretsky,Zarebski,Zanini,Zanin,Zangl,Zaner,Zand,Zampieri,Zaltz,Zaloudek,Zall,Zalk,Zalar,Zakowski,Zajc,Zahran,Zahnen,Zagroba,Zagel,Zagara,Zagami,Zaffuto,Zachmann,Zachariades,Zaccagnino,Zaccagnini,Zaborski,Zabloudil,Zabarkes,Yvon,Yusef,Yuricic,Yuill,Yuenger,Yuasa,Ysbrand,Yourshaw,Younkers,Youngdahl,Youngblut,Youkers,Youkanaa,Yorkey,Yoneyama,Yonamine,Yoeckel,Yodis,Yocius,Yocham,Yobst,Yeubanks,Yetto,Yerigan,Yerbic,Yentsch,Yennard,Yemchuk,Yax,Yaun,Yasurek,Yasui,Yaskiewicz,Yantzer,Yantz,Yanosky,Yanek,Yandle,Yance,Yanagi,Yambao,Yamakawa,Yagoda,Yaekel,Yackeren,Yacavone,Yacano,Ximines,Xaimoungkhoun,Wysock,Wyont,Wynott,Wynans,Wylde,Wyett,Wydner,Wurzbacher,Wulfing,Wruck,Wroe,Wrobliski,Wrobbel,Wrights,Wraspir,Wrape,Woytowicz,Woy,Worthan,Worstel,Worsfold,Worrel,Worbington,Wools,Woollen,Woolems,Woodmancy,Woodhull,Woodgate,Woodfield,Woodcox,Woock,Wonsik,Wolven,Wolslegel,Wolny,Wolma,Wollyung,Wollin,Wolley,Wollan,Wolkow,Wolke,Wolever,Woleslagle,Wolansky,Wojnicki,Wohner,Wohlfahrt,Wohler,Wloch,Wittlin,Wittkopp,Wittenborn,Wittels,Withiam,Withfield,Wisz,Wissel,Wisseh,Wislocki,Wiscombe,Wischmeyer,Wischman,Wirebaugh,Winzelberg,Winterstein,Wintersmith,Winterroth,Winrich,Winograd,Winlock,Winley,Winkley,Wings,Winfred,Winebaugh,Windover,Windly,Winarski,Wimbs,Wimber,Wiltgen,Willmschen,Williver,Willinghurst,Williamston,Willenbrock,Willars,Willamson,Wileman,Wileczek,Wildenberg,Wildeman,Wilcutt,Wilch,Wilby,Wilbers,Wikstrom,Wigman,Wigle,Wigelsworth,Wietzel,Wiesneski,Wienert,Wienecke,Wienandt,Wieloch,Wielgosz,Wiedmann,Wieckowski,Wiece,Wieand,Widmar,Widhalm,Widgeon,Widerski,Widdows,Widdop,Widdison,Widby,Wida,Whyne,Whyel,Whybrew,Whittman,Whittall,Whitler,Whitinger,Whitewater,Whitescarver,Whitemarsh,Whitecloud,Whit,Whistlehunt,Whinnery,Whillock,While,Whilby,Wheldon,Wheatcroft,Whapham,Whaite,Wettlaufer,Wetterer,Wettach,Wetsel,Wethern,Westrum,Westlie,Westgaard,Westerhof,Westerfeld,Westad,Wesly,Wesberry,Werring,Werre,Wernz,Wermter,Werkmeister,Werbelow,Wentzlaff,Weniger,Wengreen,Wendolski,Wendelberger,Wempa,Weltzin,Welti,Weltch,Wellnitz,Wellenstein,Wekenmann,Weitze,Weitman,Weisholz,Weishar,Weisbaum,Weinraub,Weinbauer,Weinbach,Weidig,Weiderhold,Wehrwein,Wehrs,Wehrly,Wehnes,Wehn,Wegge,Weerts,Weemhoff,Weekey,Wedman,Weder,Weckman,Weckhorst,Weaklend,Wauters,Wauer,Waud,Wattenberg,Watte,Watling,Waszkiewicz,Wasmus,Wasilko,Washor,Wartchow,Warshauer,Warsham,Warrender,Warnstaff,Warmuth,Warmington,Wardrup,Wardhaugh,Wardall,Warchal,Warboys,Wanty,Wanous,Wanlass,Wangstad,Waneka,Wandless,Wandel,Wanda,Wamser,Wamhoff,Walvatne,Waltemeyer,Walsingham,Walljasper,Wallet,Wallerich,Walkling,Walkers,Walezak,Waldroff,Waldhoff,Waldall,Walbright,Walat,Wakita,Waka,Waisner,Waiki,Waiden,Wagle,Wagenblast,Wadusky,Wadden,Waclawski,Wackenhut,Wackenheim,Wachal,Waananen,Waack,Vy,Vukcevic,Vreugdenhil,Vreeman,Vrazel,Vranes,Vranek,Voytek,Voves,Vormelker,Vorachek,Vontungeln,Vonniederhaus,Vonner,Vonhagen,Vondrak,Vondielingen,Vonasek,Vonallmen,Voltaire,Vollucci,Vollick,Vollenweider,Volante,Voitier,Vogts,Vocu,Voci,Voccia,Vliet,Vliem,Vizarro,Vizard,Vittorini,Vitro,Vitolas,Vititoe,Viteo,Visnic,Visher,Visel,Viscia,Viscera,Vis,Virrueta,Virola,Viren,Vinz,Vinke,Vinger,Vind,Vinagre,Viltz,Villwock,Villifana,Villiard,Villetas,Villasana,Villarin,Villante,Villacana,Vile,Vilcheck,Vilardi,Vigueras,Vigoren,Vignovich,Vignaux,Vignarath,Vigier,Vieweg,Vietti,Vietor,Viegas,Viebrock,Vidals,Victorin,Vicsik,Vicic,Vicens,Viapiano,Vetsch,Vetri,Vertiz,Versluis,Verrilli,Verrelli,Verrecchia,Verni,Vernetti,Vermeer,Verling,Verlato,Verkler,Verkamp,Verghese,Verducci,Verant,Venzeio,Venturella,Ventress,Venton,Venhorst,Venerable,Veneman,Ven,Velverton,Velunza,Velmontes,Vellutini,Vellekamp,Veleta,Veldkamp,Velazques,Veino,Veigel,Veeneman,Vavro,Vauters,Vattes,Vaszily,Vastakis,Vasiloff,Vasilauskas,Vasconcelos,Vars,Varos,Varnon,Varkey,Vares,Varenhorst,Vardy,Varcoe,Vanwye,Vanwoert,Vanwieren,Vanvickle,Vantreese,Vansyckle,Vanstrander,Vansteenburg,Vanstee,Vanslander,Vanproosdy,Vanpoucke,Vanpoppelen,Vanpatton,Vanosdel,Vannelli,Vanmiddleswor,Vanloh,Vanlith,Vankoten,Vanisouvong,Vanholland,Vanhekken,Vanharlingen,Vanhandel,Vangemert,Vaneyck,Vanert,Vaneps,Vanegdom,Vandesteene,Vanderschaege,Vanderkam,Vanderheiden,Vandergriend,Vanderark,Vandeputte,Vandenbergh,Vandegraaff,Vandebogart,Vandamme,Vandalsen,Vandagriff,Vanclief,Vanboven,Vanbecelaere,Vanartsdalen,Vanaller,Vanakin,Vanabel,Valrie,Valrey,Valotta,Vallangeon,Valladolid,Valaitis,Vala,Vair,Vaidya,Vaid,Vagt,Vagle,Uyeno,Uson,Us,Urwin,Urtado,Ursino,Urry,Urquiza,Urps,Urmeneta,Urlaub,Uribazo,Urhahn,Ure,Urch,Urbanic,Urata,Urankar,Ur,Uppinghouse,Unthank,Unland,Unikel,Ungvarsky,Ungerleider,Ungerecht,Underkoffler,Umlauf,Umbdenstock,Ulrick,Uliano,Uldrich,Ulch,Ulberg,Uknown,Ukena,Uk,Uhri,Uhde,Udley,Uboldi,Tzeremes,Tysor,Tyrus,Tyrol,Tyl,Tyksinski,Tycer,Tyberg,Twitt,Tweden,Tuy,Tuton,Tuter,Tustison,Tuschhoff,Turso,Turrigiano,Turowski,Turnbo,Turnball,Turlich,Turli,Turla,Turkin,Turke,Turi,Tuong,Tulk,Tulip,Tugman,Tuggles,Tufano,Tucknott,Tuccillo,Tubeszewski,Tuason,Tsuzuki,Tsunoda,Tschannen,Trytten,Trybala,Truskowski,Trueba,Trueax,Truden,Trucchi,Trotti,Trongone,Tromble,Tromblay,Trokey,Troiani,Troglin,Trodden,Troccoli,Tritz,Tritch,Trischitta,Trisch,Trippet,Triplette,Trinca,Trimmell,Trilling,Trieger,Treworgy,Trevorrow,Trevillion,Trevigne,Trevett,Tretter,Treston,Trepagnier,Trentinella,Trenkle,Trenh,Trenbeath,Tremelling,Treider,Treib,Treftz,Tredennick,Trecroci,Trebil,Traves,Traversa,Tratar,Traster,Trasport,Trank,Trampe,Trammer,Trame,Trachte,Toyoshima,Towley,Tovias,Touvell,Tout,Toussant,Tourikis,Toten,Tosten,Tosic,Tosches,Tortoriello,Tortorice,Torstrick,Torset,Torrijos,Torrie,Torress,Torred,Torra,Torma,Torkildsen,Toppi,Toporek,Topolosky,Topick,Topez,Toper,Toncrey,Tompsett,Tompkin,Tomory,Tommolino,Tomjack,Tombs,Tombrello,Tomaszycki,Tomaski,Tolzmann,Tolston,Tolosky,Toldness,Tokuoka,Tokihiro,Tokay,Tok,Tojo,Tointon,Tohill,Togni,Tognazzini,Todeschi,Tobola,Tobeck,Toala,Toadvine,Tllo,Tkacz,Titchener,Titch,Tissot,Tiso,Tirri,Tipka,Tintle,Tinneberg,Tinius,Tinelli,Tin,Timmreck,Timmerberg,Timinsky,Timi,Timchak,Tillberry,Tilgner,Tiff,Tieszen,Tiemeyer,Tiemens,Tiell,Tiehen,Tidey,Tick,Ticas,Tiboni,Tiberio,Tibbert,Thyne,Thurton,Thurau,Thune,Thrune,Threets,Thorngren,Thornbrugh,Thorin,Thongdy,Thommarson,Thoene,Thoben,Thoams,Thixton,Thistlethwait,Thingvold,Thiesfeld,Thierauf,Thielbar,Thiebeault,Thiara,Thews,Theophilus,Theodoratos,Thenhaus,Theam,Thay,Thalmann,Thake,Thady,Tevlin,Tevebaugh,Testen,Tesseneer,Tervort,Terri,Terrey,Terres,Terrasas,Terney,Termeer,Terlecki,Terheggen,Terhark,Terhar,Terepka,Terault,Terando,Teppo,Tepler,Teper,Tent,Tenpas,Tennill,Tennett,Tenley,Templer,Tempe,Temp,Teltschik,Telschow,Telle,Tekippe,Teitsort,Teitenberg,Tei,Tegarden,Teffeteller,Tefera,Teesdale,Teemer,Teekasingh,Teddick,Tebay,Tebar,Teats,Teano,Teagues,Teachman,Teabo,Tchakian,Tazzara,Tayor,Tavorn,Tavira,Taverna,Tave,Tautuiaki,Tatters,Tatevosian,Tassey,Taschereau,Tarzia,Tarring,Tarrien,Tarras,Tarkenton,Tariq,Tardio,Tarascio,Tara,Tappeiner,Tannen,Tankersly,Tanious,Tangren,Tangredi,Tangert,Tamulis,Tamburrino,Tambasco,Tamargo,Tamanaha,Talluto,Taki,Takeshita,Takemura,Takaoka,Tajiri,Taintor,Tahu,Tags,Taglieri,Tafel,Tadiello,Tacket,Taborda,Tabolt,Tabisola,Tabian,Taback,Szymansky,Szwejbka,Szweda,Szufat,Szubinski,Szerlong,Szekula,Szczygiel,Szczepanek,Szalay,Szafryk,Syrek,Syphard,Synan,Symmonds,Sydner,Swirsky,Swires,Swietoniowski,Swickheimer,Swets,Swetland,Swenk,Sweetin,Swavely,Swatt,Swatsworth,Swatski,Swartzmiller,Swartzbeck,Swartzbaugh,Swansen,Swalley,Swaisgood,Swails,Swaggert,Svrcek,Svinth,Svetz,Svetlik,Sutulovich,Suttell,Susswein,Sussex,Susor,Susoev,Susich,Susana,Surwillo,Suran,Sunn,Sunkel,Sundling,Sundholm,Sumsion,Sump,Summar,Sumlar,Suminski,Sumi,Sumas,Sulzman,Sultana,Sullinger,Suleski,Sulcer,Sul,Sukeforth,Suing,Suglia,Sugiki,Suggett,Sueltenfuss,Suders,Sudar,Suchecki,Sucharzewski,Suchanek,Subler,Suben,Subasic,Styborski,Stvil,Stumme,Stulick,Studyvin,Stubson,Stuble,Stubits,Stubenrauch,Strysko,Struggs,Strudwick,Strowd,Stroub,Stroth,Stropko,Stroinski,Strnad,Stritzke,Stritzinger,Strittmater,Strieker,Strickert,Strength,Stremlow,Stremel,Strejcek,Streitmatter,Streif,Streb,Streams,Straws,Strausberg,Strathy,Strathman,Strater,Straseskie,Strapp,Stranger,Strande,Stramiello,Strakbein,Strachn,Stoyer,Stoyanoff,Stowman,Stowbridge,Stove,Stoutt,Stoutenburg,Stouer,Stouder,Store,Stoppkotte,Stopa,Stolts,Stolinski,Stolecki,Stole,Stojanovic,Stofsky,Stoffregen,Stoffels,Stoffa,Stoesz,Stodolski,Stockett,Stittsworth,Stipek,Stinett,Stillion,Stillinger,Stiel,Stiehl,Stiegler,Stieg,Stickrod,Sticht,Stibbins,Stevener,Steudeman,Stetzel,Sterr,Sternal,Sterback,Stephco,Stenman,Stemmerman,Stemme,Stemarie,Stelting,Stellings,Steir,Steinlicht,Steiniger,Steinbrenner,Steidinger,Stehney,Stehly,Stefka,Steffel,Stefanovich,Steeno,Steeneck,Steenburgh,Steckline,Steckelberg,Stazenski,Stavis,Staum,Stauffacher,Stauder,Staude,Statzer,Stasinos,Starwalt,Starrs,Starnauld,Starek,Stapleford,Stapf,Stapels,Stansifer,Stanojevic,Stanick,Standring,Standrew,Standke,Standford,Stancle,Stanciel,Stamnos,Stamison,Stallons,Stallion,Stallbaumer,Stailey,Staie,Staiano,Stahnke,Stahle,Stageman,Stacken,Stachecki,Stableford,Stabb,Sramek,Squines,Spurzem,Sprock,Springate,Spreng,Spratte,Sprang,Sprake,Spotwood,Splain,Spiwak,Spitznogle,Spirito,Spirek,Spingola,Spincic,Spillett,Spika,Spigelman,Spielmann,Spetter,Sperl,Spenard,Speilman,Speigel,Speice,Speach,Spaugh,Spatafore,Spatafora,Spar,Spanski,Spannaus,Spanish,Spanfellner,Spalinger,Spagnolia,Spadea,Spadafore,Spadaccini,Spachtholz,Spach,Spacek,Sozzi,Sowels,Soulasinh,Souffront,Soucier,Sotolo,Soteros,Sotero,Soter,Sossaman,Soshnik,Sorrick,Soron,Soroa,Sornsen,Sorgente,Sordahl,Sonza,Sontheimer,Sonstroem,Sonoski,Sonnenfeld,Sonderup,Somani,Soman,Somalski,Solymani,Solton,Soloveichik,Solmonson,Sollberger,Solkowitz,Solimini,Soleman,Solders,Soldavini,Solanki,Sohm,Sodek,Sode,Socks,Sockalosky,Sochan,Sobilo,Soapes,Snyders,Snowman,Snowdy,Sniffin,Snetting,Snellman,Snellenberger,Snellen,Snellbaker,Sneathen,Sneath,Smyrl,Smull,Smolko,Smithheart,Smiht,Smestad,Sluter,Slupe,Slomkowski,Slomka,Slomba,Sliz,Slipp,Slim,Slightam,Sleper,Sledz,Slechta,Slaughterbeck,Slaughenhoupt,Slaight,Sladick,Slader,Skye,Skupski,Skroch,Skripko,Skrine,Skreen,Skradski,Skorski,Skornik,Skokowski,Skok,Skocilich,Skinnen,Skillington,Skemp,Skay,Skattebo,Skagerberg,Siwik,Sivik,Sitar,Sitaca,Sission,Sissac,Sisney,Siruta,Sirmon,Sirkoch,Siriano,Siracuse,Sipler,Sipho,Sinkovich,Sinkey,Sinistore,Singo,Sinclaire,Simunovich,Simuel,Simril,Simpton,Simpliciano,Simoson,Simonis,Simoncini,Simister,Simison,Simenez,Simco,Simcheck,Silvi,Silveri,Silvano,Silletto,Sillavan,Siles,Silbernagel,Sigwart,Sigona,Signs,Signaigo,Sigmond,Sigars,Siemek,Siem,Sieloff,Sieligowski,Siefke,Siebeneck,Siebenberg,Siderman,Siderine,Sidberry,Sicilia,Sichta,Sibrel,Sibell,Sibayan,Shyu,Shvey,Shuter,Shumski,Shulund,Shulte,Shuker,Shugars,Shufford,Shubrick,Shub,Shouldice,Shotton,Shotkoski,Shost,Shortsleeve,Shorette,Shopen,Shont,Shonerd,Shone,Shomin,Shomer,Sholl,Shoger,Shirts,Shirota,Shinholster,Shindle,Shinaberry,Shimura,Shimsky,Shimo,Shillinger,Shilleh,Shihadeh,Shierling,Shewbridge,Shevitz,Sheumaker,Shettle,Shers,Sherren,Shern,Sherling,Sherle,Sheridon,Sherdon,Shelter,Shelmon,Shelling,Shelko,Sheline,Shelhamer,Shekey,Shekarchi,Sheinberg,Shehata,Sheffo,Shebchuk,Shearing,Sheaks,Shazier,Shayne,Shawnee,Shawhan,Shaud,Shastri,Sharr,Sharlin,Shark,Sharits,Sharf,Share,Shapskinsky,Shape,Shankland,Shames,Shalhoup,Shaftic,Shadiack,Shackle,Shabala,Sevick,Sevedge,Seurer,Sette,Servan,Serva,Serrett,Serrand,Serisky,Sering,Serie,Serianni,Sereda,Sequin,Senti,Senosk,Senno,Senner,Senna,Senerchia,Sendro,Sencabaugh,Semonick,Semetara,Sembler,Selvaggio,Seltzen,Selser,Sellek,Sellberg,Selking,Seliba,Selfe,Seki,Seifarth,Seielstad,Sehorn,Sehl,Segur,Segrave,Sefcovic,Seeton,Seek,Seecharan,Seeberger,Sedman,Sedano,Secunda,Seburg,Sebold,Sebastion,Seate,Seashore,Seard,Seang,Seaney,Seace,Seabert,Sczygiel,Scurti,Scullen,Scroggy,Scripter,Scowden,Scorsone,Scoleri,Scocca,Scire,Sciotti,Sciera,Scibilia,Sciabica,Schwisow,Schwier,Schweinert,Schweinberg,Schweiker,Schweigart,Schweickert,Schwass,Schwarzenbach,Schwarts,Schwarm,Schwamberger,Schwalenberg,Schwabenbauer,Schwabauer,Schuttler,Schutjer,Schuring,Schure,Schuppert,Schuner,Schulthess,Schulteis,Schulle,Schuhmacher,Schuermann,Schuepfer,Schuele,Schrott,Schrope,Schrauder,Schrandt,Schouviller,Schonert,Schonack,Scholzen,Scholnick,Schoffstall,Schoenthal,Schoenstein,Schoenhut,Schoenhard,Schoeneman,Schoemer,Schoborg,Schnicke,Schneidtmille,Schneiders,Schmunk,Schmoyer,Schmeider,Schmale,Schlottman,Schlitzer,Schlipp,Schlink,Schliesser,Schlieper,Schlesselman,Schlensker,Schleis,Schlein,Schleck,Schlabaugh,Schiver,Schirpke,Schindel,Schimler,Schiltz,Schillings,Schiffelbein,Schiebel,Schiaffino,Schettig,Schetrompf,Schessler,Scherler,Scheppe,Schepens,Schellman,Schellhammer,Scheirman,Scheibelhut,Schei,Schech,Scheaffer,Schattner,Schatt,Scharte,Schappell,Schanding,Schanbacher,Schan,Schaming,Schamburek,Schaeffler,Schadle,Schadegg,Schabot,Schaberg,Schaadt,Scerra,Scercy,Scattergood,Scarset,Scarrow,Scarritt,Scarpaci,Scarles,Scarce,Scanlin,Scalice,Scali,Scahill,Sazama,Saysithideth,Sayres,Sayavong,Sawlivich,Sawczyszyn,Savo,Savina,Savilla,Savela,Savasta,Saurel,Saupe,Sauberan,Satunas,Sattley,Satterley,Satiago,Satchel,Saska,Sarvey,Saroukos,Sarnowski,Sarnoff,Sarli,Sarley,Sarelas,Sardi,Sarconi,Sarbacher,Saragusa,Saraceno,Sar,Sappenfield,Sanzotta,Santy,Santorella,Santopolo,Santin,Santiesteban,Santhuff,Santell,Sansburn,Sanpaolo,Sanocki,Sannon,Sannella,Sanlucas,Sanjabi,Sangrey,Sangi,Sanghvi,Sangh,Sanfiorenzo,Sandrowicz,Sandoual,Sandora,Sandlian,Sandi,Sandholm,Samuelsen,Samu,Sampedro,Samorano,Samok,Samide,Samber,Samain,Saltzgaber,Saltonstall,Saltern,Salte,Salonia,Salmond,Sallas,Saliva,Saler,Salek,Saldibar,Salabarria,Sakon,Sakelaris,Sake,Sajorda,Sajor,Sahni,Sagoes,Saglimbeni,Sagehorn,Sagayaga,Safdeye,Safa,Sadlon,Sadbury,Sadahiro,Sache,Sacavage,Sacarello,Sables,Sabean,Sabates,Sabataso,Saager,Saa,Rzucidlo,Rzeszutko,Ryther,Rylant,Ryks,Ryherd,Ryhal,Rygalski,Rybacki,Rviz,Ruys,Ruuska,Ruttman,Ruttinger,Ruts,Ruter,Rutana,Rusten,Russnak,Rusinko,Rusi,Rushiti,Rushia,Rushdan,Ruscetti,Rusboldt,Ruppenthal,Rupke,Rundahl,Rund,Rummer,Rummans,Rumler,Ruminski,Rumfola,Rull,Ruise,Ruggle,Ruescher,Ruegsegger,Ruegger,Rudzik,Rudney,Rudisail,Rudis,Rudduck,Rucky,Ruckdeschel,Rubins,Rubenzer,Rozo,Rox,Rowzee,Rownd,Rowey,Rowcliffe,Rovinsky,Roup,Rottner,Rothmiller,Rothgery,Rothbart,Rotenberg,Rotando,Roswick,Rosu,Rossum,Rossetto,Rosseter,Rosselli,Roskos,Roskopf,Rosenholm,Rosencranz,Rosenbrook,Rosella,Rosebaugh,Rosbough,Rosan,Roofe,Ronson,Ronhaar,Rones,Ronchetto,Romeno,Rombs,Romanoski,Romanini,Romanick,Roloson,Rollock,Rollheiser,Rollans,Rold,Rolark,Rokisky,Roja,Roik,Rohaley,Rognstad,Rofkahr,Roethel,Roessner,Roesser,Roehrman,Roehrenbeck,Roegge,Roefaro,Rody,Rodrigo,Rodricks,Rodino,Rodillas,Rodia,Rodenbaugh,Rodell,Rodeiguez,Rodarta,Rockenbach,Robley,Robes,Robertello,Robello,Robella,Robak,Roarx,Rivlin,Rivira,Rivena,Ritzert,Ritell,Ritcheson,Riska,Risberg,Ripke,Rinkel,Riniker,Ringman,Ringlein,Ringelheim,Ringbloom,Rinde,Rincones,Rimson,Rimar,Riliford,Rihn,Rihanek,Rigoni,Riggott,Riffon,Rievley,Rieve,Riesenweber,Rieg,Rieff,Riedell,Riechers,Rieber,Rieben,Riebeling,Ridpath,Ridler,Riddock,Rickson,Rickmon,Rickley,Rickie,Richrdson,Ribot,Riblet,Rhyme,Rhoney,Rhed,Rhead,Rezek,Reynvaan,Reynoza,Reye,Rexwinkle,Revord,Reven,Reveal,Reutlinger,Reuland,Reuer,Retzler,Rettke,Retterbush,Retort,Reth,Resureccion,Restifo,Resnikoff,Rerko,Repsher,Repress,Reppell,Repinski,Repenning,Renze,Rennix,Renning,Renney,Rennell,Renfer,Rener,Rendino,Renaker,Remmen,Rementer,Remenaric,Relkin,Reiterman,Reist,Reisser,Reisling,Reisert,Reise,Reio,Reinmiller,Reine,Reill,Reigner,Reifler,Reifel,Reidenbach,Rehnquist,Rehler,Rehfield,Rehfeldt,Rehberger,Regler,Regel,Regehr,Refsell,Reen,Reem,Reeher,Reech,Reeber,Redstone,Redo,Redish,Redhage,Redenz,Redell,Reddrick,Redder,Reckley,Reckleben,Recine,Rebusi,Rebuldela,Rebera,Rebell,Rebeles,Reavley,Reau,Reatherford,Reaney,Reaid,Reagans,Reado,Razinger,Razey,Raza,Rayside,Raymos,Raygosa,Rawding,Raw,Ravens,Ravenhorst,Rav,Rauzman,Rautenberg,Rausin,Rauner,Raudebaugh,Rattner,Ratleff,Rathmell,Rathgeb,Ratermann,Rataczak,Rasher,Rashdi,Rashada,Rasbery,Rarang,Rapose,Rapa,Ransick,Ranos,Rankhorn,Raniero,Rang,Randzin,Rancher,Rances,Rancatti,Ramoutar,Ramnarase,Ramlakhan,Ramiro,Ramiriz,Ramez,Rameriez,Rambus,Ramaswamy,Ramagos,Ramadanovic,Ramadan,Ralko,Ralat,Rakel,Raju,Rajtar,Raja,Rairdon,Raimo,Raif,Raiche,Raheja,Raheem,Rahall,Raguso,Rafanan,Rafalko,Raes,Radzavich,Radune,Radulescu,Raduenz,Radsek,Radom,Radell,Rackett,Racilis,Rachi,Rach,Racedo,Rabold,Rabner,Rabern,Rabenstein,Rabelo,Quintas,Quinlisk,Quine,Quincey,Quilantang,Quicksey,Quereto,Quelette,Quaresma,Quann,Quall,Quails,Quaas,Qadir,Pytlovany,Pybus,Putaski,Purwin,Purter,Purple,Purol,Purkiss,Pummel,Pults,Pultorak,Pullian,Puller,Pulham,Puletasi,Puidokas,Puhuyaoma,Puffinburger,Puesey,Puelo,Puddephatt,Pucillo,Puc,Przepiora,Prys,Pruzansky,Pruyn,Prust,Prusinski,Prus,Pruette,Provis,Provine,Proue,Protz,Prosonic,Prophett,Pronto,Pronovost,Proksch,Prok,Proietto,Proia,Proenza,Probus,Prizzi,Privalsky,Prisock,Printy,Primozich,Priefert,Pridham,Preus,Prettner,Prester,Pressel,Preskar,Premer,Premeaux,Preisinger,Preisendorf,Prehm,Pregeant,Preedom,Pralle,Prag,Pradel,Prabhakar,Poyser,Poupard,Potterson,Pottebaum,Potolsky,Poto,Potes,Postlethwaite,Postin,Pospishil,Poskus,Posik,Portsche,Portolese,Porrini,Poro,Porietis,Poppenhagen,Poppen,Poppel,Pontonio,Ponting,Pono,Pomposo,Pomponio,Pomplun,Pomo,Pomeranz,Pomella,Pomberg,Pomares,Polucha,Polselli,Polnau,Pollins,Pollara,Polisky,Polio,Policz,Policar,Polchinski,Polashek,Polakowski,Polaco,Poitevin,Poister,Pointon,Poinson,Poinsett,Pogar,Poetter,Podmore,Poczobut,Pockette,Pocasangre,Pobre,Plys,Plunket,Plumpton,Pluemer,Plover,Ploetz,Ploense,Plocek,Plikerd,Pleet,Pleasure,Plazza,Plaxico,Platko,Platania,Plassmann,Plantier,Plantenga,Plancarte,Plakke,Pladson,Pizzano,Pivin,Pittsinger,Pittmann,Pitsenbarger,Pitonyak,Pitmon,Pitfield,Pitek,Pitassi,Pistulka,Pistole,Piske,Pishko,Pisegna,Pirnie,Pirkey,Pippitt,Piorkowski,Pinna,Pinkton,Pinks,Pinkerman,Pinchbeck,Pimpare,Pilloud,Pillitteri,Pilakowski,Pikus,Pikula,Pikkarainen,Pijanowski,Pigao,Piette,Pietrzykowski,Pietryga,Pietropaolo,Pies,Piersaul,Pieri,Piepenbrink,Pieloch,Pieffer,Picucci,Pickl,Pickhardt,Picini,Picerni,Picaro,Piatak,Pianalto,Piacquadio,Phoun,Phonharath,Phomsoukha,Phommaseng,Phinazee,Phillippy,Phillians,Philavong,Phernetton,Pheonix,Phenes,Pfotenhauer,Pfleiderer,Pfleider,Pflanz,Pfieffer,Pfeiff,Pfautz,Pezzica,Pevez,Pevehouse,Petrunger,Petrullo,Petrucco,Petrson,Petrilla,Petrides,Petrauskas,Petkus,Petiet,Petgrave,Peterschick,Petaway,Pesner,Pesiri,Pesin,Pesa,Pervine,Pertubal,Perschall,Perrucci,Perow,Peroddy,Perocho,Perno,Perloff,Peria,Pergerson,Pereyda,Pereria,Pereiro,Perdzock,Perchinski,Peraro,Peques,Pepito,Pentek,Pentaris,Pennison,Pennewell,Pennacchio,Penington,Peninger,Pengelly,Penegar,Pencek,Penale,Penaherrera,Pembrook,Pelyo,Pelligra,Pele,Pekala,Peine,Peightal,Peers,Peerbolt,Pedaci,Ped,Pectol,Pecot,Pecos,Pecorelli,Pechart,Pebbles,Peatry,Pearle,Peard,Peakes,Peaches,Paywa,Paysinger,Payes,Pawelczyk,Pavoni,Pavlovic,Pavelec,Pavan,Paullus,Pauldo,Patuto,Patruno,Patoine,Patock,Patka,Pata,Pastiva,Pastick,Passwater,Passineau,Passi,Pasquino,Pasquel,Pasquarelli,Pason,Paskert,Pashley,Pashia,Partis,Partido,Parsi,Parrill,Parolari,Parisio,Pariser,Parents,Parduhn,Parden,Parcel,Parbo,Paray,Papson,Pappa,Papillion,Papik,Paparella,Papai,Paoletto,Pantone,Pannhoff,Pankowski,Pangelina,Pangallo,Panda,Panciera,Panchana,Panasci,Panarella,Paltanavage,Palsgrove,Palovick,Paloma,Palmiotto,Palmiero,Palmerton,Palmerin,Pallet,Pallesen,Pallazzo,Palitti,Palischak,Paliotta,Palifka,Palenik,Palecek,Palczewski,Palasik,Palacious,Pala,Pahnke,Pahls,Paguirigan,Pagnozzi,Pagliarini,Paduano,Paddison,Padavano,Pacubas,Packingham,Packebush,Pacius,Paci,Pacey,Pacas,Pac,Ozolins,Ozog,Ozminkowski,Oyuela,Owston,Ovsanik,Overlie,Overbo,Oven,Ovard,Ourso,Ouderkirk,Ottis,Otterholt,Otomo,Otley,Osuch,Ostling,Ostlie,Ostheimer,Osterstuck,Osterdyk,Ostenson,Osten,Ossowski,Osso,Osmon,Osle,Oskins,Osendorf,Osburne,Osawa,Ortic,Ortenzio,Orrantia,Orrala,Orouke,Orone,Orofino,Orkwis,Orizetti,Oris,Orines,Orgovan,Orgain,Orendorff,Orendain,Oree,Orea,Ordner,Ordas,Orbeck,Oravec,Opray,Ophus,Opela,Opatrny,Opara,Oosterhof,Onusko,Onstead,Onorata,Onitsuka,Onishea,Oneel,Ondrusek,Omundson,Omoyosi,Omdahl,Oltz,Olton,Olrich,Olquin,Olp,Olmscheid,Olm,Olivio,Oliverson,Oliven,Olis,Oline,Olexa,Olesnevich,Olesky,Oleksiak,Oldani,Olcus,Oksen,Okolo,Okojie,Okerblom,Okajima,Ohrenich,Ohms,Ohmann,Ohland,Oguinn,Ogiba,Ogeen,Oge,Oganyan,Offenbacker,Oesterreich,Oerther,Oelschlager,Odore,Odonal,Odonahue,Odiase,Odenwald,Odens,Odear,Octave,Ockey,Ochwat,Ochotorena,Ochiltree,Och,Ocejo,Ocano,Obstfeld,Obleness,Obiesie,Oberloh,Oberfell,Obannion,Oakleaf,Oak,Nyswonger,Nyseth,Ny,Nuvallie,Nusom,Nush,Nurnberger,Nunziata,Nunev,Nudelman,Nucklos,Nuce,Novik,Noury,Notik,Notari,Nosis,Nosel,Northcraft,Northcote,Norskog,Norrid,Norquest,Normann,Norma,Norlund,Norley,Norcott,Norbeck,Noonon,Nooney,Nonaka,Nollora,Nollman,Nolda,Nolau,Nol,Nogueras,Nogowski,Nogosek,Noftsger,Noeldner,Nocum,Nocket,Nocar,Noaks,Niverson,Nittinger,Nitterhouse,Nitkowski,Niten,Nitchals,Nissila,Nishiguchi,Nippert,Nippe,Ninos,Nine,Nimocks,Nimmer,Nilsby,Nill,Nikolas,Nikirk,Niimi,Nii,Niheu,Nihei,Nigg,Niforos,Niezgoda,Nieva,Niethamer,Niesman,Nienow,Niedermayer,Niedecken,Nied,Niebyl,Nie,Nicotera,Nicolet,Nicolaisen,Nickolls,Nickol,Nickleson,Nickelston,Nichois,Nicewarner,Niceswander,Nicarry,Nicar,Nhep,Ngueyn,Nguen,Ngov,Nghe,Newsted,Newnum,Newer,Newburg,Newall,Nevland,Neugin,Neuenfeldt,Neuby,Nestel,Nesseth,Nervis,Nerpio,Nenninger,Nemzek,Nemoede,Nemer,Nelmark,Nellem,Neithercutt,Neiswander,Neisius,Neish,Neihart,Neiderhiser,Nehmer,Negrisor,Negrette,Nefzger,Neeper,Neelon,Needels,Needam,Nealley,Nealen,Nealeigh,Nayee,Nawn,Navone,Navejas,Navedo,Navar,Naud,Natiello,Nathoo,Nasson,Naselli,Nase,Naschke,Narez,Nares,Nappier,Napoletano,Napihaa,Naone,Nannini,Nannie,Nania,Nanda,Nampel,Nalepka,Najjar,Nahass,Naeve,Naecker,Nadell,Myrum,Myint,Myhr,Myerscough,Muterspaw,Mutana,Muszar,Mustafaa,Must,Mussenden,Mussen,Mushett,Musetti,Musemeche,Musel,Muscaro,Murrock,Murrie,Murrain,Murilla,Murelli,Murayama,Murai,Munzell,Munteanu,Munt,Munshower,Munlin,Muni,Munding,Munda,Mulvehill,Mulry,Mulliner,Mullice,Mullaly,Muhr,Muhn,Mugica,Muether,Muehlberger,Muehlbach,Muccia,Mrowka,Mrotz,Mrochek,Mracek,Moznett,Moyse,Moxham,Mowris,Moutoux,Moussette,Mousley,Moun,Moulinos,Mostrom,Mostert,Mosses,Moskovitz,Mosinski,Mosgrove,Mosebach,Moschetto,Morway,Morthland,Morta,Morsbach,Morreau,Morowski,Moroles,Morlas,Morgenstein,Morasch,Moranda,Moralis,Moraitis,Moraites,Moote,Moorcroft,Montier,Montie,Montesa,Monteros,Montefusco,Montecalvo,Montazami,Montaya,Monsky,Monsegur,Monnet,Monjaras,Moniot,Monholland,Monet,Monestine,Monds,Mondry,Mondo,Mondino,Momsen,Momaya,Molski,Mollins,Molitoris,Mokbel,Moistner,Moilien,Mohring,Mohrbacher,Mogro,Moerman,Moellman,Modero,Moczo,Mocco,Mocarski,Mobus,Mizukami,Miyares,Miyahara,Miyagishima,Mittendorf,Mittelstadt,Mitsakos,Mith,Mita,Misura,Missler,Misrahi,Misnick,Misemer,Miscovich,Miscavage,Misasi,Mirich,Miravalle,Miras,Miramon,Mioduszewski,Mio,Minster,Minnier,Minneweather,Minnehan,Minkel,Miners,Mineah,Mincher,Minatra,Minato,Minari,Minardo,Milush,Miltner,Milster,Milovich,Milman,Millraney,Millot,Millisor,Milliren,Millimaki,Millich,Milland,Milkovich,Militano,Mileti,Milek,Mildren,Milder,Milch,Milbert,Milbauer,Milanowski,Milanese,Mikulecky,Mikulak,Mikita,Mikelsen,Mihlfeld,Mihatsch,Mihalkovic,Mihalko,Mignogna,Migl,Miessner,Mieras,Midcap,Mickleberry,Michocki,Michelman,Michales,Michalenko,Mias,Mhoon,Mezza,Mezquita,Mezera,Meyette,Meyerhoffer,Meyerhofer,Meury,Meuller,Mettle,Metter,Mettee,Metta,Metroka,Metevier,Metaxas,Mestrovich,Messa,Mesidor,Meschino,Meryman,Merrett,Merrbach,Merone,Merkling,Merickel,Mercante,Meo,Mensinger,Menist,Menino,Menhennett,Mengarelli,Menez,Menesez,Mendelowitz,Mencl,Men,Mellors,Mellom,Mellencamp,Mellekas,Melkonian,Melish,Meleski,Melero,Melchin,Melbert,Melandez,Melander,Meisels,Meighen,Mehtala,Mehserle,Meholick,Mehalic,Megna,Meginnis,Meggitt,Meggers,Meger,Meeter,Meeske,Meeder,Medows,Mednick,Medich,Mediate,Median,Medez,Medbery,Medak,Mebus,Meason,Meanor,Meager,Mcwethy,Mcvean,Mcthune,Mcsweeny,Mcspedon,Mcsharry,Mcravin,Mcraven,Mcquistion,Mcquilkin,Mcquaide,Mcquage,Mcpherren,Mcpeck,Mcnaney,Mcmindes,Mcmilliam,Mcmenomy,Mcmarlin,Mcmahill,Mcloy,Mcloone,Mclear,Mclaughlan,Mckoan,Mckerley,Mckerchie,Mckeone,Mckennie,Mckellan,Mckaig,Mcinally,Mchendry,Mcgwier,Mcguirt,Mcgugin,Mcgready,Mcgraff,Mcgrade,Mcgorry,Mcglothian,Mcglory,Mcgavisk,Mcgarrigle,Mcever,Mcelmurry,Mcelheny,Mcelhattan,Mcdaries,Mcdargh,Mccumiskey,Mccredie,Mccraven,Mccoyle,Mccoppin,Mccombie,Mccloughan,Mccleve,Mcclenty,Mcclennan,Mcclees,Mccleer,Mcclearen,Mccaskin,Mccartin,Mccamy,Mccammack,Mccaman,Mccalop,Mccaffity,Mcburrows,Mcburrough,Mcbrady,Mcalphin,Mcalhaney,Mcaboy,Mazikowski,Mazar,Mayzes,Maymon,Mayeski,Maycumber,Mayala,Maxin,Maute,Mauss,Mauritz,Maurey,Maulin,Matuszeski,Matusik,Matuseski,Mattu,Mattier,Matthys,Matteucci,Matsuhara,Matsen,Matrejek,Matlick,Mathewes,Mathal,Matey,Matesic,Materna,Matelic,Matarese,Matalavage,Mataalii,Mastrocovi,Mastrobuono,Mastoris,Mastera,Mastenbrook,Mastella,Massaglia,Maslyn,Masley,Masin,Masiclat,Mashiah,Mashek,Mascot,Maschke,Maschio,Masch,Marzinske,Marxen,Marville,Marushia,Marungo,Maruffo,Maruca,Martinz,Martinetto,Martinetti,Martinea,Martincic,Martig,Marske,Marshalsea,Marsette,Marroguin,Marreo,Marquena,Marona,Marola,Marmie,Markstrom,Marksbury,Markrof,Markovitz,Markevich,Markette,Marius,Maritt,Marionneaux,Marinos,Marinese,Maricich,Marhoefer,Margiotta,Maren,Marecki,Marcone,Marcoline,Marcolina,Marchuk,Marcelynas,Marcaida,Marbus,Marazzi,Marazas,Marashio,Maranville,Marani,Marandi,Marander,Marade,Mapalo,Manza,Manylath,Manvelyan,Manusyants,Mantuano,Mantsch,Mantell,Mantano,Mansmann,Manship,Manozca,Mannie,Mannes,Manliguis,Manigold,Maniatis,Mania,Mangon,Manginelli,Mangicavallo,Mangiaracina,Mangas,Mangaoang,Manford,Mandiola,Manchini,Mamoran,Mammucari,Mamer,Malys,Malvin,Malvaez,Malusky,Maltie,Maltbie,Malphurs,Malotte,Malloch,Malkasian,Malit,Malis,Malinski,Malinchalk,Malicote,Malich,Maletz,Malesky,Maler,Malekzadeh,Maleh,Malech,Malbaurn,Malara,Malakan,Malakai,Malafronte,Malady,Makley,Makekau,Majmundar,Majersky,Maiten,Mainiero,Mainello,Mailes,Maigret,Mahusay,Maharg,Mahany,Maguet,Magowan,Magone,Magnall,Magleby,Maglaya,Maginn,Magin,Magil,Maggs,Maggie,Magelssen,Magaw,Magario,Magallanez,Maeweather,Madura,Madrueno,Madinger,Madho,Maderas,Maddry,Madaris,Maczko,Macugay,Macrowski,Macomb,Macnab,Maclaurin,Maclauchlan,Mackynen,Macksoud,Macks,Mackney,Mackintosh,Mackinder,Maciej,Macie,Machowski,Machol,Machinsky,Machalek,Macchione,Macall,Macafee,Mabus,Mabins,Mabane,Maassen,Lysen,Lynaugh,Lykens,Luvian,Luttenegger,Lutkins,Lutchman,Lutao,Luskin,Luskey,Lungren,Lundburg,Lumm,Lulic,Lulewicz,Lukaszewicz,Luiso,Luhnow,Lugg,Lugardo,Lufsey,Luetmer,Luepke,Ludtke,Luczkowiak,Luckhardt,Luckenbaugh,Lucken,Luchenbill,Lubke,Lubell,Lube,Lubbock,Lozon,Loze,Lozaya,Loynd,Loxley,Lowthorp,Lowek,Loviska,Lovig,Lovgren,Loverink,Lovensheimer,Lounsbery,Loukota,Loughnan,Loughborough,Loudenslager,Lotson,Lothspeich,Lotan,Lossa,Losolla,Losier,Lorna,Lorimor,Lori,Lorett,Lorens,Loreg,Loreaux,Lorandeau,Loque,Lopus,Lopriore,Lootens,Lookadoo,Lonneman,Lonn,Longiotti,Longhini,Longendyke,Longbotham,Londre,Londagin,Lonabaugh,Lomu,Lominy,Lomboy,Lomartire,Lollie,Lokker,Loia,Loi,Logrono,Logosso,Loggains,Loflen,Lofink,Lofgreen,Loewenthal,Loeurm,Loerzel,Loeppke,Loepp,Loegering,Lodholz,Lockey,Lockbaum,Lochte,Lochan,Lobur,Loban,Llorca,Lloid,Llewlyn,Llanez,Liwanag,Livernoche,Litzenberg,Litano,Lissard,Lisko,Liscio,Lipskar,Lipscombe,Lipschutz,Lipphardt,Lipinsky,Lipani,Lions,Linnertz,Links,Linkowski,Linko,Lingafelter,Lingafelt,Lindzy,Lindman,Lindert,Lindersmith,Linders,Linderholm,Lindburg,Lindaman,Lincicome,Linberg,Linamen,Limke,Lilyquist,Liloia,Lillpop,Lillick,Lillich,Lilien,Lighter,Liggin,Lifton,Lifsey,Lifford,Lifer,Liest,Liem,Lidke,Liddiard,Lick,Lichtenwalner,Lichtenfeld,Lichak,Licerio,Licausi,Licause,Libman,Libera,Liaw,Leya,Lewitt,Lewandoski,Levoy,Levitin,Leviston,Leventer,Levenhagen,Leveillee,Leve,Lettre,Letsche,Lesiak,Leshinsky,Leriche,Leri,Lepri,Leppke,Lepping,Lepp,Lepo,Leonhard,Leonello,Leona,Leofsky,Lensing,Lenoci,Lennington,Lennihan,Lenn,Lenkiewicz,Lenis,Lenertz,Lenehan,Lenci,Lenarz,Lemucchi,Lemick,Lelah,Lelacheur,Lejenne,Leitman,Leithoff,Leistiko,Leipert,Leibert,Leibe,Lehnertz,Leheny,Lehar,Lehane,Legorreta,Legoff,Legleu,Legions,Leggat,Leggans,Legaard,Left,Leesmann,Leemaster,Leemans,Ledwig,Ledlie,Lederhos,Lecorchick,Leclear,Leclare,Leckman,Leckbee,Lebrecque,Lebahn,Leavenworth,Leatherberry,Leamer,Leady,Lazzeri,Lazarini,Lazarine,Laza,Layng,Lawshe,Lawman,Lawer,Laware,Lavista,Lavis,Laviola,Lavinder,Lavern,Lavene,Lavelett,Lavanway,Lavanchy,Lavalette,Lavala,Lavadie,Lava,Lautzenheiser,Lautt,Lauser,Laurimore,Lauridsen,Laurey,Laurenti,Laurente,Laurenitis,Laurelli,Laukitis,Laud,Lattrell,Lattner,Latterell,Latten,Lattari,Lattanzi,Latif,Lastufka,Lasswell,Lasseson,Lassa,Laslo,Laski,Lashute,Lashmet,Larrieu,Larrier,Larribeau,Laronda,Larney,Larita,Lariccia,Largin,Larez,Lardin,Larch,Lapusnak,Laprete,Lapre,Lapradd,Lapore,Lapinsky,Lapid,Laperriere,Laos,Lantto,Lantaff,Lanson,Lanois,Lanius,Lanini,Languirand,Languell,Langstraat,Langreck,Langkabel,Langill,Langeness,Langefels,Langarica,Langager,Lanfranco,Lanfear,Lanfair,Landvatter,Landolfi,Landborg,Lanagan,Lampson,Lampshire,Lamoreux,Lambrukos,Lambrakis,Lamborne,Lambing,Lamax,Lamarch,Lallave,Lalka,Lais,Lairy,Laiben,Lahren,Lahn,Lahmers,Lah,Lagory,Laforrest,Laflore,Lafkas,Lafield,Lafay,Laduc,Laderer,Ladell,Ladakakos,Lacoy,Lacki,Lacio,Lacinski,Lachowsky,Lacerda,Lace,Lacasa,Labruzzo,Labre,Labove,Laberpool,Labbadia,Labarba,Labady,Kytle,Kym,Ky,Kwasnicki,Kwapniewski,Kwang,Kuzminski,Kuzel,Kuwahara,Kut,Kusko,Kusick,Kuruvilla,Kurtulus,Kurtis,Kurtich,Kurkowski,Kurkeyerian,Kuritz,Kurelko,Kurcaba,Kuralt,Kuprewicz,Kupetz,Kuntzman,Kunishige,Kundtz,Kulwicki,Kulow,Kulis,Kuhlmey,Kufel,Kues,Kuehnel,Kudrick,Kudlacik,Kudej,Kuchel,Kuchan,Kucha,Kuboushek,Kubishta,Kubilus,Kubert,Kubeika,Kubasik,Kuakini,Krzyston,Krzeczkowski,Kryzak,Krygier,Kry,Krupski,Krupke,Krupansky,Krumvieda,Krumholz,Krumbholz,Krudop,Krstic,Krovious,Krommes,Kromm,Krolak,Kroes,Kroening,Kroener,Kritter,Kristy,Krisman,Kriege,Kridel,Kreul,Kretsinger,Kretlow,Kresal,Krejsa,Kreines,Kreig,Krefft,Krauskopf,Kratt,Krassow,Krasnecky,Krance,Krajcik,Krail,Kraham,Krack,Kozloff,Kozlak,Kozera,Kozee,Koyama,Kowalowski,Kowalchuk,Kovalovsky,Kovalcheck,Koutz,Kotts,Kostyk,Kosty,Kostohryz,Kostiuk,Kostis,Kostick,Kosofsky,Kosman,Kosin,Kosier,Kosen,Kosco,Koschnitzki,Kosbab,Kosack,Korzep,Korvin,Kortkamp,Kornrumpf,Korfhage,Kordus,Korchnak,Koppinger,Kopinski,Kopald,Kooyman,Koopmans,Koonz,Kooker,Kooch,Konzal,Konye,Kontogiannis,Konruff,Konowal,Konopnicki,Konopacky,Konopacki,Konig,Konicki,Konecni,Kondel,Konakowitz,Komlos,Kombe,Komatz,Kolm,Kollmeyer,Kollasch,Kolin,Kolden,Kolbo,Kolata,Kolaga,Kokocinski,Koko,Koinzan,Kohrman,Kohnz,Kogler,Koets,Koerwitz,Koep,Koenecke,Koehly,Kockler,Kocka,Kociolek,Kobie,Knudsuig,Knoten,Knotek,Knole,Knochel,Knobbe,Knightstep,Knigge,Knife,Kniess,Knickelbein,Kneisler,Kneedler,Knedler,Knall,Knable,Klym,Klussmann,Kluever,Kludt,Klouda,Klotzbach,Klosowski,Klockars,Klinker,Klingshirn,Klingelhoets,Klingelhoefer,Klena,Klempa,Klemisch,Klemens,Klemencic,Klemen,Kleinhenz,Klecha,Klebanow,Klebanoff,Klave,Klang,Klammer,Klamet,Klaers,Klacic,Kjar,Kivisto,Kivel,Kitzrow,Kitzerow,Kitz,Kiszka,Kistenmacher,Kisicki,Kisak,Kirylo,Kirson,Kirschke,Kirmer,Kirakosyan,Kinton,Kint,Kinsland,Kinlock,Kini,Kingsolver,Kingdon,Kindschuh,Kindlimann,Kindl,Kindberg,Kinas,Kinaj,Kimberl,Killoy,Killette,Killer,Killary,Kilgor,Kildoo,Kilborne,Kilbert,Kil,Kijek,Kiewiet,Kiever,Kiesz,Kiessling,Kielar,Kiehn,Khosravi,Kholodivker,Kho,Khatib,Khatcherian,Keyworth,Keylor,Kewanwytewa,Kettman,Kettlewell,Kettl,Kettelle,Kethcart,Ketay,Keslar,Kesby,Kerne,Kerk,Kercy,Kerchal,Kerbel,Kenrick,Kennis,Kennin,Kennemuth,Kennelty,Kenkel,Kemmerling,Kemfort,Kelstrom,Kellow,Kellom,Kelk,Keliiholokai,Kelcourse,Kekua,Keiger,Keglovic,Keesecker,Keehne,Keedah,Keding,Keavney,Keanu,Keagy,Keaffaber,Keadle,Kazemi,Kazanowski,Kazanjian,Kazan,Kawelo,Kavanah,Kautzer,Kaukola,Kaufusi,Kauffeld,Katowicz,Katos,Katheder,Kately,Kata,Kastor,Kastl,Kassouf,Kassler,Kassam,Kaskey,Kasimis,Kasdon,Kaschmitter,Kaschel,Karratti,Karpinen,Karpen,Karmann,Karlovich,Karlen,Karkut,Karin,Kariger,Karaffa,Kapsos,Kapps,Kapnick,Kanoa,Kanney,Kannas,Kanduth,Kampman,Kamimura,Kamens,Kamemoto,Kalvaitis,Kaltenhauser,Kalloch,Kaller,Kallenberg,Kaliszuk,Kalinoski,Kalinger,Kalich,Kalfus,Kalfayan,Kalert,Kalenkoski,Kalen,Kaleiwahea,Kaleel,Kaldas,Kalawe,Kalathas,Kakos,Kaiserman,Kais,Kailiponi,Kaighn,Kahuhu,Kahoun,Kahen,Kahaleua,Kah,Kagy,Kager,Kagarise,Kaffka,Kaempfer,Kaemmerer,Kaelker,Kady,Kadner,Kadlubowski,Kadakia,Kacynski,Kacic,Kach,Kabrick,Justman,Justine,Jurina,Jurik,Jurcik,Junius,Jumalon,Julca,Jui,Jugan,Juart,Jove,Journeay,Joung,Jou,Josilowsky,Josephsen,Josephpauline,Jorde,Joor,Jonte,Jolie,Johnke,Johanningmeie,Joerg,Jochems,Jilk,Ji,Jhonston,Jez,Jethva,Jethro,Jest,Jesko,Jerrel,Jerich,Jentsch,Jensvold,Jennrich,Jenious,Jenck,Jemenez,Jelle,Jelinski,Jeleniewski,Jelen,Jeffrie,Jefford,Jedik,Jebbett,Jayes,Javarone,Jauss,Jaus,Jaskolski,Jasionowski,Jasin,Jarzynka,Jarva,Jaruis,Jaross,Jaret,Jaquess,Janovich,Jannusch,Jann,Jankins,Janitz,Janicke,Jangula,Jamon,Jammer,Jamie,Jameel,Jakupcak,Jakubczak,Jakowich,Jakeman,Jagneaux,Jagher,Jaekel,Jadin,Jacobowitz,Jackstadt,Jackowiak,Jackiewicz,Jackels,Jabour,Izsak,Izarraras,Iwasa,Iwanyszyn,Iulo,Iuliucci,Iturbide,Itkin,Isby,Isam,Isales,Isackson,Irizarri,Iribarren,Irani,Iracheta,Iott,Ioli,Iodice,Ioannidis,Intriago,Interrante,Intermill,Insco,Inloes,Ingrim,Inglin,Inglese,Ingala,Infield,Inestroza,Ineson,Indest,Incorvaia,Inacio,Imparato,Imm,Imfeld,Imaizumi,Illescas,Ikuta,Iino,Ignasiak,Igler,Igel,Iffert,Idris,Idema,Ichinotsubo,Ichinose,Iburg,Iarossi,Iannaccone,Iams,Iacovissi,Hytros,Hyten,Hysinger,Hylle,Hylinski,Hvizdos,Huyghe,Huus,Hutsler,Hutchen,Hustus,Huso,Husni,Huslander,Huska,Hush,Huschle,Husayko,Husanini,Hurtis,Hurter,Hurrington,Hurrigan,Hurl,Hurban,Hunten,Hundemer,Humerickhouse,Humbel,Hulstine,Hulm,Huitzacua,Hughlett,Huger,Huewe,Huels,Hudrick,Hudek,Huckeby,Hubright,Hubric,Hubel,Hsi,Hryniewich,Hrovat,Hronick,Hribar,Hozempa,Hoxworth,Howryla,Howison,Howieson,Howdeshell,Hoving,Hovi,Hovelson,Hovell,Houten,Housten,Housekeeper,Houpe,Houp,Houman,Houghland,Hougas,Hothan,Hotchkin,Hoste,Hosie,Hosendove,Hoseman,Hoseck,Hoschouer,Horwood,Horuath,Hortillosa,Horth,Horsfield,Horniak,Hornby,Hormander,Horii,Hores,Horaney,Horal,Hopskins,Hoppesch,Hoopengardner,Hoomana,Hoolihan,Hoof,Honzel,Honse,Honohan,Hongo,Hongerholt,Homola,Homerding,Homchick,Holy,Holvey,Holsing,Holshue,Hollenberg,Hollemon,Holla,Holka,Holifeild,Holets,Holdt,Holdness,Holdiness,Holda,Holcey,Holbein,Hoium,Hoisl,Hohstadt,Hohowski,Hoh,Hogy,Hogsten,Hogsette,Hoggins,Hofler,Hoffstot,Hoffschneider,Hoffee,Hoevel,Hoernemann,Hoeper,Hoener,Hoene,Hoeke,Hoeg,Hoeflich,Hoeffner,Hoeffliger,Hoecker,Hoeck,Hoe,Hodgen,Hodan,Hockema,Hochschild,Hobkirk,Hnatow,Hledik,Hjalmarson,Hitzler,Hittman,Hisman,Hirstein,Hirschhorn,Hirsche,Hirkaler,Hiraoka,Hiraki,Hipwell,Hippo,Hinsey,Hinkey,Hinish,Hingst,Hingle,Hindin,Hinahon,Himelstein,Hillburg,Hillaire,Hilgert,Hildred,Hildahl,Hilcher,Higueros,Higle,Higinbotham,Hieserich,Hidvegi,Hidrogo,Hickton,Hickonbottom,Hickert,Hibl,Heyveld,Heydel,Hevner,Hevesy,Heverley,Heverin,Heusley,Heuberger,Hettwer,Hett,Heter,Hesters,Hessong,Hessing,Hessenthaler,Hessell,Hessee,Hesby,Herzberger,Herwood,Herting,Herscher,Herschel,Herrling,Herrig,Herriage,Herrel,Herre,Herpolsheimer,Hernanders,Hermosura,Hermie,Hermens,Herklotz,Herkert,Herby,Herbster,Herbison,Herbers,Herbein,Heppeard,Henrick,Henrey,Henretta,Henneberg,Hennagin,Henington,Henifin,Heney,Henesey,Henehan,Hendy,Henderosn,Hender,Hendee,Henby,Henaire,Hemrich,Hemmie,Hemmes,Hemlepp,Heminover,Hemauer,Helvy,Helsing,Helmy,Helmstetler,Helmink,Helmcamp,Hellar,Hellams,Helker,Helgesen,Helfritz,Helena,Hele,Hektner,Hejl,Heitschmidt,Heitger,Heinzmann,Heinzen,Heininger,Heineken,Heimrich,Heimbaugh,Heiermann,Hehr,Hegre,Hegmann,Hefler,Hefflinger,Heese,Heeney,Heemstra,Hedrich,Hedgespeth,Hedemann,Hedegore,Heddlesten,Heckenberg,Hebig,Hebden,Hebda,Heatly,Heathershaw,Hearson,Heally,Healan,Heads,Hazleton,Hazarika,Hayhoe,Haydal,Hayburn,Hawthrone,Hawman,Hawkey,Hawf,Havice,Havercroft,Hautamaki,Hauskins,Haulter,Haugrud,Hauan,Hatzenbuhler,Hatzenbuehler,Hattub,Hattier,Hatteyer,Hatstat,Hathway,Hataway,Hassick,Hassian,Hasselman,Hasselbarth,Hasper,Haspel,Haske,Hasgill,Hasen,Harviston,Harvilla,Harvilicz,Harver,Hartzer,Hartup,Hartsough,Hartsch,Hartly,Hartlep,Hartlein,Hartkopf,Harthun,Hartfiel,Hartery,Hartert,Hartage,Harsey,Harrey,Harrett,Harral,Haroutunian,Harmeyer,Harlowe,Harloff,Hardyman,Hards,Hardrict,Hardmon,Hardigree,Hardenburg,Hardell,Hardebeck,Hardaman,Hardaker,Harcey,Harbick,Harajli,Happer,Hapgood,Hanstein,Hansbury,Hanold,Hanohano,Hano,Hanns,Hannifan,Hannes,Hanko,Hanis,Hanenkrat,Hanemann,Hanek,Handzel,Handwerker,Handwerk,Handsaker,Handrick,Handelsman,Handal,Hancin,Hanbury,Hanaway,Hanahan,Hams,Hammerly,Hammeren,Hammatt,Hammarlund,Hamling,Hamiss,Hamiel,Hamelinck,Hambrecht,Halo,Hallinger,Hallick,Halifax,Halgrimson,Halfmann,Halder,Hald,Halburnt,Halberstam,Halaby,Haker,Haken,Haine,Hagos,Hagmaier,Hagenson,Hagene,Hagenbrok,Hagenbaugh,Hafter,Haffling,Haeger,Haegele,Hade,Hadder,Hadcock,Haczynski,Hackle,Hachigian,Hachez,Habrock,Habowski,Habina,Haberkamp,Habben,Habash,Haaby,Gyatso,Gwalthney,Guziec,Guziak,Guys,Guynup,Gutzwiller,Guttmann,Gutting,Gutteridge,Guterrez,Guszak,Gusky,Gusciora,Gurry,Gurrieri,Guritz,Gunst,Gundry,Gundert,Gulsvig,Gulisano,Gulinson,Guittar,Guitard,Guisti,Guiski,Guinto,Guinther,Guinnip,Guilliam,Guillerault,Guilfoil,Guijarro,Guidetti,Guiberteau,Guger,Guevera,Guetersloh,Guerini,Guella,Guedea,Guecho,Gudis,Guckin,Guberman,Guardipee,Guanio,Guagliardo,Grzegorek,Grybel,Grunst,Grunlien,Grundmeier,Grundhoefer,Grun,Grumer,Grum,Gruhn,Gruger,Grudt,Growney,Grotts,Groton,Grotelueschen,Grotberg,Grosswiler,Gronowski,Gronosky,Gronewald,Gronert,Groholski,Groetken,Groeschel,Groene,Grodecki,Groceman,Griswell,Griseta,Grinkley,Grinie,Grinberg,Grimmius,Grieme,Greytak,Grett,Grenke,Grenda,Greinke,Greeves,Greever,Greet,Greenlun,Greenler,Greenham,Grebin,Grboyan,Grawburg,Grattelo,Grassham,Granvold,Granthan,Gransky,Grandolfo,Grandmaison,Grandchild,Granbois,Gramolini,Grammatica,Gramc,Grajek,Grahe,Gragson,Gragert,Grage,Grafenstein,Graetz,Gracely,Graceffo,Grabarczyk,Gouzalez,Gouse,Gourdin,Goudelock,Goud,Gottlob,Gottke,Gotthelf,Gotthard,Gotter,Gotsche,Gotschall,Gosz,Goston,Gossack,Gosdin,Gorz,Gorrill,Gornto,Gornie,Gorenberg,Gorelli,Gordinier,Gora,Gopin,Gopie,Goolman,Goolden,Goodsite,Goodmanson,Goodly,Goodkin,Goodiel,Gonzolas,Gonsior,Gonseth,Gonez,Gonchoff,Gonales,Gomzales,Gomora,Golly,Gollihar,Gollhofer,Golka,Golinski,Golen,Golembeski,Golemba,Goldwater,Goldstock,Goldklang,Goldbeck,Golda,Gojmerac,Goich,Gohlke,Goger,Gogel,Goga,Gofton,Goffe,Goetting,Goeser,Goerner,Goerke,Goerdel,Goeppner,Godsman,Godert,Godel,Gobeli,Gnas,Glucksman,Glotzbecker,Gloeckner,Glockner,Glish,Glickson,Glicken,Glew,Glessing,Gleichman,Glazener,Glave,Glausier,Glatzel,Glassett,Glasbrenner,Gladu,Glab,Glaab,Giza,Gittler,Gittleman,Gittinger,Gitting,Gitthens,Gissel,Gischer,Girst,Girsch,Girona,Girillo,Gire,Gira,Giovanetti,Gionest,Gingles,Gingery,Ging,Gillstrap,Gillson,Gillotti,Gillmor,Gilliss,Gillig,Gillert,Gillcrest,Gilgour,Gilgore,Gilding,Gilderman,Gilcreast,Gieseman,Gieselman,Gieringer,Gick,Giangrosso,Giangregorio,Giambra,Giambattista,Ghibaudy,Ghianni,Ghelfi,Ghaziani,Ghantt,Ghant,Ghaemmaghami,Gey,Getler,Getchius,Gesualdo,Gesmondi,Gerweck,Gerwe,Gerula,Gertsen,Gershey,Gershen,Gers,Gerritsen,Gerdsen,Gerczak,Gerbatz,Gerba,Gerache,Georgl,Georgiadis,Georgelis,Georgalas,Genualdo,Gentery,Gennock,Gennett,Genett,Gendernalik,Genas,Gena,Gemmen,Gelston,Gellman,Gelfo,Gelen,Gelbowitz,Geibig,Gehlhausen,Geffre,Geesaman,Geel,Gedman,Geckles,Gebbie,Gearwar,Gearlds,Gayne,Gayfield,Gawlas,Gauwain,Gaufin,Gauani,Gastley,Gastello,Gassoway,Gasparino,Gaskey,Gaser,Gascot,Garuti,Garrington,Garreh,Garnand,Garlits,Garity,Garitty,Gariety,Garia,Gari,Garetson,Garelik,Garding,Garb,Garasha,Ganzer,Gantert,Ganotisi,Ganner,Ganison,Ganie,Gangell,Gangel,Ganesh,Gandrud,Ganas,Gamby,Gambles,Galyan,Galuski,Galper,Gallwas,Galluzzi,Gallups,Gallosa,Gallipeau,Gallet,Gallerani,Gallegly,Gallaty,Gallaspy,Gallander,Galioto,Galicinao,Galer,Galdon,Galardi,Galamay,Galabeas,Gala,Gaitor,Gagg,Gagan,Gaerlan,Gadley,Gacke,Gacia,Gach,Gabrelcik,Gabay,Gabard,Fylnn,Fydenkevez,Futter,Fuse,Fuscaldo,Furstenberg,Furmanik,Furlone,Furia,Furer,Furci,Furbish,Funt,Fulker,Fukano,Fujino,Fuhrmeister,Fugo,Fuerman,Frymyer,Fryling,Frontz,Froncek,Fronce,Frolich,Froio,Froid,Froehle,Frischman,Friou,Friot,Frieze,Friesz,Friemering,Frieman,Friedrick,Friedle,Frickson,Frickel,Frichette,Fricano,Fribley,Frewing,Frever,Freudenstein,Frerking,Frenger,Freisner,Fregeau,Freedle,Frease,Frazey,Frascone,Franzmann,Franzetti,Frankforter,Francy,Franckowiak,Francies,Franchette,Fralin,Fraleigh,Fraint,Fragozo,Fracchia,Frabizzio,Fousek,Fouraker,Foucault,Fosson,Fossati,Fosnough,Forts,Forthman,Forsting,Forstedt,Forshay,Forshaw,Forsha,Forro,Forno,Forlivio,Forkosh,Forkan,Forcello,Foradori,Fontane,Fonger,Foney,Fondy,Fondow,Folta,Follin,Folliard,Folley,Folken,Foiles,Fohn,Foggs,Foesch,Foertsch,Foecking,Fodness,Foat,Flot,Flosi,Florenz,Florens,Florencio,Florea,Florczak,Flodin,Flocke,Flo,Flentroy,Flenard,Fleisner,Flecther,Flaks,Flagstad,Flagel,Fjetland,Fixico,Fiume,Fitterer,Fisette,Firlit,Firestein,Fiotodimitrak,Fioto,Finner,Finnefrock,Fingado,Finely,Fincel,Finau,Fimbrez,Filoteo,Fillpot,Fillare,Filipski,Filippo,Filipovic,Filipelli,Filimaua,Filhiol,Filgo,Fileds,Filbert,Figuera,Figliola,Figart,Fietsam,Fieselman,Fiene,Fieldhouse,Fiebig,Fidel,Fida,Fickert,Fiato,Fevold,Feuerborn,Fetchko,Fesh,Feser,Ferruso,Ferriolo,Ferriola,Ferrence,Ferrar,Ferran,Ferraiz,Feroz,Ferone,Fernstrom,Fernstaedt,Fernow,Ferkovich,Fergen,Ferdolage,Ferdinandsen,Ferbrache,Fennewald,Fenk,Fenix,Fendler,Fenchel,Felske,Fellinger,Felicetti,Feldpausch,Feighan,Feichter,Fehrle,Fehringer,Fegaro,Feener,Feeler,Fedorchak,Federowicz,Fedd,Feauto,Feagen,Feaganes,Fazzina,Fazzi,Faykosh,Fayard,Favuzza,Favolise,Fausset,Fauske,Fausel,Fauscett,Faulknen,Faulkenburg,Fatica,Fastlaben,Fastic,Farzan,Farstvedt,Farin,Farguharson,Fargnoli,Farfalla,Farese,Farer,Faraldo,Faraj,Fara,Fanzo,Fanton,Fanney,Fanizzi,Fanion,Fanelle,Falterman,Falsetti,Fallone,Falkiewicz,Falconio,Fake,Fairleigh,Fahringer,Fahrenkrug,Faerber,Fadley,Fadeley,Facundo,Fack,Face,Faby,Fabrizius,Fabozzi,Fabiszewski,Fabin,Ezpeleta,Ezparza,Eyrich,Eyerman,Ewoldt,Ewards,Evasco,Evanich,Evangelo,Eustace,Eugley,Euertz,Etulain,Etchells,Esson,Esskew,Essery,Esselink,Espinol,Espenoza,Espelien,Espeland,Espadas,Esler,Eske,Eska,Escuriex,Escovar,Escort,Eschrich,Eschette,Eschen,Eschbaugh,Escalon,Escalero,Esbrandt,Esary,Ertman,Eroh,Ernesto,Erlenbusch,Erle,Erke,Erichsen,Eric,Erholm,Erbstein,Erbst,Eppolito,Eppihimer,Eppich,Entin,Enslinger,Enslen,Enockson,Ennenga,Enman,Englett,Engleson,Englerth,Engl,Engholm,Engelken,Engelkemier,Engelhaupt,Engelbach,Endries,Endow,Endito,Enderby,Encallado,Emziah,Embt,Embs,Embelton,Emard,Elwonger,Elvsaas,Elumbaugh,Elstner,Elsmore,Elskamp,Elshant,Elmblad,Ellson,Ellias,Elletson,Ellestad,Ellert,Ellermann,Ellerbrock,Elleman,Ellars,Elland,Eliezrie,Eldib,Eldert,Elbe,Ekwall,Ekholm,Eken,Eitnier,Eitniear,Eisenzimmer,Eisenstadt,Eisensmith,Eiselman,Eisbach,Eisaman,Eiken,Eibell,Ehrke,Ehrismann,Ehrenfeld,Ehlman,Egizi,Egitto,Eggeman,Effron,Ednie,Edelbrock,Edde,Edd,Economos,Eckols,Eckloff,Echegoyen,Ebia,Eberlin,Ebbers,Easterbrook,Earney,Earleywine,Eanni,Eadens,Dyron,Dykhoff,Dyers,Dyda,Dybala,Dwane,Dwaileebe,Duverne,Duve,Dusen,Dusatko,Dusablon,Durrette,Durphey,Durnin,Durkes,Durette,Durdy,Durch,Duracher,Dupray,Dupoux,Duponte,Duperclay,Dupass,Dupar,Dunwiddie,Dunsing,Dunnaville,Duncomb,Duncklee,Dunay,Dunakin,Dumpe,Dumes,Dumdei,Dumay,Dulkis,Dukich,Dukas,Duin,Dugo,Duewall,Duemmel,Duelm,Dueber,Dudman,Dudak,Duckhorn,Duchscherer,Ducat,Ducas,Dubyk,Dubill,Dubiansky,Dubaldi,Dua,Dspain,Drzazgowski,Drymon,Drylie,Druvenga,Druschel,Drungo,Droze,Drouse,Drott,Drosick,Droneburg,Droessler,Droesch,Drobny,Drizin,Dripps,Drinkley,Drillock,Driesbach,Dretzka,Dresner,Drentlaw,Drenon,Drehs,Drehobl,Drda,Draxler,Drath,Drapeaux,Dragula,Drafts,Draft,Dozer,Doxtater,Doxie,Dowst,Dowson,Downton,Dowlen,Dowey,Dowery,Douty,Doughtry,Doughtery,Dotzler,Dotterer,Dothard,Dosher,Dosal,Dorso,Dorsette,Doro,Dornfeld,Dorkin,Dorka,Dorge,Dorchy,Dorame,Dopler,Dopico,Doore,Dooms,Donnie,Donnelley,Donnel,Donayre,Donatello,Donachie,Dominiguez,Domingos,Dominga,Dominey,Domenget,Dolores,Dollyhigh,Dollen,Dollak,Doleac,Dolch,Dolbeare,Dokka,Dokes,Doire,Doing,Dohring,Dohogne,Dohnal,Dohan,Doerle,Doerhoff,Doemelt,Doehring,Doegg,Dodsworth,Dodoo,Dodier,Dockendorf,Docken,Dobrowski,Dobrin,Dobine,Doberstein,Dizer,Dixey,Divita,Diven,Divalerio,Dituri,Ditton,Disspain,Disparte,Dismore,Disilvestro,Dishong,Dishian,Diseth,Discenza,Dirkson,Dirkse,Dirker,Dirk,Dipippo,Dipinto,Dipierro,Dinnocenzo,Dinizio,Dinis,Dingivan,Dingfelder,Dincher,Dimucci,Dimpson,Dimpfl,Dimitrov,Dimarzo,Dils,Dilisio,Diliberto,Diliberti,Diles,Dileonardo,Dilena,Dijulio,Diiulio,Digiuseppe,Diga,Difillippo,Difebbo,Dieng,Diekman,Didyk,Didriksen,Dickus,Dickow,Dickeson,Dicastro,Dibenedetti,Dhaliwal,Dezenzo,Dewyse,Dewinter,Dewaters,Dewaele,Devoto,Devor,Devoogd,Deviva,Devitis,Devit,Deveyra,Devericks,Devenuto,Deveja,Devaughan,Deutschendorf,Deuink,Deubner,Detzler,Detullio,Detore,Dethlefsen,Dethlefs,Detamble,Desrevisseau,Desotel,Deso,Desmeules,Desmaris,Desilvio,Deshpande,Deschambault,Descamps,Desatnik,Desamito,Desalle,Desak,Derwin,Derting,Derrah,Deroven,Derosso,Deromer,Dermott,Deringer,Derico,Derga,Derflinger,Derezinski,Derck,Derbacher,Deranick,Depuydt,Depung,Depree,Deppert,Depierre,Dephillips,Deojay,Denzin,Denten,Dentel,Dennies,Denina,Denger,Deneke,Denegre,Denboer,Denapoli,Demsky,Demsey,Demotta,Demmons,Demman,Demendonca,Demeester,Dembowski,Demarce,Deman,Demallie,Demaire,Delwiche,Delphia,Delore,Dellenbaugh,Dellbringge,Dellaratta,Dellaporta,Dellapenna,Dellacioppa,Deliberto,Delibertis,Delgenio,Delcueto,Delaurie,Delauder,Delatrinidad,Delash,Delaet,Del,Dekrey,Dejoie,Deiters,Deimund,Degrenier,Degre,Degrand,Degon,Degeston,Degelbeck,Degaust,Degasparre,Defreece,Defenderfer,Defee,Deeken,Dedon,Dedinas,Dedicke,Dedic,Decristofaro,Decoud,Decos,Deconti,Deckers,Decio,Decenzo,Debroux,Debrot,Debray,Deboef,Debiasio,Debettignies,Debenedittis,Debbins,Debaecke,Dearson,Dearo,Deardon,Deaquino,Deacetis,Dayne,Dayem,Dax,Dawoud,Davitt,Davito,Davidoff,Dauterman,Daughterty,Daugaard,Daudelin,Daubendiek,Dattilio,Datcher,Dasovich,Daso,Dasilua,Dashem,Darou,Darke,Dargin,Darga,Darco,Darcey,Dapas,Dantos,Danson,Danny,Danielian,Danchetz,Danby,Damrow,Damours,Damboise,Dambakly,Dambach,Damasco,Damann,Dallmeyer,Dallesandro,Dalfonso,Dakins,Dakes,Daire,Dahill,Daguio,Dagis,Dabdoub,Czerkies,Czarnota,Czachor,Czach,Cypress,Cynthia,Cylkowski,Cyfers,Cwiakala,Cvetkovic,Cuzman,Cuzick,Cuttler,Cutt,Cuti,Cutforth,Cutchins,Cutchall,Cushwa,Curo,Curbeam,Cunnick,Cuneio,Cundick,Cumbaa,Cultice,Cullity,Cullip,Cullifer,Cucvas,Cuculich,Cucino,Cubeta,Cser,Crupper,Crunkilton,Cruden,Crover,Crouter,Crough,Crouchet,Crosthwaite,Croon,Cronshaw,Cronenberg,Crome,Croman,Crognale,Crogan,Croasmun,Cristofori,Cristiano,Crisan,Cringle,Crincoli,Crill,Crieghton,Cridge,Criblez,Crellin,Cregeen,Creeks,Creath,Creacy,Crazier,Crawmer,Crawhorn,Cratin,Crapser,Crapse,Cranmore,Cramm,Cramblit,Cramblet,Cragin,Cracas,Cozzone,Coyco,Coxey,Cowper,Cowett,Covone,Covill,Coverton,Councilman,Coultrap,Coulas,Coughenour,Cough,Cotty,Cotherman,Cother,Costantini,Cossell,Cossano,Cosley,Coslett,Coskey,Cosgray,Corza,Corvi,Corvan,Corsetti,Corscadden,Corsa,Corrow,Corrice,Correro,Correale,Corre,Corna,Corke,Corid,Corelli,Cordonnier,Cordona,Corak,Coppler,Copelan,Coore,Coonradt,Coones,Cookus,Conveniencia,Contrerras,Contrenas,Contorno,Constantini,Constantineau,Consolver,Conrath,Connet,Connerly,Conliffe,Conforto,Conda,Conca,Conales,Compono,Compau,Commendatore,Comings,Comboy,Combass,Coltrin,Colpetzer,Colonel,Colombini,Cologie,Colla,Colbeth,Colbaugh,Colasuonno,Colapinto,Colamarino,Colaluca,Colaianni,Colafrancesco,Colace,Colabella,Coggsdale,Coffill,Codispoti,Codell,Cocoros,Cocopoti,Cocola,Cockley,Cockey,Cochron,Coch,Cobden,Coatsworth,Coarsey,Coar,Clymore,Clumpner,Clougher,Clolinger,Clinkingbeard,Clineman,Clewes,Clemments,Claypole,Clayburg,Claybron,Claybon,Claughton,Clase,Clarenbach,Clankscales,Clampett,Claessens,Claburn,Citrin,Cisney,Cirri,Cipro,Cipkowski,Cione,Cinquanti,Cink,Cimiano,Ciervo,Ciers,Cicora,Ciciora,Cicione,Cicerelli,Ciccolini,Ciccarone,Cicarella,Ciarletta,Ciaccio,Chuta,Chustz,Churan,Chumbler,Chuba,Chruch,Christler,Christinsen,Christinat,Christello,Chrispin,Chrismer,Chrislip,Chrisjohn,Chrestman,Choute,Chough,Chorlton,Chomka,Chmelicek,Chiulli,Chislom,Chiras,Chinzi,Chinnery,Chinick,Chim,Chilvers,Chilo,Chiarmonte,Chiarenza,Chiapetti,Chhuon,Chhour,Chheang,Chetram,Chessher,Cherrier,Cherepy,Cherenfant,Chenot,Cheli,Checa,Cheathan,Chears,Chauvaux,Chaudoin,Chauarria,Chatters,Chatlos,Chatley,Chasey,Charves,Charsky,Charania,Chaplen,Chaple,Channer,Chander,Champey,Champeau,Challen,Chall,Chalkley,Chalet,Chalcraft,Chaix,Chadick,Chadbourn,Chaban,Cesari,Cervoni,Cervin,Certalich,Cerni,Cerney,Cereo,Cerce,Ceravolo,Ceparano,Centrella,Centner,Centano,Cenat,Celmer,Celenza,Celadon,Cefaratti,Cefalo,Cedillos,Cecilia,Cechini,Cecala,Cease,Cearns,Cazeau,Cayson,Cayanan,Cavallario,Cauthron,Cattrell,Catterson,Catrone,Catone,Catoggio,Caterino,Catching,Catalani,Castrataro,Castoe,Castles,Castillanos,Castellonese,Castelhano,Cassman,Cassius,Cassisse,Cassem,Cassani,Cassandra,Casola,Caselli,Cascone,Casburn,Casbeer,Casbarro,Carrin,Carreker,Carrea,Carre,Carrauza,Carranzo,Carpinello,Carolin,Carmolli,Carmena,Carmell,Carmain,Carlye,Carlsten,Carlough,Carlone,Caringi,Carine,Carin,Carela,Cardono,Cardle,Cardinali,Cardi,Cardera,Carback,Capuzzi,Capracotta,Cappo,Cappleman,Capparelli,Caponera,Caplener,Capanna,Caoili,Caoile,Canzio,Cantoran,Cantillo,Canta,Canonica,Cannington,Canniff,Cangas,Canevazzi,Canes,Caneles,Candido,Canders,Cance,Canaway,Canarte,Canario,Canan,Camren,Campusano,Campman,Camm,Caminos,Camferdam,Camerena,Camell,Camak,Camaj,Calway,Calvino,Calvetti,Calvani,Caltabiano,Calnimptewa,Calnick,Calnen,Calmese,Callander,Callabrass,Caliz,Calija,Calger,Calendine,Calderara,Calcara,Calamity,Cailler,Caho,Caguimbal,Cadoff,Caddick,Cadavieco,Cabos,Cabiltes,Cabibbo,Cabellero,Cabasso,Caballes,Cabading,Caal,Byra,Byod,Bynon,Byner,Bynam,Byker,Buzzi,Buzzeo,Butzen,Buttz,Butteris,Butkiewicz,Buteaux,Bustad,Bussone,Busman,Bushmaker,Busche,Burwinkel,Burum,Burtless,Bursi,Burrup,Burross,Burries,Burrichter,Burrelli,Buron,Buro,Burnstein,Burnaugh,Burnap,Burkdoll,Buris,Burington,Burgun,Burgie,Burghard,Burgh,Burgas,Burgardt,Burga,Burdess,Burcin,Burchfiel,Burchess,Burandt,Buonanno,Buonamici,Buntjer,Bungert,Bundschuh,Bumps,Buman,Bulosan,Bullocks,Bullie,Bularz,Buland,Bujarski,Buhmann,Buhman,Bugna,Buglisi,Buggy,Buemi,Budke,Buder,Budds,Buddie,Buczak,Buckwald,Buckovitch,Buckholtz,Buckhanan,Buchetto,Buchauer,Bucciarelli,Buccheri,Bucaram,Bubis,Bubash,Bubak,Brzostek,Brzezowski,Bryton,Brusuelas,Brussell,Bruschi,Brundrett,Brundin,Brumet,Bruley,Bruk,Brug,Bruestle,Brudner,Bruccoleri,Brozie,Broxterman,Brox,Browy,Brownle,Browm,Broward,Brouwers,Brousard,Brought,Brotherson,Brotemarkle,Brossoit,Broscious,Brooms,Broomhall,Brookshaw,Brookhouse,Bronchetti,Broks,Broida,Brohl,Broglie,Brofft,Broermann,Broenneke,Brodnex,Brodka,Brodish,Brockelmeyer,Brockberg,Broch,Broccoli,Brobeck,Broadstone,Brittman,Brislan,Brisk,Brisentine,Bringhurst,Brindel,Brinda,Brincks,Brimeyer,Brihm,Brignolo,Briglia,Brighi,Brient,Bridenbaker,Briddell,Briante,Brians,Briagas,Brevo,Breu,Bretto,Bretthauer,Breslauer,Bresemann,Brentari,Brenning,Brenhaug,Brengettey,Brenek,Brendal,Brenagh,Breiling,Breidenbaugh,Brehant,Bregel,Bredeweg,Bredehoft,Breceda,Braylock,Brause,Brauning,Braulio,Braukus,Braucher,Bratchett,Brasseur,Brasser,Branstutter,Branstad,Branscombe,Brannick,Brandolini,Brandly,Brandenberg,Brandeis,Brandal,Branciforte,Brancheau,Brancati,Bramlette,Bramlet,Brakhage,Braitman,Braisted,Bradfute,Bracks,Bracket,Braccia,Braam,Bozzone,Bozenski,Bozard,Boyson,Boylston,Boxwell,Bowlen,Bowdle,Bowdich,Boward,Bovia,Bovey,Boven,Bouza,Bouwman,Bouwkamp,Boutiette,Boursaw,Bourret,Bourgoyne,Bounleut,Bound,Bouma,Bouleris,Bouler,Boughman,Boughamer,Boudoin,Boudewyns,Botwinick,Bottone,Bottino,Botticello,Botten,Bottaro,Bottalico,Bostel,Boshes,Boshard,Bosell,Boscarello,Bory,Borsari,Borok,Borodec,Bornmann,Bormuth,Bormet,Borling,Borlace,Borkin,Borkenhagen,Boreen,Bordin,Borcherding,Boote,Booras,Boody,Bonton,Bontemps,Bonomini,Bonina,Bonifer,Bongartz,Boness,Bonefont,Bonefield,Bonder,Bonde,Bondanza,Bonavia,Bonamo,Bonadurer,Bomkamp,Bolognia,Bollich,Bollacker,Bolinsky,Boldosser,Boldon,Bolda,Bolado,Boken,Bok,Boisselle,Boisen,Bois,Bohs,Bohnenblust,Bohlig,Bohinc,Bogumil,Bogie,Boggioni,Boggi,Bogenschneide,Bogema,Boge,Bogdanski,Bogdanovich,Boettner,Boesiger,Boesel,Boensch,Boele,Boeken,Boehning,Boehlar,Bodwell,Bodreau,Bodovsky,Boda,Boczar,Boclair,Bockemehl,Bochenski,Bochat,Boch,Boccio,Bocchicchio,Boccanfuso,Bobzien,Bobson,Bobino,Bobier,Bobeck,Bobak,Boarts,Boardwine,Boaldin,Boakye,Boady,Blunden,Blumenstock,Blovin,Blouir,Bloschichak,Bloome,Bloodough,Blonder,Blommer,Blok,Bloeser,Blinks,Blinka,Bline,Blickem,Bleyl,Blews,Bless,Blenner,Bleimehl,Blecker,Bleasdale,Bleakney,Blatnick,Blaski,Blare,Blanzy,Blankumsee,Blancett,Blaich,Blada,Blackbum,Bjorseth,Bjorlin,Bizzaro,Bivin,Bitetto,Bisso,Biskup,Biskach,Bisio,Bisi,Bishard,Bisesi,Bisaccia,Birtcher,Birrittella,Birkhimer,Birkey,Biringer,Biren,Birdette,Birak,Bio,Binker,Bink,Bingler,Bingert,Bingamon,Bindas,Bilson,Billow,Billon,Billo,Bille,Bilis,Bilich,Biler,Bilek,Bilden,Bilazzo,Bila,Bigus,Biggart,Biggar,Bigaud,Biesheuvel,Biernacki,Bierley,Bierlein,Bielefeldt,Biedermann,Biedenbender,Biddulph,Bicksler,Bickes,Bicek,Bica,Bibiano,Biangone,Bi,Bezzo,Bezdicek,Beyt,Beydler,Bevelacqua,Beuther,Beucke,Betzold,Bettman,Bettino,Betterley,Betancourth,Bessel,Beska,Beschorner,Berwald,Berum,Bertotti,Bertorelli,Bertoldo,Bertolami,Bertley,Berteotti,Bertaina,Berstler,Berniard,Berndsen,Bernadette,Berlinski,Berkstresser,Berks,Berkovich,Berkoff,Berkhimer,Berkery,Bergmark,Berga,Berfield,Bereznak,Beresky,Berenger,Berendzen,Berendt,Berczel,Berch,Berbes,Berardinelli,Beppu,Benziger,Benzie,Benzango,Benthall,Bentancourt,Bensberg,Benno,Bennin,Bennes,Benken,Benike,Benigni,Benestad,Bendtsen,Bendis,Bendig,Bendetti,Bendele,Benasher,Benack,Bemben,Belts,Belrose,Belnas,Bellusci,Belloso,Bellizzi,Bellinghausen,Belliard,Belletto,Bellettiere,Belko,Belitz,Belfanti,Beldon,Bekis,Bejcek,Beitler,Beiser,Beine,Beiley,Beierschmitt,Behrle,Behran,Behlmer,Behlke,Beguelin,Beghtol,Beger,Begeal,Beezley,Beesmer,Beerer,Beere,Beerbohm,Beenel,Beelby,Beecken,Bedor,Bede,Beddows,Beddow,Beddia,Becky,Beckius,Beckfield,Beckem,Becena,Beavis,Beaumonte,Beauman,Beauharnois,Beaudine,Beasly,Beales,Be,Bazylewicz,Bazner,Bazel,Baytos,Bayton,Bayt,Baylock,Bayird,Baygents,Baxa,Bawner,Bawden,Bavelas,Bauske,Baumberger,Baul,Battuello,Battig,Batterman,Battani,Battaglino,Batimon,Bathke,Baters,Batch,Batas,Batara,Batala,Bastine,Bassani,Bassali,Baskind,Baseman,Basehore,Basara,Barze,Barwell,Barut,Baruffa,Bartlome,Bartin,Barthol,Barthell,Barters,Barswell,Barshaw,Barrigan,Barria,Barrasa,Barraco,Barnthouse,Barnt,Barmes,Barkhimer,Barios,Bario,Barino,Barie,Barick,Barfuss,Barfknecht,Barer,Bareford,Bardis,Barcley,Barchick,Barcena,Barbur,Barbor,Barbin,Barben,Barbella,Barbaglia,Baransky,Baragan,Baquiran,Banzhaf,Banter,Bankowski,Banet,Bandt,Banaszek,Banana,Balque,Balowski,Ballog,Ballina,Ballensky,Ballato,Baliga,Baldomero,Balden,Balde,Baldassare,Balbontin,Balbas,Balassi,Balandran,Bakkala,Bakhshian,Bakerville,Bakaler,Bajaj,Baites,Baisten,Bairam,Bailard,Baierl,Baichan,Bai,Bahrs,Bagozzi,Bagni,Bagnato,Baglione,Baggio,Baggesen,Baggenstoss,Bagan,Baessler,Baerman,Baerlocher,Badgero,Baddour,Badami,Baculpo,Bacio,Bacigalupo,Bachta,Bachar,Bacchi,Babrow,Babonis,Babish,Babicke,Babeu,Baab,Azzopardi,Azore,Azen,Aykroid,Axon,Axelrad,Awkard,Awender,Avon,Avirett,Averitte,Averbeck,Avellano,Avary,Auwaerter,Autrano,Auteri,Austgen,Ausdemore,Aurich,Aumen,Auler,Augustyniak,Augliano,Aughtman,Aue,Auduong,Aucter,Attianese,Atiles,Athas,Asturias,Astrup,Astley,Assante,Aspden,Aspacio,Asley,Asleson,Askvig,Askegren,Askam,Ashmen,Ashauer,Asfour,Aschoff,Aschim,Aschan,Asal,Arzo,Arvesen,Arrow,Arrocha,Arris,Arribas,Arquitt,Arone,Aroche,Arnt,Arnoux,Arnoldi,Arning,Arnholt,Arndorfer,Armson,Arment,Arlotta,Arlinghaus,Arlia,Arkema,Arizaga,Arisumi,Aristide,Aris,Arif,Ariano,Arguilez,Argudo,Argrow,Argiro,Argetsinger,Arfman,Arenburg,Aredondo,Area,Ardry,Ardner,Ardizone,Arcudi,Arcizo,Arcila,Archilla,Archangel,Arcega,Arbucci,Arato,Arano,Aran,Aragan,Apostol,Apolito,Apland,Apkin,Aperges,Apalategui,Apaez,Anzora,Antonsen,Antolos,Antolini,Antman,Anter,Anspaugh,Anselm,Annonio,Annichiarico,Annibale,Annarumo,Anliker,Ankrapp,Ankenman,Anhorn,Angton,Angrisano,Angon,Angolo,Angleton,Anglebrandt,Anglea,Anglade,Angilletta,Angeron,Angelotti,Angelbeck,Angela,Anez,Andueza,Andrulis,Andronis,Andreu,Andreoni,Andert,Anderlik,Anauo,Anastasiades,Ananias,Anand,Amuso,Amrich,Amr,Amour,Amoss,Amorosi,Amoako,Amoah,Ammirato,Ammar,Amirian,Amiot,Amidi,Ameduri,Amderson,Ambuehl,Amass,Amanza,Amadio,Alwang,Alwan,Alvine,Alvarran,Alvarracin,Alvanez,Aluqdah,Altshuler,Altonen,Altmiller,Altken,Altiery,Althiser,Altaras,Alstrom,Alstad,Alsbury,Alsberry,Alquijay,Alpha,Alonza,Aloia,Alnas,Almerico,Almenar,Almen,Allwood,Allstott,Allridge,Alleva,Allenson,Allenbaugh,Allegretta,Allegra,Allbritten,Allara,Allamon,Alken,Alizadeh,Alirez,Alires,Aline,Alim,Algire,Algier,Algien,Alfonsi,Alexy,Alexnder,Alessandroni,Alert,Alemany,Aleksey,Alderton,Alderfer,Aldava,Aldapa,Alconcel,Albornoz,Albini,Albergotti,Alben,Albea,Albang,Alario,Alamilla,Alalem,Akoni,Akles,Akande,Akamine,Ajasin,Aiyer,Aihara,Ahrendes,Aherns,Aharoni,Agunos,Aguliar,Aguillar,Agudo,Agoras,Agnor,Agni,Agers,Agel,Aery,Aerts,Adon,Adessa,Aderson,Aderman,Adema,Adelsberg,Adelblue,Adel,Addiego,Adas,Adamcik,Acquilla,Ackmann,Achterhof,Achane,Abuhl,Abrial,Abreau,Aboulahoud,Aboudi,Ablao,Abilez,Abete,Aberson,Abelman,Abelardo,Abedelah,Abdulmateen,Abato,Aas,Aarestad,Aanenson,Zymowski,Zyla,Zybia,Zwolski,Zwigart,Zuwkowski,Zurovec,Zurkuhlen,Zuppa,Zunich,Zumpfe,Zumalt,Zulkowski,Zulfer,Zugg,Zuerlein,Zuehls,Zuckerberg,Zuchelkowski,Zucchetto,Zucca,Zubrowski,Zubizarreta,Zsadanyi,Zrake,Zotti,Zosel,Zoltek,Zolla,Zogopoulos,Zogby,Zmek,Zitzmann,Zitzelberger,Zirker,Zinzow,Zimick,Zimerman,Zilk,Zigomalas,Ziesman,Ziernicki,Zierke,Zierk,Zierenberg,Zierden,Ziems,Zieger,Ziebert,Zicafoose,Zic,Zibell,Ziada,Ziad,Zhen,Zetzer,Zetino,Zerphey,Zercher,Zeran,Zephyr,Zelonis,Zellinger,Zelko,Zeliff,Zeleznik,Zekria,Zeidman,Zehrer,Zehrbach,Zeherquist,Zehender,Zegar,Zega,Zechiel,Zeccardi,Zebracki,Zeavala,Zbierski,Zaza,Zayicek,Zawistowski,Zawasky,Zavitz,Zaverl,Zavcedo,Zavattieri,Zavacky,Zausch,Zatorski,Zarrabi,Zarlingo,Zarin,Zarillo,Zaren,Zapel,Zapatero,Zantow,Zant,Zannini,Zangger,Zanfardino,Zanardi,Zan,Zampella,Zamoro,Zamborano,Zambelli,Zalamea,Zajdel,Zais,Zahourek,Zaharek,Zagulski,Zagacki,Zadina,Zaczek,Zachter,Zachariah,Zacchini,Zabenko,Zabbo,Yuska,Yuscak,Yurovic,Yurek,Yunes,Yumas,Yuk,Yudell,Ysaguirre,Yray,Yozzo,Yovan,Youssefi,Yousko,Younghans,Youmon,Youla,Yotter,Yoshi,Yoseph,Yorck,Yono,Yoneoka,Yonashiro,Yomes,Yokel,Yoest,Ynocencio,Yewell,Yetzer,Yetsko,Yerty,Yeropoli,Yerka,Yergin,Yenor,Yem,Yeley,Yearego,Yeakel,Yazzle,Yazzi,Yazdani,Yaws,Yasika,Yarwood,Yarris,Yaroch,Yarmitsky,Yara,Yantzi,Yannucci,Yannayon,Yannantuono,Yankovski,Yankovitch,Yandow,Yanchik,Yanagihara,Yanagida,Yanacek,Yamanoha,Yamaki,Yalon,Yaklin,Yake,Yaiva,Yaish,Yahne,Yafuso,Yafaie,Yacullo,Yacovone,Yacoub,Xyong,Xayasith,Wyze,Wyrostek,Wynes,Wyker,Wygal,Wybenga,Wurz,Wung,Wueste,Wubnig,Wubbena,Wubben,Wrzesien,Wrynn,Wrightington,Wride,Wreyford,Woytowich,Woytek,Wosick,Workowski,Worell,Wordlow,Worchester,Wooward,Woolhiser,Woodlin,Woodka,Woodbeck,Woodal,Wondoloski,Wonderling,Wolsdorf,Wolper,Wollert,Wollenburg,Woline,Wolfing,Wolfensperger,Wolbrecht,Wojnowski,Wojewoda,Wojdak,Wohlfeil,Wohlert,Woge,Woelfl,Wodicka,Wobser,Wobbe,Wnukowski,Wnorowski,Wmith,Wlodarek,Wiza,Witucki,Wittrup,Wittnebel,Witthoeft,Wittenbrink,Wittbrodt,Witkowsky,Wisnowski,Wisely,Wirtzfeld,Wirfs,Wipfli,Winterberg,Winslette,Winscott,Winnicki,Winnen,Winik,Wingeier,Windsheimer,Windrow,Windhorst,Windfield,Windauer,Wincapaw,Win,Wimbrow,Wimble,Wilund,Wilshusen,Wilsen,Willock,Willmert,Willies,Williemae,Williamis,Willia,Willi,Willeto,Willborn,Wilkus,Wilkson,Wilkoff,Wildridge,Wilczak,Wilcut,Wiklund,Wiggan,Wigand,Wig,Wiesemann,Wieseman,Wiersteiner,Wienberg,Wielock,Wielgasz,Wiegard,Wiedrich,Wiederholt,Wieben,Widjaja,Widera,Wide,Wicklin,Wickersheim,Wiborg,Wiatrowski,Why,Whittum,Whittinghill,Whittenbeck,Whitiker,Whitey,Whiter,Whitelightnin,Whitcome,Whisted,Whirlow,Whiles,Whilden,Whetzell,Whelihan,Wheeldon,Wheater,Whaltey,Weynand,Weyker,Weydert,Weuve,Wetzstein,Wetzell,Westler,Westermeier,Westermark,Westermann,Westerhoff,Westbrooke,Weske,Weser,Werst,Werremeyer,Wernsman,Wernex,Wern,Werme,Werline,Werk,Wergin,Werdlow,Werderman,Went,Wensman,Wenske,Wendorff,Welzel,Weltha,Wellinghoff,Welding,Weit,Weissenbach,Weispfenning,Weismantle,Weisbecker,Weirauch,Weinzierl,Weinrib,Weinland,Weinfurter,Weinburg,Weiher,Weig,Weidower,Weicht,Weibe,Wehking,Weglage,Wegiel,Wedige,Weckwerth,Weatherington,Weasel,Weant,Wealer,Weagraff,Weader,Wayts,Wayson,Waymon,Waygood,Wayford,Waychowsky,Waverly,Wattigny,Watsky,Watry,Wates,Watah,Wasurick,Wassam,Waskom,Waskin,Washum,Washpun,Washler,Waser,Warzybok,Warstler,Warrilow,Warran,Waroway,Warntz,Warnberg,Warmka,Warmbrod,Warlow,Warlock,Warde,War,Wapp,Wantuck,Wannlund,Wannarka,Wanko,Wandell,Walund,Waltos,Waltho,Walstrum,Walrod,Walper,Waln,Wallwork,Wallo,Wallman,Walliser,Wallie,Wallenbrock,Wallau,Walka,Walizer,Walgren,Waley,Walen,Waldroop,Walderon,Wal,Wakeford,Waitz,Waiss,Waisanen,Wais,Wainkrantz,Wahn,Wahdan,Wahba,Wagnor,Waggy,Wagemann,Wagatsuma,Waffenschmidt,Waegner,Waddups,Waddles,Wadas,Wacht,Waas,Waaga,Vuoso,Vukelj,Vriens,Vredeveld,Vrbas,Vranicar,Vovak,Votsmier,Vostal,Vorsburgh,Vornes,Vopava,Vonseeger,Vonschriltz,Vonholt,Vongsamphanh,Vongkhamphanh,Vongkhamchanh,Vonfelden,Voner,Vondrasek,Vondracek,Vonderhaar,Vonderahe,Vonbank,Volpone,Volmar,Vollmers,Vollette,Volinsky,Volek,Volbert,Vojna,Voigtlander,Vogelzang,Voeltz,Voelkerding,Vocelka,Vljeric,Vleming,Vlchek,Vizzi,Vixayack,Vixay,Vivyan,Vivion,Vitrano,Vitez,Vitellaro,Visounnaraj,Visick,Viscosi,Virostko,Virgile,Virgadamo,Virant,Vintila,Vinti,Vint,Vilven,Vilt,Villnave,Villescaz,Ville,Villasis,Villaplana,Villao,Villanveua,Villanvera,Villandry,Villamayor,Villamarin,Villaluz,Villaluazo,Villaire,Villacrusis,Vilegas,Vildosola,Viker,Vijil,Vijayan,Vigneau,Vigilo,Vigiano,Vieu,Vietzke,Vierk,Viengxay,Vieau,Vidas,Vidaca,Vicuna,Vicueroa,Vicenteno,Vias,Viard,Viano,Viale,Viafara,Vezza,Vevea,Vetterkind,Vetterick,Veto,Vessar,Vesperas,Vesley,Verwers,Verunza,Verso,Versage,Verrue,Verrone,Verrastro,Verplanck,Verone,Vernazza,Verlinden,Verlin,Verkuilen,Verfaillie,Venzor,Venturelli,Venskoske,Venning,Venneman,Veneri,Vendig,Vence,Veltkamp,Velthuis,Velovic,Veller,Velky,Velega,Velardes,Veksler,Veitinger,Vehrenkamp,Vegerano,Vedovelli,Veasman,Vbiles,Vautier,Vaulet,Vatterott,Vasudevan,Vasos,Vasek,Vasallo,Varquez,Varquera,Varoz,Varone,Varisco,Varieur,Varanda,Vanzie,Vanwyck,Vanwhy,Vanweerd,Vanwechel,Vanvuren,Vanvorst,Vanveldhuize,Vanuden,Vantuyle,Vantull,Vansteenhuyse,Vansteenberg,Vanson,Vansise,Vanschoor,Vanschoiack,Vanrossum,Vanosdol,Vanos,Vanorsouw,Vanoni,Vannuck,Vanlinden,Vanlier,Vanlaere,Vaninetti,Vanhove,Vanhoutte,Vanhoecke,Vanheusen,Vanhamme,Vanham,Vangordon,Vaneekelen,Vandonsel,Vandevanter,Vandesande,Vandernoot,Vanderjagt,Vanderiet,Vanderhurst,Vanderbie,Vandawalker,Vandaele,Vanblaricum,Vanbeveren,Vanamerongen,Vanamburgh,Vanalstin,Valtas,Valme,Vallow,Vallotton,Valliant,Vallegos,Vallar,Valladores,Valerino,Valeriani,Valela,Valdo,Valant,Valado,Vajnar,Vais,Vagnier,Vadlamudi,Vactor,Vaccarello,Vacarro,Uzzo,Uutela,Utzig,Useted,Urtz,Urtiz,Urtiaga,Urteaga,Urquides,Urmston,Urmos,Urbany,Urbaez,Uptmor,Upole,Uphold,Uoy,Unverzagt,Unvarsky,Unterseher,Unterman,Unglesbee,Underdue,Uncapher,Umeh,Ulven,Ulvan,Ulshafer,Ulsamer,Uljevic,Ulbricht,Ulabarro,Ujano,Uimari,Uihlein,Ugolini,Uglum,Ufford,Ueckert,Udani,Uchiyama,Ubl,Ubaldo,Tyrie,Tyndal,Tyms,Tylwalk,Tyeryar,Twilligear,Twidwell,Twardy,Tuzzio,Tutterow,Tutaj,Turziano,Turzak,Turtura,Turtle,Turrietta,Turns,Turnell,Turneer,Turnbill,Turello,Turbacuski,Tupaj,Tupacyupanqui,Tuomi,Tuomala,Tuohey,Tuning,Tumolo,Tuman,Tullar,Tulino,Tuggerson,Tuckerson,Tucke,Tuchy,Tucek,Tucciarone,Tuamoheloa,Tuai,Tua,Tsu,Tsironis,Tsing,Tsiatsos,Tsemetzis,Tscrious,Tsau,Tsasie,Tsakonas,Trypaluk,Trygg,Truxell,Truver,Trusso,Trush,Trusello,Truocchio,Truncellito,Trumps,Trumper,Trumbley,Trulli,Truhe,Truglia,Trufin,Trudnowski,Trudics,Trudgeon,Trucks,Trucker,Troyano,Troyani,Trouser,Trotty,Tronaas,Tromley,Tromburg,Troller,Trojecki,Trojahn,Troike,Troidl,Troge,Trofholz,Trochesset,Trish,Trio,Trinkley,Trinkl,Tringham,Trindle,Trimnell,Trilli,Trill,Triguro,Trigueros,Triece,Trider,Trexel,Trewin,Trewhitt,Treuter,Treutel,Trettin,Trett,Treso,Trenton,Trentini,Trenholme,Tremel,Trell,Tregan,Trecarichi,Trbovich,Traverse,Traunfeld,Trapanese,Tramp,Tramm,Trajillo,Trahin,Traher,Tradup,Toyne,Toyama,Townzen,Towber,Toussiant,Tousom,Tourtelotte,Touma,Toulmin,Touhy,Tottingham,Totter,Tott,Totosz,Toti,Tota,Tostanoski,Toso,Tory,Torreson,Torreon,Torrell,Torralva,Torno,Torngren,Tornese,Tordsen,Torbit,Torbeck,Toppins,Toppen,Toppah,Topolinski,Toplk,Topliss,Toplin,Topinka,Topi,Toomsen,Tools,Toof,Too,Tonic,Toniatti,Toni,Tongren,Tonche,Tonas,Tomsick,Tomsche,Tomopoulos,Tomkowicz,Tomasko,Toliongco,Toleston,Tokunaga,Tokita,Tohonnie,Tognetti,Toevs,Todora,Todahl,Tod,Tocher,Tocchio,Tobosa,Tobiason,Tjepkema,Tizon,Tixier,Tiwald,Tittl,Tisue,Tisinger,Tisa,Tirona,Tiro,Tirk,Tirino,Tiotuico,Tinnea,Tinin,Timone,Timber,Tilleman,Tille,Tiley,Tijing,Tigg,Tiffner,Tietjens,Tieger,Tidrington,Tidrick,Tibwell,Tibolla,Tibbit,Tiangco,Tian,Thyfault,Thurstonson,Thundercloud,Thuman,Thrun,Thrill,Thorsten,Thornquist,Thorner,Thormina,Thormer,Thoran,Thomspon,Thoeny,Thoennes,Thoele,Thoby,Thillet,Thiesse,Thibedeau,Theuner,Thessing,Therurer,Thero,Theo,Themot,Them,Thein,Theim,Theiling,Theesfeld,Theaker,Thaniel,Thamphia,Thammorongsa,Thalheimer,Thain,Thaemert,Thackxton,Thackrey,Thackery,Teyler,Tewmey,Tevada,Tetz,Tetteh,Tetro,Tetreau,Testman,Tessner,Tesoriero,Tesnow,Tesauro,Tersteeg,Terrett,Terrero,Terrence,Terrall,Terr,Terkelsen,Terbush,Teranishi,Tepperberg,Tentler,Tenor,Tenharmsel,Tengwall,Tenerowicz,Tenebruso,Tendick,Tencer,Ten,Temoshenka,Telman,Tellinghuisen,Telega,Telchik,Tejeiro,Teitel,Teichrow,Teichmiller,Tegtmeier,Tegenkamp,Teet,Teeples,Teepe,Tebow,Tebbetts,Tebbe,Tease,Teach,Tayo,Taymon,Taylan,Taydus,Tavolario,Taves,Tauteoli,Tatu,Tatsak,Tatnall,Tates,Tasto,Tasse,Tashman,Tartar,Tarsis,Tarris,Tarricone,Tarran,Tarner,Tarbor,Tarbet,Tarasuik,Taraschke,Taps,Tappis,Tapio,Tapat,Tapales,Tapaha,Taomoto,Tanzosch,Tanzman,Tanweer,Tanoue,Tanori,Tanon,Tannazzo,Tanker,Tanke,Tango,Tanen,Tandon,Tandetzke,Tancer,Tamminen,Tamiya,Tameron,Talladino,Taliulu,Talburt,Talboti,Talat,Talamas,Takiguchi,Takenaka,Tak,Tahir,Tagliente,Taglialatela,Tagge,Tagami,Tafuri,Tafreshi,Tacderen,Taccariello,Tacata,Tacadina,Tablada,Tabet,Taberski,Tabbaa,Taake,Szypowski,Szynkowicz,Szymula,Szychowski,Szwarc,Szuszkiewicz,Szumny,Szumilas,Szumiesz,Szuch,Szuba,Sznejkowski,Szmidt,Szlosek,Szigethy,Szenasi,Szczurek,Szczesniak,Szalankiewicz,Szalai,Szal,Szaflarski,Syrstad,Syrop,Synowiec,Synakowski,Symore,Symon,Syddall,Sybounheuan,Swonke,Swisshelm,Swiller,Swenton,Swell,Sweley,Sweger,Swefford,Sweere,Swee,Swedeen,Sweazey,Swearngen,Swaynos,Swatloski,Swatek,Swary,Swartley,Swarr,Swarn,Swarb,Swarat,Swanzy,Swantner,Swantko,Swanteck,Swanick,Swaine,Swadling,Svob,Svensen,Sutt,Suto,Sutherburg,Susmilch,Susla,Susko,Susan,Surridge,Surran,Surkamer,Suon,Suominen,Suneson,Sundman,Sumstad,Sumruld,Sumey,Sumbera,Sumaran,Sultaire,Sully,Sulloway,Sulkowski,Sulc,Sukut,Sukup,Sukovich,Suihkonen,Suga,Suffern,Sueyoshi,Suet,Suennen,Suellentrop,Sueda,Suddath,Succop,Sub,Sualevai,Styler,Stvictor,Stuzman,Stusse,Sturwold,Sturino,Sturiale,Sturdnant,Stupke,Stumm,Stumb,Stukel,Stufflebean,Stuever,Stuessy,Stuedemann,Stueckrath,Stueck,Studwell,Stubler,Stubbert,Strzyzewski,Strzelczyk,Strutynski,Struckmann,Struber,Strow,Stropus,Strople,Stroot,Strohecker,String,Strimel,Stright,Striffler,Stridiron,Stricklan,Strem,Streller,Strekas,Strek,Streitz,Streitenberge,Strech,Streat,Strazzullo,Strawberry,Stratter,Strathmann,Strassell,Strassberg,Strangstalien,Stoyanov,Stouten,Stoutamyer,Stotelmyer,Stoskopf,Storton,Storbeck,Stoppenbach,Stoot,Stoor,Stonewall,Stonefield,Stolzenberg,Stollsteimer,Stokel,Stohs,Stohrer,Stofferahn,Stoermer,Stoen,Stoecklin,Stockhoff,Stockburger,Stoakley,Stoa,Stlucien,Stitz,Stittgen,Stitch,Stires,Stippich,Stinser,Stinemetz,Stinde,Stinar,Stimus,Stiliner,Stilgenbauer,Stifflemire,Stickfort,Sticher,Stibb,Stewardson,Stevison,Steube,Sternod,Sterger,Steptore,Steppig,Stepleton,Stephanski,Stephano,Stepchinski,Stepanik,Stepaniak,Stenslien,Stenslie,Stengle,Stengele,Stendal,Stempert,Steman,Stelmach,Steitzer,Steinworth,Steinway,Steins,Steinour,Steinmiller,Steinhouse,Steinhour,Steinger,Steindorf,Steinau,Steinacker,Stegmann,Steff,Stefansky,Steensland,Steenrod,Steenland,Steeby,Stech,Stealy,Steagell,Steadings,Steach,Stawasz,Stavsvick,Stavrides,Stavish,Stathes,State,Stassinos,Stasser,Stasio,Stasa,Starzynski,Starritt,Starring,Starnold,Starchman,Starch,Starace,Stapelton,Stanuszek,Stanovich,Stankovic,Stankey,Stanislaw,Staniforth,Stanier,Stangarone,Stanganelli,Standlee,Standerwick,Standback,Stancombe,Stancer,Stancato,Stammel,Stambough,Stallones,Stakelin,Stagnitto,Stafiej,Staffon,Staffieri,Staffen,Stade,Stachniw,Stachnik,Stacer,Staber,Stabell,Staback,Staadt,Spunt,Spueler,Spruit,Spruel,Spriggins,Spratlen,Sprain,Sprafka,Sportsman,Sports,Sporle,Spoerl,Spoerer,Splonskowski,Splinter,Splane,Spizzirri,Spinoso,Spinka,Spiney,Spine,Spindola,Spindle,Spinas,Spilski,Spielmaker,Spiegle,Spevacek,Sperrey,Sperger,Sperduti,Speranza,Sperandeo,Spender,Spena,Spella,Speith,Speis,Speiden,Speidell,Speese,Specter,Speake,Speagle,Spaun,Spara,Spanton,Spanswick,Spannbauer,Spana,Spaide,Spadlin,Sowash,Sovey,Sovak,Souvannavong,Souvannarith,Souvannakhiry,Souser,Soulek,Soukkhavong,Soucek,Sottosanti,Sotlar,Sotak,Sossong,Sosso,Sosinsky,Soscia,Sorotzkin,Sorokin,Sorman,Sorgatz,Soren,Soravilla,Sor,Soprych,Sopata,Soorus,Sookoo,Sonnenburg,Sonkens,Sondrini,Sondelski,Somsana,Sommerdorf,Sommella,Solverson,Soltren,Soltes,Solonika,Solomons,Sollock,Sollman,Solle,Solimeno,Soliece,Solgovic,Soldow,Solas,Solarz,Sokorai,Sokolik,Soisson,Sohrabi,Soho,Sogol,Soga,Sofka,Sodomka,Sodachanh,Sochocki,Socci,Sobrowski,Sobrino,Soboleski,Soberano,Sobba,Sobania,Soans,Snuffer,Snowdon,Snowdeal,Snoderly,Snock,Snitker,Snith,Sniff,Snedeger,Snearly,Snachez,Smurthwaite,Smolski,Smithmyer,Smithen,Smithberger,Smisek,Smily,Smiglewski,Smietana,Smialowski,Smeltz,Smelko,Smeenk,Smedsrud,Smayda,Smaw,Smarsh,Smalt,Smalarz,Slutzky,Sluis,Sloup,Slotkin,Slosek,Sloon,Slomski,Slocombe,Slockbower,Slisz,Slinsky,Slicer,Sleek,Slayman,Slavis,Slatin,Slanina,Slagel,Sladky,Sladek,Skyberg,Skwara,Skursky,Skurski,Skura,Skrobacki,Skretowicz,Skorepa,Skomo,Sknerski,Skinsacos,Skillom,Skillen,Skibosh,Skibisky,Skewis,Skene,Skender,Skalecki,Skafec,Sixon,Sivia,Sivert,Sitto,Sita,Sissman,Sisneroz,Siskey,Sischo,Sirwet,Sirucek,Sirrine,Sirnio,Siriani,Sirek,Sippial,Sionesini,Sioma,Sinkiewicz,Sininger,Singuefield,Sings,Singhisen,Singeltary,Singco,Siner,Sindt,Sindorf,Sindoni,Sindel,Simzer,Simunek,Simplot,Simpelo,Simonetta,Simonett,Simoneavd,Simmelink,Simlick,Simkowitz,Simino,Simers,Simer,Simcic,Simank,Silverwood,Silverhorn,Silquero,Sillitti,Sillery,Silla,Silker,Silerio,Silagy,Silago,Sikorra,Sikkila,Sikel,Sikat,Sikander,Sigworth,Signorino,Sigafoos,Siewers,Sievel,Sierzenga,Sierer,Siepker,Siena,Sien,Siegfreid,Siegers,Siefkes,Siefferman,Siebel,Sidles,Side,Siddiq,Sida,Sickmeir,Sickendick,Sichler,Sicheneder,Sichel,Siangco,Siad,Shymske,Shutte,Shutes,Shurkus,Shumay,Shukert,Shuhi,Shuga,Shuckhart,Shryer,Shroeder,Shrimplin,Shrier,Shrefler,Shrake,Shoyer,Showden,Shouts,Shoto,Shonts,Shoeman,Shoddie,Shirilla,Shird,Shirai,Shipwash,Shiplet,Shipler,Shintani,Shinney,Shinko,Shindorf,Shimonishi,Shimanuki,Shiller,Shiiba,Shigemitsu,Shigematsu,Shifley,Shifflette,Shiever,Shido,Shidemantle,Shidel,Shibahara,Shey,Shevenell,Shetz,Sheskey,Sherratt,Sherif,Sherfy,Sherbo,Shepp,Shenberger,Shenassa,Shemper,Sheltrown,Shellum,Shellnut,Shellhorn,Shellgren,Shelenberger,Sheive,Sheasby,Shearier,Shearhart,Shawler,Shawaiki,Shaull,Shau,Shatt,Sharratt,Sharrai,Sharpsteen,Sharpey,Sharley,Shariff,Shariat,Sharar,Shapin,Shansky,Shannonhouse,Shangraw,Shammaa,Shamapande,Shalam,Shaker,Shahinian,Shaginaw,Shaggy,Shafto,Shafi,Shaer,Shae,Shadix,Shadburn,Sfera,Sfatcu,Seymoure,Sey,Sewester,Severyn,Seutter,Seuss,Seufer,Settecase,Sespinosa,Servey,Servano,Serum,Sertuche,Sert,Serro,Serret,Serre,Sermon,Sermania,Sergovia,Seremet,Serabia,Ser,Sephton,Sep,Senta,Sensenbach,Senneker,Senk,Senion,Senemounnarat,Seneker,Semo,Semenick,Seltrecht,Sellar,Seliski,Selis,Seligmann,Selia,Selestewa,Selem,Sele,Selca,Selbert,Selbe,Sekerak,Sejkora,Seiz,Seiver,Seirer,Seilhymer,Seiley,Seiger,Seigart,Seifts,Seiffert,Seidle,Seide,Seiberlich,Segota,Segobia,Seewald,Seepersaud,Seen,Sedy,Sedtal,Sedotal,Sedler,Sedlachek,Secreto,Secora,Secky,Seckington,Sebestyen,Sebers,Searchwell,Searchfield,Searcey,Seanor,Sean,Seamen,Sealander,Seaford,Scullion,Scrudato,Scronce,Scrobola,Scribellito,Scozzari,Scoresby,Scolnik,Scoh,Scoble,Sclavi,Sciuto,Scisco,Scigliano,Scieszka,Scierka,Scibetta,Sciavillo,Sciarini,Sciancalepore,Schwuchow,Schwoyer,Schwoerer,Schwien,Schwetz,Schwertfager,Schwentker,Schwent,Schwendinger,Schwemm,Schweiner,Schwarzenberg,Schwartzer,Schwarten,Schwanebeck,Schwanbeck,Schwallie,Schwald,Schuyleman,Schustrich,Schurer,Schuppenhauer,Schumucker,Schumans,Schuiling,Schueth,Schuckert,Schuchmann,Schuble,Schub,Schroy,Schromen,Schroeppel,Schroedel,Schreur,Schreimann,Schrecker,Schouweiler,Schou,Schornick,Schoreplum,Schooling,School,Schoo,Schontz,Schoninger,Schoneck,Schone,Schonaerts,Schomberg,Schollmeier,Schoepflin,Schoenegge,Schoeneck,Schoeller,Schoebel,Schnitman,Schnetter,Schnelzer,Schneidmiller,Schnair,Schnabl,Schmuff,Schmoldt,Schmider,Schmeer,Schlussel,Schlissel,Schlett,Schlesner,Schlesener,Schlepphorst,Schlepp,Schlechten,Schlaack,Schiveley,Schirm,Schimanski,Schilmoeller,Schille,Schilawski,Schiffner,Schiffert,Schiedler,Schickler,Schiappa,Scheuring,Scheule,Schepker,Schenz,Schenkelberg,Schembri,Schembra,Schellhorn,Schellenberge,Schelle,Scheitlin,Scheidecker,Scheibner,Scheiblich,Schehl,Schefers,Schee,Schearer,Schaubert,Schattschneid,Scharich,Schares,Scharber,Schappach,Schaneman,Schamberger,Schak,Schaetzle,Schaecher,Scerbo,Scelba,Scavona,Scatton,Scarsdale,Scarr,Scarpone,Scarlata,Scariano,Scandurra,Scandura,Scandalis,Scammahorn,Scafuto,Scaffe,Scachette,Sayyed,Sayko,Sayco,Sayasane,Sayaphon,Sawney,Sawdo,Sawatzke,Sawallich,Savko,Savka,Savitts,Saviola,Savio,Savine,Savich,Savells,Saulpaugh,Saulino,Sauler,Saugis,Sauber,Sau,Saturnio,Sattel,Satomba,Saterfield,Satava,Sasseville,Sasahara,Sarzynski,Sartorius,Sartore,Sartell,Sarsour,Sarson,Sarp,Sarnosky,Sarni,Sarlinas,Sarka,Sarinsky,Sarin,Sardo,Sarden,Sarchett,Sarault,Sarate,Sarao,Sarantakis,Saralegui,Sapper,Sappah,Sapinski,Sapardanis,Sapara,Sanyaro,Santwire,Santrmire,Santoriella,Santor,Santomassimo,Santisteban,Santillanez,Santamarina,Sansotta,Sanpson,Sannutti,Sankoh,Sangasy,Sanfelix,Sandvill,Sandus,Sandstede,Sandling,Sandland,Sandhop,Sandeen,Sandblom,Sanday,Sandager,Sancrant,Sancken,Sanchirico,Sancher,Sances,Sanberg,Sanacore,Samyn,Samul,Samrov,Samrah,Sampere,Sampang,Samland,Samii,Samiento,Sames,Sambrook,Samborski,Samberg,Samaroo,Salzl,Salvio,Salvati,Salvadge,Saluan,Saltzberg,Saltus,Saltman,Salstrom,Salotti,Salmonsen,Sallmen,Salle,Sallach,Salines,Salesky,Saleme,Saleha,Saldano,Salb,Salazak,Salasar,Salado,Salach,Sakumoto,Sakamaki,Sajovic,Sajous,Sainte,Sainliere,Sainato,Sails,Saik,Saieva,Saice,Sahe,Sahady,Sago,Saft,Safier,Saffo,Safer,Saether,Saens,Saeler,Saelens,Sadvary,Sadoski,Sadorra,Sadolsky,Sadin,Sadik,Sadeghi,Sadat,Sacramed,Sachetti,Sacchi,Sacca,Saberi,Saarela,Saadat,Saabatmand,Rzeczycki,Rysz,Rynkowski,Rynerson,Ryneer,Rymut,Rymes,Rymasz,Rylaarsdam,Rykaczewski,Ryen,Ryea,Rydin,Rydelek,Rydel,Rydeen,Rybinski,Ruvalcava,Rutski,Rutske,Rutman,Rutkin,Ruths,Ruthman,Ruthers,Rutheford,Rutgers,Rutenberg,Rutar,Russwurm,Russomano,Russomanno,Russer,Russello,Rushanan,Rusen,Ruschmeyer,Rusaw,Rupnick,Rupley,Rupinski,Ruopoli,Rumps,Rumbach,Rulapaugh,Ruivo,Ruiter,Ruhoff,Ruhn,Ruhman,Ruggirello,Ruffell,Ruffel,Ruezga,Ruesga,Ruelar,Ruehter,Ruehling,Ruehlen,Ruedas,Rued,Rueck,Rudoy,Rudio,Rudh,Rudell,Rudat,Rudack,Ruckey,Ruckel,Ruckdaschel,Rubsam,Rubie,Rubick,Ruberti,Rubeo,Rubenfield,Rubenfeld,Rubash,Rubalcave,Rozzelle,Rozon,Royle,Roxbury,Rowlison,Rowels,Rowbotham,Rovell,Rouw,Routzen,Routzahn,Routte,Rousso,Rousell,Rous,Rounsville,Rouly,Roulhac,Roulette,Roule,Rouhoff,Roughen,Rouch,Rottinghous,Rottier,Rotruck,Rotkowski,Rotkovecz,Rothfeld,Rotherham,Rotch,Rotanelli,Rosul,Rossie,Rossen,Rosseel,Rosky,Rosian,Rosher,Rosewall,Roseum,Roseth,Rosenwinkel,Rosentrater,Rosenlof,Rosenhagen,Rosengren,Rosendorf,Rosendale,Rosenbush,Rosemore,Rosek,Rosebur,Roscup,Rosca,Rosboril,Rosazza,Rosane,Rorabacher,Ropka,Roofner,Ronsini,Ronnie,Ronnfeldt,Ronn,Ronero,Roner,Ronayne,Rona,Ron,Romprey,Rommelfanger,Romkema,Romiro,Romay,Romanowicz,Romanov,Romanoff,Romaniszyn,Romanek,Romane,Rollf,Rollag,Rolfson,Rolack,Rokicki,Rohrdanz,Rohdenburg,Rohal,Rogowicz,Rogish,Rogian,Rogens,Rogado,Roesslein,Roesing,Roerig,Roenigk,Roelle,Roehler,Rodvold,Rodrigres,Rodregues,Rodolph,Rodkin,Rodiquez,Rodina,Rodero,Roderman,Roderiquez,Rodenizer,Rodenbough,Rodebush,Rodde,Rocle,Rochlitz,Rochkes,Rocheford,Robyn,Robusto,Roberston,Robbie,Robbert,Robberson,Robair,Roam,Roadruck,Roades,Roaden,Roadarmel,Rizzardi,Rivinius,Riveras,Rivello,Rivelli,Rivadulla,Rittinger,Rittie,Rittichier,Ritthaler,Ritmiller,Riskin,Risien,Rishor,Risatti,Ripson,Ringold,Ringen,Rinfret,Rineheart,Rindal,Rincan,Rinauro,Rinaldis,Rina,Rimkus,Rimi,Rimel,Rimbach,Rily,Rillie,Riller,Rihner,Riherd,Rigley,Rightmyer,Righthouse,Riggert,Riggers,Rigerman,Rigas,Rifai,Riesner,Rienzo,Riemersma,Riefer,Ridgebear,Rides,Ridell,Ridall,Ricucci,Ricley,Rickerl,Richemond,Richelieu,Richel,Richardville,Riccitelli,Ricciardelli,Ricardez,Riblett,Ribar,Riase,Rian,Rhym,Rhule,Rhude,Rhondes,Rhodehamel,Rhim,Rheingold,Rheaves,Reznick,Reynero,Revolorio,Revette,Revelo,Reuven,Reusswig,Reusser,Reuhl,Reuber,Rettele,Retka,Retersdorf,Resseguie,Resper,Resner,Resides,Reshard,Resek,Reseigh,Repaci,Renzullo,Renuart,Rentfrow,Rennemeyer,Renneker,Renkes,Renier,Rendle,Renburg,Remsburg,Remos,Remmie,Remmick,Remlin,Remkus,Remfert,Remey,Remerez,Remedies,Remaly,Relph,Rellihan,Relles,Relaford,Reksten,Rekas,Reitzes,Reiten,Reitema,Reisin,Reinmann,Reinicke,Reinholdt,Reinheimer,Reinfeld,Reineman,Reineking,Reinartz,Reimel,Reik,Reihe,Reidling,Reidler,Reichenberg,Reichenback,Reho,Rehnborg,Rehnberg,Rehart,Regusters,Regulus,Reglin,Reginal,Reges,Regensburg,Regen,Regas,Reevers,Reever,Reeter,Reedholm,Redle,Redic,Redfear,Reddekopp,Rechel,Rebick,Rebholz,Reazer,Reauish,Reath,Reasinger,Reas,Reary,Realmuto,Reager,Readenour,Razze,Rawicki,Rawhoof,Ravi,Ravetti,Ravenscraft,Rava,Rauf,Rauelo,Rattee,Rattay,Rattanachane,Rattana,Rathmanner,Rathgeber,Rathe,Rathbum,Rasul,Rastogi,Rastelli,Rassman,Rasmuson,Rasely,Raschko,Raschilla,Rasche,Rasanen,Rary,Raring,Raridon,Rarey,Raquel,Rappenecker,Rapelyea,Ransier,Ransberger,Rannalli,Ranjel,Ranford,Randoll,Randklev,Ramy,Ramundo,Ramu,Ramsuer,Ramstad,Ramsbottom,Ramphal,Ramnarine,Rammer,Ramiscal,Ramgel,Ramesar,Ramento,Rambeau,Ramales,Ralon,Rallison,Rakich,Raith,Raiola,Rainwaters,Rainbott,Raimundo,Raimer,Raimann,Railing,Rahl,Rahama,Ragusano,Rafla,Rafiq,Rafi,Raffone,Raffo,Rafail,Raelson,Raehl,Raebel,Radway,Radue,Radona,Radisovich,Radics,Rademan,Radeke,Radder,Radden,Rackow,Racitano,Racina,Rachar,Racanello,Rabuck,Rabkin,Rabidoux,Rabello,Rabel,Rabara,Qunnarath,Quirindongo,Quintel,Quintano,Quinlin,Quinchia,Quincel,Quilling,Quillian,Quilliam,Quillens,Quihuiz,Quiett,Quicksall,Quest,Querta,Querido,Quent,Quealy,Quaye,Quante,Quamme,Qualia,Quaker,Quagliano,Quader,Pytlewski,Pyo,Pylvainen,Pyland,Pych,Py,Puyear,Puulei,Puthiyamadam,Putalavage,Purzycki,Purkerson,Purcella,Purce,Puppe,Pupa,Pullon,Pullie,Pulgarin,Pulford,Pujals,Puiatti,Pugeda,Puffett,Puffenbarger,Puertas,Puddy,Pucio,Pucella,Ptaszynski,Psomiades,Psencik,Przybysz,Przybycien,Przedwiecki,Pryzgoda,Prvitt,Pruskowski,Prugh,Prudent,Prudden,Provazek,Protasewich,Protain,Proo,Prondzinski,Prokes,Prohonic,Progacz,Proescher,Prodan,Privatsky,Privateer,Priore,Prinzing,Prinzi,Printers,Prigmore,Priewe,Prier,Pribbeno,Prezzia,Preyor,Prewer,Prevett,Preuitt,Prepotente,Prence,Prekker,Preisach,Precythe,Prebish,Preato,Prchlik,Prazeres,Prazak,Prauner,Prattella,Prati,Prat,Prasser,Prasomsack,Praml,Prabhakaran,Prabel,Poyneer,Powroznik,Powal,Poux,Poullion,Pouliotte,Pottier,Potthast,Potocnik,Poties,Poths,Postuci,Postal,Posso,Poser,Portwine,Portune,Portaro,Porrello,Porreca,Porrazzo,Poremski,Pore,Porcello,Popple,Poppert,Popowski,Popovec,Popke,Popik,Popielarczyk,Popick,Popi,Poper,Popelka,Popec,Poortinga,Poorte,Pooni,Ponyah,Pontin,Pomerance,Pomar,Polynice,Polyak,Polverari,Poltorak,Polovoy,Pollmann,Pollio,Pollinger,Pollacco,Polivka,Polian,Poleyestewa,Polera,Poldrack,Polcovich,Polakoff,Polakis,Poladian,Pokorski,Poiter,Poffenroth,Poetzsch,Poeschl,Poeschel,Poepplein,Poepping,Poeling,Podvin,Podsiad,Podrasky,Podlas,Pode,Podbielski,Podany,Pochiba,Pocchia,Poalino,Poaipuni,Plymire,Plyer,Pluvoise,Plungy,Pluid,Ploude,Plosker,Plomma,Plohr,Plocica,Pliler,Plevin,Plessis,Plesnarski,Plesha,Plenskofski,Plecker,Platenburg,Platas,Plansinis,Plana,Plamer,Placencio,Pizzolato,Pizur,Pius,Piurkowski,Pituch,Pittillo,Pitel,Pitcak,Piszczatowski,Pisula,Pishner,Pirner,Pirillo,Pippert,Pipe,Pinyan,Pinsonnault,Pinnt,Pinkelton,Pinena,Pinela,Pineault,Pinault,Pilotti,Pillips,Pilbin,Pilati,Pikey,Pih,Piguet,Pigna,Pigler,Pigat,Pietzsch,Pietrafesa,Pieters,Pierzchala,Pierrie,Pierfax,Piercefield,Piedmont,Piedigrossi,Piede,Piechoski,Piearcy,Pidcock,Picolet,Pickren,Pickings,Picht,Picco,Pi,Phomphithak,Phommatheth,Phlieger,Phippen,Philpotts,Phillipi,Philippon,Philipose,Philben,Pherson,Pherguson,Phatdouang,Phanthauong,Phanord,Pfirsch,Pfendler,Pfannenstein,Pfahlert,Pfahler,Pezzuto,Pezzimenti,Pexton,Pexsa,Pewo,Pevsner,Petzel,Petts,Pettner,Pettinella,Petticrew,Pettibon,Pettes,Petrov,Petrosyan,Petron,Petrocelli,Petrocco,Petrizzo,Petris,Petrino,Petricone,Petralba,Petrakis,Petrain,Petkoff,Petitjean,Petges,Peteuil,Petet,Petersdorf,Petchulis,Pestronk,Peskind,Pesenti,Pertsovsky,Personette,Persia,Persampieri,Persall,Pers,Perre,Perper,Perolta,Perng,Perler,Perkoski,Perish,Perilloux,Perey,Peressini,Percontino,Perciballi,Peral,Peppas,Pepitone,Penzero,Pentico,Pent,Penski,Pense,Penrice,Penoyer,Penovich,Pennimpede,Pennigton,Pennig,Penisson,Pendl,Pendill,Penceal,Penatac,Penasa,Penanegra,Pelman,Pelligrini,Pelliccia,Pellant,Pelkowski,Pelak,Pein,Peightell,Pegler,Pegelow,Peffers,Peetz,Peelman,Pee,Pedrin,Pedlow,Pedelty,Pede,Peddy,Peckinpaugh,Peckens,Pecht,Pechin,Peche,Peccia,Peca,Peaker,Pazik,Pazderski,Pazan,Payno,Payenda,Pawluk,Pawlosky,Pawell,Pavlikowski,Pavlides,Pavish,Paviol,Paulick,Paukert,Pattum,Patrylak,Patronella,Patrich,Patriarco,Patraw,Patierno,Patient,Patience,Paten,Pastorin,Pasternack,Pastano,Passaro,Pasqualino,Paskoff,Paskin,Paskiewicz,Pashel,Pasey,Pascher,Pasaye,Pasanen,Parvis,Partmann,Parthemore,Parshotam,Parsens,Parraga,Paronto,Paroda,Parobek,Parmann,Parmalee,Parlet,Parle,Parkers,Pariente,Paree,Pardey,Parde,Pardall,Parbs,Parbol,Paranada,Parah,Parado,Pappy,Pappenheim,Paplow,Papka,Papich,Papi,Papallo,Paolicelli,Panzarella,Panyik,Pantle,Pantera,Pantalone,Pansullo,Panone,Pano,Panny,Pannenbacker,Pankiewicz,Pankhurst,Panke,Pankau,Pangan,Panessa,Pandolfi,Pandiani,Panchik,Panchak,Panakos,Panak,Panagakos,Palubiak,Palso,Palowoda,Palmucci,Palmour,Palmino,Palmerino,Palme,Pallino,Pallerino,Palisi,Palisano,Palis,Palazzola,Palay,Palaspas,Palamara,Paladini,Paladin,Paire,Paillet,Pailet,Paider,Paguin,Pagoda,Paglione,Paglialunga,Pageau,Pagdanganan,Pafundi,Padiong,Padberg,Padarebones,Padalecki,Pacol,Pacilio,Pachter,Pachew,Pabelick,Paaske,Ozzella,Owoc,Owca,Ovitz,Overmann,Overlee,Overhulser,Overholtzer,Ovens,Ovall,Outhier,Ouren,Ouinones,Ottum,Ottomaniello,Otteman,Otsman,Otinger,Oszust,Ostorga,Ostolaza,Osterhouse,Osterberger,Ostberg,Ososki,Osmers,Osmera,Oshey,Osequera,Osenkowski,Oschmann,Osbment,Osbey,Osazuwa,Osayande,Osako,Orzell,Orvin,Ortwine,Ortmeyer,Ortelt,Ortelli,Orsten,Orson,Orrill,Orphey,Orndorf,Orloski,Orlich,Orlander,Orland,Ork,Orji,Orison,Orielly,Orielley,Ori,Organek,Orey,Orender,Ordona,Ordon,Ordman,Orazine,Oravetz,Orandello,Orabone,Ora,Or,Oquenda,Opyd,Opteyndt,Opoka,Opiola,Opielski,Opell,Opeka,Onyeagu,Onezne,Ondeck,Ona,Oms,Ommen,Ominelli,Omernik,Omelia,Olynger,Olwin,Olvey,Olufson,Olubunmi,Olten,Olshefski,Olsby,Olores,Olma,Olli,Ollech,Ollar,Oliviera,Olivarri,Oligschlaeger,Olheiser,Olgin,Olevera,Olerud,Olenski,Olenius,Oldow,Oldershaw,Oldenburger,Olausen,Olaes,Okutsu,Okken,Okitsu,Okie,Okeson,Okelberry,Okel,Ojito,Ojano,Ohyama,Ohr,Ohnstad,Ohmen,Ohlhauser,Ohlensehlen,Ohle,Ohashi,Ohanley,Ogzewalla,Ogutu,Ogston,Ogrodowicz,Oginski,Ogiamien,Oger,Ogarro,Ofsak,Oflynn,Off,Ofer,Oelze,Oehm,Oehlschlager,Oehl,Odome,Odo,Odmark,Odil,Odgen,Odermott,Odair,Oczon,Ockman,Ockleberry,Ocken,Ochal,Ochakovsky,Ocenasek,Occhuizzo,Ocanaz,Obrein,Obray,Oborne,Oblinski,Obin,Obierne,Obholz,Obhof,Oberski,Obermier,Oberlies,Obergfell,Obenauer,Obeid,Obbink,Obaker,Oatney,Oatfield,Nyulassy,Nwagbara,Nutley,Nuth,Nurthen,Nuntaray,Nunno,Nunlee,Nuner,Numkena,Nuhfer,Nugal,Nuessen,Nuding,Nuchols,Noye,Noya,Nowosielski,Novickis,Novi,Novencido,Novel,Novad,Noujaim,Notoma,Notice,Noth,Notch,Notarnicola,Nosworthy,Nosacka,Norum,Northouse,Nortesano,Norstrand,Norsingle,Norrie,Norr,Norn,Normoyle,Norise,Nordstrand,Nordmark,Nordes,Norales,Nopachai,Noorda,Nooman,Nonroe,Nonemaker,Nonamaker,Nommay,Noman,Nollet,Nolle,Noli,Noice,Noerr,Nodland,Nocon,Nocks,Nockels,Nocella,Nocek,Njie,Nizo,Nitchman,Nistendirk,Nissan,Nisly,Nishitani,Nishio,Nishina,Nirschl,Niro,Nirenberg,Niquette,Nip,Nindorf,Nincehelsor,Nimz,Nimura,Nilmeier,Nikula,Nikach,Nik,Nightwine,Night,Nighman,Nighbor,Niffenegger,Niez,Niesporek,Nier,Nieminen,Niemie,Niedermeier,Niederberger,Nido,Nicome,Nicolozakes,Nicolia,Nicoles,Nicolau,Nickodem,Nicklous,Nickisch,Nicka,Nici,Nibler,Nibbe,Nhatsavang,Ngoun,Neyer,Newmyer,Newitt,Newgard,Newenle,Newbraugh,Newbound,Newand,Nevue,Nevison,Nevis,Nev,Neujahr,Neufer,Nette,Netkowicz,Nethkin,Nesvig,Nestico,Nessner,Nesslein,Nesset,Nessel,Neshem,Nesbeth,Neris,Nerenberg,Neren,Nepomuceno,Nemith,Nelder,Neitzke,Neita,Neiner,Neimeyer,Neigenfind,Neiford,Neidenbach,Nehlsen,Negreta,Negrana,Neenan,Neddenriep,Nech,Neborak,Nebesny,Nazar,Nawfel,Navo,Navarete,Nauss,Naumes,Naugler,Nauer,Natvig,Natalizio,Natalie,Natalia,Nastasia,Nasaire,Naruaez,Narrow,Narkevicius,Nardozzi,Nardino,Narain,Napue,Napenas,Nap,Naomi,Nao,Nanz,Nantwi,Nannen,Nang,Nanfito,Nanes,Nan,Namsaly,Namey,Namer,Namauu,Namanworth,Nalevanko,Nalder,Nakaoka,Nakamatsu,Nakajima,Nakada,Nakaahiki,Naimoli,Nahmias,Nahhas,Nagtalon,Nagelkirk,Nagasawa,Naftel,Nadine,Naderman,Nachbar,Nacci,Nabzdyk,Nabor,Nabavian,Nabarowsky,Naasz,Myslim,Myree,Mylar,Myall,Muzii,Muyres,Muwwakkil,Mutters,Mutschelknaus,Musulin,Mustaro,Mustache,Musslewhite,Mussell,Mussa,Musni,Muslim,Muskrat,Muskopf,Muskett,Musitano,Musilli,Musielak,Musguire,Musgraves,Muscott,Muschik,Muschaweck,Mursch,Murril,Murra,Muros,Muri,Murel,Murcko,Murak,Muphy,Muntean,Mundz,Mundinger,Munder,Mumaugh,Mulville,Mulrenin,Mulnix,Mullenaux,Mullahy,Mulkern,Mulkerin,Mulchrone,Mulato,Muinos,Muhlstein,Mugnolo,Muggeo,Mugge,Muffett,Muenzenberger,Muellerleile,Mudie,Muckelroy,Muccio,Mrvan,Mrkvicka,Mraw,Mozick,Mozga,Mozak,Moxness,Moxey,Mounkes,Mound,Motonaga,Mothershead,Motayne,Motayen,Mosty,Mostad,Mossbarger,Moskwa,Moskop,Mosena,Mosen,Moscoffian,Moryl,Morvillo,Mortin,Mortier,Morsberger,Morrey,Morrales,Morral,Morphy,Morock,Morlino,Morkert,Morken,Morisseau,Morishito,Morinville,Morici,Morgano,Morgana,Moreschi,Morenco,Morence,Morella,Mordeci,Moratto,Morath,Morario,Morando,Moradian,Morada,Mootry,Moomey,Monville,Montoto,Montore,Montoney,Montfort,Montey,Montesi,Monterrubio,Montembeau,Montayes,Montalban,Montaivo,Monsay,Monot,Monopoli,Monnerjahn,Monkowski,Monka,Monjure,Monios,Monington,Monges,Monfils,Moneyhun,Moneaux,Mondt,Mondoza,Mondloch,Mondelli,Mondale,Monclova,Moncher,Monath,Monagas,Mominee,Moma,Molz,Molstad,Molsan,Molnau,Mollura,Molleur,Molla,Molands,Moitoza,Moisa,Moine,Mohrlock,Mohre,Mohomed,Mohmed,Mohair,Mogus,Moeuy,Moeser,Moehr,Moehle,Modique,Modgling,Modglin,Moderski,Moczulski,Moccasin,Moayyad,Moatz,Mlodzianowski,Mleczynski,Mizwicki,Mizutani,Mizia,Mizenko,Miyataki,Miyanaga,Miville,Mitsdarffer,Mitrani,Mitman,Mitkowski,Misuraca,Miskinis,Miskiewicz,Miska,Misik,Mishulovin,Mishulouin,Mishkin,Mishar,Misenti,Mischo,Mischnick,Mirisola,Miricle,Mirick,Miramontez,Mirafuentes,Miraflores,Miquel,Mione,Minzy,Minzenmayer,Minzenberger,Mintken,Minten,Minot,Minors,Minn,Minkowitz,Minkins,Minister,Minic,Minhas,Mingioni,Mingee,Minert,Minchow,Mincer,Minalga,Mimozo,Milward,Milson,Milosch,Millings,Millick,Millare,Milke,Milinazzo,Milin,Milich,Milette,Mile,Mildrum,Mildon,Milcher,Milberger,Mikuszewski,Miklitz,Mikko,Mihalios,Mihalick,Mieth,Mierzwiak,Mierzwa,Mierow,Mierez,Mierau,Mielcarek,Miecznikowski,Miears,Middlekauff,Micucci,Mickelberry,Michno,Michlich,Michieli,Michelstein,Michelini,Michalicek,Michal,Micciche,Micalizzi,Mguyen,Mezzina,Mezzenga,Meydid,Meusel,Meusa,Metty,Mettig,Mettenburg,Metier,Meth,Metelko,Mestemacher,Messamore,Mesplay,Mespelt,Mesiti,Mesina,Meshyock,Mesenbring,Meschke,Merzlak,Merrih,Merner,Merkwan,Merklein,Merkey,Meringolo,Merine,Mergist,Merganthaler,Merckling,Menzer,Mensalvas,Mennecke,Menne,Menjiva,Mengwasser,Menger,Menedez,Meneal,Menck,Mencia,Menchen,Menchavez,Melzer,Melve,Melso,Meloan,Melman,Mellison,Mellerson,Mellendorf,Mellberg,Melikian,Melian,Melgaard,Meleo,Melbye,Melber,Meja,Meixelberger,Meitz,Meitner,Meiss,Meisch,Meinen,Meinberg,Meigel,Meierhofer,Mehringer,Mehrer,Mehle,Mehall,Megahan,Mega,Mefferd,Meenan,Meecham,Medvec,Medinger,Meddock,Medawar,Medaries,Mecias,Mecannic,Meazell,Measom,Meaden,Meach,Mcwhinnie,Mcwhinney,Mcwells,Mcvinney,Mcvenes,Mcthige,Mcthay,Mcshaw,Mcroyal,Mcrenolds,Mcratt,Mcquilliams,Mcquesten,Mcphetridge,Mconnell,Mcnolty,Mcneish,Mcnany,Mcnamar,Mcmullins,Mcmulen,Mcmenimen,Mcmellen,Mcmanuis,Mcmanemy,Mclernon,Mclauren,Mclamore,Mckusick,Mckosky,Mckirryher,Mckindra,Mckin,Mckever,Mckernin,Mckerlie,Mckennzie,Mckelvin,Mckelphin,Mckeague,Mckaughan,Mciwraith,Mcilhinney,Mchardy,Mcgurie,Mcgrevey,Mcgreen,Mcgohan,Mcglocklin,Mcglew,Mcglaun,Mcgibney,Mcghinnis,Mcgaughan,Mcgathy,Mcferran,Mcfeely,Mcfatten,Mcewin,Mcendarfer,Mcenany,Mcelvy,Mcelmarry,Mceathron,Mceaddy,Mcdugle,Mcdoulett,Mcdaneld,Mcculloh,Mccullin,Mccullan,Mccullagh,Mccubrey,Mccrobie,Mccrain,Mccraight,Mccracker,Mccrabb,Mccowin,Mccoubrey,Mccoon,Mcconomy,Mcconnico,Mcconahay,Mccomish,Mccoid,Mccloude,Mcclinsey,Mcclenic,Mcclee,Mccier,Mccathran,Mccash,Mccarvy,Mccarrol,Mccarraher,Mccalpane,Mccalebb,Mccalanahan,Mccade,Mccadams,Mcbroome,Mcaskill,Mcartor,Mcaree,Mbonu,Mazzillo,Mazzetti,Mazuera,Mazowieski,Mazierski,Mazella,Mayze,Maywalt,Mayher,Mawk,Mavris,Maushardt,Mauras,Mauracher,Maupins,Matysiak,Matye,Matusz,Matuska,Matusiewicz,Matulewicz,Mattock,Mattingley,Mattina,Mattick,Mattan,Matskin,Matros,Matrisciano,Matone,Matonak,Matlow,Matkovic,Matison,Mathelier,Matelski,Mateiro,Masunaga,Masterton,Mastalski,Massini,Massena,Massed,Massarelli,Massanelli,Maso,Maslen,Maslakowski,Masincup,Masilko,Masher,Mashall,Masello,Masell,Maschmeyer,Mascheck,Maschak,Mascari,Masar,Masak,Masaitis,Marxsen,Maruschak,Maruscak,Marus,Marumoto,Martyr,Martsolf,Martorelli,Martling,Martischnig,Martirano,Martinsons,Martinov,Martinon,Martinolli,Martinet,Martinell,Martinel,Martinat,Martich,Martey,Martelles,Martelle,Marsolais,Marsili,Marshbanks,Marshak,Marseilles,Marsaw,Marrier,Marrett,Marrapodi,Marrapese,Marquitz,Marousek,Maronge,Maro,Marmerchant,Marlene,Markworth,Markwardt,Markuson,Markou,Markakis,Marjenhoff,Maritato,Mariska,Mariacher,Margot,Margis,Marflak,Marfil,Marer,Mardirossian,Marcusen,Marconis,Marcisak,Marcille,Marchionni,Marchesi,Marchaland,Marcet,Marcelli,Marca,Marbley,Marash,Marascalco,Marante,Marangoni,Marando,Mapua,Mapstone,Mapa,Maohu,Manzur,Manweiler,Manuia,Manto,Mantifel,Mantia,Manteuffel,Mantella,Manteca,Manspeaker,Mansbach,Manous,Manoso,Manolis,Manocchia,Mannheim,Mannello,Manlangit,Manino,Manieri,Manicchio,Maniar,Maniaci,Maniace,Manglona,Mangis,Mangiafico,Manghane,Manero,Manely,Maneafaiga,Mandril,Mandolfo,Mander,Mandelberg,Mandala,Manco,Mancill,Mancher,Manche,Manaugh,Manassa,Manasares,Manansala,Manalili,Mamudoski,Mammo,Mammenga,Mamaril,Mamaclay,Malueg,Malter,Maltbia,Maltas,Malool,Mallas,Mallalieu,Mallacara,Malkiewicz,Malinovsky,Malewski,Malett,Maldomado,Malcomson,Malcik,Malavet,Malaver,Malasky,Malas,Malango,Malanaphy,Malach,Makofsky,Mako,Makler,Maka,Majuste,Majied,Majeske,Majerowski,Majera,Maixner,Maisto,Maiocco,Mailo,Maile,Maikoksoong,Mahunik,Mahrer,Mahraun,Maholmes,Mahlke,Mahli,Mahfouz,Maheia,Mahalko,Magwire,Magpuri,Magoun,Magnone,Magnetti,Magliulo,Magliolo,Magliocco,Magitt,Magginson,Maggert,Magera,Maged,Mage,Magbitang,Magalong,Magaha,Maffitt,Maffey,Maestri,Maenpaa,Maenhout,Maendel,Mady,Maduro,Madu,Madray,Madras,Madock,Madlung,Madler,Madenford,Madeau,Maddaleno,Macvean,Macura,Macrum,Macrostie,Macnaught,Macnamee,Macmurray,Macmillen,Maclay,Mackle,Mackimmie,Mackedanz,Maciejko,Maciasz,Maciak,Machtley,Machens,Macentee,Maceda,Macdougald,Maccauley,Maccartney,Macareno,Macaraig,Macapagal,Macahilas,Macadamia,Mabone,Mabary,Maatta,Maalouf,Lysak,Lynge,Lynady,Lykam,Lyerla,Lychwala,Luzuriaga,Luzinski,Luxon,Luvene,Lutzi,Luthe,Luss,Lushbaugh,Luscavage,Lurey,Luquin,Lupul,Lupu,Lupkin,Lupfer,Luoto,Lundman,Lundie,Lundi,Lundemo,Luncsford,Lumukanda,Lumpp,Lummis,Lumantas,Luloff,Lukavsky,Luitjens,Luhring,Luga,Luffy,Luelf,Luehring,Luedi,Lueckenotte,Luecht,Luebano,Ludvik,Ludovici,Ludkowski,Luderman,Luddy,Lucksom,Luckritz,Luckadoo,Lucion,Luci,Luchessa,Luchesi,Lucear,Lucario,Luben,Luangsingotha,Lozzi,Lozo,Loyst,Loyed,Lowin,Lowber,Lovich,Lovenbury,Loveh,Lovec,Louser,Louris,Lourence,Loureiro,Louras,Lounds,Loukidis,Loukas,Louissant,Louer,Louch,Lotze,Lotthammer,Lotter,Loterbauer,Lotempio,Lostracco,Loston,Lossman,Loson,Loskill,Loske,Loshe,Lorz,Lorion,Lopuzzo,Lopilato,Lopera,Loosey,Looi,Loock,Lonsway,Lons,Longueville,Longton,Longknife,Longin,Longfield,Longcor,Londner,Lompa,Lommel,Lomg,Lolling,Lolli,Loli,Lolar,Lokuta,Lokke,Lokhmator,Lojek,Lois,Loil,Lohmeier,Logero,Loewe,Loessberg,Loeschner,Loesche,Loehlein,Loeckle,Loebs,Loduca,Lodense,Lodeiro,Locsin,Locorriere,Locklier,Lockette,Lochotzki,Loche,Locantore,Locante,Lobosco,Lobingier,Loats,Loarca,Llyod,Llopis,Llarenas,Ljungquist,Lizer,Lizarda,Livi,Livezey,Liverani,Livas,Liuzza,Litzsinger,Litza,Littlehale,Litter,Litehiser,Litecky,Liskovec,Liskiewicz,Liskai,Lisius,Lisiecki,Lisherness,Lisanti,Lipstone,Lipsitz,Lippi,Lipovsky,Lipkind,Lipke,Lipitz,Lipa,Liontos,Linzie,Linstrom,Linssen,Linsner,Linsay,Linnecke,Linnan,Linkkila,Linginfelter,Lingberg,Lingardo,Lingao,Linea,Lindwall,Lindskog,Lindline,Lindesmith,Lincicum,Linahan,Limthong,Limesand,Limauro,Limardo,Lilleberg,Liljedahl,Liljeberg,Lilja,Likio,Ligons,Lifshitz,Liesch,Lierle,Lienke,Lienemann,Liekhus,Liederbach,Lieder,Liechti,Liebskind,Liebhardt,Liebelt,Lie,Liddie,Lidbom,Licor,Lico,Lickness,Lickiss,Lickey,Lichtig,Lichtenwalter,Lichte,Lichstein,Lichorat,Lichlyter,Liccione,Licalzi,Librizzi,Libre,Librandi,Libke,Libert,Liano,Lianes,Lezon,Lezer,Lezak,Leynes,Lewton,Lewry,Lewandowsky,Levo,Levites,Levitch,Levitas,Levister,Levinsky,Leverentz,Levendosky,Leuty,Leuters,Leusink,Leupold,Leuchs,Letteney,Letteer,Letrent,Letourneaux,Letofsky,Letman,Letko,Letang,Letalien,Lestelle,Lessin,Lessenberry,Lessen,Lessa,Lespier,Lesky,Leshure,Leshko,Lescavage,Lermond,Lerew,Leonti,Leonaggeo,Lenza,Lenters,Lenord,Lenny,Lennert,Lenix,Lening,Lengle,Lengacher,Lener,Leneave,Lencioni,Lempe,Lemone,Lemin,Lemich,Lemert,Lelis,Lele,Lekwa,Lejune,Leitze,Leitem,Leistner,Leipheimer,Leimkuehler,Leiding,Leidel,Leidall,Leichty,Leichtman,Leibenstein,Leiba,Lehrian,Lehrfeld,Legrow,Legrant,Legore,Leghorn,Legel,Legallo,Lefew,Leemow,Leebrick,Ledy,Leduke,Ledon,Ledley,Ledec,Ledebuhr,Lecoultre,Leconey,Leckington,Lechlak,Lechel,Lebovic,Lebourgeois,Leberman,Lebario,Leavelle,Leasy,Leah,Leagjeld,Leafe,Leabow,Lazzar,Lazer,Lazenson,Lazenberry,Layher,Lawe,Lavon,Lavina,Lavette,Laverne,Laverette,Lavee,Lavear,Lavatch,Lauwers,Lauw,Lauture,Lautman,Lauters,Laurion,Laurens,Laurenceau,Launt,Launelez,Laughbaum,Lauerman,Laudat,Laubacher,Latzka,Latzig,Latortue,Lathon,Lathim,Latessa,Latella,Lataille,Lasyone,Lastovica,Lasselle,Lask,Lashutva,Laserna,Lascody,Lasaint,Larve,Laruffa,Larsh,Larreta,Larko,Largay,Larey,Lardydell,Larde,Laravie,Larate,Laquay,Lapuz,Laprairie,Lapora,Lapiana,Lanzoni,Lanzillotti,Lanzillo,Lanzer,Lanzalotti,Lanton,Lantey,Lansdowne,Lansden,Lansang,Lanquist,Lanosga,Lanosa,Laninga,Langsdale,Langoni,Langlands,Langhout,Langhorst,Langenheim,Langehennig,Laneve,Landucci,Landsberry,Landrey,Landolfo,Landkamer,Landham,Landgrebe,Landefeld,Lampp,Lamparski,Lamorgese,Lamorella,Lammie,Lamielle,Lamela,Lambourne,Lambino,Lamberto,Lamber,Lambeck,Lamascolo,Lamarsh,Lamantagne,Lamaitre,Lalumiere,Lallo,Laliberty,Lalata,Lalanne,Laland,Lakner,Laity,Lahrman,Lahmann,Lahip,Lagroon,Lagoa,Laginess,Lagge,Lagatella,Lagassie,Laganga,Lafranca,Lafosse,Laffredo,Laferty,Lafera,Lafaver,Lafauci,Laesser,Ladyman,Ladtkow,Laditka,Ladeau,Ladas,Lacouette,Lacosta,Lacock,Lacks,Lackman,Lackie,Lachley,Lacassagne,Labrune,Labrode,Labreque,Labrec,Labog,Labkovsky,Labita,Labbie,Lababit,Laaker,Kylish,Kyhn,Kwiat,Kwasny,Kwack,Kvilhaug,Kuznicki,Kuzmish,Kuzmanic,Kuzemchak,Kuttler,Kutella,Kutchin,Kuszlyk,Kusumoto,Kusuma,Kustes,Kusinski,Kushlan,Kushiner,Kushin,Kusak,Kurzyniec,Kury,Kurter,Kurrie,Kurpiel,Kurkjian,Kurk,Kurisu,Kupres,Kuokkanen,Kunzie,Kunzel,Kunis,Kuning,Kundrick,Kundla,Kundinger,Kully,Kullas,Kulkarni,Kulcona,Kulak,Kulacz,Kuks,Kuklis,Kuka,Kuja,Kuizinas,Kuhtz,Kuhnle,Kuhnen,Kuhnemund,Kuhnel,Kuhens,Kuharik,Kufner,Kufeldt,Kuenstler,Kuehnert,Kudzma,Kudasik,Kuczkowski,Kucinskas,Kuchto,Kuch,Kucel,Kucek,Kubica,Kubecka,Kuban,Kszaszcz,Krzywicki,Krzynowek,Krzal,Krystal,Krysiak,Krys,Krutsch,Kruss,Krusen,Krusemark,Krupiak,Krumsiek,Kruml,Krulish,Krulik,Krulicki,Krueth,Kruer,Kruel,Krows,Krossen,Krolikowski,Krolczyk,Kroetch,Kriticos,Krites,Krisher,Krinke,Krienke,Kriegh,Krichbaum,Kribbs,Kretchmar,Kreitzbender,Kreitler,Kreinbring,Kreb,Kreamalmeyer,Kreager,Krawiecz,Krawetz,Krasley,Krapfl,Kranze,Kranendonk,Kramper,Krampe,Kramm,Kralicek,Krajnovich,Krajcer,Krain,Kracker,Kozinski,Kownacki,Kown,Kowing,Kowallis,Kowall,Kowalcyk,Kowalchick,Kovacic,Kourt,Kourkoumellis,Kounter,Kounlavong,Kounce,Koulabout,Koualeski,Kotzur,Kottsick,Kottre,Kotte,Kotrys,Kotow,Kothenbeutel,Kotara,Kostyla,Kostich,Kostenko,Kossmann,Kossin,Kossakowski,Kossack,Kosoff,Kosmatka,Koshiol,Koscielak,Koscho,Korzenski,Kortz,Kortum,Korthauer,Korshak,Korsen,Korol,Korns,Kornprobst,Kornman,Kormann,Korineck,Korf,Koretsky,Korenic,Korbal,Koralewski,Koppelmann,Kopis,Kopiak,Kopera,Kopchick,Kooken,Kontogianis,Konon,Konn,Konieczko,Konick,Konicek,Koneval,Kondratowicz,Koncan,Konat,Komsthoeft,Komosinski,Kommer,Kominek,Koman,Kolthoff,Kology,Kolnik,Kolmetz,Kolling,Kolkowski,Kolkemeyer,Kolias,Kolen,Kolehmainen,Kolby,Kolberg,Kolat,Kokoska,Koistinen,Kohnert,Kohlmyer,Kofutua,Kofoid,Kofler,Kofa,Koetz,Koetje,Koerper,Koeppl,Koenning,Koenigstein,Koenigsfeld,Koelle,Koegel,Koebley,Koczera,Kochmanski,Kocaj,Koc,Koblick,Kobis,Kobialka,Kobernick,Kobak,Knost,Knori,Knopinski,Knoepfler,Knoche,Knipping,Knipfel,Knighter,Kniefel,Knie,Knickman,Knezevic,Knewtson,Knestrick,Knesel,Kneifel,Knavel,Knappe,Knackstedt,Klusmeyer,Klus,Klund,Klun,Kloos,Kloock,Kloiber,Klohr,Kloepper,Klocek,Klis,Klingerman,Klingen,Klines,Klimkowicz,Kliever,Kliem,Kleypas,Klevene,Kleppinger,Kleparek,Klepacz,Klemenc,Klemanski,Kleinwolterin,Kleinsmith,Kleinke,Kleinberger,Kleidon,Kleespies,Kleese,Kleekamp,Kleban,Klayman,Klay,Klaver,Klarman,Klarberg,Klapperich,Kjetland,Kizewski,Kiyabu,Kivioja,Kittner,Kittelberger,Kissik,Kisser,Kishaba,Kisch,Kirner,Kirkpatric,Kirchhofer,Kirchgessner,Kirchausen,Kirbie,Kiral,Kippes,Kipper,Kippel,Kintsel,Kintop,Kinseth,Kinroth,Kinnion,Kinningham,Kinnier,Kinnie,Kinkin,Kinkella,Kingshott,Kingore,Kingen,Kinerson,Kindermann,Kinart,Kinan,Kinabrew,Kimbral,Killean,Kilcrest,Kilb,Kilarjian,Kiffe,Kientz,Kiening,Kielich,Kieger,Kieft,Kieff,Kiefel,Kie,Khum,Khu,Khov,Khounborine,Khoun,Khoo,Khensovan,Khela,Khay,Khansari,Khanponaphan,Khano,Khammixay,Khalife,Khalifah,Khachatoorian,Keyna,Kexel,Kewish,Kettmann,Ketring,Ketler,Ketcheside,Ket,Kestle,Kessner,Kerzer,Kerss,Kerska,Kershbaumer,Keros,Kerntke,Kerkel,Keri,Kerger,Kereluk,Kerechanko,Kercado,Keppers,Keohane,Kennet,Kennealy,Kenely,Keneally,Kendrew,Kenderdine,Kenagy,Kenady,Kemner,Kemmler,Kemme,Kemerer,Kelzer,Kellon,Kello,Kellin,Kellebrew,Kellaway,Keliipio,Kelder,Kelash,Keitzer,Keigley,Keicher,Kegerries,Keens,Keemer,Keckler,Keaveny,Keath,Keasley,Kears,Keany,Keanum,Keamo,Kealohanui,Kazmi,Kazmer,Kazin,Kazeck,Kazakos,Kayrouz,Kaylo,Kawata,Kaveny,Kavadias,Kauphusman,Kaune,Kaull,Kaub,Katzberg,Katynski,Katula,Katten,Katsbulas,Katnik,Katechis,Katcsmorak,Katan,Kastning,Kastman,Kassell,Kassabaum,Kasprak,Kasica,Kasack,Karvonen,Karvis,Karpowich,Karpiak,Karnish,Karma,Karell,Kareem,Kardashian,Karczewski,Karayan,Karatz,Karadimas,Kapusniak,Kapraun,Kappe,Kappa,Kapitula,Kapfer,Kapelke,Kapa,Kaopua,Kantarian,Kanta,Kanoza,Kannard,Kanish,Kaniecki,Kanevsky,Kaner,Kandra,Kanda,Kanatzar,Kanable,Kamph,Kamnik,Kammes,Kammerdiener,Kamerad,Kamelamela,Kamealoha,Kame,Kamb,Kaluzny,Kalupa,Kaluna,Kaltved,Kalter,Kalscheuer,Kalmus,Kalmer,Kalland,Kalima,Kalichman,Kalfa,Kalbaugh,Kakudji,Kaitz,Kainoa,Kailey,Kaiama,Kahrer,Kahola,Kahana,Kagay,Kafel,Kaetzel,Kaesemeyer,Kaer,Kaea,Kaduk,Kadis,Kaderlik,Kade,Kacik,Kachikian,Kacerski,Kaboos,Kabba,Kaaz,Kaauamo,Juza,Justino,Justason,Jurs,Jurisch,Jurgensmeier,Jurden,Jura,Jungling,Julye,Juluke,Julock,Julias,Julen,Jufer,Juedes,Jubic,Juariqui,Juaire,Jozsa,Joulwan,Jostes,Josten,Josich,Josias,Joshlin,Josefy,Josef,Jorski,Jorn,Jorinscay,Jorda,Jons,Jongeling,Jongebloed,Jondle,Jolls,Johnshoy,Johnico,Johanek,Jirjis,Jiran,Jimmison,Jill,Jewels,Jevtic,Jetty,Jesmer,Jes,Jerone,Jerko,Jenschke,Jenquin,Jennins,Jennelle,Jenison,Jendrick,Jeminez,Jellis,Jekot,Jekel,Jehl,Jebb,Jeavons,Jeanneret,Jeane,Jeancharles,Jeanbaptise,Jaworowicz,Javellana,Jaurigui,Jauch,Jastrzebski,Jass,Jasmine,Jarzembowski,Jarver,Jarosh,Jaroscak,Jarnesky,Jares,Jarell,Jaradat,Jarad,Jaquins,Janulewicz,Jansing,Janrhett,Janowicz,Janosek,Jannetti,Jannell,Janeczko,Jandron,Janczunski,Jancik,Janacek,Jamwant,Jamili,Jakovac,Jagoe,Jaffy,Jaeschke,Jaenke,Jacque,Jacobos,Jackovitz,Jackola,Jackley,Jacka,Jacckson,Jablonsky,Jabiro,Jabaay,Jaap,Iyengar,Iwanowski,Iwanejko,Ivon,Iverslie,Ivanov,Ivancich,Iturralde,Ittner,Israelsen,Israels,Ismay,Isleib,Isita,Isiordia,Ising,Isidore,Isbill,Isagawa,Isacs,Isaacsen,Irzyk,Irizzary,Irineo,Irimata,Ireton,Irestone,Iozzo,Iozzi,Iopa,Intrabartolo,Intihar,Insko,Insana,Inocente,Ink,Inhulsen,Ingole,Inches,Inafuku,Imperatore,Imgrund,Imbimbo,Imbier,Imaino,Ilse,Illuzzi,Illian,Ilic,Ilasin,Ilagan,Iker,Ihnat,Ihm,Igwe,Igtanloc,Ifversen,Iese,Ieng,Ienco,Idemoto,Icard,Iborra,Ible,Iberg,Ibbetson,Ibale,Iavarone,Iatarola,Iacovino,Iacopino,Iacobellis,Iachetta,Hysom,Hymowitz,Hymon,Hymen,Hylands,Hych,Huy,Huval,Hutmacher,Huszar,Hustace,Hussien,Huskinson,Husfelt,Husenaj,Husch,Hurtig,Hurtgen,Huro,Hurne,Hurlston,Hupman,Huor,Hunzelman,Hunsperger,Hunneyman,Hunckler,Humphrys,Humphers,Humetewa,Humeniuk,Humenik,Hulstrand,Hullings,Hulitt,Hulick,Huland,Huiting,Hugron,Hufstedler,Huffner,Huezo,Huettman,Huereca,Huenink,Huelse,Hueckman,Hudgeons,Hudach,Huckstadt,Huckle,Huckabey,Hubschmitt,Hubin,Hubertus,Hubby,Hubbel,Huban,Huaman,Hsun,Hsiang,Hrapski,Hoznour,Hoyman,Howkins,Howick,Howatt,Hovorka,Hovick,Hovanesian,Hounchell,Houf,Hotton,Hottes,Hotrum,Hotelling,Hotaki,Hostoffer,Hosterman,Hosteller,Hospkins,Hospelhorn,Hoscheit,Hoschander,Horstead,Horris,Hornoff,Hornberg,Hornandez,Hornack,Hormell,Horikoshi,Horigan,Horger,Hoppins,Hopperstad,Hopko,Hootsell,Hoopingarner,Hookano,Hooghkirk,Hoofard,Hoock,Honsinger,Honour,Honnette,Honnerlaw,Honma,Honkanen,Hongach,Honeycott,Hondorp,Honchell,Honas,Honanie,Homsher,Homestead,Holze,Holtorf,Holthus,Holster,Holsonback,Holom,Hollinrake,Hollidge,Hollerman,Hollendonner,Hollberg,Holk,Holian,Holes,Holecz,Holec,Holdvogt,Hokutan,Hok,Hoiness,Hoilman,Hohiudden,Hohensee,Hohaia,Hogelin,Hogatt,Hogarty,Hoftiezer,Hoffstatter,Hoffnagle,Hoffeditz,Hoffart,Hoerl,Hoefel,Hodos,Hodnefield,Hockins,Hockenbrock,Hocke,Hochard,Hocate,Hobler,Hober,Hoben,Hobell,Hobden,Hoagberg,Hnyda,Hlavka,Hladik,Hladek,Hitchen,Hislope,Hirschberg,Hirneise,Hirn,Hirliman,Hirleman,Hirao,Hippenstiel,Hintson,Hint,Hinley,Hinh,Hinebaugh,Hindson,Hinderberger,Himmelmann,Himanga,Him,Hilston,Hilstad,Hilser,Hilsendager,Hilsenbeck,Hilscher,Hilsabeck,Hilpert,Hilman,Hillerud,Hillebrano,Hillebrandt,Hilland,Hilgers,Hilgeman,Hilfiker,Hildago,Hilda,Hilbrand,Hikel,Highbaugh,Higgons,Higgenbottom,Hiersche,Hierholcer,Hiedeman,Hiday,Hickethier,Hichens,Hibbitt,Heyduck,Hewko,Hevron,Heuwinkel,Heuvelmann,Heusner,Heung,Heuett,Heuck,Hettinga,Hessey,Hespen,Hescock,Heschke,Hervig,Hertzel,Herston,Herstad,Hershkop,Hershelman,Herschelman,Herriges,Herres,Herrarte,Herpich,Hernanez,Hernanadez,Hernan,Hermenau,Hermanowicz,Herkstroeter,Herkenratt,Herera,Herendeen,Herauf,Henstrom,Hense,Henrity,Hennigh,Hennies,Henneberry,Henkey,Henjes,Hengl,Hengen,Henfling,Henerson,Henein,Hendrik,Hendricksen,Hendeson,Henderso,Henderlite,Hemon,Hemmann,Hemker,Hemesath,Hemani,Helweg,Helverson,Helseth,Helquist,Helom,Helmstetter,Helmsing,Hellweg,Hellmich,Helgager,Helgaas,Helfenbein,Helems,Helem,Helde,Heiting,Heither,Heisdorffer,Heiro,Heirendt,Heinzig,Heiniger,Heingartner,Heimlicher,Heimburger,Heiken,Heidtman,Heidrich,Heidi,Heidelberger,Heidebrecht,Heick,Heibult,Heholt,Heggood,Heeth,Heers,Heern,Heerkes,Hedtke,Hedspeth,Hedon,Hedinger,Hecke,Hechinger,Hebeisen,Heatherton,Heartsill,Heagney,Heafey,Headly,Headland,Headlam,Headington,Heade,Hazy,Hazim,Haza,Haynam,Hayertz,Haydt,Haxby,Hawse,Hawkinberry,Hawe,Havlin,Havir,Havelka,Hauxwell,Hautan,Hausrath,Hauptmann,Haughn,Hauersperger,Hatzenbihler,Hattley,Hatta,Hatori,Hathorne,Hatchitt,Hatchet,Hatada,Hastin,Hastedt,Hassing,Hassenger,Hassanein,Hasker,Haskel,Hashaway,Hasenfuss,Hasenfratz,Hascup,Hasas,Hartwigsen,Hartrum,Hartquist,Hartory,Hartlen,Hartleben,Hartinger,Harsin,Harritt,Harriage,Harpham,Harnos,Harnist,Harleman,Harlee,Harke,Hargers,Hardter,Hardsock,Hardnette,Hardine,Hardi,Hardges,Harderman,Harde,Hardan,Harcar,Harbater,Harapat,Harang,Haq,Hanzl,Hansome,Hansman,Hansis,Hansing,Hanoa,Hanninen,Hannaway,Hannawalt,Hanmer,Hankison,Hanible,Hanenberger,Haneke,Hanebutt,Handzlik,Handsom,Handkins,Handke,Handin,Hanback,Hanawalt,Hanavan,Hamsik,Hamonds,Hammette,Hammerman,Hammacher,Hamlette,Hamiltan,Hamidi,Hamff,Hamett,Hamersly,Hamers,Hamdn,Hamden,Hamberry,Hamara,Hamacher,Halyk,Haltiwanger,Halstrom,Halse,Halpert,Halnon,Hallo,Halliman,Hallemeyer,Hallack,Halima,Halick,Haldi,Halcott,Halbershtam,Halajian,Halaas,Hakey,Haitz,Hairell,Haims,Haifa,Hahnert,Haggin,Haggerton,Haggermaker,Hagey,Hafferkamp,Haferkamp,Haeuser,Haessly,Haese,Haerter,Haering,Haeder,Hadvab,Hadsall,Hadler,Hadesty,Haddenham,Hadaller,Hacopian,Hackl,Hackerott,Hacken,Hachting,Haboush,Hable,Habig,Habibi,Haberstroh,Habenicht,Haaz,Haakenstad,Haage,Gyllensten,Gwilt,Gwillim,Guzon,Guzewicz,Guye,Gutzler,Guttormson,Gutsche,Gutjahr,Gutgesell,Gutenberg,Gustitus,Gussow,Gusmar,Gushi,Gushard,Gurwell,Gurske,Gurrero,Gurin,Gurecki,Guoan,Gunzelman,Gunyon,Guntharp,Gunstream,Gungor,Gundelach,Gunawan,Gumprecht,Gumaer,Gulston,Gulnac,Gulizio,Gulbrandsen,Guitano,Guimares,Guillebeau,Guillary,Guillama,Guilfoos,Guiggey,Guiga,Guieb,Guidrey,Guiab,Guffanti,Guerrini,Guerrazzi,Guerera,Guenthur,Guell,Guedjian,Gudmundsson,Gucker,Gubin,Gubala,Guba,Guasp,Guarriello,Guarno,Guarini,Guanche,Guagenti,Gstohl,Grzesik,Grzebien,Gryszowka,Grymes,Gruz,Grustas,Gruse,Gruntz,Grunert,Grune,Grunberg,Grumney,Grumbling,Gruman,Grulkey,Gruiger,Gruening,Gruenewald,Gruby,Gruben,Grubel,Grubba,Grriffin,Groys,Growell,Grothaus,Grosskreutz,Groskreutz,Grosclaude,Groot,Gronstal,Gronquist,Gronlund,Gronitz,Gronberg,Grona,Gromoll,Grohowski,Grohman,Groetsch,Groder,Grobmyer,Groberg,Grivno,Grivetti,Grippen,Grine,Grimme,Grills,Grigoreas,Griglen,Griffitt,Griffan,Grieshop,Grieshaber,Griep,Grieff,Griebling,Griblin,Grev,Greubel,Gressmire,Gresco,Grenway,Grensky,Grennay,Grenko,Grenet,Gremo,Gremmels,Gregware,Gregus,Greggory,Gregan,Greep,Greenweig,Greensfelder,Greenhalge,Greengo,Greenbacker,Greem,Greder,Greczkowski,Grebner,Greber,Greason,Gream,Gravat,Grauman,Grauel,Grassle,Grasmick,Grapp,Granzella,Granto,Gransberry,Granquist,Granneman,Granieri,Granes,Grandon,Grandner,Granai,Grammont,Gramble,Graleski,Grainey,Grain,Graichen,Grahovac,Grageda,Gragas,Graffney,Graffagnino,Grafals,Gradley,Gradias,Gradford,Grabowsky,Grabonski,Grabler,Grabhorn,Graap,Gozman,Goyen,Goyda,Gowey,Gowda,Govostes,Govia,Gour,Gouldman,Gouldie,Gougis,Gotts,Gottemoeller,Gottdenger,Gotta,Gotshall,Gosvener,Gostlin,Gossow,Gosson,Gossling,Gosset,Gosey,Gorrindo,Gormanous,Gormally,Gorius,Gorena,Gorell,Gordley,Gordey,Gorbea,Goonen,Goodmon,Gonzelas,Gonzalis,Gonyou,Gonsiewski,Gonsar,Goney,Gomoran,Gomoll,Gollop,Gollob,Gollier,Golik,Golida,Golias,Golian,Golia,Golec,Goldthorpe,Goldhorn,Goldhirsh,Goldfuss,Goldfeld,Golderer,Goldenstein,Goldenman,Golde,Golbin,Golackson,Goicoechea,Goffigan,Goerlich,Goepfarth,Goepel,Goeing,Goehringer,Godboldt,Gochett,Gochal,Gocek,Goblirsch,Gnoza,Gnegy,Gnabah,Gmernicki,Glyn,Glueckert,Glowacky,Glovinsky,Gloston,Gloshen,Glos,Glogowski,Gloeckler,Glimpse,Glidwell,Glesener,Gleitz,Gleckler,Glebocki,Gleber,Glazner,Glazebrook,Glaves,Glavan,Glasby,Gladysiewski,Gladle,Gladhart,Gjeltema,Givant,Gius,Giulioli,Gitt,Girres,Girbach,Girand,Gip,Giottonini,Giorno,Gionta,Giombetti,Gioffre,Gioe,Ginzel,Ginsel,Ginocchio,Ginnis,Ginard,Gimse,Gilzow,Gilton,Gilstad,Gilomen,Gilner,Gilly,Gillming,Gillion,Gillich,Gillice,Gille,Giliberto,Gilhuly,Gilgan,Gildemeister,Gilcris,Gigger,Giffith,Giffee,Giff,Gietz,Giesel,Giera,Gibeaut,Gibala,Giasson,Giarusso,Giarrano,Giaquinta,Giannavola,Giandomenico,Gianandrea,Giallorenzo,Giacherio,Giachelli,Giacchi,Ghebremicael,Gezalyan,Getzschman,Getzlaff,Gettens,Gettelman,Gestether,Gesing,Gesamondo,Gerz,Gerwin,Gerveler,Gertsema,Gerthung,Gerten,Gertel,Gerteisen,Gerstenberger,Gershkovich,Gerney,Germy,Germana,Gerich,Gerdiman,Gerckens,Gerbig,Georghiou,Geoly,Gentleman,Gentges,Gentelia,Gensel,Geniesse,Genia,Generalao,Gemmiti,Geml,Gelner,Gellings,Gellinger,Gelino,Gelhar,Gelfond,Gelerter,Gelder,Gelbart,Geisinsky,Gehrki,Gehm,Geen,Gederman,Gede,Gearn,Geant,Gazzara,Gazitano,Gazdik,Gayanilo,Gawthorp,Gavit,Gaviglia,Gavett,Gavan,Gavagan,Gausman,Gaukroger,Gaufusi,Gaudier,Gaudett,Gauci,Gatzow,Gatta,Gatheright,Gatesy,Gatesman,Gastelo,Gaschke,Garwin,Garter,Gartenmayer,Gartenhaus,Garsjo,Garroutte,Garrettson,Garrean,Garre,Garnham,Garnache,Garmire,Garmen,Garlett,Garkow,Garito,Garinger,Gargan,Garcon,Gapp,Gantzler,Gantvoort,Gansert,Gansen,Ganns,Gannetti,Ganin,Ganigan,Gamotan,Gammond,Gamer,Gamello,Gambrill,Gambold,Gambee,Gambardella,Galven,Galvani,Galuszka,Galuppo,Galmore,Gallusser,Gallodoro,Gallington,Galleta,Gallegoz,Gallaugher,Gallargo,Galkin,Galipo,Galinis,Galimberti,Galic,Galbiso,Galathe,Galassini,Galanti,Galano,Galagher,Gajeski,Gajardo,Gaiters,Gails,Gailliard,Gaffer,Gafanha,Gaer,Gadewoltz,Gaden,Gackle,Gabrial,Gabrenas,Gabossi,Gables,Gabl,Gabhart,Gabeline,Gabbamonte,Fyler,Fykes,Fusner,Fusillo,Fushimi,Fus,Furtak,Furblur,Fundora,Funderberg,Fumero,Fuls,Fulham,Fulco,Fujimura,Fujikake,Fugueroa,Fuger,Fugatt,Fuerstenau,Fuerbringer,Frymoyer,Frymier,Frymark,Frutiger,Frushour,Fruman,Fruin,Frugoli,Fruehauf,Froyd,Frosto,Frontis,Frontiero,Fronick,Froneberger,Frohberg,Froebe,Frobish,Frittz,Fritchley,Fritchey,Frisinger,Frisell,Frija,Friehauf,Friedenthal,Friebel,Freundlich,Fret,Frerich,Frens,Freker,Freiseis,Freimark,Freilino,Freiheit,Freiermuth,Freidin,Freemantle,Freeh,Freedlander,Freeders,Freeburger,Fredregill,Frederique,Freckleton,Frecker,Frazzano,Frauenfelder,Frattali,Fratta,Fratrick,Fratercangelo,Frasso,Frashure,Fraschilla,Franzman,Franzini,Franza,Franty,Fransisco,Franpton,Frankson,Frankland,Frankiewicz,Frankart,Frangione,Franchini,Francescone,Fralic,Fraklin,Frair,Fragosa,Fradkin,Fracasso,Foyer,Foxhoven,Fowlie,Fowley,Fowlar,Fower,Foute,Foussell,Fouquette,Founds,Fougner,Fosmire,Fosher,Fosbrook,Fortun,Forss,Forsmann,Forslin,Forsee,Forpahl,Fornili,Fornier,Fornaro,Formichelli,Formaggioni,Forkum,Forkell,Foriest,Forgrave,Foresta,Forejt,Foreback,Forcum,Forcht,Forchione,Forch,Forberg,Forbach,Fonua,Fonteno,Fonteneau,Fongvongsa,Fondriest,Fondaw,Fonck,Fohl,Foglio,Foersterling,Foddrell,Focke,Flugum,Flucas,Fluaitt,Floss,Florendo,Floras,Floer,Flockhart,Flockerzi,Floan,Flin,Fliger,Flieller,Fleurilus,Flenord,Fleniken,Flenaugh,Flemmon,Flemm,Fleites,Fleischner,Fleckles,Flechas,Flauding,Flatter,Flato,Flanner,Flanegan,Flammang,Flakne,Flaker,Flagiello,Fladung,Flachs,Flaa,Fiwck,Fitzrandolph,Fitzherbert,Fitzgerrel,Fitsgerald,Fisser,Fishell,Fischl,Fischhaber,Fischel,Fiscella,Fiscel,Firpi,Firenze,Fiorilli,Fiorica,Finwall,Finklestein,Fingerson,Fingerman,Fineout,Finello,Finell,Findlen,Finco,Filthaut,Filpus,Filo,Filla,Fili,Fil,Figiel,Figgeurs,Figert,Fietek,Fiest,Fieser,Fiesel,Fickbohm,Ficht,Ficchi,Fialho,Fial,Feyh,Feyereisen,Feuss,Feusier,Fette,Festini,Fest,Fesko,Fertik,Ferrusi,Ferrone,Ferrio,Ferringo,Ferries,Ferrie,Ferrett,Ferrato,Ferrario,Ferraraccio,Ferranto,Ferr,Ferouz,Fernette,Fernanders,Ferkel,Feret,Ferer,Ferenz,Fenrich,Fenniman,Fennig,Fenison,Fendrick,Fendlason,Fend,Fenbert,Felver,Feltham,Felonia,Felling,Fellezs,Felizardo,Felio,Felicien,Felicia,Felicano,Feliberty,Feistner,Feister,Feintuch,Feilds,Feighner,Feierman,Fehrs,Fegueroa,Fegles,Fegette,Feerick,Feela,Feehly,Feehery,Fedorko,Fedie,Fedezko,Fedewa,Federkeil,Fecto,Fechtig,Fecher,Featheroff,Feagans,Fazzari,Faycurry,Fawson,Fawler,Favuzzi,Favro,Favian,Favazza,Fausey,Faus,Faupel,Fattore,Fatora,Fathy,Fathree,Fatheree,Fassinger,Faske,Farug,Fars,Farnese,Farkus,Farinha,Faren,Faraimo,Farahkhan,Faragher,Fanti,Fanter,Fantazia,Fantauzzo,Fansher,Fandino,Fanatia,Famageltto,Falzon,Fallow,Fallenstein,Falencki,Falcioni,Falci,Failey,Failde,Faigley,Faidley,Fahrni,Fahrlander,Fahrenthold,Fahning,Fago,Fagle,Fagerquist,Fagerlund,Fageraes,Facello,Ezzelle,Eyton,Eyestone,Exton,Exantus,Evjen,Evilsizor,Evertt,Evertsen,Eversmeyer,Everroad,Everline,Everet,Evartt,Evansky,Evancho,Eull,Ettman,Ettienne,Ettel,Etringer,Eth,Estronza,Estrem,Estrade,Estok,Estle,Estimable,Estess,Estella,Estanislau,Essix,Essency,Esquinaldo,Espiridion,Espinel,Esperon,Espenlaub,Espejel,Esparsen,Esmont,Esmon,Esmay,Esmaili,Eskins,Eskind,Eshmon,Esfahani,Escober,Escanlar,Erz,Ersery,Eros,Ernster,Erlebach,Eriks,Erichson,Erger,Eredia,Erdos,Ercole,Ercolano,Erazmus,Eraso,Epel,Eovaldi,Ensz,Ensel,Enock,Ennes,Enis,Engnath,Engfer,Engelmeyer,Engelberg,Engard,Endris,Endreson,Endorf,Endersbe,Ende,Encino,Emshwiller,Empasis,Emore,Emmond,Emiliano,Emerling,Emenaha,Emde,Emberling,Emano,Elway,Elvey,Eltringham,Elter,Elsken,Elsheimer,Elsaesser,Elrick,Elreda,Elpert,Elnicki,Elmes,Ellsmore,Ellrod,Ello,Ellinghuysen,Ellingham,Ellingburg,Elles,Ellenbogen,Elleby,Ellcessor,Ellamar,Elke,Elijah,Eligio,Elieff,Elicker,Elian,Eliades,Elhadi,Elfenbein,Elenbaas,Eldringhoff,Eld,Elbie,Eke,Ekas,Eisnaugle,Eisiminger,Eisenhaver,Eisenhardt,Eisenberger,Eiselein,Einwalter,Eighmey,Eidemiller,Eickmeyer,Eichstedt,Eichenberg,Eichberg,Eibel,Ehrisman,Ehrenzeller,Ehman,Ehli,Ehl,Eheler,Egwuohua,Eglin,Egler,Egersdorf,Egelston,Efthimiou,Eelkema,Edu,Edridge,Edland,Edenholm,Edem,Economou,Eckmann,Eckblad,Eckardt,Echternach,Echter,Ebrahimi,Eberst,Ebershoff,Eberheart,Ebbett,Eayrs,Eavey,Eatough,Eastling,Eastern,Easterlin,Earthly,Earing,Eakles,Eagleman,Eacho,Eaby,Dzwonkowski,Dzurnak,Dzurilla,Dziuba,Dzinski,Dziewanowski,Dziekan,Dyrstad,Dydo,Dvorsky,Duyer,Duttinger,Dutchess,Duston,Dush,Durward,Dursteler,Durpee,Durough,Durniok,Durnan,Durisseau,Duris,Duriga,Durda,Durboraw,Dura,Duquaine,Duplessy,Duplanti,Dupes,Duperre,Dupaski,Duos,Dunshie,Dunphe,Dunnell,Dunkinson,Dunkerley,Dunkan,Dunemann,Dunderman,Duncans,Dunahoe,Dumouchel,Dummett,Dumeny,Dumbar,Dumar,Dulan,Dukett,Duk,Duis,Duguette,Dugre,Dufrain,Dufauchard,Duesterhaus,Duesterback,Duerst,Duenwald,Dudzik,Dudycha,Dudenbostel,Dudden,Ducklow,Duckey,Duchnowski,Duchane,Duceman,Dubovsky,Dubler,Duber,Dubel,Dubbert,Drutman,Drummey,Drumbore,Droy,Drow,Droubay,Drorbaugh,Dropinski,Dronko,Dronick,Droggitis,Drissel,Driscol,Drinen,Driessen,Driedric,Dreuitt,Drenning,Drelick,Drejka,Dreiss,Drebes,Dratch,Drakulic,Drakos,Draime,Dragovich,Dragich,Draggett,Dragg,Drabicki,Doyscher,Doxbeck,Downy,Downhour,Dowland,Dowker,Dowds,Dowda,Douyette,Douthett,Doughman,Dougharty,Douga,Doudna,Dotolo,Dossman,Dosh,Dorsinville,Dorsay,Dorrill,Dorosh,Dornbrook,Dorlando,Dorio,Dorie,Dorcas,Doporto,Dopita,Doorley,Dooner,Donton,Dono,Donnerberg,Donnalley,Donlyuk,Donkle,Donilon,Doniger,Donigan,Doniel,Doncaster,Donatich,Donaher,Donah,Donaghue,Donaby,Domowicz,Domitrovich,Dominowski,Dominiak,Domenice,Dombek,Domagalski,Domagall,Dolsen,Dolmajian,Dolley,Dolinski,Dolhun,Dolfi,Dolecek,Dokovic,Dok,Dohrn,Doerksen,Doelger,Doeberling,Dody,Dodimead,Dodgion,Dockum,Dockerty,Dochterman,Dobrzykowski,Dobrynski,Dobrushin,Dobrosky,Dobrinin,Dobison,Dobbyn,Dobbe,Dlugos,Ditucci,Dittus,Dittmann,Dito,Ditmars,Disotell,Disorda,Disharoon,Dischner,Discala,Disalvi,Dirth,Dirr,Dirienzo,Dipolito,Dipilato,Dipietrantoni,Dipanfilo,Dioneff,Diomede,Dinuzzo,Dintino,Dinsmoor,Dinsdale,Dinos,Dinora,Dinnendahl,Dinkle,Dininger,Dingillo,Dingie,Dingell,Dimitry,Dimicco,Dimezza,Dimarzio,Dimario,Dimariano,Dimanche,Dilucca,Dillis,Dilliner,Dillin,Dillashaw,Dilillo,Dilg,Dilella,Diker,Digiouanni,Digeorgio,Difronzo,Difrancisco,Dietterick,Diestler,Dies,Dierkes,Diekema,Diederichs,Dieball,Didway,Didonatis,Didomizio,Didio,Didato,Dicosmo,Dicorpo,Dicocco,Diclaudio,Dichiaro,Dible,Diblase,Dibiasi,Dibbern,Diano,Diani,Diangelis,Diamantopoulo,Diaco,Dhruva,Dheel,Dharas,Dezalia,Deyak,Deya,Dewolff,Dewick,Dewese,Dewater,Devot,Devost,Devis,Devilliers,Devery,Deveny,Devenny,Develice,Devasier,Devarona,Devanski,Devai,Deus,Dettorre,Dettor,Detrolio,Detrich,Detillion,Deteso,Determann,Deterline,Deterding,Detchon,Detaeye,Destina,Destefani,Desruisseaux,Desormeau,Desonia,Desmore,Desko,Desimas,Desher,Deshayes,Deschene,Desantos,Desando,Desamparo,Desalvatore,Derx,Deruiter,Derosie,Derogatis,Derman,Derkas,Derivan,Derington,Derienzo,Derian,Dereus,Derenzi,Derentis,Derderian,Derastel,Deraps,Dequinzio,Deprato,Depont,Depiro,Depierro,Depeyster,Deonarine,Deocampo,Denzine,Denwood,Denos,Denooyer,Denomme,Denoia,Dennig,Denjen,Denisco,Denick,Denholm,Denfip,Deneui,Denetclaw,Denet,Denery,Demuzio,Demske,Dempewolf,Demorrett,Demorizi,Demny,Demiter,Demilt,Demik,Demien,Demianczyk,Demetrakos,Demer,Dembek,Demauro,Demase,Demart,Demarino,Deluzio,Delullo,Delucian,Deltufo,Deltora,Delsoin,Delsavio,Delross,Delperdang,Delpaggio,Delosier,Delonge,Delonais,Deloge,Delmendo,Dellwo,Dellum,Dellosso,Delliveneri,Dellefave,Dellarose,Dellapenta,Dellamonica,Delgoda,Delekta,Delegado,Deldonno,Delco,Delce,Delbene,Delavergne,Delashmutt,Delapuente,Delaporte,Delana,Delallo,Delahay,Delagol,Delagado,Delabarre,Dekruif,Dekoning,Dekeyzer,Dejoseph,Dejardin,Dejarden,Deister,Deigado,Deichmann,Deichman,Dehm,Dehlinger,Dehl,Dehetre,Dehaney,Dehaas,Degrood,Degrass,Degrande,Degooyer,Degnim,Deglandon,Degenfelder,Degenaro,Degear,Degagne,Defrang,Defrain,Defosset,Defosse,Defont,Defir,Defayette,Deerdoff,Deely,Dedrickson,Dednam,Dederich,Decurtis,Decourt,Decourcey,Decock,Declerk,Decius,Dechavez,Dech,December,Decarvalho,Decarmine,Decaire,Decaen,Debrosse,Debreto,Debrecht,Debrae,Debore,Debien,Debenedictis,Debarge,Debardelaben,Debaets,Deasis,Dears,Dearruda,Dearring,Dearinger,Dearin,Dearcos,Deanes,Deakyne,Dazzi,Dazi,Dayao,Dawkin,Davolt,Davise,Davine,Davidsmeyer,Davidowicz,Davaz,Davari,Davance,Dauster,Dause,Daulerio,Daughters,Daugereau,Daubney,Datamphay,Dasouza,Daskal,Dashno,Dashne,Dasen,Daschofsky,Dasch,Darwich,Darvish,Darveau,Darting,Darthard,Darron,Daron,Darnstaedt,Darmody,Darmiento,Darington,Dariano,Daria,Dardenne,Darakjian,Danyow,Dannis,Danniels,Danni,Dannelly,Dannelley,Dannatt,Daniely,Dangelis,Danese,Daner,Dandoy,Danco,Danca,Danas,Damrell,Damone,Damms,Damme,Dalporto,Daloisio,Dalmata,Dallison,Dallam,Dallago,Dalegowski,Dalecki,Daku,Daking,Daken,Dajer,Dajani,Daidone,Dahlka,Dagres,Dago,Dager,Dafonte,Dada,Daczewitz,Dach,Czysz,Czubakowski,Czartoryski,Czapiewski,Cyrnek,Cyree,Cygrymus,Cwikla,Cwalinski,Cutrera,Cuther,Cutchember,Cushner,Cusenza,Curreri,Curlis,Curio,Curimao,Curia,Curey,Cunio,Cumoletti,Cumberlander,Culpit,Culloton,Cuffy,Cuffman,Cuddington,Cucuta,Cucufate,Cubine,Cubano,Cuadras,Csuhta,Crutison,Cruther,Crusinberry,Crummell,Crumly,Cruff,Crozat,Crossmon,Crosiar,Crookshank,Crookes,Cronoble,Croner,Cromeans,Crolley,Crofutt,Crockette,Crivelli,Crivaro,Cristino,Criste,Crissey,Crisalli,Criley,Cribari,Crewe,Creselious,Crescenti,Crepps,Crenwelge,Creitz,Cregin,Cregger,Creekbaum,Credi,Crebs,Crayford,Cravy,Cravalho,Crauswell,Crathers,Crask,Crapp,Crape,Crapanzano,Cranson,Crans,Crannell,Crandal,Craigwell,Craigmyle,Crafter,Cradler,Coxwell,Coxen,Cowlin,Covitz,Coventon,Coutre,Coutinho,Coutermarsh,Courton,Courseault,Courrege,Courey,Coulon,Coulibaly,Couden,Coton,Coste,Cossett,Cosman,Cosma,Coslow,Cosico,Coshow,Corwell,Corvo,Corujo,Cortopassi,Cortinez,Cortijo,Corrio,Corrington,Corriher,Corridan,Corrga,Correla,Corping,Corpe,Coroniti,Cornn,Cornmesser,Cornella,Corneille,Corkron,Corf,Coreen,Cordiero,Cordew,Cordenas,Corcuera,Corbley,Coray,Coraham,Copstead,Copsey,Copping,Coppes,Copney,Coopper,Cooperider,Coopage,Coonse,Cookerly,Conwright,Contreraz,Continenza,Contes,Consuelo,Constine,Constanzo,Constantin,Constancio,Consentino,Conradt,Conour,Conoley,Conney,Connerat,Conlogue,Conforme,Confalone,Coneway,Condroski,Condina,Condiff,Condi,Conchado,Conch,Concatelli,Conaughty,Commerford,Comissiong,Cominski,Cominotti,Comar,Colschen,Colpi,Colpa,Colony,Collons,Collon,Collicott,Collea,Collari,Colker,Colier,Colesar,Colemen,Colecchi,Colcher,Colchado,Coklow,Cokel,Cohick,Cofone,Coffinberger,Coffell,Coffel,Codispot,Codilla,Cocroft,Cockerhan,Cochren,Cochenour,Cobetto,Cobar,Coalter,Clyman,Cluver,Clusky,Clunes,Clukies,Clowerd,Clouatre,Clossin,Cloos,Clokey,Clinkinbeard,Cliffton,Clibon,Clevland,Cleverley,Clesca,Clerc,Clemenza,Cleath,Cleasby,Cleal,Clavijo,Clater,Claros,Claghorn,Clacher,Clabo,Civil,Cittadini,Citroni,Cissel,Cisar,Cirella,Circelli,Ciprian,Cipcic,Ciotta,Cinnamond,Cinkan,Cinco,Cinar,Cimorelli,Ciminera,Cilenti,Cihak,Cieloszyk,Cidre,Cicen,Cicali,Cibik,Ciavardini,Cianfrani,Cianciola,Ciallella,Ciaffone,Chyle,Chy,Churchfield,Churape,Chuma,Chulla,Chueng,Chubicks,Chrystal,Chrosniak,Chriswell,Christopoulos,Christi,Christerson,Christenbury,Chowenhill,Chowansky,Choudhary,Chor,Chopton,Cholula,Chollett,Choinski,Chocron,Chockley,Chochrek,Choates,Chlebus,Chiz,Chitrik,Chisman,Chiphe,Chiola,Chiodi,Chinault,Chime,Chimal,Chilsom,Chillo,Chicles,Chicharello,Chicalace,Chiariello,Chiappari,Chhan,Chham,Chez,Chevis,Cheverton,Cheverez,Cheu,Chessman,Cherubini,Cherrin,Cheroki,Cherny,Chernich,Chernesky,Cheranichit,Cheeseboro,Chech,Cheam,Chavoustie,Chavies,Chaumont,Chaulklin,Chatampaya,Chasson,Chassaniol,Chary,Charvet,Charry,Chari,Chararria,Chappo,Chappa,Chapmond,Chaplik,Chapen,Chanthasene,Chanler,Chanco,Chamul,Champaco,Chalupa,Challinor,Challa,Chalender,Chaknis,Chakkalakal,Chaisty,Chaddick,Chaboya,Chaberek,Chabbez,Cevera,Cerverizzo,Cerventez,Cervantsz,Cerva,Cerroni,Cerri,Cerrello,Cerone,Cernuto,Cernota,Cerminaro,Cerf,Ceretti,Cerceo,Cerasuolo,Ceraso,Cerasi,Cerar,Ceraos,Cepin,Cepas,Centi,Cendana,Cendan,Cellar,Celeya,Ceder,Cecot,Cazel,Cazaree,Cawon,Cawein,Cavrak,Caveness,Cavalaris,Cavaiani,Cauterucci,Caughorn,Caughell,Cauazos,Catts,Cattanach,Catrini,Catozzi,Catignani,Catholic,Catherson,Catherine,Cathell,Catello,Catchpole,Catanzano,Casuscelli,Castros,Castrey,Castongvay,Castillion,Castelum,Castells,Castellion,Cassler,Cassino,Cassilano,Cassiano,Cassetty,Cassens,Cassells,Cassavaugh,Cassagne,Cassa,Casolary,Casmore,Casley,Caska,Casis,Casini,Cashour,Cashmer,Cashett,Casement,Casciato,Casavez,Casasola,Casarz,Casar,Casana,Casales,Carvill,Carvallo,Cartner,Carrousal,Carrizo,Carretta,Carrethers,Carrao,Carran,Carpen,Caroselli,Carolla,Carnillo,Carnegia,Carmin,Carmickel,Carlini,Carland,Carknard,Carioscia,Carina,Carideo,Carfrey,Cardinalli,Cardiff,Cardazone,Carbonella,Carbery,Carbee,Caravetta,Caravati,Caramelo,Caramella,Caraig,Carabine,Cara,Capristo,Capri,Cappellini,Caporiccio,Capicotto,Capestro,Capener,Capek,Capas,Capaccino,Caoagdan,Canwell,Cantella,Cantakis,Canson,Cansino,Cansibog,Cannistraro,Canner,Caneza,Caney,Caneva,Canetta,Canestraro,Candozo,Candlish,Candell,Canant,Canalez,Can,Camus,Campora,Campobasso,Campble,Campau,Campain,Camlin,Camisa,Camerino,Camerano,Camenisch,Camelin,Cameli,Cambia,Camareno,Camancho,Camack,Calvan,Calumag,Caltagirone,Calowell,Callnan,Callington,Calliham,Calligaro,Caller,Callar,Callam,Callagy,Callagher,Callado,Caliman,Caldron,Caldoron,Caldarera,Calcao,Calaf,Cakmak,Cajulus,Cajka,Caivano,Caires,Caire,Caiozzo,Cains,Cainne,Caimi,Cagnon,Cagno,Cagan,Caffentzis,Cafasso,Caez,Caddigan,Caddel,Cacatian,Cabugos,Cabon,Cabarcas,Cabanillas,Cabanela,Cabam,Bywaters,Bystron,Byse,Byous,Bynun,Byczek,Bybel,Byal,Buzza,Buzo,Buzis,Buvinghausen,Butzke,Buttross,Buttray,Buttke,Buttitta,Butenhoff,Busscher,Busk,Busitzky,Bushweller,Bushrod,Bushfield,Buschur,Busacca,Burzlaff,Burvine,Burtts,Burtschi,Burtell,Bursik,Burrs,Burras,Burows,Burnie,Burnash,Burmside,Burm,Burly,Burlson,Burlile,Burlaza,Burlage,Burkstrand,Burkly,Burklow,Burkin,Burian,Burgs,Burgoa,Burgey,Burgees,Burfeind,Burdzel,Burchinal,Burbine,Buratti,Buonassisi,Buonaiuto,Buntz,Bunts,Buntenbach,Bunson,Bunda,Bumpaus,Bumbalo,Bumbaca,Bullivant,Bullin,Bulisco,Bulik,Buley,Bulat,Bukowiecki,Builes,Buhrke,Buhlig,Bugh,Buffone,Buenviaje,Bueler,Buehlman,Budzik,Budy,Budrovich,Budish,Budiao,Budhu,Buden,Buddy,Bud,Buczko,Bucknor,Buckmeon,Buckless,Buckett,Buckaloo,Buchwalter,Buchmiller,Buchmeier,Buchite,Buchinsky,Bucheli,Buchann,Buchal,Bucaro,Bubolz,Buboltz,Bubert,Brzezicki,Brzenk,Brys,Bryngelson,Bryla,Bryington,Bruzewski,Bruzek,Brustmann,Brusser,Bruscato,Brunzel,Brunkhardt,Brunick,Brunetta,Brunecz,Bruna,Brumaghim,Bruker,Bruin,Brugliera,Bruffee,Brueske,Bruegger,Bruechert,Bruckmeier,Brroks,Brozeski,Broyle,Brownlie,Browman,Broudy,Brothen,Broski,Brosi,Brookskennedy,Brookie,Bronston,Broncheau,Brommer,Brola,Broitzman,Brohn,Broglio,Brogley,Broers,Broering,Brodtmann,Brodis,Brodine,Brodfuehrer,Brodess,Brodes,Brockus,Brockenberry,Brociner,Brochet,Broadnay,Brizeno,Britts,Brinley,Brinkhaus,Brinius,Brininger,Bringer,Brindza,Brindger,Brinar,Brilowski,Brigner,Brightharp,Brighter,Brienza,Brienen,Bridenbecker,Brickson,Breznay,Brezinka,Breyers,Brevell,Brettmann,Bretos,Bresser,Brentz,Brennick,Brening,Brendeland,Brem,Breiter,Breihan,Breidigan,Bredlow,Bredin,Breckley,Breckenstein,Brebes,Breaz,Breaud,Breath,Bready,Brazie,Braunwarth,Braunberger,Brauman,Braucks,Brath,Brasure,Brasswell,Brasseux,Braskett,Brasby,Brantingham,Bransfield,Branseum,Brano,Brangers,Brang,Branes,Brandstrom,Brandorff,Brandom,Brandenburger,Branck,Brancaccio,Bramuchi,Bramlitt,Bramel,Bramasco,Bram,Brakke,Brak,Braget,Bragado,Brafman,Bradmon,Bradick,Bradey,Bradd,Bracklin,Brackbill,Brabazon,Braband,Bozych,Bozic,Boyl,Boyens,Boyde,Boyas,Bowlick,Bowle,Bowcock,Bouy,Bouvia,Bousum,Bourraine,Bourgon,Bourbois,Bouquin,Boumthavee,Boulger,Boulch,Boulais,Boughn,Bouges,Boudle,Boudjouk,Boucouvalas,Boucaud,Bottrell,Bottoni,Bottella,Bothner,Botellio,Boswink,Bostow,Bostain,Bosson,Bossier,Bossey,Bosold,Boslet,Boshnack,Boshell,Bosheers,Bosefski,Borza,Boryszewski,Borysewicz,Borson,Borseth,Borroto,Borrigo,Borriello,Borrello,Borowicz,Borovetz,Borovec,Borgelt,Bordinger,Bordas,Bord,Borcuk,Borcher,Borbridge,Boothman,Bookhardt,Boocock,Bonwell,Bonsal,Bonnoitt,Bonnifield,Bonnick,Bonnel,Bonker,Bonita,Boning,Bonifield,Boniface,Bongle,Bongivengo,Bongio,Bonge,Bonett,Bonebright,Bondroff,Bondoc,Bonda,Boncella,Bonaventure,Bonalumi,Bonadona,Bonaccorso,Bonaccorsi,Bompiani,Bommer,Bolvin,Boluda,Bolorin,Bolon,Bollom,Bollettino,Bolk,Boliver,Boline,Bolieu,Boliek,Boleyn,Boldul,Boldery,Bolante,Bokor,Boklund,Bojanowski,Boisuert,Boislard,Bohren,Bohmann,Bohlinger,Bohart,Boham,Bogust,Bogh,Bogatay,Bogany,Boeving,Boeshore,Boesenberg,Boerstler,Boers,Boenig,Boelsche,Boelke,Boekhout,Boekelman,Boehner,Boeckmann,Bodwin,Bodrey,Bodman,Bodiroga,Bodford,Bodensteiner,Bodenheimer,Boddorf,Boddeker,Bockskopf,Bocchi,Bocage,Bobola,Bobko,Boben,Boardway,Boards,Blyzes,Blumenkranz,Bloomgren,Blong,Blondeau,Blommel,Blois,Bloem,Blocklinger,Blisset,Blimka,Bliler,Bliese,Blice,Bleyer,Blette,Blesh,Blender,Blemel,Bleifus,Blechinger,Bleattler,Blazosky,Blatti,Blatteau,Blatnik,Blatchford,Blankship,Blankschan,Blandy,Blandino,Blakeway,Blakeborough,Blaho,Blackstar,Blackgoat,Blachly,Blacher,Blach,Bizcassa,Bizarro,Bivings,Bitsuie,Bitsui,Bitsko,Bistodeau,Bister,Bisonette,Bishel,Bisconer,Biscocho,Biscahall,Bisby,Bisagna,Birts,Birnell,Birkline,Birkenhead,Birenbaum,Birckett,Birckbichler,Birchwood,Biorkman,Bimler,Bilous,Billinghurst,Billey,Billeter,Billegas,Billard,Bilkiss,Bile,Bilcik,Bigos,Bignall,Bigio,Biggio,Bigas,Biffer,Biffar,Biesinger,Bieschke,Bierbrauer,Bienfang,Biehn,Biederwolf,Bieberle,Biebel,Bidon,Bidner,Bidgood,Bidez,Biderman,Bickleman,Bicklein,Bicket,Bicker,Bickart,Bichel,Biard,Bialik,Bialczyk,Bezner,Beyrer,Beylotte,Beyerl,Bevly,Beulah,Beul,Betzel,Betterman,Betsinger,Betschman,Betita,Bethurum,Bethoney,Beth,Beston,Besso,Bessick,Besio,Beshear,Besarra,Bervig,Bertus,Bertrano,Bertovich,Bertolasio,Bertog,Bertinetti,Bertelle,Bertel,Bertch,Bertagnoli,Berschauer,Bersamin,Bers,Berri,Berretti,Berretta,Berret,Bernucho,Bernt,Bernstrom,Berno,Bernick,Bernice,Bernhagen,Bernardoni,Bernabo,Bermers,Berlove,Berlinghof,Berkhalter,Berisha,Bergseng,Bergreen,Bergholz,Bergert,Berez,Beresnyak,Berdes,Beras,Benzschawel,Benzi,Benya,Benwell,Benty,Bentrup,Bentele,Benser,Bennison,Bennink,Bennerson,Bennerman,Benitone,Beniquez,Benik,Bengelsdorf,Benell,Beneduce,Benecke,Benear,Bendzans,Bendy,Bendt,Bendorf,Bendolph,Bendlage,Benders,Bendavid,Benck,Benassi,Benari,Benage,Benadom,Benabides,Bembury,Bemboom,Bemberry,Belyoussian,Belveal,Belsey,Belongie,Belone,Belon,Beloff,Belluomini,Belloma,Bellmay,Bellish,Bellisario,Bellingham,Bellflower,Bellfleur,Bellerdine,Bellemy,Bellazer,Belkowski,Belich,Belfiglio,Beley,Beldin,Belback,Belarde,Belangia,Bel,Bekerman,Beker,Bek,Beiswanger,Beirise,Behun,Behning,Behmer,Behlen,Begor,Begg,Beetley,Bees,Beermudez,Beerling,Beeck,Bedsaul,Bedoka,Bednorz,Becklund,Beckerdite,Beckendorf,Beckenbach,Bechthold,Bechman,Becherer,Beavin,Beauprez,Beaumier,Beauliev,Beaugard,Beaufait,Beaudrie,Beathe,Beasmore,Bearup,Bearfield,Beahn,Beadnell,Beadell,Bazzel,Bazzanella,Bazelais,Bazata,Bazarte,Baza,Bayle,Bayete,Bawa,Bavzee,Bavard,Bausley,Baunleuang,Baumgard,Baumbusch,Bauknight,Baugham,Bauers,Bauermeister,Baublitz,Battistini,Battiato,Battiata,Batters,Battaglini,Bathurst,Bathrick,Batel,Batalona,Basua,Bastura,Bastress,Bastilla,Bastidos,Bastic,Basten,Bastedo,Bastain,Bassil,Basset,Bashinelli,Basbas,Baruth,Barufaldi,Bartylla,Barts,Bartrop,Bartosz,Bartosiak,Bartolotto,Bartolet,Bartoldus,Bartnett,Bartlone,Barthen,Barthelman,Bartenfield,Bartczak,Barsotti,Barrocas,Barrile,Barrieau,Barrer,Barreira,Barranger,Barranca,Barquera,Barnscater,Barnfield,Barncastle,Barnathan,Barnar,Barlip,Barkins,Barkenhagen,Barkalow,Barimah,Baridon,Barhydt,Bargar,Barff,Bardeen,Barcelona,Barby,Barbini,Barbiere,Barbetta,Barberis,Barberian,Barban,Barasch,Baranow,Baranovic,Barajos,Baraby,Bapties,Banyas,Bantug,Bantin,Bantillan,Bantay,Bansbach,Bankemper,Banis,Banick,Banecker,Bandin,Bandemer,Bandanza,Bance,Banales,Bammon,Bamfield,Bambacigno,Bambaci,Balyeat,Balvanz,Balsano,Balmores,Ballreich,Balloon,Ballmer,Ballintyn,Balley,Balletta,Balhorn,Balford,Balezentis,Baldrey,Baldiviez,Balder,Baldassarre,Baldacchino,Balchunas,Balceiro,Balbin,Balaz,Balaski,Balancia,Balagtas,Bakst,Bakkum,Bakios,Bakeley,Bajorek,Bajdas,Baizer,Baitg,Baise,Bailony,Baillio,Baille,Baiera,Bahun,Bah,Bagne,Bagi,Baghdasarian,Bageant,Bagdonas,Baetz,Baeringer,Badget,Badeau,Baddeley,Bacy,Backey,Backenstose,Backen,Backe,Backbone,Baccouche,Bacco,Bacarella,Babitsch,Babena,Babbin,Babbel,Babat,Bab,Azzaro,Azoulay,Azimi,Azer,Aylsworth,Ayarza,Axline,Axelsen,Awtrey,Avola,Avie,Avetisyan,Averyt,Aveado,Avanzato,Avala,Auyer,Auxilien,Auwarter,Aurges,Aures,Auprey,Aupperle,Aunkst,Aumich,Aument,Aumavae,Aulbach,Aukes,Augspurger,Auffrey,Attridge,Attkisson,Attinger,Atta,Aton,Atoe,Atiyeh,Athmann,Athay,Atchity,Atallah,Atala,Astwood,Astolfi,Astol,Asters,Aspegren,Asma,Ashpole,Ashfield,Ashely,Asevedo,Aschmann,Asar,Asaeli,Arzilli,Arundel,Arujo,Aruiso,Arturo,Artry,Artison,Artinian,Arrizaga,Arriazola,Arpino,Arons,Aronhalt,Arntt,Arniotes,Arnholtz,Arneberg,Armillei,Armijos,Arm,Arleth,Arlen,Arlan,Arkins,Arjes,Arizzi,Arizola,Ariyoshi,Aring,Arimoto,Arigo,Arietta,Arie,Aridas,Aricas,Arhelger,Arhart,Arguillo,Arguellez,Argote,Argenal,Arenos,Arenivas,Arenivar,Arendz,Arendsee,Arebela,Ardizzone,Ardion,Ardery,Ardd,Ardan,Arcino,Arcilla,Arcea,Arcaute,Arcangel,Arcadipane,Arbry,Araque,Aramini,Arambuia,Aragus,Aragundi,Aragoni,Aragaki,Aradanas,Arabie,Arabia,Ar,Apyuan,Apuzzi,Apruzzese,Applewhaite,Applebury,Appeling,Appelgate,Apling,Apking,Apela,Aparo,Apa,Aoay,Anyan,Antrican,Antonopoulos,Antonis,Antonich,Antonaccio,Antona,Antolik,Antinore,Anteby,Anslinger,Ansbacher,Ansara,Annette,Ankersen,Anis,Aniol,Aningalan,Aniello,Anichini,Anibal,Angviano,Anglum,Angley,Angerer,Angeloro,Angeloff,Angelocci,Anestos,Anerton,Anelli,Andzulis,Andruss,Andrian,Andreatta,Andonian,Andon,Anderon,Andebe,Andary,Ancy,Ancell,Anasagasti,Anakalea,Anagnostou,Amyotte,Amtower,Amstein,Amsinger,Amsili,Amphy,Amonette,Amolsch,Amistoso,Amisano,Amidei,Amesquieto,Amert,Amento,Ameling,Amelang,Ambroz,Ambrosone,Ambres,Amble,Amberson,Ambeau,Amati,Amargo,Amancio,Amailla,Amadi,Alzugaray,Alvorez,Alverest,Alven,Alvarengo,Alvalle,Alvacado,Alummoottil,Alukonis,Alu,Altwies,Altum,Altringer,Altop,Altheimer,Altew,Alterio,Alsman,Alsdon,Alsbrooks,Alsandor,Alrich,Alrais,Almario,Allor,Allocca,Allnutt,Allmand,Allhands,Allgaeuer,Allessi,Allenbrand,Allemond,Allegre,Allcorn,Allbones,Allamong,Allaband,Algeo,Alge,Alfreds,Alfera,Alexzander,Alexiou,Alexaki,Alexader,Alevedo,Alerte,Alekna,Aleizar,Alegi,Alegar,Aleff,Alecca,Aldrege,Aldi,Aldarondo,Alcosiba,Alcombright,Alce,Alcaoa,Alcaide,Albriton,Albrekht,Albracht,Alberthal,Alberro,Alberda,Alattar,Alar,Alampi,Alamos,Alaibilla,Alacano,Akuchie,Akram,Akinyooye,Akiereisen,Aimbez,Ailstock,Ahyou,Ahrenholtz,Ahonen,Ahmau,Ahlstedt,Ahle,Ahlborn,Aharonof,Aharon,Ahal,Aguino,Aguillera,Aguiler,Agueda,Aguallo,Agrios,Agriesti,Agricola,Agreste,Agrela,Agre,Agney,Agne,Agliam,Agerton,Afoa,Aflalo,Affelt,Affagato,Afan,Aemmer,Adzhabakyan,Ady,Adside,Adrovel,Adrid,Adonis,Adleman,Adle,Adjutant,Adesso,Adels,Addo,Adamiak,Acron,Ackins,Ackies,Achziger,Achzet,Achekian,Ache,Acfalle,Accetturo,Abubakr,Abson,Abramowski,Aboytes,Aboulissan,Abling,Ablin,Ablang,Abke,Abetrani,Abernatha,Abela,Abeb,Abdin,Abdelwahed,Abdella,Abdeldayen,Abdel,Abbinanti,Abbay,Abbadessa,Abaya,Abaunza,Abatti,Aasby,Aaland,Aaby,Zysett,Zwinger,Zweier,Zuziak,Zusman,Zuro,Zurkus,Zurheide,Zurawik,Zuniega,Zumot,Zullig,Zukowsky,Zukof,Zukerman,Zuclich,Zuchara,Zubrzycki,Zuberbuhler,Zuazo,Zsohar,Zschoche,Zrimsek,Zoutte,Zotos,Zorzi,Zoroiwchak,Zorens,Zoquier,Zonia,Zone,Zondlo,Zomora,Zombro,Zombory,Zombo,Zomberg,Zolman,Zollar,Zolinski,Zolinas,Zoellick,Zoelle,Zoebisch,Zodrow,Zoda,Zobell,Zmiejko,Zlotnick,Zlatkin,Ziyad,Ziter,Zita,Zissler,Zisser,Zirin,Zircher,Zipse,Zipkin,Zipay,Zinni,Zinkl,Zimit,Zimba,Ziman,Ziler,Zilahi,Ziko,Zihal,Zieske,Zieser,Zientara,Ziencina,Zielonko,Ziek,Ziehm,Ziego,Ziegenhagen,Ziedan,Ziebold,Zidzik,Zickuhr,Zicari,Zibert,Zibelli,Ziak,Ziadie,Zezima,Zeyadeh,Zeto,Zetes,Zerzan,Zerring,Zerom,Zerck,Zerbel,Zentgraf,Zenker,Zener,Zenbaver,Zena,Zemon,Zemjanis,Zeminski,Zelmar,Zellous,Zellefrow,Zelkind,Zeleny,Zelenko,Zeis,Zeimetz,Zeimantz,Zeilman,Zehnpfennig,Zehe,Zeegers,Zeckzer,Zebell,Zebel,Zeals,Zdrojkowski,Zazozdor,Zaxas,Zawadzki,Zavatson,Zavadoski,Zatko,Zastawny,Zaspel,Zarzuela,Zarycki,Zarucki,Zart,Zarriello,Zarozinski,Zarnick,Zarkin,Zaritsky,Zarella,Zappolo,Zappile,Zappavigna,Zapoticky,Zapico,Zapato,Zapatas,Zanueta,Zanter,Zanola,Zanis,Zaneski,Zanco,Zamzam,Zamperini,Zamparini,Zampaglione,Zamostny,Zammiello,Zammetti,Zambotti,Zamborsky,Zam,Zalwsky,Zakarian,Zaituna,Zaitlin,Zaidel,Zaic,Zaibel,Zahri,Zahradka,Zahra,Zahorchak,Zaharchuk,Zagorac,Zagen,Zaffina,Zaffalon,Zadra,Zadow,Zador,Zadd,Zacharia,Zacharewicz,Zablonski,Zabka,Zabik,Zabielski,Zabek,Yuzn,Yuste,Yusi,Yurkanin,Yurich,Yurchiak,Yungclas,Yungbluth,Yunan,Yuki,Yueh,Yucha,Yslava,Yrigollen,Yragui,Ypina,Yozamp,Yovino,Yovanovich,Yournet,Younkins,Younglove,Younglas,Youket,Yosko,Yoshimori,Yorton,Yorn,Yorkman,Yorio,Yorgey,Yoquelet,Yonkoske,Yongue,Yonge,Yoney,Yonemori,Yonek,Yokiel,Yokely,Yoders,Yo,Yngsdal,Ylonen,Yilma,Yidiaris,Yezek,Yestramski,Yessios,Yeskey,Yerry,Yerly,Yerbich,Yenz,Yenney,Yenner,Yenglin,Yengich,Yendell,Yeldon,Yekel,Yeisley,Yeilding,Yegge,Yeend,Yeeloy,Yearicks,Yeamans,Yeakle,Ydara,Ybos,Yballe,Yavorsky,Yater,Yasutomi,Yasinski,Yarzabal,Yarrell,Yarish,Yanoff,Yannotti,Yankovitz,Yanity,Yanetta,Yandura,Yancik,Yanan,Yanai,Yamnitz,Yammine,Yamkosumpa,Yakulis,Yaklich,Yakel,Yahraus,Yahna,Yahl,Yagoudaef,Yagin,Yagecic,Yaftali,Yafei,Yafai,Yablonsky,Xander,Wzorek,Wykes,Wydryck,Wydo,Wydler,Wycuff,Wyborny,Wurts,Wurgler,Wuolle,Wunderly,Wun,Wulkan,Wuitschick,Wuestenberg,Wuerz,Wuellenweber,Wucherer,Wublin,Wubbel,Wrotten,Wrinkles,Wriedt,Wrenne,Wreede,Wraggs,Woyahn,Woulard,Woudenberg,Woskobojnik,Wosher,Wortinger,Worstell,Worst,Worner,Worn,Wormely,Worlow,Workings,Workinger,Wootan,Woolhouse,Wooleyhan,Woolcott,Woodliff,Woodert,Woodend,Woodburg,Woodand,Women,Wombolt,Wolzen,Wolthuis,Wolsted,Wolsky,Woloszczak,Woller,Wolkowski,Wolkowiecki,Woliver,Wolhok,Wolfsberger,Wolfred,Wolffe,Wolfertz,Wolbeck,Wokwicz,Wojtowich,Wojtecki,Wojnaroski,Wojeik,Woiwode,Wohlwendi,Wohlschlegel,Wohlrab,Wohld,Woester,Woernle,Woelzlein,Woelfle,Wodskow,Wlosinski,Wlodyka,Wlazlowski,Wlach,Wizar,Wiuff,Witvoet,Wittstruck,Wittry,Wittliff,Witterstauter,Witsell,Witosky,Withy,Witherbee,Withenshaw,Witczak,Wisterman,Wisnosky,Wisniowski,Wiskowski,Wisk,Wisinger,Wisenor,Wischner,Wisbey,Wirtjes,Wirght,Wirf,Wipprecht,Winzler,Winzenried,Wintringham,Winterton,Winterfeldt,Winterbottom,Winsted,Wins,Winninger,Winning,Winney,Winnewisser,Winners,Winnegan,Winklepleck,Winkleblack,Winkelpleck,Winkeljohn,Winkelbauer,Winingear,Winikoff,Wingstrom,Winett,Winesickle,Winesberry,Winek,Windmeyer,Windhurst,Windam,Wimpey,Wiman,Wilts,Wiltjer,Wilterdink,Willrett,Willour,Willmes,Willmann,Willinsky,Willington,Willigar,Williama,Willegal,Willcoxon,Willand,Willame,Willaby,Wilkowitz,Wilkers,Wilison,Wilis,Wilgocki,Wilging,Wilfinger,Wilebski,Wildin,Wildfong,Wilderson,Wildenthaler,Wildeisen,Wildauer,Wilcinski,Wilansky,Wilabay,Wikins,Wikert,Wik,Wiinikainen,Wiggains,Wigen,Wieto,Wiess,Wiesman,Wierzba,Wierschen,Wierschem,Wiehe,Wieger,Wiederwax,Wiederin,Wiede,Wieciech,Wiechert,Wiechec,Widrig,Widowski,Widmaier,Widlak,Widdoes,Wickus,Wicketts,Wickemeyer,Wicka,Wicinsky,Wibeto,Wibberley,Wibbenmeyer,Wiatrak,Wiatr,Wiand,Whyman,Wholly,Whittley,Whittiker,Whitteker,Whitset,Whitmyre,Whitmeyer,Whitheld,Whitesinger,Whitemore,Whitacker,Whistle,Whisker,Whisenton,Whippie,Whipp,Whildin,Whigum,Whiby,Whelton,Wheeington,Whan,Whaler,Whal,Weyhrauch,Wewerka,Wetterauer,Wetselline,Wetklow,Westwater,Westrom,Westre,Westhouse,Westervoorde,Westergaard,Westerbeck,Westcote,Westaway,Wesselink,Wesselhoft,Weslowski,Weslow,Wescovich,Werthman,Wershey,Werries,Wernli,Werning,Werma,Werking,Wenzell,Wentzloff,Wentcell,Wenstrand,Wensky,Wennersten,Wenman,Wengren,Wener,Weneck,Wendy,Wendte,Wenderoth,Wend,Wenclawiak,Wence,Wemark,Weltmer,Welms,Welman,Wellendorf,Welfel,Weitkamp,Weith,Weiszbrod,Weissmann,Weissert,Weisse,Weissbrodt,Weismiller,Weisiger,Weisenhorn,Weisenfluh,Weisend,Weisenberg,Weisdorfer,Weisberger,Weirather,Weinzinger,Weinzimer,Weinzetl,Weintz,Weinand,Weiker,Weikal,Weik,Weigman,Weigleb,Weigart,Weidenheimer,Weiden,Weickum,Wehring,Wehausen,Weglin,Weghorst,Weeth,Weeter,Weenum,Weelborg,Weegar,Weeber,Wedwick,Wedner,Wedlow,Wedlock,Wedi,Wedgworth,Weckenborg,Wechselblatt,Webbs,Webbink,Weavil,Weatherley,Weatherill,Wearrien,Wearly,Weagel,Weadon,Waymer,Wayde,Waybill,Wavra,Waughtel,Waughtal,Wauch,Watzke,Wattson,Watrs,Watral,Watne,Waterston,Waszmer,Wasylow,Wasyliszyn,Wassermann,Wassenberg,Wassenaar,Waskow,Waskey,Waska,Washurn,Washup,Washuk,Washnock,Washman,Washinski,Wasem,Wartman,Warsme,Warsing,Warschaw,Warsager,Warpool,Warneka,Warnasch,Warmbier,Warley,Warick,Warholic,Warhola,Warhol,Warens,Wareheim,Wardrop,Wardon,Wardman,Wardinsky,Wardian,Wappel,Wanvig,Wanser,Wanschek,Wanland,Waninger,Wanders,Wampol,Walzier,Walvoord,Walto,Waltenbaugh,Waltemath,Waloven,Walman,Wally,Wallravin,Wallor,Wallinga,Walles,Wallentine,Wallenda,Walleck,Wallbrown,Wallberg,Wallbank,Walland,Wallaker,Wallaert,Wallack,Walkinshaw,Walking,Walicki,Waldrope,Waldmann,Waldenberg,Walczynski,Walchli,Walbrecht,Wakula,Wakham,Wakenight,Wakeling,Waitkus,Waisman,Waisath,Wainman,Wahoske,Wahner,Wahlenmaier,Wahid,Wagon,Waggaman,Wagenheim,Waganer,Wafula,Waeyaert,Waetzig,Waelti,Waeckerlin,Waddouds,Wackman,Wackerbarth,Wachsmuth,Wabasha,Vyhnal,Vuturo,Vulgamott,Vukich,Vrias,Vranich,Vrablic,Votraw,Voter,Votaua,Voskowsky,Vorwaller,Vorholt,Voracek,Voong,Vonwagoner,Vonstaden,Vonsoosten,Vonkrosigk,Vongxay,Vongvivath,Vongunten,Vongsakda,Vongal,Vonfeldt,Vondohlen,Vonderkell,Vonbraunsberg,Vonarx,Volpert,Volper,Volpa,Volmink,Vollmering,Volking,Volkers,Volkens,Volin,Volesky,Volckmann,Vojta,Voita,Voights,Vogtman,Vogtlin,Voglund,Vogland,Vogenthaler,Vogelpohl,Vogds,Voetmann,Voedisch,Vodder,Voce,Vlk,Vlasaty,Vlasak,Vlahovich,Vizza,Vizuete,Vivolo,Vittum,Vittek,Vitorino,Vitkus,Vititow,Vitera,Vitantonio,Vitaniemi,Visvardis,Vissman,Visovsky,Visosky,Visocsky,Visnosky,Visnocky,Viscarro,Visaya,Virts,Virkler,Virgili,Virgie,Virgel,Virelli,Viramontas,Viorel,Vintinner,Vintimilla,Vinsel,Viniegra,Vinck,Villot,Villenas,Villemarette,Villecus,Villaquiran,Villane,Villalouos,Villaescusa,Vilkoski,Vilkama,Vilca,Vilaro,Vilardo,Vilandre,Viken,Vigus,Viguerie,Vigorito,Vigario,Viessman,Viesselman,Viesca,Vierthaler,Vierps,Vientos,Vienneau,Vidler,Victorica,Vickey,Vicioso,Vichidvongsa,Viccica,Veysey,Vespia,Veselic,Verzi,Versele,Veroba,Vernet,Verlotte,Verigan,Verhaag,Vergamini,Verga,Verfaille,Verela,Vere,Verdine,Verdiguel,Verd,Verbridge,Verble,Verbit,Verbilla,Verbasco,Ventur,Ventrice,Ventre,Ventors,Venth,Venosh,Vennari,Venkus,Veninga,Venible,Venghaus,Venetos,Venere,Veneable,Vendelin,Vemura,Velzeboer,Veltre,Veltin,Veloso,Veles,Vele,Veld,Veitz,Veitenheimer,Vein,Veillette,Vegher,Vegetabile,Vegar,Veerkamp,Veen,Vecino,Vebel,Veater,Veader,Ve,Vayon,Vayner,Vavricek,Vauter,Vaulx,Vaughner,Vaudreuil,Vaubel,Vattikuti,Vathroder,Vatch,Vastola,Vastardis,Vassure,Vassil,Vassie,Vasseur,Vassen,Vasquiz,Vasaure,Varvil,Vartanyan,Varron,Varro,Vargis,Varesko,Varda,Varanese,Varakuta,Varagona,Vanzante,Vanyo,Vanwyngaarden,Vanwassenhove,Vanvolkenburg,Vanvalen,Vantuyl,Vantil,Vanta,Vanstrom,Vanslooten,Vansicklin,Vanscoik,Vanschaick,Vanruiten,Vanostberg,Vanorsdol,Vanolinda,Vanoflen,Vannuland,Vannover,Vannorsdell,Vanniello,Vanni,Vanner,Vanmarter,Vanleuvan,Vanlaar,Vankilsdonk,Vankammen,Vanhevel,Vanheukelem,Vanhee,Vanhauen,Vanhamlin,Vanhamersveld,Vangyi,Vangompel,Vangoff,Vangerbig,Vangelos,Vanfossan,Vanez,Vaneffen,Vandygriff,Vandy,Vanduynhoven,Vandunk,Vandorien,Vandon,Vandiest,Vandeweert,Vandevort,Vandevere,Vandeveble,Vandestreek,Vandesteeg,Vanderwyk,Vanderwood,Vanderwilt,Vanderwege,Vanderweerd,Vanderweel,Vandertuig,Vanderstappen,Vanderschoot,Vandermoon,Vanderkaaden,Vanderhoot,Vanderboom,Vanderau,Vandenacre,Vandemortel,Vandeman,Vandelaare,Vandebrake,Vanconant,Vancleaf,Vanbogelen,Vanbenthuyse,Vanbeck,Vanasselt,Vanaprasert,Vanandel,Vampa,Valseca,Valree,Valot,Valorie,Vallimont,Vallie,Vallentine,Vallelonga,Vallario,Vall,Valgren,Valer,Valenzvela,Valentyn,Valenstein,Valenciana,Valderamo,Valcin,Valcho,Valakas,Vaksman,Vakil,Vaka,Vajgrt,Vaissiere,Vainio,Vaiko,Vaghy,Vaghn,Vafiadis,Vafiades,Vaeza,Vaeth,Vadasy,Vaclavik,Vacio,Vaci,Vache,Vaccarino,Vacante,Uzun,Uxa,Uvalles,Utvik,Uttley,Ustico,Usman,Usina,Ushioda,Ushijima,Uscio,Usack,Urse,Urrey,Urreta,Urraca,Urness,Urlanza,Uriostejue,Urik,Urenio,Urdiano,Urbieta,Uptegraft,Uppencamp,Unterkofler,Unnold,Unnewehr,Unkn,Uniacke,Unglaub,Unck,Umnus,Umezawa,Umbel,Ultseh,Ultreras,Ulses,Ullum,Ulisch,Ulicnik,Ulich,Uleman,Ukich,Uken,Uhrin,Uhrhammer,Uhles,Uhlenhopp,Ugaz,Ugaitafa,Ueki,Uebersax,Udinsky,Udicious,Ucha,Uccio,Uc,Ubry,Ubiles,Ubertini,Ubence,Tyssens,Tysseling,Tyrance,Tynio,Tylman,Tydings,Tydeman,Twohatchet,Twito,Twillie,Twiet,Twiest,Tweet,Tweddell,Twait,Tvedt,Tuxbury,Tuukanen,Tutuska,Tutoni,Tutela,Tushoski,Turvaville,Turturo,Turrill,Turrie,Turpiano,Turomsha,Turocy,Turnpaugh,Turnow,Turnmyre,Turnier,Turkmay,Turkasz,Turinetti,Tureson,Turdo,Turcio,Turbiner,Turbide,Turber,Turbe,Turansky,Tupy,Tuppen,Tuplano,Tuorto,Tunon,Tunget,Tunby,Tun,Tumolillo,Tumminia,Tumbleston,Tullison,Tulis,Tuliau,Tukuafa,Tukis,Tujague,Tuia,Tugade,Tuffin,Tuesburg,Tuerk,Tuer,Tuenge,Tudruj,Tudman,Tudisco,Tuccio,Tucay,Tuberman,Tsuruda,Tsuchiura,Tsuchida,Tsistinas,Tshudy,Tschirhart,Tschache,Tsantakis,Trzaska,Trythall,Tryninewski,Truont,Trumpp,Truka,Truiolo,Truglio,Trueluck,Trudo,Truchon,Trucchio,Trube,Truan,Troxil,Trowel,Trovinger,Trotz,Trotto,Trosen,Troost,Tronzo,Tront,Trometter,Trombino,Tromba,Trollope,Troke,Trojanovich,Trojak,Trohanov,Trogstad,Troe,Trocchio,Trobridge,Trobough,Trnong,Trivane,Trippel,Trimnal,Trimis,Trimino,Trilt,Trillas,Trillana,Triglia,Trigillo,Trifone,Triffo,Trifero,Tridenti,Tricoli,Tricamo,Tribue,Triblett,Trevithick,Trevisone,Trevis,Trevillian,Trevethan,Treves,Treusdell,Tretola,Tretina,Tretera,Tressel,Treola,Trentz,Trento,Trentman,Trenor,Trennell,Trend,Trenchard,Tremore,Tremillo,Trembinski,Trelles,Treister,Treine,Treible,Treff,Tredinnick,Treder,Trebon,Trebesch,Trear,Traviss,Traux,Trautner,Trausch,Traum,Trattner,Trass,Traphagen,Trapeni,Trapalis,Traner,Tramonti,Trainham,Traicoff,Trahern,Traffanstedt,Trachsel,Tracewell,Trabold,Trabazo,Tozloski,Toyota,Toyn,Towse,Townsand,Towels,Touton,Toussand,Toupe,Touney,Toudle,Touchard,Touby,Touart,Totzke,Tototzintle,Totino,Toting,Tossie,Tosco,Tosch,Tortu,Tortolano,Tortelli,Torruellas,Torros,Torrion,Torrillo,Torrico,Torreblanca,Torrano,Torongeau,Toromanides,Tornincasa,Torey,Toren,Torbus,Toquinto,Topolewski,Topoian,Topness,Toplistky,Topliffe,Topal,Topacio,Toothacre,Tooms,Toolsiram,Toolan,Tookmanian,Tonzi,Tonti,Tonschock,Tonsall,Tonrey,Tonnesen,Tonnar,Tongate,Tonetti,Tonelson,Tonder,Tonai,Tomspon,Tomski,Tomshack,Tomkus,Tomka,Tomidy,Tomichek,Tomeldan,Tomehak,Tombleson,Tomasson,Tomasic,Tomash,Tomanek,Tolontino,Tollin,Tollerud,Tollefsen,Toline,Tokley,Tokkesdal,Tohen,Togashi,Tofolla,Toepperwein,Toeller,Toelke,Toedebusch,Todt,Todoroff,Todor,Todesco,Toboz,Tobolski,Toaston,Toa,Tlumacki,Tlatenchi,Tlatelpa,Tlamka,Tjandra,Tix,Tivis,Tivar,Titterness,Titone,Titler,Tith,Tisi,Tish,Tisdel,Tisdal,Tischner,Tipre,Tippey,Tipold,Tinucci,Tintinger,Tinnerello,Tinn,Tinlin,Tinger,Timus,Timothe,Timons,Timonere,Timon,Timenez,Timchula,Timbrell,Timas,Timar,Tilzer,Tilus,Tilt,Tilow,Tillou,Tietge,Tieng,Tichnell,Tichi,Tibor,Thy,Thury,Thurness,Thurlby,Thurby,Thuney,Thuma,Thull,Thruthley,Throssell,Thress,Threlfall,Thrapp,Thrams,Thraen,Thouvenel,Thorstenson,Thorsness,Thoroughgood,Thornborough,Thormaehlen,Thorade,Thonney,Thompon,Thometz,Thomeczek,Thomases,Thomae,Thoburn,Thobbs,Thivener,Thim,Thilmony,Thiengtham,Thielges,Thieklin,Thidphy,Thibaut,Thibadeau,Thew,Theule,Theuenin,Thepbanthao,Theos,Thell,Thelin,Thelemaque,Theinert,Theeman,Theden,Thebo,Thansamai,Thanos,Thangavelu,Thanem,Thanasouk,Thanas,Thamann,Thaman,Thalls,Thaller,Thall,Thadison,Tewolde,Tewa,Teuteberg,Teteak,Testolin,Tessendorf,Tess,Tesmar,Teschler,Terwey,Tertinek,Terstage,Terrone,Terrible,Terrian,Terrezza,Terracciano,Terp,Teroganesyan,Termilus,Terinoni,Teri,Terhorst,Terherst,Terazes,Teravainen,Teque,Teoh,Teodoro,Tention,Tenore,Tenofsky,Tenn,Tenhoff,Tenhaeff,Tengben,Tenerovich,Tener,Tenda,Tenario,Tempelton,Temoney,Teman,Tellefsen,Telkamp,Telgen,Teles,Telch,Telander,Teklu,Teixeria,Teissedre,Teisberg,Tehney,Tegner,Tegan,Teehee,Teder,Teddy,Tecuanhuey,Techau,Tecchio,Teakell,Teager,Taylar,Tayan,Tawwab,Tavolieri,Taverab,Tavaris,Tavana,Tauzin,Tautolo,Tausch,Taula,Taualii,Tattrie,Tatsuhara,Taton,Tatge,Tatel,Tastet,Tassa,Tasma,Taskey,Tashiro,Taruer,Taruc,Tartsah,Tarski,Tarrenis,Tarnoff,Tarmey,Tarman,Tarling,Tarella,Tarduno,Tarboro,Tarbert,Taray,Taras,Taque,Tapian,Taphous,Tapaoan,Tanzi,Tantum,Tannous,Tankxley,Tankesly,Tanh,Tangney,Tangerman,Tangaro,Tangari,Tangabekyan,Tandus,Tande,Tamkin,Tami,Tamburrelli,Tamburino,Tamborlane,Tamai,Talvy,Talsky,Talleut,Tallacksen,Taliferro,Talicska,Talentino,Talaro,Talamentez,Talaga,Tako,Taker,Takara,Takai,Tajudeen,Tajima,Taitague,Taillefer,Tail,Tahon,Tagupa,Taglauer,Tagalog,Tagaloe,Tagala,Tagaca,Tag,Tafiti,Tafelski,Taetzsch,Taegel,Tadt,Tadgerson,Taddio,Tadd,Tacopino,Tacneau,Tackette,Tackes,Tacke,Tachauer,Tacason,Tabuena,Tabion,Tabatt,Szysh,Szymonik,Szwede,Szulimowski,Szpak,Szoka,Szocki,Szklarski,Szitar,Szewc,Szesterniak,Szermer,Szerbin,Szczepkowski,Szczeblewski,Szachewicz,Szabat,Syzdek,Syrrakos,Syria,Sypult,Sypolt,Synovic,Syner,Symkowick,Symeon,Sylney,Sylla,Syktich,Syer,Swopshire,Swolley,Swithenbank,Swiss,Swirczek,Swingler,Swingen,Swinerton,Swinea,Swille,Swierenga,Swierczynski,Swieca,Swicord,Swerdloff,Swenceski,Swelt,Swelgart,Swehla,Sweets,Sweem,Swed,Sweatmon,Sweatfield,Swatman,Swartzman,Swartzell,Swantak,Swanston,Swancutt,Swanay,Swamm,Swam,Swait,Swainey,Swaggart,Swabe,Swabb,Svobodny,Svetlak,Svennungsen,Svedine,Svatos,Svare,Svancara,Suydan,Suwannakintho,Suvada,Suttin,Suttee,Sutkus,Sutic,Suthers,Sutcliff,Suszynski,Sustar,Sustaire,Suskay,Susany,Susanin,Suryanarayana,Survis,Surpris,Suro,Surminec,Surguy,Surgoine,Sures,Suren,Surbella,Suomela,Sunyich,Sunniga,Sunier,Sumrow,Sumption,Summerlot,Sumerix,Sumeriski,Sultani,Sulley,Sullenberger,Sulipizio,Sulin,Sulima,Sulikowski,Sulentic,Sulejmanovski,Sugabo,Suffield,Suentenfuss,Suehs,Sudekum,Sudbrock,Sucre,Suchocki,Suchla,Sucgang,Succar,Subijano,Subich,Subert,Subera,Suaava,Stuttgen,Sturner,Sturk,Sturgul,Sturghill,Stukowski,Stuesse,Stuermer,Stuer,Stuebe,Studyvance,Studnicki,Studniarz,Studmire,Studdiford,Stucke,Stublaski,Stubby,Stubbendeck,Strzalkowski,Struzzi,Struzik,Strubel,Strozewski,Strowe,Strous,Strotz,Strombeck,Stroker,Strohmayer,Strogen,Strizich,Strini,Stringari,Strimling,Strimback,Strife,Strid,Stricklind,Stribley,Strevels,Strevell,Streva,Stretz,Strenge,Stremi,Strelecki,Strejan,Streitnatter,Streff,Strefeler,Streeton,Stred,Strazisar,Strayhand,Strayham,Stravinski,Strausz,Strausner,Strauhal,Straugh,Strasters,Stranford,Strandburg,Stranahan,Strahin,Stradtner,Stracquatanio,Strachman,Straathof,Stpierrie,Stoviak,Stovell,Stoutenger,Stoudymire,Stoud,Stouch,Stouall,Stottlar,Stotko,Stothard,Stotesbury,Stotesberry,Storto,Stores,Storage,Stoos,Stonich,Stolzenburg,Stolly,Stolebarger,Stolcals,Stolar,Stoklasa,Stogden,Stoffey,Stofferan,Stoey,Stoett,Stoeltzing,Stoel,Stoeke,Stoeffler,Stoeckert,Stoebner,Stoeberl,Stodomingo,Stodder,Stockwin,Stockon,Stocki,Stockebrand,Stocco,Stobie,Stlouise,Stives,Stirn,Stire,Stipanuk,Stingle,Stinespring,Stinehour,Stinebuck,Stindt,Stimple,Stimler,Stilwagen,Stiltz,Stilner,Stillie,Stigsell,Stiern,Stiens,Stiehm,Stiegman,Stiegemeier,Stieb,Stidstone,Sticklin,Sticklen,Stickford,Sthole,Stford,Stflorant,Steury,Stetzenbach,Stetke,Sterpka,Sterker,Sterkenburg,Sterkel,Stephensen,Stepan,Step,Stenz,Stenn,Stendeback,Stenbeck,Stenback,Sten,Stemmler,Stelzl,Steltzer,Stellpflug,Stellfox,Stelk,Stele,Steinruck,Steinmeiz,Steinkuehler,Steinkirchner,Steinkellner,Steinerkert,Steine,Steinbrink,Steinbauer,Steik,Steighner,Steiert,Steich,Steibel,Stehno,Steggeman,Stefl,Stefford,Steffa,Stefanatos,Steep,Steenwyk,Steenhoven,Steelmon,Steeg,Steeb,Stedronsky,Steczo,Stecklair,Stechuchak,Stechlinski,Steber,Stebe,Stearnes,Stearne,Stea,Stdenny,Stchur,Stayter,Stawicki,Stavrositu,Staudenmeier,Stattelman,Statires,Station,Stathos,Stathas,Stasulis,Stassen,Stasny,Staser,Staschke,Starweather,Stars,Starnaud,Starley,Starkman,Starken,Starich,Starghill,Starcevic,Staplins,Stapelman,Stanzak,Stanway,Stanowski,Stankowitz,Stankaitis,Staniec,Stania,Stangroom,Stanesic,Stanert,Staneart,Stands,Standors,Standifur,Standeven,Standaert,Stancoven,Stanclift,Stancey,Stanbaugh,Stana,Stammler,Stamenov,Stambach,Stamatopoulos,Stamas,Stalberger,Stakoe,Stakley,Stakkeland,Stakemann,Stainbach,Stagowski,Stagno,Stagman,Stagles,Stagers,Staffeld,Staenglen,Staehler,Stadther,Stadt,Stadnik,Stadick,Stachurski,Stace,Stabs,Stabley,Stable,Srygley,Srinvasan,Squarciafico,Squair,Spyrakos,Spyies,Spycher,Spurger,Spulick,Spudis,Spuck,Sprygada,Spruiell,Spruance,Sprowls,Sprouls,Sprong,Sprole,Springe,Sprewell,Sprengelmeyer,Sprawls,Sprauve,Spragley,Spotorno,Sporysz,Sporman,Sporich,Spoonemore,Spoleti,Spohnholz,Splitt,Splett,Splatt,Spiter,Spirounias,Spirk,Spire,Spinoza,Spinn,Spinetti,Spinello,Spinar,Spilis,Spiliakos,Spigutz,Spielvogel,Spicknall,Spicker,Sperier,Speraw,Spennicchia,Spene,Spellane,Spegal,Spee,Specken,Spearow,Spearmon,Spayd,Spartin,Spartichino,Spart,Sparacina,Spannuth,Spanner,Spanicek,Spanger,Spane,Spakes,Spadard,Spacht,Spacagna,Sozio,Soyke,Sowl,Sowden,Sowada,Sovel,Souvannakhily,Souto,Southand,Sourlis,Soulliere,Souhrada,Sou,Sotos,Sothen,Sosbe,Sorzano,Sorvig,Sortland,Sorokata,Soro,Sorlie,Sorhaindo,Sorell,Sordia,Sorace,Soptick,Soppeland,Sophy,Sopczak,Sooy,Soop,Soomaroo,Soolua,Sonterre,Sonsteng,Sonnefeld,Sonnee,Sonka,Songy,Sondrup,Sondles,Sondheimer,Sonderman,Sonderegger,Somvang,Somsy,Somrak,Somoza,Somogye,Somo,Sommons,Sommar,Somji,Somilleda,Somerfield,Somdah,Somayor,Solwold,Solverud,Soltow,Soltmann,Solow,Solorsano,Solonar,Solomen,Sollors,Sollitto,Solliday,Solito,Solinas,Solima,Solies,Solien,Solich,Solian,Solhjem,Solera,Soldeo,Solazar,Solarski,Solaita,Soladine,Sokul,Sokotowski,Sokolski,Sokolowich,Sojo,Soito,Soiro,Soifer,Softich,Sofer,Soechting,Sodini,Sodervick,Soders,Sodawasser,Sockey,Sobrio,Sobieraj,Sobeski,Sobery,Soberanes,Sobenes,Sobe,Sobanski,Soape,Snowder,Snorden,Snode,Snetsinger,Snaples,Snaer,Snaders,Smyrski,Smyntek,Smykowski,Smutzler,Smutny,Smulik,Smugala,Smuck,Smolnicky,Smolinsky,Smitty,Smithe,Smiling,Smiler,Smigiel,Smerdon,Smeja,Smedes,Smeathers,Smarra,Smar,Smallmon,Smallin,Smallidge,Slyton,Slutsky,Sluski,Slovinski,Sloter,Slonecker,Slomer,Slogeris,Slobodnik,Sloanes,Slipper,Slingluff,Slingland,Sliney,Slimko,Sliman,Slimak,Slessman,Slepski,Sleppy,Sleiman,Sleaford,Slaugenhaupt,Slark,Slackman,Slaboda,Skyes,Skweres,Skwarek,Skubik,Skrzypinski,Skrebes,Skrabanek,Skovlund,Skotnicki,Skone,Skonczewski,Skold,Skoien,Skoczen,Skobiak,Skimehorn,Skillpa,Skillett,Skillan,Skildum,Skibski,Skibo,Skevofilakas,Skepple,Skarzynski,Skartvedt,Skar,Skapura,Skaflen,Skaer,Skabo,Sjulstad,Sjerven,Sizar,Sixt,Sixsmith,Siwicki,Sivills,Sivilay,Sivie,Sivick,Sivay,Sivalia,Sival,Siurek,Siuda,Sittre,Sittner,Sittman,Sitterding,Sitosky,Sitkiewicz,Sistek,Sista,Sisomphou,Sisofo,Sisley,Siskin,Sisavath,Sirpilla,Sirosky,Sirolli,Siroka,Sirna,Sirico,Sirhan,Siravo,Sipriano,Sippy,Siphan,Siona,Siok,Sinrich,Sington,Singharath,Singewald,Singerman,Sinarath,Simple,Simper,Simor,Simoniello,Simonetty,Simonet,Simokat,Simoens,Simmond,Simmes,Simitian,Simich,Simerson,Simensky,Simcock,Silvestrini,Silvaggio,Siluis,Siltman,Silovich,Sillitoe,Silkenson,Siliezar,Silevinac,Silence,Silbiger,Silao,Sil,Sikarskie,Siglow,Siglar,Sifre,Sifontes,Sifers,Sievertsen,Sieverson,Sieve,Sietz,Siert,Sieradski,Sier,Sielaff,Sieja,Siedner,Siedel,Siebenthal,Sidorowicz,Sidley,Sidi,Sideman,Sicks,Sickel,Sickafoose,Sicinski,Sibounma,Sibgert,Sibeto,Sibel,Sibal,Siar,Siaperas,Siami,Sialana,Shyne,Shybut,Shwab,Shutty,Shutters,Shusterman,Shurr,Shurak,Shuptrine,Shupert,Shummon,Shulthess,Shult,Shulse,Shullick,Shulick,Shulenberger,Shuffleburg,Shubov,Shry,Shrigley,Shren,Shrawder,Showen,Shoulder,Shorthair,Shopbell,Shoobridge,Shongo,Shoman,Shollenbarger,Shoji,Shofestall,Shodunke,Shober,Shivy,Shisila,Shirvanian,Shirakawa,Shippen,Ship,Shinsky,Shinnick,Shinkel,Shingleur,Shingledecker,Shindel,Shimon,Shimaoka,Shilo,Shillito,Shillingsford,Shilkuski,Shiliata,Shildneck,Shikuma,Shike,Shigeta,Shigemi,Shifferd,Shider,Shibi,Shettleroe,Shetterly,Sherville,Sherrock,Sherrange,Sherraden,Sherles,Sherief,Sherbon,Shepperdson,Shenker,Sheneman,Shene,Shempert,Sheman,Shelvy,Shelsy,Shelkoff,Shekels,Sheirich,Sheingold,Sheidler,Shehee,Shefte,Sheftall,Sheerer,Sheer,Sheakley,Shbi,Shawber,Shatek,Shasky,Shary,Sharplin,Sharperson,Sharabi,Shappen,Shapouri,Shapleigh,Shapino,Shaper,Shanno,Shandro,Shanberg,Shamsi,Shammah,Shamir,Shamily,Shalwani,Shalla,Shaline,Shalhoub,Shakoor,Shakin,Shahinfar,Shahin,Shahim,Shahbaz,Shaffren,Shaffen,Shadfar,Shadding,Shadazz,Shaben,Shabel,Sgueglia,Sgrignoli,Sgammato,Seykoski,Seyb,Sewyerd,Seweall,Sewade,Severi,Seveney,Sevadjian,Settlemyre,Settlemires,Settino,Settimo,Setterland,Seton,Setler,Setias,Seti,Setchell,Setaro,Sestoso,Sessin,Sesser,Serville,Servi,Servedio,Serve,Serravalli,Sermersheim,Serfoss,Serfling,Serey,Seres,Serens,Serene,Sercovich,Serban,Seratti,Seratt,Serasio,Serandos,Seraiva,Seraille,Sepvlieda,Sepulbeda,Septelka,Seppelt,Seppanen,Seppa,Senz,Senst,Sensor,Sensmeier,Sensing,Senseney,Sensenbrenner,Senseman,Seniff,Sengvilay,Sengun,Senethavilouk,Senesenes,Senderling,Sender,Senavanh,Semsem,Semonis,Seminario,Sember,Selzler,Selvester,Selusi,Selnes,Sellin,Sellards,Selkey,Selic,Selgrade,Selesnick,Selakovic,Seiters,Seit,Seisler,Seil,Seikaly,Seidenbecker,Seibt,Seibers,Seiavitch,Segreto,Segonia,Seggerman,Segerman,Segelhorst,Seferovic,Sefcheck,Seering,Seemer,Seekford,Seekamp,Seegar,Seedorff,Seedborg,Seebaum,Sedanos,Secundo,Second,Seckletstewa,Sechang,Sebranek,Sebion,Sebero,Sebeniecher,Sebasovich,Searer,Seara,Seanger,Seajack,Seaholtz,Seagers,Seaforth,Seacrest,Seacat,Seaburn,Sdoia,Sczbecki,Scurci,Scullin,Scuito,Scudero,Scucchi,Scsarpisnato,Scro,Scrivener,Scriuner,Scripps,Scrimsher,Scrichfield,Screnci,Scrape,Scouller,Scotts,Scotting,Scorgie,Scollan,Sciullo,Scites,Scicutella,Scialpi,Sciacchitano,Schy,Schworm,Schwizer,Schwister,Schwipps,Schwertfeger,Schwerdt,Schwerd,Schwenzer,Schwenneker,Schwendeman,Schwemmer,Schweitz,Schwarzlose,Schwart,Schwantd,Schwadron,Schutze,Schute,Schusted,Schurk,Schumachor,Schulter,Schultens,Schulkin,Schulist,Schuit,Schuering,Schueren,Schueneman,Schuemann,Schuchat,Schuber,Schubach,Schrumpf,Schroot,Schroen,Schroedter,Schreuder,Schreacke,Schrayter,Schrawder,Schrauger,Schraub,Schrameck,Schraff,Schradle,Schrab,Schowengerdt,Schossow,Schopmeyer,Schopflin,Schop,Schomin,Schomas,Schomacker,Scholtens,Scholin,Schoggen,Schoessow,Schoepfer,Schoenmaker,Schoenig,Schoelman,Schoellkopf,Schoell,Schoeben,Schoderbek,Schockley,Schnure,Schnorbus,Schnopp,Schnobrich,Schnitz,Schnickel,Schnibbe,Schnepf,Schnelder,Schneidman,Schneeberger,Schnackel,Schmollinger,Schmoak,Schmittou,Schmiot,Schmille,Schmier,Schmiel,Schmiedeskamp,Schmidtka,Schmidlin,Schmertz,Schmerge,Schmerer,Schmelmer,Schmeidler,Schmautz,Schmauder,Schmatz,Schmand,Schmaling,Schlund,Schlumaker,Schlotthauer,Schlotte,Schlotfeldt,Schlote,Schlossman,Schloemann,Schlindwein,Schlimmer,Schlieter,Schlichenmaye,Schleppy,Schlenger,Schleker,Schleibaum,Schleh,Schlecter,Schlaefli,Schladweiler,Schlabs,Schirrmacher,Schiralli,Schinnell,Schinker,Schingeck,Schindewolf,Schimel,Schilsky,Schilk,Schilder,Schifko,Schiffmann,Schierenbeck,Schierbrock,Schielke,Schieferstein,Schiefen,Schickedanz,Schey,Scheuren,Scheuers,Scherschligt,Scherma,Scherbring,Scherbel,Scheno,Schenfeld,Schells,Schellin,Schellermann,Scheiern,Scheiderer,Schegetz,Scheffrahn,Scheffert,Schechinger,Schavone,Schaunt,Schaumann,Schauble,Schaubhut,Schatzle,Scharmann,Scharler,Scharbrough,Schap,Schanzenbach,Schantini,Schange,Schandel,Schammel,Schallig,Schaffter,Schaffeld,Schaffel,Schafersman,Schaen,Schachterle,Schachsieck,Schabbing,Scelzo,Scelsi,Scavo,Scavetta,Scaturro,Scatenato,Scarpitto,Scarpitta,Scarpato,Scarpati,Scarp,Scarlato,Scargall,Scarfi,Scantlen,Scanneu,Scannapieco,Scanio,Scandrett,Scandalios,Scancarello,Scamehorn,Scalzi,Scallorn,Scallion,Scalet,Scaiano,Scaia,Scagliotti,Scace,Sboro,Sbarra,Saysongkham,Saysana,Sayloe,Saxinger,Saxfield,Sawtell,Sawransky,Sawhill,Sawatzki,Sawaia,Savitch,Savinar,Savi,Saven,Savas,Savaria,Savakis,Sava,Sauveur,Sausser,Saurey,Sauredo,Saunas,Saulsbery,Sauger,Sauerhage,Sauerbry,Sauce,Sauby,Satz,Sattlefield,Satmary,Sathiraboot,Satchwell,Sat,Sasuille,Sashington,Sasengbong,Sasao,Sarwar,Sarrell,Sarraga,Saroop,Sarnes,Sarnacki,Sarlo,Sarks,Sarkodie,Sark,Sargis,Sargetakis,Saretto,Sarette,Sarensen,Sarcinelli,Sarcinella,Sarcia,Saras,Saranzak,Saraniti,Sarani,Sarafian,Saraf,Sarac,Sarabando,Saporita,Sapnu,Sapko,Saous,Sanzenbacher,Santti,Santrizos,Santoscoy,Santomauro,Santolucito,Santis,Santio,Santilukka,Santaloci,Santagata,Santaella,Sanseda,Sanquenetti,Sanots,Sanosyan,Sann,Sanmarco,Sanlatte,Sankovich,Sanke,Sankary,Sankaran,Sanislo,Sanipasi,Saniger,Sangren,Sanghez,Saneaux,Sandstedt,Sandry,Sandovar,Sandos,Sandone,Sandness,Sandlan,Sandison,Sandersen,Sandborg,Sanchz,Sanchec,Sancen,Sanasith,Samway,Samuell,Sampselle,Sampieri,Sampair,Samoyoa,Samowitz,Sammut,Samiec,Samick,Samele,Sambucetti,Samara,Samantha,Samanlego,Salverson,Salvature,Saluto,Saluja,Saltourides,Saltmarsh,Salta,Salsberg,Saloum,Salos,Saloom,Sallings,Sallies,Sallah,Salisberry,Salimas,Salfelder,Salesses,Salen,Saleado,Saldvir,Saldi,Saldeen,Salceda,Salazan,Salaza,Salay,Salandy,Sakshaug,Sakovitch,Sakkinen,Sakkas,Sakiestewa,Sakic,Sakakeeny,Saison,Saisa,Saintfleur,Saide,Saicedo,Sahsman,Sahli,Sahler,Sahlberg,Sahagian,Saggione,Sages,Sagendorf,Safron,Safar,Saetteurn,Saenphimmacha,Sadhu,Sadhra,Saden,Sadee,Saddat,Sackos,Sachleben,Saches,Sachar,Saccucci,Sacane,Sablone,Sablock,Sablea,Sabiston,Sabini,Sabi,Sabha,Sabellico,Sabaj,Saadd,Ryun,Rysavy,Rysanek,Rylowicz,Ryll,Ryken,Rygiewicz,Rydalch,Rychlicki,Rybowiak,Ryal,Ruzycki,Ruyz,Ruwet,Rutley,Ruthenberg,Ruszala,Rusteika,Rusteberg,Russotto,Russotti,Russman,Russek,Russe,Rusley,Rusich,Rushworth,Rushman,Rushforth,Ruscitti,Ruscio,Ruschmann,Ruschel,Rusak,Rupertus,Ruoho,Runzler,Runyons,Runswick,Runfola,Rumney,Rummler,Rumford,Rumburd,Rumbold,Ruman,Rulnick,Rujawitz,Ruhstorfer,Ruhmann,Ruhling,Ruhlin,Ruggiere,Ruggero,Rugga,Rugama,Ruffolo,Ruether,Ruesswick,Ruell,Rudnitski,Rudnicky,Rudish,Rudicil,Rudes,Rudeen,Rubow,Rubloff,Rubison,Rubinow,Ruberte,Rubenacker,Rubarts,Ruballos,Rubal,Rozgonyi,Rozga,Rozenberg,Rozas,Rozance,Roytek,Rowsell,Rowray,Rowold,Rowntree,Rowlins,Rowling,Rowback,Rovelto,Rovella,Rovack,Rouzzo,Rout,Roussos,Rounkles,Roundabush,Rouisse,Rougier,Rouff,Roudybush,Roucoulet,Roubekas,Rotstein,Rothmann,Rothhaupt,Rothfus,Rothenburger,Rothbauer,Rothacher,Rotering,Roszales,Rossnagel,Rossingnol,Rossing,Rosselle,Roskovensky,Roskop,Rositano,Rosine,Rosich,Rosettie,Rosentrance,Rosenthall,Rosenkoetter,Rosenheim,Rosenbarger,Rosekrans,Rosebure,Roseboom,Roscow,Roscorla,Rosbozom,Rosavio,Rosacker,Ropiski,Ronzoni,Rons,Rondell,Ronde,Roncskevitz,Romulus,Rompf,Romjue,Romenesko,Rombult,Rombardo,Romaniak,Romandia,Romanchuk,Romag,Rolseth,Rollind,Rollend,Rolfsen,Rolff,Rolek,Rokusek,Rohs,Rohowetz,Rohlack,Rohla,Rogugbakaa,Roguemore,Rogosky,Roginson,Roggero,Roggensack,Roggenbaum,Roggeman,Roever,Roetzler,Roettgen,Roessing,Roerish,Roemhild,Roehling,Roede,Roeber,Rodriuez,Rodrigeuz,Rodnguez,Rodis,Rodinson,Rodine,Rodemoyer,Rodeigues,Rodea,Roddick,Rodar,Rodamis,Rodal,Rockymore,Rockelman,Rockafellow,Rocho,Rochlin,Rochenstire,Rocasah,Roblow,Roblodowski,Robinzine,Robinsons,Robinso,Robinault,Robilotto,Robichard,Robeza,Robertos,Roberrtson,Robblee,Robante,Roats,Roatch,Roaoo,Roanhorse,Roal,Roacho,Rizas,Rivord,Riveroll,Riverman,Rivel,Ritzke,Ritzie,Ritums,Ritson,Ritchlin,Ritari,Ristaino,Rissell,Rissanen,Risler,Riskalla,Risius,Rishell,Risha,Risewick,Risden,Rische,Riscen,Risbeck,Riquelme,Ripoll,Rioz,Riofrio,Riobe,Rinnert,Rinkus,Rininger,Ringland,Ringhouse,Ringelspaugh,Rinebold,Rindler,Rinderle,Rimm,Rillera,Riise,Riippi,Rightnour,Rightley,Riggings,Rigger,Riffee,Rifenbery,Riexinger,Riesland,Rieske,Riesinger,Rieley,Riekert,Rief,Riedlinger,Ridgnal,Ridgle,Ridgill,Ridep,Ridel,Riddleberger,Ridders,Riculfy,Rickford,Richters,Richmann,Richlin,Richiusa,Richerds,Richan,Ricenberg,Ricaud,Ricardi,Ribsamen,Ribron,Ribiero,Ribero,Ribbink,Rhump,Rhum,Rhorer,Rhoe,Rhoan,Rhoad,Rhinerson,Rhen,Reznicek,Reyner,Reyne,Reynaldo,Reyelts,Rewerts,Rewakowski,Revira,Revils,Revering,Revera,Revelli,Revay,Reuteler,Reust,Reuschel,Reudink,Retzloff,Rethmeier,Retek,Retchless,Retamar,Ressel,Respicio,Respes,Respers,Resos,Resetar,Resenz,Resecker,Res,Rerucha,Requarth,Reprogle,Repoff,Replin,Repetowski,Repasky,Reola,Renzoni,Renzo,Renyer,Rentoulis,Rentie,Renouf,Renosky,Renigar,Renert,Rendler,Rend,Remondet,Remis,Remian,Remele,Remeder,Rellama,Rekus,Rekemeyer,Reives,Reitter,Reistetter,Reinsvold,Reinsfelder,Reinowski,Reinier,Reing,Reinen,Reineccius,Reindeau,Reinbolt,Reimnitz,Reimmer,Reihl,Reihing,Reigleman,Reighley,Reidherd,Reidhaar,Reichow,Reibman,Reial,Rehse,Rehmert,Rehlander,Reher,Rehbock,Regulski,Regueira,Regn,Reginaldo,Regelman,Regar,Refsal,Refazo,Reemer,Reefer,Redlon,Redkey,Redinbo,Rediker,Redig,Redemer,Redcross,Redal,Recuparo,Recksiek,Reckers,Recidivi,Rechichi,Reburn,Rebold,Rebik,Rebar,Reavish,Reaver,Reavely,Reash,Reaollano,Reagey,Readinger,Readdy,Razon,Rayyan,Rayshell,Rayow,Rayome,Rayhel,Raychard,Rayam,Rawi,Rawhouser,Rawat,Ravizee,Raviele,Ravago,Rautenstrauch,Raulino,Raul,Rauhecker,Rauhe,Raught,Rauco,Raucci,Ratzloff,Rattu,Rattell,Rattanasinh,Ratsep,Ratkovich,Rathrock,Rathel,Rathai,Ratana,Rasual,Rastetter,Rastegar,Rasset,Raspotnik,Raspa,Rasool,Rasole,Rasley,Raskey,Rasico,Rasavong,Ras,Rarogal,Rarden,Raptis,Rappl,Rapkowicz,Rapisura,Rapanot,Rapalo,Rapacki,Ranweiler,Ransonet,Ransler,Ranni,Ranmar,Ranks,Ranildi,Randgaard,Randahl,Ranch,Ranaudo,Ranah,Ramsy,Ramsour,Ramshur,Ramsby,Ramrirez,Rampy,Rampulla,Rampadarat,Rampa,Ramonez,Ramler,Ramlall,Ramjhon,Ramjan,Ramirel,Rametta,Ramelli,Ramelize,Ramelb,Ramdeo,Ramcharran,Ramaudar,Ramal,Ramagano,Ramach,Rakyta,Rakus,Rakestrow,Rakers,Rajk,Rajas,Rajaphoumy,Raisley,Raisler,Raisin,Rais,Railes,Raike,Raigosa,Rahoche,Rahmes,Rahib,Rahaman,Ragus,Ragula,Raguay,Raglow,Rafus,Rafey,Rafel,Rafala,Raethke,Raemer,Raef,Raeder,Radziwon,Radwick,Radwanski,Radoslovich,Radon,Radmall,Radlinski,Radie,Raderstorf,Radej,Raddle,Raczak,Racko,Raciti,Racioppo,Racer,Rabuse,Rabsatt,Rabjohn,Rabito,Rabey,Rabeneck,Rabehl,Rabeck,Rabbe,Rabal,Quivoz,Quiver,Quituqua,Quitugua,Quittner,Quitter,Quitero,Quitedo,Quirke,Quiram,Quiralte,Quintard,Quintania,Quinnan,Quinlivan,Quilter,Quillman,Quillan,Quilindrino,Quiel,Quidas,Quicho,Quibodeaux,Quezergue,Quezad,Quettant,Queros,Querio,Quercioli,Quenzel,Quencer,Queller,Quebral,Quatrevingt,Quashnock,Quasdorf,Quartuccio,Quartiero,Quartieri,Quartaro,Quarrell,Quanstrum,Quammen,Qualheim,Quagliato,Quadnau,Qua,Qasba,Qare,Qadeer,Pywell,Pysher,Pyros,Pyfrom,Pyfer,Pyette,Pychardo,Puzon,Putzer,Putton,Putcha,Puskarich,Push,Purkhiser,Purfeerst,Puraty,Puotinen,Puntillo,Punihaole,Pundsack,Puna,Pulwer,Pullus,Pullara,Puita,Puhrman,Puhr,Puhl,Puffenberger,Puerto,Puent,Pudenz,Pucket,Pucker,Public,Ptaschinski,Psuty,Psuik,Psilovikos,Przybyl,Przeniczny,Prye,Prybylski,Prukop,Pruessner,Provosty,Provorse,Provins,Provino,Provenzo,Provent,Protich,Protas,Pross,Prosienski,Prosenick,Proscia,Prosak,Propheter,Promisco,Promer,Prokup,Prokos,Progl,Profeta,Profera,Profancik,Procsal,Prociuk,Prochak,Proch,Procaccino,Prizio,Privado,Pritzker,Pritzel,Pritcher,Pritchell,Prisoc,Priolean,Prinn,Prindiville,Princevalle,Primos,Prima,Prigg,Priego,Priegnitz,Prible,Pribish,Pribbenow,Prevot,Prevet,Pretzer,Pretzel,Prety,Presume,Prestley,Prestipino,Presnal,Preslipsky,Presiado,Prendes,Prejsnar,Preist,Preissner,Preisner,Preheim,Prefontaine,Predom,Precissi,Prechtel,Precht,Prause,Pratten,Prately,Prante,Prang,Pramuk,Praley,Prakoth,Prach,Pozar,Poynton,Powskey,Powsey,Powlen,Powells,Pourvase,Pourner,Pourier,Pourchot,Pouncil,Poulisse,Poulet,Pouk,Pouche,Potulski,Pottkotter,Pottichen,Potteiger,Potsander,Pothoven,Potanovic,Potaczala,Posusta,Posto,Postles,Postiglione,Postemski,Possinger,Possick,Possehl,Pospicil,Poskitt,Poska,Posis,Portnoff,Portello,Porris,Porres,Porep,Porell,Porat,Popularis,Poppo,Popadiuk,Pooyouma,Pooschke,Poort,Poolheco,Ponsler,Poniatowski,Pomykala,Pompi,Pomilla,Pomiecko,Pomfret,Polzer,Polvino,Poltrock,Polton,Polter,Polski,Poloskey,Pollot,Pollnow,Polivick,Polisoto,Polintan,Poliks,Polikoff,Policicchio,Policastri,Policare,Poletski,Polee,Poledore,Polacco,Pokrzywa,Pokallas,Pointe,Poinelli,Pohorilla,Pohlson,Pogozelski,Pogorelc,Poellinetz,Podwoski,Podeszwa,Pod,Pocklington,Pociengel,Pochatko,Pocekay,Pocai,Poague,Pniewski,Plutt,Plumbar,Pluma,Plotzker,Plotrowski,Ploskunak,Ploennigs,Plimpton,Plienis,Plewinski,Plett,Pleskac,Pleshe,Plesant,Pleppo,Plegge,Playl,Plavnik,Plateroti,Plateros,Plastow,Plassmeyer,Plassman,Planer,Plance,Planagan,Plan,Plamondin,Plainy,Plackett,Placino,Plachecki,Placeres,Plaas,Pjetrovic,Pizzulo,Pizzini,Pizzico,Pivec,Pitpitan,Pitorak,Pitocco,Pitka,Pitch,Pitcairn,Pitarresi,Piszczek,Pistelli,Piskel,Pisicchio,Piserchio,Piscitello,Pirrotta,Pirrello,Pirre,Pirozhkov,Pirollo,Pirieda,Pipper,Pipia,Pioske,Piombino,Pinzino,Pintello,Pinsonneault,Pinsoneault,Pinn,Pinkenburg,Pinke,Pindell,Pinchock,Pince,Pimple,Pim,Piluso,Pillon,Pillarella,Pillado,Pilkey,Pilette,Pilchowski,Piirto,Pihlaja,Piggie,Piganelli,Piety,Pietrowicz,Pietrok,Pietrini,Piesco,Piertraccini,Piersiak,Pierrot,Pierdon,Pierannunzio,Pientka,Pielow,Piela,Piek,Piegaro,Piefer,Piecuch,Pidro,Picotte,Pickman,Picketts,Picketpin,Pickerell,Pickenpaugh,Pichoff,Picher,Piccuillo,Piccirilli,Piccinone,Piccinich,Piccillo,Picchetti,Piatz,Piao,Piacitelli,Piacenza,Phyfe,Phurrough,Phuong,Phuma,Phuaphes,Phramany,Phoubandith,Phommajack,Phom,Pho,Phimsoutham,Phimpradapsy,Philmore,Phillies,Philliber,Philio,Phildor,Philabaum,Phi,Phetsanghane,Phetphongsy,Phelp,Phaymany,Pharmer,Pharao,Phanthavongsa,Pfrommer,Pfoutz,Pforr,Pfnister,Pflugradt,Pflugrad,Pfleuger,Pfingsten,Pfifer,Pfeiffenberge,Pfefferkorn,Pfanstiel,Pfander,Pfalmer,Pfaffinger,Pezley,Pezina,Pezez,Peyser,Pevahouse,Petula,Petton,Pettipas,Pettijohn,Pettigrove,Pettay,Petrouits,Petropulos,Petronzio,Petronella,Petrilli,Petriccione,Petric,Petrecca,Petralia,Petr,Petka,Petigny,Petesic,Petersik,Petek,Petanick,Petalcu,Peszynski,Pessolano,Pesses,Pesicka,Peschong,Pesarchick,Pesantes,Perza,Pertea,Persyn,Persten,Persch,Perrota,Perrot,Perriott,Perring,Perrilloux,Perrette,Perrelli,Perrell,Pernod,Pernin,Perniciaro,Pernesky,Permann,Perlson,Perkiss,Perina,Perie,Perencevich,Peredz,Percey,Peraha,Peplau,Pepka,Pepion,Penzien,Penzel,Penya,Penwarden,Penticoff,Pensky,Pensick,Pensa,Pennelle,Penird,Penhallurick,Penha,Pengra,Penderel,Pendegraft,Pencak,Pemelton,Peluse,Pelnar,Pellom,Pellitteri,Pelligrino,Pellietier,Pellicone,Pelletiu,Pellet,Pellam,Peleg,Pekas,Pekara,Pehowich,Peha,Pegeron,Peffly,Pefferkorn,Peetoom,Peerzada,Peecha,Peduzzi,Pedralba,Pedez,Pedeare,Pecinousky,Pechaira,Pecatoste,Pecarina,Pecararo,Pearyer,Peacy,Peachay,Payseur,Payor,Payna,Payant,Payamps,Pax,Pawluch,Pavliska,Pavis,Pavelski,Pavella,Pav,Pauza,Pausch,Paulshock,Paulseth,Paulmino,Paulic,Paulauskis,Paulauskas,Paulas,Pauker,Paugsch,Patzner,Patzke,Patwell,Patuel,Pattyre,Pattinson,Pattengale,Patriquin,Patrin,Patrias,Patria,Patolot,Patik,Paterniti,Patellis,Patches,Patcher,Patanella,Pataki,Patajo,Pasvizaca,Pastures,Pasto,Pastian,Passerino,Passer,Paskow,Pasket,Pasinski,Pasho,Pashea,Pashal,Pascorell,Pascoal,Pascanik,Pascall,Pasaya,Pasana,Paruta,Party,Partman,Partipilo,Partenope,Partelow,Part,Parsygnat,Parsh,Parsells,Parrotta,Parron,Parrington,Parrin,Parriera,Parreno,Parquette,Parpan,Parone,Parnin,Parms,Parmantier,Parkos,Parkhouse,Parizek,Paripovich,Parinas,Parihar,Parhan,Pargman,Pardoe,Parayuelos,Paravano,Paratore,Parara,Papranec,Pappajohn,Paponetti,Papitto,Papike,Papiernik,Papciak,Papantonio,Papanikolas,Papania,Papan,Papale,Pap,Paongo,Paola,Panzica,Panzella,Panyko,Panuccio,Pantosa,Pantoliano,Pantelakis,Panrell,Panowicz,Panora,Pankiw,Pankake,Panitz,Panila,Panias,Paneque,Panela,Paneczko,Pandola,Panahon,Panah,Panagoulias,Panagis,Paluszynski,Paluk,Paluck,Palu,Paloukos,Palombit,Palmios,Palley,Pallant,Pallansch,Pallafor,Palisbo,Palchetti,Palazola,Palas,Palacois,Pakonen,Pajerski,Paillant,Pahk,Pagni,Pagnello,Paglio,Paga,Pafel,Padol,Padgette,Padeken,Paddio,Paddilla,Paddack,Padavich,Pacquin,Packineau,Pacior,Pacholec,Pachlin,Pachla,Pach,Pacenta,Pacek,Pacapac,Pacana,Paben,Paarmann,Paalan,Ozer,Ozane,Ozaine,Ozaeta,Oz,Oyston,Oyellette,Oxton,Oxnam,Oxenrider,Oxborough,Owers,Ow,Ovit,Ovesen,Overstrom,Overshiner,Overmire,Overley,Overkamp,Overdick,Overbough,Ovdenk,Ovadilla,Ouye,Outzen,Ousdahl,Oury,Ourth,Ounsy,Ouellete,Oudker,Otutaha,Otuafi,Ottrix,Ottogary,Ottino,Ottilige,Ottenwess,Otiz,Othoudt,Otex,Otega,Osvaldo,Ostwald,Ostrzyeki,Ostrum,Ostroot,Osterhaut,Ostendorff,Ostenberg,Ostasiewicz,Osswald,Ossola,Osowicz,Osorno,Osollo,Osol,Osnoe,Osmus,Osmanski,Osias,Oshman,Osentowski,Osden,Osche,Osbeck,Orttenburger,Ortolf,Orto,Ortga,Orrego,Orpin,Orozeo,Orochena,Orobona,Oroark,Ornelos,Ornedo,Orne,Orm,Orlove,Orlosky,Orlof,Orlinsky,Orlinski,Orlin,Orizabal,Oriti,Orion,Origer,Orie,Orhenkowski,Orford,Orff,Oreskovich,Orellama,Oreily,Orehek,Oreb,Ordazzo,Ordahl,Orcholski,Orce,Oras,Opula,Opstein,Oppliger,Oppegard,Opichka,Opher,Opet,Opalicki,Opaka,Ooton,Onyeanus,Onwunli,Onukogu,Onisick,Onifade,Oneale,Ondik,Ondic,Ondersma,Omullan,Omoto,Omo,Omlin,Omli,Omersa,Olverson,Olveira,Olvedo,Olowe,Olona,Olnes,Olloqui,Olliver,Ollhoff,Ollendick,Olkowski,Olivid,Olivers,Oliveres,Olivarra,Olinghouse,Oligee,Olgvin,Olfers,Olewinski,Olewine,Oleveda,Oleskiewicz,Olejarski,Olecki,Olde,Olckhart,Olbrish,Olay,Olarte,Okwuona,Okuley,Okula,Okorududu,Okoren,Okoli,Okihara,Okerson,Oken,Ojard,Ojanen,Oines,Oilvares,Oieda,Ohrnstein,Ohren,Ohmit,Ohmie,Ohlmacher,Ohlenbusch,Ohlen,Ohaver,Oharroll,Ogwynn,Ogunyemi,Ogram,Ogilive,Ogen,Ogbonnaya,Ogasawara,Ogans,Ogami,Oflahrity,Offret,Oen,Oeler,Oehrlein,Oehrle,Oehmke,Oehmig,Oeftger,Oeder,Odougherty,Odorizzi,Odomes,Odin,Odien,Odhner,Odess,Odenheimer,Ocus,Ochsenbein,Ochinang,Ochiai,Ochalek,Occhino,Ocacio,Obnegon,Oblow,Oblinger,Obiano,Obery,Oberson,Oberpriller,Obermuller,Obermoeller,Oberholzer,Oberhaus,Oberdier,Oberdick,Oaxaca,Oar,Nysether,Nykiel,Nygaro,Nycum,Nyahay,Nwankwo,Nwakanma,Nwadiora,Nwabeke,Nuzenski,Nusz,Nunnelee,Nunmaker,Nuniz,Nunery,Nulisch,Nuetzman,Nuessle,Nuesca,Nuckoles,Nuccitelli,Nucci,Nozum,Nozick,Nowzari,Nowosadko,Nowley,Nowitzke,Novitsky,Novitski,Novitske,Novikoff,Novida,Novetsky,Novelly,Novellino,Novara,Nouth,Noullet,Noud,Notwick,Notowitz,Notley,Notis,Nothem,Nothacker,Nostro,Noseff,Norwell,Northwood,Northcut,Norstrud,Norseth,Norse,Norsaganay,Norko,Norkaitis,Noriego,Norg,Noreiga,Nordwall,Nordsiek,Nordlinger,Nordick,Nordenstrom,Norbo,Noorigian,Noordam,Nonu,Nones,Noneman,Nondorf,Noltensmeier,Nollette,Nolfe,Nolazco,Nokken,Noke,Noiseux,Noia,Nohe,Nogueda,Noguchi,Nogoda,Noggles,Noggler,Noftsier,Noey,Noerenberg,Noegel,Nodurft,Nodarse,Nockai,Nobregas,Nobis,Nkuku,Nkomo,Njango,Niziol,Nixion,Nixa,Nivar,Nivala,Nitzschke,Nitzsche,Nitzkowski,Nitcher,Niswender,Nisley,Nishimori,Nirmaier,Nipps,Nipple,Ninke,Nini,Ninh,Nimrod,Nimox,Nimick,Nila,Niksich,Nikodem,Nikocevic,Nikaido,Nightlinger,Niggemann,Nietfeldt,Niess,Niesent,Niesborella,Nierer,Niemitzio,Niemiel,Niemants,Niedzwiedzki,Niedzwiedz,Niedens,Niedbalec,Niebaum,Nicoson,Nicoli,Nicolaus,Nickoley,Nicklos,Nicklien,Nickenberry,Nickas,Nicholason,Nichell,Nichalson,Nicewonger,Niau,Nian,Nham,Nguyan,Ngin,Nezich,Nezat,Neyaci,Newstead,Newness,Newhook,Newes,Newens,Newbell,Newball,Nevinger,Nevilles,Nevil,Never,Nevarrez,Neuse,Neundorfer,Neuenswander,Neudeck,Neubig,Neubaum,Neubacher,Nettleingham,Netrosio,Netolicky,Netley,Nesti,Nessmith,Neslusan,Nesline,Nesland,Nesin,Nerlich,Nepa,Neonakis,Nenni,Nemzin,Nemunaitis,Nemets,Nemard,Nemani,Nelmes,Nellums,Nellenback,Nelisse,Nejaime,Neja,Neither,Neiswoger,Neiper,Neild,Neidiger,Nehrt,Nehme,Neglio,Negbenebor,Needy,Nedman,Nedina,Nederostek,Nedelman,Neddo,Nedbalek,Nebred,Neblock,Nebesnik,Nebarez,Neall,Nealious,Nealer,Neahr,Ncneal,Nazzise,Nazzal,Nazir,Nazelrod,Naz,Naysmith,Nayman,Nawwar,Nawda,Naveed,Navarrate,Navaretta,Navappo,Navanjo,Natwick,Nattiah,Natsis,Nati,Nathans,Natewa,Natani,Natalello,Nasti,Nassie,Nasr,Nasers,Nasalroad,Narr,Nargi,Nardy,Napieralski,Nanthanong,Nantanapibul,Nanna,Nanik,Nanasy,Nanas,Namur,Namihira,Namaka,Nalty,Nalbach,Naki,Nakatsu,Nakamori,Najarian,Nailer,Naifeh,Naidu,Nahrwold,Nahl,Nahari,Nagode,Nagindas,Nagengast,Nagelhout,Nagase,Naftzinger,Naftali,Naeher,Nadoff,Naderi,Nadelbach,Naddeo,Nacy,Nacisse,Nacion,Nachtrieb,Nachmias,Nachazel,Nacar,Naborg,Nabity,Nabhan,Mytych,Myslinski,Myslin,Mysak,Myrtle,Myrman,Myrck,Myntti,Mynnerlyn,Mylott,Myking,Myes,Mycroft,Mway,Muzyka,Muzacz,Muyskens,Muysenberg,Mutone,Mutner,Mutherspaw,Muthart,Muthana,Mutart,Musty,Muston,Mussmann,Musshorn,Musse,Muss,Musquiz,Musolf,Muskthel,Muska,Musinski,Musigdilok,Muschick,Muschett,Musch,Murwin,Murty,Mursko,Murnock,Mure,Murasso,Muraro,Muran,Murallies,Muraco,Munyer,Munshi,Munning,Munl,Munir,Muninger,Munhall,Muney,Munet,Mundziak,Mundschau,Mundhenk,Munderville,Muncil,Munchmeyer,Munaz,Muna,Mulzer,Mulvahill,Mulryan,Mulroney,Mulready,Mulneix,Mullowney,Mullner,Mullison,Mullany,Mulich,Mula,Muhtaseb,Muhlenkamp,Muhlbach,Muggley,Mueske,Muenkel,Muell,Muehleisen,Mudrick,Muddaththir,Muczynski,Mucklow,Muckley,Muckelvaney,Muchortow,Mthimunye,Mrazik,Mozzone,Mozo,Mozley,Mozie,Mozgala,Mozelak,Moyerman,Mowder,Mowan,Movlin,Mouzas,Mourino,Moulhem,Mottillo,Motteshard,Mottershead,Motamed,Mosz,Mostoller,Mostiller,Mostero,Mostella,Mosson,Mossing,Mossien,Mossel,Mosmeyer,Moskau,Moshos,Mosho,Moscovic,Moscaritolo,Moscariello,Moscardelli,Morosow,Morono,Morneault,Morna,Morn,Morkve,Moriwaki,Morise,Moriera,Moricle,Moribayed,Morgret,Morgner,Morgas,Morgans,Morgandi,Morfee,Morelen,Moreida,Moreci,Moreb,Mordino,Mordini,Mordehay,Morda,Mootz,Mootispaw,Moosbrugger,Moosa,Moonsommy,Moonshower,Moodispaugh,Mooberry,Monz,Montuoro,Montrella,Montijano,Montgonery,Montelle,Montell,Montcalm,Montalgo,Monske,Monrroy,Monrow,Monnot,Moniak,Mongue,Mongolo,Mongiovi,Monfore,Mondoux,Mondone,Mondell,Mondaine,Moncrieffe,Moncrieff,Moncier,Monasterio,Monarque,Monaham,Monagle,Momper,Momeni,Moltrie,Molone,Molly,Mollohan,Molliere,Mollere,Molleker,Mollberg,Molinini,Moling,Molineaux,Molett,Moldan,Molavi,Molaison,Mokriski,Mokiao,Mojzisik,Mojardin,Moisey,Mohorovich,Mohinani,Mohaupt,Mohabeer,Mogollon,Moghadam,Mofle,Mofford,Moevao,Moelter,Moede,Modrak,Moddejonge,Mockler,Mocha,Mobilio,Mlenar,Mizzi,Mizner,Mizee,Miyasaka,Miyao,Mixdorf,Mitter,Mittchell,Mittag,Mithani,Mitchler,Misove,Mismit,Misluk,Miskovich,Mishou,Miserendino,Misek,Miscoe,Mirmow,Mirman,Mirkovich,Mirao,Miran,Miquelon,Minucci,Mintreas,Mintos,Mintor,Minotti,Minock,Minnatee,Miniuk,Minissale,Minihan,Minicozzi,Mini,Minford,Minette,Minery,Minehan,Mineconzo,Mindingall,Minchella,Minarcik,Minacci,Mimaki,Milz,Milwee,Miltz,Milsaps,Milosevich,Millstead,Millott,Millora,Millian,Millhiser,Millerr,Millbrand,Millbern,Millberg,Milkent,Milius,Milite,Milelr,Mildred,Milderberger,Mildenstein,Milbrodt,Milare,Mikulec,Mikovec,Mikota,Mikolon,Mikhaiel,Mikez,Miker,Mikasa,Mihovk,Mihor,Mihaliak,Mihalco,Mihalak,Miggo,Miessler,Miernik,Miernicki,Miene,Mieloszyk,Mielkie,Mielczarek,Mielcarz,Miehe,Midget,Middough,Middents,Microni,Mickulskis,Micks,Mickonis,Mickenheim,Michello,Michealson,Michavd,Michalczik,Mezzinni,Mezzanotte,Meysembourg,Meyerowitz,Meyerott,Meyerman,Meyerhoefer,Mevis,Mevers,Meuler,Meulemans,Meua,Metzga,Metzel,Mettlen,Mettille,Metott,Metos,Metil,Metia,Metherell,Metevelis,Metenosky,Meteer,Metchikoff,Mestler,Mestanza,Messman,Messey,Messervy,Messel,Messan,Mesoloras,Mesmer,Mesiona,Mesias,Meshew,Meshanko,Meservy,Mesecar,Mesdaq,Merzig,Mervine,Mertine,Merrills,Merren,Merlette,Merles,Merlain,Merl,Merksamer,Merithew,Merisier,Mering,Merilos,Merical,Merhar,Merette,Mereno,Merdian,Merceir,Mercando,Merante,Merana,Merales,Menucci,Mentkowski,Mentgen,Menso,Mensen,Menkin,Menjes,Menjares,Menitz,Menietto,Menier,Meneus,Menefield,Menees,Mendrin,Mendrala,Mendler,Mendiaz,Mendesa,Mencke,Menchu,Menches,Menas,Mems,Memo,Memmo,Meltzner,Melter,Melstrom,Melsheimer,Melser,Melodia,Mellos,Mellis,Melliere,Mellie,Mellecker,Mellage,Mellady,Melikyan,Melford,Meley,Melencamp,Meleen,Melear,Melchert,Melaun,Melaro,Melady,Mekonis,Meisenburg,Meireles,Meinsen,Meinershagen,Meil,Meihofer,Mehrotra,Mehlhaff,Mehis,Mehelich,Mehdizadeh,Mehdi,Meharry,Mehalko,Megraw,Megown,Mego,Megill,Megia,Meggison,Meggett,Meggerson,Meetze,Meeroff,Meemken,Meehleder,Meeds,Medure,Medosch,Medora,Mednis,Medling,Medland,Medious,Medino,Medin,Medill,Medieros,Medi,Medhus,Medearis,Medanich,Medalion,Meckel,Meccia,Mecardo,Measheaw,Measeck,Mearing,Meara,Meakin,Mcwilson,Mcward,Mcwalters,Mcwade,Mcvoy,Mctush,Mctiernan,Mctarnaghan,Mcswiggan,Mcstay,Mcritchie,Mcrill,Mcquiddy,Mcqueeny,Mcpharlane,Mcphan,Mcpartlin,Mcnutty,Mcnuh,Mcnicoll,Mcnicol,Mcnevin,Mcnespey,Mcneme,Mcnellie,Mcnayr,Mcmina,Mcmenamy,Mcmanigal,Mcluckie,Mclilly,Mcleskey,Mclearan,Mclauchlen,Mclatchy,Mclaen,Mckray,Mckouen,Mckoon,Mckisson,Mckinna,Mckines,Mckimmy,Mckimley,Mckewen,Mckerrow,Mckenzy,Mckentie,Mckemie,Mckaskle,Mckanic,Mcintyde,Mcinroy,Mcinnish,Mcilwaine,Mciltrot,Mchalffey,Mcgurren,Mcgurr,Mcgunnis,Mcgunnigle,Mcgunagle,Mcguinnes,Mcguin,Mcgrotha,Mcgrogan,Mcgraph,Mcgoon,Mcglothern,Mcgloster,Mcglohon,Mcglockton,Mcglawn,Mcginnity,Mcginister,Mcgilberry,Mcgiboney,Mcghin,Mcghaney,Mcgeeney,Mcgeady,Mcgartland,Mcgarraugh,Mcgaffey,Mcgafferty,Mcgaffee,Mcfeeley,Mcfan,Mceneny,Mcelwine,Mcelreavy,Mcelpraug,Mcelmeel,Mceirath,Mceady,Mcdunn,Mcdonnall,Mcdewitt,Mcdermett,Mcdeavitt,Mcdearmont,Mccurine,Mccunn,Mccumbers,Mccumbee,Mccullors,Mccullon,Mccullogh,Mccullock,Mccuan,Mccrate,Mccra,Mccoulskey,Mccornack,Mccormik,Mccorkindale,Mccorison,Mcconnal,Mccomack,Mccole,Mccoil,Mccoard,Mcclurken,Mcclodden,Mcclod,Mcclimens,Mccleveland,Mcclenningham,Mcclellon,Mcclaugherty,Mcclatcher,Mcclarty,Mcclamma,Mcclaim,Mcchain,Mccelland,Mccastle,Mccarvill,Mccarther,Mccarr,Mccarns,Mccarn,Mccard,Mccandrew,Mccandliss,Mccalvin,Mccalpin,Mccalment,Mccallun,Mccallough,Mccahan,Mccaffree,Mcbratney,Mcaveney,Mcausland,Mcauly,Mcarthun,Mcanaw,Mcall,Mbamalu,Mazzera,Mazze,Mazzawi,Mazzaferro,Mazzacano,Mazuo,Mazion,Mazey,Maywood,Mayshack,Mayrose,Mayou,Mayorca,Mayoka,Maynerich,Maylone,Mayhood,Mayeshiba,Maydew,Maxi,Maxell,Mawhinney,Mavropoulos,Mavle,Mavai,Mautte,Mauson,Mausey,Mauseth,Mausbach,Maurus,Maurizio,Maura,Maupredi,Maung,Maultasch,Mauleon,Maud,Matyi,Matuszak,Matushevsky,Matusek,Matuck,Mattys,Mattsey,Mattione,Mattias,Matteis,Matsu,Matsoukas,Matrey,Matot,Matlin,Matkowsky,Matise,Mathwich,Mathus,Mathony,Mathery,Matherson,Mathen,Maten,Matelich,Matejek,Matczak,Matchen,Matarrita,Matakonis,Mataka,Matacale,Masuyama,Masure,Masupha,Masudi,Masturzo,Mastrocola,Mastriano,Mastrianni,Mastrianna,Mastrelli,Massicotte,Massetti,Massella,Massei,Massee,Massaquoi,Masood,Masom,Maslowsky,Masloski,Maslonka,Maski,Maskaly,Masiejczyk,Masgalas,Masero,Masenten,Masciantonio,Masaya,Masaracchia,Marzocchi,Marzili,Marzigliano,Marye,Marusiak,Marullo,Marturano,Martos,Martorello,Martineze,Martillo,Martignago,Martiarena,Marsters,Marshalek,Marsell,Marsek,Marseglia,Marriot,Marrion,Marrington,Marrietta,Marrello,Marreel,Marrable,Marquina,Marque,Marozzi,Marovic,Marotti,Marose,Marnett,Marmolejos,Markt,Markson,Marklund,Markewich,Marinoni,Marinko,Marinas,Maril,Mariello,Marguardt,Margreiter,Margraf,Margel,Margaryan,Margarita,Margan,Marevka,Maresco,Marero,Marentez,Maree,Mardini,Marcotrigiano,Marcoguisepp,Marcks,Marcinka,Marchizano,Marchitto,Marchiony,Marchionese,Marchesseault,Marcheski,Marchesano,Marchall,Marceaux,Marbray,Maratre,Maratos,Marashi,Marasciulo,Maras,Marantz,Marallo,Maragni,Maragh,Marabella,Maquis,Maontesano,Maobi,Manzie,Manzay,Manvelito,Manvel,Manuell,Mantik,Mantele,Mantegna,Mansbridge,Mansanares,Manora,Manolakis,Manokey,Mannine,Mannheimer,Mannebach,Mannchen,Manlito,Mankoski,Manivong,Manheim,Mangubat,Manfra,Manemann,Manecke,Mandry,Mandler,Mandi,Mandap,Mandahl,Mancos,Manciel,Mancherian,Manchel,Manca,Manby,Manatt,Manaker,Mamone,Mammano,Malvern,Malton,Malsch,Malovich,Malouff,Malory,Maloff,Malocha,Malmanger,Mallinger,Mallinak,Mallegni,Mallat,Malkoski,Malinky,Malinak,Malichi,Malgieri,Maleszka,Males,Maleonado,Malenke,Malekan,Malehorn,Maleck,Malcome,Malay,Malawy,Malarkey,Malanado,Malama,Malabey,Makua,Makhija,Makel,Makarem,Majorga,Majocka,Majica,Majic,Majeau,Maizes,Mairot,Maione,Mainz,Mainland,Mainetti,Mainero,Maimone,Maifeld,Maiers,Maiello,Maidonado,Maicus,Mahung,Mahula,Mahrenholz,Mahran,Mahomly,Mahin,Mahe,Mahall,Mahal,Magsby,Magsayo,Magrone,Magraw,Magrann,Magpali,Magouliotis,Magorina,Magobet,Magnini,Magnifico,Magnie,Magnett,Maglioli,Maggit,Magg,Magette,Magdefrau,Magdalena,Magaziner,Magathan,Magalski,Magaldi,Magadan,Mafua,Maeno,Maenaga,Maedke,Madziar,Madre,Madine,Madin,Madhavan,Madge,Madeja,Maddoy,Maddison,Maddin,Maddern,Mad,Macvicar,Macurdy,Macreno,Macpartland,Macoreno,Macola,Macnutt,Macnevin,Macmullan,Maclain,Mackstutis,Macknair,Macklem,Mackillop,Mackenthun,Mackechnie,Mackaman,Macione,Maciolek,Maciarello,Machover,Machle,Machi,Machel,Machak,Macduffee,Maccutcheon,Macculloch,Maccord,Macconaghy,Maccoll,Macclellan,Macclairty,Maccini,Macchiarella,Maccheyne,Maccarter,Maccarino,Maccarini,Macandog,Macanas,Macalma,Macabeo,Maasen,Maarx,Lytell,Lyson,Lysher,Lyngholm,Lynchj,Lynah,Lyme,Lyken,Lyew,Lydecker,Lybert,Lyberger,Lybecker,Lyau,Lweis,Luzi,Luzell,Luvianos,Luvera,Lutze,Lutkus,Luten,Lusty,Lustberg,Lurye,Lury,Lurtz,Luquette,Lupiani,Lupacchino,Lunter,Lunstrum,Lungwitz,Lungsford,Lunemann,Lunderman,Lunch,Luminati,Lumbley,Lumba,Lumadue,Lulas,Lukow,Lukianov,Lukesh,Lukander,Luka,Luing,Luikart,Lugabihl,Lufborough,Luette,Luescher,Lueschen,Luersen,Luensmann,Luening,Lueker,Luedecke,Lueckenbach,Luebbering,Ludovico,Ludera,Ludeker,Ludecke,Luczki,Luco,Luckinbill,Lucis,Lucik,Lucie,Lucic,Luchterhand,Luccous,Lucash,Luberger,Lubbert,Lubben,Lubawy,Lubahn,Luangxay,Luangrath,Luangamath,Luague,Lozey,Loyborg,Loyack,Loxton,Loxtercamp,Lownsbery,Lowler,Lowcks,Lowa,Lovstad,Lovisone,Lovfald,Lovetinsky,Lovet,Lovero,Loverdi,Lovellette,Loveberry,Louwagie,Lournes,Louria,Lourentzos,Lourdes,Louka,Louil,Loudermelt,Louchen,Loubier,Lotto,Lotridge,Lothringer,Lothridge,Lota,Lot,Loszynski,Lossius,Losneck,Loseth,Losavio,Losardo,Losano,Losado,Losacco,Losa,Lorr,Loron,Lorincz,Loria,Loretz,Lorentine,Lordi,Loraine,Lopze,Lopiccalo,Lopey,Loperfido,Lope,Lopata,Lopas,Loparco,Loofbourrow,Longwith,Longhi,Longenberger,Longbine,Longaker,Longabaugh,Lomonte,Lomino,Lominack,Lomen,Lombel,Lombardino,Lomago,Loma,Lokan,Loiacona,Lohry,Lohrke,Lohre,Logoleo,Loggens,Logarbo,Lofwall,Lofty,Lofts,Lofthus,Lofte,Lofstrom,Loforte,Lofman,Lofing,Lofguist,Loffier,Loffelbein,Loerwald,Loeppky,Loehrer,Loehner,Loecken,Lockshaw,Locknane,Lockington,Lockery,Lockemer,Lochrico,Lobregat,Lobley,Lobello,Lobell,Lobalbo,Lobach,Llaneza,Llanet,Llams,Livley,Livinton,Living,Liversedge,Livernois,Livermon,Liverance,Liveoak,Livecchi,Livasy,Liukkonen,Litzenberger,Litvak,Littfin,Litmanowicz,Litchard,Listi,Listen,Lisker,Lisitano,Lisena,Lisbey,Lipsie,Lips,Lippoldt,Lippitt,Lipper,Lipoma,Lipkovitch,Lipira,Lipan,Linzan,Linza,Linsin,Linsenmayer,Linsdau,Linnert,Linman,Linkon,Lingner,Lingley,Lingerfelter,Lingbeek,Linero,Lindorf,Lindmeyer,Lindinha,Linderleaf,Lindau,Lindabury,Linburg,Linak,Limmel,Limle,Limbert,Limardi,Lilyblade,Lillehaug,Likar,Liiv,Ligonis,Ligler,Lighthart,Ligget,Liftin,Lifschitz,Liewald,Lievsay,Lievens,Lietzow,Lierz,Liegler,Liedberg,Lied,Liebrecht,Liebherr,Lieberg,Liebenthal,Liebenow,Liebeck,Lidstone,Lidie,Lidge,Lidder,Licursi,Licklider,Lickfelt,Lichota,Lichenstein,Liceaga,Liccketto,Libertini,Libberton,Leyton,Leyh,Leydecker,Leyda,Lexer,Lewi,Lewars,Levreau,Levra,Levielle,Levian,Leveto,Leversee,Levers,Leverone,Leverance,Levendoski,Levee,Levatino,Levans,Levandofsky,Leuze,Leutwiler,Leuthe,Leuhring,Leuga,Leuckel,Leuasseur,Lettsome,Lettiere,Letscher,Letender,Letchaw,Leta,Lestrange,Lestourgeon,Lestor,Leston,Lessner,Lessmann,Lessly,Lespedes,Leso,Lesneski,Leskovar,Leskovac,Lese,Lesco,Lesches,Lesa,Lerra,Lerper,Lerow,Lero,Lermon,Lepretre,Lepre,Leppink,Lepke,Lepez,Lepetich,Leopardi,Leonpacher,Leonick,Leonberger,Leomiti,Leny,Lenski,Lenorud,Lenort,Lennis,Lennart,Lennan,Lenling,Lenke,Lenigan,Lenhoff,Lenharr,Leners,Lendt,Lendor,Lendo,Lenczyk,Lench,Lenberg,Lemoyne,Lemmonds,Lemmings,Lemish,Lemear,Lembcke,Lemansky,Lemans,Lellig,Lekey,Lekberg,Lekan,Lek,Lejman,Leitzinger,Leithiser,Leiper,Leinwand,Leimkuhler,Leimberger,Leilich,Leigland,Leichtenberge,Leiberton,Leho,Lehning,Lehneis,Lehmer,Lehenbauer,Lehberger,Legrotte,Legro,Legra,Legat,Legall,Lefurgy,Leflores,Leffers,Leffelman,Lefeld,Lefaver,Leetham,Leesman,Leeker,Leehan,Leeber,Ledsinger,Ledermann,Ledenbach,Ledee,Led,Lecznar,Leckband,Lechleidner,Lechelt,Lecato,Lecaros,Lecain,Lebroke,Lebold,Leblane,Lebitski,Lebish,Leberte,Lebedeff,Lebby,Lebaugh,Lebarge,Leavigne,Leaven,Leasor,Leasher,Leash,Leanza,Leanen,Leaird,Leahman,Leadford,Lazusky,Lazurek,Lazott,Lazio,Lazier,Lazich,Lazewski,Lazares,Layva,Layell,Laycox,Lawsky,Lawrentz,Lawis,Lawford,Lawcewicz,Lawbaugh,Lawary,Lawal,Lavongsar,Lavgle,Lavezzo,Lavelli,Lave,Lavani,Lavander,Lavagnino,Lavadera,Lautieri,Lautaret,Lausell,Lauschus,Laurole,Lauretta,Laureno,Laureles,Laurance,Launiere,Laundree,Lauigne,Laughon,Laugen,Laudeman,Laudadio,Lauckner,Lauchaire,Lauby,Laubersheimer,Latus,Latourrette,Latos,Laton,Lathrum,Lather,Lathe,Latendresse,Late,Latassa,Latam,Lat,Lastella,Lassetter,Laskosky,Laskoskie,Lasin,Lasik,Lashlee,Lashier,Laselle,Laschinger,Lascaro,Lasane,Lasagna,Lasage,Larusch,Larrosa,Larriviere,Larralde,Larr,Larowe,Larousse,Larotta,Laroia,Laroe,Larmett,Larman,Larkan,Largena,Laregina,Lardone,Larcom,Larche,Larbie,Larbi,Larason,Laranjo,Laragy,Laraby,Larabell,Larabel,Lapuerta,Lappinga,Lappi,Laport,Lapinta,Lapila,Laperuta,Lapere,Laper,Lapek,Lapari,Lapalme,Laorange,Lanze,Lanzarotta,Lantry,Lantgen,Lantelme,Lanteigne,Lansey,Lansberg,Lannier,Lannen,Lanna,Lankster,Lanie,Langrum,Langness,Langmo,Langlitz,Langi,Langholdt,Langhans,Langgood,Langanke,Lanfor,Lanen,Laneaux,Landu,Landruth,Landrie,Landreville,Landres,Landquist,Landolf,Landmark,Landini,Landevos,Landenberger,Landan,Lancz,Lamudio,Lampsas,Lampl,Lampinen,Lamphiear,Lampel,Lamoree,Lamoreau,Lamoore,Lamontagna,Lammy,Lammel,Lamison,Laming,Lamie,Lamia,Lameda,Lambuth,Lambertus,Lambermont,Lamartina,Lamango,Lamaack,Lalinde,Lalich,Lale,Lakowski,Lakhan,Lajoye,Lajoy,Laios,Lahne,Laham,Laguire,Lagrenade,Lagore,Lagoo,Lagonia,Lagoni,Laglie,Laggan,Lagesse,Lagerstedt,Lagergren,Lagatta,Lagard,Lagant,Lagamba,Lagadinos,Lafuze,Lafrate,Laforey,Lafoon,Lafontain,Laflam,Laffer,Lafevre,Lafemina,Lafantano,Laface,Laessig,Laehn,Ladt,Ladouce,Ladonne,Lado,Ladika,Ladick,Ladebauche,Lacz,Lacusky,Lacovara,Lackett,Lackage,Lachino,Lachiatto,Lacharite,Lacerenza,Lacek,Lacau,Lacatena,Lacaille,Labovitch,Labounta,Labombar,Laboissonnier,Labo,Labitan,Labier,Labeots,Labarriere,Labaro,Labarbara,Laatsch,Laasaga,Laake,Kyseth,Kypuros,Kyper,Kyner,Kwilosz,Kvzian,Kvoeschen,Kveton,Kvek,Kveen,Kvaternik,Kuziel,Kuypers,Kuykendoll,Kuwana,Kuwada,Kutzer,Kuty,Kutlu,Kuti,Kutchie,Kuszynski,Kussmaul,Kussel,Kusnic,Kusner,Kusky,Kushaney,Kurzinski,Kurtti,Kurshuk,Kurr,Kurokawa,Kurns,Kuretich,Kurasz,Kurant,Kura,Kur,Kupihea,Kupferberg,Kupersmith,Kupchinsky,Kunter,Kunkleman,Kuniyoshi,Kunimitsu,Kunich,Kundanani,Kunau,Kummerow,Kumlander,Kumfer,Kuman,Kumalaa,Kum,Kulseth,Kulbeth,Kulbacki,Kulback,Kukura,Kukler,Kuklenski,Kukauskas,Kukahiko,Kujat,Kuiz,Kuitu,Kuick,Kuhry,Kuhlenschmidt,Kuffa,Kuepfer,Kuehnhold,Kuechler,Kudro,Kudrle,Kuczma,Kuckens,Kuciemba,Kuchinski,Kuchem,Kubley,Kubler,Kubesh,Kubeck,Kubasch,Kub,Kuanoni,Krzewinski,Krzesinski,Krzan,Kryston,Krystek,Krynicki,Krylo,Kruzel,Kruyt,Kruszewski,Krusor,Kruskie,Krushansky,Krush,Kruppenbacher,Krupinsky,Krumroy,Krumbein,Krumbach,Krukiel,Kruizenga,Kruis,Kruiboesch,Kruebbe,Krucke,Krotine,Krostag,Kropff,Kropfelder,Kroninger,Kronau,Krome,Krolick,Krokus,Krog,Krofta,Krofft,Kroesing,Krochmal,Krobath,Krnach,Krivanec,Kristofferson,Kristof,Kristan,Krissie,Kriskovich,Kriske,Krishun,Krishnamurthy,Krishman,Krinov,Kriek,Kriegshauser,Krewer,Kreutzbender,Kreusch,Kretzinger,Kressler,Kressin,Kressierer,Kresky,Krepp,Krenzke,Krenning,Krenik,Kremple,Kremmel,Kremen,Krejcik,Kreissler,Kreinhagen,Krehel,Kreese,Krawitz,Kravetsky,Kravets,Kravec,Krausse,Krausmann,Krauel,Kratowicz,Kratchman,Krasnici,Krasnansky,Kraskouskas,Krasinski,Kranwinkle,Kranock,Kramarczyk,Krallman,Krallis,Krakowiak,Krakauer,Krainbucher,Kraig,Kraichely,Krahulec,Krahe,Krah,Kragt,Kraetsch,Krabel,Krabbenhoft,Kraasch,Kraack,Kozlovsky,Kozlik,Koziak,Kozeyah,Kozan,Kowitz,Kowalke,Kowalec,Koves,Kovalaske,Kovacik,Koutras,Koussa,Kousonsavath,Kounthong,Kounthapanya,Kounovsky,Kounkel,Kounick,Koulavongsa,Koulalis,Kotyk,Kotur,Kottraba,Kottlowski,Kotterna,Kotschevar,Kotonski,Kotlar,Kotheimer,Kotey,Koterba,Koteras,Kotarski,Kotaki,Kosuta,Kostrzewa,Kostiv,Kosters,Kossey,Kossen,Kossak,Kososky,Kosorog,Koso,Koslan,Kosiorek,Koshi,Koscielniak,Kosareff,Korzyniowski,Korzybski,Korynta,Korwin,Korwatch,Kortemeier,Korst,Korsmeyer,Korslund,Koroch,Kornn,Kornfield,Kornblatt,Korkmas,Koritko,Korinta,Koria,Korewdit,Kores,Korenek,Kordys,Kordowski,Kordiak,Korbin,Kopsho,Koppy,Kopke,Kopin,Kopicko,Kopiasz,Koperski,Kopay,Kopatz,Kopan,Koosman,Koong,Koolman,Kool,Konty,Konow,Konopski,Konma,Konishi,Konger,Konetchy,Kone,Konderla,Konczewski,Konarik,Komula,Kominski,Komada,Koma,Kolwyck,Kolupke,Koltz,Kolts,Kolppa,Koloc,Kollross,Kollos,Kolkman,Kolkhorst,Kolikas,Kolic,Kolbusz,Kolassa,Kol,Kokubun,Kokoszka,Kokko,Kokenge,Koitzsch,Koiner,Kohus,Kohles,Kohel,Koguchi,Kofoot,Koers,Koenitzer,Koeninger,Koenigsberg,Koener,Koenemund,Koelbel,Koehring,Koeck,Kody,Kodera,Koczwara,Kocieda,Kochkodin,Kochen,Kochanek,Kobylski,Kobylarz,Kobylarczyk,Kobold,Knyzewski,Knupke,Knudsvig,Knowiton,Knowell,Knous,Knotowicz,Knorp,Knoflicek,Knoeppel,Knoepke,Knoell,Knoechel,Knodel,Knockaert,Knobler,Kniola,Knill,Knilands,Kniesel,Kniceley,Kneuper,Knetsch,Kneser,Knerien,Knellinger,Kneefe,Knazs,Knatt,Knapko,Knapick,Knape,Knap,Knake,Kmiotek,Kment,Kmatz,Kman,Klyn,Klute,Kluse,Klumph,Klukken,Klukan,Kluemper,Kluber,Klosky,Kloppenburg,Klonowski,Klomp,Klohs,Klohe,Kloeppel,Kloeker,Kloefkorn,Kloeck,Klobucar,Kljucaric,Klitzner,Klitsch,Kliskey,Klinski,Klinnert,Klinich,Klingner,Klingenberger,Klingberg,Klingaman,Klimo,Klimavicius,Klickman,Klicka,Klez,Klevjer,Klette,Kletschka,Kless,Kleppen,Klenovich,Kleintop,Kleinsasser,Kleinfeld,Kleifgen,Kleid,Kleftogiannis,Kleefisch,Kleck,Klebes,Klear,Klawuhn,Klawinski,Klavon,Klavetter,Klarin,Klappholz,Klande,Klancnik,Klan,Klamn,Klamert,Klaja,Klaich,Klafehn,Klabunde,Kjolseth,Kjergaard,Kjellsen,Kjellman,Kjeldgaard,Kizzia,Kizior,Kivela,Kitty,Kitthikoune,Kittelman,Kitelinger,Kitcher,Kitchenman,Kitanik,Kisro,Kisielewski,Kiryakoza,Kirsopp,Kirshman,Kirlin,Kirkness,Kirkling,Kirkconnell,Kirgan,Kirchmann,Kirchherr,Kirchberg,Kirchbaum,Kirberger,Kiracofe,Kipple,Kip,Kious,Kintopp,Kintigh,Kinsolving,Kinsky,Kinlin,Kinlecheeny,Kingwood,Kingson,Kinds,Kindregan,Kinderman,Kinde,Kimminau,Kimbal,Kilver,Kiltie,Kilstofte,Kilogan,Kilness,Kilner,Kilmister,Killoren,Killius,Kilimnik,Kilichowski,Kildare,Kiko,Kijak,Kiili,Kihlstrom,Kietzer,Kiesser,Kierzewski,Kienbaum,Kienast,Kieke,Kieck,Kiebala,Kiddle,Kickel,Kichline,Kibbler,Kiani,Khubba,Khora,Khokher,Khn,Khlok,Khilling,Khensamphanh,Khemmanivong,Khazdozian,Khazaleh,Khauv,Khairallah,Kezele,Keyon,Keyl,Kew,Kevwitch,Kevorkian,Keveth,Kevelin,Kevan,Keuper,Ketzler,Kettinger,Ketterl,Ketteringham,Kettenring,Ketchersid,Kessans,Kesey,Kesek,Kertzman,Kertels,Kerst,Kerper,Kernodle,Kernighan,Kernagis,Kermes,Kerens,Kercheff,Kerce,Kerans,Keppner,Kepke,Kepani,Keovongxay,Keoghan,Keodalah,Keobaunleuang,Kenzie,Kenson,Kenoyer,Kenouo,Kennie,Kenngott,Kennaugh,Kenik,Keney,Kenekham,Kenealy,Kendziora,Kendal,Kenaga,Kempster,Kemps,Kempon,Kempkens,Kemmeries,Kemerly,Keltt,Kellywood,Kellish,Kellem,Keliipaakaua,Kelau,Keks,Keisacker,Keis,Keinonen,Keilholz,Keilholtz,Keihl,Kehres,Keetch,Keetan,Keet,Keeser,Keenom,Keeman,Keehner,Keehan,Kedra,Kedia,Kecskes,Kecker,Kebede,Kebe,Keba,Keaty,Keaten,Keaser,Kearsey,Kearn,Kazunas,Kazimi,Kazar,Kazabi,Kaza,Kayat,Kayastha,Kawski,Kawell,Kawczynski,Kawaiaea,Kave,Kavaney,Kaut,Kaushal,Kausch,Kauo,Kaumans,Kaui,Kauder,Kaucher,Kaua,Katzmann,Katzaman,Katterjohn,Kattaura,Katsaounis,Katoh,Katke,Katis,Katin,Katie,Kathleen,Kathel,Kataoka,Kaszton,Kaszinski,Kasula,Kasuba,Kastens,Kaspari,Kasmarek,Kasky,Kashner,Kasen,Kasemeier,Kasee,Kasal,Karz,Karwowski,Karstensen,Karroach,Karro,Karrels,Karpstein,Karpe,Karoly,Karnath,Karnas,Karlinsky,Karlgaard,Kardux,Karangelen,Karamchandani,Karagiannes,Karageorge,Karabin,Kar,Kapsner,Kapperman,Kappelmann,Kapler,Kapiloff,Kapetanos,Kanzenbach,Kanwar,Kantis,Kantah,Kanosh,Kanoon,Kanniard,Kannan,Kanjirathinga,Kangleon,Kaneta,Kanekuni,Kanealii,Kand,Kanakares,Kamstra,Kamradt,Kampner,Kamna,Kammerzell,Kamman,Kamiya,Kaminska,Kamensky,Kamber,Kallhoff,Kallfelz,Kalley,Kallestad,Kallal,Kalista,Kalhorn,Kalenak,Kaldahl,Kalberg,Kalandek,Kalan,Kalamaras,Kalafarski,Kalaf,Kakowski,Kakeh,Kakani,Kajder,Kaja,Kaines,Kaiktsian,Kaid,Kahookele,Kahoohalphala,Kahley,Kahao,Kahalehoe,Kahal,Kahae,Kagimoto,Kaewprasert,Kaemingk,Kadow,Kadelak,Kaczka,Kacvinsky,Kacprowski,Kachmarsky,Kabzinski,Kabus,Kabir,Kabigting,Kabala,Kabacinski,Kababik,Kaarlela,Kaanana,Kaan,Kaak,Kaai,Ka,Juvenal,Justian,Juste,Justak,Jurries,Jurney,Jurkovich,Jurist,Jurin,Jurgen,Juray,Junod,Junkersfeld,Junick,Jumbo,Julsrud,Julitz,Juliana,Jukich,Juengling,Juen,Juelich,Judie,Jubyna,Jubran,Jubeh,Juback,Juba,Juanico,Joynson,Joyne,Jover,Journot,Joto,Jotblad,Josic,Jorrisch,Jordt,Jording,Jondrow,Jonah,Jome,Jollimore,Joline,Jolina,Joler,Joki,Johnting,Johnstonbaugh,Johnikins,Johniken,Johe,Johansing,Johal,Joganic,Joerger,Joelson,Joehnck,Jody,Jodha,Joanis,Jirsa,Jirak,Jira,Jingst,Jhingree,Jhanson,Jews,Jestis,Jessica,Jeskie,Jesiolowski,Jesenovec,Jeschon,Jermeland,Jerkin,Jericho,Jerger,Jergen,Jerding,Jepko,Jens,Jenovese,Jennkie,Jenderer,Jenab,Jempty,Jemmings,Jelome,Jellings,Jelden,Jelarde,Jeffryes,Jeffirs,Jedan,Jecmenek,Jecklin,Jeck,Jeanquart,Jeanphilippe,Jeannoel,Jeanette,Jeancy,Jaysura,Javis,Javers,Javed,Jave,Jaussen,Jauhar,Jastremski,Jastrebski,Jasmann,Jaskolka,Jasko,Jaskiewicz,Jasica,Jasch,Jarriett,Jaroski,Jarnutowski,Jarmin,Jaremka,Jarema,Jarels,Jarecke,Jarding,Jardel,Japak,Janysek,Janway,Janowiec,Janow,Janofsky,Janoff,Jannise,Jannett,Jankoff,Janeiro,Jana,Jaminet,Jami,Jamgochian,Jamesson,Jamer,Jamel,Jamason,Jalovel,Jalkut,Jakubov,Jaksic,Jaksch,Jakiela,Jaji,Jaiyesimi,Jahosky,Jahoda,Jahaly,Jagiello,Jaggie,Jafek,Jafari,Jae,Jadoo,Jaculina,Jacquin,Jacquelin,Jacobsohn,Jacobovits,Jackso,Jacksits,Jackosn,Jackett,Jacinthe,Jabbie,Jabaut,Jabali,Jaarda,Izak,Izaguine,Iwasko,Iwashita,Ivrin,Ivener,Iveans,Ivancic,Iuchs,Itnyre,Istorico,Isiminger,Isgur,Isgro,Isenbarger,Iseman,Isebrand,Isaksen,Isagba,Isacson,Isaack,Irr,Ironhorse,Irigoyen,Ireson,Ipsen,Iossa,Inzano,Introini,Insognia,Inserra,Inostraza,Innerst,Innella,Innarelli,Innamorato,Inkavesvanitc,Ingvolostad,Inguardsen,Ingran,Ingrahm,Ingraffea,Ingleton,Inghem,Ingersol,Ingargiolo,Inferrera,Iner,Induddi,Indermuehle,Indeck,Indal,Incomstanti,Incera,Incarnato,Inbody,Inabnit,Imming,Immerman,Immediato,Imholte,Imeson,Imbruglia,Imbrock,Imbriale,Imbrenda,Imam,Imada,Iltzsch,Illovsky,Illich,Illas,Illar,Iliffe,Ilg,Ilarraza,Ilaria,Ilalio,Ikzda,Ikkela,Ikenberry,Ikemoto,Ikemire,Ikeard,Ihnen,Ihenyen,Iheme,Igus,Iguina,Ignoria,Igles,Igbinosun,Ifie,Ifft,Ifeanyi,Ifantides,Iennaco,Idrovo,Idriss,Idiart,Ickert,Icardo,Ibric,Ibdah,Ibbotson,Ibasitas,Iarussi,Iara,Iannalo,Iamiceli,Iacuzio,Iacobucci,Iacobelli,Hysquierdo,Hyske,Hydzik,Hyberger,Hyatte,Huysman,Huyna,Hutyra,Huttman,Huttar,Huter,Husul,Hustedt,Hussy,Hussong,Hussian,Huski,Hushon,Husein,Husaini,Hurtubise,Hurta,Hurni,Hurme,Hupy,Huppenbauer,Hunze,Hunson,Huner,Hundertmark,Hunderlach,Humston,Hummert,Huminski,Humerick,Humbard,Hulzing,Hulshoff,Hulmes,Hukle,Hujer,Huitink,Huirgs,Hugus,Huguet,Hugghis,Huffstutter,Huerto,Huertes,Huenergardt,Huemmer,Huelle,Huehn,Huebsch,Hudok,Hudnut,Hudlow,Hudlin,Hudes,Huddy,Huckabone,Huckabaa,Hubsch,Hubl,Hubertz,Htwe,Hsy,Hrycko,Hrna,Hric,Hribal,Hrcka,Hrbacek,Hranchak,Hradecky,Hoysock,Hoyne,Hoylton,Hoyal,Hoxsie,Howlingwolf,Howett,Howarter,Hovnanian,Hovard,Hovantzi,Hovanes,Houzah,Houtkooper,Housner,Housemate,Hourihan,Houltberg,Houghtelling,Houey,Houchard,Houben,Hotter,Hotten,Hottell,Hotek,Hosoi,Hosner,Hosle,Hoskyns,Hoskey,Hoshino,Hosfield,Hortein,Horseford,Horse,Horridge,Hornshaw,Horns,Hornlein,Hornig,Horneff,Hormuth,Horimoto,Horesco,Horenstein,Horelick,Hore,Horbert,Horabik,Hoppenrath,Hoppa,Hopfauf,Hoosock,Hool,Hoogheem,Hoogendoorn,Hoo,Honus,Honold,Honokaupu,Honigsberg,Hongisto,Hongeva,Hones,Honegger,Hondros,Hondel,Honchul,Honch,Homza,Homsey,Homrighaus,Hommer,Homiak,Homby,Homans,Holznecht,Holzmiller,Holzhueter,Holzboog,Holtmeier,Holtmann,Holthouse,Holthoff,Holtham,Holtgrefe,Holstad,Holshovser,Holquist,Holmers,Hollyday,Hollo,Hollner,Hollinghurst,Holleyman,Hollett,Hollerud,Hollering,Hollembaek,Hollarn,Hollamon,Hollack,Holihan,Holibaugh,Holgersen,Holdy,Holdgrafer,Holdcraft,Holdbrook,Holcroft,Holch,Hokula,Hokett,Hojeij,Hojczyk,Hoivik,Hoiseth,Hoinacki,Hohnson,Hohney,Hohmeier,Hohm,Hohlstein,Hogstrum,Hogon,Hoglan,Hogenmiller,Hogains,Hoga,Hofstra,Hofstadter,Hofhine,Hoffpavir,Hoeser,Hoerig,Hoerger,Hoelzel,Hoelter,Hoeller,Hoek,Hoehl,Hoefflin,Hoeffer,Hodosy,Hodnicki,Hodermarsky,Hodd,Hockley,Hochstine,Hochfelder,Hobstetter,Hoblit,Hobin,Hoberek,Hobb,Hnot,Hlywa,Hlastala,Hjermstad,Hizkiya,Hitzfelder,Hiteman,Hitchko,Hitchingham,Hissom,Hismith,Hiske,Hirte,Hirschmann,Hirose,Hirezi,Hipsley,Hippley,Hipol,Hintergardt,Hinokawa,Hinely,Hindsman,Hindmarsh,Hinderaker,Hindall,Hinckson,Hinajosa,Himmelsbach,Himmelright,Hilyar,Hilvers,Hilu,Hiltunen,Hiltebeitel,Hilsgen,Hilovsky,Hilo,Hilmer,Hillseth,Hillered,Hilleman,Hillbrant,Hillabush,Hilla,Hilkert,Hilk,Hildman,Hilbner,Hilbig,Hilb,Hila,Hija,Higy,Hightshoe,Higashida,Hiens,Hielscher,Hidde,Hidaka,Hickley,Hickingbotham,Hickie,Hiciano,Hibble,Hibbits,Heziak,Heynen,Heykoop,Heydenreich,Heybrock,Hevrin,Hevessy,Heugel,Heuangvilay,Hettes,Hettenhausen,Hetling,Hetjonk,Hethcox,Hethcote,Hetchman,Hetcher,Hesterly,Hessman,Hesselrode,Hesselman,Hesselbein,Hesselbach,Herzbrun,Heryford,Herwehe,Hervol,Hertle,Herta,Herskovic,Hershnowitz,Hershfield,Herschaft,Hersberger,Herrud,Herrnandez,Herrlich,Herritt,Herrion,Herrand,Herran,Herout,Heroth,Heronemus,Hero,Herny,Hermus,Herline,Herley,Hergenroeder,Hergenreter,Herena,Herem,Herek,Hercman,Heral,Hequembourg,Heppert,Hepperly,Heppel,Heppding,Henzler,Hentrich,Henter,Hensle,Hensdill,Henschke,Hennighausen,Hennard,Henkin,Henges,Henedia,Hendson,Hendsbee,Hendrics,Hendrickx,Hencken,Henchel,Hencheck,Hemsworth,Hemry,Hemperley,Hemmig,Hemmeter,Hemmert,Hemmelgarn,Hemmeke,Hemley,Hemeyer,Hemerly,Hembre,Hemans,Hemanes,Helwick,Helvik,Helphinstine,Helphenstine,Helowicz,Helmert,Helmen,Helmbright,Helliwell,Helley,Hellerman,Hellenbrand,Helferty,Helfert,Hekman,Heitmuller,Heitbrink,Heisse,Heisner,Heir,Heinzle,Heinzerling,Heino,Heinig,Heindl,Heimerl,Heimbuch,Heilbrun,Heilbron,Heidtke,Heidmann,Heglund,Heggins,Heggestad,Hegener,Hegdahl,Hefter,Heffernen,Heery,Heebsh,Hedrix,Hedler,Hedeiros,Hedegaard,Heddleson,Heddins,Hect,Heckle,Heckers,Hebsch,Hebrard,Heberer,Hebblethwaite,Heaviland,Heartley,Hearston,Heang,Hean,Heam,Heagany,Headlon,Heading,Hazouri,Hazinski,Hazekamp,Hayword,Haysbert,Hayn,Hayball,Hawkings,Havier,Havermann,Havekost,Hauswald,Haustein,Hausteen,Hauslein,Hausher,Haurin,Hauptly,Haulbrook,Haukaas,Haugaard,Hauffe,Hauben,Hatzell,Hatto,Hattenbach,Hatridge,Hatlee,Hathcox,Hatchette,Hatcherson,Hatake,Hassig,Hasselvander,Hasselkus,Haslinger,Haskamp,Hashbarger,Hasha,Hasfjord,Hasencamp,Haseloff,Haschke,Hasbni,Hasbell,Hasak,Harwin,Harvley,Harvilchuck,Harvick,Harutunian,Hartzo,Hartzheim,Hartjen,Hartgraves,Hartgrave,Hartgerink,Hartenstein,Harsy,Harrisow,Harrigton,Harrellson,Harralson,Harrald,Harradine,Harraden,Haroun,Harnly,Harnes,Harnar,Harnan,Harnack,Harlston,Harlor,Harleston,Harkenreader,Harkcom,Harjochee,Hargest,Harges,Harfert,Harens,Hardung,Hardney,Hardinson,Hardigan,Harby,Harbus,Harbough,Harbottle,Harbold,Harary,Haramoto,Harader,Harabedian,Har,Happney,Happe,Haper,Hape,Hanville,Hanusey,Hantzarides,Hantula,Hanstine,Hansteen,Hansson,Hansrote,Hansil,Hanoharo,Hanock,Hannula,Hanno,Hannem,Hanneken,Hannegan,Hanmore,Hanisko,Hanisco,Hanify,Hanhan,Hanegan,Handt,Handshaw,Handschumaker,Handren,Handlin,Handing,Handeland,Hanagan,Hanagami,Hanafin,Hanafan,Hanacek,Hamway,Hampon,Hamper,Hamparian,Hamor,Hamontree,Hamolik,Hamnon,Hamn,Hammet,Hammerstein,Hammerstad,Hammerlund,Hammed,Hammang,Hameen,Hamborsky,Hamb,Hamalak,Hamai,Halwood,Halston,Halpainy,Halon,Halmstead,Halmick,Hallstead,Hallowich,Hallio,Hallie,Hallerman,Halleen,Hallczuk,Hallan,Halgren,Halechko,Halcom,Halbritter,Halaliky,Hal,Hajdukiewicz,Hait,Haislett,Hairster,Hainsey,Hainds,Hailes,Hagwell,Hagon,Haghighi,Haggstrom,Haggis,Haggen,Hageny,Hagelgans,Hagarty,Hafenbrack,Haessler,Haessig,Haerr,Haener,Haen,Haeckel,Hadson,Hadland,Hadian,Haddaway,Hackmeyer,Hackethal,Hackerd,Hackenmiller,Hackenbery,Hacke,Hackborn,Hachette,Habif,Habermann,Haberern,Habbs,Haakinson,Haagensen,Gzym,Gyurko,Gyllenband,Gyaki,Gwynes,Gwenn,Guzmdn,Guziczek,Guz,Guyott,Guyot,Guyet,Guttenberg,Gutschow,Gutreuter,Gutrerrez,Gutieres,Gutiennez,Guthorn,Guthary,Guterriez,Gutenson,Gussin,Gushue,Gusa,Gurvine,Gurtin,Gurrad,Gurne,Guridi,Gureczny,Guralnick,Gunzenhauser,Gunthrop,Gunkelman,Gunagan,Gun,Gumphrey,Gummersall,Gumbert,Gulnick,Gullung,Gullage,Gulini,Gulikers,Guley,Guldemond,Gulde,Gulbraa,Gulati,Guittennez,Guitreau,Guith,Guitar,Guirgis,Guinle,Guiltner,Guilstorf,Guillote,Guillan,Guilianelli,Guilbe,Guiffre,Guiel,Guidaboni,Guiao,Guialdo,Guevana,Guesman,Guerrouxo,Guerinot,Gueretta,Guenison,Guenin,Guempel,Guemmer,Guelpa,Guelff,Guelespe,Guedesse,Gudroe,Gudat,Guckes,Gucciardi,Gubser,Gubitosi,Gubernath,Gubbins,Guarracino,Guarin,Guariglio,Guandique,Guaman,Gualdoni,Guadalajara,Grzywinski,Grzywacz,Grzyb,Grzesiak,Grygiel,Gruzinsky,Gruters,Grusenmeyer,Grupa,Gruninger,Grunin,Grundon,Gruhlke,Gruett,Gruesbeck,Gruell,Grueber,Gruda,Grubman,Gruba,Grovier,Grothen,Groszkiewicz,Grossley,Grossklaus,Grosshans,Grosky,Groshek,Grosenick,Groscost,Grosby,Groombridge,Gronvall,Gromley,Grollman,Grohoske,Groesser,Groeber,Grocott,Grobstein,Grix,Grivna,Gritsch,Grit,Gristede,Grissam,Grisostomo,Grisom,Grishan,Grip,Grinner,Grinman,Grines,Grindel,Grimlie,Grimard,Grillette,Griggers,Grigas,Grigalonis,Grigaliunas,Grifin,Griffins,Griffes,Griffel,Grife,Griesmeyer,Griesi,Griem,Grham,Grgurevic,Greyovich,Greydanus,Greviston,Gretzner,Gretz,Gretsch,Greto,Gresl,Gresko,Grengs,Gremler,Greist,Greisser,Greisiger,Greiser,Greiber,Gregoroff,Gregoreski,Gregas,Greenrose,Greenlow,Greenlees,Greenfelder,Greenen,Greenbush,Greeb,Grebs,Grebel,Greaux,Grdina,Gravit,Gravenstein,Gravelin,Grava,Graul,Graughard,Graue,Grat,Grastorf,Grassano,Grasmuck,Grashot,Grasha,Grappo,Graper,Granvil,Granucci,Grantier,Granstaff,Granroth,Granizo,Graniero,Graniela,Granelli,Grandos,Grandmont,Gramza,Graminski,Gramberg,Grahams,Grago,Graen,Graefe,Grae,Gradle,Graciani,Graci,Grabowiecki,Grabauskas,Gounder,Gougeon,Goudge,Gouchie,Gou,Gottula,Gottleber,Gotthardt,Gotowka,Gotlib,Gotimer,Gothier,Gothe,Goswami,Gostowski,Gossin,Gosserand,Gossen,Goshow,Goshi,Gosda,Gosche,Gorychka,Gorri,Gornikiewicz,Gorlich,Gorgo,Gorglione,Goretti,Gorence,Gorelik,Goreczny,Gordis,Gorczynski,Gorans,Gootz,Goosen,Goonez,Goolsbee,Goolia,Goodvin,Goodpastor,Goodgine,Goodger,Gooder,Goodenberger,Goodaker,Goodacre,Gonzolez,Gonzaliz,Gonsalues,Gones,Gone,Gondran,Gonda,Gonazlez,Gomzalez,Gomey,Gome,Gomberg,Golumski,Goluba,Goltry,Goltra,Golpe,Golombecki,Gollwitzer,Gollogly,Gollin,Golkin,Golk,Goldware,Goldrup,Goldrich,Goldhammer,Goldhahn,Goldfischer,Goldfield,Goldeman,Goldak,Golberg,Golba,Golanski,Golabek,Goick,Gogocha,Goglia,Gogins,Goetzke,Goettman,Goettig,Goetjen,Goeman,Goeldner,Goeken,Goeden,Godyn,Godwyn,Godown,Godfray,Goderich,Gode,Godde,Goda,Gockerell,Gochnauer,Gochie,Gobrecht,Gobeyn,Gobern,Gobea,Gobbo,Gobbi,Gnagey,Glugla,Gluckman,Gluc,Glowski,Glowka,Glowinski,Glow,Glossner,Gloff,Gloe,Glodich,Gliwski,Gliues,Glise,Glinkerman,Glimp,Glicher,Glenny,Glembocki,Gleiss,Gleichweit,Gleghorn,Glaviano,Glauser,Glaue,Glaubke,Glauberman,Glathar,Glasow,Glashen,Glasglow,Glarson,Glapion,Glanden,Glader,Gladen,Glacken,Gjorven,Gjokaj,Gjesdal,Gjelten,Givliani,Gitzlaff,Gittere,Gitlewski,Gitchell,Gissler,Gisriel,Gislason,Girolami,Girmazion,Girellini,Girauard,Girardeau,Girad,Giove,Gioriano,Gionson,Gioacchini,Ginnetti,Ginnery,Ginanni,Gillom,Gillmer,Gillerist,Gillentine,Gilhooley,Gilfoy,Gilespie,Gildroy,Gildore,Gilcoine,Gilarski,Gihring,Giggie,Giessinger,Gierling,Gielstra,Giehl,Giegerich,Giedlin,Gieber,Giebel,Gidwani,Gicker,Gibes,Gibbings,Gibbard,Gianopulos,Gianola,Giannell,Giandelone,Giancaspro,Giancarlo,Gian,Giamichael,Giagni,Giacomazzi,Giacoletti,Giachino,Ghramm,Ghosten,Ghiringhelli,Ghiorso,Ghil,Ghia,Gheza,Ghekiere,Gheewala,Ghazvini,Ghazi,Ghazal,Ghaor,Ghane,Ghanayem,Ghamdi,Gfroerer,Geyette,Gewinner,Gewant,Gevorkian,Gevedon,Geuder,Getting,Gettenberg,Getschman,Getachew,Gestes,Gesselli,Geryol,Gerych,Gerty,Gerton,Gertken,Gerster,Gersch,Gerpheide,Geronime,Gerondale,Gerock,Germinaro,Germershausen,Germer,Gerlock,Gerla,Gerking,Gerguson,Geres,Gerbs,Gerbi,Gerathy,Gerardot,Georgiana,Georgales,Geohagan,Geoghan,Geoffrey,Genualdi,Gentis,Gennusa,Gennaria,Gennarelli,Genin,Genga,Geng,Geneseo,Generous,Generoso,Genera,Genberg,Gemmel,Gembe,Gembarowski,Gelzer,Gelo,Gellis,Gellespie,Gell,Gelineau,Gelger,Geldrich,Gelbach,Geister,Geissel,Geisen,Geiman,Geils,Gehrking,Gehri,Gehrett,Gehred,Gefroh,Geerken,Geelan,Gedris,Gedo,Gechas,Gecan,Gebrayel,Gebers,Geasley,Geanopulos,Gdula,Gbur,Gazzillo,Gazza,Gazo,Gaznes,Gazdecki,Gayoso,Gayo,Gaymes,Gawlak,Gavula,Gavles,Gaviria,Gavinski,Gavigan,Gaves,Gavell,Gavalis,Gautsch,Gauron,Gauntner,Gaulzetti,Gattie,Gatski,Gatch,Gata,Gastelun,Gastellum,Gastel,Gasson,Gassler,Gasse,Gasquet,Gaspari,Gasienica,Gaseoma,Gasch,Garzone,Garverick,Garve,Garthee,Garrod,Garriss,Garrish,Garraghty,Garnet,Garness,Garnder,Garlovsky,Gariti,Garich,Garibaldo,Garib,Gargani,Garfias,Garff,Garf,Gares,Garen,Gardy,Garder,Garcelon,Garced,Garavelli,Garala,Garacci,Ganze,Gantewood,Ganska,Gannoe,Ganji,Ganja,Ganibe,Ganiban,Ganguli,Gangluff,Gangadyal,Gane,Gandhy,Gandarillia,Gancio,Gana,Gamrath,Gamewell,Gamela,Gamberini,Gamberg,Gambell,Gambaiani,Galvano,Galva,Galustian,Galston,Galstian,Galson,Gals,Galon,Galofaro,Gallipo,Gallery,Galleno,Gallegher,Gallante,Gallagos,Gallaga,Galjour,Galinoo,Galinol,Galin,Galietti,Galhardo,Galfayan,Galetti,Galetta,Galecki,Galauiz,Galaska,Galashaw,Galarita,Galanga,Galacio,Gailun,Gailis,Gaibler,Gagon,Gago,Gagliardotto,Gaetke,Gaestel,Gaekle,Gadue,Gades,Gacusan,Gacad,Gabrel,Gabouer,Gabisi,Gabino,Gabbett,Gabbay,Gab,Gaarsland,Fyles,Fventes,Fusselman,Fusik,Fusi,Fusha,Fusca,Furuyama,Furubotten,Furton,Furrh,Furne,Furna,Furlotte,Furler,Furkin,Furfey,Fure,Furch,Furay,Fupocyupanqui,Funderbunk,Fundenberger,Fulwiler,Fulsom,Fullwiler,Fulliton,Fulling,Fuleki,Fulda,Fukuroku,Fukada,Fuhri,Fuglsang,Fugle,Fugah,Fuesting,Fuents,Fudacz,Fucile,Fuchser,Frydman,Fryday,Fruusto,Frutoz,Frullate,Fruchey,Frossard,Fross,Froschheiser,Froozy,Fronduti,Frondorf,Fron,Fromong,Frometa,Froiland,Frohwein,Frohock,Froeliger,Frodsham,Fritzpatrick,Frist,Frisino,Frisella,Frischkorn,Fringuello,Frings,Friling,Frikken,Frietsch,Friest,Friedstrom,Friedhaber,Friedenberg,Friedeck,Fridal,Freytas,Freydel,Freudiger,Freshley,Frere,Frenner,Freniere,Fremon,Fremming,Freme,Freligh,Freistuhler,Freiser,Freil,Freifeld,Freidkin,Freidet,Frehse,Freguson,Freerksen,Freelon,Freeley,Freehoffer,Freedland,Fredrikson,Fredric,Fredline,Fredicks,Freddrick,Frawkin,Frauenkron,Frati,Franzeo,Frantzich,Frankina,Frankford,Frankenreiter,Frankenfeld,Franeo,Frandeen,Franculli,Francolino,Francoise,Francisque,Franciosa,Francios,Francione,Franceski,Franceschina,Fram,Fraine,Fragassi,Fracier,Fraccola,Frabotta,Frabizio,Fouyer,Foux,Foutain,Fourre,Fouracre,Found,Foules,Foucha,Fosso,Fosser,Fossa,Fosburgh,Forwood,Fortado,Forston,Forsthoffer,Forschner,Forsch,Fornkohl,Fornerod,Formhals,Formey,Formento,Formato,Forlani,Forgy,Forgach,Fordon,Forcino,Forcell,Forcade,Forbish,Forber,Fontneau,Fontelroy,Fonteboa,Fontanini,Fonsecn,Fondell,Fon,Follie,Foller,Folkins,Folkens,Folgar,Foks,Fogus,Fogo,Foerschler,Foell,Foecke,Foderaro,Foddrill,Focks,Flum,Flugence,Fluette,Fluetsch,Flueck,Flournay,Flotow,Flota,Florkowski,Florestal,Florance,Floore,Floerchinger,Flodman,Floch,Flitton,Flitt,Flister,Flinton,Flinspach,Flierl,Flever,Fleurissaint,Fleurantin,Flether,Flennoy,Fleitman,Flegler,Fleak,Flautt,Flaum,Flasher,Flaminio,Fixari,Fiumefreddo,Fitzmier,Fitzgerlad,Fitzen,Fittje,Fitser,Fitchette,Fisichella,Fisger,Fischbein,Fischang,Fiscal,Fisanick,Firoozbakht,Firlik,Firkey,Fiorenzi,Fiora,Finucan,Finto,Finona,Finocan,Finnley,Finnin,Finnila,Finni,Finnel,Finne,Finland,Finkenbiner,Finey,Finders,Filzen,Filyan,Filteau,Filonuk,Fillo,Fillerup,Filkey,Filippides,Filippello,Filburn,Filbrardt,Filbey,Filary,Filarecki,Filak,Fijalkowski,Figurelli,Figone,Figlioli,Figlar,Figary,Figarsky,Fiermonte,Fierge,Fiely,Fieldstadt,Fiedtkou,Fiedorowicz,Fiebich,Fie,Fidsky,Fido,Ficenec,Feyler,Fewless,Feulner,Feuerberg,Fetui,Fetrow,Fesus,Fesenbek,Ferugson,Ferster,Ferrise,Ferratt,Ferratella,Ferrarotti,Ferrarini,Ferrao,Ferrandino,Ferrall,Ferracioli,Feron,Ferndez,Fernandz,Fermo,Ferm,Ferlic,Ferjerang,Feris,Ferentz,Fereday,Ferdin,Ferdico,Ferderer,Ferard,Feramisco,Fenti,Fensel,Fenoglio,Fenoff,Feno,Fenniwald,Fenger,Fenceroy,Felzien,Felson,Felsher,Fellon,Felli,Fellhauer,Fellenbaum,Felleman,Fellars,Felks,Felipa,Felila,Felico,Felicione,Felger,Feldtman,Feldner,Feldker,Feldhake,Felciano,Felcher,Fekety,Feindt,Feinblatt,Feilbach,Feikles,Feigh,Feichtner,Fehribach,Fehnel,Fehn,Fegurgur,Fego,Fefer,Feezor,Feery,Feerst,Feeling,Feekes,Feduniewicz,Feduccia,Fedorka,Fedoriw,Fedorczyk,Fedel,Feddes,Fedderly,Fechtel,Fecat,Feazelle,Feast,Fearheller,Fearen,Feamster,Fealy,Fazzinga,Fawell,Favilla,Favieri,Favaron,Favaro,Faustman,Faurot,Faur,Faulstick,Faulstich,Faulkes,Faulkenbury,Faulisi,Faubus,Fat,Faster,Fash,Fasenmyer,Fasci,Fasbender,Faruolo,Farrin,Farria,Farrauto,Farmsworth,Farmar,Farm,Farlee,Fariello,Farid,Farha,Fardo,Faraco,Fantz,Fanner,Famy,Famiano,Fam,Falu,Faltz,Falto,Falson,Fallie,Fallick,Falla,Falknor,Falkenthal,Falis,Falha,Falge,Falconeri,Falcione,Falchi,Falb,Falasco,Falah,Falack,Falacco,Faix,Faisca,Fairy,Fairly,Faigle,Faichtinger,Fahrenwald,Fahrenbruck,Fahner,Fahlstedt,Fagnoni,Faglie,Fagala,Faehnle,Fadri,Fadei,Facenda,Fabus,Fabroquez,Fabello,Fabeck,Fabbozzi,Ezernack,Ezer,Ezechu,Ezdebski,Eyubeh,Eyermann,Extine,Expose,Ewelike,Evora,Eviston,Evertz,Eversmann,Everleth,Evering,Eveline,Eveler,Evanski,Evanosky,Evanoski,Evanchyk,Evanchalk,Euton,Euser,Eurton,Europe,Ettl,Ettison,Etters,Etoll,Ethel,Etchinson,Esty,Esteybar,Estevane,Esterson,Esterling,Estergard,Estela,Estaban,Esshaki,Essepian,Esselman,Essaid,Essaff,Esquiuel,Esquerre,Esquea,Esposita,Espenscheid,Esparaza,Esoimeme,Esnard,Eskuchen,Eskelsen,Eskeets,Eskaran,Eskaf,Eshlerman,Esenwein,Escorza,Escoe,Escobeo,Eschenbacher,Eschenbach,Eschborn,Escarrega,Escalet,Esbensen,Esannason,Ervine,Ervay,Ertelt,Erpenbach,Ero,Ernstrom,Ernspiker,Ernandez,Ermogemous,Ermita,Erm,Erlwein,Erlanson,Erixon,Erice,Erfert,Ereth,Erdmun,Erdelt,Erchul,Ercek,Erbentraut,Erard,Eracleo,Equiluz,Eppert,Epperheimer,Eppenger,Epifano,Eperson,Enzenauer,Entzi,Entrup,Entel,Enote,Enocencio,Enny,Ennist,Ennels,Ennaco,Enkerud,Enick,Engwer,Engleby,Enget,Engessor,Engerman,Engbretson,Enfort,Ends,Endresen,Endecott,Encalade,Emuka,Emslander,Emshoff,Empleo,Empfield,Emperor,Emo,Emmrich,Emlin,Emigholz,Emfield,Emeru,Emeche,Emdee,Emberlin,Emberley,Emberger,Emayo,Emanus,Emami,Elvert,Elshair,Elsensohn,Elsbury,Elsa,Elroy,Elquist,Elofson,Elmaghrabi,Ellworths,Ellifritt,Ellies,Elliem,Ellerkamp,Ellerbeck,Ellenbee,Ellena,Ellebrecht,Elldrege,Ellanson,Elko,Elkayam,Eliszewski,Eliseo,Elis,Elion,Elhosni,Elhassan,Elhaj,Elhaddad,Elgen,Elgas,Elgar,Elg,Elftman,Elfering,Elewa,Eleveld,Elefritz,Elbogen,Elbertson,Elberson,Elbahtity,Elahi,Ekstrum,Eklov,Ekis,Ejide,Eissinger,Eirls,Einfeldt,Eilts,Eilders,Eilbert,Eilbeck,Eikmeier,Eifler,Eiesland,Eichstadt,Eichenmiller,Eichenauer,Eichelmann,Ehr,Ehorn,Ehnis,Ehmen,Ehleiter,Ehinger,Ehiginator,Ehigiator,Egvirre,Egure,Eguizabal,Ego,Egidio,Eggenberg,Eggart,Eget,Egertson,Egbe,Efrati,Eflin,Eerkes,Ee,Edwads,Edster,Edralin,Edmerson,Edmeier,Edleston,Edlao,Edith,Edis,Edeline,Edeker,Economus,Economides,Ecoffey,Eckrote,Eckmeyer,Eckle,Ecklar,Eckis,Echemendia,Echavez,Echaure,Ebrani,Ebo,Ebilane,Ebesugawa,Eberting,Ebersol,Eberline,Eberl,Ebenstein,Eben,Ebbesen,Ebach,Easom,Easlick,Easker,Easey,Easdon,Earman,Earll,Earlgy,Earenfight,Earehart,Ealley,Ealick,Eagy,Eafford,Dziurawiec,Dzierzanowski,Dziegielewski,Dziduch,Dziadek,Dzama,Dyser,Dys,Dyreson,Dymke,Dyen,Dwyar,Dwornik,Dwellingham,Duxbury,Duwhite,Duverney,Duvel,Dutschmann,Dutel,Dute,Dusak,Durun,Dursch,Durrwachter,Durousseau,Durol,Durig,Durett,Duresky,Durelli,Duree,Dural,Duraku,Dupouy,Duplin,Duplesis,Duplaga,Dupaty,Duonola,Dunzelman,Dunten,Dunt,Dunster,Dunnahoo,Dunmead,Dunks,Dunkentell,Dunemn,Duncker,Dunckel,Dunahoo,Dummitt,Dumez,Dumag,Dulberg,Dulatre,Dukhovny,Dukeshire,Dukeshier,Duitscher,Duitch,Duh,Dugmore,Dughi,Duffus,Duffany,Dufer,Duesenberg,Duerkson,Duerkop,Duenke,Duel,Dudleson,Dudik,Duderstadt,Dudack,Duchow,Duchesney,Duchatellier,Ducceschi,Ducayne,Ducay,Ducatelli,Dubonnet,Duberstein,Dubej,Dubeck,Dubeau,Dubbin,Duban,Duball,Duartes,Dsaachs,Dryman,Drybread,Drumwright,Drumheiser,Drumgole,Drullard,Drue,Drude,Druckhammer,Dru,Drought,Drossos,Drossman,Droski,Drong,Drones,Dronen,Droegmiller,Drock,Drisdelle,Drinkall,Drimmer,Driggins,Driesel,Driere,Drewski,Dreps,Dreka,Dreith,Dregrich,Dreggs,Drawy,Drawec,Dravland,Drape,Dramis,Drainer,Dragun,Dragt,Dragotta,Dragaj,Drafton,Drafall,Drader,Draa,Dozois,Dozar,Doyan,Doxon,Dowsett,Dovenmuehler,Douyon,Douvier,Douvia,Douthart,Doussan,Dourado,Doulani,Douillet,Dougharity,Dougall,Douet,Dou,Dotto,Dottery,Dotstry,Doto,Dotie,Doswell,Doskocil,Doseck,Dorweiler,Dorvillier,Dorvee,Dortilla,Dorsainvil,Dorrian,Dorpinghaus,Dorph,Dorosan,Dornseif,Dornhelm,Dornellas,Dorne,Dornbos,Dormanen,Dormane,Doriean,Dorer,Dorcent,Dorat,Dopf,Dootson,Doornbos,Dooney,Donten,Dontas,Donota,Donohve,Donning,Donnellon,Donne,Donmore,Donkor,Donkervoet,Donhoe,Dongo,Donelon,Donchatz,Donawa,Donar,Domnick,Domkowski,Domio,Dominis,Dominiquez,Dominicus,Dominico,Domingus,Domianus,Domas,Dolven,Dolliver,Doljac,Doliveira,Dolhon,Dolgas,Dolfay,Dolcetto,Dokuchitz,Doino,Doiel,Doffing,Doerflinger,Doepner,Doelling,Dodich,Doderer,Dockray,Dockett,Docker,Docimo,Dobre,Dobrasz,Dobmeier,Dobesh,Dobberfuhl,Dobb,Dmitriev,Dlobik,Dlabaj,Djuric,Dizadare,Divento,Divan,Diulio,Ditti,Dittbrenner,Ditta,Ditolla,Ditchfield,Distilo,Distance,Disponette,Dispirito,Dishinger,Discon,Disarufino,Disabato,Diruzzo,Dirose,Dirollo,Dirado,Dippery,Dionisopoulos,Diones,Dinunzio,Dinucci,Dinovo,Dinovi,Dinola,Dinho,Dings,Dinglasan,Dingel,Dinco,Dimperio,Dimoulakis,Dimopoulos,Dimmack,Dimling,Dimitriou,Dimes,Dilthey,Dilox,Dillworth,Dillmore,Dilligard,Dilleshaw,Dilgard,Dilda,Dilcher,Dilchand,Dikkers,Diket,Dikens,Digrazia,Digness,Digiorgi,Digiambattist,Digesare,Difiora,Diffendal,Diewold,Dietsche,Diestel,Diesen,Dien,Diemoz,Dielman,Diegidio,Diedricks,Diebol,Didlake,Didamo,Dickun,Dickstein,Dickirson,Dickins,Dicioccio,Diciano,Dichristopher,Dicaro,Dicara,Dibrino,Dibenedict,Diamico,Diak,Diachenko,Dhosane,Dezell,Dezayas,Deyette,Deyarmond,Deyarmin,Dewyer,Dewulf,Dewit,Dewinne,Dewaratanawan,Devreese,Devitto,Devincenzi,Devick,Devey,Devenecia,Devel,Deuschle,Deuschel,Deuman,Deuermeyer,Detz,Deturenne,Dettra,Dettore,Dettmering,Dettmann,Detterich,Detorres,Detlefs,Detjen,Detillier,Dethomasis,Detering,Detar,Desutter,Destime,Destephano,Desrocher,Desquare,Desporte,Desparrois,Desort,Desormo,Desorbo,Desolier,Desmarias,Desloge,Deslaurier,Desjardiws,Desiyatnikov,Desisles,Desilvo,Desiato,Deshazior,Desforges,Deserres,Deschomp,Deschino,Deschambeault,Desautelle,Desantigo,Desan,Deruso,Derubeis,Derriso,Derricott,Derrer,Deroos,Deroko,Deroin,Deroest,Derobles,Dernier,Dermo,Derkach,Derizzio,Deritis,Derion,Deriggi,Dergurahian,Dereu,Derer,Derenzis,Derenthal,Derensis,Derendal,Derenberger,Deremiah,Deraveniere,Deramo,Deralph,Depsky,Deprizio,Deprince,Deprez,Depratt,Depottey,Depippo,Depinho,Depietro,Depetris,Deperte,Depena,Depaulis,Depasse,Depace,Deonarian,Deodato,Denski,Densieski,Denoyelles,Denofrio,Denni,Dennert,Denna,Deniken,Denier,Denice,Denhartog,Dench,Dence,Denburger,Denafo,Demyers,Demulling,Demuizon,Demosthenes,Demoney,Demonett,Demmon,Demich,Demian,Demetris,Demetree,Demeris,Demchok,Dembosky,Dembinski,Dember,Demauri,Dematos,Demasters,Demarrais,Demarini,Demarc,Demara,Delvin,Delveechio,Delusia,Deluney,Deluccia,Delre,Delpiano,Delosanglel,Delosangeles,Delon,Delnegro,Dellos,Dellon,Delling,Dellibovi,Dellasciucca,Dellasanta,Dellapina,Dellajacono,Dellagatta,Dellaca,Deliso,Delinois,Delilli,Delilla,Deliberato,Delhomme,Delguercio,Delger,Delgadilo,Delfi,Delfelder,Deley,Delevik,Delettre,Delessio,Deleonardo,Delellis,Delehoy,Delegeane,Deldeo,Delcine,Delbusto,Delbrune,Delbrocco,Delbo,Delasko,Delashaw,Delasancha,Delaremore,Delaplane,Delapenha,Delanoche,Delalla,Delaguila,Delaglio,Dekuyper,Dekort,Dekorne,Deklerk,Dekine,Dejoode,Dejes,Dejarme,Dejager,Deja,Deischer,Deir,Deighton,Deidrick,Deida,Deible,Dehrer,Dehombre,Dehler,Dehghani,Dehan,Dehaemers,Degunya,Deguise,Degrella,Degrazio,Degrandpre,Degori,Degolyer,Deglopper,Deglanville,Degado,Defrates,Defrancis,Defranceschi,Defouw,Defiguero,Defiglio,Defide,Defaria,Deeters,Dedominicis,Dedo,Dedier,Dedek,Deculus,Decroo,Decree,Decourley,Decomo,Declouette,Declet,Declark,Deckelman,Dechart,Dechamplain,Decasanova,Decardo,Decardenas,Decann,Decaneo,Debrita,Debrie,Debraga,Debnar,Debiew,Debes,Debenham,Debello,Debarba,Deback,Dearstyne,Dearco,Deanne,Deanhardt,Deamer,Deaguero,Daylong,Daya,Dawber,Dawahoya,Davydov,Davtyan,Davos,Davirro,Davidek,Davide,Davers,Davensizer,Davel,Davda,Dauzart,Daurizio,Dauila,Daughetee,Dauge,Daufeldt,Daudier,Daubenmire,Daty,Datu,Datte,Dastoli,Daste,Dasso,Daskam,Dasinger,Dasalia,Daryanl,Darvile,Darsi,Darsch,Darrup,Darnel,Darm,Darjean,Dargenio,Darey,Dardashti,Dardagnac,Darbro,Darbeau,Daramola,Daquip,Dapvaala,Danza,Dantoni,Dantes,Danoski,Danns,Dannecker,Danfield,Danella,Danczak,Dancoes,Damphousse,Damoth,Damoro,Dammrich,Dammad,Damis,Damerell,Dambrozio,Dama,Daltorio,Dalponte,Dalomba,Dalmida,Dalmau,Dallen,Dalla,Dalitz,Dalio,Dalhart,Daleus,Dalene,Dalee,Dalbeck,Dalaq,Dair,Daimaru,Daill,Daichendt,Dahood,Dahlstedt,Dahley,Dahler,Dagnone,Dagnon,Dagner,Daggy,Daer,Dae,Dadds,Daddea,Daddabbo,Dad,Dacres,Dachs,Dachelet,Daber,Czyrnik,Czwakiel,Czupryna,Czubia,Czosek,Czernovski,Czerno,Czernik,Czerniak,Czekaj,Czarniecki,Cyler,Cychosz,Cuzzo,Cuva,Cutri,Cutone,Cutia,Cutburth,Cusworth,Custa,Cusmano,Cushway,Cushinberry,Cusher,Cushen,Cushard,Cusatis,Curzi,Curylo,Curriere,Currans,Curra,Curpupoz,Curls,Curleyhair,Curella,Cureau,Curameng,Cupe,Cunningan,Cunnane,Cummisky,Cummer,Cumley,Cumblidge,Culotti,Cullin,Culajay,Cujas,Cuez,Cuddihee,Cudan,Cuchiara,Cuccinello,Cucchiaro,Cuartas,Cuaresma,Cuadro,Csensich,Cruthirds,Cruthers,Crutchev,Crutch,Crummedyo,Crumlish,Cruiz,Cruey,Cruel,Croxford,Croxen,Crowin,Croutch,Croushorn,Crotwell,Crother,Croslen,Crookston,Cronholm,Cronauer,Cromeens,Crogier,Croffie,Crocitto,Critzman,Criton,Critchelow,Cristofaro,Cristello,Cristelli,Crissinger,Crispo,Criqui,Crickenberger,Cressell,Cresencio,Creglow,Creggett,Creenan,Creeley,Credo,Credille,Crease,Crawn,Cravenho,Cravatta,Cration,Crantz,Cragar,Cragan,Cracolici,Cracknell,Craawford,Craan,Cozadd,Coyier,Cowser,Cowns,Cowder,Covotta,Covitt,Covil,Covarruvia,Covarrubio,Covarrubia,Covar,Cova,Coutino,Cousey,Courtoy,Courtad,Couron,Courneya,Courie,Couret,Courchine,Countis,Counceller,Cottillion,Cottengim,Cotroneo,Cotreau,Cotheran,Cotey,Coteat,Cotant,Coswell,Costenive,Costellowo,Costeira,Costanzi,Cossaboon,Cossaboom,Cosimini,Cosier,Cosca,Cosano,Corvelli,Corti,Cortesi,Corsilles,Corsey,Corseri,Corron,Corridoni,Corrett,Correo,Corren,Correau,Corraro,Corporon,Corporal,Corpeno,Corolla,Corolis,Cornes,Cornelson,Cornea,Cornacchio,Cormican,Cormia,Coriz,Coric,Coriaty,Coriano,Corderman,Cordel,Corde,Cordasco,Corburn,Corallo,Coradi,Coponen,Coples,Copier,Copa,Coopey,Coonley,Coomey,Coolbrith,Coolbeth,Coolahan,Cookey,Coogen,Cooey,Cooch,Conze,Conzalez,Contreros,Contreres,Contras,Contraras,Contopoulos,Contofalsky,Contino,Consoli,Consigli,Conoly,Connyer,Conninghan,Connette,Connerty,Connarton,Conlans,Conkrite,Confrey,Confair,Coneys,Conelly,Conejo,Condreay,Condino,Condell,Condelario,Concini,Concilio,Concho,Conces,Concepion,Conceicao,Conable,Compres,Compiseno,Compeau,Compean,Comparoni,Companie,Compagna,Comoletti,Commes,Comment,Comeauy,Colyott,Columbres,Colsch,Colpaert,Colpack,Colorina,Colopy,Colonnese,Colona,Colomy,Colombe,Colomba,Colmer,Colly,Collozo,Collova,Collora,Collmeyer,Collaco,Colian,Colglazier,Colehour,Colebrook,Coldsmith,Colden,Colato,Colasanti,Colasamte,Colarossi,Colander,Colaizzo,Colaiacovo,Coladonato,Colacone,Colabrese,Cokins,Cohoe,Coho,Cohlmia,Cohagan,Cogen,Cofrancesco,Cofran,Codey,Codeluppi,Cocran,Cocozza,Cocoran,Cocomazzi,Cockrin,Cockreham,Cocking,Cochis,Cocherell,Coccoli,Cobio,Cobane,Coatley,Coatie,Coant,Coaker,Coachys,Cmiel,Clozza,Cloughly,Clothey,Closovschi,Closey,Cloman,Cloffi,Cloepfil,Clites,Clinker,Cleverly,Cleve,Clesen,Clery,Clerf,Clemson,Clemo,Clemmon,Clemmo,Clemmey,Cleark,Clayter,Clavey,Clavelle,Clausel,Claud,Claucherty,Claton,Clarson,Clarendon,Clarbour,Clar,Clap,Clanin,Clan,Claman,Clam,Claes,Civitello,Civcci,Civatte,Civale,Ciucci,Cito,Cisneroz,Cislo,Cisewski,Cirioni,Cirilli,Cipullo,Cippina,Cipolone,Cipolloni,Cioni,Cintra,Cinkosky,Cinalli,Cimmiyotti,Cimeno,Cilva,Cills,Ciliento,Cilibrasi,Cilfone,Ciesiolka,Ciersezwski,Cierpke,Cierley,Cieloha,Cicio,Cichosz,Cichonski,Cicconi,Cibulskas,Ciaramitaro,Ciano,Cianciotta,Ciampanella,Cialella,Ciaccia,Chwieroth,Chwalek,Chvilicek,Chuyangher,Churner,Churchville,Chuppa,Chupik,Chukri,Chuh,Chudzinski,Chudzik,Chudej,Chrones,Chroman,Christoffer,Christmau,Christle,Christaldi,Christal,Chrispen,Chriscoe,Chown,Chowen,Chowanec,Chounlapane,Choulnard,Chott,Chopelas,Chomicki,Chomali,Choen,Chodorov,Chmelik,Chludzinski,Chivalette,Chiv,Chiumento,Chittom,Chisnall,Chischilly,Chisari,Chirdon,Chirasello,Chipp,Chiotti,Chionchio,Chioma,Chinweze,Chinskey,Chinnis,Chinni,Chindlund,Chimeno,Chilinskas,Childes,Chikko,Chihak,Chiffriller,Chieves,Chieng,Chiavaroli,Chiara,Chiapetto,Chiaminto,Chhor,Chhon,Chheng,Chhabra,Cheyney,Chey,Chevres,Chetelat,Chet,Chestand,Chessor,Chesmore,Chesick,Chesanek,Cherwinski,Chervin,Cherven,Cherrie,Chernick,Chernay,Cherchio,Cheon,Chenevey,Chenet,Chenauls,Chenaille,Chemin,Chemell,Chegwidden,Cheffer,Chefalo,Chebret,Chebahtah,Cheas,Chaven,Chavayda,Chautin,Chauhdrey,Chauffe,Chaudet,Chatterson,Chatriand,Chaton,Chastant,Chass,Chasnoff,Chars,Charnoski,Charleton,Charle,Charisse,Charif,Charfauros,Chareunsri,Chareunrath,Charbonnel,Chappan,Chaples,Chaplean,Chapko,Chaobal,Chanthaumlsa,Chantha,Chanofsky,Chanel,Chandsawangbh,Chandronnait,Chandrasekhar,Chandrasekara,Chandier,Chanchuan,Chananie,Chanady,Champy,Champany,Chamley,Chamers,Chamble,Chamberlian,Chalow,Chaloner,Chalita,Chalaban,Chajon,Chais,Chaim,Chaille,Chaidy,Chagollan,Chafe,Chadsey,Chaderton,Chabotte,Cezil,Cersey,Cerritelli,Ceronsky,Ceroni,Cernansky,Cerenzia,Cereghino,Cerdan,Cerchia,Cerbantes,Cerao,Ceranski,Centrone,Centorino,Censky,Ceman,Cely,Celuch,Cellupica,Cellio,Celani,Cegla,Cedars,Ceasor,Cearlock,Cazzell,Cazeault,Caza,Cavezon,Cavalli,Cavaleri,Cavaco,Cautillo,Cauthorne,Caulley,Caughran,Cauchon,Catucci,Cattladge,Cattabriga,Catillo,Cathers,Catenaccio,Catena,Catani,Catalli,Catacun,Casumpang,Casuat,Castrovinci,Castronova,Castoral,Castiola,Castin,Castillero,Castillejo,Castera,Castellanoz,Castellaneta,Castelan,Castanio,Castanado,Castagnier,Cassis,Cassion,Cassello,Casseday,Cassase,Cassarubias,Cassard,Cassaday,Caspary,Caspar,Casoria,Casilles,Casile,Casida,Cashing,Casgrove,Caseman,Caselton,Casello,Caselden,Cascia,Casario,Casareno,Casarella,Casamayor,Casaliggi,Casalenda,Casagranda,Casabona,Carza,Caryk,Carvett,Carthew,Carther,Carthens,Cartaya,Cartan,Carsno,Carscallen,Carrubba,Carroca,Carril,Carrigg,Carridine,Carrelli,Carraturo,Carratura,Carras,Carransa,Carrahan,Carpente,Carpenito,Caroway,Carota,Caronna,Caroline,Carnoske,Carnohan,Carnighan,Carnie,Carnahiba,Carmichel,Carmello,Carlsley,Carlington,Carleo,Cariveau,Caristo,Carillion,Carilli,Caridine,Cariaso,Cardoni,Cardish,Cardino,Cardinas,Cardenos,Cardejon,Cardeiro,Carco,Carbal,Caravalho,Caraher,Caradonna,Caracso,Caracciola,Capshaws,Caprice,Capriccioso,Capraro,Cappaert,Caposole,Capitani,Capinpin,Capiga,Capezzuto,Capetl,Capestany,Capels,Capellas,Caparoula,Caparelli,Capalongan,Capaldo,Canu,Cantre,Cantoral,Cantfield,Cantabrana,Canori,Cannuli,Canestro,Canestrini,Canerday,Canellas,Canella,Candon,Cancer,Canatella,Canak,Cana,Campolongo,Campagnone,Campagnini,Campagne,Camon,Cammarn,Caminita,Camidge,Cambronne,Cambric,Cambero,Camaron,Calzone,Calzadilla,Calver,Calvent,Calvelo,Calvaruso,Calvaresi,Calpin,Calonsag,Calonne,Caloca,Calligy,Callez,Calleo,Callaro,Calixtro,Caliguire,Caligari,Calicut,Caler,Calderson,Caldarone,Calchera,Calcagino,Calaycay,Calamarino,Calamari,Calamare,Cakanic,Cajune,Cajucom,Cajero,Cainion,Cainglit,Caiafa,Cagey,Cafourek,Caffarel,Cafarella,Cafagno,Cadoy,Cadmen,Cader,Cademartori,Cackett,Cacibauda,Caci,Cacciola,Cabrar,Cabla,Cabiya,Cabido,Cabeza,Cabellon,Cabeceira,Cabanes,Cabag,Bzhyan,Byther,Byro,Byrley,Byrdsong,Bynd,Bylund,Byant,Bverger,Buzzelle,Buzzanca,Buyes,Buyak,Buvens,Buttino,Buttimer,Buttari,Buttaccio,Buther,Butel,Buszak,Bustinza,Bussom,Busskohl,Bussink,Bussinger,Bussert,Busselberg,Bussani,Busl,Buskohl,Busie,Bushie,Busenius,Buseck,Buscarino,Busacker,Burwick,Burtin,Burriesci,Burreson,Burnum,Burnet,Burneisen,Burnaman,Burlette,Burlando,Burki,Burker,Burkel,Burka,Burigsay,Burhanuddin,Burgen,Burgbacher,Buretta,Buress,Burdsall,Burdis,Burdi,Burdg,Burbano,Bur,Buquo,Buontempo,Buonadonna,Bunzey,Bunyea,Buntain,Bunkers,Bungy,Bungart,Bunetta,Bunes,Bundley,Bundette,Bumm,Bumbray,Bumba,Bumatay,Bulwinkle,Bultron,Bulnes,Bullo,Bullmore,Bullerwell,Bullert,Bullara,Bulland,Bulkin,Bulgarella,Bulacan,Bukrim,Bukowinski,Bujol,Buja,Buike,Buhoveckey,Buhite,Bugtong,Bugler,Bugenhagen,Bugayong,Bugarewicz,Bufton,Buetti,Buess,Buerstatte,Buergel,Buerge,Buer,Buena,Buegler,Bueggens,Buecher,Budzyna,Budz,Budworth,Budesa,Buddle,Budden,Buddemeyer,Buckridge,Buckreis,Buckmiller,Bucke,Buchser,Buchsbaum,Buchs,Buchna,Buchheim,Buchberger,Bucchin,Bucanan,Bubbico,Buanno,Bual,Brzycki,Brzostowski,Bryum,Brynga,Brynestad,Bryar,Bruzewicz,Bruyn,Bruun,Brutlag,Bruson,Bruski,Bruse,Brusco,Bruscino,Brunsting,Brunskill,Brunow,Brunnemer,Brunderman,Brunckhorst,Brunback,Brumbley,Bruh,Brugal,Bruenderman,Bruegman,Brucie,Brozyna,Brozell,Brownsworth,Brownsword,Brownsberger,Browley,Brous,Brounson,Broumley,Brostoff,Brossmann,Brosig,Broschinsky,Broomell,Brookshier,Brooklyn,Bronikowski,Brondyke,Bromberek,Brombach,Brokins,Broking,Brojakowski,Broich,Brogren,Brogglin,Brodhurst,Brodhag,Brodey,Brocklebank,Brockie,Brockell,Brochure,Brochhausen,Broccolo,Brixius,Brittsan,Brits,Britnell,Brisley,Brisbone,Briola,Brintnall,Bringman,Bringas,Bringantino,Brinckerhoff,Briguglio,Briggerman,Brigg,Brigantino,Briehl,Brieger,Bridson,Bridjmohan,Bridgford,Bridget,Bridgens,Bridendolph,Briden,Briddick,Bricknell,Brickles,Brichetto,Briare,Brez,Brevitz,Brevil,Breutzmann,Breuning,Bretl,Brethour,Bretana,Bresolin,Breslawski,Brentnall,Brentano,Brensnan,Brensinger,Brensel,Brenowitz,Brennenstuhl,Brengle,Brendlinger,Brenda,Brend,Brence,Brenaman,Bremseth,Bremme,Breman,Brelje,Breitung,Breitenfeldt,Breitenbucher,Breitenberg,Breines,Breiland,Brehony,Bregon,Brege,Bregantini,Brefka,Breeman,Breehl,Bredy,Bredow,Bredice,Bredahl,Brechbill,Brearley,Brdar,Brazzi,Brazler,Braye,Braver,Bravender,Bravard,Braunsdorf,Braunschweige,Braught,Brauchla,Bratek,Braskey,Brasket,Branske,Branot,Branine,Braniff,Brangan,Branen,Branecki,Brandsrud,Brandman,Brandeland,Brande,Brandauer,Brancazio,Brancanto,Branaugh,Bramucci,Brakstad,Brais,Braim,Braig,Brah,Brage,Bradtke,Bradrick,Bradon,Bradicich,Brackelsberg,Brachman,Brachle,Bracetty,Bracaloni,Bozzell,Bozovich,Bozinovich,Boyenga,Bowring,Bowlet,Bowgren,Bowersmith,Bowels,Bowcutt,Bovio,Boveja,Bovain,Boutchyard,Bousson,Bousqute,Bousley,Bourns,Bourlier,Bourgois,Bourff,Bourek,Bourdeaux,Bourdages,Bourbonnais,Boundy,Bouliouris,Boudrieau,Boudin,Bouchaert,Botwin,Bottomly,Bottolfson,Bottolene,Bottiggi,Botterbusch,Botros,Botras,Botdorf,Bostelman,Bossenbroek,Bossardet,Bosowski,Boschult,Borycz,Borwig,Boruvka,Bortignon,Borsa,Borromeo,Borrolli,Borries,Borreta,Borremans,Borras,Borr,Borozny,Borowiec,Boronat,Bornman,Bormes,Borlin,Borguez,Borgstede,Borgese,Borgert,Borgers,Borgella,Borell,Bordon,Bordi,Bordges,Bordenkircher,Borde,Borbon,Boratko,Boque,Boppre,Boosalis,Boorom,Bookter,Bookmiller,Bookamer,Bonzo,Bonyai,Bonugli,Bonsu,Bonsey,Bonsell,Bonsee,Bonow,Bonno,Bonnlander,Bonnin,Bonnenfant,Bonjorno,Boniol,Bongo,Bonetto,Bonepart,Bondre,Bonaventura,Bonatti,Bonapart,Bonagurio,Bonaguidi,Bomzer,Bompane,Bomilla,Bomia,Bombino,Bomaster,Bollens,Bollbach,Bollaert,Bolins,Bolinder,Bolig,Bolian,Bolfa,Bolevice,Boldwyn,Bolduan,Boldizsar,Bolde,Bokal,Boitel,Boin,Boillot,Boid,Bohonik,Bohnker,Bohney,Bohlsen,Bohlman,Bohlken,Bogut,Bognuda,Bogguess,Bogg,Bofinger,Boero,Boerm,Boeri,Boera,Boelk,Boehnke,Boege,Bodyfelt,Bodon,Bodison,Bodfish,Boderick,Bodenhagen,Bodelson,Bodary,Bocskor,Bockrath,Bocklund,Bockhorn,Bockenstedt,Bockelmann,Bochicchio,Boches,Bochek,Bocchieri,Boccard,Bobsin,Bobrosky,Bobowiec,Boblak,Bobet,Boane,Boamah,Blyze,Blute,Blush,Blunkall,Blundo,Blumkin,Bluming,Blumenschein,Blumenkrantz,Blumenberg,Bluel,Bloye,Blott,Blotsky,Blossomgame,Blosfield,Bloomstrom,Bloomstrand,Bloomsburg,Blonsky,Blonigan,Blomstrand,Bloes,Bloemker,Bloedel,Blochberger,Blizard,Blinebry,Blindt,Blihovde,Blide,Blicker,Bleything,Blevans,Blessett,Blesofsky,Bleiler,Bleichner,Bleicher,Bleeck,Blee,Blazon,Blazing,Blazich,Blaydon,Blaxland,Blauw,Blauman,Blaszczyk,Blasl,Blashak,Blasenhauer,Blanscet,Blanquet,Blanquart,Blannon,Blanko,Blankenbecler,Blanga,Blander,Blakstad,Blailock,Blafield,Blaeser,Blaese,Blady,Bladt,Blacock,Blackwall,Blackmoore,Blackmar,Blackington,Blackbird,Blacio,Blachowski,Bjornstrom,Bjorn,Bjerknes,Bjerken,Bjella,Bizzard,Bivans,Bitzenhofer,Bitar,Bitah,Bissol,Bissel,Bissada,Bispham,Bisikirski,Bischel,Biscari,Bisanz,Birthwright,Birsner,Bironas,Birner,Birnberg,Birkmaier,Birkenhagen,Birely,Birdon,Bionda,Binn,Bininger,Binet,Binderup,Binam,Billus,Billue,Billotti,Billinsley,Billingsby,Billigmeier,Billiet,Billiar,Billesbach,Bilchak,Bilansky,Bijan,Bihler,Bihl,Bigusiak,Bigony,Bignell,Biggard,Biewald,Biever,Bietsch,Biesenthal,Biesecker,Bierut,Bierstedt,Bierschbach,Biersack,Bierod,Bierl,Bierkortte,Biener,Bielser,Bielke,Bielefield,Biedekapp,Bidstrup,Bidell,Biddlecome,Bicknase,Bicking,Bichoupan,Bichoff,Bibiloni,Biastock,Biasotti,Bianchin,Bhullar,Bhaskar,Bhamaraniyama,Bhairo,Bezenek,Beyser,Beyke,Beyea,Beydoun,Beyale,Beyal,Bevevino,Beuttel,Beutnagel,Beuthin,Beuse,Beurskens,Beukema,Beukelman,Beuerle,Beuchler,Betzner,Betzler,Betzig,Bettley,Betry,Betit,Bethurem,Betha,Betenson,Betak,Bestwick,Bestine,Beste,Bessone,Bessinger,Bessellieu,Besong,Besner,Beskom,Beshore,Beser,Besen,Beseke,Besares,Besant,Besanson,Besancon,Berzunza,Berulie,Bertrum,Bertot,Berto,Bertman,Berther,Berth,Bertella,Bertao,Bershadsky,Bersaw,Berrospe,Berrocal,Berray,Bernstock,Bernotas,Bernos,Bernmen,Bernitsky,Bernieri,Berni,Bernheim,Berneri,Bernell,Bernbeck,Bernaudo,Bernau,Bernatchez,Bernarducci,Bernardon,Bernand,Bernacki,Berlingo,Berley,Berlandy,Berlacher,Berkovitch,Berkenbile,Berkbigler,Berishaj,Bering,Bergstedt,Bergsman,Bergouignan,Bergold,Bergmeyer,Bergfalk,Bergenty,Bergenstock,Bergene,Bergamine,Bergami,Berey,Beresik,Berentz,Berenschot,Bereda,Berdux,Berdar,Berdahl,Berczy,Berchielli,Bercher,Berceir,Berbig,Berbereia,Benzee,Benwarc,Benulis,Bentzinger,Bentrem,Benthusen,Benston,Bennings,Bennight,Benneth,Bennard,Bennafield,Benkosky,Benker,Benje,Benisek,Benintendi,Bening,Beninati,Benimadho,Benezra,Beneuento,Bendu,Bending,Bendell,Benckendorf,Benbenek,Benanti,Benamati,Benafield,Benach,Benac,Bembi,Belwood,Belvees,Beltramo,Belstad,Belski,Belschner,Belscher,Belovs,Belousson,Belous,Belony,Belonger,Belluz,Bellmore,Bellitti,Belliston,Bellingtier,Bellinder,Bellhouse,Bellflowers,Bellen,Bellehumeur,Bellefontaine,Bellar,Bellantone,Bellair,Bellace,Belken,Belke,Beliz,Belina,Belieu,Belidor,Beliard,Belhumeur,Belfy,Belfort,Belfi,Belfast,Belezos,Belchior,Belarmino,Belanich,Belancer,Bejil,Bejger,Bejerano,Beja,Beiswenger,Beissel,Beilstein,Beilinson,Beilfuss,Beile,Behner,Behizadeh,Behimer,Beherns,Behanan,Behal,Begun,Beguhl,Begonia,Begolli,Begnoche,Begen,Beese,Beerle,Beemon,Beelar,Beedoo,Beedles,Beedham,Beeckman,Beebout,Bedre,Bedocs,Bednarowicz,Bedlion,Bedillion,Beder,Bedenfield,Bedee,Bedaw,Bedatsky,Bedar,Beckor,Becklin,Beckes,Beckelheimer,Beaureguard,Beauparlant,Beau,Beattle,Beatson,Beath,Beards,Bearded,Beandoin,Beady,Beachman,Beachell,Bayus,Baysden,Bayouth,Bayon,Bayn,Bayani,Baxtor,Bawks,Bawer,Bawcombe,Baves,Bautiste,Baute,Baurer,Baumohl,Baumli,Baumkirchner,Baumiester,Baumgartel,Baumgarn,Baumfalk,Bauchspies,Bauce,Batzri,Battisto,Batter,Battenhouse,Batteiger,Batrich,Batra,Batlle,Batlis,Batliner,Batkin,Batchellor,Bastick,Bastardi,Bassiti,Basore,Basone,Baskow,Basini,Basila,Bashline,Baseley,Bascas,Barvosa,Barvick,Barus,Bartuska,Bartula,Bartosik,Bartosch,Bartoli,Bartmes,Bartlette,Bartkus,Bartkiewicz,Bartholomeu,Barte,Bartch,Barsegyan,Barschdoor,Barscewski,Barsamian,Barryman,Barrowman,Barrois,Barrish,Barriault,Barrete,Barree,Barran,Baronne,Barninger,Barners,Barnebey,Barnak,Barnacle,Barlup,Barlock,Barlau,Barlak,Barken,Barkema,Barjenbruch,Barillo,Barill,Barientos,Baria,Bargstadt,Bargmann,Bargeron,Baresi,Barera,Barends,Bardos,Bardoner,Bardill,Bardell,Barck,Barcik,Barchus,Barchacky,Barberr,Barbaza,Barbarito,Barbare,Barbalich,Barbadillo,Baranga,Barahana,Baradi,Barad,Barach,Barabin,Baquero,Banwarth,Bansmer,Banse,Banowski,Bannett,Bankos,Bangura,Banerji,Banek,Bandyk,Bandura,Bandasak,Bandarra,Bancourt,Banco,Bancks,Banbury,Bamforth,Bambas,Bambace,Balzotti,Balzarine,Balza,Balwinski,Baltruweit,Baltazor,Balsis,Baloy,Balow,Balock,Balo,Balm,Balluch,Ballowe,Ballmann,Ballez,Balletto,Ballesterous,Ballena,Ballejos,Ballar,Ballan,Ballagas,Balitas,Balish,Baligod,Balich,Baldwyn,Balduzzi,Baldos,Balderree,Baldearena,Balda,Balcos,Balasko,Balangatan,Balak,Baladejo,Bakalars,Bajko,Bajek,Baitner,Baison,Bairo,Baiotto,Bainey,Bailleu,Bailado,Baibak,Bahri,Bahde,Bahadue,Bagwill,Bagu,Bagron,Bagnaschi,Baffa,Baff,Baeskens,Baerg,Baenziger,Baena,Baell,Badzinski,Badruddin,Badlam,Badey,Badertscher,Badenoch,Badagliacca,Bacone,Bacman,Backhuus,Bacino,Bachmeyer,Bachinski,Bachas,Bachan,Bacerra,Bacayo,Babson,Bablak,Babinski,Babilon,Babikian,Babicz,Babey,Babbish,Baarts,Baack,Azznara,Azuma,Azor,Azatyan,Azapinto,Azahar,Ayyad,Aytes,Aysien,Aymar,Aylock,Ayhens,Ayele,Aydin,Axtman,Axman,Awyie,Aw,Avona,Avner,Avison,Avenia,Aveles,Avarbuch,Avancena,Autullo,Autovino,Autobee,Auther,Auter,Austino,Austine,Auster,Auslam,Aurrichio,Aun,Auls,Aulder,Aufiero,Audrey,Audibert,Audelhuk,Auckley,Auces,Aubel,Auala,Atzinger,Atzhorn,Attwell,Attles,Attilio,Attia,Atthowe,Atteburg,Atmore,Atma,Atleh,Atkisson,Athy,Atherholt,Athanasiou,Atengco,Atamanczyk,Astillero,Astafan,Assum,Assis,Assing,Assenmacher,Assalone,Assael,Asrari,Aspri,Aspley,Asperheim,Aspell,Asnicar,Asner,Askiew,Askia,Aske,Ask,Ashly,Ashkettle,Ashing,Ashbourne,Ashbach,Ashaf,Asenjo,Aseng,Aseltine,Ascol,Aschbacher,Asamoah,Arzt,Arzabala,Arview,Arvez,Arvanitis,Arva,Arunachalam,Arton,Arties,Artibee,Arthun,Artez,Arters,Arsham,Arseneault,Arroyd,Arroyano,Arrospide,Arrocho,Arrisola,Arrindel,Arrigone,Arrellin,Arredla,Arrand,Arrance,Arquelles,Arosemena,Arollo,Aroca,Arntzen,Arnsberger,Arnitz,Arnerich,Arndell,Arnaudet,Arnao,Arnaldo,Army,Armout,Armold,Armocida,Armlin,Armiso,Armesto,Armen,Armada,Arkontaky,Arking,Aristizabal,Arisa,Arildsen,Arichabala,Ariail,Argulewicz,Argudin,Argro,Argie,Argenziano,Argenti,Arendash,Arendall,Arendale,Arelleano,Arehano,Ards,Ardeneaux,Ardelean,Ardaly,Arciola,Arcieri,Archiopoli,Archdale,Archbell,Arbon,Arbolida,Arbetman,Arbertha,Arau,Arashiro,Araneo,Arancibia,Araldi,Aragones,Aragao,Arabajian,Aquas,Apthorpe,Apshire,Aprill,Aprigliano,Applonie,Appl,Appia,Appana,Aponta,Aplington,Apley,Apker,Apelian,Apadaca,Aono,Ao,Anzideo,Anway,Antronica,Antosh,Antonovich,Antoniak,Antolak,Antila,Antignani,Anthes,Antao,Ansoategui,Ansloan,Anreozzi,Anos,Anolick,Anoe,Annuzzi,Anning,Annarino,Annal,Annable,Annabel,Anitok,Aninion,Animashaun,Anidi,Angocicco,Angland,Angiolelli,Angileri,Angilello,Angier,Angermeier,Angelozzi,Angelou,Angellotti,Angelillo,Angelica,Angalich,Aney,Anewalt,Anetsberger,Anesi,Aneshansley,Anene,Anecelle,Andrzejczyk,Andrzejczak,Andruszkiewic,Andrson,Androde,Andriopulos,Andrino,Andrich,Andreola,Andregg,Andreessen,Andrango,Andradez,Andrades,Andrachak,Andoh,Andina,Anderst,Anderholm,Andere,Andalora,Anciso,Ancic,Ancel,Ancar,Ancalade,Anawaty,Anawalt,Amys,Amstrong,Amspaugh,Amous,Amott,Amoros,Amormino,Amoriello,Amorello,Amoe,Amodt,Ammonds,Ammirata,Ammer,Amlin,Amith,Amistadi,Amill,Amigo,Amerio,American,Amentler,Amemiya,Amela,Amejorado,Amedro,Amedeo,Amburgy,Ambroziak,Ambrister,Amboree,Amboise,Ambert,Ambagis,Amauty,Amat,Amas,Amarian,Amara,Amalong,Alwin,Alwazan,Alvirez,Alvero,Alverado,Alty,Altstatt,Altsisi,Altmark,Altimus,Altamiruno,Alson,Alsing,Alsaqri,Alrod,Alquesta,Alpis,Alpheaus,Alperin,Aloy,Alosta,Aloan,Alnoor,Almsteadt,Almstead,Almos,Almgren,Almarza,Almajhoub,Allyne,Allsbrooks,Allon,Allinger,Alliman,Alliance,Allgire,Allevato,Alleshouse,Alleruzzo,Allerton,Allder,Allcock,Allbert,Allanson,Allabaugh,Alkins,Alkema,Alkana,Aljemal,Alisauskas,Alimo,Alimento,Alie,Alicer,Alias,Alhusseini,Alhameed,Alhambra,Alhaddad,Alfredo,Alfiero,Aleyandrez,Alexidor,Alexandropoul,Alexanders,Alexakis,Alesse,Alesna,Alepin,Alejandrez,Aldworth,Aldrow,Aldrige,Aldonza,Alcine,Alcantas,Albu,Albrough,Albor,Albe,Albarracin,Albarazi,Alatosse,Alarcone,Alanko,Aland,Alamia,Alameida,Alambar,Alai,Akwei,Aksoy,Ako,Akley,Akinrefon,Akimseu,Akhavan,Akhand,Akery,Akawanzie,Akapo,Akamiro,Akal,Ajoku,Ajani,Aiuto,Aiudi,Airth,Aipperspach,Aiporlani,Aipopo,Aiola,Aini,Ailsworth,Aills,Ailiff,Aievoli,Aid,Aiava,Ahyet,Ahrenholz,Ahnell,Ahlo,Ahlfield,Ahlemeyer,Ahimud,Ahia,Ahhee,Ahaus,Ahalt,Agustino,Agustine,Agurs,Agumga,Aguele,Agresto,Agreda,Agpaoa,Agosti,Agoro,Agonoy,Agoff,Aggers,Agemy,Ageboi,Agbisit,Afurong,Afshar,Affronti,Afflick,Affeltranger,Afable,Aeillo,Adule,Adrion,Adolphe,Adolfson,Adner,Adloff,Adling,Adickes,Adib,Adelsperger,Adelmund,Adelizzi,Addeo,Adamsonis,Adamsen,Adamowski,Adamos,Adamec,Adalja,Acosto,Acors,Acorda,Acock,Acly,Ackah,Achin,Aceveda,Acerra,Acerno,Aceituno,Acee,Accala,Acal,Abusufait,Abugn,Abuel,Absalon,Abriola,Abrey,Abrell,Abramovitz,Abramoff,Abramian,Abrahamian,Abousaleh,Aboshihata,Abolafia,Ableman,Abkemeier,Abington,Abina,Abigantus,Abide,Abeta,Abercombie,Abdulmuniem,Abdulaziz,Abdou,Abdelmuti,Abdelaziz,Abdelal,Abbington,Abbatiello,Abajian,Abaja,Aarsvold,Aarhus,Aardema,Aarant,Aanderud,Aalund,Aalderink".split(',') class Learner: def __init__(self): self.db = {} def learn(self, text): replacements1 = {'[^a-zA-Z0-9\.;:\-]': ' ', '\s+': ' ', ', ': ' , ', '\. ': ' . ', ': ': ' : ', '; ': ' ; '} for key, value in replacements1.items(): text = re.sub(key, value, text) items = [item.lower() for item in text.split(' ')] for i in range(len(items) - 1): item = items[i] nextitem = items[i + 1] if item not in self.db: self.db[item] = {} if nextitem not in self.db[item]: self.db[item][nextitem] = 1 else: self.db[item][nextitem] += 1 def save(self, filename): cPickle.dump(self.db, open(filename, 'wb')) def load(self, filename): self.loadd(cPickle.load(open(filename, 'rb'))) def loadd(self, db): self.db = db def generate(self, length=10000, prefix=False): replacements2 = {' ,': ',', ' \.': '.\n', ' :': ':', ' ;': ';', '\n\s+': '\n'} keys = self.db.keys() key = keys[random.randint(0, len(keys) - 1)] words = key words = words.capitalize() regex = re.compile('[a-z]+') for i in range(length): okey = key if not key in self.db: break # should not happen db = self.db[key] s = sum(db.values()) i = random.randint(0, s - 1) for key, value in db.items(): if i < value: break else: i -= value if okey == '.': key1 = key.capitalize() else: key1 = key if prefix and regex.findall(key1) and \ random.random() < 0.01: key1 = '%s' % (prefix, key1, key1) words += ' ' + key1 text = words for key, value in replacements2.items(): text = re.sub(key, value, text) return text + '.\n' def da_du_ma(n=4): return ''.join([['da', 'du', 'ma', 'mo', 'ce', 'co', 'pa', 'po', 'sa', 'so', 'ta', 'to'] [random.randint(0, 11)] for i in range(n)]) def populate(table, n=None, default=True, compute=False, contents={}): """Populate table with n records. if n is None, it does not populate the database but returns a generator if default=True use default values to fields. if compute=False doesn't load values into computed fields. if contents has data, use these values to populate related fields. can be used in two ways: >>> populate(db.tablename, n=100) or >>> for k,row in enumerate(populate(db.tablename)): print row """ generator = populate_generator(table, default=default, compute=compute, contents=contents) if n is not None: for k,record in enumerate(generator): if k>=n: break table.insert(**record) table._db.commit() return generator def populate_generator(table, default=True, compute=False, contents={}): """Populate table with n records. if default=True use default values to fields. if compute=False doesn't load values into computed fields. if contents has data, use these values to populate related fields. """ ell = Learner() #ell.learn(open('20417.txt','r').read()) #ell.save('frequencies.pickle') #ell.load('frequencies.pickle') ell.loadd(IUP) ids = {} while True: record = contents.copy() # load user supplied contents. for fieldname in table.fields: if fieldname in record: continue # if user supplied it, let it be. field = table[fieldname] if not isinstance(field.type, (str, unicode)): continue elif field.type == 'id': continue elif field.type == 'upload': continue elif default and not field.default in (None, ''): record[fieldname] = field.default elif compute and field.compute: continue elif field.type == 'boolean': record[fieldname] = random.random() > 0.5 elif field.type == 'date': record[fieldname] = \ datetime.date(2009, 1, 1) - \ datetime.timedelta(days=random.randint(0, 365)) elif field.type == 'datetime': record[fieldname] = \ datetime.datetime(2009, 1, 1) - \ datetime.timedelta(days=random.randint(0, 365)) elif field.type == 'time': h = random.randint(0, 23) m = 15 * random.randint(0, 3) record[fieldname] = datetime.time(h, m, 0) elif field.type == 'password': record[fieldname] = '' elif field.type == 'integer' and \ hasattr(field.requires, 'options'): options = field.requires.options(zero=False) if len(options) > 0: record[fieldname] = options[ random.randint(0, len(options) - 1)][0] else: record[fieldname] = None elif field.type == 'list:integer' and hasattr(field.requires, 'options'): options = field.requires.options(zero=False) if len(options) > 0: record[fieldname] = [item[0] for item in random.sample( options, random.randint(0, len(options) - 1) / 2)] elif field.type == 'integer': try: record[fieldname] = random.randint( field.requires.minimum, field.requires.maximum - 1) except: if 'day' in fieldname: record[fieldname] = random.randint(1,28) elif 'month' in fieldname: record[fieldname] =random.randint(1,12) elif 'year' in fieldname: record[fieldname] =random.randint(2000,2013) else: record[fieldname] = random.randint(0, 1000) elif field.type == 'double' \ or str(field.type).startswith('decimal'): if hasattr(field.requires, 'minimum'): rand = random.random() if str(field.type).startswith('decimal'): import decimal rand = decimal.Decimal(rand) record[fieldname] = field.requires.minimum + \ rand * (field.requires.maximum - field.requires.minimum) else: record[fieldname] = random.random() * 1000 elif field.type[:10] == 'reference ': tablename = field.type[10:] if not tablename in ids: if table._db._dbname == 'gql': ids[tablename] = [x.id for x in table._db( table._db[field.type[10:]].id > 0).select()] else: ids[tablename] = [x.id for x in table._db( table._db[field.type[10:]].id > 0).select()] n = len(ids[tablename]) if n: record[fieldname] = \ ids[tablename][random.randint(0, n - 1)] else: record[fieldname] = 0 elif field.type[:15] == 'list:reference ': tablename = field.type[15:] if not tablename in ids: if table._db._dbname == 'gql': ids[tablename] = [x.id for x in table._db( table._db[field.type[15:]].id > 0).select()] else: ids[tablename] = [x.id for x in table._db( table._db[field.type[15:]].id > 0).select()] n = len(ids[tablename]) if n: record[fieldname] = [item for item in random.sample( ids[tablename], random.randint(0, n - 1) / 2)] else: record[fieldname] = 0 elif field.type == 'list:string' \ and hasattr(field.requires, 'options'): options = field.requires.options(zero=False) if len(options) > 0: record[fieldname] = [item[0] for item in random.sample( options, random.randint(0, len(options) - 1) / 2)] elif field.type == 'string': if hasattr(field.requires, 'options'): options = field.requires.options(zero=False) record[fieldname] = \ options[random.randint(0, len(options) - 1)][0] elif fieldname.find('url') >= 0: record[fieldname] = 'http://%s.example.com' % \ da_du_ma(4) elif fieldname.find('email') >= 0: record[fieldname] = '%s@example.com' % da_du_ma(4) elif fieldname.find('name')>=0: if fieldname.find('first')>=0: record[fieldname] = random.choice(FIRST_NAMES) elif fieldname.find('last')>=0: record[fieldname] = random.choice(LAST_NAMES) elif fieldname.find('username')>=0: record[fieldname] = random.choice(FIRST_NAMES).lower()+str(random.randint(1000,9999)) else: record[fieldname] = random.choice(FIRST_NAMES)+' '+random.choice(LAST_NAMES) elif fieldname.find('phone')>=0: record[fieldname] = '(%s%s%s) %s%s%s-%s%s%s%s' % ( random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890')) elif fieldname.find('address') >=0: record[fieldname] = '%s %s %s Street' % (random.randint(1000,9000),random.choice(FIRST_NAMES),random.choice(LAST_NAMES)) else: z = ell.generate(10, prefix=False) record[fieldname] = z[:min(60,field.length)].replace('\n', ' ') elif field.type == 'text': if fieldname.find('address')>=0: record[fieldname] = '%s %s %s Street\nChicago, IL\nUSA' % (random.randint(1000,9000),random.choice(FIRST_NAMES),random.choice(LAST_NAMES)) else: record[fieldname] = ell.generate( random.randint(10, 100), prefix=None) yield record if __name__ == '__main__': ell = Learner() ell.loadd(IUP) print ell.generate(1000, prefix=None) web2py-2.12.3.orig/gluon/contrib/gateways/0000775000000000000000000000000012564727262017073 5ustar rootrootweb2py-2.12.3.orig/gluon/contrib/gateways/__init__.py0000664000000000000000000000000212564727262021174 0ustar rootroot web2py-2.12.3.orig/gluon/contrib/gateways/fcgi.py0000664000000000000000000012573512564727262020372 0ustar rootroot# Copyright (c) 2002, 2003, 2005, 2006 Allan Saddi # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # $Id$ """ fcgi - a FastCGI/WSGI gateway. For more information about FastCGI, see . For more information about the Web Server Gateway Interface, see . Example usage: #!/usr/bin/env python from myapplication import app # Assume app is your WSGI application object from fcgi import WSGIServer WSGIServer(app).run() See the documentation for WSGIServer/Server for more information. On most platforms, fcgi will fallback to regular CGI behavior if run in a non-FastCGI context. If you want to force CGI behavior, set the environment variable FCGI_FORCE_CGI to "Y" or "y". """ __author__ = 'Allan Saddi ' __version__ = '$Revision$' import sys import os import signal import struct import cStringIO as StringIO import select import socket import errno import traceback try: import thread import threading thread_available = True except ImportError: import dummy_thread as thread import dummy_threading as threading thread_available = False # Apparently 2.3 doesn't define SHUT_WR? Assume it is 1 in this case. if not hasattr(socket, 'SHUT_WR'): socket.SHUT_WR = 1 __all__ = ['WSGIServer'] # Constants from the spec. FCGI_LISTENSOCK_FILENO = 0 FCGI_HEADER_LEN = 8 FCGI_VERSION_1 = 1 FCGI_BEGIN_REQUEST = 1 FCGI_ABORT_REQUEST = 2 FCGI_END_REQUEST = 3 FCGI_PARAMS = 4 FCGI_STDIN = 5 FCGI_STDOUT = 6 FCGI_STDERR = 7 FCGI_DATA = 8 FCGI_GET_VALUES = 9 FCGI_GET_VALUES_RESULT = 10 FCGI_UNKNOWN_TYPE = 11 FCGI_MAXTYPE = FCGI_UNKNOWN_TYPE FCGI_NULL_REQUEST_ID = 0 FCGI_KEEP_CONN = 1 FCGI_RESPONDER = 1 FCGI_AUTHORIZER = 2 FCGI_FILTER = 3 FCGI_REQUEST_COMPLETE = 0 FCGI_CANT_MPX_CONN = 1 FCGI_OVERLOADED = 2 FCGI_UNKNOWN_ROLE = 3 FCGI_MAX_CONNS = 'FCGI_MAX_CONNS' FCGI_MAX_REQS = 'FCGI_MAX_REQS' FCGI_MPXS_CONNS = 'FCGI_MPXS_CONNS' FCGI_Header = '!BBHHBx' FCGI_BeginRequestBody = '!HB5x' FCGI_EndRequestBody = '!LB3x' FCGI_UnknownTypeBody = '!B7x' FCGI_EndRequestBody_LEN = struct.calcsize(FCGI_EndRequestBody) FCGI_UnknownTypeBody_LEN = struct.calcsize(FCGI_UnknownTypeBody) if __debug__: import time # Set non-zero to write debug output to a file. DEBUG = 0 DEBUGLOG = '/tmp/fcgi.log' def _debug(level, msg): if DEBUG < level: return try: f = open(DEBUGLOG, 'a') f.write('%sfcgi: %s\n' % (time.ctime()[4:-4], msg)) f.close() except: pass class InputStream(object): """ File-like object representing FastCGI input streams (FCGI_STDIN and FCGI_DATA). Supports the minimum methods required by WSGI spec. """ def __init__(self, conn): self._conn = conn # See Server. self._shrinkThreshold = conn.server.inputStreamShrinkThreshold self._buf = '' self._bufList = [] self._pos = 0 # Current read position. self._avail = 0 # Number of bytes currently available. self._eof = False # True when server has sent EOF notification. def _shrinkBuffer(self): """Gets rid of already read data (since we can't rewind).""" if self._pos >= self._shrinkThreshold: self._buf = self._buf[self._pos:] self._avail -= self._pos self._pos = 0 assert self._avail >= 0 def _waitForData(self): """Waits for more data to become available.""" self._conn.process_input() def read(self, n=-1): if self._pos == self._avail and self._eof: return '' while True: if n < 0 or (self._avail - self._pos) < n: # Not enough data available. if self._eof: # And there's no more coming. newPos = self._avail break else: # Wait for more data. self._waitForData() continue else: newPos = self._pos + n break # Merge buffer list, if necessary. if self._bufList: self._buf += ''.join(self._bufList) self._bufList = [] r = self._buf[self._pos:newPos] self._pos = newPos self._shrinkBuffer() return r def readline(self, length=None): if self._pos == self._avail and self._eof: return '' while True: # Unfortunately, we need to merge the buffer list early. if self._bufList: self._buf += ''.join(self._bufList) self._bufList = [] # Find newline. i = self._buf.find('\n', self._pos) if i < 0: # Not found? if self._eof: # No more data coming. newPos = self._avail break else: # Wait for more to come. self._waitForData() continue else: newPos = i + 1 break if length is not None: if self._pos + length < newPos: newPos = self._pos + length r = self._buf[self._pos:newPos] self._pos = newPos self._shrinkBuffer() return r def readlines(self, sizehint=0): total = 0 lines = [] line = self.readline() while line: lines.append(line) total += len(line) if 0 < sizehint <= total: break line = self.readline() return lines def __iter__(self): return self def next(self): r = self.readline() if not r: raise StopIteration return r def add_data(self, data): if not data: self._eof = True else: self._bufList.append(data) self._avail += len(data) class MultiplexedInputStream(InputStream): """ A version of InputStream meant to be used with MultiplexedConnections. Assumes the MultiplexedConnection (the producer) and the Request (the consumer) are running in different threads. """ def __init__(self, conn): super(MultiplexedInputStream, self).__init__(conn) # Arbitrates access to this InputStream (it's used simultaneously # by a Request and its owning Connection object). lock = threading.RLock() # Notifies Request thread that there is new data available. self._lock = threading.Condition(lock) def _waitForData(self): # Wait for notification from add_data(). self._lock.wait() def read(self, n=-1): self._lock.acquire() try: return super(MultiplexedInputStream, self).read(n) finally: self._lock.release() def readline(self, length=None): self._lock.acquire() try: return super(MultiplexedInputStream, self).readline(length) finally: self._lock.release() def add_data(self, data): self._lock.acquire() try: super(MultiplexedInputStream, self).add_data(data) self._lock.notify() finally: self._lock.release() class OutputStream(object): """ FastCGI output stream (FCGI_STDOUT/FCGI_STDERR). By default, calls to write() or writelines() immediately result in Records being sent back to the server. Buffering should be done in a higher level! """ def __init__(self, conn, req, type, buffered=False): self._conn = conn self._req = req self._type = type self._buffered = buffered self._bufList = [] # Used if buffered is True self.dataWritten = False self.closed = False def _write(self, data): length = len(data) while length: toWrite = min(length, self._req.server.maxwrite - FCGI_HEADER_LEN) rec = Record(self._type, self._req.requestId) rec.contentLength = toWrite rec.contentData = data[:toWrite] self._conn.writeRecord(rec) data = data[toWrite:] length -= toWrite def write(self, data): assert not self.closed if not data: return self.dataWritten = True if self._buffered: self._bufList.append(data) else: self._write(data) def writelines(self, lines): assert not self.closed for line in lines: self.write(line) def flush(self): # Only need to flush if this OutputStream is actually buffered. if self._buffered: data = ''.join(self._bufList) self._bufList = [] self._write(data) # Though available, the following should NOT be called by WSGI apps. def close(self): """Sends end-of-stream notification, if necessary.""" if not self.closed and self.dataWritten: self.flush() rec = Record(self._type, self._req.requestId) self._conn.writeRecord(rec) self.closed = True class TeeOutputStream(object): """ Simple wrapper around two or more output file-like objects that copies written data to all streams. """ def __init__(self, streamList): self._streamList = streamList def write(self, data): for f in self._streamList: f.write(data) def writelines(self, lines): for line in lines: self.write(line) def flush(self): for f in self._streamList: f.flush() class StdoutWrapper(object): """ Wrapper for sys.stdout so we know if data has actually been written. """ def __init__(self, stdout): self._file = stdout self.dataWritten = False def write(self, data): if data: self.dataWritten = True self._file.write(data) def writelines(self, lines): for line in lines: self.write(line) def __getattr__(self, name): return getattr(self._file, name) def decode_pair(s, pos=0): """ Decodes a name/value pair. The number of bytes decoded as well as the name/value pair are returned. """ nameLength = ord(s[pos]) if nameLength & 128: nameLength = struct.unpack('!L', s[pos:pos+4])[0] & 0x7fffffff pos += 4 else: pos += 1 valueLength = ord(s[pos]) if valueLength & 128: valueLength = struct.unpack('!L', s[pos:pos+4])[0] & 0x7fffffff pos += 4 else: pos += 1 name = s[pos:pos+nameLength] pos += nameLength value = s[pos:pos+valueLength] pos += valueLength return (pos, (name, value)) def encode_pair(name, value): """ Encodes a name/value pair. The encoded string is returned. """ nameLength = len(name) if nameLength < 128: s = chr(nameLength) else: s = struct.pack('!L', nameLength | 0x80000000L) valueLength = len(value) if valueLength < 128: s += chr(valueLength) else: s += struct.pack('!L', valueLength | 0x80000000L) return s + name + value class Record(object): """ A FastCGI Record. Used for encoding/decoding records. """ def __init__(self, type=FCGI_UNKNOWN_TYPE, requestId=FCGI_NULL_REQUEST_ID): self.version = FCGI_VERSION_1 self.type = type self.requestId = requestId self.contentLength = 0 self.paddingLength = 0 self.contentData = '' def _recvall(sock, length): """ Attempts to receive length bytes from a socket, blocking if necessary. (Socket may be blocking or non-blocking.) """ dataList = [] recvLen = 0 while length: try: data = sock.recv(length) except socket.error, e: if e[0] == errno.EAGAIN: select.select([sock], [], []) continue else: raise if not data: # EOF break dataList.append(data) dataLen = len(data) recvLen += dataLen length -= dataLen return ''.join(dataList), recvLen _recvall = staticmethod(_recvall) def read(self, sock): """Read and decode a Record from a socket.""" try: header, length = self._recvall(sock, FCGI_HEADER_LEN) except: raise EOFError if length < FCGI_HEADER_LEN: raise EOFError self.version, self.type, self.requestId, self.contentLength, \ self.paddingLength = struct.unpack(FCGI_Header, header) if __debug__: _debug(9, 'read: fd = %d, type = %d, requestId = %d, ' 'contentLength = %d' % (sock.fileno(), self.type, self.requestId, self.contentLength)) if self.contentLength: try: self.contentData, length = self._recvall(sock, self.contentLength) except: raise EOFError if length < self.contentLength: raise EOFError if self.paddingLength: try: self._recvall(sock, self.paddingLength) except: raise EOFError def _sendall(sock, data): """ Writes data to a socket and does not return until all the data is sent. """ length = len(data) while length: try: sent = sock.send(data) except socket.error, e: if e[0] == errno.EAGAIN: select.select([], [sock], []) continue else: raise data = data[sent:] length -= sent _sendall = staticmethod(_sendall) def write(self, sock): """Encode and write a Record to a socket.""" self.paddingLength = -self.contentLength & 7 if __debug__: _debug(9, 'write: fd = %d, type = %d, requestId = %d, ' 'contentLength = %d' % (sock.fileno(), self.type, self.requestId, self.contentLength)) header = struct.pack(FCGI_Header, self.version, self.type, self.requestId, self.contentLength, self.paddingLength) self._sendall(sock, header) if self.contentLength: self._sendall(sock, self.contentData) if self.paddingLength: self._sendall(sock, '\x00'*self.paddingLength) class Request(object): """ Represents a single FastCGI request. These objects are passed to your handler and is the main interface between your handler and the fcgi module. The methods should not be called by your handler. However, server, params, stdin, stdout, stderr, and data are free for your handler's use. """ def __init__(self, conn, inputStreamClass): self._conn = conn self.server = conn.server self.params = {} self.stdin = inputStreamClass(conn) self.stdout = OutputStream(conn, self, FCGI_STDOUT) self.stderr = OutputStream(conn, self, FCGI_STDERR, buffered=True) self.data = inputStreamClass(conn) def run(self): """Runs the handler, flushes the streams, and ends the request.""" try: protocolStatus, appStatus = self.server.handler(self) except: traceback.print_exc(file=self.stderr) self.stderr.flush() if not self.stdout.dataWritten: self.server.error(self) protocolStatus, appStatus = FCGI_REQUEST_COMPLETE, 0 if __debug__: _debug(1, 'protocolStatus = %d, appStatus = %d' % (protocolStatus, appStatus)) self._flush() self._end(appStatus, protocolStatus) def _end(self, appStatus=0L, protocolStatus=FCGI_REQUEST_COMPLETE): self._conn.end_request(self, appStatus, protocolStatus) def _flush(self): self.stdout.close() self.stderr.close() class CGIRequest(Request): """A normal CGI request disguised as a FastCGI request.""" def __init__(self, server): # These are normally filled in by Connection. self.requestId = 1 self.role = FCGI_RESPONDER self.flags = 0 self.aborted = False self.server = server self.params = dict(os.environ) self.stdin = sys.stdin self.stdout = StdoutWrapper(sys.stdout) # Oh, the humanity! self.stderr = sys.stderr self.data = StringIO.StringIO() def _end(self, appStatus=0L, protocolStatus=FCGI_REQUEST_COMPLETE): sys.exit(appStatus) def _flush(self): # Not buffered, do nothing. pass class Connection(object): """ A Connection with the web server. Each Connection is associated with a single socket (which is connected to the web server) and is responsible for handling all the FastCGI message processing for that socket. """ _multiplexed = False _inputStreamClass = InputStream def __init__(self, sock, addr, server): self._sock = sock self._addr = addr self.server = server # Active Requests for this Connection, mapped by request ID. self._requests = {} def _cleanupSocket(self): """Close the Connection's socket.""" try: self._sock.shutdown(socket.SHUT_WR) except: return try: while True: r, w, e = select.select([self._sock], [], []) if not r or not self._sock.recv(1024): break except: pass self._sock.close() def run(self): """Begin processing data from the socket.""" self._keepGoing = True while self._keepGoing: try: self.process_input() except EOFError: break except (select.error, socket.error), e: if e[0] == errno.EBADF: # Socket was closed by Request. break raise self._cleanupSocket() def process_input(self): """Attempt to read a single Record from the socket and process it.""" # Currently, any children Request threads notify this Connection # that it is no longer needed by closing the Connection's socket. # We need to put a timeout on select, otherwise we might get # stuck in it indefinitely... (I don't like this solution.) while self._keepGoing: try: r, w, e = select.select([self._sock], [], [], 1.0) except ValueError: # Sigh. ValueError gets thrown sometimes when passing select # a closed socket. raise EOFError if r: break if not self._keepGoing: return rec = Record() rec.read(self._sock) if rec.type == FCGI_GET_VALUES: self._do_get_values(rec) elif rec.type == FCGI_BEGIN_REQUEST: self._do_begin_request(rec) elif rec.type == FCGI_ABORT_REQUEST: self._do_abort_request(rec) elif rec.type == FCGI_PARAMS: self._do_params(rec) elif rec.type == FCGI_STDIN: self._do_stdin(rec) elif rec.type == FCGI_DATA: self._do_data(rec) elif rec.requestId == FCGI_NULL_REQUEST_ID: self._do_unknown_type(rec) else: # Need to complain about this. pass def writeRecord(self, rec): """ Write a Record to the socket. """ rec.write(self._sock) def end_request(self, req, appStatus=0L, protocolStatus=FCGI_REQUEST_COMPLETE, remove=True): """ End a Request. Called by Request objects. An FCGI_END_REQUEST Record is sent to the web server. If the web server no longer requires the connection, the socket is closed, thereby ending this Connection (run() returns). """ rec = Record(FCGI_END_REQUEST, req.requestId) rec.contentData = struct.pack(FCGI_EndRequestBody, appStatus, protocolStatus) rec.contentLength = FCGI_EndRequestBody_LEN self.writeRecord(rec) if remove: del self._requests[req.requestId] if __debug__: _debug(2, 'end_request: flags = %d' % req.flags) if not (req.flags & FCGI_KEEP_CONN) and not self._requests: self._cleanupSocket() self._keepGoing = False def _do_get_values(self, inrec): """Handle an FCGI_GET_VALUES request from the web server.""" outrec = Record(FCGI_GET_VALUES_RESULT) pos = 0 while pos < inrec.contentLength: pos, (name, value) = decode_pair(inrec.contentData, pos) cap = self.server.capability.get(name) if cap is not None: outrec.contentData += encode_pair(name, str(cap)) outrec.contentLength = len(outrec.contentData) self.writeRecord(outrec) def _do_begin_request(self, inrec): """Handle an FCGI_BEGIN_REQUEST from the web server.""" role, flags = struct.unpack(FCGI_BeginRequestBody, inrec.contentData) req = self.server.request_class(self, self._inputStreamClass) req.requestId, req.role, req.flags = inrec.requestId, role, flags req.aborted = False if not self._multiplexed and self._requests: # Can't multiplex requests. self.end_request(req, 0L, FCGI_CANT_MPX_CONN, remove=False) else: self._requests[inrec.requestId] = req def _do_abort_request(self, inrec): """ Handle an FCGI_ABORT_REQUEST from the web server. We just mark a flag in the associated Request. """ req = self._requests.get(inrec.requestId) if req is not None: req.aborted = True def _start_request(self, req): """Run the request.""" # Not multiplexed, so run it inline. req.run() def _do_params(self, inrec): """ Handle an FCGI_PARAMS Record. If the last FCGI_PARAMS Record is received, start the request. """ req = self._requests.get(inrec.requestId) if req is not None: if inrec.contentLength: pos = 0 while pos < inrec.contentLength: pos, (name, value) = decode_pair(inrec.contentData, pos) req.params[name] = value else: self._start_request(req) def _do_stdin(self, inrec): """Handle the FCGI_STDIN stream.""" req = self._requests.get(inrec.requestId) if req is not None: req.stdin.add_data(inrec.contentData) def _do_data(self, inrec): """Handle the FCGI_DATA stream.""" req = self._requests.get(inrec.requestId) if req is not None: req.data.add_data(inrec.contentData) def _do_unknown_type(self, inrec): """Handle an unknown request type. Respond accordingly.""" outrec = Record(FCGI_UNKNOWN_TYPE) outrec.contentData = struct.pack(FCGI_UnknownTypeBody, inrec.type) outrec.contentLength = FCGI_UnknownTypeBody_LEN self.writeRecord(outrec) class MultiplexedConnection(Connection): """ A version of Connection capable of handling multiple requests simultaneously. """ _multiplexed = True _inputStreamClass = MultiplexedInputStream def __init__(self, sock, addr, server): super(MultiplexedConnection, self).__init__(sock, addr, server) # Used to arbitrate access to self._requests. lock = threading.RLock() # Notification is posted everytime a request completes, allowing us # to quit cleanly. self._lock = threading.Condition(lock) def _cleanupSocket(self): # Wait for any outstanding requests before closing the socket. self._lock.acquire() while self._requests: self._lock.wait() self._lock.release() super(MultiplexedConnection, self)._cleanupSocket() def writeRecord(self, rec): # Must use locking to prevent intermingling of Records from different # threads. self._lock.acquire() try: # Probably faster than calling super. ;) rec.write(self._sock) finally: self._lock.release() def end_request(self, req, appStatus=0L, protocolStatus=FCGI_REQUEST_COMPLETE, remove=True): self._lock.acquire() try: super(MultiplexedConnection, self).end_request(req, appStatus, protocolStatus, remove) self._lock.notify() finally: self._lock.release() def _do_begin_request(self, inrec): self._lock.acquire() try: super(MultiplexedConnection, self)._do_begin_request(inrec) finally: self._lock.release() def _do_abort_request(self, inrec): self._lock.acquire() try: super(MultiplexedConnection, self)._do_abort_request(inrec) finally: self._lock.release() def _start_request(self, req): thread.start_new_thread(req.run, ()) def _do_params(self, inrec): self._lock.acquire() try: super(MultiplexedConnection, self)._do_params(inrec) finally: self._lock.release() def _do_stdin(self, inrec): self._lock.acquire() try: super(MultiplexedConnection, self)._do_stdin(inrec) finally: self._lock.release() def _do_data(self, inrec): self._lock.acquire() try: super(MultiplexedConnection, self)._do_data(inrec) finally: self._lock.release() class Server(object): """ The FastCGI server. Waits for connections from the web server, processing each request. If run in a normal CGI context, it will instead instantiate a CGIRequest and run the handler through there. """ request_class = Request cgirequest_class = CGIRequest # Limits the size of the InputStream's string buffer to this size + the # server's maximum Record size. Since the InputStream is not seekable, # we throw away already-read data once this certain amount has been read. inputStreamShrinkThreshold = 102400 - 8192 def __init__(self, handler=None, maxwrite=8192, bindAddress=None, umask=None, multiplexed=False): """ handler, if present, must reference a function or method that takes one argument: a Request object. If handler is not specified at creation time, Server *must* be subclassed. (The handler method below is abstract.) maxwrite is the maximum number of bytes (per Record) to write to the server. I've noticed mod_fastcgi has a relatively small receive buffer (8K or so). bindAddress, if present, must either be a string or a 2-tuple. If present, run() will open its own listening socket. You would use this if you wanted to run your application as an 'external' FastCGI app. (i.e. the webserver would no longer be responsible for starting your app) If a string, it will be interpreted as a filename and a UNIX socket will be opened. If a tuple, the first element, a string, is the interface name/IP to bind to, and the second element (an int) is the port number. Set multiplexed to True if you want to handle multiple requests per connection. Some FastCGI backends (namely mod_fastcgi) don't multiplex requests at all, so by default this is off (which saves on thread creation/locking overhead). If threads aren't available, this keyword is ignored; it's not possible to multiplex requests at all. """ if handler is not None: self.handler = handler self.maxwrite = maxwrite if thread_available: try: import resource # Attempt to glean the maximum number of connections # from the OS. maxConns = resource.getrlimit(resource.RLIMIT_NOFILE)[0] except ImportError: maxConns = 100 # Just some made up number. maxReqs = maxConns if multiplexed: self._connectionClass = MultiplexedConnection maxReqs *= 5 # Another made up number. else: self._connectionClass = Connection self.capability = { FCGI_MAX_CONNS: maxConns, FCGI_MAX_REQS: maxReqs, FCGI_MPXS_CONNS: multiplexed and 1 or 0 } else: self._connectionClass = Connection self.capability = { # If threads aren't available, these are pretty much correct. FCGI_MAX_CONNS: 1, FCGI_MAX_REQS: 1, FCGI_MPXS_CONNS: 0 } self._bindAddress = bindAddress self._umask = umask def _setupSocket(self): if self._bindAddress is None: # Run as a normal FastCGI? isFCGI = True sock = socket.fromfd(FCGI_LISTENSOCK_FILENO, socket.AF_INET, socket.SOCK_STREAM) try: sock.getpeername() except socket.error, e: if e[0] == errno.ENOTSOCK: # Not a socket, assume CGI context. isFCGI = False elif e[0] != errno.ENOTCONN: raise # FastCGI/CGI discrimination is broken on Mac OS X. # Set the environment variable FCGI_FORCE_CGI to "Y" or "y" # if you want to run your app as a simple CGI. (You can do # this with Apache's mod_env [not loaded by default in OS X # client, ha ha] and the SetEnv directive.) if not isFCGI or \ os.environ.get('FCGI_FORCE_CGI', 'N').upper().startswith('Y'): req = self.cgirequest_class(self) req.run() sys.exit(0) else: # Run as a server oldUmask = None if type(self._bindAddress) is str: # Unix socket sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) try: os.unlink(self._bindAddress) except OSError: pass if self._umask is not None: oldUmask = os.umask(self._umask) else: # INET socket assert type(self._bindAddress) is tuple assert len(self._bindAddress) == 2 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(self._bindAddress) sock.listen(socket.SOMAXCONN) if oldUmask is not None: os.umask(oldUmask) return sock def _cleanupSocket(self, sock): """Closes the main socket.""" sock.close() def _installSignalHandlers(self): self._oldSIGs = [(x,signal.getsignal(x)) for x in (signal.SIGHUP, signal.SIGINT, signal.SIGTERM)] signal.signal(signal.SIGHUP, self._hupHandler) signal.signal(signal.SIGINT, self._intHandler) signal.signal(signal.SIGTERM, self._intHandler) def _restoreSignalHandlers(self): for signum,handler in self._oldSIGs: signal.signal(signum, handler) def _hupHandler(self, signum, frame): self._hupReceived = True self._keepGoing = False def _intHandler(self, signum, frame): self._keepGoing = False def run(self, timeout=1.0): """ The main loop. Exits on SIGHUP, SIGINT, SIGTERM. Returns True if SIGHUP was received, False otherwise. """ web_server_addrs = os.environ.get('FCGI_WEB_SERVER_ADDRS') if web_server_addrs is not None: web_server_addrs = map(lambda x: x.strip(), web_server_addrs.split(',')) sock = self._setupSocket() self._keepGoing = True self._hupReceived = False # Install signal handlers. self._installSignalHandlers() while self._keepGoing: try: r, w, e = select.select([sock], [], [], timeout) except select.error, e: if e[0] == errno.EINTR: continue raise if r: try: clientSock, addr = sock.accept() except socket.error, e: if e[0] in (errno.EINTR, errno.EAGAIN): continue raise if web_server_addrs and \ (len(addr) != 2 or addr[0] not in web_server_addrs): clientSock.close() continue # Instantiate a new Connection and begin processing FastCGI # messages (either in a new thread or this thread). conn = self._connectionClass(clientSock, addr, self) thread.start_new_thread(conn.run, ()) self._mainloopPeriodic() # Restore signal handlers. self._restoreSignalHandlers() self._cleanupSocket(sock) return self._hupReceived def _mainloopPeriodic(self): """ Called with just about each iteration of the main loop. Meant to be overridden. """ pass def _exit(self, reload=False): """ Protected convenience method for subclasses to force an exit. Not really thread-safe, which is why it isn't public. """ if self._keepGoing: self._keepGoing = False self._hupReceived = reload def handler(self, req): """ Default handler, which just raises an exception. Unless a handler is passed at initialization time, this must be implemented by a subclass. """ raise NotImplementedError, self.__class__.__name__ + '.handler' def error(self, req): """ Called by Request if an exception occurs within the handler. May and should be overridden. """ import cgitb req.stdout.write('Content-Type: text/html\r\n\r\n' + cgitb.html(sys.exc_info())) class WSGIServer(Server): """ FastCGI server that supports the Web Server Gateway Interface. See . """ def __init__(self, application, environ=None, multithreaded=True, **kw): """ environ, if present, must be a dictionary-like object. Its contents will be copied into application's environ. Useful for passing application-specific variables. Set multithreaded to False if your application is not MT-safe. """ if kw.has_key('handler'): del kw['handler'] # Doesn't make sense to let this through super(WSGIServer, self).__init__(**kw) if environ is None: environ = {} self.application = application self.environ = environ self.multithreaded = multithreaded # Used to force single-threadedness self._app_lock = thread.allocate_lock() def handler(self, req): """Special handler for WSGI.""" if req.role != FCGI_RESPONDER: return FCGI_UNKNOWN_ROLE, 0 # Mostly taken from example CGI gateway. environ = req.params environ.update(self.environ) environ['wsgi.version'] = (1,0) environ['wsgi.input'] = req.stdin if self._bindAddress is None: stderr = req.stderr else: stderr = TeeOutputStream((sys.stderr, req.stderr)) environ['wsgi.errors'] = stderr environ['wsgi.multithread'] = not isinstance(req, CGIRequest) and \ thread_available and self.multithreaded # Rationale for the following: If started by the web server # (self._bindAddress is None) in either FastCGI or CGI mode, the # possibility of being spawned multiple times simultaneously is quite # real. And, if started as an external server, multiple copies may be # spawned for load-balancing/redundancy. (Though I don't think # mod_fastcgi supports this?) environ['wsgi.multiprocess'] = True environ['wsgi.run_once'] = isinstance(req, CGIRequest) if environ.get('HTTPS', 'off') in ('on', '1'): environ['wsgi.url_scheme'] = 'https' else: environ['wsgi.url_scheme'] = 'http' self._sanitizeEnv(environ) headers_set = [] headers_sent = [] result = None def write(data): assert type(data) is str, 'write() argument must be string' assert headers_set, 'write() before start_response()' if not headers_sent: status, responseHeaders = headers_sent[:] = headers_set found = False for header,value in responseHeaders: if header.lower() == 'content-length': found = True break if not found and result is not None: try: if len(result) == 1: responseHeaders.append(('Content-Length', str(len(data)))) except: pass s = 'Status: %s\r\n' % status for header in responseHeaders: s += '%s: %s\r\n' % header s += '\r\n' req.stdout.write(s) req.stdout.write(data) req.stdout.flush() def start_response(status, response_headers, exc_info=None): if exc_info: try: if headers_sent: # Re-raise if too late raise exc_info[0], exc_info[1], exc_info[2] finally: exc_info = None # avoid dangling circular ref else: assert not headers_set, 'Headers already set!' assert type(status) is str, 'Status must be a string' assert len(status) >= 4, 'Status must be at least 4 characters' assert int(status[:3]), 'Status must begin with 3-digit code' assert status[3] == ' ', 'Status must have a space after code' assert type(response_headers) is list, 'Headers must be a list' if __debug__: for name,val in response_headers: assert type(name) is str, 'Header names must be strings' assert type(val) is str, 'Header values must be strings' headers_set[:] = [status, response_headers] return write if not self.multithreaded: self._app_lock.acquire() try: try: result = self.application(environ, start_response) try: for data in result: if data: write(data) if not headers_sent: write('') # in case body was empty finally: if hasattr(result, 'close'): result.close() except socket.error, e: if e[0] != errno.EPIPE: raise # Don't let EPIPE propagate beyond server finally: if not self.multithreaded: self._app_lock.release() return FCGI_REQUEST_COMPLETE, 0 def _sanitizeEnv(self, environ): """Ensure certain values are present, if required by WSGI.""" if not environ.has_key('SCRIPT_NAME'): environ['SCRIPT_NAME'] = '' if not environ.has_key('PATH_INFO'): environ['PATH_INFO'] = '' # If any of these are missing, it probably signifies a broken # server... for name,default in [('REQUEST_METHOD', 'GET'), ('SERVER_NAME', 'localhost'), ('SERVER_PORT', '80'), ('SERVER_PROTOCOL', 'HTTP/1.0')]: if not environ.has_key(name): environ['wsgi.errors'].write('%s: missing FastCGI param %s ' 'required by WSGI!\n' % (self.__class__.__name__, name)) environ[name] = default if __name__ == '__main__': def test_app(environ, start_response): """Probably not the most efficient example.""" import cgi start_response('200 OK', [('Content-Type', 'text/html')]) yield 'Hello World!\n' \ '\n' \ '

Hello World!

\n' \ '
' names = environ.keys() names.sort() for name in names: yield '\n' % ( name, cgi.escape(`environ[name]`)) form = cgi.FieldStorage(fp=environ['wsgi.input'], environ=environ, keep_blank_values=1) if form.list: yield '' for field in form.list: yield '\n' % ( field.name, field.value) yield '
%s%s
Form data
%s%s
\n' \ '\n' WSGIServer(test_app).run() web2py-2.12.3.orig/gluon/contrib/sms_utils.py0000664000000000000000000001034112564727264017644 0ustar rootrootSMSCODES = { 'Aliant': '@chat.wirefree.ca', 'Alltel': '@message.alltel.com', 'Ameritech': '@paging.acswireless.com', 'AT&T': '@txt.att.net', 'AU by KDDI': '@ezweb.ne.jp', 'BeeLine GSM': '@sms.beemail.ru', 'Bell Mobility Canada': '@txt.bellmobility.ca', 'Bellsouth': '@bellsouth.cl', 'BellSouth Mobility': '@blsdcs.net', 'Blue Sky Frog': '@blueskyfrog.com', 'Boost': '@myboostmobile.com', 'Cellular South': '@csouth1.com', 'CellularOne': '@mobile.celloneusa.com', 'CellularOne West': '@mycellone.com', 'Cincinnati Bell': '@gocbw.com', 'Claro': '@clarotorpedo.com.br', 'Comviq': '@sms.comviq.se', 'Dutchtone/Orange-NL': '@sms.orange.nl', 'Edge Wireless': '@sms.edgewireless.com', 'EinsteinPCS / Airadigm Communications': '@einsteinsms.com', 'EPlus': '@smsmail.eplus.de', 'Fido Canada': '@fido.ca', 'Golden Telecom': '@sms.goldentele.com', 'Idea Cellular': '@ideacellular.net', 'Kyivstar': '@sms.kyivstar.net', 'LMT': '@sms.lmt.lv', 'Manitoba Telecom Systems': '@text.mtsmobility.com', 'Meteor': '@sms.mymeteor.ie', 'Metro PCS': '@mymetropcs.com', 'Metrocall Pager': '@page.metrocall.com', 'MobileOne': '@m1.com.sg', 'Mobilfone': '@page.mobilfone.com', 'Mobility Bermuda': '@ml.bm', 'Netcom': '@sms.netcom.no', 'Nextel': '@messaging.nextel.com', 'NPI Wireless': '@npiwireless.com', 'O2': '@o2.co.uk', 'O2 M-mail': '@mmail.co.uk', 'Optus': '@optusmobile.com.au', 'Orange': '@orange.net', 'Oskar': '@mujoskar.cz', 'Pagenet': '@pagenet.net', 'PCS Rogers': '@pcs.rogers.com', 'Personal Communication': '@pcom.ru', 'Plus GSM Poland': '@text.plusgsm.pl', 'Powertel': '@ptel.net', 'Primtel': '@sms.primtel.ru', 'PSC Wireless': '@sms.pscel.com', 'Qualcomm': '@pager.qualcomm.com', 'Qwest': '@qwestmp.com', 'Safaricom': '@safaricomsms.com', 'Satelindo GSM': '@satelindogsm.com', 'SCS-900': '@scs-900.ru', 'Simple Freedom': '@text.simplefreedom.net', 'Skytel - Alphanumeric': '@skytel.com', 'Smart Telecom': '@mysmart.mymobile.ph', 'Southern Linc': '@page.southernlinc.com', 'Sprint PCS': '@messaging.sprintpcs.com', 'Sprint PCS - Short Mail': '@sprintpcs.com', 'SunCom': '@tms.suncom.com', 'SureWest Communications': '@mobile.surewest.com', 'SwissCom Mobile': '@bluewin.ch', 'T-Mobile Germany': '@T-D1-SMS.de', 'T-Mobile Netherlands': '@gin.nl', 'T-Mobile UK': '@t-mobile.uk.net', 'T-Mobile USA (tmail)': '@tmail.com', 'T-Mobile USA (tmomail)': '@tmomail.net', 'Tele2 Latvia': '@sms.tele2.lv', 'Telefonica Movistar': '@movistar.net', 'Telenor': '@mobilpost.no', 'Telia Denmark': '@gsm1800.telia.dk', 'Telus Mobility': '@msg.telus.com', 'The Phone House': '@sms.phonehouse.de', 'TIM': '@timnet.com', 'UMC': '@sms.umc.com.ua', 'Unicel': '@utext.com', 'US Cellular': '@email.uscc.net', 'Verizon Wireless (vtext)': '@vtext.com', 'Verizon Wireless (airtouchpaging)': '@airtouchpaging.com', 'Verizon Wireless (myairmail)': '@myairmail.com', 'Vessotel': '@pager.irkutsk.ru', 'Virgin Mobile Canada': '@vmobile.ca', 'Virgin Mobile USA': '@vmobl.com', 'Vodafone Italy': '@sms.vodafone.it', 'Vodafone Japan (n)': '@n.vodafone.ne.jp', 'Vodafone Japan (d)': '@d.vodafone.ne.jp', 'Vodafone Japan (r)': '@r.vodafone.ne.jp', 'Vodafone Japan (k)': '@k.vodafone.ne.jp', 'Vodafone Japan (t)': '@t.vodafone.ne.jp', 'Vodafone Japan (q)': '@q.vodafone.ne.jp', 'Vodafone Japan (s)': '@s.vodafone.ne.jp', 'Vodafone Japan (h)': '@h.vodafone.ne.jp', 'Vodafone Japan (c)': '@c.vodafone.ne.jp', 'Vodafone Spain': '@vodafone.es', 'Vodafone UK': '@vodafone.net', 'Weblink Wireless': '@airmessage.net', 'WellCom': '@sms.welcome2well.com', 'WyndTell': '@wyndtell.com', } def sms_email(number, provider): """ >>> print sms_email('1 (312) 375-6536','T-Mobile USA (tmail)') print 13123756536@tmail.com """ import re if number[0] == '+1': number = number[1:] elif number[0] == '+': number = number[3:] elif number[:2] == '00': number = number[3:] number = re.sub('[^\d]', '', number) return number + SMSCODES[provider] web2py-2.12.3.orig/gluon/contrib/autolinks.py0000664000000000000000000001425312564727262017637 0ustar rootroot""" Developed by Massimo Di Pierro Released under the web2py license (LGPL) What does it do? if html is a variable containing HTML text and urls in the text, when you call html = expend_html(html) it automatically converts the url to links but when possible it embeds the object being linked. In particular it can embed images, videos, audio files, documents (it uses the google code player), as well as pages to a oembed service. Google Doc Support ================== Microsoft Word (.DOC, .DOCX) Microsoft Excel (.XLS and .XLSX) Microsoft PowerPoint 2007 / 2010 (.PPTX) Apple Pages (.PAGES) Adobe PDF (.PDF) Adobe Illustrator (.AI) Adobe Photoshop (.PSD) Autodesk AutoCad (.DXF) Scalable Vector Graphics (.SVG) PostScript (.EPS, .PS) TrueType (.TTF) XML Paper Specification (.XPS) Oembed Support ============== flickr.com youtube.com hulu.com vimeo.com slideshare.net qik.com polleverywhere.com wordpress.com revision3.com viddler.com """ import re import cgi import sys from simplejson import loads import urllib import uuid try: from BeautifulSoup import BeautifulSoup, Comment have_soup = True except ImportError: have_soup = False regex_link = re.compile('https?://\S+') EMBED_MAPS = [ (re.compile('http://\S*?flickr.com/\S*'), 'http://www.flickr.com/services/oembed/'), (re.compile('http://\S*.youtu(\.be|be\.com)/watch\S*'), 'http://www.youtube.com/oembed'), (re.compile('http://www.hulu.com/watch/\S*'), 'http://www.hulu.com/api/oembed.json'), (re.compile('http://vimeo.com/\S*'), 'http://vimeo.com/api/oembed.json'), (re.compile('http://www.slideshare.net/[^\/]+/\S*'), 'http://www.slideshare.net/api/oembed/2'), (re.compile('http://qik.com/\S*'), 'http://qik.com/api/oembed.json'), (re.compile('http://www.polleverywhere.com/\w+/\S+'), 'http://www.polleverywhere.com/services/oembed/'), (re.compile('http://\S+.wordpress.com/\S+'), 'http://public-api.wordpress.com/oembed/'), (re.compile('http://*.revision3.com/\S+'), 'http://revision3.com/api/oembed/'), (re.compile('http://\S+.viddler.com/\S+'), 'http://lab.viddler.com/services/oembed/'), ] def image(url): return '' % url def audio(url): return '' % url def video(url): return '' % url def googledoc_viewer(url): return '' % urllib.quote(url) def web2py_component(url): code = str(uuid.uuid4()) return '
' % (code, url, code) EXTENSION_MAPS = { 'png': image, 'gif': image, 'jpg': image, 'jpeg': image, 'wav': audio, 'ogg': audio, 'mp3': audio, 'mov': video, 'mpe': video, 'mp4': video, 'mpg': video, 'mpg2': video, 'mpeg': video, 'mpeg4': video, 'movie': video, 'wmv': video, 'load': web2py_component, 'pdf': googledoc_viewer, 'doc': googledoc_viewer, 'docx': googledoc_viewer, 'ppt': googledoc_viewer, 'pptx': googledoc_viewer, 'xls': googledoc_viewer, 'xlsx': googledoc_viewer, 'pages': googledoc_viewer, 'ai': googledoc_viewer, 'psd': googledoc_viewer, 'xdf': googledoc_viewer, 'svg': googledoc_viewer, 'ttf': googledoc_viewer, 'xps': googledoc_viewer, } class VimeoURLOpener(urllib.FancyURLopener): "Vimeo blocks the urllib user agent for some reason" version = "Mozilla/4.0" urllib._urlopener = VimeoURLOpener() def oembed(url): for k, v in EMBED_MAPS: if k.match(url): oembed = v + '?format=json&url=' + cgi.escape(url) try: data = urllib.urlopen(oembed).read() return loads(data) # json! except: pass return {} def extension(url): return url.split('?')[0].split('.')[-1].lower() def expand_one(url, cdict): # try ombed but first check in cache if '@' in url and not '://'in url: return '%s' % (url, url) if cdict and url in cdict: r = cdict[url] else: r = oembed(url) if isinstance(cdict, dict): cdict[url] = r # if oembed service if 'html' in r: html = r['html'].encode('utf8') if html.startswith('%s' % html else: return html elif 'url' in r: url = r['url'].encode('utf8') # embed images, video, audio files ext = extension(url) if ext in EXTENSION_MAPS: return EXTENSION_MAPS[ext](url) # else regular link return '%(u)s' % dict(u=url) def expand_html(html, cdict=None): if not have_soup: raise RuntimeError("Missing BeautifulSoup") soup = BeautifulSoup(html) comments = soup.findAll(text=lambda text: isinstance(text, Comment)) [comment.extract() for comment in comments] for txt in soup.findAll(text=True): if not txt.parent.name in ('a', 'script', 'pre', 'code', 'embed', 'object', 'audio', 'video'): ntxt = regex_link.sub( lambda match: expand_one(match.group(0), cdict), txt) txt.replaceWith(BeautifulSoup(ntxt)) return str(soup) def test(): example = """

Fringilla nisi parturient nullam

http://www.youtube.com/watch?v=IWBFiI5RrA0

http://www.web2py.com/examples/static/images/logo_bw.png

http://www.web2py.com/examples/default/index.load

http://www.web2py.com/examples/static/web2py_manual_cutl.pdf

Elementum sodales est varius magna leo sociis erat. Nascetur pretium non ultricies gravida. Condimentum at nascetur tempus. Porttitor viverra ipsum accumsan neque aliquet. Ultrices vestibulum tempor quisque eget sem eget. Ornare malesuada tempus dolor dolor magna consectetur. Nisl dui non curabitur laoreet tortor.

""" return expand_html(example) if __name__ == "__main__": if len(sys.argv) > 1: print expand_html(open(sys.argv[1]).read()) else: print test() web2py-2.12.3.orig/gluon/contrib/__init__.py0000664000000000000000000000000012564727262017346 0ustar rootrootweb2py-2.12.3.orig/gluon/contrib/heroku.py0000664000000000000000000000150012564727262017112 0ustar rootroot""" Usage: in web2py models/db.py from gluon.contrib.heroku import get_db db = get_db() """ import os from gluon import * from pydal.adapters import ADAPTERS, PostgreSQLAdapter from pydal.helpers.classes import UseDatabaseStoredFile class HerokuPostgresAdapter(UseDatabaseStoredFile,PostgreSQLAdapter): drivers = ('psycopg2',) uploads_in_blob = True ADAPTERS['postgres'] = HerokuPostgresAdapter def get_db(name = None, pool_size=10): if not name: names = [n for n in os.environ.keys() if n[:18]+n[-4:]=='HEROKU_POSTGRESQL__URL'] if names: name = names[0] if name: db = DAL(os.environ[name], pool_size=pool_size) current.session.connect(current.request, current.response, db=db) else: db = DAL('sqlite://heroku.test.sqlite') return db web2py-2.12.3.orig/gluon/contrib/pyfpdf.py0000664000000000000000000000062212564727262017111 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- "FPDF for python (a.k.a. pyfpdf)" # Read more about this http://code.google.com/p/pyfpdf # Please note that new package name is fpdf (to avoid some naming conflicts) # import fpdf into pyfpdf for backward compatibility (prior web2py 2.0): from fpdf import * # import warnings # warnings.warn("pyfpdf package name is deprecated, please use fpdf instead") web2py-2.12.3.orig/gluon/contrib/AuthorizeNet.py0000775000000000000000000002461312564727262020253 0ustar rootroot""" AIM class to credit card payment with authorize.net Fork of authnet code written by John Conde http://www.johnconde.net/blog/integrate-the-authorizenet-aim-api-with-python-3-2/ BSDv3 License Modifed by Massimo Di Pierro - ported from Python 3.x run on Python 2.4+ - fixed a couple of bugs - merged with test so single file - namedtuple from http://code.activestate.com/recipes/500261/ """ __all__ = ['AIM'] from operator import itemgetter import urllib _known_tuple_types = {} class NamedTupleBase(tuple): """Base class for named tuples with the __new__ operator set, named tuples yielded by the namedtuple() function will subclass this and add properties.""" def __new__(cls, *args, **kws): """Create a new instance of this fielded tuple""" # May need to unpack named field values here if kws: values = list(args) + [None] * (len(cls._fields) - len(args)) fields = dict((val, idx) for idx, val in enumerate(cls._fields)) for kw, val in kws.iteritems(): assert kw in kws, "%r not in field list" % kw values[fields[kw]] = val args = tuple(values) return tuple.__new__(cls, args) def namedtuple(typename, fieldnames): """ >>> import namedtuples >>> tpl = namedtuples.namedtuple(['a', 'b', 'c']) >>> tpl(1, 2, 3) (1, 2, 3) >>> tpl(1, 2, 3).b 2 >>> tpl(c=1, a=2, b=3) (2, 3, 1) >>> tpl(c=1, a=2, b=3).b 3 >>> tpl(c='pads with nones') (None, None, 'pads with nones') >>> tpl(b='pads with nones') (None, 'pads with nones', None) >>> """ # Split up a string, some people do this if isinstance(fieldnames, basestring): fieldnames = fieldnames.replace(',', ' ').split() # Convert anything iterable that enumerates fields to a tuple now fieldname_tuple = tuple(str(field) for field in fieldnames) # See if we've cached this if fieldname_tuple in _known_tuple_types: return _known_tuple_types[fieldname_tuple] # Make the type new_tuple_type = type(typename, (NamedTupleBase,), {}) # Set the hidden field new_tuple_type._fields = fieldname_tuple # Add the getters for i, field in enumerate(fieldname_tuple): setattr(new_tuple_type, field, property(itemgetter(i))) # Cache _known_tuple_types[fieldname_tuple] = new_tuple_type # Done return new_tuple_type class AIM: class AIMError(Exception): def __init__(self, value): self.parameter = value def __str__(self): return str(self.parameter) def __init__(self, login, transkey, testmode=False): if str(login).strip() == '' or login is None: raise AIM.AIMError('No login name provided') if str(transkey).strip() == '' or transkey is None: raise AIM.AIMError('No transaction key provided') if testmode != True and testmode != False: raise AIM.AIMError('Invalid value for testmode. Must be True or False. "{0}" given.'.format(testmode)) self.testmode = testmode self.proxy = None self.delimiter = '|' self.results = [] self.error = True self.success = False self.declined = False self.parameters = {} self.setParameter('x_delim_data', 'true') self.setParameter('x_delim_char', self.delimiter) self.setParameter('x_relay_response', 'FALSE') self.setParameter('x_url', 'FALSE') self.setParameter('x_version', '3.1') self.setParameter('x_method', 'CC') self.setParameter('x_type', 'AUTH_CAPTURE') self.setParameter('x_login', login) self.setParameter('x_tran_key', transkey) def process(self): encoded_args = urllib.urlencode(self.parameters) if self.testmode == True: url = 'https://test.authorize.net/gateway/transact.dll' else: url = 'https://secure.authorize.net/gateway/transact.dll' if self.proxy is None: self.results += str(urllib.urlopen( url, encoded_args).read()).split(self.delimiter) else: opener = urllib.FancyURLopener(self.proxy) opened = opener.open(url, encoded_args) try: self.results += str(opened.read()).split(self.delimiter) finally: opened.close() Results = namedtuple('Results', 'ResultResponse ResponseSubcode ResponseCode ResponseText AuthCode \ AVSResponse TransactionID InvoiceNumber Description Amount PaymentMethod \ TransactionType CustomerID CHFirstName CHLastName Company BillingAddress \ BillingCity BillingState BillingZip BillingCountry Phone Fax Email ShippingFirstName \ ShippingLastName ShippingCompany ShippingAddress ShippingCity ShippingState \ ShippingZip ShippingCountry TaxAmount DutyAmount FreightAmount TaxExemptFlag \ PONumber MD5Hash CVVResponse CAVVResponse') self.response = Results(*tuple(r for r in self.results)[0:40]) if self.getResultResponseFull() == 'Approved': self.error = False self.success = True self.declined = False elif self.getResultResponseFull() == 'Declined': self.error = False self.success = False self.declined = True else: raise AIM.AIMError(self.response.ResponseText) def setTransaction(self, creditcard, expiration, total, cvv=None, tax=None, invoice=None): if str(creditcard).strip() == '' or creditcard is None: raise AIM.AIMError('No credit card number passed to setTransaction(): {0}'.format(creditcard)) if str(expiration).strip() == '' or expiration is None: raise AIM.AIMError('No expiration number to setTransaction(): {0}'.format(expiration)) if str(total).strip() == '' or total is None: raise AIM.AIMError('No total amount passed to setTransaction(): {0}'.format(total)) self.setParameter('x_card_num', creditcard) self.setParameter('x_exp_date', expiration) self.setParameter('x_amount', total) if cvv is not None: self.setParameter('x_card_code', cvv) if tax is not None: self.setParameter('x_tax', tax) if invoice is not None: self.setParameter('x_invoice_num', invoice) def setTransactionType(self, transtype=None): types = ['AUTH_CAPTURE', 'AUTH_ONLY', 'PRIOR_AUTH_CAPTURE', 'CREDIT', 'CAPTURE_ONLY', 'VOID'] if transtype.upper() not in types: raise AIM.AIMError('Incorrect Transaction Type passed to setTransactionType(): {0}'.format(transtype)) self.setParameter('x_type', transtype.upper()) def setProxy(self, proxy=None): if str(proxy).strip() == '' or proxy is None: raise AIM.AIMError('No proxy passed to setProxy()') self.proxy = {'http': str(proxy).strip()} def setParameter(self, key=None, value=None): if key is not None and value is not None and str(key).strip() != '' and str(value).strip() != '': self.parameters[key] = str(value).strip() else: raise AIM.AIMError('Incorrect parameters passed to setParameter(): {0}:{1}'.format(key, value)) def isApproved(self): return self.success def isDeclined(self): return self.declined def isError(self): return self.error def getResultResponseFull(self): responses = ['', 'Approved', 'Declined', 'Error'] return responses[int(self.results[0])] def process(creditcard, expiration, total, cvv=None, tax=None, invoice=None, login='cnpdev4289', transkey='SR2P8g4jdEn7vFLQ', testmode=True): payment = AIM(login, transkey, testmode) expiration = expiration.replace('/', '') payment.setTransaction(creditcard, expiration, total, cvv, tax, invoice) try: payment.process() return payment.isApproved() except AIM.AIMError: return False def test(): import socket import sys from time import time creditcard = '4427802641004797' expiration = '122012' total = '1.00' cvv = '123' tax = '0.00' invoice = str(time())[4:10] # get a random invoice number try: payment = AIM('cnpdev4289', 'SR2P8g4jdEn7vFLQ', True) payment.setTransaction( creditcard, expiration, total, cvv, tax, invoice) payment.setParameter( 'x_duplicate_window', 180) # three minutes duplicate windows payment.setParameter('x_cust_id', '1324') # customer ID payment.setParameter('x_first_name', 'John') payment.setParameter('x_last_name', 'Conde') payment.setParameter('x_company', 'Test Company') payment.setParameter('x_address', '1234 Main Street') payment.setParameter('x_city', 'Townsville') payment.setParameter('x_state', 'NJ') payment.setParameter('x_zip', '12345') payment.setParameter('x_country', 'US') payment.setParameter('x_phone', '800-555-1234') payment.setParameter('x_description', 'Test Transaction') payment.setParameter( 'x_customer_ip', socket.gethostbyname(socket.gethostname())) payment.setParameter('x_email', 'john@example.com') payment.setParameter('x_email_customer', False) payment.process() if payment.isApproved(): print 'Response Code: ', payment.response.ResponseCode print 'Response Text: ', payment.response.ResponseText print 'Response: ', payment.getResultResponseFull() print 'Transaction ID: ', payment.response.TransactionID print 'CVV Result: ', payment.response.CVVResponse print 'Approval Code: ', payment.response.AuthCode print 'AVS Result: ', payment.response.AVSResponse elif payment.isDeclined(): print 'Your credit card was declined by your bank' elif payment.isError(): raise AIM.AIMError('An uncaught error occurred') except AIM.AIMError, e: print "Exception thrown:", e print 'An error occured' print 'approved', payment.isApproved() print 'declined', payment.isDeclined() print 'error', payment.isError() if __name__ == '__main__': test() web2py-2.12.3.orig/gluon/contrib/appconfig.py0000664000000000000000000000760612564727262017600 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- """ Read from configuration files easily without hurting performances USAGE: During development you can load a config file either in .ini or .json format (by default app/private/appconfig.ini or app/private/appconfig.json) The result is a dict holding the configured values. Passing reload=True is meant only for development: in production, leave reload to False and all values will be cached from gluon.contrib.appconfig import AppConfig myconfig = AppConfig(path_to_configfile, reload=False) print myconfig['db']['uri'] The returned dict can walk with "dot notation" an arbitrarely nested dict print myconfig.take('db.uri') You can even pass a cast function, i.e. print myconfig.take('auth.expiration', cast=int) Once the value has been fetched (and casted) it won't change until the process is restarted (or reload=True is passed). """ import thread import os from ConfigParser import SafeConfigParser from gluon import current from gluon.serializers import json_parser locker = thread.allocate_lock() def AppConfig(*args, **vars): locker.acquire() reload_ = vars.pop('reload', False) try: instance_name = 'AppConfig_' + current.request.application if reload_ or not hasattr(AppConfig, instance_name): setattr(AppConfig, instance_name, AppConfigLoader(*args, **vars)) return getattr(AppConfig, instance_name).settings finally: locker.release() class AppConfigDict(dict): """ dict that has a .take() method to fetch nested values and puts them into cache """ def __init__(self, *args, **kwargs): dict.__init__(self, *args, **kwargs) self.int_cache = {} def take(self, path, cast=None): parts = path.split('.') if path in self.int_cache: return self.int_cache[path] value = self walking = [] for part in parts: if part not in value: raise BaseException("%s not in config [%s]" % (part, '-->'.join(walking))) value = value[part] walking.append(part) if cast is None: self.int_cache[path] = value else: try: value = cast(value) self.int_cache[path] = value except (ValueError, TypeError): raise BaseException("%s can't be converted to %s" % (value, cast)) return value class AppConfigLoader(object): def __init__(self, configfile=None): if not configfile: priv_folder = os.path.join(current.request.folder, 'private') configfile = os.path.join(priv_folder, 'appconfig.ini') if not os.path.isfile(configfile): configfile = os.path.join(priv_folder, 'appconfig.json') if not os.path.isfile(configfile): configfile = None if not configfile or not os.path.isfile(configfile): raise BaseException("Config file not found") self.file = configfile self.ctype = os.path.splitext(configfile)[1][1:] self.settings = None self.read_config() def read_config_ini(self): config = SafeConfigParser() config.read(self.file) settings = {} for section in config.sections(): settings[section] = {} for option in config.options(section): settings[section][option] = config.get(section, option) self.settings = AppConfigDict(settings) def read_config_json(self): with open(self.file, 'r') as c: self.settings = AppConfigDict(json_parser.load(c)) def read_config(self): if self.settings is None: try: getattr(self, 'read_config_' + self.ctype)() except AttributeError: raise BaseException("Unsupported config file format") return self.settings web2py-2.12.3.orig/gluon/contrib/memcache/0000775000000000000000000000000012564727262017011 5ustar rootrootweb2py-2.12.3.orig/gluon/contrib/memcache/__init__.py0000664000000000000000000000722612564727262021131 0ustar rootrootfrom gluon.contrib.memcache.memcache import Client from gluon.cache import CacheAbstract import time """ examle of usage: cache.memcache = MemcacheClient(request,[127.0.0.1:11211],debug=true) """ import cPickle as pickle import thread from gluon import current DEFAULT_TIME_EXPIRE = 300 # seconds (must be the same as cache.ram) def MemcacheClient(*a, **b): if not hasattr(current,'__memcache_client'): current.__memcache_client = MemcacheClientObj(*a, **b) return current.__memcache_client class MemcacheClientObj(Client): meta_storage = {} max_time_expire = 24*3600 def __init__(self, request, servers, debug=0, pickleProtocol=0, pickler=pickle.Pickler, unpickler=pickle.Unpickler, pload=None, pid=None, default_time_expire = DEFAULT_TIME_EXPIRE): self.request=request self.default_time_expire = default_time_expire if request: app = request.application else: app = '' Client.__init__(self, servers, debug, pickleProtocol, pickler, unpickler, pload, pid) if not app in self.meta_storage: self.storage = self.meta_storage[app] = { CacheAbstract.cache_stats_name: { 'hit_total': 0, 'misses': 0, }} else: self.storage = self.meta_storage[app] def __call__(self, key, f, time_expire = 'default'): if time_expire == 'default': time_expire = self.default_time_expire if time_expire == None: time_expire = self.max_time_expire # this must be commented because get and set are redefined # key = self.__keyFormat__(key) now = time.time() value = None if f is None: # force deletion of value self.delete(key) return None elif time_expire==0: # value forced expired item = None # value to be computed else: item = self.get(key) if item: if not isinstance(item,(list,tuple)): value = item elif (item[0] < now - time_expire): # value expired item = None # value to be computed else: value = item[1] if not item: value = f() self.set(key, (now,value), self.max_time_expire) return value def increment(self, key, value=1, time_expire='default'): """ time_expire is ignored """ if time_expire == 'default': time_expire = self.default_time_expire newKey = self.__keyFormat__(key) obj = Client.get(self, newKey) if obj: if isinstance(obj,(int,float,long)): return Client.incr(self, newKey, value) else: value += obj[1] Client.set(self,newKey,(time.time(),value), self.max_time_expire) return value else: Client.set(self, newKey, value, self.max_time_expire) return value def set(self, key, value, time_expire='default'): if time_expire == 'default': time_expire = self.default_time_expire newKey = self.__keyFormat__(key) return Client.set(self, newKey, value, time_expire) def get(self, key): newKey = self.__keyFormat__(key) return Client.get(self, newKey) def delete(self, key): newKey = self.__keyFormat__(key) return Client.delete(self, newKey) def __keyFormat__(self, key): return '%s/%s' % (self.request.application, key.replace(' ', '_')) web2py-2.12.3.orig/gluon/contrib/memcache/ChangeLog0000664000000000000000000003366712564727262020602 0ustar rootrootSun, 27 Nov 2011 18:15:32 -0700 Sean Reifschneider * Bug #745633: Values of maximum size are not stored API inconsistency, max value length was tested for <= while max KEY length was <. So I picked that keys and values *LONGER* than the specified max value are what is used, and added documentation and tests to that effect. The test for max value tested that length plus 4, so I've changed that to be that value plus 1. Issue found by matt-quru. * Bug #713488: Issues Invalid "delete" command. Protocol has changed so that the "delete" operation no longer takes a "time" argument. It seems that some servers will refuse a "delete key 0" while others will accept it, but the official server will NOT accept "delete key 1". So I've changed it so that if no "time" argument is specified, no time argument is sent to the server. * Bug #713451: server.expect("END") needs to be in a finally block Expect an "END" when the _recv_value() raises an exception. Patch by Jay Farrimond. * Bug: #741090: cas cache can grow unbounded. Default now is that the cache is not used, unless the "Client()" object is created with "cache_cas=True". In that case, you need to have your own cas clearing code, a simple one would be to use Client().reset_cas() to completely clear the cas_ids cache. Problem pointed out by Shaun Cutts. * Bug #728359: Make python-memcache work on memcache restarts. Patch by Tarek Ziade', reviewed and further patches submitted by Hugo Beauze'e-Luysse and Neganov Alexandr. * Bug #798342: If memcached server sends unknown flag in response for "get", results in: "UnboundLocalError: local variable 'val' referenced before assignment" Now returns "None" instead. Patch by Sharoon Thomas Mon, 20 Dec 2010 19:14:17 -0700 Sean Reifschneider * Bug #680359: useOldServerHashFunction() is broken. It now correctly switches back to the old memcache hash function. Thu, 16 Dec 2010 02:07:40 -0700 Sean Reifschneider * Bug #471727: Changed the delete() code to explicitly check for both NOT_FOUND and DELETED as the responses and return successful for both. It also logs an error if one of these two responses is not found. Also added a test to ensure that delete() works. * When using set_multi and one value is too big, traceback TypeError: 'int' object is unsubscriptable Patch by Orjan Persson * Fixing Bug #529855: Server host can now be bare host without ":". Fix proposed by Roger Binns. * Fixing Bug #491164: Typo fix, "compession" -> "compRession". * Fixing Bug #509712: "TypeError: 'NoneType' object is unsubscriptable" Also fixed some other similar code to not have issues with that. * Also related to 509712 and 628339: readline() now returns '' instead of None when a server dies. This should be safer. Patch suggested by Denis Otkidach. * Fixing Bug #628339: Read from server sometimes fails. Patch by Jeremy Cowles. * Fixing Bug #633553: Add stat arguments support to get_stats(). Patch by Ryan Lane. * Changing the license to the PSF License. * Removing Evan's e-mail address at his request, changing authorship to Sean. Sat, 28 Nov 2009 01:07:42 -0700 Sean Reifschneider * Version 1.45 * Per-connection max server key length. Patch by Nicolas Delaby * Patches to make memcached more garbage-collectable. Removes "debugfunc" argument from _Host objects and changed to "debug" boolean. Patches by John McFarlane and Aryeh Katz. * Switching to a cmemcache compatible hash function. Implemented by André Cru and Ludvig Ericson. To switch back to the old style, use: memcached.useOldServerHashFunction() * Rejecting keys that have spaces in them. Patch by Etienne Posthumus. * Fixing exception raising syntax. Patch by Samuel Stauffer. * Optimizations in read code. Patch by Samuel Stauffer. * Changing classes to be newstyle. Patch by Samuel Stauffer. * Changed "has_key" to "in". Patch by Samuel Stauffer. * incr/decr were raising ValueError if the key did not exist, the docstring said it returned none. Patch by Chihiro Sakatoku. * Adding cas method, submitted by Ben Gutierrez. * Fix in the docstring for how to use the "set" method. Found and fixed by William McVey Thu, 02 Apr 2009 13:37:49 -0600 Sean Reifschneider * Version 1.44 * Allowing spaces in the key. (Patch provided by xmm on Launchpad) * Detecting when the pickler needs a positional argument. (Patch provided by Brad Clements on Launchpad) * Moving length check after the compression. (Patch provided by user Tom on Launchpad) * Fixing arguments passed to the _Error if invalid read length. * Fixing the representation of domain sockets. (Patch provided by user MTB on Launchpad) * Changing a typo of dead_until. (Patch provided by Shane R. Spencer) * Providing better error messages (patch provided by Johan Euphrosine). * Adding get_slabs() function to get stats. (Patch provided by Nick Verbeck) Sun, 01 Jun 2008 15:05:11 -0600 Sean Reifschneider * Version 1.43 * eliott reported a bug in the 1.42 related to the socket timeout code causing a traceback due to the timeout value not being set. Sat, 31 May 2008 02:09:17 -0600 Sean Reifschneider * Version 1.42 * Paul Hummer set up a Launchpad project which I'm going to start using to track patches and allow users to set up their own bzr branches and manage marging in the upstream patches with their own. https://launchpad.net/python-memcached * Patch from Jehiah Czebotar which does: Changing the calls to mark_dead() to make them dereference tuples, reducing timeout on sockets to 3 seconds, settable via setting Host._SOCKET_TIMEOUT. * Patches from Steve Schwarz for set_multi() to return the full set of keys if all servers are down. Previously would not report any keys. * Fix from Steve Schwarz delete_multi() argument "seconds" not being correctly handled. Changed it to "time" to match all other calls. * Patch from Peter Wilkinson to support using unix domain sockets. He reports that tests succeed with with memcached daemons running, the normal and a domain socket started via "memcached -s memcached.socket". I massaged it quite a bit. To use domain sockets, use a connect string of "unix:/path/to/socket" Note however that if you are using a host name of "unix", it will now detect "unix:11211" as being a domain socket with the name "11211". In this case, please use "inet:unix:11211". Because of this, it is now preferred to use a connect string prefix of "inet:" or "unix:". Tue, 29 Apr 2008 21:03:53 -0600 Sean Reifschneider * Version 1.41 * Patch from Jehiah Czebotar to catch an additional server disconnect situation. * Patch from Andrey Petrov to add the "append" and "replace" commands. Tue, 18 Sep 2007 20:52:09 -0600 Sean Reifschneider * Version 1.40 * Updated setup.py file that uses distutils provided by Kai Lautaportti. * Prevent keys from containing ASCII character 127 as well, patch provided by Philip Neustrom. * Added ability to overload the persistent_load/id, patch provided by Steve Schwarz. * Fixed ability to pass (server_hash,key) in place of key in Client.set() Reported by Alexander Klyuev. Tue, 14 Aug 2007 14:43:27 -0600 Sean Reifschneider * Version 1.39 * Michael Krause reports the previous version doesn't work for _val_to_store_info() calls because it's defined as a staticmethod. Removing staticmethod decorator. Also confirmed by Kai Lautaportti, with suggested fix of removing staticmethod. Fri, 10 Aug 2007 17:50:13 -0600 Sean Reifschneider * Version 1.38 * Matt McClanahan submitted a patch that allow add() to have a min_compress_len argument. * Steve Schwarz submitted a patch allowing user-defined picklers. * Michael Krause suggested checking the return value to prevent an exception from being raised in _set() when a value is too large to be stored. Fri, 27 Jul 2007 01:55:48 -0600 Sean Reifschneider * Version 1.37 * Fixing call from add() to _set() with parameter for min_compress_len. Reported by Jeff Fisher. Thu, 07 Jun 2007 04:10:31 -0600 Sean Reifschneider * Version 1.36 * Patch by Dave St.Germain to make the Client() class sub-class threadlocal to help with multi-threading issues. Only available in Python 2.4 and above. * Patch by James Robinson with: 1) new set_multi method. 2) factored out determining the flags, length, and value to store from set() into method _val_to_store_info() for use by both set() and set_multi(). 3) send_cmds() method on host which doesn't apply the trailing '\r\n' for use by set_multi. 4) check_key() extended a bit to allow for testing the prefix passed to set_multi just once, not once per each key. 5) Patch also enables support for auto compression in set, set_multi, and replace. * Suggestion by Helge Tesdal, fixes in check_key for non-string keys. * NOTE: On a farm of clients with multiple servers, all clients will need to be upgraded to this version. The next patch changes the server hash. * Philip Neustrom supplied a patch to change the server hash function to binascii.crc32. The original "hash()" call is not cross-platform, so big and little endian systems accessing the same memcache may end up hitting different servers. Restore the old functionality by calling: "memcached.serverHashFunction = hash" after importing memcache. * Philip Neustrom points out that passing Unicode keys or values causes problems because len(key) or len(value) is not equal to the number of bytes that are required to store the key/value. Philip provides a patch which raises an exception in this case. Raises memcache.Client.MemcachedStringEncodingError exception in this case. * NOTE: If you recompiled memcached to increase the default 1MB max value size, you will need to call "memcached.MAX_SERVER_VALUE_LENGTH = N" or memcached will not store values larger than the default 1MB. * Philip Neustrom includes another patch which checks that the key doesn't exceed the memcache server's max size. If it does, the item is silently not stored. * Philip Neustrom added a bunch of sanity checks. * Jehiah Czebotar provided a patch to make the add() and replace() functions return 0 when the add or replace fails, similar to how set() works. Sat, 16 Sep 2006 18:31:46 -0600 Sean Reifschneider * Version 1.34 * In get_multi, if the recv loop reads 0 bytes, raising an EOFError. Identified by Jim Baker. Tue, 05 Sep 2006 14:06:50 -0600 Sean Reifschneider * Version 1.33 * Including patch from Yoshinori K. Okuji to read in larger chunks for readline() calls. This should dramatically improve performance under some circumstances. Sun, 03 Sep 2006 14:02:03 -0600 Sean Reifschneider * Version 1.32 * Including patch from Philip Neustrom which checks keys sent to the server for length and bad characters. Sat, 20 May 2006 14:51:28 -0600 Sean Reifschneider * Version 1.31 * Rolled version 1.30 since the Danga folks are now listing this version as the official version. Removing the "tummy" from the version number, and incrementing so that it's clear it's more recent than "1.2". * Patch applied from Simon Forman for handling of weighted hosts. * Added a little more meat to the README. Sat, 28 Jan 2006 15:59:50 -0700 Sean Reifschneider * cludwin at socallocal suggested that the write-combining with sendall() may not be beneficial. After testing on both SMP and non-SMP machines, I can't see a significant benefit to not doing the write-combining, even on large strings. The benefits of write-combining on smaller strings seems to be significant on UP machines in tight loops. Even on strings that are larger than 2MB, there seems to be no benefit to splitting out the writes. Sun, 18 Sep 2005 18:56:31 -0600 Sean Reifschneider * Changing a printf to debuglog and catching a pickle exception, patch submitted by Justin Azoff. Thu, 14 Jul 2005 11:17:30 -0700 Sean Reifschneider * Alex Stapleton found that the sendall call was slow for writing data larger than several kilobytes. I had him test a change to his patch, which worked as well, but was simpler. The code now does two sendall calls, one for the data and one for the line termination, if the data is larger than 100 bytes. Thu, 7 Apr 2005 14:45:44 -0700 Sean Reifschneider * Incorporating some fixes to get_multi() from Bo Yang Mon, 13 Dec 2004 02:35:17 -0700 Sean Reifschneider * Simplifying the readline() function and speeding it up ~25%. * Fixing a bug in readline() if the server drops, mark_dead() was not being properly called. Sun, 12 Dec 2004 18:56:33 -0700 Sean Reifschneider * Adding "stats()" and "flush_all()" methods. Thu, 10 Aug 2003 12:17:50 -0700 Evan Martin * Slightly more verbose self-test output. * Fix mark_dead() to use proper classname. * Make pooltest.py run from the test directory. Thu, 07 Aug 2003 16:32:32 -0700 Evan Martin * Add incr, decr, and delete. * Better Python (based on comments from Uriah Welcome). * Docs, using epydoc. Thu, 07 Aug 2003 14:20:27 -0700 Evan Martin * Initial prerelease. web2py-2.12.3.orig/gluon/contrib/memcache/PKG-INFO0000664000000000000000000000053412564727262020110 0ustar rootrootMetadata-Version: 1.0 Name: python-memcached Version: 1.48 Summary: A Python memcached client library. Home-page: http://www.tummy.com/Community/software/python-memcached/ Author: Sean Reifschneider Author-email: jafo-memcached@tummy.com License: Python Software Foundation License Description: A Python memcached client library. Platform: UNKNOWN web2py-2.12.3.orig/gluon/contrib/memcache/memcache.py0000664000000000000000000015376412564727262021145 0ustar rootroot#!/usr/bin/env python """client module for memcached (memory cache daemon) Overview ======== See U{the MemCached homepage} for more about memcached. Usage summary ============= This should give you a feel for how this module operates:: import memcache mc = memcache.Client(['127.0.0.1:11211'], debug=0) mc.set("some_key", "Some value") value = mc.get("some_key") mc.set("another_key", 3) mc.delete("another_key") mc.set("key", "1") # note that the key used for incr/decr must be # a string. mc.incr("key") mc.decr("key") The standard way to use memcache with a database is like this: key = derive_key(obj) obj = mc.get(key) if not obj: obj = backend_api.get(...) mc.set(key, obj) # we now have obj, and future passes through this code # will use the object from the cache. Detailed Documentation ====================== More detailed documentation is available in the L{Client} class. """ from __future__ import print_function import binascii import os import pickle import re import socket import sys import threading import time import zlib import six def cmemcache_hash(key): return ( (((binascii.crc32(key.encode('ascii')) & 0xffffffff) >> 16) & 0x7fff) or 1) serverHashFunction = cmemcache_hash def useOldServerHashFunction(): """Use the old python-memcache server hash function.""" global serverHashFunction serverHashFunction = binascii.crc32 try: from zlib import compress, decompress _supports_compress = True except ImportError: _supports_compress = False # quickly define a decompress just in case we recv compressed data. def decompress(val): raise _Error( "Received compressed data but I don't support " "compression (import error)") from io import BytesIO try: unicode except NameError: _has_unicode = False else: _has_unicode = True try: _str_cls = basestring except NameError: _str_cls = str valid_key_chars_re = re.compile('[\x21-\x7e\x80-\xff]+$') # Original author: Evan Martin of Danga Interactive __author__ = "Sean Reifschneider " __version__ = "1.53" __copyright__ = "Copyright (C) 2003 Danga Interactive" # http://en.wikipedia.org/wiki/Python_Software_Foundation_License __license__ = "Python Software Foundation License" SERVER_MAX_KEY_LENGTH = 250 # Storing values larger than 1MB requires recompiling memcached. If # you do, this value can be changed by doing # "memcache.SERVER_MAX_VALUE_LENGTH = N" after importing this module. SERVER_MAX_VALUE_LENGTH = 1024 * 1024 class _Error(Exception): pass class _ConnectionDeadError(Exception): pass _DEAD_RETRY = 30 # number of seconds before retrying a dead server. _SOCKET_TIMEOUT = 3 # number of seconds before sockets timeout. class Client(threading.local): """Object representing a pool of memcache servers. See L{memcache} for an overview. In all cases where a key is used, the key can be either: 1. A simple hashable type (string, integer, etc.). 2. A tuple of C{(hashvalue, key)}. This is useful if you want to avoid making this module calculate a hash value. You may prefer, for example, to keep all of a given user's objects on the same memcache server, so you could use the user's unique id as the hash value. @group Setup: __init__, set_servers, forget_dead_hosts, disconnect_all, debuglog @group Insertion: set, add, replace, set_multi @group Retrieval: get, get_multi @group Integers: incr, decr @group Removal: delete, delete_multi @sort: __init__, set_servers, forget_dead_hosts, disconnect_all, debuglog,\ set, set_multi, add, replace, get, get_multi, incr, decr, delete, delete_multi """ _FLAG_PICKLE = 1 << 0 _FLAG_INTEGER = 1 << 1 _FLAG_LONG = 1 << 2 _FLAG_COMPRESSED = 1 << 3 _SERVER_RETRIES = 10 # how many times to try finding a free server. # exceptions for Client class MemcachedKeyError(Exception): pass class MemcachedKeyLengthError(MemcachedKeyError): pass class MemcachedKeyCharacterError(MemcachedKeyError): pass class MemcachedKeyNoneError(MemcachedKeyError): pass class MemcachedKeyTypeError(MemcachedKeyError): pass class MemcachedStringEncodingError(Exception): pass def __init__(self, servers, debug=0, pickleProtocol=0, pickler=pickle.Pickler, unpickler=pickle.Unpickler, pload=None, pid=None, server_max_key_length=None, server_max_value_length=None, dead_retry=_DEAD_RETRY, socket_timeout=_SOCKET_TIMEOUT, cache_cas=False, flush_on_reconnect=0, check_keys=True): """Create a new Client object with the given list of servers. @param servers: C{servers} is passed to L{set_servers}. @param debug: whether to display error messages when a server can't be contacted. @param pickleProtocol: number to mandate protocol used by (c)Pickle. @param pickler: optional override of default Pickler to allow subclassing. @param unpickler: optional override of default Unpickler to allow subclassing. @param pload: optional persistent_load function to call on pickle loading. Useful for cPickle since subclassing isn't allowed. @param pid: optional persistent_id function to call on pickle storing. Useful for cPickle since subclassing isn't allowed. @param dead_retry: number of seconds before retrying a blacklisted server. Default to 30 s. @param socket_timeout: timeout in seconds for all calls to a server. Defaults to 3 seconds. @param cache_cas: (default False) If true, cas operations will be cached. WARNING: This cache is not expired internally, if you have a long-running process you will need to expire it manually via client.reset_cas(), or the cache can grow unlimited. @param server_max_key_length: (default SERVER_MAX_KEY_LENGTH) Data that is larger than this will not be sent to the server. @param server_max_value_length: (default SERVER_MAX_VALUE_LENGTH) Data that is larger than this will not be sent to the server. @param flush_on_reconnect: optional flag which prevents a scenario that can cause stale data to be read: If there's more than one memcached server and the connection to one is interrupted, keys that mapped to that server will get reassigned to another. If the first server comes back, those keys will map to it again. If it still has its data, get()s can read stale data that was overwritten on another server. This flag is off by default for backwards compatibility. @param check_keys: (default True) If True, the key is checked to ensure it is the correct length and composed of the right characters. """ super(Client, self).__init__() self.debug = debug self.dead_retry = dead_retry self.socket_timeout = socket_timeout self.flush_on_reconnect = flush_on_reconnect self.set_servers(servers) self.stats = {} self.cache_cas = cache_cas self.reset_cas() self.do_check_key = check_keys # Allow users to modify pickling/unpickling behavior self.pickleProtocol = pickleProtocol self.pickler = pickler self.unpickler = unpickler self.persistent_load = pload self.persistent_id = pid self.server_max_key_length = server_max_key_length if self.server_max_key_length is None: self.server_max_key_length = SERVER_MAX_KEY_LENGTH self.server_max_value_length = server_max_value_length if self.server_max_value_length is None: self.server_max_value_length = SERVER_MAX_VALUE_LENGTH # figure out the pickler style file = BytesIO() try: pickler = self.pickler(file, protocol=self.pickleProtocol) self.picklerIsKeyword = True except TypeError: self.picklerIsKeyword = False def reset_cas(self): """Reset the cas cache. This is only used if the Client() object was created with "cache_cas=True". If used, this cache does not expire internally, so it can grow unbounded if you do not clear it yourself. """ self.cas_ids = {} def set_servers(self, servers): """Set the pool of servers used by this client. @param servers: an array of servers. Servers can be passed in two forms: 1. Strings of the form C{"host:port"}, which implies a default weight of 1. 2. Tuples of the form C{("host:port", weight)}, where C{weight} is an integer weight value. """ self.servers = [_Host(s, self.debug, dead_retry=self.dead_retry, socket_timeout=self.socket_timeout, flush_on_reconnect=self.flush_on_reconnect) for s in servers] self._init_buckets() def get_stats(self, stat_args=None): """Get statistics from each of the servers. @param stat_args: Additional arguments to pass to the memcache "stats" command. @return: A list of tuples ( server_identifier, stats_dictionary ). The dictionary contains a number of name/value pairs specifying the name of the status field and the string value associated with it. The values are not converted from strings. """ data = [] for s in self.servers: if not s.connect(): continue if s.family == socket.AF_INET: name = '%s:%s (%s)' % (s.ip, s.port, s.weight) elif s.family == socket.AF_INET6: name = '[%s]:%s (%s)' % (s.ip, s.port, s.weight) else: name = 'unix:%s (%s)' % (s.address, s.weight) if not stat_args: s.send_cmd('stats') else: s.send_cmd('stats ' + stat_args) serverData = {} data.append((name, serverData)) readline = s.readline while 1: line = readline() if not line or line.strip() == 'END': break stats = line.split(' ', 2) serverData[stats[1]] = stats[2] return(data) def get_slabs(self): data = [] for s in self.servers: if not s.connect(): continue if s.family == socket.AF_INET: name = '%s:%s (%s)' % (s.ip, s.port, s.weight) elif s.family == socket.AF_INET6: name = '[%s]:%s (%s)' % (s.ip, s.port, s.weight) else: name = 'unix:%s (%s)' % (s.address, s.weight) serverData = {} data.append((name, serverData)) s.send_cmd('stats items') readline = s.readline while 1: line = readline() if not line or line.strip() == 'END': break item = line.split(' ', 2) # 0 = STAT, 1 = ITEM, 2 = Value slab = item[1].split(':', 2) # 0 = items, 1 = Slab #, 2 = Name if slab[1] not in serverData: serverData[slab[1]] = {} serverData[slab[1]][slab[2]] = item[2] return data def flush_all(self): """Expire all data in memcache servers that are reachable.""" for s in self.servers: if not s.connect(): continue s.flush() def debuglog(self, str): if self.debug: sys.stderr.write("MemCached: %s\n" % str) def _statlog(self, func): if func not in self.stats: self.stats[func] = 1 else: self.stats[func] += 1 def forget_dead_hosts(self): """Reset every host in the pool to an "alive" state.""" for s in self.servers: s.deaduntil = 0 def _init_buckets(self): self.buckets = [] for server in self.servers: for i in range(server.weight): self.buckets.append(server) def _get_server(self, key): if isinstance(key, tuple): serverhash, key = key else: serverhash = serverHashFunction(key) if not self.buckets: return None, None for i in range(Client._SERVER_RETRIES): server = self.buckets[serverhash % len(self.buckets)] if server.connect(): # print("(using server %s)" % server,) return server, key serverhash = serverHashFunction(str(serverhash) + str(i)) return None, None def disconnect_all(self): for s in self.servers: s.close_socket() def delete_multi(self, keys, time=0, key_prefix=''): """Delete multiple keys in the memcache doing just one query. >>> notset_keys = mc.set_multi({'a1' : 'val1', 'a2' : 'val2'}) >>> mc.get_multi(['a1', 'a2']) == {'a1' : 'val1','a2' : 'val2'} 1 >>> mc.delete_multi(['key1', 'key2']) 1 >>> mc.get_multi(['key1', 'key2']) == {} 1 This method is recommended over iterated regular L{delete}s as it reduces total latency, since your app doesn't have to wait for each round-trip of L{delete} before sending the next one. @param keys: An iterable of keys to clear @param time: number of seconds any subsequent set / update commands should fail. Defaults to 0 for no delay. @param key_prefix: Optional string to prepend to each key when sending to memcache. See docs for L{get_multi} and L{set_multi}. @return: 1 if no failure in communication with any memcacheds. @rtype: int """ self._statlog('delete_multi') server_keys, prefixed_to_orig_key = self._map_and_prefix_keys( keys, key_prefix) # send out all requests on each server before reading anything dead_servers = [] rc = 1 for server in six.iterkeys(server_keys): bigcmd = [] write = bigcmd.append if time is not None: for key in server_keys[server]: # These are mangled keys write("delete %s %d\r\n" % (key, time)) else: for key in server_keys[server]: # These are mangled keys write("delete %s\r\n" % key) try: server.send_cmds(''.join(bigcmd)) except socket.error as msg: rc = 0 if isinstance(msg, tuple): msg = msg[1] server.mark_dead(msg) dead_servers.append(server) # if any servers died on the way, don't expect them to respond. for server in dead_servers: del server_keys[server] for server, keys in six.iteritems(server_keys): try: for key in keys: server.expect("DELETED") except socket.error as msg: if isinstance(msg, tuple): msg = msg[1] server.mark_dead(msg) rc = 0 return rc def delete(self, key, time=0): '''Deletes a key from the memcache. @return: Nonzero on success. @param time: number of seconds any subsequent set / update commands should fail. Defaults to None for no delay. @rtype: int ''' return self._deletetouch(['DELETED', 'NOT_FOUND'], "delete", key, time) def touch(self, key, time=0): '''Updates the expiration time of a key in memcache. @return: Nonzero on success. @param time: Tells memcached the time which this value should expire, either as a delta number of seconds, or an absolute unix time-since-the-epoch value. See the memcached protocol docs section "Storage Commands" for more info on . We default to 0 == cache forever. @rtype: int ''' return self._deletetouch(['TOUCHED'], "touch", key, time) def _deletetouch(self, expected, cmd, key, time=0): if self.do_check_key: self.check_key(key) server, key = self._get_server(key) if not server: return 0 self._statlog(cmd) if time is not None and time != 0: cmd = "%s %s %d" % (cmd, key, time) else: cmd = "%s %s" % (cmd, key) try: server.send_cmd(cmd) line = server.readline() if line and line.strip() in expected: return 1 self.debuglog('%s expected %s, got: %r' % (cmd, ' or '.join(expected), line)) except socket.error as msg: if isinstance(msg, tuple): msg = msg[1] server.mark_dead(msg) return 0 def incr(self, key, delta=1): """Increment value for C{key} by C{delta} Sends a command to the server to atomically increment the value for C{key} by C{delta}, or by 1 if C{delta} is unspecified. Returns None if C{key} doesn't exist on server, otherwise it returns the new value after incrementing. Note that the value for C{key} must already exist in the memcache, and it must be the string representation of an integer. >>> mc.set("counter", "20") # returns 1, indicating success 1 >>> mc.incr("counter") 21 >>> mc.incr("counter") 22 Overflow on server is not checked. Be aware of values approaching 2**32. See L{decr}. @param delta: Integer amount to increment by (should be zero or greater). @return: New value after incrementing. @rtype: int """ return self._incrdecr("incr", key, delta) def decr(self, key, delta=1): """Decrement value for C{key} by C{delta} Like L{incr}, but decrements. Unlike L{incr}, underflow is checked and new values are capped at 0. If server value is 1, a decrement of 2 returns 0, not -1. @param delta: Integer amount to decrement by (should be zero or greater). @return: New value after decrementing or None on error. @rtype: int """ return self._incrdecr("decr", key, delta) def _incrdecr(self, cmd, key, delta): if self.do_check_key: self.check_key(key) server, key = self._get_server(key) if not server: return None self._statlog(cmd) cmd = "%s %s %d" % (cmd, key, delta) try: server.send_cmd(cmd) line = server.readline() if line is None or line.strip() == 'NOT_FOUND': return None return int(line) except socket.error as msg: if isinstance(msg, tuple): msg = msg[1] server.mark_dead(msg) return None def add(self, key, val, time=0, min_compress_len=0): '''Add new key with value. Like L{set}, but only stores in memcache if the key doesn't already exist. @return: Nonzero on success. @rtype: int ''' return self._set("add", key, val, time, min_compress_len) def append(self, key, val, time=0, min_compress_len=0): '''Append the value to the end of the existing key's value. Only stores in memcache if key already exists. Also see L{prepend}. @return: Nonzero on success. @rtype: int ''' return self._set("append", key, val, time, min_compress_len) def prepend(self, key, val, time=0, min_compress_len=0): '''Prepend the value to the beginning of the existing key's value. Only stores in memcache if key already exists. Also see L{append}. @return: Nonzero on success. @rtype: int ''' return self._set("prepend", key, val, time, min_compress_len) def replace(self, key, val, time=0, min_compress_len=0): '''Replace existing key with value. Like L{set}, but only stores in memcache if the key already exists. The opposite of L{add}. @return: Nonzero on success. @rtype: int ''' return self._set("replace", key, val, time, min_compress_len) def set(self, key, val, time=0, min_compress_len=0): '''Unconditionally sets a key to a given value in the memcache. The C{key} can optionally be an tuple, with the first element being the server hash value and the second being the key. If you want to avoid making this module calculate a hash value. You may prefer, for example, to keep all of a given user's objects on the same memcache server, so you could use the user's unique id as the hash value. @return: Nonzero on success. @rtype: int @param time: Tells memcached the time which this value should expire, either as a delta number of seconds, or an absolute unix time-since-the-epoch value. See the memcached protocol docs section "Storage Commands" for more info on . We default to 0 == cache forever. @param min_compress_len: The threshold length to kick in auto-compression of the value using the zlib.compress() routine. If the value being cached is a string, then the length of the string is measured, else if the value is an object, then the length of the pickle result is measured. If the resulting attempt at compression yeilds a larger string than the input, then it is discarded. For backwards compatability, this parameter defaults to 0, indicating don't ever try to compress. ''' return self._set("set", key, val, time, min_compress_len) def cas(self, key, val, time=0, min_compress_len=0): '''Check and set (CAS) Sets a key to a given value in the memcache if it hasn't been altered since last fetched. (See L{gets}). The C{key} can optionally be an tuple, with the first element being the server hash value and the second being the key. If you want to avoid making this module calculate a hash value. You may prefer, for example, to keep all of a given user's objects on the same memcache server, so you could use the user's unique id as the hash value. @return: Nonzero on success. @rtype: int @param time: Tells memcached the time which this value should expire, either as a delta number of seconds, or an absolute unix time-since-the-epoch value. See the memcached protocol docs section "Storage Commands" for more info on . We default to 0 == cache forever. @param min_compress_len: The threshold length to kick in auto-compression of the value using the zlib.compress() routine. If the value being cached is a string, then the length of the string is measured, else if the value is an object, then the length of the pickle result is measured. If the resulting attempt at compression yeilds a larger string than the input, then it is discarded. For backwards compatability, this parameter defaults to 0, indicating don't ever try to compress. ''' return self._set("cas", key, val, time, min_compress_len) def _map_and_prefix_keys(self, key_iterable, key_prefix): """Compute the mapping of server (_Host instance) -> list of keys to stuff onto that server, as well as the mapping of prefixed key -> original key. """ # Check it just once ... key_extra_len = len(key_prefix) if key_prefix and self.do_check_key: self.check_key(key_prefix) # server (_Host) -> list of unprefixed server keys in mapping server_keys = {} prefixed_to_orig_key = {} # build up a list for each server of all the keys we want. for orig_key in key_iterable: if isinstance(orig_key, tuple): # Tuple of hashvalue, key ala _get_server(). Caller is # essentially telling us what server to stuff this on. # Ensure call to _get_server gets a Tuple as well. str_orig_key = str(orig_key[1]) # Gotta pre-mangle key before hashing to a # server. Returns the mangled key. server, key = self._get_server( (orig_key[0], key_prefix + str_orig_key)) else: # set_multi supports int / long keys. str_orig_key = str(orig_key) server, key = self._get_server(key_prefix + str_orig_key) # Now check to make sure key length is proper ... if self.do_check_key: self.check_key(str_orig_key, key_extra_len=key_extra_len) if not server: continue if server not in server_keys: server_keys[server] = [] server_keys[server].append(key) prefixed_to_orig_key[key] = orig_key return (server_keys, prefixed_to_orig_key) def set_multi(self, mapping, time=0, key_prefix='', min_compress_len=0): '''Sets multiple keys in the memcache doing just one query. >>> notset_keys = mc.set_multi({'key1' : 'val1', 'key2' : 'val2'}) >>> mc.get_multi(['key1', 'key2']) == {'key1' : 'val1', ... 'key2' : 'val2'} 1 This method is recommended over regular L{set} as it lowers the number of total packets flying around your network, reducing total latency, since your app doesn't have to wait for each round-trip of L{set} before sending the next one. @param mapping: A dict of key/value pairs to set. @param time: Tells memcached the time which this value should expire, either as a delta number of seconds, or an absolute unix time-since-the-epoch value. See the memcached protocol docs section "Storage Commands" for more info on . We default to 0 == cache forever. @param key_prefix: Optional string to prepend to each key when sending to memcache. Allows you to efficiently stuff these keys into a pseudo-namespace in memcache: >>> notset_keys = mc.set_multi( ... {'key1' : 'val1', 'key2' : 'val2'}, ... key_prefix='subspace_') >>> len(notset_keys) == 0 True >>> mc.get_multi(['subspace_key1', ... 'subspace_key2']) == {'subspace_key1': 'val1', ... 'subspace_key2' : 'val2'} True Causes key 'subspace_key1' and 'subspace_key2' to be set. Useful in conjunction with a higher-level layer which applies namespaces to data in memcache. In this case, the return result would be the list of notset original keys, prefix not applied. @param min_compress_len: The threshold length to kick in auto-compression of the value using the zlib.compress() routine. If the value being cached is a string, then the length of the string is measured, else if the value is an object, then the length of the pickle result is measured. If the resulting attempt at compression yeilds a larger string than the input, then it is discarded. For backwards compatability, this parameter defaults to 0, indicating don't ever try to compress. @return: List of keys which failed to be stored [ memcache out of memory, etc. ]. @rtype: list ''' self._statlog('set_multi') server_keys, prefixed_to_orig_key = self._map_and_prefix_keys( six.iterkeys(mapping), key_prefix) # send out all requests on each server before reading anything dead_servers = [] notstored = [] # original keys. for server in six.iterkeys(server_keys): bigcmd = [] write = bigcmd.append try: for key in server_keys[server]: # These are mangled keys store_info = self._val_to_store_info( mapping[prefixed_to_orig_key[key]], min_compress_len) if store_info: msg = "set %s %d %d %d\r\n%s\r\n" write(msg % (key, store_info[0], time, store_info[1], store_info[2])) else: notstored.append(prefixed_to_orig_key[key]) server.send_cmds(''.join(bigcmd)) except socket.error as msg: if isinstance(msg, tuple): msg = msg[1] server.mark_dead(msg) dead_servers.append(server) # if any servers died on the way, don't expect them to respond. for server in dead_servers: del server_keys[server] # short-circuit if there are no servers, just return all keys if not server_keys: return(mapping.keys()) for server, keys in six.iteritems(server_keys): try: for key in keys: if server.readline() == 'STORED': continue else: # un-mangle. notstored.append(prefixed_to_orig_key[key]) except (_Error, socket.error) as msg: if isinstance(msg, tuple): msg = msg[1] server.mark_dead(msg) return notstored def _val_to_store_info(self, val, min_compress_len): """Transform val to a storable representation. Returns a tuple of the flags, the length of the new value, and the new value itself. """ flags = 0 if isinstance(val, str): pass elif isinstance(val, int): flags |= Client._FLAG_INTEGER val = "%d" % val # force no attempt to compress this silly string. min_compress_len = 0 elif isinstance(val, long): flags |= Client._FLAG_LONG val = "%d" % val # force no attempt to compress this silly string. min_compress_len = 0 else: flags |= Client._FLAG_PICKLE file = BytesIO() if self.picklerIsKeyword: pickler = self.pickler(file, protocol=self.pickleProtocol) else: pickler = self.pickler(file, self.pickleProtocol) if self.persistent_id: pickler.persistent_id = self.persistent_id pickler.dump(val) val = file.getvalue() lv = len(val) # We should try to compress if min_compress_len > 0 and we # could import zlib and this string is longer than our min # threshold. if min_compress_len and lv > min_compress_len: comp_val = zlib.compress(val) # Only retain the result if the compression result is smaller # than the original. if len(comp_val) < lv: flags |= Client._FLAG_COMPRESSED val = comp_val # silently do not store if value length exceeds maximum if (self.server_max_value_length != 0 and len(val) > self.server_max_value_length): return(0) return (flags, len(val), val) def _set(self, cmd, key, val, time, min_compress_len=0): if self.do_check_key: self.check_key(key) server, key = self._get_server(key) if not server: return 0 def _unsafe_set(): self._statlog(cmd) store_info = self._val_to_store_info(val, min_compress_len) if not store_info: return(0) if cmd == 'cas': if key not in self.cas_ids: return self._set('set', key, val, time, min_compress_len) fullcmd = "%s %s %d %d %d %d\r\n%s" % ( cmd, key, store_info[0], time, store_info[1], self.cas_ids[key], store_info[2]) else: fullcmd = "%s %s %d %d %d\r\n%s" % ( cmd, key, store_info[0], time, store_info[1], store_info[2] ) try: server.send_cmd(fullcmd) return(server.expect("STORED", raise_exception=True) == "STORED") except socket.error as msg: if isinstance(msg, tuple): msg = msg[1] server.mark_dead(msg) return 0 try: return _unsafe_set() except _ConnectionDeadError: # retry once try: if server._get_socket(): return _unsafe_set() except (_ConnectionDeadError, socket.error) as msg: server.mark_dead(msg) return 0 def _get(self, cmd, key): if self.do_check_key: self.check_key(key) server, key = self._get_server(key) if not server: return None def _unsafe_get(): self._statlog(cmd) try: server.send_cmd("%s %s" % (cmd, key)) rkey = flags = rlen = cas_id = None if cmd == 'gets': rkey, flags, rlen, cas_id, = self._expect_cas_value( server, raise_exception=True ) if rkey and self.cache_cas: self.cas_ids[rkey] = cas_id else: rkey, flags, rlen, = self._expectvalue( server, raise_exception=True ) if not rkey: return None try: value = self._recv_value(server, flags, rlen) finally: server.expect("END", raise_exception=True) except (_Error, socket.error) as msg: if isinstance(msg, tuple): msg = msg[1] server.mark_dead(msg) return None return value try: return _unsafe_get() except _ConnectionDeadError: # retry once try: if server.connect(): return _unsafe_get() return None except (_ConnectionDeadError, socket.error) as msg: server.mark_dead(msg) return None def get(self, key): '''Retrieves a key from the memcache. @return: The value or None. ''' return self._get('get', key) def gets(self, key): '''Retrieves a key from the memcache. Used in conjunction with 'cas'. @return: The value or None. ''' return self._get('gets', key) def get_multi(self, keys, key_prefix=''): '''Retrieves multiple keys from the memcache doing just one query. >>> success = mc.set("foo", "bar") >>> success = mc.set("baz", 42) >>> mc.get_multi(["foo", "baz", "foobar"]) == { ... "foo": "bar", "baz": 42 ... } 1 >>> mc.set_multi({'k1' : 1, 'k2' : 2}, key_prefix='pfx_') == [] 1 This looks up keys 'pfx_k1', 'pfx_k2', ... . Returned dict will just have unprefixed keys 'k1', 'k2'. >>> mc.get_multi(['k1', 'k2', 'nonexist'], ... key_prefix='pfx_') == {'k1' : 1, 'k2' : 2} 1 get_mult [ and L{set_multi} ] can take str()-ables like ints / longs as keys too. Such as your db pri key fields. They're rotored through str() before being passed off to memcache, with or without the use of a key_prefix. In this mode, the key_prefix could be a table name, and the key itself a db primary key number. >>> mc.set_multi({42: 'douglass adams', ... 46: 'and 2 just ahead of me'}, ... key_prefix='numkeys_') == [] 1 >>> mc.get_multi([46, 42], key_prefix='numkeys_') == { ... 42: 'douglass adams', ... 46: 'and 2 just ahead of me' ... } 1 This method is recommended over regular L{get} as it lowers the number of total packets flying around your network, reducing total latency, since your app doesn't have to wait for each round-trip of L{get} before sending the next one. See also L{set_multi}. @param keys: An array of keys. @param key_prefix: A string to prefix each key when we communicate with memcache. Facilitates pseudo-namespaces within memcache. Returned dictionary keys will not have this prefix. @return: A dictionary of key/value pairs that were available. If key_prefix was provided, the keys in the retured dictionary will not have it present. ''' self._statlog('get_multi') server_keys, prefixed_to_orig_key = self._map_and_prefix_keys( keys, key_prefix) # send out all requests on each server before reading anything dead_servers = [] for server in six.iterkeys(server_keys): try: server.send_cmd("get %s" % " ".join(server_keys[server])) except socket.error as msg: if isinstance(msg, tuple): msg = msg[1] server.mark_dead(msg) dead_servers.append(server) # if any servers died on the way, don't expect them to respond. for server in dead_servers: del server_keys[server] retvals = {} for server in six.iterkeys(server_keys): try: line = server.readline() while line and line != 'END': rkey, flags, rlen = self._expectvalue(server, line) # Bo Yang reports that this can sometimes be None if rkey is not None: val = self._recv_value(server, flags, rlen) # un-prefix returned key. retvals[prefixed_to_orig_key[rkey]] = val line = server.readline() except (_Error, socket.error) as msg: if isinstance(msg, tuple): msg = msg[1] server.mark_dead(msg) return retvals def _expect_cas_value(self, server, line=None, raise_exception=False): if not line: line = server.readline(raise_exception) if line and line[:5] == 'VALUE': resp, rkey, flags, len, cas_id = line.split() return (rkey, int(flags), int(len), int(cas_id)) else: return (None, None, None, None) def _expectvalue(self, server, line=None, raise_exception=False): if not line: line = server.readline(raise_exception) if line and line[:5] == 'VALUE': resp, rkey, flags, len = line.split() flags = int(flags) rlen = int(len) return (rkey, flags, rlen) else: return (None, None, None) def _recv_value(self, server, flags, rlen): rlen += 2 # include \r\n buf = server.recv(rlen) if len(buf) != rlen: raise _Error("received %d bytes when expecting %d" % (len(buf), rlen)) if len(buf) == rlen: buf = buf[:-2] # strip \r\n if flags & Client._FLAG_COMPRESSED: buf = zlib.decompress(buf) if flags == 0 or flags == Client._FLAG_COMPRESSED: # Either a bare string or a compressed string now decompressed... val = buf elif flags & Client._FLAG_INTEGER: val = int(buf) elif flags & Client._FLAG_LONG: val = long(buf) elif flags & Client._FLAG_PICKLE: try: file = BytesIO(buf) unpickler = self.unpickler(file) if self.persistent_load: unpickler.persistent_load = self.persistent_load val = unpickler.load() except Exception as e: self.debuglog('Pickle error: %s\n' % e) return None else: self.debuglog("unknown flags on get: %x\n" % flags) raise ValueError('Unknown flags on get: %x' % flags) return val def check_key(self, key, key_extra_len=0): """Checks sanity of key. Fails if: Key length is > SERVER_MAX_KEY_LENGTH (Raises MemcachedKeyLength). Contains control characters (Raises MemcachedKeyCharacterError). Is not a string (Raises MemcachedStringEncodingError) Is an unicode string (Raises MemcachedStringEncodingError) Is not a string (Raises MemcachedKeyError) Is None (Raises MemcachedKeyError) """ if isinstance(key, tuple): key = key[1] if not key: raise Client.MemcachedKeyNoneError("Key is None") # Make sure we're not a specific unicode type, if we're old enough that # it's a separate type. if _has_unicode is True and isinstance(key, unicode): raise Client.MemcachedStringEncodingError( "Keys must be str()'s, not unicode. Convert your unicode " "strings using mystring.encode(charset)!") if not isinstance(key, str): raise Client.MemcachedKeyTypeError("Key must be str()'s") if isinstance(key, _str_cls): if (self.server_max_key_length != 0 and len(key) + key_extra_len > self.server_max_key_length): raise Client.MemcachedKeyLengthError( "Key length is > %s" % self.server_max_key_length ) if not valid_key_chars_re.match(key): raise Client.MemcachedKeyCharacterError( "Control characters not allowed") class _Host(object): def __init__(self, host, debug=0, dead_retry=_DEAD_RETRY, socket_timeout=_SOCKET_TIMEOUT, flush_on_reconnect=0): self.dead_retry = dead_retry self.socket_timeout = socket_timeout self.debug = debug self.flush_on_reconnect = flush_on_reconnect if isinstance(host, tuple): host, self.weight = host else: self.weight = 1 # parse the connection string m = re.match(r'^(?Punix):(?P.*)$', host) if not m: m = re.match(r'^(?Pinet6):' r'\[(?P[^\[\]]+)\](:(?P[0-9]+))?$', host) if not m: m = re.match(r'^(?Pinet):' r'(?P[^:]+)(:(?P[0-9]+))?$', host) if not m: m = re.match(r'^(?P[^:]+)(:(?P[0-9]+))?$', host) if not m: raise ValueError('Unable to parse connection string: "%s"' % host) hostData = m.groupdict() if hostData.get('proto') == 'unix': self.family = socket.AF_UNIX self.address = hostData['path'] elif hostData.get('proto') == 'inet6': self.family = socket.AF_INET6 self.ip = hostData['host'] self.port = int(hostData.get('port') or 11211) self.address = (self.ip, self.port) else: self.family = socket.AF_INET self.ip = hostData['host'] self.port = int(hostData.get('port') or 11211) self.address = (self.ip, self.port) self.deaduntil = 0 self.socket = None self.flush_on_next_connect = 0 self.buffer = '' def debuglog(self, str): if self.debug: sys.stderr.write("MemCached: %s\n" % str) def _check_dead(self): if self.deaduntil and self.deaduntil > time.time(): return 1 self.deaduntil = 0 return 0 def connect(self): if self._get_socket(): return 1 return 0 def mark_dead(self, reason): self.debuglog("MemCache: %s: %s. Marking dead." % (self, reason)) self.deaduntil = time.time() + self.dead_retry if self.flush_on_reconnect: self.flush_on_next_connect = 1 self.close_socket() def _get_socket(self): if self._check_dead(): return None if self.socket: return self.socket s = socket.socket(self.family, socket.SOCK_STREAM) if hasattr(s, 'settimeout'): s.settimeout(self.socket_timeout) try: s.connect(self.address) except socket.timeout as msg: self.mark_dead("connect: %s" % msg) return None except socket.error as msg: if isinstance(msg, tuple): msg = msg[1] self.mark_dead("connect: %s" % msg) return None self.socket = s self.buffer = '' if self.flush_on_next_connect: self.flush() self.flush_on_next_connect = 0 return s def close_socket(self): if self.socket: self.socket.close() self.socket = None def send_cmd(self, cmd): self.socket.sendall(cmd + '\r\n') def send_cmds(self, cmds): """cmds already has trailing \r\n's applied.""" self.socket.sendall(cmds) def readline(self, raise_exception=False): """Read a line and return it. If "raise_exception" is set, raise _ConnectionDeadError if the read fails, otherwise return an empty string. """ buf = self.buffer if self.socket: recv = self.socket.recv else: recv = lambda bufsize: '' while True: index = buf.find('\r\n') if index >= 0: break data = recv(4096) if not data: # connection close, let's kill it and raise self.mark_dead('connection closed in readline()') if raise_exception: raise _ConnectionDeadError() else: return '' buf += data self.buffer = buf[index + 2:] return buf[:index] def expect(self, text, raise_exception=False): line = self.readline(raise_exception) if line != text: self.debuglog("while expecting '%s', got unexpected response '%s'" % (text, line)) return line def recv(self, rlen): self_socket_recv = self.socket.recv buf = self.buffer while len(buf) < rlen: foo = self_socket_recv(max(rlen - len(buf), 4096)) buf += foo if not foo: raise _Error('Read %d bytes, expecting %d, ' 'read returned 0 length bytes' % (len(buf), rlen)) self.buffer = buf[rlen:] return buf[:rlen] def flush(self): self.send_cmd('flush_all') self.expect('OK') def __str__(self): d = '' if self.deaduntil: d = " (dead until %d)" % self.deaduntil if self.family == socket.AF_INET: return "inet:%s:%d%s" % (self.address[0], self.address[1], d) elif self.family == socket.AF_INET6: return "inet6:[%s]:%d%s" % (self.address[0], self.address[1], d) else: return "unix:%s%s" % (self.address, d) def _doctest(): import doctest import memcache servers = ["127.0.0.1:11211"] mc = Client(servers, debug=1) globs = {"mc": mc} return doctest.testmod(memcache, globs=globs) if __name__ == "__main__": failures = 0 print("Testing docstrings...") _doctest() print("Running tests:") print() serverList = [["127.0.0.1:11211"]] if '--do-unix' in sys.argv: serverList.append([os.path.join(os.getcwd(), 'memcached.socket')]) for servers in serverList: mc = Client(servers, debug=1) def to_s(val): if not isinstance(val, _str_cls): return "%s (%s)" % (val, type(val)) return "%s" % val def test_setget(key, val): global failures print("Testing set/get {'%s': %s} ..." % (to_s(key), to_s(val)), end=" ") mc.set(key, val) newval = mc.get(key) if newval == val: print("OK") return 1 else: print("FAIL") failures += 1 return 0 class FooStruct(object): def __init__(self): self.bar = "baz" def __str__(self): return "A FooStruct" def __eq__(self, other): if isinstance(other, FooStruct): return self.bar == other.bar return 0 test_setget("a_string", "some random string") test_setget("an_integer", 42) if test_setget("long", long(1 << 30)): print("Testing delete ...", end=" ") if mc.delete("long"): print("OK") else: print("FAIL") failures += 1 print("Checking results of delete ...", end=" ") if mc.get("long") is None: print("OK") else: print("FAIL") failures += 1 print("Testing get_multi ...",) print(mc.get_multi(["a_string", "an_integer"])) # removed from the protocol # if test_setget("timed_delete", 'foo'): # print "Testing timed delete ...", # if mc.delete("timed_delete", 1): # print("OK") # else: # print("FAIL") # failures += 1 # print "Checking results of timed delete ..." # if mc.get("timed_delete") is None: # print("OK") # else: # print("FAIL") # failures += 1 print("Testing get(unknown value) ...", end=" ") print(to_s(mc.get("unknown_value"))) f = FooStruct() test_setget("foostruct", f) print("Testing incr ...", end=" ") x = mc.incr("an_integer", 1) if x == 43: print("OK") else: print("FAIL") failures += 1 print("Testing decr ...", end=" ") x = mc.decr("an_integer", 1) if x == 42: print("OK") else: print("FAIL") failures += 1 sys.stdout.flush() # sanity tests print("Testing sending spaces...", end=" ") sys.stdout.flush() try: x = mc.set("this has spaces", 1) except Client.MemcachedKeyCharacterError as msg: print("OK") else: print("FAIL") failures += 1 print("Testing sending control characters...", end=" ") try: x = mc.set("this\x10has\x11control characters\x02", 1) except Client.MemcachedKeyCharacterError as msg: print("OK") else: print("FAIL") failures += 1 print("Testing using insanely long key...", end=" ") try: x = mc.set('a'*SERVER_MAX_KEY_LENGTH, 1) except Client.MemcachedKeyLengthError as msg: print("FAIL") failures += 1 else: print("OK") try: x = mc.set('a'*SERVER_MAX_KEY_LENGTH + 'a', 1) except Client.MemcachedKeyLengthError as msg: print("OK") else: print("FAIL") failures += 1 print("Testing sending a unicode-string key...", end=" ") try: x = mc.set(unicode('keyhere'), 1) except Client.MemcachedStringEncodingError as msg: print("OK", end=" ") else: print("FAIL", end=" ") failures += 1 try: x = mc.set((unicode('a')*SERVER_MAX_KEY_LENGTH).encode('utf-8'), 1) except Client.MemcachedKeyError: print("FAIL", end=" ") failures += 1 else: print("OK", end=" ") s = pickle.loads('V\\u4f1a\np0\n.') try: x = mc.set((s * SERVER_MAX_KEY_LENGTH).encode('utf-8'), 1) except Client.MemcachedKeyLengthError: print("OK") else: print("FAIL") failures += 1 print("Testing using a value larger than the memcached value limit...") print('NOTE: "MemCached: while expecting[...]" is normal...') x = mc.set('keyhere', 'a'*SERVER_MAX_VALUE_LENGTH) if mc.get('keyhere') is None: print("OK", end=" ") else: print("FAIL", end=" ") failures += 1 x = mc.set('keyhere', 'a'*SERVER_MAX_VALUE_LENGTH + 'aaa') if mc.get('keyhere') is None: print("OK") else: print("FAIL") failures += 1 print("Testing set_multi() with no memcacheds running", end=" ") mc.disconnect_all() errors = mc.set_multi({'keyhere': 'a', 'keythere': 'b'}) if errors != []: print("FAIL") failures += 1 else: print("OK") print("Testing delete_multi() with no memcacheds running", end=" ") mc.disconnect_all() ret = mc.delete_multi({'keyhere': 'a', 'keythere': 'b'}) if ret != 1: print("FAIL") failures += 1 else: print("OK") if failures > 0: print('*** THERE WERE FAILED TESTS') sys.exit(1) sys.exit(0) # vim: ts=4 sw=4 et : web2py-2.12.3.orig/gluon/contrib/memcache/README0000664000000000000000000000064612564727262017677 0ustar rootrootThis software is a 100% Python interface to the memcached memory cache daemon. It is the client side software which allows storing values in one or more, possibly remote, memcached servers. Search google for memcached for more information. This package was originally written by Evan Martin of Danga. Please do not contact Evan about maintenance. Sean Reifschneider of tummy.com, ltd. has taken over maintenance of it. web2py-2.12.3.orig/gluon/contrib/rss2.py0000664000000000000000000003744412564727262016526 0ustar rootroot""" PyRSS2Gen - A Python library for generating RSS 2.0 feeds. (This is the BSD license, based on the template at http://www.opensource.org/licenses/bsd-license.php ) Copyright (c) 2003, Dalke Scientific Software, LLC All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Dalke Scientific Softare, LLC, Andrew Dalke, nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ __name__ = "PyRSS2Gen" __version__ = (1, 1, 0) __author__ = "Andrew Dalke " _generator_name = __name__ + "-" + ".".join(map(str, __version__)) import datetime import sys if sys.version_info[0] == 3: # Python 3 basestring = str from io import StringIO else: # Python 2 try: from cStringIO import StringIO except ImportError: # Very old (or memory constrained) systems might # have left out the compiled C version. Fall back # to the pure Python one. Haven't seen this sort # of system since the early 2000s. from StringIO import StringIO # Could make this the base class; will need to add 'publish' class WriteXmlMixin: def write_xml(self, outfile, encoding="iso-8859-1"): from xml.sax import saxutils handler = saxutils.XMLGenerator(outfile, encoding) handler.startDocument() self.publish(handler) handler.endDocument() def to_xml(self, encoding="iso-8859-1"): f = StringIO() self.write_xml(f, encoding) return f.getvalue() def _element(handler, name, obj, d={}): if isinstance(obj, basestring) or obj is None: # special-case handling to make the API easier # to use for the common case. handler.startElement(name, d) if obj is not None: handler.characters(obj) handler.endElement(name) else: # It better know how to emit the correct XML. obj.publish(handler) def _opt_element(handler, name, obj): if obj is None: return _element(handler, name, obj) def _format_date(dt): """convert a datetime into an RFC 822 formatted date Input date must be in GMT. """ # Looks like: # Sat, 07 Sep 2002 00:00:01 GMT # Can't use strftime because that's locale dependent # # Isn't there a standard way to do this for Python? The # rfc822 and email.Utils modules assume a timestamp. The # following is based on the rfc822 module. return "%s, %02d %s %04d %02d:%02d:%02d GMT" % ( ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"][dt.weekday()], dt.day, ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"][dt.month - 1], dt.year, dt.hour, dt.minute, dt.second) ## # A couple simple wrapper objects for the fields which # take a simple value other than a string. class IntElement: """implements the 'publish' API for integers Takes the tag name and the integer value to publish. (Could be used for anything which uses str() to be published to text for XML.) """ element_attrs = {} def __init__(self, name, val): self.name = name self.val = val def publish(self, handler): handler.startElement(self.name, self.element_attrs) handler.characters(str(self.val)) handler.endElement(self.name) class DateElement: """implements the 'publish' API for a datetime.datetime Takes the tag name and the datetime to publish. Converts the datetime to RFC 2822 timestamp (4-digit year). """ def __init__(self, name, dt): self.name = name self.dt = dt def publish(self, handler): _element(handler, self.name, _format_date(self.dt)) #### class Category: """Publish a category element""" def __init__(self, category, domain=None): self.category = category self.domain = domain def publish(self, handler): d = {} if self.domain is not None: d["domain"] = self.domain _element(handler, "category", self.category, d) class Cloud: """Publish a cloud""" def __init__(self, domain, port, path, registerProcedure, protocol): self.domain = domain self.port = port self.path = path self.registerProcedure = registerProcedure self.protocol = protocol def publish(self, handler): _element(handler, "cloud", None, { "domain": self.domain, "port": str(self.port), "path": self.path, "registerProcedure": self.registerProcedure, "protocol": self.protocol}) class Image: """Publish a channel Image""" element_attrs = {} def __init__(self, url, title, link, width=None, height=None, description=None): self.url = url self.title = title self.link = link self.width = width self.height = height self.description = description def publish(self, handler): handler.startElement("image", self.element_attrs) _element(handler, "url", self.url) _element(handler, "title", self.title) _element(handler, "link", self.link) width = self.width if isinstance(width, int): width = IntElement("width", width) _opt_element(handler, "width", width) height = self.height if isinstance(height, int): height = IntElement("height", height) _opt_element(handler, "height", height) _opt_element(handler, "description", self.description) handler.endElement("image") class Guid: """Publish a guid Defaults to being a permalink, which is the assumption if it's omitted. Hence strings are always permalinks. """ def __init__(self, guid, isPermaLink=1): self.guid = guid self.isPermaLink = isPermaLink def publish(self, handler): d = {} if self.isPermaLink: d["isPermaLink"] = "true" else: d["isPermaLink"] = "false" _element(handler, "guid", self.guid, d) class TextInput: """Publish a textInput Apparently this is rarely used. """ element_attrs = {} def __init__(self, title, description, name, link): self.title = title self.description = description self.name = name self.link = link def publish(self, handler): handler.startElement("textInput", self.element_attrs) _element(handler, "title", self.title) _element(handler, "description", self.description) _element(handler, "name", self.name) _element(handler, "link", self.link) handler.endElement("textInput") class Enclosure: """Publish an enclosure""" def __init__(self, url, length, type): self.url = url self.length = length self.type = type def publish(self, handler): _element(handler, "enclosure", None, {"url": self.url, "length": str(self.length), "type": self.type, }) class Source: """Publish the item's original source, used by aggregators""" def __init__(self, name, url): self.name = name self.url = url def publish(self, handler): _element(handler, "source", self.name, {"url": self.url}) class SkipHours: """Publish the skipHours This takes a list of hours, as integers. """ element_attrs = {} def __init__(self, hours): self.hours = hours def publish(self, handler): if self.hours: handler.startElement("skipHours", self.element_attrs) for hour in self.hours: _element(handler, "hour", str(hour)) handler.endElement("skipHours") class SkipDays: """Publish the skipDays This takes a list of days as strings. """ element_attrs = {} def __init__(self, days): self.days = days def publish(self, handler): if self.days: handler.startElement("skipDays", self.element_attrs) for day in self.days: _element(handler, "day", day) handler.endElement("skipDays") class RSS2(WriteXmlMixin): """The main RSS class. Stores the channel attributes, with the "category" elements under ".categories" and the RSS items under ".items". """ rss_attrs = {"version": "2.0"} element_attrs = {} def __init__(self, title, link, description, language=None, copyright=None, managingEditor=None, webMaster=None, pubDate=None, # a datetime, *in* *GMT* lastBuildDate=None, # a datetime categories=None, # list of strings or Category generator=_generator_name, docs="http://blogs.law.harvard.edu/tech/rss", cloud=None, # a Cloud ttl=None, # integer number of minutes image=None, # an Image rating=None, # a string; I don't know how it's used textInput=None, # a TextInput skipHours=None, # a SkipHours with a list of integers skipDays=None, # a SkipDays with a list of strings items=None, # list of RSSItems ): self.title = title self.link = link self.description = description self.language = language self.copyright = copyright self.managingEditor = managingEditor self.webMaster = webMaster self.pubDate = pubDate self.lastBuildDate = lastBuildDate if categories is None: categories = [] self.categories = categories self.generator = generator self.docs = docs self.cloud = cloud self.ttl = ttl self.image = image self.rating = rating self.textInput = textInput self.skipHours = skipHours self.skipDays = skipDays if items is None: items = [] self.items = items def publish(self, handler): handler.startElement("rss", self.rss_attrs) handler.startElement("channel", self.element_attrs) _element(handler, "title", self.title) _element(handler, "link", self.link) _element(handler, "description", self.description) self.publish_extensions(handler) _opt_element(handler, "language", self.language) _opt_element(handler, "copyright", self.copyright) _opt_element(handler, "managingEditor", self.managingEditor) _opt_element(handler, "webMaster", self.webMaster) pubDate = self.pubDate if isinstance(pubDate, datetime.datetime): pubDate = DateElement("pubDate", pubDate) _opt_element(handler, "pubDate", pubDate) lastBuildDate = self.lastBuildDate if isinstance(lastBuildDate, datetime.datetime): lastBuildDate = DateElement("lastBuildDate", lastBuildDate) _opt_element(handler, "lastBuildDate", lastBuildDate) for category in self.categories: if isinstance(category, basestring): category = Category(category) category.publish(handler) _opt_element(handler, "generator", self.generator) _opt_element(handler, "docs", self.docs) if self.cloud is not None: self.cloud.publish(handler) ttl = self.ttl if isinstance(self.ttl, int): ttl = IntElement("ttl", ttl) _opt_element(handler, "ttl", ttl) if self.image is not None: self.image.publish(handler) _opt_element(handler, "rating", self.rating) if self.textInput is not None: self.textInput.publish(handler) if self.skipHours is not None: self.skipHours.publish(handler) if self.skipDays is not None: self.skipDays.publish(handler) for item in self.items: item.publish(handler) handler.endElement("channel") handler.endElement("rss") def publish_extensions(self, handler): # Derived classes can hook into this to insert # output after the three required fields. pass class RSSItem(WriteXmlMixin): """Publish an RSS Item""" element_attrs = {} def __init__(self, title=None, # string link=None, # url as string description=None, # string author=None, # email address as string categories=None, # list of string or Category comments=None, # url as string enclosure=None, # an Enclosure guid=None, # a unique string pubDate=None, # a datetime source=None, # a Source ): if title is None and description is None: raise TypeError( "must define at least one of 'title' or 'description'") self.title = title self.link = link self.description = description self.author = author if categories is None: categories = [] self.categories = categories self.comments = comments self.enclosure = enclosure self.guid = guid self.pubDate = pubDate self.source = source # It sure does get tedious typing these names three times... def publish(self, handler): handler.startElement("item", self.element_attrs) _opt_element(handler, "title", self.title) _opt_element(handler, "link", self.link) self.publish_extensions(handler) _opt_element(handler, "description", self.description) _opt_element(handler, "author", self.author) for category in self.categories: if isinstance(category, basestring): category = Category(category) category.publish(handler) _opt_element(handler, "comments", self.comments) if self.enclosure is not None: self.enclosure.publish(handler) _opt_element(handler, "guid", self.guid) pubDate = self.pubDate if isinstance(pubDate, datetime.datetime): pubDate = DateElement("pubDate", pubDate) _opt_element(handler, "pubDate", pubDate) if self.source is not None: self.source.publish(handler) handler.endElement("item") def publish_extensions(self, handler): # Derived classes can hook into this to insert # output after the title and link elements pass web2py-2.12.3.orig/gluon/contrib/pypyodbc.py0000664000000000000000000032065712564727262017467 0ustar rootroot# -*- coding: utf-8 -*- # PyPyODBC is develped from RealPyODBC 0.1 beta released in 2004 by Michele Petrazzo. Thanks Michele. # The MIT License (MIT) # # Copyright (c) 2014 Henry Zhou and PyPyODBC contributors # Copyright (c) 2004 Michele Petrazzo # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated # documentation files (the "Software"), to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, # and to permit persons to whom the Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all copies or substantial portions # of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO # THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF # CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. pooling = True apilevel = '2.0' paramstyle = 'qmark' threadsafety = 1 version = '1.3.3' lowercase=True DEBUG = 0 # Comment out all "if DEBUG:" statements like below for production #if DEBUG:print 'DEBUGGING' import sys, os, datetime, ctypes, threading from decimal import Decimal py_ver = sys.version[:3] py_v3 = py_ver >= '3.0' if py_v3: long = int unicode = str str_8b = bytes buffer = memoryview BYTE_1 = bytes('1','ascii') use_unicode = True else: str_8b = str BYTE_1 = '1' use_unicode = False if py_ver < '2.6': bytearray = str if not hasattr(ctypes, 'c_ssize_t'): if ctypes.sizeof(ctypes.c_uint) == ctypes.sizeof(ctypes.c_void_p): ctypes.c_ssize_t = ctypes.c_int elif ctypes.sizeof(ctypes.c_ulong) == ctypes.sizeof(ctypes.c_void_p): ctypes.c_ssize_t = ctypes.c_long elif ctypes.sizeof(ctypes.c_ulonglong) == ctypes.sizeof(ctypes.c_void_p): ctypes.c_ssize_t = ctypes.c_longlong lock = threading.Lock() shared_env_h = None SQLWCHAR_SIZE = ctypes.sizeof(ctypes.c_wchar) #determin the size of Py_UNICODE #sys.maxunicode > 65536 and 'UCS4' or 'UCS2' UNICODE_SIZE = sys.maxunicode > 65536 and 4 or 2 # Define ODBC constants. They are widly used in ODBC documents and programs # They are defined in cpp header files: sql.h sqlext.h sqltypes.h sqlucode.h # and you can get these files from the mingw32-runtime_3.13-1_all.deb package SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC2, SQL_OV_ODBC3 = 200, 2, 3 SQL_DRIVER_NOPROMPT = 0 SQL_ATTR_CONNECTION_POOLING = 201; SQL_CP_ONE_PER_HENV = 2 SQL_FETCH_NEXT, SQL_FETCH_FIRST, SQL_FETCH_LAST = 0x01, 0x02, 0x04 SQL_NULL_HANDLE, SQL_HANDLE_ENV, SQL_HANDLE_DBC, SQL_HANDLE_STMT = 0, 1, 2, 3 SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR = 0, 1, -1 SQL_NO_DATA = 100; SQL_NO_TOTAL = -4 SQL_ATTR_ACCESS_MODE = SQL_ACCESS_MODE = 101 SQL_ATTR_AUTOCOMMIT = SQL_AUTOCOMMIT = 102 SQL_MODE_DEFAULT = SQL_MODE_READ_WRITE = 0; SQL_MODE_READ_ONLY = 1 SQL_AUTOCOMMIT_OFF, SQL_AUTOCOMMIT_ON = 0, 1 SQL_IS_UINTEGER = -5 SQL_ATTR_LOGIN_TIMEOUT = 103; SQL_ATTR_CONNECTION_TIMEOUT = 113;SQL_ATTR_QUERY_TIMEOUT = 0 SQL_COMMIT, SQL_ROLLBACK = 0, 1 SQL_INDEX_UNIQUE,SQL_INDEX_ALL = 0,1 SQL_QUICK,SQL_ENSURE = 0,1 SQL_FETCH_NEXT = 1 SQL_COLUMN_DISPLAY_SIZE = 6 SQL_INVALID_HANDLE = -2 SQL_NO_DATA_FOUND = 100; SQL_NULL_DATA = -1; SQL_NTS = -3 SQL_HANDLE_DESCR = 4 SQL_TABLE_NAMES = 3 SQL_PARAM_INPUT = 1; SQL_PARAM_INPUT_OUTPUT = 2 SQL_PARAM_TYPE_UNKNOWN = 0 SQL_RESULT_COL = 3 SQL_PARAM_OUTPUT = 4 SQL_RETURN_VALUE = 5 SQL_PARAM_TYPE_DEFAULT = SQL_PARAM_INPUT_OUTPUT SQL_RESET_PARAMS = 3 SQL_UNBIND = 2 SQL_CLOSE = 0 # Below defines The constants for sqlgetinfo method, and their coresponding return types SQL_QUALIFIER_LOCATION = 114 SQL_QUALIFIER_NAME_SEPARATOR = 41 SQL_QUALIFIER_TERM = 42 SQL_QUALIFIER_USAGE = 92 SQL_OWNER_TERM = 39 SQL_OWNER_USAGE = 91 SQL_ACCESSIBLE_PROCEDURES = 20 SQL_ACCESSIBLE_TABLES = 19 SQL_ACTIVE_ENVIRONMENTS = 116 SQL_AGGREGATE_FUNCTIONS = 169 SQL_ALTER_DOMAIN = 117 SQL_ALTER_TABLE = 86 SQL_ASYNC_MODE = 10021 SQL_BATCH_ROW_COUNT = 120 SQL_BATCH_SUPPORT = 121 SQL_BOOKMARK_PERSISTENCE = 82 SQL_CATALOG_LOCATION = SQL_QUALIFIER_LOCATION SQL_CATALOG_NAME = 10003 SQL_CATALOG_NAME_SEPARATOR = SQL_QUALIFIER_NAME_SEPARATOR SQL_CATALOG_TERM = SQL_QUALIFIER_TERM SQL_CATALOG_USAGE = SQL_QUALIFIER_USAGE SQL_COLLATION_SEQ = 10004 SQL_COLUMN_ALIAS = 87 SQL_CONCAT_NULL_BEHAVIOR = 22 SQL_CONVERT_FUNCTIONS = 48 SQL_CONVERT_VARCHAR = 70 SQL_CORRELATION_NAME = 74 SQL_CREATE_ASSERTION = 127 SQL_CREATE_CHARACTER_SET = 128 SQL_CREATE_COLLATION = 129 SQL_CREATE_DOMAIN = 130 SQL_CREATE_SCHEMA = 131 SQL_CREATE_TABLE = 132 SQL_CREATE_TRANSLATION = 133 SQL_CREATE_VIEW = 134 SQL_CURSOR_COMMIT_BEHAVIOR = 23 SQL_CURSOR_ROLLBACK_BEHAVIOR = 24 SQL_DATABASE_NAME = 16 SQL_DATA_SOURCE_NAME = 2 SQL_DATA_SOURCE_READ_ONLY = 25 SQL_DATETIME_LITERALS = 119 SQL_DBMS_NAME = 17 SQL_DBMS_VER = 18 SQL_DDL_INDEX = 170 SQL_DEFAULT_TXN_ISOLATION = 26 SQL_DESCRIBE_PARAMETER = 10002 SQL_DM_VER = 171 SQL_DRIVER_NAME = 6 SQL_DRIVER_ODBC_VER = 77 SQL_DRIVER_VER = 7 SQL_DROP_ASSERTION = 136 SQL_DROP_CHARACTER_SET = 137 SQL_DROP_COLLATION = 138 SQL_DROP_DOMAIN = 139 SQL_DROP_SCHEMA = 140 SQL_DROP_TABLE = 141 SQL_DROP_TRANSLATION = 142 SQL_DROP_VIEW = 143 SQL_DYNAMIC_CURSOR_ATTRIBUTES1 = 144 SQL_DYNAMIC_CURSOR_ATTRIBUTES2 = 145 SQL_EXPRESSIONS_IN_ORDERBY = 27 SQL_FILE_USAGE = 84 SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1 = 146 SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2 = 147 SQL_GETDATA_EXTENSIONS = 81 SQL_GROUP_BY = 88 SQL_IDENTIFIER_CASE = 28 SQL_IDENTIFIER_QUOTE_CHAR = 29 SQL_INDEX_KEYWORDS = 148 SQL_INFO_SCHEMA_VIEWS = 149 SQL_INSERT_STATEMENT = 172 SQL_INTEGRITY = 73 SQL_KEYSET_CURSOR_ATTRIBUTES1 = 150 SQL_KEYSET_CURSOR_ATTRIBUTES2 = 151 SQL_KEYWORDS = 89 SQL_LIKE_ESCAPE_CLAUSE = 113 SQL_MAX_ASYNC_CONCURRENT_STATEMENTS = 10022 SQL_MAX_BINARY_LITERAL_LEN = 112 SQL_MAX_CATALOG_NAME_LEN = 34 SQL_MAX_CHAR_LITERAL_LEN = 108 SQL_MAX_COLUMNS_IN_GROUP_BY = 97 SQL_MAX_COLUMNS_IN_INDEX = 98 SQL_MAX_COLUMNS_IN_ORDER_BY = 99 SQL_MAX_COLUMNS_IN_SELECT = 100 SQL_MAX_COLUMNS_IN_TABLE = 101 SQL_MAX_COLUMN_NAME_LEN = 30 SQL_MAX_CONCURRENT_ACTIVITIES = 1 SQL_MAX_CURSOR_NAME_LEN = 31 SQL_MAX_DRIVER_CONNECTIONS = 0 SQL_MAX_IDENTIFIER_LEN = 10005 SQL_MAX_INDEX_SIZE = 102 SQL_MAX_PROCEDURE_NAME_LEN = 33 SQL_MAX_ROW_SIZE = 104 SQL_MAX_ROW_SIZE_INCLUDES_LONG = 103 SQL_MAX_SCHEMA_NAME_LEN = 32 SQL_MAX_STATEMENT_LEN = 105 SQL_MAX_TABLES_IN_SELECT = 106 SQL_MAX_TABLE_NAME_LEN = 35 SQL_MAX_USER_NAME_LEN = 107 SQL_MULTIPLE_ACTIVE_TXN = 37 SQL_MULT_RESULT_SETS = 36 SQL_NEED_LONG_DATA_LEN = 111 SQL_NON_NULLABLE_COLUMNS = 75 SQL_NULL_COLLATION = 85 SQL_NUMERIC_FUNCTIONS = 49 SQL_ODBC_INTERFACE_CONFORMANCE = 152 SQL_ODBC_VER = 10 SQL_OJ_CAPABILITIES = 65003 SQL_ORDER_BY_COLUMNS_IN_SELECT = 90 SQL_PARAM_ARRAY_ROW_COUNTS = 153 SQL_PARAM_ARRAY_SELECTS = 154 SQL_PROCEDURES = 21 SQL_PROCEDURE_TERM = 40 SQL_QUOTED_IDENTIFIER_CASE = 93 SQL_ROW_UPDATES = 11 SQL_SCHEMA_TERM = SQL_OWNER_TERM SQL_SCHEMA_USAGE = SQL_OWNER_USAGE SQL_SCROLL_OPTIONS = 44 SQL_SEARCH_PATTERN_ESCAPE = 14 SQL_SERVER_NAME = 13 SQL_SPECIAL_CHARACTERS = 94 SQL_SQL92_DATETIME_FUNCTIONS = 155 SQL_SQL92_FOREIGN_KEY_DELETE_RULE = 156 SQL_SQL92_FOREIGN_KEY_UPDATE_RULE = 157 SQL_SQL92_GRANT = 158 SQL_SQL92_NUMERIC_VALUE_FUNCTIONS = 159 SQL_SQL92_PREDICATES = 160 SQL_SQL92_RELATIONAL_JOIN_OPERATORS = 161 SQL_SQL92_REVOKE = 162 SQL_SQL92_ROW_VALUE_CONSTRUCTOR = 163 SQL_SQL92_STRING_FUNCTIONS = 164 SQL_SQL92_VALUE_EXPRESSIONS = 165 SQL_SQL_CONFORMANCE = 118 SQL_STANDARD_CLI_CONFORMANCE = 166 SQL_STATIC_CURSOR_ATTRIBUTES1 = 167 SQL_STATIC_CURSOR_ATTRIBUTES2 = 168 SQL_STRING_FUNCTIONS = 50 SQL_SUBQUERIES = 95 SQL_SYSTEM_FUNCTIONS = 51 SQL_TABLE_TERM = 45 SQL_TIMEDATE_ADD_INTERVALS = 109 SQL_TIMEDATE_DIFF_INTERVALS = 110 SQL_TIMEDATE_FUNCTIONS = 52 SQL_TXN_CAPABLE = 46 SQL_TXN_ISOLATION_OPTION = 72 SQL_UNION = 96 SQL_USER_NAME = 47 SQL_XOPEN_CLI_YEAR = 10000 aInfoTypes = { SQL_ACCESSIBLE_PROCEDURES : 'GI_YESNO',SQL_ACCESSIBLE_TABLES : 'GI_YESNO',SQL_ACTIVE_ENVIRONMENTS : 'GI_USMALLINT', SQL_AGGREGATE_FUNCTIONS : 'GI_UINTEGER',SQL_ALTER_DOMAIN : 'GI_UINTEGER', SQL_ALTER_TABLE : 'GI_UINTEGER',SQL_ASYNC_MODE : 'GI_UINTEGER',SQL_BATCH_ROW_COUNT : 'GI_UINTEGER', SQL_BATCH_SUPPORT : 'GI_UINTEGER',SQL_BOOKMARK_PERSISTENCE : 'GI_UINTEGER',SQL_CATALOG_LOCATION : 'GI_USMALLINT', SQL_CATALOG_NAME : 'GI_YESNO',SQL_CATALOG_NAME_SEPARATOR : 'GI_STRING',SQL_CATALOG_TERM : 'GI_STRING', SQL_CATALOG_USAGE : 'GI_UINTEGER',SQL_COLLATION_SEQ : 'GI_STRING',SQL_COLUMN_ALIAS : 'GI_YESNO', SQL_CONCAT_NULL_BEHAVIOR : 'GI_USMALLINT',SQL_CONVERT_FUNCTIONS : 'GI_UINTEGER',SQL_CONVERT_VARCHAR : 'GI_UINTEGER', SQL_CORRELATION_NAME : 'GI_USMALLINT',SQL_CREATE_ASSERTION : 'GI_UINTEGER',SQL_CREATE_CHARACTER_SET : 'GI_UINTEGER', SQL_CREATE_COLLATION : 'GI_UINTEGER',SQL_CREATE_DOMAIN : 'GI_UINTEGER',SQL_CREATE_SCHEMA : 'GI_UINTEGER', SQL_CREATE_TABLE : 'GI_UINTEGER',SQL_CREATE_TRANSLATION : 'GI_UINTEGER',SQL_CREATE_VIEW : 'GI_UINTEGER', SQL_CURSOR_COMMIT_BEHAVIOR : 'GI_USMALLINT',SQL_CURSOR_ROLLBACK_BEHAVIOR : 'GI_USMALLINT',SQL_DATABASE_NAME : 'GI_STRING', SQL_DATA_SOURCE_NAME : 'GI_STRING',SQL_DATA_SOURCE_READ_ONLY : 'GI_YESNO',SQL_DATETIME_LITERALS : 'GI_UINTEGER', SQL_DBMS_NAME : 'GI_STRING',SQL_DBMS_VER : 'GI_STRING',SQL_DDL_INDEX : 'GI_UINTEGER', SQL_DEFAULT_TXN_ISOLATION : 'GI_UINTEGER',SQL_DESCRIBE_PARAMETER : 'GI_YESNO',SQL_DM_VER : 'GI_STRING', SQL_DRIVER_NAME : 'GI_STRING',SQL_DRIVER_ODBC_VER : 'GI_STRING',SQL_DRIVER_VER : 'GI_STRING',SQL_DROP_ASSERTION : 'GI_UINTEGER', SQL_DROP_CHARACTER_SET : 'GI_UINTEGER', SQL_DROP_COLLATION : 'GI_UINTEGER',SQL_DROP_DOMAIN : 'GI_UINTEGER', SQL_DROP_SCHEMA : 'GI_UINTEGER',SQL_DROP_TABLE : 'GI_UINTEGER',SQL_DROP_TRANSLATION : 'GI_UINTEGER', SQL_DROP_VIEW : 'GI_UINTEGER',SQL_DYNAMIC_CURSOR_ATTRIBUTES1 : 'GI_UINTEGER',SQL_DYNAMIC_CURSOR_ATTRIBUTES2 : 'GI_UINTEGER', SQL_EXPRESSIONS_IN_ORDERBY : 'GI_YESNO',SQL_FILE_USAGE : 'GI_USMALLINT', SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1 : 'GI_UINTEGER',SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2 : 'GI_UINTEGER', SQL_GETDATA_EXTENSIONS : 'GI_UINTEGER',SQL_GROUP_BY : 'GI_USMALLINT',SQL_IDENTIFIER_CASE : 'GI_USMALLINT', SQL_IDENTIFIER_QUOTE_CHAR : 'GI_STRING',SQL_INDEX_KEYWORDS : 'GI_UINTEGER',SQL_INFO_SCHEMA_VIEWS : 'GI_UINTEGER', SQL_INSERT_STATEMENT : 'GI_UINTEGER',SQL_INTEGRITY : 'GI_YESNO',SQL_KEYSET_CURSOR_ATTRIBUTES1 : 'GI_UINTEGER', SQL_KEYSET_CURSOR_ATTRIBUTES2 : 'GI_UINTEGER',SQL_KEYWORDS : 'GI_STRING', SQL_LIKE_ESCAPE_CLAUSE : 'GI_YESNO',SQL_MAX_ASYNC_CONCURRENT_STATEMENTS : 'GI_UINTEGER', SQL_MAX_BINARY_LITERAL_LEN : 'GI_UINTEGER',SQL_MAX_CATALOG_NAME_LEN : 'GI_USMALLINT', SQL_MAX_CHAR_LITERAL_LEN : 'GI_UINTEGER',SQL_MAX_COLUMNS_IN_GROUP_BY : 'GI_USMALLINT', SQL_MAX_COLUMNS_IN_INDEX : 'GI_USMALLINT',SQL_MAX_COLUMNS_IN_ORDER_BY : 'GI_USMALLINT', SQL_MAX_COLUMNS_IN_SELECT : 'GI_USMALLINT',SQL_MAX_COLUMNS_IN_TABLE : 'GI_USMALLINT', SQL_MAX_COLUMN_NAME_LEN : 'GI_USMALLINT',SQL_MAX_CONCURRENT_ACTIVITIES : 'GI_USMALLINT', SQL_MAX_CURSOR_NAME_LEN : 'GI_USMALLINT',SQL_MAX_DRIVER_CONNECTIONS : 'GI_USMALLINT', SQL_MAX_IDENTIFIER_LEN : 'GI_USMALLINT',SQL_MAX_INDEX_SIZE : 'GI_UINTEGER', SQL_MAX_PROCEDURE_NAME_LEN : 'GI_USMALLINT',SQL_MAX_ROW_SIZE : 'GI_UINTEGER', SQL_MAX_ROW_SIZE_INCLUDES_LONG : 'GI_YESNO',SQL_MAX_SCHEMA_NAME_LEN : 'GI_USMALLINT', SQL_MAX_STATEMENT_LEN : 'GI_UINTEGER',SQL_MAX_TABLES_IN_SELECT : 'GI_USMALLINT', SQL_MAX_TABLE_NAME_LEN : 'GI_USMALLINT',SQL_MAX_USER_NAME_LEN : 'GI_USMALLINT', SQL_MULTIPLE_ACTIVE_TXN : 'GI_YESNO',SQL_MULT_RESULT_SETS : 'GI_YESNO', SQL_NEED_LONG_DATA_LEN : 'GI_YESNO',SQL_NON_NULLABLE_COLUMNS : 'GI_USMALLINT', SQL_NULL_COLLATION : 'GI_USMALLINT',SQL_NUMERIC_FUNCTIONS : 'GI_UINTEGER', SQL_ODBC_INTERFACE_CONFORMANCE : 'GI_UINTEGER',SQL_ODBC_VER : 'GI_STRING',SQL_OJ_CAPABILITIES : 'GI_UINTEGER', SQL_ORDER_BY_COLUMNS_IN_SELECT : 'GI_YESNO',SQL_PARAM_ARRAY_ROW_COUNTS : 'GI_UINTEGER', SQL_PARAM_ARRAY_SELECTS : 'GI_UINTEGER',SQL_PROCEDURES : 'GI_YESNO',SQL_PROCEDURE_TERM : 'GI_STRING', SQL_QUOTED_IDENTIFIER_CASE : 'GI_USMALLINT',SQL_ROW_UPDATES : 'GI_YESNO',SQL_SCHEMA_TERM : 'GI_STRING', SQL_SCHEMA_USAGE : 'GI_UINTEGER',SQL_SCROLL_OPTIONS : 'GI_UINTEGER',SQL_SEARCH_PATTERN_ESCAPE : 'GI_STRING', SQL_SERVER_NAME : 'GI_STRING',SQL_SPECIAL_CHARACTERS : 'GI_STRING',SQL_SQL92_DATETIME_FUNCTIONS : 'GI_UINTEGER', SQL_SQL92_FOREIGN_KEY_DELETE_RULE : 'GI_UINTEGER',SQL_SQL92_FOREIGN_KEY_UPDATE_RULE : 'GI_UINTEGER', SQL_SQL92_GRANT : 'GI_UINTEGER',SQL_SQL92_NUMERIC_VALUE_FUNCTIONS : 'GI_UINTEGER', SQL_SQL92_PREDICATES : 'GI_UINTEGER',SQL_SQL92_RELATIONAL_JOIN_OPERATORS : 'GI_UINTEGER', SQL_SQL92_REVOKE : 'GI_UINTEGER',SQL_SQL92_ROW_VALUE_CONSTRUCTOR : 'GI_UINTEGER', SQL_SQL92_STRING_FUNCTIONS : 'GI_UINTEGER',SQL_SQL92_VALUE_EXPRESSIONS : 'GI_UINTEGER', SQL_SQL_CONFORMANCE : 'GI_UINTEGER',SQL_STANDARD_CLI_CONFORMANCE : 'GI_UINTEGER', SQL_STATIC_CURSOR_ATTRIBUTES1 : 'GI_UINTEGER',SQL_STATIC_CURSOR_ATTRIBUTES2 : 'GI_UINTEGER', SQL_STRING_FUNCTIONS : 'GI_UINTEGER',SQL_SUBQUERIES : 'GI_UINTEGER', SQL_SYSTEM_FUNCTIONS : 'GI_UINTEGER',SQL_TABLE_TERM : 'GI_STRING',SQL_TIMEDATE_ADD_INTERVALS : 'GI_UINTEGER', SQL_TIMEDATE_DIFF_INTERVALS : 'GI_UINTEGER',SQL_TIMEDATE_FUNCTIONS : 'GI_UINTEGER', SQL_TXN_CAPABLE : 'GI_USMALLINT',SQL_TXN_ISOLATION_OPTION : 'GI_UINTEGER', SQL_UNION : 'GI_UINTEGER',SQL_USER_NAME : 'GI_STRING',SQL_XOPEN_CLI_YEAR : 'GI_STRING', } #Definations for types BINARY = bytearray Binary = bytearray DATETIME = datetime.datetime Date = datetime.date Time = datetime.time Timestamp = datetime.datetime STRING = str NUMBER = float ROWID = int DateFromTicks = datetime.date.fromtimestamp TimeFromTicks = lambda x: datetime.datetime.fromtimestamp(x).time() TimestampFromTicks = datetime.datetime.fromtimestamp #Define exceptions class OdbcNoLibrary(Exception): def __init__(self, value): self.value = value def __str__(self): return repr(self.value) class OdbcLibraryError(Exception): def __init__(self, value): self.value = value def __str__(self): return repr(self.value) class OdbcInvalidHandle(Exception): def __init__(self, value): self.value = value def __str__(self): return repr(self.value) class OdbcGenericError(Exception): def __init__(self, value): self.value = value def __str__(self): return repr(self.value) class Warning(Exception): def __init__(self, error_code, error_desc): self.value = (error_code, error_desc) self.args = (error_code, error_desc) class Error(Exception): def __init__(self, error_code, error_desc): self.value = (error_code, error_desc) self.args = (error_code, error_desc) class InterfaceError(Error): def __init__(self, error_code, error_desc): self.value = (error_code, error_desc) self.args = (error_code, error_desc) class DatabaseError(Error): def __init__(self, error_code, error_desc): self.value = (error_code, error_desc) self.args = (error_code, error_desc) class InternalError(DatabaseError): def __init__(self, error_code, error_desc): self.value = (error_code, error_desc) self.args = (error_code, error_desc) class ProgrammingError(DatabaseError): def __init__(self, error_code, error_desc): self.value = (error_code, error_desc) self.args = (error_code, error_desc) class DataError(DatabaseError): def __init__(self, error_code, error_desc): self.value = (error_code, error_desc) self.args = (error_code, error_desc) class IntegrityError(DatabaseError): def __init__(self, error_code, error_desc): self.value = (error_code, error_desc) self.args = (error_code, error_desc) class NotSupportedError(Error): def __init__(self, error_code, error_desc): self.value = (error_code, error_desc) self.args = (error_code, error_desc) class OperationalError(DatabaseError): def __init__(self, error_code, error_desc): self.value = (error_code, error_desc) self.args = (error_code, error_desc) ############################################################################ # # Find the ODBC library on the platform and connect to it using ctypes # ############################################################################ # Get the References of the platform's ODBC functions via ctypes odbc_decoding = 'utf_16' odbc_encoding = 'utf_16_le' ucs_length = 2 if sys.platform in ('win32','cli'): ODBC_API = ctypes.windll.odbc32 # On Windows, the size of SQLWCHAR is hardcoded to 2-bytes. SQLWCHAR_SIZE = ctypes.sizeof(ctypes.c_ushort) else: # Set load the library on linux try: # First try direct loading libodbc.so ODBC_API = ctypes.cdll.LoadLibrary('libodbc.so') except: # If direct loading libodbc.so failed # We try finding the libodbc.so by using find_library from ctypes.util import find_library library = find_library('odbc') if library is None: # If find_library still can not find the library # we try finding it manually from where libodbc.so usually appears lib_paths = ("/usr/lib/libodbc.so","/usr/lib/i386-linux-gnu/libodbc.so","/usr/lib/x86_64-linux-gnu/libodbc.so","/usr/lib/libiodbc.dylib") lib_paths = [path for path in lib_paths if os.path.exists(path)] if len(lib_paths) == 0 : raise OdbcNoLibrary('ODBC Library is not found. Is LD_LIBRARY_PATH set?') else: library = lib_paths[0] # Then we try loading the found libodbc.so again try: ODBC_API = ctypes.cdll.LoadLibrary(library) except: # If still fail loading, abort. raise OdbcLibraryError('Error while loading ' + library) # only iODBC uses utf-32 / UCS4 encoding data, others normally use utf-16 / UCS2 # So we set those for handling. if 'libiodbc.dylib' in library: odbc_decoding = 'utf_32' odbc_encoding = 'utf_32_le' ucs_length = 4 # unixODBC defaults to 2-bytes SQLWCHAR, unless "-DSQL_WCHART_CONVERT" was # added to CFLAGS, in which case it will be the size of wchar_t. # Note that using 4-bytes SQLWCHAR will break most ODBC drivers, as driver # development mostly targets the Windows platform. if py_v3: from subprocess import getstatusoutput else: from commands import getstatusoutput status, output = getstatusoutput('odbc_config --cflags') if status == 0 and 'SQL_WCHART_CONVERT' in output: SQLWCHAR_SIZE = ctypes.sizeof(ctypes.c_wchar) else: SQLWCHAR_SIZE = ctypes.sizeof(ctypes.c_ushort) create_buffer_u = ctypes.create_unicode_buffer create_buffer = ctypes.create_string_buffer wchar_pointer = ctypes.c_wchar_p UCS_buf = lambda s: s def UCS_dec(buffer): i = 0 uchars = [] while True: uchar = buffer.raw[i:i + ucs_length].decode(odbc_decoding) if uchar == unicode('\x00'): break uchars.append(uchar) i += ucs_length return ''.join(uchars) from_buffer_u = lambda buffer: buffer.value # This is the common case on Linux, which uses wide Python build together with # the default unixODBC without the "-DSQL_WCHART_CONVERT" CFLAGS. if sys.platform not in ('win32','cli'): if UNICODE_SIZE >= SQLWCHAR_SIZE: # We can only use unicode buffer if the size of wchar_t (UNICODE_SIZE) is # the same as the size expected by the driver manager (SQLWCHAR_SIZE). create_buffer_u = create_buffer wchar_pointer = ctypes.c_char_p def UCS_buf(s): return s.encode(odbc_encoding) from_buffer_u = UCS_dec # Exoteric case, don't really care. elif UNICODE_SIZE < SQLWCHAR_SIZE: raise OdbcLibraryError('Using narrow Python build with ODBC library ' 'expecting wide unicode is not supported.') ############################################################ # Database value to Python data type mappings SQL_TYPE_NULL = 0 SQL_DECIMAL = 3 SQL_FLOAT = 6 SQL_DATE = 9 SQL_TIME = 10 SQL_TIMESTAMP = 11 SQL_VARCHAR = 12 SQL_LONGVARCHAR = -1 SQL_VARBINARY = -3 SQL_LONGVARBINARY = -4 SQL_BIGINT = -5 SQL_WVARCHAR = -9 SQL_WLONGVARCHAR = -10 SQL_ALL_TYPES = 0 SQL_SIGNED_OFFSET = -20 SQL_SS_VARIANT = -150 SQL_SS_UDT = -151 SQL_SS_XML = -152 SQL_SS_TIME2 = -154 SQL_C_CHAR = SQL_CHAR = 1 SQL_C_NUMERIC = SQL_NUMERIC = 2 SQL_C_LONG = SQL_INTEGER = 4 SQL_C_SLONG = SQL_C_LONG + SQL_SIGNED_OFFSET SQL_C_SHORT = SQL_SMALLINT = 5 SQL_C_FLOAT = SQL_REAL = 7 SQL_C_DOUBLE = SQL_DOUBLE = 8 SQL_C_TYPE_DATE = SQL_TYPE_DATE = 91 SQL_C_TYPE_TIME = SQL_TYPE_TIME = 92 SQL_C_BINARY = SQL_BINARY = -2 SQL_C_SBIGINT = SQL_BIGINT + SQL_SIGNED_OFFSET SQL_C_TINYINT = SQL_TINYINT = -6 SQL_C_BIT = SQL_BIT = -7 SQL_C_WCHAR = SQL_WCHAR = -8 SQL_C_GUID = SQL_GUID = -11 SQL_C_TYPE_TIMESTAMP = SQL_TYPE_TIMESTAMP = 93 SQL_C_DEFAULT = 99 SQL_DESC_DISPLAY_SIZE = SQL_COLUMN_DISPLAY_SIZE def dttm_cvt(x): if py_v3: x = x.decode('ascii') if x == '': return None x = x.ljust(26,'0') return datetime.datetime(int(x[0:4]),int(x[5:7]),int(x[8:10]),int(x[10:13]),int(x[14:16]),int(x[17:19]),int(x[20:26])) def tm_cvt(x): if py_v3: x = x.decode('ascii') if x == '': return None x = x.ljust(15,'0') return datetime.time(int(x[0:2]),int(x[3:5]),int(x[6:8]),int(x[9:15])) def dt_cvt(x): if py_v3: x = x.decode('ascii') if x == '': return None else:return datetime.date(int(x[0:4]),int(x[5:7]),int(x[8:10])) def Decimal_cvt(x): if py_v3: x = x.decode('ascii') return Decimal(x) bytearray_cvt = bytearray if sys.platform == 'cli': bytearray_cvt = lambda x: bytearray(buffer(x)) # Below Datatype mappings referenced the document at # http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.sdk_12.5.1.aseodbc/html/aseodbc/CACFDIGH.htm SQL_data_type_dict = { \ #SQL Data TYPE 0.Python Data Type 1.Default Output Converter 2.Buffer Type 3.Buffer Allocator 4.Default Size 5.Variable Length SQL_TYPE_NULL : (None, lambda x: None, SQL_C_CHAR, create_buffer, 2 , False ), SQL_CHAR : (str, lambda x: x, SQL_C_CHAR, create_buffer, 2048 , False ), SQL_NUMERIC : (Decimal, Decimal_cvt, SQL_C_CHAR, create_buffer, 150 , False ), SQL_DECIMAL : (Decimal, Decimal_cvt, SQL_C_CHAR, create_buffer, 150 , False ), SQL_INTEGER : (int, int, SQL_C_CHAR, create_buffer, 150 , False ), SQL_SMALLINT : (int, int, SQL_C_CHAR, create_buffer, 150 , False ), SQL_FLOAT : (float, float, SQL_C_CHAR, create_buffer, 150 , False ), SQL_REAL : (float, float, SQL_C_CHAR, create_buffer, 150 , False ), SQL_DOUBLE : (float, float, SQL_C_CHAR, create_buffer, 200 , False ), SQL_DATE : (datetime.date, dt_cvt, SQL_C_CHAR, create_buffer, 30 , False ), SQL_TIME : (datetime.time, tm_cvt, SQL_C_CHAR, create_buffer, 20 , False ), SQL_SS_TIME2 : (datetime.time, tm_cvt, SQL_C_CHAR, create_buffer, 20 , False ), SQL_TIMESTAMP : (datetime.datetime, dttm_cvt, SQL_C_CHAR, create_buffer, 30 , False ), SQL_VARCHAR : (str, lambda x: x, SQL_C_CHAR, create_buffer, 2048 , False ), SQL_LONGVARCHAR : (str, lambda x: x, SQL_C_CHAR, create_buffer, 20500 , True ), SQL_BINARY : (bytearray, bytearray_cvt, SQL_C_BINARY, create_buffer, 5120 , True ), SQL_VARBINARY : (bytearray, bytearray_cvt, SQL_C_BINARY, create_buffer, 5120 , True ), SQL_LONGVARBINARY : (bytearray, bytearray_cvt, SQL_C_BINARY, create_buffer, 20500 , True ), SQL_BIGINT : (long, long, SQL_C_CHAR, create_buffer, 150 , False ), SQL_TINYINT : (int, int, SQL_C_CHAR, create_buffer, 150 , False ), SQL_BIT : (bool, lambda x:x == BYTE_1, SQL_C_CHAR, create_buffer, 2 , False ), SQL_WCHAR : (unicode, lambda x: x, SQL_C_WCHAR, create_buffer_u, 2048 , False ), SQL_WVARCHAR : (unicode, lambda x: x, SQL_C_WCHAR, create_buffer_u, 2048 , False ), SQL_GUID : (str, str, SQL_C_CHAR, create_buffer, 2048 , False ), SQL_WLONGVARCHAR : (unicode, lambda x: x, SQL_C_WCHAR, create_buffer_u, 20500 , True ), SQL_TYPE_DATE : (datetime.date, dt_cvt, SQL_C_CHAR, create_buffer, 30 , False ), SQL_TYPE_TIME : (datetime.time, tm_cvt, SQL_C_CHAR, create_buffer, 20 , False ), SQL_TYPE_TIMESTAMP : (datetime.datetime, dttm_cvt, SQL_C_CHAR, create_buffer, 30 , False ), SQL_SS_VARIANT : (str, lambda x: x, SQL_C_CHAR, create_buffer, 2048 , True ), SQL_SS_XML : (unicode, lambda x: x, SQL_C_WCHAR, create_buffer_u, 20500 , True ), SQL_SS_UDT : (bytearray, bytearray_cvt, SQL_C_BINARY, create_buffer, 5120 , True ), } """ Types mapping, applicable for 32-bit and 64-bit Linux / Windows / Mac OS X. SQLPointer -> ctypes.c_void_p SQLCHAR * -> ctypes.c_char_p SQLWCHAR * -> ctypes.c_wchar_p on Windows, ctypes.c_char_p with unixODBC SQLINT -> ctypes.c_int SQLSMALLINT -> ctypes.c_short SQMUSMALLINT -> ctypes.c_ushort SQLLEN -> ctypes.c_ssize_t SQLULEN -> ctypes.c_size_t SQLRETURN -> ctypes.c_short """ # Define the python return type for ODBC functions with ret result. funcs_with_ret = [ "SQLAllocHandle", "SQLBindParameter", "SQLBindCol", "SQLCloseCursor", "SQLColAttribute", "SQLColumns", "SQLColumnsW", "SQLConnect", "SQLConnectW", "SQLDataSources", "SQLDataSourcesW", "SQLDescribeCol", "SQLDescribeColW", "SQLDescribeParam", "SQLDisconnect", "SQLDriverConnect", "SQLDriverConnectW", "SQLDrivers", "SQLDriversW", "SQLEndTran", "SQLExecDirect", "SQLExecDirectW", "SQLExecute", "SQLFetch", "SQLFetchScroll", "SQLForeignKeys", "SQLForeignKeysW", "SQLFreeHandle", "SQLFreeStmt", "SQLGetData", "SQLGetDiagRec", "SQLGetDiagRecW", "SQLGetInfo", "SQLGetInfoW", "SQLGetTypeInfo", "SQLMoreResults", "SQLNumParams", "SQLNumResultCols", "SQLPrepare", "SQLPrepareW", "SQLPrimaryKeys", "SQLPrimaryKeysW", "SQLProcedureColumns", "SQLProcedureColumnsW", "SQLProcedures", "SQLProceduresW", "SQLRowCount", "SQLSetConnectAttr", "SQLSetEnvAttr", "SQLStatistics", "SQLStatisticsW", "SQLTables", "SQLTablesW", "SQLSetStmtAttr" ] for func_name in funcs_with_ret: getattr(ODBC_API, func_name).restype = ctypes.c_short if sys.platform not in ('cli'): #Seems like the IronPython can not declare ctypes.POINTER type arguments ODBC_API.SQLAllocHandle.argtypes = [ ctypes.c_short, ctypes.c_void_p, ctypes.POINTER(ctypes.c_void_p), ] ODBC_API.SQLBindParameter.argtypes = [ ctypes.c_void_p, ctypes.c_ushort, ctypes.c_short, ctypes.c_short, ctypes.c_short, ctypes.c_size_t, ctypes.c_short, ctypes.c_void_p, ctypes.c_ssize_t, ctypes.POINTER(ctypes.c_ssize_t), ] ODBC_API.SQLColAttribute.argtypes = [ ctypes.c_void_p, ctypes.c_ushort, ctypes.c_ushort, ctypes.c_void_p, ctypes.c_short, ctypes.POINTER(ctypes.c_short), ctypes.POINTER(ctypes.c_ssize_t), ] ODBC_API.SQLDataSources.argtypes = [ ctypes.c_void_p, ctypes.c_ushort, ctypes.c_char_p, ctypes.c_short, ctypes.POINTER(ctypes.c_short), ctypes.c_char_p, ctypes.c_short, ctypes.POINTER(ctypes.c_short), ] ODBC_API.SQLDescribeCol.argtypes = [ ctypes.c_void_p, ctypes.c_ushort, ctypes.c_char_p, ctypes.c_short, ctypes.POINTER(ctypes.c_short), ctypes.POINTER(ctypes.c_short), ctypes.POINTER(ctypes.c_size_t), ctypes.POINTER(ctypes.c_short), ctypes.POINTER(ctypes.c_short), ] ODBC_API.SQLDescribeParam.argtypes = [ ctypes.c_void_p, ctypes.c_ushort, ctypes.POINTER(ctypes.c_short), ctypes.POINTER(ctypes.c_size_t), ctypes.POINTER(ctypes.c_short), ctypes.POINTER(ctypes.c_short), ] ODBC_API.SQLDriverConnect.argtypes = [ ctypes.c_void_p, ctypes.c_void_p, ctypes.c_char_p, ctypes.c_short, ctypes.c_char_p, ctypes.c_short, ctypes.POINTER(ctypes.c_short), ctypes.c_ushort, ] ODBC_API.SQLDrivers.argtypes = [ ctypes.c_void_p, ctypes.c_ushort, ctypes.c_char_p, ctypes.c_short, ctypes.POINTER(ctypes.c_short), ctypes.c_char_p, ctypes.c_short, ctypes.POINTER(ctypes.c_short), ] ODBC_API.SQLGetData.argtypes = [ ctypes.c_void_p, ctypes.c_ushort, ctypes.c_short, ctypes.c_void_p, ctypes.c_ssize_t, ctypes.POINTER(ctypes.c_ssize_t), ] ODBC_API.SQLGetDiagRec.argtypes = [ ctypes.c_short, ctypes.c_void_p, ctypes.c_short, ctypes.c_char_p, ctypes.POINTER(ctypes.c_int), ctypes.c_char_p, ctypes.c_short, ctypes.POINTER(ctypes.c_short), ] ODBC_API.SQLGetInfo.argtypes = [ ctypes.c_void_p, ctypes.c_ushort, ctypes.c_void_p, ctypes.c_short, ctypes.POINTER(ctypes.c_short), ] ODBC_API.SQLRowCount.argtypes = [ ctypes.c_void_p, ctypes.POINTER(ctypes.c_ssize_t), ] ODBC_API.SQLNumParams.argtypes = [ ctypes.c_void_p, ctypes.POINTER(ctypes.c_short), ] ODBC_API.SQLNumResultCols.argtypes = [ ctypes.c_void_p, ctypes.POINTER(ctypes.c_short), ] ODBC_API.SQLCloseCursor.argtypes = [ctypes.c_void_p] ODBC_API.SQLColumns.argtypes = [ ctypes.c_void_p, ctypes.c_char_p, ctypes.c_short, ctypes.c_char_p, ctypes.c_short, ctypes.c_char_p, ctypes.c_short, ctypes.c_char_p, ctypes.c_short, ] ODBC_API.SQLConnect.argtypes = [ ctypes.c_void_p, ctypes.c_char_p, ctypes.c_short, ctypes.c_char_p, ctypes.c_short, ctypes.c_char_p, ctypes.c_short, ] ODBC_API.SQLDisconnect.argtypes = [ctypes.c_void_p] ODBC_API.SQLEndTran.argtypes = [ ctypes.c_short, ctypes.c_void_p, ctypes.c_short, ] ODBC_API.SQLExecute.argtypes = [ctypes.c_void_p] ODBC_API.SQLExecDirect.argtypes = [ ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int, ] ODBC_API.SQLFetch.argtypes = [ctypes.c_void_p] ODBC_API.SQLFetchScroll.argtypes = [ ctypes.c_void_p, ctypes.c_short, ctypes.c_ssize_t, ] ODBC_API.SQLForeignKeys.argtypes = [ ctypes.c_void_p, ctypes.c_char_p, ctypes.c_short, ctypes.c_char_p, ctypes.c_short, ctypes.c_char_p, ctypes.c_short, ctypes.c_char_p, ctypes.c_short, ctypes.c_char_p, ctypes.c_short, ctypes.c_char_p, ctypes.c_short, ] ODBC_API.SQLFreeHandle.argtypes = [ ctypes.c_short, ctypes.c_void_p, ] ODBC_API.SQLFreeStmt.argtypes = [ ctypes.c_void_p, ctypes.c_ushort, ] ODBC_API.SQLGetTypeInfo.argtypes = [ ctypes.c_void_p, ctypes.c_short, ] ODBC_API.SQLMoreResults.argtypes = [ctypes.c_void_p] ODBC_API.SQLPrepare.argtypes = [ ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int, ] ODBC_API.SQLPrimaryKeys.argtypes = [ ctypes.c_void_p, ctypes.c_char_p, ctypes.c_short, ctypes.c_char_p, ctypes.c_short, ctypes.c_char_p, ctypes.c_short, ] ODBC_API.SQLProcedureColumns.argtypes = [ ctypes.c_void_p, ctypes.c_char_p, ctypes.c_short, ctypes.c_char_p, ctypes.c_short, ctypes.c_char_p, ctypes.c_short, ctypes.c_char_p, ctypes.c_short, ] ODBC_API.SQLProcedures.argtypes = [ ctypes.c_void_p, ctypes.c_char_p, ctypes.c_short, ctypes.c_char_p, ctypes.c_short, ctypes.c_char_p, ctypes.c_short, ] ODBC_API.SQLSetConnectAttr.argtypes = [ ctypes.c_void_p, ctypes.c_int, ctypes.c_void_p, ctypes.c_int, ] ODBC_API.SQLSetEnvAttr.argtypes = [ ctypes.c_void_p, ctypes.c_int, ctypes.c_void_p, ctypes.c_int, ] ODBC_API.SQLStatistics.argtypes = [ ctypes.c_void_p, ctypes.c_char_p, ctypes.c_short, ctypes.c_char_p, ctypes.c_short, ctypes.c_char_p, ctypes.c_short, ctypes.c_ushort, ctypes.c_ushort, ] ODBC_API.SQLTables.argtypes = [ ctypes.c_void_p, ctypes.c_char_p, ctypes.c_short, ctypes.c_char_p, ctypes.c_short, ctypes.c_char_p, ctypes.c_short, ctypes.c_char_p, ctypes.c_short, ] def to_wchar(argtypes): if argtypes: # Under IronPython some argtypes are not declared result = [] for x in argtypes: if x == ctypes.c_char_p: result.append(wchar_pointer) else: result.append(x) return result else: return argtypes ODBC_API.SQLColumnsW.argtypes = to_wchar(ODBC_API.SQLColumns.argtypes) ODBC_API.SQLConnectW.argtypes = to_wchar(ODBC_API.SQLConnect.argtypes) ODBC_API.SQLDataSourcesW.argtypes = to_wchar(ODBC_API.SQLDataSources.argtypes) ODBC_API.SQLDescribeColW.argtypes = to_wchar(ODBC_API.SQLDescribeCol.argtypes) ODBC_API.SQLDriverConnectW.argtypes = to_wchar(ODBC_API.SQLDriverConnect.argtypes) ODBC_API.SQLDriversW.argtypes = to_wchar(ODBC_API.SQLDrivers.argtypes) ODBC_API.SQLExecDirectW.argtypes = to_wchar(ODBC_API.SQLExecDirect.argtypes) ODBC_API.SQLForeignKeysW.argtypes = to_wchar(ODBC_API.SQLForeignKeys.argtypes) ODBC_API.SQLPrepareW.argtypes = to_wchar(ODBC_API.SQLPrepare.argtypes) ODBC_API.SQLPrimaryKeysW.argtypes = to_wchar(ODBC_API.SQLPrimaryKeys.argtypes) ODBC_API.SQLProcedureColumnsW.argtypes = to_wchar(ODBC_API.SQLProcedureColumns.argtypes) ODBC_API.SQLProceduresW.argtypes = to_wchar(ODBC_API.SQLProcedures.argtypes) ODBC_API.SQLStatisticsW.argtypes = to_wchar(ODBC_API.SQLStatistics.argtypes) ODBC_API.SQLTablesW.argtypes = to_wchar(ODBC_API.SQLTables.argtypes) ODBC_API.SQLGetDiagRecW.argtypes = to_wchar(ODBC_API.SQLGetDiagRec.argtypes) ODBC_API.SQLGetInfoW.argtypes = to_wchar(ODBC_API.SQLGetInfo.argtypes) # Set the alias for the ctypes functions for beter code readbility or performance. ADDR = ctypes.byref c_short = ctypes.c_short c_ssize_t = ctypes.c_ssize_t SQLFetch = ODBC_API.SQLFetch SQLExecute = ODBC_API.SQLExecute SQLBindParameter = ODBC_API.SQLBindParameter SQLGetData = ODBC_API.SQLGetData SQLRowCount = ODBC_API.SQLRowCount SQLNumResultCols = ODBC_API.SQLNumResultCols SQLEndTran = ODBC_API.SQLEndTran # Set alias for beter code readbility or performance. NO_FREE_STATEMENT = 0 FREE_STATEMENT = 1 BLANK_BYTE = str_8b() def ctrl_err(ht, h, val_ret, ansi): """Classify type of ODBC error from (type of handle, handle, return value) , and raise with a list""" if ansi: state = create_buffer(22) Message = create_buffer(1024*4) ODBC_func = ODBC_API.SQLGetDiagRec if py_v3: raw_s = lambda s: bytes(s,'ascii') else: raw_s = str_8b else: state = create_buffer_u(22) Message = create_buffer_u(1024*4) ODBC_func = ODBC_API.SQLGetDiagRecW raw_s = unicode NativeError = ctypes.c_int() Buffer_len = c_short() err_list = [] number_errors = 1 while 1: ret = ODBC_func(ht, h, number_errors, state, \ ADDR(NativeError), Message, 1024, ADDR(Buffer_len)) if ret == SQL_NO_DATA_FOUND: #No more data, I can raise #print(err_list[0][1]) state = err_list[0][0] err_text = raw_s('[')+state+raw_s('] ')+err_list[0][1] if state[:2] in (raw_s('24'),raw_s('25'),raw_s('42')): raise ProgrammingError(state,err_text) elif state[:2] in (raw_s('22')): raise DataError(state,err_text) elif state[:2] in (raw_s('23')) or state == raw_s('40002'): raise IntegrityError(state,err_text) elif state == raw_s('0A000'): raise NotSupportedError(state,err_text) elif state in (raw_s('HYT00'),raw_s('HYT01')): raise OperationalError(state,err_text) elif state[:2] in (raw_s('IM'),raw_s('HY')): raise Error(state,err_text) else: raise DatabaseError(state,err_text) break elif ret == SQL_INVALID_HANDLE: #The handle passed is an invalid handle raise ProgrammingError('', 'SQL_INVALID_HANDLE') elif ret == SQL_SUCCESS: if ansi: err_list.append((state.value, Message.value, NativeError.value)) else: err_list.append((from_buffer_u(state), from_buffer_u(Message), NativeError.value)) number_errors += 1 elif ret == SQL_ERROR: raise ProgrammingError('', 'SQL_ERROR') def check_success(ODBC_obj, ret): """ Validate return value, if not success, raise exceptions based on the handle """ if ret not in (SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA): if isinstance(ODBC_obj, Cursor): ctrl_err(SQL_HANDLE_STMT, ODBC_obj.stmt_h, ret, ODBC_obj.ansi) elif isinstance(ODBC_obj, Connection): ctrl_err(SQL_HANDLE_DBC, ODBC_obj.dbc_h, ret, ODBC_obj.ansi) else: ctrl_err(SQL_HANDLE_ENV, ODBC_obj, ret, False) def AllocateEnv(): if pooling: ret = ODBC_API.SQLSetEnvAttr(SQL_NULL_HANDLE, SQL_ATTR_CONNECTION_POOLING, SQL_CP_ONE_PER_HENV, SQL_IS_UINTEGER) check_success(SQL_NULL_HANDLE, ret) ''' Allocate an ODBC environment by initializing the handle shared_env_h ODBC enviroment needed to be created, so connections can be created under it connections pooling can be shared under one environment ''' global shared_env_h shared_env_h = ctypes.c_void_p() ret = ODBC_API.SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, ADDR(shared_env_h)) check_success(shared_env_h, ret) # Set the ODBC environment's compatibil leve to ODBC 3.0 ret = ODBC_API.SQLSetEnvAttr(shared_env_h, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3, 0) check_success(shared_env_h, ret) """ Here, we have a few callables that determine how a result row is returned. A new one can be added by creating a callable that: - accepts a cursor as its parameter. - returns a callable that accepts an iterable containing the row values. """ def TupleRow(cursor): """Normal tuple with added attribute `cursor_description`, as in pyodbc. This is the default. """ class Row(tuple): cursor_description = cursor.description def get(self, field): if not hasattr(self, 'field_dict'): self.field_dict = {} for i,item in enumerate(self): self.field_dict[self.cursor_description[i][0]] = item return self.field_dict.get(field) def __getitem__(self, field): if isinstance(field, (unicode,str)): return self.get(field) else: return tuple.__getitem__(self,field) return Row def NamedTupleRow(cursor): """Named tuple to allow attribute lookup by name. Requires py2.6 or above. """ from collections import namedtuple attr_names = [x[0] for x in cursor._ColBufferList] class Row(namedtuple('Row', attr_names, rename=True)): cursor_description = cursor.description def __new__(cls, iterable): return super(Row, cls).__new__(cls, *iterable) return Row def MutableNamedTupleRow(cursor): """Mutable named tuple to allow attribute to be replaced. This should be compatible with pyodbc's Row type. Requires 3rd-party library "recordtype". """ from recordtype import recordtype attr_names = [x[0] for x in cursor._ColBufferList] class Row(recordtype('Row', attr_names, rename=True)): cursor_description = cursor.description def __init__(self, iterable): super(Row, self).__init__(*iterable) def __iter__(self): for field_name in self.__slots__: yield getattr(self, field_name) def __getitem__(self, index): if isinstance(index, slice): return tuple(getattr(self, x) for x in self.__slots__[index]) return getattr(self, self.__slots__[index]) def __setitem__(self, index, value): setattr(self, self.__slots__[index], value) return Row # When Null is used in a binary parameter, database usually would not # accept the None for a binary field, so the work around is to use a # Specical None that the pypyodbc moudle would know this NULL is for # a binary field. class BinaryNullType(): pass BinaryNull = BinaryNullType() # The get_type function is used to determine if parameters need to be re-binded # against the changed parameter types # 'b' for bool, 'U' for long unicode string, 'u' for short unicode string # 'S' for long 8 bit string, 's' for short 8 bit string, 'l' for big integer, 'i' for normal integer # 'f' for float, 'D' for Decimal, 't' for datetime.time, 'd' for datetime.datetime, 'dt' for datetime.datetime # 'bi' for binary def get_type(v): if isinstance(v, bool): return ('b',) elif isinstance(v, unicode): if len(v) >= 255: return ('U',(len(v)//1000+1)*1000) else: return ('u',) elif isinstance(v, (str_8b,str)): if len(v) >= 255: return ('S',(len(v)//1000+1)*1000) else: return ('s',) elif isinstance(v, (int, long)): #SQL_BIGINT defination: http://msdn.microsoft.com/en-us/library/ms187745.aspx if v > 2147483647 or v < -2147483648: return ('l',) else: return ('i',) elif isinstance(v, float): return ('f',) elif isinstance(v, BinaryNullType): return ('BN',) elif v is None: return ('N',) elif isinstance(v, Decimal): t = v.as_tuple() #1.23 -> (1,2,3),-2 , 1.23*E7 -> (1,2,3),5 return ('D',(len(t[1]),0 - t[2])) # number of digits, and number of decimal digits elif isinstance (v, datetime.datetime): return ('dt',) elif isinstance (v, datetime.date): return ('d',) elif isinstance(v, datetime.time): return ('t',) elif isinstance (v, (bytearray, buffer)): return ('bi',(len(v)//1000+1)*1000) return type(v) # The Cursor Class. class Cursor: def __init__(self, conx, row_type_callable=None): """ Initialize self.stmt_h, which is the handle of a statement A statement is actually the basis of a python"cursor" object """ self.stmt_h = ctypes.c_void_p() self.connection = conx self.ansi = conx.ansi self.row_type_callable = row_type_callable or TupleRow self.statement = None self._last_param_types = None self._ParamBufferList = [] self._ColBufferList = [] self._row_type = None self._buf_cvt_func = [] self.rowcount = -1 self.description = None self.autocommit = None self._ColTypeCodeList = [] self._outputsize = {} self._inputsizers = [] self.arraysize = 1 ret = ODBC_API.SQLAllocHandle(SQL_HANDLE_STMT, self.connection.dbc_h, ADDR(self.stmt_h)) check_success(self, ret) self.timeout = conx.timeout if self.timeout != 0: self.set_timeout(self.timeout) self._PARAM_SQL_TYPE_LIST = [] self.closed = False def set_timeout(self, timeout): self.timeout = timeout ret = ODBC_API.SQLSetStmtAttr(self.stmt_h, SQL_ATTR_QUERY_TIMEOUT, self.timeout, 0) check_success(self, ret) def prepare(self, query_string): """prepare a query""" #self._free_results(FREE_STATEMENT) if not self.connection: self.close() if type(query_string) == unicode: c_query_string = wchar_pointer(UCS_buf(query_string)) ret = ODBC_API.SQLPrepareW(self.stmt_h, c_query_string, len(query_string)) else: c_query_string = ctypes.c_char_p(query_string) ret = ODBC_API.SQLPrepare(self.stmt_h, c_query_string, len(query_string)) if ret != SQL_SUCCESS: check_success(self, ret) self._PARAM_SQL_TYPE_LIST = [] if self.connection.support_SQLDescribeParam: # SQLServer's SQLDescribeParam only supports DML SQL, so avoid the SELECT statement if True:# 'SELECT' not in query_string.upper(): #self._free_results(NO_FREE_STATEMENT) NumParams = c_short() ret = ODBC_API.SQLNumParams(self.stmt_h, ADDR(NumParams)) if ret != SQL_SUCCESS: check_success(self, ret) for col_num in range(NumParams.value): ParameterNumber = ctypes.c_ushort(col_num + 1) DataType = c_short() ParameterSize = ctypes.c_size_t() DecimalDigits = c_short() Nullable = c_short() ret = ODBC_API.SQLDescribeParam( self.stmt_h, ParameterNumber, ADDR(DataType), ADDR(ParameterSize), ADDR(DecimalDigits), ADDR(Nullable), ) if ret != SQL_SUCCESS: try: check_success(self, ret) except DatabaseError: if sys.exc_info()[1].value[0] == '07009': self._PARAM_SQL_TYPE_LIST = [] break else: raise sys.exc_info()[1] except: raise sys.exc_info()[1] self._PARAM_SQL_TYPE_LIST.append((DataType.value,DecimalDigits.value)) self.statement = query_string def _BindParams(self, param_types, pram_io_list = []): """Create parameter buffers based on param types, and bind them to the statement""" # Clear the old Parameters if not self.connection: self.close() #self._free_results(NO_FREE_STATEMENT) # Get the number of query parameters judged by database. NumParams = c_short() ret = ODBC_API.SQLNumParams(self.stmt_h, ADDR(NumParams)) if ret != SQL_SUCCESS: check_success(self, ret) if len(param_types) != NumParams.value: # In case number of parameters provided do not same as number required error_desc = "The SQL contains %d parameter markers, but %d parameters were supplied" \ %(NumParams.value,len(param_types)) raise ProgrammingError('HY000',error_desc) # Every parameter needs to be binded to a buffer ParamBufferList = [] # Temporary holder since we can only call SQLDescribeParam before # calling SQLBindParam. temp_holder = [] for col_num in range(NumParams.value): dec_num = 0 buf_size = 512 if param_types[col_num][0] == 'u': sql_c_type = SQL_C_WCHAR sql_type = SQL_WVARCHAR buf_size = 255 ParameterBuffer = create_buffer_u(buf_size) elif param_types[col_num][0] == 's': sql_c_type = SQL_C_CHAR sql_type = SQL_VARCHAR buf_size = 255 ParameterBuffer = create_buffer(buf_size) elif param_types[col_num][0] == 'U': sql_c_type = SQL_C_WCHAR sql_type = SQL_WLONGVARCHAR buf_size = param_types[col_num][1]#len(self._inputsizers)>col_num and self._inputsizers[col_num] or 20500 ParameterBuffer = create_buffer_u(buf_size) elif param_types[col_num][0] == 'S': sql_c_type = SQL_C_CHAR sql_type = SQL_LONGVARCHAR buf_size = param_types[col_num][1]#len(self._inputsizers)>col_num and self._inputsizers[col_num] or 20500 ParameterBuffer = create_buffer(buf_size) # bool subclasses int, thus has to go first elif param_types[col_num][0] == 'b': sql_c_type = SQL_C_CHAR sql_type = SQL_BIT buf_size = SQL_data_type_dict[sql_type][4] ParameterBuffer = create_buffer(buf_size) elif param_types[col_num][0] == 'i': sql_c_type = SQL_C_CHAR sql_type = SQL_INTEGER buf_size = SQL_data_type_dict[sql_type][4] ParameterBuffer = create_buffer(buf_size) elif param_types[col_num][0] == 'l': sql_c_type = SQL_C_CHAR sql_type = SQL_BIGINT buf_size = SQL_data_type_dict[sql_type][4] ParameterBuffer = create_buffer(buf_size) elif param_types[col_num][0] == 'D': #Decimal sql_c_type = SQL_C_CHAR sql_type = SQL_NUMERIC digit_num, dec_num = param_types[col_num][1] if dec_num > 0: # has decimal buf_size = digit_num dec_num = dec_num else: # no decimal buf_size = digit_num - dec_num dec_num = 0 ParameterBuffer = create_buffer(buf_size + 4)# add extra length for sign and dot elif param_types[col_num][0] == 'f': sql_c_type = SQL_C_CHAR sql_type = SQL_DOUBLE buf_size = SQL_data_type_dict[sql_type][4] ParameterBuffer = create_buffer(buf_size) # datetime subclasses date, thus has to go first elif param_types[col_num][0] == 'dt': sql_c_type = SQL_C_CHAR sql_type = SQL_TYPE_TIMESTAMP buf_size = self.connection.type_size_dic[SQL_TYPE_TIMESTAMP][0] ParameterBuffer = create_buffer(buf_size) dec_num = self.connection.type_size_dic[SQL_TYPE_TIMESTAMP][1] elif param_types[col_num][0] == 'd': sql_c_type = SQL_C_CHAR if SQL_TYPE_DATE in self.connection.type_size_dic: #if DEBUG:print('conx.type_size_dic.has_key(SQL_TYPE_DATE)') sql_type = SQL_TYPE_DATE buf_size = self.connection.type_size_dic[SQL_TYPE_DATE][0] ParameterBuffer = create_buffer(buf_size) dec_num = self.connection.type_size_dic[SQL_TYPE_DATE][1] else: # SQL Sever <2008 doesn't have a DATE type. sql_type = SQL_TYPE_TIMESTAMP buf_size = 10 ParameterBuffer = create_buffer(buf_size) elif param_types[col_num][0] == 't': sql_c_type = SQL_C_CHAR if SQL_TYPE_TIME in self.connection.type_size_dic: sql_type = SQL_TYPE_TIME buf_size = self.connection.type_size_dic[SQL_TYPE_TIME][0] ParameterBuffer = create_buffer(buf_size) dec_num = self.connection.type_size_dic[SQL_TYPE_TIME][1] elif SQL_SS_TIME2 in self.connection.type_size_dic: # TIME type added in SQL Server 2008 sql_type = SQL_SS_TIME2 buf_size = self.connection.type_size_dic[SQL_SS_TIME2][0] ParameterBuffer = create_buffer(buf_size) dec_num = self.connection.type_size_dic[SQL_SS_TIME2][1] else: # SQL Sever <2008 doesn't have a TIME type. sql_type = SQL_TYPE_TIMESTAMP buf_size = self.connection.type_size_dic[SQL_TYPE_TIMESTAMP][0] ParameterBuffer = create_buffer(buf_size) dec_num = 3 elif param_types[col_num][0] == 'BN': sql_c_type = SQL_C_BINARY sql_type = SQL_VARBINARY buf_size = 1 ParameterBuffer = create_buffer(buf_size) elif param_types[col_num][0] == 'N': if len(self._PARAM_SQL_TYPE_LIST) > 0: sql_c_type = SQL_C_DEFAULT sql_type = self._PARAM_SQL_TYPE_LIST[col_num][0] buf_size = 1 ParameterBuffer = create_buffer(buf_size) else: sql_c_type = SQL_C_CHAR sql_type = SQL_CHAR buf_size = 1 ParameterBuffer = create_buffer(buf_size) elif param_types[col_num][0] == 'bi': sql_c_type = SQL_C_BINARY sql_type = SQL_LONGVARBINARY buf_size = param_types[col_num][1]#len(self._inputsizers)>col_num and self._inputsizers[col_num] or 20500 ParameterBuffer = create_buffer(buf_size) else: sql_c_type = SQL_C_CHAR sql_type = SQL_LONGVARCHAR buf_size = len(self._inputsizers)>col_num and self._inputsizers[col_num] or 20500 ParameterBuffer = create_buffer(buf_size) temp_holder.append((sql_c_type, sql_type, buf_size, dec_num, ParameterBuffer)) for col_num, (sql_c_type, sql_type, buf_size, dec_num, ParameterBuffer) in enumerate(temp_holder): BufferLen = c_ssize_t(buf_size) LenOrIndBuf = c_ssize_t() InputOutputType = SQL_PARAM_INPUT if len(pram_io_list) > col_num: InputOutputType = pram_io_list[col_num] ret = SQLBindParameter(self.stmt_h, col_num + 1, InputOutputType, sql_c_type, sql_type, buf_size,\ dec_num, ADDR(ParameterBuffer), BufferLen,ADDR(LenOrIndBuf)) if ret != SQL_SUCCESS: check_success(self, ret) # Append the value buffer and the length buffer to the array ParamBufferList.append((ParameterBuffer,LenOrIndBuf,sql_type)) self._last_param_types = param_types self._ParamBufferList = ParamBufferList def execute(self, query_string, params=None, many_mode=False, call_mode=False): """ Execute the query string, with optional parameters. If parameters are provided, the query would first be prepared, then executed with parameters; If parameters are not provided, only th query sting, it would be executed directly """ if not self.connection: self.close() self._free_stmt(SQL_CLOSE) if params: # If parameters exist, first prepare the query then executed with parameters if not isinstance(params, (tuple, list)): raise TypeError("Params must be in a list, tuple, or Row") if query_string != self.statement: # if the query is not same as last query, then it is not prepared self.prepare(query_string) param_types = list(map(get_type, params)) if call_mode: self._free_stmt(SQL_RESET_PARAMS) self._BindParams(param_types, self._pram_io_list) else: if self._last_param_types is None: self._free_stmt(SQL_RESET_PARAMS) self._BindParams(param_types) elif len(param_types) != len(self._last_param_types): self._free_stmt(SQL_RESET_PARAMS) self._BindParams(param_types) elif sum([p_type[0] != 'N' and p_type != self._last_param_types[i] for i,p_type in enumerate(param_types)]) > 0: self._free_stmt(SQL_RESET_PARAMS) self._BindParams(param_types) # With query prepared, now put parameters into buffers col_num = 0 for param_buffer, param_buffer_len, sql_type in self._ParamBufferList: c_char_buf, c_buf_len = '', 0 param_val = params[col_num] if param_types[col_num][0] in ('N','BN'): param_buffer_len.value = SQL_NULL_DATA col_num += 1 continue elif param_types[col_num][0] in ('i','l','f'): if py_v3: c_char_buf = bytes(str(param_val),'ascii') else: c_char_buf = str(param_val) c_buf_len = len(c_char_buf) elif param_types[col_num][0] in ('s','S'): c_char_buf = param_val c_buf_len = len(c_char_buf) elif param_types[col_num][0] in ('u','U'): c_char_buf = UCS_buf(param_val) c_buf_len = len(c_char_buf) elif param_types[col_num][0] == 'dt': max_len = self.connection.type_size_dic[SQL_TYPE_TIMESTAMP][0] datetime_str = param_val.strftime('%Y-%m-%d %H:%M:%S.%f') c_char_buf = datetime_str[:max_len] if py_v3: c_char_buf = bytes(c_char_buf,'ascii') c_buf_len = len(c_char_buf) # print c_buf_len, c_char_buf elif param_types[col_num][0] == 'd': if SQL_TYPE_DATE in self.connection.type_size_dic: max_len = self.connection.type_size_dic[SQL_TYPE_DATE][0] else: max_len = 10 c_char_buf = param_val.isoformat()[:max_len] if py_v3: c_char_buf = bytes(c_char_buf,'ascii') c_buf_len = len(c_char_buf) #print c_char_buf elif param_types[col_num][0] == 't': if SQL_TYPE_TIME in self.connection.type_size_dic: max_len = self.connection.type_size_dic[SQL_TYPE_TIME][0] c_char_buf = param_val.isoformat()[:max_len] c_buf_len = len(c_char_buf) elif SQL_SS_TIME2 in self.connection.type_size_dic: max_len = self.connection.type_size_dic[SQL_SS_TIME2][0] c_char_buf = param_val.isoformat()[:max_len] c_buf_len = len(c_char_buf) else: c_buf_len = self.connection.type_size_dic[SQL_TYPE_TIMESTAMP][0] time_str = param_val.isoformat() if len(time_str) == 8: time_str += '.000' c_char_buf = '1900-01-01 '+time_str[0:c_buf_len - 11] if py_v3: c_char_buf = bytes(c_char_buf,'ascii') #print c_buf_len, c_char_buf elif param_types[col_num][0] == 'b': if param_val == True: c_char_buf = '1' else: c_char_buf = '0' if py_v3: c_char_buf = bytes(c_char_buf,'ascii') c_buf_len = 1 elif param_types[col_num][0] == 'D': #Decimal sign = param_val.as_tuple()[0] == 0 and '+' or '-' digit_string = ''.join([str(x) for x in param_val.as_tuple()[1]]) digit_num, dec_num = param_types[col_num][1] if dec_num > 0: # has decimal left_part = digit_string[:digit_num - dec_num] right_part = digit_string[0-dec_num:] else: # no decimal left_part = digit_string + '0'*(0-dec_num) right_part = '' v = ''.join((sign, left_part,'.', right_part)) if py_v3: c_char_buf = bytes(v,'ascii') else: c_char_buf = v c_buf_len = len(c_char_buf) elif param_types[col_num][0] == 'bi': c_char_buf = str_8b(param_val) c_buf_len = len(c_char_buf) else: c_char_buf = param_val if param_types[col_num][0] == 'bi': param_buffer.raw = str_8b(param_val) else: #print (type(param_val),param_buffer, param_buffer.value) param_buffer.value = c_char_buf if param_types[col_num][0] in ('U','u','S','s'): #ODBC driver will find NUL in unicode and string to determine their length param_buffer_len.value = SQL_NTS else: param_buffer_len.value = c_buf_len col_num += 1 ret = SQLExecute(self.stmt_h) if ret != SQL_SUCCESS: #print param_valparam_buffer, param_buffer.value check_success(self, ret) if not many_mode: self._NumOfRows() self._UpdateDesc() #self._BindCols() else: self.execdirect(query_string) return self def _SQLExecute(self): if not self.connection: self.close() ret = SQLExecute(self.stmt_h) if ret != SQL_SUCCESS: check_success(self, ret) def execdirect(self, query_string): """Execute a query directly""" if not self.connection: self.close() self._free_stmt() self._last_param_types = None self.statement = None if type(query_string) == unicode: c_query_string = wchar_pointer(UCS_buf(query_string)) ret = ODBC_API.SQLExecDirectW(self.stmt_h, c_query_string, len(query_string)) else: c_query_string = ctypes.c_char_p(query_string) ret = ODBC_API.SQLExecDirect(self.stmt_h, c_query_string, len(query_string)) check_success(self, ret) self._NumOfRows() self._UpdateDesc() #self._BindCols() return self def callproc(self, procname, args): if not self.connection: self.close() raise Warning('', 'Still not fully implemented') self._pram_io_list = [row[4] for row in self.procedurecolumns(procedure = procname).fetchall() if row[4] not in (SQL_RESULT_COL, SQL_RETURN_VALUE)] print('pram_io_list: '+str(self._pram_io_list)) call_escape = '{CALL '+procname if args: call_escape += '(' + ','.join(['?' for params in args]) + ')' call_escape += '}' self.execute(call_escape, args, call_mode = True) result = [] for buf, buf_len, sql_type in self._ParamBufferList: if buf_len.value == -1: result.append(None) else: result.append(self.connection.output_converter[sql_type](buf.value)) return result def executemany(self, query_string, params_list = [None]): if not self.connection: self.close() for params in params_list: self.execute(query_string, params, many_mode = True) self._NumOfRows() self.rowcount = -1 self._UpdateDesc() #self._BindCols() def _CreateColBuf(self): if not self.connection: self.close() self._free_stmt(SQL_UNBIND) NOC = self._NumOfCols() self._ColBufferList = [] bind_data = True for col_num in range(NOC): col_name = self.description[col_num][0] col_size = self.description[col_num][2] col_sql_data_type = self._ColTypeCodeList[col_num] target_type = SQL_data_type_dict[col_sql_data_type][2] dynamic_length = SQL_data_type_dict[col_sql_data_type][5] # set default size base on the column's sql data type total_buf_len = SQL_data_type_dict[col_sql_data_type][4] # over-write if there's pre-set size value for "large columns" if total_buf_len > 20500: total_buf_len = self._outputsize.get(None,total_buf_len) # over-write if there's pre-set size value for the "col_num" column total_buf_len = self._outputsize.get(col_num, total_buf_len) # if the size of the buffer is very long, do not bind # because a large buffer decrease performance, and sometimes you only get a NULL value. # in that case use sqlgetdata instead. if col_size >= 1024: dynamic_length = True alloc_buffer = SQL_data_type_dict[col_sql_data_type][3](total_buf_len) used_buf_len = c_ssize_t() force_unicode = self.connection.unicode_results if force_unicode and col_sql_data_type in (SQL_CHAR,SQL_VARCHAR,SQL_LONGVARCHAR): target_type = SQL_C_WCHAR alloc_buffer = create_buffer_u(total_buf_len) buf_cvt_func = self.connection.output_converter[self._ColTypeCodeList[col_num]] if bind_data: if dynamic_length: bind_data = False self._ColBufferList.append([col_name, target_type, used_buf_len, ADDR(used_buf_len), alloc_buffer, ADDR(alloc_buffer), total_buf_len, buf_cvt_func, bind_data]) if bind_data: ret = ODBC_API.SQLBindCol(self.stmt_h, col_num + 1, target_type, ADDR(alloc_buffer), total_buf_len, ADDR(used_buf_len)) if ret != SQL_SUCCESS: check_success(self, ret) def _UpdateDesc(self): "Get the information of (name, type_code, display_size, internal_size, col_precision, scale, null_ok)" if not self.connection: self.close() force_unicode = self.connection.unicode_results if force_unicode: Cname = create_buffer_u(1024) else: Cname = create_buffer(1024) Cname_ptr = c_short() Ctype_code = c_short() Csize = ctypes.c_size_t() Cdisp_size = c_ssize_t(0) CDecimalDigits = c_short() Cnull_ok = c_short() ColDescr = [] self._ColTypeCodeList = [] NOC = self._NumOfCols() for col in range(1, NOC+1): ret = ODBC_API.SQLColAttribute(self.stmt_h, col, SQL_DESC_DISPLAY_SIZE, ADDR(create_buffer(10)), 10, ADDR(c_short()),ADDR(Cdisp_size)) if ret != SQL_SUCCESS: check_success(self, ret) if force_unicode: ret = ODBC_API.SQLDescribeColW(self.stmt_h, col, Cname, len(Cname), ADDR(Cname_ptr),\ ADDR(Ctype_code),ADDR(Csize),ADDR(CDecimalDigits), ADDR(Cnull_ok)) if ret != SQL_SUCCESS: check_success(self, ret) else: ret = ODBC_API.SQLDescribeCol(self.stmt_h, col, Cname, len(Cname), ADDR(Cname_ptr),\ ADDR(Ctype_code),ADDR(Csize),ADDR(CDecimalDigits), ADDR(Cnull_ok)) if ret != SQL_SUCCESS: check_success(self, ret) col_name = Cname.value if lowercase: col_name = col_name.lower() #(name, type_code, display_size, ColDescr.append((col_name, SQL_data_type_dict.get(Ctype_code.value,(Ctype_code.value,))[0],Cdisp_size.value,\ Csize.value, Csize.value,CDecimalDigits.value,Cnull_ok.value == 1 and True or False)) self._ColTypeCodeList.append(Ctype_code.value) if len(ColDescr) > 0: self.description = ColDescr # Create the row type before fetching. self._row_type = self.row_type_callable(self) else: self.description = None self._CreateColBuf() def _NumOfRows(self): """Get the number of rows""" if not self.connection: self.close() NOR = c_ssize_t() ret = SQLRowCount(self.stmt_h, ADDR(NOR)) if ret != SQL_SUCCESS: check_success(self, ret) self.rowcount = NOR.value return self.rowcount def _NumOfCols(self): """Get the number of cols""" if not self.connection: self.close() NOC = c_short() ret = SQLNumResultCols(self.stmt_h, ADDR(NOC)) if ret != SQL_SUCCESS: check_success(self, ret) return NOC.value def fetchall(self): if not self.connection: self.close() rows = [] while True: row = self.fetchone() if row is None: break rows.append(row) return rows def fetchmany(self, num = None): if not self.connection: self.close() if num is None: num = self.arraysize rows = [] while len(rows) < num: row = self.fetchone() if row is None: break rows.append(row) return rows def fetchone(self): if not self.connection: self.close() ret = SQLFetch(self.stmt_h) if ret in (SQL_SUCCESS,SQL_SUCCESS_WITH_INFO): '''Bind buffers for the record set columns''' value_list = [] col_num = 1 for col_name, target_type, used_buf_len, ADDR_used_buf_len, alloc_buffer, ADDR_alloc_buffer, total_buf_len, buf_cvt_func, bind_data in self._ColBufferList: raw_data_parts = [] while 1: if bind_data: ret = SQL_SUCCESS else: ret = SQLGetData(self.stmt_h, col_num, target_type, ADDR_alloc_buffer, total_buf_len, ADDR_used_buf_len) if ret == SQL_SUCCESS: if used_buf_len.value == SQL_NULL_DATA: value_list.append(None) else: if raw_data_parts == []: # Means no previous data, no need to combine if target_type == SQL_C_BINARY: value_list.append(buf_cvt_func(alloc_buffer.raw[:used_buf_len.value])) elif target_type == SQL_C_WCHAR: value_list.append(buf_cvt_func(from_buffer_u(alloc_buffer))) else: value_list.append(buf_cvt_func(alloc_buffer.value)) else: # There are previous fetched raw data to combine if target_type == SQL_C_BINARY: raw_data_parts.append(alloc_buffer.raw[:used_buf_len.value]) elif target_type == SQL_C_WCHAR: raw_data_parts.append(from_buffer_u(alloc_buffer)) else: raw_data_parts.append(alloc_buffer.value) break elif ret == SQL_SUCCESS_WITH_INFO: # Means the data is only partial if target_type == SQL_C_BINARY: raw_data_parts.append(alloc_buffer.raw) else: raw_data_parts.append(alloc_buffer.value) elif ret == SQL_NO_DATA: # Means all data has been transmitted break else: check_success(self, ret) if raw_data_parts != []: if py_v3: if target_type != SQL_C_BINARY: raw_value = ''.join(raw_data_parts) else: raw_value = BLANK_BYTE.join(raw_data_parts) else: raw_value = ''.join(raw_data_parts) value_list.append(buf_cvt_func(raw_value)) col_num += 1 return self._row_type(value_list) else: if ret == SQL_NO_DATA_FOUND: return None else: check_success(self, ret) def __next__(self): return self.next() def next(self): row = self.fetchone() if row is None: raise(StopIteration) return row def __iter__(self): return self def skip(self, count = 0): if not self.connection: self.close() for i in range(count): ret = ODBC_API.SQLFetchScroll(self.stmt_h, SQL_FETCH_NEXT, 0) if ret != SQL_SUCCESS: check_success(self, ret) return None def nextset(self): if not self.connection: self.close() ret = ODBC_API.SQLMoreResults(self.stmt_h) if ret not in (SQL_SUCCESS, SQL_NO_DATA): check_success(self, ret) if ret == SQL_NO_DATA: self._free_stmt() return False else: self._NumOfRows() self._UpdateDesc() #self._BindCols() return True def _free_stmt(self, free_type = None): if not self.connection: self.close() if not self.connection.connected: raise ProgrammingError('HY000','Attempt to use a closed connection.') #self.description = None #self.rowcount = -1 if free_type in (SQL_CLOSE, None): ret = ODBC_API.SQLFreeStmt(self.stmt_h, SQL_CLOSE) if ret != SQL_SUCCESS: check_success(self, ret) if free_type in (SQL_UNBIND, None): ret = ODBC_API.SQLFreeStmt(self.stmt_h, SQL_UNBIND) if ret != SQL_SUCCESS: check_success(self, ret) if free_type in (SQL_RESET_PARAMS, None): ret = ODBC_API.SQLFreeStmt(self.stmt_h, SQL_RESET_PARAMS) if ret != SQL_SUCCESS: check_success(self, ret) def getTypeInfo(self, sqlType = None): if not self.connection: self.close() if sqlType is None: type = SQL_ALL_TYPES else: type = sqlType ret = ODBC_API.SQLGetTypeInfo(self.stmt_h, type) if ret in (SQL_SUCCESS, SQL_SUCCESS_WITH_INFO): self._NumOfRows() self._UpdateDesc() #self._BindCols() return self.fetchone() def tables(self, table=None, catalog=None, schema=None, tableType=None): """Return a list with all tables""" if not self.connection: self.close() l_catalog = l_schema = l_table = l_tableType = 0 if unicode in [type(x) for x in (table, catalog, schema,tableType)]: string_p = lambda x:wchar_pointer(UCS_buf(x)) API_f = ODBC_API.SQLTablesW else: string_p = ctypes.c_char_p API_f = ODBC_API.SQLTables if catalog is not None: l_catalog = len(catalog) catalog = string_p(catalog) if schema is not None: l_schema = len(schema) schema = string_p(schema) if table is not None: l_table = len(table) table = string_p(table) if tableType is not None: l_tableType = len(tableType) tableType = string_p(tableType) self._free_stmt() self._last_param_types = None self.statement = None ret = API_f(self.stmt_h, catalog, l_catalog, schema, l_schema, table, l_table, tableType, l_tableType) check_success(self, ret) self._NumOfRows() self._UpdateDesc() #self._BindCols() return self def columns(self, table=None, catalog=None, schema=None, column=None): """Return a list with all columns""" if not self.connection: self.close() l_catalog = l_schema = l_table = l_column = 0 if unicode in [type(x) for x in (table, catalog, schema,column)]: string_p = lambda x:wchar_pointer(UCS_buf(x)) API_f = ODBC_API.SQLColumnsW else: string_p = ctypes.c_char_p API_f = ODBC_API.SQLColumns if catalog is not None: l_catalog = len(catalog) catalog = string_p(catalog) if schema is not None: l_schema = len(schema) schema = string_p(schema) if table is not None: l_table = len(table) table = string_p(table) if column is not None: l_column = len(column) column = string_p(column) self._free_stmt() self._last_param_types = None self.statement = None ret = API_f(self.stmt_h, catalog, l_catalog, schema, l_schema, table, l_table, column, l_column) check_success(self, ret) self._NumOfRows() self._UpdateDesc() #self._BindCols() return self def primaryKeys(self, table=None, catalog=None, schema=None): if not self.connection: self.close() l_catalog = l_schema = l_table = 0 if unicode in [type(x) for x in (table, catalog, schema)]: string_p = lambda x:wchar_pointer(UCS_buf(x)) API_f = ODBC_API.SQLPrimaryKeysW else: string_p = ctypes.c_char_p API_f = ODBC_API.SQLPrimaryKeys if catalog is not None: l_catalog = len(catalog) catalog = string_p(catalog) if schema is not None: l_schema = len(schema) schema = string_p(schema) if table is not None: l_table = len(table) table = string_p(table) self._free_stmt() self._last_param_types = None self.statement = None ret = API_f(self.stmt_h, catalog, l_catalog, schema, l_schema, table, l_table) check_success(self, ret) self._NumOfRows() self._UpdateDesc() #self._BindCols() return self def foreignKeys(self, table=None, catalog=None, schema=None, foreignTable=None, foreignCatalog=None, foreignSchema=None): if not self.connection: self.close() l_catalog = l_schema = l_table = l_foreignTable = l_foreignCatalog = l_foreignSchema = 0 if unicode in [type(x) for x in (table, catalog, schema,foreignTable,foreignCatalog,foreignSchema)]: string_p = lambda x:wchar_pointer(UCS_buf(x)) API_f = ODBC_API.SQLForeignKeysW else: string_p = ctypes.c_char_p API_f = ODBC_API.SQLForeignKeys if catalog is not None: l_catalog = len(catalog) catalog = string_p(catalog) if schema is not None: l_schema = len(schema) schema = string_p(schema) if table is not None: l_table = len(table) table = string_p(table) if foreignTable is not None: l_foreignTable = len(foreignTable) foreignTable = string_p(foreignTable) if foreignCatalog is not None: l_foreignCatalog = len(foreignCatalog) foreignCatalog = string_p(foreignCatalog) if foreignSchema is not None: l_foreignSchema = len(foreignSchema) foreignSchema = string_p(foreignSchema) self._free_stmt() self._last_param_types = None self.statement = None ret = API_f(self.stmt_h, catalog, l_catalog, schema, l_schema, table, l_table, foreignCatalog, l_foreignCatalog, foreignSchema, l_foreignSchema, foreignTable, l_foreignTable) check_success(self, ret) self._NumOfRows() self._UpdateDesc() #self._BindCols() return self def procedurecolumns(self, procedure=None, catalog=None, schema=None, column=None): if not self.connection: self.close() l_catalog = l_schema = l_procedure = l_column = 0 if unicode in [type(x) for x in (procedure, catalog, schema,column)]: string_p = lambda x:wchar_pointer(UCS_buf(x)) API_f = ODBC_API.SQLProcedureColumnsW else: string_p = ctypes.c_char_p API_f = ODBC_API.SQLProcedureColumns if catalog is not None: l_catalog = len(catalog) catalog = string_p(catalog) if schema is not None: l_schema = len(schema) schema = string_p(schema) if procedure is not None: l_procedure = len(procedure) procedure = string_p(procedure) if column is not None: l_column = len(column) column = string_p(column) self._free_stmt() self._last_param_types = None self.statement = None ret = API_f(self.stmt_h, catalog, l_catalog, schema, l_schema, procedure, l_procedure, column, l_column) check_success(self, ret) self._NumOfRows() self._UpdateDesc() return self def procedures(self, procedure=None, catalog=None, schema=None): if not self.connection: self.close() l_catalog = l_schema = l_procedure = 0 if unicode in [type(x) for x in (procedure, catalog, schema)]: string_p = lambda x:wchar_pointer(UCS_buf(x)) API_f = ODBC_API.SQLProceduresW else: string_p = ctypes.c_char_p API_f = ODBC_API.SQLProcedures if catalog is not None: l_catalog = len(catalog) catalog = string_p(catalog) if schema is not None: l_schema = len(schema) schema = string_p(schema) if procedure is not None: l_procedure = len(procedure) procedure = string_p(procedure) self._free_stmt() self._last_param_types = None self.statement = None ret = API_f(self.stmt_h, catalog, l_catalog, schema, l_schema, procedure, l_procedure) check_success(self, ret) self._NumOfRows() self._UpdateDesc() return self def statistics(self, table, catalog=None, schema=None, unique=False, quick=True): if not self.connection: self.close() l_table = l_catalog = l_schema = 0 if unicode in [type(x) for x in (table, catalog, schema)]: string_p = lambda x:wchar_pointer(UCS_buf(x)) API_f = ODBC_API.SQLStatisticsW else: string_p = ctypes.c_char_p API_f = ODBC_API.SQLStatistics if catalog is not None: l_catalog = len(catalog) catalog = string_p(catalog) if schema is not None: l_schema = len(schema) schema = string_p(schema) if table is not None: l_table = len(table) table = string_p(table) if unique: Unique = SQL_INDEX_UNIQUE else: Unique = SQL_INDEX_ALL if quick: Reserved = SQL_QUICK else: Reserved = SQL_ENSURE self._free_stmt() self._last_param_types = None self.statement = None ret = API_f(self.stmt_h, catalog, l_catalog, schema, l_schema, table, l_table, Unique, Reserved) check_success(self, ret) self._NumOfRows() self._UpdateDesc() #self._BindCols() return self def commit(self): if not self.connection: self.close() self.connection.commit() def rollback(self): if not self.connection: self.close() self.connection.rollback() def setoutputsize(self, size, column = None): if not self.connection: self.close() self._outputsize[column] = size def setinputsizes(self, sizes): if not self.connection: self.close() self._inputsizers = [size for size in sizes] def close(self): """ Call SQLCloseCursor API to free the statement handle""" # ret = ODBC_API.SQLCloseCursor(self.stmt_h) # check_success(self, ret) # if self.connection.connected: ret = ODBC_API.SQLFreeStmt(self.stmt_h, SQL_CLOSE) check_success(self, ret) ret = ODBC_API.SQLFreeStmt(self.stmt_h, SQL_UNBIND) check_success(self, ret) ret = ODBC_API.SQLFreeStmt(self.stmt_h, SQL_RESET_PARAMS) check_success(self, ret) ret = ODBC_API.SQLFreeHandle(SQL_HANDLE_STMT, self.stmt_h) check_success(self, ret) self.closed = True def __del__(self): if not self.closed: self.close() def __exit__(self, type, value, traceback): if not self.connection: self.close() if value: self.rollback() else: self.commit() self.close() def __enter__(self): return self # This class implement a odbc connection. # # connection_timeout = 0 class Connection: def __init__(self, connectString = '', autocommit = False, ansi = False, timeout = 0, unicode_results = use_unicode, readonly = False, **kargs): """Init variables and connect to the engine""" self.connected = 0 self.type_size_dic = {} self.ansi = False self.unicode_results = False self.dbc_h = ctypes.c_void_p() self.autocommit = autocommit self.readonly = False # the query timeout value self.timeout = 0 # self._cursors = [] for key, value in list(kargs.items()): connectString = connectString + key + '=' + value + ';' self.connectString = connectString self.clear_output_converters() try: lock.acquire() if shared_env_h is None: #Initialize an enviroment if it is not created. AllocateEnv() finally: lock.release() # Allocate an DBC handle self.dbc_h under the environment shared_env_h # This DBC handle is actually the basis of a "connection" # The handle of self.dbc_h will be used to connect to a certain source # in the self.connect and self.ConnectByDSN method ret = ODBC_API.SQLAllocHandle(SQL_HANDLE_DBC, shared_env_h, ADDR(self.dbc_h)) check_success(self, ret) self.connection_timeout = connection_timeout if self.connection_timeout != 0: self.set_connection_timeout(connection_timeout) self.connect(connectString, autocommit, ansi, timeout, unicode_results, readonly) def set_connection_timeout(self,connection_timeout): self.connection_timeout = connection_timeout ret = ODBC_API.SQLSetConnectAttr(self.dbc_h, SQL_ATTR_CONNECTION_TIMEOUT, connection_timeout, SQL_IS_UINTEGER); check_success(self, ret) def connect(self, connectString = '', autocommit = False, ansi = False, timeout = 0, unicode_results = use_unicode, readonly = False): """Connect to odbc, using connect strings and set the connection's attributes like autocommit and timeout by calling SQLSetConnectAttr """ # Before we establish the connection by the connection string # Set the connection's attribute of "timeout" (Actully LOGIN_TIMEOUT) if timeout != 0: ret = ODBC_API.SQLSetConnectAttr(self.dbc_h, SQL_ATTR_LOGIN_TIMEOUT, timeout, SQL_IS_UINTEGER); check_success(self, ret) # Create one connection with a connect string by calling SQLDriverConnect # and make self.dbc_h the handle of this connection # Convert the connetsytring to encoded string # so it can be converted to a ctypes c_char array object self.ansi = ansi if not ansi: c_connectString = wchar_pointer(UCS_buf(self.connectString)) odbc_func = ODBC_API.SQLDriverConnectW else: c_connectString = ctypes.c_char_p(self.connectString) odbc_func = ODBC_API.SQLDriverConnect # With unixODBC, SQLDriverConnect will intermittently fail with error: # [01000] [unixODBC][Driver Manager]Can't open lib '/path/to/so' : file not found" # or: # [01000] [unixODBC][Driver Manager]Can't open lib '/path/to/so' : (null)" # when called concurrently by more than one threads. So, we have to # use a lock to serialize the calls. By the way, the error is much # less likely to happen if ODBC Tracing is enabled, likely due to the # implicit serialization caused by writing to trace file. if ODBC_API._name != 'odbc32': try: lock.acquire() ret = odbc_func(self.dbc_h, 0, c_connectString, len(self.connectString), None, 0, None, SQL_DRIVER_NOPROMPT) finally: lock.release() else: ret = odbc_func(self.dbc_h, 0, c_connectString, len(self.connectString), None, 0, None, SQL_DRIVER_NOPROMPT) check_success(self, ret) # Set the connection's attribute of "autocommit" # self.autocommit = autocommit if self.autocommit == True: ret = ODBC_API.SQLSetConnectAttr(self.dbc_h, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_ON, SQL_IS_UINTEGER) else: ret = ODBC_API.SQLSetConnectAttr(self.dbc_h, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF, SQL_IS_UINTEGER) check_success(self, ret) # Set the connection's attribute of "readonly" # self.readonly = readonly if self.readonly == True: ret = ODBC_API.SQLSetConnectAttr(self.dbc_h, SQL_ATTR_ACCESS_MODE, SQL_MODE_READ_ONLY, SQL_IS_UINTEGER) check_success(self, ret) self.unicode_results = unicode_results self.connected = 1 self.update_db_special_info() def clear_output_converters(self): self.output_converter = {} for sqltype, profile in SQL_data_type_dict.items(): self.output_converter[sqltype] = profile[1] def add_output_converter(self, sqltype, func): self.output_converter[sqltype] = func def ConnectByDSN(self, dsn, user, passwd = ''): """Connect to odbc, we need dsn, user and optionally password""" self.dsn = dsn self.user = user self.passwd = passwd sn = create_buffer(dsn) un = create_buffer(user) pw = create_buffer(passwd) ret = ODBC_API.SQLConnect(self.dbc_h, sn, len(sn), un, len(un), pw, len(pw)) check_success(self, ret) self.update_db_special_info() self.connected = 1 def cursor(self, row_type_callable=None): #self.settimeout(self.timeout) if not self.connected: raise ProgrammingError('HY000','Attempt to use a closed connection.') cur = Cursor(self, row_type_callable=row_type_callable) # self._cursors.append(cur) return cur def update_db_special_info(self): for sql_type in ( SQL_TYPE_TIMESTAMP, SQL_TYPE_DATE, SQL_TYPE_TIME, SQL_SS_TIME2, ): cur = Cursor(self) try: info_tuple = cur.getTypeInfo(sql_type) if info_tuple is not None: self.type_size_dic[sql_type] = info_tuple[2], info_tuple[14] except: pass cur.close() self.support_SQLDescribeParam = False try: driver_name = self.getinfo(SQL_DRIVER_NAME) if any(x in driver_name for x in ('SQLSRV','ncli','libsqlncli')): self.support_SQLDescribeParam = True except: pass def commit(self): if not self.connected: raise ProgrammingError('HY000','Attempt to use a closed connection.') ret = SQLEndTran(SQL_HANDLE_DBC, self.dbc_h, SQL_COMMIT) if ret != SQL_SUCCESS: check_success(self, ret) def rollback(self): if not self.connected: raise ProgrammingError('HY000','Attempt to use a closed connection.') ret = SQLEndTran(SQL_HANDLE_DBC, self.dbc_h, SQL_ROLLBACK) if ret != SQL_SUCCESS: check_success(self, ret) def getinfo(self,infotype): if infotype not in list(aInfoTypes.keys()): raise ProgrammingError('HY000','Invalid getinfo value: '+str(infotype)) if aInfoTypes[infotype] == 'GI_UINTEGER': total_buf_len = 1000 alloc_buffer = ctypes.c_ulong() used_buf_len = c_short() ret = ODBC_API.SQLGetInfo(self.dbc_h,infotype,ADDR(alloc_buffer), total_buf_len,\ ADDR(used_buf_len)) check_success(self, ret) result = alloc_buffer.value elif aInfoTypes[infotype] == 'GI_USMALLINT': total_buf_len = 1000 alloc_buffer = ctypes.c_ushort() used_buf_len = c_short() ret = ODBC_API.SQLGetInfo(self.dbc_h,infotype,ADDR(alloc_buffer), total_buf_len,\ ADDR(used_buf_len)) check_success(self, ret) result = alloc_buffer.value else: total_buf_len = 1000 alloc_buffer = create_buffer(total_buf_len) used_buf_len = c_short() if self.ansi: API_f = ODBC_API.SQLGetInfo else: API_f = ODBC_API.SQLGetInfoW ret = API_f(self.dbc_h,infotype,ADDR(alloc_buffer), total_buf_len,\ ADDR(used_buf_len)) check_success(self, ret) if self.ansi: result = alloc_buffer.value else: result = UCS_dec(alloc_buffer) if aInfoTypes[infotype] == 'GI_YESNO': if unicode(result[0]) == unicode('Y'): result = True else: result = False return result def __exit__(self, type, value, traceback): if value: self.rollback() else: self.commit() if self.connected: self.close() def __enter__(self): return self def __del__(self): if self.connected: self.close() def close(self): if not self.connected: raise ProgrammingError('HY000','Attempt to close a closed connection.') # for cur in self._cursors: # if not cur is None: # if not cur.closed: # cur.close() if self.connected: #if DEBUG:print 'disconnect' if not self.autocommit: self.rollback() ret = ODBC_API.SQLDisconnect(self.dbc_h) check_success(self, ret) #if DEBUG:print 'free dbc' ret = ODBC_API.SQLFreeHandle(SQL_HANDLE_DBC, self.dbc_h) check_success(self, ret) # if shared_env_h.value: # #if DEBUG:print 'env' # ret = ODBC_API.SQLFreeHandle(SQL_HANDLE_ENV, shared_env_h) # check_success(shared_env_h, ret) self.connected = 0 odbc = Connection connect = odbc ''' def connect(connectString = '', autocommit = False, ansi = False, timeout = 0, unicode_results = False, readonly = False, **kargs): return odbc(connectString, autocommit, ansi, timeout, unicode_results, readonly, kargs) ''' def drivers(): if sys.platform not in ('win32','cli'): raise Exception('This function is available for use in Windows only.') try: lock.acquire() if shared_env_h is None: AllocateEnv() finally: lock.release() DriverDescription = create_buffer_u(1000) BufferLength1 = c_short(1000) DescriptionLength = c_short() DriverAttributes = create_buffer_u(1000) BufferLength2 = c_short(1000) AttributesLength = c_short() ret = SQL_SUCCESS DriverList = [] Direction = SQL_FETCH_FIRST while ret != SQL_NO_DATA: ret = ODBC_API.SQLDriversW(shared_env_h, Direction , DriverDescription , BufferLength1 , ADDR(DescriptionLength), DriverAttributes, BufferLength2, ADDR(AttributesLength)) check_success(shared_env_h, ret) DriverList.append(DriverDescription.value) if Direction == SQL_FETCH_FIRST: Direction = SQL_FETCH_NEXT return DriverList def win_create_mdb(mdb_path, sort_order = "General\0\0"): if sys.platform not in ('win32','cli'): raise Exception('This function is available for use in Windows only.') mdb_driver = [d for d in drivers() if 'Microsoft Access Driver (*.mdb' in d] if mdb_driver == []: raise Exception('Access Driver is not found.') else: driver_name = mdb_driver[0].encode('mbcs') #CREATE_DB= ctypes.windll.ODBCCP32.SQLConfigDataSource.argtypes = [ctypes.c_void_p,ctypes.c_ushort,ctypes.c_char_p,ctypes.c_char_p] if py_v3: c_Path = bytes("CREATE_DB=" + mdb_path + " " + sort_order,'mbcs') else: c_Path = "CREATE_DB=" + mdb_path + " " + sort_order ODBC_ADD_SYS_DSN = 1 ret = ctypes.windll.ODBCCP32.SQLConfigDataSource(None,ODBC_ADD_SYS_DSN,driver_name, c_Path) if not ret: raise Exception('Failed to create Access mdb file - "%s". Please check file path, permission and Access driver readiness.' %mdb_path) def win_connect_mdb(mdb_path): if sys.platform not in ('win32','cli'): raise Exception('This function is available for use in Windows only.') mdb_driver = [d for d in drivers() if 'Microsoft Access Driver (*.mdb' in d] if mdb_driver == []: raise Exception('Access Driver is not found.') else: driver_name = mdb_driver[0] return connect('Driver={'+driver_name+"};DBQ="+mdb_path, unicode_results = use_unicode, readonly = False) def win_compact_mdb(mdb_path, compacted_mdb_path, sort_order = "General\0\0"): if sys.platform not in ('win32','cli'): raise Exception('This function is available for use in Windows only.') mdb_driver = [d for d in drivers() if 'Microsoft Access Driver (*.mdb' in d] if mdb_driver == []: raise Exception('Access Driver is not found.') else: driver_name = mdb_driver[0].encode('mbcs') #COMPACT_DB= ctypes.windll.ODBCCP32.SQLConfigDataSource.argtypes = [ctypes.c_void_p,ctypes.c_ushort,ctypes.c_char_p,ctypes.c_char_p] #driver_name = "Microsoft Access Driver (*.mdb)" if py_v3: c_Path = bytes("COMPACT_DB=" + mdb_path + " " + compacted_mdb_path + " " + sort_order,'mbcs') #driver_name = bytes(driver_name,'mbcs') else: c_Path = "COMPACT_DB=" + mdb_path + " " + compacted_mdb_path + " " + sort_order ODBC_ADD_SYS_DSN = 1 ret = ctypes.windll.ODBCCP32.SQLConfigDataSource(None,ODBC_ADD_SYS_DSN,driver_name, c_Path) if not ret: raise Exception('Failed to compact Access mdb file - "%s". Please check file path, permission and Access driver readiness.' %compacted_mdb_path) def dataSources(): """Return a list with [name, descrition]""" dsn = create_buffer(1024) desc = create_buffer(1024) dsn_len = c_short() desc_len = c_short() dsn_list = {} try: lock.acquire() if shared_env_h is None: AllocateEnv() finally: lock.release() while 1: ret = ODBC_API.SQLDataSources(shared_env_h, SQL_FETCH_NEXT, \ dsn, len(dsn), ADDR(dsn_len), desc, len(desc), ADDR(desc_len)) if ret == SQL_NO_DATA_FOUND: break elif not ret in (SQL_SUCCESS, SQL_SUCCESS_WITH_INFO): ctrl_err(SQL_HANDLE_ENV, shared_env_h, ret) else: dsn_list[dsn.value] = desc.value return dsn_list def monkey_patch_for_gevent(): import functools, gevent apply_e = gevent.get_hub().threadpool.apply_e def monkey_patch(func): @functools.wraps(func) def wrap(*args, **kwargs): #if DEBUG:print('%s called with %s %s' % (func, args, kwargs)) return apply_e(Exception, func, args, kwargs) return wrap for attr in dir(ODBC_API): if attr.startswith('SQL') and hasattr(getattr(ODBC_API, attr), 'argtypes'): setattr(ODBC_API, attr, monkey_patch(getattr(ODBC_API, attr))) web2py-2.12.3.orig/gluon/contrib/plural_rules/0000775000000000000000000000000012564727262017760 5ustar rootrootweb2py-2.12.3.orig/gluon/contrib/plural_rules/ar.py0000664000000000000000000000011412564727262020730 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for ar (Arabic) web2py-2.12.3.orig/gluon/contrib/plural_rules/pl.py0000664000000000000000000000121712564727262020746 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for pl (Polish) nplurals=3 # Polish language has 3 forms: # 1 singular and 2 plurals # Determine plural_id for number *n* as sequence of positive # integers: 0,1,... # NOTE! For singular form ALWAYS return plural_id = 0 get_plural_id = lambda n: (0 if n==1 else 1 if 2<=n<=4 else 2) # Construct and return plural form of *word* using # *plural_id* (which ALWAYS>0). This function will be executed # for words (or phrases) not found in plural_dict dictionary # construct_plural_form = lambda word, plural_id: (word + 'suffix') web2py-2.12.3.orig/gluon/contrib/plural_rules/he.py0000664000000000000000000000110112564727262020717 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for he (Hebrew) nplurals=2 # Hebrew language has 2 forms: # 1 singular and 1 plural # Determine plural_id for number *n* as sequence of positive # integers: 0,1,... # NOTE! For singular form ALWAYS return plural_id = 0 get_plural_id = lambda n: int(n != 1) # Construct and return plural form of *word* using # *plural_id* (which ALWAYS>0). This function will be executed # for words (or phrases) not found in plural_dict dictionary # construct_plural_form = lambda word, plural_id: (word + 'suffix') web2py-2.12.3.orig/gluon/contrib/plural_rules/bg.py0000664000000000000000000000110712564727262020721 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for bg (Bulgarian) nplurals=2 # Bulgarian language has 2 forms: # 1 singular and 1 plural # Determine plural_id for number *n* as sequence of positive # integers: 0,1,... # NOTE! For singular form ALWAYS return plural_id = 0 get_plural_id = lambda n: int(n != 1) # Construct and return plural form of *word* using # *plural_id* (which ALWAYS>0). This function will be executed # for words (or phrases) not found in plural_dict dictionary # construct_plural_form = lambda word, plural_id: (word + 'suffix') web2py-2.12.3.orig/gluon/contrib/plural_rules/tr.py0000664000000000000000000000062412564727262020761 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for tr (Turkish) nplurals=1 # Turkish language has ONE form! # Always returns 0: get_plural_id = lambda n: 0 # Construct and return plural form of *word* using # *plural_id* (which ALWAYS>0). This function will be executed # for words (or phrases) not found in plural_dict dictionary # construct_plural_form = lambda word, plural_id: word web2py-2.12.3.orig/gluon/contrib/plural_rules/it.py0000664000000000000000000000110312564727262020741 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for it (Italian) nplurals=2 # Italian language has 2 forms: # 1 singular and 1 plural # Determine plural_id for number *n* as sequence of positive # integers: 0,1,... # NOTE! For singular form ALWAYS return plural_id = 0 get_plural_id = lambda n: int(n != 1) # Construct and return plural form of *word* using # *plural_id* (which ALWAYS>0). This function will be executed # for words (or phrases) not found in plural_dict dictionary # construct_plural_form = lambda word, plural_id: (word + 'suffix') web2py-2.12.3.orig/gluon/contrib/plural_rules/hu.py0000664000000000000000000000110712564727262020745 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for hu (Hungarian) nplurals=2 # Hungarian language has 2 forms: # 1 singular and 1 plural # Determine plural_id for number *n* as sequence of positive # integers: 0,1,... # NOTE! For singular form ALWAYS return plural_id = 0 get_plural_id = lambda n: int(n != 1) # Construct and return plural form of *word* using # *plural_id* (which ALWAYS>0). This function will be executed # for words (or phrases) not found in plural_dict dictionary # construct_plural_form = lambda word, plural_id: (word + 'suffix') web2py-2.12.3.orig/gluon/contrib/plural_rules/sk.py0000664000000000000000000000141212564727262020745 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for sk (Slovak (Slovakia)) nplurals=3 # Slovak language has 3 forms: # 1 singular and 2 plurals # Determine plural_id for number *n* as sequence of positive # integers: 0,1,... # NOTE! For singular form ALWAYS return plural_id = 0 get_plural_id = lambda n: (0 if n % 10 == 1 and n % 100 != 11 else 1 if n % 10 >= 2 and n % 10 <= 4 and (n % 100 < 10 or n % 100 >= 20) else 2) # construct_plural_form() is not used now because of complex # rules of Slovak language. Default version of this function # is used to simple insert new words into plural_dict dictionary) # construct_plural_form = lambda word, plural_id: word web2py-2.12.3.orig/gluon/contrib/plural_rules/ja.py0000664000000000000000000000062612564727262020730 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for ja (Japanese) nplurals=1 # Japanese language has ONE form! # Always returns 0: get_plural_id = lambda n: 0 # Construct and return plural form of *word* using # *plural_id* (which ALWAYS>0). This function will be executed # for words (or phrases) not found in plural_dict dictionary # construct_plural_form = lambda word, plural_id: word web2py-2.12.3.orig/gluon/contrib/plural_rules/lt.py0000664000000000000000000000133012564727262020746 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for lt (Lithuanian) nplurals=3 # Lithuanian language has 3 forms: # 1 singular and 2 plurals # Determine plural_id for number *n* as sequence of positive # integers: 0,1,... # NOTE! For singular form ALWAYS return plural_id = 0 get_plural_id = lambda n: (0 if n % 10 == 1 and n % 100 != 11 else 1 if n % 10 >= 2 and (n % 100 < 10 or n % 100 >= 20) else 2) # Construct and return plural form of *word* using # *plural_id* (which ALWAYS>0). This function will be executed # for words (or phrases) not found in plural_dict dictionary # construct_plural_form = lambda word, plural_id: (word + 'suffix') web2py-2.12.3.orig/gluon/contrib/plural_rules/pt.py0000664000000000000000000000110012564727262020745 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for pt (Portuguese) nplurals=2 # Portuguese has 2 forms: # 1 singular and 1 plural # Determine plural_id for number *n* as sequence of positive # integers: 0,1,... # NOTE! For singular form ALWAYS return plural_id = 0 get_plural_id = lambda n: int(n != 1) # Construct and return plural form of *word* using # *plural_id* (which ALWAYS>0). This function will be executed # for words (or phrases) not found in plural_dict dictionary # construct_plural_form = lambda word, plural_id: (word + 'suffix') web2py-2.12.3.orig/gluon/contrib/plural_rules/af.py0000664000000000000000000000112612564727262020720 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for af (Afrikaans (South Africa)) nplurals=2 # Afrikaans language has 2 forms: # 1 singular and 1 plural # Determine plural_id for number *n* as sequence of positive # integers: 0,1,... # NOTE! For singular form ALWAYS return plural_id = 0 get_plural_id = lambda n: int(n != 1) # Construct and return plural form of *word* using # *plural_id* (which ALWAYS>0). This function will be executed # for words (or phrases) not found in plural_dict dictionary # construct_plural_form = lambda word, plural_id: (word + 'suffix') web2py-2.12.3.orig/gluon/contrib/plural_rules/__init__.py0000664000000000000000000000000112564727262022060 0ustar rootroot web2py-2.12.3.orig/gluon/contrib/plural_rules/ro.py0000664000000000000000000000107412564727262020754 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for ro (Romanian) nplurals=2 # Romanian has 2 forms: # 1 singular and 1 plural # Determine plural_id for number *n* as sequence of positive # integers: 0,1,... # NOTE! For singular form ALWAYS return plural_id = 0 get_plural_id = lambda n: int(n != 1) # Construct and return plural form of *word* using # *plural_id* (which ALWAYS>0). This function will be executed # for words (or phrases) not found in plural_dict dictionary # construct_plural_form = lambda word, plural_id: (word + 'suffix') web2py-2.12.3.orig/gluon/contrib/plural_rules/uk.py0000664000000000000000000000141212564727262020747 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for uk (Ukrainian) nplurals=3 # Ukrainian language has 3 forms: # 1 singular and 2 plurals # Determine plural_id for number *n* as sequence of positive # integers: 0,1,... # NOTE! For singular form ALWAYS return plural_id = 0 get_plural_id = lambda n: (0 if n % 10 == 1 and n % 100 != 11 else 1 if n % 10 >= 2 and n % 10 <= 4 and (n % 100 < 10 or n % 100 >= 20) else 2) # construct_plural_form() is not used now because of complex # rules of Ukrainian language. Default version of # this function is used to simple insert new words into # plural_dict dictionary) # construct_plural_form = lambda word, plural_id: word web2py-2.12.3.orig/gluon/contrib/plural_rules/hi.py0000664000000000000000000000106612564727262020735 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for he (Hindi) nplurals=2 # Hindi has 2 forms: # 1 singular and 1 plural # Determine plural_id for number *n* as sequence of positive # integers: 0,1,... # NOTE! For singular form ALWAYS return plural_id = 0 get_plural_id = lambda n: int(n != 1) # Construct and return plural form of *word* using # *plural_id* (which ALWAYS>0). This function will be executed # for words (or phrases) not found in plural_dict dictionary # construct_plural_form = lambda word, plural_id: (word + 'suffix') web2py-2.12.3.orig/gluon/contrib/plural_rules/en.py0000664000000000000000000000132412564727262020734 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for en (English) nplurals=2 # English language has 2 forms: # 1 singular and 1 plural # Determine plural_id for number *n* as sequence of positive # integers: 0,1,... # NOTE! For singular form ALWAYS return plural_id = 0 get_plural_id = lambda n: int(n != 1) # Construct and return plural form of *word* using # *plural_id* (which ALWAYS>0). This function will be executed # for words (or phrases) not found in plural_dict dictionary construct_plural_form = lambda word, plural_id: (word + ('es' if word[-1:] in ('s','x','o') or word[-2:] in ('sh','ch') else 's')) web2py-2.12.3.orig/gluon/contrib/plural_rules/id.py0000775000000000000000000000111112564727262020723 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for id (Indonesian) nplurals=2 # Indonesian language has 2 forms: # 1 singular and 1 plural # Determine plural_id for number *n* as sequence of positive # integers: 0,1,... # NOTE! For singular form ALWAYS return plural_id = 0 get_plural_id = lambda n: int(n != 1) # Construct and return plural form of *word* using # *plural_id* (which ALWAYS>0). This function will be executed # for words (or phrases) not found in plural_dict dictionary # construct_plural_form = lambda word, plural_id: (word + 'suffix') web2py-2.12.3.orig/gluon/contrib/plural_rules/nl.py0000664000000000000000000000110412564727262020737 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for nl (Dutch (Netherlands)) nplurals=2 # Dutch has 2 forms: # 1 singular and 1 plural # Determine plural_id for number *n* as sequence of positive # integers: 0,1,... # NOTE! For singular form ALWAYS return plural_id = 0 get_plural_id = lambda n: int(n != 1) # Construct and return plural form of *word* using # *plural_id* (which ALWAYS>0). This function will be executed # for words (or phrases) not found in plural_dict dictionary # construct_plural_form = lambda word, plural_id: (word + 'suffix') web2py-2.12.3.orig/gluon/contrib/plural_rules/fr.py0000664000000000000000000000110212564727262020733 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for fr (French)) nplurals=2 # French language has 2 forms: # 1 singular and 1 plural # Determine plural_id for number *n* as sequence of positive # integers: 0,1,... # NOTE! For singular form ALWAYS return plural_id = 0 get_plural_id = lambda n: int(n != 1) # Construct and return plural form of *word* using # *plural_id* (which ALWAYS>0). This function will be executed # for words (or phrases) not found in plural_dict dictionary # construct_plural_form = lambda word, plural_id: (word + 'suffix') web2py-2.12.3.orig/gluon/contrib/plural_rules/es.py0000664000000000000000000000136012564727262020741 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for es (Spanish) nplurals=2 # Spanish language has 2 forms: # 1 singular and 1 plural # Determine plural_id for number *n* as sequence of positive # integers: 0,1,... # NOTE! For singular form ALWAYS return plural_id = 0 get_plural_id = lambda n: int(n != 1) # Construct and return plural form of *word* using # *plural_id* (which ALWAYS>0). This function will be executed # for words (or phrases) not found in plural_dict dictionary construct_plural_form = lambda word, plural_id: (word + ('es' if word[-1:] in ('s', 'x', 'y', 'l', 'r', 'n', 'd', 'z', 'j') or word[-2:] == 'ch' else 's')) web2py-2.12.3.orig/gluon/contrib/plural_rules/de.py0000664000000000000000000000110212564727262020714 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for de (Deutsch) nplurals=2 # German language has 2 forms: # 1 singular and 1 plural # Determine plural_id for number *n* as sequence of positive # integers: 0,1,... # NOTE! For singular form ALWAYS return plural_id = 0 get_plural_id = lambda n: int(n != 1) # Construct and return plural form of *word* using # *plural_id* (which ALWAYS>0). This function will be executed # for words (or phrases) not found in plural_dict dictionary # construct_plural_form = lambda word, plural_id: (word + 'suffix') web2py-2.12.3.orig/gluon/contrib/plural_rules/zh.py0000664000000000000000000000062412564727262020755 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for zh (Chinese) nplurals=1 # Chinese language has ONE form! # Always returns 0: get_plural_id = lambda n: 0 # Construct and return plural form of *word* using # *plural_id* (which ALWAYS>0). This function will be executed # for words (or phrases) not found in plural_dict dictionary # construct_plural_form = lambda word, plural_id: word web2py-2.12.3.orig/gluon/contrib/plural_rules/my.py0000775000000000000000000000107712564727262020767 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for id (Malay) nplurals=2 # Malay language has 2 forms: # 1 singular and 1 plural # Determine plural_id for number *n* as sequence of positive # integers: 0,1,... # NOTE! For singular form ALWAYS return plural_id = 0 get_plural_id = lambda n: int(n != 1) # Construct and return plural form of *word* using # *plural_id* (which ALWAYS>0). This function will be executed # for words (or phrases) not found in plural_dict dictionary # construct_plural_form = lambda word, plural_id: (word + 'suffix') web2py-2.12.3.orig/gluon/contrib/plural_rules/cs.py0000664000000000000000000000122312564727262020735 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for cs (Czech) nplurals=3 # Czech language has 3 forms: # 1 singular and 2 plurals # Determine plural_id for number *n* as sequence of positive # integers: 0,1,... # NOTE! For singular form ALWAYS return plural_id = 0 get_plural_id = lambda n: ( 0 if n==1 else 1 if 2<=n<=4 else 2 ) # Construct and return plural form of *word* using # *plural_id* (which ALWAYS>0). This function will be executed # for words (or phrases) not found in plural_dict dictionary # construct_plural_form = lambda word, plural_id: (word + 'suffix') web2py-2.12.3.orig/gluon/contrib/plural_rules/sl.py0000664000000000000000000000133012564727262020745 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for sl (Slovenian) nplurals=4 # Slovenian language has 4 forms: # 1 singular and 3 plurals # Determine plural_id for number *n* as sequence of positive # integers: 0,1,... # NOTE! For singular form ALWAYS return plural_id = 0 get_plural_id = lambda n: (0 if n % 100 == 1 else 1 if n % 100 == 2 else 2 if n % 100 in (3,4) else 3) # Construct and return plural form of *word* using # *plural_id* (which ALWAYS>0). This function will be executed # for words (or phrases) not found in plural_dict dictionary # construct_plural_form = lambda word, plural_id: (word + 'suffix') web2py-2.12.3.orig/gluon/contrib/plural_rules/ru.py0000664000000000000000000000140312564727262020756 0ustar rootroot#!/usr/bin/env python # -*- coding: utf8 -*- # Plural-Forms for ru (Russian) nplurals=3 # Russian language has 3 forms: # 1 singular and 2 plurals # Determine plural_id for number *n* as sequence of positive # integers: 0,1,... # NOTE! For singular form ALWAYS return plural_id = 0 get_plural_id = lambda n: (0 if n % 10 == 1 and n % 100 != 11 else 1 if n % 10 >= 2 and n % 10 <= 4 and (n % 100 < 10 or n % 100 >= 20) else 2) # construct_plural_form() is not used now because of complex # rules of Russian language. Default version of # this function is used to simple insert new words into # plural_dict dictionary) # construct_plural_form = lambda word, plural_id: word web2py-2.12.3.orig/gluon/contrib/google_wallet.py0000664000000000000000000000212712564727262020447 0ustar rootrootfrom gluon import XML def button(merchant_id="123456789012345", products=[dict(name="shoes", quantity=1, price=23.5, currency='USD', description="running shoes black")]): t = '\n' list_products = '' for k, product in enumerate(products): for key in ('name','description','quantity','price','currency'): list_products += t % dict(k=k + 1, key=key, value=product[key]) button = """
\n%(list_products)s\n\n
""" % dict(merchant_id=merchant_id, list_products=list_products) return XML(button) web2py-2.12.3.orig/gluon/contrib/imageutils.py0000664000000000000000000000372112564727262017767 0ustar rootroot# -*- coding: utf-8 -*- ####################################################################### # # Put this file in yourapp/modules/images.py # # Given the model # # db.define_table("table_name", Field("picture", "upload"), # Field("thumbnail", "upload")) # # to resize the picture on upload # # from images import RESIZE # # db.table_name.picture.requires = RESIZE(200, 200) # # to store original image in picture and create a thumbnail # in 'thumbnail' field # # from images import THUMB # db.table_name.thumbnail.compute = lambda row: THUMB(row.picture, 200, 200) ######################################################################### from gluon import current class RESIZE(object): def __init__(self, nx=160, ny=80, quality=100, error_message=' image resize'): (self.nx, self.ny, self.quality, self.error_message) = ( nx, ny, quality, error_message) def __call__(self, value): if isinstance(value, str) and len(value) == 0: return (value, None) from PIL import Image import cStringIO try: img = Image.open(value.file) img.thumbnail((self.nx, self.ny), Image.ANTIALIAS) s = cStringIO.StringIO() img.save(s, 'JPEG', quality=self.quality) s.seek(0) value.file = s except: return (value, self.error_message) else: return (value, None) def THUMB(image, nx=120, ny=120, gae=False, name='thumb'): if image: if not gae: request = current.request from PIL import Image import os img = Image.open(os.path.join(request.folder, 'uploads', image)) img.thumbnail((nx, ny), Image.ANTIALIAS) root, ext = os.path.splitext(image) thumb = '%s_%s%s' % (root, name, ext) img.save(request.folder + 'uploads/' + thumb) return thumb else: return image web2py-2.12.3.orig/gluon/contrib/pbkdf2_ctypes.py0000664000000000000000000001643012564727262020364 0ustar rootroot# -*- coding: utf-8 -*- """ pbkdf2_ctypes ~~~~~~ Fast pbkdf2. This module implements pbkdf2 for Python using crypto lib from openssl or commoncrypto. Note: This module is intended as a plugin replacement of pbkdf2.py by Armin Ronacher. Git repository: $ git clone https://github.com/michele-comitini/pbkdf2_ctypes.git :copyright: Copyright (c) 2013: Michele Comitini :license: LGPLv3 """ import ctypes import ctypes.util import hashlib import platform import os.path import binascii import sys __all__ = ['pkcs5_pbkdf2_hmac', 'pbkdf2_bin', 'pbkdf2_hex'] __version__ = '0.99.3' def _commoncrypto_hashlib_to_crypto_map_get(hashfunc): hashlib_to_crypto_map = {hashlib.sha1: 1, hashlib.sha224: 2, hashlib.sha256: 3, hashlib.sha384: 4, hashlib.sha512: 5} crypto_hashfunc = hashlib_to_crypto_map.get(hashfunc) if crypto_hashfunc is None: raise ValueError('Unkwnown digest %s' % hashfunc) return crypto_hashfunc def _commoncrypto_pbkdf2(data, salt, iterations, digest, keylen): """Common Crypto compatibile wrapper """ c_hashfunc = ctypes.c_uint32(_commoncrypto_hashlib_to_crypto_map_get(digest)) c_pass = ctypes.c_char_p(data) c_passlen = ctypes.c_size_t(len(data)) c_salt = ctypes.c_char_p(salt) c_saltlen = ctypes.c_size_t(len(salt)) c_iter = ctypes.c_uint(iterations) c_keylen = ctypes.c_size_t(keylen) c_buff = ctypes.create_string_buffer(keylen) crypto.CCKeyDerivationPBKDF.restype = ctypes.c_int crypto.CCKeyDerivationPBKDF.argtypes = [ctypes.c_uint32, ctypes.c_char_p, ctypes.c_size_t, ctypes.c_char_p, ctypes.c_size_t, ctypes.c_uint32, ctypes.c_uint, ctypes.c_char_p, ctypes.c_size_t] ret = crypto.CCKeyDerivationPBKDF(2, # hardcoded 2-> PBKDF2 c_pass, c_passlen, c_salt, c_saltlen, c_hashfunc, c_iter, c_buff, c_keylen) return (1 - ret, c_buff) def _openssl_hashlib_to_crypto_map_get(hashfunc): hashlib_to_crypto_map = {hashlib.md5: crypto.EVP_md5, hashlib.sha1: crypto.EVP_sha1, hashlib.sha256: crypto.EVP_sha256, hashlib.sha224: crypto.EVP_sha224, hashlib.sha384: crypto.EVP_sha384, hashlib.sha512: crypto.EVP_sha512} crypto_hashfunc = hashlib_to_crypto_map.get(hashfunc) if crypto_hashfunc is None: raise ValueError('Unkwnown digest %s' % hashfunc) crypto_hashfunc.restype = ctypes.c_void_p return crypto_hashfunc() def _openssl_pbkdf2(data, salt, iterations, digest, keylen): """OpenSSL compatibile wrapper """ c_hashfunc = ctypes.c_void_p(_openssl_hashlib_to_crypto_map_get(digest)) c_pass = ctypes.c_char_p(data) c_passlen = ctypes.c_int(len(data)) c_salt = ctypes.c_char_p(salt) c_saltlen = ctypes.c_int(len(salt)) c_iter = ctypes.c_int(iterations) c_keylen = ctypes.c_int(keylen) c_buff = ctypes.create_string_buffer(keylen) # PKCS5_PBKDF2_HMAC(const char *pass, int passlen, # const unsigned char *salt, int saltlen, int iter, # const EVP_MD *digest, # int keylen, unsigned char *out); crypto.PKCS5_PBKDF2_HMAC.argtypes = [ctypes.c_char_p, ctypes.c_int, ctypes.c_char_p, ctypes.c_int, ctypes.c_int, ctypes.c_void_p, ctypes.c_int, ctypes.c_char_p] crypto.PKCS5_PBKDF2_HMAC.restype = ctypes.c_int err = crypto.PKCS5_PBKDF2_HMAC(c_pass, c_passlen, c_salt, c_saltlen, c_iter, c_hashfunc, c_keylen, c_buff) return (err, c_buff) try: # check that we have proper OpenSSL or Common Crypto on the system. system = platform.system() if system == 'Windows': if platform.architecture()[0] == '64bit': libname = ctypes.util.find_library('libeay64') if not libname: raise OSError('Library not found') crypto = ctypes.CDLL(libname) else: libname = ctypes.util.find_library('libeay32') if not libname: raise OSError('Library libeay32 not found.') crypto = ctypes.CDLL(libname) _pbkdf2_hmac = _openssl_pbkdf2 crypto.PKCS5_PBKDF2_HMAC # test compatibility elif system == 'Darwin': # think different(TM)! i.e. break things! if [int(x) for x in platform.mac_ver()[0].split('.')] < [10, 7, 0]: raise OSError('OS X Version too old %s < 10.7.0' % platform.mac_ver()[0]) libname = ctypes.util.find_library('System') if not libname: raise OSError('Library not found') crypto = ctypes.CDLL(os.path.basename(libname)) _pbkdf2_hmac = _commoncrypto_pbkdf2 else: libname = ctypes.util.find_library('crypto') if not libname: raise OSError('Library crypto not found.') crypto = ctypes.CDLL(os.path.basename(libname)) _pbkdf2_hmac = _openssl_pbkdf2 crypto.PKCS5_PBKDF2_HMAC # test compatibility except (OSError, AttributeError): _, e, _ = sys.exc_info() raise ImportError('Cannot find a compatible cryptographic library ' 'on your system. %s' % e) def pkcs5_pbkdf2_hmac(data, salt, iterations=1000, keylen=24, hashfunc=None): if hashfunc is None: hashfunc = hashlib.sha1 err, c_buff = _pbkdf2_hmac(data, salt, iterations, hashfunc, keylen) if err == 0: raise ValueError('wrong parameters') return c_buff.raw[:keylen] def pbkdf2_hex(data, salt, iterations=1000, keylen=24, hashfunc=None): return binascii.hexlify(pkcs5_pbkdf2_hmac(data, salt, iterations, keylen, hashfunc)) def pbkdf2_bin(data, salt, iterations=1000, keylen=24, hashfunc=None): return pkcs5_pbkdf2_hmac(data, salt, iterations, keylen, hashfunc) if __name__ == '__main__': try: crypto.SSLeay_version.restype = ctypes.c_char_p print(crypto.SSLeay_version(0)) except: pass import platform if platform.python_version_tuple() < ('3', '0', '0'): def bytes(*args): return str(args[0]) for h in [hashlib.sha1, hashlib.sha224, hashlib.sha256, hashlib.sha384, hashlib.sha512]: print(binascii.hexlify(pkcs5_pbkdf2_hmac(bytes('secret', 'utf-8') * 11, bytes('salt', 'utf-8'), hashfunc=h))) web2py-2.12.3.orig/gluon/contrib/feedparser.py0000664000000000000000000050526712564727262017760 0ustar rootroot"""Universal feed parser Handles RSS 0.9x, RSS 1.0, RSS 2.0, CDF, Atom 0.3, and Atom 1.0 feeds Visit https://code.google.com/p/feedparser/ for the latest version Visit http://packages.python.org/feedparser/ for the latest documentation Required: Python 2.4 or later Recommended: iconv_codec """ __version__ = "5.1.3" __license__ = """ Copyright (c) 2010-2012 Kurt McKee Copyright (c) 2002-2008 Mark Pilgrim All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.""" __author__ = "Mark Pilgrim " __contributors__ = ["Jason Diamond ", "John Beimler ", "Fazal Majid ", "Aaron Swartz ", "Kevin Marks ", "Sam Ruby ", "Ade Oshineye ", "Martin Pool ", "Kurt McKee ", "Bernd Schlapsi ",] # HTTP "User-Agent" header to send to servers when downloading feeds. # If you are embedding feedparser in a larger application, you should # change this to your application name and URL. USER_AGENT = "UniversalFeedParser/%s +https://code.google.com/p/feedparser/" % __version__ # HTTP "Accept" header to send to servers when downloading feeds. If you don't # want to send an Accept header, set this to None. ACCEPT_HEADER = "application/atom+xml,application/rdf+xml,application/rss+xml,application/x-netcdf,application/xml;q=0.9,text/xml;q=0.2,*/*;q=0.1" # List of preferred XML parsers, by SAX driver name. These will be tried first, # but if they're not installed, Python will keep searching through its own list # of pre-installed parsers until it finds one that supports everything we need. PREFERRED_XML_PARSERS = ["drv_libxml2"] # If you want feedparser to automatically run HTML markup through HTML Tidy, set # this to 1. Requires mxTidy # or utidylib . TIDY_MARKUP = 0 # List of Python interfaces for HTML Tidy, in order of preference. Only useful # if TIDY_MARKUP = 1 PREFERRED_TIDY_INTERFACES = ["uTidy", "mxTidy"] # If you want feedparser to automatically resolve all relative URIs, set this # to 1. RESOLVE_RELATIVE_URIS = 1 # If you want feedparser to automatically sanitize all potentially unsafe # HTML content, set this to 1. SANITIZE_HTML = 1 # If you want feedparser to automatically parse microformat content embedded # in entry contents, set this to 1 PARSE_MICROFORMATS = 1 # ---------- Python 3 modules (make it work if possible) ---------- try: import rfc822 except ImportError: from email import _parseaddr as rfc822 try: # Python 3.1 introduces bytes.maketrans and simultaneously # deprecates string.maketrans; use bytes.maketrans if possible _maketrans = bytes.maketrans except (NameError, AttributeError): import string _maketrans = string.maketrans # base64 support for Atom feeds that contain embedded binary data try: import base64, binascii except ImportError: base64 = binascii = None else: # Python 3.1 deprecates decodestring in favor of decodebytes _base64decode = getattr(base64, 'decodebytes', base64.decodestring) # _s2bytes: convert a UTF-8 str to bytes if the interpreter is Python 3 # _l2bytes: convert a list of ints to bytes if the interpreter is Python 3 try: if bytes is str: # In Python 2.5 and below, bytes doesn't exist (NameError) # In Python 2.6 and above, bytes and str are the same type raise NameError except NameError: # Python 2 def _s2bytes(s): return s def _l2bytes(l): return ''.join(map(chr, l)) else: # Python 3 def _s2bytes(s): return bytes(s, 'utf8') def _l2bytes(l): return bytes(l) # If you want feedparser to allow all URL schemes, set this to () # List culled from Python's urlparse documentation at: # http://docs.python.org/library/urlparse.html # as well as from "URI scheme" at Wikipedia: # https://secure.wikimedia.org/wikipedia/en/wiki/URI_scheme # Many more will likely need to be added! ACCEPTABLE_URI_SCHEMES = ( 'file', 'ftp', 'gopher', 'h323', 'hdl', 'http', 'https', 'imap', 'magnet', 'mailto', 'mms', 'news', 'nntp', 'prospero', 'rsync', 'rtsp', 'rtspu', 'sftp', 'shttp', 'sip', 'sips', 'snews', 'svn', 'svn+ssh', 'telnet', 'wais', # Additional common-but-unofficial schemes 'aim', 'callto', 'cvs', 'facetime', 'feed', 'git', 'gtalk', 'irc', 'ircs', 'irc6', 'itms', 'mms', 'msnim', 'skype', 'ssh', 'smb', 'svn', 'ymsg', ) #ACCEPTABLE_URI_SCHEMES = () # ---------- required modules (should come with any Python distribution) ---------- import cgi import codecs import copy import datetime import re import struct import time import types import urllib import urllib2 import urlparse import warnings from htmlentitydefs import name2codepoint, codepoint2name, entitydefs try: from io import BytesIO as _StringIO except ImportError: try: from cStringIO import StringIO as _StringIO except ImportError: from StringIO import StringIO as _StringIO # ---------- optional modules (feedparser will work without these, but with reduced functionality) ---------- # gzip is included with most Python distributions, but may not be available if you compiled your own try: import gzip except ImportError: gzip = None try: import zlib except ImportError: zlib = None # If a real XML parser is available, feedparser will attempt to use it. feedparser has # been tested with the built-in SAX parser and libxml2. On platforms where the # Python distribution does not come with an XML parser (such as Mac OS X 10.2 and some # versions of FreeBSD), feedparser will quietly fall back on regex-based parsing. try: import xml.sax from xml.sax.saxutils import escape as _xmlescape except ImportError: _XML_AVAILABLE = 0 def _xmlescape(data,entities={}): data = data.replace('&', '&') data = data.replace('>', '>') data = data.replace('<', '<') for char, entity in entities: data = data.replace(char, entity) return data else: try: xml.sax.make_parser(PREFERRED_XML_PARSERS) # test for valid parsers except xml.sax.SAXReaderNotAvailable: _XML_AVAILABLE = 0 else: _XML_AVAILABLE = 1 # sgmllib is not available by default in Python 3; if the end user doesn't have # it available then we'll lose illformed XML parsing, content santizing, and # microformat support (at least while feedparser depends on BeautifulSoup). try: import sgmllib except ImportError: # This is probably Python 3, which doesn't include sgmllib anymore _SGML_AVAILABLE = 0 # Mock sgmllib enough to allow subclassing later on class sgmllib(object): class SGMLParser(object): def goahead(self, i): pass def parse_starttag(self, i): pass else: _SGML_AVAILABLE = 1 # sgmllib defines a number of module-level regular expressions that are # insufficient for the XML parsing feedparser needs. Rather than modify # the variables directly in sgmllib, they're defined here using the same # names, and the compiled code objects of several sgmllib.SGMLParser # methods are copied into _BaseHTMLProcessor so that they execute in # feedparser's scope instead of sgmllib's scope. charref = re.compile('&#(\d+|[xX][0-9a-fA-F]+);') tagfind = re.compile('[a-zA-Z][-_.:a-zA-Z0-9]*') attrfind = re.compile( r'\s*([a-zA-Z_][-:.a-zA-Z_0-9]*)[$]?(\s*=\s*' r'(\'[^\']*\'|"[^"]*"|[][\-a-zA-Z0-9./,:;+*%?!&$\(\)_#=~\'"@]*))?' ) # Unfortunately, these must be copied over to prevent NameError exceptions entityref = sgmllib.entityref incomplete = sgmllib.incomplete interesting = sgmllib.interesting shorttag = sgmllib.shorttag shorttagopen = sgmllib.shorttagopen starttagopen = sgmllib.starttagopen class _EndBracketRegEx: def __init__(self): # Overriding the built-in sgmllib.endbracket regex allows the # parser to find angle brackets embedded in element attributes. self.endbracket = re.compile('''([^'"<>]|"[^"]*"(?=>|/|\s|\w+=)|'[^']*'(?=>|/|\s|\w+=))*(?=[<>])|.*?(?=[<>])''') def search(self, target, index=0): match = self.endbracket.match(target, index) if match is not None: # Returning a new object in the calling thread's context # resolves a thread-safety. return EndBracketMatch(match) return None class EndBracketMatch: def __init__(self, match): self.match = match def start(self, n): return self.match.end(n) endbracket = _EndBracketRegEx() # iconv_codec provides support for more character encodings. # It's available from http://cjkpython.i18n.org/ try: import iconv_codec except ImportError: pass # chardet library auto-detects character encodings # Download from http://chardet.feedparser.org/ try: import chardet except ImportError: chardet = None # BeautifulSoup is used to extract microformat content from HTML # feedparser is tested using BeautifulSoup 3.2.0 # http://www.crummy.com/software/BeautifulSoup/ try: import BeautifulSoup except ImportError: BeautifulSoup = None PARSE_MICROFORMATS = False # ---------- don't touch these ---------- class ThingsNobodyCaresAboutButMe(Exception): pass class CharacterEncodingOverride(ThingsNobodyCaresAboutButMe): pass class CharacterEncodingUnknown(ThingsNobodyCaresAboutButMe): pass class NonXMLContentType(ThingsNobodyCaresAboutButMe): pass class UndeclaredNamespace(Exception): pass SUPPORTED_VERSIONS = {'': u'unknown', 'rss090': u'RSS 0.90', 'rss091n': u'RSS 0.91 (Netscape)', 'rss091u': u'RSS 0.91 (Userland)', 'rss092': u'RSS 0.92', 'rss093': u'RSS 0.93', 'rss094': u'RSS 0.94', 'rss20': u'RSS 2.0', 'rss10': u'RSS 1.0', 'rss': u'RSS (unknown version)', 'atom01': u'Atom 0.1', 'atom02': u'Atom 0.2', 'atom03': u'Atom 0.3', 'atom10': u'Atom 1.0', 'atom': u'Atom (unknown version)', 'cdf': u'CDF', } class FeedParserDict(dict): keymap = {'channel': 'feed', 'items': 'entries', 'guid': 'id', 'date': 'updated', 'date_parsed': 'updated_parsed', 'description': ['summary', 'subtitle'], 'description_detail': ['summary_detail', 'subtitle_detail'], 'url': ['href'], 'modified': 'updated', 'modified_parsed': 'updated_parsed', 'issued': 'published', 'issued_parsed': 'published_parsed', 'copyright': 'rights', 'copyright_detail': 'rights_detail', 'tagline': 'subtitle', 'tagline_detail': 'subtitle_detail'} def __getitem__(self, key): if key == 'category': try: return dict.__getitem__(self, 'tags')[0]['term'] except IndexError: raise KeyError, "object doesn't have key 'category'" elif key == 'enclosures': norel = lambda link: FeedParserDict([(name,value) for (name,value) in link.items() if name!='rel']) return [norel(link) for link in dict.__getitem__(self, 'links') if link['rel']==u'enclosure'] elif key == 'license': for link in dict.__getitem__(self, 'links'): if link['rel']==u'license' and 'href' in link: return link['href'] elif key == 'updated': # Temporarily help developers out by keeping the old # broken behavior that was reported in issue 310. # This fix was proposed in issue 328. if not dict.__contains__(self, 'updated') and \ dict.__contains__(self, 'published'): warnings.warn("To avoid breaking existing software while " "fixing issue 310, a temporary mapping has been created " "from `updated` to `published` if `updated` doesn't " "exist. This fallback will be removed in a future version " "of feedparser.", DeprecationWarning) return dict.__getitem__(self, 'published') return dict.__getitem__(self, 'updated') elif key == 'updated_parsed': if not dict.__contains__(self, 'updated_parsed') and \ dict.__contains__(self, 'published_parsed'): warnings.warn("To avoid breaking existing software while " "fixing issue 310, a temporary mapping has been created " "from `updated_parsed` to `published_parsed` if " "`updated_parsed` doesn't exist. This fallback will be " "removed in a future version of feedparser.", DeprecationWarning) return dict.__getitem__(self, 'published_parsed') return dict.__getitem__(self, 'updated_parsed') else: realkey = self.keymap.get(key, key) if isinstance(realkey, list): for k in realkey: if dict.__contains__(self, k): return dict.__getitem__(self, k) elif dict.__contains__(self, realkey): return dict.__getitem__(self, realkey) return dict.__getitem__(self, key) def __contains__(self, key): if key in ('updated', 'updated_parsed'): # Temporarily help developers out by keeping the old # broken behavior that was reported in issue 310. # This fix was proposed in issue 328. return dict.__contains__(self, key) try: self.__getitem__(key) except KeyError: return False else: return True has_key = __contains__ def get(self, key, default=None): try: return self.__getitem__(key) except KeyError: return default def __setitem__(self, key, value): key = self.keymap.get(key, key) if isinstance(key, list): key = key[0] return dict.__setitem__(self, key, value) def setdefault(self, key, value): if key not in self: self[key] = value return value return self[key] def __getattr__(self, key): # __getattribute__() is called first; this will be called # only if an attribute was not already found try: return self.__getitem__(key) except KeyError: raise AttributeError, "object has no attribute '%s'" % key def __hash__(self): return id(self) _cp1252 = { 128: unichr(8364), # euro sign 130: unichr(8218), # single low-9 quotation mark 131: unichr( 402), # latin small letter f with hook 132: unichr(8222), # double low-9 quotation mark 133: unichr(8230), # horizontal ellipsis 134: unichr(8224), # dagger 135: unichr(8225), # double dagger 136: unichr( 710), # modifier letter circumflex accent 137: unichr(8240), # per mille sign 138: unichr( 352), # latin capital letter s with caron 139: unichr(8249), # single left-pointing angle quotation mark 140: unichr( 338), # latin capital ligature oe 142: unichr( 381), # latin capital letter z with caron 145: unichr(8216), # left single quotation mark 146: unichr(8217), # right single quotation mark 147: unichr(8220), # left double quotation mark 148: unichr(8221), # right double quotation mark 149: unichr(8226), # bullet 150: unichr(8211), # en dash 151: unichr(8212), # em dash 152: unichr( 732), # small tilde 153: unichr(8482), # trade mark sign 154: unichr( 353), # latin small letter s with caron 155: unichr(8250), # single right-pointing angle quotation mark 156: unichr( 339), # latin small ligature oe 158: unichr( 382), # latin small letter z with caron 159: unichr( 376), # latin capital letter y with diaeresis } _urifixer = re.compile('^([A-Za-z][A-Za-z0-9+-.]*://)(/*)(.*?)') def _urljoin(base, uri): uri = _urifixer.sub(r'\1\3', uri) #try: if not isinstance(uri, unicode): uri = uri.decode('utf-8', 'ignore') uri = urlparse.urljoin(base, uri) if not isinstance(uri, unicode): return uri.decode('utf-8', 'ignore') return uri #except: # uri = urlparse.urlunparse([urllib.quote(part) for part in urlparse.urlparse(uri)]) # return urlparse.urljoin(base, uri) class _FeedParserMixin: namespaces = { '': '', 'http://backend.userland.com/rss': '', 'http://blogs.law.harvard.edu/tech/rss': '', 'http://purl.org/rss/1.0/': '', 'http://my.netscape.com/rdf/simple/0.9/': '', 'http://example.com/newformat#': '', 'http://example.com/necho': '', 'http://purl.org/echo/': '', 'uri/of/echo/namespace#': '', 'http://purl.org/pie/': '', 'http://purl.org/atom/ns#': '', 'http://www.w3.org/2005/Atom': '', 'http://purl.org/rss/1.0/modules/rss091#': '', 'http://webns.net/mvcb/': 'admin', 'http://purl.org/rss/1.0/modules/aggregation/': 'ag', 'http://purl.org/rss/1.0/modules/annotate/': 'annotate', 'http://media.tangent.org/rss/1.0/': 'audio', 'http://backend.userland.com/blogChannelModule': 'blogChannel', 'http://web.resource.org/cc/': 'cc', 'http://backend.userland.com/creativeCommonsRssModule': 'creativeCommons', 'http://purl.org/rss/1.0/modules/company': 'co', 'http://purl.org/rss/1.0/modules/content/': 'content', 'http://my.theinfo.org/changed/1.0/rss/': 'cp', 'http://purl.org/dc/elements/1.1/': 'dc', 'http://purl.org/dc/terms/': 'dcterms', 'http://purl.org/rss/1.0/modules/email/': 'email', 'http://purl.org/rss/1.0/modules/event/': 'ev', 'http://rssnamespace.org/feedburner/ext/1.0': 'feedburner', 'http://freshmeat.net/rss/fm/': 'fm', 'http://xmlns.com/foaf/0.1/': 'foaf', 'http://www.w3.org/2003/01/geo/wgs84_pos#': 'geo', 'http://postneo.com/icbm/': 'icbm', 'http://purl.org/rss/1.0/modules/image/': 'image', 'http://www.itunes.com/DTDs/PodCast-1.0.dtd': 'itunes', 'http://example.com/DTDs/PodCast-1.0.dtd': 'itunes', 'http://purl.org/rss/1.0/modules/link/': 'l', 'http://search.yahoo.com/mrss': 'media', # Version 1.1.2 of the Media RSS spec added the trailing slash on the namespace 'http://search.yahoo.com/mrss/': 'media', 'http://madskills.com/public/xml/rss/module/pingback/': 'pingback', 'http://prismstandard.org/namespaces/1.2/basic/': 'prism', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#': 'rdf', 'http://www.w3.org/2000/01/rdf-schema#': 'rdfs', 'http://purl.org/rss/1.0/modules/reference/': 'ref', 'http://purl.org/rss/1.0/modules/richequiv/': 'reqv', 'http://purl.org/rss/1.0/modules/search/': 'search', 'http://purl.org/rss/1.0/modules/slash/': 'slash', 'http://schemas.xmlsoap.org/soap/envelope/': 'soap', 'http://purl.org/rss/1.0/modules/servicestatus/': 'ss', 'http://hacks.benhammersley.com/rss/streaming/': 'str', 'http://purl.org/rss/1.0/modules/subscription/': 'sub', 'http://purl.org/rss/1.0/modules/syndication/': 'sy', 'http://schemas.pocketsoap.com/rss/myDescModule/': 'szf', 'http://purl.org/rss/1.0/modules/taxonomy/': 'taxo', 'http://purl.org/rss/1.0/modules/threading/': 'thr', 'http://purl.org/rss/1.0/modules/textinput/': 'ti', 'http://madskills.com/public/xml/rss/module/trackback/': 'trackback', 'http://wellformedweb.org/commentAPI/': 'wfw', 'http://purl.org/rss/1.0/modules/wiki/': 'wiki', 'http://www.w3.org/1999/xhtml': 'xhtml', 'http://www.w3.org/1999/xlink': 'xlink', 'http://www.w3.org/XML/1998/namespace': 'xml', } _matchnamespaces = {} can_be_relative_uri = set(['link', 'id', 'wfw_comment', 'wfw_commentrss', 'docs', 'url', 'href', 'comments', 'icon', 'logo']) can_contain_relative_uris = set(['content', 'title', 'summary', 'info', 'tagline', 'subtitle', 'copyright', 'rights', 'description']) can_contain_dangerous_markup = set(['content', 'title', 'summary', 'info', 'tagline', 'subtitle', 'copyright', 'rights', 'description']) html_types = [u'text/html', u'application/xhtml+xml'] def __init__(self, baseuri=None, baselang=None, encoding=u'utf-8'): if not self._matchnamespaces: for k, v in self.namespaces.items(): self._matchnamespaces[k.lower()] = v self.feeddata = FeedParserDict() # feed-level data self.encoding = encoding # character encoding self.entries = [] # list of entry-level data self.version = u'' # feed type/version, see SUPPORTED_VERSIONS self.namespacesInUse = {} # dictionary of namespaces defined by the feed # the following are used internally to track state; # this is really out of control and should be refactored self.infeed = 0 self.inentry = 0 self.incontent = 0 self.intextinput = 0 self.inimage = 0 self.inauthor = 0 self.incontributor = 0 self.inpublisher = 0 self.insource = 0 self.sourcedata = FeedParserDict() self.contentparams = FeedParserDict() self._summaryKey = None self.namespacemap = {} self.elementstack = [] self.basestack = [] self.langstack = [] self.baseuri = baseuri or u'' self.lang = baselang or None self.svgOK = 0 self.title_depth = -1 self.depth = 0 if baselang: self.feeddata['language'] = baselang.replace('_','-') # A map of the following form: # { # object_that_value_is_set_on: { # property_name: depth_of_node_property_was_extracted_from, # other_property: depth_of_node_property_was_extracted_from, # }, # } self.property_depth_map = {} def _normalize_attributes(self, kv): k = kv[0].lower() v = k in ('rel', 'type') and kv[1].lower() or kv[1] # the sgml parser doesn't handle entities in attributes, nor # does it pass the attribute values through as unicode, while # strict xml parsers do -- account for this difference if isinstance(self, _LooseFeedParser): v = v.replace('&', '&') if not isinstance(v, unicode): v = v.decode('utf-8') return (k, v) def unknown_starttag(self, tag, attrs): # increment depth counter self.depth += 1 # normalize attrs attrs = map(self._normalize_attributes, attrs) # track xml:base and xml:lang attrsD = dict(attrs) baseuri = attrsD.get('xml:base', attrsD.get('base')) or self.baseuri if not isinstance(baseuri, unicode): baseuri = baseuri.decode(self.encoding, 'ignore') # ensure that self.baseuri is always an absolute URI that # uses a whitelisted URI scheme (e.g. not `javscript:`) if self.baseuri: self.baseuri = _makeSafeAbsoluteURI(self.baseuri, baseuri) or self.baseuri else: self.baseuri = _urljoin(self.baseuri, baseuri) lang = attrsD.get('xml:lang', attrsD.get('lang')) if lang == '': # xml:lang could be explicitly set to '', we need to capture that lang = None elif lang is None: # if no xml:lang is specified, use parent lang lang = self.lang if lang: if tag in ('feed', 'rss', 'rdf:RDF'): self.feeddata['language'] = lang.replace('_','-') self.lang = lang self.basestack.append(self.baseuri) self.langstack.append(lang) # track namespaces for prefix, uri in attrs: if prefix.startswith('xmlns:'): self.trackNamespace(prefix[6:], uri) elif prefix == 'xmlns': self.trackNamespace(None, uri) # track inline content if self.incontent and not self.contentparams.get('type', u'xml').endswith(u'xml'): if tag in ('xhtml:div', 'div'): return # typepad does this 10/2007 # element declared itself as escaped markup, but it isn't really self.contentparams['type'] = u'application/xhtml+xml' if self.incontent and self.contentparams.get('type') == u'application/xhtml+xml': if tag.find(':') <> -1: prefix, tag = tag.split(':', 1) namespace = self.namespacesInUse.get(prefix, '') if tag=='math' and namespace=='http://www.w3.org/1998/Math/MathML': attrs.append(('xmlns',namespace)) if tag=='svg' and namespace=='http://www.w3.org/2000/svg': attrs.append(('xmlns',namespace)) if tag == 'svg': self.svgOK += 1 return self.handle_data('<%s%s>' % (tag, self.strattrs(attrs)), escape=0) # match namespaces if tag.find(':') <> -1: prefix, suffix = tag.split(':', 1) else: prefix, suffix = '', tag prefix = self.namespacemap.get(prefix, prefix) if prefix: prefix = prefix + '_' # special hack for better tracking of empty textinput/image elements in illformed feeds if (not prefix) and tag not in ('title', 'link', 'description', 'name'): self.intextinput = 0 if (not prefix) and tag not in ('title', 'link', 'description', 'url', 'href', 'width', 'height'): self.inimage = 0 # call special handler (if defined) or default handler methodname = '_start_' + prefix + suffix try: method = getattr(self, methodname) return method(attrsD) except AttributeError: # Since there's no handler or something has gone wrong we explicitly add the element and its attributes unknown_tag = prefix + suffix if len(attrsD) == 0: # No attributes so merge it into the encosing dictionary return self.push(unknown_tag, 1) else: # Has attributes so create it in its own dictionary context = self._getContext() context[unknown_tag] = attrsD def unknown_endtag(self, tag): # match namespaces if tag.find(':') <> -1: prefix, suffix = tag.split(':', 1) else: prefix, suffix = '', tag prefix = self.namespacemap.get(prefix, prefix) if prefix: prefix = prefix + '_' if suffix == 'svg' and self.svgOK: self.svgOK -= 1 # call special handler (if defined) or default handler methodname = '_end_' + prefix + suffix try: if self.svgOK: raise AttributeError() method = getattr(self, methodname) method() except AttributeError: self.pop(prefix + suffix) # track inline content if self.incontent and not self.contentparams.get('type', u'xml').endswith(u'xml'): # element declared itself as escaped markup, but it isn't really if tag in ('xhtml:div', 'div'): return # typepad does this 10/2007 self.contentparams['type'] = u'application/xhtml+xml' if self.incontent and self.contentparams.get('type') == u'application/xhtml+xml': tag = tag.split(':')[-1] self.handle_data('' % tag, escape=0) # track xml:base and xml:lang going out of scope if self.basestack: self.basestack.pop() if self.basestack and self.basestack[-1]: self.baseuri = self.basestack[-1] if self.langstack: self.langstack.pop() if self.langstack: # and (self.langstack[-1] is not None): self.lang = self.langstack[-1] self.depth -= 1 def handle_charref(self, ref): # called for each character reference, e.g. for ' ', ref will be '160' if not self.elementstack: return ref = ref.lower() if ref in ('34', '38', '39', '60', '62', 'x22', 'x26', 'x27', 'x3c', 'x3e'): text = '&#%s;' % ref else: if ref[0] == 'x': c = int(ref[1:], 16) else: c = int(ref) text = unichr(c).encode('utf-8') self.elementstack[-1][2].append(text) def handle_entityref(self, ref): # called for each entity reference, e.g. for '©', ref will be 'copy' if not self.elementstack: return if ref in ('lt', 'gt', 'quot', 'amp', 'apos'): text = '&%s;' % ref elif ref in self.entities: text = self.entities[ref] if text.startswith('&#') and text.endswith(';'): return self.handle_entityref(text) else: try: name2codepoint[ref] except KeyError: text = '&%s;' % ref else: text = unichr(name2codepoint[ref]).encode('utf-8') self.elementstack[-1][2].append(text) def handle_data(self, text, escape=1): # called for each block of plain text, i.e. outside of any tag and # not containing any character or entity references if not self.elementstack: return if escape and self.contentparams.get('type') == u'application/xhtml+xml': text = _xmlescape(text) self.elementstack[-1][2].append(text) def handle_comment(self, text): # called for each comment, e.g. pass def handle_pi(self, text): # called for each processing instruction, e.g. pass def handle_decl(self, text): pass def parse_declaration(self, i): # override internal declaration handler to handle CDATA blocks if self.rawdata[i:i+9] == '', i) if k == -1: # CDATA block began but didn't finish k = len(self.rawdata) return k self.handle_data(_xmlescape(self.rawdata[i+9:k]), 0) return k+3 else: k = self.rawdata.find('>', i) if k >= 0: return k+1 else: # We have an incomplete CDATA block. return k def mapContentType(self, contentType): contentType = contentType.lower() if contentType == 'text' or contentType == 'plain': contentType = u'text/plain' elif contentType == 'html': contentType = u'text/html' elif contentType == 'xhtml': contentType = u'application/xhtml+xml' return contentType def trackNamespace(self, prefix, uri): loweruri = uri.lower() if not self.version: if (prefix, loweruri) == (None, 'http://my.netscape.com/rdf/simple/0.9/'): self.version = u'rss090' elif loweruri == 'http://purl.org/rss/1.0/': self.version = u'rss10' elif loweruri == 'http://www.w3.org/2005/atom': self.version = u'atom10' if loweruri.find(u'backend.userland.com/rss') <> -1: # match any backend.userland.com namespace uri = u'http://backend.userland.com/rss' loweruri = uri if loweruri in self._matchnamespaces: self.namespacemap[prefix] = self._matchnamespaces[loweruri] self.namespacesInUse[self._matchnamespaces[loweruri]] = uri else: self.namespacesInUse[prefix or ''] = uri def resolveURI(self, uri): return _urljoin(self.baseuri or u'', uri) def decodeEntities(self, element, data): return data def strattrs(self, attrs): return ''.join([' %s="%s"' % (t[0],_xmlescape(t[1],{'"':'"'})) for t in attrs]) def push(self, element, expectingText): self.elementstack.append([element, expectingText, []]) def pop(self, element, stripWhitespace=1): if not self.elementstack: return if self.elementstack[-1][0] != element: return element, expectingText, pieces = self.elementstack.pop() if self.version == u'atom10' and self.contentparams.get('type', u'text') == u'application/xhtml+xml': # remove enclosing child element, but only if it is a
and # only if all the remaining content is nested underneath it. # This means that the divs would be retained in the following: #
foo
bar
while pieces and len(pieces)>1 and not pieces[-1].strip(): del pieces[-1] while pieces and len(pieces)>1 and not pieces[0].strip(): del pieces[0] if pieces and (pieces[0] == '
' or pieces[0].startswith('
': depth = 0 for piece in pieces[:-1]: if piece.startswith(''): depth += 1 else: pieces = pieces[1:-1] # Ensure each piece is a str for Python 3 for (i, v) in enumerate(pieces): if not isinstance(v, unicode): pieces[i] = v.decode('utf-8') output = u''.join(pieces) if stripWhitespace: output = output.strip() if not expectingText: return output # decode base64 content if base64 and self.contentparams.get('base64', 0): try: output = _base64decode(output) except binascii.Error: pass except binascii.Incomplete: pass except TypeError: # In Python 3, base64 takes and outputs bytes, not str # This may not be the most correct way to accomplish this output = _base64decode(output.encode('utf-8')).decode('utf-8') # resolve relative URIs if (element in self.can_be_relative_uri) and output: output = self.resolveURI(output) # decode entities within embedded markup if not self.contentparams.get('base64', 0): output = self.decodeEntities(element, output) # some feed formats require consumers to guess # whether the content is html or plain text if not self.version.startswith(u'atom') and self.contentparams.get('type') == u'text/plain': if self.lookslikehtml(output): self.contentparams['type'] = u'text/html' # remove temporary cruft from contentparams try: del self.contentparams['mode'] except KeyError: pass try: del self.contentparams['base64'] except KeyError: pass is_htmlish = self.mapContentType(self.contentparams.get('type', u'text/html')) in self.html_types # resolve relative URIs within embedded markup if is_htmlish and RESOLVE_RELATIVE_URIS: if element in self.can_contain_relative_uris: output = _resolveRelativeURIs(output, self.baseuri, self.encoding, self.contentparams.get('type', u'text/html')) # parse microformats # (must do this before sanitizing because some microformats # rely on elements that we sanitize) if PARSE_MICROFORMATS and is_htmlish and element in ['content', 'description', 'summary']: mfresults = _parseMicroformats(output, self.baseuri, self.encoding) if mfresults: for tag in mfresults.get('tags', []): self._addTag(tag['term'], tag['scheme'], tag['label']) for enclosure in mfresults.get('enclosures', []): self._start_enclosure(enclosure) for xfn in mfresults.get('xfn', []): self._addXFN(xfn['relationships'], xfn['href'], xfn['name']) vcard = mfresults.get('vcard') if vcard: self._getContext()['vcard'] = vcard # sanitize embedded markup if is_htmlish and SANITIZE_HTML: if element in self.can_contain_dangerous_markup: output = _sanitizeHTML(output, self.encoding, self.contentparams.get('type', u'text/html')) if self.encoding and not isinstance(output, unicode): output = output.decode(self.encoding, 'ignore') # address common error where people take data that is already # utf-8, presume that it is iso-8859-1, and re-encode it. if self.encoding in (u'utf-8', u'utf-8_INVALID_PYTHON_3') and isinstance(output, unicode): try: output = output.encode('iso-8859-1').decode('utf-8') except (UnicodeEncodeError, UnicodeDecodeError): pass # map win-1252 extensions to the proper code points if isinstance(output, unicode): output = output.translate(_cp1252) # categories/tags/keywords/whatever are handled in _end_category if element == 'category': return output if element == 'title' and -1 < self.title_depth <= self.depth: return output # store output in appropriate place(s) if self.inentry and not self.insource: if element == 'content': self.entries[-1].setdefault(element, []) contentparams = copy.deepcopy(self.contentparams) contentparams['value'] = output self.entries[-1][element].append(contentparams) elif element == 'link': if not self.inimage: # query variables in urls in link elements are improperly # converted from `?a=1&b=2` to `?a=1&b;=2` as if they're # unhandled character references. fix this special case. output = re.sub("&([A-Za-z0-9_]+);", "&\g<1>", output) self.entries[-1][element] = output if output: self.entries[-1]['links'][-1]['href'] = output else: if element == 'description': element = 'summary' old_value_depth = self.property_depth_map.setdefault(self.entries[-1], {}).get(element) if old_value_depth is None or self.depth <= old_value_depth: self.property_depth_map[self.entries[-1]][element] = self.depth self.entries[-1][element] = output if self.incontent: contentparams = copy.deepcopy(self.contentparams) contentparams['value'] = output self.entries[-1][element + '_detail'] = contentparams elif (self.infeed or self.insource):# and (not self.intextinput) and (not self.inimage): context = self._getContext() if element == 'description': element = 'subtitle' context[element] = output if element == 'link': # fix query variables; see above for the explanation output = re.sub("&([A-Za-z0-9_]+);", "&\g<1>", output) context[element] = output context['links'][-1]['href'] = output elif self.incontent: contentparams = copy.deepcopy(self.contentparams) contentparams['value'] = output context[element + '_detail'] = contentparams return output def pushContent(self, tag, attrsD, defaultContentType, expectingText): self.incontent += 1 if self.lang: self.lang=self.lang.replace('_','-') self.contentparams = FeedParserDict({ 'type': self.mapContentType(attrsD.get('type', defaultContentType)), 'language': self.lang, 'base': self.baseuri}) self.contentparams['base64'] = self._isBase64(attrsD, self.contentparams) self.push(tag, expectingText) def popContent(self, tag): value = self.pop(tag) self.incontent -= 1 self.contentparams.clear() return value # a number of elements in a number of RSS variants are nominally plain # text, but this is routinely ignored. This is an attempt to detect # the most common cases. As false positives often result in silent # data loss, this function errs on the conservative side. @staticmethod def lookslikehtml(s): # must have a close tag or an entity reference to qualify if not (re.search(r'',s) or re.search("&#?\w+;",s)): return # all tags must be in a restricted subset of valid HTML tags if filter(lambda t: t.lower() not in _HTMLSanitizer.acceptable_elements, re.findall(r' -1: prefix = name[:colonpos] suffix = name[colonpos+1:] prefix = self.namespacemap.get(prefix, prefix) name = prefix + ':' + suffix return name def _getAttribute(self, attrsD, name): return attrsD.get(self._mapToStandardPrefix(name)) def _isBase64(self, attrsD, contentparams): if attrsD.get('mode', '') == 'base64': return 1 if self.contentparams['type'].startswith(u'text/'): return 0 if self.contentparams['type'].endswith(u'+xml'): return 0 if self.contentparams['type'].endswith(u'/xml'): return 0 return 1 def _itsAnHrefDamnIt(self, attrsD): href = attrsD.get('url', attrsD.get('uri', attrsD.get('href', None))) if href: try: del attrsD['url'] except KeyError: pass try: del attrsD['uri'] except KeyError: pass attrsD['href'] = href return attrsD def _save(self, key, value, overwrite=False): context = self._getContext() if overwrite: context[key] = value else: context.setdefault(key, value) def _start_rss(self, attrsD): versionmap = {'0.91': u'rss091u', '0.92': u'rss092', '0.93': u'rss093', '0.94': u'rss094'} #If we're here then this is an RSS feed. #If we don't have a version or have a version that starts with something #other than RSS then there's been a mistake. Correct it. if not self.version or not self.version.startswith(u'rss'): attr_version = attrsD.get('version', '') version = versionmap.get(attr_version) if version: self.version = version elif attr_version.startswith('2.'): self.version = u'rss20' else: self.version = u'rss' def _start_channel(self, attrsD): self.infeed = 1 self._cdf_common(attrsD) def _cdf_common(self, attrsD): if 'lastmod' in attrsD: self._start_modified({}) self.elementstack[-1][-1] = attrsD['lastmod'] self._end_modified() if 'href' in attrsD: self._start_link({}) self.elementstack[-1][-1] = attrsD['href'] self._end_link() def _start_feed(self, attrsD): self.infeed = 1 versionmap = {'0.1': u'atom01', '0.2': u'atom02', '0.3': u'atom03'} if not self.version: attr_version = attrsD.get('version') version = versionmap.get(attr_version) if version: self.version = version else: self.version = u'atom' def _end_channel(self): self.infeed = 0 _end_feed = _end_channel def _start_image(self, attrsD): context = self._getContext() if not self.inentry: context.setdefault('image', FeedParserDict()) self.inimage = 1 self.title_depth = -1 self.push('image', 0) def _end_image(self): self.pop('image') self.inimage = 0 def _start_textinput(self, attrsD): context = self._getContext() context.setdefault('textinput', FeedParserDict()) self.intextinput = 1 self.title_depth = -1 self.push('textinput', 0) _start_textInput = _start_textinput def _end_textinput(self): self.pop('textinput') self.intextinput = 0 _end_textInput = _end_textinput def _start_author(self, attrsD): self.inauthor = 1 self.push('author', 1) # Append a new FeedParserDict when expecting an author context = self._getContext() context.setdefault('authors', []) context['authors'].append(FeedParserDict()) _start_managingeditor = _start_author _start_dc_author = _start_author _start_dc_creator = _start_author _start_itunes_author = _start_author def _end_author(self): self.pop('author') self.inauthor = 0 self._sync_author_detail() _end_managingeditor = _end_author _end_dc_author = _end_author _end_dc_creator = _end_author _end_itunes_author = _end_author def _start_itunes_owner(self, attrsD): self.inpublisher = 1 self.push('publisher', 0) def _end_itunes_owner(self): self.pop('publisher') self.inpublisher = 0 self._sync_author_detail('publisher') def _start_contributor(self, attrsD): self.incontributor = 1 context = self._getContext() context.setdefault('contributors', []) context['contributors'].append(FeedParserDict()) self.push('contributor', 0) def _end_contributor(self): self.pop('contributor') self.incontributor = 0 def _start_dc_contributor(self, attrsD): self.incontributor = 1 context = self._getContext() context.setdefault('contributors', []) context['contributors'].append(FeedParserDict()) self.push('name', 0) def _end_dc_contributor(self): self._end_name() self.incontributor = 0 def _start_name(self, attrsD): self.push('name', 0) _start_itunes_name = _start_name def _end_name(self): value = self.pop('name') if self.inpublisher: self._save_author('name', value, 'publisher') elif self.inauthor: self._save_author('name', value) elif self.incontributor: self._save_contributor('name', value) elif self.intextinput: context = self._getContext() context['name'] = value _end_itunes_name = _end_name def _start_width(self, attrsD): self.push('width', 0) def _end_width(self): value = self.pop('width') try: value = int(value) except ValueError: value = 0 if self.inimage: context = self._getContext() context['width'] = value def _start_height(self, attrsD): self.push('height', 0) def _end_height(self): value = self.pop('height') try: value = int(value) except ValueError: value = 0 if self.inimage: context = self._getContext() context['height'] = value def _start_url(self, attrsD): self.push('href', 1) _start_homepage = _start_url _start_uri = _start_url def _end_url(self): value = self.pop('href') if self.inauthor: self._save_author('href', value) elif self.incontributor: self._save_contributor('href', value) _end_homepage = _end_url _end_uri = _end_url def _start_email(self, attrsD): self.push('email', 0) _start_itunes_email = _start_email def _end_email(self): value = self.pop('email') if self.inpublisher: self._save_author('email', value, 'publisher') elif self.inauthor: self._save_author('email', value) elif self.incontributor: self._save_contributor('email', value) _end_itunes_email = _end_email def _getContext(self): if self.insource: context = self.sourcedata elif self.inimage and 'image' in self.feeddata: context = self.feeddata['image'] elif self.intextinput: context = self.feeddata['textinput'] elif self.inentry: context = self.entries[-1] else: context = self.feeddata return context def _save_author(self, key, value, prefix='author'): context = self._getContext() context.setdefault(prefix + '_detail', FeedParserDict()) context[prefix + '_detail'][key] = value self._sync_author_detail() context.setdefault('authors', [FeedParserDict()]) context['authors'][-1][key] = value def _save_contributor(self, key, value): context = self._getContext() context.setdefault('contributors', [FeedParserDict()]) context['contributors'][-1][key] = value def _sync_author_detail(self, key='author'): context = self._getContext() detail = context.get('%s_detail' % key) if detail: name = detail.get('name') email = detail.get('email') if name and email: context[key] = u'%s (%s)' % (name, email) elif name: context[key] = name elif email: context[key] = email else: author, email = context.get(key), None if not author: return emailmatch = re.search(ur'''(([a-zA-Z0-9\_\-\.\+]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?))(\?subject=\S+)?''', author) if emailmatch: email = emailmatch.group(0) # probably a better way to do the following, but it passes all the tests author = author.replace(email, u'') author = author.replace(u'()', u'') author = author.replace(u'<>', u'') author = author.replace(u'<>', u'') author = author.strip() if author and (author[0] == u'('): author = author[1:] if author and (author[-1] == u')'): author = author[:-1] author = author.strip() if author or email: context.setdefault('%s_detail' % key, FeedParserDict()) if author: context['%s_detail' % key]['name'] = author if email: context['%s_detail' % key]['email'] = email def _start_subtitle(self, attrsD): self.pushContent('subtitle', attrsD, u'text/plain', 1) _start_tagline = _start_subtitle _start_itunes_subtitle = _start_subtitle def _end_subtitle(self): self.popContent('subtitle') _end_tagline = _end_subtitle _end_itunes_subtitle = _end_subtitle def _start_rights(self, attrsD): self.pushContent('rights', attrsD, u'text/plain', 1) _start_dc_rights = _start_rights _start_copyright = _start_rights def _end_rights(self): self.popContent('rights') _end_dc_rights = _end_rights _end_copyright = _end_rights def _start_item(self, attrsD): self.entries.append(FeedParserDict()) self.push('item', 0) self.inentry = 1 self.guidislink = 0 self.title_depth = -1 id = self._getAttribute(attrsD, 'rdf:about') if id: context = self._getContext() context['id'] = id self._cdf_common(attrsD) _start_entry = _start_item def _end_item(self): self.pop('item') self.inentry = 0 _end_entry = _end_item def _start_dc_language(self, attrsD): self.push('language', 1) _start_language = _start_dc_language def _end_dc_language(self): self.lang = self.pop('language') _end_language = _end_dc_language def _start_dc_publisher(self, attrsD): self.push('publisher', 1) _start_webmaster = _start_dc_publisher def _end_dc_publisher(self): self.pop('publisher') self._sync_author_detail('publisher') _end_webmaster = _end_dc_publisher def _start_published(self, attrsD): self.push('published', 1) _start_dcterms_issued = _start_published _start_issued = _start_published _start_pubdate = _start_published def _end_published(self): value = self.pop('published') self._save('published_parsed', _parse_date(value), overwrite=True) _end_dcterms_issued = _end_published _end_issued = _end_published _end_pubdate = _end_published def _start_updated(self, attrsD): self.push('updated', 1) _start_modified = _start_updated _start_dcterms_modified = _start_updated _start_dc_date = _start_updated _start_lastbuilddate = _start_updated def _end_updated(self): value = self.pop('updated') parsed_value = _parse_date(value) self._save('updated_parsed', parsed_value, overwrite=True) _end_modified = _end_updated _end_dcterms_modified = _end_updated _end_dc_date = _end_updated _end_lastbuilddate = _end_updated def _start_created(self, attrsD): self.push('created', 1) _start_dcterms_created = _start_created def _end_created(self): value = self.pop('created') self._save('created_parsed', _parse_date(value), overwrite=True) _end_dcterms_created = _end_created def _start_expirationdate(self, attrsD): self.push('expired', 1) def _end_expirationdate(self): self._save('expired_parsed', _parse_date(self.pop('expired')), overwrite=True) def _start_cc_license(self, attrsD): context = self._getContext() value = self._getAttribute(attrsD, 'rdf:resource') attrsD = FeedParserDict() attrsD['rel'] = u'license' if value: attrsD['href']=value context.setdefault('links', []).append(attrsD) def _start_creativecommons_license(self, attrsD): self.push('license', 1) _start_creativeCommons_license = _start_creativecommons_license def _end_creativecommons_license(self): value = self.pop('license') context = self._getContext() attrsD = FeedParserDict() attrsD['rel'] = u'license' if value: attrsD['href'] = value context.setdefault('links', []).append(attrsD) del context['license'] _end_creativeCommons_license = _end_creativecommons_license def _addXFN(self, relationships, href, name): context = self._getContext() xfn = context.setdefault('xfn', []) value = FeedParserDict({'relationships': relationships, 'href': href, 'name': name}) if value not in xfn: xfn.append(value) def _addTag(self, term, scheme, label): context = self._getContext() tags = context.setdefault('tags', []) if (not term) and (not scheme) and (not label): return value = FeedParserDict({'term': term, 'scheme': scheme, 'label': label}) if value not in tags: tags.append(value) def _start_category(self, attrsD): term = attrsD.get('term') scheme = attrsD.get('scheme', attrsD.get('domain')) label = attrsD.get('label') self._addTag(term, scheme, label) self.push('category', 1) _start_dc_subject = _start_category _start_keywords = _start_category def _start_media_category(self, attrsD): attrsD.setdefault('scheme', u'http://search.yahoo.com/mrss/category_schema') self._start_category(attrsD) def _end_itunes_keywords(self): for term in self.pop('itunes_keywords').split(','): if term.strip(): self._addTag(term.strip(), u'http://www.itunes.com/', None) def _start_itunes_category(self, attrsD): self._addTag(attrsD.get('text'), u'http://www.itunes.com/', None) self.push('category', 1) def _end_category(self): value = self.pop('category') if not value: return context = self._getContext() tags = context['tags'] if value and len(tags) and not tags[-1]['term']: tags[-1]['term'] = value else: self._addTag(value, None, None) _end_dc_subject = _end_category _end_keywords = _end_category _end_itunes_category = _end_category _end_media_category = _end_category def _start_cloud(self, attrsD): self._getContext()['cloud'] = FeedParserDict(attrsD) def _start_link(self, attrsD): attrsD.setdefault('rel', u'alternate') if attrsD['rel'] == u'self': attrsD.setdefault('type', u'application/atom+xml') else: attrsD.setdefault('type', u'text/html') context = self._getContext() attrsD = self._itsAnHrefDamnIt(attrsD) if 'href' in attrsD: attrsD['href'] = self.resolveURI(attrsD['href']) expectingText = self.infeed or self.inentry or self.insource context.setdefault('links', []) if not (self.inentry and self.inimage): context['links'].append(FeedParserDict(attrsD)) if 'href' in attrsD: expectingText = 0 if (attrsD.get('rel') == u'alternate') and (self.mapContentType(attrsD.get('type')) in self.html_types): context['link'] = attrsD['href'] else: self.push('link', expectingText) def _end_link(self): value = self.pop('link') def _start_guid(self, attrsD): self.guidislink = (attrsD.get('ispermalink', 'true') == 'true') self.push('id', 1) _start_id = _start_guid def _end_guid(self): value = self.pop('id') self._save('guidislink', self.guidislink and 'link' not in self._getContext()) if self.guidislink: # guid acts as link, but only if 'ispermalink' is not present or is 'true', # and only if the item doesn't already have a link element self._save('link', value) _end_id = _end_guid def _start_title(self, attrsD): if self.svgOK: return self.unknown_starttag('title', attrsD.items()) self.pushContent('title', attrsD, u'text/plain', self.infeed or self.inentry or self.insource) _start_dc_title = _start_title _start_media_title = _start_title def _end_title(self): if self.svgOK: return value = self.popContent('title') if not value: return self.title_depth = self.depth _end_dc_title = _end_title def _end_media_title(self): title_depth = self.title_depth self._end_title() self.title_depth = title_depth def _start_description(self, attrsD): context = self._getContext() if 'summary' in context: self._summaryKey = 'content' self._start_content(attrsD) else: self.pushContent('description', attrsD, u'text/html', self.infeed or self.inentry or self.insource) _start_dc_description = _start_description def _start_abstract(self, attrsD): self.pushContent('description', attrsD, u'text/plain', self.infeed or self.inentry or self.insource) def _end_description(self): if self._summaryKey == 'content': self._end_content() else: value = self.popContent('description') self._summaryKey = None _end_abstract = _end_description _end_dc_description = _end_description def _start_info(self, attrsD): self.pushContent('info', attrsD, u'text/plain', 1) _start_feedburner_browserfriendly = _start_info def _end_info(self): self.popContent('info') _end_feedburner_browserfriendly = _end_info def _start_generator(self, attrsD): if attrsD: attrsD = self._itsAnHrefDamnIt(attrsD) if 'href' in attrsD: attrsD['href'] = self.resolveURI(attrsD['href']) self._getContext()['generator_detail'] = FeedParserDict(attrsD) self.push('generator', 1) def _end_generator(self): value = self.pop('generator') context = self._getContext() if 'generator_detail' in context: context['generator_detail']['name'] = value def _start_admin_generatoragent(self, attrsD): self.push('generator', 1) value = self._getAttribute(attrsD, 'rdf:resource') if value: self.elementstack[-1][2].append(value) self.pop('generator') self._getContext()['generator_detail'] = FeedParserDict({'href': value}) def _start_admin_errorreportsto(self, attrsD): self.push('errorreportsto', 1) value = self._getAttribute(attrsD, 'rdf:resource') if value: self.elementstack[-1][2].append(value) self.pop('errorreportsto') def _start_summary(self, attrsD): context = self._getContext() if 'summary' in context: self._summaryKey = 'content' self._start_content(attrsD) else: self._summaryKey = 'summary' self.pushContent(self._summaryKey, attrsD, u'text/plain', 1) _start_itunes_summary = _start_summary def _end_summary(self): if self._summaryKey == 'content': self._end_content() else: self.popContent(self._summaryKey or 'summary') self._summaryKey = None _end_itunes_summary = _end_summary def _start_enclosure(self, attrsD): attrsD = self._itsAnHrefDamnIt(attrsD) context = self._getContext() attrsD['rel'] = u'enclosure' context.setdefault('links', []).append(FeedParserDict(attrsD)) def _start_source(self, attrsD): if 'url' in attrsD: # This means that we're processing a source element from an RSS 2.0 feed self.sourcedata['href'] = attrsD[u'url'] self.push('source', 1) self.insource = 1 self.title_depth = -1 def _end_source(self): self.insource = 0 value = self.pop('source') if value: self.sourcedata['title'] = value self._getContext()['source'] = copy.deepcopy(self.sourcedata) self.sourcedata.clear() def _start_content(self, attrsD): self.pushContent('content', attrsD, u'text/plain', 1) src = attrsD.get('src') if src: self.contentparams['src'] = src self.push('content', 1) def _start_body(self, attrsD): self.pushContent('content', attrsD, u'application/xhtml+xml', 1) _start_xhtml_body = _start_body def _start_content_encoded(self, attrsD): self.pushContent('content', attrsD, u'text/html', 1) _start_fullitem = _start_content_encoded def _end_content(self): copyToSummary = self.mapContentType(self.contentparams.get('type')) in ([u'text/plain'] + self.html_types) value = self.popContent('content') if copyToSummary: self._save('summary', value) _end_body = _end_content _end_xhtml_body = _end_content _end_content_encoded = _end_content _end_fullitem = _end_content def _start_itunes_image(self, attrsD): self.push('itunes_image', 0) if attrsD.get('href'): self._getContext()['image'] = FeedParserDict({'href': attrsD.get('href')}) elif attrsD.get('url'): self._getContext()['image'] = FeedParserDict({'href': attrsD.get('url')}) _start_itunes_link = _start_itunes_image def _end_itunes_block(self): value = self.pop('itunes_block', 0) self._getContext()['itunes_block'] = (value == 'yes') and 1 or 0 def _end_itunes_explicit(self): value = self.pop('itunes_explicit', 0) # Convert 'yes' -> True, 'clean' to False, and any other value to None # False and None both evaluate as False, so the difference can be ignored # by applications that only need to know if the content is explicit. self._getContext()['itunes_explicit'] = (None, False, True)[(value == 'yes' and 2) or value == 'clean' or 0] def _start_media_content(self, attrsD): context = self._getContext() context.setdefault('media_content', []) context['media_content'].append(attrsD) def _start_media_thumbnail(self, attrsD): context = self._getContext() context.setdefault('media_thumbnail', []) self.push('url', 1) # new context['media_thumbnail'].append(attrsD) def _end_media_thumbnail(self): url = self.pop('url') context = self._getContext() if url != None and len(url.strip()) != 0: if 'url' not in context['media_thumbnail'][-1]: context['media_thumbnail'][-1]['url'] = url def _start_media_player(self, attrsD): self.push('media_player', 0) self._getContext()['media_player'] = FeedParserDict(attrsD) def _end_media_player(self): value = self.pop('media_player') context = self._getContext() context['media_player']['content'] = value def _start_newlocation(self, attrsD): self.push('newlocation', 1) def _end_newlocation(self): url = self.pop('newlocation') context = self._getContext() # don't set newlocation if the context isn't right if context is not self.feeddata: return context['newlocation'] = _makeSafeAbsoluteURI(self.baseuri, url.strip()) if _XML_AVAILABLE: class _StrictFeedParser(_FeedParserMixin, xml.sax.handler.ContentHandler): def __init__(self, baseuri, baselang, encoding): xml.sax.handler.ContentHandler.__init__(self) _FeedParserMixin.__init__(self, baseuri, baselang, encoding) self.bozo = 0 self.exc = None self.decls = {} def startPrefixMapping(self, prefix, uri): if not uri: return # Jython uses '' instead of None; standardize on None prefix = prefix or None self.trackNamespace(prefix, uri) if prefix and uri == 'http://www.w3.org/1999/xlink': self.decls['xmlns:' + prefix] = uri def startElementNS(self, name, qname, attrs): namespace, localname = name lowernamespace = str(namespace or '').lower() if lowernamespace.find(u'backend.userland.com/rss') <> -1: # match any backend.userland.com namespace namespace = u'http://backend.userland.com/rss' lowernamespace = namespace if qname and qname.find(':') > 0: givenprefix = qname.split(':')[0] else: givenprefix = None prefix = self._matchnamespaces.get(lowernamespace, givenprefix) if givenprefix and (prefix == None or (prefix == '' and lowernamespace == '')) and givenprefix not in self.namespacesInUse: raise UndeclaredNamespace, "'%s' is not associated with a namespace" % givenprefix localname = str(localname).lower() # qname implementation is horribly broken in Python 2.1 (it # doesn't report any), and slightly broken in Python 2.2 (it # doesn't report the xml: namespace). So we match up namespaces # with a known list first, and then possibly override them with # the qnames the SAX parser gives us (if indeed it gives us any # at all). Thanks to MatejC for helping me test this and # tirelessly telling me that it didn't work yet. attrsD, self.decls = self.decls, {} if localname=='math' and namespace=='http://www.w3.org/1998/Math/MathML': attrsD['xmlns']=namespace if localname=='svg' and namespace=='http://www.w3.org/2000/svg': attrsD['xmlns']=namespace if prefix: localname = prefix.lower() + ':' + localname elif namespace and not qname: #Expat for name,value in self.namespacesInUse.items(): if name and value == namespace: localname = name + ':' + localname break for (namespace, attrlocalname), attrvalue in attrs.items(): lowernamespace = (namespace or '').lower() prefix = self._matchnamespaces.get(lowernamespace, '') if prefix: attrlocalname = prefix + ':' + attrlocalname attrsD[str(attrlocalname).lower()] = attrvalue for qname in attrs.getQNames(): attrsD[str(qname).lower()] = attrs.getValueByQName(qname) self.unknown_starttag(localname, attrsD.items()) def characters(self, text): self.handle_data(text) def endElementNS(self, name, qname): namespace, localname = name lowernamespace = str(namespace or '').lower() if qname and qname.find(':') > 0: givenprefix = qname.split(':')[0] else: givenprefix = '' prefix = self._matchnamespaces.get(lowernamespace, givenprefix) if prefix: localname = prefix + ':' + localname elif namespace and not qname: #Expat for name,value in self.namespacesInUse.items(): if name and value == namespace: localname = name + ':' + localname break localname = str(localname).lower() self.unknown_endtag(localname) def error(self, exc): self.bozo = 1 self.exc = exc # drv_libxml2 calls warning() in some cases warning = error def fatalError(self, exc): self.error(exc) raise exc class _BaseHTMLProcessor(sgmllib.SGMLParser): special = re.compile('''[<>'"]''') bare_ampersand = re.compile("&(?!#\d+;|#x[0-9a-fA-F]+;|\w+;)") elements_no_end_tag = set([ 'area', 'base', 'basefont', 'br', 'col', 'command', 'embed', 'frame', 'hr', 'img', 'input', 'isindex', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr' ]) def __init__(self, encoding, _type): self.encoding = encoding self._type = _type sgmllib.SGMLParser.__init__(self) def reset(self): self.pieces = [] sgmllib.SGMLParser.reset(self) def _shorttag_replace(self, match): tag = match.group(1) if tag in self.elements_no_end_tag: return '<' + tag + ' />' else: return '<' + tag + '>' # By declaring these methods and overriding their compiled code # with the code from sgmllib, the original code will execute in # feedparser's scope instead of sgmllib's. This means that the # `tagfind` and `charref` regular expressions will be found as # they're declared above, not as they're declared in sgmllib. def goahead(self, i): pass goahead.func_code = sgmllib.SGMLParser.goahead.func_code def __parse_starttag(self, i): pass __parse_starttag.func_code = sgmllib.SGMLParser.parse_starttag.func_code def parse_starttag(self,i): j = self.__parse_starttag(i) if self._type == 'application/xhtml+xml': if j>2 and self.rawdata[j-2:j]=='/>': self.unknown_endtag(self.lasttag) return j def feed(self, data): data = re.compile(r'\s]+?)\s*/>', self._shorttag_replace, data) data = data.replace(''', "'") data = data.replace('"', '"') try: bytes if bytes is str: raise NameError self.encoding = self.encoding + u'_INVALID_PYTHON_3' except NameError: if self.encoding and isinstance(data, unicode): data = data.encode(self.encoding) sgmllib.SGMLParser.feed(self, data) sgmllib.SGMLParser.close(self) def normalize_attrs(self, attrs): if not attrs: return attrs # utility method to be called by descendants attrs = dict([(k.lower(), v) for k, v in attrs]).items() attrs = [(k, k in ('rel', 'type') and v.lower() or v) for k, v in attrs] attrs.sort() return attrs def unknown_starttag(self, tag, attrs): # called for each start tag # attrs is a list of (attr, value) tuples # e.g. for
, tag='pre', attrs=[('class', 'screen')]
        uattrs = []
        strattrs=''
        if attrs:
            for key, value in attrs:
                value=value.replace('>','>').replace('<','<').replace('"','"')
                value = self.bare_ampersand.sub("&", value)
                # thanks to Kevin Marks for this breathtaking hack to deal with (valid) high-bit attribute values in UTF-8 feeds
                if not isinstance(value, unicode):
                    value = value.decode(self.encoding, 'ignore')
                try:
                    # Currently, in Python 3 the key is already a str, and cannot be decoded again
                    uattrs.append((unicode(key, self.encoding), value))
                except TypeError:
                    uattrs.append((key, value))
            strattrs = u''.join([u' %s="%s"' % (key, value) for key, value in uattrs])
            if self.encoding:
                try:
                    strattrs = strattrs.encode(self.encoding)
                except (UnicodeEncodeError, LookupError):
                    pass
        if tag in self.elements_no_end_tag:
            self.pieces.append('<%s%s />' % (tag, strattrs))
        else:
            self.pieces.append('<%s%s>' % (tag, strattrs))

    def unknown_endtag(self, tag):
        # called for each end tag, e.g. for 
, tag will be 'pre' # Reconstruct the original end tag. if tag not in self.elements_no_end_tag: self.pieces.append("" % tag) def handle_charref(self, ref): # called for each character reference, e.g. for ' ', ref will be '160' # Reconstruct the original character reference. ref = ref.lower() if ref.startswith('x'): value = int(ref[1:], 16) else: value = int(ref) if value in _cp1252: self.pieces.append('&#%s;' % hex(ord(_cp1252[value]))[1:]) else: self.pieces.append('&#%s;' % ref) def handle_entityref(self, ref): # called for each entity reference, e.g. for '©', ref will be 'copy' # Reconstruct the original entity reference. if ref in name2codepoint or ref == 'apos': self.pieces.append('&%s;' % ref) else: self.pieces.append('&%s' % ref) def handle_data(self, text): # called for each block of plain text, i.e. outside of any tag and # not containing any character or entity references # Store the original text verbatim. self.pieces.append(text) def handle_comment(self, text): # called for each HTML comment, e.g. # Reconstruct the original comment. self.pieces.append('' % text) def handle_pi(self, text): # called for each processing instruction, e.g. # Reconstruct original processing instruction. self.pieces.append('' % text) def handle_decl(self, text): # called for the DOCTYPE, if present, e.g. # # Reconstruct original DOCTYPE self.pieces.append('' % text) _new_declname_match = re.compile(r'[a-zA-Z][-_.a-zA-Z0-9:]*\s*').match def _scan_name(self, i, declstartpos): rawdata = self.rawdata n = len(rawdata) if i == n: return None, -1 m = self._new_declname_match(rawdata, i) if m: s = m.group() name = s.strip() if (i + len(s)) == n: return None, -1 # end of buffer return name.lower(), m.end() else: self.handle_data(rawdata) # self.updatepos(declstartpos, i) return None, -1 def convert_charref(self, name): return '&#%s;' % name def convert_entityref(self, name): return '&%s;' % name def output(self): '''Return processed HTML as a single string''' return ''.join([str(p) for p in self.pieces]) def parse_declaration(self, i): try: return sgmllib.SGMLParser.parse_declaration(self, i) except sgmllib.SGMLParseError: # escape the doctype declaration and continue parsing self.handle_data('<') return i+1 class _LooseFeedParser(_FeedParserMixin, _BaseHTMLProcessor): def __init__(self, baseuri, baselang, encoding, entities): sgmllib.SGMLParser.__init__(self) _FeedParserMixin.__init__(self, baseuri, baselang, encoding) _BaseHTMLProcessor.__init__(self, encoding, 'application/xhtml+xml') self.entities=entities def decodeEntities(self, element, data): data = data.replace('<', '<') data = data.replace('<', '<') data = data.replace('<', '<') data = data.replace('>', '>') data = data.replace('>', '>') data = data.replace('>', '>') data = data.replace('&', '&') data = data.replace('&', '&') data = data.replace('"', '"') data = data.replace('"', '"') data = data.replace(''', ''') data = data.replace(''', ''') if not self.contentparams.get('type', u'xml').endswith(u'xml'): data = data.replace('<', '<') data = data.replace('>', '>') data = data.replace('&', '&') data = data.replace('"', '"') data = data.replace(''', "'") return data def strattrs(self, attrs): return ''.join([' %s="%s"' % (n,v.replace('"','"')) for n,v in attrs]) class _MicroformatsParser: STRING = 1 DATE = 2 URI = 3 NODE = 4 EMAIL = 5 known_xfn_relationships = set(['contact', 'acquaintance', 'friend', 'met', 'co-worker', 'coworker', 'colleague', 'co-resident', 'coresident', 'neighbor', 'child', 'parent', 'sibling', 'brother', 'sister', 'spouse', 'wife', 'husband', 'kin', 'relative', 'muse', 'crush', 'date', 'sweetheart', 'me']) known_binary_extensions = set(['zip','rar','exe','gz','tar','tgz','tbz2','bz2','z','7z','dmg','img','sit','sitx','hqx','deb','rpm','bz2','jar','rar','iso','bin','msi','mp2','mp3','ogg','ogm','mp4','m4v','m4a','avi','wma','wmv']) def __init__(self, data, baseuri, encoding): self.document = BeautifulSoup.BeautifulSoup(data) self.baseuri = baseuri self.encoding = encoding if isinstance(data, unicode): data = data.encode(encoding) self.tags = [] self.enclosures = [] self.xfn = [] self.vcard = None def vcardEscape(self, s): if isinstance(s, basestring): s = s.replace(',', '\\,').replace(';', '\\;').replace('\n', '\\n') return s def vcardFold(self, s): s = re.sub(';+$', '', s) sFolded = '' iMax = 75 sPrefix = '' while len(s) > iMax: sFolded += sPrefix + s[:iMax] + '\n' s = s[iMax:] sPrefix = ' ' iMax = 74 sFolded += sPrefix + s return sFolded def normalize(self, s): return re.sub(r'\s+', ' ', s).strip() def unique(self, aList): results = [] for element in aList: if element not in results: results.append(element) return results def toISO8601(self, dt): return time.strftime('%Y-%m-%dT%H:%M:%SZ', dt) def getPropertyValue(self, elmRoot, sProperty, iPropertyType=4, bAllowMultiple=0, bAutoEscape=0): all = lambda x: 1 sProperty = sProperty.lower() bFound = 0 bNormalize = 1 propertyMatch = {'class': re.compile(r'\b%s\b' % sProperty)} if bAllowMultiple and (iPropertyType != self.NODE): snapResults = [] containers = elmRoot(['ul', 'ol'], propertyMatch) for container in containers: snapResults.extend(container('li')) bFound = (len(snapResults) != 0) if not bFound: snapResults = elmRoot(all, propertyMatch) bFound = (len(snapResults) != 0) if (not bFound) and (sProperty == 'value'): snapResults = elmRoot('pre') bFound = (len(snapResults) != 0) bNormalize = not bFound if not bFound: snapResults = [elmRoot] bFound = (len(snapResults) != 0) arFilter = [] if sProperty == 'vcard': snapFilter = elmRoot(all, propertyMatch) for node in snapFilter: if node.findParent(all, propertyMatch): arFilter.append(node) arResults = [] for node in snapResults: if node not in arFilter: arResults.append(node) bFound = (len(arResults) != 0) if not bFound: if bAllowMultiple: return [] elif iPropertyType == self.STRING: return '' elif iPropertyType == self.DATE: return None elif iPropertyType == self.URI: return '' elif iPropertyType == self.NODE: return None else: return None arValues = [] for elmResult in arResults: sValue = None if iPropertyType == self.NODE: if bAllowMultiple: arValues.append(elmResult) continue else: return elmResult sNodeName = elmResult.name.lower() if (iPropertyType == self.EMAIL) and (sNodeName == 'a'): sValue = (elmResult.get('href') or '').split('mailto:').pop().split('?')[0] if sValue: sValue = bNormalize and self.normalize(sValue) or sValue.strip() if (not sValue) and (sNodeName == 'abbr'): sValue = elmResult.get('title') if sValue: sValue = bNormalize and self.normalize(sValue) or sValue.strip() if (not sValue) and (iPropertyType == self.URI): if sNodeName == 'a': sValue = elmResult.get('href') elif sNodeName == 'img': sValue = elmResult.get('src') elif sNodeName == 'object': sValue = elmResult.get('data') if sValue: sValue = bNormalize and self.normalize(sValue) or sValue.strip() if (not sValue) and (sNodeName == 'img'): sValue = elmResult.get('alt') if sValue: sValue = bNormalize and self.normalize(sValue) or sValue.strip() if not sValue: sValue = elmResult.renderContents() sValue = re.sub(r'<\S[^>]*>', '', sValue) sValue = sValue.replace('\r\n', '\n') sValue = sValue.replace('\r', '\n') if sValue: sValue = bNormalize and self.normalize(sValue) or sValue.strip() if not sValue: continue if iPropertyType == self.DATE: sValue = _parse_date_iso8601(sValue) if bAllowMultiple: arValues.append(bAutoEscape and self.vcardEscape(sValue) or sValue) else: return bAutoEscape and self.vcardEscape(sValue) or sValue return arValues def findVCards(self, elmRoot, bAgentParsing=0): sVCards = '' if not bAgentParsing: arCards = self.getPropertyValue(elmRoot, 'vcard', bAllowMultiple=1) else: arCards = [elmRoot] for elmCard in arCards: arLines = [] def processSingleString(sProperty): sValue = self.getPropertyValue(elmCard, sProperty, self.STRING, bAutoEscape=1).decode(self.encoding) if sValue: arLines.append(self.vcardFold(sProperty.upper() + ':' + sValue)) return sValue or u'' def processSingleURI(sProperty): sValue = self.getPropertyValue(elmCard, sProperty, self.URI) if sValue: sContentType = '' sEncoding = '' sValueKey = '' if sValue.startswith('data:'): sEncoding = ';ENCODING=b' sContentType = sValue.split(';')[0].split('/').pop() sValue = sValue.split(',', 1).pop() else: elmValue = self.getPropertyValue(elmCard, sProperty) if elmValue: if sProperty != 'url': sValueKey = ';VALUE=uri' sContentType = elmValue.get('type', '').strip().split('/').pop().strip() sContentType = sContentType.upper() if sContentType == 'OCTET-STREAM': sContentType = '' if sContentType: sContentType = ';TYPE=' + sContentType.upper() arLines.append(self.vcardFold(sProperty.upper() + sEncoding + sContentType + sValueKey + ':' + sValue)) def processTypeValue(sProperty, arDefaultType, arForceType=None): arResults = self.getPropertyValue(elmCard, sProperty, bAllowMultiple=1) for elmResult in arResults: arType = self.getPropertyValue(elmResult, 'type', self.STRING, 1, 1) if arForceType: arType = self.unique(arForceType + arType) if not arType: arType = arDefaultType sValue = self.getPropertyValue(elmResult, 'value', self.EMAIL, 0) if sValue: arLines.append(self.vcardFold(sProperty.upper() + ';TYPE=' + ','.join(arType) + ':' + sValue)) # AGENT # must do this before all other properties because it is destructive # (removes nested class="vcard" nodes so they don't interfere with # this vcard's other properties) arAgent = self.getPropertyValue(elmCard, 'agent', bAllowMultiple=1) for elmAgent in arAgent: if re.compile(r'\bvcard\b').search(elmAgent.get('class')): sAgentValue = self.findVCards(elmAgent, 1) + '\n' sAgentValue = sAgentValue.replace('\n', '\\n') sAgentValue = sAgentValue.replace(';', '\\;') if sAgentValue: arLines.append(self.vcardFold('AGENT:' + sAgentValue)) # Completely remove the agent element from the parse tree elmAgent.extract() else: sAgentValue = self.getPropertyValue(elmAgent, 'value', self.URI, bAutoEscape=1); if sAgentValue: arLines.append(self.vcardFold('AGENT;VALUE=uri:' + sAgentValue)) # FN (full name) sFN = processSingleString('fn') # N (name) elmName = self.getPropertyValue(elmCard, 'n') if elmName: sFamilyName = self.getPropertyValue(elmName, 'family-name', self.STRING, bAutoEscape=1) sGivenName = self.getPropertyValue(elmName, 'given-name', self.STRING, bAutoEscape=1) arAdditionalNames = self.getPropertyValue(elmName, 'additional-name', self.STRING, 1, 1) + self.getPropertyValue(elmName, 'additional-names', self.STRING, 1, 1) arHonorificPrefixes = self.getPropertyValue(elmName, 'honorific-prefix', self.STRING, 1, 1) + self.getPropertyValue(elmName, 'honorific-prefixes', self.STRING, 1, 1) arHonorificSuffixes = self.getPropertyValue(elmName, 'honorific-suffix', self.STRING, 1, 1) + self.getPropertyValue(elmName, 'honorific-suffixes', self.STRING, 1, 1) arLines.append(self.vcardFold('N:' + sFamilyName + ';' + sGivenName + ';' + ','.join(arAdditionalNames) + ';' + ','.join(arHonorificPrefixes) + ';' + ','.join(arHonorificSuffixes))) elif sFN: # implied "N" optimization # http://microformats.org/wiki/hcard#Implied_.22N.22_Optimization arNames = self.normalize(sFN).split() if len(arNames) == 2: bFamilyNameFirst = (arNames[0].endswith(',') or len(arNames[1]) == 1 or ((len(arNames[1]) == 2) and (arNames[1].endswith('.')))) if bFamilyNameFirst: arLines.append(self.vcardFold('N:' + arNames[0] + ';' + arNames[1])) else: arLines.append(self.vcardFold('N:' + arNames[1] + ';' + arNames[0])) # SORT-STRING sSortString = self.getPropertyValue(elmCard, 'sort-string', self.STRING, bAutoEscape=1) if sSortString: arLines.append(self.vcardFold('SORT-STRING:' + sSortString)) # NICKNAME arNickname = self.getPropertyValue(elmCard, 'nickname', self.STRING, 1, 1) if arNickname: arLines.append(self.vcardFold('NICKNAME:' + ','.join(arNickname))) # PHOTO processSingleURI('photo') # BDAY dtBday = self.getPropertyValue(elmCard, 'bday', self.DATE) if dtBday: arLines.append(self.vcardFold('BDAY:' + self.toISO8601(dtBday))) # ADR (address) arAdr = self.getPropertyValue(elmCard, 'adr', bAllowMultiple=1) for elmAdr in arAdr: arType = self.getPropertyValue(elmAdr, 'type', self.STRING, 1, 1) if not arType: arType = ['intl','postal','parcel','work'] # default adr types, see RFC 2426 section 3.2.1 sPostOfficeBox = self.getPropertyValue(elmAdr, 'post-office-box', self.STRING, 0, 1) sExtendedAddress = self.getPropertyValue(elmAdr, 'extended-address', self.STRING, 0, 1) sStreetAddress = self.getPropertyValue(elmAdr, 'street-address', self.STRING, 0, 1) sLocality = self.getPropertyValue(elmAdr, 'locality', self.STRING, 0, 1) sRegion = self.getPropertyValue(elmAdr, 'region', self.STRING, 0, 1) sPostalCode = self.getPropertyValue(elmAdr, 'postal-code', self.STRING, 0, 1) sCountryName = self.getPropertyValue(elmAdr, 'country-name', self.STRING, 0, 1) arLines.append(self.vcardFold('ADR;TYPE=' + ','.join(arType) + ':' + sPostOfficeBox + ';' + sExtendedAddress + ';' + sStreetAddress + ';' + sLocality + ';' + sRegion + ';' + sPostalCode + ';' + sCountryName)) # LABEL processTypeValue('label', ['intl','postal','parcel','work']) # TEL (phone number) processTypeValue('tel', ['voice']) # EMAIL processTypeValue('email', ['internet'], ['internet']) # MAILER processSingleString('mailer') # TZ (timezone) processSingleString('tz') # GEO (geographical information) elmGeo = self.getPropertyValue(elmCard, 'geo') if elmGeo: sLatitude = self.getPropertyValue(elmGeo, 'latitude', self.STRING, 0, 1) sLongitude = self.getPropertyValue(elmGeo, 'longitude', self.STRING, 0, 1) arLines.append(self.vcardFold('GEO:' + sLatitude + ';' + sLongitude)) # TITLE processSingleString('title') # ROLE processSingleString('role') # LOGO processSingleURI('logo') # ORG (organization) elmOrg = self.getPropertyValue(elmCard, 'org') if elmOrg: sOrganizationName = self.getPropertyValue(elmOrg, 'organization-name', self.STRING, 0, 1) if not sOrganizationName: # implied "organization-name" optimization # http://microformats.org/wiki/hcard#Implied_.22organization-name.22_Optimization sOrganizationName = self.getPropertyValue(elmCard, 'org', self.STRING, 0, 1) if sOrganizationName: arLines.append(self.vcardFold('ORG:' + sOrganizationName)) else: arOrganizationUnit = self.getPropertyValue(elmOrg, 'organization-unit', self.STRING, 1, 1) arLines.append(self.vcardFold('ORG:' + sOrganizationName + ';' + ';'.join(arOrganizationUnit))) # CATEGORY arCategory = self.getPropertyValue(elmCard, 'category', self.STRING, 1, 1) + self.getPropertyValue(elmCard, 'categories', self.STRING, 1, 1) if arCategory: arLines.append(self.vcardFold('CATEGORIES:' + ','.join(arCategory))) # NOTE processSingleString('note') # REV processSingleString('rev') # SOUND processSingleURI('sound') # UID processSingleString('uid') # URL processSingleURI('url') # CLASS processSingleString('class') # KEY processSingleURI('key') if arLines: arLines = [u'BEGIN:vCard',u'VERSION:3.0'] + arLines + [u'END:vCard'] # XXX - this is super ugly; properly fix this with issue 148 for i, s in enumerate(arLines): if not isinstance(s, unicode): arLines[i] = s.decode('utf-8', 'ignore') sVCards += u'\n'.join(arLines) + u'\n' return sVCards.strip() def isProbablyDownloadable(self, elm): attrsD = elm.attrMap if 'href' not in attrsD: return 0 linktype = attrsD.get('type', '').strip() if linktype.startswith('audio/') or \ linktype.startswith('video/') or \ (linktype.startswith('application/') and not linktype.endswith('xml')): return 1 try: path = urlparse.urlparse(attrsD['href'])[2] except ValueError: return 0 if path.find('.') == -1: return 0 fileext = path.split('.').pop().lower() return fileext in self.known_binary_extensions def findTags(self): all = lambda x: 1 for elm in self.document(all, {'rel': re.compile(r'\btag\b')}): href = elm.get('href') if not href: continue urlscheme, domain, path, params, query, fragment = \ urlparse.urlparse(_urljoin(self.baseuri, href)) segments = path.split('/') tag = segments.pop() if not tag: if segments: tag = segments.pop() else: # there are no tags continue tagscheme = urlparse.urlunparse((urlscheme, domain, '/'.join(segments), '', '', '')) if not tagscheme.endswith('/'): tagscheme += '/' self.tags.append(FeedParserDict({"term": tag, "scheme": tagscheme, "label": elm.string or ''})) def findEnclosures(self): all = lambda x: 1 enclosure_match = re.compile(r'\benclosure\b') for elm in self.document(all, {'href': re.compile(r'.+')}): if not enclosure_match.search(elm.get('rel', u'')) and not self.isProbablyDownloadable(elm): continue if elm.attrMap not in self.enclosures: self.enclosures.append(elm.attrMap) if elm.string and not elm.get('title'): self.enclosures[-1]['title'] = elm.string def findXFN(self): all = lambda x: 1 for elm in self.document(all, {'rel': re.compile('.+'), 'href': re.compile('.+')}): rels = elm.get('rel', u'').split() xfn_rels = [r for r in rels if r in self.known_xfn_relationships] if xfn_rels: self.xfn.append({"relationships": xfn_rels, "href": elm.get('href', ''), "name": elm.string}) def _parseMicroformats(htmlSource, baseURI, encoding): if not BeautifulSoup: return try: p = _MicroformatsParser(htmlSource, baseURI, encoding) except UnicodeEncodeError: # sgmllib throws this exception when performing lookups of tags # with non-ASCII characters in them. return p.vcard = p.findVCards(p.document) p.findTags() p.findEnclosures() p.findXFN() return {"tags": p.tags, "enclosures": p.enclosures, "xfn": p.xfn, "vcard": p.vcard} class _RelativeURIResolver(_BaseHTMLProcessor): relative_uris = set([('a', 'href'), ('applet', 'codebase'), ('area', 'href'), ('blockquote', 'cite'), ('body', 'background'), ('del', 'cite'), ('form', 'action'), ('frame', 'longdesc'), ('frame', 'src'), ('iframe', 'longdesc'), ('iframe', 'src'), ('head', 'profile'), ('img', 'longdesc'), ('img', 'src'), ('img', 'usemap'), ('input', 'src'), ('input', 'usemap'), ('ins', 'cite'), ('link', 'href'), ('object', 'classid'), ('object', 'codebase'), ('object', 'data'), ('object', 'usemap'), ('q', 'cite'), ('script', 'src'), ('video', 'poster')]) def __init__(self, baseuri, encoding, _type): _BaseHTMLProcessor.__init__(self, encoding, _type) self.baseuri = baseuri def resolveURI(self, uri): return _makeSafeAbsoluteURI(self.baseuri, uri.strip()) def unknown_starttag(self, tag, attrs): attrs = self.normalize_attrs(attrs) attrs = [(key, ((tag, key) in self.relative_uris) and self.resolveURI(value) or value) for key, value in attrs] _BaseHTMLProcessor.unknown_starttag(self, tag, attrs) def _resolveRelativeURIs(htmlSource, baseURI, encoding, _type): if not _SGML_AVAILABLE: return htmlSource p = _RelativeURIResolver(baseURI, encoding, _type) p.feed(htmlSource) return p.output() def _makeSafeAbsoluteURI(base, rel=None): # bail if ACCEPTABLE_URI_SCHEMES is empty if not ACCEPTABLE_URI_SCHEMES: try: return _urljoin(base, rel or u'') except ValueError: return u'' if not base: return rel or u'' if not rel: try: scheme = urlparse.urlparse(base)[0] except ValueError: return u'' if not scheme or scheme in ACCEPTABLE_URI_SCHEMES: return base return u'' try: uri = _urljoin(base, rel) except ValueError: return u'' if uri.strip().split(':', 1)[0] not in ACCEPTABLE_URI_SCHEMES: return u'' return uri class _HTMLSanitizer(_BaseHTMLProcessor): acceptable_elements = set(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'big', 'blockquote', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'command', 'datagrid', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'em', 'event-source', 'fieldset', 'figcaption', 'figure', 'footer', 'font', 'form', 'header', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'img', 'input', 'ins', 'keygen', 'kbd', 'label', 'legend', 'li', 'm', 'map', 'menu', 'meter', 'multicol', 'nav', 'nextid', 'ol', 'output', 'optgroup', 'option', 'p', 'pre', 'progress', 'q', 's', 'samp', 'section', 'select', 'small', 'sound', 'source', 'spacer', 'span', 'strike', 'strong', 'sub', 'sup', 'table', 'tbody', 'td', 'textarea', 'time', 'tfoot', 'th', 'thead', 'tr', 'tt', 'u', 'ul', 'var', 'video', 'noscript']) acceptable_attributes = set(['abbr', 'accept', 'accept-charset', 'accesskey', 'action', 'align', 'alt', 'autocomplete', 'autofocus', 'axis', 'background', 'balance', 'bgcolor', 'bgproperties', 'border', 'bordercolor', 'bordercolordark', 'bordercolorlight', 'bottompadding', 'cellpadding', 'cellspacing', 'ch', 'challenge', 'char', 'charoff', 'choff', 'charset', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'compact', 'contenteditable', 'controls', 'coords', 'data', 'datafld', 'datapagesize', 'datasrc', 'datetime', 'default', 'delay', 'dir', 'disabled', 'draggable', 'dynsrc', 'enctype', 'end', 'face', 'for', 'form', 'frame', 'galleryimg', 'gutter', 'headers', 'height', 'hidefocus', 'hidden', 'high', 'href', 'hreflang', 'hspace', 'icon', 'id', 'inputmode', 'ismap', 'keytype', 'label', 'leftspacing', 'lang', 'list', 'longdesc', 'loop', 'loopcount', 'loopend', 'loopstart', 'low', 'lowsrc', 'max', 'maxlength', 'media', 'method', 'min', 'multiple', 'name', 'nohref', 'noshade', 'nowrap', 'open', 'optimum', 'pattern', 'ping', 'point-size', 'poster', 'pqg', 'preload', 'prompt', 'radiogroup', 'readonly', 'rel', 'repeat-max', 'repeat-min', 'replace', 'required', 'rev', 'rightspacing', 'rows', 'rowspan', 'rules', 'scope', 'selected', 'shape', 'size', 'span', 'src', 'start', 'step', 'summary', 'suppress', 'tabindex', 'target', 'template', 'title', 'toppadding', 'type', 'unselectable', 'usemap', 'urn', 'valign', 'value', 'variable', 'volume', 'vspace', 'vrml', 'width', 'wrap', 'xml:lang']) unacceptable_elements_with_end_tag = set(['script', 'applet', 'style']) acceptable_css_properties = set(['azimuth', 'background-color', 'border-bottom-color', 'border-collapse', 'border-color', 'border-left-color', 'border-right-color', 'border-top-color', 'clear', 'color', 'cursor', 'direction', 'display', 'elevation', 'float', 'font', 'font-family', 'font-size', 'font-style', 'font-variant', 'font-weight', 'height', 'letter-spacing', 'line-height', 'overflow', 'pause', 'pause-after', 'pause-before', 'pitch', 'pitch-range', 'richness', 'speak', 'speak-header', 'speak-numeral', 'speak-punctuation', 'speech-rate', 'stress', 'text-align', 'text-decoration', 'text-indent', 'unicode-bidi', 'vertical-align', 'voice-family', 'volume', 'white-space', 'width']) # survey of common keywords found in feeds acceptable_css_keywords = set(['auto', 'aqua', 'black', 'block', 'blue', 'bold', 'both', 'bottom', 'brown', 'center', 'collapse', 'dashed', 'dotted', 'fuchsia', 'gray', 'green', '!important', 'italic', 'left', 'lime', 'maroon', 'medium', 'none', 'navy', 'normal', 'nowrap', 'olive', 'pointer', 'purple', 'red', 'right', 'solid', 'silver', 'teal', 'top', 'transparent', 'underline', 'white', 'yellow']) valid_css_values = re.compile('^(#[0-9a-f]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|' + '\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$') mathml_elements = set(['annotation', 'annotation-xml', 'maction', 'math', 'merror', 'mfenced', 'mfrac', 'mi', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mprescripts', 'mroot', 'mrow', 'mspace', 'msqrt', 'mstyle', 'msub', 'msubsup', 'msup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'none', 'semantics']) mathml_attributes = set(['actiontype', 'align', 'columnalign', 'columnalign', 'columnalign', 'close', 'columnlines', 'columnspacing', 'columnspan', 'depth', 'display', 'displaystyle', 'encoding', 'equalcolumns', 'equalrows', 'fence', 'fontstyle', 'fontweight', 'frame', 'height', 'linethickness', 'lspace', 'mathbackground', 'mathcolor', 'mathvariant', 'mathvariant', 'maxsize', 'minsize', 'open', 'other', 'rowalign', 'rowalign', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'scriptlevel', 'selection', 'separator', 'separators', 'stretchy', 'width', 'width', 'xlink:href', 'xlink:show', 'xlink:type', 'xmlns', 'xmlns:xlink']) # svgtiny - foreignObject + linearGradient + radialGradient + stop svg_elements = set(['a', 'animate', 'animateColor', 'animateMotion', 'animateTransform', 'circle', 'defs', 'desc', 'ellipse', 'foreignObject', 'font-face', 'font-face-name', 'font-face-src', 'g', 'glyph', 'hkern', 'linearGradient', 'line', 'marker', 'metadata', 'missing-glyph', 'mpath', 'path', 'polygon', 'polyline', 'radialGradient', 'rect', 'set', 'stop', 'svg', 'switch', 'text', 'title', 'tspan', 'use']) # svgtiny + class + opacity + offset + xmlns + xmlns:xlink svg_attributes = set(['accent-height', 'accumulate', 'additive', 'alphabetic', 'arabic-form', 'ascent', 'attributeName', 'attributeType', 'baseProfile', 'bbox', 'begin', 'by', 'calcMode', 'cap-height', 'class', 'color', 'color-rendering', 'content', 'cx', 'cy', 'd', 'dx', 'dy', 'descent', 'display', 'dur', 'end', 'fill', 'fill-opacity', 'fill-rule', 'font-family', 'font-size', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'from', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'gradientUnits', 'hanging', 'height', 'horiz-adv-x', 'horiz-origin-x', 'id', 'ideographic', 'k', 'keyPoints', 'keySplines', 'keyTimes', 'lang', 'mathematical', 'marker-end', 'marker-mid', 'marker-start', 'markerHeight', 'markerUnits', 'markerWidth', 'max', 'min', 'name', 'offset', 'opacity', 'orient', 'origin', 'overline-position', 'overline-thickness', 'panose-1', 'path', 'pathLength', 'points', 'preserveAspectRatio', 'r', 'refX', 'refY', 'repeatCount', 'repeatDur', 'requiredExtensions', 'requiredFeatures', 'restart', 'rotate', 'rx', 'ry', 'slope', 'stemh', 'stemv', 'stop-color', 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'systemLanguage', 'target', 'text-anchor', 'to', 'transform', 'type', 'u1', 'u2', 'underline-position', 'underline-thickness', 'unicode', 'unicode-range', 'units-per-em', 'values', 'version', 'viewBox', 'visibility', 'width', 'widths', 'x', 'x-height', 'x1', 'x2', 'xlink:actuate', 'xlink:arcrole', 'xlink:href', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type', 'xml:base', 'xml:lang', 'xml:space', 'xmlns', 'xmlns:xlink', 'y', 'y1', 'y2', 'zoomAndPan']) svg_attr_map = None svg_elem_map = None acceptable_svg_properties = set([ 'fill', 'fill-opacity', 'fill-rule', 'stroke', 'stroke-width', 'stroke-linecap', 'stroke-linejoin', 'stroke-opacity']) def reset(self): _BaseHTMLProcessor.reset(self) self.unacceptablestack = 0 self.mathmlOK = 0 self.svgOK = 0 def unknown_starttag(self, tag, attrs): acceptable_attributes = self.acceptable_attributes keymap = {} if not tag in self.acceptable_elements or self.svgOK: if tag in self.unacceptable_elements_with_end_tag: self.unacceptablestack += 1 # add implicit namespaces to html5 inline svg/mathml if self._type.endswith('html'): if not dict(attrs).get('xmlns'): if tag=='svg': attrs.append( ('xmlns','http://www.w3.org/2000/svg') ) if tag=='math': attrs.append( ('xmlns','http://www.w3.org/1998/Math/MathML') ) # not otherwise acceptable, perhaps it is MathML or SVG? if tag=='math' and ('xmlns','http://www.w3.org/1998/Math/MathML') in attrs: self.mathmlOK += 1 if tag=='svg' and ('xmlns','http://www.w3.org/2000/svg') in attrs: self.svgOK += 1 # chose acceptable attributes based on tag class, else bail if self.mathmlOK and tag in self.mathml_elements: acceptable_attributes = self.mathml_attributes elif self.svgOK and tag in self.svg_elements: # for most vocabularies, lowercasing is a good idea. Many # svg elements, however, are camel case if not self.svg_attr_map: lower=[attr.lower() for attr in self.svg_attributes] mix=[a for a in self.svg_attributes if a not in lower] self.svg_attributes = lower self.svg_attr_map = dict([(a.lower(),a) for a in mix]) lower=[attr.lower() for attr in self.svg_elements] mix=[a for a in self.svg_elements if a not in lower] self.svg_elements = lower self.svg_elem_map = dict([(a.lower(),a) for a in mix]) acceptable_attributes = self.svg_attributes tag = self.svg_elem_map.get(tag,tag) keymap = self.svg_attr_map elif not tag in self.acceptable_elements: return # declare xlink namespace, if needed if self.mathmlOK or self.svgOK: if filter(lambda (n,v): n.startswith('xlink:'),attrs): if not ('xmlns:xlink','http://www.w3.org/1999/xlink') in attrs: attrs.append(('xmlns:xlink','http://www.w3.org/1999/xlink')) clean_attrs = [] for key, value in self.normalize_attrs(attrs): if key in acceptable_attributes: key=keymap.get(key,key) # make sure the uri uses an acceptable uri scheme if key == u'href': value = _makeSafeAbsoluteURI(value) clean_attrs.append((key,value)) elif key=='style': clean_value = self.sanitize_style(value) if clean_value: clean_attrs.append((key,clean_value)) _BaseHTMLProcessor.unknown_starttag(self, tag, clean_attrs) def unknown_endtag(self, tag): if not tag in self.acceptable_elements: if tag in self.unacceptable_elements_with_end_tag: self.unacceptablestack -= 1 if self.mathmlOK and tag in self.mathml_elements: if tag == 'math' and self.mathmlOK: self.mathmlOK -= 1 elif self.svgOK and tag in self.svg_elements: tag = self.svg_elem_map.get(tag,tag) if tag == 'svg' and self.svgOK: self.svgOK -= 1 else: return _BaseHTMLProcessor.unknown_endtag(self, tag) def handle_pi(self, text): pass def handle_decl(self, text): pass def handle_data(self, text): if not self.unacceptablestack: _BaseHTMLProcessor.handle_data(self, text) def sanitize_style(self, style): # disallow urls style=re.compile('url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ',style) # gauntlet if not re.match("""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): return '' # This replaced a regexp that used re.match and was prone to pathological back-tracking. if re.sub("\s*[-\w]+\s*:\s*[^:;]*;?", '', style).strip(): return '' clean = [] for prop,value in re.findall("([-\w]+)\s*:\s*([^:;]*)",style): if not value: continue if prop.lower() in self.acceptable_css_properties: clean.append(prop + ': ' + value + ';') elif prop.split('-')[0].lower() in ['background','border','margin','padding']: for keyword in value.split(): if not keyword in self.acceptable_css_keywords and \ not self.valid_css_values.match(keyword): break else: clean.append(prop + ': ' + value + ';') elif self.svgOK and prop.lower() in self.acceptable_svg_properties: clean.append(prop + ': ' + value + ';') return ' '.join(clean) def parse_comment(self, i, report=1): ret = _BaseHTMLProcessor.parse_comment(self, i, report) if ret >= 0: return ret # if ret == -1, this may be a malicious attempt to circumvent # sanitization, or a page-destroying unclosed comment match = re.compile(r'--[^>]*>').search(self.rawdata, i+4) if match: return match.end() # unclosed comment; deliberately fail to handle_data() return len(self.rawdata) def _sanitizeHTML(htmlSource, encoding, _type): if not _SGML_AVAILABLE: return htmlSource p = _HTMLSanitizer(encoding, _type) htmlSource = htmlSource.replace(''): data = data.split('>', 1)[1] if data.count(' stream This function lets you define parsers that take any input source (URL, pathname to local or network file, or actual data as a string) and deal with it in a uniform manner. Returned object is guaranteed to have all the basic stdio read methods (read, readline, readlines). Just .close() the object when you're done with it. If the etag argument is supplied, it will be used as the value of an If-None-Match request header. If the modified argument is supplied, it can be a tuple of 9 integers (as returned by gmtime() in the standard Python time module) or a date string in any format supported by feedparser. Regardless, it MUST be in GMT (Greenwich Mean Time). It will be reformatted into an RFC 1123-compliant date and used as the value of an If-Modified-Since request header. If the agent argument is supplied, it will be used as the value of a User-Agent request header. If the referrer argument is supplied, it will be used as the value of a Referer[sic] request header. If handlers is supplied, it is a list of handlers used to build a urllib2 opener. if request_headers is supplied it is a dictionary of HTTP request headers that will override the values generated by FeedParser. """ if hasattr(url_file_stream_or_string, 'read'): return url_file_stream_or_string if isinstance(url_file_stream_or_string, basestring) \ and urlparse.urlparse(url_file_stream_or_string)[0] in ('http', 'https', 'ftp', 'file', 'feed'): # Deal with the feed URI scheme if url_file_stream_or_string.startswith('feed:http'): url_file_stream_or_string = url_file_stream_or_string[5:] elif url_file_stream_or_string.startswith('feed:'): url_file_stream_or_string = 'http:' + url_file_stream_or_string[5:] if not agent: agent = USER_AGENT # Test for inline user:password credentials for HTTP basic auth auth = None if base64 and not url_file_stream_or_string.startswith('ftp:'): urltype, rest = urllib.splittype(url_file_stream_or_string) realhost, rest = urllib.splithost(rest) if realhost: user_passwd, realhost = urllib.splituser(realhost) if user_passwd: url_file_stream_or_string = '%s://%s%s' % (urltype, realhost, rest) auth = base64.standard_b64encode(user_passwd).strip() # iri support if isinstance(url_file_stream_or_string, unicode): url_file_stream_or_string = _convert_to_idn(url_file_stream_or_string) # try to open with urllib2 (to use optional headers) request = _build_urllib2_request(url_file_stream_or_string, agent, etag, modified, referrer, auth, request_headers) opener = urllib2.build_opener(*tuple(handlers + [_FeedURLHandler()])) opener.addheaders = [] # RMK - must clear so we only send our custom User-Agent try: return opener.open(request) finally: opener.close() # JohnD # try to open with native open function (if url_file_stream_or_string is a filename) try: return open(url_file_stream_or_string, 'rb') except (IOError, UnicodeEncodeError, TypeError): # if url_file_stream_or_string is a unicode object that # cannot be converted to the encoding returned by # sys.getfilesystemencoding(), a UnicodeEncodeError # will be thrown # If url_file_stream_or_string is a string that contains NULL # (such as an XML document encoded in UTF-32), TypeError will # be thrown. pass # treat url_file_stream_or_string as string if isinstance(url_file_stream_or_string, unicode): return _StringIO(url_file_stream_or_string.encode('utf-8')) return _StringIO(url_file_stream_or_string) def _convert_to_idn(url): """Convert a URL to IDN notation""" # this function should only be called with a unicode string # strategy: if the host cannot be encoded in ascii, then # it'll be necessary to encode it in idn form parts = list(urlparse.urlsplit(url)) try: parts[1].encode('ascii') except UnicodeEncodeError: # the url needs to be converted to idn notation host = parts[1].rsplit(':', 1) newhost = [] port = u'' if len(host) == 2: port = host.pop() for h in host[0].split('.'): newhost.append(h.encode('idna').decode('utf-8')) parts[1] = '.'.join(newhost) if port: parts[1] += ':' + port return urlparse.urlunsplit(parts) else: return url def _build_urllib2_request(url, agent, etag, modified, referrer, auth, request_headers): request = urllib2.Request(url) request.add_header('User-Agent', agent) if etag: request.add_header('If-None-Match', etag) if isinstance(modified, basestring): modified = _parse_date(modified) elif isinstance(modified, datetime.datetime): modified = modified.utctimetuple() if modified: # format into an RFC 1123-compliant timestamp. We can't use # time.strftime() since the %a and %b directives can be affected # by the current locale, but RFC 2616 states that dates must be # in English. short_weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] request.add_header('If-Modified-Since', '%s, %02d %s %04d %02d:%02d:%02d GMT' % (short_weekdays[modified[6]], modified[2], months[modified[1] - 1], modified[0], modified[3], modified[4], modified[5])) if referrer: request.add_header('Referer', referrer) if gzip and zlib: request.add_header('Accept-encoding', 'gzip, deflate') elif gzip: request.add_header('Accept-encoding', 'gzip') elif zlib: request.add_header('Accept-encoding', 'deflate') else: request.add_header('Accept-encoding', '') if auth: request.add_header('Authorization', 'Basic %s' % auth) if ACCEPT_HEADER: request.add_header('Accept', ACCEPT_HEADER) # use this for whatever -- cookies, special headers, etc # [('Cookie','Something'),('x-special-header','Another Value')] for header_name, header_value in request_headers.items(): request.add_header(header_name, header_value) request.add_header('A-IM', 'feed') # RFC 3229 support return request _date_handlers = [] def registerDateHandler(func): '''Register a date handler function (takes string, returns 9-tuple date in GMT)''' _date_handlers.insert(0, func) # ISO-8601 date parsing routines written by Fazal Majid. # The ISO 8601 standard is very convoluted and irregular - a full ISO 8601 # parser is beyond the scope of feedparser and would be a worthwhile addition # to the Python library. # A single regular expression cannot parse ISO 8601 date formats into groups # as the standard is highly irregular (for instance is 030104 2003-01-04 or # 0301-04-01), so we use templates instead. # Please note the order in templates is significant because we need a # greedy match. _iso8601_tmpl = ['YYYY-?MM-?DD', 'YYYY-0MM?-?DD', 'YYYY-MM', 'YYYY-?OOO', 'YY-?MM-?DD', 'YY-?OOO', 'YYYY', '-YY-?MM', '-OOO', '-YY', '--MM-?DD', '--MM', '---DD', 'CC', ''] _iso8601_re = [ tmpl.replace( 'YYYY', r'(?P\d{4})').replace( 'YY', r'(?P\d\d)').replace( 'MM', r'(?P[01]\d)').replace( 'DD', r'(?P[0123]\d)').replace( 'OOO', r'(?P[0123]\d\d)').replace( 'CC', r'(?P\d\d$)') + r'(T?(?P\d{2}):(?P\d{2})' + r'(:(?P\d{2}))?' + r'(\.(?P\d+))?' + r'(?P[+-](?P\d{2})(:(?P\d{2}))?|Z)?)?' for tmpl in _iso8601_tmpl] try: del tmpl except NameError: pass _iso8601_matches = [re.compile(regex).match for regex in _iso8601_re] try: del regex except NameError: pass def _parse_date_iso8601(dateString): '''Parse a variety of ISO-8601-compatible formats like 20040105''' m = None for _iso8601_match in _iso8601_matches: m = _iso8601_match(dateString) if m: break if not m: return if m.span() == (0, 0): return params = m.groupdict() ordinal = params.get('ordinal', 0) if ordinal: ordinal = int(ordinal) else: ordinal = 0 year = params.get('year', '--') if not year or year == '--': year = time.gmtime()[0] elif len(year) == 2: # ISO 8601 assumes current century, i.e. 93 -> 2093, NOT 1993 year = 100 * int(time.gmtime()[0] / 100) + int(year) else: year = int(year) month = params.get('month', '-') if not month or month == '-': # ordinals are NOT normalized by mktime, we simulate them # by setting month=1, day=ordinal if ordinal: month = 1 else: month = time.gmtime()[1] month = int(month) day = params.get('day', 0) if not day: # see above if ordinal: day = ordinal elif params.get('century', 0) or \ params.get('year', 0) or params.get('month', 0): day = 1 else: day = time.gmtime()[2] else: day = int(day) # special case of the century - is the first year of the 21st century # 2000 or 2001 ? The debate goes on... if 'century' in params: year = (int(params['century']) - 1) * 100 + 1 # in ISO 8601 most fields are optional for field in ['hour', 'minute', 'second', 'tzhour', 'tzmin']: if not params.get(field, None): params[field] = 0 hour = int(params.get('hour', 0)) minute = int(params.get('minute', 0)) second = int(float(params.get('second', 0))) # weekday is normalized by mktime(), we can ignore it weekday = 0 daylight_savings_flag = -1 tm = [year, month, day, hour, minute, second, weekday, ordinal, daylight_savings_flag] # ISO 8601 time zone adjustments tz = params.get('tz') if tz and tz != 'Z': if tz[0] == '-': tm[3] += int(params.get('tzhour', 0)) tm[4] += int(params.get('tzmin', 0)) elif tz[0] == '+': tm[3] -= int(params.get('tzhour', 0)) tm[4] -= int(params.get('tzmin', 0)) else: return None # Python's time.mktime() is a wrapper around the ANSI C mktime(3c) # which is guaranteed to normalize d/m/y/h/m/s. # Many implementations have bugs, but we'll pretend they don't. return time.localtime(time.mktime(tuple(tm))) registerDateHandler(_parse_date_iso8601) # 8-bit date handling routines written by ytrewq1. _korean_year = u'\ub144' # b3e2 in euc-kr _korean_month = u'\uc6d4' # bff9 in euc-kr _korean_day = u'\uc77c' # c0cf in euc-kr _korean_am = u'\uc624\uc804' # bfc0 c0fc in euc-kr _korean_pm = u'\uc624\ud6c4' # bfc0 c8c4 in euc-kr _korean_onblog_date_re = \ re.compile('(\d{4})%s\s+(\d{2})%s\s+(\d{2})%s\s+(\d{2}):(\d{2}):(\d{2})' % \ (_korean_year, _korean_month, _korean_day)) _korean_nate_date_re = \ re.compile(u'(\d{4})-(\d{2})-(\d{2})\s+(%s|%s)\s+(\d{,2}):(\d{,2}):(\d{,2})' % \ (_korean_am, _korean_pm)) def _parse_date_onblog(dateString): '''Parse a string according to the OnBlog 8-bit date format''' m = _korean_onblog_date_re.match(dateString) if not m: return w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)s' % \ {'year': m.group(1), 'month': m.group(2), 'day': m.group(3),\ 'hour': m.group(4), 'minute': m.group(5), 'second': m.group(6),\ 'zonediff': '+09:00'} return _parse_date_w3dtf(w3dtfdate) registerDateHandler(_parse_date_onblog) def _parse_date_nate(dateString): '''Parse a string according to the Nate 8-bit date format''' m = _korean_nate_date_re.match(dateString) if not m: return hour = int(m.group(5)) ampm = m.group(4) if (ampm == _korean_pm): hour += 12 hour = str(hour) if len(hour) == 1: hour = '0' + hour w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)s' % \ {'year': m.group(1), 'month': m.group(2), 'day': m.group(3),\ 'hour': hour, 'minute': m.group(6), 'second': m.group(7),\ 'zonediff': '+09:00'} return _parse_date_w3dtf(w3dtfdate) registerDateHandler(_parse_date_nate) # Unicode strings for Greek date strings _greek_months = \ { \ u'\u0399\u03b1\u03bd': u'Jan', # c9e1ed in iso-8859-7 u'\u03a6\u03b5\u03b2': u'Feb', # d6e5e2 in iso-8859-7 u'\u039c\u03ac\u03ce': u'Mar', # ccdcfe in iso-8859-7 u'\u039c\u03b1\u03ce': u'Mar', # cce1fe in iso-8859-7 u'\u0391\u03c0\u03c1': u'Apr', # c1f0f1 in iso-8859-7 u'\u039c\u03ac\u03b9': u'May', # ccdce9 in iso-8859-7 u'\u039c\u03b1\u03ca': u'May', # cce1fa in iso-8859-7 u'\u039c\u03b1\u03b9': u'May', # cce1e9 in iso-8859-7 u'\u0399\u03bf\u03cd\u03bd': u'Jun', # c9effded in iso-8859-7 u'\u0399\u03bf\u03bd': u'Jun', # c9efed in iso-8859-7 u'\u0399\u03bf\u03cd\u03bb': u'Jul', # c9effdeb in iso-8859-7 u'\u0399\u03bf\u03bb': u'Jul', # c9f9eb in iso-8859-7 u'\u0391\u03cd\u03b3': u'Aug', # c1fde3 in iso-8859-7 u'\u0391\u03c5\u03b3': u'Aug', # c1f5e3 in iso-8859-7 u'\u03a3\u03b5\u03c0': u'Sep', # d3e5f0 in iso-8859-7 u'\u039f\u03ba\u03c4': u'Oct', # cfeaf4 in iso-8859-7 u'\u039d\u03bf\u03ad': u'Nov', # cdefdd in iso-8859-7 u'\u039d\u03bf\u03b5': u'Nov', # cdefe5 in iso-8859-7 u'\u0394\u03b5\u03ba': u'Dec', # c4e5ea in iso-8859-7 } _greek_wdays = \ { \ u'\u039a\u03c5\u03c1': u'Sun', # caf5f1 in iso-8859-7 u'\u0394\u03b5\u03c5': u'Mon', # c4e5f5 in iso-8859-7 u'\u03a4\u03c1\u03b9': u'Tue', # d4f1e9 in iso-8859-7 u'\u03a4\u03b5\u03c4': u'Wed', # d4e5f4 in iso-8859-7 u'\u03a0\u03b5\u03bc': u'Thu', # d0e5ec in iso-8859-7 u'\u03a0\u03b1\u03c1': u'Fri', # d0e1f1 in iso-8859-7 u'\u03a3\u03b1\u03b2': u'Sat', # d3e1e2 in iso-8859-7 } _greek_date_format_re = \ re.compile(u'([^,]+),\s+(\d{2})\s+([^\s]+)\s+(\d{4})\s+(\d{2}):(\d{2}):(\d{2})\s+([^\s]+)') def _parse_date_greek(dateString): '''Parse a string according to a Greek 8-bit date format.''' m = _greek_date_format_re.match(dateString) if not m: return wday = _greek_wdays[m.group(1)] month = _greek_months[m.group(3)] rfc822date = '%(wday)s, %(day)s %(month)s %(year)s %(hour)s:%(minute)s:%(second)s %(zonediff)s' % \ {'wday': wday, 'day': m.group(2), 'month': month, 'year': m.group(4),\ 'hour': m.group(5), 'minute': m.group(6), 'second': m.group(7),\ 'zonediff': m.group(8)} return _parse_date_rfc822(rfc822date) registerDateHandler(_parse_date_greek) # Unicode strings for Hungarian date strings _hungarian_months = \ { \ u'janu\u00e1r': u'01', # e1 in iso-8859-2 u'febru\u00e1ri': u'02', # e1 in iso-8859-2 u'm\u00e1rcius': u'03', # e1 in iso-8859-2 u'\u00e1prilis': u'04', # e1 in iso-8859-2 u'm\u00e1ujus': u'05', # e1 in iso-8859-2 u'j\u00fanius': u'06', # fa in iso-8859-2 u'j\u00falius': u'07', # fa in iso-8859-2 u'augusztus': u'08', u'szeptember': u'09', u'okt\u00f3ber': u'10', # f3 in iso-8859-2 u'november': u'11', u'december': u'12', } _hungarian_date_format_re = \ re.compile(u'(\d{4})-([^-]+)-(\d{,2})T(\d{,2}):(\d{2})((\+|-)(\d{,2}:\d{2}))') def _parse_date_hungarian(dateString): '''Parse a string according to a Hungarian 8-bit date format.''' m = _hungarian_date_format_re.match(dateString) if not m or m.group(2) not in _hungarian_months: return None month = _hungarian_months[m.group(2)] day = m.group(3) if len(day) == 1: day = '0' + day hour = m.group(4) if len(hour) == 1: hour = '0' + hour w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s%(zonediff)s' % \ {'year': m.group(1), 'month': month, 'day': day,\ 'hour': hour, 'minute': m.group(5),\ 'zonediff': m.group(6)} return _parse_date_w3dtf(w3dtfdate) registerDateHandler(_parse_date_hungarian) # W3DTF-style date parsing adapted from PyXML xml.utils.iso8601, written by # Drake and licensed under the Python license. Removed all range checking # for month, day, hour, minute, and second, since mktime will normalize # these later # Modified to also support MSSQL-style datetimes as defined at: # http://msdn.microsoft.com/en-us/library/ms186724.aspx # (which basically means allowing a space as a date/time/timezone separator) def _parse_date_w3dtf(dateString): def __extract_date(m): year = int(m.group('year')) if year < 100: year = 100 * int(time.gmtime()[0] / 100) + int(year) if year < 1000: return 0, 0, 0 julian = m.group('julian') if julian: julian = int(julian) month = julian / 30 + 1 day = julian % 30 + 1 jday = None while jday != julian: t = time.mktime((year, month, day, 0, 0, 0, 0, 0, 0)) jday = time.gmtime(t)[-2] diff = abs(jday - julian) if jday > julian: if diff < day: day = day - diff else: month = month - 1 day = 31 elif jday < julian: if day + diff < 28: day = day + diff else: month = month + 1 return year, month, day month = m.group('month') day = 1 if month is None: month = 1 else: month = int(month) day = m.group('day') if day: day = int(day) else: day = 1 return year, month, day def __extract_time(m): if not m: return 0, 0, 0 hours = m.group('hours') if not hours: return 0, 0, 0 hours = int(hours) minutes = int(m.group('minutes')) seconds = m.group('seconds') if seconds: seconds = int(seconds) else: seconds = 0 return hours, minutes, seconds def __extract_tzd(m): '''Return the Time Zone Designator as an offset in seconds from UTC.''' if not m: return 0 tzd = m.group('tzd') if not tzd: return 0 if tzd == 'Z': return 0 hours = int(m.group('tzdhours')) minutes = m.group('tzdminutes') if minutes: minutes = int(minutes) else: minutes = 0 offset = (hours*60 + minutes) * 60 if tzd[0] == '+': return -offset return offset __date_re = ('(?P\d\d\d\d)' '(?:(?P-|)' '(?:(?P\d\d)(?:(?P=dsep)(?P\d\d))?' '|(?P\d\d\d)))?') __tzd_re = ' ?(?P[-+](?P\d\d)(?::?(?P\d\d))|Z)?' __time_re = ('(?P\d\d)(?P:|)(?P\d\d)' '(?:(?P=tsep)(?P\d\d)(?:[.,]\d+)?)?' + __tzd_re) __datetime_re = '%s(?:[T ]%s)?' % (__date_re, __time_re) __datetime_rx = re.compile(__datetime_re) m = __datetime_rx.match(dateString) if (m is None) or (m.group() != dateString): return gmt = __extract_date(m) + __extract_time(m) + (0, 0, 0) if gmt[0] == 0: return return time.gmtime(time.mktime(gmt) + __extract_tzd(m) - time.timezone) registerDateHandler(_parse_date_w3dtf) # Define the strings used by the RFC822 datetime parser _rfc822_months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'] _rfc822_daynames = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'] # Only the first three letters of the month name matter _rfc822_month = "(?P%s)(?:[a-z]*,?)" % ('|'.join(_rfc822_months)) # The year may be 2 or 4 digits; capture the century if it exists _rfc822_year = "(?P(?:\d{2})?\d{2})" _rfc822_day = "(?P *\d{1,2})" _rfc822_date = "%s %s %s" % (_rfc822_day, _rfc822_month, _rfc822_year) _rfc822_hour = "(?P\d{2}):(?P\d{2})(?::(?P\d{2}))?" _rfc822_tz = "(?Put|gmt(?:[+-]\d{2}:\d{2})?|[aecmp][sd]?t|[zamny]|[+-]\d{4})" _rfc822_tznames = { 'ut': 0, 'gmt': 0, 'z': 0, 'adt': -3, 'ast': -4, 'at': -4, 'edt': -4, 'est': -5, 'et': -5, 'cdt': -5, 'cst': -6, 'ct': -6, 'mdt': -6, 'mst': -7, 'mt': -7, 'pdt': -7, 'pst': -8, 'pt': -8, 'a': -1, 'n': 1, 'm': -12, 'y': 12, } # The timezone may be prefixed by 'Etc/' _rfc822_time = "%s (?:etc/)?%s" % (_rfc822_hour, _rfc822_tz) _rfc822_dayname = "(?P%s)" % ('|'.join(_rfc822_daynames)) _rfc822_match = re.compile( "(?:%s, )?%s(?: %s)?" % (_rfc822_dayname, _rfc822_date, _rfc822_time) ).match def _parse_date_group_rfc822(m): # Calculate a date and timestamp for k in ('year', 'day', 'hour', 'minute', 'second'): m[k] = int(m[k]) m['month'] = _rfc822_months.index(m['month']) + 1 # If the year is 2 digits, assume everything in the 90's is the 1990's if m['year'] < 100: m['year'] += (1900, 2000)[m['year'] < 90] stamp = datetime.datetime(*[m[i] for i in ('year', 'month', 'day', 'hour', 'minute', 'second')]) # Use the timezone information to calculate the difference between # the given date and timestamp and Universal Coordinated Time tzhour = 0 tzmin = 0 if m['tz'] and m['tz'].startswith('gmt'): # Handle GMT and GMT+hh:mm timezone syntax (the trailing # timezone info will be handled by the next `if` block) m['tz'] = ''.join(m['tz'][3:].split(':')) or 'gmt' if not m['tz']: pass elif m['tz'].startswith('+'): tzhour = int(m['tz'][1:3]) tzmin = int(m['tz'][3:]) elif m['tz'].startswith('-'): tzhour = int(m['tz'][1:3]) * -1 tzmin = int(m['tz'][3:]) * -1 else: tzhour = _rfc822_tznames[m['tz']] delta = datetime.timedelta(0, 0, 0, 0, tzmin, tzhour) # Return the date and timestamp in UTC return (stamp - delta).utctimetuple() def _parse_date_rfc822(dt): """Parse RFC 822 dates and times, with one minor difference: years may be 4DIGIT or 2DIGIT. http://tools.ietf.org/html/rfc822#section-5""" try: m = _rfc822_match(dt.lower()).groupdict(0) except AttributeError: return None return _parse_date_group_rfc822(m) registerDateHandler(_parse_date_rfc822) def _parse_date_rfc822_grubby(dt): """Parse date format similar to RFC 822, but the comma after the dayname is optional and month/day are inverted""" _rfc822_date_grubby = "%s %s %s" % (_rfc822_month, _rfc822_day, _rfc822_year) _rfc822_match_grubby = re.compile( "(?:%s[,]? )?%s(?: %s)?" % (_rfc822_dayname, _rfc822_date_grubby, _rfc822_time) ).match try: m = _rfc822_match_grubby(dt.lower()).groupdict(0) except AttributeError: return None return _parse_date_group_rfc822(m) registerDateHandler(_parse_date_rfc822_grubby) def _parse_date_asctime(dt): """Parse asctime-style dates""" dayname, month, day, remainder = dt.split(None, 3) # Convert month and day into zero-padded integers month = '%02i ' % (_rfc822_months.index(month.lower()) + 1) day = '%02i ' % (int(day),) dt = month + day + remainder return time.strptime(dt, '%m %d %H:%M:%S %Y')[:-1] + (0, ) registerDateHandler(_parse_date_asctime) def _parse_date_perforce(aDateString): """parse a date in yyyy/mm/dd hh:mm:ss TTT format""" # Fri, 2006/09/15 08:19:53 EDT _my_date_pattern = re.compile( \ r'(\w{,3}), (\d{,4})/(\d{,2})/(\d{2}) (\d{,2}):(\d{2}):(\d{2}) (\w{,3})') m = _my_date_pattern.search(aDateString) if m is None: return None dow, year, month, day, hour, minute, second, tz = m.groups() months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] dateString = "%s, %s %s %s %s:%s:%s %s" % (dow, day, months[int(month) - 1], year, hour, minute, second, tz) tm = rfc822.parsedate_tz(dateString) if tm: return time.gmtime(rfc822.mktime_tz(tm)) registerDateHandler(_parse_date_perforce) def _parse_date(dateString): '''Parses a variety of date formats into a 9-tuple in GMT''' if not dateString: return None for handler in _date_handlers: try: date9tuple = handler(dateString) except (KeyError, OverflowError, ValueError): continue if not date9tuple: continue if len(date9tuple) != 9: continue return date9tuple return None # Each marker represents some of the characters of the opening XML # processing instruction (' RE_XML_DECLARATION = re.compile('^<\?xml[^>]*?>') # Capture the value of the XML processing instruction's encoding attribute. # Example: RE_XML_PI_ENCODING = re.compile(_s2bytes('^<\?.*encoding=[\'"](.*?)[\'"].*\?>')) def convert_to_utf8(http_headers, data): '''Detect and convert the character encoding to UTF-8. http_headers is a dictionary data is a raw string (not Unicode)''' # This is so much trickier than it sounds, it's not even funny. # According to RFC 3023 ('XML Media Types'), if the HTTP Content-Type # is application/xml, application/*+xml, # application/xml-external-parsed-entity, or application/xml-dtd, # the encoding given in the charset parameter of the HTTP Content-Type # takes precedence over the encoding given in the XML prefix within the # document, and defaults to 'utf-8' if neither are specified. But, if # the HTTP Content-Type is text/xml, text/*+xml, or # text/xml-external-parsed-entity, the encoding given in the XML prefix # within the document is ALWAYS IGNORED and only the encoding given in # the charset parameter of the HTTP Content-Type header should be # respected, and it defaults to 'us-ascii' if not specified. # Furthermore, discussion on the atom-syntax mailing list with the # author of RFC 3023 leads me to the conclusion that any document # served with a Content-Type of text/* and no charset parameter # must be treated as us-ascii. (We now do this.) And also that it # must always be flagged as non-well-formed. (We now do this too.) # If Content-Type is unspecified (input was local file or non-HTTP source) # or unrecognized (server just got it totally wrong), then go by the # encoding given in the XML prefix of the document and default to # 'iso-8859-1' as per the HTTP specification (RFC 2616). # Then, assuming we didn't find a character encoding in the HTTP headers # (and the HTTP Content-type allowed us to look in the body), we need # to sniff the first few bytes of the XML data and try to determine # whether the encoding is ASCII-compatible. Section F of the XML # specification shows the way here: # http://www.w3.org/TR/REC-xml/#sec-guessing-no-ext-info # If the sniffed encoding is not ASCII-compatible, we need to make it # ASCII compatible so that we can sniff further into the XML declaration # to find the encoding attribute, which will tell us the true encoding. # Of course, none of this guarantees that we will be able to parse the # feed in the declared character encoding (assuming it was declared # correctly, which many are not). iconv_codec can help a lot; # you should definitely install it if you can. # http://cjkpython.i18n.org/ bom_encoding = u'' xml_encoding = u'' rfc3023_encoding = u'' # Look at the first few bytes of the document to guess what # its encoding may be. We only need to decode enough of the # document that we can use an ASCII-compatible regular # expression to search for an XML encoding declaration. # The heuristic follows the XML specification, section F: # http://www.w3.org/TR/REC-xml/#sec-guessing-no-ext-info # Check for BOMs first. if data[:4] == codecs.BOM_UTF32_BE: bom_encoding = u'utf-32be' data = data[4:] elif data[:4] == codecs.BOM_UTF32_LE: bom_encoding = u'utf-32le' data = data[4:] elif data[:2] == codecs.BOM_UTF16_BE and data[2:4] != ZERO_BYTES: bom_encoding = u'utf-16be' data = data[2:] elif data[:2] == codecs.BOM_UTF16_LE and data[2:4] != ZERO_BYTES: bom_encoding = u'utf-16le' data = data[2:] elif data[:3] == codecs.BOM_UTF8: bom_encoding = u'utf-8' data = data[3:] # Check for the characters '''' if RE_XML_DECLARATION.search(data): data = RE_XML_DECLARATION.sub(new_declaration, data) else: data = new_declaration + u'\n' + data data = data.encode('utf-8') break # if still no luck, give up if not known_encoding: error = CharacterEncodingUnknown( 'document encoding unknown, I tried ' + '%s, %s, utf-8, windows-1252, and iso-8859-2 but nothing worked' % (rfc3023_encoding, xml_encoding)) rfc3023_encoding = u'' elif proposed_encoding != rfc3023_encoding: error = CharacterEncodingOverride( 'document declared as %s, but parsed as %s' % (rfc3023_encoding, proposed_encoding)) rfc3023_encoding = proposed_encoding return data, rfc3023_encoding, error # Match XML entity declarations. # Example: RE_ENTITY_PATTERN = re.compile(_s2bytes(r'^\s*]*?)>'), re.MULTILINE) # Match XML DOCTYPE declarations. # Example: RE_DOCTYPE_PATTERN = re.compile(_s2bytes(r'^\s*]*?)>'), re.MULTILINE) # Match safe entity declarations. # This will allow hexadecimal character references through, # as well as text, but not arbitrary nested entities. # Example: cubed "³" # Example: copyright "(C)" # Forbidden: explode1 "&explode2;&explode2;" RE_SAFE_ENTITY_PATTERN = re.compile(_s2bytes('\s+(\w+)\s+"(&#\w+;|[^&"]*)"')) def replace_doctype(data): '''Strips and replaces the DOCTYPE, returns (rss_version, stripped_data) rss_version may be 'rss091n' or None stripped_data is the same XML document with a replaced DOCTYPE ''' # Divide the document into two groups by finding the location # of the first element that doesn't begin with '\n\n]>') data = RE_DOCTYPE_PATTERN.sub(replacement, head) + data # Precompute the safe entities for the loose parser. safe_entities = dict((k.decode('utf-8'), v.decode('utf-8')) for k, v in RE_SAFE_ENTITY_PATTERN.findall(replacement)) return version, data, safe_entities def parse(url_file_stream_or_string, etag=None, modified=None, agent=None, referrer=None, handlers=None, request_headers=None, response_headers=None): '''Parse a feed from a URL, file, stream, or string. request_headers, if given, is a dict from http header name to value to add to the request; this overrides internally generated values. ''' if handlers is None: handlers = [] if request_headers is None: request_headers = {} if response_headers is None: response_headers = {} result = FeedParserDict() result['feed'] = FeedParserDict() result['entries'] = [] result['bozo'] = 0 if not isinstance(handlers, list): handlers = [handlers] try: f = _open_resource(url_file_stream_or_string, etag, modified, agent, referrer, handlers, request_headers) data = f.read() except Exception, e: result['bozo'] = 1 result['bozo_exception'] = e data = None f = None if hasattr(f, 'headers'): result['headers'] = dict(f.headers) # overwrite existing headers using response_headers if 'headers' in result: result['headers'].update(response_headers) elif response_headers: result['headers'] = copy.deepcopy(response_headers) # lowercase all of the HTTP headers for comparisons per RFC 2616 if 'headers' in result: http_headers = dict((k.lower(), v) for k, v in result['headers'].items()) else: http_headers = {} # if feed is gzip-compressed, decompress it if f and data and http_headers: if gzip and 'gzip' in http_headers.get('content-encoding', ''): try: data = gzip.GzipFile(fileobj=_StringIO(data)).read() except (IOError, struct.error), e: # IOError can occur if the gzip header is bad. # struct.error can occur if the data is damaged. result['bozo'] = 1 result['bozo_exception'] = e if isinstance(e, struct.error): # A gzip header was found but the data is corrupt. # Ideally, we should re-request the feed without the # 'Accept-encoding: gzip' header, but we don't. data = None elif zlib and 'deflate' in http_headers.get('content-encoding', ''): try: data = zlib.decompress(data) except zlib.error, e: try: # The data may have no headers and no checksum. data = zlib.decompress(data, -15) except zlib.error, e: result['bozo'] = 1 result['bozo_exception'] = e # save HTTP headers if http_headers: if 'etag' in http_headers: etag = http_headers.get('etag', u'') if not isinstance(etag, unicode): etag = etag.decode('utf-8', 'ignore') if etag: result['etag'] = etag if 'last-modified' in http_headers: modified = http_headers.get('last-modified', u'') if modified: result['modified'] = modified result['modified_parsed'] = _parse_date(modified) if hasattr(f, 'url'): if not isinstance(f.url, unicode): result['href'] = f.url.decode('utf-8', 'ignore') else: result['href'] = f.url result['status'] = 200 if hasattr(f, 'status'): result['status'] = f.status if hasattr(f, 'close'): f.close() if data is None: return result # Stop processing if the server sent HTTP 304 Not Modified. if getattr(f, 'code', 0) == 304: result['version'] = u'' result['debug_message'] = 'The feed has not changed since you last checked, ' + \ 'so the server sent no data. This is a feature, not a bug!' return result data, result['encoding'], error = convert_to_utf8(http_headers, data) use_strict_parser = result['encoding'] and True or False if error is not None: result['bozo'] = 1 result['bozo_exception'] = error result['version'], data, entities = replace_doctype(data) # Ensure that baseuri is an absolute URI using an acceptable URI scheme. contentloc = http_headers.get('content-location', u'') href = result.get('href', u'') baseuri = _makeSafeAbsoluteURI(href, contentloc) or _makeSafeAbsoluteURI(contentloc) or href baselang = http_headers.get('content-language', None) if not isinstance(baselang, unicode) and baselang is not None: baselang = baselang.decode('utf-8', 'ignore') if not _XML_AVAILABLE: use_strict_parser = 0 if use_strict_parser: # initialize the SAX parser feedparser = _StrictFeedParser(baseuri, baselang, 'utf-8') saxparser = xml.sax.make_parser(PREFERRED_XML_PARSERS) saxparser.setFeature(xml.sax.handler.feature_namespaces, 1) try: # disable downloading external doctype references, if possible saxparser.setFeature(xml.sax.handler.feature_external_ges, 0) except xml.sax.SAXNotSupportedException: pass saxparser.setContentHandler(feedparser) saxparser.setErrorHandler(feedparser) source = xml.sax.xmlreader.InputSource() source.setByteStream(_StringIO(data)) try: saxparser.parse(source) except xml.sax.SAXException, e: result['bozo'] = 1 result['bozo_exception'] = feedparser.exc or e use_strict_parser = 0 if not use_strict_parser and _SGML_AVAILABLE: feedparser = _LooseFeedParser(baseuri, baselang, 'utf-8', entities) feedparser.feed(data.decode('utf-8', 'replace')) result['feed'] = feedparser.feeddata result['entries'] = feedparser.entries result['version'] = result['version'] or feedparser.version result['namespaces'] = feedparser.namespacesInUse return result web2py-2.12.3.orig/gluon/contrib/ordereddict.py0000664000000000000000000000777612564727262020132 0ustar rootroot# Copyright (c) 2009 Raymond Hettinger # # Permission is hereby granted, free of charge, to any person # obtaining a copy of this software and associated documentation files # (the "Software"), to deal in the Software without restriction, # including without limitation the rights to use, copy, modify, merge, # publish, distribute, sublicense, and/or sell copies of the Software, # and to permit persons to whom the Software is furnished to do so, # subject to the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES # OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR # OTHER DEALINGS IN THE SOFTWARE. from UserDict import DictMixin class OrderedDict(dict, DictMixin): def __init__(self, *args, **kwds): if len(args) > 1: raise TypeError('expected at most 1 arguments, got %d' % len(args)) try: self.__end except AttributeError: self.clear() self.update(*args, **kwds) def clear(self): self.__end = end = [] end += [None, end, end] # sentinel node for doubly linked list self.__map = {} # key --> [key, prev, next] dict.clear(self) def __setitem__(self, key, value): if key not in self: end = self.__end curr = end[1] curr[2] = end[1] = self.__map[key] = [key, curr, end] dict.__setitem__(self, key, value) def __delitem__(self, key): dict.__delitem__(self, key) key, prev, next = self.__map.pop(key) prev[2] = next next[1] = prev def __iter__(self): end = self.__end curr = end[2] while curr is not end: yield curr[0] curr = curr[2] def __reversed__(self): end = self.__end curr = end[1] while curr is not end: yield curr[0] curr = curr[1] def popitem(self, last=True): if not self: raise KeyError('dictionary is empty') if last: key = reversed(self).next() else: key = iter(self).next() value = self.pop(key) return key, value def __reduce__(self): items = [[k, self[k]] for k in self] tmp = self.__map, self.__end del self.__map, self.__end inst_dict = vars(self).copy() self.__map, self.__end = tmp if inst_dict: return (self.__class__, (items,), inst_dict) return self.__class__, (items,) def keys(self): return list(self) setdefault = DictMixin.setdefault update = DictMixin.update pop = DictMixin.pop values = DictMixin.values items = DictMixin.items iterkeys = DictMixin.iterkeys itervalues = DictMixin.itervalues iteritems = DictMixin.iteritems def __repr__(self): if not self: return '%s()' % (self.__class__.__name__,) return '%s(%r)' % (self.__class__.__name__, self.items()) def copy(self): return self.__class__(self) @classmethod def fromkeys(cls, iterable, value=None): d = cls() for key in iterable: d[key] = value return d def __eq__(self, other): if isinstance(other, OrderedDict): if len(self) != len(other): return False for p, q in zip(self.items(), other.items()): if p != q: return False return True return dict.__eq__(self, other) def __ne__(self, other): return not self == other web2py-2.12.3.orig/gluon/contrib/aes.py0000664000000000000000000004043712564727262016401 0ustar rootroot"""Simple AES cipher implementation in pure Python following PEP-272 API Homepage: https://bitbucket.org/intgr/pyaes/ The goal of this module is to be as fast as reasonable in Python while still being Pythonic and readable/understandable. It is licensed under the permissive MIT license. Hopefully the code is readable and commented enough that it can serve as an introduction to the AES cipher for Python coders. In fact, it should go along well with the Stick Figure Guide to AES: http://www.moserware.com/2009/09/stick-figure-guide-to-advanced.html Contrary to intuition, this implementation numbers the 4x4 matrices from top to bottom for efficiency reasons:: 0 4 8 12 1 5 9 13 2 6 10 14 3 7 11 15 Effectively it's the transposition of what you'd expect. This actually makes the code simpler -- except the ShiftRows step, but hopefully the explanation there clears it up. """ #### # Copyright (c) 2010 Marti Raudsepp # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. #### from array import array # Globals mandated by PEP 272: # http://www.python.org/dev/peps/pep-0272/ MODE_ECB = 1 MODE_CBC = 2 #MODE_CTR = 6 block_size = 16 key_size = None def new(key, mode=MODE_CBC, IV=None): if mode == MODE_ECB: return ECBMode(AES(key)) elif mode == MODE_CBC: if IV is None: raise ValueError("CBC mode needs an IV value!") return CBCMode(AES(key), IV) else: raise NotImplementedError #### AES cipher implementation class AES(object): block_size = 16 def __init__(self, key): self.setkey(key) def setkey(self, key): """Sets the key and performs key expansion.""" self.key = key self.key_size = len(key) if self.key_size == 16: self.rounds = 10 elif self.key_size == 24: self.rounds = 12 elif self.key_size == 32: self.rounds = 14 else: raise ValueError("Key length must be 16, 24 or 32 bytes") self.expand_key() def expand_key(self): """Performs AES key expansion on self.key and stores in self.exkey""" # The key schedule specifies how parts of the key are fed into the # cipher's round functions. "Key expansion" means performing this # schedule in advance. Almost all implementations do this. # # Here's a description of AES key schedule: # http://en.wikipedia.org/wiki/Rijndael_key_schedule # The expanded key starts with the actual key itself exkey = array('B', self.key) # extra key expansion steps if self.key_size == 16: extra_cnt = 0 elif self.key_size == 24: extra_cnt = 2 else: extra_cnt = 3 # 4-byte temporary variable for key expansion word = exkey[-4:] # Each expansion cycle uses 'i' once for Rcon table lookup for i in xrange(1, 11): #### key schedule core: # left-rotate by 1 byte word = word[1:4] + word[0:1] # apply S-box to all bytes for j in xrange(4): word[j] = aes_sbox[word[j]] # apply the Rcon table to the leftmost byte word[0] = word[0] ^ aes_Rcon[i] #### end key schedule core for z in xrange(4): for j in xrange(4): # mix in bytes from the last subkey word[j] ^= exkey[-self.key_size + j] exkey.extend(word) # Last key expansion cycle always finishes here if len(exkey) >= (self.rounds+1) * self.block_size: break # Special substitution step for 256-bit key if self.key_size == 32: for j in xrange(4): # mix in bytes from the last subkey XORed with S-box of # current word bytes word[j] = aes_sbox[word[j]] ^ exkey[-self.key_size + j] exkey.extend(word) # Twice for 192-bit key, thrice for 256-bit key for z in xrange(extra_cnt): for j in xrange(4): # mix in bytes from the last subkey word[j] ^= exkey[-self.key_size + j] exkey.extend(word) self.exkey = exkey def add_round_key(self, block, round): """AddRoundKey step in AES. This is where the key is mixed into plaintext""" offset = round * 16 exkey = self.exkey for i in xrange(16): block[i] ^= exkey[offset + i] #print 'AddRoundKey:', block def sub_bytes(self, block, sbox): """SubBytes step, apply S-box to all bytes Depending on whether encrypting or decrypting, a different sbox array is passed in. """ for i in xrange(16): block[i] = sbox[block[i]] #print 'SubBytes :', block def shift_rows(self, b): """ShiftRows step. Shifts 2nd row to left by 1, 3rd row by 2, 4th row by 3 Since we're performing this on a transposed matrix, cells are numbered from top to bottom:: 0 4 8 12 -> 0 4 8 12 -- 1st row doesn't change 1 5 9 13 -> 5 9 13 1 -- row shifted to left by 1 (wraps around) 2 6 10 14 -> 10 14 2 6 -- shifted by 2 3 7 11 15 -> 15 3 7 11 -- shifted by 3 """ b[1], b[5], b[ 9], b[13] = b[ 5], b[ 9], b[13], b[ 1] b[2], b[6], b[10], b[14] = b[10], b[14], b[ 2], b[ 6] b[3], b[7], b[11], b[15] = b[15], b[ 3], b[ 7], b[11] #print 'ShiftRows :', b def shift_rows_inv(self, b): """Similar to shift_rows above, but performed in inverse for decryption.""" b[ 5], b[ 9], b[13], b[ 1] = b[1], b[5], b[ 9], b[13] b[10], b[14], b[ 2], b[ 6] = b[2], b[6], b[10], b[14] b[15], b[ 3], b[ 7], b[11] = b[3], b[7], b[11], b[15] #print 'ShiftRows :', b def mix_columns(self, block): """MixColumns step. Mixes the values in each column""" # Cache global multiplication tables (see below) mul_by_2 = gf_mul_by_2 mul_by_3 = gf_mul_by_3 # Since we're dealing with a transposed matrix, columns are already # sequential for i in xrange(4): col = i * 4 #v0, v1, v2, v3 = block[col : col+4] v0, v1, v2, v3 = (block[col], block[col + 1], block[col + 2], block[col + 3]) block[col ] = mul_by_2[v0] ^ v3 ^ v2 ^ mul_by_3[v1] block[col+1] = mul_by_2[v1] ^ v0 ^ v3 ^ mul_by_3[v2] block[col+2] = mul_by_2[v2] ^ v1 ^ v0 ^ mul_by_3[v3] block[col+3] = mul_by_2[v3] ^ v2 ^ v1 ^ mul_by_3[v0] #print 'MixColumns :', block def mix_columns_inv(self, block): """Similar to mix_columns above, but performed in inverse for decryption.""" # Cache global multiplication tables (see below) mul_9 = gf_mul_by_9 mul_11 = gf_mul_by_11 mul_13 = gf_mul_by_13 mul_14 = gf_mul_by_14 # Since we're dealing with a transposed matrix, columns are already # sequential for i in xrange(4): col = i * 4 v0, v1, v2, v3 = (block[col], block[col + 1], block[col + 2], block[col + 3]) #v0, v1, v2, v3 = block[col:col+4] block[col ] = mul_14[v0] ^ mul_9[v3] ^ mul_13[v2] ^ mul_11[v1] block[col+1] = mul_14[v1] ^ mul_9[v0] ^ mul_13[v3] ^ mul_11[v2] block[col+2] = mul_14[v2] ^ mul_9[v1] ^ mul_13[v0] ^ mul_11[v3] block[col+3] = mul_14[v3] ^ mul_9[v2] ^ mul_13[v1] ^ mul_11[v0] #print 'MixColumns :', block def encrypt_block(self, block): """Encrypts a single block. This is the main AES function""" # For efficiency reasons, the state between steps is transmitted via a # mutable array, not returned. self.add_round_key(block, 0) for round in xrange(1, self.rounds): self.sub_bytes(block, aes_sbox) self.shift_rows(block) self.mix_columns(block) self.add_round_key(block, round) self.sub_bytes(block, aes_sbox) self.shift_rows(block) # no mix_columns step in the last round self.add_round_key(block, self.rounds) def decrypt_block(self, block): """Decrypts a single block. This is the main AES decryption function""" # For efficiency reasons, the state between steps is transmitted via a # mutable array, not returned. self.add_round_key(block, self.rounds) # count rounds down from 15 ... 1 for round in xrange(self.rounds-1, 0, -1): self.shift_rows_inv(block) self.sub_bytes(block, aes_inv_sbox) self.add_round_key(block, round) self.mix_columns_inv(block) self.shift_rows_inv(block) self.sub_bytes(block, aes_inv_sbox) self.add_round_key(block, 0) # no mix_columns step in the last round #### ECB mode implementation class ECBMode(object): """Electronic CodeBook (ECB) mode encryption. Basically this mode applies the cipher function to each block individually; no feedback is done. NB! This is insecure for almost all purposes """ def __init__(self, cipher): self.cipher = cipher self.block_size = cipher.block_size def ecb(self, data, block_func): """Perform ECB mode with the given function""" if len(data) % self.block_size != 0: raise ValueError("Plaintext length must be multiple of 16") block_size = self.block_size data = array('B', data) for offset in xrange(0, len(data), block_size): block = data[offset : offset+block_size] block_func(block) data[offset : offset+block_size] = block return data.tostring() def encrypt(self, data): """Encrypt data in ECB mode""" return self.ecb(data, self.cipher.encrypt_block) def decrypt(self, data): """Decrypt data in ECB mode""" return self.ecb(data, self.cipher.decrypt_block) #### CBC mode class CBCMode(object): """Cipher Block Chaining (CBC) mode encryption. This mode avoids content leaks. In CBC encryption, each plaintext block is XORed with the ciphertext block preceding it; decryption is simply the inverse. """ # A better explanation of CBC can be found here: # http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 def __init__(self, cipher, IV): self.cipher = cipher self.block_size = cipher.block_size self.IV = array('B', IV) def encrypt(self, data): """Encrypt data in CBC mode""" block_size = self.block_size if len(data) % block_size != 0: raise ValueError("Plaintext length must be multiple of 16") data = array('B', data) IV = self.IV for offset in xrange(0, len(data), block_size): block = data[offset : offset+block_size] # Perform CBC chaining for i in xrange(block_size): block[i] ^= IV[i] self.cipher.encrypt_block(block) data[offset : offset+block_size] = block IV = block self.IV = IV return data.tostring() def decrypt(self, data): """Decrypt data in CBC mode""" block_size = self.block_size if len(data) % block_size != 0: raise ValueError("Ciphertext length must be multiple of 16") data = array('B', data) IV = self.IV for offset in xrange(0, len(data), block_size): ctext = data[offset : offset+block_size] block = ctext[:] self.cipher.decrypt_block(block) # Perform CBC chaining #for i in xrange(block_size): # data[offset + i] ^= IV[i] for i in xrange(block_size): block[i] ^= IV[i] data[offset : offset+block_size] = block IV = ctext #data[offset : offset+block_size] = block self.IV = IV return data.tostring() #### def galois_multiply(a, b): """Galois Field multiplicaiton for AES""" p = 0 while b: if b & 1: p ^= a a <<= 1 if a & 0x100: a ^= 0x1b b >>= 1 return p & 0xff # Precompute the multiplication tables for encryption gf_mul_by_2 = array('B', [galois_multiply(x, 2) for x in range(256)]) gf_mul_by_3 = array('B', [galois_multiply(x, 3) for x in range(256)]) # ... for decryption gf_mul_by_9 = array('B', [galois_multiply(x, 9) for x in range(256)]) gf_mul_by_11 = array('B', [galois_multiply(x, 11) for x in range(256)]) gf_mul_by_13 = array('B', [galois_multiply(x, 13) for x in range(256)]) gf_mul_by_14 = array('B', [galois_multiply(x, 14) for x in range(256)]) #### # The S-box is a 256-element array, that maps a single byte value to another # byte value. Since it's designed to be reversible, each value occurs only once # in the S-box # # More information: http://en.wikipedia.org/wiki/Rijndael_S-box aes_sbox = array('B', '637c777bf26b6fc53001672bfed7ab76' 'ca82c97dfa5947f0add4a2af9ca472c0' 'b7fd9326363ff7cc34a5e5f171d83115' '04c723c31896059a071280e2eb27b275' '09832c1a1b6e5aa0523bd6b329e32f84' '53d100ed20fcb15b6acbbe394a4c58cf' 'd0efaafb434d338545f9027f503c9fa8' '51a3408f929d38f5bcb6da2110fff3d2' 'cd0c13ec5f974417c4a77e3d645d1973' '60814fdc222a908846eeb814de5e0bdb' 'e0323a0a4906245cc2d3ac629195e479' 'e7c8376d8dd54ea96c56f4ea657aae08' 'ba78252e1ca6b4c6e8dd741f4bbd8b8a' '703eb5664803f60e613557b986c11d9e' 'e1f8981169d98e949b1e87e9ce5528df' '8ca1890dbfe6426841992d0fb054bb16'.decode('hex') ) # This is the inverse of the above. In other words: # aes_inv_sbox[aes_sbox[val]] == val aes_inv_sbox = array('B', '52096ad53036a538bf40a39e81f3d7fb' '7ce339829b2fff87348e4344c4dee9cb' '547b9432a6c2233dee4c950b42fac34e' '082ea16628d924b2765ba2496d8bd125' '72f8f66486689816d4a45ccc5d65b692' '6c704850fdedb9da5e154657a78d9d84' '90d8ab008cbcd30af7e45805b8b34506' 'd02c1e8fca3f0f02c1afbd0301138a6b' '3a9111414f67dcea97f2cfcef0b4e673' '96ac7422e7ad3585e2f937e81c75df6e' '47f11a711d29c5896fb7620eaa18be1b' 'fc563e4bc6d279209adbc0fe78cd5af4' '1fdda8338807c731b11210592780ec5f' '60517fa919b54a0d2de57a9f93c99cef' 'a0e03b4dae2af5b0c8ebbb3c83539961' '172b047eba77d626e169146355210c7d'.decode('hex') ) # The Rcon table is used in AES's key schedule (key expansion) # It's a pre-computed table of exponentation of 2 in AES's finite field # # More information: http://en.wikipedia.org/wiki/Rijndael_key_schedule aes_Rcon = array('B', '8d01020408102040801b366cd8ab4d9a' '2f5ebc63c697356ad4b37dfaefc59139' '72e4d3bd61c29f254a943366cc831d3a' '74e8cb8d01020408102040801b366cd8' 'ab4d9a2f5ebc63c697356ad4b37dfaef' 'c5913972e4d3bd61c29f254a943366cc' '831d3a74e8cb8d01020408102040801b' '366cd8ab4d9a2f5ebc63c697356ad4b3' '7dfaefc5913972e4d3bd61c29f254a94' '3366cc831d3a74e8cb8d010204081020' '40801b366cd8ab4d9a2f5ebc63c69735' '6ad4b37dfaefc5913972e4d3bd61c29f' '254a943366cc831d3a74e8cb8d010204' '08102040801b366cd8ab4d9a2f5ebc63' 'c697356ad4b37dfaefc5913972e4d3bd' '61c29f254a943366cc831d3a74e8cb'.decode('hex') ) web2py-2.12.3.orig/gluon/contrib/markdown/0000775000000000000000000000000012564727262017071 5ustar rootrootweb2py-2.12.3.orig/gluon/contrib/markdown/LICENSE0000664000000000000000000000005312564727262020074 0ustar rootrootmarkdown2.py is released under MIT license.web2py-2.12.3.orig/gluon/contrib/markdown/__init__.py0000664000000000000000000000103012564727262021174 0ustar rootrootfrom markdown2 import * from gluon.html import XML def WIKI(text, encoding="utf8", safe_mode='escape', html4tags=False, **attributes): if not text: test = '' if attributes.has_key('extras'): extras = attributes['extras'] del attributes['extras'] else: extras=None text = text.decode(encoding,'replace') return XML(markdown(text,extras=extras, safe_mode=safe_mode, html4tags=html4tags)\ .encode(encoding,'xmlcharrefreplace'),**attributes) web2py-2.12.3.orig/gluon/contrib/markdown/markdown2.py0000664000000000000000000027067112564727262021364 0ustar rootroot#!/usr/bin/env python # Copyright (c) 2012 Trent Mick. # Copyright (c) 2007-2008 ActiveState Corp. # License: MIT (http://www.opensource.org/licenses/mit-license.php) from __future__ import generators r"""A fast and complete Python implementation of Markdown. [from http://daringfireball.net/projects/markdown/] > Markdown is a text-to-HTML filter; it translates an easy-to-read / > easy-to-write structured text format into HTML. Markdown's text > format is most similar to that of plain text email, and supports > features such as headers, *emphasis*, code blocks, blockquotes, and > links. > > Markdown's syntax is designed not as a generic markup language, but > specifically to serve as a front-end to (X)HTML. You can use span-level > HTML tags anywhere in a Markdown document, and you can use block level > HTML tags (like
and as well). Module usage: >>> import markdown2 >>> markdown2.markdown("*boo!*") # or use `html = markdown_path(PATH)` u'

boo!

\n' >>> markdowner = Markdown() >>> markdowner.convert("*boo!*") u'

boo!

\n' >>> markdowner.convert("**boom!**") u'

boom!

\n' This implementation of Markdown implements the full "core" syntax plus a number of extras (e.g., code syntax coloring, footnotes) as described on . """ cmdln_desc = """A fast and complete Python implementation of Markdown, a text-to-HTML conversion tool for web writers. Supported extra syntax options (see -x|--extras option below and see for details): * code-friendly: Disable _ and __ for em and strong. * cuddled-lists: Allow lists to be cuddled to the preceding paragraph. * fenced-code-blocks: Allows a code block to not have to be indented by fencing it with '```' on a line before and after. Based on with support for syntax highlighting. * footnotes: Support footnotes as in use on daringfireball.net and implemented in other Markdown processors (tho not in Markdown.pl v1.0.1). * header-ids: Adds "id" attributes to headers. The id value is a slug of the header text. * html-classes: Takes a dict mapping html tag names (lowercase) to a string to use for a "class" tag attribute. Currently only supports "pre" and "code" tags. Add an issue if you require this for other tags. * markdown-in-html: Allow the use of `markdown="1"` in a block HTML tag to have markdown processing be done on its contents. Similar to but with some limitations. * metadata: Extract metadata from a leading '---'-fenced block. See for details. * nofollow: Add `rel="nofollow"` to add `` tags with an href. See . * pyshell: Treats unindented Python interactive shell sessions as blocks. * link-patterns: Auto-link given regex patterns in text (e.g. bug number references, revision number references). * smarty-pants: Replaces ' and " with curly quotation marks or curly apostrophes. Replaces --, ---, ..., and . . . with en dashes, em dashes, and ellipses. * toc: The returned HTML string gets a new "toc_html" attribute which is a Table of Contents for the document. (experimental) * xml: Passes one-liner processing instructions and namespaced XML tags. * wiki-tables: Google Code Wiki-style tables. See . """ # Dev Notes: # - Python's regex syntax doesn't have '\z', so I'm using '\Z'. I'm # not yet sure if there implications with this. Compare 'pydoc sre' # and 'perldoc perlre'. __version_info__ = (2, 2, 4) __version__ = '.'.join(map(str, __version_info__)) __author__ = "Trent Mick" import os import sys from pprint import pprint import re import logging try: from hashlib import md5 except ImportError: from md5 import md5 import optparse from random import random, randint import codecs #---- Python version compat try: from urllib.parse import quote # python3 except ImportError: from urllib import quote # python2 if sys.version_info[:2] < (2,4): from sets import Set as set def reversed(sequence): for i in sequence[::-1]: yield i # Use `bytes` for byte strings and `unicode` for unicode strings (str in Py3). if sys.version_info[0] <= 2: py3 = False try: bytes except NameError: bytes = str base_string_type = basestring elif sys.version_info[0] >= 3: py3 = True unicode = str base_string_type = str #---- globals DEBUG = False log = logging.getLogger("markdown") DEFAULT_TAB_WIDTH = 4 SECRET_SALT = bytes(randint(0, 1000000)) def _hash_text(s): return 'md5-' + md5(SECRET_SALT + s.encode("utf-8")).hexdigest() # Table of hash values for escaped characters: g_escape_table = dict([(ch, _hash_text(ch)) for ch in '\\`*_{}[]()>#+-.!']) #---- exceptions class MarkdownError(Exception): pass #---- public api def markdown_path(path, encoding="utf-8", html4tags=False, tab_width=DEFAULT_TAB_WIDTH, safe_mode=None, extras=None, link_patterns=None, use_file_vars=False): fp = codecs.open(path, 'r', encoding) text = fp.read() fp.close() return Markdown(html4tags=html4tags, tab_width=tab_width, safe_mode=safe_mode, extras=extras, link_patterns=link_patterns, use_file_vars=use_file_vars).convert(text) def markdown(text, html4tags=False, tab_width=DEFAULT_TAB_WIDTH, safe_mode=None, extras=None, link_patterns=None, use_file_vars=False): return Markdown(html4tags=html4tags, tab_width=tab_width, safe_mode=safe_mode, extras=extras, link_patterns=link_patterns, use_file_vars=use_file_vars).convert(text) class Markdown(object): # The dict of "extras" to enable in processing -- a mapping of # extra name to argument for the extra. Most extras do not have an # argument, in which case the value is None. # # This can be set via (a) subclassing and (b) the constructor # "extras" argument. extras = None urls = None titles = None html_blocks = None html_spans = None html_removed_text = "[HTML_REMOVED]" # for compat with markdown.py # Used to track when we're inside an ordered or unordered list # (see _ProcessListItems() for details): list_level = 0 _ws_only_line_re = re.compile(r"^[ \t]+$", re.M) def __init__(self, html4tags=False, tab_width=4, safe_mode=None, extras=None, link_patterns=None, use_file_vars=False): if html4tags: self.empty_element_suffix = ">" else: self.empty_element_suffix = " />" self.tab_width = tab_width # For compatibility with earlier markdown2.py and with # markdown.py's safe_mode being a boolean, # safe_mode == True -> "replace" if safe_mode is True: self.safe_mode = "replace" else: self.safe_mode = safe_mode # Massaging and building the "extras" info. if self.extras is None: self.extras = {} elif not isinstance(self.extras, dict): self.extras = dict([(e, None) for e in self.extras]) if extras: if not isinstance(extras, dict): extras = dict([(e, None) for e in extras]) self.extras.update(extras) assert isinstance(self.extras, dict) if "toc" in self.extras and not "header-ids" in self.extras: self.extras["header-ids"] = None # "toc" implies "header-ids" self._instance_extras = self.extras.copy() self.link_patterns = link_patterns self.use_file_vars = use_file_vars self._outdent_re = re.compile(r'^(\t|[ ]{1,%d})' % tab_width, re.M) self._escape_table = g_escape_table.copy() if "smarty-pants" in self.extras: self._escape_table['"'] = _hash_text('"') self._escape_table["'"] = _hash_text("'") def reset(self): self.urls = {} self.titles = {} self.html_blocks = {} self.html_spans = {} self.list_level = 0 self.extras = self._instance_extras.copy() if "footnotes" in self.extras: self.footnotes = {} self.footnote_ids = [] if "header-ids" in self.extras: self._count_from_header_id = {} # no `defaultdict` in Python 2.4 if "metadata" in self.extras: self.metadata = {} # Per "rel" # should only be used in tags with an "href" attribute. _a_nofollow = re.compile(r"<(a)([^>]*href=)", re.IGNORECASE) def convert(self, text): """Convert the given text.""" # Main function. The order in which other subs are called here is # essential. Link and image substitutions need to happen before # _EscapeSpecialChars(), so that any *'s or _'s in the # and tags get encoded. # Clear the global hashes. If we don't clear these, you get conflicts # from other articles when generating a page which contains more than # one article (e.g. an index page that shows the N most recent # articles): self.reset() if not isinstance(text, unicode): #TODO: perhaps shouldn't presume UTF-8 for string input? text = unicode(text, 'utf-8') if self.use_file_vars: # Look for emacs-style file variable hints. emacs_vars = self._get_emacs_vars(text) if "markdown-extras" in emacs_vars: splitter = re.compile("[ ,]+") for e in splitter.split(emacs_vars["markdown-extras"]): if '=' in e: ename, earg = e.split('=', 1) try: earg = int(earg) except ValueError: pass else: ename, earg = e, None self.extras[ename] = earg # Standardize line endings: text = re.sub("\r\n|\r", "\n", text) # Make sure $text ends with a couple of newlines: text += "\n\n" # Convert all tabs to spaces. text = self._detab(text) # Strip any lines consisting only of spaces and tabs. # This makes subsequent regexen easier to write, because we can # match consecutive blank lines with /\n+/ instead of something # contorted like /[ \t]*\n+/ . text = self._ws_only_line_re.sub("", text) # strip metadata from head and extract if "metadata" in self.extras: text = self._extract_metadata(text) text = self.preprocess(text) if "fenced-code-blocks" in self.extras and not self.safe_mode: text = self._do_fenced_code_blocks(text) if self.safe_mode: text = self._hash_html_spans(text) # Turn block-level HTML blocks into hash entries text = self._hash_html_blocks(text, raw=True) if "fenced-code-blocks" in self.extras and self.safe_mode: text = self._do_fenced_code_blocks(text) # Strip link definitions, store in hashes. if "footnotes" in self.extras: # Must do footnotes first because an unlucky footnote defn # looks like a link defn: # [^4]: this "looks like a link defn" text = self._strip_footnote_definitions(text) text = self._strip_link_definitions(text) text = self._run_block_gamut(text) if "footnotes" in self.extras: text = self._add_footnotes(text) text = self.postprocess(text) text = self._unescape_special_chars(text) if self.safe_mode: text = self._unhash_html_spans(text) if "nofollow" in self.extras: text = self._a_nofollow.sub(r'<\1 rel="nofollow"\2', text) text += "\n" rv = UnicodeWithAttrs(text) if "toc" in self.extras: rv._toc = self._toc if "metadata" in self.extras: rv.metadata = self.metadata return rv def postprocess(self, text): """A hook for subclasses to do some postprocessing of the html, if desired. This is called before unescaping of special chars and unhashing of raw HTML spans. """ return text def preprocess(self, text): """A hook for subclasses to do some preprocessing of the Markdown, if desired. This is called after basic formatting of the text, but prior to any extras, safe mode, etc. processing. """ return text # Is metadata if the content starts with '---'-fenced `key: value` # pairs. E.g. (indented for presentation): # --- # foo: bar # another-var: blah blah # --- _metadata_pat = re.compile("""^---[ \t]*\n((?:[ \t]*[^ \t:]+[ \t]*:[^\n]*\n)+)---[ \t]*\n""") def _extract_metadata(self, text): # fast test if not text.startswith("---"): return text match = self._metadata_pat.match(text) if not match: return text tail = text[len(match.group(0)):] metadata_str = match.group(1).strip() for line in metadata_str.split('\n'): key, value = line.split(':', 1) self.metadata[key.strip()] = value.strip() return tail _emacs_oneliner_vars_pat = re.compile(r"-\*-\s*([^\r\n]*?)\s*-\*-", re.UNICODE) # This regular expression is intended to match blocks like this: # PREFIX Local Variables: SUFFIX # PREFIX mode: Tcl SUFFIX # PREFIX End: SUFFIX # Some notes: # - "[ \t]" is used instead of "\s" to specifically exclude newlines # - "(\r\n|\n|\r)" is used instead of "$" because the sre engine does # not like anything other than Unix-style line terminators. _emacs_local_vars_pat = re.compile(r"""^ (?P(?:[^\r\n|\n|\r])*?) [\ \t]*Local\ Variables:[\ \t]* (?P.*?)(?:\r\n|\n|\r) (?P.*?\1End:) """, re.IGNORECASE | re.MULTILINE | re.DOTALL | re.VERBOSE) def _get_emacs_vars(self, text): """Return a dictionary of emacs-style local variables. Parsing is done loosely according to this spec (and according to some in-practice deviations from this): http://www.gnu.org/software/emacs/manual/html_node/emacs/Specifying-File-Variables.html#Specifying-File-Variables """ emacs_vars = {} SIZE = pow(2, 13) # 8kB # Search near the start for a '-*-'-style one-liner of variables. head = text[:SIZE] if "-*-" in head: match = self._emacs_oneliner_vars_pat.search(head) if match: emacs_vars_str = match.group(1) assert '\n' not in emacs_vars_str emacs_var_strs = [s.strip() for s in emacs_vars_str.split(';') if s.strip()] if len(emacs_var_strs) == 1 and ':' not in emacs_var_strs[0]: # While not in the spec, this form is allowed by emacs: # -*- Tcl -*- # where the implied "variable" is "mode". This form # is only allowed if there are no other variables. emacs_vars["mode"] = emacs_var_strs[0].strip() else: for emacs_var_str in emacs_var_strs: try: variable, value = emacs_var_str.strip().split(':', 1) except ValueError: log.debug("emacs variables error: malformed -*- " "line: %r", emacs_var_str) continue # Lowercase the variable name because Emacs allows "Mode" # or "mode" or "MoDe", etc. emacs_vars[variable.lower()] = value.strip() tail = text[-SIZE:] if "Local Variables" in tail: match = self._emacs_local_vars_pat.search(tail) if match: prefix = match.group("prefix") suffix = match.group("suffix") lines = match.group("content").splitlines(0) #print "prefix=%r, suffix=%r, content=%r, lines: %s"\ # % (prefix, suffix, match.group("content"), lines) # Validate the Local Variables block: proper prefix and suffix # usage. for i, line in enumerate(lines): if not line.startswith(prefix): log.debug("emacs variables error: line '%s' " "does not use proper prefix '%s'" % (line, prefix)) return {} # Don't validate suffix on last line. Emacs doesn't care, # neither should we. if i != len(lines)-1 and not line.endswith(suffix): log.debug("emacs variables error: line '%s' " "does not use proper suffix '%s'" % (line, suffix)) return {} # Parse out one emacs var per line. continued_for = None for line in lines[:-1]: # no var on the last line ("PREFIX End:") if prefix: line = line[len(prefix):] # strip prefix if suffix: line = line[:-len(suffix)] # strip suffix line = line.strip() if continued_for: variable = continued_for if line.endswith('\\'): line = line[:-1].rstrip() else: continued_for = None emacs_vars[variable] += ' ' + line else: try: variable, value = line.split(':', 1) except ValueError: log.debug("local variables error: missing colon " "in local variables entry: '%s'" % line) continue # Do NOT lowercase the variable name, because Emacs only # allows "mode" (and not "Mode", "MoDe", etc.) in this block. value = value.strip() if value.endswith('\\'): value = value[:-1].rstrip() continued_for = variable else: continued_for = None emacs_vars[variable] = value # Unquote values. for var, val in list(emacs_vars.items()): if len(val) > 1 and (val.startswith('"') and val.endswith('"') or val.startswith('"') and val.endswith('"')): emacs_vars[var] = val[1:-1] return emacs_vars # Cribbed from a post by Bart Lateur: # _detab_re = re.compile(r'(.*?)\t', re.M) def _detab_sub(self, match): g1 = match.group(1) return g1 + (' ' * (self.tab_width - len(g1) % self.tab_width)) def _detab(self, text): r"""Remove (leading?) tabs from a file. >>> m = Markdown() >>> m._detab("\tfoo") ' foo' >>> m._detab(" \tfoo") ' foo' >>> m._detab("\t foo") ' foo' >>> m._detab(" foo") ' foo' >>> m._detab(" foo\n\tbar\tblam") ' foo\n bar blam' """ if '\t' not in text: return text return self._detab_re.subn(self._detab_sub, text)[0] # I broke out the html5 tags here and add them to _block_tags_a and # _block_tags_b. This way html5 tags are easy to keep track of. _html5tags = '|article|aside|header|hgroup|footer|nav|section|figure|figcaption' _block_tags_a = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del' _block_tags_a += _html5tags _strict_tag_block_re = re.compile(r""" ( # save in \1 ^ # start of line (with re.M) <(%s) # start tag = \2 \b # word break (.*\n)*? # any number of lines, minimally matching # the matching end tag [ \t]* # trailing spaces/tabs (?=\n+|\Z) # followed by a newline or end of document ) """ % _block_tags_a, re.X | re.M) _block_tags_b = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math' _block_tags_b += _html5tags _liberal_tag_block_re = re.compile(r""" ( # save in \1 ^ # start of line (with re.M) <(%s) # start tag = \2 \b # word break (.*\n)*? # any number of lines, minimally matching .* # the matching end tag [ \t]* # trailing spaces/tabs (?=\n+|\Z) # followed by a newline or end of document ) """ % _block_tags_b, re.X | re.M) _html_markdown_attr_re = re.compile( r'''\s+markdown=("1"|'1')''') def _hash_html_block_sub(self, match, raw=False): html = match.group(1) if raw and self.safe_mode: html = self._sanitize_html(html) elif 'markdown-in-html' in self.extras and 'markdown=' in html: first_line = html.split('\n', 1)[0] m = self._html_markdown_attr_re.search(first_line) if m: lines = html.split('\n') middle = '\n'.join(lines[1:-1]) last_line = lines[-1] first_line = first_line[:m.start()] + first_line[m.end():] f_key = _hash_text(first_line) self.html_blocks[f_key] = first_line l_key = _hash_text(last_line) self.html_blocks[l_key] = last_line return ''.join(["\n\n", f_key, "\n\n", middle, "\n\n", l_key, "\n\n"]) key = _hash_text(html) self.html_blocks[key] = html return "\n\n" + key + "\n\n" def _hash_html_blocks(self, text, raw=False): """Hashify HTML blocks We only want to do this for block-level HTML tags, such as headers, lists, and tables. That's because we still want to wrap

s around "paragraphs" that are wrapped in non-block-level tags, such as anchors, phrase emphasis, and spans. The list of tags we're looking for is hard-coded. @param raw {boolean} indicates if these are raw HTML blocks in the original source. It makes a difference in "safe" mode. """ if '<' not in text: return text # Pass `raw` value into our calls to self._hash_html_block_sub. hash_html_block_sub = _curry(self._hash_html_block_sub, raw=raw) # First, look for nested blocks, e.g.: #

#
# tags for inner block must be indented. #
#
# # The outermost tags must start at the left margin for this to match, and # the inner nested divs must be indented. # We need to do this before the next, more liberal match, because the next # match will start at the first `
` and stop at the first `
`. text = self._strict_tag_block_re.sub(hash_html_block_sub, text) # Now match more liberally, simply from `\n` to `\n` text = self._liberal_tag_block_re.sub(hash_html_block_sub, text) # Special case just for
. It was easier to make a special # case than to make the other regex more complicated. if "", start_idx) + 3 except ValueError: break # Start position for next comment block search. start = end_idx # Validate whitespace before comment. if start_idx: # - Up to `tab_width - 1` spaces before start_idx. for i in range(self.tab_width - 1): if text[start_idx - 1] != ' ': break start_idx -= 1 if start_idx == 0: break # - Must be preceded by 2 newlines or hit the start of # the document. if start_idx == 0: pass elif start_idx == 1 and text[0] == '\n': start_idx = 0 # to match minute detail of Markdown.pl regex elif text[start_idx-2:start_idx] == '\n\n': pass else: break # Validate whitespace after comment. # - Any number of spaces and tabs. while end_idx < len(text): if text[end_idx] not in ' \t': break end_idx += 1 # - Must be following by 2 newlines or hit end of text. if text[end_idx:end_idx+2] not in ('', '\n', '\n\n'): continue # Escape and hash (must match `_hash_html_block_sub`). html = text[start_idx:end_idx] if raw and self.safe_mode: html = self._sanitize_html(html) key = _hash_text(html) self.html_blocks[key] = html text = text[:start_idx] + "\n\n" + key + "\n\n" + text[end_idx:] if "xml" in self.extras: # Treat XML processing instructions and namespaced one-liner # tags as if they were block HTML tags. E.g., if standalone # (i.e. are their own paragraph), the following do not get # wrapped in a

tag: # # # _xml_oneliner_re = _xml_oneliner_re_from_tab_width(self.tab_width) text = _xml_oneliner_re.sub(hash_html_block_sub, text) return text def _strip_link_definitions(self, text): # Strips link definitions from text, stores the URLs and titles in # hash references. less_than_tab = self.tab_width - 1 # Link defs are in the form: # [id]: url "optional title" _link_def_re = re.compile(r""" ^[ ]{0,%d}\[(.+)\]: # id = \1 [ \t]* \n? # maybe *one* newline [ \t]* ? # url = \2 [ \t]* (?: \n? # maybe one newline [ \t]* (?<=\s) # lookbehind for whitespace ['"(] ([^\n]*) # title = \3 ['")] [ \t]* )? # title is optional (?:\n+|\Z) """ % less_than_tab, re.X | re.M | re.U) return _link_def_re.sub(self._extract_link_def_sub, text) def _extract_link_def_sub(self, match): id, url, title = match.groups() key = id.lower() # Link IDs are case-insensitive self.urls[key] = self._encode_amps_and_angles(url) if title: self.titles[key] = title return "" def _extract_footnote_def_sub(self, match): id, text = match.groups() text = _dedent(text, skip_first_line=not text.startswith('\n')).strip() normed_id = re.sub(r'\W', '-', id) # Ensure footnote text ends with a couple newlines (for some # block gamut matches). self.footnotes[normed_id] = text + "\n\n" return "" def _strip_footnote_definitions(self, text): """A footnote definition looks like this: [^note-id]: Text of the note. May include one or more indented paragraphs. Where, - The 'note-id' can be pretty much anything, though typically it is the number of the footnote. - The first paragraph may start on the next line, like so: [^note-id]: Text of the note. """ less_than_tab = self.tab_width - 1 footnote_def_re = re.compile(r''' ^[ ]{0,%d}\[\^(.+)\]: # id = \1 [ \t]* ( # footnote text = \2 # First line need not start with the spaces. (?:\s*.*\n+) (?: (?:[ ]{%d} | \t) # Subsequent lines must be indented. .*\n+ )* ) # Lookahead for non-space at line-start, or end of doc. (?:(?=^[ ]{0,%d}\S)|\Z) ''' % (less_than_tab, self.tab_width, self.tab_width), re.X | re.M) return footnote_def_re.sub(self._extract_footnote_def_sub, text) _hr_re = re.compile(r'^[ ]{0,3}([-_*][ ]{0,2}){3,}$', re.M) def _run_block_gamut(self, text): # These are all the transformations that form block-level # tags like paragraphs, headers, and list items. if "fenced-code-blocks" in self.extras: text = self._do_fenced_code_blocks(text) text = self._do_headers(text) # Do Horizontal Rules: # On the number of spaces in horizontal rules: The spec is fuzzy: "If # you wish, you may use spaces between the hyphens or asterisks." # Markdown.pl 1.0.1's hr regexes limit the number of spaces between the # hr chars to one or two. We'll reproduce that limit here. hr = "\n tags around block-level tags. text = self._hash_html_blocks(text) text = self._form_paragraphs(text) return text def _pyshell_block_sub(self, match): lines = match.group(0).splitlines(0) _dedentlines(lines) indent = ' ' * self.tab_width s = ('\n' # separate from possible cuddled paragraph + indent + ('\n'+indent).join(lines) + '\n\n') return s def _prepare_pyshell_blocks(self, text): """Ensure that Python interactive shell sessions are put in code blocks -- even if not properly indented. """ if ">>>" not in text: return text less_than_tab = self.tab_width - 1 _pyshell_block_re = re.compile(r""" ^([ ]{0,%d})>>>[ ].*\n # first line ^(\1.*\S+.*\n)* # any number of subsequent lines ^\n # ends with a blank line """ % less_than_tab, re.M | re.X) return _pyshell_block_re.sub(self._pyshell_block_sub, text) def _wiki_table_sub(self, match): ttext = match.group(0).strip() #print 'wiki table: %r' % match.group(0) rows = [] for line in ttext.splitlines(0): line = line.strip()[2:-2].strip() row = [c.strip() for c in re.split(r'(?', '

'] for row in rows: hrow = [''] for cell in row: hrow.append('') hrow.append('') hlines.append(''.join(hrow)) hlines += ['', '
') hrow.append(self._run_span_gamut(cell)) hrow.append('
'] return '\n'.join(hlines) + '\n' def _do_wiki_tables(self, text): # Optimization. if "||" not in text: return text less_than_tab = self.tab_width - 1 wiki_table_re = re.compile(r''' (?:(?<=\n\n)|\A\n?) # leading blank line ^([ ]{0,%d})\|\|.+?\|\|[ ]*\n # first line (^\1\|\|.+?\|\|\n)* # any number of subsequent lines ''' % less_than_tab, re.M | re.X) return wiki_table_re.sub(self._wiki_table_sub, text) def _run_span_gamut(self, text): # These are all the transformations that occur *within* block-level # tags like paragraphs, headers, and list items. text = self._do_code_spans(text) text = self._escape_special_chars(text) # Process anchor and image tags. text = self._do_links(text) # Make links out of things like `` # Must come after _do_links(), because you can use < and > # delimiters in inline links like [this](). text = self._do_auto_links(text) if "link-patterns" in self.extras: text = self._do_link_patterns(text) text = self._encode_amps_and_angles(text) text = self._do_italics_and_bold(text) if "smarty-pants" in self.extras: text = self._do_smart_punctuation(text) # Do hard breaks: if "break-on-newline" in self.extras: text = re.sub(r" *\n", " | # auto-link (e.g., ) <\w+[^>]*> | # comment | <\?.*?\?> # processing instruction ) """, re.X) def _escape_special_chars(self, text): # Python markdown note: the HTML tokenization here differs from # that in Markdown.pl, hence the behaviour for subtle cases can # differ (I believe the tokenizer here does a better job because # it isn't susceptible to unmatched '<' and '>' in HTML tags). # Note, however, that '>' is not allowed in an auto-link URL # here. escaped = [] is_html_markup = False for token in self._sorta_html_tokenize_re.split(text): if is_html_markup: # Within tags/HTML-comments/auto-links, encode * and _ # so they don't conflict with their use in Markdown for # italics and strong. We're replacing each such # character with its corresponding MD5 checksum value; # this is likely overkill, but it should prevent us from # colliding with the escape values by accident. escaped.append(token.replace('*', self._escape_table['*']) .replace('_', self._escape_table['_'])) else: escaped.append(self._encode_backslash_escapes(token)) is_html_markup = not is_html_markup return ''.join(escaped) def _hash_html_spans(self, text): # Used for safe_mode. def _is_auto_link(s): if ':' in s and self._auto_link_re.match(s): return True elif '@' in s and self._auto_email_link_re.match(s): return True return False tokens = [] is_html_markup = False for token in self._sorta_html_tokenize_re.split(text): if is_html_markup and not _is_auto_link(token): sanitized = self._sanitize_html(token) key = _hash_text(sanitized) self.html_spans[key] = sanitized tokens.append(key) else: tokens.append(token) is_html_markup = not is_html_markup return ''.join(tokens) def _unhash_html_spans(self, text): for key, sanitized in list(self.html_spans.items()): text = text.replace(key, sanitized) return text def _sanitize_html(self, s): if self.safe_mode == "replace": return self.html_removed_text elif self.safe_mode == "escape": replacements = [ ('&', '&'), ('<', '<'), ('>', '>'), ] for before, after in replacements: s = s.replace(before, after) return s else: raise MarkdownError("invalid value for 'safe_mode': %r (must be " "'escape' or 'replace')" % self.safe_mode) _inline_link_title = re.compile(r''' ( # \1 [ \t]+ (['"]) # quote char = \2 (?P.*?) \2 )? # title is optional \)$ ''', re.X | re.S) _tail_of_reference_link_re = re.compile(r''' # Match tail of: [text][id] [ ]? # one optional space (?:\n[ ]*)? # one optional newline followed by spaces \[ (?P<id>.*?) \] ''', re.X | re.S) _whitespace = re.compile(r'\s*') _strip_anglebrackets = re.compile(r'<(.*)>.*') def _find_non_whitespace(self, text, start): """Returns the index of the first non-whitespace character in text after (and including) start """ match = self._whitespace.match(text, start) return match.end() def _find_balanced(self, text, start, open_c, close_c): """Returns the index where the open_c and close_c characters balance out - the same number of open_c and close_c are encountered - or the end of string if it's reached before the balance point is found. """ i = start l = len(text) count = 1 while count > 0 and i < l: if text[i] == open_c: count += 1 elif text[i] == close_c: count -= 1 i += 1 return i def _extract_url_and_title(self, text, start): """Extracts the url and (optional) title from the tail of a link""" # text[start] equals the opening parenthesis idx = self._find_non_whitespace(text, start+1) if idx == len(text): return None, None, None end_idx = idx has_anglebrackets = text[idx] == "<" if has_anglebrackets: end_idx = self._find_balanced(text, end_idx+1, "<", ">") end_idx = self._find_balanced(text, end_idx, "(", ")") match = self._inline_link_title.search(text, idx, end_idx) if not match: return None, None, None url, title = text[idx:match.start()], match.group("title") if has_anglebrackets: url = self._strip_anglebrackets.sub(r'\1', url) return url, title, end_idx def _do_links(self, text): """Turn Markdown link shortcuts into XHTML <a> and <img> tags. This is a combination of Markdown.pl's _DoAnchors() and _DoImages(). They are done together because that simplified the approach. It was necessary to use a different approach than Markdown.pl because of the lack of atomic matching support in Python's regex engine used in $g_nested_brackets. """ MAX_LINK_TEXT_SENTINEL = 3000 # markdown2 issue 24 # `anchor_allowed_pos` is used to support img links inside # anchors, but not anchors inside anchors. An anchor's start # pos must be `>= anchor_allowed_pos`. anchor_allowed_pos = 0 curr_pos = 0 while True: # Handle the next link. # The next '[' is the start of: # - an inline anchor: [text](url "title") # - a reference anchor: [text][id] # - an inline img: ![text](url "title") # - a reference img: ![text][id] # - a footnote ref: [^id] # (Only if 'footnotes' extra enabled) # - a footnote defn: [^id]: ... # (Only if 'footnotes' extra enabled) These have already # been stripped in _strip_footnote_definitions() so no # need to watch for them. # - a link definition: [id]: url "title" # These have already been stripped in # _strip_link_definitions() so no need to watch for them. # - not markup: [...anything else... try: start_idx = text.index('[', curr_pos) except ValueError: break text_length = len(text) # Find the matching closing ']'. # Markdown.pl allows *matching* brackets in link text so we # will here too. Markdown.pl *doesn't* currently allow # matching brackets in img alt text -- we'll differ in that # regard. bracket_depth = 0 for p in range(start_idx+1, min(start_idx+MAX_LINK_TEXT_SENTINEL, text_length)): ch = text[p] if ch == ']': bracket_depth -= 1 if bracket_depth < 0: break elif ch == '[': bracket_depth += 1 else: # Closing bracket not found within sentinel length. # This isn't markup. curr_pos = start_idx + 1 continue link_text = text[start_idx+1:p] # Possibly a footnote ref? if "footnotes" in self.extras and link_text.startswith("^"): normed_id = re.sub(r'\W', '-', link_text[1:]) if normed_id in self.footnotes: self.footnote_ids.append(normed_id) result = '<sup class="footnote-ref" id="fnref-%s">' \ '<a href="#fn-%s">%s</a></sup>' \ % (normed_id, normed_id, len(self.footnote_ids)) text = text[:start_idx] + result + text[p+1:] else: # This id isn't defined, leave the markup alone. curr_pos = p+1 continue # Now determine what this is by the remainder. p += 1 if p == text_length: return text # Inline anchor or img? if text[p] == '(': # attempt at perf improvement url, title, url_end_idx = self._extract_url_and_title(text, p) if url is not None: # Handle an inline anchor or img. is_img = start_idx > 0 and text[start_idx-1] == "!" if is_img: start_idx -= 1 # We've got to encode these to avoid conflicting # with italics/bold. url = url.replace('*', self._escape_table['*']) \ .replace('_', self._escape_table['_']) if title: title_str = ' title="%s"' % ( _xml_escape_attr(title) .replace('*', self._escape_table['*']) .replace('_', self._escape_table['_'])) else: title_str = '' if is_img: img_class_str = self._html_class_str_from_tag("img") result = '<img src="%s" alt="%s"%s%s%s' \ % (url.replace('"', '"'), _xml_escape_attr(link_text), title_str, img_class_str, self.empty_element_suffix) if "smarty-pants" in self.extras: result = result.replace('"', self._escape_table['"']) curr_pos = start_idx + len(result) text = text[:start_idx] + result + text[url_end_idx:] elif start_idx >= anchor_allowed_pos: result_head = '<a href="%s"%s>' % (url, title_str) result = '%s%s</a>' % (result_head, link_text) if "smarty-pants" in self.extras: result = result.replace('"', self._escape_table['"']) # <img> allowed from curr_pos on, <a> from # anchor_allowed_pos on. curr_pos = start_idx + len(result_head) anchor_allowed_pos = start_idx + len(result) text = text[:start_idx] + result + text[url_end_idx:] else: # Anchor not allowed here. curr_pos = start_idx + 1 continue # Reference anchor or img? else: match = self._tail_of_reference_link_re.match(text, p) if match: # Handle a reference-style anchor or img. is_img = start_idx > 0 and text[start_idx-1] == "!" if is_img: start_idx -= 1 link_id = match.group("id").lower() if not link_id: link_id = link_text.lower() # for links like [this][] if link_id in self.urls: url = self.urls[link_id] # We've got to encode these to avoid conflicting # with italics/bold. url = url.replace('*', self._escape_table['*']) \ .replace('_', self._escape_table['_']) title = self.titles.get(link_id) if title: before = title title = _xml_escape_attr(title) \ .replace('*', self._escape_table['*']) \ .replace('_', self._escape_table['_']) title_str = ' title="%s"' % title else: title_str = '' if is_img: img_class_str = self._html_class_str_from_tag("img") result = '<img src="%s" alt="%s"%s%s%s' \ % (url.replace('"', '"'), link_text.replace('"', '"'), title_str, img_class_str, self.empty_element_suffix) if "smarty-pants" in self.extras: result = result.replace('"', self._escape_table['"']) curr_pos = start_idx + len(result) text = text[:start_idx] + result + text[match.end():] elif start_idx >= anchor_allowed_pos: result = '<a href="%s"%s>%s</a>' \ % (url, title_str, link_text) result_head = '<a href="%s"%s>' % (url, title_str) result = '%s%s</a>' % (result_head, link_text) if "smarty-pants" in self.extras: result = result.replace('"', self._escape_table['"']) # <img> allowed from curr_pos on, <a> from # anchor_allowed_pos on. curr_pos = start_idx + len(result_head) anchor_allowed_pos = start_idx + len(result) text = text[:start_idx] + result + text[match.end():] else: # Anchor not allowed here. curr_pos = start_idx + 1 else: # This id isn't defined, leave the markup alone. curr_pos = match.end() continue # Otherwise, it isn't markup. curr_pos = start_idx + 1 return text def header_id_from_text(self, text, prefix, n): """Generate a header id attribute value from the given header HTML content. This is only called if the "header-ids" extra is enabled. Subclasses may override this for different header ids. @param text {str} The text of the header tag @param prefix {str} The requested prefix for header ids. This is the value of the "header-ids" extra key, if any. Otherwise, None. @param n {int} The <hN> tag number, i.e. `1` for an <h1> tag. @returns {str} The value for the header tag's "id" attribute. Return None to not have an id attribute and to exclude this header from the TOC (if the "toc" extra is specified). """ header_id = _slugify(text) if prefix and isinstance(prefix, base_string_type): header_id = prefix + '-' + header_id if header_id in self._count_from_header_id: self._count_from_header_id[header_id] += 1 header_id += '-%s' % self._count_from_header_id[header_id] else: self._count_from_header_id[header_id] = 1 return header_id _toc = None def _toc_add_entry(self, level, id, name): if self._toc is None: self._toc = [] self._toc.append((level, id, self._unescape_special_chars(name))) _h_re_base = r''' (^(.+)[ \t]*\n(=+|-+)[ \t]*\n+) | (^(\#{1,6}) # \1 = string of #'s [ \t]%s (.+?) # \2 = Header text [ \t]* (?<!\\) # ensure not an escaped trailing '#' \#* # optional closing #'s (not counted) \n+ ) ''' _h_re = re.compile(_h_re_base % '*', re.X | re.M) _h_re_tag_friendly = re.compile(_h_re_base % '+', re.X | re.M) def _h_sub(self, match): if match.group(1) is not None: # Setext header n = {"=": 1, "-": 2}[match.group(3)[0]] header_group = match.group(2) else: # atx header n = len(match.group(5)) header_group = match.group(6) demote_headers = self.extras.get("demote-headers") if demote_headers: n = min(n + demote_headers, 6) header_id_attr = "" if "header-ids" in self.extras: header_id = self.header_id_from_text(header_group, self.extras["header-ids"], n) if header_id: header_id_attr = ' id="%s"' % header_id html = self._run_span_gamut(header_group) if "toc" in self.extras and header_id: self._toc_add_entry(n, header_id, html) return "<h%d%s>%s</h%d>\n\n" % (n, header_id_attr, html, n) def _do_headers(self, text): # Setext-style headers: # Header 1 # ======== # # Header 2 # -------- # atx-style headers: # # Header 1 # ## Header 2 # ## Header 2 with closing hashes ## # ... # ###### Header 6 if 'tag-friendly' in self.extras: return self._h_re_tag_friendly.sub(self._h_sub, text) return self._h_re.sub(self._h_sub, text) _marker_ul_chars = '*+-' _marker_any = r'(?:[%s]|\d+\.)' % _marker_ul_chars _marker_ul = '(?:[%s])' % _marker_ul_chars _marker_ol = r'(?:\d+\.)' def _list_sub(self, match): lst = match.group(1) lst_type = match.group(3) in self._marker_ul_chars and "ul" or "ol" result = self._process_list_items(lst) if self.list_level: return "<%s>\n%s</%s>\n" % (lst_type, result, lst_type) else: return "<%s>\n%s</%s>\n\n" % (lst_type, result, lst_type) def _do_lists(self, text): # Form HTML ordered (numbered) and unordered (bulleted) lists. # Iterate over each *non-overlapping* list match. pos = 0 while True: # Find the *first* hit for either list style (ul or ol). We # match ul and ol separately to avoid adjacent lists of different # types running into each other (see issue #16). hits = [] for marker_pat in (self._marker_ul, self._marker_ol): less_than_tab = self.tab_width - 1 whole_list = r''' ( # \1 = whole list ( # \2 [ ]{0,%d} (%s) # \3 = first list item marker [ \t]+ (?!\ *\3\ ) # '- - - ...' isn't a list. See 'not_quite_a_list' test case. ) (?:.+?) ( # \4 \Z | \n{2,} (?=\S) (?! # Negative lookahead for another list item marker [ \t]* %s[ \t]+ ) ) ) ''' % (less_than_tab, marker_pat, marker_pat) if self.list_level: # sub-list list_re = re.compile("^"+whole_list, re.X | re.M | re.S) else: list_re = re.compile(r"(?:(?<=\n\n)|\A\n?)"+whole_list, re.X | re.M | re.S) match = list_re.search(text, pos) if match: hits.append((match.start(), match)) if not hits: break hits.sort() match = hits[0][1] start, end = match.span() middle = self._list_sub(match) text = text[:start] + middle + text[end:] pos = start + len(middle) # start pos for next attempted match return text _list_item_re = re.compile(r''' (\n)? # leading line = \1 (^[ \t]*) # leading whitespace = \2 (?P<marker>%s) [ \t]+ # list marker = \3 ((?:.+?) # list item text = \4 (\n{1,2})) # eols = \5 (?= \n* (\Z | \2 (?P<next_marker>%s) [ \t]+)) ''' % (_marker_any, _marker_any), re.M | re.X | re.S) _last_li_endswith_two_eols = False def _list_item_sub(self, match): item = match.group(4) leading_line = match.group(1) leading_space = match.group(2) if leading_line or "\n\n" in item or self._last_li_endswith_two_eols: item = self._run_block_gamut(self._outdent(item)) else: # Recursion for sub-lists: item = self._do_lists(self._outdent(item)) if item.endswith('\n'): item = item[:-1] item = self._run_span_gamut(item) self._last_li_endswith_two_eols = (len(match.group(5)) == 2) return "<li>%s</li>\n" % item def _process_list_items(self, list_str): # Process the contents of a single ordered or unordered list, # splitting it into individual list items. # The $g_list_level global keeps track of when we're inside a list. # Each time we enter a list, we increment it; when we leave a list, # we decrement. If it's zero, we're not in a list anymore. # # We do this because when we're not inside a list, we want to treat # something like this: # # I recommend upgrading to version # 8. Oops, now this line is treated # as a sub-list. # # As a single paragraph, despite the fact that the second line starts # with a digit-period-space sequence. # # Whereas when we're inside a list (or sub-list), that line will be # treated as the start of a sub-list. What a kludge, huh? This is # an aspect of Markdown's syntax that's hard to parse perfectly # without resorting to mind-reading. Perhaps the solution is to # change the syntax rules such that sub-lists must start with a # starting cardinal number; e.g. "1." or "a.". self.list_level += 1 self._last_li_endswith_two_eols = False list_str = list_str.rstrip('\n') + '\n' list_str = self._list_item_re.sub(self._list_item_sub, list_str) self.list_level -= 1 return list_str def _get_pygments_lexer(self, lexer_name): try: from pygments import lexers, util except ImportError: return None try: return lexers.get_lexer_by_name(lexer_name) except util.ClassNotFound: return None def _color_with_pygments(self, codeblock, lexer, **formatter_opts): import pygments import pygments.formatters class HtmlCodeFormatter(pygments.formatters.HtmlFormatter): def _wrap_code(self, inner): """A function for use in a Pygments Formatter which wraps in <code> tags. """ yield 0, "<code>" for tup in inner: yield tup yield 0, "</code>" def wrap(self, source, outfile): """Return the source with a code, pre, and div.""" return self._wrap_div(self._wrap_pre(self._wrap_code(source))) formatter_opts.setdefault("cssclass", "codehilite") formatter = HtmlCodeFormatter(**formatter_opts) return pygments.highlight(codeblock, lexer, formatter) def _code_block_sub(self, match, is_fenced_code_block=False): lexer_name = None if is_fenced_code_block: lexer_name = match.group(1) if lexer_name: formatter_opts = self.extras['fenced-code-blocks'] or {} codeblock = match.group(2) codeblock = codeblock[:-1] # drop one trailing newline else: codeblock = match.group(1) codeblock = self._outdent(codeblock) codeblock = self._detab(codeblock) codeblock = codeblock.lstrip('\n') # trim leading newlines codeblock = codeblock.rstrip() # trim trailing whitespace # Note: "code-color" extra is DEPRECATED. if "code-color" in self.extras and codeblock.startswith(":::"): lexer_name, rest = codeblock.split('\n', 1) lexer_name = lexer_name[3:].strip() codeblock = rest.lstrip("\n") # Remove lexer declaration line. formatter_opts = self.extras['code-color'] or {} if lexer_name: def unhash_code( codeblock ): for key, sanitized in list(self.html_spans.items()): codeblock = codeblock.replace(key, sanitized) replacements = [ ("&", "&"), ("<", "<"), (">", ">") ] for old, new in replacements: codeblock = codeblock.replace(old, new) return codeblock lexer = self._get_pygments_lexer(lexer_name) if lexer: codeblock = unhash_code( codeblock ) colored = self._color_with_pygments(codeblock, lexer, **formatter_opts) return "\n\n%s\n\n" % colored codeblock = self._encode_code(codeblock) pre_class_str = self._html_class_str_from_tag("pre") code_class_str = self._html_class_str_from_tag("code") return "\n\n<pre%s><code%s>%s\n</code></pre>\n\n" % ( pre_class_str, code_class_str, codeblock) def _html_class_str_from_tag(self, tag): """Get the appropriate ' class="..."' string (note the leading space), if any, for the given tag. """ if "html-classes" not in self.extras: return "" try: html_classes_from_tag = self.extras["html-classes"] except TypeError: return "" else: if tag in html_classes_from_tag: return ' class="%s"' % html_classes_from_tag[tag] return "" def _do_code_blocks(self, text): """Process Markdown `<pre><code>` blocks.""" code_block_re = re.compile(r''' (?:\n\n|\A\n?) ( # $1 = the code block -- one or more lines, starting with a space/tab (?: (?:[ ]{%d} | \t) # Lines must start with a tab or a tab-width of spaces .*\n+ )+ ) ((?=^[ ]{0,%d}\S)|\Z) # Lookahead for non-space at line-start, or end of doc # Lookahead to make sure this block isn't already in a code block. # Needed when syntax highlighting is being used. (?![^<]*\</code\>) ''' % (self.tab_width, self.tab_width), re.M | re.X) return code_block_re.sub(self._code_block_sub, text) _fenced_code_block_re = re.compile(r''' (?:\n\n|\A\n?) ^```([\w+-]+)?[ \t]*\n # opening fence, $1 = optional lang (.*?) # $2 = code block content ^```[ \t]*\n # closing fence ''', re.M | re.X | re.S) def _fenced_code_block_sub(self, match): return self._code_block_sub(match, is_fenced_code_block=True); def _do_fenced_code_blocks(self, text): """Process ```-fenced unindented code blocks ('fenced-code-blocks' extra).""" return self._fenced_code_block_re.sub(self._fenced_code_block_sub, text) # Rules for a code span: # - backslash escapes are not interpreted in a code span # - to include one or or a run of more backticks the delimiters must # be a longer run of backticks # - cannot start or end a code span with a backtick; pad with a # space and that space will be removed in the emitted HTML # See `test/tm-cases/escapes.text` for a number of edge-case # examples. _code_span_re = re.compile(r''' (?<!\\) (`+) # \1 = Opening run of ` (?!`) # See Note A test/tm-cases/escapes.text (.+?) # \2 = The code block (?<!`) \1 # Matching closer (?!`) ''', re.X | re.S) def _code_span_sub(self, match): c = match.group(2).strip(" \t") c = self._encode_code(c) return "<code>%s</code>" % c def _do_code_spans(self, text): # * Backtick quotes are used for <code></code> spans. # # * You can use multiple backticks as the delimiters if you want to # include literal backticks in the code span. So, this input: # # Just type ``foo `bar` baz`` at the prompt. # # Will translate to: # # <p>Just type <code>foo `bar` baz</code> at the prompt.</p> # # There's no arbitrary limit to the number of backticks you # can use as delimters. If you need three consecutive backticks # in your code, use four for delimiters, etc. # # * You can use spaces to get literal backticks at the edges: # # ... type `` `bar` `` ... # # Turns to: # # ... type <code>`bar`</code> ... return self._code_span_re.sub(self._code_span_sub, text) def _encode_code(self, text): """Encode/escape certain characters inside Markdown code runs. The point is that in code, these characters are literals, and lose their special Markdown meanings. """ replacements = [ # Encode all ampersands; HTML entities are not # entities within a Markdown code span. ('&', '&'), # Do the angle bracket song and dance: ('<', '<'), ('>', '>'), ] for before, after in replacements: text = text.replace(before, after) hashed = _hash_text(text) self._escape_table[text] = hashed return hashed _strong_re = re.compile(r"(\*\*|__)(?=\S)(.+?[*_]*)(?<=\S)\1", re.S) _em_re = re.compile(r"(\*|_)(?=\S)(.+?)(?<=\S)\1", re.S) _code_friendly_strong_re = re.compile(r"\*\*(?=\S)(.+?[*_]*)(?<=\S)\*\*", re.S) _code_friendly_em_re = re.compile(r"\*(?=\S)(.+?)(?<=\S)\*", re.S) def _do_italics_and_bold(self, text): # <strong> must go first: if "code-friendly" in self.extras: text = self._code_friendly_strong_re.sub(r"<strong>\1</strong>", text) text = self._code_friendly_em_re.sub(r"<em>\1</em>", text) else: text = self._strong_re.sub(r"<strong>\2</strong>", text) text = self._em_re.sub(r"<em>\2</em>", text) return text # "smarty-pants" extra: Very liberal in interpreting a single prime as an # apostrophe; e.g. ignores the fact that "round", "bout", "twer", and # "twixt" can be written without an initial apostrophe. This is fine because # using scare quotes (single quotation marks) is rare. _apostrophe_year_re = re.compile(r"'(\d\d)(?=(\s|,|;|\.|\?|!|$))") _contractions = ["tis", "twas", "twer", "neath", "o", "n", "round", "bout", "twixt", "nuff", "fraid", "sup"] def _do_smart_contractions(self, text): text = self._apostrophe_year_re.sub(r"’\1", text) for c in self._contractions: text = text.replace("'%s" % c, "’%s" % c) text = text.replace("'%s" % c.capitalize(), "’%s" % c.capitalize()) return text # Substitute double-quotes before single-quotes. _opening_single_quote_re = re.compile(r"(?<!\S)'(?=\S)") _opening_double_quote_re = re.compile(r'(?<!\S)"(?=\S)') _closing_single_quote_re = re.compile(r"(?<=\S)'") _closing_double_quote_re = re.compile(r'(?<=\S)"(?=(\s|,|;|\.|\?|!|$))') def _do_smart_punctuation(self, text): """Fancifies 'single quotes', "double quotes", and apostrophes. Converts --, ---, and ... into en dashes, em dashes, and ellipses. Inspiration is: <http://daringfireball.net/projects/smartypants/> See "test/tm-cases/smarty_pants.text" for a full discussion of the support here and <http://code.google.com/p/python-markdown2/issues/detail?id=42> for a discussion of some diversion from the original SmartyPants. """ if "'" in text: # guard for perf text = self._do_smart_contractions(text) text = self._opening_single_quote_re.sub("‘", text) text = self._closing_single_quote_re.sub("’", text) if '"' in text: # guard for perf text = self._opening_double_quote_re.sub("“", text) text = self._closing_double_quote_re.sub("”", text) text = text.replace("---", "—") text = text.replace("--", "–") text = text.replace("...", "…") text = text.replace(" . . . ", "…") text = text.replace(". . .", "…") return text _block_quote_re = re.compile(r''' ( # Wrap whole match in \1 ( ^[ \t]*>[ \t]? # '>' at the start of a line .+\n # rest of the first line (.+\n)* # subsequent consecutive lines \n* # blanks )+ ) ''', re.M | re.X) _bq_one_level_re = re.compile('^[ \t]*>[ \t]?', re.M); _html_pre_block_re = re.compile(r'(\s*<pre>.+?</pre>)', re.S) def _dedent_two_spaces_sub(self, match): return re.sub(r'(?m)^ ', '', match.group(1)) def _block_quote_sub(self, match): bq = match.group(1) bq = self._bq_one_level_re.sub('', bq) # trim one level of quoting bq = self._ws_only_line_re.sub('', bq) # trim whitespace-only lines bq = self._run_block_gamut(bq) # recurse bq = re.sub('(?m)^', ' ', bq) # These leading spaces screw with <pre> content, so we need to fix that: bq = self._html_pre_block_re.sub(self._dedent_two_spaces_sub, bq) return "<blockquote>\n%s\n</blockquote>\n\n" % bq def _do_block_quotes(self, text): if '>' not in text: return text return self._block_quote_re.sub(self._block_quote_sub, text) def _form_paragraphs(self, text): # Strip leading and trailing lines: text = text.strip('\n') # Wrap <p> tags. grafs = [] for i, graf in enumerate(re.split(r"\n{2,}", text)): if graf in self.html_blocks: # Unhashify HTML blocks grafs.append(self.html_blocks[graf]) else: cuddled_list = None if "cuddled-lists" in self.extras: # Need to put back trailing '\n' for `_list_item_re` # match at the end of the paragraph. li = self._list_item_re.search(graf + '\n') # Two of the same list marker in this paragraph: a likely # candidate for a list cuddled to preceding paragraph # text (issue 33). Note the `[-1]` is a quick way to # consider numeric bullets (e.g. "1." and "2.") to be # equal. if (li and len(li.group(2)) <= 3 and li.group("next_marker") and li.group("marker")[-1] == li.group("next_marker")[-1]): start = li.start() cuddled_list = self._do_lists(graf[start:]).rstrip("\n") assert cuddled_list.startswith("<ul>") or cuddled_list.startswith("<ol>") graf = graf[:start] # Wrap <p> tags. graf = self._run_span_gamut(graf) grafs.append("<p>" + graf.lstrip(" \t") + "</p>") if cuddled_list: grafs.append(cuddled_list) return "\n\n".join(grafs) def _add_footnotes(self, text): if self.footnotes: footer = [ '<div class="footnotes">', '<hr' + self.empty_element_suffix, '<ol>', ] for i, id in enumerate(self.footnote_ids): if i != 0: footer.append('') footer.append('<li id="fn-%s">' % id) footer.append(self._run_block_gamut(self.footnotes[id])) backlink = ('<a href="#fnref-%s" ' 'class="footnoteBackLink" ' 'title="Jump back to footnote %d in the text.">' '↩</a>' % (id, i+1)) if footer[-1].endswith("</p>"): footer[-1] = footer[-1][:-len("</p>")] \ + ' ' + backlink + "</p>" else: footer.append("\n<p>%s</p>" % backlink) footer.append('</li>') footer.append('</ol>') footer.append('</div>') return text + '\n\n' + '\n'.join(footer) else: return text # Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin: # http://bumppo.net/projects/amputator/ _ampersand_re = re.compile(r'&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)') _naked_lt_re = re.compile(r'<(?![a-z/?\$!])', re.I) _naked_gt_re = re.compile(r'''(?<![a-z0-9?!/'"-])>''', re.I) def _encode_amps_and_angles(self, text): # Smart processing for ampersands and angle brackets that need # to be encoded. text = self._ampersand_re.sub('&', text) # Encode naked <'s text = self._naked_lt_re.sub('<', text) # Encode naked >'s # Note: Other markdown implementations (e.g. Markdown.pl, PHP # Markdown) don't do this. text = self._naked_gt_re.sub('>', text) return text def _encode_backslash_escapes(self, text): for ch, escape in list(self._escape_table.items()): text = text.replace("\\"+ch, escape) return text _auto_link_re = re.compile(r'<((https?|ftp):[^\'">\s]+)>', re.I) def _auto_link_sub(self, match): g1 = match.group(1) return '<a href="%s">%s</a>' % (g1, g1) _auto_email_link_re = re.compile(r""" < (?:mailto:)? ( [-.\w]+ \@ [-\w]+(\.[-\w]+)*\.[a-z]+ ) > """, re.I | re.X | re.U) def _auto_email_link_sub(self, match): return self._encode_email_address( self._unescape_special_chars(match.group(1))) def _do_auto_links(self, text): text = self._auto_link_re.sub(self._auto_link_sub, text) text = self._auto_email_link_re.sub(self._auto_email_link_sub, text) return text def _encode_email_address(self, addr): # Input: an email address, e.g. "foo@example.com" # # Output: the email address as a mailto link, with each character # of the address encoded as either a decimal or hex entity, in # the hopes of foiling most address harvesting spam bots. E.g.: # # <a href="mailto:foo@e # xample.com">foo # @example.com</a> # # Based on a filter by Matthew Wickline, posted to the BBEdit-Talk # mailing list: <http://tinyurl.com/yu7ue> chars = [_xml_encode_email_char_at_random(ch) for ch in "mailto:" + addr] # Strip the mailto: from the visible part. addr = '<a href="%s">%s</a>' \ % (''.join(chars), ''.join(chars[7:])) return addr def _do_link_patterns(self, text): """Caveat emptor: there isn't much guarding against link patterns being formed inside other standard Markdown links, e.g. inside a [link def][like this]. Dev Notes: *Could* consider prefixing regexes with a negative lookbehind assertion to attempt to guard against this. """ link_from_hash = {} for regex, repl in self.link_patterns: replacements = [] for match in regex.finditer(text): if hasattr(repl, "__call__"): href = repl(match) else: href = match.expand(repl) replacements.append((match.span(), href)) for (start, end), href in reversed(replacements): escaped_href = ( href.replace('"', '"') # b/c of attr quote # To avoid markdown <em> and <strong>: .replace('*', self._escape_table['*']) .replace('_', self._escape_table['_'])) link = '<a href="%s">%s</a>' % (escaped_href, text[start:end]) hash = _hash_text(link) link_from_hash[hash] = link text = text[:start] + hash + text[end:] for hash, link in list(link_from_hash.items()): text = text.replace(hash, link) return text def _unescape_special_chars(self, text): # Swap back in all the special characters we've hidden. for ch, hash in list(self._escape_table.items()): text = text.replace(hash, ch) return text def _outdent(self, text): # Remove one level of line-leading tabs or spaces return self._outdent_re.sub('', text) class MarkdownWithExtras(Markdown): """A markdowner class that enables most extras: - footnotes - code-color (only has effect if 'pygments' Python module on path) These are not included: - pyshell (specific to Python-related documenting) - code-friendly (because it *disables* part of the syntax) - link-patterns (because you need to specify some actual link-patterns anyway) """ extras = ["footnotes", "code-color"] #---- internal support functions class UnicodeWithAttrs(unicode): """A subclass of unicode used for the return value of conversion to possibly attach some attributes. E.g. the "toc_html" attribute when the "toc" extra is used. """ metadata = None _toc = None def toc_html(self): """Return the HTML for the current TOC. This expects the `_toc` attribute to have been set on this instance. """ if self._toc is None: return None def indent(): return ' ' * (len(h_stack) - 1) lines = [] h_stack = [0] # stack of header-level numbers for level, id, name in self._toc: if level > h_stack[-1]: lines.append("%s<ul>" % indent()) h_stack.append(level) elif level == h_stack[-1]: lines[-1] += "</li>" else: while level < h_stack[-1]: h_stack.pop() if not lines[-1].endswith("</li>"): lines[-1] += "</li>" lines.append("%s</ul></li>" % indent()) lines.append('%s<li><a href="#%s">%s</a>' % ( indent(), id, name)) while len(h_stack) > 1: h_stack.pop() if not lines[-1].endswith("</li>"): lines[-1] += "</li>" lines.append("%s</ul>" % indent()) return '\n'.join(lines) + '\n' toc_html = property(toc_html) ## {{{ http://code.activestate.com/recipes/577257/ (r1) _slugify_strip_re = re.compile(r'[^\w\s-]') _slugify_hyphenate_re = re.compile(r'[-\s]+') def _slugify(value): """ Normalizes string, converts to lowercase, removes non-alpha characters, and converts spaces to hyphens. From Django's "django/template/defaultfilters.py". """ import unicodedata value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore').decode() value = _slugify_strip_re.sub('', value).strip().lower() return _slugify_hyphenate_re.sub('-', value) ## end of http://code.activestate.com/recipes/577257/ }}} # From http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52549 def _curry(*args, **kwargs): function, args = args[0], args[1:] def result(*rest, **kwrest): combined = kwargs.copy() combined.update(kwrest) return function(*args + rest, **combined) return result # Recipe: regex_from_encoded_pattern (1.0) def _regex_from_encoded_pattern(s): """'foo' -> re.compile(re.escape('foo')) '/foo/' -> re.compile('foo') '/foo/i' -> re.compile('foo', re.I) """ if s.startswith('/') and s.rfind('/') != 0: # Parse it: /PATTERN/FLAGS idx = s.rfind('/') pattern, flags_str = s[1:idx], s[idx+1:] flag_from_char = { "i": re.IGNORECASE, "l": re.LOCALE, "s": re.DOTALL, "m": re.MULTILINE, "u": re.UNICODE, } flags = 0 for char in flags_str: try: flags |= flag_from_char[char] except KeyError: raise ValueError("unsupported regex flag: '%s' in '%s' " "(must be one of '%s')" % (char, s, ''.join(list(flag_from_char.keys())))) return re.compile(s[1:idx], flags) else: # not an encoded regex return re.compile(re.escape(s)) # Recipe: dedent (0.1.2) def _dedentlines(lines, tabsize=8, skip_first_line=False): """_dedentlines(lines, tabsize=8, skip_first_line=False) -> dedented lines "lines" is a list of lines to dedent. "tabsize" is the tab width to use for indent width calculations. "skip_first_line" is a boolean indicating if the first line should be skipped for calculating the indent width and for dedenting. This is sometimes useful for docstrings and similar. Same as dedent() except operates on a sequence of lines. Note: the lines list is modified **in-place**. """ DEBUG = False if DEBUG: print("dedent: dedent(..., tabsize=%d, skip_first_line=%r)"\ % (tabsize, skip_first_line)) indents = [] margin = None for i, line in enumerate(lines): if i == 0 and skip_first_line: continue indent = 0 for ch in line: if ch == ' ': indent += 1 elif ch == '\t': indent += tabsize - (indent % tabsize) elif ch in '\r\n': continue # skip all-whitespace lines else: break else: continue # skip all-whitespace lines if DEBUG: print("dedent: indent=%d: %r" % (indent, line)) if margin is None: margin = indent else: margin = min(margin, indent) if DEBUG: print("dedent: margin=%r" % margin) if margin is not None and margin > 0: for i, line in enumerate(lines): if i == 0 and skip_first_line: continue removed = 0 for j, ch in enumerate(line): if ch == ' ': removed += 1 elif ch == '\t': removed += tabsize - (removed % tabsize) elif ch in '\r\n': if DEBUG: print("dedent: %r: EOL -> strip up to EOL" % line) lines[i] = lines[i][j:] break else: raise ValueError("unexpected non-whitespace char %r in " "line %r while removing %d-space margin" % (ch, line, margin)) if DEBUG: print("dedent: %r: %r -> removed %d/%d"\ % (line, ch, removed, margin)) if removed == margin: lines[i] = lines[i][j+1:] break elif removed > margin: lines[i] = ' '*(removed-margin) + lines[i][j+1:] break else: if removed: lines[i] = lines[i][removed:] return lines def _dedent(text, tabsize=8, skip_first_line=False): """_dedent(text, tabsize=8, skip_first_line=False) -> dedented text "text" is the text to dedent. "tabsize" is the tab width to use for indent width calculations. "skip_first_line" is a boolean indicating if the first line should be skipped for calculating the indent width and for dedenting. This is sometimes useful for docstrings and similar. textwrap.dedent(s), but don't expand tabs to spaces """ lines = text.splitlines(1) _dedentlines(lines, tabsize=tabsize, skip_first_line=skip_first_line) return ''.join(lines) class _memoized(object): """Decorator that caches a function's return value each time it is called. If called later with the same arguments, the cached value is returned, and not re-evaluated. http://wiki.python.org/moin/PythonDecoratorLibrary """ def __init__(self, func): self.func = func self.cache = {} def __call__(self, *args): try: return self.cache[args] except KeyError: self.cache[args] = value = self.func(*args) return value except TypeError: # uncachable -- for instance, passing a list as an argument. # Better to not cache than to blow up entirely. return self.func(*args) def __repr__(self): """Return the function's docstring.""" return self.func.__doc__ def _xml_oneliner_re_from_tab_width(tab_width): """Standalone XML processing instruction regex.""" return re.compile(r""" (?: (?<=\n\n) # Starting after a blank line | # or \A\n? # the beginning of the doc ) ( # save in $1 [ ]{0,%d} (?: <\?\w+\b\s+.*?\?> # XML processing instruction | <\w+:\w+\b\s+.*?/> # namespaced single tag ) [ \t]* (?=\n{2,}|\Z) # followed by a blank line or end of document ) """ % (tab_width - 1), re.X) _xml_oneliner_re_from_tab_width = _memoized(_xml_oneliner_re_from_tab_width) def _hr_tag_re_from_tab_width(tab_width): return re.compile(r""" (?: (?<=\n\n) # Starting after a blank line | # or \A\n? # the beginning of the doc ) ( # save in \1 [ ]{0,%d} <(hr) # start tag = \2 \b # word break ([^<>])*? # /?> # the matching end tag [ \t]* (?=\n{2,}|\Z) # followed by a blank line or end of document ) """ % (tab_width - 1), re.X) _hr_tag_re_from_tab_width = _memoized(_hr_tag_re_from_tab_width) def _xml_escape_attr(attr, skip_single_quote=True): """Escape the given string for use in an HTML/XML tag attribute. By default this doesn't bother with escaping `'` to `'`, presuming that the tag attribute is surrounded by double quotes. """ escaped = (attr .replace('&', '&') .replace('"', '"') .replace('<', '<') .replace('>', '>')) if not skip_single_quote: escaped = escaped.replace("'", "'") return escaped def _xml_encode_email_char_at_random(ch): r = random() # Roughly 10% raw, 45% hex, 45% dec. # '@' *must* be encoded. I [John Gruber] insist. # Issue 26: '_' must be encoded. if r > 0.9 and ch not in "@_": return ch elif r < 0.45: # The [1:] is to drop leading '0': 0x63 -> x63 return '&#%s;' % hex(ord(ch))[1:] else: return '&#%s;' % ord(ch) #---- mainline class _NoReflowFormatter(optparse.IndentedHelpFormatter): """An optparse formatter that does NOT reflow the description.""" def format_description(self, description): return description or "" def _test(): import doctest doctest.testmod() def main(argv=None): if argv is None: argv = sys.argv if not logging.root.handlers: logging.basicConfig() usage = "usage: %prog [PATHS...]" version = "%prog "+__version__ parser = optparse.OptionParser(prog="markdown2", usage=usage, version=version, description=cmdln_desc, formatter=_NoReflowFormatter()) parser.add_option("-v", "--verbose", dest="log_level", action="store_const", const=logging.DEBUG, help="more verbose output") parser.add_option("--encoding", help="specify encoding of text content") parser.add_option("--html4tags", action="store_true", default=False, help="use HTML 4 style for empty element tags") parser.add_option("-s", "--safe", metavar="MODE", dest="safe_mode", help="sanitize literal HTML: 'escape' escapes " "HTML meta chars, 'replace' replaces with an " "[HTML_REMOVED] note") parser.add_option("-x", "--extras", action="append", help="Turn on specific extra features (not part of " "the core Markdown spec). See above.") parser.add_option("--use-file-vars", help="Look for and use Emacs-style 'markdown-extras' " "file var to turn on extras. See " "<https://github.com/trentm/python-markdown2/wiki/Extras>") parser.add_option("--link-patterns-file", help="path to a link pattern file") parser.add_option("--self-test", action="store_true", help="run internal self-tests (some doctests)") parser.add_option("--compare", action="store_true", help="run against Markdown.pl as well (for testing)") parser.set_defaults(log_level=logging.INFO, compare=False, encoding="utf-8", safe_mode=None, use_file_vars=False) opts, paths = parser.parse_args() log.setLevel(opts.log_level) if opts.self_test: return _test() if opts.extras: extras = {} for s in opts.extras: splitter = re.compile("[,;: ]+") for e in splitter.split(s): if '=' in e: ename, earg = e.split('=', 1) try: earg = int(earg) except ValueError: pass else: ename, earg = e, None extras[ename] = earg else: extras = None if opts.link_patterns_file: link_patterns = [] f = open(opts.link_patterns_file) try: for i, line in enumerate(f.readlines()): if not line.strip(): continue if line.lstrip().startswith("#"): continue try: pat, href = line.rstrip().rsplit(None, 1) except ValueError: raise MarkdownError("%s:%d: invalid link pattern line: %r" % (opts.link_patterns_file, i+1, line)) link_patterns.append( (_regex_from_encoded_pattern(pat), href)) finally: f.close() else: link_patterns = None from os.path import join, dirname, abspath, exists markdown_pl = join(dirname(dirname(abspath(__file__))), "test", "Markdown.pl") if not paths: paths = ['-'] for path in paths: if path == '-': text = sys.stdin.read() else: fp = codecs.open(path, 'r', opts.encoding) text = fp.read() fp.close() if opts.compare: from subprocess import Popen, PIPE print("==== Markdown.pl ====") p = Popen('perl %s' % markdown_pl, shell=True, stdin=PIPE, stdout=PIPE, close_fds=True) p.stdin.write(text.encode('utf-8')) p.stdin.close() perl_html = p.stdout.read().decode('utf-8') if py3: sys.stdout.write(perl_html) else: sys.stdout.write(perl_html.encode( sys.stdout.encoding or "utf-8", 'xmlcharrefreplace')) print("==== markdown2.py ====") html = markdown(text, html4tags=opts.html4tags, safe_mode=opts.safe_mode, extras=extras, link_patterns=link_patterns, use_file_vars=opts.use_file_vars) if py3: sys.stdout.write(html) else: sys.stdout.write(html.encode( sys.stdout.encoding or "utf-8", 'xmlcharrefreplace')) if extras and "toc" in extras: log.debug("toc_html: " + html.toc_html.encode(sys.stdout.encoding or "utf-8", 'xmlcharrefreplace')) if opts.compare: test_dir = join(dirname(dirname(abspath(__file__))), "test") if exists(join(test_dir, "test_markdown2.py")): sys.path.insert(0, test_dir) from test_markdown2 import norm_html_from_html norm_html = norm_html_from_html(html) norm_perl_html = norm_html_from_html(perl_html) else: norm_html = html norm_perl_html = perl_html print("==== match? %r ====" % (norm_perl_html == norm_html)) if __name__ == "__main__": sys.exit( main(sys.argv) ) �����������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/paymentech.py������������������������������������������������������0000664�0000000�0000000�00000026702�12564727262�017765� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # -*- coding: utf-8 -*- # This module provides a simple API for Paymentech(c) payments # The original code was taken from this web2py issue post # http://code.google.com/p/web2py/issues/detail?id=1170 by Adnan Smajlovic # # Copyright (C) <2012> Alan Etkin <spametki@gmail.com> # License: BSD # import sys, httplib, urllib, urllib2 from xml.dom.minidom import parseString # TODO: input validation, test, debugging output class PaymenTech(object): """ The base class for connecting to the Paymentech service Format notes ============ - Credit card expiration date (exp argument) must be of mmyyyy form - The amount is an all integers string with two decimal places: For example, $2.15 must be formatted as "215" Point of sale and service options (to be passed on initialization) ================================================================== user password industry message bin_code merchant terminal (WARNING!: this is False by default) development <bool> (the following arguments have default values) target host api_url Testing ======= As this module consumes webservice methods, it should be tested with particular user data with the paymentech development environment The simplest test would be running something like the following: from paymentech import PaymenTech # Read the basic point of sale argument list required above # Remember to use development = True! pos_data = {'user': <username>, ...} # The data arguments are documented in the .charge() method help charge_test = {'account': <account>, ...} mypayment = PaymentTech(**pos_data) result = mypayment.charge(**charge_test) print "##################################" print "# Charge test result #" print "##################################" print result ################################################################# # Notes for web2py implementations # ################################################################# # A recommended model for handling payments # Store this constants in a private model file (i.e. 0_private.py) PAYMENTECH_USER = <str> PAYMENTECH_PASSWORD = <str> PAYMENTECH_INDUSTRY = <str> PAYMENTECH_MESSAGE = <str> PAYMENTECH_BIN_CODE= <str> PAYMENTECH_MERCHANT = <str> PAYMENTECH_terminal = <str> DEVELOPMENT = True PAYMENTECH_TARGET = <str> PAYMENTECH_HOST = <str> PAYMENTECH_API_URL = <str> # The following table would allow passing data with web2py and to # update records with the webservice authorization output by using # the DAL # # For example: # # # Create a PaymenTech instance # mypaymentech = paymentech.PaymenTech(user=PAYMENTECH_USER, ...) # # # Fetch a payment inserted within the app # myrow = db.paymentech[<id>] # # # Send the authorization request to the webservice # result = mypaymentech.charge(myrow.as_dict()) # # # Update the db record with the webservice response # myrow.update_record(**result) db.define_table("paymentech", Field("account"), Field("exp", comment="Must be of the mmyyyy form"), Field("currency_code"), Field("currency_exponent"), Field("card_sec_val_ind"), Field("card_sec_val"), Field("avs_zip"), Field("avs_address_1"), Field("avs_address_2"), Field("avs_city"), Field("avs_state"), Field("avs_phone"), Field("avs_country"), Field("profile_from_order_ind"), Field("profile_order_override_ind"), Field("order_id"), Field("amount", comment="all integers with two decimal digits, \ without dot separation"), Field("header"), Field("status_code"), Field("status_message"), Field("resp_code"), Field("tx_ref_num"), format="%(order_id)s") TODO: add model form validators (for exp date and amount) """ charge_xml = """ <?xml version="1.0" encoding="UTF-8"?> <Request> <NewOrder> <OrbitalConnectionUsername>%(user)s</OrbitalConnectionUsername> <OrbitalConnectionPassword>%(password)s</OrbitalConnectionPassword> <IndustryType>%(industry)s</IndustryType> <MessageType>%(message)s</MessageType> <BIN>%(bin)s</BIN> <MerchantID>%(merchant)s</MerchantID> <TerminalID>%(terminal)s</TerminalID> <AccountNum>%(account)s</AccountNum> <Exp>%(exp)s</Exp> <CurrencyCode>%(currency_code)s</CurrencyCode> <CurrencyExponent>%(currency_exponent)s</CurrencyExponent> <CardSecValInd>%(card_sec_val_ind)s</CardSecValInd> <CardSecVal>%(card_sec_val)s</CardSecVal> <AVSzip>%(avs_zip)s</AVSzip> <AVSaddress1>%(avs_address_1)s</AVSaddress1> <AVSaddress2>%(avs_address_2)s</AVSaddress2> <AVScity>%(avs_city)s</AVScity> <AVSstate>%(avs_state)s</AVSstate> <AVSphoneNum>%(avs_phone)s</AVSphoneNum> <AVScountryCode>%(avs_country)s</AVScountryCode> <CustomerProfileFromOrderInd>%(profile_from_order_ind)s</CustomerProfileFromOrderInd> <CustomerProfileOrderOverrideInd>%(profile_order_override_ind)s</CustomerProfileOrderOverrideInd> <OrderID>%(order_id)s</OrderID> <Amount>%(amount)s</Amount> </NewOrder> </Request> """ def __init__(self, development=False, user=None, password=None, industry=None, message=None, api_url=None, bin_code=None, merchant=None, host=None, terminal=None, target=None): # PaymenTech point of sales data self.user = user self.password = password self.industry = industry self.message = message self.bin_code = bin_code self.merchant = merchant self.terminal = terminal # Service options self.development = development self.target = target self.host = host self.api_url = api_url # dev: https://orbitalvar1.paymentech.net/authorize:443 # prod: https://orbital1.paymentech.net/authorize if self.development is False: if not self.target: # production self.target = "https://orbital1.paymentech.net/authorize" self.host, self.api_url = \ urllib2.splithost(urllib2.splittype(self.target)[1]) else: if not self.target: # development self.target = "https://orbitalvar1.paymentech.net/authorize" if not self.host: self.host = "orbitalvar1.paymentech.net/authorize:443" if not self.api_url: self.api_url = "/" def charge(self, raw=None, **kwargs): """ Post an XML request to Paymentech This is an example of a call with raw xml data: from paymentech import PaymenTech # Note: user/password/etc data is not mandatory as it # is retrieved from instance attributes (set on init) pt = PaymenTech(user="<myuser>", password="<mypassword>", ...) # see basic user in the class help result = pt.charge(raw=xml_string) A better way to make a charge request is to unpack a dict object with the operation data: ... # The complete input values are listed below in # "Transacion data..." charge_data = dict(account=<str>, exp=<str mmyyyy>, ...) result = pt.charge(**charge_data) Variable xml_string contains all details about the order, plus we are sending username/password in there too... Transaction data (to be passed to the charge() method) ====================================================== (Note that it is possible to override the class user, pass, etc. passing those arguments to the .charge() method, which are documented in the class help) account exp <str mmyyyy> currency_code currency_exponent card_sec_val_ind card_sec_val avs_zip avs_address_1 avs_address_2 avs_city avs_state avs_phone avs_country profile_from_order_ind profile_order_override_ind order_id amount <str> (all integers with two decimal digits, without dot separation) Request header example ====================== Request: sent as POST to https://orbitalvar1.paymentech.net/authorize:443 from 127.0.0.1 request headers: Content-Type: application/PTI45 Content-Type: application/PTI46 Content-transfer-encoding: text Request-number: 1 Document-type: Request Trace-number: 1234556446 <?xml version="1.0" encoding="UTF-8"?> """ # default charge data data = dict(user=self.user, password=self.password, industry=self.industry, message=self.message, bin_code=self.bin_code, merchant=self.merchant, terminal=self.terminal, account="", exp="", currency_code="", currency_exponent="", card_sec_val_ind="", card_sec_val="", avs_zip="", avs_address_1="", avs_address_2="", avs_city="", avs_state="", avs_phone="", avs_country="", profile_from_order_ind="", profile_order_override_ind="", order_id="", amount="") result = dict() # Complete the charge request with the method kwargs for k, v in kwargs.iteritems(): data[k] = v status_code = status_message = header = resp_code = \ tx_ref_num = order_id = None conn = httplib.HTTPS(self.host) conn.putrequest('POST', self.api_url) if self.development: content_type = "PTI56" else: content_type = "PTI46" if raw is None: xml_string = self.charge_xml % data else: xml_string = raw conn.putheader("Content-Type", "application/%s") % content_type conn.putheader("Content-transfer-encoding", "text") conn.putheader("Request-number", "1") conn.putheader("Content-length", str(len(xml_string))) conn.putheader("Document-type", "Request") conn.putheader("Trace-number", str(data["order_id"])) conn.putheader("MIME-Version", "1.0") conn.endheaders() conn.send(xml_string) result["status_code"], result["status_message"], \ result["header"] = conn.getreply() fp = conn.getfile() output = fp.read() fp.close() dom = parseString(output) result["resp_code"] = \ dom.getElementsByTagName('RespCode')[0].firstChild.data result["tx_ref_num"] = \ dom.getElementsByTagName('TxRefNum')[0].firstChild.data result["order_id"] = \ dom.getElementsByTagName('CustomerRefNum')[0].firstChild.data return result ��������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/pg8000/������������������������������������������������������������0000775�0000000�0000000�00000000000�12564727262�016165� 5����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/pg8000/six.py������������������������������������������������������0000664�0000000�0000000�00000050751�12564727262�017352� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""Utilities for writing code that runs on Python 2 and 3""" # Copyright (c) 2010-2013 Benjamin Peterson # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. from __future__ import absolute_import import operator import sys import types __author__ = "Benjamin Peterson <benjamin@python.org>" __version__ = "1.4.1" # Useful for very coarse version differentiation. PY2 = sys.version_info[0] == 2 PY3 = sys.version_info[0] == 3 PRE_26 = PY2 and sys.version_info[1] < 6 IS_JYTHON = sys.platform.lower().count('java') > 0 if PY3: string_types = str, integer_types = int, class_types = type, text_type = str binary_type = bytes MAXSIZE = sys.maxsize else: string_types = basestring, # noqa integer_types = (int, long) # noqa class_types = (type, types.ClassType) text_type = unicode # noqa binary_type = str if sys.platform.startswith("java"): # Jython always uses 32 bits. MAXSIZE = int((1 << 31) - 1) else: # It's possible to have sizeof(long) != sizeof(Py_ssize_t). class X(object): def __len__(self): return 1 << 31 try: len(X()) except OverflowError: # 32-bit MAXSIZE = int((1 << 31) - 1) else: # 64-bit MAXSIZE = int((1 << 63) - 1) del X def _add_doc(func, doc): """Add documentation to a function.""" func.__doc__ = doc def _import_module(name): """Import module, returning the module after the last dot.""" __import__(name) return sys.modules[name] class _LazyDescr(object): def __init__(self, name): self.name = name def __get__(self, obj, tp): result = self._resolve() setattr(obj, self.name, result) # This is a bit ugly, but it avoids running this again. delattr(tp, self.name) return result class MovedModule(_LazyDescr): def __init__(self, name, old, new=None): super(MovedModule, self).__init__(name) if PY3: if new is None: new = name self.mod = new else: self.mod = old def _resolve(self): return _import_module(self.mod) class MovedAttribute(_LazyDescr): def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): super(MovedAttribute, self).__init__(name) if PY3: if new_mod is None: new_mod = name self.mod = new_mod if new_attr is None: if old_attr is None: new_attr = name else: new_attr = old_attr self.attr = new_attr else: self.mod = old_mod if old_attr is None: old_attr = name self.attr = old_attr def _resolve(self): module = _import_module(self.mod) return getattr(module, self.attr) class _MovedItems(types.ModuleType): """Lazy loading of moved objects""" _moved_attributes = [ MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), MovedAttribute( "filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), MovedAttribute("map", "itertools", "builtins", "imap", "map"), MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), MovedAttribute("reload_module", "__builtin__", "imp", "reload"), MovedAttribute("reduce", "__builtin__", "functools"), MovedAttribute("StringIO", "StringIO", "io"), MovedAttribute("UserString", "UserString", "collections"), MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), MovedAttribute( "zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), MovedModule("builtins", "__builtin__"), MovedModule("configparser", "ConfigParser"), MovedModule("copyreg", "copy_reg"), MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), MovedModule("http_cookies", "Cookie", "http.cookies"), MovedModule("html_entities", "htmlentitydefs", "html.entities"), MovedModule("html_parser", "HTMLParser", "html.parser"), MovedModule("http_client", "httplib", "http.client"), MovedModule( "email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), MovedModule("cPickle", "cPickle", "pickle"), MovedModule("queue", "Queue"), MovedModule("reprlib", "repr"), MovedModule("socketserver", "SocketServer"), MovedModule("tkinter", "Tkinter"), MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), MovedModule( "tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), MovedModule( "tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), MovedModule("tkinter_tix", "Tix", "tkinter.tix"), MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), MovedModule("tkinter_colorchooser", "tkColorChooser", "tkinter.colorchooser"), MovedModule("tkinter_commondialog", "tkCommonDialog", "tkinter.commondialog"), MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), MovedModule("tkinter_font", "tkFont", "tkinter.font"), MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), MovedModule( "tkinter_tksimpledialog", "tkSimpleDialog", "tkinter.simpledialog"), MovedModule( "urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), MovedModule( "urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), MovedModule( "urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), MovedModule("winreg", "_winreg"), ] for attr in _moved_attributes: setattr(_MovedItems, attr.name, attr) del attr moves = sys.modules[__name__ + ".moves"] = _MovedItems(__name__ + ".moves") class Module_six_moves_urllib_parse(types.ModuleType): """Lazy loading of moved objects in six.moves.urllib_parse""" _urllib_parse_moved_attributes = [ MovedAttribute("ParseResult", "urlparse", "urllib.parse"), MovedAttribute("parse_qs", "urlparse", "urllib.parse"), MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), MovedAttribute("urldefrag", "urlparse", "urllib.parse"), MovedAttribute("urljoin", "urlparse", "urllib.parse"), MovedAttribute("urlparse", "urlparse", "urllib.parse"), MovedAttribute("urlsplit", "urlparse", "urllib.parse"), MovedAttribute("urlunparse", "urlparse", "urllib.parse"), MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), MovedAttribute("quote", "urllib", "urllib.parse"), MovedAttribute("quote_plus", "urllib", "urllib.parse"), MovedAttribute("unquote", "urllib", "urllib.parse"), MovedAttribute("unquote_plus", "urllib", "urllib.parse"), MovedAttribute("urlencode", "urllib", "urllib.parse"), ] for attr in _urllib_parse_moved_attributes: setattr(Module_six_moves_urllib_parse, attr.name, attr) del attr sys.modules[__name__ + ".moves.urllib_parse"] = Module_six_moves_urllib_parse( __name__ + ".moves.urllib_parse") sys.modules[__name__ + ".moves.urllib.parse"] = Module_six_moves_urllib_parse( __name__ + ".moves.urllib.parse") class Module_six_moves_urllib_error(types.ModuleType): """Lazy loading of moved objects in six.moves.urllib_error""" _urllib_error_moved_attributes = [ MovedAttribute("URLError", "urllib2", "urllib.error"), MovedAttribute("HTTPError", "urllib2", "urllib.error"), MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), ] for attr in _urllib_error_moved_attributes: setattr(Module_six_moves_urllib_error, attr.name, attr) del attr sys.modules[__name__ + ".moves.urllib_error"] = Module_six_moves_urllib_error( __name__ + ".moves.urllib_error") sys.modules[__name__ + ".moves.urllib.error"] = Module_six_moves_urllib_error( __name__ + ".moves.urllib.error") class Module_six_moves_urllib_request(types.ModuleType): """Lazy loading of moved objects in six.moves.urllib_request""" _urllib_request_moved_attributes = [ MovedAttribute("urlopen", "urllib2", "urllib.request"), MovedAttribute("install_opener", "urllib2", "urllib.request"), MovedAttribute("build_opener", "urllib2", "urllib.request"), MovedAttribute("pathname2url", "urllib", "urllib.request"), MovedAttribute("url2pathname", "urllib", "urllib.request"), MovedAttribute("getproxies", "urllib", "urllib.request"), MovedAttribute("Request", "urllib2", "urllib.request"), MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), MovedAttribute("BaseHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), MovedAttribute( "HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), MovedAttribute("FileHandler", "urllib2", "urllib.request"), MovedAttribute("FTPHandler", "urllib2", "urllib.request"), MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), MovedAttribute("urlretrieve", "urllib", "urllib.request"), MovedAttribute("urlcleanup", "urllib", "urllib.request"), MovedAttribute("URLopener", "urllib", "urllib.request"), MovedAttribute("FancyURLopener", "urllib", "urllib.request"), ] for attr in _urllib_request_moved_attributes: setattr(Module_six_moves_urllib_request, attr.name, attr) del attr sys.modules[__name__ + ".moves.urllib_request"] = \ Module_six_moves_urllib_request(__name__ + ".moves.urllib_request") sys.modules[__name__ + ".moves.urllib.request"] = \ Module_six_moves_urllib_request(__name__ + ".moves.urllib.request") class Module_six_moves_urllib_response(types.ModuleType): """Lazy loading of moved objects in six.moves.urllib_response""" _urllib_response_moved_attributes = [ MovedAttribute("addbase", "urllib", "urllib.response"), MovedAttribute("addclosehook", "urllib", "urllib.response"), MovedAttribute("addinfo", "urllib", "urllib.response"), MovedAttribute("addinfourl", "urllib", "urllib.response"), ] for attr in _urllib_response_moved_attributes: setattr(Module_six_moves_urllib_response, attr.name, attr) del attr sys.modules[__name__ + ".moves.urllib_response"] = \ Module_six_moves_urllib_response(__name__ + ".moves.urllib_response") sys.modules[__name__ + ".moves.urllib.response"] = \ Module_six_moves_urllib_response(__name__ + ".moves.urllib.response") class Module_six_moves_urllib_robotparser(types.ModuleType): """Lazy loading of moved objects in six.moves.urllib_robotparser""" _urllib_robotparser_moved_attributes = [ MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), ] for attr in _urllib_robotparser_moved_attributes: setattr(Module_six_moves_urllib_robotparser, attr.name, attr) del attr sys.modules[__name__ + ".moves.urllib_robotparser"] = \ Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib_robotparser") sys.modules[__name__ + ".moves.urllib.robotparser"] = \ Module_six_moves_urllib_robotparser( __name__ + ".moves.urllib.robotparser") class Module_six_moves_urllib(types.ModuleType): """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" parse = sys.modules[__name__ + ".moves.urllib_parse"] error = sys.modules[__name__ + ".moves.urllib_error"] request = sys.modules[__name__ + ".moves.urllib_request"] response = sys.modules[__name__ + ".moves.urllib_response"] robotparser = sys.modules[__name__ + ".moves.urllib_robotparser"] sys.modules[__name__ + ".moves.urllib"] = Module_six_moves_urllib( __name__ + ".moves.urllib") def add_move(move): """Add an item to six.moves.""" setattr(_MovedItems, move.name, move) def remove_move(name): """Remove item from six.moves.""" try: delattr(_MovedItems, name) except AttributeError: try: del moves.__dict__[name] except KeyError: raise AttributeError("no such move, %r" % (name,)) if PY3: _meth_func = "__func__" _meth_self = "__self__" _func_closure = "__closure__" _func_code = "__code__" _func_defaults = "__defaults__" _func_globals = "__globals__" _iterkeys = "keys" _itervalues = "values" _iteritems = "items" _iterlists = "lists" else: _meth_func = "im_func" _meth_self = "im_self" _func_closure = "func_closure" _func_code = "func_code" _func_defaults = "func_defaults" _func_globals = "func_globals" _iterkeys = "iterkeys" _itervalues = "itervalues" _iteritems = "iteritems" _iterlists = "iterlists" try: advance_iterator = next except NameError: def advance_iterator(it): return it.next() next = advance_iterator try: callable = callable except NameError: def callable(obj): return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) if PY3: def get_unbound_function(unbound): return unbound create_bound_method = types.MethodType Iterator = object else: def get_unbound_function(unbound): return unbound.im_func def create_bound_method(func, obj): return types.MethodType(func, obj, obj.__class__) class Iterator(object): def next(self): return type(self).__next__(self) callable = callable _add_doc(get_unbound_function, """Get the function out of a possibly unbound function""") get_method_function = operator.attrgetter(_meth_func) get_method_self = operator.attrgetter(_meth_self) get_function_closure = operator.attrgetter(_func_closure) get_function_code = operator.attrgetter(_func_code) get_function_defaults = operator.attrgetter(_func_defaults) get_function_globals = operator.attrgetter(_func_globals) def iterkeys(d, **kw): """Return an iterator over the keys of a dictionary.""" return iter(getattr(d, _iterkeys)(**kw)) def itervalues(d, **kw): """Return an iterator over the values of a dictionary.""" return iter(getattr(d, _itervalues)(**kw)) def iteritems(d, **kw): """Return an iterator over the (key, value) pairs of a dictionary.""" return iter(getattr(d, _iteritems)(**kw)) def iterlists(d, **kw): """Return an iterator over the (key, [values]) pairs of a dictionary.""" return iter(getattr(d, _iterlists)(**kw)) if PY3: def b(s): return s.encode("latin-1") def u(s): return s unichr = chr if sys.version_info[1] <= 1: def int2byte(i): return bytes((i,)) else: # This is about 2x faster than the implementation above on 3.2+ int2byte = operator.methodcaller("to_bytes", 1, "big") byte2int = operator.itemgetter(0) indexbytes = operator.getitem iterbytes = iter import io StringIO = io.StringIO BytesIO = io.BytesIO else: def b(s): return s def u(s): return unicode(s, "unicode_escape") # noqa unichr = unichr int2byte = chr def byte2int(bs): return ord(bs[0]) def indexbytes(buf, i): return ord(buf[i]) def iterbytes(buf): return (ord(byte) for byte in buf) import StringIO StringIO = BytesIO = StringIO.StringIO _add_doc(b, """Byte literal""") _add_doc(u, """Text literal""") if PY3: import builtins exec_ = getattr(builtins, "exec") def reraise(tp, value, tb=None): if value.__traceback__ is not tb: raise value.with_traceback(tb) raise value print_ = getattr(builtins, "print") del builtins else: def exec_(_code_, _globs_=None, _locs_=None): """Execute code in a namespace.""" if _globs_ is None: frame = sys._getframe(1) _globs_ = frame.f_globals if _locs_ is None: _locs_ = frame.f_locals del frame elif _locs_ is None: _locs_ = _globs_ exec("""exec _code_ in _globs_, _locs_""") exec_("""def reraise(tp, value, tb=None): raise tp, value, tb """) def print_(*args, **kwargs): """The new-style print function.""" fp = kwargs.pop("file", sys.stdout) if fp is None: return def write(data): if not isinstance(data, basestring): # noqa data = str(data) fp.write(data) want_unicode = False sep = kwargs.pop("sep", None) if sep is not None: if isinstance(sep, unicode): # noqa want_unicode = True elif not isinstance(sep, str): raise TypeError("sep must be None or a string") end = kwargs.pop("end", None) if end is not None: if isinstance(end, unicode): # noqa want_unicode = True elif not isinstance(end, str): raise TypeError("end must be None or a string") if kwargs: raise TypeError("invalid keyword arguments to print()") if not want_unicode: for arg in args: if isinstance(arg, unicode): # noqa want_unicode = True break if want_unicode: newline = unicode("\n") # noqa space = unicode(" ") # noqa else: newline = "\n" space = " " if sep is None: sep = space if end is None: end = newline for i, arg in enumerate(args): if i: write(sep) write(arg) write(end) _add_doc(reraise, """Reraise an exception.""") def with_metaclass(meta, *bases): """Create a base class with a metaclass.""" return meta("NewBase", bases, {}) def add_metaclass(metaclass): """Class decorator for creating a class with a metaclass.""" def wrapper(cls): orig_vars = cls.__dict__.copy() orig_vars.pop('__dict__', None) orig_vars.pop('__weakref__', None) for slots_var in orig_vars.get('__slots__', ()): orig_vars.pop(slots_var) return metaclass(cls.__name__, cls.__bases__, orig_vars) return wrapper �����������������������web2py-2.12.3.orig/gluon/contrib/pg8000/__init__.py�������������������������������������������������0000664�0000000�0000000�00000040072�12564727262�020301� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (c) 2007-2009, Mathieu Fenniak # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # * The name of the author may not be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. __author__ = "Mathieu Fenniak" exec("from struct import Struct") for fmt in ( "i", "h", "q", "d", "f", "iii", "ii", "qii", "dii", "ihihih", "ci", "bh", "cccc"): exec(fmt + "_struct = Struct('!" + fmt + "')") exec(fmt + "_unpack = " + fmt + "_struct.unpack_from") exec(fmt + "_pack = " + fmt + "_struct.pack") import datetime import time from .six import binary_type, integer_types, PY2 min_int2, max_int2 = -2 ** 15, 2 ** 15 min_int4, max_int4 = -2 ** 31, 2 ** 31 min_int8, max_int8 = -2 ** 63, 2 ** 63 class Warning(Exception): """Generic exception raised for important database warnings like data truncations. This exception is not currently used by pg8000. This exception is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ pass class Error(Exception): """Generic exception that is the base exception of all other error exceptions. This exception is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ pass class InterfaceError(Error): """Generic exception raised for errors that are related to the database interface rather than the database itself. For example, if the interface attempts to use an SSL connection but the server refuses, an InterfaceError will be raised. This exception is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ pass class DatabaseError(Error): """Generic exception raised for errors that are related to the database. This exception is currently never raised by pg8000. This exception is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ pass class DataError(DatabaseError): """Generic exception raised for errors that are due to problems with the processed data. This exception is not currently raised by pg8000. This exception is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ pass class OperationalError(DatabaseError): """ Generic exception raised for errors that are related to the database's operation and not necessarily under the control of the programmer. This exception is currently never raised by pg8000. This exception is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ pass class IntegrityError(DatabaseError): """ Generic exception raised when the relational integrity of the database is affected. This exception is not currently raised by pg8000. This exception is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ pass class InternalError(DatabaseError): """Generic exception raised when the database encounters an internal error. This is currently only raised when unexpected state occurs in the pg8000 interface itself, and is typically the result of a interface bug. This exception is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ pass class ProgrammingError(DatabaseError): """Generic exception raised for programming errors. For example, this exception is raised if more parameter fields are in a query string than there are available parameters. This exception is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ pass class NotSupportedError(DatabaseError): """Generic exception raised in case a method or database API was used which is not supported by the database. This exception is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ pass class ArrayContentNotSupportedError(NotSupportedError): """ Raised when attempting to transmit an array where the base type is not supported for binary data transfer by the interface. """ pass class ArrayContentNotHomogenousError(ProgrammingError): """ Raised when attempting to transmit an array that doesn't contain only a single type of object. """ pass class ArrayContentEmptyError(ProgrammingError): """Raised when attempting to transmit an empty array. The type oid of an empty array cannot be determined, and so sending them is not permitted. """ pass class ArrayDimensionsNotConsistentError(ProgrammingError): """ Raised when attempting to transmit an array that has inconsistent multi-dimension sizes. """ pass class Bytea(binary_type): """Bytea is a str-derived class that is mapped to a PostgreSQL byte array. This class is only used in Python 2, the built-in ``bytes`` type is used in Python 3. """ pass class Interval(object): """An Interval represents a measurement of time. In PostgreSQL, an interval is defined in the measure of months, days, and microseconds; as such, the pg8000 interval type represents the same information. Note that values of the :attr:`microseconds`, :attr:`days` and :attr:`months` properties are independently measured and cannot be converted to each other. A month may be 28, 29, 30, or 31 days, and a day may occasionally be lengthened slightly by a leap second. .. attribute:: microseconds Measure of microseconds in the interval. The microseconds value is constrained to fit into a signed 64-bit integer. Any attempt to set a value too large or too small will result in an OverflowError being raised. .. attribute:: days Measure of days in the interval. The days value is constrained to fit into a signed 32-bit integer. Any attempt to set a value too large or too small will result in an OverflowError being raised. .. attribute:: months Measure of months in the interval. The months value is constrained to fit into a signed 32-bit integer. Any attempt to set a value too large or too small will result in an OverflowError being raised. """ def __init__(self, microseconds=0, days=0, months=0): self.microseconds = microseconds self.days = days self.months = months def _setMicroseconds(self, value): if not isinstance(value, integer_types): raise TypeError("microseconds must be an integer type") elif not (min_int8 < value < max_int8): raise OverflowError( "microseconds must be representable as a 64-bit integer") else: self._microseconds = value def _setDays(self, value): if not isinstance(value, integer_types): raise TypeError("days must be an integer type") elif not (min_int4 < value < max_int4): raise OverflowError( "days must be representable as a 32-bit integer") else: self._days = value def _setMonths(self, value): if not isinstance(value, integer_types): raise TypeError("months must be an integer type") elif not (min_int4 < value < max_int4): raise OverflowError( "months must be representable as a 32-bit integer") else: self._months = value microseconds = property(lambda self: self._microseconds, _setMicroseconds) days = property(lambda self: self._days, _setDays) months = property(lambda self: self._months, _setMonths) def __repr__(self): return "<Interval %s months %s days %s microseconds>" % ( self.months, self.days, self.microseconds) def __eq__(self, other): return other is not None and isinstance(other, Interval) and \ self.months == other.months and self.days == other.days and \ self.microseconds == other.microseconds def __neq__(self, other): return not self.__eq__(other) from .core import Connection def connect( user=None, host='localhost', unix_sock=None, port=5432, database=None, password=None, ssl=False, **kwargs): """Creates a connection to a PostgreSQL database. This function is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_; however, the arguments of the function are not defined by the specification. :param user: The username to connect to the PostgreSQL server with. If this is not provided, pg8000 looks first for the PGUSER then the USER environment variables. If your server character encoding is not ``ascii`` or ``utf8``, then you need to provide ``user`` as bytes, eg. ``"my_name".encode('EUC-JP')``. :keyword host: The hostname of the PostgreSQL server to connect with. Providing this parameter is necessary for TCP/IP connections. One of either ``host`` or ``unix_sock`` must be provided. The default is ``localhost``. :keyword unix_sock: The path to the UNIX socket to access the database through, for example, ``'/tmp/.s.PGSQL.5432'``. One of either ``host`` or ``unix_sock`` must be provided. :keyword port: The TCP/IP port of the PostgreSQL server instance. This parameter defaults to ``5432``, the registered common port of PostgreSQL TCP/IP servers. :keyword database: The name of the database instance to connect with. This parameter is optional; if omitted, the PostgreSQL server will assume the database name is the same as the username. If your server character encoding is not ``ascii`` or ``utf8``, then you need to provide ``database`` as bytes, eg. ``"my_db".encode('EUC-JP')``. :keyword password: The user password to connect to the server with. This parameter is optional; if omitted and the database server requests password-based authentication, the connection will fail to open. If this parameter is provided but not requested by the server, no error will occur. :keyword ssl: Use SSL encryption for TCP/IP sockets if ``True``. Defaults to ``False``. :rtype: A :class:`Connection` object. """ return Connection( user, host, unix_sock, port, database, password, ssl) apilevel = "2.0" """The DBAPI level supported, currently "2.0". This property is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ threadsafety = 3 """Integer constant stating the level of thread safety the DBAPI interface supports. This DBAPI module supports sharing the module, connections, and cursors, resulting in a threadsafety value of 3. This property is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ paramstyle = 'format' """String property stating the type of parameter marker formatting expected by the interface. This value defaults to "format", in which parameters are marked in this format: "WHERE name=%s". This property is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. As an extension to the DBAPI specification, this value is not constant; it can be changed to any of the following values: qmark Question mark style, eg. ``WHERE name=?`` numeric Numeric positional style, eg. ``WHERE name=:1`` named Named style, eg. ``WHERE name=:paramname`` format printf format codes, eg. ``WHERE name=%s`` pyformat Python format codes, eg. ``WHERE name=%(paramname)s`` """ # I have no idea what this would be used for by a client app. Should it be # TEXT, VARCHAR, CHAR? It will only compare against row_description's # type_code if it is this one type. It is the varchar type oid for now, this # appears to match expectations in the DB API 2.0 compliance test suite. STRING = 1043 """String type oid.""" if PY2: BINARY = Bytea else: BINARY = bytes NUMBER = 1700 """Numeric type oid""" DATETIME = 1114 """Timestamp type oid""" ROWID = 26 """ROWID type oid""" def Date(year, month, day): """Constuct an object holding a date value. This function is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. :rtype: :class:`datetime.date` """ return datetime.date(year, month, day) def Time(hour, minute, second): """Construct an object holding a time value. This function is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. :rtype: :class:`datetime.time` """ return datetime.time(hour, minute, second) def Timestamp(year, month, day, hour, minute, second): """Construct an object holding a timestamp value. This function is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. :rtype: :class:`datetime.datetime` """ return datetime.datetime(year, month, day, hour, minute, second) def DateFromTicks(ticks): """Construct an object holding a date value from the given ticks value (number of seconds since the epoch). This function is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. :rtype: :class:`datetime.date` """ return Date(*time.localtime(ticks)[:3]) def TimeFromTicks(ticks): """Construct an objet holding a time value from the given ticks value (number of seconds since the epoch). This function is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. :rtype: :class:`datetime.time` """ return Time(*time.localtime(ticks)[3:6]) def TimestampFromTicks(ticks): """Construct an object holding a timestamp value from the given ticks value (number of seconds since the epoch). This function is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. :rtype: :class:`datetime.datetime` """ return Timestamp(*time.localtime(ticks)[:6]) def Binary(value): """Construct an object holding binary data. This function is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. :rtype: :class:`pg8000.types.Bytea` for Python 2, otherwise :class:`bytes` """ if PY2: return Bytea(value) else: return value from .core import utc, Cursor __all__ = [ Warning, Bytea, DataError, DatabaseError, connect, InterfaceError, ProgrammingError, Error, OperationalError, IntegrityError, InternalError, NotSupportedError, ArrayContentNotHomogenousError, ArrayContentEmptyError, ArrayDimensionsNotConsistentError, ArrayContentNotSupportedError, utc, Connection, Cursor] """Version string for pg8000. .. versionadded:: 1.9.11 """ from ._version import get_versions __version__ = get_versions()['version'] del get_versions ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/pg8000/_version.py�������������������������������������������������0000664�0000000�0000000�00000016525�12564727262�020374� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� # This file helps to compute a version number in source trees obtained from # git-archive tarball (such as those provided by githubs download-from-tag # feature). Distribution tarballs (built by setup.py sdist) and build # directories (produced by setup.py build) will contain a much shorter file # that just contains the computed version number. # This file is released into the public domain. Generated by # versioneer-0.12 (https://github.com/warner/python-versioneer) # these strings will be replaced by git during git-archive git_refnames = "$Format:%d$" git_full = "$Format:%H$" # these strings are filled in when 'setup.py versioneer' creates _version.py tag_prefix = "" parentdir_prefix = "pg8000-" versionfile_source = "pg8000/_version.py" import os import sys import re import subprocess import errno def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False): assert isinstance(commands, list) p = None for c in commands: try: # remember shell=False, so use git.cmd on windows, not just git p = subprocess.Popen([c] + args, cwd=cwd, stdout=subprocess.PIPE, stderr=(subprocess.PIPE if hide_stderr else None)) break except EnvironmentError: e = sys.exc_info()[1] if e.errno == errno.ENOENT: continue if verbose: print("unable to run %s" % args[0]) print(e) return None else: if verbose: print("unable to find command, tried %s" % (commands,)) return None stdout = p.communicate()[0].strip() if sys.version >= '3': stdout = stdout.decode() if p.returncode != 0: if verbose: print("unable to run %s (error)" % args[0]) return None return stdout def versions_from_parentdir(parentdir_prefix, root, verbose=False): # Source tarballs conventionally unpack into a directory that includes # both the project name and a version string. dirname = os.path.basename(root) if not dirname.startswith(parentdir_prefix): if verbose: print( "guessing rootdir is '%s', but '%s' doesn't start with " "prefix '%s'" % (root, dirname, parentdir_prefix)) return None return {"version": dirname[len(parentdir_prefix):], "full": ""} def git_get_keywords(versionfile_abs): # the code embedded in _version.py can just fetch the value of these # keywords. When used from setup.py, we don't want to import _version.py, # so we do it with a regexp instead. This function is not used from # _version.py. keywords = {} try: f = open(versionfile_abs, "r") for line in f.readlines(): if line.strip().startswith("git_refnames ="): mo = re.search(r'=\s*"(.*)"', line) if mo: keywords["refnames"] = mo.group(1) if line.strip().startswith("git_full ="): mo = re.search(r'=\s*"(.*)"', line) if mo: keywords["full"] = mo.group(1) f.close() except EnvironmentError: pass return keywords def git_versions_from_keywords(keywords, tag_prefix, verbose=False): if not keywords: return {} # keyword-finding function failed to find keywords refnames = keywords["refnames"].strip() if refnames.startswith("$Format"): if verbose: print("keywords are unexpanded, not using") return {} # unexpanded, so not in an unpacked git-archive tarball refs = set([r.strip() for r in refnames.strip("()").split(",")]) # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of # just "foo-1.0". If we see a "tag: " prefix, prefer those. TAG = "tag: " tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)]) if not tags: # Either we're using git < 1.8.3, or there really are no tags. We use # a heuristic: assume all version tags have a digit. The old git %d # expansion behaves like git log --decorate=short and strips out the # refs/heads/ and refs/tags/ prefixes that would let us distinguish # between branches and tags. By ignoring refnames without digits, we # filter out many common branch names like "release" and # "stabilization", as well as "HEAD" and "master". tags = set([r for r in refs if re.search(r'\d', r)]) if verbose: print("discarding '%s', no digits" % ",".join(refs-tags)) if verbose: print("likely tags: %s" % ",".join(sorted(tags))) for ref in sorted(tags): # sorting will prefer e.g. "2.0" over "2.0rc1" if ref.startswith(tag_prefix): r = ref[len(tag_prefix):] if verbose: print("picking %s" % r) return { "version": r, "full": keywords["full"].strip()} # no suitable tags, so we use the full revision id if verbose: print("no suitable tags, using full revision id") return { "version": keywords["full"].strip(), "full": keywords["full"].strip()} def git_versions_from_vcs(tag_prefix, root, verbose=False): # this runs 'git' from the root of the source tree. This only gets called # if the git-archive 'subst' keywords were *not* expanded, and # _version.py hasn't already been rewritten with a short version string, # meaning we're inside a checked out source tree. if not os.path.exists(os.path.join(root, ".git")): if verbose: print("no .git in %s" % root) return {} GITS = ["git"] if sys.platform == "win32": GITS = ["git.cmd", "git.exe"] stdout = run_command(GITS, ["describe", "--tags", "--dirty", "--always"], cwd=root) if stdout is None: return {} if not stdout.startswith(tag_prefix): if verbose: print( "tag '%s' doesn't start with prefix '%s'" % (stdout, tag_prefix)) return {} tag = stdout[len(tag_prefix):] stdout = run_command(GITS, ["rev-parse", "HEAD"], cwd=root) if stdout is None: return {} full = stdout.strip() if tag.endswith("-dirty"): full += "-dirty" return {"version": tag, "full": full} def get_versions(default={"version": "unknown", "full": ""}, verbose=False): # I am in _version.py, which lives at ROOT/VERSIONFILE_SOURCE. If we have # __file__, we can work backwards from there to the root. Some # py2exe/bbfreeze/non-CPython implementations don't do __file__, in which # case we can only use expanded keywords. keywords = {"refnames": git_refnames, "full": git_full} ver = git_versions_from_keywords(keywords, tag_prefix, verbose) if ver: return ver try: root = os.path.abspath(__file__) # versionfile_source is the relative path from the top of the source # tree (where the .git directory might live) to this file. Invert # this to find the root from __file__. for i in range(len(versionfile_source.split(os.sep))): root = os.path.dirname(root) except NameError: return default return (git_versions_from_vcs(tag_prefix, root, verbose) or versions_from_parentdir(parentdir_prefix, root, verbose) or default) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/pg8000/core.py�����������������������������������������������������0000664�0000000�0000000�00000233574�12564727262�017505� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (c) 2007-2009, Mathieu Fenniak # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # * The name of the author may not be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. __author__ = "Mathieu Fenniak" import datetime from datetime import timedelta from . import ( Interval, min_int2, max_int2, min_int4, max_int4, min_int8, max_int8, Bytea, NotSupportedError, ProgrammingError, InternalError, IntegrityError, OperationalError, DatabaseError, InterfaceError, Error, ArrayContentNotHomogenousError, ArrayContentEmptyError, ArrayDimensionsNotConsistentError, ArrayContentNotSupportedError, Warning, i_unpack, ii_unpack, iii_unpack, h_pack, d_unpack, q_unpack, d_pack, f_unpack, q_pack, i_pack, h_unpack, dii_unpack, qii_unpack, ci_unpack, bh_unpack, ihihih_unpack, cccc_unpack, ii_pack, iii_pack, dii_pack, qii_pack) from warnings import warn import socket import threading from struct import pack from hashlib import md5 from decimal import Decimal from collections import deque, defaultdict from itertools import count, islice from .six.moves import map from .six import b, PY2, integer_types, next, PRE_26, text_type, u from sys import exc_info from uuid import UUID from copy import deepcopy from calendar import timegm import os from distutils.version import LooseVersion try: from json import loads except ImportError: pass # Can only use JSON with Python 2.6 and above ZERO = timedelta(0) class UTC(datetime.tzinfo): def utcoffset(self, dt): return ZERO def tzname(self, dt): return "UTC" def dst(self, dt): return ZERO utc = UTC() if PRE_26: bytearray = list FC_TEXT = 0 FC_BINARY = 1 BINARY_SPACE = b(" ") DDL_COMMANDS = b("ALTER"), b("CREATE") def convert_paramstyle(style, query): # I don't see any way to avoid scanning the query string char by char, # so we might as well take that careful approach and create a # state-based scanner. We'll use int variables for the state. # 0 -- outside quoted string # 1 -- inside single-quote string '...' # 2 -- inside quoted identifier "..." # 3 -- inside escaped single-quote string, E'...' # 4 -- inside parameter name eg. :name OUTSIDE = 0 INSIDE_SQ = 1 INSIDE_QI = 2 INSIDE_ES = 3 INSIDE_PN = 4 in_quote_escape = False in_param_escape = False placeholders = [] output_query = [] param_idx = map(lambda x: "$" + str(x), count(1)) state = OUTSIDE prev_c = None for i, c in enumerate(query): if i + 1 < len(query): next_c = query[i + 1] else: next_c = None if state == OUTSIDE: if c == "'": output_query.append(c) if prev_c == 'E': state = INSIDE_ES else: state = INSIDE_SQ elif c == '"': output_query.append(c) state = INSIDE_QI elif style == "qmark" and c == "?": output_query.append(next(param_idx)) elif style == "numeric" and c == ":": output_query.append("$") elif style == "named" and c == ":": state = INSIDE_PN placeholders.append('') elif style == "pyformat" and c == '%' and next_c == "(": state = INSIDE_PN placeholders.append('') elif style in ("format", "pyformat") and c == "%": style = "format" if in_param_escape: in_param_escape = False output_query.append(c) else: if next_c == "%": in_param_escape = True elif next_c == "s": state = INSIDE_PN output_query.append(next(param_idx)) else: raise InterfaceError( "Only %s and %% are supported in the query.") else: output_query.append(c) elif state == INSIDE_SQ: if c == "'": output_query.append(c) if in_quote_escape: in_quote_escape = False else: if next_c == "'": in_quote_escape = True else: state = OUTSIDE elif style in ("pyformat", "format") and c == "%": # hm... we're only going to support an escaped percent sign if in_param_escape: in_param_escape = False output_query.append(c) else: if next_c == "%": in_param_escape = True else: raise InterfaceError( "'%" + next_c + "' not supported in a quoted " "string within the query string") else: output_query.append(c) elif state == INSIDE_QI: if c == '"': state = OUTSIDE output_query.append(c) elif style in ("pyformat", "format") and c == "%": # hm... we're only going to support an escaped percent sign if in_param_escape: in_param_escape = False output_query.append(c) else: if next_c == "%": in_param_escape = True else: raise InterfaceError( "'%" + next_c + "' not supported in a quoted " "string within the query string") else: output_query.append(c) elif state == INSIDE_ES: if c == "'" and prev_c != "\\": # check for escaped single-quote output_query.append(c) state = OUTSIDE elif style in ("pyformat", "format") and c == "%": # hm... we're only going to support an escaped percent sign if in_param_escape: in_param_escape = False output_query.append(c) else: if next_c == "%": in_param_escape = True else: raise InterfaceError( "'%" + next_c + "' not supported in a quoted " "string within the query string.") else: output_query.append(c) elif state == INSIDE_PN: if style == 'named': placeholders[-1] += c if next_c is None or (not next_c.isalnum() and next_c != '_'): state = OUTSIDE try: pidx = placeholders.index(placeholders[-1], 0, -1) output_query.append("$" + str(pidx + 1)) del placeholders[-1] except ValueError: output_query.append("$" + str(len(placeholders))) elif style == 'pyformat': if prev_c == ')' and c == "s": state = OUTSIDE try: pidx = placeholders.index(placeholders[-1], 0, -1) output_query.append("$" + str(pidx + 1)) del placeholders[-1] except ValueError: output_query.append("$" + str(len(placeholders))) elif c in "()": pass else: placeholders[-1] += c elif style == 'format': state = OUTSIDE prev_c = c if style in ('numeric', 'qmark', 'format'): def make_args(vals): return vals else: def make_args(vals): return tuple(vals[p] for p in placeholders) return ''.join(output_query), make_args EPOCH = datetime.datetime(2000, 1, 1) EPOCH_TZ = EPOCH.replace(tzinfo=utc) EPOCH_SECONDS = timegm(EPOCH.timetuple()) utcfromtimestamp = datetime.datetime.utcfromtimestamp INFINITY_MICROSECONDS = 2 ** 63 - 1 MINUS_INFINITY_MICROSECONDS = -1 * INFINITY_MICROSECONDS - 1 # data is 64-bit integer representing microseconds since 2000-01-01 def timestamp_recv_integer(data, offset, length): micros = q_unpack(data, offset)[0] try: return EPOCH + timedelta(microseconds=micros) except OverflowError: if micros == INFINITY_MICROSECONDS: return datetime.datetime.max elif micros == MINUS_INFINITY_MICROSECONDS: return datetime.datetime.min else: raise exc_info()[1] # data is double-precision float representing seconds since 2000-01-01 def timestamp_recv_float(data, offset, length): return utcfromtimestamp(EPOCH_SECONDS + d_unpack(data, offset)[0]) # data is 64-bit integer representing microseconds since 2000-01-01 def timestamp_send_integer(v): if v == datetime.datetime.max: micros = INFINITY_MICROSECONDS elif v == datetime.datetime.min: micros = MINUS_INFINITY_MICROSECONDS else: micros = int( (timegm(v.timetuple()) - EPOCH_SECONDS) * 1e6) + v.microsecond return q_pack(micros) # data is double-precision float representing seconds since 2000-01-01 def timestamp_send_float(v): return d_pack(timegm(v.timetuple) + v.microsecond / 1e6 - EPOCH_SECONDS) def timestamptz_send_integer(v): # timestamps should be sent as UTC. If they have zone info, # convert them. return timestamp_send_integer(v.astimezone(utc).replace(tzinfo=None)) def timestamptz_send_float(v): # timestamps should be sent as UTC. If they have zone info, # convert them. return timestamp_send_float(v.astimezone(utc).replace(tzinfo=None)) DATETIME_MAX_TZ = datetime.datetime.max.replace(tzinfo=utc) DATETIME_MIN_TZ = datetime.datetime.min.replace(tzinfo=utc) # return a timezone-aware datetime instance if we're reading from a # "timestamp with timezone" type. The timezone returned will always be # UTC, but providing that additional information can permit conversion # to local. def timestamptz_recv_integer(data, offset, length): micros = q_unpack(data, offset)[0] try: return EPOCH_TZ + timedelta(microseconds=micros) except OverflowError: if micros == INFINITY_MICROSECONDS: return DATETIME_MAX_TZ elif micros == MINUS_INFINITY_MICROSECONDS: return DATETIME_MIN_TZ else: raise exc_info()[1] def timestamptz_recv_float(data, offset, length): return timestamp_recv_float(data, offset, length).replace(tzinfo=utc) def interval_send_integer(v): microseconds = v.microseconds try: microseconds += int(v.seconds * 1e6) except AttributeError: pass try: months = v.months except AttributeError: months = 0 return qii_pack(microseconds, v.days, months) def interval_send_float(v): seconds = v.microseconds / 1000.0 / 1000.0 try: seconds += v.seconds except AttributeError: pass try: months = v.months except AttributeError: months = 0 return dii_pack(seconds, v.days, months) def interval_recv_integer(data, offset, length): microseconds, days, months = qii_unpack(data, offset) if months == 0: seconds, micros = divmod(microseconds, 1e6) return datetime.timedelta(days, seconds, micros) else: return Interval(microseconds, days, months) def interval_recv_float(data, offset, length): seconds, days, months = dii_unpack(data, offset) if months == 0: secs, microseconds = divmod(seconds, 1e6) return datetime.timedelta(days, secs, microseconds) else: return Interval(int(seconds * 1000 * 1000), days, months) def int8_recv(data, offset, length): return q_unpack(data, offset)[0] def int2_recv(data, offset, length): return h_unpack(data, offset)[0] def int4_recv(data, offset, length): return i_unpack(data, offset)[0] def float4_recv(data, offset, length): return f_unpack(data, offset)[0] def float8_recv(data, offset, length): return d_unpack(data, offset)[0] def bytea_send(v): return v # bytea if PY2: def bytea_recv(data, offset, length): return Bytea(data[offset:offset + length]) else: def bytea_recv(data, offset, length): return data[offset:offset + length] def uuid_send(v): return v.bytes def uuid_recv(data, offset, length): return UUID(bytes=data[offset:offset+length]) TRUE = b("\x01") FALSE = b("\x00") def bool_send(v): return TRUE if v else FALSE NULL = i_pack(-1) NULL_BYTE = b('\x00') def null_send(v): return NULL def int_in(data, offset, length): return int(data[offset: offset + length]) class Cursor(): """A cursor object is returned by the :meth:`~Connection.cursor` method of a connection. It has the following attributes and methods: .. attribute:: arraysize This read/write attribute specifies the number of rows to fetch at a time with :meth:`fetchmany`. It defaults to 1. .. attribute:: connection This read-only attribute contains a reference to the connection object (an instance of :class:`Connection`) on which the cursor was created. This attribute is part of a DBAPI 2.0 extension. Accessing this attribute will generate the following warning: ``DB-API extension cursor.connection used``. .. attribute:: rowcount This read-only attribute contains the number of rows that the last ``execute()`` or ``executemany()`` method produced (for query statements like ``SELECT``) or affected (for modification statements like ``UPDATE``). The value is -1 if: - No ``execute()`` or ``executemany()`` method has been performed yet on the cursor. - There was no rowcount associated with the last ``execute()``. - At least one of the statements executed as part of an ``executemany()`` had no row count associated with it. - Using a ``SELECT`` query statement on PostgreSQL server older than version 9. - Using a ``COPY`` query statement on PostgreSQL server version 8.1 or older. This attribute is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. .. attribute:: description This read-only attribute is a sequence of 7-item sequences. Each value contains information describing one result column. The 7 items returned for each column are (name, type_code, display_size, internal_size, precision, scale, null_ok). Only the first two values are provided by the current implementation. This attribute is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ def __init__(self, connection): self._c = connection self.arraysize = 1 self.ps = None self._row_count = -1 self._cached_rows = deque() self.portal_name = None self.portal_suspended = False @property def connection(self): warn("DB-API extension cursor.connection used", stacklevel=3) return self._c @property def rowcount(self): return self._row_count description = property(lambda self: self._getDescription()) def _getDescription(self): if self.ps is None: return None row_desc = self.ps['row_desc'] if len(row_desc) == 0: return None columns = [] for col in row_desc: columns.append( (col["name"], col["type_oid"], None, None, None, None, None)) return columns ## # Executes a database operation. Parameters may be provided as a sequence # or mapping and will be bound to variables in the operation. # <p> # Stability: Part of the DBAPI 2.0 specification. def execute(self, operation, args=None, stream=None): """Executes a database operation. Parameters may be provided as a sequence, or as a mapping, depending upon the value of :data:`pg8000.paramstyle`. This method is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. :param operation: The SQL statement to execute. :param args: If :data:`paramstyle` is ``qmark``, ``numeric``, or ``format``, this argument should be an array of parameters to bind into the statement. If :data:`paramstyle` is ``named``, the argument should be a dict mapping of parameters. If the :data:`paramstyle` is ``pyformat``, the argument value may be either an array or a mapping. :param stream: This is a pg8000 extension for use with the PostgreSQL `COPY <http://www.postgresql.org/docs/current/static/sql-copy.html>`_ command. For a COPY FROM the parameter must be a readable file-like object, and for COPY TO it must be writable. .. versionadded:: 1.9.11 """ try: self._c._lock.acquire() self.stream = stream if not self._c.in_transaction and not self._c.autocommit: self._c.execute(self, "begin transaction", None) self._c.execute(self, operation, args) except AttributeError: if self._c is None: raise InterfaceError("Cursor closed") elif self._c._sock is None: raise InterfaceError("connection is closed") else: raise exc_info()[1] finally: self._c._lock.release() def executemany(self, operation, param_sets): """Prepare a database operation, and then execute it against all parameter sequences or mappings provided. This method is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. :param operation: The SQL statement to execute :param parameter_sets: A sequence of parameters to execute the statement with. The values in the sequence should be sequences or mappings of parameters, the same as the args argument of the :meth:`execute` method. """ rowcounts = [] for parameters in param_sets: self.execute(operation, parameters) rowcounts.append(self._row_count) self._row_count = -1 if -1 in rowcounts else sum(rowcounts) def fetchone(self): """Fetch the next row of a query result set. This method is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. :returns: A row as a sequence of field values, or ``None`` if no more rows are available. """ try: return next(self) except StopIteration: return None except TypeError: raise ProgrammingError("attempting to use unexecuted cursor") except AttributeError: raise ProgrammingError("attempting to use unexecuted cursor") def fetchmany(self, num=None): """Fetches the next set of rows of a query result. This method is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. :param size: The number of rows to fetch when called. If not provided, the :attr:`arraysize` attribute value is used instead. :returns: A sequence, each entry of which is a sequence of field values making up a row. If no more rows are available, an empty sequence will be returned. """ try: return tuple( islice(self, self.arraysize if num is None else num)) except TypeError: raise ProgrammingError("attempting to use unexecuted cursor") def fetchall(self): """Fetches all remaining rows of a query result. This method is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. :returns: A sequence, each entry of which is a sequence of field values making up a row. """ try: return tuple(self) except TypeError: raise ProgrammingError("attempting to use unexecuted cursor") def close(self): """Closes the cursor. This method is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ self._c = None def __iter__(self): """A cursor object is iterable to retrieve the rows from a query. This is a DBAPI 2.0 extension. """ return self def setinputsizes(self, sizes): """This method is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_, however, it is not implemented by pg8000. """ pass def setoutputsize(self, size, column=None): """This method is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_, however, it is not implemented by pg8000. """ pass def __next__(self): try: self._c._lock.acquire() return self._cached_rows.popleft() except IndexError: if self.portal_suspended: self._c.send_EXECUTE(self) self._c._write(SYNC_MSG) self._c._flush() self._c.handle_messages(self) if not self.portal_suspended: self._c.close_portal(self) try: return self._cached_rows.popleft() except IndexError: if self.ps is None: raise ProgrammingError("A query hasn't been issued.") elif len(self.ps['row_desc']) == 0: raise ProgrammingError("no result set") else: raise StopIteration() finally: self._c._lock.release() if PY2: Cursor.next = Cursor.__next__ # Message codes NOTICE_RESPONSE = b("N") AUTHENTICATION_REQUEST = b("R") PARAMETER_STATUS = b("S") BACKEND_KEY_DATA = b("K") READY_FOR_QUERY = b("Z") ROW_DESCRIPTION = b("T") ERROR_RESPONSE = b("E") DATA_ROW = b("D") COMMAND_COMPLETE = b("C") PARSE_COMPLETE = b("1") BIND_COMPLETE = b("2") CLOSE_COMPLETE = b("3") PORTAL_SUSPENDED = b("s") NO_DATA = b("n") PARAMETER_DESCRIPTION = b("t") NOTIFICATION_RESPONSE = b("A") COPY_DONE = b("c") COPY_DATA = b("d") COPY_IN_RESPONSE = b("G") COPY_OUT_RESPONSE = b("H") BIND = b("B") PARSE = b("P") EXECUTE = b("E") FLUSH = b('H') SYNC = b('S') PASSWORD = b('p') DESCRIBE = b('D') TERMINATE = b('X') CLOSE = b('C') FLUSH_MSG = FLUSH + i_pack(4) SYNC_MSG = SYNC + i_pack(4) TERMINATE_MSG = TERMINATE + i_pack(4) COPY_DONE_MSG = COPY_DONE + i_pack(4) # DESCRIBE constants STATEMENT = b('S') PORTAL = b('P') # ErrorResponse codes RESPONSE_SEVERITY = b("S") # always present RESPONSE_CODE = b("C") # always present RESPONSE_MSG = b("M") # always present RESPONSE_DETAIL = b("D") RESPONSE_HINT = b("H") RESPONSE_POSITION = b("P") RESPONSE__POSITION = b("p") RESPONSE__QUERY = b("q") RESPONSE_WHERE = b("W") RESPONSE_FILE = b("F") RESPONSE_LINE = b("L") RESPONSE_ROUTINE = b("R") IDLE = b("I") IDLE_IN_TRANSACTION = b("T") IDLE_IN_FAILED_TRANSACTION = b("E") # Byte1('N') - Identifier # Int32 - Message length # Any number of these, followed by a zero byte: # Byte1 - code identifying the field type (see responseKeys) # String - field value def data_into_dict(data): return dict((s[0:1], s[1:]) for s in data.split(NULL_BYTE)) arr_trans = dict(zip(map(ord, u("[] 'u")), list(u('{}')) + [None] * 3)) class MulticastDelegate(object): def __init__(self): self.delegates = [] def __iadd__(self, delegate): self.add(delegate) return self def add(self, delegate): self.delegates.append(delegate) def __isub__(self, delegate): self.delegates.remove(delegate) return self def __call__(self, *args, **kwargs): for d in self.delegates: d(*args, **kwargs) class Connection(object): """A connection object is returned by the :func:`pg8000.connect` function. It represents a single physical connection to a PostgreSQL database. .. attribute:: Connection.notifies A list of server-side notifications received by this database connection (via the LISTEN/NOTIFY PostgreSQL commands). Each list element is a two-element tuple containing the PostgreSQL backend PID that issued the notify, and the notification name. PostgreSQL will only send notifications to a client between transactions. The contents of this property are generally only populated after a commit or rollback of the current transaction. This list can be modified by a client application to clean out notifications as they are handled. However, inspecting or modifying this collection should only be done while holding the :attr:`notifies_lock` lock in order to guarantee thread-safety. This attribute is not part of the DBAPI standard; it is a pg8000 extension. .. versionadded:: 1.07 .. attribute:: Connection.notifies_lock A :class:`threading.Lock` object that should be held to read or modify the contents of the :attr:`notifies` list. This attribute is not part of the DBAPI standard; it is a pg8000 extension. .. versionadded:: 1.07 .. attribute:: Connection.autocommit Following the DB-API specification, autocommit is off by default. It can be turned on by setting this boolean pg8000-specific autocommit property to True. .. versionadded:: 1.9 .. exception:: Connection.Error Connection.Warning Connection.InterfaceError Connection.DatabaseError Connection.InternalError Connection.OperationalError Connection.ProgrammingError Connection.IntegrityError Connection.DataError Connection.NotSupportedError All of the standard database exception types are accessible via connection instances. This is a DBAPI 2.0 extension. Accessing any of these attributes will generate the warning ``DB-API extension connection.DatabaseError used``. """ # DBAPI Extension: supply exceptions as attributes on the connection Warning = property(lambda self: self._getError(Warning)) Error = property(lambda self: self._getError(Error)) InterfaceError = property(lambda self: self._getError(InterfaceError)) DatabaseError = property(lambda self: self._getError(DatabaseError)) OperationalError = property(lambda self: self._getError(OperationalError)) IntegrityError = property(lambda self: self._getError(IntegrityError)) InternalError = property(lambda self: self._getError(InternalError)) ProgrammingError = property(lambda self: self._getError(ProgrammingError)) NotSupportedError = property( lambda self: self._getError(NotSupportedError)) # Determines the number of rows to read from the database server at once. # Reading more rows increases performance at the cost of memory. The # default value is 100 rows. The effect of this parameter is transparent. # That is, the library reads more rows when the cache is empty # automatically. _row_cache_size = 100 _row_cache_size_bin = i_pack(_row_cache_size) def _getError(self, error): warn( "DB-API extension connection.%s used" % error.__name__, stacklevel=3) return error def __init__(self, user, host, unix_sock, port, database, password, ssl): self._client_encoding = "utf8" self._commands_with_count = ( b("INSERT"), b("DELETE"), b("UPDATE"), b("MOVE"), b("FETCH"), b("COPY"), b("SELECT")) self._lock = threading.Lock() if user is None: try: self.user = os.environ['PGUSER'] except KeyError: try: self.user = os.environ['USER'] except KeyError: raise InterfaceError( "The 'user' connection parameter was omitted, and " "neither the PGUSER or USER environment variables " "were set.") else: self.user = user if isinstance(self.user, text_type): self.user = self.user.encode('utf8') self.password = password self.autocommit = False self._xid = None self._caches = defaultdict(lambda: defaultdict(dict)) self.statement_number = 0 self.portal_number = 0 try: if unix_sock is None and host is not None: self._usock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) elif unix_sock is not None: if not hasattr(socket, "AF_UNIX"): raise InterfaceError( "attempt to connect to unix socket on unsupported " "platform") self._usock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) else: raise ProgrammingError( "one of host or unix_sock must be provided") if unix_sock is None and host is not None: self._usock.connect((host, port)) elif unix_sock is not None: self._usock.connect(unix_sock) if ssl: try: self._lock.acquire() import ssl as sslmodule # Int32(8) - Message length, including self. # Int32(80877103) - The SSL request code. self._usock.sendall(ii_pack(8, 80877103)) resp = self._usock.recv(1) if resp == b('S'): self._usock = sslmodule.wrap_socket(self._usock) else: raise InterfaceError("Server refuses SSL") except ImportError: raise InterfaceError( "SSL required but ssl module not available in " "this python installation") finally: self._lock.release() self._sock = self._usock.makefile(mode="rwb") except socket.error: self._usock.close() raise InterfaceError("communication error", exc_info()[1]) self._flush = self._sock.flush self._read = self._sock.read if PRE_26: self._write = self._sock.writelines else: self._write = self._sock.write self._backend_key_data = None ## # An event handler that is fired when the database server issues a # notice. # The value of this property is a MulticastDelegate. A callback # can be added by using connection.NotificationReceived += SomeMethod. # The method will be called with a single argument, an object that has # properties: severity, code, msg, and possibly others (detail, hint, # position, where, file, line, and routine). Callbacks can be removed # with the -= operator. # <p> # Stability: Added in v1.03, stability guaranteed for v1.xx. self.NoticeReceived = MulticastDelegate() ## # An event handler that is fired when a runtime configuration option is # changed on the server. The value of this property is a # MulticastDelegate. A callback can be added by using # connection.NotificationReceived += SomeMethod. Callbacks can be # removed with the -= operator. The method will be called with a single # argument, an object that has properties "key" and "value". # <p> # Stability: Added in v1.03, stability guaranteed for v1.xx. self.ParameterStatusReceived = MulticastDelegate() ## # An event handler that is fired when NOTIFY occurs for a notification # that has been LISTEN'd for. The value of this property is a # MulticastDelegate. A callback can be added by using # connection.NotificationReceived += SomeMethod. The method will be # called with a single argument, an object that has properties: # backend_pid, condition, and additional_info. Callbacks can be # removed with the -= operator. # <p> # Stability: Added in v1.03, stability guaranteed for v1.xx. self.NotificationReceived = MulticastDelegate() self.ParameterStatusReceived += self.handle_PARAMETER_STATUS def text_out(v): return v.encode(self._client_encoding) def time_out(v): return v.isoformat().encode(self._client_encoding) def date_out(v): if v == datetime.date.max: return 'infinity'.encode(self._client_encoding) elif v == datetime.date.min: return '-infinity'.encode(self._client_encoding) else: return v.isoformat().encode(self._client_encoding) def unknown_out(v): return str(v).encode(self._client_encoding) trans_tab = dict(zip(map(ord, u('{}')), u('[]'))) glbls = {'Decimal': Decimal} def array_in(data, idx, length): arr = [] prev_c = None for c in data[idx:idx+length].decode( self._client_encoding).translate( trans_tab).replace(u('NULL'), u('None')): if c not in ('[', ']', ',', 'N') and prev_c in ('[', ','): arr.extend("Decimal('") elif c in (']', ',') and prev_c not in ('[', ']', ',', 'e'): arr.extend("')") arr.append(c) prev_c = c return eval(''.join(arr), glbls) def array_recv(data, idx, length): final_idx = idx + length dim, hasnull, typeoid = iii_unpack(data, idx) idx += 12 # get type conversion method for typeoid conversion = self.pg_types[typeoid][1] # Read dimension info dim_lengths = [] for i in range(dim): dim_lengths.append(ii_unpack(data, idx)[0]) idx += 8 # Read all array values values = [] while idx < final_idx: element_len, = i_unpack(data, idx) idx += 4 if element_len == -1: values.append(None) else: values.append(conversion(data, idx, element_len)) idx += element_len # at this point, {{1,2,3},{4,5,6}}::int[][] looks like # [1,2,3,4,5,6]. go through the dimensions and fix up the array # contents to match expected dimensions for length in reversed(dim_lengths[1:]): values = list(map(list, zip(*[iter(values)] * length))) return values def vector_in(data, idx, length): return eval('[' + data[idx:idx+length].decode( self._client_encoding).replace(' ', ',') + ']') if PY2: def text_recv(data, offset, length): return unicode( # noqa data[offset: offset + length], self._client_encoding) def bool_recv(d, o, l): return d[o] == "\x01" def json_in(data, offset, length): return loads(unicode( # noqa data[offset: offset + length], self._client_encoding)) else: def text_recv(data, offset, length): return str( data[offset: offset + length], self._client_encoding) def bool_recv(data, offset, length): return data[offset] == 1 def json_in(data, offset, length): return loads( str(data[offset: offset + length], self._client_encoding)) def time_in(data, offset, length): hour = int(data[offset:offset + 2]) minute = int(data[offset + 3:offset + 5]) sec = Decimal( data[offset + 6:offset + length].decode(self._client_encoding)) return datetime.time( hour, minute, int(sec), int((sec - int(sec)) * 1000000)) def date_in(data, offset, length): year_str = data[offset:offset + 4].decode(self._client_encoding) if year_str == 'infi': return datetime.date.max elif year_str == '-inf': return datetime.date.min else: return datetime.date( int(year_str), int(data[offset + 5:offset + 7]), int(data[offset + 8:offset + 10])) def numeric_in(data, offset, length): return Decimal( data[offset: offset + length].decode(self._client_encoding)) def numeric_out(d): return str(d).encode(self._client_encoding) self.pg_types = defaultdict( lambda: (FC_TEXT, text_recv), { 16: (FC_BINARY, bool_recv), # boolean 17: (FC_BINARY, bytea_recv), # bytea 19: (FC_BINARY, text_recv), # name type 20: (FC_BINARY, int8_recv), # int8 21: (FC_BINARY, int2_recv), # int2 22: (FC_TEXT, vector_in), # int2vector 23: (FC_BINARY, int4_recv), # int4 25: (FC_BINARY, text_recv), # TEXT type 26: (FC_TEXT, int_in), # oid 28: (FC_TEXT, int_in), # xid 114: (FC_TEXT, json_in), # json 700: (FC_BINARY, float4_recv), # float4 701: (FC_BINARY, float8_recv), # float8 705: (FC_BINARY, text_recv), # unknown 829: (FC_TEXT, text_recv), # MACADDR type 1000: (FC_BINARY, array_recv), # BOOL[] 1003: (FC_BINARY, array_recv), # NAME[] 1005: (FC_BINARY, array_recv), # INT2[] 1007: (FC_BINARY, array_recv), # INT4[] 1009: (FC_BINARY, array_recv), # TEXT[] 1014: (FC_BINARY, array_recv), # CHAR[] 1015: (FC_BINARY, array_recv), # VARCHAR[] 1016: (FC_BINARY, array_recv), # INT8[] 1021: (FC_BINARY, array_recv), # FLOAT4[] 1022: (FC_BINARY, array_recv), # FLOAT8[] 1042: (FC_BINARY, text_recv), # CHAR type 1043: (FC_BINARY, text_recv), # VARCHAR type 1082: (FC_TEXT, date_in), # date 1083: (FC_TEXT, time_in), 1114: (FC_BINARY, timestamp_recv_float), # timestamp w/ tz 1184: (FC_BINARY, timestamptz_recv_float), 1186: (FC_BINARY, interval_recv_integer), 1231: (FC_TEXT, array_in), # NUMERIC[] 1263: (FC_BINARY, array_recv), # cstring[] 1700: (FC_TEXT, numeric_in), # NUMERIC 2275: (FC_BINARY, text_recv), # cstring 2950: (FC_BINARY, uuid_recv), # uuid 3802: (FC_TEXT, json_in), # jsonb }) self.py_types = { type(None): (-1, FC_BINARY, null_send), # null bool: (16, FC_BINARY, bool_send), int: (705, FC_TEXT, unknown_out), float: (701, FC_BINARY, d_pack), # float8 str: (705, FC_TEXT, text_out), # unknown datetime.date: (1082, FC_TEXT, date_out), # date datetime.time: (1083, FC_TEXT, time_out), # time 1114: (1114, FC_BINARY, timestamp_send_integer), # timestamp # timestamp w/ tz 1184: (1184, FC_BINARY, timestamptz_send_integer), datetime.timedelta: (1186, FC_BINARY, interval_send_integer), Interval: (1186, FC_BINARY, interval_send_integer), Decimal: (1700, FC_TEXT, numeric_out), # Decimal UUID: (2950, FC_BINARY, uuid_send), # uuid } self.inspect_funcs = { datetime.datetime: self.inspect_datetime, list: self.array_inspect, tuple: self.array_inspect, } if PY2: self.py_types[Bytea] = (17, FC_BINARY, bytea_send) # bytea self.py_types[text_type] = (705, FC_TEXT, text_out) # unknown self.py_types[long] = (705, FC_TEXT, unknown_out) # noqa else: self.py_types[bytes] = (17, FC_BINARY, bytea_send) # bytea try: from ipaddress import ( ip_address, IPv4Address, IPv6Address, ip_network, IPv4Network, IPv6Network) def inet_out(v): return str(v).encode(self._client_encoding) def inet_in(data, offset, length): inet_str = data[offset: offset + length].decode( self._client_encoding) if '/' in inet_str: return ip_network(inet_str, False) else: return ip_address(inet_str) self.py_types[IPv4Address] = (869, FC_TEXT, inet_out) # inet self.py_types[IPv6Address] = (869, FC_TEXT, inet_out) # inet self.py_types[IPv4Network] = (869, FC_TEXT, inet_out) # inet self.py_types[IPv6Network] = (869, FC_TEXT, inet_out) # inet self.pg_types[869] = (FC_TEXT, inet_in) # inet except ImportError: pass self.message_types = { NOTICE_RESPONSE: self.handle_NOTICE_RESPONSE, AUTHENTICATION_REQUEST: self.handle_AUTHENTICATION_REQUEST, PARAMETER_STATUS: self.handle_PARAMETER_STATUS, BACKEND_KEY_DATA: self.handle_BACKEND_KEY_DATA, READY_FOR_QUERY: self.handle_READY_FOR_QUERY, ROW_DESCRIPTION: self.handle_ROW_DESCRIPTION, ERROR_RESPONSE: self.handle_ERROR_RESPONSE, DATA_ROW: self.handle_DATA_ROW, COMMAND_COMPLETE: self.handle_COMMAND_COMPLETE, PARSE_COMPLETE: self.handle_PARSE_COMPLETE, BIND_COMPLETE: self.handle_BIND_COMPLETE, CLOSE_COMPLETE: self.handle_CLOSE_COMPLETE, PORTAL_SUSPENDED: self.handle_PORTAL_SUSPENDED, NO_DATA: self.handle_NO_DATA, PARAMETER_DESCRIPTION: self.handle_PARAMETER_DESCRIPTION, NOTIFICATION_RESPONSE: self.handle_NOTIFICATION_RESPONSE, COPY_DONE: self.handle_COPY_DONE, COPY_DATA: self.handle_COPY_DATA, COPY_IN_RESPONSE: self.handle_COPY_IN_RESPONSE, COPY_OUT_RESPONSE: self.handle_COPY_OUT_RESPONSE} # Int32 - Message length, including self. # Int32(196608) - Protocol version number. Version 3.0. # Any number of key/value pairs, terminated by a zero byte: # String - A parameter name (user, database, or options) # String - Parameter value protocol = 196608 val = bytearray( i_pack(protocol) + b("user\x00") + self.user + NULL_BYTE) if database is not None: if isinstance(database, text_type): database = database.encode('utf8') val.extend(b("database\x00") + database + NULL_BYTE) val.append(0) self._write(i_pack(len(val) + 4)) self._write(val) self._flush() self._cursor = self.cursor() try: self._lock.acquire() code = self.error = None while code not in (READY_FOR_QUERY, ERROR_RESPONSE): code, data_len = ci_unpack(self._read(5)) self.message_types[code](self._read(data_len - 4), None) if self.error is not None: raise self.error except: self._close() raise finally: self._lock.release() self.in_transaction = False self.notifies = [] self.notifies_lock = threading.Lock() def handle_ERROR_RESPONSE(self, data, ps): msg_dict = data_into_dict(data) if msg_dict[RESPONSE_CODE] == "28000": self.error = InterfaceError("md5 password authentication failed") else: self.error = ProgrammingError( msg_dict[RESPONSE_SEVERITY], msg_dict[RESPONSE_CODE], msg_dict[RESPONSE_MSG]) def handle_CLOSE_COMPLETE(self, data, ps): pass def handle_PARSE_COMPLETE(self, data, ps): # Byte1('1') - Identifier. # Int32(4) - Message length, including self. pass def handle_BIND_COMPLETE(self, data, ps): pass def handle_PORTAL_SUSPENDED(self, data, cursor): cursor.portal_suspended = True def handle_PARAMETER_DESCRIPTION(self, data, ps): # Well, we don't really care -- we're going to send whatever we # want and let the database deal with it. But thanks anyways! # count = h_unpack(data)[0] # type_oids = unpack_from("!" + "i" * count, data, 2) pass def handle_COPY_DONE(self, data, ps): self._copy_done = True def handle_COPY_OUT_RESPONSE(self, data, ps): # Int8(1) - 0 textual, 1 binary # Int16(2) - Number of columns # Int16(N) - Format codes for each column (0 text, 1 binary) is_binary, num_cols = bh_unpack(data) # column_formats = unpack_from('!' + 'h' * num_cols, data, 3) if ps.stream is None: raise InterfaceError( "An output stream is required for the COPY OUT response.") def handle_COPY_DATA(self, data, ps): ps.stream.write(data) def handle_COPY_IN_RESPONSE(self, data, ps): # Int16(2) - Number of columns # Int16(N) - Format codes for each column (0 text, 1 binary) is_binary, num_cols = bh_unpack(data) # column_formats = unpack_from('!' + 'h' * num_cols, data, 3) assert self._lock.locked() if ps.stream is None: raise InterfaceError( "An input stream is required for the COPY IN response.") if PY2: while True: data = ps.stream.read(8192) if not data: break self._write(COPY_DATA + i_pack(len(data) + 4)) self._write(data) self._flush() else: bffr = bytearray(8192) while True: bytes_read = ps.stream.readinto(bffr) if bytes_read == 0: break self._write(COPY_DATA + i_pack(bytes_read + 4)) self._write(bffr[:bytes_read]) self._flush() # Send CopyDone # Byte1('c') - Identifier. # Int32(4) - Message length, including self. self._write(COPY_DONE_MSG) self._write(SYNC_MSG) self._flush() def handle_NOTIFICATION_RESPONSE(self, data, ps): self.NotificationReceived(data) ## # A message sent if this connection receives a NOTIFY that it was # LISTENing for. # <p> # Stability: Added in pg8000 v1.03. When limited to accessing # properties from a notification event dispatch, stability is # guaranteed for v1.xx. backend_pid = i_unpack(data)[0] idx = 4 null = data.find(NULL_BYTE, idx) - idx condition = data[idx:idx + null].decode("ascii") idx += null + 1 null = data.find(NULL_BYTE, idx) - idx # additional_info = data[idx:idx + null] # psycopg2 compatible notification interface try: self.notifies_lock.acquire() self.notifies.append((backend_pid, condition)) finally: self.notifies_lock.release() def cursor(self): """Creates a :class:`Cursor` object bound to this connection. This function is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ return Cursor(self) def commit(self): """Commits the current database transaction. This function is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ try: self._lock.acquire() self.execute(self._cursor, "commit", None) finally: self._lock.release() def rollback(self): """Rolls back the current database transaction. This function is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ try: self._lock.acquire() self.execute(self._cursor, "rollback", None) finally: self._lock.release() def _close(self): try: # Byte1('X') - Identifies the message as a terminate message. # Int32(4) - Message length, including self. self._write(TERMINATE_MSG) self._flush() self._sock.close() self._usock.close() self._sock = None except AttributeError: raise InterfaceError("connection is closed") except ValueError: raise InterfaceError("connection is closed") def close(self): """Closes the database connection. This function is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ try: self._lock.acquire() self._close() finally: self._lock.release() def handle_AUTHENTICATION_REQUEST(self, data, cursor): assert self._lock.locked() # Int32 - An authentication code that represents different # authentication messages: # 0 = AuthenticationOk # 5 = MD5 pwd # 2 = Kerberos v5 (not supported by pg8000) # 3 = Cleartext pwd (not supported by pg8000) # 4 = crypt() pwd (not supported by pg8000) # 6 = SCM credential (not supported by pg8000) # 7 = GSSAPI (not supported by pg8000) # 8 = GSSAPI data (not supported by pg8000) # 9 = SSPI (not supported by pg8000) # Some authentication messages have additional data following the # authentication code. That data is documented in the appropriate # class. auth_code = i_unpack(data)[0] if auth_code == 0: pass elif auth_code == 3: if self.password is None: raise InterfaceError( "server requesting password authentication, but no " "password was provided") self._send_message( PASSWORD, self.password.encode("ascii") + NULL_BYTE) self._flush() elif auth_code == 5: ## # A message representing the backend requesting an MD5 hashed # password response. The response will be sent as # md5(md5(pwd + login) + salt). # Additional message data: # Byte4 - Hash salt. salt = b("").join(cccc_unpack(data, 4)) if self.password is None: raise InterfaceError( "server requesting MD5 password authentication, but no " "password was provided") pwd = b("md5") + md5( md5(self.password.encode("ascii") + self.user). hexdigest().encode("ascii") + salt).hexdigest().encode("ascii") # Byte1('p') - Identifies the message as a password message. # Int32 - Message length including self. # String - The password. Password may be encrypted. self._send_message(PASSWORD, pwd + NULL_BYTE) self._flush() elif auth_code in (2, 4, 6, 7, 8, 9): raise InterfaceError( "Authentication method " + str(auth_code) + " not supported by pg8000.") else: raise InterfaceError( "Authentication method " + str(auth_code) + " not recognized by pg8000.") def handle_READY_FOR_QUERY(self, data, ps): # Byte1 - Status indicator. self.in_transaction = data != IDLE def handle_BACKEND_KEY_DATA(self, data, ps): self._backend_key_data = data def inspect_datetime(self, value): if value.tzinfo is None: return self.py_types[1114] # timestamp else: return self.py_types[1184] # send as timestamptz def make_params(self, values): params = [] for value in values: typ = type(value) try: params.append(self.py_types[typ]) except KeyError: try: params.append(self.inspect_funcs[typ](value)) except KeyError: raise NotSupportedError( "type " + str(exc_info()[1]) + "not mapped to pg type") return params def handle_ROW_DESCRIPTION(self, data, cursor): count = h_unpack(data)[0] idx = 2 for i in range(count): name = data[idx:data.find(NULL_BYTE, idx)] idx += len(name) + 1 field = dict( zip(( "table_oid", "column_attrnum", "type_oid", "type_size", "type_modifier", "format"), ihihih_unpack(data, idx))) field['name'] = name idx += 18 cursor.ps['row_desc'].append(field) field['pg8000_fc'], field['func'] = \ self.pg_types[field['type_oid']] def execute(self, cursor, operation, vals): if vals is None: vals = () from . import paramstyle cache = self._caches[paramstyle] try: statement, make_args = cache['statement'][operation] except KeyError: statement, make_args = convert_paramstyle(paramstyle, operation) cache['statement'][operation] = statement, make_args args = make_args(vals) params = self.make_params(args) key = tuple(oid for oid, x, y in params), operation try: ps = cache['ps'][key] cursor.ps = ps except KeyError: statement_name = "pg8000_statement_" + str(self.statement_number) self.statement_number += 1 statement_name_bin = statement_name.encode('ascii') + NULL_BYTE ps = { 'row_desc': [], 'param_funcs': tuple(x[2] for x in params), } cursor.ps = ps param_fcs = tuple(x[1] for x in params) # Byte1('P') - Identifies the message as a Parse command. # Int32 - Message length, including self. # String - Prepared statement name. An empty string selects the # unnamed prepared statement. # String - The query string. # Int16 - Number of parameter data types specified (can be zero). # For each parameter: # Int32 - The OID of the parameter data type. val = bytearray(statement_name_bin) val.extend(statement.encode(self._client_encoding) + NULL_BYTE) val.extend(h_pack(len(params))) for oid, fc, send_func in params: # Parse message doesn't seem to handle the -1 type_oid for NULL # values that other messages handle. So we'll provide type_oid # 705, the PG "unknown" type. val.extend(i_pack(705 if oid == -1 else oid)) # Byte1('D') - Identifies the message as a describe command. # Int32 - Message length, including self. # Byte1 - 'S' for prepared statement, 'P' for portal. # String - The name of the item to describe. self._send_message(PARSE, val) self._send_message(DESCRIBE, STATEMENT + statement_name_bin) self._write(SYNC_MSG) try: self._flush() except AttributeError: if self._sock is None: raise InterfaceError("connection is closed") else: raise exc_info()[1] self.handle_messages(cursor) # We've got row_desc that allows us to identify what we're # going to get back from this statement. output_fc = tuple( self.pg_types[f['type_oid']][0] for f in ps['row_desc']) ps['input_funcs'] = tuple(f['func'] for f in ps['row_desc']) # Byte1('B') - Identifies the Bind command. # Int32 - Message length, including self. # String - Name of the destination portal. # String - Name of the source prepared statement. # Int16 - Number of parameter format codes. # For each parameter format code: # Int16 - The parameter format code. # Int16 - Number of parameter values. # For each parameter value: # Int32 - The length of the parameter value, in bytes, not # including this length. -1 indicates a NULL parameter # value, in which no value bytes follow. # Byte[n] - Value of the parameter. # Int16 - The number of result-column format codes. # For each result-column format code: # Int16 - The format code. ps['bind_1'] = statement_name_bin + h_pack(len(params)) + \ pack("!" + "h" * len(param_fcs), *param_fcs) + \ h_pack(len(params)) ps['bind_2'] = h_pack(len(output_fc)) + \ pack("!" + "h" * len(output_fc), *output_fc) cache['ps'][key] = ps cursor._cached_rows.clear() cursor._row_count = -1 cursor.portal_name = "pg8000_portal_" + str(self.portal_number) self.portal_number += 1 cursor.portal_name_bin = cursor.portal_name.encode('ascii') + NULL_BYTE cursor.execute_msg = cursor.portal_name_bin + \ Connection._row_cache_size_bin # Byte1('B') - Identifies the Bind command. # Int32 - Message length, including self. # String - Name of the destination portal. # String - Name of the source prepared statement. # Int16 - Number of parameter format codes. # For each parameter format code: # Int16 - The parameter format code. # Int16 - Number of parameter values. # For each parameter value: # Int32 - The length of the parameter value, in bytes, not # including this length. -1 indicates a NULL parameter # value, in which no value bytes follow. # Byte[n] - Value of the parameter. # Int16 - The number of result-column format codes. # For each result-column format code: # Int16 - The format code. retval = bytearray(cursor.portal_name_bin + ps['bind_1']) for value, send_func in zip(args, ps['param_funcs']): if value is None: val = NULL else: val = send_func(value) retval.extend(i_pack(len(val))) retval.extend(val) retval.extend(ps['bind_2']) self._send_message(BIND, retval) self.send_EXECUTE(cursor) self._write(SYNC_MSG) self._flush() self.handle_messages(cursor) if cursor.portal_suspended: if self.autocommit: raise InterfaceError( "With autocommit on, it's not possible to retrieve more " "rows than the pg8000 cache size, as the portal is closed " "when the transaction is closed.") else: self.close_portal(cursor) def _send_message(self, code, data): try: self._write(code) self._write(i_pack(len(data) + 4)) self._write(data) self._write(FLUSH_MSG) except ValueError: if str(exc_info()[1]) == "write to closed file": raise InterfaceError("connection is closed") else: raise exc_info()[1] except AttributeError: raise InterfaceError("connection is closed") def send_EXECUTE(self, cursor): # Byte1('E') - Identifies the message as an execute message. # Int32 - Message length, including self. # String - The name of the portal to execute. # Int32 - Maximum number of rows to return, if portal # contains a query # that returns rows. # 0 = no limit. cursor.portal_suspended = False self._send_message(EXECUTE, cursor.execute_msg) def handle_NO_DATA(self, msg, ps): pass def handle_COMMAND_COMPLETE(self, data, cursor): values = data[:-1].split(BINARY_SPACE) command = values[0] if command in self._commands_with_count: row_count = int(values[-1]) if cursor._row_count == -1: cursor._row_count = row_count else: cursor._row_count += row_count if command in DDL_COMMANDS: for k in self._caches: self._caches[k]['ps'].clear() def handle_DATA_ROW(self, data, cursor): data_idx = 2 row = [] for func in cursor.ps['input_funcs']: vlen = i_unpack(data, data_idx)[0] data_idx += 4 if vlen == -1: row.append(None) else: row.append(func(data, data_idx, vlen)) data_idx += vlen cursor._cached_rows.append(row) def handle_messages(self, cursor): code = self.error = None try: while code != READY_FOR_QUERY: code, data_len = ci_unpack(self._read(5)) self.message_types[code](self._read(data_len - 4), cursor) except: self._close() raise if self.error is not None: raise self.error # Byte1('C') - Identifies the message as a close command. # Int32 - Message length, including self. # Byte1 - 'S' for prepared statement, 'P' for portal. # String - The name of the item to close. def close_portal(self, cursor): self._send_message(CLOSE, PORTAL + cursor.portal_name_bin) self._write(SYNC_MSG) self._flush() self.handle_messages(cursor) def handle_NOTICE_RESPONSE(self, data, ps): resp = data_into_dict(data) self.NoticeReceived(resp) def handle_PARAMETER_STATUS(self, data, ps): pos = data.find(NULL_BYTE) key, value = data[:pos], data[pos + 1:-1] if key == b("client_encoding"): encoding = value.decode("ascii").lower() self._client_encoding = pg_to_py_encodings.get(encoding, encoding) elif key == b("integer_datetimes"): if value == b('on'): self.py_types[1114] = (1114, FC_BINARY, timestamp_send_integer) self.pg_types[1114] = (FC_BINARY, timestamp_recv_integer) self.py_types[1184] = ( 1184, FC_BINARY, timestamptz_send_integer) self.pg_types[1184] = (FC_BINARY, timestamptz_recv_integer) self.py_types[Interval] = ( 1186, FC_BINARY, interval_send_integer) self.py_types[datetime.timedelta] = ( 1186, FC_BINARY, interval_send_integer) self.pg_types[1186] = (FC_BINARY, interval_recv_integer) else: self.py_types[1114] = (1114, FC_BINARY, timestamp_send_float) self.pg_types[1114] = (FC_BINARY, timestamp_recv_float) self.py_types[1184] = (1184, FC_BINARY, timestamptz_send_float) self.pg_types[1184] = (FC_BINARY, timestamptz_recv_float) self.py_types[Interval] = ( 1186, FC_BINARY, interval_send_float) self.py_types[datetime.timedelta] = ( 1186, FC_BINARY, interval_send_float) self.pg_types[1186] = (FC_BINARY, interval_recv_float) elif key == b("server_version"): self._server_version = LooseVersion(value.decode('ascii')) if self._server_version < LooseVersion('8.2.0'): self._commands_with_count = ( b("INSERT"), b("DELETE"), b("UPDATE"), b("MOVE"), b("FETCH")) elif self._server_version < LooseVersion('9.0.0'): self._commands_with_count = ( b("INSERT"), b("DELETE"), b("UPDATE"), b("MOVE"), b("FETCH"), b("COPY")) def array_inspect(self, value): # Check if array has any values. If not, we can't determine the proper # array oid. first_element = array_find_first_element(value) if first_element is None: raise ArrayContentEmptyError("array has no values") # supported array output typ = type(first_element) if issubclass(typ, integer_types): # special int array support -- send as smallest possible array type typ = integer_types int2_ok, int4_ok, int8_ok = True, True, True for v in array_flatten(value): if v is None: continue if min_int2 < v < max_int2: continue int2_ok = False if min_int4 < v < max_int4: continue int4_ok = False if min_int8 < v < max_int8: continue int8_ok = False if int2_ok: array_oid = 1005 # INT2[] oid, fc, send_func = (21, FC_BINARY, h_pack) elif int4_ok: array_oid = 1007 # INT4[] oid, fc, send_func = (23, FC_BINARY, i_pack) elif int8_ok: array_oid = 1016 # INT8[] oid, fc, send_func = (20, FC_BINARY, q_pack) else: raise ArrayContentNotSupportedError( "numeric not supported as array contents") else: try: oid, fc, send_func = self.make_params((first_element,))[0] # If unknown, assume it's a string array if oid == 705: oid = 25 # Use binary ARRAY format to avoid having to properly # escape text in the array literals fc = FC_BINARY array_oid = pg_array_types[oid] except KeyError: raise ArrayContentNotSupportedError( "oid " + str(oid) + " not supported as array contents") except NotSupportedError: raise ArrayContentNotSupportedError( "type " + str(typ) + " not supported as array contents") if fc == FC_BINARY: def send_array(arr): # check for homogenous array for a, i, v in walk_array(arr): if not isinstance(v, (typ, type(None))): raise ArrayContentNotHomogenousError( "not all array elements are of type " + str(typ)) # check that all array dimensions are consistent array_check_dimensions(arr) has_null = array_has_null(arr) dim_lengths = array_dim_lengths(arr) data = bytearray(iii_pack(len(dim_lengths), has_null, oid)) for i in dim_lengths: data.extend(ii_pack(i, 1)) for v in array_flatten(arr): if v is None: data += i_pack(-1) else: inner_data = send_func(v) data += i_pack(len(inner_data)) data += inner_data return data else: def send_array(arr): for a, i, v in walk_array(arr): if not isinstance(v, (typ, type(None))): raise ArrayContentNotHomogenousError( "not all array elements are of type " + str(typ)) array_check_dimensions(arr) ar = deepcopy(arr) for a, i, v in walk_array(ar): if v is None: a[i] = 'NULL' else: a[i] = send_func(v).decode('ascii') return u(str(ar)).translate(arr_trans).encode('ascii') return (array_oid, fc, send_array) def xid(self, format_id, global_transaction_id, branch_qualifier): """Create a Transaction IDs (only global_transaction_id is used in pg) format_id and branch_qualifier are not used in postgres global_transaction_id may be any string identifier supported by postgres returns a tuple (format_id, global_transaction_id, branch_qualifier)""" return (format_id, global_transaction_id, branch_qualifier) def tpc_begin(self, xid): """Begins a TPC transaction with the given transaction ID xid. This method should be called outside of a transaction (i.e. nothing may have executed since the last .commit() or .rollback()). Furthermore, it is an error to call .commit() or .rollback() within the TPC transaction. A ProgrammingError is raised, if the application calls .commit() or .rollback() during an active TPC transaction. This function is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ self._xid = xid if self.autocommit: self.execute(self._cursor, "begin transaction", None) def tpc_prepare(self): """Performs the first phase of a transaction started with .tpc_begin(). A ProgrammingError is be raised if this method is called outside of a TPC transaction. After calling .tpc_prepare(), no statements can be executed until .tpc_commit() or .tpc_rollback() have been called. This function is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ q = "PREPARE TRANSACTION '%s';" % (self._xid[1],) self.execute(self._cursor, q, None) def tpc_commit(self, xid=None): """When called with no arguments, .tpc_commit() commits a TPC transaction previously prepared with .tpc_prepare(). If .tpc_commit() is called prior to .tpc_prepare(), a single phase commit is performed. A transaction manager may choose to do this if only a single resource is participating in the global transaction. When called with a transaction ID xid, the database commits the given transaction. If an invalid transaction ID is provided, a ProgrammingError will be raised. This form should be called outside of a transaction, and is intended for use in recovery. On return, the TPC transaction is ended. This function is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ if xid is None: xid = self._xid if xid is None: raise ProgrammingError( "Cannot tpc_commit() without a TPC transaction!") try: previous_autocommit_mode = self.autocommit self.autocommit = True if xid in self.tpc_recover(): self.execute( self._cursor, "COMMIT PREPARED '%s';" % (xid[1], ), None) else: # a single-phase commit self.commit() finally: self.autocommit = previous_autocommit_mode self._xid = None def tpc_rollback(self, xid=None): """When called with no arguments, .tpc_rollback() rolls back a TPC transaction. It may be called before or after .tpc_prepare(). When called with a transaction ID xid, it rolls back the given transaction. If an invalid transaction ID is provided, a ProgrammingError is raised. This form should be called outside of a transaction, and is intended for use in recovery. On return, the TPC transaction is ended. This function is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ if xid is None: xid = self._xid if xid is None: raise ProgrammingError( "Cannot tpc_rollback() without a TPC prepared transaction!") try: previous_autocommit_mode = self.autocommit self.autocommit = True if xid in self.tpc_recover(): # a two-phase rollback self.execute( self._cursor, "ROLLBACK PREPARED '%s';" % (xid[1],), None) else: # a single-phase rollback self.rollback() finally: self.autocommit = previous_autocommit_mode self._xid = None def tpc_recover(self): """Returns a list of pending transaction IDs suitable for use with .tpc_commit(xid) or .tpc_rollback(xid). This function is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ try: previous_autocommit_mode = self.autocommit self.autocommit = True curs = self.cursor() curs.execute("select gid FROM pg_prepared_xacts") return [self.xid(0, row[0], '') for row in curs] finally: self.autocommit = previous_autocommit_mode # pg element oid -> pg array typeoid pg_array_types = { 16: 1000, 25: 1009, # TEXT[] 701: 1022, 1700: 1231, # NUMERIC[] } # PostgreSQL encodings: # http://www.postgresql.org/docs/8.3/interactive/multibyte.html # Python encodings: # http://www.python.org/doc/2.4/lib/standard-encodings.html # # Commented out encodings don't require a name change between PostgreSQL and # Python. If the py side is None, then the encoding isn't supported. pg_to_py_encodings = { # Not supported: "mule_internal": None, "euc_tw": None, # Name fine as-is: # "euc_jp", # "euc_jis_2004", # "euc_kr", # "gb18030", # "gbk", # "johab", # "sjis", # "shift_jis_2004", # "uhc", # "utf8", # Different name: "euc_cn": "gb2312", "iso_8859_5": "is8859_5", "iso_8859_6": "is8859_6", "iso_8859_7": "is8859_7", "iso_8859_8": "is8859_8", "koi8": "koi8_r", "latin1": "iso8859-1", "latin2": "iso8859_2", "latin3": "iso8859_3", "latin4": "iso8859_4", "latin5": "iso8859_9", "latin6": "iso8859_10", "latin7": "iso8859_13", "latin8": "iso8859_14", "latin9": "iso8859_15", "sql_ascii": "ascii", "win866": "cp886", "win874": "cp874", "win1250": "cp1250", "win1251": "cp1251", "win1252": "cp1252", "win1253": "cp1253", "win1254": "cp1254", "win1255": "cp1255", "win1256": "cp1256", "win1257": "cp1257", "win1258": "cp1258", "unicode": "utf-8", # Needed for Amazon Redshift } def walk_array(arr): for i, v in enumerate(arr): if isinstance(v, list): for a, i2, v2 in walk_array(v): yield a, i2, v2 else: yield arr, i, v def array_find_first_element(arr): for v in array_flatten(arr): if v is not None: return v return None def array_flatten(arr): for v in arr: if isinstance(v, list): for v2 in array_flatten(v): yield v2 else: yield v def array_check_dimensions(arr): v0 = arr[0] if isinstance(v0, list): req_len = len(v0) req_inner_lengths = array_check_dimensions(v0) for v in arr: inner_lengths = array_check_dimensions(v) if len(v) != req_len or inner_lengths != req_inner_lengths: raise ArrayDimensionsNotConsistentError( "array dimensions not consistent") retval = [req_len] retval.extend(req_inner_lengths) return retval else: # make sure nothing else at this level is a list for v in arr: if isinstance(v, list): raise ArrayDimensionsNotConsistentError( "array dimensions not consistent") return [] def array_has_null(arr): for v in array_flatten(arr): if v is None: return True return False def array_dim_lengths(arr): v0 = arr[0] if isinstance(v0, list): retval = [len(v0)] retval.extend(array_dim_lengths(v0)) else: return [len(arr)] return retval ������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/ipaddr.py����������������������������������������������������������0000664�0000000�0000000�00000164272�12564727262�017100� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/python # # Copyright 2007 Google Inc. # Licensed to PSF under a Contributor Agreement. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. See the License for the specific language governing # permissions and limitations under the License. """A fast, lightweight IPv4/IPv6 manipulation library in Python. This library is used to create/poke/manipulate IPv4 and IPv6 addresses and networks. """ __version__ = '2.1.11' import struct IPV4LENGTH = 32 IPV6LENGTH = 128 class AddressValueError(ValueError): """A Value Error related to the address.""" class NetmaskValueError(ValueError): """A Value Error related to the netmask.""" def IPAddress(address, version=None): """Take an IP string/int and return an object of the correct type. Args: address: A string or integer, the IP address. Either IPv4 or IPv6 addresses may be supplied; integers less than 2**32 will be considered to be IPv4 by default. version: An Integer, 4 or 6. If set, don't try to automatically determine what the IP address type is. important for things like IPAddress(1), which could be IPv4, '0.0.0.1', or IPv6, '::1'. Returns: An IPv4Address or IPv6Address object. Raises: ValueError: if the string passed isn't either a v4 or a v6 address. """ if version: if version == 4: return IPv4Address(address) elif version == 6: return IPv6Address(address) try: return IPv4Address(address) except (AddressValueError, NetmaskValueError): pass try: return IPv6Address(address) except (AddressValueError, NetmaskValueError): pass raise ValueError('%r does not appear to be an IPv4 or IPv6 address' % address) def IPNetwork(address, version=None, strict=False): """Take an IP string/int and return an object of the correct type. Args: address: A string or integer, the IP address. Either IPv4 or IPv6 addresses may be supplied; integers less than 2**32 will be considered to be IPv4 by default. version: An Integer, if set, don't try to automatically determine what the IP address type is. important for things like IPNetwork(1), which could be IPv4, '0.0.0.1/32', or IPv6, '::1/128'. Returns: An IPv4Network or IPv6Network object. Raises: ValueError: if the string passed isn't either a v4 or a v6 address. Or if a strict network was requested and a strict network wasn't given. """ if version: if version == 4: return IPv4Network(address, strict) elif version == 6: return IPv6Network(address, strict) try: return IPv4Network(address, strict) except (AddressValueError, NetmaskValueError): pass try: return IPv6Network(address, strict) except (AddressValueError, NetmaskValueError): pass raise ValueError('%r does not appear to be an IPv4 or IPv6 network' % address) def v4_int_to_packed(address): """The binary representation of this address. Args: address: An integer representation of an IPv4 IP address. Returns: The binary representation of this address. Raises: ValueError: If the integer is too large to be an IPv4 IP address. """ if address > _BaseV4._ALL_ONES: raise ValueError('Address too large for IPv4') return Bytes(struct.pack('!I', address)) def v6_int_to_packed(address): """The binary representation of this address. Args: address: An integer representation of an IPv6 IP address. Returns: The binary representation of this address. """ return Bytes(struct.pack('!QQ', address >> 64, address & (2**64 - 1))) def _find_address_range(addresses): """Find a sequence of addresses. Args: addresses: a list of IPv4 or IPv6 addresses. Returns: A tuple containing the first and last IP addresses in the sequence. """ first = last = addresses[0] for ip in addresses[1:]: if ip._ip == last._ip + 1: last = ip else: break return (first, last) def _get_prefix_length(number1, number2, bits): """Get the number of leading bits that are same for two numbers. Args: number1: an integer. number2: another integer. bits: the maximum number of bits to compare. Returns: The number of leading bits that are the same for two numbers. """ for i in range(bits): if number1 >> i == number2 >> i: return bits - i return 0 def _count_righthand_zero_bits(number, bits): """Count the number of zero bits on the right hand side. Args: number: an integer. bits: maximum number of bits to count. Returns: The number of zero bits on the right hand side of the number. """ if number == 0: return bits for i in range(bits): if (number >> i) % 2: return i def summarize_address_range(first, last): """Summarize a network range given the first and last IP addresses. Example: >>> summarize_address_range(IPv4Address('1.1.1.0'), IPv4Address('1.1.1.130')) [IPv4Network('1.1.1.0/25'), IPv4Network('1.1.1.128/31'), IPv4Network('1.1.1.130/32')] Args: first: the first IPv4Address or IPv6Address in the range. last: the last IPv4Address or IPv6Address in the range. Returns: The address range collapsed to a list of IPv4Network's or IPv6Network's. Raise: TypeError: If the first and last objects are not IP addresses. If the first and last objects are not the same version. ValueError: If the last object is not greater than the first. If the version is not 4 or 6. """ if not (isinstance(first, _BaseIP) and isinstance(last, _BaseIP)): raise TypeError('first and last must be IP addresses, not networks') if first.version != last.version: raise TypeError("%s and %s are not of the same version" % ( str(first), str(last))) if first > last: raise ValueError('last IP address must be greater than first') networks = [] if first.version == 4: ip = IPv4Network elif first.version == 6: ip = IPv6Network else: raise ValueError('unknown IP version') ip_bits = first._max_prefixlen first_int = first._ip last_int = last._ip while first_int <= last_int: nbits = _count_righthand_zero_bits(first_int, ip_bits) current = None while nbits >= 0: addend = 2**nbits - 1 current = first_int + addend nbits -= 1 if current <= last_int: break prefix = _get_prefix_length(first_int, current, ip_bits) net = ip('%s/%d' % (str(first), prefix)) networks.append(net) if current == ip._ALL_ONES: break first_int = current + 1 first = IPAddress(first_int, version=first._version) return networks def _collapse_address_list_recursive(addresses): """Loops through the addresses, collapsing concurrent netblocks. Example: ip1 = IPv4Network('1.1.0.0/24') ip2 = IPv4Network('1.1.1.0/24') ip3 = IPv4Network('1.1.2.0/24') ip4 = IPv4Network('1.1.3.0/24') ip5 = IPv4Network('1.1.4.0/24') ip6 = IPv4Network('1.1.0.1/22') _collapse_address_list_recursive([ip1, ip2, ip3, ip4, ip5, ip6]) -> [IPv4Network('1.1.0.0/22'), IPv4Network('1.1.4.0/24')] This shouldn't be called directly; it is called via collapse_address_list([]). Args: addresses: A list of IPv4Network's or IPv6Network's Returns: A list of IPv4Network's or IPv6Network's depending on what we were passed. """ ret_array = [] optimized = False for cur_addr in addresses: if not ret_array: ret_array.append(cur_addr) continue if cur_addr in ret_array[-1]: optimized = True elif cur_addr == ret_array[-1].supernet().subnet()[1]: ret_array.append(ret_array.pop().supernet()) optimized = True else: ret_array.append(cur_addr) if optimized: return _collapse_address_list_recursive(ret_array) return ret_array def collapse_address_list(addresses): """Collapse a list of IP objects. Example: collapse_address_list([IPv4('1.1.0.0/24'), IPv4('1.1.1.0/24')]) -> [IPv4('1.1.0.0/23')] Args: addresses: A list of IPv4Network or IPv6Network objects. Returns: A list of IPv4Network or IPv6Network objects depending on what we were passed. Raises: TypeError: If passed a list of mixed version objects. """ i = 0 addrs = [] ips = [] nets = [] # split IP addresses and networks for ip in addresses: if isinstance(ip, _BaseIP): if ips and ips[-1]._version != ip._version: raise TypeError("%s and %s are not of the same version" % ( str(ip), str(ips[-1]))) ips.append(ip) elif ip._prefixlen == ip._max_prefixlen: if ips and ips[-1]._version != ip._version: raise TypeError("%s and %s are not of the same version" % ( str(ip), str(ips[-1]))) ips.append(ip.ip) else: if nets and nets[-1]._version != ip._version: raise TypeError("%s and %s are not of the same version" % ( str(ip), str(nets[-1]))) nets.append(ip) # sort and dedup ips = sorted(set(ips)) nets = sorted(set(nets)) while i < len(ips): (first, last) = _find_address_range(ips[i:]) i = ips.index(last) + 1 addrs.extend(summarize_address_range(first, last)) return _collapse_address_list_recursive(sorted( addrs + nets, key=_BaseNet._get_networks_key)) # backwards compatibility CollapseAddrList = collapse_address_list # We need to distinguish between the string and packed-bytes representations # of an IP address. For example, b'0::1' is the IPv4 address 48.58.58.49, # while '0::1' is an IPv6 address. # # In Python 3, the native 'bytes' type already provides this functionality, # so we use it directly. For earlier implementations where bytes is not a # distinct type, we create a subclass of str to serve as a tag. # # Usage example (Python 2): # ip = ipaddr.IPAddress(ipaddr.Bytes('xxxx')) # # Usage example (Python 3): # ip = ipaddr.IPAddress(b'xxxx') try: if bytes is str: raise TypeError("bytes is not a distinct type") Bytes = bytes except (NameError, TypeError): class Bytes(str): def __repr__(self): return 'Bytes(%s)' % str.__repr__(self) def get_mixed_type_key(obj): """Return a key suitable for sorting between networks and addresses. Address and Network objects are not sortable by default; they're fundamentally different so the expression IPv4Address('1.1.1.1') <= IPv4Network('1.1.1.1/24') doesn't make any sense. There are some times however, where you may wish to have ipaddr sort these for you anyway. If you need to do this, you can use this function as the key= argument to sorted(). Args: obj: either a Network or Address object. Returns: appropriate key. """ if isinstance(obj, _BaseNet): return obj._get_networks_key() elif isinstance(obj, _BaseIP): return obj._get_address_key() return NotImplemented class _IPAddrBase(object): """The mother class.""" def __index__(self): return self._ip def __int__(self): return self._ip def __hex__(self): return hex(self._ip) @property def exploded(self): """Return the longhand version of the IP address as a string.""" return self._explode_shorthand_ip_string() @property def compressed(self): """Return the shorthand version of the IP address as a string.""" return str(self) class _BaseIP(_IPAddrBase): """A generic IP object. This IP class contains the version independent methods which are used by single IP addresses. """ def __eq__(self, other): try: return (self._ip == other._ip and self._version == other._version) except AttributeError: return NotImplemented def __ne__(self, other): eq = self.__eq__(other) if eq is NotImplemented: return NotImplemented return not eq def __le__(self, other): gt = self.__gt__(other) if gt is NotImplemented: return NotImplemented return not gt def __ge__(self, other): lt = self.__lt__(other) if lt is NotImplemented: return NotImplemented return not lt def __lt__(self, other): if self._version != other._version: raise TypeError('%s and %s are not of the same version' % ( str(self), str(other))) if not isinstance(other, _BaseIP): raise TypeError('%s and %s are not of the same type' % ( str(self), str(other))) if self._ip != other._ip: return self._ip < other._ip return False def __gt__(self, other): if self._version != other._version: raise TypeError('%s and %s are not of the same version' % ( str(self), str(other))) if not isinstance(other, _BaseIP): raise TypeError('%s and %s are not of the same type' % ( str(self), str(other))) if self._ip != other._ip: return self._ip > other._ip return False # Shorthand for Integer addition and subtraction. This is not # meant to ever support addition/subtraction of addresses. def __add__(self, other): if not isinstance(other, int): return NotImplemented return IPAddress(int(self) + other, version=self._version) def __sub__(self, other): if not isinstance(other, int): return NotImplemented return IPAddress(int(self) - other, version=self._version) def __repr__(self): return '%s(%r)' % (self.__class__.__name__, str(self)) def __str__(self): return '%s' % self._string_from_ip_int(self._ip) def __hash__(self): return hash(hex(long(self._ip))) def _get_address_key(self): return (self._version, self) @property def version(self): raise NotImplementedError('BaseIP has no version') class _BaseNet(_IPAddrBase): """A generic IP object. This IP class contains the version independent methods which are used by networks. """ def __init__(self, address): self._cache = {} def __repr__(self): return '%s(%r)' % (self.__class__.__name__, str(self)) def iterhosts(self): """Generate Iterator over usable hosts in a network. This is like __iter__ except it doesn't return the network or broadcast addresses. """ cur = int(self.network) + 1 bcast = int(self.broadcast) - 1 while cur <= bcast: cur += 1 yield IPAddress(cur - 1, version=self._version) def __iter__(self): cur = int(self.network) bcast = int(self.broadcast) while cur <= bcast: cur += 1 yield IPAddress(cur - 1, version=self._version) def __getitem__(self, n): network = int(self.network) broadcast = int(self.broadcast) if n >= 0: if network + n > broadcast: raise IndexError return IPAddress(network + n, version=self._version) else: n += 1 if broadcast + n < network: raise IndexError return IPAddress(broadcast + n, version=self._version) def __lt__(self, other): if self._version != other._version: raise TypeError('%s and %s are not of the same version' % ( str(self), str(other))) if not isinstance(other, _BaseNet): raise TypeError('%s and %s are not of the same type' % ( str(self), str(other))) if self.network != other.network: return self.network < other.network if self.netmask != other.netmask: return self.netmask < other.netmask return False def __gt__(self, other): if self._version != other._version: raise TypeError('%s and %s are not of the same version' % ( str(self), str(other))) if not isinstance(other, _BaseNet): raise TypeError('%s and %s are not of the same type' % ( str(self), str(other))) if self.network != other.network: return self.network > other.network if self.netmask != other.netmask: return self.netmask > other.netmask return False def __le__(self, other): gt = self.__gt__(other) if gt is NotImplemented: return NotImplemented return not gt def __ge__(self, other): lt = self.__lt__(other) if lt is NotImplemented: return NotImplemented return not lt def __eq__(self, other): try: return (self._version == other._version and self.network == other.network and int(self.netmask) == int(other.netmask)) except AttributeError: if isinstance(other, _BaseIP): return (self._version == other._version and self._ip == other._ip) def __ne__(self, other): eq = self.__eq__(other) if eq is NotImplemented: return NotImplemented return not eq def __str__(self): return '%s/%s' % (str(self.ip), str(self._prefixlen)) def __hash__(self): return hash(int(self.network) ^ int(self.netmask)) def __contains__(self, other): # always false if one is v4 and the other is v6. if self._version != other._version: return False # dealing with another network. if isinstance(other, _BaseNet): return (self.network <= other.network and self.broadcast >= other.broadcast) # dealing with another address else: return (int(self.network) <= int(other._ip) <= int(self.broadcast)) def overlaps(self, other): """Tell if self is partly contained in other.""" return self.network in other or self.broadcast in other or ( other.network in self or other.broadcast in self) @property def network(self): x = self._cache.get('network') if x is None: x = IPAddress(self._ip & int(self.netmask), version=self._version) self._cache['network'] = x return x @property def broadcast(self): x = self._cache.get('broadcast') if x is None: x = IPAddress(self._ip | int(self.hostmask), version=self._version) self._cache['broadcast'] = x return x @property def hostmask(self): x = self._cache.get('hostmask') if x is None: x = IPAddress(int(self.netmask) ^ self._ALL_ONES, version=self._version) self._cache['hostmask'] = x return x @property def with_prefixlen(self): return '%s/%d' % (str(self.ip), self._prefixlen) @property def with_netmask(self): return '%s/%s' % (str(self.ip), str(self.netmask)) @property def with_hostmask(self): return '%s/%s' % (str(self.ip), str(self.hostmask)) @property def numhosts(self): """Number of hosts in the current subnet.""" return int(self.broadcast) - int(self.network) + 1 @property def version(self): raise NotImplementedError('BaseNet has no version') @property def prefixlen(self): return self._prefixlen def address_exclude(self, other): """Remove an address from a larger block. For example: addr1 = IPNetwork('10.1.1.0/24') addr2 = IPNetwork('10.1.1.0/26') addr1.address_exclude(addr2) = [IPNetwork('10.1.1.64/26'), IPNetwork('10.1.1.128/25')] or IPv6: addr1 = IPNetwork('::1/32') addr2 = IPNetwork('::1/128') addr1.address_exclude(addr2) = [IPNetwork('::0/128'), IPNetwork('::2/127'), IPNetwork('::4/126'), IPNetwork('::8/125'), ... IPNetwork('0:0:8000::/33')] Args: other: An IPvXNetwork object of the same type. Returns: A sorted list of IPvXNetwork objects addresses which is self minus other. Raises: TypeError: If self and other are of difffering address versions, or if other is not a network object. ValueError: If other is not completely contained by self. """ if not self._version == other._version: raise TypeError("%s and %s are not of the same version" % ( str(self), str(other))) if not isinstance(other, _BaseNet): raise TypeError("%s is not a network object" % str(other)) if other not in self: raise ValueError('%s not contained in %s' % (str(other), str(self))) if other == self: return [] ret_addrs = [] # Make sure we're comparing the network of other. other = IPNetwork('%s/%s' % (str(other.network), str(other.prefixlen)), version=other._version) s1, s2 = self.subnet() while s1 != other and s2 != other: if other in s1: ret_addrs.append(s2) s1, s2 = s1.subnet() elif other in s2: ret_addrs.append(s1) s1, s2 = s2.subnet() else: # If we got here, there's a bug somewhere. assert True == False, ('Error performing exclusion: ' 's1: %s s2: %s other: %s' % (str(s1), str(s2), str(other))) if s1 == other: ret_addrs.append(s2) elif s2 == other: ret_addrs.append(s1) else: # If we got here, there's a bug somewhere. assert True == False, ('Error performing exclusion: ' 's1: %s s2: %s other: %s' % (str(s1), str(s2), str(other))) return sorted(ret_addrs, key=_BaseNet._get_networks_key) def compare_networks(self, other): """Compare two IP objects. This is only concerned about the comparison of the integer representation of the network addresses. This means that the host bits aren't considered at all in this method. If you want to compare host bits, you can easily enough do a 'HostA._ip < HostB._ip' Args: other: An IP object. Returns: If the IP versions of self and other are the same, returns: -1 if self < other: eg: IPv4('1.1.1.0/24') < IPv4('1.1.2.0/24') IPv6('1080::200C:417A') < IPv6('1080::200B:417B') 0 if self == other eg: IPv4('1.1.1.1/24') == IPv4('1.1.1.2/24') IPv6('1080::200C:417A/96') == IPv6('1080::200C:417B/96') 1 if self > other eg: IPv4('1.1.1.0/24') > IPv4('1.1.0.0/24') IPv6('1080::1:200C:417A/112') > IPv6('1080::0:200C:417A/112') If the IP versions of self and other are different, returns: -1 if self._version < other._version eg: IPv4('10.0.0.1/24') < IPv6('::1/128') 1 if self._version > other._version eg: IPv6('::1/128') > IPv4('255.255.255.0/24') """ if self._version < other._version: return -1 if self._version > other._version: return 1 # self._version == other._version below here: if self.network < other.network: return -1 if self.network > other.network: return 1 # self.network == other.network below here: if self.netmask < other.netmask: return -1 if self.netmask > other.netmask: return 1 # self.network == other.network and self.netmask == other.netmask return 0 def _get_networks_key(self): """Network-only key function. Returns an object that identifies this address' network and netmask. This function is a suitable "key" argument for sorted() and list.sort(). """ return (self._version, self.network, self.netmask) def _ip_int_from_prefix(self, prefixlen): """Turn the prefix length into a bitwise netmask. Args: prefixlen: An integer, the prefix length. Returns: An integer. """ return self._ALL_ONES ^ (self._ALL_ONES >> prefixlen) def _prefix_from_ip_int(self, ip_int): """Return prefix length from a bitwise netmask. Args: ip_int: An integer, the netmask in expanded bitwise format. Returns: An integer, the prefix length. Raises: NetmaskValueError: If the input is not a valid netmask. """ prefixlen = self._max_prefixlen while prefixlen: if ip_int & 1: break ip_int >>= 1 prefixlen -= 1 if ip_int == (1 << prefixlen) - 1: return prefixlen else: raise NetmaskValueError('Bit pattern does not match /1*0*/') def _prefix_from_prefix_string(self, prefixlen_str): """Turn a prefix length string into an integer. Args: prefixlen_str: A decimal string containing the prefix length. Returns: The prefix length as an integer. Raises: NetmaskValueError: If the input is malformed or out of range. """ try: if not _BaseV4._DECIMAL_DIGITS.issuperset(prefixlen_str): raise ValueError prefixlen = int(prefixlen_str) if not (0 <= prefixlen <= self._max_prefixlen): raise ValueError except ValueError: raise NetmaskValueError('%s is not a valid prefix length' % prefixlen_str) return prefixlen def _prefix_from_ip_string(self, ip_str): """Turn a netmask/hostmask string into a prefix length. Args: ip_str: A netmask or hostmask, formatted as an IP address. Returns: The prefix length as an integer. Raises: NetmaskValueError: If the input is not a netmask or hostmask. """ # Parse the netmask/hostmask like an IP address. try: ip_int = self._ip_int_from_string(ip_str) except AddressValueError: raise NetmaskValueError('%s is not a valid netmask' % ip_str) # Try matching a netmask (this would be /1*0*/ as a bitwise regexp). # Note that the two ambiguous cases (all-ones and all-zeroes) are # treated as netmasks. try: return self._prefix_from_ip_int(ip_int) except NetmaskValueError: pass # Invert the bits, and try matching a /0+1+/ hostmask instead. ip_int ^= self._ALL_ONES try: return self._prefix_from_ip_int(ip_int) except NetmaskValueError: raise NetmaskValueError('%s is not a valid netmask' % ip_str) def iter_subnets(self, prefixlen_diff=1, new_prefix=None): """The subnets which join to make the current subnet. In the case that self contains only one IP (self._prefixlen == 32 for IPv4 or self._prefixlen == 128 for IPv6), return a list with just ourself. Args: prefixlen_diff: An integer, the amount the prefix length should be increased by. This should not be set if new_prefix is also set. new_prefix: The desired new prefix length. This must be a larger number (smaller prefix) than the existing prefix. This should not be set if prefixlen_diff is also set. Returns: An iterator of IPv(4|6) objects. Raises: ValueError: The prefixlen_diff is too small or too large. OR prefixlen_diff and new_prefix are both set or new_prefix is a smaller number than the current prefix (smaller number means a larger network) """ if self._prefixlen == self._max_prefixlen: yield self return if new_prefix is not None: if new_prefix < self._prefixlen: raise ValueError('new prefix must be longer') if prefixlen_diff != 1: raise ValueError('cannot set prefixlen_diff and new_prefix') prefixlen_diff = new_prefix - self._prefixlen if prefixlen_diff < 0: raise ValueError('prefix length diff must be > 0') new_prefixlen = self._prefixlen + prefixlen_diff if new_prefixlen > self._max_prefixlen: raise ValueError( 'prefix length diff %d is invalid for netblock %s' % ( new_prefixlen, str(self))) first = IPNetwork('%s/%s' % (str(self.network), str(self._prefixlen + prefixlen_diff)), version=self._version) yield first current = first while True: broadcast = current.broadcast if broadcast == self.broadcast: return new_addr = IPAddress(int(broadcast) + 1, version=self._version) current = IPNetwork('%s/%s' % (str(new_addr), str(new_prefixlen)), version=self._version) yield current def masked(self): """Return the network object with the host bits masked out.""" return IPNetwork('%s/%d' % (self.network, self._prefixlen), version=self._version) def subnet(self, prefixlen_diff=1, new_prefix=None): """Return a list of subnets, rather than an iterator.""" return list(self.iter_subnets(prefixlen_diff, new_prefix)) def supernet(self, prefixlen_diff=1, new_prefix=None): """The supernet containing the current network. Args: prefixlen_diff: An integer, the amount the prefix length of the network should be decreased by. For example, given a /24 network and a prefixlen_diff of 3, a supernet with a /21 netmask is returned. Returns: An IPv4 network object. Raises: ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have a negative prefix length. OR If prefixlen_diff and new_prefix are both set or new_prefix is a larger number than the current prefix (larger number means a smaller network) """ if self._prefixlen == 0: return self if new_prefix is not None: if new_prefix > self._prefixlen: raise ValueError('new prefix must be shorter') if prefixlen_diff != 1: raise ValueError('cannot set prefixlen_diff and new_prefix') prefixlen_diff = self._prefixlen - new_prefix if self.prefixlen - prefixlen_diff < 0: raise ValueError( 'current prefixlen is %d, cannot have a prefixlen_diff of %d' % (self.prefixlen, prefixlen_diff)) return IPNetwork('%s/%s' % (str(self.network), str(self.prefixlen - prefixlen_diff)), version=self._version) # backwards compatibility Subnet = subnet Supernet = supernet AddressExclude = address_exclude CompareNetworks = compare_networks Contains = __contains__ class _BaseV4(object): """Base IPv4 object. The following methods are used by IPv4 objects in both single IP addresses and networks. """ # Equivalent to 255.255.255.255 or 32 bits of 1's. _ALL_ONES = (2**IPV4LENGTH) - 1 _DECIMAL_DIGITS = frozenset('0123456789') def __init__(self, address): self._version = 4 self._max_prefixlen = IPV4LENGTH def _explode_shorthand_ip_string(self): return str(self) def _ip_int_from_string(self, ip_str): """Turn the given IP string into an integer for comparison. Args: ip_str: A string, the IP ip_str. Returns: The IP ip_str as an integer. Raises: AddressValueError: if ip_str isn't a valid IPv4 Address. """ octets = ip_str.split('.') if len(octets) != 4: raise AddressValueError(ip_str) packed_ip = 0 for oc in octets: try: packed_ip = (packed_ip << 8) | self._parse_octet(oc) except ValueError: raise AddressValueError(ip_str) return packed_ip def _parse_octet(self, octet_str): """Convert a decimal octet into an integer. Args: octet_str: A string, the number to parse. Returns: The octet as an integer. Raises: ValueError: if the octet isn't strictly a decimal from [0..255]. """ # Whitelist the characters, since int() allows a lot of bizarre stuff. if not self._DECIMAL_DIGITS.issuperset(octet_str): raise ValueError octet_int = int(octet_str, 10) # Disallow leading zeroes, because no clear standard exists on # whether these should be interpreted as decimal or octal. if octet_int > 255 or (octet_str[0] == '0' and len(octet_str) > 1): raise ValueError return octet_int def _string_from_ip_int(self, ip_int): """Turns a 32-bit integer into dotted decimal notation. Args: ip_int: An integer, the IP address. Returns: The IP address as a string in dotted decimal notation. """ octets = [] for _ in xrange(4): octets.insert(0, str(ip_int & 0xFF)) ip_int >>= 8 return '.'.join(octets) @property def max_prefixlen(self): return self._max_prefixlen @property def packed(self): """The binary representation of this address.""" return v4_int_to_packed(self._ip) @property def version(self): return self._version @property def is_reserved(self): """Test if the address is otherwise IETF reserved. Returns: A boolean, True if the address is within the reserved IPv4 Network range. """ return self in IPv4Network('240.0.0.0/4') @property def is_private(self): """Test if this address is allocated for private networks. Returns: A boolean, True if the address is reserved per RFC 1918. """ return (self in IPv4Network('10.0.0.0/8') or self in IPv4Network('172.16.0.0/12') or self in IPv4Network('192.168.0.0/16')) @property def is_multicast(self): """Test if the address is reserved for multicast use. Returns: A boolean, True if the address is multicast. See RFC 3171 for details. """ return self in IPv4Network('224.0.0.0/4') @property def is_unspecified(self): """Test if the address is unspecified. Returns: A boolean, True if this is the unspecified address as defined in RFC 5735 3. """ return self in IPv4Network('0.0.0.0') @property def is_loopback(self): """Test if the address is a loopback address. Returns: A boolean, True if the address is a loopback per RFC 3330. """ return self in IPv4Network('127.0.0.0/8') @property def is_link_local(self): """Test if the address is reserved for link-local. Returns: A boolean, True if the address is link-local per RFC 3927. """ return self in IPv4Network('169.254.0.0/16') class IPv4Address(_BaseV4, _BaseIP): """Represent and manipulate single IPv4 Addresses.""" def __init__(self, address): """ Args: address: A string or integer representing the IP '192.168.1.1' Additionally, an integer can be passed, so IPv4Address('192.168.1.1') == IPv4Address(3232235777). or, more generally IPv4Address(int(IPv4Address('192.168.1.1'))) == IPv4Address('192.168.1.1') Raises: AddressValueError: If ipaddr isn't a valid IPv4 address. """ _BaseV4.__init__(self, address) # Efficient constructor from integer. if isinstance(address, (int, long)): self._ip = address if address < 0 or address > self._ALL_ONES: raise AddressValueError(address) return # Constructing from a packed address if isinstance(address, Bytes): try: self._ip, = struct.unpack('!I', address) except struct.error: raise AddressValueError(address) # Wrong length. return # Assume input argument to be string or any object representation # which converts into a formatted IP string. addr_str = str(address) self._ip = self._ip_int_from_string(addr_str) class IPv4Network(_BaseV4, _BaseNet): """This class represents and manipulates 32-bit IPv4 networks. Attributes: [examples for IPv4Network('1.2.3.4/27')] ._ip: 16909060 .ip: IPv4Address('1.2.3.4') .network: IPv4Address('1.2.3.0') .hostmask: IPv4Address('0.0.0.31') .broadcast: IPv4Address('1.2.3.31') .netmask: IPv4Address('255.255.255.224') .prefixlen: 27 """ def __init__(self, address, strict=False): """Instantiate a new IPv4 network object. Args: address: A string or integer representing the IP [& network]. '192.168.1.1/24' '192.168.1.1/255.255.255.0' '192.168.1.1/0.0.0.255' are all functionally the same in IPv4. Similarly, '192.168.1.1' '192.168.1.1/255.255.255.255' '192.168.1.1/32' are also functionaly equivalent. That is to say, failing to provide a subnetmask will create an object with a mask of /32. If the mask (portion after the / in the argument) is given in dotted quad form, it is treated as a netmask if it starts with a non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it starts with a zero field (e.g. 0.255.255.255 == /8), with the single exception of an all-zero mask which is treated as a netmask == /0. If no mask is given, a default of /32 is used. Additionally, an integer can be passed, so IPv4Network('192.168.1.1') == IPv4Network(3232235777). or, more generally IPv4Network(int(IPv4Network('192.168.1.1'))) == IPv4Network('192.168.1.1') strict: A boolean. If true, ensure that we have been passed A true network address, eg, 192.168.1.0/24 and not an IP address on a network, eg, 192.168.1.1/24. Raises: AddressValueError: If ipaddr isn't a valid IPv4 address. NetmaskValueError: If the netmask isn't valid for an IPv4 address. ValueError: If strict was True and a network address was not supplied. """ _BaseNet.__init__(self, address) _BaseV4.__init__(self, address) # Constructing from an integer or packed bytes. if isinstance(address, (int, long, Bytes)): self.ip = IPv4Address(address) self._ip = self.ip._ip self._prefixlen = self._max_prefixlen self.netmask = IPv4Address(self._ALL_ONES) return # Assume input argument to be string or any object representation # which converts into a formatted IP prefix string. addr = str(address).split('/') if len(addr) > 2: raise AddressValueError(address) self._ip = self._ip_int_from_string(addr[0]) self.ip = IPv4Address(self._ip) if len(addr) == 2: try: # Check for a netmask in prefix length form. self._prefixlen = self._prefix_from_prefix_string(addr[1]) except NetmaskValueError: # Check for a netmask or hostmask in dotted-quad form. # This may raise NetmaskValueError. self._prefixlen = self._prefix_from_ip_string(addr[1]) else: self._prefixlen = self._max_prefixlen self.netmask = IPv4Address(self._ip_int_from_prefix(self._prefixlen)) if strict: if self.ip != self.network: raise ValueError('%s has host bits set' % self.ip) if self._prefixlen == (self._max_prefixlen - 1): self.iterhosts = self.__iter__ # backwards compatibility IsRFC1918 = lambda self: self.is_private IsMulticast = lambda self: self.is_multicast IsLoopback = lambda self: self.is_loopback IsLinkLocal = lambda self: self.is_link_local class _BaseV6(object): """Base IPv6 object. The following methods are used by IPv6 objects in both single IP addresses and networks. """ _ALL_ONES = (2**IPV6LENGTH) - 1 _HEXTET_COUNT = 8 _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef') def __init__(self, address): self._version = 6 self._max_prefixlen = IPV6LENGTH def _ip_int_from_string(self, ip_str): """Turn an IPv6 ip_str into an integer. Args: ip_str: A string, the IPv6 ip_str. Returns: A long, the IPv6 ip_str. Raises: AddressValueError: if ip_str isn't a valid IPv6 Address. """ parts = ip_str.split(':') # An IPv6 address needs at least 2 colons (3 parts). if len(parts) < 3: raise AddressValueError(ip_str) # If the address has an IPv4-style suffix, convert it to hexadecimal. if '.' in parts[-1]: ipv4_int = IPv4Address(parts.pop())._ip parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF)) parts.append('%x' % (ipv4_int & 0xFFFF)) # An IPv6 address can't have more than 8 colons (9 parts). if len(parts) > self._HEXTET_COUNT + 1: raise AddressValueError(ip_str) # Disregarding the endpoints, find '::' with nothing in between. # This indicates that a run of zeroes has been skipped. try: skip_index, = ( [i for i in xrange(1, len(parts) - 1) if not parts[i]] or [None]) except ValueError: # Can't have more than one '::' raise AddressValueError(ip_str) # parts_hi is the number of parts to copy from above/before the '::' # parts_lo is the number of parts to copy from below/after the '::' if skip_index is not None: # If we found a '::', then check if it also covers the endpoints. parts_hi = skip_index parts_lo = len(parts) - skip_index - 1 if not parts[0]: parts_hi -= 1 if parts_hi: raise AddressValueError(ip_str) # ^: requires ^:: if not parts[-1]: parts_lo -= 1 if parts_lo: raise AddressValueError(ip_str) # :$ requires ::$ parts_skipped = self._HEXTET_COUNT - (parts_hi + parts_lo) if parts_skipped < 1: raise AddressValueError(ip_str) else: # Otherwise, allocate the entire address to parts_hi. The endpoints # could still be empty, but _parse_hextet() will check for that. if len(parts) != self._HEXTET_COUNT: raise AddressValueError(ip_str) parts_hi = len(parts) parts_lo = 0 parts_skipped = 0 try: # Now, parse the hextets into a 128-bit integer. ip_int = 0L for i in xrange(parts_hi): ip_int <<= 16 ip_int |= self._parse_hextet(parts[i]) ip_int <<= 16 * parts_skipped for i in xrange(-parts_lo, 0): ip_int <<= 16 ip_int |= self._parse_hextet(parts[i]) return ip_int except ValueError: raise AddressValueError(ip_str) def _parse_hextet(self, hextet_str): """Convert an IPv6 hextet string into an integer. Args: hextet_str: A string, the number to parse. Returns: The hextet as an integer. Raises: ValueError: if the input isn't strictly a hex number from [0..FFFF]. """ # Whitelist the characters, since int() allows a lot of bizarre stuff. if not self._HEX_DIGITS.issuperset(hextet_str): raise ValueError if len(hextet_str) > 4: raise ValueError hextet_int = int(hextet_str, 16) if hextet_int > 0xFFFF: raise ValueError return hextet_int def _compress_hextets(self, hextets): """Compresses a list of hextets. Compresses a list of strings, replacing the longest continuous sequence of "0" in the list with "" and adding empty strings at the beginning or at the end of the string such that subsequently calling ":".join(hextets) will produce the compressed version of the IPv6 address. Args: hextets: A list of strings, the hextets to compress. Returns: A list of strings. """ best_doublecolon_start = -1 best_doublecolon_len = 0 doublecolon_start = -1 doublecolon_len = 0 for index in range(len(hextets)): if hextets[index] == '0': doublecolon_len += 1 if doublecolon_start == -1: # Start of a sequence of zeros. doublecolon_start = index if doublecolon_len > best_doublecolon_len: # This is the longest sequence of zeros so far. best_doublecolon_len = doublecolon_len best_doublecolon_start = doublecolon_start else: doublecolon_len = 0 doublecolon_start = -1 if best_doublecolon_len > 1: best_doublecolon_end = (best_doublecolon_start + best_doublecolon_len) # For zeros at the end of the address. if best_doublecolon_end == len(hextets): hextets += [''] hextets[best_doublecolon_start:best_doublecolon_end] = [''] # For zeros at the beginning of the address. if best_doublecolon_start == 0: hextets = [''] + hextets return hextets def _string_from_ip_int(self, ip_int=None): """Turns a 128-bit integer into hexadecimal notation. Args: ip_int: An integer, the IP address. Returns: A string, the hexadecimal representation of the address. Raises: ValueError: The address is bigger than 128 bits of all ones. """ if not ip_int and ip_int != 0: ip_int = int(self._ip) if ip_int > self._ALL_ONES: raise ValueError('IPv6 address is too large') hex_str = '%032x' % ip_int hextets = [] for x in range(0, 32, 4): hextets.append('%x' % int(hex_str[x:x+4], 16)) hextets = self._compress_hextets(hextets) return ':'.join(hextets) def _explode_shorthand_ip_string(self): """Expand a shortened IPv6 address. Args: ip_str: A string, the IPv6 address. Returns: A string, the expanded IPv6 address. """ if isinstance(self, _BaseNet): ip_str = str(self.ip) else: ip_str = str(self) ip_int = self._ip_int_from_string(ip_str) parts = [] for i in xrange(self._HEXTET_COUNT): parts.append('%04x' % (ip_int & 0xFFFF)) ip_int >>= 16 parts.reverse() if isinstance(self, _BaseNet): return '%s/%d' % (':'.join(parts), self.prefixlen) return ':'.join(parts) @property def max_prefixlen(self): return self._max_prefixlen @property def packed(self): """The binary representation of this address.""" return v6_int_to_packed(self._ip) @property def version(self): return self._version @property def is_multicast(self): """Test if the address is reserved for multicast use. Returns: A boolean, True if the address is a multicast address. See RFC 2373 2.7 for details. """ return self in IPv6Network('ff00::/8') @property def is_reserved(self): """Test if the address is otherwise IETF reserved. Returns: A boolean, True if the address is within one of the reserved IPv6 Network ranges. """ return (self in IPv6Network('::/8') or self in IPv6Network('100::/8') or self in IPv6Network('200::/7') or self in IPv6Network('400::/6') or self in IPv6Network('800::/5') or self in IPv6Network('1000::/4') or self in IPv6Network('4000::/3') or self in IPv6Network('6000::/3') or self in IPv6Network('8000::/3') or self in IPv6Network('A000::/3') or self in IPv6Network('C000::/3') or self in IPv6Network('E000::/4') or self in IPv6Network('F000::/5') or self in IPv6Network('F800::/6') or self in IPv6Network('FE00::/9')) @property def is_unspecified(self): """Test if the address is unspecified. Returns: A boolean, True if this is the unspecified address as defined in RFC 2373 2.5.2. """ return self._ip == 0 and getattr(self, '_prefixlen', 128) == 128 @property def is_loopback(self): """Test if the address is a loopback address. Returns: A boolean, True if the address is a loopback address as defined in RFC 2373 2.5.3. """ return self._ip == 1 and getattr(self, '_prefixlen', 128) == 128 @property def is_link_local(self): """Test if the address is reserved for link-local. Returns: A boolean, True if the address is reserved per RFC 4291. """ return self in IPv6Network('fe80::/10') @property def is_site_local(self): """Test if the address is reserved for site-local. Note that the site-local address space has been deprecated by RFC 3879. Use is_private to test if this address is in the space of unique local addresses as defined by RFC 4193. Returns: A boolean, True if the address is reserved per RFC 3513 2.5.6. """ return self in IPv6Network('fec0::/10') @property def is_private(self): """Test if this address is allocated for private networks. Returns: A boolean, True if the address is reserved per RFC 4193. """ return self in IPv6Network('fc00::/7') @property def ipv4_mapped(self): """Return the IPv4 mapped address. Returns: If the IPv6 address is a v4 mapped address, return the IPv4 mapped address. Return None otherwise. """ if (self._ip >> 32) != 0xFFFF: return None return IPv4Address(self._ip & 0xFFFFFFFF) @property def teredo(self): """Tuple of embedded teredo IPs. Returns: Tuple of the (server, client) IPs or None if the address doesn't appear to be a teredo address (doesn't start with 2001::/32) """ if (self._ip >> 96) != 0x20010000: return None return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF), IPv4Address(~self._ip & 0xFFFFFFFF)) @property def sixtofour(self): """Return the IPv4 6to4 embedded address. Returns: The IPv4 6to4-embedded address if present or None if the address doesn't appear to contain a 6to4 embedded address. """ if (self._ip >> 112) != 0x2002: return None return IPv4Address((self._ip >> 80) & 0xFFFFFFFF) class IPv6Address(_BaseV6, _BaseIP): """Represent and manipulate single IPv6 Addresses. """ def __init__(self, address): """Instantiate a new IPv6 address object. Args: address: A string or integer representing the IP Additionally, an integer can be passed, so IPv6Address('2001:4860::') == IPv6Address(42541956101370907050197289607612071936L). or, more generally IPv6Address(IPv6Address('2001:4860::')._ip) == IPv6Address('2001:4860::') Raises: AddressValueError: If address isn't a valid IPv6 address. """ _BaseV6.__init__(self, address) # Efficient constructor from integer. if isinstance(address, (int, long)): self._ip = address if address < 0 or address > self._ALL_ONES: raise AddressValueError(address) return # Constructing from a packed address if isinstance(address, Bytes): try: hi, lo = struct.unpack('!QQ', address) except struct.error: raise AddressValueError(address) # Wrong length. self._ip = (hi << 64) | lo return # Assume input argument to be string or any object representation # which converts into a formatted IP string. addr_str = str(address) if not addr_str: raise AddressValueError('') self._ip = self._ip_int_from_string(addr_str) class IPv6Network(_BaseV6, _BaseNet): """This class represents and manipulates 128-bit IPv6 networks. Attributes: [examples for IPv6('2001:658:22A:CAFE:200::1/64')] .ip: IPv6Address('2001:658:22a:cafe:200::1') .network: IPv6Address('2001:658:22a:cafe::') .hostmask: IPv6Address('::ffff:ffff:ffff:ffff') .broadcast: IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff') .netmask: IPv6Address('ffff:ffff:ffff:ffff::') .prefixlen: 64 """ def __init__(self, address, strict=False): """Instantiate a new IPv6 Network object. Args: address: A string or integer representing the IPv6 network or the IP and prefix/netmask. '2001:4860::/128' '2001:4860:0000:0000:0000:0000:0000:0000/128' '2001:4860::' are all functionally the same in IPv6. That is to say, failing to provide a subnetmask will create an object with a mask of /128. Additionally, an integer can be passed, so IPv6Network('2001:4860::') == IPv6Network(42541956101370907050197289607612071936L). or, more generally IPv6Network(IPv6Network('2001:4860::')._ip) == IPv6Network('2001:4860::') strict: A boolean. If true, ensure that we have been passed A true network address, eg, 192.168.1.0/24 and not an IP address on a network, eg, 192.168.1.1/24. Raises: AddressValueError: If address isn't a valid IPv6 address. NetmaskValueError: If the netmask isn't valid for an IPv6 address. ValueError: If strict was True and a network address was not supplied. """ _BaseNet.__init__(self, address) _BaseV6.__init__(self, address) # Constructing from an integer or packed bytes. if isinstance(address, (int, long, Bytes)): self.ip = IPv6Address(address) self._ip = self.ip._ip self._prefixlen = self._max_prefixlen self.netmask = IPv6Address(self._ALL_ONES) return # Assume input argument to be string or any object representation # which converts into a formatted IP prefix string. addr = str(address).split('/') if len(addr) > 2: raise AddressValueError(address) self._ip = self._ip_int_from_string(addr[0]) self.ip = IPv6Address(self._ip) if len(addr) == 2: # This may raise NetmaskValueError self._prefixlen = self._prefix_from_prefix_string(addr[1]) else: self._prefixlen = self._max_prefixlen self.netmask = IPv6Address(self._ip_int_from_prefix(self._prefixlen)) if strict: if self.ip != self.network: raise ValueError('%s has host bits set' % self.ip) if self._prefixlen == (self._max_prefixlen - 1): self.iterhosts = self.__iter__ @property def with_netmask(self): return self.with_prefixlen ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/qdb.py�������������������������������������������������������������0000664�0000000�0000000�00000076617�12564727262�016410� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # coding:utf-8 "Queues(Pipe)-based independent remote client-server Python Debugger" __author__ = "Mariano Reingart (reingart@gmail.com)" __copyright__ = "Copyright (C) 2011 Mariano Reingart" __license__ = "LGPL 3.0" __version__ = "1.01b" # remote debugger queue-based (jsonrpc-like interface): # - bidirectional communication (request - response calls in both ways) # - request with id == null is a notification (do not send a response) # - request with a value for id is a normal call, wait response # based on idle, inspired by pythonwin implementation, taken many code from pdb import bdb import inspect import linecache import os import sys import traceback import cmd import pydoc import threading class Qdb(bdb.Bdb): "Qdb Debugger Backend" def __init__(self, pipe, redirect_stdio=True, allow_interruptions=False, skip=[__name__]): kwargs = {} if sys.version_info > (2, 7): kwargs['skip'] = skip bdb.Bdb.__init__(self, **kwargs) self.frame = None self.i = 1 # sequential RPC call id self.waiting = False self.pipe = pipe # for communication self._wait_for_mainpyfile = False self._wait_for_breakpoint = False self.mainpyfile = "" self._lineno = None # last listed line numbre # replace system standard input and output (send them thru the pipe) if redirect_stdio: sys.stdin = self sys.stdout = self sys.stderr = self if allow_interruptions: # fake breakpoint to prevent removing trace_dispatch on set_continue self.breaks[None] = [] self.allow_interruptions = allow_interruptions self.burst = 0 # do not send notifications ("burst" mode) self.params = {} # optional parameters for interaction def pull_actions(self): # receive a remote procedure call from the frontend: # returns True if action processed # None when 'run' notification is received (see 'startup') request = self.pipe.recv() if request.get("method") == 'run': return None response = {'version': '1.1', 'id': request.get('id'), 'result': None, 'error': None} try: # dispatch message (JSON RPC like) method = getattr(self, request['method']) response['result'] = method.__call__(*request['args'], **request.get('kwargs', {})) except Exception, e: response['error'] = {'code': 0, 'message': str(e)} # send the result for normal method calls, not for notifications if request.get('id'): self.pipe.send(response) return True # Override Bdb methods def trace_dispatch(self, frame, event, arg): # check for non-interaction rpc (set_breakpoint, interrupt) while self.allow_interruptions and self.pipe.poll(): self.pull_actions() # process the frame (see Bdb.trace_dispatch) if self.quitting: return # None if event == 'line': return self.dispatch_line(frame) if event == 'call': return self.dispatch_call(frame, arg) if event == 'return': return self.dispatch_return(frame, arg) if event == 'exception': return self.dispatch_exception(frame, arg) return self.trace_dispatch def user_call(self, frame, argument_list): """This method is called when there is the remote possibility that we ever need to stop in this function.""" if self._wait_for_mainpyfile or self._wait_for_breakpoint: return if self.stop_here(frame): self.interaction(frame, None) def user_line(self, frame): """This function is called when we stop or break at this line.""" if self._wait_for_mainpyfile: if (not self.canonic(frame.f_code.co_filename).startswith(self.mainpyfile) or frame.f_lineno <= 0): return self._wait_for_mainpyfile = 0 if self._wait_for_breakpoint: if not self.break_here(frame): return self._wait_for_breakpoint = 0 self.interaction(frame) def user_exception(self, frame, info): """This function is called if an exception occurs, but only if we are to stop at or just below this level.""" if self._wait_for_mainpyfile or self._wait_for_breakpoint: return extype, exvalue, trace = info # pre-process stack trace as it isn't pickeable (cannot be sent pure) msg = ''.join(traceback.format_exception(extype, exvalue, trace)) trace = traceback.extract_tb(trace) title = traceback.format_exception_only(extype, exvalue)[0] # send an Exception notification msg = {'method': 'exception', 'args': (title, extype.__name__, exvalue, trace, msg), 'id': None} self.pipe.send(msg) self.interaction(frame, info) def run(self, code, interp=None, *args, **kwargs): try: return bdb.Bdb.run(self, code, *args, **kwargs) finally: pass def runcall(self, function, interp=None, *args, **kwargs): try: self.interp = interp return bdb.Bdb.runcall(self, function, *args, **kwargs) finally: pass def _runscript(self, filename): # The script has to run in __main__ namespace (clear it) import __main__ import imp __main__.__dict__.clear() __main__.__dict__.update({"__name__": "__main__", "__file__": filename, "__builtins__": __builtins__, "imp": imp, # need for run }) # avoid stopping before we reach the main script self._wait_for_mainpyfile = 1 self.mainpyfile = self.canonic(filename) self._user_requested_quit = 0 statement = 'imp.load_source("__main__", "%s")' % filename # notify and wait frontend to set initial params and breakpoints self.pipe.send({'method': 'startup', 'args': (__version__, )}) while self.pull_actions() is not None: pass self.run(statement) # General interaction function def interaction(self, frame, info=None): # chache frame locals to ensure that modifications are not overwritten self.frame_locals = frame and frame.f_locals or {} # extract current filename and line number code, lineno = frame.f_code, frame.f_lineno filename = code.co_filename basename = os.path.basename(filename) message = "%s:%s" % (basename, lineno) if code.co_name != "?": message = "%s: %s()" % (message, code.co_name) # wait user events self.waiting = True self.frame = frame try: while self.waiting: # sync_source_line() if frame and filename[:1] + filename[-1:] != "<>" and os.path.exists(filename): line = linecache.getline(filename, self.frame.f_lineno, self.frame.f_globals) else: line = "" # send the notification (debug event) - DOESN'T WAIT RESPONSE self.burst -= 1 if self.burst < 0: kwargs = {} if self.params.get('call_stack'): kwargs['call_stack'] = self.do_where() if self.params.get('environment'): kwargs['environment'] = self.do_environment() self.pipe.send({'method': 'interaction', 'id': None, 'args': (filename, self.frame.f_lineno, line), 'kwargs': kwargs}) self.pull_actions() finally: self.waiting = False self.frame = None def do_debug(self, mainpyfile=None, wait_breakpoint=1): self.reset() if not wait_breakpoint or mainpyfile: self._wait_for_mainpyfile = 1 if not mainpyfile: frame = sys._getframe().f_back mainpyfile = frame.f_code.co_filename self.mainpyfile = self.canonic(mainpyfile) self._wait_for_breakpoint = wait_breakpoint sys.settrace(self.trace_dispatch) def set_trace(self, frame=None): # start debugger interaction immediatelly if frame is None: frame = sys._getframe().f_back self._wait_for_mainpyfile = frame.f_code.co_filename self._wait_for_breakpoint = 0 bdb.Bdb.set_trace(self, frame) # Command definitions, called by interaction() def do_continue(self): self.set_continue() self.waiting = False def do_step(self): self.set_step() self.waiting = False def do_return(self): self.set_return(self.frame) self.waiting = False def do_next(self): self.set_next(self.frame) self.waiting = False def interrupt(self): self.set_step() def do_quit(self): self.set_quit() self.waiting = False def do_jump(self, lineno): arg = int(lineno) try: self.frame.f_lineno = arg return arg except ValueError, e: print '*** Jump failed:', e return False def do_list(self, arg): last = None if arg: if isinstance(arg, tuple): first, last = arg else: first = arg elif not self._lineno: first = max(1, self.frame.f_lineno - 5) else: first = self._lineno + 1 if last is None: last = first + 10 filename = self.frame.f_code.co_filename breaklist = self.get_file_breaks(filename) lines = [] for lineno in range(first, last + 1): line = linecache.getline(filename, lineno, self.frame.f_globals) if not line: lines.append((filename, lineno, '', current, "<EOF>\n")) break else: breakpoint = "B" if lineno in breaklist else "" current = "->" if self.frame.f_lineno == lineno else "" lines.append((filename, lineno, breakpoint, current, line)) self._lineno = lineno return lines def do_read(self, filename): return open(filename, "Ur").read() def do_set_breakpoint(self, filename, lineno, temporary=0, cond=None): return self.set_break(filename, int(lineno), temporary, cond) def do_list_breakpoint(self): breaks = [] if self.breaks: # There's at least one for bp in bdb.Breakpoint.bpbynumber: if bp: breaks.append((bp.number, bp.file, bp.line, bp.temporary, bp.enabled, bp.hits, bp.cond, )) return breaks def do_clear_breakpoint(self, filename, lineno): self.clear_break(filename, lineno) def do_clear_file_breakpoints(self, filename): self.clear_all_file_breaks(filename) def do_clear(self, arg): # required by BDB to remove temp breakpoints! err = self.clear_bpbynumber(arg) if err: print '*** DO_CLEAR failed', err def do_eval(self, arg, safe=True): ret = eval(arg, self.frame.f_globals, self.frame_locals) if safe: ret = pydoc.cram(repr(ret), 255) return ret def do_exec(self, arg): locals = self.frame_locals globals = self.frame.f_globals code = compile(arg + '\n', '<stdin>', 'single') save_displayhook = sys.displayhook self.displayhook_value = None try: sys.displayhook = self.displayhook exec code in globals, locals finally: sys.displayhook = save_displayhook return self.displayhook_value def do_where(self): "print_stack_trace" stack, curindex = self.get_stack(self.frame, None) lines = [] for frame, lineno in stack: filename = frame.f_code.co_filename line = linecache.getline(filename, lineno) lines.append((filename, lineno, "", "", line, )) return lines def do_environment(self): "return current frame local and global environment" env = {'locals': {}, 'globals': {}} # converts the frame global and locals to a short text representation: if self.frame: for name, value in self.frame_locals.items(): env['locals'][name] = pydoc.cram(repr( value), 255), repr(type(value)) for name, value in self.frame.f_globals.items(): env['globals'][name] = pydoc.cram(repr( value), 20), repr(type(value)) return env def get_autocomplete_list(self, expression): "Return list of auto-completion options for expression" try: obj = self.do_eval(expression) except: return [] else: return dir(obj) def get_call_tip(self, expression): "Return list of auto-completion options for expression" try: obj = self.do_eval(expression) except Exception, e: return ('', '', str(e)) else: name = '' try: name = obj.__name__ except AttributeError: pass argspec = '' drop_self = 0 f = None try: if inspect.isbuiltin(obj): pass elif inspect.ismethod(obj): # Get the function from the object f = obj.im_func drop_self = 1 elif inspect.isclass(obj): # Get the __init__ method function for the class. if hasattr(obj, '__init__'): f = obj.__init__.im_func else: for base in object.__bases__: if hasattr(base, '__init__'): f = base.__init__.im_func break if f is not None: drop_self = 1 elif callable(obj): # use the obj as a function by default f = obj # Get the __call__ method instead. f = obj.__call__.im_func drop_self = 0 except AttributeError: pass if f: argspec = apply(inspect.formatargspec, inspect.getargspec(f)) doc = '' if callable(obj): try: doc = inspect.getdoc(obj) except: pass return (name, argspec[1:-1], doc.strip()) def set_burst(self, val): "Set burst mode -multiple command count- (shut up notifications)" self.burst = val def set_params(self, params): "Set parameters for interaction" self.params.update(params) def displayhook(self, obj): """Custom displayhook for the do_exec which prevents assignment of the _ variable in the builtins. """ self.displayhook_value = repr(obj) def reset(self): bdb.Bdb.reset(self) self.waiting = False self.frame = None def post_mortem(self, t=None): # handling the default if t is None: # sys.exc_info() returns (type, value, traceback) if an exception is # being handled, otherwise it returns None t = sys.exc_info()[2] if t is None: raise ValueError("A valid traceback must be passed if no " "exception is being handled") self.reset() # get last frame: while t is not None: frame = t.tb_frame t = t.tb_next code, lineno = frame.f_code, frame.f_lineno filename = code.co_filename line = linecache.getline(filename, lineno) #(filename, lineno, "", current, line, )} self.interaction(frame) # console file-like object emulation def readline(self): "Replacement for stdin.readline()" msg = {'method': 'readline', 'args': (), 'id': self.i} self.pipe.send(msg) msg = self.pipe.recv() self.i += 1 return msg['result'] def readlines(self): "Replacement for stdin.readlines()" lines = [] while lines[-1:] != ['\n']: lines.append(self.readline()) return lines def write(self, text): "Replacement for stdout.write()" msg = {'method': 'write', 'args': (text, ), 'id': None} self.pipe.send(msg) def writelines(self, l): map(self.write, l) def flush(self): pass def isatty(self): return 0 class QueuePipe(object): "Simulated pipe for threads (using two queues)" def __init__(self, name, in_queue, out_queue): self.__name = name self.in_queue = in_queue self.out_queue = out_queue def send(self, data): self.out_queue.put(data, block=True) def recv(self, count=None, timeout=None): data = self.in_queue.get(block=True, timeout=timeout) return data def poll(self, timeout=None): return not self.in_queue.empty() def close(self): pass class RPCError(RuntimeError): "Remote Error (not user exception)" pass class Frontend(object): "Qdb generic Frontend interface" def __init__(self, pipe): self.i = 1 self.pipe = pipe self.notifies = [] self.read_lock = threading.RLock() self.write_lock = threading.RLock() def recv(self): self.read_lock.acquire() try: return self.pipe.recv() finally: self.read_lock.release() def send(self, data): self.write_lock.acquire() try: return self.pipe.send(data) finally: self.write_lock.release() def startup(self): self.send({'method': 'run', 'args': (), 'id': None}) def interaction(self, filename, lineno, line, *kwargs): raise NotImplementedError def exception(self, title, extype, exvalue, trace, request): "Show a user_exception" raise NotImplementedError def write(self, text): "Console output (print)" raise NotImplementedError def readline(self, text): "Console input/rawinput" raise NotImplementedError def run(self): "Main method dispatcher (infinite loop)" if self.pipe: if not self.notifies: # wait for a message... request = self.recv() else: # process an asyncronus notification received earlier request = self.notifies.pop(0) return self.process_message(request) def process_message(self, request): if request: result = None if request.get("error"): # it is not supposed to get an error here # it should be raised by the method call raise RPCError(res['error']['message']) elif request.get('method') == 'interaction': self.interaction(*request.get("args"), **request.get("kwargs")) elif request.get('method') == 'startup': self.startup() elif request.get('method') == 'exception': self.exception(*request['args']) elif request.get('method') == 'write': self.write(*request.get("args")) elif request.get('method') == 'readline': result = self.readline() if result: response = {'version': '1.1', 'id': request.get('id'), 'result': result, 'error': None} self.send(response) return True def call(self, method, *args): "Actually call the remote method (inside the thread)" req = {'method': method, 'args': args, 'id': self.i} self.send(req) self.i += 1 # increment the id while 1: # wait until command acknowledge (response id match the request) res = self.recv() if 'id' not in res or not res['id']: # nested notification received (i.e. write)! process it! self.process_message(res) elif 'result' not in res: # nested request received (i.e. readline)! process it! self.process_message(res) elif long(req['id']) != long(res['id']): print "DEBUGGER wrong packet received: expecting id", req[ 'id'], res['id'] # protocol state is unknown elif 'error' in res and res['error']: raise RPCError(res['error']['message']) else: return res['result'] def do_step(self, arg=None): "Execute the current line, stop at the first possible occasion" self.call('do_step') def do_next(self, arg=None): "Execute the current line, do not stop at function calls" self.call('do_next') def do_continue(self, arg=None): "Continue execution, only stop when a breakpoint is encountered." self.call('do_continue') def do_return(self, arg=None): "Continue execution until the current function returns" self.call('do_return') def do_jump(self, arg): "Set the next line that will be executed." res = self.call('do_jump', arg) print res def do_where(self, arg=None): "Print a stack trace, with the most recent frame at the bottom." return self.call('do_where') def do_quit(self, arg=None): "Quit from the debugger. The program being executed is aborted." self.call('do_quit') def do_eval(self, expr): "Inspect the value of the expression" return self.call('do_eval', expr) def do_environment(self): "List all the locals and globals variables (string representation)" return self.call('do_environment') def do_list(self, arg=None): "List source code for the current file" return self.call('do_list', arg) def do_read(self, filename): "Read and send a local filename" return self.call('do_read', filename) def do_set_breakpoint(self, filename, lineno, temporary=0, cond=None): "Set a breakpoint at filename:breakpoint" self.call('do_set_breakpoint', filename, lineno, temporary, cond) def do_clear_breakpoint(self, filename, lineno): "Remove a breakpoint at filename:breakpoint" self.call('do_clear_breakpoint', filename, lineno) def do_clear_file_breakpoints(self, filename): "Remove all breakpoints at filename" self.call('do_clear_breakpoints', filename, lineno) def do_list_breakpoint(self): "List all breakpoints" return self.call('do_list_breakpoint') def do_exec(self, statement): return self.call('do_exec', statement) def get_autocomplete_list(self, expression): return self.call('get_autocomplete_list', expression) def get_call_tip(self, expression): return self.call('get_call_tip', expression) def interrupt(self): "Immediately stop at the first possible occasion (outside interaction)" # this is a notification!, do not expect a response req = {'method': 'interrupt', 'args': ()} self.send(req) def set_burst(self, value): req = {'method': 'set_burst', 'args': (value, )} self.send(req) def set_params(self, params): req = {'method': 'set_params', 'args': (params, )} self.send(req) class Cli(Frontend, cmd.Cmd): "Qdb Front-end command line interface" def __init__(self, pipe, completekey='tab', stdin=None, stdout=None, skip=None): cmd.Cmd.__init__(self, completekey, stdin, stdout) Frontend.__init__(self, pipe) # redefine Frontend methods: def run(self): while 1: try: Frontend.run(self) except KeyboardInterrupt: print "Interupting..." self.interrupt() def interaction(self, filename, lineno, line): print "> %s(%d)\n-> %s" % (filename, lineno, line), self.filename = filename self.cmdloop() def exception(self, title, extype, exvalue, trace, request): print "=" * 80 print "Exception", title print request print "-" * 80 def write(self, text): print text, def readline(self): return raw_input() def postcmd(self, stop, line): return not line.startswith("h") # stop do_h = cmd.Cmd.do_help do_s = Frontend.do_step do_n = Frontend.do_next do_c = Frontend.do_continue do_r = Frontend.do_return do_j = Frontend.do_jump do_q = Frontend.do_quit def do_eval(self, args): "Inspect the value of the expression" print Frontend.do_eval(self, args) def do_list(self, args): "List source code for the current file" lines = Frontend.do_list(self, eval(args, {}, {}) if args else None) self.print_lines(lines) def do_where(self, args): "Print a stack trace, with the most recent frame at the bottom." lines = Frontend.do_where(self) self.print_lines(lines) def do_environment(self, args=None): env = Frontend.do_environment(self) for key in env: print "=" * 78 print key.capitalize() print "-" * 78 for name, value in env[key].items(): print "%-12s = %s" % (name, value) def do_list_breakpoint(self, arg=None): "List all breakpoints" breaks = Frontend.do_list_breakpoint(self) print "Num File Line Temp Enab Hits Cond" for bp in breaks: print '%-4d%-30s%4d %4s %4s %4d %s' % bp print def do_set_breakpoint(self, arg): "Set a breakpoint at filename:breakpoint" if arg: if ':' in arg: args = arg.split(":") else: args = (self.filename, arg) Frontend.do_set_breakpoint(self, *args) else: self.do_list_breakpoint() do_b = do_set_breakpoint do_l = do_list do_p = do_eval do_w = do_where do_e = do_environment def default(self, line): "Default command" if line[:1] == '!': print self.do_exec(line[1:]) else: print "*** Unknown command: ", line def print_lines(self, lines): for filename, lineno, bp, current, source in lines: print "%s:%4d%s%s\t%s" % (filename, lineno, bp, current, source), print def test(): def f(pipe): print "creating debugger" qdb = Qdb(pipe=pipe, redirect_stdio=False) print "set trace" my_var = "Mariano!" qdb.set_trace() print "hello world!" print "good by!" saraza if '--process' in sys.argv: from multiprocessing import Process, Pipe pipe, child_conn = Pipe() p = Process(target=f, args=(child_conn,)) else: from threading import Thread from Queue import Queue parent_queue, child_queue = Queue(), Queue() front_conn = QueuePipe("parent", parent_queue, child_queue) child_conn = QueuePipe("child", child_queue, parent_queue) p = Thread(target=f, args=(child_conn,)) p.start() import time class Test(Frontend): def interaction(self, *args): print "interaction!", args def exception(self, *args): print "exception", args #raise RuntimeError("exception %s" % repr(args)) qdb = Test(front_conn) time.sleep(5) while 1: print "running..." Frontend.run(qdb) time.sleep(1) print "do_next" qdb.do_next() p.join() def connect(host="localhost", port=6000, authkey='secret password'): "Connect to a running debugger backend" address = (host, port) from multiprocessing.connection import Client print "qdb debugger fronted: waiting for connection to", address conn = Client(address, authkey=authkey) try: Cli(conn).run() except EOFError: pass finally: conn.close() def main(host='localhost', port=6000, authkey='secret password'): "Debug a script and accept a remote frontend" if not sys.argv[1:] or sys.argv[1] in ("--help", "-h"): print "usage: pdb.py scriptfile [arg] ..." sys.exit(2) mainpyfile = sys.argv[1] # Get script filename if not os.path.exists(mainpyfile): print 'Error:', mainpyfile, 'does not exist' sys.exit(1) del sys.argv[0] # Hide "pdb.py" from argument list # Replace pdb's dir with script's dir in front of module search path. sys.path[0] = os.path.dirname(mainpyfile) from multiprocessing.connection import Listener address = (host, port) # family is deduced to be 'AF_INET' listener = Listener(address, authkey=authkey) print "qdb debugger backend: waiting for connection at", address conn = listener.accept() print 'qdb debugger backend: connected to', listener.last_accepted # create the backend qdb = Qdb(conn, redirect_stdio=True, allow_interruptions=True) try: print "running", mainpyfile qdb._runscript(mainpyfile) print "The program finished" except SystemExit: # In most cases SystemExit does not warrant a post-mortem session. print "The program exited via sys.exit(). Exit status: ", print sys.exc_info()[1] raise except: raise conn.close() listener.close() qdb = None def set_trace(host='localhost', port=6000, authkey='secret password'): "Simplified interface to debug running programs" global qdb, listener, conn from multiprocessing.connection import Listener # only create it if not currently instantiated if not qdb: address = (host, port) # family is deduced to be 'AF_INET' listener = Listener(address, authkey=authkey) conn = listener.accept() # create the backend qdb = Qdb(conn) # start debugger backend: qdb.set_trace() def quit(): "Remove trace and quit" global qdb, listener, conn if qdb: sys.settrace(None) qdb = None if conn: conn.close() conn = None if listener: listener.close() listener = None if __name__ == '__main__': # When invoked as main program: if '--test' in sys.argv: test() # Check environment for configuration parameters: kwargs = {} for param in 'host', 'port', 'authkey': if 'QDB_%s' % param.upper() in os.environ: kwargs[param] = os.environ['QDB_%s' % param.upper()] if not sys.argv[1:]: # connect to a remote debbuger connect(**kwargs) else: # start the debugger on a script # reimport as global __main__ namespace is destroyed import qdb qdb.main(**kwargs) �����������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/simplejsonrpc.py���������������������������������������������������0000664�0000000�0000000�00000011667�12564727264�020526� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by the # Free Software Foundation; either version 3, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. "Pythonic simple JSON RPC Client implementation" __author__ = "Mariano Reingart (reingart@gmail.com)" __copyright__ = "Copyright (C) 2011 Mariano Reingart" __license__ = "LGPL 3.0" __version__ = "0.05" import urllib from xmlrpclib import Transport, SafeTransport from cStringIO import StringIO import random import sys try: import gluon.contrib.simplejson as json # try web2py json serializer except ImportError: try: import json # try stdlib (py2.6) except: import simplejson as json # try external module class JSONRPCError(RuntimeError): "Error object for remote procedure call fail" def __init__(self, code, message, data=None): value = "%s: %s\n%s" % (code, message, '\n'.join(data or '')) RuntimeError.__init__(self, value) self.code = code self.message = message self.data = data class JSONDummyParser: "json wrapper for xmlrpclib parser interfase" def __init__(self): self.buf = StringIO() def feed(self, data): self.buf.write(data) def close(self): return self.buf.getvalue() class JSONTransportMixin: "json wrapper for xmlrpclib transport interfase" def send_content(self, connection, request_body): connection.putheader("Content-Type", "application/json") connection.putheader("Content-Length", str(len(request_body))) connection.endheaders() if request_body: connection.send(request_body) # todo: add gzip compression def getparser(self): # get parser and unmarshaller parser = JSONDummyParser() return parser, parser class JSONTransport(JSONTransportMixin, Transport): pass class JSONSafeTransport(JSONTransportMixin, SafeTransport): pass class ServerProxy(object): "JSON RPC Simple Client Service Proxy" def __init__(self, uri, transport=None, encoding=None, verbose=0,version=None): self.location = uri # server location (url) self.trace = verbose # show debug messages self.exceptions = True # raise errors? (JSONRPCError) self.timeout = None self.json_request = self.json_response = '' self.version = version # '2.0' for jsonrpc2 type, uri = urllib.splittype(uri) if type not in ("http", "https"): raise IOError("unsupported JSON-RPC protocol") self.__host, self.__handler = urllib.splithost(uri) if transport is None: if type == "https": transport = JSONSafeTransport() else: transport = JSONTransport() self.__transport = transport self.__encoding = encoding self.__verbose = verbose def __getattr__(self, attr): "pseudo method that can be called" return lambda *args: self.call(attr, *args) def call(self, method, *args): "JSON RPC communication (method invocation)" # build data sent to the service request_id = random.randint(0, sys.maxint) data = {'id': request_id, 'method': method, 'params': args, } if self.version: data['jsonrpc'] = self.version #mandatory key/value for jsonrpc2 validation else err -32600 request = json.dumps(data) # make HTTP request (retry if connection is lost) response = self.__transport.request( self.__host, self.__handler, request, verbose=self.__verbose ) # store plain request and response for further debugging self.json_request = request self.json_response = response # parse json data coming from service # {'version': '1.1', 'id': id, 'result': result, 'error': None} response = json.loads(response) self.error = response.get('error', {}) if self.error and self.exceptions: raise JSONRPCError(self.error.get('code', 0), self.error.get('message', ''), self.error.get('data', None)) if response['id'] != request_id: raise JSONRPCError(0, "JSON Request ID != Response ID") return response.get('result') ServiceProxy = ServerProxy if __name__ == "__main__": # basic tests: location = "http://www.web2py.com.ar/webservices/sample/call/jsonrpc" client = ServerProxy(location, verbose='--verbose' in sys.argv,) print client.add(1, 2) �������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/minify/������������������������������������������������������������0000775�0000000�0000000�00000000000�12564727262�016542� 5����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/minify/__init__.py�������������������������������������������������0000664�0000000�0000000�00000000000�12564727262�020641� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/minify/jsmin.py����������������������������������������������������0000664�0000000�0000000�00000034061�12564727262�020240� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # -*- coding: ascii -*- # # Copyright 2011 # Andr\xe9 Malo or his licensors, as applicable # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. r""" ===================== Javascript Minifier ===================== Javascript Minifier based on `jsmin.c by Douglas Crockford`_\. This module is a re-implementation based on the semantics of jsmin.c. Usually it produces the same results. It differs in the following ways: - there is no error detection: unterminated string, regex and comment literals are treated as regular javascript code and minified as such. - Control characters inside string and regex literals are left untouched; they are not converted to spaces (nor to \n) - Newline characters are not allowed inside string and regex literals, except for line continuations in string literals (ECMA-5). - "return /regex/" is recognized correctly. - rjsmin does not handle streams, but only complete strings. (However, the module provides a "streamy" interface). Besides the list above it differs from direct python ports of jsmin.c in speed. Since most parts of the logic are handled by the regex engine it's way faster than the original python port by Baruch Even. The speed factor varies between about 6 and 55 depending on input and python version (it gets faster the more compressed the input already is). Compared to the speed-refactored python port by Dave St.Germain the performance gain is less dramatic but still between 1.2 and 7. See the docs/BENCHMARKS file for details. rjsmin.c is a reimplementation of rjsmin.py in C and speeds it up even more. Both python 2 and python 3 are supported. .. _jsmin.c by Douglas Crockford: http://www.crockford.com/javascript/jsmin.c Original author of Python version: Andr\xe9 Malo Home page: http://opensource.perlig.de/rjsmin/ Modified by Ross Peoples <ross.peoples@gmail.com> for inclusion into web2py. """ __author__ = "Andr\xe9 Malo" __author__ = getattr(__author__, 'decode', lambda x: __author__)('latin-1') __docformat__ = "restructuredtext en" __license__ = "Apache License, Version 2.0" __version__ = '1.0.2' __all__ = ['jsmin', 'jsmin_for_posers'] import re as _re def _make_jsmin(extended=True, python_only=True): """ Generate JS minifier based on `jsmin.c by Douglas Crockford`_ .. _jsmin.c by Douglas Crockford: http://www.crockford.com/javascript/jsmin.c :Parameters: `extended` : ``bool`` Extended Regexps? (using lookahead and lookbehind). This is faster, because it can be optimized way more. The regexps used with `extended` being false are only left here to allow easier porting to platforms without extended regex features (and for my own reference...) `python_only` : ``bool`` Use only the python variant. If true, the c extension is not even tried to be loaded. :Return: Minifier :Rtype: ``callable`` """ # pylint: disable = R0912, R0914, W0612 if not python_only: try: import _rjsmin except ImportError: pass else: return _rjsmin.jsmin try: xrange except NameError: xrange = range # pylint: disable = W0622 space_chars = r'[\000-\011\013\014\016-\040]' line_comment = r'(?://[^\r\n]*)' space_comment = r'(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)' string1 = \ r'(?:\047[^\047\\\r\n]*(?:\\(?:[^\r\n]|\r?\n|\r)[^\047\\\r\n]*)*\047)' string2 = r'(?:"[^"\\\r\n]*(?:\\(?:[^\r\n]|\r?\n|\r)[^"\\\r\n]*)*")' strings = r'(?:%s|%s)' % (string1, string2) charclass = r'(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]*)*\])' nospecial = r'[^/\\\[\r\n]' if extended: regex = r'(?:/(?![\r\n/*])%s*(?:(?:\\[^\r\n]|%s)%s*)*/)' % ( nospecial, charclass, nospecial ) else: regex = ( r'(?:/(?:[^*/\\\r\n\[]|%s|\\[^\r\n])%s*(?:(?:\\[^\r\n]|%s)%s*)*/)' ) regex = regex % (charclass, nospecial, charclass, nospecial) space = r'(?:%s|%s)' % (space_chars, space_comment) newline = r'(?:%s?[\r\n])' % line_comment def fix_charclass(result): """ Fixup string of chars to fit into a regex char class """ pos = result.find('-') if pos >= 0: result = r'%s%s-' % (result[:pos], result[pos + 1:]) def sequentize(string): """ Notate consecutive characters as sequence (1-4 instead of 1234) """ first, last, result = None, None, [] for char in map(ord, string): if last is None: first = last = char elif last + 1 == char: last = char else: result.append((first, last)) first = last = char if last is not None: result.append((first, last)) return ''.join(['%s%s%s' % ( chr(first), last > first + 1 and '-' or '', last != first and chr(last) or '' ) for first, last in result]) return _re.sub(r'([\000-\040\047])', # for better portability lambda m: '\\%03o' % ord(m.group(1)), (sequentize(result) .replace('\\', '\\\\') .replace('[', '\\[') .replace(']', '\\]') ) ) def id_literal_(what): """ Make id_literal like char class """ match = _re.compile(what).match result = ''.join([ chr(c) for c in xrange(127) if not match(chr(c)) ]) return '[^%s]' % fix_charclass(result) def not_id_literal_(keep): """ Make negated id_literal like char class """ match = _re.compile(id_literal_(keep)).match result = ''.join([ chr(c) for c in xrange(127) if not match(chr(c)) ]) return r'[%s]' % fix_charclass(result) not_id_literal = not_id_literal_(r'[a-zA-Z0-9_$]') preregex1 = r'[(,=:\[!&|?{};\r\n]' preregex2 = r'%(not_id_literal)sreturn' % locals() if extended: id_literal = id_literal_(r'[a-zA-Z0-9_$]') id_literal_open = id_literal_(r'[a-zA-Z0-9_${\[(+-]') id_literal_close = id_literal_(r'[a-zA-Z0-9_$}\])"\047+-]') space_sub = _re.compile(( r'([^\047"/\000-\040]+)' r'|(%(strings)s[^\047"/\000-\040]*)' r'|(?:(?<=%(preregex1)s)%(space)s*(%(regex)s[^\047"/\000-\040]*))' r'|(?:(?<=%(preregex2)s)%(space)s*(%(regex)s[^\047"/\000-\040]*))' r'|(?<=%(id_literal_close)s)' r'%(space)s*(?:(%(newline)s)%(space)s*)+' r'(?=%(id_literal_open)s)' r'|(?<=%(id_literal)s)(%(space)s)+(?=%(id_literal)s)' r'|%(space)s+' r'|(?:%(newline)s%(space)s*)+' ) % locals()).sub def space_subber(match): """ Substitution callback """ # pylint: disable = C0321, R0911 groups = match.groups() if groups[0]: return groups[0] elif groups[1]: return groups[1] elif groups[2]: return groups[2] elif groups[3]: return groups[3] elif groups[4]: return '\n' elif groups[5]: return ' ' else: return '' def jsmin(script): # pylint: disable = W0621 r""" Minify javascript based on `jsmin.c by Douglas Crockford`_\. Instead of parsing the stream char by char, it uses a regular expression approach which minifies the whole script with one big substitution regex. .. _jsmin.c by Douglas Crockford: http://www.crockford.com/javascript/jsmin.c :Parameters: `script` : ``str`` Script to minify :Return: Minified script :Rtype: ``str`` """ return space_sub(space_subber, '\n%s\n' % script).strip() else: pre_regex = r'(?:%(preregex1)s|%(preregex2)s)' % locals() not_id_literal_open = not_id_literal_(r'[a-zA-Z0-9_${\[(+-]') not_id_literal_close = not_id_literal_(r'[a-zA-Z0-9_$}\])"\047+-]') space_norm_sub = _re.compile(( r'(%(strings)s)' r'|(?:(%(pre_regex)s)%(space)s*(%(regex)s))' r'|(%(space)s)+' r'|(?:(%(newline)s)%(space)s*)+' ) % locals()).sub def space_norm_subber(match): """ Substitution callback """ # pylint: disable = C0321 groups = match.groups() if groups[0]: return groups[0] elif groups[1]: return groups[1].replace('\r', '\n') + groups[2] elif groups[3]: return ' ' elif groups[4]: return '\n' space_sub1 = _re.compile(( r'[\040\n]?(%(strings)s|%(pre_regex)s%(regex)s)' r'|\040(%(not_id_literal)s)' r'|\n(%(not_id_literal_open)s)' ) % locals()).sub def space_subber1(match): """ Substitution callback """ groups = match.groups() return groups[0] or groups[1] or groups[2] space_sub2 = _re.compile(( r'(%(strings)s)\040?' r'|(%(pre_regex)s%(regex)s)[\040\n]?' r'|(%(not_id_literal)s)\040' r'|(%(not_id_literal_close)s)\n' ) % locals()).sub def space_subber2(match): """ Substitution callback """ groups = match.groups() return groups[0] or groups[1] or groups[2] or groups[3] def jsmin(script): r""" Minify javascript based on `jsmin.c by Douglas Crockford`_\. Instead of parsing the stream char by char, it uses a regular expression approach. The script is minified with three passes: normalization Control character are mapped to spaces, spaces and newlines are squeezed and comments are stripped. space removal 1 Spaces before certain tokens are removed space removal 2 Spaces after certain tokens are remove .. _jsmin.c by Douglas Crockford: http://www.crockford.com/javascript/jsmin.c :Parameters: `script` : ``str`` Script to minify :Return: Minified script :Rtype: ``str`` """ return space_sub2(space_subber2, space_sub1(space_subber1, space_norm_sub(space_norm_subber, '\n%s\n' % script) ) ).strip() return jsmin jsmin = _make_jsmin() ##################### # EXAMPLE USAGE # ##################### # # import jsmin # jsmin.jsmin(script) # def jsmin_for_posers(script): r""" Minify javascript based on `jsmin.c by Douglas Crockford`_\. Instead of parsing the stream char by char, it uses a regular expression approach which minifies the whole script with one big substitution regex. .. _jsmin.c by Douglas Crockford: http://www.crockford.com/javascript/jsmin.c :Warning: This function is the digest of a _make_jsmin() call. It just utilizes the resulting regex. It's just for fun here and may vanish any time. Use the `jsmin` function instead. :Parameters: `script` : ``str`` Script to minify :Return: Minified script :Rtype: ``str`` """ def subber(match): """ Substitution callback """ groups = match.groups() return ( groups[0] or groups[1] or groups[2] or groups[3] or (groups[4] and '\n') or (groups[5] and ' ') or '' ) return _re.sub( r'([^\047"/\000-\040]+)|((?:(?:\047[^\047\\\r\n]*(?:\\(?:[^\r\n]|\r?' r'\n|\r)[^\047\\\r\n]*)*\047)|(?:"[^"\\\r\n]*(?:\\(?:[^\r\n]|\r?\n|' r'\r)[^"\\\r\n]*)*"))[^\047"/\000-\040]*)|(?:(?<=[(,=:\[!&|?{};\r\n]' r')(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/' r'))*((?:/(?![\r\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\[[^\\\]\r\n]*' r'(?:\\[^\r\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*/)[^\047"/\000-\040]*' r'))|(?:(?<=[\000-#%-,./:-@\[-^`{-~-]return)(?:[\000-\011\013\014\01' r'6-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*((?:/(?![\r\n/*])[^/' r'\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]' r'*)*\]))[^/\\\[\r\n]*)*/)[^\047"/\000-\040]*))|(?<=[^\000-!#%&(*,./' r':-@\[\\^`{|~])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/' r'*][^*]*\*+)*/))*(?:((?:(?://[^\r\n]*)?[\r\n]))(?:[\000-\011\013\01' r'4\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+(?=[^\000-#%-\04' r'7)*,./:-@\\-^`|-~])|(?<=[^\000-#%-,./:-@\[-^`{-~-])((?:[\000-\011' r'\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=[^\000-' r'#%-,./:-@\[-^`{-~-])|(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*' r'+(?:[^/*][^*]*\*+)*/))+|(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011' r'\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+', subber, '\n%s\n' % script ).strip() if __name__ == '__main__': import sys as _sys _sys.stdout.write(jsmin(_sys.stdin.read())) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/minify/htmlmin.py��������������������������������������������������0000664�0000000�0000000�00000000756�12564727262�020574� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# coding: utf-8 import re def minify(response): def _replace(match): match = match.group() # save whole <pre>, <textarea> tags, and opening <!-- (so it doesn't break <script>) # otherwise, replace all whitespace with a single space character return match if match.startswith(('<pre', '<textarea', '<!--')) else ' ' cpat = re.compile( r'\s+|<pre(.*?)</pre>|<textarea(.*?)</textarea>|<!--\s', re.DOTALL) return cpat.sub(_replace, response) ������������������web2py-2.12.3.orig/gluon/contrib/minify/minify.py���������������������������������������������������0000664�0000000�0000000�00000011067�12564727262�020414� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # -*- coding: utf-8 -*- """ High-level CSS and JS minification class for web2py. Called by response.include_files() Created by: Ross Peoples <ross.peoples@gmail.com> Modified by: Massimo Di Pierro <massimo.dipierro@gmail.com> """ import cssmin import jsmin import os import hashlib import re def read_binary_file(filename): f = open(filename, 'rb') data = f.read() f.close() return data def write_binary_file(filename, data): f = open(filename, 'wb') f.write(data) f.close() def fix_links(css, static_path): return re.sub(r'url\((["\'])\.\./', 'url(\\1' + static_path, css) def minify(files, path_info, folder, optimize_css, optimize_js, ignore_concat=[], ignore_minify=['/jquery.js', '/anytime.js']): """ Input: files: is a list of URLs to JS and CSS files (not repeated) path_info: is the URL of a temp static folder folder: is the application folder optimize_css: is a string of the form 'concat|minify|inline' optimize_js: is a string of the form 'concat|minify|inline' (minify requires concat, inline requires concat also) Returns a new list of: - filename (absolute or relative, css or js, actual or temporary) or - ('css:inline','...css..') - ('js:inline','...js..') """ optimize_css = optimize_css or '' optimize_js = optimize_js or '' concat_css = 'concat' in optimize_css minify_css = 'minify' in optimize_css inline_css = 'inline' in optimize_css concat_js = 'concat' in optimize_js minify_js = 'minify' in optimize_js inline_js = 'inline' in optimize_js static_path, temp = path_info.rsplit('/', 1) new_files = [] css = [] js = [] processed = [] for k, filename in enumerate(files): if not filename.startswith('/') or \ any(filename.endswith(x) for x in ignore_concat): new_files.append(filename) continue abs_filename = os.path.join( folder, 'static', filename[len(static_path) + 1:]) if filename.lower().endswith('.css'): processed.append(filename) spath_info, sfilename = \ path_info.split('/'), filename.split('/') u = 0 for i, a in enumerate(sfilename): try: if a != spath_info[i]: u = i break except: pass if concat_css: contents = read_binary_file(abs_filename) replacement = '/'.join(spath_info[:u]) + '/' contents = fix_links(contents, replacement) if minify_css: css.append(cssmin.cssmin(contents)) else: css.append(contents) else: css.append(filename) elif filename.lower().endswith('.js'): processed.append(filename) if concat_js: contents = read_binary_file(abs_filename) if minify_js and \ not filename.endswith('.min.js') and \ not any(filename.endswith(x) for x in ignore_minify): js.append(jsmin.jsmin(contents)) else: js.append(contents) else: js.append(filename) dest_key = hashlib.md5(repr(processed)).hexdigest() if css and concat_css: css = '\n\n'.join(contents for contents in css) if not inline_css: temppath = os.path.join(folder, 'static', temp) if not os.path.exists(temppath): os.mkdir(temppath) dest = "compressed_%s.css" % dest_key tempfile = os.path.join(temppath, dest) write_binary_file(tempfile, css) css = path_info + '/%s' % dest new_files.append(css) else: new_files.append(('css:inline', css)) else: new_files += css if js and concat_js: js = '\n'.join(contents for contents in js) if inline_js: js = ('js:inline', js) else: temppath = os.path.join(folder, 'static', temp) if not os.path.exists(temppath): os.mkdir(temppath) dest = "compressed_%s.js" % dest_key tempfile = os.path.join(folder, 'static', temp, dest) write_binary_file(tempfile, js) js = path_info + '/%s' % dest new_files.append(js) else: new_files += js return new_files �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/minify/cssmin.py���������������������������������������������������0000664�0000000�0000000�00000015525�12564727262�020420� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # -*- coding: utf-8 -*- """`cssmin` - A Python port of the YUI CSS compressor.""" """ Home page: https://github.com/zacharyvoase/cssmin License: BSD: https://github.com/zacharyvoase/cssmin/blob/master/LICENSE Original author: Zachary Voase Modified for inclusion into web2py by: Ross Peoples <ross.peoples@gmail.com> """ from StringIO import StringIO # The pure-Python StringIO supports unicode. import re __version__ = '0.1.4' def remove_comments(css): """Remove all CSS comment blocks.""" iemac = False preserve = False comment_start = css.find("/*") while comment_start >= 0: # Preserve comments that look like `/*!...*/`. # Slicing is used to make sure we don"t get an IndexError. preserve = css[comment_start + 2:comment_start + 3] == "!" comment_end = css.find("*/", comment_start + 2) if comment_end < 0: if not preserve: css = css[:comment_start] break elif comment_end >= (comment_start + 2): if css[comment_end - 1] == "\\": # This is an IE Mac-specific comment; leave this one and the # following one alone. comment_start = comment_end + 2 iemac = True elif iemac: comment_start = comment_end + 2 iemac = False elif not preserve: css = css[:comment_start] + css[comment_end + 2:] else: comment_start = comment_end + 2 comment_start = css.find("/*", comment_start) return css def remove_unnecessary_whitespace(css): """Remove unnecessary whitespace characters.""" def pseudoclasscolon(css): """ Prevents 'p :link' from becoming 'p:link'. Translates 'p :link' into 'p ___PSEUDOCLASSCOLON___link'; this is translated back again later. """ regex = re.compile(r"(^|\})(([^\{\:])+\:)+([^\{]*\{)") match = regex.search(css) while match: css = ''.join([ css[:match.start()], match.group().replace(":", "___PSEUDOCLASSCOLON___"), css[match.end():]]) match = regex.search(css) return css css = pseudoclasscolon(css) # Remove spaces from before things. css = re.sub(r"\s+([!{};:>+\(\)\],])", r"\1", css) # If there is a `@charset`, then only allow one, and move to the beginning. css = re.sub(r"^(.*)(@charset \"[^\"]*\";)", r"\2\1", css) css = re.sub(r"^(\s*@charset [^;]+;\s*)+", r"\1", css) # Put the space back in for a few cases, such as `@media screen` and # `(-webkit-min-device-pixel-ratio:0)`. css = re.sub(r"\band\(", "and (", css) # Put the colons back. css = css.replace('___PSEUDOCLASSCOLON___', ':') # Remove spaces from after things. css = re.sub(r"([!{}:;>+\(\[,])\s+", r"\1", css) return css def remove_unnecessary_semicolons(css): """Remove unnecessary semicolons.""" return re.sub(r";+\}", "}", css) def remove_empty_rules(css): """Remove empty rules.""" return re.sub(r"[^\}\{]+\{\}", "", css) def normalize_rgb_colors_to_hex(css): """Convert `rgb(51,102,153)` to `#336699`.""" regex = re.compile(r"rgb\s*\(\s*([0-9,\s]+)\s*\)") match = regex.search(css) while match: colors = map(lambda s: s.strip(), match.group(1).split(",")) hexcolor = '#%.2x%.2x%.2x' % tuple(map(int, colors)) css = css.replace(match.group(), hexcolor) match = regex.search(css) return css def condense_zero_units(css): """Replace `0(px, em, %, etc)` with `0`.""" return re.sub(r"([\s:])(0)(px|em|%|in|cm|mm|pc|pt|ex)", r"\1\2", css) def condense_multidimensional_zeros(css): """Replace `:0 0 0 0;`, `:0 0 0;` etc. with `:0;`.""" css = css.replace(":0 0 0 0;", ":0;") css = css.replace(":0 0 0;", ":0;") css = css.replace(":0 0;", ":0;") # Revert `background-position:0;` to the valid `background-position:0 0;`. css = css.replace("background-position:0;", "background-position:0 0;") return css def condense_floating_points(css): """Replace `0.6` with `.6` where possible.""" return re.sub(r"(:|\s)0+\.(\d+)", r"\1.\2", css) def condense_hex_colors(css): """Shorten colors from #AABBCC to #ABC where possible.""" regex = re.compile(r"([^\"'=\s])(\s*)#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])") match = regex.search(css) while match: first = match.group(3) + match.group(5) + match.group(7) second = match.group(4) + match.group(6) + match.group(8) if first.lower() == second.lower(): css = css.replace( match.group(), match.group(1) + match.group(2) + '#' + first) match = regex.search(css, match.end() - 3) else: match = regex.search(css, match.end()) return css def condense_whitespace(css): """Condense multiple adjacent whitespace characters into one.""" return re.sub(r"\s+", " ", css) def condense_semicolons(css): """Condense multiple adjacent semicolon characters into one.""" return re.sub(r";;+", ";", css) def wrap_css_lines(css, line_length): """Wrap the lines of the given CSS to an approximate length.""" lines = [] line_start = 0 for i, char in enumerate(css): # It's safe to break after `}` characters. if char == '}' and (i - line_start >= line_length): lines.append(css[line_start:i + 1]) line_start = i + 1 if line_start < len(css): lines.append(css[line_start:]) return '\n'.join(lines) def cssmin(css, wrap=None): css = remove_comments(css) css = condense_whitespace(css) # A pseudo class for the Box Model Hack # (see http://tantek.com/CSS/Examples/boxmodelhack.html) css = css.replace('"\\"}\\""', "___PSEUDOCLASSBMH___") css = remove_unnecessary_whitespace(css) css = remove_unnecessary_semicolons(css) css = condense_zero_units(css) css = condense_multidimensional_zeros(css) css = condense_floating_points(css) css = normalize_rgb_colors_to_hex(css) css = condense_hex_colors(css) if wrap is not None: css = wrap_css_lines(css, wrap) css = css.replace("___PSEUDOCLASSBMH___", '"\\"}\\""') css = condense_semicolons(css) return css.strip() def main(): import optparse import sys p = optparse.OptionParser( prog="cssmin", version=__version__, usage="%prog [--wrap N]", description="""Reads raw CSS from stdin, and writes compressed CSS to stdout.""") p.add_option( '-w', '--wrap', type='int', default=None, metavar='N', help="Wrap output to approximately N chars per line.") options, args = p.parse_args() sys.stdout.write(cssmin(sys.stdin.read(), wrap=options.wrap)) if __name__ == '__main__': main() ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/pysimplesoap/������������������������������������������������������0000775�0000000�0000000�00000000000�12564727262�017774� 5����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/pysimplesoap/transport.py������������������������������������������0000664�0000000�0000000�00000023171�12564727262�022406� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/python # -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by the # Free Software Foundation; either version 3, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. """Pythonic simple SOAP Client transport""" import logging import sys try: import urllib2 from cookielib import CookieJar except ImportError: from urllib import request as urllib2 from http.cookiejar import CookieJar from . import __author__, __copyright__, __license__, __version__, TIMEOUT from .simplexml import SimpleXMLElement, TYPE_MAP, OrderedDict log = logging.getLogger(__name__) # # Socket wrapper to enable socket.TCP_NODELAY - this greatly speeds up transactions in Linux # WARNING: this will modify the standard library socket module, use with care! # TODO: implement this as a transport faciliy # (to pass options directly to httplib2 or pycurl) # be aware of metaclasses and socks.py (SocksiPy) used by httplib2 if False: import socket realsocket = socket.socket def socketwrap(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0): sockobj = realsocket(family, type, proto) if type == socket.SOCK_STREAM: sockobj.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) return sockobj socket.socket = socketwrap # # We store metadata about what available transport mechanisms we have available. # _http_connectors = {} # libname: classimpl mapping _http_facilities = {} # functionalitylabel: [sequence of libname] mapping class TransportBase: @classmethod def supports_feature(cls, feature_name): return cls._wrapper_name in _http_facilities[feature_name] # # httplib2 support. # try: import httplib2 if sys.version > '3' and httplib2.__version__ <= "0.7.7": import http.client # httplib2 workaround: check_hostname needs a SSL context with either # CERT_OPTIONAL or CERT_REQUIRED # see https://code.google.com/p/httplib2/issues/detail?id=173 orig__init__ = http.client.HTTPSConnection.__init__ def fixer(self, host, port, key_file, cert_file, timeout, context, check_hostname, *args, **kwargs): chk = kwargs.get('disable_ssl_certificate_validation', True) ^ True orig__init__(self, host, port=port, key_file=key_file, cert_file=cert_file, timeout=timeout, context=context, check_hostname=chk) http.client.HTTPSConnection.__init__ = fixer except ImportError: TIMEOUT = None # timeout not supported by urllib2 pass else: class Httplib2Transport(httplib2.Http, TransportBase): _wrapper_version = "httplib2 %s" % httplib2.__version__ _wrapper_name = 'httplib2' def __init__(self, timeout, proxy=None, cacert=None, sessions=False): ##httplib2.debuglevel=4 kwargs = {} if proxy: import socks kwargs['proxy_info'] = httplib2.ProxyInfo(proxy_type=socks.PROXY_TYPE_HTTP, **proxy) log.info("using proxy %s" % proxy) # set optional parameters according supported httplib2 version if httplib2.__version__ >= '0.3.0': kwargs['timeout'] = timeout if httplib2.__version__ >= '0.7.0': kwargs['disable_ssl_certificate_validation'] = cacert is None kwargs['ca_certs'] = cacert httplib2.Http.__init__(self, **kwargs) _http_connectors['httplib2'] = Httplib2Transport _http_facilities.setdefault('proxy', []).append('httplib2') _http_facilities.setdefault('cacert', []).append('httplib2') import inspect if 'timeout' in inspect.getargspec(httplib2.Http.__init__)[0]: _http_facilities.setdefault('timeout', []).append('httplib2') # # urllib2 support. # class urllib2Transport(TransportBase): _wrapper_version = "urllib2 %s" % urllib2.__version__ _wrapper_name = 'urllib2' def __init__(self, timeout=None, proxy=None, cacert=None, sessions=False): if (timeout is not None) and not self.supports_feature('timeout'): raise RuntimeError('timeout is not supported with urllib2 transport') if proxy: raise RuntimeError('proxy is not supported with urllib2 transport') if cacert: raise RuntimeError('cacert is not support with urllib2 transport') self.request_opener = urllib2.urlopen if sessions: opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(CookieJar())) self.request_opener = opener.open self._timeout = timeout def request(self, url, method="GET", body=None, headers={}): req = urllib2.Request(url, body, headers) try: f = self.request_opener(req, timeout=self._timeout) return f.info(), f.read() except urllib2.HTTPError as f: if f.code != 500: raise return f.info(), f.read() _http_connectors['urllib2'] = urllib2Transport _http_facilities.setdefault('sessions', []).append('urllib2') import sys if sys.version_info >= (2, 6): _http_facilities.setdefault('timeout', []).append('urllib2') del sys # # pycurl support. # experimental: pycurl seems faster + better proxy support (NTLM) + ssl features # try: import pycurl except ImportError: pass else: try: from cStringIO import StringIO except ImportError: try: from StringIO import StringIO except ImportError: from io import StringIO class pycurlTransport(TransportBase): _wrapper_version = pycurl.version _wrapper_name = 'pycurl' def __init__(self, timeout, proxy=None, cacert=None, sessions=False): self.timeout = timeout self.proxy = proxy or {} self.cacert = cacert def request(self, url, method, body, headers): c = pycurl.Curl() c.setopt(pycurl.URL, url) if 'proxy_host' in self.proxy: c.setopt(pycurl.PROXY, self.proxy['proxy_host']) if 'proxy_port' in self.proxy: c.setopt(pycurl.PROXYPORT, self.proxy['proxy_port']) if 'proxy_user' in self.proxy: c.setopt(pycurl.PROXYUSERPWD, "%(proxy_user)s:%(proxy_pass)s" % self.proxy) self.buf = StringIO() c.setopt(pycurl.WRITEFUNCTION, self.buf.write) #c.setopt(pycurl.READFUNCTION, self.read) #self.body = StringIO(body) #c.setopt(pycurl.HEADERFUNCTION, self.header) if self.cacert: c.setopt(c.CAINFO, self.cacert) c.setopt(pycurl.SSL_VERIFYPEER, self.cacert and 1 or 0) c.setopt(pycurl.SSL_VERIFYHOST, self.cacert and 2 or 0) c.setopt(pycurl.CONNECTTIMEOUT, self.timeout / 6) c.setopt(pycurl.TIMEOUT, self.timeout) if method == 'POST': c.setopt(pycurl.POST, 1) c.setopt(pycurl.POSTFIELDS, body) if headers: hdrs = ['%s: %s' % (k, v) for k, v in headers.items()] log.debug(hdrs) c.setopt(pycurl.HTTPHEADER, hdrs) c.perform() c.close() return {}, self.buf.getvalue() _http_connectors['pycurl'] = pycurlTransport _http_facilities.setdefault('proxy', []).append('pycurl') _http_facilities.setdefault('cacert', []).append('pycurl') _http_facilities.setdefault('timeout', []).append('pycurl') class DummyTransport: """Testing class to load a xml response""" def __init__(self, xml_response): self.xml_response = xml_response def request(self, location, method, body, headers): log.debug("%s %s", method, location) log.debug(headers) log.debug(body) return {}, self.xml_response def get_http_wrapper(library=None, features=[]): # If we are asked for a specific library, return it. if library is not None: try: return _http_connectors[library] except KeyError: raise RuntimeError('%s transport is not available' % (library,)) # If we haven't been asked for a specific feature either, then just return our favourite # implementation. if not features: return _http_connectors.get('httplib2', _http_connectors['urllib2']) # If we are asked for a connector which supports the given features, then we will # try that. current_candidates = _http_connectors.keys() new_candidates = [] for feature in features: for candidate in current_candidates: if candidate in _http_facilities.get(feature, []): new_candidates.append(candidate) current_candidates = new_candidates new_candidates = [] # Return the first candidate in the list. try: candidate_name = current_candidates[0] except IndexError: raise RuntimeError("no transport available which supports these features: %s" % (features,)) else: return _http_connectors[candidate_name] def set_http_wrapper(library=None, features=[]): """Set a suitable HTTP connection wrapper.""" global Http Http = get_http_wrapper(library, features) return Http def get_Http(): """Return current transport class""" global Http return Http # define the default HTTP connection class (it can be changed at runtime!): set_http_wrapper() �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/pysimplesoap/__init__.py�������������������������������������������0000775�0000000�0000000�00000000463�12564727262�022113� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # -*- coding: utf-8 -*- """PySimpleSOAP""" __author__ = "Mariano Reingart" __author_email__ = "reingart@gmail.com" __copyright__ = "Copyright (C) 2013 Mariano Reingart" __license__ = "LGPL 3.0" __version__ = "1.11" TIMEOUT = 60 from . import client, server, simplexml, transport �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/pysimplesoap/client.py���������������������������������������������0000775�0000000�0000000�00000102010�12564727262�021621� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/python # -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by the # Free Software Foundation; either version 3, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. """Pythonic simple SOAP Client implementation""" from __future__ import unicode_literals import sys if sys.version > '3': unicode = str try: import cPickle as pickle except ImportError: import pickle import hashlib import logging import os import tempfile from . import __author__, __copyright__, __license__, __version__, TIMEOUT from .simplexml import SimpleXMLElement, TYPE_MAP, REVERSE_TYPE_MAP, OrderedDict from .transport import get_http_wrapper, set_http_wrapper, get_Http # Utility functions used throughout wsdl_parse, moved aside for readability from .helpers import fetch, sort_dict, make_key, process_element, \ postprocess_element, get_message, preprocess_schema, \ get_local_name, get_namespace_prefix, TYPE_MAP, urlsplit log = logging.getLogger(__name__) class SoapFault(RuntimeError): def __init__(self, faultcode, faultstring): self.faultcode = faultcode self.faultstring = faultstring RuntimeError.__init__(self, faultcode, faultstring) def __unicode__(self): return '%s: %s' % (self.faultcode, self.faultstring) if sys.version > '3': __str__ = __unicode__ else: def __str__(self): return self.__unicode__().encode('ascii', 'ignore') def __repr__(self): return "SoapFault(%s, %s)" % (repr(self.faultcode), repr(self.faultstring)) # soap protocol specification & namespace soap_namespaces = dict( soap11='http://schemas.xmlsoap.org/soap/envelope/', soap='http://schemas.xmlsoap.org/soap/envelope/', soapenv='http://schemas.xmlsoap.org/soap/envelope/', soap12='http://www.w3.org/2003/05/soap-env', soap12env="http://www.w3.org/2003/05/soap-envelope", ) class SoapClient(object): """Simple SOAP Client (simil PHP)""" def __init__(self, location=None, action=None, namespace=None, cert=None, exceptions=True, proxy=None, ns=None, soap_ns=None, wsdl=None, wsdl_basedir='', cache=False, cacert=None, sessions=False, soap_server=None, timeout=TIMEOUT, http_headers=None, trace=False, username=None, password=None, ): """ :param http_headers: Additional HTTP Headers; example: {'Host': 'ipsec.example.com'} """ self.certssl = cert self.keyssl = None self.location = location # server location (url) self.action = action # SOAP base action self.namespace = namespace # message self.exceptions = exceptions # lanzar execpiones? (Soap Faults) self.xml_request = self.xml_response = '' self.http_headers = http_headers or {} # extract the base directory / url for wsdl relative imports: if wsdl and wsdl_basedir == '': # parse the wsdl url, strip the scheme and filename url_scheme, netloc, path, query, fragment = urlsplit(wsdl) wsdl_basedir = os.path.dirname(netloc + path) self.wsdl_basedir = wsdl_basedir # shortcut to print all debugging info and sent / received xml messages if trace: logging.basicConfig(level=logging.DEBUG) if not soap_ns and not ns: self.__soap_ns = 'soap' # 1.1 elif not soap_ns and ns: self.__soap_ns = 'soapenv' # 1.2 else: self.__soap_ns = soap_ns # SOAP Server (special cases like oracle, jbossas6 or jetty) self.__soap_server = soap_server # SOAP Header support self.__headers = {} # general headers self.__call_headers = None # OrderedDict to be marshalled for RPC Call # check if the Certification Authority Cert is a string and store it if cacert and cacert.startswith('-----BEGIN CERTIFICATE-----'): fd, filename = tempfile.mkstemp() f = os.fdopen(fd, 'w+b', -1) log.debug("Saving CA certificate to %s" % filename) f.write(cacert) cacert = filename f.close() self.cacert = cacert # Create HTTP wrapper Http = get_Http() self.http = Http(timeout=timeout, cacert=cacert, proxy=proxy, sessions=sessions) if username and password: if hasattr(self.http, 'add_credentials'): self.http.add_credentials(username, password) # namespace prefix, None to use xmlns attribute or False to not use it: self.__ns = ns if not ns: self.__xml = """<?xml version="1.0" encoding="UTF-8"?> <%(soap_ns)s:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:%(soap_ns)s="%(soap_uri)s"> <%(soap_ns)s:Header/> <%(soap_ns)s:Body> <%(method)s xmlns="%(namespace)s"> </%(method)s> </%(soap_ns)s:Body> </%(soap_ns)s:Envelope>""" else: self.__xml = """<?xml version="1.0" encoding="UTF-8"?> <%(soap_ns)s:Envelope xmlns:%(soap_ns)s="%(soap_uri)s" xmlns:%(ns)s="%(namespace)s"> <%(soap_ns)s:Header/> <%(soap_ns)s:Body> <%(ns)s:%(method)s> </%(ns)s:%(method)s> </%(soap_ns)s:Body> </%(soap_ns)s:Envelope>""" # parse wsdl url self.services = wsdl and self.wsdl_parse(wsdl, cache=cache) self.service_port = None # service port for late binding def __getattr__(self, attr): """Return a pseudo-method that can be called""" if not self.services: # not using WSDL? return lambda self=self, *args, **kwargs: self.call(attr, *args, **kwargs) else: # using WSDL: return lambda *args, **kwargs: self.wsdl_call(attr, *args, **kwargs) def call(self, method, *args, **kwargs): """Prepare xml request and make SOAP call, returning a SimpleXMLElement. If a keyword argument called "headers" is passed with a value of a SimpleXMLElement object, then these headers will be inserted into the request. """ #TODO: method != input_message # Basic SOAP request: xml = self.__xml % dict(method=method, # method tag name namespace=self.namespace, # method ns uri ns=self.__ns, # method ns prefix soap_ns=self.__soap_ns, # soap prefix & uri soap_uri=soap_namespaces[self.__soap_ns]) request = SimpleXMLElement(xml, namespace=self.__ns and self.namespace, prefix=self.__ns) request_headers = kwargs.pop('headers', None) # serialize parameters if kwargs: parameters = list(kwargs.items()) else: parameters = args if parameters and isinstance(parameters[0], SimpleXMLElement): # merge xmlelement parameter ("raw" - already marshalled) if parameters[0].children() is not None: for param in parameters[0].children(): getattr(request, method).import_node(param) for k,v in parameters[0].attributes().items(): getattr(request, method)[k] = v elif parameters: # marshall parameters: use_ns = None if (self.__soap_server == "jetty" or self.qualified is False) else True for k, v in parameters: # dict: tag=valor getattr(request, method).marshall(k, v, ns=use_ns) elif not self.__soap_server in ('oracle',) or self.__soap_server in ('jbossas6',): # JBossAS-6 requires no empty method parameters! delattr(request("Body", ns=list(soap_namespaces.values()),), method) # construct header and parameters (if not wsdl given) except wsse if self.__headers and not self.services: self.__call_headers = dict([(k, v) for k, v in self.__headers.items() if not k.startswith('wsse:')]) # always extract WS Security header and send it if 'wsse:Security' in self.__headers: #TODO: namespaces too hardwired, clean-up... header = request('Header', ns=list(soap_namespaces.values()),) k = 'wsse:Security' v = self.__headers[k] header.marshall(k, v, ns=False, add_children_ns=False) header(k)['xmlns:wsse'] = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' #<wsse:UsernameToken xmlns:wsu='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'> if self.__call_headers: header = request('Header', ns=list(soap_namespaces.values()),) for k, v in self.__call_headers.items(): ##if not self.__ns: ## header['xmlns'] if isinstance(v, SimpleXMLElement): # allows a SimpleXMLElement to be constructed and inserted # rather than a dictionary. marshall doesn't allow ns: prefixes # in dict key names header.import_node(v) else: header.marshall(k, v, ns=self.__ns, add_children_ns=False) if request_headers: header = request('Header', ns=list(soap_namespaces.values()),) for subheader in request_headers.children(): header.import_node(subheader) self.xml_request = request.as_xml() self.xml_response = self.send(method, self.xml_request) response = SimpleXMLElement(self.xml_response, namespace=self.namespace, jetty=self.__soap_server in ('jetty',)) if self.exceptions and response("Fault", ns=list(soap_namespaces.values()), error=False): raise SoapFault(unicode(response.faultcode), unicode(response.faultstring)) return response def send(self, method, xml): """Send SOAP request using HTTP""" if self.location == 'test': return # location = '%s' % self.location #?op=%s" % (self.location, method) location = str(self.location) if self.services: soap_action = str(self.action) else: soap_action = str(self.action) + method headers = { 'Content-type': 'text/xml; charset="UTF-8"', 'Content-length': str(len(xml)), 'SOAPAction': '"%s"' % soap_action } headers.update(self.http_headers) log.info("POST %s" % location) log.debug('\n'.join(["%s: %s" % (k, v) for k, v in headers.items()])) log.debug(xml) response, content = self.http.request( location, 'POST', body=xml, headers=headers) self.response = response self.content = content log.debug('\n'.join(["%s: %s" % (k, v) for k, v in response.items()])) log.debug(content) return content def get_operation(self, method): # try to find operation in wsdl file soap_ver = self.__soap_ns.startswith('soap12') and 'soap12' or 'soap11' if not self.service_port: for service_name, service in self.services.items(): for port_name, port in [port for port in service['ports'].items()]: if port['soap_ver'] == soap_ver: self.service_port = service_name, port_name break else: raise RuntimeError('Cannot determine service in WSDL: ' 'SOAP version: %s' % soap_ver) else: port = self.services[self.service_port[0]]['ports'][self.service_port[1]] if not self.location: self.location = port['location'] operation = port['operations'].get(method) if not operation: raise RuntimeError('Operation %s not found in WSDL: ' 'Service/Port Type: %s' % (method, self.service_port)) return operation def wsdl_call(self, method, *args, **kwargs): """Pre and post process SOAP call, input and output parameters using WSDL""" soap_uri = soap_namespaces[self.__soap_ns] operation = self.get_operation(method) # get i/o type declarations: input = operation['input'] output = operation['output'] header = operation.get('header') if 'action' in operation: self.action = operation['action'] if 'namespace' in operation: self.namespace = operation['namespace'] or '' self.qualified = operation['qualified'] # construct header and parameters if header: self.__call_headers = sort_dict(header, self.__headers) method, params = self.wsdl_call_get_params(method, input, *args, **kwargs) # call remote procedure response = self.call(method, *params) # parse results: resp = response('Body', ns=soap_uri).children().unmarshall(output) return resp and list(resp.values())[0] # pass Response tag children def wsdl_call_get_params(self, method, input, *args, **kwargs): """Build params from input and args/kwargs""" params = inputname = inputargs = None all_args = {} if input: inputname = list(input.keys())[0] inputargs = input[inputname] if input and args: # convert positional parameters to named parameters: d = {} for idx, arg in enumerate(args): key = list(inputargs.keys())[idx] if isinstance(arg, dict): if key in arg: d[key] = arg[key] else: raise KeyError('Unhandled key %s. use client.help(method)') else: d[key] = arg all_args.update({inputname: d}) if input and (kwargs or all_args): if kwargs: all_args.update({inputname: kwargs}) valid, errors, warnings = self.wsdl_validate_params(input, all_args) if not valid: raise ValueError('Invalid Args Structure. Errors: %s' % errors) params = list(sort_dict(input, all_args).values())[0].items() # TODO: check style and document attributes if self.__soap_server in ('axis', ): # use the operation name method = method else: # use the message (element) name method = inputname #elif not input: #TODO: no message! (see wsmtxca.dummy) else: params = kwargs and kwargs.items() return (method, params) def wsdl_validate_params(self, struct, value): """Validate the arguments (actual values) for the parameters structure. Fail for any invalid arguments or type mismatches.""" errors = [] warnings = [] valid = True # Determine parameter type if type(struct) == type(value): typematch = True if not isinstance(struct, dict) and isinstance(value, dict): typematch = True # struct can be an OrderedDict else: typematch = False if struct == str: struct = unicode # fix for py2 vs py3 string handling if not isinstance(struct, (list, dict, tuple)) and struct in TYPE_MAP.keys(): if not type(value) == struct: try: struct(value) # attempt to cast input to parameter type except: valid = False errors.append('Type mismatch for argument value. parameter(%s): %s, value(%s): %s' % (type(struct), struct, type(value), value)) elif isinstance(struct, list) and len(struct) == 1 and not isinstance(value, list): # parameter can have a dict in a list: [{}] indicating a list is allowed, but not needed if only one argument. next_valid, next_errors, next_warnings = self.wsdl_validate_params(struct[0], value) if not next_valid: valid = False errors.extend(next_errors) warnings.extend(next_warnings) # traverse tree elif isinstance(struct, dict): if struct and value: for key in value: if key not in struct: valid = False errors.append('Argument key %s not in parameter. parameter: %s, args: %s' % (key, struct, value)) else: next_valid, next_errors, next_warnings = self.wsdl_validate_params(struct[key], value[key]) if not next_valid: valid = False errors.extend(next_errors) warnings.extend(next_warnings) for key in struct: if key not in value: warnings.append('Parameter key %s not in args. parameter: %s, value: %s' % (key, struct, value)) elif struct and not value: warnings.append('parameter keys not in args. parameter: %s, args: %s' % (struct, value)) elif not struct and value: valid = False errors.append('Args keys not in parameter. parameter: %s, args: %s' % (struct, value)) else: pass elif isinstance(struct, list): struct_list_value = struct[0] for item in value: next_valid, next_errors, next_warnings = self.wsdl_validate_params(struct_list_value, item) if not next_valid: valid = False errors.extend(next_errors) warnings.extend(next_warnings) elif not typematch: valid = False errors.append('Type mismatch. parameter(%s): %s, value(%s): %s' % (type(struct), struct, type(value), value)) return (valid, errors, warnings) def help(self, method): """Return operation documentation and invocation/returned value example""" operation = self.get_operation(method) input = operation.get('input') input = input and input.values() and list(input.values())[0] if isinstance(input, dict): input = ", ".join("%s=%s" % (k, repr(v)) for k, v in input.items()) elif isinstance(input, list): input = repr(input) output = operation.get('output') if output: output = list(operation['output'].values())[0] headers = operation.get('headers') or None return "%s(%s)\n -> %s:\n\n%s\nHeaders: %s" % ( method, input or '', output and output or '', operation.get('documentation', ''), headers, ) def wsdl_parse(self, url, cache=False): """Parse Web Service Description v1.1""" log.debug('Parsing wsdl url: %s' % url) # Try to load a previously parsed wsdl: force_download = False if cache: # make md5 hash of the url for caching... filename_pkl = '%s.pkl' % hashlib.md5(url).hexdigest() if isinstance(cache, basestring): filename_pkl = os.path.join(cache, filename_pkl) if os.path.exists(filename_pkl): log.debug('Unpickle file %s' % (filename_pkl, )) f = open(filename_pkl, 'r') pkl = pickle.load(f) f.close() # sanity check: if pkl['version'][:-1] != __version__.split(' ')[0][:-1] or pkl['url'] != url: import warnings warnings.warn('version or url mismatch! discarding cached wsdl', RuntimeWarning) log.debug('Version: %s %s' % (pkl['version'], __version__)) log.debug('URL: %s %s' % (pkl['url'], url)) force_download = True else: self.namespace = pkl['namespace'] self.documentation = pkl['documentation'] return pkl['services'] soap_ns = { 'http://schemas.xmlsoap.org/wsdl/soap/': 'soap11', 'http://schemas.xmlsoap.org/wsdl/soap12/': 'soap12', } wsdl_uri = 'http://schemas.xmlsoap.org/wsdl/' xsd_uri = 'http://www.w3.org/2001/XMLSchema' xsi_uri = 'http://www.w3.org/2001/XMLSchema-instance' # always return an unicode object: REVERSE_TYPE_MAP['string'] = str # Open uri and read xml: xml = fetch(url, self.http, cache, force_download, self.wsdl_basedir) # Parse WSDL XML: wsdl = SimpleXMLElement(xml, namespace=wsdl_uri) # Extract useful data: self.namespace = "" self.documentation = unicode(wsdl('documentation', error=False)) or '' # some wsdl are splitted down in several files, join them: imported_wsdls = {} for element in wsdl.children() or []: if element.get_local_name() in ('import'): wsdl_namespace = element['namespace'] wsdl_location = element['location'] if wsdl_location is None: log.warning('WSDL location not provided for %s!' % wsdl_namespace) continue if wsdl_location in imported_wsdls: log.warning('WSDL %s already imported!' % wsdl_location) continue imported_wsdls[wsdl_location] = wsdl_namespace log.debug('Importing wsdl %s from %s' % (wsdl_namespace, wsdl_location)) # Open uri and read xml: xml = fetch(wsdl_location, self.http, cache, force_download, self.wsdl_basedir) # Parse imported XML schema (recursively): imported_wsdl = SimpleXMLElement(xml, namespace=xsd_uri) # merge the imported wsdl into the main document: wsdl.import_node(imported_wsdl) # warning: do not process schemas to avoid infinite recursion! # detect soap prefix and uri (xmlns attributes of <definitions>) xsd_ns = None soap_uris = {} for k, v in wsdl[:]: if v in soap_ns and k.startswith('xmlns:'): soap_uris[get_local_name(k)] = v if v == xsd_uri and k.startswith('xmlns:'): xsd_ns = get_local_name(k) services = {} bindings = {} # binding_name: binding operations = {} # operation_name: operation port_type_bindings = {} # port_type_name: binding messages = {} # message: element elements = {} # element: type def for service in wsdl.service: service_name = service['name'] if not service_name: continue # empty service? serv = services.setdefault(service_name, {'ports': {}}) serv['documentation'] = service['documentation'] or '' for port in service.port: binding_name = get_local_name(port['binding']) operations[binding_name] = {} address = port('address', ns=list(soap_uris.values()), error=False) location = address and address['location'] or None soap_uri = address and soap_uris.get(address.get_prefix()) soap_ver = soap_uri and soap_ns.get(soap_uri) bindings[binding_name] = {'name': binding_name, 'service_name': service_name, 'location': location, 'soap_uri': soap_uri, 'soap_ver': soap_ver, } serv['ports'][port['name']] = bindings[binding_name] for binding in wsdl.binding: binding_name = binding['name'] soap_binding = binding('binding', ns=list(soap_uris.values()), error=False) transport = soap_binding and soap_binding['transport'] or None port_type_name = get_local_name(binding['type']) bindings[binding_name].update({ 'port_type_name': port_type_name, 'transport': transport, 'operations': {}, }) if port_type_name not in port_type_bindings: port_type_bindings[port_type_name] = [] port_type_bindings[port_type_name].append(bindings[binding_name]) for operation in binding.operation: op_name = operation['name'] op = operation('operation', ns=list(soap_uris.values()), error=False) action = op and op['soapAction'] d = operations[binding_name].setdefault(op_name, {}) bindings[binding_name]['operations'][op_name] = d d.update({'name': op_name}) d['parts'] = {} # input and/or ouput can be not present! input = operation('input', error=False) body = input and input('body', ns=list(soap_uris.values()), error=False) d['parts']['input_body'] = body and body['parts'] or None output = operation('output', error=False) body = output and output('body', ns=list(soap_uris.values()), error=False) d['parts']['output_body'] = body and body['parts'] or None header = input and input('header', ns=list(soap_uris.values()), error=False) d['parts']['input_header'] = header and {'message': header['message'], 'part': header['part']} or None header = output and output('header', ns=list(soap_uris.values()), error=False) d['parts']['output_header'] = header and {'message': header['message'], 'part': header['part']} or None if action: d['action'] = action # check axis2 namespace at schema types attributes (europa.eu checkVat) if "http://xml.apache.org/xml-soap" in dict(wsdl[:]).values(): # get the sub-namespace in the first schema element (see issue 8) if wsdl('types', error=False): schema = wsdl.types('schema', ns=xsd_uri) attrs = dict(schema[:]) self.namespace = attrs.get('targetNamespace', self.namespace) if not self.namespace or self.namespace == "urn:DefaultNamespace": self.namespace = wsdl['targetNamespace'] or self.namespace imported_schemas = {} global_namespaces = {None: self.namespace} # process current wsdl schema (if any): if wsdl('types', error=False): for schema in wsdl.types('schema', ns=xsd_uri): preprocess_schema(schema, imported_schemas, elements, xsd_uri, self.__soap_server, self.http, cache, force_download, self.wsdl_basedir, global_namespaces=global_namespaces) # 2nd phase: alias, postdefined elements, extend bases, convert lists postprocess_element(elements, []) for message in wsdl.message: for part in message('part', error=False) or []: element = {} element_name = part['element'] if not element_name: # some implementations (axis) uses type instead element_name = part['type'] type_ns = get_namespace_prefix(element_name) type_uri = wsdl.get_namespace_uri(type_ns) if type_uri == xsd_uri: element_name = get_local_name(element_name) fn = REVERSE_TYPE_MAP.get(element_name, None) element = {part['name']: fn} # emulate a true Element (complexType) list(messages.setdefault((message['name'], None), {message['name']: OrderedDict()}).values())[0].update(element) else: element_name = get_local_name(element_name) fn = elements.get(make_key(element_name, 'element', type_uri)) if not fn: # some axis servers uses complexType for part messages fn = elements.get(make_key(element_name, 'complexType', type_uri)) element = {message['name']: {part['name']: fn}} else: element = {element_name: fn} messages[(message['name'], part['name'])] = element for port_type in wsdl.portType: port_type_name = port_type['name'] for binding in port_type_bindings.get(port_type_name, []): for operation in port_type.operation: op_name = operation['name'] op = operations[binding['name']][op_name] op['documentation'] = unicode(operation('documentation', error=False)) or '' if binding['soap_ver']: #TODO: separe operation_binding from operation (non SOAP?) if operation('input', error=False): input_msg = get_local_name(operation.input['message']) input_header = op['parts'].get('input_header') if input_header: header_msg = get_local_name(input_header.get('message')) header_part = get_local_name(input_header.get('part')) # warning: some implementations use a separate message! header = get_message(messages, header_msg or input_msg, header_part) else: header = None # not enought info to search the header message: op['input'] = get_message(messages, input_msg, op['parts'].get('input_body')) op['header'] = header try: element = list(op['input'].values())[0] ns_uri = element.namespace qualified = element.qualified except AttributeError: # TODO: fix if no parameters parsed or "variants" ns = get_namespace_prefix(operation.input['message']) ns_uri = operation.get_namespace_uri(ns) qualified = None if ns_uri: op['namespace'] = ns_uri op['qualified'] = qualified else: op['input'] = None op['header'] = None if operation('output', error=False): output_msg = get_local_name(operation.output['message']) op['output'] = get_message(messages, output_msg, op['parts'].get('output_body')) else: op['output'] = None # dump the full service/port/operation map #log.debug(pprint.pformat(services)) # Save parsed wsdl (cache) if cache: f = open(filename_pkl, "wb") pkl = { 'version': __version__.split(' ')[0], 'url': url, 'namespace': self.namespace, 'documentation': self.documentation, 'services': services, } pickle.dump(pkl, f) f.close() return services def __setitem__(self, item, value): """Set SOAP Header value - this header will be sent for every request.""" self.__headers[item] = value def close(self): """Finish the connection and remove temp files""" self.http.close() if self.cacert.startswith(tempfile.gettempdir()): log.debug('removing %s' % self.cacert) os.unlink(self.cacert) def parse_proxy(proxy_str): """Parses proxy address user:pass@host:port into a dict suitable for httplib2""" proxy_dict = {} if proxy_str is None: return if '@' in proxy_str: user_pass, host_port = proxy_str.split('@') else: user_pass, host_port = '', proxy_str if ':' in host_port: host, port = host_port.split(':') proxy_dict['proxy_host'], proxy_dict['proxy_port'] = host, int(port) if ':' in user_pass: proxy_dict['proxy_user'], proxy_dict['proxy_pass'] = user_pass.split(':') return proxy_dict if __name__ == '__main__': pass ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/pysimplesoap/server.py���������������������������������������������0000775�0000000�0000000�00000057000�12564727262�021661� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/python # -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by the # Free Software Foundation; either version 3, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. """Pythonic simple SOAP Server implementation""" from __future__ import unicode_literals import sys if sys.version > '3': unicode = str import datetime import sys import logging import warnings import re import traceback try: from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer except ImportError: from http.server import BaseHTTPRequestHandler, HTTPServer from . import __author__, __copyright__, __license__, __version__ from .simplexml import SimpleXMLElement, TYPE_MAP, Date, Decimal log = logging.getLogger(__name__) # Deprecated? NS_RX = re.compile(r'xmlns:(\w+)="(.+?)"') class SoapDispatcher(object): """Simple Dispatcher for SOAP Server""" def __init__(self, name, documentation='', action='', location='', namespace=None, prefix=False, soap_uri="http://schemas.xmlsoap.org/soap/envelope/", soap_ns='soap', namespaces={}, pretty=False, debug=False, **kwargs): """ :param namespace: Target namespace; xmlns=targetNamespace :param prefix: Prefix for target namespace; xmlns:prefix=targetNamespace :param namespaces: Specify additional namespaces; example: {'external': 'http://external.mt.moboperator'} :param pretty: Prettifies generated xmls :param debug: Use to add tracebacks in generated xmls. Multiple namespaces =================== It is possible to support multiple namespaces. You need to specify additional namespaces by passing `namespace` parameter. >>> dispatcher = SoapDispatcher( ... name = "MTClientWS", ... location = "http://localhost:8008/ws/MTClientWS", ... action = 'http://localhost:8008/ws/MTClientWS', # SOAPAction ... namespace = "http://external.mt.moboperator", prefix="external", ... documentation = 'moboperator MTClientWS', ... namespaces = { ... 'external': 'http://external.mt.moboperator', ... 'model': 'http://model.common.mt.moboperator' ... }, ... ns = True) Now the registered method must return node names with namespaces' prefixes. >>> def _multi_ns_func(self, serviceMsisdn): ... ret = { ... 'external:activateSubscriptionsReturn': [ ... {'model:code': '0'}, ... {'model:description': 'desc'}, ... ]} ... return ret Our prefixes will be changed to those used by the client. """ self.methods = {} self.name = name self.documentation = documentation self.action = action # base SoapAction self.location = location self.namespace = namespace # targetNamespace self.prefix = prefix self.soap_ns = soap_ns self.soap_uri = soap_uri self.namespaces = namespaces self.pretty = pretty self.debug = debug @staticmethod def _extra_namespaces(xml, ns): """Extends xml with extra namespaces. :param ns: dict with namespaceUrl:prefix pairs :param xml: XML node to modify """ if ns: _tpl = 'xmlns:%s="%s"' _ns_str = " ".join([_tpl % (prefix, uri) for uri, prefix in ns.items() if uri not in xml]) xml = xml.replace('/>', ' ' + _ns_str + '/>') return xml def register_function(self, name, fn, returns=None, args=None, doc=None): self.methods[name] = fn, returns, args, doc or getattr(fn, "__doc__", "") def dispatch(self, xml, action=None, fault=None): """Receive and process SOAP call, returns the xml""" # a dict can be sent in fault to expose it to the caller # default values: prefix = self.prefix ret = None if fault is None: fault = {} soap_ns, soap_uri = self.soap_ns, self.soap_uri soap_fault_code = 'VersionMismatch' name = None # namespaces = [('model', 'http://model.common.mt.moboperator'), ('external', 'http://external.mt.moboperator')] _ns_reversed = dict(((v, k) for k, v in self.namespaces.items())) # Switch keys-values # _ns_reversed = {'http://external.mt.moboperator': 'external', 'http://model.common.mt.moboperator': 'model'} try: request = SimpleXMLElement(xml, namespace=self.namespace) # detect soap prefix and uri (xmlns attributes of Envelope) for k, v in request[:]: if v in ("http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/2003/05/soap-env",): soap_ns = request.attributes()[k].localName soap_uri = request.attributes()[k].value # If the value from attributes on Envelope is in additional namespaces elif v in self.namespaces.values(): _ns = request.attributes()[k].localName _uri = request.attributes()[k].value _ns_reversed[_uri] = _ns # update with received alias # Now we change 'external' and 'model' to the received forms i.e. 'ext' and 'mod' # After that we know how the client has prefixed additional namespaces ns = NS_RX.findall(xml) for k, v in ns: if v in self.namespaces.values(): _ns_reversed[v] = k soap_fault_code = 'Client' # parse request message and get local method method = request('Body', ns=soap_uri).children()(0) if action: # method name = action name = action[len(self.action)+1:-1] prefix = self.prefix if not action or not name: # method name = input message name name = method.get_local_name() prefix = method.get_prefix() log.debug('dispatch method: %s', name) function, returns_types, args_types, doc = self.methods[name] log.debug('returns_types %s', returns_types) # de-serialize parameters (if type definitions given) if args_types: args = method.children().unmarshall(args_types) elif args_types is None: args = {'request': method} # send raw request else: args = {} # no parameters soap_fault_code = 'Server' # execute function ret = function(**args) log.debug('dispathed method returns: %s', ret) except Exception: # This shouldn't be one huge try/except import sys etype, evalue, etb = sys.exc_info() log.error(traceback.format_exc()) if self.debug: detail = ''.join(traceback.format_exception(etype, evalue, etb)) detail += '\n\nXML REQUEST\n\n' + xml else: detail = None fault.update({'faultcode': "%s.%s" % (soap_fault_code, etype.__name__), 'faultstring': evalue, 'detail': detail}) # build response message if not prefix: xml = """<%(soap_ns)s:Envelope xmlns:%(soap_ns)s="%(soap_uri)s"/>""" else: xml = """<%(soap_ns)s:Envelope xmlns:%(soap_ns)s="%(soap_uri)s" xmlns:%(prefix)s="%(namespace)s"/>""" xml %= { # a %= {} is a shortcut for a = a % {} 'namespace': self.namespace, 'prefix': prefix, 'soap_ns': soap_ns, 'soap_uri': soap_uri } # Now we add extra namespaces xml = SoapDispatcher._extra_namespaces(xml, _ns_reversed) # Change our namespace alias to that given by the client. # We put [('model', 'http://model.common.mt.moboperator'), ('external', 'http://external.mt.moboperator')] # mix it with {'http://external.mt.moboperator': 'ext', 'http://model.common.mt.moboperator': 'mod'} mapping = dict(((k, _ns_reversed[v]) for k, v in self.namespaces.items())) # Switch keys-values and change value # and get {'model': u'mod', 'external': u'ext'} response = SimpleXMLElement(xml, namespace=self.namespace, namespaces_map=mapping, prefix=prefix) response['xmlns:xsi'] = "http://www.w3.org/2001/XMLSchema-instance" response['xmlns:xsd'] = "http://www.w3.org/2001/XMLSchema" body = response.add_child("%s:Body" % soap_ns, ns=False) if fault: # generate a Soap Fault (with the python exception) body.marshall("%s:Fault" % soap_ns, fault, ns=False) else: # return normal value res = body.add_child("%sResponse" % name, ns=self.namespace) if not prefix: res['xmlns'] = self.namespace # add target namespace # serialize returned values (response) if type definition available if returns_types: # TODO: full sanity check of type structure (recursive) complex_type = isinstance(ret, dict) if complex_type: # check if type mapping correlates with return value types_ok = all([k in returns_types for k in ret.keys()]) if not types_ok: warnings.warn("Return value doesn't match type structure: " "%s vs %s" % (str(returns_types), str(ret))) if not complex_type or not types_ok: # backward compatibility for scalar and simple types res.marshall(returns_types.keys()[0], ret, ) else: # new style for complex classes for k, v in ret.items(): res.marshall(k, v) elif returns_types is None: # merge xmlelement returned res.import_node(ret) elif returns_types == {}: log.warning('Given returns_types is an empty dict.') return response.as_xml(pretty=self.pretty) # Introspection functions: def list_methods(self): """Return a list of aregistered operations""" return [(method, doc) for method, (function, returns, args, doc) in self.methods.items()] def help(self, method=None): """Generate sample request and response messages""" (function, returns, args, doc) = self.methods[method] xml = """ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body><%(method)s xmlns="%(namespace)s"/></soap:Body> </soap:Envelope>""" % {'method': method, 'namespace': self.namespace} request = SimpleXMLElement(xml, namespace=self.namespace, prefix=self.prefix) if args: items = args.items() elif args is None: items = [('value', None)] else: items = [] for k, v in items: request(method).marshall(k, v, add_comments=True, ns=False) xml = """ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body><%(method)sResponse xmlns="%(namespace)s"/></soap:Body> </soap:Envelope>""" % {'method': method, 'namespace': self.namespace} response = SimpleXMLElement(xml, namespace=self.namespace, prefix=self.prefix) if returns: items = returns.items() elif args is None: items = [('value', None)] else: items = [] for k, v in items: response('%sResponse' % method).marshall(k, v, add_comments=True, ns=False) return request.as_xml(pretty=True), response.as_xml(pretty=True), doc def wsdl(self): """Generate Web Service Description v1.1""" xml = """<?xml version="1.0"?> <wsdl:definitions name="%(name)s" targetNamespace="%(namespace)s" xmlns:tns="%(namespace)s" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">%(documentation)s</wsdl:documentation> <wsdl:types> <xsd:schema targetNamespace="%(namespace)s" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> </xsd:schema> </wsdl:types> </wsdl:definitions> """ % {'namespace': self.namespace, 'name': self.name, 'documentation': self.documentation} wsdl = SimpleXMLElement(xml) for method, (function, returns, args, doc) in self.methods.items(): # create elements: def parse_element(name, values, array=False, complex=False): if not complex: element = wsdl('wsdl:types')('xsd:schema').add_child('xsd:element') complex = element.add_child("xsd:complexType") else: complex = wsdl('wsdl:types')('xsd:schema').add_child('xsd:complexType') element = complex element['name'] = name if values: items = values elif values is None: items = [('value', None)] else: items = [] if not array and items: all = complex.add_child("xsd:all") elif items: all = complex.add_child("xsd:sequence") for k, v in items: e = all.add_child("xsd:element") e['name'] = k if array: e[:] = {'minOccurs': "0", 'maxOccurs': "unbounded"} if v in TYPE_MAP.keys(): t = 'xsd:%s' % TYPE_MAP[v] elif v is None: t = 'xsd:anyType' elif isinstance(v, list): n = "ArrayOf%s%s" % (name, k) l = [] for d in v: l.extend(d.items()) parse_element(n, l, array=True, complex=True) t = "tns:%s" % n elif isinstance(v, dict): n = "%s%s" % (name, k) parse_element(n, v.items(), complex=True) t = "tns:%s" % n else: raise TypeError("unknonw type v for marshalling" % str(v)) e.add_attribute('type', t) parse_element("%s" % method, args and args.items()) parse_element("%sResponse" % method, returns and returns.items()) # create messages: for m, e in ('Input', ''), ('Output', 'Response'): message = wsdl.add_child('wsdl:message') message['name'] = "%s%s" % (method, m) part = message.add_child("wsdl:part") part[:] = {'name': 'parameters', 'element': 'tns:%s%s' % (method, e)} # create ports portType = wsdl.add_child('wsdl:portType') portType['name'] = "%sPortType" % self.name for method, (function, returns, args, doc) in self.methods.items(): op = portType.add_child('wsdl:operation') op['name'] = method if doc: op.add_child("wsdl:documentation", doc) input = op.add_child("wsdl:input") input['message'] = "tns:%sInput" % method output = op.add_child("wsdl:output") output['message'] = "tns:%sOutput" % method # create bindings binding = wsdl.add_child('wsdl:binding') binding['name'] = "%sBinding" % self.name binding['type'] = "tns:%sPortType" % self.name soapbinding = binding.add_child('soap:binding') soapbinding['style'] = "document" soapbinding['transport'] = "http://schemas.xmlsoap.org/soap/http" for method in self.methods.keys(): op = binding.add_child('wsdl:operation') op['name'] = method soapop = op.add_child('soap:operation') soapop['soapAction'] = self.action + method soapop['style'] = 'document' input = op.add_child("wsdl:input") ##input.add_attribute('name', "%sInput" % method) soapbody = input.add_child("soap:body") soapbody["use"] = "literal" output = op.add_child("wsdl:output") ##output.add_attribute('name', "%sOutput" % method) soapbody = output.add_child("soap:body") soapbody["use"] = "literal" service = wsdl.add_child('wsdl:service') service["name"] = "%sService" % self.name service.add_child('wsdl:documentation', text=self.documentation) port = service.add_child('wsdl:port') port["name"] = "%s" % self.name port["binding"] = "tns:%sBinding" % self.name soapaddress = port.add_child('soap:address') soapaddress["location"] = self.location return wsdl.as_xml(pretty=True) class SOAPHandler(BaseHTTPRequestHandler): def do_GET(self): """User viewable help information and wsdl""" args = self.path[1:].split("?") if self.path != "/" and args[0] not in self.server.dispatcher.methods.keys(): self.send_error(404, "Method not found: %s" % args[0]) else: if self.path == "/": # return wsdl if no method supplied response = self.server.dispatcher.wsdl() else: # return supplied method help (?request or ?response messages) req, res, doc = self.server.dispatcher.help(args[0]) if len(args) == 1 or args[1] == "request": response = req else: response = res self.send_response(200) self.send_header("Content-type", "text/xml") self.end_headers() self.wfile.write(response) def do_POST(self): """SOAP POST gateway""" request = self.rfile.read(int(self.headers.getheader('content-length'))) fault = {} # execute the method response = self.server.dispatcher.dispatch(request, fault=fault) # check if fault dict was completed (faultcode, faultstring, detail) if fault: self.send_response(500) else: self.send_response(200) self.send_header("Content-type", "text/xml") self.end_headers() self.wfile.write(response) class WSGISOAPHandler(object): def __init__(self, dispatcher): self.dispatcher = dispatcher def __call__(self, environ, start_response): return self.handler(environ, start_response) def handler(self, environ, start_response): if environ['REQUEST_METHOD'] == 'GET': return self.do_get(environ, start_response) elif environ['REQUEST_METHOD'] == 'POST': return self.do_post(environ, start_response) else: start_response('405 Method not allowed', [('Content-Type', 'text/plain')]) return ['Method not allowed'] def do_get(self, environ, start_response): path = environ.get('PATH_INFO').lstrip('/') query = environ.get('QUERY_STRING') if path != "" and path not in self.dispatcher.methods.keys(): start_response('404 Not Found', [('Content-Type', 'text/plain')]) return ["Method not found: %s" % path] elif path == "": # return wsdl if no method supplied response = self.dispatcher.wsdl() else: # return supplied method help (?request or ?response messages) req, res, doc = self.dispatcher.help(path) if len(query) == 0 or query == "request": response = req else: response = res start_response('200 OK', [('Content-Type', 'text/xml'), ('Content-Length', str(len(response)))]) return [response] def do_post(self, environ, start_response): length = int(environ['CONTENT_LENGTH']) request = environ['wsgi.input'].read(length) response = self.dispatcher.dispatch(request) start_response('200 OK', [('Content-Type', 'text/xml'), ('Content-Length', str(len(response)))]) return [response] if __name__ == "__main__": dispatcher = SoapDispatcher( name="PySimpleSoapSample", location="http://localhost:8008/", action='http://localhost:8008/', # SOAPAction namespace="http://example.com/pysimplesoapsamle/", prefix="ns0", documentation='Example soap service using PySimpleSoap', trace=True, debug=True, ns=True) def adder(p, c, dt=None): """Add several values""" dt = dt + datetime.timedelta(365) return {'ab': p['a'] + p['b'], 'dd': c[0]['d'] + c[1]['d'], 'dt': dt} def dummy(in0): """Just return input""" return in0 def echo(request): """Copy request->response (generic, any type)""" return request.value dispatcher.register_function( 'Adder', adder, returns={'AddResult': {'ab': int, 'dd': unicode, 'dt': datetime.date}}, args={'p': {'a': int, 'b': int}, 'dt': Date, 'c': [{'d': Decimal}]} ) dispatcher.register_function( 'Dummy', dummy, returns={'out0': str}, args={'in0': str} ) dispatcher.register_function('Echo', echo) if '--local' in sys.argv: wsdl = dispatcher.wsdl() for method, doc in dispatcher.list_methods(): request, response, doc = dispatcher.help(method) if '--serve' in sys.argv: log.info("Starting server...") httpd = HTTPServer(("", 8008), SOAPHandler) httpd.dispatcher = dispatcher httpd.serve_forever() if '--wsgi-serve' in sys.argv: log.info("Starting wsgi server...") from wsgiref.simple_server import make_server application = WSGISOAPHandler(dispatcher) wsgid = make_server('', 8008, application) wsgid.serve_forever() if '--consume' in sys.argv: from .client import SoapClient client = SoapClient( location="http://localhost:8008/", action='http://localhost:8008/', # SOAPAction namespace="http://example.com/sample.wsdl", soap_ns='soap', trace=True, ns=False ) p = {'a': 1, 'b': 2} c = [{'d': '1.20'}, {'d': '2.01'}] response = client.Adder(p=p, dt='2010-07-24', c=c) result = response.AddResult log.info(int(result.ab)) log.info(str(result.dd)) if '--consume-wsdl' in sys.argv: from .client import SoapClient client = SoapClient( wsdl="http://localhost:8008/", ) p = {'a': 1, 'b': 2} c = [{'d': '1.20'}, {'d': '2.01'}] dt = datetime.date.today() response = client.Adder(p=p, dt=dt, c=c) result = response['AddResult'] log.info(int(result['ab'])) log.info(str(result['dd'])) web2py-2.12.3.orig/gluon/contrib/pysimplesoap/simplexml.py������������������������������������������0000775�0000000�0000000�00000046422�12564727262�022373� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/python # -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by the # Free Software Foundation; either version 3, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. """Simple XML manipulation""" from __future__ import unicode_literals import sys if sys.version > '3': basestring = str unicode = str import logging import re import time import xml.dom.minidom from . import __author__, __copyright__, __license__, __version__ # Utility functions used for marshalling, moved aside for readability from .helpers import TYPE_MAP, TYPE_MARSHAL_FN, TYPE_UNMARSHAL_FN, \ REVERSE_TYPE_MAP, OrderedDict, Date, Decimal log = logging.getLogger(__name__) class SimpleXMLElement(object): """Simple XML manipulation (simil PHP)""" def __init__(self, text=None, elements=None, document=None, namespace=None, prefix=None, namespaces_map={}, jetty=False): """ :param namespaces_map: How to map our namespace prefix to that given by the client; {prefix: received_prefix} """ self.__namespaces_map = namespaces_map _rx = "|".join(namespaces_map.keys()) # {'external': 'ext', 'model': 'mod'} -> 'external|model' self.__ns_rx = re.compile(r"^(%s):.*$" % _rx) # And now we build an expression ^(external|model):.*$ # to find prefixes in all xml nodes i.e.: <model:code>1</model:code> # and later change that to <mod:code>1</mod:code> self.__ns = namespace self.__prefix = prefix self.__jetty = jetty # special list support if text is not None: try: self.__document = xml.dom.minidom.parseString(text) except: log.error(text) raise self.__elements = [self.__document.documentElement] else: self.__elements = elements self.__document = document def add_child(self, name, text=None, ns=True): """Adding a child tag to a node""" if not ns or self.__ns is False: ##log.debug('adding %s without namespace', name) element = self.__document.createElement(name) else: ##log.debug('adding %s ns "%s" %s', name, self.__ns, ns) if isinstance(ns, basestring): element = self.__document.createElement(name) if ns: element.setAttribute("xmlns", ns) elif self.__prefix: element = self.__document.createElementNS(self.__ns, "%s:%s" % (self.__prefix, name)) else: element = self.__document.createElementNS(self.__ns, name) # don't append null tags! if text is not None: element.appendChild(self.__document.createTextNode(text)) self._element.appendChild(element) return SimpleXMLElement( elements=[element], document=self.__document, namespace=self.__ns, prefix=self.__prefix, jetty=self.__jetty, namespaces_map=self.__namespaces_map ) def __setattr__(self, tag, text): """Add text child tag node (short form)""" if tag.startswith("_"): object.__setattr__(self, tag, text) else: ##log.debug('__setattr__(%s, %s)', tag, text) self.add_child(tag, text) def __delattr__(self, tag): """Remove a child tag (non recursive!)""" elements = [__element for __element in self._element.childNodes if __element.nodeType == __element.ELEMENT_NODE] for element in elements: self._element.removeChild(element) def add_comment(self, data): """Add an xml comment to this child""" comment = self.__document.createComment(data) self._element.appendChild(comment) def as_xml(self, filename=None, pretty=False): """Return the XML representation of the document""" if not pretty: return self.__document.toxml('UTF-8') else: return self.__document.toprettyxml(encoding='UTF-8') def __repr__(self): """Return the XML representation of this tag""" # NOTE: do not use self.as_xml('UTF-8') as it returns the whole xml doc return self._element.toxml('UTF-8') def get_name(self): """Return the tag name of this node""" return self._element.tagName def get_local_name(self): """Return the tag local name (prefix:name) of this node""" return self._element.localName def get_prefix(self): """Return the namespace prefix of this node""" return self._element.prefix def get_namespace_uri(self, ns): """Return the namespace uri for a prefix""" element = self._element while element is not None and element.attributes is not None: try: return element.attributes['xmlns:%s' % ns].value except KeyError: element = element.parentNode def attributes(self): """Return a dict of attributes for this tag""" #TODO: use slice syntax [:]? return self._element.attributes def __getitem__(self, item): """Return xml tag attribute value or a slice of attributes (iter)""" ##log.debug('__getitem__(%s)', item) if isinstance(item, basestring): if self._element.hasAttribute(item): return self._element.attributes[item].value elif isinstance(item, slice): # return a list with name:values return list(self._element.attributes.items())[item] else: # return element by index (position) element = self.__elements[item] return SimpleXMLElement( elements=[element], document=self.__document, namespace=self.__ns, prefix=self.__prefix, jetty=self.__jetty, namespaces_map=self.__namespaces_map ) def add_attribute(self, name, value): """Set an attribute value from a string""" self._element.setAttribute(name, value) def __setitem__(self, item, value): """Set an attribute value""" if isinstance(item, basestring): self.add_attribute(item, value) elif isinstance(item, slice): # set multiple attributes at once for k, v in value.items(): self.add_attribute(k, v) def __call__(self, tag=None, ns=None, children=False, root=False, error=True, ): """Search (even in child nodes) and return a child tag by name""" try: if root: # return entire document return SimpleXMLElement( elements=[self.__document.documentElement], document=self.__document, namespace=self.__ns, prefix=self.__prefix, jetty=self.__jetty, namespaces_map=self.__namespaces_map ) if tag is None: # if no name given, iterate over siblings (same level) return self.__iter__() if children: # future: filter children? by ns? return self.children() elements = None if isinstance(tag, int): # return tag by index elements = [self.__elements[tag]] if ns and not elements: for ns_uri in isinstance(ns, (tuple, list)) and ns or (ns, ): ##log.debug('searching %s by ns=%s', tag, ns_uri) elements = self._element.getElementsByTagNameNS(ns_uri, tag) if elements: break if self.__ns and not elements: ##log.debug('searching %s by ns=%s', tag, self.__ns) elements = self._element.getElementsByTagNameNS(self.__ns, tag) if not elements: ##log.debug('searching %s', tag) elements = self._element.getElementsByTagName(tag) if not elements: ##log.debug(self._element.toxml()) if error: raise AttributeError("No elements found") else: return return SimpleXMLElement( elements=elements, document=self.__document, namespace=self.__ns, prefix=self.__prefix, jetty=self.__jetty, namespaces_map=self.__namespaces_map) except AttributeError as e: raise AttributeError("Tag not found: %s (%s)" % (tag, e)) def __getattr__(self, tag): """Shortcut for __call__""" return self.__call__(tag) def __iter__(self): """Iterate over xml tags at this level""" try: for __element in self.__elements: yield SimpleXMLElement( elements=[__element], document=self.__document, namespace=self.__ns, prefix=self.__prefix, jetty=self.__jetty, namespaces_map=self.__namespaces_map) except: raise def __dir__(self): """List xml children tags names""" return [node.tagName for node in self._element.childNodes if node.nodeType != node.TEXT_NODE] def children(self): """Return xml children tags element""" elements = [__element for __element in self._element.childNodes if __element.nodeType == __element.ELEMENT_NODE] if not elements: return None #raise IndexError("Tag %s has no children" % self._element.tagName) return SimpleXMLElement( elements=elements, document=self.__document, namespace=self.__ns, prefix=self.__prefix, jetty=self.__jetty, namespaces_map=self.__namespaces_map ) def __len__(self): """Return element count""" return len(self.__elements) def __contains__(self, item): """Search for a tag name in this element or child nodes""" return self._element.getElementsByTagName(item) def __unicode__(self): """Returns the unicode text nodes of the current element""" if self._element.childNodes: rc = "" for node in self._element.childNodes: if node.nodeType == node.TEXT_NODE: rc = rc + node.data return rc return '' def __str__(self): """Returns the str text nodes of the current element""" return self.__unicode__() def __int__(self): """Returns the integer value of the current element""" return int(self.__str__()) def __float__(self): """Returns the float value of the current element""" try: return float(self.__str__()) except: raise IndexError(self._element.toxml()) _element = property(lambda self: self.__elements[0]) def unmarshall(self, types, strict=True): #import pdb; pdb.set_trace() """Convert to python values the current serialized xml element""" # types is a dict of {tag name: convertion function} # strict=False to use default type conversion if not specified # example: types={'p': {'a': int,'b': int}, 'c': [{'d':str}]} # expected xml: <p><a>1</a><b>2</b></p><c><d>hola</d><d>chau</d> # returnde value: {'p': {'a':1,'b':2}, `'c':[{'d':'hola'},{'d':'chau'}]} d = {} for node in self(): name = str(node.get_local_name()) ref_name_type = None # handle multirefs: href="#id0" if 'href' in node.attributes().keys(): href = node['href'][1:] for ref_node in self(root=True)("multiRef"): if ref_node['id'] == href: node = ref_node ref_name_type = ref_node['xsi:type'].split(":")[1] break try: if isinstance(types, dict): fn = types[name] # custom array only in the response (not defined in the WSDL): # <results soapenc:arrayType="xsd:string[199]> if any([k for k,v in node[:] if 'arrayType' in k]) and not isinstance(fn, list): fn = [fn] else: fn = types except (KeyError, ) as e: if 'xsi:type' in node.attributes().keys(): xsd_type = node['xsi:type'].split(":")[1] try: fn = REVERSE_TYPE_MAP[xsd_type] except: fn = None # ignore multirefs! elif strict: raise TypeError("Tag: %s invalid (type not found)" % (name,)) else: # if not strict, use default type conversion fn = str if isinstance(fn, list): # append to existing list (if any) - unnested dict arrays - value = d.setdefault(name, []) children = node.children() # TODO: check if this was really needed (get first child only) ##if len(fn[0]) == 1 and children: ## children = children() if fn and not isinstance(fn[0], dict): # simple arrays [] for child in (children or []): tmp_dict = child.unmarshall(fn[0], strict) value.extend(tmp_dict.values()) elif (self.__jetty and len(fn[0]) > 1): # Jetty array style support [{k, v}] for parent in node: tmp_dict = {} # unmarshall each value & mix for child in (node.children() or []): tmp_dict.update(child.unmarshall(fn[0], strict)) value.append(tmp_dict) else: # .Net / Java for child in (children or []): value.append(child.unmarshall(fn[0], strict)) elif isinstance(fn, tuple): value = [] _d = {} children = node.children() as_dict = len(fn) == 1 and isinstance(fn[0], dict) for child in (children and children() or []): # Readability counts if as_dict: _d.update(child.unmarshall(fn[0], strict)) # Merging pairs else: value.append(child.unmarshall(fn[0], strict)) if as_dict: value.append(_d) if name in d: _tmp = list(d[name]) _tmp.extend(value) value = tuple(_tmp) else: value = tuple(value) elif isinstance(fn, dict): ##if ref_name_type is not None: ## fn = fn[ref_name_type] children = node.children() value = children and children.unmarshall(fn, strict) else: if fn is None: # xsd:anyType not unmarshalled value = node elif unicode(node) or (fn == str and unicode(node) != ''): try: # get special deserialization function (if any) fn = TYPE_UNMARSHAL_FN.get(fn, fn) if fn == str: # always return an unicode object: # (avoid encoding errors in py<3!) value = unicode(node) else: value = fn(unicode(node)) except (ValueError, TypeError) as e: raise ValueError("Tag: %s: %s" % (name, e)) else: value = None d[name] = value return d def _update_ns(self, name): """Replace the defined namespace alias with tohse used by the client.""" pref = self.__ns_rx.search(name) if pref: pref = pref.groups()[0] try: name = name.replace(pref, self.__namespaces_map[pref]) except KeyError: log.warning('Unknown namespace alias %s' % name) return name def marshall(self, name, value, add_child=True, add_comments=False, ns=False, add_children_ns=True): """Analyze python value and add the serialized XML element using tag name""" # Change node name to that used by a client name = self._update_ns(name) if isinstance(value, dict): # serialize dict (<key>value</key>) # for the first parent node, use the document target namespace # (ns==True) or use the namespace string uri if passed (elements) child = add_child and self.add_child(name, ns=ns) or self for k, v in value.items(): if not add_children_ns: ns = False else: # for children, use the wsdl element target namespace: ns = getattr(value, 'namespace', None) child.marshall(k, v, add_comments=add_comments, ns=ns) elif isinstance(value, tuple): # serialize tuple (<key>value</key>) child = add_child and self.add_child(name, ns=ns) or self if not add_children_ns: ns = False for k, v in value: getattr(self, name).marshall(k, v, add_comments=add_comments, ns=ns) elif isinstance(value, list): # serialize lists child = self.add_child(name, ns=ns) if not add_children_ns: ns = False if add_comments: child.add_comment("Repetitive array of:") for t in value: child.marshall(name, t, False, add_comments=add_comments, ns=ns) elif isinstance(value, basestring): # do not convert strings or unicodes self.add_child(name, value, ns=ns) elif value is None: # sent a empty tag? self.add_child(name, ns=ns) elif value in TYPE_MAP.keys(): # add commented placeholders for simple tipes (for examples/help only) child = self.add_child(name, ns=ns) child.add_comment(TYPE_MAP[value]) else: # the rest of object types are converted to string # get special serialization function (if any) fn = TYPE_MARSHAL_FN.get(type(value), str) self.add_child(name, fn(value), ns=ns) def import_node(self, other): x = self.__document.importNode(other._element, True) # deep copy self._element.appendChild(x) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/pysimplesoap/helpers.py��������������������������������������������0000664�0000000�0000000�00000044303�12564727262�022014� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/python # -*- coding: utf-8 -*- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by the # Free Software Foundation; either version 3, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. """Pythonic simple SOAP Client helpers""" from __future__ import unicode_literals import sys if sys.version > '3': basestring = unicode = str import datetime from decimal import Decimal import os import logging import hashlib import warnings try: import urllib2 from urlparse import urlsplit except ImportError: from urllib import request as urllib2 from urllib.parse import urlsplit from . import __author__, __copyright__, __license__, __version__ log = logging.getLogger(__name__) def fetch(url, http, cache=False, force_download=False, wsdl_basedir=''): """Download a document from a URL, save it locally if cache enabled""" # check / append a valid schema if not given: url_scheme, netloc, path, query, fragment = urlsplit(url) if not url_scheme in ('http', 'https', 'file'): for scheme in ('http', 'https', 'file'): try: if not url.startswith("/") and scheme in ('http', 'https'): tmp_url = "%s://%s" % (scheme, os.path.join(wsdl_basedir, url)) else: tmp_url = "%s:%s" % (scheme, os.path.join(wsdl_basedir, url)) log.debug('Scheme not found, trying %s' % scheme) return fetch(tmp_url, http, cache, force_download, wsdl_basedir) except Exception as e: log.error(e) raise RuntimeError('No scheme given for url: %s' % url) # make md5 hash of the url for caching... filename = '%s.xml' % hashlib.md5(url.encode('utf8')).hexdigest() if isinstance(cache, basestring): filename = os.path.join(cache, filename) if cache and os.path.exists(filename) and not force_download: log.info('Reading file %s' % filename) f = open(filename, 'r') xml = f.read() f.close() else: if url_scheme == 'file': log.info('Fetching url %s using urllib2' % url) f = urllib2.urlopen(url) xml = f.read() else: log.info('GET %s using %s' % (url, http._wrapper_version)) response, xml = http.request(url, 'GET', None, {}) if cache: log.info('Writing file %s' % filename) if not os.path.isdir(cache): os.makedirs(cache) f = open(filename, 'w') f.write(xml) f.close() return xml def sort_dict(od, d): """Sort parameters (same order as xsd:sequence)""" if isinstance(od, dict): ret = OrderedDict() for k in od.keys(): v = d.get(k) # don't append null tags! if v is not None: if isinstance(v, dict): v = sort_dict(od[k], v) elif isinstance(v, list): v = [sort_dict(od[k][0], v1) for v1 in v] ret[k] = v if hasattr(od, 'namespace'): ret.namespace = od.namespace ret.qualified = od.qualified return ret else: return d def make_key(element_name, element_type, namespace): """Return a suitable key for elements""" # only distinguish 'element' vs other types if element_type in ('complexType', 'simpleType'): eltype = 'complexType' else: eltype = element_type if eltype not in ('element', 'complexType', 'simpleType'): raise RuntimeError("Unknown element type %s = %s" % (element_name, eltype)) return (element_name, eltype, namespace) def process_element(elements, element_name, node, element_type, xsd_uri, dialect, namespace, qualified=None, soapenc_uri = 'http://schemas.xmlsoap.org/soap/encoding/'): """Parse and define simple element types""" log.debug('Processing element %s %s' % (element_name, element_type)) for tag in node: if tag.get_local_name() in ('annotation', 'documentation'): continue elif tag.get_local_name() in ('element', 'restriction'): log.debug('%s has no children! %s' % (element_name, tag)) children = tag # element "alias"? alias = True elif tag.children(): children = tag.children() alias = False else: log.debug('%s has no children! %s' % (element_name, tag)) continue # TODO: abstract? d = OrderedDict() d.namespace = namespace d.qualified = qualified for e in children: t = e['type'] if not t: t = e['base'] # complexContent (extension)! if not t: t = e['ref'] # reference to another element if not t: # "anonymous" elements had no type attribute but children if e['name'] and e.children(): # create a type name to process the children t = "%s_%s" % (element_name, e['name']) c = e.children() et = c.get_local_name() c = c.children() process_element(elements, t, c, et, xsd_uri, dialect, namespace, qualified) else: t = 'anyType' # no type given! t = t.split(":") if len(t) > 1: ns, type_name = t else: ns, type_name = None, t[0] if element_name == type_name and not alias and len(children) > 1: continue # abort to prevent infinite recursion uri = ns and e.get_namespace_uri(ns) or xsd_uri if uri in (xsd_uri, soapenc_uri) and type_name != 'Array': # look for the type, None == any fn = REVERSE_TYPE_MAP.get(type_name, None) elif uri == soapenc_uri and type_name == 'Array': # arrays of simple types (look at the attribute tags): fn = [] for a in e.children(): for k, v in a[:]: if k.endswith(":arrayType"): type_name = v if ":" in type_name: type_name = type_name[type_name.index(":")+1:] if "[]" in type_name: type_name = type_name[:type_name.index("[]")] fn.append(REVERSE_TYPE_MAP.get(type_name, None)) else: fn = None if not fn: # simple / complex type, postprocess later if ns: fn_namespace = uri # use the specified namespace else: fn_namespace = namespace # use parent namespace (default) for k, v in e[:]: if k.startswith("xmlns:"): # get the namespace uri from the element fn_namespace = v fn = elements.setdefault(make_key(type_name, 'complexType', fn_namespace), OrderedDict()) if e['maxOccurs'] == 'unbounded' or (uri == soapenc_uri and type_name == 'Array'): # it's an array... TODO: compound arrays? and check ns uri! if isinstance(fn, OrderedDict): if len(children) > 1 and dialect in ('jetty',): # Jetty style support # {'ClassName': [{'attr1': val1, 'attr2': val2}] fn.array = True else: # .NET style support (backward compatibility) # [{'ClassName': {'attr1': val1, 'attr2': val2}] d.array = True else: if dialect in ('jetty',): # scalar support [{'attr1': [val1]}] fn = [fn] else: d.array = True if (e['name'] is not None and not alias) or e['ref']: e_name = e['name'] or type_name # for refs, use the type name d[e_name] = fn else: log.debug('complexContent/simpleType/element %s = %s' % (element_name, type_name)) d[None] = fn if e is not None and e.get_local_name() == 'extension' and e.children(): # extend base element: process_element(elements, element_name, e.children(), element_type, xsd_uri, dialect, namespace, qualified) elements.setdefault(make_key(element_name, element_type, namespace), OrderedDict()).update(d) def postprocess_element(elements, processed): """Fix unresolved references (elements referenced before its definition, thanks .net)""" # avoid already processed elements: if elements in processed: return processed.append(elements) for k, v in elements.items(): if isinstance(v, OrderedDict): if v != elements: # TODO: fix recursive elements postprocess_element(v, processed) if None in v and v[None]: # extension base? if isinstance(v[None], dict): for i, kk in enumerate(v[None]): # extend base -keep orginal order- if v[None] is not None: elements[k].insert(kk, v[None][kk], i) del v[None] else: # "alias", just replace log.debug('Replacing %s = %s' % (k, v[None])) elements[k] = v[None] #break if v.array: elements[k] = [v] # convert arrays to python lists if isinstance(v, list): for n in v: # recurse list if isinstance(n, (OrderedDict, list)): #if n != elements: # TODO: fix recursive elements postprocess_element(n, processed) def get_message(messages, message_name, part_name): if part_name: # get the specific part of the message: return messages.get((message_name, part_name)) else: # get the first part for the specified message: for (message_name_key, part_name_key), message in messages.items(): if message_name_key == message_name: return message get_local_name = lambda s: s and str((':' in s) and s.split(':')[1] or s) get_namespace_prefix = lambda s: s and str((':' in s) and s.split(':')[0] or None) def preprocess_schema(schema, imported_schemas, elements, xsd_uri, dialect, http, cache, force_download, wsdl_basedir, global_namespaces=None, qualified=False): """Find schema elements and complex types""" from .simplexml import SimpleXMLElement # here to avoid recursive imports # analyze the namespaces used in this schema local_namespaces = {} for k, v in schema[:]: if k.startswith("xmlns"): local_namespaces[get_local_name(k)] = v if k == 'targetNamespace': # URI namespace reference for this schema if v == "urn:DefaultNamespace": v = global_namespaces[None] local_namespaces[None] = v if k == 'elementFormDefault': qualified = (v == "qualified") # add schema namespaces to the global namespace dict = {URI: ns prefix} for ns in local_namespaces.values(): if ns not in global_namespaces: global_namespaces[ns] = 'ns%s' % len(global_namespaces) for element in schema.children() or []: if element.get_local_name() in ('import', 'include',): schema_namespace = element['namespace'] schema_location = element['schemaLocation'] if schema_location is None: log.debug('Schema location not provided for %s!' % schema_namespace) continue if schema_location in imported_schemas: log.debug('Schema %s already imported!' % schema_location) continue imported_schemas[schema_location] = schema_namespace log.debug('Importing schema %s from %s' % (schema_namespace, schema_location)) # Open uri and read xml: xml = fetch(schema_location, http, cache, force_download, wsdl_basedir) # Parse imported XML schema (recursively): imported_schema = SimpleXMLElement(xml, namespace=xsd_uri) preprocess_schema(imported_schema, imported_schemas, elements, xsd_uri, dialect, http, cache, force_download, wsdl_basedir, global_namespaces, qualified) element_type = element.get_local_name() if element_type in ('element', 'complexType', "simpleType"): namespace = local_namespaces[None] # get targetNamespace element_ns = global_namespaces[ns] # get the prefix element_name = element['name'] log.debug("Parsing Element %s: %s" % (element_type, element_name)) if element.get_local_name() == 'complexType': children = element.children() elif element.get_local_name() == 'simpleType': children = element('restriction', ns=xsd_uri) elif element.get_local_name() == 'element' and element['type']: children = element else: children = element.children() if children: children = children.children() elif element.get_local_name() == 'element': children = element if children: process_element(elements, element_name, children, element_type, xsd_uri, dialect, namespace, qualified) # simplexml utilities: try: _strptime = datetime.datetime.strptime except AttributeError: # python2.4 _strptime = lambda s, fmt: datetime.datetime(*(time.strptime(s, fmt)[:6])) # Functions to serialize/deserialize special immutable types: def datetime_u(s): fmt = "%Y-%m-%dT%H:%M:%S" try: return _strptime(s, fmt) except ValueError: try: # strip utc offset if s[-3] == ":" and s[-6] in (' ', '-', '+'): warnings.warn('removing unsupported UTC offset', RuntimeWarning) s = s[:-6] # parse microseconds try: return _strptime(s, fmt + ".%f") except: return _strptime(s, fmt) except ValueError: # strip microseconds (not supported in this platform) if "." in s: warnings.warn('removing unsuppported microseconds', RuntimeWarning) s = s[:s.index(".")] return _strptime(s, fmt) datetime_m = lambda dt: dt.isoformat() date_u = lambda s: _strptime(s[0:10], "%Y-%m-%d").date() date_m = lambda d: d.strftime("%Y-%m-%d") time_u = lambda s: _strptime(s, "%H:%M:%S").time() time_m = lambda d: d.strftime("%H%M%S") bool_u = lambda s: {'0': False, 'false': False, '1': True, 'true': True}[s] bool_m = lambda s: {False: 'false', True: 'true'}[s] # aliases: class Alias(object): def __init__(self, py_type, xml_type): self.py_type, self.xml_type = py_type, xml_type def __call__(self, value): return self.py_type(value) def __repr__(self): return "<alias '%s' for '%s'>" % (self.xml_type, self.py_type) if sys.version > '3': long = Alias(int, 'long') byte = Alias(str, 'byte') short = Alias(int, 'short') double = Alias(float, 'double') integer = Alias(long, 'integer') DateTime = datetime.datetime Date = datetime.date Time = datetime.time # Define convertion function (python type): xml schema type TYPE_MAP = { unicode: 'string', bool: 'boolean', short: 'short', byte: 'byte', int: 'int', long: 'long', integer: 'integer', float: 'float', double: 'double', Decimal: 'decimal', datetime.datetime: 'dateTime', datetime.date: 'date', } TYPE_MARSHAL_FN = { datetime.datetime: datetime_m, datetime.date: date_m, bool: bool_m } TYPE_UNMARSHAL_FN = { datetime.datetime: datetime_u, datetime.date: date_u, bool: bool_u, str: unicode, } REVERSE_TYPE_MAP = dict([(v, k) for k, v in TYPE_MAP.items()]) REVERSE_TYPE_MAP.update({ 'base64Binary': str, }) # insert str here to avoid collision in REVERSE_TYPE_MAP (i.e. decoding errors) if str not in TYPE_MAP: TYPE_MAP[str] = 'string' class OrderedDict(dict): """Minimal ordered dictionary for xsd:sequences""" def __init__(self): self.__keys = [] self.array = False self.namespace = None self.qualified = None def __setitem__(self, key, value): if key not in self.__keys: self.__keys.append(key) dict.__setitem__(self, key, value) def insert(self, key, value, index=0): if key not in self.__keys: self.__keys.insert(index, key) dict.__setitem__(self, key, value) def __delitem__(self, key): if key in self.__keys: self.__keys.remove(key) dict.__delitem__(self, key) def __iter__(self): return iter(self.__keys) def keys(self): return self.__keys def items(self): return [(key, self[key]) for key in self.__keys] def update(self, other): for k, v in other.items(): self[k] = v # do not change if we are an array but the other is not: if isinstance(other, OrderedDict) and not self.array: self.array = other.array if isinstance(other, OrderedDict) and not self.namespace: self.namespace = other.namespace self.qualified = other.qualified def copy(self): "Make a duplicate" new = OrderedDict() new.update(self) return new def __str__(self): return "%s" % dict.__str__(self) def __repr__(self): s = "{%s}" % ", ".join(['%s: %s' % (repr(k), repr(v)) for k, v in self.items()]) if self.array and False: s = "[%s]" % s return s �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/taskbar_widget.py��������������������������������������������������0000664�0000000�0000000�00000020106�12564727264�020614� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # -*- coding: utf-8 -*- # # Creates a taskbar icon for web2py # # Author: Mark Larsen, mostly stolen from Mark Hammond's # # C:\Python25\Lib\site-packages\win32\Demos\win32gui_taskbar.py # # 11/7/08 # dual licensed under the web2py license (LGPL) and the Python license. import os import sys import base64 import win32con import win32api import win32gui class TaskBarIcon: def __init__(self, iconPath=None): self.iconPath = iconPath self.status = [] msg_TaskbarRestart = \ win32api.RegisterWindowMessage('TaskbarCreated') message_map = { msg_TaskbarRestart: self.OnRestart, win32con.WM_DESTROY: self.OnDestroy, win32con.WM_COMMAND: self.OnCommand, win32con.WM_USER + 20: self.OnTaskbarNotify, } # Register the Window class. wc = win32gui.WNDCLASS() hinst = wc.hInstance = win32api.GetModuleHandle(None) wc.lpszClassName = 'web2pyTaskbar' wc.style = win32con.CS_VREDRAW | win32con.CS_HREDRAW wc.hCursor = win32gui.LoadCursor(0, win32con.IDC_ARROW) wc.hbrBackground = win32con.COLOR_WINDOW wc.lpfnWndProc = message_map # could also specify a wndproc. classAtom = win32gui.RegisterClass(wc) # Create the Window. style = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU self.hwnd = win32gui.CreateWindow( classAtom, 'web2pyTaskbar', style, 0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, 0, 0, hinst, None, ) win32gui.UpdateWindow(self.hwnd) self.SetServerStopped() def __createIcon(self): # try and use custom icon if self.iconPath and os.path.isfile(self.iconPath): hicon = self.__loadFromFile(self.iconPath) else: try: fp = 'tmp.ico' icFH = file(fp, 'wb') if self.serverState == self.EnumServerState.STOPPED: icFH.write(base64.b64decode(self.__getIconStopped())) elif self.serverState == self.EnumServerState.RUNNING: icFH.write(base64.b64decode(self.__getIconRunning())) icFH.close() hicon = self.__loadFromFile(fp) os.unlink(fp) except: print "Can't load web2py icons - using default" hicon = win32gui.LoadIcon(0, win32con.IDI_APPLICATION) flags = win32gui.NIF_ICON | win32gui.NIF_MESSAGE\ | win32gui.NIF_TIP nid = ( self.hwnd, 0, flags, win32con.WM_USER + 20, hicon, 'web2py Framework', ) try: win32gui.Shell_NotifyIcon(win32gui.NIM_MODIFY, nid) except: try: win32gui.Shell_NotifyIcon(win32gui.NIM_ADD, nid) except win32api.error: # This is common when windows is starting, and this code is hit # before the taskbar has been created. print 'Failed to add the taskbar icon - is explorer running?' # but keep running anyway - when explorer starts, we get the def OnRestart( self, hwnd, msg, wparam, lparam, ): self._DoCreateIcons() def OnDestroy( self, hwnd, msg, wparam, lparam, ): nid = (self.hwnd, 0) win32gui.Shell_NotifyIcon(win32gui.NIM_DELETE, nid) def OnTaskbarNotify( self, hwnd, msg, wparam, lparam, ): if lparam == win32con.WM_LBUTTONUP: pass elif lparam == win32con.WM_LBUTTONDBLCLK: pass elif lparam == win32con.WM_RBUTTONUP: menu = win32gui.CreatePopupMenu() win32gui.AppendMenu(menu, win32con.MF_STRING, 1023, 'Toggle Display') win32gui.AppendMenu(menu, win32con.MF_SEPARATOR, 0, '') if self.serverState == self.EnumServerState.STOPPED: win32gui.AppendMenu(menu, win32con.MF_STRING, 1024, 'Start Server') win32gui.AppendMenu(menu, win32con.MF_STRING | win32con.MF_GRAYED, 1025, 'Restart Server') win32gui.AppendMenu(menu, win32con.MF_STRING | win32con.MF_GRAYED, 1026, 'Stop Server') else: win32gui.AppendMenu(menu, win32con.MF_STRING | win32con.MF_GRAYED, 1024, 'Start Server') win32gui.AppendMenu(menu, win32con.MF_STRING, 1025, 'Restart Server') win32gui.AppendMenu(menu, win32con.MF_STRING, 1026, 'Stop Server') win32gui.AppendMenu(menu, win32con.MF_SEPARATOR, 0, '') win32gui.AppendMenu(menu, win32con.MF_STRING, 1027, 'Quit (pid:%i)' % os.getpid()) pos = win32gui.GetCursorPos() # See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/menus_0hdi.asp win32gui.SetForegroundWindow(self.hwnd) win32gui.TrackPopupMenu( menu, win32con.TPM_LEFTALIGN, pos[0], pos[1], 0, self.hwnd, None, ) win32api.PostMessage(self.hwnd, win32con.WM_NULL, 0, 0) return 1 def OnCommand( self, hwnd, msg, wparam, lparam, ): id = win32api.LOWORD(wparam) if id == 1023: self.status.append(self.EnumStatus.TOGGLE) elif id == 1024: self.status.append(self.EnumStatus.START) elif id == 1025: self.status.append(self.EnumStatus.RESTART) elif id == 1026: self.status.append(self.EnumStatus.STOP) elif id == 1027: self.status.append(self.EnumStatus.QUIT) self.Destroy() else: print 'Unknown command -', id def Destroy(self): win32gui.DestroyWindow(self.hwnd) def SetServerRunning(self): self.serverState = self.EnumServerState.RUNNING self.__createIcon() def SetServerStopped(self): self.serverState = self.EnumServerState.STOPPED self.__createIcon() def __getIconRunning(self): return 'AAABAAEAEBAQAAAAAAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAIXMGAABe/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABERAgAAIAAAEAACAAAgAAABEAIiACIgAAABAgAgIAIAEAECACAgAgABEAIiACACAAAAAAAAAAAAICACIiAiIAICAgIAACACAgICAgAAIAICAgICIiAiIAICAgIAACACAgICAgAAIAICAgICIiAiIAAAAAAAAAAAD//wAAhe8AAL3vAADMYwAA9a0AALWtAADMbQAA//8AAKwjAABV7QAAVe0AAFQjAABV7QAAVe0AAFQjAAD//wAA' def __getIconStopped(self): return 'AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJCdIAIXMGAABe/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzMzMzMzMzAwERMjMzIzAzEDMyMzMjAzMxAzIiMyAjMzMwMjMjAzIzEzECMyAjMjMxEzAiAyMyMzMzMwAzMzMzIyMyACMiIzIyMjAzAyMyMjIyAjMwIzIyMjAyIiMCIzIyAjIzMyAyMjAyMjMzIwIyAjIyIiMiIDAzMzMzMzMzB//gAAhe0AAJ3rAADMYwAA9a0AALGNAADMLQAA/n8AAKwjAABVrQAAUc0AAFQjAABF5QAAVekAABQhAAB//gAA' def __loadFromFile(self, iconPath): hinst = win32api.GetModuleHandle(None) icon_flags = win32con.LR_LOADFROMFILE | win32con.LR_DEFAULTSIZE hicon = win32gui.LoadImage( hinst, iconPath, win32con.IMAGE_ICON, 0, 0, icon_flags, ) return hicon class EnumStatus: TOGGLE = 0 START = 1 STOP = 2 RESTART = 3 QUIT = 4 class EnumServerState: RUNNING = 0 STOPPED = 1 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/DowCommerce.py�����������������������������������������������������0000664�0000000�0000000�00000021734�12564727262�020034� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������""" DowCommerce class to process credit card payments with DowCommerce.com Modifications to support Dow Commerce API from code originally written by John Conde http://www.johnconde.net/blog/integrate-the-authorizenet-aim-api-with-python-3-2/ BSDv3 License Modifed by Dave Stoll dave.stoll@gmail.com - modifed to support Dow Commerce API """ __all__ = ['DowCommerce'] from operator import itemgetter import urllib class DowCommerce: class DowCommerceError(Exception): def __init__(self, value): self.parameter = value def __str__(self): return str(self.parameter) def __init__(self, username=None, password=None, demomode=False): if not demomode: if str(username).strip() == '' or username is None: raise DowCommerce.DowCommerceError('No username provided') if str(password).strip() == '' or password is None: raise DowCommerce.DowCommerceError('No password provided') else: username = 'demo' password = 'password' self.proxy = None self.delimiter = '&' self.results = {} self.error = True self.success = False self.declined = False self.url = 'https://secure.dowcommerce.net/api/transact.php' self.parameters = {} self.setParameter('username', username) self.setParameter('password', password) def process(self): encoded_args = urllib.urlencode(self.parameters) if self.proxy is None: results = str(urllib.urlopen( self.url, encoded_args).read()).split(self.delimiter) else: opener = urllib.FancyURLopener(self.proxy) opened = opener.open(self.url, encoded_args) try: results = str(opened.read()).split(self.delimiter) finally: opened.close() for result in results: (key, val) = result.split('=') self.results[key] = val if self.results['response'] == '1': self.error = False self.success = True self.declined = False elif self.results['response'] == '2': self.error = False self.success = False self.declined = True elif self.results['response'] == '3': self.error = True self.success = False self.declined = False else: self.error = True self.success = False self.declined = False raise DowCommerce.DowCommerceError(self.results) def setTransaction( self, creditcard, expiration, total, cvv=None, orderid=None, orderdescription=None, ipaddress=None, tax=None, shipping=None, firstname=None, lastname=None, company=None, address1=None, address2=None, city=None, state=None, zipcode=None, country=None, phone=None, fax=None, emailaddress=None, website=None, shipping_firstname=None, shipping_lastname=None, shipping_company=None, shipping_address1=None, shipping_address2=None, shipping_city=None, shipping_state=None, shipping_zipcode=None, shipping_country=None, shipping_emailaddress=None): if str(creditcard).strip() == '' or creditcard is None: raise DowCommerce.DowCommerceError('No credit card number passed to setTransaction(): {0}'.format(creditcard)) if str(expiration).strip() == '' or expiration is None: raise DowCommerce.DowCommerceError('No expiration number passed to setTransaction(): {0}'.format(expiration)) if str(total).strip() == '' or total is None: raise DowCommerce.DowCommerceError('No total amount passed to setTransaction(): {0}'.format(total)) self.setParameter('ccnumber', creditcard) self.setParameter('ccexp', expiration) self.setParameter('amount', total) if cvv: self.setParameter('cvv', cvv) if orderid: self.setParameter('orderid', orderid) if orderdescription: self.setParameter('orderdescription', orderdescription) if ipaddress: self.setParameter('ipaddress', ipaddress) if tax: self.setParameter('tax', tax) if shipping: self.setParameter('shipping', shipping) ## billing info if firstname: self.setParameter('firstname', firstname) if lastname: self.setParameter('lastname', lastname) if company: self.setParameter('company', company) if address1: self.setParameter('address1', address1) if address2: self.setParameter('address2', address2) if city: self.setParameter('city', city) if state: self.setParameter('state', state) if zipcode: self.setParameter('zip', zipcode) if country: self.setParameter('country', country) if phone: self.setParameter('phone', phone) if fax: self.setParameter('fax', fax) if emailaddress: self.setParameter('email', emailaddress) if website: self.setParameter('website', website) ## shipping info if shipping_firstname: self.setParameter('shipping_firstname', shipping_firstname) if shipping_lastname: self.setParameter('shipping_lastname', shipping_lastname) if shipping_company: self.setParameter('shipping_company', shipping_company) if shipping_address1: self.setParameter('shipping_address1', shipping_address1) if shipping_address2: self.setParameter('shipping_address2', shipping_address2) if shipping_city: self.setParameter('shipping_city', shipping_city) if shipping_state: self.setParameter('shipping_state', shipping_state) if shipping_zipcode: self.setParameter('shipping_zip', shipping_zipcode) if shipping_country: self.setParameter('shipping_country', shipping_country) def setTransactionType(self, transtype=None): types = ['sale', 'auth', 'credit'] if transtype.lower() not in types: raise DowCommerce.DowCommerceError('Incorrect Transaction Type passed to setTransactionType(): {0}'.format(transtype)) self.setParameter('type', transtype.lower()) def setProxy(self, proxy=None): if str(proxy).strip() == '' or proxy is None: raise DowCommerce.DowCommerceError('No proxy passed to setProxy()') self.proxy = {'http': str(proxy).strip()} def setParameter(self, key=None, value=None): if key is not None and value is not None and str(key).strip() != '' and str(value).strip() != '': self.parameters[key] = str(value).strip() else: raise DowCommerce.DowCommerceError('Incorrect parameters passed to setParameter(): {0}:{1}'.format(key, value)) def isApproved(self): return self.success def isDeclined(self): return self.declined def isError(self): return self.error def getResultResponseShort(self): responses = ['', 'Approved', 'Declined', 'Error'] return responses[int(self.results['response'])] def getFullResponse(self): return self.results def getResponseText(self): return self.results['responsetext'] def test(): import socket import sys from time import time ## TEST VALUES FROM API DOC: # Visa: 4111111111111111 # MasterCard 5431111111111111 # DiscoverCard: 6011601160116611 # American Express: 341111111111111 # Expiration: 10/10 # Amount: > 1.00 (( passing less than $1.00 will cause it to be declined )) # CVV: 999 creditcard = '4111111111111111' expiration = '1010' total = '1.00' cvv = '999' tax = '0.00' orderid = str(time())[4:10] # get a random invoice number try: payment = DowCommerce(demomode=True) payment.setTransaction( creditcard, expiration, total, cvv=cvv, tax=tax, orderid=orderid, orderdescription='Test Transaction', firstname='John', lastname='Doe', company='Acme', address1='123 Min Street', city='Hometown', state='VA', zipcode='12345', country='US', phone='888-555-1212', emailaddress='john@noemail.local', ipaddress='192.168.1.1') payment.process() if payment.isApproved(): print 'Payment approved!' print payment.getFullResponse() elif payment.isDeclined(): print 'Your credit card was declined by your bank' elif payment.isError(): raise DowCommerce.DowCommerceError('An uncaught error occurred') except DowCommerce.DowCommerceError, e: print "Exception thrown:", e print 'An error occured' print 'approved', payment.isApproved() print 'declined', payment.isDeclined() print 'error', payment.isError() if __name__ == '__main__': test() ������������������������������������web2py-2.12.3.orig/gluon/contrib/pdfinvoice.py������������������������������������������������������0000664�0000000�0000000�00000015621�12564727262�017754� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������""" BSD license - created by Massimo Di Pierro """ from reportlab.pdfgen.canvas import Canvas from reportlab.platypus import Table from reportlab.lib.pagesizes import A4 from reportlab.lib.units import cm from decimal import Decimal import cStringIO import datetime def listify(item): if isinstance(item,basestring): item = item.split('\n') return item class PDF(object): def __init__(self, page_size=A4, font_face='Helvetica'): self.page_size = page_size self.font_face = font_face self.logo = None def format_currency(self,value): a = list(str(int(value))) for k in range(len(a)-3,0,-3): a.insert(k,',') a = ''.join(a) b = ("%.2f" % (value-int(value)))[2:] return "%s.%s" % (a,b) def draw(self, invoice, items_page=10): """ Draws the invoice """ buffer = cStringIO.StringIO() invoice_items = invoice['items'] pages = max((len(invoice_items)-2)/items_page+1,1) canvas = Canvas(buffer, pagesize=self.page_size) for page in range(pages): canvas.translate(0, 29.7 * cm) canvas.setFont(self.font_face, 10) canvas.saveState() canvas.setStrokeColorRGB(0.9, 0.5, 0.2) canvas.setFillColorRGB(0.2, 0.2, 0.2) canvas.setFont(self.font_face, 16) canvas.drawString(1 * cm, -1 * cm, invoice.get('title','')) if self.logo: canvas.drawInlineImage(self.logo, 1 * cm, -1 * cm, 250, 16) canvas.setLineWidth(4) canvas.line(0, -1.25 * cm, 21.7 * cm, -1.25 * cm) canvas.restoreState() canvas.saveState() notes = listify(invoice.get('notes','')) textobject = canvas.beginText(1 * cm, -25 * cm) for line in notes: textobject.textLine(line) canvas.drawText(textobject) textobject = canvas.beginText(18 * cm, -28 * cm) textobject.textLine('Pag.%s/%s' % (page+1,pages)) canvas.drawText(textobject) canvas.restoreState() canvas.saveState() business_details = listify(invoice.get('from','FROM:')) canvas.setFont(self.font_face, 9) textobject = canvas.beginText(13 * cm, -2.5 * cm) for line in business_details: textobject.textLine(line) canvas.drawText(textobject) canvas.restoreState() canvas.saveState() client_info = listify(invoice.get('to','TO:')) textobject = canvas.beginText(1.5 * cm, -2.5 * cm) for line in client_info: textobject.textLine(line) canvas.drawText(textobject) canvas.restoreState() textobject = canvas.beginText(1.5 * cm, -6.75 * cm) textobject.textLine(u'Invoice ID: %s' % invoice.get('id','<invoice id>')) textobject.textLine(u'Invoice Date: %s' % invoice.get('date',datetime.date.today())) textobject.textLine(u'Client: %s' % invoice.get('client_name','<invoice client>')) canvas.drawText(textobject) items = invoice_items[1:][page*items_page:(page+1)*items_page] if items: data = [invoice_items[0]] for item in items: data.append([ self.format_currency(x) if isinstance(x,float) else x for x in item]) righta = [k for k,v in enumerate(items[0]) if isinstance(v,(int,float,Decimal))] if page == pages-1: total = self.format_currency(invoice['total']) else: total = '' data.append(['']*(len(items[0])-1)+[total]) colWidths = [2.5*cm]*len(items[0]) colWidths[1] = (21.5-2.5*len(items[0]))*cm table = Table(data, colWidths=colWidths) table.setStyle([ ('FONT', (0, 0), (-1, -1), self.font_face), ('FONTSIZE', (0, 0), (-1, -1), 8), ('TEXTCOLOR', (0, 0), (-1, -1), (0.2, 0.2, 0.2)), ('GRID', (0, 0), (-1, -2), 1, (0.7, 0.7, 0.7)), ('GRID', (-1, -1), (-1, -1), 1, (0.7, 0.7, 0.7)), ('BACKGROUND', (0, 0), (-1, 0), (0.8, 0.8, 0.8)), ]+[('ALIGN',(k,0),(k,-1),'RIGHT') for k in righta]) tw, th, = table.wrapOn(canvas, 15 * cm, 19 * cm) table.drawOn(canvas, 1 * cm, -8 * cm - th) if page == pages-1: items = invoice['totals'][1:] if items: data = [invoice['totals'][0]] for item in items: data.append([ self.format_currency(x) if isinstance(x,float) else x for x in item]) righta = [k for k,v in enumerate(items[0]) if isinstance(v,(int,float,Decimal))] total = self.format_currency(invoice['total']) data.append(['']*(len(items[0])-1)+[total]) colWidths = [2.5*cm]*len(items[0]) colWidths[1] = (21.5-2.5*len(items[0]))*cm table = Table(data, colWidths=colWidths) table.setStyle([ ('FONT', (0, 0), (-1, -1), self.font_face), ('FONTSIZE', (0, 0), (-1, -1), 8), ('TEXTCOLOR', (0, 0), (-1, -1), (0.2, 0.2, 0.2)), ('GRID', (0, 0), (-1, -2), 1, (0.7, 0.7, 0.7)), ('GRID', (-1, -1), (-1, -1), 1, (0.7, 0.7, 0.7)), ('BACKGROUND', (0, 0), (-1, 0), (0.8, 0.8, 0.8)), ]+[('ALIGN',(k,0),(k,-1),'RIGHT') for k in righta]) tw, th, = table.wrapOn(canvas, 15 * cm, 19 * cm) table.drawOn(canvas, 1 * cm, -18 * cm - th) canvas.showPage() canvas.save() return buffer.getvalue() if __name__=='__main__': invoice = { 'title': 'Invoice - web2py.com', 'id': '00001', 'date': '10/10/2013', 'client_name': 'Nobody', 'from': 'FROM:\nweb2py.com\nWabash ave\nChicago', 'to': 'TO:\nNobody\nHis address', 'notes': 'no comment!', 'total': 650.00, 'items': [ ['Codice','Desc','Quantity','Unit price','Total']]+[ ['000001','Chair',2,10.0,20.0] for k in range(30)], 'totals': [ ['Codice','Desc','Total']]+[ ['000001','Chairs',600.0], ['','Tax',50.0]], } print PDF().draw(invoice,items_page=20) ���������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/pyrtf/�������������������������������������������������������������0000775�0000000�0000000�00000000000�12564727262�016413� 5����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/pyrtf/Constants.py�������������������������������������������������0000664�0000000�0000000�00000007762�12564727262�020755� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class ViewKind : """An integer (0-5) that represents the view mode of the document.""" NONE = 0 PageLayout = 1 Outline = 2 MasterDocument = 3 Normal = 4 OnlineLayout = 5 DEFAULT = PageLayout def _IsValid( cls, value ) : return value in [ 0, 1, 2, 3, 4, 5 ] IsValid = classmethod( _IsValid ) class ViewScale : """Zoom level of the document; the N argument is a value representing a percentage (the default is 100).""" def _IsValid( cls, value ) : return value is None or (0 < value < 101) IsValid = classmethod( _IsValid ) class ViewZoomKind : """An integer (0 to 2) that represents the zoom kind of the document.""" NONE = 0 FullPage = 1 BestFit = 2 def _IsValid( cls, value ) : return value in [ None, 0, 1, 2 ] IsValid = classmethod( _IsValid ) class Languages : NoLanguage = 1024 Albanian = 1052 Arabic = 1025 Bahasa = 1057 BelgianDutch = 2067 BelgianFrench = 2060 BrazilianPortuguese = 1046 Bulgarian = 1026 Catalan = 1027 CroatoSerbianLatin = 1050 Czech = 1029 Danish = 1030 Dutch = 1043 EnglishAustralian = 3081 EnglishUK = 2057 EnglishUS = 1033 Finnish = 1035 French = 1036 FrenchCanadian = 3084 German = 1031 Greek = 1032 Hebrew = 1037 Hungarian = 1038 Icelandic = 1039 Italian = 1040 Japanese = 1041 Korean = 1042 NorwegianBokmal = 1044 NorwegianNynorsk = 2068 Polish = 1045 Portuguese = 2070 RhaetoRomanic = 1047 Romanian = 1048 Russian = 1049 SerboCroatianCyrillic = 2074 SimplifiedChinese = 2052 Slovak = 1051 SpanishCastilian = 1034 SpanishMexican = 2058 Swedish = 1053 SwissFrench = 4108 SwissGerman = 2055 SwissItalian = 2064 Thai = 1054 TraditionalChinese = 1028 Turkish = 1055 Urdu = 1056 SesothoSotho = 1072 Afrikaans = 1078 Zulu = 1077 Xhosa = 1076 Venda = 1075 Tswana = 1074 Tsonga = 1073 FarsiPersian = 1065 Codes = [ 1024, 1052, 1025, 1057, 2067, 2060, 1046, 1026, 1027, 1050, 1029, 1030, 1043, 3081, 2057, 1033, 1035, 1036, 3084, 1031, 1032, 1037, 1038, 1039, 1040, 1041, 1042, 1044, 2068, 1045, 2070, 1047, 1048, 1049, 2074, 2052, 1051, 1034, 2058, 1053, 4108, 2055, 2064, 1054, 1028, 1055, 1056, 1072, 1078, 1077, 1076, 1075, 1074, 1073, 1065 ] # make it Australian as that is what I use most of the time DEFAULT = EnglishAustralian def _IsValid( cls, value ) : return value in cls.Codes IsValid = classmethod( _IsValid ) if __name__ == '__main__' : PrintHexTable() ��������������web2py-2.12.3.orig/gluon/contrib/pyrtf/Styles.py����������������������������������������������������0000664�0000000�0000000�00000006334�12564727262�020256� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������""" A Styles is a collection of PropertySets that can be applied to a particular RTF element. At present there are only two, Text and Paragraph but ListStyles will be added soon too. """ from PropertySets import * class TextStyle : def __init__( self, text_props, name=None, shading_props=None ) : self.SetTextPropertySet ( text_props ) self.SetName ( name ) self.SetShadingPropertySet( shading_props ) def Copy( self ) : return deepcopy( self ) def SetName( self, value ) : self.Name = value return self def SetTextPropertySet( self, value ) : assert isinstance( value, TextPropertySet ) self.TextPropertySet = value return self def SetShadingPropertySet( self, value ) : assert value is None or isinstance( value, ShadingPropertySet ) self.ShadingPropertySet = value or ShadingPropertySet() return self class ParagraphStyle : def __init__( self, name, text_style, paragraph_props=None, frame_props=None, shading_props=None ) : # A style must have Font and a Font Size but the Text property set doesn't # make these mandatory so that they can be used for overrides so at this point # we need to make sure that that we have these values set if not text_style.TextPropertySet.Font : raise Exception( 'Paragraph Styles must have a Font specified.' ) if not text_style.TextPropertySet.Size : raise Exception( 'Paragraph Styles must have a Font Size specified.' ) self.SetName ( name ) self.SetTextStyle ( text_style ) self.SetParagraphPropertySet( paragraph_props ) self.SetFramePropertySet ( frame_props ) self.SetShadingPropertySet ( shading_props ) self.SetBasedOn( None ) self.SetNext ( None ) def Copy( self ) : return deepcopy( self ) def SetName( self, value ) : self.Name = value return self def SetTextStyle( self, value ) : assert isinstance( value, TextStyle ) self.TextStyle = value return self def SetParagraphPropertySet( self, value ) : assert value is None or isinstance( value, ParagraphPropertySet ) self.ParagraphPropertySet = value or ParagraphPropertySet() return self def SetFramePropertySet( self, value ) : assert value is None or isinstance( value, FramePropertySet ) self.FramePropertySet = value or FramePropertySet() return self def SetShadingPropertySet( self, value ) : """Set the background shading for the paragraph.""" assert value is None or isinstance( value, ShadingPropertySet ) self.ShadingPropertySet = value or ShadingPropertySet() return self def SetBasedOn( self, value ) : """Set the Paragraph Style that this one is based on.""" assert not value or isinstance( value, ParagraphStyle ) self.BasedOn = value return self def SetNext( self, value ) : """Set the Paragraph Style that should follow this one.""" assert not value or isinstance( value, ParagraphStyle ) self.Next = value return self ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/pyrtf/__init__.py��������������������������������������������������0000664�0000000�0000000�00000000372�12564727262�020526� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������from PropertySets import * from Elements import * from Styles import * from Renderer import * def dumps(doc): import cStringIO s=cStringIO.StringIO() r=Renderer() r.Write(doc,s) return s.getvalue() ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/pyrtf/PropertySets.py����������������������������������������������0000664�0000000�0000000�00000033300�12564727262�021447� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������""" PropertySets group common attributes together, each property set is used to control a specific part of the rendering. PropertySets can be used in different elements of the document. For example the FramePropertySet is used in paragraphs, tables, cells, etc. The TextPropertySet can be used for text or in a Paragraph Style. """ from types import StringType from copy import deepcopy # # We need some basic Type like fonts, colours and paper definitions # def MakeAttributeName( value ) : assert value and type( value ) is StringType value = value.replace( ' ', '' ) return value class AttributedList( list ) : def __init__( self, accepted_type=None ) : super( AttributedList, self ).__init__() self.AcceptedType = accepted_type self._append = super( AttributedList, self ).append def append( self, *values ) : for value in values : if self.AcceptedType : assert isinstance( value, self.AcceptedType ) self._append( value ) name = getattr( value, 'Name', None ) if name : name = MakeAttributeName( value.Name ) setattr( self, name, value ) def __deepcopy__( self, memo ) : result = self.__class__() result.append( *self[:] ) return result class Colour : def __init__( self, name, red, green, blue ) : self.SetName ( name ) self.SetRed ( red ) self.SetGreen( green ) self.SetBlue ( blue ) def SetName( self, value ) : self.Name = value return self def SetRed( self, value ) : self.Red = value return self def SetGreen( self, value ) : self.Green = value return self def SetBlue( self, value ) : self.Blue = value return self class Colours( AttributedList ) : def __init__( self ) : super( Colours, self ).__init__( Colour ) class Font : def __init__( self, name, family, character_set = 0, pitch = None, panose = None, alternate = None ) : self.SetName ( name ) self.SetFamily ( family ) self.SetCharacterSet( character_set ) self.SetPitch ( pitch ) self.SetPanose ( panose ) self.SetAlternate ( alternate ) def SetName( self, value ) : self.Name = value return self def SetFamily( self, value ) : self.Family = value return self def SetCharacterSet( self, value ) : self.CharacterSet = value return self def SetPitch( self, value ) : self.Pitch = value return self def SetPanose( self, value ) : self.Panose = value return self def SetAlternate( self, value ) : self.Alternate = value return self class Fonts( AttributedList ) : def __init__( self ) : super( Fonts, self ).__init__( Font ) class Paper : def __init__( self, name, code, description, width, height ) : self.SetName ( name ) self.SetCode ( code ) self.SetDescription( description ) self.SetWidth ( width ) self.SetHeight ( height ) def SetName( self, value ) : self.Name = value return self def SetCode( self, value ) : self.Code = value return self def SetDescription( self, value ) : self.Description = value return self def SetWidth( self, value ) : self.Width = value return self def SetHeight( self, value ) : self.Height = value return self class Papers( AttributedList ) : def __init__( self ) : super( Papers, self ).__init__( Paper ) # # Then we have property sets which represent different aspects of Styles # class MarginsPropertySet : def __init__( self, top=None, left=None, bottom=None, right=None ) : self.SetTop ( top ) self.SetLeft ( left ) self.SetBottom( bottom ) self.SetRight ( right ) def SetTop( self, value ) : self.Top = value return self def SetLeft( self, value ) : self.Left = value return self def SetBottom( self, value ) : self.Bottom = value return self def SetRight( self, value ) : self.Right = value return self class ShadingPropertySet : HORIZONTAL = 1 VERTICAL = 2 FORWARD_DIAGONAL = 3 BACKWARD_DIAGONAL = 4 VERTICAL_CROSS = 5 DIAGONAL_CROSS = 6 DARK_HORIZONTAL = 7 DARK_VERTICAL = 8 DARK_FORWARD_DIAGONAL = 9 DARK_BACKWARD_DIAGONAL = 10 DARK_VERTICAL_CROSS = 11 DARK_DIAGONAL_CROSS = 12 PATTERNS = [ HORIZONTAL, VERTICAL, FORWARD_DIAGONAL, BACKWARD_DIAGONAL, VERTICAL_CROSS, DIAGONAL_CROSS, DARK_HORIZONTAL, DARK_VERTICAL, DARK_FORWARD_DIAGONAL, DARK_BACKWARD_DIAGONAL, DARK_VERTICAL_CROSS, DARK_DIAGONAL_CROSS ] def __init__( self, shading=None, pattern=None, foreground=None, background=None ) : self.SetShading ( shading ) self.SetForeground( foreground ) self.SetBackground( background ) self.SetPattern ( pattern ) def __deepcopy__( self, memo ) : return ShadingPropertySet( self.Shading, self.Foreground, self.Background, self.Pattern ) def SetShading( self, value ) : self.Shading = value return self def SetPattern( self, value ) : assert value is None or value in self.PATTERNS self.Pattern = value return self def SetForeground( self, value ) : assert not value or isinstance( value, Colour ) self.Foreground = value return self def SetBackground( self, value ) : assert not value or isinstance( value, Colour ) self.Background = value return self class BorderPropertySet : SINGLE = 1 DOUBLE = 2 SHADOWED = 3 DOUBLED = 4 DOTTED = 5 DASHED = 6 HAIRLINE = 7 STYLES = [ SINGLE, DOUBLE, SHADOWED, DOUBLED, DOTTED, DASHED, HAIRLINE ] def __init__( self, width=None, style=None, colour=None, spacing=None ) : self.SetWidth ( width ) self.SetStyle ( style or self.SINGLE ) self.SetColour ( colour ) self.SetSpacing( spacing ) def SetWidth( self, value ) : self.Width = value return self def SetStyle( self, value ) : assert value is None or value in self.STYLES self.Style = value return self def SetColour( self, value ) : assert value is None or isinstance( value, Colour ) self.Colour = value return self def SetSpacing( self, value ) : self.Spacing = value return self class FramePropertySet : def __init__( self, top=None, left=None, bottom=None, right=None ) : self.SetTop ( top ) self.SetLeft ( left ) self.SetBottom( bottom ) self.SetRight ( right ) def SetTop( self, value ) : assert value is None or isinstance( value, BorderPropertySet ) self.Top = value return self def SetLeft( self, value ) : assert value is None or isinstance( value, BorderPropertySet ) self.Left = value return self def SetBottom( self, value ) : assert value is None or isinstance( value, BorderPropertySet ) self.Bottom = value return self def SetRight( self, value ) : assert value is None or isinstance( value, BorderPropertySet ) self.Right = value return self class TabPropertySet : DEFAULT_WIDTH = 720 LEFT = 1 RIGHT = 2 CENTER = 3 DECIMAL = 4 ALIGNMENT = [ LEFT, RIGHT, CENTER, DECIMAL ] DOTS = 1 HYPHENS = 2 UNDERLINE = 3 THICK_LINE = 4 EQUAL_SIGN = 5 LEADERS = [ DOTS, HYPHENS, UNDERLINE, THICK_LINE, EQUAL_SIGN ] def __init__( self, width=None, alignment=None, leader=None ) : self.SetWidth ( width ) self.SetAlignment( alignment or self.LEFT ) self.SetLeader ( leader ) def SetWidth( self, value ) : self.Width = value return self def SetAlignment( self, value ) : assert value in self.ALIGNMENT self.Alignment = value return self def SetLeader( self, value ) : assert not value or value in self.LEADERS self.Leader = value return self class TextPropertySet : def __init__( self, font=None, size=None, bold=None, italic=None, underline=None, colour=None, frame=None, expansion=None ) : self.SetFont ( font ) self.SetSize ( size ) self.SetBold ( bold or False ) self.SetItalic ( italic or False ) self.SetUnderline ( underline or False ) self.SetColour( colour ) self.SetFrame ( frame ) self.SetStrikeThrough ( False ) self.SetDottedUnderline( False ) self.SetDoubleUnderline( False ) self.SetWordUnderline ( False ) self.SetExpansion ( expansion ) def Copy( self ) : return deepcopy( self ) def __deepcopy__( self, memo ) : # the font must remain a reference to the same font that we are looking at # so we want to stop the recursiveness at this point and return an object # with the right references. result = TextPropertySet( self.Font, self.Size, self.Bold, self.Italic, self.Underline, self.Colour, deepcopy( self.Frame, memo ) ) result.SetStrikeThrough( self.StrikeThrough ) return result def SetFont( self, value ) : assert not value or isinstance( value, Font ) self.Font = value return self def SetSize( self, value ) : self.Size = value return self def SetBold( self, value ) : self.Bold = False if value : self.Bold = True return self def SetItalic( self, value ) : self.Italic = False if value : self.Italic = True return self def SetUnderline( self, value ) : self.Underline = False if value : self.Underline = True return self def SetColour( self, value ) : assert value is None or isinstance( value, Colour ) self.Colour = value return self def SetFrame( self, value ) : assert value is None or isinstance( value, BorderPropertySet ) self.Frame = value return self def SetStrikeThrough( self, value ) : self.StrikeThrough = False if value : self.StrikeThrough = True return self def SetDottedUnderline( self, value ) : self.DottedUnderline = False if value : self.DottedUnderline = True return self def SetDoubleUnderline( self, value ) : self.DoubleUnderline = False if value : self.DoubleUnderline = True return self def SetWordUnderline( self, value ) : self.WordUnderline = False if value : self.WordUnderline = True return self def SetExpansion( self, value ) : self.Expansion = value return self class ParagraphPropertySet : LEFT = 1 RIGHT = 2 CENTER = 3 JUSTIFY = 4 DISTRIBUTE = 5 ALIGNMENT = [ LEFT, RIGHT, CENTER, JUSTIFY, DISTRIBUTE ] def __init__( self, alignment=None, space_before=None, space_after=None, tabs=None, first_line_indent=None, left_indent=None, right_indent=None, page_break_before=None ) : self.SetAlignment ( alignment or self.LEFT ) self.SetSpaceBefore( space_before ) self.SetSpaceAfter ( space_after ) self.Tabs = [] if tabs : apply( self.SetTabs, tabs ) self.SetFirstLineIndent( first_line_indent or None ) self.SetLeftIndent ( left_indent or None ) self.SetRightIndent ( right_indent or None ) self.SetPageBreakBefore( page_break_before ) self.SetSpaceBetweenLines( None ) def Copy( self ) : return deepcopy( self ) def SetAlignment( self, value ) : assert not value or value in self.ALIGNMENT self.Alignment = value or self.LEFT return self def SetSpaceBefore( self, value ) : self.SpaceBefore = value return self def SetSpaceAfter( self, value ) : self.SpaceAfter = value return self def SetTabs( self, *params ) : self.Tabs = params return self def SetFirstLineIndent( self, value ) : self.FirstLineIndent = value return self def SetLeftIndent( self, value ) : self.LeftIndent = value return self def SetRightIndent( self, value ) : self.RightIndent = value return self def SetSpaceBetweenLines( self, value ) : self.SpaceBetweenLines = value return self def SetPageBreakBefore( self, value ) : self.PageBreakBefore = False if value : self.PageBreakBefore = True return self # Some short cuts to make the code a bit easier to read MarginsPS = MarginsPropertySet ShadingPS = ShadingPropertySet BorderPS = BorderPropertySet FramePS = FramePropertySet TabPS = TabPropertySet TextPS = TextPropertySet ParagraphPS = ParagraphPropertySet ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/pyrtf/Elements.py��������������������������������������������������0000664�0000000�0000000�00000100502�12564727262�020537� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������from types import IntType, FloatType, LongType, StringTypes from copy import deepcopy from binascii import hexlify from Constants import * from Styles import * class UnhandledParamError( Exception ) : def __init__( self, param ) : Exception.__init__( self, "Don't know what to do with param %s" % param ) # red green blue StandardColours = Colours() StandardColours.append( Colour( 'Black', 0, 0, 0 ) ) StandardColours.append( Colour( 'Blue', 0, 0, 255 ) ) StandardColours.append( Colour( 'Turquoise', 0, 255, 255 ) ) StandardColours.append( Colour( 'Green', 0, 255, 0 ) ) StandardColours.append( Colour( 'Pink', 255, 0, 255 ) ) StandardColours.append( Colour( 'Red', 255, 0, 0 ) ) StandardColours.append( Colour( 'Yellow', 255, 255, 0 ) ) StandardColours.append( Colour( 'White', 255, 255, 255 ) ) StandardColours.append( Colour( 'Blue Dark', 0, 0, 128 ) ) StandardColours.append( Colour( 'Teal', 0, 128, 128 ) ) StandardColours.append( Colour( 'Green Dark', 0, 128, 0 ) ) StandardColours.append( Colour( 'Violet', 128, 0, 128 ) ) StandardColours.append( Colour( 'Red Dark', 128, 0, 0 ) ) StandardColours.append( Colour( 'Yellow Dark', 128, 128, 0 ) ) StandardColours.append( Colour( 'Grey Dark', 128, 128, 128 ) ) StandardColours.append( Colour( 'Grey', 192, 192, 192 ) ) StandardFonts = Fonts() StandardFonts.append( Font( 'Arial' , 'swiss' , 0, 2, '020b0604020202020204' ) ) StandardFonts.append( Font( 'Arial Black' , 'swiss' , 0, 2, '020b0a04020102020204' ) ) StandardFonts.append( Font( 'Arial Narrow' , 'swiss' , 0, 2, '020b0506020202030204' ) ) StandardFonts.append( Font( 'Bitstream Vera Sans Mono', 'modern', 0, 1, '020b0609030804020204' ) ) StandardFonts.append( Font( 'Bitstream Vera Sans' , 'swiss' , 0, 2, '020b0603030804020204' ) ) StandardFonts.append( Font( 'Bitstream Vera Serif' , 'roman' , 0, 2, '02060603050605020204' ) ) StandardFonts.append( Font( 'Book Antiqua' , 'roman' , 0, 2, '02040602050305030304' ) ) StandardFonts.append( Font( 'Bookman Old Style' , 'roman' , 0, 2, '02050604050505020204' ) ) StandardFonts.append( Font( 'Castellar' , 'roman' , 0, 2, '020a0402060406010301' ) ) StandardFonts.append( Font( 'Century Gothic' , 'swiss' , 0, 2, '020b0502020202020204' ) ) StandardFonts.append( Font( 'Comic Sans MS' , 'script', 0, 2, '030f0702030302020204' ) ) StandardFonts.append( Font( 'Courier New' , 'modern', 0, 1, '02070309020205020404' ) ) StandardFonts.append( Font( 'Franklin Gothic Medium' , 'swiss' , 0, 2, '020b0603020102020204' ) ) StandardFonts.append( Font( 'Garamond' , 'roman' , 0, 2, '02020404030301010803' ) ) StandardFonts.append( Font( 'Georgia' , 'roman' , 0, 2, '02040502050405020303' ) ) StandardFonts.append( Font( 'Haettenschweiler' , 'swiss' , 0, 2, '020b0706040902060204' ) ) StandardFonts.append( Font( 'Impact' , 'swiss' , 0, 2, '020b0806030902050204' ) ) StandardFonts.append( Font( 'Lucida Console' , 'modern', 0, 1, '020b0609040504020204' ) ) StandardFonts.append( Font( 'Lucida Sans Unicode' , 'swiss' , 0, 2, '020b0602030504020204' ) ) StandardFonts.append( Font( 'Microsoft Sans Serif' , 'swiss' , 0, 2, '020b0604020202020204' ) ) StandardFonts.append( Font( 'Monotype Corsiva' , 'script', 0, 2, '03010101010201010101' ) ) StandardFonts.append( Font( 'Palatino Linotype' , 'roman' , 0, 2, '02040502050505030304' ) ) StandardFonts.append( Font( 'Papyrus' , 'script', 0, 2, '03070502060502030205' ) ) StandardFonts.append( Font( 'Sylfaen' , 'roman' , 0, 2, '010a0502050306030303' ) ) StandardFonts.append( Font( 'Symbol' , 'roman' , 2, 2, '05050102010706020507' ) ) StandardFonts.append( Font( 'Tahoma' , 'swiss' , 0, 2, '020b0604030504040204' ) ) StandardFonts.append( Font( 'Times New Roman' , 'roman' , 0, 2, '02020603050405020304' ) ) StandardFonts.append( Font( 'Trebuchet MS' , 'swiss' , 0, 2, '020b0603020202020204' ) ) StandardFonts.append( Font( 'Verdana' , 'swiss' , 0, 2, '020b0604030504040204' ) ) StandardFonts.Castellar.SetAlternate( StandardFonts.Georgia ) """ Found the following definition at http://www.pbdr.com/vbtips/gen/convtwip.htm Twips are screen-independent units used to ensure that the placement and proportion of screen elements in your screen application are the same on all display systems. A twip is a unit of screen measurement equal to 1/20 of a printer's point. The conversion between twips and inches/centimeters/millimeters is as follows: There are approximately 1440 twips to a inch (the length of a screen item measuring one inch when printed). As there are 2.54 centimeters to 1 inch, then there are approximately 567 twips to a centimeter (the length of a screen item measuring one centimeter when printed). Or in millimeters, as there are 25.4 millimeters to 1 inch, therefore there are approximately 56.7 twips to a millimeter (the length of a screen item measuring one millimeter when printed).""" # Width default is 12240, Height default is 15840 StandardPaper = Papers() StandardPaper.append( Paper( 'LETTER' , 1, 'Letter 8 1/2 x 11 in' , 12240, 15840 ) ) StandardPaper.append( Paper( 'LETTERSMALL' , 2, 'Letter Small 8 1/2 x 11 in' , 12240, 15840 ) ) StandardPaper.append( Paper( 'TABLOID' , 3, 'Tabloid 11 x 17 in' , 15840, 24480 ) ) StandardPaper.append( Paper( 'LEDGER' , 4, 'Ledger 17 x 11 in' , 24480, 15840 ) ) StandardPaper.append( Paper( 'LEGAL' , 5, 'Legal 8 1/2 x 14 in' , 12240, 20160 ) ) StandardPaper.append( Paper( 'STATEMENT' , 6, 'Statement 5 1/2 x 8 1/2 in' , 7920, 12240 ) ) StandardPaper.append( Paper( 'EXECUTIVE' , 7, 'Executive 7 1/4 x 10 1/2 in' , 10440, 15120 ) ) StandardPaper.append( Paper( 'A3' , 8, 'A3 297 x 420 mm' , 16838, 23811 ) ) StandardPaper.append( Paper( 'A4' , 9, 'A4 210 x 297 mm' , 11907, 16838 ) ) StandardPaper.append( Paper( 'A4SMALL' , 10, 'A4 Small 210 x 297 mm' , 11907, 16838 ) ) StandardPaper.append( Paper( 'A5' , 11, 'A5 148 x 210 mm' , 8391, 11907 ) ) StandardPaper.append( Paper( 'B4' , 12, 'B4 (JIS) 250 x 354' , 14175, 20072 ) ) StandardPaper.append( Paper( 'B5' , 13, 'B5 (JIS) 182 x 257 mm' , 10319, 14572 ) ) StandardPaper.append( Paper( 'FOLIO' , 14, 'Folio 8 1/2 x 13 in' , 12240, 18720 ) ) StandardPaper.append( Paper( 'QUARTO' , 15, 'Quarto 215 x 275 mm' , 12191, 15593 ) ) StandardPaper.append( Paper( '10X14' , 16, '10x14 in' , 14400, 20160 ) ) StandardPaper.append( Paper( '11X17' , 17, '11x17 in' , 15840, 24480 ) ) StandardPaper.append( Paper( 'NOTE' , 18, 'Note 8 1/2 x 11 in' , 12240, 15840 ) ) StandardPaper.append( Paper( 'ENV_9' , 19, 'Envelope #9 3 7/8 x 8 7/8' , 5580, 12780 ) ) StandardPaper.append( Paper( 'ENV_10' , 20, 'Envelope #10 4 1/8 x 9 1/2' , 5940, 13680 ) ) StandardPaper.append( Paper( 'ENV_11' , 21, 'Envelope #11 4 1/2 x 10 3/8' , 6480, 14940 ) ) StandardPaper.append( Paper( 'ENV_12' , 22, 'Envelope #12 4 3/4 x 11' , 6840, 15840 ) ) StandardPaper.append( Paper( 'ENV_14' , 23, 'Envelope #14 5 x 11 1/2' , 7200, 16560 ) ) StandardPaper.append( Paper( 'CSHEET' , 24, 'C size sheet 18 x 24 in' , 29520, 34560 ) ) StandardPaper.append( Paper( 'DSHEET' , 25, 'D size sheet 22 x 34 in' , 31680, 48960 ) ) StandardPaper.append( Paper( 'ESHEET' , 26, 'E size sheet 34 x 44 in' , 48960, 63360 ) ) StandardPaper.append( Paper( 'ENV_DL' , 27, 'Envelope DL 110 x 220mm' , 6237, 12474 ) ) StandardPaper.append( Paper( 'ENV_C5' , 28, 'Envelope C5 162 x 229 mm' , 9185, 12984 ) ) StandardPaper.append( Paper( 'ENV_C3' , 29, 'Envelope C3 324 x 458 mm' , 18371, 25969 ) ) StandardPaper.append( Paper( 'ENV_C4' , 30, 'Envelope C4 229 x 324 mm' , 12984, 18371 ) ) StandardPaper.append( Paper( 'ENV_C6' , 31, 'Envelope C6 114 x 162 mm' , 6464, 9185 ) ) StandardPaper.append( Paper( 'ENV_C65' , 32, 'Envelope C65 114 x 229 mm' , 6464, 12984 ) ) StandardPaper.append( Paper( 'ENV_B4' , 33, 'Envelope B4 250 x 353 mm' , 14175, 20015 ) ) StandardPaper.append( Paper( 'ENV_B5' , 34, 'Envelope B5 176 x 250 mm' , 9979, 14175 ) ) StandardPaper.append( Paper( 'ENV_B6' , 35, 'Envelope B6 176 x 125 mm' , 9979, 7088 ) ) StandardPaper.append( Paper( 'ENV_ITALY' , 36, 'Envelope 110 x 230 mm' , 6237, 13041 ) ) StandardPaper.append( Paper( 'ENV_MONARCH' , 37, 'Envelope Monarch 3.875 x 7.5 in' , 5580, 10800 ) ) StandardPaper.append( Paper( 'ENV_PERSONAL' , 38, '6 3/4 Envelope 3 5/8 x 6 1/2 in' , 5220, 9360 ) ) StandardPaper.append( Paper( 'FANFOLD_US' , 39, 'US Std Fanfold 14 7/8 x 11 in' , 21420, 15840 ) ) StandardPaper.append( Paper( 'FANFOLD_STD_GERMAN' , 40, 'German Std Fanfold 8 1/2 x 12 in' , 12240, 17280 ) ) StandardPaper.append( Paper( 'FANFOLD_LGL_GERMAN' , 41, 'German Legal Fanfold 8 1/2 x 13 in' , 12240, 18720 ) ) # # Finally a StyleSheet in which all of this stuff is put together # class StyleSheet : def __init__( self, colours=None, fonts=None ) : self.Colours = colours or deepcopy( StandardColours ) self.Fonts = fonts or deepcopy( StandardFonts ) self.TextStyles = AttributedList() self.ParagraphStyles = AttributedList() class Section( list ) : NONE = 1 COLUMN = 2 PAGE = 3 EVEN = 4 ODD = 5 BREAK_TYPES = [ NONE, COLUMN, PAGE, EVEN, ODD ] def __init__( self, paper=None, margins=None, break_type=None, headery=None, footery=None, landscape=None, first_page_number=None ) : super( Section, self ).__init__() self.Paper = paper or StandardPaper.A4 self.SetMargins( margins ) self.Header = [] self.Footer = [] self.FirstHeader = [] self.FirstFooter = [] self.SetBreakType( break_type or self.NONE ) self.SetHeaderY( headery ) self.SetFooterY( footery ) self.SetLandscape( landscape ) self.SetFirstPageNumber( first_page_number ) def TwipsToRightMargin( self ) : return self.Paper.Width - ( self.Margins.Left + self.Margins.Right ) def SetMargins( self, value ) : self.Margins = value or MarginsPropertySet( top=1000, left=1200, bottom=1000, right=1200 ) self.Width = self.Paper.Width - ( self.Margins.Left + self.Margins.Right ) def SetBreakType( self, value ) : assert value in self.BREAK_TYPES self.BreakType = value return self def SetHeaderY( self, value ) : self.HeaderY = value return self def SetFooterY( self, value ) : self.FooterY = value return self def SetLandscape( self, value ) : self.Landscape = False if value : self.Landscape = True return self def SetFirstPageNumber( self, value ) : self.FirstPageNumber = value return self def MakeDefaultStyleSheet( ) : result = StyleSheet() NormalText = TextStyle( TextPropertySet( result.Fonts.Arial, 22 ) ) ps = ParagraphStyle( 'Normal', NormalText.Copy(), ParagraphPropertySet( space_before = 60, space_after = 60 ) ) result.ParagraphStyles.append( ps ) ps = ParagraphStyle( 'Normal Short', NormalText.Copy() ) result.ParagraphStyles.append( ps ) NormalText.TextPropertySet.SetSize( 32 ) ps = ParagraphStyle( 'Heading 1', NormalText.Copy(), ParagraphPropertySet( space_before = 240, space_after = 60 ) ) result.ParagraphStyles.append( ps ) NormalText.TextPropertySet.SetSize( 24 ).SetBold( True ) ps = ParagraphStyle( 'Heading 2', NormalText.Copy(), ParagraphPropertySet( space_before = 240, space_after = 60 ) ) result.ParagraphStyles.append( ps ) # Add some more in that are based on the normal template but that # have some indenting set that makes them suitable for doing numbered normal_numbered = result.ParagraphStyles.Normal.Copy() normal_numbered.SetName( 'Normal Numbered' ) normal_numbered.ParagraphPropertySet.SetFirstLineIndent( TabPropertySet.DEFAULT_WIDTH * -1 ) normal_numbered.ParagraphPropertySet.SetLeftIndent ( TabPropertySet.DEFAULT_WIDTH ) result.ParagraphStyles.append( normal_numbered ) normal_numbered2 = result.ParagraphStyles.Normal.Copy() normal_numbered2.SetName( 'Normal Numbered 2' ) normal_numbered2.ParagraphPropertySet.SetFirstLineIndent( TabPropertySet.DEFAULT_WIDTH * -1 ) normal_numbered2.ParagraphPropertySet.SetLeftIndent ( TabPropertySet.DEFAULT_WIDTH * 2 ) result.ParagraphStyles.append( normal_numbered2 ) ## LIST STYLES for idx, indent in [ (1, TabPS.DEFAULT_WIDTH ), (2, TabPS.DEFAULT_WIDTH * 2), (3, TabPS.DEFAULT_WIDTH * 3) ] : indent = TabPropertySet.DEFAULT_WIDTH ps = ParagraphStyle( 'List %s' % idx, TextStyle( TextPropertySet( result.Fonts.Arial, 22 ) ), ParagraphPropertySet( space_before = 60, space_after = 60, first_line_indent = -indent, left_indent = indent) ) result.ParagraphStyles.append( ps ) return result class TAB : pass class LINE : pass class RawCode : def __init__( self, data ) : self.Data = data PAGE_NUMBER = RawCode( r'{\field{\fldinst page}}' ) TOTAL_PAGES = RawCode( r'{\field{\fldinst numpages}}' ) SECTION_PAGES = RawCode( r'{\field{\fldinst sectionpages}}' ) ARIAL_BULLET = RawCode( r'{\f2\'95}' ) def _get_jpg_dimensions( fin ): """ converted from: http://dev.w3.org/cvsweb/Amaya/libjpeg/rdjpgcom.c?rev=1.2 """ M_SOF0 = chr( 0xC0 ) # /* Start Of Frame N */ M_SOF1 = chr( 0xC1 ) # /* N indicates which compression process */ M_SOF2 = chr( 0xC2 ) # /* Only SOF0-SOF2 are now in common use */ M_SOF3 = chr( 0xC3 ) # M_SOF5 = chr( 0xC5 ) # /* NB: codes C4 and CC are NOT SOF markers */ M_SOF6 = chr( 0xC6 ) # M_SOF7 = chr( 0xC7 ) # M_SOF9 = chr( 0xC9 ) # M_SOF10 = chr( 0xCA ) # M_SOF11 = chr( 0xCB ) # M_SOF13 = chr( 0xCD ) # M_SOF14 = chr( 0xCE ) # M_SOF15 = chr( 0xCF ) # M_SOI = chr( 0xD8 ) # /* Start Of Image (beginning of datastream) */ M_EOI = chr( 0xD9 ) # /* End Of Image (end of datastream) */ M_FF = chr( 0xFF ) MARKERS = [ M_SOF0, M_SOF1, M_SOF2, M_SOF3, M_SOF5, M_SOF6, M_SOF7, M_SOF9, M_SOF10,M_SOF11, M_SOF13, M_SOF14, M_SOF15 ] def get_length() : b1 = fin.read( 1 ) b2 = fin.read( 1 ) return (ord(b1) << 8) + ord(b2) def next_marker() : # markers come straight after an 0xFF so skip everything # up to the first 0xFF that we find while fin.read(1) != M_FF : pass # there can be more than one 0xFF as they can be used # for padding so we are now looking for the first byte # that isn't an 0xFF, this will be the marker while True : result = fin.read(1) if result != M_FF : return result raise Exception( 'Invalid JPEG' ) # BODY OF THE FUNCTION if not ((fin.read(1) == M_FF) and (fin.read(1) == M_SOI)) : raise Exception( 'Invalid Jpeg' ) while True : marker = next_marker() # the marker is always followed by two bytes representing the length of the data field length = get_length () if length < 2 : raise Exception( "Erroneous JPEG marker length" ) # if it is a compression process marker then it will contain the dimension of the image if marker in MARKERS : # the next byte is the data precision, just skip it fin.read(1) # bingo image_height = get_length() image_width = get_length() return image_width, image_height # just skip whatever data it contains fin.read( length - 2 ) raise Exception( 'Invalid JPEG, end of stream reached' ) _PNG_HEADER = '\x89\x50\x4e' def _get_png_dimensions( data ) : if data[0:3] != _PNG_HEADER : raise Exception( 'Invalid PNG image' ) width = (ord(data[18]) * 256) + (ord(data[19])) height = (ord(data[22]) * 256) + (ord(data[23])) return width, height def _get_emf_dimensions( fin ): import struct def get_DWORD(): return struct.unpack("<L",fin.read(4))[0] def get_LONG(): return struct.unpack("<l",fin.read(4))[0] def get_WORD(): return struct.unpack("<H",fin.read(2))[0] class Empty: pass header = Empty() header.RecordType = get_DWORD() # Record type header.RecordSize = get_DWORD() # Size of the record in bytes header.BoundsLeft = get_LONG() # Left inclusive bounds header.BoundsTop = get_LONG() # Top inclusive bounds header.BoundsRight = get_LONG() # Right inclusive bounds header.BoundsBottom = get_LONG() # Bottom inclusive bounds header.FrameLeft = get_LONG() # Left side of inclusive picture frame header.FrameTop = get_LONG() # Top side of inclusive picture frame header.FrameRight = get_LONG() # Right side of inclusive picture frame header.FrameBottom = get_LONG() # Bottom side of inclusive picture frame header.Signature = get_DWORD() # Signature ID (always 0x464D4520) header.Version = get_DWORD() # Version of the metafile header.Size = get_DWORD() # Size of the metafile in bytes header.NumOfRecords = get_DWORD() # Number of records in the metafile header.NumOfHandles = get_WORD() # Number of handles in the handle table header.Reserved = get_WORD() # Not used (always 0) header.SizeOfDescrip = get_DWORD() # Size of description string in WORDs header.OffsOfDescrip = get_DWORD() # Offset of description string in metafile header.NumPalEntries = get_DWORD() # Number of color palette entries header.WidthDevPixels = get_LONG() # Width of reference device in pixels header.HeightDevPixels = get_LONG() # Height of reference device in pixels header.WidthDevMM = get_LONG() # Width of reference device in millimeters header.HeightDevMM = get_LONG() # Height of reference device in millimeters if 0: klist = header.__dict__.keys() klist.sort() for k in klist: print "%20s:%s" % (k,header.__dict__[k]) dw = header.FrameRight-header.FrameLeft dh = header.FrameBottom-header.FrameTop # convert from 0.01mm units to 1/72in units return int(dw * 72.0/2540.0), int(dh * 72.0/2540.0) class Image( RawCode ) : # Need to add in the width and height in twips as it crashes # word xp with these values. Still working out the most # efficient way of getting these values. # \picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 # picwgoal900\pichgoal281 PNG_LIB = 'pngblip' JPG_LIB = 'jpegblip' EMF_LIB = 'emfblip' PICT_TYPES = { 'png' : PNG_LIB, 'jpg' : JPG_LIB, 'emf' : EMF_LIB} def __init__( self, infile, **kwargs ) : if hasattr( infile, 'read' ): fin = infile if 'datatype' not in kwargs.keys(): msg = "If passing in a file object, you must also specify type='xxx' where xxx is one of %s" % self.PICT_TYPES.keys() raise ValueError,msg file_name = kwargs.pop('datatype') else: fin = file( infile, 'rb' ) file_name = infile pict_type = self.PICT_TYPES[ file_name[ -3 : ].lower() ] if pict_type == self.PNG_LIB : width, height = _get_png_dimensions( fin.read( 100 ) ) elif pict_type == self.JPG_LIB : width, height = _get_jpg_dimensions( fin ) elif pict_type == self.EMF_LIB : width, height = _get_emf_dimensions( fin ) # if user specified height or width but not both, then # scale unspecified dimension to maintain aspect ratio if ('width' in kwargs) and ('height' not in kwargs): height = int(height * float(kwargs['width'])/width) elif ('height' in kwargs) and ('width' not in kwargs): width = int(width * float(kwargs['height'])/height) width = kwargs.pop('width',width) height = kwargs.pop('height', height) codes = [ pict_type, 'picwgoal%s' % (width * 20), 'pichgoal%s' % (height * 20) ] # let user specify global scaling scale = kwargs.pop('scale',100) for kwarg, code, default in [ ( 'scale_x', 'scalex', scale ), ( 'scale_y', 'scaley', scale ), ( 'crop_left', 'cropl', '0' ), ( 'crop_right', 'cropr', '0' ), ( 'crop_top', 'cropt', '0' ), ( 'crop_bottom', 'cropb', '0' ) ] : codes.append( 'pic%s%s' % ( code, kwargs.pop( kwarg, default ) ) ) # reset back to the start of the file to get all of it and now # turn it into hex. fin.seek( 0, 0 ) image = hexlify( fin.read() ) fin.close() data = [] for i in range( 0, len( image ), 128 ) : data.append( image[ i : i + 128 ] ) data = r'{\pict{\%s}%s}' % ( '\\'.join( codes ), '\n'.join( data ) ) RawCode.__init__( self, data ) def ToRawCode( self, var_name ) : return '%s = RawCode( """%s""" )' % ( var_name, self.Data ) class Text : def __init__( self, *params ) : self.Data = None self.Style = None self.Properties = None self.Shading = None for param in params : if isinstance( param, TextStyle ) : self.Style = param elif isinstance( param, TextPS ) : self.Properties = param elif isinstance( param, ShadingPS ) : self.Shading = param else : # otherwise let the rendering custom handler sort it out itself self.Data = param def SetData( self, value ) : self.Data = value class Inline( list ) : def __init__( self, *params ) : super( Inline, self ).__init__() self.Style = None self.Properties = None self.Shading = None self._append = super( Inline, self ).append for param in params : if isinstance( param, TextStyle ) : self.Style = param elif isinstance( param, TextPS ) : self.Properties = param elif isinstance( param, ShadingPS ) : self.Shading = param else : # otherwise we add to it to our list of elements and let # the rendering custom handler sort it out itself. self.append( param ) def append( self, *params ) : # filter out any that are explicitly None [ self._append( param ) for param in params if param is not None ] class Paragraph( list ) : def __init__( self, *params ) : super( Paragraph, self ).__init__() self.Style = None self.Properties = None self.Frame = None self.Shading = None self._append = super( Paragraph, self ).append for param in params : if isinstance( param, ParagraphStyle ) : self.Style = param elif isinstance( param, ParagraphPS ) : self.Properties = param elif isinstance( param, FramePS ) : self.Frame = param elif isinstance( param, ShadingPS ) : self.Shading = param else : # otherwise we add to it to our list of elements and let # the rendering custom handler sort it out itself. self.append( param ) def append( self, *params ) : # filter out any that are explicitly None [ self._append( param ) for param in params if param is not None ] def insert( self, index, value ) : if value is not None : super( Paragraph, self ).insert( index, value ) class Table : LEFT = 1 RIGHT = 2 CENTER = 3 ALIGNMENT = [ LEFT, RIGHT, CENTER ] NO_WRAPPING = 1 WRAP_AROUND = 2 WRAPPING = [ NO_WRAPPING, WRAP_AROUND ] # trrh height of row, 0 means automatically adjust, use negative for an absolute # trgaph is half of the space between a table cell in width, reduce this one # to get a really tiny column def __init__( self, *column_widths, **kwargs ) : self.Rows = [] self.SetAlignment ( kwargs.pop( 'alignment', self.LEFT ) ) self.SetLeftOffset ( kwargs.pop( 'left_offset', None ) ) self.SetGapBetweenCells( kwargs.pop( 'gap_between_cells', None ) ) self.SetColumnWidths ( *column_widths ) assert not kwargs, 'invalid keyword args %s' % kwargs def SetAlignment( self, value ) : assert value is None or value in self.ALIGNMENT self.Alignment = value or self.LEFT return self def SetLeftOffset( self, value ) : self.LeftOffset = value return self def SetGapBetweenCells( self, value ) : self.GapBetweenCells = value return self def SetColumnWidths( self, *column_widths ) : self.ColumnWidths = column_widths self.ColumnCount = len( column_widths ) return self def AddRow( self, *cells ) : height = None if isinstance( cells[ 0 ], (IntType, FloatType, LongType) ): height = int( cells[ 0 ] ) cells = cells[ 1 : ] # make sure all of the spans add up to the number of columns # otherwise the table will get corrupted if self.ColumnCount != sum( [ cell.Span for cell in cells ] ) : raise Exception( 'ColumnCount != the total of this row\'s cell.Spans.' ) self.Rows.append( ( height, cells ) ) append = AddRow class Cell( list ) : """ \clvertalt Text is top-aligned in cell (the default). \clvertalc Text is centered vertically in cell. \clvertalb Text is bottom-aligned in cell. \cltxlrtb Vertical text aligned left (direction bottom up). \cltxtbrl Vertical text aligned right (direction top down). """ ALIGN_TOP = 1 ALIGN_CENTER = 2 ALIGN_BOTTOM = 3 FLOW_LR_TB = 1 FLOW_RL_TB = 2 FLOW_LR_BT = 3 FLOW_VERTICAL_LR_TB = 4 FLOW_VERTICAL_TB_RL = 5 def __init__( self, *params, **kwargs ) : super( Cell, self ).__init__() self.SetFrame ( None ) self.SetMargins( None ) self.SetAlignment( kwargs.get( 'alignment', self.ALIGN_TOP ) ) self.SetFlow ( kwargs.get( 'flow' , self.FLOW_LR_TB ) ) self.SetSpan ( kwargs.get( 'span', 1 ) ) self.SetStartVerticalMerge( kwargs.get( 'start_vertical_merge', False ) ) self.SetVerticalMerge ( kwargs.get( 'vertical_merge', False ) ) self._append = super( Cell, self ).append for param in params : if isinstance( param, StringType ) : self.append ( param ) elif isinstance( param, Paragraph ) : self.append ( param ) elif isinstance( param, FramePS ) : self.SetFrame ( param ) elif isinstance( param, MarginsPS ) : self.SetMargins( param ) def SetFrame( self, value ) : self.Frame = value return self def SetMargins( self, value ) : self.Margins = value return self def SetAlignment( self, value ) : assert value in [ self.ALIGN_TOP, self.ALIGN_CENTER, self.ALIGN_BOTTOM ] #, self.ALIGN_TEXT_TOP_DOWN, self.ALIGN_TEXT_BOTTOM_UP ] self.Alignment = value def SetFlow( self, value ) : assert value in [ self.FLOW_LR_TB, self.FLOW_RL_TB, self.FLOW_LR_BT, self.FLOW_VERTICAL_LR_TB, self.FLOW_VERTICAL_TB_RL ] self.Flow = value def SetSpan( self, value ) : # must be a positive integer self.Span = int( max( value, 1 ) ) return self def SetStartVerticalMerge( self, value ) : self.StartVerticalMerge = False if value : self.StartVerticalMerge = True return self def SetVerticalMerge( self, value ) : self.VerticalMerge = False if value : self.VerticalMerge = True return self def append( self, *params ) : [ self._append( param ) for param in params ] class Document : def __init__( self, style_sheet=None, default_language=None, view_kind=None, view_zoom_kind=None, view_scale=None ) : self.StyleSheet = style_sheet or MakeDefaultStyleSheet() self.Sections = AttributedList( Section ) self.SetTitle( None ) self.DefaultLanguage = default_language or Languages.DEFAULT self.ViewKind = view_kind or ViewKind.DEFAULT self.ViewZoomKind = view_zoom_kind self.ViewScale = view_scale def NewSection( self, *params, **kwargs ) : result = Section( *params, **kwargs ) self.Sections.append( result ) return result def SetTitle( self, value ) : self.Title = value return self def Copy( self ) : result = Document( style_sheet = self.StyleSheet.Copy(), default_language = self.DefaultLanguage, view_kind = self.ViewKind, view_zoom_kind = self.ViewZoomKind, view_scale = self.ViewScale ) result.SetTitle( self.Title ) result.Sections = self.Sections.Copy() return result def TEXT( *params, **kwargs ) : text_props = TextPropertySet() text_props.SetFont ( kwargs.get( 'font', None ) ) text_props.SetSize ( kwargs.get( 'size', None ) ) text_props.SetBold ( kwargs.get( 'bold', False ) ) text_props.SetItalic ( kwargs.get( 'italic', False ) ) text_props.SetUnderline( kwargs.get( 'underline', False ) ) text_props.SetColour ( kwargs.get( 'colour', None ) ) if len( params ) == 1 : return Text( params[ 0 ], text_props ) result = Inline( text_props ) apply( result.append, params ) return result def B( *params ) : text_props = TextPropertySet( bold=True ) if len( params ) == 1 : return Text( params[ 0 ], text_props ) result = Inline( text_props ) apply( result.append, params ) return result def I( *params ) : text_props = TextPropertySet( italic=True ) if len( params ) == 1 : return Text( params[ 0 ], text_props ) result = Inline( text_props ) apply( result.append, params ) return result def U( *params ) : text_props = TextPropertySet( underline=True ) if len( params ) == 1 : return Text( params[ 0 ], text_props ) result = Inline( text_props ) apply( result.append, params ) return result ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/pyrtf/Renderer.py��������������������������������������������������0000664�0000000�0000000�00000062666�12564727262�020553� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������from types import StringType, ListType, TupleType from copy import deepcopy from Elements import * DEFAULT_TAB_WIDTH = 720 ParagraphAlignmentMap = { ParagraphPropertySet.LEFT : 'ql', ParagraphPropertySet.RIGHT : 'qr', ParagraphPropertySet.CENTER : 'qc', ParagraphPropertySet.JUSTIFY : 'qj', ParagraphPropertySet.DISTRIBUTE : 'qd' } TabAlignmentMap = { TabPropertySet.LEFT : '', TabPropertySet.RIGHT : 'tqr', TabPropertySet.CENTER : 'tqc', TabPropertySet.DECIMAL : 'tqdec' } TableAlignmentMap = { Table.LEFT : 'trql', Table.RIGHT : 'trqr', Table.CENTER : 'trqc' } CellAlignmentMap = { Cell.ALIGN_TOP : '', # clvertalt Cell.ALIGN_CENTER : 'clvertalc', Cell.ALIGN_BOTTOM : 'clvertalb' } CellFlowMap = { Cell.FLOW_LR_TB : '', # cltxlrtb, Text in a cell flows from left to right and top to bottom (default) Cell.FLOW_RL_TB : 'cltxtbrl', # Text in a cell flows right to left and top to bottom Cell.FLOW_LR_BT : 'cltxbtlr', # Text in a cell flows left to right and bottom to top Cell.FLOW_VERTICAL_LR_TB : 'cltxlrtbv', # Text in a cell flows left to right and top to bottom, vertical Cell.FLOW_VERTICAL_TB_RL : 'cltxtbrlv' } # Text in a cell flows top to bottom and right to left, vertical ShadingPatternMap = { ShadingPropertySet.HORIZONTAL : 'bghoriz', ShadingPropertySet.VERTICAL : 'bgvert', ShadingPropertySet.FORWARD_DIAGONAL : 'bgfdiag', ShadingPropertySet.BACKWARD_DIAGONAL : 'bgbdiag', ShadingPropertySet.VERTICAL_CROSS : 'bgcross', ShadingPropertySet.DIAGONAL_CROSS : 'bgdcross', ShadingPropertySet.DARK_HORIZONTAL : 'bgdkhoriz', ShadingPropertySet.DARK_VERTICAL : 'bgdkvert', ShadingPropertySet.DARK_FORWARD_DIAGONAL : 'bgdkfdiag', ShadingPropertySet.DARK_BACKWARD_DIAGONAL : 'bgdkbdiag', ShadingPropertySet.DARK_VERTICAL_CROSS : 'bgdkcross', ShadingPropertySet.DARK_DIAGONAL_CROSS : 'bgdkdcross' } TabLeaderMap = { TabPropertySet.DOTS : 'tldot', TabPropertySet.HYPHENS : 'tlhyph', TabPropertySet.UNDERLINE : 'tlul', TabPropertySet.THICK_LINE : 'tlth', TabPropertySet.EQUAL_SIGN : 'tleq' } BorderStyleMap = { BorderPropertySet.SINGLE : 'brdrs', BorderPropertySet.DOUBLE : 'brdrth', BorderPropertySet.SHADOWED : 'brdrsh', BorderPropertySet.DOUBLED : 'brdrdb', BorderPropertySet.DOTTED : 'brdrdot', BorderPropertySet.DASHED : 'brdrdash', BorderPropertySet.HAIRLINE : 'brdrhair' } SectionBreakTypeMap = { Section.NONE : 'sbknone', Section.COLUMN : 'sbkcol', Section.PAGE : 'sbkpage', Section.EVEN : 'sbkeven', Section.ODD : 'sbkodd' } class Settings( list ) : def __init__( self ) : super( Settings, self ).__init__() self._append = super( Settings, self ).append def append( self, value, mask=None, fallback=None ) : if (value is not 0) and value in [ False, None, '' ] : if fallback : self._append( self, fallback ) else : if mask : if value is True : value = mask else : value = mask % value self._append( value ) def Join( self ) : if self : return r'\%s' % '\\'.join( self ) return '' def __repr__( self ) : return self.Join() class Renderer : def __init__( self, write_custom_element_callback=None ) : self.character_style_map = {} self.paragraph_style_map = {} self.WriteCustomElement = write_custom_element_callback # # All of the Rend* Functions populate a Settings object with values # def _RendPageProperties( self, section, settings, in_section ) : # this one is different from the others as it takes the settings from a if in_section : #paper_size_code = 'psz%s' paper_width_code = 'pgwsxn%s' paper_height_code = 'pghsxn%s' landscape = 'lndscpsxn' margin_suffix = 'sxn' else : #paper_size_code = 'psz%s' paper_width_code = 'paperw%s' paper_height_code = 'paperh%s' landscape = 'landscape' margin_suffix = '' #settings.append( section.Paper.Code, paper_size_code ) settings.append( section.Paper.Width, paper_width_code ) settings.append( section.Paper.Height, paper_height_code ) if section.Landscape : settings.append( landscape ) if section.FirstPageNumber : settings.append( section.FirstPageNumber, 'pgnstarts%s' ) settings.append( 'pgnrestart' ) self._RendMarginsPropertySet( section.Margins, settings, margin_suffix ) def _RendShadingPropertySet( self, shading_props, settings, prefix='' ) : if not shading_props : return settings.append( shading_props.Shading, prefix + 'shading%s' ) settings.append( ShadingPatternMap.get( shading_props.Pattern, False ) ) settings.append( self._colour_map.get( shading_props.Foreground, False ), prefix + 'cfpat%s' ) settings.append( self._colour_map.get( shading_props.Background, False ), prefix + 'cbpat%s' ) def _RendBorderPropertySet( self, edge_props, settings ) : settings.append( BorderStyleMap[ edge_props.Style ] ) settings.append( edge_props.Width , 'brdrw%s' ) settings.append( self._colour_map.get( edge_props.Colour, False ), 'brdrcf%s' ) settings.append( edge_props.Spacing or False , 'brsp%s' ) def _RendFramePropertySet( self, frame_props, settings, tag_prefix='' ) : if not frame_props : return if frame_props.Top : settings.append( tag_prefix + 'brdrt' ) self._RendBorderPropertySet( frame_props.Top, settings ) if frame_props.Left : settings.append( tag_prefix + 'brdrl' ) self._RendBorderPropertySet( frame_props.Left, settings ) if frame_props.Bottom : settings.append( tag_prefix + 'brdrb' ) self._RendBorderPropertySet( frame_props.Bottom, settings ) if frame_props.Right : settings.append( tag_prefix + 'brdrr' ) self._RendBorderPropertySet( frame_props.Right, settings ) def _RendMarginsPropertySet( self, margin_props, settings, suffix='' ) : if not margin_props : return settings.append( margin_props.Top, 'margt' + suffix + '%s' ) settings.append( margin_props.Left, 'margl' + suffix + '%s' ) settings.append( margin_props.Bottom, 'margb' + suffix + '%s' ) settings.append( margin_props.Right, 'margr' + suffix + '%s' ) def _RendParagraphPropertySet( self, paragraph_props, settings ) : if not paragraph_props : return settings.append( ParagraphAlignmentMap[ paragraph_props.Alignment ] ) settings.append( paragraph_props.SpaceBefore, 'sb%s' ) settings.append( paragraph_props.SpaceAfter, 'sa%s' ) # then we have to find out all of the tabs width = 0 for tab in paragraph_props.Tabs : settings.append( TabAlignmentMap[ tab.Alignment ] ) settings.append( TabLeaderMap.get( tab.Leader, '' ) ) width += tab.Width or DEFAULT_TAB_WIDTH settings.append( 'tx%s' % width ) settings.append( paragraph_props.PageBreakBefore, 'pagebb' ) settings.append( paragraph_props.FirstLineIndent, 'fi%s' ) settings.append( paragraph_props.LeftIndent, 'li%s' ) settings.append( paragraph_props.RightIndent, 'ri%s' ) if paragraph_props.SpaceBetweenLines : if paragraph_props.SpaceBetweenLines < 0 : settings.append( paragraph_props.SpaceBetweenLines, r'sl%s\slmult0' ) else : settings.append( paragraph_props.SpaceBetweenLines, r'sl%s\slmult1' ) def _RendTextPropertySet( self, text_props, settings ) : if not text_props : return if text_props.Expansion : settings.append( text_props.Expansion, 'expndtw%s' ) settings.append( text_props.Bold, 'b' ) settings.append( text_props.Italic, 'i' ) settings.append( text_props.Underline, 'ul' ) settings.append( text_props.DottedUnderline, 'uld' ) settings.append( text_props.DoubleUnderline, 'uldb' ) settings.append( text_props.WordUnderline, 'ulw' ) settings.append( self._font_map.get( text_props.Font, False ), 'f%s' ) settings.append( text_props.Size, 'fs%s' ) settings.append( self._colour_map.get( text_props.Colour, False ), 'cf%s' ) if text_props.Frame : frame = text_props.Frame settings.append( 'chbrdr' ) settings.append( BorderStyleMap[ frame.Style ] ) settings.append( frame.Width , 'brdrw%s' ) settings.append( self._colour_map.get( frame.Colour, False ), 'brdrcf%s' ) # # All of the Write* functions will write to the internal file object # # the _ ones probably don't need to be used by anybody outside # but the other ones like WriteTextElement could be used in the Custom # callback. def Write( self, document, fout ) : # write all of the standard stuff based upon the first document self._doc = document self._fout = fout self._WriteDocument () self._WriteColours () self._WriteFonts () self._WriteStyleSheet() settings = Settings() self._RendPageProperties( self._doc.Sections[ 0 ], settings, in_section=False ) self._write( repr( settings ) ) # handle the simplest case first, we don't need to do anymore mucking around # with section headers, etc we can just rip the document out if len( document.Sections ) == 1 : self._WriteSection( document.Sections[ 0 ], is_first = True, add_header = False ) else : for section_idx, section in enumerate( document.Sections ) : is_first = section_idx == 0 add_header = True self._WriteSection( section, is_first, add_header ) self._write( '}' ) del self._fout, self._doc, self._CurrentStyle def _write( self, data, *params ) : #---------------------------------- # begin modification # by Herbert Weinhandl # to convert accented characters # to their rtf-compatible form #for c in range( 128, 256 ) : # data = data.replace( chr(c), "\'%x" % c) # end modification # # This isn't the right place for this as it is going to do # this loop for all sorts of writes, including settings, control codes, etc. # # I will create a def _WriteText (or something) method that is used when the # actual string that is to be viewed in the document is written, this can then # do the final accented character check. # # I left it here so that I remember to do the right thing when I have time #---------------------------------- if params : data = data % params self._fout.write( data ) def _WriteDocument( self ) : settings = Settings() assert Languages.IsValid ( self._doc.DefaultLanguage ) assert ViewKind.IsValid ( self._doc.ViewKind ) assert ViewZoomKind.IsValid( self._doc.ViewZoomKind ) assert ViewScale.IsValid ( self._doc.ViewScale ) settings.append( self._doc.DefaultLanguage, 'deflang%s' ) settings.append( self._doc.ViewKind , 'viewkind%s' ) settings.append( self._doc.ViewZoomKind , 'viewzk%s' ) settings.append( self._doc.ViewScale , 'viewscale%s' ) self._write( "{\\rtf1\\ansi\\ansicpg1252\\deff0%s\n" % settings ) def _WriteColours( self ) : self._write( r"{\colortbl ;" ) self._colour_map = {} offset = 0 for colour in self._doc.StyleSheet.Colours : self._write( r'\red%s\green%s\blue%s;', colour.Red, colour.Green, colour.Blue ) self._colour_map[ colour ] = offset + 1 offset += 1 self._write( "}\n" ) def _WriteFonts( self ) : self._write( r'{\fonttbl' ) self._font_map = {} offset = 0 for font in self._doc.StyleSheet.Fonts : pitch = '' panose = '' alternate = '' if font.Pitch : pitch = r'\fprq%s' % font.Pitch if font.Panose : panose = r'{\*\panose %s}' % font.Panose if font.Alternate : alternate = r'{\*\falt %s}' % font.Alternate.Name self._write( r'{\f%s\f%s%s\fcharset%s%s %s%s;}', offset, font.Family, pitch, font.CharacterSet, panose, font.Name, alternate ) self._font_map[ font ] = offset offset += 1 self._write( "}\n" ) def _WriteStyleSheet( self ) : self._write( r"{\stylesheet" ) # TO DO: character styles, does anybody actually use them? offset_map = {} for idx, style in enumerate( self._doc.StyleSheet.ParagraphStyles ) : offset_map[ style ] = idx # paragraph styles self.paragraph_style_map = {} for idx, style in enumerate( self._doc.StyleSheet.ParagraphStyles ) : if idx == 0 : default = style else : self._write( '\n' ) settings = Settings() # paragraph properties self._RendParagraphPropertySet( style.ParagraphPropertySet, settings ) self._RendFramePropertySet ( style.FramePropertySet, settings ) self._RendShadingPropertySet ( style.ShadingPropertySet, settings ) # text properties self._RendTextPropertySet ( style.TextStyle.TextPropertySet, settings ) self._RendShadingPropertySet( style.TextStyle.ShadingPropertySet, settings ) # have to take based_on = '\\sbasedon%s' % offset_map.get( style.BasedOn, 0 ) next = '\\snext%s' % offset_map.get( style.Next, 0 ) inln = '\\s%s%s' % ( idx, settings ) self._write( "{%s%s%s %s;}", inln, based_on, next, style.Name ) self.paragraph_style_map[ style ] = inln # if now style is specified for the first paragraph to be written, this one # will be used self._CurrentStyle = self.paragraph_style_map[ default ] self._write( "}\n" ) def _WriteSection( self, section, is_first, add_header ) : def WriteHF( hf, rtfword ) : #if not hf : return # if we don't have anything in the header/footer then include # a blank paragraph, this stops it from picking up the header/footer # from the previous section # if not hf : hf = [ Paragraph( '' ) ] if not hf : hf = [] self._write( '{\\%s' % rtfword ) self._WriteElements( hf ) self._write( '}\n' ) settings = Settings() if not is_first : # we need to finish off the preceding section # and reset all of our defaults back to standard settings.append( 'sect' ) # reset to our defaults settings.append( 'sectd' ) if add_header : settings.append( SectionBreakTypeMap[ section.BreakType ] ) self._RendPageProperties( section, settings, in_section=True ) settings.append( section.HeaderY, 'headery%s' ) settings.append( section.FooterY, 'footery%s' ) # write all of these out now as we need to do a write elements in the # next section self._write( repr( settings ) ) # finally after all that has settled down we can do the # headers and footers if section.FirstHeader or section.FirstFooter : # include the titlepg flag if the first page has a special format self._write( r'\titlepg' ) WriteHF( section.FirstHeader, 'headerf' ) WriteHF( section.FirstFooter, 'footerf' ) WriteHF( section.Header, 'header' ) WriteHF( section.Footer, 'footer' ) # and at last the contents of the section that actually appear on the page self._WriteElements( section ) def _WriteElements( self, elements ) : new_line = '' for element in elements : self._write( new_line ) new_line = '\n' clss = element.__class__ if clss == Paragraph : self.WriteParagraphElement( element ) elif clss == Table : self.WriteTableElement( element ) elif clss == StringType : self.WriteParagraphElement( Paragraph( element ) ) elif clss in [ RawCode, Image ] : self.WriteRawCode( element ) #elif clss == List : # self._HandleListElement( element ) elif self.WriteCustomElement : self.WriteCustomElement( self, element ) else : raise Exception( "Don't know how to handle elements of type %s" % clss ) def WriteParagraphElement( self, paragraph_elem, tag_prefix='', tag_suffix=r'\par', opening='{', closing='}' ) : # the tag_prefix and the tag_suffix take care of paragraphs in tables. A # paragraph in a table requires and extra tag at the front (intbl) and we # don't want the ending tag everytime. We want it for all paragraphs but # the last. overrides = Settings() self._RendParagraphPropertySet( paragraph_elem.Properties, overrides ) self._RendFramePropertySet ( paragraph_elem.Frame, overrides ) self._RendShadingPropertySet ( paragraph_elem.Shading, overrides ) # when writing the RTF the style is carried from the previous paragraph to the next, # so if the currently written paragraph has a style then make it the current one, # otherwise leave it as it was self._CurrentStyle = self.paragraph_style_map.get( paragraph_elem.Style, self._CurrentStyle ) self._write( r'%s\pard\plain%s %s%s ' % ( opening, tag_prefix, self._CurrentStyle, overrides ) ) for element in paragraph_elem : if isinstance( element, StringType ) : self._write( element ) elif isinstance( element, RawCode ) : self._write( element.Data ) elif isinstance( element, Text ) : self.WriteTextElement( element ) elif isinstance( element, Inline ) : self.WriteInlineElement( element ) elif element == TAB : self._write( r'\tab ' ) elif element == LINE : self._write( r'\line ' ) elif self.WriteCustomElement : self.WriteCustomElement( self, element ) else : raise Exception( 'Don\'t know how to handle %s' % element ) self._write( tag_suffix + closing ) def WriteRawCode( self, raw_elem ) : self._write( raw_elem.Data ) def WriteTextElement( self, text_elem ) : overrides = Settings() self._RendTextPropertySet ( text_elem.Properties, overrides ) self._RendShadingPropertySet( text_elem.Shading, overrides, 'ch' ) # write the wrapper and then let the custom handler have a go if overrides : self._write( '{%s ' % repr( overrides ) ) # if the data is just a string then we can now write it if isinstance( text_elem.Data, StringType ) : self._write( text_elem.Data or '' ) elif text_elem.Data == TAB : self._write( r'\tab ' ) else : self.WriteCustomElement( self, text_elem.Data ) if overrides : self._write( '}' ) def WriteInlineElement( self, inline_elem ) : overrides = Settings() self._RendTextPropertySet ( inline_elem.Properties, overrides ) self._RendShadingPropertySet( inline_elem.Shading, overrides, 'ch' ) # write the wrapper and then let the custom handler have a go if overrides : self._write( '{%s ' % repr( overrides ) ) for element in inline_elem : # if the data is just a string then we can now write it if isinstance( element, StringType ) : self._write( element ) elif isinstance( element, RawCode ) : self._write( element.Data ) elif element == TAB : self._write( r'\tab ' ) elif element == LINE : self._write( r'\line ' ) else : self.WriteCustomElement( self, element ) if overrides : self._write( '}' ) def WriteText( self, text ) : self._write( text or '' ) def WriteTableElement( self, table_elem ) : vmerge = [ False ] * table_elem.ColumnCount for height, cells in table_elem.Rows : # calculate the right hand edge of the cells taking into account the spans offset = table_elem.LeftOffset or 0 cellx = [] cell_idx = 0 for cell in cells : cellx.append( offset + sum( table_elem.ColumnWidths[ : cell_idx + cell.Span ] ) ) cell_idx += cell.Span self._write( r'{\trowd' ) settings = Settings() # the spec says that this value is mandatory and I think that 108 is the default value # so I'll take care of it here settings.append( table_elem.GapBetweenCells or 108, 'trgaph%s' ) settings.append( TableAlignmentMap[ table_elem.Alignment ] ) settings.append( height, 'trrh%s' ) settings.append( table_elem.LeftOffset, 'trleft%s' ) width = table_elem.LeftOffset or 0 for idx, cell in enumerate( cells ) : self._RendFramePropertySet ( cell.Frame, settings, 'cl' ) # cells don't have margins so I don't know why I was doing this # I think it might have an affect in some versions of some WPs. #self._RendMarginsPropertySet( cell.Margins, settings, 'cl' ) # if we are starting to merge or if this one is the first in what is # probably a series of merges then start the vertical merging if cell.StartVerticalMerge or (cell.VerticalMerge and not vmerge[ idx ]) : settings.append( 'clvmgf' ) vmerge[ idx ] = True elif cell.VerticalMerge : #..continuing a merge settings.append( 'clvmrg' ) else : #..no merging going on so make sure that it is off vmerge[ idx ] = False # for any cell in the next row that is covered by this span we # need to run off the vertical merging as we don't want them # merging up into this spanned cell for vmerge_idx in range( idx + 1, idx + cell.Span - 1 ) : vmerge[ vmerge_idx ] = False settings.append( CellAlignmentMap[ cell.Alignment ] ) settings.append( CellFlowMap[ cell.Flow ] ) # this terminates the definition of a cell and represents the right most edge of the cell from the left margin settings.append( cellx[ idx ], 'cellx%s' ) self._write( repr( settings ) ) for cell in cells : if len( cell ) : last_idx = len( cell ) - 1 for element_idx, element in enumerate( cell ) : # wrap plain strings in paragraph tags if isinstance( element, StringType ) : element = Paragraph( element ) # don't forget the prefix or else word crashes and does all sorts of strange things if element_idx == last_idx : self.WriteParagraphElement( element, tag_prefix=r'\intbl', tag_suffix='', opening='', closing='' ) else : self.WriteParagraphElement( element, tag_prefix=r'\intbl', opening='', closing='' ) self._write( r'\cell' ) else : self._write( r'\pard\intbl\cell' ) self._write( '\\row}\n' ) ��������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/pyrtf/README�������������������������������������������������������0000664�0000000�0000000�00000000447�12564727262�017300� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Version 0.46 Added EMF support. Added more sophisticated scaling options. See examples2.py for both. Grant Edwards, grante@users.sourceforge.net Version 0.45 Finally, image support!!! Handles PNGs and JPGs. See examples2.py for the gory details. Simon Cusack, scusack@sourceforge.net �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/pam.py�������������������������������������������������������������0000664�0000000�0000000�00000007232�12564727262�016402� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# (c) 2007 Chris AtLee <chris@atlee.ca> # Licensed under the MIT license: # http://www.opensource.org/licenses/mit-license.php """ PAM module for python Provides an authenticate function that will allow the caller to authenticate a user against the Pluggable Authentication Modules (PAM) on the system. Implemented using ctypes, so no compilation is necessary. """ __all__ = ['authenticate'] from ctypes import CDLL, POINTER, Structure, CFUNCTYPE, cast, pointer, sizeof from ctypes import c_void_p, c_uint, c_char_p, c_char, c_int from ctypes.util import find_library LIBPAM = CDLL(find_library("pam")) LIBC = CDLL(find_library("c")) CALLOC = LIBC.calloc CALLOC.restype = c_void_p CALLOC.argtypes = [c_uint, c_uint] STRDUP = LIBC.strdup STRDUP.argstypes = [c_char_p] STRDUP.restype = POINTER(c_char) # NOT c_char_p !!!! # Various constants PAM_PROMPT_ECHO_OFF = 1 PAM_PROMPT_ECHO_ON = 2 PAM_ERROR_MSG = 3 PAM_TEXT_INFO = 4 class PamHandle(Structure): """wrapper class for pam_handle_t""" _fields_ = [ ("handle", c_void_p) ] def __init__(self): Structure.__init__(self) self.handle = 0 class PamMessage(Structure): """wrapper class for pam_message structure""" _fields_ = [ ("msg_style", c_int), ("msg", c_char_p), ] def __repr__(self): return "<PamMessage %i '%s'>" % (self.msg_style, self.msg) class PamResponse(Structure): """wrapper class for pam_response structure""" _fields_ = [ ("resp", c_char_p), ("resp_retcode", c_int), ] def __repr__(self): return "<PamResponse %i '%s'>" % (self.resp_retcode, self.resp) CONV_FUNC = CFUNCTYPE(c_int, c_int, POINTER(POINTER(PamMessage)), POINTER(POINTER(PamResponse)), c_void_p) class PamConv(Structure): """wrapper class for pam_conv structure""" _fields_ = [ ("conv", CONV_FUNC), ("appdata_ptr", c_void_p) ] PAM_START = LIBPAM.pam_start PAM_START.restype = c_int PAM_START.argtypes = [c_char_p, c_char_p, POINTER(PamConv), POINTER(PamHandle)] PAM_AUTHENTICATE = LIBPAM.pam_authenticate PAM_AUTHENTICATE.restype = c_int PAM_AUTHENTICATE.argtypes = [PamHandle, c_int] def authenticate(username, password, service='login'): """Returns True if the given username and password authenticate for the given service. Returns False otherwise ``username``: the username to authenticate ``password``: the password in plain text ``service``: the PAM service to authenticate against. Defaults to 'login'""" @CONV_FUNC def my_conv(n_messages, messages, p_response, app_data): """Simple conversation function that responds to any prompt where the echo is off with the supplied password""" # Create an array of n_messages response objects addr = CALLOC(n_messages, sizeof(PamResponse)) p_response[0] = cast(addr, POINTER(PamResponse)) for i in range(n_messages): if messages[i].contents.msg_style == PAM_PROMPT_ECHO_OFF: pw_copy = STRDUP(str(password)) p_response.contents[i].resp = cast(pw_copy, c_char_p) p_response.contents[i].resp_retcode = 0 return 0 handle = PamHandle() conv = PamConv(my_conv, 0) retval = PAM_START(service, username, pointer(conv), pointer(handle)) if retval != 0: # TODO: This is not an authentication error, something # has gone wrong starting up PAM return False retval = PAM_AUTHENTICATE(handle, 0) return retval == 0 if __name__ == "__main__": import getpass print authenticate(getpass.getuser(), getpass.getpass()) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/memdb.py�����������������������������������������������������������0000664�0000000�0000000�00000067543�12564727262�016724� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # -*- coding: utf-8 -*- """ This file is part of web2py Web Framework (Copyrighted, 2007-2009). Developed by Massimo Di Pierro <mdipierro@cs.depaul.edu> and Robin B <robi123@gmail.com>. License: LGPLv3 """ __all__ = ['MEMDB', 'Field'] import re import sys import os import types import datetime import thread import cStringIO import csv import copy import gluon.validators as validators from gluon.utils import web2py_uuid from gluon.storage import Storage from gluon import SQLTABLE import random SQL_DIALECTS = {'memcache': { 'boolean': bool, 'string': unicode, 'text': unicode, 'password': unicode, 'blob': unicode, 'upload': unicode, 'integer': long, 'double': float, 'date': datetime.date, 'time': datetime.time, 'datetime': datetime.datetime, 'id': int, 'reference': int, 'lower': None, 'upper': None, 'is null': 'IS NULL', 'is not null': 'IS NOT NULL', 'extract': None, 'left join': None, }} def cleanup(text): if re.compile('[^0-9a-zA-Z_]').findall(text): raise SyntaxError('Can\'t cleanup \'%s\': only [0-9a-zA-Z_] allowed in table and field names' % text) return text def assert_filter_fields(*fields): for field in fields: if isinstance(field, (Field, Expression)) and field.type\ in ['text', 'blob']: raise SyntaxError('AppEngine does not index by: %s' % field.type) def dateobj_to_datetime(object): # convert dates,times to datetimes for AppEngine if isinstance(object, datetime.date): object = datetime.datetime(object.year, object.month, object.day) if isinstance(object, datetime.time): object = datetime.datetime( 1970, 1, 1, object.hour, object.minute, object.second, object.microsecond, ) return object def sqlhtml_validators(field_type, length): v = { 'boolean': [], 'string': validators.IS_LENGTH(length), 'text': [], 'password': validators.IS_LENGTH(length), 'blob': [], 'upload': [], 'double': validators.IS_FLOAT_IN_RANGE(-1e100, 1e100), 'integer': validators.IS_INT_IN_RANGE(-1e100, 1e100), 'date': validators.IS_DATE(), 'time': validators.IS_TIME(), 'datetime': validators.IS_DATETIME(), 'reference': validators.IS_INT_IN_RANGE(0, 1e100), } try: return v[field_type[:9]] except KeyError: return [] class DALStorage(dict): """ a dictionary that let you do d['a'] as well as d.a """ def __getattr__(self, key): return self[key] def __setattr__(self, key, value): if key in self: raise SyntaxError( 'Object \'%s\'exists and cannot be redefined' % key) self[key] = value def __repr__(self): return '<DALStorage ' + dict.__repr__(self) + '>' class SQLCallableList(list): def __call__(self): return copy.copy(self) class MEMDB(DALStorage): """ an instance of this class represents a database connection Example:: db=MEMDB(Client()) db.define_table('tablename',Field('fieldname1'), Field('fieldname2')) """ def __init__(self, client): self._dbname = 'memdb' self['_lastsql'] = '' self.tables = SQLCallableList() self._translator = SQL_DIALECTS['memcache'] self.client = client def define_table( self, tablename, *fields, **args ): tablename = cleanup(tablename) if tablename in dir(self) or tablename[0] == '_': raise SyntaxError('invalid table name: %s' % tablename) if not tablename in self.tables: self.tables.append(tablename) else: raise SyntaxError('table already defined: %s' % tablename) t = self[tablename] = Table(self, tablename, *fields) t._create() return t def __call__(self, where=''): return Set(self, where) class SQLALL(object): def __init__(self, table): self.table = table class Table(DALStorage): """ an instance of this class represents a database table Example:: db=MEMDB(Client()) db.define_table('users',Field('name')) db.users.insert(name='me') """ def __init__( self, db, tablename, *fields ): self._db = db self._tablename = tablename self.fields = SQLCallableList() self._referenced_by = [] fields = list(fields) fields.insert(0, Field('id', 'id')) for field in fields: self.fields.append(field.name) self[field.name] = field field._tablename = self._tablename field._table = self field._db = self._db self.ALL = SQLALL(self) def _create(self): fields = [] myfields = {} for k in self.fields: field = self[k] attr = {} if not field.type[:9] in ['id', 'reference']: if field.notnull: attr = dict(required=True) if field.type[:2] == 'id': continue if field.type[:9] == 'reference': referenced = field.type[10:].strip() if not referenced: raise SyntaxError('Table %s: reference \'%s\' to nothing!' % ( self._tablename, k)) if not referenced in self._db: raise SyntaxError( 'Table: table %s does not exist' % referenced) referee = self._db[referenced] ftype = \ self._db._translator[field.type[:9]]( self._db[referenced]._tableobj) if self._tablename in referee.fields: # ## THIS IS OK raise SyntaxError('Field: table \'%s\' has same name as a field ' 'in referenced table \'%s\'' % ( self._tablename, referenced)) self._db[referenced]._referenced_by.append((self._tablename, field.name)) elif not field.type in self._db._translator\ or not self._db._translator[field.type]: raise SyntaxError('Field: unknown field type %s' % field.type) self._tableobj = self._db.client return None def create(self): # nothing to do, here for backward compatility pass def drop(self): # nothing to do, here for backward compatibility self._db(self.id > 0).delete() def insert(self, **fields): # Checks 3 times that the id is new. 3 times is enough! for i in range(3): id = self._create_id() if self.get(id) is None and self.update(id, **fields): return long(id) else: raise RuntimeError("Too many ID conflicts") def get(self, id): val = self._tableobj.get(self._id_to_key(id)) if val: return Storage(val) else: return None def update(self, id, **fields): for field in fields: if not field in fields and self[field].default\ is not None: fields[field] = self[field].default if field in fields: fields[field] = obj_represent(fields[field], self[field].type, self._db) return self._tableobj.set(self._id_to_key(id), fields) def delete(self, id): return self._tableobj.delete(self._id_to_key(id)) def _id_to_key(self, id): return '__memdb__/t/%s/k/%s' % (self._tablename, str(id)) def _create_id(self): return long(web2py_uuid().replace('-',''),16) def __str__(self): return self._tablename def __call__(self, id, **kwargs): record = self.get(id) if record is None: return None if kwargs and any(record[key]!=kwargs[key] for key in kwargs): return None return record class Expression(object): def __init__( self, name, type='string', db=None, ): (self.name, self.type, self._db) = (name, type, db) def __str__(self): return self.name def __or__(self, other): # for use in sortby assert_filter_fields(self, other) return Expression(self.name + '|' + other.name, None, None) def __invert__(self): assert_filter_fields(self) return Expression('-' + self.name, self.type, None) # for use in Query def __eq__(self, value): return Query(self, '=', value) def __ne__(self, value): return Query(self, '!=', value) def __lt__(self, value): return Query(self, '<', value) def __le__(self, value): return Query(self, '<=', value) def __gt__(self, value): return Query(self, '>', value) def __ge__(self, value): return Query(self, '>=', value) # def like(self,value): return Query(self,' LIKE ',value) # def belongs(self,value): return Query(self,' IN ',value) # for use in both Query and sortby def __add__(self, other): return Expression('%s+%s' % (self, other), 'float', None) def __sub__(self, other): return Expression('%s-%s' % (self, other), 'float', None) def __mul__(self, other): return Expression('%s*%s' % (self, other), 'float', None) def __div__(self, other): return Expression('%s/%s' % (self, other), 'float', None) class Field(Expression): """ an instance of this class represents a database field example:: a = Field(name, 'string', length=32, required=False, default=None, requires=IS_NOT_EMPTY(), notnull=False, unique=False, uploadfield=True) to be used as argument of GQLDB.define_table allowed field types: string, boolean, integer, double, text, blob, date, time, datetime, upload, password strings must have a length or 512 by default. fields should have a default or they will be required in SQLFORMs the requires argument are used to validate the field input in SQLFORMs """ def __init__( self, fieldname, type='string', length=None, default=None, required=False, requires=sqlhtml_validators, ondelete='CASCADE', notnull=False, unique=False, uploadfield=True, ): self.name = cleanup(fieldname) if fieldname in dir(Table) or fieldname[0] == '_': raise SyntaxError('Field: invalid field name: %s' % fieldname) if isinstance(type, Table): type = 'reference ' + type._tablename if not length: length = 512 self.type = type # 'string', 'integer' self.length = length # the length of the string self.default = default # default value for field self.required = required # is this field required self.ondelete = ondelete.upper() # this is for reference fields only self.notnull = notnull self.unique = unique self.uploadfield = uploadfield if requires == sqlhtml_validators: requires = sqlhtml_validators(type, length) elif requires is None: requires = [] self.requires = requires # list of validators def formatter(self, value): if value is None or not self.requires: return value if not isinstance(self.requires, (list, tuple)): requires = [self.requires] else: requires = copy.copy(self.requires) requires.reverse() for item in requires: if hasattr(item, 'formatter'): value = item.formatter(value) return value def __str__(self): return '%s.%s' % (self._tablename, self.name) MEMDB.Field = Field # ## required by gluon/globals.py session.connect def obj_represent(object, fieldtype, db): if object is not None: if fieldtype == 'date' and not isinstance(object, datetime.date): (y, m, d) = [int(x) for x in str(object).strip().split('-')] object = datetime.date(y, m, d) elif fieldtype == 'time' and not isinstance(object, datetime.time): time_items = [int(x) for x in str(object).strip().split(':')[:3]] if len(time_items) == 3: (h, mi, s) = time_items else: (h, mi, s) = time_items + [0] object = datetime.time(h, mi, s) elif fieldtype == 'datetime' and not isinstance(object, datetime.datetime): (y, m, d) = [int(x) for x in str(object)[:10].strip().split('-')] time_items = [int(x) for x in str(object)[11:].strip().split(':')[:3]] if len(time_items) == 3: (h, mi, s) = time_items else: (h, mi, s) = time_items + [0] object = datetime.datetime( y, m, d, h, mi, s, ) elif fieldtype == 'integer' and not isinstance(object, long): object = long(object) return object class QueryException: def __init__(self, **a): self.__dict__ = a class Query(object): """ A query object necessary to define a set. It can be stored or can be passed to GQLDB.__call__() to obtain a Set Example: query=db.users.name=='Max' set=db(query) records=set.select() """ def __init__( self, left, op=None, right=None, ): if isinstance(right, (Field, Expression)): raise SyntaxError( 'Query: right side of filter must be a value or entity') if isinstance(left, Field) and left.name == 'id': if op == '=': self.get_one = QueryException( tablename=left._tablename, id=long(right or 0)) return else: raise SyntaxError('only equality by id is supported') raise SyntaxError('not supported') def __str__(self): return str(self.left) class Set(object): """ As Set represents a set of records in the database, the records are identified by the where=Query(...) object. normally the Set is generated by GQLDB.__call__(Query(...)) given a set, for example set=db(db.users.name=='Max') you can: set.update(db.users.name='Massimo') set.delete() # all elements in the set set.select(orderby=db.users.id,groupby=db.users.name,limitby=(0,10)) and take subsets: subset=set(db.users.id<5) """ def __init__(self, db, where=None): self._db = db self._tables = [] self.filters = [] if hasattr(where, 'get_all'): self.where = where self._tables.insert(0, where.get_all) elif hasattr(where, 'get_one') and isinstance(where.get_one, QueryException): self.where = where.get_one else: # find out which tables are involved if isinstance(where, Query): self.filters = where.left self.where = where self._tables = [field._tablename for (field, op, val) in self.filters] def __call__(self, where): if isinstance(self.where, QueryException) or isinstance(where, QueryException): raise SyntaxError('neither self.where nor where can be a QueryException instance') if self.where: return Set(self._db, self.where & where) else: return Set(self._db, where) def _get_table_or_raise(self): tablenames = list(set(self._tables)) # unique if len(tablenames) < 1: raise SyntaxError('Set: no tables selected') if len(tablenames) > 1: raise SyntaxError('Set: no join in appengine') return self._db[tablenames[0]]._tableobj def _getitem_exception(self): (tablename, id) = (self.where.tablename, self.where.id) fields = self._db[tablename].fields self.colnames = ['%s.%s' % (tablename, t) for t in fields] item = self._db[tablename].get(id) return (item, fields, tablename, id) def _select_except(self): (item, fields, tablename, id) = self._getitem_exception() if not item: return [] new_item = [] for t in fields: if t == 'id': new_item.append(long(id)) else: new_item.append(getattr(item, t)) r = [new_item] return Rows(self._db, r, *self.colnames) def select(self, *fields, **attributes): """ Always returns a Rows object, even if it may be empty """ if isinstance(self.where, QueryException): return self._select_except() else: raise SyntaxError('select arguments not supported') def count(self): return len(self.select()) def delete(self): if isinstance(self.where, QueryException): (item, fields, tablename, id) = self._getitem_exception() if not item: return self._db[tablename].delete(id) else: raise Exception('deletion not implemented') def update(self, **update_fields): if isinstance(self.where, QueryException): (item, fields, tablename, id) = self._getitem_exception() if not item: return for (key, value) in update_fields.items(): setattr(item, key, value) self._db[tablename].update(id, **item) else: raise Exception('update not implemented') def update_record( t, s, id, a, ): item = s.get(id) for (key, value) in a.items(): t[key] = value setattr(item, key, value) s.update(id, **item) class Rows(object): """ A wrapper for the return value of a select. It basically represents a table. It has an iterator and each row is represented as a dictionary. """ # ## this class still needs some work to care for ID/OID def __init__( self, db, response, *colnames ): self._db = db self.colnames = colnames self.response = response def __len__(self): return len(self.response) def __getitem__(self, i): if i >= len(self.response) or i < 0: raise SyntaxError('Rows: no such row: %i' % i) if len(self.response[0]) != len(self.colnames): raise SyntaxError('Rows: internal error') row = DALStorage() for j in xrange(len(self.colnames)): value = self.response[i][j] if isinstance(value, unicode): value = value.encode('utf-8') packed = self.colnames[j].split('.') try: (tablename, fieldname) = packed except: if not '_extra' in row: row['_extra'] = DALStorage() row['_extra'][self.colnames[j]] = value continue table = self._db[tablename] field = table[fieldname] if not tablename in row: row[tablename] = DALStorage() if field.type[:9] == 'reference': referee = field.type[10:].strip() rid = value row[tablename][fieldname] = rid elif field.type == 'boolean' and value is not None: # row[tablename][fieldname]=Set(self._db[referee].id==rid) if value == True or value == 'T': row[tablename][fieldname] = True else: row[tablename][fieldname] = False elif field.type == 'date' and value is not None\ and not isinstance(value, datetime.date): (y, m, d) = [int(x) for x in str(value).strip().split('-')] row[tablename][fieldname] = datetime.date(y, m, d) elif field.type == 'time' and value is not None\ and not isinstance(value, datetime.time): time_items = [int(x) for x in str(value).strip().split(':')[:3]] if len(time_items) == 3: (h, mi, s) = time_items else: (h, mi, s) = time_items + [0] row[tablename][fieldname] = datetime.time(h, mi, s) elif field.type == 'datetime' and value is not None\ and not isinstance(value, datetime.datetime): (y, m, d) = [int(x) for x in str(value)[:10].strip().split('-')] time_items = [int(x) for x in str(value)[11:].strip().split(':')[:3]] if len(time_items) == 3: (h, mi, s) = time_items else: (h, mi, s) = time_items + [0] row[tablename][fieldname] = datetime.datetime( y, m, d, h, mi, s, ) else: row[tablename][fieldname] = value if fieldname == 'id': id = row[tablename].id row[tablename].update_record = lambda t = row[tablename], \ s = self._db[tablename], id = id, **a: update_record(t, s, id, a) for (referee_table, referee_name) in \ table._referenced_by: s = self._db[referee_table][referee_name] row[tablename][referee_table] = Set(self._db, s == id) if len(row.keys()) == 1: return row[row.keys()[0]] return row def __iter__(self): """ iterator over records """ for i in xrange(len(self)): yield self[i] def __str__(self): """ serializes the table into a csv file """ s = cStringIO.StringIO() writer = csv.writer(s) writer.writerow(self.colnames) c = len(self.colnames) for i in xrange(len(self)): row = [self.response[i][j] for j in xrange(c)] for k in xrange(c): if isinstance(row[k], unicode): row[k] = row[k].encode('utf-8') writer.writerow(row) return s.getvalue() def xml(self): """ serializes the table using SQLTABLE (if present) """ return SQLTABLE(self).xml() def test_all(): """ How to run from web2py dir: export PYTHONPATH=.:YOUR_PLATFORMS_APPENGINE_PATH python gluon/contrib/memdb.py Setup the UTC timezone and database stubs >>> import os >>> os.environ['TZ'] = 'UTC' >>> import time >>> if hasattr(time, 'tzset'): ... time.tzset() >>> >>> from google.appengine.api import apiproxy_stub_map >>> from google.appengine.api.memcache import memcache_stub >>> apiproxy_stub_map.apiproxy = apiproxy_stub_map.APIProxyStubMap() >>> apiproxy_stub_map.apiproxy.RegisterStub('memcache', memcache_stub.MemcacheServiceStub()) Create a table with all possible field types >>> from google.appengine.api.memcache import Client >>> db=MEMDB(Client()) >>> tmp=db.define_table('users', Field('stringf','string',length=32,required=True), Field('booleanf','boolean',default=False), Field('passwordf','password',notnull=True), Field('blobf','blob'), Field('uploadf','upload'), Field('integerf','integer',unique=True), Field('doublef','double',unique=True,notnull=True), Field('datef','date',default=datetime.date.today()), Field('timef','time'), Field('datetimef','datetime'), migrate='test_user.table') Insert a field >>> user_id = db.users.insert(stringf='a',booleanf=True,passwordf='p',blobf='0A', uploadf=None, integerf=5,doublef=3.14, datef=datetime.date(2001,1,1), timef=datetime.time(12,30,15), datetimef=datetime.datetime(2002,2,2,12,30,15)) >>> user_id != None True Select all # >>> all = db().select(db.users.ALL) Drop the table # >>> db.users.drop() Select many entities >>> tmp = db.define_table(\"posts\", Field('body','text'), Field('total','integer'), Field('created_at','datetime')) >>> many = 20 #2010 # more than 1000 single fetch limit (it can be slow) >>> few = 5 >>> most = many - few >>> 0 < few < most < many True >>> for i in range(many): ... f=db.posts.insert(body='', total=i,created_at=datetime.datetime(2008, 7, 6, 14, 15, 42, i)) >>> # test timezones >>> class TZOffset(datetime.tzinfo): ... def __init__(self,offset=0): ... self.offset = offset ... def utcoffset(self, dt): return datetime.timedelta(hours=self.offset) ... def dst(self, dt): return datetime.timedelta(0) ... def tzname(self, dt): return 'UTC' + str(self.offset) ... >>> SERVER_OFFSET = -8 >>> >>> stamp = datetime.datetime(2008, 7, 6, 14, 15, 42, 828201) >>> post_id = db.posts.insert(created_at=stamp,body='body1') >>> naive_stamp = db(db.posts.id==post_id).select()[0].created_at >>> utc_stamp=naive_stamp.replace(tzinfo=TZOffset()) >>> server_stamp = utc_stamp.astimezone(TZOffset(SERVER_OFFSET)) >>> stamp == naive_stamp True >>> utc_stamp == server_stamp True >>> rows = db(db.posts.id==post_id).select() >>> len(rows) == 1 True >>> rows[0].body == 'body1' True >>> db(db.posts.id==post_id).delete() >>> rows = db(db.posts.id==post_id).select() >>> len(rows) == 0 True >>> id = db.posts.insert(total='0') # coerce str to integer >>> rows = db(db.posts.id==id).select() >>> len(rows) == 1 True >>> rows[0].total == 0 True Examples of insert, select, update, delete >>> tmp=db.define_table('person', Field('name'), Field('birth','date'), migrate='test_person.table') >>> marco_id=db.person.insert(name=\"Marco\",birth='2005-06-22') >>> person_id=db.person.insert(name=\"Massimo\",birth='1971-12-21') >>> me=db(db.person.id==person_id).select()[0] # test select >>> me.name 'Massimo' >>> db(db.person.id==person_id).update(name='massimo') # test update >>> me = db(db.person.id==person_id).select()[0] >>> me.name 'massimo' >>> str(me.birth) '1971-12-21' # resave date to ensure it comes back the same >>> me=db(db.person.id==person_id).update(birth=me.birth) # test update >>> me = db(db.person.id==person_id).select()[0] >>> me.birth datetime.date(1971, 12, 21) >>> db(db.person.id==marco_id).delete() # test delete >>> len(db(db.person.id==marco_id).select()) 0 Update a single record >>> me.update_record(name=\"Max\") >>> me.name 'Max' >>> me = db(db.person.id == person_id).select()[0] >>> me.name 'Max' """ SQLField = Field SQLTable = Table SQLXorable = Expression SQLQuery = Query SQLSet = Set SQLRows = Rows SQLStorage = DALStorage if __name__ == '__main__': import doctest doctest.testmod() �������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/gae_retry.py�������������������������������������������������������0000664�0000000�0000000�00000007105�12564727262�017605� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������def autoretry_datastore_timeouts(attempts=5.0, interval=0.1, exponent=2.0): """ Copyright (C) 2009 twitter.com/rcb Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ====================================================================== This function wraps the AppEngine Datastore API to autoretry datastore timeouts at the lowest accessible level. The benefits of this approach are: 1. Small Footprint: Does not monkey with Model internals which may break in future releases. 2. Max Performance: Retrying at this lowest level means serialization and key formatting is not needlessly repeated on each retry. At initialization time, execute this: >>> autoretry_datastore_timeouts() Should only be called once, subsequent calls have no effect. >>> autoretry_datastore_timeouts() # no effect Default (5) attempts: .1, .2, .4, .8, 1.6 seconds Parameters can each be specified as floats. :param attempts: maximum number of times to retry. :param interval: base seconds to sleep between retries. :param exponent: rate of exponential back-off. """ import time import logging from google.appengine.api import apiproxy_stub_map from google.appengine.runtime import apiproxy_errors from google.appengine.datastore import datastore_pb attempts = float(attempts) interval = float(interval) exponent = float(exponent) wrapped = apiproxy_stub_map.MakeSyncCall errors = {datastore_pb.Error.TIMEOUT: 'Timeout', datastore_pb.Error.CONCURRENT_TRANSACTION: 'TransactionFailedError'} def wrapper(*args, **kwargs): count = 0.0 while True: try: return wrapped(*args, **kwargs) except apiproxy_errors.ApplicationError, err: errno = err.application_error if errno not in errors: raise sleep = (exponent ** count) * interval count += 1.0 if count > attempts: raise msg = "Datastore %s: retry #%d in %s seconds.\n%s" vals = '' if count == 1.0: vals = '\n'.join([str(a) for a in args]) logging.warning(msg % (errors[errno], count, sleep, vals)) time.sleep(sleep) setattr(wrapper, '_autoretry_datastore_timeouts', False) if getattr(wrapped, '_autoretry_datastore_timeouts', True): apiproxy_stub_map.MakeSyncCall = wrapper �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/login_methods/�����������������������������������������������������0000775�0000000�0000000�00000000000�12564727262�020102� 5����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/login_methods/x509_auth.py�����������������������������������������0000664�0000000�0000000�00000006346�12564727262�022213� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # -*- coding: utf-8 -*- """ Written by Michele Comitini <mcm@glisco.it> License: LGPL v3 Adds support for x509 authentication. """ from gluon.globals import current from gluon.storage import Storage from gluon.http import HTTP, redirect #requires M2Crypto from M2Crypto import X509 class X509Auth(object): """ Login using x509 cert from client. from gluon.contrib.login_methods.x509_auth import X509Account auth.settings.actions_disabled=['register','change_password', 'request_reset_password','profile'] auth.settings.login_form = X509Auth() """ def __init__(self): self.request = current.request self.ssl_client_raw_cert = self.request.env.ssl_client_raw_cert # rebuild the certificate passed by the env # this is double work, but it is the only way # since we cannot access the web server ssl engine directly if self.ssl_client_raw_cert: x509 = X509.load_cert_string( self.ssl_client_raw_cert, X509.FORMAT_PEM) # extract it from the cert self.serial = self.request.env.ssl_client_serial or ( '%x' % x509.get_serial_number()).upper() subject = x509.get_subject() # Reordering the subject map to a usable Storage map # this allows us a cleaner syntax: # cn = self.subject.cn self.subject = Storage(filter(None, map(lambda x: (x, map(lambda y: y.get_data( ).as_text(), subject.get_entries_by_nid(subject.nid[x]))), subject.nid.keys()))) def login_form(self, **args): raise HTTP(403, 'Login not allowed. No valid x509 crentials') def login_url(self, next="/"): raise HTTP(403, 'Login not allowed. No valid x509 crentials') def logout_url(self, next="/"): return next def get_user(self): '''Returns the user info contained in the certificate. ''' # We did not get the client cert? if not self.ssl_client_raw_cert: return None # Try to reconstruct some useful info for web2py auth machinery p = profile = dict() username = p['username'] = reduce(lambda a, b: '%s | %s' % ( a, b), self.subject.CN or self.subject.commonName) p['first_name'] = reduce(lambda a, b: '%s | %s' % (a, b), self.subject.givenName or username) p['last_name'] = reduce( lambda a, b: '%s | %s' % (a, b), self.subject.surname) p['email'] = reduce(lambda a, b: '%s | %s' % ( a, b), self.subject.Email or self.subject.emailAddress) # IMPORTANT WE USE THE CERT SERIAL AS UNIQUE KEY FOR THE USER p['registration_id'] = self.serial # If the auth table has a field certificate it will be used to # save a PEM encoded copy of the user certificate. p['certificate'] = self.ssl_client_raw_cert return profile ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/login_methods/openid_auth.py���������������������������������������0000664�0000000�0000000�00000062415�12564727262�022763� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # coding: utf8 """ OpenID authentication for web2py Allowed using OpenID login together with web2py built-in login. By default, to support OpenID login, put this in your db.py >>> from gluon.contrib.login_methods.openid_auth import OpenIDAuth >>> auth.settings.login_form = OpenIDAuth(auth) To show OpenID list in user profile, you can add the following code before the end of function user() of your_app/controllers/default.py + if (request.args and request.args(0) == "profile"): + form = DIV(form, openid_login_form.list_user_openids()) return dict(form=form, login_form=login_form, register_form=register_form, self_registration=self_registration) More detail in the description of the class OpenIDAuth. Requirements: python-openid version 2.2.5 or later Reference: * w2p openID http://w2popenid.appspot.com/init/default/wiki/w2popenid * RPX and web2py auth module http://www.web2pyslices.com/main/slices/take_slice/28 * built-in file: gluon/contrib/login_methods/rpx_account.py * built-in file: gluon/tools.py (Auth class) """ import time from datetime import datetime, timedelta from gluon import * from gluon.storage import Storage, Messages try: import openid.consumer.consumer from openid.association import Association from openid.store.interface import OpenIDStore from openid.extensions.sreg import SRegRequest, SRegResponse from openid.store import nonce from openid.consumer.discover import DiscoveryFailure except ImportError, err: raise ImportError("OpenIDAuth requires python-openid package") DEFAULT = lambda: None class OpenIDAuth(object): """ OpenIDAuth It supports the logout_url, implementing the get_user and login_form for cas usage of gluon.tools.Auth. It also uses the ExtendedLoginForm to allow the OpenIDAuth login_methods combined with the standard logon/register procedure. It uses OpenID Consumer when render the form and begins the OpenID authentication. Example: (put these code after auth.define_tables() in your models.) auth = Auth(globals(), db) # authentication/authorization ... auth.define_tables() # creates all needed tables ... #include in your model after auth has been defined from gluon.contrib.login_methods.openid_auth import OpenIDAuth openid_login_form = OpenIDAuth(request, auth, db) from gluon.contrib.login_methods.extended_login_form import ExtendedLoginForm extended_login_form = ExtendedLoginForm(request, auth, openid_login_form, signals=['oid','janrain_nonce']) auth.settings.login_form = extended_login_form """ def __init__(self, auth): self.auth = auth self.db = auth.db request = current.request self.nextvar = '_next' self.realm = 'http://%s' % request.env.http_host self.login_url = URL(r=request, f='user', args=['login']) self.return_to_url = self.realm + self.login_url self.table_alt_logins_name = "alt_logins" if not auth.settings.table_user: raise self.table_user = self.auth.settings.table_user self.openid_expiration = 15 # minutes self.messages = self._define_messages() if not self.table_alt_logins_name in self.db.tables: self._define_alt_login_table() def _define_messages(self): messages = Messages(current.T) messages.label_alt_login_username = 'Sign-in with OpenID: ' messages.label_add_alt_login_username = 'Add a new OpenID: ' messages.submit_button = 'Sign in' messages.submit_button_add = 'Add' messages.a_delete = 'Delete' messages.comment_openid_signin = 'What is OpenID?' messages.comment_openid_help_title = 'Start using your OpenID' messages.comment_openid_help_url = 'http://openid.net/get-an-openid/start-using-your-openid/' messages.openid_fail_discover = 'Failed to discover OpenID service. Check your OpenID or "More about OpenID"?' messages.flash_openid_expired = 'OpenID expired. Please login or authenticate OpenID again. Sorry for the inconvenient.' messages.flash_openid_associated = 'OpenID associated' messages.flash_associate_openid = 'Please login or register an account for this OpenID.' messages.p_openid_not_registered = "This Open ID haven't be registered. " \ + "Please login to associate with it or register an account for it." messages.flash_openid_authenticated = 'OpenID authenticated successfully.' messages.flash_openid_fail_authentication = 'OpenID authentication failed. (Error message: %s)' messages.flash_openid_canceled = 'OpenID authentication canceled by user.' messages.flash_openid_need_setup = 'OpenID authentication needs to be setup by the user with the provider first.' messages.h_openid_login = 'OpenID Login' messages.h_openid_list = 'OpenID List' return messages def _define_alt_login_table(self): """ Define the OpenID login table. Note: oidtype is what I used for our project. We're going to support 'fackbook' and 'plurk' alternate login methods. Otherwise it's always 'openid' and you may not need it. This should be easy to changed. (Just remove the field of "type" and remove the "and db.alt_logins.oidtype == type_" in _find_matched_openid function) """ db = self.db table = db.define_table( self.table_alt_logins_name, Field('username', length=512, default=''), Field('oidtype', length=128, default='openid', readable=False), Field('oiduser', self.table_user, readable=False), ) table.username.requires = IS_NOT_IN_DB(db, table.username) self.table_alt_logins = table def logout_url(self, next): """ Delete the w2popenid record in session as logout """ if current.session.w2popenid: del(current.session.w2popenid) return next def login_form(self): """ Start to process the OpenID response if 'janrain_nonce' in request parameters and not processed yet. Else return the OpenID form for login. """ request = current.request if 'janrain_nonce' in request.vars and not self._processed(): self._process_response() return self.auth() return self._form() def get_user(self): """ It supports the logout_url, implementing the get_user and login_form for cas usage of gluon.tools.Auth. """ request = current.request args = request.args if args[0] == 'logout': return True # Let logout_url got called if current.session.w2popenid: w2popenid = current.session.w2popenid db = self.db if (w2popenid.ok is True and w2popenid.oid): # OpenID authenticated if self._w2popenid_expired(w2popenid): del(current.session.w2popenid) flash = self.messages.flash_openid_expired current.session.warning = flash redirect(self.auth.settings.login_url) oid = self._remove_protocol(w2popenid.oid) alt_login = self._find_matched_openid(db, oid) nextvar = self.nextvar # This OpenID not in the database. If user logged in then add it # into database, else ask user to login or register. if not alt_login: if self.auth.is_logged_in(): # TODO: ask first maybe self._associate_user_openid(self.auth.user, oid) if current.session.w2popenid: del(current.session.w2popenid) current.session.flash = self.messages.flash_openid_associated if nextvar in request.vars: redirect(request.vars[nextvar]) redirect(self.auth.settings.login_next) if nextvar not in request.vars: # no next var, add it and do login again # so if user login or register can go back here to associate the OpenID redirect(URL(r=request, args=['login'], vars={nextvar: self.login_url})) self.login_form = self._form_with_notification() current.session.flash = self.messages.flash_associate_openid return None # need to login or register to associate this openid # Get existed OpenID user user = db( self.table_user.id == alt_login.oiduser).select().first() if user: if current.session.w2popenid: del(current.session.w2popenid) if 'username' in self.table_user.fields(): username = 'username' elif 'email' in self.table_user.fields(): username = 'email' return {username: user[username]} if user else None # login success (almost) return None # just start to login def _find_matched_openid(self, db, oid, type_='openid'): """ Get the matched OpenID for given """ query = ( (db.alt_logins.username == oid) & (db.alt_logins.oidtype == type_)) alt_login = db(query).select().first() # Get the OpenID record return alt_login def _associate_user_openid(self, user, oid): """ Associate the user logged in with given OpenID """ # print "[DB] %s authenticated" % oid self.db.alt_logins.insert(username=oid, oiduser=user.id) def _form_with_notification(self): """ Render the form for normal login with a notice of OpenID authenticated """ form = DIV() # TODO: check when will happen if self.auth.settings.login_form in (self.auth, self): self.auth.settings.login_form = self.auth form = DIV(self.auth()) register_note = DIV(P(self.messages.p_openid_not_registered)) form.components.append(register_note) return lambda: form def _remove_protocol(self, oid): """ Remove https:// or http:// from oid url """ protocol = 'https://' if oid.startswith(protocol): oid = oid[len(protocol):] return oid protocol = 'http://' if oid.startswith(protocol): oid = oid[len(protocol):] return oid return oid def _init_consumerhelper(self): """ Initialize the ConsumerHelper """ if not hasattr(self, "consumerhelper"): self.consumerhelper = ConsumerHelper(current.session, self.db) return self.consumerhelper def _form(self, style=None): form = DIV(H3(self.messages.h_openid_login), self._login_form(style)) return form def _login_form(self, openid_field_label=None, submit_button=None, _next=None, style=None): """ Render the form for OpenID login """ def warning_openid_fail(session): session.warning = messages.openid_fail_discover style = style or """ background-attachment: scroll; background-repeat: no-repeat; background-image: url("http://wiki.openid.net/f/openid-16x16.gif"); background-position: 0% 50%; background-color: transparent; padding-left: 18px; width: 400px; """ style = style.replace("\n", "") request = current.request session = current.session messages = self.messages hidden_next_input = "" if _next == 'profile': profile_url = URL(r=request, f='user', args=['profile']) hidden_next_input = INPUT( _type="hidden", _name="_next", _value=profile_url) form = FORM( openid_field_label or self.messages.label_alt_login_username, INPUT(_type="input", _name="oid", requires=IS_NOT_EMPTY( error_message=messages.openid_fail_discover), _style=style), hidden_next_input, INPUT(_type="submit", _value=submit_button or messages.submit_button), " ", A(messages.comment_openid_signin, _href=messages.comment_openid_help_url, _title=messages.comment_openid_help_title, _class='openid-identifier', _target="_blank"), _action=self.login_url ) if form.accepts(request.vars, session): oid = request.vars.oid consumerhelper = self._init_consumerhelper() url = self.login_url return_to_url = self.return_to_url if not oid: warning_openid_fail(session) redirect(url) try: if '_next' in request.vars: return_to_url = self.return_to_url + \ '?_next=' + request.vars._next url = consumerhelper.begin(oid, self.realm, return_to_url) except DiscoveryFailure: warning_openid_fail(session) redirect(url) return form def _processed(self): """ Check if w2popenid authentication is processed. Return True if processed else False. """ processed = (hasattr(current.session, 'w2popenid') and current.session.w2popenid.ok is True) return processed def _set_w2popenid_expiration(self, w2popenid): """ Set expiration for OpenID authentication. """ w2popenid.expiration = datetime.now( ) + timedelta(minutes=self.openid_expiration) def _w2popenid_expired(self, w2popenid): """ Check if w2popenid authentication is expired. Return True if expired else False. """ return (not w2popenid.expiration) or (datetime.now() > w2popenid.expiration) def _process_response(self): """ Process the OpenID by ConsumerHelper. """ request = current.request request_vars = request.vars consumerhelper = self._init_consumerhelper() process_status = consumerhelper.process_response( request_vars, self.return_to_url) if process_status == "success": w2popenid = current.session.w2popenid user_data = self.consumerhelper.sreg() current.session.w2popenid.ok = True self._set_w2popenid_expiration(w2popenid) w2popenid.user_data = user_data current.session.flash = self.messages.flash_openid_authenticated elif process_status == "failure": flash = self.messages.flash_openid_fail_authentication % consumerhelper.error_message current.session.warning = flash elif process_status == "cancel": current.session.warning = self.messages.flash_openid_canceled elif process_status == "setup_needed": current.session.warning = self.messages.flash_openid_need_setup def list_user_openids(self): messages = self.messages request = current.request if 'delete_openid' in request.vars: self.remove_openid(request.vars.delete_openid) query = self.db.alt_logins.oiduser == self.auth.user.id alt_logins = self.db(query).select() l = [] for alt_login in alt_logins: username = alt_login.username delete_href = URL(r=request, f='user', args=['profile'], vars={'delete_openid': username}) delete_link = A(messages.a_delete, _href=delete_href) l.append(LI(username, " ", delete_link)) profile_url = URL(r=request, f='user', args=['profile']) #return_to_url = self.return_to_url + '?' + self.nextvar + '=' + profile_url openid_list = DIV(H3(messages.h_openid_list), UL(l), self._login_form( _next='profile', submit_button=messages.submit_button_add, openid_field_label=messages.label_add_alt_login_username) ) return openid_list def remove_openid(self, openid): query = self.db.alt_logins.username == openid self.db(query).delete() class ConsumerHelper(object): """ ConsumerHelper knows the python-openid and """ def __init__(self, session, db): self.session = session store = self._init_store(db) self.consumer = openid.consumer.consumer.Consumer(session, store) def _init_store(self, db): """ Initialize Web2pyStore """ if not hasattr(self, "store"): store = Web2pyStore(db) session = self.session if 'w2popenid' not in session: session.w2popenid = Storage() self.store = store return self.store def begin(self, oid, realm, return_to_url): """ Begin the OpenID authentication """ w2popenid = self.session.w2popenid w2popenid.oid = oid auth_req = self.consumer.begin(oid) auth_req.addExtension(SRegRequest(required=['email', 'nickname'])) url = auth_req.redirectURL(return_to=return_to_url, realm=realm) return url def process_response(self, request_vars, return_to_url): """ Complete the process and """ resp = self.consumer.complete(request_vars, return_to_url) if resp: if resp.status == openid.consumer.consumer.SUCCESS: self.resp = resp if hasattr(resp, "identity_url"): self.session.w2popenid.oid = resp.identity_url return "success" if resp.status == openid.consumer.consumer.FAILURE: self.error_message = resp.message return "failure" if resp.status == openid.consumer.consumer.CANCEL: return "cancel" if resp.status == openid.consumer.consumer.SETUP_NEEDED: return "setup_needed" return "no resp" def sreg(self): """ Try to get OpenID Simple Registation http://openid.net/specs/openid-simple-registration-extension-1_0.html """ if self.resp: resp = self.resp sreg_resp = SRegResponse.fromSuccessResponse(resp) return sreg_resp.data if sreg_resp else None else: return None class Web2pyStore(OpenIDStore): """ Web2pyStore This class implements the OpenIDStore interface. OpenID stores take care of persisting nonces and associations. The Janrain Python OpenID library comes with implementations for file and memory storage. Web2pyStore uses the web2py db abstration layer. See the source code docs of OpenIDStore for a comprehensive description of this interface. """ def __init__(self, database): self.database = database self.table_oid_associations_name = 'oid_associations' self.table_oid_nonces_name = 'oid_nonces' self._initDB() def _initDB(self): if self.table_oid_associations_name not in self.database: self.database.define_table(self.table_oid_associations_name, Field('server_url', 'string', length=2047, required=True), Field('handle', 'string', length=255, required=True), Field('secret', 'blob', required=True), Field('issued', 'integer', required=True), Field('lifetime', 'integer', required=True), Field('assoc_type', 'string', length=64, required=True) ) if self.table_oid_nonces_name not in self.database: self.database.define_table(self.table_oid_nonces_name, Field('server_url', 'string', length=2047, required=True), Field('itimestamp', 'integer', required=True), Field('salt', 'string', length=40, required=True) ) def storeAssociation(self, server_url, association): """ Store associations. If there already is one with the same server_url and handle in the table replace it. """ db = self.database query = (db.oid_associations.server_url == server_url) & ( db.oid_associations.handle == association.handle) db(query).delete() db.oid_associations.insert(server_url=server_url, handle=association.handle, secret=association.secret, issued=association.issued, lifetime=association.lifetime, assoc_type=association.assoc_type), 'insert ' * 10 def getAssociation(self, server_url, handle=None): """ Return the association for server_url and handle. If handle is not None return the latests associations for that server_url. Return None if no association can be found. """ db = self.database query = (db.oid_associations.server_url == server_url) if handle: query &= (db.oid_associations.handle == handle) rows = db(query).select(orderby=db.oid_associations.issued) keep_assoc, _ = self._removeExpiredAssocations(rows) if len(keep_assoc) == 0: return None else: assoc = keep_assoc.pop( ) # pop the last one as it should be the latest one return Association(assoc['handle'], assoc['secret'], assoc['issued'], assoc['lifetime'], assoc['assoc_type']) def removeAssociation(self, server_url, handle): db = self.database query = (db.oid_associations.server_url == server_url) & ( db.oid_associations.handle == handle) return db(query).delete() is not None def useNonce(self, server_url, timestamp, salt): """ This method returns Falase if a nonce has been used before or its timestamp is not current. """ db = self.database if abs(timestamp - time.time()) > nonce.SKEW: return False query = (db.oid_nonces.server_url == server_url) & (db.oid_nonces.itimestamp == timestamp) & (db.oid_nonces.salt == salt) if db(query).count() > 0: return False else: db.oid_nonces.insert(server_url=server_url, itimestamp=timestamp, salt=salt) return True def _removeExpiredAssocations(self, rows): """ This helper function is not part of the interface. Given a list of association rows it checks which associations have expired and deletes them from the db. It returns a tuple of the form ([valid_assoc], no_of_expired_assoc_deleted). """ db = self.database keep_assoc = [] remove_assoc = [] t1970 = time.time() for r in rows: if r['issued'] + r['lifetime'] < t1970: remove_assoc.append(r) else: keep_assoc.append(r) for r in remove_assoc: del db.oid_associations[r['id']] return (keep_assoc, len(remove_assoc)) # return tuple (list of valid associations, number of deleted associations) def cleanupNonces(self): """ Remove expired nonce entries from DB and return the number of entries deleted. """ db = self.database query = (db.oid_nonces.itimestamp < time.time() - nonce.SKEW) return db(query).delete() def cleanupAssociations(self): """ Remove expired associations from db and return the number of entries deleted. """ db = self.database query = (db.oid_associations.id > 0) return self._removeExpiredAssocations(db(query).select())[1] # return number of assoc removed def cleanup(self): """ This method should be run periodically to free the db from expired nonce and association entries. """ return self.cleanupNonces(), self.cleanupAssociations() ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/login_methods/rpx_account.py���������������������������������������0000664�0000000�0000000�00000012113�12564727262�022777� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # coding: utf8 """ RPX Authentication for web2py Developed by Nathan Freeze (Copyright © 2009) Email <nathan@freezable.com> Modified by Massimo Di Pierro This file contains code to allow using RPXNow.com (now Jainrain.com) services with web2py """ import os import re import urllib from gluon import * from gluon.tools import fetch from gluon.storage import Storage import gluon.contrib.simplejson as json class RPXAccount(object): """ from gluon.contrib.login_methods.rpx_account import RPXAccount auth.settings.actions_disabled=['register','change_password', 'request_reset_password'] auth.settings.login_form = RPXAccount(request, api_key="...", domain="...", url = "http://localhost:8000/%s/default/user/login" % request.application) """ def __init__(self, request, api_key="", domain="", url="", embed=True, auth_url="https://rpxnow.com/api/v2/auth_info", language="en", prompt='rpx', on_login_failure=None, ): self.request = request self.api_key = api_key self.embed = embed self.auth_url = auth_url self.domain = domain self.token_url = url self.language = language self.profile = None self.prompt = prompt self.on_login_failure = on_login_failure self.mappings = Storage() dn = {'givenName': '', 'familyName': ''} self.mappings.Facebook = lambda profile, dn=dn:\ dict(registration_id=profile.get("identifier", ""), username=profile.get("preferredUsername", ""), email=profile.get("email", ""), first_name=profile.get("name", dn).get("givenName", ""), last_name=profile.get("name", dn).get("familyName", "")) self.mappings.Google = lambda profile, dn=dn:\ dict(registration_id=profile.get("identifier", ""), username=profile.get("preferredUsername", ""), email=profile.get("email", ""), first_name=profile.get("name", dn).get("givenName", ""), last_name=profile.get("name", dn).get("familyName", "")) self.mappings.default = lambda profile:\ dict(registration_id=profile.get("identifier", ""), username=profile.get("preferredUsername", ""), email=profile.get("email", ""), first_name=profile.get("preferredUsername", ""), last_name='') def get_user(self): request = self.request if request.vars.token: user = Storage() data = urllib.urlencode( dict(apiKey=self.api_key, token=request.vars.token)) auth_info_json = fetch(self.auth_url + '?' + data) auth_info = json.loads(auth_info_json) if auth_info['stat'] == 'ok': self.profile = auth_info['profile'] provider = re.sub('[^\w\-]', '', self.profile['providerName']) user = self.mappings.get( provider, self.mappings.default)(self.profile) return user elif self.on_login_failure: redirect(self.on_login_failure) return None def login_form(self): request = self.request args = request.args if self.embed: JANRAIN_URL = \ "https://%s.rpxnow.com/openid/embed?token_url=%s&language_preference=%s" rpxform = IFRAME( _src=JANRAIN_URL % ( self.domain, self.token_url, self.language), _scrolling="no", _frameborder="no", _style="width:400px;height:240px;") else: JANRAIN_URL = \ "https://%s.rpxnow.com/openid/v2/signin?token_url=%s" rpxform = DIV(SCRIPT(_src="https://rpxnow.com/openid/v2/widget", _type="text/javascript"), SCRIPT("RPXNOW.overlay = true;", "RPXNOW.language_preference = '%s';" % self.language, "RPXNOW.realm = '%s';" % self.domain, "RPXNOW.token_url = '%s';" % self.token_url, "RPXNOW.show();", _type="text/javascript")) return rpxform def use_janrain(auth, filename='private/janrain.key', **kwargs): path = os.path.join(current.request.folder, filename) if os.path.exists(path): request = current.request domain, key = open(path, 'r').read().strip().split(':') host = current.request.env.http_host url = URL('default', 'user', args='login', scheme=True) auth.settings.actions_disabled = \ ['register', 'change_password', 'request_reset_password'] auth.settings.login_form = RPXAccount( request, api_key=key, domain=domain, url=url, **kwargs) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/login_methods/basic_auth.py����������������������������������������0000664�0000000�0000000�00000001345�12564727262�022561� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������import urllib import urllib2 import base64 def basic_auth(server="http://127.0.0.1"): """ to use basic login with a different server from gluon.contrib.login_methods.basic_auth import basic_auth auth.settings.login_methods.append(basic_auth('http://server')) """ def basic_login_aux(username, password, server=server): key = base64.b64encode(username + ':' + password) headers = {'Authorization': 'Basic ' + key} request = urllib2.Request(server, None, headers) try: urllib2.urlopen(request) return True except (urllib2.URLError, urllib2.HTTPError): return False return basic_login_aux �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/login_methods/__init__.py������������������������������������������0000664�0000000�0000000�00000000001�12564727262�022202� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/login_methods/loginradius_account.py�������������������������������0000664�0000000�0000000�00000007466�12564727262�024525� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # coding: utf8 """ LoginRadius Authentication for web2py Developed by Nathan Freeze (Copyright © 2013) Email <nathan@freezable.com> This file contains code to allow using loginradius.com authentication services with web2py """ import os from gluon import * from gluon.storage import Storage from gluon.contrib.simplejson import JSONDecodeError from gluon.tools import fetch import gluon.contrib.simplejson as json class LoginRadiusAccount(object): """ from gluon.contrib.login_methods.loginradius_account import LoginRadiusAccount auth.settings.actions_disabled=['register','change_password', 'request_reset_password'] auth.settings.login_form = LoginRadiusAccount(request, api_key="...", api_secret="...", url = "http://localhost:8000/%s/default/user/login" % request.application) """ def __init__(self, request, api_key="", api_secret="", url="", on_login_failure=None): self.request = request self.api_key = api_key self.api_secret = api_secret self.url = url self.auth_base_url = "https://hub.loginradius.com/UserProfile.ashx/" self.profile = None self.on_login_failure = on_login_failure self.mappings = Storage() def defaultmapping(profile): first_name = profile.get('FirstName') last_name = profile.get('LastName') email = profile.get('Email', [{}])[0].get('Value') reg_id = profile.get('ID', '') username = profile.get('ProfileName', email) return dict(registration_id=reg_id, username=username, email=email, first_name=first_name, last_name=last_name) self.mappings.default = defaultmapping def get_user(self): request = self.request user = None if request.vars.token: try: auth_url = self.auth_base_url + self.api_secret + "/" + request.vars.token json_data = fetch(auth_url, headers={'User-Agent': "LoginRadius - Python - SDK"}) self.profile = json.loads(json_data) provider = self.profile['Provider'] mapping = self.mappings.get(provider, self.mappings['default']) user = mapping(self.profile) except (JSONDecodeError, KeyError): pass if user is None and self.on_login_failure: redirect(self.on_login_failure) return user def login_form(self): loginradius_url = "https://hub.loginradius.com/include/js/LoginRadius.js" loginradius_lib = SCRIPT(_src=loginradius_url, _type='text/javascript') container = DIV(_id="interfacecontainerdiv", _class='interfacecontainerdiv') widget = SCRIPT("""var options={}; options.login=true; LoginRadius_SocialLogin.util.ready(function () { $ui = LoginRadius_SocialLogin.lr_login_settings; $ui.interfacesize = "";$ui.apikey = "%s"; $ui.callback="%s"; $ui.lrinterfacecontainer ="interfacecontainerdiv"; LoginRadius_SocialLogin.init(options); });""" % (self.api_key, self.url)) form = DIV(container, loginradius_lib, widget) return form def use_loginradius(auth, filename='private/loginradius.key', **kwargs): path = os.path.join(current.request.folder, filename) if os.path.exists(path): request = current.request domain, public_key, private_key = open(path, 'r').read().strip().split(':') url = URL('default', 'user', args='login', scheme=True) auth.settings.actions_disabled = \ ['register', 'change_password', 'request_reset_password'] auth.settings.login_form = LoginRadiusAccount( request, api_key=public_key, api_secret=private_key, url=url, **kwargs) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/login_methods/janrain_account.py�����������������������������������0000664�0000000�0000000�00000012313�12564727262�023612� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # coding: utf8 """ RPX Authentication for web2py Developed by Nathan Freeze (Copyright © 2009) Email <nathan@freezable.com> Modified by Massimo Di Pierro This file contains code to allow using RPXNow.com (now Jainrain.com) services with web2py """ import os import re import urllib from gluon import * from gluon.tools import fetch from gluon.storage import Storage import gluon.contrib.simplejson as json class RPXAccount(object): """ from gluon.contrib.login_methods.rpx_account import RPXAccount auth.settings.actions_disabled=['register','change_password', 'request_reset_password'] auth.settings.login_form = RPXAccount(request, api_key="...", domain="...", url = "http://localhost:8000/%s/default/user/login" % request.application) """ def __init__(self, request, api_key="", domain="", url="", embed=True, auth_url="https://rpxnow.com/api/v2/auth_info", language="en", prompt='rpx', on_login_failure=None, ): self.request = request self.api_key = api_key self.embed = embed self.auth_url = auth_url self.domain = domain self.token_url = url self.language = language self.profile = None self.prompt = prompt self.on_login_failure = on_login_failure self.mappings = Storage() dn = {'givenName': '', 'familyName': ''} self.mappings.Facebook = lambda profile, dn=dn:\ dict(registration_id=profile.get("identifier", ""), username=profile.get("preferredUsername", ""), email=profile.get("email", ""), first_name=profile.get("name", dn).get("givenName", ""), last_name=profile.get("name", dn).get("familyName", "")) self.mappings.Google = lambda profile, dn=dn:\ dict(registration_id=profile.get("identifier", ""), username=profile.get("preferredUsername", ""), email=profile.get("email", ""), first_name=profile.get("name", dn).get("givenName", ""), last_name=profile.get("name", dn).get("familyName", "")) self.mappings.default = lambda profile:\ dict(registration_id=profile.get("identifier", ""), username=profile.get("preferredUsername", ""), email=profile.get("email", ""), first_name=profile.get("preferredUsername", ""), last_name='') def get_user(self): request = self.request if request.vars.token: user = Storage() data = urllib.urlencode( dict(apiKey=self.api_key, token=request.vars.token)) auth_info_json = fetch(self.auth_url + '?' + data) auth_info = json.loads(auth_info_json) if auth_info['stat'] == 'ok': self.profile = auth_info['profile'] provider = re.sub('[^\w\-]', '', self.profile['providerName']) user = self.mappings.get( provider, self.mappings.default)(self.profile) return user elif self.on_login_failure: redirect(self.on_login_failure) return None def login_form(self): request = self.request args = request.args rpxform = """ <script type="text/javascript"> (function() { if (typeof window.janrain !== 'object') window.janrain = {}; if (typeof window.janrain.settings !== 'object') window.janrain.settings = {}; janrain.settings.tokenUrl = '%s'; function isReady() { janrain.ready = true; }; if (document.addEventListener) { document.addEventListener("DOMContentLoaded", isReady, false); } else { window.attachEvent('onload', isReady); } var e = document.createElement('script'); e.type = 'text/javascript'; e.id = 'janrainAuthWidget'; if (document.location.protocol === 'https:') { e.src = 'https://rpxnow.com/js/lib/%s/engage.js'; } else { e.src = 'http://widget-cdn.rpxnow.com/js/lib/%s/engage.js'; } var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(e, s); })(); </script> <div id="janrainEngageEmbed"></div>""" % (self.token_url, self.domain, self.domain) return XML(rpxform) def use_janrain(auth, filename='private/janrain.key', **kwargs): path = os.path.join(current.request.folder, filename) if os.path.exists(path): request = current.request domain, key = open(path, 'r').read().strip().split(':') host = current.request.env.http_host url = URL('default', 'user', args='login', scheme=True) auth.settings.actions_disabled = \ ['register', 'change_password', 'request_reset_password'] auth.settings.login_form = RPXAccount( request, api_key=key, domain=domain, url=url, **kwargs) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/login_methods/oauth10a_account.py����������������������������������0000664�0000000�0000000�00000014433�12564727262�023617� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # -*- coding: utf-8 -*- """ Written by Michele Comitini <mcm@glisco.it> License: LGPL v3 Adds support for OAuth1.0a authentication to web2py. Dependencies: - python-oauth2 (http://github.com/simplegeo/python-oauth2) """ import oauth2 as oauth import cgi from urllib import urlencode from gluon import current class OAuthAccount(object): """ Login will be done via OAuth Framework, instead of web2py's login form. Include in your model (eg db.py):: # define the auth_table before call to auth.define_tables() auth_table = db.define_table( auth.settings.table_user_name, Field('first_name', length=128, default=""), Field('last_name', length=128, default=""), Field('username', length=128, default="", unique=True), Field('password', 'password', length=256, readable=False, label='Password'), Field('registration_key', length=128, default= "", writable=False, readable=False)) auth_table.username.requires = IS_NOT_IN_DB(db, auth_table.username) . . . auth.define_tables() . . . CLIENT_ID=\"<put your fb application id here>\" CLIENT_SECRET=\"<put your fb application secret here>\" AUTH_URL="..." TOKEN_URL="..." ACCESS_TOKEN_URL="..." from gluon.contrib.login_methods.oauth10a_account import OAuthAccount auth.settings.login_form=OAuthAccount(globals( ),CLIENT_ID,CLIENT_SECRET, AUTH_URL, TOKEN_URL, ACCESS_TOKEN_URL) """ def __redirect_uri(self, next=None): """Build the uri used by the authenticating server to redirect the client back to the page originating the auth request. Appends the _next action to the generated url so the flows continues. """ r = self.request http_host = r.env.http_host url_scheme = r.env.wsgi_url_scheme if next: path_info = next else: path_info = r.env.path_info uri = '%s://%s%s' % (url_scheme, http_host, path_info) if r.get_vars and not next: uri += '?' + urlencode(r.get_vars) return uri def accessToken(self): """Return the access token generated by the authenticating server. If token is already in the session that one will be used. Otherwise the token is fetched from the auth server. """ if self.session.access_token: # return the token (TODO: does it expire?) return self.session.access_token if self.session.request_token: # Exchange the request token with an authorization token. token = self.session.request_token self.session.request_token = None # Build an authorized client # OAuth1.0a put the verifier! token.set_verifier(self.request.vars.oauth_verifier) client = oauth.Client(self.consumer, token) resp, content = client.request(self.access_token_url, "POST") if str(resp['status']) != '200': self.session.request_token = None self.globals['redirect'](self.globals[ 'URL'](f='user', args='logout')) self.session.access_token = oauth.Token.from_string(content) return self.session.access_token self.session.access_token = None return None def __init__(self, g, client_id, client_secret, auth_url, token_url, access_token_url, socket_timeout=60): self.globals = g self.client_id = client_id self.client_secret = client_secret self.code = None self.request = current.request self.session = current.session self.auth_url = auth_url self.token_url = token_url self.access_token_url = access_token_url self.socket_timeout = socket_timeout # consumer init self.consumer = oauth.Consumer(self.client_id, self.client_secret) def login_url(self, next="/"): self.__oauth_login(next) return next def logout_url(self, next="/"): self.session.request_token = None self.session.access_token = None return next def get_user(self): '''Get user data. Since OAuth does not specify what a user is, this function must be implemented for the specific provider. ''' raise NotImplementedError("Must override get_user()") def __oauth_login(self, next): '''This method redirects the user to the authenticating form on authentication server if the authentication code and the authentication token are not available to the application yet. Once the authentication code has been received this method is called to set the access token into the session by calling accessToken() ''' if not self.accessToken(): # setup the client client = oauth.Client(self.consumer, None, timeout=self.socket_timeout) # Get a request token. # oauth_callback *is REQUIRED* for OAuth1.0a # putting it in the body seems to work. callback_url = self.__redirect_uri(next) data = urlencode(dict(oauth_callback=callback_url)) resp, content = client.request(self.token_url, "POST", body=data) if resp['status'] != '200': self.session.request_token = None self.globals['redirect'](self.globals[ 'URL'](f='user', args='logout')) # Store the request token in session. request_token = self.session.request_token = oauth.Token.from_string(content) # Redirect the user to the authentication URL and pass the callback url. data = urlencode(dict(oauth_token=request_token.key, oauth_callback=callback_url)) auth_request_url = self.auth_url + '?' + data HTTP = self.globals['HTTP'] raise HTTP(302, "You are not authenticated: you are being redirected to the <a href='" + auth_request_url + "'> authentication server</a>", Location=auth_request_url) return None �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/login_methods/oneall_account.py������������������������������������0000664�0000000�0000000�00000010717�12564727262�023450� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # coding: utf8 """ Oneall Authentication for web2py Developed by Nathan Freeze (Copyright © 2013) Email <nathan@freezable.com> This file contains code to allow using onall.com authentication services with web2py """ import os import base64 from gluon import * from gluon.storage import Storage from gluon.contrib.simplejson import JSONDecodeError from gluon.tools import fetch import gluon.contrib.simplejson as json class OneallAccount(object): """ from gluon.contrib.login_methods.oneall_account import OneallAccount auth.settings.actions_disabled=['register','change_password', 'request_reset_password'] auth.settings.login_form = OneallAccount(request, public_key="...", private_key="...", domain="...", url = "http://localhost:8000/%s/default/user/login" % request.application) """ def __init__(self, request, public_key="", private_key="", domain="", url=None, providers=None, on_login_failure=None): self.request = request self.public_key = public_key self.private_key = private_key self.url = url self.domain = domain self.profile = None self.on_login_failure = on_login_failure self.providers = providers or ["facebook", "google", "yahoo", "openid"] self.mappings = Storage() def defaultmapping(profile): name = profile.get('name',{}) dname = name.get('formatted',profile.get('displayName')) email=profile.get('emails', [{}])[0].get('value') reg_id=profile.get('identity_token','') username=profile.get('preferredUsername',email) first_name=name.get('givenName', dname.split(' ')[0]) last_name=profile.get('familyName',dname.split(' ')[1]) return dict(registration_id=reg_id,username=username,email=email, first_name=first_name,last_name=last_name) self.mappings.default = defaultmapping def get_user(self): request = self.request user = None if request.vars.connection_token: auth_url = "https://%s.api.oneall.com/connections/%s.json" % \ (self.domain, request.vars.connection_token) auth_pw = "%s:%s" % (self.public_key,self.private_key) auth_pw = base64.b64encode(auth_pw) headers = dict(Authorization="Basic %s" % auth_pw) try: auth_info_json = fetch(auth_url,headers=headers) auth_info = json.loads(auth_info_json) data = auth_info['response']['result']['data'] if data['plugin']['key'] == 'social_login': if data['plugin']['data']['status'] == 'success': userdata = data['user'] self.profile = userdata['identity'] source = self.profile['source']['key'] mapping = self.mappings.get(source,self.mappings['default']) user = mapping(self.profile) except (JSONDecodeError, KeyError): pass if user is None and self.on_login_failure: redirect(self.on_login_failure) return user def login_form(self): scheme = self.request.env.wsgi_url_scheme oneall_url = scheme + "://%s.api.oneall.com/socialize/library.js" % self.domain oneall_lib = SCRIPT(_src=oneall_url,_type='text/javascript') container = DIV(_id="oa_social_login_container") widget = SCRIPT('oneall.api.plugins.social_login.build("oa_social_login_container",', '{providers : %s,' % self.providers, 'callback_uri: "%s"});' % self.url, _type="text/javascript") form = DIV(oneall_lib,container,widget) return form def use_oneall(auth, filename='private/oneall.key', **kwargs): path = os.path.join(current.request.folder, filename) if os.path.exists(path): request = current.request domain, public_key, private_key = open(path, 'r').read().strip().split(':') url = URL('default', 'user', args='login', scheme=True) auth.settings.actions_disabled =\ ['register', 'change_password', 'request_reset_password'] auth.settings.login_form = OneallAccount( request, public_key=public_key,private_key=private_key, domain=domain, url=url, **kwargs) �������������������������������������������������web2py-2.12.3.orig/gluon/contrib/login_methods/dropbox_account.py�����������������������������������0000664�0000000�0000000�00000010723�12564727262�023650� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # coding: utf8 """ Dropbox Authentication for web2py Developed by Massimo Di Pierro (2012) Same License as Web2py License """ # mind here session is dropbox session, not current.session import os import re import urllib from dropbox import client, rest, session from gluon import * from gluon.tools import fetch from gluon.storage import Storage import gluon.contrib.simplejson as json class DropboxAccount(object): """ from gluon.contrib.login_methods.dropbox_account import DropboxAccount auth.settings.actions_disabled=['register','change_password', 'request_reset_password'] auth.settings.login_form = DropboxAccount(request, key="...", secret="...", access_type="...", login_url = "http://localhost:8000/%s/default/user/login" % request.application) when logged in client = auth.settings.login_form.client """ def __init__(self, request, key="", secret="", access_type="app_folder", login_url="", on_login_failure=None, ): self.request = request self.key = key self.secret = secret self.access_type = access_type self.login_url = login_url self.on_login_failure = on_login_failure self.sess = session.DropboxSession( self.key, self.secret, self.access_type) def get_token(self): if not current.session.dropbox_access_token: request_token = current.session.dropbox_request_token self.sess.set_request_token(request_token[0], request_token[1]) access_token = self.sess.obtain_access_token(self.sess.token) current.session.dropbox_access_token = \ (access_token.key, access_token.secret) else: access_token = current.session.dropbox_access_token self.sess.set_token(access_token[0], access_token[1]) def get_user(self): if not current.session.dropbox_request_token: return None self.get_token() user = Storage() self.client = client.DropboxClient(self.sess) data = self.client.account_info() display_name = data.get('display_name', '').split(' ', 1) user = dict(email=data.get('email', None), first_name=display_name[0], last_name=display_name[-1], registration_id=data.get('uid', None)) if not user['registration_id'] and self.on_login_failure: redirect(self.on_login_failure) return user def login_form(self): request_token = self.sess.obtain_request_token() current.session.dropbox_request_token = \ (request_token.key, request_token.secret) dropbox_url = self.sess.build_authorize_url(request_token, self.login_url) redirect(dropbox_url) form = IFRAME(_src=dropbox_url, _scrolling="no", _frameborder="no", _style="width:400px;height:240px;") return form def logout_url(self, next="/"): self.sess.unlink() current.session.auth = None return next def get_client(self): self.get_token() self.client = client.DropboxClient(self.sess) def put(self, filename, file): if not hasattr(self,'client'): self.get_client() return self.client.put_file(filename, file)['bytes'] def get(self, filename): if not hasattr(self,'client'): self.get_client() return self.client.get_file(filename) def dir(self, path): if not hasattr(self,'client'): self.get_client() return self.client.metadata(path) def use_dropbox(auth, filename='private/dropbox.key', **kwargs): path = os.path.join(current.request.folder, filename) if os.path.exists(path): request = current.request key, secret, access_type = open(path, 'r').read().strip().split(':') host = current.request.env.http_host login_url = "http://%s/%s/default/user/login" % \ (host, request.application) auth.settings.actions_disabled = \ ['register', 'change_password', 'request_reset_password'] auth.settings.login_form = DropboxAccount( request, key=key, secret=secret, access_type=access_type, login_url=login_url, **kwargs) ���������������������������������������������web2py-2.12.3.orig/gluon/contrib/login_methods/oauth20_account.py�����������������������������������0000664�0000000�0000000�00000024751�12564727262�023463� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # -*- coding: utf-8 -*- """ Written by Michele Comitini <mcm@glisco.it> License: LGPL v3 Adds support for OAuth 2.0 authentication to web2py. OAuth 2.0 spec: http://tools.ietf.org/html/rfc6749 """ import time import cgi import urllib2 from urllib import urlencode from gluon import current, redirect, HTTP import json class OAuthAccount(object): """ Login will be done via OAuth Framework, instead of web2py's login form. You need to override the get_user method to match your auth provider needs. Example for facebook in your model (eg db.py):: # define the auth_table before call to auth.define_tables() auth_table = db.define_table( auth.settings.table_user_name, Field('first_name', length=128, default=""), Field('last_name', length=128, default=""), Field('username', length=128, default="", unique=True), Field('password', 'password', length=256, readable=False, label='Password'), Field('registration_key', length=128, default= "", writable=False, readable=False)) auth_table.username.requires = IS_NOT_IN_DB(db, auth_table.username) auth.define_tables() CLIENT_ID=\"<put your fb application id here>\" CLIENT_SECRET=\"<put your fb application secret here>\" AUTH_URL="http://..." TOKEN_URL="http://..." # remember to download and install facebook GraphAPI module in your app from facebook import GraphAPI, GraphAPIError from gluon.contrib.login_methods.oauth20_account import OAuthAccount class FaceBookAccount(OAuthAccount): '''OAuth impl for FaceBook''' AUTH_URL="https://graph.facebook.com/oauth/authorize" TOKEN_URL="https://graph.facebook.com/oauth/access_token" def __init__(self): OAuthAccount.__init__(self, client_id=CLIENT_ID, client_secret=CLIENT_SECRET, auth_url=self.AUTH_URL, token_url=self.TOKEN_URL, scope='user_photos,friends_photos') self.graph = None def get_user(self): ''' Returns the user using the Graph API. ''' if not self.accessToken(): return None if not self.graph: self.graph = GraphAPI((self.accessToken())) user = None try: user = self.graph.get_object("me") except GraphAPIError, e: self.session.token = None self.graph = None if user: return dict(first_name = user['first_name'], last_name = user['last_name'], username = user['id']) auth.settings.actions_disabled=['register', 'change_password','request_reset_password','profile'] auth.settings.login_form=FaceBookAccount() Any optional arg in the constructor will be passed asis to remote server for requests. It can be used for the optional"scope" parameters for Facebook. """ def __redirect_uri(self, next=None): """ Build the uri used by the authenticating server to redirect the client back to the page originating the auth request. Appends the _next action to the generated url so the flows continues. """ r = current.request http_host = r.env.http_host if r.env.https == 'on': url_scheme = 'https' else: url_scheme = r.env.wsgi_url_scheme if next: path_info = next else: path_info = r.env.path_info uri = '%s://%s%s' % (url_scheme, http_host, path_info) if r.get_vars and not next: uri += '?' + urlencode(r.get_vars) return uri def __build_url_opener(self, uri): """ Build the url opener for managing HTTP Basic Athentication """ # Create an OpenerDirector with support # for Basic HTTP Authentication... password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() password_mgr.add_password(realm=None, uri=uri, user=self.client_id, passwd=self.client_secret) handler = urllib2.HTTPBasicAuthHandler(password_mgr) opener = urllib2.build_opener(handler) return opener def accessToken(self): """ Return the access token generated by the authenticating server. If token is already in the session that one will be used. Otherwise the token is fetched from the auth server. """ if current.session.token and 'expires' in current.session.token: expires = current.session.token['expires'] # reuse token until expiration if expires == 0 or expires > time.time(): return current.session.token['access_token'] code = current.request.vars.code if code: data = dict(client_id=self.client_id, client_secret=self.client_secret, redirect_uri=current.session.redirect_uri, code=code, grant_type='authorization_code' ) open_url = None opener = self.__build_url_opener(self.token_url) try: open_url = opener.open(self.token_url, urlencode(data), self.socket_timeout) except urllib2.HTTPError, e: tmp = e.read() raise Exception(tmp) finally: if current.session.code: del current.session.code # throw it away if open_url: try: data = open_url.read() resp_type = open_url.info().gettype() # try json style first if not resp_type or resp_type[:16] == 'application/json': try: tokendata = json.loads(data) current.session.token = tokendata except Exception, e: raise Exception("Cannot parse oauth server response %s %s" % (data, e)) else: # try facebook style first with x-www-form-encoded tokendata = cgi.parse_qs(data) current.session.token = \ dict([(k, v[-1]) for k, v in tokendata.items()]) if not tokendata: # parsing failed? raise Exception("Cannot parse oauth server response %s" % data) # set expiration absolute time try to avoid broken # implementations where "expires_in" becomes "expires" if 'expires_in' in current.session.token: exps = 'expires_in' elif 'expires' in current.session.token: exps = 'expires' else: exps = None current.session.token['expires'] = exps and \ int(current.session.token[exps]) + \ time.time() finally: opener.close() return current.session.token['access_token'] current.session.token = None return None def __init__(self, g=None, client_id=None, client_secret=None, auth_url=None, token_url=None, socket_timeout=60, **args): """ first argument is unused. Here only for legacy reasons. """ if [client_id, client_secret, auth_url, token_url].count(None) > 0: raise RuntimeError("""Following args are mandatory: client_id, client_secret, auth_url, token_url. """) self.client_id = client_id self.client_secret = client_secret self.auth_url = auth_url self.token_url = token_url self.args = args self.socket_timeout = socket_timeout def login_url(self, next="/"): self.__oauth_login(next) return next def logout_url(self, next="/"): del current.session.token return next def get_user(self): """ Override this method by sublcassing the class. """ if not current.session.token: return None return dict(first_name='Pinco', last_name='Pallino', username='pincopallino') raise NotImplementedError("Must override get_user()") # Following code is never executed. It can be used as example # for overriding in subclasses. if not self.accessToken(): return None if not self.graph: self.graph = GraphAPI((self.accessToken())) user = None try: user = self.graph.get_object("me") except GraphAPIError: current.session.token = None self.graph = None if user: return dict(first_name=user['first_name'], last_name=user['last_name'], username=user['id']) def __oauth_login(self, next): """ This method redirects the user to the authenticating form on authentication server if the authentication code and the authentication token are not available to the application yet. Once the authentication code has been received this method is called to set the access token into the session by calling accessToken() """ token = self.accessToken() if not token: current.session.redirect_uri = self.__redirect_uri(next) data = dict(redirect_uri=current.session.redirect_uri, response_type='code', client_id=self.client_id) if self.args: data.update(self.args) auth_request_url = self.auth_url + "?" + urlencode(data) raise HTTP(302, "You are not authenticated: you are being redirected to the <a href='" + auth_request_url + "'> authentication server</a>", Location=auth_request_url) return �����������������������web2py-2.12.3.orig/gluon/contrib/login_methods/motp_auth.py�����������������������������������������0000664�0000000�0000000�00000010760�12564727262�022460� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python import time from hashlib import md5 from gluon.dal import DAL def motp_auth(db=DAL('sqlite://storage.sqlite'), time_offset=60): """ motp allows you to login with a one time password(OTP) generated on a motp client, motp clients are available for practically all platforms. to know more about OTP visit http://en.wikipedia.org/wiki/One-time_password to know more visit http://motp.sourceforge.net Written by Madhukar R Pai (madspai@gmail.com) License : MIT or GPL v2 thanks and credits to the web2py community to use motp_auth: motp_auth.py has to be located in gluon/contrib/login_methods/ folder first auth_user has to have 2 extra fields - motp_secret and motp_pin for that define auth like shown below: ## after auth = Auth(db) db.define_table( auth.settings.table_user_name, Field('first_name', length=128, default=''), Field('last_name', length=128, default=''), Field('email', length=128, default='', unique=True), # required Field('password', 'password', length=512, # required readable=False, label='Password'), Field('motp_secret',length=512,default='', label='MOTP Seceret'), Field('motp_pin',length=128,default='', label='MOTP PIN'), Field('registration_key', length=512, # required writable=False, readable=False, default=''), Field('reset_password_key', length=512, # required writable=False, readable=False, default=''), Field('registration_id', length=512, # required writable=False, readable=False, default='')) ##validators custom_auth_table = db[auth.settings.table_user_name] # get the custom_auth_table custom_auth_table.first_name.requires = \ IS_NOT_EMPTY(error_message=auth.messages.is_empty) custom_auth_table.last_name.requires = \ IS_NOT_EMPTY(error_message=auth.messages.is_empty) custom_auth_table.password.requires = CRYPT() custom_auth_table.email.requires = [ IS_EMAIL(error_message=auth.messages.invalid_email), IS_NOT_IN_DB(db, custom_auth_table.email)] auth.settings.table_user = custom_auth_table # tell auth to use custom_auth_table ## before auth.define_tables() ##after that: from gluon.contrib.login_methods.motp_auth import motp_auth auth.settings.login_methods.append(motp_auth(db=db)) ##Instructions for using MOTP - after configuring motp for web2py, Install a MOTP client on your phone (android,IOS, java, windows phone, etc) - initialize the motp client (to reset a motp secret type in #**#), During user creation enter the secret generated during initialization into the motp_secret field in auth_user and similarly enter a pre-decided pin into the motp_pin - done.. to login, just generate a fresh OTP by typing in the pin and use the OTP as password ###To Dos### - both motp_secret and pin are stored in plain text! need to have some way of encrypting - web2py stores the password in db on successful login (should not happen) - maybe some utility or page to check the otp would be useful - as of now user field is hardcoded to email. Some way of selecting user table and user field. """ def verify_otp(otp, pin, secret, offset=60): epoch_time = int(time.time()) time_start = int(str(epoch_time - offset)[:-1]) time_end = int(str(epoch_time + offset)[:-1]) for t in range(time_start - 1, time_end + 1): to_hash = str(t) + secret + pin hash = md5(to_hash).hexdigest()[:6] if otp == hash: return True return False def motp_auth_aux(email, password, db=db, offset=time_offset): if db: user_data = db(db.auth_user.email == email).select().first() if user_data: if user_data['motp_secret'] and user_data['motp_pin']: motp_secret = user_data['motp_secret'] motp_pin = user_data['motp_pin'] otp_check = verify_otp( password, motp_pin, motp_secret, offset=offset) if otp_check: return True else: return False else: return False return False return motp_auth_aux ����������������web2py-2.12.3.orig/gluon/contrib/login_methods/saml2_auth.py����������������������������������������0000664�0000000�0000000�00000016035�12564727262�022520� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # -*- coding: utf-8 -*- """ This file is part of web2py Web Framework (Copyrighted, 2007-2014). Developed by Massimo Di Pierro <mdipierro@cs.depaul.edu>. License: LGPL v3 Login will be done via Web2py's CAS application, instead of web2py's login form. Include in your model (eg db.py):: auth.define_tables(username=True) from gluon.contrib.login_methods.saml2_auth import Saml2Auth import os auth.settings.login_form=Saml2Auth( config_file = os.path.join(request.folder,'private','sp_conf'), maps=dict( username=lambda v: v['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn'][0], email=lambda v: v['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn'][0], user_id=lambda v: v['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn'][0])) you must have private/sp_conf.py, the pysaml2 sp configuration file. For example: #!/usr/bin/env python # -*- coding: utf-8 -*- from saml2 import BINDING_HTTP_POST, BINDING_HTTP_REDIRECT import os.path import requests import tempfile BASEDIR = os.path.abspath(os.path.dirname(__file__)) # Web2py SP url and application name HOST = 'http://127.0.0.1:8000' APP = 'sp' # To load the IDP metadata... IDP_METADATA = 'http://127.0.0.1:8088/metadata' def full_path(local_file): return os.path.join(BASEDIR, local_file) CONFIG = { # your entity id, usually your subdomain plus the url to the metadata view. 'entityid': '%s/%s/default/metadata' % (HOST, APP), 'service': { 'sp' : { 'name': 'MYSP', 'endpoints': { 'assertion_consumer_service': [ ('%s/%s/default/user/login' % (HOST, APP), BINDING_HTTP_REDIRECT), ('%s/%s/default/user/login' % (HOST, APP), BINDING_HTTP_POST), ], }, }, }, # Your private and public key. 'key_file': full_path('pki/mykey.pem'), 'cert_file': full_path('pki/mycert.pem'), # where the remote metadata is stored 'metadata': { "remote": [{ "url": IDP_METADATA, "cert":full_path('pki/mycert.pem') }] }, } """ from saml2 import BINDING_HTTP_REDIRECT, BINDING_HTTP_POST from saml2.client import Saml2Client from gluon.utils import web2py_uuid from gluon import current, redirect, URL import os, types def obj2dict(obj, processed=None): """ converts any object into a dict, recursively """ processed = processed if not processed is None else set() if obj is None: return None if isinstance(obj,(int,long,str,unicode,float,bool)): return obj if id(obj) in processed: return '<reference>' processed.add(id(obj)) if isinstance(obj,(list,tuple)): return [obj2dict(item,processed) for item in obj] if not isinstance(obj, dict) and hasattr(obj,'__dict__'): obj = obj.__dict__ else: return repr(obj) return dict((key,obj2dict(value,processed)) for key,value in obj.items() if not key.startswith('_') and not type(value) in (types.FunctionType, types.LambdaType, types.BuiltinFunctionType, types.BuiltinMethodType)) def saml2_handler(session, request, config_filename = None): config_filename = config_filename or os.path.join(request.folder,'private','sp_conf') client = Saml2Client(config_file = config_filename) idps = client.metadata.with_descriptor("idpsso") entityid = idps.keys()[0] bindings = [BINDING_HTTP_REDIRECT, BINDING_HTTP_POST] binding, destination = client.pick_binding( "single_sign_on_service", bindings, "idpsso", entity_id=entityid) if request.env.request_method == 'GET': binding = BINDING_HTTP_REDIRECT elif request.env.request_method == 'POST': binding = BINDING_HTTP_POST if not request.vars.SAMLResponse: req_id, req = client.create_authn_request(destination, binding=binding) relay_state = web2py_uuid().replace('-','') session.saml_outstanding_queries = {req_id: request.url} session.saml_req_id = req_id http_args = client.apply_binding(binding, str(req), destination, relay_state=relay_state) return {'url':dict(http_args["headers"])['Location']} else: relay_state = request.vars.RelayState req_id = session.saml_req_id unquoted_response = request.vars.SAMLResponse res = {} try: data = client.parse_authn_request_response( unquoted_response, binding, session.saml_outstanding_queries) res['response'] = data if data else {} except Exception, e: import traceback res['error'] = traceback.format_exc() return res class Saml2Auth(object): def __init__(self, config_file=None, maps=dict( username=lambda v:v['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn'][0], email=lambda v:v['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn'][0], user_id=lambda v:v['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn'][0], )): self.config_file = config_file self.maps = maps def login_url(self, next="/"): d = saml2_handler(current.session, current.request) if 'url' in d: redirect(d['url']) elif 'error' in d: current.session.flash = d['error'] redirect(URL('default','index')) elif 'response' in d: # a['assertions'][0]['attribute_statement'][0]['attribute'] # is list of # {'name': 'http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname', 'name_format': None, 'text': None, 'friendly_name': None, 'attribute_value': [{'text': 'CAA\\dev-mdp', 'extension_attributes': "{'{http://www.w3.org/2001/XMLSchema-instance}type': 'xs:string'}", 'extension_elements': []}], 'extension_elements': [], 'extension_attributes': '{}'} try: attributes = d['response'].assertions[0].attribute_statement[0].attribute except: attributes = d['response'].assertion.attribute_statement[0].attribute current.session.saml2_info = dict( (a.name, [i.text for i in a.attribute_value]) for a in attributes) return next def logout_url(self, next="/"): current.session.saml2_info = None return next def get_user(self): user = current.session.saml2_info if user: d = {'source': 'web2py saml2'} for key in self.maps: d[key] = self.maps[key](user) return d return None ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/login_methods/linkedin_account.py����������������������������������0000664�0000000�0000000�00000003033�12564727262�023764� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # -*- coding: utf-8 -*- """ This file is part of web2py Web Framework (Copyrighted, 2007-2009). Developed by Massimo Di Pierro <mdipierro@cs.depaul.edu>. License: GPL v2 Thanks to Hans Donner <hans.donner@pobox.com> for GaeGoogleAccount. """ from gluon.http import HTTP try: import linkedin except ImportError: raise HTTP(400, "linkedin module not found") class LinkedInAccount(object): """ Login will be done via Google's Appengine login object, instead of web2py's login form. Include in your model (eg db.py):: from gluon.contrib.login_methods.linkedin_account import LinkedInAccount auth.settings.login_form=LinkedInAccount(request,KEY,SECRET,RETURN_URL) """ def __init__(self, request, key, secret, return_url): self.request = request self.api = linkedin.LinkedIn(key, secret, return_url) self.token = result = self.api.requestToken() def login_url(self, next="/"): return self.api.getAuthorizeURL(self.token) def logout_url(self, next="/"): return '' def get_user(self): result = self.request.vars.verifier and self.api.accessToken( verifier=self.request.vars.verifier) if result: profile = self.api.GetProfile() profile = self.api.GetProfile( profile).public_url = "http://www.linkedin.com/in/ozgurv" return dict(first_name=profile.first_name, last_name=profile.last_name, username=profile.id) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/login_methods/email_auth.py����������������������������������������0000664�0000000�0000000�00000002725�12564727262�022572� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������import smtplib import logging def email_auth(server="smtp.gmail.com:587", domain="@gmail.com", tls_mode=None): """ to use email_login: from gluon.contrib.login_methods.email_auth import email_auth auth.settings.login_methods.append(email_auth("smtp.gmail.com:587", "@gmail.com")) """ def email_auth_aux(email, password, server=server, domain=domain, tls_mode=tls_mode): if domain: if not isinstance(domain, (list, tuple)): domain = [str(domain)] if not [d for d in domain if email[-len(d):] == d]: return False (host, port) = server.split(':') if tls_mode is None: # then auto detect tls_mode = port == '587' try: server = None server = smtplib.SMTP(host, port) server.ehlo() if tls_mode: server.starttls() server.ehlo() server.login(email, password) server.quit() return True except: logging.exception('email_auth() failed') if server: try: server.quit() except: # server might already close connection after error pass return False return email_auth_aux �������������������������������������������web2py-2.12.3.orig/gluon/contrib/login_methods/browserid_account.py���������������������������������0000664�0000000�0000000�00000010567�12564727262�024201� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # -*- coding: utf-8 -*- """ BrowserID Authentication for web2py developed by Madhukar R Pai (Copyright 2012) Email <madspai@gmail.com> License : LGPL thanks and credits to the web2py community This custom authenticator allows web2py to authenticate using browserid (https://login.persona.org/) BrowserID is a project by Mozilla Labs (http://mozillalabs.com/) to Know how browserid works please visit http://identity.mozilla.com/post/7616727542/introducing-browserid-a-better-way-to-sign-in bottom line BrowserID provides a free, secure, de-centralized, easy to use(for users and developers) login solution. You can use any email id as your login id. Browserid just verifys the email id and lets you login with that id. credits for the doPost jquery function - itsadok (http://stackoverflow.com/users/7581/itsadok) """ import time from gluon import * from gluon.storage import Storage from gluon.tools import fetch import gluon.contrib.simplejson as json class BrowserID(object): """ from gluon.contrib.login_methods.browserid_account import BrowserID auth.settings.login_form = BrowserID(request, audience = "http://127.0.0.1:8000" assertion_post_url = "http://127.0.0.1:8000/%s/default/user/login" % request.application) """ def __init__(self, request, audience="", assertion_post_url="", prompt="BrowserID Login", issuer="login.persona.org", verify_url="https://login.persona.org/verify", browserid_js="https://login.persona.org/include.js", browserid_button="https://login.persona.org/i/sign_in_red.png", crypto_js="https://crypto-js.googlecode.com/files/2.2.0-crypto-md5.js", on_login_failure=None, ): self.request = request self.audience = audience self.assertion_post_url = assertion_post_url self.prompt = prompt self.issuer = issuer self.verify_url = verify_url self.browserid_js = browserid_js self.browserid_button = browserid_button self.crypto_js = crypto_js self.on_login_failure = on_login_failure self.asertion_js = """ (function($){$.extend({doPost:function(url,params){var $form=$("<form method='POST'>").attr("action",url); $.each(params,function(name,value){$("<input type='hidden'>").attr("name",name).attr("value",value).appendTo($form)}); $form.appendTo("body");$form.submit()}})})(jQuery); function gotVerifiedEmail(assertion){if(assertion !== null){$.doPost('%s',{'assertion':assertion});}}""" % self.assertion_post_url def get_user(self): request = self.request if request.vars.assertion: audience = self.audience issuer = self.issuer assertion = XML(request.vars.assertion, sanitize=True) verify_data = {'assertion': assertion, 'audience': audience} auth_info_json = fetch(self.verify_url, data=verify_data) j = json.loads(auth_info_json) epoch_time = int(time.time() * 1000) # we need 13 digit epoch time if j["status"] == "okay" and j["audience"] == audience and j['issuer'].endswith(issuer) and j['expires'] >= epoch_time: return dict(email=j['email']) elif self.on_login_failure: #print "status: ", j["status"]=="okay", j["status"] #print "audience:", j["audience"]==audience, j["audience"], audience #print "issuer: ", j["issuer"]==issuer, j["issuer"], issuer #print "expires: ", j["expires"] >= epoch_time, j["expires"], epoch_time redirect(self.on_login_failure) else: redirect('https://login.persona.org') return None def login_form(self): request = self.request onclick = "javascript:navigator.id.getVerifiedEmail(gotVerifiedEmail) ; return false" form = DIV(SCRIPT(_src=self.browserid_js, _type="text/javascript"), SCRIPT(_src=self.crypto_js, _type="text/javascript"), A(IMG(_src=self.browserid_button, _alt=self.prompt), _href="#", _onclick=onclick, _class="browserid", _title="Login With BrowserID"), SCRIPT(self.asertion_js)) return form �����������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/login_methods/ldap_auth.py�����������������������������������������0000664�0000000�0000000�00000076055�12564727262�022432� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # # last tinkered with by korylprince at gmail.com on 2012-07-12 # import sys import logging try: import ldap import ldap.filter ldap.set_option(ldap.OPT_REFERRALS, 0) except Exception, e: logging.error('missing ldap, try "easy_install python-ldap"') raise e def ldap_auth(server='ldap', port=None, base_dn='ou=users,dc=domain,dc=com', mode='uid', secure=False, cert_path=None, cert_file=None, cacert_path=None, cacert_file=None, key_file=None, bind_dn=None, bind_pw=None, filterstr='objectClass=*', username_attrib='uid', custom_scope='subtree', allowed_groups=None, manage_user=False, user_firstname_attrib='cn:1', user_lastname_attrib='cn:2', user_mail_attrib='mail', manage_groups=False, db=None, group_dn=None, group_name_attrib='cn', group_member_attrib='memberUid', group_filterstr='objectClass=*', tls=False, logging_level='error'): """ to use ldap login with MS Active Directory: from gluon.contrib.login_methods.ldap_auth import ldap_auth auth.settings.login_methods.append(ldap_auth( mode='ad', server='my.domain.controller', base_dn='ou=Users,dc=domain,dc=com')) to use ldap login with Notes Domino: auth.settings.login_methods.append(ldap_auth( mode='domino',server='my.domino.server')) to use ldap login with OpenLDAP: auth.settings.login_methods.append(ldap_auth( server='my.ldap.server', base_dn='ou=Users,dc=domain,dc=com')) to use ldap login with OpenLDAP and subtree search and (optionally) multiple DNs: auth.settings.login_methods.append(ldap_auth( mode='uid_r', server='my.ldap.server', base_dn=['ou=Users,dc=domain,dc=com','ou=Staff,dc=domain,dc=com'])) or (if using CN): auth.settings.login_methods.append(ldap_auth( mode='cn', server='my.ldap.server', base_dn='ou=Users,dc=domain,dc=com')) or you can full customize the search for user: auth.settings.login_methods.append(ldap_auth( mode='custom', server='my.ldap.server', base_dn='ou=Users,dc=domain,dc=com', username_attrib='uid', custom_scope='subtree')) the custom_scope can be: base, onelevel, subtree. If using secure ldaps:// pass secure=True and cert_path="..." If ldap is using GnuTLS then you need cert_file="..." instead cert_path because cert_path isn't implemented in GnuTLS :( To enable TLS, set tls=True: auth.settings.login_methods.append(ldap_auth( server='my.ldap.server', base_dn='ou=Users,dc=domain,dc=com', tls=True)) If you need to bind to the directory with an admin account in order to search it then specify bind_dn & bind_pw to use for this. - currently only implemented for Active Directory If you need to restrict the set of allowed users (e.g. to members of a department) then specify an rfc4515 search filter string. - currently only implemented for mode in ['ad', 'company', 'uid_r'] You can manage user attributes first name, last name, email from ldap: auth.settings.login_methods.append(ldap_auth(...as usual..., manage_user=True, user_firstname_attrib='cn:1', user_lastname_attrib='cn:2', user_mail_attrib='mail' )) Where: manage_user - let web2py handle user data from ldap user_firstname_attrib - the attribute containing the user's first name optionally you can specify parts. Example: cn: "John Smith" - 'cn:1'='John' user_lastname_attrib - the attribute containing the user's last name optionally you can specify parts. Example: cn: "John Smith" - 'cn:2'='Smith' user_mail_attrib - the attribute containing the user's email address If you need group control from ldap to web2py app's database feel free to set: auth.settings.login_methods.append(ldap_auth(...as usual..., manage_groups=True, db=db, group_dn='ou=Groups,dc=domain,dc=com', group_name_attrib='cn', group_member_attrib='memberUid', group_filterstr='objectClass=*' )) Where: manage_group - let web2py handle the groups from ldap db - is the database object (need to have auth_user, auth_group, auth_membership) group_dn - the ldap branch of the groups group_name_attrib - the attribute where the group name is stored group_member_attrib - the attribute containing the group members name group_filterstr - as the filterstr but for group select You can restrict login access to specific groups if you specify: auth.settings.login_methods.append(ldap_auth(...as usual..., allowed_groups=[...], group_dn='ou=Groups,dc=domain,dc=com', group_name_attrib='cn', group_member_attrib='memberUid',#use 'member' for Active Directory group_filterstr='objectClass=*' )) Where: allowed_groups - a list with allowed ldap group names group_dn - the ldap branch of the groups group_name_attrib - the attribute where the group name is stored group_member_attrib - the attribute containing the group members name group_filterstr - as the filterstr but for group select If using Active Directory you must specify bind_dn and bind_pw for allowed_groups unless anonymous bind works. You can set the logging level with the "logging_level" parameter, default is "error" and can be set to error, warning, info, debug. """ logger = logging.getLogger('web2py.auth.ldap_auth') if logging_level == 'error': logger.setLevel(logging.ERROR) elif logging_level == 'warning': logger.setLevel(logging.WARNING) elif logging_level == 'info': logger.setLevel(logging.INFO) elif logging_level == 'debug': logger.setLevel(logging.DEBUG) def ldap_auth_aux(username, password, ldap_server=server, ldap_port=port, ldap_basedn=base_dn, ldap_mode=mode, ldap_binddn=bind_dn, ldap_bindpw=bind_pw, secure=secure, cert_path=cert_path, cert_file=cert_file, cacert_file=cacert_file, key_file=key_file, filterstr=filterstr, username_attrib=username_attrib, custom_scope=custom_scope, manage_user=manage_user, user_firstname_attrib=user_firstname_attrib, user_lastname_attrib=user_lastname_attrib, user_mail_attrib=user_mail_attrib, manage_groups=manage_groups, allowed_groups=allowed_groups, db=db): if password == '': # http://tools.ietf.org/html/rfc4513#section-5.1.2 logger.warning('blank password not allowed') return False logger.debug('mode: [%s] manage_user: [%s] custom_scope: [%s]' ' manage_groups: [%s]' % (str(mode), str(manage_user), str(custom_scope), str(manage_groups))) if manage_user: if user_firstname_attrib.count(':') > 0: (user_firstname_attrib, user_firstname_part) = user_firstname_attrib.split(':', 1) user_firstname_part = (int(user_firstname_part) - 1) else: user_firstname_part = None if user_lastname_attrib.count(':') > 0: (user_lastname_attrib, user_lastname_part) = user_lastname_attrib.split(':', 1) user_lastname_part = (int(user_lastname_part) - 1) else: user_lastname_part = None user_firstname_attrib = ldap.filter.escape_filter_chars( user_firstname_attrib) user_lastname_attrib = ldap.filter.escape_filter_chars( user_lastname_attrib) user_mail_attrib = ldap.filter.escape_filter_chars( user_mail_attrib) try: if allowed_groups: if not is_user_in_allowed_groups(username, password): return False con = init_ldap() if ldap_mode == 'ad': # Microsoft Active Directory if '@' not in username: domain = [] for x in ldap_basedn.split(','): if "DC=" in x.upper(): domain.append(x.split('=')[-1]) username = "%s@%s" % (username, '.'.join(domain)) username_bare = username.split("@")[0] con.set_option(ldap.OPT_PROTOCOL_VERSION, 3) # In cases where ForestDnsZones and DomainDnsZones are found, # result will look like the following: # ['ldap://ForestDnsZones.domain.com/DC=ForestDnsZones, # DC=domain,DC=com'] if ldap_binddn: # need to search directory with an admin account 1st con.simple_bind_s(ldap_binddn, ldap_bindpw) else: # credentials should be in the form of username@domain.tld con.simple_bind_s(username, password) # this will throw an index error if the account is not found # in the ldap_basedn requested_attrs = ['sAMAccountName'] if manage_user: requested_attrs.extend([user_firstname_attrib, user_lastname_attrib, user_mail_attrib]) result = con.search_ext_s( ldap_basedn, ldap.SCOPE_SUBTREE, "(&(sAMAccountName=%s)(%s))" % ( ldap.filter.escape_filter_chars(username_bare), filterstr), requested_attrs)[0][1] if not isinstance(result, dict): # result should be a dict in the form # {'sAMAccountName': [username_bare]} logger.warning('User [%s] not found!' % username) return False if ldap_binddn: # We know the user exists & is in the correct OU # so now we just check the password con.simple_bind_s(username, password) username = username_bare if ldap_mode == 'domino': # Notes Domino if "@" in username: username = username.split("@")[0] con.simple_bind_s(username, password) if manage_user: # TODO: sorry I have no clue how to query attrs in domino result = {user_firstname_attrib: username, user_lastname_attrib: None, user_mail_attrib: None} if ldap_mode == 'cn': # OpenLDAP (CN) if ldap_binddn and ldap_bindpw: con.simple_bind_s(ldap_binddn, ldap_bindpw) dn = "cn=" + username + "," + ldap_basedn con.simple_bind_s(dn, password) if manage_user: result = con.search_s(dn, ldap.SCOPE_BASE, "(objectClass=*)", [user_firstname_attrib, user_lastname_attrib, user_mail_attrib])[0][1] if ldap_mode == 'uid': # OpenLDAP (UID) if ldap_binddn and ldap_bindpw: con.simple_bind_s(ldap_binddn, ldap_bindpw) dn = "uid=" + username + "," + ldap_basedn dn = con.search_s(ldap_basedn, ldap.SCOPE_SUBTREE, "(uid=%s)"%username, [''])[0][0] else: dn = "uid=" + username + "," + ldap_basedn con.simple_bind_s(dn, password) if manage_user: result = con.search_s(dn, ldap.SCOPE_BASE, "(objectClass=*)", [user_firstname_attrib, user_lastname_attrib, user_mail_attrib])[0][1] if ldap_mode == 'company': # no DNs or password needed to search directory dn = "" pw = "" # bind anonymously con.simple_bind_s(dn, pw) # search by e-mail address filter = '(&(mail=%s)(%s))' % ( ldap.filter.escape_filter_chars(username), filterstr) # find the uid attrs = ['uid'] if manage_user: attrs.extend([user_firstname_attrib, user_lastname_attrib, user_mail_attrib]) # perform the actual search company_search_result = con.search_s(ldap_basedn, ldap.SCOPE_SUBTREE, filter, attrs) dn = company_search_result[0][0] result = company_search_result[0][1] # perform the real authentication test con.simple_bind_s(dn, password) if ldap_mode == 'uid_r': # OpenLDAP (UID) with subtree search and multiple DNs if isinstance(ldap_basedn, list): basedns = ldap_basedn else: basedns = [ldap_basedn] filter = '(&(uid=%s)(%s))' % ( ldap.filter.escape_filter_chars(username), filterstr) found = False for basedn in basedns: try: result = con.search_s(basedn, ldap.SCOPE_SUBTREE, filter) if result: user_dn = result[0][0] # Check the password con.simple_bind_s(user_dn, password) found = True break except ldap.LDAPError, detail: (exc_type, exc_value) = sys.exc_info()[:2] logger.warning( "ldap_auth: searching %s for %s resulted in %s: %s\n" % (basedn, filter, exc_type, exc_value) ) if not found: logger.warning('User [%s] not found!' % username) return False result = result[0][1] if ldap_mode == 'custom': # OpenLDAP (username_attrs) with subtree search and # multiple DNs if isinstance(ldap_basedn, list): basedns = ldap_basedn else: basedns = [ldap_basedn] filter = '(&(%s=%s)(%s))' % (username_attrib, ldap.filter.escape_filter_chars( username), filterstr) if custom_scope == 'subtree': ldap_scope = ldap.SCOPE_SUBTREE elif custom_scope == 'base': ldap_scope = ldap.SCOPE_BASE elif custom_scope == 'onelevel': ldap_scope = ldap.SCOPE_ONELEVEL found = False for basedn in basedns: try: result = con.search_s(basedn, ldap_scope, filter) if result: user_dn = result[0][0] # Check the password con.simple_bind_s(user_dn, password) found = True break except ldap.LDAPError, detail: (exc_type, exc_value) = sys.exc_info()[:2] logger.warning( "ldap_auth: searching %s for %s resulted in %s: %s\n" % (basedn, filter, exc_type, exc_value) ) if not found: logger.warning('User [%s] not found!' % username) return False result = result[0][1] if manage_user: logger.info('[%s] Manage user data' % str(username)) try: if user_firstname_part is not None: store_user_firstname = result[user_firstname_attrib][ 0].split(' ', 1)[user_firstname_part] else: store_user_firstname = result[user_firstname_attrib][0] except KeyError, e: store_user_firstname = None try: if user_lastname_part is not None: store_user_lastname = result[user_lastname_attrib][ 0].split(' ', 1)[user_lastname_part] else: store_user_lastname = result[user_lastname_attrib][0] except KeyError, e: store_user_lastname = None try: store_user_mail = result[user_mail_attrib][0] except KeyError, e: store_user_mail = None try: # # user as username # ################# user_in_db = db(db.auth_user.username == username) if user_in_db.count() > 0: user_in_db.update(first_name=store_user_firstname, last_name=store_user_lastname, email=store_user_mail) else: db.auth_user.insert(first_name=store_user_firstname, last_name=store_user_lastname, email=store_user_mail, username=username) except: # # user as email # ############## user_in_db = db(db.auth_user.email == username) if user_in_db.count() > 0: user_in_db.update(first_name=store_user_firstname, last_name=store_user_lastname) else: db.auth_user.insert(first_name=store_user_firstname, last_name=store_user_lastname, email=username) con.unbind() if manage_groups: if not do_manage_groups(username, password): return False return True except ldap.INVALID_CREDENTIALS, e: return False except ldap.LDAPError, e: import traceback logger.warning('[%s] Error in ldap processing' % str(username)) logger.debug(traceback.format_exc()) return False except IndexError, ex: # for AD membership test import traceback logger.warning('[%s] Ldap result indexing error' % str(username)) logger.debug(traceback.format_exc()) return False def is_user_in_allowed_groups(username, password=None, allowed_groups=allowed_groups): """ Figure out if the username is a member of an allowed group in ldap or not """ # # Get all group name where the user is in actually in ldap # ######################################################### ldap_groups_of_the_user = get_user_groups_from_ldap(username, password) # search for allowed group names if type(allowed_groups) != type(list()): allowed_groups = [allowed_groups] for group in allowed_groups: if ldap_groups_of_the_user.count(group) > 0: # Match return True # No match return False def do_manage_groups(username, password=None, db=db): """ Manage user groups Get all user's group from ldap and refresh the already stored ones in web2py's application database or create new groups according to ldap. """ logger.info('[%s] Manage user groups' % str(username)) try: # # Get all group name where the user is in actually in ldap # ######################################################### ldap_groups_of_the_user = get_user_groups_from_ldap( username, password) # # Get all group name where the user is in actually in local db # ############################################################# try: db_user_id = db(db.auth_user.username == username).select( db.auth_user.id).first().id except: try: db_user_id = db(db.auth_user.email == username).select( db.auth_user.id).first().id except AttributeError, e: # # There is no user in local db # We create one # ############################## try: db_user_id = db.auth_user.insert(username=username, first_name=username) except AttributeError, e: db_user_id = db.auth_user.insert(email=username, first_name=username) if not db_user_id: logging.error( 'There is no username or email for %s!' % username) raise # if old pydal version, assume this is a relational database which can do joins db_can_join = db.can_join() if hasattr(db, 'can_join') else True if db_can_join: db_group_search = db( (db.auth_membership.user_id == db_user_id) & (db.auth_user.id == db.auth_membership.user_id) & (db.auth_group.id == db.auth_membership.group_id)) else: # no joins on NoSQL databases, perform two queries db_group_search = db(db.auth_membership.user_id == db_user_id) group_ids = [x.group_id for x in db_group_search.select( db.auth_membership.group_id, distinct=True)] db_group_search = db(db.auth_group.id.belongs(group_ids)) db_groups_of_the_user = list() db_group_id = dict() if db_group_search.count() > 0: for group in db_group_search.select(db.auth_group.id, db.auth_group.role, distinct=True): db_group_id[group.role] = group.id db_groups_of_the_user.append(group.role) logging.debug('db groups of user %s: %s' % (username, str(db_groups_of_the_user))) # # Delete user membership from groups where user is not anymore # ############################################################# for group_to_del in db_groups_of_the_user: if ldap_groups_of_the_user.count(group_to_del) == 0: db((db.auth_membership.user_id == db_user_id) & (db.auth_membership.group_id == \ db_group_id[group_to_del])).delete() # # Create user membership in groups where user is not in already # ############################################################## for group_to_add in ldap_groups_of_the_user: if db_groups_of_the_user.count(group_to_add) == 0: if db(db.auth_group.role == group_to_add).count() == 0: gid = db.auth_group.insert(role=group_to_add, description='Generated from LDAP') else: gid = db(db.auth_group.role == group_to_add).select( db.auth_group.id).first().id db.auth_membership.insert(user_id=db_user_id, group_id=gid) except: logger.warning("[%s] Groups are not managed successfully!" % str(username)) import traceback logger.debug(traceback.format_exc()) return False return True def init_ldap(ldap_server=server, ldap_port=port, ldap_basedn=base_dn, ldap_mode=mode, secure=secure, cert_path=cert_path, cert_file=cert_file, cacert_file=cacert_file, key_file=key_file): """ Inicialize ldap connection """ logger.info('[%s] Initialize ldap connection' % str(ldap_server)) if secure: if not ldap_port: ldap_port = 636 if cacert_path: ldap.set_option(ldap.OPT_X_TLS_CACERTDIR, cacert_path) if cacert_file: ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER) ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, cacert_file) if cert_file: ldap.set_option(ldap.OPT_X_TLS_CERTFILE, cert_file) if key_file: ldap.set_option(ldap.OPT_X_TLS_KEYFILE, key_file) con = ldap.initialize("ldaps://" + ldap_server + ":" + str(ldap_port)) else: if not ldap_port: ldap_port = 389 con = ldap.initialize( "ldap://" + ldap_server + ":" + str(ldap_port)) if tls: con.start_tls_s() return con def get_user_groups_from_ldap(username, password=None, base_dn=base_dn, ldap_binddn=bind_dn, ldap_bindpw=bind_pw, group_dn=group_dn, group_name_attrib=group_name_attrib, group_member_attrib=group_member_attrib, group_filterstr=group_filterstr, ldap_mode=mode): """ Get all group names from ldap where the user is in """ logger.info('[%s] Get user groups from ldap' % str(username)) # # Get all group name where the user is in actually in ldap # ######################################################### # Initialize ldap if not group_dn: group_dn = base_dn con = init_ldap() logger.debug('Username init: [%s]' % username) if ldap_mode == 'ad': # # Get the AD username # #################### if '@' not in username: domain = [] for x in base_dn.split(','): if "DC=" in x.upper(): domain.append(x.split('=')[-1]) username = "%s@%s" % (username, '.'.join(domain)) username_bare = username.split("@")[0] con.set_option(ldap.OPT_PROTOCOL_VERSION, 3) # In cases where ForestDnsZones and DomainDnsZones are found, # result will look like the following: # ['ldap://ForestDnsZones.domain.com/DC=ForestDnsZones, # DC=domain,DC=com'] if ldap_binddn: # need to search directory with an admin account 1st con.simple_bind_s(ldap_binddn, ldap_bindpw) logger.debug('Ldap bind connect...') else: # credentials should be in the form of username@domain.tld con.simple_bind_s(username, password) logger.debug('Ldap username connect...') # We have to use the full string username = con.search_ext_s(base_dn, ldap.SCOPE_SUBTREE, "(&(sAMAccountName=%s)(%s))" % (ldap.filter.escape_filter_chars(username_bare), filterstr), ["cn"])[0][0] else: if ldap_binddn: # need to search directory with an bind_dn account 1st con.simple_bind_s(ldap_binddn, ldap_bindpw) else: # bind as anonymous con.simple_bind_s('', '') # if username is None, return empty list if username is None: return list() # search for groups where user is in filter = '(&(%s=%s)(%s))' % (ldap.filter.escape_filter_chars( group_member_attrib ), ldap.filter.escape_filter_chars(username), group_filterstr) group_search_result = con.search_s(group_dn, ldap.SCOPE_SUBTREE, filter, [group_name_attrib]) ldap_groups_of_the_user = list() for group_row in group_search_result: group = group_row[1] if type(group) == dict and group.has_key(group_name_attrib): ldap_groups_of_the_user.extend(group[group_name_attrib]) con.unbind() logger.debug('User groups: %s' % ldap_groups_of_the_user) return list(ldap_groups_of_the_user) if filterstr[0] == '(' and filterstr[-1] == ')': # rfc4515 syntax filterstr = filterstr[1:-1] # parens added again where used return ldap_auth_aux �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/login_methods/cas_auth.py������������������������������������������0000664�0000000�0000000�00000012257�12564727262�022252� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # -*- coding: utf-8 -*- """ This file is part of web2py Web Framework (Copyrighted, 2007-2009). Developed by Massimo Di Pierro <mdipierro@cs.depaul.edu>. License: LGPL v3 Tinkered by Szabolcs Gyuris < szimszo n @ o regpreshaz dot eu> """ from gluon import current, redirect, URL class CasAuth(object): """ Login will be done via Web2py's CAS application, instead of web2py's login form. Include in your model (eg db.py):: from gluon.contrib.login_methods.cas_auth import CasAuth auth.define_tables(username=True) auth.settings.login_form=CasAuth( urlbase = "https://[your CAS provider]/app/default/user/cas", actions=['login','validate','logout']) where urlbase is the actual CAS server url without the login,logout... Enjoy. ###UPDATE### if you want to connect to a CAS version 2 JASIG Server use this: auth.settings.login_form=CasAuth( urlbase = "https://[Your CAS server]/cas", actions = ['login','serviceValidate','logout'], casversion = 2, casusername = "cas:user") where casusername is the xml node returned by CAS server which contains user's username. """ def __init__(self, g=None, # g for backward compatibility ### urlbase="https://web2py.com/cas/cas", actions=['login', 'validate', 'logout'], maps=dict(username=lambda v: v.get('username', v['user']), email=lambda v: v.get('email', None), user_id=lambda v: v['user']), casversion=1, casusername='cas:user' ): self.urlbase = urlbase self.cas_login_url = "%s/%s" % (self.urlbase, actions[0]) self.cas_check_url = "%s/%s" % (self.urlbase, actions[1]) self.cas_logout_url = "%s/%s" % (self.urlbase, actions[2]) self.maps = maps self.casversion = casversion self.casusername = casusername # vars commented because of # https://code.google.com/p/web2py/issues/detail?id=1774 self.cas_my_url = URL(args=current.request.args, #vars=current.request.vars, scheme=True) def login_url(self, next="/"): current.session.token = self._CAS_login() return next def logout_url(self, next="/"): current.session.token = None current.session.auth = None self._CAS_logout() return next def get_user(self): user = current.session.token if user: d = {'source': 'web2py cas'} for key in self.maps: d[key] = self.maps[key](user) return d return None def _CAS_login(self): """ exposed as CAS.login(request) returns a token on success, None on failed authentication """ import urllib self.ticket = current.request.vars.ticket if not current.request.vars.ticket: redirect("%s?service=%s" % (self.cas_login_url, self.cas_my_url)) else: url = "%s?service=%s&ticket=%s" % (self.cas_check_url, self.cas_my_url, self.ticket) data = urllib.urlopen(url).read() if data.startswith('yes') or data.startswith('no'): data = data.split('\n') if data[0] == 'yes': if ':' in data[1]: # for Compatibility with Custom CAS items = data[1].split(':') a = items[0] b = len(items) > 1 and items[1] or a c = len(items) > 2 and items[2] or b else: a = b = c = data[1] return dict(user=a, email=b, username=c) return None import xml.dom.minidom as dom import xml.parsers.expat as expat try: dxml = dom.parseString(data) envelop = dxml.getElementsByTagName( "cas:authenticationSuccess") if len(envelop) > 0: res = dict() for x in envelop[0].childNodes: if x.nodeName.startswith('cas:') and len(x.childNodes): key = x.nodeName[4:].encode('utf8') value = x.childNodes[0].nodeValue.encode('utf8') if not key in res: res[key] = value else: if not isinstance(res[key], list): res[key] = [res[key]] res[key].append(value) return res except expat.ExpatError: pass return None # fallback def _CAS_logout(self): """ exposed CAS.logout() redirects to the CAS logout page """ import urllib redirect("%s?service=%s" % (self.cas_logout_url, self.cas_my_url)) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/login_methods/extended_login_form.py�������������������������������0000664�0000000�0000000�00000006706�12564727262�024500� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # coding: utf8 """ ExtendedLoginForm is used to extend normal login form in web2py with one more login method. So user can choose the built-in login or extended login methods. """ from gluon import current, DIV class ExtendedLoginForm(object): """ Put extended_login_form under web2py/gluon/contrib/login_methods folder. Then inside your model where defines the auth: auth = Auth(globals(),db) # authentication/authorization ... auth.define_tables() # You might like to put the code after auth.define_tables ... # if the alt_login_form deals with tables of auth. alt_login_form = RPXAccount(request, api_key="...", domain="...", url = "http://localhost:8000/%s/default/user/login" % request.application) extended_login_form = ExtendedLoginForm( auth, alt_login_form, signals=['token']) auth.settings.login_form = extended_login_form Note: Since rpx_account doesn't create the password for the user, you might need to provide a way for user to create password to do normal login. """ def __init__(self, auth, alt_login_form, signals=[], login_arg='login' ): self.auth = auth self.alt_login_form = alt_login_form self.signals = signals self.login_arg = login_arg def get_user(self): """ Delegate the get_user to alt_login_form.get_user. """ if hasattr(self.alt_login_form, 'get_user'): return self.alt_login_form.get_user() return None # let gluon.tools.Auth.get_or_create_user do the rest def login_url(self, next): """ Optional implement for alt_login_form. In normal case, this should be replaced by get_user, and never get called. """ if hasattr(self.alt_login_form, 'login_url'): return self.alt_login_form.login_url(next) return self.auth.settings.login_url def logout_url(self, next): """ Optional implement for alt_login_form. Called if bool(alt_login_form.get_user) is True. If alt_login_form implemented logout_url function, it will return that function call. """ if hasattr(self.alt_login_form, 'logout_url'): return self.alt_login_form.logout_url(next) return next def login_form(self): """ Combine the auth() form with alt_login_form. If signals are set and a parameter in request matches any signals, it will return the call of alt_login_form.login_form instead. So alt_login_form can handle some particular situations, for example, multiple steps of OpenID login inside alt_login_form.login_form. Otherwise it will render the normal login form combined with alt_login_form.login_form. """ request = current.request args = request.args if (self.signals and any([True for signal in self.signals if signal in request.vars]) ): return self.alt_login_form.login_form() self.auth.settings.login_form = self.auth form = DIV(self.auth()) self.auth.settings.login_form = self form.components.append(self.alt_login_form.login_form()) return form ����������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/login_methods/pam_auth.py������������������������������������������0000664�0000000�0000000�00000001047�12564727262�022254� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������from gluon.contrib.pam import authenticate def pam_auth(): """ to use pam_login: from gluon.contrib.login_methods.pam_auth import pam_auth auth.settings.login_methods.append(pam_auth()) or auth.settings.actions_disabled=[ 'register','change_password','request_reset_password'] auth.settings.login_methods=[pam_auth()] The latter method will not store the user password in auth_user. """ def pam_auth_aux(username, password): return authenticate(username, password) return pam_auth_aux �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/login_methods/gae_google_account.py��������������������������������0000664�0000000�0000000�00000002172�12564727262�024262� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # -*- coding: utf-8 -*- """ This file is part of web2py Web Framework (Copyrighted, 2007-2009). Developed by Massimo Di Pierro <mdipierro@cs.depaul.edu>. License: LGPL v3 Thanks to Hans Donner <hans.donner@pobox.com> for GaeGoogleAccount. """ from google.appengine.api import users class GaeGoogleAccount(object): """ Login will be done via Google's Appengine login object, instead of web2py's login form. Include in your model (eg db.py):: from gluon.contrib.login_methods.gae_google_account import \ GaeGoogleAccount auth.settings.login_form=GaeGoogleAccount() """ def login_url(self, next="/"): return users.create_login_url(next) def logout_url(self, next="/"): return users.create_logout_url(next) def get_user(self): user = users.get_current_user() if user: return dict(nickname = user.nickname(), email = user.email(), registration_id = user.user_id(), user_id = user.user_id(), source = "google account") ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/login_methods/loginza.py�������������������������������������������0000664�0000000�0000000�00000010761�12564727262�022124� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # -*- coding: utf-8 -*- """ Loginza.ru authentication for web2py Developed by Vladimir Dronnikov (Copyright © 2011) Email <dronnikov@gmail.com> """ import urllib from gluon.html import * from gluon.tools import fetch from gluon.storage import Storage import gluon.contrib.simplejson as json class Loginza(object): """ from gluon.contrib.login_methods.loginza import Loginza auth.settings.login_form = Loginza(request, url = "http://localhost:8000/%s/default/user/login" % request.application) """ def __init__(self, request, url="", embed=True, auth_url="http://loginza.ru/api/authinfo", language="en", prompt="loginza", on_login_failure=None, ): self.request = request self.token_url = url self.embed = embed self.auth_url = auth_url self.language = language self.prompt = prompt self.profile = None self.on_login_failure = on_login_failure self.mappings = Storage() # TODO: profile.photo is the URL to the picture # Howto download and store it locally? # FIXME: what if email is unique=True self.mappings["http://twitter.com/"] = lambda profile:\ dict(registration_id=profile.get("identity", ""), username=profile.get("nickname", ""), email=profile.get("email", ""), last_name=profile.get("name", "").get("full_name", ""), #avatar = profile.get("photo",""), ) self.mappings["https://www.google.com/accounts/o8/ud"] = lambda profile:\ dict(registration_id=profile.get("identity", ""), username=profile.get("name", "").get("full_name", ""), email=profile.get("email", ""), first_name=profile.get("name", "").get("first_name", ""), last_name=profile.get("name", "").get("last_name", ""), #avatar = profile.get("photo",""), ) self.mappings["http://vkontakte.ru/"] = lambda profile:\ dict(registration_id=profile.get("identity", ""), username=profile.get("name", "").get("full_name", ""), email=profile.get("email", ""), first_name=profile.get("name", "").get("first_name", ""), last_name=profile.get("name", "").get("last_name", ""), #avatar = profile.get("photo",""), ) self.mappings.default = lambda profile:\ dict(registration_id=profile.get("identity", ""), username=profile.get("name", "").get("full_name"), email=profile.get("email", ""), first_name=profile.get("name", "").get("first_name", ""), last_name=profile.get("name", "").get("last_name", ""), #avatar = profile.get("photo",""), ) def get_user(self): request = self.request if request.vars.token: user = Storage() data = urllib.urlencode(dict(token=request.vars.token)) auth_info_json = fetch(self.auth_url + '?' + data) #print auth_info_json auth_info = json.loads(auth_info_json) if auth_info["identity"] is not None: self.profile = auth_info provider = self.profile["provider"] user = self.mappings.get( provider, self.mappings.default)(self.profile) #user["password"] = ??? #user["avatar"] = ??? return user elif self.on_login_failure: redirect(self.on_login_failure) return None def login_form(self): request = self.request args = request.args LOGINZA_URL = "https://loginza.ru/api/widget?lang=%s&token_url=%s&overlay=loginza" if self.embed: form = IFRAME(_src=LOGINZA_URL % (self.language, self.token_url), _scrolling="no", _frameborder="no", _style="width:359px;height:300px;") else: form = DIV( A(self.prompt, _href=LOGINZA_URL % ( self.language, self.token_url), _class="loginza"), SCRIPT(_src="https://s3-eu-west-1.amazonaws.com/s1.loginza.ru/js/widget.js", _type="text/javascript")) return form ���������������web2py-2.12.3.orig/gluon/contrib/pyuca/�������������������������������������������������������������0000775�0000000�0000000�00000000000�12564727262�016370� 5����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/pyuca/LICENSE������������������������������������������������������0000664�0000000�0000000�00000002133�12564727262�017374� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (c) 2006-2012 James Tauber and contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE.�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/pyuca/__init__.py��������������������������������������������������0000664�0000000�0000000�00000000347�12564727262�020505� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������import os import pyuca unicode_collator = None def set_unicode_collator(file): global unicode_collator unicode_collator = pyuca.Collator(file) set_unicode_collator(os.path.join(os.path.dirname(__file__), 'allkeys.txt')) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/pyuca/README.markmin�����������������������������������������������0000664�0000000�0000000�00000003157�12564727262�020713� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# pyuca: Python Unicode Collation Algorithm implementation (http://jtauber.com/blog/2006/01/27/python_unicode_collation_algorithm/) This is my preliminary attempt at a Python implementation of the [Unicode Collation Algorithm (UCA)](http://unicode.org/reports/tr10/). I originally posted it to my blog in 2006 but it seems to get enough usage it really belongs here (and in PyPI). What do you use it for? In short, sorting non-English strings properly. The core of the algorithm involves multi-level comparison. For example, ``café`` comes before ``caff`` because at the primary level, the accent is ignored and the first word is treated as if it were ``cafe``. The secondary level (which considers accents) only applies then to words that are equivalent at the primary level. The Unicode Collation Algorithm and pyuca also support contraction and expansion. **Contraction** is where multiple letters are treated as a single unit. In Spanish, ``ch`` is treated as a letter coming between ``c`` and ``d`` so that, for example, words beginning ``ch`` should sort after all other words beginnings with ``c``. **Expansion** is where a single letter is treated as though it were multiple letters. In German, ``ä`` is sorted as if it were ``ae``, i.e. after ``ad`` but before ``af``. ## Here is how to use the ``pyuca`` module: `` git clone https://github.com/jtauber/pyuca.git cd pyuca pip install pyuca `` **Usage example:** `` from pyuca import Collator c = Collator("allkeys.txt") sorted_words = sorted(words, key=c.sort_key) `` ``allkeys.txt`` (1 MB) is available at http://www.unicode.org/Public/UCA/latest/allkeys.txt �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/pyuca/pyuca.py�����������������������������������������������������0000664�0000000�0000000�00000011432�12564727262�020064� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# pyuca - Unicode Collation Algorithm # Version: 2012-06-21 # # James Tauber # http://jtauber.com/ # Copyright (c) 2006-2012 James Tauber and contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. """ Preliminary implementation of the Unicode Collation Algorithm. This only implements the simple parts of the algorithm but I have successfully tested it using the Default Unicode Collation Element Table (DUCET) to collate Ancient Greek correctly. Usage example: from pyuca import Collator c = Collator("allkeys.txt") sorted_words = sorted(words, key=c.sort_key) allkeys.txt (1 MB) is available at http://www.unicode.org/Public/UCA/latest/allkeys.txt but you can always subset this for just the characters you are dealing with. """ class Node: def __init__(self): self.value = None self.children = {} class Trie: def __init__(self): self.root = Node() def add(self, key, value): curr_node = self.root for part in key: curr_node = curr_node.children.setdefault(part, Node()) curr_node.value = value def find_prefix(self, key): curr_node = self.root remainder = key for part in key: if part not in curr_node.children: break curr_node = curr_node.children[part] remainder = remainder[1:] return (curr_node.value, remainder) class Collator: def __init__(self, filename): self.table = Trie() self.load(filename) def load(self, filename): for line in open(filename): if line.startswith("#") or line.startswith("%"): continue if line.strip() == "": continue line = line[:line.find("#")] + "\n" line = line[:line.find("%")] + "\n" line = line.strip() if line.startswith("@"): pass else: semicolon = line.find(";") charList = line[:semicolon].strip().split() x = line[semicolon:] collElements = [] while True: begin = x.find("[") if begin == -1: break end = x[begin:].find("]") collElement = x[begin:begin+end+1] x = x[begin + 1:] alt = collElement[1] chars = collElement[2:-1].split(".") collElements.append((alt, chars)) integer_points = [int(ch, 16) for ch in charList] self.table.add(integer_points, collElements) def sort_key(self, string): collation_elements = [] lookup_key = [ord(ch) for ch in string] while lookup_key: value, lookup_key = self.table.find_prefix(lookup_key) if not value: # Calculate implicit weighting for CJK Ideographs # contributed by David Schneider 2009-07-27 # http://www.unicode.org/reports/tr10/#Implicit_Weights value = [] value.append((".", ["%X" % (0xFB40 + (lookup_key[0] >> 15)), "0020", "0002", "0001"])) value.append((".", ["%X" % ((lookup_key[0] & 0x7FFF) | 0x8000), "0000", "0000", "0000"])) lookup_key = lookup_key[1:] collation_elements.extend(value) sort_key = [] for level in range(4): if level: sort_key.append(0) # level separator for element in collation_elements: ce_l = int(element[1][level], 16) if ce_l: sort_key.append(ce_l) return tuple(sort_key) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/pyuca/allkeys.txt��������������������������������������������������0000664�0000000�0000000�00006267044�12564727262�020620� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# unidata-6.1.0.txt # Date: 2011-12-06, 16:57:32 GMT [KW] # # This file defines the Default Unicode Collation Element Table # (DUCET) for the Unicode Collation Algorithm # # Copyright (c) 2001-2011 Unicode, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # # See UTS #10, Unicode Collation Algorithm, for more information. # # Diagnostic weight ranges # Primary weight range: 0200..430F (16656) # Secondary weight range: 0020..0177 (344) # Variant secondaries: 0139..013E (6) # Digit secondaries: 013F..0177 (57) # Tertiary weight range: 0002..001F (30) # @version 6.1.0 0000 ; [.0000.0000.0000.0000] # [0000] NULL (in 6429) 0001 ; [.0000.0000.0000.0000] # [0001] START OF HEADING (in 6429) 0002 ; [.0000.0000.0000.0000] # [0002] START OF TEXT (in 6429) 0003 ; [.0000.0000.0000.0000] # [0003] END OF TEXT (in 6429) 0004 ; [.0000.0000.0000.0000] # [0004] END OF TRANSMISSION (in 6429) 0005 ; [.0000.0000.0000.0000] # [0005] ENQUIRY (in 6429) 0006 ; [.0000.0000.0000.0000] # [0006] ACKNOWLEDGE (in 6429) 0007 ; [.0000.0000.0000.0000] # [0007] BELL (in 6429) 0008 ; [.0000.0000.0000.0000] # [0008] BACKSPACE (in 6429) 000E ; [.0000.0000.0000.0000] # [000E] SHIFT OUT (in 6429) 000F ; [.0000.0000.0000.0000] # [000F] SHIFT IN (in 6429) 0010 ; [.0000.0000.0000.0000] # [0010] DATA LINK ESCAPE (in 6429) 0011 ; [.0000.0000.0000.0000] # [0011] DEVICE CONTROL ONE (in 6429) 0012 ; [.0000.0000.0000.0000] # [0012] DEVICE CONTROL TWO (in 6429) 0013 ; [.0000.0000.0000.0000] # [0013] DEVICE CONTROL THREE (in 6429) 0014 ; [.0000.0000.0000.0000] # [0014] DEVICE CONTROL FOUR (in 6429) 0015 ; [.0000.0000.0000.0000] # [0015] NEGATIVE ACKNOWLEDGE (in 6429) 0016 ; [.0000.0000.0000.0000] # [0016] SYNCHRONOUS IDLE (in 6429) 0017 ; [.0000.0000.0000.0000] # [0017] END OF TRANSMISSION BLOCK (in 6429) 0018 ; [.0000.0000.0000.0000] # [0018] CANCEL (in 6429) 0019 ; [.0000.0000.0000.0000] # [0019] END OF MEDIUM (in 6429) 001A ; [.0000.0000.0000.0000] # [001A] SUBSTITUTE (in 6429) 001B ; [.0000.0000.0000.0000] # [001B] ESCAPE (in 6429) 001C ; [.0000.0000.0000.0000] # [001C] FILE SEPARATOR (in 6429) 001D ; [.0000.0000.0000.0000] # [001D] GROUP SEPARATOR (in 6429) 001E ; [.0000.0000.0000.0000] # [001E] RECORD SEPARATOR (in 6429) 001F ; [.0000.0000.0000.0000] # [001F] UNIT SEPARATOR (in 6429) 007F ; [.0000.0000.0000.0000] # [007F] DELETE (in 6429) 0080 ; [.0000.0000.0000.0000] # [0080] <control> 0081 ; [.0000.0000.0000.0000] # [0081] <control> 0082 ; [.0000.0000.0000.0000] # [0082] BREAK PERMITTED HERE (in 6429) 0083 ; [.0000.0000.0000.0000] # [0083] NO BREAK HERE (in 6429) 0084 ; [.0000.0000.0000.0000] # [0084] <control> 0086 ; [.0000.0000.0000.0000] # [0086] START OF SELECTED AREA (in 6429) 0087 ; [.0000.0000.0000.0000] # [0087] END OF SELECTED AREA (in 6429) 0088 ; [.0000.0000.0000.0000] # [0088] CHARACTER TABULATION SET (in 6429) 0089 ; [.0000.0000.0000.0000] # [0089] CHARACTER TABULATION WITH JUSTIFICATION (in 6429) 008A ; [.0000.0000.0000.0000] # [008A] LINE TABULATION SET (in 6429) 008B ; [.0000.0000.0000.0000] # [008B] PARTIAL LINE FORWARD (in 6429) 008C ; [.0000.0000.0000.0000] # [008C] PARTIAL LINE BACKWARD (in 6429) 008D ; [.0000.0000.0000.0000] # [008D] PARTIAL LINE FEED (in 6429) 008E ; [.0000.0000.0000.0000] # [008E] SINGLE SHIFT TWO (in 6429) 008F ; [.0000.0000.0000.0000] # [008F] SINGLE SHIFT THREE (in 6429) 0090 ; [.0000.0000.0000.0000] # [0090] DEVICE CONTROL STRING (in 6429) 0091 ; [.0000.0000.0000.0000] # [0091] PRIVATE USE ONE (in 6429) 0092 ; [.0000.0000.0000.0000] # [0092] PRIVATE USE TWO (in 6429) 0093 ; [.0000.0000.0000.0000] # [0093] SET TRANSMIT STATE (in 6429) 0094 ; [.0000.0000.0000.0000] # [0094] CANCEL CHARACTER (in 6429) 0095 ; [.0000.0000.0000.0000] # [0095] MESSAGE WAITING (in 6429) 0096 ; [.0000.0000.0000.0000] # [0096] START OF GUARDED AREA (in 6429) 0097 ; [.0000.0000.0000.0000] # [0097] END OF GUARDED AREA (in 6429) 0098 ; [.0000.0000.0000.0000] # [0098] START OF STRING (in 6429) 0099 ; [.0000.0000.0000.0000] # [0099] <control> 009A ; [.0000.0000.0000.0000] # [009A] SINGLE CHARACTER INTRODUCER (in 6429) 009B ; [.0000.0000.0000.0000] # [009B] CONTROL SEQUENCE INTRODUCER (in 6429) 009C ; [.0000.0000.0000.0000] # [009C] STRING TERMINATOR (in 6429) 009D ; [.0000.0000.0000.0000] # [009D] OPERATING SYSTEM COMMAND (in 6429) 009E ; [.0000.0000.0000.0000] # [009E] PRIVACY MESSAGE (in 6429) 009F ; [.0000.0000.0000.0000] # [009F] APPLICATION PROGRAM COMMAND (in 6429) 00AD ; [.0000.0000.0000.0000] # [00AD] SOFT HYPHEN 070F ; [.0000.0000.0000.0000] # [070F] SYRIAC ABBREVIATION MARK 180B ; [.0000.0000.0000.0000] # [180B] MONGOLIAN FREE VARIATION SELECTOR ONE 180C ; [.0000.0000.0000.0000] # [180C] MONGOLIAN FREE VARIATION SELECTOR TWO 180D ; [.0000.0000.0000.0000] # [180D] MONGOLIAN FREE VARIATION SELECTOR THREE 200B ; [.0000.0000.0000.0000] # [200B] ZERO WIDTH SPACE 200C ; [.0000.0000.0000.0000] # [200C] ZERO WIDTH NON-JOINER 200D ; [.0000.0000.0000.0000] # [200D] ZERO WIDTH JOINER 200E ; [.0000.0000.0000.0000] # [200E] LEFT-TO-RIGHT MARK 200F ; [.0000.0000.0000.0000] # [200F] RIGHT-TO-LEFT MARK 202A ; [.0000.0000.0000.0000] # [202A] LEFT-TO-RIGHT EMBEDDING 202B ; [.0000.0000.0000.0000] # [202B] RIGHT-TO-LEFT EMBEDDING 202C ; [.0000.0000.0000.0000] # [202C] POP DIRECTIONAL FORMATTING 202D ; [.0000.0000.0000.0000] # [202D] LEFT-TO-RIGHT OVERRIDE 202E ; [.0000.0000.0000.0000] # [202E] RIGHT-TO-LEFT OVERRIDE 2060 ; [.0000.0000.0000.0000] # [2060] WORD JOINER 206A ; [.0000.0000.0000.0000] # [206A] INHIBIT SYMMETRIC SWAPPING 206B ; [.0000.0000.0000.0000] # [206B] ACTIVATE SYMMETRIC SWAPPING 206C ; [.0000.0000.0000.0000] # [206C] INHIBIT ARABIC FORM SHAPING 206D ; [.0000.0000.0000.0000] # [206D] ACTIVATE ARABIC FORM SHAPING 206E ; [.0000.0000.0000.0000] # [206E] NATIONAL DIGIT SHAPES 206F ; [.0000.0000.0000.0000] # [206F] NOMINAL DIGIT SHAPES FE00 ; [.0000.0000.0000.0000] # [FE00] VARIATION SELECTOR-1 FE01 ; [.0000.0000.0000.0000] # [FE01] VARIATION SELECTOR-2 FE02 ; [.0000.0000.0000.0000] # [FE02] VARIATION SELECTOR-3 FE03 ; [.0000.0000.0000.0000] # [FE03] VARIATION SELECTOR-4 FE04 ; [.0000.0000.0000.0000] # [FE04] VARIATION SELECTOR-5 FE05 ; [.0000.0000.0000.0000] # [FE05] VARIATION SELECTOR-6 FE06 ; [.0000.0000.0000.0000] # [FE06] VARIATION SELECTOR-7 FE07 ; [.0000.0000.0000.0000] # [FE07] VARIATION SELECTOR-8 FE08 ; [.0000.0000.0000.0000] # [FE08] VARIATION SELECTOR-9 FE09 ; [.0000.0000.0000.0000] # [FE09] VARIATION SELECTOR-10 FE0A ; [.0000.0000.0000.0000] # [FE0A] VARIATION SELECTOR-11 FE0B ; [.0000.0000.0000.0000] # [FE0B] VARIATION SELECTOR-12 FE0C ; [.0000.0000.0000.0000] # [FE0C] VARIATION SELECTOR-13 FE0D ; [.0000.0000.0000.0000] # [FE0D] VARIATION SELECTOR-14 FE0E ; [.0000.0000.0000.0000] # [FE0E] VARIATION SELECTOR-15 FE0F ; [.0000.0000.0000.0000] # [FE0F] VARIATION SELECTOR-16 FEFF ; [.0000.0000.0000.0000] # [FEFF] ZERO WIDTH NO-BREAK SPACE FFF9 ; [.0000.0000.0000.0000] # [FFF9] INTERLINEAR ANNOTATION ANCHOR FFFA ; [.0000.0000.0000.0000] # [FFFA] INTERLINEAR ANNOTATION SEPARATOR FFFB ; [.0000.0000.0000.0000] # [FFFB] INTERLINEAR ANNOTATION TERMINATOR 1D173 ; [.0000.0000.0000.0000] # [1D173] MUSICAL SYMBOL BEGIN BEAM 1D174 ; [.0000.0000.0000.0000] # [1D174] MUSICAL SYMBOL END BEAM 1D175 ; [.0000.0000.0000.0000] # [1D175] MUSICAL SYMBOL BEGIN TIE 1D176 ; [.0000.0000.0000.0000] # [1D176] MUSICAL SYMBOL END TIE 1D177 ; [.0000.0000.0000.0000] # [1D177] MUSICAL SYMBOL BEGIN SLUR 1D178 ; [.0000.0000.0000.0000] # [1D178] MUSICAL SYMBOL END SLUR 1D179 ; [.0000.0000.0000.0000] # [1D179] MUSICAL SYMBOL BEGIN PHRASE 1D17A ; [.0000.0000.0000.0000] # [1D17A] MUSICAL SYMBOL END PHRASE E0001 ; [.0000.0000.0000.0000] # [E0001] LANGUAGE TAG E0020 ; [.0000.0000.0000.0000] # [E0020] TAG SPACE E0021 ; [.0000.0000.0000.0000] # [E0021] TAG EXCLAMATION MARK E0022 ; [.0000.0000.0000.0000] # [E0022] TAG QUOTATION MARK E0023 ; [.0000.0000.0000.0000] # [E0023] TAG NUMBER SIGN E0024 ; [.0000.0000.0000.0000] # [E0024] TAG DOLLAR SIGN E0025 ; [.0000.0000.0000.0000] # [E0025] TAG PERCENT SIGN E0026 ; [.0000.0000.0000.0000] # [E0026] TAG AMPERSAND E0027 ; [.0000.0000.0000.0000] # [E0027] TAG APOSTROPHE E0028 ; [.0000.0000.0000.0000] # [E0028] TAG LEFT PARENTHESIS E0029 ; [.0000.0000.0000.0000] # [E0029] TAG RIGHT PARENTHESIS E002A ; [.0000.0000.0000.0000] # [E002A] TAG ASTERISK E002B ; [.0000.0000.0000.0000] # [E002B] TAG PLUS SIGN E002C ; [.0000.0000.0000.0000] # [E002C] TAG COMMA E002D ; [.0000.0000.0000.0000] # [E002D] TAG HYPHEN-MINUS E002E ; [.0000.0000.0000.0000] # [E002E] TAG FULL STOP E002F ; [.0000.0000.0000.0000] # [E002F] TAG SOLIDUS E0030 ; [.0000.0000.0000.0000] # [E0030] TAG DIGIT ZERO E0031 ; [.0000.0000.0000.0000] # [E0031] TAG DIGIT ONE E0032 ; [.0000.0000.0000.0000] # [E0032] TAG DIGIT TWO E0033 ; [.0000.0000.0000.0000] # [E0033] TAG DIGIT THREE E0034 ; [.0000.0000.0000.0000] # [E0034] TAG DIGIT FOUR E0035 ; [.0000.0000.0000.0000] # [E0035] TAG DIGIT FIVE E0036 ; [.0000.0000.0000.0000] # [E0036] TAG DIGIT SIX E0037 ; [.0000.0000.0000.0000] # [E0037] TAG DIGIT SEVEN E0038 ; [.0000.0000.0000.0000] # [E0038] TAG DIGIT EIGHT E0039 ; [.0000.0000.0000.0000] # [E0039] TAG DIGIT NINE E003A ; [.0000.0000.0000.0000] # [E003A] TAG COLON E003B ; [.0000.0000.0000.0000] # [E003B] TAG SEMICOLON E003C ; [.0000.0000.0000.0000] # [E003C] TAG LESS-THAN SIGN E003D ; [.0000.0000.0000.0000] # [E003D] TAG EQUALS SIGN E003E ; [.0000.0000.0000.0000] # [E003E] TAG GREATER-THAN SIGN E003F ; [.0000.0000.0000.0000] # [E003F] TAG QUESTION MARK E0040 ; [.0000.0000.0000.0000] # [E0040] TAG COMMERCIAL AT E0041 ; [.0000.0000.0000.0000] # [E0041] TAG LATIN CAPITAL LETTER A E0042 ; [.0000.0000.0000.0000] # [E0042] TAG LATIN CAPITAL LETTER B E0043 ; [.0000.0000.0000.0000] # [E0043] TAG LATIN CAPITAL LETTER C E0044 ; [.0000.0000.0000.0000] # [E0044] TAG LATIN CAPITAL LETTER D E0045 ; [.0000.0000.0000.0000] # [E0045] TAG LATIN CAPITAL LETTER E E0046 ; [.0000.0000.0000.0000] # [E0046] TAG LATIN CAPITAL LETTER F E0047 ; [.0000.0000.0000.0000] # [E0047] TAG LATIN CAPITAL LETTER G E0048 ; [.0000.0000.0000.0000] # [E0048] TAG LATIN CAPITAL LETTER H E0049 ; [.0000.0000.0000.0000] # [E0049] TAG LATIN CAPITAL LETTER I E004A ; [.0000.0000.0000.0000] # [E004A] TAG LATIN CAPITAL LETTER J E004B ; [.0000.0000.0000.0000] # [E004B] TAG LATIN CAPITAL LETTER K E004C ; [.0000.0000.0000.0000] # [E004C] TAG LATIN CAPITAL LETTER L E004D ; [.0000.0000.0000.0000] # [E004D] TAG LATIN CAPITAL LETTER M E004E ; [.0000.0000.0000.0000] # [E004E] TAG LATIN CAPITAL LETTER N E004F ; [.0000.0000.0000.0000] # [E004F] TAG LATIN CAPITAL LETTER O E0050 ; [.0000.0000.0000.0000] # [E0050] TAG LATIN CAPITAL LETTER P E0051 ; [.0000.0000.0000.0000] # [E0051] TAG LATIN CAPITAL LETTER Q E0052 ; [.0000.0000.0000.0000] # [E0052] TAG LATIN CAPITAL LETTER R E0053 ; [.0000.0000.0000.0000] # [E0053] TAG LATIN CAPITAL LETTER S E0054 ; [.0000.0000.0000.0000] # [E0054] TAG LATIN CAPITAL LETTER T E0055 ; [.0000.0000.0000.0000] # [E0055] TAG LATIN CAPITAL LETTER U E0056 ; [.0000.0000.0000.0000] # [E0056] TAG LATIN CAPITAL LETTER V E0057 ; [.0000.0000.0000.0000] # [E0057] TAG LATIN CAPITAL LETTER W E0058 ; [.0000.0000.0000.0000] # [E0058] TAG LATIN CAPITAL LETTER X E0059 ; [.0000.0000.0000.0000] # [E0059] TAG LATIN CAPITAL LETTER Y E005A ; [.0000.0000.0000.0000] # [E005A] TAG LATIN CAPITAL LETTER Z E005B ; [.0000.0000.0000.0000] # [E005B] TAG LEFT SQUARE BRACKET E005C ; [.0000.0000.0000.0000] # [E005C] TAG REVERSE SOLIDUS E005D ; [.0000.0000.0000.0000] # [E005D] TAG RIGHT SQUARE BRACKET E005E ; [.0000.0000.0000.0000] # [E005E] TAG CIRCUMFLEX ACCENT E005F ; [.0000.0000.0000.0000] # [E005F] TAG LOW LINE E0060 ; [.0000.0000.0000.0000] # [E0060] TAG GRAVE ACCENT E0061 ; [.0000.0000.0000.0000] # [E0061] TAG LATIN SMALL LETTER A E0062 ; [.0000.0000.0000.0000] # [E0062] TAG LATIN SMALL LETTER B E0063 ; [.0000.0000.0000.0000] # [E0063] TAG LATIN SMALL LETTER C E0064 ; [.0000.0000.0000.0000] # [E0064] TAG LATIN SMALL LETTER D E0065 ; [.0000.0000.0000.0000] # [E0065] TAG LATIN SMALL LETTER E E0066 ; [.0000.0000.0000.0000] # [E0066] TAG LATIN SMALL LETTER F E0067 ; [.0000.0000.0000.0000] # [E0067] TAG LATIN SMALL LETTER G E0068 ; [.0000.0000.0000.0000] # [E0068] TAG LATIN SMALL LETTER H E0069 ; [.0000.0000.0000.0000] # [E0069] TAG LATIN SMALL LETTER I E006A ; [.0000.0000.0000.0000] # [E006A] TAG LATIN SMALL LETTER J E006B ; [.0000.0000.0000.0000] # [E006B] TAG LATIN SMALL LETTER K E006C ; [.0000.0000.0000.0000] # [E006C] TAG LATIN SMALL LETTER L E006D ; [.0000.0000.0000.0000] # [E006D] TAG LATIN SMALL LETTER M E006E ; [.0000.0000.0000.0000] # [E006E] TAG LATIN SMALL LETTER N E006F ; [.0000.0000.0000.0000] # [E006F] TAG LATIN SMALL LETTER O E0070 ; [.0000.0000.0000.0000] # [E0070] TAG LATIN SMALL LETTER P E0071 ; [.0000.0000.0000.0000] # [E0071] TAG LATIN SMALL LETTER Q E0072 ; [.0000.0000.0000.0000] # [E0072] TAG LATIN SMALL LETTER R E0073 ; [.0000.0000.0000.0000] # [E0073] TAG LATIN SMALL LETTER S E0074 ; [.0000.0000.0000.0000] # [E0074] TAG LATIN SMALL LETTER T E0075 ; [.0000.0000.0000.0000] # [E0075] TAG LATIN SMALL LETTER U E0076 ; [.0000.0000.0000.0000] # [E0076] TAG LATIN SMALL LETTER V E0077 ; [.0000.0000.0000.0000] # [E0077] TAG LATIN SMALL LETTER W E0078 ; [.0000.0000.0000.0000] # [E0078] TAG LATIN SMALL LETTER X E0079 ; [.0000.0000.0000.0000] # [E0079] TAG LATIN SMALL LETTER Y E007A ; [.0000.0000.0000.0000] # [E007A] TAG LATIN SMALL LETTER Z E007B ; [.0000.0000.0000.0000] # [E007B] TAG LEFT CURLY BRACKET E007C ; [.0000.0000.0000.0000] # [E007C] TAG VERTICAL LINE E007D ; [.0000.0000.0000.0000] # [E007D] TAG RIGHT CURLY BRACKET E007E ; [.0000.0000.0000.0000] # [E007E] TAG TILDE E007F ; [.0000.0000.0000.0000] # [E007F] CANCEL TAG E0100 ; [.0000.0000.0000.0000] # [E0100] VARIATION SELECTOR-17 E0101 ; [.0000.0000.0000.0000] # [E0101] VARIATION SELECTOR-18 E0102 ; [.0000.0000.0000.0000] # [E0102] VARIATION SELECTOR-19 E0103 ; [.0000.0000.0000.0000] # [E0103] VARIATION SELECTOR-20 E0104 ; [.0000.0000.0000.0000] # [E0104] VARIATION SELECTOR-21 E0105 ; [.0000.0000.0000.0000] # [E0105] VARIATION SELECTOR-22 E0106 ; [.0000.0000.0000.0000] # [E0106] VARIATION SELECTOR-23 E0107 ; [.0000.0000.0000.0000] # [E0107] VARIATION SELECTOR-24 E0108 ; [.0000.0000.0000.0000] # [E0108] VARIATION SELECTOR-25 E0109 ; [.0000.0000.0000.0000] # [E0109] VARIATION SELECTOR-26 E010A ; [.0000.0000.0000.0000] # [E010A] VARIATION SELECTOR-27 E010B ; [.0000.0000.0000.0000] # [E010B] VARIATION SELECTOR-28 E010C ; [.0000.0000.0000.0000] # [E010C] VARIATION SELECTOR-29 E010D ; [.0000.0000.0000.0000] # [E010D] VARIATION SELECTOR-30 E010E ; [.0000.0000.0000.0000] # [E010E] VARIATION SELECTOR-31 E010F ; [.0000.0000.0000.0000] # [E010F] VARIATION SELECTOR-32 E0110 ; [.0000.0000.0000.0000] # [E0110] VARIATION SELECTOR-33 E0111 ; [.0000.0000.0000.0000] # [E0111] VARIATION SELECTOR-34 E0112 ; [.0000.0000.0000.0000] # [E0112] VARIATION SELECTOR-35 E0113 ; [.0000.0000.0000.0000] # [E0113] VARIATION SELECTOR-36 E0114 ; [.0000.0000.0000.0000] # [E0114] VARIATION SELECTOR-37 E0115 ; [.0000.0000.0000.0000] # [E0115] VARIATION SELECTOR-38 E0116 ; [.0000.0000.0000.0000] # [E0116] VARIATION SELECTOR-39 E0117 ; [.0000.0000.0000.0000] # [E0117] VARIATION SELECTOR-40 E0118 ; [.0000.0000.0000.0000] # [E0118] VARIATION SELECTOR-41 E0119 ; [.0000.0000.0000.0000] # [E0119] VARIATION SELECTOR-42 E011A ; [.0000.0000.0000.0000] # [E011A] VARIATION SELECTOR-43 E011B ; [.0000.0000.0000.0000] # [E011B] VARIATION SELECTOR-44 E011C ; [.0000.0000.0000.0000] # [E011C] VARIATION SELECTOR-45 E011D ; [.0000.0000.0000.0000] # [E011D] VARIATION SELECTOR-46 E011E ; [.0000.0000.0000.0000] # [E011E] VARIATION SELECTOR-47 E011F ; [.0000.0000.0000.0000] # [E011F] VARIATION SELECTOR-48 E0120 ; [.0000.0000.0000.0000] # [E0120] VARIATION SELECTOR-49 E0121 ; [.0000.0000.0000.0000] # [E0121] VARIATION SELECTOR-50 E0122 ; [.0000.0000.0000.0000] # [E0122] VARIATION SELECTOR-51 E0123 ; [.0000.0000.0000.0000] # [E0123] VARIATION SELECTOR-52 E0124 ; [.0000.0000.0000.0000] # [E0124] VARIATION SELECTOR-53 E0125 ; [.0000.0000.0000.0000] # [E0125] VARIATION SELECTOR-54 E0126 ; [.0000.0000.0000.0000] # [E0126] VARIATION SELECTOR-55 E0127 ; [.0000.0000.0000.0000] # [E0127] VARIATION SELECTOR-56 E0128 ; [.0000.0000.0000.0000] # [E0128] VARIATION SELECTOR-57 E0129 ; [.0000.0000.0000.0000] # [E0129] VARIATION SELECTOR-58 E012A ; [.0000.0000.0000.0000] # [E012A] VARIATION SELECTOR-59 E012B ; [.0000.0000.0000.0000] # [E012B] VARIATION SELECTOR-60 E012C ; [.0000.0000.0000.0000] # [E012C] VARIATION SELECTOR-61 E012D ; [.0000.0000.0000.0000] # [E012D] VARIATION SELECTOR-62 E012E ; [.0000.0000.0000.0000] # [E012E] VARIATION SELECTOR-63 E012F ; [.0000.0000.0000.0000] # [E012F] VARIATION SELECTOR-64 E0130 ; [.0000.0000.0000.0000] # [E0130] VARIATION SELECTOR-65 E0131 ; [.0000.0000.0000.0000] # [E0131] VARIATION SELECTOR-66 E0132 ; [.0000.0000.0000.0000] # [E0132] VARIATION SELECTOR-67 E0133 ; [.0000.0000.0000.0000] # [E0133] VARIATION SELECTOR-68 E0134 ; [.0000.0000.0000.0000] # [E0134] VARIATION SELECTOR-69 E0135 ; [.0000.0000.0000.0000] # [E0135] VARIATION SELECTOR-70 E0136 ; [.0000.0000.0000.0000] # [E0136] VARIATION SELECTOR-71 E0137 ; [.0000.0000.0000.0000] # [E0137] VARIATION SELECTOR-72 E0138 ; [.0000.0000.0000.0000] # [E0138] VARIATION SELECTOR-73 E0139 ; [.0000.0000.0000.0000] # [E0139] VARIATION SELECTOR-74 E013A ; [.0000.0000.0000.0000] # [E013A] VARIATION SELECTOR-75 E013B ; [.0000.0000.0000.0000] # [E013B] VARIATION SELECTOR-76 E013C ; [.0000.0000.0000.0000] # [E013C] VARIATION SELECTOR-77 E013D ; [.0000.0000.0000.0000] # [E013D] VARIATION SELECTOR-78 E013E ; [.0000.0000.0000.0000] # [E013E] VARIATION SELECTOR-79 E013F ; [.0000.0000.0000.0000] # [E013F] VARIATION SELECTOR-80 E0140 ; [.0000.0000.0000.0000] # [E0140] VARIATION SELECTOR-81 E0141 ; [.0000.0000.0000.0000] # [E0141] VARIATION SELECTOR-82 E0142 ; [.0000.0000.0000.0000] # [E0142] VARIATION SELECTOR-83 E0143 ; [.0000.0000.0000.0000] # [E0143] VARIATION SELECTOR-84 E0144 ; [.0000.0000.0000.0000] # [E0144] VARIATION SELECTOR-85 E0145 ; [.0000.0000.0000.0000] # [E0145] VARIATION SELECTOR-86 E0146 ; [.0000.0000.0000.0000] # [E0146] VARIATION SELECTOR-87 E0147 ; [.0000.0000.0000.0000] # [E0147] VARIATION SELECTOR-88 E0148 ; [.0000.0000.0000.0000] # [E0148] VARIATION SELECTOR-89 E0149 ; [.0000.0000.0000.0000] # [E0149] VARIATION SELECTOR-90 E014A ; [.0000.0000.0000.0000] # [E014A] VARIATION SELECTOR-91 E014B ; [.0000.0000.0000.0000] # [E014B] VARIATION SELECTOR-92 E014C ; [.0000.0000.0000.0000] # [E014C] VARIATION SELECTOR-93 E014D ; [.0000.0000.0000.0000] # [E014D] VARIATION SELECTOR-94 E014E ; [.0000.0000.0000.0000] # [E014E] VARIATION SELECTOR-95 E014F ; [.0000.0000.0000.0000] # [E014F] VARIATION SELECTOR-96 E0150 ; [.0000.0000.0000.0000] # [E0150] VARIATION SELECTOR-97 E0151 ; [.0000.0000.0000.0000] # [E0151] VARIATION SELECTOR-98 E0152 ; [.0000.0000.0000.0000] # [E0152] VARIATION SELECTOR-99 E0153 ; [.0000.0000.0000.0000] # [E0153] VARIATION SELECTOR-100 E0154 ; [.0000.0000.0000.0000] # [E0154] VARIATION SELECTOR-101 E0155 ; [.0000.0000.0000.0000] # [E0155] VARIATION SELECTOR-102 E0156 ; [.0000.0000.0000.0000] # [E0156] VARIATION SELECTOR-103 E0157 ; [.0000.0000.0000.0000] # [E0157] VARIATION SELECTOR-104 E0158 ; [.0000.0000.0000.0000] # [E0158] VARIATION SELECTOR-105 E0159 ; [.0000.0000.0000.0000] # [E0159] VARIATION SELECTOR-106 E015A ; [.0000.0000.0000.0000] # [E015A] VARIATION SELECTOR-107 E015B ; [.0000.0000.0000.0000] # [E015B] VARIATION SELECTOR-108 E015C ; [.0000.0000.0000.0000] # [E015C] VARIATION SELECTOR-109 E015D ; [.0000.0000.0000.0000] # [E015D] VARIATION SELECTOR-110 E015E ; [.0000.0000.0000.0000] # [E015E] VARIATION SELECTOR-111 E015F ; [.0000.0000.0000.0000] # [E015F] VARIATION SELECTOR-112 E0160 ; [.0000.0000.0000.0000] # [E0160] VARIATION SELECTOR-113 E0161 ; [.0000.0000.0000.0000] # [E0161] VARIATION SELECTOR-114 E0162 ; [.0000.0000.0000.0000] # [E0162] VARIATION SELECTOR-115 E0163 ; [.0000.0000.0000.0000] # [E0163] VARIATION SELECTOR-116 E0164 ; [.0000.0000.0000.0000] # [E0164] VARIATION SELECTOR-117 E0165 ; [.0000.0000.0000.0000] # [E0165] VARIATION SELECTOR-118 E0166 ; [.0000.0000.0000.0000] # [E0166] VARIATION SELECTOR-119 E0167 ; [.0000.0000.0000.0000] # [E0167] VARIATION SELECTOR-120 E0168 ; [.0000.0000.0000.0000] # [E0168] VARIATION SELECTOR-121 E0169 ; [.0000.0000.0000.0000] # [E0169] VARIATION SELECTOR-122 E016A ; [.0000.0000.0000.0000] # [E016A] VARIATION SELECTOR-123 E016B ; [.0000.0000.0000.0000] # [E016B] VARIATION SELECTOR-124 E016C ; [.0000.0000.0000.0000] # [E016C] VARIATION SELECTOR-125 E016D ; [.0000.0000.0000.0000] # [E016D] VARIATION SELECTOR-126 E016E ; [.0000.0000.0000.0000] # [E016E] VARIATION SELECTOR-127 E016F ; [.0000.0000.0000.0000] # [E016F] VARIATION SELECTOR-128 E0170 ; [.0000.0000.0000.0000] # [E0170] VARIATION SELECTOR-129 E0171 ; [.0000.0000.0000.0000] # [E0171] VARIATION SELECTOR-130 E0172 ; [.0000.0000.0000.0000] # [E0172] VARIATION SELECTOR-131 E0173 ; [.0000.0000.0000.0000] # [E0173] VARIATION SELECTOR-132 E0174 ; [.0000.0000.0000.0000] # [E0174] VARIATION SELECTOR-133 E0175 ; [.0000.0000.0000.0000] # [E0175] VARIATION SELECTOR-134 E0176 ; [.0000.0000.0000.0000] # [E0176] VARIATION SELECTOR-135 E0177 ; [.0000.0000.0000.0000] # [E0177] VARIATION SELECTOR-136 E0178 ; [.0000.0000.0000.0000] # [E0178] VARIATION SELECTOR-137 E0179 ; [.0000.0000.0000.0000] # [E0179] VARIATION SELECTOR-138 E017A ; [.0000.0000.0000.0000] # [E017A] VARIATION SELECTOR-139 E017B ; [.0000.0000.0000.0000] # [E017B] VARIATION SELECTOR-140 E017C ; [.0000.0000.0000.0000] # [E017C] VARIATION SELECTOR-141 E017D ; [.0000.0000.0000.0000] # [E017D] VARIATION SELECTOR-142 E017E ; [.0000.0000.0000.0000] # [E017E] VARIATION SELECTOR-143 E017F ; [.0000.0000.0000.0000] # [E017F] VARIATION SELECTOR-144 E0180 ; [.0000.0000.0000.0000] # [E0180] VARIATION SELECTOR-145 E0181 ; [.0000.0000.0000.0000] # [E0181] VARIATION SELECTOR-146 E0182 ; [.0000.0000.0000.0000] # [E0182] VARIATION SELECTOR-147 E0183 ; [.0000.0000.0000.0000] # [E0183] VARIATION SELECTOR-148 E0184 ; [.0000.0000.0000.0000] # [E0184] VARIATION SELECTOR-149 E0185 ; [.0000.0000.0000.0000] # [E0185] VARIATION SELECTOR-150 E0186 ; [.0000.0000.0000.0000] # [E0186] VARIATION SELECTOR-151 E0187 ; [.0000.0000.0000.0000] # [E0187] VARIATION SELECTOR-152 E0188 ; [.0000.0000.0000.0000] # [E0188] VARIATION SELECTOR-153 E0189 ; [.0000.0000.0000.0000] # [E0189] VARIATION SELECTOR-154 E018A ; [.0000.0000.0000.0000] # [E018A] VARIATION SELECTOR-155 E018B ; [.0000.0000.0000.0000] # [E018B] VARIATION SELECTOR-156 E018C ; [.0000.0000.0000.0000] # [E018C] VARIATION SELECTOR-157 E018D ; [.0000.0000.0000.0000] # [E018D] VARIATION SELECTOR-158 E018E ; [.0000.0000.0000.0000] # [E018E] VARIATION SELECTOR-159 E018F ; [.0000.0000.0000.0000] # [E018F] VARIATION SELECTOR-160 E0190 ; [.0000.0000.0000.0000] # [E0190] VARIATION SELECTOR-161 E0191 ; [.0000.0000.0000.0000] # [E0191] VARIATION SELECTOR-162 E0192 ; [.0000.0000.0000.0000] # [E0192] VARIATION SELECTOR-163 E0193 ; [.0000.0000.0000.0000] # [E0193] VARIATION SELECTOR-164 E0194 ; [.0000.0000.0000.0000] # [E0194] VARIATION SELECTOR-165 E0195 ; [.0000.0000.0000.0000] # [E0195] VARIATION SELECTOR-166 E0196 ; [.0000.0000.0000.0000] # [E0196] VARIATION SELECTOR-167 E0197 ; [.0000.0000.0000.0000] # [E0197] VARIATION SELECTOR-168 E0198 ; [.0000.0000.0000.0000] # [E0198] VARIATION SELECTOR-169 E0199 ; [.0000.0000.0000.0000] # [E0199] VARIATION SELECTOR-170 E019A ; [.0000.0000.0000.0000] # [E019A] VARIATION SELECTOR-171 E019B ; [.0000.0000.0000.0000] # [E019B] VARIATION SELECTOR-172 E019C ; [.0000.0000.0000.0000] # [E019C] VARIATION SELECTOR-173 E019D ; [.0000.0000.0000.0000] # [E019D] VARIATION SELECTOR-174 E019E ; [.0000.0000.0000.0000] # [E019E] VARIATION SELECTOR-175 E019F ; [.0000.0000.0000.0000] # [E019F] VARIATION SELECTOR-176 E01A0 ; [.0000.0000.0000.0000] # [E01A0] VARIATION SELECTOR-177 E01A1 ; [.0000.0000.0000.0000] # [E01A1] VARIATION SELECTOR-178 E01A2 ; [.0000.0000.0000.0000] # [E01A2] VARIATION SELECTOR-179 E01A3 ; [.0000.0000.0000.0000] # [E01A3] VARIATION SELECTOR-180 E01A4 ; [.0000.0000.0000.0000] # [E01A4] VARIATION SELECTOR-181 E01A5 ; [.0000.0000.0000.0000] # [E01A5] VARIATION SELECTOR-182 E01A6 ; [.0000.0000.0000.0000] # [E01A6] VARIATION SELECTOR-183 E01A7 ; [.0000.0000.0000.0000] # [E01A7] VARIATION SELECTOR-184 E01A8 ; [.0000.0000.0000.0000] # [E01A8] VARIATION SELECTOR-185 E01A9 ; [.0000.0000.0000.0000] # [E01A9] VARIATION SELECTOR-186 E01AA ; [.0000.0000.0000.0000] # [E01AA] VARIATION SELECTOR-187 E01AB ; [.0000.0000.0000.0000] # [E01AB] VARIATION SELECTOR-188 E01AC ; [.0000.0000.0000.0000] # [E01AC] VARIATION SELECTOR-189 E01AD ; [.0000.0000.0000.0000] # [E01AD] VARIATION SELECTOR-190 E01AE ; [.0000.0000.0000.0000] # [E01AE] VARIATION SELECTOR-191 E01AF ; [.0000.0000.0000.0000] # [E01AF] VARIATION SELECTOR-192 E01B0 ; [.0000.0000.0000.0000] # [E01B0] VARIATION SELECTOR-193 E01B1 ; [.0000.0000.0000.0000] # [E01B1] VARIATION SELECTOR-194 E01B2 ; [.0000.0000.0000.0000] # [E01B2] VARIATION SELECTOR-195 E01B3 ; [.0000.0000.0000.0000] # [E01B3] VARIATION SELECTOR-196 E01B4 ; [.0000.0000.0000.0000] # [E01B4] VARIATION SELECTOR-197 E01B5 ; [.0000.0000.0000.0000] # [E01B5] VARIATION SELECTOR-198 E01B6 ; [.0000.0000.0000.0000] # [E01B6] VARIATION SELECTOR-199 E01B7 ; [.0000.0000.0000.0000] # [E01B7] VARIATION SELECTOR-200 E01B8 ; [.0000.0000.0000.0000] # [E01B8] VARIATION SELECTOR-201 E01B9 ; [.0000.0000.0000.0000] # [E01B9] VARIATION SELECTOR-202 E01BA ; [.0000.0000.0000.0000] # [E01BA] VARIATION SELECTOR-203 E01BB ; [.0000.0000.0000.0000] # [E01BB] VARIATION SELECTOR-204 E01BC ; [.0000.0000.0000.0000] # [E01BC] VARIATION SELECTOR-205 E01BD ; [.0000.0000.0000.0000] # [E01BD] VARIATION SELECTOR-206 E01BE ; [.0000.0000.0000.0000] # [E01BE] VARIATION SELECTOR-207 E01BF ; [.0000.0000.0000.0000] # [E01BF] VARIATION SELECTOR-208 E01C0 ; [.0000.0000.0000.0000] # [E01C0] VARIATION SELECTOR-209 E01C1 ; [.0000.0000.0000.0000] # [E01C1] VARIATION SELECTOR-210 E01C2 ; [.0000.0000.0000.0000] # [E01C2] VARIATION SELECTOR-211 E01C3 ; [.0000.0000.0000.0000] # [E01C3] VARIATION SELECTOR-212 E01C4 ; [.0000.0000.0000.0000] # [E01C4] VARIATION SELECTOR-213 E01C5 ; [.0000.0000.0000.0000] # [E01C5] VARIATION SELECTOR-214 E01C6 ; [.0000.0000.0000.0000] # [E01C6] VARIATION SELECTOR-215 E01C7 ; [.0000.0000.0000.0000] # [E01C7] VARIATION SELECTOR-216 E01C8 ; [.0000.0000.0000.0000] # [E01C8] VARIATION SELECTOR-217 E01C9 ; [.0000.0000.0000.0000] # [E01C9] VARIATION SELECTOR-218 E01CA ; [.0000.0000.0000.0000] # [E01CA] VARIATION SELECTOR-219 E01CB ; [.0000.0000.0000.0000] # [E01CB] VARIATION SELECTOR-220 E01CC ; [.0000.0000.0000.0000] # [E01CC] VARIATION SELECTOR-221 E01CD ; [.0000.0000.0000.0000] # [E01CD] VARIATION SELECTOR-222 E01CE ; [.0000.0000.0000.0000] # [E01CE] VARIATION SELECTOR-223 E01CF ; [.0000.0000.0000.0000] # [E01CF] VARIATION SELECTOR-224 E01D0 ; [.0000.0000.0000.0000] # [E01D0] VARIATION SELECTOR-225 E01D1 ; [.0000.0000.0000.0000] # [E01D1] VARIATION SELECTOR-226 E01D2 ; [.0000.0000.0000.0000] # [E01D2] VARIATION SELECTOR-227 E01D3 ; [.0000.0000.0000.0000] # [E01D3] VARIATION SELECTOR-228 E01D4 ; [.0000.0000.0000.0000] # [E01D4] VARIATION SELECTOR-229 E01D5 ; [.0000.0000.0000.0000] # [E01D5] VARIATION SELECTOR-230 E01D6 ; [.0000.0000.0000.0000] # [E01D6] VARIATION SELECTOR-231 E01D7 ; [.0000.0000.0000.0000] # [E01D7] VARIATION SELECTOR-232 E01D8 ; [.0000.0000.0000.0000] # [E01D8] VARIATION SELECTOR-233 E01D9 ; [.0000.0000.0000.0000] # [E01D9] VARIATION SELECTOR-234 E01DA ; [.0000.0000.0000.0000] # [E01DA] VARIATION SELECTOR-235 E01DB ; [.0000.0000.0000.0000] # [E01DB] VARIATION SELECTOR-236 E01DC ; [.0000.0000.0000.0000] # [E01DC] VARIATION SELECTOR-237 E01DD ; [.0000.0000.0000.0000] # [E01DD] VARIATION SELECTOR-238 E01DE ; [.0000.0000.0000.0000] # [E01DE] VARIATION SELECTOR-239 E01DF ; [.0000.0000.0000.0000] # [E01DF] VARIATION SELECTOR-240 E01E0 ; [.0000.0000.0000.0000] # [E01E0] VARIATION SELECTOR-241 E01E1 ; [.0000.0000.0000.0000] # [E01E1] VARIATION SELECTOR-242 E01E2 ; [.0000.0000.0000.0000] # [E01E2] VARIATION SELECTOR-243 E01E3 ; [.0000.0000.0000.0000] # [E01E3] VARIATION SELECTOR-244 E01E4 ; [.0000.0000.0000.0000] # [E01E4] VARIATION SELECTOR-245 E01E5 ; [.0000.0000.0000.0000] # [E01E5] VARIATION SELECTOR-246 E01E6 ; [.0000.0000.0000.0000] # [E01E6] VARIATION SELECTOR-247 E01E7 ; [.0000.0000.0000.0000] # [E01E7] VARIATION SELECTOR-248 E01E8 ; [.0000.0000.0000.0000] # [E01E8] VARIATION SELECTOR-249 E01E9 ; [.0000.0000.0000.0000] # [E01E9] VARIATION SELECTOR-250 E01EA ; [.0000.0000.0000.0000] # [E01EA] VARIATION SELECTOR-251 E01EB ; [.0000.0000.0000.0000] # [E01EB] VARIATION SELECTOR-252 E01EC ; [.0000.0000.0000.0000] # [E01EC] VARIATION SELECTOR-253 E01ED ; [.0000.0000.0000.0000] # [E01ED] VARIATION SELECTOR-254 E01EE ; [.0000.0000.0000.0000] # [E01EE] VARIATION SELECTOR-255 E01EF ; [.0000.0000.0000.0000] # [E01EF] VARIATION SELECTOR-256 0009 ; [*0201.0020.0002.0009] # HORIZONTAL TABULATION (in 6429) 000A ; [*0202.0020.0002.000A] # LINE FEED (in 6429) 000B ; [*0203.0020.0002.000B] # VERTICAL TABULATION (in 6429) 000C ; [*0204.0020.0002.000C] # FORM FEED (in 6429) 000D ; [*0205.0020.0002.000D] # CARRIAGE RETURN (in 6429) 0020 ; [*020A.0020.0002.0020] # SPACE 0021 ; [*025E.0020.0002.0021] # EXCLAMATION MARK 0022 ; [*02F1.0020.0002.0022] # QUOTATION MARK 0023 ; [*0376.0020.0002.0023] # NUMBER SIGN 0025 ; [*0377.0020.0002.0025] # PERCENT SIGN 0026 ; [*0374.0020.0002.0026] # AMPERSAND 0027 ; [*02EA.0020.0002.0027] # APOSTROPHE 0028 ; [*02FB.0020.0002.0028] # LEFT PARENTHESIS 0029 ; [*02FC.0020.0002.0029] # RIGHT PARENTHESIS 002A ; [*036D.0020.0002.002A] # ASTERISK 002B ; [*059C.0020.0002.002B] # PLUS SIGN 002C ; [*0221.0020.0002.002C] # COMMA 002D ; [*020E.0020.0002.002D] # HYPHEN-MINUS 002E ; [*0273.0020.0002.002E] # FULL STOP 002F ; [*0372.0020.0002.002F] # SOLIDUS 003A ; [*0237.0020.0002.003A] # COLON 003B ; [*0232.0020.0002.003B] # SEMICOLON 003C ; [*05A0.0020.0002.003C] # LESS-THAN SIGN 003D ; [*05A1.0020.0002.003D] # EQUALS SIGN 003E ; [*05A2.0020.0002.003E] # GREATER-THAN SIGN 003F ; [*0263.0020.0002.003F] # QUESTION MARK 0040 ; [*036C.0020.0002.0040] # COMMERCIAL AT 005B ; [*02FD.0020.0002.005B] # LEFT SQUARE BRACKET 005C ; [*0373.0020.0002.005C] # REVERSE SOLIDUS 005D ; [*02FE.0020.0002.005D] # RIGHT SQUARE BRACKET 005E ; [*0412.0020.0002.005E] # CIRCUMFLEX ACCENT 005F ; [*020C.0020.0002.005F] # LOW LINE 0060 ; [*040F.0020.0002.0060] # GRAVE ACCENT 007B ; [*02FF.0020.0002.007B] # LEFT CURLY BRACKET 007C ; [*05A4.0020.0002.007C] # VERTICAL LINE 007D ; [*0300.0020.0002.007D] # RIGHT CURLY BRACKET 007E ; [*05A6.0020.0002.007E] # TILDE 0085 ; [*0206.0020.0002.0085] # NEXT LINE (in 6429) 00A0 ; [*020A.0020.001B.00A0] # NO-BREAK SPACE 00A1 ; [*025F.0020.0002.00A1] # INVERTED EXCLAMATION MARK 00A6 ; [*05A5.0020.0002.00A6] # BROKEN BAR 00A7 ; [*0368.0020.0002.00A7] # SECTION SIGN 00A8 ; [*0416.0020.0002.00A8] # DIAERESIS 00A9 ; [*050C.0020.0002.00A9] # COPYRIGHT SIGN 00AB ; [*02F9.0020.0002.00AB] # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 00AC ; [*05A3.0020.0002.00AC] # NOT SIGN 00AE ; [*050D.0020.0002.00AE] # REGISTERED SIGN 00AF ; [*0413.0020.0002.00AF] # MACRON 00B0 ; [*0482.0020.0002.00B0] # DEGREE SIGN 00B1 ; [*059D.0020.0002.00B1] # PLUS-MINUS SIGN 00B4 ; [*0410.0020.0002.00B4] # ACUTE ACCENT 00B6 ; [*036A.0020.0002.00B6] # PILCROW SIGN 00B7 ; [*0284.0020.0002.00B7] # MIDDLE DOT 00B8 ; [*0419.0020.0002.00B8] # CEDILLA 00BB ; [*02FA.0020.0002.00BB] # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 00BF ; [*0264.0020.0002.00BF] # INVERTED QUESTION MARK 00D7 ; [*059F.0020.0002.00D7] # MULTIPLICATION SIGN 00F7 ; [*059E.0020.0002.00F7] # DIVISION SIGN 02B9 ; [*0420.0020.0002.02B9] # MODIFIER LETTER PRIME 02BA ; [*0422.0020.0002.02BA] # MODIFIER LETTER DOUBLE PRIME 02C2 ; [*0423.0020.0002.02C2] # MODIFIER LETTER LEFT ARROWHEAD 02C3 ; [*0424.0020.0002.02C3] # MODIFIER LETTER RIGHT ARROWHEAD 02C4 ; [*0425.0020.0002.02C4] # MODIFIER LETTER UP ARROWHEAD 02C5 ; [*0426.0020.0002.02C5] # MODIFIER LETTER DOWN ARROWHEAD 02C6 ; [*0427.0020.0002.02C6] # MODIFIER LETTER CIRCUMFLEX ACCENT 02C7 ; [*0428.0020.0002.02C7] # CARON 02C8 ; [*0429.0020.0002.02C8] # MODIFIER LETTER VERTICAL LINE 02C9 ; [*042A.0020.0002.02C9] # MODIFIER LETTER MACRON 02CA ; [*042B.0020.0002.02CA] # MODIFIER LETTER ACUTE ACCENT 02CB ; [*042C.0020.0002.02CB] # MODIFIER LETTER GRAVE ACCENT 02CC ; [*042D.0020.0002.02CC] # MODIFIER LETTER LOW VERTICAL LINE 02CD ; [*042E.0020.0002.02CD] # MODIFIER LETTER LOW MACRON 02CE ; [*042F.0020.0002.02CE] # MODIFIER LETTER LOW GRAVE ACCENT 02CF ; [*0430.0020.0002.02CF] # MODIFIER LETTER LOW ACUTE ACCENT 02D2 ; [*0431.0020.0002.02D2] # MODIFIER LETTER CENTRED RIGHT HALF RING 02D3 ; [*0432.0020.0002.02D3] # MODIFIER LETTER CENTRED LEFT HALF RING 02D4 ; [*0433.0020.0002.02D4] # MODIFIER LETTER UP TACK 02D5 ; [*0434.0020.0002.02D5] # MODIFIER LETTER DOWN TACK 02D6 ; [*0435.0020.0002.02D6] # MODIFIER LETTER PLUS SIGN 02D7 ; [*0436.0020.0002.02D7] # MODIFIER LETTER MINUS SIGN 02D8 ; [*0414.0020.0002.02D8] # BREVE 02D9 ; [*0415.0020.0002.02D9] # DOT ABOVE 02DA ; [*0417.0020.0002.02DA] # RING ABOVE 02DB ; [*041A.0020.0002.02DB] # OGONEK 02DC ; [*0411.0020.0002.02DC] # SMALL TILDE 02DD ; [*0418.0020.0002.02DD] # DOUBLE ACUTE ACCENT 02DE ; [*0437.0020.0002.02DE] # MODIFIER LETTER RHOTIC HOOK 02DF ; [*0438.0020.0002.02DF] # MODIFIER LETTER CROSS ACCENT 02E5 ; [*0439.0020.0002.02E5] # MODIFIER LETTER EXTRA-HIGH TONE BAR 02E6 ; [*043A.0020.0002.02E6] # MODIFIER LETTER HIGH TONE BAR 02E7 ; [*043B.0020.0002.02E7] # MODIFIER LETTER MID TONE BAR 02E8 ; [*043C.0020.0002.02E8] # MODIFIER LETTER LOW TONE BAR 02E9 ; [*043D.0020.0002.02E9] # MODIFIER LETTER EXTRA-LOW TONE BAR 02EA ; [*043E.0020.0002.02EA] # MODIFIER LETTER YIN DEPARTING TONE MARK 02EB ; [*043F.0020.0002.02EB] # MODIFIER LETTER YANG DEPARTING TONE MARK 02EC ; [*0440.0020.0002.02EC] # MODIFIER LETTER VOICING 02ED ; [*0441.0020.0002.02ED] # MODIFIER LETTER UNASPIRATED 02EF ; [*0442.0020.0002.02EF] # MODIFIER LETTER LOW DOWN ARROWHEAD 02F0 ; [*0443.0020.0002.02F0] # MODIFIER LETTER LOW UP ARROWHEAD 02F1 ; [*0444.0020.0002.02F1] # MODIFIER LETTER LOW LEFT ARROWHEAD 02F2 ; [*0445.0020.0002.02F2] # MODIFIER LETTER LOW RIGHT ARROWHEAD 02F3 ; [*0446.0020.0002.02F3] # MODIFIER LETTER LOW RING 02F4 ; [*0447.0020.0002.02F4] # MODIFIER LETTER MIDDLE GRAVE ACCENT 02F5 ; [*0448.0020.0002.02F5] # MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT 02F6 ; [*0449.0020.0002.02F6] # MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT 02F7 ; [*044A.0020.0002.02F7] # MODIFIER LETTER LOW TILDE 02F8 ; [*044B.0020.0002.02F8] # MODIFIER LETTER RAISED COLON 02F9 ; [*044C.0020.0002.02F9] # MODIFIER LETTER BEGIN HIGH TONE 02FA ; [*044D.0020.0002.02FA] # MODIFIER LETTER END HIGH TONE 02FB ; [*044E.0020.0002.02FB] # MODIFIER LETTER BEGIN LOW TONE 02FC ; [*044F.0020.0002.02FC] # MODIFIER LETTER END LOW TONE 02FD ; [*0450.0020.0002.02FD] # MODIFIER LETTER SHELF 02FE ; [*0451.0020.0002.02FE] # MODIFIER LETTER OPEN SHELF 02FF ; [*0452.0020.0002.02FF] # MODIFIER LETTER LOW LEFT ARROW 034F ; [.0000.0000.0000.034F] # COMBINING GRAPHEME JOINER 0374 ; [*0420.0020.0002.0374] # GREEK NUMERAL SIGN 0375 ; [*0421.0020.0002.0375] # GREEK LOWER NUMERAL SIGN 037E ; [*0232.0020.0002.037E] # GREEK QUESTION MARK 0384 ; [*0410.0020.0002.0384] # GREEK TONOS 0385 ; [*0416.0020.0002.00A8][.0000.0032.0002.0301] # GREEK DIALYTIKA TONOS 0387 ; [*0284.0020.0002.0387] # GREEK ANO TELEIA 03F6 ; [*0597.0020.0002.03F6] # GREEK REVERSED LUNATE EPSILON SYMBOL 0482 ; [*0483.0020.0002.0482] # CYRILLIC THOUSANDS SIGN 0488 ; [.0000.0000.0000.0488] # COMBINING CYRILLIC HUNDRED THOUSANDS SIGN 0489 ; [.0000.0000.0000.0489] # COMBINING CYRILLIC MILLIONS SIGN 055A ; [*03A8.0020.0002.055A] # ARMENIAN APOSTROPHE 055B ; [*03A9.0020.0002.055B] # ARMENIAN EMPHASIS MARK 055C ; [*0260.0020.0002.055C] # ARMENIAN EXCLAMATION MARK 055D ; [*0224.0020.0002.055D] # ARMENIAN COMMA 055E ; [*0266.0020.0002.055E] # ARMENIAN QUESTION MARK 055F ; [*03AA.0020.0002.055F] # ARMENIAN ABBREVIATION MARK 0589 ; [*0238.0020.0002.0589] # ARMENIAN FULL STOP 058A ; [*020F.0020.0002.058A] # ARMENIAN HYPHEN 0591 ; [.0000.0000.0000.0591] # HEBREW ACCENT ETNAHTA 0592 ; [.0000.0000.0000.0592] # HEBREW ACCENT SEGOL 0593 ; [.0000.0000.0000.0593] # HEBREW ACCENT SHALSHELET 0594 ; [.0000.0000.0000.0594] # HEBREW ACCENT ZAQEF QATAN 0595 ; [.0000.0000.0000.0595] # HEBREW ACCENT ZAQEF GADOL 0596 ; [.0000.0000.0000.0596] # HEBREW ACCENT TIPEHA 0597 ; [.0000.0000.0000.0597] # HEBREW ACCENT REVIA 0598 ; [.0000.0000.0000.0598] # HEBREW ACCENT ZARQA 0599 ; [.0000.0000.0000.0599] # HEBREW ACCENT PASHTA 059A ; [.0000.0000.0000.059A] # HEBREW ACCENT YETIV 059B ; [.0000.0000.0000.059B] # HEBREW ACCENT TEVIR 059C ; [.0000.0000.0000.059C] # HEBREW ACCENT GERESH 059D ; [.0000.0000.0000.059D] # HEBREW ACCENT GERESH MUQDAM 059E ; [.0000.0000.0000.059E] # HEBREW ACCENT GERSHAYIM 059F ; [.0000.0000.0000.059F] # HEBREW ACCENT QARNEY PARA 05A0 ; [.0000.0000.0000.05A0] # HEBREW ACCENT TELISHA GEDOLA 05A1 ; [.0000.0000.0000.05A1] # HEBREW ACCENT PAZER 05A2 ; [.0000.0000.0000.05A2] # HEBREW ACCENT ATNAH HAFUKH 05A3 ; [.0000.0000.0000.05A3] # HEBREW ACCENT MUNAH 05A4 ; [.0000.0000.0000.05A4] # HEBREW ACCENT MAHAPAKH 05A5 ; [.0000.0000.0000.05A5] # HEBREW ACCENT MERKHA 05A6 ; [.0000.0000.0000.05A6] # HEBREW ACCENT MERKHA KEFULA 05A7 ; [.0000.0000.0000.05A7] # HEBREW ACCENT DARGA 05A8 ; [.0000.0000.0000.05A8] # HEBREW ACCENT QADMA 05A9 ; [.0000.0000.0000.05A9] # HEBREW ACCENT TELISHA QETANA 05AA ; [.0000.0000.0000.05AA] # HEBREW ACCENT YERAH BEN YOMO 05AB ; [.0000.0000.0000.05AB] # HEBREW ACCENT OLE 05AC ; [.0000.0000.0000.05AC] # HEBREW ACCENT ILUY 05AD ; [.0000.0000.0000.05AD] # HEBREW ACCENT DEHI 05AE ; [.0000.0000.0000.05AE] # HEBREW ACCENT ZINOR 05AF ; [.0000.0000.0000.05AF] # HEBREW MARK MASORA CIRCLE 05BD ; [.0000.0000.0000.05BD] # HEBREW POINT METEG 05BE ; [*03AB.0020.0002.05BE] # HEBREW PUNCTUATION MAQAF 05C0 ; [*03AC.0020.0002.05C0] # HEBREW PUNCTUATION PASEQ 05C3 ; [*03AD.0020.0002.05C3] # HEBREW PUNCTUATION SOF PASUQ 05C4 ; [.0000.0000.0000.05C4] # HEBREW MARK UPPER DOT 05C5 ; [.0000.0000.0000.05C5] # HEBREW MARK LOWER DOT 05C6 ; [*03AE.0020.0002.05C6] # HEBREW PUNCTUATION NUN HAFUKHA 05F3 ; [*03AF.0020.0002.05F3] # HEBREW PUNCTUATION GERESH 05F4 ; [*03B0.0020.0002.05F4] # HEBREW PUNCTUATION GERSHAYIM 0600 ; [.0000.0000.0000.0600] # ARABIC NUMBER SIGN 0601 ; [.0000.0000.0000.0601] # ARABIC SIGN SANAH 0602 ; [.0000.0000.0000.0602] # ARABIC FOOTNOTE MARKER 0603 ; [.0000.0000.0000.0603] # ARABIC SIGN SAFHA 0604 ; [.0000.0000.0000.0604] # ARABIC SIGN SAMVAT 0606 ; [*05B3.0020.0002.0606] # ARABIC-INDIC CUBE ROOT 0607 ; [*05B5.0020.0002.0607] # ARABIC-INDIC FOURTH ROOT 0608 ; [*0484.0020.0002.0608] # ARABIC RAY 0609 ; [*037A.0020.0002.0609] # ARABIC-INDIC PER MILLE SIGN 060A ; [*037C.0020.0002.060A] # ARABIC-INDIC PER TEN THOUSAND SIGN 060C ; [*0225.0020.0002.060C] # ARABIC COMMA 060D ; [*0226.0020.0002.060D] # ARABIC DATE SEPARATOR 060E ; [*0487.0020.0002.060E] # ARABIC POETIC VERSE SIGN 060F ; [*0488.0020.0002.060F] # ARABIC SIGN MISRA 0610 ; [.0000.0000.0000.0610] # ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM 0611 ; [.0000.0000.0000.0611] # ARABIC SIGN ALAYHE ASSALLAM 0612 ; [.0000.0000.0000.0612] # ARABIC SIGN RAHMATULLAH ALAYHE 0613 ; [.0000.0000.0000.0613] # ARABIC SIGN RADI ALLAHOU ANHU 0614 ; [.0000.0000.0000.0614] # ARABIC SIGN TAKHALLUS 0615 ; [.0000.0000.0000.0615] # ARABIC SMALL HIGH TAH 0616 ; [.0000.0000.0000.0616] # ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH 0617 ; [.0000.0000.0000.0617] # ARABIC SMALL HIGH ZAIN 0618 ; [.0000.0000.0000.0618] # ARABIC SMALL FATHA 0619 ; [.0000.0000.0000.0619] # ARABIC SMALL DAMMA 061A ; [.0000.0000.0000.061A] # ARABIC SMALL KASRA 061B ; [*0233.0020.0002.061B] # ARABIC SEMICOLON 061E ; [*0239.0020.0002.061E] # ARABIC TRIPLE DOT PUNCTUATION MARK 061F ; [*0267.0020.0002.061F] # ARABIC QUESTION MARK 0640 ; [.0000.0000.0000.0640] # ARABIC TATWEEL 066A ; [*0378.0020.0002.066A] # ARABIC PERCENT SIGN 066B ; [*0227.0020.0002.066B] # ARABIC DECIMAL SEPARATOR 066C ; [*0228.0020.0002.066C] # ARABIC THOUSANDS SEPARATOR 066D ; [*0370.0020.0002.066D] # ARABIC FIVE POINTED STAR 06D4 ; [*0275.0020.0002.06D4] # ARABIC FULL STOP 06D6 ; [.0000.0000.0000.06D6] # ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA 06D7 ; [.0000.0000.0000.06D7] # ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA 06D8 ; [.0000.0000.0000.06D8] # ARABIC SMALL HIGH MEEM INITIAL FORM 06D9 ; [.0000.0000.0000.06D9] # ARABIC SMALL HIGH LAM ALEF 06DA ; [.0000.0000.0000.06DA] # ARABIC SMALL HIGH JEEM 06DB ; [.0000.0000.0000.06DB] # ARABIC SMALL HIGH THREE DOTS 06DC ; [.0000.0000.0000.06DC] # ARABIC SMALL HIGH SEEN 06DD ; [.0000.0000.0000.06DD] # ARABIC END OF AYAH 06DE ; [*0489.0020.0002.06DE] # ARABIC START OF RUB EL HIZB 06DF ; [.0000.0000.0000.06DF] # ARABIC SMALL HIGH ROUNDED ZERO 06E0 ; [.0000.0000.0000.06E0] # ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO 06E1 ; [.0000.0000.0000.06E1] # ARABIC SMALL HIGH DOTLESS HEAD OF KHAH 06E2 ; [.0000.0000.0000.06E2] # ARABIC SMALL HIGH MEEM ISOLATED FORM 06E3 ; [.0000.0000.0000.06E3] # ARABIC SMALL LOW SEEN 06E4 ; [.0000.0000.0000.06E4] # ARABIC SMALL HIGH MADDA 06E7 ; [.0000.0000.0000.06E7] # ARABIC SMALL HIGH YEH 06E8 ; [.0000.0000.0000.06E8] # ARABIC SMALL HIGH NOON 06E9 ; [*048A.0020.0002.06E9] # ARABIC PLACE OF SAJDAH 06EA ; [.0000.0000.0000.06EA] # ARABIC EMPTY CENTRE LOW STOP 06EB ; [.0000.0000.0000.06EB] # ARABIC EMPTY CENTRE HIGH STOP 06EC ; [.0000.0000.0000.06EC] # ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE 06ED ; [.0000.0000.0000.06ED] # ARABIC SMALL LOW MEEM 0700 ; [*02AF.0020.0002.0700] # SYRIAC END OF PARAGRAPH 0701 ; [*0276.0020.0002.0701] # SYRIAC SUPRALINEAR FULL STOP 0702 ; [*0277.0020.0002.0702] # SYRIAC SUBLINEAR FULL STOP 0703 ; [*023A.0020.0002.0703] # SYRIAC SUPRALINEAR COLON 0704 ; [*023B.0020.0002.0704] # SYRIAC SUBLINEAR COLON 0705 ; [*023C.0020.0002.0705] # SYRIAC HORIZONTAL COLON 0706 ; [*023D.0020.0002.0706] # SYRIAC COLON SKEWED LEFT 0707 ; [*023E.0020.0002.0707] # SYRIAC COLON SKEWED RIGHT 0708 ; [*023F.0020.0002.0708] # SYRIAC SUPRALINEAR COLON SKEWED LEFT 0709 ; [*0268.0020.0002.0709] # SYRIAC SUBLINEAR COLON SKEWED RIGHT 070A ; [*03B1.0020.0002.070A] # SYRIAC CONTRACTION 070B ; [*03B2.0020.0002.070B] # SYRIAC HARKLEAN OBELUS 070C ; [*03B3.0020.0002.070C] # SYRIAC HARKLEAN METOBELUS 070D ; [*03B4.0020.0002.070D] # SYRIAC HARKLEAN ASTERISCUS 0740 ; [.0000.0000.0000.0740] # SYRIAC FEMININE DOT 0743 ; [.0000.0000.0000.0743] # SYRIAC TWO VERTICAL DOTS ABOVE 0744 ; [.0000.0000.0000.0744] # SYRIAC TWO VERTICAL DOTS BELOW 0747 ; [.0000.0000.0000.0747] # SYRIAC OBLIQUE LINE ABOVE 0748 ; [.0000.0000.0000.0748] # SYRIAC OBLIQUE LINE BELOW 0749 ; [.0000.0000.0000.0749] # SYRIAC MUSIC 074A ; [.0000.0000.0000.074A] # SYRIAC BARREKH 07F6 ; [*049C.0020.0002.07F6] # NKO SYMBOL OO DENNEN 07F7 ; [*02B0.0020.0002.07F7] # NKO SYMBOL GBAKURUNEN 07F8 ; [*0229.0020.0002.07F8] # NKO COMMA 07F9 ; [*0261.0020.0002.07F9] # NKO EXCLAMATION MARK 07FA ; [.0000.0000.0000.07FA] # NKO LAJANYALAN 0830 ; [*0240.0020.0002.0830] # SAMARITAN PUNCTUATION NEQUDAA 0831 ; [*0241.0020.0002.0831] # SAMARITAN PUNCTUATION AFSAAQ 0832 ; [*0242.0020.0002.0832] # SAMARITAN PUNCTUATION ANGED 0833 ; [*0243.0020.0002.0833] # SAMARITAN PUNCTUATION BAU 0834 ; [*0244.0020.0002.0834] # SAMARITAN PUNCTUATION ATMAAU 0835 ; [*0245.0020.0002.0835] # SAMARITAN PUNCTUATION SHIYYAALAA 0836 ; [*0246.0020.0002.0836] # SAMARITAN ABBREVIATION MARK 0837 ; [*0247.0020.0002.0837] # SAMARITAN PUNCTUATION MELODIC QITSA 0838 ; [*0248.0020.0002.0838] # SAMARITAN PUNCTUATION ZIQAA 0839 ; [*0249.0020.0002.0839] # SAMARITAN PUNCTUATION QITSA 083A ; [*024A.0020.0002.083A] # SAMARITAN PUNCTUATION ZAEF 083B ; [*024B.0020.0002.083B] # SAMARITAN PUNCTUATION TURU 083C ; [*024C.0020.0002.083C] # SAMARITAN PUNCTUATION ARKAANU 083D ; [*024D.0020.0002.083D] # SAMARITAN PUNCTUATION SOF MASHFAAT 083E ; [*024E.0020.0002.083E] # SAMARITAN PUNCTUATION ANNAAU 085E ; [*03B5.0020.0002.085E] # MANDAIC PUNCTUATION 08EA ; [.0000.0000.0000.08EA] # ARABIC TONE ONE DOT ABOVE 08EB ; [.0000.0000.0000.08EB] # ARABIC TONE TWO DOTS ABOVE 08EC ; [.0000.0000.0000.08EC] # ARABIC TONE LOOP ABOVE 08ED ; [.0000.0000.0000.08ED] # ARABIC TONE ONE DOT BELOW 08EE ; [.0000.0000.0000.08EE] # ARABIC TONE TWO DOTS BELOW 08EF ; [.0000.0000.0000.08EF] # ARABIC TONE LOOP BELOW 08F3 ; [.0000.0000.0000.08F3] # ARABIC SMALL HIGH WAW 0951 ; [.0000.0000.0000.0951] # DEVANAGARI STRESS SIGN UDATTA 0952 ; [.0000.0000.0000.0952] # DEVANAGARI STRESS SIGN ANUDATTA 0964 ; [*0287.0020.0002.0964] # DEVANAGARI DANDA 0965 ; [*0288.0020.0002.0965] # DEVANAGARI DOUBLE DANDA 0970 ; [*03B7.0020.0002.0970] # DEVANAGARI ABBREVIATION SIGN 09F4 ; [*14BF.0020.0002.09F4] # BENGALI CURRENCY NUMERATOR ONE 09F5 ; [*14C0.0020.0002.09F5] # BENGALI CURRENCY NUMERATOR TWO 09F6 ; [*14C1.0020.0002.09F6] # BENGALI CURRENCY NUMERATOR THREE 09F7 ; [*14C2.0020.0002.09F7] # BENGALI CURRENCY NUMERATOR FOUR 09F8 ; [*14C3.0020.0002.09F8] # BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR 09F9 ; [*14C4.0020.0002.09F9] # BENGALI CURRENCY DENOMINATOR SIXTEEN 09FA ; [*049D.0020.0002.09FA] # BENGALI ISSHAR 0AF0 ; [*03BB.0020.0002.0AF0] # GUJARATI ABBREVIATION SIGN 0B70 ; [*049E.0020.0002.0B70] # ORIYA ISSHAR 0B72 ; [*14C5.0020.0002.0B72] # ORIYA FRACTION ONE QUARTER 0B73 ; [*14C6.0020.0002.0B73] # ORIYA FRACTION ONE HALF 0B74 ; [*14C7.0020.0002.0B74] # ORIYA FRACTION THREE QUARTERS 0B75 ; [*14C8.0020.0002.0B75] # ORIYA FRACTION ONE SIXTEENTH 0B76 ; [*14C9.0020.0002.0B76] # ORIYA FRACTION ONE EIGHTH 0B77 ; [*14CA.0020.0002.0B77] # ORIYA FRACTION THREE SIXTEENTHS 0BF0 ; [*14D1.0020.0002.0BF0] # TAMIL NUMBER TEN 0BF1 ; [*14D2.0020.0002.0BF1] # TAMIL NUMBER ONE HUNDRED 0BF2 ; [*14D3.0020.0002.0BF2] # TAMIL NUMBER ONE THOUSAND 0BF3 ; [*049F.0020.0002.0BF3] # TAMIL DAY SIGN 0BF4 ; [*04A0.0020.0002.0BF4] # TAMIL MONTH SIGN 0BF5 ; [*04A1.0020.0002.0BF5] # TAMIL YEAR SIGN 0BF6 ; [*04A2.0020.0002.0BF6] # TAMIL DEBIT SIGN 0BF7 ; [*04A3.0020.0002.0BF7] # TAMIL CREDIT SIGN 0BF8 ; [*04A4.0020.0002.0BF8] # TAMIL AS ABOVE SIGN 0BFA ; [*04A5.0020.0002.0BFA] # TAMIL NUMBER SIGN 0C7F ; [*04A6.0020.0002.0C7F] # TELUGU SIGN TUUMU 0D70 ; [*14D4.0020.0002.0D70] # MALAYALAM NUMBER TEN 0D71 ; [*14D5.0020.0002.0D71] # MALAYALAM NUMBER ONE HUNDRED 0D72 ; [*14D6.0020.0002.0D72] # MALAYALAM NUMBER ONE THOUSAND 0D73 ; [*14D7.0020.0002.0D73] # MALAYALAM FRACTION ONE QUARTER 0D74 ; [*14D8.0020.0002.0D74] # MALAYALAM FRACTION ONE HALF 0D75 ; [*14D9.0020.0002.0D75] # MALAYALAM FRACTION THREE QUARTERS 0D79 ; [*04A7.0020.0002.0D79] # MALAYALAM DATE MARK 0DF4 ; [*03BC.0020.0002.0DF4] # SINHALA PUNCTUATION KUNDDALIYA 0E4F ; [*03BD.0020.0002.0E4F] # THAI CHARACTER FONGMAN 0E5A ; [*03BE.0020.0002.0E5A] # THAI CHARACTER ANGKHANKHU 0E5B ; [*03BF.0020.0002.0E5B] # THAI CHARACTER KHOMUT 0F01 ; [*04AF.0020.0002.0F01] # TIBETAN MARK GTER YIG MGO TRUNCATED A 0F02 ; [*04B0.0020.0002.0F02] # TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA 0F03 ; [*04B1.0020.0002.0F03] # TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA 0F04 ; [*03C2.0020.0002.0F04] # TIBETAN MARK INITIAL YIG MGO MDUN MA 0F05 ; [*03C3.0020.0002.0F05] # TIBETAN MARK CLOSING YIG MGO SGAB MA 0F06 ; [*03C4.0020.0002.0F06] # TIBETAN MARK CARET YIG MGO PHUR SHAD MA 0F07 ; [*03C5.0020.0002.0F07] # TIBETAN MARK YIG MGO TSHEG SHAD MA 0F08 ; [*03C6.0020.0002.0F08] # TIBETAN MARK SBRUL SHAD 0F09 ; [*03C7.0020.0002.0F09] # TIBETAN MARK BSKUR YIG MGO 0F0A ; [*03C8.0020.0002.0F0A] # TIBETAN MARK BKA- SHOG YIG MGO 0F0B ; [*03CB.0020.0002.0F0B] # TIBETAN MARK INTERSYLLABIC TSHEG 0F0C ; [*03CB.0020.001B.0F0C] # TIBETAN MARK DELIMITER TSHEG BSTAR 0F0D ; [*03CC.0020.0002.0F0D] # TIBETAN MARK SHAD 0F0E ; [*03CD.0020.0002.0F0E] # TIBETAN MARK NYIS SHAD 0F0F ; [*03CE.0020.0002.0F0F] # TIBETAN MARK TSHEG SHAD 0F10 ; [*03CF.0020.0002.0F10] # TIBETAN MARK NYIS TSHEG SHAD 0F11 ; [*03D0.0020.0002.0F11] # TIBETAN MARK RIN CHEN SPUNGS SHAD 0F12 ; [*03D1.0020.0002.0F12] # TIBETAN MARK RGYA GRAM SHAD 0F13 ; [*04B2.0020.0002.0F13] # TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN 0F14 ; [*0256.0020.0002.0F14] # TIBETAN MARK GTER TSHEG 0F15 ; [*04B3.0020.0002.0F15] # TIBETAN LOGOTYPE SIGN CHAD RTAGS 0F16 ; [*04B4.0020.0002.0F16] # TIBETAN LOGOTYPE SIGN LHAG RTAGS 0F17 ; [*04B5.0020.0002.0F17] # TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS 0F18 ; [.0000.0000.0000.0F18] # TIBETAN ASTROLOGICAL SIGN -KHYUD PA 0F19 ; [.0000.0000.0000.0F19] # TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS 0F1A ; [*04B6.0020.0002.0F1A] # TIBETAN SIGN RDEL DKAR GCIG 0F1B ; [*04B7.0020.0002.0F1B] # TIBETAN SIGN RDEL DKAR GNYIS 0F1C ; [*04B8.0020.0002.0F1C] # TIBETAN SIGN RDEL DKAR GSUM 0F1D ; [*04B9.0020.0002.0F1D] # TIBETAN SIGN RDEL NAG GCIG 0F1E ; [*04BA.0020.0002.0F1E] # TIBETAN SIGN RDEL NAG GNYIS 0F1F ; [*04BB.0020.0002.0F1F] # TIBETAN SIGN RDEL DKAR RDEL NAG 0F34 ; [*04BC.0020.0002.0F34] # TIBETAN MARK BSDUS RTAGS 0F35 ; [.0000.0000.0000.0F35] # TIBETAN MARK NGAS BZUNG NYI ZLA 0F36 ; [*04BD.0020.0002.0F36] # TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN 0F37 ; [.0000.0000.0000.0F37] # TIBETAN MARK NGAS BZUNG SGOR RTAGS 0F38 ; [*04BE.0020.0002.0F38] # TIBETAN MARK CHE MGO 0F3A ; [*0301.0020.0002.0F3A] # TIBETAN MARK GUG RTAGS GYON 0F3B ; [*0302.0020.0002.0F3B] # TIBETAN MARK GUG RTAGS GYAS 0F3C ; [*0303.0020.0002.0F3C] # TIBETAN MARK ANG KHANG GYON 0F3D ; [*0304.0020.0002.0F3D] # TIBETAN MARK ANG KHANG GYAS 0F3E ; [.0000.0000.0000.0F3E] # TIBETAN SIGN YAR TSHES 0F3F ; [.0000.0000.0000.0F3F] # TIBETAN SIGN MAR TSHES 0F82 ; [.0000.0000.0000.0F82] # TIBETAN SIGN NYI ZLA NAA DA 0F83 ; [.0000.0000.0000.0F83] # TIBETAN SIGN SNA LDAN 0F85 ; [*03D2.0020.0002.0F85] # TIBETAN MARK PALUTA 0F86 ; [.0000.0000.0000.0F86] # TIBETAN SIGN LCI RTAGS 0F87 ; [.0000.0000.0000.0F87] # TIBETAN SIGN YANG RTAGS 0FBE ; [*04BF.0020.0002.0FBE] # TIBETAN KU RU KHA 0FBF ; [*04C0.0020.0002.0FBF] # TIBETAN KU RU KHA BZHI MIG CAN 0FC0 ; [*04C1.0020.0002.0FC0] # TIBETAN CANTILLATION SIGN HEAVY BEAT 0FC1 ; [*04C2.0020.0002.0FC1] # TIBETAN CANTILLATION SIGN LIGHT BEAT 0FC2 ; [*04C3.0020.0002.0FC2] # TIBETAN CANTILLATION SIGN CANG TE-U 0FC3 ; [*04C4.0020.0002.0FC3] # TIBETAN CANTILLATION SIGN SBUB -CHAL 0FC4 ; [*04C5.0020.0002.0FC4] # TIBETAN SYMBOL DRIL BU 0FC5 ; [*04C6.0020.0002.0FC5] # TIBETAN SYMBOL RDO RJE 0FC6 ; [.0000.0000.0000.0FC6] # TIBETAN SYMBOL PADMA GDAN 0FC7 ; [*04C7.0020.0002.0FC7] # TIBETAN SYMBOL RDO RJE RGYA GRAM 0FC8 ; [*04C8.0020.0002.0FC8] # TIBETAN SYMBOL PHUR PA 0FC9 ; [*04C9.0020.0002.0FC9] # TIBETAN SYMBOL NOR BU 0FCA ; [*04CA.0020.0002.0FCA] # TIBETAN SYMBOL NOR BU NYIS -KHYIL 0FCB ; [*04CB.0020.0002.0FCB] # TIBETAN SYMBOL NOR BU GSUM -KHYIL 0FCC ; [*04CC.0020.0002.0FCC] # TIBETAN SYMBOL NOR BU BZHI -KHYIL 0FCE ; [*04CD.0020.0002.0FCE] # TIBETAN SIGN RDEL NAG RDEL DKAR 0FCF ; [*04CE.0020.0002.0FCF] # TIBETAN SIGN RDEL NAG GSUM 0FD0 ; [*03C9.0020.0002.0FD0] # TIBETAN MARK BSKA- SHOG GI MGO RGYAN 0FD1 ; [*03CA.0020.0002.0FD1] # TIBETAN MARK MNYAM YIG GI MGO RGYAN 0FD2 ; [*03D3.0020.0002.0FD2] # TIBETAN MARK NYIS TSHEG 0FD3 ; [*03D4.0020.0002.0FD3] # TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA 0FD4 ; [*03D5.0020.0002.0FD4] # TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA 0FD5 ; [*04CF.0020.0002.0FD5] # RIGHT-FACING SVASTI SIGN 0FD6 ; [*04D0.0020.0002.0FD6] # LEFT-FACING SVASTI SIGN 0FD7 ; [*04D1.0020.0002.0FD7] # RIGHT-FACING SVASTI SIGN WITH DOTS 0FD8 ; [*04D2.0020.0002.0FD8] # LEFT-FACING SVASTI SIGN WITH DOTS 0FD9 ; [*03D6.0020.0002.0FD9] # TIBETAN MARK LEADING MCHAN RTAGS 0FDA ; [*03D7.0020.0002.0FDA] # TIBETAN MARK TRAILING MCHAN RTAGS 104A ; [*0292.0020.0002.104A] # MYANMAR SIGN LITTLE SECTION 104B ; [*0293.0020.0002.104B] # MYANMAR SIGN SECTION 104C ; [*03DB.0020.0002.104C] # MYANMAR SYMBOL LOCATIVE 104D ; [*03DC.0020.0002.104D] # MYANMAR SYMBOL COMPLETED 104E ; [*03DD.0020.0002.104E] # MYANMAR SYMBOL AFOREMENTIONED 104F ; [*03DE.0020.0002.104F] # MYANMAR SYMBOL GENITIVE 109E ; [*04D4.0020.0002.109E] # MYANMAR SYMBOL SHAN ONE 109F ; [*04D5.0020.0002.109F] # MYANMAR SYMBOL SHAN EXCLAMATION 10FB ; [*02B1.0020.0002.10FB] # GEORGIAN PARAGRAPH SEPARATOR 1360 ; [*02B2.0020.0002.1360] # ETHIOPIC SECTION MARK 1361 ; [*024F.0020.0002.1361] # ETHIOPIC WORDSPACE 1362 ; [*0278.0020.0002.1362] # ETHIOPIC FULL STOP 1363 ; [*0250.0020.0002.1363] # ETHIOPIC COMMA 1364 ; [*0251.0020.0002.1364] # ETHIOPIC SEMICOLON 1365 ; [*0252.0020.0002.1365] # ETHIOPIC COLON 1366 ; [*0253.0020.0002.1366] # ETHIOPIC PREFACE COLON 1367 ; [*0269.0020.0002.1367] # ETHIOPIC QUESTION MARK 1368 ; [*02B3.0020.0002.1368] # ETHIOPIC PARAGRAPH SEPARATOR 1372 ; [*14DA.0020.0002.1372] # ETHIOPIC NUMBER TEN 1373 ; [*14DB.0020.0002.1373] # ETHIOPIC NUMBER TWENTY 1374 ; [*14DC.0020.0002.1374] # ETHIOPIC NUMBER THIRTY 1375 ; [*14DD.0020.0002.1375] # ETHIOPIC NUMBER FORTY 1376 ; [*14DE.0020.0002.1376] # ETHIOPIC NUMBER FIFTY 1377 ; [*14DF.0020.0002.1377] # ETHIOPIC NUMBER SIXTY 1378 ; [*14E0.0020.0002.1378] # ETHIOPIC NUMBER SEVENTY 1379 ; [*14E1.0020.0002.1379] # ETHIOPIC NUMBER EIGHTY 137A ; [*14E2.0020.0002.137A] # ETHIOPIC NUMBER NINETY 137B ; [*14E3.0020.0002.137B] # ETHIOPIC NUMBER HUNDRED 137C ; [*14E4.0020.0002.137C] # ETHIOPIC NUMBER TEN THOUSAND 1390 ; [*0453.0020.0002.1390] # ETHIOPIC TONAL MARK YIZET 1391 ; [*0454.0020.0002.1391] # ETHIOPIC TONAL MARK DERET 1392 ; [*0455.0020.0002.1392] # ETHIOPIC TONAL MARK RIKRIK 1393 ; [*0456.0020.0002.1393] # ETHIOPIC TONAL MARK SHORT RIKRIK 1394 ; [*0457.0020.0002.1394] # ETHIOPIC TONAL MARK DIFAT 1395 ; [*0458.0020.0002.1395] # ETHIOPIC TONAL MARK KENAT 1396 ; [*0459.0020.0002.1396] # ETHIOPIC TONAL MARK CHIRET 1397 ; [*045A.0020.0002.1397] # ETHIOPIC TONAL MARK HIDET 1398 ; [*045B.0020.0002.1398] # ETHIOPIC TONAL MARK DERET-HIDET 1399 ; [*045C.0020.0002.1399] # ETHIOPIC TONAL MARK KURT 1400 ; [*0210.0020.0002.1400] # CANADIAN SYLLABICS HYPHEN 166D ; [*03EB.0020.0002.166D] # CANADIAN SYLLABICS CHI SIGN 166E ; [*027B.0020.0002.166E] # CANADIAN SYLLABICS FULL STOP 1680 ; [*020A.0020.0004.1680] # OGHAM SPACE MARK 169B ; [*0305.0020.0002.169B] # OGHAM FEATHER MARK 169C ; [*0306.0020.0002.169C] # OGHAM REVERSED FEATHER MARK 16EB ; [*025A.0020.0002.16EB] # RUNIC SINGLE PUNCTUATION 16EC ; [*025B.0020.0002.16EC] # RUNIC MULTIPLE PUNCTUATION 16ED ; [*025C.0020.0002.16ED] # RUNIC CROSS PUNCTUATION 1735 ; [*028F.0020.0002.1735] # PHILIPPINE SINGLE PUNCTUATION 1736 ; [*0290.0020.0002.1736] # PHILIPPINE DOUBLE PUNCTUATION 17B4 ; [.0000.0000.0000.17B4] # KHMER VOWEL INHERENT AQ 17B5 ; [.0000.0000.0000.17B5] # KHMER VOWEL INHERENT AA 17D3 ; [.0000.0000.0000.17D3] # KHMER SIGN BATHAMASAT 17D4 ; [*0294.0020.0002.17D4] # KHMER SIGN KHAN 17D5 ; [*0295.0020.0002.17D5] # KHMER SIGN BARIYOOSAN 17D6 ; [*0257.0020.0002.17D6] # KHMER SIGN CAMNUC PII KUUH 17D8 ; [*03DF.0020.0002.17D8] # KHMER SIGN BEYYAL 17D9 ; [*03E0.0020.0002.17D9] # KHMER SIGN PHNAEK MUAN 17DA ; [*03E1.0020.0002.17DA] # KHMER SIGN KOOMUUT 1800 ; [*03B6.0020.0002.1800] # MONGOLIAN BIRGA 1801 ; [*0274.0020.0002.1801] # MONGOLIAN ELLIPSIS 1802 ; [*022A.0020.0002.1802] # MONGOLIAN COMMA 1803 ; [*0279.0020.0002.1803] # MONGOLIAN FULL STOP 1804 ; [*0254.0020.0002.1804] # MONGOLIAN COLON 1805 ; [*0255.0020.0002.1805] # MONGOLIAN FOUR DOTS 1806 ; [*0212.0020.0002.1806] # MONGOLIAN TODO SOFT HYPHEN 1807 ; [*0213.0020.0002.1807] # MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER 1808 ; [*022B.0020.0002.1808] # MONGOLIAN MANCHU COMMA 1809 ; [*027A.0020.0002.1809] # MONGOLIAN MANCHU FULL STOP 180A ; [.0000.0000.0000.180A] # MONGOLIAN NIRUGU 180E ; [*0207.0020.0002.180E] # MONGOLIAN VOWEL SEPARATOR 1940 ; [*04D3.0020.0002.1940] # LIMBU SIGN LOO 1944 ; [*0262.0020.0002.1944] # LIMBU EXCLAMATION MARK 1945 ; [*026A.0020.0002.1945] # LIMBU QUESTION MARK 19E0 ; [*04D9.0020.0002.19E0] # KHMER SYMBOL PATHAMASAT 19E1 ; [*04DA.0020.0002.19E1] # KHMER SYMBOL MUOY KOET 19E2 ; [*04DB.0020.0002.19E2] # KHMER SYMBOL PII KOET 19E3 ; [*04DC.0020.0002.19E3] # KHMER SYMBOL BEI KOET 19E4 ; [*04DD.0020.0002.19E4] # KHMER SYMBOL BUON KOET 19E5 ; [*04DE.0020.0002.19E5] # KHMER SYMBOL PRAM KOET 19E6 ; [*04DF.0020.0002.19E6] # KHMER SYMBOL PRAM-MUOY KOET 19E7 ; [*04E0.0020.0002.19E7] # KHMER SYMBOL PRAM-PII KOET 19E8 ; [*04E1.0020.0002.19E8] # KHMER SYMBOL PRAM-BEI KOET 19E9 ; [*04E2.0020.0002.19E9] # KHMER SYMBOL PRAM-BUON KOET 19EA ; [*04E3.0020.0002.19EA] # KHMER SYMBOL DAP KOET 19EB ; [*04E4.0020.0002.19EB] # KHMER SYMBOL DAP-MUOY KOET 19EC ; [*04E5.0020.0002.19EC] # KHMER SYMBOL DAP-PII KOET 19ED ; [*04E6.0020.0002.19ED] # KHMER SYMBOL DAP-BEI KOET 19EE ; [*04E7.0020.0002.19EE] # KHMER SYMBOL DAP-BUON KOET 19EF ; [*04E8.0020.0002.19EF] # KHMER SYMBOL DAP-PRAM KOET 19F0 ; [*04E9.0020.0002.19F0] # KHMER SYMBOL TUTEYASAT 19F1 ; [*04EA.0020.0002.19F1] # KHMER SYMBOL MUOY ROC 19F2 ; [*04EB.0020.0002.19F2] # KHMER SYMBOL PII ROC 19F3 ; [*04EC.0020.0002.19F3] # KHMER SYMBOL BEI ROC 19F4 ; [*04ED.0020.0002.19F4] # KHMER SYMBOL BUON ROC 19F5 ; [*04EE.0020.0002.19F5] # KHMER SYMBOL PRAM ROC 19F6 ; [*04EF.0020.0002.19F6] # KHMER SYMBOL PRAM-MUOY ROC 19F7 ; [*04F0.0020.0002.19F7] # KHMER SYMBOL PRAM-PII ROC 19F8 ; [*04F1.0020.0002.19F8] # KHMER SYMBOL PRAM-BEI ROC 19F9 ; [*04F2.0020.0002.19F9] # KHMER SYMBOL PRAM-BUON ROC 19FA ; [*04F3.0020.0002.19FA] # KHMER SYMBOL DAP ROC 19FB ; [*04F4.0020.0002.19FB] # KHMER SYMBOL DAP-MUOY ROC 19FC ; [*04F5.0020.0002.19FC] # KHMER SYMBOL DAP-PII ROC 19FD ; [*04F6.0020.0002.19FD] # KHMER SYMBOL DAP-BEI ROC 19FE ; [*04F7.0020.0002.19FE] # KHMER SYMBOL DAP-BUON ROC 19FF ; [*04F8.0020.0002.19FF] # KHMER SYMBOL DAP-PRAM ROC 1A1E ; [*02B4.0020.0002.1A1E] # BUGINESE PALLAWA 1A1F ; [*02B5.0020.0002.1A1F] # BUGINESE END OF SECTION 1A7F ; [.0000.0000.0000.1A7F] # TAI THAM COMBINING CRYPTOGRAMMIC DOT 1AA0 ; [*03E2.0020.0002.1AA0] # TAI THAM SIGN WIANG 1AA1 ; [*03E3.0020.0002.1AA1] # TAI THAM SIGN WIANGWAAK 1AA2 ; [*03E4.0020.0002.1AA2] # TAI THAM SIGN SAWAN 1AA3 ; [*03E5.0020.0002.1AA3] # TAI THAM SIGN KEOW 1AA4 ; [*03E6.0020.0002.1AA4] # TAI THAM SIGN HOY 1AA5 ; [*03E7.0020.0002.1AA5] # TAI THAM SIGN DOKMAI 1AA6 ; [*03E8.0020.0002.1AA6] # TAI THAM SIGN REVERSED ROTATED RANA 1AA8 ; [*0296.0020.0002.1AA8] # TAI THAM SIGN KAAN 1AA9 ; [*0297.0020.0002.1AA9] # TAI THAM SIGN KAANKUU 1AAA ; [*0298.0020.0002.1AAA] # TAI THAM SIGN SATKAAN 1AAB ; [*0299.0020.0002.1AAB] # TAI THAM SIGN SATKAANKUU 1AAC ; [*03E9.0020.0002.1AAC] # TAI THAM SIGN HANG 1AAD ; [*03EA.0020.0002.1AAD] # TAI THAM SIGN CAANG 1B5A ; [*02B6.0020.0002.1B5A] # BALINESE PANTI 1B5B ; [*02B7.0020.0002.1B5B] # BALINESE PAMADA 1B5C ; [*027C.0020.0002.1B5C] # BALINESE WINDU 1B5D ; [*0258.0020.0002.1B5D] # BALINESE CARIK PAMUNGKAH 1B5E ; [*029A.0020.0002.1B5E] # BALINESE CARIK SIKI 1B5F ; [*029B.0020.0002.1B5F] # BALINESE CARIK PAREREN 1B60 ; [*0211.0020.0002.1B60] # BALINESE PAMENENG 1B61 ; [*04F9.0020.0002.1B61] # BALINESE MUSICAL SYMBOL DONG 1B62 ; [*04FA.0020.0002.1B62] # BALINESE MUSICAL SYMBOL DENG 1B63 ; [*04FB.0020.0002.1B63] # BALINESE MUSICAL SYMBOL DUNG 1B64 ; [*04FC.0020.0002.1B64] # BALINESE MUSICAL SYMBOL DANG 1B65 ; [*04FD.0020.0002.1B65] # BALINESE MUSICAL SYMBOL DANG SURANG 1B66 ; [*04FE.0020.0002.1B66] # BALINESE MUSICAL SYMBOL DING 1B67 ; [*04FF.0020.0002.1B67] # BALINESE MUSICAL SYMBOL DAENG 1B68 ; [*0500.0020.0002.1B68] # BALINESE MUSICAL SYMBOL DEUNG 1B69 ; [*0501.0020.0002.1B69] # BALINESE MUSICAL SYMBOL DAING 1B6A ; [*0502.0020.0002.1B6A] # BALINESE MUSICAL SYMBOL DANG GEDE 1B6B ; [.0000.0000.0000.1B6B] # BALINESE MUSICAL SYMBOL COMBINING TEGEH 1B6C ; [.0000.0000.0000.1B6C] # BALINESE MUSICAL SYMBOL COMBINING ENDEP 1B6D ; [.0000.0000.0000.1B6D] # BALINESE MUSICAL SYMBOL COMBINING KEMPUL 1B6E ; [.0000.0000.0000.1B6E] # BALINESE MUSICAL SYMBOL COMBINING KEMPLI 1B6F ; [.0000.0000.0000.1B6F] # BALINESE MUSICAL SYMBOL COMBINING JEGOGAN 1B70 ; [.0000.0000.0000.1B70] # BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN 1B71 ; [.0000.0000.0000.1B71] # BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN 1B72 ; [.0000.0000.0000.1B72] # BALINESE MUSICAL SYMBOL COMBINING BENDE 1B73 ; [.0000.0000.0000.1B73] # BALINESE MUSICAL SYMBOL COMBINING GONG 1B74 ; [*0503.0020.0002.1B74] # BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG 1B75 ; [*0504.0020.0002.1B75] # BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG 1B76 ; [*0505.0020.0002.1B76] # BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK 1B77 ; [*0506.0020.0002.1B77] # BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK 1B78 ; [*0507.0020.0002.1B78] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG 1B79 ; [*0508.0020.0002.1B79] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG 1B7A ; [*0509.0020.0002.1B7A] # BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK 1B7B ; [*050A.0020.0002.1B7B] # BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK 1B7C ; [*050B.0020.0002.1B7C] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING 1BFC ; [*03F7.0020.0002.1BFC] # BATAK SYMBOL BINDU NA METEK 1BFD ; [*03F8.0020.0002.1BFD] # BATAK SYMBOL BINDU PINARBORAS 1BFE ; [*03F9.0020.0002.1BFE] # BATAK SYMBOL BINDU JUDUL 1BFF ; [*03FA.0020.0002.1BFF] # BATAK SYMBOL BINDU PANGOLAT 1C3B ; [*028B.0020.0002.1C3B] # LEPCHA PUNCTUATION TA-ROL 1C3C ; [*028C.0020.0002.1C3C] # LEPCHA PUNCTUATION NYET THYOOM TA-ROL 1C3D ; [*03D8.0020.0002.1C3D] # LEPCHA PUNCTUATION CER-WA 1C3E ; [*03D9.0020.0002.1C3E] # LEPCHA PUNCTUATION TSHOOK CER-WA 1C3F ; [*03DA.0020.0002.1C3F] # LEPCHA PUNCTUATION TSHOOK 1C7E ; [*02AD.0020.0002.1C7E] # OL CHIKI PUNCTUATION MUCAAD 1C7F ; [*02AE.0020.0002.1C7F] # OL CHIKI PUNCTUATION DOUBLE MUCAAD 1CC0 ; [*03EC.0020.0002.1CC0] # SUNDANESE PUNCTUATION BINDU SURYA 1CC1 ; [*03ED.0020.0002.1CC1] # SUNDANESE PUNCTUATION BINDU PANGLONG 1CC2 ; [*03EE.0020.0002.1CC2] # SUNDANESE PUNCTUATION BINDU PURNAMA 1CC3 ; [*03EF.0020.0002.1CC3] # SUNDANESE PUNCTUATION BINDU CAKRA 1CC4 ; [*03F0.0020.0002.1CC4] # SUNDANESE PUNCTUATION BINDU LEU SATANGA 1CC5 ; [*03F1.0020.0002.1CC5] # SUNDANESE PUNCTUATION BINDU KA SATANGA 1CC6 ; [*03F2.0020.0002.1CC6] # SUNDANESE PUNCTUATION BINDU DA SATANGA 1CC7 ; [*03F3.0020.0002.1CC7] # SUNDANESE PUNCTUATION BINDU BA SATANGA 1CD0 ; [.0000.0000.0000.1CD0] # VEDIC TONE KARSHANA 1CD1 ; [.0000.0000.0000.1CD1] # VEDIC TONE SHARA 1CD2 ; [.0000.0000.0000.1CD2] # VEDIC TONE PRENKHA 1CD3 ; [.0000.0000.0000.1CD3] # VEDIC SIGN NIHSHVASA 1CD4 ; [.0000.0000.0000.1CD4] # VEDIC SIGN YAJURVEDIC MIDLINE SVARITA 1CD5 ; [.0000.0000.0000.1CD5] # VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA 1CD6 ; [.0000.0000.0000.1CD6] # VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA 1CD7 ; [.0000.0000.0000.1CD7] # VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA 1CD8 ; [.0000.0000.0000.1CD8] # VEDIC TONE CANDRA BELOW 1CD9 ; [.0000.0000.0000.1CD9] # VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER 1CDA ; [.0000.0000.0000.1CDA] # VEDIC TONE DOUBLE SVARITA 1CDB ; [.0000.0000.0000.1CDB] # VEDIC TONE TRIPLE SVARITA 1CDC ; [.0000.0000.0000.1CDC] # VEDIC TONE KATHAKA ANUDATTA 1CDD ; [.0000.0000.0000.1CDD] # VEDIC TONE DOT BELOW 1CDE ; [.0000.0000.0000.1CDE] # VEDIC TONE TWO DOTS BELOW 1CDF ; [.0000.0000.0000.1CDF] # VEDIC TONE THREE DOTS BELOW 1CE0 ; [.0000.0000.0000.1CE0] # VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA 1CE1 ; [.0000.0000.0000.1CE1] # VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA 1CE2 ; [.0000.0000.0000.1CE2] # VEDIC SIGN VISARGA SVARITA 1CE3 ; [.0000.0000.0000.1CE3] # VEDIC SIGN VISARGA UDATTA 1CE4 ; [.0000.0000.0000.1CE4] # VEDIC SIGN REVERSED VISARGA UDATTA 1CE5 ; [.0000.0000.0000.1CE5] # VEDIC SIGN VISARGA ANUDATTA 1CE6 ; [.0000.0000.0000.1CE6] # VEDIC SIGN REVERSED VISARGA ANUDATTA 1CE7 ; [.0000.0000.0000.1CE7] # VEDIC SIGN VISARGA UDATTA WITH TAIL 1CE8 ; [.0000.0000.0000.1CE8] # VEDIC SIGN VISARGA ANUDATTA WITH TAIL 1CF4 ; [.0000.0000.0000.1CF4] # VEDIC TONE CANDRA ABOVE 1FBD ; [*041B.0020.0002.1FBD] # GREEK KORONIS 1FBF ; [*041B.0020.0002.1FBF] # GREEK PSILI 1FC0 ; [*041D.0020.0002.1FC0] # GREEK PERISPOMENI 1FC1 ; [*0416.0020.0002.00A8][.0000.0045.0002.0342] # GREEK DIALYTIKA AND PERISPOMENI 1FCD ; [*041B.0020.0002.1FBF][.0000.0035.0002.0300] # GREEK PSILI AND VARIA 1FCE ; [*041B.0020.0002.1FBF][.0000.0032.0002.0301] # GREEK PSILI AND OXIA 1FCF ; [*041B.0020.0002.1FBF][.0000.0045.0002.0342] # GREEK PSILI AND PERISPOMENI 1FDD ; [*041C.0020.0002.1FFE][.0000.0035.0002.0300] # GREEK DASIA AND VARIA 1FDE ; [*041C.0020.0002.1FFE][.0000.0032.0002.0301] # GREEK DASIA AND OXIA 1FDF ; [*041C.0020.0002.1FFE][.0000.0045.0002.0342] # GREEK DASIA AND PERISPOMENI 1FED ; [*0416.0020.0002.00A8][.0000.0035.0002.0300] # GREEK DIALYTIKA AND VARIA 1FEE ; [*0416.0020.0002.00A8][.0000.0032.0002.0301] # GREEK DIALYTIKA AND OXIA 1FEF ; [*040F.0020.0002.1FEF] # GREEK VARIA 1FFD ; [*0410.0020.0002.1FFD] # GREEK OXIA 1FFE ; [*041C.0020.0002.1FFE] # GREEK DASIA 2000 ; [*020A.0020.0004.2000] # EN QUAD 2001 ; [*020A.0020.0004.2001] # EM QUAD 2002 ; [*020A.0020.0004.2002] # EN SPACE 2003 ; [*020A.0020.0004.2003] # EM SPACE 2004 ; [*020A.0020.0004.2004] # THREE-PER-EM SPACE 2005 ; [*020A.0020.0004.2005] # FOUR-PER-EM SPACE 2006 ; [*020A.0020.0004.2006] # SIX-PER-EM SPACE 2007 ; [*020A.0020.001B.2007] # FIGURE SPACE 2008 ; [*020A.0020.0004.2008] # PUNCTUATION SPACE 2009 ; [*020A.0020.0004.2009] # THIN SPACE 200A ; [*020A.0020.0004.200A] # HAIR SPACE 2010 ; [*0214.0020.0002.2010] # HYPHEN 2011 ; [*0214.0020.001B.2011] # NON-BREAKING HYPHEN 2012 ; [*0215.0020.0002.2012] # FIGURE DASH 2013 ; [*0216.0020.0002.2013] # EN DASH 2014 ; [*0217.0020.0002.2014] # EM DASH 2015 ; [*0218.0020.0002.2015] # HORIZONTAL BAR 2016 ; [*0363.0020.0002.2016] # DOUBLE VERTICAL LINE 2017 ; [*020D.0020.0002.2017] # DOUBLE LOW LINE 2018 ; [*02EB.0020.0002.2018] # LEFT SINGLE QUOTATION MARK 2019 ; [*02EC.0020.0002.2019] # RIGHT SINGLE QUOTATION MARK 201A ; [*02ED.0020.0002.201A] # SINGLE LOW-9 QUOTATION MARK 201B ; [*02EE.0020.0002.201B] # SINGLE HIGH-REVERSED-9 QUOTATION MARK 201C ; [*02F2.0020.0002.201C] # LEFT DOUBLE QUOTATION MARK 201D ; [*02F3.0020.0002.201D] # RIGHT DOUBLE QUOTATION MARK 201E ; [*02F4.0020.0002.201E] # DOUBLE LOW-9 QUOTATION MARK 201F ; [*02F5.0020.0002.201F] # DOUBLE HIGH-REVERSED-9 QUOTATION MARK 2020 ; [*037D.0020.0002.2020] # DAGGER 2021 ; [*037E.0020.0002.2021] # DOUBLE DAGGER 2022 ; [*0382.0020.0002.2022] # BULLET 2023 ; [*0383.0020.0002.2023] # TRIANGULAR BULLET 2024 ; [*0273.0020.0004.2024] # ONE DOT LEADER 2025 ; [*0273.0020.0004.2025][*0273.0020.0004.2025] # TWO DOT LEADER 2026 ; [*0273.0020.0004.2026][*0273.0020.0004.2026][*0273.0020.001F.2026] # HORIZONTAL ELLIPSIS 2027 ; [*0384.0020.0002.2027] # HYPHENATION POINT 2028 ; [*0208.0020.0002.2028] # LINE SEPARATOR 2029 ; [*0209.0020.0002.2029] # PARAGRAPH SEPARATOR 202F ; [*020A.0020.001B.202F] # NARROW NO-BREAK SPACE 2030 ; [*0379.0020.0002.2030] # PER MILLE SIGN 2031 ; [*037B.0020.0002.2031] # PER TEN THOUSAND SIGN 2032 ; [*0388.0020.0002.2032] # PRIME 2033 ; [*0388.0020.0004.2033][*0388.0020.0004.2033] # DOUBLE PRIME 2034 ; [*0388.0020.0004.2034][*0388.0020.0004.2034][*0388.0020.001F.2034] # TRIPLE PRIME 2035 ; [*0389.0020.0002.2035] # REVERSED PRIME 2036 ; [*0389.0020.0004.2036][*0389.0020.0004.2036] # REVERSED DOUBLE PRIME 2037 ; [*0389.0020.0004.2037][*0389.0020.0004.2037][*0389.0020.001F.2037] # REVERSED TRIPLE PRIME 2038 ; [*038C.0020.0002.2038] # CARET 2039 ; [*02EF.0020.0002.2039] # SINGLE LEFT-POINTING ANGLE QUOTATION MARK 203A ; [*02F0.0020.0002.203A] # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK 203B ; [*038D.0020.0002.203B] # REFERENCE MARK 203C ; [*025E.0020.0004.203C][*025E.0020.0004.203C] # DOUBLE EXCLAMATION MARK 203D ; [*0271.0020.0002.203D] # INTERROBANG 203E ; [*020B.0020.0002.203E] # OVERLINE 203F ; [*038E.0020.0002.203F] # UNDERTIE 2040 ; [*0390.0020.0002.2040] # CHARACTER TIE 2041 ; [*0392.0020.0002.2041] # CARET INSERTION POINT 2042 ; [*0393.0020.0002.2042] # ASTERISM 2043 ; [*0385.0020.0002.2043] # HYPHEN BULLET 2044 ; [*05AC.0020.0002.2044] # FRACTION SLASH 2045 ; [*0307.0020.0002.2045] # LEFT SQUARE BRACKET WITH QUILL 2046 ; [*0308.0020.0002.2046] # RIGHT SQUARE BRACKET WITH QUILL 2047 ; [*0263.0020.0004.2047][*0263.0020.0004.2047] # DOUBLE QUESTION MARK 2048 ; [*0263.0020.0004.2048][*025E.0020.0004.2048] # QUESTION EXCLAMATION MARK 2049 ; [*025E.0020.0004.2049][*0263.0020.0004.2049] # EXCLAMATION QUESTION MARK 204A ; [*0375.0020.0002.204A] # TIRONIAN SIGN ET 204B ; [*036B.0020.0002.204B] # REVERSED PILCROW SIGN 204C ; [*0386.0020.0002.204C] # BLACK LEFTWARDS BULLET 204D ; [*0387.0020.0002.204D] # BLACK RIGHTWARDS BULLET 204E ; [*036E.0020.0002.204E] # LOW ASTERISK 204F ; [*0234.0020.0002.204F] # REVERSED SEMICOLON 2050 ; [*0391.0020.0002.2050] # CLOSE UP 2051 ; [*036F.0020.0002.2051] # TWO ASTERISKS ALIGNED VERTICALLY 2052 ; [*05A8.0020.0002.2052] # COMMERCIAL MINUS SIGN 2053 ; [*021B.0020.0002.2053] # SWUNG DASH 2054 ; [*038F.0020.0002.2054] # INVERTED UNDERTIE 2055 ; [*02CF.0020.0002.2055] # FLOWER PUNCTUATION MARK 2056 ; [*02D0.0020.0002.2056] # THREE DOT PUNCTUATION 2057 ; [*0388.0020.0004.2057][*0388.0020.0004.2057][*0388.0020.001F.2057][*0388.0020.001F.2057] # QUADRUPLE PRIME 2058 ; [*02D1.0020.0002.2058] # FOUR DOT PUNCTUATION 2059 ; [*02D2.0020.0002.2059] # FIVE DOT PUNCTUATION 205A ; [*02D3.0020.0002.205A] # TWO DOT PUNCTUATION 205B ; [*02D4.0020.0002.205B] # FOUR DOT MARK 205C ; [*02D5.0020.0002.205C] # DOTTED CROSS 205D ; [*02D6.0020.0002.205D] # TRICOLON 205E ; [*02D7.0020.0002.205E] # VERTICAL FOUR DOTS 205F ; [*020A.0020.0004.205F] # MEDIUM MATHEMATICAL SPACE 2061 ; [.0000.0000.0000.2061] # FUNCTION APPLICATION 2062 ; [.0000.0000.0000.2062] # INVISIBLE TIMES 2063 ; [.0000.0000.0000.2063] # INVISIBLE SEPARATOR 2064 ; [.0000.0000.0000.2064] # INVISIBLE PLUS 207A ; [*059C.0020.0014.207A] # SUPERSCRIPT PLUS SIGN 207B ; [*05A7.0020.0014.207B] # SUPERSCRIPT MINUS 207C ; [*05A1.0020.0014.207C] # SUPERSCRIPT EQUALS SIGN 207D ; [*02FB.0020.0014.207D] # SUPERSCRIPT LEFT PARENTHESIS 207E ; [*02FC.0020.0014.207E] # SUPERSCRIPT RIGHT PARENTHESIS 208A ; [*059C.0020.0015.208A] # SUBSCRIPT PLUS SIGN 208B ; [*05A7.0020.0015.208B] # SUBSCRIPT MINUS 208C ; [*05A1.0020.0015.208C] # SUBSCRIPT EQUALS SIGN 208D ; [*02FB.0020.0015.208D] # SUBSCRIPT LEFT PARENTHESIS 208E ; [*02FC.0020.0015.208E] # SUBSCRIPT RIGHT PARENTHESIS 2104 ; [*050E.0020.0002.2104] # CENTRE LINE SYMBOL 2108 ; [*050F.0020.0002.2108] # SCRUPLE 2114 ; [*0510.0020.0002.2114] # L B BAR SYMBOL 2117 ; [*0511.0020.0002.2117] # SOUND RECORDING COPYRIGHT 2118 ; [*0512.0020.0002.2118] # SCRIPT CAPITAL P 211E ; [*0513.0020.0002.211E] # PRESCRIPTION TAKE 211F ; [*0514.0020.0002.211F] # RESPONSE 2123 ; [*0515.0020.0002.2123] # VERSICLE 2125 ; [*0516.0020.0002.2125] # OUNCE SIGN 2127 ; [*0517.0020.0002.2127] # INVERTED OHM SIGN 2129 ; [*0518.0020.0002.2129] # TURNED GREEK SMALL LETTER IOTA 212E ; [*0519.0020.0002.212E] # ESTIMATED SYMBOL 213A ; [*051A.0020.0002.213A] # ROTATED CAPITAL Q 2140 ; [*059B.0020.0005.2140] # DOUBLE-STRUCK N-ARY SUMMATION 2141 ; [*051B.0020.0002.2141] # TURNED SANS-SERIF CAPITAL G 2142 ; [*051C.0020.0002.2142] # TURNED SANS-SERIF CAPITAL L 2143 ; [*051D.0020.0002.2143] # REVERSED SANS-SERIF CAPITAL L 2144 ; [*051E.0020.0002.2144] # TURNED SANS-SERIF CAPITAL Y 214A ; [*051F.0020.0002.214A] # PROPERTY LINE 214B ; [*0637.0020.0002.214B] # TURNED AMPERSAND 214C ; [*0520.0020.0002.214C] # PER SIGN 214F ; [*0521.0020.0002.214F] # SYMBOL FOR SAMARITAN SOURCE 2180 ; [*14E5.0020.0002.2180] # ROMAN NUMERAL ONE THOUSAND C D 2181 ; [*14E6.0020.0002.2181] # ROMAN NUMERAL FIVE THOUSAND 2182 ; [*14E7.0020.0002.2182] # ROMAN NUMERAL TEN THOUSAND 2186 ; [*14E8.0020.0002.2186] # ROMAN NUMERAL FIFTY EARLY FORM 2187 ; [*14E9.0020.0002.2187] # ROMAN NUMERAL FIFTY THOUSAND 2188 ; [*14EA.0020.0002.2188] # ROMAN NUMERAL ONE HUNDRED THOUSAND 2190 ; [*0522.0020.0002.2190] # LEFTWARDS ARROW 2191 ; [*0524.0020.0002.2191] # UPWARDS ARROW 2192 ; [*0523.0020.0002.2192] # RIGHTWARDS ARROW 2193 ; [*0525.0020.0002.2193] # DOWNWARDS ARROW 2194 ; [*0526.0020.0002.2194] # LEFT RIGHT ARROW 2195 ; [*0527.0020.0002.2195] # UP DOWN ARROW 2196 ; [*0528.0020.0002.2196] # NORTH WEST ARROW 2197 ; [*0529.0020.0002.2197] # NORTH EAST ARROW 2198 ; [*052A.0020.0002.2198] # SOUTH EAST ARROW 2199 ; [*052B.0020.0002.2199] # SOUTH WEST ARROW 219A ; [*0522.0020.0002.2190][.0000.0054.0002.0338] # LEFTWARDS ARROW WITH STROKE 219B ; [*0523.0020.0002.2192][.0000.0054.0002.0338] # RIGHTWARDS ARROW WITH STROKE 219C ; [*052C.0020.0002.219C] # LEFTWARDS WAVE ARROW 219D ; [*052D.0020.0002.219D] # RIGHTWARDS WAVE ARROW 219E ; [*052E.0020.0002.219E] # LEFTWARDS TWO HEADED ARROW 219F ; [*052F.0020.0002.219F] # UPWARDS TWO HEADED ARROW 21A0 ; [*0530.0020.0002.21A0] # RIGHTWARDS TWO HEADED ARROW 21A1 ; [*0531.0020.0002.21A1] # DOWNWARDS TWO HEADED ARROW 21A2 ; [*0532.0020.0002.21A2] # LEFTWARDS ARROW WITH TAIL 21A3 ; [*0533.0020.0002.21A3] # RIGHTWARDS ARROW WITH TAIL 21A4 ; [*0534.0020.0002.21A4] # LEFTWARDS ARROW FROM BAR 21A5 ; [*0535.0020.0002.21A5] # UPWARDS ARROW FROM BAR 21A6 ; [*0536.0020.0002.21A6] # RIGHTWARDS ARROW FROM BAR 21A7 ; [*0537.0020.0002.21A7] # DOWNWARDS ARROW FROM BAR 21A8 ; [*0538.0020.0002.21A8] # UP DOWN ARROW WITH BASE 21A9 ; [*0539.0020.0002.21A9] # LEFTWARDS ARROW WITH HOOK 21AA ; [*053A.0020.0002.21AA] # RIGHTWARDS ARROW WITH HOOK 21AB ; [*053B.0020.0002.21AB] # LEFTWARDS ARROW WITH LOOP 21AC ; [*053C.0020.0002.21AC] # RIGHTWARDS ARROW WITH LOOP 21AD ; [*053D.0020.0002.21AD] # LEFT RIGHT WAVE ARROW 21AE ; [*0526.0020.0002.2194][.0000.0054.0002.0338] # LEFT RIGHT ARROW WITH STROKE 21AF ; [*053E.0020.0002.21AF] # DOWNWARDS ZIGZAG ARROW 21B0 ; [*053F.0020.0002.21B0] # UPWARDS ARROW WITH TIP LEFTWARDS 21B1 ; [*0540.0020.0002.21B1] # UPWARDS ARROW WITH TIP RIGHTWARDS 21B2 ; [*0541.0020.0002.21B2] # DOWNWARDS ARROW WITH TIP LEFTWARDS 21B3 ; [*0542.0020.0002.21B3] # DOWNWARDS ARROW WITH TIP RIGHTWARDS 21B4 ; [*0543.0020.0002.21B4] # RIGHTWARDS ARROW WITH CORNER DOWNWARDS 21B5 ; [*0544.0020.0002.21B5] # DOWNWARDS ARROW WITH CORNER LEFTWARDS 21B6 ; [*0545.0020.0002.21B6] # ANTICLOCKWISE TOP SEMICIRCLE ARROW 21B7 ; [*0546.0020.0002.21B7] # CLOCKWISE TOP SEMICIRCLE ARROW 21B8 ; [*0547.0020.0002.21B8] # NORTH WEST ARROW TO LONG BAR 21B9 ; [*0548.0020.0002.21B9] # LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR 21BA ; [*0549.0020.0002.21BA] # ANTICLOCKWISE OPEN CIRCLE ARROW 21BB ; [*054A.0020.0002.21BB] # CLOCKWISE OPEN CIRCLE ARROW 21BC ; [*054B.0020.0002.21BC] # LEFTWARDS HARPOON WITH BARB UPWARDS 21BD ; [*054C.0020.0002.21BD] # LEFTWARDS HARPOON WITH BARB DOWNWARDS 21BE ; [*054D.0020.0002.21BE] # UPWARDS HARPOON WITH BARB RIGHTWARDS 21BF ; [*054E.0020.0002.21BF] # UPWARDS HARPOON WITH BARB LEFTWARDS 21C0 ; [*054F.0020.0002.21C0] # RIGHTWARDS HARPOON WITH BARB UPWARDS 21C1 ; [*0550.0020.0002.21C1] # RIGHTWARDS HARPOON WITH BARB DOWNWARDS 21C2 ; [*0551.0020.0002.21C2] # DOWNWARDS HARPOON WITH BARB RIGHTWARDS 21C3 ; [*0552.0020.0002.21C3] # DOWNWARDS HARPOON WITH BARB LEFTWARDS 21C4 ; [*0553.0020.0002.21C4] # RIGHTWARDS ARROW OVER LEFTWARDS ARROW 21C5 ; [*0554.0020.0002.21C5] # UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW 21C6 ; [*0555.0020.0002.21C6] # LEFTWARDS ARROW OVER RIGHTWARDS ARROW 21C7 ; [*0556.0020.0002.21C7] # LEFTWARDS PAIRED ARROWS 21C8 ; [*0557.0020.0002.21C8] # UPWARDS PAIRED ARROWS 21C9 ; [*0558.0020.0002.21C9] # RIGHTWARDS PAIRED ARROWS 21CA ; [*0559.0020.0002.21CA] # DOWNWARDS PAIRED ARROWS 21CB ; [*055A.0020.0002.21CB] # LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON 21CC ; [*055B.0020.0002.21CC] # RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON 21CD ; [*055C.0020.0002.21D0][.0000.0054.0002.0338] # LEFTWARDS DOUBLE ARROW WITH STROKE 21CE ; [*0560.0020.0002.21D4][.0000.0054.0002.0338] # LEFT RIGHT DOUBLE ARROW WITH STROKE 21CF ; [*055E.0020.0002.21D2][.0000.0054.0002.0338] # RIGHTWARDS DOUBLE ARROW WITH STROKE 21D0 ; [*055C.0020.0002.21D0] # LEFTWARDS DOUBLE ARROW 21D1 ; [*055D.0020.0002.21D1] # UPWARDS DOUBLE ARROW 21D2 ; [*055E.0020.0002.21D2] # RIGHTWARDS DOUBLE ARROW 21D3 ; [*055F.0020.0002.21D3] # DOWNWARDS DOUBLE ARROW 21D4 ; [*0560.0020.0002.21D4] # LEFT RIGHT DOUBLE ARROW 21D5 ; [*0561.0020.0002.21D5] # UP DOWN DOUBLE ARROW 21D6 ; [*0562.0020.0002.21D6] # NORTH WEST DOUBLE ARROW 21D7 ; [*0563.0020.0002.21D7] # NORTH EAST DOUBLE ARROW 21D8 ; [*0564.0020.0002.21D8] # SOUTH EAST DOUBLE ARROW 21D9 ; [*0565.0020.0002.21D9] # SOUTH WEST DOUBLE ARROW 21DA ; [*0566.0020.0002.21DA] # LEFTWARDS TRIPLE ARROW 21DB ; [*0567.0020.0002.21DB] # RIGHTWARDS TRIPLE ARROW 21DC ; [*0568.0020.0002.21DC] # LEFTWARDS SQUIGGLE ARROW 21DD ; [*0569.0020.0002.21DD] # RIGHTWARDS SQUIGGLE ARROW 21DE ; [*056A.0020.0002.21DE] # UPWARDS ARROW WITH DOUBLE STROKE 21DF ; [*056B.0020.0002.21DF] # DOWNWARDS ARROW WITH DOUBLE STROKE 21E0 ; [*056C.0020.0002.21E0] # LEFTWARDS DASHED ARROW 21E1 ; [*056D.0020.0002.21E1] # UPWARDS DASHED ARROW 21E2 ; [*056E.0020.0002.21E2] # RIGHTWARDS DASHED ARROW 21E3 ; [*056F.0020.0002.21E3] # DOWNWARDS DASHED ARROW 21E4 ; [*0570.0020.0002.21E4] # LEFTWARDS ARROW TO BAR 21E5 ; [*0571.0020.0002.21E5] # RIGHTWARDS ARROW TO BAR 21E6 ; [*0572.0020.0002.21E6] # LEFTWARDS WHITE ARROW 21E7 ; [*0573.0020.0002.21E7] # UPWARDS WHITE ARROW 21E8 ; [*0574.0020.0002.21E8] # RIGHTWARDS WHITE ARROW 21E9 ; [*0575.0020.0002.21E9] # DOWNWARDS WHITE ARROW 21EA ; [*0576.0020.0002.21EA] # UPWARDS WHITE ARROW FROM BAR 21EB ; [*0577.0020.0002.21EB] # UPWARDS WHITE ARROW ON PEDESTAL 21EC ; [*0578.0020.0002.21EC] # UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR 21ED ; [*0579.0020.0002.21ED] # UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR 21EE ; [*057A.0020.0002.21EE] # UPWARDS WHITE DOUBLE ARROW 21EF ; [*057B.0020.0002.21EF] # UPWARDS WHITE DOUBLE ARROW ON PEDESTAL 21F0 ; [*057C.0020.0002.21F0] # RIGHTWARDS WHITE ARROW FROM WALL 21F1 ; [*057D.0020.0002.21F1] # NORTH WEST ARROW TO CORNER 21F2 ; [*057E.0020.0002.21F2] # SOUTH EAST ARROW TO CORNER 21F3 ; [*057F.0020.0002.21F3] # UP DOWN WHITE ARROW 21F4 ; [*0580.0020.0002.21F4] # RIGHT ARROW WITH SMALL CIRCLE 21F5 ; [*0581.0020.0002.21F5] # DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW 21F6 ; [*0582.0020.0002.21F6] # THREE RIGHTWARDS ARROWS 21F7 ; [*0583.0020.0002.21F7] # LEFTWARDS ARROW WITH VERTICAL STROKE 21F8 ; [*0584.0020.0002.21F8] # RIGHTWARDS ARROW WITH VERTICAL STROKE 21F9 ; [*0585.0020.0002.21F9] # LEFT RIGHT ARROW WITH VERTICAL STROKE 21FA ; [*0586.0020.0002.21FA] # LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE 21FB ; [*0587.0020.0002.21FB] # RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE 21FC ; [*0588.0020.0002.21FC] # LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE 21FD ; [*0589.0020.0002.21FD] # LEFTWARDS OPEN-HEADED ARROW 21FE ; [*058A.0020.0002.21FE] # RIGHTWARDS OPEN-HEADED ARROW 21FF ; [*058B.0020.0002.21FF] # LEFT RIGHT OPEN-HEADED ARROW 2200 ; [*058C.0020.0002.2200] # FOR ALL 2201 ; [*058D.0020.0002.2201] # COMPLEMENT 2202 ; [*058E.0020.0002.2202] # PARTIAL DIFFERENTIAL 2203 ; [*058F.0020.0002.2203] # THERE EXISTS 2204 ; [*058F.0020.0002.2203][.0000.0054.0002.0338] # THERE DOES NOT EXIST 2205 ; [*0590.0020.0002.2205] # EMPTY SET 2206 ; [*0591.0020.0002.2206] # INCREMENT 2207 ; [*0592.0020.0002.2207] # NABLA 2208 ; [*0593.0020.0002.2208] # ELEMENT OF 2209 ; [*0593.0020.0002.2208][.0000.0054.0002.0338] # NOT AN ELEMENT OF 220A ; [*0594.0020.0002.220A] # SMALL ELEMENT OF 220B ; [*0595.0020.0002.220B] # CONTAINS AS MEMBER 220C ; [*0595.0020.0002.220B][.0000.0054.0002.0338] # DOES NOT CONTAIN AS MEMBER 220D ; [*0596.0020.0002.220D] # SMALL CONTAINS AS MEMBER 220E ; [*0598.0020.0002.220E] # END OF PROOF 220F ; [*0599.0020.0002.220F] # N-ARY PRODUCT 2210 ; [*059A.0020.0002.2210] # N-ARY COPRODUCT 2211 ; [*059B.0020.0002.2211] # N-ARY SUMMATION 2212 ; [*05A7.0020.0002.2212] # MINUS SIGN 2213 ; [*05A9.0020.0002.2213] # MINUS-OR-PLUS SIGN 2214 ; [*05AA.0020.0002.2214] # DOT PLUS 2215 ; [*05AB.0020.0002.2215] # DIVISION SLASH 2216 ; [*05AD.0020.0002.2216] # SET MINUS 2217 ; [*05AE.0020.0002.2217] # ASTERISK OPERATOR 2218 ; [*05AF.0020.0002.2218] # RING OPERATOR 2219 ; [*05B0.0020.0002.2219] # BULLET OPERATOR 221A ; [*05B1.0020.0002.221A] # SQUARE ROOT 221B ; [*05B2.0020.0002.221B] # CUBE ROOT 221C ; [*05B4.0020.0002.221C] # FOURTH ROOT 221D ; [*05B6.0020.0002.221D] # PROPORTIONAL TO 221E ; [*05B7.0020.0002.221E] # INFINITY 221F ; [*05B8.0020.0002.221F] # RIGHT ANGLE 2220 ; [*05B9.0020.0002.2220] # ANGLE 2221 ; [*05BA.0020.0002.2221] # MEASURED ANGLE 2222 ; [*05BB.0020.0002.2222] # SPHERICAL ANGLE 2223 ; [*05BC.0020.0002.2223] # DIVIDES 2224 ; [*05BC.0020.0002.2223][.0000.0054.0002.0338] # DOES NOT DIVIDE 2225 ; [*05BD.0020.0002.2225] # PARALLEL TO 2226 ; [*05BD.0020.0002.2225][.0000.0054.0002.0338] # NOT PARALLEL TO 2227 ; [*05BE.0020.0002.2227] # LOGICAL AND 2228 ; [*05BF.0020.0002.2228] # LOGICAL OR 2229 ; [*05C0.0020.0002.2229] # INTERSECTION 222A ; [*05C1.0020.0002.222A] # UNION 222B ; [*05C2.0020.0002.222B] # INTEGRAL 222C ; [*05C2.0020.0004.222C][*05C2.0020.0004.222C] # DOUBLE INTEGRAL 222D ; [*05C2.0020.0004.222D][*05C2.0020.0004.222D][*05C2.0020.001F.222D] # TRIPLE INTEGRAL 222E ; [*05C3.0020.0002.222E] # CONTOUR INTEGRAL 222F ; [*05C3.0020.0004.222F][*05C3.0020.0004.222F] # SURFACE INTEGRAL 2230 ; [*05C3.0020.0004.2230][*05C3.0020.0004.2230][*05C3.0020.001F.2230] # VOLUME INTEGRAL 2231 ; [*05C4.0020.0002.2231] # CLOCKWISE INTEGRAL 2232 ; [*05C5.0020.0002.2232] # CLOCKWISE CONTOUR INTEGRAL 2233 ; [*05C6.0020.0002.2233] # ANTICLOCKWISE CONTOUR INTEGRAL 2234 ; [*05C7.0020.0002.2234] # THEREFORE 2235 ; [*05C8.0020.0002.2235] # BECAUSE 2236 ; [*05C9.0020.0002.2236] # RATIO 2237 ; [*05CA.0020.0002.2237] # PROPORTION 2238 ; [*05CB.0020.0002.2238] # DOT MINUS 2239 ; [*05CC.0020.0002.2239] # EXCESS 223A ; [*05CD.0020.0002.223A] # GEOMETRIC PROPORTION 223B ; [*05CE.0020.0002.223B] # HOMOTHETIC 223C ; [*05CF.0020.0002.223C] # TILDE OPERATOR 223D ; [*05D0.0020.0002.223D] # REVERSED TILDE 223E ; [*05D1.0020.0002.223E] # INVERTED LAZY S 223F ; [*05D2.0020.0002.223F] # SINE WAVE 2240 ; [*05D3.0020.0002.2240] # WREATH PRODUCT 2241 ; [*05CF.0020.0002.223C][.0000.0054.0002.0338] # NOT TILDE 2242 ; [*05D4.0020.0002.2242] # MINUS TILDE 2243 ; [*05D5.0020.0002.2243] # ASYMPTOTICALLY EQUAL TO 2244 ; [*05D5.0020.0002.2243][.0000.0054.0002.0338] # NOT ASYMPTOTICALLY EQUAL TO 2245 ; [*05D6.0020.0002.2245] # APPROXIMATELY EQUAL TO 2246 ; [*05D7.0020.0002.2246] # APPROXIMATELY BUT NOT ACTUALLY EQUAL TO 2247 ; [*05D6.0020.0002.2245][.0000.0054.0002.0338] # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO 2248 ; [*05D8.0020.0002.2248] # ALMOST EQUAL TO 2249 ; [*05D8.0020.0002.2248][.0000.0054.0002.0338] # NOT ALMOST EQUAL TO 224A ; [*05D9.0020.0002.224A] # ALMOST EQUAL OR EQUAL TO 224B ; [*05DA.0020.0002.224B] # TRIPLE TILDE 224C ; [*05DB.0020.0002.224C] # ALL EQUAL TO 224D ; [*05DC.0020.0002.224D] # EQUIVALENT TO 224E ; [*05DD.0020.0002.224E] # GEOMETRICALLY EQUIVALENT TO 224F ; [*05DE.0020.0002.224F] # DIFFERENCE BETWEEN 2250 ; [*05DF.0020.0002.2250] # APPROACHES THE LIMIT 2251 ; [*05E0.0020.0002.2251] # GEOMETRICALLY EQUAL TO 2252 ; [*05E1.0020.0002.2252] # APPROXIMATELY EQUAL TO OR THE IMAGE OF 2253 ; [*05E2.0020.0002.2253] # IMAGE OF OR APPROXIMATELY EQUAL TO 2254 ; [*05E3.0020.0002.2254] # COLON EQUALS 2255 ; [*05E4.0020.0002.2255] # EQUALS COLON 2256 ; [*05E5.0020.0002.2256] # RING IN EQUAL TO 2257 ; [*05E6.0020.0002.2257] # RING EQUAL TO 2258 ; [*05E7.0020.0002.2258] # CORRESPONDS TO 2259 ; [*05E8.0020.0002.2259] # ESTIMATES 225A ; [*05E9.0020.0002.225A] # EQUIANGULAR TO 225B ; [*05EA.0020.0002.225B] # STAR EQUALS 225C ; [*05EB.0020.0002.225C] # DELTA EQUAL TO 225D ; [*05EC.0020.0002.225D] # EQUAL TO BY DEFINITION 225E ; [*05ED.0020.0002.225E] # MEASURED BY 225F ; [*05EE.0020.0002.225F] # QUESTIONED EQUAL TO 2260 ; [*05A1.0020.0002.003D][.0000.0054.0002.0338] # NOT EQUAL TO 2261 ; [*05EF.0020.0002.2261] # IDENTICAL TO 2262 ; [*05EF.0020.0002.2261][.0000.0054.0002.0338] # NOT IDENTICAL TO 2263 ; [*05F0.0020.0002.2263] # STRICTLY EQUIVALENT TO 2264 ; [*05F1.0020.0002.2264] # LESS-THAN OR EQUAL TO 2265 ; [*05F2.0020.0002.2265] # GREATER-THAN OR EQUAL TO 2266 ; [*05F3.0020.0002.2266] # LESS-THAN OVER EQUAL TO 2267 ; [*05F4.0020.0002.2267] # GREATER-THAN OVER EQUAL TO 2268 ; [*05F5.0020.0002.2268] # LESS-THAN BUT NOT EQUAL TO 2269 ; [*05F6.0020.0002.2269] # GREATER-THAN BUT NOT EQUAL TO 226A ; [*05F7.0020.0002.226A] # MUCH LESS-THAN 226B ; [*05F8.0020.0002.226B] # MUCH GREATER-THAN 226C ; [*05F9.0020.0002.226C] # BETWEEN 226D ; [*05DC.0020.0002.224D][.0000.0054.0002.0338] # NOT EQUIVALENT TO 226E ; [*05A0.0020.0002.003C][.0000.0054.0002.0338] # NOT LESS-THAN 226F ; [*05A2.0020.0002.003E][.0000.0054.0002.0338] # NOT GREATER-THAN 2270 ; [*05F1.0020.0002.2264][.0000.0054.0002.0338] # NEITHER LESS-THAN NOR EQUAL TO 2271 ; [*05F2.0020.0002.2265][.0000.0054.0002.0338] # NEITHER GREATER-THAN NOR EQUAL TO 2272 ; [*05FA.0020.0002.2272] # LESS-THAN OR EQUIVALENT TO 2273 ; [*05FB.0020.0002.2273] # GREATER-THAN OR EQUIVALENT TO 2274 ; [*05FA.0020.0002.2272][.0000.0054.0002.0338] # NEITHER LESS-THAN NOR EQUIVALENT TO 2275 ; [*05FB.0020.0002.2273][.0000.0054.0002.0338] # NEITHER GREATER-THAN NOR EQUIVALENT TO 2276 ; [*05FC.0020.0002.2276] # LESS-THAN OR GREATER-THAN 2277 ; [*05FD.0020.0002.2277] # GREATER-THAN OR LESS-THAN 2278 ; [*05FC.0020.0002.2276][.0000.0054.0002.0338] # NEITHER LESS-THAN NOR GREATER-THAN 2279 ; [*05FD.0020.0002.2277][.0000.0054.0002.0338] # NEITHER GREATER-THAN NOR LESS-THAN 227A ; [*05FE.0020.0002.227A] # PRECEDES 227B ; [*05FF.0020.0002.227B] # SUCCEEDS 227C ; [*0600.0020.0002.227C] # PRECEDES OR EQUAL TO 227D ; [*0601.0020.0002.227D] # SUCCEEDS OR EQUAL TO 227E ; [*0602.0020.0002.227E] # PRECEDES OR EQUIVALENT TO 227F ; [*0603.0020.0002.227F] # SUCCEEDS OR EQUIVALENT TO 2280 ; [*05FE.0020.0002.227A][.0000.0054.0002.0338] # DOES NOT PRECEDE 2281 ; [*05FF.0020.0002.227B][.0000.0054.0002.0338] # DOES NOT SUCCEED 2282 ; [*0604.0020.0002.2282] # SUBSET OF 2283 ; [*0605.0020.0002.2283] # SUPERSET OF 2284 ; [*0604.0020.0002.2282][.0000.0054.0002.0338] # NOT A SUBSET OF 2285 ; [*0605.0020.0002.2283][.0000.0054.0002.0338] # NOT A SUPERSET OF 2286 ; [*0606.0020.0002.2286] # SUBSET OF OR EQUAL TO 2287 ; [*0607.0020.0002.2287] # SUPERSET OF OR EQUAL TO 2288 ; [*0606.0020.0002.2286][.0000.0054.0002.0338] # NEITHER A SUBSET OF NOR EQUAL TO 2289 ; [*0607.0020.0002.2287][.0000.0054.0002.0338] # NEITHER A SUPERSET OF NOR EQUAL TO 228A ; [*0608.0020.0002.228A] # SUBSET OF WITH NOT EQUAL TO 228B ; [*0609.0020.0002.228B] # SUPERSET OF WITH NOT EQUAL TO 228C ; [*060A.0020.0002.228C] # MULTISET 228D ; [*060B.0020.0002.228D] # MULTISET MULTIPLICATION 228E ; [*060C.0020.0002.228E] # MULTISET UNION 228F ; [*060D.0020.0002.228F] # SQUARE IMAGE OF 2290 ; [*060E.0020.0002.2290] # SQUARE ORIGINAL OF 2291 ; [*060F.0020.0002.2291] # SQUARE IMAGE OF OR EQUAL TO 2292 ; [*0610.0020.0002.2292] # SQUARE ORIGINAL OF OR EQUAL TO 2293 ; [*0611.0020.0002.2293] # SQUARE CAP 2294 ; [*0612.0020.0002.2294] # SQUARE CUP 2295 ; [*0613.0020.0002.2295] # CIRCLED PLUS 2296 ; [*0614.0020.0002.2296] # CIRCLED MINUS 2297 ; [*0615.0020.0002.2297] # CIRCLED TIMES 2298 ; [*0616.0020.0002.2298] # CIRCLED DIVISION SLASH 2299 ; [*0617.0020.0002.2299] # CIRCLED DOT OPERATOR 229A ; [*0618.0020.0002.229A] # CIRCLED RING OPERATOR 229B ; [*0619.0020.0002.229B] # CIRCLED ASTERISK OPERATOR 229C ; [*061A.0020.0002.229C] # CIRCLED EQUALS 229D ; [*061B.0020.0002.229D] # CIRCLED DASH 229E ; [*061C.0020.0002.229E] # SQUARED PLUS 229F ; [*061D.0020.0002.229F] # SQUARED MINUS 22A0 ; [*061E.0020.0002.22A0] # SQUARED TIMES 22A1 ; [*061F.0020.0002.22A1] # SQUARED DOT OPERATOR 22A2 ; [*0620.0020.0002.22A2] # RIGHT TACK 22A3 ; [*0621.0020.0002.22A3] # LEFT TACK 22A4 ; [*0622.0020.0002.22A4] # DOWN TACK 22A5 ; [*0623.0020.0002.22A5] # UP TACK 22A6 ; [*0624.0020.0002.22A6] # ASSERTION 22A7 ; [*0625.0020.0002.22A7] # MODELS 22A8 ; [*0626.0020.0002.22A8] # TRUE 22A9 ; [*0627.0020.0002.22A9] # FORCES 22AA ; [*0628.0020.0002.22AA] # TRIPLE VERTICAL BAR RIGHT TURNSTILE 22AB ; [*0629.0020.0002.22AB] # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE 22AC ; [*0620.0020.0002.22A2][.0000.0054.0002.0338] # DOES NOT PROVE 22AD ; [*0626.0020.0002.22A8][.0000.0054.0002.0338] # NOT TRUE 22AE ; [*0627.0020.0002.22A9][.0000.0054.0002.0338] # DOES NOT FORCE 22AF ; [*0629.0020.0002.22AB][.0000.0054.0002.0338] # NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE 22B0 ; [*062A.0020.0002.22B0] # PRECEDES UNDER RELATION 22B1 ; [*062B.0020.0002.22B1] # SUCCEEDS UNDER RELATION 22B2 ; [*062C.0020.0002.22B2] # NORMAL SUBGROUP OF 22B3 ; [*062D.0020.0002.22B3] # CONTAINS AS NORMAL SUBGROUP 22B4 ; [*062E.0020.0002.22B4] # NORMAL SUBGROUP OF OR EQUAL TO 22B5 ; [*062F.0020.0002.22B5] # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO 22B6 ; [*0630.0020.0002.22B6] # ORIGINAL OF 22B7 ; [*0631.0020.0002.22B7] # IMAGE OF 22B8 ; [*0632.0020.0002.22B8] # MULTIMAP 22B9 ; [*0633.0020.0002.22B9] # HERMITIAN CONJUGATE MATRIX 22BA ; [*0634.0020.0002.22BA] # INTERCALATE 22BB ; [*0635.0020.0002.22BB] # XOR 22BC ; [*0636.0020.0002.22BC] # NAND 22BD ; [*0638.0020.0002.22BD] # NOR 22BE ; [*0639.0020.0002.22BE] # RIGHT ANGLE WITH ARC 22BF ; [*063A.0020.0002.22BF] # RIGHT TRIANGLE 22C0 ; [*063B.0020.0002.22C0] # N-ARY LOGICAL AND 22C1 ; [*063C.0020.0002.22C1] # N-ARY LOGICAL OR 22C2 ; [*063D.0020.0002.22C2] # N-ARY INTERSECTION 22C3 ; [*063E.0020.0002.22C3] # N-ARY UNION 22C4 ; [*063F.0020.0002.22C4] # DIAMOND OPERATOR 22C5 ; [*0640.0020.0002.22C5] # DOT OPERATOR 22C6 ; [*0641.0020.0002.22C6] # STAR OPERATOR 22C7 ; [*0642.0020.0002.22C7] # DIVISION TIMES 22C8 ; [*0643.0020.0002.22C8] # BOWTIE 22C9 ; [*0644.0020.0002.22C9] # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT 22CA ; [*0645.0020.0002.22CA] # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT 22CB ; [*0646.0020.0002.22CB] # LEFT SEMIDIRECT PRODUCT 22CC ; [*0647.0020.0002.22CC] # RIGHT SEMIDIRECT PRODUCT 22CD ; [*0648.0020.0002.22CD] # REVERSED TILDE EQUALS 22CE ; [*0649.0020.0002.22CE] # CURLY LOGICAL OR 22CF ; [*064A.0020.0002.22CF] # CURLY LOGICAL AND 22D0 ; [*064B.0020.0002.22D0] # DOUBLE SUBSET 22D1 ; [*064C.0020.0002.22D1] # DOUBLE SUPERSET 22D2 ; [*064D.0020.0002.22D2] # DOUBLE INTERSECTION 22D3 ; [*064E.0020.0002.22D3] # DOUBLE UNION 22D4 ; [*064F.0020.0002.22D4] # PITCHFORK 22D5 ; [*0650.0020.0002.22D5] # EQUAL AND PARALLEL TO 22D6 ; [*0651.0020.0002.22D6] # LESS-THAN WITH DOT 22D7 ; [*0652.0020.0002.22D7] # GREATER-THAN WITH DOT 22D8 ; [*0653.0020.0002.22D8] # VERY MUCH LESS-THAN 22D9 ; [*0654.0020.0002.22D9] # VERY MUCH GREATER-THAN 22DA ; [*0655.0020.0002.22DA] # LESS-THAN EQUAL TO OR GREATER-THAN 22DB ; [*0656.0020.0002.22DB] # GREATER-THAN EQUAL TO OR LESS-THAN 22DC ; [*0657.0020.0002.22DC] # EQUAL TO OR LESS-THAN 22DD ; [*0658.0020.0002.22DD] # EQUAL TO OR GREATER-THAN 22DE ; [*0659.0020.0002.22DE] # EQUAL TO OR PRECEDES 22DF ; [*065A.0020.0002.22DF] # EQUAL TO OR SUCCEEDS 22E0 ; [*0600.0020.0002.227C][.0000.0054.0002.0338] # DOES NOT PRECEDE OR EQUAL 22E1 ; [*0601.0020.0002.227D][.0000.0054.0002.0338] # DOES NOT SUCCEED OR EQUAL 22E2 ; [*060F.0020.0002.2291][.0000.0054.0002.0338] # NOT SQUARE IMAGE OF OR EQUAL TO 22E3 ; [*0610.0020.0002.2292][.0000.0054.0002.0338] # NOT SQUARE ORIGINAL OF OR EQUAL TO 22E4 ; [*065B.0020.0002.22E4] # SQUARE IMAGE OF OR NOT EQUAL TO 22E5 ; [*065C.0020.0002.22E5] # SQUARE ORIGINAL OF OR NOT EQUAL TO 22E6 ; [*065D.0020.0002.22E6] # LESS-THAN BUT NOT EQUIVALENT TO 22E7 ; [*065E.0020.0002.22E7] # GREATER-THAN BUT NOT EQUIVALENT TO 22E8 ; [*065F.0020.0002.22E8] # PRECEDES BUT NOT EQUIVALENT TO 22E9 ; [*0660.0020.0002.22E9] # SUCCEEDS BUT NOT EQUIVALENT TO 22EA ; [*062C.0020.0002.22B2][.0000.0054.0002.0338] # NOT NORMAL SUBGROUP OF 22EB ; [*062D.0020.0002.22B3][.0000.0054.0002.0338] # DOES NOT CONTAIN AS NORMAL SUBGROUP 22EC ; [*062E.0020.0002.22B4][.0000.0054.0002.0338] # NOT NORMAL SUBGROUP OF OR EQUAL TO 22ED ; [*062F.0020.0002.22B5][.0000.0054.0002.0338] # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL 22EE ; [*0661.0020.0002.22EE] # VERTICAL ELLIPSIS 22EF ; [*0662.0020.0002.22EF] # MIDLINE HORIZONTAL ELLIPSIS 22F0 ; [*0663.0020.0002.22F0] # UP RIGHT DIAGONAL ELLIPSIS 22F1 ; [*0664.0020.0002.22F1] # DOWN RIGHT DIAGONAL ELLIPSIS 22F2 ; [*0665.0020.0002.22F2] # ELEMENT OF WITH LONG HORIZONTAL STROKE 22F3 ; [*0666.0020.0002.22F3] # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE 22F4 ; [*0667.0020.0002.22F4] # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE 22F5 ; [*0668.0020.0002.22F5] # ELEMENT OF WITH DOT ABOVE 22F6 ; [*0669.0020.0002.22F6] # ELEMENT OF WITH OVERBAR 22F7 ; [*066A.0020.0002.22F7] # SMALL ELEMENT OF WITH OVERBAR 22F8 ; [*066B.0020.0002.22F8] # ELEMENT OF WITH UNDERBAR 22F9 ; [*066C.0020.0002.22F9] # ELEMENT OF WITH TWO HORIZONTAL STROKES 22FA ; [*066D.0020.0002.22FA] # CONTAINS WITH LONG HORIZONTAL STROKE 22FB ; [*066E.0020.0002.22FB] # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE 22FC ; [*066F.0020.0002.22FC] # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE 22FD ; [*0670.0020.0002.22FD] # CONTAINS WITH OVERBAR 22FE ; [*0671.0020.0002.22FE] # SMALL CONTAINS WITH OVERBAR 22FF ; [*0672.0020.0002.22FF] # Z NOTATION BAG MEMBERSHIP 2300 ; [*0673.0020.0002.2300] # DIAMETER SIGN 2301 ; [*0674.0020.0002.2301] # ELECTRIC ARROW 2302 ; [*0675.0020.0002.2302] # HOUSE 2303 ; [*0676.0020.0002.2303] # UP ARROWHEAD 2304 ; [*0677.0020.0002.2304] # DOWN ARROWHEAD 2305 ; [*0678.0020.0002.2305] # PROJECTIVE 2306 ; [*0679.0020.0002.2306] # PERSPECTIVE 2307 ; [*067A.0020.0002.2307] # WAVY LINE 2308 ; [*067B.0020.0002.2308] # LEFT CEILING 2309 ; [*067C.0020.0002.2309] # RIGHT CEILING 230A ; [*067D.0020.0002.230A] # LEFT FLOOR 230B ; [*067E.0020.0002.230B] # RIGHT FLOOR 230C ; [*067F.0020.0002.230C] # BOTTOM RIGHT CROP 230D ; [*0680.0020.0002.230D] # BOTTOM LEFT CROP 230E ; [*0681.0020.0002.230E] # TOP RIGHT CROP 230F ; [*0682.0020.0002.230F] # TOP LEFT CROP 2310 ; [*0683.0020.0002.2310] # REVERSED NOT SIGN 2311 ; [*0684.0020.0002.2311] # SQUARE LOZENGE 2312 ; [*0685.0020.0002.2312] # ARC 2313 ; [*0686.0020.0002.2313] # SEGMENT 2314 ; [*0687.0020.0002.2314] # SECTOR 2315 ; [*0688.0020.0002.2315] # TELEPHONE RECORDER 2316 ; [*0689.0020.0002.2316] # POSITION INDICATOR 2317 ; [*068A.0020.0002.2317] # VIEWDATA SQUARE 2318 ; [*068B.0020.0002.2318] # PLACE OF INTEREST SIGN 2319 ; [*068C.0020.0002.2319] # TURNED NOT SIGN 231A ; [*068D.0020.0002.231A] # WATCH 231B ; [*068E.0020.0002.231B] # HOURGLASS 231C ; [*068F.0020.0002.231C] # TOP LEFT CORNER 231D ; [*0690.0020.0002.231D] # TOP RIGHT CORNER 231E ; [*0691.0020.0002.231E] # BOTTOM LEFT CORNER 231F ; [*0692.0020.0002.231F] # BOTTOM RIGHT CORNER 2320 ; [*0693.0020.0002.2320] # TOP HALF INTEGRAL 2321 ; [*0694.0020.0002.2321] # BOTTOM HALF INTEGRAL 2322 ; [*0695.0020.0002.2322] # FROWN 2323 ; [*0696.0020.0002.2323] # SMILE 2324 ; [*0697.0020.0002.2324] # UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS 2325 ; [*0698.0020.0002.2325] # OPTION KEY 2326 ; [*0699.0020.0002.2326] # ERASE TO THE RIGHT 2327 ; [*069A.0020.0002.2327] # X IN A RECTANGLE BOX 2328 ; [*069B.0020.0002.2328] # KEYBOARD 2329 ; [*034F.0020.0002.2329] # LEFT-POINTING ANGLE BRACKET 232A ; [*0350.0020.0002.232A] # RIGHT-POINTING ANGLE BRACKET 232B ; [*069C.0020.0002.232B] # ERASE TO THE LEFT 232C ; [*069D.0020.0002.232C] # BENZENE RING 232D ; [*069E.0020.0002.232D] # CYLINDRICITY 232E ; [*069F.0020.0002.232E] # ALL AROUND-PROFILE 232F ; [*06A0.0020.0002.232F] # SYMMETRY 2330 ; [*06A1.0020.0002.2330] # TOTAL RUNOUT 2331 ; [*06A2.0020.0002.2331] # DIMENSION ORIGIN 2332 ; [*06A3.0020.0002.2332] # CONICAL TAPER 2333 ; [*06A4.0020.0002.2333] # SLOPE 2334 ; [*06A5.0020.0002.2334] # COUNTERBORE 2335 ; [*06A6.0020.0002.2335] # COUNTERSINK 2336 ; [*06A7.0020.0002.2336] # APL FUNCTIONAL SYMBOL I-BEAM 2337 ; [*06A8.0020.0002.2337] # APL FUNCTIONAL SYMBOL SQUISH QUAD 2338 ; [*06A9.0020.0002.2338] # APL FUNCTIONAL SYMBOL QUAD EQUAL 2339 ; [*06AA.0020.0002.2339] # APL FUNCTIONAL SYMBOL QUAD DIVIDE 233A ; [*06AB.0020.0002.233A] # APL FUNCTIONAL SYMBOL QUAD DIAMOND 233B ; [*06AC.0020.0002.233B] # APL FUNCTIONAL SYMBOL QUAD JOT 233C ; [*06AD.0020.0002.233C] # APL FUNCTIONAL SYMBOL QUAD CIRCLE 233D ; [*06AE.0020.0002.233D] # APL FUNCTIONAL SYMBOL CIRCLE STILE 233E ; [*06AF.0020.0002.233E] # APL FUNCTIONAL SYMBOL CIRCLE JOT 233F ; [*06B0.0020.0002.233F] # APL FUNCTIONAL SYMBOL SLASH BAR 2340 ; [*06B1.0020.0002.2340] # APL FUNCTIONAL SYMBOL BACKSLASH BAR 2341 ; [*06B2.0020.0002.2341] # APL FUNCTIONAL SYMBOL QUAD SLASH 2342 ; [*06B3.0020.0002.2342] # APL FUNCTIONAL SYMBOL QUAD BACKSLASH 2343 ; [*06B4.0020.0002.2343] # APL FUNCTIONAL SYMBOL QUAD LESS-THAN 2344 ; [*06B5.0020.0002.2344] # APL FUNCTIONAL SYMBOL QUAD GREATER-THAN 2345 ; [*06B6.0020.0002.2345] # APL FUNCTIONAL SYMBOL LEFTWARDS VANE 2346 ; [*06B7.0020.0002.2346] # APL FUNCTIONAL SYMBOL RIGHTWARDS VANE 2347 ; [*06B8.0020.0002.2347] # APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW 2348 ; [*06B9.0020.0002.2348] # APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW 2349 ; [*06BA.0020.0002.2349] # APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH 234A ; [*06BB.0020.0002.234A] # APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR 234B ; [*06BC.0020.0002.234B] # APL FUNCTIONAL SYMBOL DELTA STILE 234C ; [*06BD.0020.0002.234C] # APL FUNCTIONAL SYMBOL QUAD DOWN CARET 234D ; [*06BE.0020.0002.234D] # APL FUNCTIONAL SYMBOL QUAD DELTA 234E ; [*06BF.0020.0002.234E] # APL FUNCTIONAL SYMBOL DOWN TACK JOT 234F ; [*06C0.0020.0002.234F] # APL FUNCTIONAL SYMBOL UPWARDS VANE 2350 ; [*06C1.0020.0002.2350] # APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW 2351 ; [*06C2.0020.0002.2351] # APL FUNCTIONAL SYMBOL UP TACK OVERBAR 2352 ; [*06C3.0020.0002.2352] # APL FUNCTIONAL SYMBOL DEL STILE 2353 ; [*06C4.0020.0002.2353] # APL FUNCTIONAL SYMBOL QUAD UP CARET 2354 ; [*06C5.0020.0002.2354] # APL FUNCTIONAL SYMBOL QUAD DEL 2355 ; [*06C6.0020.0002.2355] # APL FUNCTIONAL SYMBOL UP TACK JOT 2356 ; [*06C7.0020.0002.2356] # APL FUNCTIONAL SYMBOL DOWNWARDS VANE 2357 ; [*06C8.0020.0002.2357] # APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW 2358 ; [*06C9.0020.0002.2358] # APL FUNCTIONAL SYMBOL QUOTE UNDERBAR 2359 ; [*06CA.0020.0002.2359] # APL FUNCTIONAL SYMBOL DELTA UNDERBAR 235A ; [*06CB.0020.0002.235A] # APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR 235B ; [*06CC.0020.0002.235B] # APL FUNCTIONAL SYMBOL JOT UNDERBAR 235C ; [*06CD.0020.0002.235C] # APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR 235D ; [*06CE.0020.0002.235D] # APL FUNCTIONAL SYMBOL UP SHOE JOT 235E ; [*06CF.0020.0002.235E] # APL FUNCTIONAL SYMBOL QUOTE QUAD 235F ; [*06D0.0020.0002.235F] # APL FUNCTIONAL SYMBOL CIRCLE STAR 2360 ; [*06D1.0020.0002.2360] # APL FUNCTIONAL SYMBOL QUAD COLON 2361 ; [*06D2.0020.0002.2361] # APL FUNCTIONAL SYMBOL UP TACK DIAERESIS 2362 ; [*06D3.0020.0002.2362] # APL FUNCTIONAL SYMBOL DEL DIAERESIS 2363 ; [*06D4.0020.0002.2363] # APL FUNCTIONAL SYMBOL STAR DIAERESIS 2364 ; [*06D5.0020.0002.2364] # APL FUNCTIONAL SYMBOL JOT DIAERESIS 2365 ; [*06D6.0020.0002.2365] # APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS 2366 ; [*06D7.0020.0002.2366] # APL FUNCTIONAL SYMBOL DOWN SHOE STILE 2367 ; [*06D8.0020.0002.2367] # APL FUNCTIONAL SYMBOL LEFT SHOE STILE 2368 ; [*06D9.0020.0002.2368] # APL FUNCTIONAL SYMBOL TILDE DIAERESIS 2369 ; [*06DA.0020.0002.2369] # APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS 236A ; [*06DB.0020.0002.236A] # APL FUNCTIONAL SYMBOL COMMA BAR 236B ; [*06DC.0020.0002.236B] # APL FUNCTIONAL SYMBOL DEL TILDE 236C ; [*06DD.0020.0002.236C] # APL FUNCTIONAL SYMBOL ZILDE 236D ; [*06DE.0020.0002.236D] # APL FUNCTIONAL SYMBOL STILE TILDE 236E ; [*06DF.0020.0002.236E] # APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR 236F ; [*06E0.0020.0002.236F] # APL FUNCTIONAL SYMBOL QUAD NOT EQUAL 2370 ; [*06E1.0020.0002.2370] # APL FUNCTIONAL SYMBOL QUAD QUESTION 2371 ; [*06E2.0020.0002.2371] # APL FUNCTIONAL SYMBOL DOWN CARET TILDE 2372 ; [*06E3.0020.0002.2372] # APL FUNCTIONAL SYMBOL UP CARET TILDE 2373 ; [*06E4.0020.0002.2373] # APL FUNCTIONAL SYMBOL IOTA 2374 ; [*06E5.0020.0002.2374] # APL FUNCTIONAL SYMBOL RHO 2375 ; [*06E6.0020.0002.2375] # APL FUNCTIONAL SYMBOL OMEGA 2376 ; [*06E7.0020.0002.2376] # APL FUNCTIONAL SYMBOL ALPHA UNDERBAR 2377 ; [*06E8.0020.0002.2377] # APL FUNCTIONAL SYMBOL EPSILON UNDERBAR 2378 ; [*06E9.0020.0002.2378] # APL FUNCTIONAL SYMBOL IOTA UNDERBAR 2379 ; [*06EA.0020.0002.2379] # APL FUNCTIONAL SYMBOL OMEGA UNDERBAR 237A ; [*06EB.0020.0002.237A] # APL FUNCTIONAL SYMBOL ALPHA 237B ; [*06EC.0020.0002.237B] # NOT CHECK MARK 237C ; [*06ED.0020.0002.237C] # RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW 237D ; [*06EE.0020.0002.237D] # SHOULDERED OPEN BOX 237E ; [*06EF.0020.0002.237E] # BELL SYMBOL 237F ; [*06F0.0020.0002.237F] # VERTICAL LINE WITH MIDDLE DOT 2380 ; [*06F1.0020.0002.2380] # INSERTION SYMBOL 2381 ; [*06F2.0020.0002.2381] # CONTINUOUS UNDERLINE SYMBOL 2382 ; [*06F3.0020.0002.2382] # DISCONTINUOUS UNDERLINE SYMBOL 2383 ; [*06F4.0020.0002.2383] # EMPHASIS SYMBOL 2384 ; [*06F5.0020.0002.2384] # COMPOSITION SYMBOL 2385 ; [*06F6.0020.0002.2385] # WHITE SQUARE WITH CENTRE VERTICAL LINE 2386 ; [*06F7.0020.0002.2386] # ENTER SYMBOL 2387 ; [*06F8.0020.0002.2387] # ALTERNATIVE KEY SYMBOL 2388 ; [*06F9.0020.0002.2388] # HELM SYMBOL 2389 ; [*06FA.0020.0002.2389] # CIRCLED HORIZONTAL BAR WITH NOTCH 238A ; [*06FB.0020.0002.238A] # CIRCLED TRIANGLE DOWN 238B ; [*06FC.0020.0002.238B] # BROKEN CIRCLE WITH NORTHWEST ARROW 238C ; [*06FD.0020.0002.238C] # UNDO SYMBOL 238D ; [*06FE.0020.0002.238D] # MONOSTABLE SYMBOL 238E ; [*06FF.0020.0002.238E] # HYSTERESIS SYMBOL 238F ; [*0700.0020.0002.238F] # OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL 2390 ; [*0701.0020.0002.2390] # OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL 2391 ; [*0702.0020.0002.2391] # PASSIVE-PULL-DOWN-OUTPUT SYMBOL 2392 ; [*0703.0020.0002.2392] # PASSIVE-PULL-UP-OUTPUT SYMBOL 2393 ; [*0704.0020.0002.2393] # DIRECT CURRENT SYMBOL FORM TWO 2394 ; [*0705.0020.0002.2394] # SOFTWARE-FUNCTION SYMBOL 2395 ; [*0706.0020.0002.2395] # APL FUNCTIONAL SYMBOL QUAD 2396 ; [*0707.0020.0002.2396] # DECIMAL SEPARATOR KEY SYMBOL 2397 ; [*0708.0020.0002.2397] # PREVIOUS PAGE 2398 ; [*0709.0020.0002.2398] # NEXT PAGE 2399 ; [*070A.0020.0002.2399] # PRINT SCREEN SYMBOL 239A ; [*070B.0020.0002.239A] # CLEAR SCREEN SYMBOL 239B ; [*070C.0020.0002.239B] # LEFT PARENTHESIS UPPER HOOK 239C ; [*070D.0020.0002.239C] # LEFT PARENTHESIS EXTENSION 239D ; [*070E.0020.0002.239D] # LEFT PARENTHESIS LOWER HOOK 239E ; [*070F.0020.0002.239E] # RIGHT PARENTHESIS UPPER HOOK 239F ; [*0710.0020.0002.239F] # RIGHT PARENTHESIS EXTENSION 23A0 ; [*0711.0020.0002.23A0] # RIGHT PARENTHESIS LOWER HOOK 23A1 ; [*0712.0020.0002.23A1] # LEFT SQUARE BRACKET UPPER CORNER 23A2 ; [*0713.0020.0002.23A2] # LEFT SQUARE BRACKET EXTENSION 23A3 ; [*0714.0020.0002.23A3] # LEFT SQUARE BRACKET LOWER CORNER 23A4 ; [*0715.0020.0002.23A4] # RIGHT SQUARE BRACKET UPPER CORNER 23A5 ; [*0716.0020.0002.23A5] # RIGHT SQUARE BRACKET EXTENSION 23A6 ; [*0717.0020.0002.23A6] # RIGHT SQUARE BRACKET LOWER CORNER 23A7 ; [*0718.0020.0002.23A7] # LEFT CURLY BRACKET UPPER HOOK 23A8 ; [*0719.0020.0002.23A8] # LEFT CURLY BRACKET MIDDLE PIECE 23A9 ; [*071A.0020.0002.23A9] # LEFT CURLY BRACKET LOWER HOOK 23AA ; [*071B.0020.0002.23AA] # CURLY BRACKET EXTENSION 23AB ; [*071C.0020.0002.23AB] # RIGHT CURLY BRACKET UPPER HOOK 23AC ; [*071D.0020.0002.23AC] # RIGHT CURLY BRACKET MIDDLE PIECE 23AD ; [*071E.0020.0002.23AD] # RIGHT CURLY BRACKET LOWER HOOK 23AE ; [*071F.0020.0002.23AE] # INTEGRAL EXTENSION 23AF ; [*0720.0020.0002.23AF] # HORIZONTAL LINE EXTENSION 23B0 ; [*0721.0020.0002.23B0] # UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION 23B1 ; [*0722.0020.0002.23B1] # UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION 23B2 ; [*0723.0020.0002.23B2] # SUMMATION TOP 23B3 ; [*0724.0020.0002.23B3] # SUMMATION BOTTOM 23B4 ; [*0725.0020.0002.23B4] # TOP SQUARE BRACKET 23B5 ; [*0726.0020.0002.23B5] # BOTTOM SQUARE BRACKET 23B6 ; [*0727.0020.0002.23B6] # BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET 23B7 ; [*0728.0020.0002.23B7] # RADICAL SYMBOL BOTTOM 23B8 ; [*0729.0020.0002.23B8] # LEFT VERTICAL BOX LINE 23B9 ; [*072A.0020.0002.23B9] # RIGHT VERTICAL BOX LINE 23BA ; [*072B.0020.0002.23BA] # HORIZONTAL SCAN LINE-1 23BB ; [*072C.0020.0002.23BB] # HORIZONTAL SCAN LINE-3 23BC ; [*072D.0020.0002.23BC] # HORIZONTAL SCAN LINE-7 23BD ; [*072E.0020.0002.23BD] # HORIZONTAL SCAN LINE-9 23BE ; [*072F.0020.0002.23BE] # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT 23BF ; [*0730.0020.0002.23BF] # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT 23C0 ; [*0731.0020.0002.23C0] # DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE 23C1 ; [*0732.0020.0002.23C1] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE 23C2 ; [*0733.0020.0002.23C2] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE 23C3 ; [*0734.0020.0002.23C3] # DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE 23C4 ; [*0735.0020.0002.23C4] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE 23C5 ; [*0736.0020.0002.23C5] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE 23C6 ; [*0737.0020.0002.23C6] # DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE 23C7 ; [*0738.0020.0002.23C7] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE 23C8 ; [*0739.0020.0002.23C8] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE 23C9 ; [*073A.0020.0002.23C9] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL 23CA ; [*073B.0020.0002.23CA] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL 23CB ; [*073C.0020.0002.23CB] # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT 23CC ; [*073D.0020.0002.23CC] # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT 23CD ; [*073E.0020.0002.23CD] # SQUARE FOOT 23CE ; [*073F.0020.0002.23CE] # RETURN SYMBOL 23CF ; [*0740.0020.0002.23CF] # EJECT SYMBOL 23D0 ; [*0741.0020.0002.23D0] # VERTICAL LINE EXTENSION 23D1 ; [*0742.0020.0002.23D1] # METRICAL BREVE 23D2 ; [*0743.0020.0002.23D2] # METRICAL LONG OVER SHORT 23D3 ; [*0744.0020.0002.23D3] # METRICAL SHORT OVER LONG 23D4 ; [*0745.0020.0002.23D4] # METRICAL LONG OVER TWO SHORTS 23D5 ; [*0746.0020.0002.23D5] # METRICAL TWO SHORTS OVER LONG 23D6 ; [*0747.0020.0002.23D6] # METRICAL TWO SHORTS JOINED 23D7 ; [*0748.0020.0002.23D7] # METRICAL TRISEME 23D8 ; [*0749.0020.0002.23D8] # METRICAL TETRASEME 23D9 ; [*074A.0020.0002.23D9] # METRICAL PENTASEME 23DA ; [*074B.0020.0002.23DA] # EARTH GROUND 23DB ; [*074C.0020.0002.23DB] # FUSE 23DC ; [*074D.0020.0002.23DC] # TOP PARENTHESIS 23DD ; [*074E.0020.0002.23DD] # BOTTOM PARENTHESIS 23DE ; [*074F.0020.0002.23DE] # TOP CURLY BRACKET 23DF ; [*0750.0020.0002.23DF] # BOTTOM CURLY BRACKET 23E0 ; [*0751.0020.0002.23E0] # TOP TORTOISE SHELL BRACKET 23E1 ; [*0752.0020.0002.23E1] # BOTTOM TORTOISE SHELL BRACKET 23E2 ; [*0753.0020.0002.23E2] # WHITE TRAPEZIUM 23E3 ; [*0754.0020.0002.23E3] # BENZENE RING WITH CIRCLE 23E4 ; [*0755.0020.0002.23E4] # STRAIGHTNESS 23E5 ; [*0756.0020.0002.23E5] # FLATNESS 23E6 ; [*0757.0020.0002.23E6] # AC CURRENT 23E7 ; [*0758.0020.0002.23E7] # ELECTRICAL INTERSECTION 23E8 ; [*0759.0020.0002.23E8] # DECIMAL EXPONENT SYMBOL 23E9 ; [*075A.0020.0002.23E9] # BLACK RIGHT-POINTING DOUBLE TRIANGLE 23EA ; [*075B.0020.0002.23EA] # BLACK LEFT-POINTING DOUBLE TRIANGLE 23EB ; [*075C.0020.0002.23EB] # BLACK UP-POINTING DOUBLE TRIANGLE 23EC ; [*075D.0020.0002.23EC] # BLACK DOWN-POINTING DOUBLE TRIANGLE 23ED ; [*075E.0020.0002.23ED] # BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR 23EE ; [*075F.0020.0002.23EE] # BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR 23EF ; [*0760.0020.0002.23EF] # BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR 23F0 ; [*0761.0020.0002.23F0] # ALARM CLOCK 23F1 ; [*0762.0020.0002.23F1] # STOPWATCH 23F2 ; [*0763.0020.0002.23F2] # TIMER CLOCK 23F3 ; [*0764.0020.0002.23F3] # HOURGLASS WITH FLOWING SAND 2400 ; [*0765.0020.0002.2400] # SYMBOL FOR NULL 2401 ; [*0766.0020.0002.2401] # SYMBOL FOR START OF HEADING 2402 ; [*0767.0020.0002.2402] # SYMBOL FOR START OF TEXT 2403 ; [*0768.0020.0002.2403] # SYMBOL FOR END OF TEXT 2404 ; [*0769.0020.0002.2404] # SYMBOL FOR END OF TRANSMISSION 2405 ; [*076A.0020.0002.2405] # SYMBOL FOR ENQUIRY 2406 ; [*076B.0020.0002.2406] # SYMBOL FOR ACKNOWLEDGE 2407 ; [*076C.0020.0002.2407] # SYMBOL FOR BELL 2408 ; [*076D.0020.0002.2408] # SYMBOL FOR BACKSPACE 2409 ; [*076E.0020.0002.2409] # SYMBOL FOR HORIZONTAL TABULATION 240A ; [*076F.0020.0002.240A] # SYMBOL FOR LINE FEED 240B ; [*0770.0020.0002.240B] # SYMBOL FOR VERTICAL TABULATION 240C ; [*0771.0020.0002.240C] # SYMBOL FOR FORM FEED 240D ; [*0772.0020.0002.240D] # SYMBOL FOR CARRIAGE RETURN 240E ; [*0773.0020.0002.240E] # SYMBOL FOR SHIFT OUT 240F ; [*0774.0020.0002.240F] # SYMBOL FOR SHIFT IN 2410 ; [*0775.0020.0002.2410] # SYMBOL FOR DATA LINK ESCAPE 2411 ; [*0776.0020.0002.2411] # SYMBOL FOR DEVICE CONTROL ONE 2412 ; [*0777.0020.0002.2412] # SYMBOL FOR DEVICE CONTROL TWO 2413 ; [*0778.0020.0002.2413] # SYMBOL FOR DEVICE CONTROL THREE 2414 ; [*0779.0020.0002.2414] # SYMBOL FOR DEVICE CONTROL FOUR 2415 ; [*077A.0020.0002.2415] # SYMBOL FOR NEGATIVE ACKNOWLEDGE 2416 ; [*077B.0020.0002.2416] # SYMBOL FOR SYNCHRONOUS IDLE 2417 ; [*077C.0020.0002.2417] # SYMBOL FOR END OF TRANSMISSION BLOCK 2418 ; [*077D.0020.0002.2418] # SYMBOL FOR CANCEL 2419 ; [*077E.0020.0002.2419] # SYMBOL FOR END OF MEDIUM 241A ; [*077F.0020.0002.241A] # SYMBOL FOR SUBSTITUTE 241B ; [*0780.0020.0002.241B] # SYMBOL FOR ESCAPE 241C ; [*0781.0020.0002.241C] # SYMBOL FOR FILE SEPARATOR 241D ; [*0782.0020.0002.241D] # SYMBOL FOR GROUP SEPARATOR 241E ; [*0783.0020.0002.241E] # SYMBOL FOR RECORD SEPARATOR 241F ; [*0784.0020.0002.241F] # SYMBOL FOR UNIT SEPARATOR 2420 ; [*0785.0020.0002.2420] # SYMBOL FOR SPACE 2421 ; [*0786.0020.0002.2421] # SYMBOL FOR DELETE 2422 ; [*0787.0020.0002.2422] # BLANK SYMBOL 2423 ; [*0788.0020.0002.2423] # OPEN BOX 2424 ; [*0789.0020.0002.2424] # SYMBOL FOR NEWLINE 2425 ; [*078A.0020.0002.2425] # SYMBOL FOR DELETE FORM TWO 2426 ; [*078B.0020.0002.2426] # SYMBOL FOR SUBSTITUTE FORM TWO 2440 ; [*078C.0020.0002.2440] # OCR HOOK 2441 ; [*078D.0020.0002.2441] # OCR CHAIR 2442 ; [*078E.0020.0002.2442] # OCR FORK 2443 ; [*078F.0020.0002.2443] # OCR INVERTED FORK 2444 ; [*0790.0020.0002.2444] # OCR BELT BUCKLE 2445 ; [*0791.0020.0002.2445] # OCR BOW TIE 2446 ; [*0792.0020.0002.2446] # OCR BRANCH BANK IDENTIFICATION 2447 ; [*0793.0020.0002.2447] # OCR AMOUNT OF CHECK 2448 ; [*0794.0020.0002.2448] # OCR DASH 2449 ; [*0795.0020.0002.2449] # OCR CUSTOMER ACCOUNT NUMBER 244A ; [*0796.0020.0002.244A] # OCR DOUBLE BACKSLASH 2500 ; [*0797.0020.0002.2500] # BOX DRAWINGS LIGHT HORIZONTAL 2501 ; [*0798.0020.0002.2501] # BOX DRAWINGS HEAVY HORIZONTAL 2502 ; [*0799.0020.0002.2502] # BOX DRAWINGS LIGHT VERTICAL 2503 ; [*079A.0020.0002.2503] # BOX DRAWINGS HEAVY VERTICAL 2504 ; [*079B.0020.0002.2504] # BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL 2505 ; [*079C.0020.0002.2505] # BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL 2506 ; [*079D.0020.0002.2506] # BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL 2507 ; [*079E.0020.0002.2507] # BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL 2508 ; [*079F.0020.0002.2508] # BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL 2509 ; [*07A0.0020.0002.2509] # BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL 250A ; [*07A1.0020.0002.250A] # BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL 250B ; [*07A2.0020.0002.250B] # BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL 250C ; [*07A3.0020.0002.250C] # BOX DRAWINGS LIGHT DOWN AND RIGHT 250D ; [*07A4.0020.0002.250D] # BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY 250E ; [*07A5.0020.0002.250E] # BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT 250F ; [*07A6.0020.0002.250F] # BOX DRAWINGS HEAVY DOWN AND RIGHT 2510 ; [*07A7.0020.0002.2510] # BOX DRAWINGS LIGHT DOWN AND LEFT 2511 ; [*07A8.0020.0002.2511] # BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY 2512 ; [*07A9.0020.0002.2512] # BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT 2513 ; [*07AA.0020.0002.2513] # BOX DRAWINGS HEAVY DOWN AND LEFT 2514 ; [*07AB.0020.0002.2514] # BOX DRAWINGS LIGHT UP AND RIGHT 2515 ; [*07AC.0020.0002.2515] # BOX DRAWINGS UP LIGHT AND RIGHT HEAVY 2516 ; [*07AD.0020.0002.2516] # BOX DRAWINGS UP HEAVY AND RIGHT LIGHT 2517 ; [*07AE.0020.0002.2517] # BOX DRAWINGS HEAVY UP AND RIGHT 2518 ; [*07AF.0020.0002.2518] # BOX DRAWINGS LIGHT UP AND LEFT 2519 ; [*07B0.0020.0002.2519] # BOX DRAWINGS UP LIGHT AND LEFT HEAVY 251A ; [*07B1.0020.0002.251A] # BOX DRAWINGS UP HEAVY AND LEFT LIGHT 251B ; [*07B2.0020.0002.251B] # BOX DRAWINGS HEAVY UP AND LEFT 251C ; [*07B3.0020.0002.251C] # BOX DRAWINGS LIGHT VERTICAL AND RIGHT 251D ; [*07B4.0020.0002.251D] # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY 251E ; [*07B5.0020.0002.251E] # BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT 251F ; [*07B6.0020.0002.251F] # BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT 2520 ; [*07B7.0020.0002.2520] # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT 2521 ; [*07B8.0020.0002.2521] # BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY 2522 ; [*07B9.0020.0002.2522] # BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY 2523 ; [*07BA.0020.0002.2523] # BOX DRAWINGS HEAVY VERTICAL AND RIGHT 2524 ; [*07BB.0020.0002.2524] # BOX DRAWINGS LIGHT VERTICAL AND LEFT 2525 ; [*07BC.0020.0002.2525] # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY 2526 ; [*07BD.0020.0002.2526] # BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT 2527 ; [*07BE.0020.0002.2527] # BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT 2528 ; [*07BF.0020.0002.2528] # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT 2529 ; [*07C0.0020.0002.2529] # BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY 252A ; [*07C1.0020.0002.252A] # BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY 252B ; [*07C2.0020.0002.252B] # BOX DRAWINGS HEAVY VERTICAL AND LEFT 252C ; [*07C3.0020.0002.252C] # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL 252D ; [*07C4.0020.0002.252D] # BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT 252E ; [*07C5.0020.0002.252E] # BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT 252F ; [*07C6.0020.0002.252F] # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY 2530 ; [*07C7.0020.0002.2530] # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT 2531 ; [*07C8.0020.0002.2531] # BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY 2532 ; [*07C9.0020.0002.2532] # BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY 2533 ; [*07CA.0020.0002.2533] # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL 2534 ; [*07CB.0020.0002.2534] # BOX DRAWINGS LIGHT UP AND HORIZONTAL 2535 ; [*07CC.0020.0002.2535] # BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT 2536 ; [*07CD.0020.0002.2536] # BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT 2537 ; [*07CE.0020.0002.2537] # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY 2538 ; [*07CF.0020.0002.2538] # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT 2539 ; [*07D0.0020.0002.2539] # BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY 253A ; [*07D1.0020.0002.253A] # BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY 253B ; [*07D2.0020.0002.253B] # BOX DRAWINGS HEAVY UP AND HORIZONTAL 253C ; [*07D3.0020.0002.253C] # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL 253D ; [*07D4.0020.0002.253D] # BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT 253E ; [*07D5.0020.0002.253E] # BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT 253F ; [*07D6.0020.0002.253F] # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY 2540 ; [*07D7.0020.0002.2540] # BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT 2541 ; [*07D8.0020.0002.2541] # BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT 2542 ; [*07D9.0020.0002.2542] # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT 2543 ; [*07DA.0020.0002.2543] # BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT 2544 ; [*07DB.0020.0002.2544] # BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT 2545 ; [*07DC.0020.0002.2545] # BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT 2546 ; [*07DD.0020.0002.2546] # BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT 2547 ; [*07DE.0020.0002.2547] # BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY 2548 ; [*07DF.0020.0002.2548] # BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY 2549 ; [*07E0.0020.0002.2549] # BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY 254A ; [*07E1.0020.0002.254A] # BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY 254B ; [*07E2.0020.0002.254B] # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL 254C ; [*07E3.0020.0002.254C] # BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL 254D ; [*07E4.0020.0002.254D] # BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL 254E ; [*07E5.0020.0002.254E] # BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL 254F ; [*07E6.0020.0002.254F] # BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL 2550 ; [*07E7.0020.0002.2550] # BOX DRAWINGS DOUBLE HORIZONTAL 2551 ; [*07E8.0020.0002.2551] # BOX DRAWINGS DOUBLE VERTICAL 2552 ; [*07E9.0020.0002.2552] # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE 2553 ; [*07EA.0020.0002.2553] # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE 2554 ; [*07EB.0020.0002.2554] # BOX DRAWINGS DOUBLE DOWN AND RIGHT 2555 ; [*07EC.0020.0002.2555] # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE 2556 ; [*07ED.0020.0002.2556] # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE 2557 ; [*07EE.0020.0002.2557] # BOX DRAWINGS DOUBLE DOWN AND LEFT 2558 ; [*07EF.0020.0002.2558] # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE 2559 ; [*07F0.0020.0002.2559] # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE 255A ; [*07F1.0020.0002.255A] # BOX DRAWINGS DOUBLE UP AND RIGHT 255B ; [*07F2.0020.0002.255B] # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE 255C ; [*07F3.0020.0002.255C] # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE 255D ; [*07F4.0020.0002.255D] # BOX DRAWINGS DOUBLE UP AND LEFT 255E ; [*07F5.0020.0002.255E] # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE 255F ; [*07F6.0020.0002.255F] # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE 2560 ; [*07F7.0020.0002.2560] # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT 2561 ; [*07F8.0020.0002.2561] # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE 2562 ; [*07F9.0020.0002.2562] # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE 2563 ; [*07FA.0020.0002.2563] # BOX DRAWINGS DOUBLE VERTICAL AND LEFT 2564 ; [*07FB.0020.0002.2564] # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE 2565 ; [*07FC.0020.0002.2565] # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE 2566 ; [*07FD.0020.0002.2566] # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL 2567 ; [*07FE.0020.0002.2567] # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE 2568 ; [*07FF.0020.0002.2568] # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE 2569 ; [*0800.0020.0002.2569] # BOX DRAWINGS DOUBLE UP AND HORIZONTAL 256A ; [*0801.0020.0002.256A] # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE 256B ; [*0802.0020.0002.256B] # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE 256C ; [*0803.0020.0002.256C] # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL 256D ; [*0804.0020.0002.256D] # BOX DRAWINGS LIGHT ARC DOWN AND RIGHT 256E ; [*0805.0020.0002.256E] # BOX DRAWINGS LIGHT ARC DOWN AND LEFT 256F ; [*0806.0020.0002.256F] # BOX DRAWINGS LIGHT ARC UP AND LEFT 2570 ; [*0807.0020.0002.2570] # BOX DRAWINGS LIGHT ARC UP AND RIGHT 2571 ; [*0808.0020.0002.2571] # BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT 2572 ; [*0809.0020.0002.2572] # BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT 2573 ; [*080A.0020.0002.2573] # BOX DRAWINGS LIGHT DIAGONAL CROSS 2574 ; [*080B.0020.0002.2574] # BOX DRAWINGS LIGHT LEFT 2575 ; [*080C.0020.0002.2575] # BOX DRAWINGS LIGHT UP 2576 ; [*080D.0020.0002.2576] # BOX DRAWINGS LIGHT RIGHT 2577 ; [*080E.0020.0002.2577] # BOX DRAWINGS LIGHT DOWN 2578 ; [*080F.0020.0002.2578] # BOX DRAWINGS HEAVY LEFT 2579 ; [*0810.0020.0002.2579] # BOX DRAWINGS HEAVY UP 257A ; [*0811.0020.0002.257A] # BOX DRAWINGS HEAVY RIGHT 257B ; [*0812.0020.0002.257B] # BOX DRAWINGS HEAVY DOWN 257C ; [*0813.0020.0002.257C] # BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT 257D ; [*0814.0020.0002.257D] # BOX DRAWINGS LIGHT UP AND HEAVY DOWN 257E ; [*0815.0020.0002.257E] # BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT 257F ; [*0816.0020.0002.257F] # BOX DRAWINGS HEAVY UP AND LIGHT DOWN 2580 ; [*0817.0020.0002.2580] # UPPER HALF BLOCK 2581 ; [*0818.0020.0002.2581] # LOWER ONE EIGHTH BLOCK 2582 ; [*0819.0020.0002.2582] # LOWER ONE QUARTER BLOCK 2583 ; [*081A.0020.0002.2583] # LOWER THREE EIGHTHS BLOCK 2584 ; [*081B.0020.0002.2584] # LOWER HALF BLOCK 2585 ; [*081C.0020.0002.2585] # LOWER FIVE EIGHTHS BLOCK 2586 ; [*081D.0020.0002.2586] # LOWER THREE QUARTERS BLOCK 2587 ; [*081E.0020.0002.2587] # LOWER SEVEN EIGHTHS BLOCK 2588 ; [*081F.0020.0002.2588] # FULL BLOCK 2589 ; [*0820.0020.0002.2589] # LEFT SEVEN EIGHTHS BLOCK 258A ; [*0821.0020.0002.258A] # LEFT THREE QUARTERS BLOCK 258B ; [*0822.0020.0002.258B] # LEFT FIVE EIGHTHS BLOCK 258C ; [*0823.0020.0002.258C] # LEFT HALF BLOCK 258D ; [*0824.0020.0002.258D] # LEFT THREE EIGHTHS BLOCK 258E ; [*0825.0020.0002.258E] # LEFT ONE QUARTER BLOCK 258F ; [*0826.0020.0002.258F] # LEFT ONE EIGHTH BLOCK 2590 ; [*0827.0020.0002.2590] # RIGHT HALF BLOCK 2591 ; [*0828.0020.0002.2591] # LIGHT SHADE 2592 ; [*0829.0020.0002.2592] # MEDIUM SHADE 2593 ; [*082A.0020.0002.2593] # DARK SHADE 2594 ; [*082B.0020.0002.2594] # UPPER ONE EIGHTH BLOCK 2595 ; [*082C.0020.0002.2595] # RIGHT ONE EIGHTH BLOCK 2596 ; [*082D.0020.0002.2596] # QUADRANT LOWER LEFT 2597 ; [*082E.0020.0002.2597] # QUADRANT LOWER RIGHT 2598 ; [*082F.0020.0002.2598] # QUADRANT UPPER LEFT 2599 ; [*0830.0020.0002.2599] # QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT 259A ; [*0831.0020.0002.259A] # QUADRANT UPPER LEFT AND LOWER RIGHT 259B ; [*0832.0020.0002.259B] # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT 259C ; [*0833.0020.0002.259C] # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT 259D ; [*0834.0020.0002.259D] # QUADRANT UPPER RIGHT 259E ; [*0835.0020.0002.259E] # QUADRANT UPPER RIGHT AND LOWER LEFT 259F ; [*0836.0020.0002.259F] # QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT 25A0 ; [*0837.0020.0002.25A0] # BLACK SQUARE 25A1 ; [*0838.0020.0002.25A1] # WHITE SQUARE 25A2 ; [*0839.0020.0002.25A2] # WHITE SQUARE WITH ROUNDED CORNERS 25A3 ; [*083A.0020.0002.25A3] # WHITE SQUARE CONTAINING BLACK SMALL SQUARE 25A4 ; [*083B.0020.0002.25A4] # SQUARE WITH HORIZONTAL FILL 25A5 ; [*083C.0020.0002.25A5] # SQUARE WITH VERTICAL FILL 25A6 ; [*083D.0020.0002.25A6] # SQUARE WITH ORTHOGONAL CROSSHATCH FILL 25A7 ; [*083E.0020.0002.25A7] # SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL 25A8 ; [*083F.0020.0002.25A8] # SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL 25A9 ; [*0840.0020.0002.25A9] # SQUARE WITH DIAGONAL CROSSHATCH FILL 25AA ; [*0841.0020.0002.25AA] # BLACK SMALL SQUARE 25AB ; [*0842.0020.0002.25AB] # WHITE SMALL SQUARE 25AC ; [*0843.0020.0002.25AC] # BLACK RECTANGLE 25AD ; [*0844.0020.0002.25AD] # WHITE RECTANGLE 25AE ; [*0845.0020.0002.25AE] # BLACK VERTICAL RECTANGLE 25AF ; [*0846.0020.0002.25AF] # WHITE VERTICAL RECTANGLE 25B0 ; [*0847.0020.0002.25B0] # BLACK PARALLELOGRAM 25B1 ; [*0848.0020.0002.25B1] # WHITE PARALLELOGRAM 25B2 ; [*0849.0020.0002.25B2] # BLACK UP-POINTING TRIANGLE 25B3 ; [*084A.0020.0002.25B3] # WHITE UP-POINTING TRIANGLE 25B4 ; [*084B.0020.0002.25B4] # BLACK UP-POINTING SMALL TRIANGLE 25B5 ; [*084C.0020.0002.25B5] # WHITE UP-POINTING SMALL TRIANGLE 25B6 ; [*084D.0020.0002.25B6] # BLACK RIGHT-POINTING TRIANGLE 25B7 ; [*084E.0020.0002.25B7] # WHITE RIGHT-POINTING TRIANGLE 25B8 ; [*084F.0020.0002.25B8] # BLACK RIGHT-POINTING SMALL TRIANGLE 25B9 ; [*0850.0020.0002.25B9] # WHITE RIGHT-POINTING SMALL TRIANGLE 25BA ; [*0851.0020.0002.25BA] # BLACK RIGHT-POINTING POINTER 25BB ; [*0852.0020.0002.25BB] # WHITE RIGHT-POINTING POINTER 25BC ; [*0853.0020.0002.25BC] # BLACK DOWN-POINTING TRIANGLE 25BD ; [*0854.0020.0002.25BD] # WHITE DOWN-POINTING TRIANGLE 25BE ; [*0855.0020.0002.25BE] # BLACK DOWN-POINTING SMALL TRIANGLE 25BF ; [*0856.0020.0002.25BF] # WHITE DOWN-POINTING SMALL TRIANGLE 25C0 ; [*0857.0020.0002.25C0] # BLACK LEFT-POINTING TRIANGLE 25C1 ; [*0858.0020.0002.25C1] # WHITE LEFT-POINTING TRIANGLE 25C2 ; [*0859.0020.0002.25C2] # BLACK LEFT-POINTING SMALL TRIANGLE 25C3 ; [*085A.0020.0002.25C3] # WHITE LEFT-POINTING SMALL TRIANGLE 25C4 ; [*085B.0020.0002.25C4] # BLACK LEFT-POINTING POINTER 25C5 ; [*085C.0020.0002.25C5] # WHITE LEFT-POINTING POINTER 25C6 ; [*085D.0020.0002.25C6] # BLACK DIAMOND 25C7 ; [*085E.0020.0002.25C7] # WHITE DIAMOND 25C8 ; [*085F.0020.0002.25C8] # WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND 25C9 ; [*0860.0020.0002.25C9] # FISHEYE 25CA ; [*0861.0020.0002.25CA] # LOZENGE 25CB ; [*0862.0020.0002.25CB] # WHITE CIRCLE 25CC ; [*0863.0020.0002.25CC] # DOTTED CIRCLE 25CD ; [*0864.0020.0002.25CD] # CIRCLE WITH VERTICAL FILL 25CE ; [*0865.0020.0002.25CE] # BULLSEYE 25CF ; [*0866.0020.0002.25CF] # BLACK CIRCLE 25D0 ; [*0867.0020.0002.25D0] # CIRCLE WITH LEFT HALF BLACK 25D1 ; [*0868.0020.0002.25D1] # CIRCLE WITH RIGHT HALF BLACK 25D2 ; [*0869.0020.0002.25D2] # CIRCLE WITH LOWER HALF BLACK 25D3 ; [*086A.0020.0002.25D3] # CIRCLE WITH UPPER HALF BLACK 25D4 ; [*086B.0020.0002.25D4] # CIRCLE WITH UPPER RIGHT QUADRANT BLACK 25D5 ; [*086C.0020.0002.25D5] # CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK 25D6 ; [*086D.0020.0002.25D6] # LEFT HALF BLACK CIRCLE 25D7 ; [*086E.0020.0002.25D7] # RIGHT HALF BLACK CIRCLE 25D8 ; [*086F.0020.0002.25D8] # INVERSE BULLET 25D9 ; [*0870.0020.0002.25D9] # INVERSE WHITE CIRCLE 25DA ; [*0871.0020.0002.25DA] # UPPER HALF INVERSE WHITE CIRCLE 25DB ; [*0872.0020.0002.25DB] # LOWER HALF INVERSE WHITE CIRCLE 25DC ; [*0873.0020.0002.25DC] # UPPER LEFT QUADRANT CIRCULAR ARC 25DD ; [*0874.0020.0002.25DD] # UPPER RIGHT QUADRANT CIRCULAR ARC 25DE ; [*0875.0020.0002.25DE] # LOWER RIGHT QUADRANT CIRCULAR ARC 25DF ; [*0876.0020.0002.25DF] # LOWER LEFT QUADRANT CIRCULAR ARC 25E0 ; [*0877.0020.0002.25E0] # UPPER HALF CIRCLE 25E1 ; [*0878.0020.0002.25E1] # LOWER HALF CIRCLE 25E2 ; [*0879.0020.0002.25E2] # BLACK LOWER RIGHT TRIANGLE 25E3 ; [*087A.0020.0002.25E3] # BLACK LOWER LEFT TRIANGLE 25E4 ; [*087B.0020.0002.25E4] # BLACK UPPER LEFT TRIANGLE 25E5 ; [*087C.0020.0002.25E5] # BLACK UPPER RIGHT TRIANGLE 25E6 ; [*087D.0020.0002.25E6] # WHITE BULLET 25E7 ; [*087E.0020.0002.25E7] # SQUARE WITH LEFT HALF BLACK 25E8 ; [*087F.0020.0002.25E8] # SQUARE WITH RIGHT HALF BLACK 25E9 ; [*0880.0020.0002.25E9] # SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK 25EA ; [*0881.0020.0002.25EA] # SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK 25EB ; [*0882.0020.0002.25EB] # WHITE SQUARE WITH VERTICAL BISECTING LINE 25EC ; [*0883.0020.0002.25EC] # WHITE UP-POINTING TRIANGLE WITH DOT 25ED ; [*0884.0020.0002.25ED] # UP-POINTING TRIANGLE WITH LEFT HALF BLACK 25EE ; [*0885.0020.0002.25EE] # UP-POINTING TRIANGLE WITH RIGHT HALF BLACK 25EF ; [*0886.0020.0002.25EF] # LARGE CIRCLE 25F0 ; [*0887.0020.0002.25F0] # WHITE SQUARE WITH UPPER LEFT QUADRANT 25F1 ; [*0888.0020.0002.25F1] # WHITE SQUARE WITH LOWER LEFT QUADRANT 25F2 ; [*0889.0020.0002.25F2] # WHITE SQUARE WITH LOWER RIGHT QUADRANT 25F3 ; [*088A.0020.0002.25F3] # WHITE SQUARE WITH UPPER RIGHT QUADRANT 25F4 ; [*088B.0020.0002.25F4] # WHITE CIRCLE WITH UPPER LEFT QUADRANT 25F5 ; [*088C.0020.0002.25F5] # WHITE CIRCLE WITH LOWER LEFT QUADRANT 25F6 ; [*088D.0020.0002.25F6] # WHITE CIRCLE WITH LOWER RIGHT QUADRANT 25F7 ; [*088E.0020.0002.25F7] # WHITE CIRCLE WITH UPPER RIGHT QUADRANT 25F8 ; [*088F.0020.0002.25F8] # UPPER LEFT TRIANGLE 25F9 ; [*0890.0020.0002.25F9] # UPPER RIGHT TRIANGLE 25FA ; [*0891.0020.0002.25FA] # LOWER LEFT TRIANGLE 25FB ; [*0892.0020.0002.25FB] # WHITE MEDIUM SQUARE 25FC ; [*0893.0020.0002.25FC] # BLACK MEDIUM SQUARE 25FD ; [*0894.0020.0002.25FD] # WHITE MEDIUM SMALL SQUARE 25FE ; [*0895.0020.0002.25FE] # BLACK MEDIUM SMALL SQUARE 25FF ; [*0896.0020.0002.25FF] # LOWER RIGHT TRIANGLE 2600 ; [*0897.0020.0002.2600] # BLACK SUN WITH RAYS 2601 ; [*0898.0020.0002.2601] # CLOUD 2602 ; [*0899.0020.0002.2602] # UMBRELLA 2603 ; [*089A.0020.0002.2603] # SNOWMAN 2604 ; [*089B.0020.0002.2604] # COMET 2605 ; [*089C.0020.0002.2605] # BLACK STAR 2606 ; [*089D.0020.0002.2606] # WHITE STAR 2607 ; [*089E.0020.0002.2607] # LIGHTNING 2608 ; [*089F.0020.0002.2608] # THUNDERSTORM 2609 ; [*08A0.0020.0002.2609] # SUN 260A ; [*08A1.0020.0002.260A] # ASCENDING NODE 260B ; [*08A2.0020.0002.260B] # DESCENDING NODE 260C ; [*08A3.0020.0002.260C] # CONJUNCTION 260D ; [*08A4.0020.0002.260D] # OPPOSITION 260E ; [*08A5.0020.0002.260E] # BLACK TELEPHONE 260F ; [*08A6.0020.0002.260F] # WHITE TELEPHONE 2610 ; [*08A7.0020.0002.2610] # BALLOT BOX 2611 ; [*08A8.0020.0002.2611] # BALLOT BOX WITH CHECK 2612 ; [*08A9.0020.0002.2612] # BALLOT BOX WITH X 2613 ; [*08AA.0020.0002.2613] # SALTIRE 2614 ; [*08AB.0020.0002.2614] # UMBRELLA WITH RAIN DROPS 2615 ; [*08AC.0020.0002.2615] # HOT BEVERAGE 2616 ; [*08AD.0020.0002.2616] # WHITE SHOGI PIECE 2617 ; [*08AE.0020.0002.2617] # BLACK SHOGI PIECE 2618 ; [*08AF.0020.0002.2618] # SHAMROCK 2619 ; [*08B0.0020.0002.2619] # REVERSED ROTATED FLORAL HEART BULLET 261A ; [*08B1.0020.0002.261A] # BLACK LEFT POINTING INDEX 261B ; [*08B2.0020.0002.261B] # BLACK RIGHT POINTING INDEX 261C ; [*08B3.0020.0002.261C] # WHITE LEFT POINTING INDEX 261D ; [*08B4.0020.0002.261D] # WHITE UP POINTING INDEX 261E ; [*08B5.0020.0002.261E] # WHITE RIGHT POINTING INDEX 261F ; [*08B6.0020.0002.261F] # WHITE DOWN POINTING INDEX 2620 ; [*08B7.0020.0002.2620] # SKULL AND CROSSBONES 2621 ; [*08B8.0020.0002.2621] # CAUTION SIGN 2622 ; [*08B9.0020.0002.2622] # RADIOACTIVE SIGN 2623 ; [*08BA.0020.0002.2623] # BIOHAZARD SIGN 2624 ; [*08BB.0020.0002.2624] # CADUCEUS 2625 ; [*08BC.0020.0002.2625] # ANKH 2626 ; [*08BD.0020.0002.2626] # ORTHODOX CROSS 2627 ; [*08BE.0020.0002.2627] # CHI RHO 2628 ; [*08BF.0020.0002.2628] # CROSS OF LORRAINE 2629 ; [*08C0.0020.0002.2629] # CROSS OF JERUSALEM 262A ; [*08C1.0020.0002.262A] # STAR AND CRESCENT 262B ; [*08C2.0020.0002.262B] # FARSI SYMBOL 262C ; [*08C3.0020.0002.262C] # ADI SHAKTI 262D ; [*08C4.0020.0002.262D] # HAMMER AND SICKLE 262E ; [*08C5.0020.0002.262E] # PEACE SYMBOL 262F ; [*08C6.0020.0002.262F] # YIN YANG 2630 ; [*0D8F.0020.0002.2630] # TRIGRAM FOR HEAVEN 2631 ; [*0D90.0020.0002.2631] # TRIGRAM FOR LAKE 2632 ; [*0D91.0020.0002.2632] # TRIGRAM FOR FIRE 2633 ; [*0D92.0020.0002.2633] # TRIGRAM FOR THUNDER 2634 ; [*0D93.0020.0002.2634] # TRIGRAM FOR WIND 2635 ; [*0D94.0020.0002.2635] # TRIGRAM FOR WATER 2636 ; [*0D95.0020.0002.2636] # TRIGRAM FOR MOUNTAIN 2637 ; [*0D96.0020.0002.2637] # TRIGRAM FOR EARTH 2638 ; [*08C7.0020.0002.2638] # WHEEL OF DHARMA 2639 ; [*08C8.0020.0002.2639] # WHITE FROWNING FACE 263A ; [*08C9.0020.0002.263A] # WHITE SMILING FACE 263B ; [*08CA.0020.0002.263B] # BLACK SMILING FACE 263C ; [*08CB.0020.0002.263C] # WHITE SUN WITH RAYS 263D ; [*08CC.0020.0002.263D] # FIRST QUARTER MOON 263E ; [*08CD.0020.0002.263E] # LAST QUARTER MOON 263F ; [*08CE.0020.0002.263F] # MERCURY 2640 ; [*08CF.0020.0002.2640] # FEMALE SIGN 2641 ; [*08D0.0020.0002.2641] # EARTH 2642 ; [*08D1.0020.0002.2642] # MALE SIGN 2643 ; [*08D2.0020.0002.2643] # JUPITER 2644 ; [*08D3.0020.0002.2644] # SATURN 2645 ; [*08D4.0020.0002.2645] # URANUS 2646 ; [*08D5.0020.0002.2646] # NEPTUNE 2647 ; [*08D6.0020.0002.2647] # PLUTO 2648 ; [*08D7.0020.0002.2648] # ARIES 2649 ; [*08D8.0020.0002.2649] # TAURUS 264A ; [*08D9.0020.0002.264A] # GEMINI 264B ; [*08DA.0020.0002.264B] # CANCER 264C ; [*08DB.0020.0002.264C] # LEO 264D ; [*08DC.0020.0002.264D] # VIRGO 264E ; [*08DD.0020.0002.264E] # LIBRA 264F ; [*08DE.0020.0002.264F] # SCORPIUS 2650 ; [*08DF.0020.0002.2650] # SAGITTARIUS 2651 ; [*08E0.0020.0002.2651] # CAPRICORN 2652 ; [*08E1.0020.0002.2652] # AQUARIUS 2653 ; [*08E2.0020.0002.2653] # PISCES 2654 ; [*08E3.0020.0002.2654] # WHITE CHESS KING 2655 ; [*08E4.0020.0002.2655] # WHITE CHESS QUEEN 2656 ; [*08E5.0020.0002.2656] # WHITE CHESS ROOK 2657 ; [*08E6.0020.0002.2657] # WHITE CHESS BISHOP 2658 ; [*08E7.0020.0002.2658] # WHITE CHESS KNIGHT 2659 ; [*08E8.0020.0002.2659] # WHITE CHESS PAWN 265A ; [*08E9.0020.0002.265A] # BLACK CHESS KING 265B ; [*08EA.0020.0002.265B] # BLACK CHESS QUEEN 265C ; [*08EB.0020.0002.265C] # BLACK CHESS ROOK 265D ; [*08EC.0020.0002.265D] # BLACK CHESS BISHOP 265E ; [*08ED.0020.0002.265E] # BLACK CHESS KNIGHT 265F ; [*08EE.0020.0002.265F] # BLACK CHESS PAWN 2660 ; [*08EF.0020.0002.2660] # BLACK SPADE SUIT 2661 ; [*08F0.0020.0002.2661] # WHITE HEART SUIT 2662 ; [*08F1.0020.0002.2662] # WHITE DIAMOND SUIT 2663 ; [*08F2.0020.0002.2663] # BLACK CLUB SUIT 2664 ; [*08F3.0020.0002.2664] # WHITE SPADE SUIT 2665 ; [*08F4.0020.0002.2665] # BLACK HEART SUIT 2666 ; [*08F5.0020.0002.2666] # BLACK DIAMOND SUIT 2667 ; [*08F6.0020.0002.2667] # WHITE CLUB SUIT 2668 ; [*08F7.0020.0002.2668] # HOT SPRINGS 2669 ; [*08F8.0020.0002.2669] # QUARTER NOTE 266A ; [*08F9.0020.0002.266A] # EIGHTH NOTE 266B ; [*08FA.0020.0002.266B] # BEAMED EIGHTH NOTES 266C ; [*08FB.0020.0002.266C] # BEAMED SIXTEENTH NOTES 266D ; [*0FD5.0020.0002.266D] # MUSIC FLAT SIGN 266E ; [*0FD6.0020.0002.266E] # MUSIC NATURAL SIGN 266F ; [*0FD7.0020.0002.266F] # MUSIC SHARP SIGN 2670 ; [*08FC.0020.0002.2670] # WEST SYRIAC CROSS 2671 ; [*08FD.0020.0002.2671] # EAST SYRIAC CROSS 2672 ; [*08FE.0020.0002.2672] # UNIVERSAL RECYCLING SYMBOL 2673 ; [*08FF.0020.0002.2673] # RECYCLING SYMBOL FOR TYPE-1 PLASTICS 2674 ; [*0900.0020.0002.2674] # RECYCLING SYMBOL FOR TYPE-2 PLASTICS 2675 ; [*0901.0020.0002.2675] # RECYCLING SYMBOL FOR TYPE-3 PLASTICS 2676 ; [*0902.0020.0002.2676] # RECYCLING SYMBOL FOR TYPE-4 PLASTICS 2677 ; [*0903.0020.0002.2677] # RECYCLING SYMBOL FOR TYPE-5 PLASTICS 2678 ; [*0904.0020.0002.2678] # RECYCLING SYMBOL FOR TYPE-6 PLASTICS 2679 ; [*0905.0020.0002.2679] # RECYCLING SYMBOL FOR TYPE-7 PLASTICS 267A ; [*0906.0020.0002.267A] # RECYCLING SYMBOL FOR GENERIC MATERIALS 267B ; [*0907.0020.0002.267B] # BLACK UNIVERSAL RECYCLING SYMBOL 267C ; [*0908.0020.0002.267C] # RECYCLED PAPER SYMBOL 267D ; [*0909.0020.0002.267D] # PARTIALLY-RECYCLED PAPER SYMBOL 267E ; [*090A.0020.0002.267E] # PERMANENT PAPER SIGN 267F ; [*090B.0020.0002.267F] # WHEELCHAIR SYMBOL 2680 ; [*090C.0020.0002.2680] # DIE FACE-1 2681 ; [*090D.0020.0002.2681] # DIE FACE-2 2682 ; [*090E.0020.0002.2682] # DIE FACE-3 2683 ; [*090F.0020.0002.2683] # DIE FACE-4 2684 ; [*0910.0020.0002.2684] # DIE FACE-5 2685 ; [*0911.0020.0002.2685] # DIE FACE-6 2686 ; [*0912.0020.0002.2686] # WHITE CIRCLE WITH DOT RIGHT 2687 ; [*0913.0020.0002.2687] # WHITE CIRCLE WITH TWO DOTS 2688 ; [*0914.0020.0002.2688] # BLACK CIRCLE WITH WHITE DOT RIGHT 2689 ; [*0915.0020.0002.2689] # BLACK CIRCLE WITH TWO WHITE DOTS 268A ; [*0D89.0020.0002.268A] # MONOGRAM FOR YANG 268B ; [*0D8A.0020.0002.268B] # MONOGRAM FOR YIN 268C ; [*0D8B.0020.0002.268C] # DIGRAM FOR GREATER YANG 268D ; [*0D8C.0020.0002.268D] # DIGRAM FOR LESSER YIN 268E ; [*0D8D.0020.0002.268E] # DIGRAM FOR LESSER YANG 268F ; [*0D8E.0020.0002.268F] # DIGRAM FOR GREATER YIN 2690 ; [*0916.0020.0002.2690] # WHITE FLAG 2691 ; [*0917.0020.0002.2691] # BLACK FLAG 2692 ; [*0918.0020.0002.2692] # HAMMER AND PICK 2693 ; [*0919.0020.0002.2693] # ANCHOR 2694 ; [*091A.0020.0002.2694] # CROSSED SWORDS 2695 ; [*091B.0020.0002.2695] # STAFF OF AESCULAPIUS 2696 ; [*091C.0020.0002.2696] # SCALES 2697 ; [*091D.0020.0002.2697] # ALEMBIC 2698 ; [*091E.0020.0002.2698] # FLOWER 2699 ; [*091F.0020.0002.2699] # GEAR 269A ; [*0920.0020.0002.269A] # STAFF OF HERMES 269B ; [*0921.0020.0002.269B] # ATOM SYMBOL 269C ; [*0922.0020.0002.269C] # FLEUR-DE-LIS 269D ; [*0923.0020.0002.269D] # OUTLINED WHITE STAR 269E ; [*0924.0020.0002.269E] # THREE LINES CONVERGING RIGHT 269F ; [*0925.0020.0002.269F] # THREE LINES CONVERGING LEFT 26A0 ; [*0926.0020.0002.26A0] # WARNING SIGN 26A1 ; [*0927.0020.0002.26A1] # HIGH VOLTAGE SIGN 26A2 ; [*0928.0020.0002.26A2] # DOUBLED FEMALE SIGN 26A3 ; [*0929.0020.0002.26A3] # DOUBLED MALE SIGN 26A4 ; [*092A.0020.0002.26A4] # INTERLOCKED FEMALE AND MALE SIGN 26A5 ; [*092B.0020.0002.26A5] # MALE AND FEMALE SIGN 26A6 ; [*092C.0020.0002.26A6] # MALE WITH STROKE SIGN 26A7 ; [*092D.0020.0002.26A7] # MALE WITH STROKE AND MALE AND FEMALE SIGN 26A8 ; [*092E.0020.0002.26A8] # VERTICAL MALE WITH STROKE SIGN 26A9 ; [*092F.0020.0002.26A9] # HORIZONTAL MALE WITH STROKE SIGN 26AA ; [*0930.0020.0002.26AA] # MEDIUM WHITE CIRCLE 26AB ; [*0931.0020.0002.26AB] # MEDIUM BLACK CIRCLE 26AC ; [*0932.0020.0002.26AC] # MEDIUM SMALL WHITE CIRCLE 26AD ; [*0933.0020.0002.26AD] # MARRIAGE SYMBOL 26AE ; [*0934.0020.0002.26AE] # DIVORCE SYMBOL 26AF ; [*0935.0020.0002.26AF] # UNMARRIED PARTNERSHIP SYMBOL 26B0 ; [*0936.0020.0002.26B0] # COFFIN 26B1 ; [*0937.0020.0002.26B1] # FUNERAL URN 26B2 ; [*0938.0020.0002.26B2] # NEUTER 26B3 ; [*0939.0020.0002.26B3] # CERES 26B4 ; [*093A.0020.0002.26B4] # PALLAS 26B5 ; [*093B.0020.0002.26B5] # JUNO 26B6 ; [*093C.0020.0002.26B6] # VESTA 26B7 ; [*093D.0020.0002.26B7] # CHIRON 26B8 ; [*093E.0020.0002.26B8] # BLACK MOON LILITH 26B9 ; [*093F.0020.0002.26B9] # SEXTILE 26BA ; [*0940.0020.0002.26BA] # SEMISEXTILE 26BB ; [*0941.0020.0002.26BB] # QUINCUNX 26BC ; [*0942.0020.0002.26BC] # SESQUIQUADRATE 26BD ; [*0943.0020.0002.26BD] # SOCCER BALL 26BE ; [*0944.0020.0002.26BE] # BASEBALL 26BF ; [*0945.0020.0002.26BF] # SQUARED KEY 26C0 ; [*0946.0020.0002.26C0] # WHITE DRAUGHTS MAN 26C1 ; [*0947.0020.0002.26C1] # WHITE DRAUGHTS KING 26C2 ; [*0948.0020.0002.26C2] # BLACK DRAUGHTS MAN 26C3 ; [*0949.0020.0002.26C3] # BLACK DRAUGHTS KING 26C4 ; [*094A.0020.0002.26C4] # SNOWMAN WITHOUT SNOW 26C5 ; [*094B.0020.0002.26C5] # SUN BEHIND CLOUD 26C6 ; [*094C.0020.0002.26C6] # RAIN 26C7 ; [*094D.0020.0002.26C7] # BLACK SNOWMAN 26C8 ; [*094E.0020.0002.26C8] # THUNDER CLOUD AND RAIN 26C9 ; [*094F.0020.0002.26C9] # TURNED WHITE SHOGI PIECE 26CA ; [*0950.0020.0002.26CA] # TURNED BLACK SHOGI PIECE 26CB ; [*0951.0020.0002.26CB] # WHITE DIAMOND IN SQUARE 26CC ; [*0952.0020.0002.26CC] # CROSSING LANES 26CD ; [*0953.0020.0002.26CD] # DISABLED CAR 26CE ; [*0954.0020.0002.26CE] # OPHIUCHUS 26CF ; [*0955.0020.0002.26CF] # PICK 26D0 ; [*0956.0020.0002.26D0] # CAR SLIDING 26D1 ; [*0957.0020.0002.26D1] # HELMET WITH WHITE CROSS 26D2 ; [*0958.0020.0002.26D2] # CIRCLED CROSSING LANES 26D3 ; [*0959.0020.0002.26D3] # CHAINS 26D4 ; [*095A.0020.0002.26D4] # NO ENTRY 26D5 ; [*095B.0020.0002.26D5] # ALTERNATE ONE-WAY LEFT WAY TRAFFIC 26D6 ; [*095C.0020.0002.26D6] # BLACK TWO-WAY LEFT WAY TRAFFIC 26D7 ; [*095D.0020.0002.26D7] # WHITE TWO-WAY LEFT WAY TRAFFIC 26D8 ; [*095E.0020.0002.26D8] # BLACK LEFT LANE MERGE 26D9 ; [*095F.0020.0002.26D9] # WHITE LEFT LANE MERGE 26DA ; [*0960.0020.0002.26DA] # DRIVE SLOW SIGN 26DB ; [*0961.0020.0002.26DB] # HEAVY WHITE DOWN-POINTING TRIANGLE 26DC ; [*0962.0020.0002.26DC] # LEFT CLOSED ENTRY 26DD ; [*0963.0020.0002.26DD] # SQUARED SALTIRE 26DE ; [*0964.0020.0002.26DE] # FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE 26DF ; [*0965.0020.0002.26DF] # BLACK TRUCK 26E0 ; [*0966.0020.0002.26E0] # RESTRICTED LEFT ENTRY-1 26E1 ; [*0967.0020.0002.26E1] # RESTRICTED LEFT ENTRY-2 26E2 ; [*0968.0020.0002.26E2] # ASTRONOMICAL SYMBOL FOR URANUS 26E3 ; [*0969.0020.0002.26E3] # HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE 26E4 ; [*096A.0020.0002.26E4] # PENTAGRAM 26E5 ; [*096B.0020.0002.26E5] # RIGHT-HANDED INTERLACED PENTAGRAM 26E6 ; [*096C.0020.0002.26E6] # LEFT-HANDED INTERLACED PENTAGRAM 26E7 ; [*096D.0020.0002.26E7] # INVERTED PENTAGRAM 26E8 ; [*096E.0020.0002.26E8] # BLACK CROSS ON SHIELD 26E9 ; [*096F.0020.0002.26E9] # SHINTO SHRINE 26EA ; [*0970.0020.0002.26EA] # CHURCH 26EB ; [*0971.0020.0002.26EB] # CASTLE 26EC ; [*0972.0020.0002.26EC] # HISTORIC SITE 26ED ; [*0973.0020.0002.26ED] # GEAR WITHOUT HUB 26EE ; [*0974.0020.0002.26EE] # GEAR WITH HANDLES 26EF ; [*0975.0020.0002.26EF] # MAP SYMBOL FOR LIGHTHOUSE 26F0 ; [*0976.0020.0002.26F0] # MOUNTAIN 26F1 ; [*0977.0020.0002.26F1] # UMBRELLA ON GROUND 26F2 ; [*0978.0020.0002.26F2] # FOUNTAIN 26F3 ; [*0979.0020.0002.26F3] # FLAG IN HOLE 26F4 ; [*097A.0020.0002.26F4] # FERRY 26F5 ; [*097B.0020.0002.26F5] # SAILBOAT 26F6 ; [*097C.0020.0002.26F6] # SQUARE FOUR CORNERS 26F7 ; [*097D.0020.0002.26F7] # SKIER 26F8 ; [*097E.0020.0002.26F8] # ICE SKATE 26F9 ; [*097F.0020.0002.26F9] # PERSON WITH BALL 26FA ; [*0980.0020.0002.26FA] # TENT 26FB ; [*0981.0020.0002.26FB] # JAPANESE BANK SYMBOL 26FC ; [*0982.0020.0002.26FC] # HEADSTONE GRAVEYARD SYMBOL 26FD ; [*0983.0020.0002.26FD] # FUEL PUMP 26FE ; [*0984.0020.0002.26FE] # CUP ON BLACK SQUARE 26FF ; [*0985.0020.0002.26FF] # WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE 2701 ; [*0986.0020.0002.2701] # UPPER BLADE SCISSORS 2702 ; [*0987.0020.0002.2702] # BLACK SCISSORS 2703 ; [*0988.0020.0002.2703] # LOWER BLADE SCISSORS 2704 ; [*0989.0020.0002.2704] # WHITE SCISSORS 2705 ; [*098A.0020.0002.2705] # WHITE HEAVY CHECK MARK 2706 ; [*098B.0020.0002.2706] # TELEPHONE LOCATION SIGN 2707 ; [*098C.0020.0002.2707] # TAPE DRIVE 2708 ; [*098D.0020.0002.2708] # AIRPLANE 2709 ; [*098E.0020.0002.2709] # ENVELOPE 270A ; [*098F.0020.0002.270A] # RAISED FIST 270B ; [*0990.0020.0002.270B] # RAISED HAND 270C ; [*0991.0020.0002.270C] # VICTORY HAND 270D ; [*0992.0020.0002.270D] # WRITING HAND 270E ; [*0993.0020.0002.270E] # LOWER RIGHT PENCIL 270F ; [*0994.0020.0002.270F] # PENCIL 2710 ; [*0995.0020.0002.2710] # UPPER RIGHT PENCIL 2711 ; [*0996.0020.0002.2711] # WHITE NIB 2712 ; [*0997.0020.0002.2712] # BLACK NIB 2713 ; [*0998.0020.0002.2713] # CHECK MARK 2714 ; [*0999.0020.0002.2714] # HEAVY CHECK MARK 2715 ; [*099A.0020.0002.2715] # MULTIPLICATION X 2716 ; [*099B.0020.0002.2716] # HEAVY MULTIPLICATION X 2717 ; [*099C.0020.0002.2717] # BALLOT X 2718 ; [*099D.0020.0002.2718] # HEAVY BALLOT X 2719 ; [*099E.0020.0002.2719] # OUTLINED GREEK CROSS 271A ; [*099F.0020.0002.271A] # HEAVY GREEK CROSS 271B ; [*09A0.0020.0002.271B] # OPEN CENTRE CROSS 271C ; [*09A1.0020.0002.271C] # HEAVY OPEN CENTRE CROSS 271D ; [*09A2.0020.0002.271D] # LATIN CROSS 271E ; [*09A3.0020.0002.271E] # SHADOWED WHITE LATIN CROSS 271F ; [*09A4.0020.0002.271F] # OUTLINED LATIN CROSS 2720 ; [*09A5.0020.0002.2720] # MALTESE CROSS 2721 ; [*09A6.0020.0002.2721] # STAR OF DAVID 2722 ; [*09A7.0020.0002.2722] # FOUR TEARDROP-SPOKED ASTERISK 2723 ; [*09A8.0020.0002.2723] # FOUR BALLOON-SPOKED ASTERISK 2724 ; [*09A9.0020.0002.2724] # HEAVY FOUR BALLOON-SPOKED ASTERISK 2725 ; [*09AA.0020.0002.2725] # FOUR CLUB-SPOKED ASTERISK 2726 ; [*09AB.0020.0002.2726] # BLACK FOUR POINTED STAR 2727 ; [*09AC.0020.0002.2727] # WHITE FOUR POINTED STAR 2728 ; [*09AD.0020.0002.2728] # SPARKLES 2729 ; [*09AE.0020.0002.2729] # STRESS OUTLINED WHITE STAR 272A ; [*09AF.0020.0002.272A] # CIRCLED WHITE STAR 272B ; [*09B0.0020.0002.272B] # OPEN CENTRE BLACK STAR 272C ; [*09B1.0020.0002.272C] # BLACK CENTRE WHITE STAR 272D ; [*09B2.0020.0002.272D] # OUTLINED BLACK STAR 272E ; [*09B3.0020.0002.272E] # HEAVY OUTLINED BLACK STAR 272F ; [*09B4.0020.0002.272F] # PINWHEEL STAR 2730 ; [*09B5.0020.0002.2730] # SHADOWED WHITE STAR 2731 ; [*09B6.0020.0002.2731] # HEAVY ASTERISK 2732 ; [*09B7.0020.0002.2732] # OPEN CENTRE ASTERISK 2733 ; [*09B8.0020.0002.2733] # EIGHT SPOKED ASTERISK 2734 ; [*09B9.0020.0002.2734] # EIGHT POINTED BLACK STAR 2735 ; [*09BA.0020.0002.2735] # EIGHT POINTED PINWHEEL STAR 2736 ; [*09BB.0020.0002.2736] # SIX POINTED BLACK STAR 2737 ; [*09BC.0020.0002.2737] # EIGHT POINTED RECTILINEAR BLACK STAR 2738 ; [*09BD.0020.0002.2738] # HEAVY EIGHT POINTED RECTILINEAR BLACK STAR 2739 ; [*09BE.0020.0002.2739] # TWELVE POINTED BLACK STAR 273A ; [*09BF.0020.0002.273A] # SIXTEEN POINTED ASTERISK 273B ; [*09C0.0020.0002.273B] # TEARDROP-SPOKED ASTERISK 273C ; [*09C1.0020.0002.273C] # OPEN CENTRE TEARDROP-SPOKED ASTERISK 273D ; [*09C2.0020.0002.273D] # HEAVY TEARDROP-SPOKED ASTERISK 273E ; [*09C3.0020.0002.273E] # SIX PETALLED BLACK AND WHITE FLORETTE 273F ; [*09C4.0020.0002.273F] # BLACK FLORETTE 2740 ; [*09C5.0020.0002.2740] # WHITE FLORETTE 2741 ; [*09C6.0020.0002.2741] # EIGHT PETALLED OUTLINED BLACK FLORETTE 2742 ; [*09C7.0020.0002.2742] # CIRCLED OPEN CENTRE EIGHT POINTED STAR 2743 ; [*09C8.0020.0002.2743] # HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK 2744 ; [*09C9.0020.0002.2744] # SNOWFLAKE 2745 ; [*09CA.0020.0002.2745] # TIGHT TRIFOLIATE SNOWFLAKE 2746 ; [*09CB.0020.0002.2746] # HEAVY CHEVRON SNOWFLAKE 2747 ; [*09CC.0020.0002.2747] # SPARKLE 2748 ; [*09CD.0020.0002.2748] # HEAVY SPARKLE 2749 ; [*09CE.0020.0002.2749] # BALLOON-SPOKED ASTERISK 274A ; [*09CF.0020.0002.274A] # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK 274B ; [*09D0.0020.0002.274B] # HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK 274C ; [*09D1.0020.0002.274C] # CROSS MARK 274D ; [*09D2.0020.0002.274D] # SHADOWED WHITE CIRCLE 274E ; [*09D3.0020.0002.274E] # NEGATIVE SQUARED CROSS MARK 274F ; [*09D4.0020.0002.274F] # LOWER RIGHT DROP-SHADOWED WHITE SQUARE 2750 ; [*09D5.0020.0002.2750] # UPPER RIGHT DROP-SHADOWED WHITE SQUARE 2751 ; [*09D6.0020.0002.2751] # LOWER RIGHT SHADOWED WHITE SQUARE 2752 ; [*09D7.0020.0002.2752] # UPPER RIGHT SHADOWED WHITE SQUARE 2753 ; [*09D8.0020.0002.2753] # BLACK QUESTION MARK ORNAMENT 2754 ; [*09D9.0020.0002.2754] # WHITE QUESTION MARK ORNAMENT 2755 ; [*09DA.0020.0002.2755] # WHITE EXCLAMATION MARK ORNAMENT 2756 ; [*09DB.0020.0002.2756] # BLACK DIAMOND MINUS WHITE X 2757 ; [*09DC.0020.0002.2757] # HEAVY EXCLAMATION MARK SYMBOL 2758 ; [*09DD.0020.0002.2758] # LIGHT VERTICAL BAR 2759 ; [*09DE.0020.0002.2759] # MEDIUM VERTICAL BAR 275A ; [*09DF.0020.0002.275A] # HEAVY VERTICAL BAR 275B ; [*09E0.0020.0002.275B] # HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT 275C ; [*09E1.0020.0002.275C] # HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT 275D ; [*09E2.0020.0002.275D] # HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT 275E ; [*09E3.0020.0002.275E] # HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT 275F ; [*09E4.0020.0002.275F] # HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT 2760 ; [*09E5.0020.0002.2760] # HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT 2761 ; [*09E6.0020.0002.2761] # CURVED STEM PARAGRAPH SIGN ORNAMENT 2762 ; [*09E7.0020.0002.2762] # HEAVY EXCLAMATION MARK ORNAMENT 2763 ; [*09E8.0020.0002.2763] # HEAVY HEART EXCLAMATION MARK ORNAMENT 2764 ; [*09E9.0020.0002.2764] # HEAVY BLACK HEART 2765 ; [*09EA.0020.0002.2765] # ROTATED HEAVY BLACK HEART BULLET 2766 ; [*09EB.0020.0002.2766] # FLORAL HEART 2767 ; [*09EC.0020.0002.2767] # ROTATED FLORAL HEART BULLET 2768 ; [*032D.0020.0002.2768] # MEDIUM LEFT PARENTHESIS ORNAMENT 2769 ; [*032E.0020.0002.2769] # MEDIUM RIGHT PARENTHESIS ORNAMENT 276A ; [*032F.0020.0002.276A] # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT 276B ; [*0330.0020.0002.276B] # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT 276C ; [*0331.0020.0002.276C] # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT 276D ; [*0332.0020.0002.276D] # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT 276E ; [*0333.0020.0002.276E] # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT 276F ; [*0334.0020.0002.276F] # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT 2770 ; [*0335.0020.0002.2770] # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT 2771 ; [*0336.0020.0002.2771] # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT 2772 ; [*0337.0020.0002.2772] # LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT 2773 ; [*0338.0020.0002.2773] # LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT 2774 ; [*0339.0020.0002.2774] # MEDIUM LEFT CURLY BRACKET ORNAMENT 2775 ; [*033A.0020.0002.2775] # MEDIUM RIGHT CURLY BRACKET ORNAMENT 2794 ; [*09ED.0020.0002.2794] # HEAVY WIDE-HEADED RIGHTWARDS ARROW 2795 ; [*09EE.0020.0002.2795] # HEAVY PLUS SIGN 2796 ; [*09EF.0020.0002.2796] # HEAVY MINUS SIGN 2797 ; [*09F0.0020.0002.2797] # HEAVY DIVISION SIGN 2798 ; [*09F1.0020.0002.2798] # HEAVY SOUTH EAST ARROW 2799 ; [*09F2.0020.0002.2799] # HEAVY RIGHTWARDS ARROW 279A ; [*09F3.0020.0002.279A] # HEAVY NORTH EAST ARROW 279B ; [*09F4.0020.0002.279B] # DRAFTING POINT RIGHTWARDS ARROW 279C ; [*09F5.0020.0002.279C] # HEAVY ROUND-TIPPED RIGHTWARDS ARROW 279D ; [*09F6.0020.0002.279D] # TRIANGLE-HEADED RIGHTWARDS ARROW 279E ; [*09F7.0020.0002.279E] # HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW 279F ; [*09F8.0020.0002.279F] # DASHED TRIANGLE-HEADED RIGHTWARDS ARROW 27A0 ; [*09F9.0020.0002.27A0] # HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW 27A1 ; [*09FA.0020.0002.27A1] # BLACK RIGHTWARDS ARROW 27A2 ; [*09FB.0020.0002.27A2] # THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD 27A3 ; [*09FC.0020.0002.27A3] # THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD 27A4 ; [*09FD.0020.0002.27A4] # BLACK RIGHTWARDS ARROWHEAD 27A5 ; [*09FE.0020.0002.27A5] # HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW 27A6 ; [*09FF.0020.0002.27A6] # HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW 27A7 ; [*0A00.0020.0002.27A7] # SQUAT BLACK RIGHTWARDS ARROW 27A8 ; [*0A01.0020.0002.27A8] # HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW 27A9 ; [*0A02.0020.0002.27A9] # RIGHT-SHADED WHITE RIGHTWARDS ARROW 27AA ; [*0A03.0020.0002.27AA] # LEFT-SHADED WHITE RIGHTWARDS ARROW 27AB ; [*0A04.0020.0002.27AB] # BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW 27AC ; [*0A05.0020.0002.27AC] # FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW 27AD ; [*0A06.0020.0002.27AD] # HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW 27AE ; [*0A07.0020.0002.27AE] # HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW 27AF ; [*0A08.0020.0002.27AF] # NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW 27B0 ; [*0A09.0020.0002.27B0] # CURLY LOOP 27B1 ; [*0A0A.0020.0002.27B1] # NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW 27B2 ; [*0A0B.0020.0002.27B2] # CIRCLED HEAVY WHITE RIGHTWARDS ARROW 27B3 ; [*0A0C.0020.0002.27B3] # WHITE-FEATHERED RIGHTWARDS ARROW 27B4 ; [*0A0D.0020.0002.27B4] # BLACK-FEATHERED SOUTH EAST ARROW 27B5 ; [*0A0E.0020.0002.27B5] # BLACK-FEATHERED RIGHTWARDS ARROW 27B6 ; [*0A0F.0020.0002.27B6] # BLACK-FEATHERED NORTH EAST ARROW 27B7 ; [*0A10.0020.0002.27B7] # HEAVY BLACK-FEATHERED SOUTH EAST ARROW 27B8 ; [*0A11.0020.0002.27B8] # HEAVY BLACK-FEATHERED RIGHTWARDS ARROW 27B9 ; [*0A12.0020.0002.27B9] # HEAVY BLACK-FEATHERED NORTH EAST ARROW 27BA ; [*0A13.0020.0002.27BA] # TEARDROP-BARBED RIGHTWARDS ARROW 27BB ; [*0A14.0020.0002.27BB] # HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW 27BC ; [*0A15.0020.0002.27BC] # WEDGE-TAILED RIGHTWARDS ARROW 27BD ; [*0A16.0020.0002.27BD] # HEAVY WEDGE-TAILED RIGHTWARDS ARROW 27BE ; [*0A17.0020.0002.27BE] # OPEN-OUTLINED RIGHTWARDS ARROW 27BF ; [*0A18.0020.0002.27BF] # DOUBLE CURLY LOOP 27C0 ; [*0A19.0020.0002.27C0] # THREE DIMENSIONAL ANGLE 27C1 ; [*0A1A.0020.0002.27C1] # WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE 27C2 ; [*0A1B.0020.0002.27C2] # PERPENDICULAR 27C3 ; [*0A1C.0020.0002.27C3] # OPEN SUBSET 27C4 ; [*0A1D.0020.0002.27C4] # OPEN SUPERSET 27C5 ; [*0321.0020.0002.27C5] # LEFT S-SHAPED BAG DELIMITER 27C6 ; [*0322.0020.0002.27C6] # RIGHT S-SHAPED BAG DELIMITER 27C7 ; [*0A1E.0020.0002.27C7] # OR WITH DOT INSIDE 27C8 ; [*0A1F.0020.0002.27C8] # REVERSE SOLIDUS PRECEDING SUBSET 27C9 ; [*0A20.0020.0002.27C9] # SUPERSET PRECEDING SOLIDUS 27CA ; [*0A21.0020.0002.27CA] # VERTICAL BAR WITH HORIZONTAL STROKE 27CB ; [*0A22.0020.0002.27CB] # MATHEMATICAL RISING DIAGONAL 27CC ; [*0A23.0020.0002.27CC] # LONG DIVISION 27CD ; [*0A24.0020.0002.27CD] # MATHEMATICAL FALLING DIAGONAL 27CE ; [*0A25.0020.0002.27CE] # SQUARED LOGICAL AND 27CF ; [*0A26.0020.0002.27CF] # SQUARED LOGICAL OR 27D0 ; [*0A27.0020.0002.27D0] # WHITE DIAMOND WITH CENTRED DOT 27D1 ; [*0A28.0020.0002.27D1] # AND WITH DOT 27D2 ; [*0A29.0020.0002.27D2] # ELEMENT OF OPENING UPWARDS 27D3 ; [*0A2A.0020.0002.27D3] # LOWER RIGHT CORNER WITH DOT 27D4 ; [*0A2B.0020.0002.27D4] # UPPER LEFT CORNER WITH DOT 27D5 ; [*0A2C.0020.0002.27D5] # LEFT OUTER JOIN 27D6 ; [*0A2D.0020.0002.27D6] # RIGHT OUTER JOIN 27D7 ; [*0A2E.0020.0002.27D7] # FULL OUTER JOIN 27D8 ; [*0A2F.0020.0002.27D8] # LARGE UP TACK 27D9 ; [*0A30.0020.0002.27D9] # LARGE DOWN TACK 27DA ; [*0A31.0020.0002.27DA] # LEFT AND RIGHT DOUBLE TURNSTILE 27DB ; [*0A32.0020.0002.27DB] # LEFT AND RIGHT TACK 27DC ; [*0A33.0020.0002.27DC] # LEFT MULTIMAP 27DD ; [*0A34.0020.0002.27DD] # LONG RIGHT TACK 27DE ; [*0A35.0020.0002.27DE] # LONG LEFT TACK 27DF ; [*0A36.0020.0002.27DF] # UP TACK WITH CIRCLE ABOVE 27E0 ; [*0A37.0020.0002.27E0] # LOZENGE DIVIDED BY HORIZONTAL RULE 27E1 ; [*0A38.0020.0002.27E1] # WHITE CONCAVE-SIDED DIAMOND 27E2 ; [*0A39.0020.0002.27E2] # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK 27E3 ; [*0A3A.0020.0002.27E3] # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK 27E4 ; [*0A3B.0020.0002.27E4] # WHITE SQUARE WITH LEFTWARDS TICK 27E5 ; [*0A3C.0020.0002.27E5] # WHITE SQUARE WITH RIGHTWARDS TICK 27E6 ; [*0323.0020.0002.27E6] # MATHEMATICAL LEFT WHITE SQUARE BRACKET 27E7 ; [*0324.0020.0002.27E7] # MATHEMATICAL RIGHT WHITE SQUARE BRACKET 27E8 ; [*0325.0020.0002.27E8] # MATHEMATICAL LEFT ANGLE BRACKET 27E9 ; [*0326.0020.0002.27E9] # MATHEMATICAL RIGHT ANGLE BRACKET 27EA ; [*0327.0020.0002.27EA] # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET 27EB ; [*0328.0020.0002.27EB] # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET 27EC ; [*0329.0020.0002.27EC] # MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET 27ED ; [*032A.0020.0002.27ED] # MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET 27EE ; [*032B.0020.0002.27EE] # MATHEMATICAL LEFT FLATTENED PARENTHESIS 27EF ; [*032C.0020.0002.27EF] # MATHEMATICAL RIGHT FLATTENED PARENTHESIS 27F0 ; [*0A3D.0020.0002.27F0] # UPWARDS QUADRUPLE ARROW 27F1 ; [*0A3E.0020.0002.27F1] # DOWNWARDS QUADRUPLE ARROW 27F2 ; [*0A3F.0020.0002.27F2] # ANTICLOCKWISE GAPPED CIRCLE ARROW 27F3 ; [*0A40.0020.0002.27F3] # CLOCKWISE GAPPED CIRCLE ARROW 27F4 ; [*0A41.0020.0002.27F4] # RIGHT ARROW WITH CIRCLED PLUS 27F5 ; [*0A42.0020.0002.27F5] # LONG LEFTWARDS ARROW 27F6 ; [*0A43.0020.0002.27F6] # LONG RIGHTWARDS ARROW 27F7 ; [*0A44.0020.0002.27F7] # LONG LEFT RIGHT ARROW 27F8 ; [*0A45.0020.0002.27F8] # LONG LEFTWARDS DOUBLE ARROW 27F9 ; [*0A46.0020.0002.27F9] # LONG RIGHTWARDS DOUBLE ARROW 27FA ; [*0A47.0020.0002.27FA] # LONG LEFT RIGHT DOUBLE ARROW 27FB ; [*0A48.0020.0002.27FB] # LONG LEFTWARDS ARROW FROM BAR 27FC ; [*0A49.0020.0002.27FC] # LONG RIGHTWARDS ARROW FROM BAR 27FD ; [*0A4A.0020.0002.27FD] # LONG LEFTWARDS DOUBLE ARROW FROM BAR 27FE ; [*0A4B.0020.0002.27FE] # LONG RIGHTWARDS DOUBLE ARROW FROM BAR 27FF ; [*0A4C.0020.0002.27FF] # LONG RIGHTWARDS SQUIGGLE ARROW 2800 ; [*0C89.0020.0002.2800] # BRAILLE PATTERN BLANK 2801 ; [*0C8A.0020.0002.2801] # BRAILLE PATTERN DOTS-1 2802 ; [*0C8B.0020.0002.2802] # BRAILLE PATTERN DOTS-2 2803 ; [*0C8C.0020.0002.2803] # BRAILLE PATTERN DOTS-12 2804 ; [*0C8D.0020.0002.2804] # BRAILLE PATTERN DOTS-3 2805 ; [*0C8E.0020.0002.2805] # BRAILLE PATTERN DOTS-13 2806 ; [*0C8F.0020.0002.2806] # BRAILLE PATTERN DOTS-23 2807 ; [*0C90.0020.0002.2807] # BRAILLE PATTERN DOTS-123 2808 ; [*0C91.0020.0002.2808] # BRAILLE PATTERN DOTS-4 2809 ; [*0C92.0020.0002.2809] # BRAILLE PATTERN DOTS-14 280A ; [*0C93.0020.0002.280A] # BRAILLE PATTERN DOTS-24 280B ; [*0C94.0020.0002.280B] # BRAILLE PATTERN DOTS-124 280C ; [*0C95.0020.0002.280C] # BRAILLE PATTERN DOTS-34 280D ; [*0C96.0020.0002.280D] # BRAILLE PATTERN DOTS-134 280E ; [*0C97.0020.0002.280E] # BRAILLE PATTERN DOTS-234 280F ; [*0C98.0020.0002.280F] # BRAILLE PATTERN DOTS-1234 2810 ; [*0C99.0020.0002.2810] # BRAILLE PATTERN DOTS-5 2811 ; [*0C9A.0020.0002.2811] # BRAILLE PATTERN DOTS-15 2812 ; [*0C9B.0020.0002.2812] # BRAILLE PATTERN DOTS-25 2813 ; [*0C9C.0020.0002.2813] # BRAILLE PATTERN DOTS-125 2814 ; [*0C9D.0020.0002.2814] # BRAILLE PATTERN DOTS-35 2815 ; [*0C9E.0020.0002.2815] # BRAILLE PATTERN DOTS-135 2816 ; [*0C9F.0020.0002.2816] # BRAILLE PATTERN DOTS-235 2817 ; [*0CA0.0020.0002.2817] # BRAILLE PATTERN DOTS-1235 2818 ; [*0CA1.0020.0002.2818] # BRAILLE PATTERN DOTS-45 2819 ; [*0CA2.0020.0002.2819] # BRAILLE PATTERN DOTS-145 281A ; [*0CA3.0020.0002.281A] # BRAILLE PATTERN DOTS-245 281B ; [*0CA4.0020.0002.281B] # BRAILLE PATTERN DOTS-1245 281C ; [*0CA5.0020.0002.281C] # BRAILLE PATTERN DOTS-345 281D ; [*0CA6.0020.0002.281D] # BRAILLE PATTERN DOTS-1345 281E ; [*0CA7.0020.0002.281E] # BRAILLE PATTERN DOTS-2345 281F ; [*0CA8.0020.0002.281F] # BRAILLE PATTERN DOTS-12345 2820 ; [*0CA9.0020.0002.2820] # BRAILLE PATTERN DOTS-6 2821 ; [*0CAA.0020.0002.2821] # BRAILLE PATTERN DOTS-16 2822 ; [*0CAB.0020.0002.2822] # BRAILLE PATTERN DOTS-26 2823 ; [*0CAC.0020.0002.2823] # BRAILLE PATTERN DOTS-126 2824 ; [*0CAD.0020.0002.2824] # BRAILLE PATTERN DOTS-36 2825 ; [*0CAE.0020.0002.2825] # BRAILLE PATTERN DOTS-136 2826 ; [*0CAF.0020.0002.2826] # BRAILLE PATTERN DOTS-236 2827 ; [*0CB0.0020.0002.2827] # BRAILLE PATTERN DOTS-1236 2828 ; [*0CB1.0020.0002.2828] # BRAILLE PATTERN DOTS-46 2829 ; [*0CB2.0020.0002.2829] # BRAILLE PATTERN DOTS-146 282A ; [*0CB3.0020.0002.282A] # BRAILLE PATTERN DOTS-246 282B ; [*0CB4.0020.0002.282B] # BRAILLE PATTERN DOTS-1246 282C ; [*0CB5.0020.0002.282C] # BRAILLE PATTERN DOTS-346 282D ; [*0CB6.0020.0002.282D] # BRAILLE PATTERN DOTS-1346 282E ; [*0CB7.0020.0002.282E] # BRAILLE PATTERN DOTS-2346 282F ; [*0CB8.0020.0002.282F] # BRAILLE PATTERN DOTS-12346 2830 ; [*0CB9.0020.0002.2830] # BRAILLE PATTERN DOTS-56 2831 ; [*0CBA.0020.0002.2831] # BRAILLE PATTERN DOTS-156 2832 ; [*0CBB.0020.0002.2832] # BRAILLE PATTERN DOTS-256 2833 ; [*0CBC.0020.0002.2833] # BRAILLE PATTERN DOTS-1256 2834 ; [*0CBD.0020.0002.2834] # BRAILLE PATTERN DOTS-356 2835 ; [*0CBE.0020.0002.2835] # BRAILLE PATTERN DOTS-1356 2836 ; [*0CBF.0020.0002.2836] # BRAILLE PATTERN DOTS-2356 2837 ; [*0CC0.0020.0002.2837] # BRAILLE PATTERN DOTS-12356 2838 ; [*0CC1.0020.0002.2838] # BRAILLE PATTERN DOTS-456 2839 ; [*0CC2.0020.0002.2839] # BRAILLE PATTERN DOTS-1456 283A ; [*0CC3.0020.0002.283A] # BRAILLE PATTERN DOTS-2456 283B ; [*0CC4.0020.0002.283B] # BRAILLE PATTERN DOTS-12456 283C ; [*0CC5.0020.0002.283C] # BRAILLE PATTERN DOTS-3456 283D ; [*0CC6.0020.0002.283D] # BRAILLE PATTERN DOTS-13456 283E ; [*0CC7.0020.0002.283E] # BRAILLE PATTERN DOTS-23456 283F ; [*0CC8.0020.0002.283F] # BRAILLE PATTERN DOTS-123456 2840 ; [*0CC9.0020.0002.2840] # BRAILLE PATTERN DOTS-7 2841 ; [*0CCA.0020.0002.2841] # BRAILLE PATTERN DOTS-17 2842 ; [*0CCB.0020.0002.2842] # BRAILLE PATTERN DOTS-27 2843 ; [*0CCC.0020.0002.2843] # BRAILLE PATTERN DOTS-127 2844 ; [*0CCD.0020.0002.2844] # BRAILLE PATTERN DOTS-37 2845 ; [*0CCE.0020.0002.2845] # BRAILLE PATTERN DOTS-137 2846 ; [*0CCF.0020.0002.2846] # BRAILLE PATTERN DOTS-237 2847 ; [*0CD0.0020.0002.2847] # BRAILLE PATTERN DOTS-1237 2848 ; [*0CD1.0020.0002.2848] # BRAILLE PATTERN DOTS-47 2849 ; [*0CD2.0020.0002.2849] # BRAILLE PATTERN DOTS-147 284A ; [*0CD3.0020.0002.284A] # BRAILLE PATTERN DOTS-247 284B ; [*0CD4.0020.0002.284B] # BRAILLE PATTERN DOTS-1247 284C ; [*0CD5.0020.0002.284C] # BRAILLE PATTERN DOTS-347 284D ; [*0CD6.0020.0002.284D] # BRAILLE PATTERN DOTS-1347 284E ; [*0CD7.0020.0002.284E] # BRAILLE PATTERN DOTS-2347 284F ; [*0CD8.0020.0002.284F] # BRAILLE PATTERN DOTS-12347 2850 ; [*0CD9.0020.0002.2850] # BRAILLE PATTERN DOTS-57 2851 ; [*0CDA.0020.0002.2851] # BRAILLE PATTERN DOTS-157 2852 ; [*0CDB.0020.0002.2852] # BRAILLE PATTERN DOTS-257 2853 ; [*0CDC.0020.0002.2853] # BRAILLE PATTERN DOTS-1257 2854 ; [*0CDD.0020.0002.2854] # BRAILLE PATTERN DOTS-357 2855 ; [*0CDE.0020.0002.2855] # BRAILLE PATTERN DOTS-1357 2856 ; [*0CDF.0020.0002.2856] # BRAILLE PATTERN DOTS-2357 2857 ; [*0CE0.0020.0002.2857] # BRAILLE PATTERN DOTS-12357 2858 ; [*0CE1.0020.0002.2858] # BRAILLE PATTERN DOTS-457 2859 ; [*0CE2.0020.0002.2859] # BRAILLE PATTERN DOTS-1457 285A ; [*0CE3.0020.0002.285A] # BRAILLE PATTERN DOTS-2457 285B ; [*0CE4.0020.0002.285B] # BRAILLE PATTERN DOTS-12457 285C ; [*0CE5.0020.0002.285C] # BRAILLE PATTERN DOTS-3457 285D ; [*0CE6.0020.0002.285D] # BRAILLE PATTERN DOTS-13457 285E ; [*0CE7.0020.0002.285E] # BRAILLE PATTERN DOTS-23457 285F ; [*0CE8.0020.0002.285F] # BRAILLE PATTERN DOTS-123457 2860 ; [*0CE9.0020.0002.2860] # BRAILLE PATTERN DOTS-67 2861 ; [*0CEA.0020.0002.2861] # BRAILLE PATTERN DOTS-167 2862 ; [*0CEB.0020.0002.2862] # BRAILLE PATTERN DOTS-267 2863 ; [*0CEC.0020.0002.2863] # BRAILLE PATTERN DOTS-1267 2864 ; [*0CED.0020.0002.2864] # BRAILLE PATTERN DOTS-367 2865 ; [*0CEE.0020.0002.2865] # BRAILLE PATTERN DOTS-1367 2866 ; [*0CEF.0020.0002.2866] # BRAILLE PATTERN DOTS-2367 2867 ; [*0CF0.0020.0002.2867] # BRAILLE PATTERN DOTS-12367 2868 ; [*0CF1.0020.0002.2868] # BRAILLE PATTERN DOTS-467 2869 ; [*0CF2.0020.0002.2869] # BRAILLE PATTERN DOTS-1467 286A ; [*0CF3.0020.0002.286A] # BRAILLE PATTERN DOTS-2467 286B ; [*0CF4.0020.0002.286B] # BRAILLE PATTERN DOTS-12467 286C ; [*0CF5.0020.0002.286C] # BRAILLE PATTERN DOTS-3467 286D ; [*0CF6.0020.0002.286D] # BRAILLE PATTERN DOTS-13467 286E ; [*0CF7.0020.0002.286E] # BRAILLE PATTERN DOTS-23467 286F ; [*0CF8.0020.0002.286F] # BRAILLE PATTERN DOTS-123467 2870 ; [*0CF9.0020.0002.2870] # BRAILLE PATTERN DOTS-567 2871 ; [*0CFA.0020.0002.2871] # BRAILLE PATTERN DOTS-1567 2872 ; [*0CFB.0020.0002.2872] # BRAILLE PATTERN DOTS-2567 2873 ; [*0CFC.0020.0002.2873] # BRAILLE PATTERN DOTS-12567 2874 ; [*0CFD.0020.0002.2874] # BRAILLE PATTERN DOTS-3567 2875 ; [*0CFE.0020.0002.2875] # BRAILLE PATTERN DOTS-13567 2876 ; [*0CFF.0020.0002.2876] # BRAILLE PATTERN DOTS-23567 2877 ; [*0D00.0020.0002.2877] # BRAILLE PATTERN DOTS-123567 2878 ; [*0D01.0020.0002.2878] # BRAILLE PATTERN DOTS-4567 2879 ; [*0D02.0020.0002.2879] # BRAILLE PATTERN DOTS-14567 287A ; [*0D03.0020.0002.287A] # BRAILLE PATTERN DOTS-24567 287B ; [*0D04.0020.0002.287B] # BRAILLE PATTERN DOTS-124567 287C ; [*0D05.0020.0002.287C] # BRAILLE PATTERN DOTS-34567 287D ; [*0D06.0020.0002.287D] # BRAILLE PATTERN DOTS-134567 287E ; [*0D07.0020.0002.287E] # BRAILLE PATTERN DOTS-234567 287F ; [*0D08.0020.0002.287F] # BRAILLE PATTERN DOTS-1234567 2880 ; [*0D09.0020.0002.2880] # BRAILLE PATTERN DOTS-8 2881 ; [*0D0A.0020.0002.2881] # BRAILLE PATTERN DOTS-18 2882 ; [*0D0B.0020.0002.2882] # BRAILLE PATTERN DOTS-28 2883 ; [*0D0C.0020.0002.2883] # BRAILLE PATTERN DOTS-128 2884 ; [*0D0D.0020.0002.2884] # BRAILLE PATTERN DOTS-38 2885 ; [*0D0E.0020.0002.2885] # BRAILLE PATTERN DOTS-138 2886 ; [*0D0F.0020.0002.2886] # BRAILLE PATTERN DOTS-238 2887 ; [*0D10.0020.0002.2887] # BRAILLE PATTERN DOTS-1238 2888 ; [*0D11.0020.0002.2888] # BRAILLE PATTERN DOTS-48 2889 ; [*0D12.0020.0002.2889] # BRAILLE PATTERN DOTS-148 288A ; [*0D13.0020.0002.288A] # BRAILLE PATTERN DOTS-248 288B ; [*0D14.0020.0002.288B] # BRAILLE PATTERN DOTS-1248 288C ; [*0D15.0020.0002.288C] # BRAILLE PATTERN DOTS-348 288D ; [*0D16.0020.0002.288D] # BRAILLE PATTERN DOTS-1348 288E ; [*0D17.0020.0002.288E] # BRAILLE PATTERN DOTS-2348 288F ; [*0D18.0020.0002.288F] # BRAILLE PATTERN DOTS-12348 2890 ; [*0D19.0020.0002.2890] # BRAILLE PATTERN DOTS-58 2891 ; [*0D1A.0020.0002.2891] # BRAILLE PATTERN DOTS-158 2892 ; [*0D1B.0020.0002.2892] # BRAILLE PATTERN DOTS-258 2893 ; [*0D1C.0020.0002.2893] # BRAILLE PATTERN DOTS-1258 2894 ; [*0D1D.0020.0002.2894] # BRAILLE PATTERN DOTS-358 2895 ; [*0D1E.0020.0002.2895] # BRAILLE PATTERN DOTS-1358 2896 ; [*0D1F.0020.0002.2896] # BRAILLE PATTERN DOTS-2358 2897 ; [*0D20.0020.0002.2897] # BRAILLE PATTERN DOTS-12358 2898 ; [*0D21.0020.0002.2898] # BRAILLE PATTERN DOTS-458 2899 ; [*0D22.0020.0002.2899] # BRAILLE PATTERN DOTS-1458 289A ; [*0D23.0020.0002.289A] # BRAILLE PATTERN DOTS-2458 289B ; [*0D24.0020.0002.289B] # BRAILLE PATTERN DOTS-12458 289C ; [*0D25.0020.0002.289C] # BRAILLE PATTERN DOTS-3458 289D ; [*0D26.0020.0002.289D] # BRAILLE PATTERN DOTS-13458 289E ; [*0D27.0020.0002.289E] # BRAILLE PATTERN DOTS-23458 289F ; [*0D28.0020.0002.289F] # BRAILLE PATTERN DOTS-123458 28A0 ; [*0D29.0020.0002.28A0] # BRAILLE PATTERN DOTS-68 28A1 ; [*0D2A.0020.0002.28A1] # BRAILLE PATTERN DOTS-168 28A2 ; [*0D2B.0020.0002.28A2] # BRAILLE PATTERN DOTS-268 28A3 ; [*0D2C.0020.0002.28A3] # BRAILLE PATTERN DOTS-1268 28A4 ; [*0D2D.0020.0002.28A4] # BRAILLE PATTERN DOTS-368 28A5 ; [*0D2E.0020.0002.28A5] # BRAILLE PATTERN DOTS-1368 28A6 ; [*0D2F.0020.0002.28A6] # BRAILLE PATTERN DOTS-2368 28A7 ; [*0D30.0020.0002.28A7] # BRAILLE PATTERN DOTS-12368 28A8 ; [*0D31.0020.0002.28A8] # BRAILLE PATTERN DOTS-468 28A9 ; [*0D32.0020.0002.28A9] # BRAILLE PATTERN DOTS-1468 28AA ; [*0D33.0020.0002.28AA] # BRAILLE PATTERN DOTS-2468 28AB ; [*0D34.0020.0002.28AB] # BRAILLE PATTERN DOTS-12468 28AC ; [*0D35.0020.0002.28AC] # BRAILLE PATTERN DOTS-3468 28AD ; [*0D36.0020.0002.28AD] # BRAILLE PATTERN DOTS-13468 28AE ; [*0D37.0020.0002.28AE] # BRAILLE PATTERN DOTS-23468 28AF ; [*0D38.0020.0002.28AF] # BRAILLE PATTERN DOTS-123468 28B0 ; [*0D39.0020.0002.28B0] # BRAILLE PATTERN DOTS-568 28B1 ; [*0D3A.0020.0002.28B1] # BRAILLE PATTERN DOTS-1568 28B2 ; [*0D3B.0020.0002.28B2] # BRAILLE PATTERN DOTS-2568 28B3 ; [*0D3C.0020.0002.28B3] # BRAILLE PATTERN DOTS-12568 28B4 ; [*0D3D.0020.0002.28B4] # BRAILLE PATTERN DOTS-3568 28B5 ; [*0D3E.0020.0002.28B5] # BRAILLE PATTERN DOTS-13568 28B6 ; [*0D3F.0020.0002.28B6] # BRAILLE PATTERN DOTS-23568 28B7 ; [*0D40.0020.0002.28B7] # BRAILLE PATTERN DOTS-123568 28B8 ; [*0D41.0020.0002.28B8] # BRAILLE PATTERN DOTS-4568 28B9 ; [*0D42.0020.0002.28B9] # BRAILLE PATTERN DOTS-14568 28BA ; [*0D43.0020.0002.28BA] # BRAILLE PATTERN DOTS-24568 28BB ; [*0D44.0020.0002.28BB] # BRAILLE PATTERN DOTS-124568 28BC ; [*0D45.0020.0002.28BC] # BRAILLE PATTERN DOTS-34568 28BD ; [*0D46.0020.0002.28BD] # BRAILLE PATTERN DOTS-134568 28BE ; [*0D47.0020.0002.28BE] # BRAILLE PATTERN DOTS-234568 28BF ; [*0D48.0020.0002.28BF] # BRAILLE PATTERN DOTS-1234568 28C0 ; [*0D49.0020.0002.28C0] # BRAILLE PATTERN DOTS-78 28C1 ; [*0D4A.0020.0002.28C1] # BRAILLE PATTERN DOTS-178 28C2 ; [*0D4B.0020.0002.28C2] # BRAILLE PATTERN DOTS-278 28C3 ; [*0D4C.0020.0002.28C3] # BRAILLE PATTERN DOTS-1278 28C4 ; [*0D4D.0020.0002.28C4] # BRAILLE PATTERN DOTS-378 28C5 ; [*0D4E.0020.0002.28C5] # BRAILLE PATTERN DOTS-1378 28C6 ; [*0D4F.0020.0002.28C6] # BRAILLE PATTERN DOTS-2378 28C7 ; [*0D50.0020.0002.28C7] # BRAILLE PATTERN DOTS-12378 28C8 ; [*0D51.0020.0002.28C8] # BRAILLE PATTERN DOTS-478 28C9 ; [*0D52.0020.0002.28C9] # BRAILLE PATTERN DOTS-1478 28CA ; [*0D53.0020.0002.28CA] # BRAILLE PATTERN DOTS-2478 28CB ; [*0D54.0020.0002.28CB] # BRAILLE PATTERN DOTS-12478 28CC ; [*0D55.0020.0002.28CC] # BRAILLE PATTERN DOTS-3478 28CD ; [*0D56.0020.0002.28CD] # BRAILLE PATTERN DOTS-13478 28CE ; [*0D57.0020.0002.28CE] # BRAILLE PATTERN DOTS-23478 28CF ; [*0D58.0020.0002.28CF] # BRAILLE PATTERN DOTS-123478 28D0 ; [*0D59.0020.0002.28D0] # BRAILLE PATTERN DOTS-578 28D1 ; [*0D5A.0020.0002.28D1] # BRAILLE PATTERN DOTS-1578 28D2 ; [*0D5B.0020.0002.28D2] # BRAILLE PATTERN DOTS-2578 28D3 ; [*0D5C.0020.0002.28D3] # BRAILLE PATTERN DOTS-12578 28D4 ; [*0D5D.0020.0002.28D4] # BRAILLE PATTERN DOTS-3578 28D5 ; [*0D5E.0020.0002.28D5] # BRAILLE PATTERN DOTS-13578 28D6 ; [*0D5F.0020.0002.28D6] # BRAILLE PATTERN DOTS-23578 28D7 ; [*0D60.0020.0002.28D7] # BRAILLE PATTERN DOTS-123578 28D8 ; [*0D61.0020.0002.28D8] # BRAILLE PATTERN DOTS-4578 28D9 ; [*0D62.0020.0002.28D9] # BRAILLE PATTERN DOTS-14578 28DA ; [*0D63.0020.0002.28DA] # BRAILLE PATTERN DOTS-24578 28DB ; [*0D64.0020.0002.28DB] # BRAILLE PATTERN DOTS-124578 28DC ; [*0D65.0020.0002.28DC] # BRAILLE PATTERN DOTS-34578 28DD ; [*0D66.0020.0002.28DD] # BRAILLE PATTERN DOTS-134578 28DE ; [*0D67.0020.0002.28DE] # BRAILLE PATTERN DOTS-234578 28DF ; [*0D68.0020.0002.28DF] # BRAILLE PATTERN DOTS-1234578 28E0 ; [*0D69.0020.0002.28E0] # BRAILLE PATTERN DOTS-678 28E1 ; [*0D6A.0020.0002.28E1] # BRAILLE PATTERN DOTS-1678 28E2 ; [*0D6B.0020.0002.28E2] # BRAILLE PATTERN DOTS-2678 28E3 ; [*0D6C.0020.0002.28E3] # BRAILLE PATTERN DOTS-12678 28E4 ; [*0D6D.0020.0002.28E4] # BRAILLE PATTERN DOTS-3678 28E5 ; [*0D6E.0020.0002.28E5] # BRAILLE PATTERN DOTS-13678 28E6 ; [*0D6F.0020.0002.28E6] # BRAILLE PATTERN DOTS-23678 28E7 ; [*0D70.0020.0002.28E7] # BRAILLE PATTERN DOTS-123678 28E8 ; [*0D71.0020.0002.28E8] # BRAILLE PATTERN DOTS-4678 28E9 ; [*0D72.0020.0002.28E9] # BRAILLE PATTERN DOTS-14678 28EA ; [*0D73.0020.0002.28EA] # BRAILLE PATTERN DOTS-24678 28EB ; [*0D74.0020.0002.28EB] # BRAILLE PATTERN DOTS-124678 28EC ; [*0D75.0020.0002.28EC] # BRAILLE PATTERN DOTS-34678 28ED ; [*0D76.0020.0002.28ED] # BRAILLE PATTERN DOTS-134678 28EE ; [*0D77.0020.0002.28EE] # BRAILLE PATTERN DOTS-234678 28EF ; [*0D78.0020.0002.28EF] # BRAILLE PATTERN DOTS-1234678 28F0 ; [*0D79.0020.0002.28F0] # BRAILLE PATTERN DOTS-5678 28F1 ; [*0D7A.0020.0002.28F1] # BRAILLE PATTERN DOTS-15678 28F2 ; [*0D7B.0020.0002.28F2] # BRAILLE PATTERN DOTS-25678 28F3 ; [*0D7C.0020.0002.28F3] # BRAILLE PATTERN DOTS-125678 28F4 ; [*0D7D.0020.0002.28F4] # BRAILLE PATTERN DOTS-35678 28F5 ; [*0D7E.0020.0002.28F5] # BRAILLE PATTERN DOTS-135678 28F6 ; [*0D7F.0020.0002.28F6] # BRAILLE PATTERN DOTS-235678 28F7 ; [*0D80.0020.0002.28F7] # BRAILLE PATTERN DOTS-1235678 28F8 ; [*0D81.0020.0002.28F8] # BRAILLE PATTERN DOTS-45678 28F9 ; [*0D82.0020.0002.28F9] # BRAILLE PATTERN DOTS-145678 28FA ; [*0D83.0020.0002.28FA] # BRAILLE PATTERN DOTS-245678 28FB ; [*0D84.0020.0002.28FB] # BRAILLE PATTERN DOTS-1245678 28FC ; [*0D85.0020.0002.28FC] # BRAILLE PATTERN DOTS-345678 28FD ; [*0D86.0020.0002.28FD] # BRAILLE PATTERN DOTS-1345678 28FE ; [*0D87.0020.0002.28FE] # BRAILLE PATTERN DOTS-2345678 28FF ; [*0D88.0020.0002.28FF] # BRAILLE PATTERN DOTS-12345678 2900 ; [*0A4D.0020.0002.2900] # RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE 2901 ; [*0A4E.0020.0002.2901] # RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE 2902 ; [*0A4F.0020.0002.2902] # LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE 2903 ; [*0A50.0020.0002.2903] # RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE 2904 ; [*0A51.0020.0002.2904] # LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE 2905 ; [*0A52.0020.0002.2905] # RIGHTWARDS TWO-HEADED ARROW FROM BAR 2906 ; [*0A53.0020.0002.2906] # LEFTWARDS DOUBLE ARROW FROM BAR 2907 ; [*0A54.0020.0002.2907] # RIGHTWARDS DOUBLE ARROW FROM BAR 2908 ; [*0A55.0020.0002.2908] # DOWNWARDS ARROW WITH HORIZONTAL STROKE 2909 ; [*0A56.0020.0002.2909] # UPWARDS ARROW WITH HORIZONTAL STROKE 290A ; [*0A57.0020.0002.290A] # UPWARDS TRIPLE ARROW 290B ; [*0A58.0020.0002.290B] # DOWNWARDS TRIPLE ARROW 290C ; [*0A59.0020.0002.290C] # LEFTWARDS DOUBLE DASH ARROW 290D ; [*0A5A.0020.0002.290D] # RIGHTWARDS DOUBLE DASH ARROW 290E ; [*0A5B.0020.0002.290E] # LEFTWARDS TRIPLE DASH ARROW 290F ; [*0A5C.0020.0002.290F] # RIGHTWARDS TRIPLE DASH ARROW 2910 ; [*0A5D.0020.0002.2910] # RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW 2911 ; [*0A5E.0020.0002.2911] # RIGHTWARDS ARROW WITH DOTTED STEM 2912 ; [*0A5F.0020.0002.2912] # UPWARDS ARROW TO BAR 2913 ; [*0A60.0020.0002.2913] # DOWNWARDS ARROW TO BAR 2914 ; [*0A61.0020.0002.2914] # RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE 2915 ; [*0A62.0020.0002.2915] # RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE 2916 ; [*0A63.0020.0002.2916] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL 2917 ; [*0A64.0020.0002.2917] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE 2918 ; [*0A65.0020.0002.2918] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE 2919 ; [*0A66.0020.0002.2919] # LEFTWARDS ARROW-TAIL 291A ; [*0A67.0020.0002.291A] # RIGHTWARDS ARROW-TAIL 291B ; [*0A68.0020.0002.291B] # LEFTWARDS DOUBLE ARROW-TAIL 291C ; [*0A69.0020.0002.291C] # RIGHTWARDS DOUBLE ARROW-TAIL 291D ; [*0A6A.0020.0002.291D] # LEFTWARDS ARROW TO BLACK DIAMOND 291E ; [*0A6B.0020.0002.291E] # RIGHTWARDS ARROW TO BLACK DIAMOND 291F ; [*0A6C.0020.0002.291F] # LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND 2920 ; [*0A6D.0020.0002.2920] # RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND 2921 ; [*0A6E.0020.0002.2921] # NORTH WEST AND SOUTH EAST ARROW 2922 ; [*0A6F.0020.0002.2922] # NORTH EAST AND SOUTH WEST ARROW 2923 ; [*0A70.0020.0002.2923] # NORTH WEST ARROW WITH HOOK 2924 ; [*0A71.0020.0002.2924] # NORTH EAST ARROW WITH HOOK 2925 ; [*0A72.0020.0002.2925] # SOUTH EAST ARROW WITH HOOK 2926 ; [*0A73.0020.0002.2926] # SOUTH WEST ARROW WITH HOOK 2927 ; [*0A74.0020.0002.2927] # NORTH WEST ARROW AND NORTH EAST ARROW 2928 ; [*0A75.0020.0002.2928] # NORTH EAST ARROW AND SOUTH EAST ARROW 2929 ; [*0A76.0020.0002.2929] # SOUTH EAST ARROW AND SOUTH WEST ARROW 292A ; [*0A77.0020.0002.292A] # SOUTH WEST ARROW AND NORTH WEST ARROW 292B ; [*0A78.0020.0002.292B] # RISING DIAGONAL CROSSING FALLING DIAGONAL 292C ; [*0A79.0020.0002.292C] # FALLING DIAGONAL CROSSING RISING DIAGONAL 292D ; [*0A7A.0020.0002.292D] # SOUTH EAST ARROW CROSSING NORTH EAST ARROW 292E ; [*0A7B.0020.0002.292E] # NORTH EAST ARROW CROSSING SOUTH EAST ARROW 292F ; [*0A7C.0020.0002.292F] # FALLING DIAGONAL CROSSING NORTH EAST ARROW 2930 ; [*0A7D.0020.0002.2930] # RISING DIAGONAL CROSSING SOUTH EAST ARROW 2931 ; [*0A7E.0020.0002.2931] # NORTH EAST ARROW CROSSING NORTH WEST ARROW 2932 ; [*0A7F.0020.0002.2932] # NORTH WEST ARROW CROSSING NORTH EAST ARROW 2933 ; [*0A80.0020.0002.2933] # WAVE ARROW POINTING DIRECTLY RIGHT 2934 ; [*0A81.0020.0002.2934] # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS 2935 ; [*0A82.0020.0002.2935] # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS 2936 ; [*0A83.0020.0002.2936] # ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS 2937 ; [*0A84.0020.0002.2937] # ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS 2938 ; [*0A85.0020.0002.2938] # RIGHT-SIDE ARC CLOCKWISE ARROW 2939 ; [*0A86.0020.0002.2939] # LEFT-SIDE ARC ANTICLOCKWISE ARROW 293A ; [*0A87.0020.0002.293A] # TOP ARC ANTICLOCKWISE ARROW 293B ; [*0A88.0020.0002.293B] # BOTTOM ARC ANTICLOCKWISE ARROW 293C ; [*0A89.0020.0002.293C] # TOP ARC CLOCKWISE ARROW WITH MINUS 293D ; [*0A8A.0020.0002.293D] # TOP ARC ANTICLOCKWISE ARROW WITH PLUS 293E ; [*0A8B.0020.0002.293E] # LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW 293F ; [*0A8C.0020.0002.293F] # LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW 2940 ; [*0A8D.0020.0002.2940] # ANTICLOCKWISE CLOSED CIRCLE ARROW 2941 ; [*0A8E.0020.0002.2941] # CLOCKWISE CLOSED CIRCLE ARROW 2942 ; [*0A8F.0020.0002.2942] # RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW 2943 ; [*0A90.0020.0002.2943] # LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW 2944 ; [*0A91.0020.0002.2944] # SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW 2945 ; [*0A92.0020.0002.2945] # RIGHTWARDS ARROW WITH PLUS BELOW 2946 ; [*0A93.0020.0002.2946] # LEFTWARDS ARROW WITH PLUS BELOW 2947 ; [*0A94.0020.0002.2947] # RIGHTWARDS ARROW THROUGH X 2948 ; [*0A95.0020.0002.2948] # LEFT RIGHT ARROW THROUGH SMALL CIRCLE 2949 ; [*0A96.0020.0002.2949] # UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE 294A ; [*0A97.0020.0002.294A] # LEFT BARB UP RIGHT BARB DOWN HARPOON 294B ; [*0A98.0020.0002.294B] # LEFT BARB DOWN RIGHT BARB UP HARPOON 294C ; [*0A99.0020.0002.294C] # UP BARB RIGHT DOWN BARB LEFT HARPOON 294D ; [*0A9A.0020.0002.294D] # UP BARB LEFT DOWN BARB RIGHT HARPOON 294E ; [*0A9B.0020.0002.294E] # LEFT BARB UP RIGHT BARB UP HARPOON 294F ; [*0A9C.0020.0002.294F] # UP BARB RIGHT DOWN BARB RIGHT HARPOON 2950 ; [*0A9D.0020.0002.2950] # LEFT BARB DOWN RIGHT BARB DOWN HARPOON 2951 ; [*0A9E.0020.0002.2951] # UP BARB LEFT DOWN BARB LEFT HARPOON 2952 ; [*0A9F.0020.0002.2952] # LEFTWARDS HARPOON WITH BARB UP TO BAR 2953 ; [*0AA0.0020.0002.2953] # RIGHTWARDS HARPOON WITH BARB UP TO BAR 2954 ; [*0AA1.0020.0002.2954] # UPWARDS HARPOON WITH BARB RIGHT TO BAR 2955 ; [*0AA2.0020.0002.2955] # DOWNWARDS HARPOON WITH BARB RIGHT TO BAR 2956 ; [*0AA3.0020.0002.2956] # LEFTWARDS HARPOON WITH BARB DOWN TO BAR 2957 ; [*0AA4.0020.0002.2957] # RIGHTWARDS HARPOON WITH BARB DOWN TO BAR 2958 ; [*0AA5.0020.0002.2958] # UPWARDS HARPOON WITH BARB LEFT TO BAR 2959 ; [*0AA6.0020.0002.2959] # DOWNWARDS HARPOON WITH BARB LEFT TO BAR 295A ; [*0AA7.0020.0002.295A] # LEFTWARDS HARPOON WITH BARB UP FROM BAR 295B ; [*0AA8.0020.0002.295B] # RIGHTWARDS HARPOON WITH BARB UP FROM BAR 295C ; [*0AA9.0020.0002.295C] # UPWARDS HARPOON WITH BARB RIGHT FROM BAR 295D ; [*0AAA.0020.0002.295D] # DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR 295E ; [*0AAB.0020.0002.295E] # LEFTWARDS HARPOON WITH BARB DOWN FROM BAR 295F ; [*0AAC.0020.0002.295F] # RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR 2960 ; [*0AAD.0020.0002.2960] # UPWARDS HARPOON WITH BARB LEFT FROM BAR 2961 ; [*0AAE.0020.0002.2961] # DOWNWARDS HARPOON WITH BARB LEFT FROM BAR 2962 ; [*0AAF.0020.0002.2962] # LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN 2963 ; [*0AB0.0020.0002.2963] # UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT 2964 ; [*0AB1.0020.0002.2964] # RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN 2965 ; [*0AB2.0020.0002.2965] # DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT 2966 ; [*0AB3.0020.0002.2966] # LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP 2967 ; [*0AB4.0020.0002.2967] # LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN 2968 ; [*0AB5.0020.0002.2968] # RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP 2969 ; [*0AB6.0020.0002.2969] # RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN 296A ; [*0AB7.0020.0002.296A] # LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH 296B ; [*0AB8.0020.0002.296B] # LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH 296C ; [*0AB9.0020.0002.296C] # RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH 296D ; [*0ABA.0020.0002.296D] # RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH 296E ; [*0ABB.0020.0002.296E] # UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT 296F ; [*0ABC.0020.0002.296F] # DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT 2970 ; [*0ABD.0020.0002.2970] # RIGHT DOUBLE ARROW WITH ROUNDED HEAD 2971 ; [*0ABE.0020.0002.2971] # EQUALS SIGN ABOVE RIGHTWARDS ARROW 2972 ; [*0ABF.0020.0002.2972] # TILDE OPERATOR ABOVE RIGHTWARDS ARROW 2973 ; [*0AC0.0020.0002.2973] # LEFTWARDS ARROW ABOVE TILDE OPERATOR 2974 ; [*0AC1.0020.0002.2974] # RIGHTWARDS ARROW ABOVE TILDE OPERATOR 2975 ; [*0AC2.0020.0002.2975] # RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO 2976 ; [*0AC3.0020.0002.2976] # LESS-THAN ABOVE LEFTWARDS ARROW 2977 ; [*0AC4.0020.0002.2977] # LEFTWARDS ARROW THROUGH LESS-THAN 2978 ; [*0AC5.0020.0002.2978] # GREATER-THAN ABOVE RIGHTWARDS ARROW 2979 ; [*0AC6.0020.0002.2979] # SUBSET ABOVE RIGHTWARDS ARROW 297A ; [*0AC7.0020.0002.297A] # LEFTWARDS ARROW THROUGH SUBSET 297B ; [*0AC8.0020.0002.297B] # SUPERSET ABOVE LEFTWARDS ARROW 297C ; [*0AC9.0020.0002.297C] # LEFT FISH TAIL 297D ; [*0ACA.0020.0002.297D] # RIGHT FISH TAIL 297E ; [*0ACB.0020.0002.297E] # UP FISH TAIL 297F ; [*0ACC.0020.0002.297F] # DOWN FISH TAIL 2980 ; [*0ACD.0020.0002.2980] # TRIPLE VERTICAL BAR DELIMITER 2981 ; [*0ACE.0020.0002.2981] # Z NOTATION SPOT 2982 ; [*0ACF.0020.0002.2982] # Z NOTATION TYPE COLON 2983 ; [*030B.0020.0002.2983] # LEFT WHITE CURLY BRACKET 2984 ; [*030C.0020.0002.2984] # RIGHT WHITE CURLY BRACKET 2985 ; [*030D.0020.0002.2985] # LEFT WHITE PARENTHESIS 2986 ; [*030E.0020.0002.2986] # RIGHT WHITE PARENTHESIS 2987 ; [*030F.0020.0002.2987] # Z NOTATION LEFT IMAGE BRACKET 2988 ; [*0310.0020.0002.2988] # Z NOTATION RIGHT IMAGE BRACKET 2989 ; [*0311.0020.0002.2989] # Z NOTATION LEFT BINDING BRACKET 298A ; [*0312.0020.0002.298A] # Z NOTATION RIGHT BINDING BRACKET 298B ; [*0313.0020.0002.298B] # LEFT SQUARE BRACKET WITH UNDERBAR 298C ; [*0314.0020.0002.298C] # RIGHT SQUARE BRACKET WITH UNDERBAR 298D ; [*0315.0020.0002.298D] # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER 298E ; [*0316.0020.0002.298E] # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER 298F ; [*0317.0020.0002.298F] # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER 2990 ; [*0318.0020.0002.2990] # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER 2991 ; [*0319.0020.0002.2991] # LEFT ANGLE BRACKET WITH DOT 2992 ; [*031A.0020.0002.2992] # RIGHT ANGLE BRACKET WITH DOT 2993 ; [*031B.0020.0002.2993] # LEFT ARC LESS-THAN BRACKET 2994 ; [*031C.0020.0002.2994] # RIGHT ARC GREATER-THAN BRACKET 2995 ; [*031D.0020.0002.2995] # DOUBLE LEFT ARC GREATER-THAN BRACKET 2996 ; [*031E.0020.0002.2996] # DOUBLE RIGHT ARC LESS-THAN BRACKET 2997 ; [*031F.0020.0002.2997] # LEFT BLACK TORTOISE SHELL BRACKET 2998 ; [*0320.0020.0002.2998] # RIGHT BLACK TORTOISE SHELL BRACKET 2999 ; [*0AD0.0020.0002.2999] # DOTTED FENCE 299A ; [*0AD1.0020.0002.299A] # VERTICAL ZIGZAG LINE 299B ; [*0AD2.0020.0002.299B] # MEASURED ANGLE OPENING LEFT 299C ; [*0AD3.0020.0002.299C] # RIGHT ANGLE VARIANT WITH SQUARE 299D ; [*0AD4.0020.0002.299D] # MEASURED RIGHT ANGLE WITH DOT 299E ; [*0AD5.0020.0002.299E] # ANGLE WITH S INSIDE 299F ; [*0AD6.0020.0002.299F] # ACUTE ANGLE 29A0 ; [*0AD7.0020.0002.29A0] # SPHERICAL ANGLE OPENING LEFT 29A1 ; [*0AD8.0020.0002.29A1] # SPHERICAL ANGLE OPENING UP 29A2 ; [*0AD9.0020.0002.29A2] # TURNED ANGLE 29A3 ; [*0ADA.0020.0002.29A3] # REVERSED ANGLE 29A4 ; [*0ADB.0020.0002.29A4] # ANGLE WITH UNDERBAR 29A5 ; [*0ADC.0020.0002.29A5] # REVERSED ANGLE WITH UNDERBAR 29A6 ; [*0ADD.0020.0002.29A6] # OBLIQUE ANGLE OPENING UP 29A7 ; [*0ADE.0020.0002.29A7] # OBLIQUE ANGLE OPENING DOWN 29A8 ; [*0ADF.0020.0002.29A8] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT 29A9 ; [*0AE0.0020.0002.29A9] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT 29AA ; [*0AE1.0020.0002.29AA] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT 29AB ; [*0AE2.0020.0002.29AB] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT 29AC ; [*0AE3.0020.0002.29AC] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP 29AD ; [*0AE4.0020.0002.29AD] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP 29AE ; [*0AE5.0020.0002.29AE] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN 29AF ; [*0AE6.0020.0002.29AF] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN 29B0 ; [*0AE7.0020.0002.29B0] # REVERSED EMPTY SET 29B1 ; [*0AE8.0020.0002.29B1] # EMPTY SET WITH OVERBAR 29B2 ; [*0AE9.0020.0002.29B2] # EMPTY SET WITH SMALL CIRCLE ABOVE 29B3 ; [*0AEA.0020.0002.29B3] # EMPTY SET WITH RIGHT ARROW ABOVE 29B4 ; [*0AEB.0020.0002.29B4] # EMPTY SET WITH LEFT ARROW ABOVE 29B5 ; [*0AEC.0020.0002.29B5] # CIRCLE WITH HORIZONTAL BAR 29B6 ; [*0AED.0020.0002.29B6] # CIRCLED VERTICAL BAR 29B7 ; [*0AEE.0020.0002.29B7] # CIRCLED PARALLEL 29B8 ; [*0AEF.0020.0002.29B8] # CIRCLED REVERSE SOLIDUS 29B9 ; [*0AF0.0020.0002.29B9] # CIRCLED PERPENDICULAR 29BA ; [*0AF1.0020.0002.29BA] # CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR 29BB ; [*0AF2.0020.0002.29BB] # CIRCLE WITH SUPERIMPOSED X 29BC ; [*0AF3.0020.0002.29BC] # CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN 29BD ; [*0AF4.0020.0002.29BD] # UP ARROW THROUGH CIRCLE 29BE ; [*0AF5.0020.0002.29BE] # CIRCLED WHITE BULLET 29BF ; [*0AF6.0020.0002.29BF] # CIRCLED BULLET 29C0 ; [*0AF7.0020.0002.29C0] # CIRCLED LESS-THAN 29C1 ; [*0AF8.0020.0002.29C1] # CIRCLED GREATER-THAN 29C2 ; [*0AF9.0020.0002.29C2] # CIRCLE WITH SMALL CIRCLE TO THE RIGHT 29C3 ; [*0AFA.0020.0002.29C3] # CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT 29C4 ; [*0AFB.0020.0002.29C4] # SQUARED RISING DIAGONAL SLASH 29C5 ; [*0AFC.0020.0002.29C5] # SQUARED FALLING DIAGONAL SLASH 29C6 ; [*0AFD.0020.0002.29C6] # SQUARED ASTERISK 29C7 ; [*0AFE.0020.0002.29C7] # SQUARED SMALL CIRCLE 29C8 ; [*0AFF.0020.0002.29C8] # SQUARED SQUARE 29C9 ; [*0B00.0020.0002.29C9] # TWO JOINED SQUARES 29CA ; [*0B01.0020.0002.29CA] # TRIANGLE WITH DOT ABOVE 29CB ; [*0B02.0020.0002.29CB] # TRIANGLE WITH UNDERBAR 29CC ; [*0B03.0020.0002.29CC] # S IN TRIANGLE 29CD ; [*0B04.0020.0002.29CD] # TRIANGLE WITH SERIFS AT BOTTOM 29CE ; [*0B05.0020.0002.29CE] # RIGHT TRIANGLE ABOVE LEFT TRIANGLE 29CF ; [*0B06.0020.0002.29CF] # LEFT TRIANGLE BESIDE VERTICAL BAR 29D0 ; [*0B07.0020.0002.29D0] # VERTICAL BAR BESIDE RIGHT TRIANGLE 29D1 ; [*0B08.0020.0002.29D1] # BOWTIE WITH LEFT HALF BLACK 29D2 ; [*0B09.0020.0002.29D2] # BOWTIE WITH RIGHT HALF BLACK 29D3 ; [*0B0A.0020.0002.29D3] # BLACK BOWTIE 29D4 ; [*0B0B.0020.0002.29D4] # TIMES WITH LEFT HALF BLACK 29D5 ; [*0B0C.0020.0002.29D5] # TIMES WITH RIGHT HALF BLACK 29D6 ; [*0B0D.0020.0002.29D6] # WHITE HOURGLASS 29D7 ; [*0B0E.0020.0002.29D7] # BLACK HOURGLASS 29D8 ; [*0364.0020.0002.29D8] # LEFT WIGGLY FENCE 29D9 ; [*0365.0020.0002.29D9] # RIGHT WIGGLY FENCE 29DA ; [*0366.0020.0002.29DA] # LEFT DOUBLE WIGGLY FENCE 29DB ; [*0367.0020.0002.29DB] # RIGHT DOUBLE WIGGLY FENCE 29DC ; [*0B0F.0020.0002.29DC] # INCOMPLETE INFINITY 29DD ; [*0B10.0020.0002.29DD] # TIE OVER INFINITY 29DE ; [*0B11.0020.0002.29DE] # INFINITY NEGATED WITH VERTICAL BAR 29DF ; [*0B12.0020.0002.29DF] # DOUBLE-ENDED MULTIMAP 29E0 ; [*0B13.0020.0002.29E0] # SQUARE WITH CONTOURED OUTLINE 29E1 ; [*0B14.0020.0002.29E1] # INCREASES AS 29E2 ; [*0B15.0020.0002.29E2] # SHUFFLE PRODUCT 29E3 ; [*0B16.0020.0002.29E3] # EQUALS SIGN AND SLANTED PARALLEL 29E4 ; [*0B17.0020.0002.29E4] # EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE 29E5 ; [*0B18.0020.0002.29E5] # IDENTICAL TO AND SLANTED PARALLEL 29E6 ; [*0B19.0020.0002.29E6] # GLEICH STARK 29E7 ; [*0B1A.0020.0002.29E7] # THERMODYNAMIC 29E8 ; [*0B1B.0020.0002.29E8] # DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK 29E9 ; [*0B1C.0020.0002.29E9] # DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK 29EA ; [*0B1D.0020.0002.29EA] # BLACK DIAMOND WITH DOWN ARROW 29EB ; [*0B1E.0020.0002.29EB] # BLACK LOZENGE 29EC ; [*0B1F.0020.0002.29EC] # WHITE CIRCLE WITH DOWN ARROW 29ED ; [*0B20.0020.0002.29ED] # BLACK CIRCLE WITH DOWN ARROW 29EE ; [*0B21.0020.0002.29EE] # ERROR-BARRED WHITE SQUARE 29EF ; [*0B22.0020.0002.29EF] # ERROR-BARRED BLACK SQUARE 29F0 ; [*0B23.0020.0002.29F0] # ERROR-BARRED WHITE DIAMOND 29F1 ; [*0B24.0020.0002.29F1] # ERROR-BARRED BLACK DIAMOND 29F2 ; [*0B25.0020.0002.29F2] # ERROR-BARRED WHITE CIRCLE 29F3 ; [*0B26.0020.0002.29F3] # ERROR-BARRED BLACK CIRCLE 29F4 ; [*0B27.0020.0002.29F4] # RULE-DELAYED 29F5 ; [*0B28.0020.0002.29F5] # REVERSE SOLIDUS OPERATOR 29F6 ; [*0B29.0020.0002.29F6] # SOLIDUS WITH OVERBAR 29F7 ; [*0B2A.0020.0002.29F7] # REVERSE SOLIDUS WITH HORIZONTAL STROKE 29F8 ; [*0B2B.0020.0002.29F8] # BIG SOLIDUS 29F9 ; [*0B2C.0020.0002.29F9] # BIG REVERSE SOLIDUS 29FA ; [*0B2D.0020.0002.29FA] # DOUBLE PLUS 29FB ; [*0B2E.0020.0002.29FB] # TRIPLE PLUS 29FC ; [*0309.0020.0002.29FC] # LEFT-POINTING CURVED ANGLE BRACKET 29FD ; [*030A.0020.0002.29FD] # RIGHT-POINTING CURVED ANGLE BRACKET 29FE ; [*0B2F.0020.0002.29FE] # TINY 29FF ; [*0B30.0020.0002.29FF] # MINY 2A00 ; [*0B31.0020.0002.2A00] # N-ARY CIRCLED DOT OPERATOR 2A01 ; [*0B32.0020.0002.2A01] # N-ARY CIRCLED PLUS OPERATOR 2A02 ; [*0B33.0020.0002.2A02] # N-ARY CIRCLED TIMES OPERATOR 2A03 ; [*0B34.0020.0002.2A03] # N-ARY UNION OPERATOR WITH DOT 2A04 ; [*0B35.0020.0002.2A04] # N-ARY UNION OPERATOR WITH PLUS 2A05 ; [*0B36.0020.0002.2A05] # N-ARY SQUARE INTERSECTION OPERATOR 2A06 ; [*0B37.0020.0002.2A06] # N-ARY SQUARE UNION OPERATOR 2A07 ; [*0B38.0020.0002.2A07] # TWO LOGICAL AND OPERATOR 2A08 ; [*0B39.0020.0002.2A08] # TWO LOGICAL OR OPERATOR 2A09 ; [*0B3A.0020.0002.2A09] # N-ARY TIMES OPERATOR 2A0A ; [*0B3B.0020.0002.2A0A] # MODULO TWO SUM 2A0B ; [*0B3C.0020.0002.2A0B] # SUMMATION WITH INTEGRAL 2A0C ; [*05C2.0020.0004.2A0C][*05C2.0020.0004.2A0C][*05C2.0020.001F.2A0C][*05C2.0020.001F.2A0C] # QUADRUPLE INTEGRAL OPERATOR 2A0D ; [*0B3D.0020.0002.2A0D] # FINITE PART INTEGRAL 2A0E ; [*0B3E.0020.0002.2A0E] # INTEGRAL WITH DOUBLE STROKE 2A0F ; [*0B3F.0020.0002.2A0F] # INTEGRAL AVERAGE WITH SLASH 2A10 ; [*0B40.0020.0002.2A10] # CIRCULATION FUNCTION 2A11 ; [*0B41.0020.0002.2A11] # ANTICLOCKWISE INTEGRATION 2A12 ; [*0B42.0020.0002.2A12] # LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE 2A13 ; [*0B43.0020.0002.2A13] # LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE 2A14 ; [*0B44.0020.0002.2A14] # LINE INTEGRATION NOT INCLUDING THE POLE 2A15 ; [*0B45.0020.0002.2A15] # INTEGRAL AROUND A POINT OPERATOR 2A16 ; [*0B46.0020.0002.2A16] # QUATERNION INTEGRAL OPERATOR 2A17 ; [*0B47.0020.0002.2A17] # INTEGRAL WITH LEFTWARDS ARROW WITH HOOK 2A18 ; [*0B48.0020.0002.2A18] # INTEGRAL WITH TIMES SIGN 2A19 ; [*0B49.0020.0002.2A19] # INTEGRAL WITH INTERSECTION 2A1A ; [*0B4A.0020.0002.2A1A] # INTEGRAL WITH UNION 2A1B ; [*0B4B.0020.0002.2A1B] # INTEGRAL WITH OVERBAR 2A1C ; [*0B4C.0020.0002.2A1C] # INTEGRAL WITH UNDERBAR 2A1D ; [*0B4D.0020.0002.2A1D] # JOIN 2A1E ; [*0B4E.0020.0002.2A1E] # LARGE LEFT TRIANGLE OPERATOR 2A1F ; [*0B4F.0020.0002.2A1F] # Z NOTATION SCHEMA COMPOSITION 2A20 ; [*0B50.0020.0002.2A20] # Z NOTATION SCHEMA PIPING 2A21 ; [*0B51.0020.0002.2A21] # Z NOTATION SCHEMA PROJECTION 2A22 ; [*0B52.0020.0002.2A22] # PLUS SIGN WITH SMALL CIRCLE ABOVE 2A23 ; [*0B53.0020.0002.2A23] # PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE 2A24 ; [*0B54.0020.0002.2A24] # PLUS SIGN WITH TILDE ABOVE 2A25 ; [*0B55.0020.0002.2A25] # PLUS SIGN WITH DOT BELOW 2A26 ; [*0B56.0020.0002.2A26] # PLUS SIGN WITH TILDE BELOW 2A27 ; [*0B57.0020.0002.2A27] # PLUS SIGN WITH SUBSCRIPT TWO 2A28 ; [*0B58.0020.0002.2A28] # PLUS SIGN WITH BLACK TRIANGLE 2A29 ; [*0B59.0020.0002.2A29] # MINUS SIGN WITH COMMA ABOVE 2A2A ; [*0B5A.0020.0002.2A2A] # MINUS SIGN WITH DOT BELOW 2A2B ; [*0B5B.0020.0002.2A2B] # MINUS SIGN WITH FALLING DOTS 2A2C ; [*0B5C.0020.0002.2A2C] # MINUS SIGN WITH RISING DOTS 2A2D ; [*0B5D.0020.0002.2A2D] # PLUS SIGN IN LEFT HALF CIRCLE 2A2E ; [*0B5E.0020.0002.2A2E] # PLUS SIGN IN RIGHT HALF CIRCLE 2A2F ; [*0B5F.0020.0002.2A2F] # VECTOR OR CROSS PRODUCT 2A30 ; [*0B60.0020.0002.2A30] # MULTIPLICATION SIGN WITH DOT ABOVE 2A31 ; [*0B61.0020.0002.2A31] # MULTIPLICATION SIGN WITH UNDERBAR 2A32 ; [*0B62.0020.0002.2A32] # SEMIDIRECT PRODUCT WITH BOTTOM CLOSED 2A33 ; [*0B63.0020.0002.2A33] # SMASH PRODUCT 2A34 ; [*0B64.0020.0002.2A34] # MULTIPLICATION SIGN IN LEFT HALF CIRCLE 2A35 ; [*0B65.0020.0002.2A35] # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE 2A36 ; [*0B66.0020.0002.2A36] # CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT 2A37 ; [*0B67.0020.0002.2A37] # MULTIPLICATION SIGN IN DOUBLE CIRCLE 2A38 ; [*0B68.0020.0002.2A38] # CIRCLED DIVISION SIGN 2A39 ; [*0B69.0020.0002.2A39] # PLUS SIGN IN TRIANGLE 2A3A ; [*0B6A.0020.0002.2A3A] # MINUS SIGN IN TRIANGLE 2A3B ; [*0B6B.0020.0002.2A3B] # MULTIPLICATION SIGN IN TRIANGLE 2A3C ; [*0B6C.0020.0002.2A3C] # INTERIOR PRODUCT 2A3D ; [*0B6D.0020.0002.2A3D] # RIGHTHAND INTERIOR PRODUCT 2A3E ; [*0B6E.0020.0002.2A3E] # Z NOTATION RELATIONAL COMPOSITION 2A3F ; [*0B6F.0020.0002.2A3F] # AMALGAMATION OR COPRODUCT 2A40 ; [*0B70.0020.0002.2A40] # INTERSECTION WITH DOT 2A41 ; [*0B71.0020.0002.2A41] # UNION WITH MINUS SIGN 2A42 ; [*0B72.0020.0002.2A42] # UNION WITH OVERBAR 2A43 ; [*0B73.0020.0002.2A43] # INTERSECTION WITH OVERBAR 2A44 ; [*0B74.0020.0002.2A44] # INTERSECTION WITH LOGICAL AND 2A45 ; [*0B75.0020.0002.2A45] # UNION WITH LOGICAL OR 2A46 ; [*0B76.0020.0002.2A46] # UNION ABOVE INTERSECTION 2A47 ; [*0B77.0020.0002.2A47] # INTERSECTION ABOVE UNION 2A48 ; [*0B78.0020.0002.2A48] # UNION ABOVE BAR ABOVE INTERSECTION 2A49 ; [*0B79.0020.0002.2A49] # INTERSECTION ABOVE BAR ABOVE UNION 2A4A ; [*0B7A.0020.0002.2A4A] # UNION BESIDE AND JOINED WITH UNION 2A4B ; [*0B7B.0020.0002.2A4B] # INTERSECTION BESIDE AND JOINED WITH INTERSECTION 2A4C ; [*0B7C.0020.0002.2A4C] # CLOSED UNION WITH SERIFS 2A4D ; [*0B7D.0020.0002.2A4D] # CLOSED INTERSECTION WITH SERIFS 2A4E ; [*0B7E.0020.0002.2A4E] # DOUBLE SQUARE INTERSECTION 2A4F ; [*0B7F.0020.0002.2A4F] # DOUBLE SQUARE UNION 2A50 ; [*0B80.0020.0002.2A50] # CLOSED UNION WITH SERIFS AND SMASH PRODUCT 2A51 ; [*0B81.0020.0002.2A51] # LOGICAL AND WITH DOT ABOVE 2A52 ; [*0B82.0020.0002.2A52] # LOGICAL OR WITH DOT ABOVE 2A53 ; [*0B83.0020.0002.2A53] # DOUBLE LOGICAL AND 2A54 ; [*0B84.0020.0002.2A54] # DOUBLE LOGICAL OR 2A55 ; [*0B85.0020.0002.2A55] # TWO INTERSECTING LOGICAL AND 2A56 ; [*0B86.0020.0002.2A56] # TWO INTERSECTING LOGICAL OR 2A57 ; [*0B87.0020.0002.2A57] # SLOPING LARGE OR 2A58 ; [*0B88.0020.0002.2A58] # SLOPING LARGE AND 2A59 ; [*0B89.0020.0002.2A59] # LOGICAL OR OVERLAPPING LOGICAL AND 2A5A ; [*0B8A.0020.0002.2A5A] # LOGICAL AND WITH MIDDLE STEM 2A5B ; [*0B8B.0020.0002.2A5B] # LOGICAL OR WITH MIDDLE STEM 2A5C ; [*0B8C.0020.0002.2A5C] # LOGICAL AND WITH HORIZONTAL DASH 2A5D ; [*0B8D.0020.0002.2A5D] # LOGICAL OR WITH HORIZONTAL DASH 2A5E ; [*0B8E.0020.0002.2A5E] # LOGICAL AND WITH DOUBLE OVERBAR 2A5F ; [*0B8F.0020.0002.2A5F] # LOGICAL AND WITH UNDERBAR 2A60 ; [*0B90.0020.0002.2A60] # LOGICAL AND WITH DOUBLE UNDERBAR 2A61 ; [*0B91.0020.0002.2A61] # SMALL VEE WITH UNDERBAR 2A62 ; [*0B92.0020.0002.2A62] # LOGICAL OR WITH DOUBLE OVERBAR 2A63 ; [*0B93.0020.0002.2A63] # LOGICAL OR WITH DOUBLE UNDERBAR 2A64 ; [*0B94.0020.0002.2A64] # Z NOTATION DOMAIN ANTIRESTRICTION 2A65 ; [*0B95.0020.0002.2A65] # Z NOTATION RANGE ANTIRESTRICTION 2A66 ; [*0B96.0020.0002.2A66] # EQUALS SIGN WITH DOT BELOW 2A67 ; [*0B97.0020.0002.2A67] # IDENTICAL WITH DOT ABOVE 2A68 ; [*0B98.0020.0002.2A68] # TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE 2A69 ; [*0B99.0020.0002.2A69] # TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE 2A6A ; [*0B9A.0020.0002.2A6A] # TILDE OPERATOR WITH DOT ABOVE 2A6B ; [*0B9B.0020.0002.2A6B] # TILDE OPERATOR WITH RISING DOTS 2A6C ; [*0B9C.0020.0002.2A6C] # SIMILAR MINUS SIMILAR 2A6D ; [*0B9D.0020.0002.2A6D] # CONGRUENT WITH DOT ABOVE 2A6E ; [*0B9E.0020.0002.2A6E] # EQUALS WITH ASTERISK 2A6F ; [*0B9F.0020.0002.2A6F] # ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT 2A70 ; [*0BA0.0020.0002.2A70] # APPROXIMATELY EQUAL OR EQUAL TO 2A71 ; [*0BA1.0020.0002.2A71] # EQUALS SIGN ABOVE PLUS SIGN 2A72 ; [*0BA2.0020.0002.2A72] # PLUS SIGN ABOVE EQUALS SIGN 2A73 ; [*0BA3.0020.0002.2A73] # EQUALS SIGN ABOVE TILDE OPERATOR 2A74 ; [*0237.0020.0004.2A74][*0237.0020.0004.2A74][*05A1.0020.001F.2A74] # DOUBLE COLON EQUAL 2A75 ; [*05A1.0020.0004.2A75][*05A1.0020.0004.2A75] # TWO CONSECUTIVE EQUALS SIGNS 2A76 ; [*05A1.0020.0004.2A76][*05A1.0020.0004.2A76][*05A1.0020.001F.2A76] # THREE CONSECUTIVE EQUALS SIGNS 2A77 ; [*0BA4.0020.0002.2A77] # EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW 2A78 ; [*0BA5.0020.0002.2A78] # EQUIVALENT WITH FOUR DOTS ABOVE 2A79 ; [*0BA6.0020.0002.2A79] # LESS-THAN WITH CIRCLE INSIDE 2A7A ; [*0BA7.0020.0002.2A7A] # GREATER-THAN WITH CIRCLE INSIDE 2A7B ; [*0BA8.0020.0002.2A7B] # LESS-THAN WITH QUESTION MARK ABOVE 2A7C ; [*0BA9.0020.0002.2A7C] # GREATER-THAN WITH QUESTION MARK ABOVE 2A7D ; [*0BAA.0020.0002.2A7D] # LESS-THAN OR SLANTED EQUAL TO 2A7E ; [*0BAB.0020.0002.2A7E] # GREATER-THAN OR SLANTED EQUAL TO 2A7F ; [*0BAC.0020.0002.2A7F] # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE 2A80 ; [*0BAD.0020.0002.2A80] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE 2A81 ; [*0BAE.0020.0002.2A81] # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE 2A82 ; [*0BAF.0020.0002.2A82] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE 2A83 ; [*0BB0.0020.0002.2A83] # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT 2A84 ; [*0BB1.0020.0002.2A84] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT 2A85 ; [*0BB2.0020.0002.2A85] # LESS-THAN OR APPROXIMATE 2A86 ; [*0BB3.0020.0002.2A86] # GREATER-THAN OR APPROXIMATE 2A87 ; [*0BB4.0020.0002.2A87] # LESS-THAN AND SINGLE-LINE NOT EQUAL TO 2A88 ; [*0BB5.0020.0002.2A88] # GREATER-THAN AND SINGLE-LINE NOT EQUAL TO 2A89 ; [*0BB6.0020.0002.2A89] # LESS-THAN AND NOT APPROXIMATE 2A8A ; [*0BB7.0020.0002.2A8A] # GREATER-THAN AND NOT APPROXIMATE 2A8B ; [*0BB8.0020.0002.2A8B] # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN 2A8C ; [*0BB9.0020.0002.2A8C] # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN 2A8D ; [*0BBA.0020.0002.2A8D] # LESS-THAN ABOVE SIMILAR OR EQUAL 2A8E ; [*0BBB.0020.0002.2A8E] # GREATER-THAN ABOVE SIMILAR OR EQUAL 2A8F ; [*0BBC.0020.0002.2A8F] # LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN 2A90 ; [*0BBD.0020.0002.2A90] # GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN 2A91 ; [*0BBE.0020.0002.2A91] # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL 2A92 ; [*0BBF.0020.0002.2A92] # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL 2A93 ; [*0BC0.0020.0002.2A93] # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL 2A94 ; [*0BC1.0020.0002.2A94] # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL 2A95 ; [*0BC2.0020.0002.2A95] # SLANTED EQUAL TO OR LESS-THAN 2A96 ; [*0BC3.0020.0002.2A96] # SLANTED EQUAL TO OR GREATER-THAN 2A97 ; [*0BC4.0020.0002.2A97] # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE 2A98 ; [*0BC5.0020.0002.2A98] # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE 2A99 ; [*0BC6.0020.0002.2A99] # DOUBLE-LINE EQUAL TO OR LESS-THAN 2A9A ; [*0BC7.0020.0002.2A9A] # DOUBLE-LINE EQUAL TO OR GREATER-THAN 2A9B ; [*0BC8.0020.0002.2A9B] # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN 2A9C ; [*0BC9.0020.0002.2A9C] # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN 2A9D ; [*0BCA.0020.0002.2A9D] # SIMILAR OR LESS-THAN 2A9E ; [*0BCB.0020.0002.2A9E] # SIMILAR OR GREATER-THAN 2A9F ; [*0BCC.0020.0002.2A9F] # SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN 2AA0 ; [*0BCD.0020.0002.2AA0] # SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN 2AA1 ; [*0BCE.0020.0002.2AA1] # DOUBLE NESTED LESS-THAN 2AA2 ; [*0BCF.0020.0002.2AA2] # DOUBLE NESTED GREATER-THAN 2AA3 ; [*0BD0.0020.0002.2AA3] # DOUBLE NESTED LESS-THAN WITH UNDERBAR 2AA4 ; [*0BD1.0020.0002.2AA4] # GREATER-THAN OVERLAPPING LESS-THAN 2AA5 ; [*0BD2.0020.0002.2AA5] # GREATER-THAN BESIDE LESS-THAN 2AA6 ; [*0BD3.0020.0002.2AA6] # LESS-THAN CLOSED BY CURVE 2AA7 ; [*0BD4.0020.0002.2AA7] # GREATER-THAN CLOSED BY CURVE 2AA8 ; [*0BD5.0020.0002.2AA8] # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL 2AA9 ; [*0BD6.0020.0002.2AA9] # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL 2AAA ; [*0BD7.0020.0002.2AAA] # SMALLER THAN 2AAB ; [*0BD8.0020.0002.2AAB] # LARGER THAN 2AAC ; [*0BD9.0020.0002.2AAC] # SMALLER THAN OR EQUAL TO 2AAD ; [*0BDA.0020.0002.2AAD] # LARGER THAN OR EQUAL TO 2AAE ; [*0BDB.0020.0002.2AAE] # EQUALS SIGN WITH BUMPY ABOVE 2AAF ; [*0BDC.0020.0002.2AAF] # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN 2AB0 ; [*0BDD.0020.0002.2AB0] # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN 2AB1 ; [*0BDE.0020.0002.2AB1] # PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO 2AB2 ; [*0BDF.0020.0002.2AB2] # SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO 2AB3 ; [*0BE0.0020.0002.2AB3] # PRECEDES ABOVE EQUALS SIGN 2AB4 ; [*0BE1.0020.0002.2AB4] # SUCCEEDS ABOVE EQUALS SIGN 2AB5 ; [*0BE2.0020.0002.2AB5] # PRECEDES ABOVE NOT EQUAL TO 2AB6 ; [*0BE3.0020.0002.2AB6] # SUCCEEDS ABOVE NOT EQUAL TO 2AB7 ; [*0BE4.0020.0002.2AB7] # PRECEDES ABOVE ALMOST EQUAL TO 2AB8 ; [*0BE5.0020.0002.2AB8] # SUCCEEDS ABOVE ALMOST EQUAL TO 2AB9 ; [*0BE6.0020.0002.2AB9] # PRECEDES ABOVE NOT ALMOST EQUAL TO 2ABA ; [*0BE7.0020.0002.2ABA] # SUCCEEDS ABOVE NOT ALMOST EQUAL TO 2ABB ; [*0BE8.0020.0002.2ABB] # DOUBLE PRECEDES 2ABC ; [*0BE9.0020.0002.2ABC] # DOUBLE SUCCEEDS 2ABD ; [*0BEA.0020.0002.2ABD] # SUBSET WITH DOT 2ABE ; [*0BEB.0020.0002.2ABE] # SUPERSET WITH DOT 2ABF ; [*0BEC.0020.0002.2ABF] # SUBSET WITH PLUS SIGN BELOW 2AC0 ; [*0BED.0020.0002.2AC0] # SUPERSET WITH PLUS SIGN BELOW 2AC1 ; [*0BEE.0020.0002.2AC1] # SUBSET WITH MULTIPLICATION SIGN BELOW 2AC2 ; [*0BEF.0020.0002.2AC2] # SUPERSET WITH MULTIPLICATION SIGN BELOW 2AC3 ; [*0BF0.0020.0002.2AC3] # SUBSET OF OR EQUAL TO WITH DOT ABOVE 2AC4 ; [*0BF1.0020.0002.2AC4] # SUPERSET OF OR EQUAL TO WITH DOT ABOVE 2AC5 ; [*0BF2.0020.0002.2AC5] # SUBSET OF ABOVE EQUALS SIGN 2AC6 ; [*0BF3.0020.0002.2AC6] # SUPERSET OF ABOVE EQUALS SIGN 2AC7 ; [*0BF4.0020.0002.2AC7] # SUBSET OF ABOVE TILDE OPERATOR 2AC8 ; [*0BF5.0020.0002.2AC8] # SUPERSET OF ABOVE TILDE OPERATOR 2AC9 ; [*0BF6.0020.0002.2AC9] # SUBSET OF ABOVE ALMOST EQUAL TO 2ACA ; [*0BF7.0020.0002.2ACA] # SUPERSET OF ABOVE ALMOST EQUAL TO 2ACB ; [*0BF8.0020.0002.2ACB] # SUBSET OF ABOVE NOT EQUAL TO 2ACC ; [*0BF9.0020.0002.2ACC] # SUPERSET OF ABOVE NOT EQUAL TO 2ACD ; [*0BFA.0020.0002.2ACD] # SQUARE LEFT OPEN BOX OPERATOR 2ACE ; [*0BFB.0020.0002.2ACE] # SQUARE RIGHT OPEN BOX OPERATOR 2ACF ; [*0BFC.0020.0002.2ACF] # CLOSED SUBSET 2AD0 ; [*0BFD.0020.0002.2AD0] # CLOSED SUPERSET 2AD1 ; [*0BFE.0020.0002.2AD1] # CLOSED SUBSET OR EQUAL TO 2AD2 ; [*0BFF.0020.0002.2AD2] # CLOSED SUPERSET OR EQUAL TO 2AD3 ; [*0C00.0020.0002.2AD3] # SUBSET ABOVE SUPERSET 2AD4 ; [*0C01.0020.0002.2AD4] # SUPERSET ABOVE SUBSET 2AD5 ; [*0C02.0020.0002.2AD5] # SUBSET ABOVE SUBSET 2AD6 ; [*0C03.0020.0002.2AD6] # SUPERSET ABOVE SUPERSET 2AD7 ; [*0C04.0020.0002.2AD7] # SUPERSET BESIDE SUBSET 2AD8 ; [*0C05.0020.0002.2AD8] # SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET 2AD9 ; [*0C06.0020.0002.2AD9] # ELEMENT OF OPENING DOWNWARDS 2ADA ; [*0C07.0020.0002.2ADA] # PITCHFORK WITH TEE TOP 2ADB ; [*0C08.0020.0002.2ADB] # TRANSVERSAL INTERSECTION 2ADC ; [*0C09.0020.0002.2ADD][.0000.0054.0002.0338] # FORKING 2ADD ; [*0C09.0020.0002.2ADD] # NONFORKING 2ADE ; [*0C0A.0020.0002.2ADE] # SHORT LEFT TACK 2ADF ; [*0C0B.0020.0002.2ADF] # SHORT DOWN TACK 2AE0 ; [*0C0C.0020.0002.2AE0] # SHORT UP TACK 2AE1 ; [*0C0D.0020.0002.2AE1] # PERPENDICULAR WITH S 2AE2 ; [*0C0E.0020.0002.2AE2] # VERTICAL BAR TRIPLE RIGHT TURNSTILE 2AE3 ; [*0C0F.0020.0002.2AE3] # DOUBLE VERTICAL BAR LEFT TURNSTILE 2AE4 ; [*0C10.0020.0002.2AE4] # VERTICAL BAR DOUBLE LEFT TURNSTILE 2AE5 ; [*0C11.0020.0002.2AE5] # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE 2AE6 ; [*0C12.0020.0002.2AE6] # LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL 2AE7 ; [*0C13.0020.0002.2AE7] # SHORT DOWN TACK WITH OVERBAR 2AE8 ; [*0C14.0020.0002.2AE8] # SHORT UP TACK WITH UNDERBAR 2AE9 ; [*0C15.0020.0002.2AE9] # SHORT UP TACK ABOVE SHORT DOWN TACK 2AEA ; [*0C16.0020.0002.2AEA] # DOUBLE DOWN TACK 2AEB ; [*0C17.0020.0002.2AEB] # DOUBLE UP TACK 2AEC ; [*0C18.0020.0002.2AEC] # DOUBLE STROKE NOT SIGN 2AED ; [*0C19.0020.0002.2AED] # REVERSED DOUBLE STROKE NOT SIGN 2AEE ; [*0C1A.0020.0002.2AEE] # DOES NOT DIVIDE WITH REVERSED NEGATION SLASH 2AEF ; [*0C1B.0020.0002.2AEF] # VERTICAL LINE WITH CIRCLE ABOVE 2AF0 ; [*0C1C.0020.0002.2AF0] # VERTICAL LINE WITH CIRCLE BELOW 2AF1 ; [*0C1D.0020.0002.2AF1] # DOWN TACK WITH CIRCLE BELOW 2AF2 ; [*0C1E.0020.0002.2AF2] # PARALLEL WITH HORIZONTAL STROKE 2AF3 ; [*0C1F.0020.0002.2AF3] # PARALLEL WITH TILDE OPERATOR 2AF4 ; [*0C20.0020.0002.2AF4] # TRIPLE VERTICAL BAR BINARY RELATION 2AF5 ; [*0C21.0020.0002.2AF5] # TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE 2AF6 ; [*0C22.0020.0002.2AF6] # TRIPLE COLON OPERATOR 2AF7 ; [*0C23.0020.0002.2AF7] # TRIPLE NESTED LESS-THAN 2AF8 ; [*0C24.0020.0002.2AF8] # TRIPLE NESTED GREATER-THAN 2AF9 ; [*0C25.0020.0002.2AF9] # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO 2AFA ; [*0C26.0020.0002.2AFA] # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO 2AFB ; [*0C27.0020.0002.2AFB] # TRIPLE SOLIDUS BINARY RELATION 2AFC ; [*0C28.0020.0002.2AFC] # LARGE TRIPLE VERTICAL BAR OPERATOR 2AFD ; [*0C29.0020.0002.2AFD] # DOUBLE SOLIDUS OPERATOR 2AFE ; [*0C2A.0020.0002.2AFE] # WHITE VERTICAL BAR 2AFF ; [*0C2B.0020.0002.2AFF] # N-ARY WHITE VERTICAL BAR 2B00 ; [*0C2C.0020.0002.2B00] # NORTH EAST WHITE ARROW 2B01 ; [*0C2D.0020.0002.2B01] # NORTH WEST WHITE ARROW 2B02 ; [*0C2E.0020.0002.2B02] # SOUTH EAST WHITE ARROW 2B03 ; [*0C2F.0020.0002.2B03] # SOUTH WEST WHITE ARROW 2B04 ; [*0C30.0020.0002.2B04] # LEFT RIGHT WHITE ARROW 2B05 ; [*0C31.0020.0002.2B05] # LEFTWARDS BLACK ARROW 2B06 ; [*0C32.0020.0002.2B06] # UPWARDS BLACK ARROW 2B07 ; [*0C33.0020.0002.2B07] # DOWNWARDS BLACK ARROW 2B08 ; [*0C34.0020.0002.2B08] # NORTH EAST BLACK ARROW 2B09 ; [*0C35.0020.0002.2B09] # NORTH WEST BLACK ARROW 2B0A ; [*0C36.0020.0002.2B0A] # SOUTH EAST BLACK ARROW 2B0B ; [*0C37.0020.0002.2B0B] # SOUTH WEST BLACK ARROW 2B0C ; [*0C38.0020.0002.2B0C] # LEFT RIGHT BLACK ARROW 2B0D ; [*0C39.0020.0002.2B0D] # UP DOWN BLACK ARROW 2B0E ; [*0C3A.0020.0002.2B0E] # RIGHTWARDS ARROW WITH TIP DOWNWARDS 2B0F ; [*0C3B.0020.0002.2B0F] # RIGHTWARDS ARROW WITH TIP UPWARDS 2B10 ; [*0C3C.0020.0002.2B10] # LEFTWARDS ARROW WITH TIP DOWNWARDS 2B11 ; [*0C3D.0020.0002.2B11] # LEFTWARDS ARROW WITH TIP UPWARDS 2B12 ; [*0C3E.0020.0002.2B12] # SQUARE WITH TOP HALF BLACK 2B13 ; [*0C3F.0020.0002.2B13] # SQUARE WITH BOTTOM HALF BLACK 2B14 ; [*0C40.0020.0002.2B14] # SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK 2B15 ; [*0C41.0020.0002.2B15] # SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK 2B16 ; [*0C42.0020.0002.2B16] # DIAMOND WITH LEFT HALF BLACK 2B17 ; [*0C43.0020.0002.2B17] # DIAMOND WITH RIGHT HALF BLACK 2B18 ; [*0C44.0020.0002.2B18] # DIAMOND WITH TOP HALF BLACK 2B19 ; [*0C45.0020.0002.2B19] # DIAMOND WITH BOTTOM HALF BLACK 2B1A ; [*0C46.0020.0002.2B1A] # DOTTED SQUARE 2B1B ; [*0C47.0020.0002.2B1B] # BLACK LARGE SQUARE 2B1C ; [*0C48.0020.0002.2B1C] # WHITE LARGE SQUARE 2B1D ; [*0C49.0020.0002.2B1D] # BLACK VERY SMALL SQUARE 2B1E ; [*0C4A.0020.0002.2B1E] # WHITE VERY SMALL SQUARE 2B1F ; [*0C4B.0020.0002.2B1F] # BLACK PENTAGON 2B20 ; [*0C4C.0020.0002.2B20] # WHITE PENTAGON 2B21 ; [*0C4D.0020.0002.2B21] # WHITE HEXAGON 2B22 ; [*0C4E.0020.0002.2B22] # BLACK HEXAGON 2B23 ; [*0C4F.0020.0002.2B23] # HORIZONTAL BLACK HEXAGON 2B24 ; [*0C50.0020.0002.2B24] # BLACK LARGE CIRCLE 2B25 ; [*0C51.0020.0002.2B25] # BLACK MEDIUM DIAMOND 2B26 ; [*0C52.0020.0002.2B26] # WHITE MEDIUM DIAMOND 2B27 ; [*0C53.0020.0002.2B27] # BLACK MEDIUM LOZENGE 2B28 ; [*0C54.0020.0002.2B28] # WHITE MEDIUM LOZENGE 2B29 ; [*0C55.0020.0002.2B29] # BLACK SMALL DIAMOND 2B2A ; [*0C56.0020.0002.2B2A] # BLACK SMALL LOZENGE 2B2B ; [*0C57.0020.0002.2B2B] # WHITE SMALL LOZENGE 2B2C ; [*0C58.0020.0002.2B2C] # BLACK HORIZONTAL ELLIPSE 2B2D ; [*0C59.0020.0002.2B2D] # WHITE HORIZONTAL ELLIPSE 2B2E ; [*0C5A.0020.0002.2B2E] # BLACK VERTICAL ELLIPSE 2B2F ; [*0C5B.0020.0002.2B2F] # WHITE VERTICAL ELLIPSE 2B30 ; [*0C5C.0020.0002.2B30] # LEFT ARROW WITH SMALL CIRCLE 2B31 ; [*0C5D.0020.0002.2B31] # THREE LEFTWARDS ARROWS 2B32 ; [*0C5E.0020.0002.2B32] # LEFT ARROW WITH CIRCLED PLUS 2B33 ; [*0C5F.0020.0002.2B33] # LONG LEFTWARDS SQUIGGLE ARROW 2B34 ; [*0C60.0020.0002.2B34] # LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE 2B35 ; [*0C61.0020.0002.2B35] # LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE 2B36 ; [*0C62.0020.0002.2B36] # LEFTWARDS TWO-HEADED ARROW FROM BAR 2B37 ; [*0C63.0020.0002.2B37] # LEFTWARDS TWO-HEADED TRIPLE DASH ARROW 2B38 ; [*0C64.0020.0002.2B38] # LEFTWARDS ARROW WITH DOTTED STEM 2B39 ; [*0C65.0020.0002.2B39] # LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE 2B3A ; [*0C66.0020.0002.2B3A] # LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE 2B3B ; [*0C67.0020.0002.2B3B] # LEFTWARDS TWO-HEADED ARROW WITH TAIL 2B3C ; [*0C68.0020.0002.2B3C] # LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE 2B3D ; [*0C69.0020.0002.2B3D] # LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE 2B3E ; [*0C6A.0020.0002.2B3E] # LEFTWARDS ARROW THROUGH X 2B3F ; [*0C6B.0020.0002.2B3F] # WAVE ARROW POINTING DIRECTLY LEFT 2B40 ; [*0C6C.0020.0002.2B40] # EQUALS SIGN ABOVE LEFTWARDS ARROW 2B41 ; [*0C6D.0020.0002.2B41] # REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW 2B42 ; [*0C6E.0020.0002.2B42] # LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO 2B43 ; [*0C6F.0020.0002.2B43] # RIGHTWARDS ARROW THROUGH GREATER-THAN 2B44 ; [*0C70.0020.0002.2B44] # RIGHTWARDS ARROW THROUGH SUPERSET 2B45 ; [*0C71.0020.0002.2B45] # LEFTWARDS QUADRUPLE ARROW 2B46 ; [*0C72.0020.0002.2B46] # RIGHTWARDS QUADRUPLE ARROW 2B47 ; [*0C73.0020.0002.2B47] # REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW 2B48 ; [*0C74.0020.0002.2B48] # RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO 2B49 ; [*0C75.0020.0002.2B49] # TILDE OPERATOR ABOVE LEFTWARDS ARROW 2B4A ; [*0C76.0020.0002.2B4A] # LEFTWARDS ARROW ABOVE ALMOST EQUAL TO 2B4B ; [*0C77.0020.0002.2B4B] # LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR 2B4C ; [*0C78.0020.0002.2B4C] # RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR 2B50 ; [*0C79.0020.0002.2B50] # WHITE MEDIUM STAR 2B51 ; [*0C7A.0020.0002.2B51] # BLACK SMALL STAR 2B52 ; [*0C7B.0020.0002.2B52] # WHITE SMALL STAR 2B53 ; [*0C7C.0020.0002.2B53] # BLACK RIGHT-POINTING PENTAGON 2B54 ; [*0C7D.0020.0002.2B54] # WHITE RIGHT-POINTING PENTAGON 2B55 ; [*0C7E.0020.0002.2B55] # HEAVY LARGE CIRCLE 2B56 ; [*0C7F.0020.0002.2B56] # HEAVY OVAL WITH OVAL INSIDE 2B57 ; [*0C80.0020.0002.2B57] # HEAVY CIRCLE WITH CIRCLE INSIDE 2B58 ; [*0C81.0020.0002.2B58] # HEAVY CIRCLE 2B59 ; [*0C82.0020.0002.2B59] # HEAVY CIRCLED SALTIRE 2CE5 ; [*0C83.0020.0002.2CE5] # COPTIC SYMBOL MI RO 2CE6 ; [*0C84.0020.0002.2CE6] # COPTIC SYMBOL PI RO 2CE7 ; [*0C85.0020.0002.2CE7] # COPTIC SYMBOL STAUROS 2CE8 ; [*0C86.0020.0002.2CE8] # COPTIC SYMBOL TAU RO 2CE9 ; [*0C87.0020.0002.2CE9] # COPTIC SYMBOL KHI RO 2CEA ; [*0C88.0020.0002.2CEA] # COPTIC SYMBOL SHIMA SIMA 2CF9 ; [*027D.0020.0002.2CF9] # COPTIC OLD NUBIAN FULL STOP 2CFA ; [*026B.0020.0002.2CFA] # COPTIC OLD NUBIAN DIRECT QUESTION MARK 2CFB ; [*026C.0020.0002.2CFB] # COPTIC OLD NUBIAN INDIRECT QUESTION MARK 2CFC ; [*02DC.0020.0002.2CFC] # COPTIC OLD NUBIAN VERSE DIVIDER 2CFD ; [*1501.0020.0002.2CFD] # COPTIC FRACTION ONE HALF 2CFE ; [*027E.0020.0002.2CFE] # COPTIC FULL STOP 2CFF ; [*02DD.0020.0002.2CFF] # COPTIC MORPHOLOGICAL DIVIDER 2D70 ; [*03F4.0020.0002.2D70] # TIFINAGH SEPARATOR MARK 2D7F ; [.0000.0000.0000.2D7F] # TIFINAGH CONSONANT JOINER 2E00 ; [*0394.0020.0002.2E00] # RIGHT ANGLE SUBSTITUTION MARKER 2E01 ; [*0395.0020.0002.2E01] # RIGHT ANGLE DOTTED SUBSTITUTION MARKER 2E02 ; [*033B.0020.0002.2E02] # LEFT SUBSTITUTION BRACKET 2E03 ; [*033C.0020.0002.2E03] # RIGHT SUBSTITUTION BRACKET 2E04 ; [*033D.0020.0002.2E04] # LEFT DOTTED SUBSTITUTION BRACKET 2E05 ; [*033E.0020.0002.2E05] # RIGHT DOTTED SUBSTITUTION BRACKET 2E06 ; [*0396.0020.0002.2E06] # RAISED INTERPOLATION MARKER 2E07 ; [*0397.0020.0002.2E07] # RAISED DOTTED INTERPOLATION MARKER 2E08 ; [*0398.0020.0002.2E08] # DOTTED TRANSPOSITION MARKER 2E09 ; [*033F.0020.0002.2E09] # LEFT TRANSPOSITION BRACKET 2E0A ; [*0340.0020.0002.2E0A] # RIGHT TRANSPOSITION BRACKET 2E0B ; [*0399.0020.0002.2E0B] # RAISED SQUARE 2E0C ; [*0341.0020.0002.2E0C] # LEFT RAISED OMISSION BRACKET 2E0D ; [*0342.0020.0002.2E0D] # RIGHT RAISED OMISSION BRACKET 2E0E ; [*039A.0020.0002.2E0E] # EDITORIAL CORONIS 2E0F ; [*039B.0020.0002.2E0F] # PARAGRAPHOS 2E10 ; [*039C.0020.0002.2E10] # FORKED PARAGRAPHOS 2E11 ; [*039D.0020.0002.2E11] # REVERSED FORKED PARAGRAPHOS 2E12 ; [*039E.0020.0002.2E12] # HYPODIASTOLE 2E13 ; [*039F.0020.0002.2E13] # DOTTED OBELOS 2E14 ; [*03A0.0020.0002.2E14] # DOWNWARDS ANCORA 2E15 ; [*03A1.0020.0002.2E15] # UPWARDS ANCORA 2E16 ; [*03A2.0020.0002.2E16] # DOTTED RIGHT-POINTING ANGLE 2E17 ; [*021C.0020.0002.2E17] # DOUBLE OBLIQUE HYPHEN 2E18 ; [*0272.0020.0002.2E18] # INVERTED INTERROBANG 2E19 ; [*02DE.0020.0002.2E19] # PALM BRANCH 2E1A ; [*03A3.0020.0002.2E1A] # HYPHEN WITH DIAERESIS 2E1B ; [*03A4.0020.0002.2E1B] # TILDE WITH RING ABOVE 2E1C ; [*0343.0020.0002.2E1C] # LEFT LOW PARAPHRASE BRACKET 2E1D ; [*0344.0020.0002.2E1D] # RIGHT LOW PARAPHRASE BRACKET 2E1E ; [*03A5.0020.0002.2E1E] # TILDE WITH DOT ABOVE 2E1F ; [*03A6.0020.0002.2E1F] # TILDE WITH DOT BELOW 2E20 ; [*0345.0020.0002.2E20] # LEFT VERTICAL BAR WITH QUILL 2E21 ; [*0346.0020.0002.2E21] # RIGHT VERTICAL BAR WITH QUILL 2E22 ; [*0347.0020.0002.2E22] # TOP LEFT HALF BRACKET 2E23 ; [*0348.0020.0002.2E23] # TOP RIGHT HALF BRACKET 2E24 ; [*0349.0020.0002.2E24] # BOTTOM LEFT HALF BRACKET 2E25 ; [*034A.0020.0002.2E25] # BOTTOM RIGHT HALF BRACKET 2E26 ; [*034B.0020.0002.2E26] # LEFT SIDEWAYS U BRACKET 2E27 ; [*034C.0020.0002.2E27] # RIGHT SIDEWAYS U BRACKET 2E28 ; [*034D.0020.0002.2E28] # LEFT DOUBLE PARENTHESIS 2E29 ; [*034E.0020.0002.2E29] # RIGHT DOUBLE PARENTHESIS 2E2A ; [*02D8.0020.0002.2E2A] # TWO DOTS OVER ONE DOT PUNCTUATION 2E2B ; [*02D9.0020.0002.2E2B] # ONE DOT OVER TWO DOTS PUNCTUATION 2E2C ; [*02DA.0020.0002.2E2C] # SQUARED FOUR DOT PUNCTUATION 2E2D ; [*02DB.0020.0002.2E2D] # FIVE DOT MARK 2E2E ; [*0265.0020.0002.2E2E] # REVERSED QUESTION MARK 2E30 ; [*027F.0020.0002.2E30] # RING POINT 2E31 ; [*0285.0020.0002.2E31] # WORD SEPARATOR MIDDLE DOT 2E32 ; [*0223.0020.0002.2E32] # TURNED COMMA 2E33 ; [*0286.0020.0002.2E33] # RAISED DOT 2E34 ; [*0222.0020.0002.2E34] # RAISED COMMA 2E35 ; [*0235.0020.0002.2E35] # TURNED SEMICOLON 2E36 ; [*037F.0020.0002.2E36] # DAGGER WITH LEFT GUARD 2E37 ; [*0380.0020.0002.2E37] # DAGGER WITH RIGHT GUARD 2E38 ; [*0381.0020.0002.2E38] # TURNED DAGGER 2E39 ; [*0369.0020.0002.2E39] # TOP HALF SECTION SIGN 2E3A ; [*0219.0020.0002.2E3A] # TWO-EM DASH 2E3B ; [*021A.0020.0002.2E3B] # THREE-EM DASH 2FF0 ; [*1483.0020.0002.2FF0] # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT 2FF1 ; [*1484.0020.0002.2FF1] # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW 2FF2 ; [*1485.0020.0002.2FF2] # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT 2FF3 ; [*1486.0020.0002.2FF3] # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW 2FF4 ; [*1487.0020.0002.2FF4] # IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND 2FF5 ; [*1488.0020.0002.2FF5] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE 2FF6 ; [*1489.0020.0002.2FF6] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW 2FF7 ; [*148A.0020.0002.2FF7] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT 2FF8 ; [*148B.0020.0002.2FF8] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT 2FF9 ; [*148C.0020.0002.2FF9] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT 2FFA ; [*148D.0020.0002.2FFA] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT 2FFB ; [*148E.0020.0002.2FFB] # IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID 3000 ; [*020A.0020.0003.3000] # IDEOGRAPHIC SPACE 3001 ; [*022F.0020.0002.3001] # IDEOGRAPHIC COMMA 3002 ; [*0283.0020.0002.3002] # IDEOGRAPHIC FULL STOP 3003 ; [*038A.0020.0002.3003] # DITTO MARK 3004 ; [*14B3.0020.0002.3004] # JAPANESE INDUSTRIAL STANDARD SYMBOL 3008 ; [*034F.0020.0002.3008] # LEFT ANGLE BRACKET 3009 ; [*0350.0020.0002.3009] # RIGHT ANGLE BRACKET 300A ; [*0351.0020.0002.300A] # LEFT DOUBLE ANGLE BRACKET 300B ; [*0352.0020.0002.300B] # RIGHT DOUBLE ANGLE BRACKET 300C ; [*0353.0020.0002.300C] # LEFT CORNER BRACKET 300D ; [*0354.0020.0002.300D] # RIGHT CORNER BRACKET 300E ; [*0355.0020.0002.300E] # LEFT WHITE CORNER BRACKET 300F ; [*0356.0020.0002.300F] # RIGHT WHITE CORNER BRACKET 3010 ; [*0357.0020.0002.3010] # LEFT BLACK LENTICULAR BRACKET 3011 ; [*0358.0020.0002.3011] # RIGHT BLACK LENTICULAR BRACKET 3012 ; [*14B4.0020.0002.3012] # POSTAL MARK 3013 ; [*14B5.0020.0002.3013] # GETA MARK 3014 ; [*0359.0020.0002.3014] # LEFT TORTOISE SHELL BRACKET 3015 ; [*035A.0020.0002.3015] # RIGHT TORTOISE SHELL BRACKET 3016 ; [*035B.0020.0002.3016] # LEFT WHITE LENTICULAR BRACKET 3017 ; [*035C.0020.0002.3017] # RIGHT WHITE LENTICULAR BRACKET 3018 ; [*035D.0020.0002.3018] # LEFT WHITE TORTOISE SHELL BRACKET 3019 ; [*035E.0020.0002.3019] # RIGHT WHITE TORTOISE SHELL BRACKET 301A ; [*035F.0020.0002.301A] # LEFT WHITE SQUARE BRACKET 301B ; [*0360.0020.0002.301B] # RIGHT WHITE SQUARE BRACKET 301C ; [*021D.0020.0002.301C] # WAVE DASH 301D ; [*02F6.0020.0002.301D] # REVERSED DOUBLE PRIME QUOTATION MARK 301E ; [*02F7.0020.0002.301E] # DOUBLE PRIME QUOTATION MARK 301F ; [*02F8.0020.0002.301F] # LOW DOUBLE PRIME QUOTATION MARK 3020 ; [*14B6.0020.0002.3020] # POSTAL MARK FACE 3030 ; [*021E.0020.0002.3030] # WAVY DASH 3036 ; [*14B4.0020.0004.3036] # CIRCLED POSTAL MARK 3037 ; [*14B7.0020.0002.3037] # IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL 303D ; [*038B.0020.0002.303D] # PART ALTERNATION MARK 303E ; [*14B8.0020.0002.303E] # IDEOGRAPHIC VARIATION INDICATOR 303F ; [*14B9.0020.0002.303F] # IDEOGRAPHIC HALF FILL SPACE 309B ; [*041E.0020.0002.309B] # KATAKANA-HIRAGANA VOICED SOUND MARK 309C ; [*041F.0020.0002.309C] # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK 30A0 ; [*021F.0020.0002.30A0] # KATAKANA-HIRAGANA DOUBLE HYPHEN 30FB ; [*0220.0020.0002.30FB] # KATAKANA MIDDLE DOT 3190 ; [*14BA.0020.0002.3190] # IDEOGRAPHIC ANNOTATION LINKING MARK 3191 ; [*14BB.0020.0002.3191] # IDEOGRAPHIC ANNOTATION REVERSE MARK 31C0 ; [*148F.0020.0002.31C0] # CJK STROKE T 31C1 ; [*1490.0020.0002.31C1] # CJK STROKE WG 31C2 ; [*1491.0020.0002.31C2] # CJK STROKE XG 31C3 ; [*1492.0020.0002.31C3] # CJK STROKE BXG 31C4 ; [*1493.0020.0002.31C4] # CJK STROKE SW 31C5 ; [*1494.0020.0002.31C5] # CJK STROKE HZZ 31C6 ; [*1495.0020.0002.31C6] # CJK STROKE HZG 31C7 ; [*1496.0020.0002.31C7] # CJK STROKE HP 31C8 ; [*1497.0020.0002.31C8] # CJK STROKE HZWG 31C9 ; [*1498.0020.0002.31C9] # CJK STROKE SZWG 31CA ; [*1499.0020.0002.31CA] # CJK STROKE HZT 31CB ; [*149A.0020.0002.31CB] # CJK STROKE HZZP 31CC ; [*149B.0020.0002.31CC] # CJK STROKE HPWG 31CD ; [*149C.0020.0002.31CD] # CJK STROKE HZW 31CE ; [*149D.0020.0002.31CE] # CJK STROKE HZZZ 31CF ; [*149E.0020.0002.31CF] # CJK STROKE N 31D0 ; [*149F.0020.0002.31D0] # CJK STROKE H 31D1 ; [*14A0.0020.0002.31D1] # CJK STROKE S 31D2 ; [*14A1.0020.0002.31D2] # CJK STROKE P 31D3 ; [*14A2.0020.0002.31D3] # CJK STROKE SP 31D4 ; [*14A3.0020.0002.31D4] # CJK STROKE D 31D5 ; [*14A4.0020.0002.31D5] # CJK STROKE HZ 31D6 ; [*14A5.0020.0002.31D6] # CJK STROKE HG 31D7 ; [*14A6.0020.0002.31D7] # CJK STROKE SZ 31D8 ; [*14A7.0020.0002.31D8] # CJK STROKE SWZ 31D9 ; [*14A8.0020.0002.31D9] # CJK STROKE ST 31DA ; [*14A9.0020.0002.31DA] # CJK STROKE SG 31DB ; [*14AA.0020.0002.31DB] # CJK STROKE PD 31DC ; [*14AB.0020.0002.31DC] # CJK STROKE PZ 31DD ; [*14AC.0020.0002.31DD] # CJK STROKE TN 31DE ; [*14AD.0020.0002.31DE] # CJK STROKE SZZ 31DF ; [*14AE.0020.0002.31DF] # CJK STROKE SWG 31E0 ; [*14AF.0020.0002.31E0] # CJK STROKE HXWG 31E1 ; [*14B0.0020.0002.31E1] # CJK STROKE HZZZG 31E2 ; [*14B1.0020.0002.31E2] # CJK STROKE PG 31E3 ; [*14B2.0020.0002.31E3] # CJK STROKE Q 327F ; [*14BC.0020.0002.327F] # KOREAN STANDARD SYMBOL 4DC0 ; [*0D97.0020.0002.4DC0] # HEXAGRAM FOR THE CREATIVE HEAVEN 4DC1 ; [*0D98.0020.0002.4DC1] # HEXAGRAM FOR THE RECEPTIVE EARTH 4DC2 ; [*0D99.0020.0002.4DC2] # HEXAGRAM FOR DIFFICULTY AT THE BEGINNING 4DC3 ; [*0D9A.0020.0002.4DC3] # HEXAGRAM FOR YOUTHFUL FOLLY 4DC4 ; [*0D9B.0020.0002.4DC4] # HEXAGRAM FOR WAITING 4DC5 ; [*0D9C.0020.0002.4DC5] # HEXAGRAM FOR CONFLICT 4DC6 ; [*0D9D.0020.0002.4DC6] # HEXAGRAM FOR THE ARMY 4DC7 ; [*0D9E.0020.0002.4DC7] # HEXAGRAM FOR HOLDING TOGETHER 4DC8 ; [*0D9F.0020.0002.4DC8] # HEXAGRAM FOR SMALL TAMING 4DC9 ; [*0DA0.0020.0002.4DC9] # HEXAGRAM FOR TREADING 4DCA ; [*0DA1.0020.0002.4DCA] # HEXAGRAM FOR PEACE 4DCB ; [*0DA2.0020.0002.4DCB] # HEXAGRAM FOR STANDSTILL 4DCC ; [*0DA3.0020.0002.4DCC] # HEXAGRAM FOR FELLOWSHIP 4DCD ; [*0DA4.0020.0002.4DCD] # HEXAGRAM FOR GREAT POSSESSION 4DCE ; [*0DA5.0020.0002.4DCE] # HEXAGRAM FOR MODESTY 4DCF ; [*0DA6.0020.0002.4DCF] # HEXAGRAM FOR ENTHUSIASM 4DD0 ; [*0DA7.0020.0002.4DD0] # HEXAGRAM FOR FOLLOWING 4DD1 ; [*0DA8.0020.0002.4DD1] # HEXAGRAM FOR WORK ON THE DECAYED 4DD2 ; [*0DA9.0020.0002.4DD2] # HEXAGRAM FOR APPROACH 4DD3 ; [*0DAA.0020.0002.4DD3] # HEXAGRAM FOR CONTEMPLATION 4DD4 ; [*0DAB.0020.0002.4DD4] # HEXAGRAM FOR BITING THROUGH 4DD5 ; [*0DAC.0020.0002.4DD5] # HEXAGRAM FOR GRACE 4DD6 ; [*0DAD.0020.0002.4DD6] # HEXAGRAM FOR SPLITTING APART 4DD7 ; [*0DAE.0020.0002.4DD7] # HEXAGRAM FOR RETURN 4DD8 ; [*0DAF.0020.0002.4DD8] # HEXAGRAM FOR INNOCENCE 4DD9 ; [*0DB0.0020.0002.4DD9] # HEXAGRAM FOR GREAT TAMING 4DDA ; [*0DB1.0020.0002.4DDA] # HEXAGRAM FOR MOUTH CORNERS 4DDB ; [*0DB2.0020.0002.4DDB] # HEXAGRAM FOR GREAT PREPONDERANCE 4DDC ; [*0DB3.0020.0002.4DDC] # HEXAGRAM FOR THE ABYSMAL WATER 4DDD ; [*0DB4.0020.0002.4DDD] # HEXAGRAM FOR THE CLINGING FIRE 4DDE ; [*0DB5.0020.0002.4DDE] # HEXAGRAM FOR INFLUENCE 4DDF ; [*0DB6.0020.0002.4DDF] # HEXAGRAM FOR DURATION 4DE0 ; [*0DB7.0020.0002.4DE0] # HEXAGRAM FOR RETREAT 4DE1 ; [*0DB8.0020.0002.4DE1] # HEXAGRAM FOR GREAT POWER 4DE2 ; [*0DB9.0020.0002.4DE2] # HEXAGRAM FOR PROGRESS 4DE3 ; [*0DBA.0020.0002.4DE3] # HEXAGRAM FOR DARKENING OF THE LIGHT 4DE4 ; [*0DBB.0020.0002.4DE4] # HEXAGRAM FOR THE FAMILY 4DE5 ; [*0DBC.0020.0002.4DE5] # HEXAGRAM FOR OPPOSITION 4DE6 ; [*0DBD.0020.0002.4DE6] # HEXAGRAM FOR OBSTRUCTION 4DE7 ; [*0DBE.0020.0002.4DE7] # HEXAGRAM FOR DELIVERANCE 4DE8 ; [*0DBF.0020.0002.4DE8] # HEXAGRAM FOR DECREASE 4DE9 ; [*0DC0.0020.0002.4DE9] # HEXAGRAM FOR INCREASE 4DEA ; [*0DC1.0020.0002.4DEA] # HEXAGRAM FOR BREAKTHROUGH 4DEB ; [*0DC2.0020.0002.4DEB] # HEXAGRAM FOR COMING TO MEET 4DEC ; [*0DC3.0020.0002.4DEC] # HEXAGRAM FOR GATHERING TOGETHER 4DED ; [*0DC4.0020.0002.4DED] # HEXAGRAM FOR PUSHING UPWARD 4DEE ; [*0DC5.0020.0002.4DEE] # HEXAGRAM FOR OPPRESSION 4DEF ; [*0DC6.0020.0002.4DEF] # HEXAGRAM FOR THE WELL 4DF0 ; [*0DC7.0020.0002.4DF0] # HEXAGRAM FOR REVOLUTION 4DF1 ; [*0DC8.0020.0002.4DF1] # HEXAGRAM FOR THE CAULDRON 4DF2 ; [*0DC9.0020.0002.4DF2] # HEXAGRAM FOR THE AROUSING THUNDER 4DF3 ; [*0DCA.0020.0002.4DF3] # HEXAGRAM FOR THE KEEPING STILL MOUNTAIN 4DF4 ; [*0DCB.0020.0002.4DF4] # HEXAGRAM FOR DEVELOPMENT 4DF5 ; [*0DCC.0020.0002.4DF5] # HEXAGRAM FOR THE MARRYING MAIDEN 4DF6 ; [*0DCD.0020.0002.4DF6] # HEXAGRAM FOR ABUNDANCE 4DF7 ; [*0DCE.0020.0002.4DF7] # HEXAGRAM FOR THE WANDERER 4DF8 ; [*0DCF.0020.0002.4DF8] # HEXAGRAM FOR THE GENTLE WIND 4DF9 ; [*0DD0.0020.0002.4DF9] # HEXAGRAM FOR THE JOYOUS LAKE 4DFA ; [*0DD1.0020.0002.4DFA] # HEXAGRAM FOR DISPERSION 4DFB ; [*0DD2.0020.0002.4DFB] # HEXAGRAM FOR LIMITATION 4DFC ; [*0DD3.0020.0002.4DFC] # HEXAGRAM FOR INNER TRUTH 4DFD ; [*0DD4.0020.0002.4DFD] # HEXAGRAM FOR SMALL PREPONDERANCE 4DFE ; [*0DD5.0020.0002.4DFE] # HEXAGRAM FOR AFTER COMPLETION 4DFF ; [*0DD6.0020.0002.4DFF] # HEXAGRAM FOR BEFORE COMPLETION A490 ; [*0E2E.0020.0002.A490] # YI RADICAL QOT A491 ; [*0E2F.0020.0002.A491] # YI RADICAL LI A492 ; [*0E30.0020.0002.A492] # YI RADICAL KIT A493 ; [*0E31.0020.0002.A493] # YI RADICAL NYIP A494 ; [*0E32.0020.0002.A494] # YI RADICAL CYP A495 ; [*0E33.0020.0002.A495] # YI RADICAL SSI A496 ; [*0E34.0020.0002.A496] # YI RADICAL GGOP A497 ; [*0E35.0020.0002.A497] # YI RADICAL GEP A498 ; [*0E36.0020.0002.A498] # YI RADICAL MI A499 ; [*0E37.0020.0002.A499] # YI RADICAL HXIT A49A ; [*0E38.0020.0002.A49A] # YI RADICAL LYR A49B ; [*0E39.0020.0002.A49B] # YI RADICAL BBUT A49C ; [*0E3A.0020.0002.A49C] # YI RADICAL MOP A49D ; [*0E3B.0020.0002.A49D] # YI RADICAL YO A49E ; [*0E3C.0020.0002.A49E] # YI RADICAL PUT A49F ; [*0E3D.0020.0002.A49F] # YI RADICAL HXUO A4A0 ; [*0E3E.0020.0002.A4A0] # YI RADICAL TAT A4A1 ; [*0E3F.0020.0002.A4A1] # YI RADICAL GA A4A2 ; [*0E40.0020.0002.A4A2] # YI RADICAL ZUP A4A3 ; [*0E41.0020.0002.A4A3] # YI RADICAL CYT A4A4 ; [*0E42.0020.0002.A4A4] # YI RADICAL DDUR A4A5 ; [*0E43.0020.0002.A4A5] # YI RADICAL BUR A4A6 ; [*0E44.0020.0002.A4A6] # YI RADICAL GGUO A4A7 ; [*0E45.0020.0002.A4A7] # YI RADICAL NYOP A4A8 ; [*0E46.0020.0002.A4A8] # YI RADICAL TU A4A9 ; [*0E47.0020.0002.A4A9] # YI RADICAL OP A4AA ; [*0E48.0020.0002.A4AA] # YI RADICAL JJUT A4AB ; [*0E49.0020.0002.A4AB] # YI RADICAL ZOT A4AC ; [*0E4A.0020.0002.A4AC] # YI RADICAL PYT A4AD ; [*0E4B.0020.0002.A4AD] # YI RADICAL HMO A4AE ; [*0E4C.0020.0002.A4AE] # YI RADICAL YIT A4AF ; [*0E4D.0020.0002.A4AF] # YI RADICAL VUR A4B0 ; [*0E4E.0020.0002.A4B0] # YI RADICAL SHY A4B1 ; [*0E4F.0020.0002.A4B1] # YI RADICAL VEP A4B2 ; [*0E50.0020.0002.A4B2] # YI RADICAL ZA A4B3 ; [*0E51.0020.0002.A4B3] # YI RADICAL JO A4B4 ; [*0E52.0020.0002.A4B4] # YI RADICAL NZUP A4B5 ; [*0E53.0020.0002.A4B5] # YI RADICAL JJY A4B6 ; [*0E54.0020.0002.A4B6] # YI RADICAL GOT A4B7 ; [*0E55.0020.0002.A4B7] # YI RADICAL JJIE A4B8 ; [*0E56.0020.0002.A4B8] # YI RADICAL WO A4B9 ; [*0E57.0020.0002.A4B9] # YI RADICAL DU A4BA ; [*0E58.0020.0002.A4BA] # YI RADICAL SHUR A4BB ; [*0E59.0020.0002.A4BB] # YI RADICAL LIE A4BC ; [*0E5A.0020.0002.A4BC] # YI RADICAL CY A4BD ; [*0E5B.0020.0002.A4BD] # YI RADICAL CUOP A4BE ; [*0E5C.0020.0002.A4BE] # YI RADICAL CIP A4BF ; [*0E5D.0020.0002.A4BF] # YI RADICAL HXOP A4C0 ; [*0E5E.0020.0002.A4C0] # YI RADICAL SHAT A4C1 ; [*0E5F.0020.0002.A4C1] # YI RADICAL ZUR A4C2 ; [*0E60.0020.0002.A4C2] # YI RADICAL SHOP A4C3 ; [*0E61.0020.0002.A4C3] # YI RADICAL CHE A4C4 ; [*0E62.0020.0002.A4C4] # YI RADICAL ZZIET A4C5 ; [*0E63.0020.0002.A4C5] # YI RADICAL NBIE A4C6 ; [*0E64.0020.0002.A4C6] # YI RADICAL KE A4FE ; [*022C.0020.0002.A4FE] # LISU PUNCTUATION COMMA A4FF ; [*0280.0020.0002.A4FF] # LISU PUNCTUATION FULL STOP A60D ; [*022D.0020.0002.A60D] # VAI COMMA A60E ; [*0281.0020.0002.A60E] # VAI FULL STOP A60F ; [*026D.0020.0002.A60F] # VAI QUESTION MARK A670 ; [.0000.0000.0000.A670] # COMBINING CYRILLIC TEN MILLIONS SIGN A671 ; [.0000.0000.0000.A671] # COMBINING CYRILLIC HUNDRED MILLIONS SIGN A672 ; [.0000.0000.0000.A672] # COMBINING CYRILLIC THOUSAND MILLIONS SIGN A673 ; [*0371.0020.0002.A673] # SLAVONIC ASTERISK A67E ; [*03A7.0020.0002.A67E] # CYRILLIC KAVYKA A6F2 ; [*02C2.0020.0002.A6F2] # BAMUM NJAEMLI A6F3 ; [*0282.0020.0002.A6F3] # BAMUM FULL STOP A6F4 ; [*025D.0020.0002.A6F4] # BAMUM COLON A6F5 ; [*022E.0020.0002.A6F5] # BAMUM COMMA A6F6 ; [*0236.0020.0002.A6F6] # BAMUM SEMICOLON A6F7 ; [*026E.0020.0002.A6F7] # BAMUM QUESTION MARK A700 ; [*045D.0020.0002.A700] # MODIFIER LETTER CHINESE TONE YIN PING A701 ; [*045E.0020.0002.A701] # MODIFIER LETTER CHINESE TONE YANG PING A702 ; [*045F.0020.0002.A702] # MODIFIER LETTER CHINESE TONE YIN SHANG A703 ; [*0460.0020.0002.A703] # MODIFIER LETTER CHINESE TONE YANG SHANG A704 ; [*0461.0020.0002.A704] # MODIFIER LETTER CHINESE TONE YIN QU A705 ; [*0462.0020.0002.A705] # MODIFIER LETTER CHINESE TONE YANG QU A706 ; [*0463.0020.0002.A706] # MODIFIER LETTER CHINESE TONE YIN RU A707 ; [*0464.0020.0002.A707] # MODIFIER LETTER CHINESE TONE YANG RU A708 ; [*0465.0020.0002.A708] # MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR A709 ; [*0466.0020.0002.A709] # MODIFIER LETTER HIGH DOTTED TONE BAR A70A ; [*0467.0020.0002.A70A] # MODIFIER LETTER MID DOTTED TONE BAR A70B ; [*0468.0020.0002.A70B] # MODIFIER LETTER LOW DOTTED TONE BAR A70C ; [*0469.0020.0002.A70C] # MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR A70D ; [*046A.0020.0002.A70D] # MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR A70E ; [*046B.0020.0002.A70E] # MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR A70F ; [*046C.0020.0002.A70F] # MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR A710 ; [*046D.0020.0002.A710] # MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR A711 ; [*046E.0020.0002.A711] # MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR A712 ; [*046F.0020.0002.A712] # MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR A713 ; [*0470.0020.0002.A713] # MODIFIER LETTER HIGH LEFT-STEM TONE BAR A714 ; [*0471.0020.0002.A714] # MODIFIER LETTER MID LEFT-STEM TONE BAR A715 ; [*0472.0020.0002.A715] # MODIFIER LETTER LOW LEFT-STEM TONE BAR A716 ; [*0473.0020.0002.A716] # MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR A717 ; [*0474.0020.0002.A717] # MODIFIER LETTER DOT VERTICAL BAR A718 ; [*0475.0020.0002.A718] # MODIFIER LETTER DOT SLASH A719 ; [*0476.0020.0002.A719] # MODIFIER LETTER DOT HORIZONTAL BAR A71A ; [*0477.0020.0002.A71A] # MODIFIER LETTER LOWER RIGHT CORNER ANGLE A71B ; [*0478.0020.0002.A71B] # MODIFIER LETTER RAISED UP ARROW A71C ; [*0479.0020.0002.A71C] # MODIFIER LETTER RAISED DOWN ARROW A71D ; [*047A.0020.0002.A71D] # MODIFIER LETTER RAISED EXCLAMATION MARK A71E ; [*047B.0020.0002.A71E] # MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK A71F ; [*047C.0020.0002.A71F] # MODIFIER LETTER LOW INVERTED EXCLAMATION MARK A720 ; [*047D.0020.0002.A720] # MODIFIER LETTER STRESS AND HIGH TONE A721 ; [*047E.0020.0002.A721] # MODIFIER LETTER STRESS AND LOW TONE A788 ; [*047F.0020.0002.A788] # MODIFIER LETTER LOW CIRCUMFLEX ACCENT A789 ; [*0480.0020.0002.A789] # MODIFIER LETTER COLON A78A ; [*0481.0020.0002.A78A] # MODIFIER LETTER SHORT EQUALS SIGN A828 ; [*04A8.0020.0002.A828] # SYLOTI NAGRI POETRY MARK-1 A829 ; [*04A9.0020.0002.A829] # SYLOTI NAGRI POETRY MARK-2 A82A ; [*04AA.0020.0002.A82A] # SYLOTI NAGRI POETRY MARK-3 A82B ; [*04AB.0020.0002.A82B] # SYLOTI NAGRI POETRY MARK-4 A830 ; [*14CB.0020.0002.A830] # NORTH INDIC FRACTION ONE QUARTER A831 ; [*14CC.0020.0002.A831] # NORTH INDIC FRACTION ONE HALF A832 ; [*14CD.0020.0002.A832] # NORTH INDIC FRACTION THREE QUARTERS A833 ; [*14CE.0020.0002.A833] # NORTH INDIC FRACTION ONE SIXTEENTH A834 ; [*14CF.0020.0002.A834] # NORTH INDIC FRACTION ONE EIGHTH A835 ; [*14D0.0020.0002.A835] # NORTH INDIC FRACTION THREE SIXTEENTHS A836 ; [*04AC.0020.0002.A836] # NORTH INDIC QUARTER MARK A837 ; [*04AD.0020.0002.A837] # NORTH INDIC PLACEHOLDER MARK A839 ; [*04AE.0020.0002.A839] # NORTH INDIC QUANTITY MARK A874 ; [*03F5.0020.0002.A874] # PHAGS-PA SINGLE HEAD MARK A875 ; [*03F6.0020.0002.A875] # PHAGS-PA DOUBLE HEAD MARK A876 ; [*028D.0020.0002.A876] # PHAGS-PA MARK SHAD A877 ; [*028E.0020.0002.A877] # PHAGS-PA MARK DOUBLE SHAD A8CE ; [*0289.0020.0002.A8CE] # SAURASHTRA DANDA A8CF ; [*028A.0020.0002.A8CF] # SAURASHTRA DOUBLE DANDA A8E0 ; [.0000.0000.0000.A8E0] # COMBINING DEVANAGARI DIGIT ZERO A8E1 ; [.0000.0000.0000.A8E1] # COMBINING DEVANAGARI DIGIT ONE A8E2 ; [.0000.0000.0000.A8E2] # COMBINING DEVANAGARI DIGIT TWO A8E3 ; [.0000.0000.0000.A8E3] # COMBINING DEVANAGARI DIGIT THREE A8E4 ; [.0000.0000.0000.A8E4] # COMBINING DEVANAGARI DIGIT FOUR A8E5 ; [.0000.0000.0000.A8E5] # COMBINING DEVANAGARI DIGIT FIVE A8E6 ; [.0000.0000.0000.A8E6] # COMBINING DEVANAGARI DIGIT SIX A8E7 ; [.0000.0000.0000.A8E7] # COMBINING DEVANAGARI DIGIT SEVEN A8E8 ; [.0000.0000.0000.A8E8] # COMBINING DEVANAGARI DIGIT EIGHT A8E9 ; [.0000.0000.0000.A8E9] # COMBINING DEVANAGARI DIGIT NINE A8EA ; [.0000.0000.0000.A8EA] # COMBINING DEVANAGARI LETTER A A8EB ; [.0000.0000.0000.A8EB] # COMBINING DEVANAGARI LETTER U A8EC ; [.0000.0000.0000.A8EC] # COMBINING DEVANAGARI LETTER KA A8ED ; [.0000.0000.0000.A8ED] # COMBINING DEVANAGARI LETTER NA A8EE ; [.0000.0000.0000.A8EE] # COMBINING DEVANAGARI LETTER PA A8EF ; [.0000.0000.0000.A8EF] # COMBINING DEVANAGARI LETTER RA A8F0 ; [.0000.0000.0000.A8F0] # COMBINING DEVANAGARI LETTER VI A8F1 ; [.0000.0000.0000.A8F1] # COMBINING DEVANAGARI SIGN AVAGRAHA A8F8 ; [*03B8.0020.0002.A8F8] # DEVANAGARI SIGN PUSHPIKA A8F9 ; [*03B9.0020.0002.A8F9] # DEVANAGARI GAP FILLER A8FA ; [*03BA.0020.0002.A8FA] # DEVANAGARI CARET A92E ; [*03FB.0020.0002.A92E] # KAYAH LI SIGN CWI A92F ; [*0291.0020.0002.A92F] # KAYAH LI SIGN SHYA A95F ; [*02C3.0020.0002.A95F] # REJANG SECTION MARK A9C1 ; [*02B8.0020.0002.A9C1] # JAVANESE LEFT RERENGGAN A9C2 ; [*02B9.0020.0002.A9C2] # JAVANESE RIGHT RERENGGAN A9C3 ; [*02BA.0020.0002.A9C3] # JAVANESE PADA ANDAP A9C4 ; [*02BB.0020.0002.A9C4] # JAVANESE PADA MADYA A9C5 ; [*02BC.0020.0002.A9C5] # JAVANESE PADA LUHUR A9C6 ; [*02BD.0020.0002.A9C6] # JAVANESE PADA WINDU A9C7 ; [*0259.0020.0002.A9C7] # JAVANESE PADA PANGKAT A9C8 ; [*029C.0020.0002.A9C8] # JAVANESE PADA LINGSA A9C9 ; [*029D.0020.0002.A9C9] # JAVANESE PADA LUNGSI A9CA ; [*02BE.0020.0002.A9CA] # JAVANESE PADA ADEG A9CB ; [*02BF.0020.0002.A9CB] # JAVANESE PADA ADEG ADEG A9CC ; [*02C0.0020.0002.A9CC] # JAVANESE PADA PISELEH A9CD ; [*02C1.0020.0002.A9CD] # JAVANESE TURNED PADA PISELEH A9DE ; [*03FC.0020.0002.A9DE] # JAVANESE PADA TIRTA TUMETES A9DF ; [*03FD.0020.0002.A9DF] # JAVANESE PADA ISEN-ISEN AA5C ; [*03FE.0020.0002.AA5C] # CHAM PUNCTUATION SPIRAL AA5D ; [*029E.0020.0002.AA5D] # CHAM PUNCTUATION DANDA AA5E ; [*029F.0020.0002.AA5E] # CHAM PUNCTUATION DOUBLE DANDA AA5F ; [*02A0.0020.0002.AA5F] # CHAM PUNCTUATION TRIPLE DANDA AA77 ; [*04D6.0020.0002.AA77] # MYANMAR SYMBOL AITON EXCLAMATION AA78 ; [*04D7.0020.0002.AA78] # MYANMAR SYMBOL AITON ONE AA79 ; [*04D8.0020.0002.AA79] # MYANMAR SYMBOL AITON TWO AADE ; [*03C0.0020.0002.AADE] # TAI VIET SYMBOL HO HOI AADF ; [*03C1.0020.0002.AADF] # TAI VIET SYMBOL KOI KOI AAF0 ; [*02A1.0020.0002.AAF0] # MEETEI MAYEK CHEIKHAN AAF1 ; [*026F.0020.0002.AAF1] # MEETEI MAYEK AHANG KHUDAM ABEB ; [*02A2.0020.0002.ABEB] # MEETEI MAYEK CHEIKHEI FB29 ; [*059C.0020.0005.FB29] # HEBREW LETTER ALTERNATIVE PLUS SIGN FBB2 ; [*048C.0020.0002.FBB2] # ARABIC SYMBOL DOT ABOVE FBB3 ; [*048D.0020.0002.FBB3] # ARABIC SYMBOL DOT BELOW FBB4 ; [*048E.0020.0002.FBB4] # ARABIC SYMBOL TWO DOTS ABOVE FBB5 ; [*048F.0020.0002.FBB5] # ARABIC SYMBOL TWO DOTS BELOW FBB6 ; [*0490.0020.0002.FBB6] # ARABIC SYMBOL THREE DOTS ABOVE FBB7 ; [*0491.0020.0002.FBB7] # ARABIC SYMBOL THREE DOTS BELOW FBB8 ; [*0492.0020.0002.FBB8] # ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE FBB9 ; [*0493.0020.0002.FBB9] # ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW FBBA ; [*0494.0020.0002.FBBA] # ARABIC SYMBOL FOUR DOTS ABOVE FBBB ; [*0495.0020.0002.FBBB] # ARABIC SYMBOL FOUR DOTS BELOW FBBC ; [*0496.0020.0002.FBBC] # ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW FBBD ; [*0497.0020.0002.FBBD] # ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE FBBE ; [*0498.0020.0002.FBBE] # ARABIC SYMBOL TWO DOTS VERTICALLY BELOW FBBF ; [*0499.0020.0002.FBBF] # ARABIC SYMBOL RING FBC0 ; [*049A.0020.0002.FBC0] # ARABIC SYMBOL SMALL TAH ABOVE FBC1 ; [*049B.0020.0002.FBC1] # ARABIC SYMBOL SMALL TAH BELOW FD3E ; [*0361.0020.0002.FD3E] # ORNATE LEFT PARENTHESIS FD3F ; [*0362.0020.0002.FD3F] # ORNATE RIGHT PARENTHESIS FDFD ; [*048B.0020.0002.FDFD] # ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM FE10 ; [*0221.0020.0016.FE10] # PRESENTATION FORM FOR VERTICAL COMMA FE11 ; [*022F.0020.0016.FE11] # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA FE12 ; [*0283.0020.0016.FE12] # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP FE13 ; [*0237.0020.0016.FE13] # PRESENTATION FORM FOR VERTICAL COLON FE14 ; [*0232.0020.0016.FE14] # PRESENTATION FORM FOR VERTICAL SEMICOLON FE15 ; [*025E.0020.0016.FE15] # PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK FE16 ; [*0263.0020.0016.FE16] # PRESENTATION FORM FOR VERTICAL QUESTION MARK FE17 ; [*035B.0020.0016.FE17] # PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET FE18 ; [*035C.0020.0016.FE18] # PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET FE19 ; [*0273.0020.0016.FE19][*0273.0020.0016.FE19][*0273.0020.001F.FE19] # PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS FE21 ; [.0000.0000.0000.FE21] # COMBINING LIGATURE RIGHT HALF FE23 ; [.0000.0000.0000.FE23] # COMBINING DOUBLE TILDE RIGHT HALF FE24 ; [.0000.0000.0000.FE24] # COMBINING MACRON LEFT HALF FE25 ; [.0000.0000.0000.FE25] # COMBINING MACRON RIGHT HALF FE26 ; [.0000.0000.0000.FE26] # COMBINING CONJOINING MACRON FE30 ; [*0273.0020.0016.FE30][*0273.0020.0016.FE30] # PRESENTATION FORM FOR VERTICAL TWO DOT LEADER FE31 ; [*0217.0020.0016.FE31] # PRESENTATION FORM FOR VERTICAL EM DASH FE32 ; [*0216.0020.0016.FE32] # PRESENTATION FORM FOR VERTICAL EN DASH FE33 ; [*020C.0020.0016.FE33] # PRESENTATION FORM FOR VERTICAL LOW LINE FE34 ; [*020C.0020.0016.FE34] # PRESENTATION FORM FOR VERTICAL WAVY LOW LINE FE35 ; [*02FB.0020.0016.FE35] # PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS FE36 ; [*02FC.0020.0016.FE36] # PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS FE37 ; [*02FF.0020.0016.FE37] # PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET FE38 ; [*0300.0020.0016.FE38] # PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET FE39 ; [*0359.0020.0016.FE39] # PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET FE3A ; [*035A.0020.0016.FE3A] # PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET FE3B ; [*0357.0020.0016.FE3B] # PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET FE3C ; [*0358.0020.0016.FE3C] # PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET FE3D ; [*0351.0020.0016.FE3D] # PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET FE3E ; [*0352.0020.0016.FE3E] # PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET FE3F ; [*034F.0020.0016.FE3F] # PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET FE40 ; [*0350.0020.0016.FE40] # PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET FE41 ; [*0353.0020.0016.FE41] # PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET FE42 ; [*0354.0020.0016.FE42] # PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET FE43 ; [*0355.0020.0016.FE43] # PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET FE44 ; [*0356.0020.0016.FE44] # PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET FE45 ; [*0230.0020.0002.FE45] # SESAME DOT FE46 ; [*0231.0020.0002.FE46] # WHITE SESAME DOT FE47 ; [*02FD.0020.0016.FE47] # PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET FE48 ; [*02FE.0020.0016.FE48] # PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET FE49 ; [*020B.0020.0004.FE49] # DASHED OVERLINE FE4A ; [*020B.0020.0004.FE4A] # CENTRELINE OVERLINE FE4B ; [*020B.0020.0004.FE4B] # WAVY OVERLINE FE4C ; [*020B.0020.0004.FE4C] # DOUBLE WAVY OVERLINE FE4D ; [*020C.0020.0004.FE4D] # DASHED LOW LINE FE4E ; [*020C.0020.0004.FE4E] # CENTRELINE LOW LINE FE4F ; [*020C.0020.0004.FE4F] # WAVY LOW LINE FE50 ; [*0221.0020.000F.FE50] # SMALL COMMA FE51 ; [*022F.0020.000F.FE51] # SMALL IDEOGRAPHIC COMMA FE52 ; [*0273.0020.000F.FE52] # SMALL FULL STOP FE54 ; [*0232.0020.000F.FE54] # SMALL SEMICOLON FE55 ; [*0237.0020.000F.FE55] # SMALL COLON FE56 ; [*0263.0020.000F.FE56] # SMALL QUESTION MARK FE57 ; [*025E.0020.000F.FE57] # SMALL EXCLAMATION MARK FE58 ; [*0217.0020.000F.FE58] # SMALL EM DASH FE59 ; [*02FB.0020.000F.FE59] # SMALL LEFT PARENTHESIS FE5A ; [*02FC.0020.000F.FE5A] # SMALL RIGHT PARENTHESIS FE5B ; [*02FF.0020.000F.FE5B] # SMALL LEFT CURLY BRACKET FE5C ; [*0300.0020.000F.FE5C] # SMALL RIGHT CURLY BRACKET FE5D ; [*0359.0020.000F.FE5D] # SMALL LEFT TORTOISE SHELL BRACKET FE5E ; [*035A.0020.000F.FE5E] # SMALL RIGHT TORTOISE SHELL BRACKET FE5F ; [*0376.0020.000F.FE5F] # SMALL NUMBER SIGN FE60 ; [*0374.0020.000F.FE60] # SMALL AMPERSAND FE61 ; [*036D.0020.000F.FE61] # SMALL ASTERISK FE62 ; [*059C.0020.000F.FE62] # SMALL PLUS SIGN FE63 ; [*020E.0020.000F.FE63] # SMALL HYPHEN-MINUS FE64 ; [*05A0.0020.000F.FE64] # SMALL LESS-THAN SIGN FE65 ; [*05A2.0020.000F.FE65] # SMALL GREATER-THAN SIGN FE66 ; [*05A1.0020.000F.FE66] # SMALL EQUALS SIGN FE68 ; [*0373.0020.000F.FE68] # SMALL REVERSE SOLIDUS FE6A ; [*0377.0020.000F.FE6A] # SMALL PERCENT SIGN FE6B ; [*036C.0020.000F.FE6B] # SMALL COMMERCIAL AT FE73 ; [.0000.0000.0000.FE73] # ARABIC TAIL FRAGMENT FF01 ; [*025E.0020.0003.FF01] # FULLWIDTH EXCLAMATION MARK FF02 ; [*02F1.0020.0003.FF02] # FULLWIDTH QUOTATION MARK FF03 ; [*0376.0020.0003.FF03] # FULLWIDTH NUMBER SIGN FF05 ; [*0377.0020.0003.FF05] # FULLWIDTH PERCENT SIGN FF06 ; [*0374.0020.0003.FF06] # FULLWIDTH AMPERSAND FF07 ; [*02EA.0020.0003.FF07] # FULLWIDTH APOSTROPHE FF08 ; [*02FB.0020.0003.FF08] # FULLWIDTH LEFT PARENTHESIS FF09 ; [*02FC.0020.0003.FF09] # FULLWIDTH RIGHT PARENTHESIS FF0A ; [*036D.0020.0003.FF0A] # FULLWIDTH ASTERISK FF0B ; [*059C.0020.0003.FF0B] # FULLWIDTH PLUS SIGN FF0C ; [*0221.0020.0003.FF0C] # FULLWIDTH COMMA FF0D ; [*020E.0020.0003.FF0D] # FULLWIDTH HYPHEN-MINUS FF0E ; [*0273.0020.0003.FF0E] # FULLWIDTH FULL STOP FF0F ; [*0372.0020.0003.FF0F] # FULLWIDTH SOLIDUS FF1A ; [*0237.0020.0003.FF1A] # FULLWIDTH COLON FF1B ; [*0232.0020.0003.FF1B] # FULLWIDTH SEMICOLON FF1C ; [*05A0.0020.0003.FF1C] # FULLWIDTH LESS-THAN SIGN FF1D ; [*05A1.0020.0003.FF1D] # FULLWIDTH EQUALS SIGN FF1E ; [*05A2.0020.0003.FF1E] # FULLWIDTH GREATER-THAN SIGN FF1F ; [*0263.0020.0003.FF1F] # FULLWIDTH QUESTION MARK FF20 ; [*036C.0020.0003.FF20] # FULLWIDTH COMMERCIAL AT FF3B ; [*02FD.0020.0003.FF3B] # FULLWIDTH LEFT SQUARE BRACKET FF3C ; [*0373.0020.0003.FF3C] # FULLWIDTH REVERSE SOLIDUS FF3D ; [*02FE.0020.0003.FF3D] # FULLWIDTH RIGHT SQUARE BRACKET FF3E ; [*0412.0020.0003.FF3E] # FULLWIDTH CIRCUMFLEX ACCENT FF3F ; [*020C.0020.0003.FF3F] # FULLWIDTH LOW LINE FF40 ; [*040F.0020.0003.FF40] # FULLWIDTH GRAVE ACCENT FF5B ; [*02FF.0020.0003.FF5B] # FULLWIDTH LEFT CURLY BRACKET FF5C ; [*05A4.0020.0003.FF5C] # FULLWIDTH VERTICAL LINE FF5D ; [*0300.0020.0003.FF5D] # FULLWIDTH RIGHT CURLY BRACKET FF5E ; [*05A6.0020.0003.FF5E] # FULLWIDTH TILDE FF5F ; [*030D.0020.0003.FF5F] # FULLWIDTH LEFT WHITE PARENTHESIS FF60 ; [*030E.0020.0003.FF60] # FULLWIDTH RIGHT WHITE PARENTHESIS FF61 ; [*0283.0020.0012.FF61] # HALFWIDTH IDEOGRAPHIC FULL STOP FF62 ; [*0353.0020.0012.FF62] # HALFWIDTH LEFT CORNER BRACKET FF63 ; [*0354.0020.0012.FF63] # HALFWIDTH RIGHT CORNER BRACKET FF64 ; [*022F.0020.0012.FF64] # HALFWIDTH IDEOGRAPHIC COMMA FF65 ; [*0220.0020.0012.FF65] # HALFWIDTH KATAKANA MIDDLE DOT FFE2 ; [*05A3.0020.0003.FFE2] # FULLWIDTH NOT SIGN FFE3 ; [*0413.0020.0003.FFE3] # FULLWIDTH MACRON FFE4 ; [*05A5.0020.0003.FFE4] # FULLWIDTH BROKEN BAR FFE8 ; [*0799.0020.0012.FFE8] # HALFWIDTH FORMS LIGHT VERTICAL FFE9 ; [*0522.0020.0012.FFE9] # HALFWIDTH LEFTWARDS ARROW FFEA ; [*0524.0020.0012.FFEA] # HALFWIDTH UPWARDS ARROW FFEB ; [*0523.0020.0012.FFEB] # HALFWIDTH RIGHTWARDS ARROW FFEC ; [*0525.0020.0012.FFEC] # HALFWIDTH DOWNWARDS ARROW FFED ; [*0837.0020.0012.FFED] # HALFWIDTH BLACK SQUARE FFEE ; [*0862.0020.0012.FFEE] # HALFWIDTH WHITE CIRCLE FFFC ; [*14BD.0020.0002.FFFC] # OBJECT REPLACEMENT CHARACTER FFFD ; [*14BE.0020.0002.FFFD] # REPLACEMENT CHARACTER 10100 ; [*02E0.0020.0002.10100] # AEGEAN WORD SEPARATOR LINE 10101 ; [*02E1.0020.0002.10101] # AEGEAN WORD SEPARATOR DOT 10102 ; [*02E2.0020.0002.10102] # AEGEAN CHECK MARK 10110 ; [*1504.0020.0002.10110] # AEGEAN NUMBER TEN 10111 ; [*1505.0020.0002.10111] # AEGEAN NUMBER TWENTY 10112 ; [*1506.0020.0002.10112] # AEGEAN NUMBER THIRTY 10113 ; [*1507.0020.0002.10113] # AEGEAN NUMBER FORTY 10114 ; [*1508.0020.0002.10114] # AEGEAN NUMBER FIFTY 10115 ; [*1509.0020.0002.10115] # AEGEAN NUMBER SIXTY 10116 ; [*150A.0020.0002.10116] # AEGEAN NUMBER SEVENTY 10117 ; [*150B.0020.0002.10117] # AEGEAN NUMBER EIGHTY 10118 ; [*150C.0020.0002.10118] # AEGEAN NUMBER NINETY 10119 ; [*150D.0020.0002.10119] # AEGEAN NUMBER ONE HUNDRED 1011A ; [*150E.0020.0002.1011A] # AEGEAN NUMBER TWO HUNDRED 1011B ; [*150F.0020.0002.1011B] # AEGEAN NUMBER THREE HUNDRED 1011C ; [*1510.0020.0002.1011C] # AEGEAN NUMBER FOUR HUNDRED 1011D ; [*1511.0020.0002.1011D] # AEGEAN NUMBER FIVE HUNDRED 1011E ; [*1512.0020.0002.1011E] # AEGEAN NUMBER SIX HUNDRED 1011F ; [*1513.0020.0002.1011F] # AEGEAN NUMBER SEVEN HUNDRED 10120 ; [*1514.0020.0002.10120] # AEGEAN NUMBER EIGHT HUNDRED 10121 ; [*1515.0020.0002.10121] # AEGEAN NUMBER NINE HUNDRED 10122 ; [*1516.0020.0002.10122] # AEGEAN NUMBER ONE THOUSAND 10123 ; [*1517.0020.0002.10123] # AEGEAN NUMBER TWO THOUSAND 10124 ; [*1518.0020.0002.10124] # AEGEAN NUMBER THREE THOUSAND 10125 ; [*1519.0020.0002.10125] # AEGEAN NUMBER FOUR THOUSAND 10126 ; [*151A.0020.0002.10126] # AEGEAN NUMBER FIVE THOUSAND 10127 ; [*151B.0020.0002.10127] # AEGEAN NUMBER SIX THOUSAND 10128 ; [*151C.0020.0002.10128] # AEGEAN NUMBER SEVEN THOUSAND 10129 ; [*151D.0020.0002.10129] # AEGEAN NUMBER EIGHT THOUSAND 1012A ; [*151E.0020.0002.1012A] # AEGEAN NUMBER NINE THOUSAND 1012B ; [*151F.0020.0002.1012B] # AEGEAN NUMBER TEN THOUSAND 1012C ; [*1520.0020.0002.1012C] # AEGEAN NUMBER TWENTY THOUSAND 1012D ; [*1521.0020.0002.1012D] # AEGEAN NUMBER THIRTY THOUSAND 1012E ; [*1522.0020.0002.1012E] # AEGEAN NUMBER FORTY THOUSAND 1012F ; [*1523.0020.0002.1012F] # AEGEAN NUMBER FIFTY THOUSAND 10130 ; [*1524.0020.0002.10130] # AEGEAN NUMBER SIXTY THOUSAND 10131 ; [*1525.0020.0002.10131] # AEGEAN NUMBER SEVENTY THOUSAND 10132 ; [*1526.0020.0002.10132] # AEGEAN NUMBER EIGHTY THOUSAND 10133 ; [*1527.0020.0002.10133] # AEGEAN NUMBER NINETY THOUSAND 10137 ; [*0E65.0020.0002.10137] # AEGEAN WEIGHT BASE UNIT 10138 ; [*0E66.0020.0002.10138] # AEGEAN WEIGHT FIRST SUBUNIT 10139 ; [*0E67.0020.0002.10139] # AEGEAN WEIGHT SECOND SUBUNIT 1013A ; [*0E68.0020.0002.1013A] # AEGEAN WEIGHT THIRD SUBUNIT 1013B ; [*0E69.0020.0002.1013B] # AEGEAN WEIGHT FOURTH SUBUNIT 1013C ; [*0E6A.0020.0002.1013C] # AEGEAN DRY MEASURE FIRST SUBUNIT 1013D ; [*0E6B.0020.0002.1013D] # AEGEAN LIQUID MEASURE FIRST SUBUNIT 1013E ; [*0E6C.0020.0002.1013E] # AEGEAN MEASURE SECOND SUBUNIT 1013F ; [*0E6D.0020.0002.1013F] # AEGEAN MEASURE THIRD SUBUNIT 10140 ; [*1528.0020.0002.10140] # GREEK ACROPHONIC ATTIC ONE QUARTER 10141 ; [*1529.0020.0002.10141] # GREEK ACROPHONIC ATTIC ONE HALF 10144 ; [*152A.0020.0002.10144] # GREEK ACROPHONIC ATTIC FIFTY 10145 ; [*152B.0020.0002.10145] # GREEK ACROPHONIC ATTIC FIVE HUNDRED 10146 ; [*152C.0020.0002.10146] # GREEK ACROPHONIC ATTIC FIVE THOUSAND 10147 ; [*152D.0020.0002.10147] # GREEK ACROPHONIC ATTIC FIFTY THOUSAND 10149 ; [*152E.0020.0002.10149] # GREEK ACROPHONIC ATTIC TEN TALENTS 1014A ; [*152F.0020.0002.1014A] # GREEK ACROPHONIC ATTIC FIFTY TALENTS 1014B ; [*1530.0020.0002.1014B] # GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS 1014C ; [*1531.0020.0002.1014C] # GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS 1014D ; [*1532.0020.0002.1014D] # GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS 1014E ; [*1533.0020.0002.1014E] # GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS 10150 ; [*1534.0020.0002.10150] # GREEK ACROPHONIC ATTIC TEN STATERS 10151 ; [*1535.0020.0002.10151] # GREEK ACROPHONIC ATTIC FIFTY STATERS 10152 ; [*1536.0020.0002.10152] # GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS 10153 ; [*1537.0020.0002.10153] # GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS 10154 ; [*1538.0020.0002.10154] # GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS 10155 ; [*1539.0020.0002.10155] # GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS 10156 ; [*153A.0020.0002.10156] # GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS 10157 ; [*153B.0020.0002.10157] # GREEK ACROPHONIC ATTIC TEN MNAS 10160 ; [*153C.0020.0002.10160] # GREEK ACROPHONIC TROEZENIAN TEN 10161 ; [*153D.0020.0002.10161] # GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM 10162 ; [*153E.0020.0002.10162] # GREEK ACROPHONIC HERMIONIAN TEN 10163 ; [*153F.0020.0002.10163] # GREEK ACROPHONIC MESSENIAN TEN 10164 ; [*1540.0020.0002.10164] # GREEK ACROPHONIC THESPIAN TEN 10165 ; [*1541.0020.0002.10165] # GREEK ACROPHONIC THESPIAN THIRTY 10166 ; [*1542.0020.0002.10166] # GREEK ACROPHONIC TROEZENIAN FIFTY 10167 ; [*1543.0020.0002.10167] # GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM 10168 ; [*1544.0020.0002.10168] # GREEK ACROPHONIC HERMIONIAN FIFTY 10169 ; [*1545.0020.0002.10169] # GREEK ACROPHONIC THESPIAN FIFTY 1016A ; [*1546.0020.0002.1016A] # GREEK ACROPHONIC THESPIAN ONE HUNDRED 1016B ; [*1547.0020.0002.1016B] # GREEK ACROPHONIC THESPIAN THREE HUNDRED 1016C ; [*1548.0020.0002.1016C] # GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED 1016D ; [*1549.0020.0002.1016D] # GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED 1016E ; [*154A.0020.0002.1016E] # GREEK ACROPHONIC THESPIAN FIVE HUNDRED 1016F ; [*154B.0020.0002.1016F] # GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED 10170 ; [*154C.0020.0002.10170] # GREEK ACROPHONIC NAXIAN FIVE HUNDRED 10171 ; [*154D.0020.0002.10171] # GREEK ACROPHONIC THESPIAN ONE THOUSAND 10172 ; [*154E.0020.0002.10172] # GREEK ACROPHONIC THESPIAN FIVE THOUSAND 10174 ; [*154F.0020.0002.10174] # GREEK ACROPHONIC STRATIAN FIFTY MNAS 10175 ; [*1550.0020.0002.10175] # GREEK ONE HALF SIGN 10176 ; [*1551.0020.0002.10176] # GREEK ONE HALF SIGN ALTERNATE FORM 10177 ; [*1552.0020.0002.10177] # GREEK TWO THIRDS SIGN 10178 ; [*1553.0020.0002.10178] # GREEK THREE QUARTERS SIGN 10179 ; [*0E6E.0020.0002.10179] # GREEK YEAR SIGN 1017A ; [*0E6F.0020.0002.1017A] # GREEK TALENT SIGN 1017B ; [*0E70.0020.0002.1017B] # GREEK DRACHMA SIGN 1017C ; [*0E71.0020.0002.1017C] # GREEK OBOL SIGN 1017D ; [*0E72.0020.0002.1017D] # GREEK TWO OBOLS SIGN 1017E ; [*0E73.0020.0002.1017E] # GREEK THREE OBOLS SIGN 1017F ; [*0E74.0020.0002.1017F] # GREEK FOUR OBOLS SIGN 10180 ; [*0E75.0020.0002.10180] # GREEK FIVE OBOLS SIGN 10181 ; [*0E76.0020.0002.10181] # GREEK METRETES SIGN 10182 ; [*0E77.0020.0002.10182] # GREEK KYATHOS BASE SIGN 10183 ; [*0E78.0020.0002.10183] # GREEK LITRA SIGN 10184 ; [*0E79.0020.0002.10184] # GREEK OUNKIA SIGN 10185 ; [*0E7A.0020.0002.10185] # GREEK XESTES SIGN 10186 ; [*0E7B.0020.0002.10186] # GREEK ARTABE SIGN 10187 ; [*0E7C.0020.0002.10187] # GREEK AROURA SIGN 10188 ; [*0E7D.0020.0002.10188] # GREEK GRAMMA SIGN 10189 ; [*0E7E.0020.0002.10189] # GREEK TRYBLION BASE SIGN 10190 ; [*0E7F.0020.0002.10190] # ROMAN SEXTANS SIGN 10191 ; [*0E80.0020.0002.10191] # ROMAN UNCIA SIGN 10192 ; [*0E81.0020.0002.10192] # ROMAN SEMUNCIA SIGN 10193 ; [*0E82.0020.0002.10193] # ROMAN SEXTULA SIGN 10194 ; [*0E83.0020.0002.10194] # ROMAN DIMIDIA SEXTULA SIGN 10195 ; [*0E84.0020.0002.10195] # ROMAN SILIQUA SIGN 10196 ; [*0E85.0020.0002.10196] # ROMAN DENARIUS SIGN 10197 ; [*0E86.0020.0002.10197] # ROMAN QUINARIUS SIGN 10198 ; [*0E87.0020.0002.10198] # ROMAN SESTERTIUS SIGN 10199 ; [*0E88.0020.0002.10199] # ROMAN DUPONDIUS SIGN 1019A ; [*0E89.0020.0002.1019A] # ROMAN AS SIGN 1019B ; [*0E8A.0020.0002.1019B] # ROMAN CENTURIAL SIGN 101D0 ; [*0E8B.0020.0002.101D0] # PHAISTOS DISC SIGN PEDESTRIAN 101D1 ; [*0E8C.0020.0002.101D1] # PHAISTOS DISC SIGN PLUMED HEAD 101D2 ; [*0E8D.0020.0002.101D2] # PHAISTOS DISC SIGN TATTOOED HEAD 101D3 ; [*0E8E.0020.0002.101D3] # PHAISTOS DISC SIGN CAPTIVE 101D4 ; [*0E8F.0020.0002.101D4] # PHAISTOS DISC SIGN CHILD 101D5 ; [*0E90.0020.0002.101D5] # PHAISTOS DISC SIGN WOMAN 101D6 ; [*0E91.0020.0002.101D6] # PHAISTOS DISC SIGN HELMET 101D7 ; [*0E92.0020.0002.101D7] # PHAISTOS DISC SIGN GAUNTLET 101D8 ; [*0E93.0020.0002.101D8] # PHAISTOS DISC SIGN TIARA 101D9 ; [*0E94.0020.0002.101D9] # PHAISTOS DISC SIGN ARROW 101DA ; [*0E95.0020.0002.101DA] # PHAISTOS DISC SIGN BOW 101DB ; [*0E96.0020.0002.101DB] # PHAISTOS DISC SIGN SHIELD 101DC ; [*0E97.0020.0002.101DC] # PHAISTOS DISC SIGN CLUB 101DD ; [*0E98.0020.0002.101DD] # PHAISTOS DISC SIGN MANACLES 101DE ; [*0E99.0020.0002.101DE] # PHAISTOS DISC SIGN MATTOCK 101DF ; [*0E9A.0020.0002.101DF] # PHAISTOS DISC SIGN SAW 101E0 ; [*0E9B.0020.0002.101E0] # PHAISTOS DISC SIGN LID 101E1 ; [*0E9C.0020.0002.101E1] # PHAISTOS DISC SIGN BOOMERANG 101E2 ; [*0E9D.0020.0002.101E2] # PHAISTOS DISC SIGN CARPENTRY PLANE 101E3 ; [*0E9E.0020.0002.101E3] # PHAISTOS DISC SIGN DOLIUM 101E4 ; [*0E9F.0020.0002.101E4] # PHAISTOS DISC SIGN COMB 101E5 ; [*0EA0.0020.0002.101E5] # PHAISTOS DISC SIGN SLING 101E6 ; [*0EA1.0020.0002.101E6] # PHAISTOS DISC SIGN COLUMN 101E7 ; [*0EA2.0020.0002.101E7] # PHAISTOS DISC SIGN BEEHIVE 101E8 ; [*0EA3.0020.0002.101E8] # PHAISTOS DISC SIGN SHIP 101E9 ; [*0EA4.0020.0002.101E9] # PHAISTOS DISC SIGN HORN 101EA ; [*0EA5.0020.0002.101EA] # PHAISTOS DISC SIGN HIDE 101EB ; [*0EA6.0020.0002.101EB] # PHAISTOS DISC SIGN BULLS LEG 101EC ; [*0EA7.0020.0002.101EC] # PHAISTOS DISC SIGN CAT 101ED ; [*0EA8.0020.0002.101ED] # PHAISTOS DISC SIGN RAM 101EE ; [*0EA9.0020.0002.101EE] # PHAISTOS DISC SIGN EAGLE 101EF ; [*0EAA.0020.0002.101EF] # PHAISTOS DISC SIGN DOVE 101F0 ; [*0EAB.0020.0002.101F0] # PHAISTOS DISC SIGN TUNNY 101F1 ; [*0EAC.0020.0002.101F1] # PHAISTOS DISC SIGN BEE 101F2 ; [*0EAD.0020.0002.101F2] # PHAISTOS DISC SIGN PLANE TREE 101F3 ; [*0EAE.0020.0002.101F3] # PHAISTOS DISC SIGN VINE 101F4 ; [*0EAF.0020.0002.101F4] # PHAISTOS DISC SIGN PAPYRUS 101F5 ; [*0EB0.0020.0002.101F5] # PHAISTOS DISC SIGN ROSETTE 101F6 ; [*0EB1.0020.0002.101F6] # PHAISTOS DISC SIGN LILY 101F7 ; [*0EB2.0020.0002.101F7] # PHAISTOS DISC SIGN OX BACK 101F8 ; [*0EB3.0020.0002.101F8] # PHAISTOS DISC SIGN FLUTE 101F9 ; [*0EB4.0020.0002.101F9] # PHAISTOS DISC SIGN GRATER 101FA ; [*0EB5.0020.0002.101FA] # PHAISTOS DISC SIGN STRAINER 101FB ; [*0EB6.0020.0002.101FB] # PHAISTOS DISC SIGN SMALL AXE 101FC ; [*0EB7.0020.0002.101FC] # PHAISTOS DISC SIGN WAVY BAND 10322 ; [*1502.0020.0002.10322] # OLD ITALIC NUMERAL TEN 10323 ; [*1503.0020.0002.10323] # OLD ITALIC NUMERAL FIFTY 1039F ; [*02E3.0020.0002.1039F] # UGARITIC WORD DIVIDER 103D0 ; [*02E4.0020.0002.103D0] # OLD PERSIAN WORD DIVIDER 103D3 ; [*1554.0020.0002.103D3] # OLD PERSIAN NUMBER TEN 103D4 ; [*1555.0020.0002.103D4] # OLD PERSIAN NUMBER TWENTY 103D5 ; [*1556.0020.0002.103D5] # OLD PERSIAN NUMBER HUNDRED 10857 ; [*02C4.0020.0002.10857] # IMPERIAL ARAMAIC SECTION SIGN 1085B ; [*155C.0020.0002.1085B] # IMPERIAL ARAMAIC NUMBER TEN 1085C ; [*155D.0020.0002.1085C] # IMPERIAL ARAMAIC NUMBER TWENTY 1085D ; [*155E.0020.0002.1085D] # IMPERIAL ARAMAIC NUMBER ONE HUNDRED 1085E ; [*155F.0020.0002.1085E] # IMPERIAL ARAMAIC NUMBER ONE THOUSAND 1085F ; [*1560.0020.0002.1085F] # IMPERIAL ARAMAIC NUMBER TEN THOUSAND 10917 ; [*1559.0020.0002.10917] # PHOENICIAN NUMBER TEN 10918 ; [*155A.0020.0002.10918] # PHOENICIAN NUMBER TWENTY 10919 ; [*155B.0020.0002.10919] # PHOENICIAN NUMBER ONE HUNDRED 1091F ; [*02E5.0020.0002.1091F] # PHOENICIAN WORD SEPARATOR 1093F ; [*02DF.0020.0002.1093F] # LYDIAN TRIANGULAR MARK 10A44 ; [*1574.0020.0002.10A44] # KHAROSHTHI NUMBER TEN 10A45 ; [*1575.0020.0002.10A45] # KHAROSHTHI NUMBER TWENTY 10A46 ; [*1576.0020.0002.10A46] # KHAROSHTHI NUMBER ONE HUNDRED 10A47 ; [*1577.0020.0002.10A47] # KHAROSHTHI NUMBER ONE THOUSAND 10A50 ; [*0404.0020.0002.10A50] # KHAROSHTHI PUNCTUATION DOT 10A51 ; [*0405.0020.0002.10A51] # KHAROSHTHI PUNCTUATION SMALL CIRCLE 10A52 ; [*0406.0020.0002.10A52] # KHAROSHTHI PUNCTUATION CIRCLE 10A53 ; [*0407.0020.0002.10A53] # KHAROSHTHI PUNCTUATION CRESCENT BAR 10A54 ; [*0408.0020.0002.10A54] # KHAROSHTHI PUNCTUATION MANGALAM 10A55 ; [*0409.0020.0002.10A55] # KHAROSHTHI PUNCTUATION LOTUS 10A56 ; [*02A3.0020.0002.10A56] # KHAROSHTHI PUNCTUATION DANDA 10A57 ; [*02A4.0020.0002.10A57] # KHAROSHTHI PUNCTUATION DOUBLE DANDA 10A58 ; [*040A.0020.0002.10A58] # KHAROSHTHI PUNCTUATION LINES 10A7E ; [*1557.0020.0002.10A7E] # OLD SOUTH ARABIAN NUMBER FIFTY 10A7F ; [*1558.0020.0002.10A7F] # OLD SOUTH ARABIAN NUMERIC INDICATOR 10B39 ; [*040B.0020.0002.10B39] # AVESTAN ABBREVIATION MARK 10B3A ; [*02C5.0020.0002.10B3A] # TINY TWO DOTS OVER ONE DOT PUNCTUATION 10B3B ; [*02C6.0020.0002.10B3B] # SMALL TWO DOTS OVER ONE DOT PUNCTUATION 10B3C ; [*02C7.0020.0002.10B3C] # LARGE TWO DOTS OVER ONE DOT PUNCTUATION 10B3D ; [*02C8.0020.0002.10B3D] # LARGE ONE DOT OVER TWO DOTS PUNCTUATION 10B3E ; [*02C9.0020.0002.10B3E] # LARGE TWO RINGS OVER ONE RING PUNCTUATION 10B3F ; [*02CA.0020.0002.10B3F] # LARGE ONE RING OVER TWO RINGS PUNCTUATION 10B5C ; [*1561.0020.0002.10B5C] # INSCRIPTIONAL PARTHIAN NUMBER TEN 10B5D ; [*1562.0020.0002.10B5D] # INSCRIPTIONAL PARTHIAN NUMBER TWENTY 10B5E ; [*1563.0020.0002.10B5E] # INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED 10B5F ; [*1564.0020.0002.10B5F] # INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND 10B7C ; [*1565.0020.0002.10B7C] # INSCRIPTIONAL PAHLAVI NUMBER TEN 10B7D ; [*1566.0020.0002.10B7D] # INSCRIPTIONAL PAHLAVI NUMBER TWENTY 10B7E ; [*1567.0020.0002.10B7E] # INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED 10B7F ; [*1568.0020.0002.10B7F] # INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND 10E69 ; [*14EB.0020.0002.10E69] # RUMI NUMBER TEN 10E6A ; [*14EC.0020.0002.10E6A] # RUMI NUMBER TWENTY 10E6B ; [*14ED.0020.0002.10E6B] # RUMI NUMBER THIRTY 10E6C ; [*14EE.0020.0002.10E6C] # RUMI NUMBER FORTY 10E6D ; [*14EF.0020.0002.10E6D] # RUMI NUMBER FIFTY 10E6E ; [*14F0.0020.0002.10E6E] # RUMI NUMBER SIXTY 10E6F ; [*14F1.0020.0002.10E6F] # RUMI NUMBER SEVENTY 10E70 ; [*14F2.0020.0002.10E70] # RUMI NUMBER EIGHTY 10E71 ; [*14F3.0020.0002.10E71] # RUMI NUMBER NINETY 10E72 ; [*14F4.0020.0002.10E72] # RUMI NUMBER ONE HUNDRED 10E73 ; [*14F5.0020.0002.10E73] # RUMI NUMBER TWO HUNDRED 10E74 ; [*14F6.0020.0002.10E74] # RUMI NUMBER THREE HUNDRED 10E75 ; [*14F7.0020.0002.10E75] # RUMI NUMBER FOUR HUNDRED 10E76 ; [*14F8.0020.0002.10E76] # RUMI NUMBER FIVE HUNDRED 10E77 ; [*14F9.0020.0002.10E77] # RUMI NUMBER SIX HUNDRED 10E78 ; [*14FA.0020.0002.10E78] # RUMI NUMBER SEVEN HUNDRED 10E79 ; [*14FB.0020.0002.10E79] # RUMI NUMBER EIGHT HUNDRED 10E7A ; [*14FC.0020.0002.10E7A] # RUMI NUMBER NINE HUNDRED 10E7B ; [*14FD.0020.0002.10E7B] # RUMI FRACTION ONE HALF 10E7C ; [*14FE.0020.0002.10E7C] # RUMI FRACTION ONE QUARTER 10E7D ; [*14FF.0020.0002.10E7D] # RUMI FRACTION ONE THIRD 10E7E ; [*1500.0020.0002.10E7E] # RUMI FRACTION TWO THIRDS 11047 ; [*02A5.0020.0002.11047] # BRAHMI DANDA 11048 ; [*02A6.0020.0002.11048] # BRAHMI DOUBLE DANDA 11049 ; [*03FF.0020.0002.11049] # BRAHMI PUNCTUATION DOT 1104A ; [*0400.0020.0002.1104A] # BRAHMI PUNCTUATION DOUBLE DOT 1104B ; [*0401.0020.0002.1104B] # BRAHMI PUNCTUATION LINE 1104C ; [*0402.0020.0002.1104C] # BRAHMI PUNCTUATION CRESCENT BAR 1104D ; [*0403.0020.0002.1104D] # BRAHMI PUNCTUATION LOTUS 1105B ; [*1569.0020.0002.1105B] # BRAHMI NUMBER TEN 1105C ; [*156A.0020.0002.1105C] # BRAHMI NUMBER TWENTY 1105D ; [*156B.0020.0002.1105D] # BRAHMI NUMBER THIRTY 1105E ; [*156C.0020.0002.1105E] # BRAHMI NUMBER FORTY 1105F ; [*156D.0020.0002.1105F] # BRAHMI NUMBER FIFTY 11060 ; [*156E.0020.0002.11060] # BRAHMI NUMBER SIXTY 11061 ; [*156F.0020.0002.11061] # BRAHMI NUMBER SEVENTY 11062 ; [*1570.0020.0002.11062] # BRAHMI NUMBER EIGHTY 11063 ; [*1571.0020.0002.11063] # BRAHMI NUMBER NINETY 11064 ; [*1572.0020.0002.11064] # BRAHMI NUMBER ONE HUNDRED 11065 ; [*1573.0020.0002.11065] # BRAHMI NUMBER ONE THOUSAND 110BB ; [*040C.0020.0002.110BB] # KAITHI ABBREVIATION SIGN 110BC ; [*040D.0020.0002.110BC] # KAITHI ENUMERATION SIGN 110BD ; [.0000.0000.0000.110BD] # KAITHI NUMBER SIGN 110BE ; [*02CB.0020.0002.110BE] # KAITHI SECTION MARK 110BF ; [*02CC.0020.0002.110BF] # KAITHI DOUBLE SECTION MARK 110C0 ; [*02A7.0020.0002.110C0] # KAITHI DANDA 110C1 ; [*02A8.0020.0002.110C1] # KAITHI DOUBLE DANDA 11140 ; [*02CD.0020.0002.11140] # CHAKMA SECTION MARK 11141 ; [*02A9.0020.0002.11141] # CHAKMA DANDA 11142 ; [*02AA.0020.0002.11142] # CHAKMA DOUBLE DANDA 11143 ; [*0270.0020.0002.11143] # CHAKMA QUESTION MARK 111C5 ; [*02AB.0020.0002.111C5] # SHARADA DANDA 111C6 ; [*02AC.0020.0002.111C6] # SHARADA DOUBLE DANDA 111C7 ; [*040E.0020.0002.111C7] # SHARADA ABBREVIATION SIGN 111C8 ; [*02CE.0020.0002.111C8] # SHARADA SEPARATOR 12432 ; [*1578.0020.0002.12432] # CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH 12433 ; [*1579.0020.0002.12433] # CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN 12456 ; [*157A.0020.0002.12456] # CUNEIFORM NUMERIC SIGN NIGIDAMIN 12457 ; [*157B.0020.0002.12457] # CUNEIFORM NUMERIC SIGN NIGIDAESH 1245A ; [*157C.0020.0002.1245A] # CUNEIFORM NUMERIC SIGN ONE THIRD DISH 1245B ; [*157D.0020.0002.1245B] # CUNEIFORM NUMERIC SIGN TWO THIRDS DISH 1245C ; [*157E.0020.0002.1245C] # CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH 1245D ; [*157F.0020.0002.1245D] # CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A 1245E ; [*1580.0020.0002.1245E] # CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A 1245F ; [*1581.0020.0002.1245F] # CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH 12460 ; [*1582.0020.0002.12460] # CUNEIFORM NUMERIC SIGN ONE QUARTER ASH 12461 ; [*1583.0020.0002.12461] # CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH 12462 ; [*1584.0020.0002.12462] # CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER 12470 ; [*02E6.0020.0002.12470] # CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER 12471 ; [*02E7.0020.0002.12471] # CUNEIFORM PUNCTUATION SIGN VERTICAL COLON 12472 ; [*02E8.0020.0002.12472] # CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON 12473 ; [*02E9.0020.0002.12473] # CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON 1D000 ; [*0EB8.0020.0002.1D000] # BYZANTINE MUSICAL SYMBOL PSILI 1D001 ; [*0EB9.0020.0002.1D001] # BYZANTINE MUSICAL SYMBOL DASEIA 1D002 ; [*0EBA.0020.0002.1D002] # BYZANTINE MUSICAL SYMBOL PERISPOMENI 1D003 ; [*0EBB.0020.0002.1D003] # BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON 1D004 ; [*0EBC.0020.0002.1D004] # BYZANTINE MUSICAL SYMBOL OXEIA DIPLI 1D005 ; [*0EBD.0020.0002.1D005] # BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON 1D006 ; [*0EBE.0020.0002.1D006] # BYZANTINE MUSICAL SYMBOL VAREIA DIPLI 1D007 ; [*0EBF.0020.0002.1D007] # BYZANTINE MUSICAL SYMBOL KATHISTI 1D008 ; [*0EC0.0020.0002.1D008] # BYZANTINE MUSICAL SYMBOL SYRMATIKI 1D009 ; [*0EC1.0020.0002.1D009] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI 1D00A ; [*0EC2.0020.0002.1D00A] # BYZANTINE MUSICAL SYMBOL YPOKRISIS 1D00B ; [*0EC3.0020.0002.1D00B] # BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI 1D00C ; [*0EC4.0020.0002.1D00C] # BYZANTINE MUSICAL SYMBOL KREMASTI 1D00D ; [*0EC5.0020.0002.1D00D] # BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON 1D00E ; [*0EC6.0020.0002.1D00E] # BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON 1D00F ; [*0EC7.0020.0002.1D00F] # BYZANTINE MUSICAL SYMBOL TELEIA 1D010 ; [*0EC8.0020.0002.1D010] # BYZANTINE MUSICAL SYMBOL KENTIMATA 1D011 ; [*0EC9.0020.0002.1D011] # BYZANTINE MUSICAL SYMBOL APOSTROFOS 1D012 ; [*0ECA.0020.0002.1D012] # BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI 1D013 ; [*0ECB.0020.0002.1D013] # BYZANTINE MUSICAL SYMBOL SYNEVMA 1D014 ; [*0ECC.0020.0002.1D014] # BYZANTINE MUSICAL SYMBOL THITA 1D015 ; [*0ECD.0020.0002.1D015] # BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION 1D016 ; [*0ECE.0020.0002.1D016] # BYZANTINE MUSICAL SYMBOL GORGON ARCHAION 1D017 ; [*0ECF.0020.0002.1D017] # BYZANTINE MUSICAL SYMBOL PSILON 1D018 ; [*0ED0.0020.0002.1D018] # BYZANTINE MUSICAL SYMBOL CHAMILON 1D019 ; [*0ED1.0020.0002.1D019] # BYZANTINE MUSICAL SYMBOL VATHY 1D01A ; [*0ED2.0020.0002.1D01A] # BYZANTINE MUSICAL SYMBOL ISON ARCHAION 1D01B ; [*0ED3.0020.0002.1D01B] # BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION 1D01C ; [*0ED4.0020.0002.1D01C] # BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION 1D01D ; [*0ED5.0020.0002.1D01D] # BYZANTINE MUSICAL SYMBOL SAXIMATA 1D01E ; [*0ED6.0020.0002.1D01E] # BYZANTINE MUSICAL SYMBOL PARICHON 1D01F ; [*0ED7.0020.0002.1D01F] # BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA 1D020 ; [*0ED8.0020.0002.1D020] # BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION 1D021 ; [*0ED9.0020.0002.1D021] # BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION 1D022 ; [*0EDA.0020.0002.1D022] # BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION 1D023 ; [*0EDB.0020.0002.1D023] # BYZANTINE MUSICAL SYMBOL APOTHEMA 1D024 ; [*0EDC.0020.0002.1D024] # BYZANTINE MUSICAL SYMBOL KLASMA 1D025 ; [*0EDD.0020.0002.1D025] # BYZANTINE MUSICAL SYMBOL REVMA 1D026 ; [*0EDE.0020.0002.1D026] # BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION 1D027 ; [*0EDF.0020.0002.1D027] # BYZANTINE MUSICAL SYMBOL TINAGMA 1D028 ; [*0EE0.0020.0002.1D028] # BYZANTINE MUSICAL SYMBOL ANATRICHISMA 1D029 ; [*0EE1.0020.0002.1D029] # BYZANTINE MUSICAL SYMBOL SEISMA 1D02A ; [*0EE2.0020.0002.1D02A] # BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION 1D02B ; [*0EE3.0020.0002.1D02B] # BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU 1D02C ; [*0EE4.0020.0002.1D02C] # BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION 1D02D ; [*0EE5.0020.0002.1D02D] # BYZANTINE MUSICAL SYMBOL THEMA 1D02E ; [*0EE6.0020.0002.1D02E] # BYZANTINE MUSICAL SYMBOL LEMOI 1D02F ; [*0EE7.0020.0002.1D02F] # BYZANTINE MUSICAL SYMBOL DYO 1D030 ; [*0EE8.0020.0002.1D030] # BYZANTINE MUSICAL SYMBOL TRIA 1D031 ; [*0EE9.0020.0002.1D031] # BYZANTINE MUSICAL SYMBOL TESSERA 1D032 ; [*0EEA.0020.0002.1D032] # BYZANTINE MUSICAL SYMBOL KRATIMATA 1D033 ; [*0EEB.0020.0002.1D033] # BYZANTINE MUSICAL SYMBOL APESO EXO NEO 1D034 ; [*0EEC.0020.0002.1D034] # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION 1D035 ; [*0EED.0020.0002.1D035] # BYZANTINE MUSICAL SYMBOL IMIFTHORA 1D036 ; [*0EEE.0020.0002.1D036] # BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION 1D037 ; [*0EEF.0020.0002.1D037] # BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON 1D038 ; [*0EF0.0020.0002.1D038] # BYZANTINE MUSICAL SYMBOL PELASTON 1D039 ; [*0EF1.0020.0002.1D039] # BYZANTINE MUSICAL SYMBOL PSIFISTON 1D03A ; [*0EF2.0020.0002.1D03A] # BYZANTINE MUSICAL SYMBOL KONTEVMA 1D03B ; [*0EF3.0020.0002.1D03B] # BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION 1D03C ; [*0EF4.0020.0002.1D03C] # BYZANTINE MUSICAL SYMBOL RAPISMA 1D03D ; [*0EF5.0020.0002.1D03D] # BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION 1D03E ; [*0EF6.0020.0002.1D03E] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION 1D03F ; [*0EF7.0020.0002.1D03F] # BYZANTINE MUSICAL SYMBOL ICHADIN 1D040 ; [*0EF8.0020.0002.1D040] # BYZANTINE MUSICAL SYMBOL NANA 1D041 ; [*0EF9.0020.0002.1D041] # BYZANTINE MUSICAL SYMBOL PETASMA 1D042 ; [*0EFA.0020.0002.1D042] # BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO 1D043 ; [*0EFB.0020.0002.1D043] # BYZANTINE MUSICAL SYMBOL TROMIKON ALLO 1D044 ; [*0EFC.0020.0002.1D044] # BYZANTINE MUSICAL SYMBOL STRAGGISMATA 1D045 ; [*0EFD.0020.0002.1D045] # BYZANTINE MUSICAL SYMBOL GRONTHISMATA 1D046 ; [*0EFE.0020.0002.1D046] # BYZANTINE MUSICAL SYMBOL ISON NEO 1D047 ; [*0EFF.0020.0002.1D047] # BYZANTINE MUSICAL SYMBOL OLIGON NEO 1D048 ; [*0F00.0020.0002.1D048] # BYZANTINE MUSICAL SYMBOL OXEIA NEO 1D049 ; [*0F01.0020.0002.1D049] # BYZANTINE MUSICAL SYMBOL PETASTI 1D04A ; [*0F02.0020.0002.1D04A] # BYZANTINE MUSICAL SYMBOL KOUFISMA 1D04B ; [*0F03.0020.0002.1D04B] # BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA 1D04C ; [*0F04.0020.0002.1D04C] # BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA 1D04D ; [*0F05.0020.0002.1D04D] # BYZANTINE MUSICAL SYMBOL PELASTON NEO 1D04E ; [*0F06.0020.0002.1D04E] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO 1D04F ; [*0F07.0020.0002.1D04F] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO 1D050 ; [*0F08.0020.0002.1D050] # BYZANTINE MUSICAL SYMBOL YPSILI 1D051 ; [*0F09.0020.0002.1D051] # BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO 1D052 ; [*0F0A.0020.0002.1D052] # BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO 1D053 ; [*0F0B.0020.0002.1D053] # BYZANTINE MUSICAL SYMBOL YPORROI 1D054 ; [*0F0C.0020.0002.1D054] # BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON 1D055 ; [*0F0D.0020.0002.1D055] # BYZANTINE MUSICAL SYMBOL ELAFRON 1D056 ; [*0F0E.0020.0002.1D056] # BYZANTINE MUSICAL SYMBOL CHAMILI 1D057 ; [*0F0F.0020.0002.1D057] # BYZANTINE MUSICAL SYMBOL MIKRON ISON 1D058 ; [*0F10.0020.0002.1D058] # BYZANTINE MUSICAL SYMBOL VAREIA NEO 1D059 ; [*0F11.0020.0002.1D059] # BYZANTINE MUSICAL SYMBOL PIASMA NEO 1D05A ; [*0F12.0020.0002.1D05A] # BYZANTINE MUSICAL SYMBOL PSIFISTON NEO 1D05B ; [*0F13.0020.0002.1D05B] # BYZANTINE MUSICAL SYMBOL OMALON 1D05C ; [*0F14.0020.0002.1D05C] # BYZANTINE MUSICAL SYMBOL ANTIKENOMA 1D05D ; [*0F15.0020.0002.1D05D] # BYZANTINE MUSICAL SYMBOL LYGISMA 1D05E ; [*0F16.0020.0002.1D05E] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO 1D05F ; [*0F17.0020.0002.1D05F] # BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO 1D060 ; [*0F18.0020.0002.1D060] # BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA 1D061 ; [*0F19.0020.0002.1D061] # BYZANTINE MUSICAL SYMBOL KYLISMA 1D062 ; [*0F1A.0020.0002.1D062] # BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA 1D063 ; [*0F1B.0020.0002.1D063] # BYZANTINE MUSICAL SYMBOL TROMIKON NEO 1D064 ; [*0F1C.0020.0002.1D064] # BYZANTINE MUSICAL SYMBOL EKSTREPTON 1D065 ; [*0F1D.0020.0002.1D065] # BYZANTINE MUSICAL SYMBOL SYNAGMA NEO 1D066 ; [*0F1E.0020.0002.1D066] # BYZANTINE MUSICAL SYMBOL SYRMA 1D067 ; [*0F1F.0020.0002.1D067] # BYZANTINE MUSICAL SYMBOL CHOREVMA NEO 1D068 ; [*0F20.0020.0002.1D068] # BYZANTINE MUSICAL SYMBOL EPEGERMA 1D069 ; [*0F21.0020.0002.1D069] # BYZANTINE MUSICAL SYMBOL SEISMA NEO 1D06A ; [*0F22.0020.0002.1D06A] # BYZANTINE MUSICAL SYMBOL XIRON KLASMA 1D06B ; [*0F23.0020.0002.1D06B] # BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON 1D06C ; [*0F24.0020.0002.1D06C] # BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA 1D06D ; [*0F25.0020.0002.1D06D] # BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA 1D06E ; [*0F26.0020.0002.1D06E] # BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA 1D06F ; [*0F27.0020.0002.1D06F] # BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA 1D070 ; [*0F28.0020.0002.1D070] # BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA 1D071 ; [*0F29.0020.0002.1D071] # BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA 1D072 ; [*0F2A.0020.0002.1D072] # BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON 1D073 ; [*0F2B.0020.0002.1D073] # BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON 1D074 ; [*0F2C.0020.0002.1D074] # BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON 1D075 ; [*0F2D.0020.0002.1D075] # BYZANTINE MUSICAL SYMBOL OYRANISMA NEO 1D076 ; [*0F2E.0020.0002.1D076] # BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO 1D077 ; [*0F2F.0020.0002.1D077] # BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO 1D078 ; [*0F30.0020.0002.1D078] # BYZANTINE MUSICAL SYMBOL THEMA APLOUN 1D079 ; [*0F31.0020.0002.1D079] # BYZANTINE MUSICAL SYMBOL THES KAI APOTHES 1D07A ; [*0F32.0020.0002.1D07A] # BYZANTINE MUSICAL SYMBOL KATAVASMA 1D07B ; [*0F33.0020.0002.1D07B] # BYZANTINE MUSICAL SYMBOL ENDOFONON 1D07C ; [*0F34.0020.0002.1D07C] # BYZANTINE MUSICAL SYMBOL YFEN KATO 1D07D ; [*0F35.0020.0002.1D07D] # BYZANTINE MUSICAL SYMBOL YFEN ANO 1D07E ; [*0F36.0020.0002.1D07E] # BYZANTINE MUSICAL SYMBOL STAVROS 1D07F ; [*0F37.0020.0002.1D07F] # BYZANTINE MUSICAL SYMBOL KLASMA ANO 1D080 ; [*0F38.0020.0002.1D080] # BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION 1D081 ; [*0F39.0020.0002.1D081] # BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION 1D082 ; [*0F3A.0020.0002.1D082] # BYZANTINE MUSICAL SYMBOL KRATIMA ALLO 1D083 ; [*0F3B.0020.0002.1D083] # BYZANTINE MUSICAL SYMBOL KRATIMA NEO 1D084 ; [*0F3C.0020.0002.1D084] # BYZANTINE MUSICAL SYMBOL APODERMA NEO 1D085 ; [*0F3D.0020.0002.1D085] # BYZANTINE MUSICAL SYMBOL APLI 1D086 ; [*0F3E.0020.0002.1D086] # BYZANTINE MUSICAL SYMBOL DIPLI 1D087 ; [*0F3F.0020.0002.1D087] # BYZANTINE MUSICAL SYMBOL TRIPLI 1D088 ; [*0F40.0020.0002.1D088] # BYZANTINE MUSICAL SYMBOL TETRAPLI 1D089 ; [*0F41.0020.0002.1D089] # BYZANTINE MUSICAL SYMBOL KORONIS 1D08A ; [*0F42.0020.0002.1D08A] # BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU 1D08B ; [*0F43.0020.0002.1D08B] # BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON 1D08C ; [*0F44.0020.0002.1D08C] # BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON 1D08D ; [*0F45.0020.0002.1D08D] # BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON 1D08E ; [*0F46.0020.0002.1D08E] # BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU 1D08F ; [*0F47.0020.0002.1D08F] # BYZANTINE MUSICAL SYMBOL GORGON NEO ANO 1D090 ; [*0F48.0020.0002.1D090] # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA 1D091 ; [*0F49.0020.0002.1D091] # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA 1D092 ; [*0F4A.0020.0002.1D092] # BYZANTINE MUSICAL SYMBOL DIGORGON 1D093 ; [*0F4B.0020.0002.1D093] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO 1D094 ; [*0F4C.0020.0002.1D094] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO 1D095 ; [*0F4D.0020.0002.1D095] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA 1D096 ; [*0F4E.0020.0002.1D096] # BYZANTINE MUSICAL SYMBOL TRIGORGON 1D097 ; [*0F4F.0020.0002.1D097] # BYZANTINE MUSICAL SYMBOL ARGON 1D098 ; [*0F50.0020.0002.1D098] # BYZANTINE MUSICAL SYMBOL IMIDIARGON 1D099 ; [*0F51.0020.0002.1D099] # BYZANTINE MUSICAL SYMBOL DIARGON 1D09A ; [*0F52.0020.0002.1D09A] # BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI 1D09B ; [*0F53.0020.0002.1D09B] # BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI 1D09C ; [*0F54.0020.0002.1D09C] # BYZANTINE MUSICAL SYMBOL AGOGI ARGI 1D09D ; [*0F55.0020.0002.1D09D] # BYZANTINE MUSICAL SYMBOL AGOGI METRIA 1D09E ; [*0F56.0020.0002.1D09E] # BYZANTINE MUSICAL SYMBOL AGOGI MESI 1D09F ; [*0F57.0020.0002.1D09F] # BYZANTINE MUSICAL SYMBOL AGOGI GORGI 1D0A0 ; [*0F58.0020.0002.1D0A0] # BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI 1D0A1 ; [*0F59.0020.0002.1D0A1] # BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI 1D0A2 ; [*0F5A.0020.0002.1D0A2] # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS 1D0A3 ; [*0F5B.0020.0002.1D0A3] # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS 1D0A4 ; [*0F5C.0020.0002.1D0A4] # BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS 1D0A5 ; [*0F5D.0020.0002.1D0A5] # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS 1D0A6 ; [*0F5E.0020.0002.1D0A6] # BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS 1D0A7 ; [*0F5F.0020.0002.1D0A7] # BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS 1D0A8 ; [*0F60.0020.0002.1D0A8] # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS 1D0A9 ; [*0F61.0020.0002.1D0A9] # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS 1D0AA ; [*0F62.0020.0002.1D0AA] # BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS 1D0AB ; [*0F63.0020.0002.1D0AB] # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS 1D0AC ; [*0F64.0020.0002.1D0AC] # BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS 1D0AD ; [*0F65.0020.0002.1D0AD] # BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS 1D0AE ; [*0F66.0020.0002.1D0AE] # BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS 1D0AF ; [*0F67.0020.0002.1D0AF] # BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS 1D0B0 ; [*0F68.0020.0002.1D0B0] # BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS 1D0B1 ; [*0F69.0020.0002.1D0B1] # BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS 1D0B2 ; [*0F6A.0020.0002.1D0B2] # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS 1D0B3 ; [*0F6B.0020.0002.1D0B3] # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS 1D0B4 ; [*0F6C.0020.0002.1D0B4] # BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN 1D0B5 ; [*0F6D.0020.0002.1D0B5] # BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN 1D0B6 ; [*0F6E.0020.0002.1D0B6] # BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU 1D0B7 ; [*0F6F.0020.0002.1D0B7] # BYZANTINE MUSICAL SYMBOL IMIFONON 1D0B8 ; [*0F70.0020.0002.1D0B8] # BYZANTINE MUSICAL SYMBOL IMIFTHORON 1D0B9 ; [*0F71.0020.0002.1D0B9] # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU 1D0BA ; [*0F72.0020.0002.1D0BA] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA 1D0BB ; [*0F73.0020.0002.1D0BB] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA 1D0BC ; [*0F74.0020.0002.1D0BC] # BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS 1D0BD ; [*0F75.0020.0002.1D0BD] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI 1D0BE ; [*0F76.0020.0002.1D0BE] # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI 1D0BF ; [*0F77.0020.0002.1D0BF] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE 1D0C0 ; [*0F78.0020.0002.1D0C0] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO 1D0C1 ; [*0F79.0020.0002.1D0C1] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO 1D0C2 ; [*0F7A.0020.0002.1D0C2] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO 1D0C3 ; [*0F7B.0020.0002.1D0C3] # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS 1D0C4 ; [*0F7C.0020.0002.1D0C4] # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS 1D0C5 ; [*0F7D.0020.0002.1D0C5] # BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS 1D0C6 ; [*0F7E.0020.0002.1D0C6] # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI 1D0C7 ; [*0F7F.0020.0002.1D0C7] # BYZANTINE MUSICAL SYMBOL FTHORA NENANO 1D0C8 ; [*0F80.0020.0002.1D0C8] # BYZANTINE MUSICAL SYMBOL CHROA ZYGOS 1D0C9 ; [*0F81.0020.0002.1D0C9] # BYZANTINE MUSICAL SYMBOL CHROA KLITON 1D0CA ; [*0F82.0020.0002.1D0CA] # BYZANTINE MUSICAL SYMBOL CHROA SPATHI 1D0CB ; [*0F83.0020.0002.1D0CB] # BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION 1D0CC ; [*0F84.0020.0002.1D0CC] # BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA 1D0CD ; [*0F85.0020.0002.1D0CD] # BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION 1D0CE ; [*0F86.0020.0002.1D0CE] # BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION 1D0CF ; [*0F87.0020.0002.1D0CF] # BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION 1D0D0 ; [*0F88.0020.0002.1D0D0] # BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA 1D0D1 ; [*0F89.0020.0002.1D0D1] # BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA 1D0D2 ; [*0F8A.0020.0002.1D0D2] # BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA 1D0D3 ; [*0F8B.0020.0002.1D0D3] # BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA 1D0D4 ; [*0F8C.0020.0002.1D0D4] # BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA 1D0D5 ; [*0F8D.0020.0002.1D0D5] # BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA 1D0D6 ; [*0F8E.0020.0002.1D0D6] # BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA 1D0D7 ; [*0F8F.0020.0002.1D0D7] # BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA 1D0D8 ; [*0F90.0020.0002.1D0D8] # BYZANTINE MUSICAL SYMBOL GENIKI DIESIS 1D0D9 ; [*0F91.0020.0002.1D0D9] # BYZANTINE MUSICAL SYMBOL GENIKI YFESIS 1D0DA ; [*0F92.0020.0002.1D0DA] # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI 1D0DB ; [*0F93.0020.0002.1D0DB] # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI 1D0DC ; [*0F94.0020.0002.1D0DC] # BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI 1D0DD ; [*0F95.0020.0002.1D0DD] # BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS 1D0DE ; [*0F96.0020.0002.1D0DE] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS 1D0DF ; [*0F97.0020.0002.1D0DF] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU 1D0E0 ; [*0F98.0020.0002.1D0E0] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU 1D0E1 ; [*0F99.0020.0002.1D0E1] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU 1D0E2 ; [*0F9A.0020.0002.1D0E2] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS 1D0E3 ; [*0F9B.0020.0002.1D0E3] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU 1D0E4 ; [*0F9C.0020.0002.1D0E4] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU 1D0E5 ; [*0F9D.0020.0002.1D0E5] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU 1D0E6 ; [*0F9E.0020.0002.1D0E6] # BYZANTINE MUSICAL SYMBOL DIGRAMMA GG 1D0E7 ; [*0F9F.0020.0002.1D0E7] # BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU 1D0E8 ; [*0FA0.0020.0002.1D0E8] # BYZANTINE MUSICAL SYMBOL STIGMA 1D0E9 ; [*0FA1.0020.0002.1D0E9] # BYZANTINE MUSICAL SYMBOL ARKTIKO PA 1D0EA ; [*0FA2.0020.0002.1D0EA] # BYZANTINE MUSICAL SYMBOL ARKTIKO VOU 1D0EB ; [*0FA3.0020.0002.1D0EB] # BYZANTINE MUSICAL SYMBOL ARKTIKO GA 1D0EC ; [*0FA4.0020.0002.1D0EC] # BYZANTINE MUSICAL SYMBOL ARKTIKO DI 1D0ED ; [*0FA5.0020.0002.1D0ED] # BYZANTINE MUSICAL SYMBOL ARKTIKO KE 1D0EE ; [*0FA6.0020.0002.1D0EE] # BYZANTINE MUSICAL SYMBOL ARKTIKO ZO 1D0EF ; [*0FA7.0020.0002.1D0EF] # BYZANTINE MUSICAL SYMBOL ARKTIKO NI 1D0F0 ; [*0FA8.0020.0002.1D0F0] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO 1D0F1 ; [*0FA9.0020.0002.1D0F1] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO 1D0F2 ; [*0FAA.0020.0002.1D0F2] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO 1D0F3 ; [*0FAB.0020.0002.1D0F3] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO 1D0F4 ; [*0FAC.0020.0002.1D0F4] # BYZANTINE MUSICAL SYMBOL KLASMA KATO 1D0F5 ; [*0FAD.0020.0002.1D0F5] # BYZANTINE MUSICAL SYMBOL GORGON NEO KATO 1D100 ; [*0FAE.0020.0002.1D100] # MUSICAL SYMBOL SINGLE BARLINE 1D101 ; [*0FAF.0020.0002.1D101] # MUSICAL SYMBOL DOUBLE BARLINE 1D102 ; [*0FB0.0020.0002.1D102] # MUSICAL SYMBOL FINAL BARLINE 1D103 ; [*0FB1.0020.0002.1D103] # MUSICAL SYMBOL REVERSE FINAL BARLINE 1D104 ; [*0FB2.0020.0002.1D104] # MUSICAL SYMBOL DASHED BARLINE 1D105 ; [*0FB3.0020.0002.1D105] # MUSICAL SYMBOL SHORT BARLINE 1D106 ; [*0FB4.0020.0002.1D106] # MUSICAL SYMBOL LEFT REPEAT SIGN 1D107 ; [*0FB5.0020.0002.1D107] # MUSICAL SYMBOL RIGHT REPEAT SIGN 1D108 ; [*0FB6.0020.0002.1D108] # MUSICAL SYMBOL REPEAT DOTS 1D109 ; [*0FB7.0020.0002.1D109] # MUSICAL SYMBOL DAL SEGNO 1D10A ; [*0FB8.0020.0002.1D10A] # MUSICAL SYMBOL DA CAPO 1D10B ; [*0FB9.0020.0002.1D10B] # MUSICAL SYMBOL SEGNO 1D10C ; [*0FBA.0020.0002.1D10C] # MUSICAL SYMBOL CODA 1D10D ; [*0FBB.0020.0002.1D10D] # MUSICAL SYMBOL REPEATED FIGURE-1 1D10E ; [*0FBC.0020.0002.1D10E] # MUSICAL SYMBOL REPEATED FIGURE-2 1D10F ; [*0FBD.0020.0002.1D10F] # MUSICAL SYMBOL REPEATED FIGURE-3 1D110 ; [*0FBE.0020.0002.1D110] # MUSICAL SYMBOL FERMATA 1D111 ; [*0FBF.0020.0002.1D111] # MUSICAL SYMBOL FERMATA BELOW 1D112 ; [*0FC0.0020.0002.1D112] # MUSICAL SYMBOL BREATH MARK 1D113 ; [*0FC1.0020.0002.1D113] # MUSICAL SYMBOL CAESURA 1D114 ; [*0FC2.0020.0002.1D114] # MUSICAL SYMBOL BRACE 1D115 ; [*0FC3.0020.0002.1D115] # MUSICAL SYMBOL BRACKET 1D116 ; [*0FC4.0020.0002.1D116] # MUSICAL SYMBOL ONE-LINE STAFF 1D117 ; [*0FC5.0020.0002.1D117] # MUSICAL SYMBOL TWO-LINE STAFF 1D118 ; [*0FC6.0020.0002.1D118] # MUSICAL SYMBOL THREE-LINE STAFF 1D119 ; [*0FC7.0020.0002.1D119] # MUSICAL SYMBOL FOUR-LINE STAFF 1D11A ; [*0FC8.0020.0002.1D11A] # MUSICAL SYMBOL FIVE-LINE STAFF 1D11B ; [*0FC9.0020.0002.1D11B] # MUSICAL SYMBOL SIX-LINE STAFF 1D11C ; [*0FCA.0020.0002.1D11C] # MUSICAL SYMBOL SIX-STRING FRETBOARD 1D11D ; [*0FCB.0020.0002.1D11D] # MUSICAL SYMBOL FOUR-STRING FRETBOARD 1D11E ; [*0FCC.0020.0002.1D11E] # MUSICAL SYMBOL G CLEF 1D11F ; [*0FCD.0020.0002.1D11F] # MUSICAL SYMBOL G CLEF OTTAVA ALTA 1D120 ; [*0FCE.0020.0002.1D120] # MUSICAL SYMBOL G CLEF OTTAVA BASSA 1D121 ; [*0FCF.0020.0002.1D121] # MUSICAL SYMBOL C CLEF 1D122 ; [*0FD0.0020.0002.1D122] # MUSICAL SYMBOL F CLEF 1D123 ; [*0FD1.0020.0002.1D123] # MUSICAL SYMBOL F CLEF OTTAVA ALTA 1D124 ; [*0FD2.0020.0002.1D124] # MUSICAL SYMBOL F CLEF OTTAVA BASSA 1D125 ; [*0FD3.0020.0002.1D125] # MUSICAL SYMBOL DRUM CLEF-1 1D126 ; [*0FD4.0020.0002.1D126] # MUSICAL SYMBOL DRUM CLEF-2 1D129 ; [*0FE8.0020.0002.1D129] # MUSICAL SYMBOL MULTIPLE MEASURE REST 1D12A ; [*0FD8.0020.0002.1D12A] # MUSICAL SYMBOL DOUBLE SHARP 1D12B ; [*0FD9.0020.0002.1D12B] # MUSICAL SYMBOL DOUBLE FLAT 1D12C ; [*0FDA.0020.0002.1D12C] # MUSICAL SYMBOL FLAT UP 1D12D ; [*0FDB.0020.0002.1D12D] # MUSICAL SYMBOL FLAT DOWN 1D12E ; [*0FDC.0020.0002.1D12E] # MUSICAL SYMBOL NATURAL UP 1D12F ; [*0FDD.0020.0002.1D12F] # MUSICAL SYMBOL NATURAL DOWN 1D130 ; [*0FDE.0020.0002.1D130] # MUSICAL SYMBOL SHARP UP 1D131 ; [*0FDF.0020.0002.1D131] # MUSICAL SYMBOL SHARP DOWN 1D132 ; [*0FE0.0020.0002.1D132] # MUSICAL SYMBOL QUARTER TONE SHARP 1D133 ; [*0FE1.0020.0002.1D133] # MUSICAL SYMBOL QUARTER TONE FLAT 1D134 ; [*0FE2.0020.0002.1D134] # MUSICAL SYMBOL COMMON TIME 1D135 ; [*0FE3.0020.0002.1D135] # MUSICAL SYMBOL CUT TIME 1D136 ; [*0FE4.0020.0002.1D136] # MUSICAL SYMBOL OTTAVA ALTA 1D137 ; [*0FE5.0020.0002.1D137] # MUSICAL SYMBOL OTTAVA BASSA 1D138 ; [*0FE6.0020.0002.1D138] # MUSICAL SYMBOL QUINDICESIMA ALTA 1D139 ; [*0FE7.0020.0002.1D139] # MUSICAL SYMBOL QUINDICESIMA BASSA 1D13A ; [*0FE9.0020.0002.1D13A] # MUSICAL SYMBOL MULTI REST 1D13B ; [*0FEA.0020.0002.1D13B] # MUSICAL SYMBOL WHOLE REST 1D13C ; [*0FEB.0020.0002.1D13C] # MUSICAL SYMBOL HALF REST 1D13D ; [*0FEC.0020.0002.1D13D] # MUSICAL SYMBOL QUARTER REST 1D13E ; [*0FED.0020.0002.1D13E] # MUSICAL SYMBOL EIGHTH REST 1D13F ; [*0FEE.0020.0002.1D13F] # MUSICAL SYMBOL SIXTEENTH REST 1D140 ; [*0FEF.0020.0002.1D140] # MUSICAL SYMBOL THIRTY-SECOND REST 1D141 ; [*0FF0.0020.0002.1D141] # MUSICAL SYMBOL SIXTY-FOURTH REST 1D142 ; [*0FF1.0020.0002.1D142] # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST 1D143 ; [*0FF2.0020.0002.1D143] # MUSICAL SYMBOL X NOTEHEAD 1D144 ; [*0FF3.0020.0002.1D144] # MUSICAL SYMBOL PLUS NOTEHEAD 1D145 ; [*0FF4.0020.0002.1D145] # MUSICAL SYMBOL CIRCLE X NOTEHEAD 1D146 ; [*0FF5.0020.0002.1D146] # MUSICAL SYMBOL SQUARE NOTEHEAD WHITE 1D147 ; [*0FF6.0020.0002.1D147] # MUSICAL SYMBOL SQUARE NOTEHEAD BLACK 1D148 ; [*0FF7.0020.0002.1D148] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE 1D149 ; [*0FF8.0020.0002.1D149] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK 1D14A ; [*0FF9.0020.0002.1D14A] # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE 1D14B ; [*0FFA.0020.0002.1D14B] # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK 1D14C ; [*0FFB.0020.0002.1D14C] # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE 1D14D ; [*0FFC.0020.0002.1D14D] # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK 1D14E ; [*0FFD.0020.0002.1D14E] # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE 1D14F ; [*0FFE.0020.0002.1D14F] # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK 1D150 ; [*0FFF.0020.0002.1D150] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE 1D151 ; [*1000.0020.0002.1D151] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK 1D152 ; [*1001.0020.0002.1D152] # MUSICAL SYMBOL MOON NOTEHEAD WHITE 1D153 ; [*1002.0020.0002.1D153] # MUSICAL SYMBOL MOON NOTEHEAD BLACK 1D154 ; [*1003.0020.0002.1D154] # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE 1D155 ; [*1004.0020.0002.1D155] # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK 1D156 ; [*1005.0020.0002.1D156] # MUSICAL SYMBOL PARENTHESIS NOTEHEAD 1D157 ; [*1006.0020.0002.1D157] # MUSICAL SYMBOL VOID NOTEHEAD 1D158 ; [*1007.0020.0002.1D158] # MUSICAL SYMBOL NOTEHEAD BLACK 1D159 ; [*1008.0020.0002.1D159] # MUSICAL SYMBOL NULL NOTEHEAD 1D15A ; [*1009.0020.0002.1D15A] # MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE 1D15B ; [*100A.0020.0002.1D15B] # MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK 1D15C ; [*100B.0020.0002.1D15C] # MUSICAL SYMBOL BREVE 1D15D ; [*100C.0020.0002.1D15D] # MUSICAL SYMBOL WHOLE NOTE 1D15E ; [*1006.0020.0002.1D157][.0000.0000.0000.1D165] # MUSICAL SYMBOL HALF NOTE 1D15F ; [*1007.0020.0002.1D158][.0000.0000.0000.1D165] # MUSICAL SYMBOL QUARTER NOTE 1D160 ; [*1007.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D16E] # MUSICAL SYMBOL EIGHTH NOTE 1D161 ; [*1007.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D16F] # MUSICAL SYMBOL SIXTEENTH NOTE 1D162 ; [*1007.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D170] # MUSICAL SYMBOL THIRTY-SECOND NOTE 1D163 ; [*1007.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D171] # MUSICAL SYMBOL SIXTY-FOURTH NOTE 1D164 ; [*1007.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D172] # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE 1D165 ; [.0000.0000.0000.1D165] # MUSICAL SYMBOL COMBINING STEM 1D166 ; [.0000.0000.0000.1D166] # MUSICAL SYMBOL COMBINING SPRECHGESANG STEM 1D167 ; [.0000.0000.0000.1D167] # MUSICAL SYMBOL COMBINING TREMOLO-1 1D168 ; [.0000.0000.0000.1D168] # MUSICAL SYMBOL COMBINING TREMOLO-2 1D169 ; [.0000.0000.0000.1D169] # MUSICAL SYMBOL COMBINING TREMOLO-3 1D16A ; [*100D.0020.0002.1D16A] # MUSICAL SYMBOL FINGERED TREMOLO-1 1D16B ; [*100E.0020.0002.1D16B] # MUSICAL SYMBOL FINGERED TREMOLO-2 1D16C ; [*100F.0020.0002.1D16C] # MUSICAL SYMBOL FINGERED TREMOLO-3 1D16D ; [.0000.0000.0000.1D16D] # MUSICAL SYMBOL COMBINING AUGMENTATION DOT 1D16E ; [.0000.0000.0000.1D16E] # MUSICAL SYMBOL COMBINING FLAG-1 1D16F ; [.0000.0000.0000.1D16F] # MUSICAL SYMBOL COMBINING FLAG-2 1D170 ; [.0000.0000.0000.1D170] # MUSICAL SYMBOL COMBINING FLAG-3 1D171 ; [.0000.0000.0000.1D171] # MUSICAL SYMBOL COMBINING FLAG-4 1D172 ; [.0000.0000.0000.1D172] # MUSICAL SYMBOL COMBINING FLAG-5 1D17B ; [.0000.0000.0000.1D17B] # MUSICAL SYMBOL COMBINING ACCENT 1D17C ; [.0000.0000.0000.1D17C] # MUSICAL SYMBOL COMBINING STACCATO 1D17D ; [.0000.0000.0000.1D17D] # MUSICAL SYMBOL COMBINING TENUTO 1D17E ; [.0000.0000.0000.1D17E] # MUSICAL SYMBOL COMBINING STACCATISSIMO 1D17F ; [.0000.0000.0000.1D17F] # MUSICAL SYMBOL COMBINING MARCATO 1D180 ; [.0000.0000.0000.1D180] # MUSICAL SYMBOL COMBINING MARCATO-STACCATO 1D181 ; [.0000.0000.0000.1D181] # MUSICAL SYMBOL COMBINING ACCENT-STACCATO 1D182 ; [.0000.0000.0000.1D182] # MUSICAL SYMBOL COMBINING LOURE 1D183 ; [*1010.0020.0002.1D183] # MUSICAL SYMBOL ARPEGGIATO UP 1D184 ; [*1011.0020.0002.1D184] # MUSICAL SYMBOL ARPEGGIATO DOWN 1D185 ; [.0000.0000.0000.1D185] # MUSICAL SYMBOL COMBINING DOIT 1D186 ; [.0000.0000.0000.1D186] # MUSICAL SYMBOL COMBINING RIP 1D187 ; [.0000.0000.0000.1D187] # MUSICAL SYMBOL COMBINING FLIP 1D188 ; [.0000.0000.0000.1D188] # MUSICAL SYMBOL COMBINING SMEAR 1D189 ; [.0000.0000.0000.1D189] # MUSICAL SYMBOL COMBINING BEND 1D18A ; [.0000.0000.0000.1D18A] # MUSICAL SYMBOL COMBINING DOUBLE TONGUE 1D18B ; [.0000.0000.0000.1D18B] # MUSICAL SYMBOL COMBINING TRIPLE TONGUE 1D18C ; [*1012.0020.0002.1D18C] # MUSICAL SYMBOL RINFORZANDO 1D18D ; [*1013.0020.0002.1D18D] # MUSICAL SYMBOL SUBITO 1D18E ; [*1014.0020.0002.1D18E] # MUSICAL SYMBOL Z 1D18F ; [*1015.0020.0002.1D18F] # MUSICAL SYMBOL PIANO 1D190 ; [*1016.0020.0002.1D190] # MUSICAL SYMBOL MEZZO 1D191 ; [*1017.0020.0002.1D191] # MUSICAL SYMBOL FORTE 1D192 ; [*1018.0020.0002.1D192] # MUSICAL SYMBOL CRESCENDO 1D193 ; [*1019.0020.0002.1D193] # MUSICAL SYMBOL DECRESCENDO 1D194 ; [*101A.0020.0002.1D194] # MUSICAL SYMBOL GRACE NOTE SLASH 1D195 ; [*101B.0020.0002.1D195] # MUSICAL SYMBOL GRACE NOTE NO SLASH 1D196 ; [*101C.0020.0002.1D196] # MUSICAL SYMBOL TR 1D197 ; [*101D.0020.0002.1D197] # MUSICAL SYMBOL TURN 1D198 ; [*101E.0020.0002.1D198] # MUSICAL SYMBOL INVERTED TURN 1D199 ; [*101F.0020.0002.1D199] # MUSICAL SYMBOL TURN SLASH 1D19A ; [*1020.0020.0002.1D19A] # MUSICAL SYMBOL TURN UP 1D19B ; [*1021.0020.0002.1D19B] # MUSICAL SYMBOL ORNAMENT STROKE-1 1D19C ; [*1022.0020.0002.1D19C] # MUSICAL SYMBOL ORNAMENT STROKE-2 1D19D ; [*1023.0020.0002.1D19D] # MUSICAL SYMBOL ORNAMENT STROKE-3 1D19E ; [*1024.0020.0002.1D19E] # MUSICAL SYMBOL ORNAMENT STROKE-4 1D19F ; [*1025.0020.0002.1D19F] # MUSICAL SYMBOL ORNAMENT STROKE-5 1D1A0 ; [*1026.0020.0002.1D1A0] # MUSICAL SYMBOL ORNAMENT STROKE-6 1D1A1 ; [*1027.0020.0002.1D1A1] # MUSICAL SYMBOL ORNAMENT STROKE-7 1D1A2 ; [*1028.0020.0002.1D1A2] # MUSICAL SYMBOL ORNAMENT STROKE-8 1D1A3 ; [*1029.0020.0002.1D1A3] # MUSICAL SYMBOL ORNAMENT STROKE-9 1D1A4 ; [*102A.0020.0002.1D1A4] # MUSICAL SYMBOL ORNAMENT STROKE-10 1D1A5 ; [*102B.0020.0002.1D1A5] # MUSICAL SYMBOL ORNAMENT STROKE-11 1D1A6 ; [*102C.0020.0002.1D1A6] # MUSICAL SYMBOL HAUPTSTIMME 1D1A7 ; [*102D.0020.0002.1D1A7] # MUSICAL SYMBOL NEBENSTIMME 1D1A8 ; [*102E.0020.0002.1D1A8] # MUSICAL SYMBOL END OF STIMME 1D1A9 ; [*102F.0020.0002.1D1A9] # MUSICAL SYMBOL DEGREE SLASH 1D1AA ; [.0000.0000.0000.1D1AA] # MUSICAL SYMBOL COMBINING DOWN BOW 1D1AB ; [.0000.0000.0000.1D1AB] # MUSICAL SYMBOL COMBINING UP BOW 1D1AC ; [.0000.0000.0000.1D1AC] # MUSICAL SYMBOL COMBINING HARMONIC 1D1AD ; [.0000.0000.0000.1D1AD] # MUSICAL SYMBOL COMBINING SNAP PIZZICATO 1D1AE ; [*1030.0020.0002.1D1AE] # MUSICAL SYMBOL PEDAL MARK 1D1AF ; [*1031.0020.0002.1D1AF] # MUSICAL SYMBOL PEDAL UP MARK 1D1B0 ; [*1032.0020.0002.1D1B0] # MUSICAL SYMBOL HALF PEDAL MARK 1D1B1 ; [*1033.0020.0002.1D1B1] # MUSICAL SYMBOL GLISSANDO UP 1D1B2 ; [*1034.0020.0002.1D1B2] # MUSICAL SYMBOL GLISSANDO DOWN 1D1B3 ; [*1035.0020.0002.1D1B3] # MUSICAL SYMBOL WITH FINGERNAILS 1D1B4 ; [*1036.0020.0002.1D1B4] # MUSICAL SYMBOL DAMP 1D1B5 ; [*1037.0020.0002.1D1B5] # MUSICAL SYMBOL DAMP ALL 1D1B6 ; [*1038.0020.0002.1D1B6] # MUSICAL SYMBOL MAXIMA 1D1B7 ; [*1039.0020.0002.1D1B7] # MUSICAL SYMBOL LONGA 1D1B8 ; [*103A.0020.0002.1D1B8] # MUSICAL SYMBOL BREVIS 1D1B9 ; [*103B.0020.0002.1D1B9] # MUSICAL SYMBOL SEMIBREVIS WHITE 1D1BA ; [*103C.0020.0002.1D1BA] # MUSICAL SYMBOL SEMIBREVIS BLACK 1D1BB ; [*103B.0020.0002.1D1B9][.0000.0000.0000.1D165] # MUSICAL SYMBOL MINIMA 1D1BC ; [*103C.0020.0002.1D1BA][.0000.0000.0000.1D165] # MUSICAL SYMBOL MINIMA BLACK 1D1BD ; [*103B.0020.0002.1D1B9][.0000.0000.0000.1D165][.0000.0000.0000.1D16E] # MUSICAL SYMBOL SEMIMINIMA WHITE 1D1BE ; [*103C.0020.0002.1D1BA][.0000.0000.0000.1D165][.0000.0000.0000.1D16E] # MUSICAL SYMBOL SEMIMINIMA BLACK 1D1BF ; [*103B.0020.0002.1D1B9][.0000.0000.0000.1D165][.0000.0000.0000.1D16F] # MUSICAL SYMBOL FUSA WHITE 1D1C0 ; [*103C.0020.0002.1D1BA][.0000.0000.0000.1D165][.0000.0000.0000.1D16F] # MUSICAL SYMBOL FUSA BLACK 1D1C1 ; [*103D.0020.0002.1D1C1] # MUSICAL SYMBOL LONGA PERFECTA REST 1D1C2 ; [*103E.0020.0002.1D1C2] # MUSICAL SYMBOL LONGA IMPERFECTA REST 1D1C3 ; [*103F.0020.0002.1D1C3] # MUSICAL SYMBOL BREVIS REST 1D1C4 ; [*1040.0020.0002.1D1C4] # MUSICAL SYMBOL SEMIBREVIS REST 1D1C5 ; [*1041.0020.0002.1D1C5] # MUSICAL SYMBOL MINIMA REST 1D1C6 ; [*1042.0020.0002.1D1C6] # MUSICAL SYMBOL SEMIMINIMA REST 1D1C7 ; [*1043.0020.0002.1D1C7] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA 1D1C8 ; [*1044.0020.0002.1D1C8] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA 1D1C9 ; [*1045.0020.0002.1D1C9] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1 1D1CA ; [*1046.0020.0002.1D1CA] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA 1D1CB ; [*1047.0020.0002.1D1CB] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA 1D1CC ; [*1048.0020.0002.1D1CC] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1 1D1CD ; [*1049.0020.0002.1D1CD] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2 1D1CE ; [*104A.0020.0002.1D1CE] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3 1D1CF ; [*104B.0020.0002.1D1CF] # MUSICAL SYMBOL CROIX 1D1D0 ; [*104C.0020.0002.1D1D0] # MUSICAL SYMBOL GREGORIAN C CLEF 1D1D1 ; [*104D.0020.0002.1D1D1] # MUSICAL SYMBOL GREGORIAN F CLEF 1D1D2 ; [*104E.0020.0002.1D1D2] # MUSICAL SYMBOL SQUARE B 1D1D3 ; [*104F.0020.0002.1D1D3] # MUSICAL SYMBOL VIRGA 1D1D4 ; [*1050.0020.0002.1D1D4] # MUSICAL SYMBOL PODATUS 1D1D5 ; [*1051.0020.0002.1D1D5] # MUSICAL SYMBOL CLIVIS 1D1D6 ; [*1052.0020.0002.1D1D6] # MUSICAL SYMBOL SCANDICUS 1D1D7 ; [*1053.0020.0002.1D1D7] # MUSICAL SYMBOL CLIMACUS 1D1D8 ; [*1054.0020.0002.1D1D8] # MUSICAL SYMBOL TORCULUS 1D1D9 ; [*1055.0020.0002.1D1D9] # MUSICAL SYMBOL PORRECTUS 1D1DA ; [*1056.0020.0002.1D1DA] # MUSICAL SYMBOL PORRECTUS FLEXUS 1D1DB ; [*1057.0020.0002.1D1DB] # MUSICAL SYMBOL SCANDICUS FLEXUS 1D1DC ; [*1058.0020.0002.1D1DC] # MUSICAL SYMBOL TORCULUS RESUPINUS 1D1DD ; [*1059.0020.0002.1D1DD] # MUSICAL SYMBOL PES SUBPUNCTIS 1D200 ; [*105A.0020.0002.1D200] # GREEK VOCAL NOTATION SYMBOL-1 1D201 ; [*105B.0020.0002.1D201] # GREEK VOCAL NOTATION SYMBOL-2 1D202 ; [*105C.0020.0002.1D202] # GREEK VOCAL NOTATION SYMBOL-3 1D203 ; [*105D.0020.0002.1D203] # GREEK VOCAL NOTATION SYMBOL-4 1D204 ; [*105E.0020.0002.1D204] # GREEK VOCAL NOTATION SYMBOL-5 1D205 ; [*105F.0020.0002.1D205] # GREEK VOCAL NOTATION SYMBOL-6 1D206 ; [*1060.0020.0002.1D206] # GREEK VOCAL NOTATION SYMBOL-7 1D207 ; [*1061.0020.0002.1D207] # GREEK VOCAL NOTATION SYMBOL-8 1D208 ; [*1062.0020.0002.1D208] # GREEK VOCAL NOTATION SYMBOL-9 1D209 ; [*1063.0020.0002.1D209] # GREEK VOCAL NOTATION SYMBOL-10 1D20A ; [*1064.0020.0002.1D20A] # GREEK VOCAL NOTATION SYMBOL-11 1D20B ; [*1065.0020.0002.1D20B] # GREEK VOCAL NOTATION SYMBOL-12 1D20C ; [*1066.0020.0002.1D20C] # GREEK VOCAL NOTATION SYMBOL-13 1D20D ; [*1067.0020.0002.1D20D] # GREEK VOCAL NOTATION SYMBOL-14 1D20E ; [*1068.0020.0002.1D20E] # GREEK VOCAL NOTATION SYMBOL-15 1D20F ; [*1069.0020.0002.1D20F] # GREEK VOCAL NOTATION SYMBOL-16 1D210 ; [*106A.0020.0002.1D210] # GREEK VOCAL NOTATION SYMBOL-17 1D211 ; [*106B.0020.0002.1D211] # GREEK VOCAL NOTATION SYMBOL-18 1D212 ; [*106C.0020.0002.1D212] # GREEK VOCAL NOTATION SYMBOL-19 1D213 ; [*106D.0020.0002.1D213] # GREEK VOCAL NOTATION SYMBOL-20 1D214 ; [*106E.0020.0002.1D214] # GREEK VOCAL NOTATION SYMBOL-21 1D215 ; [*106F.0020.0002.1D215] # GREEK VOCAL NOTATION SYMBOL-22 1D216 ; [*1070.0020.0002.1D216] # GREEK VOCAL NOTATION SYMBOL-23 1D217 ; [*1071.0020.0002.1D217] # GREEK VOCAL NOTATION SYMBOL-24 1D218 ; [*1072.0020.0002.1D218] # GREEK VOCAL NOTATION SYMBOL-50 1D219 ; [*1073.0020.0002.1D219] # GREEK VOCAL NOTATION SYMBOL-51 1D21A ; [*1074.0020.0002.1D21A] # GREEK VOCAL NOTATION SYMBOL-52 1D21B ; [*1075.0020.0002.1D21B] # GREEK VOCAL NOTATION SYMBOL-53 1D21C ; [*1076.0020.0002.1D21C] # GREEK VOCAL NOTATION SYMBOL-54 1D21D ; [*1077.0020.0002.1D21D] # GREEK INSTRUMENTAL NOTATION SYMBOL-1 1D21E ; [*1078.0020.0002.1D21E] # GREEK INSTRUMENTAL NOTATION SYMBOL-2 1D21F ; [*1079.0020.0002.1D21F] # GREEK INSTRUMENTAL NOTATION SYMBOL-4 1D220 ; [*107A.0020.0002.1D220] # GREEK INSTRUMENTAL NOTATION SYMBOL-5 1D221 ; [*107B.0020.0002.1D221] # GREEK INSTRUMENTAL NOTATION SYMBOL-7 1D222 ; [*107C.0020.0002.1D222] # GREEK INSTRUMENTAL NOTATION SYMBOL-8 1D223 ; [*107D.0020.0002.1D223] # GREEK INSTRUMENTAL NOTATION SYMBOL-11 1D224 ; [*107E.0020.0002.1D224] # GREEK INSTRUMENTAL NOTATION SYMBOL-12 1D225 ; [*107F.0020.0002.1D225] # GREEK INSTRUMENTAL NOTATION SYMBOL-13 1D226 ; [*1080.0020.0002.1D226] # GREEK INSTRUMENTAL NOTATION SYMBOL-14 1D227 ; [*1081.0020.0002.1D227] # GREEK INSTRUMENTAL NOTATION SYMBOL-17 1D228 ; [*1082.0020.0002.1D228] # GREEK INSTRUMENTAL NOTATION SYMBOL-18 1D229 ; [*1083.0020.0002.1D229] # GREEK INSTRUMENTAL NOTATION SYMBOL-19 1D22A ; [*1084.0020.0002.1D22A] # GREEK INSTRUMENTAL NOTATION SYMBOL-23 1D22B ; [*1085.0020.0002.1D22B] # GREEK INSTRUMENTAL NOTATION SYMBOL-24 1D22C ; [*1086.0020.0002.1D22C] # GREEK INSTRUMENTAL NOTATION SYMBOL-25 1D22D ; [*1087.0020.0002.1D22D] # GREEK INSTRUMENTAL NOTATION SYMBOL-26 1D22E ; [*1088.0020.0002.1D22E] # GREEK INSTRUMENTAL NOTATION SYMBOL-27 1D22F ; [*1089.0020.0002.1D22F] # GREEK INSTRUMENTAL NOTATION SYMBOL-29 1D230 ; [*108A.0020.0002.1D230] # GREEK INSTRUMENTAL NOTATION SYMBOL-30 1D231 ; [*108B.0020.0002.1D231] # GREEK INSTRUMENTAL NOTATION SYMBOL-32 1D232 ; [*108C.0020.0002.1D232] # GREEK INSTRUMENTAL NOTATION SYMBOL-36 1D233 ; [*108D.0020.0002.1D233] # GREEK INSTRUMENTAL NOTATION SYMBOL-37 1D234 ; [*108E.0020.0002.1D234] # GREEK INSTRUMENTAL NOTATION SYMBOL-38 1D235 ; [*108F.0020.0002.1D235] # GREEK INSTRUMENTAL NOTATION SYMBOL-39 1D236 ; [*1090.0020.0002.1D236] # GREEK INSTRUMENTAL NOTATION SYMBOL-40 1D237 ; [*1091.0020.0002.1D237] # GREEK INSTRUMENTAL NOTATION SYMBOL-42 1D238 ; [*1092.0020.0002.1D238] # GREEK INSTRUMENTAL NOTATION SYMBOL-43 1D239 ; [*1093.0020.0002.1D239] # GREEK INSTRUMENTAL NOTATION SYMBOL-45 1D23A ; [*1094.0020.0002.1D23A] # GREEK INSTRUMENTAL NOTATION SYMBOL-47 1D23B ; [*1095.0020.0002.1D23B] # GREEK INSTRUMENTAL NOTATION SYMBOL-48 1D23C ; [*1096.0020.0002.1D23C] # GREEK INSTRUMENTAL NOTATION SYMBOL-49 1D23D ; [*1097.0020.0002.1D23D] # GREEK INSTRUMENTAL NOTATION SYMBOL-50 1D23E ; [*1098.0020.0002.1D23E] # GREEK INSTRUMENTAL NOTATION SYMBOL-51 1D23F ; [*1099.0020.0002.1D23F] # GREEK INSTRUMENTAL NOTATION SYMBOL-52 1D240 ; [*109A.0020.0002.1D240] # GREEK INSTRUMENTAL NOTATION SYMBOL-53 1D241 ; [*109B.0020.0002.1D241] # GREEK INSTRUMENTAL NOTATION SYMBOL-54 1D242 ; [.0000.0000.0000.1D242] # COMBINING GREEK MUSICAL TRISEME 1D243 ; [.0000.0000.0000.1D243] # COMBINING GREEK MUSICAL TETRASEME 1D244 ; [.0000.0000.0000.1D244] # COMBINING GREEK MUSICAL PENTASEME 1D245 ; [*109C.0020.0002.1D245] # GREEK MUSICAL LEIMMA 1D300 ; [*0DD7.0020.0002.1D300] # MONOGRAM FOR EARTH 1D301 ; [*0DD8.0020.0002.1D301] # DIGRAM FOR HEAVENLY EARTH 1D302 ; [*0DD9.0020.0002.1D302] # DIGRAM FOR HUMAN EARTH 1D303 ; [*0DDA.0020.0002.1D303] # DIGRAM FOR EARTHLY HEAVEN 1D304 ; [*0DDB.0020.0002.1D304] # DIGRAM FOR EARTHLY HUMAN 1D305 ; [*0DDC.0020.0002.1D305] # DIGRAM FOR EARTH 1D306 ; [*0DDD.0020.0002.1D306] # TETRAGRAM FOR CENTRE 1D307 ; [*0DDE.0020.0002.1D307] # TETRAGRAM FOR FULL CIRCLE 1D308 ; [*0DDF.0020.0002.1D308] # TETRAGRAM FOR MIRED 1D309 ; [*0DE0.0020.0002.1D309] # TETRAGRAM FOR BARRIER 1D30A ; [*0DE1.0020.0002.1D30A] # TETRAGRAM FOR KEEPING SMALL 1D30B ; [*0DE2.0020.0002.1D30B] # TETRAGRAM FOR CONTRARIETY 1D30C ; [*0DE3.0020.0002.1D30C] # TETRAGRAM FOR ASCENT 1D30D ; [*0DE4.0020.0002.1D30D] # TETRAGRAM FOR OPPOSITION 1D30E ; [*0DE5.0020.0002.1D30E] # TETRAGRAM FOR BRANCHING OUT 1D30F ; [*0DE6.0020.0002.1D30F] # TETRAGRAM FOR DEFECTIVENESS OR DISTORTION 1D310 ; [*0DE7.0020.0002.1D310] # TETRAGRAM FOR DIVERGENCE 1D311 ; [*0DE8.0020.0002.1D311] # TETRAGRAM FOR YOUTHFULNESS 1D312 ; [*0DE9.0020.0002.1D312] # TETRAGRAM FOR INCREASE 1D313 ; [*0DEA.0020.0002.1D313] # TETRAGRAM FOR PENETRATION 1D314 ; [*0DEB.0020.0002.1D314] # TETRAGRAM FOR REACH 1D315 ; [*0DEC.0020.0002.1D315] # TETRAGRAM FOR CONTACT 1D316 ; [*0DED.0020.0002.1D316] # TETRAGRAM FOR HOLDING BACK 1D317 ; [*0DEE.0020.0002.1D317] # TETRAGRAM FOR WAITING 1D318 ; [*0DEF.0020.0002.1D318] # TETRAGRAM FOR FOLLOWING 1D319 ; [*0DF0.0020.0002.1D319] # TETRAGRAM FOR ADVANCE 1D31A ; [*0DF1.0020.0002.1D31A] # TETRAGRAM FOR RELEASE 1D31B ; [*0DF2.0020.0002.1D31B] # TETRAGRAM FOR RESISTANCE 1D31C ; [*0DF3.0020.0002.1D31C] # TETRAGRAM FOR EASE 1D31D ; [*0DF4.0020.0002.1D31D] # TETRAGRAM FOR JOY 1D31E ; [*0DF5.0020.0002.1D31E] # TETRAGRAM FOR CONTENTION 1D31F ; [*0DF6.0020.0002.1D31F] # TETRAGRAM FOR ENDEAVOUR 1D320 ; [*0DF7.0020.0002.1D320] # TETRAGRAM FOR DUTIES 1D321 ; [*0DF8.0020.0002.1D321] # TETRAGRAM FOR CHANGE 1D322 ; [*0DF9.0020.0002.1D322] # TETRAGRAM FOR DECISIVENESS 1D323 ; [*0DFA.0020.0002.1D323] # TETRAGRAM FOR BOLD RESOLUTION 1D324 ; [*0DFB.0020.0002.1D324] # TETRAGRAM FOR PACKING 1D325 ; [*0DFC.0020.0002.1D325] # TETRAGRAM FOR LEGION 1D326 ; [*0DFD.0020.0002.1D326] # TETRAGRAM FOR CLOSENESS 1D327 ; [*0DFE.0020.0002.1D327] # TETRAGRAM FOR KINSHIP 1D328 ; [*0DFF.0020.0002.1D328] # TETRAGRAM FOR GATHERING 1D329 ; [*0E00.0020.0002.1D329] # TETRAGRAM FOR STRENGTH 1D32A ; [*0E01.0020.0002.1D32A] # TETRAGRAM FOR PURITY 1D32B ; [*0E02.0020.0002.1D32B] # TETRAGRAM FOR FULLNESS 1D32C ; [*0E03.0020.0002.1D32C] # TETRAGRAM FOR RESIDENCE 1D32D ; [*0E04.0020.0002.1D32D] # TETRAGRAM FOR LAW OR MODEL 1D32E ; [*0E05.0020.0002.1D32E] # TETRAGRAM FOR RESPONSE 1D32F ; [*0E06.0020.0002.1D32F] # TETRAGRAM FOR GOING TO MEET 1D330 ; [*0E07.0020.0002.1D330] # TETRAGRAM FOR ENCOUNTERS 1D331 ; [*0E08.0020.0002.1D331] # TETRAGRAM FOR STOVE 1D332 ; [*0E09.0020.0002.1D332] # TETRAGRAM FOR GREATNESS 1D333 ; [*0E0A.0020.0002.1D333] # TETRAGRAM FOR ENLARGEMENT 1D334 ; [*0E0B.0020.0002.1D334] # TETRAGRAM FOR PATTERN 1D335 ; [*0E0C.0020.0002.1D335] # TETRAGRAM FOR RITUAL 1D336 ; [*0E0D.0020.0002.1D336] # TETRAGRAM FOR FLIGHT 1D337 ; [*0E0E.0020.0002.1D337] # TETRAGRAM FOR VASTNESS OR WASTING 1D338 ; [*0E0F.0020.0002.1D338] # TETRAGRAM FOR CONSTANCY 1D339 ; [*0E10.0020.0002.1D339] # TETRAGRAM FOR MEASURE 1D33A ; [*0E11.0020.0002.1D33A] # TETRAGRAM FOR ETERNITY 1D33B ; [*0E12.0020.0002.1D33B] # TETRAGRAM FOR UNITY 1D33C ; [*0E13.0020.0002.1D33C] # TETRAGRAM FOR DIMINISHMENT 1D33D ; [*0E14.0020.0002.1D33D] # TETRAGRAM FOR CLOSED MOUTH 1D33E ; [*0E15.0020.0002.1D33E] # TETRAGRAM FOR GUARDEDNESS 1D33F ; [*0E16.0020.0002.1D33F] # TETRAGRAM FOR GATHERING IN 1D340 ; [*0E17.0020.0002.1D340] # TETRAGRAM FOR MASSING 1D341 ; [*0E18.0020.0002.1D341] # TETRAGRAM FOR ACCUMULATION 1D342 ; [*0E19.0020.0002.1D342] # TETRAGRAM FOR EMBELLISHMENT 1D343 ; [*0E1A.0020.0002.1D343] # TETRAGRAM FOR DOUBT 1D344 ; [*0E1B.0020.0002.1D344] # TETRAGRAM FOR WATCH 1D345 ; [*0E1C.0020.0002.1D345] # TETRAGRAM FOR SINKING 1D346 ; [*0E1D.0020.0002.1D346] # TETRAGRAM FOR INNER 1D347 ; [*0E1E.0020.0002.1D347] # TETRAGRAM FOR DEPARTURE 1D348 ; [*0E1F.0020.0002.1D348] # TETRAGRAM FOR DARKENING 1D349 ; [*0E20.0020.0002.1D349] # TETRAGRAM FOR DIMMING 1D34A ; [*0E21.0020.0002.1D34A] # TETRAGRAM FOR EXHAUSTION 1D34B ; [*0E22.0020.0002.1D34B] # TETRAGRAM FOR SEVERANCE 1D34C ; [*0E23.0020.0002.1D34C] # TETRAGRAM FOR STOPPAGE 1D34D ; [*0E24.0020.0002.1D34D] # TETRAGRAM FOR HARDNESS 1D34E ; [*0E25.0020.0002.1D34E] # TETRAGRAM FOR COMPLETION 1D34F ; [*0E26.0020.0002.1D34F] # TETRAGRAM FOR CLOSURE 1D350 ; [*0E27.0020.0002.1D350] # TETRAGRAM FOR FAILURE 1D351 ; [*0E28.0020.0002.1D351] # TETRAGRAM FOR AGGRAVATION 1D352 ; [*0E29.0020.0002.1D352] # TETRAGRAM FOR COMPLIANCE 1D353 ; [*0E2A.0020.0002.1D353] # TETRAGRAM FOR ON THE VERGE 1D354 ; [*0E2B.0020.0002.1D354] # TETRAGRAM FOR DIFFICULTIES 1D355 ; [*0E2C.0020.0002.1D355] # TETRAGRAM FOR LABOURING 1D356 ; [*0E2D.0020.0002.1D356] # TETRAGRAM FOR FOSTERING 1D369 ; [*1585.0020.0002.1D369] # COUNTING ROD TENS DIGIT ONE 1D36A ; [*1586.0020.0002.1D36A] # COUNTING ROD TENS DIGIT TWO 1D36B ; [*1587.0020.0002.1D36B] # COUNTING ROD TENS DIGIT THREE 1D36C ; [*1588.0020.0002.1D36C] # COUNTING ROD TENS DIGIT FOUR 1D36D ; [*1589.0020.0002.1D36D] # COUNTING ROD TENS DIGIT FIVE 1D36E ; [*158A.0020.0002.1D36E] # COUNTING ROD TENS DIGIT SIX 1D36F ; [*158B.0020.0002.1D36F] # COUNTING ROD TENS DIGIT SEVEN 1D370 ; [*158C.0020.0002.1D370] # COUNTING ROD TENS DIGIT EIGHT 1D371 ; [*158D.0020.0002.1D371] # COUNTING ROD TENS DIGIT NINE 1D6C1 ; [*0592.0020.0005.1D6C1] # MATHEMATICAL BOLD NABLA 1D6DB ; [*058E.0020.0005.1D6DB] # MATHEMATICAL BOLD PARTIAL DIFFERENTIAL 1D6FB ; [*0592.0020.0005.1D6FB] # MATHEMATICAL ITALIC NABLA 1D715 ; [*058E.0020.0005.1D715] # MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL 1D735 ; [*0592.0020.0005.1D735] # MATHEMATICAL BOLD ITALIC NABLA 1D74F ; [*058E.0020.0005.1D74F] # MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL 1D76F ; [*0592.0020.0005.1D76F] # MATHEMATICAL SANS-SERIF BOLD NABLA 1D789 ; [*058E.0020.0005.1D789] # MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL 1D7A9 ; [*0592.0020.0005.1D7A9] # MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA 1D7C3 ; [*058E.0020.0005.1D7C3] # MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL 1EEF0 ; [*0485.0020.0002.1EEF0] # ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL 1EEF1 ; [*0486.0020.0002.1EEF1] # ARABIC MATHEMATICAL OPERATOR HAH WITH DAL 1F000 ; [*109D.0020.0002.1F000] # MAHJONG TILE EAST WIND 1F001 ; [*109E.0020.0002.1F001] # MAHJONG TILE SOUTH WIND 1F002 ; [*109F.0020.0002.1F002] # MAHJONG TILE WEST WIND 1F003 ; [*10A0.0020.0002.1F003] # MAHJONG TILE NORTH WIND 1F004 ; [*10A1.0020.0002.1F004] # MAHJONG TILE RED DRAGON 1F005 ; [*10A2.0020.0002.1F005] # MAHJONG TILE GREEN DRAGON 1F006 ; [*10A3.0020.0002.1F006] # MAHJONG TILE WHITE DRAGON 1F007 ; [*10A4.0020.0002.1F007] # MAHJONG TILE ONE OF CHARACTERS 1F008 ; [*10A5.0020.0002.1F008] # MAHJONG TILE TWO OF CHARACTERS 1F009 ; [*10A6.0020.0002.1F009] # MAHJONG TILE THREE OF CHARACTERS 1F00A ; [*10A7.0020.0002.1F00A] # MAHJONG TILE FOUR OF CHARACTERS 1F00B ; [*10A8.0020.0002.1F00B] # MAHJONG TILE FIVE OF CHARACTERS 1F00C ; [*10A9.0020.0002.1F00C] # MAHJONG TILE SIX OF CHARACTERS 1F00D ; [*10AA.0020.0002.1F00D] # MAHJONG TILE SEVEN OF CHARACTERS 1F00E ; [*10AB.0020.0002.1F00E] # MAHJONG TILE EIGHT OF CHARACTERS 1F00F ; [*10AC.0020.0002.1F00F] # MAHJONG TILE NINE OF CHARACTERS 1F010 ; [*10AD.0020.0002.1F010] # MAHJONG TILE ONE OF BAMBOOS 1F011 ; [*10AE.0020.0002.1F011] # MAHJONG TILE TWO OF BAMBOOS 1F012 ; [*10AF.0020.0002.1F012] # MAHJONG TILE THREE OF BAMBOOS 1F013 ; [*10B0.0020.0002.1F013] # MAHJONG TILE FOUR OF BAMBOOS 1F014 ; [*10B1.0020.0002.1F014] # MAHJONG TILE FIVE OF BAMBOOS 1F015 ; [*10B2.0020.0002.1F015] # MAHJONG TILE SIX OF BAMBOOS 1F016 ; [*10B3.0020.0002.1F016] # MAHJONG TILE SEVEN OF BAMBOOS 1F017 ; [*10B4.0020.0002.1F017] # MAHJONG TILE EIGHT OF BAMBOOS 1F018 ; [*10B5.0020.0002.1F018] # MAHJONG TILE NINE OF BAMBOOS 1F019 ; [*10B6.0020.0002.1F019] # MAHJONG TILE ONE OF CIRCLES 1F01A ; [*10B7.0020.0002.1F01A] # MAHJONG TILE TWO OF CIRCLES 1F01B ; [*10B8.0020.0002.1F01B] # MAHJONG TILE THREE OF CIRCLES 1F01C ; [*10B9.0020.0002.1F01C] # MAHJONG TILE FOUR OF CIRCLES 1F01D ; [*10BA.0020.0002.1F01D] # MAHJONG TILE FIVE OF CIRCLES 1F01E ; [*10BB.0020.0002.1F01E] # MAHJONG TILE SIX OF CIRCLES 1F01F ; [*10BC.0020.0002.1F01F] # MAHJONG TILE SEVEN OF CIRCLES 1F020 ; [*10BD.0020.0002.1F020] # MAHJONG TILE EIGHT OF CIRCLES 1F021 ; [*10BE.0020.0002.1F021] # MAHJONG TILE NINE OF CIRCLES 1F022 ; [*10BF.0020.0002.1F022] # MAHJONG TILE PLUM 1F023 ; [*10C0.0020.0002.1F023] # MAHJONG TILE ORCHID 1F024 ; [*10C1.0020.0002.1F024] # MAHJONG TILE BAMBOO 1F025 ; [*10C2.0020.0002.1F025] # MAHJONG TILE CHRYSANTHEMUM 1F026 ; [*10C3.0020.0002.1F026] # MAHJONG TILE SPRING 1F027 ; [*10C4.0020.0002.1F027] # MAHJONG TILE SUMMER 1F028 ; [*10C5.0020.0002.1F028] # MAHJONG TILE AUTUMN 1F029 ; [*10C6.0020.0002.1F029] # MAHJONG TILE WINTER 1F02A ; [*10C7.0020.0002.1F02A] # MAHJONG TILE JOKER 1F02B ; [*10C8.0020.0002.1F02B] # MAHJONG TILE BACK 1F030 ; [*10C9.0020.0002.1F030] # DOMINO TILE HORIZONTAL BACK 1F031 ; [*10CA.0020.0002.1F031] # DOMINO TILE HORIZONTAL-00-00 1F032 ; [*10CB.0020.0002.1F032] # DOMINO TILE HORIZONTAL-00-01 1F033 ; [*10CC.0020.0002.1F033] # DOMINO TILE HORIZONTAL-00-02 1F034 ; [*10CD.0020.0002.1F034] # DOMINO TILE HORIZONTAL-00-03 1F035 ; [*10CE.0020.0002.1F035] # DOMINO TILE HORIZONTAL-00-04 1F036 ; [*10CF.0020.0002.1F036] # DOMINO TILE HORIZONTAL-00-05 1F037 ; [*10D0.0020.0002.1F037] # DOMINO TILE HORIZONTAL-00-06 1F038 ; [*10D1.0020.0002.1F038] # DOMINO TILE HORIZONTAL-01-00 1F039 ; [*10D2.0020.0002.1F039] # DOMINO TILE HORIZONTAL-01-01 1F03A ; [*10D3.0020.0002.1F03A] # DOMINO TILE HORIZONTAL-01-02 1F03B ; [*10D4.0020.0002.1F03B] # DOMINO TILE HORIZONTAL-01-03 1F03C ; [*10D5.0020.0002.1F03C] # DOMINO TILE HORIZONTAL-01-04 1F03D ; [*10D6.0020.0002.1F03D] # DOMINO TILE HORIZONTAL-01-05 1F03E ; [*10D7.0020.0002.1F03E] # DOMINO TILE HORIZONTAL-01-06 1F03F ; [*10D8.0020.0002.1F03F] # DOMINO TILE HORIZONTAL-02-00 1F040 ; [*10D9.0020.0002.1F040] # DOMINO TILE HORIZONTAL-02-01 1F041 ; [*10DA.0020.0002.1F041] # DOMINO TILE HORIZONTAL-02-02 1F042 ; [*10DB.0020.0002.1F042] # DOMINO TILE HORIZONTAL-02-03 1F043 ; [*10DC.0020.0002.1F043] # DOMINO TILE HORIZONTAL-02-04 1F044 ; [*10DD.0020.0002.1F044] # DOMINO TILE HORIZONTAL-02-05 1F045 ; [*10DE.0020.0002.1F045] # DOMINO TILE HORIZONTAL-02-06 1F046 ; [*10DF.0020.0002.1F046] # DOMINO TILE HORIZONTAL-03-00 1F047 ; [*10E0.0020.0002.1F047] # DOMINO TILE HORIZONTAL-03-01 1F048 ; [*10E1.0020.0002.1F048] # DOMINO TILE HORIZONTAL-03-02 1F049 ; [*10E2.0020.0002.1F049] # DOMINO TILE HORIZONTAL-03-03 1F04A ; [*10E3.0020.0002.1F04A] # DOMINO TILE HORIZONTAL-03-04 1F04B ; [*10E4.0020.0002.1F04B] # DOMINO TILE HORIZONTAL-03-05 1F04C ; [*10E5.0020.0002.1F04C] # DOMINO TILE HORIZONTAL-03-06 1F04D ; [*10E6.0020.0002.1F04D] # DOMINO TILE HORIZONTAL-04-00 1F04E ; [*10E7.0020.0002.1F04E] # DOMINO TILE HORIZONTAL-04-01 1F04F ; [*10E8.0020.0002.1F04F] # DOMINO TILE HORIZONTAL-04-02 1F050 ; [*10E9.0020.0002.1F050] # DOMINO TILE HORIZONTAL-04-03 1F051 ; [*10EA.0020.0002.1F051] # DOMINO TILE HORIZONTAL-04-04 1F052 ; [*10EB.0020.0002.1F052] # DOMINO TILE HORIZONTAL-04-05 1F053 ; [*10EC.0020.0002.1F053] # DOMINO TILE HORIZONTAL-04-06 1F054 ; [*10ED.0020.0002.1F054] # DOMINO TILE HORIZONTAL-05-00 1F055 ; [*10EE.0020.0002.1F055] # DOMINO TILE HORIZONTAL-05-01 1F056 ; [*10EF.0020.0002.1F056] # DOMINO TILE HORIZONTAL-05-02 1F057 ; [*10F0.0020.0002.1F057] # DOMINO TILE HORIZONTAL-05-03 1F058 ; [*10F1.0020.0002.1F058] # DOMINO TILE HORIZONTAL-05-04 1F059 ; [*10F2.0020.0002.1F059] # DOMINO TILE HORIZONTAL-05-05 1F05A ; [*10F3.0020.0002.1F05A] # DOMINO TILE HORIZONTAL-05-06 1F05B ; [*10F4.0020.0002.1F05B] # DOMINO TILE HORIZONTAL-06-00 1F05C ; [*10F5.0020.0002.1F05C] # DOMINO TILE HORIZONTAL-06-01 1F05D ; [*10F6.0020.0002.1F05D] # DOMINO TILE HORIZONTAL-06-02 1F05E ; [*10F7.0020.0002.1F05E] # DOMINO TILE HORIZONTAL-06-03 1F05F ; [*10F8.0020.0002.1F05F] # DOMINO TILE HORIZONTAL-06-04 1F060 ; [*10F9.0020.0002.1F060] # DOMINO TILE HORIZONTAL-06-05 1F061 ; [*10FA.0020.0002.1F061] # DOMINO TILE HORIZONTAL-06-06 1F062 ; [*10FB.0020.0002.1F062] # DOMINO TILE VERTICAL BACK 1F063 ; [*10FC.0020.0002.1F063] # DOMINO TILE VERTICAL-00-00 1F064 ; [*10FD.0020.0002.1F064] # DOMINO TILE VERTICAL-00-01 1F065 ; [*10FE.0020.0002.1F065] # DOMINO TILE VERTICAL-00-02 1F066 ; [*10FF.0020.0002.1F066] # DOMINO TILE VERTICAL-00-03 1F067 ; [*1100.0020.0002.1F067] # DOMINO TILE VERTICAL-00-04 1F068 ; [*1101.0020.0002.1F068] # DOMINO TILE VERTICAL-00-05 1F069 ; [*1102.0020.0002.1F069] # DOMINO TILE VERTICAL-00-06 1F06A ; [*1103.0020.0002.1F06A] # DOMINO TILE VERTICAL-01-00 1F06B ; [*1104.0020.0002.1F06B] # DOMINO TILE VERTICAL-01-01 1F06C ; [*1105.0020.0002.1F06C] # DOMINO TILE VERTICAL-01-02 1F06D ; [*1106.0020.0002.1F06D] # DOMINO TILE VERTICAL-01-03 1F06E ; [*1107.0020.0002.1F06E] # DOMINO TILE VERTICAL-01-04 1F06F ; [*1108.0020.0002.1F06F] # DOMINO TILE VERTICAL-01-05 1F070 ; [*1109.0020.0002.1F070] # DOMINO TILE VERTICAL-01-06 1F071 ; [*110A.0020.0002.1F071] # DOMINO TILE VERTICAL-02-00 1F072 ; [*110B.0020.0002.1F072] # DOMINO TILE VERTICAL-02-01 1F073 ; [*110C.0020.0002.1F073] # DOMINO TILE VERTICAL-02-02 1F074 ; [*110D.0020.0002.1F074] # DOMINO TILE VERTICAL-02-03 1F075 ; [*110E.0020.0002.1F075] # DOMINO TILE VERTICAL-02-04 1F076 ; [*110F.0020.0002.1F076] # DOMINO TILE VERTICAL-02-05 1F077 ; [*1110.0020.0002.1F077] # DOMINO TILE VERTICAL-02-06 1F078 ; [*1111.0020.0002.1F078] # DOMINO TILE VERTICAL-03-00 1F079 ; [*1112.0020.0002.1F079] # DOMINO TILE VERTICAL-03-01 1F07A ; [*1113.0020.0002.1F07A] # DOMINO TILE VERTICAL-03-02 1F07B ; [*1114.0020.0002.1F07B] # DOMINO TILE VERTICAL-03-03 1F07C ; [*1115.0020.0002.1F07C] # DOMINO TILE VERTICAL-03-04 1F07D ; [*1116.0020.0002.1F07D] # DOMINO TILE VERTICAL-03-05 1F07E ; [*1117.0020.0002.1F07E] # DOMINO TILE VERTICAL-03-06 1F07F ; [*1118.0020.0002.1F07F] # DOMINO TILE VERTICAL-04-00 1F080 ; [*1119.0020.0002.1F080] # DOMINO TILE VERTICAL-04-01 1F081 ; [*111A.0020.0002.1F081] # DOMINO TILE VERTICAL-04-02 1F082 ; [*111B.0020.0002.1F082] # DOMINO TILE VERTICAL-04-03 1F083 ; [*111C.0020.0002.1F083] # DOMINO TILE VERTICAL-04-04 1F084 ; [*111D.0020.0002.1F084] # DOMINO TILE VERTICAL-04-05 1F085 ; [*111E.0020.0002.1F085] # DOMINO TILE VERTICAL-04-06 1F086 ; [*111F.0020.0002.1F086] # DOMINO TILE VERTICAL-05-00 1F087 ; [*1120.0020.0002.1F087] # DOMINO TILE VERTICAL-05-01 1F088 ; [*1121.0020.0002.1F088] # DOMINO TILE VERTICAL-05-02 1F089 ; [*1122.0020.0002.1F089] # DOMINO TILE VERTICAL-05-03 1F08A ; [*1123.0020.0002.1F08A] # DOMINO TILE VERTICAL-05-04 1F08B ; [*1124.0020.0002.1F08B] # DOMINO TILE VERTICAL-05-05 1F08C ; [*1125.0020.0002.1F08C] # DOMINO TILE VERTICAL-05-06 1F08D ; [*1126.0020.0002.1F08D] # DOMINO TILE VERTICAL-06-00 1F08E ; [*1127.0020.0002.1F08E] # DOMINO TILE VERTICAL-06-01 1F08F ; [*1128.0020.0002.1F08F] # DOMINO TILE VERTICAL-06-02 1F090 ; [*1129.0020.0002.1F090] # DOMINO TILE VERTICAL-06-03 1F091 ; [*112A.0020.0002.1F091] # DOMINO TILE VERTICAL-06-04 1F092 ; [*112B.0020.0002.1F092] # DOMINO TILE VERTICAL-06-05 1F093 ; [*112C.0020.0002.1F093] # DOMINO TILE VERTICAL-06-06 1F0A0 ; [*112D.0020.0002.1F0A0] # PLAYING CARD BACK 1F0A1 ; [*112E.0020.0002.1F0A1] # PLAYING CARD ACE OF SPADES 1F0A2 ; [*112F.0020.0002.1F0A2] # PLAYING CARD TWO OF SPADES 1F0A3 ; [*1130.0020.0002.1F0A3] # PLAYING CARD THREE OF SPADES 1F0A4 ; [*1131.0020.0002.1F0A4] # PLAYING CARD FOUR OF SPADES 1F0A5 ; [*1132.0020.0002.1F0A5] # PLAYING CARD FIVE OF SPADES 1F0A6 ; [*1133.0020.0002.1F0A6] # PLAYING CARD SIX OF SPADES 1F0A7 ; [*1134.0020.0002.1F0A7] # PLAYING CARD SEVEN OF SPADES 1F0A8 ; [*1135.0020.0002.1F0A8] # PLAYING CARD EIGHT OF SPADES 1F0A9 ; [*1136.0020.0002.1F0A9] # PLAYING CARD NINE OF SPADES 1F0AA ; [*1137.0020.0002.1F0AA] # PLAYING CARD TEN OF SPADES 1F0AB ; [*1138.0020.0002.1F0AB] # PLAYING CARD JACK OF SPADES 1F0AC ; [*1139.0020.0002.1F0AC] # PLAYING CARD KNIGHT OF SPADES 1F0AD ; [*113A.0020.0002.1F0AD] # PLAYING CARD QUEEN OF SPADES 1F0AE ; [*113B.0020.0002.1F0AE] # PLAYING CARD KING OF SPADES 1F0B1 ; [*113C.0020.0002.1F0B1] # PLAYING CARD ACE OF HEARTS 1F0B2 ; [*113D.0020.0002.1F0B2] # PLAYING CARD TWO OF HEARTS 1F0B3 ; [*113E.0020.0002.1F0B3] # PLAYING CARD THREE OF HEARTS 1F0B4 ; [*113F.0020.0002.1F0B4] # PLAYING CARD FOUR OF HEARTS 1F0B5 ; [*1140.0020.0002.1F0B5] # PLAYING CARD FIVE OF HEARTS 1F0B6 ; [*1141.0020.0002.1F0B6] # PLAYING CARD SIX OF HEARTS 1F0B7 ; [*1142.0020.0002.1F0B7] # PLAYING CARD SEVEN OF HEARTS 1F0B8 ; [*1143.0020.0002.1F0B8] # PLAYING CARD EIGHT OF HEARTS 1F0B9 ; [*1144.0020.0002.1F0B9] # PLAYING CARD NINE OF HEARTS 1F0BA ; [*1145.0020.0002.1F0BA] # PLAYING CARD TEN OF HEARTS 1F0BB ; [*1146.0020.0002.1F0BB] # PLAYING CARD JACK OF HEARTS 1F0BC ; [*1147.0020.0002.1F0BC] # PLAYING CARD KNIGHT OF HEARTS 1F0BD ; [*1148.0020.0002.1F0BD] # PLAYING CARD QUEEN OF HEARTS 1F0BE ; [*1149.0020.0002.1F0BE] # PLAYING CARD KING OF HEARTS 1F0C1 ; [*114A.0020.0002.1F0C1] # PLAYING CARD ACE OF DIAMONDS 1F0C2 ; [*114B.0020.0002.1F0C2] # PLAYING CARD TWO OF DIAMONDS 1F0C3 ; [*114C.0020.0002.1F0C3] # PLAYING CARD THREE OF DIAMONDS 1F0C4 ; [*114D.0020.0002.1F0C4] # PLAYING CARD FOUR OF DIAMONDS 1F0C5 ; [*114E.0020.0002.1F0C5] # PLAYING CARD FIVE OF DIAMONDS 1F0C6 ; [*114F.0020.0002.1F0C6] # PLAYING CARD SIX OF DIAMONDS 1F0C7 ; [*1150.0020.0002.1F0C7] # PLAYING CARD SEVEN OF DIAMONDS 1F0C8 ; [*1151.0020.0002.1F0C8] # PLAYING CARD EIGHT OF DIAMONDS 1F0C9 ; [*1152.0020.0002.1F0C9] # PLAYING CARD NINE OF DIAMONDS 1F0CA ; [*1153.0020.0002.1F0CA] # PLAYING CARD TEN OF DIAMONDS 1F0CB ; [*1154.0020.0002.1F0CB] # PLAYING CARD JACK OF DIAMONDS 1F0CC ; [*1155.0020.0002.1F0CC] # PLAYING CARD KNIGHT OF DIAMONDS 1F0CD ; [*1156.0020.0002.1F0CD] # PLAYING CARD QUEEN OF DIAMONDS 1F0CE ; [*1157.0020.0002.1F0CE] # PLAYING CARD KING OF DIAMONDS 1F0CF ; [*1158.0020.0002.1F0CF] # PLAYING CARD BLACK JOKER 1F0D1 ; [*1159.0020.0002.1F0D1] # PLAYING CARD ACE OF CLUBS 1F0D2 ; [*115A.0020.0002.1F0D2] # PLAYING CARD TWO OF CLUBS 1F0D3 ; [*115B.0020.0002.1F0D3] # PLAYING CARD THREE OF CLUBS 1F0D4 ; [*115C.0020.0002.1F0D4] # PLAYING CARD FOUR OF CLUBS 1F0D5 ; [*115D.0020.0002.1F0D5] # PLAYING CARD FIVE OF CLUBS 1F0D6 ; [*115E.0020.0002.1F0D6] # PLAYING CARD SIX OF CLUBS 1F0D7 ; [*115F.0020.0002.1F0D7] # PLAYING CARD SEVEN OF CLUBS 1F0D8 ; [*1160.0020.0002.1F0D8] # PLAYING CARD EIGHT OF CLUBS 1F0D9 ; [*1161.0020.0002.1F0D9] # PLAYING CARD NINE OF CLUBS 1F0DA ; [*1162.0020.0002.1F0DA] # PLAYING CARD TEN OF CLUBS 1F0DB ; [*1163.0020.0002.1F0DB] # PLAYING CARD JACK OF CLUBS 1F0DC ; [*1164.0020.0002.1F0DC] # PLAYING CARD KNIGHT OF CLUBS 1F0DD ; [*1165.0020.0002.1F0DD] # PLAYING CARD QUEEN OF CLUBS 1F0DE ; [*1166.0020.0002.1F0DE] # PLAYING CARD KING OF CLUBS 1F0DF ; [*1167.0020.0002.1F0DF] # PLAYING CARD WHITE JOKER 1F300 ; [*1168.0020.0002.1F300] # CYCLONE 1F301 ; [*1169.0020.0002.1F301] # FOGGY 1F302 ; [*116A.0020.0002.1F302] # CLOSED UMBRELLA 1F303 ; [*116B.0020.0002.1F303] # NIGHT WITH STARS 1F304 ; [*116C.0020.0002.1F304] # SUNRISE OVER MOUNTAINS 1F305 ; [*116D.0020.0002.1F305] # SUNRISE 1F306 ; [*116E.0020.0002.1F306] # CITYSCAPE AT DUSK 1F307 ; [*116F.0020.0002.1F307] # SUNSET OVER BUILDINGS 1F308 ; [*1170.0020.0002.1F308] # RAINBOW 1F309 ; [*1171.0020.0002.1F309] # BRIDGE AT NIGHT 1F30A ; [*1172.0020.0002.1F30A] # WATER WAVE 1F30B ; [*1173.0020.0002.1F30B] # VOLCANO 1F30C ; [*1174.0020.0002.1F30C] # MILKY WAY 1F30D ; [*1175.0020.0002.1F30D] # EARTH GLOBE EUROPE-AFRICA 1F30E ; [*1176.0020.0002.1F30E] # EARTH GLOBE AMERICAS 1F30F ; [*1177.0020.0002.1F30F] # EARTH GLOBE ASIA-AUSTRALIA 1F310 ; [*1178.0020.0002.1F310] # GLOBE WITH MERIDIANS 1F311 ; [*1179.0020.0002.1F311] # NEW MOON SYMBOL 1F312 ; [*117A.0020.0002.1F312] # WAXING CRESCENT MOON SYMBOL 1F313 ; [*117B.0020.0002.1F313] # FIRST QUARTER MOON SYMBOL 1F314 ; [*117C.0020.0002.1F314] # WAXING GIBBOUS MOON SYMBOL 1F315 ; [*117D.0020.0002.1F315] # FULL MOON SYMBOL 1F316 ; [*117E.0020.0002.1F316] # WANING GIBBOUS MOON SYMBOL 1F317 ; [*117F.0020.0002.1F317] # LAST QUARTER MOON SYMBOL 1F318 ; [*1180.0020.0002.1F318] # WANING CRESCENT MOON SYMBOL 1F319 ; [*1181.0020.0002.1F319] # CRESCENT MOON 1F31A ; [*1182.0020.0002.1F31A] # NEW MOON WITH FACE 1F31B ; [*1183.0020.0002.1F31B] # FIRST QUARTER MOON WITH FACE 1F31C ; [*1184.0020.0002.1F31C] # LAST QUARTER MOON WITH FACE 1F31D ; [*1185.0020.0002.1F31D] # FULL MOON WITH FACE 1F31E ; [*1186.0020.0002.1F31E] # SUN WITH FACE 1F31F ; [*1187.0020.0002.1F31F] # GLOWING STAR 1F320 ; [*1188.0020.0002.1F320] # SHOOTING STAR 1F330 ; [*1189.0020.0002.1F330] # CHESTNUT 1F331 ; [*118A.0020.0002.1F331] # SEEDLING 1F332 ; [*118B.0020.0002.1F332] # EVERGREEN TREE 1F333 ; [*118C.0020.0002.1F333] # DECIDUOUS TREE 1F334 ; [*118D.0020.0002.1F334] # PALM TREE 1F335 ; [*118E.0020.0002.1F335] # CACTUS 1F337 ; [*118F.0020.0002.1F337] # TULIP 1F338 ; [*1190.0020.0002.1F338] # CHERRY BLOSSOM 1F339 ; [*1191.0020.0002.1F339] # ROSE 1F33A ; [*1192.0020.0002.1F33A] # HIBISCUS 1F33B ; [*1193.0020.0002.1F33B] # SUNFLOWER 1F33C ; [*1194.0020.0002.1F33C] # BLOSSOM 1F33D ; [*1195.0020.0002.1F33D] # EAR OF MAIZE 1F33E ; [*1196.0020.0002.1F33E] # EAR OF RICE 1F33F ; [*1197.0020.0002.1F33F] # HERB 1F340 ; [*1198.0020.0002.1F340] # FOUR LEAF CLOVER 1F341 ; [*1199.0020.0002.1F341] # MAPLE LEAF 1F342 ; [*119A.0020.0002.1F342] # FALLEN LEAF 1F343 ; [*119B.0020.0002.1F343] # LEAF FLUTTERING IN WIND 1F344 ; [*119C.0020.0002.1F344] # MUSHROOM 1F345 ; [*119D.0020.0002.1F345] # TOMATO 1F346 ; [*119E.0020.0002.1F346] # AUBERGINE 1F347 ; [*119F.0020.0002.1F347] # GRAPES 1F348 ; [*11A0.0020.0002.1F348] # MELON 1F349 ; [*11A1.0020.0002.1F349] # WATERMELON 1F34A ; [*11A2.0020.0002.1F34A] # TANGERINE 1F34B ; [*11A3.0020.0002.1F34B] # LEMON 1F34C ; [*11A4.0020.0002.1F34C] # BANANA 1F34D ; [*11A5.0020.0002.1F34D] # PINEAPPLE 1F34E ; [*11A6.0020.0002.1F34E] # RED APPLE 1F34F ; [*11A7.0020.0002.1F34F] # GREEN APPLE 1F350 ; [*11A8.0020.0002.1F350] # PEAR 1F351 ; [*11A9.0020.0002.1F351] # PEACH 1F352 ; [*11AA.0020.0002.1F352] # CHERRIES 1F353 ; [*11AB.0020.0002.1F353] # STRAWBERRY 1F354 ; [*11AC.0020.0002.1F354] # HAMBURGER 1F355 ; [*11AD.0020.0002.1F355] # SLICE OF PIZZA 1F356 ; [*11AE.0020.0002.1F356] # MEAT ON BONE 1F357 ; [*11AF.0020.0002.1F357] # POULTRY LEG 1F358 ; [*11B0.0020.0002.1F358] # RICE CRACKER 1F359 ; [*11B1.0020.0002.1F359] # RICE BALL 1F35A ; [*11B2.0020.0002.1F35A] # COOKED RICE 1F35B ; [*11B3.0020.0002.1F35B] # CURRY AND RICE 1F35C ; [*11B4.0020.0002.1F35C] # STEAMING BOWL 1F35D ; [*11B5.0020.0002.1F35D] # SPAGHETTI 1F35E ; [*11B6.0020.0002.1F35E] # BREAD 1F35F ; [*11B7.0020.0002.1F35F] # FRENCH FRIES 1F360 ; [*11B8.0020.0002.1F360] # ROASTED SWEET POTATO 1F361 ; [*11B9.0020.0002.1F361] # DANGO 1F362 ; [*11BA.0020.0002.1F362] # ODEN 1F363 ; [*11BB.0020.0002.1F363] # SUSHI 1F364 ; [*11BC.0020.0002.1F364] # FRIED SHRIMP 1F365 ; [*11BD.0020.0002.1F365] # FISH CAKE WITH SWIRL DESIGN 1F366 ; [*11BE.0020.0002.1F366] # SOFT ICE CREAM 1F367 ; [*11BF.0020.0002.1F367] # SHAVED ICE 1F368 ; [*11C0.0020.0002.1F368] # ICE CREAM 1F369 ; [*11C1.0020.0002.1F369] # DOUGHNUT 1F36A ; [*11C2.0020.0002.1F36A] # COOKIE 1F36B ; [*11C3.0020.0002.1F36B] # CHOCOLATE BAR 1F36C ; [*11C4.0020.0002.1F36C] # CANDY 1F36D ; [*11C5.0020.0002.1F36D] # LOLLIPOP 1F36E ; [*11C6.0020.0002.1F36E] # CUSTARD 1F36F ; [*11C7.0020.0002.1F36F] # HONEY POT 1F370 ; [*11C8.0020.0002.1F370] # SHORTCAKE 1F371 ; [*11C9.0020.0002.1F371] # BENTO BOX 1F372 ; [*11CA.0020.0002.1F372] # POT OF FOOD 1F373 ; [*11CB.0020.0002.1F373] # COOKING 1F374 ; [*11CC.0020.0002.1F374] # FORK AND KNIFE 1F375 ; [*11CD.0020.0002.1F375] # TEACUP WITHOUT HANDLE 1F376 ; [*11CE.0020.0002.1F376] # SAKE BOTTLE AND CUP 1F377 ; [*11CF.0020.0002.1F377] # WINE GLASS 1F378 ; [*11D0.0020.0002.1F378] # COCKTAIL GLASS 1F379 ; [*11D1.0020.0002.1F379] # TROPICAL DRINK 1F37A ; [*11D2.0020.0002.1F37A] # BEER MUG 1F37B ; [*11D3.0020.0002.1F37B] # CLINKING BEER MUGS 1F37C ; [*11D4.0020.0002.1F37C] # BABY BOTTLE 1F380 ; [*11D5.0020.0002.1F380] # RIBBON 1F381 ; [*11D6.0020.0002.1F381] # WRAPPED PRESENT 1F382 ; [*11D7.0020.0002.1F382] # BIRTHDAY CAKE 1F383 ; [*11D8.0020.0002.1F383] # JACK-O-LANTERN 1F384 ; [*11D9.0020.0002.1F384] # CHRISTMAS TREE 1F385 ; [*11DA.0020.0002.1F385] # FATHER CHRISTMAS 1F386 ; [*11DB.0020.0002.1F386] # FIREWORKS 1F387 ; [*11DC.0020.0002.1F387] # FIREWORK SPARKLER 1F388 ; [*11DD.0020.0002.1F388] # BALLOON 1F389 ; [*11DE.0020.0002.1F389] # PARTY POPPER 1F38A ; [*11DF.0020.0002.1F38A] # CONFETTI BALL 1F38B ; [*11E0.0020.0002.1F38B] # TANABATA TREE 1F38C ; [*11E1.0020.0002.1F38C] # CROSSED FLAGS 1F38D ; [*11E2.0020.0002.1F38D] # PINE DECORATION 1F38E ; [*11E3.0020.0002.1F38E] # JAPANESE DOLLS 1F38F ; [*11E4.0020.0002.1F38F] # CARP STREAMER 1F390 ; [*11E5.0020.0002.1F390] # WIND CHIME 1F391 ; [*11E6.0020.0002.1F391] # MOON VIEWING CEREMONY 1F392 ; [*11E7.0020.0002.1F392] # SCHOOL SATCHEL 1F393 ; [*11E8.0020.0002.1F393] # GRADUATION CAP 1F3A0 ; [*11E9.0020.0002.1F3A0] # CAROUSEL HORSE 1F3A1 ; [*11EA.0020.0002.1F3A1] # FERRIS WHEEL 1F3A2 ; [*11EB.0020.0002.1F3A2] # ROLLER COASTER 1F3A3 ; [*11EC.0020.0002.1F3A3] # FISHING POLE AND FISH 1F3A4 ; [*11ED.0020.0002.1F3A4] # MICROPHONE 1F3A5 ; [*11EE.0020.0002.1F3A5] # MOVIE CAMERA 1F3A6 ; [*11EF.0020.0002.1F3A6] # CINEMA 1F3A7 ; [*11F0.0020.0002.1F3A7] # HEADPHONE 1F3A8 ; [*11F1.0020.0002.1F3A8] # ARTIST PALETTE 1F3A9 ; [*11F2.0020.0002.1F3A9] # TOP HAT 1F3AA ; [*11F3.0020.0002.1F3AA] # CIRCUS TENT 1F3AB ; [*11F4.0020.0002.1F3AB] # TICKET 1F3AC ; [*11F5.0020.0002.1F3AC] # CLAPPER BOARD 1F3AD ; [*11F6.0020.0002.1F3AD] # PERFORMING ARTS 1F3AE ; [*11F7.0020.0002.1F3AE] # VIDEO GAME 1F3AF ; [*11F8.0020.0002.1F3AF] # DIRECT HIT 1F3B0 ; [*11F9.0020.0002.1F3B0] # SLOT MACHINE 1F3B1 ; [*11FA.0020.0002.1F3B1] # BILLIARDS 1F3B2 ; [*11FB.0020.0002.1F3B2] # GAME DIE 1F3B3 ; [*11FC.0020.0002.1F3B3] # BOWLING 1F3B4 ; [*11FD.0020.0002.1F3B4] # FLOWER PLAYING CARDS 1F3B5 ; [*11FE.0020.0002.1F3B5] # MUSICAL NOTE 1F3B6 ; [*11FF.0020.0002.1F3B6] # MULTIPLE MUSICAL NOTES 1F3B7 ; [*1200.0020.0002.1F3B7] # SAXOPHONE 1F3B8 ; [*1201.0020.0002.1F3B8] # GUITAR 1F3B9 ; [*1202.0020.0002.1F3B9] # MUSICAL KEYBOARD 1F3BA ; [*1203.0020.0002.1F3BA] # TRUMPET 1F3BB ; [*1204.0020.0002.1F3BB] # VIOLIN 1F3BC ; [*1205.0020.0002.1F3BC] # MUSICAL SCORE 1F3BD ; [*1206.0020.0002.1F3BD] # RUNNING SHIRT WITH SASH 1F3BE ; [*1207.0020.0002.1F3BE] # TENNIS RACQUET AND BALL 1F3BF ; [*1208.0020.0002.1F3BF] # SKI AND SKI BOOT 1F3C0 ; [*1209.0020.0002.1F3C0] # BASKETBALL AND HOOP 1F3C1 ; [*120A.0020.0002.1F3C1] # CHEQUERED FLAG 1F3C2 ; [*120B.0020.0002.1F3C2] # SNOWBOARDER 1F3C3 ; [*120C.0020.0002.1F3C3] # RUNNER 1F3C4 ; [*120D.0020.0002.1F3C4] # SURFER 1F3C6 ; [*120E.0020.0002.1F3C6] # TROPHY 1F3C7 ; [*120F.0020.0002.1F3C7] # HORSE RACING 1F3C8 ; [*1210.0020.0002.1F3C8] # AMERICAN FOOTBALL 1F3C9 ; [*1211.0020.0002.1F3C9] # RUGBY FOOTBALL 1F3CA ; [*1212.0020.0002.1F3CA] # SWIMMER 1F3E0 ; [*1213.0020.0002.1F3E0] # HOUSE BUILDING 1F3E1 ; [*1214.0020.0002.1F3E1] # HOUSE WITH GARDEN 1F3E2 ; [*1215.0020.0002.1F3E2] # OFFICE BUILDING 1F3E3 ; [*1216.0020.0002.1F3E3] # JAPANESE POST OFFICE 1F3E4 ; [*1217.0020.0002.1F3E4] # EUROPEAN POST OFFICE 1F3E5 ; [*1218.0020.0002.1F3E5] # HOSPITAL 1F3E6 ; [*1219.0020.0002.1F3E6] # BANK 1F3E7 ; [*121A.0020.0002.1F3E7] # AUTOMATED TELLER MACHINE 1F3E8 ; [*121B.0020.0002.1F3E8] # HOTEL 1F3E9 ; [*121C.0020.0002.1F3E9] # LOVE HOTEL 1F3EA ; [*121D.0020.0002.1F3EA] # CONVENIENCE STORE 1F3EB ; [*121E.0020.0002.1F3EB] # SCHOOL 1F3EC ; [*121F.0020.0002.1F3EC] # DEPARTMENT STORE 1F3ED ; [*1220.0020.0002.1F3ED] # FACTORY 1F3EE ; [*1221.0020.0002.1F3EE] # IZAKAYA LANTERN 1F3EF ; [*1222.0020.0002.1F3EF] # JAPANESE CASTLE 1F3F0 ; [*1223.0020.0002.1F3F0] # EUROPEAN CASTLE 1F400 ; [*1224.0020.0002.1F400] # RAT 1F401 ; [*1225.0020.0002.1F401] # MOUSE 1F402 ; [*1226.0020.0002.1F402] # OX 1F403 ; [*1227.0020.0002.1F403] # WATER BUFFALO 1F404 ; [*1228.0020.0002.1F404] # COW 1F405 ; [*1229.0020.0002.1F405] # TIGER 1F406 ; [*122A.0020.0002.1F406] # LEOPARD 1F407 ; [*122B.0020.0002.1F407] # RABBIT 1F408 ; [*122C.0020.0002.1F408] # CAT 1F409 ; [*122D.0020.0002.1F409] # DRAGON 1F40A ; [*122E.0020.0002.1F40A] # CROCODILE 1F40B ; [*122F.0020.0002.1F40B] # WHALE 1F40C ; [*1230.0020.0002.1F40C] # SNAIL 1F40D ; [*1231.0020.0002.1F40D] # SNAKE 1F40E ; [*1232.0020.0002.1F40E] # HORSE 1F40F ; [*1233.0020.0002.1F40F] # RAM 1F410 ; [*1234.0020.0002.1F410] # GOAT 1F411 ; [*1235.0020.0002.1F411] # SHEEP 1F412 ; [*1236.0020.0002.1F412] # MONKEY 1F413 ; [*1237.0020.0002.1F413] # ROOSTER 1F414 ; [*1238.0020.0002.1F414] # CHICKEN 1F415 ; [*1239.0020.0002.1F415] # DOG 1F416 ; [*123A.0020.0002.1F416] # PIG 1F417 ; [*123B.0020.0002.1F417] # BOAR 1F418 ; [*123C.0020.0002.1F418] # ELEPHANT 1F419 ; [*123D.0020.0002.1F419] # OCTOPUS 1F41A ; [*123E.0020.0002.1F41A] # SPIRAL SHELL 1F41B ; [*123F.0020.0002.1F41B] # BUG 1F41C ; [*1240.0020.0002.1F41C] # ANT 1F41D ; [*1241.0020.0002.1F41D] # HONEYBEE 1F41E ; [*1242.0020.0002.1F41E] # LADY BEETLE 1F41F ; [*1243.0020.0002.1F41F] # FISH 1F420 ; [*1244.0020.0002.1F420] # TROPICAL FISH 1F421 ; [*1245.0020.0002.1F421] # BLOWFISH 1F422 ; [*1246.0020.0002.1F422] # TURTLE 1F423 ; [*1247.0020.0002.1F423] # HATCHING CHICK 1F424 ; [*1248.0020.0002.1F424] # BABY CHICK 1F425 ; [*1249.0020.0002.1F425] # FRONT-FACING BABY CHICK 1F426 ; [*124A.0020.0002.1F426] # BIRD 1F427 ; [*124B.0020.0002.1F427] # PENGUIN 1F428 ; [*124C.0020.0002.1F428] # KOALA 1F429 ; [*124D.0020.0002.1F429] # POODLE 1F42A ; [*124E.0020.0002.1F42A] # DROMEDARY CAMEL 1F42B ; [*124F.0020.0002.1F42B] # BACTRIAN CAMEL 1F42C ; [*1250.0020.0002.1F42C] # DOLPHIN 1F42D ; [*1251.0020.0002.1F42D] # MOUSE FACE 1F42E ; [*1252.0020.0002.1F42E] # COW FACE 1F42F ; [*1253.0020.0002.1F42F] # TIGER FACE 1F430 ; [*1254.0020.0002.1F430] # RABBIT FACE 1F431 ; [*1255.0020.0002.1F431] # CAT FACE 1F432 ; [*1256.0020.0002.1F432] # DRAGON FACE 1F433 ; [*1257.0020.0002.1F433] # SPOUTING WHALE 1F434 ; [*1258.0020.0002.1F434] # HORSE FACE 1F435 ; [*1259.0020.0002.1F435] # MONKEY FACE 1F436 ; [*125A.0020.0002.1F436] # DOG FACE 1F437 ; [*125B.0020.0002.1F437] # PIG FACE 1F438 ; [*125C.0020.0002.1F438] # FROG FACE 1F439 ; [*125D.0020.0002.1F439] # HAMSTER FACE 1F43A ; [*125E.0020.0002.1F43A] # WOLF FACE 1F43B ; [*125F.0020.0002.1F43B] # BEAR FACE 1F43C ; [*1260.0020.0002.1F43C] # PANDA FACE 1F43D ; [*1261.0020.0002.1F43D] # PIG NOSE 1F43E ; [*1262.0020.0002.1F43E] # PAW PRINTS 1F440 ; [*1263.0020.0002.1F440] # EYES 1F442 ; [*1264.0020.0002.1F442] # EAR 1F443 ; [*1265.0020.0002.1F443] # NOSE 1F444 ; [*1266.0020.0002.1F444] # MOUTH 1F445 ; [*1267.0020.0002.1F445] # TONGUE 1F446 ; [*1268.0020.0002.1F446] # WHITE UP POINTING BACKHAND INDEX 1F447 ; [*1269.0020.0002.1F447] # WHITE DOWN POINTING BACKHAND INDEX 1F448 ; [*126A.0020.0002.1F448] # WHITE LEFT POINTING BACKHAND INDEX 1F449 ; [*126B.0020.0002.1F449] # WHITE RIGHT POINTING BACKHAND INDEX 1F44A ; [*126C.0020.0002.1F44A] # FISTED HAND SIGN 1F44B ; [*126D.0020.0002.1F44B] # WAVING HAND SIGN 1F44C ; [*126E.0020.0002.1F44C] # OK HAND SIGN 1F44D ; [*126F.0020.0002.1F44D] # THUMBS UP SIGN 1F44E ; [*1270.0020.0002.1F44E] # THUMBS DOWN SIGN 1F44F ; [*1271.0020.0002.1F44F] # CLAPPING HANDS SIGN 1F450 ; [*1272.0020.0002.1F450] # OPEN HANDS SIGN 1F451 ; [*1273.0020.0002.1F451] # CROWN 1F452 ; [*1274.0020.0002.1F452] # WOMANS HAT 1F453 ; [*1275.0020.0002.1F453] # EYEGLASSES 1F454 ; [*1276.0020.0002.1F454] # NECKTIE 1F455 ; [*1277.0020.0002.1F455] # T-SHIRT 1F456 ; [*1278.0020.0002.1F456] # JEANS 1F457 ; [*1279.0020.0002.1F457] # DRESS 1F458 ; [*127A.0020.0002.1F458] # KIMONO 1F459 ; [*127B.0020.0002.1F459] # BIKINI 1F45A ; [*127C.0020.0002.1F45A] # WOMANS CLOTHES 1F45B ; [*127D.0020.0002.1F45B] # PURSE 1F45C ; [*127E.0020.0002.1F45C] # HANDBAG 1F45D ; [*127F.0020.0002.1F45D] # POUCH 1F45E ; [*1280.0020.0002.1F45E] # MANS SHOE 1F45F ; [*1281.0020.0002.1F45F] # ATHLETIC SHOE 1F460 ; [*1282.0020.0002.1F460] # HIGH-HEELED SHOE 1F461 ; [*1283.0020.0002.1F461] # WOMANS SANDAL 1F462 ; [*1284.0020.0002.1F462] # WOMANS BOOTS 1F463 ; [*1285.0020.0002.1F463] # FOOTPRINTS 1F464 ; [*1286.0020.0002.1F464] # BUST IN SILHOUETTE 1F465 ; [*1287.0020.0002.1F465] # BUSTS IN SILHOUETTE 1F466 ; [*1288.0020.0002.1F466] # BOY 1F467 ; [*1289.0020.0002.1F467] # GIRL 1F468 ; [*128A.0020.0002.1F468] # MAN 1F469 ; [*128B.0020.0002.1F469] # WOMAN 1F46A ; [*128C.0020.0002.1F46A] # FAMILY 1F46B ; [*128D.0020.0002.1F46B] # MAN AND WOMAN HOLDING HANDS 1F46C ; [*128E.0020.0002.1F46C] # TWO MEN HOLDING HANDS 1F46D ; [*128F.0020.0002.1F46D] # TWO WOMEN HOLDING HANDS 1F46E ; [*1290.0020.0002.1F46E] # POLICE OFFICER 1F46F ; [*1291.0020.0002.1F46F] # WOMAN WITH BUNNY EARS 1F470 ; [*1292.0020.0002.1F470] # BRIDE WITH VEIL 1F471 ; [*1293.0020.0002.1F471] # PERSON WITH BLOND HAIR 1F472 ; [*1294.0020.0002.1F472] # MAN WITH GUA PI MAO 1F473 ; [*1295.0020.0002.1F473] # MAN WITH TURBAN 1F474 ; [*1296.0020.0002.1F474] # OLDER MAN 1F475 ; [*1297.0020.0002.1F475] # OLDER WOMAN 1F476 ; [*1298.0020.0002.1F476] # BABY 1F477 ; [*1299.0020.0002.1F477] # CONSTRUCTION WORKER 1F478 ; [*129A.0020.0002.1F478] # PRINCESS 1F479 ; [*129B.0020.0002.1F479] # JAPANESE OGRE 1F47A ; [*129C.0020.0002.1F47A] # JAPANESE GOBLIN 1F47B ; [*129D.0020.0002.1F47B] # GHOST 1F47C ; [*129E.0020.0002.1F47C] # BABY ANGEL 1F47D ; [*129F.0020.0002.1F47D] # EXTRATERRESTRIAL ALIEN 1F47E ; [*12A0.0020.0002.1F47E] # ALIEN MONSTER 1F47F ; [*12A1.0020.0002.1F47F] # IMP 1F480 ; [*12A2.0020.0002.1F480] # SKULL 1F481 ; [*12A3.0020.0002.1F481] # INFORMATION DESK PERSON 1F482 ; [*12A4.0020.0002.1F482] # GUARDSMAN 1F483 ; [*12A5.0020.0002.1F483] # DANCER 1F484 ; [*12A6.0020.0002.1F484] # LIPSTICK 1F485 ; [*12A7.0020.0002.1F485] # NAIL POLISH 1F486 ; [*12A8.0020.0002.1F486] # FACE MASSAGE 1F487 ; [*12A9.0020.0002.1F487] # HAIRCUT 1F488 ; [*12AA.0020.0002.1F488] # BARBER POLE 1F489 ; [*12AB.0020.0002.1F489] # SYRINGE 1F48A ; [*12AC.0020.0002.1F48A] # PILL 1F48B ; [*12AD.0020.0002.1F48B] # KISS MARK 1F48C ; [*12AE.0020.0002.1F48C] # LOVE LETTER 1F48D ; [*12AF.0020.0002.1F48D] # RING 1F48E ; [*12B0.0020.0002.1F48E] # GEM STONE 1F48F ; [*12B1.0020.0002.1F48F] # KISS 1F490 ; [*12B2.0020.0002.1F490] # BOUQUET 1F491 ; [*12B3.0020.0002.1F491] # COUPLE WITH HEART 1F492 ; [*12B4.0020.0002.1F492] # WEDDING 1F493 ; [*12B5.0020.0002.1F493] # BEATING HEART 1F494 ; [*12B6.0020.0002.1F494] # BROKEN HEART 1F495 ; [*12B7.0020.0002.1F495] # TWO HEARTS 1F496 ; [*12B8.0020.0002.1F496] # SPARKLING HEART 1F497 ; [*12B9.0020.0002.1F497] # GROWING HEART 1F498 ; [*12BA.0020.0002.1F498] # HEART WITH ARROW 1F499 ; [*12BB.0020.0002.1F499] # BLUE HEART 1F49A ; [*12BC.0020.0002.1F49A] # GREEN HEART 1F49B ; [*12BD.0020.0002.1F49B] # YELLOW HEART 1F49C ; [*12BE.0020.0002.1F49C] # PURPLE HEART 1F49D ; [*12BF.0020.0002.1F49D] # HEART WITH RIBBON 1F49E ; [*12C0.0020.0002.1F49E] # REVOLVING HEARTS 1F49F ; [*12C1.0020.0002.1F49F] # HEART DECORATION 1F4A0 ; [*12C2.0020.0002.1F4A0] # DIAMOND SHAPE WITH A DOT INSIDE 1F4A1 ; [*12C3.0020.0002.1F4A1] # ELECTRIC LIGHT BULB 1F4A2 ; [*12C4.0020.0002.1F4A2] # ANGER SYMBOL 1F4A3 ; [*12C5.0020.0002.1F4A3] # BOMB 1F4A4 ; [*12C6.0020.0002.1F4A4] # SLEEPING SYMBOL 1F4A5 ; [*12C7.0020.0002.1F4A5] # COLLISION SYMBOL 1F4A6 ; [*12C8.0020.0002.1F4A6] # SPLASHING SWEAT SYMBOL 1F4A7 ; [*12C9.0020.0002.1F4A7] # DROPLET 1F4A8 ; [*12CA.0020.0002.1F4A8] # DASH SYMBOL 1F4A9 ; [*12CB.0020.0002.1F4A9] # PILE OF POO 1F4AA ; [*12CC.0020.0002.1F4AA] # FLEXED BICEPS 1F4AB ; [*12CD.0020.0002.1F4AB] # DIZZY SYMBOL 1F4AC ; [*12CE.0020.0002.1F4AC] # SPEECH BALLOON 1F4AD ; [*12CF.0020.0002.1F4AD] # THOUGHT BALLOON 1F4AE ; [*12D0.0020.0002.1F4AE] # WHITE FLOWER 1F4AF ; [*12D1.0020.0002.1F4AF] # HUNDRED POINTS SYMBOL 1F4B0 ; [*12D2.0020.0002.1F4B0] # MONEY BAG 1F4B1 ; [*12D3.0020.0002.1F4B1] # CURRENCY EXCHANGE 1F4B2 ; [*12D4.0020.0002.1F4B2] # HEAVY DOLLAR SIGN 1F4B3 ; [*12D5.0020.0002.1F4B3] # CREDIT CARD 1F4B4 ; [*12D6.0020.0002.1F4B4] # BANKNOTE WITH YEN SIGN 1F4B5 ; [*12D7.0020.0002.1F4B5] # BANKNOTE WITH DOLLAR SIGN 1F4B6 ; [*12D8.0020.0002.1F4B6] # BANKNOTE WITH EURO SIGN 1F4B7 ; [*12D9.0020.0002.1F4B7] # BANKNOTE WITH POUND SIGN 1F4B8 ; [*12DA.0020.0002.1F4B8] # MONEY WITH WINGS 1F4B9 ; [*12DB.0020.0002.1F4B9] # CHART WITH UPWARDS TREND AND YEN SIGN 1F4BA ; [*12DC.0020.0002.1F4BA] # SEAT 1F4BB ; [*12DD.0020.0002.1F4BB] # PERSONAL COMPUTER 1F4BC ; [*12DE.0020.0002.1F4BC] # BRIEFCASE 1F4BD ; [*12DF.0020.0002.1F4BD] # MINIDISC 1F4BE ; [*12E0.0020.0002.1F4BE] # FLOPPY DISK 1F4BF ; [*12E1.0020.0002.1F4BF] # OPTICAL DISC 1F4C0 ; [*12E2.0020.0002.1F4C0] # DVD 1F4C1 ; [*12E3.0020.0002.1F4C1] # FILE FOLDER 1F4C2 ; [*12E4.0020.0002.1F4C2] # OPEN FILE FOLDER 1F4C3 ; [*12E5.0020.0002.1F4C3] # PAGE WITH CURL 1F4C4 ; [*12E6.0020.0002.1F4C4] # PAGE FACING UP 1F4C5 ; [*12E7.0020.0002.1F4C5] # CALENDAR 1F4C6 ; [*12E8.0020.0002.1F4C6] # TEAR-OFF CALENDAR 1F4C7 ; [*12E9.0020.0002.1F4C7] # CARD INDEX 1F4C8 ; [*12EA.0020.0002.1F4C8] # CHART WITH UPWARDS TREND 1F4C9 ; [*12EB.0020.0002.1F4C9] # CHART WITH DOWNWARDS TREND 1F4CA ; [*12EC.0020.0002.1F4CA] # BAR CHART 1F4CB ; [*12ED.0020.0002.1F4CB] # CLIPBOARD 1F4CC ; [*12EE.0020.0002.1F4CC] # PUSHPIN 1F4CD ; [*12EF.0020.0002.1F4CD] # ROUND PUSHPIN 1F4CE ; [*12F0.0020.0002.1F4CE] # PAPERCLIP 1F4CF ; [*12F1.0020.0002.1F4CF] # STRAIGHT RULER 1F4D0 ; [*12F2.0020.0002.1F4D0] # TRIANGULAR RULER 1F4D1 ; [*12F3.0020.0002.1F4D1] # BOOKMARK TABS 1F4D2 ; [*12F4.0020.0002.1F4D2] # LEDGER 1F4D3 ; [*12F5.0020.0002.1F4D3] # NOTEBOOK 1F4D4 ; [*12F6.0020.0002.1F4D4] # NOTEBOOK WITH DECORATIVE COVER 1F4D5 ; [*12F7.0020.0002.1F4D5] # CLOSED BOOK 1F4D6 ; [*12F8.0020.0002.1F4D6] # OPEN BOOK 1F4D7 ; [*12F9.0020.0002.1F4D7] # GREEN BOOK 1F4D8 ; [*12FA.0020.0002.1F4D8] # BLUE BOOK 1F4D9 ; [*12FB.0020.0002.1F4D9] # ORANGE BOOK 1F4DA ; [*12FC.0020.0002.1F4DA] # BOOKS 1F4DB ; [*12FD.0020.0002.1F4DB] # NAME BADGE 1F4DC ; [*12FE.0020.0002.1F4DC] # SCROLL 1F4DD ; [*12FF.0020.0002.1F4DD] # MEMO 1F4DE ; [*1300.0020.0002.1F4DE] # TELEPHONE RECEIVER 1F4DF ; [*1301.0020.0002.1F4DF] # PAGER 1F4E0 ; [*1302.0020.0002.1F4E0] # FAX MACHINE 1F4E1 ; [*1303.0020.0002.1F4E1] # SATELLITE ANTENNA 1F4E2 ; [*1304.0020.0002.1F4E2] # PUBLIC ADDRESS LOUDSPEAKER 1F4E3 ; [*1305.0020.0002.1F4E3] # CHEERING MEGAPHONE 1F4E4 ; [*1306.0020.0002.1F4E4] # OUTBOX TRAY 1F4E5 ; [*1307.0020.0002.1F4E5] # INBOX TRAY 1F4E6 ; [*1308.0020.0002.1F4E6] # PACKAGE 1F4E7 ; [*1309.0020.0002.1F4E7] # E-MAIL SYMBOL 1F4E8 ; [*130A.0020.0002.1F4E8] # INCOMING ENVELOPE 1F4E9 ; [*130B.0020.0002.1F4E9] # ENVELOPE WITH DOWNWARDS ARROW ABOVE 1F4EA ; [*130C.0020.0002.1F4EA] # CLOSED MAILBOX WITH LOWERED FLAG 1F4EB ; [*130D.0020.0002.1F4EB] # CLOSED MAILBOX WITH RAISED FLAG 1F4EC ; [*130E.0020.0002.1F4EC] # OPEN MAILBOX WITH RAISED FLAG 1F4ED ; [*130F.0020.0002.1F4ED] # OPEN MAILBOX WITH LOWERED FLAG 1F4EE ; [*1310.0020.0002.1F4EE] # POSTBOX 1F4EF ; [*1311.0020.0002.1F4EF] # POSTAL HORN 1F4F0 ; [*1312.0020.0002.1F4F0] # NEWSPAPER 1F4F1 ; [*1313.0020.0002.1F4F1] # MOBILE PHONE 1F4F2 ; [*1314.0020.0002.1F4F2] # MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT 1F4F3 ; [*1315.0020.0002.1F4F3] # VIBRATION MODE 1F4F4 ; [*1316.0020.0002.1F4F4] # MOBILE PHONE OFF 1F4F5 ; [*1317.0020.0002.1F4F5] # NO MOBILE PHONES 1F4F6 ; [*1318.0020.0002.1F4F6] # ANTENNA WITH BARS 1F4F7 ; [*1319.0020.0002.1F4F7] # CAMERA 1F4F9 ; [*131A.0020.0002.1F4F9] # VIDEO CAMERA 1F4FA ; [*131B.0020.0002.1F4FA] # TELEVISION 1F4FB ; [*131C.0020.0002.1F4FB] # RADIO 1F4FC ; [*131D.0020.0002.1F4FC] # VIDEOCASSETTE 1F500 ; [*131E.0020.0002.1F500] # TWISTED RIGHTWARDS ARROWS 1F501 ; [*131F.0020.0002.1F501] # CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS 1F502 ; [*1320.0020.0002.1F502] # CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY 1F503 ; [*1321.0020.0002.1F503] # CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS 1F504 ; [*1322.0020.0002.1F504] # ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS 1F505 ; [*1323.0020.0002.1F505] # LOW BRIGHTNESS SYMBOL 1F506 ; [*1324.0020.0002.1F506] # HIGH BRIGHTNESS SYMBOL 1F507 ; [*1325.0020.0002.1F507] # SPEAKER WITH CANCELLATION STROKE 1F508 ; [*1326.0020.0002.1F508] # SPEAKER 1F509 ; [*1327.0020.0002.1F509] # SPEAKER WITH ONE SOUND WAVE 1F50A ; [*1328.0020.0002.1F50A] # SPEAKER WITH THREE SOUND WAVES 1F50B ; [*1329.0020.0002.1F50B] # BATTERY 1F50C ; [*132A.0020.0002.1F50C] # ELECTRIC PLUG 1F50D ; [*132B.0020.0002.1F50D] # LEFT-POINTING MAGNIFYING GLASS 1F50E ; [*132C.0020.0002.1F50E] # RIGHT-POINTING MAGNIFYING GLASS 1F50F ; [*132D.0020.0002.1F50F] # LOCK WITH INK PEN 1F510 ; [*132E.0020.0002.1F510] # CLOSED LOCK WITH KEY 1F511 ; [*132F.0020.0002.1F511] # KEY 1F512 ; [*1330.0020.0002.1F512] # LOCK 1F513 ; [*1331.0020.0002.1F513] # OPEN LOCK 1F514 ; [*1332.0020.0002.1F514] # BELL 1F515 ; [*1333.0020.0002.1F515] # BELL WITH CANCELLATION STROKE 1F516 ; [*1334.0020.0002.1F516] # BOOKMARK 1F517 ; [*1335.0020.0002.1F517] # LINK SYMBOL 1F518 ; [*1336.0020.0002.1F518] # RADIO BUTTON 1F519 ; [*1337.0020.0002.1F519] # BACK WITH LEFTWARDS ARROW ABOVE 1F51A ; [*1338.0020.0002.1F51A] # END WITH LEFTWARDS ARROW ABOVE 1F51B ; [*1339.0020.0002.1F51B] # ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE 1F51C ; [*133A.0020.0002.1F51C] # SOON WITH RIGHTWARDS ARROW ABOVE 1F51D ; [*133B.0020.0002.1F51D] # TOP WITH UPWARDS ARROW ABOVE 1F51E ; [*133C.0020.0002.1F51E] # NO ONE UNDER EIGHTEEN SYMBOL 1F51F ; [*133D.0020.0002.1F51F] # KEYCAP TEN 1F520 ; [*133E.0020.0002.1F520] # INPUT SYMBOL FOR LATIN CAPITAL LETTERS 1F521 ; [*133F.0020.0002.1F521] # INPUT SYMBOL FOR LATIN SMALL LETTERS 1F522 ; [*1340.0020.0002.1F522] # INPUT SYMBOL FOR NUMBERS 1F523 ; [*1341.0020.0002.1F523] # INPUT SYMBOL FOR SYMBOLS 1F524 ; [*1342.0020.0002.1F524] # INPUT SYMBOL FOR LATIN LETTERS 1F525 ; [*1343.0020.0002.1F525] # FIRE 1F526 ; [*1344.0020.0002.1F526] # ELECTRIC TORCH 1F527 ; [*1345.0020.0002.1F527] # WRENCH 1F528 ; [*1346.0020.0002.1F528] # HAMMER 1F529 ; [*1347.0020.0002.1F529] # NUT AND BOLT 1F52A ; [*1348.0020.0002.1F52A] # HOCHO 1F52B ; [*1349.0020.0002.1F52B] # PISTOL 1F52C ; [*134A.0020.0002.1F52C] # MICROSCOPE 1F52D ; [*134B.0020.0002.1F52D] # TELESCOPE 1F52E ; [*134C.0020.0002.1F52E] # CRYSTAL BALL 1F52F ; [*134D.0020.0002.1F52F] # SIX POINTED STAR WITH MIDDLE DOT 1F530 ; [*134E.0020.0002.1F530] # JAPANESE SYMBOL FOR BEGINNER 1F531 ; [*134F.0020.0002.1F531] # TRIDENT EMBLEM 1F532 ; [*1350.0020.0002.1F532] # BLACK SQUARE BUTTON 1F533 ; [*1351.0020.0002.1F533] # WHITE SQUARE BUTTON 1F534 ; [*1352.0020.0002.1F534] # LARGE RED CIRCLE 1F535 ; [*1353.0020.0002.1F535] # LARGE BLUE CIRCLE 1F536 ; [*1354.0020.0002.1F536] # LARGE ORANGE DIAMOND 1F537 ; [*1355.0020.0002.1F537] # LARGE BLUE DIAMOND 1F538 ; [*1356.0020.0002.1F538] # SMALL ORANGE DIAMOND 1F539 ; [*1357.0020.0002.1F539] # SMALL BLUE DIAMOND 1F53A ; [*1358.0020.0002.1F53A] # UP-POINTING RED TRIANGLE 1F53B ; [*1359.0020.0002.1F53B] # DOWN-POINTING RED TRIANGLE 1F53C ; [*135A.0020.0002.1F53C] # UP-POINTING SMALL RED TRIANGLE 1F53D ; [*135B.0020.0002.1F53D] # DOWN-POINTING SMALL RED TRIANGLE 1F540 ; [*135C.0020.0002.1F540] # CIRCLED CROSS POMMEE 1F541 ; [*135D.0020.0002.1F541] # CROSS POMMEE WITH HALF-CIRCLE BELOW 1F542 ; [*135E.0020.0002.1F542] # CROSS POMMEE 1F543 ; [*135F.0020.0002.1F543] # NOTCHED LEFT SEMICIRCLE WITH THREE DOTS 1F550 ; [*1360.0020.0002.1F550] # CLOCK FACE ONE OCLOCK 1F551 ; [*1361.0020.0002.1F551] # CLOCK FACE TWO OCLOCK 1F552 ; [*1362.0020.0002.1F552] # CLOCK FACE THREE OCLOCK 1F553 ; [*1363.0020.0002.1F553] # CLOCK FACE FOUR OCLOCK 1F554 ; [*1364.0020.0002.1F554] # CLOCK FACE FIVE OCLOCK 1F555 ; [*1365.0020.0002.1F555] # CLOCK FACE SIX OCLOCK 1F556 ; [*1366.0020.0002.1F556] # CLOCK FACE SEVEN OCLOCK 1F557 ; [*1367.0020.0002.1F557] # CLOCK FACE EIGHT OCLOCK 1F558 ; [*1368.0020.0002.1F558] # CLOCK FACE NINE OCLOCK 1F559 ; [*1369.0020.0002.1F559] # CLOCK FACE TEN OCLOCK 1F55A ; [*136A.0020.0002.1F55A] # CLOCK FACE ELEVEN OCLOCK 1F55B ; [*136B.0020.0002.1F55B] # CLOCK FACE TWELVE OCLOCK 1F55C ; [*136C.0020.0002.1F55C] # CLOCK FACE ONE-THIRTY 1F55D ; [*136D.0020.0002.1F55D] # CLOCK FACE TWO-THIRTY 1F55E ; [*136E.0020.0002.1F55E] # CLOCK FACE THREE-THIRTY 1F55F ; [*136F.0020.0002.1F55F] # CLOCK FACE FOUR-THIRTY 1F560 ; [*1370.0020.0002.1F560] # CLOCK FACE FIVE-THIRTY 1F561 ; [*1371.0020.0002.1F561] # CLOCK FACE SIX-THIRTY 1F562 ; [*1372.0020.0002.1F562] # CLOCK FACE SEVEN-THIRTY 1F563 ; [*1373.0020.0002.1F563] # CLOCK FACE EIGHT-THIRTY 1F564 ; [*1374.0020.0002.1F564] # CLOCK FACE NINE-THIRTY 1F565 ; [*1375.0020.0002.1F565] # CLOCK FACE TEN-THIRTY 1F566 ; [*1376.0020.0002.1F566] # CLOCK FACE ELEVEN-THIRTY 1F567 ; [*1377.0020.0002.1F567] # CLOCK FACE TWELVE-THIRTY 1F5FB ; [*1378.0020.0002.1F5FB] # MOUNT FUJI 1F5FC ; [*1379.0020.0002.1F5FC] # TOKYO TOWER 1F5FD ; [*137A.0020.0002.1F5FD] # STATUE OF LIBERTY 1F5FE ; [*137B.0020.0002.1F5FE] # SILHOUETTE OF JAPAN 1F5FF ; [*137C.0020.0002.1F5FF] # MOYAI 1F600 ; [*137D.0020.0002.1F600] # GRINNING FACE 1F601 ; [*137E.0020.0002.1F601] # GRINNING FACE WITH SMILING EYES 1F602 ; [*137F.0020.0002.1F602] # FACE WITH TEARS OF JOY 1F603 ; [*1380.0020.0002.1F603] # SMILING FACE WITH OPEN MOUTH 1F604 ; [*1381.0020.0002.1F604] # SMILING FACE WITH OPEN MOUTH AND SMILING EYES 1F605 ; [*1382.0020.0002.1F605] # SMILING FACE WITH OPEN MOUTH AND COLD SWEAT 1F606 ; [*1383.0020.0002.1F606] # SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES 1F607 ; [*1384.0020.0002.1F607] # SMILING FACE WITH HALO 1F608 ; [*1385.0020.0002.1F608] # SMILING FACE WITH HORNS 1F609 ; [*1386.0020.0002.1F609] # WINKING FACE 1F60A ; [*1387.0020.0002.1F60A] # SMILING FACE WITH SMILING EYES 1F60B ; [*1388.0020.0002.1F60B] # FACE SAVOURING DELICIOUS FOOD 1F60C ; [*1389.0020.0002.1F60C] # RELIEVED FACE 1F60D ; [*138A.0020.0002.1F60D] # SMILING FACE WITH HEART-SHAPED EYES 1F60E ; [*138B.0020.0002.1F60E] # SMILING FACE WITH SUNGLASSES 1F60F ; [*138C.0020.0002.1F60F] # SMIRKING FACE 1F610 ; [*138D.0020.0002.1F610] # NEUTRAL FACE 1F611 ; [*138E.0020.0002.1F611] # EXPRESSIONLESS FACE 1F612 ; [*138F.0020.0002.1F612] # UNAMUSED FACE 1F613 ; [*1390.0020.0002.1F613] # FACE WITH COLD SWEAT 1F614 ; [*1391.0020.0002.1F614] # PENSIVE FACE 1F615 ; [*1392.0020.0002.1F615] # CONFUSED FACE 1F616 ; [*1393.0020.0002.1F616] # CONFOUNDED FACE 1F617 ; [*1394.0020.0002.1F617] # KISSING FACE 1F618 ; [*1395.0020.0002.1F618] # FACE THROWING A KISS 1F619 ; [*1396.0020.0002.1F619] # KISSING FACE WITH SMILING EYES 1F61A ; [*1397.0020.0002.1F61A] # KISSING FACE WITH CLOSED EYES 1F61B ; [*1398.0020.0002.1F61B] # FACE WITH STUCK-OUT TONGUE 1F61C ; [*1399.0020.0002.1F61C] # FACE WITH STUCK-OUT TONGUE AND WINKING EYE 1F61D ; [*139A.0020.0002.1F61D] # FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES 1F61E ; [*139B.0020.0002.1F61E] # DISAPPOINTED FACE 1F61F ; [*139C.0020.0002.1F61F] # WORRIED FACE 1F620 ; [*139D.0020.0002.1F620] # ANGRY FACE 1F621 ; [*139E.0020.0002.1F621] # POUTING FACE 1F622 ; [*139F.0020.0002.1F622] # CRYING FACE 1F623 ; [*13A0.0020.0002.1F623] # PERSEVERING FACE 1F624 ; [*13A1.0020.0002.1F624] # FACE WITH LOOK OF TRIUMPH 1F625 ; [*13A2.0020.0002.1F625] # DISAPPOINTED BUT RELIEVED FACE 1F626 ; [*13A3.0020.0002.1F626] # FROWNING FACE WITH OPEN MOUTH 1F627 ; [*13A4.0020.0002.1F627] # ANGUISHED FACE 1F628 ; [*13A5.0020.0002.1F628] # FEARFUL FACE 1F629 ; [*13A6.0020.0002.1F629] # WEARY FACE 1F62A ; [*13A7.0020.0002.1F62A] # SLEEPY FACE 1F62B ; [*13A8.0020.0002.1F62B] # TIRED FACE 1F62C ; [*13A9.0020.0002.1F62C] # GRIMACING FACE 1F62D ; [*13AA.0020.0002.1F62D] # LOUDLY CRYING FACE 1F62E ; [*13AB.0020.0002.1F62E] # FACE WITH OPEN MOUTH 1F62F ; [*13AC.0020.0002.1F62F] # HUSHED FACE 1F630 ; [*13AD.0020.0002.1F630] # FACE WITH OPEN MOUTH AND COLD SWEAT 1F631 ; [*13AE.0020.0002.1F631] # FACE SCREAMING IN FEAR 1F632 ; [*13AF.0020.0002.1F632] # ASTONISHED FACE 1F633 ; [*13B0.0020.0002.1F633] # FLUSHED FACE 1F634 ; [*13B1.0020.0002.1F634] # SLEEPING FACE 1F635 ; [*13B2.0020.0002.1F635] # DIZZY FACE 1F636 ; [*13B3.0020.0002.1F636] # FACE WITHOUT MOUTH 1F637 ; [*13B4.0020.0002.1F637] # FACE WITH MEDICAL MASK 1F638 ; [*13B5.0020.0002.1F638] # GRINNING CAT FACE WITH SMILING EYES 1F639 ; [*13B6.0020.0002.1F639] # CAT FACE WITH TEARS OF JOY 1F63A ; [*13B7.0020.0002.1F63A] # SMILING CAT FACE WITH OPEN MOUTH 1F63B ; [*13B8.0020.0002.1F63B] # SMILING CAT FACE WITH HEART-SHAPED EYES 1F63C ; [*13B9.0020.0002.1F63C] # CAT FACE WITH WRY SMILE 1F63D ; [*13BA.0020.0002.1F63D] # KISSING CAT FACE WITH CLOSED EYES 1F63E ; [*13BB.0020.0002.1F63E] # POUTING CAT FACE 1F63F ; [*13BC.0020.0002.1F63F] # CRYING CAT FACE 1F640 ; [*13BD.0020.0002.1F640] # WEARY CAT FACE 1F645 ; [*13BE.0020.0002.1F645] # FACE WITH NO GOOD GESTURE 1F646 ; [*13BF.0020.0002.1F646] # FACE WITH OK GESTURE 1F647 ; [*13C0.0020.0002.1F647] # PERSON BOWING DEEPLY 1F648 ; [*13C1.0020.0002.1F648] # SEE-NO-EVIL MONKEY 1F649 ; [*13C2.0020.0002.1F649] # HEAR-NO-EVIL MONKEY 1F64A ; [*13C3.0020.0002.1F64A] # SPEAK-NO-EVIL MONKEY 1F64B ; [*13C4.0020.0002.1F64B] # HAPPY PERSON RAISING ONE HAND 1F64C ; [*13C5.0020.0002.1F64C] # PERSON RAISING BOTH HANDS IN CELEBRATION 1F64D ; [*13C6.0020.0002.1F64D] # PERSON FROWNING 1F64E ; [*13C7.0020.0002.1F64E] # PERSON WITH POUTING FACE 1F64F ; [*13C8.0020.0002.1F64F] # PERSON WITH FOLDED HANDS 1F680 ; [*13C9.0020.0002.1F680] # ROCKET 1F681 ; [*13CA.0020.0002.1F681] # HELICOPTER 1F682 ; [*13CB.0020.0002.1F682] # STEAM LOCOMOTIVE 1F683 ; [*13CC.0020.0002.1F683] # RAILWAY CAR 1F684 ; [*13CD.0020.0002.1F684] # HIGH-SPEED TRAIN 1F685 ; [*13CE.0020.0002.1F685] # HIGH-SPEED TRAIN WITH BULLET NOSE 1F686 ; [*13CF.0020.0002.1F686] # TRAIN 1F687 ; [*13D0.0020.0002.1F687] # METRO 1F688 ; [*13D1.0020.0002.1F688] # LIGHT RAIL 1F689 ; [*13D2.0020.0002.1F689] # STATION 1F68A ; [*13D3.0020.0002.1F68A] # TRAM 1F68B ; [*13D4.0020.0002.1F68B] # TRAM CAR 1F68C ; [*13D5.0020.0002.1F68C] # BUS 1F68D ; [*13D6.0020.0002.1F68D] # ONCOMING BUS 1F68E ; [*13D7.0020.0002.1F68E] # TROLLEYBUS 1F68F ; [*13D8.0020.0002.1F68F] # BUS STOP 1F690 ; [*13D9.0020.0002.1F690] # MINIBUS 1F691 ; [*13DA.0020.0002.1F691] # AMBULANCE 1F692 ; [*13DB.0020.0002.1F692] # FIRE ENGINE 1F693 ; [*13DC.0020.0002.1F693] # POLICE CAR 1F694 ; [*13DD.0020.0002.1F694] # ONCOMING POLICE CAR 1F695 ; [*13DE.0020.0002.1F695] # TAXI 1F696 ; [*13DF.0020.0002.1F696] # ONCOMING TAXI 1F697 ; [*13E0.0020.0002.1F697] # AUTOMOBILE 1F698 ; [*13E1.0020.0002.1F698] # ONCOMING AUTOMOBILE 1F699 ; [*13E2.0020.0002.1F699] # RECREATIONAL VEHICLE 1F69A ; [*13E3.0020.0002.1F69A] # DELIVERY TRUCK 1F69B ; [*13E4.0020.0002.1F69B] # ARTICULATED LORRY 1F69C ; [*13E5.0020.0002.1F69C] # TRACTOR 1F69D ; [*13E6.0020.0002.1F69D] # MONORAIL 1F69E ; [*13E7.0020.0002.1F69E] # MOUNTAIN RAILWAY 1F69F ; [*13E8.0020.0002.1F69F] # SUSPENSION RAILWAY 1F6A0 ; [*13E9.0020.0002.1F6A0] # MOUNTAIN CABLEWAY 1F6A1 ; [*13EA.0020.0002.1F6A1] # AERIAL TRAMWAY 1F6A2 ; [*13EB.0020.0002.1F6A2] # SHIP 1F6A3 ; [*13EC.0020.0002.1F6A3] # ROWBOAT 1F6A4 ; [*13ED.0020.0002.1F6A4] # SPEEDBOAT 1F6A5 ; [*13EE.0020.0002.1F6A5] # HORIZONTAL TRAFFIC LIGHT 1F6A6 ; [*13EF.0020.0002.1F6A6] # VERTICAL TRAFFIC LIGHT 1F6A7 ; [*13F0.0020.0002.1F6A7] # CONSTRUCTION SIGN 1F6A8 ; [*13F1.0020.0002.1F6A8] # POLICE CARS REVOLVING LIGHT 1F6A9 ; [*13F2.0020.0002.1F6A9] # TRIANGULAR FLAG ON POST 1F6AA ; [*13F3.0020.0002.1F6AA] # DOOR 1F6AB ; [*13F4.0020.0002.1F6AB] # NO ENTRY SIGN 1F6AC ; [*13F5.0020.0002.1F6AC] # SMOKING SYMBOL 1F6AD ; [*13F6.0020.0002.1F6AD] # NO SMOKING SYMBOL 1F6AE ; [*13F7.0020.0002.1F6AE] # PUT LITTER IN ITS PLACE SYMBOL 1F6AF ; [*13F8.0020.0002.1F6AF] # DO NOT LITTER SYMBOL 1F6B0 ; [*13F9.0020.0002.1F6B0] # POTABLE WATER SYMBOL 1F6B1 ; [*13FA.0020.0002.1F6B1] # NON-POTABLE WATER SYMBOL 1F6B2 ; [*13FB.0020.0002.1F6B2] # BICYCLE 1F6B3 ; [*13FC.0020.0002.1F6B3] # NO BICYCLES 1F6B4 ; [*13FD.0020.0002.1F6B4] # BICYCLIST 1F6B5 ; [*13FE.0020.0002.1F6B5] # MOUNTAIN BICYCLIST 1F6B6 ; [*13FF.0020.0002.1F6B6] # PEDESTRIAN 1F6B7 ; [*1400.0020.0002.1F6B7] # NO PEDESTRIANS 1F6B8 ; [*1401.0020.0002.1F6B8] # CHILDREN CROSSING 1F6B9 ; [*1402.0020.0002.1F6B9] # MENS SYMBOL 1F6BA ; [*1403.0020.0002.1F6BA] # WOMENS SYMBOL 1F6BB ; [*1404.0020.0002.1F6BB] # RESTROOM 1F6BC ; [*1405.0020.0002.1F6BC] # BABY SYMBOL 1F6BD ; [*1406.0020.0002.1F6BD] # TOILET 1F6BE ; [*1407.0020.0002.1F6BE] # WATER CLOSET 1F6BF ; [*1408.0020.0002.1F6BF] # SHOWER 1F6C0 ; [*1409.0020.0002.1F6C0] # BATH 1F6C1 ; [*140A.0020.0002.1F6C1] # BATHTUB 1F6C2 ; [*140B.0020.0002.1F6C2] # PASSPORT CONTROL 1F6C3 ; [*140C.0020.0002.1F6C3] # CUSTOMS 1F6C4 ; [*140D.0020.0002.1F6C4] # BAGGAGE CLAIM 1F6C5 ; [*140E.0020.0002.1F6C5] # LEFT LUGGAGE 1F700 ; [*140F.0020.0002.1F700] # ALCHEMICAL SYMBOL FOR QUINTESSENCE 1F701 ; [*1410.0020.0002.1F701] # ALCHEMICAL SYMBOL FOR AIR 1F702 ; [*1411.0020.0002.1F702] # ALCHEMICAL SYMBOL FOR FIRE 1F703 ; [*1412.0020.0002.1F703] # ALCHEMICAL SYMBOL FOR EARTH 1F704 ; [*1413.0020.0002.1F704] # ALCHEMICAL SYMBOL FOR WATER 1F705 ; [*1414.0020.0002.1F705] # ALCHEMICAL SYMBOL FOR AQUAFORTIS 1F706 ; [*1415.0020.0002.1F706] # ALCHEMICAL SYMBOL FOR AQUA REGIA 1F707 ; [*1416.0020.0002.1F707] # ALCHEMICAL SYMBOL FOR AQUA REGIA-2 1F708 ; [*1417.0020.0002.1F708] # ALCHEMICAL SYMBOL FOR AQUA VITAE 1F709 ; [*1418.0020.0002.1F709] # ALCHEMICAL SYMBOL FOR AQUA VITAE-2 1F70A ; [*1419.0020.0002.1F70A] # ALCHEMICAL SYMBOL FOR VINEGAR 1F70B ; [*141A.0020.0002.1F70B] # ALCHEMICAL SYMBOL FOR VINEGAR-2 1F70C ; [*141B.0020.0002.1F70C] # ALCHEMICAL SYMBOL FOR VINEGAR-3 1F70D ; [*141C.0020.0002.1F70D] # ALCHEMICAL SYMBOL FOR SULFUR 1F70E ; [*141D.0020.0002.1F70E] # ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR 1F70F ; [*141E.0020.0002.1F70F] # ALCHEMICAL SYMBOL FOR BLACK SULFUR 1F710 ; [*141F.0020.0002.1F710] # ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE 1F711 ; [*1420.0020.0002.1F711] # ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-2 1F712 ; [*1421.0020.0002.1F712] # ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-3 1F713 ; [*1422.0020.0002.1F713] # ALCHEMICAL SYMBOL FOR CINNABAR 1F714 ; [*1423.0020.0002.1F714] # ALCHEMICAL SYMBOL FOR SALT 1F715 ; [*1424.0020.0002.1F715] # ALCHEMICAL SYMBOL FOR NITRE 1F716 ; [*1425.0020.0002.1F716] # ALCHEMICAL SYMBOL FOR VITRIOL 1F717 ; [*1426.0020.0002.1F717] # ALCHEMICAL SYMBOL FOR VITRIOL-2 1F718 ; [*1427.0020.0002.1F718] # ALCHEMICAL SYMBOL FOR ROCK SALT 1F719 ; [*1428.0020.0002.1F719] # ALCHEMICAL SYMBOL FOR ROCK SALT-2 1F71A ; [*1429.0020.0002.1F71A] # ALCHEMICAL SYMBOL FOR GOLD 1F71B ; [*142A.0020.0002.1F71B] # ALCHEMICAL SYMBOL FOR SILVER 1F71C ; [*142B.0020.0002.1F71C] # ALCHEMICAL SYMBOL FOR IRON ORE 1F71D ; [*142C.0020.0002.1F71D] # ALCHEMICAL SYMBOL FOR IRON ORE-2 1F71E ; [*142D.0020.0002.1F71E] # ALCHEMICAL SYMBOL FOR CROCUS OF IRON 1F71F ; [*142E.0020.0002.1F71F] # ALCHEMICAL SYMBOL FOR REGULUS OF IRON 1F720 ; [*142F.0020.0002.1F720] # ALCHEMICAL SYMBOL FOR COPPER ORE 1F721 ; [*1430.0020.0002.1F721] # ALCHEMICAL SYMBOL FOR IRON-COPPER ORE 1F722 ; [*1431.0020.0002.1F722] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER 1F723 ; [*1432.0020.0002.1F723] # ALCHEMICAL SYMBOL FOR CROCUS OF COPPER 1F724 ; [*1433.0020.0002.1F724] # ALCHEMICAL SYMBOL FOR CROCUS OF COPPER-2 1F725 ; [*1434.0020.0002.1F725] # ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE 1F726 ; [*1435.0020.0002.1F726] # ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE 1F727 ; [*1436.0020.0002.1F727] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER 1F728 ; [*1437.0020.0002.1F728] # ALCHEMICAL SYMBOL FOR VERDIGRIS 1F729 ; [*1438.0020.0002.1F729] # ALCHEMICAL SYMBOL FOR TIN ORE 1F72A ; [*1439.0020.0002.1F72A] # ALCHEMICAL SYMBOL FOR LEAD ORE 1F72B ; [*143A.0020.0002.1F72B] # ALCHEMICAL SYMBOL FOR ANTIMONY ORE 1F72C ; [*143B.0020.0002.1F72C] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY 1F72D ; [*143C.0020.0002.1F72D] # ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY 1F72E ; [*143D.0020.0002.1F72E] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY 1F72F ; [*143E.0020.0002.1F72F] # ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY 1F730 ; [*143F.0020.0002.1F730] # ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY 1F731 ; [*1440.0020.0002.1F731] # ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY-2 1F732 ; [*1441.0020.0002.1F732] # ALCHEMICAL SYMBOL FOR REGULUS 1F733 ; [*1442.0020.0002.1F733] # ALCHEMICAL SYMBOL FOR REGULUS-2 1F734 ; [*1443.0020.0002.1F734] # ALCHEMICAL SYMBOL FOR REGULUS-3 1F735 ; [*1444.0020.0002.1F735] # ALCHEMICAL SYMBOL FOR REGULUS-4 1F736 ; [*1445.0020.0002.1F736] # ALCHEMICAL SYMBOL FOR ALKALI 1F737 ; [*1446.0020.0002.1F737] # ALCHEMICAL SYMBOL FOR ALKALI-2 1F738 ; [*1447.0020.0002.1F738] # ALCHEMICAL SYMBOL FOR MARCASITE 1F739 ; [*1448.0020.0002.1F739] # ALCHEMICAL SYMBOL FOR SAL-AMMONIAC 1F73A ; [*1449.0020.0002.1F73A] # ALCHEMICAL SYMBOL FOR ARSENIC 1F73B ; [*144A.0020.0002.1F73B] # ALCHEMICAL SYMBOL FOR REALGAR 1F73C ; [*144B.0020.0002.1F73C] # ALCHEMICAL SYMBOL FOR REALGAR-2 1F73D ; [*144C.0020.0002.1F73D] # ALCHEMICAL SYMBOL FOR AURIPIGMENT 1F73E ; [*144D.0020.0002.1F73E] # ALCHEMICAL SYMBOL FOR BISMUTH ORE 1F73F ; [*144E.0020.0002.1F73F] # ALCHEMICAL SYMBOL FOR TARTAR 1F740 ; [*144F.0020.0002.1F740] # ALCHEMICAL SYMBOL FOR TARTAR-2 1F741 ; [*1450.0020.0002.1F741] # ALCHEMICAL SYMBOL FOR QUICK LIME 1F742 ; [*1451.0020.0002.1F742] # ALCHEMICAL SYMBOL FOR BORAX 1F743 ; [*1452.0020.0002.1F743] # ALCHEMICAL SYMBOL FOR BORAX-2 1F744 ; [*1453.0020.0002.1F744] # ALCHEMICAL SYMBOL FOR BORAX-3 1F745 ; [*1454.0020.0002.1F745] # ALCHEMICAL SYMBOL FOR ALUM 1F746 ; [*1455.0020.0002.1F746] # ALCHEMICAL SYMBOL FOR OIL 1F747 ; [*1456.0020.0002.1F747] # ALCHEMICAL SYMBOL FOR SPIRIT 1F748 ; [*1457.0020.0002.1F748] # ALCHEMICAL SYMBOL FOR TINCTURE 1F749 ; [*1458.0020.0002.1F749] # ALCHEMICAL SYMBOL FOR GUM 1F74A ; [*1459.0020.0002.1F74A] # ALCHEMICAL SYMBOL FOR WAX 1F74B ; [*145A.0020.0002.1F74B] # ALCHEMICAL SYMBOL FOR POWDER 1F74C ; [*145B.0020.0002.1F74C] # ALCHEMICAL SYMBOL FOR CALX 1F74D ; [*145C.0020.0002.1F74D] # ALCHEMICAL SYMBOL FOR TUTTY 1F74E ; [*145D.0020.0002.1F74E] # ALCHEMICAL SYMBOL FOR CAPUT MORTUUM 1F74F ; [*145E.0020.0002.1F74F] # ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE 1F750 ; [*145F.0020.0002.1F750] # ALCHEMICAL SYMBOL FOR CADUCEUS 1F751 ; [*1460.0020.0002.1F751] # ALCHEMICAL SYMBOL FOR TRIDENT 1F752 ; [*1461.0020.0002.1F752] # ALCHEMICAL SYMBOL FOR STARRED TRIDENT 1F753 ; [*1462.0020.0002.1F753] # ALCHEMICAL SYMBOL FOR LODESTONE 1F754 ; [*1463.0020.0002.1F754] # ALCHEMICAL SYMBOL FOR SOAP 1F755 ; [*1464.0020.0002.1F755] # ALCHEMICAL SYMBOL FOR URINE 1F756 ; [*1465.0020.0002.1F756] # ALCHEMICAL SYMBOL FOR HORSE DUNG 1F757 ; [*1466.0020.0002.1F757] # ALCHEMICAL SYMBOL FOR ASHES 1F758 ; [*1467.0020.0002.1F758] # ALCHEMICAL SYMBOL FOR POT ASHES 1F759 ; [*1468.0020.0002.1F759] # ALCHEMICAL SYMBOL FOR BRICK 1F75A ; [*1469.0020.0002.1F75A] # ALCHEMICAL SYMBOL FOR POWDERED BRICK 1F75B ; [*146A.0020.0002.1F75B] # ALCHEMICAL SYMBOL FOR AMALGAM 1F75C ; [*146B.0020.0002.1F75C] # ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM 1F75D ; [*146C.0020.0002.1F75D] # ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM-2 1F75E ; [*146D.0020.0002.1F75E] # ALCHEMICAL SYMBOL FOR SUBLIMATION 1F75F ; [*146E.0020.0002.1F75F] # ALCHEMICAL SYMBOL FOR PRECIPITATE 1F760 ; [*146F.0020.0002.1F760] # ALCHEMICAL SYMBOL FOR DISTILL 1F761 ; [*1470.0020.0002.1F761] # ALCHEMICAL SYMBOL FOR DISSOLVE 1F762 ; [*1471.0020.0002.1F762] # ALCHEMICAL SYMBOL FOR DISSOLVE-2 1F763 ; [*1472.0020.0002.1F763] # ALCHEMICAL SYMBOL FOR PURIFY 1F764 ; [*1473.0020.0002.1F764] # ALCHEMICAL SYMBOL FOR PUTREFACTION 1F765 ; [*1474.0020.0002.1F765] # ALCHEMICAL SYMBOL FOR CRUCIBLE 1F766 ; [*1475.0020.0002.1F766] # ALCHEMICAL SYMBOL FOR CRUCIBLE-2 1F767 ; [*1476.0020.0002.1F767] # ALCHEMICAL SYMBOL FOR CRUCIBLE-3 1F768 ; [*1477.0020.0002.1F768] # ALCHEMICAL SYMBOL FOR CRUCIBLE-4 1F769 ; [*1478.0020.0002.1F769] # ALCHEMICAL SYMBOL FOR CRUCIBLE-5 1F76A ; [*1479.0020.0002.1F76A] # ALCHEMICAL SYMBOL FOR ALEMBIC 1F76B ; [*147A.0020.0002.1F76B] # ALCHEMICAL SYMBOL FOR BATH OF MARY 1F76C ; [*147B.0020.0002.1F76C] # ALCHEMICAL SYMBOL FOR BATH OF VAPOURS 1F76D ; [*147C.0020.0002.1F76D] # ALCHEMICAL SYMBOL FOR RETORT 1F76E ; [*147D.0020.0002.1F76E] # ALCHEMICAL SYMBOL FOR HOUR 1F76F ; [*147E.0020.0002.1F76F] # ALCHEMICAL SYMBOL FOR NIGHT 1F770 ; [*147F.0020.0002.1F770] # ALCHEMICAL SYMBOL FOR DAY-NIGHT 1F771 ; [*1480.0020.0002.1F771] # ALCHEMICAL SYMBOL FOR MONTH 1F772 ; [*1481.0020.0002.1F772] # ALCHEMICAL SYMBOL FOR HALF DRAM 1F773 ; [*1482.0020.0002.1F773] # ALCHEMICAL SYMBOL FOR HALF OUNCE 0332 ; [.0000.0021.0002.0332] # COMBINING LOW LINE 0313 ; [.0000.0022.0002.0313] # COMBINING COMMA ABOVE 0343 ; [.0000.0022.0002.0343] # COMBINING GREEK KORONIS 0486 ; [.0000.0022.0002.0486] # COMBINING CYRILLIC PSILI PNEUMATA 2CF1 ; [.0000.0022.0002.2CF1] # COPTIC COMBINING SPIRITUS LENIS 0314 ; [.0000.002A.0002.0314] # COMBINING REVERSED COMMA ABOVE 0485 ; [.0000.002A.0002.0485] # COMBINING CYRILLIC DASIA PNEUMATA 2CF0 ; [.0000.002A.0002.2CF0] # COPTIC COMBINING SPIRITUS ASPER 0301 ; [.0000.0032.0002.0301] # COMBINING ACUTE ACCENT 0341 ; [.0000.0032.0002.0341] # COMBINING ACUTE TONE MARK 0954 ; [.0000.0032.0002.0954] # DEVANAGARI ACUTE ACCENT 0300 ; [.0000.0035.0002.0300] # COMBINING GRAVE ACCENT 0340 ; [.0000.0035.0002.0340] # COMBINING GRAVE TONE MARK 0953 ; [.0000.0035.0002.0953] # DEVANAGARI GRAVE ACCENT 0306 ; [.0000.0037.0002.0306] # COMBINING BREVE 0302 ; [.0000.003C.0002.0302] # COMBINING CIRCUMFLEX ACCENT 030C ; [.0000.0041.0002.030C] # COMBINING CARON 030A ; [.0000.0043.0002.030A] # COMBINING RING ABOVE 0342 ; [.0000.0045.0002.0342] # COMBINING GREEK PERISPOMENI 0308 ; [.0000.0047.0002.0308] # COMBINING DIAERESIS 0344 ; [.0000.0047.0002.0308][.0000.0032.0002.0301] # COMBINING GREEK DIALYTIKA TONOS 030B ; [.0000.004D.0002.030B] # COMBINING DOUBLE ACUTE ACCENT 0303 ; [.0000.004E.0002.0303] # COMBINING TILDE 0307 ; [.0000.0052.0002.0307] # COMBINING DOT ABOVE 0338 ; [.0000.0054.0002.0338] # COMBINING LONG SOLIDUS OVERLAY 0327 ; [.0000.0056.0002.0327] # COMBINING CEDILLA 0328 ; [.0000.0059.0002.0328] # COMBINING OGONEK 0304 ; [.0000.005B.0002.0304] # COMBINING MACRON 030D ; [.0000.005F.0002.030D] # COMBINING VERTICAL LINE ABOVE 030E ; [.0000.005F.0002.030E] # COMBINING DOUBLE VERTICAL LINE ABOVE 0312 ; [.0000.005F.0002.0312] # COMBINING TURNED COMMA ABOVE 0315 ; [.0000.005F.0002.0315] # COMBINING COMMA ABOVE RIGHT 031A ; [.0000.005F.0002.031A] # COMBINING LEFT ANGLE ABOVE 033D ; [.0000.005F.0002.033D] # COMBINING X ABOVE 033E ; [.0000.005F.0002.033E] # COMBINING VERTICAL TILDE 033F ; [.0000.005F.0002.033F] # COMBINING DOUBLE OVERLINE 0346 ; [.0000.005F.0002.0346] # COMBINING BRIDGE ABOVE 034A ; [.0000.005F.0002.034A] # COMBINING NOT TILDE ABOVE 034B ; [.0000.005F.0002.034B] # COMBINING HOMOTHETIC ABOVE 034C ; [.0000.005F.0002.034C] # COMBINING ALMOST EQUAL TO ABOVE 0350 ; [.0000.005F.0002.0350] # COMBINING RIGHT ARROWHEAD ABOVE 0351 ; [.0000.005F.0002.0351] # COMBINING LEFT HALF RING ABOVE 0352 ; [.0000.005F.0002.0352] # COMBINING FERMATA 0357 ; [.0000.005F.0002.0357] # COMBINING RIGHT HALF RING ABOVE 035B ; [.0000.005F.0002.035B] # COMBINING ZIGZAG ABOVE 035D ; [.0000.005F.0002.035D] # COMBINING DOUBLE BREVE 035E ; [.0000.005F.0002.035E] # COMBINING DOUBLE MACRON 0484 ; [.0000.005F.0002.0484] # COMBINING CYRILLIC PALATALIZATION 0487 ; [.0000.005F.0002.0487] # COMBINING CYRILLIC POKRYTIE 0741 ; [.0000.005F.0002.0741] # SYRIAC QUSHSHAYA 0745 ; [.0000.005F.0002.0745] # SYRIAC THREE DOTS ABOVE 17CB ; [.0000.005F.0002.17CB] # KHMER SIGN BANTOC 17CC ; [.0000.005F.0002.17CC] # KHMER SIGN ROBAT 17CD ; [.0000.005F.0002.17CD] # KHMER SIGN TOANDAKHIAT 17CE ; [.0000.005F.0002.17CE] # KHMER SIGN KAKABAT 17CF ; [.0000.005F.0002.17CF] # KHMER SIGN AHSDA 17D0 ; [.0000.005F.0002.17D0] # KHMER SIGN SAMYOK SANNYA 17D1 ; [.0000.005F.0002.17D1] # KHMER SIGN VIRIAM 17DD ; [.0000.005F.0002.17DD] # KHMER SIGN ATTHACAN 1DC0 ; [.0000.005F.0002.1DC0] # COMBINING DOTTED GRAVE ACCENT 1DC1 ; [.0000.005F.0002.1DC1] # COMBINING DOTTED ACUTE ACCENT 1DC3 ; [.0000.005F.0002.1DC3] # COMBINING SUSPENSION MARK 1DC4 ; [.0000.005F.0002.1DC4] # COMBINING MACRON-ACUTE 1DC5 ; [.0000.005F.0002.1DC5] # COMBINING GRAVE-MACRON 1DC6 ; [.0000.005F.0002.1DC6] # COMBINING MACRON-GRAVE 1DC7 ; [.0000.005F.0002.1DC7] # COMBINING ACUTE-MACRON 1DC8 ; [.0000.005F.0002.1DC8] # COMBINING GRAVE-ACUTE-GRAVE 1DC9 ; [.0000.005F.0002.1DC9] # COMBINING ACUTE-GRAVE-ACUTE 1DCB ; [.0000.005F.0002.1DCB] # COMBINING BREVE-MACRON 1DCC ; [.0000.005F.0002.1DCC] # COMBINING MACRON-BREVE 1DCD ; [.0000.005F.0002.1DCD] # COMBINING DOUBLE CIRCUMFLEX ABOVE 1DCE ; [.0000.005F.0002.1DCE] # COMBINING OGONEK ABOVE 1DD1 ; [.0000.005F.0002.1DD1] # COMBINING UR ABOVE 1DFE ; [.0000.005F.0002.1DFE] # COMBINING LEFT ARROWHEAD ABOVE 20F0 ; [.0000.005F.0002.20F0] # COMBINING ASTERISK ABOVE 2CEF ; [.0000.005F.0002.2CEF] # COPTIC COMBINING NI ABOVE A67C ; [.0000.005F.0002.A67C] # COMBINING CYRILLIC KAVYKA A67D ; [.0000.005F.0002.A67D] # COMBINING CYRILLIC PAYEROK 0316 ; [.0000.0060.0002.0316] # COMBINING GRAVE ACCENT BELOW 0317 ; [.0000.0060.0002.0317] # COMBINING ACUTE ACCENT BELOW 0318 ; [.0000.0060.0002.0318] # COMBINING LEFT TACK BELOW 0319 ; [.0000.0060.0002.0319] # COMBINING RIGHT TACK BELOW 031C ; [.0000.0060.0002.031C] # COMBINING LEFT HALF RING BELOW 031D ; [.0000.0060.0002.031D] # COMBINING UP TACK BELOW 031E ; [.0000.0060.0002.031E] # COMBINING DOWN TACK BELOW 031F ; [.0000.0060.0002.031F] # COMBINING PLUS SIGN BELOW 0320 ; [.0000.0060.0002.0320] # COMBINING MINUS SIGN BELOW 0329 ; [.0000.0060.0002.0329] # COMBINING VERTICAL LINE BELOW 032A ; [.0000.0060.0002.032A] # COMBINING BRIDGE BELOW 032B ; [.0000.0060.0002.032B] # COMBINING INVERTED DOUBLE ARCH BELOW 032C ; [.0000.0060.0002.032C] # COMBINING CARON BELOW 032F ; [.0000.0060.0002.032F] # COMBINING INVERTED BREVE BELOW 0333 ; [.0000.0060.0002.0333] # COMBINING DOUBLE LOW LINE 033A ; [.0000.0060.0002.033A] # COMBINING INVERTED BRIDGE BELOW 033B ; [.0000.0060.0002.033B] # COMBINING SQUARE BELOW 033C ; [.0000.0060.0002.033C] # COMBINING SEAGULL BELOW 0347 ; [.0000.0060.0002.0347] # COMBINING EQUALS SIGN BELOW 0348 ; [.0000.0060.0002.0348] # COMBINING DOUBLE VERTICAL LINE BELOW 0349 ; [.0000.0060.0002.0349] # COMBINING LEFT ANGLE BELOW 034D ; [.0000.0060.0002.034D] # COMBINING LEFT RIGHT ARROW BELOW 034E ; [.0000.0060.0002.034E] # COMBINING UPWARDS ARROW BELOW 0353 ; [.0000.0060.0002.0353] # COMBINING X BELOW 0354 ; [.0000.0060.0002.0354] # COMBINING LEFT ARROWHEAD BELOW 0355 ; [.0000.0060.0002.0355] # COMBINING RIGHT ARROWHEAD BELOW 0356 ; [.0000.0060.0002.0356] # COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW 0359 ; [.0000.0060.0002.0359] # COMBINING ASTERISK BELOW 035A ; [.0000.0060.0002.035A] # COMBINING DOUBLE RING BELOW 035C ; [.0000.0060.0002.035C] # COMBINING DOUBLE BREVE BELOW 035F ; [.0000.0060.0002.035F] # COMBINING DOUBLE MACRON BELOW 0362 ; [.0000.0060.0002.0362] # COMBINING DOUBLE RIGHTWARDS ARROW BELOW 0742 ; [.0000.0060.0002.0742] # SYRIAC RUKKAKHA 0746 ; [.0000.0060.0002.0746] # SYRIAC THREE DOTS BELOW 0859 ; [.0000.0060.0002.0859] # MANDAIC AFFRICATION MARK 085A ; [.0000.0060.0002.085A] # MANDAIC VOCALIZATION MARK 085B ; [.0000.0060.0002.085B] # MANDAIC GEMINATION MARK 1DC2 ; [.0000.0060.0002.1DC2] # COMBINING SNAKE BELOW 1DCF ; [.0000.0060.0002.1DCF] # COMBINING ZIGZAG BELOW 1DD0 ; [.0000.0060.0002.1DD0] # COMBINING IS BELOW 1DFC ; [.0000.0060.0002.1DFC] # COMBINING DOUBLE INVERTED BREVE BELOW 1DFD ; [.0000.0060.0002.1DFD] # COMBINING ALMOST EQUAL TO BELOW 1DFF ; [.0000.0060.0002.1DFF] # COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW 20EC ; [.0000.0060.0002.20EC] # COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS 20ED ; [.0000.0060.0002.20ED] # COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS 20EE ; [.0000.0060.0002.20EE] # COMBINING LEFT ARROW BELOW 20EF ; [.0000.0060.0002.20EF] # COMBINING RIGHT ARROW BELOW 10A0D ; [.0000.0060.0002.10A0D] # KHAROSHTHI SIGN DOUBLE RING BELOW 0336 ; [.0000.0061.0002.0336] # COMBINING LONG STROKE OVERLAY 0337 ; [.0000.0061.0002.0337] # COMBINING SHORT SOLIDUS OVERLAY 20D8 ; [.0000.0061.0002.20D8] # COMBINING RING OVERLAY 20D9 ; [.0000.0061.0002.20D9] # COMBINING CLOCKWISE RING OVERLAY 20DA ; [.0000.0061.0002.20DA] # COMBINING ANTICLOCKWISE RING OVERLAY 20E5 ; [.0000.0061.0002.20E5] # COMBINING REVERSE SOLIDUS OVERLAY 20EA ; [.0000.0061.0002.20EA] # COMBINING LEFTWARDS ARROW OVERLAY 20EB ; [.0000.0061.0002.20EB] # COMBINING LONG DOUBLE SOLIDUS OVERLAY 20DD ; [.0000.0062.0002.20DD] # COMBINING ENCLOSING CIRCLE 20DE ; [.0000.0062.0002.20DE] # COMBINING ENCLOSING SQUARE 20DF ; [.0000.0062.0002.20DF] # COMBINING ENCLOSING DIAMOND 20E0 ; [.0000.0062.0002.20E0] # COMBINING ENCLOSING CIRCLE BACKSLASH 20E2 ; [.0000.0062.0002.20E2] # COMBINING ENCLOSING SCREEN 20E3 ; [.0000.0062.0002.20E3] # COMBINING ENCLOSING KEYCAP 20E4 ; [.0000.0062.0002.20E4] # COMBINING ENCLOSING UPWARD POINTING TRIANGLE 0305 ; [.0000.0063.0002.0305] # COMBINING OVERLINE 0309 ; [.0000.0064.0002.0309] # COMBINING HOOK ABOVE 030F ; [.0000.0065.0002.030F] # COMBINING DOUBLE GRAVE ACCENT 0310 ; [.0000.0066.0002.0310] # COMBINING CANDRABINDU 0311 ; [.0000.0067.0002.0311] # COMBINING INVERTED BREVE 031B ; [.0000.0068.0002.031B] # COMBINING HORN 0321 ; [.0000.006E.0002.0321] # COMBINING PALATALIZED HOOK BELOW 0322 ; [.0000.006F.0002.0322] # COMBINING RETROFLEX HOOK BELOW 0323 ; [.0000.0070.0002.0323] # COMBINING DOT BELOW 0324 ; [.0000.0075.0002.0324] # COMBINING DIAERESIS BELOW 0325 ; [.0000.0076.0002.0325] # COMBINING RING BELOW 0326 ; [.0000.0077.0002.0326] # COMBINING COMMA BELOW 032D ; [.0000.0078.0002.032D] # COMBINING CIRCUMFLEX ACCENT BELOW 032E ; [.0000.0079.0002.032E] # COMBINING BREVE BELOW 0330 ; [.0000.007A.0002.0330] # COMBINING TILDE BELOW 0331 ; [.0000.007B.0002.0331] # COMBINING MACRON BELOW 0334 ; [.0000.007C.0002.0334] # COMBINING TILDE OVERLAY 0335 ; [.0000.007D.0002.0335] # COMBINING SHORT STROKE OVERLAY 0339 ; [.0000.007E.0002.0339] # COMBINING RIGHT HALF RING BELOW 0345 ; [.0000.007F.0002.0345] # COMBINING GREEK YPOGEGRAMMENI 0358 ; [.0000.0080.0002.0358] # COMBINING DOT ABOVE RIGHT 0360 ; [.0000.0081.0002.0360] # COMBINING DOUBLE TILDE FE22 ; [.0000.0081.0002.FE22] # COMBINING DOUBLE TILDE LEFT HALF 0361 ; [.0000.0082.0002.0361] # COMBINING DOUBLE INVERTED BREVE FE20 ; [.0000.0082.0002.FE20] # COMBINING LIGATURE LEFT HALF 0483 ; [.0000.0083.0002.0483] # COMBINING CYRILLIC TITLO A66F ; [.0000.0084.0002.A66F] # COMBINING CYRILLIC VZMET 05B0 ; [.0000.0085.0002.05B0] # HEBREW POINT SHEVA 05B1 ; [.0000.0086.0002.05B1] # HEBREW POINT HATAF SEGOL 05B2 ; [.0000.0087.0002.05B2] # HEBREW POINT HATAF PATAH 05B3 ; [.0000.0088.0002.05B3] # HEBREW POINT HATAF QAMATS 05B4 ; [.0000.0089.0002.05B4] # HEBREW POINT HIRIQ 05B5 ; [.0000.008A.0002.05B5] # HEBREW POINT TSERE 05B6 ; [.0000.008B.0002.05B6] # HEBREW POINT SEGOL 05B7 ; [.0000.008C.0002.05B7] # HEBREW POINT PATAH 05B8 ; [.0000.008D.0002.05B8] # HEBREW POINT QAMATS 05C7 ; [.0000.008D.0002.05C7] # HEBREW POINT QAMATS QATAN 05B9 ; [.0000.008E.0002.05B9] # HEBREW POINT HOLAM 05BA ; [.0000.008E.0002.05BA] # HEBREW POINT HOLAM HASER FOR VAV 05BB ; [.0000.008F.0002.05BB] # HEBREW POINT QUBUTS 05C2 ; [.0000.0090.0002.05C2] # HEBREW POINT SIN DOT 05C1 ; [.0000.0091.0002.05C1] # HEBREW POINT SHIN DOT 05BC ; [.0000.0092.0002.05BC] # HEBREW POINT DAGESH OR MAPIQ 05BF ; [.0000.0095.0002.05BF] # HEBREW POINT RAFE FB1E ; [.0000.0096.0002.FB1E] # HEBREW POINT JUDEO-SPANISH VARIKA 081C ; [.0000.0097.0002.081C] # SAMARITAN VOWEL SIGN LONG E 081D ; [.0000.0097.0002.081D] # SAMARITAN VOWEL SIGN E 081E ; [.0000.0098.0002.081E] # SAMARITAN VOWEL SIGN OVERLONG AA 081F ; [.0000.0098.0002.081F] # SAMARITAN VOWEL SIGN LONG AA 0820 ; [.0000.0098.0002.0820] # SAMARITAN VOWEL SIGN AA 0821 ; [.0000.0099.0002.0821] # SAMARITAN VOWEL SIGN OVERLONG A 0822 ; [.0000.0099.0002.0822] # SAMARITAN VOWEL SIGN LONG A 0823 ; [.0000.0099.0002.0823] # SAMARITAN VOWEL SIGN A 0824 ; [.0000.009A.0002.0824] # SAMARITAN MODIFIER LETTER SHORT A 0825 ; [.0000.009A.0002.0825] # SAMARITAN VOWEL SIGN SHORT A 0826 ; [.0000.009B.0002.0826] # SAMARITAN VOWEL SIGN LONG U 0827 ; [.0000.009B.0002.0827] # SAMARITAN VOWEL SIGN U 0828 ; [.0000.009C.0002.0828] # SAMARITAN MODIFIER LETTER I 0829 ; [.0000.009C.0002.0829] # SAMARITAN VOWEL SIGN LONG I 082A ; [.0000.009C.0002.082A] # SAMARITAN VOWEL SIGN I 082B ; [.0000.009D.0002.082B] # SAMARITAN VOWEL SIGN O 082C ; [.0000.009E.0002.082C] # SAMARITAN VOWEL SIGN SUKUN 0818 ; [.0000.009F.0002.0818] # SAMARITAN MARK DAGESH 0819 ; [.0000.00A0.0002.0819] # SAMARITAN MARK OCCLUSION 082D ; [.0000.00A1.0002.082D] # SAMARITAN MARK NEQUDAA 064B ; [.0000.00A2.0002.064B] # ARABIC FATHATAN FE71 ; [.0000.00A2.0018.FE71] # ARABIC TATWEEL WITH FATHATAN ABOVE FE70 ; [.0000.00A2.001A.FE70] # ARABIC FATHATAN ISOLATED FORM 08F0 ; [.0000.00A3.0002.08F0] # ARABIC OPEN FATHATAN 08E7 ; [.0000.00A4.0002.08E7] # ARABIC CURLY FATHATAN 064C ; [.0000.00A5.0002.064C] # ARABIC DAMMATAN FE72 ; [.0000.00A5.001A.FE72] # ARABIC DAMMATAN ISOLATED FORM FC5E ; [.0000.00A5.001A.FC5E][.0000.00BA.001A.FC5E] # ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM 08F1 ; [.0000.00A7.0002.08F1] # ARABIC OPEN DAMMATAN 08E8 ; [.0000.00A8.0002.08E8] # ARABIC CURLY DAMMATAN 064D ; [.0000.00A9.0002.064D] # ARABIC KASRATAN FE74 ; [.0000.00A9.001A.FE74] # ARABIC KASRATAN ISOLATED FORM FC5F ; [.0000.00A9.001A.FC5F][.0000.00BA.001A.FC5F] # ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM 08F2 ; [.0000.00AB.0002.08F2] # ARABIC OPEN KASRATAN 08E9 ; [.0000.00AC.0002.08E9] # ARABIC CURLY KASRATAN 064E ; [.0000.00AD.0002.064E] # ARABIC FATHA FE77 ; [.0000.00AD.0018.FE77] # ARABIC FATHA MEDIAL FORM FE76 ; [.0000.00AD.001A.FE76] # ARABIC FATHA ISOLATED FORM FCF2 ; [.0000.00AD.0018.FCF2][.0000.00BA.0018.FCF2] # ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM FC60 ; [.0000.00AD.001A.FC60][.0000.00BA.001A.FC60] # ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM 08E4 ; [.0000.00AF.0002.08E4] # ARABIC CURLY FATHA 08F4 ; [.0000.00B0.0002.08F4] # ARABIC FATHA WITH RING 08F5 ; [.0000.00B1.0002.08F5] # ARABIC FATHA WITH DOT ABOVE 064F ; [.0000.00B2.0002.064F] # ARABIC DAMMA FE79 ; [.0000.00B2.0018.FE79] # ARABIC DAMMA MEDIAL FORM FE78 ; [.0000.00B2.001A.FE78] # ARABIC DAMMA ISOLATED FORM FCF3 ; [.0000.00B2.0018.FCF3][.0000.00BA.0018.FCF3] # ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM FC61 ; [.0000.00B2.001A.FC61][.0000.00BA.001A.FC61] # ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM 08E5 ; [.0000.00B4.0002.08E5] # ARABIC CURLY DAMMA 08FE ; [.0000.00B5.0002.08FE] # ARABIC DAMMA WITH DOT 0650 ; [.0000.00B6.0002.0650] # ARABIC KASRA FE7B ; [.0000.00B6.0018.FE7B] # ARABIC KASRA MEDIAL FORM FE7A ; [.0000.00B6.001A.FE7A] # ARABIC KASRA ISOLATED FORM FCF4 ; [.0000.00B6.0018.FCF4][.0000.00BA.0018.FCF4] # ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM FC62 ; [.0000.00B6.001A.FC62][.0000.00BA.001A.FC62] # ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM 08E6 ; [.0000.00B8.0002.08E6] # ARABIC CURLY KASRA 08F6 ; [.0000.00B9.0002.08F6] # ARABIC KASRA WITH DOT BELOW 0651 ; [.0000.00BA.0002.0651] # ARABIC SHADDA FE7D ; [.0000.00BA.0018.FE7D] # ARABIC SHADDA MEDIAL FORM FE7C ; [.0000.00BA.001A.FE7C] # ARABIC SHADDA ISOLATED FORM FC63 ; [.0000.00BA.001A.FC63][.0000.00D1.001A.FC63] # ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM 0652 ; [.0000.00BC.0002.0652] # ARABIC SUKUN FE7F ; [.0000.00BC.0018.FE7F] # ARABIC SUKUN MEDIAL FORM FE7E ; [.0000.00BC.001A.FE7E] # ARABIC SUKUN ISOLATED FORM 0653 ; [.0000.00BD.0002.0653] # ARABIC MADDAH ABOVE 0654 ; [.0000.00BE.0002.0654] # ARABIC HAMZA ABOVE 0655 ; [.0000.00BF.0002.0655] # ARABIC HAMZA BELOW 065F ; [.0000.00C0.0002.065F] # ARABIC WAVY HAMZA BELOW 0656 ; [.0000.00C1.0002.0656] # ARABIC SUBSCRIPT ALEF 0657 ; [.0000.00C2.0002.0657] # ARABIC INVERTED DAMMA 0658 ; [.0000.00C3.0002.0658] # ARABIC MARK NOON GHUNNA 0659 ; [.0000.00C4.0002.0659] # ARABIC ZWARAKAY 065A ; [.0000.00C5.0002.065A] # ARABIC VOWEL SIGN SMALL V ABOVE 065B ; [.0000.00C6.0002.065B] # ARABIC VOWEL SIGN INVERTED SMALL V ABOVE 065C ; [.0000.00C7.0002.065C] # ARABIC VOWEL SIGN DOT BELOW 065D ; [.0000.00C8.0002.065D] # ARABIC REVERSED DAMMA 065E ; [.0000.00C9.0002.065E] # ARABIC FATHA WITH TWO DOTS 08F7 ; [.0000.00CA.0002.08F7] # ARABIC LEFT ARROWHEAD ABOVE 08F8 ; [.0000.00CB.0002.08F8] # ARABIC RIGHT ARROWHEAD ABOVE 08FD ; [.0000.00CC.0002.08FD] # ARABIC RIGHT ARROWHEAD ABOVE WITH DOT 08FB ; [.0000.00CD.0002.08FB] # ARABIC DOUBLE RIGHT ARROWHEAD ABOVE 08FC ; [.0000.00CE.0002.08FC] # ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT 08F9 ; [.0000.00CF.0002.08F9] # ARABIC LEFT ARROWHEAD BELOW 08FA ; [.0000.00D0.0002.08FA] # ARABIC RIGHT ARROWHEAD BELOW 0670 ; [.0000.00D1.0002.0670] # ARABIC LETTER SUPERSCRIPT ALEF 0711 ; [.0000.00D2.0002.0711] # SYRIAC LETTER SUPERSCRIPT ALAPH 0730 ; [.0000.00D3.0002.0730] # SYRIAC PTHAHA ABOVE 0731 ; [.0000.00D4.0002.0731] # SYRIAC PTHAHA BELOW 0732 ; [.0000.00D5.0002.0732] # SYRIAC PTHAHA DOTTED 0733 ; [.0000.00D6.0002.0733] # SYRIAC ZQAPHA ABOVE 0734 ; [.0000.00D7.0002.0734] # SYRIAC ZQAPHA BELOW 0735 ; [.0000.00D8.0002.0735] # SYRIAC ZQAPHA DOTTED 0736 ; [.0000.00D9.0002.0736] # SYRIAC RBASA ABOVE 0737 ; [.0000.00DA.0002.0737] # SYRIAC RBASA BELOW 0738 ; [.0000.00DB.0002.0738] # SYRIAC DOTTED ZLAMA HORIZONTAL 0739 ; [.0000.00DC.0002.0739] # SYRIAC DOTTED ZLAMA ANGULAR 073A ; [.0000.00DD.0002.073A] # SYRIAC HBASA ABOVE 073B ; [.0000.00DE.0002.073B] # SYRIAC HBASA BELOW 073C ; [.0000.00DF.0002.073C] # SYRIAC HBASA-ESASA DOTTED 073D ; [.0000.00E0.0002.073D] # SYRIAC ESASA ABOVE 073E ; [.0000.00E1.0002.073E] # SYRIAC ESASA BELOW 073F ; [.0000.00E2.0002.073F] # SYRIAC RWAHA 07EB ; [.0000.00E3.0002.07EB] # NKO COMBINING SHORT HIGH TONE 07EC ; [.0000.00E4.0002.07EC] # NKO COMBINING SHORT LOW TONE 07ED ; [.0000.00E5.0002.07ED] # NKO COMBINING SHORT RISING TONE 07EE ; [.0000.00E6.0002.07EE] # NKO COMBINING LONG DESCENDING TONE 07EF ; [.0000.00E7.0002.07EF] # NKO COMBINING LONG HIGH TONE 07F0 ; [.0000.00E8.0002.07F0] # NKO COMBINING LONG LOW TONE 07F1 ; [.0000.00E9.0002.07F1] # NKO COMBINING LONG RISING TONE 07F2 ; [.0000.00EA.0002.07F2] # NKO COMBINING NASALIZATION MARK 07F3 ; [.0000.00EB.0002.07F3] # NKO COMBINING DOUBLE DOT ABOVE 135F ; [.0000.00EC.0002.135F] # ETHIOPIC COMBINING GEMINATION MARK 135E ; [.0000.00ED.0002.135E] # ETHIOPIC COMBINING VOWEL LENGTH MARK 135D ; [.0000.00EE.0002.135D] # ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK A6F0 ; [.0000.00EF.0002.A6F0] # BAMUM COMBINING MARK KOQNDON A6F1 ; [.0000.00F0.0002.A6F1] # BAMUM COMBINING MARK TUKWENTIS 093C ; [.0000.00F1.0002.093C] # DEVANAGARI SIGN NUKTA 09BC ; [.0000.00F1.0002.09BC] # BENGALI SIGN NUKTA 0A3C ; [.0000.00F1.0002.0A3C] # GURMUKHI SIGN NUKTA 0ABC ; [.0000.00F1.0002.0ABC] # GUJARATI SIGN NUKTA 0B3C ; [.0000.00F1.0002.0B3C] # ORIYA SIGN NUKTA 0CBC ; [.0000.00F1.0002.0CBC] # KANNADA SIGN NUKTA 1B34 ; [.0000.00F1.0002.1B34] # BALINESE SIGN REREKAN 1BE6 ; [.0000.00F1.0002.1BE6] # BATAK SIGN TOMPI 1C37 ; [.0000.00F1.0002.1C37] # LEPCHA SIGN NUKTA A9B3 ; [.0000.00F1.0002.A9B3] # JAVANESE SIGN CECAK TELU 110BA ; [.0000.00F1.0002.110BA] # KAITHI SIGN NUKTA 116B7 ; [.0000.00F1.0002.116B7] # TAKRI SIGN NUKTA 0900 ; [.0000.00F2.0002.0900] # DEVANAGARI SIGN INVERTED CANDRABINDU 0901 ; [.0000.00F2.0002.0901] # DEVANAGARI SIGN CANDRABINDU 0981 ; [.0000.00F2.0002.0981] # BENGALI SIGN CANDRABINDU 0A01 ; [.0000.00F2.0002.0A01] # GURMUKHI SIGN ADAK BINDI 0A81 ; [.0000.00F2.0002.0A81] # GUJARATI SIGN CANDRABINDU 0B01 ; [.0000.00F2.0002.0B01] # ORIYA SIGN CANDRABINDU 0C01 ; [.0000.00F2.0002.0C01] # TELUGU SIGN CANDRABINDU 1B00 ; [.0000.00F2.0002.1B00] # BALINESE SIGN ULU RICEM 1B01 ; [.0000.00F2.0002.1B01] # BALINESE SIGN ULU CANDRA A980 ; [.0000.00F2.0002.A980] # JAVANESE SIGN PANYANGGA 11000 ; [.0000.00F2.0002.11000] # BRAHMI SIGN CANDRABINDU 11080 ; [.0000.00F2.0002.11080] # KAITHI SIGN CANDRABINDU 11100 ; [.0000.00F2.0002.11100] # CHAKMA SIGN CANDRABINDU 11180 ; [.0000.00F2.0002.11180] # SHARADA SIGN CANDRABINDU 0902 ; [.0000.00F3.0002.0902] # DEVANAGARI SIGN ANUSVARA 0982 ; [.0000.00F3.0002.0982] # BENGALI SIGN ANUSVARA 0A02 ; [.0000.00F3.0002.0A02] # GURMUKHI SIGN BINDI 0A82 ; [.0000.00F3.0002.0A82] # GUJARATI SIGN ANUSVARA 0B02 ; [.0000.00F3.0002.0B02] # ORIYA SIGN ANUSVARA 0B82 ; [.0000.00F3.0002.0B82] # TAMIL SIGN ANUSVARA 0C02 ; [.0000.00F3.0002.0C02] # TELUGU SIGN ANUSVARA 0C82 ; [.0000.00F3.0002.0C82] # KANNADA SIGN ANUSVARA 0D02 ; [.0000.00F3.0002.0D02] # MALAYALAM SIGN ANUSVARA 0D82 ; [.0000.00F3.0002.0D82] # SINHALA SIGN ANUSVARAYA 0F7E ; [.0000.00F3.0002.0F7E] # TIBETAN SIGN RJES SU NGA RO 1036 ; [.0000.00F3.0002.1036] # MYANMAR SIGN ANUSVARA 17C6 ; [.0000.00F3.0002.17C6] # KHMER SIGN NIKAHIT 1A74 ; [.0000.00F3.0002.1A74] # TAI THAM SIGN MAI KANG 1B02 ; [.0000.00F3.0002.1B02] # BALINESE SIGN CECEK 1B80 ; [.0000.00F3.0002.1B80] # SUNDANESE SIGN PANYECEK 1CED ; [.0000.00F3.0002.1CED] # VEDIC SIGN TIRYAK A80B ; [.0000.00F3.0002.A80B] # SYLOTI NAGRI SIGN ANUSVARA A880 ; [.0000.00F3.0002.A880] # SAURASHTRA SIGN ANUSVARA A981 ; [.0000.00F3.0002.A981] # JAVANESE SIGN CECAK 10A0E ; [.0000.00F3.0002.10A0E] # KHAROSHTHI SIGN ANUSVARA 11001 ; [.0000.00F3.0002.11001] # BRAHMI SIGN ANUSVARA 11081 ; [.0000.00F3.0002.11081] # KAITHI SIGN ANUSVARA 11101 ; [.0000.00F3.0002.11101] # CHAKMA SIGN ANUSVARA 11181 ; [.0000.00F3.0002.11181] # SHARADA SIGN ANUSVARA 116AB ; [.0000.00F3.0002.116AB] # TAKRI SIGN ANUSVARA 0903 ; [.0000.00F4.0002.0903] # DEVANAGARI SIGN VISARGA 0983 ; [.0000.00F4.0002.0983] # BENGALI SIGN VISARGA 0A03 ; [.0000.00F4.0002.0A03] # GURMUKHI SIGN VISARGA 0A83 ; [.0000.00F4.0002.0A83] # GUJARATI SIGN VISARGA 0B03 ; [.0000.00F4.0002.0B03] # ORIYA SIGN VISARGA 0C03 ; [.0000.00F4.0002.0C03] # TELUGU SIGN VISARGA 0C83 ; [.0000.00F4.0002.0C83] # KANNADA SIGN VISARGA 0D03 ; [.0000.00F4.0002.0D03] # MALAYALAM SIGN VISARGA 0D83 ; [.0000.00F4.0002.0D83] # SINHALA SIGN VISARGAYA 0F7F ; [.0000.00F4.0002.0F7F] # TIBETAN SIGN RNAM BCAD 1038 ; [.0000.00F4.0002.1038] # MYANMAR SIGN VISARGA 17C7 ; [.0000.00F4.0002.17C7] # KHMER SIGN REAHMUK 1B04 ; [.0000.00F4.0002.1B04] # BALINESE SIGN BISAH 1B82 ; [.0000.00F4.0002.1B82] # SUNDANESE SIGN PANGWISAD 1CF2 ; [.0000.00F4.0002.1CF2] # VEDIC SIGN ARDHAVISARGA 1CF3 ; [.0000.00F4.0002.1CF3] # VEDIC SIGN ROTATED ARDHAVISARGA A881 ; [.0000.00F4.0002.A881] # SAURASHTRA SIGN VISARGA A983 ; [.0000.00F4.0002.A983] # JAVANESE SIGN WIGNYAN 10A0F ; [.0000.00F4.0002.10A0F] # KHAROSHTHI SIGN VISARGA 11002 ; [.0000.00F4.0002.11002] # BRAHMI SIGN VISARGA 11082 ; [.0000.00F4.0002.11082] # KAITHI SIGN VISARGA 11102 ; [.0000.00F4.0002.11102] # CHAKMA SIGN VISARGA 11182 ; [.0000.00F4.0002.11182] # SHARADA SIGN VISARGA 116AC ; [.0000.00F4.0002.116AC] # TAKRI SIGN VISARGA 0A70 ; [.0000.00F5.0002.0A70] # GURMUKHI TIPPI 0A71 ; [.0000.00F6.0002.0A71] # GURMUKHI ADDAK 1B03 ; [.0000.00F7.0002.1B03] # BALINESE SIGN SURANG A982 ; [.0000.00F8.0002.A982] # JAVANESE SIGN LAYAR 1B81 ; [.0000.00F9.0002.1B81] # SUNDANESE SIGN PANGLAYAR ABEC ; [.0000.00FA.0002.ABEC] # MEETEI MAYEK LUM IYEK 10A38 ; [.0000.00FB.0002.10A38] # KHAROSHTHI SIGN BAR ABOVE 10A39 ; [.0000.00FC.0002.10A39] # KHAROSHTHI SIGN CAUDA 10A3A ; [.0000.00FD.0002.10A3A] # KHAROSHTHI SIGN DOT BELOW 0E4E ; [.0000.00FE.0002.0E4E] # THAI CHARACTER YAMAKKAN 0E47 ; [.0000.00FF.0002.0E47] # THAI CHARACTER MAITAIKHU 0E48 ; [.0000.0100.0002.0E48] # THAI CHARACTER MAI EK 0E49 ; [.0000.0101.0002.0E49] # THAI CHARACTER MAI THO 0E4A ; [.0000.0102.0002.0E4A] # THAI CHARACTER MAI TRI 0E4B ; [.0000.0103.0002.0E4B] # THAI CHARACTER MAI CHATTAWA 0E4C ; [.0000.0104.0002.0E4C] # THAI CHARACTER THANTHAKHAT 0E4D ; [.0000.0105.0002.0E4D] # THAI CHARACTER NIKHAHIT 0EC8 ; [.0000.0106.0002.0EC8] # LAO TONE MAI EK 0EC9 ; [.0000.0107.0002.0EC9] # LAO TONE MAI THO 0ECA ; [.0000.0108.0002.0ECA] # LAO TONE MAI TI 0ECB ; [.0000.0109.0002.0ECB] # LAO TONE MAI CATAWA 0ECC ; [.0000.010A.0002.0ECC] # LAO CANCELLATION MARK 0ECD ; [.0000.010B.0002.0ECD] # LAO NIGGAHITA AABF ; [.0000.010C.0002.AABF] # TAI VIET TONE MAI EK AAC1 ; [.0000.010D.0002.AAC1] # TAI VIET TONE MAI THO 0F39 ; [.0000.010E.0002.0F39] # TIBETAN MARK TSA -PHRU A92B ; [.0000.010F.0002.A92B] # KAYAH LI TONE PLOPHU A92C ; [.0000.0110.0002.A92C] # KAYAH LI TONE CALYA A92D ; [.0000.0111.0002.A92D] # KAYAH LI TONE CALYA PLOPHU 1037 ; [.0000.0112.0002.1037] # MYANMAR SIGN DOT BELOW 108D ; [.0000.0113.0002.108D] # MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE 17C8 ; [.0000.0114.0002.17C8] # KHMER SIGN YUUKALEAPINTU 17C9 ; [.0000.0115.0002.17C9] # KHMER SIGN MUUSIKATOAN 17CA ; [.0000.0116.0002.17CA] # KHMER SIGN TRIISAP 1A75 ; [.0000.0117.0002.1A75] # TAI THAM SIGN TONE-1 1A76 ; [.0000.0118.0002.1A76] # TAI THAM SIGN TONE-2 1A77 ; [.0000.0119.0002.1A77] # TAI THAM SIGN KHUEN TONE-3 1A78 ; [.0000.011A.0002.1A78] # TAI THAM SIGN KHUEN TONE-4 1A79 ; [.0000.011B.0002.1A79] # TAI THAM SIGN KHUEN TONE-5 1A7A ; [.0000.011C.0002.1A7A] # TAI THAM SIGN RA HAAM 1A7B ; [.0000.011D.0002.1A7B] # TAI THAM SIGN MAI SAM 1A7C ; [.0000.011E.0002.1A7C] # TAI THAM SIGN KHUEN-LUE KARAN 1939 ; [.0000.011F.0002.1939] # LIMBU SIGN MUKPHRENG 193A ; [.0000.0120.0002.193A] # LIMBU SIGN KEMPHRENG 193B ; [.0000.0121.0002.193B] # LIMBU SIGN SA-I 302A ; [.0000.0122.0002.302A] # IDEOGRAPHIC LEVEL TONE MARK 302B ; [.0000.0123.0002.302B] # IDEOGRAPHIC RISING TONE MARK 302C ; [.0000.0124.0002.302C] # IDEOGRAPHIC DEPARTING TONE MARK 302D ; [.0000.0125.0002.302D] # IDEOGRAPHIC ENTERING TONE MARK 302E ; [.0000.0126.0002.302E] # HANGUL SINGLE DOT TONE MARK 302F ; [.0000.0127.0002.302F] # HANGUL DOUBLE DOT TONE MARK 3099 ; [.0000.0128.0002.3099] # COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK FF9E ; [.0000.0128.0012.FF9E] # HALFWIDTH KATAKANA VOICED SOUND MARK 309A ; [.0000.0129.0002.309A] # COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK FF9F ; [.0000.0129.0012.FF9F] # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK 20D0 ; [.0000.012A.0002.20D0] # COMBINING LEFT HARPOON ABOVE 20D1 ; [.0000.012B.0002.20D1] # COMBINING RIGHT HARPOON ABOVE 20D2 ; [.0000.012C.0002.20D2] # COMBINING LONG VERTICAL LINE OVERLAY 20D3 ; [.0000.012C.0002.20D3] # COMBINING SHORT VERTICAL LINE OVERLAY 20D4 ; [.0000.012D.0002.20D4] # COMBINING ANTICLOCKWISE ARROW ABOVE 20D5 ; [.0000.012E.0002.20D5] # COMBINING CLOCKWISE ARROW ABOVE 20D6 ; [.0000.012F.0002.20D6] # COMBINING LEFT ARROW ABOVE 20D7 ; [.0000.0130.0002.20D7] # COMBINING RIGHT ARROW ABOVE 20DB ; [.0000.0131.0002.20DB] # COMBINING THREE DOTS ABOVE 20DC ; [.0000.0132.0002.20DC] # COMBINING FOUR DOTS ABOVE 20E1 ; [.0000.0133.0002.20E1] # COMBINING LEFT RIGHT ARROW ABOVE 20E6 ; [.0000.0134.0002.20E6] # COMBINING DOUBLE VERTICAL STROKE OVERLAY 20E7 ; [.0000.0135.0002.20E7] # COMBINING ANNUITY SYMBOL 20E8 ; [.0000.0136.0002.20E8] # COMBINING TRIPLE UNDERDOT 20E9 ; [.0000.0137.0002.20E9] # COMBINING WIDE BRIDGE ABOVE 101FD ; [.0000.0138.0002.101FD] # PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE 02D0 ; [.158E.0020.0002.02D0] # MODIFIER LETTER TRIANGULAR COLON 02D1 ; [.158F.0020.0002.02D1] # MODIFIER LETTER HALF TRIANGULAR COLON 0971 ; [.1590.0020.0002.0971] # DEVANAGARI SIGN HIGH SPACING DOT 0E46 ; [.1591.0020.0002.0E46] # THAI CHARACTER MAIYAMOK 0EC6 ; [.1592.0020.0002.0EC6] # LAO KO LA 17D7 ; [.1593.0020.0002.17D7] # KHMER SIGN LEK TOO 1AA7 ; [.1594.0020.0002.1AA7] # TAI THAM SIGN MAI YAMOK A9CF ; [.1595.0020.0002.A9CF] # JAVANESE PANGRANGKEP AA70 ; [.1596.0020.0002.AA70] # MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION AADD ; [.1597.0020.0002.AADD] # TAI VIET SYMBOL SAM AAF3 ; [.1598.0020.0002.AAF3] # MEETEI MAYEK SYLLABLE REPETITION MARK AAF4 ; [.1599.0020.0002.AAF4] # MEETEI MAYEK WORD REPETITION MARK 3005 ; [.159A.0020.0002.3005] # IDEOGRAPHIC ITERATION MARK 303B ; [.159B.0020.0002.303B] # VERTICAL IDEOGRAPHIC ITERATION MARK 3031 ; [.159C.0020.0002.3031] # VERTICAL KANA REPEAT MARK 3032 ; [.159C.0020.0002.3031][.0000.0128.0002.3099] # VERTICAL KANA REPEAT WITH VOICED SOUND MARK 3033 ; [.159D.0020.0002.3033] # VERTICAL KANA REPEAT MARK UPPER HALF 3034 ; [.159D.0020.0002.3033][.0000.0128.0002.3099] # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF 3035 ; [.159E.0020.0002.3035] # VERTICAL KANA REPEAT MARK LOWER HALF 309D ; [.159F.0020.0002.309D] # HIRAGANA ITERATION MARK 309E ; [.159F.0020.0002.309D][.0000.0128.0002.3099] # HIRAGANA VOICED ITERATION MARK 30FC ; [.15A0.0020.0002.30FC] # KATAKANA-HIRAGANA PROLONGED SOUND MARK FF70 ; [.15A0.0020.0012.FF70] # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK 30FD ; [.15A1.0020.0002.30FD] # KATAKANA ITERATION MARK 30FE ; [.15A1.0020.0002.30FD][.0000.0128.0002.3099] # KATAKANA VOICED ITERATION MARK 00A4 ; [.15A2.0020.0002.00A4] # CURRENCY SIGN 00A2 ; [.15A3.0020.0002.00A2] # CENT SIGN FFE0 ; [.15A3.0020.0003.FFE0] # FULLWIDTH CENT SIGN 0024 ; [.15A4.0020.0002.0024] # DOLLAR SIGN FF04 ; [.15A4.0020.0003.FF04] # FULLWIDTH DOLLAR SIGN FE69 ; [.15A4.0020.000F.FE69] # SMALL DOLLAR SIGN 00A3 ; [.15A5.0020.0002.00A3] # POUND SIGN FFE1 ; [.15A5.0020.0003.FFE1] # FULLWIDTH POUND SIGN 00A5 ; [.15A6.0020.0002.00A5] # YEN SIGN FFE5 ; [.15A6.0020.0003.FFE5] # FULLWIDTH YEN SIGN 058F ; [.15A7.0020.0002.058F] # ARMENIAN DRAM SIGN 060B ; [.15A8.0020.0002.060B] # AFGHANI SIGN 09F2 ; [.15A9.0020.0002.09F2] # BENGALI RUPEE MARK 09F3 ; [.15AA.0020.0002.09F3] # BENGALI RUPEE SIGN 09FB ; [.15AB.0020.0002.09FB] # BENGALI GANDA MARK 0AF1 ; [.15AC.0020.0002.0AF1] # GUJARATI RUPEE SIGN A838 ; [.15AD.0020.0002.A838] # NORTH INDIC RUPEE MARK 0BF9 ; [.15AE.0020.0002.0BF9] # TAMIL RUPEE SIGN 0E3F ; [.15AF.0020.0002.0E3F] # THAI CURRENCY SYMBOL BAHT 17DB ; [.15B0.0020.0002.17DB] # KHMER CURRENCY SYMBOL RIEL 20A0 ; [.15B1.0020.0002.20A0] # EURO-CURRENCY SIGN 20A1 ; [.15B2.0020.0002.20A1] # COLON SIGN 20A2 ; [.15B3.0020.0002.20A2] # CRUZEIRO SIGN 20A3 ; [.15B4.0020.0002.20A3] # FRENCH FRANC SIGN 20A4 ; [.15B5.0020.0002.20A4] # LIRA SIGN 20A5 ; [.15B6.0020.0002.20A5] # MILL SIGN 20A6 ; [.15B7.0020.0002.20A6] # NAIRA SIGN 20A7 ; [.15B8.0020.0002.20A7] # PESETA SIGN 20A9 ; [.15B9.0020.0002.20A9] # WON SIGN FFE6 ; [.15B9.0020.0003.FFE6] # FULLWIDTH WON SIGN 20AA ; [.15BA.0020.0002.20AA] # NEW SHEQEL SIGN 20AB ; [.15BB.0020.0002.20AB] # DONG SIGN 20AC ; [.15BC.0020.0002.20AC] # EURO SIGN 20AD ; [.15BD.0020.0002.20AD] # KIP SIGN 20AE ; [.15BE.0020.0002.20AE] # TUGRIK SIGN 20AF ; [.15BF.0020.0002.20AF] # DRACHMA SIGN 20B0 ; [.15C0.0020.0002.20B0] # GERMAN PENNY SIGN 20B1 ; [.15C1.0020.0002.20B1] # PESO SIGN 20B2 ; [.15C2.0020.0002.20B2] # GUARANI SIGN 20B3 ; [.15C3.0020.0002.20B3] # AUSTRAL SIGN 20B4 ; [.15C4.0020.0002.20B4] # HRYVNIA SIGN 20B5 ; [.15C5.0020.0002.20B5] # CEDI SIGN 20B6 ; [.15C6.0020.0002.20B6] # LIVRE TOURNOIS SIGN 20B7 ; [.15C7.0020.0002.20B7] # SPESMILO SIGN 20B8 ; [.15C8.0020.0002.20B8] # TENGE SIGN 20B9 ; [.15C9.0020.0002.20B9] # INDIAN RUPEE SIGN 0030 ; [.15CA.0020.0002.0030] # DIGIT ZERO FF10 ; [.15CA.0020.0003.FF10] # FULLWIDTH DIGIT ZERO 1F100 ; [.15CA.0020.0004.1F100][*0273.0020.0004.1F100] # DIGIT ZERO FULL STOP 1F101 ; [.15CA.0020.0004.1F101][*0221.0020.0004.1F101] # DIGIT ZERO COMMA 1D7CE ; [.15CA.0020.0005.1D7CE] # MATHEMATICAL BOLD DIGIT ZERO 1D7D8 ; [.15CA.0020.0005.1D7D8] # MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO 1D7E2 ; [.15CA.0020.0005.1D7E2] # MATHEMATICAL SANS-SERIF DIGIT ZERO 1D7EC ; [.15CA.0020.0005.1D7EC] # MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO 1D7F6 ; [.15CA.0020.0005.1D7F6] # MATHEMATICAL MONOSPACE DIGIT ZERO 24EA ; [.15CA.0020.0006.24EA] # CIRCLED DIGIT ZERO 24FF ; [.15CA.0020.0006.24FF] # NEGATIVE CIRCLED DIGIT ZERO 2070 ; [.15CA.0020.0014.2070] # SUPERSCRIPT ZERO 2080 ; [.15CA.0020.0015.2080] # SUBSCRIPT ZERO 0660 ; [.15CA.0020.0002.0660][.0000.013F.0002.0660] # ARABIC-INDIC DIGIT ZERO 06F0 ; [.15CA.0020.0002.06F0][.0000.0140.0002.06F0] # EXTENDED ARABIC-INDIC DIGIT ZERO 07C0 ; [.15CA.0020.0002.07C0][.0000.0142.0002.07C0] # NKO DIGIT ZERO 104A0 ; [.15CA.0020.0002.104A0][.0000.0144.0002.104A0] # OSMANYA DIGIT ZERO 0966 ; [.15CA.0020.0002.0966][.0000.0145.0002.0966] # DEVANAGARI DIGIT ZERO 09E6 ; [.15CA.0020.0002.09E6][.0000.0146.0002.09E6] # BENGALI DIGIT ZERO 0A66 ; [.15CA.0020.0002.0A66][.0000.0147.0002.0A66] # GURMUKHI DIGIT ZERO 0AE6 ; [.15CA.0020.0002.0AE6][.0000.0148.0002.0AE6] # GUJARATI DIGIT ZERO 0B66 ; [.15CA.0020.0002.0B66][.0000.0149.0002.0B66] # ORIYA DIGIT ZERO 0BE6 ; [.15CA.0020.0002.0BE6][.0000.014A.0002.0BE6] # TAMIL DIGIT ZERO 0C66 ; [.15CA.0020.0002.0C66][.0000.014B.0002.0C66] # TELUGU DIGIT ZERO 0C78 ; [.15CA.0020.0002.0C78][.0000.014B.0002.0C78] # TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR 0CE6 ; [.15CA.0020.0002.0CE6][.0000.014C.0002.0CE6] # KANNADA DIGIT ZERO 0D66 ; [.15CA.0020.0002.0D66][.0000.014D.0002.0D66] # MALAYALAM DIGIT ZERO ABF0 ; [.15CA.0020.0002.ABF0][.0000.014E.0002.ABF0] # MEETEI MAYEK DIGIT ZERO A8D0 ; [.15CA.0020.0002.A8D0][.0000.014F.0002.A8D0] # SAURASHTRA DIGIT ZERO 1946 ; [.15CA.0020.0002.1946][.0000.0150.0002.1946] # LIMBU DIGIT ZERO 19D0 ; [.15CA.0020.0002.19D0][.0000.0151.0002.19D0] # NEW TAI LUE DIGIT ZERO 1A80 ; [.15CA.0020.0002.1A80][.0000.0152.0002.1A80] # TAI THAM HORA DIGIT ZERO 1A90 ; [.15CA.0020.0002.1A90][.0000.0153.0002.1A90] # TAI THAM THAM DIGIT ZERO 0E50 ; [.15CA.0020.0002.0E50][.0000.0154.0002.0E50] # THAI DIGIT ZERO 0ED0 ; [.15CA.0020.0002.0ED0][.0000.0155.0002.0ED0] # LAO DIGIT ZERO 0F20 ; [.15CA.0020.0002.0F20][.0000.0156.0002.0F20] # TIBETAN DIGIT ZERO 0F33 ; [.15CA.0020.0004.0F33][.0000.0156.0004.0F33] # TIBETAN DIGIT HALF ZERO 1C40 ; [.15CA.0020.0002.1C40][.0000.0157.0002.1C40] # LEPCHA DIGIT ZERO A900 ; [.15CA.0020.0002.A900][.0000.0158.0002.A900] # KAYAH LI DIGIT ZERO 1040 ; [.15CA.0020.0002.1040][.0000.0159.0002.1040] # MYANMAR DIGIT ZERO 1090 ; [.15CA.0020.0002.1090][.0000.015A.0002.1090] # MYANMAR SHAN DIGIT ZERO 11136 ; [.15CA.0020.0002.11136][.0000.015B.0002.11136] # CHAKMA DIGIT ZERO 17E0 ; [.15CA.0020.0002.17E0][.0000.015C.0002.17E0] # KHMER DIGIT ZERO 17F0 ; [.15CA.0020.0002.17F0][.0000.015D.0002.17F0] # KHMER SYMBOL LEK ATTAK SON AA50 ; [.15CA.0020.0002.AA50][.0000.015E.0002.AA50] # CHAM DIGIT ZERO 1B50 ; [.15CA.0020.0002.1B50][.0000.015F.0002.1B50] # BALINESE DIGIT ZERO A9D0 ; [.15CA.0020.0002.A9D0][.0000.0160.0002.A9D0] # JAVANESE DIGIT ZERO 1BB0 ; [.15CA.0020.0002.1BB0][.0000.0161.0002.1BB0] # SUNDANESE DIGIT ZERO 1810 ; [.15CA.0020.0002.1810][.0000.0162.0002.1810] # MONGOLIAN DIGIT ZERO 1C50 ; [.15CA.0020.0002.1C50][.0000.0163.0002.1C50] # OL CHIKI DIGIT ZERO A620 ; [.15CA.0020.0002.A620][.0000.0164.0002.A620] # VAI DIGIT ZERO 110F0 ; [.15CA.0020.0002.110F0][.0000.0165.0002.110F0] # SORA SOMPENG DIGIT ZERO 3007 ; [.15CA.0020.0002.3007][.0000.0166.0002.3007] # IDEOGRAPHIC NUMBER ZERO 1018A ; [.15CA.0020.0002.1018A][.0000.0168.0002.1018A] # GREEK ZERO SIGN 111D0 ; [.15CA.0020.0002.111D0][.0000.0172.0002.111D0] # SHARADA DIGIT ZERO 116C0 ; [.15CA.0020.0002.116C0][.0000.0173.0002.116C0] # TAKRI DIGIT ZERO 11066 ; [.15CA.0020.0002.11066][.0000.0174.0002.11066] # BRAHMI DIGIT ZERO 2189 ; [.15CA.0020.001E.2189][*05AC.0020.001E.2189][.15CD.0020.001F.2189] # VULGAR FRACTION ZERO THIRDS 3358 ; [.15CA.0020.0004.3358][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO 0031 ; [.15CB.0020.0002.0031] # DIGIT ONE FF11 ; [.15CB.0020.0003.FF11] # FULLWIDTH DIGIT ONE 2474 ; [*02FB.0020.0004.2474][.15CB.0020.0004.2474][*02FC.0020.001F.2474] # PARENTHESIZED DIGIT ONE 2488 ; [.15CB.0020.0004.2488][*0273.0020.0004.2488] # DIGIT ONE FULL STOP 1F102 ; [.15CB.0020.0004.1F102][*0221.0020.0004.1F102] # DIGIT ONE COMMA 1D7CF ; [.15CB.0020.0005.1D7CF] # MATHEMATICAL BOLD DIGIT ONE 1D7D9 ; [.15CB.0020.0005.1D7D9] # MATHEMATICAL DOUBLE-STRUCK DIGIT ONE 1D7E3 ; [.15CB.0020.0005.1D7E3] # MATHEMATICAL SANS-SERIF DIGIT ONE 1D7ED ; [.15CB.0020.0005.1D7ED] # MATHEMATICAL SANS-SERIF BOLD DIGIT ONE 1D7F7 ; [.15CB.0020.0005.1D7F7] # MATHEMATICAL MONOSPACE DIGIT ONE 2460 ; [.15CB.0020.0006.2460] # CIRCLED DIGIT ONE 24F5 ; [.15CB.0020.0006.24F5] # DOUBLE CIRCLED DIGIT ONE 2776 ; [.15CB.0020.0006.2776] # DINGBAT NEGATIVE CIRCLED DIGIT ONE 2780 ; [.15CB.0020.0006.2780] # DINGBAT CIRCLED SANS-SERIF DIGIT ONE 278A ; [.15CB.0020.0006.278A] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE 00B9 ; [.15CB.0020.0014.00B9] # SUPERSCRIPT ONE 2081 ; [.15CB.0020.0015.2081] # SUBSCRIPT ONE 215F ; [.15CB.0020.001E.215F][*05AC.0020.001E.215F] # FRACTION NUMERATOR ONE 0661 ; [.15CB.0020.0002.0661][.0000.013F.0002.0661] # ARABIC-INDIC DIGIT ONE 06F1 ; [.15CB.0020.0002.06F1][.0000.0140.0002.06F1] # EXTENDED ARABIC-INDIC DIGIT ONE 10E60 ; [.15CB.0020.0002.10E60][.0000.0141.0002.10E60] # RUMI DIGIT ONE 07C1 ; [.15CB.0020.0002.07C1][.0000.0142.0002.07C1] # NKO DIGIT ONE 1369 ; [.15CB.0020.0002.1369][.0000.0143.0002.1369] # ETHIOPIC DIGIT ONE 104A1 ; [.15CB.0020.0002.104A1][.0000.0144.0002.104A1] # OSMANYA DIGIT ONE 0967 ; [.15CB.0020.0002.0967][.0000.0145.0002.0967] # DEVANAGARI DIGIT ONE 09E7 ; [.15CB.0020.0002.09E7][.0000.0146.0002.09E7] # BENGALI DIGIT ONE 0A67 ; [.15CB.0020.0002.0A67][.0000.0147.0002.0A67] # GURMUKHI DIGIT ONE 0AE7 ; [.15CB.0020.0002.0AE7][.0000.0148.0002.0AE7] # GUJARATI DIGIT ONE 0B67 ; [.15CB.0020.0002.0B67][.0000.0149.0002.0B67] # ORIYA DIGIT ONE 0BE7 ; [.15CB.0020.0002.0BE7][.0000.014A.0002.0BE7] # TAMIL DIGIT ONE 0C67 ; [.15CB.0020.0002.0C67][.0000.014B.0002.0C67] # TELUGU DIGIT ONE 0C79 ; [.15CB.0020.0002.0C79][.0000.014B.0002.0C79] # TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR 0C7C ; [.15CB.0020.0002.0C7C][.0000.014B.0002.0C7C] # TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR 0CE7 ; [.15CB.0020.0002.0CE7][.0000.014C.0002.0CE7] # KANNADA DIGIT ONE 0D67 ; [.15CB.0020.0002.0D67][.0000.014D.0002.0D67] # MALAYALAM DIGIT ONE ABF1 ; [.15CB.0020.0002.ABF1][.0000.014E.0002.ABF1] # MEETEI MAYEK DIGIT ONE A8D1 ; [.15CB.0020.0002.A8D1][.0000.014F.0002.A8D1] # SAURASHTRA DIGIT ONE 1947 ; [.15CB.0020.0002.1947][.0000.0150.0002.1947] # LIMBU DIGIT ONE 19D1 ; [.15CB.0020.0002.19D1][.0000.0151.0002.19D1] # NEW TAI LUE DIGIT ONE 19DA ; [.15CB.0020.0002.19DA][.0000.0151.0002.19DA] # NEW TAI LUE THAM DIGIT ONE 1A81 ; [.15CB.0020.0002.1A81][.0000.0152.0002.1A81] # TAI THAM HORA DIGIT ONE 1A91 ; [.15CB.0020.0002.1A91][.0000.0153.0002.1A91] # TAI THAM THAM DIGIT ONE 0E51 ; [.15CB.0020.0002.0E51][.0000.0154.0002.0E51] # THAI DIGIT ONE 0ED1 ; [.15CB.0020.0002.0ED1][.0000.0155.0002.0ED1] # LAO DIGIT ONE 0F21 ; [.15CB.0020.0002.0F21][.0000.0156.0002.0F21] # TIBETAN DIGIT ONE 0F2A ; [.15CB.0020.0004.0F2A][.0000.0156.0004.0F2A] # TIBETAN DIGIT HALF ONE 1C41 ; [.15CB.0020.0002.1C41][.0000.0157.0002.1C41] # LEPCHA DIGIT ONE A901 ; [.15CB.0020.0002.A901][.0000.0158.0002.A901] # KAYAH LI DIGIT ONE 1041 ; [.15CB.0020.0002.1041][.0000.0159.0002.1041] # MYANMAR DIGIT ONE 1091 ; [.15CB.0020.0002.1091][.0000.015A.0002.1091] # MYANMAR SHAN DIGIT ONE 11137 ; [.15CB.0020.0002.11137][.0000.015B.0002.11137] # CHAKMA DIGIT ONE 17E1 ; [.15CB.0020.0002.17E1][.0000.015C.0002.17E1] # KHMER DIGIT ONE 17F1 ; [.15CB.0020.0002.17F1][.0000.015D.0002.17F1] # KHMER SYMBOL LEK ATTAK MUOY AA51 ; [.15CB.0020.0002.AA51][.0000.015E.0002.AA51] # CHAM DIGIT ONE 1B51 ; [.15CB.0020.0002.1B51][.0000.015F.0002.1B51] # BALINESE DIGIT ONE A9D1 ; [.15CB.0020.0002.A9D1][.0000.0160.0002.A9D1] # JAVANESE DIGIT ONE 1BB1 ; [.15CB.0020.0002.1BB1][.0000.0161.0002.1BB1] # SUNDANESE DIGIT ONE 1811 ; [.15CB.0020.0002.1811][.0000.0162.0002.1811] # MONGOLIAN DIGIT ONE 1C51 ; [.15CB.0020.0002.1C51][.0000.0163.0002.1C51] # OL CHIKI DIGIT ONE A621 ; [.15CB.0020.0002.A621][.0000.0164.0002.A621] # VAI DIGIT ONE 110F1 ; [.15CB.0020.0002.110F1][.0000.0165.0002.110F1] # SORA SOMPENG DIGIT ONE 3021 ; [.15CB.0020.0002.3021][.0000.0166.0002.3021] # HANGZHOU NUMERAL ONE 10107 ; [.15CB.0020.0002.10107][.0000.0167.0002.10107] # AEGEAN NUMBER ONE 10142 ; [.15CB.0020.0002.10142][.0000.0168.0002.10142] # GREEK ACROPHONIC ATTIC ONE DRACHMA 10158 ; [.15CB.0020.0002.10158][.0000.0168.0002.10158] # GREEK ACROPHONIC HERAEUM ONE PLETHRON 10159 ; [.15CB.0020.0002.10159][.0000.0168.0002.10159] # GREEK ACROPHONIC THESPIAN ONE 1015A ; [.15CB.0020.0002.1015A][.0000.0168.0002.1015A] # GREEK ACROPHONIC HERMIONIAN ONE 10320 ; [.15CB.0020.0002.10320][.0000.016A.0002.10320] # OLD ITALIC NUMERAL ONE 103D1 ; [.15CB.0020.0002.103D1][.0000.016B.0002.103D1] # OLD PERSIAN NUMBER ONE 12415 ; [.15CB.0020.0002.12415][.0000.016C.0002.12415] # CUNEIFORM NUMERIC SIGN ONE GESH2 1241E ; [.15CB.0020.0002.1241E][.0000.016C.0002.1241E] # CUNEIFORM NUMERIC SIGN ONE GESHU 1242C ; [.15CB.0020.0002.1242C][.0000.016C.0002.1242C] # CUNEIFORM NUMERIC SIGN ONE SHARU 12434 ; [.15CB.0020.0002.12434][.0000.016C.0002.12434] # CUNEIFORM NUMERIC SIGN ONE BURU 1244F ; [.15CB.0020.0002.1244F][.0000.016C.0002.1244F] # CUNEIFORM NUMERIC SIGN ONE BAN2 12458 ; [.15CB.0020.0002.12458][.0000.016C.0002.12458] # CUNEIFORM NUMERIC SIGN ONE ESHE3 10A7D ; [.15CB.0020.0002.10A7D][.0000.016D.0002.10A7D] # OLD SOUTH ARABIAN NUMBER ONE 10916 ; [.15CB.0020.0002.10916][.0000.016E.0002.10916] # PHOENICIAN NUMBER ONE 10858 ; [.15CB.0020.0002.10858][.0000.016F.0002.10858] # IMPERIAL ARAMAIC NUMBER ONE 10B58 ; [.15CB.0020.0002.10B58][.0000.0170.0002.10B58] # INSCRIPTIONAL PARTHIAN NUMBER ONE 10B78 ; [.15CB.0020.0002.10B78][.0000.0171.0002.10B78] # INSCRIPTIONAL PAHLAVI NUMBER ONE 111D1 ; [.15CB.0020.0002.111D1][.0000.0172.0002.111D1] # SHARADA DIGIT ONE 116C1 ; [.15CB.0020.0002.116C1][.0000.0173.0002.116C1] # TAKRI DIGIT ONE 11067 ; [.15CB.0020.0002.11067][.0000.0174.0002.11067] # BRAHMI DIGIT ONE 11052 ; [.15CB.0020.0002.11052][.0000.0175.0002.11052] # BRAHMI NUMBER ONE 10A40 ; [.15CB.0020.0002.10A40][.0000.0176.0002.10A40] # KHAROSHTHI DIGIT ONE 1D360 ; [.15CB.0020.0002.1D360][.0000.0177.0002.1D360] # COUNTING ROD UNIT DIGIT ONE 2491 ; [.15CB.0020.0004.2491][.15CA.0020.0004.2491][*0273.0020.001F.2491] # NUMBER TEN FULL STOP 247D ; [*02FB.0020.0004.247D][.15CB.0020.0004.247D][.15CA.0020.001F.247D][*02FC.0020.001F.247D] # PARENTHESIZED NUMBER TEN 2469 ; [.15CB.0020.0006.2469][.15CA.0020.0006.2469] # CIRCLED NUMBER TEN 24FE ; [.15CB.0020.0006.24FE][.15CA.0020.0006.24FE] # DOUBLE CIRCLED NUMBER TEN 277F ; [.15CB.0020.0006.277F][.15CA.0020.0006.277F] # DINGBAT NEGATIVE CIRCLED NUMBER TEN 2789 ; [.15CB.0020.0006.2789][.15CA.0020.0006.2789] # DINGBAT CIRCLED SANS-SERIF NUMBER TEN 2793 ; [.15CB.0020.0006.2793][.15CA.0020.0006.2793] # DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN 3248 ; [.15CB.0020.0006.3248][.15CA.0020.0006.3248] # CIRCLED NUMBER TEN ON BLACK SQUARE 33E9 ; [.15CB.0020.0004.33E9][.15CA.0020.0004.33E9][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN 32C9 ; [.15CB.0020.0004.32C9][.15CA.0020.0004.32C9][.FB40.0020.001F.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER 3362 ; [.15CB.0020.0004.3362][.15CA.0020.0004.3362][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN 2492 ; [.15CB.0020.0004.2492][.15CB.0020.0004.2492][*0273.0020.001F.2492] # NUMBER ELEVEN FULL STOP 247E ; [*02FB.0020.0004.247E][.15CB.0020.0004.247E][.15CB.0020.001F.247E][*02FC.0020.001F.247E] # PARENTHESIZED NUMBER ELEVEN 246A ; [.15CB.0020.0006.246A][.15CB.0020.0006.246A] # CIRCLED NUMBER ELEVEN 24EB ; [.15CB.0020.0006.24EB][.15CB.0020.0006.24EB] # NEGATIVE CIRCLED NUMBER ELEVEN 2152 ; [.15CB.0020.001E.2152][*05AC.0020.001E.2152][.15CB.0020.001F.2152][.15CA.0020.001F.2152] # VULGAR FRACTION ONE TENTH 33EA ; [.15CB.0020.0004.33EA][.15CB.0020.0004.33EA][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN 32CA ; [.15CB.0020.0004.32CA][.15CB.0020.0004.32CA][.FB40.0020.001F.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER 3363 ; [.15CB.0020.0004.3363][.15CB.0020.0004.3363][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN 2493 ; [.15CB.0020.0004.2493][.15CC.0020.0004.2493][*0273.0020.001F.2493] # NUMBER TWELVE FULL STOP 247F ; [*02FB.0020.0004.247F][.15CB.0020.0004.247F][.15CC.0020.001F.247F][*02FC.0020.001F.247F] # PARENTHESIZED NUMBER TWELVE 246B ; [.15CB.0020.0006.246B][.15CC.0020.0006.246B] # CIRCLED NUMBER TWELVE 24EC ; [.15CB.0020.0006.24EC][.15CC.0020.0006.24EC] # NEGATIVE CIRCLED NUMBER TWELVE 00BD ; [.15CB.0020.001E.00BD][*05AC.0020.001E.00BD][.15CC.0020.001F.00BD] # VULGAR FRACTION ONE HALF 33EB ; [.15CB.0020.0004.33EB][.15CC.0020.0004.33EB][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE 32CB ; [.15CB.0020.0004.32CB][.15CC.0020.0004.32CB][.FB40.0020.001F.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER 3364 ; [.15CB.0020.0004.3364][.15CC.0020.0004.3364][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE 2494 ; [.15CB.0020.0004.2494][.15CD.0020.0004.2494][*0273.0020.001F.2494] # NUMBER THIRTEEN FULL STOP 2480 ; [*02FB.0020.0004.2480][.15CB.0020.0004.2480][.15CD.0020.001F.2480][*02FC.0020.001F.2480] # PARENTHESIZED NUMBER THIRTEEN 246C ; [.15CB.0020.0006.246C][.15CD.0020.0006.246C] # CIRCLED NUMBER THIRTEEN 24ED ; [.15CB.0020.0006.24ED][.15CD.0020.0006.24ED] # NEGATIVE CIRCLED NUMBER THIRTEEN 2153 ; [.15CB.0020.001E.2153][*05AC.0020.001E.2153][.15CD.0020.001F.2153] # VULGAR FRACTION ONE THIRD 33EC ; [.15CB.0020.0004.33EC][.15CD.0020.0004.33EC][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN 3365 ; [.15CB.0020.0004.3365][.15CD.0020.0004.3365][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN 2495 ; [.15CB.0020.0004.2495][.15CE.0020.0004.2495][*0273.0020.001F.2495] # NUMBER FOURTEEN FULL STOP 2481 ; [*02FB.0020.0004.2481][.15CB.0020.0004.2481][.15CE.0020.001F.2481][*02FC.0020.001F.2481] # PARENTHESIZED NUMBER FOURTEEN 246D ; [.15CB.0020.0006.246D][.15CE.0020.0006.246D] # CIRCLED NUMBER FOURTEEN 24EE ; [.15CB.0020.0006.24EE][.15CE.0020.0006.24EE] # NEGATIVE CIRCLED NUMBER FOURTEEN 00BC ; [.15CB.0020.001E.00BC][*05AC.0020.001E.00BC][.15CE.0020.001F.00BC] # VULGAR FRACTION ONE QUARTER 33ED ; [.15CB.0020.0004.33ED][.15CE.0020.0004.33ED][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN 3366 ; [.15CB.0020.0004.3366][.15CE.0020.0004.3366][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN 2496 ; [.15CB.0020.0004.2496][.15CF.0020.0004.2496][*0273.0020.001F.2496] # NUMBER FIFTEEN FULL STOP 2482 ; [*02FB.0020.0004.2482][.15CB.0020.0004.2482][.15CF.0020.001F.2482][*02FC.0020.001F.2482] # PARENTHESIZED NUMBER FIFTEEN 246E ; [.15CB.0020.0006.246E][.15CF.0020.0006.246E] # CIRCLED NUMBER FIFTEEN 24EF ; [.15CB.0020.0006.24EF][.15CF.0020.0006.24EF] # NEGATIVE CIRCLED NUMBER FIFTEEN 2155 ; [.15CB.0020.001E.2155][*05AC.0020.001E.2155][.15CF.0020.001F.2155] # VULGAR FRACTION ONE FIFTH 33EE ; [.15CB.0020.0004.33EE][.15CF.0020.0004.33EE][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN 3367 ; [.15CB.0020.0004.3367][.15CF.0020.0004.3367][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN 2497 ; [.15CB.0020.0004.2497][.15D0.0020.0004.2497][*0273.0020.001F.2497] # NUMBER SIXTEEN FULL STOP 2483 ; [*02FB.0020.0004.2483][.15CB.0020.0004.2483][.15D0.0020.001F.2483][*02FC.0020.001F.2483] # PARENTHESIZED NUMBER SIXTEEN 246F ; [.15CB.0020.0006.246F][.15D0.0020.0006.246F] # CIRCLED NUMBER SIXTEEN 24F0 ; [.15CB.0020.0006.24F0][.15D0.0020.0006.24F0] # NEGATIVE CIRCLED NUMBER SIXTEEN 2159 ; [.15CB.0020.001E.2159][*05AC.0020.001E.2159][.15D0.0020.001F.2159] # VULGAR FRACTION ONE SIXTH 33EF ; [.15CB.0020.0004.33EF][.15D0.0020.0004.33EF][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN 3368 ; [.15CB.0020.0004.3368][.15D0.0020.0004.3368][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN 2498 ; [.15CB.0020.0004.2498][.15D1.0020.0004.2498][*0273.0020.001F.2498] # NUMBER SEVENTEEN FULL STOP 2484 ; [*02FB.0020.0004.2484][.15CB.0020.0004.2484][.15D1.0020.001F.2484][*02FC.0020.001F.2484] # PARENTHESIZED NUMBER SEVENTEEN 2470 ; [.15CB.0020.0006.2470][.15D1.0020.0006.2470] # CIRCLED NUMBER SEVENTEEN 24F1 ; [.15CB.0020.0006.24F1][.15D1.0020.0006.24F1] # NEGATIVE CIRCLED NUMBER SEVENTEEN 2150 ; [.15CB.0020.001E.2150][*05AC.0020.001E.2150][.15D1.0020.001F.2150] # VULGAR FRACTION ONE SEVENTH 33F0 ; [.15CB.0020.0004.33F0][.15D1.0020.0004.33F0][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN 3369 ; [.15CB.0020.0004.3369][.15D1.0020.0004.3369][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN 2499 ; [.15CB.0020.0004.2499][.15D2.0020.0004.2499][*0273.0020.001F.2499] # NUMBER EIGHTEEN FULL STOP 2485 ; [*02FB.0020.0004.2485][.15CB.0020.0004.2485][.15D2.0020.001F.2485][*02FC.0020.001F.2485] # PARENTHESIZED NUMBER EIGHTEEN 2471 ; [.15CB.0020.0006.2471][.15D2.0020.0006.2471] # CIRCLED NUMBER EIGHTEEN 24F2 ; [.15CB.0020.0006.24F2][.15D2.0020.0006.24F2] # NEGATIVE CIRCLED NUMBER EIGHTEEN 215B ; [.15CB.0020.001E.215B][*05AC.0020.001E.215B][.15D2.0020.001F.215B] # VULGAR FRACTION ONE EIGHTH 33F1 ; [.15CB.0020.0004.33F1][.15D2.0020.0004.33F1][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN 336A ; [.15CB.0020.0004.336A][.15D2.0020.0004.336A][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN 249A ; [.15CB.0020.0004.249A][.15D3.0020.0004.249A][*0273.0020.001F.249A] # NUMBER NINETEEN FULL STOP 2486 ; [*02FB.0020.0004.2486][.15CB.0020.0004.2486][.15D3.0020.001F.2486][*02FC.0020.001F.2486] # PARENTHESIZED NUMBER NINETEEN 2472 ; [.15CB.0020.0006.2472][.15D3.0020.0006.2472] # CIRCLED NUMBER NINETEEN 24F3 ; [.15CB.0020.0006.24F3][.15D3.0020.0006.24F3] # NEGATIVE CIRCLED NUMBER NINETEEN 2151 ; [.15CB.0020.001E.2151][*05AC.0020.001E.2151][.15D3.0020.001F.2151] # VULGAR FRACTION ONE NINTH 33F2 ; [.15CB.0020.0004.33F2][.15D3.0020.0004.33F2][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN 336B ; [.15CB.0020.0004.336B][.15D3.0020.0004.336B][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN 33E0 ; [.15CB.0020.0004.33E0][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE 32C0 ; [.15CB.0020.0004.32C0][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY 3359 ; [.15CB.0020.0004.3359][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE 0032 ; [.15CC.0020.0002.0032] # DIGIT TWO FF12 ; [.15CC.0020.0003.FF12] # FULLWIDTH DIGIT TWO 2475 ; [*02FB.0020.0004.2475][.15CC.0020.0004.2475][*02FC.0020.001F.2475] # PARENTHESIZED DIGIT TWO 2489 ; [.15CC.0020.0004.2489][*0273.0020.0004.2489] # DIGIT TWO FULL STOP 1F103 ; [.15CC.0020.0004.1F103][*0221.0020.0004.1F103] # DIGIT TWO COMMA 1D7D0 ; [.15CC.0020.0005.1D7D0] # MATHEMATICAL BOLD DIGIT TWO 1D7DA ; [.15CC.0020.0005.1D7DA] # MATHEMATICAL DOUBLE-STRUCK DIGIT TWO 1D7E4 ; [.15CC.0020.0005.1D7E4] # MATHEMATICAL SANS-SERIF DIGIT TWO 1D7EE ; [.15CC.0020.0005.1D7EE] # MATHEMATICAL SANS-SERIF BOLD DIGIT TWO 1D7F8 ; [.15CC.0020.0005.1D7F8] # MATHEMATICAL MONOSPACE DIGIT TWO 2461 ; [.15CC.0020.0006.2461] # CIRCLED DIGIT TWO 24F6 ; [.15CC.0020.0006.24F6] # DOUBLE CIRCLED DIGIT TWO 2777 ; [.15CC.0020.0006.2777] # DINGBAT NEGATIVE CIRCLED DIGIT TWO 2781 ; [.15CC.0020.0006.2781] # DINGBAT CIRCLED SANS-SERIF DIGIT TWO 278B ; [.15CC.0020.0006.278B] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO 00B2 ; [.15CC.0020.0014.00B2] # SUPERSCRIPT TWO 2082 ; [.15CC.0020.0015.2082] # SUBSCRIPT TWO 0662 ; [.15CC.0020.0002.0662][.0000.013F.0002.0662] # ARABIC-INDIC DIGIT TWO 06F2 ; [.15CC.0020.0002.06F2][.0000.0140.0002.06F2] # EXTENDED ARABIC-INDIC DIGIT TWO 10E61 ; [.15CC.0020.0002.10E61][.0000.0141.0002.10E61] # RUMI DIGIT TWO 07C2 ; [.15CC.0020.0002.07C2][.0000.0142.0002.07C2] # NKO DIGIT TWO 136A ; [.15CC.0020.0002.136A][.0000.0143.0002.136A] # ETHIOPIC DIGIT TWO 104A2 ; [.15CC.0020.0002.104A2][.0000.0144.0002.104A2] # OSMANYA DIGIT TWO 0968 ; [.15CC.0020.0002.0968][.0000.0145.0002.0968] # DEVANAGARI DIGIT TWO 09E8 ; [.15CC.0020.0002.09E8][.0000.0146.0002.09E8] # BENGALI DIGIT TWO 0A68 ; [.15CC.0020.0002.0A68][.0000.0147.0002.0A68] # GURMUKHI DIGIT TWO 0AE8 ; [.15CC.0020.0002.0AE8][.0000.0148.0002.0AE8] # GUJARATI DIGIT TWO 0B68 ; [.15CC.0020.0002.0B68][.0000.0149.0002.0B68] # ORIYA DIGIT TWO 0BE8 ; [.15CC.0020.0002.0BE8][.0000.014A.0002.0BE8] # TAMIL DIGIT TWO 0C68 ; [.15CC.0020.0002.0C68][.0000.014B.0002.0C68] # TELUGU DIGIT TWO 0C7A ; [.15CC.0020.0002.0C7A][.0000.014B.0002.0C7A] # TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR 0C7D ; [.15CC.0020.0002.0C7D][.0000.014B.0002.0C7D] # TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR 0CE8 ; [.15CC.0020.0002.0CE8][.0000.014C.0002.0CE8] # KANNADA DIGIT TWO 0D68 ; [.15CC.0020.0002.0D68][.0000.014D.0002.0D68] # MALAYALAM DIGIT TWO ABF2 ; [.15CC.0020.0002.ABF2][.0000.014E.0002.ABF2] # MEETEI MAYEK DIGIT TWO A8D2 ; [.15CC.0020.0002.A8D2][.0000.014F.0002.A8D2] # SAURASHTRA DIGIT TWO 1948 ; [.15CC.0020.0002.1948][.0000.0150.0002.1948] # LIMBU DIGIT TWO 19D2 ; [.15CC.0020.0002.19D2][.0000.0151.0002.19D2] # NEW TAI LUE DIGIT TWO 1A82 ; [.15CC.0020.0002.1A82][.0000.0152.0002.1A82] # TAI THAM HORA DIGIT TWO 1A92 ; [.15CC.0020.0002.1A92][.0000.0153.0002.1A92] # TAI THAM THAM DIGIT TWO 0E52 ; [.15CC.0020.0002.0E52][.0000.0154.0002.0E52] # THAI DIGIT TWO 0ED2 ; [.15CC.0020.0002.0ED2][.0000.0155.0002.0ED2] # LAO DIGIT TWO 0F22 ; [.15CC.0020.0002.0F22][.0000.0156.0002.0F22] # TIBETAN DIGIT TWO 0F2B ; [.15CC.0020.0004.0F2B][.0000.0156.0004.0F2B] # TIBETAN DIGIT HALF TWO 1C42 ; [.15CC.0020.0002.1C42][.0000.0157.0002.1C42] # LEPCHA DIGIT TWO A902 ; [.15CC.0020.0002.A902][.0000.0158.0002.A902] # KAYAH LI DIGIT TWO 1042 ; [.15CC.0020.0002.1042][.0000.0159.0002.1042] # MYANMAR DIGIT TWO 1092 ; [.15CC.0020.0002.1092][.0000.015A.0002.1092] # MYANMAR SHAN DIGIT TWO 11138 ; [.15CC.0020.0002.11138][.0000.015B.0002.11138] # CHAKMA DIGIT TWO 17E2 ; [.15CC.0020.0002.17E2][.0000.015C.0002.17E2] # KHMER DIGIT TWO 17F2 ; [.15CC.0020.0002.17F2][.0000.015D.0002.17F2] # KHMER SYMBOL LEK ATTAK PII AA52 ; [.15CC.0020.0002.AA52][.0000.015E.0002.AA52] # CHAM DIGIT TWO 1B52 ; [.15CC.0020.0002.1B52][.0000.015F.0002.1B52] # BALINESE DIGIT TWO A9D2 ; [.15CC.0020.0002.A9D2][.0000.0160.0002.A9D2] # JAVANESE DIGIT TWO 1BB2 ; [.15CC.0020.0002.1BB2][.0000.0161.0002.1BB2] # SUNDANESE DIGIT TWO 1812 ; [.15CC.0020.0002.1812][.0000.0162.0002.1812] # MONGOLIAN DIGIT TWO 1C52 ; [.15CC.0020.0002.1C52][.0000.0163.0002.1C52] # OL CHIKI DIGIT TWO A622 ; [.15CC.0020.0002.A622][.0000.0164.0002.A622] # VAI DIGIT TWO 110F2 ; [.15CC.0020.0002.110F2][.0000.0165.0002.110F2] # SORA SOMPENG DIGIT TWO 3022 ; [.15CC.0020.0002.3022][.0000.0166.0002.3022] # HANGZHOU NUMERAL TWO 10108 ; [.15CC.0020.0002.10108][.0000.0167.0002.10108] # AEGEAN NUMBER TWO 1015B ; [.15CC.0020.0002.1015B][.0000.0168.0002.1015B] # GREEK ACROPHONIC EPIDAUREAN TWO 1015C ; [.15CC.0020.0002.1015C][.0000.0168.0002.1015C] # GREEK ACROPHONIC THESPIAN TWO 1015D ; [.15CC.0020.0002.1015D][.0000.0168.0002.1015D] # GREEK ACROPHONIC CYRENAIC TWO DRACHMAS 1015E ; [.15CC.0020.0002.1015E][.0000.0168.0002.1015E] # GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS 103D2 ; [.15CC.0020.0002.103D2][.0000.016B.0002.103D2] # OLD PERSIAN NUMBER TWO 12400 ; [.15CC.0020.0002.12400][.0000.016C.0002.12400] # CUNEIFORM NUMERIC SIGN TWO ASH 12416 ; [.15CC.0020.0002.12416][.0000.016C.0002.12416] # CUNEIFORM NUMERIC SIGN TWO GESH2 1241F ; [.15CC.0020.0002.1241F][.0000.016C.0002.1241F] # CUNEIFORM NUMERIC SIGN TWO GESHU 12423 ; [.15CC.0020.0002.12423][.0000.016C.0002.12423] # CUNEIFORM NUMERIC SIGN TWO SHAR2 1242D ; [.15CC.0020.0002.1242D][.0000.016C.0002.1242D] # CUNEIFORM NUMERIC SIGN TWO SHARU 12435 ; [.15CC.0020.0002.12435][.0000.016C.0002.12435] # CUNEIFORM NUMERIC SIGN TWO BURU 1244A ; [.15CC.0020.0002.1244A][.0000.016C.0002.1244A] # CUNEIFORM NUMERIC SIGN TWO ASH TENU 12450 ; [.15CC.0020.0002.12450][.0000.016C.0002.12450] # CUNEIFORM NUMERIC SIGN TWO BAN2 12459 ; [.15CC.0020.0002.12459][.0000.016C.0002.12459] # CUNEIFORM NUMERIC SIGN TWO ESHE3 1091A ; [.15CC.0020.0002.1091A][.0000.016E.0002.1091A] # PHOENICIAN NUMBER TWO 10859 ; [.15CC.0020.0002.10859][.0000.016F.0002.10859] # IMPERIAL ARAMAIC NUMBER TWO 10B59 ; [.15CC.0020.0002.10B59][.0000.0170.0002.10B59] # INSCRIPTIONAL PARTHIAN NUMBER TWO 10B79 ; [.15CC.0020.0002.10B79][.0000.0171.0002.10B79] # INSCRIPTIONAL PAHLAVI NUMBER TWO 111D2 ; [.15CC.0020.0002.111D2][.0000.0172.0002.111D2] # SHARADA DIGIT TWO 116C2 ; [.15CC.0020.0002.116C2][.0000.0173.0002.116C2] # TAKRI DIGIT TWO 11068 ; [.15CC.0020.0002.11068][.0000.0174.0002.11068] # BRAHMI DIGIT TWO 11053 ; [.15CC.0020.0002.11053][.0000.0175.0002.11053] # BRAHMI NUMBER TWO 10A41 ; [.15CC.0020.0002.10A41][.0000.0176.0002.10A41] # KHAROSHTHI DIGIT TWO 1D361 ; [.15CC.0020.0002.1D361][.0000.0177.0002.1D361] # COUNTING ROD UNIT DIGIT TWO 249B ; [.15CC.0020.0004.249B][.15CA.0020.0004.249B][*0273.0020.001F.249B] # NUMBER TWENTY FULL STOP 2487 ; [*02FB.0020.0004.2487][.15CC.0020.0004.2487][.15CA.0020.001F.2487][*02FC.0020.001F.2487] # PARENTHESIZED NUMBER TWENTY 2473 ; [.15CC.0020.0006.2473][.15CA.0020.0006.2473] # CIRCLED NUMBER TWENTY 24F4 ; [.15CC.0020.0006.24F4][.15CA.0020.0006.24F4] # NEGATIVE CIRCLED NUMBER TWENTY 3249 ; [.15CC.0020.0006.3249][.15CA.0020.0006.3249] # CIRCLED NUMBER TWENTY ON BLACK SQUARE 33F3 ; [.15CC.0020.0004.33F3][.15CA.0020.0004.33F3][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY 336C ; [.15CC.0020.0004.336C][.15CA.0020.0004.336C][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY 3251 ; [.15CC.0020.0006.3251][.15CB.0020.0006.3251] # CIRCLED NUMBER TWENTY ONE 33F4 ; [.15CC.0020.0004.33F4][.15CB.0020.0004.33F4][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE 336D ; [.15CC.0020.0004.336D][.15CB.0020.0004.336D][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE 3252 ; [.15CC.0020.0006.3252][.15CC.0020.0006.3252] # CIRCLED NUMBER TWENTY TWO 33F5 ; [.15CC.0020.0004.33F5][.15CC.0020.0004.33F5][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO 336E ; [.15CC.0020.0004.336E][.15CC.0020.0004.336E][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO 3253 ; [.15CC.0020.0006.3253][.15CD.0020.0006.3253] # CIRCLED NUMBER TWENTY THREE 2154 ; [.15CC.0020.001E.2154][*05AC.0020.001E.2154][.15CD.0020.001F.2154] # VULGAR FRACTION TWO THIRDS 33F6 ; [.15CC.0020.0004.33F6][.15CD.0020.0004.33F6][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE 336F ; [.15CC.0020.0004.336F][.15CD.0020.0004.336F][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE 3254 ; [.15CC.0020.0006.3254][.15CE.0020.0006.3254] # CIRCLED NUMBER TWENTY FOUR 33F7 ; [.15CC.0020.0004.33F7][.15CE.0020.0004.33F7][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR 3370 ; [.15CC.0020.0004.3370][.15CE.0020.0004.3370][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR 3255 ; [.15CC.0020.0006.3255][.15CF.0020.0006.3255] # CIRCLED NUMBER TWENTY FIVE 2156 ; [.15CC.0020.001E.2156][*05AC.0020.001E.2156][.15CF.0020.001F.2156] # VULGAR FRACTION TWO FIFTHS 33F8 ; [.15CC.0020.0004.33F8][.15CF.0020.0004.33F8][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE 3256 ; [.15CC.0020.0006.3256][.15D0.0020.0006.3256] # CIRCLED NUMBER TWENTY SIX 33F9 ; [.15CC.0020.0004.33F9][.15D0.0020.0004.33F9][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX 3257 ; [.15CC.0020.0006.3257][.15D1.0020.0006.3257] # CIRCLED NUMBER TWENTY SEVEN 33FA ; [.15CC.0020.0004.33FA][.15D1.0020.0004.33FA][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN 3258 ; [.15CC.0020.0006.3258][.15D2.0020.0006.3258] # CIRCLED NUMBER TWENTY EIGHT 33FB ; [.15CC.0020.0004.33FB][.15D2.0020.0004.33FB][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT 3259 ; [.15CC.0020.0006.3259][.15D3.0020.0006.3259] # CIRCLED NUMBER TWENTY NINE 33FC ; [.15CC.0020.0004.33FC][.15D3.0020.0004.33FC][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE 33E1 ; [.15CC.0020.0004.33E1][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO 32C1 ; [.15CC.0020.0004.32C1][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY 335A ; [.15CC.0020.0004.335A][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO 0033 ; [.15CD.0020.0002.0033] # DIGIT THREE FF13 ; [.15CD.0020.0003.FF13] # FULLWIDTH DIGIT THREE 2476 ; [*02FB.0020.0004.2476][.15CD.0020.0004.2476][*02FC.0020.001F.2476] # PARENTHESIZED DIGIT THREE 248A ; [.15CD.0020.0004.248A][*0273.0020.0004.248A] # DIGIT THREE FULL STOP 1F104 ; [.15CD.0020.0004.1F104][*0221.0020.0004.1F104] # DIGIT THREE COMMA 1D7D1 ; [.15CD.0020.0005.1D7D1] # MATHEMATICAL BOLD DIGIT THREE 1D7DB ; [.15CD.0020.0005.1D7DB] # MATHEMATICAL DOUBLE-STRUCK DIGIT THREE 1D7E5 ; [.15CD.0020.0005.1D7E5] # MATHEMATICAL SANS-SERIF DIGIT THREE 1D7EF ; [.15CD.0020.0005.1D7EF] # MATHEMATICAL SANS-SERIF BOLD DIGIT THREE 1D7F9 ; [.15CD.0020.0005.1D7F9] # MATHEMATICAL MONOSPACE DIGIT THREE 2462 ; [.15CD.0020.0006.2462] # CIRCLED DIGIT THREE 24F7 ; [.15CD.0020.0006.24F7] # DOUBLE CIRCLED DIGIT THREE 2778 ; [.15CD.0020.0006.2778] # DINGBAT NEGATIVE CIRCLED DIGIT THREE 2782 ; [.15CD.0020.0006.2782] # DINGBAT CIRCLED SANS-SERIF DIGIT THREE 278C ; [.15CD.0020.0006.278C] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE 00B3 ; [.15CD.0020.0014.00B3] # SUPERSCRIPT THREE 2083 ; [.15CD.0020.0015.2083] # SUBSCRIPT THREE 0663 ; [.15CD.0020.0002.0663][.0000.013F.0002.0663] # ARABIC-INDIC DIGIT THREE 06F3 ; [.15CD.0020.0002.06F3][.0000.0140.0002.06F3] # EXTENDED ARABIC-INDIC DIGIT THREE 10E62 ; [.15CD.0020.0002.10E62][.0000.0141.0002.10E62] # RUMI DIGIT THREE 07C3 ; [.15CD.0020.0002.07C3][.0000.0142.0002.07C3] # NKO DIGIT THREE 136B ; [.15CD.0020.0002.136B][.0000.0143.0002.136B] # ETHIOPIC DIGIT THREE 104A3 ; [.15CD.0020.0002.104A3][.0000.0144.0002.104A3] # OSMANYA DIGIT THREE 0969 ; [.15CD.0020.0002.0969][.0000.0145.0002.0969] # DEVANAGARI DIGIT THREE 09E9 ; [.15CD.0020.0002.09E9][.0000.0146.0002.09E9] # BENGALI DIGIT THREE 0A69 ; [.15CD.0020.0002.0A69][.0000.0147.0002.0A69] # GURMUKHI DIGIT THREE 0AE9 ; [.15CD.0020.0002.0AE9][.0000.0148.0002.0AE9] # GUJARATI DIGIT THREE 0B69 ; [.15CD.0020.0002.0B69][.0000.0149.0002.0B69] # ORIYA DIGIT THREE 0BE9 ; [.15CD.0020.0002.0BE9][.0000.014A.0002.0BE9] # TAMIL DIGIT THREE 0C69 ; [.15CD.0020.0002.0C69][.0000.014B.0002.0C69] # TELUGU DIGIT THREE 0C7B ; [.15CD.0020.0002.0C7B][.0000.014B.0002.0C7B] # TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR 0C7E ; [.15CD.0020.0002.0C7E][.0000.014B.0002.0C7E] # TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR 0CE9 ; [.15CD.0020.0002.0CE9][.0000.014C.0002.0CE9] # KANNADA DIGIT THREE 0D69 ; [.15CD.0020.0002.0D69][.0000.014D.0002.0D69] # MALAYALAM DIGIT THREE ABF3 ; [.15CD.0020.0002.ABF3][.0000.014E.0002.ABF3] # MEETEI MAYEK DIGIT THREE A8D3 ; [.15CD.0020.0002.A8D3][.0000.014F.0002.A8D3] # SAURASHTRA DIGIT THREE 1949 ; [.15CD.0020.0002.1949][.0000.0150.0002.1949] # LIMBU DIGIT THREE 19D3 ; [.15CD.0020.0002.19D3][.0000.0151.0002.19D3] # NEW TAI LUE DIGIT THREE 1A83 ; [.15CD.0020.0002.1A83][.0000.0152.0002.1A83] # TAI THAM HORA DIGIT THREE 1A93 ; [.15CD.0020.0002.1A93][.0000.0153.0002.1A93] # TAI THAM THAM DIGIT THREE 0E53 ; [.15CD.0020.0002.0E53][.0000.0154.0002.0E53] # THAI DIGIT THREE 0ED3 ; [.15CD.0020.0002.0ED3][.0000.0155.0002.0ED3] # LAO DIGIT THREE 0F23 ; [.15CD.0020.0002.0F23][.0000.0156.0002.0F23] # TIBETAN DIGIT THREE 0F2C ; [.15CD.0020.0004.0F2C][.0000.0156.0004.0F2C] # TIBETAN DIGIT HALF THREE 1C43 ; [.15CD.0020.0002.1C43][.0000.0157.0002.1C43] # LEPCHA DIGIT THREE A903 ; [.15CD.0020.0002.A903][.0000.0158.0002.A903] # KAYAH LI DIGIT THREE 1043 ; [.15CD.0020.0002.1043][.0000.0159.0002.1043] # MYANMAR DIGIT THREE 1093 ; [.15CD.0020.0002.1093][.0000.015A.0002.1093] # MYANMAR SHAN DIGIT THREE 11139 ; [.15CD.0020.0002.11139][.0000.015B.0002.11139] # CHAKMA DIGIT THREE 17E3 ; [.15CD.0020.0002.17E3][.0000.015C.0002.17E3] # KHMER DIGIT THREE 17F3 ; [.15CD.0020.0002.17F3][.0000.015D.0002.17F3] # KHMER SYMBOL LEK ATTAK BEI AA53 ; [.15CD.0020.0002.AA53][.0000.015E.0002.AA53] # CHAM DIGIT THREE 1B53 ; [.15CD.0020.0002.1B53][.0000.015F.0002.1B53] # BALINESE DIGIT THREE A9D3 ; [.15CD.0020.0002.A9D3][.0000.0160.0002.A9D3] # JAVANESE DIGIT THREE 1BB3 ; [.15CD.0020.0002.1BB3][.0000.0161.0002.1BB3] # SUNDANESE DIGIT THREE 1813 ; [.15CD.0020.0002.1813][.0000.0162.0002.1813] # MONGOLIAN DIGIT THREE 1C53 ; [.15CD.0020.0002.1C53][.0000.0163.0002.1C53] # OL CHIKI DIGIT THREE A623 ; [.15CD.0020.0002.A623][.0000.0164.0002.A623] # VAI DIGIT THREE 110F3 ; [.15CD.0020.0002.110F3][.0000.0165.0002.110F3] # SORA SOMPENG DIGIT THREE 3023 ; [.15CD.0020.0002.3023][.0000.0166.0002.3023] # HANGZHOU NUMERAL THREE 10109 ; [.15CD.0020.0002.10109][.0000.0167.0002.10109] # AEGEAN NUMBER THREE 12401 ; [.15CD.0020.0002.12401][.0000.016C.0002.12401] # CUNEIFORM NUMERIC SIGN THREE ASH 12408 ; [.15CD.0020.0002.12408][.0000.016C.0002.12408] # CUNEIFORM NUMERIC SIGN THREE DISH 12417 ; [.15CD.0020.0002.12417][.0000.016C.0002.12417] # CUNEIFORM NUMERIC SIGN THREE GESH2 12420 ; [.15CD.0020.0002.12420][.0000.016C.0002.12420] # CUNEIFORM NUMERIC SIGN THREE GESHU 12424 ; [.15CD.0020.0002.12424][.0000.016C.0002.12424] # CUNEIFORM NUMERIC SIGN THREE SHAR2 12425 ; [.15CD.0020.0002.12425][.0000.016C.0002.12425] # CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM 1242E ; [.15CD.0020.0002.1242E][.0000.016C.0002.1242E] # CUNEIFORM NUMERIC SIGN THREE SHARU 1242F ; [.15CD.0020.0002.1242F][.0000.016C.0002.1242F] # CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM 12436 ; [.15CD.0020.0002.12436][.0000.016C.0002.12436] # CUNEIFORM NUMERIC SIGN THREE BURU 12437 ; [.15CD.0020.0002.12437][.0000.016C.0002.12437] # CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM 1243A ; [.15CD.0020.0002.1243A][.0000.016C.0002.1243A] # CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16 1243B ; [.15CD.0020.0002.1243B][.0000.016C.0002.1243B] # CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21 1244B ; [.15CD.0020.0002.1244B][.0000.016C.0002.1244B] # CUNEIFORM NUMERIC SIGN THREE ASH TENU 12451 ; [.15CD.0020.0002.12451][.0000.016C.0002.12451] # CUNEIFORM NUMERIC SIGN THREE BAN2 1091B ; [.15CD.0020.0002.1091B][.0000.016E.0002.1091B] # PHOENICIAN NUMBER THREE 1085A ; [.15CD.0020.0002.1085A][.0000.016F.0002.1085A] # IMPERIAL ARAMAIC NUMBER THREE 10B5A ; [.15CD.0020.0002.10B5A][.0000.0170.0002.10B5A] # INSCRIPTIONAL PARTHIAN NUMBER THREE 10B7A ; [.15CD.0020.0002.10B7A][.0000.0171.0002.10B7A] # INSCRIPTIONAL PAHLAVI NUMBER THREE 111D3 ; [.15CD.0020.0002.111D3][.0000.0172.0002.111D3] # SHARADA DIGIT THREE 116C3 ; [.15CD.0020.0002.116C3][.0000.0173.0002.116C3] # TAKRI DIGIT THREE 11069 ; [.15CD.0020.0002.11069][.0000.0174.0002.11069] # BRAHMI DIGIT THREE 11054 ; [.15CD.0020.0002.11054][.0000.0175.0002.11054] # BRAHMI NUMBER THREE 10A42 ; [.15CD.0020.0002.10A42][.0000.0176.0002.10A42] # KHAROSHTHI DIGIT THREE 1D362 ; [.15CD.0020.0002.1D362][.0000.0177.0002.1D362] # COUNTING ROD UNIT DIGIT THREE 324A ; [.15CD.0020.0006.324A][.15CA.0020.0006.324A] # CIRCLED NUMBER THIRTY ON BLACK SQUARE 325A ; [.15CD.0020.0006.325A][.15CA.0020.0006.325A] # CIRCLED NUMBER THIRTY 33FD ; [.15CD.0020.0004.33FD][.15CA.0020.0004.33FD][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY 325B ; [.15CD.0020.0006.325B][.15CB.0020.0006.325B] # CIRCLED NUMBER THIRTY ONE 33FE ; [.15CD.0020.0004.33FE][.15CB.0020.0004.33FE][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE 325C ; [.15CD.0020.0006.325C][.15CC.0020.0006.325C] # CIRCLED NUMBER THIRTY TWO 325D ; [.15CD.0020.0006.325D][.15CD.0020.0006.325D] # CIRCLED NUMBER THIRTY THREE 325E ; [.15CD.0020.0006.325E][.15CE.0020.0006.325E] # CIRCLED NUMBER THIRTY FOUR 00BE ; [.15CD.0020.001E.00BE][*05AC.0020.001E.00BE][.15CE.0020.001F.00BE] # VULGAR FRACTION THREE QUARTERS 325F ; [.15CD.0020.0006.325F][.15CF.0020.0006.325F] # CIRCLED NUMBER THIRTY FIVE 2157 ; [.15CD.0020.001E.2157][*05AC.0020.001E.2157][.15CF.0020.001F.2157] # VULGAR FRACTION THREE FIFTHS 32B1 ; [.15CD.0020.0006.32B1][.15D0.0020.0006.32B1] # CIRCLED NUMBER THIRTY SIX 32B2 ; [.15CD.0020.0006.32B2][.15D1.0020.0006.32B2] # CIRCLED NUMBER THIRTY SEVEN 32B3 ; [.15CD.0020.0006.32B3][.15D2.0020.0006.32B3] # CIRCLED NUMBER THIRTY EIGHT 215C ; [.15CD.0020.001E.215C][*05AC.0020.001E.215C][.15D2.0020.001F.215C] # VULGAR FRACTION THREE EIGHTHS 32B4 ; [.15CD.0020.0006.32B4][.15D3.0020.0006.32B4] # CIRCLED NUMBER THIRTY NINE 33E2 ; [.15CD.0020.0004.33E2][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE 32C2 ; [.15CD.0020.0004.32C2][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH 335B ; [.15CD.0020.0004.335B][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE 0034 ; [.15CE.0020.0002.0034] # DIGIT FOUR FF14 ; [.15CE.0020.0003.FF14] # FULLWIDTH DIGIT FOUR 2477 ; [*02FB.0020.0004.2477][.15CE.0020.0004.2477][*02FC.0020.001F.2477] # PARENTHESIZED DIGIT FOUR 248B ; [.15CE.0020.0004.248B][*0273.0020.0004.248B] # DIGIT FOUR FULL STOP 1F105 ; [.15CE.0020.0004.1F105][*0221.0020.0004.1F105] # DIGIT FOUR COMMA 1D7D2 ; [.15CE.0020.0005.1D7D2] # MATHEMATICAL BOLD DIGIT FOUR 1D7DC ; [.15CE.0020.0005.1D7DC] # MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR 1D7E6 ; [.15CE.0020.0005.1D7E6] # MATHEMATICAL SANS-SERIF DIGIT FOUR 1D7F0 ; [.15CE.0020.0005.1D7F0] # MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR 1D7FA ; [.15CE.0020.0005.1D7FA] # MATHEMATICAL MONOSPACE DIGIT FOUR 2463 ; [.15CE.0020.0006.2463] # CIRCLED DIGIT FOUR 24F8 ; [.15CE.0020.0006.24F8] # DOUBLE CIRCLED DIGIT FOUR 2779 ; [.15CE.0020.0006.2779] # DINGBAT NEGATIVE CIRCLED DIGIT FOUR 2783 ; [.15CE.0020.0006.2783] # DINGBAT CIRCLED SANS-SERIF DIGIT FOUR 278D ; [.15CE.0020.0006.278D] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR 2074 ; [.15CE.0020.0014.2074] # SUPERSCRIPT FOUR 2084 ; [.15CE.0020.0015.2084] # SUBSCRIPT FOUR 0664 ; [.15CE.0020.0002.0664][.0000.013F.0002.0664] # ARABIC-INDIC DIGIT FOUR 06F4 ; [.15CE.0020.0002.06F4][.0000.0140.0002.06F4] # EXTENDED ARABIC-INDIC DIGIT FOUR 10E63 ; [.15CE.0020.0002.10E63][.0000.0141.0002.10E63] # RUMI DIGIT FOUR 07C4 ; [.15CE.0020.0002.07C4][.0000.0142.0002.07C4] # NKO DIGIT FOUR 136C ; [.15CE.0020.0002.136C][.0000.0143.0002.136C] # ETHIOPIC DIGIT FOUR 104A4 ; [.15CE.0020.0002.104A4][.0000.0144.0002.104A4] # OSMANYA DIGIT FOUR 096A ; [.15CE.0020.0002.096A][.0000.0145.0002.096A] # DEVANAGARI DIGIT FOUR 09EA ; [.15CE.0020.0002.09EA][.0000.0146.0002.09EA] # BENGALI DIGIT FOUR 0A6A ; [.15CE.0020.0002.0A6A][.0000.0147.0002.0A6A] # GURMUKHI DIGIT FOUR 0AEA ; [.15CE.0020.0002.0AEA][.0000.0148.0002.0AEA] # GUJARATI DIGIT FOUR 0B6A ; [.15CE.0020.0002.0B6A][.0000.0149.0002.0B6A] # ORIYA DIGIT FOUR 0BEA ; [.15CE.0020.0002.0BEA][.0000.014A.0002.0BEA] # TAMIL DIGIT FOUR 0C6A ; [.15CE.0020.0002.0C6A][.0000.014B.0002.0C6A] # TELUGU DIGIT FOUR 0CEA ; [.15CE.0020.0002.0CEA][.0000.014C.0002.0CEA] # KANNADA DIGIT FOUR 0D6A ; [.15CE.0020.0002.0D6A][.0000.014D.0002.0D6A] # MALAYALAM DIGIT FOUR ABF4 ; [.15CE.0020.0002.ABF4][.0000.014E.0002.ABF4] # MEETEI MAYEK DIGIT FOUR A8D4 ; [.15CE.0020.0002.A8D4][.0000.014F.0002.A8D4] # SAURASHTRA DIGIT FOUR 194A ; [.15CE.0020.0002.194A][.0000.0150.0002.194A] # LIMBU DIGIT FOUR 19D4 ; [.15CE.0020.0002.19D4][.0000.0151.0002.19D4] # NEW TAI LUE DIGIT FOUR 1A84 ; [.15CE.0020.0002.1A84][.0000.0152.0002.1A84] # TAI THAM HORA DIGIT FOUR 1A94 ; [.15CE.0020.0002.1A94][.0000.0153.0002.1A94] # TAI THAM THAM DIGIT FOUR 0E54 ; [.15CE.0020.0002.0E54][.0000.0154.0002.0E54] # THAI DIGIT FOUR 0ED4 ; [.15CE.0020.0002.0ED4][.0000.0155.0002.0ED4] # LAO DIGIT FOUR 0F24 ; [.15CE.0020.0002.0F24][.0000.0156.0002.0F24] # TIBETAN DIGIT FOUR 0F2D ; [.15CE.0020.0004.0F2D][.0000.0156.0004.0F2D] # TIBETAN DIGIT HALF FOUR 1C44 ; [.15CE.0020.0002.1C44][.0000.0157.0002.1C44] # LEPCHA DIGIT FOUR A904 ; [.15CE.0020.0002.A904][.0000.0158.0002.A904] # KAYAH LI DIGIT FOUR 1044 ; [.15CE.0020.0002.1044][.0000.0159.0002.1044] # MYANMAR DIGIT FOUR 1094 ; [.15CE.0020.0002.1094][.0000.015A.0002.1094] # MYANMAR SHAN DIGIT FOUR 1113A ; [.15CE.0020.0002.1113A][.0000.015B.0002.1113A] # CHAKMA DIGIT FOUR 17E4 ; [.15CE.0020.0002.17E4][.0000.015C.0002.17E4] # KHMER DIGIT FOUR 17F4 ; [.15CE.0020.0002.17F4][.0000.015D.0002.17F4] # KHMER SYMBOL LEK ATTAK BUON AA54 ; [.15CE.0020.0002.AA54][.0000.015E.0002.AA54] # CHAM DIGIT FOUR 1B54 ; [.15CE.0020.0002.1B54][.0000.015F.0002.1B54] # BALINESE DIGIT FOUR A9D4 ; [.15CE.0020.0002.A9D4][.0000.0160.0002.A9D4] # JAVANESE DIGIT FOUR 1BB4 ; [.15CE.0020.0002.1BB4][.0000.0161.0002.1BB4] # SUNDANESE DIGIT FOUR 1814 ; [.15CE.0020.0002.1814][.0000.0162.0002.1814] # MONGOLIAN DIGIT FOUR 1C54 ; [.15CE.0020.0002.1C54][.0000.0163.0002.1C54] # OL CHIKI DIGIT FOUR A624 ; [.15CE.0020.0002.A624][.0000.0164.0002.A624] # VAI DIGIT FOUR 110F4 ; [.15CE.0020.0002.110F4][.0000.0165.0002.110F4] # SORA SOMPENG DIGIT FOUR 3024 ; [.15CE.0020.0002.3024][.0000.0166.0002.3024] # HANGZHOU NUMERAL FOUR 1010A ; [.15CE.0020.0002.1010A][.0000.0167.0002.1010A] # AEGEAN NUMBER FOUR 12402 ; [.15CE.0020.0002.12402][.0000.016C.0002.12402] # CUNEIFORM NUMERIC SIGN FOUR ASH 12409 ; [.15CE.0020.0002.12409][.0000.016C.0002.12409] # CUNEIFORM NUMERIC SIGN FOUR DISH 1240F ; [.15CE.0020.0002.1240F][.0000.016C.0002.1240F] # CUNEIFORM NUMERIC SIGN FOUR U 12418 ; [.15CE.0020.0002.12418][.0000.016C.0002.12418] # CUNEIFORM NUMERIC SIGN FOUR GESH2 12421 ; [.15CE.0020.0002.12421][.0000.016C.0002.12421] # CUNEIFORM NUMERIC SIGN FOUR GESHU 12426 ; [.15CE.0020.0002.12426][.0000.016C.0002.12426] # CUNEIFORM NUMERIC SIGN FOUR SHAR2 12430 ; [.15CE.0020.0002.12430][.0000.016C.0002.12430] # CUNEIFORM NUMERIC SIGN FOUR SHARU 12438 ; [.15CE.0020.0002.12438][.0000.016C.0002.12438] # CUNEIFORM NUMERIC SIGN FOUR BURU 1243C ; [.15CE.0020.0002.1243C][.0000.016C.0002.1243C] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU 1243D ; [.15CE.0020.0002.1243D][.0000.016C.0002.1243D] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4 1243E ; [.15CE.0020.0002.1243E][.0000.016C.0002.1243E] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A 1243F ; [.15CE.0020.0002.1243F][.0000.016C.0002.1243F] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B 1244C ; [.15CE.0020.0002.1244C][.0000.016C.0002.1244C] # CUNEIFORM NUMERIC SIGN FOUR ASH TENU 12452 ; [.15CE.0020.0002.12452][.0000.016C.0002.12452] # CUNEIFORM NUMERIC SIGN FOUR BAN2 12453 ; [.15CE.0020.0002.12453][.0000.016C.0002.12453] # CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM 10B5B ; [.15CE.0020.0002.10B5B][.0000.0170.0002.10B5B] # INSCRIPTIONAL PARTHIAN NUMBER FOUR 10B7B ; [.15CE.0020.0002.10B7B][.0000.0171.0002.10B7B] # INSCRIPTIONAL PAHLAVI NUMBER FOUR 111D4 ; [.15CE.0020.0002.111D4][.0000.0172.0002.111D4] # SHARADA DIGIT FOUR 116C4 ; [.15CE.0020.0002.116C4][.0000.0173.0002.116C4] # TAKRI DIGIT FOUR 1106A ; [.15CE.0020.0002.1106A][.0000.0174.0002.1106A] # BRAHMI DIGIT FOUR 11055 ; [.15CE.0020.0002.11055][.0000.0175.0002.11055] # BRAHMI NUMBER FOUR 10A43 ; [.15CE.0020.0002.10A43][.0000.0176.0002.10A43] # KHAROSHTHI DIGIT FOUR 1D363 ; [.15CE.0020.0002.1D363][.0000.0177.0002.1D363] # COUNTING ROD UNIT DIGIT FOUR 324B ; [.15CE.0020.0006.324B][.15CA.0020.0006.324B] # CIRCLED NUMBER FORTY ON BLACK SQUARE 32B5 ; [.15CE.0020.0006.32B5][.15CA.0020.0006.32B5] # CIRCLED NUMBER FORTY 32B6 ; [.15CE.0020.0006.32B6][.15CB.0020.0006.32B6] # CIRCLED NUMBER FORTY ONE 32B7 ; [.15CE.0020.0006.32B7][.15CC.0020.0006.32B7] # CIRCLED NUMBER FORTY TWO 32B8 ; [.15CE.0020.0006.32B8][.15CD.0020.0006.32B8] # CIRCLED NUMBER FORTY THREE 32B9 ; [.15CE.0020.0006.32B9][.15CE.0020.0006.32B9] # CIRCLED NUMBER FORTY FOUR 32BA ; [.15CE.0020.0006.32BA][.15CF.0020.0006.32BA] # CIRCLED NUMBER FORTY FIVE 2158 ; [.15CE.0020.001E.2158][*05AC.0020.001E.2158][.15CF.0020.001F.2158] # VULGAR FRACTION FOUR FIFTHS 32BB ; [.15CE.0020.0006.32BB][.15D0.0020.0006.32BB] # CIRCLED NUMBER FORTY SIX 32BC ; [.15CE.0020.0006.32BC][.15D1.0020.0006.32BC] # CIRCLED NUMBER FORTY SEVEN 32BD ; [.15CE.0020.0006.32BD][.15D2.0020.0006.32BD] # CIRCLED NUMBER FORTY EIGHT 32BE ; [.15CE.0020.0006.32BE][.15D3.0020.0006.32BE] # CIRCLED NUMBER FORTY NINE 33E3 ; [.15CE.0020.0004.33E3][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR 32C3 ; [.15CE.0020.0004.32C3][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL 335C ; [.15CE.0020.0004.335C][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR 0035 ; [.15CF.0020.0002.0035] # DIGIT FIVE FF15 ; [.15CF.0020.0003.FF15] # FULLWIDTH DIGIT FIVE 2478 ; [*02FB.0020.0004.2478][.15CF.0020.0004.2478][*02FC.0020.001F.2478] # PARENTHESIZED DIGIT FIVE 248C ; [.15CF.0020.0004.248C][*0273.0020.0004.248C] # DIGIT FIVE FULL STOP 1F106 ; [.15CF.0020.0004.1F106][*0221.0020.0004.1F106] # DIGIT FIVE COMMA 1D7D3 ; [.15CF.0020.0005.1D7D3] # MATHEMATICAL BOLD DIGIT FIVE 1D7DD ; [.15CF.0020.0005.1D7DD] # MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE 1D7E7 ; [.15CF.0020.0005.1D7E7] # MATHEMATICAL SANS-SERIF DIGIT FIVE 1D7F1 ; [.15CF.0020.0005.1D7F1] # MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE 1D7FB ; [.15CF.0020.0005.1D7FB] # MATHEMATICAL MONOSPACE DIGIT FIVE 2464 ; [.15CF.0020.0006.2464] # CIRCLED DIGIT FIVE 24F9 ; [.15CF.0020.0006.24F9] # DOUBLE CIRCLED DIGIT FIVE 277A ; [.15CF.0020.0006.277A] # DINGBAT NEGATIVE CIRCLED DIGIT FIVE 2784 ; [.15CF.0020.0006.2784] # DINGBAT CIRCLED SANS-SERIF DIGIT FIVE 278E ; [.15CF.0020.0006.278E] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE 2075 ; [.15CF.0020.0014.2075] # SUPERSCRIPT FIVE 2085 ; [.15CF.0020.0015.2085] # SUBSCRIPT FIVE 0665 ; [.15CF.0020.0002.0665][.0000.013F.0002.0665] # ARABIC-INDIC DIGIT FIVE 06F5 ; [.15CF.0020.0002.06F5][.0000.0140.0002.06F5] # EXTENDED ARABIC-INDIC DIGIT FIVE 10E64 ; [.15CF.0020.0002.10E64][.0000.0141.0002.10E64] # RUMI DIGIT FIVE 07C5 ; [.15CF.0020.0002.07C5][.0000.0142.0002.07C5] # NKO DIGIT FIVE 136D ; [.15CF.0020.0002.136D][.0000.0143.0002.136D] # ETHIOPIC DIGIT FIVE 104A5 ; [.15CF.0020.0002.104A5][.0000.0144.0002.104A5] # OSMANYA DIGIT FIVE 096B ; [.15CF.0020.0002.096B][.0000.0145.0002.096B] # DEVANAGARI DIGIT FIVE 09EB ; [.15CF.0020.0002.09EB][.0000.0146.0002.09EB] # BENGALI DIGIT FIVE 0A6B ; [.15CF.0020.0002.0A6B][.0000.0147.0002.0A6B] # GURMUKHI DIGIT FIVE 0AEB ; [.15CF.0020.0002.0AEB][.0000.0148.0002.0AEB] # GUJARATI DIGIT FIVE 0B6B ; [.15CF.0020.0002.0B6B][.0000.0149.0002.0B6B] # ORIYA DIGIT FIVE 0BEB ; [.15CF.0020.0002.0BEB][.0000.014A.0002.0BEB] # TAMIL DIGIT FIVE 0C6B ; [.15CF.0020.0002.0C6B][.0000.014B.0002.0C6B] # TELUGU DIGIT FIVE 0CEB ; [.15CF.0020.0002.0CEB][.0000.014C.0002.0CEB] # KANNADA DIGIT FIVE 0D6B ; [.15CF.0020.0002.0D6B][.0000.014D.0002.0D6B] # MALAYALAM DIGIT FIVE ABF5 ; [.15CF.0020.0002.ABF5][.0000.014E.0002.ABF5] # MEETEI MAYEK DIGIT FIVE A8D5 ; [.15CF.0020.0002.A8D5][.0000.014F.0002.A8D5] # SAURASHTRA DIGIT FIVE 194B ; [.15CF.0020.0002.194B][.0000.0150.0002.194B] # LIMBU DIGIT FIVE 19D5 ; [.15CF.0020.0002.19D5][.0000.0151.0002.19D5] # NEW TAI LUE DIGIT FIVE 1A85 ; [.15CF.0020.0002.1A85][.0000.0152.0002.1A85] # TAI THAM HORA DIGIT FIVE 1A95 ; [.15CF.0020.0002.1A95][.0000.0153.0002.1A95] # TAI THAM THAM DIGIT FIVE 0E55 ; [.15CF.0020.0002.0E55][.0000.0154.0002.0E55] # THAI DIGIT FIVE 0ED5 ; [.15CF.0020.0002.0ED5][.0000.0155.0002.0ED5] # LAO DIGIT FIVE 0F25 ; [.15CF.0020.0002.0F25][.0000.0156.0002.0F25] # TIBETAN DIGIT FIVE 0F2E ; [.15CF.0020.0004.0F2E][.0000.0156.0004.0F2E] # TIBETAN DIGIT HALF FIVE 1C45 ; [.15CF.0020.0002.1C45][.0000.0157.0002.1C45] # LEPCHA DIGIT FIVE A905 ; [.15CF.0020.0002.A905][.0000.0158.0002.A905] # KAYAH LI DIGIT FIVE 1045 ; [.15CF.0020.0002.1045][.0000.0159.0002.1045] # MYANMAR DIGIT FIVE 1095 ; [.15CF.0020.0002.1095][.0000.015A.0002.1095] # MYANMAR SHAN DIGIT FIVE 1113B ; [.15CF.0020.0002.1113B][.0000.015B.0002.1113B] # CHAKMA DIGIT FIVE 17E5 ; [.15CF.0020.0002.17E5][.0000.015C.0002.17E5] # KHMER DIGIT FIVE 17F5 ; [.15CF.0020.0002.17F5][.0000.015D.0002.17F5] # KHMER SYMBOL LEK ATTAK PRAM AA55 ; [.15CF.0020.0002.AA55][.0000.015E.0002.AA55] # CHAM DIGIT FIVE 1B55 ; [.15CF.0020.0002.1B55][.0000.015F.0002.1B55] # BALINESE DIGIT FIVE A9D5 ; [.15CF.0020.0002.A9D5][.0000.0160.0002.A9D5] # JAVANESE DIGIT FIVE 1BB5 ; [.15CF.0020.0002.1BB5][.0000.0161.0002.1BB5] # SUNDANESE DIGIT FIVE 1815 ; [.15CF.0020.0002.1815][.0000.0162.0002.1815] # MONGOLIAN DIGIT FIVE 1C55 ; [.15CF.0020.0002.1C55][.0000.0163.0002.1C55] # OL CHIKI DIGIT FIVE A625 ; [.15CF.0020.0002.A625][.0000.0164.0002.A625] # VAI DIGIT FIVE 110F5 ; [.15CF.0020.0002.110F5][.0000.0165.0002.110F5] # SORA SOMPENG DIGIT FIVE 3025 ; [.15CF.0020.0002.3025][.0000.0166.0002.3025] # HANGZHOU NUMERAL FIVE 1010B ; [.15CF.0020.0002.1010B][.0000.0167.0002.1010B] # AEGEAN NUMBER FIVE 10143 ; [.15CF.0020.0002.10143][.0000.0168.0002.10143] # GREEK ACROPHONIC ATTIC FIVE 10148 ; [.15CF.0020.0002.10148][.0000.0168.0002.10148] # GREEK ACROPHONIC ATTIC FIVE TALENTS 1014F ; [.15CF.0020.0002.1014F][.0000.0168.0002.1014F] # GREEK ACROPHONIC ATTIC FIVE STATERS 1015F ; [.15CF.0020.0002.1015F][.0000.0168.0002.1015F] # GREEK ACROPHONIC TROEZENIAN FIVE 10173 ; [.15CF.0020.0002.10173][.0000.0168.0002.10173] # GREEK ACROPHONIC DELPHIC FIVE MNAS 10321 ; [.15CF.0020.0002.10321][.0000.016A.0002.10321] # OLD ITALIC NUMERAL FIVE 12403 ; [.15CF.0020.0002.12403][.0000.016C.0002.12403] # CUNEIFORM NUMERIC SIGN FIVE ASH 1240A ; [.15CF.0020.0002.1240A][.0000.016C.0002.1240A] # CUNEIFORM NUMERIC SIGN FIVE DISH 12410 ; [.15CF.0020.0002.12410][.0000.016C.0002.12410] # CUNEIFORM NUMERIC SIGN FIVE U 12419 ; [.15CF.0020.0002.12419][.0000.016C.0002.12419] # CUNEIFORM NUMERIC SIGN FIVE GESH2 12422 ; [.15CF.0020.0002.12422][.0000.016C.0002.12422] # CUNEIFORM NUMERIC SIGN FIVE GESHU 12427 ; [.15CF.0020.0002.12427][.0000.016C.0002.12427] # CUNEIFORM NUMERIC SIGN FIVE SHAR2 12431 ; [.15CF.0020.0002.12431][.0000.016C.0002.12431] # CUNEIFORM NUMERIC SIGN FIVE SHARU 12439 ; [.15CF.0020.0002.12439][.0000.016C.0002.12439] # CUNEIFORM NUMERIC SIGN FIVE BURU 1244D ; [.15CF.0020.0002.1244D][.0000.016C.0002.1244D] # CUNEIFORM NUMERIC SIGN FIVE ASH TENU 12454 ; [.15CF.0020.0002.12454][.0000.016C.0002.12454] # CUNEIFORM NUMERIC SIGN FIVE BAN2 12455 ; [.15CF.0020.0002.12455][.0000.016C.0002.12455] # CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM 111D5 ; [.15CF.0020.0002.111D5][.0000.0172.0002.111D5] # SHARADA DIGIT FIVE 116C5 ; [.15CF.0020.0002.116C5][.0000.0173.0002.116C5] # TAKRI DIGIT FIVE 1106B ; [.15CF.0020.0002.1106B][.0000.0174.0002.1106B] # BRAHMI DIGIT FIVE 11056 ; [.15CF.0020.0002.11056][.0000.0175.0002.11056] # BRAHMI NUMBER FIVE 1D364 ; [.15CF.0020.0002.1D364][.0000.0177.0002.1D364] # COUNTING ROD UNIT DIGIT FIVE 324C ; [.15CF.0020.0006.324C][.15CA.0020.0006.324C] # CIRCLED NUMBER FIFTY ON BLACK SQUARE 32BF ; [.15CF.0020.0006.32BF][.15CA.0020.0006.32BF] # CIRCLED NUMBER FIFTY 215A ; [.15CF.0020.001E.215A][*05AC.0020.001E.215A][.15D0.0020.001F.215A] # VULGAR FRACTION FIVE SIXTHS 215D ; [.15CF.0020.001E.215D][*05AC.0020.001E.215D][.15D2.0020.001F.215D] # VULGAR FRACTION FIVE EIGHTHS 33E4 ; [.15CF.0020.0004.33E4][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE 32C4 ; [.15CF.0020.0004.32C4][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY 335D ; [.15CF.0020.0004.335D][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE 0036 ; [.15D0.0020.0002.0036] # DIGIT SIX FF16 ; [.15D0.0020.0003.FF16] # FULLWIDTH DIGIT SIX 2479 ; [*02FB.0020.0004.2479][.15D0.0020.0004.2479][*02FC.0020.001F.2479] # PARENTHESIZED DIGIT SIX 248D ; [.15D0.0020.0004.248D][*0273.0020.0004.248D] # DIGIT SIX FULL STOP 1F107 ; [.15D0.0020.0004.1F107][*0221.0020.0004.1F107] # DIGIT SIX COMMA 1D7D4 ; [.15D0.0020.0005.1D7D4] # MATHEMATICAL BOLD DIGIT SIX 1D7DE ; [.15D0.0020.0005.1D7DE] # MATHEMATICAL DOUBLE-STRUCK DIGIT SIX 1D7E8 ; [.15D0.0020.0005.1D7E8] # MATHEMATICAL SANS-SERIF DIGIT SIX 1D7F2 ; [.15D0.0020.0005.1D7F2] # MATHEMATICAL SANS-SERIF BOLD DIGIT SIX 1D7FC ; [.15D0.0020.0005.1D7FC] # MATHEMATICAL MONOSPACE DIGIT SIX 2465 ; [.15D0.0020.0006.2465] # CIRCLED DIGIT SIX 24FA ; [.15D0.0020.0006.24FA] # DOUBLE CIRCLED DIGIT SIX 277B ; [.15D0.0020.0006.277B] # DINGBAT NEGATIVE CIRCLED DIGIT SIX 2785 ; [.15D0.0020.0006.2785] # DINGBAT CIRCLED SANS-SERIF DIGIT SIX 278F ; [.15D0.0020.0006.278F] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX 2076 ; [.15D0.0020.0014.2076] # SUPERSCRIPT SIX 2086 ; [.15D0.0020.0015.2086] # SUBSCRIPT SIX 0666 ; [.15D0.0020.0002.0666][.0000.013F.0002.0666] # ARABIC-INDIC DIGIT SIX 06F6 ; [.15D0.0020.0002.06F6][.0000.0140.0002.06F6] # EXTENDED ARABIC-INDIC DIGIT SIX 10E65 ; [.15D0.0020.0002.10E65][.0000.0141.0002.10E65] # RUMI DIGIT SIX 07C6 ; [.15D0.0020.0002.07C6][.0000.0142.0002.07C6] # NKO DIGIT SIX 136E ; [.15D0.0020.0002.136E][.0000.0143.0002.136E] # ETHIOPIC DIGIT SIX 104A6 ; [.15D0.0020.0002.104A6][.0000.0144.0002.104A6] # OSMANYA DIGIT SIX 096C ; [.15D0.0020.0002.096C][.0000.0145.0002.096C] # DEVANAGARI DIGIT SIX 09EC ; [.15D0.0020.0002.09EC][.0000.0146.0002.09EC] # BENGALI DIGIT SIX 0A6C ; [.15D0.0020.0002.0A6C][.0000.0147.0002.0A6C] # GURMUKHI DIGIT SIX 0AEC ; [.15D0.0020.0002.0AEC][.0000.0148.0002.0AEC] # GUJARATI DIGIT SIX 0B6C ; [.15D0.0020.0002.0B6C][.0000.0149.0002.0B6C] # ORIYA DIGIT SIX 0BEC ; [.15D0.0020.0002.0BEC][.0000.014A.0002.0BEC] # TAMIL DIGIT SIX 0C6C ; [.15D0.0020.0002.0C6C][.0000.014B.0002.0C6C] # TELUGU DIGIT SIX 0CEC ; [.15D0.0020.0002.0CEC][.0000.014C.0002.0CEC] # KANNADA DIGIT SIX 0D6C ; [.15D0.0020.0002.0D6C][.0000.014D.0002.0D6C] # MALAYALAM DIGIT SIX ABF6 ; [.15D0.0020.0002.ABF6][.0000.014E.0002.ABF6] # MEETEI MAYEK DIGIT SIX A8D6 ; [.15D0.0020.0002.A8D6][.0000.014F.0002.A8D6] # SAURASHTRA DIGIT SIX 194C ; [.15D0.0020.0002.194C][.0000.0150.0002.194C] # LIMBU DIGIT SIX 19D6 ; [.15D0.0020.0002.19D6][.0000.0151.0002.19D6] # NEW TAI LUE DIGIT SIX 1A86 ; [.15D0.0020.0002.1A86][.0000.0152.0002.1A86] # TAI THAM HORA DIGIT SIX 1A96 ; [.15D0.0020.0002.1A96][.0000.0153.0002.1A96] # TAI THAM THAM DIGIT SIX 0E56 ; [.15D0.0020.0002.0E56][.0000.0154.0002.0E56] # THAI DIGIT SIX 0ED6 ; [.15D0.0020.0002.0ED6][.0000.0155.0002.0ED6] # LAO DIGIT SIX 0F26 ; [.15D0.0020.0002.0F26][.0000.0156.0002.0F26] # TIBETAN DIGIT SIX 0F2F ; [.15D0.0020.0004.0F2F][.0000.0156.0004.0F2F] # TIBETAN DIGIT HALF SIX 1C46 ; [.15D0.0020.0002.1C46][.0000.0157.0002.1C46] # LEPCHA DIGIT SIX A906 ; [.15D0.0020.0002.A906][.0000.0158.0002.A906] # KAYAH LI DIGIT SIX 1046 ; [.15D0.0020.0002.1046][.0000.0159.0002.1046] # MYANMAR DIGIT SIX 1096 ; [.15D0.0020.0002.1096][.0000.015A.0002.1096] # MYANMAR SHAN DIGIT SIX 1113C ; [.15D0.0020.0002.1113C][.0000.015B.0002.1113C] # CHAKMA DIGIT SIX 17E6 ; [.15D0.0020.0002.17E6][.0000.015C.0002.17E6] # KHMER DIGIT SIX 17F6 ; [.15D0.0020.0002.17F6][.0000.015D.0002.17F6] # KHMER SYMBOL LEK ATTAK PRAM-MUOY AA56 ; [.15D0.0020.0002.AA56][.0000.015E.0002.AA56] # CHAM DIGIT SIX 1B56 ; [.15D0.0020.0002.1B56][.0000.015F.0002.1B56] # BALINESE DIGIT SIX A9D6 ; [.15D0.0020.0002.A9D6][.0000.0160.0002.A9D6] # JAVANESE DIGIT SIX 1BB6 ; [.15D0.0020.0002.1BB6][.0000.0161.0002.1BB6] # SUNDANESE DIGIT SIX 1816 ; [.15D0.0020.0002.1816][.0000.0162.0002.1816] # MONGOLIAN DIGIT SIX 1C56 ; [.15D0.0020.0002.1C56][.0000.0163.0002.1C56] # OL CHIKI DIGIT SIX A626 ; [.15D0.0020.0002.A626][.0000.0164.0002.A626] # VAI DIGIT SIX 110F6 ; [.15D0.0020.0002.110F6][.0000.0165.0002.110F6] # SORA SOMPENG DIGIT SIX 3026 ; [.15D0.0020.0002.3026][.0000.0166.0002.3026] # HANGZHOU NUMERAL SIX 1010C ; [.15D0.0020.0002.1010C][.0000.0167.0002.1010C] # AEGEAN NUMBER SIX 2185 ; [.15D0.0020.0002.2185][.0000.0169.0002.2185] # ROMAN NUMERAL SIX LATE FORM 12404 ; [.15D0.0020.0002.12404][.0000.016C.0002.12404] # CUNEIFORM NUMERIC SIGN SIX ASH 1240B ; [.15D0.0020.0002.1240B][.0000.016C.0002.1240B] # CUNEIFORM NUMERIC SIGN SIX DISH 12411 ; [.15D0.0020.0002.12411][.0000.016C.0002.12411] # CUNEIFORM NUMERIC SIGN SIX U 1241A ; [.15D0.0020.0002.1241A][.0000.016C.0002.1241A] # CUNEIFORM NUMERIC SIGN SIX GESH2 12428 ; [.15D0.0020.0002.12428][.0000.016C.0002.12428] # CUNEIFORM NUMERIC SIGN SIX SHAR2 12440 ; [.15D0.0020.0002.12440][.0000.016C.0002.12440] # CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9 1244E ; [.15D0.0020.0002.1244E][.0000.016C.0002.1244E] # CUNEIFORM NUMERIC SIGN SIX ASH TENU 111D6 ; [.15D0.0020.0002.111D6][.0000.0172.0002.111D6] # SHARADA DIGIT SIX 116C6 ; [.15D0.0020.0002.116C6][.0000.0173.0002.116C6] # TAKRI DIGIT SIX 1106C ; [.15D0.0020.0002.1106C][.0000.0174.0002.1106C] # BRAHMI DIGIT SIX 11057 ; [.15D0.0020.0002.11057][.0000.0175.0002.11057] # BRAHMI NUMBER SIX 1D365 ; [.15D0.0020.0002.1D365][.0000.0177.0002.1D365] # COUNTING ROD UNIT DIGIT SIX 324D ; [.15D0.0020.0006.324D][.15CA.0020.0006.324D] # CIRCLED NUMBER SIXTY ON BLACK SQUARE 33E5 ; [.15D0.0020.0004.33E5][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX 32C5 ; [.15D0.0020.0004.32C5][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE 335E ; [.15D0.0020.0004.335E][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX 0037 ; [.15D1.0020.0002.0037] # DIGIT SEVEN FF17 ; [.15D1.0020.0003.FF17] # FULLWIDTH DIGIT SEVEN 247A ; [*02FB.0020.0004.247A][.15D1.0020.0004.247A][*02FC.0020.001F.247A] # PARENTHESIZED DIGIT SEVEN 248E ; [.15D1.0020.0004.248E][*0273.0020.0004.248E] # DIGIT SEVEN FULL STOP 1F108 ; [.15D1.0020.0004.1F108][*0221.0020.0004.1F108] # DIGIT SEVEN COMMA 1D7D5 ; [.15D1.0020.0005.1D7D5] # MATHEMATICAL BOLD DIGIT SEVEN 1D7DF ; [.15D1.0020.0005.1D7DF] # MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN 1D7E9 ; [.15D1.0020.0005.1D7E9] # MATHEMATICAL SANS-SERIF DIGIT SEVEN 1D7F3 ; [.15D1.0020.0005.1D7F3] # MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN 1D7FD ; [.15D1.0020.0005.1D7FD] # MATHEMATICAL MONOSPACE DIGIT SEVEN 2466 ; [.15D1.0020.0006.2466] # CIRCLED DIGIT SEVEN 24FB ; [.15D1.0020.0006.24FB] # DOUBLE CIRCLED DIGIT SEVEN 277C ; [.15D1.0020.0006.277C] # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN 2786 ; [.15D1.0020.0006.2786] # DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN 2790 ; [.15D1.0020.0006.2790] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN 2077 ; [.15D1.0020.0014.2077] # SUPERSCRIPT SEVEN 2087 ; [.15D1.0020.0015.2087] # SUBSCRIPT SEVEN 0667 ; [.15D1.0020.0002.0667][.0000.013F.0002.0667] # ARABIC-INDIC DIGIT SEVEN 06F7 ; [.15D1.0020.0002.06F7][.0000.0140.0002.06F7] # EXTENDED ARABIC-INDIC DIGIT SEVEN 10E66 ; [.15D1.0020.0002.10E66][.0000.0141.0002.10E66] # RUMI DIGIT SEVEN 07C7 ; [.15D1.0020.0002.07C7][.0000.0142.0002.07C7] # NKO DIGIT SEVEN 136F ; [.15D1.0020.0002.136F][.0000.0143.0002.136F] # ETHIOPIC DIGIT SEVEN 104A7 ; [.15D1.0020.0002.104A7][.0000.0144.0002.104A7] # OSMANYA DIGIT SEVEN 096D ; [.15D1.0020.0002.096D][.0000.0145.0002.096D] # DEVANAGARI DIGIT SEVEN 09ED ; [.15D1.0020.0002.09ED][.0000.0146.0002.09ED] # BENGALI DIGIT SEVEN 0A6D ; [.15D1.0020.0002.0A6D][.0000.0147.0002.0A6D] # GURMUKHI DIGIT SEVEN 0AED ; [.15D1.0020.0002.0AED][.0000.0148.0002.0AED] # GUJARATI DIGIT SEVEN 0B6D ; [.15D1.0020.0002.0B6D][.0000.0149.0002.0B6D] # ORIYA DIGIT SEVEN 0BED ; [.15D1.0020.0002.0BED][.0000.014A.0002.0BED] # TAMIL DIGIT SEVEN 0C6D ; [.15D1.0020.0002.0C6D][.0000.014B.0002.0C6D] # TELUGU DIGIT SEVEN 0CED ; [.15D1.0020.0002.0CED][.0000.014C.0002.0CED] # KANNADA DIGIT SEVEN 0D6D ; [.15D1.0020.0002.0D6D][.0000.014D.0002.0D6D] # MALAYALAM DIGIT SEVEN ABF7 ; [.15D1.0020.0002.ABF7][.0000.014E.0002.ABF7] # MEETEI MAYEK DIGIT SEVEN A8D7 ; [.15D1.0020.0002.A8D7][.0000.014F.0002.A8D7] # SAURASHTRA DIGIT SEVEN 194D ; [.15D1.0020.0002.194D][.0000.0150.0002.194D] # LIMBU DIGIT SEVEN 19D7 ; [.15D1.0020.0002.19D7][.0000.0151.0002.19D7] # NEW TAI LUE DIGIT SEVEN 1A87 ; [.15D1.0020.0002.1A87][.0000.0152.0002.1A87] # TAI THAM HORA DIGIT SEVEN 1A97 ; [.15D1.0020.0002.1A97][.0000.0153.0002.1A97] # TAI THAM THAM DIGIT SEVEN 0E57 ; [.15D1.0020.0002.0E57][.0000.0154.0002.0E57] # THAI DIGIT SEVEN 0ED7 ; [.15D1.0020.0002.0ED7][.0000.0155.0002.0ED7] # LAO DIGIT SEVEN 0F27 ; [.15D1.0020.0002.0F27][.0000.0156.0002.0F27] # TIBETAN DIGIT SEVEN 0F30 ; [.15D1.0020.0004.0F30][.0000.0156.0004.0F30] # TIBETAN DIGIT HALF SEVEN 1C47 ; [.15D1.0020.0002.1C47][.0000.0157.0002.1C47] # LEPCHA DIGIT SEVEN A907 ; [.15D1.0020.0002.A907][.0000.0158.0002.A907] # KAYAH LI DIGIT SEVEN 1047 ; [.15D1.0020.0002.1047][.0000.0159.0002.1047] # MYANMAR DIGIT SEVEN 1097 ; [.15D1.0020.0002.1097][.0000.015A.0002.1097] # MYANMAR SHAN DIGIT SEVEN 1113D ; [.15D1.0020.0002.1113D][.0000.015B.0002.1113D] # CHAKMA DIGIT SEVEN 17E7 ; [.15D1.0020.0002.17E7][.0000.015C.0002.17E7] # KHMER DIGIT SEVEN 17F7 ; [.15D1.0020.0002.17F7][.0000.015D.0002.17F7] # KHMER SYMBOL LEK ATTAK PRAM-PII AA57 ; [.15D1.0020.0002.AA57][.0000.015E.0002.AA57] # CHAM DIGIT SEVEN 1B57 ; [.15D1.0020.0002.1B57][.0000.015F.0002.1B57] # BALINESE DIGIT SEVEN A9D7 ; [.15D1.0020.0002.A9D7][.0000.0160.0002.A9D7] # JAVANESE DIGIT SEVEN 1BB7 ; [.15D1.0020.0002.1BB7][.0000.0161.0002.1BB7] # SUNDANESE DIGIT SEVEN 1817 ; [.15D1.0020.0002.1817][.0000.0162.0002.1817] # MONGOLIAN DIGIT SEVEN 1C57 ; [.15D1.0020.0002.1C57][.0000.0163.0002.1C57] # OL CHIKI DIGIT SEVEN A627 ; [.15D1.0020.0002.A627][.0000.0164.0002.A627] # VAI DIGIT SEVEN 110F7 ; [.15D1.0020.0002.110F7][.0000.0165.0002.110F7] # SORA SOMPENG DIGIT SEVEN 3027 ; [.15D1.0020.0002.3027][.0000.0166.0002.3027] # HANGZHOU NUMERAL SEVEN 1010D ; [.15D1.0020.0002.1010D][.0000.0167.0002.1010D] # AEGEAN NUMBER SEVEN 12405 ; [.15D1.0020.0002.12405][.0000.016C.0002.12405] # CUNEIFORM NUMERIC SIGN SEVEN ASH 1240C ; [.15D1.0020.0002.1240C][.0000.016C.0002.1240C] # CUNEIFORM NUMERIC SIGN SEVEN DISH 12412 ; [.15D1.0020.0002.12412][.0000.016C.0002.12412] # CUNEIFORM NUMERIC SIGN SEVEN U 1241B ; [.15D1.0020.0002.1241B][.0000.016C.0002.1241B] # CUNEIFORM NUMERIC SIGN SEVEN GESH2 12429 ; [.15D1.0020.0002.12429][.0000.016C.0002.12429] # CUNEIFORM NUMERIC SIGN SEVEN SHAR2 12441 ; [.15D1.0020.0002.12441][.0000.016C.0002.12441] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3 12442 ; [.15D1.0020.0002.12442][.0000.016C.0002.12442] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A 12443 ; [.15D1.0020.0002.12443][.0000.016C.0002.12443] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B 111D7 ; [.15D1.0020.0002.111D7][.0000.0172.0002.111D7] # SHARADA DIGIT SEVEN 116C7 ; [.15D1.0020.0002.116C7][.0000.0173.0002.116C7] # TAKRI DIGIT SEVEN 1106D ; [.15D1.0020.0002.1106D][.0000.0174.0002.1106D] # BRAHMI DIGIT SEVEN 11058 ; [.15D1.0020.0002.11058][.0000.0175.0002.11058] # BRAHMI NUMBER SEVEN 1D366 ; [.15D1.0020.0002.1D366][.0000.0177.0002.1D366] # COUNTING ROD UNIT DIGIT SEVEN 324E ; [.15D1.0020.0006.324E][.15CA.0020.0006.324E] # CIRCLED NUMBER SEVENTY ON BLACK SQUARE 215E ; [.15D1.0020.001E.215E][*05AC.0020.001E.215E][.15D2.0020.001F.215E] # VULGAR FRACTION SEVEN EIGHTHS 33E6 ; [.15D1.0020.0004.33E6][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN 32C6 ; [.15D1.0020.0004.32C6][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY 335F ; [.15D1.0020.0004.335F][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN 0038 ; [.15D2.0020.0002.0038] # DIGIT EIGHT FF18 ; [.15D2.0020.0003.FF18] # FULLWIDTH DIGIT EIGHT 247B ; [*02FB.0020.0004.247B][.15D2.0020.0004.247B][*02FC.0020.001F.247B] # PARENTHESIZED DIGIT EIGHT 248F ; [.15D2.0020.0004.248F][*0273.0020.0004.248F] # DIGIT EIGHT FULL STOP 1F109 ; [.15D2.0020.0004.1F109][*0221.0020.0004.1F109] # DIGIT EIGHT COMMA 1D7D6 ; [.15D2.0020.0005.1D7D6] # MATHEMATICAL BOLD DIGIT EIGHT 1D7E0 ; [.15D2.0020.0005.1D7E0] # MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT 1D7EA ; [.15D2.0020.0005.1D7EA] # MATHEMATICAL SANS-SERIF DIGIT EIGHT 1D7F4 ; [.15D2.0020.0005.1D7F4] # MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT 1D7FE ; [.15D2.0020.0005.1D7FE] # MATHEMATICAL MONOSPACE DIGIT EIGHT 2467 ; [.15D2.0020.0006.2467] # CIRCLED DIGIT EIGHT 24FC ; [.15D2.0020.0006.24FC] # DOUBLE CIRCLED DIGIT EIGHT 277D ; [.15D2.0020.0006.277D] # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT 2787 ; [.15D2.0020.0006.2787] # DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT 2791 ; [.15D2.0020.0006.2791] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT 2078 ; [.15D2.0020.0014.2078] # SUPERSCRIPT EIGHT 2088 ; [.15D2.0020.0015.2088] # SUBSCRIPT EIGHT 0668 ; [.15D2.0020.0002.0668][.0000.013F.0002.0668] # ARABIC-INDIC DIGIT EIGHT 06F8 ; [.15D2.0020.0002.06F8][.0000.0140.0002.06F8] # EXTENDED ARABIC-INDIC DIGIT EIGHT 10E67 ; [.15D2.0020.0002.10E67][.0000.0141.0002.10E67] # RUMI DIGIT EIGHT 07C8 ; [.15D2.0020.0002.07C8][.0000.0142.0002.07C8] # NKO DIGIT EIGHT 1370 ; [.15D2.0020.0002.1370][.0000.0143.0002.1370] # ETHIOPIC DIGIT EIGHT 104A8 ; [.15D2.0020.0002.104A8][.0000.0144.0002.104A8] # OSMANYA DIGIT EIGHT 096E ; [.15D2.0020.0002.096E][.0000.0145.0002.096E] # DEVANAGARI DIGIT EIGHT 09EE ; [.15D2.0020.0002.09EE][.0000.0146.0002.09EE] # BENGALI DIGIT EIGHT 0A6E ; [.15D2.0020.0002.0A6E][.0000.0147.0002.0A6E] # GURMUKHI DIGIT EIGHT 0AEE ; [.15D2.0020.0002.0AEE][.0000.0148.0002.0AEE] # GUJARATI DIGIT EIGHT 0B6E ; [.15D2.0020.0002.0B6E][.0000.0149.0002.0B6E] # ORIYA DIGIT EIGHT 0BEE ; [.15D2.0020.0002.0BEE][.0000.014A.0002.0BEE] # TAMIL DIGIT EIGHT 0C6E ; [.15D2.0020.0002.0C6E][.0000.014B.0002.0C6E] # TELUGU DIGIT EIGHT 0CEE ; [.15D2.0020.0002.0CEE][.0000.014C.0002.0CEE] # KANNADA DIGIT EIGHT 0D6E ; [.15D2.0020.0002.0D6E][.0000.014D.0002.0D6E] # MALAYALAM DIGIT EIGHT ABF8 ; [.15D2.0020.0002.ABF8][.0000.014E.0002.ABF8] # MEETEI MAYEK DIGIT EIGHT A8D8 ; [.15D2.0020.0002.A8D8][.0000.014F.0002.A8D8] # SAURASHTRA DIGIT EIGHT 194E ; [.15D2.0020.0002.194E][.0000.0150.0002.194E] # LIMBU DIGIT EIGHT 19D8 ; [.15D2.0020.0002.19D8][.0000.0151.0002.19D8] # NEW TAI LUE DIGIT EIGHT 1A88 ; [.15D2.0020.0002.1A88][.0000.0152.0002.1A88] # TAI THAM HORA DIGIT EIGHT 1A98 ; [.15D2.0020.0002.1A98][.0000.0153.0002.1A98] # TAI THAM THAM DIGIT EIGHT 0E58 ; [.15D2.0020.0002.0E58][.0000.0154.0002.0E58] # THAI DIGIT EIGHT 0ED8 ; [.15D2.0020.0002.0ED8][.0000.0155.0002.0ED8] # LAO DIGIT EIGHT 0F28 ; [.15D2.0020.0002.0F28][.0000.0156.0002.0F28] # TIBETAN DIGIT EIGHT 0F31 ; [.15D2.0020.0004.0F31][.0000.0156.0004.0F31] # TIBETAN DIGIT HALF EIGHT 1C48 ; [.15D2.0020.0002.1C48][.0000.0157.0002.1C48] # LEPCHA DIGIT EIGHT A908 ; [.15D2.0020.0002.A908][.0000.0158.0002.A908] # KAYAH LI DIGIT EIGHT 1048 ; [.15D2.0020.0002.1048][.0000.0159.0002.1048] # MYANMAR DIGIT EIGHT 1098 ; [.15D2.0020.0002.1098][.0000.015A.0002.1098] # MYANMAR SHAN DIGIT EIGHT 1113E ; [.15D2.0020.0002.1113E][.0000.015B.0002.1113E] # CHAKMA DIGIT EIGHT 17E8 ; [.15D2.0020.0002.17E8][.0000.015C.0002.17E8] # KHMER DIGIT EIGHT 17F8 ; [.15D2.0020.0002.17F8][.0000.015D.0002.17F8] # KHMER SYMBOL LEK ATTAK PRAM-BEI AA58 ; [.15D2.0020.0002.AA58][.0000.015E.0002.AA58] # CHAM DIGIT EIGHT 1B58 ; [.15D2.0020.0002.1B58][.0000.015F.0002.1B58] # BALINESE DIGIT EIGHT A9D8 ; [.15D2.0020.0002.A9D8][.0000.0160.0002.A9D8] # JAVANESE DIGIT EIGHT 1BB8 ; [.15D2.0020.0002.1BB8][.0000.0161.0002.1BB8] # SUNDANESE DIGIT EIGHT 1818 ; [.15D2.0020.0002.1818][.0000.0162.0002.1818] # MONGOLIAN DIGIT EIGHT 1C58 ; [.15D2.0020.0002.1C58][.0000.0163.0002.1C58] # OL CHIKI DIGIT EIGHT A628 ; [.15D2.0020.0002.A628][.0000.0164.0002.A628] # VAI DIGIT EIGHT 110F8 ; [.15D2.0020.0002.110F8][.0000.0165.0002.110F8] # SORA SOMPENG DIGIT EIGHT 3028 ; [.15D2.0020.0002.3028][.0000.0166.0002.3028] # HANGZHOU NUMERAL EIGHT 1010E ; [.15D2.0020.0002.1010E][.0000.0167.0002.1010E] # AEGEAN NUMBER EIGHT 12406 ; [.15D2.0020.0002.12406][.0000.016C.0002.12406] # CUNEIFORM NUMERIC SIGN EIGHT ASH 1240D ; [.15D2.0020.0002.1240D][.0000.016C.0002.1240D] # CUNEIFORM NUMERIC SIGN EIGHT DISH 12413 ; [.15D2.0020.0002.12413][.0000.016C.0002.12413] # CUNEIFORM NUMERIC SIGN EIGHT U 1241C ; [.15D2.0020.0002.1241C][.0000.016C.0002.1241C] # CUNEIFORM NUMERIC SIGN EIGHT GESH2 1242A ; [.15D2.0020.0002.1242A][.0000.016C.0002.1242A] # CUNEIFORM NUMERIC SIGN EIGHT SHAR2 12444 ; [.15D2.0020.0002.12444][.0000.016C.0002.12444] # CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU 12445 ; [.15D2.0020.0002.12445][.0000.016C.0002.12445] # CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3 111D8 ; [.15D2.0020.0002.111D8][.0000.0172.0002.111D8] # SHARADA DIGIT EIGHT 116C8 ; [.15D2.0020.0002.116C8][.0000.0173.0002.116C8] # TAKRI DIGIT EIGHT 1106E ; [.15D2.0020.0002.1106E][.0000.0174.0002.1106E] # BRAHMI DIGIT EIGHT 11059 ; [.15D2.0020.0002.11059][.0000.0175.0002.11059] # BRAHMI NUMBER EIGHT 1D367 ; [.15D2.0020.0002.1D367][.0000.0177.0002.1D367] # COUNTING ROD UNIT DIGIT EIGHT 324F ; [.15D2.0020.0006.324F][.15CA.0020.0006.324F] # CIRCLED NUMBER EIGHTY ON BLACK SQUARE 33E7 ; [.15D2.0020.0004.33E7][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT 32C7 ; [.15D2.0020.0004.32C7][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST 3360 ; [.15D2.0020.0004.3360][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT 0039 ; [.15D3.0020.0002.0039] # DIGIT NINE FF19 ; [.15D3.0020.0003.FF19] # FULLWIDTH DIGIT NINE 247C ; [*02FB.0020.0004.247C][.15D3.0020.0004.247C][*02FC.0020.001F.247C] # PARENTHESIZED DIGIT NINE 2490 ; [.15D3.0020.0004.2490][*0273.0020.0004.2490] # DIGIT NINE FULL STOP 1F10A ; [.15D3.0020.0004.1F10A][*0221.0020.0004.1F10A] # DIGIT NINE COMMA 1D7D7 ; [.15D3.0020.0005.1D7D7] # MATHEMATICAL BOLD DIGIT NINE 1D7E1 ; [.15D3.0020.0005.1D7E1] # MATHEMATICAL DOUBLE-STRUCK DIGIT NINE 1D7EB ; [.15D3.0020.0005.1D7EB] # MATHEMATICAL SANS-SERIF DIGIT NINE 1D7F5 ; [.15D3.0020.0005.1D7F5] # MATHEMATICAL SANS-SERIF BOLD DIGIT NINE 1D7FF ; [.15D3.0020.0005.1D7FF] # MATHEMATICAL MONOSPACE DIGIT NINE 2468 ; [.15D3.0020.0006.2468] # CIRCLED DIGIT NINE 24FD ; [.15D3.0020.0006.24FD] # DOUBLE CIRCLED DIGIT NINE 277E ; [.15D3.0020.0006.277E] # DINGBAT NEGATIVE CIRCLED DIGIT NINE 2788 ; [.15D3.0020.0006.2788] # DINGBAT CIRCLED SANS-SERIF DIGIT NINE 2792 ; [.15D3.0020.0006.2792] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE 2079 ; [.15D3.0020.0014.2079] # SUPERSCRIPT NINE 2089 ; [.15D3.0020.0015.2089] # SUBSCRIPT NINE 0669 ; [.15D3.0020.0002.0669][.0000.013F.0002.0669] # ARABIC-INDIC DIGIT NINE 06F9 ; [.15D3.0020.0002.06F9][.0000.0140.0002.06F9] # EXTENDED ARABIC-INDIC DIGIT NINE 10E68 ; [.15D3.0020.0002.10E68][.0000.0141.0002.10E68] # RUMI DIGIT NINE 07C9 ; [.15D3.0020.0002.07C9][.0000.0142.0002.07C9] # NKO DIGIT NINE 1371 ; [.15D3.0020.0002.1371][.0000.0143.0002.1371] # ETHIOPIC DIGIT NINE 104A9 ; [.15D3.0020.0002.104A9][.0000.0144.0002.104A9] # OSMANYA DIGIT NINE 096F ; [.15D3.0020.0002.096F][.0000.0145.0002.096F] # DEVANAGARI DIGIT NINE 09EF ; [.15D3.0020.0002.09EF][.0000.0146.0002.09EF] # BENGALI DIGIT NINE 0A6F ; [.15D3.0020.0002.0A6F][.0000.0147.0002.0A6F] # GURMUKHI DIGIT NINE 0AEF ; [.15D3.0020.0002.0AEF][.0000.0148.0002.0AEF] # GUJARATI DIGIT NINE 0B6F ; [.15D3.0020.0002.0B6F][.0000.0149.0002.0B6F] # ORIYA DIGIT NINE 0BEF ; [.15D3.0020.0002.0BEF][.0000.014A.0002.0BEF] # TAMIL DIGIT NINE 0C6F ; [.15D3.0020.0002.0C6F][.0000.014B.0002.0C6F] # TELUGU DIGIT NINE 0CEF ; [.15D3.0020.0002.0CEF][.0000.014C.0002.0CEF] # KANNADA DIGIT NINE 0D6F ; [.15D3.0020.0002.0D6F][.0000.014D.0002.0D6F] # MALAYALAM DIGIT NINE ABF9 ; [.15D3.0020.0002.ABF9][.0000.014E.0002.ABF9] # MEETEI MAYEK DIGIT NINE A8D9 ; [.15D3.0020.0002.A8D9][.0000.014F.0002.A8D9] # SAURASHTRA DIGIT NINE 194F ; [.15D3.0020.0002.194F][.0000.0150.0002.194F] # LIMBU DIGIT NINE 19D9 ; [.15D3.0020.0002.19D9][.0000.0151.0002.19D9] # NEW TAI LUE DIGIT NINE 1A89 ; [.15D3.0020.0002.1A89][.0000.0152.0002.1A89] # TAI THAM HORA DIGIT NINE 1A99 ; [.15D3.0020.0002.1A99][.0000.0153.0002.1A99] # TAI THAM THAM DIGIT NINE 0E59 ; [.15D3.0020.0002.0E59][.0000.0154.0002.0E59] # THAI DIGIT NINE 0ED9 ; [.15D3.0020.0002.0ED9][.0000.0155.0002.0ED9] # LAO DIGIT NINE 0F29 ; [.15D3.0020.0002.0F29][.0000.0156.0002.0F29] # TIBETAN DIGIT NINE 0F32 ; [.15D3.0020.0004.0F32][.0000.0156.0004.0F32] # TIBETAN DIGIT HALF NINE 1C49 ; [.15D3.0020.0002.1C49][.0000.0157.0002.1C49] # LEPCHA DIGIT NINE A909 ; [.15D3.0020.0002.A909][.0000.0158.0002.A909] # KAYAH LI DIGIT NINE 1049 ; [.15D3.0020.0002.1049][.0000.0159.0002.1049] # MYANMAR DIGIT NINE 1099 ; [.15D3.0020.0002.1099][.0000.015A.0002.1099] # MYANMAR SHAN DIGIT NINE 1113F ; [.15D3.0020.0002.1113F][.0000.015B.0002.1113F] # CHAKMA DIGIT NINE 17E9 ; [.15D3.0020.0002.17E9][.0000.015C.0002.17E9] # KHMER DIGIT NINE 17F9 ; [.15D3.0020.0002.17F9][.0000.015D.0002.17F9] # KHMER SYMBOL LEK ATTAK PRAM-BUON AA59 ; [.15D3.0020.0002.AA59][.0000.015E.0002.AA59] # CHAM DIGIT NINE 1B59 ; [.15D3.0020.0002.1B59][.0000.015F.0002.1B59] # BALINESE DIGIT NINE A9D9 ; [.15D3.0020.0002.A9D9][.0000.0160.0002.A9D9] # JAVANESE DIGIT NINE 1BB9 ; [.15D3.0020.0002.1BB9][.0000.0161.0002.1BB9] # SUNDANESE DIGIT NINE 1819 ; [.15D3.0020.0002.1819][.0000.0162.0002.1819] # MONGOLIAN DIGIT NINE 1C59 ; [.15D3.0020.0002.1C59][.0000.0163.0002.1C59] # OL CHIKI DIGIT NINE A629 ; [.15D3.0020.0002.A629][.0000.0164.0002.A629] # VAI DIGIT NINE 110F9 ; [.15D3.0020.0002.110F9][.0000.0165.0002.110F9] # SORA SOMPENG DIGIT NINE 3029 ; [.15D3.0020.0002.3029][.0000.0166.0002.3029] # HANGZHOU NUMERAL NINE 1010F ; [.15D3.0020.0002.1010F][.0000.0167.0002.1010F] # AEGEAN NUMBER NINE 12407 ; [.15D3.0020.0002.12407][.0000.016C.0002.12407] # CUNEIFORM NUMERIC SIGN NINE ASH 1240E ; [.15D3.0020.0002.1240E][.0000.016C.0002.1240E] # CUNEIFORM NUMERIC SIGN NINE DISH 12414 ; [.15D3.0020.0002.12414][.0000.016C.0002.12414] # CUNEIFORM NUMERIC SIGN NINE U 1241D ; [.15D3.0020.0002.1241D][.0000.016C.0002.1241D] # CUNEIFORM NUMERIC SIGN NINE GESH2 1242B ; [.15D3.0020.0002.1242B][.0000.016C.0002.1242B] # CUNEIFORM NUMERIC SIGN NINE SHAR2 12446 ; [.15D3.0020.0002.12446][.0000.016C.0002.12446] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU 12447 ; [.15D3.0020.0002.12447][.0000.016C.0002.12447] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3 12448 ; [.15D3.0020.0002.12448][.0000.016C.0002.12448] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4 12449 ; [.15D3.0020.0002.12449][.0000.016C.0002.12449] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A 111D9 ; [.15D3.0020.0002.111D9][.0000.0172.0002.111D9] # SHARADA DIGIT NINE 116C9 ; [.15D3.0020.0002.116C9][.0000.0173.0002.116C9] # TAKRI DIGIT NINE 1106F ; [.15D3.0020.0002.1106F][.0000.0174.0002.1106F] # BRAHMI DIGIT NINE 1105A ; [.15D3.0020.0002.1105A][.0000.0175.0002.1105A] # BRAHMI NUMBER NINE 1D368 ; [.15D3.0020.0002.1D368][.0000.0177.0002.1D368] # COUNTING ROD UNIT DIGIT NINE 33E8 ; [.15D3.0020.0004.33E8][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE 32C8 ; [.15D3.0020.0004.32C8][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER 3361 ; [.15D3.0020.0004.3361][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE 0061 ; [.15D4.0020.0002.0061] # LATIN SMALL LETTER A FF41 ; [.15D4.0020.0003.FF41] # FULLWIDTH LATIN SMALL LETTER A 0363 ; [.15D4.0020.0004.0363] # COMBINING LATIN SMALL LETTER A 249C ; [*02FB.0020.0004.249C][.15D4.0020.0004.249C][*02FC.0020.001F.249C] # PARENTHESIZED LATIN SMALL LETTER A 1D41A ; [.15D4.0020.0005.1D41A] # MATHEMATICAL BOLD SMALL A 1D44E ; [.15D4.0020.0005.1D44E] # MATHEMATICAL ITALIC SMALL A 1D482 ; [.15D4.0020.0005.1D482] # MATHEMATICAL BOLD ITALIC SMALL A 1D4B6 ; [.15D4.0020.0005.1D4B6] # MATHEMATICAL SCRIPT SMALL A 1D4EA ; [.15D4.0020.0005.1D4EA] # MATHEMATICAL BOLD SCRIPT SMALL A 1D51E ; [.15D4.0020.0005.1D51E] # MATHEMATICAL FRAKTUR SMALL A 1D552 ; [.15D4.0020.0005.1D552] # MATHEMATICAL DOUBLE-STRUCK SMALL A 1D586 ; [.15D4.0020.0005.1D586] # MATHEMATICAL BOLD FRAKTUR SMALL A 1D5BA ; [.15D4.0020.0005.1D5BA] # MATHEMATICAL SANS-SERIF SMALL A 1D5EE ; [.15D4.0020.0005.1D5EE] # MATHEMATICAL SANS-SERIF BOLD SMALL A 1D622 ; [.15D4.0020.0005.1D622] # MATHEMATICAL SANS-SERIF ITALIC SMALL A 1D656 ; [.15D4.0020.0005.1D656] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A 1D68A ; [.15D4.0020.0005.1D68A] # MATHEMATICAL MONOSPACE SMALL A 24D0 ; [.15D4.0020.0006.24D0] # CIRCLED LATIN SMALL LETTER A 0041 ; [.15D4.0020.0008.0041] # LATIN CAPITAL LETTER A FF21 ; [.15D4.0020.0009.FF21] # FULLWIDTH LATIN CAPITAL LETTER A 1F110 ; [*02FB.0020.0004.1F110][.15D4.0020.000A.1F110][*02FC.0020.001F.1F110] # PARENTHESIZED LATIN CAPITAL LETTER A 1F1E6 ; [.15D4.0020.000A.1F1E6] # REGIONAL INDICATOR SYMBOL LETTER A 1D400 ; [.15D4.0020.000B.1D400] # MATHEMATICAL BOLD CAPITAL A 1D434 ; [.15D4.0020.000B.1D434] # MATHEMATICAL ITALIC CAPITAL A 1D468 ; [.15D4.0020.000B.1D468] # MATHEMATICAL BOLD ITALIC CAPITAL A 1D49C ; [.15D4.0020.000B.1D49C] # MATHEMATICAL SCRIPT CAPITAL A 1D4D0 ; [.15D4.0020.000B.1D4D0] # MATHEMATICAL BOLD SCRIPT CAPITAL A 1D504 ; [.15D4.0020.000B.1D504] # MATHEMATICAL FRAKTUR CAPITAL A 1D538 ; [.15D4.0020.000B.1D538] # MATHEMATICAL DOUBLE-STRUCK CAPITAL A 1D56C ; [.15D4.0020.000B.1D56C] # MATHEMATICAL BOLD FRAKTUR CAPITAL A 1D5A0 ; [.15D4.0020.000B.1D5A0] # MATHEMATICAL SANS-SERIF CAPITAL A 1D5D4 ; [.15D4.0020.000B.1D5D4] # MATHEMATICAL SANS-SERIF BOLD CAPITAL A 1D608 ; [.15D4.0020.000B.1D608] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL A 1D63C ; [.15D4.0020.000B.1D63C] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A 1D670 ; [.15D4.0020.000B.1D670] # MATHEMATICAL MONOSPACE CAPITAL A 24B6 ; [.15D4.0020.000C.24B6] # CIRCLED LATIN CAPITAL LETTER A 1F150 ; [.15D4.0020.000C.1F150] # NEGATIVE CIRCLED LATIN CAPITAL LETTER A 00AA ; [.15D4.0020.0014.00AA] # FEMININE ORDINAL INDICATOR 1D43 ; [.15D4.0020.0014.1D43] # MODIFIER LETTER SMALL A 2090 ; [.15D4.0020.0015.2090] # LATIN SUBSCRIPT SMALL LETTER A 1D2C ; [.15D4.0020.001D.1D2C] # MODIFIER LETTER CAPITAL A 1F130 ; [.15D4.0020.001D.1F130] # SQUARED LATIN CAPITAL LETTER A 1F170 ; [.15D4.0020.001D.1F170] # NEGATIVE SQUARED LATIN CAPITAL LETTER A 00E1 ; [.15D4.0020.0002.0061][.0000.0032.0002.0301] # LATIN SMALL LETTER A WITH ACUTE 00C1 ; [.15D4.0020.0008.0041][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH ACUTE 00E0 ; [.15D4.0020.0002.0061][.0000.0035.0002.0300] # LATIN SMALL LETTER A WITH GRAVE 00C0 ; [.15D4.0020.0008.0041][.0000.0035.0002.0300] # LATIN CAPITAL LETTER A WITH GRAVE 0103 ; [.15D4.0020.0002.0061][.0000.0037.0002.0306] # LATIN SMALL LETTER A WITH BREVE 0102 ; [.15D4.0020.0008.0041][.0000.0037.0002.0306] # LATIN CAPITAL LETTER A WITH BREVE 1EAF ; [.15D4.0020.0002.0061][.0000.0037.0002.0306][.0000.0032.0002.0301] # LATIN SMALL LETTER A WITH BREVE AND ACUTE 1EAE ; [.15D4.0020.0008.0041][.0000.0037.0002.0306][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE 1EB1 ; [.15D4.0020.0002.0061][.0000.0037.0002.0306][.0000.0035.0002.0300] # LATIN SMALL LETTER A WITH BREVE AND GRAVE 1EB0 ; [.15D4.0020.0008.0041][.0000.0037.0002.0306][.0000.0035.0002.0300] # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE 1EB5 ; [.15D4.0020.0002.0061][.0000.0037.0002.0306][.0000.004E.0002.0303] # LATIN SMALL LETTER A WITH BREVE AND TILDE 1EB4 ; [.15D4.0020.0008.0041][.0000.0037.0002.0306][.0000.004E.0002.0303] # LATIN CAPITAL LETTER A WITH BREVE AND TILDE 1EB3 ; [.15D4.0020.0002.0061][.0000.0037.0002.0306][.0000.0064.0002.0309] # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE 1EB2 ; [.15D4.0020.0008.0041][.0000.0037.0002.0306][.0000.0064.0002.0309] # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE 00E2 ; [.15D4.0020.0002.0061][.0000.003C.0002.0302] # LATIN SMALL LETTER A WITH CIRCUMFLEX 00C2 ; [.15D4.0020.0008.0041][.0000.003C.0002.0302] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX 1EA5 ; [.15D4.0020.0002.0061][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE 1EA4 ; [.15D4.0020.0008.0041][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE 1EA7 ; [.15D4.0020.0002.0061][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE 1EA6 ; [.15D4.0020.0008.0041][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE 1EAB ; [.15D4.0020.0002.0061][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE 1EAA ; [.15D4.0020.0008.0041][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE 1EA9 ; [.15D4.0020.0002.0061][.0000.003C.0002.0302][.0000.0064.0002.0309] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE 1EA8 ; [.15D4.0020.0008.0041][.0000.003C.0002.0302][.0000.0064.0002.0309] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE 01CE ; [.15D4.0020.0002.0061][.0000.0041.0002.030C] # LATIN SMALL LETTER A WITH CARON 01CD ; [.15D4.0020.0008.0041][.0000.0041.0002.030C] # LATIN CAPITAL LETTER A WITH CARON 00E5 ; [.15D4.0020.0002.0061][.0000.0043.0002.030A] # LATIN SMALL LETTER A WITH RING ABOVE 00C5 ; [.15D4.0020.0008.0041][.0000.0043.0002.030A] # LATIN CAPITAL LETTER A WITH RING ABOVE 212B ; [.15D4.0020.0008.0041][.0000.0043.0002.030A] # ANGSTROM SIGN 01FB ; [.15D4.0020.0002.0061][.0000.0043.0002.030A][.0000.0032.0002.0301] # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE 01FA ; [.15D4.0020.0008.0041][.0000.0043.0002.030A][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE 00E4 ; [.15D4.0020.0002.0061][.0000.0047.0002.0308] # LATIN SMALL LETTER A WITH DIAERESIS 00C4 ; [.15D4.0020.0008.0041][.0000.0047.0002.0308] # LATIN CAPITAL LETTER A WITH DIAERESIS 01DF ; [.15D4.0020.0002.0061][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON 01DE ; [.15D4.0020.0008.0041][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON 00E3 ; [.15D4.0020.0002.0061][.0000.004E.0002.0303] # LATIN SMALL LETTER A WITH TILDE 00C3 ; [.15D4.0020.0008.0041][.0000.004E.0002.0303] # LATIN CAPITAL LETTER A WITH TILDE 0227 ; [.15D4.0020.0002.0061][.0000.0052.0002.0307] # LATIN SMALL LETTER A WITH DOT ABOVE 0226 ; [.15D4.0020.0008.0041][.0000.0052.0002.0307] # LATIN CAPITAL LETTER A WITH DOT ABOVE 01E1 ; [.15D4.0020.0002.0061][.0000.0052.0002.0307][.0000.005B.0002.0304] # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON 01E0 ; [.15D4.0020.0008.0041][.0000.0052.0002.0307][.0000.005B.0002.0304] # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON 0105 ; [.15D4.0020.0002.0061][.0000.0059.0002.0328] # LATIN SMALL LETTER A WITH OGONEK 0104 ; [.15D4.0020.0008.0041][.0000.0059.0002.0328] # LATIN CAPITAL LETTER A WITH OGONEK 0101 ; [.15D4.0020.0002.0061][.0000.005B.0002.0304] # LATIN SMALL LETTER A WITH MACRON 0100 ; [.15D4.0020.0008.0041][.0000.005B.0002.0304] # LATIN CAPITAL LETTER A WITH MACRON 1EA3 ; [.15D4.0020.0002.0061][.0000.0064.0002.0309] # LATIN SMALL LETTER A WITH HOOK ABOVE 1EA2 ; [.15D4.0020.0008.0041][.0000.0064.0002.0309] # LATIN CAPITAL LETTER A WITH HOOK ABOVE 0201 ; [.15D4.0020.0002.0061][.0000.0065.0002.030F] # LATIN SMALL LETTER A WITH DOUBLE GRAVE 0200 ; [.15D4.0020.0008.0041][.0000.0065.0002.030F] # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE 0203 ; [.15D4.0020.0002.0061][.0000.0067.0002.0311] # LATIN SMALL LETTER A WITH INVERTED BREVE 0202 ; [.15D4.0020.0008.0041][.0000.0067.0002.0311] # LATIN CAPITAL LETTER A WITH INVERTED BREVE 1EA1 ; [.15D4.0020.0002.0061][.0000.0070.0002.0323] # LATIN SMALL LETTER A WITH DOT BELOW 1EA0 ; [.15D4.0020.0008.0041][.0000.0070.0002.0323] # LATIN CAPITAL LETTER A WITH DOT BELOW 1EB7 ; [.15D4.0020.0002.0061][.0000.0070.0002.0323][.0000.0037.0002.0306] # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW 1EB6 ; [.15D4.0020.0008.0041][.0000.0070.0002.0323][.0000.0037.0002.0306] # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW 1EAD ; [.15D4.0020.0002.0061][.0000.0070.0002.0323][.0000.003C.0002.0302] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW 1EAC ; [.15D4.0020.0008.0041][.0000.0070.0002.0323][.0000.003C.0002.0302] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW 1E01 ; [.15D4.0020.0002.0061][.0000.0076.0002.0325] # LATIN SMALL LETTER A WITH RING BELOW 1E00 ; [.15D4.0020.0008.0041][.0000.0076.0002.0325] # LATIN CAPITAL LETTER A WITH RING BELOW 1DD3 ; [.15D4.0020.0004.1DD3][.0000.0139.0004.1DD3] # COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE A733 ; [.15D4.0020.0004.A733][.15D4.0020.0004.A733] # LATIN SMALL LETTER AA A732 ; [.15D4.0020.000A.A732][.15D4.0020.000A.A732] # LATIN CAPITAL LETTER AA 1F18E ; [.15D4.0020.001D.1F18E][.15EA.0020.001D.1F18E] # NEGATIVE SQUARED AB 2100 ; [.15D4.0020.0004.2100][*0372.0020.0004.2100][.1602.0020.001F.2100] # ACCOUNT OF 00E6 ; [.15D4.0020.0004.00E6][.0000.0139.0004.00E6][.1631.0020.001F.00E6] # LATIN SMALL LETTER AE 1DD4 ; [.15D4.0020.0004.1DD4][.0000.0139.0004.1DD4][.1631.0020.001F.1DD4] # COMBINING LATIN SMALL LETTER AE 00C6 ; [.15D4.0020.000A.00C6][.0000.0139.0004.00C6][.1631.0020.001F.00C6] # LATIN CAPITAL LETTER AE 1D2D ; [.15D4.0020.0014.1D2D][.0000.0139.0014.1D2D][.1631.0020.001F.1D2D] # MODIFIER LETTER CAPITAL AE 01FD ; [.15D4.0020.0004.01FD][.0000.0139.0004.01FD][.1631.0020.001F.01FD][.0000.0032.0002.01FD] # LATIN SMALL LETTER AE WITH ACUTE 01FC ; [.15D4.0020.000A.01FC][.0000.0139.0004.01FC][.1631.0020.001F.01FC][.0000.0032.0002.01FC] # LATIN CAPITAL LETTER AE WITH ACUTE 01E3 ; [.15D4.0020.0004.01E3][.0000.0139.0004.01E3][.1631.0020.001F.01E3][.0000.005B.0002.01E3] # LATIN SMALL LETTER AE WITH MACRON 01E2 ; [.15D4.0020.000A.01E2][.0000.0139.0004.01E2][.1631.0020.001F.01E2][.0000.005B.0002.01E2] # LATIN CAPITAL LETTER AE WITH MACRON 33C2 ; [.15D4.0020.001C.33C2][*0273.0020.001C.33C2][.1726.0020.001F.33C2][*0273.0020.001F.33C2] # SQUARE AM 33DF ; [.15D4.0020.001D.33DF][*05AB.0020.001C.33DF][.1726.0020.001F.33DF] # SQUARE A OVER M 1DD5 ; [.15D4.0020.0004.1DD5][.1756.0020.0004.1DD5] # COMBINING LATIN SMALL LETTER AO A735 ; [.15D4.0020.0004.A735][.1756.0020.0004.A735] # LATIN SMALL LETTER AO A734 ; [.15D4.0020.000A.A734][.1756.0020.000A.A734] # LATIN CAPITAL LETTER AO 2101 ; [.15D4.0020.0004.2101][*0372.0020.0004.2101][.17D8.0020.001F.2101] # ADDRESSED TO THE SUBJECT 214D ; [.15D4.0020.000A.214D][*0372.0020.0004.214D][.17D8.0020.001F.214D] # AKTIESELSKAB A737 ; [.15D4.0020.0004.A737][.181B.0020.0004.A737] # LATIN SMALL LETTER AU A736 ; [.15D4.0020.000A.A736][.181B.0020.000A.A736] # LATIN CAPITAL LETTER AU 3373 ; [.15D4.0020.001D.3373][.181B.0020.001D.3373] # SQUARE AU 1DD6 ; [.15D4.0020.0004.1DD6][.1844.0020.0004.1DD6] # COMBINING LATIN SMALL LETTER AV A739 ; [.15D4.0020.0004.A739][.1844.0020.0004.A739] # LATIN SMALL LETTER AV A738 ; [.15D4.0020.000A.A738][.1844.0020.000A.A738] # LATIN CAPITAL LETTER AV A73B ; [.15D4.0020.0004.A73B][.0000.0139.0004.A73B][.1844.0020.001F.A73B] # LATIN SMALL LETTER AV WITH HORIZONTAL BAR A73A ; [.15D4.0020.000A.A73A][.0000.0139.0004.A73A][.1844.0020.001F.A73A] # LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR A73D ; [.15D4.0020.0004.A73D][.1865.0020.0004.A73D] # LATIN SMALL LETTER AY A73C ; [.15D4.0020.000A.A73C][.1865.0020.000A.A73C] # LATIN CAPITAL LETTER AY 1E9A ; [.15D4.0020.0004.1E9A][.18D6.0020.0004.1E9A] # LATIN SMALL LETTER A WITH RIGHT HALF RING 1D00 ; [.15D8.0020.0002.1D00] # LATIN LETTER SMALL CAPITAL A 2C65 ; [.15D9.0020.0002.2C65] # LATIN SMALL LETTER A WITH STROKE 023A ; [.15D9.0020.0008.023A] # LATIN CAPITAL LETTER A WITH STROKE 1D8F ; [.15DA.0020.0002.1D8F] # LATIN SMALL LETTER A WITH RETROFLEX HOOK 1D01 ; [.15DB.0020.0002.1D01] # LATIN LETTER SMALL CAPITAL AE 1D02 ; [.15DC.0020.0002.1D02] # LATIN SMALL LETTER TURNED AE 1D46 ; [.15DC.0020.0014.1D46] # MODIFIER LETTER SMALL TURNED AE 0250 ; [.15DD.0020.0002.0250] # LATIN SMALL LETTER TURNED A 2C6F ; [.15DD.0020.0008.2C6F] # LATIN CAPITAL LETTER TURNED A 1D44 ; [.15DD.0020.0014.1D44] # MODIFIER LETTER SMALL TURNED A 0251 ; [.15E1.0020.0002.0251] # LATIN SMALL LETTER ALPHA 2C6D ; [.15E1.0020.0008.2C6D] # LATIN CAPITAL LETTER ALPHA 1D45 ; [.15E1.0020.0014.1D45] # MODIFIER LETTER SMALL ALPHA 1D90 ; [.15E5.0020.0002.1D90] # LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK 0252 ; [.15E6.0020.0002.0252] # LATIN SMALL LETTER TURNED ALPHA 2C70 ; [.15E6.0020.0008.2C70] # LATIN CAPITAL LETTER TURNED ALPHA 1D9B ; [.15E6.0020.0014.1D9B] # MODIFIER LETTER SMALL TURNED ALPHA 0062 ; [.15EA.0020.0002.0062] # LATIN SMALL LETTER B FF42 ; [.15EA.0020.0003.FF42] # FULLWIDTH LATIN SMALL LETTER B 249D ; [*02FB.0020.0004.249D][.15EA.0020.0004.249D][*02FC.0020.001F.249D] # PARENTHESIZED LATIN SMALL LETTER B 1D41B ; [.15EA.0020.0005.1D41B] # MATHEMATICAL BOLD SMALL B 1D44F ; [.15EA.0020.0005.1D44F] # MATHEMATICAL ITALIC SMALL B 1D483 ; [.15EA.0020.0005.1D483] # MATHEMATICAL BOLD ITALIC SMALL B 1D4B7 ; [.15EA.0020.0005.1D4B7] # MATHEMATICAL SCRIPT SMALL B 1D4EB ; [.15EA.0020.0005.1D4EB] # MATHEMATICAL BOLD SCRIPT SMALL B 1D51F ; [.15EA.0020.0005.1D51F] # MATHEMATICAL FRAKTUR SMALL B 1D553 ; [.15EA.0020.0005.1D553] # MATHEMATICAL DOUBLE-STRUCK SMALL B 1D587 ; [.15EA.0020.0005.1D587] # MATHEMATICAL BOLD FRAKTUR SMALL B 1D5BB ; [.15EA.0020.0005.1D5BB] # MATHEMATICAL SANS-SERIF SMALL B 1D5EF ; [.15EA.0020.0005.1D5EF] # MATHEMATICAL SANS-SERIF BOLD SMALL B 1D623 ; [.15EA.0020.0005.1D623] # MATHEMATICAL SANS-SERIF ITALIC SMALL B 1D657 ; [.15EA.0020.0005.1D657] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B 1D68B ; [.15EA.0020.0005.1D68B] # MATHEMATICAL MONOSPACE SMALL B 24D1 ; [.15EA.0020.0006.24D1] # CIRCLED LATIN SMALL LETTER B 0042 ; [.15EA.0020.0008.0042] # LATIN CAPITAL LETTER B FF22 ; [.15EA.0020.0009.FF22] # FULLWIDTH LATIN CAPITAL LETTER B 1F111 ; [*02FB.0020.0004.1F111][.15EA.0020.000A.1F111][*02FC.0020.001F.1F111] # PARENTHESIZED LATIN CAPITAL LETTER B 1F1E7 ; [.15EA.0020.000A.1F1E7] # REGIONAL INDICATOR SYMBOL LETTER B 212C ; [.15EA.0020.000B.212C] # SCRIPT CAPITAL B 1D401 ; [.15EA.0020.000B.1D401] # MATHEMATICAL BOLD CAPITAL B 1D435 ; [.15EA.0020.000B.1D435] # MATHEMATICAL ITALIC CAPITAL B 1D469 ; [.15EA.0020.000B.1D469] # MATHEMATICAL BOLD ITALIC CAPITAL B 1D4D1 ; [.15EA.0020.000B.1D4D1] # MATHEMATICAL BOLD SCRIPT CAPITAL B 1D505 ; [.15EA.0020.000B.1D505] # MATHEMATICAL FRAKTUR CAPITAL B 1D539 ; [.15EA.0020.000B.1D539] # MATHEMATICAL DOUBLE-STRUCK CAPITAL B 1D56D ; [.15EA.0020.000B.1D56D] # MATHEMATICAL BOLD FRAKTUR CAPITAL B 1D5A1 ; [.15EA.0020.000B.1D5A1] # MATHEMATICAL SANS-SERIF CAPITAL B 1D5D5 ; [.15EA.0020.000B.1D5D5] # MATHEMATICAL SANS-SERIF BOLD CAPITAL B 1D609 ; [.15EA.0020.000B.1D609] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL B 1D63D ; [.15EA.0020.000B.1D63D] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B 1D671 ; [.15EA.0020.000B.1D671] # MATHEMATICAL MONOSPACE CAPITAL B 24B7 ; [.15EA.0020.000C.24B7] # CIRCLED LATIN CAPITAL LETTER B 1F151 ; [.15EA.0020.000C.1F151] # NEGATIVE CIRCLED LATIN CAPITAL LETTER B 1D47 ; [.15EA.0020.0014.1D47] # MODIFIER LETTER SMALL B 1D2E ; [.15EA.0020.001D.1D2E] # MODIFIER LETTER CAPITAL B 1F131 ; [.15EA.0020.001D.1F131] # SQUARED LATIN CAPITAL LETTER B 1F171 ; [.15EA.0020.001D.1F171] # NEGATIVE SQUARED LATIN CAPITAL LETTER B 1E03 ; [.15EA.0020.0002.0062][.0000.0052.0002.0307] # LATIN SMALL LETTER B WITH DOT ABOVE 1E02 ; [.15EA.0020.0008.0042][.0000.0052.0002.0307] # LATIN CAPITAL LETTER B WITH DOT ABOVE 1E05 ; [.15EA.0020.0002.0062][.0000.0070.0002.0323] # LATIN SMALL LETTER B WITH DOT BELOW 1E04 ; [.15EA.0020.0008.0042][.0000.0070.0002.0323] # LATIN CAPITAL LETTER B WITH DOT BELOW 1E07 ; [.15EA.0020.0002.0062][.0000.007B.0002.0331] # LATIN SMALL LETTER B WITH LINE BELOW 1E06 ; [.15EA.0020.0008.0042][.0000.007B.0002.0331] # LATIN CAPITAL LETTER B WITH LINE BELOW 3374 ; [.15EA.0020.001C.3374][.15D4.0020.001C.3374][.17A2.0020.001F.3374] # SQUARE BAR 33C3 ; [.15EA.0020.001D.33C3][.1790.0020.001C.33C3] # SQUARE BQ 0299 ; [.15EE.0020.0002.0299] # LATIN LETTER SMALL CAPITAL B 0180 ; [.15F2.0020.0002.0180] # LATIN SMALL LETTER B WITH STROKE 0243 ; [.15F2.0020.0008.0243] # LATIN CAPITAL LETTER B WITH STROKE 1D2F ; [.15F6.0020.0002.1D2F] # MODIFIER LETTER CAPITAL BARRED B 1D03 ; [.15F7.0020.0002.1D03] # LATIN LETTER SMALL CAPITAL BARRED B 1D6C ; [.15F8.0020.0002.1D6C] # LATIN SMALL LETTER B WITH MIDDLE TILDE 1D80 ; [.15F9.0020.0002.1D80] # LATIN SMALL LETTER B WITH PALATAL HOOK 0253 ; [.15FA.0020.0002.0253] # LATIN SMALL LETTER B WITH HOOK 0181 ; [.15FA.0020.0008.0181] # LATIN CAPITAL LETTER B WITH HOOK 0183 ; [.15FE.0020.0002.0183] # LATIN SMALL LETTER B WITH TOPBAR 0182 ; [.15FE.0020.0008.0182] # LATIN CAPITAL LETTER B WITH TOPBAR 0063 ; [.1602.0020.0002.0063] # LATIN SMALL LETTER C FF43 ; [.1602.0020.0003.FF43] # FULLWIDTH LATIN SMALL LETTER C 0368 ; [.1602.0020.0004.0368] # COMBINING LATIN SMALL LETTER C 217D ; [.1602.0020.0004.217D] # SMALL ROMAN NUMERAL ONE HUNDRED 249E ; [*02FB.0020.0004.249E][.1602.0020.0004.249E][*02FC.0020.001F.249E] # PARENTHESIZED LATIN SMALL LETTER C 1D41C ; [.1602.0020.0005.1D41C] # MATHEMATICAL BOLD SMALL C 1D450 ; [.1602.0020.0005.1D450] # MATHEMATICAL ITALIC SMALL C 1D484 ; [.1602.0020.0005.1D484] # MATHEMATICAL BOLD ITALIC SMALL C 1D4B8 ; [.1602.0020.0005.1D4B8] # MATHEMATICAL SCRIPT SMALL C 1D4EC ; [.1602.0020.0005.1D4EC] # MATHEMATICAL BOLD SCRIPT SMALL C 1D520 ; [.1602.0020.0005.1D520] # MATHEMATICAL FRAKTUR SMALL C 1D554 ; [.1602.0020.0005.1D554] # MATHEMATICAL DOUBLE-STRUCK SMALL C 1D588 ; [.1602.0020.0005.1D588] # MATHEMATICAL BOLD FRAKTUR SMALL C 1D5BC ; [.1602.0020.0005.1D5BC] # MATHEMATICAL SANS-SERIF SMALL C 1D5F0 ; [.1602.0020.0005.1D5F0] # MATHEMATICAL SANS-SERIF BOLD SMALL C 1D624 ; [.1602.0020.0005.1D624] # MATHEMATICAL SANS-SERIF ITALIC SMALL C 1D658 ; [.1602.0020.0005.1D658] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C 1D68C ; [.1602.0020.0005.1D68C] # MATHEMATICAL MONOSPACE SMALL C 24D2 ; [.1602.0020.0006.24D2] # CIRCLED LATIN SMALL LETTER C 0043 ; [.1602.0020.0008.0043] # LATIN CAPITAL LETTER C FF23 ; [.1602.0020.0009.FF23] # FULLWIDTH LATIN CAPITAL LETTER C 2103 ; [*0482.0020.0004.2103][.1602.0020.000A.2103] # DEGREE CELSIUS 216D ; [.1602.0020.000A.216D] # ROMAN NUMERAL ONE HUNDRED 1F112 ; [*02FB.0020.0004.1F112][.1602.0020.000A.1F112][*02FC.0020.001F.1F112] # PARENTHESIZED LATIN CAPITAL LETTER C 1F1E8 ; [.1602.0020.000A.1F1E8] # REGIONAL INDICATOR SYMBOL LETTER C 2102 ; [.1602.0020.000B.2102] # DOUBLE-STRUCK CAPITAL C 212D ; [.1602.0020.000B.212D] # BLACK-LETTER CAPITAL C 1D402 ; [.1602.0020.000B.1D402] # MATHEMATICAL BOLD CAPITAL C 1D436 ; [.1602.0020.000B.1D436] # MATHEMATICAL ITALIC CAPITAL C 1D46A ; [.1602.0020.000B.1D46A] # MATHEMATICAL BOLD ITALIC CAPITAL C 1D49E ; [.1602.0020.000B.1D49E] # MATHEMATICAL SCRIPT CAPITAL C 1D4D2 ; [.1602.0020.000B.1D4D2] # MATHEMATICAL BOLD SCRIPT CAPITAL C 1D56E ; [.1602.0020.000B.1D56E] # MATHEMATICAL BOLD FRAKTUR CAPITAL C 1D5A2 ; [.1602.0020.000B.1D5A2] # MATHEMATICAL SANS-SERIF CAPITAL C 1D5D6 ; [.1602.0020.000B.1D5D6] # MATHEMATICAL SANS-SERIF BOLD CAPITAL C 1D60A ; [.1602.0020.000B.1D60A] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL C 1D63E ; [.1602.0020.000B.1D63E] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C 1D672 ; [.1602.0020.000B.1D672] # MATHEMATICAL MONOSPACE CAPITAL C 24B8 ; [.1602.0020.000C.24B8] # CIRCLED LATIN CAPITAL LETTER C 1F12B ; [.1602.0020.000C.1F12B] # CIRCLED ITALIC LATIN CAPITAL LETTER C 1F152 ; [.1602.0020.000C.1F152] # NEGATIVE CIRCLED LATIN CAPITAL LETTER C 1D9C ; [.1602.0020.0014.1D9C] # MODIFIER LETTER SMALL C 1F132 ; [.1602.0020.001D.1F132] # SQUARED LATIN CAPITAL LETTER C 1F172 ; [.1602.0020.001D.1F172] # NEGATIVE SQUARED LATIN CAPITAL LETTER C 0107 ; [.1602.0020.0002.0063][.0000.0032.0002.0301] # LATIN SMALL LETTER C WITH ACUTE 0106 ; [.1602.0020.0008.0043][.0000.0032.0002.0301] # LATIN CAPITAL LETTER C WITH ACUTE 0109 ; [.1602.0020.0002.0063][.0000.003C.0002.0302] # LATIN SMALL LETTER C WITH CIRCUMFLEX 0108 ; [.1602.0020.0008.0043][.0000.003C.0002.0302] # LATIN CAPITAL LETTER C WITH CIRCUMFLEX 010D ; [.1602.0020.0002.0063][.0000.0041.0002.030C] # LATIN SMALL LETTER C WITH CARON 010C ; [.1602.0020.0008.0043][.0000.0041.0002.030C] # LATIN CAPITAL LETTER C WITH CARON 010B ; [.1602.0020.0002.0063][.0000.0052.0002.0307] # LATIN SMALL LETTER C WITH DOT ABOVE 010A ; [.1602.0020.0008.0043][.0000.0052.0002.0307] # LATIN CAPITAL LETTER C WITH DOT ABOVE 00E7 ; [.1602.0020.0002.0063][.0000.0056.0002.0327] # LATIN SMALL LETTER C WITH CEDILLA 1DD7 ; [.1602.0020.0004.1DD7][.0000.0056.0004.1DD7] # COMBINING LATIN SMALL LETTER C CEDILLA 00C7 ; [.1602.0020.0008.0043][.0000.0056.0002.0327] # LATIN CAPITAL LETTER C WITH CEDILLA 1E09 ; [.1602.0020.0002.0063][.0000.0056.0002.0327][.0000.0032.0002.0301] # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE 1E08 ; [.1602.0020.0008.0043][.0000.0056.0002.0327][.0000.0032.0002.0301] # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE 3388 ; [.1602.0020.001C.3388][.15D4.0020.001C.3388][.16F6.0020.001F.3388] # SQUARE CAL 33C4 ; [.1602.0020.001C.33C4][.1602.0020.001C.33C4] # SQUARE CC 1F12D ; [.1602.0020.000C.1F12D][.1616.0020.000C.1F12D] # CIRCLED CD 33C5 ; [.1602.0020.001C.33C5][.1616.0020.001C.33C5] # SQUARE CD 33C6 ; [.1602.0020.001D.33C6][*05AB.0020.001C.33C6][.16E4.0020.001F.33C6][.1676.0020.001F.33C6] # SQUARE C OVER KG 1F191 ; [.1602.0020.001D.1F191][.16F6.0020.001D.1F191] # SQUARED CL 339D ; [.1602.0020.001C.339D][.1726.0020.001C.339D] # SQUARE CM 33A0 ; [.1602.0020.001C.33A0][.1726.0020.001C.33A0][.15CC.0020.001F.33A0] # SQUARE CM SQUARED 33A4 ; [.1602.0020.001C.33A4][.1726.0020.001C.33A4][.15CD.0020.001F.33A4] # SQUARE CM CUBED 2105 ; [.1602.0020.0004.2105][*0372.0020.0004.2105][.1756.0020.001F.2105] # CARE OF 33C7 ; [.1602.0020.001D.33C7][.1756.0020.001C.33C7][*0273.0020.001F.33C7] # SQUARE CO 1F192 ; [.1602.0020.001D.1F192][.1756.0020.001D.1F192][.1756.0020.001F.1F192][.16F6.0020.001F.1F192] # SQUARED COOL 2106 ; [.1602.0020.0004.2106][*0372.0020.0004.2106][.181B.0020.001F.2106] # CADA UNA 1D04 ; [.1606.0020.0002.1D04] # LATIN LETTER SMALL CAPITAL C 023C ; [.1607.0020.0002.023C] # LATIN SMALL LETTER C WITH STROKE 023B ; [.1607.0020.0008.023B] # LATIN CAPITAL LETTER C WITH STROKE A793 ; [.160B.0020.0002.A793] # LATIN SMALL LETTER C WITH BAR A792 ; [.160B.0020.0008.A792] # LATIN CAPITAL LETTER C WITH BAR 0188 ; [.160C.0020.0002.0188] # LATIN SMALL LETTER C WITH HOOK 0187 ; [.160C.0020.0008.0187] # LATIN CAPITAL LETTER C WITH HOOK 0255 ; [.1610.0020.0002.0255] # LATIN SMALL LETTER C WITH CURL 1D9D ; [.1610.0020.0014.1D9D] # MODIFIER LETTER SMALL C WITH CURL 2184 ; [.1614.0020.0002.2184] # LATIN SMALL LETTER REVERSED C 2183 ; [.1614.0020.0008.2183] # ROMAN NUMERAL REVERSED ONE HUNDRED A73F ; [.1615.0020.0002.A73F] # LATIN SMALL LETTER REVERSED C WITH DOT A73E ; [.1615.0020.0008.A73E] # LATIN CAPITAL LETTER REVERSED C WITH DOT 0064 ; [.1616.0020.0002.0064] # LATIN SMALL LETTER D FF44 ; [.1616.0020.0003.FF44] # FULLWIDTH LATIN SMALL LETTER D 0369 ; [.1616.0020.0004.0369] # COMBINING LATIN SMALL LETTER D 217E ; [.1616.0020.0004.217E] # SMALL ROMAN NUMERAL FIVE HUNDRED 249F ; [*02FB.0020.0004.249F][.1616.0020.0004.249F][*02FC.0020.001F.249F] # PARENTHESIZED LATIN SMALL LETTER D 2146 ; [.1616.0020.0005.2146] # DOUBLE-STRUCK ITALIC SMALL D 1D41D ; [.1616.0020.0005.1D41D] # MATHEMATICAL BOLD SMALL D 1D451 ; [.1616.0020.0005.1D451] # MATHEMATICAL ITALIC SMALL D 1D485 ; [.1616.0020.0005.1D485] # MATHEMATICAL BOLD ITALIC SMALL D 1D4B9 ; [.1616.0020.0005.1D4B9] # MATHEMATICAL SCRIPT SMALL D 1D4ED ; [.1616.0020.0005.1D4ED] # MATHEMATICAL BOLD SCRIPT SMALL D 1D521 ; [.1616.0020.0005.1D521] # MATHEMATICAL FRAKTUR SMALL D 1D555 ; [.1616.0020.0005.1D555] # MATHEMATICAL DOUBLE-STRUCK SMALL D 1D589 ; [.1616.0020.0005.1D589] # MATHEMATICAL BOLD FRAKTUR SMALL D 1D5BD ; [.1616.0020.0005.1D5BD] # MATHEMATICAL SANS-SERIF SMALL D 1D5F1 ; [.1616.0020.0005.1D5F1] # MATHEMATICAL SANS-SERIF BOLD SMALL D 1D625 ; [.1616.0020.0005.1D625] # MATHEMATICAL SANS-SERIF ITALIC SMALL D 1D659 ; [.1616.0020.0005.1D659] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D 1D68D ; [.1616.0020.0005.1D68D] # MATHEMATICAL MONOSPACE SMALL D 24D3 ; [.1616.0020.0006.24D3] # CIRCLED LATIN SMALL LETTER D 0044 ; [.1616.0020.0008.0044] # LATIN CAPITAL LETTER D FF24 ; [.1616.0020.0009.FF24] # FULLWIDTH LATIN CAPITAL LETTER D 216E ; [.1616.0020.000A.216E] # ROMAN NUMERAL FIVE HUNDRED 1F113 ; [*02FB.0020.0004.1F113][.1616.0020.000A.1F113][*02FC.0020.001F.1F113] # PARENTHESIZED LATIN CAPITAL LETTER D 1F1E9 ; [.1616.0020.000A.1F1E9] # REGIONAL INDICATOR SYMBOL LETTER D 2145 ; [.1616.0020.000B.2145] # DOUBLE-STRUCK ITALIC CAPITAL D 1D403 ; [.1616.0020.000B.1D403] # MATHEMATICAL BOLD CAPITAL D 1D437 ; [.1616.0020.000B.1D437] # MATHEMATICAL ITALIC CAPITAL D 1D46B ; [.1616.0020.000B.1D46B] # MATHEMATICAL BOLD ITALIC CAPITAL D 1D49F ; [.1616.0020.000B.1D49F] # MATHEMATICAL SCRIPT CAPITAL D 1D4D3 ; [.1616.0020.000B.1D4D3] # MATHEMATICAL BOLD SCRIPT CAPITAL D 1D507 ; [.1616.0020.000B.1D507] # MATHEMATICAL FRAKTUR CAPITAL D 1D53B ; [.1616.0020.000B.1D53B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL D 1D56F ; [.1616.0020.000B.1D56F] # MATHEMATICAL BOLD FRAKTUR CAPITAL D 1D5A3 ; [.1616.0020.000B.1D5A3] # MATHEMATICAL SANS-SERIF CAPITAL D 1D5D7 ; [.1616.0020.000B.1D5D7] # MATHEMATICAL SANS-SERIF BOLD CAPITAL D 1D60B ; [.1616.0020.000B.1D60B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL D 1D63F ; [.1616.0020.000B.1D63F] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D 1D673 ; [.1616.0020.000B.1D673] # MATHEMATICAL MONOSPACE CAPITAL D 24B9 ; [.1616.0020.000C.24B9] # CIRCLED LATIN CAPITAL LETTER D 1F153 ; [.1616.0020.000C.1F153] # NEGATIVE CIRCLED LATIN CAPITAL LETTER D 1D48 ; [.1616.0020.0014.1D48] # MODIFIER LETTER SMALL D 1D30 ; [.1616.0020.001D.1D30] # MODIFIER LETTER CAPITAL D 1F133 ; [.1616.0020.001D.1F133] # SQUARED LATIN CAPITAL LETTER D 1F173 ; [.1616.0020.001D.1F173] # NEGATIVE SQUARED LATIN CAPITAL LETTER D 010F ; [.1616.0020.0002.0064][.0000.0041.0002.030C] # LATIN SMALL LETTER D WITH CARON 010E ; [.1616.0020.0008.0044][.0000.0041.0002.030C] # LATIN CAPITAL LETTER D WITH CARON 1E0B ; [.1616.0020.0002.0064][.0000.0052.0002.0307] # LATIN SMALL LETTER D WITH DOT ABOVE 1E0A ; [.1616.0020.0008.0044][.0000.0052.0002.0307] # LATIN CAPITAL LETTER D WITH DOT ABOVE 1E11 ; [.1616.0020.0002.0064][.0000.0056.0002.0327] # LATIN SMALL LETTER D WITH CEDILLA 1E10 ; [.1616.0020.0008.0044][.0000.0056.0002.0327] # LATIN CAPITAL LETTER D WITH CEDILLA 1E0D ; [.1616.0020.0002.0064][.0000.0070.0002.0323] # LATIN SMALL LETTER D WITH DOT BELOW 1E0C ; [.1616.0020.0008.0044][.0000.0070.0002.0323] # LATIN CAPITAL LETTER D WITH DOT BELOW 1E13 ; [.1616.0020.0002.0064][.0000.0078.0002.032D] # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW 1E12 ; [.1616.0020.0008.0044][.0000.0078.0002.032D] # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW 1E0F ; [.1616.0020.0002.0064][.0000.007B.0002.0331] # LATIN SMALL LETTER D WITH LINE BELOW 1E0E ; [.1616.0020.0008.0044][.0000.007B.0002.0331] # LATIN CAPITAL LETTER D WITH LINE BELOW 0111 ; [.1616.0020.0002.0064][.0000.007D.0002.0335] # LATIN SMALL LETTER D WITH STROKE 0110 ; [.1616.0020.0008.0044][.0000.007D.0002.0335] # LATIN CAPITAL LETTER D WITH STROKE 00F0 ; [.1616.0020.0004.00F0][.0000.0139.0004.00F0] # LATIN SMALL LETTER ETH 1DD9 ; [.1616.0020.0004.1DD9][.0000.0139.0004.1DD9] # COMBINING LATIN SMALL LETTER ETH 00D0 ; [.1616.0020.000A.00D0][.0000.0139.0004.00D0] # LATIN CAPITAL LETTER ETH 1D9E ; [.1616.0020.0014.1D9E][.0000.0139.0014.1D9E] # MODIFIER LETTER SMALL ETH 1DD8 ; [.1616.0020.0004.1DD8][.0000.013A.0004.1DD8] # COMBINING LATIN SMALL LETTER INSULAR D A77A ; [.1616.0020.0004.A77A][.0000.013A.0004.A77A] # LATIN SMALL LETTER INSULAR D A779 ; [.1616.0020.000A.A779][.0000.013A.0004.A779] # LATIN CAPITAL LETTER INSULAR D 3372 ; [.1616.0020.001C.3372][.15D4.0020.001C.3372] # SQUARE DA 0238 ; [.1616.0020.0004.0238][.15EA.0020.0004.0238] # LATIN SMALL LETTER DB DIGRAPH 33C8 ; [.1616.0020.001C.33C8][.15EA.0020.001D.33C8] # SQUARE DB 1F190 ; [.1616.0020.001D.1F190][.16CB.0020.001D.1F190] # SQUARE DJ 3397 ; [.1616.0020.001C.3397][.16F6.0020.001C.3397] # SQUARE DL 3377 ; [.1616.0020.001C.3377][.1726.0020.001C.3377] # SQUARE DM 3378 ; [.1616.0020.001C.3378][.1726.0020.001C.3378][.15CC.0020.001F.3378] # SQUARE DM SQUARED 3379 ; [.1616.0020.001C.3379][.1726.0020.001C.3379][.15CD.0020.001F.3379] # SQUARE DM CUBED 01F3 ; [.1616.0020.0004.01F3][.187A.0020.0004.01F3] # LATIN SMALL LETTER DZ 02A3 ; [.1616.0020.0004.02A3][.187A.0020.0004.02A3] # LATIN SMALL LETTER DZ DIGRAPH 01F2 ; [.1616.0020.000A.01F2][.187A.0020.0004.01F2] # LATIN CAPITAL LETTER D WITH SMALL LETTER Z 01F1 ; [.1616.0020.000A.01F1][.187A.0020.000A.01F1] # LATIN CAPITAL LETTER DZ 01C6 ; [.1616.0020.0004.01C6][.187A.0020.0004.01C6][.0000.0041.001F.01C6] # LATIN SMALL LETTER DZ WITH CARON 01C5 ; [.1616.0020.000A.01C5][.187A.0020.0004.01C5][.0000.0041.001F.01C5] # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON 01C4 ; [.1616.0020.000A.01C4][.187A.0020.000A.01C4][.0000.0041.001F.01C4] # LATIN CAPITAL LETTER DZ WITH CARON 02A5 ; [.1616.0020.0004.02A5][.188D.0020.0004.02A5] # LATIN SMALL LETTER DZ DIGRAPH WITH CURL 02A4 ; [.1616.0020.0004.02A4][.1897.0020.0004.02A4] # LATIN SMALL LETTER DEZH DIGRAPH 1D05 ; [.161A.0020.0002.1D05] # LATIN LETTER SMALL CAPITAL D 1D06 ; [.161B.0020.0002.1D06] # LATIN LETTER SMALL CAPITAL ETH 1D6D ; [.161C.0020.0002.1D6D] # LATIN SMALL LETTER D WITH MIDDLE TILDE 1D81 ; [.161D.0020.0002.1D81] # LATIN SMALL LETTER D WITH PALATAL HOOK 0256 ; [.161E.0020.0002.0256] # LATIN SMALL LETTER D WITH TAIL 0189 ; [.161E.0020.0008.0189] # LATIN CAPITAL LETTER AFRICAN D 0257 ; [.1622.0020.0002.0257] # LATIN SMALL LETTER D WITH HOOK 018A ; [.1622.0020.0008.018A] # LATIN CAPITAL LETTER D WITH HOOK 1D91 ; [.1626.0020.0002.1D91] # LATIN SMALL LETTER D WITH HOOK AND TAIL 018C ; [.1627.0020.0002.018C] # LATIN SMALL LETTER D WITH TOPBAR 018B ; [.1627.0020.0008.018B] # LATIN CAPITAL LETTER D WITH TOPBAR 0221 ; [.162B.0020.0002.0221] # LATIN SMALL LETTER D WITH CURL A771 ; [.162F.0020.0002.A771] # LATIN SMALL LETTER DUM 1E9F ; [.1630.0020.0002.1E9F] # LATIN SMALL LETTER DELTA 0065 ; [.1631.0020.0002.0065] # LATIN SMALL LETTER E FF45 ; [.1631.0020.0003.FF45] # FULLWIDTH LATIN SMALL LETTER E 0364 ; [.1631.0020.0004.0364] # COMBINING LATIN SMALL LETTER E 24A0 ; [*02FB.0020.0004.24A0][.1631.0020.0004.24A0][*02FC.0020.001F.24A0] # PARENTHESIZED LATIN SMALL LETTER E 212F ; [.1631.0020.0005.212F] # SCRIPT SMALL E 2147 ; [.1631.0020.0005.2147] # DOUBLE-STRUCK ITALIC SMALL E 1D41E ; [.1631.0020.0005.1D41E] # MATHEMATICAL BOLD SMALL E 1D452 ; [.1631.0020.0005.1D452] # MATHEMATICAL ITALIC SMALL E 1D486 ; [.1631.0020.0005.1D486] # MATHEMATICAL BOLD ITALIC SMALL E 1D4EE ; [.1631.0020.0005.1D4EE] # MATHEMATICAL BOLD SCRIPT SMALL E 1D522 ; [.1631.0020.0005.1D522] # MATHEMATICAL FRAKTUR SMALL E 1D556 ; [.1631.0020.0005.1D556] # MATHEMATICAL DOUBLE-STRUCK SMALL E 1D58A ; [.1631.0020.0005.1D58A] # MATHEMATICAL BOLD FRAKTUR SMALL E 1D5BE ; [.1631.0020.0005.1D5BE] # MATHEMATICAL SANS-SERIF SMALL E 1D5F2 ; [.1631.0020.0005.1D5F2] # MATHEMATICAL SANS-SERIF BOLD SMALL E 1D626 ; [.1631.0020.0005.1D626] # MATHEMATICAL SANS-SERIF ITALIC SMALL E 1D65A ; [.1631.0020.0005.1D65A] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E 1D68E ; [.1631.0020.0005.1D68E] # MATHEMATICAL MONOSPACE SMALL E 24D4 ; [.1631.0020.0006.24D4] # CIRCLED LATIN SMALL LETTER E 0045 ; [.1631.0020.0008.0045] # LATIN CAPITAL LETTER E FF25 ; [.1631.0020.0009.FF25] # FULLWIDTH LATIN CAPITAL LETTER E 1F114 ; [*02FB.0020.0004.1F114][.1631.0020.000A.1F114][*02FC.0020.001F.1F114] # PARENTHESIZED LATIN CAPITAL LETTER E 1F1EA ; [.1631.0020.000A.1F1EA] # REGIONAL INDICATOR SYMBOL LETTER E 2130 ; [.1631.0020.000B.2130] # SCRIPT CAPITAL E 1D404 ; [.1631.0020.000B.1D404] # MATHEMATICAL BOLD CAPITAL E 1D438 ; [.1631.0020.000B.1D438] # MATHEMATICAL ITALIC CAPITAL E 1D46C ; [.1631.0020.000B.1D46C] # MATHEMATICAL BOLD ITALIC CAPITAL E 1D4D4 ; [.1631.0020.000B.1D4D4] # MATHEMATICAL BOLD SCRIPT CAPITAL E 1D508 ; [.1631.0020.000B.1D508] # MATHEMATICAL FRAKTUR CAPITAL E 1D53C ; [.1631.0020.000B.1D53C] # MATHEMATICAL DOUBLE-STRUCK CAPITAL E 1D570 ; [.1631.0020.000B.1D570] # MATHEMATICAL BOLD FRAKTUR CAPITAL E 1D5A4 ; [.1631.0020.000B.1D5A4] # MATHEMATICAL SANS-SERIF CAPITAL E 1D5D8 ; [.1631.0020.000B.1D5D8] # MATHEMATICAL SANS-SERIF BOLD CAPITAL E 1D60C ; [.1631.0020.000B.1D60C] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL E 1D640 ; [.1631.0020.000B.1D640] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E 1D674 ; [.1631.0020.000B.1D674] # MATHEMATICAL MONOSPACE CAPITAL E 24BA ; [.1631.0020.000C.24BA] # CIRCLED LATIN CAPITAL LETTER E 1F154 ; [.1631.0020.000C.1F154] # NEGATIVE CIRCLED LATIN CAPITAL LETTER E 1D49 ; [.1631.0020.0014.1D49] # MODIFIER LETTER SMALL E 2091 ; [.1631.0020.0015.2091] # LATIN SUBSCRIPT SMALL LETTER E 1D31 ; [.1631.0020.001D.1D31] # MODIFIER LETTER CAPITAL E 1F134 ; [.1631.0020.001D.1F134] # SQUARED LATIN CAPITAL LETTER E 1F174 ; [.1631.0020.001D.1F174] # NEGATIVE SQUARED LATIN CAPITAL LETTER E 00E9 ; [.1631.0020.0002.0065][.0000.0032.0002.0301] # LATIN SMALL LETTER E WITH ACUTE 00C9 ; [.1631.0020.0008.0045][.0000.0032.0002.0301] # LATIN CAPITAL LETTER E WITH ACUTE 00E8 ; [.1631.0020.0002.0065][.0000.0035.0002.0300] # LATIN SMALL LETTER E WITH GRAVE 00C8 ; [.1631.0020.0008.0045][.0000.0035.0002.0300] # LATIN CAPITAL LETTER E WITH GRAVE 0115 ; [.1631.0020.0002.0065][.0000.0037.0002.0306] # LATIN SMALL LETTER E WITH BREVE 0114 ; [.1631.0020.0008.0045][.0000.0037.0002.0306] # LATIN CAPITAL LETTER E WITH BREVE 00EA ; [.1631.0020.0002.0065][.0000.003C.0002.0302] # LATIN SMALL LETTER E WITH CIRCUMFLEX 00CA ; [.1631.0020.0008.0045][.0000.003C.0002.0302] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX 1EBF ; [.1631.0020.0002.0065][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE 1EBE ; [.1631.0020.0008.0045][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE 1EC1 ; [.1631.0020.0002.0065][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE 1EC0 ; [.1631.0020.0008.0045][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE 1EC5 ; [.1631.0020.0002.0065][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE 1EC4 ; [.1631.0020.0008.0045][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE 1EC3 ; [.1631.0020.0002.0065][.0000.003C.0002.0302][.0000.0064.0002.0309] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE 1EC2 ; [.1631.0020.0008.0045][.0000.003C.0002.0302][.0000.0064.0002.0309] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE 011B ; [.1631.0020.0002.0065][.0000.0041.0002.030C] # LATIN SMALL LETTER E WITH CARON 011A ; [.1631.0020.0008.0045][.0000.0041.0002.030C] # LATIN CAPITAL LETTER E WITH CARON 00EB ; [.1631.0020.0002.0065][.0000.0047.0002.0308] # LATIN SMALL LETTER E WITH DIAERESIS 00CB ; [.1631.0020.0008.0045][.0000.0047.0002.0308] # LATIN CAPITAL LETTER E WITH DIAERESIS 1EBD ; [.1631.0020.0002.0065][.0000.004E.0002.0303] # LATIN SMALL LETTER E WITH TILDE 1EBC ; [.1631.0020.0008.0045][.0000.004E.0002.0303] # LATIN CAPITAL LETTER E WITH TILDE 0117 ; [.1631.0020.0002.0065][.0000.0052.0002.0307] # LATIN SMALL LETTER E WITH DOT ABOVE 0116 ; [.1631.0020.0008.0045][.0000.0052.0002.0307] # LATIN CAPITAL LETTER E WITH DOT ABOVE 0229 ; [.1631.0020.0002.0065][.0000.0056.0002.0327] # LATIN SMALL LETTER E WITH CEDILLA 0228 ; [.1631.0020.0008.0045][.0000.0056.0002.0327] # LATIN CAPITAL LETTER E WITH CEDILLA 1E1D ; [.1631.0020.0002.0065][.0000.0056.0002.0327][.0000.0037.0002.0306] # LATIN SMALL LETTER E WITH CEDILLA AND BREVE 1E1C ; [.1631.0020.0008.0045][.0000.0056.0002.0327][.0000.0037.0002.0306] # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE 0119 ; [.1631.0020.0002.0065][.0000.0059.0002.0328] # LATIN SMALL LETTER E WITH OGONEK 0118 ; [.1631.0020.0008.0045][.0000.0059.0002.0328] # LATIN CAPITAL LETTER E WITH OGONEK 0113 ; [.1631.0020.0002.0065][.0000.005B.0002.0304] # LATIN SMALL LETTER E WITH MACRON 0112 ; [.1631.0020.0008.0045][.0000.005B.0002.0304] # LATIN CAPITAL LETTER E WITH MACRON 1E17 ; [.1631.0020.0002.0065][.0000.005B.0002.0304][.0000.0032.0002.0301] # LATIN SMALL LETTER E WITH MACRON AND ACUTE 1E16 ; [.1631.0020.0008.0045][.0000.005B.0002.0304][.0000.0032.0002.0301] # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE 1E15 ; [.1631.0020.0002.0065][.0000.005B.0002.0304][.0000.0035.0002.0300] # LATIN SMALL LETTER E WITH MACRON AND GRAVE 1E14 ; [.1631.0020.0008.0045][.0000.005B.0002.0304][.0000.0035.0002.0300] # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE 1EBB ; [.1631.0020.0002.0065][.0000.0064.0002.0309] # LATIN SMALL LETTER E WITH HOOK ABOVE 1EBA ; [.1631.0020.0008.0045][.0000.0064.0002.0309] # LATIN CAPITAL LETTER E WITH HOOK ABOVE 0205 ; [.1631.0020.0002.0065][.0000.0065.0002.030F] # LATIN SMALL LETTER E WITH DOUBLE GRAVE 0204 ; [.1631.0020.0008.0045][.0000.0065.0002.030F] # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE 0207 ; [.1631.0020.0002.0065][.0000.0067.0002.0311] # LATIN SMALL LETTER E WITH INVERTED BREVE 0206 ; [.1631.0020.0008.0045][.0000.0067.0002.0311] # LATIN CAPITAL LETTER E WITH INVERTED BREVE 1EB9 ; [.1631.0020.0002.0065][.0000.0070.0002.0323] # LATIN SMALL LETTER E WITH DOT BELOW 1EB8 ; [.1631.0020.0008.0045][.0000.0070.0002.0323] # LATIN CAPITAL LETTER E WITH DOT BELOW 1EC7 ; [.1631.0020.0002.0065][.0000.0070.0002.0323][.0000.003C.0002.0302] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW 1EC6 ; [.1631.0020.0008.0045][.0000.0070.0002.0323][.0000.003C.0002.0302] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW 1E19 ; [.1631.0020.0002.0065][.0000.0078.0002.032D] # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW 1E18 ; [.1631.0020.0008.0045][.0000.0078.0002.032D] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW 1E1B ; [.1631.0020.0002.0065][.0000.007A.0002.0330] # LATIN SMALL LETTER E WITH TILDE BELOW 1E1A ; [.1631.0020.0008.0045][.0000.007A.0002.0330] # LATIN CAPITAL LETTER E WITH TILDE BELOW 32CD ; [.1631.0020.001C.32CD][.17A2.0020.001C.32CD][.1676.0020.001F.32CD] # SQUARE ERG 32CE ; [.1631.0020.001C.32CE][.1844.0020.001D.32CE] # SQUARE EV 1D07 ; [.1635.0020.0002.1D07] # LATIN LETTER SMALL CAPITAL E 0247 ; [.1636.0020.0002.0247] # LATIN SMALL LETTER E WITH STROKE 0246 ; [.1636.0020.0008.0246] # LATIN CAPITAL LETTER E WITH STROKE 1D92 ; [.163A.0020.0002.1D92] # LATIN SMALL LETTER E WITH RETROFLEX HOOK 2C78 ; [.163B.0020.0002.2C78] # LATIN SMALL LETTER E WITH NOTCH 01DD ; [.163C.0020.0002.01DD] # LATIN SMALL LETTER TURNED E 018E ; [.163C.0020.0008.018E] # LATIN CAPITAL LETTER REVERSED E 1D32 ; [.163C.0020.001D.1D32] # MODIFIER LETTER CAPITAL REVERSED E 2C7B ; [.1640.0020.0002.2C7B] # LATIN LETTER SMALL CAPITAL TURNED E 0259 ; [.1641.0020.0002.0259] # LATIN SMALL LETTER SCHWA 018F ; [.1641.0020.0008.018F] # LATIN CAPITAL LETTER SCHWA 1D4A ; [.1641.0020.0014.1D4A] # MODIFIER LETTER SMALL SCHWA 2094 ; [.1641.0020.0015.2094] # LATIN SUBSCRIPT SMALL LETTER SCHWA 1D95 ; [.1645.0020.0002.1D95] # LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK 025B ; [.1646.0020.0002.025B] # LATIN SMALL LETTER OPEN E 0190 ; [.1646.0020.0008.0190] # LATIN CAPITAL LETTER OPEN E 2107 ; [.1646.0020.000A.2107] # EULER CONSTANT 1D4B ; [.1646.0020.0014.1D4B] # MODIFIER LETTER SMALL OPEN E 1D93 ; [.164A.0020.0002.1D93] # LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK 0258 ; [.164B.0020.0002.0258] # LATIN SMALL LETTER REVERSED E 025A ; [.164F.0020.0002.025A] # LATIN SMALL LETTER SCHWA WITH HOOK 025C ; [.1653.0020.0002.025C] # LATIN SMALL LETTER REVERSED OPEN E 1D9F ; [.1653.0020.0014.1D9F] # MODIFIER LETTER SMALL REVERSED OPEN E 1D94 ; [.1657.0020.0002.1D94] # LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK 1D08 ; [.1658.0020.0002.1D08] # LATIN SMALL LETTER TURNED OPEN E 1D4C ; [.1658.0020.0014.1D4C] # MODIFIER LETTER SMALL TURNED OPEN E 025D ; [.1659.0020.0002.025D] # LATIN SMALL LETTER REVERSED OPEN E WITH HOOK 025E ; [.165D.0020.0002.025E] # LATIN SMALL LETTER CLOSED REVERSED OPEN E 029A ; [.1661.0020.0002.029A] # LATIN SMALL LETTER CLOSED OPEN E 0264 ; [.1665.0020.0002.0264] # LATIN SMALL LETTER RAMS HORN 0066 ; [.1669.0020.0002.0066] # LATIN SMALL LETTER F FF46 ; [.1669.0020.0003.FF46] # FULLWIDTH LATIN SMALL LETTER F 24A1 ; [*02FB.0020.0004.24A1][.1669.0020.0004.24A1][*02FC.0020.001F.24A1] # PARENTHESIZED LATIN SMALL LETTER F 1D41F ; [.1669.0020.0005.1D41F] # MATHEMATICAL BOLD SMALL F 1D453 ; [.1669.0020.0005.1D453] # MATHEMATICAL ITALIC SMALL F 1D487 ; [.1669.0020.0005.1D487] # MATHEMATICAL BOLD ITALIC SMALL F 1D4BB ; [.1669.0020.0005.1D4BB] # MATHEMATICAL SCRIPT SMALL F 1D4EF ; [.1669.0020.0005.1D4EF] # MATHEMATICAL BOLD SCRIPT SMALL F 1D523 ; [.1669.0020.0005.1D523] # MATHEMATICAL FRAKTUR SMALL F 1D557 ; [.1669.0020.0005.1D557] # MATHEMATICAL DOUBLE-STRUCK SMALL F 1D58B ; [.1669.0020.0005.1D58B] # MATHEMATICAL BOLD FRAKTUR SMALL F 1D5BF ; [.1669.0020.0005.1D5BF] # MATHEMATICAL SANS-SERIF SMALL F 1D5F3 ; [.1669.0020.0005.1D5F3] # MATHEMATICAL SANS-SERIF BOLD SMALL F 1D627 ; [.1669.0020.0005.1D627] # MATHEMATICAL SANS-SERIF ITALIC SMALL F 1D65B ; [.1669.0020.0005.1D65B] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F 1D68F ; [.1669.0020.0005.1D68F] # MATHEMATICAL MONOSPACE SMALL F 24D5 ; [.1669.0020.0006.24D5] # CIRCLED LATIN SMALL LETTER F 0046 ; [.1669.0020.0008.0046] # LATIN CAPITAL LETTER F FF26 ; [.1669.0020.0009.FF26] # FULLWIDTH LATIN CAPITAL LETTER F 2109 ; [*0482.0020.0004.2109][.1669.0020.000A.2109] # DEGREE FAHRENHEIT 1F115 ; [*02FB.0020.0004.1F115][.1669.0020.000A.1F115][*02FC.0020.001F.1F115] # PARENTHESIZED LATIN CAPITAL LETTER F 1F1EB ; [.1669.0020.000A.1F1EB] # REGIONAL INDICATOR SYMBOL LETTER F 2131 ; [.1669.0020.000B.2131] # SCRIPT CAPITAL F 1D405 ; [.1669.0020.000B.1D405] # MATHEMATICAL BOLD CAPITAL F 1D439 ; [.1669.0020.000B.1D439] # MATHEMATICAL ITALIC CAPITAL F 1D46D ; [.1669.0020.000B.1D46D] # MATHEMATICAL BOLD ITALIC CAPITAL F 1D4D5 ; [.1669.0020.000B.1D4D5] # MATHEMATICAL BOLD SCRIPT CAPITAL F 1D509 ; [.1669.0020.000B.1D509] # MATHEMATICAL FRAKTUR CAPITAL F 1D53D ; [.1669.0020.000B.1D53D] # MATHEMATICAL DOUBLE-STRUCK CAPITAL F 1D571 ; [.1669.0020.000B.1D571] # MATHEMATICAL BOLD FRAKTUR CAPITAL F 1D5A5 ; [.1669.0020.000B.1D5A5] # MATHEMATICAL SANS-SERIF CAPITAL F 1D5D9 ; [.1669.0020.000B.1D5D9] # MATHEMATICAL SANS-SERIF BOLD CAPITAL F 1D60D ; [.1669.0020.000B.1D60D] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL F 1D641 ; [.1669.0020.000B.1D641] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F 1D675 ; [.1669.0020.000B.1D675] # MATHEMATICAL MONOSPACE CAPITAL F 24BB ; [.1669.0020.000C.24BB] # CIRCLED LATIN CAPITAL LETTER F 1F155 ; [.1669.0020.000C.1F155] # NEGATIVE CIRCLED LATIN CAPITAL LETTER F 1DA0 ; [.1669.0020.0014.1DA0] # MODIFIER LETTER SMALL F 1F135 ; [.1669.0020.001D.1F135] # SQUARED LATIN CAPITAL LETTER F 1F175 ; [.1669.0020.001D.1F175] # NEGATIVE SQUARED LATIN CAPITAL LETTER F 1E1F ; [.1669.0020.0002.0066][.0000.0052.0002.0307] # LATIN SMALL LETTER F WITH DOT ABOVE 1E1E ; [.1669.0020.0008.0046][.0000.0052.0002.0307] # LATIN CAPITAL LETTER F WITH DOT ABOVE A77C ; [.1669.0020.0004.A77C][.0000.013A.0004.A77C] # LATIN SMALL LETTER INSULAR F A77B ; [.1669.0020.000A.A77B][.0000.013A.0004.A77B] # LATIN CAPITAL LETTER INSULAR F 213B ; [.1669.0020.000A.213B][.15D4.0020.000A.213B][.1860.0020.001F.213B] # FACSIMILE SIGN FB00 ; [.1669.0020.0004.FB00][.1669.0020.0004.FB00] # LATIN SMALL LIGATURE FF FB03 ; [.1669.0020.0004.FB03][.1669.0020.0004.FB03][.16B2.0020.001F.FB03] # LATIN SMALL LIGATURE FFI FB04 ; [.1669.0020.0004.FB04][.1669.0020.0004.FB04][.16F6.0020.001F.FB04] # LATIN SMALL LIGATURE FFL FB01 ; [.1669.0020.0004.FB01][.16B2.0020.0004.FB01] # LATIN SMALL LIGATURE FI FB02 ; [.1669.0020.0004.FB02][.16F6.0020.0004.FB02] # LATIN SMALL LIGATURE FL 3399 ; [.1669.0020.001C.3399][.1726.0020.001C.3399] # SQUARE FM 02A9 ; [.1669.0020.0004.02A9][.1752.0020.0004.02A9] # LATIN SMALL LETTER FENG DIGRAPH 1F193 ; [.1669.0020.001D.1F193][.17A2.0020.001D.1F193][.1631.0020.001F.1F193][.1631.0020.001F.1F193] # SQUARED FREE A730 ; [.166D.0020.0002.A730] # LATIN LETTER SMALL CAPITAL F 1D6E ; [.166E.0020.0002.1D6E] # LATIN SMALL LETTER F WITH MIDDLE TILDE 1D82 ; [.166F.0020.0002.1D82] # LATIN SMALL LETTER F WITH PALATAL HOOK 0192 ; [.1670.0020.0002.0192] # LATIN SMALL LETTER F WITH HOOK 0191 ; [.1670.0020.0008.0191] # LATIN CAPITAL LETTER F WITH HOOK 214E ; [.1674.0020.0002.214E] # TURNED SMALL F 2132 ; [.1674.0020.0008.2132] # TURNED CAPITAL F A7FB ; [.1675.0020.0002.A7FB] # LATIN EPIGRAPHIC LETTER REVERSED F 0067 ; [.1676.0020.0002.0067] # LATIN SMALL LETTER G FF47 ; [.1676.0020.0003.FF47] # FULLWIDTH LATIN SMALL LETTER G 1DDA ; [.1676.0020.0004.1DDA] # COMBINING LATIN SMALL LETTER G 24A2 ; [*02FB.0020.0004.24A2][.1676.0020.0004.24A2][*02FC.0020.001F.24A2] # PARENTHESIZED LATIN SMALL LETTER G 210A ; [.1676.0020.0005.210A] # SCRIPT SMALL G 1D420 ; [.1676.0020.0005.1D420] # MATHEMATICAL BOLD SMALL G 1D454 ; [.1676.0020.0005.1D454] # MATHEMATICAL ITALIC SMALL G 1D488 ; [.1676.0020.0005.1D488] # MATHEMATICAL BOLD ITALIC SMALL G 1D4F0 ; [.1676.0020.0005.1D4F0] # MATHEMATICAL BOLD SCRIPT SMALL G 1D524 ; [.1676.0020.0005.1D524] # MATHEMATICAL FRAKTUR SMALL G 1D558 ; [.1676.0020.0005.1D558] # MATHEMATICAL DOUBLE-STRUCK SMALL G 1D58C ; [.1676.0020.0005.1D58C] # MATHEMATICAL BOLD FRAKTUR SMALL G 1D5C0 ; [.1676.0020.0005.1D5C0] # MATHEMATICAL SANS-SERIF SMALL G 1D5F4 ; [.1676.0020.0005.1D5F4] # MATHEMATICAL SANS-SERIF BOLD SMALL G 1D628 ; [.1676.0020.0005.1D628] # MATHEMATICAL SANS-SERIF ITALIC SMALL G 1D65C ; [.1676.0020.0005.1D65C] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G 1D690 ; [.1676.0020.0005.1D690] # MATHEMATICAL MONOSPACE SMALL G 24D6 ; [.1676.0020.0006.24D6] # CIRCLED LATIN SMALL LETTER G 0047 ; [.1676.0020.0008.0047] # LATIN CAPITAL LETTER G FF27 ; [.1676.0020.0009.FF27] # FULLWIDTH LATIN CAPITAL LETTER G 1F116 ; [*02FB.0020.0004.1F116][.1676.0020.000A.1F116][*02FC.0020.001F.1F116] # PARENTHESIZED LATIN CAPITAL LETTER G 1F1EC ; [.1676.0020.000A.1F1EC] # REGIONAL INDICATOR SYMBOL LETTER G 1D406 ; [.1676.0020.000B.1D406] # MATHEMATICAL BOLD CAPITAL G 1D43A ; [.1676.0020.000B.1D43A] # MATHEMATICAL ITALIC CAPITAL G 1D46E ; [.1676.0020.000B.1D46E] # MATHEMATICAL BOLD ITALIC CAPITAL G 1D4A2 ; [.1676.0020.000B.1D4A2] # MATHEMATICAL SCRIPT CAPITAL G 1D4D6 ; [.1676.0020.000B.1D4D6] # MATHEMATICAL BOLD SCRIPT CAPITAL G 1D50A ; [.1676.0020.000B.1D50A] # MATHEMATICAL FRAKTUR CAPITAL G 1D53E ; [.1676.0020.000B.1D53E] # MATHEMATICAL DOUBLE-STRUCK CAPITAL G 1D572 ; [.1676.0020.000B.1D572] # MATHEMATICAL BOLD FRAKTUR CAPITAL G 1D5A6 ; [.1676.0020.000B.1D5A6] # MATHEMATICAL SANS-SERIF CAPITAL G 1D5DA ; [.1676.0020.000B.1D5DA] # MATHEMATICAL SANS-SERIF BOLD CAPITAL G 1D60E ; [.1676.0020.000B.1D60E] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL G 1D642 ; [.1676.0020.000B.1D642] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G 1D676 ; [.1676.0020.000B.1D676] # MATHEMATICAL MONOSPACE CAPITAL G 24BC ; [.1676.0020.000C.24BC] # CIRCLED LATIN CAPITAL LETTER G 1F156 ; [.1676.0020.000C.1F156] # NEGATIVE CIRCLED LATIN CAPITAL LETTER G 1D4D ; [.1676.0020.0014.1D4D] # MODIFIER LETTER SMALL G 1D33 ; [.1676.0020.001D.1D33] # MODIFIER LETTER CAPITAL G 1F136 ; [.1676.0020.001D.1F136] # SQUARED LATIN CAPITAL LETTER G 1F176 ; [.1676.0020.001D.1F176] # NEGATIVE SQUARED LATIN CAPITAL LETTER G 01F5 ; [.1676.0020.0002.0067][.0000.0032.0002.0301] # LATIN SMALL LETTER G WITH ACUTE 01F4 ; [.1676.0020.0008.0047][.0000.0032.0002.0301] # LATIN CAPITAL LETTER G WITH ACUTE 011F ; [.1676.0020.0002.0067][.0000.0037.0002.0306] # LATIN SMALL LETTER G WITH BREVE 011E ; [.1676.0020.0008.0047][.0000.0037.0002.0306] # LATIN CAPITAL LETTER G WITH BREVE 011D ; [.1676.0020.0002.0067][.0000.003C.0002.0302] # LATIN SMALL LETTER G WITH CIRCUMFLEX 011C ; [.1676.0020.0008.0047][.0000.003C.0002.0302] # LATIN CAPITAL LETTER G WITH CIRCUMFLEX 01E7 ; [.1676.0020.0002.0067][.0000.0041.0002.030C] # LATIN SMALL LETTER G WITH CARON 01E6 ; [.1676.0020.0008.0047][.0000.0041.0002.030C] # LATIN CAPITAL LETTER G WITH CARON 0121 ; [.1676.0020.0002.0067][.0000.0052.0002.0307] # LATIN SMALL LETTER G WITH DOT ABOVE 0120 ; [.1676.0020.0008.0047][.0000.0052.0002.0307] # LATIN CAPITAL LETTER G WITH DOT ABOVE 0123 ; [.1676.0020.0002.0067][.0000.0056.0002.0327] # LATIN SMALL LETTER G WITH CEDILLA 0122 ; [.1676.0020.0008.0047][.0000.0056.0002.0327] # LATIN CAPITAL LETTER G WITH CEDILLA 1E21 ; [.1676.0020.0002.0067][.0000.005B.0002.0304] # LATIN SMALL LETTER G WITH MACRON 1E20 ; [.1676.0020.0008.0047][.0000.005B.0002.0304] # LATIN CAPITAL LETTER G WITH MACRON A7A1 ; [.1676.0020.0004.A7A1][.0000.0061.0004.A7A1] # LATIN SMALL LETTER G WITH OBLIQUE STROKE A7A0 ; [.1676.0020.000A.A7A0][.0000.0061.0004.A7A0] # LATIN CAPITAL LETTER G WITH OBLIQUE STROKE 1D79 ; [.1676.0020.0004.1D79][.0000.013A.0004.1D79] # LATIN SMALL LETTER INSULAR G A77D ; [.1676.0020.000A.A77D][.0000.013A.0004.A77D] # LATIN CAPITAL LETTER INSULAR G 33FF ; [.1676.0020.001C.33FF][.15D4.0020.001C.33FF][.16F6.0020.001F.33FF] # SQUARE GAL 3387 ; [.1676.0020.001D.3387][.15EA.0020.001D.3387] # SQUARE GB 3393 ; [.1676.0020.001D.3393][.1699.0020.001D.3393][.187A.0020.001F.3393] # SQUARE GHZ 33AC ; [.1676.0020.001D.33AC][.177B.0020.001D.33AC][.15D4.0020.001F.33AC] # SQUARE GPA 33C9 ; [.1676.0020.001D.33C9][.1865.0020.001C.33C9] # SQUARE GY 0261 ; [.167A.0020.0002.0261] # LATIN SMALL LETTER SCRIPT G 1DA2 ; [.167A.0020.0014.1DA2] # MODIFIER LETTER SMALL SCRIPT G 0262 ; [.167E.0020.0002.0262] # LATIN LETTER SMALL CAPITAL G 1DDB ; [.167E.0020.0004.1DDB] # COMBINING LATIN LETTER SMALL CAPITAL G 01E5 ; [.1682.0020.0002.01E5] # LATIN SMALL LETTER G WITH STROKE 01E4 ; [.1682.0020.0008.01E4] # LATIN CAPITAL LETTER G WITH STROKE 1D83 ; [.1686.0020.0002.1D83] # LATIN SMALL LETTER G WITH PALATAL HOOK 0260 ; [.1687.0020.0002.0260] # LATIN SMALL LETTER G WITH HOOK 0193 ; [.1687.0020.0008.0193] # LATIN CAPITAL LETTER G WITH HOOK 029B ; [.168B.0020.0002.029B] # LATIN LETTER SMALL CAPITAL G WITH HOOK 1D77 ; [.168F.0020.0002.1D77] # LATIN SMALL LETTER TURNED G A77F ; [.1690.0020.0002.A77F] # LATIN SMALL LETTER TURNED INSULAR G A77E ; [.1690.0020.0008.A77E] # LATIN CAPITAL LETTER TURNED INSULAR G 0263 ; [.1691.0020.0002.0263] # LATIN SMALL LETTER GAMMA 0194 ; [.1691.0020.0008.0194] # LATIN CAPITAL LETTER GAMMA 02E0 ; [.1691.0020.0014.02E0] # MODIFIER LETTER SMALL GAMMA 01A3 ; [.1695.0020.0002.01A3] # LATIN SMALL LETTER OI 01A2 ; [.1695.0020.0008.01A2] # LATIN CAPITAL LETTER OI 0068 ; [.1699.0020.0002.0068] # LATIN SMALL LETTER H FF48 ; [.1699.0020.0003.FF48] # FULLWIDTH LATIN SMALL LETTER H 036A ; [.1699.0020.0004.036A] # COMBINING LATIN SMALL LETTER H 24A3 ; [*02FB.0020.0004.24A3][.1699.0020.0004.24A3][*02FC.0020.001F.24A3] # PARENTHESIZED LATIN SMALL LETTER H 210E ; [.1699.0020.0005.210E] # PLANCK CONSTANT 1D421 ; [.1699.0020.0005.1D421] # MATHEMATICAL BOLD SMALL H 1D489 ; [.1699.0020.0005.1D489] # MATHEMATICAL BOLD ITALIC SMALL H 1D4BD ; [.1699.0020.0005.1D4BD] # MATHEMATICAL SCRIPT SMALL H 1D4F1 ; [.1699.0020.0005.1D4F1] # MATHEMATICAL BOLD SCRIPT SMALL H 1D525 ; [.1699.0020.0005.1D525] # MATHEMATICAL FRAKTUR SMALL H 1D559 ; [.1699.0020.0005.1D559] # MATHEMATICAL DOUBLE-STRUCK SMALL H 1D58D ; [.1699.0020.0005.1D58D] # MATHEMATICAL BOLD FRAKTUR SMALL H 1D5C1 ; [.1699.0020.0005.1D5C1] # MATHEMATICAL SANS-SERIF SMALL H 1D5F5 ; [.1699.0020.0005.1D5F5] # MATHEMATICAL SANS-SERIF BOLD SMALL H 1D629 ; [.1699.0020.0005.1D629] # MATHEMATICAL SANS-SERIF ITALIC SMALL H 1D65D ; [.1699.0020.0005.1D65D] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H 1D691 ; [.1699.0020.0005.1D691] # MATHEMATICAL MONOSPACE SMALL H 24D7 ; [.1699.0020.0006.24D7] # CIRCLED LATIN SMALL LETTER H 0048 ; [.1699.0020.0008.0048] # LATIN CAPITAL LETTER H FF28 ; [.1699.0020.0009.FF28] # FULLWIDTH LATIN CAPITAL LETTER H 1F117 ; [*02FB.0020.0004.1F117][.1699.0020.000A.1F117][*02FC.0020.001F.1F117] # PARENTHESIZED LATIN CAPITAL LETTER H 1F1ED ; [.1699.0020.000A.1F1ED] # REGIONAL INDICATOR SYMBOL LETTER H 210B ; [.1699.0020.000B.210B] # SCRIPT CAPITAL H 210C ; [.1699.0020.000B.210C] # BLACK-LETTER CAPITAL H 210D ; [.1699.0020.000B.210D] # DOUBLE-STRUCK CAPITAL H 1D407 ; [.1699.0020.000B.1D407] # MATHEMATICAL BOLD CAPITAL H 1D43B ; [.1699.0020.000B.1D43B] # MATHEMATICAL ITALIC CAPITAL H 1D46F ; [.1699.0020.000B.1D46F] # MATHEMATICAL BOLD ITALIC CAPITAL H 1D4D7 ; [.1699.0020.000B.1D4D7] # MATHEMATICAL BOLD SCRIPT CAPITAL H 1D573 ; [.1699.0020.000B.1D573] # MATHEMATICAL BOLD FRAKTUR CAPITAL H 1D5A7 ; [.1699.0020.000B.1D5A7] # MATHEMATICAL SANS-SERIF CAPITAL H 1D5DB ; [.1699.0020.000B.1D5DB] # MATHEMATICAL SANS-SERIF BOLD CAPITAL H 1D60F ; [.1699.0020.000B.1D60F] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL H 1D643 ; [.1699.0020.000B.1D643] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H 1D677 ; [.1699.0020.000B.1D677] # MATHEMATICAL MONOSPACE CAPITAL H 24BD ; [.1699.0020.000C.24BD] # CIRCLED LATIN CAPITAL LETTER H 1F157 ; [.1699.0020.000C.1F157] # NEGATIVE CIRCLED LATIN CAPITAL LETTER H 02B0 ; [.1699.0020.0014.02B0] # MODIFIER LETTER SMALL H 2095 ; [.1699.0020.0015.2095] # LATIN SUBSCRIPT SMALL LETTER H 1D34 ; [.1699.0020.001D.1D34] # MODIFIER LETTER CAPITAL H 1F137 ; [.1699.0020.001D.1F137] # SQUARED LATIN CAPITAL LETTER H 1F177 ; [.1699.0020.001D.1F177] # NEGATIVE SQUARED LATIN CAPITAL LETTER H 0125 ; [.1699.0020.0002.0068][.0000.003C.0002.0302] # LATIN SMALL LETTER H WITH CIRCUMFLEX 0124 ; [.1699.0020.0008.0048][.0000.003C.0002.0302] # LATIN CAPITAL LETTER H WITH CIRCUMFLEX 021F ; [.1699.0020.0002.0068][.0000.0041.0002.030C] # LATIN SMALL LETTER H WITH CARON 021E ; [.1699.0020.0008.0048][.0000.0041.0002.030C] # LATIN CAPITAL LETTER H WITH CARON 1E27 ; [.1699.0020.0002.0068][.0000.0047.0002.0308] # LATIN SMALL LETTER H WITH DIAERESIS 1E26 ; [.1699.0020.0008.0048][.0000.0047.0002.0308] # LATIN CAPITAL LETTER H WITH DIAERESIS 1E23 ; [.1699.0020.0002.0068][.0000.0052.0002.0307] # LATIN SMALL LETTER H WITH DOT ABOVE 1E22 ; [.1699.0020.0008.0048][.0000.0052.0002.0307] # LATIN CAPITAL LETTER H WITH DOT ABOVE 1E29 ; [.1699.0020.0002.0068][.0000.0056.0002.0327] # LATIN SMALL LETTER H WITH CEDILLA 1E28 ; [.1699.0020.0008.0048][.0000.0056.0002.0327] # LATIN CAPITAL LETTER H WITH CEDILLA 1E25 ; [.1699.0020.0002.0068][.0000.0070.0002.0323] # LATIN SMALL LETTER H WITH DOT BELOW 1E24 ; [.1699.0020.0008.0048][.0000.0070.0002.0323] # LATIN CAPITAL LETTER H WITH DOT BELOW 1E2B ; [.1699.0020.0002.0068][.0000.0079.0002.032E] # LATIN SMALL LETTER H WITH BREVE BELOW 1E2A ; [.1699.0020.0008.0048][.0000.0079.0002.032E] # LATIN CAPITAL LETTER H WITH BREVE BELOW 1E96 ; [.1699.0020.0002.0068][.0000.007B.0002.0331] # LATIN SMALL LETTER H WITH LINE BELOW 0127 ; [.1699.0020.0002.0068][.0000.007D.0002.0335] # LATIN SMALL LETTER H WITH STROKE 210F ; [.1699.0020.0002.210F][.0000.007D.0002.210F] # PLANCK CONSTANT OVER TWO PI 0126 ; [.1699.0020.0008.0048][.0000.007D.0002.0335] # LATIN CAPITAL LETTER H WITH STROKE A7F8 ; [.1699.0020.0014.A7F8][.0000.007D.0014.A7F8] # MODIFIER LETTER CAPITAL H WITH STROKE 33CA ; [.1699.0020.001C.33CA][.15D4.0020.001C.33CA] # SQUARE HA 32CC ; [.1699.0020.001D.32CC][.1676.0020.001C.32CC] # SQUARE HG 33CB ; [.1699.0020.001D.33CB][.177B.0020.001D.33CB] # SQUARE HP 3371 ; [.1699.0020.001C.3371][.177B.0020.001D.3371][.15D4.0020.001F.3371] # SQUARE HPA 1F14A ; [.1699.0020.001D.1F14A][.1844.0020.001D.1F14A] # SQUARED HV 3390 ; [.1699.0020.001D.3390][.187A.0020.001C.3390] # SQUARE HZ 029C ; [.169D.0020.0002.029C] # LATIN LETTER SMALL CAPITAL H 0195 ; [.16A1.0020.0002.0195] # LATIN SMALL LETTER HV 01F6 ; [.16A1.0020.0008.01F6] # LATIN CAPITAL LETTER HWAIR 0266 ; [.16A5.0020.0002.0266] # LATIN SMALL LETTER H WITH HOOK A7AA ; [.16A5.0020.0008.A7AA] # LATIN CAPITAL LETTER H WITH HOOK 02B1 ; [.16A5.0020.0014.02B1] # MODIFIER LETTER SMALL H WITH HOOK 2C68 ; [.16A9.0020.0002.2C68] # LATIN SMALL LETTER H WITH DESCENDER 2C67 ; [.16A9.0020.0008.2C67] # LATIN CAPITAL LETTER H WITH DESCENDER 2C76 ; [.16AA.0020.0002.2C76] # LATIN SMALL LETTER HALF H 2C75 ; [.16AA.0020.0008.2C75] # LATIN CAPITAL LETTER HALF H A727 ; [.16AB.0020.0002.A727] # LATIN SMALL LETTER HENG A726 ; [.16AB.0020.0008.A726] # LATIN CAPITAL LETTER HENG 0267 ; [.16AC.0020.0002.0267] # LATIN SMALL LETTER HENG WITH HOOK 02BB ; [.16B0.0020.0002.02BB] # MODIFIER LETTER TURNED COMMA 02BD ; [.16B1.0020.0002.02BD] # MODIFIER LETTER REVERSED COMMA 0069 ; [.16B2.0020.0002.0069] # LATIN SMALL LETTER I FF49 ; [.16B2.0020.0003.FF49] # FULLWIDTH LATIN SMALL LETTER I 0365 ; [.16B2.0020.0004.0365] # COMBINING LATIN SMALL LETTER I 2170 ; [.16B2.0020.0004.2170] # SMALL ROMAN NUMERAL ONE 24A4 ; [*02FB.0020.0004.24A4][.16B2.0020.0004.24A4][*02FC.0020.001F.24A4] # PARENTHESIZED LATIN SMALL LETTER I 2139 ; [.16B2.0020.0005.2139] # INFORMATION SOURCE 2148 ; [.16B2.0020.0005.2148] # DOUBLE-STRUCK ITALIC SMALL I 1D422 ; [.16B2.0020.0005.1D422] # MATHEMATICAL BOLD SMALL I 1D456 ; [.16B2.0020.0005.1D456] # MATHEMATICAL ITALIC SMALL I 1D48A ; [.16B2.0020.0005.1D48A] # MATHEMATICAL BOLD ITALIC SMALL I 1D4BE ; [.16B2.0020.0005.1D4BE] # MATHEMATICAL SCRIPT SMALL I 1D4F2 ; [.16B2.0020.0005.1D4F2] # MATHEMATICAL BOLD SCRIPT SMALL I 1D526 ; [.16B2.0020.0005.1D526] # MATHEMATICAL FRAKTUR SMALL I 1D55A ; [.16B2.0020.0005.1D55A] # MATHEMATICAL DOUBLE-STRUCK SMALL I 1D58E ; [.16B2.0020.0005.1D58E] # MATHEMATICAL BOLD FRAKTUR SMALL I 1D5C2 ; [.16B2.0020.0005.1D5C2] # MATHEMATICAL SANS-SERIF SMALL I 1D5F6 ; [.16B2.0020.0005.1D5F6] # MATHEMATICAL SANS-SERIF BOLD SMALL I 1D62A ; [.16B2.0020.0005.1D62A] # MATHEMATICAL SANS-SERIF ITALIC SMALL I 1D65E ; [.16B2.0020.0005.1D65E] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I 1D692 ; [.16B2.0020.0005.1D692] # MATHEMATICAL MONOSPACE SMALL I 24D8 ; [.16B2.0020.0006.24D8] # CIRCLED LATIN SMALL LETTER I 0049 ; [.16B2.0020.0008.0049] # LATIN CAPITAL LETTER I FF29 ; [.16B2.0020.0009.FF29] # FULLWIDTH LATIN CAPITAL LETTER I 2160 ; [.16B2.0020.000A.2160] # ROMAN NUMERAL ONE 1F118 ; [*02FB.0020.0004.1F118][.16B2.0020.000A.1F118][*02FC.0020.001F.1F118] # PARENTHESIZED LATIN CAPITAL LETTER I 1F1EE ; [.16B2.0020.000A.1F1EE] # REGIONAL INDICATOR SYMBOL LETTER I 2110 ; [.16B2.0020.000B.2110] # SCRIPT CAPITAL I 2111 ; [.16B2.0020.000B.2111] # BLACK-LETTER CAPITAL I 1D408 ; [.16B2.0020.000B.1D408] # MATHEMATICAL BOLD CAPITAL I 1D43C ; [.16B2.0020.000B.1D43C] # MATHEMATICAL ITALIC CAPITAL I 1D470 ; [.16B2.0020.000B.1D470] # MATHEMATICAL BOLD ITALIC CAPITAL I 1D4D8 ; [.16B2.0020.000B.1D4D8] # MATHEMATICAL BOLD SCRIPT CAPITAL I 1D540 ; [.16B2.0020.000B.1D540] # MATHEMATICAL DOUBLE-STRUCK CAPITAL I 1D574 ; [.16B2.0020.000B.1D574] # MATHEMATICAL BOLD FRAKTUR CAPITAL I 1D5A8 ; [.16B2.0020.000B.1D5A8] # MATHEMATICAL SANS-SERIF CAPITAL I 1D5DC ; [.16B2.0020.000B.1D5DC] # MATHEMATICAL SANS-SERIF BOLD CAPITAL I 1D610 ; [.16B2.0020.000B.1D610] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL I 1D644 ; [.16B2.0020.000B.1D644] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I 1D678 ; [.16B2.0020.000B.1D678] # MATHEMATICAL MONOSPACE CAPITAL I 24BE ; [.16B2.0020.000C.24BE] # CIRCLED LATIN CAPITAL LETTER I 1F158 ; [.16B2.0020.000C.1F158] # NEGATIVE CIRCLED LATIN CAPITAL LETTER I 2071 ; [.16B2.0020.0014.2071] # SUPERSCRIPT LATIN SMALL LETTER I 1D62 ; [.16B2.0020.0015.1D62] # LATIN SUBSCRIPT SMALL LETTER I 1D35 ; [.16B2.0020.001D.1D35] # MODIFIER LETTER CAPITAL I 1F138 ; [.16B2.0020.001D.1F138] # SQUARED LATIN CAPITAL LETTER I 1F178 ; [.16B2.0020.001D.1F178] # NEGATIVE SQUARED LATIN CAPITAL LETTER I 00ED ; [.16B2.0020.0002.0069][.0000.0032.0002.0301] # LATIN SMALL LETTER I WITH ACUTE 00CD ; [.16B2.0020.0008.0049][.0000.0032.0002.0301] # LATIN CAPITAL LETTER I WITH ACUTE 00EC ; [.16B2.0020.0002.0069][.0000.0035.0002.0300] # LATIN SMALL LETTER I WITH GRAVE 00CC ; [.16B2.0020.0008.0049][.0000.0035.0002.0300] # LATIN CAPITAL LETTER I WITH GRAVE 012D ; [.16B2.0020.0002.0069][.0000.0037.0002.0306] # LATIN SMALL LETTER I WITH BREVE 012C ; [.16B2.0020.0008.0049][.0000.0037.0002.0306] # LATIN CAPITAL LETTER I WITH BREVE 00EE ; [.16B2.0020.0002.0069][.0000.003C.0002.0302] # LATIN SMALL LETTER I WITH CIRCUMFLEX 00CE ; [.16B2.0020.0008.0049][.0000.003C.0002.0302] # LATIN CAPITAL LETTER I WITH CIRCUMFLEX 01D0 ; [.16B2.0020.0002.0069][.0000.0041.0002.030C] # LATIN SMALL LETTER I WITH CARON 01CF ; [.16B2.0020.0008.0049][.0000.0041.0002.030C] # LATIN CAPITAL LETTER I WITH CARON 00EF ; [.16B2.0020.0002.0069][.0000.0047.0002.0308] # LATIN SMALL LETTER I WITH DIAERESIS 00CF ; [.16B2.0020.0008.0049][.0000.0047.0002.0308] # LATIN CAPITAL LETTER I WITH DIAERESIS 1E2F ; [.16B2.0020.0002.0069][.0000.0047.0002.0308][.0000.0032.0002.0301] # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE 1E2E ; [.16B2.0020.0008.0049][.0000.0047.0002.0308][.0000.0032.0002.0301] # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE 0129 ; [.16B2.0020.0002.0069][.0000.004E.0002.0303] # LATIN SMALL LETTER I WITH TILDE 0128 ; [.16B2.0020.0008.0049][.0000.004E.0002.0303] # LATIN CAPITAL LETTER I WITH TILDE 0130 ; [.16B2.0020.0008.0049][.0000.0052.0002.0307] # LATIN CAPITAL LETTER I WITH DOT ABOVE 012F ; [.16B2.0020.0002.0069][.0000.0059.0002.0328] # LATIN SMALL LETTER I WITH OGONEK 012E ; [.16B2.0020.0008.0049][.0000.0059.0002.0328] # LATIN CAPITAL LETTER I WITH OGONEK 012B ; [.16B2.0020.0002.0069][.0000.005B.0002.0304] # LATIN SMALL LETTER I WITH MACRON 012A ; [.16B2.0020.0008.0049][.0000.005B.0002.0304] # LATIN CAPITAL LETTER I WITH MACRON 1EC9 ; [.16B2.0020.0002.0069][.0000.0064.0002.0309] # LATIN SMALL LETTER I WITH HOOK ABOVE 1EC8 ; [.16B2.0020.0008.0049][.0000.0064.0002.0309] # LATIN CAPITAL LETTER I WITH HOOK ABOVE 0209 ; [.16B2.0020.0002.0069][.0000.0065.0002.030F] # LATIN SMALL LETTER I WITH DOUBLE GRAVE 0208 ; [.16B2.0020.0008.0049][.0000.0065.0002.030F] # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE 020B ; [.16B2.0020.0002.0069][.0000.0067.0002.0311] # LATIN SMALL LETTER I WITH INVERTED BREVE 020A ; [.16B2.0020.0008.0049][.0000.0067.0002.0311] # LATIN CAPITAL LETTER I WITH INVERTED BREVE 1ECB ; [.16B2.0020.0002.0069][.0000.0070.0002.0323] # LATIN SMALL LETTER I WITH DOT BELOW 1ECA ; [.16B2.0020.0008.0049][.0000.0070.0002.0323] # LATIN CAPITAL LETTER I WITH DOT BELOW 1E2D ; [.16B2.0020.0002.0069][.0000.007A.0002.0330] # LATIN SMALL LETTER I WITH TILDE BELOW 1E2C ; [.16B2.0020.0008.0049][.0000.007A.0002.0330] # LATIN CAPITAL LETTER I WITH TILDE BELOW 1F18B ; [.16B2.0020.001D.1F18B][.1602.0020.001D.1F18B] # NEGATIVE SQUARED IC 1F194 ; [.16B2.0020.001D.1F194][.1616.0020.001D.1F194] # SQUARED ID 2171 ; [.16B2.0020.0004.2171][.16B2.0020.0004.2171] # SMALL ROMAN NUMERAL TWO 2161 ; [.16B2.0020.000A.2161][.16B2.0020.000A.2161] # ROMAN NUMERAL TWO 2172 ; [.16B2.0020.0004.2172][.16B2.0020.0004.2172][.16B2.0020.001F.2172] # SMALL ROMAN NUMERAL THREE 2162 ; [.16B2.0020.000A.2162][.16B2.0020.000A.2162][.16B2.0020.001F.2162] # ROMAN NUMERAL THREE 0133 ; [.16B2.0020.0004.0133][.16CB.0020.0004.0133] # LATIN SMALL LIGATURE IJ 0132 ; [.16B2.0020.000A.0132][.16CB.0020.000A.0132] # LATIN CAPITAL LIGATURE IJ 33CC ; [.16B2.0020.001C.33CC][.1734.0020.001C.33CC] # SQUARE IN 337A ; [.16B2.0020.001D.337A][.181B.0020.001D.337A] # SQUARE IU 2173 ; [.16B2.0020.0004.2173][.1844.0020.0004.2173] # SMALL ROMAN NUMERAL FOUR 2163 ; [.16B2.0020.000A.2163][.1844.0020.000A.2163] # ROMAN NUMERAL FOUR 2178 ; [.16B2.0020.0004.2178][.1860.0020.0004.2178] # SMALL ROMAN NUMERAL NINE 2168 ; [.16B2.0020.000A.2168][.1860.0020.000A.2168] # ROMAN NUMERAL NINE 0131 ; [.16B6.0020.0002.0131] # LATIN SMALL LETTER DOTLESS I 1D6A4 ; [.16B6.0020.0005.1D6A4] # MATHEMATICAL ITALIC SMALL DOTLESS I 026A ; [.16BA.0020.0002.026A] # LATIN LETTER SMALL CAPITAL I 1DA6 ; [.16BA.0020.0014.1DA6] # MODIFIER LETTER SMALL CAPITAL I A7FE ; [.16BE.0020.0002.A7FE] # LATIN EPIGRAPHIC LETTER I LONGA 1D09 ; [.16BF.0020.0002.1D09] # LATIN SMALL LETTER TURNED I 1D4E ; [.16BF.0020.0014.1D4E] # MODIFIER LETTER SMALL TURNED I 0268 ; [.16C0.0020.0002.0268] # LATIN SMALL LETTER I WITH STROKE 0197 ; [.16C0.0020.0008.0197] # LATIN CAPITAL LETTER I WITH STROKE 1DA4 ; [.16C0.0020.0014.1DA4] # MODIFIER LETTER SMALL I WITH STROKE 1D7B ; [.16C4.0020.0002.1D7B] # LATIN SMALL CAPITAL LETTER I WITH STROKE 1DA7 ; [.16C4.0020.0014.1DA7] # MODIFIER LETTER SMALL CAPITAL I WITH STROKE 1D96 ; [.16C5.0020.0002.1D96] # LATIN SMALL LETTER I WITH RETROFLEX HOOK 0269 ; [.16C6.0020.0002.0269] # LATIN SMALL LETTER IOTA 0196 ; [.16C6.0020.0008.0196] # LATIN CAPITAL LETTER IOTA 1DA5 ; [.16C6.0020.0014.1DA5] # MODIFIER LETTER SMALL IOTA 1D7C ; [.16CA.0020.0002.1D7C] # LATIN SMALL LETTER IOTA WITH STROKE 006A ; [.16CB.0020.0002.006A] # LATIN SMALL LETTER J FF4A ; [.16CB.0020.0003.FF4A] # FULLWIDTH LATIN SMALL LETTER J 24A5 ; [*02FB.0020.0004.24A5][.16CB.0020.0004.24A5][*02FC.0020.001F.24A5] # PARENTHESIZED LATIN SMALL LETTER J 2149 ; [.16CB.0020.0005.2149] # DOUBLE-STRUCK ITALIC SMALL J 1D423 ; [.16CB.0020.0005.1D423] # MATHEMATICAL BOLD SMALL J 1D457 ; [.16CB.0020.0005.1D457] # MATHEMATICAL ITALIC SMALL J 1D48B ; [.16CB.0020.0005.1D48B] # MATHEMATICAL BOLD ITALIC SMALL J 1D4BF ; [.16CB.0020.0005.1D4BF] # MATHEMATICAL SCRIPT SMALL J 1D4F3 ; [.16CB.0020.0005.1D4F3] # MATHEMATICAL BOLD SCRIPT SMALL J 1D527 ; [.16CB.0020.0005.1D527] # MATHEMATICAL FRAKTUR SMALL J 1D55B ; [.16CB.0020.0005.1D55B] # MATHEMATICAL DOUBLE-STRUCK SMALL J 1D58F ; [.16CB.0020.0005.1D58F] # MATHEMATICAL BOLD FRAKTUR SMALL J 1D5C3 ; [.16CB.0020.0005.1D5C3] # MATHEMATICAL SANS-SERIF SMALL J 1D5F7 ; [.16CB.0020.0005.1D5F7] # MATHEMATICAL SANS-SERIF BOLD SMALL J 1D62B ; [.16CB.0020.0005.1D62B] # MATHEMATICAL SANS-SERIF ITALIC SMALL J 1D65F ; [.16CB.0020.0005.1D65F] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J 1D693 ; [.16CB.0020.0005.1D693] # MATHEMATICAL MONOSPACE SMALL J 24D9 ; [.16CB.0020.0006.24D9] # CIRCLED LATIN SMALL LETTER J 004A ; [.16CB.0020.0008.004A] # LATIN CAPITAL LETTER J FF2A ; [.16CB.0020.0009.FF2A] # FULLWIDTH LATIN CAPITAL LETTER J 1F119 ; [*02FB.0020.0004.1F119][.16CB.0020.000A.1F119][*02FC.0020.001F.1F119] # PARENTHESIZED LATIN CAPITAL LETTER J 1F1EF ; [.16CB.0020.000A.1F1EF] # REGIONAL INDICATOR SYMBOL LETTER J 1D409 ; [.16CB.0020.000B.1D409] # MATHEMATICAL BOLD CAPITAL J 1D43D ; [.16CB.0020.000B.1D43D] # MATHEMATICAL ITALIC CAPITAL J 1D471 ; [.16CB.0020.000B.1D471] # MATHEMATICAL BOLD ITALIC CAPITAL J 1D4A5 ; [.16CB.0020.000B.1D4A5] # MATHEMATICAL SCRIPT CAPITAL J 1D4D9 ; [.16CB.0020.000B.1D4D9] # MATHEMATICAL BOLD SCRIPT CAPITAL J 1D50D ; [.16CB.0020.000B.1D50D] # MATHEMATICAL FRAKTUR CAPITAL J 1D541 ; [.16CB.0020.000B.1D541] # MATHEMATICAL DOUBLE-STRUCK CAPITAL J 1D575 ; [.16CB.0020.000B.1D575] # MATHEMATICAL BOLD FRAKTUR CAPITAL J 1D5A9 ; [.16CB.0020.000B.1D5A9] # MATHEMATICAL SANS-SERIF CAPITAL J 1D5DD ; [.16CB.0020.000B.1D5DD] # MATHEMATICAL SANS-SERIF BOLD CAPITAL J 1D611 ; [.16CB.0020.000B.1D611] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL J 1D645 ; [.16CB.0020.000B.1D645] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J 1D679 ; [.16CB.0020.000B.1D679] # MATHEMATICAL MONOSPACE CAPITAL J 24BF ; [.16CB.0020.000C.24BF] # CIRCLED LATIN CAPITAL LETTER J 1F159 ; [.16CB.0020.000C.1F159] # NEGATIVE CIRCLED LATIN CAPITAL LETTER J 02B2 ; [.16CB.0020.0014.02B2] # MODIFIER LETTER SMALL J 2C7C ; [.16CB.0020.0015.2C7C] # LATIN SUBSCRIPT SMALL LETTER J 1D36 ; [.16CB.0020.001D.1D36] # MODIFIER LETTER CAPITAL J 1F139 ; [.16CB.0020.001D.1F139] # SQUARED LATIN CAPITAL LETTER J 1F179 ; [.16CB.0020.001D.1F179] # NEGATIVE SQUARED LATIN CAPITAL LETTER J 0135 ; [.16CB.0020.0002.006A][.0000.003C.0002.0302] # LATIN SMALL LETTER J WITH CIRCUMFLEX 0134 ; [.16CB.0020.0008.004A][.0000.003C.0002.0302] # LATIN CAPITAL LETTER J WITH CIRCUMFLEX 01F0 ; [.16CB.0020.0002.006A][.0000.0041.0002.030C] # LATIN SMALL LETTER J WITH CARON 0237 ; [.16CF.0020.0002.0237] # LATIN SMALL LETTER DOTLESS J 1D6A5 ; [.16CF.0020.0005.1D6A5] # MATHEMATICAL ITALIC SMALL DOTLESS J 1D0A ; [.16D3.0020.0002.1D0A] # LATIN LETTER SMALL CAPITAL J 0249 ; [.16D4.0020.0002.0249] # LATIN SMALL LETTER J WITH STROKE 0248 ; [.16D4.0020.0008.0248] # LATIN CAPITAL LETTER J WITH STROKE 029D ; [.16D8.0020.0002.029D] # LATIN SMALL LETTER J WITH CROSSED-TAIL 1DA8 ; [.16D8.0020.0014.1DA8] # MODIFIER LETTER SMALL J WITH CROSSED-TAIL 025F ; [.16DC.0020.0002.025F] # LATIN SMALL LETTER DOTLESS J WITH STROKE 1DA1 ; [.16DC.0020.0014.1DA1] # MODIFIER LETTER SMALL DOTLESS J WITH STROKE 0284 ; [.16E0.0020.0002.0284] # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK 006B ; [.16E4.0020.0002.006B] # LATIN SMALL LETTER K FF4B ; [.16E4.0020.0003.FF4B] # FULLWIDTH LATIN SMALL LETTER K 1DDC ; [.16E4.0020.0004.1DDC] # COMBINING LATIN SMALL LETTER K 24A6 ; [*02FB.0020.0004.24A6][.16E4.0020.0004.24A6][*02FC.0020.001F.24A6] # PARENTHESIZED LATIN SMALL LETTER K 1D424 ; [.16E4.0020.0005.1D424] # MATHEMATICAL BOLD SMALL K 1D458 ; [.16E4.0020.0005.1D458] # MATHEMATICAL ITALIC SMALL K 1D48C ; [.16E4.0020.0005.1D48C] # MATHEMATICAL BOLD ITALIC SMALL K 1D4C0 ; [.16E4.0020.0005.1D4C0] # MATHEMATICAL SCRIPT SMALL K 1D4F4 ; [.16E4.0020.0005.1D4F4] # MATHEMATICAL BOLD SCRIPT SMALL K 1D528 ; [.16E4.0020.0005.1D528] # MATHEMATICAL FRAKTUR SMALL K 1D55C ; [.16E4.0020.0005.1D55C] # MATHEMATICAL DOUBLE-STRUCK SMALL K 1D590 ; [.16E4.0020.0005.1D590] # MATHEMATICAL BOLD FRAKTUR SMALL K 1D5C4 ; [.16E4.0020.0005.1D5C4] # MATHEMATICAL SANS-SERIF SMALL K 1D5F8 ; [.16E4.0020.0005.1D5F8] # MATHEMATICAL SANS-SERIF BOLD SMALL K 1D62C ; [.16E4.0020.0005.1D62C] # MATHEMATICAL SANS-SERIF ITALIC SMALL K 1D660 ; [.16E4.0020.0005.1D660] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K 1D694 ; [.16E4.0020.0005.1D694] # MATHEMATICAL MONOSPACE SMALL K 24DA ; [.16E4.0020.0006.24DA] # CIRCLED LATIN SMALL LETTER K 004B ; [.16E4.0020.0008.004B] # LATIN CAPITAL LETTER K 212A ; [.16E4.0020.0008.212A] # KELVIN SIGN FF2B ; [.16E4.0020.0009.FF2B] # FULLWIDTH LATIN CAPITAL LETTER K 1F11A ; [*02FB.0020.0004.1F11A][.16E4.0020.000A.1F11A][*02FC.0020.001F.1F11A] # PARENTHESIZED LATIN CAPITAL LETTER K 1F1F0 ; [.16E4.0020.000A.1F1F0] # REGIONAL INDICATOR SYMBOL LETTER K 1D40A ; [.16E4.0020.000B.1D40A] # MATHEMATICAL BOLD CAPITAL K 1D43E ; [.16E4.0020.000B.1D43E] # MATHEMATICAL ITALIC CAPITAL K 1D472 ; [.16E4.0020.000B.1D472] # MATHEMATICAL BOLD ITALIC CAPITAL K 1D4A6 ; [.16E4.0020.000B.1D4A6] # MATHEMATICAL SCRIPT CAPITAL K 1D4DA ; [.16E4.0020.000B.1D4DA] # MATHEMATICAL BOLD SCRIPT CAPITAL K 1D50E ; [.16E4.0020.000B.1D50E] # MATHEMATICAL FRAKTUR CAPITAL K 1D542 ; [.16E4.0020.000B.1D542] # MATHEMATICAL DOUBLE-STRUCK CAPITAL K 1D576 ; [.16E4.0020.000B.1D576] # MATHEMATICAL BOLD FRAKTUR CAPITAL K 1D5AA ; [.16E4.0020.000B.1D5AA] # MATHEMATICAL SANS-SERIF CAPITAL K 1D5DE ; [.16E4.0020.000B.1D5DE] # MATHEMATICAL SANS-SERIF BOLD CAPITAL K 1D612 ; [.16E4.0020.000B.1D612] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL K 1D646 ; [.16E4.0020.000B.1D646] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K 1D67A ; [.16E4.0020.000B.1D67A] # MATHEMATICAL MONOSPACE CAPITAL K 24C0 ; [.16E4.0020.000C.24C0] # CIRCLED LATIN CAPITAL LETTER K 1F15A ; [.16E4.0020.000C.1F15A] # NEGATIVE CIRCLED LATIN CAPITAL LETTER K 1D4F ; [.16E4.0020.0014.1D4F] # MODIFIER LETTER SMALL K 2096 ; [.16E4.0020.0015.2096] # LATIN SUBSCRIPT SMALL LETTER K 1D37 ; [.16E4.0020.001D.1D37] # MODIFIER LETTER CAPITAL K 1F13A ; [.16E4.0020.001D.1F13A] # SQUARED LATIN CAPITAL LETTER K 1F17A ; [.16E4.0020.001D.1F17A] # NEGATIVE SQUARED LATIN CAPITAL LETTER K 1E31 ; [.16E4.0020.0002.006B][.0000.0032.0002.0301] # LATIN SMALL LETTER K WITH ACUTE 1E30 ; [.16E4.0020.0008.004B][.0000.0032.0002.0301] # LATIN CAPITAL LETTER K WITH ACUTE 01E9 ; [.16E4.0020.0002.006B][.0000.0041.0002.030C] # LATIN SMALL LETTER K WITH CARON 01E8 ; [.16E4.0020.0008.004B][.0000.0041.0002.030C] # LATIN CAPITAL LETTER K WITH CARON 0137 ; [.16E4.0020.0002.006B][.0000.0056.0002.0327] # LATIN SMALL LETTER K WITH CEDILLA 0136 ; [.16E4.0020.0008.004B][.0000.0056.0002.0327] # LATIN CAPITAL LETTER K WITH CEDILLA A7A3 ; [.16E4.0020.0004.A7A3][.0000.0061.0004.A7A3] # LATIN SMALL LETTER K WITH OBLIQUE STROKE A7A2 ; [.16E4.0020.000A.A7A2][.0000.0061.0004.A7A2] # LATIN CAPITAL LETTER K WITH OBLIQUE STROKE 1E33 ; [.16E4.0020.0002.006B][.0000.0070.0002.0323] # LATIN SMALL LETTER K WITH DOT BELOW 1E32 ; [.16E4.0020.0008.004B][.0000.0070.0002.0323] # LATIN CAPITAL LETTER K WITH DOT BELOW 1E35 ; [.16E4.0020.0002.006B][.0000.007B.0002.0331] # LATIN SMALL LETTER K WITH LINE BELOW 1E34 ; [.16E4.0020.0008.004B][.0000.007B.0002.0331] # LATIN CAPITAL LETTER K WITH LINE BELOW 3384 ; [.16E4.0020.001C.3384][.15D4.0020.001D.3384] # SQUARE KA 3385 ; [.16E4.0020.001D.3385][.15EA.0020.001D.3385] # SQUARE KB 3389 ; [.16E4.0020.001C.3389][.1602.0020.001C.3389][.15D4.0020.001F.3389][.16F6.0020.001F.3389] # SQUARE KCAL 338F ; [.16E4.0020.001C.338F][.1676.0020.001C.338F] # SQUARE KG 3391 ; [.16E4.0020.001C.3391][.1699.0020.001D.3391][.187A.0020.001F.3391] # SQUARE KHZ 33CD ; [.16E4.0020.001D.33CD][.16E4.0020.001D.33CD] # SQUARE KK 3398 ; [.16E4.0020.001C.3398][.16F6.0020.001C.3398] # SQUARE KL 339E ; [.16E4.0020.001C.339E][.1726.0020.001C.339E] # SQUARE KM 33CE ; [.16E4.0020.001D.33CE][.1726.0020.001D.33CE] # SQUARE KM CAPITAL 33A2 ; [.16E4.0020.001C.33A2][.1726.0020.001C.33A2][.15CC.0020.001F.33A2] # SQUARE KM SQUARED 33A6 ; [.16E4.0020.001C.33A6][.1726.0020.001C.33A6][.15CD.0020.001F.33A6] # SQUARE KM CUBED 33AA ; [.16E4.0020.001C.33AA][.177B.0020.001D.33AA][.15D4.0020.001F.33AA] # SQUARE KPA 33CF ; [.16E4.0020.001C.33CF][.17FB.0020.001C.33CF] # SQUARE KT 33B8 ; [.16E4.0020.001C.33B8][.1844.0020.001D.33B8] # SQUARE KV 33BE ; [.16E4.0020.001C.33BE][.1856.0020.001D.33BE] # SQUARE KW 33C0 ; [.16E4.0020.001C.33C0][.1936.0020.001D.33C0] # SQUARE K OHM 1D0B ; [.16E8.0020.0002.1D0B] # LATIN LETTER SMALL CAPITAL K 1D84 ; [.16E9.0020.0002.1D84] # LATIN SMALL LETTER K WITH PALATAL HOOK 0199 ; [.16EA.0020.0002.0199] # LATIN SMALL LETTER K WITH HOOK 0198 ; [.16EA.0020.0008.0198] # LATIN CAPITAL LETTER K WITH HOOK 2C6A ; [.16EE.0020.0002.2C6A] # LATIN SMALL LETTER K WITH DESCENDER 2C69 ; [.16EE.0020.0008.2C69] # LATIN CAPITAL LETTER K WITH DESCENDER A741 ; [.16EF.0020.0002.A741] # LATIN SMALL LETTER K WITH STROKE A740 ; [.16EF.0020.0008.A740] # LATIN CAPITAL LETTER K WITH STROKE A743 ; [.16F0.0020.0002.A743] # LATIN SMALL LETTER K WITH DIAGONAL STROKE A742 ; [.16F0.0020.0008.A742] # LATIN CAPITAL LETTER K WITH DIAGONAL STROKE A745 ; [.16F1.0020.0002.A745] # LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE A744 ; [.16F1.0020.0008.A744] # LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE 029E ; [.16F2.0020.0002.029E] # LATIN SMALL LETTER TURNED K 006C ; [.16F6.0020.0002.006C] # LATIN SMALL LETTER L FF4C ; [.16F6.0020.0003.FF4C] # FULLWIDTH LATIN SMALL LETTER L 1DDD ; [.16F6.0020.0004.1DDD] # COMBINING LATIN SMALL LETTER L 217C ; [.16F6.0020.0004.217C] # SMALL ROMAN NUMERAL FIFTY 24A7 ; [*02FB.0020.0004.24A7][.16F6.0020.0004.24A7][*02FC.0020.001F.24A7] # PARENTHESIZED LATIN SMALL LETTER L 2113 ; [.16F6.0020.0005.2113] # SCRIPT SMALL L 1D425 ; [.16F6.0020.0005.1D425] # MATHEMATICAL BOLD SMALL L 1D459 ; [.16F6.0020.0005.1D459] # MATHEMATICAL ITALIC SMALL L 1D48D ; [.16F6.0020.0005.1D48D] # MATHEMATICAL BOLD ITALIC SMALL L 1D4C1 ; [.16F6.0020.0005.1D4C1] # MATHEMATICAL SCRIPT SMALL L 1D4F5 ; [.16F6.0020.0005.1D4F5] # MATHEMATICAL BOLD SCRIPT SMALL L 1D529 ; [.16F6.0020.0005.1D529] # MATHEMATICAL FRAKTUR SMALL L 1D55D ; [.16F6.0020.0005.1D55D] # MATHEMATICAL DOUBLE-STRUCK SMALL L 1D591 ; [.16F6.0020.0005.1D591] # MATHEMATICAL BOLD FRAKTUR SMALL L 1D5C5 ; [.16F6.0020.0005.1D5C5] # MATHEMATICAL SANS-SERIF SMALL L 1D5F9 ; [.16F6.0020.0005.1D5F9] # MATHEMATICAL SANS-SERIF BOLD SMALL L 1D62D ; [.16F6.0020.0005.1D62D] # MATHEMATICAL SANS-SERIF ITALIC SMALL L 1D661 ; [.16F6.0020.0005.1D661] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L 1D695 ; [.16F6.0020.0005.1D695] # MATHEMATICAL MONOSPACE SMALL L 24DB ; [.16F6.0020.0006.24DB] # CIRCLED LATIN SMALL LETTER L 004C ; [.16F6.0020.0008.004C] # LATIN CAPITAL LETTER L FF2C ; [.16F6.0020.0009.FF2C] # FULLWIDTH LATIN CAPITAL LETTER L 216C ; [.16F6.0020.000A.216C] # ROMAN NUMERAL FIFTY 1F11B ; [*02FB.0020.0004.1F11B][.16F6.0020.000A.1F11B][*02FC.0020.001F.1F11B] # PARENTHESIZED LATIN CAPITAL LETTER L 1F1F1 ; [.16F6.0020.000A.1F1F1] # REGIONAL INDICATOR SYMBOL LETTER L 2112 ; [.16F6.0020.000B.2112] # SCRIPT CAPITAL L 1D40B ; [.16F6.0020.000B.1D40B] # MATHEMATICAL BOLD CAPITAL L 1D43F ; [.16F6.0020.000B.1D43F] # MATHEMATICAL ITALIC CAPITAL L 1D473 ; [.16F6.0020.000B.1D473] # MATHEMATICAL BOLD ITALIC CAPITAL L 1D4DB ; [.16F6.0020.000B.1D4DB] # MATHEMATICAL BOLD SCRIPT CAPITAL L 1D50F ; [.16F6.0020.000B.1D50F] # MATHEMATICAL FRAKTUR CAPITAL L 1D543 ; [.16F6.0020.000B.1D543] # MATHEMATICAL DOUBLE-STRUCK CAPITAL L 1D577 ; [.16F6.0020.000B.1D577] # MATHEMATICAL BOLD FRAKTUR CAPITAL L 1D5AB ; [.16F6.0020.000B.1D5AB] # MATHEMATICAL SANS-SERIF CAPITAL L 1D5DF ; [.16F6.0020.000B.1D5DF] # MATHEMATICAL SANS-SERIF BOLD CAPITAL L 1D613 ; [.16F6.0020.000B.1D613] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL L 1D647 ; [.16F6.0020.000B.1D647] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L 1D67B ; [.16F6.0020.000B.1D67B] # MATHEMATICAL MONOSPACE CAPITAL L 24C1 ; [.16F6.0020.000C.24C1] # CIRCLED LATIN CAPITAL LETTER L 1F15B ; [.16F6.0020.000C.1F15B] # NEGATIVE CIRCLED LATIN CAPITAL LETTER L 02E1 ; [.16F6.0020.0014.02E1] # MODIFIER LETTER SMALL L 2097 ; [.16F6.0020.0015.2097] # LATIN SUBSCRIPT SMALL LETTER L 1D38 ; [.16F6.0020.001D.1D38] # MODIFIER LETTER CAPITAL L 1F13B ; [.16F6.0020.001D.1F13B] # SQUARED LATIN CAPITAL LETTER L 1F17B ; [.16F6.0020.001D.1F17B] # NEGATIVE SQUARED LATIN CAPITAL LETTER L 013A ; [.16F6.0020.0002.006C][.0000.0032.0002.0301] # LATIN SMALL LETTER L WITH ACUTE 0139 ; [.16F6.0020.0008.004C][.0000.0032.0002.0301] # LATIN CAPITAL LETTER L WITH ACUTE 013E ; [.16F6.0020.0002.006C][.0000.0041.0002.030C] # LATIN SMALL LETTER L WITH CARON 013D ; [.16F6.0020.0008.004C][.0000.0041.0002.030C] # LATIN CAPITAL LETTER L WITH CARON 013C ; [.16F6.0020.0002.006C][.0000.0056.0002.0327] # LATIN SMALL LETTER L WITH CEDILLA 013B ; [.16F6.0020.0008.004C][.0000.0056.0002.0327] # LATIN CAPITAL LETTER L WITH CEDILLA 1E37 ; [.16F6.0020.0002.006C][.0000.0070.0002.0323] # LATIN SMALL LETTER L WITH DOT BELOW 1E36 ; [.16F6.0020.0008.004C][.0000.0070.0002.0323] # LATIN CAPITAL LETTER L WITH DOT BELOW 1E39 ; [.16F6.0020.0002.006C][.0000.0070.0002.0323][.0000.005B.0002.0304] # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON 1E38 ; [.16F6.0020.0008.004C][.0000.0070.0002.0323][.0000.005B.0002.0304] # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON 1E3D ; [.16F6.0020.0002.006C][.0000.0078.0002.032D] # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW 1E3C ; [.16F6.0020.0008.004C][.0000.0078.0002.032D] # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW 1E3B ; [.16F6.0020.0002.006C][.0000.007B.0002.0331] # LATIN SMALL LETTER L WITH LINE BELOW 1E3A ; [.16F6.0020.0008.004C][.0000.007B.0002.0331] # LATIN CAPITAL LETTER L WITH LINE BELOW 0142 ; [.16F6.0020.0002.006C][.0000.007D.0002.0335] # LATIN SMALL LETTER L WITH STROKE 0141 ; [.16F6.0020.0008.004C][.0000.007D.0002.0335] # LATIN CAPITAL LETTER L WITH STROKE 0140 ; [.16F6.0020.0002.0140][.0000.0139.0002.0140] # LATIN SMALL LETTER L WITH MIDDLE DOT 006C 00B7 ; [.16F6.0020.0002.0140][.0000.0139.0002.0140] # LATIN SMALL LETTER L WITH MIDDLE DOT 006C 0387 ; [.16F6.0020.0002.0140][.0000.0139.0002.0140] # LATIN SMALL LETTER L WITH MIDDLE DOT 013F ; [.16F6.0020.0008.013F][.0000.0139.0002.013F] # LATIN CAPITAL LETTER L WITH MIDDLE DOT 004C 00B7 ; [.16F6.0020.0008.013F][.0000.0139.0002.013F] # LATIN CAPITAL LETTER L WITH MIDDLE DOT 004C 0387 ; [.16F6.0020.0008.013F][.0000.0139.0002.013F] # LATIN CAPITAL LETTER L WITH MIDDLE DOT 01C9 ; [.16F6.0020.0004.01C9][.16CB.0020.0004.01C9] # LATIN SMALL LETTER LJ 01C8 ; [.16F6.0020.000A.01C8][.16CB.0020.0004.01C8] # LATIN CAPITAL LETTER L WITH SMALL LETTER J 01C7 ; [.16F6.0020.000A.01C7][.16CB.0020.000A.01C7] # LATIN CAPITAL LETTER LJ 1EFB ; [.16F6.0020.0004.1EFB][.16F6.0020.0004.1EFB] # LATIN SMALL LETTER MIDDLE-WELSH LL 1EFA ; [.16F6.0020.000A.1EFA][.16F6.0020.000A.1EFA] # LATIN CAPITAL LETTER MIDDLE-WELSH LL 33D0 ; [.16F6.0020.001C.33D0][.1726.0020.001C.33D0] # SQUARE LM 33D1 ; [.16F6.0020.001C.33D1][.1734.0020.001C.33D1] # SQUARE LN 33D2 ; [.16F6.0020.001C.33D2][.1756.0020.001C.33D2][.1676.0020.001F.33D2] # SQUARE LOG 02AA ; [.16F6.0020.0004.02AA][.17D8.0020.0004.02AA] # LATIN SMALL LETTER LS DIGRAPH 32CF ; [.16F6.0020.001D.32CF][.17FB.0020.001D.32CF][.1616.0020.001F.32CF] # LIMITED LIABILITY SIGN 33D3 ; [.16F6.0020.001C.33D3][.1860.0020.001C.33D3] # SQUARE LX 02AB ; [.16F6.0020.0004.02AB][.187A.0020.0004.02AB] # LATIN SMALL LETTER LZ DIGRAPH 029F ; [.16FA.0020.0002.029F] # LATIN LETTER SMALL CAPITAL L 1DDE ; [.16FA.0020.0004.1DDE] # COMBINING LATIN LETTER SMALL CAPITAL L 1DAB ; [.16FA.0020.0014.1DAB] # MODIFIER LETTER SMALL CAPITAL L A747 ; [.16FE.0020.0002.A747] # LATIN SMALL LETTER BROKEN L A746 ; [.16FE.0020.0008.A746] # LATIN CAPITAL LETTER BROKEN L 1D0C ; [.16FF.0020.0002.1D0C] # LATIN LETTER SMALL CAPITAL L WITH STROKE A749 ; [.1700.0020.0002.A749] # LATIN SMALL LETTER L WITH HIGH STROKE A748 ; [.1700.0020.0008.A748] # LATIN CAPITAL LETTER L WITH HIGH STROKE 019A ; [.1701.0020.0002.019A] # LATIN SMALL LETTER L WITH BAR 023D ; [.1701.0020.0008.023D] # LATIN CAPITAL LETTER L WITH BAR 2C61 ; [.1705.0020.0002.2C61] # LATIN SMALL LETTER L WITH DOUBLE BAR 2C60 ; [.1705.0020.0008.2C60] # LATIN CAPITAL LETTER L WITH DOUBLE BAR 026B ; [.1706.0020.0002.026B] # LATIN SMALL LETTER L WITH MIDDLE TILDE 2C62 ; [.1706.0020.0008.2C62] # LATIN CAPITAL LETTER L WITH MIDDLE TILDE 026C ; [.170A.0020.0002.026C] # LATIN SMALL LETTER L WITH BELT 1D85 ; [.170E.0020.0002.1D85] # LATIN SMALL LETTER L WITH PALATAL HOOK 1DAA ; [.170E.0020.0014.1DAA] # MODIFIER LETTER SMALL L WITH PALATAL HOOK 026D ; [.170F.0020.0002.026D] # LATIN SMALL LETTER L WITH RETROFLEX HOOK 1DA9 ; [.170F.0020.0014.1DA9] # MODIFIER LETTER SMALL L WITH RETROFLEX HOOK A78E ; [.1713.0020.0002.A78E] # LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT 0234 ; [.1714.0020.0002.0234] # LATIN SMALL LETTER L WITH CURL A772 ; [.1718.0020.0002.A772] # LATIN SMALL LETTER LUM 026E ; [.1719.0020.0002.026E] # LATIN SMALL LETTER LEZH A781 ; [.171D.0020.0002.A781] # LATIN SMALL LETTER TURNED L A780 ; [.171D.0020.0008.A780] # LATIN CAPITAL LETTER TURNED L 019B ; [.171E.0020.0002.019B] # LATIN SMALL LETTER LAMBDA WITH STROKE 028E ; [.1722.0020.0002.028E] # LATIN SMALL LETTER TURNED Y 006D ; [.1726.0020.0002.006D] # LATIN SMALL LETTER M FF4D ; [.1726.0020.0003.FF4D] # FULLWIDTH LATIN SMALL LETTER M 036B ; [.1726.0020.0004.036B] # COMBINING LATIN SMALL LETTER M 217F ; [.1726.0020.0004.217F] # SMALL ROMAN NUMERAL ONE THOUSAND 24A8 ; [*02FB.0020.0004.24A8][.1726.0020.0004.24A8][*02FC.0020.001F.24A8] # PARENTHESIZED LATIN SMALL LETTER M 1D426 ; [.1726.0020.0005.1D426] # MATHEMATICAL BOLD SMALL M 1D45A ; [.1726.0020.0005.1D45A] # MATHEMATICAL ITALIC SMALL M 1D48E ; [.1726.0020.0005.1D48E] # MATHEMATICAL BOLD ITALIC SMALL M 1D4C2 ; [.1726.0020.0005.1D4C2] # MATHEMATICAL SCRIPT SMALL M 1D4F6 ; [.1726.0020.0005.1D4F6] # MATHEMATICAL BOLD SCRIPT SMALL M 1D52A ; [.1726.0020.0005.1D52A] # MATHEMATICAL FRAKTUR SMALL M 1D55E ; [.1726.0020.0005.1D55E] # MATHEMATICAL DOUBLE-STRUCK SMALL M 1D592 ; [.1726.0020.0005.1D592] # MATHEMATICAL BOLD FRAKTUR SMALL M 1D5C6 ; [.1726.0020.0005.1D5C6] # MATHEMATICAL SANS-SERIF SMALL M 1D5FA ; [.1726.0020.0005.1D5FA] # MATHEMATICAL SANS-SERIF BOLD SMALL M 1D62E ; [.1726.0020.0005.1D62E] # MATHEMATICAL SANS-SERIF ITALIC SMALL M 1D662 ; [.1726.0020.0005.1D662] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M 1D696 ; [.1726.0020.0005.1D696] # MATHEMATICAL MONOSPACE SMALL M 24DC ; [.1726.0020.0006.24DC] # CIRCLED LATIN SMALL LETTER M 004D ; [.1726.0020.0008.004D] # LATIN CAPITAL LETTER M FF2D ; [.1726.0020.0009.FF2D] # FULLWIDTH LATIN CAPITAL LETTER M 216F ; [.1726.0020.000A.216F] # ROMAN NUMERAL ONE THOUSAND 1F11C ; [*02FB.0020.0004.1F11C][.1726.0020.000A.1F11C][*02FC.0020.001F.1F11C] # PARENTHESIZED LATIN CAPITAL LETTER M 1F1F2 ; [.1726.0020.000A.1F1F2] # REGIONAL INDICATOR SYMBOL LETTER M 2133 ; [.1726.0020.000B.2133] # SCRIPT CAPITAL M 1D40C ; [.1726.0020.000B.1D40C] # MATHEMATICAL BOLD CAPITAL M 1D440 ; [.1726.0020.000B.1D440] # MATHEMATICAL ITALIC CAPITAL M 1D474 ; [.1726.0020.000B.1D474] # MATHEMATICAL BOLD ITALIC CAPITAL M 1D4DC ; [.1726.0020.000B.1D4DC] # MATHEMATICAL BOLD SCRIPT CAPITAL M 1D510 ; [.1726.0020.000B.1D510] # MATHEMATICAL FRAKTUR CAPITAL M 1D544 ; [.1726.0020.000B.1D544] # MATHEMATICAL DOUBLE-STRUCK CAPITAL M 1D578 ; [.1726.0020.000B.1D578] # MATHEMATICAL BOLD FRAKTUR CAPITAL M 1D5AC ; [.1726.0020.000B.1D5AC] # MATHEMATICAL SANS-SERIF CAPITAL M 1D5E0 ; [.1726.0020.000B.1D5E0] # MATHEMATICAL SANS-SERIF BOLD CAPITAL M 1D614 ; [.1726.0020.000B.1D614] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL M 1D648 ; [.1726.0020.000B.1D648] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M 1D67C ; [.1726.0020.000B.1D67C] # MATHEMATICAL MONOSPACE CAPITAL M 24C2 ; [.1726.0020.000C.24C2] # CIRCLED LATIN CAPITAL LETTER M 1F15C ; [.1726.0020.000C.1F15C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER M 1D50 ; [.1726.0020.0014.1D50] # MODIFIER LETTER SMALL M 2098 ; [.1726.0020.0015.2098] # LATIN SUBSCRIPT SMALL LETTER M 1D39 ; [.1726.0020.001D.1D39] # MODIFIER LETTER CAPITAL M 1F13C ; [.1726.0020.001D.1F13C] # SQUARED LATIN CAPITAL LETTER M 1F17C ; [.1726.0020.001D.1F17C] # NEGATIVE SQUARED LATIN CAPITAL LETTER M 1E3F ; [.1726.0020.0002.006D][.0000.0032.0002.0301] # LATIN SMALL LETTER M WITH ACUTE 1E3E ; [.1726.0020.0008.004D][.0000.0032.0002.0301] # LATIN CAPITAL LETTER M WITH ACUTE 1E41 ; [.1726.0020.0002.006D][.0000.0052.0002.0307] # LATIN SMALL LETTER M WITH DOT ABOVE 1E40 ; [.1726.0020.0008.004D][.0000.0052.0002.0307] # LATIN CAPITAL LETTER M WITH DOT ABOVE 1E43 ; [.1726.0020.0002.006D][.0000.0070.0002.0323] # LATIN SMALL LETTER M WITH DOT BELOW 1E42 ; [.1726.0020.0008.004D][.0000.0070.0002.0323] # LATIN CAPITAL LETTER M WITH DOT BELOW 33A1 ; [.1726.0020.001C.33A1][.15CC.0020.001C.33A1] # SQUARE M SQUARED 33A5 ; [.1726.0020.001C.33A5][.15CD.0020.001C.33A5] # SQUARE M CUBED 3383 ; [.1726.0020.001C.3383][.15D4.0020.001D.3383] # SQUARE MA 33D4 ; [.1726.0020.001C.33D4][.15EA.0020.001C.33D4] # SQUARE MB SMALL 3386 ; [.1726.0020.001D.3386][.15EA.0020.001D.3386] # SQUARE MB 1F16A ; [.1726.0020.0014.1F16A][.1602.0020.0014.1F16A] # RAISED MC SIGN 1F16B ; [.1726.0020.0014.1F16B][.1616.0020.0014.1F16B] # RAISED MD SIGN 338E ; [.1726.0020.001C.338E][.1676.0020.001C.338E] # SQUARE MG 3392 ; [.1726.0020.001D.3392][.1699.0020.001D.3392][.187A.0020.001F.3392] # SQUARE MHZ 33D5 ; [.1726.0020.001C.33D5][.16B2.0020.001C.33D5][.16F6.0020.001F.33D5] # SQUARE MIL 3396 ; [.1726.0020.001C.3396][.16F6.0020.001C.3396] # SQUARE ML 339C ; [.1726.0020.001C.339C][.1726.0020.001C.339C] # SQUARE MM 339F ; [.1726.0020.001C.339F][.1726.0020.001C.339F][.15CC.0020.001F.339F] # SQUARE MM SQUARED 33A3 ; [.1726.0020.001C.33A3][.1726.0020.001C.33A3][.15CD.0020.001F.33A3] # SQUARE MM CUBED 33D6 ; [.1726.0020.001C.33D6][.1756.0020.001C.33D6][.16F6.0020.001F.33D6] # SQUARE MOL 33AB ; [.1726.0020.001D.33AB][.177B.0020.001D.33AB][.15D4.0020.001F.33AB] # SQUARE MPA 33B3 ; [.1726.0020.001C.33B3][.17D8.0020.001C.33B3] # SQUARE MS 33A7 ; [.1726.0020.001C.33A7][*05AB.0020.001C.33A7][.17D8.0020.001F.33A7] # SQUARE M OVER S 33A8 ; [.1726.0020.001C.33A8][*05AB.0020.001C.33A8][.17D8.0020.001F.33A8][.15CC.0020.001F.33A8] # SQUARE M OVER S SQUARED 33B7 ; [.1726.0020.001C.33B7][.1844.0020.001D.33B7] # SQUARE MV 33B9 ; [.1726.0020.001D.33B9][.1844.0020.001D.33B9] # SQUARE MV MEGA 1F14B ; [.1726.0020.001D.1F14B][.1844.0020.001D.1F14B] # SQUARED MV 33BD ; [.1726.0020.001C.33BD][.1856.0020.001D.33BD] # SQUARE MW 33BF ; [.1726.0020.001D.33BF][.1856.0020.001D.33BF] # SQUARE MW MEGA 33C1 ; [.1726.0020.001D.33C1][.1936.0020.001D.33C1] # SQUARE M OHM 1D0D ; [.172A.0020.0002.1D0D] # LATIN LETTER SMALL CAPITAL M 1DDF ; [.172A.0020.0004.1DDF] # COMBINING LATIN LETTER SMALL CAPITAL M 1D6F ; [.172B.0020.0002.1D6F] # LATIN SMALL LETTER M WITH MIDDLE TILDE 1D86 ; [.172C.0020.0002.1D86] # LATIN SMALL LETTER M WITH PALATAL HOOK 0271 ; [.172D.0020.0002.0271] # LATIN SMALL LETTER M WITH HOOK 2C6E ; [.172D.0020.0008.2C6E] # LATIN CAPITAL LETTER M WITH HOOK 1DAC ; [.172D.0020.0014.1DAC] # MODIFIER LETTER SMALL M WITH HOOK A7FD ; [.1731.0020.0002.A7FD] # LATIN EPIGRAPHIC LETTER INVERTED M A7FF ; [.1732.0020.0002.A7FF] # LATIN EPIGRAPHIC LETTER ARCHAIC M A773 ; [.1733.0020.0002.A773] # LATIN SMALL LETTER MUM 006E ; [.1734.0020.0002.006E] # LATIN SMALL LETTER N FF4E ; [.1734.0020.0003.FF4E] # FULLWIDTH LATIN SMALL LETTER N 1DE0 ; [.1734.0020.0004.1DE0] # COMBINING LATIN SMALL LETTER N 24A9 ; [*02FB.0020.0004.24A9][.1734.0020.0004.24A9][*02FC.0020.001F.24A9] # PARENTHESIZED LATIN SMALL LETTER N 1D427 ; [.1734.0020.0005.1D427] # MATHEMATICAL BOLD SMALL N 1D45B ; [.1734.0020.0005.1D45B] # MATHEMATICAL ITALIC SMALL N 1D48F ; [.1734.0020.0005.1D48F] # MATHEMATICAL BOLD ITALIC SMALL N 1D4C3 ; [.1734.0020.0005.1D4C3] # MATHEMATICAL SCRIPT SMALL N 1D4F7 ; [.1734.0020.0005.1D4F7] # MATHEMATICAL BOLD SCRIPT SMALL N 1D52B ; [.1734.0020.0005.1D52B] # MATHEMATICAL FRAKTUR SMALL N 1D55F ; [.1734.0020.0005.1D55F] # MATHEMATICAL DOUBLE-STRUCK SMALL N 1D593 ; [.1734.0020.0005.1D593] # MATHEMATICAL BOLD FRAKTUR SMALL N 1D5C7 ; [.1734.0020.0005.1D5C7] # MATHEMATICAL SANS-SERIF SMALL N 1D5FB ; [.1734.0020.0005.1D5FB] # MATHEMATICAL SANS-SERIF BOLD SMALL N 1D62F ; [.1734.0020.0005.1D62F] # MATHEMATICAL SANS-SERIF ITALIC SMALL N 1D663 ; [.1734.0020.0005.1D663] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N 1D697 ; [.1734.0020.0005.1D697] # MATHEMATICAL MONOSPACE SMALL N 24DD ; [.1734.0020.0006.24DD] # CIRCLED LATIN SMALL LETTER N 004E ; [.1734.0020.0008.004E] # LATIN CAPITAL LETTER N FF2E ; [.1734.0020.0009.FF2E] # FULLWIDTH LATIN CAPITAL LETTER N 1F11D ; [*02FB.0020.0004.1F11D][.1734.0020.000A.1F11D][*02FC.0020.001F.1F11D] # PARENTHESIZED LATIN CAPITAL LETTER N 1F1F3 ; [.1734.0020.000A.1F1F3] # REGIONAL INDICATOR SYMBOL LETTER N 2115 ; [.1734.0020.000B.2115] # DOUBLE-STRUCK CAPITAL N 1D40D ; [.1734.0020.000B.1D40D] # MATHEMATICAL BOLD CAPITAL N 1D441 ; [.1734.0020.000B.1D441] # MATHEMATICAL ITALIC CAPITAL N 1D475 ; [.1734.0020.000B.1D475] # MATHEMATICAL BOLD ITALIC CAPITAL N 1D4A9 ; [.1734.0020.000B.1D4A9] # MATHEMATICAL SCRIPT CAPITAL N 1D4DD ; [.1734.0020.000B.1D4DD] # MATHEMATICAL BOLD SCRIPT CAPITAL N 1D511 ; [.1734.0020.000B.1D511] # MATHEMATICAL FRAKTUR CAPITAL N 1D579 ; [.1734.0020.000B.1D579] # MATHEMATICAL BOLD FRAKTUR CAPITAL N 1D5AD ; [.1734.0020.000B.1D5AD] # MATHEMATICAL SANS-SERIF CAPITAL N 1D5E1 ; [.1734.0020.000B.1D5E1] # MATHEMATICAL SANS-SERIF BOLD CAPITAL N 1D615 ; [.1734.0020.000B.1D615] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL N 1D649 ; [.1734.0020.000B.1D649] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N 1D67D ; [.1734.0020.000B.1D67D] # MATHEMATICAL MONOSPACE CAPITAL N 24C3 ; [.1734.0020.000C.24C3] # CIRCLED LATIN CAPITAL LETTER N 1F15D ; [.1734.0020.000C.1F15D] # NEGATIVE CIRCLED LATIN CAPITAL LETTER N 207F ; [.1734.0020.0014.207F] # SUPERSCRIPT LATIN SMALL LETTER N 2099 ; [.1734.0020.0015.2099] # LATIN SUBSCRIPT SMALL LETTER N 1D3A ; [.1734.0020.001D.1D3A] # MODIFIER LETTER CAPITAL N 1F13D ; [.1734.0020.001D.1F13D] # SQUARED LATIN CAPITAL LETTER N 1F17D ; [.1734.0020.001D.1F17D] # NEGATIVE SQUARED LATIN CAPITAL LETTER N 0144 ; [.1734.0020.0002.006E][.0000.0032.0002.0301] # LATIN SMALL LETTER N WITH ACUTE 0143 ; [.1734.0020.0008.004E][.0000.0032.0002.0301] # LATIN CAPITAL LETTER N WITH ACUTE 01F9 ; [.1734.0020.0002.006E][.0000.0035.0002.0300] # LATIN SMALL LETTER N WITH GRAVE 01F8 ; [.1734.0020.0008.004E][.0000.0035.0002.0300] # LATIN CAPITAL LETTER N WITH GRAVE 0148 ; [.1734.0020.0002.006E][.0000.0041.0002.030C] # LATIN SMALL LETTER N WITH CARON 0147 ; [.1734.0020.0008.004E][.0000.0041.0002.030C] # LATIN CAPITAL LETTER N WITH CARON 00F1 ; [.1734.0020.0002.006E][.0000.004E.0002.0303] # LATIN SMALL LETTER N WITH TILDE 00D1 ; [.1734.0020.0008.004E][.0000.004E.0002.0303] # LATIN CAPITAL LETTER N WITH TILDE 1E45 ; [.1734.0020.0002.006E][.0000.0052.0002.0307] # LATIN SMALL LETTER N WITH DOT ABOVE 1E44 ; [.1734.0020.0008.004E][.0000.0052.0002.0307] # LATIN CAPITAL LETTER N WITH DOT ABOVE 0146 ; [.1734.0020.0002.006E][.0000.0056.0002.0327] # LATIN SMALL LETTER N WITH CEDILLA 0145 ; [.1734.0020.0008.004E][.0000.0056.0002.0327] # LATIN CAPITAL LETTER N WITH CEDILLA A7A5 ; [.1734.0020.0004.A7A5][.0000.0061.0004.A7A5] # LATIN SMALL LETTER N WITH OBLIQUE STROKE A7A4 ; [.1734.0020.000A.A7A4][.0000.0061.0004.A7A4] # LATIN CAPITAL LETTER N WITH OBLIQUE STROKE 1E47 ; [.1734.0020.0002.006E][.0000.0070.0002.0323] # LATIN SMALL LETTER N WITH DOT BELOW 1E46 ; [.1734.0020.0008.004E][.0000.0070.0002.0323] # LATIN CAPITAL LETTER N WITH DOT BELOW 1E4B ; [.1734.0020.0002.006E][.0000.0078.0002.032D] # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW 1E4A ; [.1734.0020.0008.004E][.0000.0078.0002.032D] # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW 1E49 ; [.1734.0020.0002.006E][.0000.007B.0002.0331] # LATIN SMALL LETTER N WITH LINE BELOW 1E48 ; [.1734.0020.0008.004E][.0000.007B.0002.0331] # LATIN CAPITAL LETTER N WITH LINE BELOW 3381 ; [.1734.0020.001C.3381][.15D4.0020.001D.3381] # SQUARE NA 1F195 ; [.1734.0020.001D.1F195][.1631.0020.001D.1F195][.1856.0020.001F.1F195] # SQUARED NEW 338B ; [.1734.0020.001C.338B][.1669.0020.001D.338B] # SQUARE NF 1F196 ; [.1734.0020.001D.1F196][.1676.0020.001D.1F196] # SQUARED NG 01CC ; [.1734.0020.0004.01CC][.16CB.0020.0004.01CC] # LATIN SMALL LETTER NJ 01CB ; [.1734.0020.000A.01CB][.16CB.0020.0004.01CB] # LATIN CAPITAL LETTER N WITH SMALL LETTER J 01CA ; [.1734.0020.000A.01CA][.16CB.0020.000A.01CA] # LATIN CAPITAL LETTER NJ 339A ; [.1734.0020.001C.339A][.1726.0020.001C.339A] # SQUARE NM 2116 ; [.1734.0020.000A.2116][.1756.0020.0004.2116] # NUMERO SIGN 33B1 ; [.1734.0020.001C.33B1][.17D8.0020.001C.33B1] # SQUARE NS 33B5 ; [.1734.0020.001C.33B5][.1844.0020.001D.33B5] # SQUARE NV 33BB ; [.1734.0020.001C.33BB][.1856.0020.001D.33BB] # SQUARE NW 0274 ; [.1738.0020.0002.0274] # LATIN LETTER SMALL CAPITAL N 1DE1 ; [.1738.0020.0004.1DE1] # COMBINING LATIN LETTER SMALL CAPITAL N 1DB0 ; [.1738.0020.0014.1DB0] # MODIFIER LETTER SMALL CAPITAL N 1D3B ; [.173C.0020.0002.1D3B] # MODIFIER LETTER CAPITAL REVERSED N 1D0E ; [.173D.0020.0002.1D0E] # LATIN LETTER SMALL CAPITAL REVERSED N 1D70 ; [.173E.0020.0002.1D70] # LATIN SMALL LETTER N WITH MIDDLE TILDE 0272 ; [.173F.0020.0002.0272] # LATIN SMALL LETTER N WITH LEFT HOOK 019D ; [.173F.0020.0008.019D] # LATIN CAPITAL LETTER N WITH LEFT HOOK 1DAE ; [.173F.0020.0014.1DAE] # MODIFIER LETTER SMALL N WITH LEFT HOOK 019E ; [.1743.0020.0002.019E] # LATIN SMALL LETTER N WITH LONG RIGHT LEG 0220 ; [.1743.0020.0008.0220] # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG A791 ; [.1747.0020.0002.A791] # LATIN SMALL LETTER N WITH DESCENDER A790 ; [.1747.0020.0008.A790] # LATIN CAPITAL LETTER N WITH DESCENDER 1D87 ; [.1748.0020.0002.1D87] # LATIN SMALL LETTER N WITH PALATAL HOOK 0273 ; [.1749.0020.0002.0273] # LATIN SMALL LETTER N WITH RETROFLEX HOOK 1DAF ; [.1749.0020.0014.1DAF] # MODIFIER LETTER SMALL N WITH RETROFLEX HOOK 0235 ; [.174D.0020.0002.0235] # LATIN SMALL LETTER N WITH CURL A774 ; [.1751.0020.0002.A774] # LATIN SMALL LETTER NUM 014B ; [.1752.0020.0002.014B] # LATIN SMALL LETTER ENG 014A ; [.1752.0020.0008.014A] # LATIN CAPITAL LETTER ENG 1D51 ; [.1752.0020.0014.1D51] # MODIFIER LETTER SMALL ENG 006F ; [.1756.0020.0002.006F] # LATIN SMALL LETTER O FF4F ; [.1756.0020.0003.FF4F] # FULLWIDTH LATIN SMALL LETTER O 0366 ; [.1756.0020.0004.0366] # COMBINING LATIN SMALL LETTER O 24AA ; [*02FB.0020.0004.24AA][.1756.0020.0004.24AA][*02FC.0020.001F.24AA] # PARENTHESIZED LATIN SMALL LETTER O 2134 ; [.1756.0020.0005.2134] # SCRIPT SMALL O 1D428 ; [.1756.0020.0005.1D428] # MATHEMATICAL BOLD SMALL O 1D45C ; [.1756.0020.0005.1D45C] # MATHEMATICAL ITALIC SMALL O 1D490 ; [.1756.0020.0005.1D490] # MATHEMATICAL BOLD ITALIC SMALL O 1D4F8 ; [.1756.0020.0005.1D4F8] # MATHEMATICAL BOLD SCRIPT SMALL O 1D52C ; [.1756.0020.0005.1D52C] # MATHEMATICAL FRAKTUR SMALL O 1D560 ; [.1756.0020.0005.1D560] # MATHEMATICAL DOUBLE-STRUCK SMALL O 1D594 ; [.1756.0020.0005.1D594] # MATHEMATICAL BOLD FRAKTUR SMALL O 1D5C8 ; [.1756.0020.0005.1D5C8] # MATHEMATICAL SANS-SERIF SMALL O 1D5FC ; [.1756.0020.0005.1D5FC] # MATHEMATICAL SANS-SERIF BOLD SMALL O 1D630 ; [.1756.0020.0005.1D630] # MATHEMATICAL SANS-SERIF ITALIC SMALL O 1D664 ; [.1756.0020.0005.1D664] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O 1D698 ; [.1756.0020.0005.1D698] # MATHEMATICAL MONOSPACE SMALL O 24DE ; [.1756.0020.0006.24DE] # CIRCLED LATIN SMALL LETTER O 004F ; [.1756.0020.0008.004F] # LATIN CAPITAL LETTER O FF2F ; [.1756.0020.0009.FF2F] # FULLWIDTH LATIN CAPITAL LETTER O 1F11E ; [*02FB.0020.0004.1F11E][.1756.0020.000A.1F11E][*02FC.0020.001F.1F11E] # PARENTHESIZED LATIN CAPITAL LETTER O 1F1F4 ; [.1756.0020.000A.1F1F4] # REGIONAL INDICATOR SYMBOL LETTER O 1D40E ; [.1756.0020.000B.1D40E] # MATHEMATICAL BOLD CAPITAL O 1D442 ; [.1756.0020.000B.1D442] # MATHEMATICAL ITALIC CAPITAL O 1D476 ; [.1756.0020.000B.1D476] # MATHEMATICAL BOLD ITALIC CAPITAL O 1D4AA ; [.1756.0020.000B.1D4AA] # MATHEMATICAL SCRIPT CAPITAL O 1D4DE ; [.1756.0020.000B.1D4DE] # MATHEMATICAL BOLD SCRIPT CAPITAL O 1D512 ; [.1756.0020.000B.1D512] # MATHEMATICAL FRAKTUR CAPITAL O 1D546 ; [.1756.0020.000B.1D546] # MATHEMATICAL DOUBLE-STRUCK CAPITAL O 1D57A ; [.1756.0020.000B.1D57A] # MATHEMATICAL BOLD FRAKTUR CAPITAL O 1D5AE ; [.1756.0020.000B.1D5AE] # MATHEMATICAL SANS-SERIF CAPITAL O 1D5E2 ; [.1756.0020.000B.1D5E2] # MATHEMATICAL SANS-SERIF BOLD CAPITAL O 1D616 ; [.1756.0020.000B.1D616] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL O 1D64A ; [.1756.0020.000B.1D64A] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O 1D67E ; [.1756.0020.000B.1D67E] # MATHEMATICAL MONOSPACE CAPITAL O 24C4 ; [.1756.0020.000C.24C4] # CIRCLED LATIN CAPITAL LETTER O 1F15E ; [.1756.0020.000C.1F15E] # NEGATIVE CIRCLED LATIN CAPITAL LETTER O 00BA ; [.1756.0020.0014.00BA] # MASCULINE ORDINAL INDICATOR 1D52 ; [.1756.0020.0014.1D52] # MODIFIER LETTER SMALL O 2092 ; [.1756.0020.0015.2092] # LATIN SUBSCRIPT SMALL LETTER O 1D3C ; [.1756.0020.001D.1D3C] # MODIFIER LETTER CAPITAL O 1F13E ; [.1756.0020.001D.1F13E] # SQUARED LATIN CAPITAL LETTER O 1F17E ; [.1756.0020.001D.1F17E] # NEGATIVE SQUARED LATIN CAPITAL LETTER O 00F3 ; [.1756.0020.0002.006F][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH ACUTE 00D3 ; [.1756.0020.0008.004F][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH ACUTE 00F2 ; [.1756.0020.0002.006F][.0000.0035.0002.0300] # LATIN SMALL LETTER O WITH GRAVE 00D2 ; [.1756.0020.0008.004F][.0000.0035.0002.0300] # LATIN CAPITAL LETTER O WITH GRAVE 014F ; [.1756.0020.0002.006F][.0000.0037.0002.0306] # LATIN SMALL LETTER O WITH BREVE 014E ; [.1756.0020.0008.004F][.0000.0037.0002.0306] # LATIN CAPITAL LETTER O WITH BREVE 00F4 ; [.1756.0020.0002.006F][.0000.003C.0002.0302] # LATIN SMALL LETTER O WITH CIRCUMFLEX 00D4 ; [.1756.0020.0008.004F][.0000.003C.0002.0302] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX 1ED1 ; [.1756.0020.0002.006F][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE 1ED0 ; [.1756.0020.0008.004F][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE 1ED3 ; [.1756.0020.0002.006F][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE 1ED2 ; [.1756.0020.0008.004F][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE 1ED7 ; [.1756.0020.0002.006F][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE 1ED6 ; [.1756.0020.0008.004F][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE 1ED5 ; [.1756.0020.0002.006F][.0000.003C.0002.0302][.0000.0064.0002.0309] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE 1ED4 ; [.1756.0020.0008.004F][.0000.003C.0002.0302][.0000.0064.0002.0309] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE 01D2 ; [.1756.0020.0002.006F][.0000.0041.0002.030C] # LATIN SMALL LETTER O WITH CARON 01D1 ; [.1756.0020.0008.004F][.0000.0041.0002.030C] # LATIN CAPITAL LETTER O WITH CARON 00F6 ; [.1756.0020.0002.006F][.0000.0047.0002.0308] # LATIN SMALL LETTER O WITH DIAERESIS 00D6 ; [.1756.0020.0008.004F][.0000.0047.0002.0308] # LATIN CAPITAL LETTER O WITH DIAERESIS 022B ; [.1756.0020.0002.006F][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON 022A ; [.1756.0020.0008.004F][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON 0151 ; [.1756.0020.0002.006F][.0000.004D.0002.030B] # LATIN SMALL LETTER O WITH DOUBLE ACUTE 0150 ; [.1756.0020.0008.004F][.0000.004D.0002.030B] # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE 00F5 ; [.1756.0020.0002.006F][.0000.004E.0002.0303] # LATIN SMALL LETTER O WITH TILDE 00D5 ; [.1756.0020.0008.004F][.0000.004E.0002.0303] # LATIN CAPITAL LETTER O WITH TILDE 1E4D ; [.1756.0020.0002.006F][.0000.004E.0002.0303][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH TILDE AND ACUTE 1E4C ; [.1756.0020.0008.004F][.0000.004E.0002.0303][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE 1E4F ; [.1756.0020.0002.006F][.0000.004E.0002.0303][.0000.0047.0002.0308] # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS 1E4E ; [.1756.0020.0008.004F][.0000.004E.0002.0303][.0000.0047.0002.0308] # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS 022D ; [.1756.0020.0002.006F][.0000.004E.0002.0303][.0000.005B.0002.0304] # LATIN SMALL LETTER O WITH TILDE AND MACRON 022C ; [.1756.0020.0008.004F][.0000.004E.0002.0303][.0000.005B.0002.0304] # LATIN CAPITAL LETTER O WITH TILDE AND MACRON 022F ; [.1756.0020.0002.006F][.0000.0052.0002.0307] # LATIN SMALL LETTER O WITH DOT ABOVE 022E ; [.1756.0020.0008.004F][.0000.0052.0002.0307] # LATIN CAPITAL LETTER O WITH DOT ABOVE 0231 ; [.1756.0020.0002.006F][.0000.0052.0002.0307][.0000.005B.0002.0304] # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON 0230 ; [.1756.0020.0008.004F][.0000.0052.0002.0307][.0000.005B.0002.0304] # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON 00F8 ; [.1756.0020.0002.006F][.0000.0054.0002.0338] # LATIN SMALL LETTER O WITH STROKE 00D8 ; [.1756.0020.0008.004F][.0000.0054.0002.0338] # LATIN CAPITAL LETTER O WITH STROKE 01FF ; [.1756.0020.0002.006F][.0000.0054.0002.0338][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH STROKE AND ACUTE 01FE ; [.1756.0020.0008.004F][.0000.0054.0002.0338][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE 01EB ; [.1756.0020.0002.006F][.0000.0059.0002.0328] # LATIN SMALL LETTER O WITH OGONEK 01EA ; [.1756.0020.0008.004F][.0000.0059.0002.0328] # LATIN CAPITAL LETTER O WITH OGONEK 01ED ; [.1756.0020.0002.006F][.0000.0059.0002.0328][.0000.005B.0002.0304] # LATIN SMALL LETTER O WITH OGONEK AND MACRON 01EC ; [.1756.0020.0008.004F][.0000.0059.0002.0328][.0000.005B.0002.0304] # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON 014D ; [.1756.0020.0002.006F][.0000.005B.0002.0304] # LATIN SMALL LETTER O WITH MACRON 014C ; [.1756.0020.0008.004F][.0000.005B.0002.0304] # LATIN CAPITAL LETTER O WITH MACRON 1E53 ; [.1756.0020.0002.006F][.0000.005B.0002.0304][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH MACRON AND ACUTE 1E52 ; [.1756.0020.0008.004F][.0000.005B.0002.0304][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE 1E51 ; [.1756.0020.0002.006F][.0000.005B.0002.0304][.0000.0035.0002.0300] # LATIN SMALL LETTER O WITH MACRON AND GRAVE 1E50 ; [.1756.0020.0008.004F][.0000.005B.0002.0304][.0000.0035.0002.0300] # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE 1ECF ; [.1756.0020.0002.006F][.0000.0064.0002.0309] # LATIN SMALL LETTER O WITH HOOK ABOVE 1ECE ; [.1756.0020.0008.004F][.0000.0064.0002.0309] # LATIN CAPITAL LETTER O WITH HOOK ABOVE 020D ; [.1756.0020.0002.006F][.0000.0065.0002.030F] # LATIN SMALL LETTER O WITH DOUBLE GRAVE 020C ; [.1756.0020.0008.004F][.0000.0065.0002.030F] # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE 020F ; [.1756.0020.0002.006F][.0000.0067.0002.0311] # LATIN SMALL LETTER O WITH INVERTED BREVE 020E ; [.1756.0020.0008.004F][.0000.0067.0002.0311] # LATIN CAPITAL LETTER O WITH INVERTED BREVE 01A1 ; [.1756.0020.0002.006F][.0000.0068.0002.031B] # LATIN SMALL LETTER O WITH HORN 01A0 ; [.1756.0020.0008.004F][.0000.0068.0002.031B] # LATIN CAPITAL LETTER O WITH HORN 1EDB ; [.1756.0020.0002.006F][.0000.0068.0002.031B][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH HORN AND ACUTE 1EDA ; [.1756.0020.0008.004F][.0000.0068.0002.031B][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH HORN AND ACUTE 1EDD ; [.1756.0020.0002.006F][.0000.0068.0002.031B][.0000.0035.0002.0300] # LATIN SMALL LETTER O WITH HORN AND GRAVE 1EDC ; [.1756.0020.0008.004F][.0000.0068.0002.031B][.0000.0035.0002.0300] # LATIN CAPITAL LETTER O WITH HORN AND GRAVE 1EE1 ; [.1756.0020.0002.006F][.0000.0068.0002.031B][.0000.004E.0002.0303] # LATIN SMALL LETTER O WITH HORN AND TILDE 1EE0 ; [.1756.0020.0008.004F][.0000.0068.0002.031B][.0000.004E.0002.0303] # LATIN CAPITAL LETTER O WITH HORN AND TILDE 1EDF ; [.1756.0020.0002.006F][.0000.0068.0002.031B][.0000.0064.0002.0309] # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE 1EDE ; [.1756.0020.0008.004F][.0000.0068.0002.031B][.0000.0064.0002.0309] # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE 1EE3 ; [.1756.0020.0002.006F][.0000.0068.0002.031B][.0000.0070.0002.0323] # LATIN SMALL LETTER O WITH HORN AND DOT BELOW 1EE2 ; [.1756.0020.0008.004F][.0000.0068.0002.031B][.0000.0070.0002.0323] # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW 1ECD ; [.1756.0020.0002.006F][.0000.0070.0002.0323] # LATIN SMALL LETTER O WITH DOT BELOW 1ECC ; [.1756.0020.0008.004F][.0000.0070.0002.0323] # LATIN CAPITAL LETTER O WITH DOT BELOW 1ED9 ; [.1756.0020.0002.006F][.0000.0070.0002.0323][.0000.003C.0002.0302] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW 1ED8 ; [.1756.0020.0008.004F][.0000.0070.0002.0323][.0000.003C.0002.0302] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW 0153 ; [.1756.0020.0004.0153][.0000.0139.0004.0153][.1631.0020.001F.0153] # LATIN SMALL LIGATURE OE 0152 ; [.1756.0020.000A.0152][.0000.0139.0004.0152][.1631.0020.001F.0152] # LATIN CAPITAL LIGATURE OE A7F9 ; [.1756.0020.0014.A7F9][.0000.0139.0014.A7F9][.1631.0020.001F.A7F9] # MODIFIER LETTER SMALL LIGATURE OE 1F197 ; [.1756.0020.001D.1F197][.16E4.0020.001D.1F197] # SQUARED OK A74F ; [.1756.0020.0004.A74F][.1756.0020.0004.A74F] # LATIN SMALL LETTER OO A74E ; [.1756.0020.000A.A74E][.1756.0020.000A.A74E] # LATIN CAPITAL LETTER OO 3375 ; [.1756.0020.001C.3375][.1844.0020.001D.3375] # SQUARE OV 1D0F ; [.175A.0020.0002.1D0F] # LATIN LETTER SMALL CAPITAL O 1D11 ; [.175B.0020.0002.1D11] # LATIN SMALL LETTER SIDEWAYS O 0276 ; [.175C.0020.0002.0276] # LATIN LETTER SMALL CAPITAL OE 1D14 ; [.1760.0020.0002.1D14] # LATIN SMALL LETTER TURNED OE 1D13 ; [.1761.0020.0002.1D13] # LATIN SMALL LETTER SIDEWAYS O WITH STROKE 0254 ; [.1762.0020.0002.0254] # LATIN SMALL LETTER OPEN O 0186 ; [.1762.0020.0008.0186] # LATIN CAPITAL LETTER OPEN O 1D53 ; [.1762.0020.0014.1D53] # MODIFIER LETTER SMALL OPEN O 1D10 ; [.1766.0020.0002.1D10] # LATIN LETTER SMALL CAPITAL OPEN O 1D12 ; [.1767.0020.0002.1D12] # LATIN SMALL LETTER SIDEWAYS OPEN O 1D97 ; [.1768.0020.0002.1D97] # LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK A74D ; [.1769.0020.0002.A74D] # LATIN SMALL LETTER O WITH LOOP A74C ; [.1769.0020.0008.A74C] # LATIN CAPITAL LETTER O WITH LOOP 1D16 ; [.176A.0020.0002.1D16] # LATIN SMALL LETTER TOP HALF O 1D54 ; [.176A.0020.0014.1D54] # MODIFIER LETTER SMALL TOP HALF O 1D17 ; [.176B.0020.0002.1D17] # LATIN SMALL LETTER BOTTOM HALF O 1D55 ; [.176B.0020.0014.1D55] # MODIFIER LETTER SMALL BOTTOM HALF O 2C7A ; [.176C.0020.0002.2C7A] # LATIN SMALL LETTER O WITH LOW RING INSIDE 0275 ; [.176D.0020.0002.0275] # LATIN SMALL LETTER BARRED O 019F ; [.176D.0020.0008.019F] # LATIN CAPITAL LETTER O WITH MIDDLE TILDE 1DB1 ; [.176D.0020.0014.1DB1] # MODIFIER LETTER SMALL BARRED O A74B ; [.1771.0020.0002.A74B] # LATIN SMALL LETTER O WITH LONG STROKE OVERLAY A74A ; [.1771.0020.0008.A74A] # LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY 0277 ; [.1772.0020.0002.0277] # LATIN SMALL LETTER CLOSED OMEGA 0223 ; [.1776.0020.0002.0223] # LATIN SMALL LETTER OU 0222 ; [.1776.0020.0008.0222] # LATIN CAPITAL LETTER OU 1D3D ; [.1776.0020.001D.1D3D] # MODIFIER LETTER CAPITAL OU 1D15 ; [.177A.0020.0002.1D15] # LATIN LETTER SMALL CAPITAL OU 0070 ; [.177B.0020.0002.0070] # LATIN SMALL LETTER P FF50 ; [.177B.0020.0003.FF50] # FULLWIDTH LATIN SMALL LETTER P 24AB ; [*02FB.0020.0004.24AB][.177B.0020.0004.24AB][*02FC.0020.001F.24AB] # PARENTHESIZED LATIN SMALL LETTER P 1D429 ; [.177B.0020.0005.1D429] # MATHEMATICAL BOLD SMALL P 1D45D ; [.177B.0020.0005.1D45D] # MATHEMATICAL ITALIC SMALL P 1D491 ; [.177B.0020.0005.1D491] # MATHEMATICAL BOLD ITALIC SMALL P 1D4C5 ; [.177B.0020.0005.1D4C5] # MATHEMATICAL SCRIPT SMALL P 1D4F9 ; [.177B.0020.0005.1D4F9] # MATHEMATICAL BOLD SCRIPT SMALL P 1D52D ; [.177B.0020.0005.1D52D] # MATHEMATICAL FRAKTUR SMALL P 1D561 ; [.177B.0020.0005.1D561] # MATHEMATICAL DOUBLE-STRUCK SMALL P 1D595 ; [.177B.0020.0005.1D595] # MATHEMATICAL BOLD FRAKTUR SMALL P 1D5C9 ; [.177B.0020.0005.1D5C9] # MATHEMATICAL SANS-SERIF SMALL P 1D5FD ; [.177B.0020.0005.1D5FD] # MATHEMATICAL SANS-SERIF BOLD SMALL P 1D631 ; [.177B.0020.0005.1D631] # MATHEMATICAL SANS-SERIF ITALIC SMALL P 1D665 ; [.177B.0020.0005.1D665] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P 1D699 ; [.177B.0020.0005.1D699] # MATHEMATICAL MONOSPACE SMALL P 24DF ; [.177B.0020.0006.24DF] # CIRCLED LATIN SMALL LETTER P 0050 ; [.177B.0020.0008.0050] # LATIN CAPITAL LETTER P FF30 ; [.177B.0020.0009.FF30] # FULLWIDTH LATIN CAPITAL LETTER P 1F11F ; [*02FB.0020.0004.1F11F][.177B.0020.000A.1F11F][*02FC.0020.001F.1F11F] # PARENTHESIZED LATIN CAPITAL LETTER P 1F1F5 ; [.177B.0020.000A.1F1F5] # REGIONAL INDICATOR SYMBOL LETTER P 2119 ; [.177B.0020.000B.2119] # DOUBLE-STRUCK CAPITAL P 1D40F ; [.177B.0020.000B.1D40F] # MATHEMATICAL BOLD CAPITAL P 1D443 ; [.177B.0020.000B.1D443] # MATHEMATICAL ITALIC CAPITAL P 1D477 ; [.177B.0020.000B.1D477] # MATHEMATICAL BOLD ITALIC CAPITAL P 1D4AB ; [.177B.0020.000B.1D4AB] # MATHEMATICAL SCRIPT CAPITAL P 1D4DF ; [.177B.0020.000B.1D4DF] # MATHEMATICAL BOLD SCRIPT CAPITAL P 1D513 ; [.177B.0020.000B.1D513] # MATHEMATICAL FRAKTUR CAPITAL P 1D57B ; [.177B.0020.000B.1D57B] # MATHEMATICAL BOLD FRAKTUR CAPITAL P 1D5AF ; [.177B.0020.000B.1D5AF] # MATHEMATICAL SANS-SERIF CAPITAL P 1D5E3 ; [.177B.0020.000B.1D5E3] # MATHEMATICAL SANS-SERIF BOLD CAPITAL P 1D617 ; [.177B.0020.000B.1D617] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL P 1D64B ; [.177B.0020.000B.1D64B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P 1D67F ; [.177B.0020.000B.1D67F] # MATHEMATICAL MONOSPACE CAPITAL P 24C5 ; [.177B.0020.000C.24C5] # CIRCLED LATIN CAPITAL LETTER P 1F15F ; [.177B.0020.000C.1F15F] # NEGATIVE CIRCLED LATIN CAPITAL LETTER P 1D56 ; [.177B.0020.0014.1D56] # MODIFIER LETTER SMALL P 209A ; [.177B.0020.0015.209A] # LATIN SUBSCRIPT SMALL LETTER P 1D3E ; [.177B.0020.001D.1D3E] # MODIFIER LETTER CAPITAL P 1F13F ; [.177B.0020.001D.1F13F] # SQUARED LATIN CAPITAL LETTER P 1F17F ; [.177B.0020.001D.1F17F] # NEGATIVE SQUARED LATIN CAPITAL LETTER P 1F18A ; [.177B.0020.001D.1F18A] # CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P 1E55 ; [.177B.0020.0002.0070][.0000.0032.0002.0301] # LATIN SMALL LETTER P WITH ACUTE 1E54 ; [.177B.0020.0008.0050][.0000.0032.0002.0301] # LATIN CAPITAL LETTER P WITH ACUTE 1E57 ; [.177B.0020.0002.0070][.0000.0052.0002.0307] # LATIN SMALL LETTER P WITH DOT ABOVE 1E56 ; [.177B.0020.0008.0050][.0000.0052.0002.0307] # LATIN CAPITAL LETTER P WITH DOT ABOVE 3380 ; [.177B.0020.001C.3380][.15D4.0020.001D.3380] # SQUARE PA AMPS 33A9 ; [.177B.0020.001D.33A9][.15D4.0020.001C.33A9] # SQUARE PA 1F18C ; [.177B.0020.001D.1F18C][.15D4.0020.001D.1F18C] # NEGATIVE SQUARED PA 3376 ; [.177B.0020.001C.3376][.1602.0020.001C.3376] # SQUARE PC 338A ; [.177B.0020.001C.338A][.1669.0020.001D.338A] # SQUARE PF 33D7 ; [.177B.0020.001D.33D7][.1699.0020.001D.33D7] # SQUARE PH 33D8 ; [.177B.0020.001C.33D8][*0273.0020.001C.33D8][.1726.0020.001F.33D8][*0273.0020.001F.33D8] # SQUARE PM 33D9 ; [.177B.0020.001D.33D9][.177B.0020.001D.33D9][.1726.0020.001F.33D9] # SQUARE PPM 1F14E ; [.177B.0020.001D.1F14E][.177B.0020.001D.1F14E][.1844.0020.001F.1F14E] # SQUARED PPV 33DA ; [.177B.0020.001D.33DA][.17A2.0020.001D.33DA] # SQUARE PR 33B0 ; [.177B.0020.001C.33B0][.17D8.0020.001C.33B0] # SQUARE PS 3250 ; [.177B.0020.001D.3250][.17FB.0020.001D.3250][.1631.0020.001F.3250] # PARTNERSHIP SIGN 33B4 ; [.177B.0020.001C.33B4][.1844.0020.001D.33B4] # SQUARE PV 33BA ; [.177B.0020.001C.33BA][.1856.0020.001D.33BA] # SQUARE PW 1D18 ; [.177F.0020.0002.1D18] # LATIN LETTER SMALL CAPITAL P 1D7D ; [.1780.0020.0002.1D7D] # LATIN SMALL LETTER P WITH STROKE 2C63 ; [.1780.0020.0008.2C63] # LATIN CAPITAL LETTER P WITH STROKE A751 ; [.1781.0020.0002.A751] # LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER A750 ; [.1781.0020.0008.A750] # LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER 1D71 ; [.1782.0020.0002.1D71] # LATIN SMALL LETTER P WITH MIDDLE TILDE 1D88 ; [.1783.0020.0002.1D88] # LATIN SMALL LETTER P WITH PALATAL HOOK 01A5 ; [.1784.0020.0002.01A5] # LATIN SMALL LETTER P WITH HOOK 01A4 ; [.1784.0020.0008.01A4] # LATIN CAPITAL LETTER P WITH HOOK A753 ; [.1788.0020.0002.A753] # LATIN SMALL LETTER P WITH FLOURISH A752 ; [.1788.0020.0008.A752] # LATIN CAPITAL LETTER P WITH FLOURISH A755 ; [.1789.0020.0002.A755] # LATIN SMALL LETTER P WITH SQUIRREL TAIL A754 ; [.1789.0020.0008.A754] # LATIN CAPITAL LETTER P WITH SQUIRREL TAIL A7FC ; [.178A.0020.0002.A7FC] # LATIN EPIGRAPHIC LETTER REVERSED P 0278 ; [.178B.0020.0002.0278] # LATIN SMALL LETTER PHI 1DB2 ; [.178B.0020.0014.1DB2] # MODIFIER LETTER SMALL PHI 2C77 ; [.178F.0020.0002.2C77] # LATIN SMALL LETTER TAILLESS PHI 0071 ; [.1790.0020.0002.0071] # LATIN SMALL LETTER Q FF51 ; [.1790.0020.0003.FF51] # FULLWIDTH LATIN SMALL LETTER Q 24AC ; [*02FB.0020.0004.24AC][.1790.0020.0004.24AC][*02FC.0020.001F.24AC] # PARENTHESIZED LATIN SMALL LETTER Q 1D42A ; [.1790.0020.0005.1D42A] # MATHEMATICAL BOLD SMALL Q 1D45E ; [.1790.0020.0005.1D45E] # MATHEMATICAL ITALIC SMALL Q 1D492 ; [.1790.0020.0005.1D492] # MATHEMATICAL BOLD ITALIC SMALL Q 1D4C6 ; [.1790.0020.0005.1D4C6] # MATHEMATICAL SCRIPT SMALL Q 1D4FA ; [.1790.0020.0005.1D4FA] # MATHEMATICAL BOLD SCRIPT SMALL Q 1D52E ; [.1790.0020.0005.1D52E] # MATHEMATICAL FRAKTUR SMALL Q 1D562 ; [.1790.0020.0005.1D562] # MATHEMATICAL DOUBLE-STRUCK SMALL Q 1D596 ; [.1790.0020.0005.1D596] # MATHEMATICAL BOLD FRAKTUR SMALL Q 1D5CA ; [.1790.0020.0005.1D5CA] # MATHEMATICAL SANS-SERIF SMALL Q 1D5FE ; [.1790.0020.0005.1D5FE] # MATHEMATICAL SANS-SERIF BOLD SMALL Q 1D632 ; [.1790.0020.0005.1D632] # MATHEMATICAL SANS-SERIF ITALIC SMALL Q 1D666 ; [.1790.0020.0005.1D666] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q 1D69A ; [.1790.0020.0005.1D69A] # MATHEMATICAL MONOSPACE SMALL Q 24E0 ; [.1790.0020.0006.24E0] # CIRCLED LATIN SMALL LETTER Q 0051 ; [.1790.0020.0008.0051] # LATIN CAPITAL LETTER Q FF31 ; [.1790.0020.0009.FF31] # FULLWIDTH LATIN CAPITAL LETTER Q 1F120 ; [*02FB.0020.0004.1F120][.1790.0020.000A.1F120][*02FC.0020.001F.1F120] # PARENTHESIZED LATIN CAPITAL LETTER Q 1F1F6 ; [.1790.0020.000A.1F1F6] # REGIONAL INDICATOR SYMBOL LETTER Q 211A ; [.1790.0020.000B.211A] # DOUBLE-STRUCK CAPITAL Q 1D410 ; [.1790.0020.000B.1D410] # MATHEMATICAL BOLD CAPITAL Q 1D444 ; [.1790.0020.000B.1D444] # MATHEMATICAL ITALIC CAPITAL Q 1D478 ; [.1790.0020.000B.1D478] # MATHEMATICAL BOLD ITALIC CAPITAL Q 1D4AC ; [.1790.0020.000B.1D4AC] # MATHEMATICAL SCRIPT CAPITAL Q 1D4E0 ; [.1790.0020.000B.1D4E0] # MATHEMATICAL BOLD SCRIPT CAPITAL Q 1D514 ; [.1790.0020.000B.1D514] # MATHEMATICAL FRAKTUR CAPITAL Q 1D57C ; [.1790.0020.000B.1D57C] # MATHEMATICAL BOLD FRAKTUR CAPITAL Q 1D5B0 ; [.1790.0020.000B.1D5B0] # MATHEMATICAL SANS-SERIF CAPITAL Q 1D5E4 ; [.1790.0020.000B.1D5E4] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Q 1D618 ; [.1790.0020.000B.1D618] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q 1D64C ; [.1790.0020.000B.1D64C] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q 1D680 ; [.1790.0020.000B.1D680] # MATHEMATICAL MONOSPACE CAPITAL Q 24C6 ; [.1790.0020.000C.24C6] # CIRCLED LATIN CAPITAL LETTER Q 1F160 ; [.1790.0020.000C.1F160] # NEGATIVE CIRCLED LATIN CAPITAL LETTER Q 1F140 ; [.1790.0020.001D.1F140] # SQUARED LATIN CAPITAL LETTER Q 1F180 ; [.1790.0020.001D.1F180] # NEGATIVE SQUARED LATIN CAPITAL LETTER Q 0239 ; [.1790.0020.0004.0239][.177B.0020.0004.0239] # LATIN SMALL LETTER QP DIGRAPH A757 ; [.1794.0020.0002.A757] # LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER A756 ; [.1794.0020.0008.A756] # LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER A759 ; [.1795.0020.0002.A759] # LATIN SMALL LETTER Q WITH DIAGONAL STROKE A758 ; [.1795.0020.0008.A758] # LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE 02A0 ; [.1796.0020.0002.02A0] # LATIN SMALL LETTER Q WITH HOOK 024B ; [.179A.0020.0002.024B] # LATIN SMALL LETTER Q WITH HOOK TAIL 024A ; [.179A.0020.0008.024A] # LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL 0138 ; [.179E.0020.0002.0138] # LATIN SMALL LETTER KRA 0072 ; [.17A2.0020.0002.0072] # LATIN SMALL LETTER R FF52 ; [.17A2.0020.0003.FF52] # FULLWIDTH LATIN SMALL LETTER R 036C ; [.17A2.0020.0004.036C] # COMBINING LATIN SMALL LETTER R 1DCA ; [.17A2.0020.0004.1DCA] # COMBINING LATIN SMALL LETTER R BELOW 24AD ; [*02FB.0020.0004.24AD][.17A2.0020.0004.24AD][*02FC.0020.001F.24AD] # PARENTHESIZED LATIN SMALL LETTER R 1D42B ; [.17A2.0020.0005.1D42B] # MATHEMATICAL BOLD SMALL R 1D45F ; [.17A2.0020.0005.1D45F] # MATHEMATICAL ITALIC SMALL R 1D493 ; [.17A2.0020.0005.1D493] # MATHEMATICAL BOLD ITALIC SMALL R 1D4C7 ; [.17A2.0020.0005.1D4C7] # MATHEMATICAL SCRIPT SMALL R 1D4FB ; [.17A2.0020.0005.1D4FB] # MATHEMATICAL BOLD SCRIPT SMALL R 1D52F ; [.17A2.0020.0005.1D52F] # MATHEMATICAL FRAKTUR SMALL R 1D563 ; [.17A2.0020.0005.1D563] # MATHEMATICAL DOUBLE-STRUCK SMALL R 1D597 ; [.17A2.0020.0005.1D597] # MATHEMATICAL BOLD FRAKTUR SMALL R 1D5CB ; [.17A2.0020.0005.1D5CB] # MATHEMATICAL SANS-SERIF SMALL R 1D5FF ; [.17A2.0020.0005.1D5FF] # MATHEMATICAL SANS-SERIF BOLD SMALL R 1D633 ; [.17A2.0020.0005.1D633] # MATHEMATICAL SANS-SERIF ITALIC SMALL R 1D667 ; [.17A2.0020.0005.1D667] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R 1D69B ; [.17A2.0020.0005.1D69B] # MATHEMATICAL MONOSPACE SMALL R 24E1 ; [.17A2.0020.0006.24E1] # CIRCLED LATIN SMALL LETTER R 0052 ; [.17A2.0020.0008.0052] # LATIN CAPITAL LETTER R FF32 ; [.17A2.0020.0009.FF32] # FULLWIDTH LATIN CAPITAL LETTER R 1F121 ; [*02FB.0020.0004.1F121][.17A2.0020.000A.1F121][*02FC.0020.001F.1F121] # PARENTHESIZED LATIN CAPITAL LETTER R 1F1F7 ; [.17A2.0020.000A.1F1F7] # REGIONAL INDICATOR SYMBOL LETTER R 211B ; [.17A2.0020.000B.211B] # SCRIPT CAPITAL R 211C ; [.17A2.0020.000B.211C] # BLACK-LETTER CAPITAL R 211D ; [.17A2.0020.000B.211D] # DOUBLE-STRUCK CAPITAL R 1D411 ; [.17A2.0020.000B.1D411] # MATHEMATICAL BOLD CAPITAL R 1D445 ; [.17A2.0020.000B.1D445] # MATHEMATICAL ITALIC CAPITAL R 1D479 ; [.17A2.0020.000B.1D479] # MATHEMATICAL BOLD ITALIC CAPITAL R 1D4E1 ; [.17A2.0020.000B.1D4E1] # MATHEMATICAL BOLD SCRIPT CAPITAL R 1D57D ; [.17A2.0020.000B.1D57D] # MATHEMATICAL BOLD FRAKTUR CAPITAL R 1D5B1 ; [.17A2.0020.000B.1D5B1] # MATHEMATICAL SANS-SERIF CAPITAL R 1D5E5 ; [.17A2.0020.000B.1D5E5] # MATHEMATICAL SANS-SERIF BOLD CAPITAL R 1D619 ; [.17A2.0020.000B.1D619] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL R 1D64D ; [.17A2.0020.000B.1D64D] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R 1D681 ; [.17A2.0020.000B.1D681] # MATHEMATICAL MONOSPACE CAPITAL R 24C7 ; [.17A2.0020.000C.24C7] # CIRCLED LATIN CAPITAL LETTER R 1F12C ; [.17A2.0020.000C.1F12C] # CIRCLED ITALIC LATIN CAPITAL LETTER R 1F161 ; [.17A2.0020.000C.1F161] # NEGATIVE CIRCLED LATIN CAPITAL LETTER R 02B3 ; [.17A2.0020.0014.02B3] # MODIFIER LETTER SMALL R 1D63 ; [.17A2.0020.0015.1D63] # LATIN SUBSCRIPT SMALL LETTER R 1D3F ; [.17A2.0020.001D.1D3F] # MODIFIER LETTER CAPITAL R 1F141 ; [.17A2.0020.001D.1F141] # SQUARED LATIN CAPITAL LETTER R 1F181 ; [.17A2.0020.001D.1F181] # NEGATIVE SQUARED LATIN CAPITAL LETTER R 0155 ; [.17A2.0020.0002.0072][.0000.0032.0002.0301] # LATIN SMALL LETTER R WITH ACUTE 0154 ; [.17A2.0020.0008.0052][.0000.0032.0002.0301] # LATIN CAPITAL LETTER R WITH ACUTE 0159 ; [.17A2.0020.0002.0072][.0000.0041.0002.030C] # LATIN SMALL LETTER R WITH CARON 0158 ; [.17A2.0020.0008.0052][.0000.0041.0002.030C] # LATIN CAPITAL LETTER R WITH CARON 1E59 ; [.17A2.0020.0002.0072][.0000.0052.0002.0307] # LATIN SMALL LETTER R WITH DOT ABOVE 1E58 ; [.17A2.0020.0008.0052][.0000.0052.0002.0307] # LATIN CAPITAL LETTER R WITH DOT ABOVE 0157 ; [.17A2.0020.0002.0072][.0000.0056.0002.0327] # LATIN SMALL LETTER R WITH CEDILLA 0156 ; [.17A2.0020.0008.0052][.0000.0056.0002.0327] # LATIN CAPITAL LETTER R WITH CEDILLA A7A7 ; [.17A2.0020.0004.A7A7][.0000.0061.0004.A7A7] # LATIN SMALL LETTER R WITH OBLIQUE STROKE A7A6 ; [.17A2.0020.000A.A7A6][.0000.0061.0004.A7A6] # LATIN CAPITAL LETTER R WITH OBLIQUE STROKE 0211 ; [.17A2.0020.0002.0072][.0000.0065.0002.030F] # LATIN SMALL LETTER R WITH DOUBLE GRAVE 0210 ; [.17A2.0020.0008.0052][.0000.0065.0002.030F] # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE 0213 ; [.17A2.0020.0002.0072][.0000.0067.0002.0311] # LATIN SMALL LETTER R WITH INVERTED BREVE 0212 ; [.17A2.0020.0008.0052][.0000.0067.0002.0311] # LATIN CAPITAL LETTER R WITH INVERTED BREVE 1E5B ; [.17A2.0020.0002.0072][.0000.0070.0002.0323] # LATIN SMALL LETTER R WITH DOT BELOW 1E5A ; [.17A2.0020.0008.0052][.0000.0070.0002.0323] # LATIN CAPITAL LETTER R WITH DOT BELOW 1E5D ; [.17A2.0020.0002.0072][.0000.0070.0002.0323][.0000.005B.0002.0304] # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON 1E5C ; [.17A2.0020.0008.0052][.0000.0070.0002.0323][.0000.005B.0002.0304] # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON 1E5F ; [.17A2.0020.0002.0072][.0000.007B.0002.0331] # LATIN SMALL LETTER R WITH LINE BELOW 1E5E ; [.17A2.0020.0008.0052][.0000.007B.0002.0331] # LATIN CAPITAL LETTER R WITH LINE BELOW A783 ; [.17A2.0020.0004.A783][.0000.013A.0004.A783] # LATIN SMALL LETTER INSULAR R A782 ; [.17A2.0020.000A.A782][.0000.013A.0004.A782] # LATIN CAPITAL LETTER INSULAR R 33AD ; [.17A2.0020.001C.33AD][.15D4.0020.001C.33AD][.1616.0020.001F.33AD] # SQUARE RAD 33AE ; [.17A2.0020.001C.33AE][.15D4.0020.001C.33AE][.1616.0020.001F.33AE][*05AB.0020.001F.33AE][.17D8.0020.001F.33AE] # SQUARE RAD OVER S 33AF ; [.17A2.0020.001C.33AF][.15D4.0020.001C.33AF][.1616.0020.001F.33AF][*05AB.0020.001F.33AF][.17D8.0020.001F.33AF][.15CC.0020.001F.33AF] # SQUARE RAD OVER S SQUARED 20A8 ; [.17A2.0020.000A.20A8][.17D8.0020.0004.20A8] # RUPEE SIGN 0280 ; [.17A6.0020.0002.0280] # LATIN LETTER SMALL CAPITAL R 1DE2 ; [.17A6.0020.0004.1DE2] # COMBINING LATIN LETTER SMALL CAPITAL R 01A6 ; [.17A6.0020.0008.01A6] # LATIN LETTER YR A75B ; [.17AA.0020.0002.A75B] # LATIN SMALL LETTER R ROTUNDA 1DE3 ; [.17AA.0020.0004.1DE3] # COMBINING LATIN SMALL LETTER R ROTUNDA A75A ; [.17AA.0020.0008.A75A] # LATIN CAPITAL LETTER R ROTUNDA 1D19 ; [.17AB.0020.0002.1D19] # LATIN LETTER SMALL CAPITAL REVERSED R 024D ; [.17AC.0020.0002.024D] # LATIN SMALL LETTER R WITH STROKE 024C ; [.17AC.0020.0008.024C] # LATIN CAPITAL LETTER R WITH STROKE 1D72 ; [.17B0.0020.0002.1D72] # LATIN SMALL LETTER R WITH MIDDLE TILDE 0279 ; [.17B1.0020.0002.0279] # LATIN SMALL LETTER TURNED R 02B4 ; [.17B1.0020.0014.02B4] # MODIFIER LETTER SMALL TURNED R 1D1A ; [.17B5.0020.0002.1D1A] # LATIN LETTER SMALL CAPITAL TURNED R 027A ; [.17B6.0020.0002.027A] # LATIN SMALL LETTER TURNED R WITH LONG LEG 1D89 ; [.17BA.0020.0002.1D89] # LATIN SMALL LETTER R WITH PALATAL HOOK 027B ; [.17BB.0020.0002.027B] # LATIN SMALL LETTER TURNED R WITH HOOK 02B5 ; [.17BB.0020.0014.02B5] # MODIFIER LETTER SMALL TURNED R WITH HOOK 2C79 ; [.17BF.0020.0002.2C79] # LATIN SMALL LETTER TURNED R WITH TAIL 027C ; [.17C0.0020.0002.027C] # LATIN SMALL LETTER R WITH LONG LEG 027D ; [.17C4.0020.0002.027D] # LATIN SMALL LETTER R WITH TAIL 2C64 ; [.17C4.0020.0008.2C64] # LATIN CAPITAL LETTER R WITH TAIL 027E ; [.17C8.0020.0002.027E] # LATIN SMALL LETTER R WITH FISHHOOK 1D73 ; [.17CC.0020.0002.1D73] # LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE 027F ; [.17CD.0020.0002.027F] # LATIN SMALL LETTER REVERSED R WITH FISHHOOK 0281 ; [.17D1.0020.0002.0281] # LATIN LETTER SMALL CAPITAL INVERTED R 02B6 ; [.17D1.0020.0014.02B6] # MODIFIER LETTER SMALL CAPITAL INVERTED R A775 ; [.17D5.0020.0002.A775] # LATIN SMALL LETTER RUM A776 ; [.17D6.0020.0002.A776] # LATIN LETTER SMALL CAPITAL RUM A75D ; [.17D7.0020.0002.A75D] # LATIN SMALL LETTER RUM ROTUNDA A75C ; [.17D7.0020.0008.A75C] # LATIN CAPITAL LETTER RUM ROTUNDA 0073 ; [.17D8.0020.0002.0073] # LATIN SMALL LETTER S FF53 ; [.17D8.0020.0003.FF53] # FULLWIDTH LATIN SMALL LETTER S 1DE4 ; [.17D8.0020.0004.1DE4] # COMBINING LATIN SMALL LETTER S 24AE ; [*02FB.0020.0004.24AE][.17D8.0020.0004.24AE][*02FC.0020.001F.24AE] # PARENTHESIZED LATIN SMALL LETTER S 1D42C ; [.17D8.0020.0005.1D42C] # MATHEMATICAL BOLD SMALL S 1D460 ; [.17D8.0020.0005.1D460] # MATHEMATICAL ITALIC SMALL S 1D494 ; [.17D8.0020.0005.1D494] # MATHEMATICAL BOLD ITALIC SMALL S 1D4C8 ; [.17D8.0020.0005.1D4C8] # MATHEMATICAL SCRIPT SMALL S 1D4FC ; [.17D8.0020.0005.1D4FC] # MATHEMATICAL BOLD SCRIPT SMALL S 1D530 ; [.17D8.0020.0005.1D530] # MATHEMATICAL FRAKTUR SMALL S 1D564 ; [.17D8.0020.0005.1D564] # MATHEMATICAL DOUBLE-STRUCK SMALL S 1D598 ; [.17D8.0020.0005.1D598] # MATHEMATICAL BOLD FRAKTUR SMALL S 1D5CC ; [.17D8.0020.0005.1D5CC] # MATHEMATICAL SANS-SERIF SMALL S 1D600 ; [.17D8.0020.0005.1D600] # MATHEMATICAL SANS-SERIF BOLD SMALL S 1D634 ; [.17D8.0020.0005.1D634] # MATHEMATICAL SANS-SERIF ITALIC SMALL S 1D668 ; [.17D8.0020.0005.1D668] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S 1D69C ; [.17D8.0020.0005.1D69C] # MATHEMATICAL MONOSPACE SMALL S 24E2 ; [.17D8.0020.0006.24E2] # CIRCLED LATIN SMALL LETTER S 0053 ; [.17D8.0020.0008.0053] # LATIN CAPITAL LETTER S FF33 ; [.17D8.0020.0009.FF33] # FULLWIDTH LATIN CAPITAL LETTER S 1F122 ; [*02FB.0020.0004.1F122][.17D8.0020.000A.1F122][*02FC.0020.001F.1F122] # PARENTHESIZED LATIN CAPITAL LETTER S 1F12A ; [*0359.0020.0004.1F12A][.17D8.0020.000A.1F12A][*035A.0020.001F.1F12A] # TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S 1F1F8 ; [.17D8.0020.000A.1F1F8] # REGIONAL INDICATOR SYMBOL LETTER S 1D412 ; [.17D8.0020.000B.1D412] # MATHEMATICAL BOLD CAPITAL S 1D446 ; [.17D8.0020.000B.1D446] # MATHEMATICAL ITALIC CAPITAL S 1D47A ; [.17D8.0020.000B.1D47A] # MATHEMATICAL BOLD ITALIC CAPITAL S 1D4AE ; [.17D8.0020.000B.1D4AE] # MATHEMATICAL SCRIPT CAPITAL S 1D4E2 ; [.17D8.0020.000B.1D4E2] # MATHEMATICAL BOLD SCRIPT CAPITAL S 1D516 ; [.17D8.0020.000B.1D516] # MATHEMATICAL FRAKTUR CAPITAL S 1D54A ; [.17D8.0020.000B.1D54A] # MATHEMATICAL DOUBLE-STRUCK CAPITAL S 1D57E ; [.17D8.0020.000B.1D57E] # MATHEMATICAL BOLD FRAKTUR CAPITAL S 1D5B2 ; [.17D8.0020.000B.1D5B2] # MATHEMATICAL SANS-SERIF CAPITAL S 1D5E6 ; [.17D8.0020.000B.1D5E6] # MATHEMATICAL SANS-SERIF BOLD CAPITAL S 1D61A ; [.17D8.0020.000B.1D61A] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL S 1D64E ; [.17D8.0020.000B.1D64E] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S 1D682 ; [.17D8.0020.000B.1D682] # MATHEMATICAL MONOSPACE CAPITAL S 24C8 ; [.17D8.0020.000C.24C8] # CIRCLED LATIN CAPITAL LETTER S 1F162 ; [.17D8.0020.000C.1F162] # NEGATIVE CIRCLED LATIN CAPITAL LETTER S 02E2 ; [.17D8.0020.0014.02E2] # MODIFIER LETTER SMALL S 209B ; [.17D8.0020.0015.209B] # LATIN SUBSCRIPT SMALL LETTER S 1F142 ; [.17D8.0020.001D.1F142] # SQUARED LATIN CAPITAL LETTER S 1F182 ; [.17D8.0020.001D.1F182] # NEGATIVE SQUARED LATIN CAPITAL LETTER S 015B ; [.17D8.0020.0002.0073][.0000.0032.0002.0301] # LATIN SMALL LETTER S WITH ACUTE 015A ; [.17D8.0020.0008.0053][.0000.0032.0002.0301] # LATIN CAPITAL LETTER S WITH ACUTE 1E65 ; [.17D8.0020.0002.0073][.0000.0032.0002.0301][.0000.0052.0002.0307] # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE 1E64 ; [.17D8.0020.0008.0053][.0000.0032.0002.0301][.0000.0052.0002.0307] # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE 015D ; [.17D8.0020.0002.0073][.0000.003C.0002.0302] # LATIN SMALL LETTER S WITH CIRCUMFLEX 015C ; [.17D8.0020.0008.0053][.0000.003C.0002.0302] # LATIN CAPITAL LETTER S WITH CIRCUMFLEX 0161 ; [.17D8.0020.0002.0073][.0000.0041.0002.030C] # LATIN SMALL LETTER S WITH CARON 0160 ; [.17D8.0020.0008.0053][.0000.0041.0002.030C] # LATIN CAPITAL LETTER S WITH CARON 1E67 ; [.17D8.0020.0002.0073][.0000.0041.0002.030C][.0000.0052.0002.0307] # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE 1E66 ; [.17D8.0020.0008.0053][.0000.0041.0002.030C][.0000.0052.0002.0307] # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE 1E61 ; [.17D8.0020.0002.0073][.0000.0052.0002.0307] # LATIN SMALL LETTER S WITH DOT ABOVE 1E60 ; [.17D8.0020.0008.0053][.0000.0052.0002.0307] # LATIN CAPITAL LETTER S WITH DOT ABOVE 015F ; [.17D8.0020.0002.0073][.0000.0056.0002.0327] # LATIN SMALL LETTER S WITH CEDILLA 015E ; [.17D8.0020.0008.0053][.0000.0056.0002.0327] # LATIN CAPITAL LETTER S WITH CEDILLA A7A9 ; [.17D8.0020.0004.A7A9][.0000.0061.0004.A7A9] # LATIN SMALL LETTER S WITH OBLIQUE STROKE A7A8 ; [.17D8.0020.000A.A7A8][.0000.0061.0004.A7A8] # LATIN CAPITAL LETTER S WITH OBLIQUE STROKE 1E63 ; [.17D8.0020.0002.0073][.0000.0070.0002.0323] # LATIN SMALL LETTER S WITH DOT BELOW 1E62 ; [.17D8.0020.0008.0053][.0000.0070.0002.0323] # LATIN CAPITAL LETTER S WITH DOT BELOW 1E69 ; [.17D8.0020.0002.0073][.0000.0070.0002.0323][.0000.0052.0002.0307] # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE 1E68 ; [.17D8.0020.0008.0053][.0000.0070.0002.0323][.0000.0052.0002.0307] # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE 0219 ; [.17D8.0020.0002.0073][.0000.0077.0002.0326] # LATIN SMALL LETTER S WITH COMMA BELOW 0218 ; [.17D8.0020.0008.0053][.0000.0077.0002.0326] # LATIN CAPITAL LETTER S WITH COMMA BELOW 017F ; [.17D8.0020.0004.017F][.0000.013A.0004.017F] # LATIN SMALL LETTER LONG S 1DE5 ; [.17D8.0020.0004.1DE5][.0000.013A.0004.1DE5] # COMBINING LATIN SMALL LETTER LONG S A785 ; [.17D8.0020.0004.A785][.0000.013A.0004.A785] # LATIN SMALL LETTER INSULAR S A784 ; [.17D8.0020.000A.A784][.0000.013A.0004.A784] # LATIN CAPITAL LETTER INSULAR S 1E9B ; [.17D8.0020.0004.1E9B][.0000.013A.0004.1E9B][.0000.0052.0002.1E9B] # LATIN SMALL LETTER LONG S WITH DOT ABOVE 1F18D ; [.17D8.0020.001D.1F18D][.15D4.0020.001D.1F18D] # NEGATIVE SQUARED SA 1F14C ; [.17D8.0020.001D.1F14C][.1616.0020.001D.1F14C] # SQUARED SD 2120 ; [.17D8.0020.0014.2120][.1726.0020.0014.2120] # SERVICE MARK 1F198 ; [.17D8.0020.001D.1F198][.1756.0020.001D.1F198][.17D8.0020.001F.1F198] # SQUARED SOS 33DB ; [.17D8.0020.001C.33DB][.17A2.0020.001C.33DB] # SQUARE SR 1F14D ; [.17D8.0020.001D.1F14D][.17D8.0020.001D.1F14D] # SQUARED SS 00DF ; [.17D8.0020.0004.00DF][.0000.0139.0004.00DF][.17D8.0020.001F.00DF] # LATIN SMALL LETTER SHARP S 1E9E ; [.17D8.0020.000A.1E9E][.0000.0139.0004.1E9E][.17D8.0020.001F.1E9E] # LATIN CAPITAL LETTER SHARP S FB06 ; [.17D8.0020.0004.FB06][.17FB.0020.0004.FB06] # LATIN SMALL LIGATURE ST FB05 ; [.17D8.0020.0004.FB05][.0000.013A.0004.FB05][.17FB.0020.001F.FB05] # LATIN SMALL LIGATURE LONG S T 33DC ; [.17D8.0020.001D.33DC][.1844.0020.001C.33DC] # SQUARE SV A731 ; [.17DC.0020.0002.A731] # LATIN LETTER SMALL CAPITAL S 1D74 ; [.17DD.0020.0002.1D74] # LATIN SMALL LETTER S WITH MIDDLE TILDE 1D8A ; [.17DE.0020.0002.1D8A] # LATIN SMALL LETTER S WITH PALATAL HOOK 0282 ; [.17DF.0020.0002.0282] # LATIN SMALL LETTER S WITH HOOK 1DB3 ; [.17DF.0020.0014.1DB3] # MODIFIER LETTER SMALL S WITH HOOK 023F ; [.17E3.0020.0002.023F] # LATIN SMALL LETTER S WITH SWASH TAIL 2C7E ; [.17E3.0020.0008.2C7E] # LATIN CAPITAL LETTER S WITH SWASH TAIL 1E9C ; [.17E7.0020.0002.1E9C] # LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE 1E9D ; [.17E8.0020.0002.1E9D] # LATIN SMALL LETTER LONG S WITH HIGH STROKE 0283 ; [.17E9.0020.0002.0283] # LATIN SMALL LETTER ESH 01A9 ; [.17E9.0020.0008.01A9] # LATIN CAPITAL LETTER ESH 1DB4 ; [.17E9.0020.0014.1DB4] # MODIFIER LETTER SMALL ESH 1D8B ; [.17ED.0020.0002.1D8B] # LATIN SMALL LETTER ESH WITH PALATAL HOOK 01AA ; [.17EE.0020.0002.01AA] # LATIN LETTER REVERSED ESH LOOP 0285 ; [.17F2.0020.0002.0285] # LATIN SMALL LETTER SQUAT REVERSED ESH 1D98 ; [.17F6.0020.0002.1D98] # LATIN SMALL LETTER ESH WITH RETROFLEX HOOK 0286 ; [.17F7.0020.0002.0286] # LATIN SMALL LETTER ESH WITH CURL 0074 ; [.17FB.0020.0002.0074] # LATIN SMALL LETTER T FF54 ; [.17FB.0020.0003.FF54] # FULLWIDTH LATIN SMALL LETTER T 036D ; [.17FB.0020.0004.036D] # COMBINING LATIN SMALL LETTER T 24AF ; [*02FB.0020.0004.24AF][.17FB.0020.0004.24AF][*02FC.0020.001F.24AF] # PARENTHESIZED LATIN SMALL LETTER T 1D42D ; [.17FB.0020.0005.1D42D] # MATHEMATICAL BOLD SMALL T 1D461 ; [.17FB.0020.0005.1D461] # MATHEMATICAL ITALIC SMALL T 1D495 ; [.17FB.0020.0005.1D495] # MATHEMATICAL BOLD ITALIC SMALL T 1D4C9 ; [.17FB.0020.0005.1D4C9] # MATHEMATICAL SCRIPT SMALL T 1D4FD ; [.17FB.0020.0005.1D4FD] # MATHEMATICAL BOLD SCRIPT SMALL T 1D531 ; [.17FB.0020.0005.1D531] # MATHEMATICAL FRAKTUR SMALL T 1D565 ; [.17FB.0020.0005.1D565] # MATHEMATICAL DOUBLE-STRUCK SMALL T 1D599 ; [.17FB.0020.0005.1D599] # MATHEMATICAL BOLD FRAKTUR SMALL T 1D5CD ; [.17FB.0020.0005.1D5CD] # MATHEMATICAL SANS-SERIF SMALL T 1D601 ; [.17FB.0020.0005.1D601] # MATHEMATICAL SANS-SERIF BOLD SMALL T 1D635 ; [.17FB.0020.0005.1D635] # MATHEMATICAL SANS-SERIF ITALIC SMALL T 1D669 ; [.17FB.0020.0005.1D669] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T 1D69D ; [.17FB.0020.0005.1D69D] # MATHEMATICAL MONOSPACE SMALL T 24E3 ; [.17FB.0020.0006.24E3] # CIRCLED LATIN SMALL LETTER T 0054 ; [.17FB.0020.0008.0054] # LATIN CAPITAL LETTER T FF34 ; [.17FB.0020.0009.FF34] # FULLWIDTH LATIN CAPITAL LETTER T 1F123 ; [*02FB.0020.0004.1F123][.17FB.0020.000A.1F123][*02FC.0020.001F.1F123] # PARENTHESIZED LATIN CAPITAL LETTER T 1F1F9 ; [.17FB.0020.000A.1F1F9] # REGIONAL INDICATOR SYMBOL LETTER T 1D413 ; [.17FB.0020.000B.1D413] # MATHEMATICAL BOLD CAPITAL T 1D447 ; [.17FB.0020.000B.1D447] # MATHEMATICAL ITALIC CAPITAL T 1D47B ; [.17FB.0020.000B.1D47B] # MATHEMATICAL BOLD ITALIC CAPITAL T 1D4AF ; [.17FB.0020.000B.1D4AF] # MATHEMATICAL SCRIPT CAPITAL T 1D4E3 ; [.17FB.0020.000B.1D4E3] # MATHEMATICAL BOLD SCRIPT CAPITAL T 1D517 ; [.17FB.0020.000B.1D517] # MATHEMATICAL FRAKTUR CAPITAL T 1D54B ; [.17FB.0020.000B.1D54B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL T 1D57F ; [.17FB.0020.000B.1D57F] # MATHEMATICAL BOLD FRAKTUR CAPITAL T 1D5B3 ; [.17FB.0020.000B.1D5B3] # MATHEMATICAL SANS-SERIF CAPITAL T 1D5E7 ; [.17FB.0020.000B.1D5E7] # MATHEMATICAL SANS-SERIF BOLD CAPITAL T 1D61B ; [.17FB.0020.000B.1D61B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL T 1D64F ; [.17FB.0020.000B.1D64F] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T 1D683 ; [.17FB.0020.000B.1D683] # MATHEMATICAL MONOSPACE CAPITAL T 24C9 ; [.17FB.0020.000C.24C9] # CIRCLED LATIN CAPITAL LETTER T 1F163 ; [.17FB.0020.000C.1F163] # NEGATIVE CIRCLED LATIN CAPITAL LETTER T 1D57 ; [.17FB.0020.0014.1D57] # MODIFIER LETTER SMALL T 209C ; [.17FB.0020.0015.209C] # LATIN SUBSCRIPT SMALL LETTER T 1D40 ; [.17FB.0020.001D.1D40] # MODIFIER LETTER CAPITAL T 1F143 ; [.17FB.0020.001D.1F143] # SQUARED LATIN CAPITAL LETTER T 1F183 ; [.17FB.0020.001D.1F183] # NEGATIVE SQUARED LATIN CAPITAL LETTER T 0165 ; [.17FB.0020.0002.0074][.0000.0041.0002.030C] # LATIN SMALL LETTER T WITH CARON 0164 ; [.17FB.0020.0008.0054][.0000.0041.0002.030C] # LATIN CAPITAL LETTER T WITH CARON 1E97 ; [.17FB.0020.0002.0074][.0000.0047.0002.0308] # LATIN SMALL LETTER T WITH DIAERESIS 1E6B ; [.17FB.0020.0002.0074][.0000.0052.0002.0307] # LATIN SMALL LETTER T WITH DOT ABOVE 1E6A ; [.17FB.0020.0008.0054][.0000.0052.0002.0307] # LATIN CAPITAL LETTER T WITH DOT ABOVE 0163 ; [.17FB.0020.0002.0074][.0000.0056.0002.0327] # LATIN SMALL LETTER T WITH CEDILLA 0162 ; [.17FB.0020.0008.0054][.0000.0056.0002.0327] # LATIN CAPITAL LETTER T WITH CEDILLA 1E6D ; [.17FB.0020.0002.0074][.0000.0070.0002.0323] # LATIN SMALL LETTER T WITH DOT BELOW 1E6C ; [.17FB.0020.0008.0054][.0000.0070.0002.0323] # LATIN CAPITAL LETTER T WITH DOT BELOW 021B ; [.17FB.0020.0002.0074][.0000.0077.0002.0326] # LATIN SMALL LETTER T WITH COMMA BELOW 021A ; [.17FB.0020.0008.0054][.0000.0077.0002.0326] # LATIN CAPITAL LETTER T WITH COMMA BELOW 1E71 ; [.17FB.0020.0002.0074][.0000.0078.0002.032D] # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW 1E70 ; [.17FB.0020.0008.0054][.0000.0078.0002.032D] # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW 1E6F ; [.17FB.0020.0002.0074][.0000.007B.0002.0331] # LATIN SMALL LETTER T WITH LINE BELOW 1E6E ; [.17FB.0020.0008.0054][.0000.007B.0002.0331] # LATIN CAPITAL LETTER T WITH LINE BELOW A787 ; [.17FB.0020.0004.A787][.0000.013A.0004.A787] # LATIN SMALL LETTER INSULAR T A786 ; [.17FB.0020.000A.A786][.0000.013A.0004.A786] # LATIN CAPITAL LETTER INSULAR T 02A8 ; [.17FB.0020.0004.02A8][.1610.0020.0004.02A8] # LATIN SMALL LETTER TC DIGRAPH WITH CURL 2121 ; [.17FB.0020.000A.2121][.1631.0020.000A.2121][.16F6.0020.001F.2121] # TELEPHONE SIGN 1D7A ; [.17FB.0020.0004.1D7A][.0000.0139.0004.1D7A][.1699.0020.001F.1D7A] # LATIN SMALL LETTER TH WITH STRIKETHROUGH 3394 ; [.17FB.0020.001D.3394][.1699.0020.001D.3394][.187A.0020.001F.3394] # SQUARE THZ 2122 ; [.17FB.0020.0014.2122][.1726.0020.0014.2122] # TRADE MARK SIGN 01BE ; [.17FB.0020.0004.01BE][.17D8.0020.0004.01BE] # LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE 02A6 ; [.17FB.0020.0004.02A6][.17D8.0020.0004.02A6] # LATIN SMALL LETTER TS DIGRAPH 02A7 ; [.17FB.0020.0004.02A7][.17E9.0020.0004.02A7] # LATIN SMALL LETTER TESH DIGRAPH A729 ; [.17FB.0020.0004.A729][.187A.0020.0004.A729] # LATIN SMALL LETTER TZ A728 ; [.17FB.0020.000A.A728][.187A.0020.0004.A728] # LATIN CAPITAL LETTER TZ 1D1B ; [.17FF.0020.0002.1D1B] # LATIN LETTER SMALL CAPITAL T 0167 ; [.1800.0020.0002.0167] # LATIN SMALL LETTER T WITH STROKE 0166 ; [.1800.0020.0008.0166] # LATIN CAPITAL LETTER T WITH STROKE 2C66 ; [.1804.0020.0002.2C66] # LATIN SMALL LETTER T WITH DIAGONAL STROKE 023E ; [.1804.0020.0008.023E] # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE 1D75 ; [.1805.0020.0002.1D75] # LATIN SMALL LETTER T WITH MIDDLE TILDE 01AB ; [.1806.0020.0002.01AB] # LATIN SMALL LETTER T WITH PALATAL HOOK 1DB5 ; [.1806.0020.0014.1DB5] # MODIFIER LETTER SMALL T WITH PALATAL HOOK 01AD ; [.180A.0020.0002.01AD] # LATIN SMALL LETTER T WITH HOOK 01AC ; [.180A.0020.0008.01AC] # LATIN CAPITAL LETTER T WITH HOOK 0288 ; [.180E.0020.0002.0288] # LATIN SMALL LETTER T WITH RETROFLEX HOOK 01AE ; [.180E.0020.0008.01AE] # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK 0236 ; [.1812.0020.0002.0236] # LATIN SMALL LETTER T WITH CURL A777 ; [.1816.0020.0002.A777] # LATIN SMALL LETTER TUM 0287 ; [.1817.0020.0002.0287] # LATIN SMALL LETTER TURNED T 0075 ; [.181B.0020.0002.0075] # LATIN SMALL LETTER U FF55 ; [.181B.0020.0003.FF55] # FULLWIDTH LATIN SMALL LETTER U 0367 ; [.181B.0020.0004.0367] # COMBINING LATIN SMALL LETTER U 24B0 ; [*02FB.0020.0004.24B0][.181B.0020.0004.24B0][*02FC.0020.001F.24B0] # PARENTHESIZED LATIN SMALL LETTER U 1D42E ; [.181B.0020.0005.1D42E] # MATHEMATICAL BOLD SMALL U 1D462 ; [.181B.0020.0005.1D462] # MATHEMATICAL ITALIC SMALL U 1D496 ; [.181B.0020.0005.1D496] # MATHEMATICAL BOLD ITALIC SMALL U 1D4CA ; [.181B.0020.0005.1D4CA] # MATHEMATICAL SCRIPT SMALL U 1D4FE ; [.181B.0020.0005.1D4FE] # MATHEMATICAL BOLD SCRIPT SMALL U 1D532 ; [.181B.0020.0005.1D532] # MATHEMATICAL FRAKTUR SMALL U 1D566 ; [.181B.0020.0005.1D566] # MATHEMATICAL DOUBLE-STRUCK SMALL U 1D59A ; [.181B.0020.0005.1D59A] # MATHEMATICAL BOLD FRAKTUR SMALL U 1D5CE ; [.181B.0020.0005.1D5CE] # MATHEMATICAL SANS-SERIF SMALL U 1D602 ; [.181B.0020.0005.1D602] # MATHEMATICAL SANS-SERIF BOLD SMALL U 1D636 ; [.181B.0020.0005.1D636] # MATHEMATICAL SANS-SERIF ITALIC SMALL U 1D66A ; [.181B.0020.0005.1D66A] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U 1D69E ; [.181B.0020.0005.1D69E] # MATHEMATICAL MONOSPACE SMALL U 24E4 ; [.181B.0020.0006.24E4] # CIRCLED LATIN SMALL LETTER U 0055 ; [.181B.0020.0008.0055] # LATIN CAPITAL LETTER U FF35 ; [.181B.0020.0009.FF35] # FULLWIDTH LATIN CAPITAL LETTER U 1F124 ; [*02FB.0020.0004.1F124][.181B.0020.000A.1F124][*02FC.0020.001F.1F124] # PARENTHESIZED LATIN CAPITAL LETTER U 1F1FA ; [.181B.0020.000A.1F1FA] # REGIONAL INDICATOR SYMBOL LETTER U 1D414 ; [.181B.0020.000B.1D414] # MATHEMATICAL BOLD CAPITAL U 1D448 ; [.181B.0020.000B.1D448] # MATHEMATICAL ITALIC CAPITAL U 1D47C ; [.181B.0020.000B.1D47C] # MATHEMATICAL BOLD ITALIC CAPITAL U 1D4B0 ; [.181B.0020.000B.1D4B0] # MATHEMATICAL SCRIPT CAPITAL U 1D4E4 ; [.181B.0020.000B.1D4E4] # MATHEMATICAL BOLD SCRIPT CAPITAL U 1D518 ; [.181B.0020.000B.1D518] # MATHEMATICAL FRAKTUR CAPITAL U 1D54C ; [.181B.0020.000B.1D54C] # MATHEMATICAL DOUBLE-STRUCK CAPITAL U 1D580 ; [.181B.0020.000B.1D580] # MATHEMATICAL BOLD FRAKTUR CAPITAL U 1D5B4 ; [.181B.0020.000B.1D5B4] # MATHEMATICAL SANS-SERIF CAPITAL U 1D5E8 ; [.181B.0020.000B.1D5E8] # MATHEMATICAL SANS-SERIF BOLD CAPITAL U 1D61C ; [.181B.0020.000B.1D61C] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL U 1D650 ; [.181B.0020.000B.1D650] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U 1D684 ; [.181B.0020.000B.1D684] # MATHEMATICAL MONOSPACE CAPITAL U 24CA ; [.181B.0020.000C.24CA] # CIRCLED LATIN CAPITAL LETTER U 1F164 ; [.181B.0020.000C.1F164] # NEGATIVE CIRCLED LATIN CAPITAL LETTER U 1D58 ; [.181B.0020.0014.1D58] # MODIFIER LETTER SMALL U 1D64 ; [.181B.0020.0015.1D64] # LATIN SUBSCRIPT SMALL LETTER U 1D41 ; [.181B.0020.001D.1D41] # MODIFIER LETTER CAPITAL U 1F144 ; [.181B.0020.001D.1F144] # SQUARED LATIN CAPITAL LETTER U 1F184 ; [.181B.0020.001D.1F184] # NEGATIVE SQUARED LATIN CAPITAL LETTER U 00FA ; [.181B.0020.0002.0075][.0000.0032.0002.0301] # LATIN SMALL LETTER U WITH ACUTE 00DA ; [.181B.0020.0008.0055][.0000.0032.0002.0301] # LATIN CAPITAL LETTER U WITH ACUTE 00F9 ; [.181B.0020.0002.0075][.0000.0035.0002.0300] # LATIN SMALL LETTER U WITH GRAVE 00D9 ; [.181B.0020.0008.0055][.0000.0035.0002.0300] # LATIN CAPITAL LETTER U WITH GRAVE 016D ; [.181B.0020.0002.0075][.0000.0037.0002.0306] # LATIN SMALL LETTER U WITH BREVE 016C ; [.181B.0020.0008.0055][.0000.0037.0002.0306] # LATIN CAPITAL LETTER U WITH BREVE 00FB ; [.181B.0020.0002.0075][.0000.003C.0002.0302] # LATIN SMALL LETTER U WITH CIRCUMFLEX 00DB ; [.181B.0020.0008.0055][.0000.003C.0002.0302] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX 01D4 ; [.181B.0020.0002.0075][.0000.0041.0002.030C] # LATIN SMALL LETTER U WITH CARON 01D3 ; [.181B.0020.0008.0055][.0000.0041.0002.030C] # LATIN CAPITAL LETTER U WITH CARON 016F ; [.181B.0020.0002.0075][.0000.0043.0002.030A] # LATIN SMALL LETTER U WITH RING ABOVE 016E ; [.181B.0020.0008.0055][.0000.0043.0002.030A] # LATIN CAPITAL LETTER U WITH RING ABOVE 00FC ; [.181B.0020.0002.0075][.0000.0047.0002.0308] # LATIN SMALL LETTER U WITH DIAERESIS 00DC ; [.181B.0020.0008.0055][.0000.0047.0002.0308] # LATIN CAPITAL LETTER U WITH DIAERESIS 01D8 ; [.181B.0020.0002.0075][.0000.0047.0002.0308][.0000.0032.0002.0301] # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE 01D7 ; [.181B.0020.0008.0055][.0000.0047.0002.0308][.0000.0032.0002.0301] # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE 01DC ; [.181B.0020.0002.0075][.0000.0047.0002.0308][.0000.0035.0002.0300] # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE 01DB ; [.181B.0020.0008.0055][.0000.0047.0002.0308][.0000.0035.0002.0300] # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE 01DA ; [.181B.0020.0002.0075][.0000.0047.0002.0308][.0000.0041.0002.030C] # LATIN SMALL LETTER U WITH DIAERESIS AND CARON 01D9 ; [.181B.0020.0008.0055][.0000.0047.0002.0308][.0000.0041.0002.030C] # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON 01D6 ; [.181B.0020.0002.0075][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON 01D5 ; [.181B.0020.0008.0055][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON 0171 ; [.181B.0020.0002.0075][.0000.004D.0002.030B] # LATIN SMALL LETTER U WITH DOUBLE ACUTE 0170 ; [.181B.0020.0008.0055][.0000.004D.0002.030B] # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE 0169 ; [.181B.0020.0002.0075][.0000.004E.0002.0303] # LATIN SMALL LETTER U WITH TILDE 0168 ; [.181B.0020.0008.0055][.0000.004E.0002.0303] # LATIN CAPITAL LETTER U WITH TILDE 1E79 ; [.181B.0020.0002.0075][.0000.004E.0002.0303][.0000.0032.0002.0301] # LATIN SMALL LETTER U WITH TILDE AND ACUTE 1E78 ; [.181B.0020.0008.0055][.0000.004E.0002.0303][.0000.0032.0002.0301] # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE 0173 ; [.181B.0020.0002.0075][.0000.0059.0002.0328] # LATIN SMALL LETTER U WITH OGONEK 0172 ; [.181B.0020.0008.0055][.0000.0059.0002.0328] # LATIN CAPITAL LETTER U WITH OGONEK 016B ; [.181B.0020.0002.0075][.0000.005B.0002.0304] # LATIN SMALL LETTER U WITH MACRON 016A ; [.181B.0020.0008.0055][.0000.005B.0002.0304] # LATIN CAPITAL LETTER U WITH MACRON 1E7B ; [.181B.0020.0002.0075][.0000.005B.0002.0304][.0000.0047.0002.0308] # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS 1E7A ; [.181B.0020.0008.0055][.0000.005B.0002.0304][.0000.0047.0002.0308] # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS 1EE7 ; [.181B.0020.0002.0075][.0000.0064.0002.0309] # LATIN SMALL LETTER U WITH HOOK ABOVE 1EE6 ; [.181B.0020.0008.0055][.0000.0064.0002.0309] # LATIN CAPITAL LETTER U WITH HOOK ABOVE 0215 ; [.181B.0020.0002.0075][.0000.0065.0002.030F] # LATIN SMALL LETTER U WITH DOUBLE GRAVE 0214 ; [.181B.0020.0008.0055][.0000.0065.0002.030F] # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE 0217 ; [.181B.0020.0002.0075][.0000.0067.0002.0311] # LATIN SMALL LETTER U WITH INVERTED BREVE 0216 ; [.181B.0020.0008.0055][.0000.0067.0002.0311] # LATIN CAPITAL LETTER U WITH INVERTED BREVE 01B0 ; [.181B.0020.0002.0075][.0000.0068.0002.031B] # LATIN SMALL LETTER U WITH HORN 01AF ; [.181B.0020.0008.0055][.0000.0068.0002.031B] # LATIN CAPITAL LETTER U WITH HORN 1EE9 ; [.181B.0020.0002.0075][.0000.0068.0002.031B][.0000.0032.0002.0301] # LATIN SMALL LETTER U WITH HORN AND ACUTE 1EE8 ; [.181B.0020.0008.0055][.0000.0068.0002.031B][.0000.0032.0002.0301] # LATIN CAPITAL LETTER U WITH HORN AND ACUTE 1EEB ; [.181B.0020.0002.0075][.0000.0068.0002.031B][.0000.0035.0002.0300] # LATIN SMALL LETTER U WITH HORN AND GRAVE 1EEA ; [.181B.0020.0008.0055][.0000.0068.0002.031B][.0000.0035.0002.0300] # LATIN CAPITAL LETTER U WITH HORN AND GRAVE 1EEF ; [.181B.0020.0002.0075][.0000.0068.0002.031B][.0000.004E.0002.0303] # LATIN SMALL LETTER U WITH HORN AND TILDE 1EEE ; [.181B.0020.0008.0055][.0000.0068.0002.031B][.0000.004E.0002.0303] # LATIN CAPITAL LETTER U WITH HORN AND TILDE 1EED ; [.181B.0020.0002.0075][.0000.0068.0002.031B][.0000.0064.0002.0309] # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE 1EEC ; [.181B.0020.0008.0055][.0000.0068.0002.031B][.0000.0064.0002.0309] # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE 1EF1 ; [.181B.0020.0002.0075][.0000.0068.0002.031B][.0000.0070.0002.0323] # LATIN SMALL LETTER U WITH HORN AND DOT BELOW 1EF0 ; [.181B.0020.0008.0055][.0000.0068.0002.031B][.0000.0070.0002.0323] # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW 1EE5 ; [.181B.0020.0002.0075][.0000.0070.0002.0323] # LATIN SMALL LETTER U WITH DOT BELOW 1EE4 ; [.181B.0020.0008.0055][.0000.0070.0002.0323] # LATIN CAPITAL LETTER U WITH DOT BELOW 1E73 ; [.181B.0020.0002.0075][.0000.0075.0002.0324] # LATIN SMALL LETTER U WITH DIAERESIS BELOW 1E72 ; [.181B.0020.0008.0055][.0000.0075.0002.0324] # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW 1E77 ; [.181B.0020.0002.0075][.0000.0078.0002.032D] # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW 1E76 ; [.181B.0020.0008.0055][.0000.0078.0002.032D] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW 1E75 ; [.181B.0020.0002.0075][.0000.007A.0002.0330] # LATIN SMALL LETTER U WITH TILDE BELOW 1E74 ; [.181B.0020.0008.0055][.0000.007A.0002.0330] # LATIN CAPITAL LETTER U WITH TILDE BELOW 1F199 ; [.181B.0020.001D.1F199][.177B.0020.001D.1F199][*025E.0020.001F.1F199] # SQUARED UP WITH EXCLAMATION MARK 1D1C ; [.181F.0020.0002.1D1C] # LATIN LETTER SMALL CAPITAL U 1DB8 ; [.181F.0020.0014.1DB8] # MODIFIER LETTER SMALL CAPITAL U 1D1D ; [.1820.0020.0002.1D1D] # LATIN SMALL LETTER SIDEWAYS U 1D59 ; [.1820.0020.0014.1D59] # MODIFIER LETTER SMALL SIDEWAYS U 1D1E ; [.1821.0020.0002.1D1E] # LATIN SMALL LETTER SIDEWAYS DIAERESIZED U 1D6B ; [.1822.0020.0002.1D6B] # LATIN SMALL LETTER UE 0289 ; [.1823.0020.0002.0289] # LATIN SMALL LETTER U BAR 0244 ; [.1823.0020.0008.0244] # LATIN CAPITAL LETTER U BAR 1DB6 ; [.1823.0020.0014.1DB6] # MODIFIER LETTER SMALL U BAR 1D7E ; [.1827.0020.0002.1D7E] # LATIN SMALL CAPITAL LETTER U WITH STROKE 1D99 ; [.1828.0020.0002.1D99] # LATIN SMALL LETTER U WITH RETROFLEX HOOK 0265 ; [.1829.0020.0002.0265] # LATIN SMALL LETTER TURNED H A78D ; [.1829.0020.0008.A78D] # LATIN CAPITAL LETTER TURNED H 1DA3 ; [.1829.0020.0014.1DA3] # MODIFIER LETTER SMALL TURNED H 02AE ; [.182D.0020.0002.02AE] # LATIN SMALL LETTER TURNED H WITH FISHHOOK 02AF ; [.1831.0020.0002.02AF] # LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL 026F ; [.1835.0020.0002.026F] # LATIN SMALL LETTER TURNED M 019C ; [.1835.0020.0008.019C] # LATIN CAPITAL LETTER TURNED M 1D5A ; [.1835.0020.0014.1D5A] # MODIFIER LETTER SMALL TURNED M A7FA ; [.1839.0020.0002.A7FA] # LATIN LETTER SMALL CAPITAL TURNED M 1D1F ; [.183A.0020.0002.1D1F] # LATIN SMALL LETTER SIDEWAYS TURNED M 0270 ; [.183B.0020.0002.0270] # LATIN SMALL LETTER TURNED M WITH LONG LEG 1DAD ; [.183B.0020.0014.1DAD] # MODIFIER LETTER SMALL TURNED M WITH LONG LEG 028A ; [.183F.0020.0002.028A] # LATIN SMALL LETTER UPSILON 01B1 ; [.183F.0020.0008.01B1] # LATIN CAPITAL LETTER UPSILON 1DB7 ; [.183F.0020.0014.1DB7] # MODIFIER LETTER SMALL UPSILON 1D7F ; [.1843.0020.0002.1D7F] # LATIN SMALL LETTER UPSILON WITH STROKE 0076 ; [.1844.0020.0002.0076] # LATIN SMALL LETTER V FF56 ; [.1844.0020.0003.FF56] # FULLWIDTH LATIN SMALL LETTER V 036E ; [.1844.0020.0004.036E] # COMBINING LATIN SMALL LETTER V 2174 ; [.1844.0020.0004.2174] # SMALL ROMAN NUMERAL FIVE 24B1 ; [*02FB.0020.0004.24B1][.1844.0020.0004.24B1][*02FC.0020.001F.24B1] # PARENTHESIZED LATIN SMALL LETTER V 1D42F ; [.1844.0020.0005.1D42F] # MATHEMATICAL BOLD SMALL V 1D463 ; [.1844.0020.0005.1D463] # MATHEMATICAL ITALIC SMALL V 1D497 ; [.1844.0020.0005.1D497] # MATHEMATICAL BOLD ITALIC SMALL V 1D4CB ; [.1844.0020.0005.1D4CB] # MATHEMATICAL SCRIPT SMALL V 1D4FF ; [.1844.0020.0005.1D4FF] # MATHEMATICAL BOLD SCRIPT SMALL V 1D533 ; [.1844.0020.0005.1D533] # MATHEMATICAL FRAKTUR SMALL V 1D567 ; [.1844.0020.0005.1D567] # MATHEMATICAL DOUBLE-STRUCK SMALL V 1D59B ; [.1844.0020.0005.1D59B] # MATHEMATICAL BOLD FRAKTUR SMALL V 1D5CF ; [.1844.0020.0005.1D5CF] # MATHEMATICAL SANS-SERIF SMALL V 1D603 ; [.1844.0020.0005.1D603] # MATHEMATICAL SANS-SERIF BOLD SMALL V 1D637 ; [.1844.0020.0005.1D637] # MATHEMATICAL SANS-SERIF ITALIC SMALL V 1D66B ; [.1844.0020.0005.1D66B] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V 1D69F ; [.1844.0020.0005.1D69F] # MATHEMATICAL MONOSPACE SMALL V 24E5 ; [.1844.0020.0006.24E5] # CIRCLED LATIN SMALL LETTER V 0056 ; [.1844.0020.0008.0056] # LATIN CAPITAL LETTER V FF36 ; [.1844.0020.0009.FF36] # FULLWIDTH LATIN CAPITAL LETTER V 2164 ; [.1844.0020.000A.2164] # ROMAN NUMERAL FIVE 1F125 ; [*02FB.0020.0004.1F125][.1844.0020.000A.1F125][*02FC.0020.001F.1F125] # PARENTHESIZED LATIN CAPITAL LETTER V 1F1FB ; [.1844.0020.000A.1F1FB] # REGIONAL INDICATOR SYMBOL LETTER V 1D415 ; [.1844.0020.000B.1D415] # MATHEMATICAL BOLD CAPITAL V 1D449 ; [.1844.0020.000B.1D449] # MATHEMATICAL ITALIC CAPITAL V 1D47D ; [.1844.0020.000B.1D47D] # MATHEMATICAL BOLD ITALIC CAPITAL V 1D4B1 ; [.1844.0020.000B.1D4B1] # MATHEMATICAL SCRIPT CAPITAL V 1D4E5 ; [.1844.0020.000B.1D4E5] # MATHEMATICAL BOLD SCRIPT CAPITAL V 1D519 ; [.1844.0020.000B.1D519] # MATHEMATICAL FRAKTUR CAPITAL V 1D54D ; [.1844.0020.000B.1D54D] # MATHEMATICAL DOUBLE-STRUCK CAPITAL V 1D581 ; [.1844.0020.000B.1D581] # MATHEMATICAL BOLD FRAKTUR CAPITAL V 1D5B5 ; [.1844.0020.000B.1D5B5] # MATHEMATICAL SANS-SERIF CAPITAL V 1D5E9 ; [.1844.0020.000B.1D5E9] # MATHEMATICAL SANS-SERIF BOLD CAPITAL V 1D61D ; [.1844.0020.000B.1D61D] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL V 1D651 ; [.1844.0020.000B.1D651] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V 1D685 ; [.1844.0020.000B.1D685] # MATHEMATICAL MONOSPACE CAPITAL V 24CB ; [.1844.0020.000C.24CB] # CIRCLED LATIN CAPITAL LETTER V 1F165 ; [.1844.0020.000C.1F165] # NEGATIVE CIRCLED LATIN CAPITAL LETTER V 1D5B ; [.1844.0020.0014.1D5B] # MODIFIER LETTER SMALL V 1D65 ; [.1844.0020.0015.1D65] # LATIN SUBSCRIPT SMALL LETTER V 2C7D ; [.1844.0020.001D.2C7D] # MODIFIER LETTER CAPITAL V 1F145 ; [.1844.0020.001D.1F145] # SQUARED LATIN CAPITAL LETTER V 1F185 ; [.1844.0020.001D.1F185] # NEGATIVE SQUARED LATIN CAPITAL LETTER V 1E7D ; [.1844.0020.0002.0076][.0000.004E.0002.0303] # LATIN SMALL LETTER V WITH TILDE 1E7C ; [.1844.0020.0008.0056][.0000.004E.0002.0303] # LATIN CAPITAL LETTER V WITH TILDE 1E7F ; [.1844.0020.0002.0076][.0000.0070.0002.0323] # LATIN SMALL LETTER V WITH DOT BELOW 1E7E ; [.1844.0020.0008.0056][.0000.0070.0002.0323] # LATIN CAPITAL LETTER V WITH DOT BELOW 2175 ; [.1844.0020.0004.2175][.16B2.0020.0004.2175] # SMALL ROMAN NUMERAL SIX 2165 ; [.1844.0020.000A.2165][.16B2.0020.000A.2165] # ROMAN NUMERAL SIX 2176 ; [.1844.0020.0004.2176][.16B2.0020.0004.2176][.16B2.0020.001F.2176] # SMALL ROMAN NUMERAL SEVEN 2166 ; [.1844.0020.000A.2166][.16B2.0020.000A.2166][.16B2.0020.001F.2166] # ROMAN NUMERAL SEVEN 2177 ; [.1844.0020.0004.2177][.16B2.0020.0004.2177][.16B2.0020.001F.2177][.16B2.0020.001F.2177] # SMALL ROMAN NUMERAL EIGHT 2167 ; [.1844.0020.000A.2167][.16B2.0020.000A.2167][.16B2.0020.001F.2167][.16B2.0020.001F.2167] # ROMAN NUMERAL EIGHT 33DE ; [.1844.0020.001D.33DE][*05AB.0020.001C.33DE][.1726.0020.001F.33DE] # SQUARE V OVER M 1F19A ; [.1844.0020.001D.1F19A][.17D8.0020.001D.1F19A] # SQUARED VS A761 ; [.1844.0020.0004.A761][.1865.0020.0004.A761] # LATIN SMALL LETTER VY A760 ; [.1844.0020.000A.A760][.1865.0020.000A.A760] # LATIN CAPITAL LETTER VY 1D20 ; [.1848.0020.0002.1D20] # LATIN LETTER SMALL CAPITAL V A75F ; [.1849.0020.0002.A75F] # LATIN SMALL LETTER V WITH DIAGONAL STROKE A75E ; [.1849.0020.0008.A75E] # LATIN CAPITAL LETTER V WITH DIAGONAL STROKE 1D8C ; [.184A.0020.0002.1D8C] # LATIN SMALL LETTER V WITH PALATAL HOOK 028B ; [.184B.0020.0002.028B] # LATIN SMALL LETTER V WITH HOOK 01B2 ; [.184B.0020.0008.01B2] # LATIN CAPITAL LETTER V WITH HOOK 1DB9 ; [.184B.0020.0014.1DB9] # MODIFIER LETTER SMALL V WITH HOOK 2C71 ; [.184F.0020.0002.2C71] # LATIN SMALL LETTER V WITH RIGHT HOOK 2C74 ; [.1850.0020.0002.2C74] # LATIN SMALL LETTER V WITH CURL 1EFD ; [.1851.0020.0002.1EFD] # LATIN SMALL LETTER MIDDLE-WELSH V 1EFC ; [.1851.0020.0008.1EFC] # LATIN CAPITAL LETTER MIDDLE-WELSH V 028C ; [.1852.0020.0002.028C] # LATIN SMALL LETTER TURNED V 0245 ; [.1852.0020.0008.0245] # LATIN CAPITAL LETTER TURNED V 1DBA ; [.1852.0020.0014.1DBA] # MODIFIER LETTER SMALL TURNED V 0077 ; [.1856.0020.0002.0077] # LATIN SMALL LETTER W FF57 ; [.1856.0020.0003.FF57] # FULLWIDTH LATIN SMALL LETTER W 24B2 ; [*02FB.0020.0004.24B2][.1856.0020.0004.24B2][*02FC.0020.001F.24B2] # PARENTHESIZED LATIN SMALL LETTER W 1D430 ; [.1856.0020.0005.1D430] # MATHEMATICAL BOLD SMALL W 1D464 ; [.1856.0020.0005.1D464] # MATHEMATICAL ITALIC SMALL W 1D498 ; [.1856.0020.0005.1D498] # MATHEMATICAL BOLD ITALIC SMALL W 1D4CC ; [.1856.0020.0005.1D4CC] # MATHEMATICAL SCRIPT SMALL W 1D500 ; [.1856.0020.0005.1D500] # MATHEMATICAL BOLD SCRIPT SMALL W 1D534 ; [.1856.0020.0005.1D534] # MATHEMATICAL FRAKTUR SMALL W 1D568 ; [.1856.0020.0005.1D568] # MATHEMATICAL DOUBLE-STRUCK SMALL W 1D59C ; [.1856.0020.0005.1D59C] # MATHEMATICAL BOLD FRAKTUR SMALL W 1D5D0 ; [.1856.0020.0005.1D5D0] # MATHEMATICAL SANS-SERIF SMALL W 1D604 ; [.1856.0020.0005.1D604] # MATHEMATICAL SANS-SERIF BOLD SMALL W 1D638 ; [.1856.0020.0005.1D638] # MATHEMATICAL SANS-SERIF ITALIC SMALL W 1D66C ; [.1856.0020.0005.1D66C] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W 1D6A0 ; [.1856.0020.0005.1D6A0] # MATHEMATICAL MONOSPACE SMALL W 24E6 ; [.1856.0020.0006.24E6] # CIRCLED LATIN SMALL LETTER W 0057 ; [.1856.0020.0008.0057] # LATIN CAPITAL LETTER W FF37 ; [.1856.0020.0009.FF37] # FULLWIDTH LATIN CAPITAL LETTER W 1F126 ; [*02FB.0020.0004.1F126][.1856.0020.000A.1F126][*02FC.0020.001F.1F126] # PARENTHESIZED LATIN CAPITAL LETTER W 1F1FC ; [.1856.0020.000A.1F1FC] # REGIONAL INDICATOR SYMBOL LETTER W 1D416 ; [.1856.0020.000B.1D416] # MATHEMATICAL BOLD CAPITAL W 1D44A ; [.1856.0020.000B.1D44A] # MATHEMATICAL ITALIC CAPITAL W 1D47E ; [.1856.0020.000B.1D47E] # MATHEMATICAL BOLD ITALIC CAPITAL W 1D4B2 ; [.1856.0020.000B.1D4B2] # MATHEMATICAL SCRIPT CAPITAL W 1D4E6 ; [.1856.0020.000B.1D4E6] # MATHEMATICAL BOLD SCRIPT CAPITAL W 1D51A ; [.1856.0020.000B.1D51A] # MATHEMATICAL FRAKTUR CAPITAL W 1D54E ; [.1856.0020.000B.1D54E] # MATHEMATICAL DOUBLE-STRUCK CAPITAL W 1D582 ; [.1856.0020.000B.1D582] # MATHEMATICAL BOLD FRAKTUR CAPITAL W 1D5B6 ; [.1856.0020.000B.1D5B6] # MATHEMATICAL SANS-SERIF CAPITAL W 1D5EA ; [.1856.0020.000B.1D5EA] # MATHEMATICAL SANS-SERIF BOLD CAPITAL W 1D61E ; [.1856.0020.000B.1D61E] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL W 1D652 ; [.1856.0020.000B.1D652] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W 1D686 ; [.1856.0020.000B.1D686] # MATHEMATICAL MONOSPACE CAPITAL W 24CC ; [.1856.0020.000C.24CC] # CIRCLED LATIN CAPITAL LETTER W 1F166 ; [.1856.0020.000C.1F166] # NEGATIVE CIRCLED LATIN CAPITAL LETTER W 02B7 ; [.1856.0020.0014.02B7] # MODIFIER LETTER SMALL W 1D42 ; [.1856.0020.001D.1D42] # MODIFIER LETTER CAPITAL W 1F146 ; [.1856.0020.001D.1F146] # SQUARED LATIN CAPITAL LETTER W 1F186 ; [.1856.0020.001D.1F186] # NEGATIVE SQUARED LATIN CAPITAL LETTER W 1E83 ; [.1856.0020.0002.0077][.0000.0032.0002.0301] # LATIN SMALL LETTER W WITH ACUTE 1E82 ; [.1856.0020.0008.0057][.0000.0032.0002.0301] # LATIN CAPITAL LETTER W WITH ACUTE 1E81 ; [.1856.0020.0002.0077][.0000.0035.0002.0300] # LATIN SMALL LETTER W WITH GRAVE 1E80 ; [.1856.0020.0008.0057][.0000.0035.0002.0300] # LATIN CAPITAL LETTER W WITH GRAVE 0175 ; [.1856.0020.0002.0077][.0000.003C.0002.0302] # LATIN SMALL LETTER W WITH CIRCUMFLEX 0174 ; [.1856.0020.0008.0057][.0000.003C.0002.0302] # LATIN CAPITAL LETTER W WITH CIRCUMFLEX 1E98 ; [.1856.0020.0002.0077][.0000.0043.0002.030A] # LATIN SMALL LETTER W WITH RING ABOVE 1E85 ; [.1856.0020.0002.0077][.0000.0047.0002.0308] # LATIN SMALL LETTER W WITH DIAERESIS 1E84 ; [.1856.0020.0008.0057][.0000.0047.0002.0308] # LATIN CAPITAL LETTER W WITH DIAERESIS 1E87 ; [.1856.0020.0002.0077][.0000.0052.0002.0307] # LATIN SMALL LETTER W WITH DOT ABOVE 1E86 ; [.1856.0020.0008.0057][.0000.0052.0002.0307] # LATIN CAPITAL LETTER W WITH DOT ABOVE 1E89 ; [.1856.0020.0002.0077][.0000.0070.0002.0323] # LATIN SMALL LETTER W WITH DOT BELOW 1E88 ; [.1856.0020.0008.0057][.0000.0070.0002.0323] # LATIN CAPITAL LETTER W WITH DOT BELOW 33DD ; [.1856.0020.001D.33DD][.15EA.0020.001C.33DD] # SQUARE WB 1F14F ; [.1856.0020.001D.1F14F][.1602.0020.001D.1F14F] # SQUARED WC 1F18F ; [.1856.0020.001D.1F18F][.1602.0020.001D.1F18F] # NEGATIVE SQUARED WC 1F12E ; [.1856.0020.000C.1F12E][.187A.0020.000C.1F12E] # CIRCLED WZ 1D21 ; [.185A.0020.0002.1D21] # LATIN LETTER SMALL CAPITAL W 2C73 ; [.185B.0020.0002.2C73] # LATIN SMALL LETTER W WITH HOOK 2C72 ; [.185B.0020.0008.2C72] # LATIN CAPITAL LETTER W WITH HOOK 028D ; [.185C.0020.0002.028D] # LATIN SMALL LETTER TURNED W 0078 ; [.1860.0020.0002.0078] # LATIN SMALL LETTER X FF58 ; [.1860.0020.0003.FF58] # FULLWIDTH LATIN SMALL LETTER X 036F ; [.1860.0020.0004.036F] # COMBINING LATIN SMALL LETTER X 2179 ; [.1860.0020.0004.2179] # SMALL ROMAN NUMERAL TEN 24B3 ; [*02FB.0020.0004.24B3][.1860.0020.0004.24B3][*02FC.0020.001F.24B3] # PARENTHESIZED LATIN SMALL LETTER X 1D431 ; [.1860.0020.0005.1D431] # MATHEMATICAL BOLD SMALL X 1D465 ; [.1860.0020.0005.1D465] # MATHEMATICAL ITALIC SMALL X 1D499 ; [.1860.0020.0005.1D499] # MATHEMATICAL BOLD ITALIC SMALL X 1D4CD ; [.1860.0020.0005.1D4CD] # MATHEMATICAL SCRIPT SMALL X 1D501 ; [.1860.0020.0005.1D501] # MATHEMATICAL BOLD SCRIPT SMALL X 1D535 ; [.1860.0020.0005.1D535] # MATHEMATICAL FRAKTUR SMALL X 1D569 ; [.1860.0020.0005.1D569] # MATHEMATICAL DOUBLE-STRUCK SMALL X 1D59D ; [.1860.0020.0005.1D59D] # MATHEMATICAL BOLD FRAKTUR SMALL X 1D5D1 ; [.1860.0020.0005.1D5D1] # MATHEMATICAL SANS-SERIF SMALL X 1D605 ; [.1860.0020.0005.1D605] # MATHEMATICAL SANS-SERIF BOLD SMALL X 1D639 ; [.1860.0020.0005.1D639] # MATHEMATICAL SANS-SERIF ITALIC SMALL X 1D66D ; [.1860.0020.0005.1D66D] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X 1D6A1 ; [.1860.0020.0005.1D6A1] # MATHEMATICAL MONOSPACE SMALL X 24E7 ; [.1860.0020.0006.24E7] # CIRCLED LATIN SMALL LETTER X 0058 ; [.1860.0020.0008.0058] # LATIN CAPITAL LETTER X FF38 ; [.1860.0020.0009.FF38] # FULLWIDTH LATIN CAPITAL LETTER X 2169 ; [.1860.0020.000A.2169] # ROMAN NUMERAL TEN 1F127 ; [*02FB.0020.0004.1F127][.1860.0020.000A.1F127][*02FC.0020.001F.1F127] # PARENTHESIZED LATIN CAPITAL LETTER X 1F1FD ; [.1860.0020.000A.1F1FD] # REGIONAL INDICATOR SYMBOL LETTER X 1D417 ; [.1860.0020.000B.1D417] # MATHEMATICAL BOLD CAPITAL X 1D44B ; [.1860.0020.000B.1D44B] # MATHEMATICAL ITALIC CAPITAL X 1D47F ; [.1860.0020.000B.1D47F] # MATHEMATICAL BOLD ITALIC CAPITAL X 1D4B3 ; [.1860.0020.000B.1D4B3] # MATHEMATICAL SCRIPT CAPITAL X 1D4E7 ; [.1860.0020.000B.1D4E7] # MATHEMATICAL BOLD SCRIPT CAPITAL X 1D51B ; [.1860.0020.000B.1D51B] # MATHEMATICAL FRAKTUR CAPITAL X 1D54F ; [.1860.0020.000B.1D54F] # MATHEMATICAL DOUBLE-STRUCK CAPITAL X 1D583 ; [.1860.0020.000B.1D583] # MATHEMATICAL BOLD FRAKTUR CAPITAL X 1D5B7 ; [.1860.0020.000B.1D5B7] # MATHEMATICAL SANS-SERIF CAPITAL X 1D5EB ; [.1860.0020.000B.1D5EB] # MATHEMATICAL SANS-SERIF BOLD CAPITAL X 1D61F ; [.1860.0020.000B.1D61F] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL X 1D653 ; [.1860.0020.000B.1D653] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X 1D687 ; [.1860.0020.000B.1D687] # MATHEMATICAL MONOSPACE CAPITAL X 24CD ; [.1860.0020.000C.24CD] # CIRCLED LATIN CAPITAL LETTER X 1F167 ; [.1860.0020.000C.1F167] # NEGATIVE CIRCLED LATIN CAPITAL LETTER X 02E3 ; [.1860.0020.0014.02E3] # MODIFIER LETTER SMALL X 2093 ; [.1860.0020.0015.2093] # LATIN SUBSCRIPT SMALL LETTER X 1F147 ; [.1860.0020.001D.1F147] # SQUARED LATIN CAPITAL LETTER X 1F187 ; [.1860.0020.001D.1F187] # NEGATIVE SQUARED LATIN CAPITAL LETTER X 1E8D ; [.1860.0020.0002.0078][.0000.0047.0002.0308] # LATIN SMALL LETTER X WITH DIAERESIS 1E8C ; [.1860.0020.0008.0058][.0000.0047.0002.0308] # LATIN CAPITAL LETTER X WITH DIAERESIS 1E8B ; [.1860.0020.0002.0078][.0000.0052.0002.0307] # LATIN SMALL LETTER X WITH DOT ABOVE 1E8A ; [.1860.0020.0008.0058][.0000.0052.0002.0307] # LATIN CAPITAL LETTER X WITH DOT ABOVE 217A ; [.1860.0020.0004.217A][.16B2.0020.0004.217A] # SMALL ROMAN NUMERAL ELEVEN 216A ; [.1860.0020.000A.216A][.16B2.0020.000A.216A] # ROMAN NUMERAL ELEVEN 217B ; [.1860.0020.0004.217B][.16B2.0020.0004.217B][.16B2.0020.001F.217B] # SMALL ROMAN NUMERAL TWELVE 216B ; [.1860.0020.000A.216B][.16B2.0020.000A.216B][.16B2.0020.001F.216B] # ROMAN NUMERAL TWELVE 1D8D ; [.1864.0020.0002.1D8D] # LATIN SMALL LETTER X WITH PALATAL HOOK 0079 ; [.1865.0020.0002.0079] # LATIN SMALL LETTER Y FF59 ; [.1865.0020.0003.FF59] # FULLWIDTH LATIN SMALL LETTER Y 24B4 ; [*02FB.0020.0004.24B4][.1865.0020.0004.24B4][*02FC.0020.001F.24B4] # PARENTHESIZED LATIN SMALL LETTER Y 1D432 ; [.1865.0020.0005.1D432] # MATHEMATICAL BOLD SMALL Y 1D466 ; [.1865.0020.0005.1D466] # MATHEMATICAL ITALIC SMALL Y 1D49A ; [.1865.0020.0005.1D49A] # MATHEMATICAL BOLD ITALIC SMALL Y 1D4CE ; [.1865.0020.0005.1D4CE] # MATHEMATICAL SCRIPT SMALL Y 1D502 ; [.1865.0020.0005.1D502] # MATHEMATICAL BOLD SCRIPT SMALL Y 1D536 ; [.1865.0020.0005.1D536] # MATHEMATICAL FRAKTUR SMALL Y 1D56A ; [.1865.0020.0005.1D56A] # MATHEMATICAL DOUBLE-STRUCK SMALL Y 1D59E ; [.1865.0020.0005.1D59E] # MATHEMATICAL BOLD FRAKTUR SMALL Y 1D5D2 ; [.1865.0020.0005.1D5D2] # MATHEMATICAL SANS-SERIF SMALL Y 1D606 ; [.1865.0020.0005.1D606] # MATHEMATICAL SANS-SERIF BOLD SMALL Y 1D63A ; [.1865.0020.0005.1D63A] # MATHEMATICAL SANS-SERIF ITALIC SMALL Y 1D66E ; [.1865.0020.0005.1D66E] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y 1D6A2 ; [.1865.0020.0005.1D6A2] # MATHEMATICAL MONOSPACE SMALL Y 24E8 ; [.1865.0020.0006.24E8] # CIRCLED LATIN SMALL LETTER Y 0059 ; [.1865.0020.0008.0059] # LATIN CAPITAL LETTER Y FF39 ; [.1865.0020.0009.FF39] # FULLWIDTH LATIN CAPITAL LETTER Y 1F128 ; [*02FB.0020.0004.1F128][.1865.0020.000A.1F128][*02FC.0020.001F.1F128] # PARENTHESIZED LATIN CAPITAL LETTER Y 1F1FE ; [.1865.0020.000A.1F1FE] # REGIONAL INDICATOR SYMBOL LETTER Y 1D418 ; [.1865.0020.000B.1D418] # MATHEMATICAL BOLD CAPITAL Y 1D44C ; [.1865.0020.000B.1D44C] # MATHEMATICAL ITALIC CAPITAL Y 1D480 ; [.1865.0020.000B.1D480] # MATHEMATICAL BOLD ITALIC CAPITAL Y 1D4B4 ; [.1865.0020.000B.1D4B4] # MATHEMATICAL SCRIPT CAPITAL Y 1D4E8 ; [.1865.0020.000B.1D4E8] # MATHEMATICAL BOLD SCRIPT CAPITAL Y 1D51C ; [.1865.0020.000B.1D51C] # MATHEMATICAL FRAKTUR CAPITAL Y 1D550 ; [.1865.0020.000B.1D550] # MATHEMATICAL DOUBLE-STRUCK CAPITAL Y 1D584 ; [.1865.0020.000B.1D584] # MATHEMATICAL BOLD FRAKTUR CAPITAL Y 1D5B8 ; [.1865.0020.000B.1D5B8] # MATHEMATICAL SANS-SERIF CAPITAL Y 1D5EC ; [.1865.0020.000B.1D5EC] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Y 1D620 ; [.1865.0020.000B.1D620] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y 1D654 ; [.1865.0020.000B.1D654] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y 1D688 ; [.1865.0020.000B.1D688] # MATHEMATICAL MONOSPACE CAPITAL Y 24CE ; [.1865.0020.000C.24CE] # CIRCLED LATIN CAPITAL LETTER Y 1F168 ; [.1865.0020.000C.1F168] # NEGATIVE CIRCLED LATIN CAPITAL LETTER Y 02B8 ; [.1865.0020.0014.02B8] # MODIFIER LETTER SMALL Y 1F148 ; [.1865.0020.001D.1F148] # SQUARED LATIN CAPITAL LETTER Y 1F188 ; [.1865.0020.001D.1F188] # NEGATIVE SQUARED LATIN CAPITAL LETTER Y 00FD ; [.1865.0020.0002.0079][.0000.0032.0002.0301] # LATIN SMALL LETTER Y WITH ACUTE 00DD ; [.1865.0020.0008.0059][.0000.0032.0002.0301] # LATIN CAPITAL LETTER Y WITH ACUTE 1EF3 ; [.1865.0020.0002.0079][.0000.0035.0002.0300] # LATIN SMALL LETTER Y WITH GRAVE 1EF2 ; [.1865.0020.0008.0059][.0000.0035.0002.0300] # LATIN CAPITAL LETTER Y WITH GRAVE 0177 ; [.1865.0020.0002.0079][.0000.003C.0002.0302] # LATIN SMALL LETTER Y WITH CIRCUMFLEX 0176 ; [.1865.0020.0008.0059][.0000.003C.0002.0302] # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX 1E99 ; [.1865.0020.0002.0079][.0000.0043.0002.030A] # LATIN SMALL LETTER Y WITH RING ABOVE 00FF ; [.1865.0020.0002.0079][.0000.0047.0002.0308] # LATIN SMALL LETTER Y WITH DIAERESIS 0178 ; [.1865.0020.0008.0059][.0000.0047.0002.0308] # LATIN CAPITAL LETTER Y WITH DIAERESIS 1EF9 ; [.1865.0020.0002.0079][.0000.004E.0002.0303] # LATIN SMALL LETTER Y WITH TILDE 1EF8 ; [.1865.0020.0008.0059][.0000.004E.0002.0303] # LATIN CAPITAL LETTER Y WITH TILDE 1E8F ; [.1865.0020.0002.0079][.0000.0052.0002.0307] # LATIN SMALL LETTER Y WITH DOT ABOVE 1E8E ; [.1865.0020.0008.0059][.0000.0052.0002.0307] # LATIN CAPITAL LETTER Y WITH DOT ABOVE 0233 ; [.1865.0020.0002.0079][.0000.005B.0002.0304] # LATIN SMALL LETTER Y WITH MACRON 0232 ; [.1865.0020.0008.0059][.0000.005B.0002.0304] # LATIN CAPITAL LETTER Y WITH MACRON 1EF7 ; [.1865.0020.0002.0079][.0000.0064.0002.0309] # LATIN SMALL LETTER Y WITH HOOK ABOVE 1EF6 ; [.1865.0020.0008.0059][.0000.0064.0002.0309] # LATIN CAPITAL LETTER Y WITH HOOK ABOVE 1EF5 ; [.1865.0020.0002.0079][.0000.0070.0002.0323] # LATIN SMALL LETTER Y WITH DOT BELOW 1EF4 ; [.1865.0020.0008.0059][.0000.0070.0002.0323] # LATIN CAPITAL LETTER Y WITH DOT BELOW 028F ; [.1869.0020.0002.028F] # LATIN LETTER SMALL CAPITAL Y 024F ; [.186D.0020.0002.024F] # LATIN SMALL LETTER Y WITH STROKE 024E ; [.186D.0020.0008.024E] # LATIN CAPITAL LETTER Y WITH STROKE 01B4 ; [.1871.0020.0002.01B4] # LATIN SMALL LETTER Y WITH HOOK 01B3 ; [.1871.0020.0008.01B3] # LATIN CAPITAL LETTER Y WITH HOOK 1EFF ; [.1875.0020.0002.1EFF] # LATIN SMALL LETTER Y WITH LOOP 1EFE ; [.1875.0020.0008.1EFE] # LATIN CAPITAL LETTER Y WITH LOOP 021D ; [.1876.0020.0002.021D] # LATIN SMALL LETTER YOGH 021C ; [.1876.0020.0008.021C] # LATIN CAPITAL LETTER YOGH 007A ; [.187A.0020.0002.007A] # LATIN SMALL LETTER Z FF5A ; [.187A.0020.0003.FF5A] # FULLWIDTH LATIN SMALL LETTER Z 1DE6 ; [.187A.0020.0004.1DE6] # COMBINING LATIN SMALL LETTER Z 24B5 ; [*02FB.0020.0004.24B5][.187A.0020.0004.24B5][*02FC.0020.001F.24B5] # PARENTHESIZED LATIN SMALL LETTER Z 1D433 ; [.187A.0020.0005.1D433] # MATHEMATICAL BOLD SMALL Z 1D467 ; [.187A.0020.0005.1D467] # MATHEMATICAL ITALIC SMALL Z 1D49B ; [.187A.0020.0005.1D49B] # MATHEMATICAL BOLD ITALIC SMALL Z 1D4CF ; [.187A.0020.0005.1D4CF] # MATHEMATICAL SCRIPT SMALL Z 1D503 ; [.187A.0020.0005.1D503] # MATHEMATICAL BOLD SCRIPT SMALL Z 1D537 ; [.187A.0020.0005.1D537] # MATHEMATICAL FRAKTUR SMALL Z 1D56B ; [.187A.0020.0005.1D56B] # MATHEMATICAL DOUBLE-STRUCK SMALL Z 1D59F ; [.187A.0020.0005.1D59F] # MATHEMATICAL BOLD FRAKTUR SMALL Z 1D5D3 ; [.187A.0020.0005.1D5D3] # MATHEMATICAL SANS-SERIF SMALL Z 1D607 ; [.187A.0020.0005.1D607] # MATHEMATICAL SANS-SERIF BOLD SMALL Z 1D63B ; [.187A.0020.0005.1D63B] # MATHEMATICAL SANS-SERIF ITALIC SMALL Z 1D66F ; [.187A.0020.0005.1D66F] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z 1D6A3 ; [.187A.0020.0005.1D6A3] # MATHEMATICAL MONOSPACE SMALL Z 24E9 ; [.187A.0020.0006.24E9] # CIRCLED LATIN SMALL LETTER Z 005A ; [.187A.0020.0008.005A] # LATIN CAPITAL LETTER Z FF3A ; [.187A.0020.0009.FF3A] # FULLWIDTH LATIN CAPITAL LETTER Z 1F129 ; [*02FB.0020.0004.1F129][.187A.0020.000A.1F129][*02FC.0020.001F.1F129] # PARENTHESIZED LATIN CAPITAL LETTER Z 1F1FF ; [.187A.0020.000A.1F1FF] # REGIONAL INDICATOR SYMBOL LETTER Z 2124 ; [.187A.0020.000B.2124] # DOUBLE-STRUCK CAPITAL Z 2128 ; [.187A.0020.000B.2128] # BLACK-LETTER CAPITAL Z 1D419 ; [.187A.0020.000B.1D419] # MATHEMATICAL BOLD CAPITAL Z 1D44D ; [.187A.0020.000B.1D44D] # MATHEMATICAL ITALIC CAPITAL Z 1D481 ; [.187A.0020.000B.1D481] # MATHEMATICAL BOLD ITALIC CAPITAL Z 1D4B5 ; [.187A.0020.000B.1D4B5] # MATHEMATICAL SCRIPT CAPITAL Z 1D4E9 ; [.187A.0020.000B.1D4E9] # MATHEMATICAL BOLD SCRIPT CAPITAL Z 1D585 ; [.187A.0020.000B.1D585] # MATHEMATICAL BOLD FRAKTUR CAPITAL Z 1D5B9 ; [.187A.0020.000B.1D5B9] # MATHEMATICAL SANS-SERIF CAPITAL Z 1D5ED ; [.187A.0020.000B.1D5ED] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Z 1D621 ; [.187A.0020.000B.1D621] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z 1D655 ; [.187A.0020.000B.1D655] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z 1D689 ; [.187A.0020.000B.1D689] # MATHEMATICAL MONOSPACE CAPITAL Z 24CF ; [.187A.0020.000C.24CF] # CIRCLED LATIN CAPITAL LETTER Z 1F169 ; [.187A.0020.000C.1F169] # NEGATIVE CIRCLED LATIN CAPITAL LETTER Z 1DBB ; [.187A.0020.0014.1DBB] # MODIFIER LETTER SMALL Z 1F149 ; [.187A.0020.001D.1F149] # SQUARED LATIN CAPITAL LETTER Z 1F189 ; [.187A.0020.001D.1F189] # NEGATIVE SQUARED LATIN CAPITAL LETTER Z 017A ; [.187A.0020.0002.007A][.0000.0032.0002.0301] # LATIN SMALL LETTER Z WITH ACUTE 0179 ; [.187A.0020.0008.005A][.0000.0032.0002.0301] # LATIN CAPITAL LETTER Z WITH ACUTE 1E91 ; [.187A.0020.0002.007A][.0000.003C.0002.0302] # LATIN SMALL LETTER Z WITH CIRCUMFLEX 1E90 ; [.187A.0020.0008.005A][.0000.003C.0002.0302] # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX 017E ; [.187A.0020.0002.007A][.0000.0041.0002.030C] # LATIN SMALL LETTER Z WITH CARON 017D ; [.187A.0020.0008.005A][.0000.0041.0002.030C] # LATIN CAPITAL LETTER Z WITH CARON 017C ; [.187A.0020.0002.007A][.0000.0052.0002.0307] # LATIN SMALL LETTER Z WITH DOT ABOVE 017B ; [.187A.0020.0008.005A][.0000.0052.0002.0307] # LATIN CAPITAL LETTER Z WITH DOT ABOVE 1E93 ; [.187A.0020.0002.007A][.0000.0070.0002.0323] # LATIN SMALL LETTER Z WITH DOT BELOW 1E92 ; [.187A.0020.0008.005A][.0000.0070.0002.0323] # LATIN CAPITAL LETTER Z WITH DOT BELOW 1E95 ; [.187A.0020.0002.007A][.0000.007B.0002.0331] # LATIN SMALL LETTER Z WITH LINE BELOW 1E94 ; [.187A.0020.0008.005A][.0000.007B.0002.0331] # LATIN CAPITAL LETTER Z WITH LINE BELOW 018D ; [.187A.0020.0004.018D][.1856.0020.0004.018D] # LATIN SMALL LETTER TURNED DELTA 1D22 ; [.187E.0020.0002.1D22] # LATIN LETTER SMALL CAPITAL Z 01B6 ; [.187F.0020.0002.01B6] # LATIN SMALL LETTER Z WITH STROKE 01B5 ; [.187F.0020.0008.01B5] # LATIN CAPITAL LETTER Z WITH STROKE 1D76 ; [.1883.0020.0002.1D76] # LATIN SMALL LETTER Z WITH MIDDLE TILDE 1D8E ; [.1884.0020.0002.1D8E] # LATIN SMALL LETTER Z WITH PALATAL HOOK 0225 ; [.1885.0020.0002.0225] # LATIN SMALL LETTER Z WITH HOOK 0224 ; [.1885.0020.0008.0224] # LATIN CAPITAL LETTER Z WITH HOOK 0290 ; [.1889.0020.0002.0290] # LATIN SMALL LETTER Z WITH RETROFLEX HOOK 1DBC ; [.1889.0020.0014.1DBC] # MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK 0291 ; [.188D.0020.0002.0291] # LATIN SMALL LETTER Z WITH CURL 1DBD ; [.188D.0020.0014.1DBD] # MODIFIER LETTER SMALL Z WITH CURL 0240 ; [.1891.0020.0002.0240] # LATIN SMALL LETTER Z WITH SWASH TAIL 2C7F ; [.1891.0020.0008.2C7F] # LATIN CAPITAL LETTER Z WITH SWASH TAIL 2C6C ; [.1895.0020.0002.2C6C] # LATIN SMALL LETTER Z WITH DESCENDER 2C6B ; [.1895.0020.0008.2C6B] # LATIN CAPITAL LETTER Z WITH DESCENDER A763 ; [.1896.0020.0002.A763] # LATIN SMALL LETTER VISIGOTHIC Z A762 ; [.1896.0020.0008.A762] # LATIN CAPITAL LETTER VISIGOTHIC Z 0292 ; [.1897.0020.0002.0292] # LATIN SMALL LETTER EZH 01B7 ; [.1897.0020.0008.01B7] # LATIN CAPITAL LETTER EZH 1DBE ; [.1897.0020.0014.1DBE] # MODIFIER LETTER SMALL EZH 01EF ; [.1897.0020.0002.0292][.0000.0041.0002.030C] # LATIN SMALL LETTER EZH WITH CARON 01EE ; [.1897.0020.0008.01B7][.0000.0041.0002.030C] # LATIN CAPITAL LETTER EZH WITH CARON 1D23 ; [.189B.0020.0002.1D23] # LATIN LETTER SMALL CAPITAL EZH 01B9 ; [.189C.0020.0002.01B9] # LATIN SMALL LETTER EZH REVERSED 01B8 ; [.189C.0020.0008.01B8] # LATIN CAPITAL LETTER EZH REVERSED 1D9A ; [.18A0.0020.0002.1D9A] # LATIN SMALL LETTER EZH WITH RETROFLEX HOOK 01BA ; [.18A1.0020.0002.01BA] # LATIN SMALL LETTER EZH WITH TAIL 0293 ; [.18A5.0020.0002.0293] # LATIN SMALL LETTER EZH WITH CURL 00FE ; [.18A9.0020.0002.00FE] # LATIN SMALL LETTER THORN 00DE ; [.18A9.0020.0008.00DE] # LATIN CAPITAL LETTER THORN A765 ; [.18AD.0020.0002.A765] # LATIN SMALL LETTER THORN WITH STROKE A764 ; [.18AD.0020.0008.A764] # LATIN CAPITAL LETTER THORN WITH STROKE A767 ; [.18AE.0020.0002.A767] # LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER A766 ; [.18AE.0020.0008.A766] # LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER 01BF ; [.18AF.0020.0002.01BF] # LATIN LETTER WYNN 01F7 ; [.18AF.0020.0008.01F7] # LATIN CAPITAL LETTER WYNN A769 ; [.18B3.0020.0002.A769] # LATIN SMALL LETTER VEND A768 ; [.18B3.0020.0008.A768] # LATIN CAPITAL LETTER VEND A76B ; [.18B4.0020.0002.A76B] # LATIN SMALL LETTER ET A76A ; [.18B4.0020.0008.A76A] # LATIN CAPITAL LETTER ET A76D ; [.18B5.0020.0002.A76D] # LATIN SMALL LETTER IS A76C ; [.18B5.0020.0008.A76C] # LATIN CAPITAL LETTER IS A76F ; [.18B6.0020.0002.A76F] # LATIN SMALL LETTER CON 1DD2 ; [.18B6.0020.0004.1DD2] # COMBINING US ABOVE A76E ; [.18B6.0020.0008.A76E] # LATIN CAPITAL LETTER CON A770 ; [.18B6.0020.0014.A770] # MODIFIER LETTER US A778 ; [.18B7.0020.0002.A778] # LATIN SMALL LETTER UM 01BB ; [.18B8.0020.0002.01BB] # LATIN LETTER TWO WITH STROKE A72B ; [.18BC.0020.0002.A72B] # LATIN SMALL LETTER TRESILLO A72A ; [.18BC.0020.0008.A72A] # LATIN CAPITAL LETTER TRESILLO A72D ; [.18BD.0020.0002.A72D] # LATIN SMALL LETTER CUATRILLO A72C ; [.18BD.0020.0008.A72C] # LATIN CAPITAL LETTER CUATRILLO A72F ; [.18BE.0020.0002.A72F] # LATIN SMALL LETTER CUATRILLO WITH COMMA A72E ; [.18BE.0020.0008.A72E] # LATIN CAPITAL LETTER CUATRILLO WITH COMMA 01A8 ; [.18BF.0020.0002.01A8] # LATIN SMALL LETTER TONE TWO 01A7 ; [.18BF.0020.0008.01A7] # LATIN CAPITAL LETTER TONE TWO 01BD ; [.18C3.0020.0002.01BD] # LATIN SMALL LETTER TONE FIVE 01BC ; [.18C3.0020.0008.01BC] # LATIN CAPITAL LETTER TONE FIVE 0185 ; [.18C7.0020.0002.0185] # LATIN SMALL LETTER TONE SIX 0184 ; [.18C7.0020.0008.0184] # LATIN CAPITAL LETTER TONE SIX 0294 ; [.18CB.0020.0002.0294] # LATIN LETTER GLOTTAL STOP 0242 ; [.18CF.0020.0002.0242] # LATIN SMALL LETTER GLOTTAL STOP 0241 ; [.18CF.0020.0008.0241] # LATIN CAPITAL LETTER GLOTTAL STOP 02C0 ; [.18D3.0020.0002.02C0] # MODIFIER LETTER GLOTTAL STOP 02BC ; [.18D4.0020.0002.02BC] # MODIFIER LETTER APOSTROPHE 0149 ; [.18D4.0020.0004.0149][.1734.0020.0004.0149] # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE 02EE ; [.18D5.0020.0002.02EE] # MODIFIER LETTER DOUBLE APOSTROPHE 02BE ; [.18D6.0020.0002.02BE] # MODIFIER LETTER RIGHT HALF RING A723 ; [.18D7.0020.0002.A723] # LATIN SMALL LETTER EGYPTOLOGICAL ALEF A722 ; [.18D7.0020.0008.A722] # LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF A78C ; [.18D8.0020.0002.A78C] # LATIN SMALL LETTER SALTILLO A78B ; [.18D8.0020.0008.A78B] # LATIN CAPITAL LETTER SALTILLO 0295 ; [.18D9.0020.0002.0295] # LATIN LETTER PHARYNGEAL VOICED FRICATIVE 02E4 ; [.18D9.0020.0014.02E4] # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP 02BF ; [.18DD.0020.0002.02BF] # MODIFIER LETTER LEFT HALF RING 02C1 ; [.18DE.0020.0002.02C1] # MODIFIER LETTER REVERSED GLOTTAL STOP 1D24 ; [.18DF.0020.0002.1D24] # LATIN LETTER VOICED LARYNGEAL SPIRANT 1D25 ; [.18E0.0020.0002.1D25] # LATIN LETTER AIN 1D5C ; [.18E0.0020.0014.1D5C] # MODIFIER LETTER SMALL AIN A725 ; [.18E1.0020.0002.A725] # LATIN SMALL LETTER EGYPTOLOGICAL AIN A724 ; [.18E1.0020.0008.A724] # LATIN CAPITAL LETTER EGYPTOLOGICAL AIN 02A1 ; [.18E2.0020.0002.02A1] # LATIN LETTER GLOTTAL STOP WITH STROKE 02A2 ; [.18E6.0020.0002.02A2] # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE 0296 ; [.18EA.0020.0002.0296] # LATIN LETTER INVERTED GLOTTAL STOP 01C0 ; [.18EE.0020.0002.01C0] # LATIN LETTER DENTAL CLICK 01C1 ; [.18F2.0020.0002.01C1] # LATIN LETTER LATERAL CLICK 01C2 ; [.18F6.0020.0002.01C2] # LATIN LETTER ALVEOLAR CLICK 01C3 ; [.18FA.0020.0002.01C3] # LATIN LETTER RETROFLEX CLICK 0297 ; [.18FE.0020.0002.0297] # LATIN LETTER STRETCHED C 0298 ; [.1902.0020.0002.0298] # LATIN LETTER BILABIAL CLICK 02AC ; [.1906.0020.0002.02AC] # LATIN LETTER BILABIAL PERCUSSIVE 02AD ; [.190A.0020.0002.02AD] # LATIN LETTER BIDENTAL PERCUSSIVE 03B1 ; [.190E.0020.0002.03B1] # GREEK SMALL LETTER ALPHA 1D6C2 ; [.190E.0020.0005.1D6C2] # MATHEMATICAL BOLD SMALL ALPHA 1D6FC ; [.190E.0020.0005.1D6FC] # MATHEMATICAL ITALIC SMALL ALPHA 1D736 ; [.190E.0020.0005.1D736] # MATHEMATICAL BOLD ITALIC SMALL ALPHA 1D770 ; [.190E.0020.0005.1D770] # MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA 1D7AA ; [.190E.0020.0005.1D7AA] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA 0391 ; [.190E.0020.0008.0391] # GREEK CAPITAL LETTER ALPHA 1D6A8 ; [.190E.0020.000B.1D6A8] # MATHEMATICAL BOLD CAPITAL ALPHA 1D6E2 ; [.190E.0020.000B.1D6E2] # MATHEMATICAL ITALIC CAPITAL ALPHA 1D71C ; [.190E.0020.000B.1D71C] # MATHEMATICAL BOLD ITALIC CAPITAL ALPHA 1D756 ; [.190E.0020.000B.1D756] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA 1D790 ; [.190E.0020.000B.1D790] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA 1F00 ; [.190E.0020.0002.03B1][.0000.0022.0002.0313] # GREEK SMALL LETTER ALPHA WITH PSILI 1F08 ; [.190E.0020.0008.0391][.0000.0022.0002.0313] # GREEK CAPITAL LETTER ALPHA WITH PSILI 1F04 ; [.190E.0020.0002.03B1][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA 1F0C ; [.190E.0020.0008.0391][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA 1F84 ; [.190E.0020.0002.03B1][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI 1F8C ; [.190E.0020.0008.0391][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI 1F02 ; [.190E.0020.0002.03B1][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA 1F0A ; [.190E.0020.0008.0391][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA 1F82 ; [.190E.0020.0002.03B1][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI 1F8A ; [.190E.0020.0008.0391][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI 1F06 ; [.190E.0020.0002.03B1][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI 1F0E ; [.190E.0020.0008.0391][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI 1F86 ; [.190E.0020.0002.03B1][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI 1F8E ; [.190E.0020.0008.0391][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI 1F80 ; [.190E.0020.0002.03B1][.0000.0022.0002.0313][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI 1F88 ; [.190E.0020.0008.0391][.0000.0022.0002.0313][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI 1F01 ; [.190E.0020.0002.03B1][.0000.002A.0002.0314] # GREEK SMALL LETTER ALPHA WITH DASIA 1F09 ; [.190E.0020.0008.0391][.0000.002A.0002.0314] # GREEK CAPITAL LETTER ALPHA WITH DASIA 1F05 ; [.190E.0020.0002.03B1][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA 1F0D ; [.190E.0020.0008.0391][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA 1F85 ; [.190E.0020.0002.03B1][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI 1F8D ; [.190E.0020.0008.0391][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI 1F03 ; [.190E.0020.0002.03B1][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA 1F0B ; [.190E.0020.0008.0391][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA 1F83 ; [.190E.0020.0002.03B1][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI 1F8B ; [.190E.0020.0008.0391][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI 1F07 ; [.190E.0020.0002.03B1][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI 1F0F ; [.190E.0020.0008.0391][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI 1F87 ; [.190E.0020.0002.03B1][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI 1F8F ; [.190E.0020.0008.0391][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI 1F81 ; [.190E.0020.0002.03B1][.0000.002A.0002.0314][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI 1F89 ; [.190E.0020.0008.0391][.0000.002A.0002.0314][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI 03AC ; [.190E.0020.0002.03B1][.0000.0032.0002.0301] # GREEK SMALL LETTER ALPHA WITH TONOS 1F71 ; [.190E.0020.0002.03B1][.0000.0032.0002.0301] # GREEK SMALL LETTER ALPHA WITH OXIA 0386 ; [.190E.0020.0008.0391][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ALPHA WITH TONOS 1FBB ; [.190E.0020.0008.0391][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ALPHA WITH OXIA 1FB4 ; [.190E.0020.0002.03B1][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI 1F70 ; [.190E.0020.0002.03B1][.0000.0035.0002.0300] # GREEK SMALL LETTER ALPHA WITH VARIA 1FBA ; [.190E.0020.0008.0391][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ALPHA WITH VARIA 1FB2 ; [.190E.0020.0002.03B1][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI 1FB0 ; [.190E.0020.0002.03B1][.0000.0037.0002.0306] # GREEK SMALL LETTER ALPHA WITH VRACHY 1FB8 ; [.190E.0020.0008.0391][.0000.0037.0002.0306] # GREEK CAPITAL LETTER ALPHA WITH VRACHY 1FB6 ; [.190E.0020.0002.03B1][.0000.0045.0002.0342] # GREEK SMALL LETTER ALPHA WITH PERISPOMENI 1FB7 ; [.190E.0020.0002.03B1][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI 1FB1 ; [.190E.0020.0002.03B1][.0000.005B.0002.0304] # GREEK SMALL LETTER ALPHA WITH MACRON 1FB9 ; [.190E.0020.0008.0391][.0000.005B.0002.0304] # GREEK CAPITAL LETTER ALPHA WITH MACRON 1FB3 ; [.190E.0020.0002.03B1][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI 1FBC ; [.190E.0020.0008.0391][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI 03B2 ; [.190F.0020.0002.03B2] # GREEK SMALL LETTER BETA 03D0 ; [.190F.0020.0004.03D0] # GREEK BETA SYMBOL 1D6C3 ; [.190F.0020.0005.1D6C3] # MATHEMATICAL BOLD SMALL BETA 1D6FD ; [.190F.0020.0005.1D6FD] # MATHEMATICAL ITALIC SMALL BETA 1D737 ; [.190F.0020.0005.1D737] # MATHEMATICAL BOLD ITALIC SMALL BETA 1D771 ; [.190F.0020.0005.1D771] # MATHEMATICAL SANS-SERIF BOLD SMALL BETA 1D7AB ; [.190F.0020.0005.1D7AB] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA 0392 ; [.190F.0020.0008.0392] # GREEK CAPITAL LETTER BETA 1D6A9 ; [.190F.0020.000B.1D6A9] # MATHEMATICAL BOLD CAPITAL BETA 1D6E3 ; [.190F.0020.000B.1D6E3] # MATHEMATICAL ITALIC CAPITAL BETA 1D71D ; [.190F.0020.000B.1D71D] # MATHEMATICAL BOLD ITALIC CAPITAL BETA 1D757 ; [.190F.0020.000B.1D757] # MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA 1D791 ; [.190F.0020.000B.1D791] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA 1D5D ; [.190F.0020.0014.1D5D] # MODIFIER LETTER SMALL BETA 1D66 ; [.190F.0020.0015.1D66] # GREEK SUBSCRIPT SMALL LETTER BETA 03B3 ; [.1910.0020.0002.03B3] # GREEK SMALL LETTER GAMMA 213D ; [.1910.0020.0005.213D] # DOUBLE-STRUCK SMALL GAMMA 1D6C4 ; [.1910.0020.0005.1D6C4] # MATHEMATICAL BOLD SMALL GAMMA 1D6FE ; [.1910.0020.0005.1D6FE] # MATHEMATICAL ITALIC SMALL GAMMA 1D738 ; [.1910.0020.0005.1D738] # MATHEMATICAL BOLD ITALIC SMALL GAMMA 1D772 ; [.1910.0020.0005.1D772] # MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA 1D7AC ; [.1910.0020.0005.1D7AC] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA 0393 ; [.1910.0020.0008.0393] # GREEK CAPITAL LETTER GAMMA 213E ; [.1910.0020.000B.213E] # DOUBLE-STRUCK CAPITAL GAMMA 1D6AA ; [.1910.0020.000B.1D6AA] # MATHEMATICAL BOLD CAPITAL GAMMA 1D6E4 ; [.1910.0020.000B.1D6E4] # MATHEMATICAL ITALIC CAPITAL GAMMA 1D71E ; [.1910.0020.000B.1D71E] # MATHEMATICAL BOLD ITALIC CAPITAL GAMMA 1D758 ; [.1910.0020.000B.1D758] # MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA 1D792 ; [.1910.0020.000B.1D792] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA 1D5E ; [.1910.0020.0014.1D5E] # MODIFIER LETTER SMALL GREEK GAMMA 1D67 ; [.1910.0020.0015.1D67] # GREEK SUBSCRIPT SMALL LETTER GAMMA 1D26 ; [.1911.0020.0002.1D26] # GREEK LETTER SMALL CAPITAL GAMMA 03B4 ; [.1912.0020.0002.03B4] # GREEK SMALL LETTER DELTA 1D6C5 ; [.1912.0020.0005.1D6C5] # MATHEMATICAL BOLD SMALL DELTA 1D6FF ; [.1912.0020.0005.1D6FF] # MATHEMATICAL ITALIC SMALL DELTA 1D739 ; [.1912.0020.0005.1D739] # MATHEMATICAL BOLD ITALIC SMALL DELTA 1D773 ; [.1912.0020.0005.1D773] # MATHEMATICAL SANS-SERIF BOLD SMALL DELTA 1D7AD ; [.1912.0020.0005.1D7AD] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA 0394 ; [.1912.0020.0008.0394] # GREEK CAPITAL LETTER DELTA 1D6AB ; [.1912.0020.000B.1D6AB] # MATHEMATICAL BOLD CAPITAL DELTA 1D6E5 ; [.1912.0020.000B.1D6E5] # MATHEMATICAL ITALIC CAPITAL DELTA 1D71F ; [.1912.0020.000B.1D71F] # MATHEMATICAL BOLD ITALIC CAPITAL DELTA 1D759 ; [.1912.0020.000B.1D759] # MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA 1D793 ; [.1912.0020.000B.1D793] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA 1D5F ; [.1912.0020.0014.1D5F] # MODIFIER LETTER SMALL DELTA 03B5 ; [.1913.0020.0002.03B5] # GREEK SMALL LETTER EPSILON 03F5 ; [.1913.0020.0004.03F5] # GREEK LUNATE EPSILON SYMBOL 1D6C6 ; [.1913.0020.0005.1D6C6] # MATHEMATICAL BOLD SMALL EPSILON 1D6DC ; [.1913.0020.0005.1D6DC] # MATHEMATICAL BOLD EPSILON SYMBOL 1D700 ; [.1913.0020.0005.1D700] # MATHEMATICAL ITALIC SMALL EPSILON 1D716 ; [.1913.0020.0005.1D716] # MATHEMATICAL ITALIC EPSILON SYMBOL 1D73A ; [.1913.0020.0005.1D73A] # MATHEMATICAL BOLD ITALIC SMALL EPSILON 1D750 ; [.1913.0020.0005.1D750] # MATHEMATICAL BOLD ITALIC EPSILON SYMBOL 1D774 ; [.1913.0020.0005.1D774] # MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON 1D78A ; [.1913.0020.0005.1D78A] # MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL 1D7AE ; [.1913.0020.0005.1D7AE] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON 1D7C4 ; [.1913.0020.0005.1D7C4] # MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL 0395 ; [.1913.0020.0008.0395] # GREEK CAPITAL LETTER EPSILON 1D6AC ; [.1913.0020.000B.1D6AC] # MATHEMATICAL BOLD CAPITAL EPSILON 1D6E6 ; [.1913.0020.000B.1D6E6] # MATHEMATICAL ITALIC CAPITAL EPSILON 1D720 ; [.1913.0020.000B.1D720] # MATHEMATICAL BOLD ITALIC CAPITAL EPSILON 1D75A ; [.1913.0020.000B.1D75A] # MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON 1D794 ; [.1913.0020.000B.1D794] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON 1F10 ; [.1913.0020.0002.03B5][.0000.0022.0002.0313] # GREEK SMALL LETTER EPSILON WITH PSILI 1F18 ; [.1913.0020.0008.0395][.0000.0022.0002.0313] # GREEK CAPITAL LETTER EPSILON WITH PSILI 1F14 ; [.1913.0020.0002.03B5][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA 1F1C ; [.1913.0020.0008.0395][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA 1F12 ; [.1913.0020.0002.03B5][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA 1F1A ; [.1913.0020.0008.0395][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA 1F11 ; [.1913.0020.0002.03B5][.0000.002A.0002.0314] # GREEK SMALL LETTER EPSILON WITH DASIA 1F19 ; [.1913.0020.0008.0395][.0000.002A.0002.0314] # GREEK CAPITAL LETTER EPSILON WITH DASIA 1F15 ; [.1913.0020.0002.03B5][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA 1F1D ; [.1913.0020.0008.0395][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA 1F13 ; [.1913.0020.0002.03B5][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA 1F1B ; [.1913.0020.0008.0395][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA 03AD ; [.1913.0020.0002.03B5][.0000.0032.0002.0301] # GREEK SMALL LETTER EPSILON WITH TONOS 1F73 ; [.1913.0020.0002.03B5][.0000.0032.0002.0301] # GREEK SMALL LETTER EPSILON WITH OXIA 0388 ; [.1913.0020.0008.0395][.0000.0032.0002.0301] # GREEK CAPITAL LETTER EPSILON WITH TONOS 1FC9 ; [.1913.0020.0008.0395][.0000.0032.0002.0301] # GREEK CAPITAL LETTER EPSILON WITH OXIA 1F72 ; [.1913.0020.0002.03B5][.0000.0035.0002.0300] # GREEK SMALL LETTER EPSILON WITH VARIA 1FC8 ; [.1913.0020.0008.0395][.0000.0035.0002.0300] # GREEK CAPITAL LETTER EPSILON WITH VARIA 03DD ; [.1914.0020.0002.03DD] # GREEK SMALL LETTER DIGAMMA 1D7CB ; [.1914.0020.0005.1D7CB] # MATHEMATICAL BOLD SMALL DIGAMMA 03DC ; [.1914.0020.0008.03DC] # GREEK LETTER DIGAMMA 1D7CA ; [.1914.0020.000B.1D7CA] # MATHEMATICAL BOLD CAPITAL DIGAMMA 0377 ; [.1915.0020.0002.0377] # GREEK SMALL LETTER PAMPHYLIAN DIGAMMA 0376 ; [.1915.0020.0008.0376] # GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA 03DB ; [.1916.0020.0002.03DB] # GREEK SMALL LETTER STIGMA 03DA ; [.1916.0020.0008.03DA] # GREEK LETTER STIGMA 03B6 ; [.1917.0020.0002.03B6] # GREEK SMALL LETTER ZETA 1D6C7 ; [.1917.0020.0005.1D6C7] # MATHEMATICAL BOLD SMALL ZETA 1D701 ; [.1917.0020.0005.1D701] # MATHEMATICAL ITALIC SMALL ZETA 1D73B ; [.1917.0020.0005.1D73B] # MATHEMATICAL BOLD ITALIC SMALL ZETA 1D775 ; [.1917.0020.0005.1D775] # MATHEMATICAL SANS-SERIF BOLD SMALL ZETA 1D7AF ; [.1917.0020.0005.1D7AF] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA 0396 ; [.1917.0020.0008.0396] # GREEK CAPITAL LETTER ZETA 1D6AD ; [.1917.0020.000B.1D6AD] # MATHEMATICAL BOLD CAPITAL ZETA 1D6E7 ; [.1917.0020.000B.1D6E7] # MATHEMATICAL ITALIC CAPITAL ZETA 1D721 ; [.1917.0020.000B.1D721] # MATHEMATICAL BOLD ITALIC CAPITAL ZETA 1D75B ; [.1917.0020.000B.1D75B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA 1D795 ; [.1917.0020.000B.1D795] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA 0371 ; [.1918.0020.0002.0371] # GREEK SMALL LETTER HETA 0370 ; [.1918.0020.0008.0370] # GREEK CAPITAL LETTER HETA 03B7 ; [.1919.0020.0002.03B7] # GREEK SMALL LETTER ETA 1D6C8 ; [.1919.0020.0005.1D6C8] # MATHEMATICAL BOLD SMALL ETA 1D702 ; [.1919.0020.0005.1D702] # MATHEMATICAL ITALIC SMALL ETA 1D73C ; [.1919.0020.0005.1D73C] # MATHEMATICAL BOLD ITALIC SMALL ETA 1D776 ; [.1919.0020.0005.1D776] # MATHEMATICAL SANS-SERIF BOLD SMALL ETA 1D7B0 ; [.1919.0020.0005.1D7B0] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA 0397 ; [.1919.0020.0008.0397] # GREEK CAPITAL LETTER ETA 1D6AE ; [.1919.0020.000B.1D6AE] # MATHEMATICAL BOLD CAPITAL ETA 1D6E8 ; [.1919.0020.000B.1D6E8] # MATHEMATICAL ITALIC CAPITAL ETA 1D722 ; [.1919.0020.000B.1D722] # MATHEMATICAL BOLD ITALIC CAPITAL ETA 1D75C ; [.1919.0020.000B.1D75C] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA 1D796 ; [.1919.0020.000B.1D796] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA 1F20 ; [.1919.0020.0002.03B7][.0000.0022.0002.0313] # GREEK SMALL LETTER ETA WITH PSILI 1F28 ; [.1919.0020.0008.0397][.0000.0022.0002.0313] # GREEK CAPITAL LETTER ETA WITH PSILI 1F24 ; [.1919.0020.0002.03B7][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER ETA WITH PSILI AND OXIA 1F2C ; [.1919.0020.0008.0397][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA 1F94 ; [.1919.0020.0002.03B7][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI 1F9C ; [.1919.0020.0008.0397][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI 1F22 ; [.1919.0020.0002.03B7][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER ETA WITH PSILI AND VARIA 1F2A ; [.1919.0020.0008.0397][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA 1F92 ; [.1919.0020.0002.03B7][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI 1F9A ; [.1919.0020.0008.0397][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI 1F26 ; [.1919.0020.0002.03B7][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI 1F2E ; [.1919.0020.0008.0397][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI 1F96 ; [.1919.0020.0002.03B7][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI 1F9E ; [.1919.0020.0008.0397][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI 1F90 ; [.1919.0020.0002.03B7][.0000.0022.0002.0313][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI 1F98 ; [.1919.0020.0008.0397][.0000.0022.0002.0313][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI 1F21 ; [.1919.0020.0002.03B7][.0000.002A.0002.0314] # GREEK SMALL LETTER ETA WITH DASIA 1F29 ; [.1919.0020.0008.0397][.0000.002A.0002.0314] # GREEK CAPITAL LETTER ETA WITH DASIA 1F25 ; [.1919.0020.0002.03B7][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER ETA WITH DASIA AND OXIA 1F2D ; [.1919.0020.0008.0397][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA 1F95 ; [.1919.0020.0002.03B7][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI 1F9D ; [.1919.0020.0008.0397][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI 1F23 ; [.1919.0020.0002.03B7][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER ETA WITH DASIA AND VARIA 1F2B ; [.1919.0020.0008.0397][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA 1F93 ; [.1919.0020.0002.03B7][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI 1F9B ; [.1919.0020.0008.0397][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI 1F27 ; [.1919.0020.0002.03B7][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI 1F2F ; [.1919.0020.0008.0397][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI 1F97 ; [.1919.0020.0002.03B7][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI 1F9F ; [.1919.0020.0008.0397][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI 1F91 ; [.1919.0020.0002.03B7][.0000.002A.0002.0314][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI 1F99 ; [.1919.0020.0008.0397][.0000.002A.0002.0314][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI 03AE ; [.1919.0020.0002.03B7][.0000.0032.0002.0301] # GREEK SMALL LETTER ETA WITH TONOS 1F75 ; [.1919.0020.0002.03B7][.0000.0032.0002.0301] # GREEK SMALL LETTER ETA WITH OXIA 0389 ; [.1919.0020.0008.0397][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ETA WITH TONOS 1FCB ; [.1919.0020.0008.0397][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ETA WITH OXIA 1FC4 ; [.1919.0020.0002.03B7][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI 1F74 ; [.1919.0020.0002.03B7][.0000.0035.0002.0300] # GREEK SMALL LETTER ETA WITH VARIA 1FCA ; [.1919.0020.0008.0397][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ETA WITH VARIA 1FC2 ; [.1919.0020.0002.03B7][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI 1FC6 ; [.1919.0020.0002.03B7][.0000.0045.0002.0342] # GREEK SMALL LETTER ETA WITH PERISPOMENI 1FC7 ; [.1919.0020.0002.03B7][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI 1FC3 ; [.1919.0020.0002.03B7][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI 1FCC ; [.1919.0020.0008.0397][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI 03B8 ; [.191A.0020.0002.03B8] # GREEK SMALL LETTER THETA 03D1 ; [.191A.0020.0004.03D1] # GREEK THETA SYMBOL 1D6C9 ; [.191A.0020.0005.1D6C9] # MATHEMATICAL BOLD SMALL THETA 1D6DD ; [.191A.0020.0005.1D6DD] # MATHEMATICAL BOLD THETA SYMBOL 1D703 ; [.191A.0020.0005.1D703] # MATHEMATICAL ITALIC SMALL THETA 1D717 ; [.191A.0020.0005.1D717] # MATHEMATICAL ITALIC THETA SYMBOL 1D73D ; [.191A.0020.0005.1D73D] # MATHEMATICAL BOLD ITALIC SMALL THETA 1D751 ; [.191A.0020.0005.1D751] # MATHEMATICAL BOLD ITALIC THETA SYMBOL 1D777 ; [.191A.0020.0005.1D777] # MATHEMATICAL SANS-SERIF BOLD SMALL THETA 1D78B ; [.191A.0020.0005.1D78B] # MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL 1D7B1 ; [.191A.0020.0005.1D7B1] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA 1D7C5 ; [.191A.0020.0005.1D7C5] # MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL 0398 ; [.191A.0020.0008.0398] # GREEK CAPITAL LETTER THETA 03F4 ; [.191A.0020.000A.03F4] # GREEK CAPITAL THETA SYMBOL 1D6AF ; [.191A.0020.000B.1D6AF] # MATHEMATICAL BOLD CAPITAL THETA 1D6B9 ; [.191A.0020.000B.1D6B9] # MATHEMATICAL BOLD CAPITAL THETA SYMBOL 1D6E9 ; [.191A.0020.000B.1D6E9] # MATHEMATICAL ITALIC CAPITAL THETA 1D6F3 ; [.191A.0020.000B.1D6F3] # MATHEMATICAL ITALIC CAPITAL THETA SYMBOL 1D723 ; [.191A.0020.000B.1D723] # MATHEMATICAL BOLD ITALIC CAPITAL THETA 1D72D ; [.191A.0020.000B.1D72D] # MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL 1D75D ; [.191A.0020.000B.1D75D] # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA 1D767 ; [.191A.0020.000B.1D767] # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL 1D797 ; [.191A.0020.000B.1D797] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA 1D7A1 ; [.191A.0020.000B.1D7A1] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL 1DBF ; [.191A.0020.0014.1DBF] # MODIFIER LETTER SMALL THETA 03B9 ; [.191B.0020.0002.03B9] # GREEK SMALL LETTER IOTA 1FBE ; [.191B.0020.0002.1FBE] # GREEK PROSGEGRAMMENI 037A ; [.191B.0020.0004.037A] # GREEK YPOGEGRAMMENI 1D6CA ; [.191B.0020.0005.1D6CA] # MATHEMATICAL BOLD SMALL IOTA 1D704 ; [.191B.0020.0005.1D704] # MATHEMATICAL ITALIC SMALL IOTA 1D73E ; [.191B.0020.0005.1D73E] # MATHEMATICAL BOLD ITALIC SMALL IOTA 1D778 ; [.191B.0020.0005.1D778] # MATHEMATICAL SANS-SERIF BOLD SMALL IOTA 1D7B2 ; [.191B.0020.0005.1D7B2] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA 0399 ; [.191B.0020.0008.0399] # GREEK CAPITAL LETTER IOTA 1D6B0 ; [.191B.0020.000B.1D6B0] # MATHEMATICAL BOLD CAPITAL IOTA 1D6EA ; [.191B.0020.000B.1D6EA] # MATHEMATICAL ITALIC CAPITAL IOTA 1D724 ; [.191B.0020.000B.1D724] # MATHEMATICAL BOLD ITALIC CAPITAL IOTA 1D75E ; [.191B.0020.000B.1D75E] # MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA 1D798 ; [.191B.0020.000B.1D798] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA 1F30 ; [.191B.0020.0002.03B9][.0000.0022.0002.0313] # GREEK SMALL LETTER IOTA WITH PSILI 1F38 ; [.191B.0020.0008.0399][.0000.0022.0002.0313] # GREEK CAPITAL LETTER IOTA WITH PSILI 1F34 ; [.191B.0020.0002.03B9][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA 1F3C ; [.191B.0020.0008.0399][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA 1F32 ; [.191B.0020.0002.03B9][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA 1F3A ; [.191B.0020.0008.0399][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA 1F36 ; [.191B.0020.0002.03B9][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI 1F3E ; [.191B.0020.0008.0399][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI 1F31 ; [.191B.0020.0002.03B9][.0000.002A.0002.0314] # GREEK SMALL LETTER IOTA WITH DASIA 1F39 ; [.191B.0020.0008.0399][.0000.002A.0002.0314] # GREEK CAPITAL LETTER IOTA WITH DASIA 1F35 ; [.191B.0020.0002.03B9][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA 1F3D ; [.191B.0020.0008.0399][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA 1F33 ; [.191B.0020.0002.03B9][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA 1F3B ; [.191B.0020.0008.0399][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA 1F37 ; [.191B.0020.0002.03B9][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI 1F3F ; [.191B.0020.0008.0399][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI 03AF ; [.191B.0020.0002.03B9][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH TONOS 1F77 ; [.191B.0020.0002.03B9][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH OXIA 038A ; [.191B.0020.0008.0399][.0000.0032.0002.0301] # GREEK CAPITAL LETTER IOTA WITH TONOS 1FDB ; [.191B.0020.0008.0399][.0000.0032.0002.0301] # GREEK CAPITAL LETTER IOTA WITH OXIA 1F76 ; [.191B.0020.0002.03B9][.0000.0035.0002.0300] # GREEK SMALL LETTER IOTA WITH VARIA 1FDA ; [.191B.0020.0008.0399][.0000.0035.0002.0300] # GREEK CAPITAL LETTER IOTA WITH VARIA 1FD0 ; [.191B.0020.0002.03B9][.0000.0037.0002.0306] # GREEK SMALL LETTER IOTA WITH VRACHY 1FD8 ; [.191B.0020.0008.0399][.0000.0037.0002.0306] # GREEK CAPITAL LETTER IOTA WITH VRACHY 1FD6 ; [.191B.0020.0002.03B9][.0000.0045.0002.0342] # GREEK SMALL LETTER IOTA WITH PERISPOMENI 03CA ; [.191B.0020.0002.03B9][.0000.0047.0002.0308] # GREEK SMALL LETTER IOTA WITH DIALYTIKA 03AA ; [.191B.0020.0008.0399][.0000.0047.0002.0308] # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA 0390 ; [.191B.0020.0002.03B9][.0000.0047.0002.0308][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS 1FD3 ; [.191B.0020.0002.03B9][.0000.0047.0002.0308][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA 1FD2 ; [.191B.0020.0002.03B9][.0000.0047.0002.0308][.0000.0035.0002.0300] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA 1FD7 ; [.191B.0020.0002.03B9][.0000.0047.0002.0308][.0000.0045.0002.0342] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI 1FD1 ; [.191B.0020.0002.03B9][.0000.005B.0002.0304] # GREEK SMALL LETTER IOTA WITH MACRON 1FD9 ; [.191B.0020.0008.0399][.0000.005B.0002.0304] # GREEK CAPITAL LETTER IOTA WITH MACRON 03F3 ; [.191C.0020.0002.03F3] # GREEK LETTER YOT 03BA ; [.191D.0020.0002.03BA] # GREEK SMALL LETTER KAPPA 03F0 ; [.191D.0020.0004.03F0] # GREEK KAPPA SYMBOL 1D6CB ; [.191D.0020.0005.1D6CB] # MATHEMATICAL BOLD SMALL KAPPA 1D6DE ; [.191D.0020.0005.1D6DE] # MATHEMATICAL BOLD KAPPA SYMBOL 1D705 ; [.191D.0020.0005.1D705] # MATHEMATICAL ITALIC SMALL KAPPA 1D718 ; [.191D.0020.0005.1D718] # MATHEMATICAL ITALIC KAPPA SYMBOL 1D73F ; [.191D.0020.0005.1D73F] # MATHEMATICAL BOLD ITALIC SMALL KAPPA 1D752 ; [.191D.0020.0005.1D752] # MATHEMATICAL BOLD ITALIC KAPPA SYMBOL 1D779 ; [.191D.0020.0005.1D779] # MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA 1D78C ; [.191D.0020.0005.1D78C] # MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL 1D7B3 ; [.191D.0020.0005.1D7B3] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA 1D7C6 ; [.191D.0020.0005.1D7C6] # MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL 039A ; [.191D.0020.0008.039A] # GREEK CAPITAL LETTER KAPPA 1D6B1 ; [.191D.0020.000B.1D6B1] # MATHEMATICAL BOLD CAPITAL KAPPA 1D6EB ; [.191D.0020.000B.1D6EB] # MATHEMATICAL ITALIC CAPITAL KAPPA 1D725 ; [.191D.0020.000B.1D725] # MATHEMATICAL BOLD ITALIC CAPITAL KAPPA 1D75F ; [.191D.0020.000B.1D75F] # MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA 1D799 ; [.191D.0020.000B.1D799] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA 03D7 ; [.191D.0020.0004.03D7][.190E.0020.0004.03D7][.191B.0020.001F.03D7] # GREEK KAI SYMBOL 03CF ; [.191D.0020.000A.03CF][.190E.0020.0004.03CF][.191B.0020.001F.03CF] # GREEK CAPITAL KAI SYMBOL 03BB ; [.191E.0020.0002.03BB] # GREEK SMALL LETTER LAMDA 1D6CC ; [.191E.0020.0005.1D6CC] # MATHEMATICAL BOLD SMALL LAMDA 1D706 ; [.191E.0020.0005.1D706] # MATHEMATICAL ITALIC SMALL LAMDA 1D740 ; [.191E.0020.0005.1D740] # MATHEMATICAL BOLD ITALIC SMALL LAMDA 1D77A ; [.191E.0020.0005.1D77A] # MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA 1D7B4 ; [.191E.0020.0005.1D7B4] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA 039B ; [.191E.0020.0008.039B] # GREEK CAPITAL LETTER LAMDA 1D6B2 ; [.191E.0020.000B.1D6B2] # MATHEMATICAL BOLD CAPITAL LAMDA 1D6EC ; [.191E.0020.000B.1D6EC] # MATHEMATICAL ITALIC CAPITAL LAMDA 1D726 ; [.191E.0020.000B.1D726] # MATHEMATICAL BOLD ITALIC CAPITAL LAMDA 1D760 ; [.191E.0020.000B.1D760] # MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA 1D79A ; [.191E.0020.000B.1D79A] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA 1D27 ; [.191F.0020.0002.1D27] # GREEK LETTER SMALL CAPITAL LAMDA 03BC ; [.1920.0020.0002.03BC] # GREEK SMALL LETTER MU 00B5 ; [.1920.0020.0004.00B5] # MICRO SIGN 1D6CD ; [.1920.0020.0005.1D6CD] # MATHEMATICAL BOLD SMALL MU 1D707 ; [.1920.0020.0005.1D707] # MATHEMATICAL ITALIC SMALL MU 1D741 ; [.1920.0020.0005.1D741] # MATHEMATICAL BOLD ITALIC SMALL MU 1D77B ; [.1920.0020.0005.1D77B] # MATHEMATICAL SANS-SERIF BOLD SMALL MU 1D7B5 ; [.1920.0020.0005.1D7B5] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU 039C ; [.1920.0020.0008.039C] # GREEK CAPITAL LETTER MU 1D6B3 ; [.1920.0020.000B.1D6B3] # MATHEMATICAL BOLD CAPITAL MU 1D6ED ; [.1920.0020.000B.1D6ED] # MATHEMATICAL ITALIC CAPITAL MU 1D727 ; [.1920.0020.000B.1D727] # MATHEMATICAL BOLD ITALIC CAPITAL MU 1D761 ; [.1920.0020.000B.1D761] # MATHEMATICAL SANS-SERIF BOLD CAPITAL MU 1D79B ; [.1920.0020.000B.1D79B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU 3382 ; [.1920.0020.001C.3382][.15D4.0020.001D.3382] # SQUARE MU A 338C ; [.1920.0020.001C.338C][.1669.0020.001D.338C] # SQUARE MU F 338D ; [.1920.0020.001C.338D][.1676.0020.001C.338D] # SQUARE MU G 3395 ; [.1920.0020.001C.3395][.16F6.0020.001C.3395] # SQUARE MU L 339B ; [.1920.0020.001C.339B][.1726.0020.001C.339B] # SQUARE MU M 33B2 ; [.1920.0020.001C.33B2][.17D8.0020.001C.33B2] # SQUARE MU S 33B6 ; [.1920.0020.001C.33B6][.1844.0020.001D.33B6] # SQUARE MU V 33BC ; [.1920.0020.001C.33BC][.1856.0020.001D.33BC] # SQUARE MU W 03BD ; [.1921.0020.0002.03BD] # GREEK SMALL LETTER NU 1D6CE ; [.1921.0020.0005.1D6CE] # MATHEMATICAL BOLD SMALL NU 1D708 ; [.1921.0020.0005.1D708] # MATHEMATICAL ITALIC SMALL NU 1D742 ; [.1921.0020.0005.1D742] # MATHEMATICAL BOLD ITALIC SMALL NU 1D77C ; [.1921.0020.0005.1D77C] # MATHEMATICAL SANS-SERIF BOLD SMALL NU 1D7B6 ; [.1921.0020.0005.1D7B6] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU 039D ; [.1921.0020.0008.039D] # GREEK CAPITAL LETTER NU 1D6B4 ; [.1921.0020.000B.1D6B4] # MATHEMATICAL BOLD CAPITAL NU 1D6EE ; [.1921.0020.000B.1D6EE] # MATHEMATICAL ITALIC CAPITAL NU 1D728 ; [.1921.0020.000B.1D728] # MATHEMATICAL BOLD ITALIC CAPITAL NU 1D762 ; [.1921.0020.000B.1D762] # MATHEMATICAL SANS-SERIF BOLD CAPITAL NU 1D79C ; [.1921.0020.000B.1D79C] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU 03BE ; [.1922.0020.0002.03BE] # GREEK SMALL LETTER XI 1D6CF ; [.1922.0020.0005.1D6CF] # MATHEMATICAL BOLD SMALL XI 1D709 ; [.1922.0020.0005.1D709] # MATHEMATICAL ITALIC SMALL XI 1D743 ; [.1922.0020.0005.1D743] # MATHEMATICAL BOLD ITALIC SMALL XI 1D77D ; [.1922.0020.0005.1D77D] # MATHEMATICAL SANS-SERIF BOLD SMALL XI 1D7B7 ; [.1922.0020.0005.1D7B7] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI 039E ; [.1922.0020.0008.039E] # GREEK CAPITAL LETTER XI 1D6B5 ; [.1922.0020.000B.1D6B5] # MATHEMATICAL BOLD CAPITAL XI 1D6EF ; [.1922.0020.000B.1D6EF] # MATHEMATICAL ITALIC CAPITAL XI 1D729 ; [.1922.0020.000B.1D729] # MATHEMATICAL BOLD ITALIC CAPITAL XI 1D763 ; [.1922.0020.000B.1D763] # MATHEMATICAL SANS-SERIF BOLD CAPITAL XI 1D79D ; [.1922.0020.000B.1D79D] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI 03BF ; [.1923.0020.0002.03BF] # GREEK SMALL LETTER OMICRON 1D6D0 ; [.1923.0020.0005.1D6D0] # MATHEMATICAL BOLD SMALL OMICRON 1D70A ; [.1923.0020.0005.1D70A] # MATHEMATICAL ITALIC SMALL OMICRON 1D744 ; [.1923.0020.0005.1D744] # MATHEMATICAL BOLD ITALIC SMALL OMICRON 1D77E ; [.1923.0020.0005.1D77E] # MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON 1D7B8 ; [.1923.0020.0005.1D7B8] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON 039F ; [.1923.0020.0008.039F] # GREEK CAPITAL LETTER OMICRON 1D6B6 ; [.1923.0020.000B.1D6B6] # MATHEMATICAL BOLD CAPITAL OMICRON 1D6F0 ; [.1923.0020.000B.1D6F0] # MATHEMATICAL ITALIC CAPITAL OMICRON 1D72A ; [.1923.0020.000B.1D72A] # MATHEMATICAL BOLD ITALIC CAPITAL OMICRON 1D764 ; [.1923.0020.000B.1D764] # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON 1D79E ; [.1923.0020.000B.1D79E] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON 1F40 ; [.1923.0020.0002.03BF][.0000.0022.0002.0313] # GREEK SMALL LETTER OMICRON WITH PSILI 1F48 ; [.1923.0020.0008.039F][.0000.0022.0002.0313] # GREEK CAPITAL LETTER OMICRON WITH PSILI 1F44 ; [.1923.0020.0002.03BF][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA 1F4C ; [.1923.0020.0008.039F][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA 1F42 ; [.1923.0020.0002.03BF][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA 1F4A ; [.1923.0020.0008.039F][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA 1F41 ; [.1923.0020.0002.03BF][.0000.002A.0002.0314] # GREEK SMALL LETTER OMICRON WITH DASIA 1F49 ; [.1923.0020.0008.039F][.0000.002A.0002.0314] # GREEK CAPITAL LETTER OMICRON WITH DASIA 1F45 ; [.1923.0020.0002.03BF][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA 1F4D ; [.1923.0020.0008.039F][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA 1F43 ; [.1923.0020.0002.03BF][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA 1F4B ; [.1923.0020.0008.039F][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA 03CC ; [.1923.0020.0002.03BF][.0000.0032.0002.0301] # GREEK SMALL LETTER OMICRON WITH TONOS 1F79 ; [.1923.0020.0002.03BF][.0000.0032.0002.0301] # GREEK SMALL LETTER OMICRON WITH OXIA 038C ; [.1923.0020.0008.039F][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMICRON WITH TONOS 1FF9 ; [.1923.0020.0008.039F][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMICRON WITH OXIA 1F78 ; [.1923.0020.0002.03BF][.0000.0035.0002.0300] # GREEK SMALL LETTER OMICRON WITH VARIA 1FF8 ; [.1923.0020.0008.039F][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMICRON WITH VARIA 03C0 ; [.1924.0020.0002.03C0] # GREEK SMALL LETTER PI 03D6 ; [.1924.0020.0004.03D6] # GREEK PI SYMBOL 213C ; [.1924.0020.0005.213C] # DOUBLE-STRUCK SMALL PI 1D6D1 ; [.1924.0020.0005.1D6D1] # MATHEMATICAL BOLD SMALL PI 1D6E1 ; [.1924.0020.0005.1D6E1] # MATHEMATICAL BOLD PI SYMBOL 1D70B ; [.1924.0020.0005.1D70B] # MATHEMATICAL ITALIC SMALL PI 1D71B ; [.1924.0020.0005.1D71B] # MATHEMATICAL ITALIC PI SYMBOL 1D745 ; [.1924.0020.0005.1D745] # MATHEMATICAL BOLD ITALIC SMALL PI 1D755 ; [.1924.0020.0005.1D755] # MATHEMATICAL BOLD ITALIC PI SYMBOL 1D77F ; [.1924.0020.0005.1D77F] # MATHEMATICAL SANS-SERIF BOLD SMALL PI 1D78F ; [.1924.0020.0005.1D78F] # MATHEMATICAL SANS-SERIF BOLD PI SYMBOL 1D7B9 ; [.1924.0020.0005.1D7B9] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI 1D7C9 ; [.1924.0020.0005.1D7C9] # MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL 03A0 ; [.1924.0020.0008.03A0] # GREEK CAPITAL LETTER PI 213F ; [.1924.0020.000B.213F] # DOUBLE-STRUCK CAPITAL PI 1D6B7 ; [.1924.0020.000B.1D6B7] # MATHEMATICAL BOLD CAPITAL PI 1D6F1 ; [.1924.0020.000B.1D6F1] # MATHEMATICAL ITALIC CAPITAL PI 1D72B ; [.1924.0020.000B.1D72B] # MATHEMATICAL BOLD ITALIC CAPITAL PI 1D765 ; [.1924.0020.000B.1D765] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PI 1D79F ; [.1924.0020.000B.1D79F] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI 1D28 ; [.1925.0020.0002.1D28] # GREEK LETTER SMALL CAPITAL PI 03FB ; [.1926.0020.0002.03FB] # GREEK SMALL LETTER SAN 03FA ; [.1926.0020.0008.03FA] # GREEK CAPITAL LETTER SAN 03DF ; [.1927.0020.0002.03DF] # GREEK SMALL LETTER KOPPA 03DE ; [.1927.0020.0008.03DE] # GREEK LETTER KOPPA 03D9 ; [.1928.0020.0002.03D9] # GREEK SMALL LETTER ARCHAIC KOPPA 03D8 ; [.1928.0020.0008.03D8] # GREEK LETTER ARCHAIC KOPPA 03C1 ; [.1929.0020.0002.03C1] # GREEK SMALL LETTER RHO 03F1 ; [.1929.0020.0004.03F1] # GREEK RHO SYMBOL 1D6D2 ; [.1929.0020.0005.1D6D2] # MATHEMATICAL BOLD SMALL RHO 1D6E0 ; [.1929.0020.0005.1D6E0] # MATHEMATICAL BOLD RHO SYMBOL 1D70C ; [.1929.0020.0005.1D70C] # MATHEMATICAL ITALIC SMALL RHO 1D71A ; [.1929.0020.0005.1D71A] # MATHEMATICAL ITALIC RHO SYMBOL 1D746 ; [.1929.0020.0005.1D746] # MATHEMATICAL BOLD ITALIC SMALL RHO 1D754 ; [.1929.0020.0005.1D754] # MATHEMATICAL BOLD ITALIC RHO SYMBOL 1D780 ; [.1929.0020.0005.1D780] # MATHEMATICAL SANS-SERIF BOLD SMALL RHO 1D78E ; [.1929.0020.0005.1D78E] # MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL 1D7BA ; [.1929.0020.0005.1D7BA] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO 1D7C8 ; [.1929.0020.0005.1D7C8] # MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL 03A1 ; [.1929.0020.0008.03A1] # GREEK CAPITAL LETTER RHO 1D6B8 ; [.1929.0020.000B.1D6B8] # MATHEMATICAL BOLD CAPITAL RHO 1D6F2 ; [.1929.0020.000B.1D6F2] # MATHEMATICAL ITALIC CAPITAL RHO 1D72C ; [.1929.0020.000B.1D72C] # MATHEMATICAL BOLD ITALIC CAPITAL RHO 1D766 ; [.1929.0020.000B.1D766] # MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO 1D7A0 ; [.1929.0020.000B.1D7A0] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO 1D68 ; [.1929.0020.0015.1D68] # GREEK SUBSCRIPT SMALL LETTER RHO 1FE4 ; [.1929.0020.0002.03C1][.0000.0022.0002.0313] # GREEK SMALL LETTER RHO WITH PSILI 1FE5 ; [.1929.0020.0002.03C1][.0000.002A.0002.0314] # GREEK SMALL LETTER RHO WITH DASIA 1FEC ; [.1929.0020.0008.03A1][.0000.002A.0002.0314] # GREEK CAPITAL LETTER RHO WITH DASIA 1D29 ; [.192A.0020.0002.1D29] # GREEK LETTER SMALL CAPITAL RHO 03FC ; [.192B.0020.0002.03FC] # GREEK RHO WITH STROKE SYMBOL 03C3 ; [.192C.0020.0002.03C3] # GREEK SMALL LETTER SIGMA 03F2 ; [.192C.0020.0004.03F2] # GREEK LUNATE SIGMA SYMBOL 1D6D3 ; [.192C.0020.0005.1D6D3] # MATHEMATICAL BOLD SMALL FINAL SIGMA 1D6D4 ; [.192C.0020.0005.1D6D4] # MATHEMATICAL BOLD SMALL SIGMA 1D70D ; [.192C.0020.0005.1D70D] # MATHEMATICAL ITALIC SMALL FINAL SIGMA 1D70E ; [.192C.0020.0005.1D70E] # MATHEMATICAL ITALIC SMALL SIGMA 1D747 ; [.192C.0020.0005.1D747] # MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA 1D748 ; [.192C.0020.0005.1D748] # MATHEMATICAL BOLD ITALIC SMALL SIGMA 1D781 ; [.192C.0020.0005.1D781] # MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA 1D782 ; [.192C.0020.0005.1D782] # MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA 1D7BB ; [.192C.0020.0005.1D7BB] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA 1D7BC ; [.192C.0020.0005.1D7BC] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA 03A3 ; [.192C.0020.0008.03A3] # GREEK CAPITAL LETTER SIGMA 03F9 ; [.192C.0020.000A.03F9] # GREEK CAPITAL LUNATE SIGMA SYMBOL 1D6BA ; [.192C.0020.000B.1D6BA] # MATHEMATICAL BOLD CAPITAL SIGMA 1D6F4 ; [.192C.0020.000B.1D6F4] # MATHEMATICAL ITALIC CAPITAL SIGMA 1D72E ; [.192C.0020.000B.1D72E] # MATHEMATICAL BOLD ITALIC CAPITAL SIGMA 1D768 ; [.192C.0020.000B.1D768] # MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA 1D7A2 ; [.192C.0020.000B.1D7A2] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA 03C2 ; [.192C.0020.0019.03C2] # GREEK SMALL LETTER FINAL SIGMA 037C ; [.192D.0020.0002.037C] # GREEK SMALL DOTTED LUNATE SIGMA SYMBOL 03FE ; [.192D.0020.0008.03FE] # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL 037B ; [.192E.0020.0002.037B] # GREEK SMALL REVERSED LUNATE SIGMA SYMBOL 03FD ; [.192E.0020.0008.03FD] # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL 037D ; [.192F.0020.0002.037D] # GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL 03FF ; [.192F.0020.0008.03FF] # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL 03C4 ; [.1930.0020.0002.03C4] # GREEK SMALL LETTER TAU 1D6D5 ; [.1930.0020.0005.1D6D5] # MATHEMATICAL BOLD SMALL TAU 1D70F ; [.1930.0020.0005.1D70F] # MATHEMATICAL ITALIC SMALL TAU 1D749 ; [.1930.0020.0005.1D749] # MATHEMATICAL BOLD ITALIC SMALL TAU 1D783 ; [.1930.0020.0005.1D783] # MATHEMATICAL SANS-SERIF BOLD SMALL TAU 1D7BD ; [.1930.0020.0005.1D7BD] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU 03A4 ; [.1930.0020.0008.03A4] # GREEK CAPITAL LETTER TAU 1D6BB ; [.1930.0020.000B.1D6BB] # MATHEMATICAL BOLD CAPITAL TAU 1D6F5 ; [.1930.0020.000B.1D6F5] # MATHEMATICAL ITALIC CAPITAL TAU 1D72F ; [.1930.0020.000B.1D72F] # MATHEMATICAL BOLD ITALIC CAPITAL TAU 1D769 ; [.1930.0020.000B.1D769] # MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU 1D7A3 ; [.1930.0020.000B.1D7A3] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU 03C5 ; [.1931.0020.0002.03C5] # GREEK SMALL LETTER UPSILON 1D6D6 ; [.1931.0020.0005.1D6D6] # MATHEMATICAL BOLD SMALL UPSILON 1D710 ; [.1931.0020.0005.1D710] # MATHEMATICAL ITALIC SMALL UPSILON 1D74A ; [.1931.0020.0005.1D74A] # MATHEMATICAL BOLD ITALIC SMALL UPSILON 1D784 ; [.1931.0020.0005.1D784] # MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON 1D7BE ; [.1931.0020.0005.1D7BE] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON 03A5 ; [.1931.0020.0008.03A5] # GREEK CAPITAL LETTER UPSILON 03D2 ; [.1931.0020.000A.03D2] # GREEK UPSILON WITH HOOK SYMBOL 1D6BC ; [.1931.0020.000B.1D6BC] # MATHEMATICAL BOLD CAPITAL UPSILON 1D6F6 ; [.1931.0020.000B.1D6F6] # MATHEMATICAL ITALIC CAPITAL UPSILON 1D730 ; [.1931.0020.000B.1D730] # MATHEMATICAL BOLD ITALIC CAPITAL UPSILON 1D76A ; [.1931.0020.000B.1D76A] # MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON 1D7A4 ; [.1931.0020.000B.1D7A4] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON 1F50 ; [.1931.0020.0002.03C5][.0000.0022.0002.0313] # GREEK SMALL LETTER UPSILON WITH PSILI 1F54 ; [.1931.0020.0002.03C5][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA 1F52 ; [.1931.0020.0002.03C5][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA 1F56 ; [.1931.0020.0002.03C5][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI 1F51 ; [.1931.0020.0002.03C5][.0000.002A.0002.0314] # GREEK SMALL LETTER UPSILON WITH DASIA 1F59 ; [.1931.0020.0008.03A5][.0000.002A.0002.0314] # GREEK CAPITAL LETTER UPSILON WITH DASIA 1F55 ; [.1931.0020.0002.03C5][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA 1F5D ; [.1931.0020.0008.03A5][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA 1F53 ; [.1931.0020.0002.03C5][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA 1F5B ; [.1931.0020.0008.03A5][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA 1F57 ; [.1931.0020.0002.03C5][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI 1F5F ; [.1931.0020.0008.03A5][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI 03CD ; [.1931.0020.0002.03C5][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH TONOS 1F7B ; [.1931.0020.0002.03C5][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH OXIA 038E ; [.1931.0020.0008.03A5][.0000.0032.0002.0301] # GREEK CAPITAL LETTER UPSILON WITH TONOS 1FEB ; [.1931.0020.0008.03A5][.0000.0032.0002.0301] # GREEK CAPITAL LETTER UPSILON WITH OXIA 03D3 ; [.1931.0020.000A.03D3][.0000.0032.0002.03D3] # GREEK UPSILON WITH ACUTE AND HOOK SYMBOL 1F7A ; [.1931.0020.0002.03C5][.0000.0035.0002.0300] # GREEK SMALL LETTER UPSILON WITH VARIA 1FEA ; [.1931.0020.0008.03A5][.0000.0035.0002.0300] # GREEK CAPITAL LETTER UPSILON WITH VARIA 1FE0 ; [.1931.0020.0002.03C5][.0000.0037.0002.0306] # GREEK SMALL LETTER UPSILON WITH VRACHY 1FE8 ; [.1931.0020.0008.03A5][.0000.0037.0002.0306] # GREEK CAPITAL LETTER UPSILON WITH VRACHY 1FE6 ; [.1931.0020.0002.03C5][.0000.0045.0002.0342] # GREEK SMALL LETTER UPSILON WITH PERISPOMENI 03CB ; [.1931.0020.0002.03C5][.0000.0047.0002.0308] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA 03AB ; [.1931.0020.0008.03A5][.0000.0047.0002.0308] # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA 03D4 ; [.1931.0020.000A.03D4][.0000.0047.0002.03D4] # GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL 03B0 ; [.1931.0020.0002.03C5][.0000.0047.0002.0308][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS 1FE3 ; [.1931.0020.0002.03C5][.0000.0047.0002.0308][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA 1FE2 ; [.1931.0020.0002.03C5][.0000.0047.0002.0308][.0000.0035.0002.0300] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA 1FE7 ; [.1931.0020.0002.03C5][.0000.0047.0002.0308][.0000.0045.0002.0342] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI 1FE1 ; [.1931.0020.0002.03C5][.0000.005B.0002.0304] # GREEK SMALL LETTER UPSILON WITH MACRON 1FE9 ; [.1931.0020.0008.03A5][.0000.005B.0002.0304] # GREEK CAPITAL LETTER UPSILON WITH MACRON 03C6 ; [.1932.0020.0002.03C6] # GREEK SMALL LETTER PHI 03D5 ; [.1932.0020.0004.03D5] # GREEK PHI SYMBOL 1D6D7 ; [.1932.0020.0005.1D6D7] # MATHEMATICAL BOLD SMALL PHI 1D6DF ; [.1932.0020.0005.1D6DF] # MATHEMATICAL BOLD PHI SYMBOL 1D711 ; [.1932.0020.0005.1D711] # MATHEMATICAL ITALIC SMALL PHI 1D719 ; [.1932.0020.0005.1D719] # MATHEMATICAL ITALIC PHI SYMBOL 1D74B ; [.1932.0020.0005.1D74B] # MATHEMATICAL BOLD ITALIC SMALL PHI 1D753 ; [.1932.0020.0005.1D753] # MATHEMATICAL BOLD ITALIC PHI SYMBOL 1D785 ; [.1932.0020.0005.1D785] # MATHEMATICAL SANS-SERIF BOLD SMALL PHI 1D78D ; [.1932.0020.0005.1D78D] # MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL 1D7BF ; [.1932.0020.0005.1D7BF] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI 1D7C7 ; [.1932.0020.0005.1D7C7] # MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL 03A6 ; [.1932.0020.0008.03A6] # GREEK CAPITAL LETTER PHI 1D6BD ; [.1932.0020.000B.1D6BD] # MATHEMATICAL BOLD CAPITAL PHI 1D6F7 ; [.1932.0020.000B.1D6F7] # MATHEMATICAL ITALIC CAPITAL PHI 1D731 ; [.1932.0020.000B.1D731] # MATHEMATICAL BOLD ITALIC CAPITAL PHI 1D76B ; [.1932.0020.000B.1D76B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI 1D7A5 ; [.1932.0020.000B.1D7A5] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI 1D60 ; [.1932.0020.0014.1D60] # MODIFIER LETTER SMALL GREEK PHI 1D69 ; [.1932.0020.0015.1D69] # GREEK SUBSCRIPT SMALL LETTER PHI 03C7 ; [.1933.0020.0002.03C7] # GREEK SMALL LETTER CHI 1D6D8 ; [.1933.0020.0005.1D6D8] # MATHEMATICAL BOLD SMALL CHI 1D712 ; [.1933.0020.0005.1D712] # MATHEMATICAL ITALIC SMALL CHI 1D74C ; [.1933.0020.0005.1D74C] # MATHEMATICAL BOLD ITALIC SMALL CHI 1D786 ; [.1933.0020.0005.1D786] # MATHEMATICAL SANS-SERIF BOLD SMALL CHI 1D7C0 ; [.1933.0020.0005.1D7C0] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI 03A7 ; [.1933.0020.0008.03A7] # GREEK CAPITAL LETTER CHI 1D6BE ; [.1933.0020.000B.1D6BE] # MATHEMATICAL BOLD CAPITAL CHI 1D6F8 ; [.1933.0020.000B.1D6F8] # MATHEMATICAL ITALIC CAPITAL CHI 1D732 ; [.1933.0020.000B.1D732] # MATHEMATICAL BOLD ITALIC CAPITAL CHI 1D76C ; [.1933.0020.000B.1D76C] # MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI 1D7A6 ; [.1933.0020.000B.1D7A6] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI 1D61 ; [.1933.0020.0014.1D61] # MODIFIER LETTER SMALL CHI 1D6A ; [.1933.0020.0015.1D6A] # GREEK SUBSCRIPT SMALL LETTER CHI 03C8 ; [.1934.0020.0002.03C8] # GREEK SMALL LETTER PSI 1D6D9 ; [.1934.0020.0005.1D6D9] # MATHEMATICAL BOLD SMALL PSI 1D713 ; [.1934.0020.0005.1D713] # MATHEMATICAL ITALIC SMALL PSI 1D74D ; [.1934.0020.0005.1D74D] # MATHEMATICAL BOLD ITALIC SMALL PSI 1D787 ; [.1934.0020.0005.1D787] # MATHEMATICAL SANS-SERIF BOLD SMALL PSI 1D7C1 ; [.1934.0020.0005.1D7C1] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI 03A8 ; [.1934.0020.0008.03A8] # GREEK CAPITAL LETTER PSI 1D6BF ; [.1934.0020.000B.1D6BF] # MATHEMATICAL BOLD CAPITAL PSI 1D6F9 ; [.1934.0020.000B.1D6F9] # MATHEMATICAL ITALIC CAPITAL PSI 1D733 ; [.1934.0020.000B.1D733] # MATHEMATICAL BOLD ITALIC CAPITAL PSI 1D76D ; [.1934.0020.000B.1D76D] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI 1D7A7 ; [.1934.0020.000B.1D7A7] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI 1D2A ; [.1935.0020.0002.1D2A] # GREEK LETTER SMALL CAPITAL PSI 03C9 ; [.1936.0020.0002.03C9] # GREEK SMALL LETTER OMEGA 1D6DA ; [.1936.0020.0005.1D6DA] # MATHEMATICAL BOLD SMALL OMEGA 1D714 ; [.1936.0020.0005.1D714] # MATHEMATICAL ITALIC SMALL OMEGA 1D74E ; [.1936.0020.0005.1D74E] # MATHEMATICAL BOLD ITALIC SMALL OMEGA 1D788 ; [.1936.0020.0005.1D788] # MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA 1D7C2 ; [.1936.0020.0005.1D7C2] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA 03A9 ; [.1936.0020.0008.03A9] # GREEK CAPITAL LETTER OMEGA 2126 ; [.1936.0020.0008.2126] # OHM SIGN 1D6C0 ; [.1936.0020.000B.1D6C0] # MATHEMATICAL BOLD CAPITAL OMEGA 1D6FA ; [.1936.0020.000B.1D6FA] # MATHEMATICAL ITALIC CAPITAL OMEGA 1D734 ; [.1936.0020.000B.1D734] # MATHEMATICAL BOLD ITALIC CAPITAL OMEGA 1D76E ; [.1936.0020.000B.1D76E] # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA 1D7A8 ; [.1936.0020.000B.1D7A8] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA 1F60 ; [.1936.0020.0002.03C9][.0000.0022.0002.0313] # GREEK SMALL LETTER OMEGA WITH PSILI 1F68 ; [.1936.0020.0008.03A9][.0000.0022.0002.0313] # GREEK CAPITAL LETTER OMEGA WITH PSILI 1F64 ; [.1936.0020.0002.03C9][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA 1F6C ; [.1936.0020.0008.03A9][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA 1FA4 ; [.1936.0020.0002.03C9][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI 1FAC ; [.1936.0020.0008.03A9][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI 1F62 ; [.1936.0020.0002.03C9][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA 1F6A ; [.1936.0020.0008.03A9][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA 1FA2 ; [.1936.0020.0002.03C9][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI 1FAA ; [.1936.0020.0008.03A9][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI 1F66 ; [.1936.0020.0002.03C9][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI 1F6E ; [.1936.0020.0008.03A9][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI 1FA6 ; [.1936.0020.0002.03C9][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI 1FAE ; [.1936.0020.0008.03A9][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI 1FA0 ; [.1936.0020.0002.03C9][.0000.0022.0002.0313][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI 1FA8 ; [.1936.0020.0008.03A9][.0000.0022.0002.0313][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI 1F61 ; [.1936.0020.0002.03C9][.0000.002A.0002.0314] # GREEK SMALL LETTER OMEGA WITH DASIA 1F69 ; [.1936.0020.0008.03A9][.0000.002A.0002.0314] # GREEK CAPITAL LETTER OMEGA WITH DASIA 1F65 ; [.1936.0020.0002.03C9][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA 1F6D ; [.1936.0020.0008.03A9][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA 1FA5 ; [.1936.0020.0002.03C9][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI 1FAD ; [.1936.0020.0008.03A9][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI 1F63 ; [.1936.0020.0002.03C9][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA 1F6B ; [.1936.0020.0008.03A9][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA 1FA3 ; [.1936.0020.0002.03C9][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI 1FAB ; [.1936.0020.0008.03A9][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI 1F67 ; [.1936.0020.0002.03C9][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI 1F6F ; [.1936.0020.0008.03A9][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI 1FA7 ; [.1936.0020.0002.03C9][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI 1FAF ; [.1936.0020.0008.03A9][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI 1FA1 ; [.1936.0020.0002.03C9][.0000.002A.0002.0314][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI 1FA9 ; [.1936.0020.0008.03A9][.0000.002A.0002.0314][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI 03CE ; [.1936.0020.0002.03C9][.0000.0032.0002.0301] # GREEK SMALL LETTER OMEGA WITH TONOS 1F7D ; [.1936.0020.0002.03C9][.0000.0032.0002.0301] # GREEK SMALL LETTER OMEGA WITH OXIA 038F ; [.1936.0020.0008.03A9][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMEGA WITH TONOS 1FFB ; [.1936.0020.0008.03A9][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMEGA WITH OXIA 1FF4 ; [.1936.0020.0002.03C9][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI 1F7C ; [.1936.0020.0002.03C9][.0000.0035.0002.0300] # GREEK SMALL LETTER OMEGA WITH VARIA 1FFA ; [.1936.0020.0008.03A9][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMEGA WITH VARIA 1FF2 ; [.1936.0020.0002.03C9][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI 1FF6 ; [.1936.0020.0002.03C9][.0000.0045.0002.0342] # GREEK SMALL LETTER OMEGA WITH PERISPOMENI 1FF7 ; [.1936.0020.0002.03C9][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI 1FF3 ; [.1936.0020.0002.03C9][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI 1FFC ; [.1936.0020.0008.03A9][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI 03E1 ; [.1937.0020.0002.03E1] # GREEK SMALL LETTER SAMPI 03E0 ; [.1937.0020.0008.03E0] # GREEK LETTER SAMPI 0373 ; [.1938.0020.0002.0373] # GREEK SMALL LETTER ARCHAIC SAMPI 0372 ; [.1938.0020.0008.0372] # GREEK CAPITAL LETTER ARCHAIC SAMPI 03F8 ; [.1939.0020.0002.03F8] # GREEK SMALL LETTER SHO 03F7 ; [.1939.0020.0008.03F7] # GREEK CAPITAL LETTER SHO 2C81 ; [.193A.0020.0002.2C81] # COPTIC SMALL LETTER ALFA 2C80 ; [.193A.0020.0008.2C80] # COPTIC CAPITAL LETTER ALFA 2C83 ; [.193B.0020.0002.2C83] # COPTIC SMALL LETTER VIDA 2C82 ; [.193B.0020.0008.2C82] # COPTIC CAPITAL LETTER VIDA 2C85 ; [.193C.0020.0002.2C85] # COPTIC SMALL LETTER GAMMA 2C84 ; [.193C.0020.0008.2C84] # COPTIC CAPITAL LETTER GAMMA 2C87 ; [.193D.0020.0002.2C87] # COPTIC SMALL LETTER DALDA 2C86 ; [.193D.0020.0008.2C86] # COPTIC CAPITAL LETTER DALDA 2C89 ; [.193E.0020.0002.2C89] # COPTIC SMALL LETTER EIE 2C88 ; [.193E.0020.0008.2C88] # COPTIC CAPITAL LETTER EIE 2CB7 ; [.193F.0020.0002.2CB7] # COPTIC SMALL LETTER CRYPTOGRAMMIC EIE 2CB6 ; [.193F.0020.0008.2CB6] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE 2C8B ; [.1940.0020.0002.2C8B] # COPTIC SMALL LETTER SOU 2C8A ; [.1940.0020.0008.2C8A] # COPTIC CAPITAL LETTER SOU 2C8D ; [.1941.0020.0002.2C8D] # COPTIC SMALL LETTER ZATA 2C8C ; [.1941.0020.0008.2C8C] # COPTIC CAPITAL LETTER ZATA 2C8F ; [.1942.0020.0002.2C8F] # COPTIC SMALL LETTER HATE 2C8E ; [.1942.0020.0008.2C8E] # COPTIC CAPITAL LETTER HATE 2C91 ; [.1943.0020.0002.2C91] # COPTIC SMALL LETTER THETHE 2C90 ; [.1943.0020.0008.2C90] # COPTIC CAPITAL LETTER THETHE 2C93 ; [.1944.0020.0002.2C93] # COPTIC SMALL LETTER IAUDA 2C92 ; [.1944.0020.0008.2C92] # COPTIC CAPITAL LETTER IAUDA 2C95 ; [.1945.0020.0002.2C95] # COPTIC SMALL LETTER KAPA 2C94 ; [.1945.0020.0008.2C94] # COPTIC CAPITAL LETTER KAPA 2CE4 ; [.1945.0020.0004.2CE4][.193A.0020.0004.2CE4][.1944.0020.001F.2CE4] # COPTIC SYMBOL KAI 2CB9 ; [.1946.0020.0002.2CB9] # COPTIC SMALL LETTER DIALECT-P KAPA 2CB8 ; [.1946.0020.0008.2CB8] # COPTIC CAPITAL LETTER DIALECT-P KAPA 2C97 ; [.1947.0020.0002.2C97] # COPTIC SMALL LETTER LAULA 2C96 ; [.1947.0020.0008.2C96] # COPTIC CAPITAL LETTER LAULA 2C99 ; [.1948.0020.0002.2C99] # COPTIC SMALL LETTER MI 2C98 ; [.1948.0020.0008.2C98] # COPTIC CAPITAL LETTER MI 2C9B ; [.1949.0020.0002.2C9B] # COPTIC SMALL LETTER NI 2C9A ; [.1949.0020.0008.2C9A] # COPTIC CAPITAL LETTER NI 2CBB ; [.194A.0020.0002.2CBB] # COPTIC SMALL LETTER DIALECT-P NI 2CBA ; [.194A.0020.0008.2CBA] # COPTIC CAPITAL LETTER DIALECT-P NI 2CBD ; [.194B.0020.0002.2CBD] # COPTIC SMALL LETTER CRYPTOGRAMMIC NI 2CBC ; [.194B.0020.0008.2CBC] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI 2C9D ; [.194C.0020.0002.2C9D] # COPTIC SMALL LETTER KSI 2C9C ; [.194C.0020.0008.2C9C] # COPTIC CAPITAL LETTER KSI 2C9F ; [.194D.0020.0002.2C9F] # COPTIC SMALL LETTER O 2C9E ; [.194D.0020.0008.2C9E] # COPTIC CAPITAL LETTER O 2CA1 ; [.194E.0020.0002.2CA1] # COPTIC SMALL LETTER PI 2CA0 ; [.194E.0020.0008.2CA0] # COPTIC CAPITAL LETTER PI 2CA3 ; [.194F.0020.0002.2CA3] # COPTIC SMALL LETTER RO 2CA2 ; [.194F.0020.0008.2CA2] # COPTIC CAPITAL LETTER RO 2CA5 ; [.1950.0020.0002.2CA5] # COPTIC SMALL LETTER SIMA 2CA4 ; [.1950.0020.0008.2CA4] # COPTIC CAPITAL LETTER SIMA 2CA7 ; [.1951.0020.0002.2CA7] # COPTIC SMALL LETTER TAU 2CA6 ; [.1951.0020.0008.2CA6] # COPTIC CAPITAL LETTER TAU 2CA9 ; [.1952.0020.0002.2CA9] # COPTIC SMALL LETTER UA 2CA8 ; [.1952.0020.0008.2CA8] # COPTIC CAPITAL LETTER UA 2CAB ; [.1953.0020.0002.2CAB] # COPTIC SMALL LETTER FI 2CAA ; [.1953.0020.0008.2CAA] # COPTIC CAPITAL LETTER FI 2CAD ; [.1954.0020.0002.2CAD] # COPTIC SMALL LETTER KHI 2CAC ; [.1954.0020.0008.2CAC] # COPTIC CAPITAL LETTER KHI 2CAF ; [.1955.0020.0002.2CAF] # COPTIC SMALL LETTER PSI 2CAE ; [.1955.0020.0008.2CAE] # COPTIC CAPITAL LETTER PSI 2CB1 ; [.1956.0020.0002.2CB1] # COPTIC SMALL LETTER OOU 2CB0 ; [.1956.0020.0008.2CB0] # COPTIC CAPITAL LETTER OOU 2CBF ; [.1957.0020.0002.2CBF] # COPTIC SMALL LETTER OLD COPTIC OOU 2CBE ; [.1957.0020.0008.2CBE] # COPTIC CAPITAL LETTER OLD COPTIC OOU 2CC1 ; [.1958.0020.0002.2CC1] # COPTIC SMALL LETTER SAMPI 2CC0 ; [.1958.0020.0008.2CC0] # COPTIC CAPITAL LETTER SAMPI 03E3 ; [.1959.0020.0002.03E3] # COPTIC SMALL LETTER SHEI 03E2 ; [.1959.0020.0008.03E2] # COPTIC CAPITAL LETTER SHEI 2CEC ; [.195A.0020.0002.2CEC] # COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI 2CEB ; [.195A.0020.0008.2CEB] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI 2CC3 ; [.195B.0020.0002.2CC3] # COPTIC SMALL LETTER CROSSED SHEI 2CC2 ; [.195B.0020.0008.2CC2] # COPTIC CAPITAL LETTER CROSSED SHEI 2CC5 ; [.195C.0020.0002.2CC5] # COPTIC SMALL LETTER OLD COPTIC SHEI 2CC4 ; [.195C.0020.0008.2CC4] # COPTIC CAPITAL LETTER OLD COPTIC SHEI 2CC7 ; [.195D.0020.0002.2CC7] # COPTIC SMALL LETTER OLD COPTIC ESH 2CC6 ; [.195D.0020.0008.2CC6] # COPTIC CAPITAL LETTER OLD COPTIC ESH 03E5 ; [.195E.0020.0002.03E5] # COPTIC SMALL LETTER FEI 03E4 ; [.195E.0020.0008.03E4] # COPTIC CAPITAL LETTER FEI 03E7 ; [.195F.0020.0002.03E7] # COPTIC SMALL LETTER KHEI 03E6 ; [.195F.0020.0008.03E6] # COPTIC CAPITAL LETTER KHEI 2CF3 ; [.1960.0020.0002.2CF3] # COPTIC SMALL LETTER BOHAIRIC KHEI 2CF2 ; [.1960.0020.0008.2CF2] # COPTIC CAPITAL LETTER BOHAIRIC KHEI 2CC9 ; [.1961.0020.0002.2CC9] # COPTIC SMALL LETTER AKHMIMIC KHEI 2CC8 ; [.1961.0020.0008.2CC8] # COPTIC CAPITAL LETTER AKHMIMIC KHEI 03E9 ; [.1962.0020.0002.03E9] # COPTIC SMALL LETTER HORI 03E8 ; [.1962.0020.0008.03E8] # COPTIC CAPITAL LETTER HORI 2CCB ; [.1963.0020.0002.2CCB] # COPTIC SMALL LETTER DIALECT-P HORI 2CCA ; [.1963.0020.0008.2CCA] # COPTIC CAPITAL LETTER DIALECT-P HORI 2CCD ; [.1964.0020.0002.2CCD] # COPTIC SMALL LETTER OLD COPTIC HORI 2CCC ; [.1964.0020.0008.2CCC] # COPTIC CAPITAL LETTER OLD COPTIC HORI 2CCF ; [.1965.0020.0002.2CCF] # COPTIC SMALL LETTER OLD COPTIC HA 2CCE ; [.1965.0020.0008.2CCE] # COPTIC CAPITAL LETTER OLD COPTIC HA 2CD1 ; [.1966.0020.0002.2CD1] # COPTIC SMALL LETTER L-SHAPED HA 2CD0 ; [.1966.0020.0008.2CD0] # COPTIC CAPITAL LETTER L-SHAPED HA 2CD3 ; [.1967.0020.0002.2CD3] # COPTIC SMALL LETTER OLD COPTIC HEI 2CD2 ; [.1967.0020.0008.2CD2] # COPTIC CAPITAL LETTER OLD COPTIC HEI 2CD5 ; [.1968.0020.0002.2CD5] # COPTIC SMALL LETTER OLD COPTIC HAT 2CD4 ; [.1968.0020.0008.2CD4] # COPTIC CAPITAL LETTER OLD COPTIC HAT 03EB ; [.1969.0020.0002.03EB] # COPTIC SMALL LETTER GANGIA 03EA ; [.1969.0020.0008.03EA] # COPTIC CAPITAL LETTER GANGIA 2CEE ; [.196A.0020.0002.2CEE] # COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA 2CED ; [.196A.0020.0008.2CED] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA 2CD7 ; [.196B.0020.0002.2CD7] # COPTIC SMALL LETTER OLD COPTIC GANGIA 2CD6 ; [.196B.0020.0008.2CD6] # COPTIC CAPITAL LETTER OLD COPTIC GANGIA 03ED ; [.196C.0020.0002.03ED] # COPTIC SMALL LETTER SHIMA 03EC ; [.196C.0020.0008.03EC] # COPTIC CAPITAL LETTER SHIMA 2CD9 ; [.196D.0020.0002.2CD9] # COPTIC SMALL LETTER OLD COPTIC DJA 2CD8 ; [.196D.0020.0008.2CD8] # COPTIC CAPITAL LETTER OLD COPTIC DJA 2CDB ; [.196E.0020.0002.2CDB] # COPTIC SMALL LETTER OLD COPTIC SHIMA 2CDA ; [.196E.0020.0008.2CDA] # COPTIC CAPITAL LETTER OLD COPTIC SHIMA 2CDD ; [.196F.0020.0002.2CDD] # COPTIC SMALL LETTER OLD NUBIAN SHIMA 2CDC ; [.196F.0020.0008.2CDC] # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA 03EF ; [.1970.0020.0002.03EF] # COPTIC SMALL LETTER DEI 03EE ; [.1970.0020.0008.03EE] # COPTIC CAPITAL LETTER DEI 2CB3 ; [.1971.0020.0002.2CB3] # COPTIC SMALL LETTER DIALECT-P ALEF 2CB2 ; [.1971.0020.0008.2CB2] # COPTIC CAPITAL LETTER DIALECT-P ALEF 2CB5 ; [.1972.0020.0002.2CB5] # COPTIC SMALL LETTER OLD COPTIC AIN 2CB4 ; [.1972.0020.0008.2CB4] # COPTIC CAPITAL LETTER OLD COPTIC AIN 2CDF ; [.1973.0020.0002.2CDF] # COPTIC SMALL LETTER OLD NUBIAN NGI 2CDE ; [.1973.0020.0008.2CDE] # COPTIC CAPITAL LETTER OLD NUBIAN NGI 2CE1 ; [.1974.0020.0002.2CE1] # COPTIC SMALL LETTER OLD NUBIAN NYI 2CE0 ; [.1974.0020.0008.2CE0] # COPTIC CAPITAL LETTER OLD NUBIAN NYI 2CE3 ; [.1975.0020.0002.2CE3] # COPTIC SMALL LETTER OLD NUBIAN WAU 2CE2 ; [.1975.0020.0008.2CE2] # COPTIC CAPITAL LETTER OLD NUBIAN WAU 0430 ; [.1976.0020.0002.0430] # CYRILLIC SMALL LETTER A 2DF6 ; [.1976.0020.0004.2DF6] # COMBINING CYRILLIC LETTER A 0410 ; [.1976.0020.0008.0410] # CYRILLIC CAPITAL LETTER A 04D1 ; [.197A.0020.0002.04D1] # CYRILLIC SMALL LETTER A WITH BREVE 0430 0306 ; [.197A.0020.0002.04D1] # CYRILLIC SMALL LETTER A WITH BREVE 04D0 ; [.197A.0020.0008.04D0] # CYRILLIC CAPITAL LETTER A WITH BREVE 0410 0306 ; [.197A.0020.0008.04D0] # CYRILLIC CAPITAL LETTER A WITH BREVE 04D3 ; [.197E.0020.0002.04D3] # CYRILLIC SMALL LETTER A WITH DIAERESIS 0430 0308 ; [.197E.0020.0002.04D3] # CYRILLIC SMALL LETTER A WITH DIAERESIS 04D2 ; [.197E.0020.0008.04D2] # CYRILLIC CAPITAL LETTER A WITH DIAERESIS 0410 0308 ; [.197E.0020.0008.04D2] # CYRILLIC CAPITAL LETTER A WITH DIAERESIS 04D9 ; [.1982.0020.0002.04D9] # CYRILLIC SMALL LETTER SCHWA 04D8 ; [.1982.0020.0008.04D8] # CYRILLIC CAPITAL LETTER SCHWA 04DB ; [.1986.0020.0002.04DB] # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS 04D9 0308 ; [.1986.0020.0002.04DB] # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS 04DA ; [.1986.0020.0008.04DA] # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS 04D8 0308 ; [.1986.0020.0008.04DA] # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS 04D5 ; [.198A.0020.0002.04D5] # CYRILLIC SMALL LIGATURE A IE 04D4 ; [.198A.0020.0008.04D4] # CYRILLIC CAPITAL LIGATURE A IE 0431 ; [.198E.0020.0002.0431] # CYRILLIC SMALL LETTER BE 2DE0 ; [.198E.0020.0004.2DE0] # COMBINING CYRILLIC LETTER BE 0411 ; [.198E.0020.0008.0411] # CYRILLIC CAPITAL LETTER BE 0432 ; [.1992.0020.0002.0432] # CYRILLIC SMALL LETTER VE 2DE1 ; [.1992.0020.0004.2DE1] # COMBINING CYRILLIC LETTER VE 0412 ; [.1992.0020.0008.0412] # CYRILLIC CAPITAL LETTER VE 0433 ; [.1996.0020.0002.0433] # CYRILLIC SMALL LETTER GHE 2DE2 ; [.1996.0020.0004.2DE2] # COMBINING CYRILLIC LETTER GHE 0413 ; [.1996.0020.0008.0413] # CYRILLIC CAPITAL LETTER GHE 0491 ; [.1996.0020.0004.0491][.0000.013A.0004.0491] # CYRILLIC SMALL LETTER GHE WITH UPTURN 0490 ; [.1996.0020.000A.0490][.0000.013A.0004.0490] # CYRILLIC CAPITAL LETTER GHE WITH UPTURN 0493 ; [.199A.0020.0002.0493] # CYRILLIC SMALL LETTER GHE WITH STROKE 0492 ; [.199A.0020.0008.0492] # CYRILLIC CAPITAL LETTER GHE WITH STROKE 04FB ; [.199E.0020.0002.04FB] # CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK 04FA ; [.199E.0020.0008.04FA] # CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK 0495 ; [.19A2.0020.0002.0495] # CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK 0494 ; [.19A2.0020.0008.0494] # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK 04F7 ; [.19A6.0020.0002.04F7] # CYRILLIC SMALL LETTER GHE WITH DESCENDER 04F6 ; [.19A6.0020.0008.04F6] # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER 0434 ; [.19AA.0020.0002.0434] # CYRILLIC SMALL LETTER DE 2DE3 ; [.19AA.0020.0004.2DE3] # COMBINING CYRILLIC LETTER DE 0414 ; [.19AA.0020.0008.0414] # CYRILLIC CAPITAL LETTER DE 0501 ; [.19AE.0020.0002.0501] # CYRILLIC SMALL LETTER KOMI DE 0500 ; [.19AE.0020.0008.0500] # CYRILLIC CAPITAL LETTER KOMI DE A681 ; [.19AF.0020.0002.A681] # CYRILLIC SMALL LETTER DWE A680 ; [.19AF.0020.0008.A680] # CYRILLIC CAPITAL LETTER DWE 0452 ; [.19B0.0020.0002.0452] # CYRILLIC SMALL LETTER DJE 0402 ; [.19B0.0020.0008.0402] # CYRILLIC CAPITAL LETTER DJE A663 ; [.19B4.0020.0002.A663] # CYRILLIC SMALL LETTER SOFT DE A662 ; [.19B4.0020.0008.A662] # CYRILLIC CAPITAL LETTER SOFT DE 0503 ; [.19B5.0020.0002.0503] # CYRILLIC SMALL LETTER KOMI DJE 0502 ; [.19B5.0020.0008.0502] # CYRILLIC CAPITAL LETTER KOMI DJE 0453 ; [.19B6.0020.0002.0453] # CYRILLIC SMALL LETTER GJE 0433 0301 ; [.19B6.0020.0002.0453] # CYRILLIC SMALL LETTER GJE 0433 0341 ; [.19B6.0020.0002.0453] # CYRILLIC SMALL LETTER GJE 0403 ; [.19B6.0020.0008.0403] # CYRILLIC CAPITAL LETTER GJE 0413 0301 ; [.19B6.0020.0008.0403] # CYRILLIC CAPITAL LETTER GJE 0413 0341 ; [.19B6.0020.0008.0403] # CYRILLIC CAPITAL LETTER GJE 0499 ; [.19BA.0020.0002.0499] # CYRILLIC SMALL LETTER ZE WITH DESCENDER 0498 ; [.19BA.0020.0008.0498] # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER 0435 ; [.19BE.0020.0002.0435] # CYRILLIC SMALL LETTER IE 2DF7 ; [.19BE.0020.0004.2DF7] # COMBINING CYRILLIC LETTER IE 0415 ; [.19BE.0020.0008.0415] # CYRILLIC CAPITAL LETTER IE 0450 ; [.19BE.0020.0002.0435][.0000.0035.0002.0300] # CYRILLIC SMALL LETTER IE WITH GRAVE 0400 ; [.19BE.0020.0008.0415][.0000.0035.0002.0300] # CYRILLIC CAPITAL LETTER IE WITH GRAVE 0451 ; [.19BE.0020.0002.0435][.0000.0047.0002.0308] # CYRILLIC SMALL LETTER IO 0401 ; [.19BE.0020.0008.0415][.0000.0047.0002.0308] # CYRILLIC CAPITAL LETTER IO 04D7 ; [.19C2.0020.0002.04D7] # CYRILLIC SMALL LETTER IE WITH BREVE 0435 0306 ; [.19C2.0020.0002.04D7] # CYRILLIC SMALL LETTER IE WITH BREVE 04D6 ; [.19C2.0020.0008.04D6] # CYRILLIC CAPITAL LETTER IE WITH BREVE 0415 0306 ; [.19C2.0020.0008.04D6] # CYRILLIC CAPITAL LETTER IE WITH BREVE 0454 ; [.19C6.0020.0002.0454] # CYRILLIC SMALL LETTER UKRAINIAN IE A674 ; [.19C6.0020.0004.A674] # COMBINING CYRILLIC LETTER UKRAINIAN IE 0404 ; [.19C6.0020.0008.0404] # CYRILLIC CAPITAL LETTER UKRAINIAN IE 0436 ; [.19CA.0020.0002.0436] # CYRILLIC SMALL LETTER ZHE 2DE4 ; [.19CA.0020.0004.2DE4] # COMBINING CYRILLIC LETTER ZHE 0416 ; [.19CA.0020.0008.0416] # CYRILLIC CAPITAL LETTER ZHE 04C2 ; [.19CA.0020.0002.0436][.0000.0037.0002.0306] # CYRILLIC SMALL LETTER ZHE WITH BREVE 04C1 ; [.19CA.0020.0008.0416][.0000.0037.0002.0306] # CYRILLIC CAPITAL LETTER ZHE WITH BREVE A685 ; [.19CE.0020.0002.A685] # CYRILLIC SMALL LETTER ZHWE A684 ; [.19CE.0020.0008.A684] # CYRILLIC CAPITAL LETTER ZHWE 04DD ; [.19CF.0020.0002.04DD] # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS 0436 0308 ; [.19CF.0020.0002.04DD] # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS 04DC ; [.19CF.0020.0008.04DC] # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS 0416 0308 ; [.19CF.0020.0008.04DC] # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS 0497 ; [.19D3.0020.0002.0497] # CYRILLIC SMALL LETTER ZHE WITH DESCENDER 0496 ; [.19D3.0020.0008.0496] # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER 0437 ; [.19D7.0020.0002.0437] # CYRILLIC SMALL LETTER ZE 2DE5 ; [.19D7.0020.0004.2DE5] # COMBINING CYRILLIC LETTER ZE 0417 ; [.19D7.0020.0008.0417] # CYRILLIC CAPITAL LETTER ZE A641 ; [.19DB.0020.0002.A641] # CYRILLIC SMALL LETTER ZEMLYA A640 ; [.19DB.0020.0008.A640] # CYRILLIC CAPITAL LETTER ZEMLYA 0505 ; [.19DC.0020.0002.0505] # CYRILLIC SMALL LETTER KOMI ZJE 0504 ; [.19DC.0020.0008.0504] # CYRILLIC CAPITAL LETTER KOMI ZJE 0511 ; [.19DD.0020.0002.0511] # CYRILLIC SMALL LETTER REVERSED ZE 0510 ; [.19DD.0020.0008.0510] # CYRILLIC CAPITAL LETTER REVERSED ZE 04DF ; [.19DE.0020.0002.04DF] # CYRILLIC SMALL LETTER ZE WITH DIAERESIS 0437 0308 ; [.19DE.0020.0002.04DF] # CYRILLIC SMALL LETTER ZE WITH DIAERESIS 04DE ; [.19DE.0020.0008.04DE] # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS 0417 0308 ; [.19DE.0020.0008.04DE] # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS A643 ; [.19E2.0020.0002.A643] # CYRILLIC SMALL LETTER DZELO A642 ; [.19E2.0020.0008.A642] # CYRILLIC CAPITAL LETTER DZELO 0455 ; [.19E3.0020.0002.0455] # CYRILLIC SMALL LETTER DZE 0405 ; [.19E3.0020.0008.0405] # CYRILLIC CAPITAL LETTER DZE A645 ; [.19E7.0020.0002.A645] # CYRILLIC SMALL LETTER REVERSED DZE A644 ; [.19E7.0020.0008.A644] # CYRILLIC CAPITAL LETTER REVERSED DZE 04E1 ; [.19E8.0020.0002.04E1] # CYRILLIC SMALL LETTER ABKHASIAN DZE 04E0 ; [.19E8.0020.0008.04E0] # CYRILLIC CAPITAL LETTER ABKHASIAN DZE A689 ; [.19EC.0020.0002.A689] # CYRILLIC SMALL LETTER DZZE A688 ; [.19EC.0020.0008.A688] # CYRILLIC CAPITAL LETTER DZZE 0507 ; [.19ED.0020.0002.0507] # CYRILLIC SMALL LETTER KOMI DZJE 0506 ; [.19ED.0020.0008.0506] # CYRILLIC CAPITAL LETTER KOMI DZJE A683 ; [.19EE.0020.0002.A683] # CYRILLIC SMALL LETTER DZWE A682 ; [.19EE.0020.0008.A682] # CYRILLIC CAPITAL LETTER DZWE 0438 ; [.19EF.0020.0002.0438] # CYRILLIC SMALL LETTER I A675 ; [.19EF.0020.0004.A675] # COMBINING CYRILLIC LETTER I 0418 ; [.19EF.0020.0008.0418] # CYRILLIC CAPITAL LETTER I 045D ; [.19EF.0020.0002.0438][.0000.0035.0002.0300] # CYRILLIC SMALL LETTER I WITH GRAVE 040D ; [.19EF.0020.0008.0418][.0000.0035.0002.0300] # CYRILLIC CAPITAL LETTER I WITH GRAVE 04E3 ; [.19EF.0020.0002.0438][.0000.005B.0002.0304] # CYRILLIC SMALL LETTER I WITH MACRON 04E2 ; [.19EF.0020.0008.0418][.0000.005B.0002.0304] # CYRILLIC CAPITAL LETTER I WITH MACRON 048B ; [.19F3.0020.0002.048B] # CYRILLIC SMALL LETTER SHORT I WITH TAIL 048A ; [.19F3.0020.0008.048A] # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL 04E5 ; [.19F7.0020.0002.04E5] # CYRILLIC SMALL LETTER I WITH DIAERESIS 0438 0308 ; [.19F7.0020.0002.04E5] # CYRILLIC SMALL LETTER I WITH DIAERESIS 04E4 ; [.19F7.0020.0008.04E4] # CYRILLIC CAPITAL LETTER I WITH DIAERESIS 0418 0308 ; [.19F7.0020.0008.04E4] # CYRILLIC CAPITAL LETTER I WITH DIAERESIS 0456 ; [.19FB.0020.0002.0456] # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I 0406 ; [.19FB.0020.0008.0406] # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I A647 ; [.19FF.0020.0002.A647] # CYRILLIC SMALL LETTER IOTA A646 ; [.19FF.0020.0008.A646] # CYRILLIC CAPITAL LETTER IOTA 0457 ; [.1A00.0020.0002.0457] # CYRILLIC SMALL LETTER YI 0456 0308 ; [.1A00.0020.0002.0457] # CYRILLIC SMALL LETTER YI A676 ; [.1A00.0020.0004.A676] # COMBINING CYRILLIC LETTER YI 0407 ; [.1A00.0020.0008.0407] # CYRILLIC CAPITAL LETTER YI 0406 0308 ; [.1A00.0020.0008.0407] # CYRILLIC CAPITAL LETTER YI 0439 ; [.1A04.0020.0002.0439] # CYRILLIC SMALL LETTER SHORT I 0438 0306 ; [.1A04.0020.0002.0439] # CYRILLIC SMALL LETTER SHORT I 0419 ; [.1A04.0020.0008.0419] # CYRILLIC CAPITAL LETTER SHORT I 0418 0306 ; [.1A04.0020.0008.0419] # CYRILLIC CAPITAL LETTER SHORT I 0458 ; [.1A08.0020.0002.0458] # CYRILLIC SMALL LETTER JE 0408 ; [.1A08.0020.0008.0408] # CYRILLIC CAPITAL LETTER JE A649 ; [.1A0C.0020.0002.A649] # CYRILLIC SMALL LETTER DJERV 2DF8 ; [.1A0C.0020.0004.2DF8] # COMBINING CYRILLIC LETTER DJERV A648 ; [.1A0C.0020.0008.A648] # CYRILLIC CAPITAL LETTER DJERV 043A ; [.1A0D.0020.0002.043A] # CYRILLIC SMALL LETTER KA 2DE6 ; [.1A0D.0020.0004.2DE6] # COMBINING CYRILLIC LETTER KA 041A ; [.1A0D.0020.0008.041A] # CYRILLIC CAPITAL LETTER KA 049B ; [.1A11.0020.0002.049B] # CYRILLIC SMALL LETTER KA WITH DESCENDER 049A ; [.1A11.0020.0008.049A] # CYRILLIC CAPITAL LETTER KA WITH DESCENDER 04C4 ; [.1A15.0020.0002.04C4] # CYRILLIC SMALL LETTER KA WITH HOOK 04C3 ; [.1A15.0020.0008.04C3] # CYRILLIC CAPITAL LETTER KA WITH HOOK 04A1 ; [.1A19.0020.0002.04A1] # CYRILLIC SMALL LETTER BASHKIR KA 04A0 ; [.1A19.0020.0008.04A0] # CYRILLIC CAPITAL LETTER BASHKIR KA 049F ; [.1A1D.0020.0002.049F] # CYRILLIC SMALL LETTER KA WITH STROKE 049E ; [.1A1D.0020.0008.049E] # CYRILLIC CAPITAL LETTER KA WITH STROKE 049D ; [.1A21.0020.0002.049D] # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE 049C ; [.1A21.0020.0008.049C] # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE 051F ; [.1A25.0020.0002.051F] # CYRILLIC SMALL LETTER ALEUT KA 051E ; [.1A25.0020.0008.051E] # CYRILLIC CAPITAL LETTER ALEUT KA 051B ; [.1A26.0020.0002.051B] # CYRILLIC SMALL LETTER QA 051A ; [.1A26.0020.0008.051A] # CYRILLIC CAPITAL LETTER QA 043B ; [.1A27.0020.0002.043B] # CYRILLIC SMALL LETTER EL 2DE7 ; [.1A27.0020.0004.2DE7] # COMBINING CYRILLIC LETTER EL 041B ; [.1A27.0020.0008.041B] # CYRILLIC CAPITAL LETTER EL 1D2B ; [.1A2B.0020.0002.1D2B] # CYRILLIC LETTER SMALL CAPITAL EL 04C6 ; [.1A2C.0020.0002.04C6] # CYRILLIC SMALL LETTER EL WITH TAIL 04C5 ; [.1A2C.0020.0008.04C5] # CYRILLIC CAPITAL LETTER EL WITH TAIL 0513 ; [.1A30.0020.0002.0513] # CYRILLIC SMALL LETTER EL WITH HOOK 0512 ; [.1A30.0020.0008.0512] # CYRILLIC CAPITAL LETTER EL WITH HOOK 0521 ; [.1A31.0020.0002.0521] # CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK 0520 ; [.1A31.0020.0008.0520] # CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK 0459 ; [.1A32.0020.0002.0459] # CYRILLIC SMALL LETTER LJE 0409 ; [.1A32.0020.0008.0409] # CYRILLIC CAPITAL LETTER LJE A665 ; [.1A36.0020.0002.A665] # CYRILLIC SMALL LETTER SOFT EL A664 ; [.1A36.0020.0008.A664] # CYRILLIC CAPITAL LETTER SOFT EL 0509 ; [.1A37.0020.0002.0509] # CYRILLIC SMALL LETTER KOMI LJE 0508 ; [.1A37.0020.0008.0508] # CYRILLIC CAPITAL LETTER KOMI LJE 0515 ; [.1A38.0020.0002.0515] # CYRILLIC SMALL LETTER LHA 0514 ; [.1A38.0020.0008.0514] # CYRILLIC CAPITAL LETTER LHA 043C ; [.1A39.0020.0002.043C] # CYRILLIC SMALL LETTER EM 2DE8 ; [.1A39.0020.0004.2DE8] # COMBINING CYRILLIC LETTER EM 041C ; [.1A39.0020.0008.041C] # CYRILLIC CAPITAL LETTER EM 04CE ; [.1A3D.0020.0002.04CE] # CYRILLIC SMALL LETTER EM WITH TAIL 04CD ; [.1A3D.0020.0008.04CD] # CYRILLIC CAPITAL LETTER EM WITH TAIL A667 ; [.1A41.0020.0002.A667] # CYRILLIC SMALL LETTER SOFT EM A666 ; [.1A41.0020.0008.A666] # CYRILLIC CAPITAL LETTER SOFT EM 043D ; [.1A42.0020.0002.043D] # CYRILLIC SMALL LETTER EN 2DE9 ; [.1A42.0020.0004.2DE9] # COMBINING CYRILLIC LETTER EN 041D ; [.1A42.0020.0008.041D] # CYRILLIC CAPITAL LETTER EN 1D78 ; [.1A42.0020.0014.1D78] # MODIFIER LETTER CYRILLIC EN 04CA ; [.1A46.0020.0002.04CA] # CYRILLIC SMALL LETTER EN WITH TAIL 04C9 ; [.1A46.0020.0008.04C9] # CYRILLIC CAPITAL LETTER EN WITH TAIL 04A3 ; [.1A4A.0020.0002.04A3] # CYRILLIC SMALL LETTER EN WITH DESCENDER 04A2 ; [.1A4A.0020.0008.04A2] # CYRILLIC CAPITAL LETTER EN WITH DESCENDER 04C8 ; [.1A4E.0020.0002.04C8] # CYRILLIC SMALL LETTER EN WITH HOOK 04C7 ; [.1A4E.0020.0008.04C7] # CYRILLIC CAPITAL LETTER EN WITH HOOK 0523 ; [.1A52.0020.0002.0523] # CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK 0522 ; [.1A52.0020.0008.0522] # CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK 04A5 ; [.1A53.0020.0002.04A5] # CYRILLIC SMALL LIGATURE EN GHE 04A4 ; [.1A53.0020.0008.04A4] # CYRILLIC CAPITAL LIGATURE EN GHE 045A ; [.1A57.0020.0002.045A] # CYRILLIC SMALL LETTER NJE 040A ; [.1A57.0020.0008.040A] # CYRILLIC CAPITAL LETTER NJE 050B ; [.1A5B.0020.0002.050B] # CYRILLIC SMALL LETTER KOMI NJE 050A ; [.1A5B.0020.0008.050A] # CYRILLIC CAPITAL LETTER KOMI NJE 043E ; [.1A5C.0020.0002.043E] # CYRILLIC SMALL LETTER O 2DEA ; [.1A5C.0020.0004.2DEA] # COMBINING CYRILLIC LETTER O A669 ; [.1A5C.0020.0004.A669] # CYRILLIC SMALL LETTER MONOCULAR O A66B ; [.1A5C.0020.0004.A66B] # CYRILLIC SMALL LETTER BINOCULAR O A66D ; [.1A5C.0020.0004.A66D] # CYRILLIC SMALL LETTER DOUBLE MONOCULAR O A66E ; [.1A5C.0020.0004.A66E] # CYRILLIC LETTER MULTIOCULAR O 041E ; [.1A5C.0020.0008.041E] # CYRILLIC CAPITAL LETTER O A668 ; [.1A5C.0020.000A.A668] # CYRILLIC CAPITAL LETTER MONOCULAR O A66A ; [.1A5C.0020.000A.A66A] # CYRILLIC CAPITAL LETTER BINOCULAR O A66C ; [.1A5C.0020.000A.A66C] # CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O 04E7 ; [.1A60.0020.0002.04E7] # CYRILLIC SMALL LETTER O WITH DIAERESIS 043E 0308 ; [.1A60.0020.0002.04E7] # CYRILLIC SMALL LETTER O WITH DIAERESIS 04E6 ; [.1A60.0020.0008.04E6] # CYRILLIC CAPITAL LETTER O WITH DIAERESIS 041E 0308 ; [.1A60.0020.0008.04E6] # CYRILLIC CAPITAL LETTER O WITH DIAERESIS 04E9 ; [.1A64.0020.0002.04E9] # CYRILLIC SMALL LETTER BARRED O 04E8 ; [.1A64.0020.0008.04E8] # CYRILLIC CAPITAL LETTER BARRED O 04EB ; [.1A68.0020.0002.04EB] # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS 04E9 0308 ; [.1A68.0020.0002.04EB] # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS 04EA ; [.1A68.0020.0008.04EA] # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS 04E8 0308 ; [.1A68.0020.0008.04EA] # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS 043F ; [.1A6C.0020.0002.043F] # CYRILLIC SMALL LETTER PE 2DEB ; [.1A6C.0020.0004.2DEB] # COMBINING CYRILLIC LETTER PE 041F ; [.1A6C.0020.0008.041F] # CYRILLIC CAPITAL LETTER PE 0525 ; [.1A70.0020.0002.0525] # CYRILLIC SMALL LETTER PE WITH DESCENDER 0524 ; [.1A70.0020.0008.0524] # CYRILLIC CAPITAL LETTER PE WITH DESCENDER 04A7 ; [.1A71.0020.0002.04A7] # CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK 04A6 ; [.1A71.0020.0008.04A6] # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK 0481 ; [.1A75.0020.0002.0481] # CYRILLIC SMALL LETTER KOPPA 0480 ; [.1A75.0020.0008.0480] # CYRILLIC CAPITAL LETTER KOPPA 0440 ; [.1A79.0020.0002.0440] # CYRILLIC SMALL LETTER ER 2DEC ; [.1A79.0020.0004.2DEC] # COMBINING CYRILLIC LETTER ER 0420 ; [.1A79.0020.0008.0420] # CYRILLIC CAPITAL LETTER ER 048F ; [.1A7D.0020.0002.048F] # CYRILLIC SMALL LETTER ER WITH TICK 048E ; [.1A7D.0020.0008.048E] # CYRILLIC CAPITAL LETTER ER WITH TICK 0517 ; [.1A81.0020.0002.0517] # CYRILLIC SMALL LETTER RHA 0516 ; [.1A81.0020.0008.0516] # CYRILLIC CAPITAL LETTER RHA 0441 ; [.1A82.0020.0002.0441] # CYRILLIC SMALL LETTER ES 2DED ; [.1A82.0020.0004.2DED] # COMBINING CYRILLIC LETTER ES 0421 ; [.1A82.0020.0008.0421] # CYRILLIC CAPITAL LETTER ES 2DF5 ; [.1A82.0020.0004.2DF5][.1A8B.0020.0004.2DF5] # COMBINING CYRILLIC LETTER ES-TE 050D ; [.1A86.0020.0002.050D] # CYRILLIC SMALL LETTER KOMI SJE 050C ; [.1A86.0020.0008.050C] # CYRILLIC CAPITAL LETTER KOMI SJE 04AB ; [.1A87.0020.0002.04AB] # CYRILLIC SMALL LETTER ES WITH DESCENDER 04AA ; [.1A87.0020.0008.04AA] # CYRILLIC CAPITAL LETTER ES WITH DESCENDER 0442 ; [.1A8B.0020.0002.0442] # CYRILLIC SMALL LETTER TE 2DEE ; [.1A8B.0020.0004.2DEE] # COMBINING CYRILLIC LETTER TE 0422 ; [.1A8B.0020.0008.0422] # CYRILLIC CAPITAL LETTER TE A68D ; [.1A8F.0020.0002.A68D] # CYRILLIC SMALL LETTER TWE A68C ; [.1A8F.0020.0008.A68C] # CYRILLIC CAPITAL LETTER TWE 050F ; [.1A90.0020.0002.050F] # CYRILLIC SMALL LETTER KOMI TJE 050E ; [.1A90.0020.0008.050E] # CYRILLIC CAPITAL LETTER KOMI TJE 04AD ; [.1A91.0020.0002.04AD] # CYRILLIC SMALL LETTER TE WITH DESCENDER 04AC ; [.1A91.0020.0008.04AC] # CYRILLIC CAPITAL LETTER TE WITH DESCENDER A68B ; [.1A95.0020.0002.A68B] # CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK A68A ; [.1A95.0020.0008.A68A] # CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK 045B ; [.1A96.0020.0002.045B] # CYRILLIC SMALL LETTER TSHE 040B ; [.1A96.0020.0008.040B] # CYRILLIC CAPITAL LETTER TSHE 045C ; [.1A9A.0020.0002.045C] # CYRILLIC SMALL LETTER KJE 043A 0301 ; [.1A9A.0020.0002.045C] # CYRILLIC SMALL LETTER KJE 043A 0341 ; [.1A9A.0020.0002.045C] # CYRILLIC SMALL LETTER KJE 040C ; [.1A9A.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE 041A 0301 ; [.1A9A.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE 041A 0341 ; [.1A9A.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE 0443 ; [.1A9E.0020.0002.0443] # CYRILLIC SMALL LETTER U A677 ; [.1A9E.0020.0004.A677] # COMBINING CYRILLIC LETTER U 0423 ; [.1A9E.0020.0008.0423] # CYRILLIC CAPITAL LETTER U 04EF ; [.1A9E.0020.0002.0443][.0000.005B.0002.0304] # CYRILLIC SMALL LETTER U WITH MACRON 04EE ; [.1A9E.0020.0008.0423][.0000.005B.0002.0304] # CYRILLIC CAPITAL LETTER U WITH MACRON 045E ; [.1AA2.0020.0002.045E] # CYRILLIC SMALL LETTER SHORT U 0443 0306 ; [.1AA2.0020.0002.045E] # CYRILLIC SMALL LETTER SHORT U 040E ; [.1AA2.0020.0008.040E] # CYRILLIC CAPITAL LETTER SHORT U 0423 0306 ; [.1AA2.0020.0008.040E] # CYRILLIC CAPITAL LETTER SHORT U 04F1 ; [.1AA6.0020.0002.04F1] # CYRILLIC SMALL LETTER U WITH DIAERESIS 0443 0308 ; [.1AA6.0020.0002.04F1] # CYRILLIC SMALL LETTER U WITH DIAERESIS 04F0 ; [.1AA6.0020.0008.04F0] # CYRILLIC CAPITAL LETTER U WITH DIAERESIS 0423 0308 ; [.1AA6.0020.0008.04F0] # CYRILLIC CAPITAL LETTER U WITH DIAERESIS 04F3 ; [.1AAA.0020.0002.04F3] # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE 0443 030B ; [.1AAA.0020.0002.04F3] # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE 04F2 ; [.1AAA.0020.0008.04F2] # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE 0423 030B ; [.1AAA.0020.0008.04F2] # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE 04AF ; [.1AAE.0020.0002.04AF] # CYRILLIC SMALL LETTER STRAIGHT U 04AE ; [.1AAE.0020.0008.04AE] # CYRILLIC CAPITAL LETTER STRAIGHT U 04B1 ; [.1AB2.0020.0002.04B1] # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE 04B0 ; [.1AB2.0020.0008.04B0] # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE A64B ; [.1AB6.0020.0002.A64B] # CYRILLIC SMALL LETTER MONOGRAPH UK 2DF9 ; [.1AB6.0020.0004.2DF9] # COMBINING CYRILLIC LETTER MONOGRAPH UK A64A ; [.1AB6.0020.0008.A64A] # CYRILLIC CAPITAL LETTER MONOGRAPH UK 0479 ; [.1AB7.0020.0002.0479] # CYRILLIC SMALL LETTER UK 0478 ; [.1AB7.0020.0008.0478] # CYRILLIC CAPITAL LETTER UK 0444 ; [.1ABB.0020.0002.0444] # CYRILLIC SMALL LETTER EF 0424 ; [.1ABB.0020.0008.0424] # CYRILLIC CAPITAL LETTER EF 0445 ; [.1ABF.0020.0002.0445] # CYRILLIC SMALL LETTER HA 2DEF ; [.1ABF.0020.0004.2DEF] # COMBINING CYRILLIC LETTER HA 0425 ; [.1ABF.0020.0008.0425] # CYRILLIC CAPITAL LETTER HA 04FD ; [.1AC3.0020.0002.04FD] # CYRILLIC SMALL LETTER HA WITH HOOK 04FC ; [.1AC3.0020.0008.04FC] # CYRILLIC CAPITAL LETTER HA WITH HOOK 04FF ; [.1AC7.0020.0002.04FF] # CYRILLIC SMALL LETTER HA WITH STROKE 04FE ; [.1AC7.0020.0008.04FE] # CYRILLIC CAPITAL LETTER HA WITH STROKE 04B3 ; [.1ACB.0020.0002.04B3] # CYRILLIC SMALL LETTER HA WITH DESCENDER 04B2 ; [.1ACB.0020.0008.04B2] # CYRILLIC CAPITAL LETTER HA WITH DESCENDER 04BB ; [.1ACF.0020.0002.04BB] # CYRILLIC SMALL LETTER SHHA 04BA ; [.1ACF.0020.0008.04BA] # CYRILLIC CAPITAL LETTER SHHA 0527 ; [.1AD3.0020.0002.0527] # CYRILLIC SMALL LETTER SHHA WITH DESCENDER 0526 ; [.1AD3.0020.0008.0526] # CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER A695 ; [.1AD4.0020.0002.A695] # CYRILLIC SMALL LETTER HWE A694 ; [.1AD4.0020.0008.A694] # CYRILLIC CAPITAL LETTER HWE 0461 ; [.1AD5.0020.0002.0461] # CYRILLIC SMALL LETTER OMEGA A67B ; [.1AD5.0020.0004.A67B] # COMBINING CYRILLIC LETTER OMEGA 0460 ; [.1AD5.0020.0008.0460] # CYRILLIC CAPITAL LETTER OMEGA 047F ; [.1AD9.0020.0002.047F] # CYRILLIC SMALL LETTER OT 047E ; [.1AD9.0020.0008.047E] # CYRILLIC CAPITAL LETTER OT A64D ; [.1ADD.0020.0002.A64D] # CYRILLIC SMALL LETTER BROAD OMEGA A64C ; [.1ADD.0020.0008.A64C] # CYRILLIC CAPITAL LETTER BROAD OMEGA 047D ; [.1ADE.0020.0002.047D] # CYRILLIC SMALL LETTER OMEGA WITH TITLO 047C ; [.1ADE.0020.0008.047C] # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO 047B ; [.1AE2.0020.0002.047B] # CYRILLIC SMALL LETTER ROUND OMEGA 047A ; [.1AE2.0020.0008.047A] # CYRILLIC CAPITAL LETTER ROUND OMEGA 0446 ; [.1AE6.0020.0002.0446] # CYRILLIC SMALL LETTER TSE 2DF0 ; [.1AE6.0020.0004.2DF0] # COMBINING CYRILLIC LETTER TSE 0426 ; [.1AE6.0020.0008.0426] # CYRILLIC CAPITAL LETTER TSE A661 ; [.1AEA.0020.0002.A661] # CYRILLIC SMALL LETTER REVERSED TSE A660 ; [.1AEA.0020.0008.A660] # CYRILLIC CAPITAL LETTER REVERSED TSE A68F ; [.1AEB.0020.0002.A68F] # CYRILLIC SMALL LETTER TSWE A68E ; [.1AEB.0020.0008.A68E] # CYRILLIC CAPITAL LETTER TSWE 04B5 ; [.1AEC.0020.0002.04B5] # CYRILLIC SMALL LIGATURE TE TSE 04B4 ; [.1AEC.0020.0008.04B4] # CYRILLIC CAPITAL LIGATURE TE TSE A691 ; [.1AF0.0020.0002.A691] # CYRILLIC SMALL LETTER TSSE A690 ; [.1AF0.0020.0008.A690] # CYRILLIC CAPITAL LETTER TSSE 0447 ; [.1AF1.0020.0002.0447] # CYRILLIC SMALL LETTER CHE 2DF1 ; [.1AF1.0020.0004.2DF1] # COMBINING CYRILLIC LETTER CHE 0427 ; [.1AF1.0020.0008.0427] # CYRILLIC CAPITAL LETTER CHE A693 ; [.1AF5.0020.0002.A693] # CYRILLIC SMALL LETTER TCHE A692 ; [.1AF5.0020.0008.A692] # CYRILLIC CAPITAL LETTER TCHE 04F5 ; [.1AF6.0020.0002.04F5] # CYRILLIC SMALL LETTER CHE WITH DIAERESIS 0447 0308 ; [.1AF6.0020.0002.04F5] # CYRILLIC SMALL LETTER CHE WITH DIAERESIS 04F4 ; [.1AF6.0020.0008.04F4] # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS 0427 0308 ; [.1AF6.0020.0008.04F4] # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS 04B7 ; [.1AFA.0020.0002.04B7] # CYRILLIC SMALL LETTER CHE WITH DESCENDER 04B6 ; [.1AFA.0020.0008.04B6] # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER 04CC ; [.1AFE.0020.0002.04CC] # CYRILLIC SMALL LETTER KHAKASSIAN CHE 04CB ; [.1AFE.0020.0008.04CB] # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE 04B9 ; [.1B02.0020.0002.04B9] # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE 04B8 ; [.1B02.0020.0008.04B8] # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE A687 ; [.1B06.0020.0002.A687] # CYRILLIC SMALL LETTER CCHE A686 ; [.1B06.0020.0008.A686] # CYRILLIC CAPITAL LETTER CCHE 04BD ; [.1B07.0020.0002.04BD] # CYRILLIC SMALL LETTER ABKHASIAN CHE 04BC ; [.1B07.0020.0008.04BC] # CYRILLIC CAPITAL LETTER ABKHASIAN CHE 04BF ; [.1B0B.0020.0002.04BF] # CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER 04BE ; [.1B0B.0020.0008.04BE] # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER 045F ; [.1B0F.0020.0002.045F] # CYRILLIC SMALL LETTER DZHE 040F ; [.1B0F.0020.0008.040F] # CYRILLIC CAPITAL LETTER DZHE 0448 ; [.1B13.0020.0002.0448] # CYRILLIC SMALL LETTER SHA 2DF2 ; [.1B13.0020.0004.2DF2] # COMBINING CYRILLIC LETTER SHA 0428 ; [.1B13.0020.0008.0428] # CYRILLIC CAPITAL LETTER SHA A697 ; [.1B17.0020.0002.A697] # CYRILLIC SMALL LETTER SHWE A696 ; [.1B17.0020.0008.A696] # CYRILLIC CAPITAL LETTER SHWE 0449 ; [.1B18.0020.0002.0449] # CYRILLIC SMALL LETTER SHCHA 2DF3 ; [.1B18.0020.0004.2DF3] # COMBINING CYRILLIC LETTER SHCHA 0429 ; [.1B18.0020.0008.0429] # CYRILLIC CAPITAL LETTER SHCHA A64F ; [.1B1C.0020.0002.A64F] # CYRILLIC SMALL LETTER NEUTRAL YER A64E ; [.1B1C.0020.0008.A64E] # CYRILLIC CAPITAL LETTER NEUTRAL YER 2E2F ; [.1B1D.0020.0002.2E2F] # VERTICAL TILDE A67F ; [.1B1E.0020.0002.A67F] # CYRILLIC PAYEROK 044A ; [.1B1F.0020.0002.044A] # CYRILLIC SMALL LETTER HARD SIGN A678 ; [.1B1F.0020.0004.A678] # COMBINING CYRILLIC LETTER HARD SIGN 042A ; [.1B1F.0020.0008.042A] # CYRILLIC CAPITAL LETTER HARD SIGN A651 ; [.1B23.0020.0002.A651] # CYRILLIC SMALL LETTER YERU WITH BACK YER A650 ; [.1B23.0020.0008.A650] # CYRILLIC CAPITAL LETTER YERU WITH BACK YER 044B ; [.1B24.0020.0002.044B] # CYRILLIC SMALL LETTER YERU A679 ; [.1B24.0020.0004.A679] # COMBINING CYRILLIC LETTER YERU 042B ; [.1B24.0020.0008.042B] # CYRILLIC CAPITAL LETTER YERU 04F9 ; [.1B28.0020.0002.04F9] # CYRILLIC SMALL LETTER YERU WITH DIAERESIS 044B 0308 ; [.1B28.0020.0002.04F9] # CYRILLIC SMALL LETTER YERU WITH DIAERESIS 04F8 ; [.1B28.0020.0008.04F8] # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS 042B 0308 ; [.1B28.0020.0008.04F8] # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS 044C ; [.1B2C.0020.0002.044C] # CYRILLIC SMALL LETTER SOFT SIGN A67A ; [.1B2C.0020.0004.A67A] # COMBINING CYRILLIC LETTER SOFT SIGN 042C ; [.1B2C.0020.0008.042C] # CYRILLIC CAPITAL LETTER SOFT SIGN 048D ; [.1B30.0020.0002.048D] # CYRILLIC SMALL LETTER SEMISOFT SIGN 048C ; [.1B30.0020.0008.048C] # CYRILLIC CAPITAL LETTER SEMISOFT SIGN 0463 ; [.1B34.0020.0002.0463] # CYRILLIC SMALL LETTER YAT 2DFA ; [.1B34.0020.0004.2DFA] # COMBINING CYRILLIC LETTER YAT 0462 ; [.1B34.0020.0008.0462] # CYRILLIC CAPITAL LETTER YAT A653 ; [.1B38.0020.0002.A653] # CYRILLIC SMALL LETTER IOTIFIED YAT A652 ; [.1B38.0020.0008.A652] # CYRILLIC CAPITAL LETTER IOTIFIED YAT 044D ; [.1B39.0020.0002.044D] # CYRILLIC SMALL LETTER E 042D ; [.1B39.0020.0008.042D] # CYRILLIC CAPITAL LETTER E 04ED ; [.1B3D.0020.0002.04ED] # CYRILLIC SMALL LETTER E WITH DIAERESIS 044D 0308 ; [.1B3D.0020.0002.04ED] # CYRILLIC SMALL LETTER E WITH DIAERESIS 04EC ; [.1B3D.0020.0008.04EC] # CYRILLIC CAPITAL LETTER E WITH DIAERESIS 042D 0308 ; [.1B3D.0020.0008.04EC] # CYRILLIC CAPITAL LETTER E WITH DIAERESIS 044E ; [.1B41.0020.0002.044E] # CYRILLIC SMALL LETTER YU 2DFB ; [.1B41.0020.0004.2DFB] # COMBINING CYRILLIC LETTER YU 042E ; [.1B41.0020.0008.042E] # CYRILLIC CAPITAL LETTER YU A655 ; [.1B45.0020.0002.A655] # CYRILLIC SMALL LETTER REVERSED YU A654 ; [.1B45.0020.0008.A654] # CYRILLIC CAPITAL LETTER REVERSED YU A657 ; [.1B46.0020.0002.A657] # CYRILLIC SMALL LETTER IOTIFIED A 2DFC ; [.1B46.0020.0004.2DFC] # COMBINING CYRILLIC LETTER IOTIFIED A A656 ; [.1B46.0020.0008.A656] # CYRILLIC CAPITAL LETTER IOTIFIED A 044F ; [.1B47.0020.0002.044F] # CYRILLIC SMALL LETTER YA 042F ; [.1B47.0020.0008.042F] # CYRILLIC CAPITAL LETTER YA 0519 ; [.1B4B.0020.0002.0519] # CYRILLIC SMALL LETTER YAE 0518 ; [.1B4B.0020.0008.0518] # CYRILLIC CAPITAL LETTER YAE 0465 ; [.1B4C.0020.0002.0465] # CYRILLIC SMALL LETTER IOTIFIED E A69F ; [.1B4C.0020.0004.A69F] # COMBINING CYRILLIC LETTER IOTIFIED E 0464 ; [.1B4C.0020.0008.0464] # CYRILLIC CAPITAL LETTER IOTIFIED E 0467 ; [.1B50.0020.0002.0467] # CYRILLIC SMALL LETTER LITTLE YUS 2DFD ; [.1B50.0020.0004.2DFD] # COMBINING CYRILLIC LETTER LITTLE YUS 0466 ; [.1B50.0020.0008.0466] # CYRILLIC CAPITAL LETTER LITTLE YUS A659 ; [.1B54.0020.0002.A659] # CYRILLIC SMALL LETTER CLOSED LITTLE YUS A658 ; [.1B54.0020.0008.A658] # CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS 046B ; [.1B55.0020.0002.046B] # CYRILLIC SMALL LETTER BIG YUS 2DFE ; [.1B55.0020.0004.2DFE] # COMBINING CYRILLIC LETTER BIG YUS 046A ; [.1B55.0020.0008.046A] # CYRILLIC CAPITAL LETTER BIG YUS A65B ; [.1B59.0020.0002.A65B] # CYRILLIC SMALL LETTER BLENDED YUS A65A ; [.1B59.0020.0008.A65A] # CYRILLIC CAPITAL LETTER BLENDED YUS 0469 ; [.1B5A.0020.0002.0469] # CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS 0468 ; [.1B5A.0020.0008.0468] # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS A65D ; [.1B5E.0020.0002.A65D] # CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS A65C ; [.1B5E.0020.0008.A65C] # CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS 046D ; [.1B5F.0020.0002.046D] # CYRILLIC SMALL LETTER IOTIFIED BIG YUS 2DFF ; [.1B5F.0020.0004.2DFF] # COMBINING CYRILLIC LETTER IOTIFIED BIG YUS 046C ; [.1B5F.0020.0008.046C] # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS 046F ; [.1B63.0020.0002.046F] # CYRILLIC SMALL LETTER KSI 046E ; [.1B63.0020.0008.046E] # CYRILLIC CAPITAL LETTER KSI 0471 ; [.1B67.0020.0002.0471] # CYRILLIC SMALL LETTER PSI 0470 ; [.1B67.0020.0008.0470] # CYRILLIC CAPITAL LETTER PSI 0473 ; [.1B6B.0020.0002.0473] # CYRILLIC SMALL LETTER FITA 2DF4 ; [.1B6B.0020.0004.2DF4] # COMBINING CYRILLIC LETTER FITA 0472 ; [.1B6B.0020.0008.0472] # CYRILLIC CAPITAL LETTER FITA 0475 ; [.1B6F.0020.0002.0475] # CYRILLIC SMALL LETTER IZHITSA 0474 ; [.1B6F.0020.0008.0474] # CYRILLIC CAPITAL LETTER IZHITSA 0477 ; [.1B73.0020.0002.0477] # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT 0475 030F ; [.1B73.0020.0002.0477] # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT 0476 ; [.1B73.0020.0008.0476] # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT 0474 030F ; [.1B73.0020.0008.0476] # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT A65F ; [.1B77.0020.0002.A65F] # CYRILLIC SMALL LETTER YN A65E ; [.1B77.0020.0008.A65E] # CYRILLIC CAPITAL LETTER YN 04A9 ; [.1B78.0020.0002.04A9] # CYRILLIC SMALL LETTER ABKHASIAN HA 04A8 ; [.1B78.0020.0008.04A8] # CYRILLIC CAPITAL LETTER ABKHASIAN HA 051D ; [.1B7C.0020.0002.051D] # CYRILLIC SMALL LETTER WE 051C ; [.1B7C.0020.0008.051C] # CYRILLIC CAPITAL LETTER WE 04CF ; [.1B7D.0020.0002.04CF] # CYRILLIC SMALL LETTER PALOCHKA 04C0 ; [.1B7D.0020.0008.04C0] # CYRILLIC LETTER PALOCHKA 2C30 ; [.1B81.0020.0002.2C30] # GLAGOLITIC SMALL LETTER AZU 2C00 ; [.1B81.0020.0008.2C00] # GLAGOLITIC CAPITAL LETTER AZU 2C31 ; [.1B82.0020.0002.2C31] # GLAGOLITIC SMALL LETTER BUKY 2C01 ; [.1B82.0020.0008.2C01] # GLAGOLITIC CAPITAL LETTER BUKY 2C32 ; [.1B83.0020.0002.2C32] # GLAGOLITIC SMALL LETTER VEDE 2C02 ; [.1B83.0020.0008.2C02] # GLAGOLITIC CAPITAL LETTER VEDE 2C33 ; [.1B84.0020.0002.2C33] # GLAGOLITIC SMALL LETTER GLAGOLI 2C03 ; [.1B84.0020.0008.2C03] # GLAGOLITIC CAPITAL LETTER GLAGOLI 2C34 ; [.1B85.0020.0002.2C34] # GLAGOLITIC SMALL LETTER DOBRO 2C04 ; [.1B85.0020.0008.2C04] # GLAGOLITIC CAPITAL LETTER DOBRO 2C35 ; [.1B86.0020.0002.2C35] # GLAGOLITIC SMALL LETTER YESTU 2C05 ; [.1B86.0020.0008.2C05] # GLAGOLITIC CAPITAL LETTER YESTU 2C36 ; [.1B87.0020.0002.2C36] # GLAGOLITIC SMALL LETTER ZHIVETE 2C06 ; [.1B87.0020.0008.2C06] # GLAGOLITIC CAPITAL LETTER ZHIVETE 2C37 ; [.1B88.0020.0002.2C37] # GLAGOLITIC SMALL LETTER DZELO 2C07 ; [.1B88.0020.0008.2C07] # GLAGOLITIC CAPITAL LETTER DZELO 2C38 ; [.1B89.0020.0002.2C38] # GLAGOLITIC SMALL LETTER ZEMLJA 2C08 ; [.1B89.0020.0008.2C08] # GLAGOLITIC CAPITAL LETTER ZEMLJA 2C39 ; [.1B8A.0020.0002.2C39] # GLAGOLITIC SMALL LETTER IZHE 2C09 ; [.1B8A.0020.0008.2C09] # GLAGOLITIC CAPITAL LETTER IZHE 2C3A ; [.1B8B.0020.0002.2C3A] # GLAGOLITIC SMALL LETTER INITIAL IZHE 2C0A ; [.1B8B.0020.0008.2C0A] # GLAGOLITIC CAPITAL LETTER INITIAL IZHE 2C3B ; [.1B8C.0020.0002.2C3B] # GLAGOLITIC SMALL LETTER I 2C0B ; [.1B8C.0020.0008.2C0B] # GLAGOLITIC CAPITAL LETTER I 2C3C ; [.1B8D.0020.0002.2C3C] # GLAGOLITIC SMALL LETTER DJERVI 2C0C ; [.1B8D.0020.0008.2C0C] # GLAGOLITIC CAPITAL LETTER DJERVI 2C3D ; [.1B8E.0020.0002.2C3D] # GLAGOLITIC SMALL LETTER KAKO 2C0D ; [.1B8E.0020.0008.2C0D] # GLAGOLITIC CAPITAL LETTER KAKO 2C3E ; [.1B8F.0020.0002.2C3E] # GLAGOLITIC SMALL LETTER LJUDIJE 2C0E ; [.1B8F.0020.0008.2C0E] # GLAGOLITIC CAPITAL LETTER LJUDIJE 2C3F ; [.1B90.0020.0002.2C3F] # GLAGOLITIC SMALL LETTER MYSLITE 2C0F ; [.1B90.0020.0008.2C0F] # GLAGOLITIC CAPITAL LETTER MYSLITE 2C40 ; [.1B91.0020.0002.2C40] # GLAGOLITIC SMALL LETTER NASHI 2C10 ; [.1B91.0020.0008.2C10] # GLAGOLITIC CAPITAL LETTER NASHI 2C41 ; [.1B92.0020.0002.2C41] # GLAGOLITIC SMALL LETTER ONU 2C11 ; [.1B92.0020.0008.2C11] # GLAGOLITIC CAPITAL LETTER ONU 2C42 ; [.1B93.0020.0002.2C42] # GLAGOLITIC SMALL LETTER POKOJI 2C12 ; [.1B93.0020.0008.2C12] # GLAGOLITIC CAPITAL LETTER POKOJI 2C43 ; [.1B94.0020.0002.2C43] # GLAGOLITIC SMALL LETTER RITSI 2C13 ; [.1B94.0020.0008.2C13] # GLAGOLITIC CAPITAL LETTER RITSI 2C44 ; [.1B95.0020.0002.2C44] # GLAGOLITIC SMALL LETTER SLOVO 2C14 ; [.1B95.0020.0008.2C14] # GLAGOLITIC CAPITAL LETTER SLOVO 2C45 ; [.1B96.0020.0002.2C45] # GLAGOLITIC SMALL LETTER TVRIDO 2C15 ; [.1B96.0020.0008.2C15] # GLAGOLITIC CAPITAL LETTER TVRIDO 2C46 ; [.1B97.0020.0002.2C46] # GLAGOLITIC SMALL LETTER UKU 2C16 ; [.1B97.0020.0008.2C16] # GLAGOLITIC CAPITAL LETTER UKU 2C47 ; [.1B98.0020.0002.2C47] # GLAGOLITIC SMALL LETTER FRITU 2C17 ; [.1B98.0020.0008.2C17] # GLAGOLITIC CAPITAL LETTER FRITU 2C48 ; [.1B99.0020.0002.2C48] # GLAGOLITIC SMALL LETTER HERU 2C18 ; [.1B99.0020.0008.2C18] # GLAGOLITIC CAPITAL LETTER HERU 2C49 ; [.1B9A.0020.0002.2C49] # GLAGOLITIC SMALL LETTER OTU 2C19 ; [.1B9A.0020.0008.2C19] # GLAGOLITIC CAPITAL LETTER OTU 2C4A ; [.1B9B.0020.0002.2C4A] # GLAGOLITIC SMALL LETTER PE 2C1A ; [.1B9B.0020.0008.2C1A] # GLAGOLITIC CAPITAL LETTER PE 2C4B ; [.1B9C.0020.0002.2C4B] # GLAGOLITIC SMALL LETTER SHTA 2C1B ; [.1B9C.0020.0008.2C1B] # GLAGOLITIC CAPITAL LETTER SHTA 2C4C ; [.1B9D.0020.0002.2C4C] # GLAGOLITIC SMALL LETTER TSI 2C1C ; [.1B9D.0020.0008.2C1C] # GLAGOLITIC CAPITAL LETTER TSI 2C4D ; [.1B9E.0020.0002.2C4D] # GLAGOLITIC SMALL LETTER CHRIVI 2C1D ; [.1B9E.0020.0008.2C1D] # GLAGOLITIC CAPITAL LETTER CHRIVI 2C4E ; [.1B9F.0020.0002.2C4E] # GLAGOLITIC SMALL LETTER SHA 2C1E ; [.1B9F.0020.0008.2C1E] # GLAGOLITIC CAPITAL LETTER SHA 2C4F ; [.1BA0.0020.0002.2C4F] # GLAGOLITIC SMALL LETTER YERU 2C1F ; [.1BA0.0020.0008.2C1F] # GLAGOLITIC CAPITAL LETTER YERU 2C50 ; [.1BA1.0020.0002.2C50] # GLAGOLITIC SMALL LETTER YERI 2C20 ; [.1BA1.0020.0008.2C20] # GLAGOLITIC CAPITAL LETTER YERI 2C51 ; [.1BA2.0020.0002.2C51] # GLAGOLITIC SMALL LETTER YATI 2C21 ; [.1BA2.0020.0008.2C21] # GLAGOLITIC CAPITAL LETTER YATI 2C52 ; [.1BA3.0020.0002.2C52] # GLAGOLITIC SMALL LETTER SPIDERY HA 2C22 ; [.1BA3.0020.0008.2C22] # GLAGOLITIC CAPITAL LETTER SPIDERY HA 2C53 ; [.1BA4.0020.0002.2C53] # GLAGOLITIC SMALL LETTER YU 2C23 ; [.1BA4.0020.0008.2C23] # GLAGOLITIC CAPITAL LETTER YU 2C54 ; [.1BA5.0020.0002.2C54] # GLAGOLITIC SMALL LETTER SMALL YUS 2C24 ; [.1BA5.0020.0008.2C24] # GLAGOLITIC CAPITAL LETTER SMALL YUS 2C55 ; [.1BA6.0020.0002.2C55] # GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL 2C25 ; [.1BA6.0020.0008.2C25] # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL 2C56 ; [.1BA7.0020.0002.2C56] # GLAGOLITIC SMALL LETTER YO 2C26 ; [.1BA7.0020.0008.2C26] # GLAGOLITIC CAPITAL LETTER YO 2C57 ; [.1BA8.0020.0002.2C57] # GLAGOLITIC SMALL LETTER IOTATED SMALL YUS 2C27 ; [.1BA8.0020.0008.2C27] # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS 2C58 ; [.1BA9.0020.0002.2C58] # GLAGOLITIC SMALL LETTER BIG YUS 2C28 ; [.1BA9.0020.0008.2C28] # GLAGOLITIC CAPITAL LETTER BIG YUS 2C59 ; [.1BAA.0020.0002.2C59] # GLAGOLITIC SMALL LETTER IOTATED BIG YUS 2C29 ; [.1BAA.0020.0008.2C29] # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS 2C5A ; [.1BAB.0020.0002.2C5A] # GLAGOLITIC SMALL LETTER FITA 2C2A ; [.1BAB.0020.0008.2C2A] # GLAGOLITIC CAPITAL LETTER FITA 2C5B ; [.1BAC.0020.0002.2C5B] # GLAGOLITIC SMALL LETTER IZHITSA 2C2B ; [.1BAC.0020.0008.2C2B] # GLAGOLITIC CAPITAL LETTER IZHITSA 2C5C ; [.1BAD.0020.0002.2C5C] # GLAGOLITIC SMALL LETTER SHTAPIC 2C2C ; [.1BAD.0020.0008.2C2C] # GLAGOLITIC CAPITAL LETTER SHTAPIC 2C5D ; [.1BAE.0020.0002.2C5D] # GLAGOLITIC SMALL LETTER TROKUTASTI A 2C2D ; [.1BAE.0020.0008.2C2D] # GLAGOLITIC CAPITAL LETTER TROKUTASTI A 2C5E ; [.1BAF.0020.0002.2C5E] # GLAGOLITIC SMALL LETTER LATINATE MYSLITE 2C2E ; [.1BAF.0020.0008.2C2E] # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE 10D0 ; [.1BB0.0020.0002.10D0] # GEORGIAN LETTER AN 2D00 ; [.1BB1.0020.0002.2D00] # GEORGIAN SMALL LETTER AN 10A0 ; [.1BB1.0020.0008.10A0] # GEORGIAN CAPITAL LETTER AN 10D1 ; [.1BB2.0020.0002.10D1] # GEORGIAN LETTER BAN 2D01 ; [.1BB3.0020.0002.2D01] # GEORGIAN SMALL LETTER BAN 10A1 ; [.1BB3.0020.0008.10A1] # GEORGIAN CAPITAL LETTER BAN 10D2 ; [.1BB4.0020.0002.10D2] # GEORGIAN LETTER GAN 2D02 ; [.1BB5.0020.0002.2D02] # GEORGIAN SMALL LETTER GAN 10A2 ; [.1BB5.0020.0008.10A2] # GEORGIAN CAPITAL LETTER GAN 10D3 ; [.1BB6.0020.0002.10D3] # GEORGIAN LETTER DON 2D03 ; [.1BB7.0020.0002.2D03] # GEORGIAN SMALL LETTER DON 10A3 ; [.1BB7.0020.0008.10A3] # GEORGIAN CAPITAL LETTER DON 10D4 ; [.1BB8.0020.0002.10D4] # GEORGIAN LETTER EN 2D04 ; [.1BB9.0020.0002.2D04] # GEORGIAN SMALL LETTER EN 10A4 ; [.1BB9.0020.0008.10A4] # GEORGIAN CAPITAL LETTER EN 10D5 ; [.1BBA.0020.0002.10D5] # GEORGIAN LETTER VIN 2D05 ; [.1BBB.0020.0002.2D05] # GEORGIAN SMALL LETTER VIN 10A5 ; [.1BBB.0020.0008.10A5] # GEORGIAN CAPITAL LETTER VIN 10D6 ; [.1BBC.0020.0002.10D6] # GEORGIAN LETTER ZEN 2D06 ; [.1BBD.0020.0002.2D06] # GEORGIAN SMALL LETTER ZEN 10A6 ; [.1BBD.0020.0008.10A6] # GEORGIAN CAPITAL LETTER ZEN 10F1 ; [.1BBE.0020.0002.10F1] # GEORGIAN LETTER HE 2D21 ; [.1BBF.0020.0002.2D21] # GEORGIAN SMALL LETTER HE 10C1 ; [.1BBF.0020.0008.10C1] # GEORGIAN CAPITAL LETTER HE 10D7 ; [.1BC0.0020.0002.10D7] # GEORGIAN LETTER TAN 2D07 ; [.1BC1.0020.0002.2D07] # GEORGIAN SMALL LETTER TAN 10A7 ; [.1BC1.0020.0008.10A7] # GEORGIAN CAPITAL LETTER TAN 10D8 ; [.1BC2.0020.0002.10D8] # GEORGIAN LETTER IN 2D08 ; [.1BC3.0020.0002.2D08] # GEORGIAN SMALL LETTER IN 10A8 ; [.1BC3.0020.0008.10A8] # GEORGIAN CAPITAL LETTER IN 10D9 ; [.1BC4.0020.0002.10D9] # GEORGIAN LETTER KAN 2D09 ; [.1BC5.0020.0002.2D09] # GEORGIAN SMALL LETTER KAN 10A9 ; [.1BC5.0020.0008.10A9] # GEORGIAN CAPITAL LETTER KAN 10DA ; [.1BC6.0020.0002.10DA] # GEORGIAN LETTER LAS 2D0A ; [.1BC7.0020.0002.2D0A] # GEORGIAN SMALL LETTER LAS 10AA ; [.1BC7.0020.0008.10AA] # GEORGIAN CAPITAL LETTER LAS 10DB ; [.1BC8.0020.0002.10DB] # GEORGIAN LETTER MAN 2D0B ; [.1BC9.0020.0002.2D0B] # GEORGIAN SMALL LETTER MAN 10AB ; [.1BC9.0020.0008.10AB] # GEORGIAN CAPITAL LETTER MAN 10DC ; [.1BCA.0020.0002.10DC] # GEORGIAN LETTER NAR 10FC ; [.1BCA.0020.0014.10FC] # MODIFIER LETTER GEORGIAN NAR 2D0C ; [.1BCB.0020.0002.2D0C] # GEORGIAN SMALL LETTER NAR 10AC ; [.1BCB.0020.0008.10AC] # GEORGIAN CAPITAL LETTER NAR 10F2 ; [.1BCC.0020.0002.10F2] # GEORGIAN LETTER HIE 2D22 ; [.1BCD.0020.0002.2D22] # GEORGIAN SMALL LETTER HIE 10C2 ; [.1BCD.0020.0008.10C2] # GEORGIAN CAPITAL LETTER HIE 10DD ; [.1BCE.0020.0002.10DD] # GEORGIAN LETTER ON 2D0D ; [.1BCF.0020.0002.2D0D] # GEORGIAN SMALL LETTER ON 10AD ; [.1BCF.0020.0008.10AD] # GEORGIAN CAPITAL LETTER ON 10DE ; [.1BD0.0020.0002.10DE] # GEORGIAN LETTER PAR 2D0E ; [.1BD1.0020.0002.2D0E] # GEORGIAN SMALL LETTER PAR 10AE ; [.1BD1.0020.0008.10AE] # GEORGIAN CAPITAL LETTER PAR 10DF ; [.1BD2.0020.0002.10DF] # GEORGIAN LETTER ZHAR 2D0F ; [.1BD3.0020.0002.2D0F] # GEORGIAN SMALL LETTER ZHAR 10AF ; [.1BD3.0020.0008.10AF] # GEORGIAN CAPITAL LETTER ZHAR 10E0 ; [.1BD4.0020.0002.10E0] # GEORGIAN LETTER RAE 2D10 ; [.1BD5.0020.0002.2D10] # GEORGIAN SMALL LETTER RAE 10B0 ; [.1BD5.0020.0008.10B0] # GEORGIAN CAPITAL LETTER RAE 10E1 ; [.1BD6.0020.0002.10E1] # GEORGIAN LETTER SAN 2D11 ; [.1BD7.0020.0002.2D11] # GEORGIAN SMALL LETTER SAN 10B1 ; [.1BD7.0020.0008.10B1] # GEORGIAN CAPITAL LETTER SAN 10E2 ; [.1BD8.0020.0002.10E2] # GEORGIAN LETTER TAR 2D12 ; [.1BD9.0020.0002.2D12] # GEORGIAN SMALL LETTER TAR 10B2 ; [.1BD9.0020.0008.10B2] # GEORGIAN CAPITAL LETTER TAR 10F3 ; [.1BDA.0020.0002.10F3] # GEORGIAN LETTER WE 2D23 ; [.1BDB.0020.0002.2D23] # GEORGIAN SMALL LETTER WE 10C3 ; [.1BDB.0020.0008.10C3] # GEORGIAN CAPITAL LETTER WE 10E3 ; [.1BDC.0020.0002.10E3] # GEORGIAN LETTER UN 2D13 ; [.1BDD.0020.0002.2D13] # GEORGIAN SMALL LETTER UN 10B3 ; [.1BDD.0020.0008.10B3] # GEORGIAN CAPITAL LETTER UN 10E4 ; [.1BDE.0020.0002.10E4] # GEORGIAN LETTER PHAR 2D14 ; [.1BDF.0020.0002.2D14] # GEORGIAN SMALL LETTER PHAR 10B4 ; [.1BDF.0020.0008.10B4] # GEORGIAN CAPITAL LETTER PHAR 10E5 ; [.1BE0.0020.0002.10E5] # GEORGIAN LETTER KHAR 2D15 ; [.1BE1.0020.0002.2D15] # GEORGIAN SMALL LETTER KHAR 10B5 ; [.1BE1.0020.0008.10B5] # GEORGIAN CAPITAL LETTER KHAR 10E6 ; [.1BE2.0020.0002.10E6] # GEORGIAN LETTER GHAN 2D16 ; [.1BE3.0020.0002.2D16] # GEORGIAN SMALL LETTER GHAN 10B6 ; [.1BE3.0020.0008.10B6] # GEORGIAN CAPITAL LETTER GHAN 10E7 ; [.1BE4.0020.0002.10E7] # GEORGIAN LETTER QAR 2D17 ; [.1BE5.0020.0002.2D17] # GEORGIAN SMALL LETTER QAR 10B7 ; [.1BE5.0020.0008.10B7] # GEORGIAN CAPITAL LETTER QAR 10E8 ; [.1BE6.0020.0002.10E8] # GEORGIAN LETTER SHIN 2D18 ; [.1BE7.0020.0002.2D18] # GEORGIAN SMALL LETTER SHIN 10B8 ; [.1BE7.0020.0008.10B8] # GEORGIAN CAPITAL LETTER SHIN 10E9 ; [.1BE8.0020.0002.10E9] # GEORGIAN LETTER CHIN 2D19 ; [.1BE9.0020.0002.2D19] # GEORGIAN SMALL LETTER CHIN 10B9 ; [.1BE9.0020.0008.10B9] # GEORGIAN CAPITAL LETTER CHIN 10EA ; [.1BEA.0020.0002.10EA] # GEORGIAN LETTER CAN 2D1A ; [.1BEB.0020.0002.2D1A] # GEORGIAN SMALL LETTER CAN 10BA ; [.1BEB.0020.0008.10BA] # GEORGIAN CAPITAL LETTER CAN 10EB ; [.1BEC.0020.0002.10EB] # GEORGIAN LETTER JIL 2D1B ; [.1BED.0020.0002.2D1B] # GEORGIAN SMALL LETTER JIL 10BB ; [.1BED.0020.0008.10BB] # GEORGIAN CAPITAL LETTER JIL 10EC ; [.1BEE.0020.0002.10EC] # GEORGIAN LETTER CIL 2D1C ; [.1BEF.0020.0002.2D1C] # GEORGIAN SMALL LETTER CIL 10BC ; [.1BEF.0020.0008.10BC] # GEORGIAN CAPITAL LETTER CIL 10ED ; [.1BF0.0020.0002.10ED] # GEORGIAN LETTER CHAR 2D1D ; [.1BF1.0020.0002.2D1D] # GEORGIAN SMALL LETTER CHAR 10BD ; [.1BF1.0020.0008.10BD] # GEORGIAN CAPITAL LETTER CHAR 10EE ; [.1BF2.0020.0002.10EE] # GEORGIAN LETTER XAN 2D1E ; [.1BF3.0020.0002.2D1E] # GEORGIAN SMALL LETTER XAN 10BE ; [.1BF3.0020.0008.10BE] # GEORGIAN CAPITAL LETTER XAN 10F4 ; [.1BF4.0020.0002.10F4] # GEORGIAN LETTER HAR 2D24 ; [.1BF5.0020.0002.2D24] # GEORGIAN SMALL LETTER HAR 10C4 ; [.1BF5.0020.0008.10C4] # GEORGIAN CAPITAL LETTER HAR 10EF ; [.1BF6.0020.0002.10EF] # GEORGIAN LETTER JHAN 2D1F ; [.1BF7.0020.0002.2D1F] # GEORGIAN SMALL LETTER JHAN 10BF ; [.1BF7.0020.0008.10BF] # GEORGIAN CAPITAL LETTER JHAN 10F0 ; [.1BF8.0020.0002.10F0] # GEORGIAN LETTER HAE 2D20 ; [.1BF9.0020.0002.2D20] # GEORGIAN SMALL LETTER HAE 10C0 ; [.1BF9.0020.0008.10C0] # GEORGIAN CAPITAL LETTER HAE 10F5 ; [.1BFA.0020.0002.10F5] # GEORGIAN LETTER HOE 2D25 ; [.1BFB.0020.0002.2D25] # GEORGIAN SMALL LETTER HOE 10C5 ; [.1BFB.0020.0008.10C5] # GEORGIAN CAPITAL LETTER HOE 10F6 ; [.1BFC.0020.0002.10F6] # GEORGIAN LETTER FI 10F7 ; [.1BFD.0020.0002.10F7] # GEORGIAN LETTER YN 2D27 ; [.1BFE.0020.0002.2D27] # GEORGIAN SMALL LETTER YN 10C7 ; [.1BFE.0020.0008.10C7] # GEORGIAN CAPITAL LETTER YN 10F8 ; [.1BFF.0020.0002.10F8] # GEORGIAN LETTER ELIFI 10F9 ; [.1C00.0020.0002.10F9] # GEORGIAN LETTER TURNED GAN 10FA ; [.1C01.0020.0002.10FA] # GEORGIAN LETTER AIN 10FD ; [.1C02.0020.0002.10FD] # GEORGIAN LETTER AEN 2D2D ; [.1C03.0020.0002.2D2D] # GEORGIAN SMALL LETTER AEN 10CD ; [.1C03.0020.0008.10CD] # GEORGIAN CAPITAL LETTER AEN 10FE ; [.1C04.0020.0002.10FE] # GEORGIAN LETTER HARD SIGN 10FF ; [.1C05.0020.0002.10FF] # GEORGIAN LETTER LABIAL SIGN 0561 ; [.1C06.0020.0002.0561] # ARMENIAN SMALL LETTER AYB 0531 ; [.1C06.0020.0008.0531] # ARMENIAN CAPITAL LETTER AYB 0562 ; [.1C07.0020.0002.0562] # ARMENIAN SMALL LETTER BEN 0532 ; [.1C07.0020.0008.0532] # ARMENIAN CAPITAL LETTER BEN 0563 ; [.1C08.0020.0002.0563] # ARMENIAN SMALL LETTER GIM 0533 ; [.1C08.0020.0008.0533] # ARMENIAN CAPITAL LETTER GIM 0564 ; [.1C09.0020.0002.0564] # ARMENIAN SMALL LETTER DA 0534 ; [.1C09.0020.0008.0534] # ARMENIAN CAPITAL LETTER DA 0565 ; [.1C0A.0020.0002.0565] # ARMENIAN SMALL LETTER ECH 0535 ; [.1C0A.0020.0008.0535] # ARMENIAN CAPITAL LETTER ECH 0587 ; [.1C0A.0020.0004.0587][.1C27.0020.0004.0587] # ARMENIAN SMALL LIGATURE ECH YIWN 0566 ; [.1C0B.0020.0002.0566] # ARMENIAN SMALL LETTER ZA 0536 ; [.1C0B.0020.0008.0536] # ARMENIAN CAPITAL LETTER ZA 0567 ; [.1C0C.0020.0002.0567] # ARMENIAN SMALL LETTER EH 0537 ; [.1C0C.0020.0008.0537] # ARMENIAN CAPITAL LETTER EH 0568 ; [.1C0D.0020.0002.0568] # ARMENIAN SMALL LETTER ET 0538 ; [.1C0D.0020.0008.0538] # ARMENIAN CAPITAL LETTER ET 0569 ; [.1C0E.0020.0002.0569] # ARMENIAN SMALL LETTER TO 0539 ; [.1C0E.0020.0008.0539] # ARMENIAN CAPITAL LETTER TO 056A ; [.1C0F.0020.0002.056A] # ARMENIAN SMALL LETTER ZHE 053A ; [.1C0F.0020.0008.053A] # ARMENIAN CAPITAL LETTER ZHE 056B ; [.1C10.0020.0002.056B] # ARMENIAN SMALL LETTER INI 053B ; [.1C10.0020.0008.053B] # ARMENIAN CAPITAL LETTER INI 056C ; [.1C11.0020.0002.056C] # ARMENIAN SMALL LETTER LIWN 053C ; [.1C11.0020.0008.053C] # ARMENIAN CAPITAL LETTER LIWN 056D ; [.1C12.0020.0002.056D] # ARMENIAN SMALL LETTER XEH 053D ; [.1C12.0020.0008.053D] # ARMENIAN CAPITAL LETTER XEH 056E ; [.1C13.0020.0002.056E] # ARMENIAN SMALL LETTER CA 053E ; [.1C13.0020.0008.053E] # ARMENIAN CAPITAL LETTER CA 056F ; [.1C14.0020.0002.056F] # ARMENIAN SMALL LETTER KEN 053F ; [.1C14.0020.0008.053F] # ARMENIAN CAPITAL LETTER KEN 0570 ; [.1C15.0020.0002.0570] # ARMENIAN SMALL LETTER HO 0540 ; [.1C15.0020.0008.0540] # ARMENIAN CAPITAL LETTER HO 0571 ; [.1C16.0020.0002.0571] # ARMENIAN SMALL LETTER JA 0541 ; [.1C16.0020.0008.0541] # ARMENIAN CAPITAL LETTER JA 0572 ; [.1C17.0020.0002.0572] # ARMENIAN SMALL LETTER GHAD 0542 ; [.1C17.0020.0008.0542] # ARMENIAN CAPITAL LETTER GHAD 0573 ; [.1C18.0020.0002.0573] # ARMENIAN SMALL LETTER CHEH 0543 ; [.1C18.0020.0008.0543] # ARMENIAN CAPITAL LETTER CHEH 0574 ; [.1C19.0020.0002.0574] # ARMENIAN SMALL LETTER MEN 0544 ; [.1C19.0020.0008.0544] # ARMENIAN CAPITAL LETTER MEN FB14 ; [.1C19.0020.0004.FB14][.1C0A.0020.0004.FB14] # ARMENIAN SMALL LIGATURE MEN ECH FB15 ; [.1C19.0020.0004.FB15][.1C10.0020.0004.FB15] # ARMENIAN SMALL LIGATURE MEN INI FB17 ; [.1C19.0020.0004.FB17][.1C12.0020.0004.FB17] # ARMENIAN SMALL LIGATURE MEN XEH FB13 ; [.1C19.0020.0004.FB13][.1C1B.0020.0004.FB13] # ARMENIAN SMALL LIGATURE MEN NOW 0575 ; [.1C1A.0020.0002.0575] # ARMENIAN SMALL LETTER YI 0545 ; [.1C1A.0020.0008.0545] # ARMENIAN CAPITAL LETTER YI 0576 ; [.1C1B.0020.0002.0576] # ARMENIAN SMALL LETTER NOW 0546 ; [.1C1B.0020.0008.0546] # ARMENIAN CAPITAL LETTER NOW 0577 ; [.1C1C.0020.0002.0577] # ARMENIAN SMALL LETTER SHA 0547 ; [.1C1C.0020.0008.0547] # ARMENIAN CAPITAL LETTER SHA 0578 ; [.1C1D.0020.0002.0578] # ARMENIAN SMALL LETTER VO 0548 ; [.1C1D.0020.0008.0548] # ARMENIAN CAPITAL LETTER VO 0579 ; [.1C1E.0020.0002.0579] # ARMENIAN SMALL LETTER CHA 0549 ; [.1C1E.0020.0008.0549] # ARMENIAN CAPITAL LETTER CHA 057A ; [.1C1F.0020.0002.057A] # ARMENIAN SMALL LETTER PEH 054A ; [.1C1F.0020.0008.054A] # ARMENIAN CAPITAL LETTER PEH 057B ; [.1C20.0020.0002.057B] # ARMENIAN SMALL LETTER JHEH 054B ; [.1C20.0020.0008.054B] # ARMENIAN CAPITAL LETTER JHEH 057C ; [.1C21.0020.0002.057C] # ARMENIAN SMALL LETTER RA 054C ; [.1C21.0020.0008.054C] # ARMENIAN CAPITAL LETTER RA 057D ; [.1C22.0020.0002.057D] # ARMENIAN SMALL LETTER SEH 054D ; [.1C22.0020.0008.054D] # ARMENIAN CAPITAL LETTER SEH 057E ; [.1C23.0020.0002.057E] # ARMENIAN SMALL LETTER VEW 054E ; [.1C23.0020.0008.054E] # ARMENIAN CAPITAL LETTER VEW FB16 ; [.1C23.0020.0004.FB16][.1C1B.0020.0004.FB16] # ARMENIAN SMALL LIGATURE VEW NOW 057F ; [.1C24.0020.0002.057F] # ARMENIAN SMALL LETTER TIWN 054F ; [.1C24.0020.0008.054F] # ARMENIAN CAPITAL LETTER TIWN 0580 ; [.1C25.0020.0002.0580] # ARMENIAN SMALL LETTER REH 0550 ; [.1C25.0020.0008.0550] # ARMENIAN CAPITAL LETTER REH 0581 ; [.1C26.0020.0002.0581] # ARMENIAN SMALL LETTER CO 0551 ; [.1C26.0020.0008.0551] # ARMENIAN CAPITAL LETTER CO 0582 ; [.1C27.0020.0002.0582] # ARMENIAN SMALL LETTER YIWN 0552 ; [.1C27.0020.0008.0552] # ARMENIAN CAPITAL LETTER YIWN 0583 ; [.1C28.0020.0002.0583] # ARMENIAN SMALL LETTER PIWR 0553 ; [.1C28.0020.0008.0553] # ARMENIAN CAPITAL LETTER PIWR 0584 ; [.1C29.0020.0002.0584] # ARMENIAN SMALL LETTER KEH 0554 ; [.1C29.0020.0008.0554] # ARMENIAN CAPITAL LETTER KEH 0585 ; [.1C2A.0020.0002.0585] # ARMENIAN SMALL LETTER OH 0555 ; [.1C2A.0020.0008.0555] # ARMENIAN CAPITAL LETTER OH 0586 ; [.1C2B.0020.0002.0586] # ARMENIAN SMALL LETTER FEH 0556 ; [.1C2B.0020.0008.0556] # ARMENIAN CAPITAL LETTER FEH 0559 ; [.1C2C.0020.0002.0559] # ARMENIAN MODIFIER LETTER LEFT HALF RING 05D0 ; [.1C2D.0020.0002.05D0] # HEBREW LETTER ALEF 2135 ; [.1C2D.0020.0004.2135] # ALEF SYMBOL FB21 ; [.1C2D.0020.0005.FB21] # HEBREW LETTER WIDE ALEF FB2E ; [.1C2D.0020.0002.05D0][.0000.008C.0002.05B7] # HEBREW LETTER ALEF WITH PATAH FB2F ; [.1C2D.0020.0002.05D0][.0000.008D.0002.05B8] # HEBREW LETTER ALEF WITH QAMATS FB30 ; [.1C2D.0020.0002.05D0][.0000.0092.0002.05BC] # HEBREW LETTER ALEF WITH MAPIQ FB4F ; [.1C2D.0020.0004.FB4F][.1C38.0020.0004.FB4F] # HEBREW LIGATURE ALEF LAMED 05D1 ; [.1C2E.0020.0002.05D1] # HEBREW LETTER BET 2136 ; [.1C2E.0020.0004.2136] # BET SYMBOL FB31 ; [.1C2E.0020.0002.05D1][.0000.0092.0002.05BC] # HEBREW LETTER BET WITH DAGESH FB4C ; [.1C2E.0020.0002.05D1][.0000.0095.0002.05BF] # HEBREW LETTER BET WITH RAFE 05D2 ; [.1C2F.0020.0002.05D2] # HEBREW LETTER GIMEL 2137 ; [.1C2F.0020.0004.2137] # GIMEL SYMBOL FB32 ; [.1C2F.0020.0002.05D2][.0000.0092.0002.05BC] # HEBREW LETTER GIMEL WITH DAGESH 05D3 ; [.1C30.0020.0002.05D3] # HEBREW LETTER DALET 2138 ; [.1C30.0020.0004.2138] # DALET SYMBOL FB22 ; [.1C30.0020.0005.FB22] # HEBREW LETTER WIDE DALET FB33 ; [.1C30.0020.0002.05D3][.0000.0092.0002.05BC] # HEBREW LETTER DALET WITH DAGESH 05D4 ; [.1C31.0020.0002.05D4] # HEBREW LETTER HE FB23 ; [.1C31.0020.0005.FB23] # HEBREW LETTER WIDE HE FB34 ; [.1C31.0020.0002.05D4][.0000.0092.0002.05BC] # HEBREW LETTER HE WITH MAPIQ 05D5 ; [.1C32.0020.0002.05D5] # HEBREW LETTER VAV FB4B ; [.1C32.0020.0002.05D5][.0000.008E.0002.05B9] # HEBREW LETTER VAV WITH HOLAM FB35 ; [.1C32.0020.0002.05D5][.0000.0092.0002.05BC] # HEBREW LETTER VAV WITH DAGESH 05F0 ; [.1C32.0020.0004.05F0][.1C32.0020.0004.05F0] # HEBREW LIGATURE YIDDISH DOUBLE VAV 05F1 ; [.1C32.0020.0004.05F1][.1C36.0020.0004.05F1] # HEBREW LIGATURE YIDDISH VAV YOD 05D6 ; [.1C33.0020.0002.05D6] # HEBREW LETTER ZAYIN FB36 ; [.1C33.0020.0002.05D6][.0000.0092.0002.05BC] # HEBREW LETTER ZAYIN WITH DAGESH 05D7 ; [.1C34.0020.0002.05D7] # HEBREW LETTER HET 05D8 ; [.1C35.0020.0002.05D8] # HEBREW LETTER TET FB38 ; [.1C35.0020.0002.05D8][.0000.0092.0002.05BC] # HEBREW LETTER TET WITH DAGESH 05D9 ; [.1C36.0020.0002.05D9] # HEBREW LETTER YOD FB1D ; [.1C36.0020.0002.05D9][.0000.0089.0002.05B4] # HEBREW LETTER YOD WITH HIRIQ FB39 ; [.1C36.0020.0002.05D9][.0000.0092.0002.05BC] # HEBREW LETTER YOD WITH DAGESH 05F2 ; [.1C36.0020.0004.05F2][.1C36.0020.0004.05F2] # HEBREW LIGATURE YIDDISH DOUBLE YOD FB1F ; [.1C36.0020.0004.FB1F][.1C36.0020.0004.FB1F][.0000.008C.0002.FB1F] # HEBREW LIGATURE YIDDISH YOD YOD PATAH 05DB ; [.1C37.0020.0002.05DB] # HEBREW LETTER KAF FB24 ; [.1C37.0020.0005.FB24] # HEBREW LETTER WIDE KAF 05DA ; [.1C37.0020.0019.05DA] # HEBREW LETTER FINAL KAF FB3B ; [.1C37.0020.0002.05DB][.0000.0092.0002.05BC] # HEBREW LETTER KAF WITH DAGESH FB3A ; [.1C37.0020.0019.FB3A][.0000.0092.0002.FB3A] # HEBREW LETTER FINAL KAF WITH DAGESH FB4D ; [.1C37.0020.0002.05DB][.0000.0095.0002.05BF] # HEBREW LETTER KAF WITH RAFE 05DC ; [.1C38.0020.0002.05DC] # HEBREW LETTER LAMED FB25 ; [.1C38.0020.0005.FB25] # HEBREW LETTER WIDE LAMED FB3C ; [.1C38.0020.0002.05DC][.0000.0092.0002.05BC] # HEBREW LETTER LAMED WITH DAGESH 05DE ; [.1C39.0020.0002.05DE] # HEBREW LETTER MEM FB26 ; [.1C39.0020.0005.FB26] # HEBREW LETTER WIDE FINAL MEM 05DD ; [.1C39.0020.0019.05DD] # HEBREW LETTER FINAL MEM FB3E ; [.1C39.0020.0002.05DE][.0000.0092.0002.05BC] # HEBREW LETTER MEM WITH DAGESH 05E0 ; [.1C3A.0020.0002.05E0] # HEBREW LETTER NUN 05DF ; [.1C3A.0020.0019.05DF] # HEBREW LETTER FINAL NUN FB40 ; [.1C3A.0020.0002.05E0][.0000.0092.0002.05BC] # HEBREW LETTER NUN WITH DAGESH 05E1 ; [.1C3B.0020.0002.05E1] # HEBREW LETTER SAMEKH FB41 ; [.1C3B.0020.0002.05E1][.0000.0092.0002.05BC] # HEBREW LETTER SAMEKH WITH DAGESH 05E2 ; [.1C3C.0020.0002.05E2] # HEBREW LETTER AYIN FB20 ; [.1C3C.0020.0005.FB20] # HEBREW LETTER ALTERNATIVE AYIN 05E4 ; [.1C3D.0020.0002.05E4] # HEBREW LETTER PE 05E3 ; [.1C3D.0020.0019.05E3] # HEBREW LETTER FINAL PE FB44 ; [.1C3D.0020.0002.05E4][.0000.0092.0002.05BC] # HEBREW LETTER PE WITH DAGESH FB43 ; [.1C3D.0020.0019.FB43][.0000.0092.0002.FB43] # HEBREW LETTER FINAL PE WITH DAGESH FB4E ; [.1C3D.0020.0002.05E4][.0000.0095.0002.05BF] # HEBREW LETTER PE WITH RAFE 05E6 ; [.1C3E.0020.0002.05E6] # HEBREW LETTER TSADI 05E5 ; [.1C3E.0020.0019.05E5] # HEBREW LETTER FINAL TSADI FB46 ; [.1C3E.0020.0002.05E6][.0000.0092.0002.05BC] # HEBREW LETTER TSADI WITH DAGESH 05E7 ; [.1C3F.0020.0002.05E7] # HEBREW LETTER QOF FB47 ; [.1C3F.0020.0002.05E7][.0000.0092.0002.05BC] # HEBREW LETTER QOF WITH DAGESH 05E8 ; [.1C40.0020.0002.05E8] # HEBREW LETTER RESH FB27 ; [.1C40.0020.0005.FB27] # HEBREW LETTER WIDE RESH FB48 ; [.1C40.0020.0002.05E8][.0000.0092.0002.05BC] # HEBREW LETTER RESH WITH DAGESH 05E9 ; [.1C41.0020.0002.05E9] # HEBREW LETTER SHIN FB2B ; [.1C41.0020.0002.05E9][.0000.0090.0002.05C2] # HEBREW LETTER SHIN WITH SIN DOT FB2A ; [.1C41.0020.0002.05E9][.0000.0091.0002.05C1] # HEBREW LETTER SHIN WITH SHIN DOT FB49 ; [.1C41.0020.0002.05E9][.0000.0092.0002.05BC] # HEBREW LETTER SHIN WITH DAGESH FB2D ; [.1C41.0020.0002.05E9][.0000.0092.0002.05BC][.0000.0090.0002.05C2] # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT FB2C ; [.1C41.0020.0002.05E9][.0000.0092.0002.05BC][.0000.0091.0002.05C1] # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT 05EA ; [.1C42.0020.0002.05EA] # HEBREW LETTER TAV FB28 ; [.1C42.0020.0005.FB28] # HEBREW LETTER WIDE TAV FB4A ; [.1C42.0020.0002.05EA][.0000.0092.0002.05BC] # HEBREW LETTER TAV WITH DAGESH 10900 ; [.1C43.0020.0002.10900] # PHOENICIAN LETTER ALF 10901 ; [.1C44.0020.0002.10901] # PHOENICIAN LETTER BET 10902 ; [.1C45.0020.0002.10902] # PHOENICIAN LETTER GAML 10903 ; [.1C46.0020.0002.10903] # PHOENICIAN LETTER DELT 10904 ; [.1C47.0020.0002.10904] # PHOENICIAN LETTER HE 10905 ; [.1C48.0020.0002.10905] # PHOENICIAN LETTER WAU 10906 ; [.1C49.0020.0002.10906] # PHOENICIAN LETTER ZAI 10907 ; [.1C4A.0020.0002.10907] # PHOENICIAN LETTER HET 10908 ; [.1C4B.0020.0002.10908] # PHOENICIAN LETTER TET 10909 ; [.1C4C.0020.0002.10909] # PHOENICIAN LETTER YOD 1090A ; [.1C4D.0020.0002.1090A] # PHOENICIAN LETTER KAF 1090B ; [.1C4E.0020.0002.1090B] # PHOENICIAN LETTER LAMD 1090C ; [.1C4F.0020.0002.1090C] # PHOENICIAN LETTER MEM 1090D ; [.1C50.0020.0002.1090D] # PHOENICIAN LETTER NUN 1090E ; [.1C51.0020.0002.1090E] # PHOENICIAN LETTER SEMK 1090F ; [.1C52.0020.0002.1090F] # PHOENICIAN LETTER AIN 10910 ; [.1C53.0020.0002.10910] # PHOENICIAN LETTER PE 10911 ; [.1C54.0020.0002.10911] # PHOENICIAN LETTER SADE 10912 ; [.1C55.0020.0002.10912] # PHOENICIAN LETTER QOF 10913 ; [.1C56.0020.0002.10913] # PHOENICIAN LETTER ROSH 10914 ; [.1C57.0020.0002.10914] # PHOENICIAN LETTER SHIN 10915 ; [.1C58.0020.0002.10915] # PHOENICIAN LETTER TAU 0800 ; [.1C59.0020.0002.0800] # SAMARITAN LETTER ALAF 0801 ; [.1C5A.0020.0002.0801] # SAMARITAN LETTER BIT 0802 ; [.1C5B.0020.0002.0802] # SAMARITAN LETTER GAMAN 0803 ; [.1C5C.0020.0002.0803] # SAMARITAN LETTER DALAT 0804 ; [.1C5D.0020.0002.0804] # SAMARITAN LETTER IY 0805 ; [.1C5E.0020.0002.0805] # SAMARITAN LETTER BAA 0806 ; [.1C5F.0020.0002.0806] # SAMARITAN LETTER ZEN 0807 ; [.1C60.0020.0002.0807] # SAMARITAN LETTER IT 0808 ; [.1C61.0020.0002.0808] # SAMARITAN LETTER TIT 0809 ; [.1C62.0020.0002.0809] # SAMARITAN LETTER YUT 080A ; [.1C63.0020.0002.080A] # SAMARITAN LETTER KAAF 080B ; [.1C64.0020.0002.080B] # SAMARITAN LETTER LABAT 080C ; [.1C65.0020.0002.080C] # SAMARITAN LETTER MIM 080D ; [.1C66.0020.0002.080D] # SAMARITAN LETTER NUN 080E ; [.1C67.0020.0002.080E] # SAMARITAN LETTER SINGAAT 080F ; [.1C68.0020.0002.080F] # SAMARITAN LETTER IN 0810 ; [.1C69.0020.0002.0810] # SAMARITAN LETTER FI 0811 ; [.1C6A.0020.0002.0811] # SAMARITAN LETTER TSAADIY 0812 ; [.1C6B.0020.0002.0812] # SAMARITAN LETTER QUF 0813 ; [.1C6C.0020.0002.0813] # SAMARITAN LETTER RISH 0814 ; [.1C6D.0020.0002.0814] # SAMARITAN LETTER SHAN 0815 ; [.1C6E.0020.0002.0815] # SAMARITAN LETTER TAAF 0816 ; [.1C6F.0020.0002.0816] # SAMARITAN MARK IN 0817 ; [.1C70.0020.0002.0817] # SAMARITAN MARK IN-ALAF 081A ; [.1C71.0020.0002.081A] # SAMARITAN MODIFIER LETTER EPENTHETIC YUT 081B ; [.1C72.0020.0002.081B] # SAMARITAN MARK EPENTHETIC YUT 0621 ; [.1C73.0020.0002.0621] # ARABIC LETTER HAMZA 0674 ; [.1C73.0020.0004.0674] # ARABIC LETTER HIGH HAMZA FE80 ; [.1C73.0020.001A.FE80] # ARABIC LETTER HAMZA ISOLATED FORM 06FD ; [.1C73.0020.0004.06FD][.0000.013A.0004.06FD] # ARABIC SIGN SINDHI AMPERSAND 0622 ; [.1C74.0020.0002.0622] # ARABIC LETTER ALEF WITH MADDA ABOVE 0627 0653 ; [.1C74.0020.0002.0622] # ARABIC LETTER ALEF WITH MADDA ABOVE FE82 ; [.1C74.0020.0019.FE82] # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM FE81 ; [.1C74.0020.001A.FE81] # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM 0623 ; [.1C75.0020.0002.0623] # ARABIC LETTER ALEF WITH HAMZA ABOVE 0627 0654 ; [.1C75.0020.0002.0623] # ARABIC LETTER ALEF WITH HAMZA ABOVE FE84 ; [.1C75.0020.0019.FE84] # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM FE83 ; [.1C75.0020.001A.FE83] # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM 0672 ; [.1C76.0020.0002.0672] # ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE 0671 ; [.1C77.0020.0002.0671] # ARABIC LETTER ALEF WASLA FB51 ; [.1C77.0020.0019.FB51] # ARABIC LETTER ALEF WASLA FINAL FORM FB50 ; [.1C77.0020.001A.FB50] # ARABIC LETTER ALEF WASLA ISOLATED FORM 0624 ; [.1C78.0020.0002.0624] # ARABIC LETTER WAW WITH HAMZA ABOVE 0648 0654 ; [.1C78.0020.0002.0624] # ARABIC LETTER WAW WITH HAMZA ABOVE FE86 ; [.1C78.0020.0019.FE86] # ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM FE85 ; [.1C78.0020.001A.FE85] # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM 0625 ; [.1C79.0020.0002.0625] # ARABIC LETTER ALEF WITH HAMZA BELOW 0627 0655 ; [.1C79.0020.0002.0625] # ARABIC LETTER ALEF WITH HAMZA BELOW FE88 ; [.1C79.0020.0019.FE88] # ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM FE87 ; [.1C79.0020.001A.FE87] # ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM 0673 ; [.1C7A.0020.0002.0673] # ARABIC LETTER ALEF WITH WAVY HAMZA BELOW 0773 ; [.1C7B.0020.0002.0773] # ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE 0774 ; [.1C7C.0020.0002.0774] # ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE 0626 ; [.1C7D.0020.0002.0626] # ARABIC LETTER YEH WITH HAMZA ABOVE 064A 0654 ; [.1C7D.0020.0002.0626] # ARABIC LETTER YEH WITH HAMZA ABOVE FE8B ; [.1C7D.0020.0017.FE8B] # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM FE8C ; [.1C7D.0020.0018.FE8C] # ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM FE8A ; [.1C7D.0020.0019.FE8A] # ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM FE89 ; [.1C7D.0020.001A.FE89] # ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM FBEB ; [.1C7D.0020.0019.FBEB][.1C81.0020.0019.FBEB] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM FBEA ; [.1C7D.0020.001A.FBEA][.1C81.0020.001A.FBEA] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM FC97 ; [.1C7D.0020.0017.FC97][.1C97.0020.0017.FC97] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM FC00 ; [.1C7D.0020.001A.FC00][.1C97.0020.001A.FC00] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM FC98 ; [.1C7D.0020.0017.FC98][.1C9E.0020.0017.FC98] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM FC01 ; [.1C7D.0020.001A.FC01][.1C9E.0020.001A.FC01] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM FC99 ; [.1C7D.0020.0017.FC99][.1C9F.0020.0017.FC99] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM FC64 ; [.1C7D.0020.0019.FC64][.1CB7.0020.0019.FC64] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM FC65 ; [.1C7D.0020.0019.FC65][.1CB8.0020.0019.FC65] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM FC9A ; [.1C7D.0020.0017.FC9A][.1D0C.0020.0017.FC9A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM FCDF ; [.1C7D.0020.0018.FCDF][.1D0C.0020.0018.FCDF] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM FC66 ; [.1C7D.0020.0019.FC66][.1D0C.0020.0019.FC66] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM FC02 ; [.1C7D.0020.001A.FC02][.1D0C.0020.001A.FC02] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM FC67 ; [.1C7D.0020.0019.FC67][.1D10.0020.0019.FC67] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM FC9B ; [.1C7D.0020.0017.FC9B][.1D19.0020.0017.FC9B] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM FCE0 ; [.1C7D.0020.0018.FCE0][.1D19.0020.0018.FCE0] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM FBED ; [.1C7D.0020.0019.FBED][.1D1E.0020.0019.FBED] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM FBEC ; [.1C7D.0020.001A.FBEC][.1D1E.0020.001A.FBEC] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM FBEF ; [.1C7D.0020.0019.FBEF][.1D1F.0020.0019.FBEF] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM FBEE ; [.1C7D.0020.001A.FBEE][.1D1F.0020.001A.FBEE] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM FBF3 ; [.1C7D.0020.0019.FBF3][.1D22.0020.0019.FBF3] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM FBF2 ; [.1C7D.0020.001A.FBF2][.1D22.0020.001A.FBF2] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM FBF1 ; [.1C7D.0020.0019.FBF1][.1D23.0020.0019.FBF1] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM FBF0 ; [.1C7D.0020.001A.FBF0][.1D23.0020.001A.FBF0] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM FBF5 ; [.1C7D.0020.0019.FBF5][.1D24.0020.0019.FBF5] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM FBF4 ; [.1C7D.0020.001A.FBF4][.1D24.0020.001A.FBF4] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM FBFB ; [.1C7D.0020.0017.FBFB][.1D2C.0020.0017.FBFB] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM FBFA ; [.1C7D.0020.0019.FBFA][.1D2C.0020.0019.FBFA] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM FC68 ; [.1C7D.0020.0019.FC68][.1D2C.0020.0019.FC68] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM FBF9 ; [.1C7D.0020.001A.FBF9][.1D2C.0020.001A.FBF9] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM FC03 ; [.1C7D.0020.001A.FC03][.1D2C.0020.001A.FC03] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM FC69 ; [.1C7D.0020.0019.FC69][.1D2D.0020.0019.FC69] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM FC04 ; [.1C7D.0020.001A.FC04][.1D2D.0020.001A.FC04] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM FBF8 ; [.1C7D.0020.0017.FBF8][.1D31.0020.0017.FBF8] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM FBF7 ; [.1C7D.0020.0019.FBF7][.1D31.0020.0019.FBF7] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM FBF6 ; [.1C7D.0020.001A.FBF6][.1D31.0020.001A.FBF6] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM 08A8 ; [.1C7E.0020.0002.08A8] # ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE 08A9 ; [.1C7F.0020.0002.08A9] # ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE 08AC ; [.1C80.0020.0002.08AC] # ARABIC LETTER ROHINGYA YEH 0627 ; [.1C81.0020.0002.0627] # ARABIC LETTER ALEF 1EE00 ; [.1C81.0020.0005.1EE00] # ARABIC MATHEMATICAL ALEF 1EE80 ; [.1C81.0020.0005.1EE80] # ARABIC MATHEMATICAL LOOPED ALEF FE8E ; [.1C81.0020.0019.FE8E] # ARABIC LETTER ALEF FINAL FORM FE8D ; [.1C81.0020.001A.FE8D] # ARABIC LETTER ALEF ISOLATED FORM FD3C ; [.1C81.0020.0019.FD3C][.0000.00A2.0019.FD3C] # ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM FD3D ; [.1C81.0020.001A.FD3D][.0000.00A2.001A.FD3D] # ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM 0675 ; [.1C81.0020.0004.0675][.1C73.0020.0004.0675] # ARABIC LETTER HIGH HAMZA ALEF FDF3 ; [.1C81.0020.001A.FDF3][.1CF2.0020.001A.FDF3][.1C83.0020.001F.FDF3][.1CB7.0020.001F.FDF3] # ARABIC LIGATURE AKBAR ISOLATED FORM FDF2 ; [.1C81.0020.001A.FDF2][.1D05.0020.001A.FDF2][.1D05.0020.001F.FDF2][.1D19.0020.001F.FDF2] # ARABIC LIGATURE ALLAH ISOLATED FORM 066E ; [.1C82.0020.0002.066E] # ARABIC LETTER DOTLESS BEH 1EE1C ; [.1C82.0020.0005.1EE1C] # ARABIC MATHEMATICAL DOTLESS BEH 1EE7C ; [.1C82.0020.0005.1EE7C] # ARABIC MATHEMATICAL STRETCHED DOTLESS BEH 0628 ; [.1C83.0020.0002.0628] # ARABIC LETTER BEH 1EE01 ; [.1C83.0020.0005.1EE01] # ARABIC MATHEMATICAL BEH 1EE21 ; [.1C83.0020.0005.1EE21] # ARABIC MATHEMATICAL INITIAL BEH 1EE61 ; [.1C83.0020.0005.1EE61] # ARABIC MATHEMATICAL STRETCHED BEH 1EE81 ; [.1C83.0020.0005.1EE81] # ARABIC MATHEMATICAL LOOPED BEH 1EEA1 ; [.1C83.0020.0005.1EEA1] # ARABIC MATHEMATICAL DOUBLE-STRUCK BEH FE91 ; [.1C83.0020.0017.FE91] # ARABIC LETTER BEH INITIAL FORM FE92 ; [.1C83.0020.0018.FE92] # ARABIC LETTER BEH MEDIAL FORM FE90 ; [.1C83.0020.0019.FE90] # ARABIC LETTER BEH FINAL FORM FE8F ; [.1C83.0020.001A.FE8F] # ARABIC LETTER BEH ISOLATED FORM FC9C ; [.1C83.0020.0017.FC9C][.1C97.0020.0017.FC9C] # ARABIC LIGATURE BEH WITH JEEM INITIAL FORM FC05 ; [.1C83.0020.001A.FC05][.1C97.0020.001A.FC05] # ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM FC9D ; [.1C83.0020.0017.FC9D][.1C9E.0020.0017.FC9D] # ARABIC LIGATURE BEH WITH HAH INITIAL FORM FC06 ; [.1C83.0020.001A.FC06][.1C9E.0020.001A.FC06] # ARABIC LIGATURE BEH WITH HAH ISOLATED FORM FDC2 ; [.1C83.0020.0019.FDC2][.1C9E.0020.0019.FDC2][.1D2D.0020.001F.FDC2] # ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM FC9E ; [.1C83.0020.0017.FC9E][.1C9F.0020.0017.FC9E] # ARABIC LIGATURE BEH WITH KHAH INITIAL FORM FC07 ; [.1C83.0020.001A.FC07][.1C9F.0020.001A.FC07] # ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM FD9E ; [.1C83.0020.0019.FD9E][.1C9F.0020.0019.FD9E][.1D2D.0020.001F.FD9E] # ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM FC6A ; [.1C83.0020.0019.FC6A][.1CB7.0020.0019.FC6A] # ARABIC LIGATURE BEH WITH REH FINAL FORM FC6B ; [.1C83.0020.0019.FC6B][.1CB8.0020.0019.FC6B] # ARABIC LIGATURE BEH WITH ZAIN FINAL FORM FC9F ; [.1C83.0020.0017.FC9F][.1D0C.0020.0017.FC9F] # ARABIC LIGATURE BEH WITH MEEM INITIAL FORM FCE1 ; [.1C83.0020.0018.FCE1][.1D0C.0020.0018.FCE1] # ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM FC6C ; [.1C83.0020.0019.FC6C][.1D0C.0020.0019.FC6C] # ARABIC LIGATURE BEH WITH MEEM FINAL FORM FC08 ; [.1C83.0020.001A.FC08][.1D0C.0020.001A.FC08] # ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM FC6D ; [.1C83.0020.0019.FC6D][.1D10.0020.0019.FC6D] # ARABIC LIGATURE BEH WITH NOON FINAL FORM FCA0 ; [.1C83.0020.0017.FCA0][.1D19.0020.0017.FCA0] # ARABIC LIGATURE BEH WITH HEH INITIAL FORM FCE2 ; [.1C83.0020.0018.FCE2][.1D19.0020.0018.FCE2] # ARABIC LIGATURE BEH WITH HEH MEDIAL FORM FC6E ; [.1C83.0020.0019.FC6E][.1D2C.0020.0019.FC6E] # ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM FC09 ; [.1C83.0020.001A.FC09][.1D2C.0020.001A.FC09] # ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM FC6F ; [.1C83.0020.0019.FC6F][.1D2D.0020.0019.FC6F] # ARABIC LIGATURE BEH WITH YEH FINAL FORM FC0A ; [.1C83.0020.001A.FC0A][.1D2D.0020.001A.FC0A] # ARABIC LIGATURE BEH WITH YEH ISOLATED FORM 067B ; [.1C84.0020.0002.067B] # ARABIC LETTER BEEH FB54 ; [.1C84.0020.0017.FB54] # ARABIC LETTER BEEH INITIAL FORM FB55 ; [.1C84.0020.0018.FB55] # ARABIC LETTER BEEH MEDIAL FORM FB53 ; [.1C84.0020.0019.FB53] # ARABIC LETTER BEEH FINAL FORM FB52 ; [.1C84.0020.001A.FB52] # ARABIC LETTER BEEH ISOLATED FORM 067E ; [.1C85.0020.0002.067E] # ARABIC LETTER PEH FB58 ; [.1C85.0020.0017.FB58] # ARABIC LETTER PEH INITIAL FORM FB59 ; [.1C85.0020.0018.FB59] # ARABIC LETTER PEH MEDIAL FORM FB57 ; [.1C85.0020.0019.FB57] # ARABIC LETTER PEH FINAL FORM FB56 ; [.1C85.0020.001A.FB56] # ARABIC LETTER PEH ISOLATED FORM 0680 ; [.1C86.0020.0002.0680] # ARABIC LETTER BEHEH FB5C ; [.1C86.0020.0017.FB5C] # ARABIC LETTER BEHEH INITIAL FORM FB5D ; [.1C86.0020.0018.FB5D] # ARABIC LETTER BEHEH MEDIAL FORM FB5B ; [.1C86.0020.0019.FB5B] # ARABIC LETTER BEHEH FINAL FORM FB5A ; [.1C86.0020.001A.FB5A] # ARABIC LETTER BEHEH ISOLATED FORM 0750 ; [.1C87.0020.0002.0750] # ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW 0751 ; [.1C88.0020.0002.0751] # ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE 0752 ; [.1C89.0020.0002.0752] # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW 0753 ; [.1C8A.0020.0002.0753] # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE 0754 ; [.1C8B.0020.0002.0754] # ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE 0755 ; [.1C8C.0020.0002.0755] # ARABIC LETTER BEH WITH INVERTED SMALL V BELOW 08A0 ; [.1C8D.0020.0002.08A0] # ARABIC LETTER BEH WITH SMALL V BELOW 0756 ; [.1C8E.0020.0002.0756] # ARABIC LETTER BEH WITH SMALL V 0629 ; [.1C8F.0020.0002.0629] # ARABIC LETTER TEH MARBUTA FE94 ; [.1C8F.0020.0019.FE94] # ARABIC LETTER TEH MARBUTA FINAL FORM FE93 ; [.1C8F.0020.001A.FE93] # ARABIC LETTER TEH MARBUTA ISOLATED FORM 062A ; [.1C90.0020.0002.062A] # ARABIC LETTER TEH 1EE15 ; [.1C90.0020.0005.1EE15] # ARABIC MATHEMATICAL TEH 1EE35 ; [.1C90.0020.0005.1EE35] # ARABIC MATHEMATICAL INITIAL TEH 1EE75 ; [.1C90.0020.0005.1EE75] # ARABIC MATHEMATICAL STRETCHED TEH 1EE95 ; [.1C90.0020.0005.1EE95] # ARABIC MATHEMATICAL LOOPED TEH 1EEB5 ; [.1C90.0020.0005.1EEB5] # ARABIC MATHEMATICAL DOUBLE-STRUCK TEH FE97 ; [.1C90.0020.0017.FE97] # ARABIC LETTER TEH INITIAL FORM FE98 ; [.1C90.0020.0018.FE98] # ARABIC LETTER TEH MEDIAL FORM FE96 ; [.1C90.0020.0019.FE96] # ARABIC LETTER TEH FINAL FORM FE95 ; [.1C90.0020.001A.FE95] # ARABIC LETTER TEH ISOLATED FORM FCA1 ; [.1C90.0020.0017.FCA1][.1C97.0020.0017.FCA1] # ARABIC LIGATURE TEH WITH JEEM INITIAL FORM FC0B ; [.1C90.0020.001A.FC0B][.1C97.0020.001A.FC0B] # ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM FD50 ; [.1C90.0020.0017.FD50][.1C97.0020.0017.FD50][.1D0C.0020.001F.FD50] # ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM FDA0 ; [.1C90.0020.0019.FDA0][.1C97.0020.0019.FDA0][.1D2C.0020.001F.FDA0] # ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM FD9F ; [.1C90.0020.0019.FD9F][.1C97.0020.0019.FD9F][.1D2D.0020.001F.FD9F] # ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM FCA2 ; [.1C90.0020.0017.FCA2][.1C9E.0020.0017.FCA2] # ARABIC LIGATURE TEH WITH HAH INITIAL FORM FC0C ; [.1C90.0020.001A.FC0C][.1C9E.0020.001A.FC0C] # ARABIC LIGATURE TEH WITH HAH ISOLATED FORM FD52 ; [.1C90.0020.0017.FD52][.1C9E.0020.0017.FD52][.1C97.0020.001F.FD52] # ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM FD51 ; [.1C90.0020.0019.FD51][.1C9E.0020.0019.FD51][.1C97.0020.001F.FD51] # ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM FD53 ; [.1C90.0020.0017.FD53][.1C9E.0020.0017.FD53][.1D0C.0020.001F.FD53] # ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM FCA3 ; [.1C90.0020.0017.FCA3][.1C9F.0020.0017.FCA3] # ARABIC LIGATURE TEH WITH KHAH INITIAL FORM FC0D ; [.1C90.0020.001A.FC0D][.1C9F.0020.001A.FC0D] # ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM FD54 ; [.1C90.0020.0017.FD54][.1C9F.0020.0017.FD54][.1D0C.0020.001F.FD54] # ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM FDA2 ; [.1C90.0020.0019.FDA2][.1C9F.0020.0019.FDA2][.1D2C.0020.001F.FDA2] # ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM FDA1 ; [.1C90.0020.0019.FDA1][.1C9F.0020.0019.FDA1][.1D2D.0020.001F.FDA1] # ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM FC70 ; [.1C90.0020.0019.FC70][.1CB7.0020.0019.FC70] # ARABIC LIGATURE TEH WITH REH FINAL FORM FC71 ; [.1C90.0020.0019.FC71][.1CB8.0020.0019.FC71] # ARABIC LIGATURE TEH WITH ZAIN FINAL FORM FCA4 ; [.1C90.0020.0017.FCA4][.1D0C.0020.0017.FCA4] # ARABIC LIGATURE TEH WITH MEEM INITIAL FORM FCE3 ; [.1C90.0020.0018.FCE3][.1D0C.0020.0018.FCE3] # ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM FC72 ; [.1C90.0020.0019.FC72][.1D0C.0020.0019.FC72] # ARABIC LIGATURE TEH WITH MEEM FINAL FORM FC0E ; [.1C90.0020.001A.FC0E][.1D0C.0020.001A.FC0E] # ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM FD55 ; [.1C90.0020.0017.FD55][.1D0C.0020.0017.FD55][.1C97.0020.001F.FD55] # ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM FD56 ; [.1C90.0020.0017.FD56][.1D0C.0020.0017.FD56][.1C9E.0020.001F.FD56] # ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM FD57 ; [.1C90.0020.0017.FD57][.1D0C.0020.0017.FD57][.1C9F.0020.001F.FD57] # ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM FDA4 ; [.1C90.0020.0019.FDA4][.1D0C.0020.0019.FDA4][.1D2C.0020.001F.FDA4] # ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM FDA3 ; [.1C90.0020.0019.FDA3][.1D0C.0020.0019.FDA3][.1D2D.0020.001F.FDA3] # ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM FC73 ; [.1C90.0020.0019.FC73][.1D10.0020.0019.FC73] # ARABIC LIGATURE TEH WITH NOON FINAL FORM FCA5 ; [.1C90.0020.0017.FCA5][.1D19.0020.0017.FCA5] # ARABIC LIGATURE TEH WITH HEH INITIAL FORM FCE4 ; [.1C90.0020.0018.FCE4][.1D19.0020.0018.FCE4] # ARABIC LIGATURE TEH WITH HEH MEDIAL FORM FC74 ; [.1C90.0020.0019.FC74][.1D2C.0020.0019.FC74] # ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM FC0F ; [.1C90.0020.001A.FC0F][.1D2C.0020.001A.FC0F] # ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM FC75 ; [.1C90.0020.0019.FC75][.1D2D.0020.0019.FC75] # ARABIC LIGATURE TEH WITH YEH FINAL FORM FC10 ; [.1C90.0020.001A.FC10][.1D2D.0020.001A.FC10] # ARABIC LIGATURE TEH WITH YEH ISOLATED FORM 062B ; [.1C91.0020.0002.062B] # ARABIC LETTER THEH 1EE16 ; [.1C91.0020.0005.1EE16] # ARABIC MATHEMATICAL THEH 1EE36 ; [.1C91.0020.0005.1EE36] # ARABIC MATHEMATICAL INITIAL THEH 1EE76 ; [.1C91.0020.0005.1EE76] # ARABIC MATHEMATICAL STRETCHED THEH 1EE96 ; [.1C91.0020.0005.1EE96] # ARABIC MATHEMATICAL LOOPED THEH 1EEB6 ; [.1C91.0020.0005.1EEB6] # ARABIC MATHEMATICAL DOUBLE-STRUCK THEH FE9B ; [.1C91.0020.0017.FE9B] # ARABIC LETTER THEH INITIAL FORM FE9C ; [.1C91.0020.0018.FE9C] # ARABIC LETTER THEH MEDIAL FORM FE9A ; [.1C91.0020.0019.FE9A] # ARABIC LETTER THEH FINAL FORM FE99 ; [.1C91.0020.001A.FE99] # ARABIC LETTER THEH ISOLATED FORM FC11 ; [.1C91.0020.001A.FC11][.1C97.0020.001A.FC11] # ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM FC76 ; [.1C91.0020.0019.FC76][.1CB7.0020.0019.FC76] # ARABIC LIGATURE THEH WITH REH FINAL FORM FC77 ; [.1C91.0020.0019.FC77][.1CB8.0020.0019.FC77] # ARABIC LIGATURE THEH WITH ZAIN FINAL FORM FCA6 ; [.1C91.0020.0017.FCA6][.1D0C.0020.0017.FCA6] # ARABIC LIGATURE THEH WITH MEEM INITIAL FORM FCE5 ; [.1C91.0020.0018.FCE5][.1D0C.0020.0018.FCE5] # ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM FC78 ; [.1C91.0020.0019.FC78][.1D0C.0020.0019.FC78] # ARABIC LIGATURE THEH WITH MEEM FINAL FORM FC12 ; [.1C91.0020.001A.FC12][.1D0C.0020.001A.FC12] # ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM FC79 ; [.1C91.0020.0019.FC79][.1D10.0020.0019.FC79] # ARABIC LIGATURE THEH WITH NOON FINAL FORM FCE6 ; [.1C91.0020.0018.FCE6][.1D19.0020.0018.FCE6] # ARABIC LIGATURE THEH WITH HEH MEDIAL FORM FC7A ; [.1C91.0020.0019.FC7A][.1D2C.0020.0019.FC7A] # ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM FC13 ; [.1C91.0020.001A.FC13][.1D2C.0020.001A.FC13] # ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM FC7B ; [.1C91.0020.0019.FC7B][.1D2D.0020.0019.FC7B] # ARABIC LIGATURE THEH WITH YEH FINAL FORM FC14 ; [.1C91.0020.001A.FC14][.1D2D.0020.001A.FC14] # ARABIC LIGATURE THEH WITH YEH ISOLATED FORM 0679 ; [.1C92.0020.0002.0679] # ARABIC LETTER TTEH FB68 ; [.1C92.0020.0017.FB68] # ARABIC LETTER TTEH INITIAL FORM FB69 ; [.1C92.0020.0018.FB69] # ARABIC LETTER TTEH MEDIAL FORM FB67 ; [.1C92.0020.0019.FB67] # ARABIC LETTER TTEH FINAL FORM FB66 ; [.1C92.0020.001A.FB66] # ARABIC LETTER TTEH ISOLATED FORM 067A ; [.1C93.0020.0002.067A] # ARABIC LETTER TTEHEH FB60 ; [.1C93.0020.0017.FB60] # ARABIC LETTER TTEHEH INITIAL FORM FB61 ; [.1C93.0020.0018.FB61] # ARABIC LETTER TTEHEH MEDIAL FORM FB5F ; [.1C93.0020.0019.FB5F] # ARABIC LETTER TTEHEH FINAL FORM FB5E ; [.1C93.0020.001A.FB5E] # ARABIC LETTER TTEHEH ISOLATED FORM 067C ; [.1C94.0020.0002.067C] # ARABIC LETTER TEH WITH RING 067D ; [.1C95.0020.0002.067D] # ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS 067F ; [.1C96.0020.0002.067F] # ARABIC LETTER TEHEH FB64 ; [.1C96.0020.0017.FB64] # ARABIC LETTER TEHEH INITIAL FORM FB65 ; [.1C96.0020.0018.FB65] # ARABIC LETTER TEHEH MEDIAL FORM FB63 ; [.1C96.0020.0019.FB63] # ARABIC LETTER TEHEH FINAL FORM FB62 ; [.1C96.0020.001A.FB62] # ARABIC LETTER TEHEH ISOLATED FORM 062C ; [.1C97.0020.0002.062C] # ARABIC LETTER JEEM 1EE02 ; [.1C97.0020.0005.1EE02] # ARABIC MATHEMATICAL JEEM 1EE22 ; [.1C97.0020.0005.1EE22] # ARABIC MATHEMATICAL INITIAL JEEM 1EE42 ; [.1C97.0020.0005.1EE42] # ARABIC MATHEMATICAL TAILED JEEM 1EE62 ; [.1C97.0020.0005.1EE62] # ARABIC MATHEMATICAL STRETCHED JEEM 1EE82 ; [.1C97.0020.0005.1EE82] # ARABIC MATHEMATICAL LOOPED JEEM 1EEA2 ; [.1C97.0020.0005.1EEA2] # ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM FE9F ; [.1C97.0020.0017.FE9F] # ARABIC LETTER JEEM INITIAL FORM FEA0 ; [.1C97.0020.0018.FEA0] # ARABIC LETTER JEEM MEDIAL FORM FE9E ; [.1C97.0020.0019.FE9E] # ARABIC LETTER JEEM FINAL FORM FE9D ; [.1C97.0020.001A.FE9D] # ARABIC LETTER JEEM ISOLATED FORM FCA7 ; [.1C97.0020.0017.FCA7][.1C9E.0020.0017.FCA7] # ARABIC LIGATURE JEEM WITH HAH INITIAL FORM FC15 ; [.1C97.0020.001A.FC15][.1C9E.0020.001A.FC15] # ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM FDA6 ; [.1C97.0020.0019.FDA6][.1C9E.0020.0019.FDA6][.1D2C.0020.001F.FDA6] # ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM FDBE ; [.1C97.0020.0019.FDBE][.1C9E.0020.0019.FDBE][.1D2D.0020.001F.FDBE] # ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM FDFB ; [.1C97.0020.001A.FDFB][.1D05.0020.001A.FDFB][*020A.0020.001F.FDFB][.1C97.0020.001F.FDFB][.1D05.0020.001F.FDFB][.1C81.0020.001F.FDFB][.1D05.0020.001F.FDFB][.1D19.0020.001F.FDFB] # ARABIC LIGATURE JALLAJALALOUHOU FCA8 ; [.1C97.0020.0017.FCA8][.1D0C.0020.0017.FCA8] # ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM FC16 ; [.1C97.0020.001A.FC16][.1D0C.0020.001A.FC16] # ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM FD59 ; [.1C97.0020.0017.FD59][.1D0C.0020.0017.FD59][.1C9E.0020.001F.FD59] # ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM FD58 ; [.1C97.0020.0019.FD58][.1D0C.0020.0019.FD58][.1C9E.0020.001F.FD58] # ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM FDA7 ; [.1C97.0020.0019.FDA7][.1D0C.0020.0019.FDA7][.1D2C.0020.001F.FDA7] # ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM FDA5 ; [.1C97.0020.0019.FDA5][.1D0C.0020.0019.FDA5][.1D2D.0020.001F.FDA5] # ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM FD1D ; [.1C97.0020.0019.FD1D][.1D2C.0020.0019.FD1D] # ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM FD01 ; [.1C97.0020.001A.FD01][.1D2C.0020.001A.FD01] # ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM FD1E ; [.1C97.0020.0019.FD1E][.1D2D.0020.0019.FD1E] # ARABIC LIGATURE JEEM WITH YEH FINAL FORM FD02 ; [.1C97.0020.001A.FD02][.1D2D.0020.001A.FD02] # ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM 0683 ; [.1C98.0020.0002.0683] # ARABIC LETTER NYEH FB78 ; [.1C98.0020.0017.FB78] # ARABIC LETTER NYEH INITIAL FORM FB79 ; [.1C98.0020.0018.FB79] # ARABIC LETTER NYEH MEDIAL FORM FB77 ; [.1C98.0020.0019.FB77] # ARABIC LETTER NYEH FINAL FORM FB76 ; [.1C98.0020.001A.FB76] # ARABIC LETTER NYEH ISOLATED FORM 0684 ; [.1C99.0020.0002.0684] # ARABIC LETTER DYEH FB74 ; [.1C99.0020.0017.FB74] # ARABIC LETTER DYEH INITIAL FORM FB75 ; [.1C99.0020.0018.FB75] # ARABIC LETTER DYEH MEDIAL FORM FB73 ; [.1C99.0020.0019.FB73] # ARABIC LETTER DYEH FINAL FORM FB72 ; [.1C99.0020.001A.FB72] # ARABIC LETTER DYEH ISOLATED FORM 0686 ; [.1C9A.0020.0002.0686] # ARABIC LETTER TCHEH FB7C ; [.1C9A.0020.0017.FB7C] # ARABIC LETTER TCHEH INITIAL FORM FB7D ; [.1C9A.0020.0018.FB7D] # ARABIC LETTER TCHEH MEDIAL FORM FB7B ; [.1C9A.0020.0019.FB7B] # ARABIC LETTER TCHEH FINAL FORM FB7A ; [.1C9A.0020.001A.FB7A] # ARABIC LETTER TCHEH ISOLATED FORM 06BF ; [.1C9B.0020.0002.06BF] # ARABIC LETTER TCHEH WITH DOT ABOVE 0687 ; [.1C9C.0020.0002.0687] # ARABIC LETTER TCHEHEH FB80 ; [.1C9C.0020.0017.FB80] # ARABIC LETTER TCHEHEH INITIAL FORM FB81 ; [.1C9C.0020.0018.FB81] # ARABIC LETTER TCHEHEH MEDIAL FORM FB7F ; [.1C9C.0020.0019.FB7F] # ARABIC LETTER TCHEHEH FINAL FORM FB7E ; [.1C9C.0020.001A.FB7E] # ARABIC LETTER TCHEHEH ISOLATED FORM 08A2 ; [.1C9D.0020.0002.08A2] # ARABIC LETTER JEEM WITH TWO DOTS ABOVE 062D ; [.1C9E.0020.0002.062D] # ARABIC LETTER HAH 1EE07 ; [.1C9E.0020.0005.1EE07] # ARABIC MATHEMATICAL HAH 1EE27 ; [.1C9E.0020.0005.1EE27] # ARABIC MATHEMATICAL INITIAL HAH 1EE47 ; [.1C9E.0020.0005.1EE47] # ARABIC MATHEMATICAL TAILED HAH 1EE67 ; [.1C9E.0020.0005.1EE67] # ARABIC MATHEMATICAL STRETCHED HAH 1EE87 ; [.1C9E.0020.0005.1EE87] # ARABIC MATHEMATICAL LOOPED HAH 1EEA7 ; [.1C9E.0020.0005.1EEA7] # ARABIC MATHEMATICAL DOUBLE-STRUCK HAH FEA3 ; [.1C9E.0020.0017.FEA3] # ARABIC LETTER HAH INITIAL FORM FEA4 ; [.1C9E.0020.0018.FEA4] # ARABIC LETTER HAH MEDIAL FORM FEA2 ; [.1C9E.0020.0019.FEA2] # ARABIC LETTER HAH FINAL FORM FEA1 ; [.1C9E.0020.001A.FEA1] # ARABIC LETTER HAH ISOLATED FORM FCA9 ; [.1C9E.0020.0017.FCA9][.1C97.0020.0017.FCA9] # ARABIC LIGATURE HAH WITH JEEM INITIAL FORM FC17 ; [.1C9E.0020.001A.FC17][.1C97.0020.001A.FC17] # ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM FDBF ; [.1C9E.0020.0019.FDBF][.1C97.0020.0019.FDBF][.1D2D.0020.001F.FDBF] # ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM FCAA ; [.1C9E.0020.0017.FCAA][.1D0C.0020.0017.FCAA] # ARABIC LIGATURE HAH WITH MEEM INITIAL FORM FC18 ; [.1C9E.0020.001A.FC18][.1D0C.0020.001A.FC18] # ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM FD5B ; [.1C9E.0020.0019.FD5B][.1D0C.0020.0019.FD5B][.1D2C.0020.001F.FD5B] # ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM FD5A ; [.1C9E.0020.0019.FD5A][.1D0C.0020.0019.FD5A][.1D2D.0020.001F.FD5A] # ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM FD1B ; [.1C9E.0020.0019.FD1B][.1D2C.0020.0019.FD1B] # ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM FCFF ; [.1C9E.0020.001A.FCFF][.1D2C.0020.001A.FCFF] # ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM FD1C ; [.1C9E.0020.0019.FD1C][.1D2D.0020.0019.FD1C] # ARABIC LIGATURE HAH WITH YEH FINAL FORM FD00 ; [.1C9E.0020.001A.FD00][.1D2D.0020.001A.FD00] # ARABIC LIGATURE HAH WITH YEH ISOLATED FORM 062E ; [.1C9F.0020.0002.062E] # ARABIC LETTER KHAH 1EE17 ; [.1C9F.0020.0005.1EE17] # ARABIC MATHEMATICAL KHAH 1EE37 ; [.1C9F.0020.0005.1EE37] # ARABIC MATHEMATICAL INITIAL KHAH 1EE57 ; [.1C9F.0020.0005.1EE57] # ARABIC MATHEMATICAL TAILED KHAH 1EE77 ; [.1C9F.0020.0005.1EE77] # ARABIC MATHEMATICAL STRETCHED KHAH 1EE97 ; [.1C9F.0020.0005.1EE97] # ARABIC MATHEMATICAL LOOPED KHAH 1EEB7 ; [.1C9F.0020.0005.1EEB7] # ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH FEA7 ; [.1C9F.0020.0017.FEA7] # ARABIC LETTER KHAH INITIAL FORM FEA8 ; [.1C9F.0020.0018.FEA8] # ARABIC LETTER KHAH MEDIAL FORM FEA6 ; [.1C9F.0020.0019.FEA6] # ARABIC LETTER KHAH FINAL FORM FEA5 ; [.1C9F.0020.001A.FEA5] # ARABIC LETTER KHAH ISOLATED FORM FCAB ; [.1C9F.0020.0017.FCAB][.1C97.0020.0017.FCAB] # ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM FC19 ; [.1C9F.0020.001A.FC19][.1C97.0020.001A.FC19] # ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM FC1A ; [.1C9F.0020.001A.FC1A][.1C9E.0020.001A.FC1A] # ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM FCAC ; [.1C9F.0020.0017.FCAC][.1D0C.0020.0017.FCAC] # ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM FC1B ; [.1C9F.0020.001A.FC1B][.1D0C.0020.001A.FC1B] # ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM FD1F ; [.1C9F.0020.0019.FD1F][.1D2C.0020.0019.FD1F] # ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM FD03 ; [.1C9F.0020.001A.FD03][.1D2C.0020.001A.FD03] # ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM FD20 ; [.1C9F.0020.0019.FD20][.1D2D.0020.0019.FD20] # ARABIC LIGATURE KHAH WITH YEH FINAL FORM FD04 ; [.1C9F.0020.001A.FD04][.1D2D.0020.001A.FD04] # ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM 0681 ; [.1CA0.0020.0002.0681] # ARABIC LETTER HAH WITH HAMZA ABOVE 0682 ; [.1CA1.0020.0002.0682] # ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE 0685 ; [.1CA2.0020.0002.0685] # ARABIC LETTER HAH WITH THREE DOTS ABOVE 0757 ; [.1CA3.0020.0002.0757] # ARABIC LETTER HAH WITH TWO DOTS ABOVE 0758 ; [.1CA4.0020.0002.0758] # ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW 076E ; [.1CA5.0020.0002.076E] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW 076F ; [.1CA6.0020.0002.076F] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS 0772 ; [.1CA7.0020.0002.0772] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE 077C ; [.1CA8.0020.0002.077C] # ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW 062F ; [.1CA9.0020.0002.062F] # ARABIC LETTER DAL 1EE03 ; [.1CA9.0020.0005.1EE03] # ARABIC MATHEMATICAL DAL 1EE83 ; [.1CA9.0020.0005.1EE83] # ARABIC MATHEMATICAL LOOPED DAL 1EEA3 ; [.1CA9.0020.0005.1EEA3] # ARABIC MATHEMATICAL DOUBLE-STRUCK DAL FEAA ; [.1CA9.0020.0019.FEAA] # ARABIC LETTER DAL FINAL FORM FEA9 ; [.1CA9.0020.001A.FEA9] # ARABIC LETTER DAL ISOLATED FORM 0630 ; [.1CAA.0020.0002.0630] # ARABIC LETTER THAL 1EE18 ; [.1CAA.0020.0005.1EE18] # ARABIC MATHEMATICAL THAL 1EE98 ; [.1CAA.0020.0005.1EE98] # ARABIC MATHEMATICAL LOOPED THAL 1EEB8 ; [.1CAA.0020.0005.1EEB8] # ARABIC MATHEMATICAL DOUBLE-STRUCK THAL FEAC ; [.1CAA.0020.0019.FEAC] # ARABIC LETTER THAL FINAL FORM FEAB ; [.1CAA.0020.001A.FEAB] # ARABIC LETTER THAL ISOLATED FORM FC5B ; [.1CAA.0020.001A.FC5B][.0000.00D1.001A.FC5B] # ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM 0688 ; [.1CAB.0020.0002.0688] # ARABIC LETTER DDAL FB89 ; [.1CAB.0020.0019.FB89] # ARABIC LETTER DDAL FINAL FORM FB88 ; [.1CAB.0020.001A.FB88] # ARABIC LETTER DDAL ISOLATED FORM 0689 ; [.1CAC.0020.0002.0689] # ARABIC LETTER DAL WITH RING 068A ; [.1CAD.0020.0002.068A] # ARABIC LETTER DAL WITH DOT BELOW 068B ; [.1CAE.0020.0002.068B] # ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH 068C ; [.1CAF.0020.0002.068C] # ARABIC LETTER DAHAL FB85 ; [.1CAF.0020.0019.FB85] # ARABIC LETTER DAHAL FINAL FORM FB84 ; [.1CAF.0020.001A.FB84] # ARABIC LETTER DAHAL ISOLATED FORM 068D ; [.1CB0.0020.0002.068D] # ARABIC LETTER DDAHAL FB83 ; [.1CB0.0020.0019.FB83] # ARABIC LETTER DDAHAL FINAL FORM FB82 ; [.1CB0.0020.001A.FB82] # ARABIC LETTER DDAHAL ISOLATED FORM 068E ; [.1CB1.0020.0002.068E] # ARABIC LETTER DUL FB87 ; [.1CB1.0020.0019.FB87] # ARABIC LETTER DUL FINAL FORM FB86 ; [.1CB1.0020.001A.FB86] # ARABIC LETTER DUL ISOLATED FORM 068F ; [.1CB2.0020.0002.068F] # ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS 0690 ; [.1CB3.0020.0002.0690] # ARABIC LETTER DAL WITH FOUR DOTS ABOVE 06EE ; [.1CB4.0020.0002.06EE] # ARABIC LETTER DAL WITH INVERTED V 0759 ; [.1CB5.0020.0002.0759] # ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH 075A ; [.1CB6.0020.0002.075A] # ARABIC LETTER DAL WITH INVERTED SMALL V BELOW 0631 ; [.1CB7.0020.0002.0631] # ARABIC LETTER REH 1EE13 ; [.1CB7.0020.0005.1EE13] # ARABIC MATHEMATICAL REH 1EE93 ; [.1CB7.0020.0005.1EE93] # ARABIC MATHEMATICAL LOOPED REH 1EEB3 ; [.1CB7.0020.0005.1EEB3] # ARABIC MATHEMATICAL DOUBLE-STRUCK REH FEAE ; [.1CB7.0020.0019.FEAE] # ARABIC LETTER REH FINAL FORM FEAD ; [.1CB7.0020.001A.FEAD] # ARABIC LETTER REH ISOLATED FORM FC5C ; [.1CB7.0020.001A.FC5C][.0000.00D1.001A.FC5C] # ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM FDF6 ; [.1CB7.0020.001A.FDF6][.1CC8.0020.001A.FDF6][.1D1F.0020.001F.FDF6][.1D05.0020.001F.FDF6] # ARABIC LIGATURE RASOUL ISOLATED FORM FDFC ; [.1CB7.0020.001A.FDFC][.1D2E.0020.001A.FDFC][.1C81.0020.001F.FDFC][.1D05.0020.001F.FDFC] # RIAL SIGN 0632 ; [.1CB8.0020.0002.0632] # ARABIC LETTER ZAIN 1EE06 ; [.1CB8.0020.0005.1EE06] # ARABIC MATHEMATICAL ZAIN 1EE86 ; [.1CB8.0020.0005.1EE86] # ARABIC MATHEMATICAL LOOPED ZAIN 1EEA6 ; [.1CB8.0020.0005.1EEA6] # ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN FEB0 ; [.1CB8.0020.0019.FEB0] # ARABIC LETTER ZAIN FINAL FORM FEAF ; [.1CB8.0020.001A.FEAF] # ARABIC LETTER ZAIN ISOLATED FORM 0691 ; [.1CB9.0020.0002.0691] # ARABIC LETTER RREH FB8D ; [.1CB9.0020.0019.FB8D] # ARABIC LETTER RREH FINAL FORM FB8C ; [.1CB9.0020.001A.FB8C] # ARABIC LETTER RREH ISOLATED FORM 0692 ; [.1CBA.0020.0002.0692] # ARABIC LETTER REH WITH SMALL V 0693 ; [.1CBB.0020.0002.0693] # ARABIC LETTER REH WITH RING 0694 ; [.1CBC.0020.0002.0694] # ARABIC LETTER REH WITH DOT BELOW 0695 ; [.1CBD.0020.0002.0695] # ARABIC LETTER REH WITH SMALL V BELOW 0696 ; [.1CBE.0020.0002.0696] # ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE 0697 ; [.1CBF.0020.0002.0697] # ARABIC LETTER REH WITH TWO DOTS ABOVE 0698 ; [.1CC0.0020.0002.0698] # ARABIC LETTER JEH FB8B ; [.1CC0.0020.0019.FB8B] # ARABIC LETTER JEH FINAL FORM FB8A ; [.1CC0.0020.001A.FB8A] # ARABIC LETTER JEH ISOLATED FORM 0699 ; [.1CC1.0020.0002.0699] # ARABIC LETTER REH WITH FOUR DOTS ABOVE 06EF ; [.1CC2.0020.0002.06EF] # ARABIC LETTER REH WITH INVERTED V 075B ; [.1CC3.0020.0002.075B] # ARABIC LETTER REH WITH STROKE 076B ; [.1CC4.0020.0002.076B] # ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE 076C ; [.1CC5.0020.0002.076C] # ARABIC LETTER REH WITH HAMZA ABOVE 0771 ; [.1CC6.0020.0002.0771] # ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS 08AA ; [.1CC7.0020.0002.08AA] # ARABIC LETTER REH WITH LOOP 0633 ; [.1CC8.0020.0002.0633] # ARABIC LETTER SEEN 1EE0E ; [.1CC8.0020.0005.1EE0E] # ARABIC MATHEMATICAL SEEN 1EE2E ; [.1CC8.0020.0005.1EE2E] # ARABIC MATHEMATICAL INITIAL SEEN 1EE4E ; [.1CC8.0020.0005.1EE4E] # ARABIC MATHEMATICAL TAILED SEEN 1EE6E ; [.1CC8.0020.0005.1EE6E] # ARABIC MATHEMATICAL STRETCHED SEEN 1EE8E ; [.1CC8.0020.0005.1EE8E] # ARABIC MATHEMATICAL LOOPED SEEN 1EEAE ; [.1CC8.0020.0005.1EEAE] # ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN FEB3 ; [.1CC8.0020.0017.FEB3] # ARABIC LETTER SEEN INITIAL FORM FEB4 ; [.1CC8.0020.0018.FEB4] # ARABIC LETTER SEEN MEDIAL FORM FEB2 ; [.1CC8.0020.0019.FEB2] # ARABIC LETTER SEEN FINAL FORM FEB1 ; [.1CC8.0020.001A.FEB1] # ARABIC LETTER SEEN ISOLATED FORM FCAD ; [.1CC8.0020.0017.FCAD][.1C97.0020.0017.FCAD] # ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM FD34 ; [.1CC8.0020.0018.FD34][.1C97.0020.0018.FD34] # ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM FC1C ; [.1CC8.0020.001A.FC1C][.1C97.0020.001A.FC1C] # ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM FD5D ; [.1CC8.0020.0017.FD5D][.1C97.0020.0017.FD5D][.1C9E.0020.001F.FD5D] # ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM FD5E ; [.1CC8.0020.0019.FD5E][.1C97.0020.0019.FD5E][.1D2C.0020.001F.FD5E] # ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM FCAE ; [.1CC8.0020.0017.FCAE][.1C9E.0020.0017.FCAE] # ARABIC LIGATURE SEEN WITH HAH INITIAL FORM FD35 ; [.1CC8.0020.0018.FD35][.1C9E.0020.0018.FD35] # ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM FC1D ; [.1CC8.0020.001A.FC1D][.1C9E.0020.001A.FC1D] # ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM FD5C ; [.1CC8.0020.0017.FD5C][.1C9E.0020.0017.FD5C][.1C97.0020.001F.FD5C] # ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM FCAF ; [.1CC8.0020.0017.FCAF][.1C9F.0020.0017.FCAF] # ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM FD36 ; [.1CC8.0020.0018.FD36][.1C9F.0020.0018.FD36] # ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM FC1E ; [.1CC8.0020.001A.FC1E][.1C9F.0020.001A.FC1E] # ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM FDA8 ; [.1CC8.0020.0019.FDA8][.1C9F.0020.0019.FDA8][.1D2C.0020.001F.FDA8] # ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM FDC6 ; [.1CC8.0020.0019.FDC6][.1C9F.0020.0019.FDC6][.1D2D.0020.001F.FDC6] # ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM FD2A ; [.1CC8.0020.0019.FD2A][.1CB7.0020.0019.FD2A] # ARABIC LIGATURE SEEN WITH REH FINAL FORM FD0E ; [.1CC8.0020.001A.FD0E][.1CB7.0020.001A.FD0E] # ARABIC LIGATURE SEEN WITH REH ISOLATED FORM FCB0 ; [.1CC8.0020.0017.FCB0][.1D0C.0020.0017.FCB0] # ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM FCE7 ; [.1CC8.0020.0018.FCE7][.1D0C.0020.0018.FCE7] # ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM FC1F ; [.1CC8.0020.001A.FC1F][.1D0C.0020.001A.FC1F] # ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM FD61 ; [.1CC8.0020.0017.FD61][.1D0C.0020.0017.FD61][.1C97.0020.001F.FD61] # ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM FD60 ; [.1CC8.0020.0017.FD60][.1D0C.0020.0017.FD60][.1C9E.0020.001F.FD60] # ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM FD5F ; [.1CC8.0020.0019.FD5F][.1D0C.0020.0019.FD5F][.1C9E.0020.001F.FD5F] # ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM FD63 ; [.1CC8.0020.0017.FD63][.1D0C.0020.0017.FD63][.1D0C.0020.001F.FD63] # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM FD62 ; [.1CC8.0020.0019.FD62][.1D0C.0020.0019.FD62][.1D0C.0020.001F.FD62] # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM FD31 ; [.1CC8.0020.0017.FD31][.1D19.0020.0017.FD31] # ARABIC LIGATURE SEEN WITH HEH INITIAL FORM FCE8 ; [.1CC8.0020.0018.FCE8][.1D19.0020.0018.FCE8] # ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM FD17 ; [.1CC8.0020.0019.FD17][.1D2C.0020.0019.FD17] # ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM FCFB ; [.1CC8.0020.001A.FCFB][.1D2C.0020.001A.FCFB] # ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM FD18 ; [.1CC8.0020.0019.FD18][.1D2D.0020.0019.FD18] # ARABIC LIGATURE SEEN WITH YEH FINAL FORM FCFC ; [.1CC8.0020.001A.FCFC][.1D2D.0020.001A.FCFC] # ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM 0634 ; [.1CC9.0020.0002.0634] # ARABIC LETTER SHEEN 1EE14 ; [.1CC9.0020.0005.1EE14] # ARABIC MATHEMATICAL SHEEN 1EE34 ; [.1CC9.0020.0005.1EE34] # ARABIC MATHEMATICAL INITIAL SHEEN 1EE54 ; [.1CC9.0020.0005.1EE54] # ARABIC MATHEMATICAL TAILED SHEEN 1EE74 ; [.1CC9.0020.0005.1EE74] # ARABIC MATHEMATICAL STRETCHED SHEEN 1EE94 ; [.1CC9.0020.0005.1EE94] # ARABIC MATHEMATICAL LOOPED SHEEN 1EEB4 ; [.1CC9.0020.0005.1EEB4] # ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN FEB7 ; [.1CC9.0020.0017.FEB7] # ARABIC LETTER SHEEN INITIAL FORM FEB8 ; [.1CC9.0020.0018.FEB8] # ARABIC LETTER SHEEN MEDIAL FORM FEB6 ; [.1CC9.0020.0019.FEB6] # ARABIC LETTER SHEEN FINAL FORM FEB5 ; [.1CC9.0020.001A.FEB5] # ARABIC LETTER SHEEN ISOLATED FORM FD2D ; [.1CC9.0020.0017.FD2D][.1C97.0020.0017.FD2D] # ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM FD37 ; [.1CC9.0020.0018.FD37][.1C97.0020.0018.FD37] # ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM FD25 ; [.1CC9.0020.0019.FD25][.1C97.0020.0019.FD25] # ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM FD09 ; [.1CC9.0020.001A.FD09][.1C97.0020.001A.FD09] # ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM FD69 ; [.1CC9.0020.0019.FD69][.1C97.0020.0019.FD69][.1D2D.0020.001F.FD69] # ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM FD2E ; [.1CC9.0020.0017.FD2E][.1C9E.0020.0017.FD2E] # ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM FD38 ; [.1CC9.0020.0018.FD38][.1C9E.0020.0018.FD38] # ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM FD26 ; [.1CC9.0020.0019.FD26][.1C9E.0020.0019.FD26] # ARABIC LIGATURE SHEEN WITH HAH FINAL FORM FD0A ; [.1CC9.0020.001A.FD0A][.1C9E.0020.001A.FD0A] # ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM FD68 ; [.1CC9.0020.0017.FD68][.1C9E.0020.0017.FD68][.1D0C.0020.001F.FD68] # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM FD67 ; [.1CC9.0020.0019.FD67][.1C9E.0020.0019.FD67][.1D0C.0020.001F.FD67] # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM FDAA ; [.1CC9.0020.0019.FDAA][.1C9E.0020.0019.FDAA][.1D2D.0020.001F.FDAA] # ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM FD2F ; [.1CC9.0020.0017.FD2F][.1C9F.0020.0017.FD2F] # ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM FD39 ; [.1CC9.0020.0018.FD39][.1C9F.0020.0018.FD39] # ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM FD27 ; [.1CC9.0020.0019.FD27][.1C9F.0020.0019.FD27] # ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM FD0B ; [.1CC9.0020.001A.FD0B][.1C9F.0020.001A.FD0B] # ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM FD29 ; [.1CC9.0020.0019.FD29][.1CB7.0020.0019.FD29] # ARABIC LIGATURE SHEEN WITH REH FINAL FORM FD0D ; [.1CC9.0020.001A.FD0D][.1CB7.0020.001A.FD0D] # ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM FD30 ; [.1CC9.0020.0017.FD30][.1D0C.0020.0017.FD30] # ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM FCE9 ; [.1CC9.0020.0018.FCE9][.1D0C.0020.0018.FCE9] # ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM FD28 ; [.1CC9.0020.0019.FD28][.1D0C.0020.0019.FD28] # ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM FD0C ; [.1CC9.0020.001A.FD0C][.1D0C.0020.001A.FD0C] # ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM FD6B ; [.1CC9.0020.0017.FD6B][.1D0C.0020.0017.FD6B][.1C9F.0020.001F.FD6B] # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM FD6A ; [.1CC9.0020.0019.FD6A][.1D0C.0020.0019.FD6A][.1C9F.0020.001F.FD6A] # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM FD6D ; [.1CC9.0020.0017.FD6D][.1D0C.0020.0017.FD6D][.1D0C.0020.001F.FD6D] # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM FD6C ; [.1CC9.0020.0019.FD6C][.1D0C.0020.0019.FD6C][.1D0C.0020.001F.FD6C] # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM FD32 ; [.1CC9.0020.0017.FD32][.1D19.0020.0017.FD32] # ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM FCEA ; [.1CC9.0020.0018.FCEA][.1D19.0020.0018.FCEA] # ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM FD19 ; [.1CC9.0020.0019.FD19][.1D2C.0020.0019.FD19] # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM FCFD ; [.1CC9.0020.001A.FCFD][.1D2C.0020.001A.FCFD] # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM FD1A ; [.1CC9.0020.0019.FD1A][.1D2D.0020.0019.FD1A] # ARABIC LIGATURE SHEEN WITH YEH FINAL FORM FCFE ; [.1CC9.0020.001A.FCFE][.1D2D.0020.001A.FCFE] # ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM 069A ; [.1CCA.0020.0002.069A] # ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE 069B ; [.1CCB.0020.0002.069B] # ARABIC LETTER SEEN WITH THREE DOTS BELOW 069C ; [.1CCC.0020.0002.069C] # ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE 06FA ; [.1CCD.0020.0002.06FA] # ARABIC LETTER SHEEN WITH DOT BELOW 075C ; [.1CCE.0020.0002.075C] # ARABIC LETTER SEEN WITH FOUR DOTS ABOVE 076D ; [.1CCF.0020.0002.076D] # ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE 0770 ; [.1CD0.0020.0002.0770] # ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS 077D ; [.1CD1.0020.0002.077D] # ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE 077E ; [.1CD2.0020.0002.077E] # ARABIC LETTER SEEN WITH INVERTED V 0635 ; [.1CD3.0020.0002.0635] # ARABIC LETTER SAD 1EE11 ; [.1CD3.0020.0005.1EE11] # ARABIC MATHEMATICAL SAD 1EE31 ; [.1CD3.0020.0005.1EE31] # ARABIC MATHEMATICAL INITIAL SAD 1EE51 ; [.1CD3.0020.0005.1EE51] # ARABIC MATHEMATICAL TAILED SAD 1EE71 ; [.1CD3.0020.0005.1EE71] # ARABIC MATHEMATICAL STRETCHED SAD 1EE91 ; [.1CD3.0020.0005.1EE91] # ARABIC MATHEMATICAL LOOPED SAD 1EEB1 ; [.1CD3.0020.0005.1EEB1] # ARABIC MATHEMATICAL DOUBLE-STRUCK SAD FEBB ; [.1CD3.0020.0017.FEBB] # ARABIC LETTER SAD INITIAL FORM FEBC ; [.1CD3.0020.0018.FEBC] # ARABIC LETTER SAD MEDIAL FORM FEBA ; [.1CD3.0020.0019.FEBA] # ARABIC LETTER SAD FINAL FORM FEB9 ; [.1CD3.0020.001A.FEB9] # ARABIC LETTER SAD ISOLATED FORM FCB1 ; [.1CD3.0020.0017.FCB1][.1C9E.0020.0017.FCB1] # ARABIC LIGATURE SAD WITH HAH INITIAL FORM FC20 ; [.1CD3.0020.001A.FC20][.1C9E.0020.001A.FC20] # ARABIC LIGATURE SAD WITH HAH ISOLATED FORM FD65 ; [.1CD3.0020.0017.FD65][.1C9E.0020.0017.FD65][.1C9E.0020.001F.FD65] # ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM FD64 ; [.1CD3.0020.0019.FD64][.1C9E.0020.0019.FD64][.1C9E.0020.001F.FD64] # ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM FDA9 ; [.1CD3.0020.0019.FDA9][.1C9E.0020.0019.FDA9][.1D2D.0020.001F.FDA9] # ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM FCB2 ; [.1CD3.0020.0017.FCB2][.1C9F.0020.0017.FCB2] # ARABIC LIGATURE SAD WITH KHAH INITIAL FORM FD2B ; [.1CD3.0020.0019.FD2B][.1CB7.0020.0019.FD2B] # ARABIC LIGATURE SAD WITH REH FINAL FORM FD0F ; [.1CD3.0020.001A.FD0F][.1CB7.0020.001A.FD0F] # ARABIC LIGATURE SAD WITH REH ISOLATED FORM FDF5 ; [.1CD3.0020.001A.FDF5][.1D05.0020.001A.FDF5][.1CDC.0020.001F.FDF5][.1D0C.0020.001F.FDF5] # ARABIC LIGATURE SALAM ISOLATED FORM FDF9 ; [.1CD3.0020.001A.FDF9][.1D05.0020.001A.FDF9][.1D2C.0020.001F.FDF9] # ARABIC LIGATURE SALLA ISOLATED FORM FDFA ; [.1CD3.0020.001A.FDFA][.1D05.0020.001A.FDFA][.1D2C.0020.001F.FDFA][*020A.0020.001F.FDFA][.1C81.0020.001F.FDFA][.1D05.0020.001F.FDFA][.1D05.0020.001F.FDFA][.1D19.0020.001F.FDFA][*020A.0020.001F.FDFA][.1CDC.0020.001F.FDFA][.1D05.0020.001F.FDFA][.1D2D.0020.001F.FDFA][.1D19.0020.001F.FDFA][*020A.0020.001F.FDFA][.1D1F.0020.001F.FDFA][.1CC8.0020.001F.FDFA][.1D05.0020.001F.FDFA][.1D0C.0020.001F.FDFA] # ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM FDF0 ; [.1CD3.0020.001A.FDF0][.1D05.0020.001A.FDF0][.1D3A.0020.001F.FDF0] # ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM FCB3 ; [.1CD3.0020.0017.FCB3][.1D0C.0020.0017.FCB3] # ARABIC LIGATURE SAD WITH MEEM INITIAL FORM FC21 ; [.1CD3.0020.001A.FC21][.1D0C.0020.001A.FC21] # ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM FDC5 ; [.1CD3.0020.0017.FDC5][.1D0C.0020.0017.FDC5][.1D0C.0020.001F.FDC5] # ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM FD66 ; [.1CD3.0020.0019.FD66][.1D0C.0020.0019.FD66][.1D0C.0020.001F.FD66] # ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM FD21 ; [.1CD3.0020.0019.FD21][.1D2C.0020.0019.FD21] # ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM FD05 ; [.1CD3.0020.001A.FD05][.1D2C.0020.001A.FD05] # ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM FD22 ; [.1CD3.0020.0019.FD22][.1D2D.0020.0019.FD22] # ARABIC LIGATURE SAD WITH YEH FINAL FORM FD06 ; [.1CD3.0020.001A.FD06][.1D2D.0020.001A.FD06] # ARABIC LIGATURE SAD WITH YEH ISOLATED FORM 0636 ; [.1CD4.0020.0002.0636] # ARABIC LETTER DAD 1EE19 ; [.1CD4.0020.0005.1EE19] # ARABIC MATHEMATICAL DAD 1EE39 ; [.1CD4.0020.0005.1EE39] # ARABIC MATHEMATICAL INITIAL DAD 1EE59 ; [.1CD4.0020.0005.1EE59] # ARABIC MATHEMATICAL TAILED DAD 1EE79 ; [.1CD4.0020.0005.1EE79] # ARABIC MATHEMATICAL STRETCHED DAD 1EE99 ; [.1CD4.0020.0005.1EE99] # ARABIC MATHEMATICAL LOOPED DAD 1EEB9 ; [.1CD4.0020.0005.1EEB9] # ARABIC MATHEMATICAL DOUBLE-STRUCK DAD FEBF ; [.1CD4.0020.0017.FEBF] # ARABIC LETTER DAD INITIAL FORM FEC0 ; [.1CD4.0020.0018.FEC0] # ARABIC LETTER DAD MEDIAL FORM FEBE ; [.1CD4.0020.0019.FEBE] # ARABIC LETTER DAD FINAL FORM FEBD ; [.1CD4.0020.001A.FEBD] # ARABIC LETTER DAD ISOLATED FORM FCB4 ; [.1CD4.0020.0017.FCB4][.1C97.0020.0017.FCB4] # ARABIC LIGATURE DAD WITH JEEM INITIAL FORM FC22 ; [.1CD4.0020.001A.FC22][.1C97.0020.001A.FC22] # ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM FCB5 ; [.1CD4.0020.0017.FCB5][.1C9E.0020.0017.FCB5] # ARABIC LIGATURE DAD WITH HAH INITIAL FORM FC23 ; [.1CD4.0020.001A.FC23][.1C9E.0020.001A.FC23] # ARABIC LIGATURE DAD WITH HAH ISOLATED FORM FD6E ; [.1CD4.0020.0019.FD6E][.1C9E.0020.0019.FD6E][.1D2C.0020.001F.FD6E] # ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM FDAB ; [.1CD4.0020.0019.FDAB][.1C9E.0020.0019.FDAB][.1D2D.0020.001F.FDAB] # ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM FCB6 ; [.1CD4.0020.0017.FCB6][.1C9F.0020.0017.FCB6] # ARABIC LIGATURE DAD WITH KHAH INITIAL FORM FC24 ; [.1CD4.0020.001A.FC24][.1C9F.0020.001A.FC24] # ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM FD70 ; [.1CD4.0020.0017.FD70][.1C9F.0020.0017.FD70][.1D0C.0020.001F.FD70] # ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM FD6F ; [.1CD4.0020.0019.FD6F][.1C9F.0020.0019.FD6F][.1D0C.0020.001F.FD6F] # ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM FD2C ; [.1CD4.0020.0019.FD2C][.1CB7.0020.0019.FD2C] # ARABIC LIGATURE DAD WITH REH FINAL FORM FD10 ; [.1CD4.0020.001A.FD10][.1CB7.0020.001A.FD10] # ARABIC LIGATURE DAD WITH REH ISOLATED FORM FCB7 ; [.1CD4.0020.0017.FCB7][.1D0C.0020.0017.FCB7] # ARABIC LIGATURE DAD WITH MEEM INITIAL FORM FC25 ; [.1CD4.0020.001A.FC25][.1D0C.0020.001A.FC25] # ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM FD23 ; [.1CD4.0020.0019.FD23][.1D2C.0020.0019.FD23] # ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM FD07 ; [.1CD4.0020.001A.FD07][.1D2C.0020.001A.FD07] # ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM FD24 ; [.1CD4.0020.0019.FD24][.1D2D.0020.0019.FD24] # ARABIC LIGATURE DAD WITH YEH FINAL FORM FD08 ; [.1CD4.0020.001A.FD08][.1D2D.0020.001A.FD08] # ARABIC LIGATURE DAD WITH YEH ISOLATED FORM 069D ; [.1CD5.0020.0002.069D] # ARABIC LETTER SAD WITH TWO DOTS BELOW 069E ; [.1CD6.0020.0002.069E] # ARABIC LETTER SAD WITH THREE DOTS ABOVE 06FB ; [.1CD7.0020.0002.06FB] # ARABIC LETTER DAD WITH DOT BELOW 0637 ; [.1CD8.0020.0002.0637] # ARABIC LETTER TAH 1EE08 ; [.1CD8.0020.0005.1EE08] # ARABIC MATHEMATICAL TAH 1EE68 ; [.1CD8.0020.0005.1EE68] # ARABIC MATHEMATICAL STRETCHED TAH 1EE88 ; [.1CD8.0020.0005.1EE88] # ARABIC MATHEMATICAL LOOPED TAH 1EEA8 ; [.1CD8.0020.0005.1EEA8] # ARABIC MATHEMATICAL DOUBLE-STRUCK TAH FEC3 ; [.1CD8.0020.0017.FEC3] # ARABIC LETTER TAH INITIAL FORM FEC4 ; [.1CD8.0020.0018.FEC4] # ARABIC LETTER TAH MEDIAL FORM FEC2 ; [.1CD8.0020.0019.FEC2] # ARABIC LETTER TAH FINAL FORM FEC1 ; [.1CD8.0020.001A.FEC1] # ARABIC LETTER TAH ISOLATED FORM FCB8 ; [.1CD8.0020.0017.FCB8][.1C9E.0020.0017.FCB8] # ARABIC LIGATURE TAH WITH HAH INITIAL FORM FC26 ; [.1CD8.0020.001A.FC26][.1C9E.0020.001A.FC26] # ARABIC LIGATURE TAH WITH HAH ISOLATED FORM FD33 ; [.1CD8.0020.0017.FD33][.1D0C.0020.0017.FD33] # ARABIC LIGATURE TAH WITH MEEM INITIAL FORM FD3A ; [.1CD8.0020.0018.FD3A][.1D0C.0020.0018.FD3A] # ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM FC27 ; [.1CD8.0020.001A.FC27][.1D0C.0020.001A.FC27] # ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM FD72 ; [.1CD8.0020.0017.FD72][.1D0C.0020.0017.FD72][.1C9E.0020.001F.FD72] # ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM FD71 ; [.1CD8.0020.0019.FD71][.1D0C.0020.0019.FD71][.1C9E.0020.001F.FD71] # ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM FD73 ; [.1CD8.0020.0017.FD73][.1D0C.0020.0017.FD73][.1D0C.0020.001F.FD73] # ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM FD74 ; [.1CD8.0020.0019.FD74][.1D0C.0020.0019.FD74][.1D2D.0020.001F.FD74] # ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM FD11 ; [.1CD8.0020.0019.FD11][.1D2C.0020.0019.FD11] # ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM FCF5 ; [.1CD8.0020.001A.FCF5][.1D2C.0020.001A.FCF5] # ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM FD12 ; [.1CD8.0020.0019.FD12][.1D2D.0020.0019.FD12] # ARABIC LIGATURE TAH WITH YEH FINAL FORM FCF6 ; [.1CD8.0020.001A.FCF6][.1D2D.0020.001A.FCF6] # ARABIC LIGATURE TAH WITH YEH ISOLATED FORM 0638 ; [.1CD9.0020.0002.0638] # ARABIC LETTER ZAH 1EE1A ; [.1CD9.0020.0005.1EE1A] # ARABIC MATHEMATICAL ZAH 1EE7A ; [.1CD9.0020.0005.1EE7A] # ARABIC MATHEMATICAL STRETCHED ZAH 1EE9A ; [.1CD9.0020.0005.1EE9A] # ARABIC MATHEMATICAL LOOPED ZAH 1EEBA ; [.1CD9.0020.0005.1EEBA] # ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH FEC7 ; [.1CD9.0020.0017.FEC7] # ARABIC LETTER ZAH INITIAL FORM FEC8 ; [.1CD9.0020.0018.FEC8] # ARABIC LETTER ZAH MEDIAL FORM FEC6 ; [.1CD9.0020.0019.FEC6] # ARABIC LETTER ZAH FINAL FORM FEC5 ; [.1CD9.0020.001A.FEC5] # ARABIC LETTER ZAH ISOLATED FORM FCB9 ; [.1CD9.0020.0017.FCB9][.1D0C.0020.0017.FCB9] # ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM FD3B ; [.1CD9.0020.0018.FD3B][.1D0C.0020.0018.FD3B] # ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM FC28 ; [.1CD9.0020.001A.FC28][.1D0C.0020.001A.FC28] # ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM 069F ; [.1CDA.0020.0002.069F] # ARABIC LETTER TAH WITH THREE DOTS ABOVE 08A3 ; [.1CDB.0020.0002.08A3] # ARABIC LETTER TAH WITH TWO DOTS ABOVE 0639 ; [.1CDC.0020.0002.0639] # ARABIC LETTER AIN 1EE0F ; [.1CDC.0020.0005.1EE0F] # ARABIC MATHEMATICAL AIN 1EE2F ; [.1CDC.0020.0005.1EE2F] # ARABIC MATHEMATICAL INITIAL AIN 1EE4F ; [.1CDC.0020.0005.1EE4F] # ARABIC MATHEMATICAL TAILED AIN 1EE6F ; [.1CDC.0020.0005.1EE6F] # ARABIC MATHEMATICAL STRETCHED AIN 1EE8F ; [.1CDC.0020.0005.1EE8F] # ARABIC MATHEMATICAL LOOPED AIN 1EEAF ; [.1CDC.0020.0005.1EEAF] # ARABIC MATHEMATICAL DOUBLE-STRUCK AIN FECB ; [.1CDC.0020.0017.FECB] # ARABIC LETTER AIN INITIAL FORM FECC ; [.1CDC.0020.0018.FECC] # ARABIC LETTER AIN MEDIAL FORM FECA ; [.1CDC.0020.0019.FECA] # ARABIC LETTER AIN FINAL FORM FEC9 ; [.1CDC.0020.001A.FEC9] # ARABIC LETTER AIN ISOLATED FORM FCBA ; [.1CDC.0020.0017.FCBA][.1C97.0020.0017.FCBA] # ARABIC LIGATURE AIN WITH JEEM INITIAL FORM FC29 ; [.1CDC.0020.001A.FC29][.1C97.0020.001A.FC29] # ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM FDC4 ; [.1CDC.0020.0017.FDC4][.1C97.0020.0017.FDC4][.1D0C.0020.001F.FDC4] # ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM FD75 ; [.1CDC.0020.0019.FD75][.1C97.0020.0019.FD75][.1D0C.0020.001F.FD75] # ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM FDF7 ; [.1CDC.0020.001A.FDF7][.1D05.0020.001A.FDF7][.1D2D.0020.001F.FDF7][.1D19.0020.001F.FDF7] # ARABIC LIGATURE ALAYHE ISOLATED FORM FCBB ; [.1CDC.0020.0017.FCBB][.1D0C.0020.0017.FCBB] # ARABIC LIGATURE AIN WITH MEEM INITIAL FORM FC2A ; [.1CDC.0020.001A.FC2A][.1D0C.0020.001A.FC2A] # ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM FD77 ; [.1CDC.0020.0017.FD77][.1D0C.0020.0017.FD77][.1D0C.0020.001F.FD77] # ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM FD76 ; [.1CDC.0020.0019.FD76][.1D0C.0020.0019.FD76][.1D0C.0020.001F.FD76] # ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM FD78 ; [.1CDC.0020.0019.FD78][.1D0C.0020.0019.FD78][.1D2C.0020.001F.FD78] # ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM FDB6 ; [.1CDC.0020.0019.FDB6][.1D0C.0020.0019.FDB6][.1D2D.0020.001F.FDB6] # ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM FD13 ; [.1CDC.0020.0019.FD13][.1D2C.0020.0019.FD13] # ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM FCF7 ; [.1CDC.0020.001A.FCF7][.1D2C.0020.001A.FCF7] # ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM FD14 ; [.1CDC.0020.0019.FD14][.1D2D.0020.0019.FD14] # ARABIC LIGATURE AIN WITH YEH FINAL FORM FCF8 ; [.1CDC.0020.001A.FCF8][.1D2D.0020.001A.FCF8] # ARABIC LIGATURE AIN WITH YEH ISOLATED FORM 063A ; [.1CDD.0020.0002.063A] # ARABIC LETTER GHAIN 1EE1B ; [.1CDD.0020.0005.1EE1B] # ARABIC MATHEMATICAL GHAIN 1EE3B ; [.1CDD.0020.0005.1EE3B] # ARABIC MATHEMATICAL INITIAL GHAIN 1EE5B ; [.1CDD.0020.0005.1EE5B] # ARABIC MATHEMATICAL TAILED GHAIN 1EE7B ; [.1CDD.0020.0005.1EE7B] # ARABIC MATHEMATICAL STRETCHED GHAIN 1EE9B ; [.1CDD.0020.0005.1EE9B] # ARABIC MATHEMATICAL LOOPED GHAIN 1EEBB ; [.1CDD.0020.0005.1EEBB] # ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN FECF ; [.1CDD.0020.0017.FECF] # ARABIC LETTER GHAIN INITIAL FORM FED0 ; [.1CDD.0020.0018.FED0] # ARABIC LETTER GHAIN MEDIAL FORM FECE ; [.1CDD.0020.0019.FECE] # ARABIC LETTER GHAIN FINAL FORM FECD ; [.1CDD.0020.001A.FECD] # ARABIC LETTER GHAIN ISOLATED FORM FCBC ; [.1CDD.0020.0017.FCBC][.1C97.0020.0017.FCBC] # ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM FC2B ; [.1CDD.0020.001A.FC2B][.1C97.0020.001A.FC2B] # ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM FCBD ; [.1CDD.0020.0017.FCBD][.1D0C.0020.0017.FCBD] # ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM FC2C ; [.1CDD.0020.001A.FC2C][.1D0C.0020.001A.FC2C] # ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM FD79 ; [.1CDD.0020.0019.FD79][.1D0C.0020.0019.FD79][.1D0C.0020.001F.FD79] # ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM FD7B ; [.1CDD.0020.0019.FD7B][.1D0C.0020.0019.FD7B][.1D2C.0020.001F.FD7B] # ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM FD7A ; [.1CDD.0020.0019.FD7A][.1D0C.0020.0019.FD7A][.1D2D.0020.001F.FD7A] # ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM FD15 ; [.1CDD.0020.0019.FD15][.1D2C.0020.0019.FD15] # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM FCF9 ; [.1CDD.0020.001A.FCF9][.1D2C.0020.001A.FCF9] # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM FD16 ; [.1CDD.0020.0019.FD16][.1D2D.0020.0019.FD16] # ARABIC LIGATURE GHAIN WITH YEH FINAL FORM FCFA ; [.1CDD.0020.001A.FCFA][.1D2D.0020.001A.FCFA] # ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM 06A0 ; [.1CDE.0020.0002.06A0] # ARABIC LETTER AIN WITH THREE DOTS ABOVE 06FC ; [.1CDF.0020.0002.06FC] # ARABIC LETTER GHAIN WITH DOT BELOW 075D ; [.1CE0.0020.0002.075D] # ARABIC LETTER AIN WITH TWO DOTS ABOVE 075E ; [.1CE1.0020.0002.075E] # ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE 075F ; [.1CE2.0020.0002.075F] # ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE 0641 ; [.1CE3.0020.0002.0641] # ARABIC LETTER FEH 1EE10 ; [.1CE3.0020.0005.1EE10] # ARABIC MATHEMATICAL FEH 1EE30 ; [.1CE3.0020.0005.1EE30] # ARABIC MATHEMATICAL INITIAL FEH 1EE70 ; [.1CE3.0020.0005.1EE70] # ARABIC MATHEMATICAL STRETCHED FEH 1EE90 ; [.1CE3.0020.0005.1EE90] # ARABIC MATHEMATICAL LOOPED FEH 1EEB0 ; [.1CE3.0020.0005.1EEB0] # ARABIC MATHEMATICAL DOUBLE-STRUCK FEH FED3 ; [.1CE3.0020.0017.FED3] # ARABIC LETTER FEH INITIAL FORM FED4 ; [.1CE3.0020.0018.FED4] # ARABIC LETTER FEH MEDIAL FORM FED2 ; [.1CE3.0020.0019.FED2] # ARABIC LETTER FEH FINAL FORM FED1 ; [.1CE3.0020.001A.FED1] # ARABIC LETTER FEH ISOLATED FORM FCBE ; [.1CE3.0020.0017.FCBE][.1C97.0020.0017.FCBE] # ARABIC LIGATURE FEH WITH JEEM INITIAL FORM FC2D ; [.1CE3.0020.001A.FC2D][.1C97.0020.001A.FC2D] # ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM FCBF ; [.1CE3.0020.0017.FCBF][.1C9E.0020.0017.FCBF] # ARABIC LIGATURE FEH WITH HAH INITIAL FORM FC2E ; [.1CE3.0020.001A.FC2E][.1C9E.0020.001A.FC2E] # ARABIC LIGATURE FEH WITH HAH ISOLATED FORM FCC0 ; [.1CE3.0020.0017.FCC0][.1C9F.0020.0017.FCC0] # ARABIC LIGATURE FEH WITH KHAH INITIAL FORM FC2F ; [.1CE3.0020.001A.FC2F][.1C9F.0020.001A.FC2F] # ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM FD7D ; [.1CE3.0020.0017.FD7D][.1C9F.0020.0017.FD7D][.1D0C.0020.001F.FD7D] # ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM FD7C ; [.1CE3.0020.0019.FD7C][.1C9F.0020.0019.FD7C][.1D0C.0020.001F.FD7C] # ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM FCC1 ; [.1CE3.0020.0017.FCC1][.1D0C.0020.0017.FCC1] # ARABIC LIGATURE FEH WITH MEEM INITIAL FORM FC30 ; [.1CE3.0020.001A.FC30][.1D0C.0020.001A.FC30] # ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM FDC1 ; [.1CE3.0020.0019.FDC1][.1D0C.0020.0019.FDC1][.1D2D.0020.001F.FDC1] # ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM FC7C ; [.1CE3.0020.0019.FC7C][.1D2C.0020.0019.FC7C] # ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM FC31 ; [.1CE3.0020.001A.FC31][.1D2C.0020.001A.FC31] # ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM FC7D ; [.1CE3.0020.0019.FC7D][.1D2D.0020.0019.FC7D] # ARABIC LIGATURE FEH WITH YEH FINAL FORM FC32 ; [.1CE3.0020.001A.FC32][.1D2D.0020.001A.FC32] # ARABIC LIGATURE FEH WITH YEH ISOLATED FORM 06A1 ; [.1CE4.0020.0002.06A1] # ARABIC LETTER DOTLESS FEH 1EE1E ; [.1CE4.0020.0005.1EE1E] # ARABIC MATHEMATICAL DOTLESS FEH 1EE7E ; [.1CE4.0020.0005.1EE7E] # ARABIC MATHEMATICAL STRETCHED DOTLESS FEH 06A2 ; [.1CE5.0020.0002.06A2] # ARABIC LETTER FEH WITH DOT MOVED BELOW 06A3 ; [.1CE6.0020.0002.06A3] # ARABIC LETTER FEH WITH DOT BELOW 06A4 ; [.1CE7.0020.0002.06A4] # ARABIC LETTER VEH FB6C ; [.1CE7.0020.0017.FB6C] # ARABIC LETTER VEH INITIAL FORM FB6D ; [.1CE7.0020.0018.FB6D] # ARABIC LETTER VEH MEDIAL FORM FB6B ; [.1CE7.0020.0019.FB6B] # ARABIC LETTER VEH FINAL FORM FB6A ; [.1CE7.0020.001A.FB6A] # ARABIC LETTER VEH ISOLATED FORM 08A4 ; [.1CE8.0020.0002.08A4] # ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE 06A5 ; [.1CE9.0020.0002.06A5] # ARABIC LETTER FEH WITH THREE DOTS BELOW 06A6 ; [.1CEA.0020.0002.06A6] # ARABIC LETTER PEHEH FB70 ; [.1CEA.0020.0017.FB70] # ARABIC LETTER PEHEH INITIAL FORM FB71 ; [.1CEA.0020.0018.FB71] # ARABIC LETTER PEHEH MEDIAL FORM FB6F ; [.1CEA.0020.0019.FB6F] # ARABIC LETTER PEHEH FINAL FORM FB6E ; [.1CEA.0020.001A.FB6E] # ARABIC LETTER PEHEH ISOLATED FORM 0760 ; [.1CEB.0020.0002.0760] # ARABIC LETTER FEH WITH TWO DOTS BELOW 0761 ; [.1CEC.0020.0002.0761] # ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW 066F ; [.1CED.0020.0002.066F] # ARABIC LETTER DOTLESS QAF 1EE1F ; [.1CED.0020.0005.1EE1F] # ARABIC MATHEMATICAL DOTLESS QAF 1EE5F ; [.1CED.0020.0005.1EE5F] # ARABIC MATHEMATICAL TAILED DOTLESS QAF 0642 ; [.1CEE.0020.0002.0642] # ARABIC LETTER QAF 1EE12 ; [.1CEE.0020.0005.1EE12] # ARABIC MATHEMATICAL QAF 1EE32 ; [.1CEE.0020.0005.1EE32] # ARABIC MATHEMATICAL INITIAL QAF 1EE52 ; [.1CEE.0020.0005.1EE52] # ARABIC MATHEMATICAL TAILED QAF 1EE72 ; [.1CEE.0020.0005.1EE72] # ARABIC MATHEMATICAL STRETCHED QAF 1EE92 ; [.1CEE.0020.0005.1EE92] # ARABIC MATHEMATICAL LOOPED QAF 1EEB2 ; [.1CEE.0020.0005.1EEB2] # ARABIC MATHEMATICAL DOUBLE-STRUCK QAF FED7 ; [.1CEE.0020.0017.FED7] # ARABIC LETTER QAF INITIAL FORM FED8 ; [.1CEE.0020.0018.FED8] # ARABIC LETTER QAF MEDIAL FORM FED6 ; [.1CEE.0020.0019.FED6] # ARABIC LETTER QAF FINAL FORM FED5 ; [.1CEE.0020.001A.FED5] # ARABIC LETTER QAF ISOLATED FORM FCC2 ; [.1CEE.0020.0017.FCC2][.1C9E.0020.0017.FCC2] # ARABIC LIGATURE QAF WITH HAH INITIAL FORM FC33 ; [.1CEE.0020.001A.FC33][.1C9E.0020.001A.FC33] # ARABIC LIGATURE QAF WITH HAH ISOLATED FORM FDF1 ; [.1CEE.0020.001A.FDF1][.1D05.0020.001A.FDF1][.1D3A.0020.001F.FDF1] # ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM FCC3 ; [.1CEE.0020.0017.FCC3][.1D0C.0020.0017.FCC3] # ARABIC LIGATURE QAF WITH MEEM INITIAL FORM FC34 ; [.1CEE.0020.001A.FC34][.1D0C.0020.001A.FC34] # ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM FDB4 ; [.1CEE.0020.0017.FDB4][.1D0C.0020.0017.FDB4][.1C9E.0020.001F.FDB4] # ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM FD7E ; [.1CEE.0020.0019.FD7E][.1D0C.0020.0019.FD7E][.1C9E.0020.001F.FD7E] # ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM FD7F ; [.1CEE.0020.0019.FD7F][.1D0C.0020.0019.FD7F][.1D0C.0020.001F.FD7F] # ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM FDB2 ; [.1CEE.0020.0019.FDB2][.1D0C.0020.0019.FDB2][.1D2D.0020.001F.FDB2] # ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM FC7E ; [.1CEE.0020.0019.FC7E][.1D2C.0020.0019.FC7E] # ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM FC35 ; [.1CEE.0020.001A.FC35][.1D2C.0020.001A.FC35] # ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM FC7F ; [.1CEE.0020.0019.FC7F][.1D2D.0020.0019.FC7F] # ARABIC LIGATURE QAF WITH YEH FINAL FORM FC36 ; [.1CEE.0020.001A.FC36][.1D2D.0020.001A.FC36] # ARABIC LIGATURE QAF WITH YEH ISOLATED FORM 06A7 ; [.1CEF.0020.0002.06A7] # ARABIC LETTER QAF WITH DOT ABOVE 06A8 ; [.1CF0.0020.0002.06A8] # ARABIC LETTER QAF WITH THREE DOTS ABOVE 08A5 ; [.1CF1.0020.0002.08A5] # ARABIC LETTER QAF WITH DOT BELOW 0643 ; [.1CF2.0020.0002.0643] # ARABIC LETTER KAF 1EE0A ; [.1CF2.0020.0005.1EE0A] # ARABIC MATHEMATICAL KAF 1EE2A ; [.1CF2.0020.0005.1EE2A] # ARABIC MATHEMATICAL INITIAL KAF 1EE6A ; [.1CF2.0020.0005.1EE6A] # ARABIC MATHEMATICAL STRETCHED KAF FEDB ; [.1CF2.0020.0017.FEDB] # ARABIC LETTER KAF INITIAL FORM FEDC ; [.1CF2.0020.0018.FEDC] # ARABIC LETTER KAF MEDIAL FORM FEDA ; [.1CF2.0020.0019.FEDA] # ARABIC LETTER KAF FINAL FORM FED9 ; [.1CF2.0020.001A.FED9] # ARABIC LETTER KAF ISOLATED FORM FC80 ; [.1CF2.0020.0019.FC80][.1C81.0020.0019.FC80] # ARABIC LIGATURE KAF WITH ALEF FINAL FORM FC37 ; [.1CF2.0020.001A.FC37][.1C81.0020.001A.FC37] # ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM FCC4 ; [.1CF2.0020.0017.FCC4][.1C97.0020.0017.FCC4] # ARABIC LIGATURE KAF WITH JEEM INITIAL FORM FC38 ; [.1CF2.0020.001A.FC38][.1C97.0020.001A.FC38] # ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM FCC5 ; [.1CF2.0020.0017.FCC5][.1C9E.0020.0017.FCC5] # ARABIC LIGATURE KAF WITH HAH INITIAL FORM FC39 ; [.1CF2.0020.001A.FC39][.1C9E.0020.001A.FC39] # ARABIC LIGATURE KAF WITH HAH ISOLATED FORM FCC6 ; [.1CF2.0020.0017.FCC6][.1C9F.0020.0017.FCC6] # ARABIC LIGATURE KAF WITH KHAH INITIAL FORM FC3A ; [.1CF2.0020.001A.FC3A][.1C9F.0020.001A.FC3A] # ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM FCC7 ; [.1CF2.0020.0017.FCC7][.1D05.0020.0017.FCC7] # ARABIC LIGATURE KAF WITH LAM INITIAL FORM FCEB ; [.1CF2.0020.0018.FCEB][.1D05.0020.0018.FCEB] # ARABIC LIGATURE KAF WITH LAM MEDIAL FORM FC81 ; [.1CF2.0020.0019.FC81][.1D05.0020.0019.FC81] # ARABIC LIGATURE KAF WITH LAM FINAL FORM FC3B ; [.1CF2.0020.001A.FC3B][.1D05.0020.001A.FC3B] # ARABIC LIGATURE KAF WITH LAM ISOLATED FORM FCC8 ; [.1CF2.0020.0017.FCC8][.1D0C.0020.0017.FCC8] # ARABIC LIGATURE KAF WITH MEEM INITIAL FORM FCEC ; [.1CF2.0020.0018.FCEC][.1D0C.0020.0018.FCEC] # ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM FC82 ; [.1CF2.0020.0019.FC82][.1D0C.0020.0019.FC82] # ARABIC LIGATURE KAF WITH MEEM FINAL FORM FC3C ; [.1CF2.0020.001A.FC3C][.1D0C.0020.001A.FC3C] # ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM FDC3 ; [.1CF2.0020.0017.FDC3][.1D0C.0020.0017.FDC3][.1D0C.0020.001F.FDC3] # ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM FDBB ; [.1CF2.0020.0019.FDBB][.1D0C.0020.0019.FDBB][.1D0C.0020.001F.FDBB] # ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM FDB7 ; [.1CF2.0020.0019.FDB7][.1D0C.0020.0019.FDB7][.1D2D.0020.001F.FDB7] # ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM FC83 ; [.1CF2.0020.0019.FC83][.1D2C.0020.0019.FC83] # ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM FC3D ; [.1CF2.0020.001A.FC3D][.1D2C.0020.001A.FC3D] # ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM FC84 ; [.1CF2.0020.0019.FC84][.1D2D.0020.0019.FC84] # ARABIC LIGATURE KAF WITH YEH FINAL FORM FC3E ; [.1CF2.0020.001A.FC3E][.1D2D.0020.001A.FC3E] # ARABIC LIGATURE KAF WITH YEH ISOLATED FORM 06A9 ; [.1CF3.0020.0002.06A9] # ARABIC LETTER KEHEH FB90 ; [.1CF3.0020.0017.FB90] # ARABIC LETTER KEHEH INITIAL FORM FB91 ; [.1CF3.0020.0018.FB91] # ARABIC LETTER KEHEH MEDIAL FORM FB8F ; [.1CF3.0020.0019.FB8F] # ARABIC LETTER KEHEH FINAL FORM FB8E ; [.1CF3.0020.001A.FB8E] # ARABIC LETTER KEHEH ISOLATED FORM 06AA ; [.1CF4.0020.0002.06AA] # ARABIC LETTER SWASH KAF 06AB ; [.1CF5.0020.0002.06AB] # ARABIC LETTER KAF WITH RING 06AC ; [.1CF6.0020.0002.06AC] # ARABIC LETTER KAF WITH DOT ABOVE 077F ; [.1CF7.0020.0002.077F] # ARABIC LETTER KAF WITH TWO DOTS ABOVE 06AD ; [.1CF8.0020.0002.06AD] # ARABIC LETTER NG FBD5 ; [.1CF8.0020.0017.FBD5] # ARABIC LETTER NG INITIAL FORM FBD6 ; [.1CF8.0020.0018.FBD6] # ARABIC LETTER NG MEDIAL FORM FBD4 ; [.1CF8.0020.0019.FBD4] # ARABIC LETTER NG FINAL FORM FBD3 ; [.1CF8.0020.001A.FBD3] # ARABIC LETTER NG ISOLATED FORM 06AE ; [.1CF9.0020.0002.06AE] # ARABIC LETTER KAF WITH THREE DOTS BELOW 06AF ; [.1CFA.0020.0002.06AF] # ARABIC LETTER GAF FB94 ; [.1CFA.0020.0017.FB94] # ARABIC LETTER GAF INITIAL FORM FB95 ; [.1CFA.0020.0018.FB95] # ARABIC LETTER GAF MEDIAL FORM FB93 ; [.1CFA.0020.0019.FB93] # ARABIC LETTER GAF FINAL FORM FB92 ; [.1CFA.0020.001A.FB92] # ARABIC LETTER GAF ISOLATED FORM 06B0 ; [.1CFB.0020.0002.06B0] # ARABIC LETTER GAF WITH RING 06B1 ; [.1CFC.0020.0002.06B1] # ARABIC LETTER NGOEH FB9C ; [.1CFC.0020.0017.FB9C] # ARABIC LETTER NGOEH INITIAL FORM FB9D ; [.1CFC.0020.0018.FB9D] # ARABIC LETTER NGOEH MEDIAL FORM FB9B ; [.1CFC.0020.0019.FB9B] # ARABIC LETTER NGOEH FINAL FORM FB9A ; [.1CFC.0020.001A.FB9A] # ARABIC LETTER NGOEH ISOLATED FORM 06B2 ; [.1CFD.0020.0002.06B2] # ARABIC LETTER GAF WITH TWO DOTS BELOW 06B3 ; [.1CFE.0020.0002.06B3] # ARABIC LETTER GUEH FB98 ; [.1CFE.0020.0017.FB98] # ARABIC LETTER GUEH INITIAL FORM FB99 ; [.1CFE.0020.0018.FB99] # ARABIC LETTER GUEH MEDIAL FORM FB97 ; [.1CFE.0020.0019.FB97] # ARABIC LETTER GUEH FINAL FORM FB96 ; [.1CFE.0020.001A.FB96] # ARABIC LETTER GUEH ISOLATED FORM 06B4 ; [.1CFF.0020.0002.06B4] # ARABIC LETTER GAF WITH THREE DOTS ABOVE 0762 ; [.1D00.0020.0002.0762] # ARABIC LETTER KEHEH WITH DOT ABOVE 063B ; [.1D01.0020.0002.063B] # ARABIC LETTER KEHEH WITH TWO DOTS ABOVE 063C ; [.1D02.0020.0002.063C] # ARABIC LETTER KEHEH WITH THREE DOTS BELOW 0763 ; [.1D03.0020.0002.0763] # ARABIC LETTER KEHEH WITH THREE DOTS ABOVE 0764 ; [.1D04.0020.0002.0764] # ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW 0644 ; [.1D05.0020.0002.0644] # ARABIC LETTER LAM 1EE0B ; [.1D05.0020.0005.1EE0B] # ARABIC MATHEMATICAL LAM 1EE2B ; [.1D05.0020.0005.1EE2B] # ARABIC MATHEMATICAL INITIAL LAM 1EE4B ; [.1D05.0020.0005.1EE4B] # ARABIC MATHEMATICAL TAILED LAM 1EE8B ; [.1D05.0020.0005.1EE8B] # ARABIC MATHEMATICAL LOOPED LAM 1EEAB ; [.1D05.0020.0005.1EEAB] # ARABIC MATHEMATICAL DOUBLE-STRUCK LAM FEDF ; [.1D05.0020.0017.FEDF] # ARABIC LETTER LAM INITIAL FORM FEE0 ; [.1D05.0020.0018.FEE0] # ARABIC LETTER LAM MEDIAL FORM FEDE ; [.1D05.0020.0019.FEDE] # ARABIC LETTER LAM FINAL FORM FEDD ; [.1D05.0020.001A.FEDD] # ARABIC LETTER LAM ISOLATED FORM FEF6 ; [.1D05.0020.0019.FEF6][.1C74.0020.0019.FEF6] # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM FEF5 ; [.1D05.0020.001A.FEF5][.1C74.0020.001A.FEF5] # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM FEF8 ; [.1D05.0020.0019.FEF8][.1C75.0020.0019.FEF8] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM FEF7 ; [.1D05.0020.001A.FEF7][.1C75.0020.001A.FEF7] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM FEFA ; [.1D05.0020.0019.FEFA][.1C79.0020.0019.FEFA] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM FEF9 ; [.1D05.0020.001A.FEF9][.1C79.0020.001A.FEF9] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM FEFC ; [.1D05.0020.0019.FEFC][.1C81.0020.0019.FEFC] # ARABIC LIGATURE LAM WITH ALEF FINAL FORM FEFB ; [.1D05.0020.001A.FEFB][.1C81.0020.001A.FEFB] # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM FCC9 ; [.1D05.0020.0017.FCC9][.1C97.0020.0017.FCC9] # ARABIC LIGATURE LAM WITH JEEM INITIAL FORM FC3F ; [.1D05.0020.001A.FC3F][.1C97.0020.001A.FC3F] # ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM FD83 ; [.1D05.0020.0017.FD83][.1C97.0020.0017.FD83][.1C97.0020.001F.FD83] # ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM FD84 ; [.1D05.0020.0019.FD84][.1C97.0020.0019.FD84][.1C97.0020.001F.FD84] # ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM FDBA ; [.1D05.0020.0017.FDBA][.1C97.0020.0017.FDBA][.1D0C.0020.001F.FDBA] # ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM FDBC ; [.1D05.0020.0019.FDBC][.1C97.0020.0019.FDBC][.1D0C.0020.001F.FDBC] # ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM FDAC ; [.1D05.0020.0019.FDAC][.1C97.0020.0019.FDAC][.1D2D.0020.001F.FDAC] # ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM FCCA ; [.1D05.0020.0017.FCCA][.1C9E.0020.0017.FCCA] # ARABIC LIGATURE LAM WITH HAH INITIAL FORM FC40 ; [.1D05.0020.001A.FC40][.1C9E.0020.001A.FC40] # ARABIC LIGATURE LAM WITH HAH ISOLATED FORM FDB5 ; [.1D05.0020.0017.FDB5][.1C9E.0020.0017.FDB5][.1D0C.0020.001F.FDB5] # ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM FD80 ; [.1D05.0020.0019.FD80][.1C9E.0020.0019.FD80][.1D0C.0020.001F.FD80] # ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM FD82 ; [.1D05.0020.0019.FD82][.1C9E.0020.0019.FD82][.1D2C.0020.001F.FD82] # ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM FD81 ; [.1D05.0020.0019.FD81][.1C9E.0020.0019.FD81][.1D2D.0020.001F.FD81] # ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM FCCB ; [.1D05.0020.0017.FCCB][.1C9F.0020.0017.FCCB] # ARABIC LIGATURE LAM WITH KHAH INITIAL FORM FC41 ; [.1D05.0020.001A.FC41][.1C9F.0020.001A.FC41] # ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM FD86 ; [.1D05.0020.0017.FD86][.1C9F.0020.0017.FD86][.1D0C.0020.001F.FD86] # ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM FD85 ; [.1D05.0020.0019.FD85][.1C9F.0020.0019.FD85][.1D0C.0020.001F.FD85] # ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM FCCC ; [.1D05.0020.0017.FCCC][.1D0C.0020.0017.FCCC] # ARABIC LIGATURE LAM WITH MEEM INITIAL FORM FCED ; [.1D05.0020.0018.FCED][.1D0C.0020.0018.FCED] # ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM FC85 ; [.1D05.0020.0019.FC85][.1D0C.0020.0019.FC85] # ARABIC LIGATURE LAM WITH MEEM FINAL FORM FC42 ; [.1D05.0020.001A.FC42][.1D0C.0020.001A.FC42] # ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM FD88 ; [.1D05.0020.0017.FD88][.1D0C.0020.0017.FD88][.1C9E.0020.001F.FD88] # ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM FD87 ; [.1D05.0020.0019.FD87][.1D0C.0020.0019.FD87][.1C9E.0020.001F.FD87] # ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM FDAD ; [.1D05.0020.0019.FDAD][.1D0C.0020.0019.FDAD][.1D2D.0020.001F.FDAD] # ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM FCCD ; [.1D05.0020.0017.FCCD][.1D19.0020.0017.FCCD] # ARABIC LIGATURE LAM WITH HEH INITIAL FORM FC86 ; [.1D05.0020.0019.FC86][.1D2C.0020.0019.FC86] # ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM FC43 ; [.1D05.0020.001A.FC43][.1D2C.0020.001A.FC43] # ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM FC87 ; [.1D05.0020.0019.FC87][.1D2D.0020.0019.FC87] # ARABIC LIGATURE LAM WITH YEH FINAL FORM FC44 ; [.1D05.0020.001A.FC44][.1D2D.0020.001A.FC44] # ARABIC LIGATURE LAM WITH YEH ISOLATED FORM 06B5 ; [.1D06.0020.0002.06B5] # ARABIC LETTER LAM WITH SMALL V 06B6 ; [.1D07.0020.0002.06B6] # ARABIC LETTER LAM WITH DOT ABOVE 06B7 ; [.1D08.0020.0002.06B7] # ARABIC LETTER LAM WITH THREE DOTS ABOVE 06B8 ; [.1D09.0020.0002.06B8] # ARABIC LETTER LAM WITH THREE DOTS BELOW 076A ; [.1D0A.0020.0002.076A] # ARABIC LETTER LAM WITH BAR 08A6 ; [.1D0B.0020.0002.08A6] # ARABIC LETTER LAM WITH DOUBLE BAR 0645 ; [.1D0C.0020.0002.0645] # ARABIC LETTER MEEM 1EE0C ; [.1D0C.0020.0005.1EE0C] # ARABIC MATHEMATICAL MEEM 1EE2C ; [.1D0C.0020.0005.1EE2C] # ARABIC MATHEMATICAL INITIAL MEEM 1EE6C ; [.1D0C.0020.0005.1EE6C] # ARABIC MATHEMATICAL STRETCHED MEEM 1EE8C ; [.1D0C.0020.0005.1EE8C] # ARABIC MATHEMATICAL LOOPED MEEM 1EEAC ; [.1D0C.0020.0005.1EEAC] # ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM FEE3 ; [.1D0C.0020.0017.FEE3] # ARABIC LETTER MEEM INITIAL FORM FEE4 ; [.1D0C.0020.0018.FEE4] # ARABIC LETTER MEEM MEDIAL FORM FEE2 ; [.1D0C.0020.0019.FEE2] # ARABIC LETTER MEEM FINAL FORM FEE1 ; [.1D0C.0020.001A.FEE1] # ARABIC LETTER MEEM ISOLATED FORM 06FE ; [.1D0C.0020.0004.06FE][.0000.013A.0004.06FE] # ARABIC SIGN SINDHI POSTPOSITION MEN FC88 ; [.1D0C.0020.0019.FC88][.1C81.0020.0019.FC88] # ARABIC LIGATURE MEEM WITH ALEF FINAL FORM FCCE ; [.1D0C.0020.0017.FCCE][.1C97.0020.0017.FCCE] # ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM FC45 ; [.1D0C.0020.001A.FC45][.1C97.0020.001A.FC45] # ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM FD8C ; [.1D0C.0020.0017.FD8C][.1C97.0020.0017.FD8C][.1C9E.0020.001F.FD8C] # ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM FD92 ; [.1D0C.0020.0017.FD92][.1C97.0020.0017.FD92][.1C9F.0020.001F.FD92] # ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM FD8D ; [.1D0C.0020.0017.FD8D][.1C97.0020.0017.FD8D][.1D0C.0020.001F.FD8D] # ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM FDC0 ; [.1D0C.0020.0019.FDC0][.1C97.0020.0019.FDC0][.1D2D.0020.001F.FDC0] # ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM FCCF ; [.1D0C.0020.0017.FCCF][.1C9E.0020.0017.FCCF] # ARABIC LIGATURE MEEM WITH HAH INITIAL FORM FC46 ; [.1D0C.0020.001A.FC46][.1C9E.0020.001A.FC46] # ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM FD89 ; [.1D0C.0020.0017.FD89][.1C9E.0020.0017.FD89][.1C97.0020.001F.FD89] # ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM FD8A ; [.1D0C.0020.0017.FD8A][.1C9E.0020.0017.FD8A][.1D0C.0020.001F.FD8A] # ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM FDF4 ; [.1D0C.0020.001A.FDF4][.1C9E.0020.001A.FDF4][.1D0C.0020.001F.FDF4][.1CA9.0020.001F.FDF4] # ARABIC LIGATURE MOHAMMAD ISOLATED FORM FD8B ; [.1D0C.0020.0019.FD8B][.1C9E.0020.0019.FD8B][.1D2D.0020.001F.FD8B] # ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM FCD0 ; [.1D0C.0020.0017.FCD0][.1C9F.0020.0017.FCD0] # ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM FC47 ; [.1D0C.0020.001A.FC47][.1C9F.0020.001A.FC47] # ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM FD8E ; [.1D0C.0020.0017.FD8E][.1C9F.0020.0017.FD8E][.1C97.0020.001F.FD8E] # ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM FD8F ; [.1D0C.0020.0017.FD8F][.1C9F.0020.0017.FD8F][.1D0C.0020.001F.FD8F] # ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM FDB9 ; [.1D0C.0020.0019.FDB9][.1C9F.0020.0019.FDB9][.1D2D.0020.001F.FDB9] # ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM FCD1 ; [.1D0C.0020.0017.FCD1][.1D0C.0020.0017.FCD1] # ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM FC89 ; [.1D0C.0020.0019.FC89][.1D0C.0020.0019.FC89] # ARABIC LIGATURE MEEM WITH MEEM FINAL FORM FC48 ; [.1D0C.0020.001A.FC48][.1D0C.0020.001A.FC48] # ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM FDB1 ; [.1D0C.0020.0019.FDB1][.1D0C.0020.0019.FDB1][.1D2D.0020.001F.FDB1] # ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM FC49 ; [.1D0C.0020.001A.FC49][.1D2C.0020.001A.FC49] # ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM FC4A ; [.1D0C.0020.001A.FC4A][.1D2D.0020.001A.FC4A] # ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM 0765 ; [.1D0D.0020.0002.0765] # ARABIC LETTER MEEM WITH DOT ABOVE 0766 ; [.1D0E.0020.0002.0766] # ARABIC LETTER MEEM WITH DOT BELOW 08A7 ; [.1D0F.0020.0002.08A7] # ARABIC LETTER MEEM WITH THREE DOTS ABOVE 0646 ; [.1D10.0020.0002.0646] # ARABIC LETTER NOON 1EE0D ; [.1D10.0020.0005.1EE0D] # ARABIC MATHEMATICAL NOON 1EE2D ; [.1D10.0020.0005.1EE2D] # ARABIC MATHEMATICAL INITIAL NOON 1EE4D ; [.1D10.0020.0005.1EE4D] # ARABIC MATHEMATICAL TAILED NOON 1EE6D ; [.1D10.0020.0005.1EE6D] # ARABIC MATHEMATICAL STRETCHED NOON 1EE8D ; [.1D10.0020.0005.1EE8D] # ARABIC MATHEMATICAL LOOPED NOON 1EEAD ; [.1D10.0020.0005.1EEAD] # ARABIC MATHEMATICAL DOUBLE-STRUCK NOON FEE7 ; [.1D10.0020.0017.FEE7] # ARABIC LETTER NOON INITIAL FORM FEE8 ; [.1D10.0020.0018.FEE8] # ARABIC LETTER NOON MEDIAL FORM FEE6 ; [.1D10.0020.0019.FEE6] # ARABIC LETTER NOON FINAL FORM FEE5 ; [.1D10.0020.001A.FEE5] # ARABIC LETTER NOON ISOLATED FORM FCD2 ; [.1D10.0020.0017.FCD2][.1C97.0020.0017.FCD2] # ARABIC LIGATURE NOON WITH JEEM INITIAL FORM FC4B ; [.1D10.0020.001A.FC4B][.1C97.0020.001A.FC4B] # ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM FDB8 ; [.1D10.0020.0017.FDB8][.1C97.0020.0017.FDB8][.1C9E.0020.001F.FDB8] # ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM FDBD ; [.1D10.0020.0019.FDBD][.1C97.0020.0019.FDBD][.1C9E.0020.001F.FDBD] # ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM FD98 ; [.1D10.0020.0017.FD98][.1C97.0020.0017.FD98][.1D0C.0020.001F.FD98] # ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM FD97 ; [.1D10.0020.0019.FD97][.1C97.0020.0019.FD97][.1D0C.0020.001F.FD97] # ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM FD99 ; [.1D10.0020.0019.FD99][.1C97.0020.0019.FD99][.1D2C.0020.001F.FD99] # ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM FDC7 ; [.1D10.0020.0019.FDC7][.1C97.0020.0019.FDC7][.1D2D.0020.001F.FDC7] # ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM FCD3 ; [.1D10.0020.0017.FCD3][.1C9E.0020.0017.FCD3] # ARABIC LIGATURE NOON WITH HAH INITIAL FORM FC4C ; [.1D10.0020.001A.FC4C][.1C9E.0020.001A.FC4C] # ARABIC LIGATURE NOON WITH HAH ISOLATED FORM FD95 ; [.1D10.0020.0017.FD95][.1C9E.0020.0017.FD95][.1D0C.0020.001F.FD95] # ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM FD96 ; [.1D10.0020.0019.FD96][.1C9E.0020.0019.FD96][.1D2C.0020.001F.FD96] # ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM FDB3 ; [.1D10.0020.0019.FDB3][.1C9E.0020.0019.FDB3][.1D2D.0020.001F.FDB3] # ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM FCD4 ; [.1D10.0020.0017.FCD4][.1C9F.0020.0017.FCD4] # ARABIC LIGATURE NOON WITH KHAH INITIAL FORM FC4D ; [.1D10.0020.001A.FC4D][.1C9F.0020.001A.FC4D] # ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM FC8A ; [.1D10.0020.0019.FC8A][.1CB7.0020.0019.FC8A] # ARABIC LIGATURE NOON WITH REH FINAL FORM FC8B ; [.1D10.0020.0019.FC8B][.1CB8.0020.0019.FC8B] # ARABIC LIGATURE NOON WITH ZAIN FINAL FORM FCD5 ; [.1D10.0020.0017.FCD5][.1D0C.0020.0017.FCD5] # ARABIC LIGATURE NOON WITH MEEM INITIAL FORM FCEE ; [.1D10.0020.0018.FCEE][.1D0C.0020.0018.FCEE] # ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM FC8C ; [.1D10.0020.0019.FC8C][.1D0C.0020.0019.FC8C] # ARABIC LIGATURE NOON WITH MEEM FINAL FORM FC4E ; [.1D10.0020.001A.FC4E][.1D0C.0020.001A.FC4E] # ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM FD9B ; [.1D10.0020.0019.FD9B][.1D0C.0020.0019.FD9B][.1D2C.0020.001F.FD9B] # ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM FD9A ; [.1D10.0020.0019.FD9A][.1D0C.0020.0019.FD9A][.1D2D.0020.001F.FD9A] # ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM FC8D ; [.1D10.0020.0019.FC8D][.1D10.0020.0019.FC8D] # ARABIC LIGATURE NOON WITH NOON FINAL FORM FCD6 ; [.1D10.0020.0017.FCD6][.1D19.0020.0017.FCD6] # ARABIC LIGATURE NOON WITH HEH INITIAL FORM FCEF ; [.1D10.0020.0018.FCEF][.1D19.0020.0018.FCEF] # ARABIC LIGATURE NOON WITH HEH MEDIAL FORM FC8E ; [.1D10.0020.0019.FC8E][.1D2C.0020.0019.FC8E] # ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM FC4F ; [.1D10.0020.001A.FC4F][.1D2C.0020.001A.FC4F] # ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM FC8F ; [.1D10.0020.0019.FC8F][.1D2D.0020.0019.FC8F] # ARABIC LIGATURE NOON WITH YEH FINAL FORM FC50 ; [.1D10.0020.001A.FC50][.1D2D.0020.001A.FC50] # ARABIC LIGATURE NOON WITH YEH ISOLATED FORM 06BA ; [.1D11.0020.0002.06BA] # ARABIC LETTER NOON GHUNNA 1EE1D ; [.1D11.0020.0005.1EE1D] # ARABIC MATHEMATICAL DOTLESS NOON 1EE5D ; [.1D11.0020.0005.1EE5D] # ARABIC MATHEMATICAL TAILED DOTLESS NOON FB9F ; [.1D11.0020.0019.FB9F] # ARABIC LETTER NOON GHUNNA FINAL FORM FB9E ; [.1D11.0020.001A.FB9E] # ARABIC LETTER NOON GHUNNA ISOLATED FORM 06BB ; [.1D12.0020.0002.06BB] # ARABIC LETTER RNOON FBA2 ; [.1D12.0020.0017.FBA2] # ARABIC LETTER RNOON INITIAL FORM FBA3 ; [.1D12.0020.0018.FBA3] # ARABIC LETTER RNOON MEDIAL FORM FBA1 ; [.1D12.0020.0019.FBA1] # ARABIC LETTER RNOON FINAL FORM FBA0 ; [.1D12.0020.001A.FBA0] # ARABIC LETTER RNOON ISOLATED FORM 06BC ; [.1D13.0020.0002.06BC] # ARABIC LETTER NOON WITH RING 06BD ; [.1D14.0020.0002.06BD] # ARABIC LETTER NOON WITH THREE DOTS ABOVE 06B9 ; [.1D15.0020.0002.06B9] # ARABIC LETTER NOON WITH DOT BELOW 0767 ; [.1D16.0020.0002.0767] # ARABIC LETTER NOON WITH TWO DOTS BELOW 0768 ; [.1D17.0020.0002.0768] # ARABIC LETTER NOON WITH SMALL TAH 0769 ; [.1D18.0020.0002.0769] # ARABIC LETTER NOON WITH SMALL V 0647 ; [.1D19.0020.0002.0647] # ARABIC LETTER HEH 1EE24 ; [.1D19.0020.0005.1EE24] # ARABIC MATHEMATICAL INITIAL HEH 1EE64 ; [.1D19.0020.0005.1EE64] # ARABIC MATHEMATICAL STRETCHED HEH 1EE84 ; [.1D19.0020.0005.1EE84] # ARABIC MATHEMATICAL LOOPED HEH FEEB ; [.1D19.0020.0017.FEEB] # ARABIC LETTER HEH INITIAL FORM FEEC ; [.1D19.0020.0018.FEEC] # ARABIC LETTER HEH MEDIAL FORM FEEA ; [.1D19.0020.0019.FEEA] # ARABIC LETTER HEH FINAL FORM FEE9 ; [.1D19.0020.001A.FEE9] # ARABIC LETTER HEH ISOLATED FORM FCD9 ; [.1D19.0020.0017.FCD9][.0000.00D1.0017.FCD9] # ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM FCD7 ; [.1D19.0020.0017.FCD7][.1C97.0020.0017.FCD7] # ARABIC LIGATURE HEH WITH JEEM INITIAL FORM FC51 ; [.1D19.0020.001A.FC51][.1C97.0020.001A.FC51] # ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM FCD8 ; [.1D19.0020.0017.FCD8][.1D0C.0020.0017.FCD8] # ARABIC LIGATURE HEH WITH MEEM INITIAL FORM FC52 ; [.1D19.0020.001A.FC52][.1D0C.0020.001A.FC52] # ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM FD93 ; [.1D19.0020.0017.FD93][.1D0C.0020.0017.FD93][.1C97.0020.001F.FD93] # ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM FD94 ; [.1D19.0020.0017.FD94][.1D0C.0020.0017.FD94][.1D0C.0020.001F.FD94] # ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM FC53 ; [.1D19.0020.001A.FC53][.1D2C.0020.001A.FC53] # ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM FC54 ; [.1D19.0020.001A.FC54][.1D2D.0020.001A.FC54] # ARABIC LIGATURE HEH WITH YEH ISOLATED FORM 06BE ; [.1D1A.0020.0002.06BE] # ARABIC LETTER HEH DOACHASHMEE FBAC ; [.1D1A.0020.0017.FBAC] # ARABIC LETTER HEH DOACHASHMEE INITIAL FORM FBAD ; [.1D1A.0020.0018.FBAD] # ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM FBAB ; [.1D1A.0020.0019.FBAB] # ARABIC LETTER HEH DOACHASHMEE FINAL FORM FBAA ; [.1D1A.0020.001A.FBAA] # ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM 06C1 ; [.1D1B.0020.0002.06C1] # ARABIC LETTER HEH GOAL FBA8 ; [.1D1B.0020.0017.FBA8] # ARABIC LETTER HEH GOAL INITIAL FORM FBA9 ; [.1D1B.0020.0018.FBA9] # ARABIC LETTER HEH GOAL MEDIAL FORM FBA7 ; [.1D1B.0020.0019.FBA7] # ARABIC LETTER HEH GOAL FINAL FORM FBA6 ; [.1D1B.0020.001A.FBA6] # ARABIC LETTER HEH GOAL ISOLATED FORM 06C2 ; [.1D1B.0020.0002.06C1][.0000.00BE.0002.0654] # ARABIC LETTER HEH GOAL WITH HAMZA ABOVE 06C3 ; [.1D1C.0020.0002.06C3] # ARABIC LETTER TEH MARBUTA GOAL 06FF ; [.1D1D.0020.0002.06FF] # ARABIC LETTER HEH WITH INVERTED V 06D5 ; [.1D1E.0020.0002.06D5] # ARABIC LETTER AE 06C0 ; [.1D1E.0020.0002.06D5][.0000.00BE.0002.0654] # ARABIC LETTER HEH WITH YEH ABOVE FBA5 ; [.1D1E.0020.0019.FBA5][.0000.00BE.0019.FBA5] # ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM FBA4 ; [.1D1E.0020.001A.FBA4][.0000.00BE.001A.FBA4] # ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM 0648 ; [.1D1F.0020.0002.0648] # ARABIC LETTER WAW 06E5 ; [.1D1F.0020.0004.06E5] # ARABIC SMALL WAW 1EE05 ; [.1D1F.0020.0005.1EE05] # ARABIC MATHEMATICAL WAW 1EE85 ; [.1D1F.0020.0005.1EE85] # ARABIC MATHEMATICAL LOOPED WAW 1EEA5 ; [.1D1F.0020.0005.1EEA5] # ARABIC MATHEMATICAL DOUBLE-STRUCK WAW FEEE ; [.1D1F.0020.0019.FEEE] # ARABIC LETTER WAW FINAL FORM FEED ; [.1D1F.0020.001A.FEED] # ARABIC LETTER WAW ISOLATED FORM 0676 ; [.1D1F.0020.0004.0676][.1C73.0020.0004.0676] # ARABIC LETTER HIGH HAMZA WAW FDF8 ; [.1D1F.0020.001A.FDF8][.1CC8.0020.001A.FDF8][.1D05.0020.001F.FDF8][.1D0C.0020.001F.FDF8] # ARABIC LIGATURE WASALLAM ISOLATED FORM 06C4 ; [.1D20.0020.0002.06C4] # ARABIC LETTER WAW WITH RING 06C5 ; [.1D21.0020.0002.06C5] # ARABIC LETTER KIRGHIZ OE FBE1 ; [.1D21.0020.0019.FBE1] # ARABIC LETTER KIRGHIZ OE FINAL FORM FBE0 ; [.1D21.0020.001A.FBE0] # ARABIC LETTER KIRGHIZ OE ISOLATED FORM 06C6 ; [.1D22.0020.0002.06C6] # ARABIC LETTER OE FBDA ; [.1D22.0020.0019.FBDA] # ARABIC LETTER OE FINAL FORM FBD9 ; [.1D22.0020.001A.FBD9] # ARABIC LETTER OE ISOLATED FORM 06C7 ; [.1D23.0020.0002.06C7] # ARABIC LETTER U FBD8 ; [.1D23.0020.0019.FBD8] # ARABIC LETTER U FINAL FORM FBD7 ; [.1D23.0020.001A.FBD7] # ARABIC LETTER U ISOLATED FORM 0677 ; [.1D23.0020.0004.0677][.1C73.0020.0004.0677] # ARABIC LETTER U WITH HAMZA ABOVE FBDD ; [.1D23.0020.001A.FBDD][.1C73.0020.001A.FBDD] # ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM 06C8 ; [.1D24.0020.0002.06C8] # ARABIC LETTER YU FBDC ; [.1D24.0020.0019.FBDC] # ARABIC LETTER YU FINAL FORM FBDB ; [.1D24.0020.001A.FBDB] # ARABIC LETTER YU ISOLATED FORM 06C9 ; [.1D25.0020.0002.06C9] # ARABIC LETTER KIRGHIZ YU FBE3 ; [.1D25.0020.0019.FBE3] # ARABIC LETTER KIRGHIZ YU FINAL FORM FBE2 ; [.1D25.0020.001A.FBE2] # ARABIC LETTER KIRGHIZ YU ISOLATED FORM 06CA ; [.1D26.0020.0002.06CA] # ARABIC LETTER WAW WITH TWO DOTS ABOVE 06CB ; [.1D27.0020.0002.06CB] # ARABIC LETTER VE FBDF ; [.1D27.0020.0019.FBDF] # ARABIC LETTER VE FINAL FORM FBDE ; [.1D27.0020.001A.FBDE] # ARABIC LETTER VE ISOLATED FORM 06CF ; [.1D28.0020.0002.06CF] # ARABIC LETTER WAW WITH DOT ABOVE 0778 ; [.1D29.0020.0002.0778] # ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE 0779 ; [.1D2A.0020.0002.0779] # ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE 08AB ; [.1D2B.0020.0002.08AB] # ARABIC LETTER WAW WITH DOT WITHIN 0649 ; [.1D2C.0020.0002.0649] # ARABIC LETTER ALEF MAKSURA FBE8 ; [.1D2C.0020.0017.FBE8] # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM FBE9 ; [.1D2C.0020.0018.FBE9] # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM FEF0 ; [.1D2C.0020.0019.FEF0] # ARABIC LETTER ALEF MAKSURA FINAL FORM FEEF ; [.1D2C.0020.001A.FEEF] # ARABIC LETTER ALEF MAKSURA ISOLATED FORM FC90 ; [.1D2C.0020.0019.FC90][.0000.00D1.0019.FC90] # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM FC5D ; [.1D2C.0020.001A.FC5D][.0000.00D1.001A.FC5D] # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM 064A ; [.1D2D.0020.0002.064A] # ARABIC LETTER YEH 06E6 ; [.1D2D.0020.0004.06E6] # ARABIC SMALL YEH 1EE09 ; [.1D2D.0020.0005.1EE09] # ARABIC MATHEMATICAL YEH 1EE29 ; [.1D2D.0020.0005.1EE29] # ARABIC MATHEMATICAL INITIAL YEH 1EE49 ; [.1D2D.0020.0005.1EE49] # ARABIC MATHEMATICAL TAILED YEH 1EE69 ; [.1D2D.0020.0005.1EE69] # ARABIC MATHEMATICAL STRETCHED YEH 1EE89 ; [.1D2D.0020.0005.1EE89] # ARABIC MATHEMATICAL LOOPED YEH 1EEA9 ; [.1D2D.0020.0005.1EEA9] # ARABIC MATHEMATICAL DOUBLE-STRUCK YEH FEF3 ; [.1D2D.0020.0017.FEF3] # ARABIC LETTER YEH INITIAL FORM FEF4 ; [.1D2D.0020.0018.FEF4] # ARABIC LETTER YEH MEDIAL FORM FEF2 ; [.1D2D.0020.0019.FEF2] # ARABIC LETTER YEH FINAL FORM FEF1 ; [.1D2D.0020.001A.FEF1] # ARABIC LETTER YEH ISOLATED FORM 0678 ; [.1D2D.0020.0004.0678][.1C73.0020.0004.0678] # ARABIC LETTER HIGH HAMZA YEH FCDA ; [.1D2D.0020.0017.FCDA][.1C97.0020.0017.FCDA] # ARABIC LIGATURE YEH WITH JEEM INITIAL FORM FC55 ; [.1D2D.0020.001A.FC55][.1C97.0020.001A.FC55] # ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM FDAF ; [.1D2D.0020.0019.FDAF][.1C97.0020.0019.FDAF][.1D2D.0020.001F.FDAF] # ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM FCDB ; [.1D2D.0020.0017.FCDB][.1C9E.0020.0017.FCDB] # ARABIC LIGATURE YEH WITH HAH INITIAL FORM FC56 ; [.1D2D.0020.001A.FC56][.1C9E.0020.001A.FC56] # ARABIC LIGATURE YEH WITH HAH ISOLATED FORM FDAE ; [.1D2D.0020.0019.FDAE][.1C9E.0020.0019.FDAE][.1D2D.0020.001F.FDAE] # ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM FCDC ; [.1D2D.0020.0017.FCDC][.1C9F.0020.0017.FCDC] # ARABIC LIGATURE YEH WITH KHAH INITIAL FORM FC57 ; [.1D2D.0020.001A.FC57][.1C9F.0020.001A.FC57] # ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM FC91 ; [.1D2D.0020.0019.FC91][.1CB7.0020.0019.FC91] # ARABIC LIGATURE YEH WITH REH FINAL FORM FC92 ; [.1D2D.0020.0019.FC92][.1CB8.0020.0019.FC92] # ARABIC LIGATURE YEH WITH ZAIN FINAL FORM FCDD ; [.1D2D.0020.0017.FCDD][.1D0C.0020.0017.FCDD] # ARABIC LIGATURE YEH WITH MEEM INITIAL FORM FCF0 ; [.1D2D.0020.0018.FCF0][.1D0C.0020.0018.FCF0] # ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM FC93 ; [.1D2D.0020.0019.FC93][.1D0C.0020.0019.FC93] # ARABIC LIGATURE YEH WITH MEEM FINAL FORM FC58 ; [.1D2D.0020.001A.FC58][.1D0C.0020.001A.FC58] # ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM FD9D ; [.1D2D.0020.0017.FD9D][.1D0C.0020.0017.FD9D][.1D0C.0020.001F.FD9D] # ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM FD9C ; [.1D2D.0020.0019.FD9C][.1D0C.0020.0019.FD9C][.1D0C.0020.001F.FD9C] # ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM FDB0 ; [.1D2D.0020.0019.FDB0][.1D0C.0020.0019.FDB0][.1D2D.0020.001F.FDB0] # ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM FC94 ; [.1D2D.0020.0019.FC94][.1D10.0020.0019.FC94] # ARABIC LIGATURE YEH WITH NOON FINAL FORM FCDE ; [.1D2D.0020.0017.FCDE][.1D19.0020.0017.FCDE] # ARABIC LIGATURE YEH WITH HEH INITIAL FORM FCF1 ; [.1D2D.0020.0018.FCF1][.1D19.0020.0018.FCF1] # ARABIC LIGATURE YEH WITH HEH MEDIAL FORM FC95 ; [.1D2D.0020.0019.FC95][.1D2C.0020.0019.FC95] # ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM FC59 ; [.1D2D.0020.001A.FC59][.1D2C.0020.001A.FC59] # ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM FC96 ; [.1D2D.0020.0019.FC96][.1D2D.0020.0019.FC96] # ARABIC LIGATURE YEH WITH YEH FINAL FORM FC5A ; [.1D2D.0020.001A.FC5A][.1D2D.0020.001A.FC5A] # ARABIC LIGATURE YEH WITH YEH ISOLATED FORM 06CC ; [.1D2E.0020.0002.06CC] # ARABIC LETTER FARSI YEH FBFE ; [.1D2E.0020.0017.FBFE] # ARABIC LETTER FARSI YEH INITIAL FORM FBFF ; [.1D2E.0020.0018.FBFF] # ARABIC LETTER FARSI YEH MEDIAL FORM FBFD ; [.1D2E.0020.0019.FBFD] # ARABIC LETTER FARSI YEH FINAL FORM FBFC ; [.1D2E.0020.001A.FBFC] # ARABIC LETTER FARSI YEH ISOLATED FORM 06CD ; [.1D2F.0020.0002.06CD] # ARABIC LETTER YEH WITH TAIL 06CE ; [.1D30.0020.0002.06CE] # ARABIC LETTER YEH WITH SMALL V 06D0 ; [.1D31.0020.0002.06D0] # ARABIC LETTER E FBE6 ; [.1D31.0020.0017.FBE6] # ARABIC LETTER E INITIAL FORM FBE7 ; [.1D31.0020.0018.FBE7] # ARABIC LETTER E MEDIAL FORM FBE5 ; [.1D31.0020.0019.FBE5] # ARABIC LETTER E FINAL FORM FBE4 ; [.1D31.0020.001A.FBE4] # ARABIC LETTER E ISOLATED FORM 06D1 ; [.1D32.0020.0002.06D1] # ARABIC LETTER YEH WITH THREE DOTS BELOW 063D ; [.1D33.0020.0002.063D] # ARABIC LETTER FARSI YEH WITH INVERTED V 063E ; [.1D34.0020.0002.063E] # ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE 063F ; [.1D35.0020.0002.063F] # ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE 0620 ; [.1D36.0020.0002.0620] # ARABIC LETTER KASHMIRI YEH 0775 ; [.1D37.0020.0002.0775] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE 0776 ; [.1D38.0020.0002.0776] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE 0777 ; [.1D39.0020.0002.0777] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW 06D2 ; [.1D3A.0020.0002.06D2] # ARABIC LETTER YEH BARREE FBAF ; [.1D3A.0020.0019.FBAF] # ARABIC LETTER YEH BARREE FINAL FORM FBAE ; [.1D3A.0020.001A.FBAE] # ARABIC LETTER YEH BARREE ISOLATED FORM 06D3 ; [.1D3A.0020.0002.06D2][.0000.00BE.0002.0654] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FBB1 ; [.1D3A.0020.0019.FBB1][.0000.00BE.0019.FBB1] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM FBB0 ; [.1D3A.0020.001A.FBB0][.0000.00BE.001A.FBB0] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM 077A ; [.1D3B.0020.0002.077A] # ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE 077B ; [.1D3C.0020.0002.077B] # ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE 0710 ; [.1D3D.0020.0002.0710] # SYRIAC LETTER ALAPH 0712 ; [.1D3E.0020.0002.0712] # SYRIAC LETTER BETH 072D ; [.1D3E.0020.0004.072D][.0000.013C.0004.072D] # SYRIAC LETTER PERSIAN BHETH 0713 ; [.1D3F.0020.0002.0713] # SYRIAC LETTER GAMAL 0714 ; [.1D3F.0020.0004.0714][.0000.013A.0004.0714] # SYRIAC LETTER GAMAL GARSHUNI 072E ; [.1D3F.0020.0004.072E][.0000.013C.0004.072E] # SYRIAC LETTER PERSIAN GHAMAL 0716 ; [.1D40.0020.0002.0716] # SYRIAC LETTER DOTLESS DALATH RISH 0715 ; [.1D41.0020.0002.0715] # SYRIAC LETTER DALATH 072F ; [.1D41.0020.0004.072F][.0000.013C.0004.072F] # SYRIAC LETTER PERSIAN DHALATH 0717 ; [.1D42.0020.0002.0717] # SYRIAC LETTER HE 0718 ; [.1D43.0020.0002.0718] # SYRIAC LETTER WAW 0719 ; [.1D44.0020.0002.0719] # SYRIAC LETTER ZAIN 074D ; [.1D45.0020.0002.074D] # SYRIAC LETTER SOGDIAN ZHAIN 071A ; [.1D46.0020.0002.071A] # SYRIAC LETTER HETH 071B ; [.1D47.0020.0002.071B] # SYRIAC LETTER TETH 071C ; [.1D47.0020.0004.071C][.0000.013A.0004.071C] # SYRIAC LETTER TETH GARSHUNI 071D ; [.1D48.0020.0002.071D] # SYRIAC LETTER YUDH 071E ; [.1D49.0020.0002.071E] # SYRIAC LETTER YUDH HE 071F ; [.1D4A.0020.0002.071F] # SYRIAC LETTER KAPH 074E ; [.1D4B.0020.0002.074E] # SYRIAC LETTER SOGDIAN KHAPH 0720 ; [.1D4C.0020.0002.0720] # SYRIAC LETTER LAMADH 0721 ; [.1D4D.0020.0002.0721] # SYRIAC LETTER MIM 0722 ; [.1D4E.0020.0002.0722] # SYRIAC LETTER NUN 0723 ; [.1D4F.0020.0002.0723] # SYRIAC LETTER SEMKATH 0724 ; [.1D4F.0020.0019.0724] # SYRIAC LETTER FINAL SEMKATH 0725 ; [.1D50.0020.0002.0725] # SYRIAC LETTER E 0726 ; [.1D51.0020.0002.0726] # SYRIAC LETTER PE 0727 ; [.1D51.0020.0004.0727][.0000.013A.0004.0727] # SYRIAC LETTER REVERSED PE 074F ; [.1D52.0020.0002.074F] # SYRIAC LETTER SOGDIAN FE 0728 ; [.1D53.0020.0002.0728] # SYRIAC LETTER SADHE 0729 ; [.1D54.0020.0002.0729] # SYRIAC LETTER QAPH 072A ; [.1D55.0020.0002.072A] # SYRIAC LETTER RISH 072B ; [.1D56.0020.0002.072B] # SYRIAC LETTER SHIN 072C ; [.1D57.0020.0002.072C] # SYRIAC LETTER TAW 0840 ; [.1D58.0020.0002.0840] # MANDAIC LETTER HALQA 0841 ; [.1D59.0020.0002.0841] # MANDAIC LETTER AB 0842 ; [.1D5A.0020.0002.0842] # MANDAIC LETTER AG 0843 ; [.1D5B.0020.0002.0843] # MANDAIC LETTER AD 0844 ; [.1D5C.0020.0002.0844] # MANDAIC LETTER AH 0845 ; [.1D5D.0020.0002.0845] # MANDAIC LETTER USHENNA 0846 ; [.1D5E.0020.0002.0846] # MANDAIC LETTER AZ 0847 ; [.1D5F.0020.0002.0847] # MANDAIC LETTER IT 0848 ; [.1D60.0020.0002.0848] # MANDAIC LETTER ATT 0849 ; [.1D61.0020.0002.0849] # MANDAIC LETTER AKSA 084A ; [.1D62.0020.0002.084A] # MANDAIC LETTER AK 084B ; [.1D63.0020.0002.084B] # MANDAIC LETTER AL 084C ; [.1D64.0020.0002.084C] # MANDAIC LETTER AM 084D ; [.1D65.0020.0002.084D] # MANDAIC LETTER AN 084E ; [.1D66.0020.0002.084E] # MANDAIC LETTER AS 084F ; [.1D67.0020.0002.084F] # MANDAIC LETTER IN 0850 ; [.1D68.0020.0002.0850] # MANDAIC LETTER AP 0851 ; [.1D69.0020.0002.0851] # MANDAIC LETTER ASZ 0852 ; [.1D6A.0020.0002.0852] # MANDAIC LETTER AQ 0853 ; [.1D6B.0020.0002.0853] # MANDAIC LETTER AR 0854 ; [.1D6C.0020.0002.0854] # MANDAIC LETTER ASH 0855 ; [.1D6D.0020.0002.0855] # MANDAIC LETTER AT 0856 ; [.1D6E.0020.0002.0856] # MANDAIC LETTER DUSHENNA 0857 ; [.1D6F.0020.0002.0857] # MANDAIC LETTER KAD 0858 ; [.1D70.0020.0002.0858] # MANDAIC LETTER AIN 0780 ; [.1D71.0020.0002.0780] # THAANA LETTER HAA 0799 ; [.1D72.0020.0002.0799] # THAANA LETTER HHAA 079A ; [.1D73.0020.0002.079A] # THAANA LETTER KHAA 0781 ; [.1D74.0020.0002.0781] # THAANA LETTER SHAVIYANI 0782 ; [.1D75.0020.0002.0782] # THAANA LETTER NOONU 0783 ; [.1D76.0020.0002.0783] # THAANA LETTER RAA 079C ; [.1D77.0020.0002.079C] # THAANA LETTER ZAA 0784 ; [.1D78.0020.0002.0784] # THAANA LETTER BAA 0785 ; [.1D79.0020.0002.0785] # THAANA LETTER LHAVIYANI 0786 ; [.1D7A.0020.0002.0786] # THAANA LETTER KAAFU 0787 ; [.1D7B.0020.0002.0787] # THAANA LETTER ALIFU 07A2 ; [.1D7C.0020.0002.07A2] # THAANA LETTER AINU 07A3 ; [.1D7D.0020.0002.07A3] # THAANA LETTER GHAINU 0788 ; [.1D7E.0020.0002.0788] # THAANA LETTER VAAVU 07A5 ; [.1D7F.0020.0002.07A5] # THAANA LETTER WAAVU 0789 ; [.1D80.0020.0002.0789] # THAANA LETTER MEEMU 078A ; [.1D81.0020.0002.078A] # THAANA LETTER FAAFU 078B ; [.1D82.0020.0002.078B] # THAANA LETTER DHAALU 079B ; [.1D83.0020.0002.079B] # THAANA LETTER THAALU 078C ; [.1D84.0020.0002.078C] # THAANA LETTER THAA 0798 ; [.1D85.0020.0002.0798] # THAANA LETTER TTAA 07A0 ; [.1D86.0020.0002.07A0] # THAANA LETTER TO 07A1 ; [.1D87.0020.0002.07A1] # THAANA LETTER ZO 078D ; [.1D88.0020.0002.078D] # THAANA LETTER LAAMU 078E ; [.1D89.0020.0002.078E] # THAANA LETTER GAAFU 07A4 ; [.1D8A.0020.0002.07A4] # THAANA LETTER QAAFU 078F ; [.1D8B.0020.0002.078F] # THAANA LETTER GNAVIYANI 0790 ; [.1D8C.0020.0002.0790] # THAANA LETTER SEENU 079D ; [.1D8D.0020.0002.079D] # THAANA LETTER SHEENU 079E ; [.1D8E.0020.0002.079E] # THAANA LETTER SAADHU 079F ; [.1D8F.0020.0002.079F] # THAANA LETTER DAADHU 0791 ; [.1D90.0020.0002.0791] # THAANA LETTER DAVIYANI 0792 ; [.1D91.0020.0002.0792] # THAANA LETTER ZAVIYANI 0793 ; [.1D92.0020.0002.0793] # THAANA LETTER TAVIYANI 0794 ; [.1D93.0020.0002.0794] # THAANA LETTER YAA 0795 ; [.1D94.0020.0002.0795] # THAANA LETTER PAVIYANI 0796 ; [.1D95.0020.0002.0796] # THAANA LETTER JAVIYANI 0797 ; [.1D96.0020.0002.0797] # THAANA LETTER CHAVIYANI 07B1 ; [.1D97.0020.0002.07B1] # THAANA LETTER NAA 07A6 ; [.1D98.0020.0002.07A6] # THAANA ABAFILI 07A7 ; [.1D99.0020.0002.07A7] # THAANA AABAAFILI 07A8 ; [.1D9A.0020.0002.07A8] # THAANA IBIFILI 07A9 ; [.1D9B.0020.0002.07A9] # THAANA EEBEEFILI 07AA ; [.1D9C.0020.0002.07AA] # THAANA UBUFILI 07AB ; [.1D9D.0020.0002.07AB] # THAANA OOBOOFILI 07AC ; [.1D9E.0020.0002.07AC] # THAANA EBEFILI 07AD ; [.1D9F.0020.0002.07AD] # THAANA EYBEYFILI 07AE ; [.1DA0.0020.0002.07AE] # THAANA OBOFILI 07AF ; [.1DA1.0020.0002.07AF] # THAANA OABOAFILI 07B0 ; [.1DA2.0020.0002.07B0] # THAANA SUKUN 07CA ; [.1DA3.0020.0002.07CA] # NKO LETTER A 07CB ; [.1DA4.0020.0002.07CB] # NKO LETTER EE 07CC ; [.1DA5.0020.0002.07CC] # NKO LETTER I 07CD ; [.1DA6.0020.0002.07CD] # NKO LETTER E 07CE ; [.1DA7.0020.0002.07CE] # NKO LETTER U 07CF ; [.1DA8.0020.0002.07CF] # NKO LETTER OO 07D0 ; [.1DA9.0020.0002.07D0] # NKO LETTER O 07D1 ; [.1DAA.0020.0002.07D1] # NKO LETTER DAGBASINNA 07D2 ; [.1DAB.0020.0002.07D2] # NKO LETTER N 07D3 ; [.1DAC.0020.0002.07D3] # NKO LETTER BA 07D4 ; [.1DAD.0020.0002.07D4] # NKO LETTER PA 07D5 ; [.1DAE.0020.0002.07D5] # NKO LETTER TA 07D6 ; [.1DAF.0020.0002.07D6] # NKO LETTER JA 07E8 ; [.1DAF.0020.0004.07E8][.0000.0139.0004.07E8] # NKO LETTER JONA JA 07D7 ; [.1DB0.0020.0002.07D7] # NKO LETTER CHA 07E9 ; [.1DB0.0020.0004.07E9][.0000.0139.0004.07E9] # NKO LETTER JONA CHA 07D8 ; [.1DB1.0020.0002.07D8] # NKO LETTER DA 07D9 ; [.1DB2.0020.0002.07D9] # NKO LETTER RA 07EA ; [.1DB2.0020.0004.07EA][.0000.0139.0004.07EA] # NKO LETTER JONA RA 07DA ; [.1DB3.0020.0002.07DA] # NKO LETTER RRA 07DB ; [.1DB4.0020.0002.07DB] # NKO LETTER SA 07DC ; [.1DB5.0020.0002.07DC] # NKO LETTER GBA 07DD ; [.1DB6.0020.0002.07DD] # NKO LETTER FA 07DE ; [.1DB7.0020.0002.07DE] # NKO LETTER KA 07DF ; [.1DB8.0020.0002.07DF] # NKO LETTER LA 07E0 ; [.1DB9.0020.0002.07E0] # NKO LETTER NA WOLOSO 07E1 ; [.1DBA.0020.0002.07E1] # NKO LETTER MA 07E2 ; [.1DBB.0020.0002.07E2] # NKO LETTER NYA 07E3 ; [.1DBC.0020.0002.07E3] # NKO LETTER NA 07E4 ; [.1DBD.0020.0002.07E4] # NKO LETTER HA 07E5 ; [.1DBE.0020.0002.07E5] # NKO LETTER WA 07E6 ; [.1DBF.0020.0002.07E6] # NKO LETTER YA 07E7 ; [.1DC0.0020.0002.07E7] # NKO LETTER NYA WOLOSO 07F4 ; [.1DC1.0020.0002.07F4] # NKO HIGH TONE APOSTROPHE 07F5 ; [.1DC2.0020.0002.07F5] # NKO LOW TONE APOSTROPHE 2D30 ; [.1DC3.0020.0002.2D30] # TIFINAGH LETTER YA 2D31 ; [.1DC4.0020.0002.2D31] # TIFINAGH LETTER YAB 2D32 ; [.1DC5.0020.0002.2D32] # TIFINAGH LETTER YABH 2D33 ; [.1DC6.0020.0002.2D33] # TIFINAGH LETTER YAG 2D34 ; [.1DC7.0020.0002.2D34] # TIFINAGH LETTER YAGHH 2D35 ; [.1DC8.0020.0002.2D35] # TIFINAGH LETTER BERBER ACADEMY YAJ 2D36 ; [.1DC9.0020.0002.2D36] # TIFINAGH LETTER YAJ 2D37 ; [.1DCA.0020.0002.2D37] # TIFINAGH LETTER YAD 2D38 ; [.1DCB.0020.0002.2D38] # TIFINAGH LETTER YADH 2D39 ; [.1DCC.0020.0002.2D39] # TIFINAGH LETTER YADD 2D3A ; [.1DCD.0020.0002.2D3A] # TIFINAGH LETTER YADDH 2D3B ; [.1DCE.0020.0002.2D3B] # TIFINAGH LETTER YEY 2D66 ; [.1DCF.0020.0002.2D66] # TIFINAGH LETTER YE 2D3C ; [.1DD0.0020.0002.2D3C] # TIFINAGH LETTER YAF 2D3D ; [.1DD1.0020.0002.2D3D] # TIFINAGH LETTER YAK 2D3E ; [.1DD2.0020.0002.2D3E] # TIFINAGH LETTER TUAREG YAK 2D3F ; [.1DD3.0020.0002.2D3F] # TIFINAGH LETTER YAKHH 2D40 ; [.1DD4.0020.0002.2D40] # TIFINAGH LETTER YAH 2D41 ; [.1DD5.0020.0002.2D41] # TIFINAGH LETTER BERBER ACADEMY YAH 2D42 ; [.1DD6.0020.0002.2D42] # TIFINAGH LETTER TUAREG YAH 2D43 ; [.1DD7.0020.0002.2D43] # TIFINAGH LETTER YAHH 2D44 ; [.1DD8.0020.0002.2D44] # TIFINAGH LETTER YAA 2D45 ; [.1DD9.0020.0002.2D45] # TIFINAGH LETTER YAKH 2D46 ; [.1DDA.0020.0002.2D46] # TIFINAGH LETTER TUAREG YAKH 2D47 ; [.1DDB.0020.0002.2D47] # TIFINAGH LETTER YAQ 2D48 ; [.1DDC.0020.0002.2D48] # TIFINAGH LETTER TUAREG YAQ 2D49 ; [.1DDD.0020.0002.2D49] # TIFINAGH LETTER YI 2D4A ; [.1DDE.0020.0002.2D4A] # TIFINAGH LETTER YAZH 2D4B ; [.1DDF.0020.0002.2D4B] # TIFINAGH LETTER AHAGGAR YAZH 2D4C ; [.1DE0.0020.0002.2D4C] # TIFINAGH LETTER TUAREG YAZH 2D4D ; [.1DE1.0020.0002.2D4D] # TIFINAGH LETTER YAL 2D4E ; [.1DE2.0020.0002.2D4E] # TIFINAGH LETTER YAM 2D4F ; [.1DE3.0020.0002.2D4F] # TIFINAGH LETTER YAN 2D50 ; [.1DE4.0020.0002.2D50] # TIFINAGH LETTER TUAREG YAGN 2D51 ; [.1DE5.0020.0002.2D51] # TIFINAGH LETTER TUAREG YANG 2D52 ; [.1DE6.0020.0002.2D52] # TIFINAGH LETTER YAP 2D53 ; [.1DE7.0020.0002.2D53] # TIFINAGH LETTER YU 2D67 ; [.1DE8.0020.0002.2D67] # TIFINAGH LETTER YO 2D54 ; [.1DE9.0020.0002.2D54] # TIFINAGH LETTER YAR 2D55 ; [.1DEA.0020.0002.2D55] # TIFINAGH LETTER YARR 2D56 ; [.1DEB.0020.0002.2D56] # TIFINAGH LETTER YAGH 2D57 ; [.1DEC.0020.0002.2D57] # TIFINAGH LETTER TUAREG YAGH 2D58 ; [.1DED.0020.0002.2D58] # TIFINAGH LETTER AYER YAGH 2D59 ; [.1DEE.0020.0002.2D59] # TIFINAGH LETTER YAS 2D5A ; [.1DEF.0020.0002.2D5A] # TIFINAGH LETTER YASS 2D5B ; [.1DF0.0020.0002.2D5B] # TIFINAGH LETTER YASH 2D5C ; [.1DF1.0020.0002.2D5C] # TIFINAGH LETTER YAT 2D5D ; [.1DF2.0020.0002.2D5D] # TIFINAGH LETTER YATH 2D5E ; [.1DF3.0020.0002.2D5E] # TIFINAGH LETTER YACH 2D5F ; [.1DF4.0020.0002.2D5F] # TIFINAGH LETTER YATT 2D60 ; [.1DF5.0020.0002.2D60] # TIFINAGH LETTER YAV 2D61 ; [.1DF6.0020.0002.2D61] # TIFINAGH LETTER YAW 2D62 ; [.1DF7.0020.0002.2D62] # TIFINAGH LETTER YAY 2D63 ; [.1DF8.0020.0002.2D63] # TIFINAGH LETTER YAZ 2D64 ; [.1DF9.0020.0002.2D64] # TIFINAGH LETTER TAWELLEMET YAZ 2D65 ; [.1DFA.0020.0002.2D65] # TIFINAGH LETTER YAZZ 2D6F ; [.1DFB.0020.0002.2D6F] # TIFINAGH MODIFIER LETTER LABIALIZATION MARK 1200 ; [.1DFC.0020.0002.1200] # ETHIOPIC SYLLABLE HA 1201 ; [.1DFD.0020.0002.1201] # ETHIOPIC SYLLABLE HU 1202 ; [.1DFE.0020.0002.1202] # ETHIOPIC SYLLABLE HI 1203 ; [.1DFF.0020.0002.1203] # ETHIOPIC SYLLABLE HAA 1204 ; [.1E00.0020.0002.1204] # ETHIOPIC SYLLABLE HEE 1205 ; [.1E01.0020.0002.1205] # ETHIOPIC SYLLABLE HE 1206 ; [.1E02.0020.0002.1206] # ETHIOPIC SYLLABLE HO 1207 ; [.1E03.0020.0002.1207] # ETHIOPIC SYLLABLE HOA 1208 ; [.1E04.0020.0002.1208] # ETHIOPIC SYLLABLE LA 1209 ; [.1E05.0020.0002.1209] # ETHIOPIC SYLLABLE LU 120A ; [.1E06.0020.0002.120A] # ETHIOPIC SYLLABLE LI 120B ; [.1E07.0020.0002.120B] # ETHIOPIC SYLLABLE LAA 120C ; [.1E08.0020.0002.120C] # ETHIOPIC SYLLABLE LEE 120D ; [.1E09.0020.0002.120D] # ETHIOPIC SYLLABLE LE 120E ; [.1E0A.0020.0002.120E] # ETHIOPIC SYLLABLE LO 120F ; [.1E0B.0020.0002.120F] # ETHIOPIC SYLLABLE LWA 2D80 ; [.1E0C.0020.0002.2D80] # ETHIOPIC SYLLABLE LOA 1210 ; [.1E0D.0020.0002.1210] # ETHIOPIC SYLLABLE HHA 1211 ; [.1E0E.0020.0002.1211] # ETHIOPIC SYLLABLE HHU 1212 ; [.1E0F.0020.0002.1212] # ETHIOPIC SYLLABLE HHI 1213 ; [.1E10.0020.0002.1213] # ETHIOPIC SYLLABLE HHAA 1214 ; [.1E11.0020.0002.1214] # ETHIOPIC SYLLABLE HHEE 1215 ; [.1E12.0020.0002.1215] # ETHIOPIC SYLLABLE HHE 1216 ; [.1E13.0020.0002.1216] # ETHIOPIC SYLLABLE HHO 1217 ; [.1E14.0020.0002.1217] # ETHIOPIC SYLLABLE HHWA 1218 ; [.1E15.0020.0002.1218] # ETHIOPIC SYLLABLE MA 1219 ; [.1E16.0020.0002.1219] # ETHIOPIC SYLLABLE MU 121A ; [.1E17.0020.0002.121A] # ETHIOPIC SYLLABLE MI 121B ; [.1E18.0020.0002.121B] # ETHIOPIC SYLLABLE MAA 121C ; [.1E19.0020.0002.121C] # ETHIOPIC SYLLABLE MEE 121D ; [.1E1A.0020.0002.121D] # ETHIOPIC SYLLABLE ME 121E ; [.1E1B.0020.0002.121E] # ETHIOPIC SYLLABLE MO 121F ; [.1E1C.0020.0002.121F] # ETHIOPIC SYLLABLE MWA 1380 ; [.1E1D.0020.0002.1380] # ETHIOPIC SYLLABLE SEBATBEIT MWA 1381 ; [.1E1E.0020.0002.1381] # ETHIOPIC SYLLABLE MWI 1382 ; [.1E1F.0020.0002.1382] # ETHIOPIC SYLLABLE MWEE 1383 ; [.1E20.0020.0002.1383] # ETHIOPIC SYLLABLE MWE 2D81 ; [.1E21.0020.0002.2D81] # ETHIOPIC SYLLABLE MOA 1220 ; [.1E22.0020.0002.1220] # ETHIOPIC SYLLABLE SZA 1221 ; [.1E23.0020.0002.1221] # ETHIOPIC SYLLABLE SZU 1222 ; [.1E24.0020.0002.1222] # ETHIOPIC SYLLABLE SZI 1223 ; [.1E25.0020.0002.1223] # ETHIOPIC SYLLABLE SZAA 1224 ; [.1E26.0020.0002.1224] # ETHIOPIC SYLLABLE SZEE 1225 ; [.1E27.0020.0002.1225] # ETHIOPIC SYLLABLE SZE 1226 ; [.1E28.0020.0002.1226] # ETHIOPIC SYLLABLE SZO 1227 ; [.1E29.0020.0002.1227] # ETHIOPIC SYLLABLE SZWA 1228 ; [.1E2A.0020.0002.1228] # ETHIOPIC SYLLABLE RA 1229 ; [.1E2B.0020.0002.1229] # ETHIOPIC SYLLABLE RU 122A ; [.1E2C.0020.0002.122A] # ETHIOPIC SYLLABLE RI 122B ; [.1E2D.0020.0002.122B] # ETHIOPIC SYLLABLE RAA 122C ; [.1E2E.0020.0002.122C] # ETHIOPIC SYLLABLE REE 122D ; [.1E2F.0020.0002.122D] # ETHIOPIC SYLLABLE RE 122E ; [.1E30.0020.0002.122E] # ETHIOPIC SYLLABLE RO 122F ; [.1E31.0020.0002.122F] # ETHIOPIC SYLLABLE RWA 2D82 ; [.1E32.0020.0002.2D82] # ETHIOPIC SYLLABLE ROA 1230 ; [.1E33.0020.0002.1230] # ETHIOPIC SYLLABLE SA 1231 ; [.1E34.0020.0002.1231] # ETHIOPIC SYLLABLE SU 1232 ; [.1E35.0020.0002.1232] # ETHIOPIC SYLLABLE SI 1233 ; [.1E36.0020.0002.1233] # ETHIOPIC SYLLABLE SAA 1234 ; [.1E37.0020.0002.1234] # ETHIOPIC SYLLABLE SEE 1235 ; [.1E38.0020.0002.1235] # ETHIOPIC SYLLABLE SE 1236 ; [.1E39.0020.0002.1236] # ETHIOPIC SYLLABLE SO 1237 ; [.1E3A.0020.0002.1237] # ETHIOPIC SYLLABLE SWA 2D83 ; [.1E3B.0020.0002.2D83] # ETHIOPIC SYLLABLE SOA AB01 ; [.1E3C.0020.0002.AB01] # ETHIOPIC SYLLABLE TTHU AB02 ; [.1E3D.0020.0002.AB02] # ETHIOPIC SYLLABLE TTHI AB03 ; [.1E3E.0020.0002.AB03] # ETHIOPIC SYLLABLE TTHAA AB04 ; [.1E3F.0020.0002.AB04] # ETHIOPIC SYLLABLE TTHEE AB05 ; [.1E40.0020.0002.AB05] # ETHIOPIC SYLLABLE TTHE AB06 ; [.1E41.0020.0002.AB06] # ETHIOPIC SYLLABLE TTHO 1238 ; [.1E42.0020.0002.1238] # ETHIOPIC SYLLABLE SHA 1239 ; [.1E43.0020.0002.1239] # ETHIOPIC SYLLABLE SHU 123A ; [.1E44.0020.0002.123A] # ETHIOPIC SYLLABLE SHI 123B ; [.1E45.0020.0002.123B] # ETHIOPIC SYLLABLE SHAA 123C ; [.1E46.0020.0002.123C] # ETHIOPIC SYLLABLE SHEE 123D ; [.1E47.0020.0002.123D] # ETHIOPIC SYLLABLE SHE 123E ; [.1E48.0020.0002.123E] # ETHIOPIC SYLLABLE SHO 123F ; [.1E49.0020.0002.123F] # ETHIOPIC SYLLABLE SHWA 2D84 ; [.1E4A.0020.0002.2D84] # ETHIOPIC SYLLABLE SHOA 1240 ; [.1E4B.0020.0002.1240] # ETHIOPIC SYLLABLE QA 1241 ; [.1E4C.0020.0002.1241] # ETHIOPIC SYLLABLE QU 1242 ; [.1E4D.0020.0002.1242] # ETHIOPIC SYLLABLE QI 1243 ; [.1E4E.0020.0002.1243] # ETHIOPIC SYLLABLE QAA 1244 ; [.1E4F.0020.0002.1244] # ETHIOPIC SYLLABLE QEE 1245 ; [.1E50.0020.0002.1245] # ETHIOPIC SYLLABLE QE 1246 ; [.1E51.0020.0002.1246] # ETHIOPIC SYLLABLE QO 1247 ; [.1E52.0020.0002.1247] # ETHIOPIC SYLLABLE QOA 1248 ; [.1E53.0020.0002.1248] # ETHIOPIC SYLLABLE QWA 124A ; [.1E54.0020.0002.124A] # ETHIOPIC SYLLABLE QWI 124B ; [.1E55.0020.0002.124B] # ETHIOPIC SYLLABLE QWAA 124C ; [.1E56.0020.0002.124C] # ETHIOPIC SYLLABLE QWEE 124D ; [.1E57.0020.0002.124D] # ETHIOPIC SYLLABLE QWE 1250 ; [.1E58.0020.0002.1250] # ETHIOPIC SYLLABLE QHA 1251 ; [.1E59.0020.0002.1251] # ETHIOPIC SYLLABLE QHU 1252 ; [.1E5A.0020.0002.1252] # ETHIOPIC SYLLABLE QHI 1253 ; [.1E5B.0020.0002.1253] # ETHIOPIC SYLLABLE QHAA 1254 ; [.1E5C.0020.0002.1254] # ETHIOPIC SYLLABLE QHEE 1255 ; [.1E5D.0020.0002.1255] # ETHIOPIC SYLLABLE QHE 1256 ; [.1E5E.0020.0002.1256] # ETHIOPIC SYLLABLE QHO 1258 ; [.1E5F.0020.0002.1258] # ETHIOPIC SYLLABLE QHWA 125A ; [.1E60.0020.0002.125A] # ETHIOPIC SYLLABLE QHWI 125B ; [.1E61.0020.0002.125B] # ETHIOPIC SYLLABLE QHWAA 125C ; [.1E62.0020.0002.125C] # ETHIOPIC SYLLABLE QHWEE 125D ; [.1E63.0020.0002.125D] # ETHIOPIC SYLLABLE QHWE 1260 ; [.1E64.0020.0002.1260] # ETHIOPIC SYLLABLE BA 1261 ; [.1E65.0020.0002.1261] # ETHIOPIC SYLLABLE BU 1262 ; [.1E66.0020.0002.1262] # ETHIOPIC SYLLABLE BI 1263 ; [.1E67.0020.0002.1263] # ETHIOPIC SYLLABLE BAA 1264 ; [.1E68.0020.0002.1264] # ETHIOPIC SYLLABLE BEE 1265 ; [.1E69.0020.0002.1265] # ETHIOPIC SYLLABLE BE 1266 ; [.1E6A.0020.0002.1266] # ETHIOPIC SYLLABLE BO 1267 ; [.1E6B.0020.0002.1267] # ETHIOPIC SYLLABLE BWA 1384 ; [.1E6C.0020.0002.1384] # ETHIOPIC SYLLABLE SEBATBEIT BWA 1385 ; [.1E6D.0020.0002.1385] # ETHIOPIC SYLLABLE BWI 1386 ; [.1E6E.0020.0002.1386] # ETHIOPIC SYLLABLE BWEE 1387 ; [.1E6F.0020.0002.1387] # ETHIOPIC SYLLABLE BWE 2D85 ; [.1E70.0020.0002.2D85] # ETHIOPIC SYLLABLE BOA 1268 ; [.1E71.0020.0002.1268] # ETHIOPIC SYLLABLE VA 1269 ; [.1E72.0020.0002.1269] # ETHIOPIC SYLLABLE VU 126A ; [.1E73.0020.0002.126A] # ETHIOPIC SYLLABLE VI 126B ; [.1E74.0020.0002.126B] # ETHIOPIC SYLLABLE VAA 126C ; [.1E75.0020.0002.126C] # ETHIOPIC SYLLABLE VEE 126D ; [.1E76.0020.0002.126D] # ETHIOPIC SYLLABLE VE 126E ; [.1E77.0020.0002.126E] # ETHIOPIC SYLLABLE VO 126F ; [.1E78.0020.0002.126F] # ETHIOPIC SYLLABLE VWA 1270 ; [.1E79.0020.0002.1270] # ETHIOPIC SYLLABLE TA 1271 ; [.1E7A.0020.0002.1271] # ETHIOPIC SYLLABLE TU 1272 ; [.1E7B.0020.0002.1272] # ETHIOPIC SYLLABLE TI 1273 ; [.1E7C.0020.0002.1273] # ETHIOPIC SYLLABLE TAA 1274 ; [.1E7D.0020.0002.1274] # ETHIOPIC SYLLABLE TEE 1275 ; [.1E7E.0020.0002.1275] # ETHIOPIC SYLLABLE TE 1276 ; [.1E7F.0020.0002.1276] # ETHIOPIC SYLLABLE TO 1277 ; [.1E80.0020.0002.1277] # ETHIOPIC SYLLABLE TWA 2D86 ; [.1E81.0020.0002.2D86] # ETHIOPIC SYLLABLE TOA 1278 ; [.1E82.0020.0002.1278] # ETHIOPIC SYLLABLE CA 1279 ; [.1E83.0020.0002.1279] # ETHIOPIC SYLLABLE CU 127A ; [.1E84.0020.0002.127A] # ETHIOPIC SYLLABLE CI 127B ; [.1E85.0020.0002.127B] # ETHIOPIC SYLLABLE CAA 127C ; [.1E86.0020.0002.127C] # ETHIOPIC SYLLABLE CEE 127D ; [.1E87.0020.0002.127D] # ETHIOPIC SYLLABLE CE 127E ; [.1E88.0020.0002.127E] # ETHIOPIC SYLLABLE CO 127F ; [.1E89.0020.0002.127F] # ETHIOPIC SYLLABLE CWA 2D87 ; [.1E8A.0020.0002.2D87] # ETHIOPIC SYLLABLE COA 1280 ; [.1E8B.0020.0002.1280] # ETHIOPIC SYLLABLE XA 1281 ; [.1E8C.0020.0002.1281] # ETHIOPIC SYLLABLE XU 1282 ; [.1E8D.0020.0002.1282] # ETHIOPIC SYLLABLE XI 1283 ; [.1E8E.0020.0002.1283] # ETHIOPIC SYLLABLE XAA 1284 ; [.1E8F.0020.0002.1284] # ETHIOPIC SYLLABLE XEE 1285 ; [.1E90.0020.0002.1285] # ETHIOPIC SYLLABLE XE 1286 ; [.1E91.0020.0002.1286] # ETHIOPIC SYLLABLE XO 1287 ; [.1E92.0020.0002.1287] # ETHIOPIC SYLLABLE XOA 1288 ; [.1E93.0020.0002.1288] # ETHIOPIC SYLLABLE XWA 128A ; [.1E94.0020.0002.128A] # ETHIOPIC SYLLABLE XWI 128B ; [.1E95.0020.0002.128B] # ETHIOPIC SYLLABLE XWAA 128C ; [.1E96.0020.0002.128C] # ETHIOPIC SYLLABLE XWEE 128D ; [.1E97.0020.0002.128D] # ETHIOPIC SYLLABLE XWE 1290 ; [.1E98.0020.0002.1290] # ETHIOPIC SYLLABLE NA 1291 ; [.1E99.0020.0002.1291] # ETHIOPIC SYLLABLE NU 1292 ; [.1E9A.0020.0002.1292] # ETHIOPIC SYLLABLE NI 1293 ; [.1E9B.0020.0002.1293] # ETHIOPIC SYLLABLE NAA 1294 ; [.1E9C.0020.0002.1294] # ETHIOPIC SYLLABLE NEE 1295 ; [.1E9D.0020.0002.1295] # ETHIOPIC SYLLABLE NE 1296 ; [.1E9E.0020.0002.1296] # ETHIOPIC SYLLABLE NO 1297 ; [.1E9F.0020.0002.1297] # ETHIOPIC SYLLABLE NWA 2D88 ; [.1EA0.0020.0002.2D88] # ETHIOPIC SYLLABLE NOA 1298 ; [.1EA1.0020.0002.1298] # ETHIOPIC SYLLABLE NYA 1299 ; [.1EA2.0020.0002.1299] # ETHIOPIC SYLLABLE NYU 129A ; [.1EA3.0020.0002.129A] # ETHIOPIC SYLLABLE NYI 129B ; [.1EA4.0020.0002.129B] # ETHIOPIC SYLLABLE NYAA 129C ; [.1EA5.0020.0002.129C] # ETHIOPIC SYLLABLE NYEE 129D ; [.1EA6.0020.0002.129D] # ETHIOPIC SYLLABLE NYE 129E ; [.1EA7.0020.0002.129E] # ETHIOPIC SYLLABLE NYO 129F ; [.1EA8.0020.0002.129F] # ETHIOPIC SYLLABLE NYWA 2D89 ; [.1EA9.0020.0002.2D89] # ETHIOPIC SYLLABLE NYOA 12A0 ; [.1EAA.0020.0002.12A0] # ETHIOPIC SYLLABLE GLOTTAL A 12A1 ; [.1EAB.0020.0002.12A1] # ETHIOPIC SYLLABLE GLOTTAL U 12A2 ; [.1EAC.0020.0002.12A2] # ETHIOPIC SYLLABLE GLOTTAL I 12A3 ; [.1EAD.0020.0002.12A3] # ETHIOPIC SYLLABLE GLOTTAL AA 12A4 ; [.1EAE.0020.0002.12A4] # ETHIOPIC SYLLABLE GLOTTAL EE 12A5 ; [.1EAF.0020.0002.12A5] # ETHIOPIC SYLLABLE GLOTTAL E 12A6 ; [.1EB0.0020.0002.12A6] # ETHIOPIC SYLLABLE GLOTTAL O 12A7 ; [.1EB1.0020.0002.12A7] # ETHIOPIC SYLLABLE GLOTTAL WA 2D8A ; [.1EB2.0020.0002.2D8A] # ETHIOPIC SYLLABLE GLOTTAL OA 12A8 ; [.1EB3.0020.0002.12A8] # ETHIOPIC SYLLABLE KA 12A9 ; [.1EB4.0020.0002.12A9] # ETHIOPIC SYLLABLE KU 12AA ; [.1EB5.0020.0002.12AA] # ETHIOPIC SYLLABLE KI 12AB ; [.1EB6.0020.0002.12AB] # ETHIOPIC SYLLABLE KAA 12AC ; [.1EB7.0020.0002.12AC] # ETHIOPIC SYLLABLE KEE 12AD ; [.1EB8.0020.0002.12AD] # ETHIOPIC SYLLABLE KE 12AE ; [.1EB9.0020.0002.12AE] # ETHIOPIC SYLLABLE KO 12AF ; [.1EBA.0020.0002.12AF] # ETHIOPIC SYLLABLE KOA 12B0 ; [.1EBB.0020.0002.12B0] # ETHIOPIC SYLLABLE KWA 12B2 ; [.1EBC.0020.0002.12B2] # ETHIOPIC SYLLABLE KWI 12B3 ; [.1EBD.0020.0002.12B3] # ETHIOPIC SYLLABLE KWAA 12B4 ; [.1EBE.0020.0002.12B4] # ETHIOPIC SYLLABLE KWEE 12B5 ; [.1EBF.0020.0002.12B5] # ETHIOPIC SYLLABLE KWE 12B8 ; [.1EC0.0020.0002.12B8] # ETHIOPIC SYLLABLE KXA 12B9 ; [.1EC1.0020.0002.12B9] # ETHIOPIC SYLLABLE KXU 12BA ; [.1EC2.0020.0002.12BA] # ETHIOPIC SYLLABLE KXI 12BB ; [.1EC3.0020.0002.12BB] # ETHIOPIC SYLLABLE KXAA 12BC ; [.1EC4.0020.0002.12BC] # ETHIOPIC SYLLABLE KXEE 12BD ; [.1EC5.0020.0002.12BD] # ETHIOPIC SYLLABLE KXE 12BE ; [.1EC6.0020.0002.12BE] # ETHIOPIC SYLLABLE KXO 12C0 ; [.1EC7.0020.0002.12C0] # ETHIOPIC SYLLABLE KXWA 12C2 ; [.1EC8.0020.0002.12C2] # ETHIOPIC SYLLABLE KXWI 12C3 ; [.1EC9.0020.0002.12C3] # ETHIOPIC SYLLABLE KXWAA 12C4 ; [.1ECA.0020.0002.12C4] # ETHIOPIC SYLLABLE KXWEE 12C5 ; [.1ECB.0020.0002.12C5] # ETHIOPIC SYLLABLE KXWE 12C8 ; [.1ECC.0020.0002.12C8] # ETHIOPIC SYLLABLE WA 12C9 ; [.1ECD.0020.0002.12C9] # ETHIOPIC SYLLABLE WU 12CA ; [.1ECE.0020.0002.12CA] # ETHIOPIC SYLLABLE WI 12CB ; [.1ECF.0020.0002.12CB] # ETHIOPIC SYLLABLE WAA 12CC ; [.1ED0.0020.0002.12CC] # ETHIOPIC SYLLABLE WEE 12CD ; [.1ED1.0020.0002.12CD] # ETHIOPIC SYLLABLE WE 12CE ; [.1ED2.0020.0002.12CE] # ETHIOPIC SYLLABLE WO 12CF ; [.1ED3.0020.0002.12CF] # ETHIOPIC SYLLABLE WOA 12D0 ; [.1ED4.0020.0002.12D0] # ETHIOPIC SYLLABLE PHARYNGEAL A 12D1 ; [.1ED5.0020.0002.12D1] # ETHIOPIC SYLLABLE PHARYNGEAL U 12D2 ; [.1ED6.0020.0002.12D2] # ETHIOPIC SYLLABLE PHARYNGEAL I 12D3 ; [.1ED7.0020.0002.12D3] # ETHIOPIC SYLLABLE PHARYNGEAL AA 12D4 ; [.1ED8.0020.0002.12D4] # ETHIOPIC SYLLABLE PHARYNGEAL EE 12D5 ; [.1ED9.0020.0002.12D5] # ETHIOPIC SYLLABLE PHARYNGEAL E 12D6 ; [.1EDA.0020.0002.12D6] # ETHIOPIC SYLLABLE PHARYNGEAL O 12D8 ; [.1EDB.0020.0002.12D8] # ETHIOPIC SYLLABLE ZA 12D9 ; [.1EDC.0020.0002.12D9] # ETHIOPIC SYLLABLE ZU 12DA ; [.1EDD.0020.0002.12DA] # ETHIOPIC SYLLABLE ZI 12DB ; [.1EDE.0020.0002.12DB] # ETHIOPIC SYLLABLE ZAA 12DC ; [.1EDF.0020.0002.12DC] # ETHIOPIC SYLLABLE ZEE 12DD ; [.1EE0.0020.0002.12DD] # ETHIOPIC SYLLABLE ZE 12DE ; [.1EE1.0020.0002.12DE] # ETHIOPIC SYLLABLE ZO 12DF ; [.1EE2.0020.0002.12DF] # ETHIOPIC SYLLABLE ZWA 2D8B ; [.1EE3.0020.0002.2D8B] # ETHIOPIC SYLLABLE ZOA AB11 ; [.1EE4.0020.0002.AB11] # ETHIOPIC SYLLABLE DZU AB12 ; [.1EE5.0020.0002.AB12] # ETHIOPIC SYLLABLE DZI AB13 ; [.1EE6.0020.0002.AB13] # ETHIOPIC SYLLABLE DZAA AB14 ; [.1EE7.0020.0002.AB14] # ETHIOPIC SYLLABLE DZEE AB15 ; [.1EE8.0020.0002.AB15] # ETHIOPIC SYLLABLE DZE AB16 ; [.1EE9.0020.0002.AB16] # ETHIOPIC SYLLABLE DZO 12E0 ; [.1EEA.0020.0002.12E0] # ETHIOPIC SYLLABLE ZHA 12E1 ; [.1EEB.0020.0002.12E1] # ETHIOPIC SYLLABLE ZHU 12E2 ; [.1EEC.0020.0002.12E2] # ETHIOPIC SYLLABLE ZHI 12E3 ; [.1EED.0020.0002.12E3] # ETHIOPIC SYLLABLE ZHAA 12E4 ; [.1EEE.0020.0002.12E4] # ETHIOPIC SYLLABLE ZHEE 12E5 ; [.1EEF.0020.0002.12E5] # ETHIOPIC SYLLABLE ZHE 12E6 ; [.1EF0.0020.0002.12E6] # ETHIOPIC SYLLABLE ZHO 12E7 ; [.1EF1.0020.0002.12E7] # ETHIOPIC SYLLABLE ZHWA 12E8 ; [.1EF2.0020.0002.12E8] # ETHIOPIC SYLLABLE YA 12E9 ; [.1EF3.0020.0002.12E9] # ETHIOPIC SYLLABLE YU 12EA ; [.1EF4.0020.0002.12EA] # ETHIOPIC SYLLABLE YI 12EB ; [.1EF5.0020.0002.12EB] # ETHIOPIC SYLLABLE YAA 12EC ; [.1EF6.0020.0002.12EC] # ETHIOPIC SYLLABLE YEE 12ED ; [.1EF7.0020.0002.12ED] # ETHIOPIC SYLLABLE YE 12EE ; [.1EF8.0020.0002.12EE] # ETHIOPIC SYLLABLE YO 12EF ; [.1EF9.0020.0002.12EF] # ETHIOPIC SYLLABLE YOA 12F0 ; [.1EFA.0020.0002.12F0] # ETHIOPIC SYLLABLE DA 12F1 ; [.1EFB.0020.0002.12F1] # ETHIOPIC SYLLABLE DU 12F2 ; [.1EFC.0020.0002.12F2] # ETHIOPIC SYLLABLE DI 12F3 ; [.1EFD.0020.0002.12F3] # ETHIOPIC SYLLABLE DAA 12F4 ; [.1EFE.0020.0002.12F4] # ETHIOPIC SYLLABLE DEE 12F5 ; [.1EFF.0020.0002.12F5] # ETHIOPIC SYLLABLE DE 12F6 ; [.1F00.0020.0002.12F6] # ETHIOPIC SYLLABLE DO 12F7 ; [.1F01.0020.0002.12F7] # ETHIOPIC SYLLABLE DWA 2D8C ; [.1F02.0020.0002.2D8C] # ETHIOPIC SYLLABLE DOA AB09 ; [.1F03.0020.0002.AB09] # ETHIOPIC SYLLABLE DDHU AB0A ; [.1F04.0020.0002.AB0A] # ETHIOPIC SYLLABLE DDHI AB0B ; [.1F05.0020.0002.AB0B] # ETHIOPIC SYLLABLE DDHAA AB0C ; [.1F06.0020.0002.AB0C] # ETHIOPIC SYLLABLE DDHEE AB0D ; [.1F07.0020.0002.AB0D] # ETHIOPIC SYLLABLE DDHE AB0E ; [.1F08.0020.0002.AB0E] # ETHIOPIC SYLLABLE DDHO 12F8 ; [.1F09.0020.0002.12F8] # ETHIOPIC SYLLABLE DDA 12F9 ; [.1F0A.0020.0002.12F9] # ETHIOPIC SYLLABLE DDU 12FA ; [.1F0B.0020.0002.12FA] # ETHIOPIC SYLLABLE DDI 12FB ; [.1F0C.0020.0002.12FB] # ETHIOPIC SYLLABLE DDAA 12FC ; [.1F0D.0020.0002.12FC] # ETHIOPIC SYLLABLE DDEE 12FD ; [.1F0E.0020.0002.12FD] # ETHIOPIC SYLLABLE DDE 12FE ; [.1F0F.0020.0002.12FE] # ETHIOPIC SYLLABLE DDO 12FF ; [.1F10.0020.0002.12FF] # ETHIOPIC SYLLABLE DDWA 2D8D ; [.1F11.0020.0002.2D8D] # ETHIOPIC SYLLABLE DDOA 1300 ; [.1F12.0020.0002.1300] # ETHIOPIC SYLLABLE JA 1301 ; [.1F13.0020.0002.1301] # ETHIOPIC SYLLABLE JU 1302 ; [.1F14.0020.0002.1302] # ETHIOPIC SYLLABLE JI 1303 ; [.1F15.0020.0002.1303] # ETHIOPIC SYLLABLE JAA 1304 ; [.1F16.0020.0002.1304] # ETHIOPIC SYLLABLE JEE 1305 ; [.1F17.0020.0002.1305] # ETHIOPIC SYLLABLE JE 1306 ; [.1F18.0020.0002.1306] # ETHIOPIC SYLLABLE JO 1307 ; [.1F19.0020.0002.1307] # ETHIOPIC SYLLABLE JWA 2D8E ; [.1F1A.0020.0002.2D8E] # ETHIOPIC SYLLABLE JOA 1308 ; [.1F1B.0020.0002.1308] # ETHIOPIC SYLLABLE GA 1309 ; [.1F1C.0020.0002.1309] # ETHIOPIC SYLLABLE GU 130A ; [.1F1D.0020.0002.130A] # ETHIOPIC SYLLABLE GI 130B ; [.1F1E.0020.0002.130B] # ETHIOPIC SYLLABLE GAA 130C ; [.1F1F.0020.0002.130C] # ETHIOPIC SYLLABLE GEE 130D ; [.1F20.0020.0002.130D] # ETHIOPIC SYLLABLE GE 130E ; [.1F21.0020.0002.130E] # ETHIOPIC SYLLABLE GO 130F ; [.1F22.0020.0002.130F] # ETHIOPIC SYLLABLE GOA 1310 ; [.1F23.0020.0002.1310] # ETHIOPIC SYLLABLE GWA 1312 ; [.1F24.0020.0002.1312] # ETHIOPIC SYLLABLE GWI 1313 ; [.1F25.0020.0002.1313] # ETHIOPIC SYLLABLE GWAA 1314 ; [.1F26.0020.0002.1314] # ETHIOPIC SYLLABLE GWEE 1315 ; [.1F27.0020.0002.1315] # ETHIOPIC SYLLABLE GWE 1318 ; [.1F28.0020.0002.1318] # ETHIOPIC SYLLABLE GGA 1319 ; [.1F29.0020.0002.1319] # ETHIOPIC SYLLABLE GGU 131A ; [.1F2A.0020.0002.131A] # ETHIOPIC SYLLABLE GGI 131B ; [.1F2B.0020.0002.131B] # ETHIOPIC SYLLABLE GGAA 131C ; [.1F2C.0020.0002.131C] # ETHIOPIC SYLLABLE GGEE 131D ; [.1F2D.0020.0002.131D] # ETHIOPIC SYLLABLE GGE 131E ; [.1F2E.0020.0002.131E] # ETHIOPIC SYLLABLE GGO 131F ; [.1F2F.0020.0002.131F] # ETHIOPIC SYLLABLE GGWAA 2D93 ; [.1F30.0020.0002.2D93] # ETHIOPIC SYLLABLE GGWA 2D94 ; [.1F31.0020.0002.2D94] # ETHIOPIC SYLLABLE GGWI 2D95 ; [.1F32.0020.0002.2D95] # ETHIOPIC SYLLABLE GGWEE 2D96 ; [.1F33.0020.0002.2D96] # ETHIOPIC SYLLABLE GGWE 1320 ; [.1F34.0020.0002.1320] # ETHIOPIC SYLLABLE THA 1321 ; [.1F35.0020.0002.1321] # ETHIOPIC SYLLABLE THU 1322 ; [.1F36.0020.0002.1322] # ETHIOPIC SYLLABLE THI 1323 ; [.1F37.0020.0002.1323] # ETHIOPIC SYLLABLE THAA 1324 ; [.1F38.0020.0002.1324] # ETHIOPIC SYLLABLE THEE 1325 ; [.1F39.0020.0002.1325] # ETHIOPIC SYLLABLE THE 1326 ; [.1F3A.0020.0002.1326] # ETHIOPIC SYLLABLE THO 1327 ; [.1F3B.0020.0002.1327] # ETHIOPIC SYLLABLE THWA 2D8F ; [.1F3C.0020.0002.2D8F] # ETHIOPIC SYLLABLE THOA 1328 ; [.1F3D.0020.0002.1328] # ETHIOPIC SYLLABLE CHA 1329 ; [.1F3E.0020.0002.1329] # ETHIOPIC SYLLABLE CHU 132A ; [.1F3F.0020.0002.132A] # ETHIOPIC SYLLABLE CHI 132B ; [.1F40.0020.0002.132B] # ETHIOPIC SYLLABLE CHAA 132C ; [.1F41.0020.0002.132C] # ETHIOPIC SYLLABLE CHEE 132D ; [.1F42.0020.0002.132D] # ETHIOPIC SYLLABLE CHE 132E ; [.1F43.0020.0002.132E] # ETHIOPIC SYLLABLE CHO 132F ; [.1F44.0020.0002.132F] # ETHIOPIC SYLLABLE CHWA 2D90 ; [.1F45.0020.0002.2D90] # ETHIOPIC SYLLABLE CHOA AB20 ; [.1F46.0020.0002.AB20] # ETHIOPIC SYLLABLE CCHHA AB21 ; [.1F47.0020.0002.AB21] # ETHIOPIC SYLLABLE CCHHU AB22 ; [.1F48.0020.0002.AB22] # ETHIOPIC SYLLABLE CCHHI AB23 ; [.1F49.0020.0002.AB23] # ETHIOPIC SYLLABLE CCHHAA AB24 ; [.1F4A.0020.0002.AB24] # ETHIOPIC SYLLABLE CCHHEE AB25 ; [.1F4B.0020.0002.AB25] # ETHIOPIC SYLLABLE CCHHE AB26 ; [.1F4C.0020.0002.AB26] # ETHIOPIC SYLLABLE CCHHO 1330 ; [.1F4D.0020.0002.1330] # ETHIOPIC SYLLABLE PHA 1331 ; [.1F4E.0020.0002.1331] # ETHIOPIC SYLLABLE PHU 1332 ; [.1F4F.0020.0002.1332] # ETHIOPIC SYLLABLE PHI 1333 ; [.1F50.0020.0002.1333] # ETHIOPIC SYLLABLE PHAA 1334 ; [.1F51.0020.0002.1334] # ETHIOPIC SYLLABLE PHEE 1335 ; [.1F52.0020.0002.1335] # ETHIOPIC SYLLABLE PHE 1336 ; [.1F53.0020.0002.1336] # ETHIOPIC SYLLABLE PHO 1337 ; [.1F54.0020.0002.1337] # ETHIOPIC SYLLABLE PHWA 2D91 ; [.1F55.0020.0002.2D91] # ETHIOPIC SYLLABLE PHOA 1338 ; [.1F56.0020.0002.1338] # ETHIOPIC SYLLABLE TSA 1339 ; [.1F57.0020.0002.1339] # ETHIOPIC SYLLABLE TSU 133A ; [.1F58.0020.0002.133A] # ETHIOPIC SYLLABLE TSI 133B ; [.1F59.0020.0002.133B] # ETHIOPIC SYLLABLE TSAA 133C ; [.1F5A.0020.0002.133C] # ETHIOPIC SYLLABLE TSEE 133D ; [.1F5B.0020.0002.133D] # ETHIOPIC SYLLABLE TSE 133E ; [.1F5C.0020.0002.133E] # ETHIOPIC SYLLABLE TSO 133F ; [.1F5D.0020.0002.133F] # ETHIOPIC SYLLABLE TSWA AB28 ; [.1F5E.0020.0002.AB28] # ETHIOPIC SYLLABLE BBA AB29 ; [.1F5F.0020.0002.AB29] # ETHIOPIC SYLLABLE BBU AB2A ; [.1F60.0020.0002.AB2A] # ETHIOPIC SYLLABLE BBI AB2B ; [.1F61.0020.0002.AB2B] # ETHIOPIC SYLLABLE BBAA AB2C ; [.1F62.0020.0002.AB2C] # ETHIOPIC SYLLABLE BBEE AB2D ; [.1F63.0020.0002.AB2D] # ETHIOPIC SYLLABLE BBE AB2E ; [.1F64.0020.0002.AB2E] # ETHIOPIC SYLLABLE BBO 1340 ; [.1F65.0020.0002.1340] # ETHIOPIC SYLLABLE TZA 1341 ; [.1F66.0020.0002.1341] # ETHIOPIC SYLLABLE TZU 1342 ; [.1F67.0020.0002.1342] # ETHIOPIC SYLLABLE TZI 1343 ; [.1F68.0020.0002.1343] # ETHIOPIC SYLLABLE TZAA 1344 ; [.1F69.0020.0002.1344] # ETHIOPIC SYLLABLE TZEE 1345 ; [.1F6A.0020.0002.1345] # ETHIOPIC SYLLABLE TZE 1346 ; [.1F6B.0020.0002.1346] # ETHIOPIC SYLLABLE TZO 1347 ; [.1F6C.0020.0002.1347] # ETHIOPIC SYLLABLE TZOA 1348 ; [.1F6D.0020.0002.1348] # ETHIOPIC SYLLABLE FA 1349 ; [.1F6E.0020.0002.1349] # ETHIOPIC SYLLABLE FU 134A ; [.1F6F.0020.0002.134A] # ETHIOPIC SYLLABLE FI 134B ; [.1F70.0020.0002.134B] # ETHIOPIC SYLLABLE FAA 134C ; [.1F71.0020.0002.134C] # ETHIOPIC SYLLABLE FEE 134D ; [.1F72.0020.0002.134D] # ETHIOPIC SYLLABLE FE 134E ; [.1F73.0020.0002.134E] # ETHIOPIC SYLLABLE FO 134F ; [.1F74.0020.0002.134F] # ETHIOPIC SYLLABLE FWA 1388 ; [.1F75.0020.0002.1388] # ETHIOPIC SYLLABLE SEBATBEIT FWA 1389 ; [.1F76.0020.0002.1389] # ETHIOPIC SYLLABLE FWI 138A ; [.1F77.0020.0002.138A] # ETHIOPIC SYLLABLE FWEE 138B ; [.1F78.0020.0002.138B] # ETHIOPIC SYLLABLE FWE 1350 ; [.1F79.0020.0002.1350] # ETHIOPIC SYLLABLE PA 1351 ; [.1F7A.0020.0002.1351] # ETHIOPIC SYLLABLE PU 1352 ; [.1F7B.0020.0002.1352] # ETHIOPIC SYLLABLE PI 1353 ; [.1F7C.0020.0002.1353] # ETHIOPIC SYLLABLE PAA 1354 ; [.1F7D.0020.0002.1354] # ETHIOPIC SYLLABLE PEE 1355 ; [.1F7E.0020.0002.1355] # ETHIOPIC SYLLABLE PE 1356 ; [.1F7F.0020.0002.1356] # ETHIOPIC SYLLABLE PO 1357 ; [.1F80.0020.0002.1357] # ETHIOPIC SYLLABLE PWA 138C ; [.1F81.0020.0002.138C] # ETHIOPIC SYLLABLE SEBATBEIT PWA 138D ; [.1F82.0020.0002.138D] # ETHIOPIC SYLLABLE PWI 138E ; [.1F83.0020.0002.138E] # ETHIOPIC SYLLABLE PWEE 138F ; [.1F84.0020.0002.138F] # ETHIOPIC SYLLABLE PWE 2D92 ; [.1F85.0020.0002.2D92] # ETHIOPIC SYLLABLE POA 1358 ; [.1F86.0020.0002.1358] # ETHIOPIC SYLLABLE RYA 1359 ; [.1F87.0020.0002.1359] # ETHIOPIC SYLLABLE MYA 135A ; [.1F88.0020.0002.135A] # ETHIOPIC SYLLABLE FYA 2DA0 ; [.1F89.0020.0002.2DA0] # ETHIOPIC SYLLABLE SSA 2DA1 ; [.1F8A.0020.0002.2DA1] # ETHIOPIC SYLLABLE SSU 2DA2 ; [.1F8B.0020.0002.2DA2] # ETHIOPIC SYLLABLE SSI 2DA3 ; [.1F8C.0020.0002.2DA3] # ETHIOPIC SYLLABLE SSAA 2DA4 ; [.1F8D.0020.0002.2DA4] # ETHIOPIC SYLLABLE SSEE 2DA5 ; [.1F8E.0020.0002.2DA5] # ETHIOPIC SYLLABLE SSE 2DA6 ; [.1F8F.0020.0002.2DA6] # ETHIOPIC SYLLABLE SSO 2DA8 ; [.1F90.0020.0002.2DA8] # ETHIOPIC SYLLABLE CCA 2DA9 ; [.1F91.0020.0002.2DA9] # ETHIOPIC SYLLABLE CCU 2DAA ; [.1F92.0020.0002.2DAA] # ETHIOPIC SYLLABLE CCI 2DAB ; [.1F93.0020.0002.2DAB] # ETHIOPIC SYLLABLE CCAA 2DAC ; [.1F94.0020.0002.2DAC] # ETHIOPIC SYLLABLE CCEE 2DAD ; [.1F95.0020.0002.2DAD] # ETHIOPIC SYLLABLE CCE 2DAE ; [.1F96.0020.0002.2DAE] # ETHIOPIC SYLLABLE CCO 2DB0 ; [.1F97.0020.0002.2DB0] # ETHIOPIC SYLLABLE ZZA 2DB1 ; [.1F98.0020.0002.2DB1] # ETHIOPIC SYLLABLE ZZU 2DB2 ; [.1F99.0020.0002.2DB2] # ETHIOPIC SYLLABLE ZZI 2DB3 ; [.1F9A.0020.0002.2DB3] # ETHIOPIC SYLLABLE ZZAA 2DB4 ; [.1F9B.0020.0002.2DB4] # ETHIOPIC SYLLABLE ZZEE 2DB5 ; [.1F9C.0020.0002.2DB5] # ETHIOPIC SYLLABLE ZZE 2DB6 ; [.1F9D.0020.0002.2DB6] # ETHIOPIC SYLLABLE ZZO 2DB8 ; [.1F9E.0020.0002.2DB8] # ETHIOPIC SYLLABLE CCHA 2DB9 ; [.1F9F.0020.0002.2DB9] # ETHIOPIC SYLLABLE CCHU 2DBA ; [.1FA0.0020.0002.2DBA] # ETHIOPIC SYLLABLE CCHI 2DBB ; [.1FA1.0020.0002.2DBB] # ETHIOPIC SYLLABLE CCHAA 2DBC ; [.1FA2.0020.0002.2DBC] # ETHIOPIC SYLLABLE CCHEE 2DBD ; [.1FA3.0020.0002.2DBD] # ETHIOPIC SYLLABLE CCHE 2DBE ; [.1FA4.0020.0002.2DBE] # ETHIOPIC SYLLABLE CCHO 2DC0 ; [.1FA5.0020.0002.2DC0] # ETHIOPIC SYLLABLE QYA 2DC1 ; [.1FA6.0020.0002.2DC1] # ETHIOPIC SYLLABLE QYU 2DC2 ; [.1FA7.0020.0002.2DC2] # ETHIOPIC SYLLABLE QYI 2DC3 ; [.1FA8.0020.0002.2DC3] # ETHIOPIC SYLLABLE QYAA 2DC4 ; [.1FA9.0020.0002.2DC4] # ETHIOPIC SYLLABLE QYEE 2DC5 ; [.1FAA.0020.0002.2DC5] # ETHIOPIC SYLLABLE QYE 2DC6 ; [.1FAB.0020.0002.2DC6] # ETHIOPIC SYLLABLE QYO 2DC8 ; [.1FAC.0020.0002.2DC8] # ETHIOPIC SYLLABLE KYA 2DC9 ; [.1FAD.0020.0002.2DC9] # ETHIOPIC SYLLABLE KYU 2DCA ; [.1FAE.0020.0002.2DCA] # ETHIOPIC SYLLABLE KYI 2DCB ; [.1FAF.0020.0002.2DCB] # ETHIOPIC SYLLABLE KYAA 2DCC ; [.1FB0.0020.0002.2DCC] # ETHIOPIC SYLLABLE KYEE 2DCD ; [.1FB1.0020.0002.2DCD] # ETHIOPIC SYLLABLE KYE 2DCE ; [.1FB2.0020.0002.2DCE] # ETHIOPIC SYLLABLE KYO 2DD0 ; [.1FB3.0020.0002.2DD0] # ETHIOPIC SYLLABLE XYA 2DD1 ; [.1FB4.0020.0002.2DD1] # ETHIOPIC SYLLABLE XYU 2DD2 ; [.1FB5.0020.0002.2DD2] # ETHIOPIC SYLLABLE XYI 2DD3 ; [.1FB6.0020.0002.2DD3] # ETHIOPIC SYLLABLE XYAA 2DD4 ; [.1FB7.0020.0002.2DD4] # ETHIOPIC SYLLABLE XYEE 2DD5 ; [.1FB8.0020.0002.2DD5] # ETHIOPIC SYLLABLE XYE 2DD6 ; [.1FB9.0020.0002.2DD6] # ETHIOPIC SYLLABLE XYO 2DD8 ; [.1FBA.0020.0002.2DD8] # ETHIOPIC SYLLABLE GYA 2DD9 ; [.1FBB.0020.0002.2DD9] # ETHIOPIC SYLLABLE GYU 2DDA ; [.1FBC.0020.0002.2DDA] # ETHIOPIC SYLLABLE GYI 2DDB ; [.1FBD.0020.0002.2DDB] # ETHIOPIC SYLLABLE GYAA 2DDC ; [.1FBE.0020.0002.2DDC] # ETHIOPIC SYLLABLE GYEE 2DDD ; [.1FBF.0020.0002.2DDD] # ETHIOPIC SYLLABLE GYE 2DDE ; [.1FC0.0020.0002.2DDE] # ETHIOPIC SYLLABLE GYO 0950 ; [.1FC1.0020.0002.0950] # DEVANAGARI OM 0972 ; [.1FC2.0020.0002.0972] # DEVANAGARI LETTER CANDRA A 0904 ; [.1FC3.0020.0002.0904] # DEVANAGARI LETTER SHORT A 0905 ; [.1FC4.0020.0002.0905] # DEVANAGARI LETTER A 0906 ; [.1FC5.0020.0002.0906] # DEVANAGARI LETTER AA 0973 ; [.1FC6.0020.0002.0973] # DEVANAGARI LETTER OE 0974 ; [.1FC7.0020.0002.0974] # DEVANAGARI LETTER OOE 0975 ; [.1FC8.0020.0002.0975] # DEVANAGARI LETTER AW 0976 ; [.1FC9.0020.0002.0976] # DEVANAGARI LETTER UE 0977 ; [.1FCA.0020.0002.0977] # DEVANAGARI LETTER UUE 0907 ; [.1FCB.0020.0002.0907] # DEVANAGARI LETTER I 0908 ; [.1FCC.0020.0002.0908] # DEVANAGARI LETTER II 0909 ; [.1FCD.0020.0002.0909] # DEVANAGARI LETTER U 090A ; [.1FCE.0020.0002.090A] # DEVANAGARI LETTER UU 090B ; [.1FCF.0020.0002.090B] # DEVANAGARI LETTER VOCALIC R 0960 ; [.1FD0.0020.0002.0960] # DEVANAGARI LETTER VOCALIC RR 090C ; [.1FD1.0020.0002.090C] # DEVANAGARI LETTER VOCALIC L 0961 ; [.1FD2.0020.0002.0961] # DEVANAGARI LETTER VOCALIC LL 090D ; [.1FD3.0020.0002.090D] # DEVANAGARI LETTER CANDRA E 090E ; [.1FD4.0020.0002.090E] # DEVANAGARI LETTER SHORT E 090F ; [.1FD5.0020.0002.090F] # DEVANAGARI LETTER E 0910 ; [.1FD6.0020.0002.0910] # DEVANAGARI LETTER AI 0911 ; [.1FD7.0020.0002.0911] # DEVANAGARI LETTER CANDRA O 0912 ; [.1FD8.0020.0002.0912] # DEVANAGARI LETTER SHORT O 0913 ; [.1FD9.0020.0002.0913] # DEVANAGARI LETTER O 0914 ; [.1FDA.0020.0002.0914] # DEVANAGARI LETTER AU 0915 ; [.1FDB.0020.0002.0915] # DEVANAGARI LETTER KA 0958 ; [.1FDB.0020.0002.0915][.0000.00F1.0002.093C] # DEVANAGARI LETTER QA 0916 ; [.1FDC.0020.0002.0916] # DEVANAGARI LETTER KHA 0959 ; [.1FDC.0020.0002.0916][.0000.00F1.0002.093C] # DEVANAGARI LETTER KHHA 0917 ; [.1FDD.0020.0002.0917] # DEVANAGARI LETTER GA 095A ; [.1FDD.0020.0002.0917][.0000.00F1.0002.093C] # DEVANAGARI LETTER GHHA 097B ; [.1FDE.0020.0002.097B] # DEVANAGARI LETTER GGA 0918 ; [.1FDF.0020.0002.0918] # DEVANAGARI LETTER GHA 0919 ; [.1FE0.0020.0002.0919] # DEVANAGARI LETTER NGA 091A ; [.1FE1.0020.0002.091A] # DEVANAGARI LETTER CA 091B ; [.1FE2.0020.0002.091B] # DEVANAGARI LETTER CHA 091C ; [.1FE3.0020.0002.091C] # DEVANAGARI LETTER JA 095B ; [.1FE3.0020.0002.091C][.0000.00F1.0002.093C] # DEVANAGARI LETTER ZA 0979 ; [.1FE4.0020.0002.0979] # DEVANAGARI LETTER ZHA 097C ; [.1FE5.0020.0002.097C] # DEVANAGARI LETTER JJA 091D ; [.1FE6.0020.0002.091D] # DEVANAGARI LETTER JHA 091E ; [.1FE7.0020.0002.091E] # DEVANAGARI LETTER NYA 091F ; [.1FE8.0020.0002.091F] # DEVANAGARI LETTER TTA 0920 ; [.1FE9.0020.0002.0920] # DEVANAGARI LETTER TTHA 0921 ; [.1FEA.0020.0002.0921] # DEVANAGARI LETTER DDA 095C ; [.1FEA.0020.0002.0921][.0000.00F1.0002.093C] # DEVANAGARI LETTER DDDHA 097E ; [.1FEB.0020.0002.097E] # DEVANAGARI LETTER DDDA 0922 ; [.1FEC.0020.0002.0922] # DEVANAGARI LETTER DDHA 095D ; [.1FEC.0020.0002.0922][.0000.00F1.0002.093C] # DEVANAGARI LETTER RHA 0923 ; [.1FED.0020.0002.0923] # DEVANAGARI LETTER NNA 0924 ; [.1FEE.0020.0002.0924] # DEVANAGARI LETTER TA 0925 ; [.1FEF.0020.0002.0925] # DEVANAGARI LETTER THA 0926 ; [.1FF0.0020.0002.0926] # DEVANAGARI LETTER DA 0927 ; [.1FF1.0020.0002.0927] # DEVANAGARI LETTER DHA 0928 ; [.1FF2.0020.0002.0928] # DEVANAGARI LETTER NA 0929 ; [.1FF2.0020.0002.0928][.0000.00F1.0002.093C] # DEVANAGARI LETTER NNNA 092A ; [.1FF3.0020.0002.092A] # DEVANAGARI LETTER PA 092B ; [.1FF4.0020.0002.092B] # DEVANAGARI LETTER PHA 095E ; [.1FF4.0020.0002.092B][.0000.00F1.0002.093C] # DEVANAGARI LETTER FA 092C ; [.1FF5.0020.0002.092C] # DEVANAGARI LETTER BA 097F ; [.1FF6.0020.0002.097F] # DEVANAGARI LETTER BBA 092D ; [.1FF7.0020.0002.092D] # DEVANAGARI LETTER BHA 092E ; [.1FF8.0020.0002.092E] # DEVANAGARI LETTER MA 092F ; [.1FF9.0020.0002.092F] # DEVANAGARI LETTER YA 095F ; [.1FF9.0020.0002.092F][.0000.00F1.0002.093C] # DEVANAGARI LETTER YYA 097A ; [.1FFA.0020.0002.097A] # DEVANAGARI LETTER HEAVY YA 0930 ; [.1FFB.0020.0002.0930] # DEVANAGARI LETTER RA 0931 ; [.1FFB.0020.0002.0930][.0000.00F1.0002.093C] # DEVANAGARI LETTER RRA 0932 ; [.1FFC.0020.0002.0932] # DEVANAGARI LETTER LA 0933 ; [.1FFD.0020.0002.0933] # DEVANAGARI LETTER LLA 0934 ; [.1FFD.0020.0002.0933][.0000.00F1.0002.093C] # DEVANAGARI LETTER LLLA 0935 ; [.1FFE.0020.0002.0935] # DEVANAGARI LETTER VA 0936 ; [.1FFF.0020.0002.0936] # DEVANAGARI LETTER SHA 0937 ; [.2000.0020.0002.0937] # DEVANAGARI LETTER SSA 0938 ; [.2001.0020.0002.0938] # DEVANAGARI LETTER SA 0939 ; [.2002.0020.0002.0939] # DEVANAGARI LETTER HA 093D ; [.2003.0020.0002.093D] # DEVANAGARI SIGN AVAGRAHA 097D ; [.2004.0020.0002.097D] # DEVANAGARI LETTER GLOTTAL STOP 1CE9 ; [.2005.0020.0002.1CE9] # VEDIC SIGN ANUSVARA ANTARGOMUKHA 1CEA ; [.2005.0020.0004.1CEA] # VEDIC SIGN ANUSVARA BAHIRGOMUKHA 1CEB ; [.2005.0020.0004.1CEB] # VEDIC SIGN ANUSVARA VAMAGOMUKHA 1CEC ; [.2005.0020.0004.1CEC] # VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL 1CEE ; [.2005.0020.0004.1CEE] # VEDIC SIGN HEXIFORM LONG ANUSVARA 1CEF ; [.2005.0020.0004.1CEF] # VEDIC SIGN LONG ANUSVARA 1CF0 ; [.2005.0020.0004.1CF0] # VEDIC SIGN RTHANG LONG ANUSVARA 1CF1 ; [.2005.0020.0004.1CF1] # VEDIC SIGN ANUSVARA UBHAYATO MUKHA 1CF5 ; [.2006.0020.0002.1CF5] # VEDIC SIGN JIHVAMULIYA 1CF6 ; [.2007.0020.0002.1CF6] # VEDIC SIGN UPADHMANIYA A8F2 ; [.2008.0020.0002.A8F2] # DEVANAGARI SIGN SPACING CANDRABINDU A8F3 ; [.2008.0020.0004.A8F3] # DEVANAGARI SIGN CANDRABINDU VIRAMA A8F4 ; [.2008.0020.0004.A8F4] # DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA A8F5 ; [.2008.0020.0004.A8F5] # DEVANAGARI SIGN CANDRABINDU TWO A8F6 ; [.2008.0020.0004.A8F6] # DEVANAGARI SIGN CANDRABINDU THREE A8F7 ; [.2008.0020.0004.A8F7] # DEVANAGARI SIGN CANDRABINDU AVAGRAHA A8FB ; [.2009.0020.0002.A8FB] # DEVANAGARI HEADSTROKE 093E ; [.200A.0020.0002.093E] # DEVANAGARI VOWEL SIGN AA 093A ; [.200B.0020.0002.093A] # DEVANAGARI VOWEL SIGN OE 093B ; [.200C.0020.0002.093B] # DEVANAGARI VOWEL SIGN OOE 094F ; [.200D.0020.0002.094F] # DEVANAGARI VOWEL SIGN AW 0956 ; [.200E.0020.0002.0956] # DEVANAGARI VOWEL SIGN UE 0957 ; [.200F.0020.0002.0957] # DEVANAGARI VOWEL SIGN UUE 093F ; [.2010.0020.0002.093F] # DEVANAGARI VOWEL SIGN I 0940 ; [.2011.0020.0002.0940] # DEVANAGARI VOWEL SIGN II 0941 ; [.2012.0020.0002.0941] # DEVANAGARI VOWEL SIGN U 0942 ; [.2013.0020.0002.0942] # DEVANAGARI VOWEL SIGN UU 0943 ; [.2014.0020.0002.0943] # DEVANAGARI VOWEL SIGN VOCALIC R 0944 ; [.2015.0020.0002.0944] # DEVANAGARI VOWEL SIGN VOCALIC RR 0962 ; [.2016.0020.0002.0962] # DEVANAGARI VOWEL SIGN VOCALIC L 0963 ; [.2017.0020.0002.0963] # DEVANAGARI VOWEL SIGN VOCALIC LL 0945 ; [.2018.0020.0002.0945] # DEVANAGARI VOWEL SIGN CANDRA E 0955 ; [.2019.0020.0002.0955] # DEVANAGARI VOWEL SIGN CANDRA LONG E 0946 ; [.201A.0020.0002.0946] # DEVANAGARI VOWEL SIGN SHORT E 0947 ; [.201B.0020.0002.0947] # DEVANAGARI VOWEL SIGN E 094E ; [.201C.0020.0002.094E] # DEVANAGARI VOWEL SIGN PRISHTHAMATRA E 0948 ; [.201D.0020.0002.0948] # DEVANAGARI VOWEL SIGN AI 0949 ; [.201E.0020.0002.0949] # DEVANAGARI VOWEL SIGN CANDRA O 094A ; [.201F.0020.0002.094A] # DEVANAGARI VOWEL SIGN SHORT O 094B ; [.2020.0020.0002.094B] # DEVANAGARI VOWEL SIGN O 094C ; [.2021.0020.0002.094C] # DEVANAGARI VOWEL SIGN AU 094D ; [.2022.0020.0002.094D] # DEVANAGARI SIGN VIRAMA 0985 ; [.2023.0020.0002.0985] # BENGALI LETTER A 0986 ; [.2024.0020.0002.0986] # BENGALI LETTER AA 0987 ; [.2025.0020.0002.0987] # BENGALI LETTER I 0988 ; [.2026.0020.0002.0988] # BENGALI LETTER II 0989 ; [.2027.0020.0002.0989] # BENGALI LETTER U 098A ; [.2028.0020.0002.098A] # BENGALI LETTER UU 098B ; [.2029.0020.0002.098B] # BENGALI LETTER VOCALIC R 09E0 ; [.202A.0020.0002.09E0] # BENGALI LETTER VOCALIC RR 098C ; [.202B.0020.0002.098C] # BENGALI LETTER VOCALIC L 09E1 ; [.202C.0020.0002.09E1] # BENGALI LETTER VOCALIC LL 098F ; [.202D.0020.0002.098F] # BENGALI LETTER E 0990 ; [.202E.0020.0002.0990] # BENGALI LETTER AI 0993 ; [.202F.0020.0002.0993] # BENGALI LETTER O 0994 ; [.2030.0020.0002.0994] # BENGALI LETTER AU 0995 ; [.2031.0020.0002.0995] # BENGALI LETTER KA 0996 ; [.2032.0020.0002.0996] # BENGALI LETTER KHA 0997 ; [.2033.0020.0002.0997] # BENGALI LETTER GA 0998 ; [.2034.0020.0002.0998] # BENGALI LETTER GHA 0999 ; [.2035.0020.0002.0999] # BENGALI LETTER NGA 099A ; [.2036.0020.0002.099A] # BENGALI LETTER CA 099B ; [.2037.0020.0002.099B] # BENGALI LETTER CHA 099C ; [.2038.0020.0002.099C] # BENGALI LETTER JA 099D ; [.2039.0020.0002.099D] # BENGALI LETTER JHA 099E ; [.203A.0020.0002.099E] # BENGALI LETTER NYA 099F ; [.203B.0020.0002.099F] # BENGALI LETTER TTA 09A0 ; [.203C.0020.0002.09A0] # BENGALI LETTER TTHA 09A1 ; [.203D.0020.0002.09A1] # BENGALI LETTER DDA 09DC ; [.203D.0020.0002.09A1][.0000.00F1.0002.093C] # BENGALI LETTER RRA 09A2 ; [.203E.0020.0002.09A2] # BENGALI LETTER DDHA 09DD ; [.203E.0020.0002.09A2][.0000.00F1.0002.093C] # BENGALI LETTER RHA 09A3 ; [.203F.0020.0002.09A3] # BENGALI LETTER NNA 09A4 ; [.2040.0020.0002.09A4] # BENGALI LETTER TA 09CE ; [.2040.0020.0004.09CE][.2061.0020.0004.09CE] # BENGALI LETTER KHANDA TA 09A5 ; [.2041.0020.0002.09A5] # BENGALI LETTER THA 09A6 ; [.2042.0020.0002.09A6] # BENGALI LETTER DA 09A7 ; [.2043.0020.0002.09A7] # BENGALI LETTER DHA 09A8 ; [.2044.0020.0002.09A8] # BENGALI LETTER NA 09AA ; [.2045.0020.0002.09AA] # BENGALI LETTER PA 09AB ; [.2046.0020.0002.09AB] # BENGALI LETTER PHA 09AC ; [.2047.0020.0002.09AC] # BENGALI LETTER BA 09AD ; [.2048.0020.0002.09AD] # BENGALI LETTER BHA 09AE ; [.2049.0020.0002.09AE] # BENGALI LETTER MA 09AF ; [.204A.0020.0002.09AF] # BENGALI LETTER YA 09DF ; [.204A.0020.0002.09AF][.0000.00F1.0002.093C] # BENGALI LETTER YYA 09B0 ; [.204B.0020.0002.09B0] # BENGALI LETTER RA 09F0 ; [.204C.0020.0002.09F0] # BENGALI LETTER RA WITH MIDDLE DIAGONAL 09B2 ; [.204D.0020.0002.09B2] # BENGALI LETTER LA 09F1 ; [.204E.0020.0002.09F1] # BENGALI LETTER RA WITH LOWER DIAGONAL 09B6 ; [.204F.0020.0002.09B6] # BENGALI LETTER SHA 09B7 ; [.2050.0020.0002.09B7] # BENGALI LETTER SSA 09B8 ; [.2051.0020.0002.09B8] # BENGALI LETTER SA 09B9 ; [.2052.0020.0002.09B9] # BENGALI LETTER HA 09BD ; [.2053.0020.0002.09BD] # BENGALI SIGN AVAGRAHA 09BE ; [.2054.0020.0002.09BE] # BENGALI VOWEL SIGN AA 09BF ; [.2055.0020.0002.09BF] # BENGALI VOWEL SIGN I 09C0 ; [.2056.0020.0002.09C0] # BENGALI VOWEL SIGN II 09C1 ; [.2057.0020.0002.09C1] # BENGALI VOWEL SIGN U 09C2 ; [.2058.0020.0002.09C2] # BENGALI VOWEL SIGN UU 09C3 ; [.2059.0020.0002.09C3] # BENGALI VOWEL SIGN VOCALIC R 09C4 ; [.205A.0020.0002.09C4] # BENGALI VOWEL SIGN VOCALIC RR 09E2 ; [.205B.0020.0002.09E2] # BENGALI VOWEL SIGN VOCALIC L 09E3 ; [.205C.0020.0002.09E3] # BENGALI VOWEL SIGN VOCALIC LL 09C7 ; [.205D.0020.0002.09C7] # BENGALI VOWEL SIGN E 09C8 ; [.205E.0020.0002.09C8] # BENGALI VOWEL SIGN AI 09CB ; [.205F.0020.0002.09CB] # BENGALI VOWEL SIGN O 09C7 09BE ; [.205F.0020.0002.09CB] # BENGALI VOWEL SIGN O 09CC ; [.2060.0020.0002.09CC] # BENGALI VOWEL SIGN AU 09C7 09D7 ; [.2060.0020.0002.09CC] # BENGALI VOWEL SIGN AU 09CD ; [.2061.0020.0002.09CD] # BENGALI SIGN VIRAMA 09D7 ; [.2062.0020.0002.09D7] # BENGALI AU LENGTH MARK 0A74 ; [.2063.0020.0002.0A74] # GURMUKHI EK ONKAR 0A73 ; [.2064.0020.0002.0A73] # GURMUKHI URA 0A09 ; [.2065.0020.0002.0A09] # GURMUKHI LETTER U 0A0A ; [.2066.0020.0002.0A0A] # GURMUKHI LETTER UU 0A13 ; [.2067.0020.0002.0A13] # GURMUKHI LETTER OO 0A05 ; [.2068.0020.0002.0A05] # GURMUKHI LETTER A 0A06 ; [.2069.0020.0002.0A06] # GURMUKHI LETTER AA 0A10 ; [.206A.0020.0002.0A10] # GURMUKHI LETTER AI 0A14 ; [.206B.0020.0002.0A14] # GURMUKHI LETTER AU 0A72 ; [.206C.0020.0002.0A72] # GURMUKHI IRI 0A07 ; [.206D.0020.0002.0A07] # GURMUKHI LETTER I 0A08 ; [.206E.0020.0002.0A08] # GURMUKHI LETTER II 0A0F ; [.206F.0020.0002.0A0F] # GURMUKHI LETTER EE 0A38 ; [.2070.0020.0002.0A38] # GURMUKHI LETTER SA 0A36 ; [.2070.0020.0002.0A38][.0000.00F1.0002.093C] # GURMUKHI LETTER SHA 0A39 ; [.2071.0020.0002.0A39] # GURMUKHI LETTER HA 0A51 ; [.2072.0020.0002.0A51] # GURMUKHI SIGN UDAAT 0A15 ; [.2073.0020.0002.0A15] # GURMUKHI LETTER KA 0A16 ; [.2074.0020.0002.0A16] # GURMUKHI LETTER KHA 0A59 ; [.2074.0020.0002.0A16][.0000.00F1.0002.093C] # GURMUKHI LETTER KHHA 0A17 ; [.2075.0020.0002.0A17] # GURMUKHI LETTER GA 0A5A ; [.2075.0020.0002.0A17][.0000.00F1.0002.093C] # GURMUKHI LETTER GHHA 0A18 ; [.2076.0020.0002.0A18] # GURMUKHI LETTER GHA 0A19 ; [.2077.0020.0002.0A19] # GURMUKHI LETTER NGA 0A1A ; [.2078.0020.0002.0A1A] # GURMUKHI LETTER CA 0A1B ; [.2079.0020.0002.0A1B] # GURMUKHI LETTER CHA 0A1C ; [.207A.0020.0002.0A1C] # GURMUKHI LETTER JA 0A5B ; [.207A.0020.0002.0A1C][.0000.00F1.0002.093C] # GURMUKHI LETTER ZA 0A1D ; [.207B.0020.0002.0A1D] # GURMUKHI LETTER JHA 0A1E ; [.207C.0020.0002.0A1E] # GURMUKHI LETTER NYA 0A1F ; [.207D.0020.0002.0A1F] # GURMUKHI LETTER TTA 0A20 ; [.207E.0020.0002.0A20] # GURMUKHI LETTER TTHA 0A21 ; [.207F.0020.0002.0A21] # GURMUKHI LETTER DDA 0A22 ; [.2080.0020.0002.0A22] # GURMUKHI LETTER DDHA 0A23 ; [.2081.0020.0002.0A23] # GURMUKHI LETTER NNA 0A24 ; [.2082.0020.0002.0A24] # GURMUKHI LETTER TA 0A25 ; [.2083.0020.0002.0A25] # GURMUKHI LETTER THA 0A26 ; [.2084.0020.0002.0A26] # GURMUKHI LETTER DA 0A27 ; [.2085.0020.0002.0A27] # GURMUKHI LETTER DHA 0A28 ; [.2086.0020.0002.0A28] # GURMUKHI LETTER NA 0A2A ; [.2087.0020.0002.0A2A] # GURMUKHI LETTER PA 0A2B ; [.2088.0020.0002.0A2B] # GURMUKHI LETTER PHA 0A5E ; [.2088.0020.0002.0A2B][.0000.00F1.0002.093C] # GURMUKHI LETTER FA 0A2C ; [.2089.0020.0002.0A2C] # GURMUKHI LETTER BA 0A2D ; [.208A.0020.0002.0A2D] # GURMUKHI LETTER BHA 0A2E ; [.208B.0020.0002.0A2E] # GURMUKHI LETTER MA 0A2F ; [.208C.0020.0002.0A2F] # GURMUKHI LETTER YA 0A75 ; [.208D.0020.0002.0A75] # GURMUKHI SIGN YAKASH 0A30 ; [.208E.0020.0002.0A30] # GURMUKHI LETTER RA 0A32 ; [.208F.0020.0002.0A32] # GURMUKHI LETTER LA 0A33 ; [.208F.0020.0002.0A32][.0000.00F1.0002.093C] # GURMUKHI LETTER LLA 0A35 ; [.2090.0020.0002.0A35] # GURMUKHI LETTER VA 0A5C ; [.2091.0020.0002.0A5C] # GURMUKHI LETTER RRA 0A3E ; [.2092.0020.0002.0A3E] # GURMUKHI VOWEL SIGN AA 0A3F ; [.2093.0020.0002.0A3F] # GURMUKHI VOWEL SIGN I 0A40 ; [.2094.0020.0002.0A40] # GURMUKHI VOWEL SIGN II 0A41 ; [.2095.0020.0002.0A41] # GURMUKHI VOWEL SIGN U 0A42 ; [.2096.0020.0002.0A42] # GURMUKHI VOWEL SIGN UU 0A47 ; [.2097.0020.0002.0A47] # GURMUKHI VOWEL SIGN EE 0A48 ; [.2098.0020.0002.0A48] # GURMUKHI VOWEL SIGN AI 0A4B ; [.2099.0020.0002.0A4B] # GURMUKHI VOWEL SIGN OO 0A4C ; [.209A.0020.0002.0A4C] # GURMUKHI VOWEL SIGN AU 0A4D ; [.209B.0020.0002.0A4D] # GURMUKHI SIGN VIRAMA 0AD0 ; [.209C.0020.0002.0AD0] # GUJARATI OM 0A85 ; [.209D.0020.0002.0A85] # GUJARATI LETTER A 0A86 ; [.209E.0020.0002.0A86] # GUJARATI LETTER AA 0A87 ; [.209F.0020.0002.0A87] # GUJARATI LETTER I 0A88 ; [.20A0.0020.0002.0A88] # GUJARATI LETTER II 0A89 ; [.20A1.0020.0002.0A89] # GUJARATI LETTER U 0A8A ; [.20A2.0020.0002.0A8A] # GUJARATI LETTER UU 0A8B ; [.20A3.0020.0002.0A8B] # GUJARATI LETTER VOCALIC R 0AE0 ; [.20A4.0020.0002.0AE0] # GUJARATI LETTER VOCALIC RR 0A8C ; [.20A5.0020.0002.0A8C] # GUJARATI LETTER VOCALIC L 0AE1 ; [.20A6.0020.0002.0AE1] # GUJARATI LETTER VOCALIC LL 0A8D ; [.20A7.0020.0002.0A8D] # GUJARATI VOWEL CANDRA E 0A8F ; [.20A8.0020.0002.0A8F] # GUJARATI LETTER E 0A90 ; [.20A9.0020.0002.0A90] # GUJARATI LETTER AI 0A91 ; [.20AA.0020.0002.0A91] # GUJARATI VOWEL CANDRA O 0A93 ; [.20AB.0020.0002.0A93] # GUJARATI LETTER O 0A94 ; [.20AC.0020.0002.0A94] # GUJARATI LETTER AU 0A95 ; [.20AD.0020.0002.0A95] # GUJARATI LETTER KA 0A96 ; [.20AE.0020.0002.0A96] # GUJARATI LETTER KHA 0A97 ; [.20AF.0020.0002.0A97] # GUJARATI LETTER GA 0A98 ; [.20B0.0020.0002.0A98] # GUJARATI LETTER GHA 0A99 ; [.20B1.0020.0002.0A99] # GUJARATI LETTER NGA 0A9A ; [.20B2.0020.0002.0A9A] # GUJARATI LETTER CA 0A9B ; [.20B3.0020.0002.0A9B] # GUJARATI LETTER CHA 0A9C ; [.20B4.0020.0002.0A9C] # GUJARATI LETTER JA 0A9D ; [.20B5.0020.0002.0A9D] # GUJARATI LETTER JHA 0A9E ; [.20B6.0020.0002.0A9E] # GUJARATI LETTER NYA 0A9F ; [.20B7.0020.0002.0A9F] # GUJARATI LETTER TTA 0AA0 ; [.20B8.0020.0002.0AA0] # GUJARATI LETTER TTHA 0AA1 ; [.20B9.0020.0002.0AA1] # GUJARATI LETTER DDA 0AA2 ; [.20BA.0020.0002.0AA2] # GUJARATI LETTER DDHA 0AA3 ; [.20BB.0020.0002.0AA3] # GUJARATI LETTER NNA 0AA4 ; [.20BC.0020.0002.0AA4] # GUJARATI LETTER TA 0AA5 ; [.20BD.0020.0002.0AA5] # GUJARATI LETTER THA 0AA6 ; [.20BE.0020.0002.0AA6] # GUJARATI LETTER DA 0AA7 ; [.20BF.0020.0002.0AA7] # GUJARATI LETTER DHA 0AA8 ; [.20C0.0020.0002.0AA8] # GUJARATI LETTER NA 0AAA ; [.20C1.0020.0002.0AAA] # GUJARATI LETTER PA 0AAB ; [.20C2.0020.0002.0AAB] # GUJARATI LETTER PHA 0AAC ; [.20C3.0020.0002.0AAC] # GUJARATI LETTER BA 0AAD ; [.20C4.0020.0002.0AAD] # GUJARATI LETTER BHA 0AAE ; [.20C5.0020.0002.0AAE] # GUJARATI LETTER MA 0AAF ; [.20C6.0020.0002.0AAF] # GUJARATI LETTER YA 0AB0 ; [.20C7.0020.0002.0AB0] # GUJARATI LETTER RA 0AB2 ; [.20C8.0020.0002.0AB2] # GUJARATI LETTER LA 0AB5 ; [.20C9.0020.0002.0AB5] # GUJARATI LETTER VA 0AB6 ; [.20CA.0020.0002.0AB6] # GUJARATI LETTER SHA 0AB7 ; [.20CB.0020.0002.0AB7] # GUJARATI LETTER SSA 0AB8 ; [.20CC.0020.0002.0AB8] # GUJARATI LETTER SA 0AB9 ; [.20CD.0020.0002.0AB9] # GUJARATI LETTER HA 0AB3 ; [.20CE.0020.0002.0AB3] # GUJARATI LETTER LLA 0ABD ; [.20CF.0020.0002.0ABD] # GUJARATI SIGN AVAGRAHA 0ABE ; [.20D0.0020.0002.0ABE] # GUJARATI VOWEL SIGN AA 0ABF ; [.20D1.0020.0002.0ABF] # GUJARATI VOWEL SIGN I 0AC0 ; [.20D2.0020.0002.0AC0] # GUJARATI VOWEL SIGN II 0AC1 ; [.20D3.0020.0002.0AC1] # GUJARATI VOWEL SIGN U 0AC2 ; [.20D4.0020.0002.0AC2] # GUJARATI VOWEL SIGN UU 0AC3 ; [.20D5.0020.0002.0AC3] # GUJARATI VOWEL SIGN VOCALIC R 0AC4 ; [.20D6.0020.0002.0AC4] # GUJARATI VOWEL SIGN VOCALIC RR 0AE2 ; [.20D7.0020.0002.0AE2] # GUJARATI VOWEL SIGN VOCALIC L 0AE3 ; [.20D8.0020.0002.0AE3] # GUJARATI VOWEL SIGN VOCALIC LL 0AC5 ; [.20D9.0020.0002.0AC5] # GUJARATI VOWEL SIGN CANDRA E 0AC7 ; [.20DA.0020.0002.0AC7] # GUJARATI VOWEL SIGN E 0AC8 ; [.20DB.0020.0002.0AC8] # GUJARATI VOWEL SIGN AI 0AC9 ; [.20DC.0020.0002.0AC9] # GUJARATI VOWEL SIGN CANDRA O 0ACB ; [.20DD.0020.0002.0ACB] # GUJARATI VOWEL SIGN O 0ACC ; [.20DE.0020.0002.0ACC] # GUJARATI VOWEL SIGN AU 0ACD ; [.20DF.0020.0002.0ACD] # GUJARATI SIGN VIRAMA 0B05 ; [.20E0.0020.0002.0B05] # ORIYA LETTER A 0B06 ; [.20E1.0020.0002.0B06] # ORIYA LETTER AA 0B07 ; [.20E2.0020.0002.0B07] # ORIYA LETTER I 0B08 ; [.20E3.0020.0002.0B08] # ORIYA LETTER II 0B09 ; [.20E4.0020.0002.0B09] # ORIYA LETTER U 0B0A ; [.20E5.0020.0002.0B0A] # ORIYA LETTER UU 0B0B ; [.20E6.0020.0002.0B0B] # ORIYA LETTER VOCALIC R 0B60 ; [.20E7.0020.0002.0B60] # ORIYA LETTER VOCALIC RR 0B0C ; [.20E8.0020.0002.0B0C] # ORIYA LETTER VOCALIC L 0B61 ; [.20E9.0020.0002.0B61] # ORIYA LETTER VOCALIC LL 0B0F ; [.20EA.0020.0002.0B0F] # ORIYA LETTER E 0B10 ; [.20EB.0020.0002.0B10] # ORIYA LETTER AI 0B13 ; [.20EC.0020.0002.0B13] # ORIYA LETTER O 0B14 ; [.20ED.0020.0002.0B14] # ORIYA LETTER AU 0B15 ; [.20EE.0020.0002.0B15] # ORIYA LETTER KA 0B16 ; [.20EF.0020.0002.0B16] # ORIYA LETTER KHA 0B17 ; [.20F0.0020.0002.0B17] # ORIYA LETTER GA 0B18 ; [.20F1.0020.0002.0B18] # ORIYA LETTER GHA 0B19 ; [.20F2.0020.0002.0B19] # ORIYA LETTER NGA 0B1A ; [.20F3.0020.0002.0B1A] # ORIYA LETTER CA 0B1B ; [.20F4.0020.0002.0B1B] # ORIYA LETTER CHA 0B1C ; [.20F5.0020.0002.0B1C] # ORIYA LETTER JA 0B1D ; [.20F6.0020.0002.0B1D] # ORIYA LETTER JHA 0B1E ; [.20F7.0020.0002.0B1E] # ORIYA LETTER NYA 0B1F ; [.20F8.0020.0002.0B1F] # ORIYA LETTER TTA 0B20 ; [.20F9.0020.0002.0B20] # ORIYA LETTER TTHA 0B21 ; [.20FA.0020.0002.0B21] # ORIYA LETTER DDA 0B5C ; [.20FA.0020.0002.0B21][.0000.00F1.0002.093C] # ORIYA LETTER RRA 0B22 ; [.20FB.0020.0002.0B22] # ORIYA LETTER DDHA 0B5D ; [.20FB.0020.0002.0B22][.0000.00F1.0002.093C] # ORIYA LETTER RHA 0B23 ; [.20FC.0020.0002.0B23] # ORIYA LETTER NNA 0B24 ; [.20FD.0020.0002.0B24] # ORIYA LETTER TA 0B25 ; [.20FE.0020.0002.0B25] # ORIYA LETTER THA 0B26 ; [.20FF.0020.0002.0B26] # ORIYA LETTER DA 0B27 ; [.2100.0020.0002.0B27] # ORIYA LETTER DHA 0B28 ; [.2101.0020.0002.0B28] # ORIYA LETTER NA 0B2A ; [.2102.0020.0002.0B2A] # ORIYA LETTER PA 0B2B ; [.2103.0020.0002.0B2B] # ORIYA LETTER PHA 0B2C ; [.2104.0020.0002.0B2C] # ORIYA LETTER BA 0B2D ; [.2105.0020.0002.0B2D] # ORIYA LETTER BHA 0B2E ; [.2106.0020.0002.0B2E] # ORIYA LETTER MA 0B2F ; [.2107.0020.0002.0B2F] # ORIYA LETTER YA 0B5F ; [.2108.0020.0002.0B5F] # ORIYA LETTER YYA 0B30 ; [.2109.0020.0002.0B30] # ORIYA LETTER RA 0B32 ; [.210A.0020.0002.0B32] # ORIYA LETTER LA 0B33 ; [.210B.0020.0002.0B33] # ORIYA LETTER LLA 0B35 ; [.210C.0020.0002.0B35] # ORIYA LETTER VA 0B71 ; [.210D.0020.0002.0B71] # ORIYA LETTER WA 0B36 ; [.210E.0020.0002.0B36] # ORIYA LETTER SHA 0B37 ; [.210F.0020.0002.0B37] # ORIYA LETTER SSA 0B38 ; [.2110.0020.0002.0B38] # ORIYA LETTER SA 0B39 ; [.2111.0020.0002.0B39] # ORIYA LETTER HA 0B3D ; [.2112.0020.0002.0B3D] # ORIYA SIGN AVAGRAHA 0B3E ; [.2113.0020.0002.0B3E] # ORIYA VOWEL SIGN AA 0B3F ; [.2114.0020.0002.0B3F] # ORIYA VOWEL SIGN I 0B40 ; [.2115.0020.0002.0B40] # ORIYA VOWEL SIGN II 0B41 ; [.2116.0020.0002.0B41] # ORIYA VOWEL SIGN U 0B42 ; [.2117.0020.0002.0B42] # ORIYA VOWEL SIGN UU 0B43 ; [.2118.0020.0002.0B43] # ORIYA VOWEL SIGN VOCALIC R 0B44 ; [.2119.0020.0002.0B44] # ORIYA VOWEL SIGN VOCALIC RR 0B62 ; [.211A.0020.0002.0B62] # ORIYA VOWEL SIGN VOCALIC L 0B63 ; [.211B.0020.0002.0B63] # ORIYA VOWEL SIGN VOCALIC LL 0B47 ; [.211C.0020.0002.0B47] # ORIYA VOWEL SIGN E 0B48 ; [.211D.0020.0002.0B48] # ORIYA VOWEL SIGN AI 0B47 0B56 ; [.211D.0020.0002.0B48] # ORIYA VOWEL SIGN AI 0B4B ; [.211E.0020.0002.0B4B] # ORIYA VOWEL SIGN O 0B47 0B3E ; [.211E.0020.0002.0B4B] # ORIYA VOWEL SIGN O 0B4C ; [.211F.0020.0002.0B4C] # ORIYA VOWEL SIGN AU 0B47 0B57 ; [.211F.0020.0002.0B4C] # ORIYA VOWEL SIGN AU 0B4D ; [.2120.0020.0002.0B4D] # ORIYA SIGN VIRAMA 0B56 ; [.2121.0020.0002.0B56] # ORIYA AI LENGTH MARK 0B57 ; [.2122.0020.0002.0B57] # ORIYA AU LENGTH MARK 0BD0 ; [.2123.0020.0002.0BD0] # TAMIL OM 0B85 ; [.2124.0020.0002.0B85] # TAMIL LETTER A 0B86 ; [.2125.0020.0002.0B86] # TAMIL LETTER AA 0B87 ; [.2126.0020.0002.0B87] # TAMIL LETTER I 0B88 ; [.2127.0020.0002.0B88] # TAMIL LETTER II 0B89 ; [.2128.0020.0002.0B89] # TAMIL LETTER U 0B8A ; [.2129.0020.0002.0B8A] # TAMIL LETTER UU 0B8E ; [.212A.0020.0002.0B8E] # TAMIL LETTER E 0B8F ; [.212B.0020.0002.0B8F] # TAMIL LETTER EE 0B90 ; [.212C.0020.0002.0B90] # TAMIL LETTER AI 0B92 ; [.212D.0020.0002.0B92] # TAMIL LETTER O 0B93 ; [.212E.0020.0002.0B93] # TAMIL LETTER OO 0B94 ; [.212F.0020.0002.0B94] # TAMIL LETTER AU 0B92 0BD7 ; [.212F.0020.0002.0B94] # TAMIL LETTER AU 0B83 ; [.2130.0020.0002.0B83] # TAMIL SIGN VISARGA 0B95 ; [.2131.0020.0002.0B95] # TAMIL LETTER KA 0B99 ; [.2132.0020.0002.0B99] # TAMIL LETTER NGA 0B9A ; [.2133.0020.0002.0B9A] # TAMIL LETTER CA 0B9E ; [.2134.0020.0002.0B9E] # TAMIL LETTER NYA 0B9F ; [.2135.0020.0002.0B9F] # TAMIL LETTER TTA 0BA3 ; [.2136.0020.0002.0BA3] # TAMIL LETTER NNA 0BA4 ; [.2137.0020.0002.0BA4] # TAMIL LETTER TA 0BA8 ; [.2138.0020.0002.0BA8] # TAMIL LETTER NA 0BAA ; [.2139.0020.0002.0BAA] # TAMIL LETTER PA 0BAE ; [.213A.0020.0002.0BAE] # TAMIL LETTER MA 0BAF ; [.213B.0020.0002.0BAF] # TAMIL LETTER YA 0BB0 ; [.213C.0020.0002.0BB0] # TAMIL LETTER RA 0BB2 ; [.213D.0020.0002.0BB2] # TAMIL LETTER LA 0BB5 ; [.213E.0020.0002.0BB5] # TAMIL LETTER VA 0BB4 ; [.213F.0020.0002.0BB4] # TAMIL LETTER LLLA 0BB3 ; [.2140.0020.0002.0BB3] # TAMIL LETTER LLA 0BB1 ; [.2141.0020.0002.0BB1] # TAMIL LETTER RRA 0BA9 ; [.2142.0020.0002.0BA9] # TAMIL LETTER NNNA 0B9C ; [.2143.0020.0002.0B9C] # TAMIL LETTER JA 0BB6 ; [.2144.0020.0002.0BB6] # TAMIL LETTER SHA 0BB7 ; [.2145.0020.0002.0BB7] # TAMIL LETTER SSA 0BB8 ; [.2146.0020.0002.0BB8] # TAMIL LETTER SA 0BB9 ; [.2147.0020.0002.0BB9] # TAMIL LETTER HA 0BBE ; [.2148.0020.0002.0BBE] # TAMIL VOWEL SIGN AA 0BBF ; [.2149.0020.0002.0BBF] # TAMIL VOWEL SIGN I 0BC0 ; [.214A.0020.0002.0BC0] # TAMIL VOWEL SIGN II 0BC1 ; [.214B.0020.0002.0BC1] # TAMIL VOWEL SIGN U 0BC2 ; [.214C.0020.0002.0BC2] # TAMIL VOWEL SIGN UU 0BC6 ; [.214D.0020.0002.0BC6] # TAMIL VOWEL SIGN E 0BC7 ; [.214E.0020.0002.0BC7] # TAMIL VOWEL SIGN EE 0BC8 ; [.214F.0020.0002.0BC8] # TAMIL VOWEL SIGN AI 0BCA ; [.2150.0020.0002.0BCA] # TAMIL VOWEL SIGN O 0BC6 0BBE ; [.2150.0020.0002.0BCA] # TAMIL VOWEL SIGN O 0BCB ; [.2151.0020.0002.0BCB] # TAMIL VOWEL SIGN OO 0BC7 0BBE ; [.2151.0020.0002.0BCB] # TAMIL VOWEL SIGN OO 0BCC ; [.2152.0020.0002.0BCC] # TAMIL VOWEL SIGN AU 0BC6 0BD7 ; [.2152.0020.0002.0BCC] # TAMIL VOWEL SIGN AU 0BCD ; [.2153.0020.0002.0BCD] # TAMIL SIGN VIRAMA 0BD7 ; [.2154.0020.0002.0BD7] # TAMIL AU LENGTH MARK 0C05 ; [.2155.0020.0002.0C05] # TELUGU LETTER A 0C06 ; [.2156.0020.0002.0C06] # TELUGU LETTER AA 0C07 ; [.2157.0020.0002.0C07] # TELUGU LETTER I 0C08 ; [.2158.0020.0002.0C08] # TELUGU LETTER II 0C09 ; [.2159.0020.0002.0C09] # TELUGU LETTER U 0C0A ; [.215A.0020.0002.0C0A] # TELUGU LETTER UU 0C0B ; [.215B.0020.0002.0C0B] # TELUGU LETTER VOCALIC R 0C60 ; [.215C.0020.0002.0C60] # TELUGU LETTER VOCALIC RR 0C0C ; [.215D.0020.0002.0C0C] # TELUGU LETTER VOCALIC L 0C61 ; [.215E.0020.0002.0C61] # TELUGU LETTER VOCALIC LL 0C0E ; [.215F.0020.0002.0C0E] # TELUGU LETTER E 0C0F ; [.2160.0020.0002.0C0F] # TELUGU LETTER EE 0C10 ; [.2161.0020.0002.0C10] # TELUGU LETTER AI 0C12 ; [.2162.0020.0002.0C12] # TELUGU LETTER O 0C13 ; [.2163.0020.0002.0C13] # TELUGU LETTER OO 0C14 ; [.2164.0020.0002.0C14] # TELUGU LETTER AU 0C15 ; [.2165.0020.0002.0C15] # TELUGU LETTER KA 0C16 ; [.2166.0020.0002.0C16] # TELUGU LETTER KHA 0C17 ; [.2167.0020.0002.0C17] # TELUGU LETTER GA 0C18 ; [.2168.0020.0002.0C18] # TELUGU LETTER GHA 0C19 ; [.2169.0020.0002.0C19] # TELUGU LETTER NGA 0C1A ; [.216A.0020.0002.0C1A] # TELUGU LETTER CA 0C58 ; [.216B.0020.0002.0C58] # TELUGU LETTER TSA 0C1B ; [.216C.0020.0002.0C1B] # TELUGU LETTER CHA 0C1C ; [.216D.0020.0002.0C1C] # TELUGU LETTER JA 0C59 ; [.216E.0020.0002.0C59] # TELUGU LETTER DZA 0C1D ; [.216F.0020.0002.0C1D] # TELUGU LETTER JHA 0C1E ; [.2170.0020.0002.0C1E] # TELUGU LETTER NYA 0C1F ; [.2171.0020.0002.0C1F] # TELUGU LETTER TTA 0C20 ; [.2172.0020.0002.0C20] # TELUGU LETTER TTHA 0C21 ; [.2173.0020.0002.0C21] # TELUGU LETTER DDA 0C22 ; [.2174.0020.0002.0C22] # TELUGU LETTER DDHA 0C23 ; [.2175.0020.0002.0C23] # TELUGU LETTER NNA 0C24 ; [.2176.0020.0002.0C24] # TELUGU LETTER TA 0C25 ; [.2177.0020.0002.0C25] # TELUGU LETTER THA 0C26 ; [.2178.0020.0002.0C26] # TELUGU LETTER DA 0C27 ; [.2179.0020.0002.0C27] # TELUGU LETTER DHA 0C28 ; [.217A.0020.0002.0C28] # TELUGU LETTER NA 0C2A ; [.217B.0020.0002.0C2A] # TELUGU LETTER PA 0C2B ; [.217C.0020.0002.0C2B] # TELUGU LETTER PHA 0C2C ; [.217D.0020.0002.0C2C] # TELUGU LETTER BA 0C2D ; [.217E.0020.0002.0C2D] # TELUGU LETTER BHA 0C2E ; [.217F.0020.0002.0C2E] # TELUGU LETTER MA 0C2F ; [.2180.0020.0002.0C2F] # TELUGU LETTER YA 0C30 ; [.2181.0020.0002.0C30] # TELUGU LETTER RA 0C31 ; [.2182.0020.0002.0C31] # TELUGU LETTER RRA 0C32 ; [.2183.0020.0002.0C32] # TELUGU LETTER LA 0C35 ; [.2184.0020.0002.0C35] # TELUGU LETTER VA 0C36 ; [.2185.0020.0002.0C36] # TELUGU LETTER SHA 0C37 ; [.2186.0020.0002.0C37] # TELUGU LETTER SSA 0C38 ; [.2187.0020.0002.0C38] # TELUGU LETTER SA 0C39 ; [.2188.0020.0002.0C39] # TELUGU LETTER HA 0C33 ; [.2189.0020.0002.0C33] # TELUGU LETTER LLA 0C3D ; [.218A.0020.0002.0C3D] # TELUGU SIGN AVAGRAHA 0C3E ; [.218B.0020.0002.0C3E] # TELUGU VOWEL SIGN AA 0C3F ; [.218C.0020.0002.0C3F] # TELUGU VOWEL SIGN I 0C40 ; [.218D.0020.0002.0C40] # TELUGU VOWEL SIGN II 0C41 ; [.218E.0020.0002.0C41] # TELUGU VOWEL SIGN U 0C42 ; [.218F.0020.0002.0C42] # TELUGU VOWEL SIGN UU 0C43 ; [.2190.0020.0002.0C43] # TELUGU VOWEL SIGN VOCALIC R 0C44 ; [.2191.0020.0002.0C44] # TELUGU VOWEL SIGN VOCALIC RR 0C62 ; [.2192.0020.0002.0C62] # TELUGU VOWEL SIGN VOCALIC L 0C63 ; [.2193.0020.0002.0C63] # TELUGU VOWEL SIGN VOCALIC LL 0C46 ; [.2194.0020.0002.0C46] # TELUGU VOWEL SIGN E 0C47 ; [.2195.0020.0002.0C47] # TELUGU VOWEL SIGN EE 0C48 ; [.2196.0020.0002.0C48] # TELUGU VOWEL SIGN AI 0C46 0C56 ; [.2196.0020.0002.0C48] # TELUGU VOWEL SIGN AI 0C4A ; [.2197.0020.0002.0C4A] # TELUGU VOWEL SIGN O 0C4B ; [.2198.0020.0002.0C4B] # TELUGU VOWEL SIGN OO 0C4C ; [.2199.0020.0002.0C4C] # TELUGU VOWEL SIGN AU 0C4D ; [.219A.0020.0002.0C4D] # TELUGU SIGN VIRAMA 0C55 ; [.219B.0020.0002.0C55] # TELUGU LENGTH MARK 0C56 ; [.219C.0020.0002.0C56] # TELUGU AI LENGTH MARK 0C85 ; [.219D.0020.0002.0C85] # KANNADA LETTER A 0C86 ; [.219E.0020.0002.0C86] # KANNADA LETTER AA 0C87 ; [.219F.0020.0002.0C87] # KANNADA LETTER I 0C88 ; [.21A0.0020.0002.0C88] # KANNADA LETTER II 0C89 ; [.21A1.0020.0002.0C89] # KANNADA LETTER U 0C8A ; [.21A2.0020.0002.0C8A] # KANNADA LETTER UU 0C8B ; [.21A3.0020.0002.0C8B] # KANNADA LETTER VOCALIC R 0CE0 ; [.21A4.0020.0002.0CE0] # KANNADA LETTER VOCALIC RR 0C8C ; [.21A5.0020.0002.0C8C] # KANNADA LETTER VOCALIC L 0CE1 ; [.21A6.0020.0002.0CE1] # KANNADA LETTER VOCALIC LL 0C8E ; [.21A7.0020.0002.0C8E] # KANNADA LETTER E 0C8F ; [.21A8.0020.0002.0C8F] # KANNADA LETTER EE 0C90 ; [.21A9.0020.0002.0C90] # KANNADA LETTER AI 0C92 ; [.21AA.0020.0002.0C92] # KANNADA LETTER O 0C93 ; [.21AB.0020.0002.0C93] # KANNADA LETTER OO 0C94 ; [.21AC.0020.0002.0C94] # KANNADA LETTER AU 0C95 ; [.21AD.0020.0002.0C95] # KANNADA LETTER KA 0C96 ; [.21AE.0020.0002.0C96] # KANNADA LETTER KHA 0C97 ; [.21AF.0020.0002.0C97] # KANNADA LETTER GA 0C98 ; [.21B0.0020.0002.0C98] # KANNADA LETTER GHA 0C99 ; [.21B1.0020.0002.0C99] # KANNADA LETTER NGA 0C9A ; [.21B2.0020.0002.0C9A] # KANNADA LETTER CA 0C9B ; [.21B3.0020.0002.0C9B] # KANNADA LETTER CHA 0C9C ; [.21B4.0020.0002.0C9C] # KANNADA LETTER JA 0C9D ; [.21B5.0020.0002.0C9D] # KANNADA LETTER JHA 0C9E ; [.21B6.0020.0002.0C9E] # KANNADA LETTER NYA 0C9F ; [.21B7.0020.0002.0C9F] # KANNADA LETTER TTA 0CA0 ; [.21B8.0020.0002.0CA0] # KANNADA LETTER TTHA 0CA1 ; [.21B9.0020.0002.0CA1] # KANNADA LETTER DDA 0CA2 ; [.21BA.0020.0002.0CA2] # KANNADA LETTER DDHA 0CA3 ; [.21BB.0020.0002.0CA3] # KANNADA LETTER NNA 0CA4 ; [.21BC.0020.0002.0CA4] # KANNADA LETTER TA 0CA5 ; [.21BD.0020.0002.0CA5] # KANNADA LETTER THA 0CA6 ; [.21BE.0020.0002.0CA6] # KANNADA LETTER DA 0CA7 ; [.21BF.0020.0002.0CA7] # KANNADA LETTER DHA 0CA8 ; [.21C0.0020.0002.0CA8] # KANNADA LETTER NA 0CAA ; [.21C1.0020.0002.0CAA] # KANNADA LETTER PA 0CAB ; [.21C2.0020.0002.0CAB] # KANNADA LETTER PHA 0CAC ; [.21C3.0020.0002.0CAC] # KANNADA LETTER BA 0CAD ; [.21C4.0020.0002.0CAD] # KANNADA LETTER BHA 0CAE ; [.21C5.0020.0002.0CAE] # KANNADA LETTER MA 0CAF ; [.21C6.0020.0002.0CAF] # KANNADA LETTER YA 0CB0 ; [.21C7.0020.0002.0CB0] # KANNADA LETTER RA 0CB1 ; [.21C8.0020.0002.0CB1] # KANNADA LETTER RRA 0CB2 ; [.21C9.0020.0002.0CB2] # KANNADA LETTER LA 0CB5 ; [.21CA.0020.0002.0CB5] # KANNADA LETTER VA 0CB6 ; [.21CB.0020.0002.0CB6] # KANNADA LETTER SHA 0CB7 ; [.21CC.0020.0002.0CB7] # KANNADA LETTER SSA 0CB8 ; [.21CD.0020.0002.0CB8] # KANNADA LETTER SA 0CB9 ; [.21CE.0020.0002.0CB9] # KANNADA LETTER HA 0CB3 ; [.21CF.0020.0002.0CB3] # KANNADA LETTER LLA 0CDE ; [.21D0.0020.0002.0CDE] # KANNADA LETTER FA 0CBD ; [.21D1.0020.0002.0CBD] # KANNADA SIGN AVAGRAHA 0CF1 ; [.21D2.0020.0002.0CF1] # KANNADA SIGN JIHVAMULIYA 0CF2 ; [.21D3.0020.0002.0CF2] # KANNADA SIGN UPADHMANIYA 0CBE ; [.21D4.0020.0002.0CBE] # KANNADA VOWEL SIGN AA 0CBF ; [.21D5.0020.0002.0CBF] # KANNADA VOWEL SIGN I 0CC0 ; [.21D6.0020.0002.0CC0] # KANNADA VOWEL SIGN II 0CBF 0CD5 ; [.21D6.0020.0002.0CC0] # KANNADA VOWEL SIGN II 0CC1 ; [.21D7.0020.0002.0CC1] # KANNADA VOWEL SIGN U 0CC2 ; [.21D8.0020.0002.0CC2] # KANNADA VOWEL SIGN UU 0CC3 ; [.21D9.0020.0002.0CC3] # KANNADA VOWEL SIGN VOCALIC R 0CC4 ; [.21DA.0020.0002.0CC4] # KANNADA VOWEL SIGN VOCALIC RR 0CE2 ; [.21DB.0020.0002.0CE2] # KANNADA VOWEL SIGN VOCALIC L 0CE3 ; [.21DC.0020.0002.0CE3] # KANNADA VOWEL SIGN VOCALIC LL 0CC6 ; [.21DD.0020.0002.0CC6] # KANNADA VOWEL SIGN E 0CC7 ; [.21DE.0020.0002.0CC7] # KANNADA VOWEL SIGN EE 0CC6 0CD5 ; [.21DE.0020.0002.0CC7] # KANNADA VOWEL SIGN EE 0CC8 ; [.21DF.0020.0002.0CC8] # KANNADA VOWEL SIGN AI 0CC6 0CD6 ; [.21DF.0020.0002.0CC8] # KANNADA VOWEL SIGN AI 0CCA ; [.21E0.0020.0002.0CCA] # KANNADA VOWEL SIGN O 0CC6 0CC2 ; [.21E0.0020.0002.0CCA] # KANNADA VOWEL SIGN O 0CCB ; [.21E1.0020.0002.0CCB] # KANNADA VOWEL SIGN OO 0CC6 0CC2 0CD5 ; [.21E1.0020.0002.0CCB] # KANNADA VOWEL SIGN OO 0CCA 0CD5 ; [.21E1.0020.0002.0CCB] # KANNADA VOWEL SIGN OO 0CCC ; [.21E2.0020.0002.0CCC] # KANNADA VOWEL SIGN AU 0CCD ; [.21E3.0020.0002.0CCD] # KANNADA SIGN VIRAMA 0CD5 ; [.21E4.0020.0002.0CD5] # KANNADA LENGTH MARK 0CD6 ; [.21E5.0020.0002.0CD6] # KANNADA AI LENGTH MARK 0D05 ; [.21E6.0020.0002.0D05] # MALAYALAM LETTER A 0D06 ; [.21E7.0020.0002.0D06] # MALAYALAM LETTER AA 0D07 ; [.21E8.0020.0002.0D07] # MALAYALAM LETTER I 0D08 ; [.21E9.0020.0002.0D08] # MALAYALAM LETTER II 0D09 ; [.21EA.0020.0002.0D09] # MALAYALAM LETTER U 0D0A ; [.21EB.0020.0002.0D0A] # MALAYALAM LETTER UU 0D0B ; [.21EC.0020.0002.0D0B] # MALAYALAM LETTER VOCALIC R 0D60 ; [.21ED.0020.0002.0D60] # MALAYALAM LETTER VOCALIC RR 0D0C ; [.21EE.0020.0002.0D0C] # MALAYALAM LETTER VOCALIC L 0D61 ; [.21EF.0020.0002.0D61] # MALAYALAM LETTER VOCALIC LL 0D0E ; [.21F0.0020.0002.0D0E] # MALAYALAM LETTER E 0D0F ; [.21F1.0020.0002.0D0F] # MALAYALAM LETTER EE 0D10 ; [.21F2.0020.0002.0D10] # MALAYALAM LETTER AI 0D12 ; [.21F3.0020.0002.0D12] # MALAYALAM LETTER O 0D13 ; [.21F4.0020.0002.0D13] # MALAYALAM LETTER OO 0D14 ; [.21F5.0020.0002.0D14] # MALAYALAM LETTER AU 0D15 ; [.21F6.0020.0002.0D15] # MALAYALAM LETTER KA 0D7F ; [.21F6.0020.0004.0D7F][.222D.0020.0004.0D7F] # MALAYALAM LETTER CHILLU K 0D16 ; [.21F7.0020.0002.0D16] # MALAYALAM LETTER KHA 0D17 ; [.21F8.0020.0002.0D17] # MALAYALAM LETTER GA 0D18 ; [.21F9.0020.0002.0D18] # MALAYALAM LETTER GHA 0D19 ; [.21FA.0020.0002.0D19] # MALAYALAM LETTER NGA 0D1A ; [.21FB.0020.0002.0D1A] # MALAYALAM LETTER CA 0D1B ; [.21FC.0020.0002.0D1B] # MALAYALAM LETTER CHA 0D1C ; [.21FD.0020.0002.0D1C] # MALAYALAM LETTER JA 0D1D ; [.21FE.0020.0002.0D1D] # MALAYALAM LETTER JHA 0D1E ; [.21FF.0020.0002.0D1E] # MALAYALAM LETTER NYA 0D1F ; [.2200.0020.0002.0D1F] # MALAYALAM LETTER TTA 0D20 ; [.2201.0020.0002.0D20] # MALAYALAM LETTER TTHA 0D21 ; [.2202.0020.0002.0D21] # MALAYALAM LETTER DDA 0D22 ; [.2203.0020.0002.0D22] # MALAYALAM LETTER DDHA 0D23 ; [.2204.0020.0002.0D23] # MALAYALAM LETTER NNA 0D7A ; [.2204.0020.0004.0D7A][.222D.0020.0004.0D7A] # MALAYALAM LETTER CHILLU NN 0D24 ; [.2205.0020.0002.0D24] # MALAYALAM LETTER TA 0D25 ; [.2206.0020.0002.0D25] # MALAYALAM LETTER THA 0D26 ; [.2207.0020.0002.0D26] # MALAYALAM LETTER DA 0D27 ; [.2208.0020.0002.0D27] # MALAYALAM LETTER DHA 0D28 ; [.2209.0020.0002.0D28] # MALAYALAM LETTER NA 0D7B ; [.2209.0020.0004.0D7B][.222D.0020.0004.0D7B] # MALAYALAM LETTER CHILLU N 0D29 ; [.220A.0020.0002.0D29] # MALAYALAM LETTER NNNA 0D2A ; [.220B.0020.0002.0D2A] # MALAYALAM LETTER PA 0D2B ; [.220C.0020.0002.0D2B] # MALAYALAM LETTER PHA 0D2C ; [.220D.0020.0002.0D2C] # MALAYALAM LETTER BA 0D2D ; [.220E.0020.0002.0D2D] # MALAYALAM LETTER BHA 0D2E ; [.220F.0020.0002.0D2E] # MALAYALAM LETTER MA 0D2F ; [.2210.0020.0002.0D2F] # MALAYALAM LETTER YA 0D30 ; [.2211.0020.0002.0D30] # MALAYALAM LETTER RA 0D4E ; [.2211.0020.0004.0D4E][.222D.0020.0004.0D4E] # MALAYALAM LETTER DOT REPH 0D7C ; [.2211.0020.0004.0D7C][.222D.0020.0004.0D7C] # MALAYALAM LETTER CHILLU RR 0D32 ; [.2212.0020.0002.0D32] # MALAYALAM LETTER LA 0D7D ; [.2212.0020.0004.0D7D][.222D.0020.0004.0D7D] # MALAYALAM LETTER CHILLU L 0D35 ; [.2213.0020.0002.0D35] # MALAYALAM LETTER VA 0D36 ; [.2214.0020.0002.0D36] # MALAYALAM LETTER SHA 0D37 ; [.2215.0020.0002.0D37] # MALAYALAM LETTER SSA 0D38 ; [.2216.0020.0002.0D38] # MALAYALAM LETTER SA 0D39 ; [.2217.0020.0002.0D39] # MALAYALAM LETTER HA 0D33 ; [.2218.0020.0002.0D33] # MALAYALAM LETTER LLA 0D7E ; [.2218.0020.0004.0D7E][.222D.0020.0004.0D7E] # MALAYALAM LETTER CHILLU LL 0D34 ; [.2219.0020.0002.0D34] # MALAYALAM LETTER LLLA 0D31 ; [.221A.0020.0002.0D31] # MALAYALAM LETTER RRA 0D3A ; [.221B.0020.0002.0D3A] # MALAYALAM LETTER TTTA 0D3D ; [.221C.0020.0002.0D3D] # MALAYALAM SIGN AVAGRAHA 0D3E ; [.221D.0020.0002.0D3E] # MALAYALAM VOWEL SIGN AA 0D3F ; [.221E.0020.0002.0D3F] # MALAYALAM VOWEL SIGN I 0D40 ; [.221F.0020.0002.0D40] # MALAYALAM VOWEL SIGN II 0D41 ; [.2220.0020.0002.0D41] # MALAYALAM VOWEL SIGN U 0D42 ; [.2221.0020.0002.0D42] # MALAYALAM VOWEL SIGN UU 0D43 ; [.2222.0020.0002.0D43] # MALAYALAM VOWEL SIGN VOCALIC R 0D44 ; [.2223.0020.0002.0D44] # MALAYALAM VOWEL SIGN VOCALIC RR 0D62 ; [.2224.0020.0002.0D62] # MALAYALAM VOWEL SIGN VOCALIC L 0D63 ; [.2225.0020.0002.0D63] # MALAYALAM VOWEL SIGN VOCALIC LL 0D46 ; [.2226.0020.0002.0D46] # MALAYALAM VOWEL SIGN E 0D47 ; [.2227.0020.0002.0D47] # MALAYALAM VOWEL SIGN EE 0D48 ; [.2228.0020.0002.0D48] # MALAYALAM VOWEL SIGN AI 0D4A ; [.2229.0020.0002.0D4A] # MALAYALAM VOWEL SIGN O 0D46 0D3E ; [.2229.0020.0002.0D4A] # MALAYALAM VOWEL SIGN O 0D4B ; [.222A.0020.0002.0D4B] # MALAYALAM VOWEL SIGN OO 0D47 0D3E ; [.222A.0020.0002.0D4B] # MALAYALAM VOWEL SIGN OO 0D4C ; [.222B.0020.0002.0D4C] # MALAYALAM VOWEL SIGN AU 0D46 0D57 ; [.222B.0020.0002.0D4C] # MALAYALAM VOWEL SIGN AU 0D57 ; [.222C.0020.0002.0D57] # MALAYALAM AU LENGTH MARK 0D4D ; [.222D.0020.0002.0D4D] # MALAYALAM SIGN VIRAMA 0D85 ; [.222E.0020.0002.0D85] # SINHALA LETTER AYANNA 0D86 ; [.222F.0020.0002.0D86] # SINHALA LETTER AAYANNA 0D87 ; [.2230.0020.0002.0D87] # SINHALA LETTER AEYANNA 0D88 ; [.2231.0020.0002.0D88] # SINHALA LETTER AEEYANNA 0D89 ; [.2232.0020.0002.0D89] # SINHALA LETTER IYANNA 0D8A ; [.2233.0020.0002.0D8A] # SINHALA LETTER IIYANNA 0D8B ; [.2234.0020.0002.0D8B] # SINHALA LETTER UYANNA 0D8C ; [.2235.0020.0002.0D8C] # SINHALA LETTER UUYANNA 0D8D ; [.2236.0020.0002.0D8D] # SINHALA LETTER IRUYANNA 0D8E ; [.2237.0020.0002.0D8E] # SINHALA LETTER IRUUYANNA 0D8F ; [.2238.0020.0002.0D8F] # SINHALA LETTER ILUYANNA 0D90 ; [.2239.0020.0002.0D90] # SINHALA LETTER ILUUYANNA 0D91 ; [.223A.0020.0002.0D91] # SINHALA LETTER EYANNA 0D92 ; [.223B.0020.0002.0D92] # SINHALA LETTER EEYANNA 0D93 ; [.223C.0020.0002.0D93] # SINHALA LETTER AIYANNA 0D94 ; [.223D.0020.0002.0D94] # SINHALA LETTER OYANNA 0D95 ; [.223E.0020.0002.0D95] # SINHALA LETTER OOYANNA 0D96 ; [.223F.0020.0002.0D96] # SINHALA LETTER AUYANNA 0D9A ; [.2240.0020.0002.0D9A] # SINHALA LETTER ALPAPRAANA KAYANNA 0D9B ; [.2241.0020.0002.0D9B] # SINHALA LETTER MAHAAPRAANA KAYANNA 0D9C ; [.2242.0020.0002.0D9C] # SINHALA LETTER ALPAPRAANA GAYANNA 0D9D ; [.2243.0020.0002.0D9D] # SINHALA LETTER MAHAAPRAANA GAYANNA 0D9E ; [.2244.0020.0002.0D9E] # SINHALA LETTER KANTAJA NAASIKYAYA 0D9F ; [.2245.0020.0002.0D9F] # SINHALA LETTER SANYAKA GAYANNA 0DA0 ; [.2246.0020.0002.0DA0] # SINHALA LETTER ALPAPRAANA CAYANNA 0DA1 ; [.2247.0020.0002.0DA1] # SINHALA LETTER MAHAAPRAANA CAYANNA 0DA2 ; [.2248.0020.0002.0DA2] # SINHALA LETTER ALPAPRAANA JAYANNA 0DA3 ; [.2249.0020.0002.0DA3] # SINHALA LETTER MAHAAPRAANA JAYANNA 0DA4 ; [.224A.0020.0002.0DA4] # SINHALA LETTER TAALUJA NAASIKYAYA 0DA5 ; [.224B.0020.0002.0DA5] # SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA 0DA6 ; [.224C.0020.0002.0DA6] # SINHALA LETTER SANYAKA JAYANNA 0DA7 ; [.224D.0020.0002.0DA7] # SINHALA LETTER ALPAPRAANA TTAYANNA 0DA8 ; [.224E.0020.0002.0DA8] # SINHALA LETTER MAHAAPRAANA TTAYANNA 0DA9 ; [.224F.0020.0002.0DA9] # SINHALA LETTER ALPAPRAANA DDAYANNA 0DAA ; [.2250.0020.0002.0DAA] # SINHALA LETTER MAHAAPRAANA DDAYANNA 0DAB ; [.2251.0020.0002.0DAB] # SINHALA LETTER MUURDHAJA NAYANNA 0DAC ; [.2252.0020.0002.0DAC] # SINHALA LETTER SANYAKA DDAYANNA 0DAD ; [.2253.0020.0002.0DAD] # SINHALA LETTER ALPAPRAANA TAYANNA 0DAE ; [.2254.0020.0002.0DAE] # SINHALA LETTER MAHAAPRAANA TAYANNA 0DAF ; [.2255.0020.0002.0DAF] # SINHALA LETTER ALPAPRAANA DAYANNA 0DB0 ; [.2256.0020.0002.0DB0] # SINHALA LETTER MAHAAPRAANA DAYANNA 0DB1 ; [.2257.0020.0002.0DB1] # SINHALA LETTER DANTAJA NAYANNA 0DB3 ; [.2258.0020.0002.0DB3] # SINHALA LETTER SANYAKA DAYANNA 0DB4 ; [.2259.0020.0002.0DB4] # SINHALA LETTER ALPAPRAANA PAYANNA 0DB5 ; [.225A.0020.0002.0DB5] # SINHALA LETTER MAHAAPRAANA PAYANNA 0DB6 ; [.225B.0020.0002.0DB6] # SINHALA LETTER ALPAPRAANA BAYANNA 0DB7 ; [.225C.0020.0002.0DB7] # SINHALA LETTER MAHAAPRAANA BAYANNA 0DB8 ; [.225D.0020.0002.0DB8] # SINHALA LETTER MAYANNA 0DB9 ; [.225E.0020.0002.0DB9] # SINHALA LETTER AMBA BAYANNA 0DBA ; [.225F.0020.0002.0DBA] # SINHALA LETTER YAYANNA 0DBB ; [.2260.0020.0002.0DBB] # SINHALA LETTER RAYANNA 0DBD ; [.2261.0020.0002.0DBD] # SINHALA LETTER DANTAJA LAYANNA 0DC0 ; [.2262.0020.0002.0DC0] # SINHALA LETTER VAYANNA 0DC1 ; [.2263.0020.0002.0DC1] # SINHALA LETTER TAALUJA SAYANNA 0DC2 ; [.2264.0020.0002.0DC2] # SINHALA LETTER MUURDHAJA SAYANNA 0DC3 ; [.2265.0020.0002.0DC3] # SINHALA LETTER DANTAJA SAYANNA 0DC4 ; [.2266.0020.0002.0DC4] # SINHALA LETTER HAYANNA 0DC5 ; [.2267.0020.0002.0DC5] # SINHALA LETTER MUURDHAJA LAYANNA 0DC6 ; [.2268.0020.0002.0DC6] # SINHALA LETTER FAYANNA 0DCF ; [.2269.0020.0002.0DCF] # SINHALA VOWEL SIGN AELA-PILLA 0DD0 ; [.226A.0020.0002.0DD0] # SINHALA VOWEL SIGN KETTI AEDA-PILLA 0DD1 ; [.226B.0020.0002.0DD1] # SINHALA VOWEL SIGN DIGA AEDA-PILLA 0DD2 ; [.226C.0020.0002.0DD2] # SINHALA VOWEL SIGN KETTI IS-PILLA 0DD3 ; [.226D.0020.0002.0DD3] # SINHALA VOWEL SIGN DIGA IS-PILLA 0DD4 ; [.226E.0020.0002.0DD4] # SINHALA VOWEL SIGN KETTI PAA-PILLA 0DD6 ; [.226F.0020.0002.0DD6] # SINHALA VOWEL SIGN DIGA PAA-PILLA 0DD8 ; [.2270.0020.0002.0DD8] # SINHALA VOWEL SIGN GAETTA-PILLA 0DF2 ; [.2271.0020.0002.0DF2] # SINHALA VOWEL SIGN DIGA GAETTA-PILLA 0DDF ; [.2272.0020.0002.0DDF] # SINHALA VOWEL SIGN GAYANUKITTA 0DF3 ; [.2273.0020.0002.0DF3] # SINHALA VOWEL SIGN DIGA GAYANUKITTA 0DD9 ; [.2274.0020.0002.0DD9] # SINHALA VOWEL SIGN KOMBUVA 0DDA ; [.2275.0020.0002.0DDA] # SINHALA VOWEL SIGN DIGA KOMBUVA 0DD9 0DCA ; [.2275.0020.0002.0DDA] # SINHALA VOWEL SIGN DIGA KOMBUVA 0DDB ; [.2276.0020.0002.0DDB] # SINHALA VOWEL SIGN KOMBU DEKA 0DDC ; [.2277.0020.0002.0DDC] # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA 0DD9 0DCF ; [.2277.0020.0002.0DDC] # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA 0DDD ; [.2278.0020.0002.0DDD] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA 0DD9 0DCF 0DCA ; [.2278.0020.0002.0DDD] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA 0DDC 0DCA ; [.2278.0020.0002.0DDD] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA 0DDE ; [.2279.0020.0002.0DDE] # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA 0DD9 0DDF ; [.2279.0020.0002.0DDE] # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA 0DCA ; [.227A.0020.0002.0DCA] # SINHALA SIGN AL-LAKUNA AAF2 ; [.227B.0020.0002.AAF2] # MEETEI MAYEK ANJI ABC0 ; [.227C.0020.0002.ABC0] # MEETEI MAYEK LETTER KOK ABC1 ; [.227D.0020.0002.ABC1] # MEETEI MAYEK LETTER SAM ABC2 ; [.227E.0020.0002.ABC2] # MEETEI MAYEK LETTER LAI ABC3 ; [.227F.0020.0002.ABC3] # MEETEI MAYEK LETTER MIT ABC4 ; [.2280.0020.0002.ABC4] # MEETEI MAYEK LETTER PA ABC5 ; [.2281.0020.0002.ABC5] # MEETEI MAYEK LETTER NA ABC6 ; [.2282.0020.0002.ABC6] # MEETEI MAYEK LETTER CHIL ABC7 ; [.2283.0020.0002.ABC7] # MEETEI MAYEK LETTER TIL ABC8 ; [.2284.0020.0002.ABC8] # MEETEI MAYEK LETTER KHOU ABC9 ; [.2285.0020.0002.ABC9] # MEETEI MAYEK LETTER NGOU ABCA ; [.2286.0020.0002.ABCA] # MEETEI MAYEK LETTER THOU ABCB ; [.2287.0020.0002.ABCB] # MEETEI MAYEK LETTER WAI ABCC ; [.2288.0020.0002.ABCC] # MEETEI MAYEK LETTER YANG ABCD ; [.2289.0020.0002.ABCD] # MEETEI MAYEK LETTER HUK ABCE ; [.228A.0020.0002.ABCE] # MEETEI MAYEK LETTER UN ABCF ; [.228B.0020.0002.ABCF] # MEETEI MAYEK LETTER I ABD0 ; [.228C.0020.0002.ABD0] # MEETEI MAYEK LETTER PHAM ABD1 ; [.228D.0020.0002.ABD1] # MEETEI MAYEK LETTER ATIYA ABD2 ; [.228E.0020.0002.ABD2] # MEETEI MAYEK LETTER GOK ABD3 ; [.228F.0020.0002.ABD3] # MEETEI MAYEK LETTER JHAM ABD4 ; [.2290.0020.0002.ABD4] # MEETEI MAYEK LETTER RAI ABD5 ; [.2291.0020.0002.ABD5] # MEETEI MAYEK LETTER BA ABD6 ; [.2292.0020.0002.ABD6] # MEETEI MAYEK LETTER JIL ABD7 ; [.2293.0020.0002.ABD7] # MEETEI MAYEK LETTER DIL ABD8 ; [.2294.0020.0002.ABD8] # MEETEI MAYEK LETTER GHOU ABD9 ; [.2295.0020.0002.ABD9] # MEETEI MAYEK LETTER DHOU ABDA ; [.2296.0020.0002.ABDA] # MEETEI MAYEK LETTER BHAM AAE0 ; [.2297.0020.0002.AAE0] # MEETEI MAYEK LETTER E AAE1 ; [.2298.0020.0002.AAE1] # MEETEI MAYEK LETTER O AAE2 ; [.2299.0020.0002.AAE2] # MEETEI MAYEK LETTER CHA AAE3 ; [.229A.0020.0002.AAE3] # MEETEI MAYEK LETTER NYA AAE4 ; [.229B.0020.0002.AAE4] # MEETEI MAYEK LETTER TTA AAE5 ; [.229C.0020.0002.AAE5] # MEETEI MAYEK LETTER TTHA AAE6 ; [.229D.0020.0002.AAE6] # MEETEI MAYEK LETTER DDA AAE7 ; [.229E.0020.0002.AAE7] # MEETEI MAYEK LETTER DDHA AAE8 ; [.229F.0020.0002.AAE8] # MEETEI MAYEK LETTER NNA AAE9 ; [.22A0.0020.0002.AAE9] # MEETEI MAYEK LETTER SHA AAEA ; [.22A1.0020.0002.AAEA] # MEETEI MAYEK LETTER SSA ABE3 ; [.22A2.0020.0002.ABE3] # MEETEI MAYEK VOWEL SIGN ONAP ABE4 ; [.22A3.0020.0002.ABE4] # MEETEI MAYEK VOWEL SIGN INAP ABE5 ; [.22A4.0020.0002.ABE5] # MEETEI MAYEK VOWEL SIGN ANAP ABE6 ; [.22A5.0020.0002.ABE6] # MEETEI MAYEK VOWEL SIGN YENAP ABE7 ; [.22A6.0020.0002.ABE7] # MEETEI MAYEK VOWEL SIGN SOUNAP ABE8 ; [.22A7.0020.0002.ABE8] # MEETEI MAYEK VOWEL SIGN UNAP ABE9 ; [.22A8.0020.0002.ABE9] # MEETEI MAYEK VOWEL SIGN CHEINAP ABEA ; [.22A9.0020.0002.ABEA] # MEETEI MAYEK VOWEL SIGN NUNG AAEB ; [.22AA.0020.0002.AAEB] # MEETEI MAYEK VOWEL SIGN II AAEC ; [.22AB.0020.0002.AAEC] # MEETEI MAYEK VOWEL SIGN UU AAED ; [.22AC.0020.0002.AAED] # MEETEI MAYEK VOWEL SIGN AAI AAEE ; [.22AD.0020.0002.AAEE] # MEETEI MAYEK VOWEL SIGN AU AAEF ; [.22AE.0020.0002.AAEF] # MEETEI MAYEK VOWEL SIGN AAU AAF5 ; [.22AF.0020.0002.AAF5] # MEETEI MAYEK VOWEL SIGN VISARGA ABDB ; [.22B0.0020.0002.ABDB] # MEETEI MAYEK LETTER KOK LONSUM ABDC ; [.22B1.0020.0002.ABDC] # MEETEI MAYEK LETTER LAI LONSUM ABDD ; [.22B2.0020.0002.ABDD] # MEETEI MAYEK LETTER MIT LONSUM ABDE ; [.22B3.0020.0002.ABDE] # MEETEI MAYEK LETTER PA LONSUM ABDF ; [.22B4.0020.0002.ABDF] # MEETEI MAYEK LETTER NA LONSUM ABE0 ; [.22B5.0020.0002.ABE0] # MEETEI MAYEK LETTER TIL LONSUM ABE1 ; [.22B6.0020.0002.ABE1] # MEETEI MAYEK LETTER NGOU LONSUM ABE2 ; [.22B7.0020.0002.ABE2] # MEETEI MAYEK LETTER I LONSUM ABED ; [.22B8.0020.0002.ABED] # MEETEI MAYEK APUN IYEK AAF6 ; [.22B9.0020.0002.AAF6] # MEETEI MAYEK VIRAMA A800 ; [.22BA.0020.0002.A800] # SYLOTI NAGRI LETTER A A801 ; [.22BB.0020.0002.A801] # SYLOTI NAGRI LETTER I A802 ; [.22BC.0020.0002.A802] # SYLOTI NAGRI SIGN DVISVARA A803 ; [.22BD.0020.0002.A803] # SYLOTI NAGRI LETTER U A804 ; [.22BE.0020.0002.A804] # SYLOTI NAGRI LETTER E A805 ; [.22BF.0020.0002.A805] # SYLOTI NAGRI LETTER O A806 ; [.22C0.0020.0002.A806] # SYLOTI NAGRI SIGN HASANTA A807 ; [.22C1.0020.0002.A807] # SYLOTI NAGRI LETTER KO A808 ; [.22C2.0020.0002.A808] # SYLOTI NAGRI LETTER KHO A809 ; [.22C3.0020.0002.A809] # SYLOTI NAGRI LETTER GO A80A ; [.22C4.0020.0002.A80A] # SYLOTI NAGRI LETTER GHO A80C ; [.22C5.0020.0002.A80C] # SYLOTI NAGRI LETTER CO A80D ; [.22C6.0020.0002.A80D] # SYLOTI NAGRI LETTER CHO A80E ; [.22C7.0020.0002.A80E] # SYLOTI NAGRI LETTER JO A80F ; [.22C8.0020.0002.A80F] # SYLOTI NAGRI LETTER JHO A810 ; [.22C9.0020.0002.A810] # SYLOTI NAGRI LETTER TTO A811 ; [.22CA.0020.0002.A811] # SYLOTI NAGRI LETTER TTHO A812 ; [.22CB.0020.0002.A812] # SYLOTI NAGRI LETTER DDO A813 ; [.22CC.0020.0002.A813] # SYLOTI NAGRI LETTER DDHO A814 ; [.22CD.0020.0002.A814] # SYLOTI NAGRI LETTER TO A815 ; [.22CE.0020.0002.A815] # SYLOTI NAGRI LETTER THO A816 ; [.22CF.0020.0002.A816] # SYLOTI NAGRI LETTER DO A817 ; [.22D0.0020.0002.A817] # SYLOTI NAGRI LETTER DHO A818 ; [.22D1.0020.0002.A818] # SYLOTI NAGRI LETTER NO A819 ; [.22D2.0020.0002.A819] # SYLOTI NAGRI LETTER PO A81A ; [.22D3.0020.0002.A81A] # SYLOTI NAGRI LETTER PHO A81B ; [.22D4.0020.0002.A81B] # SYLOTI NAGRI LETTER BO A81C ; [.22D5.0020.0002.A81C] # SYLOTI NAGRI LETTER BHO A81D ; [.22D6.0020.0002.A81D] # SYLOTI NAGRI LETTER MO A81E ; [.22D7.0020.0002.A81E] # SYLOTI NAGRI LETTER RO A81F ; [.22D8.0020.0002.A81F] # SYLOTI NAGRI LETTER LO A820 ; [.22D9.0020.0002.A820] # SYLOTI NAGRI LETTER RRO A821 ; [.22DA.0020.0002.A821] # SYLOTI NAGRI LETTER SO A822 ; [.22DB.0020.0002.A822] # SYLOTI NAGRI LETTER HO A823 ; [.22DC.0020.0002.A823] # SYLOTI NAGRI VOWEL SIGN A A824 ; [.22DD.0020.0002.A824] # SYLOTI NAGRI VOWEL SIGN I A825 ; [.22DE.0020.0002.A825] # SYLOTI NAGRI VOWEL SIGN U A826 ; [.22DF.0020.0002.A826] # SYLOTI NAGRI VOWEL SIGN E A827 ; [.22E0.0020.0002.A827] # SYLOTI NAGRI VOWEL SIGN OO A882 ; [.22E1.0020.0002.A882] # SAURASHTRA LETTER A A883 ; [.22E2.0020.0002.A883] # SAURASHTRA LETTER AA A884 ; [.22E3.0020.0002.A884] # SAURASHTRA LETTER I A885 ; [.22E4.0020.0002.A885] # SAURASHTRA LETTER II A886 ; [.22E5.0020.0002.A886] # SAURASHTRA LETTER U A887 ; [.22E6.0020.0002.A887] # SAURASHTRA LETTER UU A888 ; [.22E7.0020.0002.A888] # SAURASHTRA LETTER VOCALIC R A889 ; [.22E8.0020.0002.A889] # SAURASHTRA LETTER VOCALIC RR A88A ; [.22E9.0020.0002.A88A] # SAURASHTRA LETTER VOCALIC L A88B ; [.22EA.0020.0002.A88B] # SAURASHTRA LETTER VOCALIC LL A88C ; [.22EB.0020.0002.A88C] # SAURASHTRA LETTER E A88D ; [.22EC.0020.0002.A88D] # SAURASHTRA LETTER EE A88E ; [.22ED.0020.0002.A88E] # SAURASHTRA LETTER AI A88F ; [.22EE.0020.0002.A88F] # SAURASHTRA LETTER O A890 ; [.22EF.0020.0002.A890] # SAURASHTRA LETTER OO A891 ; [.22F0.0020.0002.A891] # SAURASHTRA LETTER AU A892 ; [.22F1.0020.0002.A892] # SAURASHTRA LETTER KA A893 ; [.22F2.0020.0002.A893] # SAURASHTRA LETTER KHA A894 ; [.22F3.0020.0002.A894] # SAURASHTRA LETTER GA A895 ; [.22F4.0020.0002.A895] # SAURASHTRA LETTER GHA A896 ; [.22F5.0020.0002.A896] # SAURASHTRA LETTER NGA A897 ; [.22F6.0020.0002.A897] # SAURASHTRA LETTER CA A898 ; [.22F7.0020.0002.A898] # SAURASHTRA LETTER CHA A899 ; [.22F8.0020.0002.A899] # SAURASHTRA LETTER JA A89A ; [.22F9.0020.0002.A89A] # SAURASHTRA LETTER JHA A89B ; [.22FA.0020.0002.A89B] # SAURASHTRA LETTER NYA A89C ; [.22FB.0020.0002.A89C] # SAURASHTRA LETTER TTA A89D ; [.22FC.0020.0002.A89D] # SAURASHTRA LETTER TTHA A89E ; [.22FD.0020.0002.A89E] # SAURASHTRA LETTER DDA A89F ; [.22FE.0020.0002.A89F] # SAURASHTRA LETTER DDHA A8A0 ; [.22FF.0020.0002.A8A0] # SAURASHTRA LETTER NNA A8A1 ; [.2300.0020.0002.A8A1] # SAURASHTRA LETTER TA A8A2 ; [.2301.0020.0002.A8A2] # SAURASHTRA LETTER THA A8A3 ; [.2302.0020.0002.A8A3] # SAURASHTRA LETTER DA A8A4 ; [.2303.0020.0002.A8A4] # SAURASHTRA LETTER DHA A8A5 ; [.2304.0020.0002.A8A5] # SAURASHTRA LETTER NA A8A6 ; [.2305.0020.0002.A8A6] # SAURASHTRA LETTER PA A8A7 ; [.2306.0020.0002.A8A7] # SAURASHTRA LETTER PHA A8A8 ; [.2307.0020.0002.A8A8] # SAURASHTRA LETTER BA A8A9 ; [.2308.0020.0002.A8A9] # SAURASHTRA LETTER BHA A8AA ; [.2309.0020.0002.A8AA] # SAURASHTRA LETTER MA A8AB ; [.230A.0020.0002.A8AB] # SAURASHTRA LETTER YA A8AC ; [.230B.0020.0002.A8AC] # SAURASHTRA LETTER RA A8AD ; [.230C.0020.0002.A8AD] # SAURASHTRA LETTER LA A8AE ; [.230D.0020.0002.A8AE] # SAURASHTRA LETTER VA A8AF ; [.230E.0020.0002.A8AF] # SAURASHTRA LETTER SHA A8B0 ; [.230F.0020.0002.A8B0] # SAURASHTRA LETTER SSA A8B1 ; [.2310.0020.0002.A8B1] # SAURASHTRA LETTER SA A8B2 ; [.2311.0020.0002.A8B2] # SAURASHTRA LETTER HA A8B3 ; [.2312.0020.0002.A8B3] # SAURASHTRA LETTER LLA A8B4 ; [.2313.0020.0002.A8B4] # SAURASHTRA CONSONANT SIGN HAARU A8B5 ; [.2314.0020.0002.A8B5] # SAURASHTRA VOWEL SIGN AA A8B6 ; [.2315.0020.0002.A8B6] # SAURASHTRA VOWEL SIGN I A8B7 ; [.2316.0020.0002.A8B7] # SAURASHTRA VOWEL SIGN II A8B8 ; [.2317.0020.0002.A8B8] # SAURASHTRA VOWEL SIGN U A8B9 ; [.2318.0020.0002.A8B9] # SAURASHTRA VOWEL SIGN UU A8BA ; [.2319.0020.0002.A8BA] # SAURASHTRA VOWEL SIGN VOCALIC R A8BB ; [.231A.0020.0002.A8BB] # SAURASHTRA VOWEL SIGN VOCALIC RR A8BC ; [.231B.0020.0002.A8BC] # SAURASHTRA VOWEL SIGN VOCALIC L A8BD ; [.231C.0020.0002.A8BD] # SAURASHTRA VOWEL SIGN VOCALIC LL A8BE ; [.231D.0020.0002.A8BE] # SAURASHTRA VOWEL SIGN E A8BF ; [.231E.0020.0002.A8BF] # SAURASHTRA VOWEL SIGN EE A8C0 ; [.231F.0020.0002.A8C0] # SAURASHTRA VOWEL SIGN AI A8C1 ; [.2320.0020.0002.A8C1] # SAURASHTRA VOWEL SIGN O A8C2 ; [.2321.0020.0002.A8C2] # SAURASHTRA VOWEL SIGN OO A8C3 ; [.2322.0020.0002.A8C3] # SAURASHTRA VOWEL SIGN AU A8C4 ; [.2323.0020.0002.A8C4] # SAURASHTRA SIGN VIRAMA 11083 ; [.2324.0020.0002.11083] # KAITHI LETTER A 11084 ; [.2325.0020.0002.11084] # KAITHI LETTER AA 11085 ; [.2326.0020.0002.11085] # KAITHI LETTER I 11086 ; [.2327.0020.0002.11086] # KAITHI LETTER II 11087 ; [.2328.0020.0002.11087] # KAITHI LETTER U 11088 ; [.2329.0020.0002.11088] # KAITHI LETTER UU 11089 ; [.232A.0020.0002.11089] # KAITHI LETTER E 1108A ; [.232B.0020.0002.1108A] # KAITHI LETTER AI 1108B ; [.232C.0020.0002.1108B] # KAITHI LETTER O 1108C ; [.232D.0020.0002.1108C] # KAITHI LETTER AU 1108D ; [.232E.0020.0002.1108D] # KAITHI LETTER KA 1108E ; [.232F.0020.0002.1108E] # KAITHI LETTER KHA 1108F ; [.2330.0020.0002.1108F] # KAITHI LETTER GA 11090 ; [.2331.0020.0002.11090] # KAITHI LETTER GHA 11091 ; [.2332.0020.0002.11091] # KAITHI LETTER NGA 11092 ; [.2333.0020.0002.11092] # KAITHI LETTER CA 11093 ; [.2334.0020.0002.11093] # KAITHI LETTER CHA 11094 ; [.2335.0020.0002.11094] # KAITHI LETTER JA 11095 ; [.2336.0020.0002.11095] # KAITHI LETTER JHA 11096 ; [.2337.0020.0002.11096] # KAITHI LETTER NYA 11097 ; [.2338.0020.0002.11097] # KAITHI LETTER TTA 11098 ; [.2339.0020.0002.11098] # KAITHI LETTER TTHA 11099 ; [.233A.0020.0002.11099] # KAITHI LETTER DDA 1109A ; [.233A.0020.0002.11099][.0000.00F1.0002.093C] # KAITHI LETTER DDDHA 1109B ; [.233B.0020.0002.1109B] # KAITHI LETTER DDHA 1109C ; [.233B.0020.0002.1109B][.0000.00F1.0002.093C] # KAITHI LETTER RHA 1109D ; [.233C.0020.0002.1109D] # KAITHI LETTER NNA 1109E ; [.233D.0020.0002.1109E] # KAITHI LETTER TA 1109F ; [.233E.0020.0002.1109F] # KAITHI LETTER THA 110A0 ; [.233F.0020.0002.110A0] # KAITHI LETTER DA 110A1 ; [.2340.0020.0002.110A1] # KAITHI LETTER DHA 110A2 ; [.2341.0020.0002.110A2] # KAITHI LETTER NA 110A3 ; [.2342.0020.0002.110A3] # KAITHI LETTER PA 110A4 ; [.2343.0020.0002.110A4] # KAITHI LETTER PHA 110A5 ; [.2344.0020.0002.110A5] # KAITHI LETTER BA 110AB ; [.2344.0020.0002.110A5][.0000.00F1.0002.093C] # KAITHI LETTER VA 110A6 ; [.2345.0020.0002.110A6] # KAITHI LETTER BHA 110A7 ; [.2346.0020.0002.110A7] # KAITHI LETTER MA 110A8 ; [.2347.0020.0002.110A8] # KAITHI LETTER YA 110A9 ; [.2348.0020.0002.110A9] # KAITHI LETTER RA 110AA ; [.2349.0020.0002.110AA] # KAITHI LETTER LA 110AC ; [.234A.0020.0002.110AC] # KAITHI LETTER SHA 110AD ; [.234B.0020.0002.110AD] # KAITHI LETTER SSA 110AE ; [.234C.0020.0002.110AE] # KAITHI LETTER SA 110AF ; [.234D.0020.0002.110AF] # KAITHI LETTER HA 110B0 ; [.234E.0020.0002.110B0] # KAITHI VOWEL SIGN AA 110B1 ; [.234F.0020.0002.110B1] # KAITHI VOWEL SIGN I 110B2 ; [.2350.0020.0002.110B2] # KAITHI VOWEL SIGN II 110B3 ; [.2351.0020.0002.110B3] # KAITHI VOWEL SIGN U 110B4 ; [.2352.0020.0002.110B4] # KAITHI VOWEL SIGN UU 110B5 ; [.2353.0020.0002.110B5] # KAITHI VOWEL SIGN E 110B6 ; [.2354.0020.0002.110B6] # KAITHI VOWEL SIGN AI 110B7 ; [.2355.0020.0002.110B7] # KAITHI VOWEL SIGN O 110B8 ; [.2356.0020.0002.110B8] # KAITHI VOWEL SIGN AU 110B9 ; [.2357.0020.0002.110B9] # KAITHI SIGN VIRAMA 111C4 ; [.2358.0020.0002.111C4] # SHARADA OM 11183 ; [.2359.0020.0002.11183] # SHARADA LETTER A 11184 ; [.235A.0020.0002.11184] # SHARADA LETTER AA 11185 ; [.235B.0020.0002.11185] # SHARADA LETTER I 11186 ; [.235C.0020.0002.11186] # SHARADA LETTER II 11187 ; [.235D.0020.0002.11187] # SHARADA LETTER U 11188 ; [.235E.0020.0002.11188] # SHARADA LETTER UU 11189 ; [.235F.0020.0002.11189] # SHARADA LETTER VOCALIC R 1118A ; [.2360.0020.0002.1118A] # SHARADA LETTER VOCALIC RR 1118B ; [.2361.0020.0002.1118B] # SHARADA LETTER VOCALIC L 1118C ; [.2362.0020.0002.1118C] # SHARADA LETTER VOCALIC LL 1118D ; [.2363.0020.0002.1118D] # SHARADA LETTER E 1118E ; [.2364.0020.0002.1118E] # SHARADA LETTER AI 1118F ; [.2365.0020.0002.1118F] # SHARADA LETTER O 11190 ; [.2366.0020.0002.11190] # SHARADA LETTER AU 11191 ; [.2367.0020.0002.11191] # SHARADA LETTER KA 11192 ; [.2368.0020.0002.11192] # SHARADA LETTER KHA 11193 ; [.2369.0020.0002.11193] # SHARADA LETTER GA 11194 ; [.236A.0020.0002.11194] # SHARADA LETTER GHA 11195 ; [.236B.0020.0002.11195] # SHARADA LETTER NGA 11196 ; [.236C.0020.0002.11196] # SHARADA LETTER CA 11197 ; [.236D.0020.0002.11197] # SHARADA LETTER CHA 11198 ; [.236E.0020.0002.11198] # SHARADA LETTER JA 11199 ; [.236F.0020.0002.11199] # SHARADA LETTER JHA 1119A ; [.2370.0020.0002.1119A] # SHARADA LETTER NYA 1119B ; [.2371.0020.0002.1119B] # SHARADA LETTER TTA 1119C ; [.2372.0020.0002.1119C] # SHARADA LETTER TTHA 1119D ; [.2373.0020.0002.1119D] # SHARADA LETTER DDA 1119E ; [.2374.0020.0002.1119E] # SHARADA LETTER DDHA 1119F ; [.2375.0020.0002.1119F] # SHARADA LETTER NNA 111A0 ; [.2376.0020.0002.111A0] # SHARADA LETTER TA 111A1 ; [.2377.0020.0002.111A1] # SHARADA LETTER THA 111A2 ; [.2378.0020.0002.111A2] # SHARADA LETTER DA 111A3 ; [.2379.0020.0002.111A3] # SHARADA LETTER DHA 111A4 ; [.237A.0020.0002.111A4] # SHARADA LETTER NA 111A5 ; [.237B.0020.0002.111A5] # SHARADA LETTER PA 111A6 ; [.237C.0020.0002.111A6] # SHARADA LETTER PHA 111A7 ; [.237D.0020.0002.111A7] # SHARADA LETTER BA 111A8 ; [.237E.0020.0002.111A8] # SHARADA LETTER BHA 111A9 ; [.237F.0020.0002.111A9] # SHARADA LETTER MA 111AA ; [.2380.0020.0002.111AA] # SHARADA LETTER YA 111AB ; [.2381.0020.0002.111AB] # SHARADA LETTER RA 111AC ; [.2382.0020.0002.111AC] # SHARADA LETTER LA 111AD ; [.2383.0020.0002.111AD] # SHARADA LETTER LLA 111AE ; [.2384.0020.0002.111AE] # SHARADA LETTER VA 111AF ; [.2385.0020.0002.111AF] # SHARADA LETTER SHA 111B0 ; [.2386.0020.0002.111B0] # SHARADA LETTER SSA 111B1 ; [.2387.0020.0002.111B1] # SHARADA LETTER SA 111B2 ; [.2388.0020.0002.111B2] # SHARADA LETTER HA 111B3 ; [.2389.0020.0002.111B3] # SHARADA VOWEL SIGN AA 111B4 ; [.238A.0020.0002.111B4] # SHARADA VOWEL SIGN I 111B5 ; [.238B.0020.0002.111B5] # SHARADA VOWEL SIGN II 111B6 ; [.238C.0020.0002.111B6] # SHARADA VOWEL SIGN U 111B7 ; [.238D.0020.0002.111B7] # SHARADA VOWEL SIGN UU 111B8 ; [.238E.0020.0002.111B8] # SHARADA VOWEL SIGN VOCALIC R 111B9 ; [.238F.0020.0002.111B9] # SHARADA VOWEL SIGN VOCALIC RR 111BA ; [.2390.0020.0002.111BA] # SHARADA VOWEL SIGN VOCALIC L 111BB ; [.2391.0020.0002.111BB] # SHARADA VOWEL SIGN VOCALIC LL 111BC ; [.2392.0020.0002.111BC] # SHARADA VOWEL SIGN E 111BD ; [.2393.0020.0002.111BD] # SHARADA VOWEL SIGN AI 111BE ; [.2394.0020.0002.111BE] # SHARADA VOWEL SIGN O 111BF ; [.2395.0020.0002.111BF] # SHARADA VOWEL SIGN AU 111C0 ; [.2396.0020.0002.111C0] # SHARADA SIGN VIRAMA 111C1 ; [.2397.0020.0002.111C1] # SHARADA SIGN AVAGRAHA 111C2 ; [.2398.0020.0002.111C2] # SHARADA SIGN JIHVAMULIYA 111C3 ; [.2399.0020.0002.111C3] # SHARADA SIGN UPADHMANIYA 11680 ; [.239A.0020.0002.11680] # TAKRI LETTER A 11681 ; [.239B.0020.0002.11681] # TAKRI LETTER AA 11682 ; [.239C.0020.0002.11682] # TAKRI LETTER I 11683 ; [.239D.0020.0002.11683] # TAKRI LETTER II 11684 ; [.239E.0020.0002.11684] # TAKRI LETTER U 11685 ; [.239F.0020.0002.11685] # TAKRI LETTER UU 11686 ; [.23A0.0020.0002.11686] # TAKRI LETTER E 11687 ; [.23A1.0020.0002.11687] # TAKRI LETTER AI 11688 ; [.23A2.0020.0002.11688] # TAKRI LETTER O 11689 ; [.23A3.0020.0002.11689] # TAKRI LETTER AU 116A8 ; [.23A4.0020.0002.116A8] # TAKRI LETTER SA 116A7 ; [.23A5.0020.0002.116A7] # TAKRI LETTER SHA 116A9 ; [.23A6.0020.0002.116A9] # TAKRI LETTER HA 1168A ; [.23A7.0020.0002.1168A] # TAKRI LETTER KA 1168B ; [.23A8.0020.0002.1168B] # TAKRI LETTER KHA 1168C ; [.23A9.0020.0002.1168C] # TAKRI LETTER GA 1168D ; [.23AA.0020.0002.1168D] # TAKRI LETTER GHA 1168E ; [.23AB.0020.0002.1168E] # TAKRI LETTER NGA 1168F ; [.23AC.0020.0002.1168F] # TAKRI LETTER CA 11690 ; [.23AD.0020.0002.11690] # TAKRI LETTER CHA 11691 ; [.23AE.0020.0002.11691] # TAKRI LETTER JA 11692 ; [.23AF.0020.0002.11692] # TAKRI LETTER JHA 11693 ; [.23B0.0020.0002.11693] # TAKRI LETTER NYA 11694 ; [.23B1.0020.0002.11694] # TAKRI LETTER TTA 11695 ; [.23B2.0020.0002.11695] # TAKRI LETTER TTHA 11696 ; [.23B3.0020.0002.11696] # TAKRI LETTER DDA 11697 ; [.23B4.0020.0002.11697] # TAKRI LETTER DDHA 11698 ; [.23B5.0020.0002.11698] # TAKRI LETTER NNA 11699 ; [.23B6.0020.0002.11699] # TAKRI LETTER TA 1169A ; [.23B7.0020.0002.1169A] # TAKRI LETTER THA 1169B ; [.23B8.0020.0002.1169B] # TAKRI LETTER DA 1169C ; [.23B9.0020.0002.1169C] # TAKRI LETTER DHA 1169D ; [.23BA.0020.0002.1169D] # TAKRI LETTER NA 1169E ; [.23BB.0020.0002.1169E] # TAKRI LETTER PA 1169F ; [.23BC.0020.0002.1169F] # TAKRI LETTER PHA 116A0 ; [.23BD.0020.0002.116A0] # TAKRI LETTER BA 116A1 ; [.23BE.0020.0002.116A1] # TAKRI LETTER BHA 116A2 ; [.23BF.0020.0002.116A2] # TAKRI LETTER MA 116A3 ; [.23C0.0020.0002.116A3] # TAKRI LETTER YA 116A4 ; [.23C1.0020.0002.116A4] # TAKRI LETTER RA 116A5 ; [.23C2.0020.0002.116A5] # TAKRI LETTER LA 116A6 ; [.23C3.0020.0002.116A6] # TAKRI LETTER VA 116AA ; [.23C4.0020.0002.116AA] # TAKRI LETTER RRA 116AD ; [.23C5.0020.0002.116AD] # TAKRI VOWEL SIGN AA 116AE ; [.23C6.0020.0002.116AE] # TAKRI VOWEL SIGN I 116AF ; [.23C7.0020.0002.116AF] # TAKRI VOWEL SIGN II 116B0 ; [.23C8.0020.0002.116B0] # TAKRI VOWEL SIGN U 116B1 ; [.23C9.0020.0002.116B1] # TAKRI VOWEL SIGN UU 116B2 ; [.23CA.0020.0002.116B2] # TAKRI VOWEL SIGN E 116B3 ; [.23CB.0020.0002.116B3] # TAKRI VOWEL SIGN AI 116B4 ; [.23CC.0020.0002.116B4] # TAKRI VOWEL SIGN O 116B5 ; [.23CD.0020.0002.116B5] # TAKRI VOWEL SIGN AU 116B6 ; [.23CE.0020.0002.116B6] # TAKRI SIGN VIRAMA 1B83 ; [.23CF.0020.0002.1B83] # SUNDANESE LETTER A 1BBA ; [.23CF.0020.0004.1BBA] # SUNDANESE AVAGRAHA 1B84 ; [.23D0.0020.0002.1B84] # SUNDANESE LETTER I 1B85 ; [.23D1.0020.0002.1B85] # SUNDANESE LETTER U 1B86 ; [.23D2.0020.0002.1B86] # SUNDANESE LETTER AE 1B87 ; [.23D3.0020.0002.1B87] # SUNDANESE LETTER O 1B88 ; [.23D4.0020.0002.1B88] # SUNDANESE LETTER E 1B89 ; [.23D5.0020.0002.1B89] # SUNDANESE LETTER EU 1B8A ; [.23D6.0020.0002.1B8A] # SUNDANESE LETTER KA 1BBE ; [.23D6.0020.0019.1BBE] # SUNDANESE LETTER FINAL K 1BAE ; [.23D7.0020.0002.1BAE] # SUNDANESE LETTER KHA 1B8B ; [.23D8.0020.0002.1B8B] # SUNDANESE LETTER QA 1B8C ; [.23D9.0020.0002.1B8C] # SUNDANESE LETTER GA 1B8D ; [.23DA.0020.0002.1B8D] # SUNDANESE LETTER NGA 1B8E ; [.23DB.0020.0002.1B8E] # SUNDANESE LETTER CA 1B8F ; [.23DC.0020.0002.1B8F] # SUNDANESE LETTER JA 1B90 ; [.23DD.0020.0002.1B90] # SUNDANESE LETTER ZA 1B91 ; [.23DE.0020.0002.1B91] # SUNDANESE LETTER NYA 1B92 ; [.23DF.0020.0002.1B92] # SUNDANESE LETTER TA 1B93 ; [.23E0.0020.0002.1B93] # SUNDANESE LETTER DA 1B94 ; [.23E1.0020.0002.1B94] # SUNDANESE LETTER NA 1B95 ; [.23E2.0020.0002.1B95] # SUNDANESE LETTER PA 1B96 ; [.23E3.0020.0002.1B96] # SUNDANESE LETTER FA 1B97 ; [.23E4.0020.0002.1B97] # SUNDANESE LETTER VA 1B98 ; [.23E5.0020.0002.1B98] # SUNDANESE LETTER BA 1BBD ; [.23E6.0020.0002.1BBD] # SUNDANESE LETTER BHA 1B99 ; [.23E7.0020.0002.1B99] # SUNDANESE LETTER MA 1BBF ; [.23E7.0020.0019.1BBF] # SUNDANESE LETTER FINAL M 1BAC ; [.23E8.0020.0002.1BAC] # SUNDANESE CONSONANT SIGN PASANGAN MA 1B9A ; [.23E9.0020.0002.1B9A] # SUNDANESE LETTER YA 1BA1 ; [.23EA.0020.0002.1BA1] # SUNDANESE CONSONANT SIGN PAMINGKAL 1B9B ; [.23EB.0020.0002.1B9B] # SUNDANESE LETTER RA 1BA2 ; [.23EC.0020.0002.1BA2] # SUNDANESE CONSONANT SIGN PANYAKRA 1BBB ; [.23ED.0020.0002.1BBB] # SUNDANESE LETTER REU 1B9C ; [.23EE.0020.0002.1B9C] # SUNDANESE LETTER LA 1BA3 ; [.23EF.0020.0002.1BA3] # SUNDANESE CONSONANT SIGN PANYIKU 1BBC ; [.23F0.0020.0002.1BBC] # SUNDANESE LETTER LEU 1B9D ; [.23F1.0020.0002.1B9D] # SUNDANESE LETTER WA 1BAD ; [.23F2.0020.0002.1BAD] # SUNDANESE CONSONANT SIGN PASANGAN WA 1B9E ; [.23F3.0020.0002.1B9E] # SUNDANESE LETTER SA 1B9F ; [.23F4.0020.0002.1B9F] # SUNDANESE LETTER XA 1BAF ; [.23F5.0020.0002.1BAF] # SUNDANESE LETTER SYA 1BA0 ; [.23F6.0020.0002.1BA0] # SUNDANESE LETTER HA 1BA4 ; [.23F7.0020.0002.1BA4] # SUNDANESE VOWEL SIGN PANGHULU 1BA5 ; [.23F8.0020.0002.1BA5] # SUNDANESE VOWEL SIGN PANYUKU 1BA6 ; [.23F9.0020.0002.1BA6] # SUNDANESE VOWEL SIGN PANAELAENG 1BA7 ; [.23FA.0020.0002.1BA7] # SUNDANESE VOWEL SIGN PANOLONG 1BA8 ; [.23FB.0020.0002.1BA8] # SUNDANESE VOWEL SIGN PAMEPET 1BA9 ; [.23FC.0020.0002.1BA9] # SUNDANESE VOWEL SIGN PANEULEUNG 1BAA ; [.23FD.0020.0002.1BAA] # SUNDANESE SIGN PAMAAEH 1BAB ; [.23FE.0020.0002.1BAB] # SUNDANESE SIGN VIRAMA 11005 ; [.23FF.0020.0002.11005] # BRAHMI LETTER A 11006 ; [.2400.0020.0002.11006] # BRAHMI LETTER AA 11007 ; [.2401.0020.0002.11007] # BRAHMI LETTER I 11008 ; [.2402.0020.0002.11008] # BRAHMI LETTER II 11009 ; [.2403.0020.0002.11009] # BRAHMI LETTER U 1100A ; [.2404.0020.0002.1100A] # BRAHMI LETTER UU 1100B ; [.2405.0020.0002.1100B] # BRAHMI LETTER VOCALIC R 1100C ; [.2406.0020.0002.1100C] # BRAHMI LETTER VOCALIC RR 1100D ; [.2407.0020.0002.1100D] # BRAHMI LETTER VOCALIC L 1100E ; [.2408.0020.0002.1100E] # BRAHMI LETTER VOCALIC LL 1100F ; [.2409.0020.0002.1100F] # BRAHMI LETTER E 11010 ; [.240A.0020.0002.11010] # BRAHMI LETTER AI 11011 ; [.240B.0020.0002.11011] # BRAHMI LETTER O 11012 ; [.240C.0020.0002.11012] # BRAHMI LETTER AU 11013 ; [.240D.0020.0002.11013] # BRAHMI LETTER KA 11014 ; [.240E.0020.0002.11014] # BRAHMI LETTER KHA 11015 ; [.240F.0020.0002.11015] # BRAHMI LETTER GA 11016 ; [.2410.0020.0002.11016] # BRAHMI LETTER GHA 11017 ; [.2411.0020.0002.11017] # BRAHMI LETTER NGA 11018 ; [.2412.0020.0002.11018] # BRAHMI LETTER CA 11019 ; [.2413.0020.0002.11019] # BRAHMI LETTER CHA 1101A ; [.2414.0020.0002.1101A] # BRAHMI LETTER JA 1101B ; [.2415.0020.0002.1101B] # BRAHMI LETTER JHA 1101C ; [.2416.0020.0002.1101C] # BRAHMI LETTER NYA 1101D ; [.2417.0020.0002.1101D] # BRAHMI LETTER TTA 1101E ; [.2418.0020.0002.1101E] # BRAHMI LETTER TTHA 1101F ; [.2419.0020.0002.1101F] # BRAHMI LETTER DDA 11020 ; [.241A.0020.0002.11020] # BRAHMI LETTER DDHA 11021 ; [.241B.0020.0002.11021] # BRAHMI LETTER NNA 11022 ; [.241C.0020.0002.11022] # BRAHMI LETTER TA 11023 ; [.241D.0020.0002.11023] # BRAHMI LETTER THA 11024 ; [.241E.0020.0002.11024] # BRAHMI LETTER DA 11025 ; [.241F.0020.0002.11025] # BRAHMI LETTER DHA 11026 ; [.2420.0020.0002.11026] # BRAHMI LETTER NA 11027 ; [.2421.0020.0002.11027] # BRAHMI LETTER PA 11028 ; [.2422.0020.0002.11028] # BRAHMI LETTER PHA 11029 ; [.2423.0020.0002.11029] # BRAHMI LETTER BA 1102A ; [.2424.0020.0002.1102A] # BRAHMI LETTER BHA 1102B ; [.2425.0020.0002.1102B] # BRAHMI LETTER MA 1102C ; [.2426.0020.0002.1102C] # BRAHMI LETTER YA 1102D ; [.2427.0020.0002.1102D] # BRAHMI LETTER RA 1102E ; [.2428.0020.0002.1102E] # BRAHMI LETTER LA 1102F ; [.2429.0020.0002.1102F] # BRAHMI LETTER VA 11030 ; [.242A.0020.0002.11030] # BRAHMI LETTER SHA 11031 ; [.242B.0020.0002.11031] # BRAHMI LETTER SSA 11032 ; [.242C.0020.0002.11032] # BRAHMI LETTER SA 11033 ; [.242D.0020.0002.11033] # BRAHMI LETTER HA 11003 ; [.242E.0020.0002.11003] # BRAHMI SIGN JIHVAMULIYA 11004 ; [.242F.0020.0002.11004] # BRAHMI SIGN UPADHMANIYA 11034 ; [.2430.0020.0002.11034] # BRAHMI LETTER LLA 11035 ; [.2431.0020.0002.11035] # BRAHMI LETTER OLD TAMIL LLLA 11036 ; [.2432.0020.0002.11036] # BRAHMI LETTER OLD TAMIL RRA 11037 ; [.2433.0020.0002.11037] # BRAHMI LETTER OLD TAMIL NNNA 11038 ; [.2434.0020.0002.11038] # BRAHMI VOWEL SIGN AA 11039 ; [.2435.0020.0002.11039] # BRAHMI VOWEL SIGN BHATTIPROLU AA 1103A ; [.2436.0020.0002.1103A] # BRAHMI VOWEL SIGN I 1103B ; [.2437.0020.0002.1103B] # BRAHMI VOWEL SIGN II 1103C ; [.2438.0020.0002.1103C] # BRAHMI VOWEL SIGN U 1103D ; [.2439.0020.0002.1103D] # BRAHMI VOWEL SIGN UU 1103E ; [.243A.0020.0002.1103E] # BRAHMI VOWEL SIGN VOCALIC R 1103F ; [.243B.0020.0002.1103F] # BRAHMI VOWEL SIGN VOCALIC RR 11040 ; [.243C.0020.0002.11040] # BRAHMI VOWEL SIGN VOCALIC L 11041 ; [.243D.0020.0002.11041] # BRAHMI VOWEL SIGN VOCALIC LL 11042 ; [.243E.0020.0002.11042] # BRAHMI VOWEL SIGN E 11043 ; [.243F.0020.0002.11043] # BRAHMI VOWEL SIGN AI 11044 ; [.2440.0020.0002.11044] # BRAHMI VOWEL SIGN O 11045 ; [.2441.0020.0002.11045] # BRAHMI VOWEL SIGN AU 11046 ; [.2442.0020.0002.11046] # BRAHMI VIRAMA 10A00 ; [.2443.0020.0002.10A00] # KHAROSHTHI LETTER A 10A01 ; [.2444.0020.0002.10A01] # KHAROSHTHI VOWEL SIGN I 10A02 ; [.2445.0020.0002.10A02] # KHAROSHTHI VOWEL SIGN U 10A03 ; [.2446.0020.0002.10A03] # KHAROSHTHI VOWEL SIGN VOCALIC R 10A05 ; [.2447.0020.0002.10A05] # KHAROSHTHI VOWEL SIGN E 10A06 ; [.2448.0020.0002.10A06] # KHAROSHTHI VOWEL SIGN O 10A0C ; [.2449.0020.0002.10A0C] # KHAROSHTHI VOWEL LENGTH MARK 10A10 ; [.244A.0020.0002.10A10] # KHAROSHTHI LETTER KA 10A11 ; [.244B.0020.0002.10A11] # KHAROSHTHI LETTER KHA 10A12 ; [.244C.0020.0002.10A12] # KHAROSHTHI LETTER GA 10A13 ; [.244D.0020.0002.10A13] # KHAROSHTHI LETTER GHA 10A15 ; [.244E.0020.0002.10A15] # KHAROSHTHI LETTER CA 10A16 ; [.244F.0020.0002.10A16] # KHAROSHTHI LETTER CHA 10A17 ; [.2450.0020.0002.10A17] # KHAROSHTHI LETTER JA 10A19 ; [.2451.0020.0002.10A19] # KHAROSHTHI LETTER NYA 10A1A ; [.2452.0020.0002.10A1A] # KHAROSHTHI LETTER TTA 10A1B ; [.2453.0020.0002.10A1B] # KHAROSHTHI LETTER TTHA 10A1C ; [.2454.0020.0002.10A1C] # KHAROSHTHI LETTER DDA 10A1D ; [.2455.0020.0002.10A1D] # KHAROSHTHI LETTER DDHA 10A1E ; [.2456.0020.0002.10A1E] # KHAROSHTHI LETTER NNA 10A1F ; [.2457.0020.0002.10A1F] # KHAROSHTHI LETTER TA 10A20 ; [.2458.0020.0002.10A20] # KHAROSHTHI LETTER THA 10A21 ; [.2459.0020.0002.10A21] # KHAROSHTHI LETTER DA 10A22 ; [.245A.0020.0002.10A22] # KHAROSHTHI LETTER DHA 10A23 ; [.245B.0020.0002.10A23] # KHAROSHTHI LETTER NA 10A24 ; [.245C.0020.0002.10A24] # KHAROSHTHI LETTER PA 10A25 ; [.245D.0020.0002.10A25] # KHAROSHTHI LETTER PHA 10A26 ; [.245E.0020.0002.10A26] # KHAROSHTHI LETTER BA 10A27 ; [.245F.0020.0002.10A27] # KHAROSHTHI LETTER BHA 10A28 ; [.2460.0020.0002.10A28] # KHAROSHTHI LETTER MA 10A29 ; [.2461.0020.0002.10A29] # KHAROSHTHI LETTER YA 10A2A ; [.2462.0020.0002.10A2A] # KHAROSHTHI LETTER RA 10A2B ; [.2463.0020.0002.10A2B] # KHAROSHTHI LETTER LA 10A2C ; [.2464.0020.0002.10A2C] # KHAROSHTHI LETTER VA 10A2D ; [.2465.0020.0002.10A2D] # KHAROSHTHI LETTER SHA 10A2E ; [.2466.0020.0002.10A2E] # KHAROSHTHI LETTER SSA 10A2F ; [.2467.0020.0002.10A2F] # KHAROSHTHI LETTER SA 10A30 ; [.2468.0020.0002.10A30] # KHAROSHTHI LETTER ZA 10A31 ; [.2469.0020.0002.10A31] # KHAROSHTHI LETTER HA 10A32 ; [.246A.0020.0002.10A32] # KHAROSHTHI LETTER KKA 10A33 ; [.246B.0020.0002.10A33] # KHAROSHTHI LETTER TTTHA 10A3F ; [.246C.0020.0002.10A3F] # KHAROSHTHI VIRAMA 0E01 ; [.246D.0020.0002.0E01] # THAI CHARACTER KO KAI 0E40 0E01 ; [.246D.0020.0002.0E01][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KO KAI> 0E41 0E01 ; [.246D.0020.0002.0E01][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KO KAI> 0E42 0E01 ; [.246D.0020.0002.0E01][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KO KAI> 0E43 0E01 ; [.246D.0020.0002.0E01][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KO KAI> 0E44 0E01 ; [.246D.0020.0002.0E01][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KO KAI> 0E02 ; [.246E.0020.0002.0E02] # THAI CHARACTER KHO KHAI 0E40 0E02 ; [.246E.0020.0002.0E02][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHAI> 0E41 0E02 ; [.246E.0020.0002.0E02][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHAI> 0E42 0E02 ; [.246E.0020.0002.0E02][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHAI> 0E43 0E02 ; [.246E.0020.0002.0E02][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHAI> 0E44 0E02 ; [.246E.0020.0002.0E02][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHAI> 0E03 ; [.246F.0020.0002.0E03] # THAI CHARACTER KHO KHUAT 0E40 0E03 ; [.246F.0020.0002.0E03][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHUAT> 0E41 0E03 ; [.246F.0020.0002.0E03][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHUAT> 0E42 0E03 ; [.246F.0020.0002.0E03][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHUAT> 0E43 0E03 ; [.246F.0020.0002.0E03][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHUAT> 0E44 0E03 ; [.246F.0020.0002.0E03][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHUAT> 0E04 ; [.2470.0020.0002.0E04] # THAI CHARACTER KHO KHWAI 0E40 0E04 ; [.2470.0020.0002.0E04][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHWAI> 0E41 0E04 ; [.2470.0020.0002.0E04][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHWAI> 0E42 0E04 ; [.2470.0020.0002.0E04][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHWAI> 0E43 0E04 ; [.2470.0020.0002.0E04][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHWAI> 0E44 0E04 ; [.2470.0020.0002.0E04][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHWAI> 0E05 ; [.2471.0020.0002.0E05] # THAI CHARACTER KHO KHON 0E40 0E05 ; [.2471.0020.0002.0E05][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHON> 0E41 0E05 ; [.2471.0020.0002.0E05][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHON> 0E42 0E05 ; [.2471.0020.0002.0E05][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHON> 0E43 0E05 ; [.2471.0020.0002.0E05][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHON> 0E44 0E05 ; [.2471.0020.0002.0E05][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHON> 0E06 ; [.2472.0020.0002.0E06] # THAI CHARACTER KHO RAKHANG 0E40 0E06 ; [.2472.0020.0002.0E06][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KHO RAKHANG> 0E41 0E06 ; [.2472.0020.0002.0E06][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO RAKHANG> 0E42 0E06 ; [.2472.0020.0002.0E06][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KHO RAKHANG> 0E43 0E06 ; [.2472.0020.0002.0E06][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO RAKHANG> 0E44 0E06 ; [.2472.0020.0002.0E06][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO RAKHANG> 0E07 ; [.2473.0020.0002.0E07] # THAI CHARACTER NGO NGU 0E40 0E07 ; [.2473.0020.0002.0E07][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER NGO NGU> 0E41 0E07 ; [.2473.0020.0002.0E07][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER NGO NGU> 0E42 0E07 ; [.2473.0020.0002.0E07][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER NGO NGU> 0E43 0E07 ; [.2473.0020.0002.0E07][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NGO NGU> 0E44 0E07 ; [.2473.0020.0002.0E07][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NGO NGU> 0E08 ; [.2474.0020.0002.0E08] # THAI CHARACTER CHO CHAN 0E40 0E08 ; [.2474.0020.0002.0E08][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHAN> 0E41 0E08 ; [.2474.0020.0002.0E08][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHAN> 0E42 0E08 ; [.2474.0020.0002.0E08][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHAN> 0E43 0E08 ; [.2474.0020.0002.0E08][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHAN> 0E44 0E08 ; [.2474.0020.0002.0E08][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHAN> 0E09 ; [.2475.0020.0002.0E09] # THAI CHARACTER CHO CHING 0E40 0E09 ; [.2475.0020.0002.0E09][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHING> 0E41 0E09 ; [.2475.0020.0002.0E09][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHING> 0E42 0E09 ; [.2475.0020.0002.0E09][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHING> 0E43 0E09 ; [.2475.0020.0002.0E09][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHING> 0E44 0E09 ; [.2475.0020.0002.0E09][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHING> 0E0A ; [.2476.0020.0002.0E0A] # THAI CHARACTER CHO CHANG 0E40 0E0A ; [.2476.0020.0002.0E0A][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHANG> 0E41 0E0A ; [.2476.0020.0002.0E0A][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHANG> 0E42 0E0A ; [.2476.0020.0002.0E0A][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHANG> 0E43 0E0A ; [.2476.0020.0002.0E0A][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHANG> 0E44 0E0A ; [.2476.0020.0002.0E0A][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHANG> 0E0B ; [.2477.0020.0002.0E0B] # THAI CHARACTER SO SO 0E40 0E0B ; [.2477.0020.0002.0E0B][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER SO SO> 0E41 0E0B ; [.2477.0020.0002.0E0B][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SO> 0E42 0E0B ; [.2477.0020.0002.0E0B][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER SO SO> 0E43 0E0B ; [.2477.0020.0002.0E0B][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SO> 0E44 0E0B ; [.2477.0020.0002.0E0B][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SO> 0E0C ; [.2478.0020.0002.0E0C] # THAI CHARACTER CHO CHOE 0E40 0E0C ; [.2478.0020.0002.0E0C][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHOE> 0E41 0E0C ; [.2478.0020.0002.0E0C][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHOE> 0E42 0E0C ; [.2478.0020.0002.0E0C][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHOE> 0E43 0E0C ; [.2478.0020.0002.0E0C][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHOE> 0E44 0E0C ; [.2478.0020.0002.0E0C][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHOE> 0E0D ; [.2479.0020.0002.0E0D] # THAI CHARACTER YO YING 0E40 0E0D ; [.2479.0020.0002.0E0D][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER YO YING> 0E41 0E0D ; [.2479.0020.0002.0E0D][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER YO YING> 0E42 0E0D ; [.2479.0020.0002.0E0D][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER YO YING> 0E43 0E0D ; [.2479.0020.0002.0E0D][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER YO YING> 0E44 0E0D ; [.2479.0020.0002.0E0D][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER YO YING> 0E0E ; [.247A.0020.0002.0E0E] # THAI CHARACTER DO CHADA 0E40 0E0E ; [.247A.0020.0002.0E0E][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER DO CHADA> 0E41 0E0E ; [.247A.0020.0002.0E0E][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER DO CHADA> 0E42 0E0E ; [.247A.0020.0002.0E0E][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER DO CHADA> 0E43 0E0E ; [.247A.0020.0002.0E0E][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER DO CHADA> 0E44 0E0E ; [.247A.0020.0002.0E0E][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER DO CHADA> 0E0F ; [.247B.0020.0002.0E0F] # THAI CHARACTER TO PATAK 0E40 0E0F ; [.247B.0020.0002.0E0F][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER TO PATAK> 0E41 0E0F ; [.247B.0020.0002.0E0F][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER TO PATAK> 0E42 0E0F ; [.247B.0020.0002.0E0F][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER TO PATAK> 0E43 0E0F ; [.247B.0020.0002.0E0F][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER TO PATAK> 0E44 0E0F ; [.247B.0020.0002.0E0F][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER TO PATAK> 0E10 ; [.247C.0020.0002.0E10] # THAI CHARACTER THO THAN 0E40 0E10 ; [.247C.0020.0002.0E10][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO THAN> 0E41 0E10 ; [.247C.0020.0002.0E10][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THAN> 0E42 0E10 ; [.247C.0020.0002.0E10][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO THAN> 0E43 0E10 ; [.247C.0020.0002.0E10][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THAN> 0E44 0E10 ; [.247C.0020.0002.0E10][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THAN> 0E11 ; [.247D.0020.0002.0E11] # THAI CHARACTER THO NANGMONTHO 0E40 0E11 ; [.247D.0020.0002.0E11][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO NANGMONTHO> 0E41 0E11 ; [.247D.0020.0002.0E11][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO NANGMONTHO> 0E42 0E11 ; [.247D.0020.0002.0E11][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO NANGMONTHO> 0E43 0E11 ; [.247D.0020.0002.0E11][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO NANGMONTHO> 0E44 0E11 ; [.247D.0020.0002.0E11][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO NANGMONTHO> 0E12 ; [.247E.0020.0002.0E12] # THAI CHARACTER THO PHUTHAO 0E40 0E12 ; [.247E.0020.0002.0E12][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO PHUTHAO> 0E41 0E12 ; [.247E.0020.0002.0E12][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO PHUTHAO> 0E42 0E12 ; [.247E.0020.0002.0E12][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO PHUTHAO> 0E43 0E12 ; [.247E.0020.0002.0E12][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO PHUTHAO> 0E44 0E12 ; [.247E.0020.0002.0E12][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO PHUTHAO> 0E13 ; [.247F.0020.0002.0E13] # THAI CHARACTER NO NEN 0E40 0E13 ; [.247F.0020.0002.0E13][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER NO NEN> 0E41 0E13 ; [.247F.0020.0002.0E13][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER NO NEN> 0E42 0E13 ; [.247F.0020.0002.0E13][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER NO NEN> 0E43 0E13 ; [.247F.0020.0002.0E13][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NO NEN> 0E44 0E13 ; [.247F.0020.0002.0E13][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NO NEN> 0E14 ; [.2480.0020.0002.0E14] # THAI CHARACTER DO DEK 0E40 0E14 ; [.2480.0020.0002.0E14][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER DO DEK> 0E41 0E14 ; [.2480.0020.0002.0E14][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER DO DEK> 0E42 0E14 ; [.2480.0020.0002.0E14][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER DO DEK> 0E43 0E14 ; [.2480.0020.0002.0E14][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER DO DEK> 0E44 0E14 ; [.2480.0020.0002.0E14][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER DO DEK> 0E15 ; [.2481.0020.0002.0E15] # THAI CHARACTER TO TAO 0E40 0E15 ; [.2481.0020.0002.0E15][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER TO TAO> 0E41 0E15 ; [.2481.0020.0002.0E15][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER TO TAO> 0E42 0E15 ; [.2481.0020.0002.0E15][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER TO TAO> 0E43 0E15 ; [.2481.0020.0002.0E15][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER TO TAO> 0E44 0E15 ; [.2481.0020.0002.0E15][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER TO TAO> 0E16 ; [.2482.0020.0002.0E16] # THAI CHARACTER THO THUNG 0E40 0E16 ; [.2482.0020.0002.0E16][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO THUNG> 0E41 0E16 ; [.2482.0020.0002.0E16][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THUNG> 0E42 0E16 ; [.2482.0020.0002.0E16][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO THUNG> 0E43 0E16 ; [.2482.0020.0002.0E16][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THUNG> 0E44 0E16 ; [.2482.0020.0002.0E16][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THUNG> 0E17 ; [.2483.0020.0002.0E17] # THAI CHARACTER THO THAHAN 0E40 0E17 ; [.2483.0020.0002.0E17][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO THAHAN> 0E41 0E17 ; [.2483.0020.0002.0E17][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THAHAN> 0E42 0E17 ; [.2483.0020.0002.0E17][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO THAHAN> 0E43 0E17 ; [.2483.0020.0002.0E17][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THAHAN> 0E44 0E17 ; [.2483.0020.0002.0E17][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THAHAN> 0E18 ; [.2484.0020.0002.0E18] # THAI CHARACTER THO THONG 0E40 0E18 ; [.2484.0020.0002.0E18][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO THONG> 0E41 0E18 ; [.2484.0020.0002.0E18][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THONG> 0E42 0E18 ; [.2484.0020.0002.0E18][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO THONG> 0E43 0E18 ; [.2484.0020.0002.0E18][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THONG> 0E44 0E18 ; [.2484.0020.0002.0E18][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THONG> 0E19 ; [.2485.0020.0002.0E19] # THAI CHARACTER NO NU 0E40 0E19 ; [.2485.0020.0002.0E19][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER NO NU> 0E41 0E19 ; [.2485.0020.0002.0E19][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER NO NU> 0E42 0E19 ; [.2485.0020.0002.0E19][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER NO NU> 0E43 0E19 ; [.2485.0020.0002.0E19][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NO NU> 0E44 0E19 ; [.2485.0020.0002.0E19][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NO NU> 0E1A ; [.2486.0020.0002.0E1A] # THAI CHARACTER BO BAIMAI 0E40 0E1A ; [.2486.0020.0002.0E1A][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER BO BAIMAI> 0E41 0E1A ; [.2486.0020.0002.0E1A][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER BO BAIMAI> 0E42 0E1A ; [.2486.0020.0002.0E1A][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER BO BAIMAI> 0E43 0E1A ; [.2486.0020.0002.0E1A][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER BO BAIMAI> 0E44 0E1A ; [.2486.0020.0002.0E1A][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER BO BAIMAI> 0E1B ; [.2487.0020.0002.0E1B] # THAI CHARACTER PO PLA 0E40 0E1B ; [.2487.0020.0002.0E1B][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER PO PLA> 0E41 0E1B ; [.2487.0020.0002.0E1B][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER PO PLA> 0E42 0E1B ; [.2487.0020.0002.0E1B][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER PO PLA> 0E43 0E1B ; [.2487.0020.0002.0E1B][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PO PLA> 0E44 0E1B ; [.2487.0020.0002.0E1B][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PO PLA> 0E1C ; [.2488.0020.0002.0E1C] # THAI CHARACTER PHO PHUNG 0E40 0E1C ; [.2488.0020.0002.0E1C][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER PHO PHUNG> 0E41 0E1C ; [.2488.0020.0002.0E1C][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO PHUNG> 0E42 0E1C ; [.2488.0020.0002.0E1C][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER PHO PHUNG> 0E43 0E1C ; [.2488.0020.0002.0E1C][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO PHUNG> 0E44 0E1C ; [.2488.0020.0002.0E1C][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO PHUNG> 0E1D ; [.2489.0020.0002.0E1D] # THAI CHARACTER FO FA 0E40 0E1D ; [.2489.0020.0002.0E1D][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER FO FA> 0E41 0E1D ; [.2489.0020.0002.0E1D][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER FO FA> 0E42 0E1D ; [.2489.0020.0002.0E1D][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER FO FA> 0E43 0E1D ; [.2489.0020.0002.0E1D][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER FO FA> 0E44 0E1D ; [.2489.0020.0002.0E1D][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER FO FA> 0E1E ; [.248A.0020.0002.0E1E] # THAI CHARACTER PHO PHAN 0E40 0E1E ; [.248A.0020.0002.0E1E][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER PHO PHAN> 0E41 0E1E ; [.248A.0020.0002.0E1E][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO PHAN> 0E42 0E1E ; [.248A.0020.0002.0E1E][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER PHO PHAN> 0E43 0E1E ; [.248A.0020.0002.0E1E][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO PHAN> 0E44 0E1E ; [.248A.0020.0002.0E1E][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO PHAN> 0E1F ; [.248B.0020.0002.0E1F] # THAI CHARACTER FO FAN 0E40 0E1F ; [.248B.0020.0002.0E1F][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER FO FAN> 0E41 0E1F ; [.248B.0020.0002.0E1F][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER FO FAN> 0E42 0E1F ; [.248B.0020.0002.0E1F][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER FO FAN> 0E43 0E1F ; [.248B.0020.0002.0E1F][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER FO FAN> 0E44 0E1F ; [.248B.0020.0002.0E1F][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER FO FAN> 0E20 ; [.248C.0020.0002.0E20] # THAI CHARACTER PHO SAMPHAO 0E40 0E20 ; [.248C.0020.0002.0E20][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER PHO SAMPHAO> 0E41 0E20 ; [.248C.0020.0002.0E20][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO SAMPHAO> 0E42 0E20 ; [.248C.0020.0002.0E20][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER PHO SAMPHAO> 0E43 0E20 ; [.248C.0020.0002.0E20][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO SAMPHAO> 0E44 0E20 ; [.248C.0020.0002.0E20][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO SAMPHAO> 0E21 ; [.248D.0020.0002.0E21] # THAI CHARACTER MO MA 0E40 0E21 ; [.248D.0020.0002.0E21][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER MO MA> 0E41 0E21 ; [.248D.0020.0002.0E21][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER MO MA> 0E42 0E21 ; [.248D.0020.0002.0E21][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER MO MA> 0E43 0E21 ; [.248D.0020.0002.0E21][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER MO MA> 0E44 0E21 ; [.248D.0020.0002.0E21][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER MO MA> 0E22 ; [.248E.0020.0002.0E22] # THAI CHARACTER YO YAK 0E40 0E22 ; [.248E.0020.0002.0E22][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER YO YAK> 0E41 0E22 ; [.248E.0020.0002.0E22][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER YO YAK> 0E42 0E22 ; [.248E.0020.0002.0E22][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER YO YAK> 0E43 0E22 ; [.248E.0020.0002.0E22][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER YO YAK> 0E44 0E22 ; [.248E.0020.0002.0E22][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER YO YAK> 0E23 ; [.248F.0020.0002.0E23] # THAI CHARACTER RO RUA 0E40 0E23 ; [.248F.0020.0002.0E23][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER RO RUA> 0E41 0E23 ; [.248F.0020.0002.0E23][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER RO RUA> 0E42 0E23 ; [.248F.0020.0002.0E23][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER RO RUA> 0E43 0E23 ; [.248F.0020.0002.0E23][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER RO RUA> 0E44 0E23 ; [.248F.0020.0002.0E23][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER RO RUA> 0E24 ; [.2490.0020.0002.0E24] # THAI CHARACTER RU 0E40 0E24 ; [.2490.0020.0002.0E24][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER RU> 0E41 0E24 ; [.2490.0020.0002.0E24][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER RU> 0E42 0E24 ; [.2490.0020.0002.0E24][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER RU> 0E43 0E24 ; [.2490.0020.0002.0E24][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER RU> 0E44 0E24 ; [.2490.0020.0002.0E24][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER RU> 0E25 ; [.2491.0020.0002.0E25] # THAI CHARACTER LO LING 0E40 0E25 ; [.2491.0020.0002.0E25][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER LO LING> 0E41 0E25 ; [.2491.0020.0002.0E25][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER LO LING> 0E42 0E25 ; [.2491.0020.0002.0E25][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER LO LING> 0E43 0E25 ; [.2491.0020.0002.0E25][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LO LING> 0E44 0E25 ; [.2491.0020.0002.0E25][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LO LING> 0E26 ; [.2492.0020.0002.0E26] # THAI CHARACTER LU 0E40 0E26 ; [.2492.0020.0002.0E26][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER LU> 0E41 0E26 ; [.2492.0020.0002.0E26][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER LU> 0E42 0E26 ; [.2492.0020.0002.0E26][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER LU> 0E43 0E26 ; [.2492.0020.0002.0E26][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LU> 0E44 0E26 ; [.2492.0020.0002.0E26][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LU> 0E27 ; [.2493.0020.0002.0E27] # THAI CHARACTER WO WAEN 0E40 0E27 ; [.2493.0020.0002.0E27][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER WO WAEN> 0E41 0E27 ; [.2493.0020.0002.0E27][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER WO WAEN> 0E42 0E27 ; [.2493.0020.0002.0E27][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER WO WAEN> 0E43 0E27 ; [.2493.0020.0002.0E27][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER WO WAEN> 0E44 0E27 ; [.2493.0020.0002.0E27][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER WO WAEN> 0E28 ; [.2494.0020.0002.0E28] # THAI CHARACTER SO SALA 0E40 0E28 ; [.2494.0020.0002.0E28][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER SO SALA> 0E41 0E28 ; [.2494.0020.0002.0E28][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SALA> 0E42 0E28 ; [.2494.0020.0002.0E28][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER SO SALA> 0E43 0E28 ; [.2494.0020.0002.0E28][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SALA> 0E44 0E28 ; [.2494.0020.0002.0E28][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SALA> 0E29 ; [.2495.0020.0002.0E29] # THAI CHARACTER SO RUSI 0E40 0E29 ; [.2495.0020.0002.0E29][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER SO RUSI> 0E41 0E29 ; [.2495.0020.0002.0E29][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER SO RUSI> 0E42 0E29 ; [.2495.0020.0002.0E29][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER SO RUSI> 0E43 0E29 ; [.2495.0020.0002.0E29][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO RUSI> 0E44 0E29 ; [.2495.0020.0002.0E29][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO RUSI> 0E2A ; [.2496.0020.0002.0E2A] # THAI CHARACTER SO SUA 0E40 0E2A ; [.2496.0020.0002.0E2A][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER SO SUA> 0E41 0E2A ; [.2496.0020.0002.0E2A][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SUA> 0E42 0E2A ; [.2496.0020.0002.0E2A][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER SO SUA> 0E43 0E2A ; [.2496.0020.0002.0E2A][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SUA> 0E44 0E2A ; [.2496.0020.0002.0E2A][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SUA> 0E2B ; [.2497.0020.0002.0E2B] # THAI CHARACTER HO HIP 0E40 0E2B ; [.2497.0020.0002.0E2B][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER HO HIP> 0E41 0E2B ; [.2497.0020.0002.0E2B][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER HO HIP> 0E42 0E2B ; [.2497.0020.0002.0E2B][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER HO HIP> 0E43 0E2B ; [.2497.0020.0002.0E2B][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER HO HIP> 0E44 0E2B ; [.2497.0020.0002.0E2B][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER HO HIP> 0E2C ; [.2498.0020.0002.0E2C] # THAI CHARACTER LO CHULA 0E40 0E2C ; [.2498.0020.0002.0E2C][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER LO CHULA> 0E41 0E2C ; [.2498.0020.0002.0E2C][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER LO CHULA> 0E42 0E2C ; [.2498.0020.0002.0E2C][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER LO CHULA> 0E43 0E2C ; [.2498.0020.0002.0E2C][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LO CHULA> 0E44 0E2C ; [.2498.0020.0002.0E2C][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LO CHULA> 0E2D ; [.2499.0020.0002.0E2D] # THAI CHARACTER O ANG 0E40 0E2D ; [.2499.0020.0002.0E2D][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER O ANG> 0E41 0E2D ; [.2499.0020.0002.0E2D][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER O ANG> 0E42 0E2D ; [.2499.0020.0002.0E2D][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER O ANG> 0E43 0E2D ; [.2499.0020.0002.0E2D][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER O ANG> 0E44 0E2D ; [.2499.0020.0002.0E2D][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER O ANG> 0E2E ; [.249A.0020.0002.0E2E] # THAI CHARACTER HO NOKHUK 0E40 0E2E ; [.249A.0020.0002.0E2E][.24A7.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER HO NOKHUK> 0E41 0E2E ; [.249A.0020.0002.0E2E][.24A8.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER HO NOKHUK> 0E42 0E2E ; [.249A.0020.0002.0E2E][.24A9.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER HO NOKHUK> 0E43 0E2E ; [.249A.0020.0002.0E2E][.24AA.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER HO NOKHUK> 0E44 0E2E ; [.249A.0020.0002.0E2E][.24AB.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER HO NOKHUK> 0E2F ; [.249B.0020.0002.0E2F] # THAI CHARACTER PAIYANNOI 0E30 ; [.249C.0020.0002.0E30] # THAI CHARACTER SARA A 0E31 ; [.249D.0020.0002.0E31] # THAI CHARACTER MAI HAN-AKAT 0E32 ; [.249E.0020.0002.0E32] # THAI CHARACTER SARA AA 0E33 ; [.249F.0020.0002.0E33] # THAI CHARACTER SARA AM 0E4D 0E32 ; [.249F.0020.0002.0E33] # THAI CHARACTER SARA AM 0E34 ; [.24A0.0020.0002.0E34] # THAI CHARACTER SARA I 0E35 ; [.24A1.0020.0002.0E35] # THAI CHARACTER SARA II 0E36 ; [.24A2.0020.0002.0E36] # THAI CHARACTER SARA UE 0E37 ; [.24A3.0020.0002.0E37] # THAI CHARACTER SARA UEE 0E38 ; [.24A4.0020.0002.0E38] # THAI CHARACTER SARA U 0E39 ; [.24A5.0020.0002.0E39] # THAI CHARACTER SARA UU 0E3A ; [.24A6.0020.0002.0E3A] # THAI CHARACTER PHINTHU 0E40 ; [.24A7.0020.0002.0E40] # THAI CHARACTER SARA E 0E41 ; [.24A8.0020.0002.0E41] # THAI CHARACTER SARA AE 0E42 ; [.24A9.0020.0002.0E42] # THAI CHARACTER SARA O 0E43 ; [.24AA.0020.0002.0E43] # THAI CHARACTER SARA AI MAIMUAN 0E44 ; [.24AB.0020.0002.0E44] # THAI CHARACTER SARA AI MAIMALAI 0E45 ; [.24AC.0020.0002.0E45] # THAI CHARACTER LAKKHANGYAO 0EDE ; [.24AD.0020.0002.0EDE] # LAO LETTER KHMU GO 0E81 ; [.24AE.0020.0002.0E81] # LAO LETTER KO 0EC0 0E81 ; [.24AE.0020.0002.0E81][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER KO> 0EC1 0E81 ; [.24AE.0020.0002.0E81][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER KO> 0EC2 0E81 ; [.24AE.0020.0002.0E81][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER KO> 0EC3 0E81 ; [.24AE.0020.0002.0E81][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER KO> 0EC4 0E81 ; [.24AE.0020.0002.0E81][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER KO> 0E82 ; [.24AF.0020.0002.0E82] # LAO LETTER KHO SUNG 0EC0 0E82 ; [.24AF.0020.0002.0E82][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER KHO SUNG> 0EC1 0E82 ; [.24AF.0020.0002.0E82][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER KHO SUNG> 0EC2 0E82 ; [.24AF.0020.0002.0E82][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER KHO SUNG> 0EC3 0E82 ; [.24AF.0020.0002.0E82][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER KHO SUNG> 0EC4 0E82 ; [.24AF.0020.0002.0E82][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER KHO SUNG> 0E84 ; [.24B0.0020.0002.0E84] # LAO LETTER KHO TAM 0EC0 0E84 ; [.24B0.0020.0002.0E84][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER KHO TAM> 0EC1 0E84 ; [.24B0.0020.0002.0E84][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER KHO TAM> 0EC2 0E84 ; [.24B0.0020.0002.0E84][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER KHO TAM> 0EC3 0E84 ; [.24B0.0020.0002.0E84][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER KHO TAM> 0EC4 0E84 ; [.24B0.0020.0002.0E84][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER KHO TAM> 0E87 ; [.24B1.0020.0002.0E87] # LAO LETTER NGO 0EC0 0E87 ; [.24B1.0020.0002.0E87][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER NGO> 0EC1 0E87 ; [.24B1.0020.0002.0E87][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER NGO> 0EC2 0E87 ; [.24B1.0020.0002.0E87][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER NGO> 0EC3 0E87 ; [.24B1.0020.0002.0E87][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER NGO> 0EC4 0E87 ; [.24B1.0020.0002.0E87][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER NGO> 0E88 ; [.24B2.0020.0002.0E88] # LAO LETTER CO 0EC0 0E88 ; [.24B2.0020.0002.0E88][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER CO> 0EC1 0E88 ; [.24B2.0020.0002.0E88][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER CO> 0EC2 0E88 ; [.24B2.0020.0002.0E88][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER CO> 0EC3 0E88 ; [.24B2.0020.0002.0E88][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER CO> 0EC4 0E88 ; [.24B2.0020.0002.0E88][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER CO> 0EAA ; [.24B3.0020.0002.0EAA] # LAO LETTER SO SUNG 0EC0 0EAA ; [.24B3.0020.0002.0EAA][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER SO SUNG> 0EC1 0EAA ; [.24B3.0020.0002.0EAA][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER SO SUNG> 0EC2 0EAA ; [.24B3.0020.0002.0EAA][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER SO SUNG> 0EC3 0EAA ; [.24B3.0020.0002.0EAA][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER SO SUNG> 0EC4 0EAA ; [.24B3.0020.0002.0EAA][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER SO SUNG> 0E8A ; [.24B4.0020.0002.0E8A] # LAO LETTER SO TAM 0EC0 0E8A ; [.24B4.0020.0002.0E8A][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER SO TAM> 0EC1 0E8A ; [.24B4.0020.0002.0E8A][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER SO TAM> 0EC2 0E8A ; [.24B4.0020.0002.0E8A][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER SO TAM> 0EC3 0E8A ; [.24B4.0020.0002.0E8A][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER SO TAM> 0EC4 0E8A ; [.24B4.0020.0002.0E8A][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER SO TAM> 0EDF ; [.24B5.0020.0002.0EDF] # LAO LETTER KHMU NYO 0E8D ; [.24B6.0020.0002.0E8D] # LAO LETTER NYO 0EC0 0E8D ; [.24B6.0020.0002.0E8D][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER NYO> 0EC1 0E8D ; [.24B6.0020.0002.0E8D][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER NYO> 0EC2 0E8D ; [.24B6.0020.0002.0E8D][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER NYO> 0EC3 0E8D ; [.24B6.0020.0002.0E8D][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER NYO> 0EC4 0E8D ; [.24B6.0020.0002.0E8D][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER NYO> 0E94 ; [.24B7.0020.0002.0E94] # LAO LETTER DO 0EC0 0E94 ; [.24B7.0020.0002.0E94][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER DO> 0EC1 0E94 ; [.24B7.0020.0002.0E94][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER DO> 0EC2 0E94 ; [.24B7.0020.0002.0E94][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER DO> 0EC3 0E94 ; [.24B7.0020.0002.0E94][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER DO> 0EC4 0E94 ; [.24B7.0020.0002.0E94][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER DO> 0E95 ; [.24B8.0020.0002.0E95] # LAO LETTER TO 0EC0 0E95 ; [.24B8.0020.0002.0E95][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER TO> 0EC1 0E95 ; [.24B8.0020.0002.0E95][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER TO> 0EC2 0E95 ; [.24B8.0020.0002.0E95][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER TO> 0EC3 0E95 ; [.24B8.0020.0002.0E95][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER TO> 0EC4 0E95 ; [.24B8.0020.0002.0E95][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER TO> 0E96 ; [.24B9.0020.0002.0E96] # LAO LETTER THO SUNG 0EC0 0E96 ; [.24B9.0020.0002.0E96][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER THO SUNG> 0EC1 0E96 ; [.24B9.0020.0002.0E96][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER THO SUNG> 0EC2 0E96 ; [.24B9.0020.0002.0E96][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER THO SUNG> 0EC3 0E96 ; [.24B9.0020.0002.0E96][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER THO SUNG> 0EC4 0E96 ; [.24B9.0020.0002.0E96][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER THO SUNG> 0E97 ; [.24BA.0020.0002.0E97] # LAO LETTER THO TAM 0EC0 0E97 ; [.24BA.0020.0002.0E97][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER THO TAM> 0EC1 0E97 ; [.24BA.0020.0002.0E97][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER THO TAM> 0EC2 0E97 ; [.24BA.0020.0002.0E97][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER THO TAM> 0EC3 0E97 ; [.24BA.0020.0002.0E97][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER THO TAM> 0EC4 0E97 ; [.24BA.0020.0002.0E97][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER THO TAM> 0E99 ; [.24BB.0020.0002.0E99] # LAO LETTER NO 0EC0 0E99 ; [.24BB.0020.0002.0E99][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER NO> 0EC1 0E99 ; [.24BB.0020.0002.0E99][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER NO> 0EC2 0E99 ; [.24BB.0020.0002.0E99][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER NO> 0EC3 0E99 ; [.24BB.0020.0002.0E99][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER NO> 0EC4 0E99 ; [.24BB.0020.0002.0E99][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER NO> 0E9A ; [.24BC.0020.0002.0E9A] # LAO LETTER BO 0EC0 0E9A ; [.24BC.0020.0002.0E9A][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER BO> 0EC1 0E9A ; [.24BC.0020.0002.0E9A][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER BO> 0EC2 0E9A ; [.24BC.0020.0002.0E9A][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER BO> 0EC3 0E9A ; [.24BC.0020.0002.0E9A][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER BO> 0EC4 0E9A ; [.24BC.0020.0002.0E9A][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER BO> 0E9B ; [.24BD.0020.0002.0E9B] # LAO LETTER PO 0EC0 0E9B ; [.24BD.0020.0002.0E9B][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER PO> 0EC1 0E9B ; [.24BD.0020.0002.0E9B][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER PO> 0EC2 0E9B ; [.24BD.0020.0002.0E9B][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER PO> 0EC3 0E9B ; [.24BD.0020.0002.0E9B][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER PO> 0EC4 0E9B ; [.24BD.0020.0002.0E9B][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER PO> 0E9C ; [.24BE.0020.0002.0E9C] # LAO LETTER PHO SUNG 0EC0 0E9C ; [.24BE.0020.0002.0E9C][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER PHO SUNG> 0EC1 0E9C ; [.24BE.0020.0002.0E9C][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER PHO SUNG> 0EC2 0E9C ; [.24BE.0020.0002.0E9C][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER PHO SUNG> 0EC3 0E9C ; [.24BE.0020.0002.0E9C][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER PHO SUNG> 0EC4 0E9C ; [.24BE.0020.0002.0E9C][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER PHO SUNG> 0E9D ; [.24BF.0020.0002.0E9D] # LAO LETTER FO TAM 0EC0 0E9D ; [.24BF.0020.0002.0E9D][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER FO TAM> 0EC1 0E9D ; [.24BF.0020.0002.0E9D][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER FO TAM> 0EC2 0E9D ; [.24BF.0020.0002.0E9D][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER FO TAM> 0EC3 0E9D ; [.24BF.0020.0002.0E9D][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER FO TAM> 0EC4 0E9D ; [.24BF.0020.0002.0E9D][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER FO TAM> 0E9E ; [.24C0.0020.0002.0E9E] # LAO LETTER PHO TAM 0EC0 0E9E ; [.24C0.0020.0002.0E9E][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER PHO TAM> 0EC1 0E9E ; [.24C0.0020.0002.0E9E][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER PHO TAM> 0EC2 0E9E ; [.24C0.0020.0002.0E9E][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER PHO TAM> 0EC3 0E9E ; [.24C0.0020.0002.0E9E][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER PHO TAM> 0EC4 0E9E ; [.24C0.0020.0002.0E9E][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER PHO TAM> 0E9F ; [.24C1.0020.0002.0E9F] # LAO LETTER FO SUNG 0EC0 0E9F ; [.24C1.0020.0002.0E9F][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER FO SUNG> 0EC1 0E9F ; [.24C1.0020.0002.0E9F][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER FO SUNG> 0EC2 0E9F ; [.24C1.0020.0002.0E9F][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER FO SUNG> 0EC3 0E9F ; [.24C1.0020.0002.0E9F][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER FO SUNG> 0EC4 0E9F ; [.24C1.0020.0002.0E9F][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER FO SUNG> 0EA1 ; [.24C2.0020.0002.0EA1] # LAO LETTER MO 0EC0 0EA1 ; [.24C2.0020.0002.0EA1][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER MO> 0EC1 0EA1 ; [.24C2.0020.0002.0EA1][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER MO> 0EC2 0EA1 ; [.24C2.0020.0002.0EA1][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER MO> 0EC3 0EA1 ; [.24C2.0020.0002.0EA1][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER MO> 0EC4 0EA1 ; [.24C2.0020.0002.0EA1][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER MO> 0EA2 ; [.24C3.0020.0002.0EA2] # LAO LETTER YO 0EC0 0EA2 ; [.24C3.0020.0002.0EA2][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER YO> 0EC1 0EA2 ; [.24C3.0020.0002.0EA2][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER YO> 0EC2 0EA2 ; [.24C3.0020.0002.0EA2][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER YO> 0EC3 0EA2 ; [.24C3.0020.0002.0EA2][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER YO> 0EC4 0EA2 ; [.24C3.0020.0002.0EA2][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER YO> 0EA3 ; [.24C4.0020.0002.0EA3] # LAO LETTER LO LING 0EC0 0EA3 ; [.24C4.0020.0002.0EA3][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER LO LING> 0EC1 0EA3 ; [.24C4.0020.0002.0EA3][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER LO LING> 0EC2 0EA3 ; [.24C4.0020.0002.0EA3][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER LO LING> 0EC3 0EA3 ; [.24C4.0020.0002.0EA3][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER LO LING> 0EC4 0EA3 ; [.24C4.0020.0002.0EA3][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER LO LING> 0EA5 ; [.24C5.0020.0002.0EA5] # LAO LETTER LO LOOT 0EC0 0EA5 ; [.24C5.0020.0002.0EA5][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER LO LOOT> 0EC1 0EA5 ; [.24C5.0020.0002.0EA5][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER LO LOOT> 0EC2 0EA5 ; [.24C5.0020.0002.0EA5][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER LO LOOT> 0EC3 0EA5 ; [.24C5.0020.0002.0EA5][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER LO LOOT> 0EC4 0EA5 ; [.24C5.0020.0002.0EA5][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER LO LOOT> 0EA7 ; [.24C6.0020.0002.0EA7] # LAO LETTER WO 0EC0 0EA7 ; [.24C6.0020.0002.0EA7][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER WO> 0EC1 0EA7 ; [.24C6.0020.0002.0EA7][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER WO> 0EC2 0EA7 ; [.24C6.0020.0002.0EA7][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER WO> 0EC3 0EA7 ; [.24C6.0020.0002.0EA7][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER WO> 0EC4 0EA7 ; [.24C6.0020.0002.0EA7][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER WO> 0EAB ; [.24C7.0020.0002.0EAB] # LAO LETTER HO SUNG 0EDC ; [.24C7.0020.0004.0EDC][.24BB.0020.0004.0EDC] # LAO HO NO 0EC0 0EDC ; [.24C7.0020.0004.0EDC][.24BB.0020.0004.0EDC][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO HO NO> 0EC1 0EDC ; [.24C7.0020.0004.0EDC][.24BB.0020.0004.0EDC][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO HO NO> 0EC2 0EDC ; [.24C7.0020.0004.0EDC][.24BB.0020.0004.0EDC][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO HO NO> 0EC3 0EDC ; [.24C7.0020.0004.0EDC][.24BB.0020.0004.0EDC][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO HO NO> 0EC4 0EDC ; [.24C7.0020.0004.0EDC][.24BB.0020.0004.0EDC][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO HO NO> 0EDD ; [.24C7.0020.0004.0EDD][.24C2.0020.0004.0EDD] # LAO HO MO 0EC0 0EDD ; [.24C7.0020.0004.0EDD][.24C2.0020.0004.0EDD][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO HO MO> 0EC1 0EDD ; [.24C7.0020.0004.0EDD][.24C2.0020.0004.0EDD][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO HO MO> 0EC2 0EDD ; [.24C7.0020.0004.0EDD][.24C2.0020.0004.0EDD][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO HO MO> 0EC3 0EDD ; [.24C7.0020.0004.0EDD][.24C2.0020.0004.0EDD][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO HO MO> 0EC4 0EDD ; [.24C7.0020.0004.0EDD][.24C2.0020.0004.0EDD][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO HO MO> 0EC0 0EAB ; [.24C7.0020.0002.0EAB][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER HO SUNG> 0EC1 0EAB ; [.24C7.0020.0002.0EAB][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER HO SUNG> 0EC2 0EAB ; [.24C7.0020.0002.0EAB][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER HO SUNG> 0EC3 0EAB ; [.24C7.0020.0002.0EAB][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER HO SUNG> 0EC4 0EAB ; [.24C7.0020.0002.0EAB][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER HO SUNG> 0EAD ; [.24C8.0020.0002.0EAD] # LAO LETTER O 0EC0 0EAD ; [.24C8.0020.0002.0EAD][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER O> 0EC1 0EAD ; [.24C8.0020.0002.0EAD][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER O> 0EC2 0EAD ; [.24C8.0020.0002.0EAD][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER O> 0EC3 0EAD ; [.24C8.0020.0002.0EAD][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER O> 0EC4 0EAD ; [.24C8.0020.0002.0EAD][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER O> 0EAE ; [.24C9.0020.0002.0EAE] # LAO LETTER HO TAM 0EC0 0EAE ; [.24C9.0020.0002.0EAE][.24D8.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER HO TAM> 0EC1 0EAE ; [.24C9.0020.0002.0EAE][.24D9.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER HO TAM> 0EC2 0EAE ; [.24C9.0020.0002.0EAE][.24DA.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER HO TAM> 0EC3 0EAE ; [.24C9.0020.0002.0EAE][.24DB.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER HO TAM> 0EC4 0EAE ; [.24C9.0020.0002.0EAE][.24DC.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER HO TAM> 0EAF ; [.24CA.0020.0002.0EAF] # LAO ELLIPSIS 0EB0 ; [.24CB.0020.0002.0EB0] # LAO VOWEL SIGN A 0EB1 ; [.24CC.0020.0002.0EB1] # LAO VOWEL SIGN MAI KAN 0EB2 ; [.24CD.0020.0002.0EB2] # LAO VOWEL SIGN AA 0EB3 ; [.24CE.0020.0002.0EB3] # LAO VOWEL SIGN AM 0ECD 0EB2 ; [.24CE.0020.0002.0EB3] # LAO VOWEL SIGN AM 0EB4 ; [.24CF.0020.0002.0EB4] # LAO VOWEL SIGN I 0EB5 ; [.24D0.0020.0002.0EB5] # LAO VOWEL SIGN II 0EB6 ; [.24D1.0020.0002.0EB6] # LAO VOWEL SIGN Y 0EB7 ; [.24D2.0020.0002.0EB7] # LAO VOWEL SIGN YY 0EB8 ; [.24D3.0020.0002.0EB8] # LAO VOWEL SIGN U 0EB9 ; [.24D4.0020.0002.0EB9] # LAO VOWEL SIGN UU 0EBB ; [.24D5.0020.0002.0EBB] # LAO VOWEL SIGN MAI KON 0EBC ; [.24D6.0020.0002.0EBC] # LAO SEMIVOWEL SIGN LO 0EBD ; [.24D7.0020.0002.0EBD] # LAO SEMIVOWEL SIGN NYO 0EC0 ; [.24D8.0020.0002.0EC0] # LAO VOWEL SIGN E 0EC1 ; [.24D9.0020.0002.0EC1] # LAO VOWEL SIGN EI 0EC2 ; [.24DA.0020.0002.0EC2] # LAO VOWEL SIGN O 0EC3 ; [.24DB.0020.0002.0EC3] # LAO VOWEL SIGN AY 0EC4 ; [.24DC.0020.0002.0EC4] # LAO VOWEL SIGN AI AA80 ; [.24DD.0020.0002.AA80] # TAI VIET LETTER LOW KO AAB5 AA80 ; [.24DD.0020.0002.AA80][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KO> AAB6 AA80 ; [.24DD.0020.0002.AA80][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KO> AAB9 AA80 ; [.24DD.0020.0002.AA80][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KO> AABB AA80 ; [.24DD.0020.0002.AA80][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KO> AABC AA80 ; [.24DD.0020.0002.AA80][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KO> AA81 ; [.24DE.0020.0002.AA81] # TAI VIET LETTER HIGH KO AAB5 AA81 ; [.24DE.0020.0002.AA81][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KO> AAB6 AA81 ; [.24DE.0020.0002.AA81][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KO> AAB9 AA81 ; [.24DE.0020.0002.AA81][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KO> AABB AA81 ; [.24DE.0020.0002.AA81][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KO> AABC AA81 ; [.24DE.0020.0002.AA81][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KO> AA82 ; [.24DF.0020.0002.AA82] # TAI VIET LETTER LOW KHO AAB5 AA82 ; [.24DF.0020.0002.AA82][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KHO> AAB6 AA82 ; [.24DF.0020.0002.AA82][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KHO> AAB9 AA82 ; [.24DF.0020.0002.AA82][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KHO> AABB AA82 ; [.24DF.0020.0002.AA82][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KHO> AABC AA82 ; [.24DF.0020.0002.AA82][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KHO> AA83 ; [.24E0.0020.0002.AA83] # TAI VIET LETTER HIGH KHO AAB5 AA83 ; [.24E0.0020.0002.AA83][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KHO> AAB6 AA83 ; [.24E0.0020.0002.AA83][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KHO> AAB9 AA83 ; [.24E0.0020.0002.AA83][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KHO> AABB AA83 ; [.24E0.0020.0002.AA83][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KHO> AABC AA83 ; [.24E0.0020.0002.AA83][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KHO> AA84 ; [.24E1.0020.0002.AA84] # TAI VIET LETTER LOW KHHO AAB5 AA84 ; [.24E1.0020.0002.AA84][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KHHO> AAB6 AA84 ; [.24E1.0020.0002.AA84][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KHHO> AAB9 AA84 ; [.24E1.0020.0002.AA84][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KHHO> AABB AA84 ; [.24E1.0020.0002.AA84][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KHHO> AABC AA84 ; [.24E1.0020.0002.AA84][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KHHO> AA85 ; [.24E2.0020.0002.AA85] # TAI VIET LETTER HIGH KHHO AAB5 AA85 ; [.24E2.0020.0002.AA85][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KHHO> AAB6 AA85 ; [.24E2.0020.0002.AA85][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KHHO> AAB9 AA85 ; [.24E2.0020.0002.AA85][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KHHO> AABB AA85 ; [.24E2.0020.0002.AA85][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KHHO> AABC AA85 ; [.24E2.0020.0002.AA85][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KHHO> AA86 ; [.24E3.0020.0002.AA86] # TAI VIET LETTER LOW GO AAB5 AA86 ; [.24E3.0020.0002.AA86][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW GO> AAB6 AA86 ; [.24E3.0020.0002.AA86][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW GO> AAB9 AA86 ; [.24E3.0020.0002.AA86][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW GO> AABB AA86 ; [.24E3.0020.0002.AA86][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW GO> AABC AA86 ; [.24E3.0020.0002.AA86][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW GO> AA87 ; [.24E4.0020.0002.AA87] # TAI VIET LETTER HIGH GO AAB5 AA87 ; [.24E4.0020.0002.AA87][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH GO> AAB6 AA87 ; [.24E4.0020.0002.AA87][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH GO> AAB9 AA87 ; [.24E4.0020.0002.AA87][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH GO> AABB AA87 ; [.24E4.0020.0002.AA87][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH GO> AABC AA87 ; [.24E4.0020.0002.AA87][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH GO> AA88 ; [.24E5.0020.0002.AA88] # TAI VIET LETTER LOW NGO AAB5 AA88 ; [.24E5.0020.0002.AA88][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NGO> AAB6 AA88 ; [.24E5.0020.0002.AA88][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NGO> AAB9 AA88 ; [.24E5.0020.0002.AA88][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NGO> AABB AA88 ; [.24E5.0020.0002.AA88][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NGO> AABC AA88 ; [.24E5.0020.0002.AA88][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NGO> AA89 ; [.24E6.0020.0002.AA89] # TAI VIET LETTER HIGH NGO AAB5 AA89 ; [.24E6.0020.0002.AA89][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NGO> AAB6 AA89 ; [.24E6.0020.0002.AA89][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NGO> AAB9 AA89 ; [.24E6.0020.0002.AA89][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NGO> AABB AA89 ; [.24E6.0020.0002.AA89][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NGO> AABC AA89 ; [.24E6.0020.0002.AA89][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NGO> AA8A ; [.24E7.0020.0002.AA8A] # TAI VIET LETTER LOW CO AAB5 AA8A ; [.24E7.0020.0002.AA8A][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW CO> AAB6 AA8A ; [.24E7.0020.0002.AA8A][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW CO> AAB9 AA8A ; [.24E7.0020.0002.AA8A][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW CO> AABB AA8A ; [.24E7.0020.0002.AA8A][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW CO> AABC AA8A ; [.24E7.0020.0002.AA8A][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW CO> AA8B ; [.24E8.0020.0002.AA8B] # TAI VIET LETTER HIGH CO AAB5 AA8B ; [.24E8.0020.0002.AA8B][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH CO> AAB6 AA8B ; [.24E8.0020.0002.AA8B][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH CO> AAB9 AA8B ; [.24E8.0020.0002.AA8B][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH CO> AABB AA8B ; [.24E8.0020.0002.AA8B][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH CO> AABC AA8B ; [.24E8.0020.0002.AA8B][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH CO> AA8C ; [.24E9.0020.0002.AA8C] # TAI VIET LETTER LOW CHO AAB5 AA8C ; [.24E9.0020.0002.AA8C][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW CHO> AAB6 AA8C ; [.24E9.0020.0002.AA8C][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW CHO> AAB9 AA8C ; [.24E9.0020.0002.AA8C][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW CHO> AABB AA8C ; [.24E9.0020.0002.AA8C][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW CHO> AABC AA8C ; [.24E9.0020.0002.AA8C][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW CHO> AA8D ; [.24EA.0020.0002.AA8D] # TAI VIET LETTER HIGH CHO AAB5 AA8D ; [.24EA.0020.0002.AA8D][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH CHO> AAB6 AA8D ; [.24EA.0020.0002.AA8D][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH CHO> AAB9 AA8D ; [.24EA.0020.0002.AA8D][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH CHO> AABB AA8D ; [.24EA.0020.0002.AA8D][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH CHO> AABC AA8D ; [.24EA.0020.0002.AA8D][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH CHO> AA8E ; [.24EB.0020.0002.AA8E] # TAI VIET LETTER LOW SO AAB5 AA8E ; [.24EB.0020.0002.AA8E][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW SO> AAB6 AA8E ; [.24EB.0020.0002.AA8E][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW SO> AAB9 AA8E ; [.24EB.0020.0002.AA8E][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW SO> AABB AA8E ; [.24EB.0020.0002.AA8E][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW SO> AABC AA8E ; [.24EB.0020.0002.AA8E][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW SO> AA8F ; [.24EC.0020.0002.AA8F] # TAI VIET LETTER HIGH SO AAB5 AA8F ; [.24EC.0020.0002.AA8F][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH SO> AAB6 AA8F ; [.24EC.0020.0002.AA8F][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH SO> AAB9 AA8F ; [.24EC.0020.0002.AA8F][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH SO> AABB AA8F ; [.24EC.0020.0002.AA8F][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH SO> AABC AA8F ; [.24EC.0020.0002.AA8F][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH SO> AA90 ; [.24ED.0020.0002.AA90] # TAI VIET LETTER LOW NYO AAB5 AA90 ; [.24ED.0020.0002.AA90][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NYO> AAB6 AA90 ; [.24ED.0020.0002.AA90][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NYO> AAB9 AA90 ; [.24ED.0020.0002.AA90][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NYO> AABB AA90 ; [.24ED.0020.0002.AA90][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NYO> AABC AA90 ; [.24ED.0020.0002.AA90][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NYO> AA91 ; [.24EE.0020.0002.AA91] # TAI VIET LETTER HIGH NYO AAB5 AA91 ; [.24EE.0020.0002.AA91][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NYO> AAB6 AA91 ; [.24EE.0020.0002.AA91][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NYO> AAB9 AA91 ; [.24EE.0020.0002.AA91][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NYO> AABB AA91 ; [.24EE.0020.0002.AA91][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NYO> AABC AA91 ; [.24EE.0020.0002.AA91][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NYO> AA92 ; [.24EF.0020.0002.AA92] # TAI VIET LETTER LOW DO AAB5 AA92 ; [.24EF.0020.0002.AA92][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW DO> AAB6 AA92 ; [.24EF.0020.0002.AA92][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW DO> AAB9 AA92 ; [.24EF.0020.0002.AA92][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW DO> AABB AA92 ; [.24EF.0020.0002.AA92][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW DO> AABC AA92 ; [.24EF.0020.0002.AA92][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW DO> AA93 ; [.24F0.0020.0002.AA93] # TAI VIET LETTER HIGH DO AAB5 AA93 ; [.24F0.0020.0002.AA93][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH DO> AAB6 AA93 ; [.24F0.0020.0002.AA93][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH DO> AAB9 AA93 ; [.24F0.0020.0002.AA93][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH DO> AABB AA93 ; [.24F0.0020.0002.AA93][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH DO> AABC AA93 ; [.24F0.0020.0002.AA93][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH DO> AA94 ; [.24F1.0020.0002.AA94] # TAI VIET LETTER LOW TO AAB5 AA94 ; [.24F1.0020.0002.AA94][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW TO> AAB6 AA94 ; [.24F1.0020.0002.AA94][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW TO> AAB9 AA94 ; [.24F1.0020.0002.AA94][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW TO> AABB AA94 ; [.24F1.0020.0002.AA94][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW TO> AABC AA94 ; [.24F1.0020.0002.AA94][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW TO> AA95 ; [.24F2.0020.0002.AA95] # TAI VIET LETTER HIGH TO AAB5 AA95 ; [.24F2.0020.0002.AA95][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH TO> AAB6 AA95 ; [.24F2.0020.0002.AA95][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH TO> AAB9 AA95 ; [.24F2.0020.0002.AA95][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH TO> AABB AA95 ; [.24F2.0020.0002.AA95][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH TO> AABC AA95 ; [.24F2.0020.0002.AA95][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH TO> AA96 ; [.24F3.0020.0002.AA96] # TAI VIET LETTER LOW THO AAB5 AA96 ; [.24F3.0020.0002.AA96][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW THO> AAB6 AA96 ; [.24F3.0020.0002.AA96][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW THO> AAB9 AA96 ; [.24F3.0020.0002.AA96][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW THO> AABB AA96 ; [.24F3.0020.0002.AA96][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW THO> AABC AA96 ; [.24F3.0020.0002.AA96][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW THO> AA97 ; [.24F4.0020.0002.AA97] # TAI VIET LETTER HIGH THO AAB5 AA97 ; [.24F4.0020.0002.AA97][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH THO> AAB6 AA97 ; [.24F4.0020.0002.AA97][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH THO> AAB9 AA97 ; [.24F4.0020.0002.AA97][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH THO> AABB AA97 ; [.24F4.0020.0002.AA97][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH THO> AABC AA97 ; [.24F4.0020.0002.AA97][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH THO> AA98 ; [.24F5.0020.0002.AA98] # TAI VIET LETTER LOW NO AAB5 AA98 ; [.24F5.0020.0002.AA98][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NO> AAB6 AA98 ; [.24F5.0020.0002.AA98][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NO> AAB9 AA98 ; [.24F5.0020.0002.AA98][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NO> AABB AA98 ; [.24F5.0020.0002.AA98][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NO> AABC AA98 ; [.24F5.0020.0002.AA98][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NO> AA99 ; [.24F6.0020.0002.AA99] # TAI VIET LETTER HIGH NO AAB5 AA99 ; [.24F6.0020.0002.AA99][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NO> AAB6 AA99 ; [.24F6.0020.0002.AA99][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NO> AAB9 AA99 ; [.24F6.0020.0002.AA99][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NO> AABB AA99 ; [.24F6.0020.0002.AA99][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NO> AABC AA99 ; [.24F6.0020.0002.AA99][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NO> AA9A ; [.24F7.0020.0002.AA9A] # TAI VIET LETTER LOW BO AAB5 AA9A ; [.24F7.0020.0002.AA9A][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW BO> AAB6 AA9A ; [.24F7.0020.0002.AA9A][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW BO> AAB9 AA9A ; [.24F7.0020.0002.AA9A][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW BO> AABB AA9A ; [.24F7.0020.0002.AA9A][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW BO> AABC AA9A ; [.24F7.0020.0002.AA9A][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW BO> AA9B ; [.24F8.0020.0002.AA9B] # TAI VIET LETTER HIGH BO AAB5 AA9B ; [.24F8.0020.0002.AA9B][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH BO> AAB6 AA9B ; [.24F8.0020.0002.AA9B][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH BO> AAB9 AA9B ; [.24F8.0020.0002.AA9B][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH BO> AABB AA9B ; [.24F8.0020.0002.AA9B][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH BO> AABC AA9B ; [.24F8.0020.0002.AA9B][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH BO> AA9C ; [.24F9.0020.0002.AA9C] # TAI VIET LETTER LOW PO AAB5 AA9C ; [.24F9.0020.0002.AA9C][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW PO> AAB6 AA9C ; [.24F9.0020.0002.AA9C][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW PO> AAB9 AA9C ; [.24F9.0020.0002.AA9C][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW PO> AABB AA9C ; [.24F9.0020.0002.AA9C][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW PO> AABC AA9C ; [.24F9.0020.0002.AA9C][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW PO> AA9D ; [.24FA.0020.0002.AA9D] # TAI VIET LETTER HIGH PO AAB5 AA9D ; [.24FA.0020.0002.AA9D][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH PO> AAB6 AA9D ; [.24FA.0020.0002.AA9D][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH PO> AAB9 AA9D ; [.24FA.0020.0002.AA9D][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH PO> AABB AA9D ; [.24FA.0020.0002.AA9D][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH PO> AABC AA9D ; [.24FA.0020.0002.AA9D][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH PO> AA9E ; [.24FB.0020.0002.AA9E] # TAI VIET LETTER LOW PHO AAB5 AA9E ; [.24FB.0020.0002.AA9E][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW PHO> AAB6 AA9E ; [.24FB.0020.0002.AA9E][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW PHO> AAB9 AA9E ; [.24FB.0020.0002.AA9E][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW PHO> AABB AA9E ; [.24FB.0020.0002.AA9E][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW PHO> AABC AA9E ; [.24FB.0020.0002.AA9E][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW PHO> AA9F ; [.24FC.0020.0002.AA9F] # TAI VIET LETTER HIGH PHO AAB5 AA9F ; [.24FC.0020.0002.AA9F][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH PHO> AAB6 AA9F ; [.24FC.0020.0002.AA9F][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH PHO> AAB9 AA9F ; [.24FC.0020.0002.AA9F][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH PHO> AABB AA9F ; [.24FC.0020.0002.AA9F][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH PHO> AABC AA9F ; [.24FC.0020.0002.AA9F][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH PHO> AAA0 ; [.24FD.0020.0002.AAA0] # TAI VIET LETTER LOW FO AAB5 AAA0 ; [.24FD.0020.0002.AAA0][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW FO> AAB6 AAA0 ; [.24FD.0020.0002.AAA0][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW FO> AAB9 AAA0 ; [.24FD.0020.0002.AAA0][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW FO> AABB AAA0 ; [.24FD.0020.0002.AAA0][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW FO> AABC AAA0 ; [.24FD.0020.0002.AAA0][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW FO> AAA1 ; [.24FE.0020.0002.AAA1] # TAI VIET LETTER HIGH FO AAB5 AAA1 ; [.24FE.0020.0002.AAA1][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH FO> AAB6 AAA1 ; [.24FE.0020.0002.AAA1][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH FO> AAB9 AAA1 ; [.24FE.0020.0002.AAA1][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH FO> AABB AAA1 ; [.24FE.0020.0002.AAA1][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH FO> AABC AAA1 ; [.24FE.0020.0002.AAA1][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH FO> AAA2 ; [.24FF.0020.0002.AAA2] # TAI VIET LETTER LOW MO AAB5 AAA2 ; [.24FF.0020.0002.AAA2][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW MO> AAB6 AAA2 ; [.24FF.0020.0002.AAA2][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW MO> AAB9 AAA2 ; [.24FF.0020.0002.AAA2][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW MO> AABB AAA2 ; [.24FF.0020.0002.AAA2][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW MO> AABC AAA2 ; [.24FF.0020.0002.AAA2][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW MO> AAA3 ; [.2500.0020.0002.AAA3] # TAI VIET LETTER HIGH MO AAB5 AAA3 ; [.2500.0020.0002.AAA3][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH MO> AAB6 AAA3 ; [.2500.0020.0002.AAA3][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH MO> AAB9 AAA3 ; [.2500.0020.0002.AAA3][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH MO> AABB AAA3 ; [.2500.0020.0002.AAA3][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH MO> AABC AAA3 ; [.2500.0020.0002.AAA3][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH MO> AAA4 ; [.2501.0020.0002.AAA4] # TAI VIET LETTER LOW YO AAB5 AAA4 ; [.2501.0020.0002.AAA4][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW YO> AAB6 AAA4 ; [.2501.0020.0002.AAA4][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW YO> AAB9 AAA4 ; [.2501.0020.0002.AAA4][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW YO> AABB AAA4 ; [.2501.0020.0002.AAA4][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW YO> AABC AAA4 ; [.2501.0020.0002.AAA4][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW YO> AAA5 ; [.2502.0020.0002.AAA5] # TAI VIET LETTER HIGH YO AAB5 AAA5 ; [.2502.0020.0002.AAA5][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH YO> AAB6 AAA5 ; [.2502.0020.0002.AAA5][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH YO> AAB9 AAA5 ; [.2502.0020.0002.AAA5][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH YO> AABB AAA5 ; [.2502.0020.0002.AAA5][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH YO> AABC AAA5 ; [.2502.0020.0002.AAA5][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH YO> AAA6 ; [.2503.0020.0002.AAA6] # TAI VIET LETTER LOW RO AAB5 AAA6 ; [.2503.0020.0002.AAA6][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW RO> AAB6 AAA6 ; [.2503.0020.0002.AAA6][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW RO> AAB9 AAA6 ; [.2503.0020.0002.AAA6][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW RO> AABB AAA6 ; [.2503.0020.0002.AAA6][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW RO> AABC AAA6 ; [.2503.0020.0002.AAA6][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW RO> AAA7 ; [.2504.0020.0002.AAA7] # TAI VIET LETTER HIGH RO AAB5 AAA7 ; [.2504.0020.0002.AAA7][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH RO> AAB6 AAA7 ; [.2504.0020.0002.AAA7][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH RO> AAB9 AAA7 ; [.2504.0020.0002.AAA7][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH RO> AABB AAA7 ; [.2504.0020.0002.AAA7][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH RO> AABC AAA7 ; [.2504.0020.0002.AAA7][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH RO> AAA8 ; [.2505.0020.0002.AAA8] # TAI VIET LETTER LOW LO AAB5 AAA8 ; [.2505.0020.0002.AAA8][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW LO> AAB6 AAA8 ; [.2505.0020.0002.AAA8][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW LO> AAB9 AAA8 ; [.2505.0020.0002.AAA8][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW LO> AABB AAA8 ; [.2505.0020.0002.AAA8][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW LO> AABC AAA8 ; [.2505.0020.0002.AAA8][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW LO> AAA9 ; [.2506.0020.0002.AAA9] # TAI VIET LETTER HIGH LO AAB5 AAA9 ; [.2506.0020.0002.AAA9][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH LO> AAB6 AAA9 ; [.2506.0020.0002.AAA9][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH LO> AAB9 AAA9 ; [.2506.0020.0002.AAA9][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH LO> AABB AAA9 ; [.2506.0020.0002.AAA9][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH LO> AABC AAA9 ; [.2506.0020.0002.AAA9][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH LO> AAAA ; [.2507.0020.0002.AAAA] # TAI VIET LETTER LOW VO AAB5 AAAA ; [.2507.0020.0002.AAAA][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW VO> AAB6 AAAA ; [.2507.0020.0002.AAAA][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW VO> AAB9 AAAA ; [.2507.0020.0002.AAAA][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW VO> AABB AAAA ; [.2507.0020.0002.AAAA][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW VO> AABC AAAA ; [.2507.0020.0002.AAAA][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW VO> AAAB ; [.2508.0020.0002.AAAB] # TAI VIET LETTER HIGH VO AAB5 AAAB ; [.2508.0020.0002.AAAB][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH VO> AAB6 AAAB ; [.2508.0020.0002.AAAB][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH VO> AAB9 AAAB ; [.2508.0020.0002.AAAB][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH VO> AABB AAAB ; [.2508.0020.0002.AAAB][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH VO> AABC AAAB ; [.2508.0020.0002.AAAB][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH VO> AAAC ; [.2509.0020.0002.AAAC] # TAI VIET LETTER LOW HO AAB5 AAAC ; [.2509.0020.0002.AAAC][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW HO> AAB6 AAAC ; [.2509.0020.0002.AAAC][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW HO> AAB9 AAAC ; [.2509.0020.0002.AAAC][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW HO> AABB AAAC ; [.2509.0020.0002.AAAC][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW HO> AABC AAAC ; [.2509.0020.0002.AAAC][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW HO> AAAD ; [.250A.0020.0002.AAAD] # TAI VIET LETTER HIGH HO AAB5 AAAD ; [.250A.0020.0002.AAAD][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH HO> AAB6 AAAD ; [.250A.0020.0002.AAAD][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH HO> AAB9 AAAD ; [.250A.0020.0002.AAAD][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH HO> AABB AAAD ; [.250A.0020.0002.AAAD][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH HO> AABC AAAD ; [.250A.0020.0002.AAAD][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH HO> AAAE ; [.250B.0020.0002.AAAE] # TAI VIET LETTER LOW O AAB5 AAAE ; [.250B.0020.0002.AAAE][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW O> AAB6 AAAE ; [.250B.0020.0002.AAAE][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW O> AAB9 AAAE ; [.250B.0020.0002.AAAE][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW O> AABB AAAE ; [.250B.0020.0002.AAAE][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW O> AABC AAAE ; [.250B.0020.0002.AAAE][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW O> AAAF ; [.250C.0020.0002.AAAF] # TAI VIET LETTER HIGH O AAB5 AAAF ; [.250C.0020.0002.AAAF][.2512.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH O> AAB6 AAAF ; [.250C.0020.0002.AAAF][.2513.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH O> AAB9 AAAF ; [.250C.0020.0002.AAAF][.2516.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH O> AABB AAAF ; [.250C.0020.0002.AAAF][.2518.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH O> AABC AAAF ; [.250C.0020.0002.AAAF][.2519.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH O> AAB0 ; [.250D.0020.0002.AAB0] # TAI VIET MAI KANG AAB1 ; [.250E.0020.0002.AAB1] # TAI VIET VOWEL AA AAB2 ; [.250F.0020.0002.AAB2] # TAI VIET VOWEL I AAB3 ; [.2510.0020.0002.AAB3] # TAI VIET VOWEL UE AAB4 ; [.2511.0020.0002.AAB4] # TAI VIET VOWEL U AAB5 ; [.2512.0020.0002.AAB5] # TAI VIET VOWEL E AAB6 ; [.2513.0020.0002.AAB6] # TAI VIET VOWEL O AAB7 ; [.2514.0020.0002.AAB7] # TAI VIET MAY KHIT AAB8 ; [.2515.0020.0002.AAB8] # TAI VIET VOWEL IA AAB9 ; [.2516.0020.0002.AAB9] # TAI VIET VOWEL UEA AABA ; [.2517.0020.0002.AABA] # TAI VIET VOWEL UA AABB ; [.2518.0020.0002.AABB] # TAI VIET VOWEL AUE AABC ; [.2519.0020.0002.AABC] # TAI VIET VOWEL AY AABD ; [.251A.0020.0002.AABD] # TAI VIET VOWEL AN AABE ; [.251B.0020.0002.AABE] # TAI VIET VOWEL AM AAC0 ; [.251C.0020.0002.AAC0] # TAI VIET TONE MAI NUENG AAC2 ; [.251D.0020.0002.AAC2] # TAI VIET TONE MAI SONG AADB ; [.251E.0020.0002.AADB] # TAI VIET SYMBOL KON AADC ; [.251F.0020.0002.AADC] # TAI VIET SYMBOL NUENG 0F40 ; [.2520.0020.0002.0F40] # TIBETAN LETTER KA 0F69 ; [.2520.0020.0002.0F40][.2561.0020.0002.0FB5] # TIBETAN LETTER KSSA 0F90 ; [.2521.0020.0002.0F90] # TIBETAN SUBJOINED LETTER KA 0FB9 ; [.2521.0020.0002.0F90][.2561.0020.0002.0FB5] # TIBETAN SUBJOINED LETTER KSSA 0F6B ; [.2522.0020.0002.0F6B] # TIBETAN LETTER KKA 0F41 ; [.2523.0020.0002.0F41] # TIBETAN LETTER KHA 0F91 ; [.2524.0020.0002.0F91] # TIBETAN SUBJOINED LETTER KHA 0F42 ; [.2525.0020.0002.0F42] # TIBETAN LETTER GA 0F43 ; [.2525.0020.0002.0F42][.2565.0020.0002.0FB7] # TIBETAN LETTER GHA 0F92 ; [.2526.0020.0002.0F92] # TIBETAN SUBJOINED LETTER GA 0F93 ; [.2526.0020.0002.0F92][.2565.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER GHA 0F44 ; [.2527.0020.0002.0F44] # TIBETAN LETTER NGA 0F94 ; [.2528.0020.0002.0F94] # TIBETAN SUBJOINED LETTER NGA 0F45 ; [.2529.0020.0002.0F45] # TIBETAN LETTER CA 0F95 ; [.252A.0020.0002.0F95] # TIBETAN SUBJOINED LETTER CA 0F46 ; [.252B.0020.0002.0F46] # TIBETAN LETTER CHA 0F96 ; [.252C.0020.0002.0F96] # TIBETAN SUBJOINED LETTER CHA 0F47 ; [.252D.0020.0002.0F47] # TIBETAN LETTER JA 0F97 ; [.252E.0020.0002.0F97] # TIBETAN SUBJOINED LETTER JA 0F49 ; [.252F.0020.0002.0F49] # TIBETAN LETTER NYA 0F99 ; [.2530.0020.0002.0F99] # TIBETAN SUBJOINED LETTER NYA 0F4A ; [.2531.0020.0002.0F4A] # TIBETAN LETTER TTA 0F9A ; [.2532.0020.0002.0F9A] # TIBETAN SUBJOINED LETTER TTA 0F4B ; [.2533.0020.0002.0F4B] # TIBETAN LETTER TTHA 0F9B ; [.2534.0020.0002.0F9B] # TIBETAN SUBJOINED LETTER TTHA 0F4C ; [.2535.0020.0002.0F4C] # TIBETAN LETTER DDA 0F4D ; [.2535.0020.0002.0F4C][.2565.0020.0002.0FB7] # TIBETAN LETTER DDHA 0F9C ; [.2536.0020.0002.0F9C] # TIBETAN SUBJOINED LETTER DDA 0F9D ; [.2536.0020.0002.0F9C][.2565.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER DDHA 0F4E ; [.2537.0020.0002.0F4E] # TIBETAN LETTER NNA 0F9E ; [.2538.0020.0002.0F9E] # TIBETAN SUBJOINED LETTER NNA 0F4F ; [.2539.0020.0002.0F4F] # TIBETAN LETTER TA 0F9F ; [.253A.0020.0002.0F9F] # TIBETAN SUBJOINED LETTER TA 0F50 ; [.253B.0020.0002.0F50] # TIBETAN LETTER THA 0FA0 ; [.253C.0020.0002.0FA0] # TIBETAN SUBJOINED LETTER THA 0F51 ; [.253D.0020.0002.0F51] # TIBETAN LETTER DA 0F52 ; [.253D.0020.0002.0F51][.2565.0020.0002.0FB7] # TIBETAN LETTER DHA 0FA1 ; [.253E.0020.0002.0FA1] # TIBETAN SUBJOINED LETTER DA 0FA2 ; [.253E.0020.0002.0FA1][.2565.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER DHA 0F53 ; [.253F.0020.0002.0F53] # TIBETAN LETTER NA 0FA3 ; [.2540.0020.0002.0FA3] # TIBETAN SUBJOINED LETTER NA 0F54 ; [.2541.0020.0002.0F54] # TIBETAN LETTER PA 0FA4 ; [.2542.0020.0002.0FA4] # TIBETAN SUBJOINED LETTER PA 0F55 ; [.2543.0020.0002.0F55] # TIBETAN LETTER PHA 0FA5 ; [.2544.0020.0002.0FA5] # TIBETAN SUBJOINED LETTER PHA 0F56 ; [.2545.0020.0002.0F56] # TIBETAN LETTER BA 0F57 ; [.2545.0020.0002.0F56][.2565.0020.0002.0FB7] # TIBETAN LETTER BHA 0FA6 ; [.2546.0020.0002.0FA6] # TIBETAN SUBJOINED LETTER BA 0FA7 ; [.2546.0020.0002.0FA6][.2565.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER BHA 0F58 ; [.2547.0020.0002.0F58] # TIBETAN LETTER MA 0FA8 ; [.2548.0020.0002.0FA8] # TIBETAN SUBJOINED LETTER MA 0F59 ; [.2549.0020.0002.0F59] # TIBETAN LETTER TSA 0FA9 ; [.254A.0020.0002.0FA9] # TIBETAN SUBJOINED LETTER TSA 0F5A ; [.254B.0020.0002.0F5A] # TIBETAN LETTER TSHA 0FAA ; [.254C.0020.0002.0FAA] # TIBETAN SUBJOINED LETTER TSHA 0F5B ; [.254D.0020.0002.0F5B] # TIBETAN LETTER DZA 0F5C ; [.254D.0020.0002.0F5B][.2565.0020.0002.0FB7] # TIBETAN LETTER DZHA 0FAB ; [.254E.0020.0002.0FAB] # TIBETAN SUBJOINED LETTER DZA 0FAC ; [.254E.0020.0002.0FAB][.2565.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER DZHA 0F5D ; [.254F.0020.0002.0F5D] # TIBETAN LETTER WA 0FAD ; [.2550.0020.0002.0FAD] # TIBETAN SUBJOINED LETTER WA 0FBA ; [.2550.0020.0004.0FBA][.0000.013A.0004.0FBA] # TIBETAN SUBJOINED LETTER FIXED-FORM WA 0F5E ; [.2551.0020.0002.0F5E] # TIBETAN LETTER ZHA 0FAE ; [.2552.0020.0002.0FAE] # TIBETAN SUBJOINED LETTER ZHA 0F5F ; [.2553.0020.0002.0F5F] # TIBETAN LETTER ZA 0FAF ; [.2554.0020.0002.0FAF] # TIBETAN SUBJOINED LETTER ZA 0F60 ; [.2555.0020.0002.0F60] # TIBETAN LETTER -A 0FB0 ; [.2556.0020.0002.0FB0] # TIBETAN SUBJOINED LETTER -A 0F61 ; [.2557.0020.0002.0F61] # TIBETAN LETTER YA 0FB1 ; [.2558.0020.0002.0FB1] # TIBETAN SUBJOINED LETTER YA 0FBB ; [.2558.0020.0004.0FBB][.0000.013A.0004.0FBB] # TIBETAN SUBJOINED LETTER FIXED-FORM YA 0F62 ; [.2559.0020.0002.0F62] # TIBETAN LETTER RA 0F6A ; [.2559.0020.0004.0F6A][.0000.013A.0004.0F6A] # TIBETAN LETTER FIXED-FORM RA 0FB2 ; [.255A.0020.0002.0FB2] # TIBETAN SUBJOINED LETTER RA 0FBC ; [.255A.0020.0004.0FBC][.0000.013A.0004.0FBC] # TIBETAN SUBJOINED LETTER FIXED-FORM RA 0F6C ; [.255B.0020.0002.0F6C] # TIBETAN LETTER RRA 0F63 ; [.255C.0020.0002.0F63] # TIBETAN LETTER LA 0FB3 ; [.255D.0020.0002.0FB3] # TIBETAN SUBJOINED LETTER LA 0F64 ; [.255E.0020.0002.0F64] # TIBETAN LETTER SHA 0FB4 ; [.255F.0020.0002.0FB4] # TIBETAN SUBJOINED LETTER SHA 0F65 ; [.2560.0020.0002.0F65] # TIBETAN LETTER SSA 0FB5 ; [.2561.0020.0002.0FB5] # TIBETAN SUBJOINED LETTER SSA 0F66 ; [.2562.0020.0002.0F66] # TIBETAN LETTER SA 0FB6 ; [.2563.0020.0002.0FB6] # TIBETAN SUBJOINED LETTER SA 0F67 ; [.2564.0020.0002.0F67] # TIBETAN LETTER HA 0FB7 ; [.2565.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER HA 0F68 ; [.2566.0020.0002.0F68] # TIBETAN LETTER A 0F00 ; [.2566.0020.0004.0F00][.257D.0020.0004.0F00][.0000.00F3.001F.0F00] # TIBETAN SYLLABLE OM 0FB8 ; [.2567.0020.0002.0FB8] # TIBETAN SUBJOINED LETTER A 0F88 ; [.2568.0020.0002.0F88] # TIBETAN SIGN LCE TSA CAN 0F8D ; [.2569.0020.0002.0F8D] # TIBETAN SUBJOINED SIGN LCE TSA CAN 0F89 ; [.256A.0020.0002.0F89] # TIBETAN SIGN MCHU CAN 0F8E ; [.256B.0020.0002.0F8E] # TIBETAN SUBJOINED SIGN MCHU CAN 0F8C ; [.256C.0020.0002.0F8C] # TIBETAN SIGN INVERTED MCHU CAN 0F8F ; [.256D.0020.0002.0F8F] # TIBETAN SUBJOINED SIGN INVERTED MCHU CAN 0F8A ; [.256E.0020.0002.0F8A] # TIBETAN SIGN GRU CAN RGYINGS 0F8B ; [.256F.0020.0002.0F8B] # TIBETAN SIGN GRU MED RGYINGS 0F71 ; [.2570.0020.0002.0F71] # TIBETAN VOWEL SIGN AA 0F72 ; [.2571.0020.0002.0F72] # TIBETAN VOWEL SIGN I 0F73 ; [.2572.0020.0002.0F73] # TIBETAN VOWEL SIGN II 0F71 0F72 ; [.2572.0020.0002.0F73] # TIBETAN VOWEL SIGN II 0F80 ; [.2573.0020.0002.0F80] # TIBETAN VOWEL SIGN REVERSED I 0F81 ; [.2574.0020.0002.0F81] # TIBETAN VOWEL SIGN REVERSED II 0F71 0F80 ; [.2574.0020.0002.0F81] # TIBETAN VOWEL SIGN REVERSED II 0F74 ; [.2575.0020.0002.0F74] # TIBETAN VOWEL SIGN U 0F75 ; [.2576.0020.0002.0F75] # TIBETAN VOWEL SIGN UU 0F71 0F74 ; [.2576.0020.0002.0F75] # TIBETAN VOWEL SIGN UU 0F76 ; [.2577.0020.0002.0F76] # TIBETAN VOWEL SIGN VOCALIC R 0FB2 0F80 ; [.2577.0020.0002.0F76] # TIBETAN VOWEL SIGN VOCALIC R 0F77 ; [.2578.0020.0002.0F77] # TIBETAN VOWEL SIGN VOCALIC RR 0FB2 0F71 0F80 ; [.2578.0020.0002.0F77] # TIBETAN VOWEL SIGN VOCALIC RR 0FB2 0F81 ; [.2578.0020.0002.0F77] # TIBETAN VOWEL SIGN VOCALIC RR 0F78 ; [.2579.0020.0002.0F78] # TIBETAN VOWEL SIGN VOCALIC L 0FB3 0F80 ; [.2579.0020.0002.0F78] # TIBETAN VOWEL SIGN VOCALIC L 0F79 ; [.257A.0020.0002.0F79] # TIBETAN VOWEL SIGN VOCALIC LL 0FB3 0F71 0F80 ; [.257A.0020.0002.0F79] # TIBETAN VOWEL SIGN VOCALIC LL 0FB3 0F81 ; [.257A.0020.0002.0F79] # TIBETAN VOWEL SIGN VOCALIC LL 0F7A ; [.257B.0020.0002.0F7A] # TIBETAN VOWEL SIGN E 0F7B ; [.257C.0020.0002.0F7B] # TIBETAN VOWEL SIGN EE 0F7C ; [.257D.0020.0002.0F7C] # TIBETAN VOWEL SIGN O 0F7D ; [.257E.0020.0002.0F7D] # TIBETAN VOWEL SIGN OO 0F84 ; [.257F.0020.0002.0F84] # TIBETAN MARK HALANTA 1C00 ; [.2580.0020.0002.1C00] # LEPCHA LETTER KA 1C01 ; [.2581.0020.0002.1C01] # LEPCHA LETTER KLA 1C02 ; [.2582.0020.0002.1C02] # LEPCHA LETTER KHA 1C03 ; [.2583.0020.0002.1C03] # LEPCHA LETTER GA 1C04 ; [.2584.0020.0002.1C04] # LEPCHA LETTER GLA 1C05 ; [.2585.0020.0002.1C05] # LEPCHA LETTER NGA 1C06 ; [.2586.0020.0002.1C06] # LEPCHA LETTER CA 1C07 ; [.2587.0020.0002.1C07] # LEPCHA LETTER CHA 1C08 ; [.2588.0020.0002.1C08] # LEPCHA LETTER JA 1C09 ; [.2589.0020.0002.1C09] # LEPCHA LETTER NYA 1C4D ; [.258A.0020.0002.1C4D] # LEPCHA LETTER TTA 1C4E ; [.258B.0020.0002.1C4E] # LEPCHA LETTER TTHA 1C4F ; [.258C.0020.0002.1C4F] # LEPCHA LETTER DDA 1C0A ; [.258D.0020.0002.1C0A] # LEPCHA LETTER TA 1C0B ; [.258E.0020.0002.1C0B] # LEPCHA LETTER THA 1C0C ; [.258F.0020.0002.1C0C] # LEPCHA LETTER DA 1C0D ; [.2590.0020.0002.1C0D] # LEPCHA LETTER NA 1C0E ; [.2591.0020.0002.1C0E] # LEPCHA LETTER PA 1C0F ; [.2592.0020.0002.1C0F] # LEPCHA LETTER PLA 1C10 ; [.2593.0020.0002.1C10] # LEPCHA LETTER PHA 1C11 ; [.2594.0020.0002.1C11] # LEPCHA LETTER FA 1C12 ; [.2595.0020.0002.1C12] # LEPCHA LETTER FLA 1C13 ; [.2596.0020.0002.1C13] # LEPCHA LETTER BA 1C14 ; [.2597.0020.0002.1C14] # LEPCHA LETTER BLA 1C15 ; [.2598.0020.0002.1C15] # LEPCHA LETTER MA 1C16 ; [.2599.0020.0002.1C16] # LEPCHA LETTER MLA 1C17 ; [.259A.0020.0002.1C17] # LEPCHA LETTER TSA 1C18 ; [.259B.0020.0002.1C18] # LEPCHA LETTER TSHA 1C19 ; [.259C.0020.0002.1C19] # LEPCHA LETTER DZA 1C1A ; [.259D.0020.0002.1C1A] # LEPCHA LETTER YA 1C24 ; [.259E.0020.0002.1C24] # LEPCHA SUBJOINED LETTER YA 1C1B ; [.259F.0020.0002.1C1B] # LEPCHA LETTER RA 1C25 ; [.25A0.0020.0002.1C25] # LEPCHA SUBJOINED LETTER RA 1C1C ; [.25A1.0020.0002.1C1C] # LEPCHA LETTER LA 1C1D ; [.25A2.0020.0002.1C1D] # LEPCHA LETTER HA 1C1E ; [.25A3.0020.0002.1C1E] # LEPCHA LETTER HLA 1C1F ; [.25A4.0020.0002.1C1F] # LEPCHA LETTER VA 1C20 ; [.25A5.0020.0002.1C20] # LEPCHA LETTER SA 1C21 ; [.25A6.0020.0002.1C21] # LEPCHA LETTER SHA 1C22 ; [.25A7.0020.0002.1C22] # LEPCHA LETTER WA 1C23 ; [.25A8.0020.0002.1C23] # LEPCHA LETTER A 1C36 ; [.25A9.0020.0002.1C36] # LEPCHA SIGN RAN 1C26 ; [.25AA.0020.0002.1C26] # LEPCHA VOWEL SIGN AA 1C27 ; [.25AB.0020.0002.1C27] # LEPCHA VOWEL SIGN I 1C28 ; [.25AC.0020.0002.1C28] # LEPCHA VOWEL SIGN O 1C29 ; [.25AD.0020.0002.1C29] # LEPCHA VOWEL SIGN OO 1C2A ; [.25AE.0020.0002.1C2A] # LEPCHA VOWEL SIGN U 1C2B ; [.25AF.0020.0002.1C2B] # LEPCHA VOWEL SIGN UU 1C2C ; [.25B0.0020.0002.1C2C] # LEPCHA VOWEL SIGN E 1C2D ; [.25B1.0020.0002.1C2D] # LEPCHA CONSONANT SIGN K 1C2E ; [.25B2.0020.0002.1C2E] # LEPCHA CONSONANT SIGN M 1C2F ; [.25B3.0020.0002.1C2F] # LEPCHA CONSONANT SIGN L 1C30 ; [.25B4.0020.0002.1C30] # LEPCHA CONSONANT SIGN N 1C31 ; [.25B5.0020.0002.1C31] # LEPCHA CONSONANT SIGN P 1C32 ; [.25B6.0020.0002.1C32] # LEPCHA CONSONANT SIGN R 1C33 ; [.25B7.0020.0002.1C33] # LEPCHA CONSONANT SIGN T 1C34 ; [.25B8.0020.0002.1C34] # LEPCHA CONSONANT SIGN NYIN-DO 1C35 ; [.25B9.0020.0002.1C35] # LEPCHA CONSONANT SIGN KANG A840 ; [.25BA.0020.0002.A840] # PHAGS-PA LETTER KA A841 ; [.25BB.0020.0002.A841] # PHAGS-PA LETTER KHA A842 ; [.25BC.0020.0002.A842] # PHAGS-PA LETTER GA A843 ; [.25BD.0020.0002.A843] # PHAGS-PA LETTER NGA A844 ; [.25BE.0020.0002.A844] # PHAGS-PA LETTER CA A845 ; [.25BF.0020.0002.A845] # PHAGS-PA LETTER CHA A846 ; [.25C0.0020.0002.A846] # PHAGS-PA LETTER JA A847 ; [.25C1.0020.0002.A847] # PHAGS-PA LETTER NYA A869 ; [.25C2.0020.0002.A869] # PHAGS-PA LETTER TTA A86A ; [.25C3.0020.0002.A86A] # PHAGS-PA LETTER TTHA A86B ; [.25C4.0020.0002.A86B] # PHAGS-PA LETTER DDA A86C ; [.25C5.0020.0002.A86C] # PHAGS-PA LETTER NNA A848 ; [.25C6.0020.0002.A848] # PHAGS-PA LETTER TA A849 ; [.25C7.0020.0002.A849] # PHAGS-PA LETTER THA A84A ; [.25C8.0020.0002.A84A] # PHAGS-PA LETTER DA A84B ; [.25C9.0020.0002.A84B] # PHAGS-PA LETTER NA A84C ; [.25CA.0020.0002.A84C] # PHAGS-PA LETTER PA A84D ; [.25CB.0020.0002.A84D] # PHAGS-PA LETTER PHA A84E ; [.25CC.0020.0002.A84E] # PHAGS-PA LETTER BA A84F ; [.25CD.0020.0002.A84F] # PHAGS-PA LETTER MA A850 ; [.25CE.0020.0002.A850] # PHAGS-PA LETTER TSA A851 ; [.25CF.0020.0002.A851] # PHAGS-PA LETTER TSHA A852 ; [.25D0.0020.0002.A852] # PHAGS-PA LETTER DZA A853 ; [.25D1.0020.0002.A853] # PHAGS-PA LETTER WA A867 ; [.25D2.0020.0002.A867] # PHAGS-PA SUBJOINED LETTER WA A854 ; [.25D3.0020.0002.A854] # PHAGS-PA LETTER ZHA A855 ; [.25D4.0020.0002.A855] # PHAGS-PA LETTER ZA A856 ; [.25D5.0020.0002.A856] # PHAGS-PA LETTER SMALL A A857 ; [.25D6.0020.0002.A857] # PHAGS-PA LETTER YA A868 ; [.25D7.0020.0002.A868] # PHAGS-PA SUBJOINED LETTER YA A86D ; [.25D8.0020.0002.A86D] # PHAGS-PA LETTER ALTERNATE YA A858 ; [.25D9.0020.0002.A858] # PHAGS-PA LETTER RA A871 ; [.25DA.0020.0002.A871] # PHAGS-PA SUBJOINED LETTER RA A872 ; [.25DB.0020.0002.A872] # PHAGS-PA SUPERFIXED LETTER RA A859 ; [.25DC.0020.0002.A859] # PHAGS-PA LETTER LA A85A ; [.25DD.0020.0002.A85A] # PHAGS-PA LETTER SHA A86E ; [.25DE.0020.0002.A86E] # PHAGS-PA LETTER VOICELESS SHA A85B ; [.25DF.0020.0002.A85B] # PHAGS-PA LETTER SA A85C ; [.25E0.0020.0002.A85C] # PHAGS-PA LETTER HA A86F ; [.25E1.0020.0002.A86F] # PHAGS-PA LETTER VOICED HA A870 ; [.25E2.0020.0002.A870] # PHAGS-PA LETTER ASPIRATED FA A85D ; [.25E3.0020.0002.A85D] # PHAGS-PA LETTER A A862 ; [.25E4.0020.0002.A862] # PHAGS-PA LETTER QA A863 ; [.25E5.0020.0002.A863] # PHAGS-PA LETTER XA A864 ; [.25E6.0020.0002.A864] # PHAGS-PA LETTER FA A865 ; [.25E7.0020.0002.A865] # PHAGS-PA LETTER GGA A85E ; [.25E8.0020.0002.A85E] # PHAGS-PA LETTER I A85F ; [.25E9.0020.0002.A85F] # PHAGS-PA LETTER U A860 ; [.25EA.0020.0002.A860] # PHAGS-PA LETTER E A861 ; [.25EB.0020.0002.A861] # PHAGS-PA LETTER O A866 ; [.25EC.0020.0002.A866] # PHAGS-PA LETTER EE A873 ; [.25ED.0020.0002.A873] # PHAGS-PA LETTER CANDRABINDU 1900 ; [.25EE.0020.0002.1900] # LIMBU VOWEL-CARRIER LETTER 1901 ; [.25EF.0020.0002.1901] # LIMBU LETTER KA 1902 ; [.25F0.0020.0002.1902] # LIMBU LETTER KHA 1903 ; [.25F1.0020.0002.1903] # LIMBU LETTER GA 1904 ; [.25F2.0020.0002.1904] # LIMBU LETTER GHA 1905 ; [.25F3.0020.0002.1905] # LIMBU LETTER NGA 1906 ; [.25F4.0020.0002.1906] # LIMBU LETTER CA 1907 ; [.25F5.0020.0002.1907] # LIMBU LETTER CHA 1908 ; [.25F6.0020.0002.1908] # LIMBU LETTER JA 1909 ; [.25F7.0020.0002.1909] # LIMBU LETTER JHA 190A ; [.25F8.0020.0002.190A] # LIMBU LETTER YAN 190B ; [.25F9.0020.0002.190B] # LIMBU LETTER TA 190C ; [.25FA.0020.0002.190C] # LIMBU LETTER THA 190D ; [.25FB.0020.0002.190D] # LIMBU LETTER DA 190E ; [.25FC.0020.0002.190E] # LIMBU LETTER DHA 190F ; [.25FD.0020.0002.190F] # LIMBU LETTER NA 1910 ; [.25FE.0020.0002.1910] # LIMBU LETTER PA 1911 ; [.25FF.0020.0002.1911] # LIMBU LETTER PHA 1912 ; [.2600.0020.0002.1912] # LIMBU LETTER BA 1913 ; [.2601.0020.0002.1913] # LIMBU LETTER BHA 1914 ; [.2602.0020.0002.1914] # LIMBU LETTER MA 1915 ; [.2603.0020.0002.1915] # LIMBU LETTER YA 1916 ; [.2604.0020.0002.1916] # LIMBU LETTER RA 1917 ; [.2605.0020.0002.1917] # LIMBU LETTER LA 1918 ; [.2606.0020.0002.1918] # LIMBU LETTER WA 1919 ; [.2607.0020.0002.1919] # LIMBU LETTER SHA 191A ; [.2608.0020.0002.191A] # LIMBU LETTER SSA 191B ; [.2609.0020.0002.191B] # LIMBU LETTER SA 191C ; [.260A.0020.0002.191C] # LIMBU LETTER HA 1920 ; [.260B.0020.0002.1920] # LIMBU VOWEL SIGN A 1921 ; [.260C.0020.0002.1921] # LIMBU VOWEL SIGN I 1922 ; [.260D.0020.0002.1922] # LIMBU VOWEL SIGN U 1923 ; [.260E.0020.0002.1923] # LIMBU VOWEL SIGN EE 1924 ; [.260F.0020.0002.1924] # LIMBU VOWEL SIGN AI 1925 ; [.2610.0020.0002.1925] # LIMBU VOWEL SIGN OO 1926 ; [.2611.0020.0002.1926] # LIMBU VOWEL SIGN AU 1927 ; [.2612.0020.0002.1927] # LIMBU VOWEL SIGN E 1928 ; [.2613.0020.0002.1928] # LIMBU VOWEL SIGN O 1929 ; [.2614.0020.0002.1929] # LIMBU SUBJOINED LETTER YA 192A ; [.2615.0020.0002.192A] # LIMBU SUBJOINED LETTER RA 192B ; [.2616.0020.0002.192B] # LIMBU SUBJOINED LETTER WA 1930 ; [.2617.0020.0002.1930] # LIMBU SMALL LETTER KA 1931 ; [.2618.0020.0002.1931] # LIMBU SMALL LETTER NGA 1932 ; [.2619.0020.0002.1932] # LIMBU SMALL LETTER ANUSVARA 1933 ; [.261A.0020.0002.1933] # LIMBU SMALL LETTER TA 1934 ; [.261B.0020.0002.1934] # LIMBU SMALL LETTER NA 1935 ; [.261C.0020.0002.1935] # LIMBU SMALL LETTER PA 1936 ; [.261D.0020.0002.1936] # LIMBU SMALL LETTER MA 1937 ; [.261E.0020.0002.1937] # LIMBU SMALL LETTER RA 1938 ; [.261F.0020.0002.1938] # LIMBU SMALL LETTER LA 1700 ; [.2620.0020.0002.1700] # TAGALOG LETTER A 1701 ; [.2621.0020.0002.1701] # TAGALOG LETTER I 1702 ; [.2622.0020.0002.1702] # TAGALOG LETTER U 1703 ; [.2623.0020.0002.1703] # TAGALOG LETTER KA 1704 ; [.2624.0020.0002.1704] # TAGALOG LETTER GA 1705 ; [.2625.0020.0002.1705] # TAGALOG LETTER NGA 1706 ; [.2626.0020.0002.1706] # TAGALOG LETTER TA 1707 ; [.2627.0020.0002.1707] # TAGALOG LETTER DA 1708 ; [.2628.0020.0002.1708] # TAGALOG LETTER NA 1709 ; [.2629.0020.0002.1709] # TAGALOG LETTER PA 170A ; [.262A.0020.0002.170A] # TAGALOG LETTER BA 170B ; [.262B.0020.0002.170B] # TAGALOG LETTER MA 170C ; [.262C.0020.0002.170C] # TAGALOG LETTER YA 170E ; [.262D.0020.0002.170E] # TAGALOG LETTER LA 170F ; [.262E.0020.0002.170F] # TAGALOG LETTER WA 1710 ; [.262F.0020.0002.1710] # TAGALOG LETTER SA 1711 ; [.2630.0020.0002.1711] # TAGALOG LETTER HA 1712 ; [.2631.0020.0002.1712] # TAGALOG VOWEL SIGN I 1713 ; [.2632.0020.0002.1713] # TAGALOG VOWEL SIGN U 1714 ; [.2633.0020.0002.1714] # TAGALOG SIGN VIRAMA 1720 ; [.2634.0020.0002.1720] # HANUNOO LETTER A 1721 ; [.2635.0020.0002.1721] # HANUNOO LETTER I 1722 ; [.2636.0020.0002.1722] # HANUNOO LETTER U 1723 ; [.2637.0020.0002.1723] # HANUNOO LETTER KA 1724 ; [.2638.0020.0002.1724] # HANUNOO LETTER GA 1725 ; [.2639.0020.0002.1725] # HANUNOO LETTER NGA 1726 ; [.263A.0020.0002.1726] # HANUNOO LETTER TA 1727 ; [.263B.0020.0002.1727] # HANUNOO LETTER DA 1728 ; [.263C.0020.0002.1728] # HANUNOO LETTER NA 1729 ; [.263D.0020.0002.1729] # HANUNOO LETTER PA 172A ; [.263E.0020.0002.172A] # HANUNOO LETTER BA 172B ; [.263F.0020.0002.172B] # HANUNOO LETTER MA 172C ; [.2640.0020.0002.172C] # HANUNOO LETTER YA 172D ; [.2641.0020.0002.172D] # HANUNOO LETTER RA 172E ; [.2642.0020.0002.172E] # HANUNOO LETTER LA 172F ; [.2643.0020.0002.172F] # HANUNOO LETTER WA 1730 ; [.2644.0020.0002.1730] # HANUNOO LETTER SA 1731 ; [.2645.0020.0002.1731] # HANUNOO LETTER HA 1732 ; [.2646.0020.0002.1732] # HANUNOO VOWEL SIGN I 1733 ; [.2647.0020.0002.1733] # HANUNOO VOWEL SIGN U 1734 ; [.2648.0020.0002.1734] # HANUNOO SIGN PAMUDPOD 1740 ; [.2649.0020.0002.1740] # BUHID LETTER A 1741 ; [.264A.0020.0002.1741] # BUHID LETTER I 1742 ; [.264B.0020.0002.1742] # BUHID LETTER U 1743 ; [.264C.0020.0002.1743] # BUHID LETTER KA 1744 ; [.264D.0020.0002.1744] # BUHID LETTER GA 1745 ; [.264E.0020.0002.1745] # BUHID LETTER NGA 1746 ; [.264F.0020.0002.1746] # BUHID LETTER TA 1747 ; [.2650.0020.0002.1747] # BUHID LETTER DA 1748 ; [.2651.0020.0002.1748] # BUHID LETTER NA 1749 ; [.2652.0020.0002.1749] # BUHID LETTER PA 174A ; [.2653.0020.0002.174A] # BUHID LETTER BA 174B ; [.2654.0020.0002.174B] # BUHID LETTER MA 174C ; [.2655.0020.0002.174C] # BUHID LETTER YA 174D ; [.2656.0020.0002.174D] # BUHID LETTER RA 174E ; [.2657.0020.0002.174E] # BUHID LETTER LA 174F ; [.2658.0020.0002.174F] # BUHID LETTER WA 1750 ; [.2659.0020.0002.1750] # BUHID LETTER SA 1751 ; [.265A.0020.0002.1751] # BUHID LETTER HA 1752 ; [.265B.0020.0002.1752] # BUHID VOWEL SIGN I 1753 ; [.265C.0020.0002.1753] # BUHID VOWEL SIGN U 1760 ; [.265D.0020.0002.1760] # TAGBANWA LETTER A 1761 ; [.265E.0020.0002.1761] # TAGBANWA LETTER I 1762 ; [.265F.0020.0002.1762] # TAGBANWA LETTER U 1763 ; [.2660.0020.0002.1763] # TAGBANWA LETTER KA 1764 ; [.2661.0020.0002.1764] # TAGBANWA LETTER GA 1765 ; [.2662.0020.0002.1765] # TAGBANWA LETTER NGA 1766 ; [.2663.0020.0002.1766] # TAGBANWA LETTER TA 1767 ; [.2664.0020.0002.1767] # TAGBANWA LETTER DA 1768 ; [.2665.0020.0002.1768] # TAGBANWA LETTER NA 1769 ; [.2666.0020.0002.1769] # TAGBANWA LETTER PA 176A ; [.2667.0020.0002.176A] # TAGBANWA LETTER BA 176B ; [.2668.0020.0002.176B] # TAGBANWA LETTER MA 176C ; [.2669.0020.0002.176C] # TAGBANWA LETTER YA 176E ; [.266A.0020.0002.176E] # TAGBANWA LETTER LA 176F ; [.266B.0020.0002.176F] # TAGBANWA LETTER WA 1770 ; [.266C.0020.0002.1770] # TAGBANWA LETTER SA 1772 ; [.266D.0020.0002.1772] # TAGBANWA VOWEL SIGN I 1773 ; [.266E.0020.0002.1773] # TAGBANWA VOWEL SIGN U 1A00 ; [.266F.0020.0002.1A00] # BUGINESE LETTER KA 1A01 ; [.2670.0020.0002.1A01] # BUGINESE LETTER GA 1A02 ; [.2671.0020.0002.1A02] # BUGINESE LETTER NGA 1A03 ; [.2672.0020.0002.1A03] # BUGINESE LETTER NGKA 1A04 ; [.2673.0020.0002.1A04] # BUGINESE LETTER PA 1A05 ; [.2674.0020.0002.1A05] # BUGINESE LETTER BA 1A06 ; [.2675.0020.0002.1A06] # BUGINESE LETTER MA 1A07 ; [.2676.0020.0002.1A07] # BUGINESE LETTER MPA 1A08 ; [.2677.0020.0002.1A08] # BUGINESE LETTER TA 1A09 ; [.2678.0020.0002.1A09] # BUGINESE LETTER DA 1A0A ; [.2679.0020.0002.1A0A] # BUGINESE LETTER NA 1A0B ; [.267A.0020.0002.1A0B] # BUGINESE LETTER NRA 1A0C ; [.267B.0020.0002.1A0C] # BUGINESE LETTER CA 1A0D ; [.267C.0020.0002.1A0D] # BUGINESE LETTER JA 1A0E ; [.267D.0020.0002.1A0E] # BUGINESE LETTER NYA 1A0F ; [.267E.0020.0002.1A0F] # BUGINESE LETTER NYCA 1A10 ; [.267F.0020.0002.1A10] # BUGINESE LETTER YA 1A11 ; [.2680.0020.0002.1A11] # BUGINESE LETTER RA 1A12 ; [.2681.0020.0002.1A12] # BUGINESE LETTER LA 1A13 ; [.2682.0020.0002.1A13] # BUGINESE LETTER VA 1A14 ; [.2683.0020.0002.1A14] # BUGINESE LETTER SA 1A15 ; [.2684.0020.0002.1A15] # BUGINESE LETTER A 1A16 ; [.2685.0020.0002.1A16] # BUGINESE LETTER HA 1A17 ; [.2686.0020.0002.1A17] # BUGINESE VOWEL SIGN I 1A18 ; [.2687.0020.0002.1A18] # BUGINESE VOWEL SIGN U 1A19 ; [.2688.0020.0002.1A19] # BUGINESE VOWEL SIGN E 1A1A ; [.2689.0020.0002.1A1A] # BUGINESE VOWEL SIGN O 1A1B ; [.268A.0020.0002.1A1B] # BUGINESE VOWEL SIGN AE 1BC0 ; [.268B.0020.0002.1BC0] # BATAK LETTER A 1BC1 ; [.268B.0020.0004.1BC1] # BATAK LETTER SIMALUNGUN A 1BC2 ; [.268C.0020.0002.1BC2] # BATAK LETTER HA 1BC3 ; [.268C.0020.0004.1BC3] # BATAK LETTER SIMALUNGUN HA 1BC4 ; [.268C.0020.0004.1BC4] # BATAK LETTER MANDAILING HA 1BC5 ; [.268D.0020.0002.1BC5] # BATAK LETTER BA 1BC6 ; [.268D.0020.0004.1BC6] # BATAK LETTER KARO BA 1BC7 ; [.268E.0020.0002.1BC7] # BATAK LETTER PA 1BC8 ; [.268E.0020.0004.1BC8] # BATAK LETTER SIMALUNGUN PA 1BC9 ; [.268F.0020.0002.1BC9] # BATAK LETTER NA 1BCA ; [.268F.0020.0004.1BCA] # BATAK LETTER MANDAILING NA 1BCB ; [.2690.0020.0002.1BCB] # BATAK LETTER WA 1BCC ; [.2690.0020.0004.1BCC] # BATAK LETTER SIMALUNGUN WA 1BCD ; [.2690.0020.0004.1BCD] # BATAK LETTER PAKPAK WA 1BCE ; [.2691.0020.0002.1BCE] # BATAK LETTER GA 1BCF ; [.2691.0020.0004.1BCF] # BATAK LETTER SIMALUNGUN GA 1BD0 ; [.2692.0020.0002.1BD0] # BATAK LETTER JA 1BD1 ; [.2693.0020.0002.1BD1] # BATAK LETTER DA 1BD2 ; [.2694.0020.0002.1BD2] # BATAK LETTER RA 1BD3 ; [.2694.0020.0004.1BD3] # BATAK LETTER SIMALUNGUN RA 1BD4 ; [.2695.0020.0002.1BD4] # BATAK LETTER MA 1BD5 ; [.2695.0020.0004.1BD5] # BATAK LETTER SIMALUNGUN MA 1BD6 ; [.2696.0020.0002.1BD6] # BATAK LETTER SOUTHERN TA 1BD7 ; [.2696.0020.0004.1BD7] # BATAK LETTER NORTHERN TA 1BD8 ; [.2697.0020.0002.1BD8] # BATAK LETTER SA 1BD9 ; [.2697.0020.0004.1BD9] # BATAK LETTER SIMALUNGUN SA 1BDA ; [.2697.0020.0004.1BDA] # BATAK LETTER MANDAILING SA 1BDB ; [.2698.0020.0002.1BDB] # BATAK LETTER YA 1BDC ; [.2698.0020.0004.1BDC] # BATAK LETTER SIMALUNGUN YA 1BDD ; [.2699.0020.0002.1BDD] # BATAK LETTER NGA 1BDE ; [.269A.0020.0002.1BDE] # BATAK LETTER LA 1BDF ; [.269A.0020.0004.1BDF] # BATAK LETTER SIMALUNGUN LA 1BE0 ; [.269B.0020.0002.1BE0] # BATAK LETTER NYA 1BE1 ; [.269C.0020.0002.1BE1] # BATAK LETTER CA 1BE2 ; [.269D.0020.0002.1BE2] # BATAK LETTER NDA 1BE3 ; [.269E.0020.0002.1BE3] # BATAK LETTER MBA 1BE4 ; [.269F.0020.0002.1BE4] # BATAK LETTER I 1BE5 ; [.26A0.0020.0002.1BE5] # BATAK LETTER U 1BE7 ; [.26A1.0020.0002.1BE7] # BATAK VOWEL SIGN E 1BE8 ; [.26A1.0020.0004.1BE8] # BATAK VOWEL SIGN PAKPAK E 1BE9 ; [.26A2.0020.0002.1BE9] # BATAK VOWEL SIGN EE 1BEA ; [.26A3.0020.0002.1BEA] # BATAK VOWEL SIGN I 1BEB ; [.26A3.0020.0004.1BEB] # BATAK VOWEL SIGN KARO I 1BEC ; [.26A4.0020.0002.1BEC] # BATAK VOWEL SIGN O 1BED ; [.26A4.0020.0004.1BED] # BATAK VOWEL SIGN KARO O 1BEE ; [.26A5.0020.0002.1BEE] # BATAK VOWEL SIGN U 1BEF ; [.26A5.0020.0004.1BEF] # BATAK VOWEL SIGN U FOR SIMALUNGUN SA 1BF0 ; [.26A6.0020.0002.1BF0] # BATAK CONSONANT SIGN NG 1BF1 ; [.26A7.0020.0002.1BF1] # BATAK CONSONANT SIGN H 1BF2 ; [.26A8.0020.0002.1BF2] # BATAK PANGOLAT 1BF3 ; [.26A9.0020.0002.1BF3] # BATAK PANONGONAN A930 ; [.26AA.0020.0002.A930] # REJANG LETTER KA A931 ; [.26AB.0020.0002.A931] # REJANG LETTER GA A932 ; [.26AC.0020.0002.A932] # REJANG LETTER NGA A933 ; [.26AD.0020.0002.A933] # REJANG LETTER TA A934 ; [.26AE.0020.0002.A934] # REJANG LETTER DA A935 ; [.26AF.0020.0002.A935] # REJANG LETTER NA A936 ; [.26B0.0020.0002.A936] # REJANG LETTER PA A937 ; [.26B1.0020.0002.A937] # REJANG LETTER BA A938 ; [.26B2.0020.0002.A938] # REJANG LETTER MA A939 ; [.26B3.0020.0002.A939] # REJANG LETTER CA A93A ; [.26B4.0020.0002.A93A] # REJANG LETTER JA A93B ; [.26B5.0020.0002.A93B] # REJANG LETTER NYA A93C ; [.26B6.0020.0002.A93C] # REJANG LETTER SA A93D ; [.26B7.0020.0002.A93D] # REJANG LETTER RA A93E ; [.26B8.0020.0002.A93E] # REJANG LETTER LA A93F ; [.26B9.0020.0002.A93F] # REJANG LETTER YA A940 ; [.26BA.0020.0002.A940] # REJANG LETTER WA A941 ; [.26BB.0020.0002.A941] # REJANG LETTER HA A942 ; [.26BC.0020.0002.A942] # REJANG LETTER MBA A943 ; [.26BD.0020.0002.A943] # REJANG LETTER NGGA A944 ; [.26BE.0020.0002.A944] # REJANG LETTER NDA A945 ; [.26BF.0020.0002.A945] # REJANG LETTER NYJA A946 ; [.26C0.0020.0002.A946] # REJANG LETTER A A947 ; [.26C1.0020.0002.A947] # REJANG VOWEL SIGN I A948 ; [.26C2.0020.0002.A948] # REJANG VOWEL SIGN U A949 ; [.26C3.0020.0002.A949] # REJANG VOWEL SIGN E A94A ; [.26C4.0020.0002.A94A] # REJANG VOWEL SIGN AI A94B ; [.26C5.0020.0002.A94B] # REJANG VOWEL SIGN O A94C ; [.26C6.0020.0002.A94C] # REJANG VOWEL SIGN AU A94D ; [.26C7.0020.0002.A94D] # REJANG VOWEL SIGN EU A94E ; [.26C8.0020.0002.A94E] # REJANG VOWEL SIGN EA A94F ; [.26C9.0020.0002.A94F] # REJANG CONSONANT SIGN NG A950 ; [.26CA.0020.0002.A950] # REJANG CONSONANT SIGN N A951 ; [.26CB.0020.0002.A951] # REJANG CONSONANT SIGN R A952 ; [.26CC.0020.0002.A952] # REJANG CONSONANT SIGN H A953 ; [.26CD.0020.0002.A953] # REJANG VIRAMA A90A ; [.26CE.0020.0002.A90A] # KAYAH LI LETTER KA A90B ; [.26CF.0020.0002.A90B] # KAYAH LI LETTER KHA A90C ; [.26D0.0020.0002.A90C] # KAYAH LI LETTER GA A90D ; [.26D1.0020.0002.A90D] # KAYAH LI LETTER NGA A90E ; [.26D2.0020.0002.A90E] # KAYAH LI LETTER SA A90F ; [.26D3.0020.0002.A90F] # KAYAH LI LETTER SHA A910 ; [.26D4.0020.0002.A910] # KAYAH LI LETTER ZA A911 ; [.26D5.0020.0002.A911] # KAYAH LI LETTER NYA A912 ; [.26D6.0020.0002.A912] # KAYAH LI LETTER TA A913 ; [.26D7.0020.0002.A913] # KAYAH LI LETTER HTA A914 ; [.26D8.0020.0002.A914] # KAYAH LI LETTER NA A915 ; [.26D9.0020.0002.A915] # KAYAH LI LETTER PA A916 ; [.26DA.0020.0002.A916] # KAYAH LI LETTER PHA A917 ; [.26DB.0020.0002.A917] # KAYAH LI LETTER MA A918 ; [.26DC.0020.0002.A918] # KAYAH LI LETTER DA A919 ; [.26DD.0020.0002.A919] # KAYAH LI LETTER BA A91A ; [.26DE.0020.0002.A91A] # KAYAH LI LETTER RA A91B ; [.26DF.0020.0002.A91B] # KAYAH LI LETTER YA A91C ; [.26E0.0020.0002.A91C] # KAYAH LI LETTER LA A91D ; [.26E1.0020.0002.A91D] # KAYAH LI LETTER WA A91E ; [.26E2.0020.0002.A91E] # KAYAH LI LETTER THA A91F ; [.26E3.0020.0002.A91F] # KAYAH LI LETTER HA A920 ; [.26E4.0020.0002.A920] # KAYAH LI LETTER VA A921 ; [.26E5.0020.0002.A921] # KAYAH LI LETTER CA A922 ; [.26E6.0020.0002.A922] # KAYAH LI LETTER A A923 ; [.26E7.0020.0002.A923] # KAYAH LI LETTER OE A924 ; [.26E8.0020.0002.A924] # KAYAH LI LETTER I A925 ; [.26E9.0020.0002.A925] # KAYAH LI LETTER OO A926 ; [.26EA.0020.0002.A926] # KAYAH LI VOWEL UE A927 ; [.26EB.0020.0002.A927] # KAYAH LI VOWEL E A928 ; [.26EC.0020.0002.A928] # KAYAH LI VOWEL U A929 ; [.26ED.0020.0002.A929] # KAYAH LI VOWEL EE A92A ; [.26EE.0020.0002.A92A] # KAYAH LI VOWEL O 1000 ; [.26EF.0020.0002.1000] # MYANMAR LETTER KA 1075 ; [.26F0.0020.0002.1075] # MYANMAR LETTER SHAN KA 1001 ; [.26F1.0020.0002.1001] # MYANMAR LETTER KHA 1076 ; [.26F2.0020.0002.1076] # MYANMAR LETTER SHAN KHA 1002 ; [.26F3.0020.0002.1002] # MYANMAR LETTER GA 1077 ; [.26F4.0020.0002.1077] # MYANMAR LETTER SHAN GA AA60 ; [.26F5.0020.0002.AA60] # MYANMAR LETTER KHAMTI GA 1003 ; [.26F6.0020.0002.1003] # MYANMAR LETTER GHA 1004 ; [.26F7.0020.0002.1004] # MYANMAR LETTER NGA 105A ; [.26F8.0020.0002.105A] # MYANMAR LETTER MON NGA 1005 ; [.26F9.0020.0002.1005] # MYANMAR LETTER CA 1078 ; [.26FA.0020.0002.1078] # MYANMAR LETTER SHAN CA AA61 ; [.26FB.0020.0002.AA61] # MYANMAR LETTER KHAMTI CA 1006 ; [.26FC.0020.0002.1006] # MYANMAR LETTER CHA AA62 ; [.26FD.0020.0002.AA62] # MYANMAR LETTER KHAMTI CHA 1007 ; [.26FE.0020.0002.1007] # MYANMAR LETTER JA AA63 ; [.26FF.0020.0002.AA63] # MYANMAR LETTER KHAMTI JA 1079 ; [.2700.0020.0002.1079] # MYANMAR LETTER SHAN ZA AA72 ; [.2701.0020.0002.AA72] # MYANMAR LETTER KHAMTI ZA 1008 ; [.2702.0020.0002.1008] # MYANMAR LETTER JHA 105B ; [.2703.0020.0002.105B] # MYANMAR LETTER MON JHA AA64 ; [.2704.0020.0002.AA64] # MYANMAR LETTER KHAMTI JHA 1061 ; [.2705.0020.0002.1061] # MYANMAR LETTER SGAW KAREN SHA 1009 ; [.2706.0020.0002.1009] # MYANMAR LETTER NYA 107A ; [.2707.0020.0002.107A] # MYANMAR LETTER SHAN NYA AA65 ; [.2708.0020.0002.AA65] # MYANMAR LETTER KHAMTI NYA 100A ; [.2709.0020.0002.100A] # MYANMAR LETTER NNYA 100B ; [.270A.0020.0002.100B] # MYANMAR LETTER TTA AA66 ; [.270B.0020.0002.AA66] # MYANMAR LETTER KHAMTI TTA 100C ; [.270C.0020.0002.100C] # MYANMAR LETTER TTHA AA67 ; [.270D.0020.0002.AA67] # MYANMAR LETTER KHAMTI TTHA 100D ; [.270E.0020.0002.100D] # MYANMAR LETTER DDA AA68 ; [.270F.0020.0002.AA68] # MYANMAR LETTER KHAMTI DDA 100E ; [.2710.0020.0002.100E] # MYANMAR LETTER DDHA AA69 ; [.2711.0020.0002.AA69] # MYANMAR LETTER KHAMTI DDHA 100F ; [.2712.0020.0002.100F] # MYANMAR LETTER NNA 106E ; [.2713.0020.0002.106E] # MYANMAR LETTER EASTERN PWO KAREN NNA 1010 ; [.2714.0020.0002.1010] # MYANMAR LETTER TA 1011 ; [.2715.0020.0002.1011] # MYANMAR LETTER THA 1012 ; [.2716.0020.0002.1012] # MYANMAR LETTER DA 107B ; [.2717.0020.0002.107B] # MYANMAR LETTER SHAN DA 1013 ; [.2718.0020.0002.1013] # MYANMAR LETTER DHA AA6A ; [.2719.0020.0002.AA6A] # MYANMAR LETTER KHAMTI DHA 1014 ; [.271A.0020.0002.1014] # MYANMAR LETTER NA 107C ; [.271B.0020.0002.107C] # MYANMAR LETTER SHAN NA AA6B ; [.271C.0020.0002.AA6B] # MYANMAR LETTER KHAMTI NA 105E ; [.271D.0020.0002.105E] # MYANMAR CONSONANT SIGN MON MEDIAL NA 1015 ; [.271E.0020.0002.1015] # MYANMAR LETTER PA 1016 ; [.271F.0020.0002.1016] # MYANMAR LETTER PHA 107D ; [.2720.0020.0002.107D] # MYANMAR LETTER SHAN PHA 107E ; [.2721.0020.0002.107E] # MYANMAR LETTER SHAN FA AA6F ; [.2722.0020.0002.AA6F] # MYANMAR LETTER KHAMTI FA 108E ; [.2723.0020.0002.108E] # MYANMAR LETTER RUMAI PALAUNG FA 1017 ; [.2724.0020.0002.1017] # MYANMAR LETTER BA 107F ; [.2725.0020.0002.107F] # MYANMAR LETTER SHAN BA 1018 ; [.2726.0020.0002.1018] # MYANMAR LETTER BHA 1019 ; [.2727.0020.0002.1019] # MYANMAR LETTER MA 105F ; [.2728.0020.0002.105F] # MYANMAR CONSONANT SIGN MON MEDIAL MA 101A ; [.2729.0020.0002.101A] # MYANMAR LETTER YA 103B ; [.272A.0020.0002.103B] # MYANMAR CONSONANT SIGN MEDIAL YA 101B ; [.272B.0020.0002.101B] # MYANMAR LETTER RA AA73 ; [.272C.0020.0002.AA73] # MYANMAR LETTER KHAMTI RA AA7A ; [.272D.0020.0002.AA7A] # MYANMAR LETTER AITON RA 103C ; [.272E.0020.0002.103C] # MYANMAR CONSONANT SIGN MEDIAL RA 101C ; [.272F.0020.0002.101C] # MYANMAR LETTER LA 1060 ; [.2730.0020.0002.1060] # MYANMAR CONSONANT SIGN MON MEDIAL LA 101D ; [.2731.0020.0002.101D] # MYANMAR LETTER WA 103D ; [.2732.0020.0002.103D] # MYANMAR CONSONANT SIGN MEDIAL WA 1082 ; [.2733.0020.0002.1082] # MYANMAR CONSONANT SIGN SHAN MEDIAL WA 1080 ; [.2734.0020.0002.1080] # MYANMAR LETTER SHAN THA 1050 ; [.2735.0020.0002.1050] # MYANMAR LETTER SHA 1051 ; [.2736.0020.0002.1051] # MYANMAR LETTER SSA 1065 ; [.2737.0020.0002.1065] # MYANMAR LETTER WESTERN PWO KAREN THA 101E ; [.2738.0020.0002.101E] # MYANMAR LETTER SA 103F ; [.2738.0020.0004.103F][.276F.0020.0004.103F][.2738.0020.001F.103F] # MYANMAR LETTER GREAT SA AA6C ; [.2739.0020.0002.AA6C] # MYANMAR LETTER KHAMTI SA 101F ; [.273A.0020.0002.101F] # MYANMAR LETTER HA 1081 ; [.273B.0020.0002.1081] # MYANMAR LETTER SHAN HA AA6D ; [.273C.0020.0002.AA6D] # MYANMAR LETTER KHAMTI HA 103E ; [.273D.0020.0002.103E] # MYANMAR CONSONANT SIGN MEDIAL HA AA6E ; [.273E.0020.0002.AA6E] # MYANMAR LETTER KHAMTI HHA AA71 ; [.273F.0020.0002.AA71] # MYANMAR LETTER KHAMTI XA 1020 ; [.2740.0020.0002.1020] # MYANMAR LETTER LLA 105C ; [.2741.0020.0002.105C] # MYANMAR LETTER MON BBA 105D ; [.2742.0020.0002.105D] # MYANMAR LETTER MON BBE 106F ; [.2743.0020.0002.106F] # MYANMAR LETTER EASTERN PWO KAREN YWA 1070 ; [.2744.0020.0002.1070] # MYANMAR LETTER EASTERN PWO KAREN GHWA 1066 ; [.2745.0020.0002.1066] # MYANMAR LETTER WESTERN PWO KAREN PWA 1021 ; [.2746.0020.0002.1021] # MYANMAR LETTER A 1022 ; [.2747.0020.0002.1022] # MYANMAR LETTER SHAN A 1023 ; [.2748.0020.0002.1023] # MYANMAR LETTER I 1024 ; [.2749.0020.0002.1024] # MYANMAR LETTER II 1025 ; [.274A.0020.0002.1025] # MYANMAR LETTER U 1026 ; [.274B.0020.0002.1026] # MYANMAR LETTER UU 1025 102E ; [.274B.0020.0002.1026] # MYANMAR LETTER UU 1052 ; [.274C.0020.0002.1052] # MYANMAR LETTER VOCALIC R 1053 ; [.274D.0020.0002.1053] # MYANMAR LETTER VOCALIC RR 1054 ; [.274E.0020.0002.1054] # MYANMAR LETTER VOCALIC L 1055 ; [.274F.0020.0002.1055] # MYANMAR LETTER VOCALIC LL 1027 ; [.2750.0020.0002.1027] # MYANMAR LETTER E 1028 ; [.2751.0020.0002.1028] # MYANMAR LETTER MON E 1029 ; [.2752.0020.0002.1029] # MYANMAR LETTER O 102A ; [.2753.0020.0002.102A] # MYANMAR LETTER AU 102C ; [.2754.0020.0002.102C] # MYANMAR VOWEL SIGN AA 102B ; [.2754.0020.0004.102B] # MYANMAR VOWEL SIGN TALL AA 1083 ; [.2755.0020.0002.1083] # MYANMAR VOWEL SIGN SHAN AA 1072 ; [.2756.0020.0002.1072] # MYANMAR VOWEL SIGN KAYAH OE 109C ; [.2757.0020.0002.109C] # MYANMAR VOWEL SIGN AITON A 102D ; [.2758.0020.0002.102D] # MYANMAR VOWEL SIGN I 1071 ; [.2759.0020.0002.1071] # MYANMAR VOWEL SIGN GEBA KAREN I 102E ; [.275A.0020.0002.102E] # MYANMAR VOWEL SIGN II 1033 ; [.275B.0020.0002.1033] # MYANMAR VOWEL SIGN MON II 102F ; [.275C.0020.0002.102F] # MYANMAR VOWEL SIGN U 1073 ; [.275D.0020.0002.1073] # MYANMAR VOWEL SIGN KAYAH U 1074 ; [.275E.0020.0002.1074] # MYANMAR VOWEL SIGN KAYAH EE 1030 ; [.275F.0020.0002.1030] # MYANMAR VOWEL SIGN UU 1056 ; [.2760.0020.0002.1056] # MYANMAR VOWEL SIGN VOCALIC R 1057 ; [.2761.0020.0002.1057] # MYANMAR VOWEL SIGN VOCALIC RR 1058 ; [.2762.0020.0002.1058] # MYANMAR VOWEL SIGN VOCALIC L 1059 ; [.2763.0020.0002.1059] # MYANMAR VOWEL SIGN VOCALIC LL 1031 ; [.2764.0020.0002.1031] # MYANMAR VOWEL SIGN E 1084 ; [.2765.0020.0002.1084] # MYANMAR VOWEL SIGN SHAN E 1035 ; [.2766.0020.0002.1035] # MYANMAR VOWEL SIGN E ABOVE 1085 ; [.2767.0020.0002.1085] # MYANMAR VOWEL SIGN SHAN E ABOVE 1032 ; [.2768.0020.0002.1032] # MYANMAR VOWEL SIGN AI 109D ; [.2769.0020.0002.109D] # MYANMAR VOWEL SIGN AITON AI 1034 ; [.276A.0020.0002.1034] # MYANMAR VOWEL SIGN MON O 1062 ; [.276B.0020.0002.1062] # MYANMAR VOWEL SIGN SGAW KAREN EU 1067 ; [.276C.0020.0002.1067] # MYANMAR VOWEL SIGN WESTERN PWO KAREN EU 1068 ; [.276D.0020.0002.1068] # MYANMAR VOWEL SIGN WESTERN PWO KAREN UE 1086 ; [.276E.0020.0002.1086] # MYANMAR VOWEL SIGN SHAN FINAL Y 1039 ; [.276F.0020.0002.1039] # MYANMAR SIGN VIRAMA 103A ; [.2770.0020.0002.103A] # MYANMAR SIGN ASAT 1063 ; [.2771.0020.0002.1063] # MYANMAR TONE MARK SGAW KAREN HATHI 1064 ; [.2772.0020.0002.1064] # MYANMAR TONE MARK SGAW KAREN KE PHO 1069 ; [.2773.0020.0002.1069] # MYANMAR SIGN WESTERN PWO KAREN TONE-1 106A ; [.2774.0020.0002.106A] # MYANMAR SIGN WESTERN PWO KAREN TONE-2 106B ; [.2775.0020.0002.106B] # MYANMAR SIGN WESTERN PWO KAREN TONE-3 106C ; [.2776.0020.0002.106C] # MYANMAR SIGN WESTERN PWO KAREN TONE-4 106D ; [.2777.0020.0002.106D] # MYANMAR SIGN WESTERN PWO KAREN TONE-5 1087 ; [.2778.0020.0002.1087] # MYANMAR SIGN SHAN TONE-2 108B ; [.2779.0020.0002.108B] # MYANMAR SIGN SHAN COUNCIL TONE-2 1088 ; [.277A.0020.0002.1088] # MYANMAR SIGN SHAN TONE-3 108C ; [.277B.0020.0002.108C] # MYANMAR SIGN SHAN COUNCIL TONE-3 1089 ; [.277C.0020.0002.1089] # MYANMAR SIGN SHAN TONE-5 108A ; [.277D.0020.0002.108A] # MYANMAR SIGN SHAN TONE-6 108F ; [.277E.0020.0002.108F] # MYANMAR SIGN RUMAI PALAUNG TONE-5 109A ; [.277F.0020.0002.109A] # MYANMAR SIGN KHAMTI TONE-1 109B ; [.2780.0020.0002.109B] # MYANMAR SIGN KHAMTI TONE-3 AA7B ; [.2781.0020.0002.AA7B] # MYANMAR SIGN PAO KAREN TONE AA74 ; [.2782.0020.0002.AA74] # MYANMAR LOGOGRAM KHAMTI OAY AA75 ; [.2783.0020.0002.AA75] # MYANMAR LOGOGRAM KHAMTI QN AA76 ; [.2784.0020.0002.AA76] # MYANMAR LOGOGRAM KHAMTI HM 11103 ; [.2785.0020.0002.11103] # CHAKMA LETTER AA 11104 ; [.2786.0020.0002.11104] # CHAKMA LETTER I 11105 ; [.2787.0020.0002.11105] # CHAKMA LETTER U 11106 ; [.2788.0020.0002.11106] # CHAKMA LETTER E 11107 ; [.2789.0020.0002.11107] # CHAKMA LETTER KAA 11108 ; [.278A.0020.0002.11108] # CHAKMA LETTER KHAA 11109 ; [.278B.0020.0002.11109] # CHAKMA LETTER GAA 1110A ; [.278C.0020.0002.1110A] # CHAKMA LETTER GHAA 1110B ; [.278D.0020.0002.1110B] # CHAKMA LETTER NGAA 1110C ; [.278E.0020.0002.1110C] # CHAKMA LETTER CAA 1110D ; [.278F.0020.0002.1110D] # CHAKMA LETTER CHAA 1110E ; [.2790.0020.0002.1110E] # CHAKMA LETTER JAA 1110F ; [.2791.0020.0002.1110F] # CHAKMA LETTER JHAA 11110 ; [.2792.0020.0002.11110] # CHAKMA LETTER NYAA 11111 ; [.2793.0020.0002.11111] # CHAKMA LETTER TTAA 11112 ; [.2794.0020.0002.11112] # CHAKMA LETTER TTHAA 11113 ; [.2795.0020.0002.11113] # CHAKMA LETTER DDAA 11114 ; [.2796.0020.0002.11114] # CHAKMA LETTER DDHAA 11115 ; [.2797.0020.0002.11115] # CHAKMA LETTER NNAA 11116 ; [.2798.0020.0002.11116] # CHAKMA LETTER TAA 11117 ; [.2799.0020.0002.11117] # CHAKMA LETTER THAA 11118 ; [.279A.0020.0002.11118] # CHAKMA LETTER DAA 11119 ; [.279B.0020.0002.11119] # CHAKMA LETTER DHAA 1111A ; [.279C.0020.0002.1111A] # CHAKMA LETTER NAA 1111B ; [.279D.0020.0002.1111B] # CHAKMA LETTER PAA 1111C ; [.279E.0020.0002.1111C] # CHAKMA LETTER PHAA 1111D ; [.279F.0020.0002.1111D] # CHAKMA LETTER BAA 1111E ; [.27A0.0020.0002.1111E] # CHAKMA LETTER BHAA 1111F ; [.27A1.0020.0002.1111F] # CHAKMA LETTER MAA 11120 ; [.27A2.0020.0002.11120] # CHAKMA LETTER YYAA 11121 ; [.27A3.0020.0002.11121] # CHAKMA LETTER YAA 11122 ; [.27A4.0020.0002.11122] # CHAKMA LETTER RAA 11123 ; [.27A5.0020.0002.11123] # CHAKMA LETTER LAA 11124 ; [.27A6.0020.0002.11124] # CHAKMA LETTER WAA 11125 ; [.27A7.0020.0002.11125] # CHAKMA LETTER SAA 11126 ; [.27A8.0020.0002.11126] # CHAKMA LETTER HAA 11127 ; [.27A9.0020.0002.11127] # CHAKMA VOWEL SIGN A 11128 ; [.27AA.0020.0002.11128] # CHAKMA VOWEL SIGN I 11129 ; [.27AB.0020.0002.11129] # CHAKMA VOWEL SIGN II 1112A ; [.27AC.0020.0002.1112A] # CHAKMA VOWEL SIGN U 1112B ; [.27AD.0020.0002.1112B] # CHAKMA VOWEL SIGN UU 1112C ; [.27AE.0020.0002.1112C] # CHAKMA VOWEL SIGN E 1112D ; [.27AF.0020.0002.1112D] # CHAKMA VOWEL SIGN AI 1112E ; [.27B0.0020.0002.1112E] # CHAKMA VOWEL SIGN O 11131 11127 ; [.27B0.0020.0002.1112E] # CHAKMA VOWEL SIGN O 1112F ; [.27B1.0020.0002.1112F] # CHAKMA VOWEL SIGN AU 11132 11127 ; [.27B1.0020.0002.1112F] # CHAKMA VOWEL SIGN AU 11130 ; [.27B2.0020.0002.11130] # CHAKMA VOWEL SIGN OI 11131 ; [.27B3.0020.0002.11131] # CHAKMA O MARK 11132 ; [.27B4.0020.0002.11132] # CHAKMA AU MARK 11133 ; [.27B5.0020.0002.11133] # CHAKMA VIRAMA 11134 ; [.27B6.0020.0002.11134] # CHAKMA MAAYYAA 1780 ; [.27B7.0020.0002.1780] # KHMER LETTER KA 1781 ; [.27B8.0020.0002.1781] # KHMER LETTER KHA 1782 ; [.27B9.0020.0002.1782] # KHMER LETTER KO 1783 ; [.27BA.0020.0002.1783] # KHMER LETTER KHO 1784 ; [.27BB.0020.0002.1784] # KHMER LETTER NGO 1785 ; [.27BC.0020.0002.1785] # KHMER LETTER CA 1786 ; [.27BD.0020.0002.1786] # KHMER LETTER CHA 1787 ; [.27BE.0020.0002.1787] # KHMER LETTER CO 1788 ; [.27BF.0020.0002.1788] # KHMER LETTER CHO 1789 ; [.27C0.0020.0002.1789] # KHMER LETTER NYO 178A ; [.27C1.0020.0002.178A] # KHMER LETTER DA 178B ; [.27C2.0020.0002.178B] # KHMER LETTER TTHA 178C ; [.27C3.0020.0002.178C] # KHMER LETTER DO 178D ; [.27C4.0020.0002.178D] # KHMER LETTER TTHO 178E ; [.27C5.0020.0002.178E] # KHMER LETTER NNO 178F ; [.27C6.0020.0002.178F] # KHMER LETTER TA 1790 ; [.27C7.0020.0002.1790] # KHMER LETTER THA 1791 ; [.27C8.0020.0002.1791] # KHMER LETTER TO 1792 ; [.27C9.0020.0002.1792] # KHMER LETTER THO 1793 ; [.27CA.0020.0002.1793] # KHMER LETTER NO 1794 ; [.27CB.0020.0002.1794] # KHMER LETTER BA 1795 ; [.27CC.0020.0002.1795] # KHMER LETTER PHA 1796 ; [.27CD.0020.0002.1796] # KHMER LETTER PO 1797 ; [.27CE.0020.0002.1797] # KHMER LETTER PHO 1798 ; [.27CF.0020.0002.1798] # KHMER LETTER MO 1799 ; [.27D0.0020.0002.1799] # KHMER LETTER YO 179A ; [.27D1.0020.0002.179A] # KHMER LETTER RO 179B ; [.27D2.0020.0002.179B] # KHMER LETTER LO 179C ; [.27D3.0020.0002.179C] # KHMER LETTER VO 179D ; [.27D4.0020.0002.179D] # KHMER LETTER SHA 179E ; [.27D5.0020.0002.179E] # KHMER LETTER SSO 179F ; [.27D6.0020.0002.179F] # KHMER LETTER SA 17A0 ; [.27D7.0020.0002.17A0] # KHMER LETTER HA 17A1 ; [.27D8.0020.0002.17A1] # KHMER LETTER LA 17A2 ; [.27D9.0020.0002.17A2] # KHMER LETTER QA 17DC ; [.27DA.0020.0002.17DC] # KHMER SIGN AVAKRAHASANYA 17A3 ; [.27DB.0020.0002.17A3] # KHMER INDEPENDENT VOWEL QAQ 17A4 ; [.27DC.0020.0002.17A4] # KHMER INDEPENDENT VOWEL QAA 17A5 ; [.27DD.0020.0002.17A5] # KHMER INDEPENDENT VOWEL QI 17A6 ; [.27DE.0020.0002.17A6] # KHMER INDEPENDENT VOWEL QII 17A7 ; [.27DF.0020.0002.17A7] # KHMER INDEPENDENT VOWEL QU 17A8 ; [.27E0.0020.0002.17A8] # KHMER INDEPENDENT VOWEL QUK 17A9 ; [.27E1.0020.0002.17A9] # KHMER INDEPENDENT VOWEL QUU 17AA ; [.27E2.0020.0002.17AA] # KHMER INDEPENDENT VOWEL QUUV 17AB ; [.27E3.0020.0002.17AB] # KHMER INDEPENDENT VOWEL RY 17AC ; [.27E4.0020.0002.17AC] # KHMER INDEPENDENT VOWEL RYY 17AD ; [.27E5.0020.0002.17AD] # KHMER INDEPENDENT VOWEL LY 17AE ; [.27E6.0020.0002.17AE] # KHMER INDEPENDENT VOWEL LYY 17AF ; [.27E7.0020.0002.17AF] # KHMER INDEPENDENT VOWEL QE 17B0 ; [.27E8.0020.0002.17B0] # KHMER INDEPENDENT VOWEL QAI 17B1 ; [.27E9.0020.0002.17B1] # KHMER INDEPENDENT VOWEL QOO TYPE ONE 17B2 ; [.27EA.0020.0002.17B2] # KHMER INDEPENDENT VOWEL QOO TYPE TWO 17B3 ; [.27EB.0020.0002.17B3] # KHMER INDEPENDENT VOWEL QAU 17B6 ; [.27EC.0020.0002.17B6] # KHMER VOWEL SIGN AA 17B7 ; [.27ED.0020.0002.17B7] # KHMER VOWEL SIGN I 17B8 ; [.27EE.0020.0002.17B8] # KHMER VOWEL SIGN II 17B9 ; [.27EF.0020.0002.17B9] # KHMER VOWEL SIGN Y 17BA ; [.27F0.0020.0002.17BA] # KHMER VOWEL SIGN YY 17BB ; [.27F1.0020.0002.17BB] # KHMER VOWEL SIGN U 17BC ; [.27F2.0020.0002.17BC] # KHMER VOWEL SIGN UU 17BD ; [.27F3.0020.0002.17BD] # KHMER VOWEL SIGN UA 17BE ; [.27F4.0020.0002.17BE] # KHMER VOWEL SIGN OE 17BF ; [.27F5.0020.0002.17BF] # KHMER VOWEL SIGN YA 17C0 ; [.27F6.0020.0002.17C0] # KHMER VOWEL SIGN IE 17C1 ; [.27F7.0020.0002.17C1] # KHMER VOWEL SIGN E 17C2 ; [.27F8.0020.0002.17C2] # KHMER VOWEL SIGN AE 17C3 ; [.27F9.0020.0002.17C3] # KHMER VOWEL SIGN AI 17C4 ; [.27FA.0020.0002.17C4] # KHMER VOWEL SIGN OO 17C5 ; [.27FB.0020.0002.17C5] # KHMER VOWEL SIGN AU 17D2 ; [.27FC.0020.0002.17D2] # KHMER SIGN COENG 1950 ; [.27FD.0020.0002.1950] # TAI LE LETTER KA 1951 ; [.27FE.0020.0002.1951] # TAI LE LETTER XA 1952 ; [.27FF.0020.0002.1952] # TAI LE LETTER NGA 1953 ; [.2800.0020.0002.1953] # TAI LE LETTER TSA 1954 ; [.2801.0020.0002.1954] # TAI LE LETTER SA 1955 ; [.2802.0020.0002.1955] # TAI LE LETTER YA 1956 ; [.2803.0020.0002.1956] # TAI LE LETTER TA 1957 ; [.2804.0020.0002.1957] # TAI LE LETTER THA 1958 ; [.2805.0020.0002.1958] # TAI LE LETTER LA 1959 ; [.2806.0020.0002.1959] # TAI LE LETTER PA 195A ; [.2807.0020.0002.195A] # TAI LE LETTER PHA 195B ; [.2808.0020.0002.195B] # TAI LE LETTER MA 195C ; [.2809.0020.0002.195C] # TAI LE LETTER FA 195D ; [.280A.0020.0002.195D] # TAI LE LETTER VA 195E ; [.280B.0020.0002.195E] # TAI LE LETTER HA 195F ; [.280C.0020.0002.195F] # TAI LE LETTER QA 1960 ; [.280D.0020.0002.1960] # TAI LE LETTER KHA 1961 ; [.280E.0020.0002.1961] # TAI LE LETTER TSHA 1962 ; [.280F.0020.0002.1962] # TAI LE LETTER NA 1963 ; [.2810.0020.0002.1963] # TAI LE LETTER A 1964 ; [.2811.0020.0002.1964] # TAI LE LETTER I 1965 ; [.2812.0020.0002.1965] # TAI LE LETTER EE 1966 ; [.2813.0020.0002.1966] # TAI LE LETTER EH 1967 ; [.2814.0020.0002.1967] # TAI LE LETTER U 1968 ; [.2815.0020.0002.1968] # TAI LE LETTER OO 1969 ; [.2816.0020.0002.1969] # TAI LE LETTER O 196A ; [.2817.0020.0002.196A] # TAI LE LETTER UE 196B ; [.2818.0020.0002.196B] # TAI LE LETTER E 196C ; [.2819.0020.0002.196C] # TAI LE LETTER AUE 196D ; [.281A.0020.0002.196D] # TAI LE LETTER AI 1970 ; [.281B.0020.0002.1970] # TAI LE LETTER TONE-2 1971 ; [.281C.0020.0002.1971] # TAI LE LETTER TONE-3 1972 ; [.281D.0020.0002.1972] # TAI LE LETTER TONE-4 1973 ; [.281E.0020.0002.1973] # TAI LE LETTER TONE-5 1974 ; [.281F.0020.0002.1974] # TAI LE LETTER TONE-6 1980 ; [.2820.0020.0002.1980] # NEW TAI LUE LETTER HIGH QA 1981 ; [.2821.0020.0002.1981] # NEW TAI LUE LETTER LOW QA 1982 ; [.2822.0020.0002.1982] # NEW TAI LUE LETTER HIGH KA 1983 ; [.2823.0020.0002.1983] # NEW TAI LUE LETTER HIGH XA 1984 ; [.2824.0020.0002.1984] # NEW TAI LUE LETTER HIGH NGA 1985 ; [.2825.0020.0002.1985] # NEW TAI LUE LETTER LOW KA 1986 ; [.2826.0020.0002.1986] # NEW TAI LUE LETTER LOW XA 1987 ; [.2827.0020.0002.1987] # NEW TAI LUE LETTER LOW NGA 1988 ; [.2828.0020.0002.1988] # NEW TAI LUE LETTER HIGH TSA 1989 ; [.2829.0020.0002.1989] # NEW TAI LUE LETTER HIGH SA 198A ; [.282A.0020.0002.198A] # NEW TAI LUE LETTER HIGH YA 198B ; [.282B.0020.0002.198B] # NEW TAI LUE LETTER LOW TSA 198C ; [.282C.0020.0002.198C] # NEW TAI LUE LETTER LOW SA 198D ; [.282D.0020.0002.198D] # NEW TAI LUE LETTER LOW YA 198E ; [.282E.0020.0002.198E] # NEW TAI LUE LETTER HIGH TA 198F ; [.282F.0020.0002.198F] # NEW TAI LUE LETTER HIGH THA 1990 ; [.2830.0020.0002.1990] # NEW TAI LUE LETTER HIGH NA 1991 ; [.2831.0020.0002.1991] # NEW TAI LUE LETTER LOW TA 1992 ; [.2832.0020.0002.1992] # NEW TAI LUE LETTER LOW THA 1993 ; [.2833.0020.0002.1993] # NEW TAI LUE LETTER LOW NA 1994 ; [.2834.0020.0002.1994] # NEW TAI LUE LETTER HIGH PA 1995 ; [.2835.0020.0002.1995] # NEW TAI LUE LETTER HIGH PHA 1996 ; [.2836.0020.0002.1996] # NEW TAI LUE LETTER HIGH MA 1997 ; [.2837.0020.0002.1997] # NEW TAI LUE LETTER LOW PA 1998 ; [.2838.0020.0002.1998] # NEW TAI LUE LETTER LOW PHA 1999 ; [.2839.0020.0002.1999] # NEW TAI LUE LETTER LOW MA 199A ; [.283A.0020.0002.199A] # NEW TAI LUE LETTER HIGH FA 199B ; [.283B.0020.0002.199B] # NEW TAI LUE LETTER HIGH VA 199C ; [.283C.0020.0002.199C] # NEW TAI LUE LETTER HIGH LA 19DE ; [.283C.0020.0004.19DE][.2852.0020.0004.19DE] # NEW TAI LUE SIGN LAE 19DF ; [.283C.0020.0004.19DF][.2852.0020.0004.19DF][.285D.0020.001F.19DF] # NEW TAI LUE SIGN LAEV 199D ; [.283D.0020.0002.199D] # NEW TAI LUE LETTER LOW FA 199E ; [.283E.0020.0002.199E] # NEW TAI LUE LETTER LOW VA 199F ; [.283F.0020.0002.199F] # NEW TAI LUE LETTER LOW LA 19A0 ; [.2840.0020.0002.19A0] # NEW TAI LUE LETTER HIGH HA 19A1 ; [.2841.0020.0002.19A1] # NEW TAI LUE LETTER HIGH DA 19A2 ; [.2842.0020.0002.19A2] # NEW TAI LUE LETTER HIGH BA 19A3 ; [.2843.0020.0002.19A3] # NEW TAI LUE LETTER LOW HA 19A4 ; [.2844.0020.0002.19A4] # NEW TAI LUE LETTER LOW DA 19A5 ; [.2845.0020.0002.19A5] # NEW TAI LUE LETTER LOW BA 19A6 ; [.2846.0020.0002.19A6] # NEW TAI LUE LETTER HIGH KVA 19A7 ; [.2847.0020.0002.19A7] # NEW TAI LUE LETTER HIGH XVA 19A8 ; [.2848.0020.0002.19A8] # NEW TAI LUE LETTER LOW KVA 19A9 ; [.2849.0020.0002.19A9] # NEW TAI LUE LETTER LOW XVA 19AA ; [.284A.0020.0002.19AA] # NEW TAI LUE LETTER HIGH SUA 19AB ; [.284B.0020.0002.19AB] # NEW TAI LUE LETTER LOW SUA 19B0 ; [.284C.0020.0002.19B0] # NEW TAI LUE VOWEL SIGN VOWEL SHORTENER 19B1 ; [.284D.0020.0002.19B1] # NEW TAI LUE VOWEL SIGN AA 19B2 ; [.284E.0020.0002.19B2] # NEW TAI LUE VOWEL SIGN II 19B3 ; [.284F.0020.0002.19B3] # NEW TAI LUE VOWEL SIGN U 19B4 ; [.2850.0020.0002.19B4] # NEW TAI LUE VOWEL SIGN UU 19B5 ; [.2851.0020.0002.19B5] # NEW TAI LUE VOWEL SIGN E 19B6 ; [.2852.0020.0002.19B6] # NEW TAI LUE VOWEL SIGN AE 19B7 ; [.2853.0020.0002.19B7] # NEW TAI LUE VOWEL SIGN O 19B8 ; [.2854.0020.0002.19B8] # NEW TAI LUE VOWEL SIGN OA 19B9 ; [.2855.0020.0002.19B9] # NEW TAI LUE VOWEL SIGN UE 19BA ; [.2856.0020.0002.19BA] # NEW TAI LUE VOWEL SIGN AY 19BB ; [.2857.0020.0002.19BB] # NEW TAI LUE VOWEL SIGN AAY 19BC ; [.2858.0020.0002.19BC] # NEW TAI LUE VOWEL SIGN UY 19BD ; [.2859.0020.0002.19BD] # NEW TAI LUE VOWEL SIGN OY 19BE ; [.285A.0020.0002.19BE] # NEW TAI LUE VOWEL SIGN OAY 19BF ; [.285B.0020.0002.19BF] # NEW TAI LUE VOWEL SIGN UEY 19C0 ; [.285C.0020.0002.19C0] # NEW TAI LUE VOWEL SIGN IY 19C1 ; [.285D.0020.0002.19C1] # NEW TAI LUE LETTER FINAL V 19C2 ; [.285E.0020.0002.19C2] # NEW TAI LUE LETTER FINAL NG 19C3 ; [.285F.0020.0002.19C3] # NEW TAI LUE LETTER FINAL N 19C4 ; [.2860.0020.0002.19C4] # NEW TAI LUE LETTER FINAL M 19C5 ; [.2861.0020.0002.19C5] # NEW TAI LUE LETTER FINAL K 19C6 ; [.2862.0020.0002.19C6] # NEW TAI LUE LETTER FINAL D 19C7 ; [.2863.0020.0002.19C7] # NEW TAI LUE LETTER FINAL B 19C8 ; [.2864.0020.0002.19C8] # NEW TAI LUE TONE MARK-1 19C9 ; [.2865.0020.0002.19C9] # NEW TAI LUE TONE MARK-2 1A20 ; [.2866.0020.0002.1A20] # TAI THAM LETTER HIGH KA 1A21 ; [.2867.0020.0002.1A21] # TAI THAM LETTER HIGH KHA 1A22 ; [.2868.0020.0002.1A22] # TAI THAM LETTER HIGH KXA 1A23 ; [.2869.0020.0002.1A23] # TAI THAM LETTER LOW KA 1A24 ; [.286A.0020.0002.1A24] # TAI THAM LETTER LOW KXA 1A25 ; [.286B.0020.0002.1A25] # TAI THAM LETTER LOW KHA 1A26 ; [.286C.0020.0002.1A26] # TAI THAM LETTER NGA 1A58 ; [.286C.0020.0004.1A58] # TAI THAM SIGN MAI KANG LAI 1A59 ; [.286C.0020.0004.1A59] # TAI THAM CONSONANT SIGN FINAL NGA 1A27 ; [.286D.0020.0002.1A27] # TAI THAM LETTER HIGH CA 1A28 ; [.286E.0020.0002.1A28] # TAI THAM LETTER HIGH CHA 1A29 ; [.286F.0020.0002.1A29] # TAI THAM LETTER LOW CA 1A2A ; [.2870.0020.0002.1A2A] # TAI THAM LETTER LOW SA 1A2B ; [.2871.0020.0002.1A2B] # TAI THAM LETTER LOW CHA 1A2C ; [.2872.0020.0002.1A2C] # TAI THAM LETTER NYA 1A2D ; [.2873.0020.0002.1A2D] # TAI THAM LETTER RATA 1A2E ; [.2874.0020.0002.1A2E] # TAI THAM LETTER HIGH RATHA 1A2F ; [.2875.0020.0002.1A2F] # TAI THAM LETTER DA 1A30 ; [.2876.0020.0002.1A30] # TAI THAM LETTER LOW RATHA 1A31 ; [.2877.0020.0002.1A31] # TAI THAM LETTER RANA 1A32 ; [.2878.0020.0002.1A32] # TAI THAM LETTER HIGH TA 1A33 ; [.2879.0020.0002.1A33] # TAI THAM LETTER HIGH THA 1A34 ; [.287A.0020.0002.1A34] # TAI THAM LETTER LOW TA 1A35 ; [.287B.0020.0002.1A35] # TAI THAM LETTER LOW THA 1A36 ; [.287C.0020.0002.1A36] # TAI THAM LETTER NA 1A37 ; [.287D.0020.0002.1A37] # TAI THAM LETTER BA 1A38 ; [.287E.0020.0002.1A38] # TAI THAM LETTER HIGH PA 1A39 ; [.287F.0020.0002.1A39] # TAI THAM LETTER HIGH PHA 1A3A ; [.2880.0020.0002.1A3A] # TAI THAM LETTER HIGH FA 1A3B ; [.2881.0020.0002.1A3B] # TAI THAM LETTER LOW PA 1A5A ; [.2881.0020.0004.1A5A] # TAI THAM CONSONANT SIGN LOW PA 1A5B ; [.2881.0020.0004.1A5B] # TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA 1A3C ; [.2882.0020.0002.1A3C] # TAI THAM LETTER LOW FA 1A3D ; [.2883.0020.0002.1A3D] # TAI THAM LETTER LOW PHA 1A3E ; [.2884.0020.0002.1A3E] # TAI THAM LETTER MA 1A3F ; [.2885.0020.0002.1A3F] # TAI THAM LETTER LOW YA 1A40 ; [.2886.0020.0002.1A40] # TAI THAM LETTER HIGH YA 1A41 ; [.2887.0020.0002.1A41] # TAI THAM LETTER RA 1A42 ; [.2888.0020.0002.1A42] # TAI THAM LETTER RUE 1A43 ; [.2889.0020.0002.1A43] # TAI THAM LETTER LA 1A44 ; [.288A.0020.0002.1A44] # TAI THAM LETTER LUE 1A45 ; [.288B.0020.0002.1A45] # TAI THAM LETTER WA 1A46 ; [.288C.0020.0002.1A46] # TAI THAM LETTER HIGH SHA 1A54 ; [.288C.0020.0004.1A54][.28B2.0020.0004.1A54][.288C.0020.001F.1A54] # TAI THAM LETTER GREAT SA 1A47 ; [.288D.0020.0002.1A47] # TAI THAM LETTER HIGH SSA 1A48 ; [.288E.0020.0002.1A48] # TAI THAM LETTER HIGH SA 1A49 ; [.288F.0020.0002.1A49] # TAI THAM LETTER HIGH HA 1A4A ; [.2890.0020.0002.1A4A] # TAI THAM LETTER LLA 1A4B ; [.2891.0020.0002.1A4B] # TAI THAM LETTER A 1A4C ; [.2892.0020.0002.1A4C] # TAI THAM LETTER LOW HA 1A53 ; [.2893.0020.0002.1A53] # TAI THAM LETTER LAE 1A6B ; [.2894.0020.0002.1A6B] # TAI THAM VOWEL SIGN O 1A55 ; [.2895.0020.0002.1A55] # TAI THAM CONSONANT SIGN MEDIAL RA 1A56 ; [.2896.0020.0002.1A56] # TAI THAM CONSONANT SIGN MEDIAL LA 1A57 ; [.2897.0020.0002.1A57] # TAI THAM CONSONANT SIGN LA TANG LAI 1A5C ; [.2898.0020.0002.1A5C] # TAI THAM CONSONANT SIGN MA 1A5D ; [.2899.0020.0002.1A5D] # TAI THAM CONSONANT SIGN BA 1A5E ; [.289A.0020.0002.1A5E] # TAI THAM CONSONANT SIGN SA 1A4D ; [.289B.0020.0002.1A4D] # TAI THAM LETTER I 1A4E ; [.289C.0020.0002.1A4E] # TAI THAM LETTER II 1A4F ; [.289D.0020.0002.1A4F] # TAI THAM LETTER U 1A50 ; [.289E.0020.0002.1A50] # TAI THAM LETTER UU 1A51 ; [.289F.0020.0002.1A51] # TAI THAM LETTER EE 1A52 ; [.28A0.0020.0002.1A52] # TAI THAM LETTER OO 1A61 ; [.28A1.0020.0002.1A61] # TAI THAM VOWEL SIGN A 1A6C ; [.28A2.0020.0002.1A6C] # TAI THAM VOWEL SIGN OA BELOW 1A62 ; [.28A3.0020.0002.1A62] # TAI THAM VOWEL SIGN MAI SAT 1A63 ; [.28A4.0020.0002.1A63] # TAI THAM VOWEL SIGN AA 1A64 ; [.28A4.0020.0004.1A64] # TAI THAM VOWEL SIGN TALL AA 1A65 ; [.28A5.0020.0002.1A65] # TAI THAM VOWEL SIGN I 1A66 ; [.28A6.0020.0002.1A66] # TAI THAM VOWEL SIGN II 1A67 ; [.28A7.0020.0002.1A67] # TAI THAM VOWEL SIGN UE 1A68 ; [.28A8.0020.0002.1A68] # TAI THAM VOWEL SIGN UUE 1A69 ; [.28A9.0020.0002.1A69] # TAI THAM VOWEL SIGN U 1A6A ; [.28AA.0020.0002.1A6A] # TAI THAM VOWEL SIGN UU 1A6E ; [.28AB.0020.0002.1A6E] # TAI THAM VOWEL SIGN E 1A6F ; [.28AC.0020.0002.1A6F] # TAI THAM VOWEL SIGN AE 1A73 ; [.28AD.0020.0002.1A73] # TAI THAM VOWEL SIGN OA ABOVE 1A70 ; [.28AE.0020.0002.1A70] # TAI THAM VOWEL SIGN OO 1A71 ; [.28AF.0020.0002.1A71] # TAI THAM VOWEL SIGN AI 1A72 ; [.28B0.0020.0002.1A72] # TAI THAM VOWEL SIGN THAM AI 1A6D ; [.28B1.0020.0002.1A6D] # TAI THAM VOWEL SIGN OY 1A60 ; [.28B2.0020.0002.1A60] # TAI THAM SIGN SAKOT AA00 ; [.28B3.0020.0002.AA00] # CHAM LETTER A AA01 ; [.28B4.0020.0002.AA01] # CHAM LETTER I AA02 ; [.28B5.0020.0002.AA02] # CHAM LETTER U AA03 ; [.28B6.0020.0002.AA03] # CHAM LETTER E AA04 ; [.28B7.0020.0002.AA04] # CHAM LETTER AI AA05 ; [.28B8.0020.0002.AA05] # CHAM LETTER O AA06 ; [.28B9.0020.0002.AA06] # CHAM LETTER KA AA07 ; [.28BA.0020.0002.AA07] # CHAM LETTER KHA AA08 ; [.28BB.0020.0002.AA08] # CHAM LETTER GA AA09 ; [.28BC.0020.0002.AA09] # CHAM LETTER GHA AA0A ; [.28BD.0020.0002.AA0A] # CHAM LETTER NGUE AA0B ; [.28BE.0020.0002.AA0B] # CHAM LETTER NGA AA0C ; [.28BF.0020.0002.AA0C] # CHAM LETTER CHA AA0D ; [.28C0.0020.0002.AA0D] # CHAM LETTER CHHA AA0E ; [.28C1.0020.0002.AA0E] # CHAM LETTER JA AA0F ; [.28C2.0020.0002.AA0F] # CHAM LETTER JHA AA10 ; [.28C3.0020.0002.AA10] # CHAM LETTER NHUE AA11 ; [.28C4.0020.0002.AA11] # CHAM LETTER NHA AA12 ; [.28C5.0020.0002.AA12] # CHAM LETTER NHJA AA13 ; [.28C6.0020.0002.AA13] # CHAM LETTER TA AA14 ; [.28C7.0020.0002.AA14] # CHAM LETTER THA AA15 ; [.28C8.0020.0002.AA15] # CHAM LETTER DA AA16 ; [.28C9.0020.0002.AA16] # CHAM LETTER DHA AA17 ; [.28CA.0020.0002.AA17] # CHAM LETTER NUE AA18 ; [.28CB.0020.0002.AA18] # CHAM LETTER NA AA19 ; [.28CC.0020.0002.AA19] # CHAM LETTER DDA AA1A ; [.28CD.0020.0002.AA1A] # CHAM LETTER PA AA1B ; [.28CE.0020.0002.AA1B] # CHAM LETTER PPA AA1C ; [.28CF.0020.0002.AA1C] # CHAM LETTER PHA AA1D ; [.28D0.0020.0002.AA1D] # CHAM LETTER BA AA1E ; [.28D1.0020.0002.AA1E] # CHAM LETTER BHA AA1F ; [.28D2.0020.0002.AA1F] # CHAM LETTER MUE AA20 ; [.28D3.0020.0002.AA20] # CHAM LETTER MA AA21 ; [.28D4.0020.0002.AA21] # CHAM LETTER BBA AA22 ; [.28D5.0020.0002.AA22] # CHAM LETTER YA AA23 ; [.28D6.0020.0002.AA23] # CHAM LETTER RA AA24 ; [.28D7.0020.0002.AA24] # CHAM LETTER LA AA25 ; [.28D8.0020.0002.AA25] # CHAM LETTER VA AA26 ; [.28D9.0020.0002.AA26] # CHAM LETTER SSA AA27 ; [.28DA.0020.0002.AA27] # CHAM LETTER SA AA28 ; [.28DB.0020.0002.AA28] # CHAM LETTER HA AA33 ; [.28DC.0020.0002.AA33] # CHAM CONSONANT SIGN YA AA34 ; [.28DD.0020.0002.AA34] # CHAM CONSONANT SIGN RA AA35 ; [.28DE.0020.0002.AA35] # CHAM CONSONANT SIGN LA AA36 ; [.28DF.0020.0002.AA36] # CHAM CONSONANT SIGN WA AA29 ; [.28E0.0020.0002.AA29] # CHAM VOWEL SIGN AA AA2A ; [.28E1.0020.0002.AA2A] # CHAM VOWEL SIGN I AA2B ; [.28E2.0020.0002.AA2B] # CHAM VOWEL SIGN II AA2C ; [.28E3.0020.0002.AA2C] # CHAM VOWEL SIGN EI AA2D ; [.28E4.0020.0002.AA2D] # CHAM VOWEL SIGN U AA2E ; [.28E5.0020.0002.AA2E] # CHAM VOWEL SIGN OE AA2F ; [.28E6.0020.0002.AA2F] # CHAM VOWEL SIGN O AA30 ; [.28E7.0020.0002.AA30] # CHAM VOWEL SIGN AI AA31 ; [.28E8.0020.0002.AA31] # CHAM VOWEL SIGN AU AA32 ; [.28E9.0020.0002.AA32] # CHAM VOWEL SIGN UE AA40 ; [.28EA.0020.0002.AA40] # CHAM LETTER FINAL K AA41 ; [.28EB.0020.0002.AA41] # CHAM LETTER FINAL G AA42 ; [.28EC.0020.0002.AA42] # CHAM LETTER FINAL NG AA43 ; [.28ED.0020.0002.AA43] # CHAM CONSONANT SIGN FINAL NG AA44 ; [.28EE.0020.0002.AA44] # CHAM LETTER FINAL CH AA45 ; [.28EF.0020.0002.AA45] # CHAM LETTER FINAL T AA46 ; [.28F0.0020.0002.AA46] # CHAM LETTER FINAL N AA47 ; [.28F1.0020.0002.AA47] # CHAM LETTER FINAL P AA48 ; [.28F2.0020.0002.AA48] # CHAM LETTER FINAL Y AA49 ; [.28F3.0020.0002.AA49] # CHAM LETTER FINAL R AA4A ; [.28F4.0020.0002.AA4A] # CHAM LETTER FINAL L AA4B ; [.28F5.0020.0002.AA4B] # CHAM LETTER FINAL SS AA4C ; [.28F6.0020.0002.AA4C] # CHAM CONSONANT SIGN FINAL M AA4D ; [.28F7.0020.0002.AA4D] # CHAM CONSONANT SIGN FINAL H 1B05 ; [.28F8.0020.0002.1B05] # BALINESE LETTER AKARA 1B06 ; [.28F9.0020.0002.1B06] # BALINESE LETTER AKARA TEDUNG 1B05 1B35 ; [.28F9.0020.0002.1B06] # BALINESE LETTER AKARA TEDUNG 1B07 ; [.28FA.0020.0002.1B07] # BALINESE LETTER IKARA 1B08 ; [.28FB.0020.0002.1B08] # BALINESE LETTER IKARA TEDUNG 1B07 1B35 ; [.28FB.0020.0002.1B08] # BALINESE LETTER IKARA TEDUNG 1B09 ; [.28FC.0020.0002.1B09] # BALINESE LETTER UKARA 1B0A ; [.28FD.0020.0002.1B0A] # BALINESE LETTER UKARA TEDUNG 1B09 1B35 ; [.28FD.0020.0002.1B0A] # BALINESE LETTER UKARA TEDUNG 1B0B ; [.28FE.0020.0002.1B0B] # BALINESE LETTER RA REPA 1B0C ; [.28FF.0020.0002.1B0C] # BALINESE LETTER RA REPA TEDUNG 1B0B 1B35 ; [.28FF.0020.0002.1B0C] # BALINESE LETTER RA REPA TEDUNG 1B0D ; [.2900.0020.0002.1B0D] # BALINESE LETTER LA LENGA 1B0E ; [.2901.0020.0002.1B0E] # BALINESE LETTER LA LENGA TEDUNG 1B0D 1B35 ; [.2901.0020.0002.1B0E] # BALINESE LETTER LA LENGA TEDUNG 1B0F ; [.2902.0020.0002.1B0F] # BALINESE LETTER EKARA 1B10 ; [.2903.0020.0002.1B10] # BALINESE LETTER AIKARA 1B11 ; [.2904.0020.0002.1B11] # BALINESE LETTER OKARA 1B12 ; [.2905.0020.0002.1B12] # BALINESE LETTER OKARA TEDUNG 1B11 1B35 ; [.2905.0020.0002.1B12] # BALINESE LETTER OKARA TEDUNG 1B13 ; [.2906.0020.0002.1B13] # BALINESE LETTER KA 1B45 ; [.2907.0020.0002.1B45] # BALINESE LETTER KAF SASAK 1B46 ; [.2908.0020.0002.1B46] # BALINESE LETTER KHOT SASAK 1B14 ; [.2909.0020.0002.1B14] # BALINESE LETTER KA MAHAPRANA 1B15 ; [.290A.0020.0002.1B15] # BALINESE LETTER GA 1B16 ; [.290B.0020.0002.1B16] # BALINESE LETTER GA GORA 1B17 ; [.290C.0020.0002.1B17] # BALINESE LETTER NGA 1B18 ; [.290D.0020.0002.1B18] # BALINESE LETTER CA 1B19 ; [.290E.0020.0002.1B19] # BALINESE LETTER CA LACA 1B1A ; [.290F.0020.0002.1B1A] # BALINESE LETTER JA 1B1B ; [.2910.0020.0002.1B1B] # BALINESE LETTER JA JERA 1B1C ; [.2911.0020.0002.1B1C] # BALINESE LETTER NYA 1B1D ; [.2912.0020.0002.1B1D] # BALINESE LETTER TA LATIK 1B1E ; [.2913.0020.0002.1B1E] # BALINESE LETTER TA MURDA MAHAPRANA 1B1F ; [.2914.0020.0002.1B1F] # BALINESE LETTER DA MURDA ALPAPRANA 1B20 ; [.2915.0020.0002.1B20] # BALINESE LETTER DA MURDA MAHAPRANA 1B21 ; [.2916.0020.0002.1B21] # BALINESE LETTER NA RAMBAT 1B22 ; [.2917.0020.0002.1B22] # BALINESE LETTER TA 1B47 ; [.2918.0020.0002.1B47] # BALINESE LETTER TZIR SASAK 1B23 ; [.2919.0020.0002.1B23] # BALINESE LETTER TA TAWA 1B24 ; [.291A.0020.0002.1B24] # BALINESE LETTER DA 1B25 ; [.291B.0020.0002.1B25] # BALINESE LETTER DA MADU 1B26 ; [.291C.0020.0002.1B26] # BALINESE LETTER NA 1B27 ; [.291D.0020.0002.1B27] # BALINESE LETTER PA 1B48 ; [.291E.0020.0002.1B48] # BALINESE LETTER EF SASAK 1B28 ; [.291F.0020.0002.1B28] # BALINESE LETTER PA KAPAL 1B29 ; [.2920.0020.0002.1B29] # BALINESE LETTER BA 1B2A ; [.2921.0020.0002.1B2A] # BALINESE LETTER BA KEMBANG 1B2B ; [.2922.0020.0002.1B2B] # BALINESE LETTER MA 1B2C ; [.2923.0020.0002.1B2C] # BALINESE LETTER YA 1B2D ; [.2924.0020.0002.1B2D] # BALINESE LETTER RA 1B2E ; [.2925.0020.0002.1B2E] # BALINESE LETTER LA 1B2F ; [.2926.0020.0002.1B2F] # BALINESE LETTER WA 1B49 ; [.2927.0020.0002.1B49] # BALINESE LETTER VE SASAK 1B30 ; [.2928.0020.0002.1B30] # BALINESE LETTER SA SAGA 1B31 ; [.2929.0020.0002.1B31] # BALINESE LETTER SA SAPA 1B32 ; [.292A.0020.0002.1B32] # BALINESE LETTER SA 1B4A ; [.292B.0020.0002.1B4A] # BALINESE LETTER ZAL SASAK 1B4B ; [.292C.0020.0002.1B4B] # BALINESE LETTER ASYURA SASAK 1B33 ; [.292D.0020.0002.1B33] # BALINESE LETTER HA 1B35 ; [.292E.0020.0002.1B35] # BALINESE VOWEL SIGN TEDUNG 1B36 ; [.292F.0020.0002.1B36] # BALINESE VOWEL SIGN ULU 1B37 ; [.2930.0020.0002.1B37] # BALINESE VOWEL SIGN ULU SARI 1B38 ; [.2931.0020.0002.1B38] # BALINESE VOWEL SIGN SUKU 1B39 ; [.2932.0020.0002.1B39] # BALINESE VOWEL SIGN SUKU ILUT 1B3A ; [.2933.0020.0002.1B3A] # BALINESE VOWEL SIGN RA REPA 1B3B ; [.2934.0020.0002.1B3B] # BALINESE VOWEL SIGN RA REPA TEDUNG 1B3A 1B35 ; [.2934.0020.0002.1B3B] # BALINESE VOWEL SIGN RA REPA TEDUNG 1B3C ; [.2935.0020.0002.1B3C] # BALINESE VOWEL SIGN LA LENGA 1B3D ; [.2936.0020.0002.1B3D] # BALINESE VOWEL SIGN LA LENGA TEDUNG 1B3C 1B35 ; [.2936.0020.0002.1B3D] # BALINESE VOWEL SIGN LA LENGA TEDUNG 1B3E ; [.2937.0020.0002.1B3E] # BALINESE VOWEL SIGN TALING 1B3F ; [.2938.0020.0002.1B3F] # BALINESE VOWEL SIGN TALING REPA 1B40 ; [.2939.0020.0002.1B40] # BALINESE VOWEL SIGN TALING TEDUNG 1B3E 1B35 ; [.2939.0020.0002.1B40] # BALINESE VOWEL SIGN TALING TEDUNG 1B41 ; [.293A.0020.0002.1B41] # BALINESE VOWEL SIGN TALING REPA TEDUNG 1B3F 1B35 ; [.293A.0020.0002.1B41] # BALINESE VOWEL SIGN TALING REPA TEDUNG 1B42 ; [.293B.0020.0002.1B42] # BALINESE VOWEL SIGN PEPET 1B43 ; [.293C.0020.0002.1B43] # BALINESE VOWEL SIGN PEPET TEDUNG 1B42 1B35 ; [.293C.0020.0002.1B43] # BALINESE VOWEL SIGN PEPET TEDUNG 1B44 ; [.293D.0020.0002.1B44] # BALINESE ADEG ADEG A984 ; [.293E.0020.0002.A984] # JAVANESE LETTER A A985 ; [.293F.0020.0002.A985] # JAVANESE LETTER I KAWI A986 ; [.2940.0020.0002.A986] # JAVANESE LETTER I A987 ; [.2941.0020.0002.A987] # JAVANESE LETTER II A988 ; [.2942.0020.0002.A988] # JAVANESE LETTER U A989 ; [.2943.0020.0002.A989] # JAVANESE LETTER PA CEREK A98A ; [.2944.0020.0002.A98A] # JAVANESE LETTER NGA LELET A98B ; [.2945.0020.0002.A98B] # JAVANESE LETTER NGA LELET RASWADI A98C ; [.2946.0020.0002.A98C] # JAVANESE LETTER E A98D ; [.2947.0020.0002.A98D] # JAVANESE LETTER AI A98E ; [.2948.0020.0002.A98E] # JAVANESE LETTER O A98F ; [.2949.0020.0002.A98F] # JAVANESE LETTER KA A990 ; [.294A.0020.0002.A990] # JAVANESE LETTER KA SASAK A991 ; [.294B.0020.0002.A991] # JAVANESE LETTER KA MURDA A992 ; [.294C.0020.0002.A992] # JAVANESE LETTER GA A993 ; [.294D.0020.0002.A993] # JAVANESE LETTER GA MURDA A994 ; [.294E.0020.0002.A994] # JAVANESE LETTER NGA A995 ; [.294F.0020.0002.A995] # JAVANESE LETTER CA A996 ; [.2950.0020.0002.A996] # JAVANESE LETTER CA MURDA A997 ; [.2951.0020.0002.A997] # JAVANESE LETTER JA A998 ; [.2952.0020.0002.A998] # JAVANESE LETTER NYA MURDA A999 ; [.2953.0020.0002.A999] # JAVANESE LETTER JA MAHAPRANA A99A ; [.2954.0020.0002.A99A] # JAVANESE LETTER NYA A99B ; [.2955.0020.0002.A99B] # JAVANESE LETTER TTA A99C ; [.2956.0020.0002.A99C] # JAVANESE LETTER TTA MAHAPRANA A99D ; [.2957.0020.0002.A99D] # JAVANESE LETTER DDA A99E ; [.2958.0020.0002.A99E] # JAVANESE LETTER DDA MAHAPRANA A99F ; [.2959.0020.0002.A99F] # JAVANESE LETTER NA MURDA A9A0 ; [.295A.0020.0002.A9A0] # JAVANESE LETTER TA A9A1 ; [.295B.0020.0002.A9A1] # JAVANESE LETTER TA MURDA A9A2 ; [.295C.0020.0002.A9A2] # JAVANESE LETTER DA A9A3 ; [.295D.0020.0002.A9A3] # JAVANESE LETTER DA MAHAPRANA A9A4 ; [.295E.0020.0002.A9A4] # JAVANESE LETTER NA A9A5 ; [.295F.0020.0002.A9A5] # JAVANESE LETTER PA A9A6 ; [.2960.0020.0002.A9A6] # JAVANESE LETTER PA MURDA A9A7 ; [.2961.0020.0002.A9A7] # JAVANESE LETTER BA A9A8 ; [.2962.0020.0002.A9A8] # JAVANESE LETTER BA MURDA A9A9 ; [.2963.0020.0002.A9A9] # JAVANESE LETTER MA A9AA ; [.2964.0020.0002.A9AA] # JAVANESE LETTER YA A9BE ; [.2965.0020.0002.A9BE] # JAVANESE CONSONANT SIGN PENGKAL A9AB ; [.2966.0020.0002.A9AB] # JAVANESE LETTER RA A9AC ; [.2966.0020.0004.A9AC] # JAVANESE LETTER RA AGUNG A9BF ; [.2967.0020.0002.A9BF] # JAVANESE CONSONANT SIGN CAKRA A9AD ; [.2968.0020.0002.A9AD] # JAVANESE LETTER LA A9AE ; [.2969.0020.0002.A9AE] # JAVANESE LETTER WA A9AF ; [.296A.0020.0002.A9AF] # JAVANESE LETTER SA MURDA A9B0 ; [.296B.0020.0002.A9B0] # JAVANESE LETTER SA MAHAPRANA A9B1 ; [.296C.0020.0002.A9B1] # JAVANESE LETTER SA A9B2 ; [.296D.0020.0002.A9B2] # JAVANESE LETTER HA A9B4 ; [.296E.0020.0002.A9B4] # JAVANESE VOWEL SIGN TARUNG A9BC ; [.296F.0020.0002.A9BC] # JAVANESE VOWEL SIGN PEPET A9B6 ; [.2970.0020.0002.A9B6] # JAVANESE VOWEL SIGN WULU A9B7 ; [.2971.0020.0002.A9B7] # JAVANESE VOWEL SIGN WULU MELIK A9B8 ; [.2972.0020.0002.A9B8] # JAVANESE VOWEL SIGN SUKU A9B9 ; [.2973.0020.0002.A9B9] # JAVANESE VOWEL SIGN SUKU MENDUT A9BD ; [.2974.0020.0002.A9BD] # JAVANESE CONSONANT SIGN KERET A9BA ; [.2975.0020.0002.A9BA] # JAVANESE VOWEL SIGN TALING A9BB ; [.2976.0020.0002.A9BB] # JAVANESE VOWEL SIGN DIRGA MURE A9B5 ; [.2977.0020.0002.A9B5] # JAVANESE VOWEL SIGN TOLONG A9C0 ; [.2978.0020.0002.A9C0] # JAVANESE PANGKON 1880 ; [.2979.0020.0002.1880] # MONGOLIAN LETTER ALI GALI ANUSVARA ONE 1881 ; [.297A.0020.0002.1881] # MONGOLIAN LETTER ALI GALI VISARGA ONE 1882 ; [.297B.0020.0002.1882] # MONGOLIAN LETTER ALI GALI DAMARU 1883 ; [.297C.0020.0002.1883] # MONGOLIAN LETTER ALI GALI UBADAMA 1884 ; [.297D.0020.0002.1884] # MONGOLIAN LETTER ALI GALI INVERTED UBADAMA 1885 ; [.297E.0020.0002.1885] # MONGOLIAN LETTER ALI GALI BALUDA 1886 ; [.297F.0020.0002.1886] # MONGOLIAN LETTER ALI GALI THREE BALUDA 1843 ; [.2980.0020.0002.1843] # MONGOLIAN LETTER TODO LONG VOWEL SIGN 1820 ; [.2981.0020.0002.1820] # MONGOLIAN LETTER A 1887 ; [.2982.0020.0002.1887] # MONGOLIAN LETTER ALI GALI A 1821 ; [.2983.0020.0002.1821] # MONGOLIAN LETTER E 1844 ; [.2984.0020.0002.1844] # MONGOLIAN LETTER TODO E 185D ; [.2985.0020.0002.185D] # MONGOLIAN LETTER SIBE E 1822 ; [.2986.0020.0002.1822] # MONGOLIAN LETTER I 1845 ; [.2987.0020.0002.1845] # MONGOLIAN LETTER TODO I 185E ; [.2988.0020.0002.185E] # MONGOLIAN LETTER SIBE I 1873 ; [.2989.0020.0002.1873] # MONGOLIAN LETTER MANCHU I 1888 ; [.298A.0020.0002.1888] # MONGOLIAN LETTER ALI GALI I 185F ; [.298B.0020.0002.185F] # MONGOLIAN LETTER SIBE IY 1823 ; [.298C.0020.0002.1823] # MONGOLIAN LETTER O 1846 ; [.298D.0020.0002.1846] # MONGOLIAN LETTER TODO O 1824 ; [.298E.0020.0002.1824] # MONGOLIAN LETTER U 1847 ; [.298F.0020.0002.1847] # MONGOLIAN LETTER TODO U 1861 ; [.2990.0020.0002.1861] # MONGOLIAN LETTER SIBE U 1825 ; [.2991.0020.0002.1825] # MONGOLIAN LETTER OE 1848 ; [.2992.0020.0002.1848] # MONGOLIAN LETTER TODO OE 1826 ; [.2993.0020.0002.1826] # MONGOLIAN LETTER UE 1849 ; [.2994.0020.0002.1849] # MONGOLIAN LETTER TODO UE 1860 ; [.2995.0020.0002.1860] # MONGOLIAN LETTER SIBE UE 1827 ; [.2996.0020.0002.1827] # MONGOLIAN LETTER EE 1828 ; [.2997.0020.0002.1828] # MONGOLIAN LETTER NA 1829 ; [.2998.0020.0002.1829] # MONGOLIAN LETTER ANG 184A ; [.2999.0020.0002.184A] # MONGOLIAN LETTER TODO ANG 1862 ; [.299A.0020.0002.1862] # MONGOLIAN LETTER SIBE ANG 188A ; [.299B.0020.0002.188A] # MONGOLIAN LETTER ALI GALI NGA 189B ; [.299C.0020.0002.189B] # MONGOLIAN LETTER MANCHU ALI GALI NGA 182A ; [.299D.0020.0002.182A] # MONGOLIAN LETTER BA 184B ; [.299E.0020.0002.184B] # MONGOLIAN LETTER TODO BA 182B ; [.299F.0020.0002.182B] # MONGOLIAN LETTER PA 184C ; [.29A0.0020.0002.184C] # MONGOLIAN LETTER TODO PA 1866 ; [.29A1.0020.0002.1866] # MONGOLIAN LETTER SIBE PA 182C ; [.29A2.0020.0002.182C] # MONGOLIAN LETTER QA 184D ; [.29A3.0020.0002.184D] # MONGOLIAN LETTER TODO QA 182D ; [.29A4.0020.0002.182D] # MONGOLIAN LETTER GA 184E ; [.29A5.0020.0002.184E] # MONGOLIAN LETTER TODO GA 1864 ; [.29A6.0020.0002.1864] # MONGOLIAN LETTER SIBE GA 189A ; [.29A7.0020.0002.189A] # MONGOLIAN LETTER MANCHU ALI GALI GHA 1865 ; [.29A8.0020.0002.1865] # MONGOLIAN LETTER SIBE HA 182E ; [.29A9.0020.0002.182E] # MONGOLIAN LETTER MA 184F ; [.29AA.0020.0002.184F] # MONGOLIAN LETTER TODO MA 182F ; [.29AB.0020.0002.182F] # MONGOLIAN LETTER LA 1830 ; [.29AC.0020.0002.1830] # MONGOLIAN LETTER SA 1831 ; [.29AD.0020.0002.1831] # MONGOLIAN LETTER SHA 1867 ; [.29AE.0020.0002.1867] # MONGOLIAN LETTER SIBE SHA 189C ; [.29AF.0020.0002.189C] # MONGOLIAN LETTER MANCHU ALI GALI CA 189D ; [.29B0.0020.0002.189D] # MONGOLIAN LETTER MANCHU ALI GALI JHA 18A2 ; [.29B1.0020.0002.18A2] # MONGOLIAN LETTER MANCHU ALI GALI SSA 18A4 ; [.29B2.0020.0002.18A4] # MONGOLIAN LETTER MANCHU ALI GALI ZHA 18A5 ; [.29B3.0020.0002.18A5] # MONGOLIAN LETTER MANCHU ALI GALI ZA 1832 ; [.29B4.0020.0002.1832] # MONGOLIAN LETTER TA 1850 ; [.29B5.0020.0002.1850] # MONGOLIAN LETTER TODO TA 1868 ; [.29B6.0020.0002.1868] # MONGOLIAN LETTER SIBE TA 1833 ; [.29B7.0020.0002.1833] # MONGOLIAN LETTER DA 1851 ; [.29B8.0020.0002.1851] # MONGOLIAN LETTER TODO DA 1869 ; [.29B9.0020.0002.1869] # MONGOLIAN LETTER SIBE DA 1834 ; [.29BA.0020.0002.1834] # MONGOLIAN LETTER CHA 1852 ; [.29BB.0020.0002.1852] # MONGOLIAN LETTER TODO CHA 1871 ; [.29BC.0020.0002.1871] # MONGOLIAN LETTER SIBE CHA 185C ; [.29BD.0020.0002.185C] # MONGOLIAN LETTER TODO DZA 188B ; [.29BE.0020.0002.188B] # MONGOLIAN LETTER ALI GALI CA 1835 ; [.29BF.0020.0002.1835] # MONGOLIAN LETTER JA 1853 ; [.29C0.0020.0002.1853] # MONGOLIAN LETTER TODO JA 186A ; [.29C1.0020.0002.186A] # MONGOLIAN LETTER SIBE JA 1877 ; [.29C2.0020.0002.1877] # MONGOLIAN LETTER MANCHU ZHA 1836 ; [.29C3.0020.0002.1836] # MONGOLIAN LETTER YA 1855 ; [.29C4.0020.0002.1855] # MONGOLIAN LETTER TODO YA 1872 ; [.29C5.0020.0002.1872] # MONGOLIAN LETTER SIBE ZHA 1837 ; [.29C6.0020.0002.1837] # MONGOLIAN LETTER RA 1875 ; [.29C7.0020.0002.1875] # MONGOLIAN LETTER MANCHU RA 1838 ; [.29C8.0020.0002.1838] # MONGOLIAN LETTER WA 1856 ; [.29C9.0020.0002.1856] # MONGOLIAN LETTER TODO WA 1839 ; [.29CA.0020.0002.1839] # MONGOLIAN LETTER FA 186B ; [.29CB.0020.0002.186B] # MONGOLIAN LETTER SIBE FA 1876 ; [.29CC.0020.0002.1876] # MONGOLIAN LETTER MANCHU FA 183A ; [.29CD.0020.0002.183A] # MONGOLIAN LETTER KA 1857 ; [.29CE.0020.0002.1857] # MONGOLIAN LETTER TODO KA 1863 ; [.29CF.0020.0002.1863] # MONGOLIAN LETTER SIBE KA 1874 ; [.29D0.0020.0002.1874] # MONGOLIAN LETTER MANCHU KA 1889 ; [.29D1.0020.0002.1889] # MONGOLIAN LETTER ALI GALI KA 183B ; [.29D2.0020.0002.183B] # MONGOLIAN LETTER KHA 183C ; [.29D3.0020.0002.183C] # MONGOLIAN LETTER TSA 1854 ; [.29D4.0020.0002.1854] # MONGOLIAN LETTER TODO TSA 186E ; [.29D5.0020.0002.186E] # MONGOLIAN LETTER SIBE TSA 183D ; [.29D6.0020.0002.183D] # MONGOLIAN LETTER ZA 186F ; [.29D7.0020.0002.186F] # MONGOLIAN LETTER SIBE ZA 1858 ; [.29D8.0020.0002.1858] # MONGOLIAN LETTER TODO GAA 186C ; [.29D9.0020.0002.186C] # MONGOLIAN LETTER SIBE GAA 183E ; [.29DA.0020.0002.183E] # MONGOLIAN LETTER HAA 1859 ; [.29DB.0020.0002.1859] # MONGOLIAN LETTER TODO HAA 186D ; [.29DC.0020.0002.186D] # MONGOLIAN LETTER SIBE HAA 183F ; [.29DD.0020.0002.183F] # MONGOLIAN LETTER ZRA 1840 ; [.29DE.0020.0002.1840] # MONGOLIAN LETTER LHA 1841 ; [.29DF.0020.0002.1841] # MONGOLIAN LETTER ZHI 1842 ; [.29E0.0020.0002.1842] # MONGOLIAN LETTER CHI 185A ; [.29E1.0020.0002.185A] # MONGOLIAN LETTER TODO JIA 185B ; [.29E2.0020.0002.185B] # MONGOLIAN LETTER TODO NIA 1870 ; [.29E3.0020.0002.1870] # MONGOLIAN LETTER SIBE RAA 188C ; [.29E4.0020.0002.188C] # MONGOLIAN LETTER ALI GALI TTA 189E ; [.29E5.0020.0002.189E] # MONGOLIAN LETTER MANCHU ALI GALI TTA 188D ; [.29E6.0020.0002.188D] # MONGOLIAN LETTER ALI GALI TTHA 188E ; [.29E7.0020.0002.188E] # MONGOLIAN LETTER ALI GALI DDA 189F ; [.29E8.0020.0002.189F] # MONGOLIAN LETTER MANCHU ALI GALI DDHA 188F ; [.29E9.0020.0002.188F] # MONGOLIAN LETTER ALI GALI NNA 1890 ; [.29EA.0020.0002.1890] # MONGOLIAN LETTER ALI GALI TA 1898 ; [.29EB.0020.0002.1898] # MONGOLIAN LETTER TODO ALI GALI TA 18A0 ; [.29EC.0020.0002.18A0] # MONGOLIAN LETTER MANCHU ALI GALI TA 1891 ; [.29ED.0020.0002.1891] # MONGOLIAN LETTER ALI GALI DA 18A1 ; [.29EE.0020.0002.18A1] # MONGOLIAN LETTER MANCHU ALI GALI DHA 1892 ; [.29EF.0020.0002.1892] # MONGOLIAN LETTER ALI GALI PA 1893 ; [.29F0.0020.0002.1893] # MONGOLIAN LETTER ALI GALI PHA 18A8 ; [.29F1.0020.0002.18A8] # MONGOLIAN LETTER MANCHU ALI GALI BHA 1894 ; [.29F2.0020.0002.1894] # MONGOLIAN LETTER ALI GALI SSA 18A3 ; [.29F3.0020.0002.18A3] # MONGOLIAN LETTER MANCHU ALI GALI CYA 1895 ; [.29F4.0020.0002.1895] # MONGOLIAN LETTER ALI GALI ZHA 1899 ; [.29F5.0020.0002.1899] # MONGOLIAN LETTER TODO ALI GALI ZHA 1896 ; [.29F6.0020.0002.1896] # MONGOLIAN LETTER ALI GALI ZA 1897 ; [.29F7.0020.0002.1897] # MONGOLIAN LETTER ALI GALI AH 18A6 ; [.29F8.0020.0002.18A6] # MONGOLIAN LETTER ALI GALI HALF U 18A7 ; [.29F9.0020.0002.18A7] # MONGOLIAN LETTER ALI GALI HALF YA 18AA ; [.29FA.0020.0002.18AA] # MONGOLIAN LETTER MANCHU ALI GALI LHA 18A9 ; [.29FB.0020.0002.18A9] # MONGOLIAN LETTER ALI GALI DAGALGA 1C5A ; [.29FC.0020.0002.1C5A] # OL CHIKI LETTER LA 1C5B ; [.29FD.0020.0002.1C5B] # OL CHIKI LETTER AT 1C5C ; [.29FE.0020.0002.1C5C] # OL CHIKI LETTER AG 1C5D ; [.29FF.0020.0002.1C5D] # OL CHIKI LETTER ANG 1C5E ; [.2A00.0020.0002.1C5E] # OL CHIKI LETTER AL 1C5F ; [.2A01.0020.0002.1C5F] # OL CHIKI LETTER LAA 1C60 ; [.2A02.0020.0002.1C60] # OL CHIKI LETTER AAK 1C61 ; [.2A03.0020.0002.1C61] # OL CHIKI LETTER AAJ 1C62 ; [.2A04.0020.0002.1C62] # OL CHIKI LETTER AAM 1C63 ; [.2A05.0020.0002.1C63] # OL CHIKI LETTER AAW 1C64 ; [.2A06.0020.0002.1C64] # OL CHIKI LETTER LI 1C65 ; [.2A07.0020.0002.1C65] # OL CHIKI LETTER IS 1C66 ; [.2A08.0020.0002.1C66] # OL CHIKI LETTER IH 1C67 ; [.2A09.0020.0002.1C67] # OL CHIKI LETTER INY 1C68 ; [.2A0A.0020.0002.1C68] # OL CHIKI LETTER IR 1C69 ; [.2A0B.0020.0002.1C69] # OL CHIKI LETTER LU 1C6A ; [.2A0C.0020.0002.1C6A] # OL CHIKI LETTER UC 1C6B ; [.2A0D.0020.0002.1C6B] # OL CHIKI LETTER UD 1C6C ; [.2A0E.0020.0002.1C6C] # OL CHIKI LETTER UNN 1C6D ; [.2A0F.0020.0002.1C6D] # OL CHIKI LETTER UY 1C6E ; [.2A10.0020.0002.1C6E] # OL CHIKI LETTER LE 1C6F ; [.2A11.0020.0002.1C6F] # OL CHIKI LETTER EP 1C70 ; [.2A12.0020.0002.1C70] # OL CHIKI LETTER EDD 1C71 ; [.2A13.0020.0002.1C71] # OL CHIKI LETTER EN 1C72 ; [.2A14.0020.0002.1C72] # OL CHIKI LETTER ERR 1C73 ; [.2A15.0020.0002.1C73] # OL CHIKI LETTER LO 1C74 ; [.2A16.0020.0002.1C74] # OL CHIKI LETTER OTT 1C75 ; [.2A17.0020.0002.1C75] # OL CHIKI LETTER OB 1C76 ; [.2A18.0020.0002.1C76] # OL CHIKI LETTER OV 1C77 ; [.2A19.0020.0002.1C77] # OL CHIKI LETTER OH 1C78 ; [.2A1A.0020.0002.1C78] # OL CHIKI MU TTUDDAG 1C79 ; [.2A1B.0020.0002.1C79] # OL CHIKI GAAHLAA TTUDDAAG 1C7A ; [.2A1C.0020.0002.1C7A] # OL CHIKI MU-GAAHLAA TTUDDAAG 1C7B ; [.2A1D.0020.0002.1C7B] # OL CHIKI RELAA 1C7C ; [.2A1E.0020.0002.1C7C] # OL CHIKI PHAARKAA 1C7D ; [.2A1F.0020.0002.1C7D] # OL CHIKI AHAD 13A0 ; [.2A20.0020.0002.13A0] # CHEROKEE LETTER A 13A1 ; [.2A21.0020.0002.13A1] # CHEROKEE LETTER E 13A2 ; [.2A22.0020.0002.13A2] # CHEROKEE LETTER I 13A3 ; [.2A23.0020.0002.13A3] # CHEROKEE LETTER O 13A4 ; [.2A24.0020.0002.13A4] # CHEROKEE LETTER U 13A5 ; [.2A25.0020.0002.13A5] # CHEROKEE LETTER V 13A6 ; [.2A26.0020.0002.13A6] # CHEROKEE LETTER GA 13A7 ; [.2A27.0020.0002.13A7] # CHEROKEE LETTER KA 13A8 ; [.2A28.0020.0002.13A8] # CHEROKEE LETTER GE 13A9 ; [.2A29.0020.0002.13A9] # CHEROKEE LETTER GI 13AA ; [.2A2A.0020.0002.13AA] # CHEROKEE LETTER GO 13AB ; [.2A2B.0020.0002.13AB] # CHEROKEE LETTER GU 13AC ; [.2A2C.0020.0002.13AC] # CHEROKEE LETTER GV 13AD ; [.2A2D.0020.0002.13AD] # CHEROKEE LETTER HA 13AE ; [.2A2E.0020.0002.13AE] # CHEROKEE LETTER HE 13AF ; [.2A2F.0020.0002.13AF] # CHEROKEE LETTER HI 13B0 ; [.2A30.0020.0002.13B0] # CHEROKEE LETTER HO 13B1 ; [.2A31.0020.0002.13B1] # CHEROKEE LETTER HU 13B2 ; [.2A32.0020.0002.13B2] # CHEROKEE LETTER HV 13B3 ; [.2A33.0020.0002.13B3] # CHEROKEE LETTER LA 13B4 ; [.2A34.0020.0002.13B4] # CHEROKEE LETTER LE 13B5 ; [.2A35.0020.0002.13B5] # CHEROKEE LETTER LI 13B6 ; [.2A36.0020.0002.13B6] # CHEROKEE LETTER LO 13B7 ; [.2A37.0020.0002.13B7] # CHEROKEE LETTER LU 13B8 ; [.2A38.0020.0002.13B8] # CHEROKEE LETTER LV 13B9 ; [.2A39.0020.0002.13B9] # CHEROKEE LETTER MA 13BA ; [.2A3A.0020.0002.13BA] # CHEROKEE LETTER ME 13BB ; [.2A3B.0020.0002.13BB] # CHEROKEE LETTER MI 13BC ; [.2A3C.0020.0002.13BC] # CHEROKEE LETTER MO 13BD ; [.2A3D.0020.0002.13BD] # CHEROKEE LETTER MU 13BE ; [.2A3E.0020.0002.13BE] # CHEROKEE LETTER NA 13BF ; [.2A3F.0020.0002.13BF] # CHEROKEE LETTER HNA 13C0 ; [.2A40.0020.0002.13C0] # CHEROKEE LETTER NAH 13C1 ; [.2A41.0020.0002.13C1] # CHEROKEE LETTER NE 13C2 ; [.2A42.0020.0002.13C2] # CHEROKEE LETTER NI 13C3 ; [.2A43.0020.0002.13C3] # CHEROKEE LETTER NO 13C4 ; [.2A44.0020.0002.13C4] # CHEROKEE LETTER NU 13C5 ; [.2A45.0020.0002.13C5] # CHEROKEE LETTER NV 13C6 ; [.2A46.0020.0002.13C6] # CHEROKEE LETTER QUA 13C7 ; [.2A47.0020.0002.13C7] # CHEROKEE LETTER QUE 13C8 ; [.2A48.0020.0002.13C8] # CHEROKEE LETTER QUI 13C9 ; [.2A49.0020.0002.13C9] # CHEROKEE LETTER QUO 13CA ; [.2A4A.0020.0002.13CA] # CHEROKEE LETTER QUU 13CB ; [.2A4B.0020.0002.13CB] # CHEROKEE LETTER QUV 13CC ; [.2A4C.0020.0002.13CC] # CHEROKEE LETTER SA 13CD ; [.2A4D.0020.0002.13CD] # CHEROKEE LETTER S 13CE ; [.2A4E.0020.0002.13CE] # CHEROKEE LETTER SE 13CF ; [.2A4F.0020.0002.13CF] # CHEROKEE LETTER SI 13D0 ; [.2A50.0020.0002.13D0] # CHEROKEE LETTER SO 13D1 ; [.2A51.0020.0002.13D1] # CHEROKEE LETTER SU 13D2 ; [.2A52.0020.0002.13D2] # CHEROKEE LETTER SV 13D3 ; [.2A53.0020.0002.13D3] # CHEROKEE LETTER DA 13D4 ; [.2A54.0020.0002.13D4] # CHEROKEE LETTER TA 13D5 ; [.2A55.0020.0002.13D5] # CHEROKEE LETTER DE 13D6 ; [.2A56.0020.0002.13D6] # CHEROKEE LETTER TE 13D7 ; [.2A57.0020.0002.13D7] # CHEROKEE LETTER DI 13D8 ; [.2A58.0020.0002.13D8] # CHEROKEE LETTER TI 13D9 ; [.2A59.0020.0002.13D9] # CHEROKEE LETTER DO 13DA ; [.2A5A.0020.0002.13DA] # CHEROKEE LETTER DU 13DB ; [.2A5B.0020.0002.13DB] # CHEROKEE LETTER DV 13DC ; [.2A5C.0020.0002.13DC] # CHEROKEE LETTER DLA 13DD ; [.2A5D.0020.0002.13DD] # CHEROKEE LETTER TLA 13DE ; [.2A5E.0020.0002.13DE] # CHEROKEE LETTER TLE 13DF ; [.2A5F.0020.0002.13DF] # CHEROKEE LETTER TLI 13E0 ; [.2A60.0020.0002.13E0] # CHEROKEE LETTER TLO 13E1 ; [.2A61.0020.0002.13E1] # CHEROKEE LETTER TLU 13E2 ; [.2A62.0020.0002.13E2] # CHEROKEE LETTER TLV 13E3 ; [.2A63.0020.0002.13E3] # CHEROKEE LETTER TSA 13E4 ; [.2A64.0020.0002.13E4] # CHEROKEE LETTER TSE 13E5 ; [.2A65.0020.0002.13E5] # CHEROKEE LETTER TSI 13E6 ; [.2A66.0020.0002.13E6] # CHEROKEE LETTER TSO 13E7 ; [.2A67.0020.0002.13E7] # CHEROKEE LETTER TSU 13E8 ; [.2A68.0020.0002.13E8] # CHEROKEE LETTER TSV 13E9 ; [.2A69.0020.0002.13E9] # CHEROKEE LETTER WA 13EA ; [.2A6A.0020.0002.13EA] # CHEROKEE LETTER WE 13EB ; [.2A6B.0020.0002.13EB] # CHEROKEE LETTER WI 13EC ; [.2A6C.0020.0002.13EC] # CHEROKEE LETTER WO 13ED ; [.2A6D.0020.0002.13ED] # CHEROKEE LETTER WU 13EE ; [.2A6E.0020.0002.13EE] # CHEROKEE LETTER WV 13EF ; [.2A6F.0020.0002.13EF] # CHEROKEE LETTER YA 13F0 ; [.2A70.0020.0002.13F0] # CHEROKEE LETTER YE 13F1 ; [.2A71.0020.0002.13F1] # CHEROKEE LETTER YI 13F2 ; [.2A72.0020.0002.13F2] # CHEROKEE LETTER YO 13F3 ; [.2A73.0020.0002.13F3] # CHEROKEE LETTER YU 13F4 ; [.2A74.0020.0002.13F4] # CHEROKEE LETTER YV 1401 ; [.2A75.0020.0002.1401] # CANADIAN SYLLABICS E 1402 ; [.2A76.0020.0002.1402] # CANADIAN SYLLABICS AAI 1403 ; [.2A77.0020.0002.1403] # CANADIAN SYLLABICS I 1404 ; [.2A78.0020.0002.1404] # CANADIAN SYLLABICS II 1405 ; [.2A79.0020.0002.1405] # CANADIAN SYLLABICS O 1406 ; [.2A7A.0020.0002.1406] # CANADIAN SYLLABICS OO 1407 ; [.2A7B.0020.0002.1407] # CANADIAN SYLLABICS Y-CREE OO 1408 ; [.2A7C.0020.0002.1408] # CANADIAN SYLLABICS CARRIER EE 1409 ; [.2A7D.0020.0002.1409] # CANADIAN SYLLABICS CARRIER I 140A ; [.2A7E.0020.0002.140A] # CANADIAN SYLLABICS A 140B ; [.2A7F.0020.0002.140B] # CANADIAN SYLLABICS AA 140C ; [.2A80.0020.0002.140C] # CANADIAN SYLLABICS WE 140D ; [.2A81.0020.0002.140D] # CANADIAN SYLLABICS WEST-CREE WE 140E ; [.2A82.0020.0002.140E] # CANADIAN SYLLABICS WI 140F ; [.2A83.0020.0002.140F] # CANADIAN SYLLABICS WEST-CREE WI 1410 ; [.2A84.0020.0002.1410] # CANADIAN SYLLABICS WII 1411 ; [.2A85.0020.0002.1411] # CANADIAN SYLLABICS WEST-CREE WII 1412 ; [.2A86.0020.0002.1412] # CANADIAN SYLLABICS WO 1413 ; [.2A87.0020.0002.1413] # CANADIAN SYLLABICS WEST-CREE WO 1414 ; [.2A88.0020.0002.1414] # CANADIAN SYLLABICS WOO 1415 ; [.2A89.0020.0002.1415] # CANADIAN SYLLABICS WEST-CREE WOO 1416 ; [.2A8A.0020.0002.1416] # CANADIAN SYLLABICS NASKAPI WOO 1417 ; [.2A8B.0020.0002.1417] # CANADIAN SYLLABICS WA 1418 ; [.2A8C.0020.0002.1418] # CANADIAN SYLLABICS WEST-CREE WA 1419 ; [.2A8D.0020.0002.1419] # CANADIAN SYLLABICS WAA 141A ; [.2A8E.0020.0002.141A] # CANADIAN SYLLABICS WEST-CREE WAA 141B ; [.2A8F.0020.0002.141B] # CANADIAN SYLLABICS NASKAPI WAA 141C ; [.2A90.0020.0002.141C] # CANADIAN SYLLABICS AI 141D ; [.2A91.0020.0002.141D] # CANADIAN SYLLABICS Y-CREE W 141E ; [.2A92.0020.0002.141E] # CANADIAN SYLLABICS GLOTTAL STOP 141F ; [.2A93.0020.0002.141F] # CANADIAN SYLLABICS FINAL ACUTE 1420 ; [.2A94.0020.0002.1420] # CANADIAN SYLLABICS FINAL GRAVE 1421 ; [.2A95.0020.0002.1421] # CANADIAN SYLLABICS FINAL BOTTOM HALF RING 1422 ; [.2A96.0020.0002.1422] # CANADIAN SYLLABICS FINAL TOP HALF RING 1423 ; [.2A97.0020.0002.1423] # CANADIAN SYLLABICS FINAL RIGHT HALF RING 1424 ; [.2A98.0020.0002.1424] # CANADIAN SYLLABICS FINAL RING 1425 ; [.2A99.0020.0002.1425] # CANADIAN SYLLABICS FINAL DOUBLE ACUTE 1426 ; [.2A9A.0020.0002.1426] # CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES 1427 ; [.2A9B.0020.0002.1427] # CANADIAN SYLLABICS FINAL MIDDLE DOT 1428 ; [.2A9C.0020.0002.1428] # CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE 1429 ; [.2A9D.0020.0002.1429] # CANADIAN SYLLABICS FINAL PLUS 142A ; [.2A9E.0020.0002.142A] # CANADIAN SYLLABICS FINAL DOWN TACK 142B ; [.2A9F.0020.0002.142B] # CANADIAN SYLLABICS EN 142C ; [.2AA0.0020.0002.142C] # CANADIAN SYLLABICS IN 142D ; [.2AA1.0020.0002.142D] # CANADIAN SYLLABICS ON 142E ; [.2AA2.0020.0002.142E] # CANADIAN SYLLABICS AN 142F ; [.2AA3.0020.0002.142F] # CANADIAN SYLLABICS PE 1430 ; [.2AA4.0020.0002.1430] # CANADIAN SYLLABICS PAAI 1431 ; [.2AA5.0020.0002.1431] # CANADIAN SYLLABICS PI 1432 ; [.2AA6.0020.0002.1432] # CANADIAN SYLLABICS PII 1433 ; [.2AA7.0020.0002.1433] # CANADIAN SYLLABICS PO 1434 ; [.2AA8.0020.0002.1434] # CANADIAN SYLLABICS POO 1435 ; [.2AA9.0020.0002.1435] # CANADIAN SYLLABICS Y-CREE POO 1436 ; [.2AAA.0020.0002.1436] # CANADIAN SYLLABICS CARRIER HEE 1437 ; [.2AAB.0020.0002.1437] # CANADIAN SYLLABICS CARRIER HI 1438 ; [.2AAC.0020.0002.1438] # CANADIAN SYLLABICS PA 1439 ; [.2AAD.0020.0002.1439] # CANADIAN SYLLABICS PAA 143A ; [.2AAE.0020.0002.143A] # CANADIAN SYLLABICS PWE 143B ; [.2AAF.0020.0002.143B] # CANADIAN SYLLABICS WEST-CREE PWE 143C ; [.2AB0.0020.0002.143C] # CANADIAN SYLLABICS PWI 143D ; [.2AB1.0020.0002.143D] # CANADIAN SYLLABICS WEST-CREE PWI 143E ; [.2AB2.0020.0002.143E] # CANADIAN SYLLABICS PWII 143F ; [.2AB3.0020.0002.143F] # CANADIAN SYLLABICS WEST-CREE PWII 1440 ; [.2AB4.0020.0002.1440] # CANADIAN SYLLABICS PWO 1441 ; [.2AB5.0020.0002.1441] # CANADIAN SYLLABICS WEST-CREE PWO 1442 ; [.2AB6.0020.0002.1442] # CANADIAN SYLLABICS PWOO 1443 ; [.2AB7.0020.0002.1443] # CANADIAN SYLLABICS WEST-CREE PWOO 1444 ; [.2AB8.0020.0002.1444] # CANADIAN SYLLABICS PWA 1445 ; [.2AB9.0020.0002.1445] # CANADIAN SYLLABICS WEST-CREE PWA 1446 ; [.2ABA.0020.0002.1446] # CANADIAN SYLLABICS PWAA 1447 ; [.2ABB.0020.0002.1447] # CANADIAN SYLLABICS WEST-CREE PWAA 1448 ; [.2ABC.0020.0002.1448] # CANADIAN SYLLABICS Y-CREE PWAA 1449 ; [.2ABD.0020.0002.1449] # CANADIAN SYLLABICS P 144A ; [.2ABE.0020.0002.144A] # CANADIAN SYLLABICS WEST-CREE P 144B ; [.2ABF.0020.0002.144B] # CANADIAN SYLLABICS CARRIER H 144C ; [.2AC0.0020.0002.144C] # CANADIAN SYLLABICS TE 144D ; [.2AC1.0020.0002.144D] # CANADIAN SYLLABICS TAAI 144E ; [.2AC2.0020.0002.144E] # CANADIAN SYLLABICS TI 144F ; [.2AC3.0020.0002.144F] # CANADIAN SYLLABICS TII 1450 ; [.2AC4.0020.0002.1450] # CANADIAN SYLLABICS TO 1451 ; [.2AC5.0020.0002.1451] # CANADIAN SYLLABICS TOO 1452 ; [.2AC6.0020.0002.1452] # CANADIAN SYLLABICS Y-CREE TOO 1453 ; [.2AC7.0020.0002.1453] # CANADIAN SYLLABICS CARRIER DEE 1454 ; [.2AC8.0020.0002.1454] # CANADIAN SYLLABICS CARRIER DI 1455 ; [.2AC9.0020.0002.1455] # CANADIAN SYLLABICS TA 1456 ; [.2ACA.0020.0002.1456] # CANADIAN SYLLABICS TAA 1457 ; [.2ACB.0020.0002.1457] # CANADIAN SYLLABICS TWE 1458 ; [.2ACC.0020.0002.1458] # CANADIAN SYLLABICS WEST-CREE TWE 1459 ; [.2ACD.0020.0002.1459] # CANADIAN SYLLABICS TWI 145A ; [.2ACE.0020.0002.145A] # CANADIAN SYLLABICS WEST-CREE TWI 145B ; [.2ACF.0020.0002.145B] # CANADIAN SYLLABICS TWII 145C ; [.2AD0.0020.0002.145C] # CANADIAN SYLLABICS WEST-CREE TWII 145D ; [.2AD1.0020.0002.145D] # CANADIAN SYLLABICS TWO 145E ; [.2AD2.0020.0002.145E] # CANADIAN SYLLABICS WEST-CREE TWO 145F ; [.2AD3.0020.0002.145F] # CANADIAN SYLLABICS TWOO 1460 ; [.2AD4.0020.0002.1460] # CANADIAN SYLLABICS WEST-CREE TWOO 1461 ; [.2AD5.0020.0002.1461] # CANADIAN SYLLABICS TWA 1462 ; [.2AD6.0020.0002.1462] # CANADIAN SYLLABICS WEST-CREE TWA 1463 ; [.2AD7.0020.0002.1463] # CANADIAN SYLLABICS TWAA 1464 ; [.2AD8.0020.0002.1464] # CANADIAN SYLLABICS WEST-CREE TWAA 1465 ; [.2AD9.0020.0002.1465] # CANADIAN SYLLABICS NASKAPI TWAA 1466 ; [.2ADA.0020.0002.1466] # CANADIAN SYLLABICS T 1467 ; [.2ADB.0020.0002.1467] # CANADIAN SYLLABICS TTE 1468 ; [.2ADC.0020.0002.1468] # CANADIAN SYLLABICS TTI 1469 ; [.2ADD.0020.0002.1469] # CANADIAN SYLLABICS TTO 146A ; [.2ADE.0020.0002.146A] # CANADIAN SYLLABICS TTA 146B ; [.2ADF.0020.0002.146B] # CANADIAN SYLLABICS KE 146C ; [.2AE0.0020.0002.146C] # CANADIAN SYLLABICS KAAI 146D ; [.2AE1.0020.0002.146D] # CANADIAN SYLLABICS KI 146E ; [.2AE2.0020.0002.146E] # CANADIAN SYLLABICS KII 146F ; [.2AE3.0020.0002.146F] # CANADIAN SYLLABICS KO 1470 ; [.2AE4.0020.0002.1470] # CANADIAN SYLLABICS KOO 1471 ; [.2AE5.0020.0002.1471] # CANADIAN SYLLABICS Y-CREE KOO 1472 ; [.2AE6.0020.0002.1472] # CANADIAN SYLLABICS KA 1473 ; [.2AE7.0020.0002.1473] # CANADIAN SYLLABICS KAA 1474 ; [.2AE8.0020.0002.1474] # CANADIAN SYLLABICS KWE 1475 ; [.2AE9.0020.0002.1475] # CANADIAN SYLLABICS WEST-CREE KWE 1476 ; [.2AEA.0020.0002.1476] # CANADIAN SYLLABICS KWI 1477 ; [.2AEB.0020.0002.1477] # CANADIAN SYLLABICS WEST-CREE KWI 1478 ; [.2AEC.0020.0002.1478] # CANADIAN SYLLABICS KWII 1479 ; [.2AED.0020.0002.1479] # CANADIAN SYLLABICS WEST-CREE KWII 147A ; [.2AEE.0020.0002.147A] # CANADIAN SYLLABICS KWO 147B ; [.2AEF.0020.0002.147B] # CANADIAN SYLLABICS WEST-CREE KWO 147C ; [.2AF0.0020.0002.147C] # CANADIAN SYLLABICS KWOO 147D ; [.2AF1.0020.0002.147D] # CANADIAN SYLLABICS WEST-CREE KWOO 147E ; [.2AF2.0020.0002.147E] # CANADIAN SYLLABICS KWA 147F ; [.2AF3.0020.0002.147F] # CANADIAN SYLLABICS WEST-CREE KWA 1480 ; [.2AF4.0020.0002.1480] # CANADIAN SYLLABICS KWAA 1481 ; [.2AF5.0020.0002.1481] # CANADIAN SYLLABICS WEST-CREE KWAA 1482 ; [.2AF6.0020.0002.1482] # CANADIAN SYLLABICS NASKAPI KWAA 1483 ; [.2AF7.0020.0002.1483] # CANADIAN SYLLABICS K 1484 ; [.2AF8.0020.0002.1484] # CANADIAN SYLLABICS KW 1485 ; [.2AF9.0020.0002.1485] # CANADIAN SYLLABICS SOUTH-SLAVEY KEH 1486 ; [.2AFA.0020.0002.1486] # CANADIAN SYLLABICS SOUTH-SLAVEY KIH 1487 ; [.2AFB.0020.0002.1487] # CANADIAN SYLLABICS SOUTH-SLAVEY KOH 1488 ; [.2AFC.0020.0002.1488] # CANADIAN SYLLABICS SOUTH-SLAVEY KAH 1489 ; [.2AFD.0020.0002.1489] # CANADIAN SYLLABICS CE 148A ; [.2AFE.0020.0002.148A] # CANADIAN SYLLABICS CAAI 148B ; [.2AFF.0020.0002.148B] # CANADIAN SYLLABICS CI 148C ; [.2B00.0020.0002.148C] # CANADIAN SYLLABICS CII 148D ; [.2B01.0020.0002.148D] # CANADIAN SYLLABICS CO 148E ; [.2B02.0020.0002.148E] # CANADIAN SYLLABICS COO 148F ; [.2B03.0020.0002.148F] # CANADIAN SYLLABICS Y-CREE COO 1490 ; [.2B04.0020.0002.1490] # CANADIAN SYLLABICS CA 1491 ; [.2B05.0020.0002.1491] # CANADIAN SYLLABICS CAA 1492 ; [.2B06.0020.0002.1492] # CANADIAN SYLLABICS CWE 1493 ; [.2B07.0020.0002.1493] # CANADIAN SYLLABICS WEST-CREE CWE 1494 ; [.2B08.0020.0002.1494] # CANADIAN SYLLABICS CWI 1495 ; [.2B09.0020.0002.1495] # CANADIAN SYLLABICS WEST-CREE CWI 1496 ; [.2B0A.0020.0002.1496] # CANADIAN SYLLABICS CWII 1497 ; [.2B0B.0020.0002.1497] # CANADIAN SYLLABICS WEST-CREE CWII 1498 ; [.2B0C.0020.0002.1498] # CANADIAN SYLLABICS CWO 1499 ; [.2B0D.0020.0002.1499] # CANADIAN SYLLABICS WEST-CREE CWO 149A ; [.2B0E.0020.0002.149A] # CANADIAN SYLLABICS CWOO 149B ; [.2B0F.0020.0002.149B] # CANADIAN SYLLABICS WEST-CREE CWOO 149C ; [.2B10.0020.0002.149C] # CANADIAN SYLLABICS CWA 149D ; [.2B11.0020.0002.149D] # CANADIAN SYLLABICS WEST-CREE CWA 149E ; [.2B12.0020.0002.149E] # CANADIAN SYLLABICS CWAA 149F ; [.2B13.0020.0002.149F] # CANADIAN SYLLABICS WEST-CREE CWAA 14A0 ; [.2B14.0020.0002.14A0] # CANADIAN SYLLABICS NASKAPI CWAA 14A1 ; [.2B15.0020.0002.14A1] # CANADIAN SYLLABICS C 14A2 ; [.2B16.0020.0002.14A2] # CANADIAN SYLLABICS SAYISI TH 14A3 ; [.2B17.0020.0002.14A3] # CANADIAN SYLLABICS ME 14A4 ; [.2B18.0020.0002.14A4] # CANADIAN SYLLABICS MAAI 14A5 ; [.2B19.0020.0002.14A5] # CANADIAN SYLLABICS MI 14A6 ; [.2B1A.0020.0002.14A6] # CANADIAN SYLLABICS MII 14A7 ; [.2B1B.0020.0002.14A7] # CANADIAN SYLLABICS MO 14A8 ; [.2B1C.0020.0002.14A8] # CANADIAN SYLLABICS MOO 14A9 ; [.2B1D.0020.0002.14A9] # CANADIAN SYLLABICS Y-CREE MOO 14AA ; [.2B1E.0020.0002.14AA] # CANADIAN SYLLABICS MA 14AB ; [.2B1F.0020.0002.14AB] # CANADIAN SYLLABICS MAA 14AC ; [.2B20.0020.0002.14AC] # CANADIAN SYLLABICS MWE 14AD ; [.2B21.0020.0002.14AD] # CANADIAN SYLLABICS WEST-CREE MWE 14AE ; [.2B22.0020.0002.14AE] # CANADIAN SYLLABICS MWI 14AF ; [.2B23.0020.0002.14AF] # CANADIAN SYLLABICS WEST-CREE MWI 14B0 ; [.2B24.0020.0002.14B0] # CANADIAN SYLLABICS MWII 14B1 ; [.2B25.0020.0002.14B1] # CANADIAN SYLLABICS WEST-CREE MWII 14B2 ; [.2B26.0020.0002.14B2] # CANADIAN SYLLABICS MWO 14B3 ; [.2B27.0020.0002.14B3] # CANADIAN SYLLABICS WEST-CREE MWO 14B4 ; [.2B28.0020.0002.14B4] # CANADIAN SYLLABICS MWOO 14B5 ; [.2B29.0020.0002.14B5] # CANADIAN SYLLABICS WEST-CREE MWOO 14B6 ; [.2B2A.0020.0002.14B6] # CANADIAN SYLLABICS MWA 14B7 ; [.2B2B.0020.0002.14B7] # CANADIAN SYLLABICS WEST-CREE MWA 14B8 ; [.2B2C.0020.0002.14B8] # CANADIAN SYLLABICS MWAA 14B9 ; [.2B2D.0020.0002.14B9] # CANADIAN SYLLABICS WEST-CREE MWAA 14BA ; [.2B2E.0020.0002.14BA] # CANADIAN SYLLABICS NASKAPI MWAA 14BB ; [.2B2F.0020.0002.14BB] # CANADIAN SYLLABICS M 14BC ; [.2B30.0020.0002.14BC] # CANADIAN SYLLABICS WEST-CREE M 14BD ; [.2B31.0020.0002.14BD] # CANADIAN SYLLABICS MH 14BE ; [.2B32.0020.0002.14BE] # CANADIAN SYLLABICS ATHAPASCAN M 14BF ; [.2B33.0020.0002.14BF] # CANADIAN SYLLABICS SAYISI M 14C0 ; [.2B34.0020.0002.14C0] # CANADIAN SYLLABICS NE 14C1 ; [.2B35.0020.0002.14C1] # CANADIAN SYLLABICS NAAI 14C2 ; [.2B36.0020.0002.14C2] # CANADIAN SYLLABICS NI 14C3 ; [.2B37.0020.0002.14C3] # CANADIAN SYLLABICS NII 14C4 ; [.2B38.0020.0002.14C4] # CANADIAN SYLLABICS NO 14C5 ; [.2B39.0020.0002.14C5] # CANADIAN SYLLABICS NOO 14C6 ; [.2B3A.0020.0002.14C6] # CANADIAN SYLLABICS Y-CREE NOO 14C7 ; [.2B3B.0020.0002.14C7] # CANADIAN SYLLABICS NA 14C8 ; [.2B3C.0020.0002.14C8] # CANADIAN SYLLABICS NAA 14C9 ; [.2B3D.0020.0002.14C9] # CANADIAN SYLLABICS NWE 14CA ; [.2B3E.0020.0002.14CA] # CANADIAN SYLLABICS WEST-CREE NWE 14CB ; [.2B3F.0020.0002.14CB] # CANADIAN SYLLABICS NWA 14CC ; [.2B40.0020.0002.14CC] # CANADIAN SYLLABICS WEST-CREE NWA 14CD ; [.2B41.0020.0002.14CD] # CANADIAN SYLLABICS NWAA 14CE ; [.2B42.0020.0002.14CE] # CANADIAN SYLLABICS WEST-CREE NWAA 14CF ; [.2B43.0020.0002.14CF] # CANADIAN SYLLABICS NASKAPI NWAA 14D0 ; [.2B44.0020.0002.14D0] # CANADIAN SYLLABICS N 14D1 ; [.2B45.0020.0002.14D1] # CANADIAN SYLLABICS CARRIER NG 14D2 ; [.2B46.0020.0002.14D2] # CANADIAN SYLLABICS NH 14D3 ; [.2B47.0020.0002.14D3] # CANADIAN SYLLABICS LE 14D4 ; [.2B48.0020.0002.14D4] # CANADIAN SYLLABICS LAAI 14D5 ; [.2B49.0020.0002.14D5] # CANADIAN SYLLABICS LI 14D6 ; [.2B4A.0020.0002.14D6] # CANADIAN SYLLABICS LII 14D7 ; [.2B4B.0020.0002.14D7] # CANADIAN SYLLABICS LO 14D8 ; [.2B4C.0020.0002.14D8] # CANADIAN SYLLABICS LOO 14D9 ; [.2B4D.0020.0002.14D9] # CANADIAN SYLLABICS Y-CREE LOO 14DA ; [.2B4E.0020.0002.14DA] # CANADIAN SYLLABICS LA 14DB ; [.2B4F.0020.0002.14DB] # CANADIAN SYLLABICS LAA 14DC ; [.2B50.0020.0002.14DC] # CANADIAN SYLLABICS LWE 14DD ; [.2B51.0020.0002.14DD] # CANADIAN SYLLABICS WEST-CREE LWE 14DE ; [.2B52.0020.0002.14DE] # CANADIAN SYLLABICS LWI 14DF ; [.2B53.0020.0002.14DF] # CANADIAN SYLLABICS WEST-CREE LWI 14E0 ; [.2B54.0020.0002.14E0] # CANADIAN SYLLABICS LWII 14E1 ; [.2B55.0020.0002.14E1] # CANADIAN SYLLABICS WEST-CREE LWII 14E2 ; [.2B56.0020.0002.14E2] # CANADIAN SYLLABICS LWO 14E3 ; [.2B57.0020.0002.14E3] # CANADIAN SYLLABICS WEST-CREE LWO 14E4 ; [.2B58.0020.0002.14E4] # CANADIAN SYLLABICS LWOO 14E5 ; [.2B59.0020.0002.14E5] # CANADIAN SYLLABICS WEST-CREE LWOO 14E6 ; [.2B5A.0020.0002.14E6] # CANADIAN SYLLABICS LWA 14E7 ; [.2B5B.0020.0002.14E7] # CANADIAN SYLLABICS WEST-CREE LWA 14E8 ; [.2B5C.0020.0002.14E8] # CANADIAN SYLLABICS LWAA 14E9 ; [.2B5D.0020.0002.14E9] # CANADIAN SYLLABICS WEST-CREE LWAA 14EA ; [.2B5E.0020.0002.14EA] # CANADIAN SYLLABICS L 14EB ; [.2B5F.0020.0002.14EB] # CANADIAN SYLLABICS WEST-CREE L 14EC ; [.2B60.0020.0002.14EC] # CANADIAN SYLLABICS MEDIAL L 14ED ; [.2B61.0020.0002.14ED] # CANADIAN SYLLABICS SE 14EE ; [.2B62.0020.0002.14EE] # CANADIAN SYLLABICS SAAI 14EF ; [.2B63.0020.0002.14EF] # CANADIAN SYLLABICS SI 14F0 ; [.2B64.0020.0002.14F0] # CANADIAN SYLLABICS SII 14F1 ; [.2B65.0020.0002.14F1] # CANADIAN SYLLABICS SO 14F2 ; [.2B66.0020.0002.14F2] # CANADIAN SYLLABICS SOO 14F3 ; [.2B67.0020.0002.14F3] # CANADIAN SYLLABICS Y-CREE SOO 14F4 ; [.2B68.0020.0002.14F4] # CANADIAN SYLLABICS SA 14F5 ; [.2B69.0020.0002.14F5] # CANADIAN SYLLABICS SAA 14F6 ; [.2B6A.0020.0002.14F6] # CANADIAN SYLLABICS SWE 14F7 ; [.2B6B.0020.0002.14F7] # CANADIAN SYLLABICS WEST-CREE SWE 14F8 ; [.2B6C.0020.0002.14F8] # CANADIAN SYLLABICS SWI 14F9 ; [.2B6D.0020.0002.14F9] # CANADIAN SYLLABICS WEST-CREE SWI 14FA ; [.2B6E.0020.0002.14FA] # CANADIAN SYLLABICS SWII 14FB ; [.2B6F.0020.0002.14FB] # CANADIAN SYLLABICS WEST-CREE SWII 14FC ; [.2B70.0020.0002.14FC] # CANADIAN SYLLABICS SWO 14FD ; [.2B71.0020.0002.14FD] # CANADIAN SYLLABICS WEST-CREE SWO 14FE ; [.2B72.0020.0002.14FE] # CANADIAN SYLLABICS SWOO 14FF ; [.2B73.0020.0002.14FF] # CANADIAN SYLLABICS WEST-CREE SWOO 1500 ; [.2B74.0020.0002.1500] # CANADIAN SYLLABICS SWA 1501 ; [.2B75.0020.0002.1501] # CANADIAN SYLLABICS WEST-CREE SWA 1502 ; [.2B76.0020.0002.1502] # CANADIAN SYLLABICS SWAA 1503 ; [.2B77.0020.0002.1503] # CANADIAN SYLLABICS WEST-CREE SWAA 1504 ; [.2B78.0020.0002.1504] # CANADIAN SYLLABICS NASKAPI SWAA 1505 ; [.2B79.0020.0002.1505] # CANADIAN SYLLABICS S 1506 ; [.2B7A.0020.0002.1506] # CANADIAN SYLLABICS ATHAPASCAN S 1507 ; [.2B7B.0020.0002.1507] # CANADIAN SYLLABICS SW 1508 ; [.2B7C.0020.0002.1508] # CANADIAN SYLLABICS BLACKFOOT S 1509 ; [.2B7D.0020.0002.1509] # CANADIAN SYLLABICS MOOSE-CREE SK 150A ; [.2B7E.0020.0002.150A] # CANADIAN SYLLABICS NASKAPI SKW 150B ; [.2B7F.0020.0002.150B] # CANADIAN SYLLABICS NASKAPI S-W 150C ; [.2B80.0020.0002.150C] # CANADIAN SYLLABICS NASKAPI SPWA 150D ; [.2B81.0020.0002.150D] # CANADIAN SYLLABICS NASKAPI STWA 150E ; [.2B82.0020.0002.150E] # CANADIAN SYLLABICS NASKAPI SKWA 150F ; [.2B83.0020.0002.150F] # CANADIAN SYLLABICS NASKAPI SCWA 1510 ; [.2B84.0020.0002.1510] # CANADIAN SYLLABICS SHE 1511 ; [.2B85.0020.0002.1511] # CANADIAN SYLLABICS SHI 1512 ; [.2B86.0020.0002.1512] # CANADIAN SYLLABICS SHII 1513 ; [.2B87.0020.0002.1513] # CANADIAN SYLLABICS SHO 1514 ; [.2B88.0020.0002.1514] # CANADIAN SYLLABICS SHOO 1515 ; [.2B89.0020.0002.1515] # CANADIAN SYLLABICS SHA 1516 ; [.2B8A.0020.0002.1516] # CANADIAN SYLLABICS SHAA 1517 ; [.2B8B.0020.0002.1517] # CANADIAN SYLLABICS SHWE 1518 ; [.2B8C.0020.0002.1518] # CANADIAN SYLLABICS WEST-CREE SHWE 1519 ; [.2B8D.0020.0002.1519] # CANADIAN SYLLABICS SHWI 151A ; [.2B8E.0020.0002.151A] # CANADIAN SYLLABICS WEST-CREE SHWI 151B ; [.2B8F.0020.0002.151B] # CANADIAN SYLLABICS SHWII 151C ; [.2B90.0020.0002.151C] # CANADIAN SYLLABICS WEST-CREE SHWII 151D ; [.2B91.0020.0002.151D] # CANADIAN SYLLABICS SHWO 151E ; [.2B92.0020.0002.151E] # CANADIAN SYLLABICS WEST-CREE SHWO 151F ; [.2B93.0020.0002.151F] # CANADIAN SYLLABICS SHWOO 1520 ; [.2B94.0020.0002.1520] # CANADIAN SYLLABICS WEST-CREE SHWOO 1521 ; [.2B95.0020.0002.1521] # CANADIAN SYLLABICS SHWA 1522 ; [.2B96.0020.0002.1522] # CANADIAN SYLLABICS WEST-CREE SHWA 1523 ; [.2B97.0020.0002.1523] # CANADIAN SYLLABICS SHWAA 1524 ; [.2B98.0020.0002.1524] # CANADIAN SYLLABICS WEST-CREE SHWAA 1525 ; [.2B99.0020.0002.1525] # CANADIAN SYLLABICS SH 1526 ; [.2B9A.0020.0002.1526] # CANADIAN SYLLABICS YE 1527 ; [.2B9B.0020.0002.1527] # CANADIAN SYLLABICS YAAI 1528 ; [.2B9C.0020.0002.1528] # CANADIAN SYLLABICS YI 1529 ; [.2B9D.0020.0002.1529] # CANADIAN SYLLABICS YII 152A ; [.2B9E.0020.0002.152A] # CANADIAN SYLLABICS YO 152B ; [.2B9F.0020.0002.152B] # CANADIAN SYLLABICS YOO 152C ; [.2BA0.0020.0002.152C] # CANADIAN SYLLABICS Y-CREE YOO 152D ; [.2BA1.0020.0002.152D] # CANADIAN SYLLABICS YA 152E ; [.2BA2.0020.0002.152E] # CANADIAN SYLLABICS YAA 152F ; [.2BA3.0020.0002.152F] # CANADIAN SYLLABICS YWE 1530 ; [.2BA4.0020.0002.1530] # CANADIAN SYLLABICS WEST-CREE YWE 1531 ; [.2BA5.0020.0002.1531] # CANADIAN SYLLABICS YWI 1532 ; [.2BA6.0020.0002.1532] # CANADIAN SYLLABICS WEST-CREE YWI 1533 ; [.2BA7.0020.0002.1533] # CANADIAN SYLLABICS YWII 1534 ; [.2BA8.0020.0002.1534] # CANADIAN SYLLABICS WEST-CREE YWII 1535 ; [.2BA9.0020.0002.1535] # CANADIAN SYLLABICS YWO 1536 ; [.2BAA.0020.0002.1536] # CANADIAN SYLLABICS WEST-CREE YWO 1537 ; [.2BAB.0020.0002.1537] # CANADIAN SYLLABICS YWOO 1538 ; [.2BAC.0020.0002.1538] # CANADIAN SYLLABICS WEST-CREE YWOO 1539 ; [.2BAD.0020.0002.1539] # CANADIAN SYLLABICS YWA 153A ; [.2BAE.0020.0002.153A] # CANADIAN SYLLABICS WEST-CREE YWA 153B ; [.2BAF.0020.0002.153B] # CANADIAN SYLLABICS YWAA 153C ; [.2BB0.0020.0002.153C] # CANADIAN SYLLABICS WEST-CREE YWAA 153D ; [.2BB1.0020.0002.153D] # CANADIAN SYLLABICS NASKAPI YWAA 153E ; [.2BB2.0020.0002.153E] # CANADIAN SYLLABICS Y 153F ; [.2BB3.0020.0002.153F] # CANADIAN SYLLABICS BIBLE-CREE Y 1540 ; [.2BB4.0020.0002.1540] # CANADIAN SYLLABICS WEST-CREE Y 1541 ; [.2BB5.0020.0002.1541] # CANADIAN SYLLABICS SAYISI YI 1542 ; [.2BB6.0020.0002.1542] # CANADIAN SYLLABICS RE 1543 ; [.2BB7.0020.0002.1543] # CANADIAN SYLLABICS R-CREE RE 1544 ; [.2BB8.0020.0002.1544] # CANADIAN SYLLABICS WEST-CREE LE 1545 ; [.2BB9.0020.0002.1545] # CANADIAN SYLLABICS RAAI 1546 ; [.2BBA.0020.0002.1546] # CANADIAN SYLLABICS RI 1547 ; [.2BBB.0020.0002.1547] # CANADIAN SYLLABICS RII 1548 ; [.2BBC.0020.0002.1548] # CANADIAN SYLLABICS RO 1549 ; [.2BBD.0020.0002.1549] # CANADIAN SYLLABICS ROO 154A ; [.2BBE.0020.0002.154A] # CANADIAN SYLLABICS WEST-CREE LO 154B ; [.2BBF.0020.0002.154B] # CANADIAN SYLLABICS RA 154C ; [.2BC0.0020.0002.154C] # CANADIAN SYLLABICS RAA 154D ; [.2BC1.0020.0002.154D] # CANADIAN SYLLABICS WEST-CREE LA 154E ; [.2BC2.0020.0002.154E] # CANADIAN SYLLABICS RWAA 154F ; [.2BC3.0020.0002.154F] # CANADIAN SYLLABICS WEST-CREE RWAA 1550 ; [.2BC4.0020.0002.1550] # CANADIAN SYLLABICS R 1551 ; [.2BC5.0020.0002.1551] # CANADIAN SYLLABICS WEST-CREE R 1552 ; [.2BC6.0020.0002.1552] # CANADIAN SYLLABICS MEDIAL R 1553 ; [.2BC7.0020.0002.1553] # CANADIAN SYLLABICS FE 1554 ; [.2BC8.0020.0002.1554] # CANADIAN SYLLABICS FAAI 1555 ; [.2BC9.0020.0002.1555] # CANADIAN SYLLABICS FI 1556 ; [.2BCA.0020.0002.1556] # CANADIAN SYLLABICS FII 1557 ; [.2BCB.0020.0002.1557] # CANADIAN SYLLABICS FO 1558 ; [.2BCC.0020.0002.1558] # CANADIAN SYLLABICS FOO 1559 ; [.2BCD.0020.0002.1559] # CANADIAN SYLLABICS FA 155A ; [.2BCE.0020.0002.155A] # CANADIAN SYLLABICS FAA 155B ; [.2BCF.0020.0002.155B] # CANADIAN SYLLABICS FWAA 155C ; [.2BD0.0020.0002.155C] # CANADIAN SYLLABICS WEST-CREE FWAA 155D ; [.2BD1.0020.0002.155D] # CANADIAN SYLLABICS F 155E ; [.2BD2.0020.0002.155E] # CANADIAN SYLLABICS THE 155F ; [.2BD3.0020.0002.155F] # CANADIAN SYLLABICS N-CREE THE 1560 ; [.2BD4.0020.0002.1560] # CANADIAN SYLLABICS THI 1561 ; [.2BD5.0020.0002.1561] # CANADIAN SYLLABICS N-CREE THI 1562 ; [.2BD6.0020.0002.1562] # CANADIAN SYLLABICS THII 1563 ; [.2BD7.0020.0002.1563] # CANADIAN SYLLABICS N-CREE THII 1564 ; [.2BD8.0020.0002.1564] # CANADIAN SYLLABICS THO 1565 ; [.2BD9.0020.0002.1565] # CANADIAN SYLLABICS THOO 1566 ; [.2BDA.0020.0002.1566] # CANADIAN SYLLABICS THA 1567 ; [.2BDB.0020.0002.1567] # CANADIAN SYLLABICS THAA 1568 ; [.2BDC.0020.0002.1568] # CANADIAN SYLLABICS THWAA 1569 ; [.2BDD.0020.0002.1569] # CANADIAN SYLLABICS WEST-CREE THWAA 156A ; [.2BDE.0020.0002.156A] # CANADIAN SYLLABICS TH 156B ; [.2BDF.0020.0002.156B] # CANADIAN SYLLABICS TTHE 156C ; [.2BE0.0020.0002.156C] # CANADIAN SYLLABICS TTHI 156D ; [.2BE1.0020.0002.156D] # CANADIAN SYLLABICS TTHO 156E ; [.2BE2.0020.0002.156E] # CANADIAN SYLLABICS TTHA 156F ; [.2BE3.0020.0002.156F] # CANADIAN SYLLABICS TTH 1570 ; [.2BE4.0020.0002.1570] # CANADIAN SYLLABICS TYE 1571 ; [.2BE5.0020.0002.1571] # CANADIAN SYLLABICS TYI 1572 ; [.2BE6.0020.0002.1572] # CANADIAN SYLLABICS TYO 1573 ; [.2BE7.0020.0002.1573] # CANADIAN SYLLABICS TYA 1574 ; [.2BE8.0020.0002.1574] # CANADIAN SYLLABICS NUNAVIK HE 1575 ; [.2BE9.0020.0002.1575] # CANADIAN SYLLABICS NUNAVIK HI 1576 ; [.2BEA.0020.0002.1576] # CANADIAN SYLLABICS NUNAVIK HII 1577 ; [.2BEB.0020.0002.1577] # CANADIAN SYLLABICS NUNAVIK HO 1578 ; [.2BEC.0020.0002.1578] # CANADIAN SYLLABICS NUNAVIK HOO 1579 ; [.2BED.0020.0002.1579] # CANADIAN SYLLABICS NUNAVIK HA 157A ; [.2BEE.0020.0002.157A] # CANADIAN SYLLABICS NUNAVIK HAA 157B ; [.2BEF.0020.0002.157B] # CANADIAN SYLLABICS NUNAVIK H 157D ; [.2BF0.0020.0002.157D] # CANADIAN SYLLABICS HK 166F ; [.2BF1.0020.0002.166F] # CANADIAN SYLLABICS QAI 157E ; [.2BF2.0020.0002.157E] # CANADIAN SYLLABICS QAAI 157F ; [.2BF3.0020.0002.157F] # CANADIAN SYLLABICS QI 1580 ; [.2BF4.0020.0002.1580] # CANADIAN SYLLABICS QII 1581 ; [.2BF5.0020.0002.1581] # CANADIAN SYLLABICS QO 1582 ; [.2BF6.0020.0002.1582] # CANADIAN SYLLABICS QOO 1583 ; [.2BF7.0020.0002.1583] # CANADIAN SYLLABICS QA 1584 ; [.2BF8.0020.0002.1584] # CANADIAN SYLLABICS QAA 1585 ; [.2BF9.0020.0002.1585] # CANADIAN SYLLABICS Q 1586 ; [.2BFA.0020.0002.1586] # CANADIAN SYLLABICS TLHE 1587 ; [.2BFB.0020.0002.1587] # CANADIAN SYLLABICS TLHI 1588 ; [.2BFC.0020.0002.1588] # CANADIAN SYLLABICS TLHO 1589 ; [.2BFD.0020.0002.1589] # CANADIAN SYLLABICS TLHA 158A ; [.2BFE.0020.0002.158A] # CANADIAN SYLLABICS WEST-CREE RE 158B ; [.2BFF.0020.0002.158B] # CANADIAN SYLLABICS WEST-CREE RI 158C ; [.2C00.0020.0002.158C] # CANADIAN SYLLABICS WEST-CREE RO 158D ; [.2C01.0020.0002.158D] # CANADIAN SYLLABICS WEST-CREE RA 1670 ; [.2C02.0020.0002.1670] # CANADIAN SYLLABICS NGAI 158E ; [.2C03.0020.0002.158E] # CANADIAN SYLLABICS NGAAI 158F ; [.2C04.0020.0002.158F] # CANADIAN SYLLABICS NGI 1590 ; [.2C05.0020.0002.1590] # CANADIAN SYLLABICS NGII 1591 ; [.2C06.0020.0002.1591] # CANADIAN SYLLABICS NGO 1592 ; [.2C07.0020.0002.1592] # CANADIAN SYLLABICS NGOO 1593 ; [.2C08.0020.0002.1593] # CANADIAN SYLLABICS NGA 1594 ; [.2C09.0020.0002.1594] # CANADIAN SYLLABICS NGAA 1595 ; [.2C0A.0020.0002.1595] # CANADIAN SYLLABICS NG 1671 ; [.2C0B.0020.0002.1671] # CANADIAN SYLLABICS NNGI 1672 ; [.2C0C.0020.0002.1672] # CANADIAN SYLLABICS NNGII 1673 ; [.2C0D.0020.0002.1673] # CANADIAN SYLLABICS NNGO 1674 ; [.2C0E.0020.0002.1674] # CANADIAN SYLLABICS NNGOO 1675 ; [.2C0F.0020.0002.1675] # CANADIAN SYLLABICS NNGA 1676 ; [.2C10.0020.0002.1676] # CANADIAN SYLLABICS NNGAA 1596 ; [.2C11.0020.0002.1596] # CANADIAN SYLLABICS NNG 1597 ; [.2C12.0020.0002.1597] # CANADIAN SYLLABICS SAYISI SHE 1598 ; [.2C13.0020.0002.1598] # CANADIAN SYLLABICS SAYISI SHI 1599 ; [.2C14.0020.0002.1599] # CANADIAN SYLLABICS SAYISI SHO 159A ; [.2C15.0020.0002.159A] # CANADIAN SYLLABICS SAYISI SHA 159B ; [.2C16.0020.0002.159B] # CANADIAN SYLLABICS WOODS-CREE THE 159C ; [.2C17.0020.0002.159C] # CANADIAN SYLLABICS WOODS-CREE THI 159D ; [.2C18.0020.0002.159D] # CANADIAN SYLLABICS WOODS-CREE THO 159E ; [.2C19.0020.0002.159E] # CANADIAN SYLLABICS WOODS-CREE THA 159F ; [.2C1A.0020.0002.159F] # CANADIAN SYLLABICS WOODS-CREE TH 15A0 ; [.2C1B.0020.0002.15A0] # CANADIAN SYLLABICS LHI 15A1 ; [.2C1C.0020.0002.15A1] # CANADIAN SYLLABICS LHII 15A2 ; [.2C1D.0020.0002.15A2] # CANADIAN SYLLABICS LHO 15A3 ; [.2C1E.0020.0002.15A3] # CANADIAN SYLLABICS LHOO 15A4 ; [.2C1F.0020.0002.15A4] # CANADIAN SYLLABICS LHA 15A5 ; [.2C20.0020.0002.15A5] # CANADIAN SYLLABICS LHAA 15A6 ; [.2C21.0020.0002.15A6] # CANADIAN SYLLABICS LH 157C ; [.2C22.0020.0002.157C] # CANADIAN SYLLABICS NUNAVUT H 15A7 ; [.2C23.0020.0002.15A7] # CANADIAN SYLLABICS TH-CREE THE 15A8 ; [.2C24.0020.0002.15A8] # CANADIAN SYLLABICS TH-CREE THI 15A9 ; [.2C25.0020.0002.15A9] # CANADIAN SYLLABICS TH-CREE THII 15AA ; [.2C26.0020.0002.15AA] # CANADIAN SYLLABICS TH-CREE THO 15AB ; [.2C27.0020.0002.15AB] # CANADIAN SYLLABICS TH-CREE THOO 15AC ; [.2C28.0020.0002.15AC] # CANADIAN SYLLABICS TH-CREE THA 15AD ; [.2C29.0020.0002.15AD] # CANADIAN SYLLABICS TH-CREE THAA 15AE ; [.2C2A.0020.0002.15AE] # CANADIAN SYLLABICS TH-CREE TH 15AF ; [.2C2B.0020.0002.15AF] # CANADIAN SYLLABICS AIVILIK B 15B0 ; [.2C2C.0020.0002.15B0] # CANADIAN SYLLABICS BLACKFOOT E 15B1 ; [.2C2D.0020.0002.15B1] # CANADIAN SYLLABICS BLACKFOOT I 15B2 ; [.2C2E.0020.0002.15B2] # CANADIAN SYLLABICS BLACKFOOT O 15B3 ; [.2C2F.0020.0002.15B3] # CANADIAN SYLLABICS BLACKFOOT A 15B4 ; [.2C30.0020.0002.15B4] # CANADIAN SYLLABICS BLACKFOOT WE 15B5 ; [.2C31.0020.0002.15B5] # CANADIAN SYLLABICS BLACKFOOT WI 15B6 ; [.2C32.0020.0002.15B6] # CANADIAN SYLLABICS BLACKFOOT WO 15B7 ; [.2C33.0020.0002.15B7] # CANADIAN SYLLABICS BLACKFOOT WA 15B8 ; [.2C34.0020.0002.15B8] # CANADIAN SYLLABICS BLACKFOOT NE 15B9 ; [.2C35.0020.0002.15B9] # CANADIAN SYLLABICS BLACKFOOT NI 15BA ; [.2C36.0020.0002.15BA] # CANADIAN SYLLABICS BLACKFOOT NO 15BB ; [.2C37.0020.0002.15BB] # CANADIAN SYLLABICS BLACKFOOT NA 15BC ; [.2C38.0020.0002.15BC] # CANADIAN SYLLABICS BLACKFOOT KE 15BD ; [.2C39.0020.0002.15BD] # CANADIAN SYLLABICS BLACKFOOT KI 15BE ; [.2C3A.0020.0002.15BE] # CANADIAN SYLLABICS BLACKFOOT KO 15BF ; [.2C3B.0020.0002.15BF] # CANADIAN SYLLABICS BLACKFOOT KA 15C0 ; [.2C3C.0020.0002.15C0] # CANADIAN SYLLABICS SAYISI HE 15C1 ; [.2C3D.0020.0002.15C1] # CANADIAN SYLLABICS SAYISI HI 15C2 ; [.2C3E.0020.0002.15C2] # CANADIAN SYLLABICS SAYISI HO 15C3 ; [.2C3F.0020.0002.15C3] # CANADIAN SYLLABICS SAYISI HA 15C4 ; [.2C40.0020.0002.15C4] # CANADIAN SYLLABICS CARRIER GHU 15C5 ; [.2C41.0020.0002.15C5] # CANADIAN SYLLABICS CARRIER GHO 15C6 ; [.2C42.0020.0002.15C6] # CANADIAN SYLLABICS CARRIER GHE 15C7 ; [.2C43.0020.0002.15C7] # CANADIAN SYLLABICS CARRIER GHEE 15C8 ; [.2C44.0020.0002.15C8] # CANADIAN SYLLABICS CARRIER GHI 15C9 ; [.2C45.0020.0002.15C9] # CANADIAN SYLLABICS CARRIER GHA 15CA ; [.2C46.0020.0002.15CA] # CANADIAN SYLLABICS CARRIER RU 15CB ; [.2C47.0020.0002.15CB] # CANADIAN SYLLABICS CARRIER RO 15CC ; [.2C48.0020.0002.15CC] # CANADIAN SYLLABICS CARRIER RE 15CD ; [.2C49.0020.0002.15CD] # CANADIAN SYLLABICS CARRIER REE 15CE ; [.2C4A.0020.0002.15CE] # CANADIAN SYLLABICS CARRIER RI 15CF ; [.2C4B.0020.0002.15CF] # CANADIAN SYLLABICS CARRIER RA 15D0 ; [.2C4C.0020.0002.15D0] # CANADIAN SYLLABICS CARRIER WU 15D1 ; [.2C4D.0020.0002.15D1] # CANADIAN SYLLABICS CARRIER WO 15D2 ; [.2C4E.0020.0002.15D2] # CANADIAN SYLLABICS CARRIER WE 15D3 ; [.2C4F.0020.0002.15D3] # CANADIAN SYLLABICS CARRIER WEE 15D4 ; [.2C50.0020.0002.15D4] # CANADIAN SYLLABICS CARRIER WI 15D5 ; [.2C51.0020.0002.15D5] # CANADIAN SYLLABICS CARRIER WA 15D6 ; [.2C52.0020.0002.15D6] # CANADIAN SYLLABICS CARRIER HWU 15D7 ; [.2C53.0020.0002.15D7] # CANADIAN SYLLABICS CARRIER HWO 15D8 ; [.2C54.0020.0002.15D8] # CANADIAN SYLLABICS CARRIER HWE 15D9 ; [.2C55.0020.0002.15D9] # CANADIAN SYLLABICS CARRIER HWEE 15DA ; [.2C56.0020.0002.15DA] # CANADIAN SYLLABICS CARRIER HWI 15DB ; [.2C57.0020.0002.15DB] # CANADIAN SYLLABICS CARRIER HWA 15DC ; [.2C58.0020.0002.15DC] # CANADIAN SYLLABICS CARRIER THU 15DD ; [.2C59.0020.0002.15DD] # CANADIAN SYLLABICS CARRIER THO 15DE ; [.2C5A.0020.0002.15DE] # CANADIAN SYLLABICS CARRIER THE 15DF ; [.2C5B.0020.0002.15DF] # CANADIAN SYLLABICS CARRIER THEE 15E0 ; [.2C5C.0020.0002.15E0] # CANADIAN SYLLABICS CARRIER THI 15E1 ; [.2C5D.0020.0002.15E1] # CANADIAN SYLLABICS CARRIER THA 15E2 ; [.2C5E.0020.0002.15E2] # CANADIAN SYLLABICS CARRIER TTU 15E3 ; [.2C5F.0020.0002.15E3] # CANADIAN SYLLABICS CARRIER TTO 15E4 ; [.2C60.0020.0002.15E4] # CANADIAN SYLLABICS CARRIER TTE 15E5 ; [.2C61.0020.0002.15E5] # CANADIAN SYLLABICS CARRIER TTEE 15E6 ; [.2C62.0020.0002.15E6] # CANADIAN SYLLABICS CARRIER TTI 15E7 ; [.2C63.0020.0002.15E7] # CANADIAN SYLLABICS CARRIER TTA 15E8 ; [.2C64.0020.0002.15E8] # CANADIAN SYLLABICS CARRIER PU 15E9 ; [.2C65.0020.0002.15E9] # CANADIAN SYLLABICS CARRIER PO 15EA ; [.2C66.0020.0002.15EA] # CANADIAN SYLLABICS CARRIER PE 15EB ; [.2C67.0020.0002.15EB] # CANADIAN SYLLABICS CARRIER PEE 15EC ; [.2C68.0020.0002.15EC] # CANADIAN SYLLABICS CARRIER PI 15ED ; [.2C69.0020.0002.15ED] # CANADIAN SYLLABICS CARRIER PA 15EE ; [.2C6A.0020.0002.15EE] # CANADIAN SYLLABICS CARRIER P 15EF ; [.2C6B.0020.0002.15EF] # CANADIAN SYLLABICS CARRIER GU 15F0 ; [.2C6C.0020.0002.15F0] # CANADIAN SYLLABICS CARRIER GO 15F1 ; [.2C6D.0020.0002.15F1] # CANADIAN SYLLABICS CARRIER GE 15F2 ; [.2C6E.0020.0002.15F2] # CANADIAN SYLLABICS CARRIER GEE 15F3 ; [.2C6F.0020.0002.15F3] # CANADIAN SYLLABICS CARRIER GI 15F4 ; [.2C70.0020.0002.15F4] # CANADIAN SYLLABICS CARRIER GA 15F5 ; [.2C71.0020.0002.15F5] # CANADIAN SYLLABICS CARRIER KHU 15F6 ; [.2C72.0020.0002.15F6] # CANADIAN SYLLABICS CARRIER KHO 15F7 ; [.2C73.0020.0002.15F7] # CANADIAN SYLLABICS CARRIER KHE 15F8 ; [.2C74.0020.0002.15F8] # CANADIAN SYLLABICS CARRIER KHEE 15F9 ; [.2C75.0020.0002.15F9] # CANADIAN SYLLABICS CARRIER KHI 15FA ; [.2C76.0020.0002.15FA] # CANADIAN SYLLABICS CARRIER KHA 15FB ; [.2C77.0020.0002.15FB] # CANADIAN SYLLABICS CARRIER KKU 15FC ; [.2C78.0020.0002.15FC] # CANADIAN SYLLABICS CARRIER KKO 15FD ; [.2C79.0020.0002.15FD] # CANADIAN SYLLABICS CARRIER KKE 15FE ; [.2C7A.0020.0002.15FE] # CANADIAN SYLLABICS CARRIER KKEE 15FF ; [.2C7B.0020.0002.15FF] # CANADIAN SYLLABICS CARRIER KKI 1600 ; [.2C7C.0020.0002.1600] # CANADIAN SYLLABICS CARRIER KKA 1601 ; [.2C7D.0020.0002.1601] # CANADIAN SYLLABICS CARRIER KK 1602 ; [.2C7E.0020.0002.1602] # CANADIAN SYLLABICS CARRIER NU 1603 ; [.2C7F.0020.0002.1603] # CANADIAN SYLLABICS CARRIER NO 1604 ; [.2C80.0020.0002.1604] # CANADIAN SYLLABICS CARRIER NE 1605 ; [.2C81.0020.0002.1605] # CANADIAN SYLLABICS CARRIER NEE 1606 ; [.2C82.0020.0002.1606] # CANADIAN SYLLABICS CARRIER NI 1607 ; [.2C83.0020.0002.1607] # CANADIAN SYLLABICS CARRIER NA 1608 ; [.2C84.0020.0002.1608] # CANADIAN SYLLABICS CARRIER MU 1609 ; [.2C85.0020.0002.1609] # CANADIAN SYLLABICS CARRIER MO 160A ; [.2C86.0020.0002.160A] # CANADIAN SYLLABICS CARRIER ME 160B ; [.2C87.0020.0002.160B] # CANADIAN SYLLABICS CARRIER MEE 160C ; [.2C88.0020.0002.160C] # CANADIAN SYLLABICS CARRIER MI 160D ; [.2C89.0020.0002.160D] # CANADIAN SYLLABICS CARRIER MA 160E ; [.2C8A.0020.0002.160E] # CANADIAN SYLLABICS CARRIER YU 160F ; [.2C8B.0020.0002.160F] # CANADIAN SYLLABICS CARRIER YO 1610 ; [.2C8C.0020.0002.1610] # CANADIAN SYLLABICS CARRIER YE 1611 ; [.2C8D.0020.0002.1611] # CANADIAN SYLLABICS CARRIER YEE 1612 ; [.2C8E.0020.0002.1612] # CANADIAN SYLLABICS CARRIER YI 1613 ; [.2C8F.0020.0002.1613] # CANADIAN SYLLABICS CARRIER YA 1614 ; [.2C90.0020.0002.1614] # CANADIAN SYLLABICS CARRIER JU 1615 ; [.2C91.0020.0002.1615] # CANADIAN SYLLABICS SAYISI JU 1616 ; [.2C92.0020.0002.1616] # CANADIAN SYLLABICS CARRIER JO 1617 ; [.2C93.0020.0002.1617] # CANADIAN SYLLABICS CARRIER JE 1618 ; [.2C94.0020.0002.1618] # CANADIAN SYLLABICS CARRIER JEE 1619 ; [.2C95.0020.0002.1619] # CANADIAN SYLLABICS CARRIER JI 161A ; [.2C96.0020.0002.161A] # CANADIAN SYLLABICS SAYISI JI 161B ; [.2C97.0020.0002.161B] # CANADIAN SYLLABICS CARRIER JA 161C ; [.2C98.0020.0002.161C] # CANADIAN SYLLABICS CARRIER JJU 161D ; [.2C99.0020.0002.161D] # CANADIAN SYLLABICS CARRIER JJO 161E ; [.2C9A.0020.0002.161E] # CANADIAN SYLLABICS CARRIER JJE 161F ; [.2C9B.0020.0002.161F] # CANADIAN SYLLABICS CARRIER JJEE 1620 ; [.2C9C.0020.0002.1620] # CANADIAN SYLLABICS CARRIER JJI 1621 ; [.2C9D.0020.0002.1621] # CANADIAN SYLLABICS CARRIER JJA 1622 ; [.2C9E.0020.0002.1622] # CANADIAN SYLLABICS CARRIER LU 1623 ; [.2C9F.0020.0002.1623] # CANADIAN SYLLABICS CARRIER LO 1624 ; [.2CA0.0020.0002.1624] # CANADIAN SYLLABICS CARRIER LE 1625 ; [.2CA1.0020.0002.1625] # CANADIAN SYLLABICS CARRIER LEE 1626 ; [.2CA2.0020.0002.1626] # CANADIAN SYLLABICS CARRIER LI 1627 ; [.2CA3.0020.0002.1627] # CANADIAN SYLLABICS CARRIER LA 1628 ; [.2CA4.0020.0002.1628] # CANADIAN SYLLABICS CARRIER DLU 1629 ; [.2CA5.0020.0002.1629] # CANADIAN SYLLABICS CARRIER DLO 162A ; [.2CA6.0020.0002.162A] # CANADIAN SYLLABICS CARRIER DLE 162B ; [.2CA7.0020.0002.162B] # CANADIAN SYLLABICS CARRIER DLEE 162C ; [.2CA8.0020.0002.162C] # CANADIAN SYLLABICS CARRIER DLI 162D ; [.2CA9.0020.0002.162D] # CANADIAN SYLLABICS CARRIER DLA 162E ; [.2CAA.0020.0002.162E] # CANADIAN SYLLABICS CARRIER LHU 162F ; [.2CAB.0020.0002.162F] # CANADIAN SYLLABICS CARRIER LHO 1630 ; [.2CAC.0020.0002.1630] # CANADIAN SYLLABICS CARRIER LHE 1631 ; [.2CAD.0020.0002.1631] # CANADIAN SYLLABICS CARRIER LHEE 1632 ; [.2CAE.0020.0002.1632] # CANADIAN SYLLABICS CARRIER LHI 1633 ; [.2CAF.0020.0002.1633] # CANADIAN SYLLABICS CARRIER LHA 1634 ; [.2CB0.0020.0002.1634] # CANADIAN SYLLABICS CARRIER TLHU 1635 ; [.2CB1.0020.0002.1635] # CANADIAN SYLLABICS CARRIER TLHO 1636 ; [.2CB2.0020.0002.1636] # CANADIAN SYLLABICS CARRIER TLHE 1637 ; [.2CB3.0020.0002.1637] # CANADIAN SYLLABICS CARRIER TLHEE 1638 ; [.2CB4.0020.0002.1638] # CANADIAN SYLLABICS CARRIER TLHI 1639 ; [.2CB5.0020.0002.1639] # CANADIAN SYLLABICS CARRIER TLHA 163A ; [.2CB6.0020.0002.163A] # CANADIAN SYLLABICS CARRIER TLU 163B ; [.2CB7.0020.0002.163B] # CANADIAN SYLLABICS CARRIER TLO 163C ; [.2CB8.0020.0002.163C] # CANADIAN SYLLABICS CARRIER TLE 163D ; [.2CB9.0020.0002.163D] # CANADIAN SYLLABICS CARRIER TLEE 163E ; [.2CBA.0020.0002.163E] # CANADIAN SYLLABICS CARRIER TLI 163F ; [.2CBB.0020.0002.163F] # CANADIAN SYLLABICS CARRIER TLA 1640 ; [.2CBC.0020.0002.1640] # CANADIAN SYLLABICS CARRIER ZU 1641 ; [.2CBD.0020.0002.1641] # CANADIAN SYLLABICS CARRIER ZO 1642 ; [.2CBE.0020.0002.1642] # CANADIAN SYLLABICS CARRIER ZE 1643 ; [.2CBF.0020.0002.1643] # CANADIAN SYLLABICS CARRIER ZEE 1644 ; [.2CC0.0020.0002.1644] # CANADIAN SYLLABICS CARRIER ZI 1645 ; [.2CC1.0020.0002.1645] # CANADIAN SYLLABICS CARRIER ZA 1646 ; [.2CC2.0020.0002.1646] # CANADIAN SYLLABICS CARRIER Z 1647 ; [.2CC3.0020.0002.1647] # CANADIAN SYLLABICS CARRIER INITIAL Z 1648 ; [.2CC4.0020.0002.1648] # CANADIAN SYLLABICS CARRIER DZU 1649 ; [.2CC5.0020.0002.1649] # CANADIAN SYLLABICS CARRIER DZO 164A ; [.2CC6.0020.0002.164A] # CANADIAN SYLLABICS CARRIER DZE 164B ; [.2CC7.0020.0002.164B] # CANADIAN SYLLABICS CARRIER DZEE 164C ; [.2CC8.0020.0002.164C] # CANADIAN SYLLABICS CARRIER DZI 164D ; [.2CC9.0020.0002.164D] # CANADIAN SYLLABICS CARRIER DZA 164E ; [.2CCA.0020.0002.164E] # CANADIAN SYLLABICS CARRIER SU 164F ; [.2CCB.0020.0002.164F] # CANADIAN SYLLABICS CARRIER SO 1650 ; [.2CCC.0020.0002.1650] # CANADIAN SYLLABICS CARRIER SE 1651 ; [.2CCD.0020.0002.1651] # CANADIAN SYLLABICS CARRIER SEE 1652 ; [.2CCE.0020.0002.1652] # CANADIAN SYLLABICS CARRIER SI 1653 ; [.2CCF.0020.0002.1653] # CANADIAN SYLLABICS CARRIER SA 1654 ; [.2CD0.0020.0002.1654] # CANADIAN SYLLABICS CARRIER SHU 1655 ; [.2CD1.0020.0002.1655] # CANADIAN SYLLABICS CARRIER SHO 1656 ; [.2CD2.0020.0002.1656] # CANADIAN SYLLABICS CARRIER SHE 1657 ; [.2CD3.0020.0002.1657] # CANADIAN SYLLABICS CARRIER SHEE 1658 ; [.2CD4.0020.0002.1658] # CANADIAN SYLLABICS CARRIER SHI 1659 ; [.2CD5.0020.0002.1659] # CANADIAN SYLLABICS CARRIER SHA 165A ; [.2CD6.0020.0002.165A] # CANADIAN SYLLABICS CARRIER SH 165B ; [.2CD7.0020.0002.165B] # CANADIAN SYLLABICS CARRIER TSU 165C ; [.2CD8.0020.0002.165C] # CANADIAN SYLLABICS CARRIER TSO 165D ; [.2CD9.0020.0002.165D] # CANADIAN SYLLABICS CARRIER TSE 165E ; [.2CDA.0020.0002.165E] # CANADIAN SYLLABICS CARRIER TSEE 165F ; [.2CDB.0020.0002.165F] # CANADIAN SYLLABICS CARRIER TSI 1660 ; [.2CDC.0020.0002.1660] # CANADIAN SYLLABICS CARRIER TSA 1661 ; [.2CDD.0020.0002.1661] # CANADIAN SYLLABICS CARRIER CHU 1662 ; [.2CDE.0020.0002.1662] # CANADIAN SYLLABICS CARRIER CHO 1663 ; [.2CDF.0020.0002.1663] # CANADIAN SYLLABICS CARRIER CHE 1664 ; [.2CE0.0020.0002.1664] # CANADIAN SYLLABICS CARRIER CHEE 1665 ; [.2CE1.0020.0002.1665] # CANADIAN SYLLABICS CARRIER CHI 1666 ; [.2CE2.0020.0002.1666] # CANADIAN SYLLABICS CARRIER CHA 1667 ; [.2CE3.0020.0002.1667] # CANADIAN SYLLABICS CARRIER TTSU 1668 ; [.2CE4.0020.0002.1668] # CANADIAN SYLLABICS CARRIER TTSO 1669 ; [.2CE5.0020.0002.1669] # CANADIAN SYLLABICS CARRIER TTSE 166A ; [.2CE6.0020.0002.166A] # CANADIAN SYLLABICS CARRIER TTSEE 166B ; [.2CE7.0020.0002.166B] # CANADIAN SYLLABICS CARRIER TTSI 166C ; [.2CE8.0020.0002.166C] # CANADIAN SYLLABICS CARRIER TTSA 1677 ; [.2CE9.0020.0002.1677] # CANADIAN SYLLABICS WOODS-CREE THWEE 1678 ; [.2CEA.0020.0002.1678] # CANADIAN SYLLABICS WOODS-CREE THWI 1679 ; [.2CEB.0020.0002.1679] # CANADIAN SYLLABICS WOODS-CREE THWII 167A ; [.2CEC.0020.0002.167A] # CANADIAN SYLLABICS WOODS-CREE THWO 167B ; [.2CED.0020.0002.167B] # CANADIAN SYLLABICS WOODS-CREE THWOO 167C ; [.2CEE.0020.0002.167C] # CANADIAN SYLLABICS WOODS-CREE THWA 167D ; [.2CEF.0020.0002.167D] # CANADIAN SYLLABICS WOODS-CREE THWAA 167E ; [.2CF0.0020.0002.167E] # CANADIAN SYLLABICS WOODS-CREE FINAL TH 167F ; [.2CF1.0020.0002.167F] # CANADIAN SYLLABICS BLACKFOOT W 18B0 ; [.2CF2.0020.0002.18B0] # CANADIAN SYLLABICS OY 18B1 ; [.2CF3.0020.0002.18B1] # CANADIAN SYLLABICS AY 18B2 ; [.2CF4.0020.0002.18B2] # CANADIAN SYLLABICS AAY 18B3 ; [.2CF5.0020.0002.18B3] # CANADIAN SYLLABICS WAY 18B4 ; [.2CF6.0020.0002.18B4] # CANADIAN SYLLABICS POY 18B5 ; [.2CF7.0020.0002.18B5] # CANADIAN SYLLABICS PAY 18B6 ; [.2CF8.0020.0002.18B6] # CANADIAN SYLLABICS PWOY 18B7 ; [.2CF9.0020.0002.18B7] # CANADIAN SYLLABICS TAY 18B8 ; [.2CFA.0020.0002.18B8] # CANADIAN SYLLABICS KAY 18B9 ; [.2CFB.0020.0002.18B9] # CANADIAN SYLLABICS KWAY 18BA ; [.2CFC.0020.0002.18BA] # CANADIAN SYLLABICS MAY 18BB ; [.2CFD.0020.0002.18BB] # CANADIAN SYLLABICS NOY 18BC ; [.2CFE.0020.0002.18BC] # CANADIAN SYLLABICS NAY 18BD ; [.2CFF.0020.0002.18BD] # CANADIAN SYLLABICS LAY 18BE ; [.2D00.0020.0002.18BE] # CANADIAN SYLLABICS SOY 18BF ; [.2D01.0020.0002.18BF] # CANADIAN SYLLABICS SAY 18C0 ; [.2D02.0020.0002.18C0] # CANADIAN SYLLABICS SHOY 18C1 ; [.2D03.0020.0002.18C1] # CANADIAN SYLLABICS SHAY 18C2 ; [.2D04.0020.0002.18C2] # CANADIAN SYLLABICS SHWOY 18C3 ; [.2D05.0020.0002.18C3] # CANADIAN SYLLABICS YOY 18C4 ; [.2D06.0020.0002.18C4] # CANADIAN SYLLABICS YAY 18C5 ; [.2D07.0020.0002.18C5] # CANADIAN SYLLABICS RAY 18C6 ; [.2D08.0020.0002.18C6] # CANADIAN SYLLABICS NWI 18C7 ; [.2D09.0020.0002.18C7] # CANADIAN SYLLABICS OJIBWAY NWI 18C8 ; [.2D0A.0020.0002.18C8] # CANADIAN SYLLABICS NWII 18C9 ; [.2D0B.0020.0002.18C9] # CANADIAN SYLLABICS OJIBWAY NWII 18CA ; [.2D0C.0020.0002.18CA] # CANADIAN SYLLABICS NWO 18CB ; [.2D0D.0020.0002.18CB] # CANADIAN SYLLABICS OJIBWAY NWO 18CC ; [.2D0E.0020.0002.18CC] # CANADIAN SYLLABICS NWOO 18CD ; [.2D0F.0020.0002.18CD] # CANADIAN SYLLABICS OJIBWAY NWOO 18CE ; [.2D10.0020.0002.18CE] # CANADIAN SYLLABICS RWEE 18CF ; [.2D11.0020.0002.18CF] # CANADIAN SYLLABICS RWI 18D0 ; [.2D12.0020.0002.18D0] # CANADIAN SYLLABICS RWII 18D1 ; [.2D13.0020.0002.18D1] # CANADIAN SYLLABICS RWO 18D2 ; [.2D14.0020.0002.18D2] # CANADIAN SYLLABICS RWOO 18D3 ; [.2D15.0020.0002.18D3] # CANADIAN SYLLABICS RWA 18D4 ; [.2D16.0020.0002.18D4] # CANADIAN SYLLABICS OJIBWAY P 18D5 ; [.2D17.0020.0002.18D5] # CANADIAN SYLLABICS OJIBWAY T 18D6 ; [.2D18.0020.0002.18D6] # CANADIAN SYLLABICS OJIBWAY K 18D7 ; [.2D19.0020.0002.18D7] # CANADIAN SYLLABICS OJIBWAY C 18D8 ; [.2D1A.0020.0002.18D8] # CANADIAN SYLLABICS OJIBWAY M 18D9 ; [.2D1B.0020.0002.18D9] # CANADIAN SYLLABICS OJIBWAY N 18DA ; [.2D1C.0020.0002.18DA] # CANADIAN SYLLABICS OJIBWAY S 18DB ; [.2D1D.0020.0002.18DB] # CANADIAN SYLLABICS OJIBWAY SH 18DC ; [.2D1E.0020.0002.18DC] # CANADIAN SYLLABICS EASTERN W 18DD ; [.2D1F.0020.0002.18DD] # CANADIAN SYLLABICS WESTERN W 18DE ; [.2D20.0020.0002.18DE] # CANADIAN SYLLABICS FINAL SMALL RING 18DF ; [.2D21.0020.0002.18DF] # CANADIAN SYLLABICS FINAL RAISED DOT 18E0 ; [.2D22.0020.0002.18E0] # CANADIAN SYLLABICS R-CREE RWE 18E1 ; [.2D23.0020.0002.18E1] # CANADIAN SYLLABICS WEST-CREE LOO 18E2 ; [.2D24.0020.0002.18E2] # CANADIAN SYLLABICS WEST-CREE LAA 18E3 ; [.2D25.0020.0002.18E3] # CANADIAN SYLLABICS THWE 18E4 ; [.2D26.0020.0002.18E4] # CANADIAN SYLLABICS THWA 18E5 ; [.2D27.0020.0002.18E5] # CANADIAN SYLLABICS TTHWE 18E6 ; [.2D28.0020.0002.18E6] # CANADIAN SYLLABICS TTHOO 18E7 ; [.2D29.0020.0002.18E7] # CANADIAN SYLLABICS TTHAA 18E8 ; [.2D2A.0020.0002.18E8] # CANADIAN SYLLABICS TLHWE 18E9 ; [.2D2B.0020.0002.18E9] # CANADIAN SYLLABICS TLHOO 18EA ; [.2D2C.0020.0002.18EA] # CANADIAN SYLLABICS SAYISI SHWE 18EB ; [.2D2D.0020.0002.18EB] # CANADIAN SYLLABICS SAYISI SHOO 18EC ; [.2D2E.0020.0002.18EC] # CANADIAN SYLLABICS SAYISI HOO 18ED ; [.2D2F.0020.0002.18ED] # CANADIAN SYLLABICS CARRIER GWU 18EE ; [.2D30.0020.0002.18EE] # CANADIAN SYLLABICS CARRIER DENE GEE 18EF ; [.2D31.0020.0002.18EF] # CANADIAN SYLLABICS CARRIER GAA 18F0 ; [.2D32.0020.0002.18F0] # CANADIAN SYLLABICS CARRIER GWA 18F1 ; [.2D33.0020.0002.18F1] # CANADIAN SYLLABICS SAYISI JUU 18F2 ; [.2D34.0020.0002.18F2] # CANADIAN SYLLABICS CARRIER JWA 18F3 ; [.2D35.0020.0002.18F3] # CANADIAN SYLLABICS BEAVER DENE L 18F4 ; [.2D36.0020.0002.18F4] # CANADIAN SYLLABICS BEAVER DENE R 18F5 ; [.2D37.0020.0002.18F5] # CANADIAN SYLLABICS CARRIER DENTAL S 1681 ; [.2D38.0020.0002.1681] # OGHAM LETTER BEITH 1682 ; [.2D39.0020.0002.1682] # OGHAM LETTER LUIS 1683 ; [.2D3A.0020.0002.1683] # OGHAM LETTER FEARN 1684 ; [.2D3B.0020.0002.1684] # OGHAM LETTER SAIL 1685 ; [.2D3C.0020.0002.1685] # OGHAM LETTER NION 1686 ; [.2D3D.0020.0002.1686] # OGHAM LETTER UATH 1687 ; [.2D3E.0020.0002.1687] # OGHAM LETTER DAIR 1688 ; [.2D3F.0020.0002.1688] # OGHAM LETTER TINNE 1689 ; [.2D40.0020.0002.1689] # OGHAM LETTER COLL 168A ; [.2D41.0020.0002.168A] # OGHAM LETTER CEIRT 168B ; [.2D42.0020.0002.168B] # OGHAM LETTER MUIN 168C ; [.2D43.0020.0002.168C] # OGHAM LETTER GORT 168D ; [.2D44.0020.0002.168D] # OGHAM LETTER NGEADAL 168E ; [.2D45.0020.0002.168E] # OGHAM LETTER STRAIF 168F ; [.2D46.0020.0002.168F] # OGHAM LETTER RUIS 1690 ; [.2D47.0020.0002.1690] # OGHAM LETTER AILM 1691 ; [.2D48.0020.0002.1691] # OGHAM LETTER ONN 1692 ; [.2D49.0020.0002.1692] # OGHAM LETTER UR 1693 ; [.2D4A.0020.0002.1693] # OGHAM LETTER EADHADH 1694 ; [.2D4B.0020.0002.1694] # OGHAM LETTER IODHADH 1695 ; [.2D4C.0020.0002.1695] # OGHAM LETTER EABHADH 1696 ; [.2D4D.0020.0002.1696] # OGHAM LETTER OR 1697 ; [.2D4E.0020.0002.1697] # OGHAM LETTER UILLEANN 1698 ; [.2D4F.0020.0002.1698] # OGHAM LETTER IFIN 1699 ; [.2D50.0020.0002.1699] # OGHAM LETTER EAMHANCHOLL 169A ; [.2D51.0020.0002.169A] # OGHAM LETTER PEITH 16A0 ; [.2D52.0020.0002.16A0] # RUNIC LETTER FEHU FEOH FE F 16A1 ; [.2D52.0020.0004.16A1][.0000.0139.0004.16A1] # RUNIC LETTER V 16A2 ; [.2D53.0020.0002.16A2] # RUNIC LETTER URUZ UR U 16A4 ; [.2D53.0020.0004.16A4][.0000.0139.0004.16A4] # RUNIC LETTER Y 16A5 ; [.2D53.0020.0004.16A5][.0000.013A.0004.16A5] # RUNIC LETTER W 16A6 ; [.2D54.0020.0002.16A6] # RUNIC LETTER THURISAZ THURS THORN 16A7 ; [.2D54.0020.0004.16A7][.0000.0139.0004.16A7] # RUNIC LETTER ETH 16F0 ; [.2D54.0020.0004.16F0][.2D54.0020.0004.16F0] # RUNIC BELGTHOR SYMBOL 16A8 ; [.2D55.0020.0002.16A8] # RUNIC LETTER ANSUZ A 16A9 ; [.2D55.0020.0004.16A9][.0000.0139.0004.16A9] # RUNIC LETTER OS O 16AC ; [.2D55.0020.0004.16AC][.0000.013A.0004.16AC] # RUNIC LETTER LONG-BRANCH-OSS O 16AD ; [.2D55.0020.0004.16AD][.0000.013C.0004.16AD] # RUNIC LETTER SHORT-TWIG-OSS O 16AE ; [.2D55.0020.0004.16AE][.0000.013D.0004.16AE] # RUNIC LETTER O 16AF ; [.2D56.0020.0002.16AF] # RUNIC LETTER OE 16B0 ; [.2D57.0020.0002.16B0] # RUNIC LETTER ON 16B1 ; [.2D58.0020.0002.16B1] # RUNIC LETTER RAIDO RAD REID R 16B2 ; [.2D59.0020.0002.16B2] # RUNIC LETTER KAUNA 16B3 ; [.2D59.0020.0004.16B3][.0000.0139.0004.16B3] # RUNIC LETTER CEN 16B4 ; [.2D59.0020.0004.16B4][.0000.013A.0004.16B4] # RUNIC LETTER KAUN K 16B5 ; [.2D59.0020.0004.16B5][.0000.013C.0004.16B5] # RUNIC LETTER G 16B6 ; [.2D59.0020.0004.16B6][.0000.013D.0004.16B6] # RUNIC LETTER ENG 16B7 ; [.2D5A.0020.0002.16B7] # RUNIC LETTER GEBO GYFU G 16B9 ; [.2D5B.0020.0002.16B9] # RUNIC LETTER WUNJO WYNN W 16E9 ; [.2D5B.0020.0004.16E9][.0000.0139.0004.16E9] # RUNIC LETTER Q 16BA ; [.2D5C.0020.0002.16BA] # RUNIC LETTER HAGLAZ H 16BB ; [.2D5C.0020.0004.16BB][.0000.0139.0004.16BB] # RUNIC LETTER HAEGL H 16BC ; [.2D5C.0020.0004.16BC][.0000.013A.0004.16BC] # RUNIC LETTER LONG-BRANCH-HAGALL H 16BD ; [.2D5C.0020.0004.16BD][.0000.013C.0004.16BD] # RUNIC LETTER SHORT-TWIG-HAGALL H 16BE ; [.2D5D.0020.0002.16BE] # RUNIC LETTER NAUDIZ NYD NAUD N 16BF ; [.2D5D.0020.0004.16BF][.0000.0139.0004.16BF] # RUNIC LETTER SHORT-TWIG-NAUD N 16C0 ; [.2D5D.0020.0004.16C0][.0000.013A.0004.16C0] # RUNIC LETTER DOTTED-N 16C1 ; [.2D5E.0020.0002.16C1] # RUNIC LETTER ISAZ IS ISS I 16C2 ; [.2D5E.0020.0004.16C2][.0000.0139.0004.16C2] # RUNIC LETTER E 16C3 ; [.2D5F.0020.0002.16C3] # RUNIC LETTER JERAN J 16C4 ; [.2D5F.0020.0004.16C4][.0000.0139.0004.16C4] # RUNIC LETTER GER 16C5 ; [.2D60.0020.0002.16C5] # RUNIC LETTER LONG-BRANCH-AR AE 16C6 ; [.2D60.0020.0004.16C6][.0000.0139.0004.16C6] # RUNIC LETTER SHORT-TWIG-AR A 16EE ; [.2D60.0020.0004.16EE][.2D69.0020.0004.16EE] # RUNIC ARLAUG SYMBOL 16C7 ; [.2D61.0020.0002.16C7] # RUNIC LETTER IWAZ EOH 16C8 ; [.2D62.0020.0002.16C8] # RUNIC LETTER PERTHO PEORTH P 16D5 ; [.2D62.0020.0004.16D5][.0000.0139.0004.16D5] # RUNIC LETTER OPEN-P 16C9 ; [.2D63.0020.0002.16C9] # RUNIC LETTER ALGIZ EOLHX 16CA ; [.2D64.0020.0002.16CA] # RUNIC LETTER SOWILO S 16CB ; [.2D64.0020.0004.16CB][.0000.0139.0004.16CB] # RUNIC LETTER SIGEL LONG-BRANCH-SOL S 16EA ; [.2D64.0020.0004.16EA][.0000.013A.0004.16EA] # RUNIC LETTER X 16CC ; [.2D64.0020.0004.16CC][.0000.013C.0004.16CC] # RUNIC LETTER SHORT-TWIG-SOL S 16CD ; [.2D64.0020.0004.16CD][.0000.013D.0004.16CD] # RUNIC LETTER C 16CE ; [.2D64.0020.0004.16CE][.0000.013E.0004.16CE] # RUNIC LETTER Z 16CF ; [.2D65.0020.0002.16CF] # RUNIC LETTER TIWAZ TIR TYR T 16D0 ; [.2D65.0020.0004.16D0][.0000.0139.0004.16D0] # RUNIC LETTER SHORT-TWIG-TYR T 16D1 ; [.2D65.0020.0004.16D1][.0000.013A.0004.16D1] # RUNIC LETTER D 16D2 ; [.2D66.0020.0002.16D2] # RUNIC LETTER BERKANAN BEORC BJARKAN B 16D3 ; [.2D66.0020.0004.16D3][.0000.0139.0004.16D3] # RUNIC LETTER SHORT-TWIG-BJARKAN B 16D4 ; [.2D66.0020.0004.16D4][.0000.013A.0004.16D4] # RUNIC LETTER DOTTED-P 16D6 ; [.2D67.0020.0002.16D6] # RUNIC LETTER EHWAZ EH E 16D7 ; [.2D68.0020.0002.16D7] # RUNIC LETTER MANNAZ MAN M 16D8 ; [.2D68.0020.0004.16D8][.0000.0139.0004.16D8] # RUNIC LETTER LONG-BRANCH-MADR M 16D9 ; [.2D68.0020.0004.16D9][.0000.013A.0004.16D9] # RUNIC LETTER SHORT-TWIG-MADR M 16EF ; [.2D68.0020.0004.16EF][.0000.0139.0004.16EF][.2D68.0020.001F.16EF][.0000.0139.001F.16EF] # RUNIC TVIMADUR SYMBOL 16DA ; [.2D69.0020.0002.16DA] # RUNIC LETTER LAUKAZ LAGU LOGR L 16DB ; [.2D69.0020.0004.16DB][.0000.0139.0004.16DB] # RUNIC LETTER DOTTED-L 16DC ; [.2D6A.0020.0002.16DC] # RUNIC LETTER INGWAZ 16DD ; [.2D6A.0020.0004.16DD][.0000.0139.0004.16DD] # RUNIC LETTER ING 16DE ; [.2D6B.0020.0002.16DE] # RUNIC LETTER DAGAZ DAEG D 16DF ; [.2D6C.0020.0002.16DF] # RUNIC LETTER OTHALAN ETHEL O 16AA ; [.2D6D.0020.0002.16AA] # RUNIC LETTER AC A 16AB ; [.2D6E.0020.0002.16AB] # RUNIC LETTER AESC 16A3 ; [.2D6F.0020.0002.16A3] # RUNIC LETTER YR 16E0 ; [.2D70.0020.0002.16E0] # RUNIC LETTER EAR 16E3 ; [.2D71.0020.0002.16E3] # RUNIC LETTER CALC 16B8 ; [.2D72.0020.0002.16B8] # RUNIC LETTER GAR 16E4 ; [.2D73.0020.0002.16E4] # RUNIC LETTER CEALC 16E1 ; [.2D74.0020.0002.16E1] # RUNIC LETTER IOR 16E2 ; [.2D75.0020.0002.16E2] # RUNIC LETTER CWEORTH 16E5 ; [.2D76.0020.0002.16E5] # RUNIC LETTER STAN 16E6 ; [.2D77.0020.0002.16E6] # RUNIC LETTER LONG-BRANCH-YR 16E7 ; [.2D77.0020.0004.16E7][.0000.0139.0004.16E7] # RUNIC LETTER SHORT-TWIG-YR 16E8 ; [.2D77.0020.0004.16E8][.0000.013A.0004.16E8] # RUNIC LETTER ICELANDIC-YR 10C00 ; [.2D78.0020.0002.10C00] # OLD TURKIC LETTER ORKHON A 10C01 ; [.2D78.0020.0004.10C01][.0000.0139.0004.10C01] # OLD TURKIC LETTER YENISEI A 10C02 ; [.2D79.0020.0002.10C02] # OLD TURKIC LETTER YENISEI AE 10C03 ; [.2D7A.0020.0002.10C03] # OLD TURKIC LETTER ORKHON I 10C04 ; [.2D7A.0020.0004.10C04][.0000.0139.0004.10C04] # OLD TURKIC LETTER YENISEI I 10C05 ; [.2D7B.0020.0002.10C05] # OLD TURKIC LETTER YENISEI E 10C06 ; [.2D7C.0020.0002.10C06] # OLD TURKIC LETTER ORKHON O 10C07 ; [.2D7D.0020.0002.10C07] # OLD TURKIC LETTER ORKHON OE 10C08 ; [.2D7D.0020.0004.10C08][.0000.0139.0004.10C08] # OLD TURKIC LETTER YENISEI OE 10C09 ; [.2D7E.0020.0002.10C09] # OLD TURKIC LETTER ORKHON AB 10C0A ; [.2D7E.0020.0004.10C0A][.0000.0139.0004.10C0A] # OLD TURKIC LETTER YENISEI AB 10C0B ; [.2D7F.0020.0002.10C0B] # OLD TURKIC LETTER ORKHON AEB 10C0C ; [.2D7F.0020.0004.10C0C][.0000.0139.0004.10C0C] # OLD TURKIC LETTER YENISEI AEB 10C0D ; [.2D80.0020.0002.10C0D] # OLD TURKIC LETTER ORKHON AG 10C0E ; [.2D80.0020.0004.10C0E][.0000.0139.0004.10C0E] # OLD TURKIC LETTER YENISEI AG 10C0F ; [.2D81.0020.0002.10C0F] # OLD TURKIC LETTER ORKHON AEG 10C10 ; [.2D81.0020.0004.10C10][.0000.0139.0004.10C10] # OLD TURKIC LETTER YENISEI AEG 10C11 ; [.2D82.0020.0002.10C11] # OLD TURKIC LETTER ORKHON AD 10C12 ; [.2D82.0020.0004.10C12][.0000.0139.0004.10C12] # OLD TURKIC LETTER YENISEI AD 10C13 ; [.2D83.0020.0002.10C13] # OLD TURKIC LETTER ORKHON AED 10C14 ; [.2D84.0020.0002.10C14] # OLD TURKIC LETTER ORKHON EZ 10C15 ; [.2D84.0020.0004.10C15][.0000.0139.0004.10C15] # OLD TURKIC LETTER YENISEI EZ 10C16 ; [.2D85.0020.0002.10C16] # OLD TURKIC LETTER ORKHON AY 10C17 ; [.2D85.0020.0004.10C17][.0000.0139.0004.10C17] # OLD TURKIC LETTER YENISEI AY 10C18 ; [.2D86.0020.0002.10C18] # OLD TURKIC LETTER ORKHON AEY 10C19 ; [.2D86.0020.0004.10C19][.0000.0139.0004.10C19] # OLD TURKIC LETTER YENISEI AEY 10C1A ; [.2D87.0020.0002.10C1A] # OLD TURKIC LETTER ORKHON AEK 10C1B ; [.2D87.0020.0004.10C1B][.0000.0139.0004.10C1B] # OLD TURKIC LETTER YENISEI AEK 10C1C ; [.2D88.0020.0002.10C1C] # OLD TURKIC LETTER ORKHON OEK 10C1D ; [.2D88.0020.0004.10C1D][.0000.0139.0004.10C1D] # OLD TURKIC LETTER YENISEI OEK 10C1E ; [.2D89.0020.0002.10C1E] # OLD TURKIC LETTER ORKHON AL 10C1F ; [.2D89.0020.0004.10C1F][.0000.0139.0004.10C1F] # OLD TURKIC LETTER YENISEI AL 10C20 ; [.2D8A.0020.0002.10C20] # OLD TURKIC LETTER ORKHON AEL 10C21 ; [.2D8B.0020.0002.10C21] # OLD TURKIC LETTER ORKHON ELT 10C22 ; [.2D8C.0020.0002.10C22] # OLD TURKIC LETTER ORKHON EM 10C23 ; [.2D8D.0020.0002.10C23] # OLD TURKIC LETTER ORKHON AN 10C24 ; [.2D8E.0020.0002.10C24] # OLD TURKIC LETTER ORKHON AEN 10C25 ; [.2D8E.0020.0004.10C25][.0000.0139.0004.10C25] # OLD TURKIC LETTER YENISEI AEN 10C26 ; [.2D8F.0020.0002.10C26] # OLD TURKIC LETTER ORKHON ENT 10C27 ; [.2D8F.0020.0004.10C27][.0000.0139.0004.10C27] # OLD TURKIC LETTER YENISEI ENT 10C28 ; [.2D90.0020.0002.10C28] # OLD TURKIC LETTER ORKHON ENC 10C29 ; [.2D90.0020.0004.10C29][.0000.0139.0004.10C29] # OLD TURKIC LETTER YENISEI ENC 10C2A ; [.2D91.0020.0002.10C2A] # OLD TURKIC LETTER ORKHON ENY 10C2B ; [.2D91.0020.0004.10C2B][.0000.0139.0004.10C2B] # OLD TURKIC LETTER YENISEI ENY 10C2C ; [.2D92.0020.0002.10C2C] # OLD TURKIC LETTER YENISEI ANG 10C2D ; [.2D93.0020.0002.10C2D] # OLD TURKIC LETTER ORKHON ENG 10C2E ; [.2D93.0020.0004.10C2E][.0000.0139.0004.10C2E] # OLD TURKIC LETTER YENISEI AENG 10C2F ; [.2D94.0020.0002.10C2F] # OLD TURKIC LETTER ORKHON EP 10C30 ; [.2D95.0020.0002.10C30] # OLD TURKIC LETTER ORKHON OP 10C31 ; [.2D96.0020.0002.10C31] # OLD TURKIC LETTER ORKHON IC 10C32 ; [.2D97.0020.0002.10C32] # OLD TURKIC LETTER ORKHON EC 10C33 ; [.2D97.0020.0004.10C33][.0000.0139.0004.10C33] # OLD TURKIC LETTER YENISEI EC 10C34 ; [.2D98.0020.0002.10C34] # OLD TURKIC LETTER ORKHON AQ 10C35 ; [.2D98.0020.0004.10C35][.0000.0139.0004.10C35] # OLD TURKIC LETTER YENISEI AQ 10C36 ; [.2D99.0020.0002.10C36] # OLD TURKIC LETTER ORKHON IQ 10C37 ; [.2D99.0020.0004.10C37][.0000.0139.0004.10C37] # OLD TURKIC LETTER YENISEI IQ 10C38 ; [.2D9A.0020.0002.10C38] # OLD TURKIC LETTER ORKHON OQ 10C39 ; [.2D9A.0020.0004.10C39][.0000.0139.0004.10C39] # OLD TURKIC LETTER YENISEI OQ 10C3A ; [.2D9B.0020.0002.10C3A] # OLD TURKIC LETTER ORKHON AR 10C3B ; [.2D9B.0020.0004.10C3B][.0000.0139.0004.10C3B] # OLD TURKIC LETTER YENISEI AR 10C3C ; [.2D9C.0020.0002.10C3C] # OLD TURKIC LETTER ORKHON AER 10C3D ; [.2D9D.0020.0002.10C3D] # OLD TURKIC LETTER ORKHON AS 10C3E ; [.2D9E.0020.0002.10C3E] # OLD TURKIC LETTER ORKHON AES 10C3F ; [.2D9F.0020.0002.10C3F] # OLD TURKIC LETTER ORKHON ASH 10C40 ; [.2D9F.0020.0004.10C40][.0000.0139.0004.10C40] # OLD TURKIC LETTER YENISEI ASH 10C41 ; [.2DA0.0020.0002.10C41] # OLD TURKIC LETTER ORKHON ESH 10C42 ; [.2DA0.0020.0004.10C42][.0000.0139.0004.10C42] # OLD TURKIC LETTER YENISEI ESH 10C43 ; [.2DA1.0020.0002.10C43] # OLD TURKIC LETTER ORKHON AT 10C44 ; [.2DA1.0020.0004.10C44][.0000.0139.0004.10C44] # OLD TURKIC LETTER YENISEI AT 10C45 ; [.2DA2.0020.0002.10C45] # OLD TURKIC LETTER ORKHON AET 10C46 ; [.2DA2.0020.0004.10C46][.0000.0139.0004.10C46] # OLD TURKIC LETTER YENISEI AET 10C47 ; [.2DA3.0020.0002.10C47] # OLD TURKIC LETTER ORKHON OT 10C48 ; [.2DA4.0020.0002.10C48] # OLD TURKIC LETTER ORKHON BASH A500 ; [.2DA5.0020.0002.A500] # VAI SYLLABLE EE A501 ; [.2DA6.0020.0002.A501] # VAI SYLLABLE EEN A502 ; [.2DA7.0020.0002.A502] # VAI SYLLABLE HEE A503 ; [.2DA8.0020.0002.A503] # VAI SYLLABLE WEE A504 ; [.2DA9.0020.0002.A504] # VAI SYLLABLE WEEN A505 ; [.2DAA.0020.0002.A505] # VAI SYLLABLE PEE A506 ; [.2DAB.0020.0002.A506] # VAI SYLLABLE BHEE A507 ; [.2DAC.0020.0002.A507] # VAI SYLLABLE BEE A508 ; [.2DAD.0020.0002.A508] # VAI SYLLABLE MBEE A509 ; [.2DAE.0020.0002.A509] # VAI SYLLABLE KPEE A50A ; [.2DAF.0020.0002.A50A] # VAI SYLLABLE MGBEE A50B ; [.2DB0.0020.0002.A50B] # VAI SYLLABLE GBEE A50C ; [.2DB1.0020.0002.A50C] # VAI SYLLABLE FEE A613 ; [.2DB1.0020.0004.A613][.2EB0.0020.0004.A613] # VAI SYMBOL FEENG A50D ; [.2DB2.0020.0002.A50D] # VAI SYLLABLE VEE A50E ; [.2DB3.0020.0002.A50E] # VAI SYLLABLE TEE A50F ; [.2DB4.0020.0002.A50F] # VAI SYLLABLE THEE A510 ; [.2DB5.0020.0002.A510] # VAI SYLLABLE DHEE A511 ; [.2DB6.0020.0002.A511] # VAI SYLLABLE DHHEE A512 ; [.2DB7.0020.0002.A512] # VAI SYLLABLE LEE A513 ; [.2DB8.0020.0002.A513] # VAI SYLLABLE REE A514 ; [.2DB9.0020.0002.A514] # VAI SYLLABLE DEE A515 ; [.2DBA.0020.0002.A515] # VAI SYLLABLE NDEE A516 ; [.2DBB.0020.0002.A516] # VAI SYLLABLE SEE A517 ; [.2DBC.0020.0002.A517] # VAI SYLLABLE SHEE A518 ; [.2DBD.0020.0002.A518] # VAI SYLLABLE ZEE A519 ; [.2DBE.0020.0002.A519] # VAI SYLLABLE ZHEE A51A ; [.2DBF.0020.0002.A51A] # VAI SYLLABLE CEE A51B ; [.2DC0.0020.0002.A51B] # VAI SYLLABLE JEE A51C ; [.2DC1.0020.0002.A51C] # VAI SYLLABLE NJEE A51D ; [.2DC2.0020.0002.A51D] # VAI SYLLABLE YEE A51E ; [.2DC3.0020.0002.A51E] # VAI SYLLABLE KEE A614 ; [.2DC3.0020.0004.A614][.2EB0.0020.0004.A614] # VAI SYMBOL KEENG A51F ; [.2DC4.0020.0002.A51F] # VAI SYLLABLE NGGEE A520 ; [.2DC5.0020.0002.A520] # VAI SYLLABLE GEE A521 ; [.2DC6.0020.0002.A521] # VAI SYLLABLE MEE A522 ; [.2DC7.0020.0002.A522] # VAI SYLLABLE NEE A523 ; [.2DC8.0020.0002.A523] # VAI SYLLABLE NYEE A524 ; [.2DC9.0020.0002.A524] # VAI SYLLABLE I A525 ; [.2DCA.0020.0002.A525] # VAI SYLLABLE IN A526 ; [.2DCB.0020.0002.A526] # VAI SYLLABLE HI A527 ; [.2DCC.0020.0002.A527] # VAI SYLLABLE HIN A528 ; [.2DCD.0020.0002.A528] # VAI SYLLABLE WI A529 ; [.2DCE.0020.0002.A529] # VAI SYLLABLE WIN A52A ; [.2DCF.0020.0002.A52A] # VAI SYLLABLE PI A52B ; [.2DD0.0020.0002.A52B] # VAI SYLLABLE BHI A52C ; [.2DD1.0020.0002.A52C] # VAI SYLLABLE BI A52D ; [.2DD2.0020.0002.A52D] # VAI SYLLABLE MBI A52E ; [.2DD3.0020.0002.A52E] # VAI SYLLABLE KPI A52F ; [.2DD4.0020.0002.A52F] # VAI SYLLABLE MGBI A530 ; [.2DD5.0020.0002.A530] # VAI SYLLABLE GBI A531 ; [.2DD6.0020.0002.A531] # VAI SYLLABLE FI A532 ; [.2DD7.0020.0002.A532] # VAI SYLLABLE VI A533 ; [.2DD8.0020.0002.A533] # VAI SYLLABLE TI A615 ; [.2DD8.0020.0004.A615][.2EB0.0020.0004.A615] # VAI SYMBOL TING A534 ; [.2DD9.0020.0002.A534] # VAI SYLLABLE THI A535 ; [.2DDA.0020.0002.A535] # VAI SYLLABLE DHI A536 ; [.2DDB.0020.0002.A536] # VAI SYLLABLE DHHI A537 ; [.2DDC.0020.0002.A537] # VAI SYLLABLE LI A538 ; [.2DDD.0020.0002.A538] # VAI SYLLABLE RI A539 ; [.2DDE.0020.0002.A539] # VAI SYLLABLE DI A53A ; [.2DDF.0020.0002.A53A] # VAI SYLLABLE NDI A53B ; [.2DE0.0020.0002.A53B] # VAI SYLLABLE SI A53C ; [.2DE1.0020.0002.A53C] # VAI SYLLABLE SHI A53D ; [.2DE2.0020.0002.A53D] # VAI SYLLABLE ZI A53E ; [.2DE3.0020.0002.A53E] # VAI SYLLABLE ZHI A53F ; [.2DE4.0020.0002.A53F] # VAI SYLLABLE CI A540 ; [.2DE5.0020.0002.A540] # VAI SYLLABLE JI A541 ; [.2DE6.0020.0002.A541] # VAI SYLLABLE NJI A542 ; [.2DE7.0020.0002.A542] # VAI SYLLABLE YI A543 ; [.2DE8.0020.0002.A543] # VAI SYLLABLE KI A544 ; [.2DE9.0020.0002.A544] # VAI SYLLABLE NGGI A545 ; [.2DEA.0020.0002.A545] # VAI SYLLABLE GI A546 ; [.2DEB.0020.0002.A546] # VAI SYLLABLE MI A547 ; [.2DEC.0020.0002.A547] # VAI SYLLABLE NI A616 ; [.2DEC.0020.0004.A616][.2EB1.0020.0004.A616] # VAI SYMBOL NII A548 ; [.2DED.0020.0002.A548] # VAI SYLLABLE NYI A549 ; [.2DEE.0020.0002.A549] # VAI SYLLABLE A A54A ; [.2DEF.0020.0002.A54A] # VAI SYLLABLE AN A54B ; [.2DF0.0020.0002.A54B] # VAI SYLLABLE NGAN A54C ; [.2DF1.0020.0002.A54C] # VAI SYLLABLE HA A54D ; [.2DF2.0020.0002.A54D] # VAI SYLLABLE HAN A54E ; [.2DF3.0020.0002.A54E] # VAI SYLLABLE WA A54F ; [.2DF4.0020.0002.A54F] # VAI SYLLABLE WAN A550 ; [.2DF5.0020.0002.A550] # VAI SYLLABLE PA A551 ; [.2DF6.0020.0002.A551] # VAI SYLLABLE BHA A552 ; [.2DF7.0020.0002.A552] # VAI SYLLABLE BA A617 ; [.2DF7.0020.0004.A617][.2EB0.0020.0004.A617] # VAI SYMBOL BANG A553 ; [.2DF8.0020.0002.A553] # VAI SYLLABLE MBA A554 ; [.2DF9.0020.0002.A554] # VAI SYLLABLE KPA A555 ; [.2DFA.0020.0002.A555] # VAI SYLLABLE KPAN A556 ; [.2DFB.0020.0002.A556] # VAI SYLLABLE MGBA A557 ; [.2DFC.0020.0002.A557] # VAI SYLLABLE GBA A558 ; [.2DFD.0020.0002.A558] # VAI SYLLABLE FA A610 ; [.2DFD.0020.0004.A610] # VAI SYLLABLE NDOLE FA A618 ; [.2DFD.0020.0004.A618][.2EB1.0020.0004.A618] # VAI SYMBOL FAA A559 ; [.2DFE.0020.0002.A559] # VAI SYLLABLE VA A55A ; [.2DFF.0020.0002.A55A] # VAI SYLLABLE TA A619 ; [.2DFF.0020.0004.A619][.2EB1.0020.0004.A619] # VAI SYMBOL TAA A55B ; [.2E00.0020.0002.A55B] # VAI SYLLABLE THA A55C ; [.2E01.0020.0002.A55C] # VAI SYLLABLE DHA A55D ; [.2E02.0020.0002.A55D] # VAI SYLLABLE DHHA A55E ; [.2E03.0020.0002.A55E] # VAI SYLLABLE LA A55F ; [.2E04.0020.0002.A55F] # VAI SYLLABLE RA A560 ; [.2E05.0020.0002.A560] # VAI SYLLABLE DA A61A ; [.2E05.0020.0004.A61A][.2EB0.0020.0004.A61A] # VAI SYMBOL DANG A561 ; [.2E06.0020.0002.A561] # VAI SYLLABLE NDA A562 ; [.2E07.0020.0002.A562] # VAI SYLLABLE SA A563 ; [.2E08.0020.0002.A563] # VAI SYLLABLE SHA A564 ; [.2E09.0020.0002.A564] # VAI SYLLABLE ZA A565 ; [.2E0A.0020.0002.A565] # VAI SYLLABLE ZHA A566 ; [.2E0B.0020.0002.A566] # VAI SYLLABLE CA A567 ; [.2E0C.0020.0002.A567] # VAI SYLLABLE JA A568 ; [.2E0D.0020.0002.A568] # VAI SYLLABLE NJA A569 ; [.2E0E.0020.0002.A569] # VAI SYLLABLE YA A56A ; [.2E0F.0020.0002.A56A] # VAI SYLLABLE KA A611 ; [.2E0F.0020.0004.A611] # VAI SYLLABLE NDOLE KA A56B ; [.2E10.0020.0002.A56B] # VAI SYLLABLE KAN A56C ; [.2E11.0020.0002.A56C] # VAI SYLLABLE NGGA A56D ; [.2E12.0020.0002.A56D] # VAI SYLLABLE GA A56E ; [.2E13.0020.0002.A56E] # VAI SYLLABLE MA A62A ; [.2E13.0020.0004.A62A] # VAI SYLLABLE NDOLE MA A56F ; [.2E14.0020.0002.A56F] # VAI SYLLABLE NA A570 ; [.2E15.0020.0002.A570] # VAI SYLLABLE NYA A571 ; [.2E16.0020.0002.A571] # VAI SYLLABLE OO A572 ; [.2E17.0020.0002.A572] # VAI SYLLABLE OON A573 ; [.2E18.0020.0002.A573] # VAI SYLLABLE HOO A574 ; [.2E19.0020.0002.A574] # VAI SYLLABLE WOO A575 ; [.2E1A.0020.0002.A575] # VAI SYLLABLE WOON A576 ; [.2E1B.0020.0002.A576] # VAI SYLLABLE POO A577 ; [.2E1C.0020.0002.A577] # VAI SYLLABLE BHOO A578 ; [.2E1D.0020.0002.A578] # VAI SYLLABLE BOO A579 ; [.2E1E.0020.0002.A579] # VAI SYLLABLE MBOO A57A ; [.2E1F.0020.0002.A57A] # VAI SYLLABLE KPOO A57B ; [.2E20.0020.0002.A57B] # VAI SYLLABLE MGBOO A57C ; [.2E21.0020.0002.A57C] # VAI SYLLABLE GBOO A57D ; [.2E22.0020.0002.A57D] # VAI SYLLABLE FOO A57E ; [.2E23.0020.0002.A57E] # VAI SYLLABLE VOO A57F ; [.2E24.0020.0002.A57F] # VAI SYLLABLE TOO A580 ; [.2E25.0020.0002.A580] # VAI SYLLABLE THOO A581 ; [.2E26.0020.0002.A581] # VAI SYLLABLE DHOO A582 ; [.2E27.0020.0002.A582] # VAI SYLLABLE DHHOO A583 ; [.2E28.0020.0002.A583] # VAI SYLLABLE LOO A584 ; [.2E29.0020.0002.A584] # VAI SYLLABLE ROO A585 ; [.2E2A.0020.0002.A585] # VAI SYLLABLE DOO A61B ; [.2E2A.0020.0004.A61B][.2EB0.0020.0004.A61B] # VAI SYMBOL DOONG A586 ; [.2E2B.0020.0002.A586] # VAI SYLLABLE NDOO A587 ; [.2E2C.0020.0002.A587] # VAI SYLLABLE SOO A612 ; [.2E2C.0020.0004.A612] # VAI SYLLABLE NDOLE SOO A588 ; [.2E2D.0020.0002.A588] # VAI SYLLABLE SHOO A589 ; [.2E2E.0020.0002.A589] # VAI SYLLABLE ZOO A58A ; [.2E2F.0020.0002.A58A] # VAI SYLLABLE ZHOO A58B ; [.2E30.0020.0002.A58B] # VAI SYLLABLE COO A58C ; [.2E31.0020.0002.A58C] # VAI SYLLABLE JOO A58D ; [.2E32.0020.0002.A58D] # VAI SYLLABLE NJOO A58E ; [.2E33.0020.0002.A58E] # VAI SYLLABLE YOO A58F ; [.2E34.0020.0002.A58F] # VAI SYLLABLE KOO A590 ; [.2E35.0020.0002.A590] # VAI SYLLABLE NGGOO A591 ; [.2E36.0020.0002.A591] # VAI SYLLABLE GOO A592 ; [.2E37.0020.0002.A592] # VAI SYLLABLE MOO A593 ; [.2E38.0020.0002.A593] # VAI SYLLABLE NOO A594 ; [.2E39.0020.0002.A594] # VAI SYLLABLE NYOO A595 ; [.2E3A.0020.0002.A595] # VAI SYLLABLE U A596 ; [.2E3B.0020.0002.A596] # VAI SYLLABLE UN A597 ; [.2E3C.0020.0002.A597] # VAI SYLLABLE HU A598 ; [.2E3D.0020.0002.A598] # VAI SYLLABLE HUN A599 ; [.2E3E.0020.0002.A599] # VAI SYLLABLE WU A59A ; [.2E3F.0020.0002.A59A] # VAI SYLLABLE WUN A59B ; [.2E40.0020.0002.A59B] # VAI SYLLABLE PU A59C ; [.2E41.0020.0002.A59C] # VAI SYLLABLE BHU A59D ; [.2E42.0020.0002.A59D] # VAI SYLLABLE BU A59E ; [.2E43.0020.0002.A59E] # VAI SYLLABLE MBU A59F ; [.2E44.0020.0002.A59F] # VAI SYLLABLE KPU A5A0 ; [.2E45.0020.0002.A5A0] # VAI SYLLABLE MGBU A5A1 ; [.2E46.0020.0002.A5A1] # VAI SYLLABLE GBU A5A2 ; [.2E47.0020.0002.A5A2] # VAI SYLLABLE FU A5A3 ; [.2E48.0020.0002.A5A3] # VAI SYLLABLE VU A5A4 ; [.2E49.0020.0002.A5A4] # VAI SYLLABLE TU A5A5 ; [.2E4A.0020.0002.A5A5] # VAI SYLLABLE THU A5A6 ; [.2E4B.0020.0002.A5A6] # VAI SYLLABLE DHU A5A7 ; [.2E4C.0020.0002.A5A7] # VAI SYLLABLE DHHU A5A8 ; [.2E4D.0020.0002.A5A8] # VAI SYLLABLE LU A5A9 ; [.2E4E.0020.0002.A5A9] # VAI SYLLABLE RU A5AA ; [.2E4F.0020.0002.A5AA] # VAI SYLLABLE DU A5AB ; [.2E50.0020.0002.A5AB] # VAI SYLLABLE NDU A5AC ; [.2E51.0020.0002.A5AC] # VAI SYLLABLE SU A5AD ; [.2E52.0020.0002.A5AD] # VAI SYLLABLE SHU A5AE ; [.2E53.0020.0002.A5AE] # VAI SYLLABLE ZU A5AF ; [.2E54.0020.0002.A5AF] # VAI SYLLABLE ZHU A5B0 ; [.2E55.0020.0002.A5B0] # VAI SYLLABLE CU A5B1 ; [.2E56.0020.0002.A5B1] # VAI SYLLABLE JU A5B2 ; [.2E57.0020.0002.A5B2] # VAI SYLLABLE NJU A5B3 ; [.2E58.0020.0002.A5B3] # VAI SYLLABLE YU A5B4 ; [.2E59.0020.0002.A5B4] # VAI SYLLABLE KU A61C ; [.2E59.0020.0004.A61C][.2EB0.0020.0004.A61C] # VAI SYMBOL KUNG A5B5 ; [.2E5A.0020.0002.A5B5] # VAI SYLLABLE NGGU A5B6 ; [.2E5B.0020.0002.A5B6] # VAI SYLLABLE GU A5B7 ; [.2E5C.0020.0002.A5B7] # VAI SYLLABLE MU A5B8 ; [.2E5D.0020.0002.A5B8] # VAI SYLLABLE NU A5B9 ; [.2E5E.0020.0002.A5B9] # VAI SYLLABLE NYU A5BA ; [.2E5F.0020.0002.A5BA] # VAI SYLLABLE O A5BB ; [.2E60.0020.0002.A5BB] # VAI SYLLABLE ON A5BC ; [.2E61.0020.0002.A5BC] # VAI SYLLABLE NGON A5BD ; [.2E62.0020.0002.A5BD] # VAI SYLLABLE HO A5BE ; [.2E63.0020.0002.A5BE] # VAI SYLLABLE HON A5BF ; [.2E64.0020.0002.A5BF] # VAI SYLLABLE WO A5C0 ; [.2E65.0020.0002.A5C0] # VAI SYLLABLE WON A5C1 ; [.2E66.0020.0002.A5C1] # VAI SYLLABLE PO A5C2 ; [.2E67.0020.0002.A5C2] # VAI SYLLABLE BHO A5C3 ; [.2E68.0020.0002.A5C3] # VAI SYLLABLE BO A5C4 ; [.2E69.0020.0002.A5C4] # VAI SYLLABLE MBO A5C5 ; [.2E6A.0020.0002.A5C5] # VAI SYLLABLE KPO A5C6 ; [.2E6B.0020.0002.A5C6] # VAI SYLLABLE MGBO A5C7 ; [.2E6C.0020.0002.A5C7] # VAI SYLLABLE GBO A5C8 ; [.2E6D.0020.0002.A5C8] # VAI SYLLABLE GBON A5C9 ; [.2E6E.0020.0002.A5C9] # VAI SYLLABLE FO A5CA ; [.2E6F.0020.0002.A5CA] # VAI SYLLABLE VO A5CB ; [.2E70.0020.0002.A5CB] # VAI SYLLABLE TO A61D ; [.2E70.0020.0004.A61D][.2EB0.0020.0004.A61D] # VAI SYMBOL TONG A5CC ; [.2E71.0020.0002.A5CC] # VAI SYLLABLE THO A5CD ; [.2E72.0020.0002.A5CD] # VAI SYLLABLE DHO A5CE ; [.2E73.0020.0002.A5CE] # VAI SYLLABLE DHHO A5CF ; [.2E74.0020.0002.A5CF] # VAI SYLLABLE LO A5D0 ; [.2E75.0020.0002.A5D0] # VAI SYLLABLE RO A5D1 ; [.2E76.0020.0002.A5D1] # VAI SYLLABLE DO A62B ; [.2E76.0020.0004.A62B] # VAI SYLLABLE NDOLE DO A61E ; [.2E76.0020.0004.A61E][.2EB1.0020.0004.A61E] # VAI SYMBOL DO-O A5D2 ; [.2E77.0020.0002.A5D2] # VAI SYLLABLE NDO A5D3 ; [.2E78.0020.0002.A5D3] # VAI SYLLABLE SO A5D4 ; [.2E79.0020.0002.A5D4] # VAI SYLLABLE SHO A5D5 ; [.2E7A.0020.0002.A5D5] # VAI SYLLABLE ZO A5D6 ; [.2E7B.0020.0002.A5D6] # VAI SYLLABLE ZHO A5D7 ; [.2E7C.0020.0002.A5D7] # VAI SYLLABLE CO A5D8 ; [.2E7D.0020.0002.A5D8] # VAI SYLLABLE JO A61F ; [.2E7D.0020.0004.A61F][.2EB0.0020.0004.A61F] # VAI SYMBOL JONG A5D9 ; [.2E7E.0020.0002.A5D9] # VAI SYLLABLE NJO A5DA ; [.2E7F.0020.0002.A5DA] # VAI SYLLABLE YO A5DB ; [.2E80.0020.0002.A5DB] # VAI SYLLABLE KO A5DC ; [.2E81.0020.0002.A5DC] # VAI SYLLABLE NGGO A5DD ; [.2E82.0020.0002.A5DD] # VAI SYLLABLE GO A5DE ; [.2E83.0020.0002.A5DE] # VAI SYLLABLE MO A5DF ; [.2E84.0020.0002.A5DF] # VAI SYLLABLE NO A5E0 ; [.2E85.0020.0002.A5E0] # VAI SYLLABLE NYO A5E1 ; [.2E86.0020.0002.A5E1] # VAI SYLLABLE E A5E2 ; [.2E87.0020.0002.A5E2] # VAI SYLLABLE EN A5E3 ; [.2E88.0020.0002.A5E3] # VAI SYLLABLE NGEN A5E4 ; [.2E89.0020.0002.A5E4] # VAI SYLLABLE HE A5E5 ; [.2E8A.0020.0002.A5E5] # VAI SYLLABLE HEN A5E6 ; [.2E8B.0020.0002.A5E6] # VAI SYLLABLE WE A5E7 ; [.2E8C.0020.0002.A5E7] # VAI SYLLABLE WEN A5E8 ; [.2E8D.0020.0002.A5E8] # VAI SYLLABLE PE A5E9 ; [.2E8E.0020.0002.A5E9] # VAI SYLLABLE BHE A5EA ; [.2E8F.0020.0002.A5EA] # VAI SYLLABLE BE A5EB ; [.2E90.0020.0002.A5EB] # VAI SYLLABLE MBE A5EC ; [.2E91.0020.0002.A5EC] # VAI SYLLABLE KPE A5ED ; [.2E92.0020.0002.A5ED] # VAI SYLLABLE KPEN A5EE ; [.2E93.0020.0002.A5EE] # VAI SYLLABLE MGBE A5EF ; [.2E94.0020.0002.A5EF] # VAI SYLLABLE GBE A5F0 ; [.2E95.0020.0002.A5F0] # VAI SYLLABLE GBEN A5F1 ; [.2E96.0020.0002.A5F1] # VAI SYLLABLE FE A5F2 ; [.2E97.0020.0002.A5F2] # VAI SYLLABLE VE A5F3 ; [.2E98.0020.0002.A5F3] # VAI SYLLABLE TE A5F4 ; [.2E99.0020.0002.A5F4] # VAI SYLLABLE THE A5F5 ; [.2E9A.0020.0002.A5F5] # VAI SYLLABLE DHE A5F6 ; [.2E9B.0020.0002.A5F6] # VAI SYLLABLE DHHE A5F7 ; [.2E9C.0020.0002.A5F7] # VAI SYLLABLE LE A5F8 ; [.2E9D.0020.0002.A5F8] # VAI SYLLABLE RE A5F9 ; [.2E9E.0020.0002.A5F9] # VAI SYLLABLE DE A5FA ; [.2E9F.0020.0002.A5FA] # VAI SYLLABLE NDE A5FB ; [.2EA0.0020.0002.A5FB] # VAI SYLLABLE SE A5FC ; [.2EA1.0020.0002.A5FC] # VAI SYLLABLE SHE A5FD ; [.2EA2.0020.0002.A5FD] # VAI SYLLABLE ZE A5FE ; [.2EA3.0020.0002.A5FE] # VAI SYLLABLE ZHE A5FF ; [.2EA4.0020.0002.A5FF] # VAI SYLLABLE CE A600 ; [.2EA5.0020.0002.A600] # VAI SYLLABLE JE A601 ; [.2EA6.0020.0002.A601] # VAI SYLLABLE NJE A602 ; [.2EA7.0020.0002.A602] # VAI SYLLABLE YE A603 ; [.2EA8.0020.0002.A603] # VAI SYLLABLE KE A604 ; [.2EA9.0020.0002.A604] # VAI SYLLABLE NGGE A605 ; [.2EAA.0020.0002.A605] # VAI SYLLABLE NGGEN A606 ; [.2EAB.0020.0002.A606] # VAI SYLLABLE GE A607 ; [.2EAC.0020.0002.A607] # VAI SYLLABLE GEN A608 ; [.2EAD.0020.0002.A608] # VAI SYLLABLE ME A609 ; [.2EAE.0020.0002.A609] # VAI SYLLABLE NE A60A ; [.2EAF.0020.0002.A60A] # VAI SYLLABLE NYE A60B ; [.2EB0.0020.0002.A60B] # VAI SYLLABLE NG A60C ; [.2EB1.0020.0002.A60C] # VAI SYLLABLE LENGTHENER A6A0 ; [.2EB2.0020.0002.A6A0] # BAMUM LETTER A A6A1 ; [.2EB3.0020.0002.A6A1] # BAMUM LETTER KA A6A2 ; [.2EB4.0020.0002.A6A2] # BAMUM LETTER U A6A3 ; [.2EB5.0020.0002.A6A3] # BAMUM LETTER KU A6A4 ; [.2EB6.0020.0002.A6A4] # BAMUM LETTER EE A6A5 ; [.2EB7.0020.0002.A6A5] # BAMUM LETTER REE A6A6 ; [.2EB8.0020.0002.A6A6] # BAMUM LETTER TAE A6A7 ; [.2EB9.0020.0002.A6A7] # BAMUM LETTER O A6A8 ; [.2EBA.0020.0002.A6A8] # BAMUM LETTER NYI A6A9 ; [.2EBB.0020.0002.A6A9] # BAMUM LETTER I A6AA ; [.2EBC.0020.0002.A6AA] # BAMUM LETTER LA A6AB ; [.2EBD.0020.0002.A6AB] # BAMUM LETTER PA A6AC ; [.2EBE.0020.0002.A6AC] # BAMUM LETTER RII A6AD ; [.2EBF.0020.0002.A6AD] # BAMUM LETTER RIEE A6AE ; [.2EC0.0020.0002.A6AE] # BAMUM LETTER LEEEE A6AF ; [.2EC1.0020.0002.A6AF] # BAMUM LETTER MEEEE A6B0 ; [.2EC2.0020.0002.A6B0] # BAMUM LETTER TAA A6B1 ; [.2EC3.0020.0002.A6B1] # BAMUM LETTER NDAA A6B2 ; [.2EC4.0020.0002.A6B2] # BAMUM LETTER NJAEM A6B3 ; [.2EC5.0020.0002.A6B3] # BAMUM LETTER M A6B4 ; [.2EC6.0020.0002.A6B4] # BAMUM LETTER SUU A6B5 ; [.2EC7.0020.0002.A6B5] # BAMUM LETTER MU A6B6 ; [.2EC8.0020.0002.A6B6] # BAMUM LETTER SHII A6B7 ; [.2EC9.0020.0002.A6B7] # BAMUM LETTER SI A6B8 ; [.2ECA.0020.0002.A6B8] # BAMUM LETTER SHEUX A6B9 ; [.2ECB.0020.0002.A6B9] # BAMUM LETTER SEUX A6BA ; [.2ECC.0020.0002.A6BA] # BAMUM LETTER KYEE A6BB ; [.2ECD.0020.0002.A6BB] # BAMUM LETTER KET A6BC ; [.2ECE.0020.0002.A6BC] # BAMUM LETTER NUAE A6BD ; [.2ECF.0020.0002.A6BD] # BAMUM LETTER NU A6BE ; [.2ED0.0020.0002.A6BE] # BAMUM LETTER NJUAE A6BF ; [.2ED1.0020.0002.A6BF] # BAMUM LETTER YOQ A6C0 ; [.2ED2.0020.0002.A6C0] # BAMUM LETTER SHU A6C1 ; [.2ED3.0020.0002.A6C1] # BAMUM LETTER YUQ A6C2 ; [.2ED4.0020.0002.A6C2] # BAMUM LETTER YA A6C3 ; [.2ED5.0020.0002.A6C3] # BAMUM LETTER NSHA A6C4 ; [.2ED6.0020.0002.A6C4] # BAMUM LETTER KEUX A6C5 ; [.2ED7.0020.0002.A6C5] # BAMUM LETTER PEUX A6C6 ; [.2ED8.0020.0002.A6C6] # BAMUM LETTER NJEE A6C7 ; [.2ED9.0020.0002.A6C7] # BAMUM LETTER NTEE A6C8 ; [.2EDA.0020.0002.A6C8] # BAMUM LETTER PUE A6C9 ; [.2EDB.0020.0002.A6C9] # BAMUM LETTER WUE A6CA ; [.2EDC.0020.0002.A6CA] # BAMUM LETTER PEE A6CB ; [.2EDD.0020.0002.A6CB] # BAMUM LETTER FEE A6CC ; [.2EDE.0020.0002.A6CC] # BAMUM LETTER RU A6CD ; [.2EDF.0020.0002.A6CD] # BAMUM LETTER LU A6CE ; [.2EE0.0020.0002.A6CE] # BAMUM LETTER MI A6CF ; [.2EE1.0020.0002.A6CF] # BAMUM LETTER NI A6D0 ; [.2EE2.0020.0002.A6D0] # BAMUM LETTER REUX A6D1 ; [.2EE3.0020.0002.A6D1] # BAMUM LETTER RAE A6D2 ; [.2EE4.0020.0002.A6D2] # BAMUM LETTER KEN A6D3 ; [.2EE5.0020.0002.A6D3] # BAMUM LETTER NGKWAEN A6D4 ; [.2EE6.0020.0002.A6D4] # BAMUM LETTER NGGA A6D5 ; [.2EE7.0020.0002.A6D5] # BAMUM LETTER NGA A6D6 ; [.2EE8.0020.0002.A6D6] # BAMUM LETTER SHO A6D7 ; [.2EE9.0020.0002.A6D7] # BAMUM LETTER PUAE A6D8 ; [.2EEA.0020.0002.A6D8] # BAMUM LETTER FU A6D9 ; [.2EEB.0020.0002.A6D9] # BAMUM LETTER FOM A6DA ; [.2EEC.0020.0002.A6DA] # BAMUM LETTER WA A6DB ; [.2EED.0020.0002.A6DB] # BAMUM LETTER NA A6DC ; [.2EEE.0020.0002.A6DC] # BAMUM LETTER LI A6DD ; [.2EEF.0020.0002.A6DD] # BAMUM LETTER PI A6DE ; [.2EF0.0020.0002.A6DE] # BAMUM LETTER LOQ A6DF ; [.2EF1.0020.0002.A6DF] # BAMUM LETTER KO A6E0 ; [.2EF2.0020.0002.A6E0] # BAMUM LETTER MBEN A6E1 ; [.2EF3.0020.0002.A6E1] # BAMUM LETTER REN A6E2 ; [.2EF4.0020.0002.A6E2] # BAMUM LETTER MEN A6E3 ; [.2EF5.0020.0002.A6E3] # BAMUM LETTER MA A6E4 ; [.2EF6.0020.0002.A6E4] # BAMUM LETTER TI A6E5 ; [.2EF7.0020.0002.A6E5] # BAMUM LETTER KI A6E6 ; [.2EF8.0020.0002.A6E6] # BAMUM LETTER MO A6E7 ; [.2EF9.0020.0002.A6E7] # BAMUM LETTER MBAA A6E8 ; [.2EFA.0020.0002.A6E8] # BAMUM LETTER TET A6E9 ; [.2EFB.0020.0002.A6E9] # BAMUM LETTER KPA A6EA ; [.2EFC.0020.0002.A6EA] # BAMUM LETTER TEN A6EB ; [.2EFD.0020.0002.A6EB] # BAMUM LETTER NTUU A6EC ; [.2EFE.0020.0002.A6EC] # BAMUM LETTER SAMBA A6ED ; [.2EFF.0020.0002.A6ED] # BAMUM LETTER FAAMAE A6EE ; [.2F00.0020.0002.A6EE] # BAMUM LETTER KOVUU A6EF ; [.2F01.0020.0002.A6EF] # BAMUM LETTER KOGHOM 16800 ; [.2F02.0020.0002.16800] # BAMUM LETTER PHASE-A NGKUE MFON 16801 ; [.2F03.0020.0002.16801] # BAMUM LETTER PHASE-A GBIEE FON 16802 ; [.2F04.0020.0002.16802] # BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE 16803 ; [.2F05.0020.0002.16803] # BAMUM LETTER PHASE-A PON MFON PIPAEMBA 16804 ; [.2F06.0020.0002.16804] # BAMUM LETTER PHASE-A NAA MFON 16805 ; [.2F07.0020.0002.16805] # BAMUM LETTER PHASE-A SHUENSHUET 16806 ; [.2F08.0020.0002.16806] # BAMUM LETTER PHASE-A TITA MFON 16807 ; [.2F09.0020.0002.16807] # BAMUM LETTER PHASE-A NZA MFON 16808 ; [.2F0A.0020.0002.16808] # BAMUM LETTER PHASE-A SHINDA PA NJI 16809 ; [.2F0B.0020.0002.16809] # BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE 1680A ; [.2F0C.0020.0002.1680A] # BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA 1680B ; [.2F0D.0020.0002.1680B] # BAMUM LETTER PHASE-A MAEMBGBIEE 1680C ; [.2F0E.0020.0002.1680C] # BAMUM LETTER PHASE-A TU MAEMBA 1680D ; [.2F0F.0020.0002.1680D] # BAMUM LETTER PHASE-A NGANGU 1680E ; [.2F10.0020.0002.1680E] # BAMUM LETTER PHASE-A MAEMVEUX 1680F ; [.2F11.0020.0002.1680F] # BAMUM LETTER PHASE-A MANSUAE 16810 ; [.2F12.0020.0002.16810] # BAMUM LETTER PHASE-A MVEUAENGAM 16811 ; [.2F13.0020.0002.16811] # BAMUM LETTER PHASE-A SEUNYAM 16812 ; [.2F14.0020.0002.16812] # BAMUM LETTER PHASE-A NTOQPEN 16813 ; [.2F15.0020.0002.16813] # BAMUM LETTER PHASE-A KEUKEUTNDA 16814 ; [.2F16.0020.0002.16814] # BAMUM LETTER PHASE-A NKINDI 16815 ; [.2F17.0020.0002.16815] # BAMUM LETTER PHASE-A SUU 16816 ; [.2F18.0020.0002.16816] # BAMUM LETTER PHASE-A NGKUENZEUM 16817 ; [.2F19.0020.0002.16817] # BAMUM LETTER PHASE-A LAPAQ 16818 ; [.2F1A.0020.0002.16818] # BAMUM LETTER PHASE-A LET KUT 16819 ; [.2F1B.0020.0002.16819] # BAMUM LETTER PHASE-A NTAP MFAA 1681A ; [.2F1C.0020.0002.1681A] # BAMUM LETTER PHASE-A MAEKEUP 1681B ; [.2F1D.0020.0002.1681B] # BAMUM LETTER PHASE-A PASHAE 1681C ; [.2F1E.0020.0002.1681C] # BAMUM LETTER PHASE-A GHEUAERAE 1681D ; [.2F1F.0020.0002.1681D] # BAMUM LETTER PHASE-A PAMSHAE 1681E ; [.2F20.0020.0002.1681E] # BAMUM LETTER PHASE-A MON NGGEUAET 1681F ; [.2F21.0020.0002.1681F] # BAMUM LETTER PHASE-A NZUN MEUT 16820 ; [.2F22.0020.0002.16820] # BAMUM LETTER PHASE-A U YUQ NAE 16821 ; [.2F23.0020.0002.16821] # BAMUM LETTER PHASE-A GHEUAEGHEUAE 16822 ; [.2F24.0020.0002.16822] # BAMUM LETTER PHASE-A NTAP NTAA 16823 ; [.2F25.0020.0002.16823] # BAMUM LETTER PHASE-A SISA 16824 ; [.2F26.0020.0002.16824] # BAMUM LETTER PHASE-A MGBASA 16825 ; [.2F27.0020.0002.16825] # BAMUM LETTER PHASE-A MEUNJOMNDEUQ 16826 ; [.2F28.0020.0002.16826] # BAMUM LETTER PHASE-A MOOMPUQ 16827 ; [.2F29.0020.0002.16827] # BAMUM LETTER PHASE-A KAFA 16828 ; [.2F2A.0020.0002.16828] # BAMUM LETTER PHASE-A PA LEERAEWA 16829 ; [.2F2B.0020.0002.16829] # BAMUM LETTER PHASE-A NDA LEERAEWA 1682A ; [.2F2C.0020.0002.1682A] # BAMUM LETTER PHASE-A PET 1682B ; [.2F2D.0020.0002.1682B] # BAMUM LETTER PHASE-A MAEMKPEN 1682C ; [.2F2E.0020.0002.1682C] # BAMUM LETTER PHASE-A NIKA 1682D ; [.2F2F.0020.0002.1682D] # BAMUM LETTER PHASE-A PUP 1682E ; [.2F30.0020.0002.1682E] # BAMUM LETTER PHASE-A TUAEP 1682F ; [.2F31.0020.0002.1682F] # BAMUM LETTER PHASE-A LUAEP 16830 ; [.2F32.0020.0002.16830] # BAMUM LETTER PHASE-A SONJAM 16831 ; [.2F33.0020.0002.16831] # BAMUM LETTER PHASE-A TEUTEUWEN 16832 ; [.2F34.0020.0002.16832] # BAMUM LETTER PHASE-A MAENYI 16833 ; [.2F35.0020.0002.16833] # BAMUM LETTER PHASE-A KET 16834 ; [.2F36.0020.0002.16834] # BAMUM LETTER PHASE-A NDAANGGEUAET 16835 ; [.2F37.0020.0002.16835] # BAMUM LETTER PHASE-A KUOQ 16836 ; [.2F38.0020.0002.16836] # BAMUM LETTER PHASE-A MOOMEUT 16837 ; [.2F39.0020.0002.16837] # BAMUM LETTER PHASE-A SHUM 16838 ; [.2F3A.0020.0002.16838] # BAMUM LETTER PHASE-A LOMMAE 16839 ; [.2F3B.0020.0002.16839] # BAMUM LETTER PHASE-A FIRI 1683A ; [.2F3C.0020.0002.1683A] # BAMUM LETTER PHASE-A ROM 1683B ; [.2F3D.0020.0002.1683B] # BAMUM LETTER PHASE-A KPOQ 1683C ; [.2F3E.0020.0002.1683C] # BAMUM LETTER PHASE-A SOQ 1683D ; [.2F3F.0020.0002.1683D] # BAMUM LETTER PHASE-A MAP PIEET 1683E ; [.2F40.0020.0002.1683E] # BAMUM LETTER PHASE-A SHIRAE 1683F ; [.2F41.0020.0002.1683F] # BAMUM LETTER PHASE-A NTAP 16840 ; [.2F42.0020.0002.16840] # BAMUM LETTER PHASE-A SHOQ NSHUT YUM 16841 ; [.2F43.0020.0002.16841] # BAMUM LETTER PHASE-A NYIT MONGKEUAEQ 16842 ; [.2F44.0020.0002.16842] # BAMUM LETTER PHASE-A PAARAE 16843 ; [.2F45.0020.0002.16843] # BAMUM LETTER PHASE-A NKAARAE 16844 ; [.2F46.0020.0002.16844] # BAMUM LETTER PHASE-A UNKNOWN 16845 ; [.2F47.0020.0002.16845] # BAMUM LETTER PHASE-A NGGEN 16846 ; [.2F48.0020.0002.16846] # BAMUM LETTER PHASE-A MAESI 16847 ; [.2F49.0020.0002.16847] # BAMUM LETTER PHASE-A NJAM 16848 ; [.2F4A.0020.0002.16848] # BAMUM LETTER PHASE-A MBANYI 16849 ; [.2F4B.0020.0002.16849] # BAMUM LETTER PHASE-A NYET 1684A ; [.2F4C.0020.0002.1684A] # BAMUM LETTER PHASE-A TEUAEN 1684B ; [.2F4D.0020.0002.1684B] # BAMUM LETTER PHASE-A SOT 1684C ; [.2F4E.0020.0002.1684C] # BAMUM LETTER PHASE-A PAAM 1684D ; [.2F4F.0020.0002.1684D] # BAMUM LETTER PHASE-A NSHIEE 1684E ; [.2F50.0020.0002.1684E] # BAMUM LETTER PHASE-A MAEM 1684F ; [.2F51.0020.0002.1684F] # BAMUM LETTER PHASE-A NYI 16850 ; [.2F52.0020.0002.16850] # BAMUM LETTER PHASE-A KAQ 16851 ; [.2F53.0020.0002.16851] # BAMUM LETTER PHASE-A NSHA 16852 ; [.2F54.0020.0002.16852] # BAMUM LETTER PHASE-A VEE 16853 ; [.2F55.0020.0002.16853] # BAMUM LETTER PHASE-A LU 16854 ; [.2F56.0020.0002.16854] # BAMUM LETTER PHASE-A NEN 16855 ; [.2F57.0020.0002.16855] # BAMUM LETTER PHASE-A NAQ 16856 ; [.2F58.0020.0002.16856] # BAMUM LETTER PHASE-A MBAQ 16857 ; [.2F59.0020.0002.16857] # BAMUM LETTER PHASE-B NSHUET 16858 ; [.2F5A.0020.0002.16858] # BAMUM LETTER PHASE-B TU MAEMGBIEE 16859 ; [.2F5B.0020.0002.16859] # BAMUM LETTER PHASE-B SIEE 1685A ; [.2F5C.0020.0002.1685A] # BAMUM LETTER PHASE-B SET TU 1685B ; [.2F5D.0020.0002.1685B] # BAMUM LETTER PHASE-B LOM NTEUM 1685C ; [.2F5E.0020.0002.1685C] # BAMUM LETTER PHASE-B MBA MAELEE 1685D ; [.2F5F.0020.0002.1685D] # BAMUM LETTER PHASE-B KIEEM 1685E ; [.2F60.0020.0002.1685E] # BAMUM LETTER PHASE-B YEURAE 1685F ; [.2F61.0020.0002.1685F] # BAMUM LETTER PHASE-B MBAARAE 16860 ; [.2F62.0020.0002.16860] # BAMUM LETTER PHASE-B KAM 16861 ; [.2F63.0020.0002.16861] # BAMUM LETTER PHASE-B PEESHI 16862 ; [.2F64.0020.0002.16862] # BAMUM LETTER PHASE-B YAFU LEERAEWA 16863 ; [.2F65.0020.0002.16863] # BAMUM LETTER PHASE-B LAM NSHUT NYAM 16864 ; [.2F66.0020.0002.16864] # BAMUM LETTER PHASE-B NTIEE SHEUOQ 16865 ; [.2F67.0020.0002.16865] # BAMUM LETTER PHASE-B NDU NJAA 16866 ; [.2F68.0020.0002.16866] # BAMUM LETTER PHASE-B GHEUGHEUAEM 16867 ; [.2F69.0020.0002.16867] # BAMUM LETTER PHASE-B PIT 16868 ; [.2F6A.0020.0002.16868] # BAMUM LETTER PHASE-B TU NSIEE 16869 ; [.2F6B.0020.0002.16869] # BAMUM LETTER PHASE-B SHET NJAQ 1686A ; [.2F6C.0020.0002.1686A] # BAMUM LETTER PHASE-B SHEUAEQTU 1686B ; [.2F6D.0020.0002.1686B] # BAMUM LETTER PHASE-B MFON TEUAEQ 1686C ; [.2F6E.0020.0002.1686C] # BAMUM LETTER PHASE-B MBIT MBAAKET 1686D ; [.2F6F.0020.0002.1686D] # BAMUM LETTER PHASE-B NYI NTEUM 1686E ; [.2F70.0020.0002.1686E] # BAMUM LETTER PHASE-B KEUPUQ 1686F ; [.2F71.0020.0002.1686F] # BAMUM LETTER PHASE-B GHEUGHEN 16870 ; [.2F72.0020.0002.16870] # BAMUM LETTER PHASE-B KEUYEUX 16871 ; [.2F73.0020.0002.16871] # BAMUM LETTER PHASE-B LAANAE 16872 ; [.2F74.0020.0002.16872] # BAMUM LETTER PHASE-B PARUM 16873 ; [.2F75.0020.0002.16873] # BAMUM LETTER PHASE-B VEUM 16874 ; [.2F76.0020.0002.16874] # BAMUM LETTER PHASE-B NGKINDI MVOP 16875 ; [.2F77.0020.0002.16875] # BAMUM LETTER PHASE-B NGGEU MBU 16876 ; [.2F78.0020.0002.16876] # BAMUM LETTER PHASE-B WUAET 16877 ; [.2F79.0020.0002.16877] # BAMUM LETTER PHASE-B SAKEUAE 16878 ; [.2F7A.0020.0002.16878] # BAMUM LETTER PHASE-B TAAM 16879 ; [.2F7B.0020.0002.16879] # BAMUM LETTER PHASE-B MEUQ 1687A ; [.2F7C.0020.0002.1687A] # BAMUM LETTER PHASE-B NGGUOQ 1687B ; [.2F7D.0020.0002.1687B] # BAMUM LETTER PHASE-B NGGUOQ LARGE 1687C ; [.2F7E.0020.0002.1687C] # BAMUM LETTER PHASE-B MFIYAQ 1687D ; [.2F7F.0020.0002.1687D] # BAMUM LETTER PHASE-B SUE 1687E ; [.2F80.0020.0002.1687E] # BAMUM LETTER PHASE-B MBEURI 1687F ; [.2F81.0020.0002.1687F] # BAMUM LETTER PHASE-B MONTIEEN 16880 ; [.2F82.0020.0002.16880] # BAMUM LETTER PHASE-B NYAEMAE 16881 ; [.2F83.0020.0002.16881] # BAMUM LETTER PHASE-B PUNGAAM 16882 ; [.2F84.0020.0002.16882] # BAMUM LETTER PHASE-B MEUT NGGEET 16883 ; [.2F85.0020.0002.16883] # BAMUM LETTER PHASE-B FEUX 16884 ; [.2F86.0020.0002.16884] # BAMUM LETTER PHASE-B MBUOQ 16885 ; [.2F87.0020.0002.16885] # BAMUM LETTER PHASE-B FEE 16886 ; [.2F88.0020.0002.16886] # BAMUM LETTER PHASE-B KEUAEM 16887 ; [.2F89.0020.0002.16887] # BAMUM LETTER PHASE-B MA NJEUAENA 16888 ; [.2F8A.0020.0002.16888] # BAMUM LETTER PHASE-B MA NJUQA 16889 ; [.2F8B.0020.0002.16889] # BAMUM LETTER PHASE-B LET 1688A ; [.2F8C.0020.0002.1688A] # BAMUM LETTER PHASE-B NGGAAM 1688B ; [.2F8D.0020.0002.1688B] # BAMUM LETTER PHASE-B NSEN 1688C ; [.2F8E.0020.0002.1688C] # BAMUM LETTER PHASE-B MA 1688D ; [.2F8F.0020.0002.1688D] # BAMUM LETTER PHASE-B KIQ 1688E ; [.2F90.0020.0002.1688E] # BAMUM LETTER PHASE-B NGOM 1688F ; [.2F91.0020.0002.1688F] # BAMUM LETTER PHASE-C NGKUE MAEMBA 16890 ; [.2F92.0020.0002.16890] # BAMUM LETTER PHASE-C NZA 16891 ; [.2F93.0020.0002.16891] # BAMUM LETTER PHASE-C YUM 16892 ; [.2F94.0020.0002.16892] # BAMUM LETTER PHASE-C WANGKUOQ 16893 ; [.2F95.0020.0002.16893] # BAMUM LETTER PHASE-C NGGEN 16894 ; [.2F96.0020.0002.16894] # BAMUM LETTER PHASE-C NDEUAEREE 16895 ; [.2F97.0020.0002.16895] # BAMUM LETTER PHASE-C NGKAQ 16896 ; [.2F98.0020.0002.16896] # BAMUM LETTER PHASE-C GHARAE 16897 ; [.2F99.0020.0002.16897] # BAMUM LETTER PHASE-C MBEEKEET 16898 ; [.2F9A.0020.0002.16898] # BAMUM LETTER PHASE-C GBAYI 16899 ; [.2F9B.0020.0002.16899] # BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN 1689A ; [.2F9C.0020.0002.1689A] # BAMUM LETTER PHASE-C NTU MBIT 1689B ; [.2F9D.0020.0002.1689B] # BAMUM LETTER PHASE-C MBEUM 1689C ; [.2F9E.0020.0002.1689C] # BAMUM LETTER PHASE-C PIRIEEN 1689D ; [.2F9F.0020.0002.1689D] # BAMUM LETTER PHASE-C NDOMBU 1689E ; [.2FA0.0020.0002.1689E] # BAMUM LETTER PHASE-C MBAA CABBAGE-TREE 1689F ; [.2FA1.0020.0002.1689F] # BAMUM LETTER PHASE-C KEUSHEUAEP 168A0 ; [.2FA2.0020.0002.168A0] # BAMUM LETTER PHASE-C GHAP 168A1 ; [.2FA3.0020.0002.168A1] # BAMUM LETTER PHASE-C KEUKAQ 168A2 ; [.2FA4.0020.0002.168A2] # BAMUM LETTER PHASE-C YU MUOMAE 168A3 ; [.2FA5.0020.0002.168A3] # BAMUM LETTER PHASE-C NZEUM 168A4 ; [.2FA6.0020.0002.168A4] # BAMUM LETTER PHASE-C MBUE 168A5 ; [.2FA7.0020.0002.168A5] # BAMUM LETTER PHASE-C NSEUAEN 168A6 ; [.2FA8.0020.0002.168A6] # BAMUM LETTER PHASE-C MBIT 168A7 ; [.2FA9.0020.0002.168A7] # BAMUM LETTER PHASE-C YEUQ 168A8 ; [.2FAA.0020.0002.168A8] # BAMUM LETTER PHASE-C KPARAQ 168A9 ; [.2FAB.0020.0002.168A9] # BAMUM LETTER PHASE-C KAA 168AA ; [.2FAC.0020.0002.168AA] # BAMUM LETTER PHASE-C SEUX 168AB ; [.2FAD.0020.0002.168AB] # BAMUM LETTER PHASE-C NDIDA 168AC ; [.2FAE.0020.0002.168AC] # BAMUM LETTER PHASE-C TAASHAE 168AD ; [.2FAF.0020.0002.168AD] # BAMUM LETTER PHASE-C NJUEQ 168AE ; [.2FB0.0020.0002.168AE] # BAMUM LETTER PHASE-C TITA YUE 168AF ; [.2FB1.0020.0002.168AF] # BAMUM LETTER PHASE-C SUAET 168B0 ; [.2FB2.0020.0002.168B0] # BAMUM LETTER PHASE-C NGGUAEN NYAM 168B1 ; [.2FB3.0020.0002.168B1] # BAMUM LETTER PHASE-C VEUX 168B2 ; [.2FB4.0020.0002.168B2] # BAMUM LETTER PHASE-C NANSANAQ 168B3 ; [.2FB5.0020.0002.168B3] # BAMUM LETTER PHASE-C MA KEUAERI 168B4 ; [.2FB6.0020.0002.168B4] # BAMUM LETTER PHASE-C NTAA 168B5 ; [.2FB7.0020.0002.168B5] # BAMUM LETTER PHASE-C NGGUON 168B6 ; [.2FB8.0020.0002.168B6] # BAMUM LETTER PHASE-C LAP 168B7 ; [.2FB9.0020.0002.168B7] # BAMUM LETTER PHASE-C MBIRIEEN 168B8 ; [.2FBA.0020.0002.168B8] # BAMUM LETTER PHASE-C MGBASAQ 168B9 ; [.2FBB.0020.0002.168B9] # BAMUM LETTER PHASE-C NTEUNGBA 168BA ; [.2FBC.0020.0002.168BA] # BAMUM LETTER PHASE-C TEUTEUX 168BB ; [.2FBD.0020.0002.168BB] # BAMUM LETTER PHASE-C NGGUM 168BC ; [.2FBE.0020.0002.168BC] # BAMUM LETTER PHASE-C FUE 168BD ; [.2FBF.0020.0002.168BD] # BAMUM LETTER PHASE-C NDEUT 168BE ; [.2FC0.0020.0002.168BE] # BAMUM LETTER PHASE-C NSA 168BF ; [.2FC1.0020.0002.168BF] # BAMUM LETTER PHASE-C NSHAQ 168C0 ; [.2FC2.0020.0002.168C0] # BAMUM LETTER PHASE-C BUNG 168C1 ; [.2FC3.0020.0002.168C1] # BAMUM LETTER PHASE-C VEUAEPEN 168C2 ; [.2FC4.0020.0002.168C2] # BAMUM LETTER PHASE-C MBERAE 168C3 ; [.2FC5.0020.0002.168C3] # BAMUM LETTER PHASE-C RU 168C4 ; [.2FC6.0020.0002.168C4] # BAMUM LETTER PHASE-C NJAEM 168C5 ; [.2FC7.0020.0002.168C5] # BAMUM LETTER PHASE-C LAM 168C6 ; [.2FC8.0020.0002.168C6] # BAMUM LETTER PHASE-C TITUAEP 168C7 ; [.2FC9.0020.0002.168C7] # BAMUM LETTER PHASE-C NSUOT NGOM 168C8 ; [.2FCA.0020.0002.168C8] # BAMUM LETTER PHASE-C NJEEEE 168C9 ; [.2FCB.0020.0002.168C9] # BAMUM LETTER PHASE-C KET 168CA ; [.2FCC.0020.0002.168CA] # BAMUM LETTER PHASE-C NGGU 168CB ; [.2FCD.0020.0002.168CB] # BAMUM LETTER PHASE-C MAESI 168CC ; [.2FCE.0020.0002.168CC] # BAMUM LETTER PHASE-C MBUAEM 168CD ; [.2FCF.0020.0002.168CD] # BAMUM LETTER PHASE-C LU 168CE ; [.2FD0.0020.0002.168CE] # BAMUM LETTER PHASE-C KUT 168CF ; [.2FD1.0020.0002.168CF] # BAMUM LETTER PHASE-C NJAM 168D0 ; [.2FD2.0020.0002.168D0] # BAMUM LETTER PHASE-C NGOM 168D1 ; [.2FD3.0020.0002.168D1] # BAMUM LETTER PHASE-C WUP 168D2 ; [.2FD4.0020.0002.168D2] # BAMUM LETTER PHASE-C NGGUEET 168D3 ; [.2FD5.0020.0002.168D3] # BAMUM LETTER PHASE-C NSOM 168D4 ; [.2FD6.0020.0002.168D4] # BAMUM LETTER PHASE-C NTEN 168D5 ; [.2FD7.0020.0002.168D5] # BAMUM LETTER PHASE-C KUOP NKAARAE 168D6 ; [.2FD8.0020.0002.168D6] # BAMUM LETTER PHASE-C NSUN 168D7 ; [.2FD9.0020.0002.168D7] # BAMUM LETTER PHASE-C NDAM 168D8 ; [.2FDA.0020.0002.168D8] # BAMUM LETTER PHASE-C MA NSIEE 168D9 ; [.2FDB.0020.0002.168D9] # BAMUM LETTER PHASE-C YAA 168DA ; [.2FDC.0020.0002.168DA] # BAMUM LETTER PHASE-C NDAP 168DB ; [.2FDD.0020.0002.168DB] # BAMUM LETTER PHASE-C SHUEQ 168DC ; [.2FDE.0020.0002.168DC] # BAMUM LETTER PHASE-C SETFON 168DD ; [.2FDF.0020.0002.168DD] # BAMUM LETTER PHASE-C MBI 168DE ; [.2FE0.0020.0002.168DE] # BAMUM LETTER PHASE-C MAEMBA 168DF ; [.2FE1.0020.0002.168DF] # BAMUM LETTER PHASE-C MBANYI 168E0 ; [.2FE2.0020.0002.168E0] # BAMUM LETTER PHASE-C KEUSEUX 168E1 ; [.2FE3.0020.0002.168E1] # BAMUM LETTER PHASE-C MBEUX 168E2 ; [.2FE4.0020.0002.168E2] # BAMUM LETTER PHASE-C KEUM 168E3 ; [.2FE5.0020.0002.168E3] # BAMUM LETTER PHASE-C MBAA PICKET 168E4 ; [.2FE6.0020.0002.168E4] # BAMUM LETTER PHASE-C YUWOQ 168E5 ; [.2FE7.0020.0002.168E5] # BAMUM LETTER PHASE-C NJEUX 168E6 ; [.2FE8.0020.0002.168E6] # BAMUM LETTER PHASE-C MIEE 168E7 ; [.2FE9.0020.0002.168E7] # BAMUM LETTER PHASE-C MUAE 168E8 ; [.2FEA.0020.0002.168E8] # BAMUM LETTER PHASE-C SHIQ 168E9 ; [.2FEB.0020.0002.168E9] # BAMUM LETTER PHASE-C KEN LAW 168EA ; [.2FEC.0020.0002.168EA] # BAMUM LETTER PHASE-C KEN FATIGUE 168EB ; [.2FED.0020.0002.168EB] # BAMUM LETTER PHASE-C NGAQ 168EC ; [.2FEE.0020.0002.168EC] # BAMUM LETTER PHASE-C NAQ 168ED ; [.2FEF.0020.0002.168ED] # BAMUM LETTER PHASE-C LIQ 168EE ; [.2FF0.0020.0002.168EE] # BAMUM LETTER PHASE-C PIN 168EF ; [.2FF1.0020.0002.168EF] # BAMUM LETTER PHASE-C PEN 168F0 ; [.2FF2.0020.0002.168F0] # BAMUM LETTER PHASE-C TET 168F1 ; [.2FF3.0020.0002.168F1] # BAMUM LETTER PHASE-D MBUO 168F2 ; [.2FF4.0020.0002.168F2] # BAMUM LETTER PHASE-D WAP 168F3 ; [.2FF5.0020.0002.168F3] # BAMUM LETTER PHASE-D NJI 168F4 ; [.2FF6.0020.0002.168F4] # BAMUM LETTER PHASE-D MFON 168F5 ; [.2FF7.0020.0002.168F5] # BAMUM LETTER PHASE-D NJIEE 168F6 ; [.2FF8.0020.0002.168F6] # BAMUM LETTER PHASE-D LIEE 168F7 ; [.2FF9.0020.0002.168F7] # BAMUM LETTER PHASE-D NJEUT 168F8 ; [.2FFA.0020.0002.168F8] # BAMUM LETTER PHASE-D NSHEE 168F9 ; [.2FFB.0020.0002.168F9] # BAMUM LETTER PHASE-D NGGAAMAE 168FA ; [.2FFC.0020.0002.168FA] # BAMUM LETTER PHASE-D NYAM 168FB ; [.2FFD.0020.0002.168FB] # BAMUM LETTER PHASE-D WUAEN 168FC ; [.2FFE.0020.0002.168FC] # BAMUM LETTER PHASE-D NGKUN 168FD ; [.2FFF.0020.0002.168FD] # BAMUM LETTER PHASE-D SHEE 168FE ; [.3000.0020.0002.168FE] # BAMUM LETTER PHASE-D NGKAP 168FF ; [.3001.0020.0002.168FF] # BAMUM LETTER PHASE-D KEUAETMEUN 16900 ; [.3002.0020.0002.16900] # BAMUM LETTER PHASE-D TEUT 16901 ; [.3003.0020.0002.16901] # BAMUM LETTER PHASE-D SHEUAE 16902 ; [.3004.0020.0002.16902] # BAMUM LETTER PHASE-D NJAP 16903 ; [.3005.0020.0002.16903] # BAMUM LETTER PHASE-D SUE 16904 ; [.3006.0020.0002.16904] # BAMUM LETTER PHASE-D KET 16905 ; [.3007.0020.0002.16905] # BAMUM LETTER PHASE-D YAEMMAE 16906 ; [.3008.0020.0002.16906] # BAMUM LETTER PHASE-D KUOM 16907 ; [.3009.0020.0002.16907] # BAMUM LETTER PHASE-D SAP 16908 ; [.300A.0020.0002.16908] # BAMUM LETTER PHASE-D MFEUT 16909 ; [.300B.0020.0002.16909] # BAMUM LETTER PHASE-D NDEUX 1690A ; [.300C.0020.0002.1690A] # BAMUM LETTER PHASE-D MALEERI 1690B ; [.300D.0020.0002.1690B] # BAMUM LETTER PHASE-D MEUT 1690C ; [.300E.0020.0002.1690C] # BAMUM LETTER PHASE-D SEUAEQ 1690D ; [.300F.0020.0002.1690D] # BAMUM LETTER PHASE-D YEN 1690E ; [.3010.0020.0002.1690E] # BAMUM LETTER PHASE-D NJEUAEM 1690F ; [.3011.0020.0002.1690F] # BAMUM LETTER PHASE-D KEUOT MBUAE 16910 ; [.3012.0020.0002.16910] # BAMUM LETTER PHASE-D NGKEURI 16911 ; [.3013.0020.0002.16911] # BAMUM LETTER PHASE-D TU 16912 ; [.3014.0020.0002.16912] # BAMUM LETTER PHASE-D GHAA 16913 ; [.3015.0020.0002.16913] # BAMUM LETTER PHASE-D NGKYEE 16914 ; [.3016.0020.0002.16914] # BAMUM LETTER PHASE-D FEUFEUAET 16915 ; [.3017.0020.0002.16915] # BAMUM LETTER PHASE-D NDEE 16916 ; [.3018.0020.0002.16916] # BAMUM LETTER PHASE-D MGBOFUM 16917 ; [.3019.0020.0002.16917] # BAMUM LETTER PHASE-D LEUAEP 16918 ; [.301A.0020.0002.16918] # BAMUM LETTER PHASE-D NDON 16919 ; [.301B.0020.0002.16919] # BAMUM LETTER PHASE-D MONI 1691A ; [.301C.0020.0002.1691A] # BAMUM LETTER PHASE-D MGBEUN 1691B ; [.301D.0020.0002.1691B] # BAMUM LETTER PHASE-D PUUT 1691C ; [.301E.0020.0002.1691C] # BAMUM LETTER PHASE-D MGBIEE 1691D ; [.301F.0020.0002.1691D] # BAMUM LETTER PHASE-D MFO 1691E ; [.3020.0020.0002.1691E] # BAMUM LETTER PHASE-D LUM 1691F ; [.3021.0020.0002.1691F] # BAMUM LETTER PHASE-D NSIEEP 16920 ; [.3022.0020.0002.16920] # BAMUM LETTER PHASE-D MBAA 16921 ; [.3023.0020.0002.16921] # BAMUM LETTER PHASE-D KWAET 16922 ; [.3024.0020.0002.16922] # BAMUM LETTER PHASE-D NYET 16923 ; [.3025.0020.0002.16923] # BAMUM LETTER PHASE-D TEUAEN 16924 ; [.3026.0020.0002.16924] # BAMUM LETTER PHASE-D SOT 16925 ; [.3027.0020.0002.16925] # BAMUM LETTER PHASE-D YUWOQ 16926 ; [.3028.0020.0002.16926] # BAMUM LETTER PHASE-D KEUM 16927 ; [.3029.0020.0002.16927] # BAMUM LETTER PHASE-D RAEM 16928 ; [.302A.0020.0002.16928] # BAMUM LETTER PHASE-D TEEEE 16929 ; [.302B.0020.0002.16929] # BAMUM LETTER PHASE-D NGKEUAEQ 1692A ; [.302C.0020.0002.1692A] # BAMUM LETTER PHASE-D MFEUAE 1692B ; [.302D.0020.0002.1692B] # BAMUM LETTER PHASE-D NSIEET 1692C ; [.302E.0020.0002.1692C] # BAMUM LETTER PHASE-D KEUP 1692D ; [.302F.0020.0002.1692D] # BAMUM LETTER PHASE-D PIP 1692E ; [.3030.0020.0002.1692E] # BAMUM LETTER PHASE-D PEUTAE 1692F ; [.3031.0020.0002.1692F] # BAMUM LETTER PHASE-D NYUE 16930 ; [.3032.0020.0002.16930] # BAMUM LETTER PHASE-D LET 16931 ; [.3033.0020.0002.16931] # BAMUM LETTER PHASE-D NGGAAM 16932 ; [.3034.0020.0002.16932] # BAMUM LETTER PHASE-D MFIEE 16933 ; [.3035.0020.0002.16933] # BAMUM LETTER PHASE-D NGGWAEN 16934 ; [.3036.0020.0002.16934] # BAMUM LETTER PHASE-D YUOM 16935 ; [.3037.0020.0002.16935] # BAMUM LETTER PHASE-D PAP 16936 ; [.3038.0020.0002.16936] # BAMUM LETTER PHASE-D YUOP 16937 ; [.3039.0020.0002.16937] # BAMUM LETTER PHASE-D NDAM 16938 ; [.303A.0020.0002.16938] # BAMUM LETTER PHASE-D NTEUM 16939 ; [.303B.0020.0002.16939] # BAMUM LETTER PHASE-D SUAE 1693A ; [.303C.0020.0002.1693A] # BAMUM LETTER PHASE-D KUN 1693B ; [.303D.0020.0002.1693B] # BAMUM LETTER PHASE-D NGGEUX 1693C ; [.303E.0020.0002.1693C] # BAMUM LETTER PHASE-D NGKIEE 1693D ; [.303F.0020.0002.1693D] # BAMUM LETTER PHASE-D TUOT 1693E ; [.3040.0020.0002.1693E] # BAMUM LETTER PHASE-D MEUN 1693F ; [.3041.0020.0002.1693F] # BAMUM LETTER PHASE-D KUQ 16940 ; [.3042.0020.0002.16940] # BAMUM LETTER PHASE-D NSUM 16941 ; [.3043.0020.0002.16941] # BAMUM LETTER PHASE-D TEUN 16942 ; [.3044.0020.0002.16942] # BAMUM LETTER PHASE-D MAENJET 16943 ; [.3045.0020.0002.16943] # BAMUM LETTER PHASE-D NGGAP 16944 ; [.3046.0020.0002.16944] # BAMUM LETTER PHASE-D LEUM 16945 ; [.3047.0020.0002.16945] # BAMUM LETTER PHASE-D NGGUOM 16946 ; [.3048.0020.0002.16946] # BAMUM LETTER PHASE-D NSHUT 16947 ; [.3049.0020.0002.16947] # BAMUM LETTER PHASE-D NJUEQ 16948 ; [.304A.0020.0002.16948] # BAMUM LETTER PHASE-D GHEUAE 16949 ; [.304B.0020.0002.16949] # BAMUM LETTER PHASE-D KU 1694A ; [.304C.0020.0002.1694A] # BAMUM LETTER PHASE-D REN OLD 1694B ; [.304D.0020.0002.1694B] # BAMUM LETTER PHASE-D TAE 1694C ; [.304E.0020.0002.1694C] # BAMUM LETTER PHASE-D TOQ 1694D ; [.304F.0020.0002.1694D] # BAMUM LETTER PHASE-D NYI 1694E ; [.3050.0020.0002.1694E] # BAMUM LETTER PHASE-D RII 1694F ; [.3051.0020.0002.1694F] # BAMUM LETTER PHASE-D LEEEE 16950 ; [.3052.0020.0002.16950] # BAMUM LETTER PHASE-D MEEEE 16951 ; [.3053.0020.0002.16951] # BAMUM LETTER PHASE-D M 16952 ; [.3054.0020.0002.16952] # BAMUM LETTER PHASE-D SUU 16953 ; [.3055.0020.0002.16953] # BAMUM LETTER PHASE-D MU 16954 ; [.3056.0020.0002.16954] # BAMUM LETTER PHASE-D SHII 16955 ; [.3057.0020.0002.16955] # BAMUM LETTER PHASE-D SHEUX 16956 ; [.3058.0020.0002.16956] # BAMUM LETTER PHASE-D KYEE 16957 ; [.3059.0020.0002.16957] # BAMUM LETTER PHASE-D NU 16958 ; [.305A.0020.0002.16958] # BAMUM LETTER PHASE-D SHU 16959 ; [.305B.0020.0002.16959] # BAMUM LETTER PHASE-D NTEE 1695A ; [.305C.0020.0002.1695A] # BAMUM LETTER PHASE-D PEE 1695B ; [.305D.0020.0002.1695B] # BAMUM LETTER PHASE-D NI 1695C ; [.305E.0020.0002.1695C] # BAMUM LETTER PHASE-D SHOQ 1695D ; [.305F.0020.0002.1695D] # BAMUM LETTER PHASE-D PUQ 1695E ; [.3060.0020.0002.1695E] # BAMUM LETTER PHASE-D MVOP 1695F ; [.3061.0020.0002.1695F] # BAMUM LETTER PHASE-D LOQ 16960 ; [.3062.0020.0002.16960] # BAMUM LETTER PHASE-D REN MUCH 16961 ; [.3063.0020.0002.16961] # BAMUM LETTER PHASE-D TI 16962 ; [.3064.0020.0002.16962] # BAMUM LETTER PHASE-D NTUU 16963 ; [.3065.0020.0002.16963] # BAMUM LETTER PHASE-D MBAA SEVEN 16964 ; [.3066.0020.0002.16964] # BAMUM LETTER PHASE-D SAQ 16965 ; [.3067.0020.0002.16965] # BAMUM LETTER PHASE-D FAA 16966 ; [.3068.0020.0002.16966] # BAMUM LETTER PHASE-E NDAP 16967 ; [.3069.0020.0002.16967] # BAMUM LETTER PHASE-E TOON 16968 ; [.306A.0020.0002.16968] # BAMUM LETTER PHASE-E MBEUM 16969 ; [.306B.0020.0002.16969] # BAMUM LETTER PHASE-E LAP 1696A ; [.306C.0020.0002.1696A] # BAMUM LETTER PHASE-E VOM 1696B ; [.306D.0020.0002.1696B] # BAMUM LETTER PHASE-E LOON 1696C ; [.306E.0020.0002.1696C] # BAMUM LETTER PHASE-E PAA 1696D ; [.306F.0020.0002.1696D] # BAMUM LETTER PHASE-E SOM 1696E ; [.3070.0020.0002.1696E] # BAMUM LETTER PHASE-E RAQ 1696F ; [.3071.0020.0002.1696F] # BAMUM LETTER PHASE-E NSHUOP 16970 ; [.3072.0020.0002.16970] # BAMUM LETTER PHASE-E NDUN 16971 ; [.3073.0020.0002.16971] # BAMUM LETTER PHASE-E PUAE 16972 ; [.3074.0020.0002.16972] # BAMUM LETTER PHASE-E TAM 16973 ; [.3075.0020.0002.16973] # BAMUM LETTER PHASE-E NGKA 16974 ; [.3076.0020.0002.16974] # BAMUM LETTER PHASE-E KPEUX 16975 ; [.3077.0020.0002.16975] # BAMUM LETTER PHASE-E WUO 16976 ; [.3078.0020.0002.16976] # BAMUM LETTER PHASE-E SEE 16977 ; [.3079.0020.0002.16977] # BAMUM LETTER PHASE-E NGGEUAET 16978 ; [.307A.0020.0002.16978] # BAMUM LETTER PHASE-E PAAM 16979 ; [.307B.0020.0002.16979] # BAMUM LETTER PHASE-E TOO 1697A ; [.307C.0020.0002.1697A] # BAMUM LETTER PHASE-E KUOP 1697B ; [.307D.0020.0002.1697B] # BAMUM LETTER PHASE-E LOM 1697C ; [.307E.0020.0002.1697C] # BAMUM LETTER PHASE-E NSHIEE 1697D ; [.307F.0020.0002.1697D] # BAMUM LETTER PHASE-E NGOP 1697E ; [.3080.0020.0002.1697E] # BAMUM LETTER PHASE-E MAEM 1697F ; [.3081.0020.0002.1697F] # BAMUM LETTER PHASE-E NGKEUX 16980 ; [.3082.0020.0002.16980] # BAMUM LETTER PHASE-E NGOQ 16981 ; [.3083.0020.0002.16981] # BAMUM LETTER PHASE-E NSHUE 16982 ; [.3084.0020.0002.16982] # BAMUM LETTER PHASE-E RIMGBA 16983 ; [.3085.0020.0002.16983] # BAMUM LETTER PHASE-E NJEUX 16984 ; [.3086.0020.0002.16984] # BAMUM LETTER PHASE-E PEEM 16985 ; [.3087.0020.0002.16985] # BAMUM LETTER PHASE-E SAA 16986 ; [.3088.0020.0002.16986] # BAMUM LETTER PHASE-E NGGURAE 16987 ; [.3089.0020.0002.16987] # BAMUM LETTER PHASE-E MGBA 16988 ; [.308A.0020.0002.16988] # BAMUM LETTER PHASE-E GHEUX 16989 ; [.308B.0020.0002.16989] # BAMUM LETTER PHASE-E NGKEUAEM 1698A ; [.308C.0020.0002.1698A] # BAMUM LETTER PHASE-E NJAEMLI 1698B ; [.308D.0020.0002.1698B] # BAMUM LETTER PHASE-E MAP 1698C ; [.308E.0020.0002.1698C] # BAMUM LETTER PHASE-E LOOT 1698D ; [.308F.0020.0002.1698D] # BAMUM LETTER PHASE-E NGGEEEE 1698E ; [.3090.0020.0002.1698E] # BAMUM LETTER PHASE-E NDIQ 1698F ; [.3091.0020.0002.1698F] # BAMUM LETTER PHASE-E TAEN NTEUM 16990 ; [.3092.0020.0002.16990] # BAMUM LETTER PHASE-E SET 16991 ; [.3093.0020.0002.16991] # BAMUM LETTER PHASE-E PUM 16992 ; [.3094.0020.0002.16992] # BAMUM LETTER PHASE-E NDAA SOFTNESS 16993 ; [.3095.0020.0002.16993] # BAMUM LETTER PHASE-E NGGUAESHAE NYAM 16994 ; [.3096.0020.0002.16994] # BAMUM LETTER PHASE-E YIEE 16995 ; [.3097.0020.0002.16995] # BAMUM LETTER PHASE-E GHEUN 16996 ; [.3098.0020.0002.16996] # BAMUM LETTER PHASE-E TUAE 16997 ; [.3099.0020.0002.16997] # BAMUM LETTER PHASE-E YEUAE 16998 ; [.309A.0020.0002.16998] # BAMUM LETTER PHASE-E PO 16999 ; [.309B.0020.0002.16999] # BAMUM LETTER PHASE-E TUMAE 1699A ; [.309C.0020.0002.1699A] # BAMUM LETTER PHASE-E KEUAE 1699B ; [.309D.0020.0002.1699B] # BAMUM LETTER PHASE-E SUAEN 1699C ; [.309E.0020.0002.1699C] # BAMUM LETTER PHASE-E TEUAEQ 1699D ; [.309F.0020.0002.1699D] # BAMUM LETTER PHASE-E VEUAE 1699E ; [.30A0.0020.0002.1699E] # BAMUM LETTER PHASE-E WEUX 1699F ; [.30A1.0020.0002.1699F] # BAMUM LETTER PHASE-E LAAM 169A0 ; [.30A2.0020.0002.169A0] # BAMUM LETTER PHASE-E PU 169A1 ; [.30A3.0020.0002.169A1] # BAMUM LETTER PHASE-E TAAQ 169A2 ; [.30A4.0020.0002.169A2] # BAMUM LETTER PHASE-E GHAAMAE 169A3 ; [.30A5.0020.0002.169A3] # BAMUM LETTER PHASE-E NGEUREUT 169A4 ; [.30A6.0020.0002.169A4] # BAMUM LETTER PHASE-E SHEUAEQ 169A5 ; [.30A7.0020.0002.169A5] # BAMUM LETTER PHASE-E MGBEN 169A6 ; [.30A8.0020.0002.169A6] # BAMUM LETTER PHASE-E MBEE 169A7 ; [.30A9.0020.0002.169A7] # BAMUM LETTER PHASE-E NZAQ 169A8 ; [.30AA.0020.0002.169A8] # BAMUM LETTER PHASE-E NKOM 169A9 ; [.30AB.0020.0002.169A9] # BAMUM LETTER PHASE-E GBET 169AA ; [.30AC.0020.0002.169AA] # BAMUM LETTER PHASE-E TUM 169AB ; [.30AD.0020.0002.169AB] # BAMUM LETTER PHASE-E KUET 169AC ; [.30AE.0020.0002.169AC] # BAMUM LETTER PHASE-E YAP 169AD ; [.30AF.0020.0002.169AD] # BAMUM LETTER PHASE-E NYI CLEAVER 169AE ; [.30B0.0020.0002.169AE] # BAMUM LETTER PHASE-E YIT 169AF ; [.30B1.0020.0002.169AF] # BAMUM LETTER PHASE-E MFEUQ 169B0 ; [.30B2.0020.0002.169B0] # BAMUM LETTER PHASE-E NDIAQ 169B1 ; [.30B3.0020.0002.169B1] # BAMUM LETTER PHASE-E PIEEQ 169B2 ; [.30B4.0020.0002.169B2] # BAMUM LETTER PHASE-E YUEQ 169B3 ; [.30B5.0020.0002.169B3] # BAMUM LETTER PHASE-E LEUAEM 169B4 ; [.30B6.0020.0002.169B4] # BAMUM LETTER PHASE-E FUE 169B5 ; [.30B7.0020.0002.169B5] # BAMUM LETTER PHASE-E GBEUX 169B6 ; [.30B8.0020.0002.169B6] # BAMUM LETTER PHASE-E NGKUP 169B7 ; [.30B9.0020.0002.169B7] # BAMUM LETTER PHASE-E KET 169B8 ; [.30BA.0020.0002.169B8] # BAMUM LETTER PHASE-E MAE 169B9 ; [.30BB.0020.0002.169B9] # BAMUM LETTER PHASE-E NGKAAMI 169BA ; [.30BC.0020.0002.169BA] # BAMUM LETTER PHASE-E GHET 169BB ; [.30BD.0020.0002.169BB] # BAMUM LETTER PHASE-E FA 169BC ; [.30BE.0020.0002.169BC] # BAMUM LETTER PHASE-E NTUM 169BD ; [.30BF.0020.0002.169BD] # BAMUM LETTER PHASE-E PEUT 169BE ; [.30C0.0020.0002.169BE] # BAMUM LETTER PHASE-E YEUM 169BF ; [.30C1.0020.0002.169BF] # BAMUM LETTER PHASE-E NGGEUAE 169C0 ; [.30C2.0020.0002.169C0] # BAMUM LETTER PHASE-E NYI BETWEEN 169C1 ; [.30C3.0020.0002.169C1] # BAMUM LETTER PHASE-E NZUQ 169C2 ; [.30C4.0020.0002.169C2] # BAMUM LETTER PHASE-E POON 169C3 ; [.30C5.0020.0002.169C3] # BAMUM LETTER PHASE-E MIEE 169C4 ; [.30C6.0020.0002.169C4] # BAMUM LETTER PHASE-E FUET 169C5 ; [.30C7.0020.0002.169C5] # BAMUM LETTER PHASE-E NAE 169C6 ; [.30C8.0020.0002.169C6] # BAMUM LETTER PHASE-E MUAE 169C7 ; [.30C9.0020.0002.169C7] # BAMUM LETTER PHASE-E GHEUAE 169C8 ; [.30CA.0020.0002.169C8] # BAMUM LETTER PHASE-E FU I 169C9 ; [.30CB.0020.0002.169C9] # BAMUM LETTER PHASE-E MVI 169CA ; [.30CC.0020.0002.169CA] # BAMUM LETTER PHASE-E PUAQ 169CB ; [.30CD.0020.0002.169CB] # BAMUM LETTER PHASE-E NGKUM 169CC ; [.30CE.0020.0002.169CC] # BAMUM LETTER PHASE-E KUT 169CD ; [.30CF.0020.0002.169CD] # BAMUM LETTER PHASE-E PIET 169CE ; [.30D0.0020.0002.169CE] # BAMUM LETTER PHASE-E NTAP 169CF ; [.30D1.0020.0002.169CF] # BAMUM LETTER PHASE-E YEUAET 169D0 ; [.30D2.0020.0002.169D0] # BAMUM LETTER PHASE-E NGGUP 169D1 ; [.30D3.0020.0002.169D1] # BAMUM LETTER PHASE-E PA PEOPLE 169D2 ; [.30D4.0020.0002.169D2] # BAMUM LETTER PHASE-E FU CALL 169D3 ; [.30D5.0020.0002.169D3] # BAMUM LETTER PHASE-E FOM 169D4 ; [.30D6.0020.0002.169D4] # BAMUM LETTER PHASE-E NJEE 169D5 ; [.30D7.0020.0002.169D5] # BAMUM LETTER PHASE-E A 169D6 ; [.30D8.0020.0002.169D6] # BAMUM LETTER PHASE-E TOQ 169D7 ; [.30D9.0020.0002.169D7] # BAMUM LETTER PHASE-E O 169D8 ; [.30DA.0020.0002.169D8] # BAMUM LETTER PHASE-E I 169D9 ; [.30DB.0020.0002.169D9] # BAMUM LETTER PHASE-E LAQ 169DA ; [.30DC.0020.0002.169DA] # BAMUM LETTER PHASE-E PA PLURAL 169DB ; [.30DD.0020.0002.169DB] # BAMUM LETTER PHASE-E TAA 169DC ; [.30DE.0020.0002.169DC] # BAMUM LETTER PHASE-E TAQ 169DD ; [.30DF.0020.0002.169DD] # BAMUM LETTER PHASE-E NDAA MY HOUSE 169DE ; [.30E0.0020.0002.169DE] # BAMUM LETTER PHASE-E SHIQ 169DF ; [.30E1.0020.0002.169DF] # BAMUM LETTER PHASE-E YEUX 169E0 ; [.30E2.0020.0002.169E0] # BAMUM LETTER PHASE-E NGUAE 169E1 ; [.30E3.0020.0002.169E1] # BAMUM LETTER PHASE-E YUAEN 169E2 ; [.30E4.0020.0002.169E2] # BAMUM LETTER PHASE-E YOQ SWIMMING 169E3 ; [.30E5.0020.0002.169E3] # BAMUM LETTER PHASE-E YOQ COVER 169E4 ; [.30E6.0020.0002.169E4] # BAMUM LETTER PHASE-E YUQ 169E5 ; [.30E7.0020.0002.169E5] # BAMUM LETTER PHASE-E YUN 169E6 ; [.30E8.0020.0002.169E6] # BAMUM LETTER PHASE-E KEUX 169E7 ; [.30E9.0020.0002.169E7] # BAMUM LETTER PHASE-E PEUX 169E8 ; [.30EA.0020.0002.169E8] # BAMUM LETTER PHASE-E NJEE EPOCH 169E9 ; [.30EB.0020.0002.169E9] # BAMUM LETTER PHASE-E PUE 169EA ; [.30EC.0020.0002.169EA] # BAMUM LETTER PHASE-E WUE 169EB ; [.30ED.0020.0002.169EB] # BAMUM LETTER PHASE-E FEE 169EC ; [.30EE.0020.0002.169EC] # BAMUM LETTER PHASE-E VEE 169ED ; [.30EF.0020.0002.169ED] # BAMUM LETTER PHASE-E LU 169EE ; [.30F0.0020.0002.169EE] # BAMUM LETTER PHASE-E MI 169EF ; [.30F1.0020.0002.169EF] # BAMUM LETTER PHASE-E REUX 169F0 ; [.30F2.0020.0002.169F0] # BAMUM LETTER PHASE-E RAE 169F1 ; [.30F3.0020.0002.169F1] # BAMUM LETTER PHASE-E NGUAET 169F2 ; [.30F4.0020.0002.169F2] # BAMUM LETTER PHASE-E NGA 169F3 ; [.30F5.0020.0002.169F3] # BAMUM LETTER PHASE-E SHO 169F4 ; [.30F6.0020.0002.169F4] # BAMUM LETTER PHASE-E SHOQ 169F5 ; [.30F7.0020.0002.169F5] # BAMUM LETTER PHASE-E FU REMEDY 169F6 ; [.30F8.0020.0002.169F6] # BAMUM LETTER PHASE-E NA 169F7 ; [.30F9.0020.0002.169F7] # BAMUM LETTER PHASE-E PI 169F8 ; [.30FA.0020.0002.169F8] # BAMUM LETTER PHASE-E LOQ 169F9 ; [.30FB.0020.0002.169F9] # BAMUM LETTER PHASE-E KO 169FA ; [.30FC.0020.0002.169FA] # BAMUM LETTER PHASE-E MEN 169FB ; [.30FD.0020.0002.169FB] # BAMUM LETTER PHASE-E MA 169FC ; [.30FE.0020.0002.169FC] # BAMUM LETTER PHASE-E MAQ 169FD ; [.30FF.0020.0002.169FD] # BAMUM LETTER PHASE-E TEU 169FE ; [.3100.0020.0002.169FE] # BAMUM LETTER PHASE-E KI 169FF ; [.3101.0020.0002.169FF] # BAMUM LETTER PHASE-E MON 16A00 ; [.3102.0020.0002.16A00] # BAMUM LETTER PHASE-E TEN 16A01 ; [.3103.0020.0002.16A01] # BAMUM LETTER PHASE-E FAQ 16A02 ; [.3104.0020.0002.16A02] # BAMUM LETTER PHASE-E GHOM 16A03 ; [.3105.0020.0002.16A03] # BAMUM LETTER PHASE-F KA 16A04 ; [.3106.0020.0002.16A04] # BAMUM LETTER PHASE-F U 16A05 ; [.3107.0020.0002.16A05] # BAMUM LETTER PHASE-F KU 16A06 ; [.3108.0020.0002.16A06] # BAMUM LETTER PHASE-F EE 16A07 ; [.3109.0020.0002.16A07] # BAMUM LETTER PHASE-F REE 16A08 ; [.310A.0020.0002.16A08] # BAMUM LETTER PHASE-F TAE 16A09 ; [.310B.0020.0002.16A09] # BAMUM LETTER PHASE-F NYI 16A0A ; [.310C.0020.0002.16A0A] # BAMUM LETTER PHASE-F LA 16A0B ; [.310D.0020.0002.16A0B] # BAMUM LETTER PHASE-F RII 16A0C ; [.310E.0020.0002.16A0C] # BAMUM LETTER PHASE-F RIEE 16A0D ; [.310F.0020.0002.16A0D] # BAMUM LETTER PHASE-F MEEEE 16A0E ; [.3110.0020.0002.16A0E] # BAMUM LETTER PHASE-F TAA 16A0F ; [.3111.0020.0002.16A0F] # BAMUM LETTER PHASE-F NDAA 16A10 ; [.3112.0020.0002.16A10] # BAMUM LETTER PHASE-F NJAEM 16A11 ; [.3113.0020.0002.16A11] # BAMUM LETTER PHASE-F M 16A12 ; [.3114.0020.0002.16A12] # BAMUM LETTER PHASE-F SUU 16A13 ; [.3115.0020.0002.16A13] # BAMUM LETTER PHASE-F SHII 16A14 ; [.3116.0020.0002.16A14] # BAMUM LETTER PHASE-F SI 16A15 ; [.3117.0020.0002.16A15] # BAMUM LETTER PHASE-F SEUX 16A16 ; [.3118.0020.0002.16A16] # BAMUM LETTER PHASE-F KYEE 16A17 ; [.3119.0020.0002.16A17] # BAMUM LETTER PHASE-F KET 16A18 ; [.311A.0020.0002.16A18] # BAMUM LETTER PHASE-F NUAE 16A19 ; [.311B.0020.0002.16A19] # BAMUM LETTER PHASE-F NU 16A1A ; [.311C.0020.0002.16A1A] # BAMUM LETTER PHASE-F NJUAE 16A1B ; [.311D.0020.0002.16A1B] # BAMUM LETTER PHASE-F YOQ 16A1C ; [.311E.0020.0002.16A1C] # BAMUM LETTER PHASE-F SHU 16A1D ; [.311F.0020.0002.16A1D] # BAMUM LETTER PHASE-F YA 16A1E ; [.3120.0020.0002.16A1E] # BAMUM LETTER PHASE-F NSHA 16A1F ; [.3121.0020.0002.16A1F] # BAMUM LETTER PHASE-F PEUX 16A20 ; [.3122.0020.0002.16A20] # BAMUM LETTER PHASE-F NTEE 16A21 ; [.3123.0020.0002.16A21] # BAMUM LETTER PHASE-F WUE 16A22 ; [.3124.0020.0002.16A22] # BAMUM LETTER PHASE-F PEE 16A23 ; [.3125.0020.0002.16A23] # BAMUM LETTER PHASE-F RU 16A24 ; [.3126.0020.0002.16A24] # BAMUM LETTER PHASE-F NI 16A25 ; [.3127.0020.0002.16A25] # BAMUM LETTER PHASE-F REUX 16A26 ; [.3128.0020.0002.16A26] # BAMUM LETTER PHASE-F KEN 16A27 ; [.3129.0020.0002.16A27] # BAMUM LETTER PHASE-F NGKWAEN 16A28 ; [.312A.0020.0002.16A28] # BAMUM LETTER PHASE-F NGGA 16A29 ; [.312B.0020.0002.16A29] # BAMUM LETTER PHASE-F SHO 16A2A ; [.312C.0020.0002.16A2A] # BAMUM LETTER PHASE-F PUAE 16A2B ; [.312D.0020.0002.16A2B] # BAMUM LETTER PHASE-F FOM 16A2C ; [.312E.0020.0002.16A2C] # BAMUM LETTER PHASE-F WA 16A2D ; [.312F.0020.0002.16A2D] # BAMUM LETTER PHASE-F LI 16A2E ; [.3130.0020.0002.16A2E] # BAMUM LETTER PHASE-F LOQ 16A2F ; [.3131.0020.0002.16A2F] # BAMUM LETTER PHASE-F KO 16A30 ; [.3132.0020.0002.16A30] # BAMUM LETTER PHASE-F MBEN 16A31 ; [.3133.0020.0002.16A31] # BAMUM LETTER PHASE-F REN 16A32 ; [.3134.0020.0002.16A32] # BAMUM LETTER PHASE-F MA 16A33 ; [.3135.0020.0002.16A33] # BAMUM LETTER PHASE-F MO 16A34 ; [.3136.0020.0002.16A34] # BAMUM LETTER PHASE-F MBAA 16A35 ; [.3137.0020.0002.16A35] # BAMUM LETTER PHASE-F TET 16A36 ; [.3138.0020.0002.16A36] # BAMUM LETTER PHASE-F KPA 16A37 ; [.3139.0020.0002.16A37] # BAMUM LETTER PHASE-F SAMBA 16A38 ; [.313A.0020.0002.16A38] # BAMUM LETTER PHASE-F VUEQ 1100 ; [.313B.0020.0002.1100] # HANGUL CHOSEONG KIYEOK 3131 ; [.313B.0020.0004.3131] # HANGUL LETTER KIYEOK 3200 ; [*02FB.0020.0004.3200][.313B.0020.0004.3200][*02FC.0020.001F.3200] # PARENTHESIZED HANGUL KIYEOK 3260 ; [.313B.0020.0006.3260] # CIRCLED HANGUL KIYEOK FFA1 ; [.313B.0020.0012.FFA1] # HALFWIDTH HANGUL LETTER KIYEOK 320E ; [*02FB.0020.0004.320E][.313B.0020.0004.320E][.31B9.0020.001F.320E][*02FC.0020.001F.320E] # PARENTHESIZED HANGUL KIYEOK A 326E ; [.313B.0020.0006.326E][.31B9.0020.0006.326E] # CIRCLED HANGUL KIYEOK A 1101 ; [.313C.0020.0002.1101] # HANGUL CHOSEONG SSANGKIYEOK 3132 ; [.313C.0020.0004.3132] # HANGUL LETTER SSANGKIYEOK FFA2 ; [.313C.0020.0012.FFA2] # HALFWIDTH HANGUL LETTER SSANGKIYEOK 1102 ; [.313D.0020.0002.1102] # HANGUL CHOSEONG NIEUN 3134 ; [.313D.0020.0004.3134] # HANGUL LETTER NIEUN 3201 ; [*02FB.0020.0004.3201][.313D.0020.0004.3201][*02FC.0020.001F.3201] # PARENTHESIZED HANGUL NIEUN 3261 ; [.313D.0020.0006.3261] # CIRCLED HANGUL NIEUN FFA4 ; [.313D.0020.0012.FFA4] # HALFWIDTH HANGUL LETTER NIEUN 320F ; [*02FB.0020.0004.320F][.313D.0020.0004.320F][.31B9.0020.001F.320F][*02FC.0020.001F.320F] # PARENTHESIZED HANGUL NIEUN A 326F ; [.313D.0020.0006.326F][.31B9.0020.0006.326F] # CIRCLED HANGUL NIEUN A 1103 ; [.313E.0020.0002.1103] # HANGUL CHOSEONG TIKEUT 3137 ; [.313E.0020.0004.3137] # HANGUL LETTER TIKEUT 3202 ; [*02FB.0020.0004.3202][.313E.0020.0004.3202][*02FC.0020.001F.3202] # PARENTHESIZED HANGUL TIKEUT 3262 ; [.313E.0020.0006.3262] # CIRCLED HANGUL TIKEUT FFA7 ; [.313E.0020.0012.FFA7] # HALFWIDTH HANGUL LETTER TIKEUT 3210 ; [*02FB.0020.0004.3210][.313E.0020.0004.3210][.31B9.0020.001F.3210][*02FC.0020.001F.3210] # PARENTHESIZED HANGUL TIKEUT A 3270 ; [.313E.0020.0006.3270][.31B9.0020.0006.3270] # CIRCLED HANGUL TIKEUT A 1104 ; [.313F.0020.0002.1104] # HANGUL CHOSEONG SSANGTIKEUT 3138 ; [.313F.0020.0004.3138] # HANGUL LETTER SSANGTIKEUT FFA8 ; [.313F.0020.0012.FFA8] # HALFWIDTH HANGUL LETTER SSANGTIKEUT 1105 ; [.3140.0020.0002.1105] # HANGUL CHOSEONG RIEUL 3139 ; [.3140.0020.0004.3139] # HANGUL LETTER RIEUL 3203 ; [*02FB.0020.0004.3203][.3140.0020.0004.3203][*02FC.0020.001F.3203] # PARENTHESIZED HANGUL RIEUL 3263 ; [.3140.0020.0006.3263] # CIRCLED HANGUL RIEUL FFA9 ; [.3140.0020.0012.FFA9] # HALFWIDTH HANGUL LETTER RIEUL 3211 ; [*02FB.0020.0004.3211][.3140.0020.0004.3211][.31B9.0020.001F.3211][*02FC.0020.001F.3211] # PARENTHESIZED HANGUL RIEUL A 3271 ; [.3140.0020.0006.3271][.31B9.0020.0006.3271] # CIRCLED HANGUL RIEUL A 1106 ; [.3141.0020.0002.1106] # HANGUL CHOSEONG MIEUM 3141 ; [.3141.0020.0004.3141] # HANGUL LETTER MIEUM 3204 ; [*02FB.0020.0004.3204][.3141.0020.0004.3204][*02FC.0020.001F.3204] # PARENTHESIZED HANGUL MIEUM 3264 ; [.3141.0020.0006.3264] # CIRCLED HANGUL MIEUM FFB1 ; [.3141.0020.0012.FFB1] # HALFWIDTH HANGUL LETTER MIEUM 3212 ; [*02FB.0020.0004.3212][.3141.0020.0004.3212][.31B9.0020.001F.3212][*02FC.0020.001F.3212] # PARENTHESIZED HANGUL MIEUM A 3272 ; [.3141.0020.0006.3272][.31B9.0020.0006.3272] # CIRCLED HANGUL MIEUM A 1107 ; [.3142.0020.0002.1107] # HANGUL CHOSEONG PIEUP 3142 ; [.3142.0020.0004.3142] # HANGUL LETTER PIEUP 3205 ; [*02FB.0020.0004.3205][.3142.0020.0004.3205][*02FC.0020.001F.3205] # PARENTHESIZED HANGUL PIEUP 3265 ; [.3142.0020.0006.3265] # CIRCLED HANGUL PIEUP FFB2 ; [.3142.0020.0012.FFB2] # HALFWIDTH HANGUL LETTER PIEUP 3213 ; [*02FB.0020.0004.3213][.3142.0020.0004.3213][.31B9.0020.001F.3213][*02FC.0020.001F.3213] # PARENTHESIZED HANGUL PIEUP A 3273 ; [.3142.0020.0006.3273][.31B9.0020.0006.3273] # CIRCLED HANGUL PIEUP A 1108 ; [.3143.0020.0002.1108] # HANGUL CHOSEONG SSANGPIEUP 3143 ; [.3143.0020.0004.3143] # HANGUL LETTER SSANGPIEUP FFB3 ; [.3143.0020.0012.FFB3] # HALFWIDTH HANGUL LETTER SSANGPIEUP 1109 ; [.3144.0020.0002.1109] # HANGUL CHOSEONG SIOS 3145 ; [.3144.0020.0004.3145] # HANGUL LETTER SIOS 3206 ; [*02FB.0020.0004.3206][.3144.0020.0004.3206][*02FC.0020.001F.3206] # PARENTHESIZED HANGUL SIOS 3266 ; [.3144.0020.0006.3266] # CIRCLED HANGUL SIOS FFB5 ; [.3144.0020.0012.FFB5] # HALFWIDTH HANGUL LETTER SIOS 3214 ; [*02FB.0020.0004.3214][.3144.0020.0004.3214][.31B9.0020.001F.3214][*02FC.0020.001F.3214] # PARENTHESIZED HANGUL SIOS A 3274 ; [.3144.0020.0006.3274][.31B9.0020.0006.3274] # CIRCLED HANGUL SIOS A 110A ; [.3145.0020.0002.110A] # HANGUL CHOSEONG SSANGSIOS 3146 ; [.3145.0020.0004.3146] # HANGUL LETTER SSANGSIOS FFB6 ; [.3145.0020.0012.FFB6] # HALFWIDTH HANGUL LETTER SSANGSIOS 110B ; [.3146.0020.0002.110B] # HANGUL CHOSEONG IEUNG 3147 ; [.3146.0020.0004.3147] # HANGUL LETTER IEUNG 3207 ; [*02FB.0020.0004.3207][.3146.0020.0004.3207][*02FC.0020.001F.3207] # PARENTHESIZED HANGUL IEUNG 3267 ; [.3146.0020.0006.3267] # CIRCLED HANGUL IEUNG FFB7 ; [.3146.0020.0012.FFB7] # HALFWIDTH HANGUL LETTER IEUNG 3215 ; [*02FB.0020.0004.3215][.3146.0020.0004.3215][.31B9.0020.001F.3215][*02FC.0020.001F.3215] # PARENTHESIZED HANGUL IEUNG A 3275 ; [.3146.0020.0006.3275][.31B9.0020.0006.3275] # CIRCLED HANGUL IEUNG A 321D ; [*02FB.0020.0004.321D][.3146.0020.0004.321D][.31C1.0020.001F.321D][.3147.0020.001F.321D][.31BD.0020.001F.321D][.321A.0020.001F.321D][*02FC.0020.001F.321D] # PARENTHESIZED KOREAN CHARACTER OJEON 321E ; [*02FB.0020.0004.321E][.3146.0020.0004.321E][.31C1.0020.001F.321E][.314D.0020.001F.321E][.31C6.0020.001F.321E][*02FC.0020.001F.321E] # PARENTHESIZED KOREAN CHARACTER O HU 327E ; [.3146.0020.0006.327E][.31C6.0020.0006.327E] # CIRCLED HANGUL IEUNG U 110C ; [.3147.0020.0002.110C] # HANGUL CHOSEONG CIEUC 3148 ; [.3147.0020.0004.3148] # HANGUL LETTER CIEUC 3208 ; [*02FB.0020.0004.3208][.3147.0020.0004.3208][*02FC.0020.001F.3208] # PARENTHESIZED HANGUL CIEUC 3268 ; [.3147.0020.0006.3268] # CIRCLED HANGUL CIEUC FFB8 ; [.3147.0020.0012.FFB8] # HALFWIDTH HANGUL LETTER CIEUC 3216 ; [*02FB.0020.0004.3216][.3147.0020.0004.3216][.31B9.0020.001F.3216][*02FC.0020.001F.3216] # PARENTHESIZED HANGUL CIEUC A 3276 ; [.3147.0020.0006.3276][.31B9.0020.0006.3276] # CIRCLED HANGUL CIEUC A 321C ; [*02FB.0020.0004.321C][.3147.0020.0004.321C][.31C6.0020.001F.321C][*02FC.0020.001F.321C] # PARENTHESIZED HANGUL CIEUC U 327D ; [.3147.0020.0006.327D][.31C6.0020.0006.327D][.3146.0020.001F.327D][.31CC.0020.001F.327D] # CIRCLED KOREAN CHARACTER JUEUI 110D ; [.3148.0020.0002.110D] # HANGUL CHOSEONG SSANGCIEUC 3149 ; [.3148.0020.0004.3149] # HANGUL LETTER SSANGCIEUC FFB9 ; [.3148.0020.0012.FFB9] # HALFWIDTH HANGUL LETTER SSANGCIEUC 110E ; [.3149.0020.0002.110E] # HANGUL CHOSEONG CHIEUCH 314A ; [.3149.0020.0004.314A] # HANGUL LETTER CHIEUCH 3209 ; [*02FB.0020.0004.3209][.3149.0020.0004.3209][*02FC.0020.001F.3209] # PARENTHESIZED HANGUL CHIEUCH 3269 ; [.3149.0020.0006.3269] # CIRCLED HANGUL CHIEUCH FFBA ; [.3149.0020.0012.FFBA] # HALFWIDTH HANGUL LETTER CHIEUCH 3217 ; [*02FB.0020.0004.3217][.3149.0020.0004.3217][.31B9.0020.001F.3217][*02FC.0020.001F.3217] # PARENTHESIZED HANGUL CHIEUCH A 3277 ; [.3149.0020.0006.3277][.31B9.0020.0006.3277] # CIRCLED HANGUL CHIEUCH A 327C ; [.3149.0020.0006.327C][.31B9.0020.0006.327C][.3226.0020.001F.327C][.313B.0020.001F.327C][.31C1.0020.001F.327C] # CIRCLED KOREAN CHARACTER CHAMKO 110F ; [.314A.0020.0002.110F] # HANGUL CHOSEONG KHIEUKH 314B ; [.314A.0020.0004.314B] # HANGUL LETTER KHIEUKH 320A ; [*02FB.0020.0004.320A][.314A.0020.0004.320A][*02FC.0020.001F.320A] # PARENTHESIZED HANGUL KHIEUKH 326A ; [.314A.0020.0006.326A] # CIRCLED HANGUL KHIEUKH FFBB ; [.314A.0020.0012.FFBB] # HALFWIDTH HANGUL LETTER KHIEUKH 3218 ; [*02FB.0020.0004.3218][.314A.0020.0004.3218][.31B9.0020.001F.3218][*02FC.0020.001F.3218] # PARENTHESIZED HANGUL KHIEUKH A 3278 ; [.314A.0020.0006.3278][.31B9.0020.0006.3278] # CIRCLED HANGUL KHIEUKH A 1110 ; [.314B.0020.0002.1110] # HANGUL CHOSEONG THIEUTH 314C ; [.314B.0020.0004.314C] # HANGUL LETTER THIEUTH 320B ; [*02FB.0020.0004.320B][.314B.0020.0004.320B][*02FC.0020.001F.320B] # PARENTHESIZED HANGUL THIEUTH 326B ; [.314B.0020.0006.326B] # CIRCLED HANGUL THIEUTH FFBC ; [.314B.0020.0012.FFBC] # HALFWIDTH HANGUL LETTER THIEUTH 3219 ; [*02FB.0020.0004.3219][.314B.0020.0004.3219][.31B9.0020.001F.3219][*02FC.0020.001F.3219] # PARENTHESIZED HANGUL THIEUTH A 3279 ; [.314B.0020.0006.3279][.31B9.0020.0006.3279] # CIRCLED HANGUL THIEUTH A 1111 ; [.314C.0020.0002.1111] # HANGUL CHOSEONG PHIEUPH 314D ; [.314C.0020.0004.314D] # HANGUL LETTER PHIEUPH 320C ; [*02FB.0020.0004.320C][.314C.0020.0004.320C][*02FC.0020.001F.320C] # PARENTHESIZED HANGUL PHIEUPH 326C ; [.314C.0020.0006.326C] # CIRCLED HANGUL PHIEUPH FFBD ; [.314C.0020.0012.FFBD] # HALFWIDTH HANGUL LETTER PHIEUPH 321A ; [*02FB.0020.0004.321A][.314C.0020.0004.321A][.31B9.0020.001F.321A][*02FC.0020.001F.321A] # PARENTHESIZED HANGUL PHIEUPH A 327A ; [.314C.0020.0006.327A][.31B9.0020.0006.327A] # CIRCLED HANGUL PHIEUPH A 1112 ; [.314D.0020.0002.1112] # HANGUL CHOSEONG HIEUH 314E ; [.314D.0020.0004.314E] # HANGUL LETTER HIEUH 320D ; [*02FB.0020.0004.320D][.314D.0020.0004.320D][*02FC.0020.001F.320D] # PARENTHESIZED HANGUL HIEUH 326D ; [.314D.0020.0006.326D] # CIRCLED HANGUL HIEUH FFBE ; [.314D.0020.0012.FFBE] # HALFWIDTH HANGUL LETTER HIEUH 321B ; [*02FB.0020.0004.321B][.314D.0020.0004.321B][.31B9.0020.001F.321B][*02FC.0020.001F.321B] # PARENTHESIZED HANGUL HIEUH A 327B ; [.314D.0020.0006.327B][.31B9.0020.0006.327B] # CIRCLED HANGUL HIEUH A 1113 ; [.314E.0020.0002.1113] # HANGUL CHOSEONG NIEUN-KIYEOK 1114 ; [.314F.0020.0002.1114] # HANGUL CHOSEONG SSANGNIEUN 3165 ; [.314F.0020.0004.3165] # HANGUL LETTER SSANGNIEUN 1115 ; [.3150.0020.0002.1115] # HANGUL CHOSEONG NIEUN-TIKEUT 3166 ; [.3150.0020.0004.3166] # HANGUL LETTER NIEUN-TIKEUT 1116 ; [.3151.0020.0002.1116] # HANGUL CHOSEONG NIEUN-PIEUP 1117 ; [.3152.0020.0002.1117] # HANGUL CHOSEONG TIKEUT-KIYEOK 1118 ; [.3153.0020.0002.1118] # HANGUL CHOSEONG RIEUL-NIEUN 1119 ; [.3154.0020.0002.1119] # HANGUL CHOSEONG SSANGRIEUL 111A ; [.3155.0020.0002.111A] # HANGUL CHOSEONG RIEUL-HIEUH 3140 ; [.3155.0020.0004.3140] # HANGUL LETTER RIEUL-HIEUH FFB0 ; [.3155.0020.0012.FFB0] # HALFWIDTH HANGUL LETTER RIEUL-HIEUH 111B ; [.3156.0020.0002.111B] # HANGUL CHOSEONG KAPYEOUNRIEUL 111C ; [.3157.0020.0002.111C] # HANGUL CHOSEONG MIEUM-PIEUP 316E ; [.3157.0020.0004.316E] # HANGUL LETTER MIEUM-PIEUP 111D ; [.3158.0020.0002.111D] # HANGUL CHOSEONG KAPYEOUNMIEUM 3171 ; [.3158.0020.0004.3171] # HANGUL LETTER KAPYEOUNMIEUM 111E ; [.3159.0020.0002.111E] # HANGUL CHOSEONG PIEUP-KIYEOK 3172 ; [.3159.0020.0004.3172] # HANGUL LETTER PIEUP-KIYEOK 111F ; [.315A.0020.0002.111F] # HANGUL CHOSEONG PIEUP-NIEUN 1120 ; [.315B.0020.0002.1120] # HANGUL CHOSEONG PIEUP-TIKEUT 3173 ; [.315B.0020.0004.3173] # HANGUL LETTER PIEUP-TIKEUT 1121 ; [.315C.0020.0002.1121] # HANGUL CHOSEONG PIEUP-SIOS 3144 ; [.315C.0020.0004.3144] # HANGUL LETTER PIEUP-SIOS FFB4 ; [.315C.0020.0012.FFB4] # HALFWIDTH HANGUL LETTER PIEUP-SIOS 1122 ; [.315D.0020.0002.1122] # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK 3174 ; [.315D.0020.0004.3174] # HANGUL LETTER PIEUP-SIOS-KIYEOK 1123 ; [.315E.0020.0002.1123] # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT 3175 ; [.315E.0020.0004.3175] # HANGUL LETTER PIEUP-SIOS-TIKEUT 1124 ; [.315F.0020.0002.1124] # HANGUL CHOSEONG PIEUP-SIOS-PIEUP 1125 ; [.3160.0020.0002.1125] # HANGUL CHOSEONG PIEUP-SSANGSIOS 1126 ; [.3161.0020.0002.1126] # HANGUL CHOSEONG PIEUP-SIOS-CIEUC 1127 ; [.3162.0020.0002.1127] # HANGUL CHOSEONG PIEUP-CIEUC 3176 ; [.3162.0020.0004.3176] # HANGUL LETTER PIEUP-CIEUC 1128 ; [.3163.0020.0002.1128] # HANGUL CHOSEONG PIEUP-CHIEUCH 1129 ; [.3164.0020.0002.1129] # HANGUL CHOSEONG PIEUP-THIEUTH 3177 ; [.3164.0020.0004.3177] # HANGUL LETTER PIEUP-THIEUTH 112A ; [.3165.0020.0002.112A] # HANGUL CHOSEONG PIEUP-PHIEUPH 112B ; [.3166.0020.0002.112B] # HANGUL CHOSEONG KAPYEOUNPIEUP 3178 ; [.3166.0020.0004.3178] # HANGUL LETTER KAPYEOUNPIEUP 112C ; [.3167.0020.0002.112C] # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP 3179 ; [.3167.0020.0004.3179] # HANGUL LETTER KAPYEOUNSSANGPIEUP 112D ; [.3168.0020.0002.112D] # HANGUL CHOSEONG SIOS-KIYEOK 317A ; [.3168.0020.0004.317A] # HANGUL LETTER SIOS-KIYEOK 112E ; [.3169.0020.0002.112E] # HANGUL CHOSEONG SIOS-NIEUN 317B ; [.3169.0020.0004.317B] # HANGUL LETTER SIOS-NIEUN 112F ; [.316A.0020.0002.112F] # HANGUL CHOSEONG SIOS-TIKEUT 317C ; [.316A.0020.0004.317C] # HANGUL LETTER SIOS-TIKEUT 1130 ; [.316B.0020.0002.1130] # HANGUL CHOSEONG SIOS-RIEUL 1131 ; [.316C.0020.0002.1131] # HANGUL CHOSEONG SIOS-MIEUM 1132 ; [.316D.0020.0002.1132] # HANGUL CHOSEONG SIOS-PIEUP 317D ; [.316D.0020.0004.317D] # HANGUL LETTER SIOS-PIEUP 1133 ; [.316E.0020.0002.1133] # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK 1134 ; [.316F.0020.0002.1134] # HANGUL CHOSEONG SIOS-SSANGSIOS 1135 ; [.3170.0020.0002.1135] # HANGUL CHOSEONG SIOS-IEUNG 1136 ; [.3171.0020.0002.1136] # HANGUL CHOSEONG SIOS-CIEUC 317E ; [.3171.0020.0004.317E] # HANGUL LETTER SIOS-CIEUC 1137 ; [.3172.0020.0002.1137] # HANGUL CHOSEONG SIOS-CHIEUCH 1138 ; [.3173.0020.0002.1138] # HANGUL CHOSEONG SIOS-KHIEUKH 1139 ; [.3174.0020.0002.1139] # HANGUL CHOSEONG SIOS-THIEUTH 113A ; [.3175.0020.0002.113A] # HANGUL CHOSEONG SIOS-PHIEUPH 113B ; [.3176.0020.0002.113B] # HANGUL CHOSEONG SIOS-HIEUH 113C ; [.3177.0020.0002.113C] # HANGUL CHOSEONG CHITUEUMSIOS 113D ; [.3178.0020.0002.113D] # HANGUL CHOSEONG CHITUEUMSSANGSIOS 113E ; [.3179.0020.0002.113E] # HANGUL CHOSEONG CEONGCHIEUMSIOS 113F ; [.317A.0020.0002.113F] # HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS 1140 ; [.317B.0020.0002.1140] # HANGUL CHOSEONG PANSIOS 317F ; [.317B.0020.0004.317F] # HANGUL LETTER PANSIOS 1141 ; [.317C.0020.0002.1141] # HANGUL CHOSEONG IEUNG-KIYEOK 1142 ; [.317D.0020.0002.1142] # HANGUL CHOSEONG IEUNG-TIKEUT 1143 ; [.317E.0020.0002.1143] # HANGUL CHOSEONG IEUNG-MIEUM 1144 ; [.317F.0020.0002.1144] # HANGUL CHOSEONG IEUNG-PIEUP 1145 ; [.3180.0020.0002.1145] # HANGUL CHOSEONG IEUNG-SIOS 1146 ; [.3181.0020.0002.1146] # HANGUL CHOSEONG IEUNG-PANSIOS 1147 ; [.3182.0020.0002.1147] # HANGUL CHOSEONG SSANGIEUNG 3180 ; [.3182.0020.0004.3180] # HANGUL LETTER SSANGIEUNG 1148 ; [.3183.0020.0002.1148] # HANGUL CHOSEONG IEUNG-CIEUC 1149 ; [.3184.0020.0002.1149] # HANGUL CHOSEONG IEUNG-CHIEUCH 114A ; [.3185.0020.0002.114A] # HANGUL CHOSEONG IEUNG-THIEUTH 114B ; [.3186.0020.0002.114B] # HANGUL CHOSEONG IEUNG-PHIEUPH 114C ; [.3187.0020.0002.114C] # HANGUL CHOSEONG YESIEUNG 3181 ; [.3187.0020.0004.3181] # HANGUL LETTER YESIEUNG 114D ; [.3188.0020.0002.114D] # HANGUL CHOSEONG CIEUC-IEUNG 114E ; [.3189.0020.0002.114E] # HANGUL CHOSEONG CHITUEUMCIEUC 114F ; [.318A.0020.0002.114F] # HANGUL CHOSEONG CHITUEUMSSANGCIEUC 1150 ; [.318B.0020.0002.1150] # HANGUL CHOSEONG CEONGCHIEUMCIEUC 1151 ; [.318C.0020.0002.1151] # HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC 1152 ; [.318D.0020.0002.1152] # HANGUL CHOSEONG CHIEUCH-KHIEUKH 1153 ; [.318E.0020.0002.1153] # HANGUL CHOSEONG CHIEUCH-HIEUH 1154 ; [.318F.0020.0002.1154] # HANGUL CHOSEONG CHITUEUMCHIEUCH 1155 ; [.3190.0020.0002.1155] # HANGUL CHOSEONG CEONGCHIEUMCHIEUCH 1156 ; [.3191.0020.0002.1156] # HANGUL CHOSEONG PHIEUPH-PIEUP 1157 ; [.3192.0020.0002.1157] # HANGUL CHOSEONG KAPYEOUNPHIEUPH 3184 ; [.3192.0020.0004.3184] # HANGUL LETTER KAPYEOUNPHIEUPH 1158 ; [.3193.0020.0002.1158] # HANGUL CHOSEONG SSANGHIEUH 3185 ; [.3193.0020.0004.3185] # HANGUL LETTER SSANGHIEUH 1159 ; [.3194.0020.0002.1159] # HANGUL CHOSEONG YEORINHIEUH 3186 ; [.3194.0020.0004.3186] # HANGUL LETTER YEORINHIEUH 115A ; [.3195.0020.0002.115A] # HANGUL CHOSEONG KIYEOK-TIKEUT 115B ; [.3196.0020.0002.115B] # HANGUL CHOSEONG NIEUN-SIOS 115C ; [.3197.0020.0002.115C] # HANGUL CHOSEONG NIEUN-CIEUC 115D ; [.3198.0020.0002.115D] # HANGUL CHOSEONG NIEUN-HIEUH 115E ; [.3199.0020.0002.115E] # HANGUL CHOSEONG TIKEUT-RIEUL A960 ; [.319A.0020.0002.A960] # HANGUL CHOSEONG TIKEUT-MIEUM A961 ; [.319B.0020.0002.A961] # HANGUL CHOSEONG TIKEUT-PIEUP A962 ; [.319C.0020.0002.A962] # HANGUL CHOSEONG TIKEUT-SIOS A963 ; [.319D.0020.0002.A963] # HANGUL CHOSEONG TIKEUT-CIEUC A964 ; [.319E.0020.0002.A964] # HANGUL CHOSEONG RIEUL-KIYEOK A965 ; [.319F.0020.0002.A965] # HANGUL CHOSEONG RIEUL-SSANGKIYEOK A966 ; [.31A0.0020.0002.A966] # HANGUL CHOSEONG RIEUL-TIKEUT A967 ; [.31A1.0020.0002.A967] # HANGUL CHOSEONG RIEUL-SSANGTIKEUT A968 ; [.31A2.0020.0002.A968] # HANGUL CHOSEONG RIEUL-MIEUM A969 ; [.31A3.0020.0002.A969] # HANGUL CHOSEONG RIEUL-PIEUP A96A ; [.31A4.0020.0002.A96A] # HANGUL CHOSEONG RIEUL-SSANGPIEUP A96B ; [.31A5.0020.0002.A96B] # HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP A96C ; [.31A6.0020.0002.A96C] # HANGUL CHOSEONG RIEUL-SIOS A96D ; [.31A7.0020.0002.A96D] # HANGUL CHOSEONG RIEUL-CIEUC A96E ; [.31A8.0020.0002.A96E] # HANGUL CHOSEONG RIEUL-KHIEUKH A96F ; [.31A9.0020.0002.A96F] # HANGUL CHOSEONG MIEUM-KIYEOK A970 ; [.31AA.0020.0002.A970] # HANGUL CHOSEONG MIEUM-TIKEUT A971 ; [.31AB.0020.0002.A971] # HANGUL CHOSEONG MIEUM-SIOS A972 ; [.31AC.0020.0002.A972] # HANGUL CHOSEONG PIEUP-SIOS-THIEUTH A973 ; [.31AD.0020.0002.A973] # HANGUL CHOSEONG PIEUP-KHIEUKH A974 ; [.31AE.0020.0002.A974] # HANGUL CHOSEONG PIEUP-HIEUH A975 ; [.31AF.0020.0002.A975] # HANGUL CHOSEONG SSANGSIOS-PIEUP A976 ; [.31B0.0020.0002.A976] # HANGUL CHOSEONG IEUNG-RIEUL A977 ; [.31B1.0020.0002.A977] # HANGUL CHOSEONG IEUNG-HIEUH A978 ; [.31B2.0020.0002.A978] # HANGUL CHOSEONG SSANGCIEUC-HIEUH A979 ; [.31B3.0020.0002.A979] # HANGUL CHOSEONG SSANGTHIEUTH A97A ; [.31B4.0020.0002.A97A] # HANGUL CHOSEONG PHIEUPH-HIEUH A97B ; [.31B5.0020.0002.A97B] # HANGUL CHOSEONG HIEUH-SIOS A97C ; [.31B6.0020.0002.A97C] # HANGUL CHOSEONG SSANGYEORINHIEUH 115F ; [.31B7.0020.0002.115F] # HANGUL CHOSEONG FILLER 1160 ; [.31B8.0020.0002.1160] # HANGUL JUNGSEONG FILLER 3164 ; [.31B8.0020.0004.3164] # HANGUL FILLER FFA0 ; [.31B8.0020.0012.FFA0] # HALFWIDTH HANGUL FILLER 1161 ; [.31B9.0020.0002.1161] # HANGUL JUNGSEONG A 314F ; [.31B9.0020.0004.314F] # HANGUL LETTER A FFC2 ; [.31B9.0020.0012.FFC2] # HALFWIDTH HANGUL LETTER A 1162 ; [.31BA.0020.0002.1162] # HANGUL JUNGSEONG AE 3150 ; [.31BA.0020.0004.3150] # HANGUL LETTER AE FFC3 ; [.31BA.0020.0012.FFC3] # HALFWIDTH HANGUL LETTER AE 1163 ; [.31BB.0020.0002.1163] # HANGUL JUNGSEONG YA 3151 ; [.31BB.0020.0004.3151] # HANGUL LETTER YA FFC4 ; [.31BB.0020.0012.FFC4] # HALFWIDTH HANGUL LETTER YA 1164 ; [.31BC.0020.0002.1164] # HANGUL JUNGSEONG YAE 3152 ; [.31BC.0020.0004.3152] # HANGUL LETTER YAE FFC5 ; [.31BC.0020.0012.FFC5] # HALFWIDTH HANGUL LETTER YAE 1165 ; [.31BD.0020.0002.1165] # HANGUL JUNGSEONG EO 3153 ; [.31BD.0020.0004.3153] # HANGUL LETTER EO FFC6 ; [.31BD.0020.0012.FFC6] # HALFWIDTH HANGUL LETTER EO 1166 ; [.31BE.0020.0002.1166] # HANGUL JUNGSEONG E 3154 ; [.31BE.0020.0004.3154] # HANGUL LETTER E FFC7 ; [.31BE.0020.0012.FFC7] # HALFWIDTH HANGUL LETTER E 1167 ; [.31BF.0020.0002.1167] # HANGUL JUNGSEONG YEO 3155 ; [.31BF.0020.0004.3155] # HANGUL LETTER YEO FFCA ; [.31BF.0020.0012.FFCA] # HALFWIDTH HANGUL LETTER YEO 1168 ; [.31C0.0020.0002.1168] # HANGUL JUNGSEONG YE 3156 ; [.31C0.0020.0004.3156] # HANGUL LETTER YE FFCB ; [.31C0.0020.0012.FFCB] # HALFWIDTH HANGUL LETTER YE 1169 ; [.31C1.0020.0002.1169] # HANGUL JUNGSEONG O 3157 ; [.31C1.0020.0004.3157] # HANGUL LETTER O FFCC ; [.31C1.0020.0012.FFCC] # HALFWIDTH HANGUL LETTER O 116A ; [.31C2.0020.0002.116A] # HANGUL JUNGSEONG WA 3158 ; [.31C2.0020.0004.3158] # HANGUL LETTER WA FFCD ; [.31C2.0020.0012.FFCD] # HALFWIDTH HANGUL LETTER WA 116B ; [.31C3.0020.0002.116B] # HANGUL JUNGSEONG WAE 3159 ; [.31C3.0020.0004.3159] # HANGUL LETTER WAE FFCE ; [.31C3.0020.0012.FFCE] # HALFWIDTH HANGUL LETTER WAE 116C ; [.31C4.0020.0002.116C] # HANGUL JUNGSEONG OE 315A ; [.31C4.0020.0004.315A] # HANGUL LETTER OE FFCF ; [.31C4.0020.0012.FFCF] # HALFWIDTH HANGUL LETTER OE 116D ; [.31C5.0020.0002.116D] # HANGUL JUNGSEONG YO 315B ; [.31C5.0020.0004.315B] # HANGUL LETTER YO FFD2 ; [.31C5.0020.0012.FFD2] # HALFWIDTH HANGUL LETTER YO 116E ; [.31C6.0020.0002.116E] # HANGUL JUNGSEONG U 315C ; [.31C6.0020.0004.315C] # HANGUL LETTER U FFD3 ; [.31C6.0020.0012.FFD3] # HALFWIDTH HANGUL LETTER U 116F ; [.31C7.0020.0002.116F] # HANGUL JUNGSEONG WEO 315D ; [.31C7.0020.0004.315D] # HANGUL LETTER WEO FFD4 ; [.31C7.0020.0012.FFD4] # HALFWIDTH HANGUL LETTER WEO 1170 ; [.31C8.0020.0002.1170] # HANGUL JUNGSEONG WE 315E ; [.31C8.0020.0004.315E] # HANGUL LETTER WE FFD5 ; [.31C8.0020.0012.FFD5] # HALFWIDTH HANGUL LETTER WE 1171 ; [.31C9.0020.0002.1171] # HANGUL JUNGSEONG WI 315F ; [.31C9.0020.0004.315F] # HANGUL LETTER WI FFD6 ; [.31C9.0020.0012.FFD6] # HALFWIDTH HANGUL LETTER WI 1172 ; [.31CA.0020.0002.1172] # HANGUL JUNGSEONG YU 3160 ; [.31CA.0020.0004.3160] # HANGUL LETTER YU FFD7 ; [.31CA.0020.0012.FFD7] # HALFWIDTH HANGUL LETTER YU 1173 ; [.31CB.0020.0002.1173] # HANGUL JUNGSEONG EU 3161 ; [.31CB.0020.0004.3161] # HANGUL LETTER EU FFDA ; [.31CB.0020.0012.FFDA] # HALFWIDTH HANGUL LETTER EU 1174 ; [.31CC.0020.0002.1174] # HANGUL JUNGSEONG YI 3162 ; [.31CC.0020.0004.3162] # HANGUL LETTER YI FFDB ; [.31CC.0020.0012.FFDB] # HALFWIDTH HANGUL LETTER YI 1175 ; [.31CD.0020.0002.1175] # HANGUL JUNGSEONG I 3163 ; [.31CD.0020.0004.3163] # HANGUL LETTER I FFDC ; [.31CD.0020.0012.FFDC] # HALFWIDTH HANGUL LETTER I 1176 ; [.31CE.0020.0002.1176] # HANGUL JUNGSEONG A-O 1177 ; [.31CF.0020.0002.1177] # HANGUL JUNGSEONG A-U 1178 ; [.31D0.0020.0002.1178] # HANGUL JUNGSEONG YA-O 1179 ; [.31D1.0020.0002.1179] # HANGUL JUNGSEONG YA-YO 117A ; [.31D2.0020.0002.117A] # HANGUL JUNGSEONG EO-O 117B ; [.31D3.0020.0002.117B] # HANGUL JUNGSEONG EO-U 117C ; [.31D4.0020.0002.117C] # HANGUL JUNGSEONG EO-EU 117D ; [.31D5.0020.0002.117D] # HANGUL JUNGSEONG YEO-O 117E ; [.31D6.0020.0002.117E] # HANGUL JUNGSEONG YEO-U 117F ; [.31D7.0020.0002.117F] # HANGUL JUNGSEONG O-EO 1180 ; [.31D8.0020.0002.1180] # HANGUL JUNGSEONG O-E 1181 ; [.31D9.0020.0002.1181] # HANGUL JUNGSEONG O-YE 1182 ; [.31DA.0020.0002.1182] # HANGUL JUNGSEONG O-O 1183 ; [.31DB.0020.0002.1183] # HANGUL JUNGSEONG O-U 1184 ; [.31DC.0020.0002.1184] # HANGUL JUNGSEONG YO-YA 3187 ; [.31DC.0020.0004.3187] # HANGUL LETTER YO-YA 1185 ; [.31DD.0020.0002.1185] # HANGUL JUNGSEONG YO-YAE 3188 ; [.31DD.0020.0004.3188] # HANGUL LETTER YO-YAE 1186 ; [.31DE.0020.0002.1186] # HANGUL JUNGSEONG YO-YEO 1187 ; [.31DF.0020.0002.1187] # HANGUL JUNGSEONG YO-O 1188 ; [.31E0.0020.0002.1188] # HANGUL JUNGSEONG YO-I 3189 ; [.31E0.0020.0004.3189] # HANGUL LETTER YO-I 1189 ; [.31E1.0020.0002.1189] # HANGUL JUNGSEONG U-A 118A ; [.31E2.0020.0002.118A] # HANGUL JUNGSEONG U-AE 118B ; [.31E3.0020.0002.118B] # HANGUL JUNGSEONG U-EO-EU 118C ; [.31E4.0020.0002.118C] # HANGUL JUNGSEONG U-YE 118D ; [.31E5.0020.0002.118D] # HANGUL JUNGSEONG U-U 118E ; [.31E6.0020.0002.118E] # HANGUL JUNGSEONG YU-A 118F ; [.31E7.0020.0002.118F] # HANGUL JUNGSEONG YU-EO 1190 ; [.31E8.0020.0002.1190] # HANGUL JUNGSEONG YU-E 1191 ; [.31E9.0020.0002.1191] # HANGUL JUNGSEONG YU-YEO 318A ; [.31E9.0020.0004.318A] # HANGUL LETTER YU-YEO 1192 ; [.31EA.0020.0002.1192] # HANGUL JUNGSEONG YU-YE 318B ; [.31EA.0020.0004.318B] # HANGUL LETTER YU-YE 1193 ; [.31EB.0020.0002.1193] # HANGUL JUNGSEONG YU-U 1194 ; [.31EC.0020.0002.1194] # HANGUL JUNGSEONG YU-I 318C ; [.31EC.0020.0004.318C] # HANGUL LETTER YU-I 1195 ; [.31ED.0020.0002.1195] # HANGUL JUNGSEONG EU-U 1196 ; [.31EE.0020.0002.1196] # HANGUL JUNGSEONG EU-EU 1197 ; [.31EF.0020.0002.1197] # HANGUL JUNGSEONG YI-U 1198 ; [.31F0.0020.0002.1198] # HANGUL JUNGSEONG I-A 1199 ; [.31F1.0020.0002.1199] # HANGUL JUNGSEONG I-YA 119A ; [.31F2.0020.0002.119A] # HANGUL JUNGSEONG I-O 119B ; [.31F3.0020.0002.119B] # HANGUL JUNGSEONG I-U 119C ; [.31F4.0020.0002.119C] # HANGUL JUNGSEONG I-EU 119D ; [.31F5.0020.0002.119D] # HANGUL JUNGSEONG I-ARAEA 119E ; [.31F6.0020.0002.119E] # HANGUL JUNGSEONG ARAEA 318D ; [.31F6.0020.0004.318D] # HANGUL LETTER ARAEA 119F ; [.31F7.0020.0002.119F] # HANGUL JUNGSEONG ARAEA-EO 11A0 ; [.31F8.0020.0002.11A0] # HANGUL JUNGSEONG ARAEA-U 11A1 ; [.31F9.0020.0002.11A1] # HANGUL JUNGSEONG ARAEA-I 318E ; [.31F9.0020.0004.318E] # HANGUL LETTER ARAEAE 11A2 ; [.31FA.0020.0002.11A2] # HANGUL JUNGSEONG SSANGARAEA 11A3 ; [.31FB.0020.0002.11A3] # HANGUL JUNGSEONG A-EU 11A4 ; [.31FC.0020.0002.11A4] # HANGUL JUNGSEONG YA-U 11A5 ; [.31FD.0020.0002.11A5] # HANGUL JUNGSEONG YEO-YA 11A6 ; [.31FE.0020.0002.11A6] # HANGUL JUNGSEONG O-YA 11A7 ; [.31FF.0020.0002.11A7] # HANGUL JUNGSEONG O-YAE D7B0 ; [.3200.0020.0002.D7B0] # HANGUL JUNGSEONG O-YEO D7B1 ; [.3201.0020.0002.D7B1] # HANGUL JUNGSEONG O-O-I D7B2 ; [.3202.0020.0002.D7B2] # HANGUL JUNGSEONG YO-A D7B3 ; [.3203.0020.0002.D7B3] # HANGUL JUNGSEONG YO-AE D7B4 ; [.3204.0020.0002.D7B4] # HANGUL JUNGSEONG YO-EO D7B5 ; [.3205.0020.0002.D7B5] # HANGUL JUNGSEONG U-YEO D7B6 ; [.3206.0020.0002.D7B6] # HANGUL JUNGSEONG U-I-I D7B7 ; [.3207.0020.0002.D7B7] # HANGUL JUNGSEONG YU-AE D7B8 ; [.3208.0020.0002.D7B8] # HANGUL JUNGSEONG YU-O D7B9 ; [.3209.0020.0002.D7B9] # HANGUL JUNGSEONG EU-A D7BA ; [.320A.0020.0002.D7BA] # HANGUL JUNGSEONG EU-EO D7BB ; [.320B.0020.0002.D7BB] # HANGUL JUNGSEONG EU-E D7BC ; [.320C.0020.0002.D7BC] # HANGUL JUNGSEONG EU-O D7BD ; [.320D.0020.0002.D7BD] # HANGUL JUNGSEONG I-YA-O D7BE ; [.320E.0020.0002.D7BE] # HANGUL JUNGSEONG I-YAE D7BF ; [.320F.0020.0002.D7BF] # HANGUL JUNGSEONG I-YEO D7C0 ; [.3210.0020.0002.D7C0] # HANGUL JUNGSEONG I-YE D7C1 ; [.3211.0020.0002.D7C1] # HANGUL JUNGSEONG I-O-I D7C2 ; [.3212.0020.0002.D7C2] # HANGUL JUNGSEONG I-YO D7C3 ; [.3213.0020.0002.D7C3] # HANGUL JUNGSEONG I-YU D7C4 ; [.3214.0020.0002.D7C4] # HANGUL JUNGSEONG I-I D7C5 ; [.3215.0020.0002.D7C5] # HANGUL JUNGSEONG ARAEA-A D7C6 ; [.3216.0020.0002.D7C6] # HANGUL JUNGSEONG ARAEA-E 11A8 ; [.3217.0020.0002.11A8] # HANGUL JONGSEONG KIYEOK 11A9 ; [.3218.0020.0002.11A9] # HANGUL JONGSEONG SSANGKIYEOK 11AA ; [.3219.0020.0002.11AA] # HANGUL JONGSEONG KIYEOK-SIOS 3133 ; [.3219.0020.0004.3133] # HANGUL LETTER KIYEOK-SIOS FFA3 ; [.3219.0020.0012.FFA3] # HALFWIDTH HANGUL LETTER KIYEOK-SIOS 11AB ; [.321A.0020.0002.11AB] # HANGUL JONGSEONG NIEUN 11AC ; [.321B.0020.0002.11AC] # HANGUL JONGSEONG NIEUN-CIEUC 3135 ; [.321B.0020.0004.3135] # HANGUL LETTER NIEUN-CIEUC FFA5 ; [.321B.0020.0012.FFA5] # HALFWIDTH HANGUL LETTER NIEUN-CIEUC 11AD ; [.321C.0020.0002.11AD] # HANGUL JONGSEONG NIEUN-HIEUH 3136 ; [.321C.0020.0004.3136] # HANGUL LETTER NIEUN-HIEUH FFA6 ; [.321C.0020.0012.FFA6] # HALFWIDTH HANGUL LETTER NIEUN-HIEUH 11AE ; [.321D.0020.0002.11AE] # HANGUL JONGSEONG TIKEUT 11AF ; [.321E.0020.0002.11AF] # HANGUL JONGSEONG RIEUL 11B0 ; [.321F.0020.0002.11B0] # HANGUL JONGSEONG RIEUL-KIYEOK 313A ; [.321F.0020.0004.313A] # HANGUL LETTER RIEUL-KIYEOK FFAA ; [.321F.0020.0012.FFAA] # HALFWIDTH HANGUL LETTER RIEUL-KIYEOK 11B1 ; [.3220.0020.0002.11B1] # HANGUL JONGSEONG RIEUL-MIEUM 313B ; [.3220.0020.0004.313B] # HANGUL LETTER RIEUL-MIEUM FFAB ; [.3220.0020.0012.FFAB] # HALFWIDTH HANGUL LETTER RIEUL-MIEUM 11B2 ; [.3221.0020.0002.11B2] # HANGUL JONGSEONG RIEUL-PIEUP 313C ; [.3221.0020.0004.313C] # HANGUL LETTER RIEUL-PIEUP FFAC ; [.3221.0020.0012.FFAC] # HALFWIDTH HANGUL LETTER RIEUL-PIEUP 11B3 ; [.3222.0020.0002.11B3] # HANGUL JONGSEONG RIEUL-SIOS 313D ; [.3222.0020.0004.313D] # HANGUL LETTER RIEUL-SIOS FFAD ; [.3222.0020.0012.FFAD] # HALFWIDTH HANGUL LETTER RIEUL-SIOS 11B4 ; [.3223.0020.0002.11B4] # HANGUL JONGSEONG RIEUL-THIEUTH 313E ; [.3223.0020.0004.313E] # HANGUL LETTER RIEUL-THIEUTH FFAE ; [.3223.0020.0012.FFAE] # HALFWIDTH HANGUL LETTER RIEUL-THIEUTH 11B5 ; [.3224.0020.0002.11B5] # HANGUL JONGSEONG RIEUL-PHIEUPH 313F ; [.3224.0020.0004.313F] # HANGUL LETTER RIEUL-PHIEUPH FFAF ; [.3224.0020.0012.FFAF] # HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH 11B6 ; [.3225.0020.0002.11B6] # HANGUL JONGSEONG RIEUL-HIEUH 11B7 ; [.3226.0020.0002.11B7] # HANGUL JONGSEONG MIEUM 11B8 ; [.3227.0020.0002.11B8] # HANGUL JONGSEONG PIEUP 11B9 ; [.3228.0020.0002.11B9] # HANGUL JONGSEONG PIEUP-SIOS 11BA ; [.3229.0020.0002.11BA] # HANGUL JONGSEONG SIOS 11BB ; [.322A.0020.0002.11BB] # HANGUL JONGSEONG SSANGSIOS 11BC ; [.322B.0020.0002.11BC] # HANGUL JONGSEONG IEUNG 11BD ; [.322C.0020.0002.11BD] # HANGUL JONGSEONG CIEUC 11BE ; [.322D.0020.0002.11BE] # HANGUL JONGSEONG CHIEUCH 11BF ; [.322E.0020.0002.11BF] # HANGUL JONGSEONG KHIEUKH 11C0 ; [.322F.0020.0002.11C0] # HANGUL JONGSEONG THIEUTH 11C1 ; [.3230.0020.0002.11C1] # HANGUL JONGSEONG PHIEUPH 11C2 ; [.3231.0020.0002.11C2] # HANGUL JONGSEONG HIEUH 11C3 ; [.3232.0020.0002.11C3] # HANGUL JONGSEONG KIYEOK-RIEUL 11C4 ; [.3233.0020.0002.11C4] # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK 11C5 ; [.3234.0020.0002.11C5] # HANGUL JONGSEONG NIEUN-KIYEOK 11C6 ; [.3235.0020.0002.11C6] # HANGUL JONGSEONG NIEUN-TIKEUT 11C7 ; [.3236.0020.0002.11C7] # HANGUL JONGSEONG NIEUN-SIOS 3167 ; [.3236.0020.0004.3167] # HANGUL LETTER NIEUN-SIOS 11C8 ; [.3237.0020.0002.11C8] # HANGUL JONGSEONG NIEUN-PANSIOS 3168 ; [.3237.0020.0004.3168] # HANGUL LETTER NIEUN-PANSIOS 11C9 ; [.3238.0020.0002.11C9] # HANGUL JONGSEONG NIEUN-THIEUTH 11CA ; [.3239.0020.0002.11CA] # HANGUL JONGSEONG TIKEUT-KIYEOK 11CB ; [.323A.0020.0002.11CB] # HANGUL JONGSEONG TIKEUT-RIEUL 11CC ; [.323B.0020.0002.11CC] # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS 3169 ; [.323B.0020.0004.3169] # HANGUL LETTER RIEUL-KIYEOK-SIOS 11CD ; [.323C.0020.0002.11CD] # HANGUL JONGSEONG RIEUL-NIEUN 11CE ; [.323D.0020.0002.11CE] # HANGUL JONGSEONG RIEUL-TIKEUT 316A ; [.323D.0020.0004.316A] # HANGUL LETTER RIEUL-TIKEUT 11CF ; [.323E.0020.0002.11CF] # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH 11D0 ; [.323F.0020.0002.11D0] # HANGUL JONGSEONG SSANGRIEUL 11D1 ; [.3240.0020.0002.11D1] # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK 11D2 ; [.3241.0020.0002.11D2] # HANGUL JONGSEONG RIEUL-MIEUM-SIOS 11D3 ; [.3242.0020.0002.11D3] # HANGUL JONGSEONG RIEUL-PIEUP-SIOS 316B ; [.3242.0020.0004.316B] # HANGUL LETTER RIEUL-PIEUP-SIOS 11D4 ; [.3243.0020.0002.11D4] # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH 11D5 ; [.3244.0020.0002.11D5] # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP 11D6 ; [.3245.0020.0002.11D6] # HANGUL JONGSEONG RIEUL-SSANGSIOS 11D7 ; [.3246.0020.0002.11D7] # HANGUL JONGSEONG RIEUL-PANSIOS 316C ; [.3246.0020.0004.316C] # HANGUL LETTER RIEUL-PANSIOS 11D8 ; [.3247.0020.0002.11D8] # HANGUL JONGSEONG RIEUL-KHIEUKH 11D9 ; [.3248.0020.0002.11D9] # HANGUL JONGSEONG RIEUL-YEORINHIEUH 316D ; [.3248.0020.0004.316D] # HANGUL LETTER RIEUL-YEORINHIEUH 11DA ; [.3249.0020.0002.11DA] # HANGUL JONGSEONG MIEUM-KIYEOK 11DB ; [.324A.0020.0002.11DB] # HANGUL JONGSEONG MIEUM-RIEUL 11DC ; [.324B.0020.0002.11DC] # HANGUL JONGSEONG MIEUM-PIEUP 11DD ; [.324C.0020.0002.11DD] # HANGUL JONGSEONG MIEUM-SIOS 316F ; [.324C.0020.0004.316F] # HANGUL LETTER MIEUM-SIOS 11DE ; [.324D.0020.0002.11DE] # HANGUL JONGSEONG MIEUM-SSANGSIOS 11DF ; [.324E.0020.0002.11DF] # HANGUL JONGSEONG MIEUM-PANSIOS 3170 ; [.324E.0020.0004.3170] # HANGUL LETTER MIEUM-PANSIOS 11E0 ; [.324F.0020.0002.11E0] # HANGUL JONGSEONG MIEUM-CHIEUCH 11E1 ; [.3250.0020.0002.11E1] # HANGUL JONGSEONG MIEUM-HIEUH 11E2 ; [.3251.0020.0002.11E2] # HANGUL JONGSEONG KAPYEOUNMIEUM 11E3 ; [.3252.0020.0002.11E3] # HANGUL JONGSEONG PIEUP-RIEUL 11E4 ; [.3253.0020.0002.11E4] # HANGUL JONGSEONG PIEUP-PHIEUPH 11E5 ; [.3254.0020.0002.11E5] # HANGUL JONGSEONG PIEUP-HIEUH 11E6 ; [.3255.0020.0002.11E6] # HANGUL JONGSEONG KAPYEOUNPIEUP 11E7 ; [.3256.0020.0002.11E7] # HANGUL JONGSEONG SIOS-KIYEOK 11E8 ; [.3257.0020.0002.11E8] # HANGUL JONGSEONG SIOS-TIKEUT 11E9 ; [.3258.0020.0002.11E9] # HANGUL JONGSEONG SIOS-RIEUL 11EA ; [.3259.0020.0002.11EA] # HANGUL JONGSEONG SIOS-PIEUP 11EB ; [.325A.0020.0002.11EB] # HANGUL JONGSEONG PANSIOS 11EC ; [.325B.0020.0002.11EC] # HANGUL JONGSEONG IEUNG-KIYEOK 11ED ; [.325C.0020.0002.11ED] # HANGUL JONGSEONG IEUNG-SSANGKIYEOK 11EE ; [.325D.0020.0002.11EE] # HANGUL JONGSEONG SSANGIEUNG 11EF ; [.325E.0020.0002.11EF] # HANGUL JONGSEONG IEUNG-KHIEUKH 11F0 ; [.325F.0020.0002.11F0] # HANGUL JONGSEONG YESIEUNG 11F1 ; [.3260.0020.0002.11F1] # HANGUL JONGSEONG YESIEUNG-SIOS 3182 ; [.3260.0020.0004.3182] # HANGUL LETTER YESIEUNG-SIOS 11F2 ; [.3261.0020.0002.11F2] # HANGUL JONGSEONG YESIEUNG-PANSIOS 3183 ; [.3261.0020.0004.3183] # HANGUL LETTER YESIEUNG-PANSIOS 11F3 ; [.3262.0020.0002.11F3] # HANGUL JONGSEONG PHIEUPH-PIEUP 11F4 ; [.3263.0020.0002.11F4] # HANGUL JONGSEONG KAPYEOUNPHIEUPH 11F5 ; [.3264.0020.0002.11F5] # HANGUL JONGSEONG HIEUH-NIEUN 11F6 ; [.3265.0020.0002.11F6] # HANGUL JONGSEONG HIEUH-RIEUL 11F7 ; [.3266.0020.0002.11F7] # HANGUL JONGSEONG HIEUH-MIEUM 11F8 ; [.3267.0020.0002.11F8] # HANGUL JONGSEONG HIEUH-PIEUP 11F9 ; [.3268.0020.0002.11F9] # HANGUL JONGSEONG YEORINHIEUH 11FA ; [.3269.0020.0002.11FA] # HANGUL JONGSEONG KIYEOK-NIEUN 11FB ; [.326A.0020.0002.11FB] # HANGUL JONGSEONG KIYEOK-PIEUP 11FC ; [.326B.0020.0002.11FC] # HANGUL JONGSEONG KIYEOK-CHIEUCH 11FD ; [.326C.0020.0002.11FD] # HANGUL JONGSEONG KIYEOK-KHIEUKH 11FE ; [.326D.0020.0002.11FE] # HANGUL JONGSEONG KIYEOK-HIEUH 11FF ; [.326E.0020.0002.11FF] # HANGUL JONGSEONG SSANGNIEUN D7CB ; [.326F.0020.0002.D7CB] # HANGUL JONGSEONG NIEUN-RIEUL D7CC ; [.3270.0020.0002.D7CC] # HANGUL JONGSEONG NIEUN-CHIEUCH D7CD ; [.3271.0020.0002.D7CD] # HANGUL JONGSEONG SSANGTIKEUT D7CE ; [.3272.0020.0002.D7CE] # HANGUL JONGSEONG SSANGTIKEUT-PIEUP D7CF ; [.3273.0020.0002.D7CF] # HANGUL JONGSEONG TIKEUT-PIEUP D7D0 ; [.3274.0020.0002.D7D0] # HANGUL JONGSEONG TIKEUT-SIOS D7D1 ; [.3275.0020.0002.D7D1] # HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK D7D2 ; [.3276.0020.0002.D7D2] # HANGUL JONGSEONG TIKEUT-CIEUC D7D3 ; [.3277.0020.0002.D7D3] # HANGUL JONGSEONG TIKEUT-CHIEUCH D7D4 ; [.3278.0020.0002.D7D4] # HANGUL JONGSEONG TIKEUT-THIEUTH D7D5 ; [.3279.0020.0002.D7D5] # HANGUL JONGSEONG RIEUL-SSANGKIYEOK D7D6 ; [.327A.0020.0002.D7D6] # HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH D7D7 ; [.327B.0020.0002.D7D7] # HANGUL JONGSEONG SSANGRIEUL-KHIEUKH D7D8 ; [.327C.0020.0002.D7D8] # HANGUL JONGSEONG RIEUL-MIEUM-HIEUH D7D9 ; [.327D.0020.0002.D7D9] # HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT D7DA ; [.327E.0020.0002.D7DA] # HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH D7DB ; [.327F.0020.0002.D7DB] # HANGUL JONGSEONG RIEUL-YESIEUNG D7DC ; [.3280.0020.0002.D7DC] # HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH D7DD ; [.3281.0020.0002.D7DD] # HANGUL JONGSEONG KAPYEOUNRIEUL D7DE ; [.3282.0020.0002.D7DE] # HANGUL JONGSEONG MIEUM-NIEUN D7DF ; [.3283.0020.0002.D7DF] # HANGUL JONGSEONG MIEUM-SSANGNIEUN D7E0 ; [.3284.0020.0002.D7E0] # HANGUL JONGSEONG SSANGMIEUM D7E1 ; [.3285.0020.0002.D7E1] # HANGUL JONGSEONG MIEUM-PIEUP-SIOS D7E2 ; [.3286.0020.0002.D7E2] # HANGUL JONGSEONG MIEUM-CIEUC D7E3 ; [.3287.0020.0002.D7E3] # HANGUL JONGSEONG PIEUP-TIKEUT D7E4 ; [.3288.0020.0002.D7E4] # HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH D7E5 ; [.3289.0020.0002.D7E5] # HANGUL JONGSEONG PIEUP-MIEUM D7E6 ; [.328A.0020.0002.D7E6] # HANGUL JONGSEONG SSANGPIEUP D7E7 ; [.328B.0020.0002.D7E7] # HANGUL JONGSEONG PIEUP-SIOS-TIKEUT D7E8 ; [.328C.0020.0002.D7E8] # HANGUL JONGSEONG PIEUP-CIEUC D7E9 ; [.328D.0020.0002.D7E9] # HANGUL JONGSEONG PIEUP-CHIEUCH D7EA ; [.328E.0020.0002.D7EA] # HANGUL JONGSEONG SIOS-MIEUM D7EB ; [.328F.0020.0002.D7EB] # HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP D7EC ; [.3290.0020.0002.D7EC] # HANGUL JONGSEONG SSANGSIOS-KIYEOK D7ED ; [.3291.0020.0002.D7ED] # HANGUL JONGSEONG SSANGSIOS-TIKEUT D7EE ; [.3292.0020.0002.D7EE] # HANGUL JONGSEONG SIOS-PANSIOS D7EF ; [.3293.0020.0002.D7EF] # HANGUL JONGSEONG SIOS-CIEUC D7F0 ; [.3294.0020.0002.D7F0] # HANGUL JONGSEONG SIOS-CHIEUCH D7F1 ; [.3295.0020.0002.D7F1] # HANGUL JONGSEONG SIOS-THIEUTH D7F2 ; [.3296.0020.0002.D7F2] # HANGUL JONGSEONG SIOS-HIEUH D7F3 ; [.3297.0020.0002.D7F3] # HANGUL JONGSEONG PANSIOS-PIEUP D7F4 ; [.3298.0020.0002.D7F4] # HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP D7F5 ; [.3299.0020.0002.D7F5] # HANGUL JONGSEONG YESIEUNG-MIEUM D7F6 ; [.329A.0020.0002.D7F6] # HANGUL JONGSEONG YESIEUNG-HIEUH D7F7 ; [.329B.0020.0002.D7F7] # HANGUL JONGSEONG CIEUC-PIEUP D7F8 ; [.329C.0020.0002.D7F8] # HANGUL JONGSEONG CIEUC-SSANGPIEUP D7F9 ; [.329D.0020.0002.D7F9] # HANGUL JONGSEONG SSANGCIEUC D7FA ; [.329E.0020.0002.D7FA] # HANGUL JONGSEONG PHIEUPH-SIOS D7FB ; [.329F.0020.0002.D7FB] # HANGUL JONGSEONG PHIEUPH-THIEUTH 3041 ; [.32A0.0020.000D.3041] # HIRAGANA LETTER SMALL A 3042 ; [.32A0.0020.000E.3042] # HIRAGANA LETTER A 30A1 ; [.32A0.0020.000F.30A1] # KATAKANA LETTER SMALL A FF67 ; [.32A0.0020.0010.FF67] # HALFWIDTH KATAKANA LETTER SMALL A 30A2 ; [.32A0.0020.0011.30A2] # KATAKANA LETTER A FF71 ; [.32A0.0020.0012.FF71] # HALFWIDTH KATAKANA LETTER A 32D0 ; [.32A0.0020.0013.32D0] # CIRCLED KATAKANA A 3303 ; [.32A0.0020.001C.3303][.15A0.0020.001C.3303][.32CA.0020.001F.3303] # SQUARE AARU 3300 ; [.32A0.0020.001C.3300][.32BA.0020.001C.3300][.0000.0129.001F.3300][.15A0.0020.001F.3300][.32B4.0020.001F.3300] # SQUARE APAATO 3301 ; [.32A0.0020.001C.3301][.32CA.0020.001C.3301][.32BC.0020.001F.3301][.32A0.0020.001F.3301] # SQUARE ARUHUA 3302 ; [.32A0.0020.001C.3302][.32D1.0020.001C.3302][.32BD.0020.001F.3302][.0000.0129.001F.3302][.32A0.0020.001F.3302] # SQUARE ANPEA 3043 ; [.32A1.0020.000D.3043] # HIRAGANA LETTER SMALL I 3044 ; [.32A1.0020.000E.3044] # HIRAGANA LETTER I 30A3 ; [.32A1.0020.000F.30A3] # KATAKANA LETTER SMALL I FF68 ; [.32A1.0020.0010.FF68] # HALFWIDTH KATAKANA LETTER SMALL I 30A4 ; [.32A1.0020.0011.30A4] # KATAKANA LETTER I FF72 ; [.32A1.0020.0012.FF72] # HALFWIDTH KATAKANA LETTER I 32D1 ; [.32A1.0020.0013.32D1] # CIRCLED KATAKANA I 3304 ; [.32A1.0020.001C.3304][.32B6.0020.001C.3304][.32D1.0020.001F.3304][.32A8.0020.001F.3304][.0000.0128.001F.3304] # SQUARE ININGU 3305 ; [.32A1.0020.001C.3305][.32D1.0020.001C.3305][.32B1.0020.001F.3305] # SQUARE INTI 3045 ; [.32A2.0020.000D.3045] # HIRAGANA LETTER SMALL U 3046 ; [.32A2.0020.000E.3046] # HIRAGANA LETTER U 30A5 ; [.32A2.0020.000F.30A5] # KATAKANA LETTER SMALL U FF69 ; [.32A2.0020.0010.FF69] # HALFWIDTH KATAKANA LETTER SMALL U 30A6 ; [.32A2.0020.0011.30A6] # KATAKANA LETTER U FF73 ; [.32A2.0020.0012.FF73] # HALFWIDTH KATAKANA LETTER U 32D2 ; [.32A2.0020.0013.32D2] # CIRCLED KATAKANA U 3094 ; [.32A2.0020.000E.3046][.0000.0128.0002.3099] # HIRAGANA LETTER VU 30F4 ; [.32A2.0020.0011.30A6][.0000.0128.0002.3099] # KATAKANA LETTER VU 3306 ; [.32A2.0020.001C.3306][.32A5.0020.001C.3306][.32D1.0020.001F.3306] # SQUARE UON 1B000 ; [.32A3.0020.0002.1B000] # KATAKANA LETTER ARCHAIC E 3047 ; [.32A4.0020.000D.3047] # HIRAGANA LETTER SMALL E 3048 ; [.32A4.0020.000E.3048] # HIRAGANA LETTER E 30A7 ; [.32A4.0020.000F.30A7] # KATAKANA LETTER SMALL E FF6A ; [.32A4.0020.0010.FF6A] # HALFWIDTH KATAKANA LETTER SMALL E 30A8 ; [.32A4.0020.0011.30A8] # KATAKANA LETTER E FF74 ; [.32A4.0020.0012.FF74] # HALFWIDTH KATAKANA LETTER E 32D3 ; [.32A4.0020.0013.32D3] # CIRCLED KATAKANA E 3308 ; [.32A4.0020.001C.3308][.15A0.0020.001C.3308][.32A6.0020.001F.3308][.15A0.0020.001F.3308] # SQUARE EEKAA 3307 ; [.32A4.0020.001C.3307][.32AD.0020.001C.3307][.32A8.0020.001F.3307][.15A0.0020.001F.3307][.32B4.0020.001F.3307][.0000.0128.001F.3307] # SQUARE ESUKUUDO 3049 ; [.32A5.0020.000D.3049] # HIRAGANA LETTER SMALL O 304A ; [.32A5.0020.000E.304A] # HIRAGANA LETTER O 30A9 ; [.32A5.0020.000F.30A9] # KATAKANA LETTER SMALL O FF6B ; [.32A5.0020.0010.FF6B] # HALFWIDTH KATAKANA LETTER SMALL O 30AA ; [.32A5.0020.0011.30AA] # KATAKANA LETTER O FF75 ; [.32A5.0020.0012.FF75] # HALFWIDTH KATAKANA LETTER O 32D4 ; [.32A5.0020.0013.32D4] # CIRCLED KATAKANA O 330A ; [.32A5.0020.001C.330A][.15A0.0020.001C.330A][.32C1.0020.001F.330A] # SQUARE OOMU 3309 ; [.32A5.0020.001C.3309][.32D1.0020.001C.3309][.32AD.0020.001F.3309] # SQUARE ONSU 3095 ; [.32A6.0020.000D.3095] # HIRAGANA LETTER SMALL KA 304B ; [.32A6.0020.000E.304B] # HIRAGANA LETTER KA 30F5 ; [.32A6.0020.000F.30F5] # KATAKANA LETTER SMALL KA 30AB ; [.32A6.0020.0011.30AB] # KATAKANA LETTER KA FF76 ; [.32A6.0020.0012.FF76] # HALFWIDTH KATAKANA LETTER KA 32D5 ; [.32A6.0020.0013.32D5] # CIRCLED KATAKANA KA 304C ; [.32A6.0020.000E.304B][.0000.0128.0002.3099] # HIRAGANA LETTER GA 30AC ; [.32A6.0020.0011.30AB][.0000.0128.0002.3099] # KATAKANA LETTER GA 330B ; [.32A6.0020.001C.330B][.32A1.0020.001C.330B][.32C9.0020.001F.330B] # SQUARE KAIRI 330C ; [.32A6.0020.001C.330C][.32C8.0020.001C.330C][.32B2.0020.001F.330C][.32B4.0020.001F.330C] # SQUARE KARATTO 330D ; [.32A6.0020.001C.330D][.32CC.0020.001C.330D][.32C9.0020.001F.330D][.15A0.0020.001F.330D] # SQUARE KARORII 330E ; [.32A6.0020.001C.330E][.0000.0128.001C.330E][.32CC.0020.001F.330E][.32D1.0020.001F.330E] # SQUARE GARON 330F ; [.32A6.0020.001C.330F][.0000.0128.001C.330F][.32D1.0020.001F.330F][.32BF.0020.001F.330F] # SQUARE GANMA 304D ; [.32A7.0020.000E.304D] # HIRAGANA LETTER KI 30AD ; [.32A7.0020.0011.30AD] # KATAKANA LETTER KI FF77 ; [.32A7.0020.0012.FF77] # HALFWIDTH KATAKANA LETTER KI 32D6 ; [.32A7.0020.0013.32D6] # CIRCLED KATAKANA KI 304E ; [.32A7.0020.000E.304D][.0000.0128.0002.3099] # HIRAGANA LETTER GI 30AE ; [.32A7.0020.0011.30AD][.0000.0128.0002.3099] # KATAKANA LETTER GI 3310 ; [.32A7.0020.001C.3310][.0000.0128.001C.3310][.32A6.0020.001F.3310][.0000.0128.001F.3310] # SQUARE GIGA 3311 ; [.32A7.0020.001C.3311][.0000.0128.001C.3311][.32B6.0020.001F.3311][.15A0.0020.001F.3311] # SQUARE GINII 3312 ; [.32A7.0020.001C.3312][.32C5.0020.001C.3312][.32C9.0020.001F.3312][.15A0.0020.001F.3312] # SQUARE KYURII 3313 ; [.32A7.0020.001C.3313][.0000.0128.001C.3313][.32CA.0020.001F.3313][.32B0.0020.001F.3313][.0000.0128.001F.3313][.15A0.0020.001F.3313] # SQUARE GIRUDAA 3314 ; [.32A7.0020.001C.3314][.32CC.0020.001C.3314] # SQUARE KIRO 3315 ; [.32A7.0020.001C.3315][.32CC.0020.001C.3315][.32A8.0020.001F.3315][.0000.0128.001F.3315][.32C8.0020.001F.3315][.32C1.0020.001F.3315] # SQUARE KIROGURAMU 3316 ; [.32A7.0020.001C.3316][.32CC.0020.001C.3316][.32C2.0020.001F.3316][.15A0.0020.001F.3316][.32B4.0020.001F.3316][.32CA.0020.001F.3316] # SQUARE KIROMEETORU 3317 ; [.32A7.0020.001C.3317][.32CC.0020.001C.3317][.32CD.0020.001F.3317][.32B2.0020.001F.3317][.32B4.0020.001F.3317] # SQUARE KIROWATTO 304F ; [.32A8.0020.000E.304F] # HIRAGANA LETTER KU 31F0 ; [.32A8.0020.000F.31F0] # KATAKANA LETTER SMALL KU 30AF ; [.32A8.0020.0011.30AF] # KATAKANA LETTER KU FF78 ; [.32A8.0020.0012.FF78] # HALFWIDTH KATAKANA LETTER KU 32D7 ; [.32A8.0020.0013.32D7] # CIRCLED KATAKANA KU 3050 ; [.32A8.0020.000E.304F][.0000.0128.0002.3099] # HIRAGANA LETTER GU 30B0 ; [.32A8.0020.0011.30AF][.0000.0128.0002.3099] # KATAKANA LETTER GU 3318 ; [.32A8.0020.001C.3318][.0000.0128.001C.3318][.32C8.0020.001F.3318][.32C1.0020.001F.3318] # SQUARE GURAMU 3319 ; [.32A8.0020.001C.3319][.0000.0128.001C.3319][.32C8.0020.001F.3319][.32C1.0020.001F.3319][.32B4.0020.001F.3319][.32D1.0020.001F.3319] # SQUARE GURAMUTON 331A ; [.32A8.0020.001C.331A][.32CA.0020.001C.331A][.32AE.0020.001F.331A][.0000.0128.001F.331A][.32A1.0020.001F.331A][.32CC.0020.001F.331A] # SQUARE KURUZEIRO 331B ; [.32A8.0020.001C.331B][.32CC.0020.001C.331B][.15A0.0020.001F.331B][.32B8.0020.001F.331B] # SQUARE KUROONE 3096 ; [.32A9.0020.000D.3096] # HIRAGANA LETTER SMALL KE 3051 ; [.32A9.0020.000E.3051] # HIRAGANA LETTER KE 30F6 ; [.32A9.0020.000F.30F6] # KATAKANA LETTER SMALL KE 30B1 ; [.32A9.0020.0011.30B1] # KATAKANA LETTER KE FF79 ; [.32A9.0020.0012.FF79] # HALFWIDTH KATAKANA LETTER KE 32D8 ; [.32A9.0020.0013.32D8] # CIRCLED KATAKANA KE 3052 ; [.32A9.0020.000E.3051][.0000.0128.0002.3099] # HIRAGANA LETTER GE 30B2 ; [.32A9.0020.0011.30B1][.0000.0128.0002.3099] # KATAKANA LETTER GE 331C ; [.32A9.0020.001C.331C][.15A0.0020.001C.331C][.32AD.0020.001F.331C] # SQUARE KEESU 3053 ; [.32AA.0020.000E.3053] # HIRAGANA LETTER KO 30B3 ; [.32AA.0020.0011.30B3] # KATAKANA LETTER KO FF7A ; [.32AA.0020.0012.FF7A] # HALFWIDTH KATAKANA LETTER KO 32D9 ; [.32AA.0020.0013.32D9] # CIRCLED KATAKANA KO 3054 ; [.32AA.0020.000E.3053][.0000.0128.0002.3099] # HIRAGANA LETTER GO 30B4 ; [.32AA.0020.0011.30B3][.0000.0128.0002.3099] # KATAKANA LETTER GO 331E ; [.32AA.0020.001C.331E][.15A0.0020.001C.331E][.32BE.0020.001F.331E][.0000.0129.001F.331E] # SQUARE KOOPO 1F201 ; [.32AA.0020.001C.1F201][.32AA.0020.001C.1F201] # SQUARED KATAKANA KOKO 30FF ; [.32AA.0020.0016.30FF][.32B4.0020.0016.30FF] # KATAKANA DIGRAPH KOTO 331D ; [.32AA.0020.001C.331D][.32CA.0020.001C.331D][.32B5.0020.001F.331D] # SQUARE KORUNA 3055 ; [.32AB.0020.000E.3055] # HIRAGANA LETTER SA 30B5 ; [.32AB.0020.0011.30B5] # KATAKANA LETTER SA FF7B ; [.32AB.0020.0012.FF7B] # HALFWIDTH KATAKANA LETTER SA 32DA ; [.32AB.0020.0013.32DA] # CIRCLED KATAKANA SA 1F202 ; [.32AB.0020.001C.1F202] # SQUARED KATAKANA SA 3056 ; [.32AB.0020.000E.3055][.0000.0128.0002.3099] # HIRAGANA LETTER ZA 30B6 ; [.32AB.0020.0011.30B5][.0000.0128.0002.3099] # KATAKANA LETTER ZA 331F ; [.32AB.0020.001C.331F][.32A1.0020.001C.331F][.32A8.0020.001F.331F][.32CA.0020.001F.331F] # SQUARE SAIKURU 3320 ; [.32AB.0020.001C.3320][.32D1.0020.001C.3320][.32B1.0020.001F.3320][.15A0.0020.001F.3320][.32C1.0020.001F.3320] # SQUARE SANTIIMU 3057 ; [.32AC.0020.000E.3057] # HIRAGANA LETTER SI 31F1 ; [.32AC.0020.000F.31F1] # KATAKANA LETTER SMALL SI 30B7 ; [.32AC.0020.0011.30B7] # KATAKANA LETTER SI FF7C ; [.32AC.0020.0012.FF7C] # HALFWIDTH KATAKANA LETTER SI 32DB ; [.32AC.0020.0013.32DB] # CIRCLED KATAKANA SI 3058 ; [.32AC.0020.000E.3057][.0000.0128.0002.3099] # HIRAGANA LETTER ZI 30B8 ; [.32AC.0020.0011.30B7][.0000.0128.0002.3099] # KATAKANA LETTER ZI 3006 ; [.32AC.0020.0004.3006][.32C2.0020.0004.3006] # IDEOGRAPHIC CLOSING MARK 3321 ; [.32AC.0020.001C.3321][.32C9.0020.001C.3321][.32D1.0020.001F.3321][.32A8.0020.001F.3321][.0000.0128.001F.3321] # SQUARE SIRINGU 3059 ; [.32AD.0020.000E.3059] # HIRAGANA LETTER SU 31F2 ; [.32AD.0020.000F.31F2] # KATAKANA LETTER SMALL SU 30B9 ; [.32AD.0020.0011.30B9] # KATAKANA LETTER SU FF7D ; [.32AD.0020.0012.FF7D] # HALFWIDTH KATAKANA LETTER SU 32DC ; [.32AD.0020.0013.32DC] # CIRCLED KATAKANA SU 305A ; [.32AD.0020.000E.3059][.0000.0128.0002.3099] # HIRAGANA LETTER ZU 30BA ; [.32AD.0020.0011.30B9][.0000.0128.0002.3099] # KATAKANA LETTER ZU 305B ; [.32AE.0020.000E.305B] # HIRAGANA LETTER SE 30BB ; [.32AE.0020.0011.30BB] # KATAKANA LETTER SE FF7E ; [.32AE.0020.0012.FF7E] # HALFWIDTH KATAKANA LETTER SE 32DD ; [.32AE.0020.0013.32DD] # CIRCLED KATAKANA SE 305C ; [.32AE.0020.000E.305B][.0000.0128.0002.3099] # HIRAGANA LETTER ZE 30BC ; [.32AE.0020.0011.30BB][.0000.0128.0002.3099] # KATAKANA LETTER ZE 3322 ; [.32AE.0020.001C.3322][.32D1.0020.001C.3322][.32B1.0020.001F.3322] # SQUARE SENTI 3323 ; [.32AE.0020.001C.3323][.32D1.0020.001C.3323][.32B4.0020.001F.3323] # SQUARE SENTO 305D ; [.32AF.0020.000E.305D] # HIRAGANA LETTER SO 30BD ; [.32AF.0020.0011.30BD] # KATAKANA LETTER SO FF7F ; [.32AF.0020.0012.FF7F] # HALFWIDTH KATAKANA LETTER SO 32DE ; [.32AF.0020.0013.32DE] # CIRCLED KATAKANA SO 305E ; [.32AF.0020.000E.305D][.0000.0128.0002.3099] # HIRAGANA LETTER ZO 30BE ; [.32AF.0020.0011.30BD][.0000.0128.0002.3099] # KATAKANA LETTER ZO 305F ; [.32B0.0020.000E.305F] # HIRAGANA LETTER TA 30BF ; [.32B0.0020.0011.30BF] # KATAKANA LETTER TA FF80 ; [.32B0.0020.0012.FF80] # HALFWIDTH KATAKANA LETTER TA 32DF ; [.32B0.0020.0013.32DF] # CIRCLED KATAKANA TA 3060 ; [.32B0.0020.000E.305F][.0000.0128.0002.3099] # HIRAGANA LETTER DA 30C0 ; [.32B0.0020.0011.30BF][.0000.0128.0002.3099] # KATAKANA LETTER DA 3324 ; [.32B0.0020.001C.3324][.0000.0128.001C.3324][.15A0.0020.001F.3324][.32AD.0020.001F.3324] # SQUARE DAASU 3061 ; [.32B1.0020.000E.3061] # HIRAGANA LETTER TI 30C1 ; [.32B1.0020.0011.30C1] # KATAKANA LETTER TI FF81 ; [.32B1.0020.0012.FF81] # HALFWIDTH KATAKANA LETTER TI 32E0 ; [.32B1.0020.0013.32E0] # CIRCLED KATAKANA TI 3062 ; [.32B1.0020.000E.3061][.0000.0128.0002.3099] # HIRAGANA LETTER DI 30C2 ; [.32B1.0020.0011.30C1][.0000.0128.0002.3099] # KATAKANA LETTER DI 3063 ; [.32B2.0020.000D.3063] # HIRAGANA LETTER SMALL TU 3064 ; [.32B2.0020.000E.3064] # HIRAGANA LETTER TU 30C3 ; [.32B2.0020.000F.30C3] # KATAKANA LETTER SMALL TU FF6F ; [.32B2.0020.0010.FF6F] # HALFWIDTH KATAKANA LETTER SMALL TU 30C4 ; [.32B2.0020.0011.30C4] # KATAKANA LETTER TU FF82 ; [.32B2.0020.0012.FF82] # HALFWIDTH KATAKANA LETTER TU 32E1 ; [.32B2.0020.0013.32E1] # CIRCLED KATAKANA TU 3065 ; [.32B2.0020.000E.3064][.0000.0128.0002.3099] # HIRAGANA LETTER DU 30C5 ; [.32B2.0020.0011.30C4][.0000.0128.0002.3099] # KATAKANA LETTER DU 3066 ; [.32B3.0020.000E.3066] # HIRAGANA LETTER TE 30C6 ; [.32B3.0020.0011.30C6] # KATAKANA LETTER TE FF83 ; [.32B3.0020.0012.FF83] # HALFWIDTH KATAKANA LETTER TE 32E2 ; [.32B3.0020.0013.32E2] # CIRCLED KATAKANA TE 3067 ; [.32B3.0020.000E.3066][.0000.0128.0002.3099] # HIRAGANA LETTER DE 30C7 ; [.32B3.0020.0011.30C6][.0000.0128.0002.3099] # KATAKANA LETTER DE 1F213 ; [.32B3.0020.001C.1F213][.0000.0128.001C.1F213] # SQUARED KATAKANA DE 3325 ; [.32B3.0020.001C.3325][.0000.0128.001C.3325][.32AC.0020.001F.3325] # SQUARE DESI 3068 ; [.32B4.0020.000E.3068] # HIRAGANA LETTER TO 31F3 ; [.32B4.0020.000F.31F3] # KATAKANA LETTER SMALL TO 30C8 ; [.32B4.0020.0011.30C8] # KATAKANA LETTER TO FF84 ; [.32B4.0020.0012.FF84] # HALFWIDTH KATAKANA LETTER TO 32E3 ; [.32B4.0020.0013.32E3] # CIRCLED KATAKANA TO 3069 ; [.32B4.0020.000E.3068][.0000.0128.0002.3099] # HIRAGANA LETTER DO 30C9 ; [.32B4.0020.0011.30C8][.0000.0128.0002.3099] # KATAKANA LETTER DO 3326 ; [.32B4.0020.001C.3326][.0000.0128.001C.3326][.32CA.0020.001F.3326] # SQUARE DORU 3327 ; [.32B4.0020.001C.3327][.32D1.0020.001C.3327] # SQUARE TON 306A ; [.32B5.0020.000E.306A] # HIRAGANA LETTER NA 30CA ; [.32B5.0020.0011.30CA] # KATAKANA LETTER NA FF85 ; [.32B5.0020.0012.FF85] # HALFWIDTH KATAKANA LETTER NA 32E4 ; [.32B5.0020.0013.32E4] # CIRCLED KATAKANA NA 3328 ; [.32B5.0020.001C.3328][.32B9.0020.001C.3328] # SQUARE NANO 306B ; [.32B6.0020.000E.306B] # HIRAGANA LETTER NI 30CB ; [.32B6.0020.0011.30CB] # KATAKANA LETTER NI FF86 ; [.32B6.0020.0012.FF86] # HALFWIDTH KATAKANA LETTER NI 32E5 ; [.32B6.0020.0013.32E5] # CIRCLED KATAKANA NI 306C ; [.32B7.0020.000E.306C] # HIRAGANA LETTER NU 31F4 ; [.32B7.0020.000F.31F4] # KATAKANA LETTER SMALL NU 30CC ; [.32B7.0020.0011.30CC] # KATAKANA LETTER NU FF87 ; [.32B7.0020.0012.FF87] # HALFWIDTH KATAKANA LETTER NU 32E6 ; [.32B7.0020.0013.32E6] # CIRCLED KATAKANA NU 306D ; [.32B8.0020.000E.306D] # HIRAGANA LETTER NE 30CD ; [.32B8.0020.0011.30CD] # KATAKANA LETTER NE FF88 ; [.32B8.0020.0012.FF88] # HALFWIDTH KATAKANA LETTER NE 32E7 ; [.32B8.0020.0013.32E7] # CIRCLED KATAKANA NE 306E ; [.32B9.0020.000E.306E] # HIRAGANA LETTER NO 30CE ; [.32B9.0020.0011.30CE] # KATAKANA LETTER NO FF89 ; [.32B9.0020.0012.FF89] # HALFWIDTH KATAKANA LETTER NO 32E8 ; [.32B9.0020.0013.32E8] # CIRCLED KATAKANA NO 3329 ; [.32B9.0020.001C.3329][.32B2.0020.001C.3329][.32B4.0020.001F.3329] # SQUARE NOTTO 306F ; [.32BA.0020.000E.306F] # HIRAGANA LETTER HA 31F5 ; [.32BA.0020.000F.31F5] # KATAKANA LETTER SMALL HA 30CF ; [.32BA.0020.0011.30CF] # KATAKANA LETTER HA FF8A ; [.32BA.0020.0012.FF8A] # HALFWIDTH KATAKANA LETTER HA 32E9 ; [.32BA.0020.0013.32E9] # CIRCLED KATAKANA HA 3070 ; [.32BA.0020.000E.306F][.0000.0128.0002.3099] # HIRAGANA LETTER BA 30D0 ; [.32BA.0020.0011.30CF][.0000.0128.0002.3099] # KATAKANA LETTER BA 3071 ; [.32BA.0020.000E.306F][.0000.0129.0002.309A] # HIRAGANA LETTER PA 30D1 ; [.32BA.0020.0011.30CF][.0000.0129.0002.309A] # KATAKANA LETTER PA 332B ; [.32BA.0020.001C.332B][.0000.0129.001C.332B][.15A0.0020.001F.332B][.32AE.0020.001F.332B][.32D1.0020.001F.332B][.32B4.0020.001F.332B] # SQUARE PAASENTO 332C ; [.32BA.0020.001C.332C][.0000.0129.001C.332C][.15A0.0020.001F.332C][.32B2.0020.001F.332C] # SQUARE PAATU 332D ; [.32BA.0020.001C.332D][.0000.0128.001C.332D][.15A0.0020.001F.332D][.32CB.0020.001F.332D][.32CA.0020.001F.332D] # SQUARE BAARERU 332A ; [.32BA.0020.001C.332A][.32A1.0020.001C.332A][.32B2.0020.001F.332A] # SQUARE HAITU 3072 ; [.32BB.0020.000E.3072] # HIRAGANA LETTER HI 31F6 ; [.32BB.0020.000F.31F6] # KATAKANA LETTER SMALL HI 30D2 ; [.32BB.0020.0011.30D2] # KATAKANA LETTER HI FF8B ; [.32BB.0020.0012.FF8B] # HALFWIDTH KATAKANA LETTER HI 32EA ; [.32BB.0020.0013.32EA] # CIRCLED KATAKANA HI 3073 ; [.32BB.0020.000E.3072][.0000.0128.0002.3099] # HIRAGANA LETTER BI 30D3 ; [.32BB.0020.0011.30D2][.0000.0128.0002.3099] # KATAKANA LETTER BI 3074 ; [.32BB.0020.000E.3072][.0000.0129.0002.309A] # HIRAGANA LETTER PI 30D4 ; [.32BB.0020.0011.30D2][.0000.0129.0002.309A] # KATAKANA LETTER PI 332E ; [.32BB.0020.001C.332E][.0000.0129.001C.332E][.32A0.0020.001F.332E][.32AD.0020.001F.332E][.32B4.0020.001F.332E][.32CA.0020.001F.332E] # SQUARE PIASUTORU 332F ; [.32BB.0020.001C.332F][.0000.0129.001C.332F][.32A8.0020.001F.332F][.32CA.0020.001F.332F] # SQUARE PIKURU 3330 ; [.32BB.0020.001C.3330][.0000.0129.001C.3330][.32AA.0020.001F.3330] # SQUARE PIKO 3331 ; [.32BB.0020.001C.3331][.0000.0128.001C.3331][.32CA.0020.001F.3331] # SQUARE BIRU 3075 ; [.32BC.0020.000E.3075] # HIRAGANA LETTER HU 31F7 ; [.32BC.0020.000F.31F7] # KATAKANA LETTER SMALL HU 30D5 ; [.32BC.0020.0011.30D5] # KATAKANA LETTER HU FF8C ; [.32BC.0020.0012.FF8C] # HALFWIDTH KATAKANA LETTER HU 32EB ; [.32BC.0020.0013.32EB] # CIRCLED KATAKANA HU 3076 ; [.32BC.0020.000E.3075][.0000.0128.0002.3099] # HIRAGANA LETTER BU 30D6 ; [.32BC.0020.0011.30D5][.0000.0128.0002.3099] # KATAKANA LETTER BU 3077 ; [.32BC.0020.000E.3075][.0000.0129.0002.309A] # HIRAGANA LETTER PU 30D7 ; [.32BC.0020.0011.30D5][.0000.0129.0002.309A] # KATAKANA LETTER PU 3332 ; [.32BC.0020.001C.3332][.32A0.0020.001C.3332][.32C8.0020.001F.3332][.32B2.0020.001F.3332][.32B4.0020.001F.3332][.0000.0128.001F.3332] # SQUARE HUARADDO 3333 ; [.32BC.0020.001C.3333][.32A1.0020.001C.3333][.15A0.0020.001F.3333][.32B4.0020.001F.3333] # SQUARE HUIITO 3334 ; [.32BC.0020.001C.3334][.0000.0128.001C.3334][.32B2.0020.001F.3334][.32AC.0020.001F.3334][.32A4.0020.001F.3334][.32CA.0020.001F.3334] # SQUARE BUSSYERU 3335 ; [.32BC.0020.001C.3335][.32C8.0020.001C.3335][.32D1.0020.001F.3335] # SQUARE HURAN 3078 ; [.32BD.0020.000E.3078] # HIRAGANA LETTER HE 31F8 ; [.32BD.0020.000F.31F8] # KATAKANA LETTER SMALL HE 30D8 ; [.32BD.0020.0011.30D8] # KATAKANA LETTER HE FF8D ; [.32BD.0020.0012.FF8D] # HALFWIDTH KATAKANA LETTER HE 32EC ; [.32BD.0020.0013.32EC] # CIRCLED KATAKANA HE 3079 ; [.32BD.0020.000E.3078][.0000.0128.0002.3099] # HIRAGANA LETTER BE 30D9 ; [.32BD.0020.0011.30D8][.0000.0128.0002.3099] # KATAKANA LETTER BE 307A ; [.32BD.0020.000E.3078][.0000.0129.0002.309A] # HIRAGANA LETTER PE 30DA ; [.32BD.0020.0011.30D8][.0000.0129.0002.309A] # KATAKANA LETTER PE 333B ; [.32BD.0020.001C.333B][.0000.0129.001C.333B][.15A0.0020.001F.333B][.32AC.0020.001F.333B][.0000.0128.001F.333B] # SQUARE PEEZI 333C ; [.32BD.0020.001C.333C][.0000.0128.001C.333C][.15A0.0020.001F.333C][.32B0.0020.001F.333C] # SQUARE BEETA 3336 ; [.32BD.0020.001C.3336][.32A8.0020.001C.3336][.32B0.0020.001F.3336][.15A0.0020.001F.3336][.32CA.0020.001F.3336] # SQUARE HEKUTAARU 3337 ; [.32BD.0020.001C.3337][.0000.0129.001C.3337][.32AF.0020.001F.3337] # SQUARE PESO 3338 ; [.32BD.0020.001C.3338][.0000.0129.001C.3338][.32B6.0020.001F.3338][.32BB.0020.001F.3338] # SQUARE PENIHI 3339 ; [.32BD.0020.001C.3339][.32CA.0020.001C.3339][.32B2.0020.001F.3339] # SQUARE HERUTU 333A ; [.32BD.0020.001C.333A][.0000.0129.001C.333A][.32D1.0020.001F.333A][.32AD.0020.001F.333A] # SQUARE PENSU 307B ; [.32BE.0020.000E.307B] # HIRAGANA LETTER HO 31F9 ; [.32BE.0020.000F.31F9] # KATAKANA LETTER SMALL HO 30DB ; [.32BE.0020.0011.30DB] # KATAKANA LETTER HO FF8E ; [.32BE.0020.0012.FF8E] # HALFWIDTH KATAKANA LETTER HO 32ED ; [.32BE.0020.0013.32ED] # CIRCLED KATAKANA HO 307C ; [.32BE.0020.000E.307B][.0000.0128.0002.3099] # HIRAGANA LETTER BO 30DC ; [.32BE.0020.0011.30DB][.0000.0128.0002.3099] # KATAKANA LETTER BO 307D ; [.32BE.0020.000E.307B][.0000.0129.0002.309A] # HIRAGANA LETTER PO 30DD ; [.32BE.0020.0011.30DB][.0000.0129.0002.309A] # KATAKANA LETTER PO 3341 ; [.32BE.0020.001C.3341][.15A0.0020.001C.3341][.32CA.0020.001F.3341] # SQUARE HOORU 3342 ; [.32BE.0020.001C.3342][.15A0.0020.001C.3342][.32D1.0020.001F.3342] # SQUARE HOON 333D ; [.32BE.0020.001C.333D][.0000.0129.001C.333D][.32A1.0020.001F.333D][.32D1.0020.001F.333D][.32B4.0020.001F.333D] # SQUARE POINTO 1F200 ; [.32BE.0020.001C.1F200][.32A6.0020.001C.1F200] # SQUARE HIRAGANA HOKA 333E ; [.32BE.0020.001C.333E][.0000.0128.001C.333E][.32CA.0020.001F.333E][.32B4.0020.001F.333E] # SQUARE BORUTO 333F ; [.32BE.0020.001C.333F][.32D1.0020.001C.333F] # SQUARE HON 3340 ; [.32BE.0020.001C.3340][.0000.0129.001C.3340][.32D1.0020.001F.3340][.32B4.0020.001F.3340][.0000.0128.001F.3340] # SQUARE PONDO 307E ; [.32BF.0020.000E.307E] # HIRAGANA LETTER MA 30DE ; [.32BF.0020.0011.30DE] # KATAKANA LETTER MA FF8F ; [.32BF.0020.0012.FF8F] # HALFWIDTH KATAKANA LETTER MA 32EE ; [.32BF.0020.0013.32EE] # CIRCLED KATAKANA MA 3343 ; [.32BF.0020.001C.3343][.32A1.0020.001C.3343][.32A8.0020.001F.3343][.32CC.0020.001F.3343] # SQUARE MAIKURO 3344 ; [.32BF.0020.001C.3344][.32A1.0020.001C.3344][.32CA.0020.001F.3344] # SQUARE MAIRU 303C ; [.32BF.0020.0004.303C][.32AD.0020.0004.303C] # MASU MARK 3345 ; [.32BF.0020.001C.3345][.32B2.0020.001C.3345][.32BA.0020.001F.3345] # SQUARE MAHHA 3346 ; [.32BF.0020.001C.3346][.32CA.0020.001C.3346][.32A8.0020.001F.3346] # SQUARE MARUKU 3347 ; [.32BF.0020.001C.3347][.32D1.0020.001C.3347][.32AC.0020.001F.3347][.32C7.0020.001F.3347][.32D1.0020.001F.3347] # SQUARE MANSYON 307F ; [.32C0.0020.000E.307F] # HIRAGANA LETTER MI 30DF ; [.32C0.0020.0011.30DF] # KATAKANA LETTER MI FF90 ; [.32C0.0020.0012.FF90] # HALFWIDTH KATAKANA LETTER MI 32EF ; [.32C0.0020.0013.32EF] # CIRCLED KATAKANA MI 3348 ; [.32C0.0020.001C.3348][.32A8.0020.001C.3348][.32CC.0020.001F.3348][.32D1.0020.001F.3348] # SQUARE MIKURON 3349 ; [.32C0.0020.001C.3349][.32C9.0020.001C.3349] # SQUARE MIRI 334A ; [.32C0.0020.001C.334A][.32C9.0020.001C.334A][.32BA.0020.001F.334A][.0000.0128.001F.334A][.15A0.0020.001F.334A][.32CA.0020.001F.334A] # SQUARE MIRIBAARU 3080 ; [.32C1.0020.000E.3080] # HIRAGANA LETTER MU 31FA ; [.32C1.0020.000F.31FA] # KATAKANA LETTER SMALL MU 30E0 ; [.32C1.0020.0011.30E0] # KATAKANA LETTER MU FF91 ; [.32C1.0020.0012.FF91] # HALFWIDTH KATAKANA LETTER MU 32F0 ; [.32C1.0020.0013.32F0] # CIRCLED KATAKANA MU 3081 ; [.32C2.0020.000E.3081] # HIRAGANA LETTER ME 30E1 ; [.32C2.0020.0011.30E1] # KATAKANA LETTER ME FF92 ; [.32C2.0020.0012.FF92] # HALFWIDTH KATAKANA LETTER ME 32F1 ; [.32C2.0020.0013.32F1] # CIRCLED KATAKANA ME 334D ; [.32C2.0020.001C.334D][.15A0.0020.001C.334D][.32B4.0020.001F.334D][.32CA.0020.001F.334D] # SQUARE MEETORU 334B ; [.32C2.0020.001C.334B][.32A6.0020.001C.334B][.0000.0128.001F.334B] # SQUARE MEGA 334C ; [.32C2.0020.001C.334C][.32A6.0020.001C.334C][.0000.0128.001F.334C][.32B4.0020.001F.334C][.32D1.0020.001F.334C] # SQUARE MEGATON 3082 ; [.32C3.0020.000E.3082] # HIRAGANA LETTER MO 30E2 ; [.32C3.0020.0011.30E2] # KATAKANA LETTER MO FF93 ; [.32C3.0020.0012.FF93] # HALFWIDTH KATAKANA LETTER MO 32F2 ; [.32C3.0020.0013.32F2] # CIRCLED KATAKANA MO 3083 ; [.32C4.0020.000D.3083] # HIRAGANA LETTER SMALL YA 3084 ; [.32C4.0020.000E.3084] # HIRAGANA LETTER YA 30E3 ; [.32C4.0020.000F.30E3] # KATAKANA LETTER SMALL YA FF6C ; [.32C4.0020.0010.FF6C] # HALFWIDTH KATAKANA LETTER SMALL YA 30E4 ; [.32C4.0020.0011.30E4] # KATAKANA LETTER YA FF94 ; [.32C4.0020.0012.FF94] # HALFWIDTH KATAKANA LETTER YA 32F3 ; [.32C4.0020.0013.32F3] # CIRCLED KATAKANA YA 334E ; [.32C4.0020.001C.334E][.15A0.0020.001C.334E][.32B4.0020.001F.334E][.0000.0128.001F.334E] # SQUARE YAADO 334F ; [.32C4.0020.001C.334F][.15A0.0020.001C.334F][.32CA.0020.001F.334F] # SQUARE YAARU 3085 ; [.32C5.0020.000D.3085] # HIRAGANA LETTER SMALL YU 3086 ; [.32C5.0020.000E.3086] # HIRAGANA LETTER YU 30E5 ; [.32C5.0020.000F.30E5] # KATAKANA LETTER SMALL YU FF6D ; [.32C5.0020.0010.FF6D] # HALFWIDTH KATAKANA LETTER SMALL YU 30E6 ; [.32C5.0020.0011.30E6] # KATAKANA LETTER YU FF95 ; [.32C5.0020.0012.FF95] # HALFWIDTH KATAKANA LETTER YU 32F4 ; [.32C5.0020.0013.32F4] # CIRCLED KATAKANA YU 3350 ; [.32C5.0020.001C.3350][.32A0.0020.001C.3350][.32D1.0020.001F.3350] # SQUARE YUAN 1B001 ; [.32C6.0020.0002.1B001] # HIRAGANA LETTER ARCHAIC YE 3087 ; [.32C7.0020.000D.3087] # HIRAGANA LETTER SMALL YO 3088 ; [.32C7.0020.000E.3088] # HIRAGANA LETTER YO 30E7 ; [.32C7.0020.000F.30E7] # KATAKANA LETTER SMALL YO FF6E ; [.32C7.0020.0010.FF6E] # HALFWIDTH KATAKANA LETTER SMALL YO 30E8 ; [.32C7.0020.0011.30E8] # KATAKANA LETTER YO FF96 ; [.32C7.0020.0012.FF96] # HALFWIDTH KATAKANA LETTER YO 32F5 ; [.32C7.0020.0013.32F5] # CIRCLED KATAKANA YO 309F ; [.32C7.0020.0016.309F][.32C9.0020.0016.309F] # HIRAGANA DIGRAPH YORI 3089 ; [.32C8.0020.000E.3089] # HIRAGANA LETTER RA 31FB ; [.32C8.0020.000F.31FB] # KATAKANA LETTER SMALL RA 30E9 ; [.32C8.0020.0011.30E9] # KATAKANA LETTER RA FF97 ; [.32C8.0020.0012.FF97] # HALFWIDTH KATAKANA LETTER RA 32F6 ; [.32C8.0020.0013.32F6] # CIRCLED KATAKANA RA 308A ; [.32C9.0020.000E.308A] # HIRAGANA LETTER RI 31FC ; [.32C9.0020.000F.31FC] # KATAKANA LETTER SMALL RI 30EA ; [.32C9.0020.0011.30EA] # KATAKANA LETTER RI FF98 ; [.32C9.0020.0012.FF98] # HALFWIDTH KATAKANA LETTER RI 32F7 ; [.32C9.0020.0013.32F7] # CIRCLED KATAKANA RI 3351 ; [.32C9.0020.001C.3351][.32B2.0020.001C.3351][.32B4.0020.001F.3351][.32CA.0020.001F.3351] # SQUARE RITTORU 3352 ; [.32C9.0020.001C.3352][.32C8.0020.001C.3352] # SQUARE RIRA 308B ; [.32CA.0020.000E.308B] # HIRAGANA LETTER RU 31FD ; [.32CA.0020.000F.31FD] # KATAKANA LETTER SMALL RU 30EB ; [.32CA.0020.0011.30EB] # KATAKANA LETTER RU FF99 ; [.32CA.0020.0012.FF99] # HALFWIDTH KATAKANA LETTER RU 32F8 ; [.32CA.0020.0013.32F8] # CIRCLED KATAKANA RU 3354 ; [.32CA.0020.001C.3354][.15A0.0020.001C.3354][.32BC.0020.001F.3354][.0000.0128.001F.3354][.32CA.0020.001F.3354] # SQUARE RUUBURU 3353 ; [.32CA.0020.001C.3353][.32BB.0020.001C.3353][.0000.0129.001F.3353][.15A0.0020.001F.3353] # SQUARE RUPII 308C ; [.32CB.0020.000E.308C] # HIRAGANA LETTER RE 31FE ; [.32CB.0020.000F.31FE] # KATAKANA LETTER SMALL RE 30EC ; [.32CB.0020.0011.30EC] # KATAKANA LETTER RE FF9A ; [.32CB.0020.0012.FF9A] # HALFWIDTH KATAKANA LETTER RE 32F9 ; [.32CB.0020.0013.32F9] # CIRCLED KATAKANA RE 3355 ; [.32CB.0020.001C.3355][.32C1.0020.001C.3355] # SQUARE REMU 3356 ; [.32CB.0020.001C.3356][.32D1.0020.001C.3356][.32B4.0020.001F.3356][.32A9.0020.001F.3356][.0000.0128.001F.3356][.32D1.0020.001F.3356] # SQUARE RENTOGEN 308D ; [.32CC.0020.000E.308D] # HIRAGANA LETTER RO 31FF ; [.32CC.0020.000F.31FF] # KATAKANA LETTER SMALL RO 30ED ; [.32CC.0020.0011.30ED] # KATAKANA LETTER RO FF9B ; [.32CC.0020.0012.FF9B] # HALFWIDTH KATAKANA LETTER RO 32FA ; [.32CC.0020.0013.32FA] # CIRCLED KATAKANA RO 308E ; [.32CD.0020.000D.308E] # HIRAGANA LETTER SMALL WA 308F ; [.32CD.0020.000E.308F] # HIRAGANA LETTER WA 30EE ; [.32CD.0020.000F.30EE] # KATAKANA LETTER SMALL WA 30EF ; [.32CD.0020.0011.30EF] # KATAKANA LETTER WA FF9C ; [.32CD.0020.0012.FF9C] # HALFWIDTH KATAKANA LETTER WA 32FB ; [.32CD.0020.0013.32FB] # CIRCLED KATAKANA WA 30F7 ; [.32CD.0020.0011.30EF][.0000.0128.0002.3099] # KATAKANA LETTER VA 3357 ; [.32CD.0020.001C.3357][.32B2.0020.001C.3357][.32B4.0020.001F.3357] # SQUARE WATTO 3090 ; [.32CE.0020.000E.3090] # HIRAGANA LETTER WI 30F0 ; [.32CE.0020.0011.30F0] # KATAKANA LETTER WI 32FC ; [.32CE.0020.0013.32FC] # CIRCLED KATAKANA WI 30F8 ; [.32CE.0020.0011.30F0][.0000.0128.0002.3099] # KATAKANA LETTER VI 3091 ; [.32CF.0020.000E.3091] # HIRAGANA LETTER WE 30F1 ; [.32CF.0020.0011.30F1] # KATAKANA LETTER WE 32FD ; [.32CF.0020.0013.32FD] # CIRCLED KATAKANA WE 30F9 ; [.32CF.0020.0011.30F1][.0000.0128.0002.3099] # KATAKANA LETTER VE 3092 ; [.32D0.0020.000E.3092] # HIRAGANA LETTER WO 30F2 ; [.32D0.0020.0011.30F2] # KATAKANA LETTER WO FF66 ; [.32D0.0020.0012.FF66] # HALFWIDTH KATAKANA LETTER WO 32FE ; [.32D0.0020.0013.32FE] # CIRCLED KATAKANA WO 30FA ; [.32D0.0020.0011.30F2][.0000.0128.0002.3099] # KATAKANA LETTER VO 3093 ; [.32D1.0020.000E.3093] # HIRAGANA LETTER N 30F3 ; [.32D1.0020.0011.30F3] # KATAKANA LETTER N FF9D ; [.32D1.0020.0012.FF9D] # HALFWIDTH KATAKANA LETTER N 3105 ; [.32D2.0020.0002.3105] # BOPOMOFO LETTER B 31A0 ; [.32D2.0020.0004.31A0][.0000.013A.0004.31A0] # BOPOMOFO LETTER BU 3106 ; [.32D3.0020.0002.3106] # BOPOMOFO LETTER P 31B4 ; [.32D3.0020.0019.31B4] # BOPOMOFO FINAL LETTER P 3107 ; [.32D4.0020.0002.3107] # BOPOMOFO LETTER M 3108 ; [.32D5.0020.0002.3108] # BOPOMOFO LETTER F 312A ; [.32D6.0020.0002.312A] # BOPOMOFO LETTER V 3109 ; [.32D7.0020.0002.3109] # BOPOMOFO LETTER D 310A ; [.32D8.0020.0002.310A] # BOPOMOFO LETTER T 31B5 ; [.32D8.0020.0019.31B5] # BOPOMOFO FINAL LETTER T 310B ; [.32D9.0020.0002.310B] # BOPOMOFO LETTER N 310C ; [.32DA.0020.0002.310C] # BOPOMOFO LETTER L 310D ; [.32DB.0020.0002.310D] # BOPOMOFO LETTER G 31A3 ; [.32DB.0020.0004.31A3][.0000.013A.0004.31A3] # BOPOMOFO LETTER GU 310E ; [.32DC.0020.0002.310E] # BOPOMOFO LETTER K 31B6 ; [.32DC.0020.0019.31B6] # BOPOMOFO FINAL LETTER K 312B ; [.32DD.0020.0002.312B] # BOPOMOFO LETTER NG 31AD ; [.32DE.0020.0002.31AD] # BOPOMOFO LETTER NGG 310F ; [.32DF.0020.0002.310F] # BOPOMOFO LETTER H 31B7 ; [.32DF.0020.0019.31B7] # BOPOMOFO FINAL LETTER H 3110 ; [.32E0.0020.0002.3110] # BOPOMOFO LETTER J 31A2 ; [.32E0.0020.0004.31A2][.0000.013A.0004.31A2] # BOPOMOFO LETTER JI 3111 ; [.32E1.0020.0002.3111] # BOPOMOFO LETTER Q 3112 ; [.32E2.0020.0002.3112] # BOPOMOFO LETTER X 312C ; [.32E3.0020.0002.312C] # BOPOMOFO LETTER GN 3113 ; [.32E4.0020.0002.3113] # BOPOMOFO LETTER ZH 3114 ; [.32E5.0020.0002.3114] # BOPOMOFO LETTER CH 3115 ; [.32E6.0020.0002.3115] # BOPOMOFO LETTER SH 3116 ; [.32E7.0020.0002.3116] # BOPOMOFO LETTER R 3117 ; [.32E8.0020.0002.3117] # BOPOMOFO LETTER Z 31A1 ; [.32E8.0020.0004.31A1][.0000.013A.0004.31A1] # BOPOMOFO LETTER ZI 3118 ; [.32E9.0020.0002.3118] # BOPOMOFO LETTER C 3119 ; [.32EA.0020.0002.3119] # BOPOMOFO LETTER S 31B8 ; [.32EB.0020.0002.31B8] # BOPOMOFO LETTER GH 31B9 ; [.32EC.0020.0002.31B9] # BOPOMOFO LETTER LH 31BA ; [.32ED.0020.0002.31BA] # BOPOMOFO LETTER ZY 311A ; [.32EE.0020.0002.311A] # BOPOMOFO LETTER A 31A9 ; [.32EE.0020.0004.31A9][.0000.013A.0004.31A9] # BOPOMOFO LETTER ANN 311B ; [.32EF.0020.0002.311B] # BOPOMOFO LETTER O 31A7 ; [.32EF.0020.0004.31A7][.0000.013A.0004.31A7] # BOPOMOFO LETTER ONN 31A6 ; [.32F0.0020.0002.31A6] # BOPOMOFO LETTER OO 311C ; [.32F1.0020.0002.311C] # BOPOMOFO LETTER E 311D ; [.32F2.0020.0002.311D] # BOPOMOFO LETTER EH 31A4 ; [.32F3.0020.0002.31A4] # BOPOMOFO LETTER EE 31A5 ; [.32F3.0020.0004.31A5][.0000.013A.0004.31A5] # BOPOMOFO LETTER ENN 311E ; [.32F4.0020.0002.311E] # BOPOMOFO LETTER AI 31AE ; [.32F4.0020.0004.31AE][.0000.013A.0004.31AE] # BOPOMOFO LETTER AINN 311F ; [.32F5.0020.0002.311F] # BOPOMOFO LETTER EI 3120 ; [.32F6.0020.0002.3120] # BOPOMOFO LETTER AU 31AF ; [.32F6.0020.0004.31AF][.0000.013A.0004.31AF] # BOPOMOFO LETTER AUNN 3121 ; [.32F7.0020.0002.3121] # BOPOMOFO LETTER OU 3122 ; [.32F8.0020.0002.3122] # BOPOMOFO LETTER AN 3123 ; [.32F9.0020.0002.3123] # BOPOMOFO LETTER EN 3124 ; [.32FA.0020.0002.3124] # BOPOMOFO LETTER ANG 31B2 ; [.32FB.0020.0002.31B2] # BOPOMOFO LETTER ONG 3125 ; [.32FC.0020.0002.3125] # BOPOMOFO LETTER ENG 31B0 ; [.32FD.0020.0002.31B0] # BOPOMOFO LETTER AM 31B1 ; [.32FE.0020.0002.31B1] # BOPOMOFO LETTER OM 31AC ; [.32FF.0020.0002.31AC] # BOPOMOFO LETTER IM 3126 ; [.3300.0020.0002.3126] # BOPOMOFO LETTER ER 3127 ; [.3301.0020.0002.3127] # BOPOMOFO LETTER I 31AA ; [.3301.0020.0004.31AA][.0000.013A.0004.31AA] # BOPOMOFO LETTER INN 31B3 ; [.3301.0020.0016.31B3][.0000.013A.0016.31B3] # BOPOMOFO LETTER INNN 3128 ; [.3302.0020.0002.3128] # BOPOMOFO LETTER U 31AB ; [.3302.0020.0004.31AB][.0000.013A.0004.31AB] # BOPOMOFO LETTER UNN 31A8 ; [.3302.0020.0004.31A8][.0000.013C.0004.31A8] # BOPOMOFO LETTER IR 3129 ; [.3303.0020.0002.3129] # BOPOMOFO LETTER IU 312D ; [.3304.0020.0002.312D] # BOPOMOFO LETTER IH A000 ; [.3305.0020.0002.A000] # YI SYLLABLE IT A001 ; [.3306.0020.0002.A001] # YI SYLLABLE IX A002 ; [.3307.0020.0002.A002] # YI SYLLABLE I A003 ; [.3308.0020.0002.A003] # YI SYLLABLE IP A004 ; [.3309.0020.0002.A004] # YI SYLLABLE IET A005 ; [.330A.0020.0002.A005] # YI SYLLABLE IEX A006 ; [.330B.0020.0002.A006] # YI SYLLABLE IE A007 ; [.330C.0020.0002.A007] # YI SYLLABLE IEP A008 ; [.330D.0020.0002.A008] # YI SYLLABLE AT A009 ; [.330E.0020.0002.A009] # YI SYLLABLE AX A00A ; [.330F.0020.0002.A00A] # YI SYLLABLE A A00B ; [.3310.0020.0002.A00B] # YI SYLLABLE AP A00C ; [.3311.0020.0002.A00C] # YI SYLLABLE UOX A00D ; [.3312.0020.0002.A00D] # YI SYLLABLE UO A00E ; [.3313.0020.0002.A00E] # YI SYLLABLE UOP A00F ; [.3314.0020.0002.A00F] # YI SYLLABLE OT A010 ; [.3315.0020.0002.A010] # YI SYLLABLE OX A011 ; [.3316.0020.0002.A011] # YI SYLLABLE O A012 ; [.3317.0020.0002.A012] # YI SYLLABLE OP A013 ; [.3318.0020.0002.A013] # YI SYLLABLE EX A014 ; [.3319.0020.0002.A014] # YI SYLLABLE E A015 ; [.331A.0020.0002.A015] # YI SYLLABLE WU A016 ; [.331B.0020.0002.A016] # YI SYLLABLE BIT A017 ; [.331C.0020.0002.A017] # YI SYLLABLE BIX A018 ; [.331D.0020.0002.A018] # YI SYLLABLE BI A019 ; [.331E.0020.0002.A019] # YI SYLLABLE BIP A01A ; [.331F.0020.0002.A01A] # YI SYLLABLE BIET A01B ; [.3320.0020.0002.A01B] # YI SYLLABLE BIEX A01C ; [.3321.0020.0002.A01C] # YI SYLLABLE BIE A01D ; [.3322.0020.0002.A01D] # YI SYLLABLE BIEP A01E ; [.3323.0020.0002.A01E] # YI SYLLABLE BAT A01F ; [.3324.0020.0002.A01F] # YI SYLLABLE BAX A020 ; [.3325.0020.0002.A020] # YI SYLLABLE BA A021 ; [.3326.0020.0002.A021] # YI SYLLABLE BAP A022 ; [.3327.0020.0002.A022] # YI SYLLABLE BUOX A023 ; [.3328.0020.0002.A023] # YI SYLLABLE BUO A024 ; [.3329.0020.0002.A024] # YI SYLLABLE BUOP A025 ; [.332A.0020.0002.A025] # YI SYLLABLE BOT A026 ; [.332B.0020.0002.A026] # YI SYLLABLE BOX A027 ; [.332C.0020.0002.A027] # YI SYLLABLE BO A028 ; [.332D.0020.0002.A028] # YI SYLLABLE BOP A029 ; [.332E.0020.0002.A029] # YI SYLLABLE BEX A02A ; [.332F.0020.0002.A02A] # YI SYLLABLE BE A02B ; [.3330.0020.0002.A02B] # YI SYLLABLE BEP A02C ; [.3331.0020.0002.A02C] # YI SYLLABLE BUT A02D ; [.3332.0020.0002.A02D] # YI SYLLABLE BUX A02E ; [.3333.0020.0002.A02E] # YI SYLLABLE BU A02F ; [.3334.0020.0002.A02F] # YI SYLLABLE BUP A030 ; [.3335.0020.0002.A030] # YI SYLLABLE BURX A031 ; [.3336.0020.0002.A031] # YI SYLLABLE BUR A032 ; [.3337.0020.0002.A032] # YI SYLLABLE BYT A033 ; [.3338.0020.0002.A033] # YI SYLLABLE BYX A034 ; [.3339.0020.0002.A034] # YI SYLLABLE BY A035 ; [.333A.0020.0002.A035] # YI SYLLABLE BYP A036 ; [.333B.0020.0002.A036] # YI SYLLABLE BYRX A037 ; [.333C.0020.0002.A037] # YI SYLLABLE BYR A038 ; [.333D.0020.0002.A038] # YI SYLLABLE PIT A039 ; [.333E.0020.0002.A039] # YI SYLLABLE PIX A03A ; [.333F.0020.0002.A03A] # YI SYLLABLE PI A03B ; [.3340.0020.0002.A03B] # YI SYLLABLE PIP A03C ; [.3341.0020.0002.A03C] # YI SYLLABLE PIEX A03D ; [.3342.0020.0002.A03D] # YI SYLLABLE PIE A03E ; [.3343.0020.0002.A03E] # YI SYLLABLE PIEP A03F ; [.3344.0020.0002.A03F] # YI SYLLABLE PAT A040 ; [.3345.0020.0002.A040] # YI SYLLABLE PAX A041 ; [.3346.0020.0002.A041] # YI SYLLABLE PA A042 ; [.3347.0020.0002.A042] # YI SYLLABLE PAP A043 ; [.3348.0020.0002.A043] # YI SYLLABLE PUOX A044 ; [.3349.0020.0002.A044] # YI SYLLABLE PUO A045 ; [.334A.0020.0002.A045] # YI SYLLABLE PUOP A046 ; [.334B.0020.0002.A046] # YI SYLLABLE POT A047 ; [.334C.0020.0002.A047] # YI SYLLABLE POX A048 ; [.334D.0020.0002.A048] # YI SYLLABLE PO A049 ; [.334E.0020.0002.A049] # YI SYLLABLE POP A04A ; [.334F.0020.0002.A04A] # YI SYLLABLE PUT A04B ; [.3350.0020.0002.A04B] # YI SYLLABLE PUX A04C ; [.3351.0020.0002.A04C] # YI SYLLABLE PU A04D ; [.3352.0020.0002.A04D] # YI SYLLABLE PUP A04E ; [.3353.0020.0002.A04E] # YI SYLLABLE PURX A04F ; [.3354.0020.0002.A04F] # YI SYLLABLE PUR A050 ; [.3355.0020.0002.A050] # YI SYLLABLE PYT A051 ; [.3356.0020.0002.A051] # YI SYLLABLE PYX A052 ; [.3357.0020.0002.A052] # YI SYLLABLE PY A053 ; [.3358.0020.0002.A053] # YI SYLLABLE PYP A054 ; [.3359.0020.0002.A054] # YI SYLLABLE PYRX A055 ; [.335A.0020.0002.A055] # YI SYLLABLE PYR A056 ; [.335B.0020.0002.A056] # YI SYLLABLE BBIT A057 ; [.335C.0020.0002.A057] # YI SYLLABLE BBIX A058 ; [.335D.0020.0002.A058] # YI SYLLABLE BBI A059 ; [.335E.0020.0002.A059] # YI SYLLABLE BBIP A05A ; [.335F.0020.0002.A05A] # YI SYLLABLE BBIET A05B ; [.3360.0020.0002.A05B] # YI SYLLABLE BBIEX A05C ; [.3361.0020.0002.A05C] # YI SYLLABLE BBIE A05D ; [.3362.0020.0002.A05D] # YI SYLLABLE BBIEP A05E ; [.3363.0020.0002.A05E] # YI SYLLABLE BBAT A05F ; [.3364.0020.0002.A05F] # YI SYLLABLE BBAX A060 ; [.3365.0020.0002.A060] # YI SYLLABLE BBA A061 ; [.3366.0020.0002.A061] # YI SYLLABLE BBAP A062 ; [.3367.0020.0002.A062] # YI SYLLABLE BBUOX A063 ; [.3368.0020.0002.A063] # YI SYLLABLE BBUO A064 ; [.3369.0020.0002.A064] # YI SYLLABLE BBUOP A065 ; [.336A.0020.0002.A065] # YI SYLLABLE BBOT A066 ; [.336B.0020.0002.A066] # YI SYLLABLE BBOX A067 ; [.336C.0020.0002.A067] # YI SYLLABLE BBO A068 ; [.336D.0020.0002.A068] # YI SYLLABLE BBOP A069 ; [.336E.0020.0002.A069] # YI SYLLABLE BBEX A06A ; [.336F.0020.0002.A06A] # YI SYLLABLE BBE A06B ; [.3370.0020.0002.A06B] # YI SYLLABLE BBEP A06C ; [.3371.0020.0002.A06C] # YI SYLLABLE BBUT A06D ; [.3372.0020.0002.A06D] # YI SYLLABLE BBUX A06E ; [.3373.0020.0002.A06E] # YI SYLLABLE BBU A06F ; [.3374.0020.0002.A06F] # YI SYLLABLE BBUP A070 ; [.3375.0020.0002.A070] # YI SYLLABLE BBURX A071 ; [.3376.0020.0002.A071] # YI SYLLABLE BBUR A072 ; [.3377.0020.0002.A072] # YI SYLLABLE BBYT A073 ; [.3378.0020.0002.A073] # YI SYLLABLE BBYX A074 ; [.3379.0020.0002.A074] # YI SYLLABLE BBY A075 ; [.337A.0020.0002.A075] # YI SYLLABLE BBYP A076 ; [.337B.0020.0002.A076] # YI SYLLABLE NBIT A077 ; [.337C.0020.0002.A077] # YI SYLLABLE NBIX A078 ; [.337D.0020.0002.A078] # YI SYLLABLE NBI A079 ; [.337E.0020.0002.A079] # YI SYLLABLE NBIP A07A ; [.337F.0020.0002.A07A] # YI SYLLABLE NBIEX A07B ; [.3380.0020.0002.A07B] # YI SYLLABLE NBIE A07C ; [.3381.0020.0002.A07C] # YI SYLLABLE NBIEP A07D ; [.3382.0020.0002.A07D] # YI SYLLABLE NBAT A07E ; [.3383.0020.0002.A07E] # YI SYLLABLE NBAX A07F ; [.3384.0020.0002.A07F] # YI SYLLABLE NBA A080 ; [.3385.0020.0002.A080] # YI SYLLABLE NBAP A081 ; [.3386.0020.0002.A081] # YI SYLLABLE NBOT A082 ; [.3387.0020.0002.A082] # YI SYLLABLE NBOX A083 ; [.3388.0020.0002.A083] # YI SYLLABLE NBO A084 ; [.3389.0020.0002.A084] # YI SYLLABLE NBOP A085 ; [.338A.0020.0002.A085] # YI SYLLABLE NBUT A086 ; [.338B.0020.0002.A086] # YI SYLLABLE NBUX A087 ; [.338C.0020.0002.A087] # YI SYLLABLE NBU A088 ; [.338D.0020.0002.A088] # YI SYLLABLE NBUP A089 ; [.338E.0020.0002.A089] # YI SYLLABLE NBURX A08A ; [.338F.0020.0002.A08A] # YI SYLLABLE NBUR A08B ; [.3390.0020.0002.A08B] # YI SYLLABLE NBYT A08C ; [.3391.0020.0002.A08C] # YI SYLLABLE NBYX A08D ; [.3392.0020.0002.A08D] # YI SYLLABLE NBY A08E ; [.3393.0020.0002.A08E] # YI SYLLABLE NBYP A08F ; [.3394.0020.0002.A08F] # YI SYLLABLE NBYRX A090 ; [.3395.0020.0002.A090] # YI SYLLABLE NBYR A091 ; [.3396.0020.0002.A091] # YI SYLLABLE HMIT A092 ; [.3397.0020.0002.A092] # YI SYLLABLE HMIX A093 ; [.3398.0020.0002.A093] # YI SYLLABLE HMI A094 ; [.3399.0020.0002.A094] # YI SYLLABLE HMIP A095 ; [.339A.0020.0002.A095] # YI SYLLABLE HMIEX A096 ; [.339B.0020.0002.A096] # YI SYLLABLE HMIE A097 ; [.339C.0020.0002.A097] # YI SYLLABLE HMIEP A098 ; [.339D.0020.0002.A098] # YI SYLLABLE HMAT A099 ; [.339E.0020.0002.A099] # YI SYLLABLE HMAX A09A ; [.339F.0020.0002.A09A] # YI SYLLABLE HMA A09B ; [.33A0.0020.0002.A09B] # YI SYLLABLE HMAP A09C ; [.33A1.0020.0002.A09C] # YI SYLLABLE HMUOX A09D ; [.33A2.0020.0002.A09D] # YI SYLLABLE HMUO A09E ; [.33A3.0020.0002.A09E] # YI SYLLABLE HMUOP A09F ; [.33A4.0020.0002.A09F] # YI SYLLABLE HMOT A0A0 ; [.33A5.0020.0002.A0A0] # YI SYLLABLE HMOX A0A1 ; [.33A6.0020.0002.A0A1] # YI SYLLABLE HMO A0A2 ; [.33A7.0020.0002.A0A2] # YI SYLLABLE HMOP A0A3 ; [.33A8.0020.0002.A0A3] # YI SYLLABLE HMUT A0A4 ; [.33A9.0020.0002.A0A4] # YI SYLLABLE HMUX A0A5 ; [.33AA.0020.0002.A0A5] # YI SYLLABLE HMU A0A6 ; [.33AB.0020.0002.A0A6] # YI SYLLABLE HMUP A0A7 ; [.33AC.0020.0002.A0A7] # YI SYLLABLE HMURX A0A8 ; [.33AD.0020.0002.A0A8] # YI SYLLABLE HMUR A0A9 ; [.33AE.0020.0002.A0A9] # YI SYLLABLE HMYX A0AA ; [.33AF.0020.0002.A0AA] # YI SYLLABLE HMY A0AB ; [.33B0.0020.0002.A0AB] # YI SYLLABLE HMYP A0AC ; [.33B1.0020.0002.A0AC] # YI SYLLABLE HMYRX A0AD ; [.33B2.0020.0002.A0AD] # YI SYLLABLE HMYR A0AE ; [.33B3.0020.0002.A0AE] # YI SYLLABLE MIT A0AF ; [.33B4.0020.0002.A0AF] # YI SYLLABLE MIX A0B0 ; [.33B5.0020.0002.A0B0] # YI SYLLABLE MI A0B1 ; [.33B6.0020.0002.A0B1] # YI SYLLABLE MIP A0B2 ; [.33B7.0020.0002.A0B2] # YI SYLLABLE MIEX A0B3 ; [.33B8.0020.0002.A0B3] # YI SYLLABLE MIE A0B4 ; [.33B9.0020.0002.A0B4] # YI SYLLABLE MIEP A0B5 ; [.33BA.0020.0002.A0B5] # YI SYLLABLE MAT A0B6 ; [.33BB.0020.0002.A0B6] # YI SYLLABLE MAX A0B7 ; [.33BC.0020.0002.A0B7] # YI SYLLABLE MA A0B8 ; [.33BD.0020.0002.A0B8] # YI SYLLABLE MAP A0B9 ; [.33BE.0020.0002.A0B9] # YI SYLLABLE MUOT A0BA ; [.33BF.0020.0002.A0BA] # YI SYLLABLE MUOX A0BB ; [.33C0.0020.0002.A0BB] # YI SYLLABLE MUO A0BC ; [.33C1.0020.0002.A0BC] # YI SYLLABLE MUOP A0BD ; [.33C2.0020.0002.A0BD] # YI SYLLABLE MOT A0BE ; [.33C3.0020.0002.A0BE] # YI SYLLABLE MOX A0BF ; [.33C4.0020.0002.A0BF] # YI SYLLABLE MO A0C0 ; [.33C5.0020.0002.A0C0] # YI SYLLABLE MOP A0C1 ; [.33C6.0020.0002.A0C1] # YI SYLLABLE MEX A0C2 ; [.33C7.0020.0002.A0C2] # YI SYLLABLE ME A0C3 ; [.33C8.0020.0002.A0C3] # YI SYLLABLE MUT A0C4 ; [.33C9.0020.0002.A0C4] # YI SYLLABLE MUX A0C5 ; [.33CA.0020.0002.A0C5] # YI SYLLABLE MU A0C6 ; [.33CB.0020.0002.A0C6] # YI SYLLABLE MUP A0C7 ; [.33CC.0020.0002.A0C7] # YI SYLLABLE MURX A0C8 ; [.33CD.0020.0002.A0C8] # YI SYLLABLE MUR A0C9 ; [.33CE.0020.0002.A0C9] # YI SYLLABLE MYT A0CA ; [.33CF.0020.0002.A0CA] # YI SYLLABLE MYX A0CB ; [.33D0.0020.0002.A0CB] # YI SYLLABLE MY A0CC ; [.33D1.0020.0002.A0CC] # YI SYLLABLE MYP A0CD ; [.33D2.0020.0002.A0CD] # YI SYLLABLE FIT A0CE ; [.33D3.0020.0002.A0CE] # YI SYLLABLE FIX A0CF ; [.33D4.0020.0002.A0CF] # YI SYLLABLE FI A0D0 ; [.33D5.0020.0002.A0D0] # YI SYLLABLE FIP A0D1 ; [.33D6.0020.0002.A0D1] # YI SYLLABLE FAT A0D2 ; [.33D7.0020.0002.A0D2] # YI SYLLABLE FAX A0D3 ; [.33D8.0020.0002.A0D3] # YI SYLLABLE FA A0D4 ; [.33D9.0020.0002.A0D4] # YI SYLLABLE FAP A0D5 ; [.33DA.0020.0002.A0D5] # YI SYLLABLE FOX A0D6 ; [.33DB.0020.0002.A0D6] # YI SYLLABLE FO A0D7 ; [.33DC.0020.0002.A0D7] # YI SYLLABLE FOP A0D8 ; [.33DD.0020.0002.A0D8] # YI SYLLABLE FUT A0D9 ; [.33DE.0020.0002.A0D9] # YI SYLLABLE FUX A0DA ; [.33DF.0020.0002.A0DA] # YI SYLLABLE FU A0DB ; [.33E0.0020.0002.A0DB] # YI SYLLABLE FUP A0DC ; [.33E1.0020.0002.A0DC] # YI SYLLABLE FURX A0DD ; [.33E2.0020.0002.A0DD] # YI SYLLABLE FUR A0DE ; [.33E3.0020.0002.A0DE] # YI SYLLABLE FYT A0DF ; [.33E4.0020.0002.A0DF] # YI SYLLABLE FYX A0E0 ; [.33E5.0020.0002.A0E0] # YI SYLLABLE FY A0E1 ; [.33E6.0020.0002.A0E1] # YI SYLLABLE FYP A0E2 ; [.33E7.0020.0002.A0E2] # YI SYLLABLE VIT A0E3 ; [.33E8.0020.0002.A0E3] # YI SYLLABLE VIX A0E4 ; [.33E9.0020.0002.A0E4] # YI SYLLABLE VI A0E5 ; [.33EA.0020.0002.A0E5] # YI SYLLABLE VIP A0E6 ; [.33EB.0020.0002.A0E6] # YI SYLLABLE VIET A0E7 ; [.33EC.0020.0002.A0E7] # YI SYLLABLE VIEX A0E8 ; [.33ED.0020.0002.A0E8] # YI SYLLABLE VIE A0E9 ; [.33EE.0020.0002.A0E9] # YI SYLLABLE VIEP A0EA ; [.33EF.0020.0002.A0EA] # YI SYLLABLE VAT A0EB ; [.33F0.0020.0002.A0EB] # YI SYLLABLE VAX A0EC ; [.33F1.0020.0002.A0EC] # YI SYLLABLE VA A0ED ; [.33F2.0020.0002.A0ED] # YI SYLLABLE VAP A0EE ; [.33F3.0020.0002.A0EE] # YI SYLLABLE VOT A0EF ; [.33F4.0020.0002.A0EF] # YI SYLLABLE VOX A0F0 ; [.33F5.0020.0002.A0F0] # YI SYLLABLE VO A0F1 ; [.33F6.0020.0002.A0F1] # YI SYLLABLE VOP A0F2 ; [.33F7.0020.0002.A0F2] # YI SYLLABLE VEX A0F3 ; [.33F8.0020.0002.A0F3] # YI SYLLABLE VEP A0F4 ; [.33F9.0020.0002.A0F4] # YI SYLLABLE VUT A0F5 ; [.33FA.0020.0002.A0F5] # YI SYLLABLE VUX A0F6 ; [.33FB.0020.0002.A0F6] # YI SYLLABLE VU A0F7 ; [.33FC.0020.0002.A0F7] # YI SYLLABLE VUP A0F8 ; [.33FD.0020.0002.A0F8] # YI SYLLABLE VURX A0F9 ; [.33FE.0020.0002.A0F9] # YI SYLLABLE VUR A0FA ; [.33FF.0020.0002.A0FA] # YI SYLLABLE VYT A0FB ; [.3400.0020.0002.A0FB] # YI SYLLABLE VYX A0FC ; [.3401.0020.0002.A0FC] # YI SYLLABLE VY A0FD ; [.3402.0020.0002.A0FD] # YI SYLLABLE VYP A0FE ; [.3403.0020.0002.A0FE] # YI SYLLABLE VYRX A0FF ; [.3404.0020.0002.A0FF] # YI SYLLABLE VYR A100 ; [.3405.0020.0002.A100] # YI SYLLABLE DIT A101 ; [.3406.0020.0002.A101] # YI SYLLABLE DIX A102 ; [.3407.0020.0002.A102] # YI SYLLABLE DI A103 ; [.3408.0020.0002.A103] # YI SYLLABLE DIP A104 ; [.3409.0020.0002.A104] # YI SYLLABLE DIEX A105 ; [.340A.0020.0002.A105] # YI SYLLABLE DIE A106 ; [.340B.0020.0002.A106] # YI SYLLABLE DIEP A107 ; [.340C.0020.0002.A107] # YI SYLLABLE DAT A108 ; [.340D.0020.0002.A108] # YI SYLLABLE DAX A109 ; [.340E.0020.0002.A109] # YI SYLLABLE DA A10A ; [.340F.0020.0002.A10A] # YI SYLLABLE DAP A10B ; [.3410.0020.0002.A10B] # YI SYLLABLE DUOX A10C ; [.3411.0020.0002.A10C] # YI SYLLABLE DUO A10D ; [.3412.0020.0002.A10D] # YI SYLLABLE DOT A10E ; [.3413.0020.0002.A10E] # YI SYLLABLE DOX A10F ; [.3414.0020.0002.A10F] # YI SYLLABLE DO A110 ; [.3415.0020.0002.A110] # YI SYLLABLE DOP A111 ; [.3416.0020.0002.A111] # YI SYLLABLE DEX A112 ; [.3417.0020.0002.A112] # YI SYLLABLE DE A113 ; [.3418.0020.0002.A113] # YI SYLLABLE DEP A114 ; [.3419.0020.0002.A114] # YI SYLLABLE DUT A115 ; [.341A.0020.0002.A115] # YI SYLLABLE DUX A116 ; [.341B.0020.0002.A116] # YI SYLLABLE DU A117 ; [.341C.0020.0002.A117] # YI SYLLABLE DUP A118 ; [.341D.0020.0002.A118] # YI SYLLABLE DURX A119 ; [.341E.0020.0002.A119] # YI SYLLABLE DUR A11A ; [.341F.0020.0002.A11A] # YI SYLLABLE TIT A11B ; [.3420.0020.0002.A11B] # YI SYLLABLE TIX A11C ; [.3421.0020.0002.A11C] # YI SYLLABLE TI A11D ; [.3422.0020.0002.A11D] # YI SYLLABLE TIP A11E ; [.3423.0020.0002.A11E] # YI SYLLABLE TIEX A11F ; [.3424.0020.0002.A11F] # YI SYLLABLE TIE A120 ; [.3425.0020.0002.A120] # YI SYLLABLE TIEP A121 ; [.3426.0020.0002.A121] # YI SYLLABLE TAT A122 ; [.3427.0020.0002.A122] # YI SYLLABLE TAX A123 ; [.3428.0020.0002.A123] # YI SYLLABLE TA A124 ; [.3429.0020.0002.A124] # YI SYLLABLE TAP A125 ; [.342A.0020.0002.A125] # YI SYLLABLE TUOT A126 ; [.342B.0020.0002.A126] # YI SYLLABLE TUOX A127 ; [.342C.0020.0002.A127] # YI SYLLABLE TUO A128 ; [.342D.0020.0002.A128] # YI SYLLABLE TUOP A129 ; [.342E.0020.0002.A129] # YI SYLLABLE TOT A12A ; [.342F.0020.0002.A12A] # YI SYLLABLE TOX A12B ; [.3430.0020.0002.A12B] # YI SYLLABLE TO A12C ; [.3431.0020.0002.A12C] # YI SYLLABLE TOP A12D ; [.3432.0020.0002.A12D] # YI SYLLABLE TEX A12E ; [.3433.0020.0002.A12E] # YI SYLLABLE TE A12F ; [.3434.0020.0002.A12F] # YI SYLLABLE TEP A130 ; [.3435.0020.0002.A130] # YI SYLLABLE TUT A131 ; [.3436.0020.0002.A131] # YI SYLLABLE TUX A132 ; [.3437.0020.0002.A132] # YI SYLLABLE TU A133 ; [.3438.0020.0002.A133] # YI SYLLABLE TUP A134 ; [.3439.0020.0002.A134] # YI SYLLABLE TURX A135 ; [.343A.0020.0002.A135] # YI SYLLABLE TUR A136 ; [.343B.0020.0002.A136] # YI SYLLABLE DDIT A137 ; [.343C.0020.0002.A137] # YI SYLLABLE DDIX A138 ; [.343D.0020.0002.A138] # YI SYLLABLE DDI A139 ; [.343E.0020.0002.A139] # YI SYLLABLE DDIP A13A ; [.343F.0020.0002.A13A] # YI SYLLABLE DDIEX A13B ; [.3440.0020.0002.A13B] # YI SYLLABLE DDIE A13C ; [.3441.0020.0002.A13C] # YI SYLLABLE DDIEP A13D ; [.3442.0020.0002.A13D] # YI SYLLABLE DDAT A13E ; [.3443.0020.0002.A13E] # YI SYLLABLE DDAX A13F ; [.3444.0020.0002.A13F] # YI SYLLABLE DDA A140 ; [.3445.0020.0002.A140] # YI SYLLABLE DDAP A141 ; [.3446.0020.0002.A141] # YI SYLLABLE DDUOX A142 ; [.3447.0020.0002.A142] # YI SYLLABLE DDUO A143 ; [.3448.0020.0002.A143] # YI SYLLABLE DDUOP A144 ; [.3449.0020.0002.A144] # YI SYLLABLE DDOT A145 ; [.344A.0020.0002.A145] # YI SYLLABLE DDOX A146 ; [.344B.0020.0002.A146] # YI SYLLABLE DDO A147 ; [.344C.0020.0002.A147] # YI SYLLABLE DDOP A148 ; [.344D.0020.0002.A148] # YI SYLLABLE DDEX A149 ; [.344E.0020.0002.A149] # YI SYLLABLE DDE A14A ; [.344F.0020.0002.A14A] # YI SYLLABLE DDEP A14B ; [.3450.0020.0002.A14B] # YI SYLLABLE DDUT A14C ; [.3451.0020.0002.A14C] # YI SYLLABLE DDUX A14D ; [.3452.0020.0002.A14D] # YI SYLLABLE DDU A14E ; [.3453.0020.0002.A14E] # YI SYLLABLE DDUP A14F ; [.3454.0020.0002.A14F] # YI SYLLABLE DDURX A150 ; [.3455.0020.0002.A150] # YI SYLLABLE DDUR A151 ; [.3456.0020.0002.A151] # YI SYLLABLE NDIT A152 ; [.3457.0020.0002.A152] # YI SYLLABLE NDIX A153 ; [.3458.0020.0002.A153] # YI SYLLABLE NDI A154 ; [.3459.0020.0002.A154] # YI SYLLABLE NDIP A155 ; [.345A.0020.0002.A155] # YI SYLLABLE NDIEX A156 ; [.345B.0020.0002.A156] # YI SYLLABLE NDIE A157 ; [.345C.0020.0002.A157] # YI SYLLABLE NDAT A158 ; [.345D.0020.0002.A158] # YI SYLLABLE NDAX A159 ; [.345E.0020.0002.A159] # YI SYLLABLE NDA A15A ; [.345F.0020.0002.A15A] # YI SYLLABLE NDAP A15B ; [.3460.0020.0002.A15B] # YI SYLLABLE NDOT A15C ; [.3461.0020.0002.A15C] # YI SYLLABLE NDOX A15D ; [.3462.0020.0002.A15D] # YI SYLLABLE NDO A15E ; [.3463.0020.0002.A15E] # YI SYLLABLE NDOP A15F ; [.3464.0020.0002.A15F] # YI SYLLABLE NDEX A160 ; [.3465.0020.0002.A160] # YI SYLLABLE NDE A161 ; [.3466.0020.0002.A161] # YI SYLLABLE NDEP A162 ; [.3467.0020.0002.A162] # YI SYLLABLE NDUT A163 ; [.3468.0020.0002.A163] # YI SYLLABLE NDUX A164 ; [.3469.0020.0002.A164] # YI SYLLABLE NDU A165 ; [.346A.0020.0002.A165] # YI SYLLABLE NDUP A166 ; [.346B.0020.0002.A166] # YI SYLLABLE NDURX A167 ; [.346C.0020.0002.A167] # YI SYLLABLE NDUR A168 ; [.346D.0020.0002.A168] # YI SYLLABLE HNIT A169 ; [.346E.0020.0002.A169] # YI SYLLABLE HNIX A16A ; [.346F.0020.0002.A16A] # YI SYLLABLE HNI A16B ; [.3470.0020.0002.A16B] # YI SYLLABLE HNIP A16C ; [.3471.0020.0002.A16C] # YI SYLLABLE HNIET A16D ; [.3472.0020.0002.A16D] # YI SYLLABLE HNIEX A16E ; [.3473.0020.0002.A16E] # YI SYLLABLE HNIE A16F ; [.3474.0020.0002.A16F] # YI SYLLABLE HNIEP A170 ; [.3475.0020.0002.A170] # YI SYLLABLE HNAT A171 ; [.3476.0020.0002.A171] # YI SYLLABLE HNAX A172 ; [.3477.0020.0002.A172] # YI SYLLABLE HNA A173 ; [.3478.0020.0002.A173] # YI SYLLABLE HNAP A174 ; [.3479.0020.0002.A174] # YI SYLLABLE HNUOX A175 ; [.347A.0020.0002.A175] # YI SYLLABLE HNUO A176 ; [.347B.0020.0002.A176] # YI SYLLABLE HNOT A177 ; [.347C.0020.0002.A177] # YI SYLLABLE HNOX A178 ; [.347D.0020.0002.A178] # YI SYLLABLE HNOP A179 ; [.347E.0020.0002.A179] # YI SYLLABLE HNEX A17A ; [.347F.0020.0002.A17A] # YI SYLLABLE HNE A17B ; [.3480.0020.0002.A17B] # YI SYLLABLE HNEP A17C ; [.3481.0020.0002.A17C] # YI SYLLABLE HNUT A17D ; [.3482.0020.0002.A17D] # YI SYLLABLE NIT A17E ; [.3483.0020.0002.A17E] # YI SYLLABLE NIX A17F ; [.3484.0020.0002.A17F] # YI SYLLABLE NI A180 ; [.3485.0020.0002.A180] # YI SYLLABLE NIP A181 ; [.3486.0020.0002.A181] # YI SYLLABLE NIEX A182 ; [.3487.0020.0002.A182] # YI SYLLABLE NIE A183 ; [.3488.0020.0002.A183] # YI SYLLABLE NIEP A184 ; [.3489.0020.0002.A184] # YI SYLLABLE NAX A185 ; [.348A.0020.0002.A185] # YI SYLLABLE NA A186 ; [.348B.0020.0002.A186] # YI SYLLABLE NAP A187 ; [.348C.0020.0002.A187] # YI SYLLABLE NUOX A188 ; [.348D.0020.0002.A188] # YI SYLLABLE NUO A189 ; [.348E.0020.0002.A189] # YI SYLLABLE NUOP A18A ; [.348F.0020.0002.A18A] # YI SYLLABLE NOT A18B ; [.3490.0020.0002.A18B] # YI SYLLABLE NOX A18C ; [.3491.0020.0002.A18C] # YI SYLLABLE NO A18D ; [.3492.0020.0002.A18D] # YI SYLLABLE NOP A18E ; [.3493.0020.0002.A18E] # YI SYLLABLE NEX A18F ; [.3494.0020.0002.A18F] # YI SYLLABLE NE A190 ; [.3495.0020.0002.A190] # YI SYLLABLE NEP A191 ; [.3496.0020.0002.A191] # YI SYLLABLE NUT A192 ; [.3497.0020.0002.A192] # YI SYLLABLE NUX A193 ; [.3498.0020.0002.A193] # YI SYLLABLE NU A194 ; [.3499.0020.0002.A194] # YI SYLLABLE NUP A195 ; [.349A.0020.0002.A195] # YI SYLLABLE NURX A196 ; [.349B.0020.0002.A196] # YI SYLLABLE NUR A197 ; [.349C.0020.0002.A197] # YI SYLLABLE HLIT A198 ; [.349D.0020.0002.A198] # YI SYLLABLE HLIX A199 ; [.349E.0020.0002.A199] # YI SYLLABLE HLI A19A ; [.349F.0020.0002.A19A] # YI SYLLABLE HLIP A19B ; [.34A0.0020.0002.A19B] # YI SYLLABLE HLIEX A19C ; [.34A1.0020.0002.A19C] # YI SYLLABLE HLIE A19D ; [.34A2.0020.0002.A19D] # YI SYLLABLE HLIEP A19E ; [.34A3.0020.0002.A19E] # YI SYLLABLE HLAT A19F ; [.34A4.0020.0002.A19F] # YI SYLLABLE HLAX A1A0 ; [.34A5.0020.0002.A1A0] # YI SYLLABLE HLA A1A1 ; [.34A6.0020.0002.A1A1] # YI SYLLABLE HLAP A1A2 ; [.34A7.0020.0002.A1A2] # YI SYLLABLE HLUOX A1A3 ; [.34A8.0020.0002.A1A3] # YI SYLLABLE HLUO A1A4 ; [.34A9.0020.0002.A1A4] # YI SYLLABLE HLUOP A1A5 ; [.34AA.0020.0002.A1A5] # YI SYLLABLE HLOX A1A6 ; [.34AB.0020.0002.A1A6] # YI SYLLABLE HLO A1A7 ; [.34AC.0020.0002.A1A7] # YI SYLLABLE HLOP A1A8 ; [.34AD.0020.0002.A1A8] # YI SYLLABLE HLEX A1A9 ; [.34AE.0020.0002.A1A9] # YI SYLLABLE HLE A1AA ; [.34AF.0020.0002.A1AA] # YI SYLLABLE HLEP A1AB ; [.34B0.0020.0002.A1AB] # YI SYLLABLE HLUT A1AC ; [.34B1.0020.0002.A1AC] # YI SYLLABLE HLUX A1AD ; [.34B2.0020.0002.A1AD] # YI SYLLABLE HLU A1AE ; [.34B3.0020.0002.A1AE] # YI SYLLABLE HLUP A1AF ; [.34B4.0020.0002.A1AF] # YI SYLLABLE HLURX A1B0 ; [.34B5.0020.0002.A1B0] # YI SYLLABLE HLUR A1B1 ; [.34B6.0020.0002.A1B1] # YI SYLLABLE HLYT A1B2 ; [.34B7.0020.0002.A1B2] # YI SYLLABLE HLYX A1B3 ; [.34B8.0020.0002.A1B3] # YI SYLLABLE HLY A1B4 ; [.34B9.0020.0002.A1B4] # YI SYLLABLE HLYP A1B5 ; [.34BA.0020.0002.A1B5] # YI SYLLABLE HLYRX A1B6 ; [.34BB.0020.0002.A1B6] # YI SYLLABLE HLYR A1B7 ; [.34BC.0020.0002.A1B7] # YI SYLLABLE LIT A1B8 ; [.34BD.0020.0002.A1B8] # YI SYLLABLE LIX A1B9 ; [.34BE.0020.0002.A1B9] # YI SYLLABLE LI A1BA ; [.34BF.0020.0002.A1BA] # YI SYLLABLE LIP A1BB ; [.34C0.0020.0002.A1BB] # YI SYLLABLE LIET A1BC ; [.34C1.0020.0002.A1BC] # YI SYLLABLE LIEX A1BD ; [.34C2.0020.0002.A1BD] # YI SYLLABLE LIE A1BE ; [.34C3.0020.0002.A1BE] # YI SYLLABLE LIEP A1BF ; [.34C4.0020.0002.A1BF] # YI SYLLABLE LAT A1C0 ; [.34C5.0020.0002.A1C0] # YI SYLLABLE LAX A1C1 ; [.34C6.0020.0002.A1C1] # YI SYLLABLE LA A1C2 ; [.34C7.0020.0002.A1C2] # YI SYLLABLE LAP A1C3 ; [.34C8.0020.0002.A1C3] # YI SYLLABLE LUOT A1C4 ; [.34C9.0020.0002.A1C4] # YI SYLLABLE LUOX A1C5 ; [.34CA.0020.0002.A1C5] # YI SYLLABLE LUO A1C6 ; [.34CB.0020.0002.A1C6] # YI SYLLABLE LUOP A1C7 ; [.34CC.0020.0002.A1C7] # YI SYLLABLE LOT A1C8 ; [.34CD.0020.0002.A1C8] # YI SYLLABLE LOX A1C9 ; [.34CE.0020.0002.A1C9] # YI SYLLABLE LO A1CA ; [.34CF.0020.0002.A1CA] # YI SYLLABLE LOP A1CB ; [.34D0.0020.0002.A1CB] # YI SYLLABLE LEX A1CC ; [.34D1.0020.0002.A1CC] # YI SYLLABLE LE A1CD ; [.34D2.0020.0002.A1CD] # YI SYLLABLE LEP A1CE ; [.34D3.0020.0002.A1CE] # YI SYLLABLE LUT A1CF ; [.34D4.0020.0002.A1CF] # YI SYLLABLE LUX A1D0 ; [.34D5.0020.0002.A1D0] # YI SYLLABLE LU A1D1 ; [.34D6.0020.0002.A1D1] # YI SYLLABLE LUP A1D2 ; [.34D7.0020.0002.A1D2] # YI SYLLABLE LURX A1D3 ; [.34D8.0020.0002.A1D3] # YI SYLLABLE LUR A1D4 ; [.34D9.0020.0002.A1D4] # YI SYLLABLE LYT A1D5 ; [.34DA.0020.0002.A1D5] # YI SYLLABLE LYX A1D6 ; [.34DB.0020.0002.A1D6] # YI SYLLABLE LY A1D7 ; [.34DC.0020.0002.A1D7] # YI SYLLABLE LYP A1D8 ; [.34DD.0020.0002.A1D8] # YI SYLLABLE LYRX A1D9 ; [.34DE.0020.0002.A1D9] # YI SYLLABLE LYR A1DA ; [.34DF.0020.0002.A1DA] # YI SYLLABLE GIT A1DB ; [.34E0.0020.0002.A1DB] # YI SYLLABLE GIX A1DC ; [.34E1.0020.0002.A1DC] # YI SYLLABLE GI A1DD ; [.34E2.0020.0002.A1DD] # YI SYLLABLE GIP A1DE ; [.34E3.0020.0002.A1DE] # YI SYLLABLE GIET A1DF ; [.34E4.0020.0002.A1DF] # YI SYLLABLE GIEX A1E0 ; [.34E5.0020.0002.A1E0] # YI SYLLABLE GIE A1E1 ; [.34E6.0020.0002.A1E1] # YI SYLLABLE GIEP A1E2 ; [.34E7.0020.0002.A1E2] # YI SYLLABLE GAT A1E3 ; [.34E8.0020.0002.A1E3] # YI SYLLABLE GAX A1E4 ; [.34E9.0020.0002.A1E4] # YI SYLLABLE GA A1E5 ; [.34EA.0020.0002.A1E5] # YI SYLLABLE GAP A1E6 ; [.34EB.0020.0002.A1E6] # YI SYLLABLE GUOT A1E7 ; [.34EC.0020.0002.A1E7] # YI SYLLABLE GUOX A1E8 ; [.34ED.0020.0002.A1E8] # YI SYLLABLE GUO A1E9 ; [.34EE.0020.0002.A1E9] # YI SYLLABLE GUOP A1EA ; [.34EF.0020.0002.A1EA] # YI SYLLABLE GOT A1EB ; [.34F0.0020.0002.A1EB] # YI SYLLABLE GOX A1EC ; [.34F1.0020.0002.A1EC] # YI SYLLABLE GO A1ED ; [.34F2.0020.0002.A1ED] # YI SYLLABLE GOP A1EE ; [.34F3.0020.0002.A1EE] # YI SYLLABLE GET A1EF ; [.34F4.0020.0002.A1EF] # YI SYLLABLE GEX A1F0 ; [.34F5.0020.0002.A1F0] # YI SYLLABLE GE A1F1 ; [.34F6.0020.0002.A1F1] # YI SYLLABLE GEP A1F2 ; [.34F7.0020.0002.A1F2] # YI SYLLABLE GUT A1F3 ; [.34F8.0020.0002.A1F3] # YI SYLLABLE GUX A1F4 ; [.34F9.0020.0002.A1F4] # YI SYLLABLE GU A1F5 ; [.34FA.0020.0002.A1F5] # YI SYLLABLE GUP A1F6 ; [.34FB.0020.0002.A1F6] # YI SYLLABLE GURX A1F7 ; [.34FC.0020.0002.A1F7] # YI SYLLABLE GUR A1F8 ; [.34FD.0020.0002.A1F8] # YI SYLLABLE KIT A1F9 ; [.34FE.0020.0002.A1F9] # YI SYLLABLE KIX A1FA ; [.34FF.0020.0002.A1FA] # YI SYLLABLE KI A1FB ; [.3500.0020.0002.A1FB] # YI SYLLABLE KIP A1FC ; [.3501.0020.0002.A1FC] # YI SYLLABLE KIEX A1FD ; [.3502.0020.0002.A1FD] # YI SYLLABLE KIE A1FE ; [.3503.0020.0002.A1FE] # YI SYLLABLE KIEP A1FF ; [.3504.0020.0002.A1FF] # YI SYLLABLE KAT A200 ; [.3505.0020.0002.A200] # YI SYLLABLE KAX A201 ; [.3506.0020.0002.A201] # YI SYLLABLE KA A202 ; [.3507.0020.0002.A202] # YI SYLLABLE KAP A203 ; [.3508.0020.0002.A203] # YI SYLLABLE KUOX A204 ; [.3509.0020.0002.A204] # YI SYLLABLE KUO A205 ; [.350A.0020.0002.A205] # YI SYLLABLE KUOP A206 ; [.350B.0020.0002.A206] # YI SYLLABLE KOT A207 ; [.350C.0020.0002.A207] # YI SYLLABLE KOX A208 ; [.350D.0020.0002.A208] # YI SYLLABLE KO A209 ; [.350E.0020.0002.A209] # YI SYLLABLE KOP A20A ; [.350F.0020.0002.A20A] # YI SYLLABLE KET A20B ; [.3510.0020.0002.A20B] # YI SYLLABLE KEX A20C ; [.3511.0020.0002.A20C] # YI SYLLABLE KE A20D ; [.3512.0020.0002.A20D] # YI SYLLABLE KEP A20E ; [.3513.0020.0002.A20E] # YI SYLLABLE KUT A20F ; [.3514.0020.0002.A20F] # YI SYLLABLE KUX A210 ; [.3515.0020.0002.A210] # YI SYLLABLE KU A211 ; [.3516.0020.0002.A211] # YI SYLLABLE KUP A212 ; [.3517.0020.0002.A212] # YI SYLLABLE KURX A213 ; [.3518.0020.0002.A213] # YI SYLLABLE KUR A214 ; [.3519.0020.0002.A214] # YI SYLLABLE GGIT A215 ; [.351A.0020.0002.A215] # YI SYLLABLE GGIX A216 ; [.351B.0020.0002.A216] # YI SYLLABLE GGI A217 ; [.351C.0020.0002.A217] # YI SYLLABLE GGIEX A218 ; [.351D.0020.0002.A218] # YI SYLLABLE GGIE A219 ; [.351E.0020.0002.A219] # YI SYLLABLE GGIEP A21A ; [.351F.0020.0002.A21A] # YI SYLLABLE GGAT A21B ; [.3520.0020.0002.A21B] # YI SYLLABLE GGAX A21C ; [.3521.0020.0002.A21C] # YI SYLLABLE GGA A21D ; [.3522.0020.0002.A21D] # YI SYLLABLE GGAP A21E ; [.3523.0020.0002.A21E] # YI SYLLABLE GGUOT A21F ; [.3524.0020.0002.A21F] # YI SYLLABLE GGUOX A220 ; [.3525.0020.0002.A220] # YI SYLLABLE GGUO A221 ; [.3526.0020.0002.A221] # YI SYLLABLE GGUOP A222 ; [.3527.0020.0002.A222] # YI SYLLABLE GGOT A223 ; [.3528.0020.0002.A223] # YI SYLLABLE GGOX A224 ; [.3529.0020.0002.A224] # YI SYLLABLE GGO A225 ; [.352A.0020.0002.A225] # YI SYLLABLE GGOP A226 ; [.352B.0020.0002.A226] # YI SYLLABLE GGET A227 ; [.352C.0020.0002.A227] # YI SYLLABLE GGEX A228 ; [.352D.0020.0002.A228] # YI SYLLABLE GGE A229 ; [.352E.0020.0002.A229] # YI SYLLABLE GGEP A22A ; [.352F.0020.0002.A22A] # YI SYLLABLE GGUT A22B ; [.3530.0020.0002.A22B] # YI SYLLABLE GGUX A22C ; [.3531.0020.0002.A22C] # YI SYLLABLE GGU A22D ; [.3532.0020.0002.A22D] # YI SYLLABLE GGUP A22E ; [.3533.0020.0002.A22E] # YI SYLLABLE GGURX A22F ; [.3534.0020.0002.A22F] # YI SYLLABLE GGUR A230 ; [.3535.0020.0002.A230] # YI SYLLABLE MGIEX A231 ; [.3536.0020.0002.A231] # YI SYLLABLE MGIE A232 ; [.3537.0020.0002.A232] # YI SYLLABLE MGAT A233 ; [.3538.0020.0002.A233] # YI SYLLABLE MGAX A234 ; [.3539.0020.0002.A234] # YI SYLLABLE MGA A235 ; [.353A.0020.0002.A235] # YI SYLLABLE MGAP A236 ; [.353B.0020.0002.A236] # YI SYLLABLE MGUOX A237 ; [.353C.0020.0002.A237] # YI SYLLABLE MGUO A238 ; [.353D.0020.0002.A238] # YI SYLLABLE MGUOP A239 ; [.353E.0020.0002.A239] # YI SYLLABLE MGOT A23A ; [.353F.0020.0002.A23A] # YI SYLLABLE MGOX A23B ; [.3540.0020.0002.A23B] # YI SYLLABLE MGO A23C ; [.3541.0020.0002.A23C] # YI SYLLABLE MGOP A23D ; [.3542.0020.0002.A23D] # YI SYLLABLE MGEX A23E ; [.3543.0020.0002.A23E] # YI SYLLABLE MGE A23F ; [.3544.0020.0002.A23F] # YI SYLLABLE MGEP A240 ; [.3545.0020.0002.A240] # YI SYLLABLE MGUT A241 ; [.3546.0020.0002.A241] # YI SYLLABLE MGUX A242 ; [.3547.0020.0002.A242] # YI SYLLABLE MGU A243 ; [.3548.0020.0002.A243] # YI SYLLABLE MGUP A244 ; [.3549.0020.0002.A244] # YI SYLLABLE MGURX A245 ; [.354A.0020.0002.A245] # YI SYLLABLE MGUR A246 ; [.354B.0020.0002.A246] # YI SYLLABLE HXIT A247 ; [.354C.0020.0002.A247] # YI SYLLABLE HXIX A248 ; [.354D.0020.0002.A248] # YI SYLLABLE HXI A249 ; [.354E.0020.0002.A249] # YI SYLLABLE HXIP A24A ; [.354F.0020.0002.A24A] # YI SYLLABLE HXIET A24B ; [.3550.0020.0002.A24B] # YI SYLLABLE HXIEX A24C ; [.3551.0020.0002.A24C] # YI SYLLABLE HXIE A24D ; [.3552.0020.0002.A24D] # YI SYLLABLE HXIEP A24E ; [.3553.0020.0002.A24E] # YI SYLLABLE HXAT A24F ; [.3554.0020.0002.A24F] # YI SYLLABLE HXAX A250 ; [.3555.0020.0002.A250] # YI SYLLABLE HXA A251 ; [.3556.0020.0002.A251] # YI SYLLABLE HXAP A252 ; [.3557.0020.0002.A252] # YI SYLLABLE HXUOT A253 ; [.3558.0020.0002.A253] # YI SYLLABLE HXUOX A254 ; [.3559.0020.0002.A254] # YI SYLLABLE HXUO A255 ; [.355A.0020.0002.A255] # YI SYLLABLE HXUOP A256 ; [.355B.0020.0002.A256] # YI SYLLABLE HXOT A257 ; [.355C.0020.0002.A257] # YI SYLLABLE HXOX A258 ; [.355D.0020.0002.A258] # YI SYLLABLE HXO A259 ; [.355E.0020.0002.A259] # YI SYLLABLE HXOP A25A ; [.355F.0020.0002.A25A] # YI SYLLABLE HXEX A25B ; [.3560.0020.0002.A25B] # YI SYLLABLE HXE A25C ; [.3561.0020.0002.A25C] # YI SYLLABLE HXEP A25D ; [.3562.0020.0002.A25D] # YI SYLLABLE NGIEX A25E ; [.3563.0020.0002.A25E] # YI SYLLABLE NGIE A25F ; [.3564.0020.0002.A25F] # YI SYLLABLE NGIEP A260 ; [.3565.0020.0002.A260] # YI SYLLABLE NGAT A261 ; [.3566.0020.0002.A261] # YI SYLLABLE NGAX A262 ; [.3567.0020.0002.A262] # YI SYLLABLE NGA A263 ; [.3568.0020.0002.A263] # YI SYLLABLE NGAP A264 ; [.3569.0020.0002.A264] # YI SYLLABLE NGUOT A265 ; [.356A.0020.0002.A265] # YI SYLLABLE NGUOX A266 ; [.356B.0020.0002.A266] # YI SYLLABLE NGUO A267 ; [.356C.0020.0002.A267] # YI SYLLABLE NGOT A268 ; [.356D.0020.0002.A268] # YI SYLLABLE NGOX A269 ; [.356E.0020.0002.A269] # YI SYLLABLE NGO A26A ; [.356F.0020.0002.A26A] # YI SYLLABLE NGOP A26B ; [.3570.0020.0002.A26B] # YI SYLLABLE NGEX A26C ; [.3571.0020.0002.A26C] # YI SYLLABLE NGE A26D ; [.3572.0020.0002.A26D] # YI SYLLABLE NGEP A26E ; [.3573.0020.0002.A26E] # YI SYLLABLE HIT A26F ; [.3574.0020.0002.A26F] # YI SYLLABLE HIEX A270 ; [.3575.0020.0002.A270] # YI SYLLABLE HIE A271 ; [.3576.0020.0002.A271] # YI SYLLABLE HAT A272 ; [.3577.0020.0002.A272] # YI SYLLABLE HAX A273 ; [.3578.0020.0002.A273] # YI SYLLABLE HA A274 ; [.3579.0020.0002.A274] # YI SYLLABLE HAP A275 ; [.357A.0020.0002.A275] # YI SYLLABLE HUOT A276 ; [.357B.0020.0002.A276] # YI SYLLABLE HUOX A277 ; [.357C.0020.0002.A277] # YI SYLLABLE HUO A278 ; [.357D.0020.0002.A278] # YI SYLLABLE HUOP A279 ; [.357E.0020.0002.A279] # YI SYLLABLE HOT A27A ; [.357F.0020.0002.A27A] # YI SYLLABLE HOX A27B ; [.3580.0020.0002.A27B] # YI SYLLABLE HO A27C ; [.3581.0020.0002.A27C] # YI SYLLABLE HOP A27D ; [.3582.0020.0002.A27D] # YI SYLLABLE HEX A27E ; [.3583.0020.0002.A27E] # YI SYLLABLE HE A27F ; [.3584.0020.0002.A27F] # YI SYLLABLE HEP A280 ; [.3585.0020.0002.A280] # YI SYLLABLE WAT A281 ; [.3586.0020.0002.A281] # YI SYLLABLE WAX A282 ; [.3587.0020.0002.A282] # YI SYLLABLE WA A283 ; [.3588.0020.0002.A283] # YI SYLLABLE WAP A284 ; [.3589.0020.0002.A284] # YI SYLLABLE WUOX A285 ; [.358A.0020.0002.A285] # YI SYLLABLE WUO A286 ; [.358B.0020.0002.A286] # YI SYLLABLE WUOP A287 ; [.358C.0020.0002.A287] # YI SYLLABLE WOX A288 ; [.358D.0020.0002.A288] # YI SYLLABLE WO A289 ; [.358E.0020.0002.A289] # YI SYLLABLE WOP A28A ; [.358F.0020.0002.A28A] # YI SYLLABLE WEX A28B ; [.3590.0020.0002.A28B] # YI SYLLABLE WE A28C ; [.3591.0020.0002.A28C] # YI SYLLABLE WEP A28D ; [.3592.0020.0002.A28D] # YI SYLLABLE ZIT A28E ; [.3593.0020.0002.A28E] # YI SYLLABLE ZIX A28F ; [.3594.0020.0002.A28F] # YI SYLLABLE ZI A290 ; [.3595.0020.0002.A290] # YI SYLLABLE ZIP A291 ; [.3596.0020.0002.A291] # YI SYLLABLE ZIEX A292 ; [.3597.0020.0002.A292] # YI SYLLABLE ZIE A293 ; [.3598.0020.0002.A293] # YI SYLLABLE ZIEP A294 ; [.3599.0020.0002.A294] # YI SYLLABLE ZAT A295 ; [.359A.0020.0002.A295] # YI SYLLABLE ZAX A296 ; [.359B.0020.0002.A296] # YI SYLLABLE ZA A297 ; [.359C.0020.0002.A297] # YI SYLLABLE ZAP A298 ; [.359D.0020.0002.A298] # YI SYLLABLE ZUOX A299 ; [.359E.0020.0002.A299] # YI SYLLABLE ZUO A29A ; [.359F.0020.0002.A29A] # YI SYLLABLE ZUOP A29B ; [.35A0.0020.0002.A29B] # YI SYLLABLE ZOT A29C ; [.35A1.0020.0002.A29C] # YI SYLLABLE ZOX A29D ; [.35A2.0020.0002.A29D] # YI SYLLABLE ZO A29E ; [.35A3.0020.0002.A29E] # YI SYLLABLE ZOP A29F ; [.35A4.0020.0002.A29F] # YI SYLLABLE ZEX A2A0 ; [.35A5.0020.0002.A2A0] # YI SYLLABLE ZE A2A1 ; [.35A6.0020.0002.A2A1] # YI SYLLABLE ZEP A2A2 ; [.35A7.0020.0002.A2A2] # YI SYLLABLE ZUT A2A3 ; [.35A8.0020.0002.A2A3] # YI SYLLABLE ZUX A2A4 ; [.35A9.0020.0002.A2A4] # YI SYLLABLE ZU A2A5 ; [.35AA.0020.0002.A2A5] # YI SYLLABLE ZUP A2A6 ; [.35AB.0020.0002.A2A6] # YI SYLLABLE ZURX A2A7 ; [.35AC.0020.0002.A2A7] # YI SYLLABLE ZUR A2A8 ; [.35AD.0020.0002.A2A8] # YI SYLLABLE ZYT A2A9 ; [.35AE.0020.0002.A2A9] # YI SYLLABLE ZYX A2AA ; [.35AF.0020.0002.A2AA] # YI SYLLABLE ZY A2AB ; [.35B0.0020.0002.A2AB] # YI SYLLABLE ZYP A2AC ; [.35B1.0020.0002.A2AC] # YI SYLLABLE ZYRX A2AD ; [.35B2.0020.0002.A2AD] # YI SYLLABLE ZYR A2AE ; [.35B3.0020.0002.A2AE] # YI SYLLABLE CIT A2AF ; [.35B4.0020.0002.A2AF] # YI SYLLABLE CIX A2B0 ; [.35B5.0020.0002.A2B0] # YI SYLLABLE CI A2B1 ; [.35B6.0020.0002.A2B1] # YI SYLLABLE CIP A2B2 ; [.35B7.0020.0002.A2B2] # YI SYLLABLE CIET A2B3 ; [.35B8.0020.0002.A2B3] # YI SYLLABLE CIEX A2B4 ; [.35B9.0020.0002.A2B4] # YI SYLLABLE CIE A2B5 ; [.35BA.0020.0002.A2B5] # YI SYLLABLE CIEP A2B6 ; [.35BB.0020.0002.A2B6] # YI SYLLABLE CAT A2B7 ; [.35BC.0020.0002.A2B7] # YI SYLLABLE CAX A2B8 ; [.35BD.0020.0002.A2B8] # YI SYLLABLE CA A2B9 ; [.35BE.0020.0002.A2B9] # YI SYLLABLE CAP A2BA ; [.35BF.0020.0002.A2BA] # YI SYLLABLE CUOX A2BB ; [.35C0.0020.0002.A2BB] # YI SYLLABLE CUO A2BC ; [.35C1.0020.0002.A2BC] # YI SYLLABLE CUOP A2BD ; [.35C2.0020.0002.A2BD] # YI SYLLABLE COT A2BE ; [.35C3.0020.0002.A2BE] # YI SYLLABLE COX A2BF ; [.35C4.0020.0002.A2BF] # YI SYLLABLE CO A2C0 ; [.35C5.0020.0002.A2C0] # YI SYLLABLE COP A2C1 ; [.35C6.0020.0002.A2C1] # YI SYLLABLE CEX A2C2 ; [.35C7.0020.0002.A2C2] # YI SYLLABLE CE A2C3 ; [.35C8.0020.0002.A2C3] # YI SYLLABLE CEP A2C4 ; [.35C9.0020.0002.A2C4] # YI SYLLABLE CUT A2C5 ; [.35CA.0020.0002.A2C5] # YI SYLLABLE CUX A2C6 ; [.35CB.0020.0002.A2C6] # YI SYLLABLE CU A2C7 ; [.35CC.0020.0002.A2C7] # YI SYLLABLE CUP A2C8 ; [.35CD.0020.0002.A2C8] # YI SYLLABLE CURX A2C9 ; [.35CE.0020.0002.A2C9] # YI SYLLABLE CUR A2CA ; [.35CF.0020.0002.A2CA] # YI SYLLABLE CYT A2CB ; [.35D0.0020.0002.A2CB] # YI SYLLABLE CYX A2CC ; [.35D1.0020.0002.A2CC] # YI SYLLABLE CY A2CD ; [.35D2.0020.0002.A2CD] # YI SYLLABLE CYP A2CE ; [.35D3.0020.0002.A2CE] # YI SYLLABLE CYRX A2CF ; [.35D4.0020.0002.A2CF] # YI SYLLABLE CYR A2D0 ; [.35D5.0020.0002.A2D0] # YI SYLLABLE ZZIT A2D1 ; [.35D6.0020.0002.A2D1] # YI SYLLABLE ZZIX A2D2 ; [.35D7.0020.0002.A2D2] # YI SYLLABLE ZZI A2D3 ; [.35D8.0020.0002.A2D3] # YI SYLLABLE ZZIP A2D4 ; [.35D9.0020.0002.A2D4] # YI SYLLABLE ZZIET A2D5 ; [.35DA.0020.0002.A2D5] # YI SYLLABLE ZZIEX A2D6 ; [.35DB.0020.0002.A2D6] # YI SYLLABLE ZZIE A2D7 ; [.35DC.0020.0002.A2D7] # YI SYLLABLE ZZIEP A2D8 ; [.35DD.0020.0002.A2D8] # YI SYLLABLE ZZAT A2D9 ; [.35DE.0020.0002.A2D9] # YI SYLLABLE ZZAX A2DA ; [.35DF.0020.0002.A2DA] # YI SYLLABLE ZZA A2DB ; [.35E0.0020.0002.A2DB] # YI SYLLABLE ZZAP A2DC ; [.35E1.0020.0002.A2DC] # YI SYLLABLE ZZOX A2DD ; [.35E2.0020.0002.A2DD] # YI SYLLABLE ZZO A2DE ; [.35E3.0020.0002.A2DE] # YI SYLLABLE ZZOP A2DF ; [.35E4.0020.0002.A2DF] # YI SYLLABLE ZZEX A2E0 ; [.35E5.0020.0002.A2E0] # YI SYLLABLE ZZE A2E1 ; [.35E6.0020.0002.A2E1] # YI SYLLABLE ZZEP A2E2 ; [.35E7.0020.0002.A2E2] # YI SYLLABLE ZZUX A2E3 ; [.35E8.0020.0002.A2E3] # YI SYLLABLE ZZU A2E4 ; [.35E9.0020.0002.A2E4] # YI SYLLABLE ZZUP A2E5 ; [.35EA.0020.0002.A2E5] # YI SYLLABLE ZZURX A2E6 ; [.35EB.0020.0002.A2E6] # YI SYLLABLE ZZUR A2E7 ; [.35EC.0020.0002.A2E7] # YI SYLLABLE ZZYT A2E8 ; [.35ED.0020.0002.A2E8] # YI SYLLABLE ZZYX A2E9 ; [.35EE.0020.0002.A2E9] # YI SYLLABLE ZZY A2EA ; [.35EF.0020.0002.A2EA] # YI SYLLABLE ZZYP A2EB ; [.35F0.0020.0002.A2EB] # YI SYLLABLE ZZYRX A2EC ; [.35F1.0020.0002.A2EC] # YI SYLLABLE ZZYR A2ED ; [.35F2.0020.0002.A2ED] # YI SYLLABLE NZIT A2EE ; [.35F3.0020.0002.A2EE] # YI SYLLABLE NZIX A2EF ; [.35F4.0020.0002.A2EF] # YI SYLLABLE NZI A2F0 ; [.35F5.0020.0002.A2F0] # YI SYLLABLE NZIP A2F1 ; [.35F6.0020.0002.A2F1] # YI SYLLABLE NZIEX A2F2 ; [.35F7.0020.0002.A2F2] # YI SYLLABLE NZIE A2F3 ; [.35F8.0020.0002.A2F3] # YI SYLLABLE NZIEP A2F4 ; [.35F9.0020.0002.A2F4] # YI SYLLABLE NZAT A2F5 ; [.35FA.0020.0002.A2F5] # YI SYLLABLE NZAX A2F6 ; [.35FB.0020.0002.A2F6] # YI SYLLABLE NZA A2F7 ; [.35FC.0020.0002.A2F7] # YI SYLLABLE NZAP A2F8 ; [.35FD.0020.0002.A2F8] # YI SYLLABLE NZUOX A2F9 ; [.35FE.0020.0002.A2F9] # YI SYLLABLE NZUO A2FA ; [.35FF.0020.0002.A2FA] # YI SYLLABLE NZOX A2FB ; [.3600.0020.0002.A2FB] # YI SYLLABLE NZOP A2FC ; [.3601.0020.0002.A2FC] # YI SYLLABLE NZEX A2FD ; [.3602.0020.0002.A2FD] # YI SYLLABLE NZE A2FE ; [.3603.0020.0002.A2FE] # YI SYLLABLE NZUX A2FF ; [.3604.0020.0002.A2FF] # YI SYLLABLE NZU A300 ; [.3605.0020.0002.A300] # YI SYLLABLE NZUP A301 ; [.3606.0020.0002.A301] # YI SYLLABLE NZURX A302 ; [.3607.0020.0002.A302] # YI SYLLABLE NZUR A303 ; [.3608.0020.0002.A303] # YI SYLLABLE NZYT A304 ; [.3609.0020.0002.A304] # YI SYLLABLE NZYX A305 ; [.360A.0020.0002.A305] # YI SYLLABLE NZY A306 ; [.360B.0020.0002.A306] # YI SYLLABLE NZYP A307 ; [.360C.0020.0002.A307] # YI SYLLABLE NZYRX A308 ; [.360D.0020.0002.A308] # YI SYLLABLE NZYR A309 ; [.360E.0020.0002.A309] # YI SYLLABLE SIT A30A ; [.360F.0020.0002.A30A] # YI SYLLABLE SIX A30B ; [.3610.0020.0002.A30B] # YI SYLLABLE SI A30C ; [.3611.0020.0002.A30C] # YI SYLLABLE SIP A30D ; [.3612.0020.0002.A30D] # YI SYLLABLE SIEX A30E ; [.3613.0020.0002.A30E] # YI SYLLABLE SIE A30F ; [.3614.0020.0002.A30F] # YI SYLLABLE SIEP A310 ; [.3615.0020.0002.A310] # YI SYLLABLE SAT A311 ; [.3616.0020.0002.A311] # YI SYLLABLE SAX A312 ; [.3617.0020.0002.A312] # YI SYLLABLE SA A313 ; [.3618.0020.0002.A313] # YI SYLLABLE SAP A314 ; [.3619.0020.0002.A314] # YI SYLLABLE SUOX A315 ; [.361A.0020.0002.A315] # YI SYLLABLE SUO A316 ; [.361B.0020.0002.A316] # YI SYLLABLE SUOP A317 ; [.361C.0020.0002.A317] # YI SYLLABLE SOT A318 ; [.361D.0020.0002.A318] # YI SYLLABLE SOX A319 ; [.361E.0020.0002.A319] # YI SYLLABLE SO A31A ; [.361F.0020.0002.A31A] # YI SYLLABLE SOP A31B ; [.3620.0020.0002.A31B] # YI SYLLABLE SEX A31C ; [.3621.0020.0002.A31C] # YI SYLLABLE SE A31D ; [.3622.0020.0002.A31D] # YI SYLLABLE SEP A31E ; [.3623.0020.0002.A31E] # YI SYLLABLE SUT A31F ; [.3624.0020.0002.A31F] # YI SYLLABLE SUX A320 ; [.3625.0020.0002.A320] # YI SYLLABLE SU A321 ; [.3626.0020.0002.A321] # YI SYLLABLE SUP A322 ; [.3627.0020.0002.A322] # YI SYLLABLE SURX A323 ; [.3628.0020.0002.A323] # YI SYLLABLE SUR A324 ; [.3629.0020.0002.A324] # YI SYLLABLE SYT A325 ; [.362A.0020.0002.A325] # YI SYLLABLE SYX A326 ; [.362B.0020.0002.A326] # YI SYLLABLE SY A327 ; [.362C.0020.0002.A327] # YI SYLLABLE SYP A328 ; [.362D.0020.0002.A328] # YI SYLLABLE SYRX A329 ; [.362E.0020.0002.A329] # YI SYLLABLE SYR A32A ; [.362F.0020.0002.A32A] # YI SYLLABLE SSIT A32B ; [.3630.0020.0002.A32B] # YI SYLLABLE SSIX A32C ; [.3631.0020.0002.A32C] # YI SYLLABLE SSI A32D ; [.3632.0020.0002.A32D] # YI SYLLABLE SSIP A32E ; [.3633.0020.0002.A32E] # YI SYLLABLE SSIEX A32F ; [.3634.0020.0002.A32F] # YI SYLLABLE SSIE A330 ; [.3635.0020.0002.A330] # YI SYLLABLE SSIEP A331 ; [.3636.0020.0002.A331] # YI SYLLABLE SSAT A332 ; [.3637.0020.0002.A332] # YI SYLLABLE SSAX A333 ; [.3638.0020.0002.A333] # YI SYLLABLE SSA A334 ; [.3639.0020.0002.A334] # YI SYLLABLE SSAP A335 ; [.363A.0020.0002.A335] # YI SYLLABLE SSOT A336 ; [.363B.0020.0002.A336] # YI SYLLABLE SSOX A337 ; [.363C.0020.0002.A337] # YI SYLLABLE SSO A338 ; [.363D.0020.0002.A338] # YI SYLLABLE SSOP A339 ; [.363E.0020.0002.A339] # YI SYLLABLE SSEX A33A ; [.363F.0020.0002.A33A] # YI SYLLABLE SSE A33B ; [.3640.0020.0002.A33B] # YI SYLLABLE SSEP A33C ; [.3641.0020.0002.A33C] # YI SYLLABLE SSUT A33D ; [.3642.0020.0002.A33D] # YI SYLLABLE SSUX A33E ; [.3643.0020.0002.A33E] # YI SYLLABLE SSU A33F ; [.3644.0020.0002.A33F] # YI SYLLABLE SSUP A340 ; [.3645.0020.0002.A340] # YI SYLLABLE SSYT A341 ; [.3646.0020.0002.A341] # YI SYLLABLE SSYX A342 ; [.3647.0020.0002.A342] # YI SYLLABLE SSY A343 ; [.3648.0020.0002.A343] # YI SYLLABLE SSYP A344 ; [.3649.0020.0002.A344] # YI SYLLABLE SSYRX A345 ; [.364A.0020.0002.A345] # YI SYLLABLE SSYR A346 ; [.364B.0020.0002.A346] # YI SYLLABLE ZHAT A347 ; [.364C.0020.0002.A347] # YI SYLLABLE ZHAX A348 ; [.364D.0020.0002.A348] # YI SYLLABLE ZHA A349 ; [.364E.0020.0002.A349] # YI SYLLABLE ZHAP A34A ; [.364F.0020.0002.A34A] # YI SYLLABLE ZHUOX A34B ; [.3650.0020.0002.A34B] # YI SYLLABLE ZHUO A34C ; [.3651.0020.0002.A34C] # YI SYLLABLE ZHUOP A34D ; [.3652.0020.0002.A34D] # YI SYLLABLE ZHOT A34E ; [.3653.0020.0002.A34E] # YI SYLLABLE ZHOX A34F ; [.3654.0020.0002.A34F] # YI SYLLABLE ZHO A350 ; [.3655.0020.0002.A350] # YI SYLLABLE ZHOP A351 ; [.3656.0020.0002.A351] # YI SYLLABLE ZHET A352 ; [.3657.0020.0002.A352] # YI SYLLABLE ZHEX A353 ; [.3658.0020.0002.A353] # YI SYLLABLE ZHE A354 ; [.3659.0020.0002.A354] # YI SYLLABLE ZHEP A355 ; [.365A.0020.0002.A355] # YI SYLLABLE ZHUT A356 ; [.365B.0020.0002.A356] # YI SYLLABLE ZHUX A357 ; [.365C.0020.0002.A357] # YI SYLLABLE ZHU A358 ; [.365D.0020.0002.A358] # YI SYLLABLE ZHUP A359 ; [.365E.0020.0002.A359] # YI SYLLABLE ZHURX A35A ; [.365F.0020.0002.A35A] # YI SYLLABLE ZHUR A35B ; [.3660.0020.0002.A35B] # YI SYLLABLE ZHYT A35C ; [.3661.0020.0002.A35C] # YI SYLLABLE ZHYX A35D ; [.3662.0020.0002.A35D] # YI SYLLABLE ZHY A35E ; [.3663.0020.0002.A35E] # YI SYLLABLE ZHYP A35F ; [.3664.0020.0002.A35F] # YI SYLLABLE ZHYRX A360 ; [.3665.0020.0002.A360] # YI SYLLABLE ZHYR A361 ; [.3666.0020.0002.A361] # YI SYLLABLE CHAT A362 ; [.3667.0020.0002.A362] # YI SYLLABLE CHAX A363 ; [.3668.0020.0002.A363] # YI SYLLABLE CHA A364 ; [.3669.0020.0002.A364] # YI SYLLABLE CHAP A365 ; [.366A.0020.0002.A365] # YI SYLLABLE CHUOT A366 ; [.366B.0020.0002.A366] # YI SYLLABLE CHUOX A367 ; [.366C.0020.0002.A367] # YI SYLLABLE CHUO A368 ; [.366D.0020.0002.A368] # YI SYLLABLE CHUOP A369 ; [.366E.0020.0002.A369] # YI SYLLABLE CHOT A36A ; [.366F.0020.0002.A36A] # YI SYLLABLE CHOX A36B ; [.3670.0020.0002.A36B] # YI SYLLABLE CHO A36C ; [.3671.0020.0002.A36C] # YI SYLLABLE CHOP A36D ; [.3672.0020.0002.A36D] # YI SYLLABLE CHET A36E ; [.3673.0020.0002.A36E] # YI SYLLABLE CHEX A36F ; [.3674.0020.0002.A36F] # YI SYLLABLE CHE A370 ; [.3675.0020.0002.A370] # YI SYLLABLE CHEP A371 ; [.3676.0020.0002.A371] # YI SYLLABLE CHUX A372 ; [.3677.0020.0002.A372] # YI SYLLABLE CHU A373 ; [.3678.0020.0002.A373] # YI SYLLABLE CHUP A374 ; [.3679.0020.0002.A374] # YI SYLLABLE CHURX A375 ; [.367A.0020.0002.A375] # YI SYLLABLE CHUR A376 ; [.367B.0020.0002.A376] # YI SYLLABLE CHYT A377 ; [.367C.0020.0002.A377] # YI SYLLABLE CHYX A378 ; [.367D.0020.0002.A378] # YI SYLLABLE CHY A379 ; [.367E.0020.0002.A379] # YI SYLLABLE CHYP A37A ; [.367F.0020.0002.A37A] # YI SYLLABLE CHYRX A37B ; [.3680.0020.0002.A37B] # YI SYLLABLE CHYR A37C ; [.3681.0020.0002.A37C] # YI SYLLABLE RRAX A37D ; [.3682.0020.0002.A37D] # YI SYLLABLE RRA A37E ; [.3683.0020.0002.A37E] # YI SYLLABLE RRUOX A37F ; [.3684.0020.0002.A37F] # YI SYLLABLE RRUO A380 ; [.3685.0020.0002.A380] # YI SYLLABLE RROT A381 ; [.3686.0020.0002.A381] # YI SYLLABLE RROX A382 ; [.3687.0020.0002.A382] # YI SYLLABLE RRO A383 ; [.3688.0020.0002.A383] # YI SYLLABLE RROP A384 ; [.3689.0020.0002.A384] # YI SYLLABLE RRET A385 ; [.368A.0020.0002.A385] # YI SYLLABLE RREX A386 ; [.368B.0020.0002.A386] # YI SYLLABLE RRE A387 ; [.368C.0020.0002.A387] # YI SYLLABLE RREP A388 ; [.368D.0020.0002.A388] # YI SYLLABLE RRUT A389 ; [.368E.0020.0002.A389] # YI SYLLABLE RRUX A38A ; [.368F.0020.0002.A38A] # YI SYLLABLE RRU A38B ; [.3690.0020.0002.A38B] # YI SYLLABLE RRUP A38C ; [.3691.0020.0002.A38C] # YI SYLLABLE RRURX A38D ; [.3692.0020.0002.A38D] # YI SYLLABLE RRUR A38E ; [.3693.0020.0002.A38E] # YI SYLLABLE RRYT A38F ; [.3694.0020.0002.A38F] # YI SYLLABLE RRYX A390 ; [.3695.0020.0002.A390] # YI SYLLABLE RRY A391 ; [.3696.0020.0002.A391] # YI SYLLABLE RRYP A392 ; [.3697.0020.0002.A392] # YI SYLLABLE RRYRX A393 ; [.3698.0020.0002.A393] # YI SYLLABLE RRYR A394 ; [.3699.0020.0002.A394] # YI SYLLABLE NRAT A395 ; [.369A.0020.0002.A395] # YI SYLLABLE NRAX A396 ; [.369B.0020.0002.A396] # YI SYLLABLE NRA A397 ; [.369C.0020.0002.A397] # YI SYLLABLE NRAP A398 ; [.369D.0020.0002.A398] # YI SYLLABLE NROX A399 ; [.369E.0020.0002.A399] # YI SYLLABLE NRO A39A ; [.369F.0020.0002.A39A] # YI SYLLABLE NROP A39B ; [.36A0.0020.0002.A39B] # YI SYLLABLE NRET A39C ; [.36A1.0020.0002.A39C] # YI SYLLABLE NREX A39D ; [.36A2.0020.0002.A39D] # YI SYLLABLE NRE A39E ; [.36A3.0020.0002.A39E] # YI SYLLABLE NREP A39F ; [.36A4.0020.0002.A39F] # YI SYLLABLE NRUT A3A0 ; [.36A5.0020.0002.A3A0] # YI SYLLABLE NRUX A3A1 ; [.36A6.0020.0002.A3A1] # YI SYLLABLE NRU A3A2 ; [.36A7.0020.0002.A3A2] # YI SYLLABLE NRUP A3A3 ; [.36A8.0020.0002.A3A3] # YI SYLLABLE NRURX A3A4 ; [.36A9.0020.0002.A3A4] # YI SYLLABLE NRUR A3A5 ; [.36AA.0020.0002.A3A5] # YI SYLLABLE NRYT A3A6 ; [.36AB.0020.0002.A3A6] # YI SYLLABLE NRYX A3A7 ; [.36AC.0020.0002.A3A7] # YI SYLLABLE NRY A3A8 ; [.36AD.0020.0002.A3A8] # YI SYLLABLE NRYP A3A9 ; [.36AE.0020.0002.A3A9] # YI SYLLABLE NRYRX A3AA ; [.36AF.0020.0002.A3AA] # YI SYLLABLE NRYR A3AB ; [.36B0.0020.0002.A3AB] # YI SYLLABLE SHAT A3AC ; [.36B1.0020.0002.A3AC] # YI SYLLABLE SHAX A3AD ; [.36B2.0020.0002.A3AD] # YI SYLLABLE SHA A3AE ; [.36B3.0020.0002.A3AE] # YI SYLLABLE SHAP A3AF ; [.36B4.0020.0002.A3AF] # YI SYLLABLE SHUOX A3B0 ; [.36B5.0020.0002.A3B0] # YI SYLLABLE SHUO A3B1 ; [.36B6.0020.0002.A3B1] # YI SYLLABLE SHUOP A3B2 ; [.36B7.0020.0002.A3B2] # YI SYLLABLE SHOT A3B3 ; [.36B8.0020.0002.A3B3] # YI SYLLABLE SHOX A3B4 ; [.36B9.0020.0002.A3B4] # YI SYLLABLE SHO A3B5 ; [.36BA.0020.0002.A3B5] # YI SYLLABLE SHOP A3B6 ; [.36BB.0020.0002.A3B6] # YI SYLLABLE SHET A3B7 ; [.36BC.0020.0002.A3B7] # YI SYLLABLE SHEX A3B8 ; [.36BD.0020.0002.A3B8] # YI SYLLABLE SHE A3B9 ; [.36BE.0020.0002.A3B9] # YI SYLLABLE SHEP A3BA ; [.36BF.0020.0002.A3BA] # YI SYLLABLE SHUT A3BB ; [.36C0.0020.0002.A3BB] # YI SYLLABLE SHUX A3BC ; [.36C1.0020.0002.A3BC] # YI SYLLABLE SHU A3BD ; [.36C2.0020.0002.A3BD] # YI SYLLABLE SHUP A3BE ; [.36C3.0020.0002.A3BE] # YI SYLLABLE SHURX A3BF ; [.36C4.0020.0002.A3BF] # YI SYLLABLE SHUR A3C0 ; [.36C5.0020.0002.A3C0] # YI SYLLABLE SHYT A3C1 ; [.36C6.0020.0002.A3C1] # YI SYLLABLE SHYX A3C2 ; [.36C7.0020.0002.A3C2] # YI SYLLABLE SHY A3C3 ; [.36C8.0020.0002.A3C3] # YI SYLLABLE SHYP A3C4 ; [.36C9.0020.0002.A3C4] # YI SYLLABLE SHYRX A3C5 ; [.36CA.0020.0002.A3C5] # YI SYLLABLE SHYR A3C6 ; [.36CB.0020.0002.A3C6] # YI SYLLABLE RAT A3C7 ; [.36CC.0020.0002.A3C7] # YI SYLLABLE RAX A3C8 ; [.36CD.0020.0002.A3C8] # YI SYLLABLE RA A3C9 ; [.36CE.0020.0002.A3C9] # YI SYLLABLE RAP A3CA ; [.36CF.0020.0002.A3CA] # YI SYLLABLE RUOX A3CB ; [.36D0.0020.0002.A3CB] # YI SYLLABLE RUO A3CC ; [.36D1.0020.0002.A3CC] # YI SYLLABLE RUOP A3CD ; [.36D2.0020.0002.A3CD] # YI SYLLABLE ROT A3CE ; [.36D3.0020.0002.A3CE] # YI SYLLABLE ROX A3CF ; [.36D4.0020.0002.A3CF] # YI SYLLABLE RO A3D0 ; [.36D5.0020.0002.A3D0] # YI SYLLABLE ROP A3D1 ; [.36D6.0020.0002.A3D1] # YI SYLLABLE REX A3D2 ; [.36D7.0020.0002.A3D2] # YI SYLLABLE RE A3D3 ; [.36D8.0020.0002.A3D3] # YI SYLLABLE REP A3D4 ; [.36D9.0020.0002.A3D4] # YI SYLLABLE RUT A3D5 ; [.36DA.0020.0002.A3D5] # YI SYLLABLE RUX A3D6 ; [.36DB.0020.0002.A3D6] # YI SYLLABLE RU A3D7 ; [.36DC.0020.0002.A3D7] # YI SYLLABLE RUP A3D8 ; [.36DD.0020.0002.A3D8] # YI SYLLABLE RURX A3D9 ; [.36DE.0020.0002.A3D9] # YI SYLLABLE RUR A3DA ; [.36DF.0020.0002.A3DA] # YI SYLLABLE RYT A3DB ; [.36E0.0020.0002.A3DB] # YI SYLLABLE RYX A3DC ; [.36E1.0020.0002.A3DC] # YI SYLLABLE RY A3DD ; [.36E2.0020.0002.A3DD] # YI SYLLABLE RYP A3DE ; [.36E3.0020.0002.A3DE] # YI SYLLABLE RYRX A3DF ; [.36E4.0020.0002.A3DF] # YI SYLLABLE RYR A3E0 ; [.36E5.0020.0002.A3E0] # YI SYLLABLE JIT A3E1 ; [.36E6.0020.0002.A3E1] # YI SYLLABLE JIX A3E2 ; [.36E7.0020.0002.A3E2] # YI SYLLABLE JI A3E3 ; [.36E8.0020.0002.A3E3] # YI SYLLABLE JIP A3E4 ; [.36E9.0020.0002.A3E4] # YI SYLLABLE JIET A3E5 ; [.36EA.0020.0002.A3E5] # YI SYLLABLE JIEX A3E6 ; [.36EB.0020.0002.A3E6] # YI SYLLABLE JIE A3E7 ; [.36EC.0020.0002.A3E7] # YI SYLLABLE JIEP A3E8 ; [.36ED.0020.0002.A3E8] # YI SYLLABLE JUOT A3E9 ; [.36EE.0020.0002.A3E9] # YI SYLLABLE JUOX A3EA ; [.36EF.0020.0002.A3EA] # YI SYLLABLE JUO A3EB ; [.36F0.0020.0002.A3EB] # YI SYLLABLE JUOP A3EC ; [.36F1.0020.0002.A3EC] # YI SYLLABLE JOT A3ED ; [.36F2.0020.0002.A3ED] # YI SYLLABLE JOX A3EE ; [.36F3.0020.0002.A3EE] # YI SYLLABLE JO A3EF ; [.36F4.0020.0002.A3EF] # YI SYLLABLE JOP A3F0 ; [.36F5.0020.0002.A3F0] # YI SYLLABLE JUT A3F1 ; [.36F6.0020.0002.A3F1] # YI SYLLABLE JUX A3F2 ; [.36F7.0020.0002.A3F2] # YI SYLLABLE JU A3F3 ; [.36F8.0020.0002.A3F3] # YI SYLLABLE JUP A3F4 ; [.36F9.0020.0002.A3F4] # YI SYLLABLE JURX A3F5 ; [.36FA.0020.0002.A3F5] # YI SYLLABLE JUR A3F6 ; [.36FB.0020.0002.A3F6] # YI SYLLABLE JYT A3F7 ; [.36FC.0020.0002.A3F7] # YI SYLLABLE JYX A3F8 ; [.36FD.0020.0002.A3F8] # YI SYLLABLE JY A3F9 ; [.36FE.0020.0002.A3F9] # YI SYLLABLE JYP A3FA ; [.36FF.0020.0002.A3FA] # YI SYLLABLE JYRX A3FB ; [.3700.0020.0002.A3FB] # YI SYLLABLE JYR A3FC ; [.3701.0020.0002.A3FC] # YI SYLLABLE QIT A3FD ; [.3702.0020.0002.A3FD] # YI SYLLABLE QIX A3FE ; [.3703.0020.0002.A3FE] # YI SYLLABLE QI A3FF ; [.3704.0020.0002.A3FF] # YI SYLLABLE QIP A400 ; [.3705.0020.0002.A400] # YI SYLLABLE QIET A401 ; [.3706.0020.0002.A401] # YI SYLLABLE QIEX A402 ; [.3707.0020.0002.A402] # YI SYLLABLE QIE A403 ; [.3708.0020.0002.A403] # YI SYLLABLE QIEP A404 ; [.3709.0020.0002.A404] # YI SYLLABLE QUOT A405 ; [.370A.0020.0002.A405] # YI SYLLABLE QUOX A406 ; [.370B.0020.0002.A406] # YI SYLLABLE QUO A407 ; [.370C.0020.0002.A407] # YI SYLLABLE QUOP A408 ; [.370D.0020.0002.A408] # YI SYLLABLE QOT A409 ; [.370E.0020.0002.A409] # YI SYLLABLE QOX A40A ; [.370F.0020.0002.A40A] # YI SYLLABLE QO A40B ; [.3710.0020.0002.A40B] # YI SYLLABLE QOP A40C ; [.3711.0020.0002.A40C] # YI SYLLABLE QUT A40D ; [.3712.0020.0002.A40D] # YI SYLLABLE QUX A40E ; [.3713.0020.0002.A40E] # YI SYLLABLE QU A40F ; [.3714.0020.0002.A40F] # YI SYLLABLE QUP A410 ; [.3715.0020.0002.A410] # YI SYLLABLE QURX A411 ; [.3716.0020.0002.A411] # YI SYLLABLE QUR A412 ; [.3717.0020.0002.A412] # YI SYLLABLE QYT A413 ; [.3718.0020.0002.A413] # YI SYLLABLE QYX A414 ; [.3719.0020.0002.A414] # YI SYLLABLE QY A415 ; [.371A.0020.0002.A415] # YI SYLLABLE QYP A416 ; [.371B.0020.0002.A416] # YI SYLLABLE QYRX A417 ; [.371C.0020.0002.A417] # YI SYLLABLE QYR A418 ; [.371D.0020.0002.A418] # YI SYLLABLE JJIT A419 ; [.371E.0020.0002.A419] # YI SYLLABLE JJIX A41A ; [.371F.0020.0002.A41A] # YI SYLLABLE JJI A41B ; [.3720.0020.0002.A41B] # YI SYLLABLE JJIP A41C ; [.3721.0020.0002.A41C] # YI SYLLABLE JJIET A41D ; [.3722.0020.0002.A41D] # YI SYLLABLE JJIEX A41E ; [.3723.0020.0002.A41E] # YI SYLLABLE JJIE A41F ; [.3724.0020.0002.A41F] # YI SYLLABLE JJIEP A420 ; [.3725.0020.0002.A420] # YI SYLLABLE JJUOX A421 ; [.3726.0020.0002.A421] # YI SYLLABLE JJUO A422 ; [.3727.0020.0002.A422] # YI SYLLABLE JJUOP A423 ; [.3728.0020.0002.A423] # YI SYLLABLE JJOT A424 ; [.3729.0020.0002.A424] # YI SYLLABLE JJOX A425 ; [.372A.0020.0002.A425] # YI SYLLABLE JJO A426 ; [.372B.0020.0002.A426] # YI SYLLABLE JJOP A427 ; [.372C.0020.0002.A427] # YI SYLLABLE JJUT A428 ; [.372D.0020.0002.A428] # YI SYLLABLE JJUX A429 ; [.372E.0020.0002.A429] # YI SYLLABLE JJU A42A ; [.372F.0020.0002.A42A] # YI SYLLABLE JJUP A42B ; [.3730.0020.0002.A42B] # YI SYLLABLE JJURX A42C ; [.3731.0020.0002.A42C] # YI SYLLABLE JJUR A42D ; [.3732.0020.0002.A42D] # YI SYLLABLE JJYT A42E ; [.3733.0020.0002.A42E] # YI SYLLABLE JJYX A42F ; [.3734.0020.0002.A42F] # YI SYLLABLE JJY A430 ; [.3735.0020.0002.A430] # YI SYLLABLE JJYP A431 ; [.3736.0020.0002.A431] # YI SYLLABLE NJIT A432 ; [.3737.0020.0002.A432] # YI SYLLABLE NJIX A433 ; [.3738.0020.0002.A433] # YI SYLLABLE NJI A434 ; [.3739.0020.0002.A434] # YI SYLLABLE NJIP A435 ; [.373A.0020.0002.A435] # YI SYLLABLE NJIET A436 ; [.373B.0020.0002.A436] # YI SYLLABLE NJIEX A437 ; [.373C.0020.0002.A437] # YI SYLLABLE NJIE A438 ; [.373D.0020.0002.A438] # YI SYLLABLE NJIEP A439 ; [.373E.0020.0002.A439] # YI SYLLABLE NJUOX A43A ; [.373F.0020.0002.A43A] # YI SYLLABLE NJUO A43B ; [.3740.0020.0002.A43B] # YI SYLLABLE NJOT A43C ; [.3741.0020.0002.A43C] # YI SYLLABLE NJOX A43D ; [.3742.0020.0002.A43D] # YI SYLLABLE NJO A43E ; [.3743.0020.0002.A43E] # YI SYLLABLE NJOP A43F ; [.3744.0020.0002.A43F] # YI SYLLABLE NJUX A440 ; [.3745.0020.0002.A440] # YI SYLLABLE NJU A441 ; [.3746.0020.0002.A441] # YI SYLLABLE NJUP A442 ; [.3747.0020.0002.A442] # YI SYLLABLE NJURX A443 ; [.3748.0020.0002.A443] # YI SYLLABLE NJUR A444 ; [.3749.0020.0002.A444] # YI SYLLABLE NJYT A445 ; [.374A.0020.0002.A445] # YI SYLLABLE NJYX A446 ; [.374B.0020.0002.A446] # YI SYLLABLE NJY A447 ; [.374C.0020.0002.A447] # YI SYLLABLE NJYP A448 ; [.374D.0020.0002.A448] # YI SYLLABLE NJYRX A449 ; [.374E.0020.0002.A449] # YI SYLLABLE NJYR A44A ; [.374F.0020.0002.A44A] # YI SYLLABLE NYIT A44B ; [.3750.0020.0002.A44B] # YI SYLLABLE NYIX A44C ; [.3751.0020.0002.A44C] # YI SYLLABLE NYI A44D ; [.3752.0020.0002.A44D] # YI SYLLABLE NYIP A44E ; [.3753.0020.0002.A44E] # YI SYLLABLE NYIET A44F ; [.3754.0020.0002.A44F] # YI SYLLABLE NYIEX A450 ; [.3755.0020.0002.A450] # YI SYLLABLE NYIE A451 ; [.3756.0020.0002.A451] # YI SYLLABLE NYIEP A452 ; [.3757.0020.0002.A452] # YI SYLLABLE NYUOX A453 ; [.3758.0020.0002.A453] # YI SYLLABLE NYUO A454 ; [.3759.0020.0002.A454] # YI SYLLABLE NYUOP A455 ; [.375A.0020.0002.A455] # YI SYLLABLE NYOT A456 ; [.375B.0020.0002.A456] # YI SYLLABLE NYOX A457 ; [.375C.0020.0002.A457] # YI SYLLABLE NYO A458 ; [.375D.0020.0002.A458] # YI SYLLABLE NYOP A459 ; [.375E.0020.0002.A459] # YI SYLLABLE NYUT A45A ; [.375F.0020.0002.A45A] # YI SYLLABLE NYUX A45B ; [.3760.0020.0002.A45B] # YI SYLLABLE NYU A45C ; [.3761.0020.0002.A45C] # YI SYLLABLE NYUP A45D ; [.3762.0020.0002.A45D] # YI SYLLABLE XIT A45E ; [.3763.0020.0002.A45E] # YI SYLLABLE XIX A45F ; [.3764.0020.0002.A45F] # YI SYLLABLE XI A460 ; [.3765.0020.0002.A460] # YI SYLLABLE XIP A461 ; [.3766.0020.0002.A461] # YI SYLLABLE XIET A462 ; [.3767.0020.0002.A462] # YI SYLLABLE XIEX A463 ; [.3768.0020.0002.A463] # YI SYLLABLE XIE A464 ; [.3769.0020.0002.A464] # YI SYLLABLE XIEP A465 ; [.376A.0020.0002.A465] # YI SYLLABLE XUOX A466 ; [.376B.0020.0002.A466] # YI SYLLABLE XUO A467 ; [.376C.0020.0002.A467] # YI SYLLABLE XOT A468 ; [.376D.0020.0002.A468] # YI SYLLABLE XOX A469 ; [.376E.0020.0002.A469] # YI SYLLABLE XO A46A ; [.376F.0020.0002.A46A] # YI SYLLABLE XOP A46B ; [.3770.0020.0002.A46B] # YI SYLLABLE XYT A46C ; [.3771.0020.0002.A46C] # YI SYLLABLE XYX A46D ; [.3772.0020.0002.A46D] # YI SYLLABLE XY A46E ; [.3773.0020.0002.A46E] # YI SYLLABLE XYP A46F ; [.3774.0020.0002.A46F] # YI SYLLABLE XYRX A470 ; [.3775.0020.0002.A470] # YI SYLLABLE XYR A471 ; [.3776.0020.0002.A471] # YI SYLLABLE YIT A472 ; [.3777.0020.0002.A472] # YI SYLLABLE YIX A473 ; [.3778.0020.0002.A473] # YI SYLLABLE YI A474 ; [.3779.0020.0002.A474] # YI SYLLABLE YIP A475 ; [.377A.0020.0002.A475] # YI SYLLABLE YIET A476 ; [.377B.0020.0002.A476] # YI SYLLABLE YIEX A477 ; [.377C.0020.0002.A477] # YI SYLLABLE YIE A478 ; [.377D.0020.0002.A478] # YI SYLLABLE YIEP A479 ; [.377E.0020.0002.A479] # YI SYLLABLE YUOT A47A ; [.377F.0020.0002.A47A] # YI SYLLABLE YUOX A47B ; [.3780.0020.0002.A47B] # YI SYLLABLE YUO A47C ; [.3781.0020.0002.A47C] # YI SYLLABLE YUOP A47D ; [.3782.0020.0002.A47D] # YI SYLLABLE YOT A47E ; [.3783.0020.0002.A47E] # YI SYLLABLE YOX A47F ; [.3784.0020.0002.A47F] # YI SYLLABLE YO A480 ; [.3785.0020.0002.A480] # YI SYLLABLE YOP A481 ; [.3786.0020.0002.A481] # YI SYLLABLE YUT A482 ; [.3787.0020.0002.A482] # YI SYLLABLE YUX A483 ; [.3788.0020.0002.A483] # YI SYLLABLE YU A484 ; [.3789.0020.0002.A484] # YI SYLLABLE YUP A485 ; [.378A.0020.0002.A485] # YI SYLLABLE YURX A486 ; [.378B.0020.0002.A486] # YI SYLLABLE YUR A487 ; [.378C.0020.0002.A487] # YI SYLLABLE YYT A488 ; [.378D.0020.0002.A488] # YI SYLLABLE YYX A489 ; [.378E.0020.0002.A489] # YI SYLLABLE YY A48A ; [.378F.0020.0002.A48A] # YI SYLLABLE YYP A48B ; [.3790.0020.0002.A48B] # YI SYLLABLE YYRX A48C ; [.3791.0020.0002.A48C] # YI SYLLABLE YYR A4F8 ; [.3792.0020.0002.A4F8] # LISU LETTER TONE MYA TI A4F9 ; [.3793.0020.0002.A4F9] # LISU LETTER TONE NA PO A4FA ; [.3794.0020.0002.A4FA] # LISU LETTER TONE MYA CYA A4FB ; [.3795.0020.0002.A4FB] # LISU LETTER TONE MYA BO A4FD ; [.3796.0020.0002.A4FD] # LISU LETTER TONE MYA JEU A4FC ; [.3797.0020.0002.A4FC] # LISU LETTER TONE MYA NA A4D0 ; [.3798.0020.0002.A4D0] # LISU LETTER BA A4D1 ; [.3799.0020.0002.A4D1] # LISU LETTER PA A4D2 ; [.379A.0020.0002.A4D2] # LISU LETTER PHA A4D3 ; [.379B.0020.0002.A4D3] # LISU LETTER DA A4D4 ; [.379C.0020.0002.A4D4] # LISU LETTER TA A4D5 ; [.379D.0020.0002.A4D5] # LISU LETTER THA A4D6 ; [.379E.0020.0002.A4D6] # LISU LETTER GA A4D7 ; [.379F.0020.0002.A4D7] # LISU LETTER KA A4D8 ; [.37A0.0020.0002.A4D8] # LISU LETTER KHA A4D9 ; [.37A1.0020.0002.A4D9] # LISU LETTER JA A4DA ; [.37A2.0020.0002.A4DA] # LISU LETTER CA A4DB ; [.37A3.0020.0002.A4DB] # LISU LETTER CHA A4DC ; [.37A4.0020.0002.A4DC] # LISU LETTER DZA A4DD ; [.37A5.0020.0002.A4DD] # LISU LETTER TSA A4DE ; [.37A6.0020.0002.A4DE] # LISU LETTER TSHA A4DF ; [.37A7.0020.0002.A4DF] # LISU LETTER MA A4E0 ; [.37A8.0020.0002.A4E0] # LISU LETTER NA A4E1 ; [.37A9.0020.0002.A4E1] # LISU LETTER LA A4E2 ; [.37AA.0020.0002.A4E2] # LISU LETTER SA A4E3 ; [.37AB.0020.0002.A4E3] # LISU LETTER ZHA A4E4 ; [.37AC.0020.0002.A4E4] # LISU LETTER ZA A4E5 ; [.37AD.0020.0002.A4E5] # LISU LETTER NGA A4E6 ; [.37AE.0020.0002.A4E6] # LISU LETTER HA A4E7 ; [.37AF.0020.0002.A4E7] # LISU LETTER XA A4E8 ; [.37B0.0020.0002.A4E8] # LISU LETTER HHA A4E9 ; [.37B1.0020.0002.A4E9] # LISU LETTER FA A4EB ; [.37B2.0020.0002.A4EB] # LISU LETTER SHA A4ED ; [.37B3.0020.0002.A4ED] # LISU LETTER GHA A4EA ; [.37B4.0020.0002.A4EA] # LISU LETTER WA A4EC ; [.37B5.0020.0002.A4EC] # LISU LETTER YA A4EE ; [.37B6.0020.0002.A4EE] # LISU LETTER A A4EF ; [.37B7.0020.0002.A4EF] # LISU LETTER AE A4F0 ; [.37B8.0020.0002.A4F0] # LISU LETTER E A4F1 ; [.37B9.0020.0002.A4F1] # LISU LETTER EU A4F2 ; [.37BA.0020.0002.A4F2] # LISU LETTER I A4F3 ; [.37BB.0020.0002.A4F3] # LISU LETTER O A4F4 ; [.37BC.0020.0002.A4F4] # LISU LETTER U A4F5 ; [.37BD.0020.0002.A4F5] # LISU LETTER UE A4F6 ; [.37BE.0020.0002.A4F6] # LISU LETTER UH A4F7 ; [.37BF.0020.0002.A4F7] # LISU LETTER OE 16F00 ; [.37C0.0020.0002.16F00] # MIAO LETTER PA 16F01 ; [.37C1.0020.0002.16F01] # MIAO LETTER BA 16F02 ; [.37C2.0020.0002.16F02] # MIAO LETTER YI PA 16F03 ; [.37C3.0020.0002.16F03] # MIAO LETTER PLA 16F04 ; [.37C4.0020.0002.16F04] # MIAO LETTER MA 16F06 ; [.37C4.0020.0004.16F06] # MIAO LETTER ARCHAIC MA 16F05 ; [.37C5.0020.0002.16F05] # MIAO LETTER MHA 16F07 ; [.37C6.0020.0002.16F07] # MIAO LETTER FA 16F08 ; [.37C7.0020.0002.16F08] # MIAO LETTER VA 16F09 ; [.37C8.0020.0002.16F09] # MIAO LETTER VFA 16F0A ; [.37C9.0020.0002.16F0A] # MIAO LETTER TA 16F0B ; [.37CA.0020.0002.16F0B] # MIAO LETTER DA 16F0C ; [.37CB.0020.0002.16F0C] # MIAO LETTER YI TTA 16F0D ; [.37CC.0020.0002.16F0D] # MIAO LETTER YI TA 16F0E ; [.37CD.0020.0002.16F0E] # MIAO LETTER TTA 16F0F ; [.37CE.0020.0002.16F0F] # MIAO LETTER DDA 16F10 ; [.37CF.0020.0002.16F10] # MIAO LETTER NA 16F13 ; [.37CF.0020.0004.16F13] # MIAO LETTER ARCHAIC NA 16F11 ; [.37D0.0020.0002.16F11] # MIAO LETTER NHA 16F12 ; [.37D1.0020.0002.16F12] # MIAO LETTER YI NNA 16F14 ; [.37D2.0020.0002.16F14] # MIAO LETTER NNA 16F15 ; [.37D3.0020.0002.16F15] # MIAO LETTER NNHA 16F16 ; [.37D4.0020.0002.16F16] # MIAO LETTER LA 16F17 ; [.37D5.0020.0002.16F17] # MIAO LETTER LYA 16F18 ; [.37D6.0020.0002.16F18] # MIAO LETTER LHA 16F19 ; [.37D7.0020.0002.16F19] # MIAO LETTER LHYA 16F1A ; [.37D8.0020.0002.16F1A] # MIAO LETTER TLHA 16F1B ; [.37D9.0020.0002.16F1B] # MIAO LETTER DLHA 16F1C ; [.37DA.0020.0002.16F1C] # MIAO LETTER TLHYA 16F1D ; [.37DB.0020.0002.16F1D] # MIAO LETTER DLHYA 16F1E ; [.37DC.0020.0002.16F1E] # MIAO LETTER KA 16F1F ; [.37DD.0020.0002.16F1F] # MIAO LETTER GA 16F20 ; [.37DE.0020.0002.16F20] # MIAO LETTER YI KA 16F21 ; [.37DF.0020.0002.16F21] # MIAO LETTER QA 16F22 ; [.37E0.0020.0002.16F22] # MIAO LETTER QGA 16F23 ; [.37E1.0020.0002.16F23] # MIAO LETTER NGA 16F25 ; [.37E1.0020.0004.16F25] # MIAO LETTER ARCHAIC NGA 16F24 ; [.37E2.0020.0002.16F24] # MIAO LETTER NGHA 16F26 ; [.37E3.0020.0002.16F26] # MIAO LETTER HA 16F27 ; [.37E4.0020.0002.16F27] # MIAO LETTER XA 16F28 ; [.37E5.0020.0002.16F28] # MIAO LETTER GHA 16F29 ; [.37E6.0020.0002.16F29] # MIAO LETTER GHHA 16F2A ; [.37E7.0020.0002.16F2A] # MIAO LETTER TSSA 16F2B ; [.37E8.0020.0002.16F2B] # MIAO LETTER DZZA 16F2C ; [.37E9.0020.0002.16F2C] # MIAO LETTER NYA 16F2D ; [.37EA.0020.0002.16F2D] # MIAO LETTER NYHA 16F2E ; [.37EB.0020.0002.16F2E] # MIAO LETTER TSHA 16F2F ; [.37EC.0020.0002.16F2F] # MIAO LETTER DZHA 16F30 ; [.37ED.0020.0002.16F30] # MIAO LETTER YI TSHA 16F31 ; [.37EE.0020.0002.16F31] # MIAO LETTER YI DZHA 16F32 ; [.37EF.0020.0002.16F32] # MIAO LETTER REFORMED TSHA 16F33 ; [.37F0.0020.0002.16F33] # MIAO LETTER SHA 16F34 ; [.37F1.0020.0002.16F34] # MIAO LETTER SSA 16F35 ; [.37F2.0020.0002.16F35] # MIAO LETTER ZHA 16F36 ; [.37F3.0020.0002.16F36] # MIAO LETTER ZSHA 16F37 ; [.37F4.0020.0002.16F37] # MIAO LETTER TSA 16F38 ; [.37F5.0020.0002.16F38] # MIAO LETTER DZA 16F39 ; [.37F6.0020.0002.16F39] # MIAO LETTER YI TSA 16F3A ; [.37F7.0020.0002.16F3A] # MIAO LETTER SA 16F3B ; [.37F8.0020.0002.16F3B] # MIAO LETTER ZA 16F3C ; [.37F9.0020.0002.16F3C] # MIAO LETTER ZSA 16F3D ; [.37FA.0020.0002.16F3D] # MIAO LETTER ZZA 16F3F ; [.37FA.0020.0004.16F3F] # MIAO LETTER ARCHAIC ZZA 16F3E ; [.37FB.0020.0002.16F3E] # MIAO LETTER ZZSA 16F40 ; [.37FC.0020.0002.16F40] # MIAO LETTER ZZYA 16F41 ; [.37FD.0020.0002.16F41] # MIAO LETTER ZZSYA 16F42 ; [.37FE.0020.0002.16F42] # MIAO LETTER WA 16F43 ; [.37FF.0020.0002.16F43] # MIAO LETTER AH 16F44 ; [.3800.0020.0002.16F44] # MIAO LETTER HHA 16F50 ; [.3801.0020.0002.16F50] # MIAO LETTER NASALIZATION 16F51 ; [.3802.0020.0002.16F51] # MIAO SIGN ASPIRATION 16F52 ; [.3803.0020.0002.16F52] # MIAO SIGN REFORMED VOICING 16F53 ; [.3804.0020.0002.16F53] # MIAO SIGN REFORMED ASPIRATION 16F54 ; [.3805.0020.0002.16F54] # MIAO VOWEL SIGN A 16F55 ; [.3806.0020.0002.16F55] # MIAO VOWEL SIGN AA 16F56 ; [.3807.0020.0002.16F56] # MIAO VOWEL SIGN AHH 16F57 ; [.3808.0020.0002.16F57] # MIAO VOWEL SIGN AN 16F58 ; [.3809.0020.0002.16F58] # MIAO VOWEL SIGN ANG 16F59 ; [.380A.0020.0002.16F59] # MIAO VOWEL SIGN O 16F5A ; [.380B.0020.0002.16F5A] # MIAO VOWEL SIGN OO 16F5B ; [.380C.0020.0002.16F5B] # MIAO VOWEL SIGN WO 16F5C ; [.380D.0020.0002.16F5C] # MIAO VOWEL SIGN W 16F5D ; [.380E.0020.0002.16F5D] # MIAO VOWEL SIGN E 16F5E ; [.380F.0020.0002.16F5E] # MIAO VOWEL SIGN EN 16F5F ; [.3810.0020.0002.16F5F] # MIAO VOWEL SIGN ENG 16F60 ; [.3811.0020.0002.16F60] # MIAO VOWEL SIGN OEY 16F61 ; [.3812.0020.0002.16F61] # MIAO VOWEL SIGN I 16F62 ; [.3813.0020.0002.16F62] # MIAO VOWEL SIGN IA 16F63 ; [.3814.0020.0002.16F63] # MIAO VOWEL SIGN IAN 16F64 ; [.3815.0020.0002.16F64] # MIAO VOWEL SIGN IANG 16F65 ; [.3816.0020.0002.16F65] # MIAO VOWEL SIGN IO 16F66 ; [.3817.0020.0002.16F66] # MIAO VOWEL SIGN IE 16F67 ; [.3818.0020.0002.16F67] # MIAO VOWEL SIGN II 16F68 ; [.3819.0020.0002.16F68] # MIAO VOWEL SIGN IU 16F69 ; [.381A.0020.0002.16F69] # MIAO VOWEL SIGN ING 16F6A ; [.381B.0020.0002.16F6A] # MIAO VOWEL SIGN U 16F6B ; [.381C.0020.0002.16F6B] # MIAO VOWEL SIGN UA 16F6C ; [.381D.0020.0002.16F6C] # MIAO VOWEL SIGN UAN 16F6D ; [.381E.0020.0002.16F6D] # MIAO VOWEL SIGN UANG 16F6E ; [.381F.0020.0002.16F6E] # MIAO VOWEL SIGN UU 16F6F ; [.3820.0020.0002.16F6F] # MIAO VOWEL SIGN UEI 16F70 ; [.3821.0020.0002.16F70] # MIAO VOWEL SIGN UNG 16F71 ; [.3822.0020.0002.16F71] # MIAO VOWEL SIGN Y 16F72 ; [.3823.0020.0002.16F72] # MIAO VOWEL SIGN YI 16F73 ; [.3824.0020.0002.16F73] # MIAO VOWEL SIGN AE 16F74 ; [.3825.0020.0002.16F74] # MIAO VOWEL SIGN AEE 16F75 ; [.3826.0020.0002.16F75] # MIAO VOWEL SIGN ERR 16F76 ; [.3827.0020.0002.16F76] # MIAO VOWEL SIGN ROUNDED ERR 16F77 ; [.3828.0020.0002.16F77] # MIAO VOWEL SIGN ER 16F78 ; [.3829.0020.0002.16F78] # MIAO VOWEL SIGN ROUNDED ER 16F79 ; [.382A.0020.0002.16F79] # MIAO VOWEL SIGN AI 16F7A ; [.382B.0020.0002.16F7A] # MIAO VOWEL SIGN EI 16F7B ; [.382C.0020.0002.16F7B] # MIAO VOWEL SIGN AU 16F7C ; [.382D.0020.0002.16F7C] # MIAO VOWEL SIGN OU 16F7D ; [.382E.0020.0002.16F7D] # MIAO VOWEL SIGN N 16F7E ; [.382F.0020.0002.16F7E] # MIAO VOWEL SIGN NG 16F8F ; [.3830.0020.0002.16F8F] # MIAO TONE RIGHT 16F90 ; [.3831.0020.0002.16F90] # MIAO TONE TOP RIGHT 16F91 ; [.3832.0020.0002.16F91] # MIAO TONE ABOVE 16F92 ; [.3833.0020.0002.16F92] # MIAO TONE BELOW 16F93 ; [.3834.0020.0002.16F93] # MIAO LETTER TONE-2 16F94 ; [.3835.0020.0002.16F94] # MIAO LETTER TONE-3 16F95 ; [.3836.0020.0002.16F95] # MIAO LETTER TONE-4 16F96 ; [.3837.0020.0002.16F96] # MIAO LETTER TONE-5 16F97 ; [.3838.0020.0002.16F97] # MIAO LETTER TONE-6 16F98 ; [.3839.0020.0002.16F98] # MIAO LETTER TONE-7 16F99 ; [.383A.0020.0002.16F99] # MIAO LETTER TONE-8 16F9A ; [.383B.0020.0002.16F9A] # MIAO LETTER REFORMED TONE-1 16F9B ; [.383C.0020.0002.16F9B] # MIAO LETTER REFORMED TONE-2 16F9C ; [.383D.0020.0002.16F9C] # MIAO LETTER REFORMED TONE-4 16F9D ; [.383E.0020.0002.16F9D] # MIAO LETTER REFORMED TONE-5 16F9E ; [.383F.0020.0002.16F9E] # MIAO LETTER REFORMED TONE-6 16F9F ; [.3840.0020.0002.16F9F] # MIAO LETTER REFORMED TONE-8 10280 ; [.3841.0020.0002.10280] # LYCIAN LETTER A 10281 ; [.3842.0020.0002.10281] # LYCIAN LETTER E 10282 ; [.3843.0020.0002.10282] # LYCIAN LETTER B 10283 ; [.3844.0020.0002.10283] # LYCIAN LETTER BH 10284 ; [.3845.0020.0002.10284] # LYCIAN LETTER G 10285 ; [.3846.0020.0002.10285] # LYCIAN LETTER D 10286 ; [.3847.0020.0002.10286] # LYCIAN LETTER I 10287 ; [.3848.0020.0002.10287] # LYCIAN LETTER W 10288 ; [.3849.0020.0002.10288] # LYCIAN LETTER Z 10289 ; [.384A.0020.0002.10289] # LYCIAN LETTER TH 1028A ; [.384B.0020.0002.1028A] # LYCIAN LETTER J 1028B ; [.384C.0020.0002.1028B] # LYCIAN LETTER K 1028C ; [.384D.0020.0002.1028C] # LYCIAN LETTER Q 1028D ; [.384E.0020.0002.1028D] # LYCIAN LETTER L 1028E ; [.384F.0020.0002.1028E] # LYCIAN LETTER M 1028F ; [.3850.0020.0002.1028F] # LYCIAN LETTER N 10290 ; [.3851.0020.0002.10290] # LYCIAN LETTER MM 10291 ; [.3852.0020.0002.10291] # LYCIAN LETTER NN 10292 ; [.3853.0020.0002.10292] # LYCIAN LETTER U 10293 ; [.3854.0020.0002.10293] # LYCIAN LETTER P 10294 ; [.3855.0020.0002.10294] # LYCIAN LETTER KK 10295 ; [.3856.0020.0002.10295] # LYCIAN LETTER R 10296 ; [.3857.0020.0002.10296] # LYCIAN LETTER S 10297 ; [.3858.0020.0002.10297] # LYCIAN LETTER T 10298 ; [.3859.0020.0002.10298] # LYCIAN LETTER TT 10299 ; [.385A.0020.0002.10299] # LYCIAN LETTER AN 1029A ; [.385B.0020.0002.1029A] # LYCIAN LETTER EN 1029B ; [.385C.0020.0002.1029B] # LYCIAN LETTER H 1029C ; [.385D.0020.0002.1029C] # LYCIAN LETTER X 102A0 ; [.385E.0020.0002.102A0] # CARIAN LETTER A 102A1 ; [.385F.0020.0002.102A1] # CARIAN LETTER P2 102A2 ; [.3860.0020.0002.102A2] # CARIAN LETTER D 102A3 ; [.3861.0020.0002.102A3] # CARIAN LETTER L 102A4 ; [.3862.0020.0002.102A4] # CARIAN LETTER UUU 102A5 ; [.3863.0020.0002.102A5] # CARIAN LETTER R 102A6 ; [.3864.0020.0002.102A6] # CARIAN LETTER LD 102A7 ; [.3865.0020.0002.102A7] # CARIAN LETTER A2 102A8 ; [.3866.0020.0002.102A8] # CARIAN LETTER Q 102A9 ; [.3867.0020.0002.102A9] # CARIAN LETTER B 102AA ; [.3868.0020.0002.102AA] # CARIAN LETTER M 102AB ; [.3869.0020.0002.102AB] # CARIAN LETTER O 102AC ; [.386A.0020.0002.102AC] # CARIAN LETTER D2 102AD ; [.386B.0020.0002.102AD] # CARIAN LETTER T 102AE ; [.386C.0020.0002.102AE] # CARIAN LETTER SH 102AF ; [.386D.0020.0002.102AF] # CARIAN LETTER SH2 102B0 ; [.386E.0020.0002.102B0] # CARIAN LETTER S 102B1 ; [.386F.0020.0002.102B1] # CARIAN LETTER C-18 102B2 ; [.3870.0020.0002.102B2] # CARIAN LETTER U 102B3 ; [.3871.0020.0002.102B3] # CARIAN LETTER NN 102B4 ; [.3872.0020.0002.102B4] # CARIAN LETTER X 102B5 ; [.3873.0020.0002.102B5] # CARIAN LETTER N 102B6 ; [.3874.0020.0002.102B6] # CARIAN LETTER TT2 102B7 ; [.3875.0020.0002.102B7] # CARIAN LETTER P 102B8 ; [.3876.0020.0002.102B8] # CARIAN LETTER SS 102B9 ; [.3877.0020.0002.102B9] # CARIAN LETTER I 102BA ; [.3878.0020.0002.102BA] # CARIAN LETTER E 102BB ; [.3879.0020.0002.102BB] # CARIAN LETTER UUUU 102BC ; [.387A.0020.0002.102BC] # CARIAN LETTER K 102BD ; [.387B.0020.0002.102BD] # CARIAN LETTER K2 102BE ; [.387C.0020.0002.102BE] # CARIAN LETTER ND 102BF ; [.387D.0020.0002.102BF] # CARIAN LETTER UU 102C0 ; [.387E.0020.0002.102C0] # CARIAN LETTER G 102C1 ; [.387F.0020.0002.102C1] # CARIAN LETTER G2 102C2 ; [.3880.0020.0002.102C2] # CARIAN LETTER ST 102C3 ; [.3881.0020.0002.102C3] # CARIAN LETTER ST2 102C4 ; [.3882.0020.0002.102C4] # CARIAN LETTER NG 102C5 ; [.3883.0020.0002.102C5] # CARIAN LETTER II 102C6 ; [.3884.0020.0002.102C6] # CARIAN LETTER C-39 102C7 ; [.3885.0020.0002.102C7] # CARIAN LETTER TT 102C8 ; [.3886.0020.0002.102C8] # CARIAN LETTER UUU2 102C9 ; [.3887.0020.0002.102C9] # CARIAN LETTER RR 102CA ; [.3888.0020.0002.102CA] # CARIAN LETTER MB 102CB ; [.3889.0020.0002.102CB] # CARIAN LETTER MB2 102CC ; [.388A.0020.0002.102CC] # CARIAN LETTER MB3 102CD ; [.388B.0020.0002.102CD] # CARIAN LETTER MB4 102CE ; [.388C.0020.0002.102CE] # CARIAN LETTER LD2 102CF ; [.388D.0020.0002.102CF] # CARIAN LETTER E2 102D0 ; [.388E.0020.0002.102D0] # CARIAN LETTER UUU3 10920 ; [.388F.0020.0002.10920] # LYDIAN LETTER A 10921 ; [.3890.0020.0002.10921] # LYDIAN LETTER B 10922 ; [.3891.0020.0002.10922] # LYDIAN LETTER G 10923 ; [.3892.0020.0002.10923] # LYDIAN LETTER D 10924 ; [.3893.0020.0002.10924] # LYDIAN LETTER E 10925 ; [.3894.0020.0002.10925] # LYDIAN LETTER V 10926 ; [.3895.0020.0002.10926] # LYDIAN LETTER I 10927 ; [.3896.0020.0002.10927] # LYDIAN LETTER Y 10928 ; [.3897.0020.0002.10928] # LYDIAN LETTER K 10929 ; [.3898.0020.0002.10929] # LYDIAN LETTER L 1092A ; [.3899.0020.0002.1092A] # LYDIAN LETTER M 1092B ; [.389A.0020.0002.1092B] # LYDIAN LETTER N 1092C ; [.389B.0020.0002.1092C] # LYDIAN LETTER O 1092D ; [.389C.0020.0002.1092D] # LYDIAN LETTER R 1092E ; [.389D.0020.0002.1092E] # LYDIAN LETTER SS 1092F ; [.389E.0020.0002.1092F] # LYDIAN LETTER T 10930 ; [.389F.0020.0002.10930] # LYDIAN LETTER U 10931 ; [.38A0.0020.0002.10931] # LYDIAN LETTER F 10932 ; [.38A1.0020.0002.10932] # LYDIAN LETTER Q 10933 ; [.38A2.0020.0002.10933] # LYDIAN LETTER S 10934 ; [.38A3.0020.0002.10934] # LYDIAN LETTER TT 10935 ; [.38A4.0020.0002.10935] # LYDIAN LETTER AN 10936 ; [.38A5.0020.0002.10936] # LYDIAN LETTER EN 10937 ; [.38A6.0020.0002.10937] # LYDIAN LETTER LY 10938 ; [.38A7.0020.0002.10938] # LYDIAN LETTER NN 10939 ; [.38A8.0020.0002.10939] # LYDIAN LETTER C 10300 ; [.38A9.0020.0002.10300] # OLD ITALIC LETTER A 10301 ; [.38AA.0020.0002.10301] # OLD ITALIC LETTER BE 10302 ; [.38AB.0020.0002.10302] # OLD ITALIC LETTER KE 10303 ; [.38AC.0020.0002.10303] # OLD ITALIC LETTER DE 10304 ; [.38AD.0020.0002.10304] # OLD ITALIC LETTER E 10305 ; [.38AE.0020.0002.10305] # OLD ITALIC LETTER VE 10306 ; [.38AF.0020.0002.10306] # OLD ITALIC LETTER ZE 10307 ; [.38B0.0020.0002.10307] # OLD ITALIC LETTER HE 10308 ; [.38B1.0020.0002.10308] # OLD ITALIC LETTER THE 10309 ; [.38B2.0020.0002.10309] # OLD ITALIC LETTER I 1030A ; [.38B3.0020.0002.1030A] # OLD ITALIC LETTER KA 1030B ; [.38B4.0020.0002.1030B] # OLD ITALIC LETTER EL 1030C ; [.38B5.0020.0002.1030C] # OLD ITALIC LETTER EM 1030D ; [.38B6.0020.0002.1030D] # OLD ITALIC LETTER EN 1030E ; [.38B7.0020.0002.1030E] # OLD ITALIC LETTER ESH 1030F ; [.38B8.0020.0002.1030F] # OLD ITALIC LETTER O 10310 ; [.38B9.0020.0002.10310] # OLD ITALIC LETTER PE 10311 ; [.38BA.0020.0002.10311] # OLD ITALIC LETTER SHE 10312 ; [.38BB.0020.0002.10312] # OLD ITALIC LETTER KU 10313 ; [.38BC.0020.0002.10313] # OLD ITALIC LETTER ER 10314 ; [.38BD.0020.0002.10314] # OLD ITALIC LETTER ES 10315 ; [.38BE.0020.0002.10315] # OLD ITALIC LETTER TE 10316 ; [.38BF.0020.0002.10316] # OLD ITALIC LETTER U 10317 ; [.38C0.0020.0002.10317] # OLD ITALIC LETTER EKS 10318 ; [.38C1.0020.0002.10318] # OLD ITALIC LETTER PHE 10319 ; [.38C2.0020.0002.10319] # OLD ITALIC LETTER KHE 1031A ; [.38C3.0020.0002.1031A] # OLD ITALIC LETTER EF 1031B ; [.38C4.0020.0002.1031B] # OLD ITALIC LETTER ERS 1031C ; [.38C5.0020.0002.1031C] # OLD ITALIC LETTER CHE 1031D ; [.38C6.0020.0002.1031D] # OLD ITALIC LETTER II 1031E ; [.38C7.0020.0002.1031E] # OLD ITALIC LETTER UU 10330 ; [.38C8.0020.0002.10330] # GOTHIC LETTER AHSA 10331 ; [.38C9.0020.0002.10331] # GOTHIC LETTER BAIRKAN 10332 ; [.38CA.0020.0002.10332] # GOTHIC LETTER GIBA 10333 ; [.38CB.0020.0002.10333] # GOTHIC LETTER DAGS 10334 ; [.38CC.0020.0002.10334] # GOTHIC LETTER AIHVUS 10335 ; [.38CD.0020.0002.10335] # GOTHIC LETTER QAIRTHRA 10336 ; [.38CE.0020.0002.10336] # GOTHIC LETTER IUJA 10337 ; [.38CF.0020.0002.10337] # GOTHIC LETTER HAGL 10338 ; [.38D0.0020.0002.10338] # GOTHIC LETTER THIUTH 10339 ; [.38D1.0020.0002.10339] # GOTHIC LETTER EIS 1033A ; [.38D2.0020.0002.1033A] # GOTHIC LETTER KUSMA 1033B ; [.38D3.0020.0002.1033B] # GOTHIC LETTER LAGUS 1033C ; [.38D4.0020.0002.1033C] # GOTHIC LETTER MANNA 1033D ; [.38D5.0020.0002.1033D] # GOTHIC LETTER NAUTHS 1033E ; [.38D6.0020.0002.1033E] # GOTHIC LETTER JER 1033F ; [.38D7.0020.0002.1033F] # GOTHIC LETTER URUS 10340 ; [.38D8.0020.0002.10340] # GOTHIC LETTER PAIRTHRA 10341 ; [.38D9.0020.0002.10341] # GOTHIC LETTER NINETY 10342 ; [.38DA.0020.0002.10342] # GOTHIC LETTER RAIDA 10343 ; [.38DB.0020.0002.10343] # GOTHIC LETTER SAUIL 10344 ; [.38DC.0020.0002.10344] # GOTHIC LETTER TEIWS 10345 ; [.38DD.0020.0002.10345] # GOTHIC LETTER WINJA 10346 ; [.38DE.0020.0002.10346] # GOTHIC LETTER FAIHU 10347 ; [.38DF.0020.0002.10347] # GOTHIC LETTER IGGWS 10348 ; [.38E0.0020.0002.10348] # GOTHIC LETTER HWAIR 10349 ; [.38E1.0020.0002.10349] # GOTHIC LETTER OTHAL 1034A ; [.38E2.0020.0002.1034A] # GOTHIC LETTER NINE HUNDRED 10428 ; [.38E3.0020.0002.10428] # DESERET SMALL LETTER LONG I 10400 ; [.38E3.0020.0008.10400] # DESERET CAPITAL LETTER LONG I 10429 ; [.38E4.0020.0002.10429] # DESERET SMALL LETTER LONG E 10401 ; [.38E4.0020.0008.10401] # DESERET CAPITAL LETTER LONG E 1042A ; [.38E5.0020.0002.1042A] # DESERET SMALL LETTER LONG A 10402 ; [.38E5.0020.0008.10402] # DESERET CAPITAL LETTER LONG A 1042B ; [.38E6.0020.0002.1042B] # DESERET SMALL LETTER LONG AH 10403 ; [.38E6.0020.0008.10403] # DESERET CAPITAL LETTER LONG AH 1042C ; [.38E7.0020.0002.1042C] # DESERET SMALL LETTER LONG O 10404 ; [.38E7.0020.0008.10404] # DESERET CAPITAL LETTER LONG O 1042D ; [.38E8.0020.0002.1042D] # DESERET SMALL LETTER LONG OO 10405 ; [.38E8.0020.0008.10405] # DESERET CAPITAL LETTER LONG OO 1042E ; [.38E9.0020.0002.1042E] # DESERET SMALL LETTER SHORT I 10406 ; [.38E9.0020.0008.10406] # DESERET CAPITAL LETTER SHORT I 1042F ; [.38EA.0020.0002.1042F] # DESERET SMALL LETTER SHORT E 10407 ; [.38EA.0020.0008.10407] # DESERET CAPITAL LETTER SHORT E 10430 ; [.38EB.0020.0002.10430] # DESERET SMALL LETTER SHORT A 10408 ; [.38EB.0020.0008.10408] # DESERET CAPITAL LETTER SHORT A 10431 ; [.38EC.0020.0002.10431] # DESERET SMALL LETTER SHORT AH 10409 ; [.38EC.0020.0008.10409] # DESERET CAPITAL LETTER SHORT AH 10432 ; [.38ED.0020.0002.10432] # DESERET SMALL LETTER SHORT O 1040A ; [.38ED.0020.0008.1040A] # DESERET CAPITAL LETTER SHORT O 10433 ; [.38EE.0020.0002.10433] # DESERET SMALL LETTER SHORT OO 1040B ; [.38EE.0020.0008.1040B] # DESERET CAPITAL LETTER SHORT OO 10434 ; [.38EF.0020.0002.10434] # DESERET SMALL LETTER AY 1040C ; [.38EF.0020.0008.1040C] # DESERET CAPITAL LETTER AY 10435 ; [.38F0.0020.0002.10435] # DESERET SMALL LETTER OW 1040D ; [.38F0.0020.0008.1040D] # DESERET CAPITAL LETTER OW 10436 ; [.38F1.0020.0002.10436] # DESERET SMALL LETTER WU 1040E ; [.38F1.0020.0008.1040E] # DESERET CAPITAL LETTER WU 10437 ; [.38F2.0020.0002.10437] # DESERET SMALL LETTER YEE 1040F ; [.38F2.0020.0008.1040F] # DESERET CAPITAL LETTER YEE 10438 ; [.38F3.0020.0002.10438] # DESERET SMALL LETTER H 10410 ; [.38F3.0020.0008.10410] # DESERET CAPITAL LETTER H 10439 ; [.38F4.0020.0002.10439] # DESERET SMALL LETTER PEE 10411 ; [.38F4.0020.0008.10411] # DESERET CAPITAL LETTER PEE 1043A ; [.38F5.0020.0002.1043A] # DESERET SMALL LETTER BEE 10412 ; [.38F5.0020.0008.10412] # DESERET CAPITAL LETTER BEE 1043B ; [.38F6.0020.0002.1043B] # DESERET SMALL LETTER TEE 10413 ; [.38F6.0020.0008.10413] # DESERET CAPITAL LETTER TEE 1043C ; [.38F7.0020.0002.1043C] # DESERET SMALL LETTER DEE 10414 ; [.38F7.0020.0008.10414] # DESERET CAPITAL LETTER DEE 1043D ; [.38F8.0020.0002.1043D] # DESERET SMALL LETTER CHEE 10415 ; [.38F8.0020.0008.10415] # DESERET CAPITAL LETTER CHEE 1043E ; [.38F9.0020.0002.1043E] # DESERET SMALL LETTER JEE 10416 ; [.38F9.0020.0008.10416] # DESERET CAPITAL LETTER JEE 1043F ; [.38FA.0020.0002.1043F] # DESERET SMALL LETTER KAY 10417 ; [.38FA.0020.0008.10417] # DESERET CAPITAL LETTER KAY 10440 ; [.38FB.0020.0002.10440] # DESERET SMALL LETTER GAY 10418 ; [.38FB.0020.0008.10418] # DESERET CAPITAL LETTER GAY 10441 ; [.38FC.0020.0002.10441] # DESERET SMALL LETTER EF 10419 ; [.38FC.0020.0008.10419] # DESERET CAPITAL LETTER EF 10442 ; [.38FD.0020.0002.10442] # DESERET SMALL LETTER VEE 1041A ; [.38FD.0020.0008.1041A] # DESERET CAPITAL LETTER VEE 10443 ; [.38FE.0020.0002.10443] # DESERET SMALL LETTER ETH 1041B ; [.38FE.0020.0008.1041B] # DESERET CAPITAL LETTER ETH 10444 ; [.38FF.0020.0002.10444] # DESERET SMALL LETTER THEE 1041C ; [.38FF.0020.0008.1041C] # DESERET CAPITAL LETTER THEE 10445 ; [.3900.0020.0002.10445] # DESERET SMALL LETTER ES 1041D ; [.3900.0020.0008.1041D] # DESERET CAPITAL LETTER ES 10446 ; [.3901.0020.0002.10446] # DESERET SMALL LETTER ZEE 1041E ; [.3901.0020.0008.1041E] # DESERET CAPITAL LETTER ZEE 10447 ; [.3902.0020.0002.10447] # DESERET SMALL LETTER ESH 1041F ; [.3902.0020.0008.1041F] # DESERET CAPITAL LETTER ESH 10448 ; [.3903.0020.0002.10448] # DESERET SMALL LETTER ZHEE 10420 ; [.3903.0020.0008.10420] # DESERET CAPITAL LETTER ZHEE 10449 ; [.3904.0020.0002.10449] # DESERET SMALL LETTER ER 10421 ; [.3904.0020.0008.10421] # DESERET CAPITAL LETTER ER 1044A ; [.3905.0020.0002.1044A] # DESERET SMALL LETTER EL 10422 ; [.3905.0020.0008.10422] # DESERET CAPITAL LETTER EL 1044B ; [.3906.0020.0002.1044B] # DESERET SMALL LETTER EM 10423 ; [.3906.0020.0008.10423] # DESERET CAPITAL LETTER EM 1044C ; [.3907.0020.0002.1044C] # DESERET SMALL LETTER EN 10424 ; [.3907.0020.0008.10424] # DESERET CAPITAL LETTER EN 1044D ; [.3908.0020.0002.1044D] # DESERET SMALL LETTER ENG 10425 ; [.3908.0020.0008.10425] # DESERET CAPITAL LETTER ENG 1044E ; [.3909.0020.0002.1044E] # DESERET SMALL LETTER OI 10426 ; [.3909.0020.0008.10426] # DESERET CAPITAL LETTER OI 1044F ; [.390A.0020.0002.1044F] # DESERET SMALL LETTER EW 10427 ; [.390A.0020.0008.10427] # DESERET CAPITAL LETTER EW 10450 ; [.390B.0020.0002.10450] # SHAVIAN LETTER PEEP 10451 ; [.390C.0020.0002.10451] # SHAVIAN LETTER TOT 10452 ; [.390D.0020.0002.10452] # SHAVIAN LETTER KICK 10453 ; [.390E.0020.0002.10453] # SHAVIAN LETTER FEE 10454 ; [.390F.0020.0002.10454] # SHAVIAN LETTER THIGH 10455 ; [.3910.0020.0002.10455] # SHAVIAN LETTER SO 10456 ; [.3911.0020.0002.10456] # SHAVIAN LETTER SURE 10457 ; [.3912.0020.0002.10457] # SHAVIAN LETTER CHURCH 10458 ; [.3913.0020.0002.10458] # SHAVIAN LETTER YEA 10459 ; [.3914.0020.0002.10459] # SHAVIAN LETTER HUNG 1045A ; [.3915.0020.0002.1045A] # SHAVIAN LETTER BIB 1045B ; [.3916.0020.0002.1045B] # SHAVIAN LETTER DEAD 1045C ; [.3917.0020.0002.1045C] # SHAVIAN LETTER GAG 1045D ; [.3918.0020.0002.1045D] # SHAVIAN LETTER VOW 1045E ; [.3919.0020.0002.1045E] # SHAVIAN LETTER THEY 1045F ; [.391A.0020.0002.1045F] # SHAVIAN LETTER ZOO 10460 ; [.391B.0020.0002.10460] # SHAVIAN LETTER MEASURE 10461 ; [.391C.0020.0002.10461] # SHAVIAN LETTER JUDGE 10462 ; [.391D.0020.0002.10462] # SHAVIAN LETTER WOE 10463 ; [.391E.0020.0002.10463] # SHAVIAN LETTER HA-HA 10464 ; [.391F.0020.0002.10464] # SHAVIAN LETTER LOLL 10465 ; [.3920.0020.0002.10465] # SHAVIAN LETTER MIME 10466 ; [.3921.0020.0002.10466] # SHAVIAN LETTER IF 10467 ; [.3922.0020.0002.10467] # SHAVIAN LETTER EGG 10468 ; [.3923.0020.0002.10468] # SHAVIAN LETTER ASH 10469 ; [.3924.0020.0002.10469] # SHAVIAN LETTER ADO 1046A ; [.3925.0020.0002.1046A] # SHAVIAN LETTER ON 1046B ; [.3926.0020.0002.1046B] # SHAVIAN LETTER WOOL 1046C ; [.3927.0020.0002.1046C] # SHAVIAN LETTER OUT 1046D ; [.3928.0020.0002.1046D] # SHAVIAN LETTER AH 1046E ; [.3929.0020.0002.1046E] # SHAVIAN LETTER ROAR 1046F ; [.392A.0020.0002.1046F] # SHAVIAN LETTER NUN 10470 ; [.392B.0020.0002.10470] # SHAVIAN LETTER EAT 10471 ; [.392C.0020.0002.10471] # SHAVIAN LETTER AGE 10472 ; [.392D.0020.0002.10472] # SHAVIAN LETTER ICE 10473 ; [.392E.0020.0002.10473] # SHAVIAN LETTER UP 10474 ; [.392F.0020.0002.10474] # SHAVIAN LETTER OAK 10475 ; [.3930.0020.0002.10475] # SHAVIAN LETTER OOZE 10476 ; [.3931.0020.0002.10476] # SHAVIAN LETTER OIL 10477 ; [.3932.0020.0002.10477] # SHAVIAN LETTER AWE 10478 ; [.3933.0020.0002.10478] # SHAVIAN LETTER ARE 10479 ; [.3934.0020.0002.10479] # SHAVIAN LETTER OR 1047A ; [.3935.0020.0002.1047A] # SHAVIAN LETTER AIR 1047B ; [.3936.0020.0002.1047B] # SHAVIAN LETTER ERR 1047C ; [.3937.0020.0002.1047C] # SHAVIAN LETTER ARRAY 1047D ; [.3938.0020.0002.1047D] # SHAVIAN LETTER EAR 1047E ; [.3939.0020.0002.1047E] # SHAVIAN LETTER IAN 1047F ; [.393A.0020.0002.1047F] # SHAVIAN LETTER YEW 10480 ; [.393B.0020.0002.10480] # OSMANYA LETTER ALEF 10481 ; [.393C.0020.0002.10481] # OSMANYA LETTER BA 10482 ; [.393D.0020.0002.10482] # OSMANYA LETTER TA 10483 ; [.393E.0020.0002.10483] # OSMANYA LETTER JA 10484 ; [.393F.0020.0002.10484] # OSMANYA LETTER XA 10485 ; [.3940.0020.0002.10485] # OSMANYA LETTER KHA 10486 ; [.3941.0020.0002.10486] # OSMANYA LETTER DEEL 10487 ; [.3942.0020.0002.10487] # OSMANYA LETTER RA 10488 ; [.3943.0020.0002.10488] # OSMANYA LETTER SA 10489 ; [.3944.0020.0002.10489] # OSMANYA LETTER SHIIN 1048A ; [.3945.0020.0002.1048A] # OSMANYA LETTER DHA 1048B ; [.3946.0020.0002.1048B] # OSMANYA LETTER CAYN 1048C ; [.3947.0020.0002.1048C] # OSMANYA LETTER GA 1048D ; [.3948.0020.0002.1048D] # OSMANYA LETTER FA 1048E ; [.3949.0020.0002.1048E] # OSMANYA LETTER QAAF 1048F ; [.394A.0020.0002.1048F] # OSMANYA LETTER KAAF 10490 ; [.394B.0020.0002.10490] # OSMANYA LETTER LAAN 10491 ; [.394C.0020.0002.10491] # OSMANYA LETTER MIIN 10492 ; [.394D.0020.0002.10492] # OSMANYA LETTER NUUN 10493 ; [.394E.0020.0002.10493] # OSMANYA LETTER WAW 10494 ; [.394F.0020.0002.10494] # OSMANYA LETTER HA 10495 ; [.3950.0020.0002.10495] # OSMANYA LETTER YA 10496 ; [.3951.0020.0002.10496] # OSMANYA LETTER A 10497 ; [.3952.0020.0002.10497] # OSMANYA LETTER E 10498 ; [.3953.0020.0002.10498] # OSMANYA LETTER I 10499 ; [.3954.0020.0002.10499] # OSMANYA LETTER O 1049A ; [.3955.0020.0002.1049A] # OSMANYA LETTER U 1049B ; [.3956.0020.0002.1049B] # OSMANYA LETTER AA 1049C ; [.3957.0020.0002.1049C] # OSMANYA LETTER EE 1049D ; [.3958.0020.0002.1049D] # OSMANYA LETTER OO 110D0 ; [.3959.0020.0002.110D0] # SORA SOMPENG LETTER SAH 110D1 ; [.395A.0020.0002.110D1] # SORA SOMPENG LETTER TAH 110D2 ; [.395B.0020.0002.110D2] # SORA SOMPENG LETTER BAH 110D3 ; [.395C.0020.0002.110D3] # SORA SOMPENG LETTER CAH 110D4 ; [.395D.0020.0002.110D4] # SORA SOMPENG LETTER DAH 110D5 ; [.395E.0020.0002.110D5] # SORA SOMPENG LETTER GAH 110D6 ; [.395F.0020.0002.110D6] # SORA SOMPENG LETTER MAH 110D7 ; [.3960.0020.0002.110D7] # SORA SOMPENG LETTER NGAH 110D8 ; [.3961.0020.0002.110D8] # SORA SOMPENG LETTER LAH 110D9 ; [.3962.0020.0002.110D9] # SORA SOMPENG LETTER NAH 110DA ; [.3963.0020.0002.110DA] # SORA SOMPENG LETTER VAH 110DB ; [.3964.0020.0002.110DB] # SORA SOMPENG LETTER PAH 110DC ; [.3965.0020.0002.110DC] # SORA SOMPENG LETTER YAH 110DD ; [.3966.0020.0002.110DD] # SORA SOMPENG LETTER RAH 110DE ; [.3967.0020.0002.110DE] # SORA SOMPENG LETTER HAH 110DF ; [.3968.0020.0002.110DF] # SORA SOMPENG LETTER KAH 110E0 ; [.3969.0020.0002.110E0] # SORA SOMPENG LETTER JAH 110E1 ; [.396A.0020.0002.110E1] # SORA SOMPENG LETTER NYAH 110E2 ; [.396B.0020.0002.110E2] # SORA SOMPENG LETTER AH 110E3 ; [.396C.0020.0002.110E3] # SORA SOMPENG LETTER EEH 110E4 ; [.396D.0020.0002.110E4] # SORA SOMPENG LETTER IH 110E5 ; [.396E.0020.0002.110E5] # SORA SOMPENG LETTER UH 110E6 ; [.396F.0020.0002.110E6] # SORA SOMPENG LETTER OH 110E7 ; [.3970.0020.0002.110E7] # SORA SOMPENG LETTER EH 110E8 ; [.3971.0020.0002.110E8] # SORA SOMPENG LETTER MAE 10000 ; [.3972.0020.0002.10000] # LINEAR B SYLLABLE B008 A 10001 ; [.3973.0020.0002.10001] # LINEAR B SYLLABLE B038 E 10002 ; [.3974.0020.0002.10002] # LINEAR B SYLLABLE B028 I 10003 ; [.3975.0020.0002.10003] # LINEAR B SYLLABLE B061 O 10004 ; [.3976.0020.0002.10004] # LINEAR B SYLLABLE B010 U 10005 ; [.3977.0020.0002.10005] # LINEAR B SYLLABLE B001 DA 10006 ; [.3978.0020.0002.10006] # LINEAR B SYLLABLE B045 DE 10007 ; [.3979.0020.0002.10007] # LINEAR B SYLLABLE B007 DI 10008 ; [.397A.0020.0002.10008] # LINEAR B SYLLABLE B014 DO 10009 ; [.397B.0020.0002.10009] # LINEAR B SYLLABLE B051 DU 1000A ; [.397C.0020.0002.1000A] # LINEAR B SYLLABLE B057 JA 1000B ; [.397D.0020.0002.1000B] # LINEAR B SYLLABLE B046 JE 1000D ; [.397E.0020.0002.1000D] # LINEAR B SYLLABLE B036 JO 1000E ; [.397F.0020.0002.1000E] # LINEAR B SYLLABLE B065 JU 1000F ; [.3980.0020.0002.1000F] # LINEAR B SYLLABLE B077 KA 10010 ; [.3981.0020.0002.10010] # LINEAR B SYLLABLE B044 KE 10011 ; [.3982.0020.0002.10011] # LINEAR B SYLLABLE B067 KI 10012 ; [.3983.0020.0002.10012] # LINEAR B SYLLABLE B070 KO 10013 ; [.3984.0020.0002.10013] # LINEAR B SYLLABLE B081 KU 10014 ; [.3985.0020.0002.10014] # LINEAR B SYLLABLE B080 MA 10015 ; [.3986.0020.0002.10015] # LINEAR B SYLLABLE B013 ME 10016 ; [.3987.0020.0002.10016] # LINEAR B SYLLABLE B073 MI 10017 ; [.3988.0020.0002.10017] # LINEAR B SYLLABLE B015 MO 10018 ; [.3989.0020.0002.10018] # LINEAR B SYLLABLE B023 MU 10019 ; [.398A.0020.0002.10019] # LINEAR B SYLLABLE B006 NA 1001A ; [.398B.0020.0002.1001A] # LINEAR B SYLLABLE B024 NE 1001B ; [.398C.0020.0002.1001B] # LINEAR B SYLLABLE B030 NI 1001C ; [.398D.0020.0002.1001C] # LINEAR B SYLLABLE B052 NO 1001D ; [.398E.0020.0002.1001D] # LINEAR B SYLLABLE B055 NU 1001E ; [.398F.0020.0002.1001E] # LINEAR B SYLLABLE B003 PA 1001F ; [.3990.0020.0002.1001F] # LINEAR B SYLLABLE B072 PE 10020 ; [.3991.0020.0002.10020] # LINEAR B SYLLABLE B039 PI 10021 ; [.3992.0020.0002.10021] # LINEAR B SYLLABLE B011 PO 10022 ; [.3993.0020.0002.10022] # LINEAR B SYLLABLE B050 PU 10023 ; [.3994.0020.0002.10023] # LINEAR B SYLLABLE B016 QA 10024 ; [.3995.0020.0002.10024] # LINEAR B SYLLABLE B078 QE 10025 ; [.3996.0020.0002.10025] # LINEAR B SYLLABLE B021 QI 10026 ; [.3997.0020.0002.10026] # LINEAR B SYLLABLE B032 QO 10028 ; [.3998.0020.0002.10028] # LINEAR B SYLLABLE B060 RA 10029 ; [.3999.0020.0002.10029] # LINEAR B SYLLABLE B027 RE 1002A ; [.399A.0020.0002.1002A] # LINEAR B SYLLABLE B053 RI 1002B ; [.399B.0020.0002.1002B] # LINEAR B SYLLABLE B002 RO 1002C ; [.399C.0020.0002.1002C] # LINEAR B SYLLABLE B026 RU 1002D ; [.399D.0020.0002.1002D] # LINEAR B SYLLABLE B031 SA 1002E ; [.399E.0020.0002.1002E] # LINEAR B SYLLABLE B009 SE 1002F ; [.399F.0020.0002.1002F] # LINEAR B SYLLABLE B041 SI 10030 ; [.39A0.0020.0002.10030] # LINEAR B SYLLABLE B012 SO 10031 ; [.39A1.0020.0002.10031] # LINEAR B SYLLABLE B058 SU 10032 ; [.39A2.0020.0002.10032] # LINEAR B SYLLABLE B059 TA 10033 ; [.39A3.0020.0002.10033] # LINEAR B SYLLABLE B004 TE 10034 ; [.39A4.0020.0002.10034] # LINEAR B SYLLABLE B037 TI 10035 ; [.39A5.0020.0002.10035] # LINEAR B SYLLABLE B005 TO 10036 ; [.39A6.0020.0002.10036] # LINEAR B SYLLABLE B069 TU 10037 ; [.39A7.0020.0002.10037] # LINEAR B SYLLABLE B054 WA 10038 ; [.39A8.0020.0002.10038] # LINEAR B SYLLABLE B075 WE 10039 ; [.39A9.0020.0002.10039] # LINEAR B SYLLABLE B040 WI 1003A ; [.39AA.0020.0002.1003A] # LINEAR B SYLLABLE B042 WO 1003C ; [.39AB.0020.0002.1003C] # LINEAR B SYLLABLE B017 ZA 1003D ; [.39AC.0020.0002.1003D] # LINEAR B SYLLABLE B074 ZE 1003F ; [.39AD.0020.0002.1003F] # LINEAR B SYLLABLE B020 ZO 10040 ; [.39AE.0020.0002.10040] # LINEAR B SYLLABLE B025 A2 10041 ; [.39AF.0020.0002.10041] # LINEAR B SYLLABLE B043 A3 10042 ; [.39B0.0020.0002.10042] # LINEAR B SYLLABLE B085 AU 10043 ; [.39B1.0020.0002.10043] # LINEAR B SYLLABLE B071 DWE 10044 ; [.39B2.0020.0002.10044] # LINEAR B SYLLABLE B090 DWO 10045 ; [.39B3.0020.0002.10045] # LINEAR B SYLLABLE B048 NWA 10046 ; [.39B4.0020.0002.10046] # LINEAR B SYLLABLE B029 PU2 10047 ; [.39B5.0020.0002.10047] # LINEAR B SYLLABLE B062 PTE 10048 ; [.39B6.0020.0002.10048] # LINEAR B SYLLABLE B076 RA2 10049 ; [.39B7.0020.0002.10049] # LINEAR B SYLLABLE B033 RA3 1004A ; [.39B8.0020.0002.1004A] # LINEAR B SYLLABLE B068 RO2 1004B ; [.39B9.0020.0002.1004B] # LINEAR B SYLLABLE B066 TA2 1004C ; [.39BA.0020.0002.1004C] # LINEAR B SYLLABLE B087 TWE 1004D ; [.39BB.0020.0002.1004D] # LINEAR B SYLLABLE B091 TWO 10050 ; [.39BC.0020.0002.10050] # LINEAR B SYMBOL B018 10051 ; [.39BD.0020.0002.10051] # LINEAR B SYMBOL B019 10052 ; [.39BE.0020.0002.10052] # LINEAR B SYMBOL B022 10053 ; [.39BF.0020.0002.10053] # LINEAR B SYMBOL B034 10054 ; [.39C0.0020.0002.10054] # LINEAR B SYMBOL B047 10055 ; [.39C1.0020.0002.10055] # LINEAR B SYMBOL B049 10056 ; [.39C2.0020.0002.10056] # LINEAR B SYMBOL B056 10057 ; [.39C3.0020.0002.10057] # LINEAR B SYMBOL B063 10058 ; [.39C4.0020.0002.10058] # LINEAR B SYMBOL B064 10059 ; [.39C5.0020.0002.10059] # LINEAR B SYMBOL B079 1005A ; [.39C6.0020.0002.1005A] # LINEAR B SYMBOL B082 1005B ; [.39C7.0020.0002.1005B] # LINEAR B SYMBOL B083 1005C ; [.39C8.0020.0002.1005C] # LINEAR B SYMBOL B086 1005D ; [.39C9.0020.0002.1005D] # LINEAR B SYMBOL B089 10080 ; [.39CA.0020.0002.10080] # LINEAR B IDEOGRAM B100 MAN 10081 ; [.39CB.0020.0002.10081] # LINEAR B IDEOGRAM B102 WOMAN 10082 ; [.39CC.0020.0002.10082] # LINEAR B IDEOGRAM B104 DEER 10083 ; [.39CD.0020.0002.10083] # LINEAR B IDEOGRAM B105 EQUID 10084 ; [.39CE.0020.0002.10084] # LINEAR B IDEOGRAM B105F MARE 10085 ; [.39CF.0020.0002.10085] # LINEAR B IDEOGRAM B105M STALLION 10086 ; [.39D0.0020.0002.10086] # LINEAR B IDEOGRAM B106F EWE 10087 ; [.39D1.0020.0002.10087] # LINEAR B IDEOGRAM B106M RAM 10088 ; [.39D2.0020.0002.10088] # LINEAR B IDEOGRAM B107F SHE-GOAT 10089 ; [.39D3.0020.0002.10089] # LINEAR B IDEOGRAM B107M HE-GOAT 1008A ; [.39D4.0020.0002.1008A] # LINEAR B IDEOGRAM B108F SOW 1008B ; [.39D5.0020.0002.1008B] # LINEAR B IDEOGRAM B108M BOAR 1008C ; [.39D6.0020.0002.1008C] # LINEAR B IDEOGRAM B109F COW 1008D ; [.39D7.0020.0002.1008D] # LINEAR B IDEOGRAM B109M BULL 1008E ; [.39D8.0020.0002.1008E] # LINEAR B IDEOGRAM B120 WHEAT 1008F ; [.39D9.0020.0002.1008F] # LINEAR B IDEOGRAM B121 BARLEY 10090 ; [.39DA.0020.0002.10090] # LINEAR B IDEOGRAM B122 OLIVE 10091 ; [.39DB.0020.0002.10091] # LINEAR B IDEOGRAM B123 SPICE 10092 ; [.39DC.0020.0002.10092] # LINEAR B IDEOGRAM B125 CYPERUS 10093 ; [.39DD.0020.0002.10093] # LINEAR B MONOGRAM B127 KAPO 10094 ; [.39DE.0020.0002.10094] # LINEAR B MONOGRAM B128 KANAKO 10095 ; [.39DF.0020.0002.10095] # LINEAR B IDEOGRAM B130 OIL 10096 ; [.39E0.0020.0002.10096] # LINEAR B IDEOGRAM B131 WINE 10097 ; [.39E1.0020.0002.10097] # LINEAR B IDEOGRAM B132 10098 ; [.39E2.0020.0002.10098] # LINEAR B MONOGRAM B133 AREPA 10099 ; [.39E3.0020.0002.10099] # LINEAR B MONOGRAM B135 MERI 1009A ; [.39E4.0020.0002.1009A] # LINEAR B IDEOGRAM B140 BRONZE 1009B ; [.39E5.0020.0002.1009B] # LINEAR B IDEOGRAM B141 GOLD 1009C ; [.39E6.0020.0002.1009C] # LINEAR B IDEOGRAM B142 1009D ; [.39E7.0020.0002.1009D] # LINEAR B IDEOGRAM B145 WOOL 1009E ; [.39E8.0020.0002.1009E] # LINEAR B IDEOGRAM B146 1009F ; [.39E9.0020.0002.1009F] # LINEAR B IDEOGRAM B150 100A0 ; [.39EA.0020.0002.100A0] # LINEAR B IDEOGRAM B151 HORN 100A1 ; [.39EB.0020.0002.100A1] # LINEAR B IDEOGRAM B152 100A2 ; [.39EC.0020.0002.100A2] # LINEAR B IDEOGRAM B153 100A3 ; [.39ED.0020.0002.100A3] # LINEAR B IDEOGRAM B154 100A4 ; [.39EE.0020.0002.100A4] # LINEAR B MONOGRAM B156 TURO2 100A5 ; [.39EF.0020.0002.100A5] # LINEAR B IDEOGRAM B157 100A6 ; [.39F0.0020.0002.100A6] # LINEAR B IDEOGRAM B158 100A7 ; [.39F1.0020.0002.100A7] # LINEAR B IDEOGRAM B159 CLOTH 100A8 ; [.39F2.0020.0002.100A8] # LINEAR B IDEOGRAM B160 100A9 ; [.39F3.0020.0002.100A9] # LINEAR B IDEOGRAM B161 100AA ; [.39F4.0020.0002.100AA] # LINEAR B IDEOGRAM B162 GARMENT 100AB ; [.39F5.0020.0002.100AB] # LINEAR B IDEOGRAM B163 ARMOUR 100AC ; [.39F6.0020.0002.100AC] # LINEAR B IDEOGRAM B164 100AD ; [.39F7.0020.0002.100AD] # LINEAR B IDEOGRAM B165 100AE ; [.39F8.0020.0002.100AE] # LINEAR B IDEOGRAM B166 100AF ; [.39F9.0020.0002.100AF] # LINEAR B IDEOGRAM B167 100B0 ; [.39FA.0020.0002.100B0] # LINEAR B IDEOGRAM B168 100B1 ; [.39FB.0020.0002.100B1] # LINEAR B IDEOGRAM B169 100B2 ; [.39FC.0020.0002.100B2] # LINEAR B IDEOGRAM B170 100B3 ; [.39FD.0020.0002.100B3] # LINEAR B IDEOGRAM B171 100B4 ; [.39FE.0020.0002.100B4] # LINEAR B IDEOGRAM B172 100B5 ; [.39FF.0020.0002.100B5] # LINEAR B IDEOGRAM B173 MONTH 100B6 ; [.3A00.0020.0002.100B6] # LINEAR B IDEOGRAM B174 100B7 ; [.3A01.0020.0002.100B7] # LINEAR B IDEOGRAM B176 TREE 100B8 ; [.3A02.0020.0002.100B8] # LINEAR B IDEOGRAM B177 100B9 ; [.3A03.0020.0002.100B9] # LINEAR B IDEOGRAM B178 100BA ; [.3A04.0020.0002.100BA] # LINEAR B IDEOGRAM B179 100BB ; [.3A05.0020.0002.100BB] # LINEAR B IDEOGRAM B180 100BC ; [.3A06.0020.0002.100BC] # LINEAR B IDEOGRAM B181 100BD ; [.3A07.0020.0002.100BD] # LINEAR B IDEOGRAM B182 100BE ; [.3A08.0020.0002.100BE] # LINEAR B IDEOGRAM B183 100BF ; [.3A09.0020.0002.100BF] # LINEAR B IDEOGRAM B184 100C0 ; [.3A0A.0020.0002.100C0] # LINEAR B IDEOGRAM B185 100C1 ; [.3A0B.0020.0002.100C1] # LINEAR B IDEOGRAM B189 100C2 ; [.3A0C.0020.0002.100C2] # LINEAR B IDEOGRAM B190 100C3 ; [.3A0D.0020.0002.100C3] # LINEAR B IDEOGRAM B191 HELMET 100C4 ; [.3A0E.0020.0002.100C4] # LINEAR B IDEOGRAM B220 FOOTSTOOL 100C5 ; [.3A0F.0020.0002.100C5] # LINEAR B IDEOGRAM B225 BATHTUB 100C6 ; [.3A10.0020.0002.100C6] # LINEAR B IDEOGRAM B230 SPEAR 100C7 ; [.3A11.0020.0002.100C7] # LINEAR B IDEOGRAM B231 ARROW 100C8 ; [.3A12.0020.0002.100C8] # LINEAR B IDEOGRAM B232 100C9 ; [.3A13.0020.0002.100C9] # LINEAR B IDEOGRAM B233 SWORD 100CA ; [.3A14.0020.0002.100CA] # LINEAR B IDEOGRAM B234 100CB ; [.3A15.0020.0002.100CB] # LINEAR B IDEOGRAM B236 100CC ; [.3A16.0020.0002.100CC] # LINEAR B IDEOGRAM B240 WHEELED CHARIOT 100CD ; [.3A17.0020.0002.100CD] # LINEAR B IDEOGRAM B241 CHARIOT 100CE ; [.3A18.0020.0002.100CE] # LINEAR B IDEOGRAM B242 CHARIOT FRAME 100CF ; [.3A19.0020.0002.100CF] # LINEAR B IDEOGRAM B243 WHEEL 100D0 ; [.3A1A.0020.0002.100D0] # LINEAR B IDEOGRAM B245 100D1 ; [.3A1B.0020.0002.100D1] # LINEAR B IDEOGRAM B246 100D2 ; [.3A1C.0020.0002.100D2] # LINEAR B MONOGRAM B247 DIPTE 100D3 ; [.3A1D.0020.0002.100D3] # LINEAR B IDEOGRAM B248 100D4 ; [.3A1E.0020.0002.100D4] # LINEAR B IDEOGRAM B249 100D5 ; [.3A1F.0020.0002.100D5] # LINEAR B IDEOGRAM B251 100D6 ; [.3A20.0020.0002.100D6] # LINEAR B IDEOGRAM B252 100D7 ; [.3A21.0020.0002.100D7] # LINEAR B IDEOGRAM B253 100D8 ; [.3A22.0020.0002.100D8] # LINEAR B IDEOGRAM B254 DART 100D9 ; [.3A23.0020.0002.100D9] # LINEAR B IDEOGRAM B255 100DA ; [.3A24.0020.0002.100DA] # LINEAR B IDEOGRAM B256 100DB ; [.3A25.0020.0002.100DB] # LINEAR B IDEOGRAM B257 100DC ; [.3A26.0020.0002.100DC] # LINEAR B IDEOGRAM B258 100DD ; [.3A27.0020.0002.100DD] # LINEAR B IDEOGRAM B259 100DE ; [.3A28.0020.0002.100DE] # LINEAR B IDEOGRAM VESSEL B155 100DF ; [.3A29.0020.0002.100DF] # LINEAR B IDEOGRAM VESSEL B200 100E0 ; [.3A2A.0020.0002.100E0] # LINEAR B IDEOGRAM VESSEL B201 100E1 ; [.3A2B.0020.0002.100E1] # LINEAR B IDEOGRAM VESSEL B202 100E2 ; [.3A2C.0020.0002.100E2] # LINEAR B IDEOGRAM VESSEL B203 100E3 ; [.3A2D.0020.0002.100E3] # LINEAR B IDEOGRAM VESSEL B204 100E4 ; [.3A2E.0020.0002.100E4] # LINEAR B IDEOGRAM VESSEL B205 100E5 ; [.3A2F.0020.0002.100E5] # LINEAR B IDEOGRAM VESSEL B206 100E6 ; [.3A30.0020.0002.100E6] # LINEAR B IDEOGRAM VESSEL B207 100E7 ; [.3A31.0020.0002.100E7] # LINEAR B IDEOGRAM VESSEL B208 100E8 ; [.3A32.0020.0002.100E8] # LINEAR B IDEOGRAM VESSEL B209 100E9 ; [.3A33.0020.0002.100E9] # LINEAR B IDEOGRAM VESSEL B210 100EA ; [.3A34.0020.0002.100EA] # LINEAR B IDEOGRAM VESSEL B211 100EB ; [.3A35.0020.0002.100EB] # LINEAR B IDEOGRAM VESSEL B212 100EC ; [.3A36.0020.0002.100EC] # LINEAR B IDEOGRAM VESSEL B213 100ED ; [.3A37.0020.0002.100ED] # LINEAR B IDEOGRAM VESSEL B214 100EE ; [.3A38.0020.0002.100EE] # LINEAR B IDEOGRAM VESSEL B215 100EF ; [.3A39.0020.0002.100EF] # LINEAR B IDEOGRAM VESSEL B216 100F0 ; [.3A3A.0020.0002.100F0] # LINEAR B IDEOGRAM VESSEL B217 100F1 ; [.3A3B.0020.0002.100F1] # LINEAR B IDEOGRAM VESSEL B218 100F2 ; [.3A3C.0020.0002.100F2] # LINEAR B IDEOGRAM VESSEL B219 100F3 ; [.3A3D.0020.0002.100F3] # LINEAR B IDEOGRAM VESSEL B221 100F4 ; [.3A3E.0020.0002.100F4] # LINEAR B IDEOGRAM VESSEL B222 100F5 ; [.3A3F.0020.0002.100F5] # LINEAR B IDEOGRAM VESSEL B226 100F6 ; [.3A40.0020.0002.100F6] # LINEAR B IDEOGRAM VESSEL B227 100F7 ; [.3A41.0020.0002.100F7] # LINEAR B IDEOGRAM VESSEL B228 100F8 ; [.3A42.0020.0002.100F8] # LINEAR B IDEOGRAM VESSEL B229 100F9 ; [.3A43.0020.0002.100F9] # LINEAR B IDEOGRAM VESSEL B250 100FA ; [.3A44.0020.0002.100FA] # LINEAR B IDEOGRAM VESSEL B305 10800 ; [.3A45.0020.0002.10800] # CYPRIOT SYLLABLE A 10801 ; [.3A46.0020.0002.10801] # CYPRIOT SYLLABLE E 10802 ; [.3A47.0020.0002.10802] # CYPRIOT SYLLABLE I 10803 ; [.3A48.0020.0002.10803] # CYPRIOT SYLLABLE O 10804 ; [.3A49.0020.0002.10804] # CYPRIOT SYLLABLE U 10805 ; [.3A4A.0020.0002.10805] # CYPRIOT SYLLABLE JA 10808 ; [.3A4B.0020.0002.10808] # CYPRIOT SYLLABLE JO 1080A ; [.3A4C.0020.0002.1080A] # CYPRIOT SYLLABLE KA 1080B ; [.3A4D.0020.0002.1080B] # CYPRIOT SYLLABLE KE 1080C ; [.3A4E.0020.0002.1080C] # CYPRIOT SYLLABLE KI 1080D ; [.3A4F.0020.0002.1080D] # CYPRIOT SYLLABLE KO 1080E ; [.3A50.0020.0002.1080E] # CYPRIOT SYLLABLE KU 1080F ; [.3A51.0020.0002.1080F] # CYPRIOT SYLLABLE LA 10810 ; [.3A52.0020.0002.10810] # CYPRIOT SYLLABLE LE 10811 ; [.3A53.0020.0002.10811] # CYPRIOT SYLLABLE LI 10812 ; [.3A54.0020.0002.10812] # CYPRIOT SYLLABLE LO 10813 ; [.3A55.0020.0002.10813] # CYPRIOT SYLLABLE LU 10814 ; [.3A56.0020.0002.10814] # CYPRIOT SYLLABLE MA 10815 ; [.3A57.0020.0002.10815] # CYPRIOT SYLLABLE ME 10816 ; [.3A58.0020.0002.10816] # CYPRIOT SYLLABLE MI 10817 ; [.3A59.0020.0002.10817] # CYPRIOT SYLLABLE MO 10818 ; [.3A5A.0020.0002.10818] # CYPRIOT SYLLABLE MU 10819 ; [.3A5B.0020.0002.10819] # CYPRIOT SYLLABLE NA 1081A ; [.3A5C.0020.0002.1081A] # CYPRIOT SYLLABLE NE 1081B ; [.3A5D.0020.0002.1081B] # CYPRIOT SYLLABLE NI 1081C ; [.3A5E.0020.0002.1081C] # CYPRIOT SYLLABLE NO 1081D ; [.3A5F.0020.0002.1081D] # CYPRIOT SYLLABLE NU 1081E ; [.3A60.0020.0002.1081E] # CYPRIOT SYLLABLE PA 1081F ; [.3A61.0020.0002.1081F] # CYPRIOT SYLLABLE PE 10820 ; [.3A62.0020.0002.10820] # CYPRIOT SYLLABLE PI 10821 ; [.3A63.0020.0002.10821] # CYPRIOT SYLLABLE PO 10822 ; [.3A64.0020.0002.10822] # CYPRIOT SYLLABLE PU 10823 ; [.3A65.0020.0002.10823] # CYPRIOT SYLLABLE RA 10824 ; [.3A66.0020.0002.10824] # CYPRIOT SYLLABLE RE 10825 ; [.3A67.0020.0002.10825] # CYPRIOT SYLLABLE RI 10826 ; [.3A68.0020.0002.10826] # CYPRIOT SYLLABLE RO 10827 ; [.3A69.0020.0002.10827] # CYPRIOT SYLLABLE RU 10828 ; [.3A6A.0020.0002.10828] # CYPRIOT SYLLABLE SA 10829 ; [.3A6B.0020.0002.10829] # CYPRIOT SYLLABLE SE 1082A ; [.3A6C.0020.0002.1082A] # CYPRIOT SYLLABLE SI 1082B ; [.3A6D.0020.0002.1082B] # CYPRIOT SYLLABLE SO 1082C ; [.3A6E.0020.0002.1082C] # CYPRIOT SYLLABLE SU 1082D ; [.3A6F.0020.0002.1082D] # CYPRIOT SYLLABLE TA 1082E ; [.3A70.0020.0002.1082E] # CYPRIOT SYLLABLE TE 1082F ; [.3A71.0020.0002.1082F] # CYPRIOT SYLLABLE TI 10830 ; [.3A72.0020.0002.10830] # CYPRIOT SYLLABLE TO 10831 ; [.3A73.0020.0002.10831] # CYPRIOT SYLLABLE TU 10832 ; [.3A74.0020.0002.10832] # CYPRIOT SYLLABLE WA 10833 ; [.3A75.0020.0002.10833] # CYPRIOT SYLLABLE WE 10834 ; [.3A76.0020.0002.10834] # CYPRIOT SYLLABLE WI 10835 ; [.3A77.0020.0002.10835] # CYPRIOT SYLLABLE WO 10837 ; [.3A78.0020.0002.10837] # CYPRIOT SYLLABLE XA 10838 ; [.3A79.0020.0002.10838] # CYPRIOT SYLLABLE XE 1083C ; [.3A7A.0020.0002.1083C] # CYPRIOT SYLLABLE ZA 1083F ; [.3A7B.0020.0002.1083F] # CYPRIOT SYLLABLE ZO 10A60 ; [.3A7C.0020.0002.10A60] # OLD SOUTH ARABIAN LETTER HE 10A61 ; [.3A7D.0020.0002.10A61] # OLD SOUTH ARABIAN LETTER LAMEDH 10A62 ; [.3A7E.0020.0002.10A62] # OLD SOUTH ARABIAN LETTER HETH 10A63 ; [.3A7F.0020.0002.10A63] # OLD SOUTH ARABIAN LETTER MEM 10A64 ; [.3A80.0020.0002.10A64] # OLD SOUTH ARABIAN LETTER QOPH 10A65 ; [.3A81.0020.0002.10A65] # OLD SOUTH ARABIAN LETTER WAW 10A66 ; [.3A82.0020.0002.10A66] # OLD SOUTH ARABIAN LETTER SHIN 10A67 ; [.3A83.0020.0002.10A67] # OLD SOUTH ARABIAN LETTER RESH 10A68 ; [.3A84.0020.0002.10A68] # OLD SOUTH ARABIAN LETTER BETH 10A69 ; [.3A85.0020.0002.10A69] # OLD SOUTH ARABIAN LETTER TAW 10A6A ; [.3A86.0020.0002.10A6A] # OLD SOUTH ARABIAN LETTER SAT 10A6B ; [.3A87.0020.0002.10A6B] # OLD SOUTH ARABIAN LETTER KAPH 10A6C ; [.3A88.0020.0002.10A6C] # OLD SOUTH ARABIAN LETTER NUN 10A6D ; [.3A89.0020.0002.10A6D] # OLD SOUTH ARABIAN LETTER KHETH 10A6E ; [.3A8A.0020.0002.10A6E] # OLD SOUTH ARABIAN LETTER SADHE 10A6F ; [.3A8B.0020.0002.10A6F] # OLD SOUTH ARABIAN LETTER SAMEKH 10A70 ; [.3A8C.0020.0002.10A70] # OLD SOUTH ARABIAN LETTER FE 10A71 ; [.3A8D.0020.0002.10A71] # OLD SOUTH ARABIAN LETTER ALEF 10A72 ; [.3A8E.0020.0002.10A72] # OLD SOUTH ARABIAN LETTER AYN 10A73 ; [.3A8F.0020.0002.10A73] # OLD SOUTH ARABIAN LETTER DHADHE 10A74 ; [.3A90.0020.0002.10A74] # OLD SOUTH ARABIAN LETTER GIMEL 10A75 ; [.3A91.0020.0002.10A75] # OLD SOUTH ARABIAN LETTER DALETH 10A76 ; [.3A92.0020.0002.10A76] # OLD SOUTH ARABIAN LETTER GHAYN 10A77 ; [.3A93.0020.0002.10A77] # OLD SOUTH ARABIAN LETTER TETH 10A78 ; [.3A94.0020.0002.10A78] # OLD SOUTH ARABIAN LETTER ZAYN 10A79 ; [.3A95.0020.0002.10A79] # OLD SOUTH ARABIAN LETTER DHALETH 10A7A ; [.3A96.0020.0002.10A7A] # OLD SOUTH ARABIAN LETTER YODH 10A7B ; [.3A97.0020.0002.10A7B] # OLD SOUTH ARABIAN LETTER THAW 10A7C ; [.3A98.0020.0002.10A7C] # OLD SOUTH ARABIAN LETTER THETH 10B00 ; [.3A99.0020.0002.10B00] # AVESTAN LETTER A 10B01 ; [.3A9A.0020.0002.10B01] # AVESTAN LETTER AA 10B02 ; [.3A9B.0020.0002.10B02] # AVESTAN LETTER AO 10B03 ; [.3A9C.0020.0002.10B03] # AVESTAN LETTER AAO 10B04 ; [.3A9D.0020.0002.10B04] # AVESTAN LETTER AN 10B05 ; [.3A9E.0020.0002.10B05] # AVESTAN LETTER AAN 10B06 ; [.3A9F.0020.0002.10B06] # AVESTAN LETTER AE 10B07 ; [.3AA0.0020.0002.10B07] # AVESTAN LETTER AEE 10B08 ; [.3AA1.0020.0002.10B08] # AVESTAN LETTER E 10B09 ; [.3AA2.0020.0002.10B09] # AVESTAN LETTER EE 10B0A ; [.3AA3.0020.0002.10B0A] # AVESTAN LETTER O 10B0B ; [.3AA4.0020.0002.10B0B] # AVESTAN LETTER OO 10B0C ; [.3AA5.0020.0002.10B0C] # AVESTAN LETTER I 10B0D ; [.3AA6.0020.0002.10B0D] # AVESTAN LETTER II 10B0E ; [.3AA7.0020.0002.10B0E] # AVESTAN LETTER U 10B0F ; [.3AA8.0020.0002.10B0F] # AVESTAN LETTER UU 10B10 ; [.3AA9.0020.0002.10B10] # AVESTAN LETTER KE 10B11 ; [.3AAA.0020.0002.10B11] # AVESTAN LETTER XE 10B12 ; [.3AAB.0020.0002.10B12] # AVESTAN LETTER XYE 10B13 ; [.3AAC.0020.0002.10B13] # AVESTAN LETTER XVE 10B14 ; [.3AAD.0020.0002.10B14] # AVESTAN LETTER GE 10B15 ; [.3AAE.0020.0002.10B15] # AVESTAN LETTER GGE 10B16 ; [.3AAF.0020.0002.10B16] # AVESTAN LETTER GHE 10B17 ; [.3AB0.0020.0002.10B17] # AVESTAN LETTER CE 10B18 ; [.3AB1.0020.0002.10B18] # AVESTAN LETTER JE 10B19 ; [.3AB2.0020.0002.10B19] # AVESTAN LETTER TE 10B1A ; [.3AB3.0020.0002.10B1A] # AVESTAN LETTER THE 10B1B ; [.3AB4.0020.0002.10B1B] # AVESTAN LETTER DE 10B1C ; [.3AB5.0020.0002.10B1C] # AVESTAN LETTER DHE 10B1D ; [.3AB6.0020.0002.10B1D] # AVESTAN LETTER TTE 10B1E ; [.3AB7.0020.0002.10B1E] # AVESTAN LETTER PE 10B1F ; [.3AB8.0020.0002.10B1F] # AVESTAN LETTER FE 10B20 ; [.3AB9.0020.0002.10B20] # AVESTAN LETTER BE 10B21 ; [.3ABA.0020.0002.10B21] # AVESTAN LETTER BHE 10B22 ; [.3ABB.0020.0002.10B22] # AVESTAN LETTER NGE 10B23 ; [.3ABC.0020.0002.10B23] # AVESTAN LETTER NGYE 10B24 ; [.3ABD.0020.0002.10B24] # AVESTAN LETTER NGVE 10B25 ; [.3ABE.0020.0002.10B25] # AVESTAN LETTER NE 10B26 ; [.3ABF.0020.0002.10B26] # AVESTAN LETTER NYE 10B27 ; [.3AC0.0020.0002.10B27] # AVESTAN LETTER NNE 10B28 ; [.3AC1.0020.0002.10B28] # AVESTAN LETTER ME 10B29 ; [.3AC2.0020.0002.10B29] # AVESTAN LETTER HME 10B2A ; [.3AC3.0020.0002.10B2A] # AVESTAN LETTER YYE 10B2B ; [.3AC4.0020.0002.10B2B] # AVESTAN LETTER YE 10B2C ; [.3AC5.0020.0002.10B2C] # AVESTAN LETTER VE 10B2D ; [.3AC6.0020.0002.10B2D] # AVESTAN LETTER RE 10B2E ; [.3AC6.0020.0004.10B2E][.0000.0139.0004.10B2E] # AVESTAN LETTER LE 10B2F ; [.3AC7.0020.0002.10B2F] # AVESTAN LETTER SE 10B30 ; [.3AC8.0020.0002.10B30] # AVESTAN LETTER ZE 10B31 ; [.3AC9.0020.0002.10B31] # AVESTAN LETTER SHE 10B32 ; [.3ACA.0020.0002.10B32] # AVESTAN LETTER ZHE 10B33 ; [.3ACB.0020.0002.10B33] # AVESTAN LETTER SHYE 10B34 ; [.3ACC.0020.0002.10B34] # AVESTAN LETTER SSHE 10B35 ; [.3ACD.0020.0002.10B35] # AVESTAN LETTER HE 10840 ; [.3ACE.0020.0002.10840] # IMPERIAL ARAMAIC LETTER ALEPH 10841 ; [.3ACF.0020.0002.10841] # IMPERIAL ARAMAIC LETTER BETH 10842 ; [.3AD0.0020.0002.10842] # IMPERIAL ARAMAIC LETTER GIMEL 10843 ; [.3AD1.0020.0002.10843] # IMPERIAL ARAMAIC LETTER DALETH 10844 ; [.3AD2.0020.0002.10844] # IMPERIAL ARAMAIC LETTER HE 10845 ; [.3AD3.0020.0002.10845] # IMPERIAL ARAMAIC LETTER WAW 10846 ; [.3AD4.0020.0002.10846] # IMPERIAL ARAMAIC LETTER ZAYIN 10847 ; [.3AD5.0020.0002.10847] # IMPERIAL ARAMAIC LETTER HETH 10848 ; [.3AD6.0020.0002.10848] # IMPERIAL ARAMAIC LETTER TETH 10849 ; [.3AD7.0020.0002.10849] # IMPERIAL ARAMAIC LETTER YODH 1084A ; [.3AD8.0020.0002.1084A] # IMPERIAL ARAMAIC LETTER KAPH 1084B ; [.3AD9.0020.0002.1084B] # IMPERIAL ARAMAIC LETTER LAMEDH 1084C ; [.3ADA.0020.0002.1084C] # IMPERIAL ARAMAIC LETTER MEM 1084D ; [.3ADB.0020.0002.1084D] # IMPERIAL ARAMAIC LETTER NUN 1084E ; [.3ADC.0020.0002.1084E] # IMPERIAL ARAMAIC LETTER SAMEKH 1084F ; [.3ADD.0020.0002.1084F] # IMPERIAL ARAMAIC LETTER AYIN 10850 ; [.3ADE.0020.0002.10850] # IMPERIAL ARAMAIC LETTER PE 10851 ; [.3ADF.0020.0002.10851] # IMPERIAL ARAMAIC LETTER SADHE 10852 ; [.3AE0.0020.0002.10852] # IMPERIAL ARAMAIC LETTER QOPH 10853 ; [.3AE1.0020.0002.10853] # IMPERIAL ARAMAIC LETTER RESH 10854 ; [.3AE2.0020.0002.10854] # IMPERIAL ARAMAIC LETTER SHIN 10855 ; [.3AE3.0020.0002.10855] # IMPERIAL ARAMAIC LETTER TAW 10B40 ; [.3AE4.0020.0002.10B40] # INSCRIPTIONAL PARTHIAN LETTER ALEPH 10B41 ; [.3AE5.0020.0002.10B41] # INSCRIPTIONAL PARTHIAN LETTER BETH 10B42 ; [.3AE6.0020.0002.10B42] # INSCRIPTIONAL PARTHIAN LETTER GIMEL 10B43 ; [.3AE7.0020.0002.10B43] # INSCRIPTIONAL PARTHIAN LETTER DALETH 10B44 ; [.3AE8.0020.0002.10B44] # INSCRIPTIONAL PARTHIAN LETTER HE 10B45 ; [.3AE9.0020.0002.10B45] # INSCRIPTIONAL PARTHIAN LETTER WAW 10B46 ; [.3AEA.0020.0002.10B46] # INSCRIPTIONAL PARTHIAN LETTER ZAYIN 10B47 ; [.3AEB.0020.0002.10B47] # INSCRIPTIONAL PARTHIAN LETTER HETH 10B48 ; [.3AEC.0020.0002.10B48] # INSCRIPTIONAL PARTHIAN LETTER TETH 10B49 ; [.3AED.0020.0002.10B49] # INSCRIPTIONAL PARTHIAN LETTER YODH 10B4A ; [.3AEE.0020.0002.10B4A] # INSCRIPTIONAL PARTHIAN LETTER KAPH 10B4B ; [.3AEF.0020.0002.10B4B] # INSCRIPTIONAL PARTHIAN LETTER LAMEDH 10B4C ; [.3AF0.0020.0002.10B4C] # INSCRIPTIONAL PARTHIAN LETTER MEM 10B4D ; [.3AF1.0020.0002.10B4D] # INSCRIPTIONAL PARTHIAN LETTER NUN 10B4E ; [.3AF2.0020.0002.10B4E] # INSCRIPTIONAL PARTHIAN LETTER SAMEKH 10B4F ; [.3AF3.0020.0002.10B4F] # INSCRIPTIONAL PARTHIAN LETTER AYIN 10B50 ; [.3AF4.0020.0002.10B50] # INSCRIPTIONAL PARTHIAN LETTER PE 10B51 ; [.3AF5.0020.0002.10B51] # INSCRIPTIONAL PARTHIAN LETTER SADHE 10B52 ; [.3AF6.0020.0002.10B52] # INSCRIPTIONAL PARTHIAN LETTER QOPH 10B53 ; [.3AF7.0020.0002.10B53] # INSCRIPTIONAL PARTHIAN LETTER RESH 10B54 ; [.3AF8.0020.0002.10B54] # INSCRIPTIONAL PARTHIAN LETTER SHIN 10B55 ; [.3AF9.0020.0002.10B55] # INSCRIPTIONAL PARTHIAN LETTER TAW 10B60 ; [.3AFA.0020.0002.10B60] # INSCRIPTIONAL PAHLAVI LETTER ALEPH 10B61 ; [.3AFB.0020.0002.10B61] # INSCRIPTIONAL PAHLAVI LETTER BETH 10B62 ; [.3AFC.0020.0002.10B62] # INSCRIPTIONAL PAHLAVI LETTER GIMEL 10B63 ; [.3AFD.0020.0002.10B63] # INSCRIPTIONAL PAHLAVI LETTER DALETH 10B64 ; [.3AFE.0020.0002.10B64] # INSCRIPTIONAL PAHLAVI LETTER HE 10B65 ; [.3AFF.0020.0002.10B65] # INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH 10B66 ; [.3B00.0020.0002.10B66] # INSCRIPTIONAL PAHLAVI LETTER ZAYIN 10B67 ; [.3B01.0020.0002.10B67] # INSCRIPTIONAL PAHLAVI LETTER HETH 10B68 ; [.3B02.0020.0002.10B68] # INSCRIPTIONAL PAHLAVI LETTER TETH 10B69 ; [.3B03.0020.0002.10B69] # INSCRIPTIONAL PAHLAVI LETTER YODH 10B6A ; [.3B04.0020.0002.10B6A] # INSCRIPTIONAL PAHLAVI LETTER KAPH 10B6B ; [.3B05.0020.0002.10B6B] # INSCRIPTIONAL PAHLAVI LETTER LAMEDH 10B6C ; [.3B06.0020.0002.10B6C] # INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH 10B6D ; [.3B07.0020.0002.10B6D] # INSCRIPTIONAL PAHLAVI LETTER NUN 10B6E ; [.3B08.0020.0002.10B6E] # INSCRIPTIONAL PAHLAVI LETTER SAMEKH 10B6F ; [.3B09.0020.0002.10B6F] # INSCRIPTIONAL PAHLAVI LETTER PE 10B70 ; [.3B0A.0020.0002.10B70] # INSCRIPTIONAL PAHLAVI LETTER SADHE 10B71 ; [.3B0B.0020.0002.10B71] # INSCRIPTIONAL PAHLAVI LETTER SHIN 10B72 ; [.3B0C.0020.0002.10B72] # INSCRIPTIONAL PAHLAVI LETTER TAW 10380 ; [.3B0D.0020.0002.10380] # UGARITIC LETTER ALPA 10381 ; [.3B0E.0020.0002.10381] # UGARITIC LETTER BETA 10382 ; [.3B0F.0020.0002.10382] # UGARITIC LETTER GAMLA 10383 ; [.3B10.0020.0002.10383] # UGARITIC LETTER KHA 10384 ; [.3B11.0020.0002.10384] # UGARITIC LETTER DELTA 10385 ; [.3B12.0020.0002.10385] # UGARITIC LETTER HO 10386 ; [.3B13.0020.0002.10386] # UGARITIC LETTER WO 10387 ; [.3B14.0020.0002.10387] # UGARITIC LETTER ZETA 10388 ; [.3B15.0020.0002.10388] # UGARITIC LETTER HOTA 10389 ; [.3B16.0020.0002.10389] # UGARITIC LETTER TET 1038A ; [.3B17.0020.0002.1038A] # UGARITIC LETTER YOD 1038B ; [.3B18.0020.0002.1038B] # UGARITIC LETTER KAF 1038C ; [.3B19.0020.0002.1038C] # UGARITIC LETTER SHIN 1038D ; [.3B1A.0020.0002.1038D] # UGARITIC LETTER LAMDA 1038E ; [.3B1B.0020.0002.1038E] # UGARITIC LETTER MEM 1038F ; [.3B1C.0020.0002.1038F] # UGARITIC LETTER DHAL 10390 ; [.3B1D.0020.0002.10390] # UGARITIC LETTER NUN 10391 ; [.3B1E.0020.0002.10391] # UGARITIC LETTER ZU 10392 ; [.3B1F.0020.0002.10392] # UGARITIC LETTER SAMKA 10393 ; [.3B20.0020.0002.10393] # UGARITIC LETTER AIN 10394 ; [.3B21.0020.0002.10394] # UGARITIC LETTER PU 10395 ; [.3B22.0020.0002.10395] # UGARITIC LETTER SADE 10396 ; [.3B23.0020.0002.10396] # UGARITIC LETTER QOPA 10397 ; [.3B24.0020.0002.10397] # UGARITIC LETTER RASHA 10398 ; [.3B25.0020.0002.10398] # UGARITIC LETTER THANNA 10399 ; [.3B26.0020.0002.10399] # UGARITIC LETTER GHAIN 1039A ; [.3B27.0020.0002.1039A] # UGARITIC LETTER TO 1039B ; [.3B28.0020.0002.1039B] # UGARITIC LETTER I 1039C ; [.3B29.0020.0002.1039C] # UGARITIC LETTER U 1039D ; [.3B2A.0020.0002.1039D] # UGARITIC LETTER SSU 103A0 ; [.3B2B.0020.0002.103A0] # OLD PERSIAN SIGN A 103A1 ; [.3B2C.0020.0002.103A1] # OLD PERSIAN SIGN I 103A2 ; [.3B2D.0020.0002.103A2] # OLD PERSIAN SIGN U 103A3 ; [.3B2E.0020.0002.103A3] # OLD PERSIAN SIGN KA 103A4 ; [.3B2F.0020.0002.103A4] # OLD PERSIAN SIGN KU 103A5 ; [.3B30.0020.0002.103A5] # OLD PERSIAN SIGN GA 103A6 ; [.3B31.0020.0002.103A6] # OLD PERSIAN SIGN GU 103A7 ; [.3B32.0020.0002.103A7] # OLD PERSIAN SIGN XA 103A8 ; [.3B33.0020.0002.103A8] # OLD PERSIAN SIGN CA 103A9 ; [.3B34.0020.0002.103A9] # OLD PERSIAN SIGN JA 103AA ; [.3B35.0020.0002.103AA] # OLD PERSIAN SIGN JI 103AB ; [.3B36.0020.0002.103AB] # OLD PERSIAN SIGN TA 103AC ; [.3B37.0020.0002.103AC] # OLD PERSIAN SIGN TU 103AD ; [.3B38.0020.0002.103AD] # OLD PERSIAN SIGN DA 103AE ; [.3B39.0020.0002.103AE] # OLD PERSIAN SIGN DI 103AF ; [.3B3A.0020.0002.103AF] # OLD PERSIAN SIGN DU 103B0 ; [.3B3B.0020.0002.103B0] # OLD PERSIAN SIGN THA 103B1 ; [.3B3C.0020.0002.103B1] # OLD PERSIAN SIGN PA 103B2 ; [.3B3D.0020.0002.103B2] # OLD PERSIAN SIGN BA 103B3 ; [.3B3E.0020.0002.103B3] # OLD PERSIAN SIGN FA 103B4 ; [.3B3F.0020.0002.103B4] # OLD PERSIAN SIGN NA 103B5 ; [.3B40.0020.0002.103B5] # OLD PERSIAN SIGN NU 103B6 ; [.3B41.0020.0002.103B6] # OLD PERSIAN SIGN MA 103B7 ; [.3B42.0020.0002.103B7] # OLD PERSIAN SIGN MI 103B8 ; [.3B43.0020.0002.103B8] # OLD PERSIAN SIGN MU 103B9 ; [.3B44.0020.0002.103B9] # OLD PERSIAN SIGN YA 103BA ; [.3B45.0020.0002.103BA] # OLD PERSIAN SIGN VA 103BB ; [.3B46.0020.0002.103BB] # OLD PERSIAN SIGN VI 103BC ; [.3B47.0020.0002.103BC] # OLD PERSIAN SIGN RA 103BD ; [.3B48.0020.0002.103BD] # OLD PERSIAN SIGN RU 103BE ; [.3B49.0020.0002.103BE] # OLD PERSIAN SIGN LA 103BF ; [.3B4A.0020.0002.103BF] # OLD PERSIAN SIGN SA 103C0 ; [.3B4B.0020.0002.103C0] # OLD PERSIAN SIGN ZA 103C1 ; [.3B4C.0020.0002.103C1] # OLD PERSIAN SIGN SHA 103C2 ; [.3B4D.0020.0002.103C2] # OLD PERSIAN SIGN SSA 103C3 ; [.3B4E.0020.0002.103C3] # OLD PERSIAN SIGN HA 103C8 ; [.3B4F.0020.0002.103C8] # OLD PERSIAN SIGN AURAMAZDAA 103C9 ; [.3B50.0020.0002.103C9] # OLD PERSIAN SIGN AURAMAZDAA-2 103CA ; [.3B51.0020.0002.103CA] # OLD PERSIAN SIGN AURAMAZDAAHA 103CB ; [.3B52.0020.0002.103CB] # OLD PERSIAN SIGN XSHAAYATHIYA 103CC ; [.3B53.0020.0002.103CC] # OLD PERSIAN SIGN DAHYAAUSH 103CD ; [.3B54.0020.0002.103CD] # OLD PERSIAN SIGN DAHYAAUSH-2 103CE ; [.3B55.0020.0002.103CE] # OLD PERSIAN SIGN BAGA 103CF ; [.3B56.0020.0002.103CF] # OLD PERSIAN SIGN BUUMISH 12000 ; [.3B57.0020.0002.12000] # CUNEIFORM SIGN A 12001 ; [.3B58.0020.0002.12001] # CUNEIFORM SIGN A TIMES A 12002 ; [.3B59.0020.0002.12002] # CUNEIFORM SIGN A TIMES BAD 12003 ; [.3B5A.0020.0002.12003] # CUNEIFORM SIGN A TIMES GAN2 TENU 12004 ; [.3B5B.0020.0002.12004] # CUNEIFORM SIGN A TIMES HA 12005 ; [.3B5C.0020.0002.12005] # CUNEIFORM SIGN A TIMES IGI 12006 ; [.3B5D.0020.0002.12006] # CUNEIFORM SIGN A TIMES LAGAR GUNU 12007 ; [.3B5E.0020.0002.12007] # CUNEIFORM SIGN A TIMES MUSH 12008 ; [.3B5F.0020.0002.12008] # CUNEIFORM SIGN A TIMES SAG 12009 ; [.3B60.0020.0002.12009] # CUNEIFORM SIGN A2 1200A ; [.3B61.0020.0002.1200A] # CUNEIFORM SIGN AB 1200B ; [.3B62.0020.0002.1200B] # CUNEIFORM SIGN AB TIMES ASH2 1200C ; [.3B63.0020.0002.1200C] # CUNEIFORM SIGN AB TIMES DUN3 GUNU 1200D ; [.3B64.0020.0002.1200D] # CUNEIFORM SIGN AB TIMES GAL 1200E ; [.3B65.0020.0002.1200E] # CUNEIFORM SIGN AB TIMES GAN2 TENU 1200F ; [.3B66.0020.0002.1200F] # CUNEIFORM SIGN AB TIMES HA 12010 ; [.3B67.0020.0002.12010] # CUNEIFORM SIGN AB TIMES IGI GUNU 12011 ; [.3B68.0020.0002.12011] # CUNEIFORM SIGN AB TIMES IMIN 12012 ; [.3B69.0020.0002.12012] # CUNEIFORM SIGN AB TIMES LAGAB 12013 ; [.3B6A.0020.0002.12013] # CUNEIFORM SIGN AB TIMES SHESH 12014 ; [.3B6B.0020.0002.12014] # CUNEIFORM SIGN AB TIMES U PLUS U PLUS U 12015 ; [.3B6C.0020.0002.12015] # CUNEIFORM SIGN AB GUNU 12016 ; [.3B6D.0020.0002.12016] # CUNEIFORM SIGN AB2 12017 ; [.3B6E.0020.0002.12017] # CUNEIFORM SIGN AB2 TIMES BALAG 12018 ; [.3B6F.0020.0002.12018] # CUNEIFORM SIGN AB2 TIMES GAN2 TENU 12019 ; [.3B70.0020.0002.12019] # CUNEIFORM SIGN AB2 TIMES ME PLUS EN 1201A ; [.3B71.0020.0002.1201A] # CUNEIFORM SIGN AB2 TIMES SHA3 1201B ; [.3B72.0020.0002.1201B] # CUNEIFORM SIGN AB2 TIMES TAK4 1201C ; [.3B73.0020.0002.1201C] # CUNEIFORM SIGN AD 1201D ; [.3B74.0020.0002.1201D] # CUNEIFORM SIGN AK 1201E ; [.3B75.0020.0002.1201E] # CUNEIFORM SIGN AK TIMES ERIN2 1201F ; [.3B76.0020.0002.1201F] # CUNEIFORM SIGN AK TIMES SHITA PLUS GISH 12020 ; [.3B77.0020.0002.12020] # CUNEIFORM SIGN AL 12021 ; [.3B78.0020.0002.12021] # CUNEIFORM SIGN AL TIMES AL 12022 ; [.3B79.0020.0002.12022] # CUNEIFORM SIGN AL TIMES DIM2 12023 ; [.3B7A.0020.0002.12023] # CUNEIFORM SIGN AL TIMES GISH 12024 ; [.3B7B.0020.0002.12024] # CUNEIFORM SIGN AL TIMES HA 12025 ; [.3B7C.0020.0002.12025] # CUNEIFORM SIGN AL TIMES KAD3 12026 ; [.3B7D.0020.0002.12026] # CUNEIFORM SIGN AL TIMES KI 12027 ; [.3B7E.0020.0002.12027] # CUNEIFORM SIGN AL TIMES SHE 12028 ; [.3B7F.0020.0002.12028] # CUNEIFORM SIGN AL TIMES USH 12029 ; [.3B80.0020.0002.12029] # CUNEIFORM SIGN ALAN 1202A ; [.3B81.0020.0002.1202A] # CUNEIFORM SIGN ALEPH 1202B ; [.3B82.0020.0002.1202B] # CUNEIFORM SIGN AMAR 1202C ; [.3B83.0020.0002.1202C] # CUNEIFORM SIGN AMAR TIMES SHE 1202D ; [.3B84.0020.0002.1202D] # CUNEIFORM SIGN AN 1202E ; [.3B85.0020.0002.1202E] # CUNEIFORM SIGN AN OVER AN 1202F ; [.3B86.0020.0002.1202F] # CUNEIFORM SIGN AN THREE TIMES 12030 ; [.3B87.0020.0002.12030] # CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA 12031 ; [.3B88.0020.0002.12031] # CUNEIFORM SIGN AN PLUS NAGA SQUARED 12032 ; [.3B89.0020.0002.12032] # CUNEIFORM SIGN ANSHE 12033 ; [.3B8A.0020.0002.12033] # CUNEIFORM SIGN APIN 12034 ; [.3B8B.0020.0002.12034] # CUNEIFORM SIGN ARAD 12035 ; [.3B8C.0020.0002.12035] # CUNEIFORM SIGN ARAD TIMES KUR 12036 ; [.3B8D.0020.0002.12036] # CUNEIFORM SIGN ARKAB 12037 ; [.3B8E.0020.0002.12037] # CUNEIFORM SIGN ASAL2 12038 ; [.3B8F.0020.0002.12038] # CUNEIFORM SIGN ASH 12039 ; [.3B90.0020.0002.12039] # CUNEIFORM SIGN ASH ZIDA TENU 1203A ; [.3B91.0020.0002.1203A] # CUNEIFORM SIGN ASH KABA TENU 1203B ; [.3B92.0020.0002.1203B] # CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP 1203C ; [.3B93.0020.0002.1203C] # CUNEIFORM SIGN ASH OVER ASH OVER ASH 1203D ; [.3B94.0020.0002.1203D] # CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH 1203E ; [.3B95.0020.0002.1203E] # CUNEIFORM SIGN ASH2 1203F ; [.3B96.0020.0002.1203F] # CUNEIFORM SIGN ASHGAB 12040 ; [.3B97.0020.0002.12040] # CUNEIFORM SIGN BA 12041 ; [.3B98.0020.0002.12041] # CUNEIFORM SIGN BAD 12042 ; [.3B99.0020.0002.12042] # CUNEIFORM SIGN BAG3 12043 ; [.3B9A.0020.0002.12043] # CUNEIFORM SIGN BAHAR2 12044 ; [.3B9B.0020.0002.12044] # CUNEIFORM SIGN BAL 12045 ; [.3B9C.0020.0002.12045] # CUNEIFORM SIGN BAL OVER BAL 12046 ; [.3B9D.0020.0002.12046] # CUNEIFORM SIGN BALAG 12047 ; [.3B9E.0020.0002.12047] # CUNEIFORM SIGN BAR 12048 ; [.3B9F.0020.0002.12048] # CUNEIFORM SIGN BARA2 12049 ; [.3BA0.0020.0002.12049] # CUNEIFORM SIGN BI 1204A ; [.3BA1.0020.0002.1204A] # CUNEIFORM SIGN BI TIMES A 1204B ; [.3BA2.0020.0002.1204B] # CUNEIFORM SIGN BI TIMES GAR 1204C ; [.3BA3.0020.0002.1204C] # CUNEIFORM SIGN BI TIMES IGI GUNU 1204D ; [.3BA4.0020.0002.1204D] # CUNEIFORM SIGN BU 1204E ; [.3BA5.0020.0002.1204E] # CUNEIFORM SIGN BU OVER BU AB 1204F ; [.3BA6.0020.0002.1204F] # CUNEIFORM SIGN BU OVER BU UN 12050 ; [.3BA7.0020.0002.12050] # CUNEIFORM SIGN BU CROSSING BU 12051 ; [.3BA8.0020.0002.12051] # CUNEIFORM SIGN BULUG 12052 ; [.3BA9.0020.0002.12052] # CUNEIFORM SIGN BULUG OVER BULUG 12053 ; [.3BAA.0020.0002.12053] # CUNEIFORM SIGN BUR 12054 ; [.3BAB.0020.0002.12054] # CUNEIFORM SIGN BUR2 12055 ; [.3BAC.0020.0002.12055] # CUNEIFORM SIGN DA 12056 ; [.3BAD.0020.0002.12056] # CUNEIFORM SIGN DAG 12057 ; [.3BAE.0020.0002.12057] # CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH 12058 ; [.3BAF.0020.0002.12058] # CUNEIFORM SIGN DAG KISIM5 TIMES AMAR 12059 ; [.3BB0.0020.0002.12059] # CUNEIFORM SIGN DAG KISIM5 TIMES BALAG 1205A ; [.3BB1.0020.0002.1205A] # CUNEIFORM SIGN DAG KISIM5 TIMES BI 1205B ; [.3BB2.0020.0002.1205B] # CUNEIFORM SIGN DAG KISIM5 TIMES GA 1205C ; [.3BB3.0020.0002.1205C] # CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH 1205D ; [.3BB4.0020.0002.1205D] # CUNEIFORM SIGN DAG KISIM5 TIMES GI 1205E ; [.3BB5.0020.0002.1205E] # CUNEIFORM SIGN DAG KISIM5 TIMES GIR2 1205F ; [.3BB6.0020.0002.1205F] # CUNEIFORM SIGN DAG KISIM5 TIMES GUD 12060 ; [.3BB7.0020.0002.12060] # CUNEIFORM SIGN DAG KISIM5 TIMES HA 12061 ; [.3BB8.0020.0002.12061] # CUNEIFORM SIGN DAG KISIM5 TIMES IR 12062 ; [.3BB9.0020.0002.12062] # CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU 12063 ; [.3BBA.0020.0002.12063] # CUNEIFORM SIGN DAG KISIM5 TIMES KAK 12064 ; [.3BBB.0020.0002.12064] # CUNEIFORM SIGN DAG KISIM5 TIMES LA 12065 ; [.3BBC.0020.0002.12065] # CUNEIFORM SIGN DAG KISIM5 TIMES LU 12066 ; [.3BBD.0020.0002.12066] # CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2 12067 ; [.3BBE.0020.0002.12067] # CUNEIFORM SIGN DAG KISIM5 TIMES LUM 12068 ; [.3BBF.0020.0002.12068] # CUNEIFORM SIGN DAG KISIM5 TIMES NE 12069 ; [.3BC0.0020.0002.12069] # CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP 1206A ; [.3BC1.0020.0002.1206A] # CUNEIFORM SIGN DAG KISIM5 TIMES SI 1206B ; [.3BC2.0020.0002.1206B] # CUNEIFORM SIGN DAG KISIM5 TIMES TAK4 1206C ; [.3BC3.0020.0002.1206C] # CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2 1206D ; [.3BC4.0020.0002.1206D] # CUNEIFORM SIGN DAG KISIM5 TIMES USH 1206E ; [.3BC5.0020.0002.1206E] # CUNEIFORM SIGN DAM 1206F ; [.3BC6.0020.0002.1206F] # CUNEIFORM SIGN DAR 12070 ; [.3BC7.0020.0002.12070] # CUNEIFORM SIGN DARA3 12071 ; [.3BC8.0020.0002.12071] # CUNEIFORM SIGN DARA4 12072 ; [.3BC9.0020.0002.12072] # CUNEIFORM SIGN DI 12073 ; [.3BCA.0020.0002.12073] # CUNEIFORM SIGN DIB 12074 ; [.3BCB.0020.0002.12074] # CUNEIFORM SIGN DIM 12075 ; [.3BCC.0020.0002.12075] # CUNEIFORM SIGN DIM TIMES SHE 12076 ; [.3BCD.0020.0002.12076] # CUNEIFORM SIGN DIM2 12077 ; [.3BCE.0020.0002.12077] # CUNEIFORM SIGN DIN 12078 ; [.3BCF.0020.0002.12078] # CUNEIFORM SIGN DIN KASKAL U GUNU DISH 12079 ; [.3BD0.0020.0002.12079] # CUNEIFORM SIGN DISH 1207A ; [.3BD1.0020.0002.1207A] # CUNEIFORM SIGN DU 1207B ; [.3BD2.0020.0002.1207B] # CUNEIFORM SIGN DU OVER DU 1207C ; [.3BD3.0020.0002.1207C] # CUNEIFORM SIGN DU GUNU 1207D ; [.3BD4.0020.0002.1207D] # CUNEIFORM SIGN DU SHESHIG 1207E ; [.3BD5.0020.0002.1207E] # CUNEIFORM SIGN DUB 1207F ; [.3BD6.0020.0002.1207F] # CUNEIFORM SIGN DUB TIMES ESH2 12080 ; [.3BD7.0020.0002.12080] # CUNEIFORM SIGN DUB2 12081 ; [.3BD8.0020.0002.12081] # CUNEIFORM SIGN DUG 12082 ; [.3BD9.0020.0002.12082] # CUNEIFORM SIGN DUGUD 12083 ; [.3BDA.0020.0002.12083] # CUNEIFORM SIGN DUH 12084 ; [.3BDB.0020.0002.12084] # CUNEIFORM SIGN DUN 12085 ; [.3BDC.0020.0002.12085] # CUNEIFORM SIGN DUN3 12086 ; [.3BDD.0020.0002.12086] # CUNEIFORM SIGN DUN3 GUNU 12087 ; [.3BDE.0020.0002.12087] # CUNEIFORM SIGN DUN3 GUNU GUNU 12088 ; [.3BDF.0020.0002.12088] # CUNEIFORM SIGN DUN4 12089 ; [.3BE0.0020.0002.12089] # CUNEIFORM SIGN DUR2 1208A ; [.3BE1.0020.0002.1208A] # CUNEIFORM SIGN E 1208B ; [.3BE2.0020.0002.1208B] # CUNEIFORM SIGN E TIMES PAP 1208C ; [.3BE3.0020.0002.1208C] # CUNEIFORM SIGN E OVER E NUN OVER NUN 1208D ; [.3BE4.0020.0002.1208D] # CUNEIFORM SIGN E2 1208E ; [.3BE5.0020.0002.1208E] # CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA 1208F ; [.3BE6.0020.0002.1208F] # CUNEIFORM SIGN E2 TIMES GAR 12090 ; [.3BE7.0020.0002.12090] # CUNEIFORM SIGN E2 TIMES MI 12091 ; [.3BE8.0020.0002.12091] # CUNEIFORM SIGN E2 TIMES SAL 12092 ; [.3BE9.0020.0002.12092] # CUNEIFORM SIGN E2 TIMES SHE 12093 ; [.3BEA.0020.0002.12093] # CUNEIFORM SIGN E2 TIMES U 12094 ; [.3BEB.0020.0002.12094] # CUNEIFORM SIGN EDIN 12095 ; [.3BEC.0020.0002.12095] # CUNEIFORM SIGN EGIR 12096 ; [.3BED.0020.0002.12096] # CUNEIFORM SIGN EL 12097 ; [.3BEE.0020.0002.12097] # CUNEIFORM SIGN EN 12098 ; [.3BEF.0020.0002.12098] # CUNEIFORM SIGN EN TIMES GAN2 12099 ; [.3BF0.0020.0002.12099] # CUNEIFORM SIGN EN TIMES GAN2 TENU 1209A ; [.3BF1.0020.0002.1209A] # CUNEIFORM SIGN EN TIMES ME 1209B ; [.3BF2.0020.0002.1209B] # CUNEIFORM SIGN EN CROSSING EN 1209C ; [.3BF3.0020.0002.1209C] # CUNEIFORM SIGN EN OPPOSING EN 1209D ; [.3BF4.0020.0002.1209D] # CUNEIFORM SIGN EN SQUARED 1209E ; [.3BF5.0020.0002.1209E] # CUNEIFORM SIGN EREN 1209F ; [.3BF6.0020.0002.1209F] # CUNEIFORM SIGN ERIN2 120A0 ; [.3BF7.0020.0002.120A0] # CUNEIFORM SIGN ESH2 120A1 ; [.3BF8.0020.0002.120A1] # CUNEIFORM SIGN EZEN 120A2 ; [.3BF9.0020.0002.120A2] # CUNEIFORM SIGN EZEN TIMES A 120A3 ; [.3BFA.0020.0002.120A3] # CUNEIFORM SIGN EZEN TIMES A PLUS LAL 120A4 ; [.3BFB.0020.0002.120A4] # CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL 120A5 ; [.3BFC.0020.0002.120A5] # CUNEIFORM SIGN EZEN TIMES AN 120A6 ; [.3BFD.0020.0002.120A6] # CUNEIFORM SIGN EZEN TIMES BAD 120A7 ; [.3BFE.0020.0002.120A7] # CUNEIFORM SIGN EZEN TIMES DUN3 GUNU 120A8 ; [.3BFF.0020.0002.120A8] # CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU 120A9 ; [.3C00.0020.0002.120A9] # CUNEIFORM SIGN EZEN TIMES HA 120AA ; [.3C01.0020.0002.120AA] # CUNEIFORM SIGN EZEN TIMES HA GUNU 120AB ; [.3C02.0020.0002.120AB] # CUNEIFORM SIGN EZEN TIMES IGI GUNU 120AC ; [.3C03.0020.0002.120AC] # CUNEIFORM SIGN EZEN TIMES KASKAL 120AD ; [.3C04.0020.0002.120AD] # CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED 120AE ; [.3C05.0020.0002.120AE] # CUNEIFORM SIGN EZEN TIMES KU3 120AF ; [.3C06.0020.0002.120AF] # CUNEIFORM SIGN EZEN TIMES LA 120B0 ; [.3C07.0020.0002.120B0] # CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL 120B1 ; [.3C08.0020.0002.120B1] # CUNEIFORM SIGN EZEN TIMES LI 120B2 ; [.3C09.0020.0002.120B2] # CUNEIFORM SIGN EZEN TIMES LU 120B3 ; [.3C0A.0020.0002.120B3] # CUNEIFORM SIGN EZEN TIMES U2 120B4 ; [.3C0B.0020.0002.120B4] # CUNEIFORM SIGN EZEN TIMES UD 120B5 ; [.3C0C.0020.0002.120B5] # CUNEIFORM SIGN GA 120B6 ; [.3C0D.0020.0002.120B6] # CUNEIFORM SIGN GA GUNU 120B7 ; [.3C0E.0020.0002.120B7] # CUNEIFORM SIGN GA2 120B8 ; [.3C0F.0020.0002.120B8] # CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA 120B9 ; [.3C10.0020.0002.120B9] # CUNEIFORM SIGN GA2 TIMES A PLUS HA 120BA ; [.3C11.0020.0002.120BA] # CUNEIFORM SIGN GA2 TIMES A PLUS IGI 120BB ; [.3C12.0020.0002.120BB] # CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB 120BC ; [.3C13.0020.0002.120BC] # CUNEIFORM SIGN GA2 TIMES AN 120BD ; [.3C14.0020.0002.120BD] # CUNEIFORM SIGN GA2 TIMES ASH 120BE ; [.3C15.0020.0002.120BE] # CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL 120BF ; [.3C16.0020.0002.120BF] # CUNEIFORM SIGN GA2 TIMES BAD 120C0 ; [.3C17.0020.0002.120C0] # CUNEIFORM SIGN GA2 TIMES BAR PLUS RA 120C1 ; [.3C18.0020.0002.120C1] # CUNEIFORM SIGN GA2 TIMES BUR 120C2 ; [.3C19.0020.0002.120C2] # CUNEIFORM SIGN GA2 TIMES BUR PLUS RA 120C3 ; [.3C1A.0020.0002.120C3] # CUNEIFORM SIGN GA2 TIMES DA 120C4 ; [.3C1B.0020.0002.120C4] # CUNEIFORM SIGN GA2 TIMES DI 120C5 ; [.3C1C.0020.0002.120C5] # CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE 120C6 ; [.3C1D.0020.0002.120C6] # CUNEIFORM SIGN GA2 TIMES DUB 120C7 ; [.3C1E.0020.0002.120C7] # CUNEIFORM SIGN GA2 TIMES EL 120C8 ; [.3C1F.0020.0002.120C8] # CUNEIFORM SIGN GA2 TIMES EL PLUS LA 120C9 ; [.3C20.0020.0002.120C9] # CUNEIFORM SIGN GA2 TIMES EN 120CA ; [.3C21.0020.0002.120CA] # CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU 120CB ; [.3C22.0020.0002.120CB] # CUNEIFORM SIGN GA2 TIMES GAN2 TENU 120CC ; [.3C23.0020.0002.120CC] # CUNEIFORM SIGN GA2 TIMES GAR 120CD ; [.3C24.0020.0002.120CD] # CUNEIFORM SIGN GA2 TIMES GI 120CE ; [.3C25.0020.0002.120CE] # CUNEIFORM SIGN GA2 TIMES GI4 120CF ; [.3C26.0020.0002.120CF] # CUNEIFORM SIGN GA2 TIMES GI4 PLUS A 120D0 ; [.3C27.0020.0002.120D0] # CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU 120D1 ; [.3C28.0020.0002.120D1] # CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2 120D2 ; [.3C29.0020.0002.120D2] # CUNEIFORM SIGN GA2 TIMES HAL 120D3 ; [.3C2A.0020.0002.120D3] # CUNEIFORM SIGN GA2 TIMES HAL PLUS LA 120D4 ; [.3C2B.0020.0002.120D4] # CUNEIFORM SIGN GA2 TIMES HI PLUS LI 120D5 ; [.3C2C.0020.0002.120D5] # CUNEIFORM SIGN GA2 TIMES HUB2 120D6 ; [.3C2D.0020.0002.120D6] # CUNEIFORM SIGN GA2 TIMES IGI GUNU 120D7 ; [.3C2E.0020.0002.120D7] # CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH 120D8 ; [.3C2F.0020.0002.120D8] # CUNEIFORM SIGN GA2 TIMES KAK 120D9 ; [.3C30.0020.0002.120D9] # CUNEIFORM SIGN GA2 TIMES KASKAL 120DA ; [.3C31.0020.0002.120DA] # CUNEIFORM SIGN GA2 TIMES KID 120DB ; [.3C32.0020.0002.120DB] # CUNEIFORM SIGN GA2 TIMES KID PLUS LAL 120DC ; [.3C33.0020.0002.120DC] # CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN 120DD ; [.3C34.0020.0002.120DD] # CUNEIFORM SIGN GA2 TIMES LA 120DE ; [.3C35.0020.0002.120DE] # CUNEIFORM SIGN GA2 TIMES ME PLUS EN 120DF ; [.3C36.0020.0002.120DF] # CUNEIFORM SIGN GA2 TIMES MI 120E0 ; [.3C37.0020.0002.120E0] # CUNEIFORM SIGN GA2 TIMES NUN 120E1 ; [.3C38.0020.0002.120E1] # CUNEIFORM SIGN GA2 TIMES NUN OVER NUN 120E2 ; [.3C39.0020.0002.120E2] # CUNEIFORM SIGN GA2 TIMES PA 120E3 ; [.3C3A.0020.0002.120E3] # CUNEIFORM SIGN GA2 TIMES SAL 120E4 ; [.3C3B.0020.0002.120E4] # CUNEIFORM SIGN GA2 TIMES SAR 120E5 ; [.3C3C.0020.0002.120E5] # CUNEIFORM SIGN GA2 TIMES SHE 120E6 ; [.3C3D.0020.0002.120E6] # CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR 120E7 ; [.3C3E.0020.0002.120E7] # CUNEIFORM SIGN GA2 TIMES SHID 120E8 ; [.3C3F.0020.0002.120E8] # CUNEIFORM SIGN GA2 TIMES SUM 120E9 ; [.3C40.0020.0002.120E9] # CUNEIFORM SIGN GA2 TIMES TAK4 120EA ; [.3C41.0020.0002.120EA] # CUNEIFORM SIGN GA2 TIMES U 120EB ; [.3C42.0020.0002.120EB] # CUNEIFORM SIGN GA2 TIMES UD 120EC ; [.3C43.0020.0002.120EC] # CUNEIFORM SIGN GA2 TIMES UD PLUS DU 120ED ; [.3C44.0020.0002.120ED] # CUNEIFORM SIGN GA2 OVER GA2 120EE ; [.3C45.0020.0002.120EE] # CUNEIFORM SIGN GABA 120EF ; [.3C46.0020.0002.120EF] # CUNEIFORM SIGN GABA CROSSING GABA 120F0 ; [.3C47.0020.0002.120F0] # CUNEIFORM SIGN GAD 120F1 ; [.3C48.0020.0002.120F1] # CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR 120F2 ; [.3C49.0020.0002.120F2] # CUNEIFORM SIGN GAL 120F3 ; [.3C4A.0020.0002.120F3] # CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR 120F4 ; [.3C4B.0020.0002.120F4] # CUNEIFORM SIGN GALAM 120F5 ; [.3C4C.0020.0002.120F5] # CUNEIFORM SIGN GAM 120F6 ; [.3C4D.0020.0002.120F6] # CUNEIFORM SIGN GAN 120F7 ; [.3C4E.0020.0002.120F7] # CUNEIFORM SIGN GAN2 120F8 ; [.3C4F.0020.0002.120F8] # CUNEIFORM SIGN GAN2 TENU 120F9 ; [.3C50.0020.0002.120F9] # CUNEIFORM SIGN GAN2 OVER GAN2 120FA ; [.3C51.0020.0002.120FA] # CUNEIFORM SIGN GAN2 CROSSING GAN2 120FB ; [.3C52.0020.0002.120FB] # CUNEIFORM SIGN GAR 120FC ; [.3C53.0020.0002.120FC] # CUNEIFORM SIGN GAR3 120FD ; [.3C54.0020.0002.120FD] # CUNEIFORM SIGN GASHAN 120FE ; [.3C55.0020.0002.120FE] # CUNEIFORM SIGN GESHTIN 120FF ; [.3C56.0020.0002.120FF] # CUNEIFORM SIGN GESHTIN TIMES KUR 12100 ; [.3C57.0020.0002.12100] # CUNEIFORM SIGN GI 12101 ; [.3C58.0020.0002.12101] # CUNEIFORM SIGN GI TIMES E 12102 ; [.3C59.0020.0002.12102] # CUNEIFORM SIGN GI TIMES U 12103 ; [.3C5A.0020.0002.12103] # CUNEIFORM SIGN GI CROSSING GI 12104 ; [.3C5B.0020.0002.12104] # CUNEIFORM SIGN GI4 12105 ; [.3C5C.0020.0002.12105] # CUNEIFORM SIGN GI4 OVER GI4 12106 ; [.3C5D.0020.0002.12106] # CUNEIFORM SIGN GI4 CROSSING GI4 12107 ; [.3C5E.0020.0002.12107] # CUNEIFORM SIGN GIDIM 12108 ; [.3C5F.0020.0002.12108] # CUNEIFORM SIGN GIR2 12109 ; [.3C60.0020.0002.12109] # CUNEIFORM SIGN GIR2 GUNU 1210A ; [.3C61.0020.0002.1210A] # CUNEIFORM SIGN GIR3 1210B ; [.3C62.0020.0002.1210B] # CUNEIFORM SIGN GIR3 TIMES A PLUS IGI 1210C ; [.3C63.0020.0002.1210C] # CUNEIFORM SIGN GIR3 TIMES GAN2 TENU 1210D ; [.3C64.0020.0002.1210D] # CUNEIFORM SIGN GIR3 TIMES IGI 1210E ; [.3C65.0020.0002.1210E] # CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI 1210F ; [.3C66.0020.0002.1210F] # CUNEIFORM SIGN GIR3 TIMES PA 12110 ; [.3C67.0020.0002.12110] # CUNEIFORM SIGN GISAL 12111 ; [.3C68.0020.0002.12111] # CUNEIFORM SIGN GISH 12112 ; [.3C69.0020.0002.12112] # CUNEIFORM SIGN GISH CROSSING GISH 12113 ; [.3C6A.0020.0002.12113] # CUNEIFORM SIGN GISH TIMES BAD 12114 ; [.3C6B.0020.0002.12114] # CUNEIFORM SIGN GISH TIMES TAK4 12115 ; [.3C6C.0020.0002.12115] # CUNEIFORM SIGN GISH TENU 12116 ; [.3C6D.0020.0002.12116] # CUNEIFORM SIGN GU 12117 ; [.3C6E.0020.0002.12117] # CUNEIFORM SIGN GU CROSSING GU 12118 ; [.3C6F.0020.0002.12118] # CUNEIFORM SIGN GU2 12119 ; [.3C70.0020.0002.12119] # CUNEIFORM SIGN GU2 TIMES KAK 1211A ; [.3C71.0020.0002.1211A] # CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU 1211B ; [.3C72.0020.0002.1211B] # CUNEIFORM SIGN GU2 TIMES NUN 1211C ; [.3C73.0020.0002.1211C] # CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2 1211D ; [.3C74.0020.0002.1211D] # CUNEIFORM SIGN GU2 GUNU 1211E ; [.3C75.0020.0002.1211E] # CUNEIFORM SIGN GUD 1211F ; [.3C76.0020.0002.1211F] # CUNEIFORM SIGN GUD TIMES A PLUS KUR 12120 ; [.3C77.0020.0002.12120] # CUNEIFORM SIGN GUD TIMES KUR 12121 ; [.3C78.0020.0002.12121] # CUNEIFORM SIGN GUD OVER GUD LUGAL 12122 ; [.3C79.0020.0002.12122] # CUNEIFORM SIGN GUL 12123 ; [.3C7A.0020.0002.12123] # CUNEIFORM SIGN GUM 12124 ; [.3C7B.0020.0002.12124] # CUNEIFORM SIGN GUM TIMES SHE 12125 ; [.3C7C.0020.0002.12125] # CUNEIFORM SIGN GUR 12126 ; [.3C7D.0020.0002.12126] # CUNEIFORM SIGN GUR7 12127 ; [.3C7E.0020.0002.12127] # CUNEIFORM SIGN GURUN 12128 ; [.3C7F.0020.0002.12128] # CUNEIFORM SIGN GURUSH 12129 ; [.3C80.0020.0002.12129] # CUNEIFORM SIGN HA 1212A ; [.3C81.0020.0002.1212A] # CUNEIFORM SIGN HA TENU 1212B ; [.3C82.0020.0002.1212B] # CUNEIFORM SIGN HA GUNU 1212C ; [.3C83.0020.0002.1212C] # CUNEIFORM SIGN HAL 1212D ; [.3C84.0020.0002.1212D] # CUNEIFORM SIGN HI 1212E ; [.3C85.0020.0002.1212E] # CUNEIFORM SIGN HI TIMES ASH 1212F ; [.3C86.0020.0002.1212F] # CUNEIFORM SIGN HI TIMES ASH2 12130 ; [.3C87.0020.0002.12130] # CUNEIFORM SIGN HI TIMES BAD 12131 ; [.3C88.0020.0002.12131] # CUNEIFORM SIGN HI TIMES DISH 12132 ; [.3C89.0020.0002.12132] # CUNEIFORM SIGN HI TIMES GAD 12133 ; [.3C8A.0020.0002.12133] # CUNEIFORM SIGN HI TIMES KIN 12134 ; [.3C8B.0020.0002.12134] # CUNEIFORM SIGN HI TIMES NUN 12135 ; [.3C8C.0020.0002.12135] # CUNEIFORM SIGN HI TIMES SHE 12136 ; [.3C8D.0020.0002.12136] # CUNEIFORM SIGN HI TIMES U 12137 ; [.3C8E.0020.0002.12137] # CUNEIFORM SIGN HU 12138 ; [.3C8F.0020.0002.12138] # CUNEIFORM SIGN HUB2 12139 ; [.3C90.0020.0002.12139] # CUNEIFORM SIGN HUB2 TIMES AN 1213A ; [.3C91.0020.0002.1213A] # CUNEIFORM SIGN HUB2 TIMES HAL 1213B ; [.3C92.0020.0002.1213B] # CUNEIFORM SIGN HUB2 TIMES KASKAL 1213C ; [.3C93.0020.0002.1213C] # CUNEIFORM SIGN HUB2 TIMES LISH 1213D ; [.3C94.0020.0002.1213D] # CUNEIFORM SIGN HUB2 TIMES UD 1213E ; [.3C95.0020.0002.1213E] # CUNEIFORM SIGN HUL2 1213F ; [.3C96.0020.0002.1213F] # CUNEIFORM SIGN I 12140 ; [.3C97.0020.0002.12140] # CUNEIFORM SIGN I A 12141 ; [.3C98.0020.0002.12141] # CUNEIFORM SIGN IB 12142 ; [.3C99.0020.0002.12142] # CUNEIFORM SIGN IDIM 12143 ; [.3C9A.0020.0002.12143] # CUNEIFORM SIGN IDIM OVER IDIM BUR 12144 ; [.3C9B.0020.0002.12144] # CUNEIFORM SIGN IDIM OVER IDIM SQUARED 12145 ; [.3C9C.0020.0002.12145] # CUNEIFORM SIGN IG 12146 ; [.3C9D.0020.0002.12146] # CUNEIFORM SIGN IGI 12147 ; [.3C9E.0020.0002.12147] # CUNEIFORM SIGN IGI DIB 12148 ; [.3C9F.0020.0002.12148] # CUNEIFORM SIGN IGI RI 12149 ; [.3CA0.0020.0002.12149] # CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD 1214A ; [.3CA1.0020.0002.1214A] # CUNEIFORM SIGN IGI GUNU 1214B ; [.3CA2.0020.0002.1214B] # CUNEIFORM SIGN IL 1214C ; [.3CA3.0020.0002.1214C] # CUNEIFORM SIGN IL TIMES GAN2 TENU 1214D ; [.3CA4.0020.0002.1214D] # CUNEIFORM SIGN IL2 1214E ; [.3CA5.0020.0002.1214E] # CUNEIFORM SIGN IM 1214F ; [.3CA6.0020.0002.1214F] # CUNEIFORM SIGN IM TIMES TAK4 12150 ; [.3CA7.0020.0002.12150] # CUNEIFORM SIGN IM CROSSING IM 12151 ; [.3CA8.0020.0002.12151] # CUNEIFORM SIGN IM OPPOSING IM 12152 ; [.3CA9.0020.0002.12152] # CUNEIFORM SIGN IM SQUARED 12153 ; [.3CAA.0020.0002.12153] # CUNEIFORM SIGN IMIN 12154 ; [.3CAB.0020.0002.12154] # CUNEIFORM SIGN IN 12155 ; [.3CAC.0020.0002.12155] # CUNEIFORM SIGN IR 12156 ; [.3CAD.0020.0002.12156] # CUNEIFORM SIGN ISH 12157 ; [.3CAE.0020.0002.12157] # CUNEIFORM SIGN KA 12158 ; [.3CAF.0020.0002.12158] # CUNEIFORM SIGN KA TIMES A 12159 ; [.3CB0.0020.0002.12159] # CUNEIFORM SIGN KA TIMES AD 1215A ; [.3CB1.0020.0002.1215A] # CUNEIFORM SIGN KA TIMES AD PLUS KU3 1215B ; [.3CB2.0020.0002.1215B] # CUNEIFORM SIGN KA TIMES ASH2 1215C ; [.3CB3.0020.0002.1215C] # CUNEIFORM SIGN KA TIMES BAD 1215D ; [.3CB4.0020.0002.1215D] # CUNEIFORM SIGN KA TIMES BALAG 1215E ; [.3CB5.0020.0002.1215E] # CUNEIFORM SIGN KA TIMES BAR 1215F ; [.3CB6.0020.0002.1215F] # CUNEIFORM SIGN KA TIMES BI 12160 ; [.3CB7.0020.0002.12160] # CUNEIFORM SIGN KA TIMES ERIN2 12161 ; [.3CB8.0020.0002.12161] # CUNEIFORM SIGN KA TIMES ESH2 12162 ; [.3CB9.0020.0002.12162] # CUNEIFORM SIGN KA TIMES GA 12163 ; [.3CBA.0020.0002.12163] # CUNEIFORM SIGN KA TIMES GAL 12164 ; [.3CBB.0020.0002.12164] # CUNEIFORM SIGN KA TIMES GAN2 TENU 12165 ; [.3CBC.0020.0002.12165] # CUNEIFORM SIGN KA TIMES GAR 12166 ; [.3CBD.0020.0002.12166] # CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A 12167 ; [.3CBE.0020.0002.12167] # CUNEIFORM SIGN KA TIMES GI 12168 ; [.3CBF.0020.0002.12168] # CUNEIFORM SIGN KA TIMES GIR2 12169 ; [.3CC0.0020.0002.12169] # CUNEIFORM SIGN KA TIMES GISH PLUS SAR 1216A ; [.3CC1.0020.0002.1216A] # CUNEIFORM SIGN KA TIMES GISH CROSSING GISH 1216B ; [.3CC2.0020.0002.1216B] # CUNEIFORM SIGN KA TIMES GU 1216C ; [.3CC3.0020.0002.1216C] # CUNEIFORM SIGN KA TIMES GUR7 1216D ; [.3CC4.0020.0002.1216D] # CUNEIFORM SIGN KA TIMES IGI 1216E ; [.3CC5.0020.0002.1216E] # CUNEIFORM SIGN KA TIMES IM 1216F ; [.3CC6.0020.0002.1216F] # CUNEIFORM SIGN KA TIMES KAK 12170 ; [.3CC7.0020.0002.12170] # CUNEIFORM SIGN KA TIMES KI 12171 ; [.3CC8.0020.0002.12171] # CUNEIFORM SIGN KA TIMES KID 12172 ; [.3CC9.0020.0002.12172] # CUNEIFORM SIGN KA TIMES LI 12173 ; [.3CCA.0020.0002.12173] # CUNEIFORM SIGN KA TIMES LU 12174 ; [.3CCB.0020.0002.12174] # CUNEIFORM SIGN KA TIMES ME 12175 ; [.3CCC.0020.0002.12175] # CUNEIFORM SIGN KA TIMES ME PLUS DU 12176 ; [.3CCD.0020.0002.12176] # CUNEIFORM SIGN KA TIMES ME PLUS GI 12177 ; [.3CCE.0020.0002.12177] # CUNEIFORM SIGN KA TIMES ME PLUS TE 12178 ; [.3CCF.0020.0002.12178] # CUNEIFORM SIGN KA TIMES MI 12179 ; [.3CD0.0020.0002.12179] # CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ 1217A ; [.3CD1.0020.0002.1217A] # CUNEIFORM SIGN KA TIMES NE 1217B ; [.3CD2.0020.0002.1217B] # CUNEIFORM SIGN KA TIMES NUN 1217C ; [.3CD3.0020.0002.1217C] # CUNEIFORM SIGN KA TIMES PI 1217D ; [.3CD4.0020.0002.1217D] # CUNEIFORM SIGN KA TIMES RU 1217E ; [.3CD5.0020.0002.1217E] # CUNEIFORM SIGN KA TIMES SA 1217F ; [.3CD6.0020.0002.1217F] # CUNEIFORM SIGN KA TIMES SAR 12180 ; [.3CD7.0020.0002.12180] # CUNEIFORM SIGN KA TIMES SHA 12181 ; [.3CD8.0020.0002.12181] # CUNEIFORM SIGN KA TIMES SHE 12182 ; [.3CD9.0020.0002.12182] # CUNEIFORM SIGN KA TIMES SHID 12183 ; [.3CDA.0020.0002.12183] # CUNEIFORM SIGN KA TIMES SHU 12184 ; [.3CDB.0020.0002.12184] # CUNEIFORM SIGN KA TIMES SIG 12185 ; [.3CDC.0020.0002.12185] # CUNEIFORM SIGN KA TIMES SUHUR 12186 ; [.3CDD.0020.0002.12186] # CUNEIFORM SIGN KA TIMES TAR 12187 ; [.3CDE.0020.0002.12187] # CUNEIFORM SIGN KA TIMES U 12188 ; [.3CDF.0020.0002.12188] # CUNEIFORM SIGN KA TIMES U2 12189 ; [.3CE0.0020.0002.12189] # CUNEIFORM SIGN KA TIMES UD 1218A ; [.3CE1.0020.0002.1218A] # CUNEIFORM SIGN KA TIMES UMUM TIMES PA 1218B ; [.3CE2.0020.0002.1218B] # CUNEIFORM SIGN KA TIMES USH 1218C ; [.3CE3.0020.0002.1218C] # CUNEIFORM SIGN KA TIMES ZI 1218D ; [.3CE4.0020.0002.1218D] # CUNEIFORM SIGN KA2 1218E ; [.3CE5.0020.0002.1218E] # CUNEIFORM SIGN KA2 CROSSING KA2 1218F ; [.3CE6.0020.0002.1218F] # CUNEIFORM SIGN KAB 12190 ; [.3CE7.0020.0002.12190] # CUNEIFORM SIGN KAD2 12191 ; [.3CE8.0020.0002.12191] # CUNEIFORM SIGN KAD3 12192 ; [.3CE9.0020.0002.12192] # CUNEIFORM SIGN KAD4 12193 ; [.3CEA.0020.0002.12193] # CUNEIFORM SIGN KAD5 12194 ; [.3CEB.0020.0002.12194] # CUNEIFORM SIGN KAD5 OVER KAD5 12195 ; [.3CEC.0020.0002.12195] # CUNEIFORM SIGN KAK 12196 ; [.3CED.0020.0002.12196] # CUNEIFORM SIGN KAK TIMES IGI GUNU 12197 ; [.3CEE.0020.0002.12197] # CUNEIFORM SIGN KAL 12198 ; [.3CEF.0020.0002.12198] # CUNEIFORM SIGN KAL TIMES BAD 12199 ; [.3CF0.0020.0002.12199] # CUNEIFORM SIGN KAL CROSSING KAL 1219A ; [.3CF1.0020.0002.1219A] # CUNEIFORM SIGN KAM2 1219B ; [.3CF2.0020.0002.1219B] # CUNEIFORM SIGN KAM4 1219C ; [.3CF3.0020.0002.1219C] # CUNEIFORM SIGN KASKAL 1219D ; [.3CF4.0020.0002.1219D] # CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U 1219E ; [.3CF5.0020.0002.1219E] # CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U 1219F ; [.3CF6.0020.0002.1219F] # CUNEIFORM SIGN KESH2 121A0 ; [.3CF7.0020.0002.121A0] # CUNEIFORM SIGN KI 121A1 ; [.3CF8.0020.0002.121A1] # CUNEIFORM SIGN KI TIMES BAD 121A2 ; [.3CF9.0020.0002.121A2] # CUNEIFORM SIGN KI TIMES U 121A3 ; [.3CFA.0020.0002.121A3] # CUNEIFORM SIGN KI TIMES UD 121A4 ; [.3CFB.0020.0002.121A4] # CUNEIFORM SIGN KID 121A5 ; [.3CFC.0020.0002.121A5] # CUNEIFORM SIGN KIN 121A6 ; [.3CFD.0020.0002.121A6] # CUNEIFORM SIGN KISAL 121A7 ; [.3CFE.0020.0002.121A7] # CUNEIFORM SIGN KISH 121A8 ; [.3CFF.0020.0002.121A8] # CUNEIFORM SIGN KISIM5 121A9 ; [.3D00.0020.0002.121A9] # CUNEIFORM SIGN KISIM5 OVER KISIM5 121AA ; [.3D01.0020.0002.121AA] # CUNEIFORM SIGN KU 121AB ; [.3D02.0020.0002.121AB] # CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2 121AC ; [.3D03.0020.0002.121AC] # CUNEIFORM SIGN KU3 121AD ; [.3D04.0020.0002.121AD] # CUNEIFORM SIGN KU4 121AE ; [.3D05.0020.0002.121AE] # CUNEIFORM SIGN KU4 VARIANT FORM 121AF ; [.3D06.0020.0002.121AF] # CUNEIFORM SIGN KU7 121B0 ; [.3D07.0020.0002.121B0] # CUNEIFORM SIGN KUL 121B1 ; [.3D08.0020.0002.121B1] # CUNEIFORM SIGN KUL GUNU 121B2 ; [.3D09.0020.0002.121B2] # CUNEIFORM SIGN KUN 121B3 ; [.3D0A.0020.0002.121B3] # CUNEIFORM SIGN KUR 121B4 ; [.3D0B.0020.0002.121B4] # CUNEIFORM SIGN KUR OPPOSING KUR 121B5 ; [.3D0C.0020.0002.121B5] # CUNEIFORM SIGN KUSHU2 121B6 ; [.3D0D.0020.0002.121B6] # CUNEIFORM SIGN KWU318 121B7 ; [.3D0E.0020.0002.121B7] # CUNEIFORM SIGN LA 121B8 ; [.3D0F.0020.0002.121B8] # CUNEIFORM SIGN LAGAB 121B9 ; [.3D10.0020.0002.121B9] # CUNEIFORM SIGN LAGAB TIMES A 121BA ; [.3D11.0020.0002.121BA] # CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA 121BB ; [.3D12.0020.0002.121BB] # CUNEIFORM SIGN LAGAB TIMES A PLUS GAR 121BC ; [.3D13.0020.0002.121BC] # CUNEIFORM SIGN LAGAB TIMES A PLUS LAL 121BD ; [.3D14.0020.0002.121BD] # CUNEIFORM SIGN LAGAB TIMES AL 121BE ; [.3D15.0020.0002.121BE] # CUNEIFORM SIGN LAGAB TIMES AN 121BF ; [.3D16.0020.0002.121BF] # CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU 121C0 ; [.3D17.0020.0002.121C0] # CUNEIFORM SIGN LAGAB TIMES BAD 121C1 ; [.3D18.0020.0002.121C1] # CUNEIFORM SIGN LAGAB TIMES BI 121C2 ; [.3D19.0020.0002.121C2] # CUNEIFORM SIGN LAGAB TIMES DAR 121C3 ; [.3D1A.0020.0002.121C3] # CUNEIFORM SIGN LAGAB TIMES EN 121C4 ; [.3D1B.0020.0002.121C4] # CUNEIFORM SIGN LAGAB TIMES GA 121C5 ; [.3D1C.0020.0002.121C5] # CUNEIFORM SIGN LAGAB TIMES GAR 121C6 ; [.3D1D.0020.0002.121C6] # CUNEIFORM SIGN LAGAB TIMES GUD 121C7 ; [.3D1E.0020.0002.121C7] # CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD 121C8 ; [.3D1F.0020.0002.121C8] # CUNEIFORM SIGN LAGAB TIMES HA 121C9 ; [.3D20.0020.0002.121C9] # CUNEIFORM SIGN LAGAB TIMES HAL 121CA ; [.3D21.0020.0002.121CA] # CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN 121CB ; [.3D22.0020.0002.121CB] # CUNEIFORM SIGN LAGAB TIMES IGI GUNU 121CC ; [.3D23.0020.0002.121CC] # CUNEIFORM SIGN LAGAB TIMES IM 121CD ; [.3D24.0020.0002.121CD] # CUNEIFORM SIGN LAGAB TIMES IM PLUS HA 121CE ; [.3D25.0020.0002.121CE] # CUNEIFORM SIGN LAGAB TIMES IM PLUS LU 121CF ; [.3D26.0020.0002.121CF] # CUNEIFORM SIGN LAGAB TIMES KI 121D0 ; [.3D27.0020.0002.121D0] # CUNEIFORM SIGN LAGAB TIMES KIN 121D1 ; [.3D28.0020.0002.121D1] # CUNEIFORM SIGN LAGAB TIMES KU3 121D2 ; [.3D29.0020.0002.121D2] # CUNEIFORM SIGN LAGAB TIMES KUL 121D3 ; [.3D2A.0020.0002.121D3] # CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A 121D4 ; [.3D2B.0020.0002.121D4] # CUNEIFORM SIGN LAGAB TIMES LAGAB 121D5 ; [.3D2C.0020.0002.121D5] # CUNEIFORM SIGN LAGAB TIMES LISH 121D6 ; [.3D2D.0020.0002.121D6] # CUNEIFORM SIGN LAGAB TIMES LU 121D7 ; [.3D2E.0020.0002.121D7] # CUNEIFORM SIGN LAGAB TIMES LUL 121D8 ; [.3D2F.0020.0002.121D8] # CUNEIFORM SIGN LAGAB TIMES ME 121D9 ; [.3D30.0020.0002.121D9] # CUNEIFORM SIGN LAGAB TIMES ME PLUS EN 121DA ; [.3D31.0020.0002.121DA] # CUNEIFORM SIGN LAGAB TIMES MUSH 121DB ; [.3D32.0020.0002.121DB] # CUNEIFORM SIGN LAGAB TIMES NE 121DC ; [.3D33.0020.0002.121DC] # CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM 121DD ; [.3D34.0020.0002.121DD] # CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2 121DE ; [.3D35.0020.0002.121DE] # CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU 121DF ; [.3D36.0020.0002.121DF] # CUNEIFORM SIGN LAGAB TIMES SHU2 121E0 ; [.3D37.0020.0002.121E0] # CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2 121E1 ; [.3D38.0020.0002.121E1] # CUNEIFORM SIGN LAGAB TIMES SUM 121E2 ; [.3D39.0020.0002.121E2] # CUNEIFORM SIGN LAGAB TIMES TAG 121E3 ; [.3D3A.0020.0002.121E3] # CUNEIFORM SIGN LAGAB TIMES TAK4 121E4 ; [.3D3B.0020.0002.121E4] # CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA 121E5 ; [.3D3C.0020.0002.121E5] # CUNEIFORM SIGN LAGAB TIMES U 121E6 ; [.3D3D.0020.0002.121E6] # CUNEIFORM SIGN LAGAB TIMES U PLUS A 121E7 ; [.3D3E.0020.0002.121E7] # CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U 121E8 ; [.3D3F.0020.0002.121E8] # CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH 121E9 ; [.3D40.0020.0002.121E9] # CUNEIFORM SIGN LAGAB TIMES UD 121EA ; [.3D41.0020.0002.121EA] # CUNEIFORM SIGN LAGAB TIMES USH 121EB ; [.3D42.0020.0002.121EB] # CUNEIFORM SIGN LAGAB SQUARED 121EC ; [.3D43.0020.0002.121EC] # CUNEIFORM SIGN LAGAR 121ED ; [.3D44.0020.0002.121ED] # CUNEIFORM SIGN LAGAR TIMES SHE 121EE ; [.3D45.0020.0002.121EE] # CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM 121EF ; [.3D46.0020.0002.121EF] # CUNEIFORM SIGN LAGAR GUNU 121F0 ; [.3D47.0020.0002.121F0] # CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE 121F1 ; [.3D48.0020.0002.121F1] # CUNEIFORM SIGN LAHSHU 121F2 ; [.3D49.0020.0002.121F2] # CUNEIFORM SIGN LAL 121F3 ; [.3D4A.0020.0002.121F3] # CUNEIFORM SIGN LAL TIMES LAL 121F4 ; [.3D4B.0020.0002.121F4] # CUNEIFORM SIGN LAM 121F5 ; [.3D4C.0020.0002.121F5] # CUNEIFORM SIGN LAM TIMES KUR 121F6 ; [.3D4D.0020.0002.121F6] # CUNEIFORM SIGN LAM TIMES KUR PLUS RU 121F7 ; [.3D4E.0020.0002.121F7] # CUNEIFORM SIGN LI 121F8 ; [.3D4F.0020.0002.121F8] # CUNEIFORM SIGN LIL 121F9 ; [.3D50.0020.0002.121F9] # CUNEIFORM SIGN LIMMU2 121FA ; [.3D51.0020.0002.121FA] # CUNEIFORM SIGN LISH 121FB ; [.3D52.0020.0002.121FB] # CUNEIFORM SIGN LU 121FC ; [.3D53.0020.0002.121FC] # CUNEIFORM SIGN LU TIMES BAD 121FD ; [.3D54.0020.0002.121FD] # CUNEIFORM SIGN LU2 121FE ; [.3D55.0020.0002.121FE] # CUNEIFORM SIGN LU2 TIMES AL 121FF ; [.3D56.0020.0002.121FF] # CUNEIFORM SIGN LU2 TIMES BAD 12200 ; [.3D57.0020.0002.12200] # CUNEIFORM SIGN LU2 TIMES ESH2 12201 ; [.3D58.0020.0002.12201] # CUNEIFORM SIGN LU2 TIMES ESH2 TENU 12202 ; [.3D59.0020.0002.12202] # CUNEIFORM SIGN LU2 TIMES GAN2 TENU 12203 ; [.3D5A.0020.0002.12203] # CUNEIFORM SIGN LU2 TIMES HI TIMES BAD 12204 ; [.3D5B.0020.0002.12204] # CUNEIFORM SIGN LU2 TIMES IM 12205 ; [.3D5C.0020.0002.12205] # CUNEIFORM SIGN LU2 TIMES KAD2 12206 ; [.3D5D.0020.0002.12206] # CUNEIFORM SIGN LU2 TIMES KAD3 12207 ; [.3D5E.0020.0002.12207] # CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH 12208 ; [.3D5F.0020.0002.12208] # CUNEIFORM SIGN LU2 TIMES KI 12209 ; [.3D60.0020.0002.12209] # CUNEIFORM SIGN LU2 TIMES LA PLUS ASH 1220A ; [.3D61.0020.0002.1220A] # CUNEIFORM SIGN LU2 TIMES LAGAB 1220B ; [.3D62.0020.0002.1220B] # CUNEIFORM SIGN LU2 TIMES ME PLUS EN 1220C ; [.3D63.0020.0002.1220C] # CUNEIFORM SIGN LU2 TIMES NE 1220D ; [.3D64.0020.0002.1220D] # CUNEIFORM SIGN LU2 TIMES NU 1220E ; [.3D65.0020.0002.1220E] # CUNEIFORM SIGN LU2 TIMES SI PLUS ASH 1220F ; [.3D66.0020.0002.1220F] # CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU 12210 ; [.3D67.0020.0002.12210] # CUNEIFORM SIGN LU2 TIMES TUG2 12211 ; [.3D68.0020.0002.12211] # CUNEIFORM SIGN LU2 TENU 12212 ; [.3D69.0020.0002.12212] # CUNEIFORM SIGN LU2 CROSSING LU2 12213 ; [.3D6A.0020.0002.12213] # CUNEIFORM SIGN LU2 OPPOSING LU2 12214 ; [.3D6B.0020.0002.12214] # CUNEIFORM SIGN LU2 SQUARED 12215 ; [.3D6C.0020.0002.12215] # CUNEIFORM SIGN LU2 SHESHIG 12216 ; [.3D6D.0020.0002.12216] # CUNEIFORM SIGN LU3 12217 ; [.3D6E.0020.0002.12217] # CUNEIFORM SIGN LUGAL 12218 ; [.3D6F.0020.0002.12218] # CUNEIFORM SIGN LUGAL OVER LUGAL 12219 ; [.3D70.0020.0002.12219] # CUNEIFORM SIGN LUGAL OPPOSING LUGAL 1221A ; [.3D71.0020.0002.1221A] # CUNEIFORM SIGN LUGAL SHESHIG 1221B ; [.3D72.0020.0002.1221B] # CUNEIFORM SIGN LUH 1221C ; [.3D73.0020.0002.1221C] # CUNEIFORM SIGN LUL 1221D ; [.3D74.0020.0002.1221D] # CUNEIFORM SIGN LUM 1221E ; [.3D75.0020.0002.1221E] # CUNEIFORM SIGN LUM OVER LUM 1221F ; [.3D76.0020.0002.1221F] # CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR 12220 ; [.3D77.0020.0002.12220] # CUNEIFORM SIGN MA 12221 ; [.3D78.0020.0002.12221] # CUNEIFORM SIGN MA TIMES TAK4 12222 ; [.3D79.0020.0002.12222] # CUNEIFORM SIGN MA GUNU 12223 ; [.3D7A.0020.0002.12223] # CUNEIFORM SIGN MA2 12224 ; [.3D7B.0020.0002.12224] # CUNEIFORM SIGN MAH 12225 ; [.3D7C.0020.0002.12225] # CUNEIFORM SIGN MAR 12226 ; [.3D7D.0020.0002.12226] # CUNEIFORM SIGN MASH 12227 ; [.3D7E.0020.0002.12227] # CUNEIFORM SIGN MASH2 12228 ; [.3D7F.0020.0002.12228] # CUNEIFORM SIGN ME 12229 ; [.3D80.0020.0002.12229] # CUNEIFORM SIGN MES 1222A ; [.3D81.0020.0002.1222A] # CUNEIFORM SIGN MI 1222B ; [.3D82.0020.0002.1222B] # CUNEIFORM SIGN MIN 1222C ; [.3D83.0020.0002.1222C] # CUNEIFORM SIGN MU 1222D ; [.3D84.0020.0002.1222D] # CUNEIFORM SIGN MU OVER MU 1222E ; [.3D85.0020.0002.1222E] # CUNEIFORM SIGN MUG 1222F ; [.3D86.0020.0002.1222F] # CUNEIFORM SIGN MUG GUNU 12230 ; [.3D87.0020.0002.12230] # CUNEIFORM SIGN MUNSUB 12231 ; [.3D88.0020.0002.12231] # CUNEIFORM SIGN MURGU2 12232 ; [.3D89.0020.0002.12232] # CUNEIFORM SIGN MUSH 12233 ; [.3D8A.0020.0002.12233] # CUNEIFORM SIGN MUSH TIMES A 12234 ; [.3D8B.0020.0002.12234] # CUNEIFORM SIGN MUSH TIMES KUR 12235 ; [.3D8C.0020.0002.12235] # CUNEIFORM SIGN MUSH TIMES ZA 12236 ; [.3D8D.0020.0002.12236] # CUNEIFORM SIGN MUSH OVER MUSH 12237 ; [.3D8E.0020.0002.12237] # CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA 12238 ; [.3D8F.0020.0002.12238] # CUNEIFORM SIGN MUSH CROSSING MUSH 12239 ; [.3D90.0020.0002.12239] # CUNEIFORM SIGN MUSH3 1223A ; [.3D91.0020.0002.1223A] # CUNEIFORM SIGN MUSH3 TIMES A 1223B ; [.3D92.0020.0002.1223B] # CUNEIFORM SIGN MUSH3 TIMES A PLUS DI 1223C ; [.3D93.0020.0002.1223C] # CUNEIFORM SIGN MUSH3 TIMES DI 1223D ; [.3D94.0020.0002.1223D] # CUNEIFORM SIGN MUSH3 GUNU 1223E ; [.3D95.0020.0002.1223E] # CUNEIFORM SIGN NA 1223F ; [.3D96.0020.0002.1223F] # CUNEIFORM SIGN NA2 12240 ; [.3D97.0020.0002.12240] # CUNEIFORM SIGN NAGA 12241 ; [.3D98.0020.0002.12241] # CUNEIFORM SIGN NAGA INVERTED 12242 ; [.3D99.0020.0002.12242] # CUNEIFORM SIGN NAGA TIMES SHU TENU 12243 ; [.3D9A.0020.0002.12243] # CUNEIFORM SIGN NAGA OPPOSING NAGA 12244 ; [.3D9B.0020.0002.12244] # CUNEIFORM SIGN NAGAR 12245 ; [.3D9C.0020.0002.12245] # CUNEIFORM SIGN NAM NUTILLU 12246 ; [.3D9D.0020.0002.12246] # CUNEIFORM SIGN NAM 12247 ; [.3D9E.0020.0002.12247] # CUNEIFORM SIGN NAM2 12248 ; [.3D9F.0020.0002.12248] # CUNEIFORM SIGN NE 12249 ; [.3DA0.0020.0002.12249] # CUNEIFORM SIGN NE TIMES A 1224A ; [.3DA1.0020.0002.1224A] # CUNEIFORM SIGN NE TIMES UD 1224B ; [.3DA2.0020.0002.1224B] # CUNEIFORM SIGN NE SHESHIG 1224C ; [.3DA3.0020.0002.1224C] # CUNEIFORM SIGN NI 1224D ; [.3DA4.0020.0002.1224D] # CUNEIFORM SIGN NI TIMES E 1224E ; [.3DA5.0020.0002.1224E] # CUNEIFORM SIGN NI2 1224F ; [.3DA6.0020.0002.1224F] # CUNEIFORM SIGN NIM 12250 ; [.3DA7.0020.0002.12250] # CUNEIFORM SIGN NIM TIMES GAN2 TENU 12251 ; [.3DA8.0020.0002.12251] # CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU 12252 ; [.3DA9.0020.0002.12252] # CUNEIFORM SIGN NINDA2 12253 ; [.3DAA.0020.0002.12253] # CUNEIFORM SIGN NINDA2 TIMES AN 12254 ; [.3DAB.0020.0002.12254] # CUNEIFORM SIGN NINDA2 TIMES ASH 12255 ; [.3DAC.0020.0002.12255] # CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH 12256 ; [.3DAD.0020.0002.12256] # CUNEIFORM SIGN NINDA2 TIMES GUD 12257 ; [.3DAE.0020.0002.12257] # CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU 12258 ; [.3DAF.0020.0002.12258] # CUNEIFORM SIGN NINDA2 TIMES NE 12259 ; [.3DB0.0020.0002.12259] # CUNEIFORM SIGN NINDA2 TIMES NUN 1225A ; [.3DB1.0020.0002.1225A] # CUNEIFORM SIGN NINDA2 TIMES SHE 1225B ; [.3DB2.0020.0002.1225B] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN 1225C ; [.3DB3.0020.0002.1225C] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH 1225D ; [.3DB4.0020.0002.1225D] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH 1225E ; [.3DB5.0020.0002.1225E] # CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH 1225F ; [.3DB6.0020.0002.1225F] # CUNEIFORM SIGN NINDA2 TIMES USH 12260 ; [.3DB7.0020.0002.12260] # CUNEIFORM SIGN NISAG 12261 ; [.3DB8.0020.0002.12261] # CUNEIFORM SIGN NU 12262 ; [.3DB9.0020.0002.12262] # CUNEIFORM SIGN NU11 12263 ; [.3DBA.0020.0002.12263] # CUNEIFORM SIGN NUN 12264 ; [.3DBB.0020.0002.12264] # CUNEIFORM SIGN NUN LAGAR TIMES GAR 12265 ; [.3DBC.0020.0002.12265] # CUNEIFORM SIGN NUN LAGAR TIMES MASH 12266 ; [.3DBD.0020.0002.12266] # CUNEIFORM SIGN NUN LAGAR TIMES SAL 12267 ; [.3DBE.0020.0002.12267] # CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL 12268 ; [.3DBF.0020.0002.12268] # CUNEIFORM SIGN NUN LAGAR TIMES USH 12269 ; [.3DC0.0020.0002.12269] # CUNEIFORM SIGN NUN TENU 1226A ; [.3DC1.0020.0002.1226A] # CUNEIFORM SIGN NUN OVER NUN 1226B ; [.3DC2.0020.0002.1226B] # CUNEIFORM SIGN NUN CROSSING NUN 1226C ; [.3DC3.0020.0002.1226C] # CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR 1226D ; [.3DC4.0020.0002.1226D] # CUNEIFORM SIGN NUNUZ 1226E ; [.3DC5.0020.0002.1226E] # CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB 1226F ; [.3DC6.0020.0002.1226F] # CUNEIFORM SIGN NUNUZ AB2 TIMES BI 12270 ; [.3DC7.0020.0002.12270] # CUNEIFORM SIGN NUNUZ AB2 TIMES DUG 12271 ; [.3DC8.0020.0002.12271] # CUNEIFORM SIGN NUNUZ AB2 TIMES GUD 12272 ; [.3DC9.0020.0002.12272] # CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU 12273 ; [.3DCA.0020.0002.12273] # CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3 12274 ; [.3DCB.0020.0002.12274] # CUNEIFORM SIGN NUNUZ AB2 TIMES LA 12275 ; [.3DCC.0020.0002.12275] # CUNEIFORM SIGN NUNUZ AB2 TIMES NE 12276 ; [.3DCD.0020.0002.12276] # CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3 12277 ; [.3DCE.0020.0002.12277] # CUNEIFORM SIGN NUNUZ AB2 TIMES U2 12278 ; [.3DCF.0020.0002.12278] # CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI 12279 ; [.3DD0.0020.0002.12279] # CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U 1227A ; [.3DD1.0020.0002.1227A] # CUNEIFORM SIGN PA 1227B ; [.3DD2.0020.0002.1227B] # CUNEIFORM SIGN PAD 1227C ; [.3DD3.0020.0002.1227C] # CUNEIFORM SIGN PAN 1227D ; [.3DD4.0020.0002.1227D] # CUNEIFORM SIGN PAP 1227E ; [.3DD5.0020.0002.1227E] # CUNEIFORM SIGN PESH2 1227F ; [.3DD6.0020.0002.1227F] # CUNEIFORM SIGN PI 12280 ; [.3DD7.0020.0002.12280] # CUNEIFORM SIGN PI TIMES A 12281 ; [.3DD8.0020.0002.12281] # CUNEIFORM SIGN PI TIMES AB 12282 ; [.3DD9.0020.0002.12282] # CUNEIFORM SIGN PI TIMES BI 12283 ; [.3DDA.0020.0002.12283] # CUNEIFORM SIGN PI TIMES BU 12284 ; [.3DDB.0020.0002.12284] # CUNEIFORM SIGN PI TIMES E 12285 ; [.3DDC.0020.0002.12285] # CUNEIFORM SIGN PI TIMES I 12286 ; [.3DDD.0020.0002.12286] # CUNEIFORM SIGN PI TIMES IB 12287 ; [.3DDE.0020.0002.12287] # CUNEIFORM SIGN PI TIMES U 12288 ; [.3DDF.0020.0002.12288] # CUNEIFORM SIGN PI TIMES U2 12289 ; [.3DE0.0020.0002.12289] # CUNEIFORM SIGN PI CROSSING PI 1228A ; [.3DE1.0020.0002.1228A] # CUNEIFORM SIGN PIRIG 1228B ; [.3DE2.0020.0002.1228B] # CUNEIFORM SIGN PIRIG TIMES KAL 1228C ; [.3DE3.0020.0002.1228C] # CUNEIFORM SIGN PIRIG TIMES UD 1228D ; [.3DE4.0020.0002.1228D] # CUNEIFORM SIGN PIRIG TIMES ZA 1228E ; [.3DE5.0020.0002.1228E] # CUNEIFORM SIGN PIRIG OPPOSING PIRIG 1228F ; [.3DE6.0020.0002.1228F] # CUNEIFORM SIGN RA 12290 ; [.3DE7.0020.0002.12290] # CUNEIFORM SIGN RAB 12291 ; [.3DE8.0020.0002.12291] # CUNEIFORM SIGN RI 12292 ; [.3DE9.0020.0002.12292] # CUNEIFORM SIGN RU 12293 ; [.3DEA.0020.0002.12293] # CUNEIFORM SIGN SA 12294 ; [.3DEB.0020.0002.12294] # CUNEIFORM SIGN SAG NUTILLU 12295 ; [.3DEC.0020.0002.12295] # CUNEIFORM SIGN SAG 12296 ; [.3DED.0020.0002.12296] # CUNEIFORM SIGN SAG TIMES A 12297 ; [.3DEE.0020.0002.12297] # CUNEIFORM SIGN SAG TIMES DU 12298 ; [.3DEF.0020.0002.12298] # CUNEIFORM SIGN SAG TIMES DUB 12299 ; [.3DF0.0020.0002.12299] # CUNEIFORM SIGN SAG TIMES HA 1229A ; [.3DF1.0020.0002.1229A] # CUNEIFORM SIGN SAG TIMES KAK 1229B ; [.3DF2.0020.0002.1229B] # CUNEIFORM SIGN SAG TIMES KUR 1229C ; [.3DF3.0020.0002.1229C] # CUNEIFORM SIGN SAG TIMES LUM 1229D ; [.3DF4.0020.0002.1229D] # CUNEIFORM SIGN SAG TIMES MI 1229E ; [.3DF5.0020.0002.1229E] # CUNEIFORM SIGN SAG TIMES NUN 1229F ; [.3DF6.0020.0002.1229F] # CUNEIFORM SIGN SAG TIMES SAL 122A0 ; [.3DF7.0020.0002.122A0] # CUNEIFORM SIGN SAG TIMES SHID 122A1 ; [.3DF8.0020.0002.122A1] # CUNEIFORM SIGN SAG TIMES TAB 122A2 ; [.3DF9.0020.0002.122A2] # CUNEIFORM SIGN SAG TIMES U2 122A3 ; [.3DFA.0020.0002.122A3] # CUNEIFORM SIGN SAG TIMES UB 122A4 ; [.3DFB.0020.0002.122A4] # CUNEIFORM SIGN SAG TIMES UM 122A5 ; [.3DFC.0020.0002.122A5] # CUNEIFORM SIGN SAG TIMES UR 122A6 ; [.3DFD.0020.0002.122A6] # CUNEIFORM SIGN SAG TIMES USH 122A7 ; [.3DFE.0020.0002.122A7] # CUNEIFORM SIGN SAG OVER SAG 122A8 ; [.3DFF.0020.0002.122A8] # CUNEIFORM SIGN SAG GUNU 122A9 ; [.3E00.0020.0002.122A9] # CUNEIFORM SIGN SAL 122AA ; [.3E01.0020.0002.122AA] # CUNEIFORM SIGN SAL LAGAB TIMES ASH2 122AB ; [.3E02.0020.0002.122AB] # CUNEIFORM SIGN SANGA2 122AC ; [.3E03.0020.0002.122AC] # CUNEIFORM SIGN SAR 122AD ; [.3E04.0020.0002.122AD] # CUNEIFORM SIGN SHA 122AE ; [.3E05.0020.0002.122AE] # CUNEIFORM SIGN SHA3 122AF ; [.3E06.0020.0002.122AF] # CUNEIFORM SIGN SHA3 TIMES A 122B0 ; [.3E07.0020.0002.122B0] # CUNEIFORM SIGN SHA3 TIMES BAD 122B1 ; [.3E08.0020.0002.122B1] # CUNEIFORM SIGN SHA3 TIMES GISH 122B2 ; [.3E09.0020.0002.122B2] # CUNEIFORM SIGN SHA3 TIMES NE 122B3 ; [.3E0A.0020.0002.122B3] # CUNEIFORM SIGN SHA3 TIMES SHU2 122B4 ; [.3E0B.0020.0002.122B4] # CUNEIFORM SIGN SHA3 TIMES TUR 122B5 ; [.3E0C.0020.0002.122B5] # CUNEIFORM SIGN SHA3 TIMES U 122B6 ; [.3E0D.0020.0002.122B6] # CUNEIFORM SIGN SHA3 TIMES U PLUS A 122B7 ; [.3E0E.0020.0002.122B7] # CUNEIFORM SIGN SHA6 122B8 ; [.3E0F.0020.0002.122B8] # CUNEIFORM SIGN SHAB6 122B9 ; [.3E10.0020.0002.122B9] # CUNEIFORM SIGN SHAR2 122BA ; [.3E11.0020.0002.122BA] # CUNEIFORM SIGN SHE 122BB ; [.3E12.0020.0002.122BB] # CUNEIFORM SIGN SHE HU 122BC ; [.3E13.0020.0002.122BC] # CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR 122BD ; [.3E14.0020.0002.122BD] # CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR 122BE ; [.3E15.0020.0002.122BE] # CUNEIFORM SIGN SHEG9 122BF ; [.3E16.0020.0002.122BF] # CUNEIFORM SIGN SHEN 122C0 ; [.3E17.0020.0002.122C0] # CUNEIFORM SIGN SHESH 122C1 ; [.3E18.0020.0002.122C1] # CUNEIFORM SIGN SHESH2 122C2 ; [.3E19.0020.0002.122C2] # CUNEIFORM SIGN SHESHLAM 122C3 ; [.3E1A.0020.0002.122C3] # CUNEIFORM SIGN SHID 122C4 ; [.3E1B.0020.0002.122C4] # CUNEIFORM SIGN SHID TIMES A 122C5 ; [.3E1C.0020.0002.122C5] # CUNEIFORM SIGN SHID TIMES IM 122C6 ; [.3E1D.0020.0002.122C6] # CUNEIFORM SIGN SHIM 122C7 ; [.3E1E.0020.0002.122C7] # CUNEIFORM SIGN SHIM TIMES A 122C8 ; [.3E1F.0020.0002.122C8] # CUNEIFORM SIGN SHIM TIMES BAL 122C9 ; [.3E20.0020.0002.122C9] # CUNEIFORM SIGN SHIM TIMES BULUG 122CA ; [.3E21.0020.0002.122CA] # CUNEIFORM SIGN SHIM TIMES DIN 122CB ; [.3E22.0020.0002.122CB] # CUNEIFORM SIGN SHIM TIMES GAR 122CC ; [.3E23.0020.0002.122CC] # CUNEIFORM SIGN SHIM TIMES IGI 122CD ; [.3E24.0020.0002.122CD] # CUNEIFORM SIGN SHIM TIMES IGI GUNU 122CE ; [.3E25.0020.0002.122CE] # CUNEIFORM SIGN SHIM TIMES KUSHU2 122CF ; [.3E26.0020.0002.122CF] # CUNEIFORM SIGN SHIM TIMES LUL 122D0 ; [.3E27.0020.0002.122D0] # CUNEIFORM SIGN SHIM TIMES MUG 122D1 ; [.3E28.0020.0002.122D1] # CUNEIFORM SIGN SHIM TIMES SAL 122D2 ; [.3E29.0020.0002.122D2] # CUNEIFORM SIGN SHINIG 122D3 ; [.3E2A.0020.0002.122D3] # CUNEIFORM SIGN SHIR 122D4 ; [.3E2B.0020.0002.122D4] # CUNEIFORM SIGN SHIR TENU 122D5 ; [.3E2C.0020.0002.122D5] # CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR 122D6 ; [.3E2D.0020.0002.122D6] # CUNEIFORM SIGN SHITA 122D7 ; [.3E2E.0020.0002.122D7] # CUNEIFORM SIGN SHU 122D8 ; [.3E2F.0020.0002.122D8] # CUNEIFORM SIGN SHU OVER INVERTED SHU 122D9 ; [.3E30.0020.0002.122D9] # CUNEIFORM SIGN SHU2 122DA ; [.3E31.0020.0002.122DA] # CUNEIFORM SIGN SHUBUR 122DB ; [.3E32.0020.0002.122DB] # CUNEIFORM SIGN SI 122DC ; [.3E33.0020.0002.122DC] # CUNEIFORM SIGN SI GUNU 122DD ; [.3E34.0020.0002.122DD] # CUNEIFORM SIGN SIG 122DE ; [.3E35.0020.0002.122DE] # CUNEIFORM SIGN SIG4 122DF ; [.3E36.0020.0002.122DF] # CUNEIFORM SIGN SIG4 OVER SIG4 SHU2 122E0 ; [.3E37.0020.0002.122E0] # CUNEIFORM SIGN SIK2 122E1 ; [.3E38.0020.0002.122E1] # CUNEIFORM SIGN SILA3 122E2 ; [.3E39.0020.0002.122E2] # CUNEIFORM SIGN SU 122E3 ; [.3E3A.0020.0002.122E3] # CUNEIFORM SIGN SU OVER SU 122E4 ; [.3E3B.0020.0002.122E4] # CUNEIFORM SIGN SUD 122E5 ; [.3E3C.0020.0002.122E5] # CUNEIFORM SIGN SUD2 122E6 ; [.3E3D.0020.0002.122E6] # CUNEIFORM SIGN SUHUR 122E7 ; [.3E3E.0020.0002.122E7] # CUNEIFORM SIGN SUM 122E8 ; [.3E3F.0020.0002.122E8] # CUNEIFORM SIGN SUMASH 122E9 ; [.3E40.0020.0002.122E9] # CUNEIFORM SIGN SUR 122EA ; [.3E41.0020.0002.122EA] # CUNEIFORM SIGN SUR9 122EB ; [.3E42.0020.0002.122EB] # CUNEIFORM SIGN TA 122EC ; [.3E43.0020.0002.122EC] # CUNEIFORM SIGN TA ASTERISK 122ED ; [.3E44.0020.0002.122ED] # CUNEIFORM SIGN TA TIMES HI 122EE ; [.3E45.0020.0002.122EE] # CUNEIFORM SIGN TA TIMES MI 122EF ; [.3E46.0020.0002.122EF] # CUNEIFORM SIGN TA GUNU 122F0 ; [.3E47.0020.0002.122F0] # CUNEIFORM SIGN TAB 122F1 ; [.3E48.0020.0002.122F1] # CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH 122F2 ; [.3E49.0020.0002.122F2] # CUNEIFORM SIGN TAB SQUARED 122F3 ; [.3E4A.0020.0002.122F3] # CUNEIFORM SIGN TAG 122F4 ; [.3E4B.0020.0002.122F4] # CUNEIFORM SIGN TAG TIMES BI 122F5 ; [.3E4C.0020.0002.122F5] # CUNEIFORM SIGN TAG TIMES GUD 122F6 ; [.3E4D.0020.0002.122F6] # CUNEIFORM SIGN TAG TIMES SHE 122F7 ; [.3E4E.0020.0002.122F7] # CUNEIFORM SIGN TAG TIMES SHU 122F8 ; [.3E4F.0020.0002.122F8] # CUNEIFORM SIGN TAG TIMES TUG2 122F9 ; [.3E50.0020.0002.122F9] # CUNEIFORM SIGN TAG TIMES UD 122FA ; [.3E51.0020.0002.122FA] # CUNEIFORM SIGN TAK4 122FB ; [.3E52.0020.0002.122FB] # CUNEIFORM SIGN TAR 122FC ; [.3E53.0020.0002.122FC] # CUNEIFORM SIGN TE 122FD ; [.3E54.0020.0002.122FD] # CUNEIFORM SIGN TE GUNU 122FE ; [.3E55.0020.0002.122FE] # CUNEIFORM SIGN TI 122FF ; [.3E56.0020.0002.122FF] # CUNEIFORM SIGN TI TENU 12300 ; [.3E57.0020.0002.12300] # CUNEIFORM SIGN TIL 12301 ; [.3E58.0020.0002.12301] # CUNEIFORM SIGN TIR 12302 ; [.3E59.0020.0002.12302] # CUNEIFORM SIGN TIR TIMES TAK4 12303 ; [.3E5A.0020.0002.12303] # CUNEIFORM SIGN TIR OVER TIR 12304 ; [.3E5B.0020.0002.12304] # CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR 12305 ; [.3E5C.0020.0002.12305] # CUNEIFORM SIGN TU 12306 ; [.3E5D.0020.0002.12306] # CUNEIFORM SIGN TUG2 12307 ; [.3E5E.0020.0002.12307] # CUNEIFORM SIGN TUK 12308 ; [.3E5F.0020.0002.12308] # CUNEIFORM SIGN TUM 12309 ; [.3E60.0020.0002.12309] # CUNEIFORM SIGN TUR 1230A ; [.3E61.0020.0002.1230A] # CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA 1230B ; [.3E62.0020.0002.1230B] # CUNEIFORM SIGN U 1230C ; [.3E63.0020.0002.1230C] # CUNEIFORM SIGN U GUD 1230D ; [.3E64.0020.0002.1230D] # CUNEIFORM SIGN U U U 1230E ; [.3E65.0020.0002.1230E] # CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR 1230F ; [.3E66.0020.0002.1230F] # CUNEIFORM SIGN U OVER U SUR OVER SUR 12310 ; [.3E67.0020.0002.12310] # CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED 12311 ; [.3E68.0020.0002.12311] # CUNEIFORM SIGN U2 12312 ; [.3E69.0020.0002.12312] # CUNEIFORM SIGN UB 12313 ; [.3E6A.0020.0002.12313] # CUNEIFORM SIGN UD 12314 ; [.3E6B.0020.0002.12314] # CUNEIFORM SIGN UD KUSHU2 12315 ; [.3E6C.0020.0002.12315] # CUNEIFORM SIGN UD TIMES BAD 12316 ; [.3E6D.0020.0002.12316] # CUNEIFORM SIGN UD TIMES MI 12317 ; [.3E6E.0020.0002.12317] # CUNEIFORM SIGN UD TIMES U PLUS U PLUS U 12318 ; [.3E6F.0020.0002.12318] # CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU 12319 ; [.3E70.0020.0002.12319] # CUNEIFORM SIGN UD GUNU 1231A ; [.3E71.0020.0002.1231A] # CUNEIFORM SIGN UD SHESHIG 1231B ; [.3E72.0020.0002.1231B] # CUNEIFORM SIGN UD SHESHIG TIMES BAD 1231C ; [.3E73.0020.0002.1231C] # CUNEIFORM SIGN UDUG 1231D ; [.3E74.0020.0002.1231D] # CUNEIFORM SIGN UM 1231E ; [.3E75.0020.0002.1231E] # CUNEIFORM SIGN UM TIMES LAGAB 1231F ; [.3E76.0020.0002.1231F] # CUNEIFORM SIGN UM TIMES ME PLUS DA 12320 ; [.3E77.0020.0002.12320] # CUNEIFORM SIGN UM TIMES SHA3 12321 ; [.3E78.0020.0002.12321] # CUNEIFORM SIGN UM TIMES U 12322 ; [.3E79.0020.0002.12322] # CUNEIFORM SIGN UMBIN 12323 ; [.3E7A.0020.0002.12323] # CUNEIFORM SIGN UMUM 12324 ; [.3E7B.0020.0002.12324] # CUNEIFORM SIGN UMUM TIMES KASKAL 12325 ; [.3E7C.0020.0002.12325] # CUNEIFORM SIGN UMUM TIMES PA 12326 ; [.3E7D.0020.0002.12326] # CUNEIFORM SIGN UN 12327 ; [.3E7E.0020.0002.12327] # CUNEIFORM SIGN UN GUNU 12328 ; [.3E7F.0020.0002.12328] # CUNEIFORM SIGN UR 12329 ; [.3E80.0020.0002.12329] # CUNEIFORM SIGN UR CROSSING UR 1232A ; [.3E81.0020.0002.1232A] # CUNEIFORM SIGN UR SHESHIG 1232B ; [.3E82.0020.0002.1232B] # CUNEIFORM SIGN UR2 1232C ; [.3E83.0020.0002.1232C] # CUNEIFORM SIGN UR2 TIMES A PLUS HA 1232D ; [.3E84.0020.0002.1232D] # CUNEIFORM SIGN UR2 TIMES A PLUS NA 1232E ; [.3E85.0020.0002.1232E] # CUNEIFORM SIGN UR2 TIMES AL 1232F ; [.3E86.0020.0002.1232F] # CUNEIFORM SIGN UR2 TIMES HA 12330 ; [.3E87.0020.0002.12330] # CUNEIFORM SIGN UR2 TIMES NUN 12331 ; [.3E88.0020.0002.12331] # CUNEIFORM SIGN UR2 TIMES U2 12332 ; [.3E89.0020.0002.12332] # CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH 12333 ; [.3E8A.0020.0002.12333] # CUNEIFORM SIGN UR2 TIMES U2 PLUS BI 12334 ; [.3E8B.0020.0002.12334] # CUNEIFORM SIGN UR4 12335 ; [.3E8C.0020.0002.12335] # CUNEIFORM SIGN URI 12336 ; [.3E8D.0020.0002.12336] # CUNEIFORM SIGN URI3 12337 ; [.3E8E.0020.0002.12337] # CUNEIFORM SIGN URU 12338 ; [.3E8F.0020.0002.12338] # CUNEIFORM SIGN URU TIMES A 12339 ; [.3E90.0020.0002.12339] # CUNEIFORM SIGN URU TIMES ASHGAB 1233A ; [.3E91.0020.0002.1233A] # CUNEIFORM SIGN URU TIMES BAR 1233B ; [.3E92.0020.0002.1233B] # CUNEIFORM SIGN URU TIMES DUN 1233C ; [.3E93.0020.0002.1233C] # CUNEIFORM SIGN URU TIMES GA 1233D ; [.3E94.0020.0002.1233D] # CUNEIFORM SIGN URU TIMES GAL 1233E ; [.3E95.0020.0002.1233E] # CUNEIFORM SIGN URU TIMES GAN2 TENU 1233F ; [.3E96.0020.0002.1233F] # CUNEIFORM SIGN URU TIMES GAR 12340 ; [.3E97.0020.0002.12340] # CUNEIFORM SIGN URU TIMES GU 12341 ; [.3E98.0020.0002.12341] # CUNEIFORM SIGN URU TIMES HA 12342 ; [.3E99.0020.0002.12342] # CUNEIFORM SIGN URU TIMES IGI 12343 ; [.3E9A.0020.0002.12343] # CUNEIFORM SIGN URU TIMES IM 12344 ; [.3E9B.0020.0002.12344] # CUNEIFORM SIGN URU TIMES ISH 12345 ; [.3E9C.0020.0002.12345] # CUNEIFORM SIGN URU TIMES KI 12346 ; [.3E9D.0020.0002.12346] # CUNEIFORM SIGN URU TIMES LUM 12347 ; [.3E9E.0020.0002.12347] # CUNEIFORM SIGN URU TIMES MIN 12348 ; [.3E9F.0020.0002.12348] # CUNEIFORM SIGN URU TIMES PA 12349 ; [.3EA0.0020.0002.12349] # CUNEIFORM SIGN URU TIMES SHE 1234A ; [.3EA1.0020.0002.1234A] # CUNEIFORM SIGN URU TIMES SIG4 1234B ; [.3EA2.0020.0002.1234B] # CUNEIFORM SIGN URU TIMES TU 1234C ; [.3EA3.0020.0002.1234C] # CUNEIFORM SIGN URU TIMES U PLUS GUD 1234D ; [.3EA4.0020.0002.1234D] # CUNEIFORM SIGN URU TIMES UD 1234E ; [.3EA5.0020.0002.1234E] # CUNEIFORM SIGN URU TIMES URUDA 1234F ; [.3EA6.0020.0002.1234F] # CUNEIFORM SIGN URUDA 12350 ; [.3EA7.0020.0002.12350] # CUNEIFORM SIGN URUDA TIMES U 12351 ; [.3EA8.0020.0002.12351] # CUNEIFORM SIGN USH 12352 ; [.3EA9.0020.0002.12352] # CUNEIFORM SIGN USH TIMES A 12353 ; [.3EAA.0020.0002.12353] # CUNEIFORM SIGN USH TIMES KU 12354 ; [.3EAB.0020.0002.12354] # CUNEIFORM SIGN USH TIMES KUR 12355 ; [.3EAC.0020.0002.12355] # CUNEIFORM SIGN USH TIMES TAK4 12356 ; [.3EAD.0020.0002.12356] # CUNEIFORM SIGN USHX 12357 ; [.3EAE.0020.0002.12357] # CUNEIFORM SIGN USH2 12358 ; [.3EAF.0020.0002.12358] # CUNEIFORM SIGN USHUMX 12359 ; [.3EB0.0020.0002.12359] # CUNEIFORM SIGN UTUKI 1235A ; [.3EB1.0020.0002.1235A] # CUNEIFORM SIGN UZ3 1235B ; [.3EB2.0020.0002.1235B] # CUNEIFORM SIGN UZ3 TIMES KASKAL 1235C ; [.3EB3.0020.0002.1235C] # CUNEIFORM SIGN UZU 1235D ; [.3EB4.0020.0002.1235D] # CUNEIFORM SIGN ZA 1235E ; [.3EB5.0020.0002.1235E] # CUNEIFORM SIGN ZA TENU 1235F ; [.3EB6.0020.0002.1235F] # CUNEIFORM SIGN ZA SQUARED TIMES KUR 12360 ; [.3EB7.0020.0002.12360] # CUNEIFORM SIGN ZAG 12361 ; [.3EB8.0020.0002.12361] # CUNEIFORM SIGN ZAMX 12362 ; [.3EB9.0020.0002.12362] # CUNEIFORM SIGN ZE2 12363 ; [.3EBA.0020.0002.12363] # CUNEIFORM SIGN ZI 12364 ; [.3EBB.0020.0002.12364] # CUNEIFORM SIGN ZI OVER ZI 12365 ; [.3EBC.0020.0002.12365] # CUNEIFORM SIGN ZI3 12366 ; [.3EBD.0020.0002.12366] # CUNEIFORM SIGN ZIB 12367 ; [.3EBE.0020.0002.12367] # CUNEIFORM SIGN ZIB KABA TENU 12368 ; [.3EBF.0020.0002.12368] # CUNEIFORM SIGN ZIG 12369 ; [.3EC0.0020.0002.12369] # CUNEIFORM SIGN ZIZ2 1236A ; [.3EC1.0020.0002.1236A] # CUNEIFORM SIGN ZU 1236B ; [.3EC2.0020.0002.1236B] # CUNEIFORM SIGN ZU5 1236C ; [.3EC3.0020.0002.1236C] # CUNEIFORM SIGN ZU5 TIMES A 1236D ; [.3EC4.0020.0002.1236D] # CUNEIFORM SIGN ZUBUR 1236E ; [.3EC5.0020.0002.1236E] # CUNEIFORM SIGN ZUM 13000 ; [.3EC6.0020.0002.13000] # EGYPTIAN HIEROGLYPH A001 13001 ; [.3EC7.0020.0002.13001] # EGYPTIAN HIEROGLYPH A002 13002 ; [.3EC8.0020.0002.13002] # EGYPTIAN HIEROGLYPH A003 13003 ; [.3EC9.0020.0002.13003] # EGYPTIAN HIEROGLYPH A004 13004 ; [.3ECA.0020.0002.13004] # EGYPTIAN HIEROGLYPH A005 13005 ; [.3ECB.0020.0002.13005] # EGYPTIAN HIEROGLYPH A005A 13006 ; [.3ECC.0020.0002.13006] # EGYPTIAN HIEROGLYPH A006 13007 ; [.3ECD.0020.0002.13007] # EGYPTIAN HIEROGLYPH A006A 13008 ; [.3ECE.0020.0002.13008] # EGYPTIAN HIEROGLYPH A006B 13009 ; [.3ECF.0020.0002.13009] # EGYPTIAN HIEROGLYPH A007 1300A ; [.3ED0.0020.0002.1300A] # EGYPTIAN HIEROGLYPH A008 1300B ; [.3ED1.0020.0002.1300B] # EGYPTIAN HIEROGLYPH A009 1300C ; [.3ED2.0020.0002.1300C] # EGYPTIAN HIEROGLYPH A010 1300D ; [.3ED3.0020.0002.1300D] # EGYPTIAN HIEROGLYPH A011 1300E ; [.3ED4.0020.0002.1300E] # EGYPTIAN HIEROGLYPH A012 1300F ; [.3ED5.0020.0002.1300F] # EGYPTIAN HIEROGLYPH A013 13010 ; [.3ED6.0020.0002.13010] # EGYPTIAN HIEROGLYPH A014 13011 ; [.3ED7.0020.0002.13011] # EGYPTIAN HIEROGLYPH A014A 13012 ; [.3ED8.0020.0002.13012] # EGYPTIAN HIEROGLYPH A015 13013 ; [.3ED9.0020.0002.13013] # EGYPTIAN HIEROGLYPH A016 13014 ; [.3EDA.0020.0002.13014] # EGYPTIAN HIEROGLYPH A017 13015 ; [.3EDB.0020.0002.13015] # EGYPTIAN HIEROGLYPH A017A 13016 ; [.3EDC.0020.0002.13016] # EGYPTIAN HIEROGLYPH A018 13017 ; [.3EDD.0020.0002.13017] # EGYPTIAN HIEROGLYPH A019 13018 ; [.3EDE.0020.0002.13018] # EGYPTIAN HIEROGLYPH A020 13019 ; [.3EDF.0020.0002.13019] # EGYPTIAN HIEROGLYPH A021 1301A ; [.3EE0.0020.0002.1301A] # EGYPTIAN HIEROGLYPH A022 1301B ; [.3EE1.0020.0002.1301B] # EGYPTIAN HIEROGLYPH A023 1301C ; [.3EE2.0020.0002.1301C] # EGYPTIAN HIEROGLYPH A024 1301D ; [.3EE3.0020.0002.1301D] # EGYPTIAN HIEROGLYPH A025 1301E ; [.3EE4.0020.0002.1301E] # EGYPTIAN HIEROGLYPH A026 1301F ; [.3EE5.0020.0002.1301F] # EGYPTIAN HIEROGLYPH A027 13020 ; [.3EE6.0020.0002.13020] # EGYPTIAN HIEROGLYPH A028 13021 ; [.3EE7.0020.0002.13021] # EGYPTIAN HIEROGLYPH A029 13022 ; [.3EE8.0020.0002.13022] # EGYPTIAN HIEROGLYPH A030 13023 ; [.3EE9.0020.0002.13023] # EGYPTIAN HIEROGLYPH A031 13024 ; [.3EEA.0020.0002.13024] # EGYPTIAN HIEROGLYPH A032 13025 ; [.3EEB.0020.0002.13025] # EGYPTIAN HIEROGLYPH A032A 13026 ; [.3EEC.0020.0002.13026] # EGYPTIAN HIEROGLYPH A033 13027 ; [.3EED.0020.0002.13027] # EGYPTIAN HIEROGLYPH A034 13028 ; [.3EEE.0020.0002.13028] # EGYPTIAN HIEROGLYPH A035 13029 ; [.3EEF.0020.0002.13029] # EGYPTIAN HIEROGLYPH A036 1302A ; [.3EF0.0020.0002.1302A] # EGYPTIAN HIEROGLYPH A037 1302B ; [.3EF1.0020.0002.1302B] # EGYPTIAN HIEROGLYPH A038 1302C ; [.3EF2.0020.0002.1302C] # EGYPTIAN HIEROGLYPH A039 1302D ; [.3EF3.0020.0002.1302D] # EGYPTIAN HIEROGLYPH A040 1302E ; [.3EF4.0020.0002.1302E] # EGYPTIAN HIEROGLYPH A040A 1302F ; [.3EF5.0020.0002.1302F] # EGYPTIAN HIEROGLYPH A041 13030 ; [.3EF6.0020.0002.13030] # EGYPTIAN HIEROGLYPH A042 13031 ; [.3EF7.0020.0002.13031] # EGYPTIAN HIEROGLYPH A042A 13032 ; [.3EF8.0020.0002.13032] # EGYPTIAN HIEROGLYPH A043 13033 ; [.3EF9.0020.0002.13033] # EGYPTIAN HIEROGLYPH A043A 13034 ; [.3EFA.0020.0002.13034] # EGYPTIAN HIEROGLYPH A044 13035 ; [.3EFB.0020.0002.13035] # EGYPTIAN HIEROGLYPH A045 13036 ; [.3EFC.0020.0002.13036] # EGYPTIAN HIEROGLYPH A045A 13037 ; [.3EFD.0020.0002.13037] # EGYPTIAN HIEROGLYPH A046 13038 ; [.3EFE.0020.0002.13038] # EGYPTIAN HIEROGLYPH A047 13039 ; [.3EFF.0020.0002.13039] # EGYPTIAN HIEROGLYPH A048 1303A ; [.3F00.0020.0002.1303A] # EGYPTIAN HIEROGLYPH A049 1303B ; [.3F01.0020.0002.1303B] # EGYPTIAN HIEROGLYPH A050 1303C ; [.3F02.0020.0002.1303C] # EGYPTIAN HIEROGLYPH A051 1303D ; [.3F03.0020.0002.1303D] # EGYPTIAN HIEROGLYPH A052 1303E ; [.3F04.0020.0002.1303E] # EGYPTIAN HIEROGLYPH A053 1303F ; [.3F05.0020.0002.1303F] # EGYPTIAN HIEROGLYPH A054 13040 ; [.3F06.0020.0002.13040] # EGYPTIAN HIEROGLYPH A055 13041 ; [.3F07.0020.0002.13041] # EGYPTIAN HIEROGLYPH A056 13042 ; [.3F08.0020.0002.13042] # EGYPTIAN HIEROGLYPH A057 13043 ; [.3F09.0020.0002.13043] # EGYPTIAN HIEROGLYPH A058 13044 ; [.3F0A.0020.0002.13044] # EGYPTIAN HIEROGLYPH A059 13045 ; [.3F0B.0020.0002.13045] # EGYPTIAN HIEROGLYPH A060 13046 ; [.3F0C.0020.0002.13046] # EGYPTIAN HIEROGLYPH A061 13047 ; [.3F0D.0020.0002.13047] # EGYPTIAN HIEROGLYPH A062 13048 ; [.3F0E.0020.0002.13048] # EGYPTIAN HIEROGLYPH A063 13049 ; [.3F0F.0020.0002.13049] # EGYPTIAN HIEROGLYPH A064 1304A ; [.3F10.0020.0002.1304A] # EGYPTIAN HIEROGLYPH A065 1304B ; [.3F11.0020.0002.1304B] # EGYPTIAN HIEROGLYPH A066 1304C ; [.3F12.0020.0002.1304C] # EGYPTIAN HIEROGLYPH A067 1304D ; [.3F13.0020.0002.1304D] # EGYPTIAN HIEROGLYPH A068 1304E ; [.3F14.0020.0002.1304E] # EGYPTIAN HIEROGLYPH A069 1304F ; [.3F15.0020.0002.1304F] # EGYPTIAN HIEROGLYPH A070 13050 ; [.3F16.0020.0002.13050] # EGYPTIAN HIEROGLYPH B001 13051 ; [.3F17.0020.0002.13051] # EGYPTIAN HIEROGLYPH B002 13052 ; [.3F18.0020.0002.13052] # EGYPTIAN HIEROGLYPH B003 13053 ; [.3F19.0020.0002.13053] # EGYPTIAN HIEROGLYPH B004 13054 ; [.3F1A.0020.0002.13054] # EGYPTIAN HIEROGLYPH B005 13055 ; [.3F1B.0020.0002.13055] # EGYPTIAN HIEROGLYPH B005A 13056 ; [.3F1C.0020.0002.13056] # EGYPTIAN HIEROGLYPH B006 13057 ; [.3F1D.0020.0002.13057] # EGYPTIAN HIEROGLYPH B007 13058 ; [.3F1E.0020.0002.13058] # EGYPTIAN HIEROGLYPH B008 13059 ; [.3F1F.0020.0002.13059] # EGYPTIAN HIEROGLYPH B009 1305A ; [.3F20.0020.0002.1305A] # EGYPTIAN HIEROGLYPH C001 1305B ; [.3F21.0020.0002.1305B] # EGYPTIAN HIEROGLYPH C002 1305C ; [.3F22.0020.0002.1305C] # EGYPTIAN HIEROGLYPH C002A 1305D ; [.3F23.0020.0002.1305D] # EGYPTIAN HIEROGLYPH C002B 1305E ; [.3F24.0020.0002.1305E] # EGYPTIAN HIEROGLYPH C002C 1305F ; [.3F25.0020.0002.1305F] # EGYPTIAN HIEROGLYPH C003 13060 ; [.3F26.0020.0002.13060] # EGYPTIAN HIEROGLYPH C004 13061 ; [.3F27.0020.0002.13061] # EGYPTIAN HIEROGLYPH C005 13062 ; [.3F28.0020.0002.13062] # EGYPTIAN HIEROGLYPH C006 13063 ; [.3F29.0020.0002.13063] # EGYPTIAN HIEROGLYPH C007 13064 ; [.3F2A.0020.0002.13064] # EGYPTIAN HIEROGLYPH C008 13065 ; [.3F2B.0020.0002.13065] # EGYPTIAN HIEROGLYPH C009 13066 ; [.3F2C.0020.0002.13066] # EGYPTIAN HIEROGLYPH C010 13067 ; [.3F2D.0020.0002.13067] # EGYPTIAN HIEROGLYPH C010A 13068 ; [.3F2E.0020.0002.13068] # EGYPTIAN HIEROGLYPH C011 13069 ; [.3F2F.0020.0002.13069] # EGYPTIAN HIEROGLYPH C012 1306A ; [.3F30.0020.0002.1306A] # EGYPTIAN HIEROGLYPH C013 1306B ; [.3F31.0020.0002.1306B] # EGYPTIAN HIEROGLYPH C014 1306C ; [.3F32.0020.0002.1306C] # EGYPTIAN HIEROGLYPH C015 1306D ; [.3F33.0020.0002.1306D] # EGYPTIAN HIEROGLYPH C016 1306E ; [.3F34.0020.0002.1306E] # EGYPTIAN HIEROGLYPH C017 1306F ; [.3F35.0020.0002.1306F] # EGYPTIAN HIEROGLYPH C018 13070 ; [.3F36.0020.0002.13070] # EGYPTIAN HIEROGLYPH C019 13071 ; [.3F37.0020.0002.13071] # EGYPTIAN HIEROGLYPH C020 13072 ; [.3F38.0020.0002.13072] # EGYPTIAN HIEROGLYPH C021 13073 ; [.3F39.0020.0002.13073] # EGYPTIAN HIEROGLYPH C022 13074 ; [.3F3A.0020.0002.13074] # EGYPTIAN HIEROGLYPH C023 13075 ; [.3F3B.0020.0002.13075] # EGYPTIAN HIEROGLYPH C024 13076 ; [.3F3C.0020.0002.13076] # EGYPTIAN HIEROGLYPH D001 13077 ; [.3F3D.0020.0002.13077] # EGYPTIAN HIEROGLYPH D002 13078 ; [.3F3E.0020.0002.13078] # EGYPTIAN HIEROGLYPH D003 13079 ; [.3F3F.0020.0002.13079] # EGYPTIAN HIEROGLYPH D004 1307A ; [.3F40.0020.0002.1307A] # EGYPTIAN HIEROGLYPH D005 1307B ; [.3F41.0020.0002.1307B] # EGYPTIAN HIEROGLYPH D006 1307C ; [.3F42.0020.0002.1307C] # EGYPTIAN HIEROGLYPH D007 1307D ; [.3F43.0020.0002.1307D] # EGYPTIAN HIEROGLYPH D008 1307E ; [.3F44.0020.0002.1307E] # EGYPTIAN HIEROGLYPH D008A 1307F ; [.3F45.0020.0002.1307F] # EGYPTIAN HIEROGLYPH D009 13080 ; [.3F46.0020.0002.13080] # EGYPTIAN HIEROGLYPH D010 13081 ; [.3F47.0020.0002.13081] # EGYPTIAN HIEROGLYPH D011 13082 ; [.3F48.0020.0002.13082] # EGYPTIAN HIEROGLYPH D012 13083 ; [.3F49.0020.0002.13083] # EGYPTIAN HIEROGLYPH D013 13084 ; [.3F4A.0020.0002.13084] # EGYPTIAN HIEROGLYPH D014 13085 ; [.3F4B.0020.0002.13085] # EGYPTIAN HIEROGLYPH D015 13086 ; [.3F4C.0020.0002.13086] # EGYPTIAN HIEROGLYPH D016 13087 ; [.3F4D.0020.0002.13087] # EGYPTIAN HIEROGLYPH D017 13088 ; [.3F4E.0020.0002.13088] # EGYPTIAN HIEROGLYPH D018 13089 ; [.3F4F.0020.0002.13089] # EGYPTIAN HIEROGLYPH D019 1308A ; [.3F50.0020.0002.1308A] # EGYPTIAN HIEROGLYPH D020 1308B ; [.3F51.0020.0002.1308B] # EGYPTIAN HIEROGLYPH D021 1308C ; [.3F52.0020.0002.1308C] # EGYPTIAN HIEROGLYPH D022 1308D ; [.3F53.0020.0002.1308D] # EGYPTIAN HIEROGLYPH D023 1308E ; [.3F54.0020.0002.1308E] # EGYPTIAN HIEROGLYPH D024 1308F ; [.3F55.0020.0002.1308F] # EGYPTIAN HIEROGLYPH D025 13090 ; [.3F56.0020.0002.13090] # EGYPTIAN HIEROGLYPH D026 13091 ; [.3F57.0020.0002.13091] # EGYPTIAN HIEROGLYPH D027 13092 ; [.3F58.0020.0002.13092] # EGYPTIAN HIEROGLYPH D027A 13093 ; [.3F59.0020.0002.13093] # EGYPTIAN HIEROGLYPH D028 13094 ; [.3F5A.0020.0002.13094] # EGYPTIAN HIEROGLYPH D029 13095 ; [.3F5B.0020.0002.13095] # EGYPTIAN HIEROGLYPH D030 13096 ; [.3F5C.0020.0002.13096] # EGYPTIAN HIEROGLYPH D031 13097 ; [.3F5D.0020.0002.13097] # EGYPTIAN HIEROGLYPH D031A 13098 ; [.3F5E.0020.0002.13098] # EGYPTIAN HIEROGLYPH D032 13099 ; [.3F5F.0020.0002.13099] # EGYPTIAN HIEROGLYPH D033 1309A ; [.3F60.0020.0002.1309A] # EGYPTIAN HIEROGLYPH D034 1309B ; [.3F61.0020.0002.1309B] # EGYPTIAN HIEROGLYPH D034A 1309C ; [.3F62.0020.0002.1309C] # EGYPTIAN HIEROGLYPH D035 1309D ; [.3F63.0020.0002.1309D] # EGYPTIAN HIEROGLYPH D036 1309E ; [.3F64.0020.0002.1309E] # EGYPTIAN HIEROGLYPH D037 1309F ; [.3F65.0020.0002.1309F] # EGYPTIAN HIEROGLYPH D038 130A0 ; [.3F66.0020.0002.130A0] # EGYPTIAN HIEROGLYPH D039 130A1 ; [.3F67.0020.0002.130A1] # EGYPTIAN HIEROGLYPH D040 130A2 ; [.3F68.0020.0002.130A2] # EGYPTIAN HIEROGLYPH D041 130A3 ; [.3F69.0020.0002.130A3] # EGYPTIAN HIEROGLYPH D042 130A4 ; [.3F6A.0020.0002.130A4] # EGYPTIAN HIEROGLYPH D043 130A5 ; [.3F6B.0020.0002.130A5] # EGYPTIAN HIEROGLYPH D044 130A6 ; [.3F6C.0020.0002.130A6] # EGYPTIAN HIEROGLYPH D045 130A7 ; [.3F6D.0020.0002.130A7] # EGYPTIAN HIEROGLYPH D046 130A8 ; [.3F6E.0020.0002.130A8] # EGYPTIAN HIEROGLYPH D046A 130A9 ; [.3F6F.0020.0002.130A9] # EGYPTIAN HIEROGLYPH D047 130AA ; [.3F70.0020.0002.130AA] # EGYPTIAN HIEROGLYPH D048 130AB ; [.3F71.0020.0002.130AB] # EGYPTIAN HIEROGLYPH D048A 130AC ; [.3F72.0020.0002.130AC] # EGYPTIAN HIEROGLYPH D049 130AD ; [.3F73.0020.0002.130AD] # EGYPTIAN HIEROGLYPH D050 130AE ; [.3F74.0020.0002.130AE] # EGYPTIAN HIEROGLYPH D050A 130AF ; [.3F75.0020.0002.130AF] # EGYPTIAN HIEROGLYPH D050B 130B0 ; [.3F76.0020.0002.130B0] # EGYPTIAN HIEROGLYPH D050C 130B1 ; [.3F77.0020.0002.130B1] # EGYPTIAN HIEROGLYPH D050D 130B2 ; [.3F78.0020.0002.130B2] # EGYPTIAN HIEROGLYPH D050E 130B3 ; [.3F79.0020.0002.130B3] # EGYPTIAN HIEROGLYPH D050F 130B4 ; [.3F7A.0020.0002.130B4] # EGYPTIAN HIEROGLYPH D050G 130B5 ; [.3F7B.0020.0002.130B5] # EGYPTIAN HIEROGLYPH D050H 130B6 ; [.3F7C.0020.0002.130B6] # EGYPTIAN HIEROGLYPH D050I 130B7 ; [.3F7D.0020.0002.130B7] # EGYPTIAN HIEROGLYPH D051 130B8 ; [.3F7E.0020.0002.130B8] # EGYPTIAN HIEROGLYPH D052 130B9 ; [.3F7F.0020.0002.130B9] # EGYPTIAN HIEROGLYPH D052A 130BA ; [.3F80.0020.0002.130BA] # EGYPTIAN HIEROGLYPH D053 130BB ; [.3F81.0020.0002.130BB] # EGYPTIAN HIEROGLYPH D054 130BC ; [.3F82.0020.0002.130BC] # EGYPTIAN HIEROGLYPH D054A 130BD ; [.3F83.0020.0002.130BD] # EGYPTIAN HIEROGLYPH D055 130BE ; [.3F84.0020.0002.130BE] # EGYPTIAN HIEROGLYPH D056 130BF ; [.3F85.0020.0002.130BF] # EGYPTIAN HIEROGLYPH D057 130C0 ; [.3F86.0020.0002.130C0] # EGYPTIAN HIEROGLYPH D058 130C1 ; [.3F87.0020.0002.130C1] # EGYPTIAN HIEROGLYPH D059 130C2 ; [.3F88.0020.0002.130C2] # EGYPTIAN HIEROGLYPH D060 130C3 ; [.3F89.0020.0002.130C3] # EGYPTIAN HIEROGLYPH D061 130C4 ; [.3F8A.0020.0002.130C4] # EGYPTIAN HIEROGLYPH D062 130C5 ; [.3F8B.0020.0002.130C5] # EGYPTIAN HIEROGLYPH D063 130C6 ; [.3F8C.0020.0002.130C6] # EGYPTIAN HIEROGLYPH D064 130C7 ; [.3F8D.0020.0002.130C7] # EGYPTIAN HIEROGLYPH D065 130C8 ; [.3F8E.0020.0002.130C8] # EGYPTIAN HIEROGLYPH D066 130C9 ; [.3F8F.0020.0002.130C9] # EGYPTIAN HIEROGLYPH D067 130CA ; [.3F90.0020.0002.130CA] # EGYPTIAN HIEROGLYPH D067A 130CB ; [.3F91.0020.0002.130CB] # EGYPTIAN HIEROGLYPH D067B 130CC ; [.3F92.0020.0002.130CC] # EGYPTIAN HIEROGLYPH D067C 130CD ; [.3F93.0020.0002.130CD] # EGYPTIAN HIEROGLYPH D067D 130CE ; [.3F94.0020.0002.130CE] # EGYPTIAN HIEROGLYPH D067E 130CF ; [.3F95.0020.0002.130CF] # EGYPTIAN HIEROGLYPH D067F 130D0 ; [.3F96.0020.0002.130D0] # EGYPTIAN HIEROGLYPH D067G 130D1 ; [.3F97.0020.0002.130D1] # EGYPTIAN HIEROGLYPH D067H 130D2 ; [.3F98.0020.0002.130D2] # EGYPTIAN HIEROGLYPH E001 130D3 ; [.3F99.0020.0002.130D3] # EGYPTIAN HIEROGLYPH E002 130D4 ; [.3F9A.0020.0002.130D4] # EGYPTIAN HIEROGLYPH E003 130D5 ; [.3F9B.0020.0002.130D5] # EGYPTIAN HIEROGLYPH E004 130D6 ; [.3F9C.0020.0002.130D6] # EGYPTIAN HIEROGLYPH E005 130D7 ; [.3F9D.0020.0002.130D7] # EGYPTIAN HIEROGLYPH E006 130D8 ; [.3F9E.0020.0002.130D8] # EGYPTIAN HIEROGLYPH E007 130D9 ; [.3F9F.0020.0002.130D9] # EGYPTIAN HIEROGLYPH E008 130DA ; [.3FA0.0020.0002.130DA] # EGYPTIAN HIEROGLYPH E008A 130DB ; [.3FA1.0020.0002.130DB] # EGYPTIAN HIEROGLYPH E009 130DC ; [.3FA2.0020.0002.130DC] # EGYPTIAN HIEROGLYPH E009A 130DD ; [.3FA3.0020.0002.130DD] # EGYPTIAN HIEROGLYPH E010 130DE ; [.3FA4.0020.0002.130DE] # EGYPTIAN HIEROGLYPH E011 130DF ; [.3FA5.0020.0002.130DF] # EGYPTIAN HIEROGLYPH E012 130E0 ; [.3FA6.0020.0002.130E0] # EGYPTIAN HIEROGLYPH E013 130E1 ; [.3FA7.0020.0002.130E1] # EGYPTIAN HIEROGLYPH E014 130E2 ; [.3FA8.0020.0002.130E2] # EGYPTIAN HIEROGLYPH E015 130E3 ; [.3FA9.0020.0002.130E3] # EGYPTIAN HIEROGLYPH E016 130E4 ; [.3FAA.0020.0002.130E4] # EGYPTIAN HIEROGLYPH E016A 130E5 ; [.3FAB.0020.0002.130E5] # EGYPTIAN HIEROGLYPH E017 130E6 ; [.3FAC.0020.0002.130E6] # EGYPTIAN HIEROGLYPH E017A 130E7 ; [.3FAD.0020.0002.130E7] # EGYPTIAN HIEROGLYPH E018 130E8 ; [.3FAE.0020.0002.130E8] # EGYPTIAN HIEROGLYPH E019 130E9 ; [.3FAF.0020.0002.130E9] # EGYPTIAN HIEROGLYPH E020 130EA ; [.3FB0.0020.0002.130EA] # EGYPTIAN HIEROGLYPH E020A 130EB ; [.3FB1.0020.0002.130EB] # EGYPTIAN HIEROGLYPH E021 130EC ; [.3FB2.0020.0002.130EC] # EGYPTIAN HIEROGLYPH E022 130ED ; [.3FB3.0020.0002.130ED] # EGYPTIAN HIEROGLYPH E023 130EE ; [.3FB4.0020.0002.130EE] # EGYPTIAN HIEROGLYPH E024 130EF ; [.3FB5.0020.0002.130EF] # EGYPTIAN HIEROGLYPH E025 130F0 ; [.3FB6.0020.0002.130F0] # EGYPTIAN HIEROGLYPH E026 130F1 ; [.3FB7.0020.0002.130F1] # EGYPTIAN HIEROGLYPH E027 130F2 ; [.3FB8.0020.0002.130F2] # EGYPTIAN HIEROGLYPH E028 130F3 ; [.3FB9.0020.0002.130F3] # EGYPTIAN HIEROGLYPH E028A 130F4 ; [.3FBA.0020.0002.130F4] # EGYPTIAN HIEROGLYPH E029 130F5 ; [.3FBB.0020.0002.130F5] # EGYPTIAN HIEROGLYPH E030 130F6 ; [.3FBC.0020.0002.130F6] # EGYPTIAN HIEROGLYPH E031 130F7 ; [.3FBD.0020.0002.130F7] # EGYPTIAN HIEROGLYPH E032 130F8 ; [.3FBE.0020.0002.130F8] # EGYPTIAN HIEROGLYPH E033 130F9 ; [.3FBF.0020.0002.130F9] # EGYPTIAN HIEROGLYPH E034 130FA ; [.3FC0.0020.0002.130FA] # EGYPTIAN HIEROGLYPH E034A 130FB ; [.3FC1.0020.0002.130FB] # EGYPTIAN HIEROGLYPH E036 130FC ; [.3FC2.0020.0002.130FC] # EGYPTIAN HIEROGLYPH E037 130FD ; [.3FC3.0020.0002.130FD] # EGYPTIAN HIEROGLYPH E038 130FE ; [.3FC4.0020.0002.130FE] # EGYPTIAN HIEROGLYPH F001 130FF ; [.3FC5.0020.0002.130FF] # EGYPTIAN HIEROGLYPH F001A 13100 ; [.3FC6.0020.0002.13100] # EGYPTIAN HIEROGLYPH F002 13101 ; [.3FC7.0020.0002.13101] # EGYPTIAN HIEROGLYPH F003 13102 ; [.3FC8.0020.0002.13102] # EGYPTIAN HIEROGLYPH F004 13103 ; [.3FC9.0020.0002.13103] # EGYPTIAN HIEROGLYPH F005 13104 ; [.3FCA.0020.0002.13104] # EGYPTIAN HIEROGLYPH F006 13105 ; [.3FCB.0020.0002.13105] # EGYPTIAN HIEROGLYPH F007 13106 ; [.3FCC.0020.0002.13106] # EGYPTIAN HIEROGLYPH F008 13107 ; [.3FCD.0020.0002.13107] # EGYPTIAN HIEROGLYPH F009 13108 ; [.3FCE.0020.0002.13108] # EGYPTIAN HIEROGLYPH F010 13109 ; [.3FCF.0020.0002.13109] # EGYPTIAN HIEROGLYPH F011 1310A ; [.3FD0.0020.0002.1310A] # EGYPTIAN HIEROGLYPH F012 1310B ; [.3FD1.0020.0002.1310B] # EGYPTIAN HIEROGLYPH F013 1310C ; [.3FD2.0020.0002.1310C] # EGYPTIAN HIEROGLYPH F013A 1310D ; [.3FD3.0020.0002.1310D] # EGYPTIAN HIEROGLYPH F014 1310E ; [.3FD4.0020.0002.1310E] # EGYPTIAN HIEROGLYPH F015 1310F ; [.3FD5.0020.0002.1310F] # EGYPTIAN HIEROGLYPH F016 13110 ; [.3FD6.0020.0002.13110] # EGYPTIAN HIEROGLYPH F017 13111 ; [.3FD7.0020.0002.13111] # EGYPTIAN HIEROGLYPH F018 13112 ; [.3FD8.0020.0002.13112] # EGYPTIAN HIEROGLYPH F019 13113 ; [.3FD9.0020.0002.13113] # EGYPTIAN HIEROGLYPH F020 13114 ; [.3FDA.0020.0002.13114] # EGYPTIAN HIEROGLYPH F021 13115 ; [.3FDB.0020.0002.13115] # EGYPTIAN HIEROGLYPH F021A 13116 ; [.3FDC.0020.0002.13116] # EGYPTIAN HIEROGLYPH F022 13117 ; [.3FDD.0020.0002.13117] # EGYPTIAN HIEROGLYPH F023 13118 ; [.3FDE.0020.0002.13118] # EGYPTIAN HIEROGLYPH F024 13119 ; [.3FDF.0020.0002.13119] # EGYPTIAN HIEROGLYPH F025 1311A ; [.3FE0.0020.0002.1311A] # EGYPTIAN HIEROGLYPH F026 1311B ; [.3FE1.0020.0002.1311B] # EGYPTIAN HIEROGLYPH F027 1311C ; [.3FE2.0020.0002.1311C] # EGYPTIAN HIEROGLYPH F028 1311D ; [.3FE3.0020.0002.1311D] # EGYPTIAN HIEROGLYPH F029 1311E ; [.3FE4.0020.0002.1311E] # EGYPTIAN HIEROGLYPH F030 1311F ; [.3FE5.0020.0002.1311F] # EGYPTIAN HIEROGLYPH F031 13120 ; [.3FE6.0020.0002.13120] # EGYPTIAN HIEROGLYPH F031A 13121 ; [.3FE7.0020.0002.13121] # EGYPTIAN HIEROGLYPH F032 13122 ; [.3FE8.0020.0002.13122] # EGYPTIAN HIEROGLYPH F033 13123 ; [.3FE9.0020.0002.13123] # EGYPTIAN HIEROGLYPH F034 13124 ; [.3FEA.0020.0002.13124] # EGYPTIAN HIEROGLYPH F035 13125 ; [.3FEB.0020.0002.13125] # EGYPTIAN HIEROGLYPH F036 13126 ; [.3FEC.0020.0002.13126] # EGYPTIAN HIEROGLYPH F037 13127 ; [.3FED.0020.0002.13127] # EGYPTIAN HIEROGLYPH F037A 13128 ; [.3FEE.0020.0002.13128] # EGYPTIAN HIEROGLYPH F038 13129 ; [.3FEF.0020.0002.13129] # EGYPTIAN HIEROGLYPH F038A 1312A ; [.3FF0.0020.0002.1312A] # EGYPTIAN HIEROGLYPH F039 1312B ; [.3FF1.0020.0002.1312B] # EGYPTIAN HIEROGLYPH F040 1312C ; [.3FF2.0020.0002.1312C] # EGYPTIAN HIEROGLYPH F041 1312D ; [.3FF3.0020.0002.1312D] # EGYPTIAN HIEROGLYPH F042 1312E ; [.3FF4.0020.0002.1312E] # EGYPTIAN HIEROGLYPH F043 1312F ; [.3FF5.0020.0002.1312F] # EGYPTIAN HIEROGLYPH F044 13130 ; [.3FF6.0020.0002.13130] # EGYPTIAN HIEROGLYPH F045 13131 ; [.3FF7.0020.0002.13131] # EGYPTIAN HIEROGLYPH F045A 13132 ; [.3FF8.0020.0002.13132] # EGYPTIAN HIEROGLYPH F046 13133 ; [.3FF9.0020.0002.13133] # EGYPTIAN HIEROGLYPH F046A 13134 ; [.3FFA.0020.0002.13134] # EGYPTIAN HIEROGLYPH F047 13135 ; [.3FFB.0020.0002.13135] # EGYPTIAN HIEROGLYPH F047A 13136 ; [.3FFC.0020.0002.13136] # EGYPTIAN HIEROGLYPH F048 13137 ; [.3FFD.0020.0002.13137] # EGYPTIAN HIEROGLYPH F049 13138 ; [.3FFE.0020.0002.13138] # EGYPTIAN HIEROGLYPH F050 13139 ; [.3FFF.0020.0002.13139] # EGYPTIAN HIEROGLYPH F051 1313A ; [.4000.0020.0002.1313A] # EGYPTIAN HIEROGLYPH F051A 1313B ; [.4001.0020.0002.1313B] # EGYPTIAN HIEROGLYPH F051B 1313C ; [.4002.0020.0002.1313C] # EGYPTIAN HIEROGLYPH F051C 1313D ; [.4003.0020.0002.1313D] # EGYPTIAN HIEROGLYPH F052 1313E ; [.4004.0020.0002.1313E] # EGYPTIAN HIEROGLYPH F053 1313F ; [.4005.0020.0002.1313F] # EGYPTIAN HIEROGLYPH G001 13140 ; [.4006.0020.0002.13140] # EGYPTIAN HIEROGLYPH G002 13141 ; [.4007.0020.0002.13141] # EGYPTIAN HIEROGLYPH G003 13142 ; [.4008.0020.0002.13142] # EGYPTIAN HIEROGLYPH G004 13143 ; [.4009.0020.0002.13143] # EGYPTIAN HIEROGLYPH G005 13144 ; [.400A.0020.0002.13144] # EGYPTIAN HIEROGLYPH G006 13145 ; [.400B.0020.0002.13145] # EGYPTIAN HIEROGLYPH G006A 13146 ; [.400C.0020.0002.13146] # EGYPTIAN HIEROGLYPH G007 13147 ; [.400D.0020.0002.13147] # EGYPTIAN HIEROGLYPH G007A 13148 ; [.400E.0020.0002.13148] # EGYPTIAN HIEROGLYPH G007B 13149 ; [.400F.0020.0002.13149] # EGYPTIAN HIEROGLYPH G008 1314A ; [.4010.0020.0002.1314A] # EGYPTIAN HIEROGLYPH G009 1314B ; [.4011.0020.0002.1314B] # EGYPTIAN HIEROGLYPH G010 1314C ; [.4012.0020.0002.1314C] # EGYPTIAN HIEROGLYPH G011 1314D ; [.4013.0020.0002.1314D] # EGYPTIAN HIEROGLYPH G011A 1314E ; [.4014.0020.0002.1314E] # EGYPTIAN HIEROGLYPH G012 1314F ; [.4015.0020.0002.1314F] # EGYPTIAN HIEROGLYPH G013 13150 ; [.4016.0020.0002.13150] # EGYPTIAN HIEROGLYPH G014 13151 ; [.4017.0020.0002.13151] # EGYPTIAN HIEROGLYPH G015 13152 ; [.4018.0020.0002.13152] # EGYPTIAN HIEROGLYPH G016 13153 ; [.4019.0020.0002.13153] # EGYPTIAN HIEROGLYPH G017 13154 ; [.401A.0020.0002.13154] # EGYPTIAN HIEROGLYPH G018 13155 ; [.401B.0020.0002.13155] # EGYPTIAN HIEROGLYPH G019 13156 ; [.401C.0020.0002.13156] # EGYPTIAN HIEROGLYPH G020 13157 ; [.401D.0020.0002.13157] # EGYPTIAN HIEROGLYPH G020A 13158 ; [.401E.0020.0002.13158] # EGYPTIAN HIEROGLYPH G021 13159 ; [.401F.0020.0002.13159] # EGYPTIAN HIEROGLYPH G022 1315A ; [.4020.0020.0002.1315A] # EGYPTIAN HIEROGLYPH G023 1315B ; [.4021.0020.0002.1315B] # EGYPTIAN HIEROGLYPH G024 1315C ; [.4022.0020.0002.1315C] # EGYPTIAN HIEROGLYPH G025 1315D ; [.4023.0020.0002.1315D] # EGYPTIAN HIEROGLYPH G026 1315E ; [.4024.0020.0002.1315E] # EGYPTIAN HIEROGLYPH G026A 1315F ; [.4025.0020.0002.1315F] # EGYPTIAN HIEROGLYPH G027 13160 ; [.4026.0020.0002.13160] # EGYPTIAN HIEROGLYPH G028 13161 ; [.4027.0020.0002.13161] # EGYPTIAN HIEROGLYPH G029 13162 ; [.4028.0020.0002.13162] # EGYPTIAN HIEROGLYPH G030 13163 ; [.4029.0020.0002.13163] # EGYPTIAN HIEROGLYPH G031 13164 ; [.402A.0020.0002.13164] # EGYPTIAN HIEROGLYPH G032 13165 ; [.402B.0020.0002.13165] # EGYPTIAN HIEROGLYPH G033 13166 ; [.402C.0020.0002.13166] # EGYPTIAN HIEROGLYPH G034 13167 ; [.402D.0020.0002.13167] # EGYPTIAN HIEROGLYPH G035 13168 ; [.402E.0020.0002.13168] # EGYPTIAN HIEROGLYPH G036 13169 ; [.402F.0020.0002.13169] # EGYPTIAN HIEROGLYPH G036A 1316A ; [.4030.0020.0002.1316A] # EGYPTIAN HIEROGLYPH G037 1316B ; [.4031.0020.0002.1316B] # EGYPTIAN HIEROGLYPH G037A 1316C ; [.4032.0020.0002.1316C] # EGYPTIAN HIEROGLYPH G038 1316D ; [.4033.0020.0002.1316D] # EGYPTIAN HIEROGLYPH G039 1316E ; [.4034.0020.0002.1316E] # EGYPTIAN HIEROGLYPH G040 1316F ; [.4035.0020.0002.1316F] # EGYPTIAN HIEROGLYPH G041 13170 ; [.4036.0020.0002.13170] # EGYPTIAN HIEROGLYPH G042 13171 ; [.4037.0020.0002.13171] # EGYPTIAN HIEROGLYPH G043 13172 ; [.4038.0020.0002.13172] # EGYPTIAN HIEROGLYPH G043A 13173 ; [.4039.0020.0002.13173] # EGYPTIAN HIEROGLYPH G044 13174 ; [.403A.0020.0002.13174] # EGYPTIAN HIEROGLYPH G045 13175 ; [.403B.0020.0002.13175] # EGYPTIAN HIEROGLYPH G045A 13176 ; [.403C.0020.0002.13176] # EGYPTIAN HIEROGLYPH G046 13177 ; [.403D.0020.0002.13177] # EGYPTIAN HIEROGLYPH G047 13178 ; [.403E.0020.0002.13178] # EGYPTIAN HIEROGLYPH G048 13179 ; [.403F.0020.0002.13179] # EGYPTIAN HIEROGLYPH G049 1317A ; [.4040.0020.0002.1317A] # EGYPTIAN HIEROGLYPH G050 1317B ; [.4041.0020.0002.1317B] # EGYPTIAN HIEROGLYPH G051 1317C ; [.4042.0020.0002.1317C] # EGYPTIAN HIEROGLYPH G052 1317D ; [.4043.0020.0002.1317D] # EGYPTIAN HIEROGLYPH G053 1317E ; [.4044.0020.0002.1317E] # EGYPTIAN HIEROGLYPH G054 1317F ; [.4045.0020.0002.1317F] # EGYPTIAN HIEROGLYPH H001 13180 ; [.4046.0020.0002.13180] # EGYPTIAN HIEROGLYPH H002 13181 ; [.4047.0020.0002.13181] # EGYPTIAN HIEROGLYPH H003 13182 ; [.4048.0020.0002.13182] # EGYPTIAN HIEROGLYPH H004 13183 ; [.4049.0020.0002.13183] # EGYPTIAN HIEROGLYPH H005 13184 ; [.404A.0020.0002.13184] # EGYPTIAN HIEROGLYPH H006 13185 ; [.404B.0020.0002.13185] # EGYPTIAN HIEROGLYPH H006A 13186 ; [.404C.0020.0002.13186] # EGYPTIAN HIEROGLYPH H007 13187 ; [.404D.0020.0002.13187] # EGYPTIAN HIEROGLYPH H008 13188 ; [.404E.0020.0002.13188] # EGYPTIAN HIEROGLYPH I001 13189 ; [.404F.0020.0002.13189] # EGYPTIAN HIEROGLYPH I002 1318A ; [.4050.0020.0002.1318A] # EGYPTIAN HIEROGLYPH I003 1318B ; [.4051.0020.0002.1318B] # EGYPTIAN HIEROGLYPH I004 1318C ; [.4052.0020.0002.1318C] # EGYPTIAN HIEROGLYPH I005 1318D ; [.4053.0020.0002.1318D] # EGYPTIAN HIEROGLYPH I005A 1318E ; [.4054.0020.0002.1318E] # EGYPTIAN HIEROGLYPH I006 1318F ; [.4055.0020.0002.1318F] # EGYPTIAN HIEROGLYPH I007 13190 ; [.4056.0020.0002.13190] # EGYPTIAN HIEROGLYPH I008 13191 ; [.4057.0020.0002.13191] # EGYPTIAN HIEROGLYPH I009 13192 ; [.4058.0020.0002.13192] # EGYPTIAN HIEROGLYPH I009A 13193 ; [.4059.0020.0002.13193] # EGYPTIAN HIEROGLYPH I010 13194 ; [.405A.0020.0002.13194] # EGYPTIAN HIEROGLYPH I010A 13195 ; [.405B.0020.0002.13195] # EGYPTIAN HIEROGLYPH I011 13196 ; [.405C.0020.0002.13196] # EGYPTIAN HIEROGLYPH I011A 13197 ; [.405D.0020.0002.13197] # EGYPTIAN HIEROGLYPH I012 13198 ; [.405E.0020.0002.13198] # EGYPTIAN HIEROGLYPH I013 13199 ; [.405F.0020.0002.13199] # EGYPTIAN HIEROGLYPH I014 1319A ; [.4060.0020.0002.1319A] # EGYPTIAN HIEROGLYPH I015 1319B ; [.4061.0020.0002.1319B] # EGYPTIAN HIEROGLYPH K001 1319C ; [.4062.0020.0002.1319C] # EGYPTIAN HIEROGLYPH K002 1319D ; [.4063.0020.0002.1319D] # EGYPTIAN HIEROGLYPH K003 1319E ; [.4064.0020.0002.1319E] # EGYPTIAN HIEROGLYPH K004 1319F ; [.4065.0020.0002.1319F] # EGYPTIAN HIEROGLYPH K005 131A0 ; [.4066.0020.0002.131A0] # EGYPTIAN HIEROGLYPH K006 131A1 ; [.4067.0020.0002.131A1] # EGYPTIAN HIEROGLYPH K007 131A2 ; [.4068.0020.0002.131A2] # EGYPTIAN HIEROGLYPH K008 131A3 ; [.4069.0020.0002.131A3] # EGYPTIAN HIEROGLYPH L001 131A4 ; [.406A.0020.0002.131A4] # EGYPTIAN HIEROGLYPH L002 131A5 ; [.406B.0020.0002.131A5] # EGYPTIAN HIEROGLYPH L002A 131A6 ; [.406C.0020.0002.131A6] # EGYPTIAN HIEROGLYPH L003 131A7 ; [.406D.0020.0002.131A7] # EGYPTIAN HIEROGLYPH L004 131A8 ; [.406E.0020.0002.131A8] # EGYPTIAN HIEROGLYPH L005 131A9 ; [.406F.0020.0002.131A9] # EGYPTIAN HIEROGLYPH L006 131AA ; [.4070.0020.0002.131AA] # EGYPTIAN HIEROGLYPH L006A 131AB ; [.4071.0020.0002.131AB] # EGYPTIAN HIEROGLYPH L007 131AC ; [.4072.0020.0002.131AC] # EGYPTIAN HIEROGLYPH L008 131AD ; [.4073.0020.0002.131AD] # EGYPTIAN HIEROGLYPH M001 131AE ; [.4074.0020.0002.131AE] # EGYPTIAN HIEROGLYPH M001A 131AF ; [.4075.0020.0002.131AF] # EGYPTIAN HIEROGLYPH M001B 131B0 ; [.4076.0020.0002.131B0] # EGYPTIAN HIEROGLYPH M002 131B1 ; [.4077.0020.0002.131B1] # EGYPTIAN HIEROGLYPH M003 131B2 ; [.4078.0020.0002.131B2] # EGYPTIAN HIEROGLYPH M003A 131B3 ; [.4079.0020.0002.131B3] # EGYPTIAN HIEROGLYPH M004 131B4 ; [.407A.0020.0002.131B4] # EGYPTIAN HIEROGLYPH M005 131B5 ; [.407B.0020.0002.131B5] # EGYPTIAN HIEROGLYPH M006 131B6 ; [.407C.0020.0002.131B6] # EGYPTIAN HIEROGLYPH M007 131B7 ; [.407D.0020.0002.131B7] # EGYPTIAN HIEROGLYPH M008 131B8 ; [.407E.0020.0002.131B8] # EGYPTIAN HIEROGLYPH M009 131B9 ; [.407F.0020.0002.131B9] # EGYPTIAN HIEROGLYPH M010 131BA ; [.4080.0020.0002.131BA] # EGYPTIAN HIEROGLYPH M010A 131BB ; [.4081.0020.0002.131BB] # EGYPTIAN HIEROGLYPH M011 131BC ; [.4082.0020.0002.131BC] # EGYPTIAN HIEROGLYPH M012 131BD ; [.4083.0020.0002.131BD] # EGYPTIAN HIEROGLYPH M012A 131BE ; [.4084.0020.0002.131BE] # EGYPTIAN HIEROGLYPH M012B 131BF ; [.4085.0020.0002.131BF] # EGYPTIAN HIEROGLYPH M012C 131C0 ; [.4086.0020.0002.131C0] # EGYPTIAN HIEROGLYPH M012D 131C1 ; [.4087.0020.0002.131C1] # EGYPTIAN HIEROGLYPH M012E 131C2 ; [.4088.0020.0002.131C2] # EGYPTIAN HIEROGLYPH M012F 131C3 ; [.4089.0020.0002.131C3] # EGYPTIAN HIEROGLYPH M012G 131C4 ; [.408A.0020.0002.131C4] # EGYPTIAN HIEROGLYPH M012H 131C5 ; [.408B.0020.0002.131C5] # EGYPTIAN HIEROGLYPH M013 131C6 ; [.408C.0020.0002.131C6] # EGYPTIAN HIEROGLYPH M014 131C7 ; [.408D.0020.0002.131C7] # EGYPTIAN HIEROGLYPH M015 131C8 ; [.408E.0020.0002.131C8] # EGYPTIAN HIEROGLYPH M015A 131C9 ; [.408F.0020.0002.131C9] # EGYPTIAN HIEROGLYPH M016 131CA ; [.4090.0020.0002.131CA] # EGYPTIAN HIEROGLYPH M016A 131CB ; [.4091.0020.0002.131CB] # EGYPTIAN HIEROGLYPH M017 131CC ; [.4092.0020.0002.131CC] # EGYPTIAN HIEROGLYPH M017A 131CD ; [.4093.0020.0002.131CD] # EGYPTIAN HIEROGLYPH M018 131CE ; [.4094.0020.0002.131CE] # EGYPTIAN HIEROGLYPH M019 131CF ; [.4095.0020.0002.131CF] # EGYPTIAN HIEROGLYPH M020 131D0 ; [.4096.0020.0002.131D0] # EGYPTIAN HIEROGLYPH M021 131D1 ; [.4097.0020.0002.131D1] # EGYPTIAN HIEROGLYPH M022 131D2 ; [.4098.0020.0002.131D2] # EGYPTIAN HIEROGLYPH M022A 131D3 ; [.4099.0020.0002.131D3] # EGYPTIAN HIEROGLYPH M023 131D4 ; [.409A.0020.0002.131D4] # EGYPTIAN HIEROGLYPH M024 131D5 ; [.409B.0020.0002.131D5] # EGYPTIAN HIEROGLYPH M024A 131D6 ; [.409C.0020.0002.131D6] # EGYPTIAN HIEROGLYPH M025 131D7 ; [.409D.0020.0002.131D7] # EGYPTIAN HIEROGLYPH M026 131D8 ; [.409E.0020.0002.131D8] # EGYPTIAN HIEROGLYPH M027 131D9 ; [.409F.0020.0002.131D9] # EGYPTIAN HIEROGLYPH M028 131DA ; [.40A0.0020.0002.131DA] # EGYPTIAN HIEROGLYPH M028A 131DB ; [.40A1.0020.0002.131DB] # EGYPTIAN HIEROGLYPH M029 131DC ; [.40A2.0020.0002.131DC] # EGYPTIAN HIEROGLYPH M030 131DD ; [.40A3.0020.0002.131DD] # EGYPTIAN HIEROGLYPH M031 131DE ; [.40A4.0020.0002.131DE] # EGYPTIAN HIEROGLYPH M031A 131DF ; [.40A5.0020.0002.131DF] # EGYPTIAN HIEROGLYPH M032 131E0 ; [.40A6.0020.0002.131E0] # EGYPTIAN HIEROGLYPH M033 131E1 ; [.40A7.0020.0002.131E1] # EGYPTIAN HIEROGLYPH M033A 131E2 ; [.40A8.0020.0002.131E2] # EGYPTIAN HIEROGLYPH M033B 131E3 ; [.40A9.0020.0002.131E3] # EGYPTIAN HIEROGLYPH M034 131E4 ; [.40AA.0020.0002.131E4] # EGYPTIAN HIEROGLYPH M035 131E5 ; [.40AB.0020.0002.131E5] # EGYPTIAN HIEROGLYPH M036 131E6 ; [.40AC.0020.0002.131E6] # EGYPTIAN HIEROGLYPH M037 131E7 ; [.40AD.0020.0002.131E7] # EGYPTIAN HIEROGLYPH M038 131E8 ; [.40AE.0020.0002.131E8] # EGYPTIAN HIEROGLYPH M039 131E9 ; [.40AF.0020.0002.131E9] # EGYPTIAN HIEROGLYPH M040 131EA ; [.40B0.0020.0002.131EA] # EGYPTIAN HIEROGLYPH M040A 131EB ; [.40B1.0020.0002.131EB] # EGYPTIAN HIEROGLYPH M041 131EC ; [.40B2.0020.0002.131EC] # EGYPTIAN HIEROGLYPH M042 131ED ; [.40B3.0020.0002.131ED] # EGYPTIAN HIEROGLYPH M043 131EE ; [.40B4.0020.0002.131EE] # EGYPTIAN HIEROGLYPH M044 131EF ; [.40B5.0020.0002.131EF] # EGYPTIAN HIEROGLYPH N001 131F0 ; [.40B6.0020.0002.131F0] # EGYPTIAN HIEROGLYPH N002 131F1 ; [.40B7.0020.0002.131F1] # EGYPTIAN HIEROGLYPH N003 131F2 ; [.40B8.0020.0002.131F2] # EGYPTIAN HIEROGLYPH N004 131F3 ; [.40B9.0020.0002.131F3] # EGYPTIAN HIEROGLYPH N005 131F4 ; [.40BA.0020.0002.131F4] # EGYPTIAN HIEROGLYPH N006 131F5 ; [.40BB.0020.0002.131F5] # EGYPTIAN HIEROGLYPH N007 131F6 ; [.40BC.0020.0002.131F6] # EGYPTIAN HIEROGLYPH N008 131F7 ; [.40BD.0020.0002.131F7] # EGYPTIAN HIEROGLYPH N009 131F8 ; [.40BE.0020.0002.131F8] # EGYPTIAN HIEROGLYPH N010 131F9 ; [.40BF.0020.0002.131F9] # EGYPTIAN HIEROGLYPH N011 131FA ; [.40C0.0020.0002.131FA] # EGYPTIAN HIEROGLYPH N012 131FB ; [.40C1.0020.0002.131FB] # EGYPTIAN HIEROGLYPH N013 131FC ; [.40C2.0020.0002.131FC] # EGYPTIAN HIEROGLYPH N014 131FD ; [.40C3.0020.0002.131FD] # EGYPTIAN HIEROGLYPH N015 131FE ; [.40C4.0020.0002.131FE] # EGYPTIAN HIEROGLYPH N016 131FF ; [.40C5.0020.0002.131FF] # EGYPTIAN HIEROGLYPH N017 13200 ; [.40C6.0020.0002.13200] # EGYPTIAN HIEROGLYPH N018 13201 ; [.40C7.0020.0002.13201] # EGYPTIAN HIEROGLYPH N018A 13202 ; [.40C8.0020.0002.13202] # EGYPTIAN HIEROGLYPH N018B 13203 ; [.40C9.0020.0002.13203] # EGYPTIAN HIEROGLYPH N019 13204 ; [.40CA.0020.0002.13204] # EGYPTIAN HIEROGLYPH N020 13205 ; [.40CB.0020.0002.13205] # EGYPTIAN HIEROGLYPH N021 13206 ; [.40CC.0020.0002.13206] # EGYPTIAN HIEROGLYPH N022 13207 ; [.40CD.0020.0002.13207] # EGYPTIAN HIEROGLYPH N023 13208 ; [.40CE.0020.0002.13208] # EGYPTIAN HIEROGLYPH N024 13209 ; [.40CF.0020.0002.13209] # EGYPTIAN HIEROGLYPH N025 1320A ; [.40D0.0020.0002.1320A] # EGYPTIAN HIEROGLYPH N025A 1320B ; [.40D1.0020.0002.1320B] # EGYPTIAN HIEROGLYPH N026 1320C ; [.40D2.0020.0002.1320C] # EGYPTIAN HIEROGLYPH N027 1320D ; [.40D3.0020.0002.1320D] # EGYPTIAN HIEROGLYPH N028 1320E ; [.40D4.0020.0002.1320E] # EGYPTIAN HIEROGLYPH N029 1320F ; [.40D5.0020.0002.1320F] # EGYPTIAN HIEROGLYPH N030 13210 ; [.40D6.0020.0002.13210] # EGYPTIAN HIEROGLYPH N031 13211 ; [.40D7.0020.0002.13211] # EGYPTIAN HIEROGLYPH N032 13212 ; [.40D8.0020.0002.13212] # EGYPTIAN HIEROGLYPH N033 13213 ; [.40D9.0020.0002.13213] # EGYPTIAN HIEROGLYPH N033A 13214 ; [.40DA.0020.0002.13214] # EGYPTIAN HIEROGLYPH N034 13215 ; [.40DB.0020.0002.13215] # EGYPTIAN HIEROGLYPH N034A 13216 ; [.40DC.0020.0002.13216] # EGYPTIAN HIEROGLYPH N035 13217 ; [.40DD.0020.0002.13217] # EGYPTIAN HIEROGLYPH N035A 13218 ; [.40DE.0020.0002.13218] # EGYPTIAN HIEROGLYPH N036 13219 ; [.40DF.0020.0002.13219] # EGYPTIAN HIEROGLYPH N037 1321A ; [.40E0.0020.0002.1321A] # EGYPTIAN HIEROGLYPH N037A 1321B ; [.40E1.0020.0002.1321B] # EGYPTIAN HIEROGLYPH N038 1321C ; [.40E2.0020.0002.1321C] # EGYPTIAN HIEROGLYPH N039 1321D ; [.40E3.0020.0002.1321D] # EGYPTIAN HIEROGLYPH N040 1321E ; [.40E4.0020.0002.1321E] # EGYPTIAN HIEROGLYPH N041 1321F ; [.40E5.0020.0002.1321F] # EGYPTIAN HIEROGLYPH N042 13220 ; [.40E6.0020.0002.13220] # EGYPTIAN HIEROGLYPH NL001 13221 ; [.40E7.0020.0002.13221] # EGYPTIAN HIEROGLYPH NL002 13222 ; [.40E8.0020.0002.13222] # EGYPTIAN HIEROGLYPH NL003 13223 ; [.40E9.0020.0002.13223] # EGYPTIAN HIEROGLYPH NL004 13224 ; [.40EA.0020.0002.13224] # EGYPTIAN HIEROGLYPH NL005 13225 ; [.40EB.0020.0002.13225] # EGYPTIAN HIEROGLYPH NL005A 13226 ; [.40EC.0020.0002.13226] # EGYPTIAN HIEROGLYPH NL006 13227 ; [.40ED.0020.0002.13227] # EGYPTIAN HIEROGLYPH NL007 13228 ; [.40EE.0020.0002.13228] # EGYPTIAN HIEROGLYPH NL008 13229 ; [.40EF.0020.0002.13229] # EGYPTIAN HIEROGLYPH NL009 1322A ; [.40F0.0020.0002.1322A] # EGYPTIAN HIEROGLYPH NL010 1322B ; [.40F1.0020.0002.1322B] # EGYPTIAN HIEROGLYPH NL011 1322C ; [.40F2.0020.0002.1322C] # EGYPTIAN HIEROGLYPH NL012 1322D ; [.40F3.0020.0002.1322D] # EGYPTIAN HIEROGLYPH NL013 1322E ; [.40F4.0020.0002.1322E] # EGYPTIAN HIEROGLYPH NL014 1322F ; [.40F5.0020.0002.1322F] # EGYPTIAN HIEROGLYPH NL015 13230 ; [.40F6.0020.0002.13230] # EGYPTIAN HIEROGLYPH NL016 13231 ; [.40F7.0020.0002.13231] # EGYPTIAN HIEROGLYPH NL017 13232 ; [.40F8.0020.0002.13232] # EGYPTIAN HIEROGLYPH NL017A 13233 ; [.40F9.0020.0002.13233] # EGYPTIAN HIEROGLYPH NL018 13234 ; [.40FA.0020.0002.13234] # EGYPTIAN HIEROGLYPH NL019 13235 ; [.40FB.0020.0002.13235] # EGYPTIAN HIEROGLYPH NL020 13236 ; [.40FC.0020.0002.13236] # EGYPTIAN HIEROGLYPH NU001 13237 ; [.40FD.0020.0002.13237] # EGYPTIAN HIEROGLYPH NU002 13238 ; [.40FE.0020.0002.13238] # EGYPTIAN HIEROGLYPH NU003 13239 ; [.40FF.0020.0002.13239] # EGYPTIAN HIEROGLYPH NU004 1323A ; [.4100.0020.0002.1323A] # EGYPTIAN HIEROGLYPH NU005 1323B ; [.4101.0020.0002.1323B] # EGYPTIAN HIEROGLYPH NU006 1323C ; [.4102.0020.0002.1323C] # EGYPTIAN HIEROGLYPH NU007 1323D ; [.4103.0020.0002.1323D] # EGYPTIAN HIEROGLYPH NU008 1323E ; [.4104.0020.0002.1323E] # EGYPTIAN HIEROGLYPH NU009 1323F ; [.4105.0020.0002.1323F] # EGYPTIAN HIEROGLYPH NU010 13240 ; [.4106.0020.0002.13240] # EGYPTIAN HIEROGLYPH NU010A 13241 ; [.4107.0020.0002.13241] # EGYPTIAN HIEROGLYPH NU011 13242 ; [.4108.0020.0002.13242] # EGYPTIAN HIEROGLYPH NU011A 13243 ; [.4109.0020.0002.13243] # EGYPTIAN HIEROGLYPH NU012 13244 ; [.410A.0020.0002.13244] # EGYPTIAN HIEROGLYPH NU013 13245 ; [.410B.0020.0002.13245] # EGYPTIAN HIEROGLYPH NU014 13246 ; [.410C.0020.0002.13246] # EGYPTIAN HIEROGLYPH NU015 13247 ; [.410D.0020.0002.13247] # EGYPTIAN HIEROGLYPH NU016 13248 ; [.410E.0020.0002.13248] # EGYPTIAN HIEROGLYPH NU017 13249 ; [.410F.0020.0002.13249] # EGYPTIAN HIEROGLYPH NU018 1324A ; [.4110.0020.0002.1324A] # EGYPTIAN HIEROGLYPH NU018A 1324B ; [.4111.0020.0002.1324B] # EGYPTIAN HIEROGLYPH NU019 1324C ; [.4112.0020.0002.1324C] # EGYPTIAN HIEROGLYPH NU020 1324D ; [.4113.0020.0002.1324D] # EGYPTIAN HIEROGLYPH NU021 1324E ; [.4114.0020.0002.1324E] # EGYPTIAN HIEROGLYPH NU022 1324F ; [.4115.0020.0002.1324F] # EGYPTIAN HIEROGLYPH NU022A 13250 ; [.4116.0020.0002.13250] # EGYPTIAN HIEROGLYPH O001 13251 ; [.4117.0020.0002.13251] # EGYPTIAN HIEROGLYPH O001A 13252 ; [.4118.0020.0002.13252] # EGYPTIAN HIEROGLYPH O002 13253 ; [.4119.0020.0002.13253] # EGYPTIAN HIEROGLYPH O003 13254 ; [.411A.0020.0002.13254] # EGYPTIAN HIEROGLYPH O004 13255 ; [.411B.0020.0002.13255] # EGYPTIAN HIEROGLYPH O005 13256 ; [.411C.0020.0002.13256] # EGYPTIAN HIEROGLYPH O005A 13257 ; [.411D.0020.0002.13257] # EGYPTIAN HIEROGLYPH O006 13258 ; [.411E.0020.0002.13258] # EGYPTIAN HIEROGLYPH O006A 13259 ; [.411F.0020.0002.13259] # EGYPTIAN HIEROGLYPH O006B 1325A ; [.4120.0020.0002.1325A] # EGYPTIAN HIEROGLYPH O006C 1325B ; [.4121.0020.0002.1325B] # EGYPTIAN HIEROGLYPH O006D 1325C ; [.4122.0020.0002.1325C] # EGYPTIAN HIEROGLYPH O006E 1325D ; [.4123.0020.0002.1325D] # EGYPTIAN HIEROGLYPH O006F 1325E ; [.4124.0020.0002.1325E] # EGYPTIAN HIEROGLYPH O007 1325F ; [.4125.0020.0002.1325F] # EGYPTIAN HIEROGLYPH O008 13260 ; [.4126.0020.0002.13260] # EGYPTIAN HIEROGLYPH O009 13261 ; [.4127.0020.0002.13261] # EGYPTIAN HIEROGLYPH O010 13262 ; [.4128.0020.0002.13262] # EGYPTIAN HIEROGLYPH O010A 13263 ; [.4129.0020.0002.13263] # EGYPTIAN HIEROGLYPH O010B 13264 ; [.412A.0020.0002.13264] # EGYPTIAN HIEROGLYPH O010C 13265 ; [.412B.0020.0002.13265] # EGYPTIAN HIEROGLYPH O011 13266 ; [.412C.0020.0002.13266] # EGYPTIAN HIEROGLYPH O012 13267 ; [.412D.0020.0002.13267] # EGYPTIAN HIEROGLYPH O013 13268 ; [.412E.0020.0002.13268] # EGYPTIAN HIEROGLYPH O014 13269 ; [.412F.0020.0002.13269] # EGYPTIAN HIEROGLYPH O015 1326A ; [.4130.0020.0002.1326A] # EGYPTIAN HIEROGLYPH O016 1326B ; [.4131.0020.0002.1326B] # EGYPTIAN HIEROGLYPH O017 1326C ; [.4132.0020.0002.1326C] # EGYPTIAN HIEROGLYPH O018 1326D ; [.4133.0020.0002.1326D] # EGYPTIAN HIEROGLYPH O019 1326E ; [.4134.0020.0002.1326E] # EGYPTIAN HIEROGLYPH O019A 1326F ; [.4135.0020.0002.1326F] # EGYPTIAN HIEROGLYPH O020 13270 ; [.4136.0020.0002.13270] # EGYPTIAN HIEROGLYPH O020A 13271 ; [.4137.0020.0002.13271] # EGYPTIAN HIEROGLYPH O021 13272 ; [.4138.0020.0002.13272] # EGYPTIAN HIEROGLYPH O022 13273 ; [.4139.0020.0002.13273] # EGYPTIAN HIEROGLYPH O023 13274 ; [.413A.0020.0002.13274] # EGYPTIAN HIEROGLYPH O024 13275 ; [.413B.0020.0002.13275] # EGYPTIAN HIEROGLYPH O024A 13276 ; [.413C.0020.0002.13276] # EGYPTIAN HIEROGLYPH O025 13277 ; [.413D.0020.0002.13277] # EGYPTIAN HIEROGLYPH O025A 13278 ; [.413E.0020.0002.13278] # EGYPTIAN HIEROGLYPH O026 13279 ; [.413F.0020.0002.13279] # EGYPTIAN HIEROGLYPH O027 1327A ; [.4140.0020.0002.1327A] # EGYPTIAN HIEROGLYPH O028 1327B ; [.4141.0020.0002.1327B] # EGYPTIAN HIEROGLYPH O029 1327C ; [.4142.0020.0002.1327C] # EGYPTIAN HIEROGLYPH O029A 1327D ; [.4143.0020.0002.1327D] # EGYPTIAN HIEROGLYPH O030 1327E ; [.4144.0020.0002.1327E] # EGYPTIAN HIEROGLYPH O030A 1327F ; [.4145.0020.0002.1327F] # EGYPTIAN HIEROGLYPH O031 13280 ; [.4146.0020.0002.13280] # EGYPTIAN HIEROGLYPH O032 13281 ; [.4147.0020.0002.13281] # EGYPTIAN HIEROGLYPH O033 13282 ; [.4148.0020.0002.13282] # EGYPTIAN HIEROGLYPH O033A 13283 ; [.4149.0020.0002.13283] # EGYPTIAN HIEROGLYPH O034 13284 ; [.414A.0020.0002.13284] # EGYPTIAN HIEROGLYPH O035 13285 ; [.414B.0020.0002.13285] # EGYPTIAN HIEROGLYPH O036 13286 ; [.414C.0020.0002.13286] # EGYPTIAN HIEROGLYPH O036A 13287 ; [.414D.0020.0002.13287] # EGYPTIAN HIEROGLYPH O036B 13288 ; [.414E.0020.0002.13288] # EGYPTIAN HIEROGLYPH O036C 13289 ; [.414F.0020.0002.13289] # EGYPTIAN HIEROGLYPH O036D 1328A ; [.4150.0020.0002.1328A] # EGYPTIAN HIEROGLYPH O037 1328B ; [.4151.0020.0002.1328B] # EGYPTIAN HIEROGLYPH O038 1328C ; [.4152.0020.0002.1328C] # EGYPTIAN HIEROGLYPH O039 1328D ; [.4153.0020.0002.1328D] # EGYPTIAN HIEROGLYPH O040 1328E ; [.4154.0020.0002.1328E] # EGYPTIAN HIEROGLYPH O041 1328F ; [.4155.0020.0002.1328F] # EGYPTIAN HIEROGLYPH O042 13290 ; [.4156.0020.0002.13290] # EGYPTIAN HIEROGLYPH O043 13291 ; [.4157.0020.0002.13291] # EGYPTIAN HIEROGLYPH O044 13292 ; [.4158.0020.0002.13292] # EGYPTIAN HIEROGLYPH O045 13293 ; [.4159.0020.0002.13293] # EGYPTIAN HIEROGLYPH O046 13294 ; [.415A.0020.0002.13294] # EGYPTIAN HIEROGLYPH O047 13295 ; [.415B.0020.0002.13295] # EGYPTIAN HIEROGLYPH O048 13296 ; [.415C.0020.0002.13296] # EGYPTIAN HIEROGLYPH O049 13297 ; [.415D.0020.0002.13297] # EGYPTIAN HIEROGLYPH O050 13298 ; [.415E.0020.0002.13298] # EGYPTIAN HIEROGLYPH O050A 13299 ; [.415F.0020.0002.13299] # EGYPTIAN HIEROGLYPH O050B 1329A ; [.4160.0020.0002.1329A] # EGYPTIAN HIEROGLYPH O051 1329B ; [.4161.0020.0002.1329B] # EGYPTIAN HIEROGLYPH P001 1329C ; [.4162.0020.0002.1329C] # EGYPTIAN HIEROGLYPH P001A 1329D ; [.4163.0020.0002.1329D] # EGYPTIAN HIEROGLYPH P002 1329E ; [.4164.0020.0002.1329E] # EGYPTIAN HIEROGLYPH P003 1329F ; [.4165.0020.0002.1329F] # EGYPTIAN HIEROGLYPH P003A 132A0 ; [.4166.0020.0002.132A0] # EGYPTIAN HIEROGLYPH P004 132A1 ; [.4167.0020.0002.132A1] # EGYPTIAN HIEROGLYPH P005 132A2 ; [.4168.0020.0002.132A2] # EGYPTIAN HIEROGLYPH P006 132A3 ; [.4169.0020.0002.132A3] # EGYPTIAN HIEROGLYPH P007 132A4 ; [.416A.0020.0002.132A4] # EGYPTIAN HIEROGLYPH P008 132A5 ; [.416B.0020.0002.132A5] # EGYPTIAN HIEROGLYPH P009 132A6 ; [.416C.0020.0002.132A6] # EGYPTIAN HIEROGLYPH P010 132A7 ; [.416D.0020.0002.132A7] # EGYPTIAN HIEROGLYPH P011 132A8 ; [.416E.0020.0002.132A8] # EGYPTIAN HIEROGLYPH Q001 132A9 ; [.416F.0020.0002.132A9] # EGYPTIAN HIEROGLYPH Q002 132AA ; [.4170.0020.0002.132AA] # EGYPTIAN HIEROGLYPH Q003 132AB ; [.4171.0020.0002.132AB] # EGYPTIAN HIEROGLYPH Q004 132AC ; [.4172.0020.0002.132AC] # EGYPTIAN HIEROGLYPH Q005 132AD ; [.4173.0020.0002.132AD] # EGYPTIAN HIEROGLYPH Q006 132AE ; [.4174.0020.0002.132AE] # EGYPTIAN HIEROGLYPH Q007 132AF ; [.4175.0020.0002.132AF] # EGYPTIAN HIEROGLYPH R001 132B0 ; [.4176.0020.0002.132B0] # EGYPTIAN HIEROGLYPH R002 132B1 ; [.4177.0020.0002.132B1] # EGYPTIAN HIEROGLYPH R002A 132B2 ; [.4178.0020.0002.132B2] # EGYPTIAN HIEROGLYPH R003 132B3 ; [.4179.0020.0002.132B3] # EGYPTIAN HIEROGLYPH R003A 132B4 ; [.417A.0020.0002.132B4] # EGYPTIAN HIEROGLYPH R003B 132B5 ; [.417B.0020.0002.132B5] # EGYPTIAN HIEROGLYPH R004 132B6 ; [.417C.0020.0002.132B6] # EGYPTIAN HIEROGLYPH R005 132B7 ; [.417D.0020.0002.132B7] # EGYPTIAN HIEROGLYPH R006 132B8 ; [.417E.0020.0002.132B8] # EGYPTIAN HIEROGLYPH R007 132B9 ; [.417F.0020.0002.132B9] # EGYPTIAN HIEROGLYPH R008 132BA ; [.4180.0020.0002.132BA] # EGYPTIAN HIEROGLYPH R009 132BB ; [.4181.0020.0002.132BB] # EGYPTIAN HIEROGLYPH R010 132BC ; [.4182.0020.0002.132BC] # EGYPTIAN HIEROGLYPH R010A 132BD ; [.4183.0020.0002.132BD] # EGYPTIAN HIEROGLYPH R011 132BE ; [.4184.0020.0002.132BE] # EGYPTIAN HIEROGLYPH R012 132BF ; [.4185.0020.0002.132BF] # EGYPTIAN HIEROGLYPH R013 132C0 ; [.4186.0020.0002.132C0] # EGYPTIAN HIEROGLYPH R014 132C1 ; [.4187.0020.0002.132C1] # EGYPTIAN HIEROGLYPH R015 132C2 ; [.4188.0020.0002.132C2] # EGYPTIAN HIEROGLYPH R016 132C3 ; [.4189.0020.0002.132C3] # EGYPTIAN HIEROGLYPH R016A 132C4 ; [.418A.0020.0002.132C4] # EGYPTIAN HIEROGLYPH R017 132C5 ; [.418B.0020.0002.132C5] # EGYPTIAN HIEROGLYPH R018 132C6 ; [.418C.0020.0002.132C6] # EGYPTIAN HIEROGLYPH R019 132C7 ; [.418D.0020.0002.132C7] # EGYPTIAN HIEROGLYPH R020 132C8 ; [.418E.0020.0002.132C8] # EGYPTIAN HIEROGLYPH R021 132C9 ; [.418F.0020.0002.132C9] # EGYPTIAN HIEROGLYPH R022 132CA ; [.4190.0020.0002.132CA] # EGYPTIAN HIEROGLYPH R023 132CB ; [.4191.0020.0002.132CB] # EGYPTIAN HIEROGLYPH R024 132CC ; [.4192.0020.0002.132CC] # EGYPTIAN HIEROGLYPH R025 132CD ; [.4193.0020.0002.132CD] # EGYPTIAN HIEROGLYPH R026 132CE ; [.4194.0020.0002.132CE] # EGYPTIAN HIEROGLYPH R027 132CF ; [.4195.0020.0002.132CF] # EGYPTIAN HIEROGLYPH R028 132D0 ; [.4196.0020.0002.132D0] # EGYPTIAN HIEROGLYPH R029 132D1 ; [.4197.0020.0002.132D1] # EGYPTIAN HIEROGLYPH S001 132D2 ; [.4198.0020.0002.132D2] # EGYPTIAN HIEROGLYPH S002 132D3 ; [.4199.0020.0002.132D3] # EGYPTIAN HIEROGLYPH S002A 132D4 ; [.419A.0020.0002.132D4] # EGYPTIAN HIEROGLYPH S003 132D5 ; [.419B.0020.0002.132D5] # EGYPTIAN HIEROGLYPH S004 132D6 ; [.419C.0020.0002.132D6] # EGYPTIAN HIEROGLYPH S005 132D7 ; [.419D.0020.0002.132D7] # EGYPTIAN HIEROGLYPH S006 132D8 ; [.419E.0020.0002.132D8] # EGYPTIAN HIEROGLYPH S006A 132D9 ; [.419F.0020.0002.132D9] # EGYPTIAN HIEROGLYPH S007 132DA ; [.41A0.0020.0002.132DA] # EGYPTIAN HIEROGLYPH S008 132DB ; [.41A1.0020.0002.132DB] # EGYPTIAN HIEROGLYPH S009 132DC ; [.41A2.0020.0002.132DC] # EGYPTIAN HIEROGLYPH S010 132DD ; [.41A3.0020.0002.132DD] # EGYPTIAN HIEROGLYPH S011 132DE ; [.41A4.0020.0002.132DE] # EGYPTIAN HIEROGLYPH S012 132DF ; [.41A5.0020.0002.132DF] # EGYPTIAN HIEROGLYPH S013 132E0 ; [.41A6.0020.0002.132E0] # EGYPTIAN HIEROGLYPH S014 132E1 ; [.41A7.0020.0002.132E1] # EGYPTIAN HIEROGLYPH S014A 132E2 ; [.41A8.0020.0002.132E2] # EGYPTIAN HIEROGLYPH S014B 132E3 ; [.41A9.0020.0002.132E3] # EGYPTIAN HIEROGLYPH S015 132E4 ; [.41AA.0020.0002.132E4] # EGYPTIAN HIEROGLYPH S016 132E5 ; [.41AB.0020.0002.132E5] # EGYPTIAN HIEROGLYPH S017 132E6 ; [.41AC.0020.0002.132E6] # EGYPTIAN HIEROGLYPH S017A 132E7 ; [.41AD.0020.0002.132E7] # EGYPTIAN HIEROGLYPH S018 132E8 ; [.41AE.0020.0002.132E8] # EGYPTIAN HIEROGLYPH S019 132E9 ; [.41AF.0020.0002.132E9] # EGYPTIAN HIEROGLYPH S020 132EA ; [.41B0.0020.0002.132EA] # EGYPTIAN HIEROGLYPH S021 132EB ; [.41B1.0020.0002.132EB] # EGYPTIAN HIEROGLYPH S022 132EC ; [.41B2.0020.0002.132EC] # EGYPTIAN HIEROGLYPH S023 132ED ; [.41B3.0020.0002.132ED] # EGYPTIAN HIEROGLYPH S024 132EE ; [.41B4.0020.0002.132EE] # EGYPTIAN HIEROGLYPH S025 132EF ; [.41B5.0020.0002.132EF] # EGYPTIAN HIEROGLYPH S026 132F0 ; [.41B6.0020.0002.132F0] # EGYPTIAN HIEROGLYPH S026A 132F1 ; [.41B7.0020.0002.132F1] # EGYPTIAN HIEROGLYPH S026B 132F2 ; [.41B8.0020.0002.132F2] # EGYPTIAN HIEROGLYPH S027 132F3 ; [.41B9.0020.0002.132F3] # EGYPTIAN HIEROGLYPH S028 132F4 ; [.41BA.0020.0002.132F4] # EGYPTIAN HIEROGLYPH S029 132F5 ; [.41BB.0020.0002.132F5] # EGYPTIAN HIEROGLYPH S030 132F6 ; [.41BC.0020.0002.132F6] # EGYPTIAN HIEROGLYPH S031 132F7 ; [.41BD.0020.0002.132F7] # EGYPTIAN HIEROGLYPH S032 132F8 ; [.41BE.0020.0002.132F8] # EGYPTIAN HIEROGLYPH S033 132F9 ; [.41BF.0020.0002.132F9] # EGYPTIAN HIEROGLYPH S034 132FA ; [.41C0.0020.0002.132FA] # EGYPTIAN HIEROGLYPH S035 132FB ; [.41C1.0020.0002.132FB] # EGYPTIAN HIEROGLYPH S035A 132FC ; [.41C2.0020.0002.132FC] # EGYPTIAN HIEROGLYPH S036 132FD ; [.41C3.0020.0002.132FD] # EGYPTIAN HIEROGLYPH S037 132FE ; [.41C4.0020.0002.132FE] # EGYPTIAN HIEROGLYPH S038 132FF ; [.41C5.0020.0002.132FF] # EGYPTIAN HIEROGLYPH S039 13300 ; [.41C6.0020.0002.13300] # EGYPTIAN HIEROGLYPH S040 13301 ; [.41C7.0020.0002.13301] # EGYPTIAN HIEROGLYPH S041 13302 ; [.41C8.0020.0002.13302] # EGYPTIAN HIEROGLYPH S042 13303 ; [.41C9.0020.0002.13303] # EGYPTIAN HIEROGLYPH S043 13304 ; [.41CA.0020.0002.13304] # EGYPTIAN HIEROGLYPH S044 13305 ; [.41CB.0020.0002.13305] # EGYPTIAN HIEROGLYPH S045 13306 ; [.41CC.0020.0002.13306] # EGYPTIAN HIEROGLYPH S046 13307 ; [.41CD.0020.0002.13307] # EGYPTIAN HIEROGLYPH T001 13308 ; [.41CE.0020.0002.13308] # EGYPTIAN HIEROGLYPH T002 13309 ; [.41CF.0020.0002.13309] # EGYPTIAN HIEROGLYPH T003 1330A ; [.41D0.0020.0002.1330A] # EGYPTIAN HIEROGLYPH T003A 1330B ; [.41D1.0020.0002.1330B] # EGYPTIAN HIEROGLYPH T004 1330C ; [.41D2.0020.0002.1330C] # EGYPTIAN HIEROGLYPH T005 1330D ; [.41D3.0020.0002.1330D] # EGYPTIAN HIEROGLYPH T006 1330E ; [.41D4.0020.0002.1330E] # EGYPTIAN HIEROGLYPH T007 1330F ; [.41D5.0020.0002.1330F] # EGYPTIAN HIEROGLYPH T007A 13310 ; [.41D6.0020.0002.13310] # EGYPTIAN HIEROGLYPH T008 13311 ; [.41D7.0020.0002.13311] # EGYPTIAN HIEROGLYPH T008A 13312 ; [.41D8.0020.0002.13312] # EGYPTIAN HIEROGLYPH T009 13313 ; [.41D9.0020.0002.13313] # EGYPTIAN HIEROGLYPH T009A 13314 ; [.41DA.0020.0002.13314] # EGYPTIAN HIEROGLYPH T010 13315 ; [.41DB.0020.0002.13315] # EGYPTIAN HIEROGLYPH T011 13316 ; [.41DC.0020.0002.13316] # EGYPTIAN HIEROGLYPH T011A 13317 ; [.41DD.0020.0002.13317] # EGYPTIAN HIEROGLYPH T012 13318 ; [.41DE.0020.0002.13318] # EGYPTIAN HIEROGLYPH T013 13319 ; [.41DF.0020.0002.13319] # EGYPTIAN HIEROGLYPH T014 1331A ; [.41E0.0020.0002.1331A] # EGYPTIAN HIEROGLYPH T015 1331B ; [.41E1.0020.0002.1331B] # EGYPTIAN HIEROGLYPH T016 1331C ; [.41E2.0020.0002.1331C] # EGYPTIAN HIEROGLYPH T016A 1331D ; [.41E3.0020.0002.1331D] # EGYPTIAN HIEROGLYPH T017 1331E ; [.41E4.0020.0002.1331E] # EGYPTIAN HIEROGLYPH T018 1331F ; [.41E5.0020.0002.1331F] # EGYPTIAN HIEROGLYPH T019 13320 ; [.41E6.0020.0002.13320] # EGYPTIAN HIEROGLYPH T020 13321 ; [.41E7.0020.0002.13321] # EGYPTIAN HIEROGLYPH T021 13322 ; [.41E8.0020.0002.13322] # EGYPTIAN HIEROGLYPH T022 13323 ; [.41E9.0020.0002.13323] # EGYPTIAN HIEROGLYPH T023 13324 ; [.41EA.0020.0002.13324] # EGYPTIAN HIEROGLYPH T024 13325 ; [.41EB.0020.0002.13325] # EGYPTIAN HIEROGLYPH T025 13326 ; [.41EC.0020.0002.13326] # EGYPTIAN HIEROGLYPH T026 13327 ; [.41ED.0020.0002.13327] # EGYPTIAN HIEROGLYPH T027 13328 ; [.41EE.0020.0002.13328] # EGYPTIAN HIEROGLYPH T028 13329 ; [.41EF.0020.0002.13329] # EGYPTIAN HIEROGLYPH T029 1332A ; [.41F0.0020.0002.1332A] # EGYPTIAN HIEROGLYPH T030 1332B ; [.41F1.0020.0002.1332B] # EGYPTIAN HIEROGLYPH T031 1332C ; [.41F2.0020.0002.1332C] # EGYPTIAN HIEROGLYPH T032 1332D ; [.41F3.0020.0002.1332D] # EGYPTIAN HIEROGLYPH T032A 1332E ; [.41F4.0020.0002.1332E] # EGYPTIAN HIEROGLYPH T033 1332F ; [.41F5.0020.0002.1332F] # EGYPTIAN HIEROGLYPH T033A 13330 ; [.41F6.0020.0002.13330] # EGYPTIAN HIEROGLYPH T034 13331 ; [.41F7.0020.0002.13331] # EGYPTIAN HIEROGLYPH T035 13332 ; [.41F8.0020.0002.13332] # EGYPTIAN HIEROGLYPH T036 13333 ; [.41F9.0020.0002.13333] # EGYPTIAN HIEROGLYPH U001 13334 ; [.41FA.0020.0002.13334] # EGYPTIAN HIEROGLYPH U002 13335 ; [.41FB.0020.0002.13335] # EGYPTIAN HIEROGLYPH U003 13336 ; [.41FC.0020.0002.13336] # EGYPTIAN HIEROGLYPH U004 13337 ; [.41FD.0020.0002.13337] # EGYPTIAN HIEROGLYPH U005 13338 ; [.41FE.0020.0002.13338] # EGYPTIAN HIEROGLYPH U006 13339 ; [.41FF.0020.0002.13339] # EGYPTIAN HIEROGLYPH U006A 1333A ; [.4200.0020.0002.1333A] # EGYPTIAN HIEROGLYPH U006B 1333B ; [.4201.0020.0002.1333B] # EGYPTIAN HIEROGLYPH U007 1333C ; [.4202.0020.0002.1333C] # EGYPTIAN HIEROGLYPH U008 1333D ; [.4203.0020.0002.1333D] # EGYPTIAN HIEROGLYPH U009 1333E ; [.4204.0020.0002.1333E] # EGYPTIAN HIEROGLYPH U010 1333F ; [.4205.0020.0002.1333F] # EGYPTIAN HIEROGLYPH U011 13340 ; [.4206.0020.0002.13340] # EGYPTIAN HIEROGLYPH U012 13341 ; [.4207.0020.0002.13341] # EGYPTIAN HIEROGLYPH U013 13342 ; [.4208.0020.0002.13342] # EGYPTIAN HIEROGLYPH U014 13343 ; [.4209.0020.0002.13343] # EGYPTIAN HIEROGLYPH U015 13344 ; [.420A.0020.0002.13344] # EGYPTIAN HIEROGLYPH U016 13345 ; [.420B.0020.0002.13345] # EGYPTIAN HIEROGLYPH U017 13346 ; [.420C.0020.0002.13346] # EGYPTIAN HIEROGLYPH U018 13347 ; [.420D.0020.0002.13347] # EGYPTIAN HIEROGLYPH U019 13348 ; [.420E.0020.0002.13348] # EGYPTIAN HIEROGLYPH U020 13349 ; [.420F.0020.0002.13349] # EGYPTIAN HIEROGLYPH U021 1334A ; [.4210.0020.0002.1334A] # EGYPTIAN HIEROGLYPH U022 1334B ; [.4211.0020.0002.1334B] # EGYPTIAN HIEROGLYPH U023 1334C ; [.4212.0020.0002.1334C] # EGYPTIAN HIEROGLYPH U023A 1334D ; [.4213.0020.0002.1334D] # EGYPTIAN HIEROGLYPH U024 1334E ; [.4214.0020.0002.1334E] # EGYPTIAN HIEROGLYPH U025 1334F ; [.4215.0020.0002.1334F] # EGYPTIAN HIEROGLYPH U026 13350 ; [.4216.0020.0002.13350] # EGYPTIAN HIEROGLYPH U027 13351 ; [.4217.0020.0002.13351] # EGYPTIAN HIEROGLYPH U028 13352 ; [.4218.0020.0002.13352] # EGYPTIAN HIEROGLYPH U029 13353 ; [.4219.0020.0002.13353] # EGYPTIAN HIEROGLYPH U029A 13354 ; [.421A.0020.0002.13354] # EGYPTIAN HIEROGLYPH U030 13355 ; [.421B.0020.0002.13355] # EGYPTIAN HIEROGLYPH U031 13356 ; [.421C.0020.0002.13356] # EGYPTIAN HIEROGLYPH U032 13357 ; [.421D.0020.0002.13357] # EGYPTIAN HIEROGLYPH U032A 13358 ; [.421E.0020.0002.13358] # EGYPTIAN HIEROGLYPH U033 13359 ; [.421F.0020.0002.13359] # EGYPTIAN HIEROGLYPH U034 1335A ; [.4220.0020.0002.1335A] # EGYPTIAN HIEROGLYPH U035 1335B ; [.4221.0020.0002.1335B] # EGYPTIAN HIEROGLYPH U036 1335C ; [.4222.0020.0002.1335C] # EGYPTIAN HIEROGLYPH U037 1335D ; [.4223.0020.0002.1335D] # EGYPTIAN HIEROGLYPH U038 1335E ; [.4224.0020.0002.1335E] # EGYPTIAN HIEROGLYPH U039 1335F ; [.4225.0020.0002.1335F] # EGYPTIAN HIEROGLYPH U040 13360 ; [.4226.0020.0002.13360] # EGYPTIAN HIEROGLYPH U041 13361 ; [.4227.0020.0002.13361] # EGYPTIAN HIEROGLYPH U042 13362 ; [.4228.0020.0002.13362] # EGYPTIAN HIEROGLYPH V001 13363 ; [.4229.0020.0002.13363] # EGYPTIAN HIEROGLYPH V001A 13364 ; [.422A.0020.0002.13364] # EGYPTIAN HIEROGLYPH V001B 13365 ; [.422B.0020.0002.13365] # EGYPTIAN HIEROGLYPH V001C 13366 ; [.422C.0020.0002.13366] # EGYPTIAN HIEROGLYPH V001D 13367 ; [.422D.0020.0002.13367] # EGYPTIAN HIEROGLYPH V001E 13368 ; [.422E.0020.0002.13368] # EGYPTIAN HIEROGLYPH V001F 13369 ; [.422F.0020.0002.13369] # EGYPTIAN HIEROGLYPH V001G 1336A ; [.4230.0020.0002.1336A] # EGYPTIAN HIEROGLYPH V001H 1336B ; [.4231.0020.0002.1336B] # EGYPTIAN HIEROGLYPH V001I 1336C ; [.4232.0020.0002.1336C] # EGYPTIAN HIEROGLYPH V002 1336D ; [.4233.0020.0002.1336D] # EGYPTIAN HIEROGLYPH V002A 1336E ; [.4234.0020.0002.1336E] # EGYPTIAN HIEROGLYPH V003 1336F ; [.4235.0020.0002.1336F] # EGYPTIAN HIEROGLYPH V004 13370 ; [.4236.0020.0002.13370] # EGYPTIAN HIEROGLYPH V005 13371 ; [.4237.0020.0002.13371] # EGYPTIAN HIEROGLYPH V006 13372 ; [.4238.0020.0002.13372] # EGYPTIAN HIEROGLYPH V007 13373 ; [.4239.0020.0002.13373] # EGYPTIAN HIEROGLYPH V007A 13374 ; [.423A.0020.0002.13374] # EGYPTIAN HIEROGLYPH V007B 13375 ; [.423B.0020.0002.13375] # EGYPTIAN HIEROGLYPH V008 13376 ; [.423C.0020.0002.13376] # EGYPTIAN HIEROGLYPH V009 13377 ; [.423D.0020.0002.13377] # EGYPTIAN HIEROGLYPH V010 13378 ; [.423E.0020.0002.13378] # EGYPTIAN HIEROGLYPH V011 13379 ; [.423F.0020.0002.13379] # EGYPTIAN HIEROGLYPH V011A 1337A ; [.4240.0020.0002.1337A] # EGYPTIAN HIEROGLYPH V011B 1337B ; [.4241.0020.0002.1337B] # EGYPTIAN HIEROGLYPH V011C 1337C ; [.4242.0020.0002.1337C] # EGYPTIAN HIEROGLYPH V012 1337D ; [.4243.0020.0002.1337D] # EGYPTIAN HIEROGLYPH V012A 1337E ; [.4244.0020.0002.1337E] # EGYPTIAN HIEROGLYPH V012B 1337F ; [.4245.0020.0002.1337F] # EGYPTIAN HIEROGLYPH V013 13380 ; [.4246.0020.0002.13380] # EGYPTIAN HIEROGLYPH V014 13381 ; [.4247.0020.0002.13381] # EGYPTIAN HIEROGLYPH V015 13382 ; [.4248.0020.0002.13382] # EGYPTIAN HIEROGLYPH V016 13383 ; [.4249.0020.0002.13383] # EGYPTIAN HIEROGLYPH V017 13384 ; [.424A.0020.0002.13384] # EGYPTIAN HIEROGLYPH V018 13385 ; [.424B.0020.0002.13385] # EGYPTIAN HIEROGLYPH V019 13386 ; [.424C.0020.0002.13386] # EGYPTIAN HIEROGLYPH V020 13387 ; [.424D.0020.0002.13387] # EGYPTIAN HIEROGLYPH V020A 13388 ; [.424E.0020.0002.13388] # EGYPTIAN HIEROGLYPH V020B 13389 ; [.424F.0020.0002.13389] # EGYPTIAN HIEROGLYPH V020C 1338A ; [.4250.0020.0002.1338A] # EGYPTIAN HIEROGLYPH V020D 1338B ; [.4251.0020.0002.1338B] # EGYPTIAN HIEROGLYPH V020E 1338C ; [.4252.0020.0002.1338C] # EGYPTIAN HIEROGLYPH V020F 1338D ; [.4253.0020.0002.1338D] # EGYPTIAN HIEROGLYPH V020G 1338E ; [.4254.0020.0002.1338E] # EGYPTIAN HIEROGLYPH V020H 1338F ; [.4255.0020.0002.1338F] # EGYPTIAN HIEROGLYPH V020I 13390 ; [.4256.0020.0002.13390] # EGYPTIAN HIEROGLYPH V020J 13391 ; [.4257.0020.0002.13391] # EGYPTIAN HIEROGLYPH V020K 13392 ; [.4258.0020.0002.13392] # EGYPTIAN HIEROGLYPH V020L 13393 ; [.4259.0020.0002.13393] # EGYPTIAN HIEROGLYPH V021 13394 ; [.425A.0020.0002.13394] # EGYPTIAN HIEROGLYPH V022 13395 ; [.425B.0020.0002.13395] # EGYPTIAN HIEROGLYPH V023 13396 ; [.425C.0020.0002.13396] # EGYPTIAN HIEROGLYPH V023A 13397 ; [.425D.0020.0002.13397] # EGYPTIAN HIEROGLYPH V024 13398 ; [.425E.0020.0002.13398] # EGYPTIAN HIEROGLYPH V025 13399 ; [.425F.0020.0002.13399] # EGYPTIAN HIEROGLYPH V026 1339A ; [.4260.0020.0002.1339A] # EGYPTIAN HIEROGLYPH V027 1339B ; [.4261.0020.0002.1339B] # EGYPTIAN HIEROGLYPH V028 1339C ; [.4262.0020.0002.1339C] # EGYPTIAN HIEROGLYPH V028A 1339D ; [.4263.0020.0002.1339D] # EGYPTIAN HIEROGLYPH V029 1339E ; [.4264.0020.0002.1339E] # EGYPTIAN HIEROGLYPH V029A 1339F ; [.4265.0020.0002.1339F] # EGYPTIAN HIEROGLYPH V030 133A0 ; [.4266.0020.0002.133A0] # EGYPTIAN HIEROGLYPH V030A 133A1 ; [.4267.0020.0002.133A1] # EGYPTIAN HIEROGLYPH V031 133A2 ; [.4268.0020.0002.133A2] # EGYPTIAN HIEROGLYPH V031A 133A3 ; [.4269.0020.0002.133A3] # EGYPTIAN HIEROGLYPH V032 133A4 ; [.426A.0020.0002.133A4] # EGYPTIAN HIEROGLYPH V033 133A5 ; [.426B.0020.0002.133A5] # EGYPTIAN HIEROGLYPH V033A 133A6 ; [.426C.0020.0002.133A6] # EGYPTIAN HIEROGLYPH V034 133A7 ; [.426D.0020.0002.133A7] # EGYPTIAN HIEROGLYPH V035 133A8 ; [.426E.0020.0002.133A8] # EGYPTIAN HIEROGLYPH V036 133A9 ; [.426F.0020.0002.133A9] # EGYPTIAN HIEROGLYPH V037 133AA ; [.4270.0020.0002.133AA] # EGYPTIAN HIEROGLYPH V037A 133AB ; [.4271.0020.0002.133AB] # EGYPTIAN HIEROGLYPH V038 133AC ; [.4272.0020.0002.133AC] # EGYPTIAN HIEROGLYPH V039 133AD ; [.4273.0020.0002.133AD] # EGYPTIAN HIEROGLYPH V040 133AE ; [.4274.0020.0002.133AE] # EGYPTIAN HIEROGLYPH V040A 133AF ; [.4275.0020.0002.133AF] # EGYPTIAN HIEROGLYPH W001 133B0 ; [.4276.0020.0002.133B0] # EGYPTIAN HIEROGLYPH W002 133B1 ; [.4277.0020.0002.133B1] # EGYPTIAN HIEROGLYPH W003 133B2 ; [.4278.0020.0002.133B2] # EGYPTIAN HIEROGLYPH W003A 133B3 ; [.4279.0020.0002.133B3] # EGYPTIAN HIEROGLYPH W004 133B4 ; [.427A.0020.0002.133B4] # EGYPTIAN HIEROGLYPH W005 133B5 ; [.427B.0020.0002.133B5] # EGYPTIAN HIEROGLYPH W006 133B6 ; [.427C.0020.0002.133B6] # EGYPTIAN HIEROGLYPH W007 133B7 ; [.427D.0020.0002.133B7] # EGYPTIAN HIEROGLYPH W008 133B8 ; [.427E.0020.0002.133B8] # EGYPTIAN HIEROGLYPH W009 133B9 ; [.427F.0020.0002.133B9] # EGYPTIAN HIEROGLYPH W009A 133BA ; [.4280.0020.0002.133BA] # EGYPTIAN HIEROGLYPH W010 133BB ; [.4281.0020.0002.133BB] # EGYPTIAN HIEROGLYPH W010A 133BC ; [.4282.0020.0002.133BC] # EGYPTIAN HIEROGLYPH W011 133BD ; [.4283.0020.0002.133BD] # EGYPTIAN HIEROGLYPH W012 133BE ; [.4284.0020.0002.133BE] # EGYPTIAN HIEROGLYPH W013 133BF ; [.4285.0020.0002.133BF] # EGYPTIAN HIEROGLYPH W014 133C0 ; [.4286.0020.0002.133C0] # EGYPTIAN HIEROGLYPH W014A 133C1 ; [.4287.0020.0002.133C1] # EGYPTIAN HIEROGLYPH W015 133C2 ; [.4288.0020.0002.133C2] # EGYPTIAN HIEROGLYPH W016 133C3 ; [.4289.0020.0002.133C3] # EGYPTIAN HIEROGLYPH W017 133C4 ; [.428A.0020.0002.133C4] # EGYPTIAN HIEROGLYPH W017A 133C5 ; [.428B.0020.0002.133C5] # EGYPTIAN HIEROGLYPH W018 133C6 ; [.428C.0020.0002.133C6] # EGYPTIAN HIEROGLYPH W018A 133C7 ; [.428D.0020.0002.133C7] # EGYPTIAN HIEROGLYPH W019 133C8 ; [.428E.0020.0002.133C8] # EGYPTIAN HIEROGLYPH W020 133C9 ; [.428F.0020.0002.133C9] # EGYPTIAN HIEROGLYPH W021 133CA ; [.4290.0020.0002.133CA] # EGYPTIAN HIEROGLYPH W022 133CB ; [.4291.0020.0002.133CB] # EGYPTIAN HIEROGLYPH W023 133CC ; [.4292.0020.0002.133CC] # EGYPTIAN HIEROGLYPH W024 133CD ; [.4293.0020.0002.133CD] # EGYPTIAN HIEROGLYPH W024A 133CE ; [.4294.0020.0002.133CE] # EGYPTIAN HIEROGLYPH W025 133CF ; [.4295.0020.0002.133CF] # EGYPTIAN HIEROGLYPH X001 133D0 ; [.4296.0020.0002.133D0] # EGYPTIAN HIEROGLYPH X002 133D1 ; [.4297.0020.0002.133D1] # EGYPTIAN HIEROGLYPH X003 133D2 ; [.4298.0020.0002.133D2] # EGYPTIAN HIEROGLYPH X004 133D3 ; [.4299.0020.0002.133D3] # EGYPTIAN HIEROGLYPH X004A 133D4 ; [.429A.0020.0002.133D4] # EGYPTIAN HIEROGLYPH X004B 133D5 ; [.429B.0020.0002.133D5] # EGYPTIAN HIEROGLYPH X005 133D6 ; [.429C.0020.0002.133D6] # EGYPTIAN HIEROGLYPH X006 133D7 ; [.429D.0020.0002.133D7] # EGYPTIAN HIEROGLYPH X006A 133D8 ; [.429E.0020.0002.133D8] # EGYPTIAN HIEROGLYPH X007 133D9 ; [.429F.0020.0002.133D9] # EGYPTIAN HIEROGLYPH X008 133DA ; [.42A0.0020.0002.133DA] # EGYPTIAN HIEROGLYPH X008A 133DB ; [.42A1.0020.0002.133DB] # EGYPTIAN HIEROGLYPH Y001 133DC ; [.42A2.0020.0002.133DC] # EGYPTIAN HIEROGLYPH Y001A 133DD ; [.42A3.0020.0002.133DD] # EGYPTIAN HIEROGLYPH Y002 133DE ; [.42A4.0020.0002.133DE] # EGYPTIAN HIEROGLYPH Y003 133DF ; [.42A5.0020.0002.133DF] # EGYPTIAN HIEROGLYPH Y004 133E0 ; [.42A6.0020.0002.133E0] # EGYPTIAN HIEROGLYPH Y005 133E1 ; [.42A7.0020.0002.133E1] # EGYPTIAN HIEROGLYPH Y006 133E2 ; [.42A8.0020.0002.133E2] # EGYPTIAN HIEROGLYPH Y007 133E3 ; [.42A9.0020.0002.133E3] # EGYPTIAN HIEROGLYPH Y008 133E4 ; [.42AA.0020.0002.133E4] # EGYPTIAN HIEROGLYPH Z001 133E5 ; [.42AB.0020.0002.133E5] # EGYPTIAN HIEROGLYPH Z002 133E6 ; [.42AC.0020.0002.133E6] # EGYPTIAN HIEROGLYPH Z002A 133E7 ; [.42AD.0020.0002.133E7] # EGYPTIAN HIEROGLYPH Z002B 133E8 ; [.42AE.0020.0002.133E8] # EGYPTIAN HIEROGLYPH Z002C 133E9 ; [.42AF.0020.0002.133E9] # EGYPTIAN HIEROGLYPH Z002D 133EA ; [.42B0.0020.0002.133EA] # EGYPTIAN HIEROGLYPH Z003 133EB ; [.42B1.0020.0002.133EB] # EGYPTIAN HIEROGLYPH Z003A 133EC ; [.42B2.0020.0002.133EC] # EGYPTIAN HIEROGLYPH Z003B 133ED ; [.42B3.0020.0002.133ED] # EGYPTIAN HIEROGLYPH Z004 133EE ; [.42B4.0020.0002.133EE] # EGYPTIAN HIEROGLYPH Z004A 133EF ; [.42B5.0020.0002.133EF] # EGYPTIAN HIEROGLYPH Z005 133F0 ; [.42B6.0020.0002.133F0] # EGYPTIAN HIEROGLYPH Z005A 133F1 ; [.42B7.0020.0002.133F1] # EGYPTIAN HIEROGLYPH Z006 133F2 ; [.42B8.0020.0002.133F2] # EGYPTIAN HIEROGLYPH Z007 133F3 ; [.42B9.0020.0002.133F3] # EGYPTIAN HIEROGLYPH Z008 133F4 ; [.42BA.0020.0002.133F4] # EGYPTIAN HIEROGLYPH Z009 133F5 ; [.42BB.0020.0002.133F5] # EGYPTIAN HIEROGLYPH Z010 133F6 ; [.42BC.0020.0002.133F6] # EGYPTIAN HIEROGLYPH Z011 133F7 ; [.42BD.0020.0002.133F7] # EGYPTIAN HIEROGLYPH Z012 133F8 ; [.42BE.0020.0002.133F8] # EGYPTIAN HIEROGLYPH Z013 133F9 ; [.42BF.0020.0002.133F9] # EGYPTIAN HIEROGLYPH Z014 133FA ; [.42C0.0020.0002.133FA] # EGYPTIAN HIEROGLYPH Z015 133FB ; [.42C1.0020.0002.133FB] # EGYPTIAN HIEROGLYPH Z015A 133FC ; [.42C2.0020.0002.133FC] # EGYPTIAN HIEROGLYPH Z015B 133FD ; [.42C3.0020.0002.133FD] # EGYPTIAN HIEROGLYPH Z015C 133FE ; [.42C4.0020.0002.133FE] # EGYPTIAN HIEROGLYPH Z015D 133FF ; [.42C5.0020.0002.133FF] # EGYPTIAN HIEROGLYPH Z015E 13400 ; [.42C6.0020.0002.13400] # EGYPTIAN HIEROGLYPH Z015F 13401 ; [.42C7.0020.0002.13401] # EGYPTIAN HIEROGLYPH Z015G 13402 ; [.42C8.0020.0002.13402] # EGYPTIAN HIEROGLYPH Z015H 13403 ; [.42C9.0020.0002.13403] # EGYPTIAN HIEROGLYPH Z015I 13404 ; [.42CA.0020.0002.13404] # EGYPTIAN HIEROGLYPH Z016 13405 ; [.42CB.0020.0002.13405] # EGYPTIAN HIEROGLYPH Z016A 13406 ; [.42CC.0020.0002.13406] # EGYPTIAN HIEROGLYPH Z016B 13407 ; [.42CD.0020.0002.13407] # EGYPTIAN HIEROGLYPH Z016C 13408 ; [.42CE.0020.0002.13408] # EGYPTIAN HIEROGLYPH Z016D 13409 ; [.42CF.0020.0002.13409] # EGYPTIAN HIEROGLYPH Z016E 1340A ; [.42D0.0020.0002.1340A] # EGYPTIAN HIEROGLYPH Z016F 1340B ; [.42D1.0020.0002.1340B] # EGYPTIAN HIEROGLYPH Z016G 1340C ; [.42D2.0020.0002.1340C] # EGYPTIAN HIEROGLYPH Z016H 1340D ; [.42D3.0020.0002.1340D] # EGYPTIAN HIEROGLYPH AA001 1340E ; [.42D4.0020.0002.1340E] # EGYPTIAN HIEROGLYPH AA002 1340F ; [.42D5.0020.0002.1340F] # EGYPTIAN HIEROGLYPH AA003 13410 ; [.42D6.0020.0002.13410] # EGYPTIAN HIEROGLYPH AA004 13411 ; [.42D7.0020.0002.13411] # EGYPTIAN HIEROGLYPH AA005 13412 ; [.42D8.0020.0002.13412] # EGYPTIAN HIEROGLYPH AA006 13413 ; [.42D9.0020.0002.13413] # EGYPTIAN HIEROGLYPH AA007 13414 ; [.42DA.0020.0002.13414] # EGYPTIAN HIEROGLYPH AA007A 13415 ; [.42DB.0020.0002.13415] # EGYPTIAN HIEROGLYPH AA007B 13416 ; [.42DC.0020.0002.13416] # EGYPTIAN HIEROGLYPH AA008 13417 ; [.42DD.0020.0002.13417] # EGYPTIAN HIEROGLYPH AA009 13418 ; [.42DE.0020.0002.13418] # EGYPTIAN HIEROGLYPH AA010 13419 ; [.42DF.0020.0002.13419] # EGYPTIAN HIEROGLYPH AA011 1341A ; [.42E0.0020.0002.1341A] # EGYPTIAN HIEROGLYPH AA012 1341B ; [.42E1.0020.0002.1341B] # EGYPTIAN HIEROGLYPH AA013 1341C ; [.42E2.0020.0002.1341C] # EGYPTIAN HIEROGLYPH AA014 1341D ; [.42E3.0020.0002.1341D] # EGYPTIAN HIEROGLYPH AA015 1341E ; [.42E4.0020.0002.1341E] # EGYPTIAN HIEROGLYPH AA016 1341F ; [.42E5.0020.0002.1341F] # EGYPTIAN HIEROGLYPH AA017 13420 ; [.42E6.0020.0002.13420] # EGYPTIAN HIEROGLYPH AA018 13421 ; [.42E7.0020.0002.13421] # EGYPTIAN HIEROGLYPH AA019 13422 ; [.42E8.0020.0002.13422] # EGYPTIAN HIEROGLYPH AA020 13423 ; [.42E9.0020.0002.13423] # EGYPTIAN HIEROGLYPH AA021 13424 ; [.42EA.0020.0002.13424] # EGYPTIAN HIEROGLYPH AA022 13425 ; [.42EB.0020.0002.13425] # EGYPTIAN HIEROGLYPH AA023 13426 ; [.42EC.0020.0002.13426] # EGYPTIAN HIEROGLYPH AA024 13427 ; [.42ED.0020.0002.13427] # EGYPTIAN HIEROGLYPH AA025 13428 ; [.42EE.0020.0002.13428] # EGYPTIAN HIEROGLYPH AA026 13429 ; [.42EF.0020.0002.13429] # EGYPTIAN HIEROGLYPH AA027 1342A ; [.42F0.0020.0002.1342A] # EGYPTIAN HIEROGLYPH AA028 1342B ; [.42F1.0020.0002.1342B] # EGYPTIAN HIEROGLYPH AA029 1342C ; [.42F2.0020.0002.1342C] # EGYPTIAN HIEROGLYPH AA030 1342D ; [.42F3.0020.0002.1342D] # EGYPTIAN HIEROGLYPH AA031 1342E ; [.42F4.0020.0002.1342E] # EGYPTIAN HIEROGLYPH AA032 109A0 ; [.42F5.0020.0002.109A0] # MEROITIC CURSIVE LETTER A 10980 ; [.42F5.0020.0004.10980][.0000.0139.0004.10980] # MEROITIC HIEROGLYPHIC LETTER A 109A1 ; [.42F6.0020.0002.109A1] # MEROITIC CURSIVE LETTER E 10981 ; [.42F6.0020.0004.10981][.0000.0139.0004.10981] # MEROITIC HIEROGLYPHIC LETTER E 109A2 ; [.42F7.0020.0002.109A2] # MEROITIC CURSIVE LETTER I 10982 ; [.42F7.0020.0004.10982][.0000.0139.0004.10982] # MEROITIC HIEROGLYPHIC LETTER I 109A3 ; [.42F8.0020.0002.109A3] # MEROITIC CURSIVE LETTER O 10983 ; [.42F8.0020.0004.10983][.0000.0139.0004.10983] # MEROITIC HIEROGLYPHIC LETTER O 109A4 ; [.42F9.0020.0002.109A4] # MEROITIC CURSIVE LETTER YA 10984 ; [.42F9.0020.0004.10984][.0000.0139.0004.10984] # MEROITIC HIEROGLYPHIC LETTER YA 109A5 ; [.42FA.0020.0002.109A5] # MEROITIC CURSIVE LETTER WA 10985 ; [.42FA.0020.0004.10985][.0000.0139.0004.10985] # MEROITIC HIEROGLYPHIC LETTER WA 109A6 ; [.42FB.0020.0002.109A6] # MEROITIC CURSIVE LETTER BA 10986 ; [.42FB.0020.0004.10986][.0000.0139.0004.10986] # MEROITIC HIEROGLYPHIC LETTER BA 10987 ; [.42FB.0020.0004.10987][.0000.013A.0004.10987] # MEROITIC HIEROGLYPHIC LETTER BA-2 109A7 ; [.42FC.0020.0002.109A7] # MEROITIC CURSIVE LETTER PA 10988 ; [.42FC.0020.0004.10988][.0000.0139.0004.10988] # MEROITIC HIEROGLYPHIC LETTER PA 109A8 ; [.42FD.0020.0002.109A8] # MEROITIC CURSIVE LETTER MA 10989 ; [.42FD.0020.0004.10989][.0000.0139.0004.10989] # MEROITIC HIEROGLYPHIC LETTER MA 109A9 ; [.42FE.0020.0002.109A9] # MEROITIC CURSIVE LETTER NA 1098A ; [.42FE.0020.0004.1098A][.0000.0139.0004.1098A] # MEROITIC HIEROGLYPHIC LETTER NA 1098B ; [.42FE.0020.0004.1098B][.0000.013A.0004.1098B] # MEROITIC HIEROGLYPHIC LETTER NA-2 109AA ; [.42FF.0020.0002.109AA] # MEROITIC CURSIVE LETTER NE 1098C ; [.42FF.0020.0004.1098C][.0000.0139.0004.1098C] # MEROITIC HIEROGLYPHIC LETTER NE 1098D ; [.42FF.0020.0004.1098D][.0000.013A.0004.1098D] # MEROITIC HIEROGLYPHIC LETTER NE-2 109AB ; [.4300.0020.0002.109AB] # MEROITIC CURSIVE LETTER RA 1098E ; [.4300.0020.0004.1098E][.0000.0139.0004.1098E] # MEROITIC HIEROGLYPHIC LETTER RA 1098F ; [.4300.0020.0004.1098F][.0000.013A.0004.1098F] # MEROITIC HIEROGLYPHIC LETTER RA-2 109AC ; [.4301.0020.0002.109AC] # MEROITIC CURSIVE LETTER LA 10990 ; [.4301.0020.0004.10990][.0000.0139.0004.10990] # MEROITIC HIEROGLYPHIC LETTER LA 109AD ; [.4302.0020.0002.109AD] # MEROITIC CURSIVE LETTER KHA 10991 ; [.4302.0020.0004.10991][.0000.0139.0004.10991] # MEROITIC HIEROGLYPHIC LETTER KHA 109AE ; [.4303.0020.0002.109AE] # MEROITIC CURSIVE LETTER HHA 10992 ; [.4303.0020.0004.10992][.0000.0139.0004.10992] # MEROITIC HIEROGLYPHIC LETTER HHA 109AF ; [.4304.0020.0002.109AF] # MEROITIC CURSIVE LETTER SA 109B0 ; [.4304.0020.0004.109B0][.0000.0139.0004.109B0] # MEROITIC CURSIVE LETTER ARCHAIC SA 10993 ; [.4304.0020.0004.10993][.0000.013A.0004.10993] # MEROITIC HIEROGLYPHIC LETTER SA 10994 ; [.4304.0020.0004.10994][.0000.013C.0004.10994] # MEROITIC HIEROGLYPHIC LETTER SA-2 109B1 ; [.4305.0020.0002.109B1] # MEROITIC CURSIVE LETTER SE 10995 ; [.4305.0020.0004.10995][.0000.0139.0004.10995] # MEROITIC HIEROGLYPHIC LETTER SE 109B2 ; [.4306.0020.0002.109B2] # MEROITIC CURSIVE LETTER KA 10996 ; [.4306.0020.0004.10996][.0000.0139.0004.10996] # MEROITIC HIEROGLYPHIC LETTER KA 109B3 ; [.4307.0020.0002.109B3] # MEROITIC CURSIVE LETTER QA 10997 ; [.4307.0020.0004.10997][.0000.0139.0004.10997] # MEROITIC HIEROGLYPHIC LETTER QA 109B4 ; [.4308.0020.0002.109B4] # MEROITIC CURSIVE LETTER TA 10998 ; [.4308.0020.0004.10998][.0000.0139.0004.10998] # MEROITIC HIEROGLYPHIC LETTER TA 10999 ; [.4308.0020.0004.10999][.0000.013A.0004.10999] # MEROITIC HIEROGLYPHIC LETTER TA-2 109B5 ; [.4309.0020.0002.109B5] # MEROITIC CURSIVE LETTER TE 1099A ; [.4309.0020.0004.1099A][.0000.0139.0004.1099A] # MEROITIC HIEROGLYPHIC LETTER TE 1099B ; [.4309.0020.0004.1099B][.0000.013A.0004.1099B] # MEROITIC HIEROGLYPHIC LETTER TE-2 109B6 ; [.430A.0020.0002.109B6] # MEROITIC CURSIVE LETTER TO 1099C ; [.430A.0020.0004.1099C][.0000.0139.0004.1099C] # MEROITIC HIEROGLYPHIC LETTER TO 109B7 ; [.430B.0020.0002.109B7] # MEROITIC CURSIVE LETTER DA 1099D ; [.430B.0020.0004.1099D][.0000.0139.0004.1099D] # MEROITIC HIEROGLYPHIC LETTER DA 109BE ; [.430C.0020.0002.109BE] # MEROITIC CURSIVE LOGOGRAM RMT 109BF ; [.430D.0020.0002.109BF] # MEROITIC CURSIVE LOGOGRAM IMN 1099E ; [.430E.0020.0002.1099E] # MEROITIC HIEROGLYPHIC SYMBOL VIDJ 1099F ; [.430F.0020.0002.1099F] # MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2 2F00 ; [.FB40.0020.0004.4E00][.CE00.0000.0000.4E00] # KANGXI RADICAL ONE 3220 ; [*02FB.0020.0004.3220][.FB40.0020.0004.4E00][.CE00.0000.0000.4E00][*02FC.0020.001F.3220] # PARENTHESIZED IDEOGRAPH ONE 3280 ; [.FB40.0020.0006.4E00][.CE00.0000.0000.4E00] # CIRCLED IDEOGRAPH ONE 3192 ; [.FB40.0020.0014.4E00][.CE00.0000.0000.4E00] # IDEOGRAPHIC ANNOTATION ONE MARK 1F229 ; [.FB40.0020.001C.4E00][.CE00.0000.0000.4E00] # SQUARED CJK UNIFIED IDEOGRAPH-4E00 319C ; [.FB40.0020.0014.4E01][.CE01.0000.0000.4E01] # IDEOGRAPHIC ANNOTATION FOURTH MARK 3226 ; [*02FB.0020.0004.3226][.FB40.0020.0004.4E03][.CE03.0000.0000.4E03][*02FC.0020.001F.3226] # PARENTHESIZED IDEOGRAPH SEVEN 3286 ; [.FB40.0020.0006.4E03][.CE03.0000.0000.4E03] # CIRCLED IDEOGRAPH SEVEN 3222 ; [*02FB.0020.0004.3222][.FB40.0020.0004.4E09][.CE09.0000.0000.4E09][*02FC.0020.001F.3222] # PARENTHESIZED IDEOGRAPH THREE 1F241 ; [*0359.0020.0004.1F241][.FB40.0020.0004.4E09][.CE09.0000.0000.4E09][*035A.0020.001F.1F241] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09 3282 ; [.FB40.0020.0006.4E09][.CE09.0000.0000.4E09] # CIRCLED IDEOGRAPH THREE 3194 ; [.FB40.0020.0014.4E09][.CE09.0000.0000.4E09] # IDEOGRAPHIC ANNOTATION THREE MARK 1F22A ; [.FB40.0020.001C.4E09][.CE09.0000.0000.4E09] # SQUARED CJK UNIFIED IDEOGRAPH-4E09 32A4 ; [.FB40.0020.0006.4E0A][.CE0A.0000.0000.4E0A] # CIRCLED IDEOGRAPH HIGH 3196 ; [.FB40.0020.0014.4E0A][.CE0A.0000.0000.4E0A] # IDEOGRAPHIC ANNOTATION TOP MARK 32A6 ; [.FB40.0020.0006.4E0B][.CE0B.0000.0000.4E0B] # CIRCLED IDEOGRAPH LOW 3198 ; [.FB40.0020.0014.4E0B][.CE0B.0000.0000.4E0B] # IDEOGRAPHIC ANNOTATION BOTTOM MARK F967 ; [.FB40.0020.0002.4E0D][.CE0D.0000.0000.4E0D] # CJK COMPATIBILITY IDEOGRAPH-F967 319B ; [.FB40.0020.0014.4E19][.CE19.0000.0000.4E19] # IDEOGRAPHIC ANNOTATION THIRD MARK FA70 ; [.FB40.0020.0002.4E26][.CE26.0000.0000.4E26] # CJK COMPATIBILITY IDEOGRAPH-FA70 2F01 ; [.FB40.0020.0004.4E28][.CE28.0000.0000.4E28] # KANGXI RADICAL LINE 2EA6 ; [.FB40.0020.0004.4E2C][.CE2C.0000.0000.4E2C] # CJK RADICAL SIMPLIFIED HALF TREE TRUNK 32A5 ; [.FB40.0020.0006.4E2D][.CE2D.0000.0000.4E2D] # CIRCLED IDEOGRAPH CENTRE 3197 ; [.FB40.0020.0014.4E2D][.CE2D.0000.0000.4E2D] # IDEOGRAPHIC ANNOTATION MIDDLE MARK 1F22D ; [.FB40.0020.001C.4E2D][.CE2D.0000.0000.4E2D] # SQUARED CJK UNIFIED IDEOGRAPH-4E2D F905 ; [.FB40.0020.0002.4E32][.CE32.0000.0000.4E32] # CJK COMPATIBILITY IDEOGRAPH-F905 2F02 ; [.FB40.0020.0004.4E36][.CE36.0000.0000.4E36] # KANGXI RADICAL DOT 2E80 ; [.FB40.0020.0004.4E36][.CE36.0000.0000.4E36][.0000.0139.001F.2E80] # CJK RADICAL REPEAT 2F801 ; [.FB40.0020.0002.4E38][.CE38.0000.0000.4E38] # CJK COMPATIBILITY IDEOGRAPH-2F801 F95E ; [.FB40.0020.0002.4E39][.CE39.0000.0000.4E39] # CJK COMPATIBILITY IDEOGRAPH-F95E 2F800 ; [.FB40.0020.0002.4E3D][.CE3D.0000.0000.4E3D] # CJK COMPATIBILITY IDEOGRAPH-2F800 2F03 ; [.FB40.0020.0004.4E3F][.CE3F.0000.0000.4E3F] # KANGXI RADICAL SLASH 2F802 ; [.FB40.0020.0002.4E41][.CE41.0000.0000.4E41] # CJK COMPATIBILITY IDEOGRAPH-2F802 2F04 ; [.FB40.0020.0004.4E59][.CE59.0000.0000.4E59] # KANGXI RADICAL SECOND 319A ; [.FB40.0020.0014.4E59][.CE59.0000.0000.4E59] # IDEOGRAPHIC ANNOTATION SECOND MARK 2E84 ; [.FB40.0020.0004.4E59][.CE59.0000.0000.4E59][.0000.0139.001F.2E84] # CJK RADICAL SECOND THREE 2E83 ; [.FB40.0020.0004.4E5A][.CE5A.0000.0000.4E5A] # CJK RADICAL SECOND TWO 2E82 ; [.FB40.0020.0004.4E5B][.CE5B.0000.0000.4E5B] # CJK RADICAL SECOND ONE 3228 ; [*02FB.0020.0004.3228][.FB40.0020.0004.4E5D][.CE5D.0000.0000.4E5D][*02FC.0020.001F.3228] # PARENTHESIZED IDEOGRAPH NINE 3288 ; [.FB40.0020.0006.4E5D][.CE5D.0000.0000.4E5D] # CIRCLED IDEOGRAPH NINE F91B ; [.FB40.0020.0002.4E82][.CE82.0000.0000.4E82] # CJK COMPATIBILITY IDEOGRAPH-F91B 2F05 ; [.FB40.0020.0004.4E85][.CE85.0000.0000.4E85] # KANGXI RADICAL HOOK F9BA ; [.FB40.0020.0002.4E86][.CE86.0000.0000.4E86] # CJK COMPATIBILITY IDEOGRAPH-F9BA 2F06 ; [.FB40.0020.0004.4E8C][.CE8C.0000.0000.4E8C] # KANGXI RADICAL TWO 3221 ; [*02FB.0020.0004.3221][.FB40.0020.0004.4E8C][.CE8C.0000.0000.4E8C][*02FC.0020.001F.3221] # PARENTHESIZED IDEOGRAPH TWO 1F242 ; [*0359.0020.0004.1F242][.FB40.0020.0004.4E8C][.CE8C.0000.0000.4E8C][*035A.0020.001F.1F242] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C 3281 ; [.FB40.0020.0006.4E8C][.CE8C.0000.0000.4E8C] # CIRCLED IDEOGRAPH TWO 3193 ; [.FB40.0020.0014.4E8C][.CE8C.0000.0000.4E8C] # IDEOGRAPHIC ANNOTATION TWO MARK 1F214 ; [.FB40.0020.001C.4E8C][.CE8C.0000.0000.4E8C] # SQUARED CJK UNIFIED IDEOGRAPH-4E8C 3224 ; [*02FB.0020.0004.3224][.FB40.0020.0004.4E94][.CE94.0000.0000.4E94][*02FC.0020.001F.3224] # PARENTHESIZED IDEOGRAPH FIVE 3284 ; [.FB40.0020.0006.4E94][.CE94.0000.0000.4E94] # CIRCLED IDEOGRAPH FIVE 2F07 ; [.FB40.0020.0004.4EA0][.CEA0.0000.0000.4EA0] # KANGXI RADICAL LID 1F218 ; [.FB40.0020.001C.4EA4][.CEA4.0000.0000.4EA4] # SQUARED CJK UNIFIED IDEOGRAPH-4EA4 F977 ; [.FB40.0020.0002.4EAE][.CEAE.0000.0000.4EAE] # CJK COMPATIBILITY IDEOGRAPH-F977 2F08 ; [.FB40.0020.0004.4EBA][.CEBA.0000.0000.4EBA] # KANGXI RADICAL MAN 319F ; [.FB40.0020.0014.4EBA][.CEBA.0000.0000.4EBA] # IDEOGRAPHIC ANNOTATION MAN MARK 2E85 ; [.FB40.0020.0004.4EBB][.CEBB.0000.0000.4EBB] # CJK RADICAL PERSON F9FD ; [.FB40.0020.0002.4EC0][.CEC0.0000.0000.4EC0] # CJK COMPATIBILITY IDEOGRAPH-F9FD 2F819 ; [.FB40.0020.0002.4ECC][.CECC.0000.0000.4ECC] # CJK COMPATIBILITY IDEOGRAPH-2F819 3239 ; [*02FB.0020.0004.3239][.FB40.0020.0004.4EE3][.CEE3.0000.0000.4EE3][*02FC.0020.001F.3239] # PARENTHESIZED IDEOGRAPH REPRESENT F9A8 ; [.FB40.0020.0002.4EE4][.CEE4.0000.0000.4EE4] # CJK COMPATIBILITY IDEOGRAPH-F9A8 323D ; [*02FB.0020.0004.323D][.FB40.0020.0004.4F01][.CF01.0000.0000.4F01][*02FC.0020.001F.323D] # PARENTHESIZED IDEOGRAPH ENTERPRISE 32AD ; [.FB40.0020.0006.4F01][.CF01.0000.0000.4F01] # CIRCLED IDEOGRAPH ENTERPRISE 3241 ; [*02FB.0020.0004.3241][.FB40.0020.0004.4F11][.CF11.0000.0000.4F11][*02FC.0020.001F.3241] # PARENTHESIZED IDEOGRAPH REST 32A1 ; [.FB40.0020.0006.4F11][.CF11.0000.0000.4F11] # CIRCLED IDEOGRAPH REST 2F804 ; [.FB40.0020.0002.4F60][.CF60.0000.0000.4F60] # CJK COMPATIBILITY IDEOGRAPH-2F804 FA73 ; [.FB40.0020.0002.4F80][.CF80.0000.0000.4F80] # CJK COMPATIBILITY IDEOGRAPH-FA73 F92D ; [.FB40.0020.0002.4F86][.CF86.0000.0000.4F86] # CJK COMPATIBILITY IDEOGRAPH-F92D F9B5 ; [.FB40.0020.0002.4F8B][.CF8B.0000.0000.4F8B] # CJK COMPATIBILITY IDEOGRAPH-F9B5 FA30 ; [.FB40.0020.0002.4FAE][.CFAE.0000.0000.4FAE] # CJK COMPATIBILITY IDEOGRAPH-FA30 2F805 ; [.FB40.0020.0002.4FAE][.CFAE.0000.0000.4FAE] # CJK COMPATIBILITY IDEOGRAPH-2F805 2F806 ; [.FB40.0020.0002.4FBB][.CFBB.0000.0000.4FBB] # CJK COMPATIBILITY IDEOGRAPH-2F806 F965 ; [.FB40.0020.0002.4FBF][.CFBF.0000.0000.4FBF] # CJK COMPATIBILITY IDEOGRAPH-F965 2F807 ; [.FB40.0020.0002.5002][.D002.0000.0000.5002] # CJK COMPATIBILITY IDEOGRAPH-2F807 F9D4 ; [.FB40.0020.0002.502B][.D02B.0000.0000.502B] # CJK COMPATIBILITY IDEOGRAPH-F9D4 2F808 ; [.FB40.0020.0002.507A][.D07A.0000.0000.507A] # CJK COMPATIBILITY IDEOGRAPH-2F808 2F809 ; [.FB40.0020.0002.5099][.D099.0000.0000.5099] # CJK COMPATIBILITY IDEOGRAPH-2F809 2F80B ; [.FB40.0020.0002.50CF][.D0CF.0000.0000.50CF] # CJK COMPATIBILITY IDEOGRAPH-2F80B F9BB ; [.FB40.0020.0002.50DA][.D0DA.0000.0000.50DA] # CJK COMPATIBILITY IDEOGRAPH-F9BB FA31 ; [.FB40.0020.0002.50E7][.D0E7.0000.0000.50E7] # CJK COMPATIBILITY IDEOGRAPH-FA31 2F80A ; [.FB40.0020.0002.50E7][.D0E7.0000.0000.50E7] # CJK COMPATIBILITY IDEOGRAPH-2F80A 329D ; [.FB40.0020.0006.512A][.D12A.0000.0000.512A] # CIRCLED IDEOGRAPH EXCELLENT 2F09 ; [.FB40.0020.0004.513F][.D13F.0000.0000.513F] # KANGXI RADICAL LEGS FA0C ; [.FB40.0020.0002.5140][.D140.0000.0000.5140] # CJK COMPATIBILITY IDEOGRAPH-FA0C FA74 ; [.FB40.0020.0002.5145][.D145.0000.0000.5145] # CJK COMPATIBILITY IDEOGRAPH-FA74 FA32 ; [.FB40.0020.0002.514D][.D14D.0000.0000.514D] # CJK COMPATIBILITY IDEOGRAPH-FA32 2F80E ; [.FB40.0020.0002.514D][.D14D.0000.0000.514D] # CJK COMPATIBILITY IDEOGRAPH-2F80E 2F80F ; [.FB40.0020.0002.5154][.D154.0000.0000.5154] # CJK COMPATIBILITY IDEOGRAPH-2F80F 2F810 ; [.FB40.0020.0002.5164][.D164.0000.0000.5164] # CJK COMPATIBILITY IDEOGRAPH-2F810 2F0A ; [.FB40.0020.0004.5165][.D165.0000.0000.5165] # KANGXI RADICAL ENTER 2F814 ; [.FB40.0020.0002.5167][.D167.0000.0000.5167] # CJK COMPATIBILITY IDEOGRAPH-2F814 FA72 ; [.FB40.0020.0002.5168][.D168.0000.0000.5168] # CJK COMPATIBILITY IDEOGRAPH-FA72 F978 ; [.FB40.0020.0002.5169][.D169.0000.0000.5169] # CJK COMPATIBILITY IDEOGRAPH-F978 2F0B ; [.FB40.0020.0004.516B][.D16B.0000.0000.516B] # KANGXI RADICAL EIGHT 3227 ; [*02FB.0020.0004.3227][.FB40.0020.0004.516B][.D16B.0000.0000.516B][*02FC.0020.001F.3227] # PARENTHESIZED IDEOGRAPH EIGHT 3287 ; [.FB40.0020.0006.516B][.D16B.0000.0000.516B] # CIRCLED IDEOGRAPH EIGHT F9D1 ; [.FB40.0020.0002.516D][.D16D.0000.0000.516D] # CJK COMPATIBILITY IDEOGRAPH-F9D1 3225 ; [*02FB.0020.0004.3225][.FB40.0020.0004.516D][.D16D.0000.0000.516D][*02FC.0020.001F.3225] # PARENTHESIZED IDEOGRAPH SIX 3285 ; [.FB40.0020.0006.516D][.D16D.0000.0000.516D] # CIRCLED IDEOGRAPH SIX 2F811 ; [.FB40.0020.0002.5177][.D177.0000.0000.5177] # CJK COMPATIBILITY IDEOGRAPH-2F811 FA75 ; [.FB40.0020.0002.5180][.D180.0000.0000.5180] # CJK COMPATIBILITY IDEOGRAPH-FA75 2F0C ; [.FB40.0020.0004.5182][.D182.0000.0000.5182] # KANGXI RADICAL DOWN BOX 2E86 ; [.FB40.0020.0004.5182][.D182.0000.0000.5182][.0000.0139.001F.2E86] # CJK RADICAL BOX 2F815 ; [.FB40.0020.0002.518D][.D18D.0000.0000.518D] # CJK COMPATIBILITY IDEOGRAPH-2F815 1F21E ; [.FB40.0020.001C.518D][.D18D.0000.0000.518D] # SQUARED CJK UNIFIED IDEOGRAPH-518D 2F8D2 ; [.FB40.0020.0002.5192][.D192.0000.0000.5192] # CJK COMPATIBILITY IDEOGRAPH-2F8D2 2F8D3 ; [.FB40.0020.0002.5195][.D195.0000.0000.5195] # CJK COMPATIBILITY IDEOGRAPH-2F8D3 2F0D ; [.FB40.0020.0004.5196][.D196.0000.0000.5196] # KANGXI RADICAL COVER 2F817 ; [.FB40.0020.0002.5197][.D197.0000.0000.5197] # CJK COMPATIBILITY IDEOGRAPH-2F817 32A2 ; [.FB40.0020.0006.5199][.D199.0000.0000.5199] # CIRCLED IDEOGRAPH COPY 2F818 ; [.FB40.0020.0002.51A4][.D1A4.0000.0000.51A4] # CJK COMPATIBILITY IDEOGRAPH-2F818 2F0E ; [.FB40.0020.0004.51AB][.D1AB.0000.0000.51AB] # KANGXI RADICAL ICE 2F81A ; [.FB40.0020.0002.51AC][.D1AC.0000.0000.51AC] # CJK COMPATIBILITY IDEOGRAPH-2F81A FA71 ; [.FB40.0020.0002.51B5][.D1B5.0000.0000.51B5] # CJK COMPATIBILITY IDEOGRAPH-FA71 2F81B ; [.FB40.0020.0002.51B5][.D1B5.0000.0000.51B5] # CJK COMPATIBILITY IDEOGRAPH-2F81B F92E ; [.FB40.0020.0002.51B7][.D1B7.0000.0000.51B7] # CJK COMPATIBILITY IDEOGRAPH-F92E F979 ; [.FB40.0020.0002.51C9][.D1C9.0000.0000.51C9] # CJK COMPATIBILITY IDEOGRAPH-F979 F955 ; [.FB40.0020.0002.51CC][.D1CC.0000.0000.51CC] # CJK COMPATIBILITY IDEOGRAPH-F955 F954 ; [.FB40.0020.0002.51DC][.D1DC.0000.0000.51DC] # CJK COMPATIBILITY IDEOGRAPH-F954 FA15 ; [.FB40.0020.0002.51DE][.D1DE.0000.0000.51DE] # CJK COMPATIBILITY IDEOGRAPH-FA15 2F0F ; [.FB40.0020.0004.51E0][.D1E0.0000.0000.51E0] # KANGXI RADICAL TABLE 2E87 ; [.FB40.0020.0004.51E0][.D1E0.0000.0000.51E0][.0000.0139.001F.2E87] # CJK RADICAL TABLE 2F81D ; [.FB40.0020.0002.51F5][.D1F5.0000.0000.51F5] # CJK COMPATIBILITY IDEOGRAPH-2F81D 2F10 ; [.FB40.0020.0004.51F5][.D1F5.0000.0000.51F5] # KANGXI RADICAL OPEN BOX 2F11 ; [.FB40.0020.0004.5200][.D200.0000.0000.5200] # KANGXI RADICAL KNIFE 2E88 ; [.FB40.0020.0004.5200][.D200.0000.0000.5200][.0000.0139.001F.2E88] # CJK RADICAL KNIFE ONE 2E89 ; [.FB40.0020.0004.5202][.D202.0000.0000.5202] # CJK RADICAL KNIFE TWO 2F81E ; [.FB40.0020.0002.5203][.D203.0000.0000.5203] # CJK COMPATIBILITY IDEOGRAPH-2F81E FA00 ; [.FB40.0020.0002.5207][.D207.0000.0000.5207] # CJK COMPATIBILITY IDEOGRAPH-FA00 2F850 ; [.FB40.0020.0002.5207][.D207.0000.0000.5207] # CJK COMPATIBILITY IDEOGRAPH-2F850 F99C ; [.FB40.0020.0002.5217][.D217.0000.0000.5217] # CJK COMPATIBILITY IDEOGRAPH-F99C 1F220 ; [.FB40.0020.001C.521D][.D21D.0000.0000.521D] # SQUARED CJK UNIFIED IDEOGRAPH-521D F9DD ; [.FB40.0020.0002.5229][.D229.0000.0000.5229] # CJK COMPATIBILITY IDEOGRAPH-F9DD F9FF ; [.FB40.0020.0002.523A][.D23A.0000.0000.523A] # CJK COMPATIBILITY IDEOGRAPH-F9FF 2F820 ; [.FB40.0020.0002.523B][.D23B.0000.0000.523B] # CJK COMPATIBILITY IDEOGRAPH-2F820 2F821 ; [.FB40.0020.0002.5246][.D246.0000.0000.5246] # CJK COMPATIBILITY IDEOGRAPH-2F821 1F21C ; [.FB40.0020.001C.524D][.D24D.0000.0000.524D] # SQUARED CJK UNIFIED IDEOGRAPH-524D 2F822 ; [.FB40.0020.0002.5272][.D272.0000.0000.5272] # CJK COMPATIBILITY IDEOGRAPH-2F822 1F239 ; [.FB40.0020.001C.5272][.D272.0000.0000.5272] # SQUARED CJK UNIFIED IDEOGRAPH-5272 2F823 ; [.FB40.0020.0002.5277][.D277.0000.0000.5277] # CJK COMPATIBILITY IDEOGRAPH-2F823 F9C7 ; [.FB40.0020.0002.5289][.D289.0000.0000.5289] # CJK COMPATIBILITY IDEOGRAPH-F9C7 F98A ; [.FB40.0020.0002.529B][.D29B.0000.0000.529B] # CJK COMPATIBILITY IDEOGRAPH-F98A 2F12 ; [.FB40.0020.0004.529B][.D29B.0000.0000.529B] # KANGXI RADICAL POWER F99D ; [.FB40.0020.0002.52A3][.D2A3.0000.0000.52A3] # CJK COMPATIBILITY IDEOGRAPH-F99D 2F992 ; [.FB40.0020.0002.52B3][.D2B3.0000.0000.52B3] # CJK COMPATIBILITY IDEOGRAPH-2F992 3238 ; [*02FB.0020.0004.3238][.FB40.0020.0004.52B4][.D2B4.0000.0000.52B4][*02FC.0020.001F.3238] # PARENTHESIZED IDEOGRAPH LABOR 3298 ; [.FB40.0020.0006.52B4][.D2B4.0000.0000.52B4] # CIRCLED IDEOGRAPH LABOR FA76 ; [.FB40.0020.0002.52C7][.D2C7.0000.0000.52C7] # CJK COMPATIBILITY IDEOGRAPH-FA76 2F825 ; [.FB40.0020.0002.52C7][.D2C7.0000.0000.52C7] # CJK COMPATIBILITY IDEOGRAPH-2F825 FA33 ; [.FB40.0020.0002.52C9][.D2C9.0000.0000.52C9] # CJK COMPATIBILITY IDEOGRAPH-FA33 2F826 ; [.FB40.0020.0002.52C9][.D2C9.0000.0000.52C9] # CJK COMPATIBILITY IDEOGRAPH-2F826 F952 ; [.FB40.0020.0002.52D2][.D2D2.0000.0000.52D2] # CJK COMPATIBILITY IDEOGRAPH-F952 1F247 ; [*0359.0020.0004.1F247][.FB40.0020.0004.52DD][.D2DD.0000.0000.52DD][*035A.0020.001F.1F247] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD F92F ; [.FB40.0020.0002.52DE][.D2DE.0000.0000.52DE] # CJK COMPATIBILITY IDEOGRAPH-F92F FA34 ; [.FB40.0020.0002.52E4][.D2E4.0000.0000.52E4] # CJK COMPATIBILITY IDEOGRAPH-FA34 2F827 ; [.FB40.0020.0002.52E4][.D2E4.0000.0000.52E4] # CJK COMPATIBILITY IDEOGRAPH-2F827 F97F ; [.FB40.0020.0002.52F5][.D2F5.0000.0000.52F5] # CJK COMPATIBILITY IDEOGRAPH-F97F 2F13 ; [.FB40.0020.0004.52F9][.D2F9.0000.0000.52F9] # KANGXI RADICAL WRAP FA77 ; [.FB40.0020.0002.52FA][.D2FA.0000.0000.52FA] # CJK COMPATIBILITY IDEOGRAPH-FA77 2F828 ; [.FB40.0020.0002.52FA][.D2FA.0000.0000.52FA] # CJK COMPATIBILITY IDEOGRAPH-2F828 2F829 ; [.FB40.0020.0002.5305][.D305.0000.0000.5305] # CJK COMPATIBILITY IDEOGRAPH-2F829 2F82A ; [.FB40.0020.0002.5306][.D306.0000.0000.5306] # CJK COMPATIBILITY IDEOGRAPH-2F82A 2F14 ; [.FB40.0020.0004.5315][.D315.0000.0000.5315] # KANGXI RADICAL SPOON F963 ; [.FB40.0020.0002.5317][.D317.0000.0000.5317] # CJK COMPATIBILITY IDEOGRAPH-F963 2F82B ; [.FB40.0020.0002.5317][.D317.0000.0000.5317] # CJK COMPATIBILITY IDEOGRAPH-2F82B 2F15 ; [.FB40.0020.0004.531A][.D31A.0000.0000.531A] # KANGXI RADICAL RIGHT OPEN BOX 2F16 ; [.FB40.0020.0004.5338][.D338.0000.0000.5338] # KANGXI RADICAL HIDING ENCLOSURE 32A9 ; [.FB40.0020.0006.533B][.D33B.0000.0000.533B] # CIRCLED IDEOGRAPH MEDICINE F9EB ; [.FB40.0020.0002.533F][.D33F.0000.0000.533F] # CJK COMPATIBILITY IDEOGRAPH-F9EB 2F17 ; [.FB40.0020.0004.5341][.D341.0000.0000.5341] # KANGXI RADICAL TEN 3038 ; [.FB40.0020.0004.5341][.D341.0000.0000.5341] # HANGZHOU NUMERAL TEN 3229 ; [*02FB.0020.0004.3229][.FB40.0020.0004.5341][.D341.0000.0000.5341][*02FC.0020.001F.3229] # PARENTHESIZED IDEOGRAPH TEN 3289 ; [.FB40.0020.0006.5341][.D341.0000.0000.5341] # CIRCLED IDEOGRAPH TEN 3039 ; [.FB40.0020.0004.5344][.D344.0000.0000.5344] # HANGZHOU NUMERAL TWENTY 303A ; [.FB40.0020.0004.5345][.D345.0000.0000.5345] # HANGZHOU NUMERAL THIRTY 2F82C ; [.FB40.0020.0002.5349][.D349.0000.0000.5349] # CJK COMPATIBILITY IDEOGRAPH-2F82C FA35 ; [.FB40.0020.0002.5351][.D351.0000.0000.5351] # CJK COMPATIBILITY IDEOGRAPH-FA35 2F82D ; [.FB40.0020.0002.5351][.D351.0000.0000.5351] # CJK COMPATIBILITY IDEOGRAPH-2F82D 323F ; [*02FB.0020.0004.323F][.FB40.0020.0004.5354][.D354.0000.0000.5354][*02FC.0020.001F.323F] # PARENTHESIZED IDEOGRAPH ALLIANCE 32AF ; [.FB40.0020.0006.5354][.D354.0000.0000.5354] # CIRCLED IDEOGRAPH ALLIANCE 2F82E ; [.FB40.0020.0002.535A][.D35A.0000.0000.535A] # CJK COMPATIBILITY IDEOGRAPH-2F82E 2F18 ; [.FB40.0020.0004.535C][.D35C.0000.0000.535C] # KANGXI RADICAL DIVINATION 2E8A ; [.FB40.0020.0004.535C][.D35C.0000.0000.535C][.0000.0139.001F.2E8A] # CJK RADICAL DIVINATION 2F19 ; [.FB40.0020.0004.5369][.D369.0000.0000.5369] # KANGXI RADICAL SEAL 2E8B ; [.FB40.0020.0004.5369][.D369.0000.0000.5369][.0000.0139.001F.2E8B] # CJK RADICAL SEAL 329E ; [.FB40.0020.0006.5370][.D370.0000.0000.5370] # CIRCLED IDEOGRAPH PRINT 2F82F ; [.FB40.0020.0002.5373][.D373.0000.0000.5373] # CJK COMPATIBILITY IDEOGRAPH-2F82F F91C ; [.FB40.0020.0002.5375][.D375.0000.0000.5375] # CJK COMPATIBILITY IDEOGRAPH-F91C 2F830 ; [.FB40.0020.0002.537D][.D37D.0000.0000.537D] # CJK COMPATIBILITY IDEOGRAPH-2F830 2F831 ; [.FB40.0020.0002.537F][.D37F.0000.0000.537F] # CJK COMPATIBILITY IDEOGRAPH-2F831 2F832 ; [.FB40.0020.0002.537F][.D37F.0000.0000.537F] # CJK COMPATIBILITY IDEOGRAPH-2F832 2F833 ; [.FB40.0020.0002.537F][.D37F.0000.0000.537F] # CJK COMPATIBILITY IDEOGRAPH-2F833 2F1A ; [.FB40.0020.0004.5382][.D382.0000.0000.5382] # KANGXI RADICAL CLIFF 2E81 ; [.FB40.0020.0004.5382][.D382.0000.0000.5382][.0000.0139.001F.2E81] # CJK RADICAL CLIFF 2F1B ; [.FB40.0020.0004.53B6][.D3B6.0000.0000.53B6] # KANGXI RADICAL PRIVATE F96B ; [.FB40.0020.0002.53C3][.D3C3.0000.0000.53C3] # CJK COMPATIBILITY IDEOGRAPH-F96B 2F1C ; [.FB40.0020.0004.53C8][.D3C8.0000.0000.53C8] # KANGXI RADICAL AGAIN 2F836 ; [.FB40.0020.0002.53CA][.D3CA.0000.0000.53CA] # CJK COMPATIBILITY IDEOGRAPH-2F836 1F212 ; [.FB40.0020.001C.53CC][.D3CC.0000.0000.53CC] # SQUARED CJK UNIFIED IDEOGRAPH-53CC 2F837 ; [.FB40.0020.0002.53DF][.D3DF.0000.0000.53DF] # CJK COMPATIBILITY IDEOGRAPH-2F837 2F1D ; [.FB40.0020.0004.53E3][.D3E3.0000.0000.53E3] # KANGXI RADICAL MOUTH F906 ; [.FB40.0020.0002.53E5][.D3E5.0000.0000.53E5] # CJK COMPATIBILITY IDEOGRAPH-F906 2F839 ; [.FB40.0020.0002.53EB][.D3EB.0000.0000.53EB] # CJK COMPATIBILITY IDEOGRAPH-2F839 1F251 ; [.FB40.0020.0006.53EF][.D3EF.0000.0000.53EF] # CIRCLED IDEOGRAPH ACCEPT 2F83A ; [.FB40.0020.0002.53F1][.D3F1.0000.0000.53F1] # CJK COMPATIBILITY IDEOGRAPH-2F83A 32A8 ; [.FB40.0020.0006.53F3][.D3F3.0000.0000.53F3] # CIRCLED IDEOGRAPH RIGHT 1F22E ; [.FB40.0020.001C.53F3][.D3F3.0000.0000.53F3] # SQUARED CJK UNIFIED IDEOGRAPH-53F3 2F83B ; [.FB40.0020.0002.5406][.D406.0000.0000.5406] # CJK COMPATIBILITY IDEOGRAPH-2F83B 1F234 ; [.FB40.0020.001C.5408][.D408.0000.0000.5408] # SQUARED CJK UNIFIED IDEOGRAPH-5408 3234 ; [*02FB.0020.0004.3234][.FB40.0020.0004.540D][.D40D.0000.0000.540D][*02FC.0020.001F.3234] # PARENTHESIZED IDEOGRAPH NAME 3294 ; [.FB40.0020.0006.540D][.D40D.0000.0000.540D] # CIRCLED IDEOGRAPH NAME F9DE ; [.FB40.0020.0002.540F][.D40F.0000.0000.540F] # CJK COMPATIBILITY IDEOGRAPH-F9DE F9ED ; [.FB40.0020.0002.541D][.D41D.0000.0000.541D] # CJK COMPATIBILITY IDEOGRAPH-F9ED 2F83D ; [.FB40.0020.0002.5438][.D438.0000.0000.5438] # CJK COMPATIBILITY IDEOGRAPH-2F83D 1F225 ; [.FB40.0020.001C.5439][.D439.0000.0000.5439] # SQUARED CJK UNIFIED IDEOGRAPH-5439 F980 ; [.FB40.0020.0002.5442][.D442.0000.0000.5442] # CJK COMPATIBILITY IDEOGRAPH-F980 2F83E ; [.FB40.0020.0002.5448][.D448.0000.0000.5448] # CJK COMPATIBILITY IDEOGRAPH-2F83E 2F83F ; [.FB40.0020.0002.5468][.D468.0000.0000.5468] # CJK COMPATIBILITY IDEOGRAPH-2F83F 323A ; [*02FB.0020.0004.323A][.FB40.0020.0004.547C][.D47C.0000.0000.547C][*02FC.0020.001F.323A] # PARENTHESIZED IDEOGRAPH CALL 2F83C ; [.FB40.0020.0002.549E][.D49E.0000.0000.549E] # CJK COMPATIBILITY IDEOGRAPH-2F83C 2F840 ; [.FB40.0020.0002.54A2][.D4A2.0000.0000.54A2] # CJK COMPATIBILITY IDEOGRAPH-2F840 F99E ; [.FB40.0020.0002.54BD][.D4BD.0000.0000.54BD] # CJK COMPATIBILITY IDEOGRAPH-F99E 2F841 ; [.FB40.0020.0002.54F6][.D4F6.0000.0000.54F6] # CJK COMPATIBILITY IDEOGRAPH-2F841 2F842 ; [.FB40.0020.0002.5510][.D510.0000.0000.5510] # CJK COMPATIBILITY IDEOGRAPH-2F842 3244 ; [.FB40.0020.0006.554F][.D54F.0000.0000.554F] # CIRCLED IDEOGRAPH QUESTION 2F843 ; [.FB40.0020.0002.5553][.D553.0000.0000.5553] # CJK COMPATIBILITY IDEOGRAPH-2F843 FA79 ; [.FB40.0020.0002.5555][.D555.0000.0000.5555] # CJK COMPATIBILITY IDEOGRAPH-FA79 2F844 ; [.FB40.0020.0002.5563][.D563.0000.0000.5563] # CJK COMPATIBILITY IDEOGRAPH-2F844 2F845 ; [.FB40.0020.0002.5584][.D584.0000.0000.5584] # CJK COMPATIBILITY IDEOGRAPH-2F845 2F846 ; [.FB40.0020.0002.5584][.D584.0000.0000.5584] # CJK COMPATIBILITY IDEOGRAPH-2F846 F90B ; [.FB40.0020.0002.5587][.D587.0000.0000.5587] # CJK COMPATIBILITY IDEOGRAPH-F90B FA7A ; [.FB40.0020.0002.5599][.D599.0000.0000.5599] # CJK COMPATIBILITY IDEOGRAPH-FA7A 2F847 ; [.FB40.0020.0002.5599][.D599.0000.0000.5599] # CJK COMPATIBILITY IDEOGRAPH-2F847 FA36 ; [.FB40.0020.0002.559D][.D59D.0000.0000.559D] # CJK COMPATIBILITY IDEOGRAPH-FA36 FA78 ; [.FB40.0020.0002.559D][.D59D.0000.0000.559D] # CJK COMPATIBILITY IDEOGRAPH-FA78 2F848 ; [.FB40.0020.0002.55AB][.D5AB.0000.0000.55AB] # CJK COMPATIBILITY IDEOGRAPH-2F848 2F849 ; [.FB40.0020.0002.55B3][.D5B3.0000.0000.55B3] # CJK COMPATIBILITY IDEOGRAPH-2F849 1F23A ; [.FB40.0020.001C.55B6][.D5B6.0000.0000.55B6] # SQUARED CJK UNIFIED IDEOGRAPH-55B6 FA0D ; [.FB40.0020.0002.55C0][.D5C0.0000.0000.55C0] # CJK COMPATIBILITY IDEOGRAPH-FA0D 2F84A ; [.FB40.0020.0002.55C2][.D5C2.0000.0000.55C2] # CJK COMPATIBILITY IDEOGRAPH-2F84A FA7B ; [.FB40.0020.0002.55E2][.D5E2.0000.0000.55E2] # CJK COMPATIBILITY IDEOGRAPH-FA7B FA37 ; [.FB40.0020.0002.5606][.D606.0000.0000.5606] # CJK COMPATIBILITY IDEOGRAPH-FA37 2F84C ; [.FB40.0020.0002.5606][.D606.0000.0000.5606] # CJK COMPATIBILITY IDEOGRAPH-2F84C 2F84E ; [.FB40.0020.0002.5651][.D651.0000.0000.5651] # CJK COMPATIBILITY IDEOGRAPH-2F84E FA38 ; [.FB40.0020.0002.5668][.D668.0000.0000.5668] # CJK COMPATIBILITY IDEOGRAPH-FA38 2F84F ; [.FB40.0020.0002.5674][.D674.0000.0000.5674] # CJK COMPATIBILITY IDEOGRAPH-2F84F 2F1E ; [.FB40.0020.0004.56D7][.D6D7.0000.0000.56D7] # KANGXI RADICAL ENCLOSURE 3223 ; [*02FB.0020.0004.3223][.FB40.0020.0004.56DB][.D6DB.0000.0000.56DB][*02FC.0020.001F.3223] # PARENTHESIZED IDEOGRAPH FOUR 3283 ; [.FB40.0020.0006.56DB][.D6DB.0000.0000.56DB] # CIRCLED IDEOGRAPH FOUR 3195 ; [.FB40.0020.0014.56DB][.D6DB.0000.0000.56DB] # IDEOGRAPHIC ANNOTATION FOUR MARK F9A9 ; [.FB40.0020.0002.56F9][.D6F9.0000.0000.56F9] # CJK COMPATIBILITY IDEOGRAPH-F9A9 2F84B ; [.FB40.0020.0002.5716][.D716.0000.0000.5716] # CJK COMPATIBILITY IDEOGRAPH-2F84B 2F84D ; [.FB40.0020.0002.5717][.D717.0000.0000.5717] # CJK COMPATIBILITY IDEOGRAPH-2F84D 2F1F ; [.FB40.0020.0004.571F][.D71F.0000.0000.571F] # KANGXI RADICAL EARTH 322F ; [*02FB.0020.0004.322F][.FB40.0020.0004.571F][.D71F.0000.0000.571F][*02FC.0020.001F.322F] # PARENTHESIZED IDEOGRAPH EARTH 328F ; [.FB40.0020.0006.571F][.D71F.0000.0000.571F] # CIRCLED IDEOGRAPH EARTH 319E ; [.FB40.0020.0014.5730][.D730.0000.0000.5730] # IDEOGRAPHIC ANNOTATION EARTH MARK 2F855 ; [.FB40.0020.0002.578B][.D78B.0000.0000.578B] # CJK COMPATIBILITY IDEOGRAPH-2F855 2F852 ; [.FB40.0020.0002.57CE][.D7CE.0000.0000.57CE] # CJK COMPATIBILITY IDEOGRAPH-2F852 2F853 ; [.FB40.0020.0002.57F4][.D7F4.0000.0000.57F4] # CJK COMPATIBILITY IDEOGRAPH-2F853 2F854 ; [.FB40.0020.0002.580D][.D80D.0000.0000.580D] # CJK COMPATIBILITY IDEOGRAPH-2F854 2F857 ; [.FB40.0020.0002.5831][.D831.0000.0000.5831] # CJK COMPATIBILITY IDEOGRAPH-2F857 2F856 ; [.FB40.0020.0002.5832][.D832.0000.0000.5832] # CJK COMPATIBILITY IDEOGRAPH-2F856 FA39 ; [.FB40.0020.0002.5840][.D840.0000.0000.5840] # CJK COMPATIBILITY IDEOGRAPH-FA39 FA10 ; [.FB40.0020.0002.585A][.D85A.0000.0000.585A] # CJK COMPATIBILITY IDEOGRAPH-FA10 FA7C ; [.FB40.0020.0002.585A][.D85A.0000.0000.585A] # CJK COMPATIBILITY IDEOGRAPH-FA7C F96C ; [.FB40.0020.0002.585E][.D85E.0000.0000.585E] # CJK COMPATIBILITY IDEOGRAPH-F96C FA3A ; [.FB40.0020.0002.58A8][.D8A8.0000.0000.58A8] # CJK COMPATIBILITY IDEOGRAPH-FA3A 2F858 ; [.FB40.0020.0002.58AC][.D8AC.0000.0000.58AC] # CJK COMPATIBILITY IDEOGRAPH-2F858 FA7D ; [.FB40.0020.0002.58B3][.D8B3.0000.0000.58B3] # CJK COMPATIBILITY IDEOGRAPH-FA7D F94A ; [.FB40.0020.0002.58D8][.D8D8.0000.0000.58D8] # CJK COMPATIBILITY IDEOGRAPH-F94A F942 ; [.FB40.0020.0002.58DF][.D8DF.0000.0000.58DF] # CJK COMPATIBILITY IDEOGRAPH-F942 2F20 ; [.FB40.0020.0004.58EB][.D8EB.0000.0000.58EB] # KANGXI RADICAL SCHOLAR 2F851 ; [.FB40.0020.0002.58EE][.D8EE.0000.0000.58EE] # CJK COMPATIBILITY IDEOGRAPH-2F851 1F224 ; [.FB40.0020.001C.58F0][.D8F0.0000.0000.58F0] # SQUARED CJK UNIFIED IDEOGRAPH-58F0 2F85A ; [.FB40.0020.0002.58F2][.D8F2.0000.0000.58F2] # CJK COMPATIBILITY IDEOGRAPH-2F85A 2F85B ; [.FB40.0020.0002.58F7][.D8F7.0000.0000.58F7] # CJK COMPATIBILITY IDEOGRAPH-2F85B 2F21 ; [.FB40.0020.0004.5902][.D902.0000.0000.5902] # KANGXI RADICAL GO 2F85C ; [.FB40.0020.0002.5906][.D906.0000.0000.5906] # CJK COMPATIBILITY IDEOGRAPH-2F85C 2F22 ; [.FB40.0020.0004.590A][.D90A.0000.0000.590A] # KANGXI RADICAL GO SLOWLY 2F23 ; [.FB40.0020.0004.5915][.D915.0000.0000.5915] # KANGXI RADICAL EVENING 2F85D ; [.FB40.0020.0002.591A][.D91A.0000.0000.591A] # CJK COMPATIBILITY IDEOGRAPH-2F85D 1F215 ; [.FB40.0020.001C.591A][.D91A.0000.0000.591A] # SQUARED CJK UNIFIED IDEOGRAPH-591A 32B0 ; [.FB40.0020.0006.591C][.D91C.0000.0000.591C] # CIRCLED IDEOGRAPH NIGHT 2F85E ; [.FB40.0020.0002.5922][.D922.0000.0000.5922] # CJK COMPATIBILITY IDEOGRAPH-2F85E 2F24 ; [.FB40.0020.0004.5927][.D927.0000.0000.5927] # KANGXI RADICAL BIG 337D ; [.FB40.0020.001C.5927][.D927.0000.0000.5927][.FB40.0020.001F.6B63][.EB63.0000.0000.6B63] # SQUARE ERA NAME TAISYOU 319D ; [.FB40.0020.0014.5929][.D929.0000.0000.5929] # IDEOGRAPHIC ANNOTATION HEAVEN MARK 1F217 ; [.FB40.0020.001C.5929][.D929.0000.0000.5929] # SQUARED CJK UNIFIED IDEOGRAPH-5929 FA7E ; [.FB40.0020.0002.5944][.D944.0000.0000.5944] # CJK COMPATIBILITY IDEOGRAPH-FA7E F90C ; [.FB40.0020.0002.5948][.D948.0000.0000.5948] # CJK COMPATIBILITY IDEOGRAPH-F90C F909 ; [.FB40.0020.0002.5951][.D951.0000.0000.5951] # CJK COMPATIBILITY IDEOGRAPH-F909 FA7F ; [.FB40.0020.0002.5954][.D954.0000.0000.5954] # CJK COMPATIBILITY IDEOGRAPH-FA7F 2F85F ; [.FB40.0020.0002.5962][.D962.0000.0000.5962] # CJK COMPATIBILITY IDEOGRAPH-2F85F F981 ; [.FB40.0020.0002.5973][.D973.0000.0000.5973] # CJK COMPATIBILITY IDEOGRAPH-F981 2F25 ; [.FB40.0020.0004.5973][.D973.0000.0000.5973] # KANGXI RADICAL WOMAN 329B ; [.FB40.0020.0006.5973][.D973.0000.0000.5973] # CIRCLED IDEOGRAPH FEMALE 2F865 ; [.FB40.0020.0002.59D8][.D9D8.0000.0000.59D8] # CJK COMPATIBILITY IDEOGRAPH-2F865 2F862 ; [.FB40.0020.0002.59EC][.D9EC.0000.0000.59EC] # CJK COMPATIBILITY IDEOGRAPH-2F862 2F863 ; [.FB40.0020.0002.5A1B][.DA1B.0000.0000.5A1B] # CJK COMPATIBILITY IDEOGRAPH-2F863 2F864 ; [.FB40.0020.0002.5A27][.DA27.0000.0000.5A27] # CJK COMPATIBILITY IDEOGRAPH-2F864 FA80 ; [.FB40.0020.0002.5A62][.DA62.0000.0000.5A62] # CJK COMPATIBILITY IDEOGRAPH-FA80 2F866 ; [.FB40.0020.0002.5A66][.DA66.0000.0000.5A66] # CJK COMPATIBILITY IDEOGRAPH-2F866 2F986 ; [.FB40.0020.0002.5AB5][.DAB5.0000.0000.5AB5] # CJK COMPATIBILITY IDEOGRAPH-2F986 2F869 ; [.FB40.0020.0002.5B08][.DB08.0000.0000.5B08] # CJK COMPATIBILITY IDEOGRAPH-2F869 FA81 ; [.FB40.0020.0002.5B28][.DB28.0000.0000.5B28] # CJK COMPATIBILITY IDEOGRAPH-FA81 2F86A ; [.FB40.0020.0002.5B3E][.DB3E.0000.0000.5B3E] # CJK COMPATIBILITY IDEOGRAPH-2F86A 2F86B ; [.FB40.0020.0002.5B3E][.DB3E.0000.0000.5B3E] # CJK COMPATIBILITY IDEOGRAPH-2F86B 2F26 ; [.FB40.0020.0004.5B50][.DB50.0000.0000.5B50] # KANGXI RADICAL CHILD 1F211 ; [.FB40.0020.001C.5B57][.DB57.0000.0000.5B57] # SQUARED CJK UNIFIED IDEOGRAPH-5B57 323B ; [*02FB.0020.0004.323B][.FB40.0020.0004.5B66][.DB66.0000.0000.5B66][*02FC.0020.001F.323B] # PARENTHESIZED IDEOGRAPH STUDY 32AB ; [.FB40.0020.0006.5B66][.DB66.0000.0000.5B66] # CIRCLED IDEOGRAPH STUDY 2F27 ; [.FB40.0020.0004.5B80][.DB80.0000.0000.5B80] # KANGXI RADICAL ROOF FA04 ; [.FB40.0020.0002.5B85][.DB85.0000.0000.5B85] # CJK COMPATIBILITY IDEOGRAPH-FA04 1F243 ; [*0359.0020.0004.1F243][.FB40.0020.0004.5B89][.DB89.0000.0000.5B89][*035A.0020.001F.1F243] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89 32AA ; [.FB40.0020.0006.5B97][.DB97.0000.0000.5B97] # CIRCLED IDEOGRAPH RELIGION 2F86D ; [.FB40.0020.0002.5BC3][.DBC3.0000.0000.5BC3] # CJK COMPATIBILITY IDEOGRAPH-2F86D 2F86E ; [.FB40.0020.0002.5BD8][.DBD8.0000.0000.5BD8] # CJK COMPATIBILITY IDEOGRAPH-2F86E F95F ; [.FB40.0020.0002.5BE7][.DBE7.0000.0000.5BE7] # CJK COMPATIBILITY IDEOGRAPH-F95F F9AA ; [.FB40.0020.0002.5BE7][.DBE7.0000.0000.5BE7] # CJK COMPATIBILITY IDEOGRAPH-F9AA 2F86F ; [.FB40.0020.0002.5BE7][.DBE7.0000.0000.5BE7] # CJK COMPATIBILITY IDEOGRAPH-2F86F F9BC ; [.FB40.0020.0002.5BEE][.DBEE.0000.0000.5BEE] # CJK COMPATIBILITY IDEOGRAPH-F9BC 2F870 ; [.FB40.0020.0002.5BF3][.DBF3.0000.0000.5BF3] # CJK COMPATIBILITY IDEOGRAPH-2F870 2F28 ; [.FB40.0020.0004.5BF8][.DBF8.0000.0000.5BF8] # KANGXI RADICAL INCH 2F872 ; [.FB40.0020.0002.5BFF][.DBFF.0000.0000.5BFF] # CJK COMPATIBILITY IDEOGRAPH-2F872 2F873 ; [.FB40.0020.0002.5C06][.DC06.0000.0000.5C06] # CJK COMPATIBILITY IDEOGRAPH-2F873 2F29 ; [.FB40.0020.0004.5C0F][.DC0F.0000.0000.5C0F] # KANGXI RADICAL SMALL 2E8C ; [.FB40.0020.0004.5C0F][.DC0F.0000.0000.5C0F][.0000.0139.001F.2E8C] # CJK RADICAL SMALL ONE 2E8D ; [.FB40.0020.0004.5C0F][.DC0F.0000.0000.5C0F][.0000.013A.001F.2E8D] # CJK RADICAL SMALL TWO 2F875 ; [.FB40.0020.0002.5C22][.DC22.0000.0000.5C22] # CJK COMPATIBILITY IDEOGRAPH-2F875 2E90 ; [.FB40.0020.0004.5C22][.DC22.0000.0000.5C22] # CJK RADICAL LAME THREE 2F2A ; [.FB40.0020.0004.5C22][.DC22.0000.0000.5C22] # KANGXI RADICAL LAME 2E8E ; [.FB40.0020.0004.5C22][.DC22.0000.0000.5C22][.0000.0139.001F.2E8E] # CJK RADICAL LAME ONE 2E8F ; [.FB40.0020.0004.5C23][.DC23.0000.0000.5C23] # CJK RADICAL LAME TWO 2E91 ; [.FB40.0020.0004.5C23][.DC23.0000.0000.5C23][.0000.0139.001F.2E91] # CJK RADICAL LAME FOUR 2F2B ; [.FB40.0020.0004.5C38][.DC38.0000.0000.5C38] # KANGXI RADICAL CORPSE F9BD ; [.FB40.0020.0002.5C3F][.DC3F.0000.0000.5C3F] # CJK COMPATIBILITY IDEOGRAPH-F9BD 2F877 ; [.FB40.0020.0002.5C60][.DC60.0000.0000.5C60] # CJK COMPATIBILITY IDEOGRAPH-2F877 F94B ; [.FB40.0020.0002.5C62][.DC62.0000.0000.5C62] # CJK COMPATIBILITY IDEOGRAPH-F94B FA3B ; [.FB40.0020.0002.5C64][.DC64.0000.0000.5C64] # CJK COMPATIBILITY IDEOGRAPH-FA3B F9DF ; [.FB40.0020.0002.5C65][.DC65.0000.0000.5C65] # CJK COMPATIBILITY IDEOGRAPH-F9DF FA3C ; [.FB40.0020.0002.5C6E][.DC6E.0000.0000.5C6E] # CJK COMPATIBILITY IDEOGRAPH-FA3C 2F878 ; [.FB40.0020.0002.5C6E][.DC6E.0000.0000.5C6E] # CJK COMPATIBILITY IDEOGRAPH-2F878 2F2C ; [.FB40.0020.0004.5C6E][.DC6E.0000.0000.5C6E] # KANGXI RADICAL SPROUT 2F2D ; [.FB40.0020.0004.5C71][.DC71.0000.0000.5C71] # KANGXI RADICAL MOUNTAIN 2F87A ; [.FB40.0020.0002.5C8D][.DC8D.0000.0000.5C8D] # CJK COMPATIBILITY IDEOGRAPH-2F87A 2F879 ; [.FB40.0020.0002.5CC0][.DCC0.0000.0000.5CC0] # CJK COMPATIBILITY IDEOGRAPH-2F879 F9D5 ; [.FB40.0020.0002.5D19][.DD19.0000.0000.5D19] # CJK COMPATIBILITY IDEOGRAPH-F9D5 2F87C ; [.FB40.0020.0002.5D43][.DD43.0000.0000.5D43] # CJK COMPATIBILITY IDEOGRAPH-2F87C F921 ; [.FB40.0020.0002.5D50][.DD50.0000.0000.5D50] # CJK COMPATIBILITY IDEOGRAPH-F921 2F87F ; [.FB40.0020.0002.5D6B][.DD6B.0000.0000.5D6B] # CJK COMPATIBILITY IDEOGRAPH-2F87F 2F87E ; [.FB40.0020.0002.5D6E][.DD6E.0000.0000.5D6E] # CJK COMPATIBILITY IDEOGRAPH-2F87E 2F880 ; [.FB40.0020.0002.5D7C][.DD7C.0000.0000.5D7C] # CJK COMPATIBILITY IDEOGRAPH-2F880 2F9F4 ; [.FB40.0020.0002.5DB2][.DDB2.0000.0000.5DB2] # CJK COMPATIBILITY IDEOGRAPH-2F9F4 F9AB ; [.FB40.0020.0002.5DBA][.DDBA.0000.0000.5DBA] # CJK COMPATIBILITY IDEOGRAPH-F9AB 2F2E ; [.FB40.0020.0004.5DDB][.DDDB.0000.0000.5DDB] # KANGXI RADICAL RIVER 2F881 ; [.FB40.0020.0002.5DE1][.DDE1.0000.0000.5DE1] # CJK COMPATIBILITY IDEOGRAPH-2F881 2F882 ; [.FB40.0020.0002.5DE2][.DDE2.0000.0000.5DE2] # CJK COMPATIBILITY IDEOGRAPH-2F882 2F2F ; [.FB40.0020.0004.5DE5][.DDE5.0000.0000.5DE5] # KANGXI RADICAL WORK 32A7 ; [.FB40.0020.0006.5DE6][.DDE6.0000.0000.5DE6] # CIRCLED IDEOGRAPH LEFT 1F22C ; [.FB40.0020.001C.5DE6][.DDE6.0000.0000.5DE6] # SQUARED CJK UNIFIED IDEOGRAPH-5DE6 2F30 ; [.FB40.0020.0004.5DF1][.DDF1.0000.0000.5DF1] # KANGXI RADICAL ONESELF 2E92 ; [.FB40.0020.0004.5DF3][.DDF3.0000.0000.5DF3] # CJK RADICAL SNAKE 2F884 ; [.FB40.0020.0002.5DFD][.DDFD.0000.0000.5DFD] # CJK COMPATIBILITY IDEOGRAPH-2F884 2F31 ; [.FB40.0020.0004.5DFE][.DDFE.0000.0000.5DFE] # KANGXI RADICAL TURBAN 2F885 ; [.FB40.0020.0002.5E28][.DE28.0000.0000.5E28] # CJK COMPATIBILITY IDEOGRAPH-2F885 2F886 ; [.FB40.0020.0002.5E3D][.DE3D.0000.0000.5E3D] # CJK COMPATIBILITY IDEOGRAPH-2F886 2F887 ; [.FB40.0020.0002.5E69][.DE69.0000.0000.5E69] # CJK COMPATIBILITY IDEOGRAPH-2F887 2F32 ; [.FB40.0020.0004.5E72][.DE72.0000.0000.5E72] # KANGXI RADICAL DRY 337B ; [.FB40.0020.001C.5E73][.DE73.0000.0000.5E73][.FB40.0020.001F.6210][.E210.0000.0000.6210] # SQUARE ERA NAME HEISEI F98E ; [.FB40.0020.0002.5E74][.DE74.0000.0000.5E74] # CJK COMPATIBILITY IDEOGRAPH-F98E 2E93 ; [.FB40.0020.0004.5E7A][.DE7A.0000.0000.5E7A] # CJK RADICAL THREAD 2F33 ; [.FB40.0020.0004.5E7A][.DE7A.0000.0000.5E7A] # KANGXI RADICAL SHORT THREAD 3245 ; [.FB40.0020.0006.5E7C][.DE7C.0000.0000.5E7C] # CIRCLED IDEOGRAPH KINDERGARTEN 2F34 ; [.FB40.0020.0004.5E7F][.DE7F.0000.0000.5E7F] # KANGXI RADICAL DOTTED CLIFF FA01 ; [.FB40.0020.0002.5EA6][.DEA6.0000.0000.5EA6] # CJK COMPATIBILITY IDEOGRAPH-FA01 2F88B ; [.FB40.0020.0002.5EB0][.DEB0.0000.0000.5EB0] # CJK COMPATIBILITY IDEOGRAPH-2F88B 2F88C ; [.FB40.0020.0002.5EB3][.DEB3.0000.0000.5EB3] # CJK COMPATIBILITY IDEOGRAPH-2F88C 2F88D ; [.FB40.0020.0002.5EB6][.DEB6.0000.0000.5EB6] # CJK COMPATIBILITY IDEOGRAPH-2F88D F9A2 ; [.FB40.0020.0002.5EC9][.DEC9.0000.0000.5EC9] # CJK COMPATIBILITY IDEOGRAPH-F9A2 F928 ; [.FB40.0020.0002.5ECA][.DECA.0000.0000.5ECA] # CJK COMPATIBILITY IDEOGRAPH-F928 2F88E ; [.FB40.0020.0002.5ECA][.DECA.0000.0000.5ECA] # CJK COMPATIBILITY IDEOGRAPH-2F88E FA82 ; [.FB40.0020.0002.5ED2][.DED2.0000.0000.5ED2] # CJK COMPATIBILITY IDEOGRAPH-FA82 FA0B ; [.FB40.0020.0002.5ED3][.DED3.0000.0000.5ED3] # CJK COMPATIBILITY IDEOGRAPH-FA0B FA83 ; [.FB40.0020.0002.5ED9][.DED9.0000.0000.5ED9] # CJK COMPATIBILITY IDEOGRAPH-FA83 F982 ; [.FB40.0020.0002.5EEC][.DEEC.0000.0000.5EEC] # CJK COMPATIBILITY IDEOGRAPH-F982 2F35 ; [.FB40.0020.0004.5EF4][.DEF4.0000.0000.5EF4] # KANGXI RADICAL LONG STRIDE 2F890 ; [.FB40.0020.0002.5EFE][.DEFE.0000.0000.5EFE] # CJK COMPATIBILITY IDEOGRAPH-2F890 2F36 ; [.FB40.0020.0004.5EFE][.DEFE.0000.0000.5EFE] # KANGXI RADICAL TWO HANDS F943 ; [.FB40.0020.0002.5F04][.DF04.0000.0000.5F04] # CJK COMPATIBILITY IDEOGRAPH-F943 2F37 ; [.FB40.0020.0004.5F0B][.DF0B.0000.0000.5F0B] # KANGXI RADICAL SHOOT 2F38 ; [.FB40.0020.0004.5F13][.DF13.0000.0000.5F13] # KANGXI RADICAL BOW 2F894 ; [.FB40.0020.0002.5F22][.DF22.0000.0000.5F22] # CJK COMPATIBILITY IDEOGRAPH-2F894 2F895 ; [.FB40.0020.0002.5F22][.DF22.0000.0000.5F22] # CJK COMPATIBILITY IDEOGRAPH-2F895 2F39 ; [.FB40.0020.0004.5F50][.DF50.0000.0000.5F50] # KANGXI RADICAL SNOUT 2E95 ; [.FB40.0020.0004.5F50][.DF50.0000.0000.5F50][.0000.0139.001F.2E95] # CJK RADICAL SNOUT TWO 2E94 ; [.FB40.0020.0004.5F51][.DF51.0000.0000.5F51] # CJK RADICAL SNOUT ONE 2F874 ; [.FB40.0020.0002.5F53][.DF53.0000.0000.5F53] # CJK COMPATIBILITY IDEOGRAPH-2F874 2F3A ; [.FB40.0020.0004.5F61][.DF61.0000.0000.5F61] # KANGXI RADICAL BRISTLE 2F899 ; [.FB40.0020.0002.5F62][.DF62.0000.0000.5F62] # CJK COMPATIBILITY IDEOGRAPH-2F899 FA84 ; [.FB40.0020.0002.5F69][.DF69.0000.0000.5F69] # CJK COMPATIBILITY IDEOGRAPH-FA84 2F89A ; [.FB40.0020.0002.5F6B][.DF6B.0000.0000.5F6B] # CJK COMPATIBILITY IDEOGRAPH-2F89A 2F3B ; [.FB40.0020.0004.5F73][.DF73.0000.0000.5F73] # KANGXI RADICAL STEP F9D8 ; [.FB40.0020.0002.5F8B][.DF8B.0000.0000.5F8B] # CJK COMPATIBILITY IDEOGRAPH-F9D8 1F21D ; [.FB40.0020.001C.5F8C][.DF8C.0000.0000.5F8C] # SQUARED CJK UNIFIED IDEOGRAPH-5F8C 1F250 ; [.FB40.0020.0006.5F97][.DF97.0000.0000.5F97] # CIRCLED IDEOGRAPH ADVANTAGE 2F89C ; [.FB40.0020.0002.5F9A][.DF9A.0000.0000.5F9A] # CJK COMPATIBILITY IDEOGRAPH-2F89C F966 ; [.FB40.0020.0002.5FA9][.DFA9.0000.0000.5FA9] # CJK COMPATIBILITY IDEOGRAPH-F966 FA85 ; [.FB40.0020.0002.5FAD][.DFAD.0000.0000.5FAD] # CJK COMPATIBILITY IDEOGRAPH-FA85 2F3C ; [.FB40.0020.0004.5FC3][.DFC3.0000.0000.5FC3] # KANGXI RADICAL HEART 2E97 ; [.FB40.0020.0004.5FC3][.DFC3.0000.0000.5FC3][.0000.0139.001F.2E97] # CJK RADICAL HEART TWO 2E96 ; [.FB40.0020.0004.5FC4][.DFC4.0000.0000.5FC4] # CJK RADICAL HEART ONE 2F89D ; [.FB40.0020.0002.5FCD][.DFCD.0000.0000.5FCD] # CJK COMPATIBILITY IDEOGRAPH-2F89D 2F89E ; [.FB40.0020.0002.5FD7][.DFD7.0000.0000.5FD7] # CJK COMPATIBILITY IDEOGRAPH-2F89E F9A3 ; [.FB40.0020.0002.5FF5][.DFF5.0000.0000.5FF5] # CJK COMPATIBILITY IDEOGRAPH-F9A3 2F89F ; [.FB40.0020.0002.5FF9][.DFF9.0000.0000.5FF9] # CJK COMPATIBILITY IDEOGRAPH-2F89F F960 ; [.FB40.0020.0002.6012][.E012.0000.0000.6012] # CJK COMPATIBILITY IDEOGRAPH-F960 F9AC ; [.FB40.0020.0002.601C][.E01C.0000.0000.601C] # CJK COMPATIBILITY IDEOGRAPH-F9AC FA6B ; [.FB40.0020.0002.6075][.E075.0000.0000.6075] # CJK COMPATIBILITY IDEOGRAPH-FA6B 2F8A0 ; [.FB40.0020.0002.6081][.E081.0000.0000.6081] # CJK COMPATIBILITY IDEOGRAPH-2F8A0 FA3D ; [.FB40.0020.0002.6094][.E094.0000.0000.6094] # CJK COMPATIBILITY IDEOGRAPH-FA3D 2F8A3 ; [.FB40.0020.0002.6094][.E094.0000.0000.6094] # CJK COMPATIBILITY IDEOGRAPH-2F8A3 2F8A5 ; [.FB40.0020.0002.60C7][.E0C7.0000.0000.60C7] # CJK COMPATIBILITY IDEOGRAPH-2F8A5 FA86 ; [.FB40.0020.0002.60D8][.E0D8.0000.0000.60D8] # CJK COMPATIBILITY IDEOGRAPH-FA86 F9B9 ; [.FB40.0020.0002.60E1][.E0E1.0000.0000.60E1] # CJK COMPATIBILITY IDEOGRAPH-F9B9 FA88 ; [.FB40.0020.0002.6108][.E108.0000.0000.6108] # CJK COMPATIBILITY IDEOGRAPH-FA88 F9D9 ; [.FB40.0020.0002.6144][.E144.0000.0000.6144] # CJK COMPATIBILITY IDEOGRAPH-F9D9 2F8A6 ; [.FB40.0020.0002.6148][.E148.0000.0000.6148] # CJK COMPATIBILITY IDEOGRAPH-2F8A6 2F8A7 ; [.FB40.0020.0002.614C][.E14C.0000.0000.614C] # CJK COMPATIBILITY IDEOGRAPH-2F8A7 2F8A9 ; [.FB40.0020.0002.614C][.E14C.0000.0000.614C] # CJK COMPATIBILITY IDEOGRAPH-2F8A9 FA87 ; [.FB40.0020.0002.614E][.E14E.0000.0000.614E] # CJK COMPATIBILITY IDEOGRAPH-FA87 2F8A8 ; [.FB40.0020.0002.614E][.E14E.0000.0000.614E] # CJK COMPATIBILITY IDEOGRAPH-2F8A8 FA8A ; [.FB40.0020.0002.6160][.E160.0000.0000.6160] # CJK COMPATIBILITY IDEOGRAPH-FA8A FA3E ; [.FB40.0020.0002.6168][.E168.0000.0000.6168] # CJK COMPATIBILITY IDEOGRAPH-FA3E 2F8AA ; [.FB40.0020.0002.617A][.E17A.0000.0000.617A] # CJK COMPATIBILITY IDEOGRAPH-2F8AA FA3F ; [.FB40.0020.0002.618E][.E18E.0000.0000.618E] # CJK COMPATIBILITY IDEOGRAPH-FA3F FA89 ; [.FB40.0020.0002.618E][.E18E.0000.0000.618E] # CJK COMPATIBILITY IDEOGRAPH-FA89 2F8AB ; [.FB40.0020.0002.618E][.E18E.0000.0000.618E] # CJK COMPATIBILITY IDEOGRAPH-2F8AB F98F ; [.FB40.0020.0002.6190][.E190.0000.0000.6190] # CJK COMPATIBILITY IDEOGRAPH-F98F 2F8AD ; [.FB40.0020.0002.61A4][.E1A4.0000.0000.61A4] # CJK COMPATIBILITY IDEOGRAPH-2F8AD 2F8AE ; [.FB40.0020.0002.61AF][.E1AF.0000.0000.61AF] # CJK COMPATIBILITY IDEOGRAPH-2F8AE 2F8AC ; [.FB40.0020.0002.61B2][.E1B2.0000.0000.61B2] # CJK COMPATIBILITY IDEOGRAPH-2F8AC 2F8AF ; [.FB40.0020.0002.61DE][.E1DE.0000.0000.61DE] # CJK COMPATIBILITY IDEOGRAPH-2F8AF FA40 ; [.FB40.0020.0002.61F2][.E1F2.0000.0000.61F2] # CJK COMPATIBILITY IDEOGRAPH-FA40 FA8B ; [.FB40.0020.0002.61F2][.E1F2.0000.0000.61F2] # CJK COMPATIBILITY IDEOGRAPH-FA8B 2F8B0 ; [.FB40.0020.0002.61F2][.E1F2.0000.0000.61F2] # CJK COMPATIBILITY IDEOGRAPH-2F8B0 F90D ; [.FB40.0020.0002.61F6][.E1F6.0000.0000.61F6] # CJK COMPATIBILITY IDEOGRAPH-F90D 2F8B1 ; [.FB40.0020.0002.61F6][.E1F6.0000.0000.61F6] # CJK COMPATIBILITY IDEOGRAPH-2F8B1 F990 ; [.FB40.0020.0002.6200][.E200.0000.0000.6200] # CJK COMPATIBILITY IDEOGRAPH-F990 2F3D ; [.FB40.0020.0004.6208][.E208.0000.0000.6208] # KANGXI RADICAL HALBERD 2F8B2 ; [.FB40.0020.0002.6210][.E210.0000.0000.6210] # CJK COMPATIBILITY IDEOGRAPH-2F8B2 2F8B3 ; [.FB40.0020.0002.621B][.E21B.0000.0000.621B] # CJK COMPATIBILITY IDEOGRAPH-2F8B3 F9D2 ; [.FB40.0020.0002.622E][.E22E.0000.0000.622E] # CJK COMPATIBILITY IDEOGRAPH-F9D2 FA8C ; [.FB40.0020.0002.6234][.E234.0000.0000.6234] # CJK COMPATIBILITY IDEOGRAPH-FA8C 2F3E ; [.FB40.0020.0004.6236][.E236.0000.0000.6236] # KANGXI RADICAL DOOR 2F3F ; [.FB40.0020.0004.624B][.E24B.0000.0000.624B] # KANGXI RADICAL HAND 1F210 ; [.FB40.0020.001C.624B][.E24B.0000.0000.624B] # SQUARED CJK UNIFIED IDEOGRAPH-624B 2E98 ; [.FB40.0020.0004.624C][.E24C.0000.0000.624C] # CJK RADICAL HAND 1F245 ; [*0359.0020.0004.1F245][.FB40.0020.0004.6253][.E253.0000.0000.6253][*035A.0020.001F.1F245] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253 1F231 ; [.FB40.0020.001C.6253][.E253.0000.0000.6253] # SQUARED CJK UNIFIED IDEOGRAPH-6253 2F8B4 ; [.FB40.0020.0002.625D][.E25D.0000.0000.625D] # CJK COMPATIBILITY IDEOGRAPH-2F8B4 1F227 ; [.FB40.0020.001C.6295][.E295.0000.0000.6295] # SQUARED CJK UNIFIED IDEOGRAPH-6295 2F8B5 ; [.FB40.0020.0002.62B1][.E2B1.0000.0000.62B1] # CJK COMPATIBILITY IDEOGRAPH-2F8B5 F925 ; [.FB40.0020.0002.62C9][.E2C9.0000.0000.62C9] # CJK COMPATIBILITY IDEOGRAPH-F925 F95B ; [.FB40.0020.0002.62CF][.E2CF.0000.0000.62CF] # CJK COMPATIBILITY IDEOGRAPH-F95B FA02 ; [.FB40.0020.0002.62D3][.E2D3.0000.0000.62D3] # CJK COMPATIBILITY IDEOGRAPH-FA02 2F8B6 ; [.FB40.0020.0002.62D4][.E2D4.0000.0000.62D4] # CJK COMPATIBILITY IDEOGRAPH-2F8B6 2F8BA ; [.FB40.0020.0002.62FC][.E2FC.0000.0000.62FC] # CJK COMPATIBILITY IDEOGRAPH-2F8BA F973 ; [.FB40.0020.0002.62FE][.E2FE.0000.0000.62FE] # CJK COMPATIBILITY IDEOGRAPH-F973 1F22F ; [.FB40.0020.001C.6307][.E307.0000.0000.6307] # SQUARED CJK UNIFIED IDEOGRAPH-6307 2F8B9 ; [.FB40.0020.0002.633D][.E33D.0000.0000.633D] # CJK COMPATIBILITY IDEOGRAPH-2F8B9 2F8B7 ; [.FB40.0020.0002.6350][.E350.0000.0000.6350] # CJK COMPATIBILITY IDEOGRAPH-2F8B7 1F228 ; [.FB40.0020.001C.6355][.E355.0000.0000.6355] # SQUARED CJK UNIFIED IDEOGRAPH-6355 2F8BB ; [.FB40.0020.0002.6368][.E368.0000.0000.6368] # CJK COMPATIBILITY IDEOGRAPH-2F8BB F9A4 ; [.FB40.0020.0002.637B][.E37B.0000.0000.637B] # CJK COMPATIBILITY IDEOGRAPH-F9A4 2F8BC ; [.FB40.0020.0002.6383][.E383.0000.0000.6383] # CJK COMPATIBILITY IDEOGRAPH-2F8BC F975 ; [.FB40.0020.0002.63A0][.E3A0.0000.0000.63A0] # CJK COMPATIBILITY IDEOGRAPH-F975 2F8C1 ; [.FB40.0020.0002.63A9][.E3A9.0000.0000.63A9] # CJK COMPATIBILITY IDEOGRAPH-2F8C1 FA8D ; [.FB40.0020.0002.63C4][.E3C4.0000.0000.63C4] # CJK COMPATIBILITY IDEOGRAPH-FA8D 2F8C0 ; [.FB40.0020.0002.63C5][.E3C5.0000.0000.63C5] # CJK COMPATIBILITY IDEOGRAPH-2F8C0 2F8BD ; [.FB40.0020.0002.63E4][.E3E4.0000.0000.63E4] # CJK COMPATIBILITY IDEOGRAPH-2F8BD FA8E ; [.FB40.0020.0002.641C][.E41C.0000.0000.641C] # CJK COMPATIBILITY IDEOGRAPH-FA8E 2F8BF ; [.FB40.0020.0002.6422][.E422.0000.0000.6422] # CJK COMPATIBILITY IDEOGRAPH-2F8BF FA8F ; [.FB40.0020.0002.6452][.E452.0000.0000.6452] # CJK COMPATIBILITY IDEOGRAPH-FA8F 2F8C3 ; [.FB40.0020.0002.6469][.E469.0000.0000.6469] # CJK COMPATIBILITY IDEOGRAPH-2F8C3 2F8C6 ; [.FB40.0020.0002.6477][.E477.0000.0000.6477] # CJK COMPATIBILITY IDEOGRAPH-2F8C6 2F8C4 ; [.FB40.0020.0002.647E][.E47E.0000.0000.647E] # CJK COMPATIBILITY IDEOGRAPH-2F8C4 F991 ; [.FB40.0020.0002.649A][.E49A.0000.0000.649A] # CJK COMPATIBILITY IDEOGRAPH-F991 2F8C5 ; [.FB40.0020.0002.649D][.E49D.0000.0000.649D] # CJK COMPATIBILITY IDEOGRAPH-2F8C5 F930 ; [.FB40.0020.0002.64C4][.E4C4.0000.0000.64C4] # CJK COMPATIBILITY IDEOGRAPH-F930 2F40 ; [.FB40.0020.0004.652F][.E52F.0000.0000.652F] # KANGXI RADICAL BRANCH 2F41 ; [.FB40.0020.0004.6534][.E534.0000.0000.6534] # KANGXI RADICAL RAP 2E99 ; [.FB40.0020.0004.6535][.E535.0000.0000.6535] # CJK RADICAL RAP FA41 ; [.FB40.0020.0002.654F][.E54F.0000.0000.654F] # CJK COMPATIBILITY IDEOGRAPH-FA41 2F8C8 ; [.FB40.0020.0002.654F][.E54F.0000.0000.654F] # CJK COMPATIBILITY IDEOGRAPH-2F8C8 FA90 ; [.FB40.0020.0002.6556][.E556.0000.0000.6556] # CJK COMPATIBILITY IDEOGRAPH-FA90 1F248 ; [*0359.0020.0004.1F248][.FB40.0020.0004.6557][.E557.0000.0000.6557][*035A.0020.001F.1F248] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 2F8C9 ; [.FB40.0020.0002.656C][.E56C.0000.0000.656C] # CJK COMPATIBILITY IDEOGRAPH-2F8C9 F969 ; [.FB40.0020.0002.6578][.E578.0000.0000.6578] # CJK COMPATIBILITY IDEOGRAPH-F969 2F42 ; [.FB40.0020.0004.6587][.E587.0000.0000.6587] # KANGXI RADICAL SCRIPT 3246 ; [.FB40.0020.0006.6587][.E587.0000.0000.6587] # CIRCLED IDEOGRAPH SCHOOL 2F43 ; [.FB40.0020.0004.6597][.E597.0000.0000.6597] # KANGXI RADICAL DIPPER F9BE ; [.FB40.0020.0002.6599][.E599.0000.0000.6599] # CJK COMPATIBILITY IDEOGRAPH-F9BE 1F21B ; [.FB40.0020.001C.6599][.E599.0000.0000.6599] # SQUARED CJK UNIFIED IDEOGRAPH-6599 2F44 ; [.FB40.0020.0004.65A4][.E5A4.0000.0000.65A4] # KANGXI RADICAL AXE 1F21F ; [.FB40.0020.001C.65B0][.E5B0.0000.0000.65B0] # SQUARED CJK UNIFIED IDEOGRAPH-65B0 2F45 ; [.FB40.0020.0004.65B9][.E5B9.0000.0000.65B9] # KANGXI RADICAL SQUARE F983 ; [.FB40.0020.0002.65C5][.E5C5.0000.0000.65C5] # CJK COMPATIBILITY IDEOGRAPH-F983 2F46 ; [.FB40.0020.0004.65E0][.E5E0.0000.0000.65E0] # KANGXI RADICAL NOT 2E9B ; [.FB40.0020.0004.65E1][.E5E1.0000.0000.65E1] # CJK RADICAL CHOKE FA42 ; [.FB40.0020.0002.65E2][.E5E2.0000.0000.65E2] # CJK COMPATIBILITY IDEOGRAPH-FA42 2F8CB ; [.FB40.0020.0002.65E3][.E5E3.0000.0000.65E3] # CJK COMPATIBILITY IDEOGRAPH-2F8CB 2F47 ; [.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # KANGXI RADICAL SUN 3230 ; [*02FB.0020.0004.3230][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5][*02FC.0020.001F.3230] # PARENTHESIZED IDEOGRAPH SUN 3290 ; [.FB40.0020.0006.65E5][.E5E5.0000.0000.65E5] # CIRCLED IDEOGRAPH SUN 2E9C ; [.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5][.0000.0139.001F.2E9C] # CJK RADICAL SUN 337E ; [.FB40.0020.001C.660E][.E60E.0000.0000.660E][.FB40.0020.001F.6CBB][.ECBB.0000.0000.6CBB] # SQUARE ERA NAME MEIZI F9E0 ; [.FB40.0020.0002.6613][.E613.0000.0000.6613] # CJK COMPATIBILITY IDEOGRAPH-F9E0 1F219 ; [.FB40.0020.001C.6620][.E620.0000.0000.6620] # SQUARED CJK UNIFIED IDEOGRAPH-6620 337C ; [.FB40.0020.001C.662D][.E62D.0000.0000.662D][.FB40.0020.001F.548C][.D48C.0000.0000.548C] # SQUARE ERA NAME SYOUWA 2F8CD ; [.FB40.0020.0002.6649][.E649.0000.0000.6649] # CJK COMPATIBILITY IDEOGRAPH-2F8CD FA12 ; [.FB40.0020.0002.6674][.E674.0000.0000.6674] # CJK COMPATIBILITY IDEOGRAPH-FA12 FA91 ; [.FB40.0020.0002.6674][.E674.0000.0000.6674] # CJK COMPATIBILITY IDEOGRAPH-FA91 F9C5 ; [.FB40.0020.0002.6688][.E688.0000.0000.6688] # CJK COMPATIBILITY IDEOGRAPH-F9C5 FA43 ; [.FB40.0020.0002.6691][.E691.0000.0000.6691] # CJK COMPATIBILITY IDEOGRAPH-FA43 2F8CF ; [.FB40.0020.0002.6691][.E691.0000.0000.6691] # CJK COMPATIBILITY IDEOGRAPH-2F8CF 2F8D5 ; [.FB40.0020.0002.669C][.E69C.0000.0000.669C] # CJK COMPATIBILITY IDEOGRAPH-2F8D5 FA06 ; [.FB40.0020.0002.66B4][.E6B4.0000.0000.66B4] # CJK COMPATIBILITY IDEOGRAPH-FA06 F98B ; [.FB40.0020.0002.66C6][.E6C6.0000.0000.66C6] # CJK COMPATIBILITY IDEOGRAPH-F98B 2F48 ; [.FB40.0020.0004.66F0][.E6F0.0000.0000.66F0] # KANGXI RADICAL SAY F901 ; [.FB40.0020.0002.66F4][.E6F4.0000.0000.66F4] # CJK COMPATIBILITY IDEOGRAPH-F901 2F8CC ; [.FB40.0020.0002.66F8][.E6F8.0000.0000.66F8] # CJK COMPATIBILITY IDEOGRAPH-2F8CC 2F8D4 ; [.FB40.0020.0002.6700][.E700.0000.0000.6700] # CJK COMPATIBILITY IDEOGRAPH-2F8D4 2F49 ; [.FB40.0020.0004.6708][.E708.0000.0000.6708] # KANGXI RADICAL MOON 322A ; [*02FB.0020.0004.322A][.FB40.0020.0004.6708][.E708.0000.0000.6708][*02FC.0020.001F.322A] # PARENTHESIZED IDEOGRAPH MOON 328A ; [.FB40.0020.0006.6708][.E708.0000.0000.6708] # CIRCLED IDEOGRAPH MOON 1F237 ; [.FB40.0020.001C.6708][.E708.0000.0000.6708] # SQUARED CJK UNIFIED IDEOGRAPH-6708 2E9D ; [.FB40.0020.0004.6708][.E708.0000.0000.6708][.0000.0139.001F.2E9D] # CJK RADICAL MOON 3232 ; [*02FB.0020.0004.3232][.FB40.0020.0004.6709][.E709.0000.0000.6709][*02FC.0020.001F.3232] # PARENTHESIZED IDEOGRAPH HAVE 3292 ; [.FB40.0020.0006.6709][.E709.0000.0000.6709] # CIRCLED IDEOGRAPH HAVE 1F236 ; [.FB40.0020.001C.6709][.E709.0000.0000.6709] # SQUARED CJK UNIFIED IDEOGRAPH-6709 F929 ; [.FB40.0020.0002.6717][.E717.0000.0000.6717] # CJK COMPATIBILITY IDEOGRAPH-F929 FA92 ; [.FB40.0020.0002.6717][.E717.0000.0000.6717] # CJK COMPATIBILITY IDEOGRAPH-FA92 2F8D8 ; [.FB40.0020.0002.6717][.E717.0000.0000.6717] # CJK COMPATIBILITY IDEOGRAPH-2F8D8 FA93 ; [.FB40.0020.0002.671B][.E71B.0000.0000.671B] # CJK COMPATIBILITY IDEOGRAPH-FA93 2F8D9 ; [.FB40.0020.0002.671B][.E71B.0000.0000.671B] # CJK COMPATIBILITY IDEOGRAPH-2F8D9 2F8DA ; [.FB40.0020.0002.6721][.E721.0000.0000.6721] # CJK COMPATIBILITY IDEOGRAPH-2F8DA 2F4A ; [.FB40.0020.0004.6728][.E728.0000.0000.6728] # KANGXI RADICAL TREE 322D ; [*02FB.0020.0004.322D][.FB40.0020.0004.6728][.E728.0000.0000.6728][*02FC.0020.001F.322D] # PARENTHESIZED IDEOGRAPH WOOD 328D ; [.FB40.0020.0006.6728][.E728.0000.0000.6728] # CIRCLED IDEOGRAPH WOOD 1F240 ; [*0359.0020.0004.1F240][.FB40.0020.0004.672C][.E72C.0000.0000.672C][*035A.0020.001F.1F240] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C F9E1 ; [.FB40.0020.0002.674E][.E74E.0000.0000.674E] # CJK COMPATIBILITY IDEOGRAPH-F9E1 2F8DC ; [.FB40.0020.0002.6753][.E753.0000.0000.6753] # CJK COMPATIBILITY IDEOGRAPH-2F8DC FA94 ; [.FB40.0020.0002.6756][.E756.0000.0000.6756] # CJK COMPATIBILITY IDEOGRAPH-FA94 2F8DB ; [.FB40.0020.0002.675E][.E75E.0000.0000.675E] # CJK COMPATIBILITY IDEOGRAPH-2F8DB F9C8 ; [.FB40.0020.0002.677B][.E77B.0000.0000.677B] # CJK COMPATIBILITY IDEOGRAPH-F9C8 2F8E0 ; [.FB40.0020.0002.6785][.E785.0000.0000.6785] # CJK COMPATIBILITY IDEOGRAPH-2F8E0 F9F4 ; [.FB40.0020.0002.6797][.E797.0000.0000.6797] # CJK COMPATIBILITY IDEOGRAPH-F9F4 F9C9 ; [.FB40.0020.0002.67F3][.E7F3.0000.0000.67F3] # CJK COMPATIBILITY IDEOGRAPH-F9C9 2F8DF ; [.FB40.0020.0002.67FA][.E7FA.0000.0000.67FA] # CJK COMPATIBILITY IDEOGRAPH-2F8DF F9DA ; [.FB40.0020.0002.6817][.E817.0000.0000.6817] # CJK COMPATIBILITY IDEOGRAPH-F9DA 2F8E5 ; [.FB40.0020.0002.681F][.E81F.0000.0000.681F] # CJK COMPATIBILITY IDEOGRAPH-2F8E5 3231 ; [*02FB.0020.0004.3231][.FB40.0020.0004.682A][.E82A.0000.0000.682A][*02FC.0020.001F.3231] # PARENTHESIZED IDEOGRAPH STOCK 3291 ; [.FB40.0020.0006.682A][.E82A.0000.0000.682A] # CIRCLED IDEOGRAPH STOCK 337F ; [.FB40.0020.001C.682A][.E82A.0000.0000.682A][.FB40.0020.001F.5F0F][.DF0F.0000.0000.5F0F][.FB40.0020.001F.4F1A][.CF1A.0000.0000.4F1A][.FB40.0020.001F.793E][.F93E.0000.0000.793E] # SQUARE CORPORATION 2F8E1 ; [.FB40.0020.0002.6852][.E852.0000.0000.6852] # CJK COMPATIBILITY IDEOGRAPH-2F8E1 F97A ; [.FB40.0020.0002.6881][.E881.0000.0000.6881] # CJK COMPATIBILITY IDEOGRAPH-F97A FA44 ; [.FB40.0020.0002.6885][.E885.0000.0000.6885] # CJK COMPATIBILITY IDEOGRAPH-FA44 2F8E2 ; [.FB40.0020.0002.6885][.E885.0000.0000.6885] # CJK COMPATIBILITY IDEOGRAPH-2F8E2 2F8E4 ; [.FB40.0020.0002.688E][.E88E.0000.0000.688E] # CJK COMPATIBILITY IDEOGRAPH-2F8E4 F9E2 ; [.FB40.0020.0002.68A8][.E8A8.0000.0000.68A8] # CJK COMPATIBILITY IDEOGRAPH-F9E2 2F8E6 ; [.FB40.0020.0002.6914][.E914.0000.0000.6914] # CJK COMPATIBILITY IDEOGRAPH-2F8E6 2F8E8 ; [.FB40.0020.0002.6942][.E942.0000.0000.6942] # CJK COMPATIBILITY IDEOGRAPH-2F8E8 2F8E9 ; [.FB40.0020.0002.69A3][.E9A3.0000.0000.69A3] # CJK COMPATIBILITY IDEOGRAPH-2F8E9 2F8EA ; [.FB40.0020.0002.69EA][.E9EA.0000.0000.69EA] # CJK COMPATIBILITY IDEOGRAPH-2F8EA F914 ; [.FB40.0020.0002.6A02][.EA02.0000.0000.6A02] # CJK COMPATIBILITY IDEOGRAPH-F914 F95C ; [.FB40.0020.0002.6A02][.EA02.0000.0000.6A02] # CJK COMPATIBILITY IDEOGRAPH-F95C F9BF ; [.FB40.0020.0002.6A02][.EA02.0000.0000.6A02] # CJK COMPATIBILITY IDEOGRAPH-F9BF F94C ; [.FB40.0020.0002.6A13][.EA13.0000.0000.6A13] # CJK COMPATIBILITY IDEOGRAPH-F94C 2F8EB ; [.FB40.0020.0002.6AA8][.EAA8.0000.0000.6AA8] # CJK COMPATIBILITY IDEOGRAPH-2F8EB F931 ; [.FB40.0020.0002.6AD3][.EAD3.0000.0000.6AD3] # CJK COMPATIBILITY IDEOGRAPH-F931 2F8ED ; [.FB40.0020.0002.6ADB][.EADB.0000.0000.6ADB] # CJK COMPATIBILITY IDEOGRAPH-2F8ED F91D ; [.FB40.0020.0002.6B04][.EB04.0000.0000.6B04] # CJK COMPATIBILITY IDEOGRAPH-F91D 2F4B ; [.FB40.0020.0004.6B20][.EB20.0000.0000.6B20] # KANGXI RADICAL LACK 2F8EF ; [.FB40.0020.0002.6B21][.EB21.0000.0000.6B21] # CJK COMPATIBILITY IDEOGRAPH-2F8EF 2F8F1 ; [.FB40.0020.0002.6B54][.EB54.0000.0000.6B54] # CJK COMPATIBILITY IDEOGRAPH-2F8F1 2F4C ; [.FB40.0020.0004.6B62][.EB62.0000.0000.6B62] # KANGXI RADICAL STOP 32A3 ; [.FB40.0020.0006.6B63][.EB63.0000.0000.6B63] # CIRCLED IDEOGRAPH CORRECT 2F8F3 ; [.FB40.0020.0002.6B72][.EB72.0000.0000.6B72] # CJK COMPATIBILITY IDEOGRAPH-2F8F3 F98C ; [.FB40.0020.0002.6B77][.EB77.0000.0000.6B77] # CJK COMPATIBILITY IDEOGRAPH-F98C FA95 ; [.FB40.0020.0002.6B79][.EB79.0000.0000.6B79] # CJK COMPATIBILITY IDEOGRAPH-FA95 2F4D ; [.FB40.0020.0004.6B79][.EB79.0000.0000.6B79] # KANGXI RADICAL DEATH 2E9E ; [.FB40.0020.0004.6B7A][.EB7A.0000.0000.6B7A][.0000.0139.001F.2E9E] # CJK RADICAL DEATH 2F8F4 ; [.FB40.0020.0002.6B9F][.EB9F.0000.0000.6B9F] # CJK COMPATIBILITY IDEOGRAPH-2F8F4 F9A5 ; [.FB40.0020.0002.6BAE][.EBAE.0000.0000.6BAE] # CJK COMPATIBILITY IDEOGRAPH-F9A5 2F4E ; [.FB40.0020.0004.6BB3][.EBB3.0000.0000.6BB3] # KANGXI RADICAL WEAPON F970 ; [.FB40.0020.0002.6BBA][.EBBA.0000.0000.6BBA] # CJK COMPATIBILITY IDEOGRAPH-F970 FA96 ; [.FB40.0020.0002.6BBA][.EBBA.0000.0000.6BBA] # CJK COMPATIBILITY IDEOGRAPH-FA96 2F8F5 ; [.FB40.0020.0002.6BBA][.EBBA.0000.0000.6BBA] # CJK COMPATIBILITY IDEOGRAPH-2F8F5 2F8F6 ; [.FB40.0020.0002.6BBB][.EBBB.0000.0000.6BBB] # CJK COMPATIBILITY IDEOGRAPH-2F8F6 2F4F ; [.FB40.0020.0004.6BCB][.EBCB.0000.0000.6BCB] # KANGXI RADICAL DO NOT 2E9F ; [.FB40.0020.0004.6BCD][.EBCD.0000.0000.6BCD] # CJK RADICAL MOTHER 2F50 ; [.FB40.0020.0004.6BD4][.EBD4.0000.0000.6BD4] # KANGXI RADICAL COMPARE 2F51 ; [.FB40.0020.0004.6BDB][.EBDB.0000.0000.6BDB] # KANGXI RADICAL FUR 2F52 ; [.FB40.0020.0004.6C0F][.EC0F.0000.0000.6C0F] # KANGXI RADICAL CLAN 2EA0 ; [.FB40.0020.0004.6C11][.EC11.0000.0000.6C11] # CJK RADICAL CIVILIAN 2F53 ; [.FB40.0020.0004.6C14][.EC14.0000.0000.6C14] # KANGXI RADICAL STEAM 2F54 ; [.FB40.0020.0004.6C34][.EC34.0000.0000.6C34] # KANGXI RADICAL WATER 322C ; [*02FB.0020.0004.322C][.FB40.0020.0004.6C34][.EC34.0000.0000.6C34][*02FC.0020.001F.322C] # PARENTHESIZED IDEOGRAPH WATER 328C ; [.FB40.0020.0006.6C34][.EC34.0000.0000.6C34] # CIRCLED IDEOGRAPH WATER 2EA1 ; [.FB40.0020.0004.6C35][.EC35.0000.0000.6C35] # CJK RADICAL WATER ONE 2EA2 ; [.FB40.0020.0004.6C3A][.EC3A.0000.0000.6C3A] # CJK RADICAL WATER TWO 2F8FA ; [.FB40.0020.0002.6C4E][.EC4E.0000.0000.6C4E] # CJK COMPATIBILITY IDEOGRAPH-2F8FA 2F8FE ; [.FB40.0020.0002.6C67][.EC67.0000.0000.6C67] # CJK COMPATIBILITY IDEOGRAPH-2F8FE F972 ; [.FB40.0020.0002.6C88][.EC88.0000.0000.6C88] # CJK COMPATIBILITY IDEOGRAPH-F972 2F8FC ; [.FB40.0020.0002.6CBF][.ECBF.0000.0000.6CBF] # CJK COMPATIBILITY IDEOGRAPH-2F8FC F968 ; [.FB40.0020.0002.6CCC][.ECCC.0000.0000.6CCC] # CJK COMPATIBILITY IDEOGRAPH-F968 2F8FD ; [.FB40.0020.0002.6CCD][.ECCD.0000.0000.6CCD] # CJK COMPATIBILITY IDEOGRAPH-2F8FD F9E3 ; [.FB40.0020.0002.6CE5][.ECE5.0000.0000.6CE5] # CJK COMPATIBILITY IDEOGRAPH-F9E3 329F ; [.FB40.0020.0006.6CE8][.ECE8.0000.0000.6CE8] # CIRCLED IDEOGRAPH ATTENTION 2F8FF ; [.FB40.0020.0002.6D16][.ED16.0000.0000.6D16] # CJK COMPATIBILITY IDEOGRAPH-2F8FF F915 ; [.FB40.0020.0002.6D1B][.ED1B.0000.0000.6D1B] # CJK COMPATIBILITY IDEOGRAPH-F915 FA05 ; [.FB40.0020.0002.6D1E][.ED1E.0000.0000.6D1E] # CJK COMPATIBILITY IDEOGRAPH-FA05 2F907 ; [.FB40.0020.0002.6D34][.ED34.0000.0000.6D34] # CJK COMPATIBILITY IDEOGRAPH-2F907 2F900 ; [.FB40.0020.0002.6D3E][.ED3E.0000.0000.6D3E] # CJK COMPATIBILITY IDEOGRAPH-2F900 F9CA ; [.FB40.0020.0002.6D41][.ED41.0000.0000.6D41] # CJK COMPATIBILITY IDEOGRAPH-F9CA FA97 ; [.FB40.0020.0002.6D41][.ED41.0000.0000.6D41] # CJK COMPATIBILITY IDEOGRAPH-FA97 2F902 ; [.FB40.0020.0002.6D41][.ED41.0000.0000.6D41] # CJK COMPATIBILITY IDEOGRAPH-2F902 2F903 ; [.FB40.0020.0002.6D69][.ED69.0000.0000.6D69] # CJK COMPATIBILITY IDEOGRAPH-2F903 F92A ; [.FB40.0020.0002.6D6A][.ED6A.0000.0000.6D6A] # CJK COMPATIBILITY IDEOGRAPH-F92A FA45 ; [.FB40.0020.0002.6D77][.ED77.0000.0000.6D77] # CJK COMPATIBILITY IDEOGRAPH-FA45 2F901 ; [.FB40.0020.0002.6D77][.ED77.0000.0000.6D77] # CJK COMPATIBILITY IDEOGRAPH-2F901 2F904 ; [.FB40.0020.0002.6D78][.ED78.0000.0000.6D78] # CJK COMPATIBILITY IDEOGRAPH-2F904 2F905 ; [.FB40.0020.0002.6D85][.ED85.0000.0000.6D85] # CJK COMPATIBILITY IDEOGRAPH-2F905 F9F5 ; [.FB40.0020.0002.6DCB][.EDCB.0000.0000.6DCB] # CJK COMPATIBILITY IDEOGRAPH-F9F5 F94D ; [.FB40.0020.0002.6DDA][.EDDA.0000.0000.6DDA] # CJK COMPATIBILITY IDEOGRAPH-F94D F9D6 ; [.FB40.0020.0002.6DEA][.EDEA.0000.0000.6DEA] # CJK COMPATIBILITY IDEOGRAPH-F9D6 2F90E ; [.FB40.0020.0002.6DF9][.EDF9.0000.0000.6DF9] # CJK COMPATIBILITY IDEOGRAPH-2F90E FA46 ; [.FB40.0020.0002.6E1A][.EE1A.0000.0000.6E1A] # CJK COMPATIBILITY IDEOGRAPH-FA46 2F908 ; [.FB40.0020.0002.6E2F][.EE2F.0000.0000.6E2F] # CJK COMPATIBILITY IDEOGRAPH-2F908 2F909 ; [.FB40.0020.0002.6E6E][.EE6E.0000.0000.6E6E] # CJK COMPATIBILITY IDEOGRAPH-2F909 1F235 ; [.FB40.0020.001C.6E80][.EE80.0000.0000.6E80] # SQUARED CJK UNIFIED IDEOGRAPH-6E80 F9CB ; [.FB40.0020.0002.6E9C][.EE9C.0000.0000.6E9C] # CJK COMPATIBILITY IDEOGRAPH-F9CB F9EC ; [.FB40.0020.0002.6EBA][.EEBA.0000.0000.6EBA] # CJK COMPATIBILITY IDEOGRAPH-F9EC 2F90C ; [.FB40.0020.0002.6EC7][.EEC7.0000.0000.6EC7] # CJK COMPATIBILITY IDEOGRAPH-2F90C FA99 ; [.FB40.0020.0002.6ECB][.EECB.0000.0000.6ECB] # CJK COMPATIBILITY IDEOGRAPH-FA99 2F90B ; [.FB40.0020.0002.6ECB][.EECB.0000.0000.6ECB] # CJK COMPATIBILITY IDEOGRAPH-2F90B F904 ; [.FB40.0020.0002.6ED1][.EED1.0000.0000.6ED1] # CJK COMPATIBILITY IDEOGRAPH-F904 FA98 ; [.FB40.0020.0002.6EDB][.EEDB.0000.0000.6EDB] # CJK COMPATIBILITY IDEOGRAPH-FA98 F94E ; [.FB40.0020.0002.6F0F][.EF0F.0000.0000.6F0F] # CJK COMPATIBILITY IDEOGRAPH-F94E 1F226 ; [.FB40.0020.001C.6F14][.EF14.0000.0000.6F14] # SQUARED CJK UNIFIED IDEOGRAPH-6F14 FA47 ; [.FB40.0020.0002.6F22][.EF22.0000.0000.6F22] # CJK COMPATIBILITY IDEOGRAPH-FA47 FA9A ; [.FB40.0020.0002.6F22][.EF22.0000.0000.6F22] # CJK COMPATIBILITY IDEOGRAPH-FA9A F992 ; [.FB40.0020.0002.6F23][.EF23.0000.0000.6F23] # CJK COMPATIBILITY IDEOGRAPH-F992 2F90F ; [.FB40.0020.0002.6F6E][.EF6E.0000.0000.6F6E] # CJK COMPATIBILITY IDEOGRAPH-2F90F 2F912 ; [.FB40.0020.0002.6FC6][.EFC6.0000.0000.6FC6] # CJK COMPATIBILITY IDEOGRAPH-2F912 F922 ; [.FB40.0020.0002.6FEB][.EFEB.0000.0000.6FEB] # CJK COMPATIBILITY IDEOGRAPH-F922 F984 ; [.FB40.0020.0002.6FFE][.EFFE.0000.0000.6FFE] # CJK COMPATIBILITY IDEOGRAPH-F984 2F915 ; [.FB40.0020.0002.701B][.F01B.0000.0000.701B] # CJK COMPATIBILITY IDEOGRAPH-2F915 FA9B ; [.FB40.0020.0002.701E][.F01E.0000.0000.701E] # CJK COMPATIBILITY IDEOGRAPH-FA9B 2F914 ; [.FB40.0020.0002.701E][.F01E.0000.0000.701E] # CJK COMPATIBILITY IDEOGRAPH-2F914 2F913 ; [.FB40.0020.0002.7039][.F039.0000.0000.7039] # CJK COMPATIBILITY IDEOGRAPH-2F913 2F917 ; [.FB40.0020.0002.704A][.F04A.0000.0000.704A] # CJK COMPATIBILITY IDEOGRAPH-2F917 2F55 ; [.FB40.0020.0004.706B][.F06B.0000.0000.706B] # KANGXI RADICAL FIRE 322B ; [*02FB.0020.0004.322B][.FB40.0020.0004.706B][.F06B.0000.0000.706B][*02FC.0020.001F.322B] # PARENTHESIZED IDEOGRAPH FIRE 328B ; [.FB40.0020.0006.706B][.F06B.0000.0000.706B] # CIRCLED IDEOGRAPH FIRE 2EA3 ; [.FB40.0020.0004.706C][.F06C.0000.0000.706C] # CJK RADICAL FIRE 2F835 ; [.FB40.0020.0002.7070][.F070.0000.0000.7070] # CJK COMPATIBILITY IDEOGRAPH-2F835 2F919 ; [.FB40.0020.0002.7077][.F077.0000.0000.7077] # CJK COMPATIBILITY IDEOGRAPH-2F919 2F918 ; [.FB40.0020.0002.707D][.F07D.0000.0000.707D] # CJK COMPATIBILITY IDEOGRAPH-2F918 F9FB ; [.FB40.0020.0002.7099][.F099.0000.0000.7099] # CJK COMPATIBILITY IDEOGRAPH-F9FB 2F91A ; [.FB40.0020.0002.70AD][.F0AD.0000.0000.70AD] # CJK COMPATIBILITY IDEOGRAPH-2F91A 1F244 ; [*0359.0020.0004.1F244][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9][*035A.0020.001F.1F244] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9 F99F ; [.FB40.0020.0002.70C8][.F0C8.0000.0000.70C8] # CJK COMPATIBILITY IDEOGRAPH-F99F F916 ; [.FB40.0020.0002.70D9][.F0D9.0000.0000.70D9] # CJK COMPATIBILITY IDEOGRAPH-F916 1F21A ; [.FB40.0020.001C.7121][.F121.0000.0000.7121] # SQUARED CJK UNIFIED IDEOGRAPH-7121 2F91C ; [.FB40.0020.0002.7145][.F145.0000.0000.7145] # CJK COMPATIBILITY IDEOGRAPH-2F91C F993 ; [.FB40.0020.0002.7149][.F149.0000.0000.7149] # CJK COMPATIBILITY IDEOGRAPH-F993 FA48 ; [.FB40.0020.0002.716E][.F16E.0000.0000.716E] # CJK COMPATIBILITY IDEOGRAPH-FA48 FA9C ; [.FB40.0020.0002.716E][.F16E.0000.0000.716E] # CJK COMPATIBILITY IDEOGRAPH-FA9C 2F91E ; [.FB40.0020.0002.719C][.F19C.0000.0000.719C] # CJK COMPATIBILITY IDEOGRAPH-2F91E F9C0 ; [.FB40.0020.0002.71CE][.F1CE.0000.0000.71CE] # CJK COMPATIBILITY IDEOGRAPH-F9C0 F9EE ; [.FB40.0020.0002.71D0][.F1D0.0000.0000.71D0] # CJK COMPATIBILITY IDEOGRAPH-F9EE F932 ; [.FB40.0020.0002.7210][.F210.0000.0000.7210] # CJK COMPATIBILITY IDEOGRAPH-F932 F91E ; [.FB40.0020.0002.721B][.F21B.0000.0000.721B] # CJK COMPATIBILITY IDEOGRAPH-F91E 2F920 ; [.FB40.0020.0002.7228][.F228.0000.0000.7228] # CJK COMPATIBILITY IDEOGRAPH-2F920 2F56 ; [.FB40.0020.0004.722A][.F22A.0000.0000.722A] # KANGXI RADICAL CLAW FA49 ; [.FB40.0020.0002.722B][.F22B.0000.0000.722B] # CJK COMPATIBILITY IDEOGRAPH-FA49 2EA4 ; [.FB40.0020.0004.722B][.F22B.0000.0000.722B] # CJK RADICAL PAW ONE 2EA5 ; [.FB40.0020.0004.722B][.F22B.0000.0000.722B][.0000.0139.001F.2EA5] # CJK RADICAL PAW TWO FA9E ; [.FB40.0020.0002.7235][.F235.0000.0000.7235] # CJK COMPATIBILITY IDEOGRAPH-FA9E 2F921 ; [.FB40.0020.0002.7235][.F235.0000.0000.7235] # CJK COMPATIBILITY IDEOGRAPH-2F921 2F57 ; [.FB40.0020.0004.7236][.F236.0000.0000.7236] # KANGXI RADICAL FATHER 2F58 ; [.FB40.0020.0004.723B][.F23B.0000.0000.723B] # KANGXI RADICAL DOUBLE X 2F59 ; [.FB40.0020.0004.723F][.F23F.0000.0000.723F] # KANGXI RADICAL HALF TREE TRUNK 2F5A ; [.FB40.0020.0004.7247][.F247.0000.0000.7247] # KANGXI RADICAL SLICE 2F922 ; [.FB40.0020.0002.7250][.F250.0000.0000.7250] # CJK COMPATIBILITY IDEOGRAPH-2F922 2F5B ; [.FB40.0020.0004.7259][.F259.0000.0000.7259] # KANGXI RADICAL FANG 2F5C ; [.FB40.0020.0004.725B][.F25B.0000.0000.725B] # KANGXI RADICAL COW 2EA7 ; [.FB40.0020.0004.725B][.F25B.0000.0000.725B][.0000.0139.001F.2EA7] # CJK RADICAL COW F946 ; [.FB40.0020.0002.7262][.F262.0000.0000.7262] # CJK COMPATIBILITY IDEOGRAPH-F946 3235 ; [*02FB.0020.0004.3235][.FB40.0020.0004.7279][.F279.0000.0000.7279][*02FC.0020.001F.3235] # PARENTHESIZED IDEOGRAPH SPECIAL 3295 ; [.FB40.0020.0006.7279][.F279.0000.0000.7279] # CIRCLED IDEOGRAPH SPECIAL 2F924 ; [.FB40.0020.0002.7280][.F280.0000.0000.7280] # CJK COMPATIBILITY IDEOGRAPH-2F924 2F925 ; [.FB40.0020.0002.7295][.F295.0000.0000.7295] # CJK COMPATIBILITY IDEOGRAPH-2F925 2F5D ; [.FB40.0020.0004.72AC][.F2AC.0000.0000.72AC] # KANGXI RADICAL DOG 2EA8 ; [.FB40.0020.0004.72AD][.F2AD.0000.0000.72AD] # CJK RADICAL DOG FA9F ; [.FB40.0020.0002.72AF][.F2AF.0000.0000.72AF] # CJK COMPATIBILITY IDEOGRAPH-FA9F F9FA ; [.FB40.0020.0002.72C0][.F2C0.0000.0000.72C0] # CJK COMPATIBILITY IDEOGRAPH-F9FA F92B ; [.FB40.0020.0002.72FC][.F2FC.0000.0000.72FC] # CJK COMPATIBILITY IDEOGRAPH-F92B FA16 ; [.FB40.0020.0002.732A][.F32A.0000.0000.732A] # CJK COMPATIBILITY IDEOGRAPH-FA16 FAA0 ; [.FB40.0020.0002.732A][.F32A.0000.0000.732A] # CJK COMPATIBILITY IDEOGRAPH-FAA0 F9A7 ; [.FB40.0020.0002.7375][.F375.0000.0000.7375] # CJK COMPATIBILITY IDEOGRAPH-F9A7 2F928 ; [.FB40.0020.0002.737A][.F37A.0000.0000.737A] # CJK COMPATIBILITY IDEOGRAPH-2F928 2F5E ; [.FB40.0020.0004.7384][.F384.0000.0000.7384] # KANGXI RADICAL PROFOUND F961 ; [.FB40.0020.0002.7387][.F387.0000.0000.7387] # CJK COMPATIBILITY IDEOGRAPH-F961 F9DB ; [.FB40.0020.0002.7387][.F387.0000.0000.7387] # CJK COMPATIBILITY IDEOGRAPH-F9DB 2F5F ; [.FB40.0020.0004.7389][.F389.0000.0000.7389] # KANGXI RADICAL JADE 2F929 ; [.FB40.0020.0002.738B][.F38B.0000.0000.738B] # CJK COMPATIBILITY IDEOGRAPH-2F929 2EA9 ; [.FB40.0020.0004.738B][.F38B.0000.0000.738B][.0000.0139.001F.2EA9] # CJK RADICAL JADE 2F92B ; [.FB40.0020.0002.73A5][.F3A5.0000.0000.73A5] # CJK COMPATIBILITY IDEOGRAPH-2F92B F9AD ; [.FB40.0020.0002.73B2][.F3B2.0000.0000.73B2] # CJK COMPATIBILITY IDEOGRAPH-F9AD F917 ; [.FB40.0020.0002.73DE][.F3DE.0000.0000.73DE] # CJK COMPATIBILITY IDEOGRAPH-F917 F9E4 ; [.FB40.0020.0002.7406][.F406.0000.0000.7406] # CJK COMPATIBILITY IDEOGRAPH-F9E4 F9CC ; [.FB40.0020.0002.7409][.F409.0000.0000.7409] # CJK COMPATIBILITY IDEOGRAPH-F9CC FA4A ; [.FB40.0020.0002.7422][.F422.0000.0000.7422] # CJK COMPATIBILITY IDEOGRAPH-FA4A 2F92E ; [.FB40.0020.0002.7447][.F447.0000.0000.7447] # CJK COMPATIBILITY IDEOGRAPH-2F92E 2F92F ; [.FB40.0020.0002.745C][.F45C.0000.0000.745C] # CJK COMPATIBILITY IDEOGRAPH-2F92F F9AE ; [.FB40.0020.0002.7469][.F469.0000.0000.7469] # CJK COMPATIBILITY IDEOGRAPH-F9AE FAA1 ; [.FB40.0020.0002.7471][.F471.0000.0000.7471] # CJK COMPATIBILITY IDEOGRAPH-FAA1 2F930 ; [.FB40.0020.0002.7471][.F471.0000.0000.7471] # CJK COMPATIBILITY IDEOGRAPH-2F930 2F931 ; [.FB40.0020.0002.7485][.F485.0000.0000.7485] # CJK COMPATIBILITY IDEOGRAPH-2F931 F994 ; [.FB40.0020.0002.7489][.F489.0000.0000.7489] # CJK COMPATIBILITY IDEOGRAPH-F994 F9EF ; [.FB40.0020.0002.7498][.F498.0000.0000.7498] # CJK COMPATIBILITY IDEOGRAPH-F9EF 2F932 ; [.FB40.0020.0002.74CA][.F4CA.0000.0000.74CA] # CJK COMPATIBILITY IDEOGRAPH-2F932 2F60 ; [.FB40.0020.0004.74DC][.F4DC.0000.0000.74DC] # KANGXI RADICAL MELON 2F61 ; [.FB40.0020.0004.74E6][.F4E6.0000.0000.74E6] # KANGXI RADICAL TILE FAA2 ; [.FB40.0020.0002.7506][.F506.0000.0000.7506] # CJK COMPATIBILITY IDEOGRAPH-FAA2 2F62 ; [.FB40.0020.0004.7518][.F518.0000.0000.7518] # KANGXI RADICAL SWEET 2F63 ; [.FB40.0020.0004.751F][.F51F.0000.0000.751F] # KANGXI RADICAL LIFE 1F222 ; [.FB40.0020.001C.751F][.F51F.0000.0000.751F] # SQUARED CJK UNIFIED IDEOGRAPH-751F 2F934 ; [.FB40.0020.0002.7524][.F524.0000.0000.7524] # CJK COMPATIBILITY IDEOGRAPH-2F934 2F64 ; [.FB40.0020.0004.7528][.F528.0000.0000.7528] # KANGXI RADICAL USE 2F65 ; [.FB40.0020.0004.7530][.F530.0000.0000.7530] # KANGXI RADICAL FIELD 3199 ; [.FB40.0020.0014.7532][.F532.0000.0000.7532] # IDEOGRAPHIC ANNOTATION FIRST MARK 1F238 ; [.FB40.0020.001C.7533][.F533.0000.0000.7533] # SQUARED CJK UNIFIED IDEOGRAPH-7533 329A ; [.FB40.0020.0006.7537][.F537.0000.0000.7537] # CIRCLED IDEOGRAPH MALE FAA3 ; [.FB40.0020.0002.753B][.F53B.0000.0000.753B] # CJK COMPATIBILITY IDEOGRAPH-FAA3 2F936 ; [.FB40.0020.0002.753E][.F53E.0000.0000.753E] # CJK COMPATIBILITY IDEOGRAPH-2F936 F9CD ; [.FB40.0020.0002.7559][.F559.0000.0000.7559] # CJK COMPATIBILITY IDEOGRAPH-F9CD F976 ; [.FB40.0020.0002.7565][.F565.0000.0000.7565] # CJK COMPATIBILITY IDEOGRAPH-F976 F962 ; [.FB40.0020.0002.7570][.F570.0000.0000.7570] # CJK COMPATIBILITY IDEOGRAPH-F962 2F938 ; [.FB40.0020.0002.7570][.F570.0000.0000.7570] # CJK COMPATIBILITY IDEOGRAPH-2F938 2F66 ; [.FB40.0020.0004.758B][.F58B.0000.0000.758B] # KANGXI RADICAL BOLT OF CLOTH 2EAA ; [.FB40.0020.0004.758B][.F58B.0000.0000.758B][.0000.0139.001F.2EAA] # CJK RADICAL BOLT OF CLOTH 2F67 ; [.FB40.0020.0004.7592][.F592.0000.0000.7592] # KANGXI RADICAL SICKNESS F9E5 ; [.FB40.0020.0002.75E2][.F5E2.0000.0000.75E2] # CJK COMPATIBILITY IDEOGRAPH-F9E5 2F93A ; [.FB40.0020.0002.7610][.F610.0000.0000.7610] # CJK COMPATIBILITY IDEOGRAPH-2F93A FAA4 ; [.FB40.0020.0002.761D][.F61D.0000.0000.761D] # CJK COMPATIBILITY IDEOGRAPH-FAA4 FAA5 ; [.FB40.0020.0002.761F][.F61F.0000.0000.761F] # CJK COMPATIBILITY IDEOGRAPH-FAA5 F9C1 ; [.FB40.0020.0002.7642][.F642.0000.0000.7642] # CJK COMPATIBILITY IDEOGRAPH-F9C1 F90E ; [.FB40.0020.0002.7669][.F669.0000.0000.7669] # CJK COMPATIBILITY IDEOGRAPH-F90E 2F68 ; [.FB40.0020.0004.7676][.F676.0000.0000.7676] # KANGXI RADICAL DOTTED TENT 2F69 ; [.FB40.0020.0004.767D][.F67D.0000.0000.767D] # KANGXI RADICAL WHITE 2F6A ; [.FB40.0020.0004.76AE][.F6AE.0000.0000.76AE] # KANGXI RADICAL SKIN 2F6B ; [.FB40.0020.0004.76BF][.F6BF.0000.0000.76BF] # KANGXI RADICAL DISH FA17 ; [.FB40.0020.0002.76CA][.F6CA.0000.0000.76CA] # CJK COMPATIBILITY IDEOGRAPH-FA17 FAA6 ; [.FB40.0020.0002.76CA][.F6CA.0000.0000.76CA] # CJK COMPATIBILITY IDEOGRAPH-FAA6 1F246 ; [*0359.0020.0004.1F246][.FB40.0020.0004.76D7][.F6D7.0000.0000.76D7][*035A.0020.001F.1F246] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7 FAA7 ; [.FB40.0020.0002.76DB][.F6DB.0000.0000.76DB] # CJK COMPATIBILITY IDEOGRAPH-FAA7 323C ; [*02FB.0020.0004.323C][.FB40.0020.0004.76E3][.F6E3.0000.0000.76E3][*02FC.0020.001F.323C] # PARENTHESIZED IDEOGRAPH SUPERVISE 32AC ; [.FB40.0020.0006.76E3][.F6E3.0000.0000.76E3] # CIRCLED IDEOGRAPH SUPERVISE F933 ; [.FB40.0020.0002.76E7][.F6E7.0000.0000.76E7] # CJK COMPATIBILITY IDEOGRAPH-F933 2F6C ; [.FB40.0020.0004.76EE][.F6EE.0000.0000.76EE] # KANGXI RADICAL EYE 2EAB ; [.FB40.0020.0004.76EE][.F6EE.0000.0000.76EE][.0000.0139.001F.2EAB] # CJK RADICAL EYE FAA8 ; [.FB40.0020.0002.76F4][.F6F4.0000.0000.76F4] # CJK COMPATIBILITY IDEOGRAPH-FAA8 2F940 ; [.FB40.0020.0002.76F4][.F6F4.0000.0000.76F4] # CJK COMPATIBILITY IDEOGRAPH-2F940 F96D ; [.FB40.0020.0002.7701][.F701.0000.0000.7701] # CJK COMPATIBILITY IDEOGRAPH-F96D 2F945 ; [.FB40.0020.0002.771E][.F71E.0000.0000.771E] # CJK COMPATIBILITY IDEOGRAPH-2F945 2F946 ; [.FB40.0020.0002.771F][.F71F.0000.0000.771F] # CJK COMPATIBILITY IDEOGRAPH-2F946 2F947 ; [.FB40.0020.0002.771F][.F71F.0000.0000.771F] # CJK COMPATIBILITY IDEOGRAPH-2F947 FAAA ; [.FB40.0020.0002.7740][.F740.0000.0000.7740] # CJK COMPATIBILITY IDEOGRAPH-FAAA FAA9 ; [.FB40.0020.0002.774A][.F74A.0000.0000.774A] # CJK COMPATIBILITY IDEOGRAPH-FAA9 2F948 ; [.FB40.0020.0002.774A][.F74A.0000.0000.774A] # CJK COMPATIBILITY IDEOGRAPH-2F948 2F94A ; [.FB40.0020.0002.778B][.F78B.0000.0000.778B] # CJK COMPATIBILITY IDEOGRAPH-2F94A FA9D ; [.FB40.0020.0002.77A7][.F7A7.0000.0000.77A7] # CJK COMPATIBILITY IDEOGRAPH-FA9D 2F6D ; [.FB40.0020.0004.77DB][.F7DB.0000.0000.77DB] # KANGXI RADICAL SPEAR 2F6E ; [.FB40.0020.0004.77E2][.F7E2.0000.0000.77E2] # KANGXI RADICAL ARROW 2F6F ; [.FB40.0020.0004.77F3][.F7F3.0000.0000.77F3] # KANGXI RADICAL STONE 2F94E ; [.FB40.0020.0002.784E][.F84E.0000.0000.784E] # CJK COMPATIBILITY IDEOGRAPH-2F94E F9CE ; [.FB40.0020.0002.786B][.F86B.0000.0000.786B] # CJK COMPATIBILITY IDEOGRAPH-F9CE F93B ; [.FB40.0020.0002.788C][.F88C.0000.0000.788C] # CJK COMPATIBILITY IDEOGRAPH-F93B 2F94F ; [.FB40.0020.0002.788C][.F88C.0000.0000.788C] # CJK COMPATIBILITY IDEOGRAPH-2F94F FA4B ; [.FB40.0020.0002.7891][.F891.0000.0000.7891] # CJK COMPATIBILITY IDEOGRAPH-FA4B F947 ; [.FB40.0020.0002.78CA][.F8CA.0000.0000.78CA] # CJK COMPATIBILITY IDEOGRAPH-F947 FAAB ; [.FB40.0020.0002.78CC][.F8CC.0000.0000.78CC] # CJK COMPATIBILITY IDEOGRAPH-FAAB 2F950 ; [.FB40.0020.0002.78CC][.F8CC.0000.0000.78CC] # CJK COMPATIBILITY IDEOGRAPH-2F950 F964 ; [.FB40.0020.0002.78FB][.F8FB.0000.0000.78FB] # CJK COMPATIBILITY IDEOGRAPH-F964 F985 ; [.FB40.0020.0002.792A][.F92A.0000.0000.792A] # CJK COMPATIBILITY IDEOGRAPH-F985 2F70 ; [.FB40.0020.0004.793A][.F93A.0000.0000.793A] # KANGXI RADICAL SPIRIT 2EAC ; [.FB40.0020.0004.793A][.F93A.0000.0000.793A][.0000.0139.001F.2EAC] # CJK RADICAL SPIRIT ONE 2EAD ; [.FB40.0020.0004.793B][.F93B.0000.0000.793B] # CJK RADICAL SPIRIT TWO FA18 ; [.FB40.0020.0002.793C][.F93C.0000.0000.793C] # CJK COMPATIBILITY IDEOGRAPH-FA18 FA4C ; [.FB40.0020.0002.793E][.F93E.0000.0000.793E] # CJK COMPATIBILITY IDEOGRAPH-FA4C 3233 ; [*02FB.0020.0004.3233][.FB40.0020.0004.793E][.F93E.0000.0000.793E][*02FC.0020.001F.3233] # PARENTHESIZED IDEOGRAPH SOCIETY 3293 ; [.FB40.0020.0006.793E][.F93E.0000.0000.793E] # CIRCLED IDEOGRAPH SOCIETY FA4E ; [.FB40.0020.0002.7948][.F948.0000.0000.7948] # CJK COMPATIBILITY IDEOGRAPH-FA4E FA4D ; [.FB40.0020.0002.7949][.F949.0000.0000.7949] # CJK COMPATIBILITY IDEOGRAPH-FA4D FA4F ; [.FB40.0020.0002.7950][.F950.0000.0000.7950] # CJK COMPATIBILITY IDEOGRAPH-FA4F FA50 ; [.FB40.0020.0002.7956][.F956.0000.0000.7956] # CJK COMPATIBILITY IDEOGRAPH-FA50 2F953 ; [.FB40.0020.0002.7956][.F956.0000.0000.7956] # CJK COMPATIBILITY IDEOGRAPH-2F953 FA51 ; [.FB40.0020.0002.795D][.F95D.0000.0000.795D] # CJK COMPATIBILITY IDEOGRAPH-FA51 3237 ; [*02FB.0020.0004.3237][.FB40.0020.0004.795D][.F95D.0000.0000.795D][*02FC.0020.001F.3237] # PARENTHESIZED IDEOGRAPH CONGRATULATION 3297 ; [.FB40.0020.0006.795D][.F95D.0000.0000.795D] # CIRCLED IDEOGRAPH CONGRATULATION FA19 ; [.FB40.0020.0002.795E][.F95E.0000.0000.795E] # CJK COMPATIBILITY IDEOGRAPH-FA19 FA1A ; [.FB40.0020.0002.7965][.F965.0000.0000.7965] # CJK COMPATIBILITY IDEOGRAPH-FA1A 3240 ; [*02FB.0020.0004.3240][.FB40.0020.0004.796D][.F96D.0000.0000.796D][*02FC.0020.001F.3240] # PARENTHESIZED IDEOGRAPH FESTIVAL F93C ; [.FB40.0020.0002.797F][.F97F.0000.0000.797F] # CJK COMPATIBILITY IDEOGRAPH-F93C 1F232 ; [.FB40.0020.001C.7981][.F981.0000.0000.7981] # SQUARED CJK UNIFIED IDEOGRAPH-7981 FA52 ; [.FB40.0020.0002.798D][.F98D.0000.0000.798D] # CJK COMPATIBILITY IDEOGRAPH-FA52 FA53 ; [.FB40.0020.0002.798E][.F98E.0000.0000.798E] # CJK COMPATIBILITY IDEOGRAPH-FA53 FA1B ; [.FB40.0020.0002.798F][.F98F.0000.0000.798F] # CJK COMPATIBILITY IDEOGRAPH-FA1B 2F956 ; [.FB40.0020.0002.798F][.F98F.0000.0000.798F] # CJK COMPATIBILITY IDEOGRAPH-2F956 F9B6 ; [.FB40.0020.0002.79AE][.F9AE.0000.0000.79AE] # CJK COMPATIBILITY IDEOGRAPH-F9B6 2F71 ; [.FB40.0020.0004.79B8][.F9B8.0000.0000.79B8] # KANGXI RADICAL TRACK 2F72 ; [.FB40.0020.0004.79BE][.F9BE.0000.0000.79BE] # KANGXI RADICAL GRAIN F995 ; [.FB40.0020.0002.79CA][.F9CA.0000.0000.79CA] # CJK COMPATIBILITY IDEOGRAPH-F995 3299 ; [.FB40.0020.0006.79D8][.F9D8.0000.0000.79D8] # CIRCLED IDEOGRAPH SECRET 2F957 ; [.FB40.0020.0002.79EB][.F9EB.0000.0000.79EB] # CJK COMPATIBILITY IDEOGRAPH-2F957 F956 ; [.FB40.0020.0002.7A1C][.FA1C.0000.0000.7A1C] # CJK COMPATIBILITY IDEOGRAPH-F956 FA54 ; [.FB40.0020.0002.7A40][.FA40.0000.0000.7A40] # CJK COMPATIBILITY IDEOGRAPH-FA54 2F959 ; [.FB40.0020.0002.7A40][.FA40.0000.0000.7A40] # CJK COMPATIBILITY IDEOGRAPH-2F959 2F95A ; [.FB40.0020.0002.7A4A][.FA4A.0000.0000.7A4A] # CJK COMPATIBILITY IDEOGRAPH-2F95A 2F95B ; [.FB40.0020.0002.7A4F][.FA4F.0000.0000.7A4F] # CJK COMPATIBILITY IDEOGRAPH-2F95B 2F73 ; [.FB40.0020.0004.7A74][.FA74.0000.0000.7A74] # KANGXI RADICAL CAVE 1F233 ; [.FB40.0020.001C.7A7A][.FA7A.0000.0000.7A7A] # SQUARED CJK UNIFIED IDEOGRAPH-7A7A FA55 ; [.FB40.0020.0002.7A81][.FA81.0000.0000.7A81] # CJK COMPATIBILITY IDEOGRAPH-FA55 FAAC ; [.FB40.0020.0002.7AB1][.FAB1.0000.0000.7AB1] # CJK COMPATIBILITY IDEOGRAPH-FAAC F9F7 ; [.FB40.0020.0002.7ACB][.FACB.0000.0000.7ACB] # CJK COMPATIBILITY IDEOGRAPH-F9F7 2F74 ; [.FB40.0020.0004.7ACB][.FACB.0000.0000.7ACB] # KANGXI RADICAL STAND 2F95F ; [.FB40.0020.0002.7AEE][.FAEE.0000.0000.7AEE] # CJK COMPATIBILITY IDEOGRAPH-2F95F 2F75 ; [.FB40.0020.0004.7AF9][.FAF9.0000.0000.7AF9] # KANGXI RADICAL BAMBOO 2EAE ; [.FB40.0020.0004.7AF9][.FAF9.0000.0000.7AF9][.0000.0139.001F.2EAE] # CJK RADICAL BAMBOO F9F8 ; [.FB40.0020.0002.7B20][.FB20.0000.0000.7B20] # CJK COMPATIBILITY IDEOGRAPH-F9F8 3247 ; [.FB40.0020.0006.7B8F][.FB8F.0000.0000.7B8F] # CIRCLED IDEOGRAPH KOTO FA56 ; [.FB40.0020.0002.7BC0][.FBC0.0000.0000.7BC0] # CJK COMPATIBILITY IDEOGRAPH-FA56 FAAD ; [.FB40.0020.0002.7BC0][.FBC0.0000.0000.7BC0] # CJK COMPATIBILITY IDEOGRAPH-FAAD 2F962 ; [.FB40.0020.0002.7BC6][.FBC6.0000.0000.7BC6] # CJK COMPATIBILITY IDEOGRAPH-2F962 2F963 ; [.FB40.0020.0002.7BC9][.FBC9.0000.0000.7BC9] # CJK COMPATIBILITY IDEOGRAPH-2F963 F9A6 ; [.FB40.0020.0002.7C3E][.FC3E.0000.0000.7C3E] # CJK COMPATIBILITY IDEOGRAPH-F9A6 F944 ; [.FB40.0020.0002.7C60][.FC60.0000.0000.7C60] # CJK COMPATIBILITY IDEOGRAPH-F944 2F76 ; [.FB40.0020.0004.7C73][.FC73.0000.0000.7C73] # KANGXI RADICAL RICE FAAE ; [.FB40.0020.0002.7C7B][.FC7B.0000.0000.7C7B] # CJK COMPATIBILITY IDEOGRAPH-FAAE F9F9 ; [.FB40.0020.0002.7C92][.FC92.0000.0000.7C92] # CJK COMPATIBILITY IDEOGRAPH-F9F9 FA1D ; [.FB40.0020.0002.7CBE][.FCBE.0000.0000.7CBE] # CJK COMPATIBILITY IDEOGRAPH-FA1D 2F966 ; [.FB40.0020.0002.7CD2][.FCD2.0000.0000.7CD2] # CJK COMPATIBILITY IDEOGRAPH-2F966 FA03 ; [.FB40.0020.0002.7CD6][.FCD6.0000.0000.7CD6] # CJK COMPATIBILITY IDEOGRAPH-FA03 2F969 ; [.FB40.0020.0002.7CE3][.FCE3.0000.0000.7CE3] # CJK COMPATIBILITY IDEOGRAPH-2F969 F97B ; [.FB40.0020.0002.7CE7][.FCE7.0000.0000.7CE7] # CJK COMPATIBILITY IDEOGRAPH-F97B 2F968 ; [.FB40.0020.0002.7CE8][.FCE8.0000.0000.7CE8] # CJK COMPATIBILITY IDEOGRAPH-2F968 2F77 ; [.FB40.0020.0004.7CF8][.FCF8.0000.0000.7CF8] # KANGXI RADICAL SILK 2EAF ; [.FB40.0020.0004.7CF9][.FCF9.0000.0000.7CF9] # CJK RADICAL SILK 2F96A ; [.FB40.0020.0002.7D00][.FD00.0000.0000.7D00] # CJK COMPATIBILITY IDEOGRAPH-2F96A F9CF ; [.FB40.0020.0002.7D10][.FD10.0000.0000.7D10] # CJK COMPATIBILITY IDEOGRAPH-F9CF F96A ; [.FB40.0020.0002.7D22][.FD22.0000.0000.7D22] # CJK COMPATIBILITY IDEOGRAPH-F96A F94F ; [.FB40.0020.0002.7D2F][.FD2F.0000.0000.7D2F] # CJK COMPATIBILITY IDEOGRAPH-F94F 1F221 ; [.FB40.0020.001C.7D42][.FD42.0000.0000.7D42] # SQUARED CJK UNIFIED IDEOGRAPH-7D42 FAAF ; [.FB40.0020.0002.7D5B][.FD5B.0000.0000.7D5B] # CJK COMPATIBILITY IDEOGRAPH-FAAF 2F96C ; [.FB40.0020.0002.7D63][.FD63.0000.0000.7D63] # CJK COMPATIBILITY IDEOGRAPH-2F96C F93D ; [.FB40.0020.0002.7DA0][.FDA0.0000.0000.7DA0] # CJK COMPATIBILITY IDEOGRAPH-F93D F957 ; [.FB40.0020.0002.7DBE][.FDBE.0000.0000.7DBE] # CJK COMPATIBILITY IDEOGRAPH-F957 2F96E ; [.FB40.0020.0002.7DC7][.FDC7.0000.0000.7DC7] # CJK COMPATIBILITY IDEOGRAPH-2F96E F996 ; [.FB40.0020.0002.7DF4][.FDF4.0000.0000.7DF4] # CJK COMPATIBILITY IDEOGRAPH-F996 FA57 ; [.FB40.0020.0002.7DF4][.FDF4.0000.0000.7DF4] # CJK COMPATIBILITY IDEOGRAPH-FA57 FAB0 ; [.FB40.0020.0002.7DF4][.FDF4.0000.0000.7DF4] # CJK COMPATIBILITY IDEOGRAPH-FAB0 2F96F ; [.FB40.0020.0002.7E02][.FE02.0000.0000.7E02] # CJK COMPATIBILITY IDEOGRAPH-2F96F FA58 ; [.FB40.0020.0002.7E09][.FE09.0000.0000.7E09] # CJK COMPATIBILITY IDEOGRAPH-FA58 F950 ; [.FB40.0020.0002.7E37][.FE37.0000.0000.7E37] # CJK COMPATIBILITY IDEOGRAPH-F950 FA59 ; [.FB40.0020.0002.7E41][.FE41.0000.0000.7E41] # CJK COMPATIBILITY IDEOGRAPH-FA59 2F970 ; [.FB40.0020.0002.7E45][.FE45.0000.0000.7E45] # CJK COMPATIBILITY IDEOGRAPH-2F970 2EB0 ; [.FB40.0020.0004.7E9F][.FE9F.0000.0000.7E9F] # CJK RADICAL C-SIMPLIFIED SILK 2F78 ; [.FB40.0020.0004.7F36][.FF36.0000.0000.7F36] # KANGXI RADICAL JAR FAB1 ; [.FB40.0020.0002.7F3E][.FF3E.0000.0000.7F3E] # CJK COMPATIBILITY IDEOGRAPH-FAB1 2F79 ; [.FB40.0020.0004.7F51][.FF51.0000.0000.7F51] # KANGXI RADICAL NET 2EB2 ; [.FB40.0020.0004.7F52][.FF52.0000.0000.7F52] # CJK RADICAL NET TWO 2EB5 ; [.FB40.0020.0004.7F52][.FF52.0000.0000.7F52][.0000.0139.001F.2EB5] # CJK RADICAL MESH 2EB1 ; [.FB40.0020.0004.7F53][.FF53.0000.0000.7F53] # CJK RADICAL NET ONE 2EB3 ; [.FB40.0020.0004.7F53][.FF53.0000.0000.7F53][.0000.0139.001F.2EB3] # CJK RADICAL NET THREE 2EB4 ; [.FB40.0020.0004.7F53][.FF53.0000.0000.7F53][.0000.013A.001F.2EB4] # CJK RADICAL NET FOUR FA5A ; [.FB40.0020.0002.7F72][.FF72.0000.0000.7F72] # CJK COMPATIBILITY IDEOGRAPH-FA5A F9E6 ; [.FB40.0020.0002.7F79][.FF79.0000.0000.7F79] # CJK COMPATIBILITY IDEOGRAPH-F9E6 2F976 ; [.FB40.0020.0002.7F7A][.FF7A.0000.0000.7F7A] # CJK COMPATIBILITY IDEOGRAPH-2F976 F90F ; [.FB40.0020.0002.7F85][.FF85.0000.0000.7F85] # CJK COMPATIBILITY IDEOGRAPH-F90F 2F7A ; [.FB40.0020.0004.7F8A][.FF8A.0000.0000.7F8A] # KANGXI RADICAL SHEEP 2EB6 ; [.FB40.0020.0004.7F8A][.FF8A.0000.0000.7F8A][.0000.0139.001F.2EB6] # CJK RADICAL SHEEP 2EB7 ; [.FB40.0020.0004.7F8A][.FF8A.0000.0000.7F8A][.0000.013A.001F.2EB7] # CJK RADICAL RAM 2EB8 ; [.FB40.0020.0004.7F8B][.FF8B.0000.0000.7F8B] # CJK RADICAL EWE 2F978 ; [.FB40.0020.0002.7F95][.FF95.0000.0000.7F95] # CJK COMPATIBILITY IDEOGRAPH-2F978 F9AF ; [.FB40.0020.0002.7F9A][.FF9A.0000.0000.7F9A] # CJK COMPATIBILITY IDEOGRAPH-F9AF FA1E ; [.FB40.0020.0002.7FBD][.FFBD.0000.0000.7FBD] # CJK COMPATIBILITY IDEOGRAPH-FA1E 2F7B ; [.FB40.0020.0004.7FBD][.FFBD.0000.0000.7FBD] # KANGXI RADICAL FEATHER 2F979 ; [.FB40.0020.0002.7FFA][.FFFA.0000.0000.7FFA] # CJK COMPATIBILITY IDEOGRAPH-2F979 F934 ; [.FB41.0020.0002.8001][.8001.0000.0000.8001] # CJK COMPATIBILITY IDEOGRAPH-F934 2F7C ; [.FB41.0020.0004.8001][.8001.0000.0000.8001] # KANGXI RADICAL OLD 2EB9 ; [.FB41.0020.0004.8002][.8002.0000.0000.8002] # CJK RADICAL OLD FA5B ; [.FB41.0020.0002.8005][.8005.0000.0000.8005] # CJK COMPATIBILITY IDEOGRAPH-FA5B FAB2 ; [.FB41.0020.0002.8005][.8005.0000.0000.8005] # CJK COMPATIBILITY IDEOGRAPH-FAB2 2F97A ; [.FB41.0020.0002.8005][.8005.0000.0000.8005] # CJK COMPATIBILITY IDEOGRAPH-2F97A 2F7D ; [.FB41.0020.0004.800C][.800C.0000.0000.800C] # KANGXI RADICAL AND 2F7E ; [.FB41.0020.0004.8012][.8012.0000.0000.8012] # KANGXI RADICAL PLOW 2F7F ; [.FB41.0020.0004.8033][.8033.0000.0000.8033] # KANGXI RADICAL EAR F9B0 ; [.FB41.0020.0002.8046][.8046.0000.0000.8046] # CJK COMPATIBILITY IDEOGRAPH-F9B0 2F97D ; [.FB41.0020.0002.8060][.8060.0000.0000.8060] # CJK COMPATIBILITY IDEOGRAPH-2F97D F997 ; [.FB41.0020.0002.806F][.806F.0000.0000.806F] # CJK COMPATIBILITY IDEOGRAPH-F997 2F97F ; [.FB41.0020.0002.8070][.8070.0000.0000.8070] # CJK COMPATIBILITY IDEOGRAPH-2F97F F945 ; [.FB41.0020.0002.807E][.807E.0000.0000.807E] # CJK COMPATIBILITY IDEOGRAPH-F945 2F80 ; [.FB41.0020.0004.807F][.807F.0000.0000.807F] # KANGXI RADICAL BRUSH 2EBB ; [.FB41.0020.0004.807F][.807F.0000.0000.807F][.0000.0139.001F.2EBB] # CJK RADICAL BRUSH TWO 2EBA ; [.FB41.0020.0004.8080][.8080.0000.0000.8080] # CJK RADICAL BRUSH ONE 2F81 ; [.FB41.0020.0004.8089][.8089.0000.0000.8089] # KANGXI RADICAL MEAT 2EBC ; [.FB41.0020.0004.8089][.8089.0000.0000.8089][.0000.0139.001F.2EBC] # CJK RADICAL MEAT F953 ; [.FB41.0020.0002.808B][.808B.0000.0000.808B] # CJK COMPATIBILITY IDEOGRAPH-F953 2F8D6 ; [.FB41.0020.0002.80AD][.80AD.0000.0000.80AD] # CJK COMPATIBILITY IDEOGRAPH-2F8D6 2F982 ; [.FB41.0020.0002.80B2][.80B2.0000.0000.80B2] # CJK COMPATIBILITY IDEOGRAPH-2F982 2F983 ; [.FB41.0020.0002.8103][.8103.0000.0000.8103] # CJK COMPATIBILITY IDEOGRAPH-2F983 2F985 ; [.FB41.0020.0002.813E][.813E.0000.0000.813E] # CJK COMPATIBILITY IDEOGRAPH-2F985 F926 ; [.FB41.0020.0002.81D8][.81D8.0000.0000.81D8] # CJK COMPATIBILITY IDEOGRAPH-F926 2F82 ; [.FB41.0020.0004.81E3][.81E3.0000.0000.81E3] # KANGXI RADICAL MINISTER F9F6 ; [.FB41.0020.0002.81E8][.81E8.0000.0000.81E8] # CJK COMPATIBILITY IDEOGRAPH-F9F6 2F83 ; [.FB41.0020.0004.81EA][.81EA.0000.0000.81EA] # KANGXI RADICAL SELF 3242 ; [*02FB.0020.0004.3242][.FB41.0020.0004.81EA][.81EA.0000.0000.81EA][*02FC.0020.001F.3242] # PARENTHESIZED IDEOGRAPH SELF FA5C ; [.FB41.0020.0002.81ED][.81ED.0000.0000.81ED] # CJK COMPATIBILITY IDEOGRAPH-FA5C 2F84 ; [.FB41.0020.0004.81F3][.81F3.0000.0000.81F3] # KANGXI RADICAL ARRIVE 3243 ; [*02FB.0020.0004.3243][.FB41.0020.0004.81F3][.81F3.0000.0000.81F3][*02FC.0020.001F.3243] # PARENTHESIZED IDEOGRAPH REACH 2F85 ; [.FB41.0020.0004.81FC][.81FC.0000.0000.81FC] # KANGXI RADICAL MORTAR 2EBD ; [.FB41.0020.0004.81FC][.81FC.0000.0000.81FC][.0000.0139.001F.2EBD] # CJK RADICAL MORTAR 2F893 ; [.FB41.0020.0002.8201][.8201.0000.0000.8201] # CJK COMPATIBILITY IDEOGRAPH-2F893 2F98B ; [.FB41.0020.0002.8201][.8201.0000.0000.8201] # CJK COMPATIBILITY IDEOGRAPH-2F98B 2F98C ; [.FB41.0020.0002.8204][.8204.0000.0000.8204] # CJK COMPATIBILITY IDEOGRAPH-2F98C 2F86 ; [.FB41.0020.0004.820C][.820C.0000.0000.820C] # KANGXI RADICAL TONGUE FA6D ; [.FB41.0020.0002.8218][.8218.0000.0000.8218] # CJK COMPATIBILITY IDEOGRAPH-FA6D 2F87 ; [.FB41.0020.0004.821B][.821B.0000.0000.821B] # KANGXI RADICAL OPPOSE 2F88 ; [.FB41.0020.0004.821F][.821F.0000.0000.821F] # KANGXI RADICAL BOAT 2F89 ; [.FB41.0020.0004.826E][.826E.0000.0000.826E] # KANGXI RADICAL STOPPING F97C ; [.FB41.0020.0002.826F][.826F.0000.0000.826F] # CJK COMPATIBILITY IDEOGRAPH-F97C 2F8A ; [.FB41.0020.0004.8272][.8272.0000.0000.8272] # KANGXI RADICAL COLOR 2F8B ; [.FB41.0020.0004.8278][.8278.0000.0000.8278] # KANGXI RADICAL GRASS FA5D ; [.FB41.0020.0002.8279][.8279.0000.0000.8279] # CJK COMPATIBILITY IDEOGRAPH-FA5D FA5E ; [.FB41.0020.0002.8279][.8279.0000.0000.8279] # CJK COMPATIBILITY IDEOGRAPH-FA5E 2EBE ; [.FB41.0020.0004.8279][.8279.0000.0000.8279] # CJK RADICAL GRASS ONE 2EBF ; [.FB41.0020.0004.8279][.8279.0000.0000.8279][.0000.0139.001F.2EBF] # CJK RADICAL GRASS TWO 2EC0 ; [.FB41.0020.0004.8279][.8279.0000.0000.8279][.0000.013A.001F.2EC0] # CJK RADICAL GRASS THREE 2F990 ; [.FB41.0020.0002.828B][.828B.0000.0000.828B] # CJK COMPATIBILITY IDEOGRAPH-2F990 2F98F ; [.FB41.0020.0002.8291][.8291.0000.0000.8291] # CJK COMPATIBILITY IDEOGRAPH-2F98F 2F991 ; [.FB41.0020.0002.829D][.829D.0000.0000.829D] # CJK COMPATIBILITY IDEOGRAPH-2F991 2F993 ; [.FB41.0020.0002.82B1][.82B1.0000.0000.82B1] # CJK COMPATIBILITY IDEOGRAPH-2F993 2F994 ; [.FB41.0020.0002.82B3][.82B3.0000.0000.82B3] # CJK COMPATIBILITY IDEOGRAPH-2F994 2F995 ; [.FB41.0020.0002.82BD][.82BD.0000.0000.82BD] # CJK COMPATIBILITY IDEOGRAPH-2F995 F974 ; [.FB41.0020.0002.82E5][.82E5.0000.0000.82E5] # CJK COMPATIBILITY IDEOGRAPH-F974 2F998 ; [.FB41.0020.0002.82E5][.82E5.0000.0000.82E5] # CJK COMPATIBILITY IDEOGRAPH-2F998 2F996 ; [.FB41.0020.0002.82E6][.82E6.0000.0000.82E6] # CJK COMPATIBILITY IDEOGRAPH-2F996 2F999 ; [.FB41.0020.0002.831D][.831D.0000.0000.831D] # CJK COMPATIBILITY IDEOGRAPH-2F999 2F99C ; [.FB41.0020.0002.8323][.8323.0000.0000.8323] # CJK COMPATIBILITY IDEOGRAPH-2F99C F9FE ; [.FB41.0020.0002.8336][.8336.0000.0000.8336] # CJK COMPATIBILITY IDEOGRAPH-F9FE FAB3 ; [.FB41.0020.0002.8352][.8352.0000.0000.8352] # CJK COMPATIBILITY IDEOGRAPH-FAB3 2F9A0 ; [.FB41.0020.0002.8353][.8353.0000.0000.8353] # CJK COMPATIBILITY IDEOGRAPH-2F9A0 2F99A ; [.FB41.0020.0002.8363][.8363.0000.0000.8363] # CJK COMPATIBILITY IDEOGRAPH-2F99A 2F99B ; [.FB41.0020.0002.83AD][.83AD.0000.0000.83AD] # CJK COMPATIBILITY IDEOGRAPH-2F99B 2F99D ; [.FB41.0020.0002.83BD][.83BD.0000.0000.83BD] # CJK COMPATIBILITY IDEOGRAPH-2F99D F93E ; [.FB41.0020.0002.83C9][.83C9.0000.0000.83C9] # CJK COMPATIBILITY IDEOGRAPH-F93E 2F9A1 ; [.FB41.0020.0002.83CA][.83CA.0000.0000.83CA] # CJK COMPATIBILITY IDEOGRAPH-2F9A1 2F9A2 ; [.FB41.0020.0002.83CC][.83CC.0000.0000.83CC] # CJK COMPATIBILITY IDEOGRAPH-2F9A2 2F9A3 ; [.FB41.0020.0002.83DC][.83DC.0000.0000.83DC] # CJK COMPATIBILITY IDEOGRAPH-2F9A3 2F99E ; [.FB41.0020.0002.83E7][.83E7.0000.0000.83E7] # CJK COMPATIBILITY IDEOGRAPH-2F99E FAB4 ; [.FB41.0020.0002.83EF][.83EF.0000.0000.83EF] # CJK COMPATIBILITY IDEOGRAPH-FAB4 F958 ; [.FB41.0020.0002.83F1][.83F1.0000.0000.83F1] # CJK COMPATIBILITY IDEOGRAPH-F958 F918 ; [.FB41.0020.0002.843D][.843D.0000.0000.843D] # CJK COMPATIBILITY IDEOGRAPH-F918 F96E ; [.FB41.0020.0002.8449][.8449.0000.0000.8449] # CJK COMPATIBILITY IDEOGRAPH-F96E FA5F ; [.FB41.0020.0002.8457][.8457.0000.0000.8457] # CJK COMPATIBILITY IDEOGRAPH-FA5F 2F99F ; [.FB41.0020.0002.8457][.8457.0000.0000.8457] # CJK COMPATIBILITY IDEOGRAPH-2F99F F999 ; [.FB41.0020.0002.84EE][.84EE.0000.0000.84EE] # CJK COMPATIBILITY IDEOGRAPH-F999 2F9A8 ; [.FB41.0020.0002.84F1][.84F1.0000.0000.84F1] # CJK COMPATIBILITY IDEOGRAPH-2F9A8 2F9A9 ; [.FB41.0020.0002.84F3][.84F3.0000.0000.84F3] # CJK COMPATIBILITY IDEOGRAPH-2F9A9 F9C2 ; [.FB41.0020.0002.84FC][.84FC.0000.0000.84FC] # CJK COMPATIBILITY IDEOGRAPH-F9C2 2F9AA ; [.FB41.0020.0002.8516][.8516.0000.0000.8516] # CJK COMPATIBILITY IDEOGRAPH-2F9AA 2F9AC ; [.FB41.0020.0002.8564][.8564.0000.0000.8564] # CJK COMPATIBILITY IDEOGRAPH-2F9AC F923 ; [.FB41.0020.0002.85CD][.85CD.0000.0000.85CD] # CJK COMPATIBILITY IDEOGRAPH-F923 F9F0 ; [.FB41.0020.0002.85FA][.85FA.0000.0000.85FA] # CJK COMPATIBILITY IDEOGRAPH-F9F0 F935 ; [.FB41.0020.0002.8606][.8606.0000.0000.8606] # CJK COMPATIBILITY IDEOGRAPH-F935 FA20 ; [.FB41.0020.0002.8612][.8612.0000.0000.8612] # CJK COMPATIBILITY IDEOGRAPH-FA20 F91F ; [.FB41.0020.0002.862D][.862D.0000.0000.862D] # CJK COMPATIBILITY IDEOGRAPH-F91F F910 ; [.FB41.0020.0002.863F][.863F.0000.0000.863F] # CJK COMPATIBILITY IDEOGRAPH-F910 2F8C ; [.FB41.0020.0004.864D][.864D.0000.0000.864D] # KANGXI RADICAL TIGER 2EC1 ; [.FB41.0020.0004.864E][.864E.0000.0000.864E] # CJK RADICAL TIGER 2F9B3 ; [.FB41.0020.0002.8650][.8650.0000.0000.8650] # CJK COMPATIBILITY IDEOGRAPH-2F9B3 F936 ; [.FB41.0020.0002.865C][.865C.0000.0000.865C] # CJK COMPATIBILITY IDEOGRAPH-F936 2F9B4 ; [.FB41.0020.0002.865C][.865C.0000.0000.865C] # CJK COMPATIBILITY IDEOGRAPH-2F9B4 2F9B5 ; [.FB41.0020.0002.8667][.8667.0000.0000.8667] # CJK COMPATIBILITY IDEOGRAPH-2F9B5 2F9B6 ; [.FB41.0020.0002.8669][.8669.0000.0000.8669] # CJK COMPATIBILITY IDEOGRAPH-2F9B6 2F8D ; [.FB41.0020.0004.866B][.866B.0000.0000.866B] # KANGXI RADICAL INSECT 2F9B8 ; [.FB41.0020.0002.8688][.8688.0000.0000.8688] # CJK COMPATIBILITY IDEOGRAPH-2F9B8 2F9B7 ; [.FB41.0020.0002.86A9][.86A9.0000.0000.86A9] # CJK COMPATIBILITY IDEOGRAPH-2F9B7 2F9BA ; [.FB41.0020.0002.86E2][.86E2.0000.0000.86E2] # CJK COMPATIBILITY IDEOGRAPH-2F9BA 2F9B9 ; [.FB41.0020.0002.870E][.870E.0000.0000.870E] # CJK COMPATIBILITY IDEOGRAPH-2F9B9 2F9BC ; [.FB41.0020.0002.8728][.8728.0000.0000.8728] # CJK COMPATIBILITY IDEOGRAPH-2F9BC 2F9BD ; [.FB41.0020.0002.876B][.876B.0000.0000.876B] # CJK COMPATIBILITY IDEOGRAPH-2F9BD FAB5 ; [.FB41.0020.0002.8779][.8779.0000.0000.8779] # CJK COMPATIBILITY IDEOGRAPH-FAB5 2F9BB ; [.FB41.0020.0002.8779][.8779.0000.0000.8779] # CJK COMPATIBILITY IDEOGRAPH-2F9BB 2F9BE ; [.FB41.0020.0002.8786][.8786.0000.0000.8786] # CJK COMPATIBILITY IDEOGRAPH-2F9BE F911 ; [.FB41.0020.0002.87BA][.87BA.0000.0000.87BA] # CJK COMPATIBILITY IDEOGRAPH-F911 2F9C0 ; [.FB41.0020.0002.87E1][.87E1.0000.0000.87E1] # CJK COMPATIBILITY IDEOGRAPH-2F9C0 2F9C1 ; [.FB41.0020.0002.8801][.8801.0000.0000.8801] # CJK COMPATIBILITY IDEOGRAPH-2F9C1 F927 ; [.FB41.0020.0002.881F][.881F.0000.0000.881F] # CJK COMPATIBILITY IDEOGRAPH-F927 2F8E ; [.FB41.0020.0004.8840][.8840.0000.0000.8840] # KANGXI RADICAL BLOOD FA08 ; [.FB41.0020.0002.884C][.884C.0000.0000.884C] # CJK COMPATIBILITY IDEOGRAPH-FA08 2F8F ; [.FB41.0020.0004.884C][.884C.0000.0000.884C] # KANGXI RADICAL WALK ENCLOSURE 2F9C3 ; [.FB41.0020.0002.8860][.8860.0000.0000.8860] # CJK COMPATIBILITY IDEOGRAPH-2F9C3 2F9C4 ; [.FB41.0020.0002.8863][.8863.0000.0000.8863] # CJK COMPATIBILITY IDEOGRAPH-2F9C4 2F90 ; [.FB41.0020.0004.8863][.8863.0000.0000.8863] # KANGXI RADICAL CLOTHES 2EC2 ; [.FB41.0020.0004.8864][.8864.0000.0000.8864] # CJK RADICAL CLOTHES F9A0 ; [.FB41.0020.0002.88C2][.88C2.0000.0000.88C2] # CJK COMPATIBILITY IDEOGRAPH-F9A0 F9E7 ; [.FB41.0020.0002.88CF][.88CF.0000.0000.88CF] # CJK COMPATIBILITY IDEOGRAPH-F9E7 2F9C6 ; [.FB41.0020.0002.88D7][.88D7.0000.0000.88D7] # CJK COMPATIBILITY IDEOGRAPH-2F9C6 2F9C7 ; [.FB41.0020.0002.88DE][.88DE.0000.0000.88DE] # CJK COMPATIBILITY IDEOGRAPH-2F9C7 F9E8 ; [.FB41.0020.0002.88E1][.88E1.0000.0000.88E1] # CJK COMPATIBILITY IDEOGRAPH-F9E8 F912 ; [.FB41.0020.0002.88F8][.88F8.0000.0000.88F8] # CJK COMPATIBILITY IDEOGRAPH-F912 2F9C9 ; [.FB41.0020.0002.88FA][.88FA.0000.0000.88FA] # CJK COMPATIBILITY IDEOGRAPH-2F9C9 FA60 ; [.FB41.0020.0002.8910][.8910.0000.0000.8910] # CJK COMPATIBILITY IDEOGRAPH-FA60 FAB6 ; [.FB41.0020.0002.8941][.8941.0000.0000.8941] # CJK COMPATIBILITY IDEOGRAPH-FAB6 F924 ; [.FB41.0020.0002.8964][.8964.0000.0000.8964] # CJK COMPATIBILITY IDEOGRAPH-F924 2F91 ; [.FB41.0020.0004.897E][.897E.0000.0000.897E] # KANGXI RADICAL WEST 2EC4 ; [.FB41.0020.0004.897F][.897F.0000.0000.897F] # CJK RADICAL WEST TWO 2EC3 ; [.FB41.0020.0004.8980][.8980.0000.0000.8980] # CJK RADICAL WEST ONE FAB7 ; [.FB41.0020.0002.8986][.8986.0000.0000.8986] # CJK COMPATIBILITY IDEOGRAPH-FAB7 FA0A ; [.FB41.0020.0002.898B][.898B.0000.0000.898B] # CJK COMPATIBILITY IDEOGRAPH-FA0A 2F92 ; [.FB41.0020.0004.898B][.898B.0000.0000.898B] # KANGXI RADICAL SEE FA61 ; [.FB41.0020.0002.8996][.8996.0000.0000.8996] # CJK COMPATIBILITY IDEOGRAPH-FA61 FAB8 ; [.FB41.0020.0002.8996][.8996.0000.0000.8996] # CJK COMPATIBILITY IDEOGRAPH-FAB8 2EC5 ; [.FB41.0020.0004.89C1][.89C1.0000.0000.89C1] # CJK RADICAL C-SIMPLIFIED SEE 2EC6 ; [.FB41.0020.0004.89D2][.89D2.0000.0000.89D2] # CJK RADICAL SIMPLIFIED HORN 2F93 ; [.FB41.0020.0004.89D2][.89D2.0000.0000.89D2] # KANGXI RADICAL HORN 2EC7 ; [.FB41.0020.0004.89D2][.89D2.0000.0000.89D2][.0000.0139.001F.2EC7] # CJK RADICAL HORN 1F216 ; [.FB41.0020.001C.89E3][.89E3.0000.0000.89E3] # SQUARED CJK UNIFIED IDEOGRAPH-89E3 2F94 ; [.FB41.0020.0004.8A00][.8A00.0000.0000.8A00] # KANGXI RADICAL SPEECH 2F9CF ; [.FB41.0020.0002.8AA0][.8AA0.0000.0000.8AA0] # CJK COMPATIBILITY IDEOGRAPH-2F9CF F96F ; [.FB41.0020.0002.8AAA][.8AAA.0000.0000.8AAA] # CJK COMPATIBILITY IDEOGRAPH-F96F F9A1 ; [.FB41.0020.0002.8AAA][.8AAA.0000.0000.8AAA] # CJK COMPATIBILITY IDEOGRAPH-F9A1 FAB9 ; [.FB41.0020.0002.8ABF][.8ABF.0000.0000.8ABF] # CJK COMPATIBILITY IDEOGRAPH-FAB9 FABB ; [.FB41.0020.0002.8ACB][.8ACB.0000.0000.8ACB] # CJK COMPATIBILITY IDEOGRAPH-FABB F97D ; [.FB41.0020.0002.8AD2][.8AD2.0000.0000.8AD2] # CJK COMPATIBILITY IDEOGRAPH-F97D F941 ; [.FB41.0020.0002.8AD6][.8AD6.0000.0000.8AD6] # CJK COMPATIBILITY IDEOGRAPH-F941 FABE ; [.FB41.0020.0002.8AED][.8AED.0000.0000.8AED] # CJK COMPATIBILITY IDEOGRAPH-FABE 2F9D0 ; [.FB41.0020.0002.8AED][.8AED.0000.0000.8AED] # CJK COMPATIBILITY IDEOGRAPH-2F9D0 FA22 ; [.FB41.0020.0002.8AF8][.8AF8.0000.0000.8AF8] # CJK COMPATIBILITY IDEOGRAPH-FA22 FABA ; [.FB41.0020.0002.8AF8][.8AF8.0000.0000.8AF8] # CJK COMPATIBILITY IDEOGRAPH-FABA F95D ; [.FB41.0020.0002.8AFE][.8AFE.0000.0000.8AFE] # CJK COMPATIBILITY IDEOGRAPH-F95D FABD ; [.FB41.0020.0002.8AFE][.8AFE.0000.0000.8AFE] # CJK COMPATIBILITY IDEOGRAPH-FABD FA62 ; [.FB41.0020.0002.8B01][.8B01.0000.0000.8B01] # CJK COMPATIBILITY IDEOGRAPH-FA62 FABC ; [.FB41.0020.0002.8B01][.8B01.0000.0000.8B01] # CJK COMPATIBILITY IDEOGRAPH-FABC FA63 ; [.FB41.0020.0002.8B39][.8B39.0000.0000.8B39] # CJK COMPATIBILITY IDEOGRAPH-FA63 FABF ; [.FB41.0020.0002.8B39][.8B39.0000.0000.8B39] # CJK COMPATIBILITY IDEOGRAPH-FABF F9FC ; [.FB41.0020.0002.8B58][.8B58.0000.0000.8B58] # CJK COMPATIBILITY IDEOGRAPH-F9FC F95A ; [.FB41.0020.0002.8B80][.8B80.0000.0000.8B80] # CJK COMPATIBILITY IDEOGRAPH-F95A FAC0 ; [.FB41.0020.0002.8B8A][.8B8A.0000.0000.8B8A] # CJK COMPATIBILITY IDEOGRAPH-FAC0 2F9D1 ; [.FB41.0020.0002.8B8A][.8B8A.0000.0000.8B8A] # CJK COMPATIBILITY IDEOGRAPH-2F9D1 2EC8 ; [.FB41.0020.0004.8BA0][.8BA0.0000.0000.8BA0] # CJK RADICAL C-SIMPLIFIED SPEECH 2F95 ; [.FB41.0020.0004.8C37][.8C37.0000.0000.8C37] # KANGXI RADICAL VALLEY 2F96 ; [.FB41.0020.0004.8C46][.8C46.0000.0000.8C46] # KANGXI RADICAL BEAN F900 ; [.FB41.0020.0002.8C48][.8C48.0000.0000.8C48] # CJK COMPATIBILITY IDEOGRAPH-F900 2F9D2 ; [.FB41.0020.0002.8C55][.8C55.0000.0000.8C55] # CJK COMPATIBILITY IDEOGRAPH-2F9D2 2F97 ; [.FB41.0020.0004.8C55][.8C55.0000.0000.8C55] # KANGXI RADICAL PIG 2F98 ; [.FB41.0020.0004.8C78][.8C78.0000.0000.8C78] # KANGXI RADICAL BADGER 2F99 ; [.FB41.0020.0004.8C9D][.8C9D.0000.0000.8C9D] # KANGXI RADICAL SHELL 3236 ; [*02FB.0020.0004.3236][.FB41.0020.0004.8CA1][.8CA1.0000.0000.8CA1][*02FC.0020.001F.3236] # PARENTHESIZED IDEOGRAPH FINANCIAL 3296 ; [.FB41.0020.0006.8CA1][.8CA1.0000.0000.8CA1] # CIRCLED IDEOGRAPH FINANCIAL 1F223 ; [.FB41.0020.001C.8CA9][.8CA9.0000.0000.8CA9] # SQUARED CJK UNIFIED IDEOGRAPH-8CA9 2F9D4 ; [.FB41.0020.0002.8CAB][.8CAB.0000.0000.8CAB] # CJK COMPATIBILITY IDEOGRAPH-2F9D4 2F9D5 ; [.FB41.0020.0002.8CC1][.8CC1.0000.0000.8CC1] # CJK COMPATIBILITY IDEOGRAPH-2F9D5 F948 ; [.FB41.0020.0002.8CC2][.8CC2.0000.0000.8CC2] # CJK COMPATIBILITY IDEOGRAPH-F948 323E ; [*02FB.0020.0004.323E][.FB41.0020.0004.8CC7][.8CC7.0000.0000.8CC7][*02FC.0020.001F.323E] # PARENTHESIZED IDEOGRAPH RESOURCE 32AE ; [.FB41.0020.0006.8CC7][.8CC7.0000.0000.8CC7] # CIRCLED IDEOGRAPH RESOURCE F903 ; [.FB41.0020.0002.8CC8][.8CC8.0000.0000.8CC8] # CJK COMPATIBILITY IDEOGRAPH-F903 FA64 ; [.FB41.0020.0002.8CD3][.8CD3.0000.0000.8CD3] # CJK COMPATIBILITY IDEOGRAPH-FA64 FA65 ; [.FB41.0020.0002.8D08][.8D08.0000.0000.8D08] # CJK COMPATIBILITY IDEOGRAPH-FA65 FAC1 ; [.FB41.0020.0002.8D08][.8D08.0000.0000.8D08] # CJK COMPATIBILITY IDEOGRAPH-FAC1 2F9D6 ; [.FB41.0020.0002.8D1B][.8D1B.0000.0000.8D1B] # CJK COMPATIBILITY IDEOGRAPH-2F9D6 2EC9 ; [.FB41.0020.0004.8D1D][.8D1D.0000.0000.8D1D] # CJK RADICAL C-SIMPLIFIED SHELL 2F9A ; [.FB41.0020.0004.8D64][.8D64.0000.0000.8D64] # KANGXI RADICAL RED 2F9B ; [.FB41.0020.0004.8D70][.8D70.0000.0000.8D70] # KANGXI RADICAL RUN 1F230 ; [.FB41.0020.001C.8D70][.8D70.0000.0000.8D70] # SQUARED CJK UNIFIED IDEOGRAPH-8D70 2F9D7 ; [.FB41.0020.0002.8D77][.8D77.0000.0000.8D77] # CJK COMPATIBILITY IDEOGRAPH-2F9D7 2F9C ; [.FB41.0020.0004.8DB3][.8DB3.0000.0000.8DB3] # KANGXI RADICAL FOOT 2ECA ; [.FB41.0020.0004.8DB3][.8DB3.0000.0000.8DB3][.0000.0139.001F.2ECA] # CJK RADICAL FOOT 2F9DB ; [.FB41.0020.0002.8DBC][.8DBC.0000.0000.8DBC] # CJK COMPATIBILITY IDEOGRAPH-2F9DB 2F9DA ; [.FB41.0020.0002.8DCB][.8DCB.0000.0000.8DCB] # CJK COMPATIBILITY IDEOGRAPH-2F9DA F937 ; [.FB41.0020.0002.8DEF][.8DEF.0000.0000.8DEF] # CJK COMPATIBILITY IDEOGRAPH-F937 2F9DC ; [.FB41.0020.0002.8DF0][.8DF0.0000.0000.8DF0] # CJK COMPATIBILITY IDEOGRAPH-2F9DC 2F9D ; [.FB41.0020.0004.8EAB][.8EAB.0000.0000.8EAB] # KANGXI RADICAL BODY F902 ; [.FB41.0020.0002.8ECA][.8ECA.0000.0000.8ECA] # CJK COMPATIBILITY IDEOGRAPH-F902 2F9E ; [.FB41.0020.0004.8ECA][.8ECA.0000.0000.8ECA] # KANGXI RADICAL CART 2F9DE ; [.FB41.0020.0002.8ED4][.8ED4.0000.0000.8ED4] # CJK COMPATIBILITY IDEOGRAPH-2F9DE F998 ; [.FB41.0020.0002.8F26][.8F26.0000.0000.8F26] # CJK COMPATIBILITY IDEOGRAPH-F998 F9D7 ; [.FB41.0020.0002.8F2A][.8F2A.0000.0000.8F2A] # CJK COMPATIBILITY IDEOGRAPH-F9D7 FAC2 ; [.FB41.0020.0002.8F38][.8F38.0000.0000.8F38] # CJK COMPATIBILITY IDEOGRAPH-FAC2 2F9DF ; [.FB41.0020.0002.8F38][.8F38.0000.0000.8F38] # CJK COMPATIBILITY IDEOGRAPH-2F9DF FA07 ; [.FB41.0020.0002.8F3B][.8F3B.0000.0000.8F3B] # CJK COMPATIBILITY IDEOGRAPH-FA07 F98D ; [.FB41.0020.0002.8F62][.8F62.0000.0000.8F62] # CJK COMPATIBILITY IDEOGRAPH-F98D 2ECB ; [.FB41.0020.0004.8F66][.8F66.0000.0000.8F66] # CJK RADICAL C-SIMPLIFIED CART 2F9F ; [.FB41.0020.0004.8F9B][.8F9B.0000.0000.8F9B] # KANGXI RADICAL BITTER 2F98D ; [.FB41.0020.0002.8F9E][.8F9E.0000.0000.8F9E] # CJK COMPATIBILITY IDEOGRAPH-2F98D F971 ; [.FB41.0020.0002.8FB0][.8FB0.0000.0000.8FB0] # CJK COMPATIBILITY IDEOGRAPH-F971 2FA0 ; [.FB41.0020.0004.8FB0][.8FB0.0000.0000.8FB0] # KANGXI RADICAL MORNING 2FA1 ; [.FB41.0020.0004.8FB5][.8FB5.0000.0000.8FB5] # KANGXI RADICAL WALK FA66 ; [.FB41.0020.0002.8FB6][.8FB6.0000.0000.8FB6] # CJK COMPATIBILITY IDEOGRAPH-FA66 2ECC ; [.FB41.0020.0004.8FB6][.8FB6.0000.0000.8FB6] # CJK RADICAL SIMPLIFIED WALK 2ECD ; [.FB41.0020.0004.8FB6][.8FB6.0000.0000.8FB6][.0000.0139.001F.2ECD] # CJK RADICAL WALK ONE 2ECE ; [.FB41.0020.0004.8FB6][.8FB6.0000.0000.8FB6][.0000.013A.001F.2ECE] # CJK RADICAL WALK TWO F99A ; [.FB41.0020.0002.9023][.9023.0000.0000.9023] # CJK COMPATIBILITY IDEOGRAPH-F99A FA25 ; [.FB41.0020.0002.9038][.9038.0000.0000.9038] # CJK COMPATIBILITY IDEOGRAPH-FA25 FA67 ; [.FB41.0020.0002.9038][.9038.0000.0000.9038] # CJK COMPATIBILITY IDEOGRAPH-FA67 1F22B ; [.FB41.0020.001C.904A][.904A.0000.0000.904A] # SQUARED CJK UNIFIED IDEOGRAPH-904A 329C ; [.FB41.0020.0006.9069][.9069.0000.0000.9069] # CIRCLED IDEOGRAPH SUITABLE FAC3 ; [.FB41.0020.0002.9072][.9072.0000.0000.9072] # CJK COMPATIBILITY IDEOGRAPH-FAC3 F9C3 ; [.FB41.0020.0002.907C][.907C.0000.0000.907C] # CJK COMPATIBILITY IDEOGRAPH-F9C3 F913 ; [.FB41.0020.0002.908F][.908F.0000.0000.908F] # CJK COMPATIBILITY IDEOGRAPH-F913 2FA2 ; [.FB41.0020.0004.9091][.9091.0000.0000.9091] # KANGXI RADICAL CITY 2ECF ; [.FB41.0020.0004.9091][.9091.0000.0000.9091][.0000.0139.001F.2ECF] # CJK RADICAL CITY 2F9E2 ; [.FB41.0020.0002.9094][.9094.0000.0000.9094] # CJK COMPATIBILITY IDEOGRAPH-2F9E2 F92C ; [.FB41.0020.0002.90CE][.90CE.0000.0000.90CE] # CJK COMPATIBILITY IDEOGRAPH-F92C FA2E ; [.FB41.0020.0002.90DE][.90DE.0000.0000.90DE] # CJK COMPATIBILITY IDEOGRAPH-FA2E 2F9E3 ; [.FB41.0020.0002.90F1][.90F1.0000.0000.90F1] # CJK COMPATIBILITY IDEOGRAPH-2F9E3 FA26 ; [.FB41.0020.0002.90FD][.90FD.0000.0000.90FD] # CJK COMPATIBILITY IDEOGRAPH-FA26 2F9E4 ; [.FB41.0020.0002.9111][.9111.0000.0000.9111] # CJK COMPATIBILITY IDEOGRAPH-2F9E4 2F9E6 ; [.FB41.0020.0002.911B][.911B.0000.0000.911B] # CJK COMPATIBILITY IDEOGRAPH-2F9E6 2FA3 ; [.FB41.0020.0004.9149][.9149.0000.0000.9149] # KANGXI RADICAL WINE F919 ; [.FB41.0020.0002.916A][.916A.0000.0000.916A] # CJK COMPATIBILITY IDEOGRAPH-F919 FAC4 ; [.FB41.0020.0002.9199][.9199.0000.0000.9199] # CJK COMPATIBILITY IDEOGRAPH-FAC4 F9B7 ; [.FB41.0020.0002.91B4][.91B4.0000.0000.91B4] # CJK COMPATIBILITY IDEOGRAPH-F9B7 2FA4 ; [.FB41.0020.0004.91C6][.91C6.0000.0000.91C6] # KANGXI RADICAL DISTINGUISH F9E9 ; [.FB41.0020.0002.91CC][.91CC.0000.0000.91CC] # CJK COMPATIBILITY IDEOGRAPH-F9E9 2FA5 ; [.FB41.0020.0004.91CC][.91CC.0000.0000.91CC] # KANGXI RADICAL VILLAGE F97E ; [.FB41.0020.0002.91CF][.91CF.0000.0000.91CF] # CJK COMPATIBILITY IDEOGRAPH-F97E F90A ; [.FB41.0020.0002.91D1][.91D1.0000.0000.91D1] # CJK COMPATIBILITY IDEOGRAPH-F90A 2FA6 ; [.FB41.0020.0004.91D1][.91D1.0000.0000.91D1] # KANGXI RADICAL GOLD 322E ; [*02FB.0020.0004.322E][.FB41.0020.0004.91D1][.91D1.0000.0000.91D1][*02FC.0020.001F.322E] # PARENTHESIZED IDEOGRAPH METAL 328E ; [.FB41.0020.0006.91D1][.91D1.0000.0000.91D1] # CIRCLED IDEOGRAPH METAL F9B1 ; [.FB41.0020.0002.9234][.9234.0000.0000.9234] # CJK COMPATIBILITY IDEOGRAPH-F9B1 2F9E7 ; [.FB41.0020.0002.9238][.9238.0000.0000.9238] # CJK COMPATIBILITY IDEOGRAPH-2F9E7 FAC5 ; [.FB41.0020.0002.9276][.9276.0000.0000.9276] # CJK COMPATIBILITY IDEOGRAPH-FAC5 2F9EA ; [.FB41.0020.0002.927C][.927C.0000.0000.927C] # CJK COMPATIBILITY IDEOGRAPH-2F9EA 2F9E8 ; [.FB41.0020.0002.92D7][.92D7.0000.0000.92D7] # CJK COMPATIBILITY IDEOGRAPH-2F9E8 2F9E9 ; [.FB41.0020.0002.92D8][.92D8.0000.0000.92D8] # CJK COMPATIBILITY IDEOGRAPH-2F9E9 F93F ; [.FB41.0020.0002.9304][.9304.0000.0000.9304] # CJK COMPATIBILITY IDEOGRAPH-F93F F99B ; [.FB41.0020.0002.934A][.934A.0000.0000.934A] # CJK COMPATIBILITY IDEOGRAPH-F99B 2F9EB ; [.FB41.0020.0002.93F9][.93F9.0000.0000.93F9] # CJK COMPATIBILITY IDEOGRAPH-2F9EB 2F9EC ; [.FB41.0020.0002.9415][.9415.0000.0000.9415] # CJK COMPATIBILITY IDEOGRAPH-2F9EC 2ED0 ; [.FB41.0020.0004.9485][.9485.0000.0000.9485] # CJK RADICAL C-SIMPLIFIED GOLD 2ED1 ; [.FB41.0020.0004.9577][.9577.0000.0000.9577] # CJK RADICAL LONG ONE 2FA7 ; [.FB41.0020.0004.9577][.9577.0000.0000.9577] # KANGXI RADICAL LONG 2ED2 ; [.FB41.0020.0004.9578][.9578.0000.0000.9578] # CJK RADICAL LONG TWO 2ED3 ; [.FB41.0020.0004.957F][.957F.0000.0000.957F] # CJK RADICAL C-SIMPLIFIED LONG 2FA8 ; [.FB41.0020.0004.9580][.9580.0000.0000.9580] # KANGXI RADICAL GATE 2F9EE ; [.FB41.0020.0002.958B][.958B.0000.0000.958B] # CJK COMPATIBILITY IDEOGRAPH-2F9EE F986 ; [.FB41.0020.0002.95AD][.95AD.0000.0000.95AD] # CJK COMPATIBILITY IDEOGRAPH-F986 2F9F0 ; [.FB41.0020.0002.95B7][.95B7.0000.0000.95B7] # CJK COMPATIBILITY IDEOGRAPH-2F9F0 2ED4 ; [.FB41.0020.0004.95E8][.95E8.0000.0000.95E8] # CJK RADICAL C-SIMPLIFIED GATE 2FA9 ; [.FB41.0020.0004.961C][.961C.0000.0000.961C] # KANGXI RADICAL MOUND 2ED5 ; [.FB41.0020.0004.961C][.961C.0000.0000.961C][.0000.0139.001F.2ED5] # CJK RADICAL MOUND ONE 2ED6 ; [.FB41.0020.0004.961D][.961D.0000.0000.961D] # CJK RADICAL MOUND TWO F9C6 ; [.FB41.0020.0002.962E][.962E.0000.0000.962E] # CJK COMPATIBILITY IDEOGRAPH-F9C6 F951 ; [.FB41.0020.0002.964B][.964B.0000.0000.964B] # CJK COMPATIBILITY IDEOGRAPH-F951 FA09 ; [.FB41.0020.0002.964D][.964D.0000.0000.964D] # CJK COMPATIBILITY IDEOGRAPH-FA09 F959 ; [.FB41.0020.0002.9675][.9675.0000.0000.9675] # CJK COMPATIBILITY IDEOGRAPH-F959 F9D3 ; [.FB41.0020.0002.9678][.9678.0000.0000.9678] # CJK COMPATIBILITY IDEOGRAPH-F9D3 FAC6 ; [.FB41.0020.0002.967C][.967C.0000.0000.967C] # CJK COMPATIBILITY IDEOGRAPH-FAC6 F9DC ; [.FB41.0020.0002.9686][.9686.0000.0000.9686] # CJK COMPATIBILITY IDEOGRAPH-F9DC F9F1 ; [.FB41.0020.0002.96A3][.96A3.0000.0000.96A3] # CJK COMPATIBILITY IDEOGRAPH-F9F1 2FAA ; [.FB41.0020.0004.96B6][.96B6.0000.0000.96B6] # KANGXI RADICAL SLAVE FA2F ; [.FB41.0020.0002.96B7][.96B7.0000.0000.96B7] # CJK COMPATIBILITY IDEOGRAPH-FA2F F9B8 ; [.FB41.0020.0002.96B8][.96B8.0000.0000.96B8] # CJK COMPATIBILITY IDEOGRAPH-F9B8 2FAB ; [.FB41.0020.0004.96B9][.96B9.0000.0000.96B9] # KANGXI RADICAL SHORT TAILED BIRD 2F9F3 ; [.FB41.0020.0002.96C3][.96C3.0000.0000.96C3] # CJK COMPATIBILITY IDEOGRAPH-2F9F3 F9EA ; [.FB41.0020.0002.96E2][.96E2.0000.0000.96E2] # CJK COMPATIBILITY IDEOGRAPH-F9EA FA68 ; [.FB41.0020.0002.96E3][.96E3.0000.0000.96E3] # CJK COMPATIBILITY IDEOGRAPH-FA68 FAC7 ; [.FB41.0020.0002.96E3][.96E3.0000.0000.96E3] # CJK COMPATIBILITY IDEOGRAPH-FAC7 2FAC ; [.FB41.0020.0004.96E8][.96E8.0000.0000.96E8] # KANGXI RADICAL RAIN 2ED7 ; [.FB41.0020.0004.96E8][.96E8.0000.0000.96E8][.0000.0139.001F.2ED7] # CJK RADICAL RAIN F9B2 ; [.FB41.0020.0002.96F6][.96F6.0000.0000.96F6] # CJK COMPATIBILITY IDEOGRAPH-F9B2 F949 ; [.FB41.0020.0002.96F7][.96F7.0000.0000.96F7] # CJK COMPATIBILITY IDEOGRAPH-F949 2F9F5 ; [.FB41.0020.0002.9723][.9723.0000.0000.9723] # CJK COMPATIBILITY IDEOGRAPH-2F9F5 F938 ; [.FB41.0020.0002.9732][.9732.0000.0000.9732] # CJK COMPATIBILITY IDEOGRAPH-F938 F9B3 ; [.FB41.0020.0002.9748][.9748.0000.0000.9748] # CJK COMPATIBILITY IDEOGRAPH-F9B3 2FAD ; [.FB41.0020.0004.9751][.9751.0000.0000.9751] # KANGXI RADICAL BLUE 2ED8 ; [.FB41.0020.0004.9752][.9752.0000.0000.9752] # CJK RADICAL BLUE FA1C ; [.FB41.0020.0002.9756][.9756.0000.0000.9756] # CJK COMPATIBILITY IDEOGRAPH-FA1C FAC8 ; [.FB41.0020.0002.9756][.9756.0000.0000.9756] # CJK COMPATIBILITY IDEOGRAPH-FAC8 2FAE ; [.FB41.0020.0004.975E][.975E.0000.0000.975E] # KANGXI RADICAL WRONG 2FAF ; [.FB41.0020.0004.9762][.9762.0000.0000.9762] # KANGXI RADICAL FACE 2FB0 ; [.FB41.0020.0004.9769][.9769.0000.0000.9769] # KANGXI RADICAL LEATHER 2FB1 ; [.FB41.0020.0004.97CB][.97CB.0000.0000.97CB] # KANGXI RADICAL TANNED LEATHER FAC9 ; [.FB41.0020.0002.97DB][.97DB.0000.0000.97DB] # CJK COMPATIBILITY IDEOGRAPH-FAC9 2F9FA ; [.FB41.0020.0002.97E0][.97E0.0000.0000.97E0] # CJK COMPATIBILITY IDEOGRAPH-2F9FA 2ED9 ; [.FB41.0020.0004.97E6][.97E6.0000.0000.97E6] # CJK RADICAL C-SIMPLIFIED TANNED LEATHER 2FB2 ; [.FB41.0020.0004.97ED][.97ED.0000.0000.97ED] # KANGXI RADICAL LEEK 2FB3 ; [.FB41.0020.0004.97F3][.97F3.0000.0000.97F3] # KANGXI RADICAL SOUND FA69 ; [.FB41.0020.0002.97FF][.97FF.0000.0000.97FF] # CJK COMPATIBILITY IDEOGRAPH-FA69 FACA ; [.FB41.0020.0002.97FF][.97FF.0000.0000.97FF] # CJK COMPATIBILITY IDEOGRAPH-FACA 2FB4 ; [.FB41.0020.0004.9801][.9801.0000.0000.9801] # KANGXI RADICAL LEAF 32A0 ; [.FB41.0020.0006.9805][.9805.0000.0000.9805] # CIRCLED IDEOGRAPH ITEM FACB ; [.FB41.0020.0002.980B][.980B.0000.0000.980B] # CJK COMPATIBILITY IDEOGRAPH-FACB 2F9FE ; [.FB41.0020.0002.980B][.980B.0000.0000.980B] # CJK COMPATIBILITY IDEOGRAPH-2F9FE 2F9FF ; [.FB41.0020.0002.980B][.980B.0000.0000.980B] # CJK COMPATIBILITY IDEOGRAPH-2F9FF F9B4 ; [.FB41.0020.0002.9818][.9818.0000.0000.9818] # CJK COMPATIBILITY IDEOGRAPH-F9B4 2FA00 ; [.FB41.0020.0002.9829][.9829.0000.0000.9829] # CJK COMPATIBILITY IDEOGRAPH-2FA00 FA6A ; [.FB41.0020.0002.983B][.983B.0000.0000.983B] # CJK COMPATIBILITY IDEOGRAPH-FA6A FACC ; [.FB41.0020.0002.983B][.983B.0000.0000.983B] # CJK COMPATIBILITY IDEOGRAPH-FACC F9D0 ; [.FB41.0020.0002.985E][.985E.0000.0000.985E] # CJK COMPATIBILITY IDEOGRAPH-F9D0 2EDA ; [.FB41.0020.0004.9875][.9875.0000.0000.9875] # CJK RADICAL C-SIMPLIFIED LEAF 2FB5 ; [.FB41.0020.0004.98A8][.98A8.0000.0000.98A8] # KANGXI RADICAL WIND 2EDB ; [.FB41.0020.0004.98CE][.98CE.0000.0000.98CE] # CJK RADICAL C-SIMPLIFIED WIND 2FB6 ; [.FB41.0020.0004.98DB][.98DB.0000.0000.98DB] # KANGXI RADICAL FLY 2EDC ; [.FB41.0020.0004.98DE][.98DE.0000.0000.98DE] # CJK RADICAL C-SIMPLIFIED FLY 2EDD ; [.FB41.0020.0004.98DF][.98DF.0000.0000.98DF] # CJK RADICAL EAT ONE 2FB7 ; [.FB41.0020.0004.98DF][.98DF.0000.0000.98DF] # KANGXI RADICAL EAT 2EDF ; [.FB41.0020.0004.98E0][.98E0.0000.0000.98E0] # CJK RADICAL EAT THREE 2EDE ; [.FB41.0020.0004.98E0][.98E0.0000.0000.98E0][.0000.0139.001F.2EDE] # CJK RADICAL EAT TWO 2FA02 ; [.FB41.0020.0002.98E2][.98E2.0000.0000.98E2] # CJK COMPATIBILITY IDEOGRAPH-2FA02 FA2A ; [.FB41.0020.0002.98EF][.98EF.0000.0000.98EF] # CJK COMPATIBILITY IDEOGRAPH-FA2A FA2B ; [.FB41.0020.0002.98FC][.98FC.0000.0000.98FC] # CJK COMPATIBILITY IDEOGRAPH-FA2B FA2C ; [.FB41.0020.0002.9928][.9928.0000.0000.9928] # CJK COMPATIBILITY IDEOGRAPH-FA2C 2FA04 ; [.FB41.0020.0002.9929][.9929.0000.0000.9929] # CJK COMPATIBILITY IDEOGRAPH-2FA04 2EE0 ; [.FB41.0020.0004.9963][.9963.0000.0000.9963] # CJK RADICAL C-SIMPLIFIED EAT 2FB8 ; [.FB41.0020.0004.9996][.9996.0000.0000.9996] # KANGXI RADICAL HEAD 2EE1 ; [.FB41.0020.0004.9996][.9996.0000.0000.9996][.0000.0139.001F.2EE1] # CJK RADICAL HEAD 2FB9 ; [.FB41.0020.0004.9999][.9999.0000.0000.9999] # KANGXI RADICAL FRAGRANT 2FA05 ; [.FB41.0020.0002.99A7][.99A7.0000.0000.99A7] # CJK COMPATIBILITY IDEOGRAPH-2FA05 2FBA ; [.FB41.0020.0004.99AC][.99AC.0000.0000.99AC] # KANGXI RADICAL HORSE 2FA06 ; [.FB41.0020.0002.99C2][.99C2.0000.0000.99C2] # CJK COMPATIBILITY IDEOGRAPH-2FA06 F91A ; [.FB41.0020.0002.99F1][.99F1.0000.0000.99F1] # CJK COMPATIBILITY IDEOGRAPH-F91A 2FA07 ; [.FB41.0020.0002.99FE][.99FE.0000.0000.99FE] # CJK COMPATIBILITY IDEOGRAPH-2FA07 F987 ; [.FB41.0020.0002.9A6A][.9A6A.0000.0000.9A6A] # CJK COMPATIBILITY IDEOGRAPH-F987 2EE2 ; [.FB41.0020.0004.9A6C][.9A6C.0000.0000.9A6C] # CJK RADICAL C-SIMPLIFIED HORSE 2FBB ; [.FB41.0020.0004.9AA8][.9AA8.0000.0000.9AA8] # KANGXI RADICAL BONE 2EE3 ; [.FB41.0020.0004.9AA8][.9AA8.0000.0000.9AA8][.0000.0139.001F.2EE3] # CJK RADICAL BONE 2FBC ; [.FB41.0020.0004.9AD8][.9AD8.0000.0000.9AD8] # KANGXI RADICAL TALL 2FBD ; [.FB41.0020.0004.9ADF][.9ADF.0000.0000.9ADF] # KANGXI RADICAL HAIR FACD ; [.FB41.0020.0002.9B12][.9B12.0000.0000.9B12] # CJK COMPATIBILITY IDEOGRAPH-FACD 2FA0A ; [.FB41.0020.0002.9B12][.9B12.0000.0000.9B12] # CJK COMPATIBILITY IDEOGRAPH-2FA0A 2FBE ; [.FB41.0020.0004.9B25][.9B25.0000.0000.9B25] # KANGXI RADICAL FIGHT 2FBF ; [.FB41.0020.0004.9B2F][.9B2F.0000.0000.9B2F] # KANGXI RADICAL SACRIFICIAL WINE 2FC0 ; [.FB41.0020.0004.9B32][.9B32.0000.0000.9B32] # KANGXI RADICAL CAULDRON 2FC1 ; [.FB41.0020.0004.9B3C][.9B3C.0000.0000.9B3C] # KANGXI RADICAL GHOST 2EE4 ; [.FB41.0020.0004.9B3C][.9B3C.0000.0000.9B3C][.0000.0139.001F.2EE4] # CJK RADICAL GHOST 2FC2 ; [.FB41.0020.0004.9B5A][.9B5A.0000.0000.9B5A] # KANGXI RADICAL FISH F939 ; [.FB41.0020.0002.9B6F][.9B6F.0000.0000.9B6F] # CJK COMPATIBILITY IDEOGRAPH-F939 2FA0B ; [.FB41.0020.0002.9C40][.9C40.0000.0000.9C40] # CJK COMPATIBILITY IDEOGRAPH-2FA0B F9F2 ; [.FB41.0020.0002.9C57][.9C57.0000.0000.9C57] # CJK COMPATIBILITY IDEOGRAPH-F9F2 2EE5 ; [.FB41.0020.0004.9C7C][.9C7C.0000.0000.9C7C] # CJK RADICAL C-SIMPLIFIED FISH 2FC3 ; [.FB41.0020.0004.9CE5][.9CE5.0000.0000.9CE5] # KANGXI RADICAL BIRD 2FA0C ; [.FB41.0020.0002.9CFD][.9CFD.0000.0000.9CFD] # CJK COMPATIBILITY IDEOGRAPH-2FA0C 2FA0F ; [.FB41.0020.0002.9D67][.9D67.0000.0000.9D67] # CJK COMPATIBILITY IDEOGRAPH-2FA0F FA2D ; [.FB41.0020.0002.9DB4][.9DB4.0000.0000.9DB4] # CJK COMPATIBILITY IDEOGRAPH-FA2D F93A ; [.FB41.0020.0002.9DFA][.9DFA.0000.0000.9DFA] # CJK COMPATIBILITY IDEOGRAPH-F93A F920 ; [.FB41.0020.0002.9E1E][.9E1E.0000.0000.9E1E] # CJK COMPATIBILITY IDEOGRAPH-F920 2EE6 ; [.FB41.0020.0004.9E1F][.9E1F.0000.0000.9E1F] # CJK RADICAL C-SIMPLIFIED BIRD 2FC4 ; [.FB41.0020.0004.9E75][.9E75.0000.0000.9E75] # KANGXI RADICAL SALT 2EE7 ; [.FB41.0020.0004.9E75][.9E75.0000.0000.9E75][.0000.0139.001F.2EE7] # CJK RADICAL C-SIMPLIFIED SALT F940 ; [.FB41.0020.0002.9E7F][.9E7F.0000.0000.9E7F] # CJK COMPATIBILITY IDEOGRAPH-F940 2FC5 ; [.FB41.0020.0004.9E7F][.9E7F.0000.0000.9E7F] # KANGXI RADICAL DEER F988 ; [.FB41.0020.0002.9E97][.9E97.0000.0000.9E97] # CJK COMPATIBILITY IDEOGRAPH-F988 F9F3 ; [.FB41.0020.0002.9E9F][.9E9F.0000.0000.9E9F] # CJK COMPATIBILITY IDEOGRAPH-F9F3 2FC6 ; [.FB41.0020.0004.9EA5][.9EA5.0000.0000.9EA5] # KANGXI RADICAL WHEAT 2EE8 ; [.FB41.0020.0004.9EA6][.9EA6.0000.0000.9EA6] # CJK RADICAL SIMPLIFIED WHEAT 2FA15 ; [.FB41.0020.0002.9EBB][.9EBB.0000.0000.9EBB] # CJK COMPATIBILITY IDEOGRAPH-2FA15 2FC7 ; [.FB41.0020.0004.9EBB][.9EBB.0000.0000.9EBB] # KANGXI RADICAL HEMP 2FC8 ; [.FB41.0020.0004.9EC3][.9EC3.0000.0000.9EC3] # KANGXI RADICAL YELLOW 2EE9 ; [.FB41.0020.0004.9EC4][.9EC4.0000.0000.9EC4] # CJK RADICAL SIMPLIFIED YELLOW 2FC9 ; [.FB41.0020.0004.9ECD][.9ECD.0000.0000.9ECD] # KANGXI RADICAL MILLET F989 ; [.FB41.0020.0002.9ECE][.9ECE.0000.0000.9ECE] # CJK COMPATIBILITY IDEOGRAPH-F989 2FCA ; [.FB41.0020.0004.9ED1][.9ED1.0000.0000.9ED1] # KANGXI RADICAL BLACK 2FA17 ; [.FB41.0020.0002.9EF9][.9EF9.0000.0000.9EF9] # CJK COMPATIBILITY IDEOGRAPH-2FA17 2FCB ; [.FB41.0020.0004.9EF9][.9EF9.0000.0000.9EF9] # KANGXI RADICAL EMBROIDERY 2FCC ; [.FB41.0020.0004.9EFD][.9EFD.0000.0000.9EFD] # KANGXI RADICAL FROG 2FA18 ; [.FB41.0020.0002.9EFE][.9EFE.0000.0000.9EFE] # CJK COMPATIBILITY IDEOGRAPH-2FA18 2EEA ; [.FB41.0020.0004.9EFE][.9EFE.0000.0000.9EFE] # CJK RADICAL C-SIMPLIFIED FROG 2FA19 ; [.FB41.0020.0002.9F05][.9F05.0000.0000.9F05] # CJK COMPATIBILITY IDEOGRAPH-2FA19 2FCD ; [.FB41.0020.0004.9F0E][.9F0E.0000.0000.9F0E] # KANGXI RADICAL TRIPOD 2FA1A ; [.FB41.0020.0002.9F0F][.9F0F.0000.0000.9F0F] # CJK COMPATIBILITY IDEOGRAPH-2FA1A 2FCE ; [.FB41.0020.0004.9F13][.9F13.0000.0000.9F13] # KANGXI RADICAL DRUM 2FA1B ; [.FB41.0020.0002.9F16][.9F16.0000.0000.9F16] # CJK COMPATIBILITY IDEOGRAPH-2FA1B 2FCF ; [.FB41.0020.0004.9F20][.9F20.0000.0000.9F20] # KANGXI RADICAL RAT 2FA1C ; [.FB41.0020.0002.9F3B][.9F3B.0000.0000.9F3B] # CJK COMPATIBILITY IDEOGRAPH-2FA1C 2FD0 ; [.FB41.0020.0004.9F3B][.9F3B.0000.0000.9F3B] # KANGXI RADICAL NOSE FAD8 ; [.FB41.0020.0002.9F43][.9F43.0000.0000.9F43] # CJK COMPATIBILITY IDEOGRAPH-FAD8 2FD1 ; [.FB41.0020.0004.9F4A][.9F4A.0000.0000.9F4A] # KANGXI RADICAL EVEN 2EEB ; [.FB41.0020.0004.9F4A][.9F4A.0000.0000.9F4A][.0000.0139.001F.2EEB] # CJK RADICAL J-SIMPLIFIED EVEN 2EEC ; [.FB41.0020.0004.9F50][.9F50.0000.0000.9F50] # CJK RADICAL C-SIMPLIFIED EVEN 2FD2 ; [.FB41.0020.0004.9F52][.9F52.0000.0000.9F52] # KANGXI RADICAL TOOTH 2EED ; [.FB41.0020.0004.9F52][.9F52.0000.0000.9F52][.0000.0139.001F.2EED] # CJK RADICAL J-SIMPLIFIED TOOTH 2EEE ; [.FB41.0020.0004.9F7F][.9F7F.0000.0000.9F7F] # CJK RADICAL C-SIMPLIFIED TOOTH F9C4 ; [.FB41.0020.0002.9F8D][.9F8D.0000.0000.9F8D] # CJK COMPATIBILITY IDEOGRAPH-F9C4 2FD3 ; [.FB41.0020.0004.9F8D][.9F8D.0000.0000.9F8D] # KANGXI RADICAL DRAGON 2EEF ; [.FB41.0020.0004.9F8D][.9F8D.0000.0000.9F8D][.0000.0139.001F.2EEF] # CJK RADICAL J-SIMPLIFIED DRAGON FAD9 ; [.FB41.0020.0002.9F8E][.9F8E.0000.0000.9F8E] # CJK COMPATIBILITY IDEOGRAPH-FAD9 2EF0 ; [.FB41.0020.0004.9F99][.9F99.0000.0000.9F99] # CJK RADICAL C-SIMPLIFIED DRAGON F907 ; [.FB41.0020.0002.9F9C][.9F9C.0000.0000.9F9C] # CJK COMPATIBILITY IDEOGRAPH-F907 F908 ; [.FB41.0020.0002.9F9C][.9F9C.0000.0000.9F9C] # CJK COMPATIBILITY IDEOGRAPH-F908 FACE ; [.FB41.0020.0002.9F9C][.9F9C.0000.0000.9F9C] # CJK COMPATIBILITY IDEOGRAPH-FACE 2FD4 ; [.FB41.0020.0004.9F9C][.9F9C.0000.0000.9F9C] # KANGXI RADICAL TURTLE 2EF1 ; [.FB41.0020.0004.9F9C][.9F9C.0000.0000.9F9C][.0000.0139.001F.2EF1] # CJK RADICAL TURTLE 2EF2 ; [.FB41.0020.0004.9F9C][.9F9C.0000.0000.9F9C][.0000.013A.001F.2EF2] # CJK RADICAL J-SIMPLIFIED TURTLE 2EF3 ; [.FB41.0020.0004.9F9F][.9F9F.0000.0000.9F9F] # CJK RADICAL C-SIMPLIFIED TURTLE 2FD5 ; [.FB41.0020.0004.9FA0][.9FA0.0000.0000.9FA0] # KANGXI RADICAL FLUTE FA0E ; [.FB41.0020.0002.FA0E][.FA0E.0000.0000.FA0E] # CJK COMPATIBILITY IDEOGRAPH-FA0E FA0F ; [.FB41.0020.0002.FA0F][.FA0F.0000.0000.FA0F] # CJK COMPATIBILITY IDEOGRAPH-FA0F FA11 ; [.FB41.0020.0002.FA11][.FA11.0000.0000.FA11] # CJK COMPATIBILITY IDEOGRAPH-FA11 FA13 ; [.FB41.0020.0002.FA13][.FA13.0000.0000.FA13] # CJK COMPATIBILITY IDEOGRAPH-FA13 FA14 ; [.FB41.0020.0002.FA14][.FA14.0000.0000.FA14] # CJK COMPATIBILITY IDEOGRAPH-FA14 FA1F ; [.FB41.0020.0002.FA1F][.FA1F.0000.0000.FA1F] # CJK COMPATIBILITY IDEOGRAPH-FA1F FA21 ; [.FB41.0020.0002.FA21][.FA21.0000.0000.FA21] # CJK COMPATIBILITY IDEOGRAPH-FA21 FA23 ; [.FB41.0020.0002.FA23][.FA23.0000.0000.FA23] # CJK COMPATIBILITY IDEOGRAPH-FA23 FA24 ; [.FB41.0020.0002.FA24][.FA24.0000.0000.FA24] # CJK COMPATIBILITY IDEOGRAPH-FA24 FA27 ; [.FB41.0020.0002.FA27][.FA27.0000.0000.FA27] # CJK COMPATIBILITY IDEOGRAPH-FA27 FA28 ; [.FB41.0020.0002.FA28][.FA28.0000.0000.FA28] # CJK COMPATIBILITY IDEOGRAPH-FA28 FA29 ; [.FB41.0020.0002.FA29][.FA29.0000.0000.FA29] # CJK COMPATIBILITY IDEOGRAPH-FA29 2F80C ; [.FB80.0020.0002.349E][.B49E.0000.0000.349E] # CJK COMPATIBILITY IDEOGRAPH-2F80C 2F813 ; [.FB80.0020.0002.34B9][.B4B9.0000.0000.34B9] # CJK COMPATIBILITY IDEOGRAPH-2F813 2F9CA ; [.FB80.0020.0002.34BB][.B4BB.0000.0000.34BB] # CJK COMPATIBILITY IDEOGRAPH-2F9CA 2F81F ; [.FB80.0020.0002.34DF][.B4DF.0000.0000.34DF] # CJK COMPATIBILITY IDEOGRAPH-2F81F 2F824 ; [.FB80.0020.0002.3515][.B515.0000.0000.3515] # CJK COMPATIBILITY IDEOGRAPH-2F824 2F867 ; [.FB80.0020.0002.36EE][.B6EE.0000.0000.36EE] # CJK COMPATIBILITY IDEOGRAPH-2F867 2F868 ; [.FB80.0020.0002.36FC][.B6FC.0000.0000.36FC] # CJK COMPATIBILITY IDEOGRAPH-2F868 2F876 ; [.FB80.0020.0002.3781][.B781.0000.0000.3781] # CJK COMPATIBILITY IDEOGRAPH-2F876 2F883 ; [.FB80.0020.0002.382F][.B82F.0000.0000.382F] # CJK COMPATIBILITY IDEOGRAPH-2F883 2F888 ; [.FB80.0020.0002.3862][.B862.0000.0000.3862] # CJK COMPATIBILITY IDEOGRAPH-2F888 2F88A ; [.FB80.0020.0002.387C][.B87C.0000.0000.387C] # CJK COMPATIBILITY IDEOGRAPH-2F88A 2F896 ; [.FB80.0020.0002.38C7][.B8C7.0000.0000.38C7] # CJK COMPATIBILITY IDEOGRAPH-2F896 2F89B ; [.FB80.0020.0002.38E3][.B8E3.0000.0000.38E3] # CJK COMPATIBILITY IDEOGRAPH-2F89B 2F8A2 ; [.FB80.0020.0002.391C][.B91C.0000.0000.391C] # CJK COMPATIBILITY IDEOGRAPH-2F8A2 2F8A1 ; [.FB80.0020.0002.393A][.B93A.0000.0000.393A] # CJK COMPATIBILITY IDEOGRAPH-2F8A1 2F8C2 ; [.FB80.0020.0002.3A2E][.BA2E.0000.0000.3A2E] # CJK COMPATIBILITY IDEOGRAPH-2F8C2 2F8C7 ; [.FB80.0020.0002.3A6C][.BA6C.0000.0000.3A6C] # CJK COMPATIBILITY IDEOGRAPH-2F8C7 2F8D1 ; [.FB80.0020.0002.3AE4][.BAE4.0000.0000.3AE4] # CJK COMPATIBILITY IDEOGRAPH-2F8D1 2F8D0 ; [.FB80.0020.0002.3B08][.BB08.0000.0000.3B08] # CJK COMPATIBILITY IDEOGRAPH-2F8D0 2F8CE ; [.FB80.0020.0002.3B19][.BB19.0000.0000.3B19] # CJK COMPATIBILITY IDEOGRAPH-2F8CE 2F8DE ; [.FB80.0020.0002.3B49][.BB49.0000.0000.3B49] # CJK COMPATIBILITY IDEOGRAPH-2F8DE FAD2 ; [.FB80.0020.0002.3B9D][.BB9D.0000.0000.3B9D] # CJK COMPATIBILITY IDEOGRAPH-FAD2 2F8E7 ; [.FB80.0020.0002.3B9D][.BB9D.0000.0000.3B9D] # CJK COMPATIBILITY IDEOGRAPH-2F8E7 2F8EE ; [.FB80.0020.0002.3C18][.BC18.0000.0000.3C18] # CJK COMPATIBILITY IDEOGRAPH-2F8EE 2F8F2 ; [.FB80.0020.0002.3C4E][.BC4E.0000.0000.3C4E] # CJK COMPATIBILITY IDEOGRAPH-2F8F2 2F90A ; [.FB80.0020.0002.3D33][.BD33.0000.0000.3D33] # CJK COMPATIBILITY IDEOGRAPH-2F90A 2F916 ; [.FB80.0020.0002.3D96][.BD96.0000.0000.3D96] # CJK COMPATIBILITY IDEOGRAPH-2F916 2F92A ; [.FB80.0020.0002.3EAC][.BEAC.0000.0000.3EAC] # CJK COMPATIBILITY IDEOGRAPH-2F92A 2F92C ; [.FB80.0020.0002.3EB8][.BEB8.0000.0000.3EB8] # CJK COMPATIBILITY IDEOGRAPH-2F92C 2F92D ; [.FB80.0020.0002.3EB8][.BEB8.0000.0000.3EB8] # CJK COMPATIBILITY IDEOGRAPH-2F92D 2F933 ; [.FB80.0020.0002.3F1B][.BF1B.0000.0000.3F1B] # CJK COMPATIBILITY IDEOGRAPH-2F933 2F93E ; [.FB80.0020.0002.3FFC][.BFFC.0000.0000.3FFC] # CJK COMPATIBILITY IDEOGRAPH-2F93E 2F93F ; [.FB80.0020.0002.4008][.C008.0000.0000.4008] # CJK COMPATIBILITY IDEOGRAPH-2F93F FAD3 ; [.FB80.0020.0002.4018][.C018.0000.0000.4018] # CJK COMPATIBILITY IDEOGRAPH-FAD3 FAD4 ; [.FB80.0020.0002.4039][.C039.0000.0000.4039] # CJK COMPATIBILITY IDEOGRAPH-FAD4 2F949 ; [.FB80.0020.0002.4039][.C039.0000.0000.4039] # CJK COMPATIBILITY IDEOGRAPH-2F949 2F94B ; [.FB80.0020.0002.4046][.C046.0000.0000.4046] # CJK COMPATIBILITY IDEOGRAPH-2F94B 2F94C ; [.FB80.0020.0002.4096][.C096.0000.0000.4096] # CJK COMPATIBILITY IDEOGRAPH-2F94C 2F951 ; [.FB80.0020.0002.40E3][.C0E3.0000.0000.40E3] # CJK COMPATIBILITY IDEOGRAPH-2F951 2F958 ; [.FB80.0020.0002.412F][.C12F.0000.0000.412F] # CJK COMPATIBILITY IDEOGRAPH-2F958 2F960 ; [.FB80.0020.0002.4202][.C202.0000.0000.4202] # CJK COMPATIBILITY IDEOGRAPH-2F960 2F964 ; [.FB80.0020.0002.4227][.C227.0000.0000.4227] # CJK COMPATIBILITY IDEOGRAPH-2F964 2F967 ; [.FB80.0020.0002.42A0][.C2A0.0000.0000.42A0] # CJK COMPATIBILITY IDEOGRAPH-2F967 2F96D ; [.FB80.0020.0002.4301][.C301.0000.0000.4301] # CJK COMPATIBILITY IDEOGRAPH-2F96D 2F971 ; [.FB80.0020.0002.4334][.C334.0000.0000.4334] # CJK COMPATIBILITY IDEOGRAPH-2F971 2F974 ; [.FB80.0020.0002.4359][.C359.0000.0000.4359] # CJK COMPATIBILITY IDEOGRAPH-2F974 2F981 ; [.FB80.0020.0002.43D5][.C3D5.0000.0000.43D5] # CJK COMPATIBILITY IDEOGRAPH-2F981 2F8D7 ; [.FB80.0020.0002.43D9][.C3D9.0000.0000.43D9] # CJK COMPATIBILITY IDEOGRAPH-2F8D7 2F984 ; [.FB80.0020.0002.440B][.C40B.0000.0000.440B] # CJK COMPATIBILITY IDEOGRAPH-2F984 2F98E ; [.FB80.0020.0002.446B][.C46B.0000.0000.446B] # CJK COMPATIBILITY IDEOGRAPH-2F98E 2F9A7 ; [.FB80.0020.0002.452B][.C52B.0000.0000.452B] # CJK COMPATIBILITY IDEOGRAPH-2F9A7 2F9AE ; [.FB80.0020.0002.455D][.C55D.0000.0000.455D] # CJK COMPATIBILITY IDEOGRAPH-2F9AE 2F9AF ; [.FB80.0020.0002.4561][.C561.0000.0000.4561] # CJK COMPATIBILITY IDEOGRAPH-2F9AF 2F9B2 ; [.FB80.0020.0002.456B][.C56B.0000.0000.456B] # CJK COMPATIBILITY IDEOGRAPH-2F9B2 2F9BF ; [.FB80.0020.0002.45D7][.C5D7.0000.0000.45D7] # CJK COMPATIBILITY IDEOGRAPH-2F9BF 2F9C2 ; [.FB80.0020.0002.45F9][.C5F9.0000.0000.45F9] # CJK COMPATIBILITY IDEOGRAPH-2F9C2 2F9C8 ; [.FB80.0020.0002.4635][.C635.0000.0000.4635] # CJK COMPATIBILITY IDEOGRAPH-2F9C8 2F9CD ; [.FB80.0020.0002.46BE][.C6BE.0000.0000.46BE] # CJK COMPATIBILITY IDEOGRAPH-2F9CD 2F9CE ; [.FB80.0020.0002.46C7][.C6C7.0000.0000.46C7] # CJK COMPATIBILITY IDEOGRAPH-2F9CE 2F9EF ; [.FB80.0020.0002.4995][.C995.0000.0000.4995] # CJK COMPATIBILITY IDEOGRAPH-2F9EF 2F9F2 ; [.FB80.0020.0002.49E6][.C9E6.0000.0000.49E6] # CJK COMPATIBILITY IDEOGRAPH-2F9F2 2F9F8 ; [.FB80.0020.0002.4A6E][.CA6E.0000.0000.4A6E] # CJK COMPATIBILITY IDEOGRAPH-2F9F8 2F9F9 ; [.FB80.0020.0002.4A76][.CA76.0000.0000.4A76] # CJK COMPATIBILITY IDEOGRAPH-2F9F9 2F9FC ; [.FB80.0020.0002.4AB2][.CAB2.0000.0000.4AB2] # CJK COMPATIBILITY IDEOGRAPH-2F9FC 2FA03 ; [.FB80.0020.0002.4B33][.CB33.0000.0000.4B33] # CJK COMPATIBILITY IDEOGRAPH-2FA03 2FA08 ; [.FB80.0020.0002.4BCE][.CBCE.0000.0000.4BCE] # CJK COMPATIBILITY IDEOGRAPH-2FA08 2FA0D ; [.FB80.0020.0002.4CCE][.CCCE.0000.0000.4CCE] # CJK COMPATIBILITY IDEOGRAPH-2FA0D 2FA0E ; [.FB80.0020.0002.4CED][.CCED.0000.0000.4CED] # CJK COMPATIBILITY IDEOGRAPH-2FA0E 2FA11 ; [.FB80.0020.0002.4CF8][.CCF8.0000.0000.4CF8] # CJK COMPATIBILITY IDEOGRAPH-2FA11 2FA16 ; [.FB80.0020.0002.4D56][.CD56.0000.0000.4D56] # CJK COMPATIBILITY IDEOGRAPH-2FA16 2F803 ; [.FB84.0020.0002.20122][.8122.0000.0000.20122] # CJK COMPATIBILITY IDEOGRAPH-2F803 2F812 ; [.FB84.0020.0002.2051C][.851C.0000.0000.2051C] # CJK COMPATIBILITY IDEOGRAPH-2F812 2F91B ; [.FB84.0020.0002.20525][.8525.0000.0000.20525] # CJK COMPATIBILITY IDEOGRAPH-2F91B 2F816 ; [.FB84.0020.0002.2054B][.854B.0000.0000.2054B] # CJK COMPATIBILITY IDEOGRAPH-2F816 2F80D ; [.FB84.0020.0002.2063A][.863A.0000.0000.2063A] # CJK COMPATIBILITY IDEOGRAPH-2F80D 2F9D9 ; [.FB84.0020.0002.20804][.8804.0000.0000.20804] # CJK COMPATIBILITY IDEOGRAPH-2F9D9 2F9DD ; [.FB84.0020.0002.208DE][.88DE.0000.0000.208DE] # CJK COMPATIBILITY IDEOGRAPH-2F9DD 2F834 ; [.FB84.0020.0002.20A2C][.8A2C.0000.0000.20A2C] # CJK COMPATIBILITY IDEOGRAPH-2F834 2F838 ; [.FB84.0020.0002.20B63][.8B63.0000.0000.20B63] # CJK COMPATIBILITY IDEOGRAPH-2F838 2F859 ; [.FB84.0020.0002.214E4][.94E4.0000.0000.214E4] # CJK COMPATIBILITY IDEOGRAPH-2F859 2F860 ; [.FB84.0020.0002.216A8][.96A8.0000.0000.216A8] # CJK COMPATIBILITY IDEOGRAPH-2F860 2F861 ; [.FB84.0020.0002.216EA][.96EA.0000.0000.216EA] # CJK COMPATIBILITY IDEOGRAPH-2F861 2F86C ; [.FB84.0020.0002.219C8][.99C8.0000.0000.219C8] # CJK COMPATIBILITY IDEOGRAPH-2F86C 2F871 ; [.FB84.0020.0002.21B18][.9B18.0000.0000.21B18] # CJK COMPATIBILITY IDEOGRAPH-2F871 2F8F8 ; [.FB84.0020.0002.21D0B][.9D0B.0000.0000.21D0B] # CJK COMPATIBILITY IDEOGRAPH-2F8F8 2F87B ; [.FB84.0020.0002.21DE4][.9DE4.0000.0000.21DE4] # CJK COMPATIBILITY IDEOGRAPH-2F87B 2F87D ; [.FB84.0020.0002.21DE6][.9DE6.0000.0000.21DE6] # CJK COMPATIBILITY IDEOGRAPH-2F87D 2F889 ; [.FB84.0020.0002.22183][.A183.0000.0000.22183] # CJK COMPATIBILITY IDEOGRAPH-2F889 2F939 ; [.FB84.0020.0002.2219F][.A19F.0000.0000.2219F] # CJK COMPATIBILITY IDEOGRAPH-2F939 2F891 ; [.FB84.0020.0002.22331][.A331.0000.0000.22331] # CJK COMPATIBILITY IDEOGRAPH-2F891 2F892 ; [.FB84.0020.0002.22331][.A331.0000.0000.22331] # CJK COMPATIBILITY IDEOGRAPH-2F892 2F8A4 ; [.FB84.0020.0002.226D4][.A6D4.0000.0000.226D4] # CJK COMPATIBILITY IDEOGRAPH-2F8A4 FAD0 ; [.FB84.0020.0002.22844][.A844.0000.0000.22844] # CJK COMPATIBILITY IDEOGRAPH-FAD0 FACF ; [.FB84.0020.0002.2284A][.A84A.0000.0000.2284A] # CJK COMPATIBILITY IDEOGRAPH-FACF 2F8B8 ; [.FB84.0020.0002.22B0C][.AB0C.0000.0000.22B0C] # CJK COMPATIBILITY IDEOGRAPH-2F8B8 2F8BE ; [.FB84.0020.0002.22BF1][.ABF1.0000.0000.22BF1] # CJK COMPATIBILITY IDEOGRAPH-2F8BE 2F8CA ; [.FB84.0020.0002.2300A][.B00A.0000.0000.2300A] # CJK COMPATIBILITY IDEOGRAPH-2F8CA 2F897 ; [.FB84.0020.0002.232B8][.B2B8.0000.0000.232B8] # CJK COMPATIBILITY IDEOGRAPH-2F897 2F980 ; [.FB84.0020.0002.2335F][.B35F.0000.0000.2335F] # CJK COMPATIBILITY IDEOGRAPH-2F980 2F989 ; [.FB84.0020.0002.23393][.B393.0000.0000.23393] # CJK COMPATIBILITY IDEOGRAPH-2F989 2F98A ; [.FB84.0020.0002.2339C][.B39C.0000.0000.2339C] # CJK COMPATIBILITY IDEOGRAPH-2F98A 2F8DD ; [.FB84.0020.0002.233C3][.B3C3.0000.0000.233C3] # CJK COMPATIBILITY IDEOGRAPH-2F8DD FAD1 ; [.FB84.0020.0002.233D5][.B3D5.0000.0000.233D5] # CJK COMPATIBILITY IDEOGRAPH-FAD1 2F8E3 ; [.FB84.0020.0002.2346D][.B46D.0000.0000.2346D] # CJK COMPATIBILITY IDEOGRAPH-2F8E3 2F8EC ; [.FB84.0020.0002.236A3][.B6A3.0000.0000.236A3] # CJK COMPATIBILITY IDEOGRAPH-2F8EC 2F8F0 ; [.FB84.0020.0002.238A7][.B8A7.0000.0000.238A7] # CJK COMPATIBILITY IDEOGRAPH-2F8F0 2F8F7 ; [.FB84.0020.0002.23A8D][.BA8D.0000.0000.23A8D] # CJK COMPATIBILITY IDEOGRAPH-2F8F7 2F8F9 ; [.FB84.0020.0002.23AFA][.BAFA.0000.0000.23AFA] # CJK COMPATIBILITY IDEOGRAPH-2F8F9 2F8FB ; [.FB84.0020.0002.23CBC][.BCBC.0000.0000.23CBC] # CJK COMPATIBILITY IDEOGRAPH-2F8FB 2F906 ; [.FB84.0020.0002.23D1E][.BD1E.0000.0000.23D1E] # CJK COMPATIBILITY IDEOGRAPH-2F906 2F90D ; [.FB84.0020.0002.23ED1][.BED1.0000.0000.23ED1] # CJK COMPATIBILITY IDEOGRAPH-2F90D 2F910 ; [.FB84.0020.0002.23F5E][.BF5E.0000.0000.23F5E] # CJK COMPATIBILITY IDEOGRAPH-2F910 2F911 ; [.FB84.0020.0002.23F8E][.BF8E.0000.0000.23F8E] # CJK COMPATIBILITY IDEOGRAPH-2F911 2F91D ; [.FB84.0020.0002.24263][.C263.0000.0000.24263] # CJK COMPATIBILITY IDEOGRAPH-2F91D FA6C ; [.FB84.0020.0002.242EE][.C2EE.0000.0000.242EE] # CJK COMPATIBILITY IDEOGRAPH-FA6C 2F91F ; [.FB84.0020.0002.243AB][.C3AB.0000.0000.243AB] # CJK COMPATIBILITY IDEOGRAPH-2F91F 2F923 ; [.FB84.0020.0002.24608][.C608.0000.0000.24608] # CJK COMPATIBILITY IDEOGRAPH-2F923 2F926 ; [.FB84.0020.0002.24735][.C735.0000.0000.24735] # CJK COMPATIBILITY IDEOGRAPH-2F926 2F927 ; [.FB84.0020.0002.24814][.C814.0000.0000.24814] # CJK COMPATIBILITY IDEOGRAPH-2F927 2F935 ; [.FB84.0020.0002.24C36][.CC36.0000.0000.24C36] # CJK COMPATIBILITY IDEOGRAPH-2F935 2F937 ; [.FB84.0020.0002.24C92][.CC92.0000.0000.24C92] # CJK COMPATIBILITY IDEOGRAPH-2F937 2F93B ; [.FB84.0020.0002.24FA1][.CFA1.0000.0000.24FA1] # CJK COMPATIBILITY IDEOGRAPH-2F93B 2F93C ; [.FB84.0020.0002.24FB8][.CFB8.0000.0000.24FB8] # CJK COMPATIBILITY IDEOGRAPH-2F93C 2F93D ; [.FB84.0020.0002.25044][.D044.0000.0000.25044] # CJK COMPATIBILITY IDEOGRAPH-2F93D 2F942 ; [.FB84.0020.0002.250F2][.D0F2.0000.0000.250F2] # CJK COMPATIBILITY IDEOGRAPH-2F942 2F941 ; [.FB84.0020.0002.250F3][.D0F3.0000.0000.250F3] # CJK COMPATIBILITY IDEOGRAPH-2F941 2F943 ; [.FB84.0020.0002.25119][.D119.0000.0000.25119] # CJK COMPATIBILITY IDEOGRAPH-2F943 2F944 ; [.FB84.0020.0002.25133][.D133.0000.0000.25133] # CJK COMPATIBILITY IDEOGRAPH-2F944 FAD5 ; [.FB84.0020.0002.25249][.D249.0000.0000.25249] # CJK COMPATIBILITY IDEOGRAPH-FAD5 2F94D ; [.FB84.0020.0002.2541D][.D41D.0000.0000.2541D] # CJK COMPATIBILITY IDEOGRAPH-2F94D 2F952 ; [.FB84.0020.0002.25626][.D626.0000.0000.25626] # CJK COMPATIBILITY IDEOGRAPH-2F952 2F954 ; [.FB84.0020.0002.2569A][.D69A.0000.0000.2569A] # CJK COMPATIBILITY IDEOGRAPH-2F954 2F955 ; [.FB84.0020.0002.256C5][.D6C5.0000.0000.256C5] # CJK COMPATIBILITY IDEOGRAPH-2F955 2F95C ; [.FB84.0020.0002.2597C][.D97C.0000.0000.2597C] # CJK COMPATIBILITY IDEOGRAPH-2F95C 2F95D ; [.FB84.0020.0002.25AA7][.DAA7.0000.0000.25AA7] # CJK COMPATIBILITY IDEOGRAPH-2F95D 2F95E ; [.FB84.0020.0002.25AA7][.DAA7.0000.0000.25AA7] # CJK COMPATIBILITY IDEOGRAPH-2F95E 2F961 ; [.FB84.0020.0002.25BAB][.DBAB.0000.0000.25BAB] # CJK COMPATIBILITY IDEOGRAPH-2F961 2F965 ; [.FB84.0020.0002.25C80][.DC80.0000.0000.25C80] # CJK COMPATIBILITY IDEOGRAPH-2F965 FAD6 ; [.FB84.0020.0002.25CD0][.DCD0.0000.0000.25CD0] # CJK COMPATIBILITY IDEOGRAPH-FAD6 2F96B ; [.FB84.0020.0002.25F86][.DF86.0000.0000.25F86] # CJK COMPATIBILITY IDEOGRAPH-2F96B 2F898 ; [.FB84.0020.0002.261DA][.E1DA.0000.0000.261DA] # CJK COMPATIBILITY IDEOGRAPH-2F898 2F972 ; [.FB84.0020.0002.26228][.E228.0000.0000.26228] # CJK COMPATIBILITY IDEOGRAPH-2F972 2F973 ; [.FB84.0020.0002.26247][.E247.0000.0000.26247] # CJK COMPATIBILITY IDEOGRAPH-2F973 2F975 ; [.FB84.0020.0002.262D9][.E2D9.0000.0000.262D9] # CJK COMPATIBILITY IDEOGRAPH-2F975 2F977 ; [.FB84.0020.0002.2633E][.E33E.0000.0000.2633E] # CJK COMPATIBILITY IDEOGRAPH-2F977 2F97B ; [.FB84.0020.0002.264DA][.E4DA.0000.0000.264DA] # CJK COMPATIBILITY IDEOGRAPH-2F97B 2F97C ; [.FB84.0020.0002.26523][.E523.0000.0000.26523] # CJK COMPATIBILITY IDEOGRAPH-2F97C 2F97E ; [.FB84.0020.0002.265A8][.E5A8.0000.0000.265A8] # CJK COMPATIBILITY IDEOGRAPH-2F97E 2F987 ; [.FB84.0020.0002.267A7][.E7A7.0000.0000.267A7] # CJK COMPATIBILITY IDEOGRAPH-2F987 2F988 ; [.FB84.0020.0002.267B5][.E7B5.0000.0000.267B5] # CJK COMPATIBILITY IDEOGRAPH-2F988 2F997 ; [.FB84.0020.0002.26B3C][.EB3C.0000.0000.26B3C] # CJK COMPATIBILITY IDEOGRAPH-2F997 2F9A4 ; [.FB84.0020.0002.26C36][.EC36.0000.0000.26C36] # CJK COMPATIBILITY IDEOGRAPH-2F9A4 2F9A6 ; [.FB84.0020.0002.26CD5][.ECD5.0000.0000.26CD5] # CJK COMPATIBILITY IDEOGRAPH-2F9A6 2F9A5 ; [.FB84.0020.0002.26D6B][.ED6B.0000.0000.26D6B] # CJK COMPATIBILITY IDEOGRAPH-2F9A5 2F9AD ; [.FB84.0020.0002.26F2C][.EF2C.0000.0000.26F2C] # CJK COMPATIBILITY IDEOGRAPH-2F9AD 2F9B0 ; [.FB84.0020.0002.26FB1][.EFB1.0000.0000.26FB1] # CJK COMPATIBILITY IDEOGRAPH-2F9B0 2F9B1 ; [.FB84.0020.0002.270D2][.F0D2.0000.0000.270D2] # CJK COMPATIBILITY IDEOGRAPH-2F9B1 2F9AB ; [.FB84.0020.0002.273CA][.F3CA.0000.0000.273CA] # CJK COMPATIBILITY IDEOGRAPH-2F9AB 2F9C5 ; [.FB84.0020.0002.27667][.F667.0000.0000.27667] # CJK COMPATIBILITY IDEOGRAPH-2F9C5 2F9CB ; [.FB84.0020.0002.278AE][.F8AE.0000.0000.278AE] # CJK COMPATIBILITY IDEOGRAPH-2F9CB 2F9CC ; [.FB84.0020.0002.27966][.F966.0000.0000.27966] # CJK COMPATIBILITY IDEOGRAPH-2F9CC 2F9D3 ; [.FB84.0020.0002.27CA8][.FCA8.0000.0000.27CA8] # CJK COMPATIBILITY IDEOGRAPH-2F9D3 FAD7 ; [.FB84.0020.0002.27ED3][.FED3.0000.0000.27ED3] # CJK COMPATIBILITY IDEOGRAPH-FAD7 2F9D8 ; [.FB84.0020.0002.27F2F][.FF2F.0000.0000.27F2F] # CJK COMPATIBILITY IDEOGRAPH-2F9D8 2F9E0 ; [.FB85.0020.0002.285D2][.85D2.0000.0000.285D2] # CJK COMPATIBILITY IDEOGRAPH-2F9E0 2F9E1 ; [.FB85.0020.0002.285ED][.85ED.0000.0000.285ED] # CJK COMPATIBILITY IDEOGRAPH-2F9E1 2F9E5 ; [.FB85.0020.0002.2872E][.872E.0000.0000.2872E] # CJK COMPATIBILITY IDEOGRAPH-2F9E5 2F9ED ; [.FB85.0020.0002.28BFA][.8BFA.0000.0000.28BFA] # CJK COMPATIBILITY IDEOGRAPH-2F9ED 2F9F1 ; [.FB85.0020.0002.28D77][.8D77.0000.0000.28D77] # CJK COMPATIBILITY IDEOGRAPH-2F9F1 2F9F6 ; [.FB85.0020.0002.29145][.9145.0000.0000.29145] # CJK COMPATIBILITY IDEOGRAPH-2F9F6 2F81C ; [.FB85.0020.0002.291DF][.91DF.0000.0000.291DF] # CJK COMPATIBILITY IDEOGRAPH-2F81C 2F9F7 ; [.FB85.0020.0002.2921A][.921A.0000.0000.2921A] # CJK COMPATIBILITY IDEOGRAPH-2F9F7 2F9FB ; [.FB85.0020.0002.2940A][.940A.0000.0000.2940A] # CJK COMPATIBILITY IDEOGRAPH-2F9FB 2F9FD ; [.FB85.0020.0002.29496][.9496.0000.0000.29496] # CJK COMPATIBILITY IDEOGRAPH-2F9FD 2FA01 ; [.FB85.0020.0002.295B6][.95B6.0000.0000.295B6] # CJK COMPATIBILITY IDEOGRAPH-2FA01 2FA09 ; [.FB85.0020.0002.29B30][.9B30.0000.0000.29B30] # CJK COMPATIBILITY IDEOGRAPH-2FA09 2FA10 ; [.FB85.0020.0002.2A0CE][.A0CE.0000.0000.2A0CE] # CJK COMPATIBILITY IDEOGRAPH-2FA10 2FA12 ; [.FB85.0020.0002.2A105][.A105.0000.0000.2A105] # CJK COMPATIBILITY IDEOGRAPH-2FA12 2FA13 ; [.FB85.0020.0002.2A20E][.A20E.0000.0000.2A20E] # CJK COMPATIBILITY IDEOGRAPH-2FA13 2FA14 ; [.FB85.0020.0002.2A291][.A291.0000.0000.2A291] # CJK COMPATIBILITY IDEOGRAPH-2FA14 2F88F ; [.FB85.0020.0002.2A392][.A392.0000.0000.2A392] # CJK COMPATIBILITY IDEOGRAPH-2F88F 2FA1D ; [.FB85.0020.0002.2A600][.A600.0000.0000.2A600] # CJK COMPATIBILITY IDEOGRAPH-2FA1D ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/markmin/�����������������������������������������������������������0000775�0000000�0000000�00000000000�12564727262�016705� 5����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/markmin/markmin2latex.py�������������������������������������������0000775�0000000�0000000�00000026361�12564727262�022050� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # created my Massimo Di Pierro # license MIT/BSD/GPL import re import cgi import sys import doctest from optparse import OptionParser __all__ = ['render','markmin2latex'] META = 'META' regex_newlines = re.compile('(\n\r)|(\r\n)') regex_dd=re.compile('\$\$(?P<latex>.*?)\$\$') regex_code = re.compile('('+META+')|(``(?P<t>.*?)``(:(?P<c>\w+))?)',re.S) regex_title = re.compile('^#{1} (?P<t>[^\n]+)',re.M) regex_maps = [ (re.compile('[ \t\r]+\n'),'\n'), (re.compile('\*\*(?P<t>[^\s\*]+( +[^\s\*]+)*)\*\*'),'{\\\\bf \g<t>}'), (re.compile("''(?P<t>[^\s']+( +[^\s']+)*)''"),'{\\it \g<t>}'), (re.compile('^#{5,6}\s*(?P<t>[^\n]+)',re.M),'\n\n{\\\\bf \g<t>}\n'), (re.compile('^#{4}\s*(?P<t>[^\n]+)',re.M),'\n\n\\\\goodbreak\\subsubsection{\g<t>}\n'), (re.compile('^#{3}\s*(?P<t>[^\n]+)',re.M),'\n\n\\\\goodbreak\\subsection{\g<t>}\n'), (re.compile('^#{2}\s*(?P<t>[^\n]+)',re.M),'\n\n\\\\goodbreak\\section{\g<t>}\n'), (re.compile('^#{1}\s*(?P<t>[^\n]+)',re.M),''), (re.compile('^\- +(?P<t>.*)',re.M),'\\\\begin{itemize}\n\\item \g<t>\n\\end{itemize}'), (re.compile('^\+ +(?P<t>.*)',re.M),'\\\\begin{itemize}\n\\item \g<t>\n\\end{itemize}'), (re.compile('\\\\end\{itemize\}\s+\\\\begin\{itemize\}'),'\n'), (re.compile('\n\s+\n'),'\n\n')] regex_table = re.compile('^\-{4,}\n(?P<t>.*?)\n\-{4,}(:(?P<c>\w+))?\n',re.M|re.S) regex_anchor = re.compile('\[\[(?P<t>\S+)\]\]') regex_bibitem = re.compile('\-\s*\[\[(?P<t>\S+)\]\]') regex_image_width = re.compile('\[\[(?P<t>[^\]]*?) +(?P<k>\S+) +(?P<p>left|right|center) +(?P<w>\d+px)\]\]') regex_image = re.compile('\[\[(?P<t>[^\]]*?) +(?P<k>\S+) +(?P<p>left|right|center)\]\]') #regex_video = re.compile('\[\[(?P<t>[^\]]*?) +(?P<k>\S+) +video\]\]') #regex_audio = re.compile('\[\[(?P<t>[^\]]*?) +(?P<k>\S+) +audio\]\]') regex_link = re.compile('\[\[(?P<t>[^\]]*?) +(?P<k>\S+)\]\]') regex_auto = re.compile('(?<!["\w])(?P<k>\w+://[\w\.\-\?&%\:]+)',re.M) regex_commas = re.compile('[ ]+(?P<t>[,;\.])') regex_noindent = re.compile('\n\n(?P<t>[a-z])') #regex_quote_left = re.compile('"(?=\w)') #regex_quote_right = re.compile('(?=\w\.)"') def latex_escape(text,pound=True): text=text.replace('\\','{\\textbackslash}') for c in '^_&$%{}': text=text.replace(c,'\\'+c) text=text.replace('\\{\\textbackslash\\}','{\\textbackslash}') if pound: text=text.replace('#','\\#') return text def render(text, extra={}, allowed={}, sep='p', image_mapper=lambda x:x, chapters=False): ############################################################# # replace all blocks marked with ``...``:class with META # store them into segments they will be treated as code ############################################################# text = str(text or '') segments, i = [], 0 text = regex_dd.sub('``\g<latex>``:latex ',text) text = regex_newlines.sub('\n',text) while True: item = regex_code.search(text,i) if not item: break if item.group()==META: segments.append((None,None)) text = text[:item.start()]+META+text[item.end():] else: c = item.group('c') or '' if 'code' in allowed and not c in allowed['code']: c = '' code = item.group('t').replace('!`!','`') segments.append((code,c)) text = text[:item.start()]+META+text[item.end():] i=item.start()+3 ############################################################# # do h1,h2,h3,h4,h5,h6,b,i,ol,ul and normalize spaces ############################################################# title = regex_title.search(text) if not title: title='Title' else: title=title.group('t') text = latex_escape(text,pound=False) texts = text.split('## References',1) text = regex_anchor.sub('\\label{\g<t>}', texts[0]) if len(texts)==2: text += '\n\\begin{thebibliography}{999}\n' text += regex_bibitem.sub('\n\\\\bibitem{\g<t>}', texts[1]) text += '\n\\end{thebibliography}\n' text = '\n'.join(t.strip() for t in text.split('\n')) for regex, sub in regex_maps: text = regex.sub(sub,text) text=text.replace('#','\\#') text=text.replace('`',"'") ############################################################# # process tables and blockquotes ############################################################# while True: item = regex_table.search(text) if not item: break c = item.group('c') or '' if 'table' in allowed and not c in allowed['table']: c = '' content = item.group('t') if ' | ' in content: rows = content.replace('\n','\\\\\n').replace(' | ',' & ') row0,row2 = rows.split('\\\\\n',1) cols=row0.count(' & ')+1 cal='{'+''.join('l' for j in range(cols))+'}' tabular = '\\begin{center}\n{\\begin{tabular}'+cal+'\\hline\n' + row0+'\\\\ \\hline\n'+row2 + ' \\\\ \\hline\n\\end{tabular}}\n\\end{center}' if row2.count('\n')>20: tabular='\\newpage\n'+tabular text = text[:item.start()] + tabular + text[item.end():] else: text = text[:item.start()] + '\\begin{quote}' + content + '\\end{quote}' + text[item.end():] ############################################################# # deal with images, videos, audios and links ############################################################# def sub(x): f=image_mapper(x.group('k')) if not f: return None return '\n\\begin{center}\\includegraphics[width=8cm]{%s}\\end{center}\n' % (f) text = regex_image_width.sub(sub,text) text = regex_image.sub(sub,text) text = regex_link.sub('{\\\\footnotesize\\href{\g<k>}{\g<t>}}', text) text = regex_commas.sub('\g<t>',text) text = regex_noindent.sub('\n\\\\noindent \g<t>',text) ### fix paths in images regex=re.compile('\\\\_\w*\.(eps|png|jpg|gif)') while True: match=regex.search(text) if not match: break text=text[:match.start()]+text[match.start()+1:] #text = regex_quote_left.sub('``',text) #text = regex_quote_right.sub("''",text) if chapters: text=text.replace(r'\section*{',r'\chapter*{') text=text.replace(r'\section{',r'\chapter{') text=text.replace(r'subsection{',r'section{') ############################################################# # process all code text ############################################################# parts = text.split(META) text = parts[0] authors = [] for i,(code,b) in enumerate(segments): if code==None: html = META else: if b=='hidden': html='' elif b=='author': author = latex_escape(code.strip()) authors.append(author) html='' elif b=='inxx': html='\inxx{%s}' % latex_escape(code) elif b=='cite': html='~\cite{%s}' % latex_escape(code.strip()) elif b=='ref': html='~\ref{%s}' % latex_escape(code.strip()) elif b=='latex': if '\n' in code: html='\n\\begin{equation}\n%s\n\\end{equation}\n' % code.strip() else: html='$%s$' % code.strip() elif b=='latex_eqnarray': code=code.strip() code='\\\\'.join(x.replace('=','&=&',1) for x in code.split('\\\\')) html='\n\\begin{eqnarray}\n%s\n\\end{eqnarray}\n' % code elif b.startswith('latex_'): key=b[6:] html='\\begin{%s}%s\\end{%s}' % (key,code,key) elif b in extra: if code[:1]=='\n': code=code[1:] if code[-1:]=='\n': code=code[:-1] html = extra[b](code) elif code[:1]=='\n' or code[:-1]=='\n': if code[:1]=='\n': code=code[1:] if code[-1:]=='\n': code=code[:-1] if code.startswith('<') or code.startswith('{{') or code.startswith('http'): html = '\\begin{lstlisting}[keywords={}]\n%s\n\\end{lstlisting}' % code else: html = '\\begin{lstlisting}\n%s\n\\end{lstlisting}' % code else: if code[:1]=='\n': code=code[1:] if code[-1:]=='\n': code=code[:-1] html = '{\\ft %s}' % latex_escape(code) try: text = text+html+parts[i+1] except: text = text + '... WIKI PROCESSING ERROR ...' break text = text.replace(' ~\\cite','~\\cite') return text, title, authors WRAPPER = """ \\documentclass[12pt]{article} \\usepackage{hyperref} \\usepackage{listings} \\usepackage{upquote} \\usepackage{color} \\usepackage{graphicx} \\usepackage{grffile} \\usepackage[utf8x]{inputenc} \\definecolor{lg}{rgb}{0.9,0.9,0.9} \\definecolor{dg}{rgb}{0.3,0.3,0.3} \\def\\ft{\\small\\tt} \\lstset{ basicstyle=\\footnotesize, breaklines=true, basicstyle=\\ttfamily\\color{black}\\footnotesize, keywordstyle=\\bf\\ttfamily, commentstyle=\\it\\ttfamily, stringstyle=\\color{dg}\\it\\ttfamily, numbers=left, numberstyle=\\color{dg}\\tiny, stepnumber=1, numbersep=5pt, backgroundcolor=\\color{lg}, tabsize=4, showspaces=false, showstringspaces=false } \\title{%(title)s} \\author{%(author)s} \\begin{document} \\maketitle \\tableofcontents \\newpage %(body)s \\end{document} """ def markmin2latex(data, image_mapper=lambda x:x, extra={}, wrapper=WRAPPER): body, title, authors = render(data, extra=extra, image_mapper=image_mapper) author = '\n\\and\n'.join(a.replace('\n','\\\\\n\\footnotesize ') for a in authors) return wrapper % dict(title=title, author=author, body=body) if __name__ == '__main__': parser = OptionParser() parser.add_option("-i", "--info", dest="info", help="markmin help") parser.add_option("-t", "--test", dest="test", action="store_true", default=False) parser.add_option("-n", "--no_wrapper", dest="no_wrapper", action="store_true",default=False) parser.add_option("-c", "--chapters", dest="chapters",action="store_true", default=False,help="switch section for chapter") parser.add_option("-w", "--wrapper", dest="wrapper", default=False, help="latex file containing header and footer") (options, args) = parser.parse_args() if options.info: import markmin2html markmin2latex(markmin2html.__doc__) elif options.test: doctest.testmod() else: if options.wrapper: fwrapper = open(options.wrapper,'rb') try: wrapper = fwrapper.read() finally: fwrapper.close() elif options.no_wrapper: wrapper = '%(body)s' else: wrapper = WRAPPER for f in args: fargs = open(f,'r') content_data = [] try: content_data.append(fargs.read()) finally: fargs.close() content = '\n'.join(content_data) output= markmin2latex(content, wrapper=wrapper, chapters=options.chapters) print output �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������web2py-2.12.3.orig/gluon/contrib/markmin/markmin.html�����������������������������������������������0000664�0000000�0000000�00000037566�12564727262�021252� 0����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!doctype html> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <style> blockquote { background-color: #FFFAAE; padding: 7px; } table { border-collapse: collapse; } thead td { border-bottom: 1px solid; } tfoot td { border-top: 1px solid; } .tableclass1 { background-color: lime; } .tableclass1 thead { color: yellow; background-color: green; } .tableclass1 tfoot { color: yellow; background-color: green; } .tableclass1 .even td { background-color: #80FF7F; } .tableclass1 .first td {border-top: 1px solid; } td.num { text-align: right; } pre { background-color: #E0E0E0; padding: 5px; } </style> <title>Markmin markup language

Markmin markup language

About

This is a new markup language that we call markmin designed to produce high quality scientific papers and books and also put them online. We provide serializers for html, latex and pdf. It is implemented in the markmin2html function in the markmin2html.py.

Example of usage:

m = "Hello **world** [[link http://web2py.com]]"
from markmin2html import markmin2html
print markmin2html(m)
from markmin2latex import markmin2latex
print markmin2latex(m)
from markmin2pdf import markmin2pdf # requires pdflatex
print markmin2pdf(m)
====================

This is a test block with new features:

This is a blockquote with a list with tables in it:

This is a paragraph before list. You can continue paragraph on the next lines.
This is an ordered list with tables:
  1. Item 1
  2. Item 2
  3. aabbcc
    112233
  4. Item 4
    T1T2t3
    aaabbbccc
    dddfffggg
    12305.0

This this a new paragraph with a table. Table has header, footer, sections, odd and even rows:

Title 1Title 2Title 3
data 1data 22.00
data 3data4(long)23.00
data 533.50
New sectionNew data5.00
data 1data2(long)100.45
data 312.50
data 4data 5.33
data 6data7(long)8.01
data 8514
Total:9 items698,79

Multilevel lists

Now lists can be multilevel:

  1. Ordered item 1 on level 1. You can continue item text on next strings
    1. Ordered item 1 of sublevel 2 with a paragraph (paragraph can start with point after plus or minus characters, e.g. ++. or --.)

    2. This is another item. But with 3 paragraphs, blockquote and sublists:

      This is the second paragraph in the item. You can add paragraphs to an item, using point notation, where first characters in the string are sequence of points with space between them and another string. For example, this paragraph (in sublevel 2) starts with two points:

      .. This is the second paragraph...

      this is a blockquote in a list

      You can use blockquote with headers, paragraphs, tables and lists in it:
      Tables can have or have not header and footer. This table is defined without any header and footer in it:
      redfox0
      bluedolphin1000
      greenleaf10000

      This is yet another paragraph in the item.

      • This is an item of unordered list (sublevel 3)
      • This is the second item of the unordered list (sublevel 3)
            1. This is a single item of ordered list in sublevel 6

          and this is a paragraph in sublevel 4

      • This is a new item with paragraph in sublevel 3.

        1. Start ordered list in sublevel 4 with code block:
          line 1
            line 2
               line 3
        2. Yet another item with code block:

            line 1
          line 2
            line 3
          This item finishes with this paragraph.

        Item in sublevel 3 can be continued with paragraphs.

          this is another
        code block
            in the
          sublevel 3 item
      1. The last item in sublevel 3

      This is a continuous paragraph for item 2 in sublevel 2. You can use such structure to create difficult structured documents.

    3. item 3 in sublevel 2
    • item 1 in sublevel 2 (new unordered list)
    • item 2 in sublevel 2
    • item 3 in sublevel 2
    1. item 1 in sublevel 2 (new ordered list)
    2. item 2 in sublevel 2
    3. item 3 in sublevle 2
  2. item 2 in level 1
  3. item 3 in level 1
  • new unordered list (item 1 in level 1)
  • level 2 in level 1
  • level 3 in level 1
  • level 4 in level 1

This is the last section of the test

Single paragraph with '----' in it will be turned into separator:


And this is the last paragraph in the test. Be happy!

====================

Why?

We wanted a markup language with the following requirements:

  • less than 300 lines of functional code
  • easy to read
  • secure
  • support table, ul, ol, code
  • support html5 video and audio elements (html serialization only)
  • can align images and resize them
  • can specify class for tables and code elements
  • can add anchors
  • does not use _ for markup (since it creates odd behavior)
  • automatically links urls
  • fast
  • easy to extend
  • supports latex and pdf including references
  • allows to describe the markup in the markup (this document is generated from markmin syntax)

(results depend on text but in average for text ~100K markmin is 30% faster than markdown, for text ~10K it is 10x faster)

The web2py book published by lulu, for example, was entirely generated with markmin2pdf from the online web2py wiki

Download

markmin2html.py and markmin2latex.py are single files and have no web2py dependence. Their license is BSD.

Examples

Bold, italic, code and links

SOURCEOUTPUT
# titletitle
## sectionsection
### subsectionsubsection
**bold**bold
''italic''italic
~~strikeout~~strikeout
``verbatim``verbatim
``color with **bold**``:redcolor with bold
``many colors``:color[blue:#ffff00]many colors
http://google.comhttp://google.com
[[**click** me #myanchor]]click me
[[click me [extra info] #myanchor popup]]click me

More on links

The format is always [[title link]] or [[title [extra] link]]. Notice you can nest bold, italic, strikeout and code inside the link title.

Anchors

You can place an anchor anywhere in the text using the syntax [[name]] where name is the name of the anchor. You can then link the anchor with link, i.e. [[link #myanchor]] or link with an extra info, i.e. [[link with an extra info [extra info] #myanchor]].

Images

alt-string for the image This paragraph has an image aligned to the right with a width of 200px. Its is placed using the code

[[alt-string for the image [the image title] http://www.web2py.com/examples/static/web2py_logo.png right 200px]].

Unordered Lists

- Dog
- Cat
- Mouse

is rendered as

  • Dog
  • Cat
  • Mouse

Two new lines between items break the list in two lists.

Ordered Lists

+ Dog
+ Cat
+ Mouse

is rendered as

  1. Dog
  2. Cat
  3. Mouse

Multilevel Lists

+ Dogs
 -- red
 -- brown
 -- black
+ Cats
 -- fluffy
 -- smooth
 -- bald
+ Mice
 -- small
 -- big
 -- huge

is rendered as

  1. Dogs
    • red
    • brown
    • black
  2. Cats
    • fluffy
    • smooth
    • bald
  3. Mice
    • small
    • big
    • huge

Tables (with optional header and/or footer)

Something like this

-----------------
**A**|**B**|**C**
=================
  0  |  0  |  X
  0  |  X  |  0
  X  |  0  |  0
=================
**D**|**F**|**G**
-----------------:abc[id]
is a table and is rendered as
ABC
00X
0X0
X00
DFG
Four or more dashes delimit the table and | separates the columns. The :abc, :id[abc_1] or :abc[abc_1] at the end sets the class and/or id for the table and it is optional.

Blockquote

A table with a single cell is rendered as a blockquote:

Hello world

Blockquote can contain headers, paragraphs, lists and tables:

-----
  This is a paragraph in a blockquote

  + item 1
  + item 2
  -- item 2.1
  -- item 2.2
  + item 3

  ---------
  0 | 0 | X
  0 | X | 0
  X | 0 | 0
  ---------:tableclass1
-----

is rendered as:

This is a paragraph in a blockquote
  1. item 1
  2. item 2
    • item 2.1
    • item 2.2
  3. item 3
00X
0X0
X00

Code, <code>, escaping and extra stuff

def test():
    return "this is Python code"

Optionally a ` inside a ``...`` block can be inserted escaped with !`!.

NOTE: You can escape markmin constructions ('',``,**,~~,[,{,]},$,@) with '\' character: so \`\` can replace !`!`! escape string

The :python after the markup is also optional. If present, by default, it is used to set the class of the <code> block. The behavior can be overridden by passing an argument extra to the render function. For example:

markmin2html("``aaa``:custom",
             extra=dict(custom=lambda text: 'x'+text+'x'))

generates

'xaaax'

(the ``...``:custom block is rendered by the custom=lambda function passed to render).

Html5 support

Markmin also supports the <video> and <audio> html5 tags using the notation:

[[message link video]]
[[message link audio]]

[[message [title] link video]]
[[message [title] link audio]]
where message will be shown in brousers without HTML5 video/audio tags support.

Latex and other extensions

Formulas can be embedded into HTML with $$formula$$. You can use Google charts to render the formula:

LATEX = '<img src="http://chart.apis.google.com/chart?cht=tx&chl=%s" />'
markmin2html(text,{'latex':lambda code: LATEX % code.replace('"','\"')})

Code with syntax highlighting

This requires a syntax highlighting tool, such as the web2py CODE helper.

extra={'code_cpp':lambda text: CODE(text,language='cpp').xml(),
       'code_java':lambda text: CODE(text,language='java').xml(),
       'code_python':lambda text: CODE(text,language='python').xml(),
       'code_html':lambda text: CODE(text,language='html').xml()}
or simple:
extra={'code':lambda text,lang='python': CODE(text,language=lang).xml()}
markmin2html(text,extra=extra)

Code can now be marked up as in this example:

``
<html><body>example</body></html>
``:code_html
OR
``
<html><body>example</body></html>
``:code[html]

Citations and References

Citations are treated as internal links in html and proper citations in latex if there is a final section called "References". Items like

- [[key]] value

in the References will be translated into Latex

\bibitem{key} value

Here is an example of usage:

As shown in Ref.``mdipierro``:cite

## References

- [[mdipierro]] web2py Manual, 3rd Edition, lulu.com

Caveats

<ul/>, <ol/>, <code/>, <table/>, <blockquote/>, <h1/>, ..., <h6/> do not have <p>...</p> around them.

web2py-2.12.3.orig/gluon/contrib/markmin/__init__.py0000664000000000000000000000000212564727262021006 0ustar rootroot web2py-2.12.3.orig/gluon/contrib/markmin/markmin2pdf.py0000664000000000000000000000674112564727262021501 0ustar rootroot""" Created by Massimo Di Pierro License BSD """ import subprocess import os import os.path import re import sys from tempfile import mkstemp, mkdtemp, NamedTemporaryFile from markmin2latex import markmin2latex __all__ = ['markmin2pdf'] def removeall(path): ERROR_STR= """Error removing %(path)s, %(error)s """ def rmgeneric(path, __func__): try: __func__(path) except OSError, (errno, strerror): print ERROR_STR % {'path' : path, 'error': strerror } files=[path] while files: file=files[0] if os.path.isfile(file): f=os.remove rmgeneric(file, os.remove) del files[0] elif os.path.isdir(file): nested = os.listdir(file) if not nested: rmgeneric(file, os.rmdir) del files[0] else: files = [os.path.join(file,x) for x in nested] + files def latex2pdf(latex, pdflatex='pdflatex', passes=3): """ calls pdflatex in a tempfolder Arguments: - pdflatex: path to the pdflatex command. Default is just 'pdflatex'. - passes: defines how often pdflates should be run in the texfile. """ pdflatex=pdflatex passes=passes warnings=[] # setup the envoriment tmpdir = mkdtemp() texfile = open(tmpdir+'/test.tex','wb') texfile.write(latex) texfile.seek(0) texfile.close() texfile = os.path.abspath(texfile.name) # start doing some work for i in range(0, passes): logfd,logname = mkstemp() outfile=os.fdopen(logfd) try: ret = subprocess.call([pdflatex, '-interaction=nonstopmode', '-output-format', 'pdf', '-output-directory', tmpdir, texfile], cwd=os.path.dirname(texfile), stdout=outfile, stderr=subprocess.PIPE) finally: outfile.close() re_errors=re.compile('^\!(.*)$',re.M) re_warnings=re.compile('^LaTeX Warning\:(.*)$',re.M) flog = open(logname) try: loglines = flog.read() finally: flog.close() errors=re_errors.findall(loglines) warnings=re_warnings.findall(loglines) os.unlink(logname) pdffile=texfile.rsplit('.',1)[0]+'.pdf' if os.path.isfile(pdffile): fpdf = open(pdffile, 'rb') try: data = fpdf.read() finally: fpdf.close() else: data = None removeall(tmpdir) return data, warnings, errors def markmin2pdf(text, image_mapper=lambda x: None, extra={}): return latex2pdf(markmin2latex(text,image_mapper=image_mapper, extra=extra)) if __name__ == '__main__': import sys import doctest import markmin2html if sys.argv[1:2]==['-h']: data, warnings, errors = markmin2pdf(markmin2html.__doc__) if errors: print 'ERRORS:'+'\n'.join(errors) print 'WARNGINS:'+'\n'.join(warnings) else: print data elif len(sys.argv)>1: fargv = open(sys.argv[1],'rb') try: data, warnings, errors = markmin2pdf(fargv.read()) finally: fargv.close() if errors: print 'ERRORS:'+'\n'.join(errors) print 'WARNGINS:'+'\n'.join(warnings) else: print data else: doctest.testmod() web2py-2.12.3.orig/gluon/contrib/markmin/markmin2html.py0000775000000000000000000015373212564727262021702 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- # created by Massimo Di Pierro # recreated by Vladyslav Kozlovskyy # license MIT/BSD/GPL import re import urllib from cgi import escape from string import maketrans try: from ast import parse as ast_parse import ast except ImportError: # python 2.5 from compiler import parse import compiler.ast as ast """ TODO: next version should use MathJax """ __all__ = ['render', 'markmin2html', 'markmin_escape'] __doc__ = """ # Markmin markup language ## About This is a new markup language that we call markmin designed to produce high quality scientific papers and books and also put them online. We provide serializers for html, latex and pdf. It is implemented in the ``markmin2html`` function in the ``markmin2html.py``. Example of usage: `` m = "Hello **world** [[link http://web2py.com]]" from markmin2html import markmin2html print markmin2html(m) from markmin2latex import markmin2latex print markmin2latex(m) from markmin2pdf import markmin2pdf # requires pdflatex print markmin2pdf(m) `` ==================== # This is a test block with new features: This is a blockquote with a list with tables in it: ----------- This is a paragraph before list. You can continue paragraph on the next lines. This is an ordered list with tables: + Item 1 + Item 2 + -------- aa|bb|cc 11|22|33 --------:tableclass1[tableid1] + Item 4 ----------- T1| T2| t3 =========== aaa|bbb|ccc ddd|fff|ggg 123|0 |5.0 -----------:tableclass1 -----------:blockquoteclass[blockquoteid] This this a new paragraph with a followed table. Table has header, footer, sections, odd and even rows: ------------------------------- **Title 1**|**Title 2**|**Title 3** ============================== data 1 | data 2 | 2.00 data 3 |data4(long)| 23.00 |data 5 | 33.50 ============================== New section|New data | 5.00 data 1 |data2(long)|100.45 |data 3 | 12.50 data 4 | data 5 | .33 data 6 |data7(long)| 8.01 |data 8 | 514 ============================== Total: | 9 items |698,79 ------------------------------:tableclass1[tableid2] ## Multilevel lists Now lists can be multilevel: + Ordered item 1 on level 1. You can continue item text on next strings . paragraph in an item ++. Ordered item 1 of sublevel 2 with a paragraph (paragraph can start with point after plus or minus characters, e.g. **++.** or **--.**) ++. This is another item. But with 3 paragraphs, blockquote and sublists: .. This is the second paragraph in the item. You can add paragraphs to an item, using point notation, where first characters in the string are sequence of points with space between them and another string. For example, this paragraph (in sublevel 2) starts with two points: ``.. This is the second paragraph...`` .. ---------- ### this is a blockquote in a list You can use blockquote with headers, paragraphs, tables and lists in it: Tables can have or have not header and footer. This table is defined without any header and footer in it: --------------------- red |fox | 0 blue |dolphin | 1000 green|leaf | 10000 --------------------- ---------- .. This is yet another paragraph in the item. --- This is an item of unordered list **(sublevel 3)** --- This is the second item of the unordered list ''(sublevel 3)'' ++++++ This is a single item of ordered list in sublevel 6 .... and this is a paragraph in sublevel 4 ---. This is a new item with paragraph in sublevel 3. ++++ Start ordered list in sublevel 4 with code block: `` line 1 line 2 line 3 `` ++++. Yet another item with code block (we need to indent \`\` to add code block as part of item): `` line 1 line 2 line 3 `` This item finishes with this paragraph. ... Item in sublevel 3 can be continued with paragraphs. ... `` this is another code block in the sublevel 3 item `` +++ The last item in sublevel 3 .. This is a continuous paragraph for item 2 in sublevel 2. You can use such structure to create difficult structured documents. ++ item 3 in sublevel 2 -- item 1 in sublevel 2 (new unordered list) -- item 2 in sublevel 2 -- item 3 in sublevel 2 ++ item 1 in sublevel 2 (new ordered list) ++ item 2 in sublevel 2 ++ item 3 in sublevle 2 + item 2 in level 1 + item 3 in level 1 - new unordered list (item 1 in level 1) - level 2 in level 1 - level 3 in level 1 - level 4 in level 1 ## This is the last section of the test Single paragraph with '----' in it will be turned into separator: ----------- And this is the last paragraph in the test. Be happy! ==================== ## Why? We wanted a markup language with the following requirements: - less than 300 lines of functional code - easy to read - secure - support table, ul, ol, code - support html5 video and audio elements (html serialization only) - can align images and resize them - can specify class for tables, blockquotes and code elements - can add anchors - does not use _ for markup (since it creates odd behavior) - automatically links urls - fast - easy to extend - supports latex and pdf including references - allows to describe the markup in the markup (this document is generated from markmin syntax) (results depend on text but in average for text ~100K markmin is 30% faster than markdown, for text ~10K it is 10x faster) The [[web2py book http://www.lulu.com/product/paperback/web2py-%283rd-edition%29/12822827]] published by lulu, for example, was entirely generated with markmin2pdf from the online [[web2py wiki http://www.web2py.com/book]] ## Download - http://web2py.googlecode.com/hg/gluon/contrib/markmin/markmin2html.py - http://web2py.googlecode.com/hg/gluon/contrib/markmin/markmin2latex.py - http://web2py.googlecode.com/hg/gluon/contrib/markmin/markmin2pdf.py markmin2html.py and markmin2latex.py are single files and have no web2py dependence. Their license is BSD. ## Examples ### Bold, italic, code and links ------------------------------------------------------------------------------ **SOURCE** | **OUTPUT** ============================================================================== ``# title`` | **title** ``## section`` | **section** ``### subsection`` | **subsection** ``**bold**`` | **bold** ``''italic''`` | ''italic'' ``~~strikeout~~`` | ~~strikeout~~ ``!`!`verbatim`!`!`` | ``verbatim`` ``\`\`color with **bold**\`\`:red`` | ``color with **bold**``:red ``\`\`many colors\`\`:color[blue:#ffff00]`` | ``many colors``:color[blue:#ffff00] ``http://google.com`` | http://google.com ``[[**click** me #myanchor]]`` | [[**click** me #myanchor]] ``[[click me [extra info] #myanchor popup]]`` | [[click me [extra info] #myanchor popup]] ------------------------------------------------------------------------------- ### More on links The format is always ``[[title link]]`` or ``[[title [extra] link]]``. Notice you can nest bold, italic, strikeout and code inside the link ``title``. ### Anchors [[myanchor]] You can place an anchor anywhere in the text using the syntax ``[[name]]`` where ''name'' is the name of the anchor. You can then link the anchor with [[link #myanchor]], i.e. ``[[link #myanchor]]`` or [[link with an extra info [extra info] #myanchor]], i.e. ``[[link with an extra info [extra info] #myanchor]]``. ### Images [[alt-string for the image [the image title] http://www.web2py.com/examples/static/web2py_logo.png right 200px]] This paragraph has an image aligned to the right with a width of 200px. Its is placed using the code ``[[alt-string for the image [the image title] http://www.web2py.com/examples/static/web2py_logo.png right 200px]]``. ### Unordered Lists `` - Dog - Cat - Mouse `` is rendered as - Dog - Cat - Mouse Two new lines between items break the list in two lists. ### Ordered Lists `` + Dog + Cat + Mouse `` is rendered as + Dog + Cat + Mouse ### Multilevel Lists `` + Dogs -- red -- brown -- black + Cats -- fluffy -- smooth -- bald + Mice -- small -- big -- huge `` is rendered as + Dogs -- red -- brown -- black + Cats -- fluffy -- smooth -- bald + Mice -- small -- big -- huge ### Tables (with optional header and/or footer) Something like this `` ----------------- **A**|**B**|**C** ================= 0 | 0 | X 0 | X | 0 X | 0 | 0 ================= **D**|**F**|**G** -----------------:abc[id] `` is a table and is rendered as ----------------- **A**|**B**|**C** ================= 0 | 0 | X 0 | X | 0 X | 0 | 0 ================= **D**|**F**|**G** -----------------:abc[id] Four or more dashes delimit the table and | separates the columns. The ``:abc``, ``:id[abc_1]`` or ``:abc[abc_1]`` at the end sets the class and/or id for the table and it is optional. ### Blockquote A table with a single cell is rendered as a blockquote: ----- Hello world ----- Blockquote can contain headers, paragraphs, lists and tables: `` ----- This is a paragraph in a blockquote + item 1 + item 2 -- item 2.1 -- item 2.2 + item 3 --------- 0 | 0 | X 0 | X | 0 X | 0 | 0 ---------:tableclass1 ----- `` is rendered as: ----- This is a paragraph in a blockquote + item 1 + item 2 -- item 2.1 -- item 2.2 + item 3 --------- 0 | 0 | X 0 | X | 0 X | 0 | 0 ---------:tableclass1 ----- ### Code, ````, escaping and extra stuff `` def test(): return "this is Python code" ``:python Optionally a ` inside a ``!`!`...`!`!`` block can be inserted escaped with !`!. **NOTE:** You can escape markmin constructions (\\'\\',\`\`,\*\*,\~\~,\[,\{,\]\},\$,\@) with '\\\\' character: so \\\\`\\\\` can replace !`!`! escape string The ``:python`` after the markup is also optional. If present, by default, it is used to set the class of the block. The behavior can be overridden by passing an argument ``extra`` to the ``render`` function. For example: `` markmin2html("!`!!`!aaa!`!!`!:custom", extra=dict(custom=lambda text: 'x'+text+'x')) ``:python generates ``'xaaax'``:python (the ``!`!`...`!`!:custom`` block is rendered by the ``custom=lambda`` function passed to ``render``). ### Line breaks ``[[NEWLINE]]`` tag is used to break lines: `` #### Multiline [[NEWLINE]] title paragraph [[NEWLINE]] with breaks[[NEWLINE]]in it `` generates: #### Multiline [[NEWLINE]] title paragraph [[NEWLINE]] with breaks[[NEWLINE]]in it ### Html5 support Markmin also supports the
{{pass}}

{{=T("Import/Export")}}


{{=T("export as csv file")}} {{=formcsv or ''}} {{elif request.function=='insert':}}

{{=T("Database")}} {{=A(request.args[0],_href=URL('index'))}} {{if hasattr(table,'_primarykey'):}} {{fieldname=table._primarykey[0]}} {{dbname=request.args[0]}} {{tablename=request.args[1]}} {{cond = table[fieldname].type in ['string','text'] and '!=""' or '>0'}} {{=T("Table")}} {{=A(tablename,_href=URL('select',args=dbname,vars=dict(query='%s.%s.%s%s'%(dbname,tablename,fieldname,cond))))}} {{else:}} {{=T("Table")}} {{=A(request.args[1],_href=URL('select',args=request.args[0],vars=dict(query='%s.%s.id>0'%tuple(request.args[:2]))))}} {{pass}}

{{=T("New Record")}}


{{=form}} {{elif request.function=='update':}}

{{=T("Database")}} {{=A(request.args[0],_href=URL('index'))}} {{if hasattr(table,'_primarykey'):}} {{fieldname=request.vars.keys()[0]}} {{dbname=request.args[0]}} {{tablename=request.args[1]}} {{cond = table[fieldname].type in ['string','text'] and '!=""' or '>0'}} {{=T("Table")}} {{=A(tablename,_href=URL('select',args=dbname,vars=dict(query='%s.%s.%s%s'%(dbname,tablename,fieldname,cond))))}} {{=T("Record")}} {{=A('%s=%s'%request.vars.items()[0],_href=URL('update',args=request.args[:2],vars=request.vars))}} {{else:}} {{=T("Table")}} {{=A(request.args[1],_href=URL('select',args=request.args[0],vars=dict(query='%s.%s.id>0'%tuple(request.args[:2]))))}} {{=T("Record id")}} {{=A(request.args[2],_href=URL('update',args=request.args[:3]))}} {{pass}}

{{=T("Edit current record")}}



{{=form}} {{elif request.function=='state':}}

{{=T("Internal State")}}

{{=T("Current request")}}

{{=BEAUTIFY(request)}}

{{=T("Current response")}}

{{=BEAUTIFY(response)}}

{{=T("Current session")}}

{{=BEAUTIFY(session)}} {{elif request.function == 'ccache':}}

{{T("Cache")}}

{{T("Statistics")}}

{{=T("Overview")}}

{{=T.M("Number of entries: **%s**", total['entries'])}}

{{if total['entries'] > 0:}}

{{=T.M("Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})", dict( ratio=total['ratio'], hits=total['hits'], misses=total['misses']))}}

{{=T("Size of cache:")}} {{if object_stats:}} {{=T.M("**%(items)s** %%{item(items)}, **%(bytes)s** %%{byte(bytes)}", dict(items=total['objects'], bytes=total['bytes']))}} {{if total['bytes'] > 524287:}} {{=T.M("(**%.0d MB**)", total['bytes'] / 1048576)}} {{pass}} {{else:}} {{=T.M("**not available** (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)")}} {{pass}}

{{=T.M("Cache contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.", dict(hours=total['oldest'][0], min=total['oldest'][1], sec=total['oldest'][2]))}}

{{=BUTTON(T('Cache Keys'), _onclick='jQuery("#all_keys").toggle().toggleClass( "hidden" );')}}
{{pass}}

{{=T("RAM")}}

{{=T.M("Number of entries: **%s**", ram['entries'])}}

{{if ram['entries'] > 0:}}

{{=T.M("Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})", dict( ratio=ram['ratio'], hits=ram['hits'], misses=ram['misses']))}}

{{=T("Size of cache:")}} {{if object_stats:}} {{=T.M("**%(items)s** items, **%(bytes)s** %%{byte(bytes)}", dict(items=ram['objects'], bytes=ram['bytes']))}} {{if ram['bytes'] > 524287:}} {{=T.M("(**%.0d MB**)", ram['bytes'] / 10485576)}} {{pass}} {{else:}} {{=T.M("``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)")}} {{pass}}

{{=T.M("RAM contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.", dict(hours=ram['oldest'][0], min=ram['oldest'][1], sec=ram['oldest'][2]))}}

{{=BUTTON(T('RAM Cache Keys'), _onclick='jQuery("#ram_keys").toggle().toggleClass( "hidden" );')}}
{{pass}}

{{=T("DISK")}}

{{=T.M("Number of entries: **%s**", disk['entries'])}}

{{if disk['entries'] > 0:}}

{{=T.M("Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})", dict(ratio=disk['ratio'], hits=disk['hits'], misses=disk['misses']))}}

{{=T("Size of cache:")}} {{if object_stats:}} {{=T.M("**%(items)s** %%{item(items)}, **%(bytes)s** %%{byte(bytes)}", dict( items=disk['objects'], bytes=disk['bytes']))}} {{if disk['bytes'] > 524287:}} {{=T.M("(**%.0d MB**)", disk['bytes'] / 1048576)}} {{pass}} {{else:}} {{=T.M("``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)")}} {{pass}}

{{=T.M("DISK contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.", dict(hours=disk['oldest'][0], min=disk['oldest'][1], sec=disk['oldest'][2]))}}

{{=BUTTON(T('Disk Cache Keys'), _onclick='jQuery("#disk_keys").toggle().toggleClass( "hidden" );')}}
{{pass}}

{{=T("Manage Cache")}}

{{=form}}

{{pass}} {{if request.function=='graph_model':}}

{{=T("Graph Model")}}

{{if not pgv:}} {{=T('pygraphviz library not found')}} {{elif not databases:}} {{=T("No databases in this application")}} {{else:}}
{{=IMG(_src=URL('appadmin', 'bg_graph_model'))}} {{pass}} {{pass}} {{if request.function == 'manage':}}

{{=heading}}

{{for k, tablename in enumerate(tablenames):}}
{{=LOAD(f='manage.load', args=[request.args(0), k], ajax=True)}}
{{pass}}
{{pass}} web2py-2.12.3.orig/applications/welcome/views/__init__.py0000664000000000000000000000000112564727260022037 0ustar rootroot web2py-2.12.3.orig/applications/welcome/views/generic.html0000664000000000000000000000064612564727260022247 0ustar rootroot{{extend 'layout.html'}} {{""" You should not modify this file. It is used as default when a view is not provided for your controllers """}}

{{=' '.join(x.capitalize() for x in request.function.split('_'))}}

{{if len(response._vars)==1:}} {{=BEAUTIFY(response._vars.values()[0])}} {{elif len(response._vars)>1:}} {{=BEAUTIFY(response._vars)}} {{pass}} {{if request.is_local:}} {{=response.toolbar()}} {{pass}} web2py-2.12.3.orig/applications/welcome/views/generic.map0000664000000000000000000000532212564727260022054 0ustar rootroot{{""" this is an example of usage of google map the web2py action should be something like: def map(): return dict( googlemap_key='...', center_latitude = 41.878, center_longitude = -87.629, scale = 7, maker = lambda point: A(row.id,_href='...') points = db(db.point).select() where a points have latitute and longitude ) the corresponding views/defaut/map.html should be something like: \{\{extend 'layout.html'\}\}
\{\{include 'generic.map'\}\}
"""}}
web2py-2.12.3.orig/applications/welcome/views/generic.jsonp0000664000000000000000000000136012564727260022426 0ustar rootroot{{ ### # response._vars contains the dictionary returned by the controller action ### # security check! This file is an example for a jsonp view. # it is not safe to use as a generic.jsonp because of security implications. if response.view == 'generic.jsonp': raise HTTP(501,'generic.jsonp diasbled for security reasons') try: from gluon.serializers import json result = "%s(%s)" % (request.vars['callback'], json(response._vars)) response.write(result, escape=False) response.headers['Content-Type'] = 'application/jsonp' except (TypeError, ValueError): raise HTTP(405, 'JSON serialization error') except ImportError: raise HTTP(405, 'JSON not available') except: raise HTTP(405, 'JSON error') }}web2py-2.12.3.orig/applications/welcome/views/generic.load0000664000000000000000000000153312564727260022216 0ustar rootroot{{''' # License: Public Domain # Author: Iceberg at 21cn dot com With this generic.load file, you can use same function to serve two purposes. = regular action - ajax callback (when called with .load) Example modified from http://www.web2py.com/AlterEgo/default/show/252: def index(): return dict( part1='hello world', part2=LOAD(url=URL(r=request,f='auxiliary.load'),ajax=True)) def auxiliary(): form=SQLFORM.factory(Field('name')) if form.accepts(request.vars): response.flash = 'ok' return dict(message="Hello %s" % form.vars.name) return dict(form=form) Notice: - no need to set response.headers['web2py-response-flash'] - no need to return a string even if the function is called via ajax. '''}}{{if len(response._vars)==1:}}{{=response._vars.values()[0]}}{{else:}}{{=BEAUTIFY(response._vars)}}{{pass}}web2py-2.12.3.orig/applications/welcome/views/web2py_ajax.html0000664000000000000000000000152412564727260023042 0ustar rootroot {{ response.files.insert(0,URL('static','js/jquery.js')) response.files.insert(1,URL('static','css/calendar.css')) response.files.insert(2,URL('static','js/calendar.js')) response.files.insert(3,URL('static','js/web2py.js')) response.include_meta() response.include_files() }} web2py-2.12.3.orig/applications/welcome/views/generic.pdf0000664000000000000000000000046212564727260022050 0ustar rootroot{{ import os from gluon.contrib.generics import pdf_from_html filename = '%s/%s.html' % (request.controller,request.function) if os.path.exists(os.path.join(request.folder,'views',filename)): html=response.render(filename) else: html=BODY(BEAUTIFY(response._vars)).xml() pass =pdf_from_html(html) }} web2py-2.12.3.orig/applications/welcome/views/generic.xml0000664000000000000000000000011712564727260022074 0ustar rootroot{{from gluon.serializers import xml}}{{=XML(xml(response._vars,quote=False))}} web2py-2.12.3.orig/applications/welcome/LICENSE0000664000000000000000000000032012564727260017602 0ustar rootrootThe web2py welcome app is licensed under public domain (except for the css and js files that it includes, which have their own third party licenses). You can modify this license when you add your own code. web2py-2.12.3.orig/applications/welcome/cron/0000775000000000000000000000000012564727260017543 5ustar rootrootweb2py-2.12.3.orig/applications/welcome/cron/crontab.example0000664000000000000000000000001012564727260022537 0ustar rootroot#crontabweb2py-2.12.3.orig/applications/welcome/cron/crontab0000664000000000000000000000001012564727260021105 0ustar rootroot#crontabweb2py-2.12.3.orig/applications/welcome/__init__.py0000664000000000000000000000000112564727260020702 0ustar rootroot web2py-2.12.3.orig/applications/welcome/static/0000775000000000000000000000000012564727260020071 5ustar rootrootweb2py-2.12.3.orig/applications/welcome/static/403.html0000664000000000000000000000000412564727260021257 0ustar rootroot403 web2py-2.12.3.orig/applications/welcome/static/500.html0000664000000000000000000000000412564727260021255 0ustar rootroot500 web2py-2.12.3.orig/applications/welcome/static/404.html0000664000000000000000000000000412564727260021260 0ustar rootroot404 web2py-2.12.3.orig/applications/welcome/static/images/0000775000000000000000000000000012564727260021336 5ustar rootrootweb2py-2.12.3.orig/applications/welcome/static/images/background.jpg0000664000000000000000000264702112564727260024173 0ustar rootrootJFIFHH@ExifMM*i8CC8" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?!rS~,_&IAg%\]i'0yLihg*H|m~U||wQK[}>]];_`x7iSX^A%vO$4 Β:>|nO1٣;˻qv<'y{|~ΏkU^yn4pm/r"'.5C#:7S썋$Iayy ?:fh,&k>VU߾{E/n.%;X6 RVuo]U16Vk4'n}$H}>*g[Kq0}ؓW´ٙ|u+]6XSN併$~K|}>Uh-diDk2emuU!d[/M˭=.ln_e͛MͿ+|_<[eu&,EoI#?wv/f\2DgU\֟K}$SvʎHw Hdm'e$5דmoH>4nO*HH%q1|_Jщ-G7֋g|YI4 )P|ّ~\ hm˲9Y6zq/OJ8Oj4SZ*!j/i&܁>u}֠בm^_G6ok/?~j;?vd]ٗKH-_*h,jۭ~lΪ`V|d_&o|^j?6gf~UtmV${I [ڭU6LS0YUZ{Βl߳_yh\?i^[XEs,vRs;7{mPw"94Q!7m[嫓3&]4 dMR5#^I6}tz5s,z֫wZ5fneHf&ws }\FcprL퓝j4uGd۷ٲ#j(f"uGߵI_'EIi_Ej7K\;Fл ZA%Mo૚k:ywqicStBU-5?ofʐ4Q['79y5EL^t~jZX<\Oq35U(i$WeX]>HN2gjyo4~Z[~ۃ$ev'FETM[%i%*Gm>4PC&\}oc\\yRl?>MԐNoL?˷Wojđ,/q4ƾWܭyG"eMUo}4oɾyZÑڔwIs46{]SIwu[)4},Rϐ7|c˾FE!>H$)]d쿴-7?UD&KhY}O90-̓y֞lח&[$V|ʑNDI sFTqX}vy?L΂BcrD~E_?Q VuFOօ匶 o3<|͟Udۼ(FzU~,+Kx}s| /xz?K#C &Hs?ʪeJGeg4d_|M("][ּhu _e՛[0" !?Y.I}s&>nacID˕-2||}Ȑ5R,{TK}IX~̻l2urTwpi6n}kȎohe#è}X\y\쑢b<֛&ߕߨ$yMZ&Gj$~g=D(amw'GhPf_/ooxCvڽ֝MzM<`'ޢ#ۼ o3g$L4)kz{XiW6vϢ4iby"tXÚn6ryghuo]mia~o/.!|Mkn|o߽>ɳbujyYϛ -Ec} ֥maf?|ge+HQv,u֖wX; M7?- ?`enuҡG~ܞTKvfHd[ګ'ȯVaZ8YSIJR7ۢf\ vA}%yk zw?hK<ʿ=9b}׍~wb,N4oE/hjt:e׶:mM?uqim&/MW:3HLi Y#y}Wo{?J~'i7i\_ݧrM<ό]I?THWi}##ȇ2%HVcOZDV{Wmc秛d`IĩscU'LYbC.?y{~WJ 4O ^iwuͤSI jWO%6es\y_c͟`ëA"K/_fu\I cmh|Z4gie|gۋW۾ky~|*Is7vUFgO}"࣑#O'ʑx<-~vO6WQi`S^_,ǹiGC9!a6痽'H Cj3/_O_auY~п/keӴ7M?/T-,^A|^gxOlc]a6r>_aa?Mkr-E%H`.d١{SwBoCRJ̱ԃrߋzy4vV%t_bTO?!o&[m|OiU. .dXv~EJ.dncmY~ZYg6oiECi6;쬀 s3nRM0ryKɏg+nsQ$:dTKV<WιYⷒ5Yb߿[{2¤rмv+/ɿk}HVؖ |3 }dn_2dGk.ʋw"L?⎹hB$sVnxnJ%mfJj湓dy: ښLnaIlξV')vDy[eoN?u-CmW+ixCEśrywYI$]Xap@^Xcͼ3yyk/?ۧ*)Inn!AebX woˏyW?M#H*e_fCJ /~c]o?بXl >I ۧV谛GV/j>xn$wK ;t0Oot5aco:Ȼ:UXnV=f5OXپbS|VfmH?bxm^'$R-Z&3<6TGYS/eem˛oKuD^ZV:m׈,<1Ij /+jQoϲ)RieƻHُ ǝ{I&'g mo=A/7*hBu'Pۿةj=!*i$]6}o:Mû%CmdWHQ^L;ueʉ&X'Pci|{#7fٻӮtֶϳ3s?{ KC 3>Uww7#|I&g lwxmnD|:4@qosMo+G Νq5o巺b_GI|6W5>LF_f]W=b67Ntϖ-\ {4Ԇm<[f$vg wD׃wD -hjWu͆։*o\If|QlO'Xb…?hjG'嗝K'&xagb>L!s3n?i+qSP=,Ѳ]Xr3F7O*)3#m=ܟ,{GURTr rhc.f*kvD&[=$%?c叶}ݭYȖ3"u5ȷZ)c6co1}ru iKmİDѼ6Dj=Dɿ<ߊ<ݿe{_wY[heXw|!w6 ʟnN.l<oQ쀭$NR<7/ɱ/$>>J4_->}1iMuy,O|?}?2oIج;\4U<6FO$[G,o#}4 ͽ'퍶i#bkQBWOo -7s~^ 6~me~kOFϟog Iͷˊ+Ov3%'nգug5ϖ _Z 6Lͽv!mg|IRMeGDk$_EA9Ž1Di'_V-~ݴHG_;ɓ҆RvޫXN,?A_Un䷻-/@fѼY-^Wv̚t3le')/Z~mi)c~В QTb=^LlWz+s~LzAȆm_#oթ#`JNm }Ad4=M7r oSo4mYXݦ vrs@r]!);Czdr!t Vp[hyr"+ ʪ6e]+oMԵ-15 :ĿJvG{gږ60Oj=͊NRѯ|R~d.cHIui<䇟tgiL37rLo}}>p7|ojE It@v*Q2Aޮ[׷;..am70B͸$-s_^O φǪ85F~lO2ysB,7 wޭY=KQs~0}5fO'9Oٶv.@\TFr2rn y_VZv' 3ɻ;W E\m#lJbdcs>wv֊DK&]_xߖ_5 I2km;3o.VK;K?i濝jdz;U,NBLGd}ym&Ay#K(>w*6kHdl,/גw5"efGgxEue_]iergUds#s47ݧjvΤ%Y*=.ikOhmvsWm$2>3R1OG-2N; fvFEW3O}q)/Zv'FD3ojLQykb&c˞mVZI5O@%a5ІCivUnla?خf]6H7-U}&Yj^YژA}'@%>-WjZtWuFGYdžuYC?~.Dk [_~ZKXlf${E,mIJ;ݯ˻Ug[kw{W jb'ZM4hCoЖ,:;%Vެs@\Z6YRF?am#":wWW+IyZ ({s w%C 0C4fcsɤ[uݶVyĂcl@Sk''WY.#dK;ʾvʦ*e?Lt.G*-Mccy}uyv+>9ʞP9l#?o-ﺏzA'>zn&wgՠ.<˳grz%,emyp,M „E&g5a?dzϒiʑZƻ~ʷ]ew|U}+_g.v^Oky֟uv9|ЦO 2IwmP{F]|MqZF'-4_lEl{bmj%!d-mA8/aCwZMGzlQ[k_ZQif.HOWAzMԦ7rAx'YJYwnSO4?gV"ٽO3nZoq ^sOy\M^䉒5n-Dcf$ݿ|}ryiywje}{nfy$]/Be-]Mᄀ7SyI5Ooٿ!;K57r>vlyƟDfrHd~U_ڮCn~_:?OF^љrB?xPޑ& & ŮU[#|>͆툑L'|dj1de |4Lܺ>*H>ϕkJ;kncحydL\I6V?Mڙ>$gɰޣeggs5\VzTR\yRq,ۧ\k7wK,?Y*6xOߤo*L<ߩ3\ܠɍ\jոϸ]xzȊ행 UH3|1աu3d퟽MɳT~MkufGڿ~xږ@Ni\^%1y}_3LKwv~rH'ɕ4|6/r/kݯЧCc?ܫS_l?6yO'/*;8I Ksii7*m KٹX{]GC گ|/Pz G2I<}Z$eErou#fљDͲMŷU}V!/'~uH#‘M8bLgHlD_&6;;+9{5żwvw,<4LSͷvgs2lS=ԓ%I&]ܥM%õ˅4ޛ>%B;G4G?,\n˂4հz|g2ٱ7RHv?t雮ʷ$ MyVF^У3HJ4OKN:V,VNBY\]JΞM\ oc^]+Loms$ѽ'SGn]5ωRx=4'.D[EtmJlOVGIwqyam$w?XEnO>ND%(^wɷ]=Ƀ˼.ܳy}sߐ LW[W}r8yS:%g {"m?ܮvZg\}\Gsn&ɹ{hd^cJ06.tu+Gu :9vBI?c+!cvcii71vf2Dl>sqZQ-Ѵ;y]˻3/t:k*֑[[5M;Hi /'e6LywƻYZ.54MSO?\KI|86߹_@Dnc)Ez;w}\2-7:/jc͑_ylGsfF>JZy'Hb|dۿbl?HKV$l/&mA}6mɉU-gy-մb33coت6)Z[=чηnۏwd.ewQ$Y/?UE«o*ZqUvu;F#˚kX*q iڏ v0?%VM>~޺ޖiq}sw~Tt//GOkWcCz6o\xkWooKdg܈H̐O}*=\/%ҿ)'귛wM_wuPy>ꔖJ}7nQȊ7y=S}Ļ[86gّ&I'}eްyiٶBL~[StKg}R˂V$[G,h~{g) &hfHwof|{ .$RmwSXeCl,oɓWẆYL@QYiO&ؠa;nI|?o[UɛcɿmoFlpg{_Qsm3yVEݟ3ִvꨏ JY?w/hڞ;v$IJ|dtfT?|v!Xo};hgGVftQysm?vREK'csSp"G[/ifבF|7e5M?.&Yg]]y̷ʹ͸S4¿=aԒ ɳdO7v8SmK|]ꕧqmnnno/R/*O}h9KK~ {Yx?w4@?!6'Qognat[?$[?{Ƒ#4>odg$tZy_^_jKqSOo&H#/r"cn],Xl{2-i͒7{wxVoc<;2?r|a m{/s*}+oddudG?ִG4*Mz5OHgj '{9E\ܻmfyi\Iԭ]m5.w'9yo ).2F-|CMv2\nvCDd1FJIu7VY2.Jtw[H~So|=у1ߚq ?}*<m=,2VD%y:)>уS{_SI5!ܐv6!m/TZӷKq4[vm`SܾXKWXٱjt&F8u"$vBWMmFZl{+XWySU(:ݻKޭ彥uRyYK}оUZ7 vlq+U_uov,V r{IOfIRIU6nvcMRKy]K$1OEwp"?$^_W]>uG-23k{y6?ޮK武jW6pfc^9).Vѣ/d?JM6X[K?Ȗ`kW"Ӧ]5F^yB&g;ٻeTY6|y Jo~妭^cq2>i≦A?F+RjѮxvֽ[.],Ou7M$jXͱL{䢬D\tZ)MyVv;nKOQ'gu.t/_FciO1v(6[MV2|m6~ܬgYk5w?:_g$hO]~mYҵ>=%ޱ'ڢ#ﬖ->Ͽ]jnf(mNxJu{S̺]G>^R<][_KyU,fSnOKM>8[?*ɖhZeplR x': _1-Ye3BdO9TZ̛{y>f?Gz'Fe2y]eƻ | akW7Zͼk6:JoPGK-;ޗ?eܰifb$ȏo^6rJ"E]?۫k$i么o~xm)t~z_h~2>}mm]&[k X(O}YF 1wJRr#/n3uC!&.K3sϘ$-j| b#?qo,8P"<|5n)Tm&t&߻PjXrkPi%;خXDmY}nV*aʍao-rFoUi4o=ʥS5mWSPVv&bγ[1Sros=FIU9c|ú+Ś=φ/<2t&Vi.j>M=MO5k7LC3q$"$$Ṃ?)IJoYKlOj Hin 4Y#:#ȄyvU$YGݮ41o*9d0y[dtџ!XPXmԑݪŻ oxۙロ3U[]jf``nƓ%JbQ~?-7?6F;2hi73oj 7SG˳?'%Yl6Gc]iWzOl#}}uͲV_6Zvʐo$[M.Mo;gέ:am\$]ʵWz6xֲ]e]?.Rp~kwo+ϓ_ܫӵm2,]#Y6KnF瘮h_})s4yM|:=74ݟݏ?vE& s 4[+ܯg6EO1<<t"ԍyw vdb ;W~7ܬUF`x>wϮ%jV&;ڋ^Ln|*6'ڷH\[:iXnR?Z;"lNh[oFic>ld[}teK=(a_4kl%X[6e'+~Ÿ[g}"^v<$gO1d˷zב27d_*؊W:{??)5[63쮜oRo2%j*O}z|~oq2G_C9gv)i$Sw5{i.c]%)ukm-ef[gΞ"4SeTnRd]|ݛ+[ˏ{돷W~;CbG5x?V>-n1;g4k(djut'6oaGo'=ijMdͲJՅM\=py_q+lwsWo'bG#>fpb&'?ZMk̚o?_y3/lwްٝ)ⵖi/oe~28̑Eo7ݵu$yc}괯2d.?v^љ^".ӭNo%SSa&5 ?:F4mB'VKy0jQI͛*YQbx_7jPq~V~)ƒL"wWrry0>G,묶-Aq{mۋioO65߻9YrDȚe|/9;>Kg m#D+ln3#'eGxR+yOu˓2-o*̶1D5$v_p#Un&c}s-/=9d5`]VPlO+RCwq NnbUiyݟ=dyA$7v;g}է/.n.]5]KﺇH~'Ǿ)ij/+1o H;'EŻHa'ɚ?Q+ 9{UYO^?o=EEVB969T͜hiٳZ{ZO._2:_jkosc ,f6HWCi:z]Cq~9}&$rFu| cvἨe>wT?ZXjuXK',nko{_&[blȿ&ٽd[awMڏ8?A~І3J-"67u~$LcH<]: Ή,Jy~N$ ʎD/hXn)G'ɲnK $s#lU>j(&-'ʚJKjnkLJ|RtTܛx^H6ټVεe}yg1mǕm izlh6qMhL̒ OݡUhd$(6)4-%比$?Q|۩?-6͟}|::e6<}fl82ț7}͟[{! /$!yhsEܩpo|}$#dGxY>F_ yup?woƨo"~kqm=OwQ0ZK!.t؟eYyvMWKv><_}V|w_-? O#I98giQB9tݼ"~否j-h6j k7߷ HhxSGvs},5{Ŏ5H?>.|I&-߼WHEœnUof(Q]?Ne䐿}ݵ%y7? QHhѾ'JO:5gM}!MϸkI!X{GIJ?ǿٚKhnx<* u ݳ˘ r?u@UeO2o+?o} #۩Lcm_[:>Y_٤gOg:zVjP蚒kZ]-gPR+3DDe\)^5o -߅M:N+_D7~?\f(ie偩@Uf۳oz) M3!7y2KwެVz\G2yin+;ac6m՛yveIo?bO;6V#n|*(>UiQ$>mDZ)Z.!x.{ QkX:6j]_}3+l F_-ﺳx^t}JMԵɗMrv3iZ )f?<i%"3}6Wcui9Γds{Y;RIgY겨ک[6Z]?ym"?7zԻDckQ5/yMo4rl ݦrZ$R'i(ltfUr"=HE.KKYcw˻ș/ܲonh}7Sgi&OeK:'JoRftI [BsIm^~S?OW5*X2?۫5o+fdM[T|ܟ;yms*[u_m*(mfkhn.&)#7͕Ulu6mz}*g\Z:iullփodA:k7ٞnmq,2/Ϳʽ};wS|->Muu5K%3&&Xw=sYV$f߳ޫڻ[v[H>S&+qwY$4I&#mYZ8o7e=M_ԟgU1ߠf$*|vnﶬݭ=V"|Vo,uslFn7/iXGZ8Qfi-aHW)j<}Ztnu|ѵ?:#so5L>u_(v *?D?Zk6Sރ^DGl5\_ʶomv|]cnYw}UW*~aDm")FoF;7kCŧuI?Uv9X&(&w*q+箠ϳ'0yltٺ_Uo2m7.xmj;t 9iq>_-G DlEڭnVY5v6]I~\yE[uS]gfyyn$_췓Iuzd޿|zDXU.OHy_fkL/+\H,̧.s}eb8yz?jW^j77QjED6VW?w2udXȍ4xfؖIq=1q:?㫏 +З@ίϞwuü3o< MJ—m7(wi[uvw@#- o}g|l:dt~v{8R?r["l]OhaGfmjtp oMyyr{FM6ϸ?MxO_Kj=ڢ|X5'Rү;{k*gggLDx6X/[nɭ^ۅۮcRD?C2IUzmi:qoRj1vLsimsȖUV5_j坚ie?rl [22<ʟt_2X@mx[Z~sڎ~nUe^,[yD4aCISj/4ucvWMgQȀ`sW-3.A _-hIwmi]1ii%e-|٦y?;|/ϺDxjQK{|&>inޟRV۳ )nDWVms5kmrйkg2YoEIZkvliƎy#奷oݿ&fܠ,*w27Q{yW?)]<2CozjDLgSd"[[Dx>c_1<;;?K${[fmeU׌fٽw;Pі[}Iq._&Rn"Hd{{k&E< 5"[MH^WZK!MWugo ͥYvoUO3ɲOB; @"$%]U[*vjZv3^6kŵ'QS}W[..f`jCw}yc{wm]1[ D`DVi%c{ܾ]tq3*<Of&Uڭ_ޭЮQ]sq 5InWM2ŕO{O=+ ͽ;m;6hGoMp_Bv۰6gqR96o{8Kn^&Di⬋۫3QjqjE|O mmBY"ϲ?uf2HC-UqD)&KvnG,Nm ՜r.ŸO;4tX++$^Jkw9eUsE(KdOحWS~qgZ |R\A؟ӭ.nmQ!$| MZ?<+M4VP;Hge1n^udnt{M=fKy_-SgoJWmōoi>co seW?7.6/=@H"mjyoқ=L[Gl/HO"UUđ$»>Z<A~ѐi<۾},vs$0OrdVgsy7/?Sh2/΍_k)@{FG}k˷[FvEU7(>4tI<-=-mG59-.]?NZn4;Z$I#ꔑ_ݷּ[#$Sr2?ؠE8$w{1mn\XdдnwSs57 2I3ڭRC53/j4?횮sƑȊ~}%֖k{|fOI $}'/[ZMs֠>/!/:ke-c/ߪ :"\|3+Ey۫VwU]d'yyvO]O$r>λ?n?@[d*gS?w@ )oo1 *'7<q#_yyWg2?癆<{|YM.o'd2'=>Jf޻rOB2:A]5cD7WǵܮyeWwgkq&q'ȇ'Ͻ넒;}ik`wZO=J˝n}y& cW/[T]{i54V.4?FSۺ?9"-}_lokl49/>0BO_ZxLx[J4 ;v%Ծ.lsyl㣇sy~B?)e"yO$~#èivFc5XC~ёȋM}]}[NgMkzD?g|ˏ#[Z5bm<Ckq4mt{FYfHdm42~}G? |q .E?̬߻ޟ߮u= /oofYa~U "L5ܿ+>cv۫-̒'4g?}1s"TfJ|4-UǏ:[iR$o+UH7O5 f[ek}[u-XӬ.X,<%?M&F]im+=Vpbvky?Y"F-#ȷ3'{?+&cM.m^7u2w~<nT/5 .&P͕] ^;>z$sOT^%z+|'ԏXM6}Q_GMBJ_6Il؛ؕqnZ>۸mw?U3\?B6H'5y+1goWhv7Q7rmC"]-'?Ͼ 6RkOtzιj?4/ C\yXy+codOwnRk%А?zV Ob_ZRX_S\̖]oEk̷Eo{5-HoiV|ݹ;̍oO eqeEHr6߹I$gsnh}}Z͙Rȣo yһu2w6?ۦds!~_ȯ*Z[t{db{{ܥmX{ʂ2>sp~UP &˽"4s,,>]~oMIZo&dyM+s=V:\n i-g'|9Mf~Oj; !=cB7UngeV-;nehvO>3ϒMoGkŨf8Nh%ߢl}UJ};NSX٨}gKȼ6;]ؔ-z@gV"޴?"K "Kȭ:ѧ4{!g\G`X]xbƋ ؈쪥-cH_,T]KK[O]CED{w|O{!Kw v[Ϸ쪆HߦUe&jZE5͝ؤ W$w{cb<2ʲGg?i!,r_/gUXVeI.-~˲WG IG7rKa\۔IR 4?߬X"1?,r8}{{[SӗPmE빖i6Z2iWoO B>Ux{Ļ$7*q&~ЎSz﫦&kwjƿyRCԴt=.KgOsgƛ.ɳgϿf9Lr/nϙ=WC4:]1ĐnHӾzg=w7)~v.ݷ,=@"e5JJ]SHս;{&g֏YX[偶G~G_SuSr{8Vgy?VWףܬ|.^j,Yeذ?.NkԷ5``DmޠFsIJ6x^EvOs%286ki:_ChyO.7y#Hch~TYGM" <-\l&ʭ$o'Z;ܗ6?7?Y(n۷wT I}v#޳|k!5S]ϣKu/y!|=7Lt1F:cI.^mu[:q*&h6gU׹X w+Ļ%?:6hUd^|]6cIO{ڊU;y}=/OHm"LmګV$6fcq[_M5wBewCU%ԃj䍛>\.'G~,Y|e|2M?Qk^\E uRIw4u)Z[|ěv)n=;I=5-k}[˱{o&D?o$dWdR/o0͙M~n"Q\Gqym?+w}A+{7H;6/,ogoR}S'mj}ܗ1}KL&2jv/]E<7GܵgSP+h9XQuZi~7&}??NDWj}*q Iw~SgzZO?ogVvAd;LEyoq ͍?StvQ!?,eU پG&кdzy䳓P5^D{yp)vߧ3W0"$eGܒ^W:-2" WT[8yh߻mO+&khbKc Aʰga $‰لkizYhwM7O>K2co/aU59x?-S? K | Gٳ`Os<2U_b(AT#myoPwv\?9Pi_T2I1"x߬}gHa?#H[TbG|M|;zjdڇUeD^O}ԩs>OۄM vѷJMM2Is"9fnA?*?**wmYxfo[-Ớ lF ?3#WY6Sd_ݫ2oo?ڦn;ſj:#W?|Mǡhzϖg:4&&WWː}1En#kU?=cjgHQۃZ-md֗n/)7.zy\Y3Bs/-۾=SIdD)MYi[K=dIᄉDl|.noceB }\'=Rf{vklp#Q <6b>eV]`ZZIjwG%r"-<0'5;-ʾkk?I _zowڹUR -o6S>QdZ-s2&Q''}ٍF fXa᷹}U瀞boiNRK{8D%{_*)3Xm3 Pt}Ā:y>Cʵ !Yw=,;'>JzJ\*hS q[»`\Uy+w*oϖ4eY.|~l|5j Rբdn(-,M,3|CqcqǙ$.͋ww>b5V]/FZ\p}mn'gYwo0]xP1$ϵ6 iI nwVflܗ-ހ/L%sxJn#.3>O Vgo9?>񑷳ϼ n-~E~]4:scsqgsnWz/,vkv_\]K}s ZiOr2>xg$g~<}nʷ.4ą3pOmPn6I[kn'ԱM묵n}OŶm&Ee,xI˿j߿'\5(m5ҤWK^8]W: <2ܤg#m^h5_@TMoھ["ؿ4)zsȒy!,>l->*&DKwZmnnיSy)7K~e: :ZNB/?bM-~y?rG+Īp,VlLڄS\iu}p̌+9;>1q4 '9]gEotRJ`V6MC? K?ɳW 7τ"Ԧ҄[[]?ۯD_|Ggo[hvږ1ZDb6,<$;&d%أRMy{wUئM-uv5J\q1ܙ>I^ {Oo=r"fkkUD3I$n7|ʡ:$WFǎ3^/?xgzLQz-6}6\jw^5o5rf7hР8x䵖?%M){j%ee$HG٣%Rg>r}MO:@}oI[FO?v]蹮dAiVWƺqEtn*&vOxsϓW+RXs[jJ{mI? 7n"`aC+4K#7[;ɓʓS\_ܴzry/Zl*Thn>ј{8jQ }*[;5Aqʟs}g̿?7W<yiќ4owE2H?zUMOQY'Ijr/S}M/UoOjO+y?WR/-t[2̎7Ο# _[٦ E$kv7R#۴K5W0’=qceb*g]O3ټH"#\OI~ڱb7aG荒kͶe$oԟS,&IKlG|Fe 1 ׺S>xfGD߽JKu "~ȿ~ш.=͵ŵ̻W >uvs@|#ƻr0$/"M$ݫ OI?ޛ'+&^bm_/{Еn> 0ɿcT$՜ۗb}m4/h{ۦĎ/1R'>G}I&"=m9Ԓ,\ИO+j/Zem>j^,h6|=7[ΗuPC 'k'bo?pP?i xf$3:_fϓ*͹}ʚ8Dw3y;,-llOg]갸|%TFrWɽ>\zcgo[ڔ7=mV;i|/?sTútXJrL#y*ĺ|YϗC|My~z50{;f;$[;?ÿfʭq 5>1cM~5HZ<-YϥͲki-%SVؿ;MrCSyi˥B~t> i Y2}?Ͼ$HvU}ǷZ IL;G:_1͕nKəY^v͉<Ꟙ;<%Pɻ;>UFͫ#C gQ}[Fdoi;FP%vǛ^ N,f'[4ȉZP-,[{L0g1on'g g>\rncdYx#O2ԯ+_Wd_[ ug͉YdQVMQ}wDҿUyoZ٢R nG,_27Wݒ%mg%>dKiox6&tLY-5*Y HXY&Wgf; G_*֓wgiIqyTPlO7wV6i\?,q;[L y .j)n/-$!oJ\i:yͨXj?Pq lKtWo#_:&9SI ϟ%2j0[|S˳;aZ dw~ ]_2ND,-e߿ΗsV4]5 \]I4o`ސV*dzc+^I.?u̿ócZ4Bs&huKokǺ|JZfl?5{;μ[m/n^vN5{}^&/"Z_"4ogGM}?ldؿ_⡆"w#:lP[ě5.5[˫{ 9u e? ַf af_?TieĎ_RS.eH{5ܰ\ui|WhvK7}+F͐yR}wu$ͺm߾ͿMgKK{8omῼʃP[4a:МoC!]m+:퍼MH&W{hwlgO,o2#6"Lѽoi}Vs^C%j ŻҔRJ[ d[ z ߲>k_\-n4= %g?ϝ&hfy{IhHZk?܏g MΩ o zO⫫rn.2{Rfil?{6l#N'y$o2?Y 2&hy/o}{R}KKs"JiO\\[QM%C<17<F_7/$].^/.qoVq$geeY^bn+AJ}g vo&h8Z%u y$r$WKqv*/t~5zu+^Q$?#'͜<ב\q]ϒok#2'ɚYD}&󮷼߾Kѭt|d[}t!O/?ˆm-y^k~sɴT&UWy$UwV_3HB[oّ?Ll"vU#{mR}yD2*‰ͷOSnqtq[ol/9Lc1x~ceK ͠#]32t_'co][M}8åxXӵVo%XG4-ִ&([[W~O]ݛFv*|W}rڊ7@%?ɶ/VF=̟o1Ĭ 6(e]"ݟ3tQ}4xGO$m|ԲyOQ+L7ܑ?˅-:s##G76y&"ٷOg쟽WOc?AO1>JuIoqmlof?F:ڕ}ܤ{ ܦw̛<ߗwڒov_ r$$vy3m۶?^?_)s[}آ["[[jyNOm{SS&7ܬ.2ʫw>7}Vm湳^imO)d.vٳ+=?&j[Be,Ɯo:oVRX:R[ƿJ]yy h2oj}jylھ{oU(Wjw3bܞey&6lmΚn2\>;gSX2oEVp}H'ϳ?ޠ;?PWfvymEܬ5|CZ4y-/䪳\Bj!h˕*K7_1*9 dh(=K_vWC4i6_"Y{_ePݔH_u??VL &Qg/o-sl3*F~zI6rse-ŵ)=O1"kG[լvy1wɚ43Y^ј[o2yw5;sڳ m-vV}QOPDiq/ݑ_ey/)lͷN~EWX]ho$I_VY {o i#}d7IT>6$ [K$`]Gֿ,x$lj7?s w#/«|?̟jFy.v*BLtZ$/td]2֍wZh{QnMۧ,mIk]4E>J71XQ %ynJobltډ"٥I?7Xqշj{ntd]/P5$*8q߬jMRdeӅ\\y'?$ǩI [Dܱm6?n.l?gֳ#ZIlmȷqq4̉7n_Tf{iboWYIUO?JK-#|:[K miimutC?&MAdK+qyϿo @DYo1#}? k_jOus CŢvV]ɅaÛII}ORÚȯnmrFͿg 'ɏiQ&cyn}^Е6鬴+[=6houBԽg2\}drg\ߒo[1"?4-Sq,*v*jzKi0 $BWA.nwm®gT) m qoR2۽8<͟ZZI4 }*V}ZoI"y񤬹 Tb[_˵!{|U;)[t~jNL̑jc2<(zo_Chi.ϖ5$&dHR$ٳ NK1%v<~ĥ̆;ko+Ynp"C_~`) r\+6:ni6I^SY>S(ZEVyvro%g~Տr;/XO&{`]2ͳ>z?{Us 8|I?uVh}s%!*mc>G#L嶉M.߶2c;???UC^~ [Oִˏ"X(3g;K-;oւ[,FoGmY$Rm>gAH %ڃK3Aɭ*).6Bcy&&%Kbfok]ue9f߻<YGh<[TomOizjWךn<]mwqt}Mꖖ2K}YjgUI|t,]?ߩ?>V\+챿*'MxeoVݽ5Ω]"?n"o|gFE-J<ǵaO=ZD/?*e>ggd]W'4~gfUuAgC{ʹmd?.U2/#B{Ej@7voiIi\[ZI󳋑[g;*q[m$E#$(7ջMFθӭ5EDqOZ7F|ȖEEV?'S^u-̑m4q|¶B y{V Mo[udL4dX#*t'Z/'M+zo\*L#:Z3X"%iA"ܳ7c!Hz =b22Di?o-[yaV)$GM>!+ۛ~6AWZo߹Q,/6i&ĚK۲J[okˏ)ʄ̑Muw`_nv+O]x_ |?aut[>~bUWdRڐ:IK3˳έ+M6ggؗ#<^gV~7ZKxmۢ\\yj߫74u`V_$lbFh|\$R.臕Sa-ewU.uK Vc*5:]BDK7 8Z#ߪ(FAllIm#l;dތ2ݍ̖kuR;\DM}X_'4uxkT42(;>Rh w(IT #H1?@K=*;ٰCV>']z|??sgAkN5WIeٳYطh]ݻrU!UnEqgoW!_c޵\|Ϸw|Ro|91t]#[jKӅ03re!GI;W̳̍_Co2iCohUȍ8X凜_UiM5? _2mL {HnܓKC‰\}ߟzuGƥ7*'ٷ~oL7١Dċ:}Wg0J&Ta/XUn,%y /k-^1k!lWV3M_'Tl-IvV8۝RQ;ua `HmHpokom"xH'"_XدCN38/]\[IVw N2Y?ϼd}Zfw64,MriMnvE9h^߾#he|}ׂUoh>𖇭[EV1Iyq7O{] ^>"7b)l=^{|?خZeuF.? [Z֯oX^izq[9dW;9oU?y #žJUey#hf6I[h9/^7j c8{/O8<|;h:߹]o[ 8cyΠ$sVmd [Mg{M'1D,>wvKvlZWZڬXdTn pP4>r|~P@}ZY4DIn<ؤos}uwuSX4Z\[:o]N< G,knҬ[_*[}J2{\ŵe.پl}h3|MynbO릗م_>y=w"!_ ?䯤ͻ̚"YE_{ܯXZldolrᯇ}lj^W_pi =|!}bԴ^\V e.x.w6B!DtM'N:?7'=CŶ6-"?_R7C{{_|~w~= BKgU~eܾ&|=)sm#be|Ue'gl /Io5;/|7M>V|oioCxc|>|M8B?Li8-//dz3#,Yw=͜3ylM#+GtB}+򺟼)Se ټ㔗#Gx~Ay=Z2y>O}xy 5۷|ZiL|:[6gh6Gm/؟?|qW3/+{kH/Zi;3I~Ο|g]\X_Bh;z7>W۽Zx\j:I4r/lssm ;H+LY\ZZB&|/Sgߨ$26O9Q٭C}sv,lj'P2":ykнE[ZOtI>JϒE9!cTO6y^t?}XȴIWb_/l$+%nQ/k$6S>ꔎ<&E42D2.ѯy)s#}h,i*:5T%o.=[NE[ vd޾olJlެ$d}{*adسl{o*nqm5LԦ }JK27˸zsnٷ"~f}k!G>oeZyp'7XYvJ M'u6Ḻr!{I ry2< 7io2oj1kg]ZO{.zɃ}XiM%C#6enʳmi6l76ku#ğ K, t*[Ɠ=G=Xi-d@lcmIؼeKi"Wﴻ-,15F~]uiZ_ٿ^atZ8Ӑ_e.[dGyo I'3 'ZmqBe[~.MCvG͚; s%UGn|~ϳϓnݻuQ 5fKHO1_m>XO2IeةL;J_d3Id~+?jLsSF|nif3n<$Ȗ_h oOjbɆ;hdW",2doc}PPnIb}S ~}+cH^'6Mvy06Ѷ߿Y:?;fT*+Dmc+4кP-JΛP5ooAfOWd$:L_?_ȁb|/5BQ}MI? 6giiz^(Y~%rL<Dlsy,?u?Zy?|'w+ ~o"?3*2]CrMfk4kߪtbdt5U2:mcӯqSoر*osfs3ۓl'Wɾ}>Oy|߻~?4LusNӦ-շ;$yq^ [x?<Z)Hx<#sKn^Xu$~W7Cmi'|MAUgOu3E&cE pZj/gj/%MY4I.Eͳn.ϟf?XMG4lM| ,dvp7I?xK'aSmD<~tI4Hݛ{~#fKO݊5%Ż(CmKqu4w/I,cU|U|:-nWfy5޻[Uchx_~Je?qK:Ȼn>л6mad:{ƿXjP"_J|hznܪr2/AFVZ)4P]G^Fٓ˿Zy3o,uZ42,Bo4:X)$Ō~S'"?%OK FLL|6Sꚦj:4ח$Q{0]ɼ.ڟʞ N{?q#CﺑhmSf`?Ϋg{3D8*usk-n!]y|=ϝhc^S̏]=\tmGYa9纷mslPuZ"9G Z7Cof\>Ć3hf5H!-1_ȉyϳdB6ݕO?qwgc]d\ݬapnETe^Яo$1yҿ0.?sǙ!ٳݧ yݫERݮlHyt!nf}ΛDcxՉI5C$26G߲2<}~ԅ!i>Lֳ,)sOHwR+CdO03~F˻ZD?hUGm7_ >_WRȗ"[Zr28s{=MLߴm-ϓʤF]VfkgH֢0z}wȋog<]㕻k6Q^m %;Mߗ{E6ys˦۾eUbߝOۅS_;&Y6̓$QYjQ+HȾ˾h(cSR$0$ ?P)N5>_raY6B6ƿk:nk7ڼr^'G`CyWSt^C:}Rkf[|21}q?5<sr#e߿>fl<)j64:|_lF$-MخWs|Y|=0kmjHZ6#WBKWwUg߳٢0wS\VK:gؘ\ki0/nf^s4B}᏶⢎^P.dx-#}"/CkFk"o 'HwǠ ѿp*]Ρ$ӄr؛8.y-E|Kr7W_y$P?3]Vzy}jV\<7ހU3Z$V&I=a+.v!%Ť7{|y%ٽ~>ۨl[KK8-"q9Zo?Ma<Ն8l<#ZFG؋k{ +=d.o9~ߓJ I,SA,ohwy!} \]sCH9y4=EΡ5FB=Dag;~\9yʣ闍;ecܽC7dH9<׌-ܤgJvHtۙohdE=y}ZH4]ekHgopV9fŏw}߬ MH~vSݯmbɒ^$m͵/c]mm&٧= !o2$>MU),LpZ3Kp}@Tfړgc!{G<}tu K;I#j:еRd-m>9Cv|Gr[勨0[}o?U|Ut.d?Bukh6p~Es 3HaXcUZWuZ?+R#|?ݪs5;n{h%O&˟")%_-}6nk;fU灿ovE6dtt}?L:d2;߿ҩq 3uT<s v9rHFU)hUr1O>K"ľR*vp~1">d2~-yeޓDS U~ݳmlZd1\o?QE|bM>lG/n=(WɐKIٵku! dhj &)Oյ7ySo>?ۥ.wW;"v "6/O>_CÿY-m,2#<{klZ3KxsPEK,-?3'Xp?ۙ^ghh]hV3^X ykQvsm*}d0Nk@$dg_~&y9syIHh#hmķYs~˟7mTmD?מAȉ|ئ\M/*h'IP2>iRoTPl{ėޕsKӮn-Wo޿,-qܼ+/m6nQco;"ϿM_ESTЮ\f\ }qwn|kĞB&HhV˵pL˷۾,4w$h<^awݭȋulg und|FMtZx?C{[VT\?߷ϘǢH'HL0HT\mLw$[/۫ ..cuod*.vz jW Ia>ޟgjM skH#I$ =.Gg+:'x]$ͩMs-n rZyQk.|+.6.6e.tc;yCn6ak7Kh}G~MUGv?o1oX"_ݔ$K_!׼3V5 _[ꖫ24i(˦O?]ɿl+qk%Ȯdq6ʫt?>H4Ym&|@'^-H|aq.|vik}>ugY!Ծo q6:Ȇoo)I3V>Ӳ?Z{eۢupw>w}Ty*Mnn1h ɾgjsq7ܭN])ȎM AE Oț3Of۽G_-~FcwU[d<ɦUW>uIZ6uu]&%* ؐd:6uq_Rԥ<77k/6U(MtmH:<^uxKQ+ZxOZ~io~vY%W*7ẹki+h&EU pܪ 1˷jtu5iwiykyb-͛Y_1_KL>j!z'O+*k~o H_u%L)5nPmue<"O,jѼ2[,c]Kɗw}7o=*$~I&?o,;Hv-KTJl/5-JO9sdtxzdٻl%iynG'?wBIs i5qܮ~Dv_^Vmn|~_UtYi 4'wY!H㶛1UY|Λ!)uVnecXMtw};¾?燮 י}fbؼE_&oأ v357` =y~/xrdOh^\hlŸW"4,!֖meO24g#ydI}Y7 9Kkk{{_=OdMIngos4&x^*.x}ZqS7c5/:g\XMDgof -K]a#i=/Xh;]տzD< S@U$x&5:>i ",?枱}\Lvk9fKab޾tzˏvfy\g32,<9b[ٶ_6V:Y/^h,[O+{޳go-I"㕕y-w̿2hCQj?n1tKr$FxM%_/?)swiɏ6~ &.| ϲMgnڎ96 3[\Y}7nd]/alfu:ͯhqZLeK_9 /O,6nǭEqu)t!+|LRP^jE쁤 >'v4~ѝʜN~K{im7 j}aɑ>."6T@xE*\^S>۫_ٗL7+i$o <jqM1gotD.d5o*WṊg_+ʗqh? sy<'`wP&Nu4fQ,lgW73>OX,v^>_>UEn B/FӒZ/7t/Փ|+kq l(̢G3|F 5D_5c[+=R*)-DqIPm5%TVBi5ͽ^sb',5̷c]Ao&f^YmmqU6 uqlm' -ݓɚ?o2'-svlV\-Q::y%9-;Xnw̷|wTfD#DܫVT.rĭceVr^êɥʸdgPUh|?%jyO7164Kf{ ϾCݭtvhx?=2 |[ty6$ŵ=^FS^i ?H\h󡹶Uidd%T6D?^I'ίTdE<$)hʖgNOGy\~t}>hgi|߻(5ud>8\) 됈|߼ZCaox=ı}djlٱ |m.%"rI0M+^Debr|׻K97}6'XR?Im^C; { ;K9kuz]auϕ'2@c)MIÿLDE>ʶ/8gVUo2v>ȅ"c妑|VG߽LcttImT/'|:i$loy%ܷMXTK{>+l&ϖPHeH YGv6|#}?٫6[Wc'gtc꽨3{~jY'2{筹$3ϟeKSͷ {ֵs4ws5Ȼ<ɛ+$.%~]2'qy Yէ`,/?}6V߻r޺ӭ pyr}9ˏo6u+:,syvݯ?=a{y̟ko뢊6m.-s-#K]/wجt{[8u%NP_6)&?Z)}aOߨef.$/^ݳo4gAMoC_U?VRmAUC[k%[oO7A/fM2Hm ͟MO1f!iuFid#oK4,Hlil>G[n.O6-#M TR*I.5D>G,xQ6YOʟXwCqqzp3Hn:={"~O/)& vϼĵh o(em5Kwt_ܬɼw>ͭ]D0Z|ז~m=uzk{2am2Z c[G̻>-ͶxszIv][I!kڠ?"̉c@ ex|y~ J˭./^!TIW+䭙.t3A&y,U!Z, ϖ"W߹̻von+byVL_s-9\:7;ⷶd[Ou"2$/mMj<ϻUyH#4}.@,S$wʷ*ϑ|?dz~٢E?\Qӛ6?;S2efDQ|~%M(ؕd_+@e%ṸK.(1/|T\+6bHomڱUuۘ$TE*E^%y{h6yO? >IaC7U|ćXmWmWrorڍj2nG>*K3hbl *ʋ5_hM>[rЙJ9?߮_kkI2GM n۟2 %,56+%!b̚9v˲y?(-ZG0\cݻ(7y/7} 6.*y"C:9K[?Gv=F/5ٿM̧~zݛ[D ž\!1M~v8#H\i&7Yhv3߷U>H_wWrPW;*̅D?>,WOm o1wM<ϗfkgPf;_O/jge^(Ȳ`N~md6g{8[A4g.atMc& Ż۶w->8$~~w&D}M(I~džD2|Ą#d;uI8_sk^mݭϙnRr~W;?Fj\[)Uٿ-jD2&zТlfI~i?]zxMg@eTM)W˖eqn?#Wm[I/Tn+Y)?w Q#3޺x~tVKmb quo$_-}%[d ]6KYi^im#>zH Ʒha9d~d,{ WkY-nn!ʱ2}ȇ. Jn܏?m'{ Jh3J(pGo˿}RU6 d.';_j{q3;g*D|%evc"H>]}b]OS(<^F./TVB_2O$)HZ>kĹbVΩ^~5 yv}ϳC &߳o/dZ%Uʢ'V@iZd Wov91ij[ة4 lU')<#cY4Ee߿r|V$IX\4? dlL59y +(y&B㵻ggmv$R]Ʊ${r&ow]'-i+G-6e#on0mL ٩;qr?eo|0$XˏXtGޒSRevyM۪wȥobZ=%1V?*|ɿ{~M+8R5̿'Y.sooI$sGYie'ŽľR?4}Wo_oQ<wGoɑmTB񋍏?,0h(7=:Py.qwSܬ~w>?UXPuJ'eH"ikDW+@U+i)-Nei(fdPxk?hcI|qEl&>*ȏ(_/_Zzj^>Ŀϒ7qޟƯپzt,ߨq۫1{[@..m~U1.|˿e]{--jùG/fo]3b(Jr4Ic'H*o'`-kk62yQ P-mʪ}qYaOƞcn]6Rh@F&ojeoHmw>GV"Ua~MWwͳ@UŸy}͔Kϝ#]~DdZMńC۽ w_vVV!*fòe''[Kˈo2hcmHKYK2`&~]`G$ww"`Y>d>*]]Icspw?ܭ }>H=Ab]?TiNmmlY.a H|U9gȷC53Ί?=3ϗs,k#Nkhz>ȶ?ۭ#bn-t%>\6l}]^*]2Q) E d}C~gۯXXj:L%?+^kw~{䮊t_9'^GqAH⸃E>+[Y٭KT{Siռm.2mX[k{+m$$9hپ~cOՄO2n^ohSO4p9X%o'6O*R2G]/x]}m/i;d[xo&OuwYb.tM]I :d7WGh.,5MD"At y䙟c~o|m>a,?[QO RM/UXIoo[vϳ|x,]͌* 8>e$'LI=4#+m?>PȎTRYNcv vђkx(Ҵ(>j~nD3\JK1J"L?y+B+QE)Ywʏ;l}T$s>g[_뷶F5<1[]iWrͭCs{o51ixWO&7,-ϧ?n.L{_udgE ZHF.m}YO>}ZI{k}RVԬ%k_>}Ў~DΎ/X0MC<ȯSXKnѤ^?ݦ }|֚+c[k}-;'Kw%|3B \.1[bҺPP5L0k'q"o2$J}<1d?ﺒbwvgg-k"[e -w?;dq4;4:X|pmɟGT/${KQikbTo>T3NL9=oukOιo%Ϳm߽OH}+xf sZ-_]{#emޗ>Uo}tL#ΚBͲ.ehX[ڕ]x,u -A\wȍIWL{ɆooM_ߛu][2yr?t>ʌ%r{9- /m^HZ [DԷUu6'|lCi=jm_O ?|=mBgI$Oj4)qa4mUV2ɼsy{?:9{CZ{{85͗),AϜ.}&35bOGCY|:r#U#uxzƉ7|7Rxsa7ImmSxg'w7+V9fIWeo">#+2Yuag+oP<ɣ]%>ƉOZ2Y۶͕cS(/:{Eai&{7nY]{=ǺO~7HՄ#ӡB8-+ n7 ?ʞJԴQt٭ң+˅wɻV?2My6dVzVy+Ǽ~#է1 rLٿxUcG25 GmoVFmK ͛ɲb t?KMY3jC=ŔQtY,ndQۯuT :YZXL ˋ;Hh?۪}J^">r| mSMKˁac[7M?(:Pƺn M5ڭ2Hmѷ27Zڞyiyg/_/+Gy Xingwy3y*ytyv|5Ea s+v݇g\XYKmy6hYxo~iďe18I.9m3U'<6Y FTt:}ʲJꑺL; d[wܭ"7J 'w)7jV=LnCom2HFmIw@7r=p4֏Z|F\.Ycdo}7ɲW#H~wP V&g 'v3ݿen56+LwH{CGO9%0};Ozd772hyʅ;D5}CTkMXY&oH WAgim-s"]+wjw΋OM\9#yFs?۠H]yFhT]ʵ[;gEg>z׸կ,[7r ,?U%b~N.]wND4OϾ=m>gI ?dV\uծIkxnҒ:>]_GzvzX"M߾~a0\eK{{k,!_F\yO#??W-.=2=TyM=ן︞VٳḵfRғ[>yg~M3Rnl2sOK ]*=bby?+h2u 2A'惡tDՕoR] 1oo+Bm:k48ʶ\-6_hf}ϟ?_T?ҦsxK{Oy~L0y[?~QPۤsCq3?[_1a}$X\ǎ&Y/EnZ8a?ur߭K\KmfʵhjzV_}#spaǫ<^\NExY?ة+kJR_N7o7 7oѮ?y|_O k^O4h~<7W՜>!|^y "i%ͥ>QDhkt[CZG>q/M7/6y{#k*|%m-ԛd;6Ʀ.?ݑwDG9Ycm[e^ntپ)t٥ЙMċn 4#-'}O7;<\G:]I< GO5˩~c{K?7'ײbHS)I45~tݪJ"-JWCo?rw jn$.S?ų%fWCv۾W !6o",uh*I5cռm|~[o.&WWs>M*ۤ3?nn6m?Omζ0yp|<ۦj:%=| oWȍṏO.hɲ{v /w'~\Ms[}vb.H9m۬) /Hy/nݛ*ܑoI w{K6EsFHv“#*Hzm>uy"=3@hs U,xfvo+*nOEx}' 4o$DK$]J')~~Z{r}d`_Ώ)_OIUQt64~d&۳?/.#Y~[lVlnKi$_s/E3~I?;}@A3:n_*iaeK u}Xo8:dֲ,DדkP O*z=V?,~tk-%Bl]E}oɹCE܋'ɾ'vͫEƩIjoSإۭv*?u9wj9ƱW[ꜻd/'msB,6R#.wm»DwoYn2f6B7?m 7]?*Q.sKcmۿMjMsmqmo w 5OIqiڽXҤ,|.-TO||ٙRN킏!v;Q{Ȭ-jiW o4UG=QVN'cZ?eKo;[+0YȸHצLoԣmVUU(%=ZJ-13@UWe$:]fO̟uwa>oumKsmtD]ɹ|OeM>J`?Son'UXLe>oߕ[khY_;t?yeXx7DjI:wԶ`ma Zx[YUwwp/gowȟpg֯o2y'?VfPsZ*EghfO>!^9V97&tNZiDJmgwyk|vR_o3L.#KϸEȭ9I?"|tNk{{,'Oz@eyV?R(&>?\['TȆ%2!TUd@TGiGMWH[wZ[k!vܪ>Q#ċ)l$m*<ͪ*8co+]Zյ[jX?h,-cCn~vNچ8[0E FSJT> Y~Yw|=3kΎJovP: $B՟AjJ։g+2"v;e-ƥǹC#n}]}s%>6t䧑y۷gS7Vݴ@ A+#ټ:Bo?۪si63\F*9v Ѷf+B 9羑wN'6*ȋ>~k|-t2ӴƎ\@ۙ?bylM#m7-F`Zwؐo֓3Fi^G4I6ݻ:a&74SymYȮ3mZww4 ߬eo-zkkId6yʛ>O$B+ֈN69y2kb]45X\V~ /߽?惘Gz槍ϓd&WfŸ9h-󬻜}Y-lrb@M<|]YY*fT[CV~?ڠkk"͢2F?YyzgxhQ4F]߿}T77oOh#UlUw?ۦwmmߚ0hZ;~Dq&w<7olB%qks_)@g}hEb˿akH "yBկ;r7UͲ\y+>G<,bɲtֵX$?.?._$|Kh.vH,)7vѪ%%%ک xVɗY鷟4'ȞBe>kź6H#k}T1>~o;#T'dIk}]u%f}ُPIk*?o7<}i\Ff>oʊ3?ڦARk{d՘w-ߟ7Ү_+g]Iyv|7ȯPHo#"DWL3z\̸-fh#gGu6lwH~?XhvMb쨕f%MMo2oWAs-۴W &jOh6NM;)lIz^T>xWy_[YYU<=G +y>Ly [7z&u֡uqyFg,DO߹;Og6MsfXi6/{'tG/T -wjʏ$}q;|ؑ7'[z%u͂y1IqNȉ# `|mC5imD]r.4 ^84kx6tv[K8nakb~fX<7 {76]IԢH"ڻ/> ]7cUUIj/k\^k} ZV4ֲ[I7&w)&:]Rmi͹T6uy?j’lG~hq}ղMYq}/2n_q|~[mRZożwjvu-s Ax̉%uD(]9G;~9چo;*I,t]%jdY£l{ۻfQZIi _knSL{i.-w"y"Zڧ7ܫyj4()f)'?ݓj 7J Fc>ս? ^I$&Ǒ5T p"vFYP50Mf5ә&-/{6͕GllwO" [#x>E}}͛2#wc2lQ_$d.?u/z(~9Vxrqkܼj.ؕW+&x|}+rf}0n۷%m rv{ v}_.M}*֬.̙In']H% -N[kk>˲#D{OOZiofԮ/5NO6aM.gNX0y|lsZL=| ?:ӞH|%?ݩ&K?Zt; ca?g͊O]9k'`aGSs~Q}D>;Р;{ᯄijTMƛzi7a)oy3< O}Gm~Вd$֛=o?ܫk..-.$b{vMii>Y|ϑ*ldwyV'?5ؒٮ|.oomDA,΍q,ķ %APmnO5LҤ; >N#۾f+wI}XI_x~U/{ TgYL>D7h]ԕrlU76!<̌҄o)dWjms HM+9K|Ԏo/}PX^8x_y.?R52\Y~o*G y \<1GF Lg_Im?>%tjnO5u-VI"ҭ> tOK$G:oϳlMf)cTogZw)ԵԵc&K {,U-KTD(?}JNv8¤d/J nR{4{{gר[}̸}C{V+2TIh'fooeG"2h4a{?x}7_&dפ0;r&˗dby(wƒjͷ{2C `֬:Mԏ ?|U=.If߾?;ʵ>46wN)$WȈb%LxW!1Z^zoۯ宮SRI&V.տkᎱoï>q6^M;%kXשqӭGr^K^Cq /?}*oi=֎EdP\}]9>f؛c+u}5O,!)3jߋR N 4kZMprxtbM?ܢGJ'50ͺ%V%d1y7Mto30yZw~d&խ{!B${.+dwmb|8Eh~ݫ7O!Cs#{~uimʗ?:IܫlUO\\oc^C~>λO(1eHa~v}lam%ڐ5VS/aU&>^fؓ ?_]|*}tJ tI5RVo:-m&xj=U|5wosmAv!xY6>vvMCϜr%{h7|{Mq!UvH~F]MkzonxW[Ku/m6?G됶O\ly}+/h^٭-kYfi:͟#ϻYo<(>V=6 kKɴ?l}YV}h.#Q3[ݎxj!ֆK?[7l?6oV֡Eoߋ}6O%Y>sۙ{?t3T4:jL%$D{Mh^w^.e x.T>M`{MBh&"I_~gW#ؑQNvG"Ե'_/Su|ys%ktϽjnG7,LfeO#6|ߣt^t}WoU^Dg&=VǙ?&O.dz~>[kZNnf[74tr# Y͢ Οms]|eTNʖo/.&{uv[|ܪJbDR Ћ;Nxtmww%}|cnbfKy.?ucz5 :RMQi"kc+7G}a2[G .hJ2> ˺?|i_|/uAgF/?>wxaAzG>u,gWH^0;?o[XaOg|9\NM ٤=Dl[)%w|ԗZF5X^KA{<҉#LB=CY>VF 뵯l#8_w2iUL}HylٮR lMu/U<ܫf>zڝ{ԅ:[^[;Άro?iἨE3IR|/G_u1qVfEq,v?5]F_oj*H"_y2 ?߭udYGi?ִS#o'}~_*i8fuko][ajL]r?9g }c:ۤV;&̐|ۥSg}n'kug,n!ݹL[Y%iEͼf_ݣW@[xb_ݥ>a[yM']})io 9ujKx-i \ZZ,>jD摶: ߼Q?˲Ash/vyڒg|%+w99R t' >ՒO?u}z7 M1/:Qm lFco̰$gI]U~6YWSlwUe]lGCq.ݭn\)q3ڑOlnu-gV^ k[Uo'~ 3E5v&GYWҰ/oa1/.۷\y~GO2}{Iqpd]7Y[rH ]}424RoU7$n>m][͏۾uuFo'?}~[~ݷI^[ʈrevv}ꁗfՐirB&G}TlDHlc}JY"Yf'=kȀ'elmiR\麅x_ˑiI'w>~O[~ekgkyX[1|4wO v8HQn$ʻUGkG4K cu/)?n/[k-ƛ#kl}ȫ/oڠVO}ͩuM.ǿC6>T>RyWt}W24xxf]3д7NVz*jK(4e ټzRX2e|Z2nW&HEL?Z Mw a@|kǙ"Crm͟V6pY$7vZV\OzgtmoT9ڱ!I$ܻ!v4tH?5ُ+!¼c5Ċ),V2?Y?@dߵwU[&^O>ʭVmn>t?7]S]RIcoS~N$QIS?/Z 3Z|U{]nꚮ][[A$]ٗ }<t:ς|K?Gu xF|U4[Y"CwOG7&.vpǵKթݼ/+p][Řl_j4WkG.`w?ٳ:Z[?ljswM3<:[řEwY\ߑZ !iƲ. :#y[co#n7\ڛ1vvFwY꒼7nұ"VsF#7g,jpwcvlK+ 7 i =IOi )#kG.uz;2oM_[zwa,SoJzZ\^'u&aa't~.$i^Mt߬[Q'[k*ۑ4y,^q[+NFi2+ˈM$A_~||.ʓK w)n']1ggl>jO6t+}I._uH" -ܽmK3bB&$wLϘ}%$EIii3Y$?p,*ܣMep5䥷#okjQܧl8Yc?56%5y4y?lS6 }#L/V [xy}تX&Y%s?T|A:YSVۣ)s\ߟtM*-ET6V6ëZiMhnbr|<&[ (g̸aW*ב^[mʆkvDqm?ۤv+6[MHPn6#Œwf+c(~Y94}EỈj\Jv}Dw[6w;+IfhbG5oܩD-뇶@aWySBIy7}? |?j兞cuyfO:oiGPc%"]ۤ]4)w?.T1\E|qď,;"8,EGwIu4Z0^Xٮn-vyPȮ%}h~̫rAhyT27|0&߾=Atd}?~oLZC]9kae<[kQ}8t[7?Hإeƛq-aoqo}ʡ3w&i>tԮ//<ʰQ<-I {"o*f&dzEؠl[K L'Tl5yiqg3llH mq RXtVx޺vyY±)k hg۷uv;<~LöS<}G?܎Ԥ+O2%zɾG)ɏ?Vluk-N ;7 h٪nݹ0#T1LKZ.to?۪ʓM[=ٮ-H'mnfH~&7׵y094xw}MLc'r]o aay=K}pegɽcپG?Z{8_Xh_Cn 6+,:*\]Ggm-+-m-?a6sKc滴֛ϟ{߮gϹhn-?nfƞMտd6ω/t߶[nD"ˋrř>~\i>eR5y0=LWJq};C~2[So]vYEl̖wonxG<M7|Loc5X1 y]Q78O|C`)`^ytD"?7k׉ R/f7nOTXfMb7©*a':od돞gZRK9$R_oog7cDzB,_wsFeuwx|+a/ Ԭ-//" Qԓy6>٣ɼ5i)C$˿O2h/7'ɾ]eQh"-?9T6! -rٛ?T>t߱VB2I}lD߹۷lɼ97;%Od? ޮOOsi3ɶ{pzC>scF""g~w߳gʼn푽enkrFU.l22}xD{ o$TxWgGgwoSj^cXYt|KJD*o4mv[6eG[ZCfDܤT|Dy{8eYeFߺFQq%~XMby˲$OAe%=s}ZIʟ:Ut4 ']w$g|?UFGu%&湏u'Oknt7i..'?|?ž&_ CcZDZ>afjw)}mhğ< ;!=Մms/3,<"#t_>RSdy}w}U\݇{FsbB,GoΟ5s ݵ$w ٓXm y\>_otz6ڏr{o7̊$|x^fW"mqs[yuYdy3l·yȴ䤳}/j_<|O.7uۢ@!g Z_32\'ҋɧkt7O61 +i-ӵyM%o5U%l߶_=ѼD];RYX .#24(d䙟>X+Yu&縺6K[k[?ioy4;k%ECvkeWȳ7<)]Qbg}K>w'o-k.M u}Ny8Ηg~"M#dKl/*cFdoY7uIo;=]$5PZm\e?t ='Cm`HvVS|dOMym5fM>rBZb)5^;~|ݤ_߿+]HioXk]۟I)?g_*% V.Y\uz,ɧxԬ췳}ϊ(/՘!7NG.A"? j }jo&|y`7bȩ}{]M\[{EĚޟ,Z.il>oj#Ο%S2hoEWofSY[c_޿&/~oH&ϹrCw2}@# w_7^^K Kk O~Wٳ4/4>L.+ilaKk=S*%}lmt?>r[÷6vi߳MWTݽ<7q'7+_ Io߆| h>O=mKo?LJ {ۋ{}R E^gv|?_\ǃ:yOˏlIKtM*.͒~~wM]RPc/ߑ?[3ɲ/׊{RgSym.ٷgvH}uj6VncR8yls9xR2kؑƟ3\iWY7ҿͿ"˛iuߗ~ٓrC F;Ο.](ھl֓Hf7?S썕I~C1y,{'ݭk[IO*|:V~?M7_VyxfWj2[DfW6mF} wl$> \hV.uBl¥:oqJ[ŲWMJO74o%3%q<{aP>Lh7qŲoͳγv9D }[Y}ϑߪ uIlM']5keKFܳBdSMjkom"4-/}lm"$k~I Xf ,U ]&1wmo|WvDyn."nc?蚖2}\X"$7l?|F9$e~V]/"Mhbv}||'\{Rye~wji][Gg}iRq iX~I \=ŦҪ!j4P5gOkslY%߿V|<8i;}{*mOP{|n}½ofY i#>}|T2ڼGq&Ty_\\:; a~˻&:l׉ے+۪OoxٷV$s$SG\ѝH/,&eqnKyW( ء̗S;iT߾v$o +ڔG 4wWdI2l]5xGܿ?ܩe޲$Fc ;\A1M^E5_l8SʷwLypbXꘑRQȍ=o_'_MM5 8.흭? W#*B̍s=dJdqǹwHkXiz~nyyj"?Zco{Dr&Y񕍷SoIjPԮᶴe*z>E=Ehm*; _56՟x^D =AqVE5|g3 T{tڭ;HO\ܦe&e™azGމ(7ߙlmUdW&_;|>fZ1S;oמtl;[[m/-PO*xojKCdHV?/?9~_n.S$1n'T]zɧ%ZEo TRF+\GRy@zd6r>"m7>_Rhg߽w6yܟ1KO?qx¯]~ ﺨzC4H֎~V>#`?6Wܙܿ*n)7oT ݐܥ;W}uwVz-Z (r~_rVvY)5jn *-*#"HV৕ٳ\ٟi-}5ز{>/Z?{+>gv:E1$-ʥn{VM _ hoҨFq It¿seC-;@M ۧ9|$55ի?[^[ߓ=vw7aSCetĐ-͢}aaˊk;6|umZ4$q$П=n~wq^hbowM(Ӵxy:AlY 6HVV {ΣaHػWd3m7{#I]9-vc=Je|M-~Oh2'.vZ4Uxr15Оʲlo&inh=>i7ﱴkڭ/V~-1A ӣ}"/*>V߻[sm:ʷo$&-ri kF|^D|٩g̱lj)O >Uja.Hg]2QQx=;j—zO#}V4z^\dO)vq7YJmwTHzo㭣y ϿVߵ}e+g=q's8\I$T7gܑŏQa7߼}dnmo?kVn6,{-Cm/,T?z\ڞ[%y.ߙ &U}o}C*ԒElk|~Ӵk۔U ql?}Owϟ~!hGqВF(dUh|g?ݭO̭frg31a[ptR^%)/6ϹeeH:Dv6ߛb,Io@Lts{]w7Y/g.v.zӾ[LB$nb,<{Z-={G Ou_ Q*$LUXWD?MZWBЛ;kFܫ'ɲ|~n ֓Y 337߳*}LrߖcX%6"OR%a{BNb]X_j4[[k['K{{ȝ(*\\qWZPD/"BWwߚloݓgʖHFo Rؘ<$G~ʫ_2M#ؠ <͒yYjVլnKf٪~K"}'JMgDr&VEmjZryv0m^46z?g8yD}ڻuKrtt^?C*rLOtf+Λ')G[^}ݯ%Im 'ھ)3>ɿՐʑ-'zאX.C% ²d^lʨl[ifʽxkv+rn;}cYۈxi y?ح$M:t*C_]tY}-Gj&Y^kWO?}ngy2u'W=|{sYqeg"L^D_j"q73#E[:ɿ+Lf^޽lQjEкLS͖H+H覰mnn5{SϿ2yro?7MBylg{ a=ϔK?W 4zKMB]6؛?ۮdc [/ Lo7Tm&f OZ2#ko&DԠu_xS\3[ahn??3a%4~VёI$m֓C"Oi|IvZ]v@Z_2_XѪ:oOْ֧&oxn>_i3B䶳X?)~Ǫ_fLN?}7?ޫe;~o4ț~Vd^.X>iDDwn/gZ#~wnmۢMBCWhnآɲI~i?z*+Tyq*Yo¥I̶0VA [dʟqawLYudo$Hm{{+HDSas}o[=Zyv͑'YRN inۢj\f",to#k-lsv"iz<~λX1ry>IuvhW.w-T:u={JFדjꉹu^H6o.v>su뷒{j.Z:s\hce٥ ~R))̑6>f+~m}*;6tzE熏qrs4vd"?ܧ6cd}Ǖ?e{Oşo4OMs=F< K~w^x9|ﳉWd3C=}ʨ[?y63~}aVOo$+,E?g}LJVvH~y/7zoLʰVh_3Z;xδӾ]|S)Ȯǿ5^[j̖^˝j P=VX^eon^7ftp[(5E$lOO㫶WZNnZ$͹]dEwi|Y{B>unRM}+{tBY\˼l{C؛zlgHFxh|QNח3#;.&Iu*m7MK]&7m^ZE[? ?d/6gDs{fiΛ4prK&Zmo%OY}̎T\ד> F!w#mR$?hI洍K7,{.|ב6m?z܌J!y\jXզ2oa G{7g~Vji%k6F[}'9\{m5+]*@y6o6ֱC}sj͋Vdzka=z]@>uپѿ[|>⽥\~ʲ>??Vl1Ͽ^/ x^;{\GϬ^UQCejY|t?Ζt庹y˲62gxvC'][ޖ qjo;/Vs*7Dw/BN7dL'Ȟs'O0\q6?h]]ٿ?Rzƫ̗m棧\ƲIo?ȎLiU*;VK|jǕg l7BxaK~&y51j&1wlB:ocwX|1&~6}ׄI6cϝO8bƅwicjvn+H|śatM?Pm,XCaguE}oUDK_.hՖX~VANG2ȷn Vn9yOZwqq\Do7_<8yb?{#d*k\}ͼ'ʟ燐1tT .^T&O*ݽѽCog?3JzI4m_35YI #oۗΑ?QȈU zb-3w D߳ڛO6|[hfsaxZT|gV!γθ_*)qTAVc<3O=ھI$O-[1V3&Vmۼzƍ2>F&>_VE.O'73~~yuinZ9~Њ77jmhha[֐Dtl֕[KfmFn}?o̦4]xu(tNE`l8HWO[/~yS&VV?9u~e:qc&wU7ޫ&6|?~3V7X?;}JO!$T'>^Ox,t%Wduo 7v\\m_3xW?9OZR[!%; Rf䩣씗n&6(avrXμ4ʉw >S gD6VG>D|_ibMlKHu{\7ȷ _s$*}dDt:Ci[:?O>_._27cgW4;xvVǓ -Mw'|ܤSGglM@˷ᅵ?ڦ1y?x<ޫ7 #lY Sl}7O\?VyRIoLUYvD ;o.]i8|mvۿ?v'aOhiⅮ|cm3.:OehoRJCur?O1HĖe 'QS?r-'Ey^~ҩ"46FݺF_7A-:kax|_Kao,a4a;S}7\|I}ɿ'믞`Fsu,Cql]Jcڳ[6>_h~rnyOP촁vd©nGKtk{+>ZߠĶ5խI }|UbŸU8yzk2#ȟh֝[<0!<ۭ+5deEHׅ}͟TӫO]NiKO$ew닞fc/$cg_QV[NnQvD[ZAiXi }TcM}'w?gKCfސ>GREm ޺$f\Mw ?Xol5]6KKKt+lqcTαͪOm*}1j"No*_>]>?Z^xw:ψ.̞i_9X:mWXoykr?y tDW6-n;W.IK8Zi|ȣ/cuT]H4כ"!OQY,wo3vmsG7*܆?@DZƶ s`e?UGhL&O7|<٣L8f_}]{Qmi/߽( -t]y|ڂnW}h^ݵkH(>J|x]SI$Aa%>* ѾOlH=Ŭm,>5Um2 vZ-5jߖomG"'يwvW.K'Dңдm6="%yr-;̹oh<2yV7͟P< ~m12Mno'/ &my#v7I3ROn<T7V}dtToyaZ 4mX.ʥ5T2[y-Րͻ_܄_Z*jM_-`bw?ɻsYRL"$ gy˧%8#{OHmmmRc mJ͎ٶ%ğw*ȸ3ƱBe?q)ZEsiqO$I #02ϲoslY7N=5?wmRC+I4fܟ?nqKۃN~(nkȆ][<d[>UE7rݥEs,^oY#nܭ*ݾ-}ﻓZ1iwg7ȤD6B"}T`Uot4*yhTۺ% $!ZkWQV O KXZDKNeO/y %kȀDW~^7IaUv6ƏUΖ|hd+lu+ [;=nkImVEHq!\yv*+]}Yex^>㮎KԼ?Pi[Zy஁s~d0YBV[fM&ygPMO{%Ϝ=n,*<"lp3?ZC5;kO˿}%y ᶼG./]>2ܬiKtX[pzA? G#y}ݭw ? 3I?s.ʹ)}#DvK7PNKfM]"ȡ?:"\0t63w*gr5JsgwW <˹{+ts{'4&wYrmKYԧX?EE"'eA>ϒGw15jm 6cNbXIy_M9mK F}ved/ܤx-|]Hoʥ1=|Ͻ+s1DQƯ4",dQ[wC,L#HƑDVjܖЅSO2y~W{rLžNjhD/!x|7S'b\~?Uz[cn$mV_oQ!ɻꪳ;!$/ʿI$gA~і>Z(\I&ݢCխ/K{CNӿѓoykb;5gӵh[nk_W8'Vgyvgf|48jTu1'L}jmRʇPzCL9OrC빿x[G#4isŲmᄌ&`gޭ GL9س4=1~TT#Sn?y|R,ΓO=6.eO,5fw鴻=A~ح]A9ZAqwoop=mWMtgkoXO+n5ڊYݿr#oK˳vf?+UFs\KSIpU&jNRK`'WW sBrURW~Ry-ڤ:z[~t\SǶM>z>LvIVxVݣH]붫Fؠ.ޢ fuMRGkZm2 C$7?jo-I"ɉdf_/eRto{?oW5##|_yj 6~@[}}:)-zw@L~j2~_ZiWoꤡ7>g}̟}Y8:86}_fjQqPwٳǨ 3mKKxݫXO{omgmyyu/݄l7 sx,?29{Ju-I@V9u+BUc}YyT~?ĴW(ey[2TI./×>3%Ʃ{}1o`3ysR}? {ƺt jᦉ ' CkyMjm*m:ޫ+_f-o<[k:Yhoof:ZIq̈S+o;{{buVkthڥ[fzg K>{>[%[l>L2D5ӭ[D9$$O?>wO~^ {ǘ)~LU,gqۖ ;δ9eKi{˝:ymZ$'?X 3E:_-Z5$tJ>cxF1<=u[+ /#{{Ϟtډӕ2o!urm"Xv/Q\C5$[FzJߑwmenz}֨hRR?V$ԬBB칍*rm5l[ ѷ4cNm0>=D}e"l|:eՐ& 6S2u4Υ#a>m:{Ko4s)wOrGb&y{hg-GJ|Aj^z%t}m;&J4l>g|^k\EoofMk=toVBƽƑs@՝ఁFa74>|z|>z$vhw*&ofԵ};J4=T!.;5G~gW mpRZ3loamf;,?ئC43)/nﹲ.lR̓MƘ$Ύfwc业!渟,?cHKO&hԿnj{Ibiy6 gh/}e쀖DEhy3g-Emow/qty~>o5\Ԭ4k0b5t߳z;֑e-"Z|΋w&dO/ޛXcۖel} ;fI׉lY5t)dfm6Dny'o'M*]6kŹ{o뽿=+[M-÷s,l*_/o~&1W_Չi"^?g^jhϘںI$o;Y_9KmG[[n{*]U֓ig ZܳGq$OYlm?+lF!D+SnV#'(/\dм&dO;/Jΐ>%~I&*d.n'Yc]?+fXk8l:y$dFD}e}kk}=.m 򯚫"qB {?O^jwlw0٧l*EXs GJH^/~"6k[yy?+:i/fMGqo8[ԕ35olMvon+ɤz9naވU:klg|V}M]?\JGlKO?&[9f-?}?_a+ivIC?;dbC6$}z|WCۛ{[&x.Xb11Sw9뫭7Ud_yNROgIssķT3T6ҏpbE%hKqah- AXlڮĿ]x?w'+Xp%OixO<؟e؟'p7)_ũY]mZ'Wɬ)mcBy.WϸۉeD>of}\Df}=:ڹm]6ϿJe,J >|zN_EU)4MzoMuZ/tny?fɫMGjW2}ݼfٗuusM'ޒ?#.ߡF}'kjO k[fLo'lSV7Ȉxwy[a$l}aijōUL\=zo=yي[laHdA{H?WbӤ&6y '%Mqڬ0m^O,VHLo-y6m~R;l7EIi=qeeO'_Jɳz?ب주&aRM"wPdi_j{_#c~WMʾq.a<^EAw죑ɜw+CHh]C+uy8ߗOSoҰӾОj}<㨮Ί\$յb?{\R4UV|OerEZ%z_%}`ɴ2}ϻUI6Mfۿdgݥ[-$)vsegN&<]jk]7|'ܫFs}qs 3ٽWDMrywU{-{BX{K ҲLwGO+&Kfw4DR,abnۿߖD |;Xx{0qoq,|P62&>2i1ndhO1.}>ww5gfNo_ѯ4TxZOA磧]s?Dl 7Qұn<燛_.%#}fL!/M{D7O'u9!1JѶ;04d)Tf;ΉAy~o?ج&Wi;k?:ۑdfRmʞ8/~Տ2%̟42.X~}cGKմJMO{{br#!QaDG:fRn*Uɥy.Q$sGO7o$KeH%yw+VfS mSy,T6|U4r#vɾ5Kˋo\1me^ HxkOֵ],^\X\ܫOIt$ɷ+I- ֯gso"Nwsb+R L>o~?{J+yt -v4⼏˹ 3]50\M'T}oibw{wjǿO6TT>K%ٷo}"woCښ&y{i>.fm}V%Aq槗jO)W67֗:ZQo*Y<3]r/c5 `]־Z dtOKv[+{o7'S|'?1nW]ҳ/2߿=Q@w!۵o`Սpud[-Iky]G[fscBʋk7&>O='n9ғy}^(̒7h`L7sPO}sosM~;o쨅X25bD<ȶnfy":|b?uG}?Ż+Ф_ujvr_ ;D`lZ^_LSo-8Y>_]6Уdi>KW/wm)%DKk?ymiM𗋼<ϊo_L>zU6iRݶĬEeGM#[]%Wj:ey|vO-a$Qtr#?hQZ:։{]7:n\yWPL\$t7)4duiYE4_u$m+ufXfl/-8f?'vͿ5dm$Z_Il|ܦIe4InJvoU׸F7,qysK׽|?S]|M RSRo 1$ D8yOqjv97oFw}ͻzM4EfܻWAcygCmlA6*{CXRJS=5O;U?z^o#Hfry;#H]%>UMn r_du{m/cSE򡐥meϾɬh@>6\;2Ƴ$pwmjsƨv(BwI%ĪoyI)ꭽֳ[\|FwTCrKɼW3f+ɽ?0Kk|/ު*fn]Icv?f(}*!]GO sO6ö]I4-㤏 i? =Sٞqͳ*>tvHg 'qhܬyo<ޱKx[V6ZX/lLdVeVpC >/'_WG&w廒j?K.LHMͽMo&yI/0ic۷u2Pƙj''7U%J0~GEɠ]Y~ >e)Mh^9ZNcRoswy 6:]w6R9͆B)ϕq_W4atCK6?{'a.Nw$yj=+ urR5-^F἟͊>Uଈ,ٖgrm۲^\\c/=_dй;hpIs _5[LmTagTZ<׶,E6+K^7\4䩔!uݦAÓUe$d?R#_soT&Dsciv(!N{LHc_3}M5K ʹ[vlO7jTtsO} :ǚM/ce%5B]SPY5wvyƿ5IvnVR> -?ov*8b>ʬjJ@ %_[;ϳMls%:߼{A##HO_mKg?{S0yV]>洛Qjwg%.-?*fLntM(/3f祆YUyV,wwCɎ߱k^D']?h6kjDGG۽Sc<|Hl>]~|?T볍p3B$7cAfKdd2hO66O-.Dwu=F寖isZKH&?wV)zu]l/Nbhwsxl,wlO"$|Z:GMy;czSQP=4V1gU%\?hJ2oܽ?.=Pv.괿)(.ߛjn]0ht[$]grqke15bG%?L{0s'6eٿ}# UfI՛WkO\tb/K.5w]2}ը4)UotX4>2ȵu[޻[wοAGQ;oڳnKq͌mm=# HMk[$JBow**wCw*7`d<+{ʴ4v >c2[^omK6^OO*mLSltˁo=Ry6.wQ"m6h'˄?3&sg߫=2G$w/+w[6lh 8fђ͡5 ]y~zl>OY]Y-^B-7>JssD_p>oe\Kqi6K4\\ܲ,v YgX繚CLfo'Sɩ6$ɵɳU_#WwJմL&&{7+OZ0>Ё&؛.smjbZMz6w[Z0BJ&t>֙]oQ[mtM2[(0H jCܿM.ܫLks3Ar~]V!yPZ9kΛJ.>|n͂(>^n0S1;W-H[|쬉n乹o7t߮>5ּϩzMK>IKKYS<7S폈56Ky.n-.E?6Tد^FC'n6{s{H}Yyj8O.nO>VuʘfU?ߒ'ٝ=Ş#67tJS^R|hfqsڏҵV4t<]uߘWHd+ޢ2)""W?ȯ߿TWe b[Trq%t4#əw歭B=6buM9 g%'uOĎO{XN=xi#`AE{+4t3_y\E~"OCw>}>tPfPYթ,_|;s~O_Y[MQ߳^GԆ[[)Mb]r6[%$]M*4/so /1ul{w}Ո-7;Em{zgw?ٽ٣ۮۭ{F.E6kV^lY=kȂ!1؇S{{Yq;4IϹYQ}̋->[[[wW?"/^Ad?5n~ $ V%g-KQH?*;;h+;k;mq#l]:rqԜj>f9aytW~UE[kyV-dm$YoH<أ?7o>s+8Hcf_|[텴mΕ ݴyM4㹸+g)Ot$f4G#IWhz6KN.V6#G'${_TWP*q5my$u߳*ha?gʏYB-Zyr%ٖ/&?{\[)툱gܯoؤK0?=Ҷ5[1$,.wG>OXLdމ߮N&l49]BHVϋ[H\<2MԑQMS&کO,?y鲧}t{2cINywWYkZiv\G^c[E߬&›3Q6m"liDG5_vo3A"C[Low?1ꅝ@eHa앴; j̩/oO)~8dc+˹Cu} X# ծ*'bl|F9{c:V^ Ɩ<kvH%lm&*OJ>OK|C᫩/ xT%Mcu5`vFO\w(%ɷO jPſW.y\8M|g|/=f{>giR隺p?ē|;~|ڄV;`KkF޿/I3*>FNgi]+?߯(Եk}5Como2W̾d}׊\o+}? mu;;UԡUT_ho;By-&l?m_*9AN{ 9Ѯ1Zoq ߲O;۾ZNj- /OOmfP< ~O\,LΟݷk}SV&5^[|ViwheY[ˏ ?O_IKk3'ߓT輝cRƯgZD/7)'GFEho5GM{xeϿOlj)<}/=vw?*z {g;I8ݵߵ~Sp{8/k-nNyg%ǚ'lM?8_3O~ҵ/- }lP𖕥 w3Ƌq_[޵/˷f;_U8cCR]Z^xvj/-:)o;l1Q6?>Jkm/~heuu>Y["G3{%O/gڮM&7byC?Et?-4u>~'{;fh{Ы%EpUc}Emdݻ}ݭ} #xhd2h2/WO?o x>4nCmb=>/A٠؏o1>y0>Gfegڼٝ6v6Vi2&dceV<߾&_:+m4{[#jt,7ϓ6fϓ{Ck=ĉ ^\m#"vV)|.ݲ|ƍ仼 ŶROɄwƛu*P-sbqh7R%Z4;y~=tM3]2|?J-cHltYY K 7 +ĖC俘;mv>}vkY<3 xh@G;DL֟ꕢ+ڔiO,F]#(n")ZYN6b: ]JK;;*Ub=CIR7#Vv z=<2'$KT}rdWdix::l j_o9|{9gVkK{CfQѿ}\WZqmhh͖8WdIyrUKGܫ7Ͼvoث3B-qrM鍻o~X"K{[JuWdI,qJ>orr֗!7u|ɗt 7?GNH|||!j,}s95>C?,.rRJotџTB"ϕ1+FΒlE|ʻ!?g5'(?+)ǻމ'UDjky=?˿h˱jHPڞtI;|͕귚=յ7%.lգJhGBlzC߭Jj6zy<ѮjMCFH$[fy#x_HdmvLgo^yI26 طCg")%/1D?־ݛ7w:ͥ7e$HQ.c\W>-̿Ma%2<>T,A#El0wK:ش7?loɖ&dIw$m%i*չe?6Ej6pY|ց oTK2"Ty9y@G x^!j|'XV4B;ѵZgXTR 55z4vrʦn&-K#HgMq~W^1MoVٳYmD;w2]^;9e{&b"q,NqG~>]5e;\MIΊO/rݟv^v!yä'Y#.~P߳Oܗ:/,"'}յ4w,76+B7|<ة,~o~ŽI Y#Ǖ}L#t6qVdu$[!Y5+6Tf[&[y3V8r۶ɉbtO=~ʱxвiyog5]&^9 ^6Ȓ53bYj|Ru) y9UѧZ6۽ﳼ{~uPq.botuu̩qkIT{MKkξr"p!2Qy-|oz>JѾ"1 u̿z9-DXEܭo;mXD6Ĥ3Hzlq.\Bݿ A'J?]\Ӣd|ۮby.ͼ.=|~~S𬒌)>~^̐2HۨF\#Ww?4 ;N?-|?>KO]q̈ҟ2Hwh7Mŕ_2jG}%) C#$rvd^W6'ܿ撚vmj#>O;^o|կ"05Ls?zc}*/DjHK_k:K>GFR6Q)?EI{"$J<简/R鷖:9[\}gٿٳ5 H|gݝBt6W8DA%̿iy;{:5kq&謡mCY<ؘgQ;ҟK" OM<.Ffl_JymI+nVz& g߸7zyoE@ {rS.vͨٳ/z޼hryt }/!0.|,*;GRy_~/:]Y{8;"wggʟݦujAݻl}_{%حL[3N"M۾?$4O:I>VB]pէ@KBYoO/Eغy[U>O;?r."ސlUmt۹!^" &P P7e χ~}'*?Z|k@_ki%(]w+gwukߛ+k}TyYWO2?|gk6ڽxr6f]ɷk>_W4koH߾Ot]W0iH~8J[ܼq#e;σ|$q˷To>N\UKRxzOi~ר t[cYX[4BH,%<ܼ~sIt߿gܬbswVK-]$"ӝZL -j>#txWf3p\Yg_\#HȞLcI*.o i^9W"O*H?t̛L0Dճ|/ BJ +?cBJZh_=w>}UXcv:EՖ0hn-~Ծeq?kMPh̶+XDSt?q?=˶vx~Tl>EyI<͟e,e1-7w:g6i 0ykpKpZsv]2]<3nvnqu a ?g{}}awjZZ݋a /vox~\7ӼQA}B}ɠ{_08;OQ~ӥo/v?MYWU2L$GލZmȌ$Voדql/@-<"Zkp\Zۙ?f9/ܛp>P`g ,mKǖGr-?'Wc'Yϙ RSܿ4 Ǘ-7m$[%7՛K'٭l^bl0WMwޫs_ '6o^D]kkO&82iWPi.o#i|1AC*C+C47v}u^ƛmtO ujMr5Nvl}oP%ϪDe&, $W qOlJy?zHfϓ_}֞tZh_&U.&ȖڄjG<7f}Sؑ)ndWY.bl%ݝ; mt氒2yV[?j>OQ\ZEʹZX. }Jܿ,#X){4y7r3iM3Cn_ߍMi;["o(g}pI-}̑gTpҤ/^o:<ΓO{5MO^iw-Ͻ?ܬ[.ĎOO lSyG{&#ogϽo IwSx,;'M '2.>nǕּoyM$@boM'ygs2$5--!m!T7 WߠfkƼUwJ ӓR[_RԵ+;O;*>ԅZo>H[o9e/Xڜju/M]9ٷ+bK.72A*)/m-qyL_e\oGv:>8kTNǵx}_h>?/|AaO*Xj~L"?l_xcG~|d%|x#_GŬCooig}_jvvpiWz6;w%O}&{A)OD# `Ɋy$2r-Uw-vF2Uo/m?H6+̶Ooٲm}tv]Cms$zjl"t}6tV7>NZj߲\#GfKaI< "z'|?TWοfq,tGrvkjN]6'%Kv?\Zޏhe Rs[R-˿)}HKwb|Hg{"*q-{rb {(4>B,_IJ/[4ٵK;?Xˍߟ$R\ios|똙MC{jy~OVXR|Uw;?>檕Vc6hwVl&egjP᭝>vd:mfXkVmB_6i晿6Ts22y?z~/ܬ/hi!8tInM?9W.u}JG} +I5\n_ޥ6j^ /5]V}CW|R}ƷInxw_߯$P\HRi#~9|^ΓomCoԋti%uVy||TFF3=w~-Et^ n4G{E_s$$1:'SZF{ҧS9M\-t]WS7QK5D5tbsh;!B$?k귱5DvIm K(d NlDzC,7 -Իxڕ*pG>FhD3 <ʼn<Пۇ ǚ(|M-ǟi|Λ?'6b+P}i-줃<j7%;>e/>M"|CC,gB9Ӆ+Y TD%͎dXN^g~-Mw,?oͿ*j!Oz6߿|mGONt4=2T5]3t'׊'t??߮s+ywvIsl/`_C"4x>zŶ?y5zu3繑)K?{k6u,aשׂeo[/؎7hf]?T.O-P3\.+?nD m-ʈWOzN54M2<}ədz+.ٶPuu?dԯ"m\Mg}s[';t%Y;{7lP/>u M=T%?w?dlhL]JMv oeYOEq,hO*+gɳ}Ϳls"5gkok.1Ԭ4+-7 MYR&$Uymeywmgd{ݡ&l}tq#KY=6vLK?YG̐}|3?xYUΡm}7ϴ\|z|%y[A,0o$7^|m/E|;s?+MKUG)sDOgos3q$&V_U?[GټݻOdt}>]PFy[mR䈛=žux>;5[u+s4\8nnnnLR4qD󷒑?wKr [Mqf|ҧWau KĖɣZkq&T?dwGOO$H3.l缼}"?Sy7+k$LHtv$?7ٵ XVP|[d6U7B["U ֕G,~F61>D,&Ι-'C+E1b,[](E|M寚cB~eiE5]n_qLI\m̏[̍"˿@XW GpvyO5̗n2K46A}?ت~|mkW2yG5>ne 2S[B#h6Uq.o;7zU31o}gJonݵCKQlM:w}i*G߫9 -h2ͳ/+̛nöy3?XMEf#6|ެ}\LIdy̅[7_7?_$$H|V) k4$_.|ۧxu7ټa#*h^$ȶlѯV'7AS,HȞbfݾd_4&w>BK ,o!ͷ$-'Q.'۳g̼{'}]+-׼uOkD%$~>D ɡy1yh$Slծ@|A/:kH2)~ucVuk->kId|+2_HN{i[FB(1end]Sߪq^^"],r7'YHf*C2.E_ԭuud۹WcydS{?ܨRY"D%o4N/?m]ɍvy*K$6w_R$oΓ֬Sͥ[^i7/qZ6uCFL~&d ^M#GHuǸ?~FmK} Wt#>卿~}CoVfhRKwOzv}A&kK8m-5a0),1|ܭ%Z^Zy6Hy3DN}/z%kȍ7iĉqs"=̋f_ݷ<ǘbV욕o]v|Vxt5'մ緷7cB>z0ɑH^O)y[*D\Mc6x,?;n0vU'kwt/cvT;.hg},smR nϹ3nzH+H̬M~j9{['Jw5ݿ?yW5 2.?q/6ߛڧڿn<74}~T7'fGǿBÿ}ؔ4yyW/<=kR)r8RKK8-pUvoM !\]_R۝,Ѿ`[$o&hlҵ:;Zomw [G/N7F\6Ǔ'?dd=w}iZ'$JK扤x6pot?s1X\\-=?صkR[tͨ.Vh*hJ4O/.Xٞ=$~+~ϗ?~δkgx ."o^eo+%5j{z}랤𖛠^xG^i^ ~=O-_~·gcpVHkHdЛu꫱{L֯4kmsyIM–[:}W7_˙\5*ylu;Ɩ py\wUL.-ϕ.d|/U##O@˖7#m߾'RM5Cm ooT]^%BconaMԧkm.M?# &-l-t!gyf߳%#£~ڷqjlO+9̋1KSɰ~lOn'1.2Fy Kf=UqoӬ2ȦoC3>Ԫin{p]وwYηr%_ =fD7)û}h"4!{8m&Z ɣ_ݫF"uK8)T<+3S'2VmKoup6wzu=TG?{ΚU$rcf¿{DW6;zx9Reqdr{IZURKt եj4Þ"d|Oڭ'۩ϙ7N/ ּ=u}N4OUcmp>ƻco7_O?072noUf^Aoۨ1}C:ԍ&W'9VRf}lm_uswv[0|cPM6XbX.Z'Y [9WʘVɷIUQcM@nH'Kk^%H3ʁ7EZ_w>_5_x]MBI4]i6l*/"Y$<-#촀O/#?Fi۸ٳݮ >[H3]xz?-X"{_2ZIco{ ~hDNe,IT V)$I|lO3},<~ߗ*cv"E$2CM֭f=.-KQM}\BgIcw>ՒIn@n'{:FRÏ)C+::H_1-~?Vx]]ڣaZ{B}X嶕s{uR_)b2?6)#$h<X}v^5weSD{F[҄Csvδ*k?ѮӬ44]jZiRi}t]S/ۋ_&;iSs"nv}^ԥ&w[rO#Lų÷!7rB߳#ϒ?jW1|I͕ٲ?.i˟~zE;Sz6ڞI^0}@'hGR,k䡎NSO6}SVKYnvZX鷚奎m- ?Bg*gh,ln_Nom[M-h_MkQ] [#}cr3B|uZdtZK2I4~y5BR;V'47SϗҵhnHEl~op1"n5m-Q ?i*(]q}o50B9gyRMrSfߓg}V5u=BOl[_?ZS]k^ۮiϑm?@ɘ^6ݹZ"|_fƠϜ̞BVH7۵5CmqzOkv$Wks<.?ϙK}F ;lo"Frvf//uhBgVnſgZyj|'nkwt/}W#eͧ?}Ԯ>vSdD~DZ4G5vF|Vuof+!Qh&|7PmR7 ɷq=k! h4-kK8vw7%k蚽2>'ƥ-|?&r:Ns.558⹞T[ݿ PFϝk2>qԝk[{Kح+4MQ;du22 Rbov+jYVQifrݺyI)?Q|г쮵2[tbYG+uw%]vob=ål앩a;˘ e嬶r%6l_9fϿT/VdGҬkCC'ξ_?uYF7wkӼ3Lh埼%`K,ʙ '-ż2Κd|>RsLF72Z FYiI!ߏSerJDy5||8W6}Ժ!wbkyy+LBXwOl$^w:k-7[.8%TCϖжّ3v%tC[ʳ& , }YOi|Ѿ3~Ī7O sMqR~ems#L*C4W :[=D_jZVMiֵ7I-ն~lmCMKbd_d2\U.>]۾h_=J<t|UV夹X;EW=>zdQG -.WPjl7ono/'iڕ7}HMM|}&ݏ_KRmWN4[ǖ_.(?޻L=˭UF խ/J Jͳ<>kOu-ΗfLжٓ?ҷ6SjPWf;aI!d[ouH|1-zϳzηPhkOu?U}w\y߮NnỴQ+'巧:?&icn卛BfDm߼NW-'[CKYޕy͓E4Ѽ)5[/Monqsz y}Gt7V+!bдK]}_>HY{Fa=׶s^?gO;cIٿjkml:mZlomKDuTK}أ3V)-K xV7+CoEŹO'Wqw}m|Iy/tm_C>ku7l?wr('\}O57ZddbPf`c]f//-EeͰ~~Hqf.H{;ɳo-\‡ӯΩMξAlҮjֵjZ6ϪK_e͉ٙ Zx?56KC^[oEϓl:)['{y~Jke>H#ԛ:-r'l~xOq&yn[%ݚGY\\I ʁ~իl֖w]O@BhfMnۢoU?ĿW/\,3IM[m}6]][?oXiUŅuo${.TIHwg[|!)Gsy_'پע$zFze3M2J2l߳loW~k񞷯|Aܺ挺_;|ryϳMOﮂ~o^WK5D _kS\\|D؞J||sF.Ilsʊ% x#6Uem}7JU!r6hA42*oH|pੌdi2own|Zdf׋u굽7MO _ko/fly7<3}R%SlɆ{\ǪwRyMUNݦp:#ch丒lܿ'4KSꚭľUvxM1N.`/ַ߱"$.n"Hv>uoh1,{>woTsT Bei&v{N ~/YjZo]-Oּ%MNеKA-4Me]˫w $S&Ri]b7K}v؛t/xcDž|l%:Cw6&^s!󶻿}S]=&j]ƕ+D(| R?js9j_No7|:2l7)R0d1W^s4h保5E۶EMQ|ӳy 1Y~%uxfI&15z c]bz ݯ M#uI=/%=oq?402.WV}9V?y?~:h~$W Dfmͺ42>T!x&{K5{ ӃAJ+y.n&yb~6oM$O﬙^_fYG_Ye[}.X_U;+CQGmVe/[cU;Ch`飧}US$f?j{tNĒhW?3+H'uHd]Oz~)xPjtۛ V(?=}0U>Sfwkω^'O~'}KG?ZiipXow';4!y?c*\<2+no6S-i2"_ܯ/4G3Hr|\ qɏutOmkRkȿsg}'}BMMW6<*gBj[g+cD+FH&{w]HbD;g0'X~Mj7:V^2=?}?͙ni"}#O3=d[Ѝ%K *8"|ﺹjzE֓q<^Ԥ/2oϓtt"fd4o W1u'o*mB}GEs6 --wmgO o*SZ1n/$-߳~͟gJ?e F n^_ <-៉^=Go{ŞWͩOk˥?3Z]8󿍿V7-M|ݻ?BRl!{ndg7?7ͼGLwcq>( ~fH@]cgwwxJyN9y|ߙW?>1ۥ:$ѣƻy/Y,OwmY#gg1tFۖm>е!txTm>}7#LDf۵~6\/f6ﺳ?ja0_߮5+SwV)'VHئvl6|>M~MOgoGJ YǝO.7?) ~OQ5G$+7|[&I}I\g]7Ҕ!Xf IQR^ 5;WfB"/K?ZQƷ[$6ٶFV %E[IͫBI[5emBi?= RXկKӢmu?V}Ց Eۖdh|ܪO8Ofdr{Y8x|)[$=iuxuF[+3ʊ9-ew9v-P'e=/z{7:σv&.|%s,4MKU{@eO~_%߷笉KC},E笸vI2yp+FW/xc?Q~EmUyusj-5(Y J|\+B&w]oG2"F_~g(LHR$VrbmHh|OoWHRIsoڟܫ_^[Y\OQ+i?{JL)}vS4Owa~W+!Γ۵Y~J X4Sm]\[GkNo7|?;?zaHRig}Wx;گu(-&ÚdoN>cOp>}wqؾ$ȿsbOԵ[ ;x.uqvA 3gu}BKKnl |t7VԵ+I?ƚMvH\:5k$l< .rbJ1ӻe?>Ά幊[=>JՒk;yHB&U9+߭X^+k6椏.m^lfK;;k9.&Mѣ?L6WYSr<}o*少hx˷Wݸ_zy^YY?xFgn_o-xl"Z~j$-лm&&v5 PiK6pˆ;}ߚ_**6b3wJe{FGy敦e)ΞvؿyO$hꟾ*w}/<%7-HmfUjyqy Aoo'7ʔ{IPbJ]\C{i]8Pꡎ.Uݦ)嬀ԗP\]!dwz''56~]=ȩo$ LWfH yGlOϝ47ƻ>YmB8R<'wU$f^a9@O1[dwnۺk;7#dԒ2?b0'?&Ȓs߭iiiz͝mq,guU]K+oZϧYyQj,$uBMiu}3$Sq#˿~V]sWKػ~s&735xIy|MP9c3zkgO?-&IZX~ք6?Qȧ%ia|t~xnZ0qyLRMڿjO/g?Yb:]$RWׇ˻*ΟqgloRFY`n%U`0>yѾ lۙܛZakzhZ;YMS>Tx$v}CO4}KRo}em:Ů؟9Km>WГmfef_(h|پcs' $ws^qI7[ ּ7"l>&/wb63\7UHʬSLH.mrdh?g ;du#)GEWe]]TK}>b C "C/&KKӋnf-G,w{wwd0;j-3eN|A6v-]K"$.?TG!_x? mcu_M, fo?>D;?ekW)oGb;|fg[N-̐|ӥKh2/tDy%EϽ}֕ z :y,_T^ktq֑;'O7ԷS乼 }a]ZWR٥g۽ˉ?oU,14P6]vquϙ"h-̋|G#:m{72 meڿqkWMZԺ-cDY%Vڸ%x0]ߺO:]'VucEjk\ۺ:;L68ٷImkx,!/)YWgBk=\6őEO>Si]O͔om{/α>5kg\q\--)jY72[boko*=VI'!E޵@^ҴԵ+k7%.s#7_r&xeD~Z@5\4v.7f_bH&~oYqr:+yw׾j$V?;D'ߦ˨K ӅC+3 _WeWO%ڭ+$ysM'fzȊiI>KYkwqSϹ@H^Zp="NKۺO۬նWYEjZUI/ٚcϓM]9%X&hE/Is_ꪟ{Ԓ4nfY!C=\.ݺ<}ʁfoצk'x$p7.RZ!:)"/#ǶD֬KO\:62YIp.^ K=|Y[zFgg#sY \@wk_%>tt~{6a2G)?oOue41G}!yI?Ώ}rwPLi_nAgmϙUUcl?u;>ɰDb?2}Qbtg^ZAq+'mo-lԚwli'|?WU]fr=Ok5Bvvg:'sG:+{إOx,o>;7;弹zT7s?ǟG"-T4mtեlAKHQ#Pv[?GhzSnf*5?ܫI6Z$Q}_2TD"O|;O$:}PAYO<?vGF| ©u# VG477)h#.7!w6-oIom5Υwż~+Leq2Gy ܻJXmna5xubJod'Tz}չtSʿBm+">w{WLUfz۹=Ѯ_57'\I6'uD?I]+z~q3C.]?جa&/ٱ˱ SO^gc}z>x^J-7Zݭf&GUdo2/6lS >5MKJ_ea޺m,_o릇Y|Db?mԡ?~L75Ifx>~_s4 o2khbw|]:O+sjMmwoPIu4;uſ>zΒDVbH[n7*y.ɨۧbgO=>_t}أfM'ṚKh'l+7b};Y~kwF5-B}.}ai%"Kb!E ^$kvd?ۮCяTYHc^/Tr}_Od_'=o_t\ZijQ4hE1;>Y>{}Ջ6ϲK˄GS[,ςJNdpd55nm\[Rϓʲ]4e- i s4vttٱԺO.$"5y"x>Β>(ܬ_1b]ŏdWO_; {x'Sj}|}cb}H%gv?nAc MLQ|QI<]w앇y}3#HwԒ]\I N!]4qCGYd \\Cjݻ̈#{^[gSMԟf&K5ԑR!bP?9iheɨEn>֎a-j| 5E#ϑeQ;N] -f9 X~SoLGKdOrZ6ֺ]ޝV-;RưkmgStw][ɦWQAa%c\e?ܭ}^=[7l;K?~׽!#t}f+X/س\|46c6K_z":?>M?§ X$y}o&Gݶ"/XXԷcK2/?fp-u'J 'q Ȟ\^THB̟gOVO2D[롖{!-d®~ln>~MwX9{F\CzfoķUg-g}f]h i7>[M\:K\B-74k˿ ֓foxPK_":=y$To޺W:ǁ}\x{zQuc3y'ɹͱcUGszV]o^MWU5>Fm߯(˞I-f{?іݗ湢icN] 5Ǚowx}:ikgkkSFG/Gs3̎6앞v>*Zao5#I~geaZa{6ᶢ:>^i`ʾg2e|yޭ5ig<qos2lȿu?e#FrOuvKGX[o]w/]ʒ?ֆ?u+Vo-/@ $p3Ѿ߻#x|a*}|=oMխmms cag@K-$72}WoeVv,Zy_2'iL6*bfH6&FwR[HگPԚAŌ$۽[hb'O+*I{ɣ_+t߼?ZGW$IBҚնK}Տ:.[im?]o/?O?^?3M4}Y%Ko4ɏ|7^!2E$)}v}606|a:CqEonfþI?_i5?MCso?oJ\M s;)j7'h~2y/ -S̩hckHwOe oY?te턗^Mfhy ܣFTIVٳk;ˋT+_$ܫ/kx/3?:/6lgt~W4u+k9HUͣ^o+bot??V=7Ͽij]i|Oms\=ԩ*!wtgi#g_7߱3C"oic  {f̲Xah, y] V&W{߯Lm"J>2Z}ޕ }hR./ܯ=٤pVf2̂GX{_L$y6{:-v}G7_ _+-_7r7UfHfFm|hĭ]>@u@ݒ#I_?/*+䛃T*/?ئL \_M|\73Eۋ&g2hGk?ߢk&[ez֪Y- yto^G/{|OȵN<ۏy33>'@IG6?5V?ϷuN/"۫G_֞=qߣtoUG*ﷂhSl}n6}Ī܂&mfri 3E A@Pxcb-5泸ɷl3*V;xV%F.i rvyP] n.B4sGW+ s[G}*\ɵpOG#~ kVެMMj Ieso-m;y>f %eU}$o6֎ .XO[%i߳+:Io/&5jc1^߈+[:mk[Kp >O^`\ּbbh̾lE|mmy_bvdߑ|ՙnE%_+OoĐjH|[תq=ŵyz/A%4bݿإU}jyW%(S7{~->KoԫBZ핾FI%yYJ>fmN]imriyWLzo}K|_OsoY%@[+lݛjВKyGtm|?gfj^jVgw}/.8cnl"cc}WGQu ,56M*?%/gQtypf7`M.Qkx嶋͗}J6&Ͽ\3o*?z4_}CKWve|We f8ȧ˻[1ӑ-]'g\bc l{~wq*rI)~ouJ$$\Pq-!o\<̏O.͕ vg43;>}Mxl_?Oo٢jrCŞ!W嶛3!DxcS֭u{ͧK{=yбĿ_ a-? FѢ~dM6nL#ya_>w7ӵ \O:X?%eǘGK?nywSϪ"q4E$SKrnund4P4:wm_Wm~|^U?c[i'mowVplwM"}UבB~?SBi h9?w!eٲ>}gO7ZD qhm ?Z5-ľW nѲ ܨOglyu>E>3djc"Ibwm^"N5Ӯ템[Sgu6QW]*Fn۷e-ϒ]vW>"ԏGKϷGi\UjP-ucg;m$ 諱'孭gOlK3WWʊbmֺqe}O1eא DO%+ZʑXLQw":M'ިfo*sN=-?de\+Y~hfShfݟܤ^އvj9^О,n-Rv}˹~{G5VZNj5Yt{[agHg,vtV~{X'BX_eQkU1!! $(++(6-%QIqr˳2$?ݤhI>nVT{OO#?:wNX_z.<Ն<ȟJ墶Dͷvݵ+FQںO3|ua*#ēF;y2\I 6MqUMq%ݭ-˿![׿oSu5qj3rYYGosCG DjB#n?wX#i$ػm*iv2(F>>O3~гX^[W]#>}fLG{}BkKE5}f^LO?{l|~wwI]d|IuiӴ㲵Ak#Amn!ݿ~_ŷHn&g/slKub?kH?7峞+8[Gu&_־RwpLLQKiZxz?5>{z t\֚jMu/%<:Dtwű6? ԙϔ/7inld]ēC'ʤIs77|mjmlF/, ?'sO>O]7|w [&}q}5tf˫X5O̖Wb{:OlV-Nj{᧣^I Ryvyң$>+-Rk˸M %tZK^ZVgiZ䲽^?lO7G;71~ouQ;Udv̉7xcsZȋ O-8~V/ոWz\I7ɵwkȎh__|3]4GϟfDJu眕CI3_20nؓOWHKhnf/q6w2dS1tѮl_/1wJ~h|*X;{Wg\hz+oaM x.-n,7>E4ͺ[4%o&o'#joڟ'zZkmuTs߹x+Y_{B'țq>|J&ĸ]tƅo.fݻj۸-ouf}?YD/+զx-n#th<|'^=|Ǚ$P4Xw'yma<3Esh fO2'Ok ɑwȟ5/%2Y?5S"Efٶo}ο盖h,&- ,0ԷKs'p~hnQP!?5Vgƻw[a(b7Hsk5P';!c =Vgk_J֒8!nURjWo>U;Cʾei.ӼGoGE_gH,w/"'Wg;MpT$vlGhΕm3LռMVxU%$wUQCUM/S-GD༰o%AlޤKz߅>4{Òٺ6|wkS}syO?f̒Hk84{ЍkȚ;gxb#ywٳϞ)=Nv6=CMաְYVݼvK$DwI}fl;^/#ӭ5bRI-<9"_]Y)%}랷 d&յ+x^}u>ݪ8f] l_'پw2o 1?tڭ֜wP2MϨ$s~Or["I ?G y|QE$) G_uWk2)9h\qm5żw['ceR.[ɇfأe]>kIkϹ\KXy2"[*ӽ̦gVRM?o],#:pӯV+H r%sl{*>zAgs4jOy{xә;v؞Z$iwhO|?۫K,h dwm߲W~+2ziT7Ư%yܻM|;"|?zTUE[ok,O5!MOA+鲽mh?jS漂4!<T+"ɹ<}ޫ{Slٝ.mn}+;Yk&"'D}뗷M>}`ndD΋_wT6%6KW5'g^w1deha^[+H_g^/txCLW}$`nt綝!:'&+!O9SFo~IZN7:eWM7n;$/ yIWtGG}،_8|(߹_P0bknKSxo$>nVXdd>X~z MM*--!śCuroܮ֎iw1 }1*Tl }ߖS875WS,*N "/^j,-_!|VM9,at7WyZ; ΪwStרnsKW_=0Gc1'<.wUK.${uGoO1 ?PHyFo.odOs,iowuq}%A>yhdR.1SwMqy7)?|ٲ+95uao+.a>O C6m]_^Ӵ [wA/ ̶K>_cɇ;np1?q?pU67l>InyLɢy [#ȊuAoC:yvE vֺf{Ri~]_L[ITkw~jȍѿvl՛Mgոwôfmm?W?7'X+9&63KΨ?۩증%f]kKzmΏsgG$Oٮ?>Oky.y?}YS_gLמg mSL3S+}彷UjtcS;Uw)̑j#dO3g4h݇W#g߽>T$6q_+n$~oA>Ȼ7-uU̎Q_Qo'T|1dOލ"}ZbƒIy}W7&ԭ*[Xݏa1LѾ(3"3G%C%$_VX&My?ƫ] ep%ҵY-|ۋ;$mڦt)Bi˒&\|<tټLʨJ4NlGORZ 01Nj3&ֵ7}yqu{m9f,{ٮn>DM#G0+o&M_rgHbӮU }="]>$dgraܻ9y_ E{RMA,d/QM:y>O>zWU0OMZR8!xyEgv}:Mymg\=FCmp۶דoD?`Ym)/$j9rdHtnSRkˏ K9T!g]㔾L-C# p[ʳ?h_ԯ2e\?$-2/'6ROܧ[nOm|3+nic]p֦]GriGG<ͽrdXoG3Irr}R&-ҬTu͚_Y7뱗ȟ$r_n|~?oM5؛)67lK?sn38CqQ[b1uq KE ϓK6UX2~h݄bF{9-~e@$kM>ek%:"x[O5ռ%a";9_ו:=L$%sĵ7nS~M>JEY7ؓ˵UqOeyW4cm,}XT*]]I*w3YNK<8*. wyi˭hľto+"o\TP V†͜1O/gΟT«n )=]]Vw߾a=z~ l5A2diO1eYjQ,Ԧi O1/f^xm[;t[ Xf"ɿsSϘmKߘm_MqbE:M4~@6͟]#A?gj+\Xi*,.u_+&sվ_tm&3|vߒ$iI%Wj4U!7<{cZyvx糧 Ȇ2CF)RG }v5H)j~LoS;_AѶ66W⹼wHDEK*||V>7I7UܾV~o(ő؇p?ʩcyRU~O TO']{Zh_ٚczs-4"G?w,/ \g /wRywem_jyʶ%yo&#Of-ﺦ&7A[m6cFoMP~R~]ْuX-dOgwDwE?P3B2B$1n2lg+WM0 5?<:֥k:7me)TY7ݿc& D(UDHSι.-232IBLޏrz*ďi!$s!ϓ_.ߗ䫍96 ZYfѶ6͵_S9s 3MnrAbMg2ɲo浚 $pKS4rɽm--?qvJ䉟dsvmއQ~a=y~͟mMXu<(Ge|=G >w!3*oBϷO_Vkwǥ ȣ]UnK 7Mt»Į+u'Qc>͟&r5{kkm,훗O2W Km- 64> ֍imyk<茣}?2kwU)MȅżyϷQ7?wSЛl??eV;Di*vbP ~CԋZ Y~Md?ݭ+-)hUJ$ZMomͻ3?Ӓ5.B[A,w4֞ЎrлMSO gm<s'´2(Ihv2Ug3_zb/۬y(KTdR|4cTۀs5D.r"K8IvJoV7q/u t׮c2Z?>S6KK1voQѧ9Wy&n[bKwyiQ&)֕ͭ6cA4yQuBvv{xmCp|igU[9M:?TW]s3K%Gw?gy$X{}Ի^6!M'˝gԒL6l}?|ܠev]y追%iZ:XB:cnE©Ȉ%Σ rM!>%sR]JwyؼYoKu*v,q4-9ۻtk8bęc]}ͩs4<VqmEDcw|8[Vρx&[;xm o??)i[浭"OfU~]Ao[yb̗̋TG [VJ-6;y7ٹj/;']!63y/_rU.''UOgY%O/b{)-pZo2;gYZM"Uf1ͷfݻ(3'Mrod'fϹϸ ɹb4U;sA^!eK`ƉqioSݭQToDvgKtZy ܺFy_&TjKoOʻ([ĵ6o{{/`: ZhoJo]{| a PѮ#mU>sҼ}Yɵ> SHwBj_n6U5:贛4{{~7w'+'Hvd]sntɍ/_SfTXWg2y+w;7O֜Lk-SGI{?mnfHRT,mJ 5Oin^վ_}|=vԃ"fM++MS7+msᧀOg]|7MˋNҢ;}usW %kze6qIo|RMJUv yuXbO6oT&[k{Ȱ+c죑gP.iΑ&ugit!|6N'ܸhM{GHIG2"/ףMέ<>kX.Ͽ/ܳ&s WVTԼ]~ytV\H?}cVZYo󿼵dr閐\~Y%)Co ;ۻuG"<^]F3ot4tm?ﺧ H~ӿb@oZ[澷]6zX٦{]nXٳ5J'Go=cX+υv7>ZOqmw?i!x/=f߿|ngb=IRRuL}տeKֻQT߹b}̍$g [woް}+=w<{OiIh/1ivnۭO/W|=h[eȴ"Ҽy?weʎlH|o +n7/ƞ[C3쟿|}^xT~".[5yV Sɖ8tOnW<o}<7S{}V{"*U%mI ?%JWM2&se"ob(EYgwcgfk2O+Tmpb_e">pTw߾w>O?B%3'?s-wʹ6v?~o\-M{icYbK_LAʟ:|KIm{D\f5+{K;ˉ4P-eI:ᑮ,љɑ{>W;{Ǽxcj4ozw酪z?3mmܹkkm;k5oco"[+[OPo}.&{͕tLxdPeٮ,m巶{2Fbo;|ntqqya_ *نik2<:I mۿi[m%Z._QȑU-VNixGߪ^jy~WkȈ>s'"kx{o+/o-m,>؎UGo53/l{{tm~wgWidO@n]ÿiiYl&*j]7MMgo- ygwDGbus>OI;4~]&دK|AM7SuIo-tw%7c?ih|'0䟲 ]E ^[\.kg}o7Isj[U/?zK},8?\q-Itq5Hn.8f߾_/k]kh|/պ|aq..,>;y̆ VV)pbdʎkAtm_b|]BS\\^Mq.,SmI=55 v|'?]o|'0̵i5W_d'>ynHmVoW'"5%8w;Yo*3;Wy2y pom wU1/=Qi.)ٱ6}ȿθ)d ՛{H/BH}oߩ$ &~Ztp[.s idMMuD! .U_C+VP}.vyr'Kq{K\ZY,m/~8|WW"3CO:O֒y;~Hwc7-n<.{|~0'̽o$-D& _8\|dw7^}Żf*"$vv~~u4g>fCu&$*kml_|joH4,پ'oDRI̟w6o4<ZgdOYYfD@ggɲV6=핛[S$C?wﹸ^}ԧH.kX<Ϩ9|jhMH>]sbGDM'uTnu5g; ج{c3M6͓%\/#dͳOM}?J ރqi]b5ay:s y3GU75Ψ$]_Z4o (?: ,+ УDzO~dwI$ѻcL4?Ǿ'v{4{"?*S>ݻOk}n_.H|cok h&7Kwު<ĽvKw4̏;V$*\2 R3B=T:| Mv0>M*`ioJcK_}MjQVF9\Quq$7OZb>yemɗȒoר-. ssY"C,Is,@"v; JPTSL7=F;ROhb$"f_7 2B&?土8Ny@Eګ'[YL6K4[? ]ZkIjwڅ9#[~o5_in^;kv5صוu$p -b?}]}\aL4<3Z5^[ʼn+8_-X6G"XFOfTTH蓿ګ#=sG"Euҩ׽lY˧[MۏYK 9}h@[{|\[gg;OD?Al] y#Iyc_U&c]LoWoZWHk d]ȫ nhѫƻwn{FC槓?զ}|oot~#0,.F߹Ay+N(,K M-c*3$)q@?vO&O'jՒm̛s:I!GuujOs $./7Vhڦnle}nA:~)uBC?|uo3}Ua媒!~b71?_}>`lDfHC2m۵~J?'Jɱ՟)N%[.moɷ$^Z>Tuh,{mH0<λ#7Yfv{RGiXBu?r޼S|ɷc[5Mp<_~WUc&s2?L7v@Z6?fvYuCxLq.QfϿ'2q˹h K}S ^^?m@6ih$}SO2k[!oG6ۍ6T{"tZk?ɭi.$b=^DewfV]SAm&6)].|"+ym3s[=6Vi5o1$nJѓ$;/ȊI1=ŵ2;i|gKwkx/ Ie{Lm+RK S)1@6ycWO>勇Zflo,cf[7LO7=aD#dtnW'SmKg+?5QCus~~-U9 )R>VSG,_ػ](G;>hK3W5ktk{;miq?6٤;-u#v+lDo*wN 5 >e_;!Uido[~mB%܅Wd]5ϘURL2ooHig_1W'WYIg25HCx!|\(f.!cspa2G"iJX-̛mO*qċkw{B;{%twŵVv+yMq^%&{wڌ\{|Xo|5eȅ7?f; +-cP[=HKI*"o>cn]X_<;Ux+:u|%q%!c}Gcr#Sdm6;/}dk}XKxe(If$;d۳? eYYG{B&5bAڷdBTm69ZgW+I*{x^K; mZ4`yGӷ$2;=-VS on6Q#ٳ5`_i͵DQD}­exaGw2ڳf!TΈ2ov~7ư/%>.{bq?ħ%b&Q")$sgSsH:U)6ɿ|[k.ϹW#}Zg&]߼}b[2=ǶTf߳zod1j?"c$'=ZQ;dKvY fn# ƻ6Zz::CkKoﵒR{@ί>CSƗ.QN]%K$m%y[hy<$*7]Qm6M.ȹͰOo_+{yVC/Ŋ kQQgwRGw7|Ya/IVEOWegMy%˶qsR]n%O9Ev.X[jb]/PS(].ho;+BXJy)qgBk{M&9F_%0Ip]Q`Ss6OULjux-7gYQ6AKqFr׷W0]n>jigs$x4˻P͂M_ޤn~\|} =|TL=PaKs)1andkIcv򄺂F;,Io쮊{6{dn$O'%&͏͏/J겘a +U o=<*ZE+k-bZDEtoh}?KţY5դ7|1`vsy~٠3Um;oyK{gbl?U(:JTE'Veos Є]i5Al~Hsr-W_5mOQVd?>OaCl} ׷{,F;,RQaTo$/VĐy{=7[žX?V|E=oZ7_?2:l?iU k||;..of3_^}1J=$Q#i7}5x.9Z[9 kKвQDrvnߑ]j/%IčW3,*e0}ddkY?"d:mΣqmgaaqsz` ŧ/4#S-~$vm&G2lqvo+!]`R&}"CՇUi'>VKF"oD {Yb%b] ?gn]4w{:hlj5]#׵Rv]M#y;D5O?i7ڬ:4Qm̑%?ucP)ỳԬy6ll~EMؘoԗw4KQҮﱺ,`&oU"&m&.!}:y?a6~$2C{Ckqe3M&ҷlIm\6ڵz])54M۾ߪBɓ˹+@71o/"M|wٽEOH&;Q-ߓkͦCa^\2C km"*>ߓf6Si>r^YmeYK\uj:<2C4$?q>OzXiǨKUq]}-?i-]}n xg̳~꽩ʽȍ>o.#P5®][llt?UUxu$[ב:W[o+mӱŬh2x6B}V?n u~'/!O"_;\byg,>zrwz`϶ ϱoծ<_#~?gfy߹vm<ݟ~Xoqylݺ?+6rNH"]%_g[C}t?';浶cAnZGhWuqUA2\E h_.TV>=K7vq"5%OScOh`f;-Y2kHo懣\ڦon|_cY0#[Ʌ+cUJ=}.#f| [K>D7rlw؟/G߳s/.n- ebMS:e xkÚY[kr&xɷFDK}~iT<us4eN{k;E}}cnZXpe M%Y߲'?l4Ƶ֭omuMKQus?k\|9wy!ikx*R/ʓC6M7>_n+Ə|ag5GĞ?}Xw6y)6l7w.tX6#kk||R\Oo'餼u٬-}#O-73";kw1{yTleY*)+ P,~B ۷yO*27y4,7ٲao>JmiK5~_&V.N| u]K<uO?yl&ϑV;"G=7>}Xm?{y7weGOXYO-|5ZKY,|RG?uxSbK2YlV3{1 |,do+6x'4-Ws %֥~??~Lr2~NAV(Uàkom3 ⺺4>wM}ck~^Y4v;\ԣtGuZ8R8aI'?wU$oم2kOmGiD_>fJM{?MH|1M%VoIQwD#.F۳-] ^[\IMsigB;X ;Ynts-?k~y%۶;n_-5ˈn`úҮ!}![4Odɼlގ%uDPKs4T"+EY o+Fx_غ//uo^IZ naG*&ѣ}$?W{MʂMkVﺇ >dLû6ç[Iy5nU7)$QiY>]}OGI6UƍohvߙK|WIG}ggW*K[I|JA=OWTs x?Ú˝6;;b9 'w)񗉓Z5W$7!_3_+d&|<7:5TO&I&om}S{:^?Sj_\ԾڄLr$;VOo~cld/-$ʂFg੡i&tO1.?*&lo"M!y?^]O/ݚfxMoKW),2yw.[*Ϙoy+E_wW/"=o )ohz*|L#yc%M$[?dUk^&y?&O6ב't{ȶ&5ﺆEO:8lrjc*CK7OJHVsi:mݎ[?Th"u/W:V_XITGf5oD-J6oH.C.h[HRMzmGsmyUiQ4I#ym<ھb͸\~¼(M5|rCmp/d}EƟSJL٭DgmC4k-[ɿvK<줟f hi_Fo+q=i#DWV67tU7-}aHK.G)IV_ݫf-4+*ݻf?J1קxf'z&~ѿ D!o< X^O oWW(nfѭAAU)nGm5ߎoe67'&\S/GTORzK}Vۓ6lm&ἥXW~_o Jˁv6luTn~07c#~r.lr4+ͳO.7J3IX^Mkꮋ˸_eKxMOK8Mlv%F4ǽ?ګo$߫VD7H bC_Cg"^\I*]G" VGvlM'AYvIonJ 6{7y{z=:V}7AGows7 KRӼ05K}E|<)7rnȡ]AiWiVwzlsŸɿ[_W:o-},p[obSs2ޯwnf\G?3q3|"|v|7YrD u}C7i_n[646slvnUw3ۢrD L5FLt3&ߕ۹JN.d{?v8w<n؝֯<n"LEپGk+ڕdo7jjlͷ,B9|c\Uڳ'i(6!4a?⮏Ltmanu4)m6%|QNZ$5Qc}͔4hv*|ՙ?k} Ft>J/j`|ysa1Kj Y/bw|)rf$HHt/ѿ٩7[4Bn)|7W"=͎6$WS]Ci?cwɷf>_G[m[O?ީfley-rsבf<#m\4l] :6v\6ΫfXjZ7Yix[TUx>kUT7}+rDu^H6guɾh˳b]]^&\thm4;X7yG6~|?ɱX17[@wEo|?DOPKxY/$Bs>v-/^*[A7cye>k[hY7[ܤb^|r(2C!E$[.:+oz' M7tR>Z&.o%6(Mf[jd]DږEd[>Tm*:,rBM:?ɌYw6mSc"LaE_"|5X̳'O[\8~k:lO1)_2}%lYFپhfOZcWy7MS;?˳e\nVz,߼efQEtGͧCpg[gz4>?ǻsZ[d>R$oѷ&K衎?.O2$|/Ă%|7@W%TF+cm@ O luſvsL^Lf-6g :}U? 6;=_yr?hdH˵U76xlRWO9ғ)RTX[ۛyx#B*tM Ƣݶn_algRHV6i+,nQ5U%FB(|ktL1hg}Y-ƅRM$F5C9OyϿc '*E}+l.KiO3NqePkYl3'龹$u)Ciw–_mX&w돎kypbm}{P}?hI.FSo'?lfKޟ%Y >fٝ4q ?V<]DmvzEkij6݌㷺{5bVw}fp4y|^:xo4?뢟}3$l:w_ǦHEyY]TrLLvfD BoV)m#49Cquo=q[xonck_S9ϼ|7|WotۛZuym.Dgo~oc_Ohng˧_3/Z8[Fݖ+?hF IBoAM/~@T;w>WgV7¶N}u~дu7_*+{HyN͟ҩž]-w'7ɳ̇ZWtݶ.nKmffpVOjVHuJ+?:$#m>a]S7fޢ8V (/lyav]$9]"Vwy/v]fG o?تZ{[:ǷhoKu"3M0n| <ݮAHAH }R3Y ~Y }s?ÿиxg<ʗkoجy=>Ⱦ[#mm?h70hm^ ]%Qj={1 W&:7}"6SS M <#]U{Qٛ-E5ݻ|^b{㵞#=ĦB6+J(DwN\|aoo}d~vmrce՝ }-۶M7q-쉾wʫkek.upRr>6mO&6E?s CI5~GIq?$Df_g $"Mțb7*˿kF%nAY=(տė5tۻXw^^ٓoZ,1d].IVϛu0 D/oZڜ70YR?E&ϙVh`vV77~Hq;rvN[}-Vwl.:}ʕXf۶HM+C5JwEՠ/T$^JoFmLiwn~_@]xӧ]==2̓y_7Y]mLiݷyr03KMbG'3VTǾe;:lOﺰJ[fەYm"ʼ$(BkZ~B۷bIbb:y#?XquW2#7|3&-yWgԭ$M^|\\}v&͟'Rټl_Uxs>񦱣Xh3R\FVΟ:縈D/am%wug7Sf,\:Wt0=KD_ c~ 5<1V8LkQ/IfM:}o;&4,U?\?W24OYkrZ-ƚ$&]ħt۱6VKK_hoݿyS?oK]g[<@cn ̎/w*G VG9^)45yӁ'6VsM2/ oߩlc$weqdYI/JPO~?ިYm8 vۤV]O?SI'n&<'6O}yf}l>nf}X6U>O\X~Nh U]noxW>ӡ.{4s{Z*DOW^y9OQ4oUS[}6iXh+]XCvV]=ZlMwιw\g| cD?sBP񍮇hzMumV8#߰>D>oGX.+b{ʿW|[YZU'qe-:UЭ獧Ekoå\1 6}t<]?ح Te^d$cm_/VPMi=)"UZfgu S$[_Zgd(dL]=%wC"kymO}U0y1w7Jgy{ȿu̶!ݳt0y:W_1ݎu7;\K\?7ʭ.]]o>qSgҬcRt_REy5ݰKȾ'K_KgR-J9]2`ÿv;v.Voe(r%jhI:O\A.hHV!δ}AۻsE>ۈ^OyIU$*|Q"2Y&ITw}Oُu<5D3*9[y<ﺭo޷mao9%Qn>24; EO+̩RUGJ`cyG6ފ|RO{sp $C#Tnj||FyA'޿Dxdy#`<.IasgBn#yT;_M!꧙Xӧ*sgP2\L<8R5c'C$7*柧\)6+ψߗ ϛ=?? 6C'Vm5 2yyW?6]X965| åpr 0/.o$y?i?ޛt@J(T?#rIt4wok.gq/_c?Ȏ϶d>G]sUy.~Yc?*Ͻ# I${}Y6ą^&r3xsDlG:i[B5ǝVEg(v; /:ީ-7z-"PKH6y\uwm3-o Mz"ٳZkaQsK٢}lO䈌Fd^3ZG;UKw]sV^uY;hyus&T+d$>n՛s;`˅7\Ocs\=?hfYڛ~v(7-vnT'Ӭu[W}+~oYkةo&F\"/*IO#͓[?>SXVZI:]Գo"m?tɴQ8KV{e)#۽7?MN.,yg_]:=M0ܥIDѿ?U#`_ y?䫩}yCgcT:gƊ/:}nók^i;[*K|X~*+h5DI2f6uZ>#=hIfr'\,3B~}5͵w7>rils u_͂%NMcG$_7RBF 73%QW9Eq*77.k%>)}Cr'mb̟U <-?5fy?F "oHKoU4’FO.Qdj+l7_3^\cVɱޫ4#wxiWxo=R4G/Gp1'Xz٣:+[:hQ,SGYGhnfi|S?^;h~[x?jvh=Z`0}?T$֮5a.<Վ_O(F}Q$յ++Gʰ̵Io7+uF߲I""8iҺχ|S=D FqMo筟4ٽ7ue&HfwOMФ͟lR%^K{kioyQL۪f;i^UꕾTo6V2<rIiug9GMJ ~"=jjG 0G3E۹?tiLv5UeLaYwq?uZ.nOhwд:lpkHVGI"}gj .찼go}2;t9g/aS\^Nݼؕw_;>ζ&2%W+--uiVWWm(]UپwHa{~OE$ooMkiY61<_ b>О_6UlKdzM*~)LEvvl/h9.'vՖOds\}/xm;Z:Cp,]P9j4쯱oYr UoUqs̢m?W7+<3iibnn\iʲ^-X[dV~ GK~nɽ.m=|-Ii]ټ7s/YrD=>\|?ݦ]|!MڸTQɶ'}̋[4* y0?Ety 'mkxy;?}.(^Է )o/=< M&l7Gydvk Ayk)7fGbGssgϕw+, ^WF?%ҩNayqMr_ΎHΎ5#fIZ{iu#'Vlo,\˧@p|gl򋻋2QTCܣnV ^7=:M{V_ZVV72տy/uIޭkLv\I)nʹ;{s<5Dٵl\U?xtكqg5nß9/?<1}kwZwV/ݖ쑘oermRFϿeqs;:eD{^cm߼Nl.FSg?>qn~IDۻ7dMϟI3s$v_ܟ->EqUkBUywdXL?M|K7ݷ}:XR96$e:kvguu2foV,l7I>J͑Qj"gaK9~MFOo쨤dir\yvU?3ڬ4s| k9̆?:?_d9/䩒fțGTqcjma[*+6^DihߴyD$eGp-]蓮ڟ5O5}FoɵgFB.oT@7橦hٶ ViDn%6?O2fv}V'W4ZLZw)coeVXQ$q'5:C,_}u$Cڕ~K2Vg7J ûknfIyɋV[KM`+5˛O=fȆ3E}U˚g)ZvV("w\|حI6}#Z*NWϟg9HvMݒ/-<w0}Zm+TMoO1$VL{#$.u H]42M-ܾZ'|ls e_u}@۬sk4)/Dꄋd% J[}Vayu|ȒFO#O6*k%оhtM2#q)|ݻ_ݽJs$l\VSE)-|ެ{|Q;I³#]+S"a]jok "y:kB+no ,5YOŸ.-GޱDͱy-C$c~]sZJIUY|"&׃z>#gnDW!gʛ1oSrõ7ݧƯ$~O{~X{RDnHc&LGVM75YUN3ƈGWo*9{Rvݻujc4%t{%b4~cB0OeDs)dDq-ƥu%{ڼs>l)E6})JIf}oyn>oFe;sr"ɚ\o)}ʂ?wզ$[lmw2իujR]MwlmoqoجL-ɷ?:͜5)״\ 1x?ђ HeBC}^N#nO4*[<>Qۺgjzt^<6YySwL}&TVߖdnu(vˠ hS&=3߳,k/7o?بaE#˷tfʏHcdRI$`Dү=h6PM+h-? BggۨUK|Ye@67$o;[z67R>Gߞ<~QLt>+q'̟&Z@I[wĻR}41Ȼ5WDX~mqQȳB~2y+"M۷S{(yn&߾J6w/>_cfR6|[}^GM=w^AO}ƑNii$߲oe[ =2\"ڲ jOq|1ó?%OnZ]촲D봗MN"3Ȼu[Hf|$_7?Tw?v|cXses3o^jȏFwmo.C"|b{CضQwGfH]Ry47.?*Ts\\۾M]tA~w$#w*y3+'"cJՑN&GO\?g'~|̾١}9n%Sš6jfK/ Yĭy4~zOqCMl ʡnJ$CuϿ4!+93m*ߜ]?ʭNRg^ *#F޳nWΚ%ͽݯt/쪰,0۲/}̿rn!QfKmQvyΒ++(M*3[Fͷw~}_m{miJ7KioicpwٳK.^ͮc]ʻ),Crqʡ 33oE_+5V$8ޅ6n?ը/-n]u}?2IڥYkKl?qqy%6?Ri>4L5ǟw;V//iso2i{*KxdֵIt-5A\yQ乙_WߧD|E xO]\K]k}bO*#Ȋo߾ ޟ[i괓fGgsn"پKǎo1TwVڅ^$lq'ђuׇu->-T{kBTn=fzsoq9dȻK伶or;*;f1/?m-{?)ԕ3t&δeXFz>tqy[|ufOBt?}#_~"oճڦˏ_O$*T> D$?BD+|QsigmwW >g?CDeI,MI;>yᛋ4r&_u ek!+tt.kn|e,e$O7/ZZ3CZqCty܋9?߇>ȞDViڈQhef7v[˩wVW >rsے'[ ͚پg ǾUfGtϳZmsŇmY2KGDwoBM?;']#:eItefd}6Wd_1ducQn|7|!g;}wKeɬ=޼(lU9DH|}j!].*,~ۿaaҴk9oɓf–馺{϶jZto򿿿g4>zcL;=.Ha?Z^=Λij֪]KΨjr>ϓb|G:^bmZӡM9?o$}Z:+W>4_k/AӮOҡeWc3-巘˲Yo-S}-ieЊ[5Fs¯g_+m#_+R5L 27HvYzظ5i ~ˑ=VU椱Yi~9zLot; WZʴ7_ği&kfͻD,>Gd.Dɗ6߿W>%} SVrH{o?Vμ &e_`β61i\\}yؔ)aH!۶v}+fϒB'k$l2O|RzWY<[{HǓy$d(䈊jۤg mr<ɏ%yHV '4MmFVHatE5۶vY})39e?ٲ72lvWDC2#؛^[?_ef|Od!z~d[ML6+r RdWqWch3fZ*_|%K>Idoy߿Z"nJm:)K5m?傷}f߾*ϖ'~uϙ ?ޑk?g{FOyHR˜ͫ?V-laD4ϵi3}_{Gܬ Sm+H?K1g¿]f熭J$ izX|<*Ǘ?T[_ORKmBkh"x6n݉gso ͟OJY-cgoͧ^'1I`%.c ys}j/U>Үl?OνG:^H氛^n:5nbǜ&m_* Ymm.W9H/,w]п7\M2i??],ٚkow)pv?uu"L_?S@'kaoU>`i}q{O>ݻmOmu)zm 4;O 6oM7X|\܈g>zn?lhuuT717?gO|)7 j~ׂ%dmnm }%:?ա1xŸgx̰Y':yM?'$j mw6&fo <'41ZkE^hjCİ^joOSΛwXz~[jVz^Am{?ש4/g+U,iKO_{5W1 sLڬ-,J$~sדy?vgen>l,lR.SPsyr+k^aXmD7.rhM'7VM.ؖOU+ɱX=>o;bIu<|^ZmynݿS_;\Ϫ%TR߿_ V拣Vӿ/Z=֟s7I:kϛdD)Wctu+KeV3M >P.M!D}#pʛթJ$m>E.trڰ?|nݨa1<ykǠFݝqif,n<|sK=l*{/4Mn?XkJ(vwJ,Fȉ2ܩm yY=鹝]m%liZUx%y:+fX$D߷t/ȑp516T-2Gq FO34s}/%9|~Kߣ1r"Z9aFDs6pW$6=ǚb_*ζV,?*髧ܪRIIPhBS||jRH/;w*jCfOUk%ԃ}l1慿9:fc%# GkKvKmeA/kٗ:J[M"Km<ؕèh?UđT;Eۻw}.;ao<[2ĆdfO'f7 nC*eWa&ޑgWAˬ^lD.vռ~b)*c-kɛl3<2y:/ߦ^y+uy2Ho!3y3\K!λHC&TM1м2Eʇjc;A_'dABon=NSOjoEctm,&l=WQ-!_OhVo{HeT_U͖mi j<1Eowlmn-nҴV6̾Z~vS&kǴUUOg6ofYgf<c~?q +wm?)G̑6'y?T u]z4fu7ܭMFMuK.t]lc[J̻)Kg%+8H|Wnm|"}% hHhM^S۸dſ}ۧ= Un+uhew _e#7XznoMy>c46?W|:Anlʟϋ :9U_>%ȺtgmofX 2L7GlI]/5d:>^kWl͕cd_lG!>[ʸO)ZY&eZkė̟'ݬLہ""Xf)?o6g%mg ͟ۀ߼Ux liȉHoۻmOdw$)~G}0El7oW>Wj}dG<17Gć4mǿ}CklGIbki,rͻMSbjJ%yv֔Y[k$3ZAK273~$rRmf?+5xxWG2zEZ\>vKoΗ?ٳ+nI2]CoOl"=zwG"#g)|Wڮ-/M./,ȋܯ2h[1.Z#[dWJ" )w򯛽?IbʚH쒵ShHg4K ڼ9u/iSGN>t#bɚd{=zo"Y=kꚖ}-=*g|~zIfΆc Liy!S]x{CԹn(R7xjͿ%ޛtᮥ_vٓgջv[s [pU"wWl,M]ϵ7;׫я1yre^Gu/g[ywA1ٳWMew: s2_Gd}W9 )pJ9vfu }Go/K-K\5ԞL6Lw|l5~=QI\>ͻG9 %y>U>Xn}Bx0#@"W,~wMVyj/,l8>2lsn{_ZjS_jIc߷Fr9le稿oܧ$}g\6u 27ɠ|asʼֵ+Y,<-'qiw.?جO2h^X?w:iV(_9^]ne3\g9\]*͗ˆ$]6l?Gڪg>_~W|<:x~/:~d$G4MNwiOpj`/y7y2}:*?6{MytTm \yO|-m.uIk~'IysgmdE} v6(ǖ)?/T- eh~oQlh>ϩJ?Q45sy?ss9=ʧLi[딲7vosܪrZ߾[f2L*>d}V=*+49VT3Kw,2fmHZH?w?P,h .bVhUKy_⣑sHfo$V֏s_\a5śli>dfl_I?Q#E<-GFCo-^:?'vV?iQbI?||O]7OiRBo1|Yz͢[HyzG"t?x\n/ԯ"̓l='-oom !Sjo?8&{V+|J*ՙ2cs#OoqqϳSIykwEL*[|s}y]~ع &Og󿂲9=sg)cy7]ls`PYRT-Ϲ}~ YV+o7ϗV7*Υ^M-2XAo᫷v7agqHeiR=ɴJ{F.q+|X0LoHsDm]t|&ymMY!NX^7k$W߳OȾe3Og:C#yY+#Fב{Fjqݧv2M "UvVgL*UTHSziZ77>DXܿ@O$2ykT{euio+?۬,I1{tFeWUg?-Fȼ3(H_ҍM':V/~l^Zج̿augvfC"}㵫'Z%xn[~+:I]b&}P4(@^6ޫ?j\|ou,߳ɫ\}A@J3kjoJ_߲y"+.eH|y4PBW( FJ:?gޟEnȓo)/W%)#G%kH&߫V:ږiYK7r_ ?[x_߿uB7[T۶On>^"+P=O"c B> tUޛ+%g#7TTOndOAnI0mU>@3qjIX\o}:Ilߦ }^KokH>_lM!|}/xn~-l|OhjWMg{g OOCz K $loNrm}G|eɿxCh`MݵPG]ֶ2O,_ƟU+y9|sfw+gO/,mf{hlť^SyW7 Ætͭ3s{IT:X3I7-Y,}uMh-޻Tyq):͒kyQ}gnN5Ltk|r4uEoo* )6Ic&:~ҙ$q'ߗmOZhf泹y-]/f (_tsJU:;鲺΍Qc{.vloۨ?ЬE,1EyQ-ۢko*?:hLns#6'^HxS]KQmw–~+HWd7_TϳfIYemtWsj_h)k]cʛql+|ȕã꺢^LrL4D^E_,[Z,;?Gcqd =FNn_'btrU !H6ܭ[2|{M-VKXG^B_"6U.qe&SĶqX6U2vw7 ]o ]x_xT!Wϻw^}}s:i7:VqpC?n=rDTO7Z^Mud~vH2GMXo9i} iܮH䧗mښ4wͽ߽~||rīkH\I>G$LBK(W'ڬ&6VMgk%ǒo ޑE}B"jIcn~{>t N~|SjR_ǜEyp垥 ţY%Oe5 m$&9#H6K'OEZWK?gPdGԷ^^ٱne[iX_!g?Ͻ+[N~>4{u/c4*||[Ş#Լa-W]>^]Dʷol*F9|ɲi2~;_: uMtL^C$0|4z~{O:(>鹋gm]`é|?]פ&ɷwWhmd+xzy;>ZfwhX{Ol+| v[??1a7~jZ"lK%Ο#ٳ1w_OAv O?͏t?J1Ѿ4_<]x:ݼ)$žL)nZ vDVľo2"m㽎ʼ,EG}wͥحϝ*zy4MQwnT*}Ʃm$:u n }RE_&oOJ")dwihҶ֮.`mk@+u1Dw"rCځ_O=]L^ ^-#.Ƒ,u#LܪM}LV6գ.?#ҰǙ3$Q([+=͜RxcCG",?ftih˙gz]*-6Tw_fE{l|Rnd\\$}3l:#l;nݲ~Uyh[4Mo닞`2=BvcyR??ߪ8(cgڬ92[uΣs%| 3UvK~CUYv.>8Q͹YfoSkY"[L-/hx/ߏs[yk ^\unRԿhA \;?ifI$H_YA<%>/go5+;v} x?̛6&ϳ}qwlcOyq]UUFt1`O)4PS?9C.ߗ䫖vڅƕaoF*{@ϒY-oӒk{ɴ}K/&KәQjRƨo/]9uQdۭgd: ,Y$(RD*qeϛi?wgqAv6L[y6gxWOoa|d_2mk 乷ϴ~+3%l7fMö1 ߿T,MtojjŎ\Y}~9AexDMy$]G_3o:o9Ք8H=SCsj9dj:)D]4'6U99?s7uB2$1;r#$sV<Ͻ}Hɼi~Mgʳoi"opM6?ns6]4Ήyur$O*O"KbFWjs?KfvĪJ"Ȍſxll _5Ze,/s)Gp=N~rKak[ l=Kݿ'?uzyLnZbfQ#{7g;Tr!'coWRH5[b\'g ,H]W[gگN-;8m>ٳǨ4Fk;xI7.fuQ[{;>}9R)¨W͗4"U&Fwͻ۷jj:qwh/>_m߾nQ͝nzwӧg+:k8aɷ*; GJyu57,M%Mk}\uѭJ7cwK|mtu֌lhj/Ukxbjo'cSdH=n=KR&%<[f[ߨ#QWٿd_'Y0۫w3,~~RE,"A#Mmߨ!dgI/GvO;wq'|Ov`<爗rC[꺖q;5/uhQa~Z $6޶ߓ}lOG,k3a S23872C,h4oHc_ W"HM"9- $gI_6W\4n?ro4o$_c.}ݵNW U۫A3 1GU?}vHcoܵu {bofvn=X v7*4Ybc=#F7SX ͳ Z6yޡq6\Y ,oIZE67*YI.Kqc k$쁞!}ɳX>ꚑSwXd~zgY>͕e\ɦ0[7-Cpki$Iϝo2!ߞ#YADuRhγew<~Z'l")`Q>O+lMLLs[i |op5M5cK}C+~&zn5ڭyrlپmړGnv;F_UfΎuJO%[O-yY6Y"MFWr_4ZM2H{{3oϳ$xYȸiʂ47B 'Zgߟj=y?Π?~D?}"~5-Ql >J;a:Kv6S[p$HSzFiVXhZ߳=~8a/߽^heh߳ښM7lOOP3}]I-3nݰ4ooEirm&HgH>|C#uYYtIojgZfGX&SeP_ɳny2CRm-j\Z}֓SY@,\MuoM=u|wJײyheDVWڟ_ZZޯma=ީ/rhUoE 2L/l?Z=݃鱤וT{:-3go~ߪ%Im⼎]})s̷B ؆IH|!wm?JGmy.'co:5j:ƛo%Lhy#nޞ_1_<ehm6bM%;% ]&$׶h.}?_ڻ} =9&{~r_kϖ [faIo/U>w*+~4qi5mn>PnXiyXڥŜI|~bײPབ/K]xVZy!ito%Mdg@ em?鏊TxjoEi^ؓOUa5]|w*Nٶl*H\6w>:6j^/?jZg4u[oAEd}UFgqr3u$3\EXh`[Ryaczl\dlT"aO}S1&o&)?VG?;eYUWf͟wc߬[~kwT<7I62>&0>[;»?m47RjuI-ˏy)T.?,3ۣڐyʵ Ǘ{ɾO//lc{9?5u$O/{>k_1#uS%TRP5_}ϒ<~J?*7e'#H<=_"7/UHsxK6g|Qt٤u)D?fԗ֒Fu2}6VibyGsء$\MkZmIhϓo|V|gb֠++&GKjhPfϟG<5/!I}Y&mI>O޹ۍqj ]73GYβoGuqBys_43q8me'!O+ڕo5-PU_3gaK;;q G?q)v?[1é}!^Z*l؟믒%2$2'ٞ핼߿[6ַyɼ|̟ڡ}>0nߓTl;~LrKlj5+'آݳW*f\qyEsyUf#.߻yg ѶͻT-VdOh]V]9mBmB-K$[>O+2O/sv/d߭+RĂԶY{'y{+k&+~~}xVo!ΆUo1\oXYJռ;vp"wƟ!9mdޓ$/e8n{yWd;B^ +|pnRdki%ފͽU9ʻ>ZڷTPMR8V!uudVֵJGܷV_1_%swV0s472y:y3m'||Z`d+xZG)^FX_?v#ț>6k[)r /~~y|<}b%"?}MWg ִ/75C$i6RiC3?"ɘ}d~]ʦ[gh|&?O4sHvKKi$D[*W/h̨H۾OQ~(yݭRγ}Ul>P`>JҊ?2>#el[y12>Li{"[,$q՛YR(exd6Um˞A2dmm2m3-P5O;IM#=)ȱ"IܻO)Flsgy1*N<5 ?${>]Y64yYlGM̚^9XG/esQȀ{WC\[M }$ʖK_yX>mݝG7?UoiH"|$?_iQlh ߹/*y5y}5/>0/⡎M[;{uoU{S.H&d04)7*H 2|u:l?h6ni"XϽlr ~G}w5q$>G._o2G=o4i?,oK|U{TE"CqqmC7.?T7oHai>_/L{9wim2/&aC|s_3|S[[ .lIբ~M>l_ch\6ɳmrf|ujW\Is\άs}fdiygyѶ;_GpMpUUh7lyoYUfGOK'? .<=SH_ O/gɿ}qS7ry4YFV?,;v/[]l&. .ƛT2Dx}Us=O3Ɛ}$mթR//1ҷ7 ss7Uid#k.?5$MKRJ=7G,^hȊ4#O{I4B(v$<f 3~?>d/ ٭C42x,,Fu{{[K[]Mo)bg|Acso7#B>kfvo߿:syO_C IMej2D5 VQ|WG}r#%Zi75 ds^k{ y/\ 6U=JMkKȞ;Y(3mF6`جVmcUׯX{?y*"cFoƛes*}d?fuo6VAs>CŰ&5vR߾vA &kļm/?l'VS;s }g-S{`6:cɪ1OE;l,*O}>s5坝Ρ8~vs($ǝ=*I##ȻߩcUkų+XY kw?ӡ17ڎ 5M #E~YNRMky6 -TYR7o߯;`lھ<ޭg3E W+z]>}7ԭ,%* w]|JMݪdl7i)I5Oʶ/6S,MJ[?fb_V8ȿhɳK4+H4XmnOVh؉"/gIkN=mjc{{t*̊oґaE9bT$4&I4mV:v3}$_~_q̮^,~ =j/xFM]E>wY6lڟhgOW' >g\m V.C]C oOgڬ^{hg}֟SfB57+.fg.o@(TKrkMgSU2oG.ߛ?ʿW:NknZ]ږ;m:VjbM=6i"wn6EM5w|P$ڵՍ2YQȕ?uAWɇI_<ySۤWf&2<[h#}N{*;IĹTnмg*¿+,5̋O3gdl4[;ן?xQJ='3Kmf͔tGeez~g$6Mij'*yʗ77 Cz}”c1zWz\4e[sIwHмrL?jnoi,q?x``]AknQW7iepʫgMԮm*G𭜏SwO"+y|yO!o߅/ 6O h/wO=cZ_V3Kq3O Y~G(1 I'f߭Y h퍥_eF6ocO?hϜ2VXbXɏOl?n%R楶sqmn&h">IjRHo z%3^^\?n\BJis­%|v-?!m#KtcWߨdF¾E߼]u>w H̭/m%:|5U< #5I'Yޮ8/,K?]nV/+5P-\ieWm>۶?u/cIl_#sfϟ>z2'Vp㸎YncjiQX$Zo=nkGEO<5 \^C#\~ݼ1_eH6^-vr\u+h0i֓i7:kDgT-mzfn/[gٟwk2(SɳW*%&6*|?fz1v/ߺnkS>L?}~$kLՙ!L7r\2?ɻ楋o)0mݷPVn!imc*XwӡY}'hmqodyo4]$oY7.-I/R$Nޒ>Ϳ?Uz'T#7ު8Li>v۳m:(|~FȻٚZIdݿwgK$!m`Ui*8ۿdѫ<ǚykS GMi$Zyo=:I{>]Gw.=ZړS.1|$BEr*ߔӣ_1o?T*yw?Tiݿn7@λ>s|j˳}2Ev&;;™?U$tX#"y.GUI2HNsKZ{Aܾ\)]7k~f)`C3$q Ⱦ?ݥevf̳S."r57\*slD%. ?Y]ӽqy >Ivm:XIy2ګ5=~,|=zV?q}ynI|;졕|ɮ" m?V,.D.p~G_ W7)2\ލ";?AU[i<&.?L#+orpȾs:?⡑#w7V '_'hwY4؏ݷnU5d&ݵl$x|RYo7믒"c$Q>MWLw$EgghvdGO5g~C{>za7r]߮_yDeݜn=k4{{K&͉ߤko.ng̿/QKo͑>O-v'_|yg0ƫ-QIn?{o|b?ƞf߽}ݏY%Cњr"tg6?I,Ϳc<wW^o˳Ɇw?YLH^oiW268SR.&jVz}ݢTI}Rf{S]aݮh΁DSbF!oSmu &x"M+w2[}7ܱRYoϿ4ۦMMʐMI_ܪ3F{w|WAKq?*'˙&IJ퉷ʂ?uwP6k1žW6CnelBC ..j$%|Kk|jK͕~ŷC7~a+}G5M#m&]߻YIg\IM77OKt3} XJrUB/ I?wPS}wsM-Lߧm_:;ϻL|ʝ~IsA mRk{ҡ>wuoS<~ΗT~Of:|UVO:7/MKDM{*V>J1@il;?FٿX[Λ$'[wV.MoYA5imxdHE֯wieƥjZy L>wlwi&{w\<VEilIˮ\e3y"i$I--~X՟l)$nSwIo&dX幷ZeyVwo-p(p LyL)ʾg;w,hfKdt]߹gP_XnKych*xI?t~]oB} M>UymVwꕾXJcxaΙ#FڍqV!:?ܪk?wmۗk}~L)4k4}kCU_ 1d;HE/֟<KԴB\<\޹m[*Fލ 7^5sDLK<W~Z) lu4p o1.cSCj__v_ۜOV6l?{\Ҳ\x5'2j穼oH\|axdS ?Z;wO;[zavһ0xs C˯ X}KI^[%>}Zһpɶ?+6g'gGOꔚ?oV3jeC#i~zȯ"z,+CgΚOg?uyeUf߷gܛn9Wof-4 k~rYf|YysΩ~$I$6ly&mܹ"Zƛh>Z^jgT7h|%I>mR_,O7cKog$[EӗSkxGҎ]=eItʏZK=)!>]Si!_q%=͵mf4pp*3LgHbͶXW2q4yf_iEIjO7ov[/MM'5eXdnn#ҙ#+ok7ڌ}f~"ܻڔ_;]=*i]&h?ԏ"]GbIwC %$Ѷ3?y~gs``i"C|[Ay ),nNy?Y,{w} mI;;=}ǟ/"%`_&6~ۑs4y?u-ii1ȁYbi9x3#>^4}%SR9!| ^Mls}vmU9#kYG\xU燼[- 4xW.'T?YԵ{to.no4H?9Oߪ"_ZY&#]%~o"fW۹T~o]fk5W}o&ko35oz _? Mo/4Wvwy?-ٳoig <[sy;?}իF1eUsh}>{!K;^<_uWWA[2F&_Y b;8m s"f_wLCOWOyq#q4}tQ ZK~}Ϳͻ˝ٳgR~>4+{";oxc/7{"\5`[^?,dpyw7eVT;_=XK}5/T>o M2&wz}5Vb}Wsq6t}{md*UUFIݭ/-$[űF߲/7ȯMf>JYgEP/ʻة,RG4|ުp25x|=߳nM̋[=I%ͷr=[O?:no$3<)u m~/)M]* =jKKd]y ڡ>6?Rϓv&ΎhgJ-si?+Gīz~ע{hn,?y@hSgr`m$gԯ5n (&#JЗLԮ՟JI|'H_W/GA˳oeި6ݬ5X&Luw|IQ}=e߿=ḜFUw]^"l񵻻o۬}gΛNME2lltL%#G۶vsb}P B8Iez<;V|Y-2[ý-v&vOv}rkr ,QE'"*,KlOOudd<.m?_RH#NkfB2Cm=r*s{hNAkH#m'OK5o'Y?ğ F^Wp5 l~2.)7~}ul'҆iaug관 2}٥^5 Vo^[>so7I:f})V}/3xJH<ٯmu ןɧ$(' vseK$ VEwJ'HdDk?&u7SO;d1m|.|3N5)(/Oi-s4'Nds}ⲭbuk{y>eKi3\Lnn>ei鶗3O)6˙OUע{YmUne/7bywfqzܭy.'墬7ȟMۖWy5{o}.R#mIFث1_?jgMd*՚ХǕo=SKGy|O?OGkIo5??_&x׿on⼗xޛ?Zh>7l?ܮn?hK-RȫJg_GT[[ϖgO[$ $6ݿ\UE6yawnUcyѢFew,,x6zŶg_5|O׮I4YwQ,nBzyIxyrDbR )ox{«jv~$k{kɇO'b|}䘊T#3U} U5m6XlAՆL_~:#+?&(cMrᤚ|Oov}ٿ~ϓ!>JhmO1ZR6k-UڧXdۯ\ؾ%y>3F&4K ]zqˍ>$𞉥jY嵎>TٽD]lrKΛO /SR򦱵oy:Cip|Wꪷ%igy.cS͛y.4>01t5Ƴ.MVM˶V裷?Z͇hu_';~Zn$Ԏ#>9C2nI{2[r= ^q7<(w}|Yvo[#?f>׉{O*O+*gMVɎC=HǟW/oBrW2>BI:H>J0^?kdK;_OEWcTэc4#g>p9Jw2$$,< Kl/UAfWoX{8I$>t$v<\Ki}Eٳ4ɚgOVx+$-؛Xn yS:}hRȗYa/?:}eYlfk;-GSUާAm_O7o..e=E.lmxk+|b|Ktgl'ϲ[/&$+l6% ?g_:V+CbyyvλdV,h:)}I?u 6F_R?/kZ ?-DmJsdIzޏ #)"索6쉼j|&ϿPVG?ZG$'?k/6_f'}[QxwK~V|md~m /˃ʒ1lw kTw.a-طM?Qx~(fWx/jxƾ"{?Zj<۩f؉ Ep&&M m&XHjǻz&᷅75U$~skq,{g?~ S.GaOŽ/o qcoTM6ܮ/ k'sxχ-o~%o,t{8dK?y?応7}3y<}$|h-bIcg ?UFq[R'UUCk5FTv˹&XXF>6SW{y7&[ \g䭬yguOlSZŘ~57DH6m'EKM>]߾lq/RimRǪ~^2dM:[ݫ?zmj߿4,p1RCym)Wx6[uv|O 7Wȑi#ϝ˛{Xo"?9o߬-Ds7̉hFY>~G۵[VWox'AƽmNao\m޳'W?o&;?UZR ¿I͗ۡ7iaW{ݲo <%Ϳ[7ךh9Iz~[ܬ!ϓcrhP/| /̉{f{ɤssвn6~?ܫ0lO[Jox@V>uFTnnl!=yK7~UG &gٵzy lY`Yt-9 o[l፷[v<>gqym?)I|_h ^MͻɏR+-HgGYy'I>y]ߧ&bSo:9!ޫ($hWZ$an3;ۭiyL?J/o~-cvgyar?vEi_%+q%*IZ$GlM#ywz봻[AiWY#o!/j?/o7\2~+nDg;Mfןf?M77*S &jmLݥ業mDz#}E'*~m->3٤k(o>kKpM̅6^d/Ww7m5yyM?دU;@ȶH#}ʼMewf<׷̿v*luӧfv3Y?rϟZKo3d.|.~sf>m5ĊfO>nQ1g=3C$;E*d󙭙}C {Ҵk-[{?u~g?f*I7_El+^/OMƻoݟf}p/hLSRmVybOh5iY!={yn#5{9kXkiky'T{w4y>m$cP[O1???eV#[hHSy^y?%\SW>#sj}-f{ }\VVopfj\Cb8nfO&o,t=yo}$fsy{$8tH|w@SK>]ʚ;MO\]Y¶i \[M_Ɠ.&//>ysn:=K_/f者J$v~F$e2Y<6~#٣^՞EG#y{ئ3$±{=c6Hn7=An~ Yܥ>} XʨvͶ͓mv?ڼ>kWlo=c}SiO;;+n?T;|oW trk<뛛ɿ3^xܺ8S^LՓ:s;ݫ&nOj^$%ܚַTOsbȌ,R?o2z/-1%$b2Jr}AL$Ҭ2;[++r$%6l.m"4~SZT*nei(*P'f"I=g?NXD7~DW4D3C$$3_槑.Dlw~ DT=Ojs=K1fs,먷Җn5H.H$fAiXe|hTg=z<9[:Ck6Ert}RWk9|n`? jhw}֗/5yRtmݾD. %Ǘo.ֱ?|ϱAۺ/DFvo~:|U|E9_,eYQ'&ɛΟ%xr$*ǿ* {mw?#}PkBAg5[<)"C$y*᳆5/픸uǕ42OMW̚n+}n7%ZUdY>߿o$_'d?ahCdSI~Ix~ǎ5 xC:_ K}k/?^$ȰܥKˍImՖfP@t>y76vאm..վ_o؛>e:mRa<+D&m|;wVo-)[k43lYrMLlVR/#7ZoPXQ>*G,ӛ4LT_2iwl=?Q X^_ۥr|Sl?ؠ —3kc|*7W6sCrۮm}Imk7SK[^IyNѪe9͟;TE?ݠDyɼɮ"WWR;oWͱ&ޏiJ\y6˿3]n=--tu{ܧԿ@hKxy}+Isw rjOIo3&GܿVxVMo#{?1 ;=^n_UCKnUO*kߟz?*moo`vE~ھo%?smylDޛwũ/_pͲfɷP}Eu,K_?h_T2XlܯiN!dSC#e"(ʷ?&p{ogD<]W"o_vi#y%pO}j?`;I.6_?~O䫾MM="/6ő}ϓ\R1uKRc:^jcf|+BLM?hD璿TںG~߹\{}.+I~ĺVk4h}"X I{s[2H*tf\]6My&zmqcLVI^7?iFVٻ?³|tMY9ݏ$y9HH*Yc̛#D`-\.ffpx3c9 }٤ ?{IϾ[oj?.5+nbR>x_Z_39÷2#E*df&YzqtIsUrgΚ?|"\]=Oh3qϱ~} t|~:kso۩̘ydܻ^??#߮g#پ/"io{fЂ$I.sfajvqIhivG}QW#ؠdΟћffYlbHg~`o?rO?oױÜF;$߼wejC .jޕZVHo-4%I4ΛgMc2&ocgWu;?9']^Icgor_7O\='d嶪za.DZ"K<ϽhG4P *M2wz;+hI&}+NU=mo%ȍ&Q)4k{=U-tȩۧMiXV0KdhJKn.+M+^"i&0[1M&,4ԯn-c};ɾԉޞZyKq6J&ϟzdͼNn#Oo6|+:=Zݿ 4k=ƇgsZi"\{{h,p۬ԙOڠCiekkOh[f[X*}lF{7#޻[U;9ѤOEnk"ޑ7\Ir8Y!T#ŸgߕQ?{تd&㽷Zv'֝mV þ\YDok,RlKgfw7GjG7} ټw7j0AU";gᄇ!_M[ٷdPc)']$[lWyгHbڛTϳȾWVDZ$&nn}᭽>OF5u_r_;V&>љ:]c{,.^Xwq>w>Gڛw;kyiyVZi0T#uO'}?{HMGZ侧4[ &X1|DZ>JɶmxKxOZύ9 o[c3GĵǛ'nC$k7W]~oy5Fmo_WCkhԵ5Yw댆?3~ϑrnSI{%0[[bw)%5gkCcoZY_`YTO6ٕ7}?>pz4F&M6<.͟~՝MO2:{MA&/nv_#zu߯=drv1SfDZo46PX6]GgHt߭axyPlFgz*?1|O'խ9L%߷"#zЩPv?}*p7w4Ŀ5w_՗kdhds:ySkd/ XfPXn.fdzoͽZSL3мi))_w2CЯomwW4)!H`xo՛gc=͎>q6V Yb;U{yI7?΅-!nW_ߣ ;  2#͹.;*o~+'ðzdA`5)Ƴ_7%bDGyY̾Rn==EYSMoGɿ)mfdHy?+dt{Y3=V*ͺMji[ot{ u$],m }Jyb.>HߺseǑ1ڭyo:K}J$l<+rU+ݿ_imo%G#$?5w(y/GSЕnIx- yo꜑?{?䟼/25_iր\*g+6H>el&i.f)V?'ceKkqmEx j`VVLR?//9۫ly6YyJhaOl߾/6QOM]s.Z R~k{o6o\#/TmU#B>xWW#/)6m6 /~jZІd$OZXyiyg66k-ܡVNMgoEy1CC(2&i6\$2}ٷ $o_<挻ɱPˈdɶ(n'UW)"4q&\oaQG Jmd]hZŝޟyomE$h[|'|O?ACn$?_&3y,pߟݨog<ri,c"^.|fxs4ww*ڞ6O}5Eo,Aƙ7|,ޭ+}n_zcO.M殪_d2>1/Iqkw?f$m"Yb@wM7;ZwVU6'[?~|׋~%e:H$]W_$DIG6]H-Ǹ>icd?C oUtj Bm6mSS%ϲd&FYۗ~DRFonD8o%ldRC>f'ʟ AwzQ;Mu]ZUko3o/2}r+jD[\^E`l?R) 36w  gUVgH~ҾSm8Z*JrBn6bgO?YAd]/tl+NZ|<~٭]sG'ɾψmwsaa/t*yP]YZ3Mmqm%Va;7)x[cۖF(|+FXb2Ucuw/eꝜ>t~,񽎞a$o(k{-|d|͉kw%n.'MgjVC%ŴZ:h{tJM WmO7WKkMwĶQrh:xwD:ϖM'fk!oY?,k\i#O=kdZ\ܟ. 7lj]YM`Imm?rs1#HIg.s%Y,?ey^OejiXamOmYhZe{.vwW}:RjƖ>t2;vc#ZdȖq.$R2I0FPK.WW"$Ӟ#; :ݢk_Kmt;D-KM>\l]_ ^^xo͗KGc>L#~qRB~v {~N5 b%OaxO 9={AdE~Qԣ̖mmy6Co{>J]7ƸM{K<52Xݥ7f5ĻRM+5=xcG4EgO Ŷ^7oT#~}ʿjo_>5;XHHf>J??Ej&v$YoUv'7kS̗|6%o?x?.o63f9}2\y۞k&u!]ȞG[Iig5 ΛrĿ/Ϥ{Ğmxy|?' >77#)mݤQQqs̓;c}r:4im×?o㮟BO/t`2}13\|ZVͿ|?ޮz j7ox׭Z ޵6 y-}G~ۑDz<63\|y)Ć/+ncmc6l^}xcH-c+YʜyO|'9WHmTW&haM"rO?R'zȋ}qԗM޶/ǑF\nb^amCg&ԤU4Y\mFBIZ7*c>^g=eB%GEͿgo~seXHn>bYRI ܤ)"C#od}MY8MG6뚵f\[O읚_3o|m&]#HOSI3#e{#߳vr [HdݲU9sgH귗q3#M"Mf8#ƆO|OJn.kȋqĞMIs6Uf|ǍvʿyK Ķ\.1͔ȭɃ-=qBpͳ?R۪2>nn]jlėp@KXeM']6"+͔;⯉'4߇k5{p1$wȳG?|^D޹ yT?o.j癷-ct# ޥᡴ7 mvw|-U]ϝvW9bKuZ۸Wc*R5;s{m\CTg{>zcY%gHd'U?oVͣk# ͝n>u&Z-VQ[X%˥Ɏ7o}E;}vm#Z}c_Nj:E>dGc|iJ6-qۈEշ^{n'l[Dr8ʷ5%#wtxl]$]/<:w[yʱom a)u&I湙l!~+/ٻXix/v`5Xm-}^Q:T0n67j4;/%K-Kgyi%FE2'#^uq,G9yHUeWo?Lfگ'/ʚ0?h^gw:]O©.f=Tm<<پGvXdW,ܛC4Nđ-d2|lΛ^_ue+pZ()zB]Q$i!i;ƾV]?yo oWvQϒm^mݎ7%("p;*?7VOR-6=nV=<1Wf2FE7>Ց<]_fe_Kg~q\M }'P{y*4CdK[?|_sE&chS* =4{w@Q[*) 3\۹c+&&O⢼W63 9K5#wweI;dWwU+cd$_Tl4-.Ww-3Su{Fw״ԡi$y.>?5o|lEE m=D,j6[s5KXF]gojwy&+ZKrJL6ϺVVS-^Zo/&HS+}Q$[&U-um?| /o>{m ]4o3qkc4ps v_rq۴;e_v)Ǯcsy=WʄKh;G36ݧ*wSz5LP w̴Y?xw7I;"SMV_|d><6X>l5W~s d4$;]MC7]Ir[O'}dMlvrDrO}gm awddO&|RGFM۾o|ן4uS*C-g>Vu ~oo %k>MR}fZq E:mٵ[STqʜe/—qA*Æ}?W-!۲%l_?ʟ ٭oKY%%r'T W:5\=7ıH6 v^Y;3}ޥm__z}X"BgB:l}z^ F#{kkH_T6ȓT/4[̐ɲFvܮF-fGލ_Z_>d2i~#y+کDqSJ_^^XE%ǘ4RdPyO,x?īXm(vڿ#칌GH$/?avqWQmX˭A<*xzf[w0w|Ji咦cʰGٷɸo)Ho.bۺe?ۮ_*m@yU?V:kƛ͍[?͏Ɓ*(#at>#T7еOk6`˨\Mg/ٮa9H>?W1y1"Y y͵~X]>ySO^fA]\R*|T)$sZ;y?*[W=ƿTՍ:6njnXjZ;ﵚn!xMix=+yj3\^^_7:lVma~7#7+2hxyE޿-,riO}']ԧX4&'^Ms}DBdE̋V*/dk+Jo.Z|p!FޯWb14d|y򤻗}~U6n[B0Z}7WKZi_-ןmy >R"lMVˏҟsgqo$T?ڴuKb˾%h-?<$6]G?خ^3§qݷ4MNoOۣF:)ͽ6:|}~[o lymX"KdP.>EOiT'_{ۻYurkO*h|ɞOޟ._emIKDִ,uYI|?~/#KQ kID۶6ٲn|wHll\媓DPSi%~J q|dze*Z LdrWN>CUS*aq'R ܹԬ$kht6{8~N>9>Jʑ8涖mm*0Bgݙ|ˇaz@%ė:z?VYo "#oA7VQ+iȻwG+LS{ZOAѓj|_ٞi7{u.6yjCw'%rlcKurpy.GGլu) ;Z_?w.CL/TγH6vhbQ /V+ЧRP8O[ц 2?hE=-0mO'ZRv +Jxf:d}bk[Iu?J/E?خJdI?w~}\gh?詌O:d#^/,dkk9_+t?'>LcSZEom+ Xb4?_ܾN|S-A7ovLm"?تPsOVP/6N#kasb6i=eQ2s/]?ج}"4{KX5#1?f7vݿ~m6>q'*ə6giҪ\/, 뙭=%$~JYݶ3AϷjҎDyۿgHzm[q117:٥2jO& lΔ h_SE~>YzNk"9-ᶫ/U;MϷoѼouԏ? %Kog~ Qήt?Y}ݫS\Hn/ K-lDJݮ wQ_ͥC5Z\8?:=&2iIk >O*kxco- ?|_Ymd&Rey$zf_j&>gIRgUf=MSNF9֥fkYfiGol77/3D_~lO'ȍ=mBϺD>-1 Rŷ;hDC.~˷HV!mZt7o̾T[bO[U#S|ͻ7Gh~5ϝRƻyDsy_vl BsEQt6wa/$U?#ҭFΩ4;sp9d:ԙM s}FRR|5Ε;TG[$|s-'Y뛏WL7uV6eIxw톡7쩤gLm*&۶Tr"QcsfF ΰ}oF}+mUon-6m~.+H͒]&}˱LU) EN]?gڙqcnՊ)յ7GNͨOyR?w[IG򯝳OV2o93lr;y7(aNĉzm*Y?s׎G}C恘y;%?fo{B0asl(oo~4QT7l fdY<}3˛'z6EeG so?_v;OWdO9}P+M?V嘿~Z"DNH~kȌ#cff_,>8_\^Ρ>'UŴ_h6zEup|\je|n}w_7m_eYҴ11s(&MgO/,yk~Oc5?އ>NRU%؏kimUDړMcgHvb6ؿjGn#O-vKn#uӮMP}|CoZڜ˾/mJyhiG}軿v طmH.| ? S쉄9>*frhoZ乇|}+I5,qyymot7o]]~|$ C=^ik**匐GvuΠ{:DZ>tmck=?Ttilo}~J1vG}L­ ҇xw>9gFԵ/}48nBOe|Ey1mwxZ?O>Ye|߫4ٹ(k>(?AfYW^H$/RX/[5Z|W11~N]۩<;}}O1}Po'5LG9ްK?'ɷ)o?l ɷ߾PO-zS$]:2͕Yw&jWC'_/qnF&sm_>tMo߹_!=|g5ceȍi&y5N+F'USUdy"sj$wDl=okoJKy`ܿJɷd]Ҥc*]Uzyκ<<ݛ<+!W4w>g]-ωm _+oO%ٳ~q"WF;<_D؟&Pek{|:nݵ/.UwEߺ?mOn%I>?U,?gO>?˒Vյ+m7$r[sօxF?۩65x>F*gbkhTOјɿXhUdYc~6z:jLYO$?5ٿ%Ğ]aO]#.%l6Otg æAx-w}ý5FO2c]4{Ox7'Фfwm^YMfZs_eǓv*Ѷe?Il_~}s YafC&ᷲ~uFఖL4x6]\ZORw}6}ʟa.Ɗh6›3oŧnK353ljq`?otr/&7Bh7ȃȠ,xQS3\m6c|6fDѥ_8|q d_3>[Z(̎Lsq0:j iii?jIPۤhլ33NsۚO'J'Rտ]ƐWdIɏ?7;˘^\x$G**A"|(b2C$6O#:Hw/\\I|CUUΐk9vmo}Gk6uH`L[Ku)1O`d?D|;%A'G73uZvUt;LkOXG$K7ZkTؓ]Gsk,?^r-|o c[$foo¾eV8a 6AUS[66RëjVzR$ azA}Jw[O^ᾃq_vu?q-^t-Frw?*9"HrlJd;#nfP)+^Dg ؼwaݳPi2Eo[>J$#LD{i{v<+#Bm*M$X"2aړ[XGʨ2:"Fn_ft߾Pi6ݭYmm.au2fWmaHqLrR}3FRP}Dk|@IncwUdH_{mH7[E}VZ{ gu׎7MiV]>4Ki>A];iZ#!/ w0S6y_[y4Ik{h o3?ح]=횺iz[oYf9M|9+(vs[C xvy%M'OAW<ϰAmV>\׷nF˓o?͎i%[^̡Eu/uq{BȝLy W5SI Cryi1P}Dj3>ac8$2}7JdԵY{_68`o;DϽ<ܭ۶?܅?s>?Uy#\Fw؉%uӧ(|%Τg,nV eymyl5j_<'W+[KkM޼.{U1})Qb{g!&u߄,$9NJ"Q/%!fl4Um؟ΰcl2}>y7*mg ms|Og ප~qma8>K&T+f[2ٿ.t{SUx>mE6>ųM?xM-ޥ_\Nl7|>}|WR17$g;*o2hcp$m}˻2@(Wj36ۭQi]^1utyWvnڍf+(O:Owúv^hKpKkooSO U넚~s˳̅dӌ%#K̷]Iwg\rI$&K{;rv١Cq|yu"!'Au:<ط~?[\LyT.,?ۼs }>vkm+n%?6W1nf"O.O] 74xzψF3son?}-^ŸWT4c8بnz__U61_?ٳKwvm f[i _ZM[u-[n.ϰܿw:|tŅiM>oEmJm-VϷq77<ߒXgM>Y7Sf.ayOu+]YX$S/Y}OTا֑UlaYWfUVxdd}D>䶁4O2pun_ۘOS 3u|)ԧ8Ls]nJҮ<чSg_0t}iWKR}MݧR.r.9Wa}5 Ċq$fEIs mz~e__\Cmp7y+xUC/?OմO^]Z}m"O|)r_Q);ŇyܫmgRv%Ҽ) ?O-KҖ*I, kKސ>c]uyyOfynj[wܯEx9C"FϨ~ZM:iIJŷ[Y72V=-Q(mei;1D|g&v?|UۘZ'0i"쯯e# U>OI LJ~ُ:$v>vUdxyޯ>.~Z:l_A}U9 +I_ o-꒕%-v}ڱ'MVA 9>0{ ;ö*xl~mCp&ϗ䯰]U~?gapes +?Omt؛#Y[U?`fuN28iROͺSVF>c%fUR^>E[@^[,ghgU{36liO]&gn|S_OUw]+} "n]?O?nwyM5HvW-OI4?Wo/n-ͷU~?تF>+Ϲۿe[8_W‹?LK=SlΚ]mO~~f?"N mfk]ʬ.'r_`M7Uۿ'b5Mh[AL|xL+CfI|ͬP$x_TŸ֗Ob~*Ri!w'߮o+"i=Cks_Iš͟ci#ԕ}|o>>qx5jKtV$/$C'J?~ltOU!`ݽ$1r66sisqqZ_O$C> U7}KCq7oFk7PyxS^ |o|5Զogyvc?t>?kyklw4O߯`:+mg9>nۑc˩7.>_~a__iOE-_ed32O b)0߇hUpG-"(a}&;e[\%˶)#o/oeiOg9_˚hku GrgCpF۬?ѬZ--[IZFOwUMi,R_}-}z+yg!-3BsPCv?_gu!{yw,O&ߵ=r*/|/vE6Uh ?0h]2?ۨngmgϖ=va}_9CȌf~Y8~ZP_L?]_hE&*k֯u+hnѵH~$0/enQ= ݿ1 &ݟefuE|LiՍ)V'rjM$)v*js>sZz>;z=më^y?'+q]ZqQOFJHv۞e}nˆd?ܨdoQwhcbyd2ʛO/g֛"}ka OrLuOٛnݚrB}מW9Ä5{A6|&_>G lO&-y_?3Wqoʵ$SbY#h)Cw |ukXwqZ~Ggr,fu)*"Cۈjn>z R= O240Yusq#7kF,Pt*f (Odoᾲh6meig*ju%KGIyr?*w];ϳ}Zկ)o~Ydޛ>MVe4M3>g7fȺq5iemRFtAgn<<ٶ}jPêjzVnvOqg`ğ7t 7NdwwRڴU6l}?@- D_l%^I{?*C+*I[qxMڟXɿU)%k7[?ث癗ȧO& /_*ѧ,dO&nPPmf̾v}}AX G]J6Β{-%{CgڢiqryY_ZWyХ}g}Z-ెhuc>Fתu ,A]+E[mM?~7r6o^C[Wx-W\̱%b6K >lYyMmH ֡ewܟG??6Q# lr՛=RncsG[*7j%٠Kk[ya>.|42LVgdL錩";yM/DlJoEtd'›ll[ie޾Dɗ!|O/~G?bl@hYj$G,g.؟+EK;ȡaүe$KMηUm_WKyio$ OY|voYGsh_?z_gD\44?~}z8a!ݵ̖k+*d!O:޵d; e@$Fc}ˋ{juUx mRHvl~w+VK k C65O+^Dg vm4w/"n}ʆ91 *? aTr vuO0OgWGRI3l4Z8 tI<{E ċfI.fhfw*’.30aWߓej7ɽ??2(4m&+l"2#Tkky$uiw:fdؾWƿ'?wq4:U6{t͔r )_/-;knmjf5-j.Ϛd]BW^t{]ҴnJXj6pdݶ!oezu!mkH!1Z57[%X׭].gi-̋\ -p2KiۦvTL2}=ԣEjKt;Jjt\qs|Э^.yOΊSK)?:s[k[*Y8j8?ƾ_"ln)G{FY|Mx\C)fo~1X7>yyspj4kgDr%ş|OM淹ClGٿgOrK8aH[?Z/.;ol(魈 mloȿ:7"}uvw6sq`Mts}.o1q3/.o///$?~?C/Jf.fUZyɻZ'ө*gr5)?DS{lu5?ʒs`%oMqgm>_e'?r*C~˶u0ѼvS{ȤtDBM4m5xHm4vHw/$KĹ9L!( H?unCrVCuy[<޹-8a}m+a& lᰖ?/O23̖pMw5Og&wm?\W\{k||v.[~7l xsR𝼱OgurKbK%KHGTr).")>͟卑CQSY^GQwyk|^.;fLvnnUm=ݻOCxܛ^tv3k~Z>k໋?i}>q S\LF?ŷ?*[Ynm˸TsYO>I$USWNt5?Cu-VjR'w.sS}3di/Onn~é\}ioO=Z~Rcl!k' '٧OfU#: t6vݛ¡OO7COm*CC :*olgcӓHEc?U;'Ѷd_tbGC7-bY={J5w_;tȩLYm]S|K4_y%yT}:eFeUf̰^d*lԛmHc?;H^/gZk/*I`[H%|25 6ϩCmW>z,vo:G#6~ Ih泍/#["yGVr<gai}&Gqp/V]G5r2gC'rC0< {>*o']*v_mO~<oUw}c|ykxS[yO*Zlz.?sCxf`~D_,ЧٟV3y?1]"OX~kZx&GU8-<3r,k?ٖn&>b|]$?ң2&?] rXSnsGo/'򕮟ȃﲿRORoaN.d7O_)_~i}~B?u&Ǔ5kU/*)y~O_uԒlZžU~ܸGO[ƺG c?\8O韉KlDIF޿3°w #{iu =boj]?g=OO CjKw?_о 3y\B>ۈ밵V0Ğ?)Sl1OĪ75O{nm kSrFSMo»;_<ĶO⪆"ÿzS,?~jL$X>m]zm`9<ٲ5*0 If~Jmv,q>*ͯӯ]7y<<'߯JO2?'>^]r%"aOjs?xe[w5V58fĖ\z,`+Q*` vy*?ܛ b+Gi$4x$]XcZV[Tro{8MtH6fE}?De[zt{uZN"'_E7}"kn?sR0e%H]A\'ڿ3ֽ52{kgne~ufTڕs#8o#bYO2.4X]?rHlĬb?K$/({#[ֿ_awl?cp[9o?qD?NɼǸGD\"h{S? GGxc&*xq7_X ˟%c0?N OEeg_} 3~w;vvyUn?0'<W9']5fC2|i?DL'L_:nܴNpܓﺅ!+|_c!٣7~MGGDf/gcϣ_x/Oo'=[C Ze[8 |rC7UD}*d»6$4bϣ%Md>y|S?w>ZN:M4_?=ziH~.T}*sO&:z$No\M/wRXa{ roO%\S!o2]+?aOΚ|os'DerON>#qB'ZI2c5."?JncU.?MY1v%S-běoʯ-ˬ,>"-o?G%qO̐h5xRŇ?7]M2ilq?1q7^Cqlm!jS0Il H[h#}MeSSSMM}ve]Y) ~wW&)q˄q7߳64_*wa[?9N&$oia·~]Z¦#qO>'ݏ_3GMaTݟditW:V7Z nf{ bI<'xϳAc3D8S8z 9ۖygʙoI&?56ye|3mhTbI&}ʊ3=m{:u[7&=x52iO*U>r.<Tm̧ȓ!#}uiVOѧXz_5qVi>wOvdU߳}yP{?/VjZ7nK.uW^Z O^5>"用dWol"mޝ"iMY:Я $0s5X~jC&aQ[+6MKү&/,3zijD}rDIT4ɕǚͽͫ\%p^FOtSyyOu-j7z:#fMg)<7W-'%]i/-?)$mfL.Uq 4iq nh*X?>o-I?c>fI$0 s\ٍ|]&ݻmrO]Js˹ʥ5HaD LĿP̵ a؅d%ٝH%Cav37t~Ifr8x|TfZGTFGo;Mc*yͽmC)vo>urKim[YZ[k}8v"ܯmR6͔7RK=I濸= Km;ZTMOKx>Ѷ_#?/_*LJ|?}]Atm*kIouؼRs{rQH-inkEoe{;kM'QlDO+Sd Y4rS|OTiY|_{v͛X}vo$>FeI:<דW\>"(Hzq0&}$jWY\&$c̖/M1]-gkGSfOӶ3}fx|7tUi 2[B61neyI뫑 7fٳ:;y-˷zAx>U렴MImfkLGt?3PoM!dsaƦci<|ڮ$qÿtkvgwOWב -CRmRk?w&zƮW. 75]7V°C6nnqk-~8cl$s 4mfƯ!kj51C o"3J/D%$?czmis[Y԰_G7 ɓn*ϐ4ɳgݦH˳fz.wGAgj{!}i?ջU_3eiy$H[n-M6TPoy<ɬlw0RFU^TxGI-w:Ȟ^?ۭ+Sȶ}ꭨ^v `SlتEN<|Gz։c{Zj6qN^2ޛ}˜| 2Cp.~1dTQ#~7੶{k;nƯ>;؛Ļv7M $39Kl[<ȟE_[5yGi}J磒&JX\w䩱/= Y?u{&ޒywG WIXwy[94[fޓ&ɤm#?r,̯m<'=|'tl?{~T#W+(*q6OZ˽ mۺ:˟1gS2㉿ּG\z{kw%y$O+g#$}.壿ٱnwCjsCiyljyR|Ȍp9'%#}ZVOy$eɳOy[|}v~^j}f _ް|~ЂբD{$ϲDxVppK+mky~t>M?}zX#ǩfYm$|O -D5xv./-?]g^ 5Ͽ5۷7O6ɲ6Hٳbob*㚾Ǔ_jӾ>ϟ{)Gx_DĿz? _ xĖھ{ CmtꝾGމڥxe?ssYݬڼ[D[߿%rAh˱d?3l\ըv{ZTDQx{}kV\5-n/5_47\Zse1hSf˔?cc b xgg[w |a{sH;2J8>زp-h-k'\_q'o?ܮPocZ\dʟku qz>e0~Ʊ~#[N}e_Kۏ&Y|6m.-EpnW䧞RL󥲚KHgLü:l7Lٷ p:}'ϿIx$8o'ӭ-N'Ag7]RC #]W-ʷMz?߯.ۯe*f]iogQIw͑^?ƴ>_Ouq B5Ǔ'_\|g_NB4Ѳ~X^?(SxHig m~= e)}?t?u($$%f:߼K+wU5c;-6Wm2G *|mcOSqTlƧՏv$ݟt2B:='ȵ'3M&,[=/I#M<5/|Ob~Hmt_XnClWo߮M?:u)hlQ OlO4L?.\kD`3v(y'R_&G%Z̅Js']+d{ž%唾3G?7?Hfʏɓ/ºU٤+d68a)l],,oi>".Eαǔ\tK8mJx`fا,f8l-?ݍҵm~͵?ƧԿxV?5͵ŕah&͓ɷ%I+°4/3ZW kY!γHd6iO\Ugͦ÷}-.$Wma bL+éwsJU>9?3]XmvzGllKyʑx΅,F~MmBDx^}O3Ow S.#w͢~7#_;}~/ mI?w6<%ovt2LuI"^}Os: }_[/ۼcO2 GL`h%ZƁMBGZW|Xic/_bWSLj>I]o{mt. %}k{Ų.7{m˷)3\yzKE}qg?C?e'dOda7"moxd^i/*6Q B;Roo\UOgOp'6߇cG}6΍u ۴5<ٲ ̏ '{:ŲM2\MoT?mV= \#Ç6mxSOO3%lC¥K넆=a-t{ѭu|/٬5=/X-ڤiO4SwSph 4 jgp'\\x?ٿ5ZG XJyNOBvopZ8Sɼכǚ?," Z g~zOnכ_>V~ͣ'#bvR.IZ?ðIw(#G;wO~SuVTđ"Y?jڔ5xM\ů5H| }!.n?y7nq^[~x|4j0(^O;S]yd6ÿv~xJ+&YY?G^ͿtycMc)aFccțR'~HUy׉?r_&b"zad=Bh*W"=O_ӭeߩ_::M*~}A/X:v몝Sϥ|Um#olȭ)LnKv_?dJM>kMWX<߿7ZȂ=V?BGx!_&{kv__X\G 71Y$W^ p?d2JoEum7,9ﺏ=:$r}yeCDc53G2K}|Ms#?xnmc,wl2L) wW5|'&|g}DKdmۮ=/4D+1|C-W,dm|a%O?&?wU'碡oMxb-&?g}Qi7 o >-˕*ͼz2[xcG#J'X_GiѷՍ?R [í;M?)!_VԭeePF4l4_5t;C ?^OᑶJ o q,0Fs.ТqZ1YsO:xVx~z?Wfm٤ͥAhZ}{X?Jc7ivO}?:V/SM?2l{4zG_=l,#m𥼏̬5T#_O%l5XxcMR<]i.5A-?kzԟ@dڵI4Au fl*}ƃmso]]?NsɾPwҸٱ<7'O1hCa'ϳ0{uPbi[G<.as{L?5o4U2sG}!=SHҧK4WgOa?&loܮBk}BO&ViS-ǙyfD4-5Ί&iTl?o9q!M%Vw}-h\Is'VGJ7]0էJ65|H$y|ʭ/Osu'_ȩ*|;Dk&+J7Xۧ۫zY?tlE?Sr> nqΛ*|+"̟QOe^Si]4OW>b|7)k{k]sDQ#(PAO  cȫ~WW~H=d+Կb Il& |S?^l<ڞ u>*Q?./ry,d2|~:$wiٷ߆<巳ctRs2|_Z?/?zT1K;8aV=S aqqNv̛~=|vU_?=S aG^]6i}>n>3s%?5I, ?1zGoI\lܟ Uٓ?_ڼ ='Ǹ'ỏ'jW`>OћOXgWQ4Y?=c ߭ y4,7]?k?e 7ϥY_KPޥb?$o+u'Ri<ҮRoG+pw᯿a 7ۿ+}%2#xO8~úoҵ~;طXXT5_Wj߰h^|RMJYZ$y:~8dY\Krϊ3j_N sLtƻm⸛s[ *O7l&[m77ݷW_Miz߇c:O|TGUuM"Or+u >p ⵏ&{9n]s CLw+k:myʹ߷܋Jĵ&_xg`ҷ岶-qU~%|~?7ÝUWk _^seãIyu8uӤg_5T&VS¥?G[xUi[bwmr^zHj߰!wWx'׿ry߿^6/3UOwSxvC6u~M~~:>vtG[kϵ/GV]q,GU#9Oxş+kܬ3~߳o.߰\5,Ī<+1G.*|S>7⡎i>Wu[xI,]|!?-+qOt}%2OXso*x`C6dkWW)ѶIsa|;ǵGY?r{fyAW6Q 3LLo@ C٨V/f|#ѧ4,<;>y4(\b>m6K7*#Z@]=,q3eWO;؆9K;#|ˈ}go{?yDI?Ztx$sn#N$H߱>+*KOۙdt鶮$1ܢhcunVHy'd]no?rGr\J>O˻mUV76@\F/gȏo*;y]l4+kMo#xW}![Y[z}+q>J&ϟzG^2?V|v\lΚ2/sf>l+feȐ{BH乌̞vȮuvoOU{7YZ̓"o?vI^CT6eα|Go/?s~R.o|n]j js~ɍ?t G5ؠ򑦙I_,&͟oh;rّ y?]i[k1èAK.PSy:|1vC7r9D5eo!<kvg xJBͩ\yi=c?~^%5O"&YܿoC1TT1^yܭ{P7?7enQ! DDH""|\Lkܢ;G57ٮ,~|U~'=ڳYɥyZ̷MǝnjIkR_ﭰX~u-bO A5]͞b?ZȒ~xɺk|%g_.2)Ѝ?l?|:TX~y36Oui8?fHc$&dwJxR_<nk*!8<~4MҦaRt }=Cٜ\*y>r6$?ٲI7lMg-&'r?Ua9k:Ivj/#F7lةH.IC'Pf䘞U= ؆ Iw .Ch[k4~ݯVn>%,<ؼ7-Mk<ŭUI!#p%W>7 2T\<$^ZiBo|W`Q^KVYyR\^&V=R!sgY6ʯʹg+5򹜘E&eRi.]Wqllk\lfYm{y%߷ܤI!{kY=Vp}ve8^I%t}N\Yl0},tas#%ͳmtB%d_ݯթSgvVmHu۶?Gf1MxcmW]xmq|uqm?_:gr Mgmo +E3]ZoÝJ?:cdVýI-aKi_o쿫H~-O>omOhT{өG.ÖS9iv+.hhI,hMo" 7ay0+ AUl&/nZ/^蟾Eߞ9^3f~G.sc;̻?dZchw}z&2G`x,(%K¾ {L~ըyc^o&ϓg[y:k?ݷ4_fm?^pϤH?ݍ~_}yu7.f8ҹgTzT\?ѿtxf8-AQiq:O@?/4d|K$>\Nkhc7:對7[/ *ukb~)_RXo<&[[&#A+d_[u3CsJ[fD_ozO33,}?󞞷,mb{4;w{7өκR>a->mKw2}ւ66T4dc >!TWu6 >J9&ӣktuԐtbMMz7Dſ)f4RiCW2 vگ?YW6!/^}TvooWT|A%X|5<׾fþK?zh>v:=e#'BSfVA'5v. ޱ/udAjNfxomKk߮zS7!CR|?O9\|[״;_:{ =~hGus4!_O}j7v?ZE}]v:|N ԫ?M>j%nm|I&k t{;{;=_^oVͶmn-&OIğ6~K'KssYy9= lmO.=yCJ#Mo!HCo_|m-n๭,޷ y|#'"I/?,n|:>yuf,n:>?jOi~k%7ΐ쩣4CsW&?K/#_]|9Y_2\}XẂxO !C&h?l{M~]WSΧbϯfb|$EHJ͛ԡl?MԤI;zwTNԚ^OgySʒAχUafwұQ޹/R'{򠷱ȋWcVOjW>$nm]E| KC,?rF&>ͽ;&mI? K/rHկ*f/B/?]Ϳŏ:|Z5rgbW= wu6#nYdϓevw㶆{]x7\uNyy}NU>#[94km|?lJX'|EVIR/[ڔK%B#[~MgᷚmC6&4`i |[ S,-Vh}.#o?JڶtGۭslMq ±֟!9Vkx_}м/5bk[M+P<{+[?azշ$[o'G/3_>$>* O Sźi?[ȿ_sI7S!$g=MyfQKMY7φ}K^4ILK}/ e.(cž$"U%+񆉥Y5w-Juhvp.^? d^]Zi6V^d?Z!Pa. iV%/eMOi>k6qy#HCm5z;wkW|-}\Mń1V6ts}mU77^<׭n-/?yo?Ҭ;J7SYol,ay,w.[CmFT7I]ڇv첸 ?7쫖?!ɱxnf~!o-ɪ>K{lKKټi ŎXl U԰I4{1? /T.7JIn>buV:t=_߳_}WC};T,C|L5>/Gm3 ) ˾\h,8K[dGa5_WSrdX~myCm}Dzu7ٿ֒kqu:/7Mom*+^D~YRk B(d}f3g4[2YGGt-U_nR>$Yp,G%Z  }oW孉Qxad6W [5+̟ W,'YS@6$[wjVO64:yhmo4@Kl;X~{9V$v my1ZSii4{2X%:jZZ5Moy,{m.y_i{Ȏ?4-7\wk&OKX}5TPyR:fCǛ^uGUka1&_ Ja\i>צz| qhپ",K6[Bm[ko7V& Mr$7 _\<ݜG,[|f2Ry>lUqol|t0$yufþ\p4y߸ 9f=~?ޫSh3FaKe{idշCM{snG7[jy~sckf/C=#t|Ud_(My?]A>̚9=l|Z[\q Eǝ qyȔy/vuyS^[Fwm--̐\'3U2ޖ ]"Thttd?*wS7%?uɵ~tݧIy͍ v;l?\zXO=G"6m 3:cԶ7LFIGt~[̲}׏Pyגi~f0yIVۯ?種^ޟcn6E2?Vd??X_n5yuP$zyvn?U5$77ct~[[6cŠuGo#JJtw')Tc:*U>(d6_mdjW?[S"rG+z\˳u+ggqO+:7vRq 8gSx L$mʹ+Ro}ɷQ:$ 8 cũuO}C[ל_GkԿcȓ~﷖1>L=]7קKČ}=#XjOW?a O^Q>t7C?٦Ic H?<'b>?zMDҬ?sLd oW&m&7jxZűn?rߤmS>On gg_&YU%]5&SNn7Yg58:O}Ww;,$kµ&ΰvPLٰ~iϝ:?_gQokLj?+;Xy?ɲܺiRMyY.Կa MKtw#}&2Ťx<'⌳g߰j% }O5#}A}c ባS^38,&&Ee.bWƮ:P<^+ԏ&Ki64?YWv=}ﴉğ:5&n&5+5o&DfG?ُFe_8lLJ9x5%Zȵ:3M7g|q._*x S˭V3zz83, k &ik\]íJ lڋn߽_Շw3o3W Go/ˋwɾ&a*>ET4[s ݄sYv~—y-O;fٯ'_No$sm4D5=xp?d3ڪ_/?`*gxW\y?GܟlIV?Ŀ ݌d]qz-WfmdB_}t>p^4`q_l]=z)l~oCoV_}ɪ|tXo!{W|Ԣ[gbl< |4Ox˽7Oፖrn NZ8>R:n %bGm(X_I:O?r}^0xfsZn$vUQG/yQ+7m"y-Քg\i#J%оD}?_'WX=Y,G9ݒGYۨbFGSƜ!:\ۆjwʜ;7o]dt nۿU7k=gHm'%a^9#,2GϻVcdTM$R7NP¯7agI3YiH_$?U'"ý$GMۍX&]O{6 ugl3oo#n[2VgggC+]Mqq/yQl6 ]/o53[Xy^]Ļo%tg3NJзdO>wlCoM䧖GP+tȹnȻ>obs|vI5>Uw~Dq(hR.*,ol t$=w!gԭ,;;y̑ʡ + y72[} _&=b1uLdz۪# _6O]l]̋oeo'QͿ~d"Hv=%_zi}?T;dk?\~s.fcSѾ<9~$N<- nʰyڭVd}VfT(]>xc-no=y}2Y$m؍5~S™3n-$tild*2[(KJ&ƛzx$5w9 o&w˙б0G:UfHdD%_Q/o>l!m6Tl=򿉿BI-Mݕ?+Q#q춓Y*c 4wnjbeH_].k FfϻZ,lc엖U_O[_$V4rOsibn]_V"?s;?^ CtIot9wtٗ?}^aǙ>{9>=?p߳t.뤲>s_? ?خGoռϱp -gJ؏f ΚkyO˺%|C2R,gˈm[yqyKlש_m}Jz)S< 6J=Bojbt}Z8_ytپ9w}jS|,u #t=fCy[~Wo溑6~o_Tj;o^zܓB\E2&9"uJt:mQ_MӾ41'Ο4?mKψOpZZ?]j8G}> `>i3ͩG 2}ϴJlWh4K& y? 1 ?g B&\8lWSNShi+m۵l?uw앷zΡgZMohea!8 tȚ\7@7;aR" C=/xM}[SV$.__i+~|THaҾGMqRMmt71_+iӫPS~qkwv0GwJϘ;4ގ_#o dV-~'W{[Tip}ׯW`>j0S\Ͻ]y #i>䦥߈Z#PfUiQ*'C]C4>Z8Ĕ~_ 6['c]|>TW6ߴg]+Vf}58^5d;;d[4:MuԵ[==vrkz³Y 5 !4x{*(tJoxk;&Hfdk?ڧ],+Ft?ԿjO ďM kmt^_t)`ogXw/OAǫG|NiE<&qFZK?=|O|tV#Hׯ#rx zkS7\?&WK}^pЩU?Gmi4ŷ$6s>'p(<'oMq ofm]9_T֬o<ΝyqKx Vlk oiwu|}q޸%Wu!)sF'^.4}BXP۵T=mxźBybڧ+|C#3Cx_Jn"mt+m7׃|@n[CJK6y!"OKɯ^{<.m":VUsӄϧ MP[W۫Ά:t6~DNWĞ*K6[vhߺIvʛVK{?CL'aIL>ũA=qbPM6Eͪ=/CW}u^_}m֗{@x~MEmϱe \!8?,I]|Bd3[Y–~'okys}qaiV~{o_wқ5&w6H$3ע<2$2;?\ڄl}mo:=Kƞ*Ԥ5oaְW[-ve߾kxP.'sKl5m%Oo_0Oj+æQp|=bxBkQG:u7blWe;R푮O͕hvoH7j7>**`0q=TUnRi-־xVKUK vxQ [gX^sska?mYl_&¿ )c\u }5rŸ Vce_>gּA??-c^yǚ֎Zj_.a ;GJ&G?.U|C7}~oJUfYͰ؏GD2]?'/x4 {o>KK? |.s.wO ͇h <RguwXH'O]ͲOP/B)ߌzmoVwo-t?}V}-¿G Fm7,!l:?4w6W kπU߉; o6_ȾDޟc猩a{SkQۿ*񧄭6/vRN"|IkKӷCЦ_ չ'tz%ϾZŢGjP|WC:Gʗl`=z* ^m46> jp۞rlOYď&?uW^oQ ּ+_hwgr?OaOGKA+?'}wO|L|1|.gk{gkT}`^t,&#GzG _\x= *6ᮼ5d>{;V[wCm/q-lߕٳxYXGk?q;bl;+q 5]7,C{]6W""MgnB?3(!&gi lz\GΞw-Q6W?۬Z{^mĐ_K|Ҵz)8|QOoc$_a_þt9fZA ]bUq꩜{s4Oo>}CMxZzE'\/L?|shC׬Oa%quku:o{[\&gc?Wk՟R?xu)>0ڤq'\LRG /{-1]j,dow~<_ggu+,6oO䨧#:x -S|+x)|?voFg7++Or^=ly-|O:-!oʖx:㟀?/ |WJ""r0}N(|S |Qu6{χg<Ͽ>{^*o/6oi.o>֕ g.mOvRM'a_|;-U5_l״_7ԵH/O-drU?uZ獼Yc7מ-?Gj}s\ׅ|]zm*Ǘmou?~]d{k/X9%w}^o[魬y2?q&I/FH7R*vm^}Ux4y؉ w66Džu k϶xv%Iaq&CMk5mgQToٗ{egtx츿wS >DdiMiWХY$<_o?Ӥg{>x^io mI-b+Q^b3y[v+kψ z>6î|ɮKlܻbWm<=Z_%^`ّ|߀'iq2E?ǫ~z叉.$dInE^Fox^^e?_ӬG+xMu-$ҡg/ ƫ|4TR:WCmh>&}-u^sk72/uiWorwO-V|BwgjMFyl%Ucu(KXIӭ=/?&e֡s]A4K3u |C<{Os[wWL} |qS|pD|C??\8^#GS~׎?y?|<ipSt^kU/fyOM\[OqmmʟWi KM5>S[8ccUClDVo:Yͤj2o)㸚hHYv+c&$ga?_?,Zդ m ?zljSaozVż:TSamV*M 43y+)ف>4J\\%a<OJUI{Ƌ⦆|I'[^/oޕZSO[K٤_΁qῇw6>(fmttMж ȒihŹw˿Nal/hM3mGeg^4:xZt#^t"7uI߾N&ɋͩ?}M$7!߽6VT_nt{ﷺkM}5/ <[i,,.-t˪A:/|i칯o<1ҭkxQ߭] eV1Zټ#klef<߾{_McϧjyhڒDojoxnaMMkyykkozWyccs~KX$G{j{6ws_s >ykq {uh7IHRk7mq?9]Dҡy]>k͕Eb17=*mWX5{ƭ@]M8fw̟q_*^Y[jZW4cm6k|?iV뗗rk{x<NX ^um֕[~Ѷ_W/zIa.ݻM -/dt7dOnoX鮿$3~+*iD*x.nd]$j?7ޡk;i|7M5`UUv*N6yCow;OOm=ni#_}kf˗nά]M$MNi,v^'5Ngh唐l7zG^ t{v/peZޏL6*/"gu/M=|Isugg%'ݒKew-ޚmn;+I4hw֒}'ԮJK%Ǚ|sk^Mω5>o+z ;;8m&VO1S{[>MFO~8_g['ݎ5ٿ[2?|}#Y$hSG27[?\0yy־F܈礱OҤ+*?Ziw_:V cfco. 2 MY?׶}K5-~ugy|VxUu+I>7xoFaJ\ {{wqϲv*9$PĚǓ{?ʚk7lIU'i s24xeF/04ϤG7ݱҰ;L<.Vo44fͥPqwlJ9]iqj=ejk+aMdShG-B/gMk[B|PUOORSk~ vosʺܘßK[[̰#Vշ.'{{/d77/"vT8y~?ƕiM=%Ԧ??7/=S?D_1n^_gե&@} y?|.>}a$RjpvYbЯku_glHO*z=O[Ig $#vֆrgfvU/sҩ@ºm%i7vVU߀ k'E:9ۮy"3E@C^74hK}ve_IAhǃWK1Ǔ3X<y0s3?b y^Mi_Y)J&f8xF'2yN<־~7YE_.,cj=#FSk2slSqeU7:Ey_roW7Tğg'ty'buT*]Ź%#wğMKɼht:/IW}A?+5_·4-[2 }_'?8Oj ǪJ?y6߯׿6pl;?럲/2i'58G6Q=Z"gyWFG}_Q0I_p uDDA&m)ivMşMV8]4+O o;֞ :0DŽo7y2}eXW^ l5Eݵ-j>ϩy:To5Ůi-~C!?k׏=౟D x~9;Tci%LzbAkm4hYSRu5^]iYѯre 2Csn_2t_x럳3j+麢V|v+?X˱ ϒi$>JyQtI{{5Y"ϱ|;~~GO+wx'_x^_.%O㯌Oڭ'ٿ7_: `s'};6~En3G4I-Wd{aƿWT:25vyUaoWT}e GO6'g<+}E|ՒxO*~vKYf6Gƻv$$6η1>dl^-Lu,]77r?FrkgrNn.>mIcy"/&'QfR)&{qN*r/29w'_Vzl/y?Pɧ[C#³I5)VH7I5dKwoQFMxt!yDhښ6mK"M%q~E>2]c/?BDn46|U{>8aHdeCozijwO/DzcH&Oʷ.￁.u 44uHݡMշǛysM>jG76lrS¿ߛw| AvJmJ/ ~:{߫y!ٷk~ֱCyvS|/P?2 ݯmȸbOۿu2set6 vmǒ_ݳZs}}cO(߽X75Ž6Y|9f 7&|1%t _6-K>m:=}{|摼r¢aOb~_iݚo'g7qOg~VpbB}Ś/.Go$os|gB5W35N?>~Ji? ث4ѣZ'-a/n%J~&<M'ݚktS9&HҟPj?ߒ=D: ']g5yuҟnºWsʿe VĽrIko.ȾO;˯ę#. ğ1gD+;;O{]"-z֛/Z{?쳤ٿhv ۮҊd/$KcxRK\1Ocem?}:?jܫcj|_~ 7[m{~mM5|h`HUf"MiP}[[I!/F|0?Tڗcy?VPNISkWiq :<$ׯ:+ּž4ok3,!){?>!Qcwm(:ss?o\4OCXmJP»-64sjvįQܾ0yPHlo%,l4߄8t>#Ym~2t0>N"HPg 2&S䉻γѧԾ ^-|l<=OHfJOs@=#m ` ö+9g&o}3ςyq^x_m巑ͶOۤ4?N a#bz-Opu~5g[6]}n]lK|m}[;o^'&HT~hCmfO1/l6?>#fV}׳O#͆6?~hMRVzFsΪ7'Cs3z%q{M$A 棩HN}:[ySڦfy_FoOƣg 9/y \_m!OZSO9ceSV 3jw<7EMz͸τ,_G͞TY4}>0,6Fx7iF؊\׺7GMxh+h-$~ky SX+iZ}٭ 9E}bIK;Wk;^H^&23/[]7Ꮓ?Z?X7_Ʊo??2皿;WI2E E(^&H<ٱ_NWG9}BoZ/ټJGxt8VI2ܿ۽|T$sH2+xl.|=_kڃly'^G gIw2Is?5h{k}]oi^0oȼشCY596ogP{?\u-*-/lyPɼY3Wl)YfwUd6Q㏀>97o4l5޲G;[*An?)Ṽ=x^|6 Gߚן $:z~3G4lwGdTy"OU9em ;\|4::kv "> v+\%JOXXؽtwy@}W6Yt?紕ω.Gҵ/[6E^o CKTHM[᧌5XxGg]=&[\W¾_Ri ֺo}ss/R]N{7_-Ҵa[RtwIx|Wa?-vxٷ[% hS%|m3kk^0A7 v{?l^ax_B[&ҼED#H~gW|=k' ~3-惬}xO$?݆W@\ƽsH'YzX<>=sl?cּ4=.M[{OhTxfalcEurFyy F+<8KR7SU ?zLX|O&2y$1 M۾Go_{xw/~n/~mfYRSVK'ym+KRJ=l>KρQXa~+_C噓59x7ɶWN=Zk6v^Q}%͟1>OP8grxL#^cּB4coku_:/} EsfQ|B7N`䯂|i^|~5_a+j}߯ԼIkBkRδS+SU'>o7X͟K^IgKW7.1/?hCҿ.-DZC6燛{VhwC?c_4?@#ֿ{ξR%\ouF?iOx/A|IӒOs}wْ3lF7] fk&kmq*|lØvb Rg_؟ڷ].%ݷosבj:!٭ľ$//E^?> VPȟgt앷lk4Y}^*`MLmYS>»ωqkzÿ:[[Rto?O>?+~t6. /Ys _x^WILo"?۱zOu+5eb~O+4og{UO{/!lioQoxSz$?h|7k} &pE=i6;sv>K{koj9mKu50ގ+ FU9ڏ ?4<3ajhd1Mװx惣اTZi=ꮦs|+LE5kTRoa7rGǏ $-podӠTOCh u}|f3.)sI(?<쮃}Szo/Tzou_:d m\5WŇï_>غ rK=o>07?উꚢ|:Wxo~_[dy/O)83<?}ɢΞ[ڶey}M5KYi[]ψ|aog?t= e}7Ğn/d_+mog?[z%Oo uC}d#T*ɧaaz&[ko &abP?&n<ۄ$w:"l_Z΍ n0چ6KWm6W<shz(ɬxvEmOw,OF+THXdI}'{ҪiM4Vח/}Ʃg7 ; ҿ> m/{Xڕm=^ "DbM ?xz+>4G-1rס< B,j]z|Ҥ~8>g?MŮ E_!OrMW;İ.hnk߲=/|XXh<>TZ{>~ɓ%sqxúf:I1"t|Ue]cDo \}[gx:y ¾$0>obo)Vyi0Դ Y6 oO?\^,׾"?'jjzi~,/5iboG+Ռ>)^.7 yOou[;}sN߆,>2iYj;JLx|V\_Yyx}uL? ý¼Q Mk>$%燣Be-7_fX?mo~}?}J޷^6a%6? +վ^MaT=l>{Y׊h8 =x^C< ۯZ7?mņVj|&kuYuzl|y/éY;=|p?(,MU!xw5m+/D1oo.Il?i9 Έ!B&k 5M31_K~kaf+I}8x{W4+ B?muI?}߮cf"zl͖MA*p?_jn_:%.<ܴ+ʩ,)ա+~u5\\xMdw<\y(2K~+J=o;_*VkwW/ki6߉|I?o5 I!wg5]{^?g-5+ ҽu){)RT%ܣ,|ENmb^6͖-R|?y/xWDɥ֬ǝ ?2|/Twy~$s?5+9i>弟g.+ {m{O׆mX?wYM7Tןڭ<7xPѮb>zF9mK2*Gò?xž&4}W[nK[TحkjRwůnOXiZoo/ྟ~¾ 0;3Ii/>rhck?uJi_9_n_Z[2~!o/,..%TZ?ȟs\oܭ v'~ᡋzo߳1 P%az-I?i[ef. x oL1"e{ދGv_Z߄Im wUi u>? V?RiP'gpYg>\R2C5GiYtwնo.oM^<Ϲ^|){Mz,M&YK˛ gm4ğlb SsmaOsy>ʧT#Z4iםjWsCSԿ{&&}Ŭs3$|dKP?=?<]M?}׷g'KKUOZ.•a?n?et?u6w&.73S(S7N~x7z%~&n׉: t_uubj3l>o\YLصX62C=x&9^<ԴOG8tɿ}v"ԡ0$r߭w9_foipV+kڭܾMsy}~3gS|QmfinJҾ8y&Woci:ơs+/ӗZ]vڞsM7RcԞ߱כ_Lk^McNMԧMK=?=k1f:=ygso-4"|7<iڒjK"k ;K;\۴l.l,Z' w,RGڇƫ==aM^$On؟^^|D-Rhs~Tҡho-7m쩿W4KAouԶ]o<¤--jWm𽵶5|뇃 x58.7!f*̚Uψad'ʙm׮to:IRMĵ.Q.uKkпOGbmٺK/deא9˭@n[,9_\G3k:>g4^@?ߪpx7,l_:iwj3Yz&ff>CcumL槖2'ΉS|FXno-w0PA?֒:Υ[@UfY.n> ug>Ϧm|}wS_W燦 1I>M4sB7MY>z%GGپ9~ϧ񇇮hSXQP,4>m270fmg5h/KVVsXgD+k >-gW-|_mq 3>B}"oiW Z6seuA47-l+/?XK[K 3y2<?k|TjЯ:%x9|!Xs].V]VwPKx&{, ҡx^?v߭E??myŶi{:y}Һͥ0O.45${8Β7zmSMo;fq oY|E/$m'FFWmwMooZ<0O*l jI~rRi&k;$l Iߙ?)I#皽KMm>Vhh[4U{ŏLo7||w$a^1kq|G�Of? Œ>҉Z 3j_<TbUub'J-}RI7CY}3V#c0tj9|/lͷ$,'ܒ8m?g 1[RwQKi*ooBƎ&Qu7*ZF?mS5v_V";룐D_[x[>l~7wJ0|TB=YZ]n]#'͓nOkwf&t2U~(5ySbE}rW |=p#F|d24O,:룜81\5>b;4U O{}dAT(w7 F|'Lщm/؃·Lclbm^'Ks5My&o&w_A6e.9Dgife?k/0uW̯ <-? ,~O7eY66ɍ7>|ٯ|'qo/JCO=tff򏋿p=W*po^ST|]L5V70fȓ\Erimq?wI.f}cJe|O&m&iD*WÈGlhFfi[&x*_s7^[Hf:fa|7XӣC.5>ǒ(HJI]Sx)n}/4yVh]<9vO|N O8><[C?:?ܪsuq47>]wɦ4h[i\?^%Lt>#$n 撯~MmkQ 8z}^r^oUK:{>R]2Y_#yUSbO7Iu9Wz\6ȿc!i{&'}͏}_XEzW+jz=ټJ~ĞkדTgJd?b55l,uwCqIV7[WdJ|=*׮5k _+[Q4$}vvO/`}xI>ͣoK.J=z l7o_7tΙ>%|Zխm46fa_qҼZR׼Iou-߯COa3&>1YW*Օ^3|pI!O>0>z}=߅#mjP)qn-l>ȯw$kx<:9'wu*?<6S[yoՎT">D$e<=m}Ś_+7o틝6WloV[dH|;E7-55,m]k݁:rnMXM:F_/6;Ͳ?moGz i?3Ao쵤M6LOJW7 Y3xNf7i oo~!S >"mo^z)$ԧ̿V<>3_jVg6jUs k ;|=Ě'jZsD#l~>=Դ߆> ,{^ip}J\MOλJ_.T+9IҟIw0i;?uoX}ݼۋ{[mk\0$um?~(t ?56wN>Zj/.t}c߯iBqUPHll<%gld|VZڕ|C̗SIǗ}%z<8g~/!Mu?úmnK|6#Vt?jSx[iEơ]&q5~NoْG]ڝ(]QĒL/7^<08cjOퟥď~/4}oΈ{drdU5gP^m]"ߓZGIu{G]Havwg/>?hjCm=BG5$W=yt߶jZm"&yoi hƇ7-/%mo2IwU:=>ox|OW7y{ȟj?u^Xxc}zok=mn?_!i~)}7PzE']T?".gx]𖑮K{]66owJ*)m|g|.<i]"=Wj5χ(4;8t{"q'?ȲOY'M FGݹ$'~ϑyxsOjjj@. 6_i 7V9"j^"i^M |{-ھ jR=$kZvOwww+{s~oCag+Z}Oef">&1^v.ۇCuD%ߏ?"+dOtKyz~/>Ῑk)A]jW?y/qm9_'ku狭m>3 ?gOudӬɅg^!Aԭ?s4vmt_RTߺ}|XVԴ}.dW 5?WW*}bmtݽ?y}yu[uaO;ܬy5)m\07phׯ,GzpaupݲO/TuO9in~Z7"=[̟fI?د}CC #)\n w''ώ'X#Opco}\{Ɔl^MqUZԫO%[&dvOV#)/>'M7ij^Xپ>kZ%/oq~%6㕭zl橃 u3GdeikI<0ZKO Ҹ?W|rj7(-+6lM_l]JXiWIv'GXb%H'ey#wD|?\e浩jC4vB?^ui_x ߳ҿ}DM{ɢꋺRwOOMy%o -<ğVymRH?ou4<6v7iPE }ҏD={ͭXG:[oܗKt{c_jo-t :v?_=eD~^\oP_M.ltJ>?a._׋m4 iVU[T競78Zލ<%Ҽ3C汤 x?ɡ_Ku;$3oK緛ɚ&+(U=W?|b7lkr?oaA'Bf W\|:I_yeS<&mg`!WH0C^.z(uhWpź x_ž:{ n O Ҽ*ũ/=REо>(=¶Əg>]O}.']D%,3,n?c[ZM I_GuWYê^mٖsuOjd' #OoX\~]"Xu0j/i:'_OJo-_ۋ5B>"xUȰn,@kz-:+O~ܒX귟 OsJ)bۥD`G}W م:=?eϘ;'My3{{XbXWo^0C鷗:W#VK]6#w+կ?zy؊t0=_T GHM2tVm$Q%WVAF={0j2y)=&OоfX߯xM*4VO k?^!S;φ?x=RFijOl^Wmy M [>|}} aτм'<4_iDr{ާ#Mxk[yWegdK4J䧚B3y\|06 ᧎<#j*sAGogUŒM_c|EuHR=.C^[XJqj?>Ҹif?MҬ$x:5M&?jMķiWj_ <?ǐh-{NJYW^'$4 ~mThPޑ>xxo!YMخt~gMD>-xW^xODnʨ{Xx>$'n5(ʟl_CVREa 7K?l79]k3bI_h;ƻYxo}7|ukbk?akzuxKA=ﲺtg,5ƥ]_e4"U^ߴgK? Zo,CU򬴻[]V+8 =juJ<2ALwxL?c3 ~x/C2|7o2> _d_EhR3rnnuOxP[6嵚!_{ έVi7Fdğ}YWU>9O?3ߵk4=/-- K;kemx6zW}qǮor+{o|C33k<7b;R40֘ztτsϛßRiv 4k{+ˠȳ?%c䯷 ώtBiMϱ%H7+@iƃChijO>)|H;?-C^/'A'7.όϴvS<'1/XWO5t odžygMyYg)ko [_^|U/ԚT}VUIj_bPoYIO]Jr G{nj5/x>oDw?HzC׆K VF_ͧg#MJz zt~7 pEq{y'?tdob?{FwR¾ {^YeKɕ?)ofy<7ao*xm~Kd?[?|~cxXlWԭ|H34 h6w>' :&}']Wg4_7» m.ٺ/!{LFgFYl^׵[PozUjL6[f]polg//+zoM?;_N?^٧MoE|Mmm.UonScfTo/էo_|fգKX氂L}K~6Y|ިi4xAu*ۭ=)O=Xa=|['h:WNoYPM͖;{;Y2A6ϟ2֕:|щS*9e37x[Ҽ%xob򿶭e}7OODW)g|]񎗩$,5G;<{N7Md:m xXu(ܰﲾM<3f%gFOE8}"|+?'߉$lSx.zO,E.:WVĿjC_ I{>< E"&ni<;\چͶʂ}7?<;wgy~8+-OxX?ÿ,uW I$UwOzgQ~%ͭH|=jPZr}D4;{[40ϗgx)?ofG/zdž..o4=_߅'t멜|TZy] Sⶕ >$?&i3Nj=bǍ{x*Mc}?7"?xZ|TSMfD+?©r,>-,/͗[Z̗ %6}r7;>ݎާ3\|[\eycI+)~+t6h|{obOPm vV{k2Nk[Z3Ik4Y'" ' /#Rj!Fk%[$_O|bR7W5)#\z_ĽRm:fyĖ\=%e??1,Is_/KXJͼ#<m_^ 񝿌/-[^/?J}S/rX^MOSi_+=ך?Sjv߁K7K_׍~޿?tKڥ͝ǔmG~?͕֩MiMAv\ܧnා} hSu4fqY/ ?>5W /Z{~w>ߧjZ_6)!yw?^cOMJiwq4zblv||:UMGmE1?eoHk{~,iKGUka6-{r)R+˳_h>(kkWŸO?.=Vͬx/šnko.C^ڇ-a&>xNYgo&1?z\o\[cU1$:VqtwP/o+ǧ}NU?3bO 7Mռ[%뉋wӛĚKZ4_3T߾__I/D 56 p3m][~JGy{-q aZ ز~ WOi'>73E[h%|wse}uK}nKҧ&Ե$,3+;X]SUm7PHccߚ|TYUZ$rD.'ſ?[m:/sYٺ}?C"{aoܝߵZ[*rK 1vꍫX[?mFUhd_=7Mo2V_3e:McQ$fʟa.Ƽ=Mog;X園5"?vO${㺚&ZPjJpG]]^Mo û̕)js7Ql_qZr$zF_O֦'m](ͽ{ sO㩅˟'p6̿7,YGz]Qx{X:;>АyZ,5kx׺4v8n*VUM6gX[ݱ{}C#<zQzZԮ/6O7}Muxmvގ=Ag!@]~*7ӿG^GY0 >{sc͔̋6uqǼ6Wy?~//G| ~VǤî]Ik˄uo:?nzMVktq~Z~h?M1;Zcgi<S4t?T{#Hagng=慄pu~iį+}ngp7?du ^}4I[+aѬof|9go-?#㏲; s<gt:XC7s9(uK|=yS}mx$%-=|/gj4;k֭~?u{ {HSoDemYF=7kMk+wo7"x?ϪzOt٤rn7Gqu~lX2'X:xtW=QzΏ$U%]UI6-|P~ܞ~⹈VtΏO$s?,MPzŷ»6uR*E:o6ǸԦV O\d'7 2Moth̟'QYcXEpw tv\[ombD\6SBi4ıUI -ΛiytxFHs\%[Щŋ3*V^ɓ}b޿C%+YUv6k /jV ym}}#|ViFީ9O_>'wnE?~^s /%&%moo[_ ̨gYr"W{ v8FOޯ[iK8~-$Y>z[ÏK:Ɨ9-w>%.&Ԯg{&xjkkz_/-i\^W|VSYE᫋nFH֫K}*KuOVT7{;wGo6T~Zz=DQ$'P3W|C'O޿+Nr9$ԒZ8ޡOֳa߾j2O@X_,v4'ߏr=+ytxXg _<)U&7J.g7JǸ'߳ou;RF/m,eZ V>y+uo&JVI~Y'ޢ^Kb?%sQfomO~þ??mRic_Y3jGcK'uLkr?ݯ}㙒G?<f_yx7gfG;R?_5VODxȿw;ʑ?o4{fW 𮤳$Ta+ /XG1O'ޫj\å<ѾU󗊿a]n9k;W럲y׆#l-$.WV<xO9/}!(mnQlO$<^~λQ@7] `1~"Z dEUo |=q8T;xX}$5<-!x&MĞ'}%W+>-|1;?XM&7c鿰o<L O}o.>K.O7}׮]|8+7gۏR]o`H&cw^ |NJx{M} Ic+µMIsmCRᷖ'?Q:{XV<Re5Pj3sʅgL'QP[ zG?=/;,}%LlwZ+r;#zc@<M<>km 7Dޚ~]7L|U]>Gt[6k,;׋n,nt߲h^>`]eֿ{]=o.?>0I7V-_g YQkmi/$ω<@TEO׃$}g7ޭ(u['OWGwz z^~Oo퍿sx眏/⸟3>wy\kMb٠hoPOisG^]g d4&5]A-7ʯjeW5Sɳ-Gt6Ҭϯ'难evC}7j]kĚVcgmf~gwzu_&og5y_E#O}>Sp4JOg=MriPI|;fi!IIoųy i?/]^ќ܈P0Dг֡Y>d6r|ROW:Uexȱe$*tL+xW$><Z鲹-CX)mkC:TKu96~r cUqO|Y$ Lim'ҵzE𿇬eDK˭Ml0y>{.?&x{]FC%\,Y6K|WYZ$^Otۍ+GKoj\Mt'ڥ]4D~"NVmc7s{$qc2_JM MnTȮ>|^*Y-l ??9^KkZƱ_> K߶\D7V_Yܹn-&~W[)-a_o+乹_qoszOo+ /ڱs{IѦ˲\0|>?=o ]j?JKmaR6~GI%b|X$416:|FwͩxP׿uo5t_DJ/UP_Jy&t'_~$/mlaO=b5 tC47Uueh~җ:6&ٮs~JK\?O#?x"\h/o.l?y|Vƭc>$a bojNEv:o"<}ұUm!oO*ԍ?L?WGcH7:=ǛōKw~6Geյ獼akoo,r"$+čZ^8K=AEyyOXui^?jk߁ ԥ}{H3guAo>h{Vg'܋ut5'? xe<+,߇o5Z}gޟ'J돈4k-I?Gqo_s{)R*y<ҕO~XGexcž|AMFE4)ך^x_ ~º¿4}z?cDҠy=?nY!t4`]ޑt6m4K?\U>#E* >Yh^t_:>.qIxU\>ѩ<7 J|:l?&?ksa(|0<ʘ}KCӭgMS̼?[? Oyx݇4D(t.wϱO .s_G_j~Auz 6M 垛'q|lM'?ܮ|E W(gX]kCc<:WƏoyZ_-WB].~xWN%׵D? o5+ϱq\ ^&᜖~9'KKSisj\y7߁iIkUmıEi#&wztw㯈/Vw_oUw>f|C#eg۴Hu,?q>t߳^{>?j4{=.XC.g}>ǯ ~ʾ_4_RY}6jЧ|}i?eVCJc'_Y.yg|C ]J߈%Y]jy_ ;Gz?{?H|hPꖿol~i7bg;:׭'TWK͵t5‰3|$o|=a YN#“>x׼IFEl.-6A2rgJr~#)fyt_οAmI[Yo{ę ?2|Ox{Dس^Zȗ{6f:3ďsg]\yⳗcgCizl^q]{ &KW`x+~%o<+Z=IJŦɾ9DfbOj]a׼ tpQ za+k:O6{Y <Oûha4"w{D3^mLEZ ONCQC7Z?z\kx=Q}@⽧#>{O u_'/-LW,??i/M7|y^O kO_?i^?kCk'|ay5VB< s[|?eCϝ_':OzC>=7K4c_-[Kֲ_[l['O > PXh u "?u}]"EyxRmOKUHn|ss{<ǻX eyGk؟¾ởot.JrpxwR71?}ڛT6y[+[_<|iL׿i+Eׯ,5oNc7#+k_ojZ Gm597Im]+Yh:o|Aڇ.kl_v ?pܹ=ӏlbk_£NZ^^xU4+oϏy+^P78ʶV"7'ɽ+g?ׁhXk?(|N'-GbDgRo?f|Z']^|d&,L_'ɲiW^/(F'}K 6Gq %Po|OwVI=_{tMxCx+R׼Ki8+>GĿ ǀ K曭{=?YӮaw3| p=i/ Wm?[mϥKa~Vdj>yhsxfUF}tZW|.{~w׾$|D'/.6Ʃqki#g,uiZU?5Qw+jZO1=vr#|5+?RzI:M݌2|X>um| <7y%WB.-'Ŗ~0nfo$ͷo#A<1'D|UQyq_KKc9oG&r8>HI=>[3=ŬQ%桭XeIt? 7OZmm{ɾGOS ͪCmK}c^6\#IHSh|~Jߊ*tBXyMo\T xSz' +rT>f//0~? J;o45Vx祼pO+>)k=u~ W}h~.Hǯt_S5>'xRvWڶ=Ϫ[5a7${~ m[o{WoCqD}m{i{_`|@~'l5EliMwOnSoM^DK<*%C_ lOjŽ/$Z]S[}?sW>&ԼCxw:l $3cׅxO7=2Gi6{yq`~>%t7/]ntkὼ^]ƥ|W}cTO_>wS¾.&;."I-^}d]xikwؾL藯ȅ4{:-*uO=a_hci_ <* MKRtA܊7uUjRGzuv~FJz oz_a}g?|@xtwix/^ }J||o?ɾ>OZS8P 4=n5Ŝ}gMYvҭfI&Tm/+๾7kp뗞״x2>7Rk}QJcؐO}t*M O-cVFxT( tJԤ}%o:n"MoĻU9+YOgo7]=X^XY\wqw]7yy53xĖCio|]i^W3?x/]_R5K ~v-W_:Xw,WWr#<=nnPI]rNj<;!..XHkegCMӬM*k>w| MckֱyFj|C$/Wx/^}M'uڶi^k۝OY:ǧ?O6O*Q>T)|W]*;mJ{˭Zz?}}?ዯns<YoFO=SX~̚Ώkgڱƾ\Io箟O񇄬oCn~gl\5lGxw6R{/ hMZ|+8S}_ u٧(&\:=Ο.,"־*kznmglOT1JK]MEtS^3 wC*uRM4 )sټ?4=+Xtq%o ěP~{f<7COIfM>;[Wcfǭj{Zi&>*hw>$Ǔ%ӺoO'[lI🋼k&oH^8׼Mjkw~74@|=hol*m>tJ=J!'$xCKi6Jʼo~SOeIMKG?$>ċԡ>a4}^,/jŇ溗 o VF+r_#3L'OcFTMq{fˍ!䶖8mU&cK3}?}~~{*3>{k욱OiiGI$sf?#Wzů~iZ#x"Oݕ!U_T]y\&RTGy&l+Q5I-;o&ˍ߼W7"41g4ycoV[Ty&#'e}Ͽoޫv7,!Kɿi#VIOZGPxs;5S_}qlnI$L1HޟgC[4W.meǚ'3ٲymyngoiK竖I[M?ڊ}=FKkyM-4qyo7+d$M*WG ƷMOæ4/]DqlT_d6s\FTR'Coj[V9ϳV{o7iloJ?뼗k/ MKS3+.|ϱ hvGIy:t]WL i~͂ϹcWayå\\znKeP{KgbSϿYgοkouFKJR"HtfϒjCI+foSM o o s0n`d_X/3T l۲!&n(Eſ:nOmkI4/oGˍJDУhGM2KϝzU(|eSXM=R_6'_Xs*U|OY_ãn%i|PGZO4oQrLcבd+x|&=a>)lx XlnuYt7˺%lxcz'-u8~٬[>aά/x360.jVŻ&1x 4{-m6W9&7;4 k⯬=k} 6pK&?<;.n/a|[YiFf >M;{{Jt6ͨ9`X:нg5w/V.Xc&6!nM62TWOo|"&yo2_6Gk'r'H;=oh!ygmg5߬*Q}W ooIaglͬ=q:7Zƃ >KcWc+l>&j>WW5m'W7k^49I4nFk/7; ]\Cys4?B>x4Ԭ٬iZ=}V&jQ[:G ad,? mm|?$o?'V355tTj?4[|O冣 mwnI/|WYSMgK;H"*&iOvfOGf{,'T}Rn23xkK7TCl_"uݿl*i.!>fMω#ٴψeOmyǶLMu4q W0yAζ:֫y}l6st[/0~#>v}_z9E񇇮15mU<__=k mSh/y0jKiOIx*:W7"oyͳYc+uiX6~5Ԧ4u=I`wXǺ0.cz%UKdǰԾh._&w6>;hK6֭oait:k\&G㕁mK,qfyVHOEmC$ʼsCygHƟ9$6v_3eyX k"/$}m|tgM_ߒGv_oo4e;d+-?<ϴ}bG"Sej{+K#W渶0oYF4i]>JdwĚ7B<xCR,,xcoS06wGLD&{ZLwʽw ,M,įUN\H3o2?[_oҺO !o<[B)DL@<ϛM;q31_'ۨ@v)<>hExI3'F&Ւc*ɣ#Ṏer=*kS|Zt2䩾~h;WdR$0(+Flr7M?Dz%*)-]Ig?|kS<ECM%ßɳ T-﬒u AYao]>C="2oi*{ -xdR]Qw+[Rէ̚5>(K|3nY7t_2Z8?_Oۿ<Z0K|5O J' %G2>ngV~7+?ea+Zf~޾/70|5˳ D~X,_|>:d\o,<+YgdGD+D6gV,i_:2}mJbuuw_ȏS.>%xo4fT,' nX_W[Rfaz~;|K2C\mҲ#3!kOkmJ᷌h^Z ޱ5kj:=ok˄g+E/^o/XJW7&yFL˃џ=J|?ǏŚ>+v9u/\{R#o6> Ԯnf!5$vO].xJ¼6[%;^!sK~Uy֙w?wdwr_1!>zY/TJtmz~an&_Ҹgwdqr#Ͼ747U. &&M~(m6;]g<>K'hxW/xbk06okZsoo+uo"{L_*;m޹pP>/ߡ߃>y.<ճ|C<ٿ_]압K_M|2to^.s/s$o3C'ܛf4n>+z3|Kc^?; -pro^{4.o/qڡ$ Lm-]#<73yzHtGurᄍh؉%T^>m<73Xx8{#gMxUɣMW;dtjOq7W>'|kOmK}W>&KgXɱ~S _7o㼹YO|GQ+kKk=AvJivWso fbn~}$j^>o~Ěí.(+]:|NL('ufa?W:뤾Hw_(f7{7?VowS^Xj {qflN^=ӽ]t+[M4?wouJͿM|կ M{G%Zkc+m·Ͽŏ?.! zV햱CBIxl^'~ez_c *pxzanI2Wh>slI<ټ!ty+aȻ%vFq{#/xᦎ!6ܮ[uấƔ?cT͍$}of% gfw$u7ڄkH4ھ^6:(hmoܤ7ʵ$mImdZɳb-hwʟwI&tyKbCm Gg)m'L_ߗQc|U_YW6Bs+l^Ck/#ֿ lwO[X1 >y]IdG@&y/7dq$qɱٻD_|yo2>]?z>GZukafD]תxGm}KX߃۠i]Zk-7Jq/-viY}A4K#e}}zFIg[\kޭdK>t)b1>': iďzͺi+/zoꆛRAԯ5˝+X:iϭ%DnN>*mh ]@֟?{حJC7&^,btq!؉&떣=[XG 7~M&Ϯ'0}$q>Biy><ީ}ܼ_ߛg?دaԮf5M)F&㩼UxT&XljOlG{ʂF_#b+Oeէ🥚k|7CGkY%}t}=c_ !BG{znc~n/MJX_ ?M#R[/ 6=^{>m'g Pǃ4iiZT(S? S:V#Ϣ_uyx⇊1j3Y~d)"|Y{JI6w[|!}}Dog'|K7r+ҧK[oOW[kO|9#4/v[7o\Xk쎕 |y#㖽2x o_jԯ.u+Ouo_R+3㽯UWOtXt'~+iA} .aٳV'-/G7_xXߦktHvCM~x~Iʳ?؞97[K_%5בJl7{ԴVoK5ty\_&<ڻ^s? 4~$\}MSIDm}r^$Em*UwadOO+gj>J3Pm_^^kZ-Z},|\߅~`O[sK$I'K4KhʿawԠ؟r*~.oay yvyrJUopu9^>5`y_sO>m$n= Q.7:J?_nnxOxGl [-ODޟS=ל_z.?|OM-t_@ϽgG6o:i:׆>"M-|MOb Ӷoo'߳O 0TS?&|NxUҮ/}<:;?<sVw}6U%ߤ,sx7?fx?D~բꚥΥ~] Jc,e 23٥o?!O⽷?}}'K `&3m/3_?KZGk$x]<7CG>H&X]o !o}u_hX|:uhX_]=ڿ2+ "jn4d׼W  =?OZU(KgRYW~!I M5 K!ޓZW$?%zׇrIC^I}<5G]kW]i<gOU3?t/J}<:#^'}o5=W.<mpp^˞PXא~iW$Lj~Eo.}.hcױx%ÿ jD_xONa3#T6K2d?*wr_x7:I4&-ËmsB|W-:ݑ߳zG o_4a/}>Wxş[?b ',?kg=>)Ү~*?>(aVcl?W^߆<#Cnj}fڇymӠ.aB5+Soxƥj^'i?kw<:s6a Wj eG5=ߢo;O j_ uٮo hpDͿ)ypI>&um{~uoirx?W}Kw8mlvTԥN 37DŽEx3?$|b3^*Gtbym^]^Qu⯇<4Ƈ^ys.u6ol-7?k߉?&OM4:\hw+Oſ 7Co˥Ӯx=XL4^|?V^^nc+Ifn|O.t{Xn.?}Z""[ Gsߊ!Ku}gZS:|Co¿7㇌&"Yn!Qþ-G?]¿ٯUO~ok>p=-wIЩRO5 / h?C?M`xK;>s~Ͽ{ɼyx7K?iֲ-iv ?ož-мUϊ>bjZꗩ}x.ֲooi-_=JKmbnMOGGS<'b\FTpʟL3/ kڗxA../oɿ궡G|gԧn/y\}R2A#CGqפx?7X?4+DOzwc^km7<:En Kۿߓ얯|lE*āWEKď<~ƺmWZ}֏2xPԵ6/gU"SarJu׼7m-vRŶj6Iʷz0(TjO٢k7Ҽ[$\}eXb'#OW_ l[1C|Ik y(د0SKk]z顸bO߃ ϶ GIҼs"R}旧Y]}tw𮵤xo[gkϛ6"=O~owvGUxVK˭{&yy?Q>OG࿃چm:Guq6g`-=ׁ [^4NYxU唏~f|gXď36vhŷZIȭkX&cɛ,j=Uma] xq=.]弳:LQ|*^}O͊; }qål܇u_2ݼ1m%Ρ:O?|p5,DtK }~?Cşxnʝmeҥd_,|qJo:Ljt]ug&_yIb#9l$y?yS),^״ W~5=R%ݧ%D|(]Q޶T02W~3 |1iXT[YlX!? _)G!tOk-M ۣd/_{C|`-U_:Lz7lE|Wٴ ¾9Ҽ˶( DdI7ۮjlOzmV 6ߵwĽGO7`>z4Đ ^-)5{_1//ďxw4Ӥ,6鰴ɥ.A 3 '\ȕ-_X_z%?$U'tl/ Mr, |pQz|àb|lw{9.<&uH.aogx{AMt;.hwSg@X`PN(7ٵu'[>5Y^^s?xK@UO3>GخO<5']quQ_R4}:EƤ]5o6k+5/a?g H~A_7U?QM&k ?c }됛4(ܲr3$o p}O.,#z8~ =6/#?fq]|yz+EZڷv+o'[*kԮ[o`ON3J&/Yw^ggs:?`iɣ^fғ1כ&e:&Ļ#VX&{?j_sJDb?_<9}b'soM4kkoKKϺ~n>&]b֒vpMxWO"yǢiXޑϟK4.\"1יtٓG&?ZU϶%垠F?Ҷ?=.٤ǫnk BɟKawHJ}Y&}jG^YE_y cOBr=jy&켸^foTI\?7\NJݑ&I]:o>J߈|mڕ;rܮLUXa>iU`}\u$oneem e>$'ZFuڑ~*7ւ|JVJwGВsƻ=K𯎾W2GJjpJU>#&w+cē*{^|O/i>^ӣ?t-KX״_u(t %yG^Gǧ?ڷ*FդcOțbyͳ~wWKeIg+Ӽ7"VTү?zn~byg.[P})S\U1_xwS\C^\:Yط5t:E0 ŲI<J-/]g46^ymy+W?gwc-V6󡿹|kMv53UHw|GkoquΉg wօK)|ft~JӋ+$/6g2bٿ [&[;.OkkK?'[(}M}SТͥY$n٥͕ĉ!]oNkkk*7׈,~-ϻ}G/٣o7as<]_Go ?/*6UkIMmmWY.l2}rE%4'y#:[}֕&ݯ4|ǭl|d($g1; 5Htd?WK3$s\ȓ\|kri?g_ouK_;ח$}EFz. Pçs#UTo}mCyvq̐}T=y>)aGt9۹o1uDiL??˹ت;uk*Iv/:.)=\LtH|&XԡRKko[헑M}TAЭdݵ yV5^_-o5Wmbh^\GsVxomo41_+uG t:zl)s9FI/̟UmZ\SU{kiOX쬫{V΍,?4T8H#/.gyTޫtFeo,M?.5aՓf,Xdଝь\$:>2C^/յ;Gm6;I}\9{\Jq@bdo۟2?yuyhd<_27 CoymF_1}7h}j?9NI4[q-sCs50,%3 ?٧좌}nٳso?&;ˮj4-+Ogoh͡k䧝uwW;y6bGksf&!\Mk&8Yhν]=Lo^O7z|Mmq$'? uOajl$uS.Dћ=ȏn*㴑K=lmo6;Ō\5=;2kY7^t?DP{ȟKKPyyt|3S^>+]~5̒l}->De|;wm:e\&۫VWK5;_۶~HSm=lz^C"Iu69OG_{eǜݨ2:oYRUu j͓SEoGڡys 7}pxG V@nk=Jl͒i.A>ٗZz}zE"8UO|G4w3+o}[Xo쭤?Cx]Ηxaa|Io\y^Lv-{1tjC05g_㾯34^i5]K;x{~;aC iJGι[jZmTTJWɢxp/oV1lxSj_=>9EY/٬㶋a]y٢K~Zwu ƣty}pzԖq=Rlhgtp^ͬjV&{2O[+mƫ5oy.S'#CZٴOoqK-o}{5 :ڄoJk4UxojzjI-&QDžmZޟy$7Y|Vj_|n>c|代׉At}CU9ĞuJO7~xiyokW}PK ͒y77Cmg M$?62I v7czX{9 9&Bm }z0 XVo5-`7m{?MVyglxvLcwO"$?Ȓ>UG|WI| ښD曥GKo*Gğ־͠jW5 *V.m/cn)/MT?蚄 niZf6Vis:C~"Fg~x^KOY/GH_v{ZҷKk;Ut>'< G'mi;[Sjz?X6skzlwO_zc7~-G`?wHo CԓNv&;. ﯦ|}n/+J2Tn..'Da!Gt+CsxJ%9T8{ŏ>g{ECjxzmEJsş /1o.5l/lmt60~#U> XjWoas_RlD\ƋmYͨIy/qo zόZzmyt֩Z'W:ν6y%$uJ_fwSmZaXZ많-TtuzZA+c[~I?y+au n5w{%dMb/[Pznuݷ/?Z<|;-|QGl&m·s}y>=ƓgIb^,S_?9YGIg.cHuΩ0q=jƾXE|.TtW}g?\ƥ4\̖pv5IM__͔_^oڿi/a.ƔXZVs[Dl+< rGm'v*t_ ܉v}߼+c{K}l״jPaoĹn%}lG>Y.~k7^ʙI-}lFkxv=08wPϮ\Aimy4[i%_'7ݝ:ޫy gOc4WN?4^C+_ԏ>tw[ɷ6v|oa:UMev:O9OV$wzy)A#¡liO|ssY}-$E6lzlzIhnS2Wg|5{{kmg5A<@'\_\|#_6zDŽ8|װAޛq%&m/>7O}/=zGeSOMgm|6d 3u_ xOrmo -JMG%Hkj}"?UֵKyhcc:"߉W^<7mOh6wl죖ΐ_%xo._O)-x6-ۃgaLk Y^\VfxVUψ*KN{E.<ۋ?zaAk;+c:=ȍ/8zs]>z{I%$+=i&5 oveU$c|jY2oG(R?y|00%ecq/>~jG":0{{6mw>d${:O%jĎO-䶛s[\6ő_"iYb)O]QGo >oCop -#oH휟$?oFŮ_laA7W4]zE{y4[ž*[|2y7)qa7net:&ڗS{ˈz=r#|a2^[]o/%gcGt{6UԼaoaq-sgɲ={R]6M}Vm2/77MKԝ{;t޻eV\=:/M5Kt?4)Z͍彵>Ͽ+G "ocOW42s}}vzޥ|Z-[~^/XX9N*o?,I䱕oi:'|UlPMB>%{Dx?[xoJϑ{]Z;het. :,7/7<}J˂&Z&=/#>|o|T|=p.5m-|o+_mΙ x/E?fCo<}N|WνkX,O[eFnO7TOºLw?{˻-on}*/x>wGNݟ[d:>y|KkdBIL"c}q~eė>kdԵs# ;kmBm?jx>/ԟRhڍ3?]?}+eNOG?ϴ=Mt yWzs:lws-FmhټG.cԯR)=q%Y6/4{9~:ص0M?gu mn5Q?l+oi!rD5u_B߃5oXk/%^u}o~M?_>pT=߄scɬ3{yO, {/~6u&s}>O_XX>(H xl Kuc?wW㞔va&O_ _xX&7ÿkwO>맴%] <'~̾>K\?,1ϯ}+[ZhWz'O_ y5K;7M^ķ=YslI뎝 L5#jOP?D~.~u[|"_lo 5K)]׆?۝c[?MgKYq+RЧ %47|x4|yl{-~<1}_JiSF_Yf%/."nMWdO,6;:x1^\7xD=1yo7见do٦|Iy8~2k~3_mf5}.H~M16;߈_f_'~?]Yw3yh\=sς|1=5埈Idɮb|MiKG𕝛r_sz_=ý|5zw [ О|ck+C%.}쯳>EΧ3\=>ϺDz$>=/OY߃-ВmoGMK-ֹsd}>M_Kh>|5?#Ѻ>@HR7ךj5Z<%q kYkX؉>\KxFG`6%o vho5؊߰b|viJ]sz>#u|FE-AhufM#~˹'_+g M|WZg^\jO BodH-铣u e_5>ǚĿhkSKD}+iw'jXl7%{c'i?7V7½>[OK]7T/,HQ_H4}rD0i} v:=ƹe:'{o'/,>|l' ^͕GJz&imgVĚ'Ǎ{ŞXWuWCǽr$U=ى5i 5+;O؍74O#g^'⯋<,xĚ  omIY&["$|ܯ-¿ +nz7yz<5WDߴ3Gf2x{w<G-]Soxfb?-^OC !K+-o~ܷ?]CcIt_LT׃~V߃)psXx]ΩU {i_Zů/¿=_o,K\]xYGM"%%~i]kVO&jx~SJ$e?~9ݼ 5+( { Zq+xOjӑK _ |HDhu-c?aeŝgxw1vU&K|4WgyI?}ϟ??Jw|7|B4> ]u{}7Dtz|?Wko_o<|'׳^H~yPYG~3[/H\͆]hf{>^!g+◊< ?lj-a#.>'ߒ+x]WmKy</x2g u"m[H }\XrOq^#J;7Mi.R/Ixu~|<[KW|gRR4 ghx Mr?"߯߈o~E$ -wڢ^Dmfu/y]K2)XLJ~~_X'ğƕ64-D߾O|?ߛ?k?«^*>Gkj}~ıl\ɥIKU/?,/Gw\^Q*0e*QɩR\?K gu~/%+i:nY?ܝOꎉytCU𭞏koɥ<>*©/,?VK;{Wk5#}YoǍsU<% V~o/>Ha}z،6.hncK*4xū=[kg{cAmw~ֽr5W'Ě=WGҧ=ó?k6[XrK[$o?""l=+>~ÿ>隗Kƶ36]k:LZus?oOǯ[BS=xlez?䚯4Cy\K=׆mUhޓ^}?n߷į_?|%yjPt>+]:y%OrO'6|[|1t7o5_XIewlޟ eWW'/Tk5#S69}ז\dyy:gܟ~,4YozY츳5=O}>~o\j^ >Ծ:˫ུGyZNt'ϳ͏>!x^*Ӿ6|| ƮW柱?鍭!w'tXqVյ/lؖ6WN=SU_Ñ_(gǏ)G xn3?UDotG|CˏSY+;<_F#rU-B&K_7IJZp2(/gq վ}MNgS{rj ;ϝ<다j޷-H^OțgVw}tB<>~cg䳶|+⿉b+[]~Ζ^I~c_oiSm?Zꎫ [}Nb} _x^-3_칹+ŋ4Sx wQK, ʛ6fW³IW[.87]7no2]5:#(Ÿ3?ռ'x{DKY}H&ѯoR qs}ב\|%=jbw)_x{}kRfpeZl/v\&ʭqjKc%f#}ly_lO~y}zhu}ݪ|tR!Tv??Q'_::Zy?snxռy RΰmǓu{ö>$U嵇}SXyV+{4%S6i$ofu DMouk=+ӥBoXrEnzWnt,I[_ݚEŵ|I~ȵM"Bg?f=OvɳM;ݯ_.Z/icYr\Y>H-hY;8dI/릷_*Y,W_$^,{G&ʚPMm^\Ok֡I2<|͞ m"|?lO0C'|l%ޑ>VaS ={:7Me=WShxG\-0-e}x z,n^"[%Zt^ëivig$s]Abs|<=Kr{ǧ7t{7}x'Z4\shvkxY b/>xS/ͨxKUEO%;{_Wj_ivu$Wu[^z8w,x|<[ƍO흷,7yuu^8>7=<>l>uw9?XsI|7'{_eմ"O'RAɓƟ Żv1Z.$?z|>g_ݗzVCQZ+X~ o[먶,?y5ͣul^*5֝k7}:$ oz?u{mxnM<gykVkt?{ zƋP |ayYkҾZlW[՞KKhXIkgfWٯ7|KM?تPyz]׼\+SSjOT6'?T/nt6sgyk}7l߯3~ڥH" Xx[ KMԡ]2o-V(_g_:y{9{H^K]R;D* u&nJ<^'U6}:Ruڻ= CծL$\</7&ʹ,6$VrPFljVr_fvQM_eᄅfѾλ?y'J>GYڔ;/Ἰuy|^*UʺVۯԒO=?}+Khyc.OuOT]njᙯ[m'OkY5QQ3Dh)gn%}-{KKF_{@Pgd5<>jKO6Wz쯯-מM7|lsקCG|ammgX o=#TSA꺒5$Ov)nvioꖻ%O`k?}g@W2R,k3%f+X.?zڛ/ë{u]&<nos^f" S?>$5yJ察Ŀ~k|]ŝOTZ }V@½N>cOOr^G |=.xUң?\G7)t߳KZqiͲ?{낿&sXx7Cmt˨;M6#ח:=6>x[=:>wKڥ̗UI%^<*t7T;m&7_ ot_jd] MZzgI䶳oOqB'KTiDj lBM*8*Zy8VIC \]MX]YM{ҹQMkqKI$?k7d{{Hϳg~ &J׭>pVW-;Ҟ4?kkFh6zg,_Į㥶-;3InIoG RU|AjVrumW kWش:[Y~l|;(̧gO*>|IX^zFu|C]DڗJ?XҮGcuO}~}j_n4].vڇ^9(4xN y%+n+i-{oJhٖfRf_u)@ŷ2H^/͆Ome{Y _:{.\rugK~Ilg 7}j0ߴ_GOu?wʪ7Po?j>Iv[OFf?-m.4Z7Em^ \{lW뚦2Nq 6(l;CKY<s^jom ?u&{rSKygj2m?:&1Yӫ@' }Z UbS<ķ74{?lN[{=7Jź; qy{랏i&fVT?X#ݶ|HG/_d?okmt}26vW {oiɛnƮVFFy9jv?¶6o|Ͻs#]GW.m?"_/iӡo}yC6ZoMs}Vmֱs_}ioj/G=?Z~'C{|i,hMop*ﭚMT3j~Ozsyw=^ZƤ“Gmm'O4.[̑˿}qz~ BLa[mkG'ﵻtuPƱk?,+ɭ:h٨$}?J:+6m׎z6[oicVx{ Wl֥7{ɓZ_2Whfm,5ٶ9|z?$:7:wٮebi1ϭpjں5x VlIuMyi-IC}{g4 x漅􋲽F%c5Nmu4d/p8k}rh~Gx"Hg {[sk=]͵v*zã꿐Ƣ&I,.Wchc-jx7Mo:Yc}Fn>p~MM] #-gc~{KU 3{x5G40ŲT1q$.=-WM7kH[o\) EEKjx^e!DH$PȻЫlޱ|D 2o#=΂QIU&߽b-)h~fO5rr}CM[H.GvLm伇sV:eŴ롸jۥ{Moj#{&_D=:}n:&SHV\wLz}cC\\ԼMu&]ϽeC֕c,<԰ɟݣbi6l3L:l|/!h@ 1xcO?u[\Su4گ?Iex'?i k0<'^cYͳcW< s?O}fVąf޻}S'i> ogKkz]M? ּ3?Exl!!bK}Q?53ʖ?"GWHf4Yᄏo ?g {G<,O T}G{HcMßih>z'mxgƉjѽ. ?xa6ŏrj楪_iXmmmyH^I}[5KBv^¾+A-uf_X~j-}xUD:7W7چy?D.6Z֩6YL?u~Ӟ!]M~ok=o)|g+'-tWXw=tۮu)q%m3/=w'{4?W˧ygoG#W+4tmdnu^-֩eK;g~M|ڃǞ 6~oi5 sVl9YêEyal,ޟFt{R?$saC^OH;Q|uKy\4u?iW[V, V}&qYq{?}i5-k+?kNI%čbb'/slH_%<%p7ScMm_G(W i]CP6 ~ iO^[_U.fo3>=}ox'ĞV <$/WXu i?j5-nM{c]a|9{w\α '\^IgMdDhrBǝ={\145xbJI.-Gj_o?M4ꖺT6t}[[CW\RO:|:|:ՆO|IxXNWJzkkZ- j+4z-|Ayˮ}+?kb|4{ =IeUg㻺l7Ծֿfo~smi$DWHlXx~$?_ q౅?&{8wW}VU[ 'JmmsR{5X!>$P<Jw}^'֖¿x | OVtxn>.UK-YD6[x_/|=c^&[}P=(mޟ mRoC}>$.$./>돐_luɴ/x>ixll{I޼_P*o i^ |?^J'?_(^-"xKďpϪY}M'د|qxMF[KzjZKuS{}deS>cI<~*in-y%}?~_?$H- fM/w~NO6WE񆆿Vj]Xg뼵O/Ǫy+y|gw=#~*h,uzƞlpt3Xh#5ٷK$`{(z<[giy6Yko>ܾW??^K}aa$i|'}ׯr~= gh>O6[ŷGS#:]φL|y?[r_  MVM_ '}t>:a46UҠ_)~zʲ*SSͯZ9O{l3n齙|ͯ|'TJTڍ4f~t]cX׵*XƉo"^H<~Mʿڟo=fݻv!mh}='I.ƨf-dM4oتjNV;]C܇^O^5"ڐRңW(HFt~ ek>Ȇ5}KĚ;k¿$;|U9Ե{bS{dFJx2%t"~:"UtK5s#O zgo7/YTB<_+} q|V5sy4%";׎Yx7q7bkK__!IccuF MOg\MSB~Ϟ6׼%xŶys_E:}? SM Ÿ;تڗ5> ]jZۑɳί4_ I |ۨڭ}#q?اxM$?~7|M?kٜ7_hŞq)&}/?*x[=/u_[ xSGgx3~?񇊾 ZxT׮ä$uCjn:;̉Sc|>9~$x?ZmKiVV ˫;nGS wE뗞'K߲g7&κO?دZឃcC}6cD+&4}{C\o^{޷Jכ7 \׾kdOΈدԌ#4Xx~? x{ڇټIk-Ikfgz|;i|Vā{ȟ']vy=C^vz{|煺:o=,~3xsxXҾ2xǗdj/Q6:$< %Nx M/x3AxNg _ TnDmOWo',5z izVvz|wMb${<ӺM?O۫Fu_~"|45GGKT[ϒ)!~y~lǏEy5xLWږ\eI秜W?c?u >0-W[Xo祿nonS=JӡF6xp?h=B I ;yw׏{stb7ƏjV|HIo#F}Z|%~L؇nx6w:.Ym|[K/-DdI>tG~ÿ" z;jjO-{3ss[^-F.xoqc֚mΟ/3޿*|OU|BЯ5-> |1Qx`m|U{a"|>͕OTe^}3mo կ4o_4WEl5r/+#ˆ5|Tк=狡D[[{M-9x-4MzŞ;k^xĞ?hnt7J)~<^{zK{XgIkGuy?DO(aM4[Zew_ditevzÿ٪~"׼gRst}Ԥ;}'_vz拠_?qä^kx.G;c$MLϟ/&GK.?oJMkn?gɭ/ž<}mKO?gi%o~<CGJEq8%IL*}w ]=~'[oxO -R]ú<$7?+x ^fuͯxz}\\jOI&wayP׶x' .ǿ [÷xK9\ };+8?y+b C{Iz?l/<9o:/-ږlR?oO+#,aC >e9xI~C}MZM7K&z5|x5o x7`|=/CÖ:?xLsg× éxZ}K8tF+|_3=|*oQOxKZOit'u?d;g]ZxMVkiG⾭$|Լ`:+{ᵂ kDDw]"j>׾h"lʂ 4+:G# R?>~!YƩkwct~{m>J~o?q..SQ=?My<}31%'5_E5OoC>h?2$wC^| y Ryu $MW~7~6kۧy y|$>wz//s( p}K\W- ?]2֟eω<=M GuH"Ǹf c>3S.sqspj|9y󻻿JWl&ewn/tWP_OxkaGKw_zoKPoH6p^ݭͿg<;d|iqY1=%Dzwz"/~ N|S :^4Eφ'x·|ugm/6Y;dWQK^;y/?ZgĿ > mm}[?<G>7o?767{pyV<fxy|$ܙ~nm?Udz>z|9~"1s_}ŭƽ'OCw~AwQZh_ |+otwH/^g_<ȷ䧒wtG\'?Jɥ՝&>MocܧǨ$vnc}A>0{#Gx> 7jZ^{O$ WW5s ׬OzW(/(]-r)||4y9躭o%򠑯`{ه;mKk <~ѥ|}6͕'1?MS_5''K]sWJ;?'&~;x{G< .-Ɵoa߿d6M~>/3O?uNokwZBƺ\E^hzus_?d:u!O~JڍyVx7J?ou2'"&IngCǍKϱ٬qi_ &Jc|>ʶ|a>As_rjw4TOCZX?>GWO׵i_o).ls7^cA{;D4{ͦo"~WtsZOSxya#WG_IgR;XT }fMKƨ|Aohp]GgfF>ac_/u}} hO \n°kO96o{?|rt_|~xMn%_"={[~&;cx0?hy?^!Ҭ[˭c[g|_._ -f +dw?מ r4>s+:(c~<3 wZ~իğg'rblީUS/|=u]SAvDdl6w_|N՟Xyek;[Ftm\6 Q=5,>鯣,-mR5;d|bm&o ljVvϚir I[9<ר&pS8iulOZWMivKfcҼ*z$n.]"}cKϼI[ڗ܉/.W >sV_\vX~E*h!zO։߳}prj,05pʈ^ۮ|΃r-~Ԑ:&Mx>)SO,G?;[M3ok \M%ۿuʏWn^?-*#uJ'iҫC-~\/"J۳{˫k7լ.n>\|uV17Z&g3jzmsfYs}#SEaV[5,? Kc6:]D[o&`3&Dtzs_r^MȗoW~>~ I:?^nW=džF'K`Ş*|׍lז{E}ן]o5-J6I7o}$}ExakOTV}(%^>(\KE߿'ܯua/|C%ۏ @tJlDޟ#^'8B')`ϛ~m_gnRu>;>RywKළCS ;Sw%{柣UWROsj/_ՙ<;OﭭCÿ eqt jnͬ}?\L3ZDjK02~͚]?|.5[=~u^X$vq?IñJ+ZLzdž?&?jaKOu>kĞҮnQLw]ρl5TTMM }sWoBz>"_x^,5+ h>(-oMiԤd캚$?دK]3}X&qn$/t44>II]|خcP9~:_7՛;%GG|=_KOf߫0_hmI+>6as']}ǿdZ\\9z }C-8}]cOmKH6'6>zMk=KM4=/7=?|T<ԪI&$b\m $7xēXɮkr_I//zt; ]OĚƩ iTϒƯ&; q,,%|?Lsb_`3oKUl_y*bW3Ih<XZ)ђ_GH^o7߉5 F }}ȟ؎V?Oiƃ5mu ;ܒ+^N>LFz 햿7tM7A7^mĞ(m`tG/|^[k𝶫,}뽲篅|AMcMėy?um:s_²FW?3j^$/-'M+T}cdFMRJ=li޾o^4л?g+y<7$3kzlz>|Se΁K~LZe|G4Q_h _zm _ZDIOckGzR[iןuJ6ճz¿^;|g痈5 M6Y[]-wuq6MG,>o~^:߆RVnmՋJ>^O\Voޖ6{ڟTy?vgͷN}:4HYw\BTo,5>pʟ 9)#i+Ξov+ihcq?Ie(Zyoدu]sڗ^6[xz{&d{9 ۯ Nyٞb*y0vSMlryo ޸m&P_]'uj6$Em*E͕6],_M2]KA65ZW[|F4džMU]/;W [ Ai7} ƥO`[y#<^o%7V]Oy̗ `Ǭ"jZ\}|-ȓXj^Z|F2o~ c+кG%gPD&rdޙrygKalli#zw|ro֕SyG;/bo綩缎hadX6%גy0׮Im9xd떽g?5.hp\bPWYCkTycw?yY~UYᵚdC*ׅU{mIV 4?>tWx׈.u 74Su7oOf 6ik/{osyc{?¿JTM"͞5M$3V'dz,t3=BymU7R]-x1ʿq? FeԵ[iz=Q$Mɩy+5._s,|U0CkVy' fSi-J oq,nߺg%:={X}2C}_[|5|ߦNay(aNo^Yl.U+=XΒDOW}N$Si֛}k;-??ΕBoh}ٯ#U}{9X̟gR~}?9luc 7kymV O=ja<ޫH+L fiR*w6' ^nd&o7LoM}C$9ҤO_2YLy"8ivn|wOM|uSi{G*z:BJ\j^%6w3G:Ukdkyb)Gt$*!hBqi7g,/[r#46|^*xO;kρzO!o ~$4{:M4t:WCOcNg|:iGߨ:4sR;?دl>M}=-Z:?Kz=#'p>sHK_[ĶU7uWdO9\N>$|a⼼E7 \-7_/ޟ :o[~#=Z-O >~8!171ۿoqf@ϒ-I~*;c#geS?[vwHiwiqUY]_#=ohuf4 CUO˳{'Y^壚i%?ݧy. s?k}j6ȷg̓rg(߈f{[0RGtMo 7١AKݫ7çiZd%mvSX,K {}̶S #u<=L}c?_ctU} E忓l$7bl<7KP?m$^Em C43_ 2}gys14 Ʒ7oAma%\zgU6PKJU}-wK 1l^WGuKrDE!cf6fkW~ wo_E=NI-KAKD?+;vړȖsO)?{Ed5o?cT"q 2.v4Օ%Ŝ3M {6N&6mƛV6o_:Ɩ<)3[M-m3מvcmx[UnySɼLt}ᦛGM'f7Q$]'f$i'gTjI.SJ~҉q"KY|vmG7G]>xOXU揦h$7I汦X̯Ksy_jd7d]EZͪl>?ES3-CEx.[ƞMZǤWcgey/_ev(H5+3|ߋD헰f۷<=\yB[K1_,=8LH~ [uk? صM{Q{kdg i+V4toytl%u6^C 彚Gm 4+WG2]~6n.m"MPKO'ou#Wm:mΫj^lknUn+/? ?g#χ^2W`K]noxTҼ/skgU/uY:?o?J|m \kZ_[4׺f(t6DtK?{wtۤ,%x?Rϴq6W7ܿi#5/[ĞԣͲ=Eyq?I+|}#\8d> gO%ϟ'IkxX? N?lΗu3ܭ?jovOƏ8-tm6{$;6* >hog¿W ,z}g/%K[M'L=sᏅ m6Zl=~o^-[Z6ɤ<矬j?^DItMíq ysyL<]u,%}hCk)Woii_Z/`Eei>&Up7pl{Ӗ9jTB4 W[^Gڿ'yNS}O}n)\gTeg.?YRkڮ}6s'duEuO NԵt\Ɠj +Mt@YS5ͫJJnf-ﺚԗ/xqcTsbVR I{fm4([+'b?ZI7L?ؓg_kəY6[~ܪ̒g{Bɱzjs$W4ϼ~UhYMyt3|zl߹D{_O3S[Cq7JqNMMy?޾yQL$?XiJI<6oښ"6֭O 76pe`" Α2Ϲ[6WfO칬?>O(ȍGw}=5XnʟhVf]%ǀ;w4=*6%g2.5y7{PFG&]".kkBwNfoHM?ݤZ1kzƫ6gkU'+?(ogx~9?fW$`f=O+?t}R(峕O>J_{4}uO'Qy_ u]?gkzאַ_$O^%Wŝd|_%}OuNe\H͂k]?c>OL־ש^xKWP^DXq|a$wMCyaiP007O^ow?xW~丛UVJmKP! vٳ[hc~lX}Oxov[_Z>~V.cxx͟e^jmD7WP]u}$]?qyo}+{/oL7OĨٟoXoʖ7_~0%my zYvkRiwZq}/?ײBgWN=*> Wx-yossEkHmuh7E}Mx!TwatGjc]?-%&M7GԴۈo=wOt׎`ԧ>J]SRuY>^O6#b/*Xg.=O2M|oOum{ᾟK\_5_O>!P~?/xtsunֺF?|'&GwaҤu6MK/iu#j(ۯtqlG[9#WW;]ƩKЏ~cs_>.}boRշyC/Sd>w{K}럋 , ?3|rWC^J}ߞoi6y,WWK}=|̎&͉T 9?Q-ׅEg{%ϝ O|OZۏGںϼ3M:ۯ_^ Ŀf῍Snu$=ɫ1'Rǥzn>*tIʼ싗OOttr.5x<0TѴ_[dz|?.3/ڧ-RɯWfɗ1C'O^>׵_x-_qtt}M|:=r^0kI[S*ԵaX%_IϞtD}R6sO'k||%=ZoGO&tO ¿~_'lM4d6F>h_#ྃ/ ï|N˭r'/k4<UxwViW ͖P^j1Y3;io7e 7 a{Zhohw?5a֑CqC6K $;zl8h4}+M{]V^ui,?m?q7uO;;*[Դ]I}$C84;?ů_G$? ,;j fkڠ^)7ga~i;MIt_k,|7ໟ<.q`SKtyYW#-s?[KO"(KTi7qtaU49?xG %ǃt}Sfn[LJ:}.nW3J+ WX~$iZ-|/C^~͒ս>}JW6w׌4xO(t)nv}'D}B~ 3ú/#xc.x&^G`Ԯu3̟?ןKpt3xzy-KU$vo ksl6#"3FХ%r}m 'K&ܯm߉,]WD͢'NI7  i_>-h{q=gm\;ÿ(u{o \~!мy6%Sn+O[_z\:Eqqa5>I #"%|i.4_ibt[ }<ȟW O[kc|t?y}?r-NgxG^'XKV;?-t47sۮC'c65{]C#br=&W3cxXpoOAlsIo_.6΃f,m^\d3xRox:R8C/|NᏂ&˫M Z~ʛoATkl>4^x?R6PxsW?ۆ/9&~ ^~_oMg xC[{\&V؛&g+|MuF$>!|H|ºOk]Mkij!9{,rԟy8K0O$~⹯x?ឃGCR4yW<ܙ*<o|JմHi xc[UK]7Gӯd$&}?7=1ռ=7t%tZWҥϽI~mjqMW+|rWkǞ*5_Gz]G]ImsA} tI|:qK83~@\a'>íW=K7ZQ>l|g+*hׂ~,i^!?[E:>η(fM|Et 'M/U~-?JDI?Wŏx.}b9;c/~xRwt}LSb|>O?aQ=wOIG|~YtN_JToDID "|O^vgs9v[lD%HMD}+K:-?"'M&Dw?X[Ώ /"y^ <ŎUg?hM¾ cW]T6,<˻k75ޟWSJ_~ckɖo艱{mI~šWk>?DM'xW?uRoKXu)?pGjQcfJ0,~#Z}iG |!kk_j:6Ǝ}?3o\ҭt{KϊZkwJֲ^Y9.vgf}ϒf_6ğ߆ɝHG>}_`|z~0|H[|S Q[Oy,lDo;;bD&?WRWp ԧ|7f}<,ޛ~js6Ntw)_u~>6jw|3L."-g/>ױ{}ϒ7EK⏅zl1?&S>S7W2?>Gb|Wx?ƟP_:z?\K-?jD|1 /g7ROGNxb|v5_g#GXizlZ6Y#6}:'_7C+Vl4.Ě}4t: }a!O}OoMog>-eӵYg{+#RJ'/>e˨G/ڭAޕdTG?9G_|~tx?8tI-m (fIz_Yuxn~ D\uc?LRo:{+_1{s|#Լ[? ={j?cM5 ii[e7{o |Kg>|E%gOWOJx3-zVOxg.T6ú}:E)>s>٬x ;nԗG-_ߕ~iƲ^iVQ s{XuM`s{cH>z yx=Z}*?N_|Aa_?o};춛6?}C6ɭUմ)mlbyrotMvOxOg{?km֫ ~#1u$^|iCR>0C_Mx5"VMKe?ܛۯEuϏ>jEo%y5?rz?ɿ?>2t$ԼgxMNY /kZkaq;)'|3SfxP*oށoُºM?}zƑY_+O+G=i̗m4nϰxlISW_I5m n3YݿEy?D߲ o|{_^ҟ$o<]bWOBcS|5OS _`w |TdKXjZ^M\ɮ>~9ҼO㗅}Lz嬍4__4?_?&=ڡ[m-7+d}Vq}X7wDOWF _*cWKyN\Ɠź^Maw:UKhK>}>5/Gx]l6<;?O7||}X|'\?? <5?Dۯ[Sy="t.; JOt~?7zrƽ$mqo>}+!x^$ Iuu-R\~w|/ 7Þn nz__x^ Կ؉%ͣ>7"7U|B~Oo^y?>!M:omgɾ:'ztOiwmq>? 8[خ.5ey+&(~޹_~^3+|=M_6 ,59SycY}N:~Ͽ5O^g¾>qJ~*uaJGlDTD au;3x>c}aWofmZlso߁hv.0dXP?a?hQ5YHw߯c/c5ؑg A(Əf\xU,?{f|o/&a/՟a"h^Gce|7#s<…82Z_&8&"Drh>AdDCoO/<\bG]RXlTc71R%{?l5a} zOޓWO],> Rѽ̖ctt%pw^gqfQ_+ !R7Լ5esfǯrlُ^D7*yQ gM]<K _*4?k&zyVsZ׉4i5[o-ngI?_C(7u-K?>MQ-/?+_>XJ៰x?7kϥ6o<.ӣ&io'|CXm?5Fċ-:[[{M#/;gu.K{k~%. -}Cmih:O7=lZm ?hTן<<|F; nM%' CP7\Ymmo+/'{fEd FOuQ[ 6׺Y|zk4/i泚#7lE%GU^`-fY?o[9#d;kSE>f$7lxOMJz]^wossu$vq%[|~uO룵u+$<ϕ#T~ih \}]Iφ7o+a^hkJ=JHl;i2gWaP|'up~k> ]Ia[1^ a}^6}4H%O_%?ڶzI5Hbg7gOuqkwK?|o ‡DDëņđ? 5[y7"4.oI->T؟x{^|Z]5n mer|G+>w:=&d̸?wB/J@Y*[~۾1_]W xuX49?lW}rr#SIny>c^gr|Mܙܿ?mn-줙>f?{HwSEm5quU{3P磂bd7."uS#={T˳smn̓?'۫Od7H]gw$/g-^vֹ}Եìg=[g%.y#'aҥ~8n<UmJDd/pnY~p>݈!?x\[tW?!omm2Ԥko,+Zn!VoyV<@ &G~cZ1?M3x~IKeOжI̖sl?X֛f_'gCyn~-{*NV>0t/ky%=7pR֞%U..Xm|ne}֔:Toqyk_:eiC&mg?-x>O63*zOVż+uy %'Si>uCo Y$P{"w6[CmsMxng^{F0X5+Ėo{w_&@/?\Dwqp';+,M&6yCgߺsyyy헓OH|yw;ZG8ׯ5kct)ckӚ@E75KU}bhS[Τ|@ȖvYG7\7NmT>zvkxe7h:KϻĿ+<_KotH?:i/PϥXxSM7lR5,?xOGMozٿ "ҳG5mKO^@fiISW>/xx__GM.{Xx&WYדyjݸj y,m咧zBT Cf{/;kZ[k)YeQRElI&i{mq-!qHfKk~OH_ +ړKx`2H[T2G42y/m'-nY+H_$<ݱ M{U(d|V&2yiJWGR{;{Gobi"{;dO-?9TXKG|{xƗ>!&|7gs-彾_R广}<ߴ_X$_4J?Gmkr5 Iߓ$e͕By#y+ڝl}ɯ/~hS'eMkg4&ԞF*ͼvz嶛zl常7mO_lX=O?ݒY׈[A4KmȊi/xOĻ6⼵WMD !G#I6S|e6VOX_TY, !<ͽh>?4[[=쵆k{>t׺v |Ix>!BڬfK履yWh曾Mϋ5[ >mmuX7)Q^5%3 ߹bE[k~-UV+xt= g+wEl;ix~.^>J5XM$`ӐXuz~g]~О,/,I7"%v~9|m}3O,?i$ϾIIIG2:m>[%hj%z__ۥ}?;j;WMu|5fO+Ӭ? [6^׎O5O"̓sb4﷾ Cү-iO7&SV ׇaKKsVy^D Ϟuo58+wEnɩMymm#vc?t{BG'4%,mT9;4_^V -퉾CFAk4G[y|W? >I2[I$/ʳ I?/^9O^tW/vׂm)MKwsPm){}M36g ni 0yo={ENJ< :|:?..hZwJˋZmWP=q9']ϑ+6\÷v-?T=:~q/WQo?;[]}Rm[| ٓwY?')}b!Ȍ5k}ͼvbȲ ||i5/skc/?DI?U^%ɾX՞V׌!xn%3'Sȏu|6xGuu'9_R/^;47j#dz]wMWԦĚ|oݼ"t쩵Sjsl)k!p; ^_@2YvA׆߂maOI_ im#M5mk2ҮDAwFydR1{Ex㕝–گ&J1kKM2MoW-3[Fre߷A߈tHגA D͟خOƏZUflbެ~.?k)ʸ>%xg񾹏5?MoDKS[iౕ6o?ĽSoxvon(rӠ{qxxCNutb=.J A>yfʡxwAux^mQ6,6Oymܨ+Z|ms7J 7m׈5-_9m93GVDOGou&^(~*oEL3M|I;7|Yj^3exO+|HlmEΏ$yo6}'7}P&jW]7|%-_][ZmcS񅝇-՚_5}v3gx (t_y$/ǮI~P|Jfƚ7ş XXwO}lwf+?|aC[&F-Fd}* 7S=L/|Hw,<7$ugٺ}g}U|aWĞGmQ_g&g\'{OW&,~xWR.fz}X!~~־W~a(xA i+~֖?o{hİOkwY!,n-64%Wٿ/ ~߈4OW<,~1돷M$;J-?~$|KoEZcq_&ϒky8l_Z潣xċ9!uˋOT*[G?<Mz_u}-/?k+fS*O뚞g់l5FqAoq棧};T5CM+D_ɮ? [='wGOr6m'#U[y_eYjW}/|cW؉G+[_lZgZլmCؿ򮙬duķHv'~*sk7~=~JWWiYv'X}x<=kTk=sGgɽ>]7/Bď áı_/'\/4CO|E $%OTkla;/>-r}i?;Ws Z_Rڐ:T4Y.MQgp|aƧ/?c7]{c_eI?t *(>%UO xoT4J\ZLMM~Ϟ_3|=^$_>mKӛDxE5&mҲӧô?7? qY`x?_?O;;|e\xU"hŗV<>vW"tQH|7oWoy?bGv:l|]#[Mm/RuMSQ瓽b%c]E_SxX~!MB؊}?ȟ|a]x;o𭿇\vvx:M鼏_{6;a&vvgy+믅:OoxO»"ٺt3}`eߜc6^6?x/nkS ݮϿ͕=:DXɦW{~ɽꞛټ1;.eVoOi+ӡ[g/e7~=g߲`ҥ?i񟊿gG5? o6K$oBkHȟW~+^xC-IuK)3Xx~G{:g'(Xt |"+7 1%A63k>׼I~-IW4/Aǿ|ţtO#Z_í{KLO}u)/7rxwJ߂kºp_gI'z_(R ?Ļ? T}骚s^~~ˈgmόg[QUH"%k5I.tM{Б&rCtO =W㯄UWOa/T]_#D<=aDw+|m'ï@cUVkzlhyw <>} εu< }.oYM^)vSig4_+kx}7Zķp]j:mAZ#nrR;?j-5ڇ4CD %:;u9m+A=->ɼ$O0«?\Gmֱuo m/=3;o|V;K^mص%"OWwGO{t WXψPXF욥׌~*AQ=Z"Z&߯us'dԼU>*-oO‰|'>w&n{u'15 T'ď=C\kZCXR&w6lο~IMs wϽ+>m'|O?kᤒ-+dOo40̗;>^KG2 O>(Ox{O;~ҼY{]cE'H_||7߂v$G'Q;0;!9g鴟Or$u_Ekl~%B75|@>*|\{wu-c3hmņV4\u V#-رyWƇkc}-2#q+o?*$a>9A,{tMryπ[<㾽2#{׆79M]Ο>Z]Xx\:o?Uό~ [[BYM\Oiy&cR!:XF|E>Qv[yx~qtL~gxoi/Ԭ'+/jqm?2Byno^Y޺j-&eeHןyjGb +!|"7xj<7%O9.&OOz~^N!Tc㆕;GbT徝MߜrWŸ~ | -o5^EugoAvO찢#Gfϟ}|7}cM'}lWp1Zgm2|jD6|}qOe׈uVWMH/?gv$;|뾥 ؈Η˚? ;_{[7z\q^6W$>?^$#Ki7wU?ۯ__KoƟyW]6θ7s}{E_zΥ >$o}-[wIyJ!P_~._[_j "_X[}O|8>/GG*";n|C?n%D}b}Qoox5yb[&.mO72lϞ Wq<|NgJ??7|8msi`hy csų{}7/\^_k=zK'ؑ6WT=KM·DH?#'}J[%}E<x}SIn4FOK|WO,y'iW!=|K^NkSwy?|O{wK}? \,HYLȉXeuԼC|4޳>;ce|xWhnl#_GK9O2GiMtaK*/Kzwg} {ƿ >!9+kͿ:O=zM|"W@uk?lڞGٮ_}Q=_ph_ck/VMVR6#O[!&a{R"]Vٿ܉zW+a >6WṬz6Wl߾?o j>:Coᦽ'8ڕ:'SFZНC /Z(è?/]焮Ҿg6po,??k[WOlm_Xwº x]+/qk/n7 obOk x?^g]^(I'OxlN"'| ~?<3m{Xݭo |9?u>ׯ.&bndZI߶W og׬'_ _N%BH^5{RMG4ʂ߯W,*s.# gXοuEG|D)+(Ew~>]j߉.uV<ؗPom+5/]tYO 黾,c7BoJV{:| mf[:ᄍ[Mg5c}?j'MWƗ>iCytPc\ºoyO}J^U 0w/4+Mvq Ÿw?J$At;xlJRKOx%Nj[k}jțV}7um[: ]?zΗڤh}rS2=#TO]M}s!~,^{6)kx-O6{ɯlOٷ}[YH.bmg8M=ַ);m_M$mGw{6u=OCl -yq}Ca}f$1lCt\6/-/5[POc*>}*#[;{dDI.Ͽ}ֵDpO}C_燼;TïCouj-kmy(5> 񗁮[V +r\ĶmSkaQ'emK˶{:dMo-]\%<=TS+¿G/ ˥xUɟOF>Ϟ^/)xM&ٿ"I5+5aOhkxOCٻXϗJ0_iȬV.H򞍩\YbK?h?߇}fGy'fF7Tϓ5RC'dWxyIg],\qMg,6j<3lzS҇TK=:ȫzfv#W~<_IE;~Tmh ^jjCTּ1;l5 E<?<>wkPSiM*mR<OYVsh%$y돾捥$?x GOu=_dtMM~էMoXiyfC[4)sq.~O3i65Υomyo<W. "D [̍lMy"=.P43LTUD=M75Sz}1&Z/.m&hڟ&ΓVHeys_ym 3E s|,?u{CvgJ]LJxzywo_&m{a]ևZy|![tO ?6ĻT|?]&xkrğu+;[Z,?uJQ ų+~ig-Emwޱ/\:>oxzXw2Ks[߫:%7Wn5[ȷl޼sCΚewI>o̕}q5i8ncmW?+ztLP@/&XG_-S^~o4?C}/] woW}J!2?hu->m[Oս'uwMeCY@Vt>pOֺږ[It_|Ԟ!Mn+=+$OOOt|WÚuܟh_rɭ^L[?i1 y_o;W~מ8P-n'[VuKJ4߇Z+"WY쯞#^ݼ&ŏMhW>(/<=oqm?ΛhЦu-yk7%cxo;Vԭ?O7וy ^=2=oo)۬emO {yw;ϾM!5+Y[JI ?ѿyZ߲yʟ9v 嗚?*7Lo}_?\ꎑ텤Sa3--HGo}u$ܻzO/)5o+/g;=[t3%Şs H{}o84*^oCڹk} 7<^%FzDڵm7,*V<:\èXiZk5gUY}G5z<7]E ږ4O.Wړ[T!6=jx-5hnwGFydS'\JtsFhwfacyT_ak ˛O*I/\ec5͵7[B:x̍7dzU([s2tl$u-J=6?崉DgXMGo7u $w}ַoym7==pej[,!Ip=Z%̍gogcI>~z\u?ݫPy^HN>=+'V>Կqjt1y1]n?ݮz9_~f>K2M I_IMqZ='aSCu\;ygqKrwy܈:f~wu'ޓ4uGuѼ2KnGgoy1̏oosEy6gK[+iv'-)>S&ϸk=Qƥo5\'$*fg6"̏%p153^[M'v5uV?t: ?"n~/xMcKDzDZ?> {_Z]K}\5gC^|OCv\~J|lf=Z!GmJy Uͅ垫1mcˬCD׭.l$?ƭӸ:om3Z_ ͆$6?z8~un5{?X>LcyEz'xΆ˙4^|}\cɎˏ)߲/8$UmaId?ړmRO'jz-~ln|' ^I=_k>47%F7 s'dZ]O'⣑=S_jSkyMJᷴڂ"TZN٥[Gm3 ו-pGquo6/.=uXMs}W^ֻ,\˿typ̏fGX_ l)Vzv}XϒT񆥩-x-r8vx֑ݮe}ĒVy7/'խ(fKnm4Գm?Co[;D}"`woj`7m )eOӛ:HQ< lfL?y%lj%ђd$v#i5~%徚A=`H?ʮy7Rj,װA/ jy76Ŀ> 2\R_j.H}>G_Ij l$\>ȡs=]<ɩLoVc/6{b5-̖ڿrj꦳K*R[6PuԖ= q |V=?M7Ɠy;x?skתh 4Y,~[mhMԭ&VdVM&A4ymxEm d4ֵ-oRO귉 )>v/ g Xƌ|?=J|ĞiHWkyW295ƟsY ǔ~FFunkmA[4t+KOz=,xlQḛR]\,ٲmvG߮llaoՅH|b so..-^yTs|2⏏H|xO7%s*'?]&|m´GCoǯڣ^|smEOm?JB~$n5|@6t}Orb=^/Sox?ku /X> 5ZB{>EvcwKg]xֹ'MbM~'{A'RͶگڢxP}o5/ԵHAWzHt+wϛ͕oPg/Ě6h$Udp}WKs_sS;ğx^u Cw¶ek_6\|RTΏaƒoo.?9/,jOyZ'D^bj43=\{#ceE濬{F3ysGת|c0^|Oyyq3-lǿzהX?`?ߴw|.Htai'~?[|l c5z߄ ZsxvW|X<[P_Yس}N=eZ'4񟁼Oaj9{R >On&{kgS{ǁ Yźen5Դv}޼y]&R{?9/XTxuI"}|Y Y*/᰹JhV ~b<lT쯏?h_~xsiėj?6YM;z-<%3u,.5u%OzX_^4Լ9xO}.-6W}PKo2"Mc7<+y_{jV7>wߺM'YS_|N#|τ*Η/[ sXOgw}}?og>|I XҴH5S\Ӽi;߉Bnfk CXԭg>~3\f]x>D-)]YG?}_"fO ~מ*ڦ l-t}Dp?^9ןFm<=?hwg;??ܮýB'> /gT;[|>ϒBׯ!5w4) q"?n׃B+՜~zZ&rkq[i6XO>WQwG4Ig˾?q|?tf,7 ˗W}* 6$ow؟z.{OOj/,%MSTX'wNW=.%:sOkW7Z\KY~ss7Ͽ|=OXޕctq[t])ᅯB}+5tK^.>Yo^'7-ุծ2?*jU3K=Qcx=WPׅuݯhm|XSg_N_oċ?6w,[/q6f??gZ:W/ skt+JMLҟv%q?iZ-bELp}_3 }Za¿կ'/ Y"CӮ/~wn^-C^o7_~mROs*˫$?{> ougKRo'K׼^O[|J~ #ᥟ‹}WRt&#DD|'?i<+"qo}A,."Oǯ7C湭TzԚ=\[._j?f?? n,|=?  h<9>q2$t"}OZ7Os*s׵PDOt?C=Qf xg,j&d_l:6~$^[_gII4'IsGtGŗ"_<@~ U֝[{)?߭ =m&[\HZ[xC-E>u&Ϲ؎W3;k~ ïC>[y|AqgUϞ"tygΟ;Z~ o7mK-栰I$.wM|:S'aq"~x{c-.T; iH<"xo^eχ{v6nq-G?ӝ?k_/^ Ϭxj/kf{___k!Ҽyq٭5?0د|<=jY#;g?~-h>&tXxŚfơkJۦel)#Gu, ~ǭQy<%4uj%lğΞoΟGz'ƟhώKh7:qg5Akv䱷w>+V+C]RJFD佴Mx~&|ZS>,m47]İX˦M;ŇmORX🏵k:W&<5lu(*KMw^o|`bww6UT ͥ^<ėRxm.m6.mu oX4vr޼r$^#'zǽCΏS= t o >p#ױMWO?-o./]xI{Uy_[?!oۯ3s~_Cs^h0?]ZI4qott~!gZ$ 5CxeKhX|K5/׉xė>qZ?'Ȼ;l6oh~ ƉGQ~ rY]GʚY;xa{O!G¥HA,?u}[]WνO^BG??u$Ɵy*[Ͼ'\iw}'1}ӥ_3}i(__^(JTڗOvM>GO+M?/IbDb[`gwwJ94(W6z//>k7KKӠc9N?2լ/=c RWW%x&^uc6뚤Z֡ROЧuʞ>x=|sXw-;O^Q;gOjV~ʵڷ mb_&\L(X?F=B(Qk7y'gɱ$)sζ:mt{iR A&DHQO{SxĞWg|yDn5cjCj_|3nRƽo'-:EN?{A~ϒ䙙ωߵfԴK}VO6>+F-)^} ?f Am*| Ew-K 4f %H)^';Wj'?k1;}|:߈|m՛ßnm/\j'ɳ~bio;ן4R[bTO?ɷ Ήu>˾%xCw ;?>-5+ ?55|kklQ?~Rì_|HaomtB.Q/]j-Gc Eܾtl?9yxZ$:?)`ﮯ|Ohw~J>8xWRkİ{tt].>y^<u7Ǟ( 9Lcc\$.&}~kx.Uҿj+JOSݴlO;jEY!SboKďzYYM~$adX>?ܯ/ ԫ0=VW~S+yO/:mt Ozw~' Dž^Vo}f{:zzlmC$iHw+ΰ/Wvlo?ؕc'G΍/g-4/ xB>"KImٿ-lRgg]/_ <=Ꮐ/LJ%xGj3Z,Omǚ5H66}=ܗ쨎&|㯍ßxA'ix5C4q-w]+Fc=Cc]7⽿k-Ƒpofg l֯C㯂|iԾ+/;Yl ~O.|Ο'^ikgOXyWh:F-I#Wi ;y/oRaRNogOR߲_Ζl9sK=ݗ7iuk7IgxU n5exoo}y5-cPҴ{ O*(mR:|}ץ'ྵ㹞R}NٿgDF Ց_?]j_i`t+kW~'᭶ jW?t=UZGOcE2j<;7蔯=֟G'᷷^3뎦qIrӫY5/kuR ) MxWv4tygXz(Jqө ~(~~'׵cU+D%=Śu ?q?~Vփo><6K<7^E}7˃kyѦ}+G'o>+g7_/6xa5f44-։)=tﯖBQ&4~OnO^g߿]6yI\TkWȖ  #Irh:Kk|Ч=f?M'Dt8u]^j7w/i766Ko \?uGdY+o6G|[MʗMyﯡ?g{|'⇂7g~7/Q4!>ϟ)Ɲ?_*hJ^M^I"ޏ*EVkkyk>.>y#m; D7ķ{˙bm}_ Z.qZM_c7.^Qc[Y[\=bh-osf_qmO %Dn}?slwKOf6t/|SC;|1țo1wx|o߮b#O#6g$yZ%&hާ{+Z7?R?3~iSX^\&7h~D9ꐳys7ʟWxo~"𾧯_TOIooԵ+5%^3Gǚ׊!%vC4Ͽv+ܥ7쫖͗UpN6UuD?$sM˨yh6{Fo3oTΟ?G"=mbŸMvާ.m>g1^WoZlIg.nQ7OW=EIoDP{ٻxeIu-rw-2}ʹoq,{Mdywfɏ֌wXKO17ج}M=J8wEkmPd择}aD<j &7==Y?}6b}d?ڎ?ֵUgwmxH]25ii~~˟'y0yjhu#:D}Kz,z޹ZL_^y= iysƐ_߮dk3ow ~MK2b=AMTS7Ͽ?ެ{mVA/^]DK\X<`h˹=ޗ{2z>߳>&җ oRAgޤ|Wh>ޱ j^=đyGtRDzׇt_=ΥiZ_ek7T$ID^f.O:Ki{;Ȓ>>]ͻnlJ+/K6o/-/WMu 1oIaI?颵q+$<>tZ2 .+De $c/e__9dcQ InvYr"C9~Gyư?{UĚFi{b&yUA3Chg gohvB14u~Yvu)ϳ\'sU}Ks<77쬹{CKTh߻_6ҟ5>(6W$Gy:2;os}=Cڞ}ͩH:Riw|DUƙ5[>mX=Ik:u1l!jVpZ}vo2)K"i-Ǘ&"ᑶK|S[;~j(hW=5_?fG6㕷1/\:fx*6e\#o-e@ \[Wm+~M}>SY[ڟ=y="=n?o2丵o=uT#w\BOy}WHaqlc-]'Z5.ϴi;i\8sw}Ao`j޵odha=fyHd26ǒ?IM7՝I}sPoRq'ur񅵜[%;'i3c?OllU O9h?kiI7e{#T{{y']:yc\i u,?=\˽Tuwנxw>^oY/Gپ;bvwSh:L,\iy5I"?xo mXxzmgDi/,#Ňwhln?Ѧ쬽MKvz"Ii N }oUk&?,Ԛn%ŞiuO"eAoss5gaoс[hw sz-OA?iV:'﷎_tGJvJ94dVO+ d$p|?]kj%;g%&{?駕ի7Y,o,Qq}/+[Vd1u'oޛ7Xc˳vk˲+]nO.i`FݶFlMW7jdk$Iy~s}M } YU?gw [=>m*xu(~q˨[kΥ/nE}r "4۾}*̋s'Y躮{([{lg-Ud PxMºmƛn5&{epus$04oct ft?ޠڗ>ygw3I>vJ6fYlHG=[{-s*;[/.B?^Odt14騖lټm]d5[{8d̾frPмO rS:J5\#U_= ='596riVk =Ɲ|cO\/s s[w&Sg_~_.&WٶXd}k٪saj-Mo@{Q\?chwhTgfJhRoU8[[\\}%l2L >co|u oi^$Ҵ}\_]Esqsegxg\Ҵ?Yt}n~Kp7cMgOL"'[m5!Eշ@V|H,$ƛ+֭ {5/Ə x'h:otԤLYԠ.oF׵OƁl sG 3jIy W*+еoEu7//#* ؏Pbq66/>Ҷvi|^'˶Hݽ?ϑ_ǭS :]/5[x.mo?q?[{yw:P?oZ/[;=)$Gs<;6)i_˷D?o MoMo蚄mk8-g"[E3?}1wqc55r}^y^׼f"Ҿ!;M㮩|9m{*zԠOaW=%|? py?؛kĞ t]8+G/"Oo3G4G,5cGӼuj<[MxG ׎.w?-?OOioh}%q" avWJ&ڃMcVGZI{L*5=߼g*=7G}n밋'_%\?ͱ@3]I4^Kȵql)eoH~Jټ#y+T>Ж}{yaeqg>Ols*檰Olu}UVdo^IgM4qnE@bRo4¯)4pssnlm/U+7?7Ҽbs4\ȏ/XTMȐ4?/W.dl+VDWXGv{?zP3cN%e]\\7[6e5tI*n_Tեvhfԥr_`pwS#+vWIƓn_J,P$z,K9.v3iZn?,v:?`SK֓[I._~|}aKWŚ46˵$?߿#V7zWg? kŞ$O_5x"말=7O:՝_KYl/t[YlV!xt>t+oGY C\5iAg⋝,o yp$_cΟ4뎟ͪK3;}u/ÿ[^ V ko`d>ȴt~yRCk:ķ⼸O>OOCMAº:IX^.׼߿z?>Jf|B]Q;/$eM[OGMX}^f{Zo|ּ%Zw<ۧo4?̮5?zFh~$̷j~E<&n'%u=cPԦO)nw_|'?n6z߁i\}VMrpm]ܬ*PRuٷϊ?[ aȒM>yN_Zh ~x>R5_6;Wd.Mjc~wcsy6˨jx]+ϱ KDKg ? _4?'ZX]I/y翛j̟_yN=?i9C<|+kDx~<tG|'ɲ+V|Cx#¾_5OK߇}~4^!~0^h2oUaCoWOM|gi'$xXZl kɽ?lbSJ{X 8|i+3NJ4J@kXYM5܇xk=O? K >(.-t[?h?:ğ7Qåxh;t:Wį,0zmk/čo?i? +ڢ^h[п%xaɿdxFIx|aK鯪],f؟}>"__'D7C6_Լ5㟁Q|Lo⯳^& V)M d_)C5Zז^YxK{[|Z?|їsRP'↜uoW,97BL?__w-_mm_/mm.?ukk&s{:JmSŶ$_4O$Vq'`ý~^~?48Xٽ?LF+{D}>eu>Lpqw>v(< }OjW]<'񽿒"gxo潠(oyI['Y#uDg/~ Vv]֕y0ox. a߿ٱ~ i~ x<m?{ۿߞh`Y ~<'?>x_V=۫6g{<'ܭ/ =7w><Ծm_lQ?2ZO{Q3~<Sߵ/?_kDeq|-m?>!{\[HkVbAvoވ?Ώ_`xůWIOG=jZ[3<ፏ'>:[-WnY ӓO'T47 d/Nw ?綣iq p׈xM׾>+m[&M?a>'8Ҽ%W5%l.^u.Nv\'~ ~3nEÏ\@YR"OM>M*)=_$ڔJoƆ-m'F؟wGO=\լmcA/ժi?YnMAo X_AеM{ˋm0/om4y&͉_.g4R}!_k4SKlޖ'^Po}g&kk%RX?i8Gy3㋝6{ŞÚm!fɷ~#RmCIwE{xΆϒnuKw¸t\Kqjۥ\?7_rZz\"Ҽ0}s+7&k/"h[ϞY^޿󞁨ݟc^n_Qh:u]n;=vϓ}}moOx?~m?{{"k72r:wNzx#~Tʟ4D] UO_|g;e {ۿH󞶖"?ʛT~v,۾gjtgOyoƓ-KݶM{Usb:']~&}C&㈦5KO~bLy|WãßSAҴ;ĵ]B/,Z+&ɾ}+OTV[Ϭy6}4]o$ZVŷn瑮bbo|k;?.?闝=\y_ iZ~ Y^4Ru"s׈tZ-7z}f֩ğlD4{^F <35[*TC><6'O57>$sž oM,cm6_!?X?1"=Sï7^"׼=+H߇"[[=COx>@r?ȏlMLou/x\B"Կ_~~aj ƉxC,ֳꪓϓ-|+Eh{A9k>zo5MK$+͈\J`kڋ/"oDV'kMi_cxƟ-/4Wޏ^hk{_;؛6W%߉_/hox?quJy&GD>&~l|+?m4<'?iA_XOϾ߿3|/Pw<ؠנ(][.}|Pk-&-լnDu_~(ZYwˬ;VAĚq)iI7ſ{ٿC>J Iq'%a^^_M_[lO뮖30>KcJ,?d/.(nZ^m>}|s|9(nts¾!4&(t'Cx?Xk=oǚmUZTx">=y0$yc)yqEwę?=iNi˞&ʧy: K>6߆]leK_g,So{>Ϲ^c~_Xx':ƁmmƟEQoM?Mf4˅Fٿ|/tOOwxN-nnIxS0:O$Uԧ>i}cl߇w%.|_/3gmaXˋp^o|=|erIҮt:o[6yfW,OKyZpb=sz<]P]/@ |givw7+5ݴ/ϓ}}]FMj{KK帅$WoexPĐ^x.?={:Gnfo46בoei53M͆TVJմ=sye_ 9FO>ΗY+ӧR4*p3rF9|?o3ΫfDX2ηw9>1agNcR?kcM<׉2Jo]m!#Z2cﻷmbm.u/vזPֶ߱'3[{4dI+[PyM__w.d oĶ~ :]E}'Ul3Iss  H{8ӿ/Nn;|cӮ TVzԗIa?z?ioyך?U(7M+tf^}nO֋kFA߅~3I ?tӵ/qgnXD?kZωX|o'qgnj(/eCvhOM=!75It"qo?_x7X4Z4JڷmtV $HK{i|ZV\>SQ4.-cWxB׾̗5={WXXKO|>':~qy~쩲/^ ~x7kǵkk":2=w?Y=Pn|sˏ}}_aǐq6WU_Wi|%=oIj-Q!c7>oSɗWN'x'SƟz~?u%}ymX.o<1[cM%t(5nyxi+{#ߴ_XGH[C_/i_75a?,$͗̃2˫}d߷f1$3[M4w[om{{#4}kq}JXOK?Ũ|/#Oբɲd5GY!wG~Gz%v,־&'6]]_Y:~aq/Vyh_~XJL WY<=qkM<sY*{hv]'>>juu]+Ú~mgq_e?ҒjBGC$4I[ĭ6*L ^Y#u<:6zf3PIl?4oڇ3"Eg-V?juLZGwԨ?z|CgJ#o5g^_/S\x$kx4ϻ"ןl.6N%O>׍|HԾqho3yް&Zk|\ ̟+1Yygt!$ϭVSxx'W^ 'r\0y}b'z.CldWoe_ןZY>o6l$S =3\|.'<=h>_f+oiS;n?w&KlzOguǙa#nWVy|> =JR!lVVWBoڴ/asg~o#gWI=6pzu$g Mk[k+=6g3Tםm:k;9mDzld/qC)@zwI 6בX[yOqoz̓y)G[Sv3.˔[n7G )6ViKɑ}iZ D;fu4h"y~Ji&oW}b~t&gL %I<]<˛hyoCՆW!՞Ϳm/^]oCjkmu;? /ԗ+6&WH6Y yw_q%Odܟ f%7 Zeپ #*9HVHfkwO\TO2?Hm?ۯ1Pyo{e> I$iI$[Keȉ40#,JWu[כys Iugo=&i^?G"jzwڟTַ^Zòo:+t*^u\#TYWdϷGLw7ƖѼ|i\vזY׍1RϷM 4?$?g[ueȃ3УԡrltmcPҬr3I$(_]j} yyC'B3hZԼYcK*'K b;$հfޟ{&IwWf?ݶ͛:} =þ(Ү4ٲ[9?+*Դ h]d:/}Jivזqn^,EaIaf#+zm7Rfie˕?틿YZ'gm2϶??s{טjVmqGMMVtzK>K.3o^]_%m>6xH_lBk7yCWdԥ線s͕Lq #oɳznIEW%*iT:~}-ڇ|Amyasq}co>)߳dwj|U7‹K|W+ ^59s`1ǻMpWgq/à[sRAvߤȿrV;76[]_}'y%e6=;d*V.u6^myi)5 sf{ G{ɋˁ?Ϟ?rO\T|ߓԞ9 ?o_}\w}/Gaalb=OlNo/;ǝ҇P)6oG/3_>OEo[ByM~yK]AS&O;vݲ~mWUFk/QV7ȎfWJ4VnVm+C˯VkQA/Vk _}H{R]ylOK=&֬65n!?>z̸bc$o˒!N +r aIq'$?ޭXo)8$uCڟpT^gG<\ȿiяi9󚂉}ɵ2y=G-y~0{ DgGCo_=/V^єjiwңH*Ky4G,q?7Scy>{_uZy!eVȫbh+YaI_7˙}^k?t-eڥ{\e} 潦jh:CDv*?$uKo iKOh^oC[kG>08l/SJ绣W1o-bM|C5;Hdce 3Ĺqi:xbſlҮ>/=x~tٵ8w41fy<GOoIHcBf}޵C\?=LylQ#eYXVb|ZM/RG"޻V?'v^ѓ2Hy՟/zV7fǚ/ܩM&W<yh7yfZzvm53I>abꞑgu%Ͷoy |\\"mO}7}Knqr9Qoܬ%1ſseP΅-ߺ͜omW77#ծn&0ȻwLev/e67Gʟ-mͣW,/OO+2m/o"M4Ѧߵ||}9O8}Uvt7D#1S]]M#,Ȗ5jP]Ki> 9QBI< rS[GԮdaIow`k:o]#7:VZykjuMnPIg[6S~>uYum6OJEdQ\Imgymm^UʓW<?&%"xUhd 3<^!)*%^]ͧ^4Zլ6~t/<gtkxVV~9x?~tؿp}9w9xsC?^tM+IM\>'l]&bH]l5>ԯ/iRʗM%jn|7h蕥M?&뷖4uq"l?{jlu^:j:<imdOIh#Z[j kq]oMLܯF;IIs{uŽ>JxVտ.{˝a>{%edc?]{?(?xwX-/a\A7ڗ~/GPjVg+M+[?%uZaogxOė6zhU'+oI;>g5 UHcUXtaIKm+OMy@zӷ}&e':[y,ofsxyJw SQoX< Cq+PlN>~ыeRO3H}6M?ੵm+J~ |%Ou.{?2|`ҼmpWlo<'?񦷗XAr,?vd3ԛuqsjW)%+tW۳Jwl͕A46>4.ƚGU;WInt4߶6W\n컝Oc'ݾga>z򻋭c̆gT[ZU?M];fKV-:՝0[>ؾMjٯP1_y6;YcyqasOlTz666Za okzy.? G1}Z<P}EwDfJ3ͽcU\GP&:lVZ9-ЦofYOFs"vki:??TԵmӪ﷗#E#c>])HE2i\Z׉4K7PK2vּ]k_`{Rm-~īu?}76t VxDnI"%w$Gq5.m(c=c5}m`7GBM4{?Cm'}}gr/O66lMRut"\5s6zݽyV壿\|+a.Džh-=ARx]X^_ "y#7IόUu.غ͔hĖ%p|fmEKTYmSRm.[4yy'ۅ/6Ծ躭5+Yl5(_!Mt؟\8D}<<`}}Wy_64>ɤiZ]5+8{;ﴮ'xAo|rmAMbDy|;O|cS>!^xVDRMok$ytI5/k7KQeK*xGdxvK DM߳zox{qx{zMCė鶲_}ֱ%?ڷzWߴGx'׉csyk?=.6yW[7>< yX46Wx7࿉yozo;?O$)<mZkOSC56+|X>#j il}-n{itrB>ou ^jZygKy{?&]oŸ+j_,=J._G}^v=KXDxK֥}??}u\ T$ Ju¾e/fInS_C?c6 _ˡڋ&{^fo>?vy\]XA},y_k{Q>O^^+Ų~5})O̗V?߯'h_?b~?y)쳥qzt. xK¾ =- =eR]M[|}כ.KOxb캍)_ϟ%x6XMymDS';̉_HisȺcο[]-$goó߽(8'sګE ~.߁6Mת~ԟuxo:'ëoxoq:n}~&!~EP7׵tk%.y%ix_'X_JޏyOYZK_=azu3}-Q'!D> {5Ky5o{<_iG4I/%+T}r)_ j>+2O}c70||WԷ_ o< _uO(K~ Iu)SBG׳1S쟁#jCg|y0cg&-&V}V!Gy]Mr_gٿŞU/Ş&o->}mo?lö >8jV xMb(^o'wޛyۯǰ?9~T#XVw*=SN>ϲd?ܯ|UobY t>Oҡףu# ?}JybȼwyZ]'V|mC׈# }𽭌Viƞÿxy~E7&+ޡz[3>xv7Yr4?餎,/-~mT/<6o|Zu'~ivzV| on.M*[i,^C^>&l@򶟦Xu{fx?v]ATއgF=V~W~k#Ӵ~R=)n&-?~Si8Ii[x~/#ڣ='|+ [X2kGdO1kRH?$1dUc<6vsΎ|+c#|OY]hzmdt ZW7ϋ< R<&:=S?iL|?4;Cgo]$Sj>ѿz>|z/-4'D GyuR_mK[}Nv|}sŞ7aKoUqZK$Sy.%[I}Ki4}S_"};Ͽ}q(:vm6oKme6<>M2U ^xVO Z%򾗤c6yϿc+G\X`:ޛx?%_mmgKخ^ԅƫk}R.hKM[O/ҡğ ,o/\d:y4>'wUս舉%%&Ő!Ēk/ZT-z:lDm.OJ]}F)}P^i>G#mG'ԙXvo+׼yxKټ1zՆYb%sW{ҕyS>3h xyk-.լrΚ41y߉w3jxᧃW4K5Pgqi ?j[]{<Wv7ZԖ6vOM;?xGsEv,<"=lh￵mKԝmo/:&b @]Y+oGN|ב{_b?'S O> 6>$ԓD]O_ŭŸozo okggo>oO߳?_hO>CT_?4x2=_Dk?II%K?hKsQ~#m~TO_s c)Ex'v|XSW j?n;u[|WҴoR}z'uCl4Oh`Q6e+~ӟ|U?jxƚnyKtqSIޜ=ϡ~,j%k>'/!OĚ/GmBHԯ.<,oo߾(&F'5$>R%y6V$>*״{hm,恼$o|tNz׎jhh4܅{_xO[z=lnո#9%>kŭ7đy_gFOqd\׊ nIG!{3E>#o'|X4CĿ cg?Cmnm X[5k}x>gXM z=7NMuIn#t_]ψ^!Լ&D:{=rkDc}POxoTlM{D4i43+ž4r|*<&{L$^j ^'| MnO/Y+Ѵ)4.<{E5˛;5^>A+ms'!VGfk˘f{v{vޏ2 ζ_D6$HRy?:Ol4J:ǚ; cgq仭~t+%ԓCln:9rDjG <3F?DٿZ]5+KKGTogU-ƓxʲOeqo&KYjJ#PE+ ԭxߙzf6jIDk@/k:?ɳg>}N7T׭VJ+++:4bĚTk*uuy=hf}9ωz|1g[)˵Jt;_I죡}/گXz>?my.:$Ͻ6J/mYJY_'m7ڭU\WpAk?ؼ[(>\>¦.<_sr`k|7?,vDuK_s j nt+U,/?tۭBө^\6q'yO+cI.tۋmJKZ/3Ӎ҅OaO0ƥekvq}[4"oѯxŏY.|I$T}x{Zj^M~sqflaՕX6|HC#uJi&uy.ocCy~dDu>&|3-xGώqotUH_:֗:WڷCf.t?WĭM'[o<d}0NS,4!3ckl>~$ǚXdK&xම}L|.#lχkGLTԒ\y7+~_gVMo_4}V6y <6'߯|~|u^x~0:e^-u(z/byy R4~N:ofϬ(׶||A|?g> xo.Tuhws͵JOzY?c ڵ-?Oviܿx`jl _fsmcVşIg[}eDnKCdx oxXg /w7kdKA2VXOoஇk;njj27^]8J\;O=.=VEM}Sj/0\۳$/(Hd<VXw9}ֺZg$}Z}Z}R>N{?WW?vZ}`=jd؉R#X>7 ,mku\xv{?!Ѽoc&Vidsy ͊M]ZZOCMғ}|RЍ3<1y9-tK4T= =vz׋/ۆRM'u;Cw׼mcD{TP?6/>ayyL۷MM"G5k4M4Gg|5W4'@r#-u q7=>z}o;onZgtc)?vZVyfhDz3oy_f:q4"mS^IkYx|u͕rREl6d{572a[hSdjɾ SoKʏU}]jf:?@.f?٫ӮɮJ[FS]חCyQ—;?fʳqyѤV΀>nJ_Nxះ8|6Z{}Kﲿ8uI|}3▫huknb^kឞ^yۛk&qo榥ck+ŏ?z;Ć5ڭ&ğ~MˣȖZ4{?ֲW%/xcx @SA=ʧp>aߦxibC=}׎C}ܽ&ԬdKy]~|CH́4$deytzņa$]`/zxe.Nզ1?YK|Uyoo`ĺɛ,:on߲X^KR[Y?wI;/ߍ&Gݯ1[ﳬn7Ͽ҇XIޏt{8gǨc{nO/gZ,0A$a{E'x~,o߬{SգԒ?H~VMBeipꈟ$2M kd~CpI,W"jzDz!G}B#I:پw[y9VиHD-Z]QCsC֮MP{5.5$ _&uus䬋f׾I&̟x+tx5ywcM>tQ vMGU=;5#bG՘5Hu/%ɿʛήhBO;?G"  W-C:YgE޾ǟMy4 /ZYcmK||6պwIss7[w6 y'Uy۷ɳW&/ >ԧu?si :|R>Mzv-SĚƧ66&ϲ|:O߇;;kfk;߄/ϟo&Ȓyvjf٧}-6l.u]7߫|;G]ÿͽ,o2Di;Y<7jhoIz;]C^S{ut&ϳRtvDa?w E7| |s$?\j46p6E 4ĺ_?ިqhv=*M$^gkb=[Rup%.O|מ':o}hqhvi{\.D )}dUi/^/gaVMSJϙ*̧Lx4[Ǻ3w?*K/GgW~+9y hyV$wȐz=9MXG.r? /Py!hnl&~_JlU(|g![IY4Ԯ$c#.ĭj~ͪI4ثq?s2ᑤwg(-3yaob_uAok"mh޴ڏg=PE޿ '$ɳgZ=Ҿ|x?:4 ²iW^*ԣax`{+{?sgDOPͷ?j{6^j&m{Ⱦ¿םjo*zG[F%i61߾D*TC%ÏG1?ݣ0q=_Au yM-mlo]/7W 日yy_M77Tn'~#ÿzKG*7˛7>J=g5-ZΏa]/? xnw̒o4_6k$6ZƗ0AƗO?ﺛw\yڿuukkb7uz~,u~׼IZ{6+7$;yh?m;~XқG&%y.>i׆5-XX}/۶Niu4K4YSPŭgЧqݟjZoڝ4KUkXlU&]g+użd 殟o*|l^cI">j|h_!-x]ѓVoMY[}.fBѾ%e*1^y)7y] ܴ0M_UHkywh}#O1 b2-ն^?Kz ̌m֯ͩMD6Z hĭ~zz%YM[ek]͕5ۯ7Ci?qSjǝysOJiGއYS5$7SysI3-.%޿%`/4r?;Suн斉%ǕkB~GjTzSI/&i5[=CGYVkϳ\CmoU-n,'&_x7z. 4CQ*n_65 4ֿ6~\64>ח}n.n$_<|V]}ݵ:oȤED͸cm&Ԭ%j66sǟsy<_PU:=>X)$ԼC&x#owVI.=*oBRE5=oY/i؉\wlz%?\JR}b}_7ȟ}>mcٿ#zt:hm6}E֛h6/yw6n\ /\K_:fǍ7gy :%VGe2ggK5hdW0Ws^_fI.?zз }A5/틍wY.O>',_wux'st"MJޛoz_[sWʚ&y6s h>zoEHlHz~W/c˹񖫦mxƕ *h_]vs^ iDHdx/RM}eLSF+ 3_:F⼇ u?&6"oe{&h!L,??m4SI1f"c~/u-zjW?t =Gk#XO|YnP|km>-O3jXJK}+RVOiUgM5Im3oؕ#.cyroZŶKi/tŸQjwo-_3b.>5W$vlaoYq $>U_<ҳS)4isEu)/'GbfͻSYm3WY'fo3eV.5nm㣞`tX\Zšm,ֿO}Ko,̅?MԚDkؒ/w[j:KCmCqr$ZDI:˹`Rωo/ʁl[eWúS[f>Xg䬯 = w[[O)?=Kg=͏!hMg\?)b1"u7 +jyؕqcw51*nO+-z/Am%ȡ<ȼM.Uo'Ox/ ~fs~{?⇳|,?[j݆{DZko?_LH-շ4M6(K;ҥyS[M|W¶=֥5ΰo4so+{f<mc˲XG?[sV5h~-7Ǘ> 񅞉yoKx<m?߯i.xh3 &4 ivlt/ }o^޸X!yEe|7mMԵ}ff~vn<{xs^uY/5-; ?ͱHD?L?[MO\𖂗Itږ$PDtO+ux/o ^8;nd4io>џD Mbm.F}>] s׈tuӵ}6u/Q6MzԾ&,:%-ٱ[Pbgt7E独|.'uxW v1<gdi}?ʙ^'k$ԡ,5k$ח_jTJ%ozoW73X<=eo")Ccһo:7ŭbU/lWgោ~*>*,5*Wӭ䲂?-buֱ8*AִQÿ_ ? kv_z mch(^Fk6}^)͓:uoYx"]xo /۵Mm~amDӤm^\i>|?}+Ӵt'Ļk?,RO#^o~_kvך^X[Y{;Y^}tD㯄_'ēj-]I{>O=/ź\4l}trҾ_ƏR vu7ϳDH_{lWx}%oãmdwI׿^ iM:jEf nxnlbH%*&Ⲧl/# w/G?|CC]C}+Ǟ8$߸y}ov|[yd_f:OOjVvz?x;}g X'O*V]nJZOۥN?خR%}K KƯ ϟ4Opyns>eE:y.W>(-kiw,-2jP?tNC4>E3oOKC,lNiyl cevRd^0ƫkcUu{[i+̈́cHm'>{}Q7_? ;t{XD'-a7׼hߏ5)!<%:XTT|]ؕO3oa.~ iU:Ljʳ.m%C5ƚKTt;o_m|)Zx3G,>-O=]Hbt]~ %'ïIa K4=}i7R!%\O )inKarM+c,n.m!Դl,ro/+>M|a?YQJ;4x] 7ý'u[YeRן 5!%ľFxkSۧ+bW}Nc"vOh>,m6K4DJ|?x'K$4y'Hg!?"׮!/t<g?~(iZ?‹b^4˼]J$o!w[e]M&{#טj_=\6$>!x^Z|icl|?܅)b?i}֛}Jk+=OyN?G؉w$[6I:7Co7+gXh,6zkT:bd*;}?7Vt]%,uK~=uX&y)Fm?*egc߲z}o?>y[Gg wnUT<7R-?ڶ2Kn|DU5KsR};ɰ&c"T4k/MS7{=jX?|Iy[KO4_b,{Q:<0.ŏVCtxxoK_=Ջ/MخV'Cn__;i=c!>>?bI^OobVŞm63oY?zi#>]J_3ΟM5&KɭhoY&&mhdL8fhW2IggP?uK -m)%?ʾCDzSY&˾EJIf^mf"k9?KW6w=h^\Ɨ;5~T~|?[;ޑjjMa|#M.׎M- zۦ 2%oﺹ__YȏN~9xKڕu ݶjy?l_|sYjQ6k7ږgiGgmspyyo/~*ѭ5XuMc[yW"DrZ ȦORԤ_5˳YgI?y-?] zƉ 燮!ޞ߽q%)]{A|1j[t70}n 7^[["Ep߻W-i>s&o,dM=ei>ԵB->P?[_ڻKϊ[8oIo̯}~?ۣWpm}償77z}O԰2xu]&Hl[;7$QlGwߨ/<7;ͬQAeS?y?smٹS~$F=?_{haMq};մ}KMkZv=}6|owtxv'g0ӝCyd%fi,&ș T|aRg!g4;磊mosXVo XxZ;}[ow?~3u˝>{oHdW+au'o-SosoO7ctO?]jZ~;.n?R;{gmk^iھ 'Mn./,nt&>ef6 s56l+S{RhaqܮB;ļQ#O߸l,+=^mA?qp[i}'g{}zM6h$RrOm>Wmֻ];z/>{9aѨkJ#h>{G xg>, ,'ү p=ޛga~m7Ncèx[ϳ^\;6EO!Yj¿ ~ |>a$Ow7=}]߁+o#eŤIbdjZ>AaoY[97%`í7u7mͼexx6:ގ_ 7M7i&x]#g-GxWŝKlj$WVP"J^/7Vl||Cg͚5˽#oVoVmuI<w2G7׭|9| YJΉA[i7im/.yWx6IkG"P_E5<7?:S8itϬ>ӟ^'xc77_> b[s?j4ߍO6EO&$kyoWo]T7o6I{+F\Oy=o4g>?C{.MTO|g_9sL-*jk 7/ xL?ҿnuV9p397f)VhQOg_dj3_T!FFey0?jEM̋g[{yw'Z|^][E ssy,1ž]^VO$s"$'{Ev[j^5MYkv=]ռ3O .i yVtO>#r!ԓ]L|DMZ犾}fM~udv#vHԔo[Iq6ɾX嚦Txқ?g}: G$mOJo}4fEθ}Oh/k&-jknC[y~rۿt%y,:M(d_cMdV'&۷G#'M7E8n睿">zuOy7/^JSC?:2l.$o/+@ ~g\m*W^_'kZ^o^'ڕ>mZGT5'u+6q4wn?pAuj'ˆo˲l|Ism'm4Ye7DC=_3]MByu7/htRW㧌Uk-6?{Tx΍{k::y&/X[*LDl^wթ!sR&{m-ȑc$_ܩIy_} z̎_qdoum-`5%u~?uF'}[Mg`G[fi%H4_c?{J#3>ռ+hݟΗQnһ_C-νcO׵R)ﯬ-d?!D+pkqwq;[C˗nn;4vΩ\y\ff)= vj2;#ogx־v)_5<U }BK)-d}=Ij!lW{7"\m+,='hۿě/7lC;#mܿ^{zjZ6/͔dtB۶fzKkyrJ~[#G4]5y\z,7I~/V5pk4+|gk^[YjoXWM[{ܯV1;ncZRhgܿ+?aOR^KճOtUʷk}[ǎfVԤK"u5H7 9>E?خ.D{]jZ ̒[~|ɓy筩_ṆHmn" _n|y$w2oWo}y3C4ss~풬yM<Ѧ_ >#WVhd?ur=KLtטǩ#M\y[2yC=Po?ڦ-ufVxtxo5yHv|ϿVmn??EFz7϶dLfٺ&MO[|g"}m7CuګWPug|C3՞7?ܩ/;w~=K̓?uڹtގgo>7}WWd|ט5Im+MoLѶ\מgh'ΓdoFotL4o ^]^w ؏Pv3L9zvM+CRzO&O߯9Rmf?dfHHpqdWTĚ>g /X{ &ODPIc+Vb{N?eVty2L p^aR]<1'1C$2kRYU}R`*{Fz$~ya҇Rovh=Bemroh*wɦ3.GqJGI/T9OG@{8贐IjKu^Id7ecM3I 0+NvSQ$o$v}= I{Tt0{CĿkx+78fZlOwt:V\g{4m?4(1q,GuC|p>D-4[O&Oo=K>x),s<'ꙡC[o@{8n\Zgmsq#H__L_.O? h2[2b?x/.EcCŭTY4sR5DJTO!tؿ(gǦ>-^[$1a_ɇCPṼ9aH!?$SYO7_1]i_-Maf1J˗h6={nmoPM5.uXtzZUm3#WE+ mI[fߨ[!QSɷj I5y66 P6Z=Znw9^ipg^j$2_zW_ !s_#Q{yן7@wag ڷSX2\h,Η"~+]Rƅ!{o$*_`am]Hu5luY.vEqt.dcePͿI췈nr/c·uzoo6VSLS-os䶨lM/}NOxakMJcUv\}Ԛ=+\冡7R_jW22_MaƗ2"o.g,sYyq5Uf9!ƫyL/6o ɇU9|*GG}>/6K@{8|/~q̏NI!{Ki׋axGw:?oLtW3oۭD~=g7~қɹ-fc"8>a?%`4;F۷)?aVoe%x&񼥒eiGa5ΧGfts[!{ʷ[[߿/_xFHRJ?=pZL:jR^j[Җσg>JcmS:Ս6siw7&֙~:_KWeu+N9#'o7VTq±ٴFKKtYf hK;tmp3ݟd0\oȣCۋ%WAd\y0mr&ȓOզ_h۶%-+6k1Oݓþ/?}Db]g4[{owe͕Ai?sHݭeK ob<똬lu~0bGn Ě̛Wq?O8^h6 M|5rHVHI]BxR< k,sX?0H̷sO4q(ZL7C]$;Yú w?r=Q\Mv6xomHvSẴ/HG^{'{+P/%M <¿{4V;Yo.l?w|_Sj~ph)o[Iq/۷|uGcb/gm r:NCm|7M7}>py'D}<|A Ǫ÷|Vo}S\xX{f،^d7Ͼ]{Xկ!)c]kXY?-D?D/s_<ν(m| :?=C|.o-bE~|I;'iuO'ō1!ʸG6'Gꯀ|IVrc=t]; hTG?ܮfa ޫ75{x+mgOx3ſؑy?ɟ\7ď^3Cxm-k[_#mҼϨOξxc߆Ԛ|]8 ]A} 7Ο{/]BK% }#[o|\z1Jy>y~qtϾuԦHUDPt9#_h |1)|E=$g_ kk^y 7|iږqmh[9gN~;ktgy^I{u*q?A~j*:yVg׹|xeb*~-d}|GtݿM ص[{o#o)Fw}?Y|ᧂa½c$ʵ-^OY睺ZÿJwlj{Soo,$Q3ſx|׎x?RҮt+Dy//gk6k[K;/Xcȳ{lw{C#jmoXoR_}}|Wxľ7KXK?x>N)5r>Mܯ16'^!w?O*)antt>^o7AԼ3y'ttܚ}MpٿALyXYkU&$~&J ŷ&ҴM{F'T[7ﭶ'o;Aȕ'7,/ȵ+ٿ|:Od}9zcXԛDԮm@ᄚ|Uhm i^_\\-Zވ._5Lңu\yWgqgmuy?W֙SˈS.M.%*1>ٿ"?:h/-<= &bK+xUox<^\So|Ή_v t5o /47)V\eYDOw'|kxWljQ]Z^SZ}+MF0|I^Ul1ZW4W|7|u/g j7j-=4.?+}G%u-tXÿ~o GXu@=3OϻM>?a.:_}7E𽝥SRL֭ԢIk u'߆>׼[|S|)?lCMese??-xz^ῖnlxK^dQ]_+g~ww|EHKӝCֿfV<7SM$yI,z'?_/恪_qAJ|+SɦɭQdZAAM& O:E ]Zw"~9oUq ηyƗl"U7=7ƛ J,_'?_ϊ~._MӾx$ 池꺄["}/'+'f)|@gy[]S\/?W?}3i^+McY?ۗR$qlxVlKoGKO?MJV_//~!bxU>iGN͓?n?gc{MԼ+OxoO-'Gl|Dfϓz#_Mx[' ƞ[ȧ/!DU!г~?iɱ!d&yo%mz-M}A-dۛWٟ> DבOG U1goucq_E4`'bWt̾ϔo,u-Inu+=+kߪ?Was1^h ĖwylPImþMxD//~Co2c~/ k023VO6;Oyj~+,=:*uHոa>LiZnt1YͧiZ[vKowַ?xz$zKz2"}<;&w"|!O ? 5_ ogѮe1]Jߗ20(|_խ?^}7MO >{i+eu#yIO?eY?nx_J!OoT'ĐD j-߼:?|)Vw6Tזog+?WSGmk6dފGei?l.|J\okTItj\yN|; &s|q|;k/uu7'ۋG|+i_?.t+i'Lj<ڑkEɡ^v"bݾ(xn,YbH'ox.^nl`ҵ;=yҼH}bMoþ uc/Aq GMӾF_aܑ>f׆~!V tI#X? #??4>#{uk%} R|7$xoVZjoHA6oOy5暷ďZ>8F˲lmtss9?\xSJdlꮦu>ȷ3^[Gh ]w${MqkZ6Ϟmìh5)e-gyEt]]8>3ŵ.GԬ4nkMr]K;=C[>[&?Кo;{0xCsx]vY&Ǔ^7ϊ?>@7g]J/.[/y(|ͤ+Xi\x?:M6g"y?"^Y i"[ sMY'CW|T>Ԧ{ݒi]}}qo<0̏#qx-s/Y{=6 o}UCOg7k'zċ8RU50oy >g|3iKxWRB Kk>|ug\O=nK8IZx?A"#ɽW߈[v|.ۧoJzC4#&Ǩ7yMc C@ԥ.I}Nt#^$O.'yvy?Dn?x_[M}y6I4}O[u+Xo#J5JEah?oi>+x◈_Kk$ zlOXK"TfOevq|(6lڅdqP'OnԬ᷇-JoiֿbMo yXAwEkbsJ򡈍^g|3u].ox{~״Mak=Զ_hM{gEW~'k5+{-.M6ϓx>t}v=WXǑٮBgJ7񆛧K ?=G5G_ďx >%.?|oKtwRDi;&?xom\m= ۭcאqOog>+jW^ԴK]IG?ޕ'3}񷀮&K4>__J$>1_+7w33>O171>' WԼyax? gZ, GM[l}Նg񇁵++X>˿_~Wx[!O|C$ڝjQaz᥈>#M }O|OlK÷N7וxjW:oҸ٧Eהi$iOw߻6WMOu_M 7m7ݳ}{+-'+ӥ&rw6l6WrWy?7"y_cʜ>3W4*Q&Oʹcu6zgy7m欑Wa\6K ?>5?*w/Ym|+nIt{U*']fUƛ-+Ik?{<>S5kY,濼;yų|o}t)D}r^ͨx^kt?8?tOWhzDRK]loU宥cyVGu: g?VcR_i_hKk/R6kXSRf:?j.oxOM׼chq^j-ϝ?rږ}g^? <64]jlwzFg&R?Uemv^,plO;[tznJL6kyڗ%>z0uۏɱxR}̫əUefIO:UcOh6Mg"y I]{h><ΫgVZʐ͸3vX8~[hBR|"Hwd 7z$2L}bw^n))/ݤB#>epqn]M'o֯C4;]Yaf펏V~ܩ!MgϾ%ԭ.?O(W|=lhzi=$|ߕ8k:.moVmO'&MY!}dJǿ";Mp/~_o_/V{uéjaaqͧ˳*t? UglgHr#|pGZ}i+=JdԬ/-l}wVk=QiYOid>#|!ȎR wrG3ɮT_}G6˳eYW;mDz/۝ZIx?'%ȾoL_U:i&?O*jSM$̔{Ig,>t(&ocW̙6FhZl^]&|rai1-w}b z鷛dgz^ 蚂hO.-;st%+Ej%ДH]+ecfeY+EoidM.yQ!U{6}]7WsmY~ג?OfxaaCHśD?O͗}oğұ5ƇX&ٷB?ɳÌ&پ( }cIt}z{=4([m|Cyg>x =~%?GݾXd"{#mO:Ko9pO~yQ\\&/2ZYn]?hg#$$ w$)-mMey6?6i:73ZrѶa(u }Rԭ>o7UV lO:O>G߯<xTUqg?|.s1yxddM'wC>OI-ۼJC4C'U7֒k}2mg7~ߊ_~"/~$ ~]r;M2X[YK?دZ2#9*aC:t/Z/g~pw u nU3{75$n?fgh?/C$c˭ofii>ré$߾ٷf֠imyg7ϲjyq<_*mk+m .?t&e!yn%eNb5Ų=̉巚'T8 ,Zkڔv_"&,P/Y&G|ĭ^i/{|+}YHd?&Tƙ^5<|mj.5{U4VHm]Vtˋ =A7:O!ד߳?ކ7 6n!{w^o YMMo*moZV;#򷕳"`zLz[4i)!FgcqO!z}5&O.-ܯ@O/EYNO}륧ᅭDu'o:oF\m\dGm rI[:C4BtH|~mu+io%.+-o<[vf*zkior =/j٤μwrTF?;OZo5WǞeՍ˟+{D7 ԦJnvد-w~D_gjnէɲYPp'W,m&ĹԼ/O]u%.<f}X{FzгB61vʞkk俏ha}ye|v6+gmgu37Vw:OC^u-Ȓ\.ʿ\Uݽ?ţ="MEG{'ҷt$?o;/ޏo&i?A3.JsVTO;g+}L/tjyyX){yku7=ꚴ)gObU[g&?6Vg7Fޛ><O֬_/lV<@lwhky{{P#I6lMc&-y<魡o/B~}ځT[r[y~,c)%:l$V^,aH_]$?u}!RumO7GMTUvUK|lL>yi#A_Wx.u [6>$[{>J]uAaM/:Ǖ$_ X 1iHtﴟ{g\>סԧѵ}mv/sI߱KlOO⼻V%HamA{j߸6%t_iz5پ3Ve-KP#>&ii _Y /9ZWW[cHV'c2MfiDD֔riOóU;ɾΏjд63voQ&\JKeEOV?96~?l^I7q׭>4~$\R6O-Hf?g*ڄؑtni7>%$;džO@<_Z_M}ȩk{7vdM[oNo7%ٵ[ ~n:_>>?^mt6dlz/4$Tj?^_kS?/ K+u BO:hg@ ɏl;7[Zy|}X暲?3ʓj@m/oҋy<1<+syo'ۑo \G፷[R;ou+odg.m᷹z4?$_o+i:*.k?^.SW6g^OmC#M6Vz43y 6_2/dj_"f&8YQ ~Mom?]]ym*WO7 7y}J:ځi:|6+yygC4u~ldSɹM}1_kmmgXj>!ᰶ>mS2 S5)Ikitwzf楠gn5aOlDtq<|76o[Si{em.h(mHa^-6)st{Sod|ךWڡPӼ1wK6>!i;K?K~_{5jl:MߓjVu7~ژƐ&soZy%[xa}t6:Gj.m9|N}zCVw/5/?{Z=cX"GJ$1}oߣځ3I>s.~ndM0yİ=>z/3Cۤ6<Wvp[>qfO>o3Vp[^B$w)uևw[\ٓT?EtA'So$m2>$MtCM]5^[?}V[ƒ4{)>eW?}}QuxPeKs\v>o [J]}˾u|۝?Sgi:\'/[?￿]^ :7-heh>.åxbKe[A^I$߯=6Xx{U4akwZtu̿E޹lMZ^7$ossq/o>?^5d߇{;>vfD^uښoXxd7im꿅O[OK ?xz?n4yR9^oaSg_K鶞αʖ=.G#׋C4xKAOVu׊&^[ǽ+eyFi7s%5.T>o5k//+ɮn{$3\6=GTU֗s}u/4_)<<2o?C˛tSc|_wO| |'gx[9/;_=$P{iK:>[!O%|fUJNlO}{O;K^Ň x%~7e'{.߳bњ{8M[JM ]C?}n79}bg̕m~i9K=ndž6M1tm?ܮ_5+=K1oV%yޟ}c*u9>Q<i!şox ?#W_l$#F+z[k~yq?3ϸ&9P ~!x>o$ 4MR/־|)>wW7co hlȺgl?5~k]GRnj֯<hqO?^9i~ CKSG>|Ț/l`x'7Z%ĈeFy+٢'ȟ7~?:C¿amBQ[vG4_g}q*nҬ4͕tylO}}b ՟J[twS}|.nSRZy]jI}s8kPϊ$o 6~ f-%̯D ?g C?xw bP\]X%2IO=+[cJ sDJ׿nw?ގ$\$Ig^)ᾍo^0]śZO^?txf+`ײַ,u(|g"G~"K]OH.e)^|?KY³hkojiz3P-ç^gmˆ>JGg߇_ |7=?VzRo"ӭVo. ǯJ: ?x?->kd6LC,C=Gz]Ǖ.m%~~mCg~6vzV//usץ?1ySLӼ7? _s}X(/+i_Z/ o:ŭ:mͷO76;ĺ_D;:Λg]|BoggHUa[}r?u7kPtoW^&| u8|5uu7o>m~ 2>ϟT>?p5~>>ǖen>|UX~[OVTq_jo.??'[mkXu?dPi[.??ҟ|)׭h~OĚxJ#Em'w ҧNTͽO-Ms>¾6wZ;˪JǏ|-mJmg~6/9:{4H6&| s<;LxU:>h0F]i,gOn"?{*oᗉ!xSS#g>s_I<7'ܮwe~ZT65 })4K_-6"~GWo.,>'R_ _ֺO=/AV~6eo ;?IlrXo>kSῌ>? xKZja5'{'}?7H3Ҽyh$;N_7?=|OfW`0Bjvy/<;›?دtߊZo|H4=7Xmg㥬?;_r<(wh6zkZ,&w?F>3| f&8ռO~5楶;tp~~~$O.NW<'5֩ggx5+Ŋ[Xuw>}J߳{iwno }6mRO"_c?ۯQP7>sJ^}-_Cw];7"vG}{T%aO)|{&i zo k..~"Oʊ[v.a#̈?{낸oCzy+CԴMRE͂;cuOu}$冚u^^mR=͚'* {^m&-{>٢߲L &<?OcyyoV"ԕflh{W[_>"l|mx{TͰ/^?ds+&JCtI5k{IgKDSǪZ[>@kg_:+x>!ỦbEy Y4Ҿ$x_O$ؼސ`_t?1͗MzΣMomG*ƍQ@lcWN`ͤOX?Oe爴AƟ5YdOmmh}t_x]W__I/$_gR/)Z_Rp{GٲT֡ᏇVvu/|9'Q,$lq׉Hn4^ͪOb'}x/XZ:od܊?D+Qf~>ê/mRڷyr~T+?vh[6O[Y5 [>'ܬ?kvmƫ@얲a7&|gYb9w:İ< :qGў1O!xP?OX/< Ə 3#חEk|mFaF_xYx ŪBs]O&׼ x4*JF~a?.CGgh? {a-촫kyҝ/Z|mGAߍoG}ӥ&3x %]u\gEoxJ>\yQj}oyysAi>0; 7]WnxoOhwמ-3jQKfa?T}v#SԼ x3^ ')5-6l#Mtu*s#yZm?}6_|QOjr '/%w%KMxVs? a?xJɦczW7~iE< ׵?ugy^%P=_|*gd'|Uxz?yέ/5$Ԭ6ZgoW~$񵟇|a`|HOgkkG{_izď|HO #+jxgW= I^zĴ㍷e~{ ^a[h7.͕wÛ|VK,>qM7=‰o?wΈ'YZ4xOTO|Ay]C![!?W,|yx~rLSiwMm6xhm3/D:ƭc0Ҵ/>}?Tխ`}NNZo#K+W=r{+x'zďsŞtqk/ږdcɳ ~>m+{V{w|y3:+柎o~ M {oa|=Z;ayo4_ԶWhOu5d/5{6.GR\]V*Kn'oo]fO~~//*-'G]|]B6]I=^kik|?>⳹6%|2}f~X]tczWJLGWZ\xm/渷؍¾]-[ky_c]g7y7מvdԡ- A/ZE*'{ÿZ6c5M/J/A{ȿw۝yM{'zXԾ[b[[bGg,<;9~:.Dig-m~'r$_'ܯ'|={}nPmRj'{a䴽sA!ҞU̕oѺ\N<#~)~˿ <x~Z^}oywiAdGb#bx}MRx>-對tP4菾; Zx#\}Pok?p/d؏{} į XjVv5#uq^'wDٱpb Vs+H^E>=}N#χWmS0sɞ}|sP,bl,?/^hw_z~aXuWVjҭ4";_5x|=r>4sg4n>1ŇS"dZoIo 0~_>x&b>y $.Rk/7SCoo" 5 ˚_ 0|㏆<nž4l/#T?{W?l|E&7=ͻjWxO@!-?^,"K+$bDߓ_:BϊaXx1Zmo:行4i|^ͣ[Y쿼jdqygk40o>AUnWndY1j._h4M'V%Iy5Gi|eBg}}ԎDutk.n:d["K/ ߗ,n7o*f{2}ZD\VnOC$[]ZW#wG1yeAȍ{c֖qMwi_ٿ޼\wB?&oc'+]\[Ώk##qFRqkVIcޟ=Mo3&}v:=YO6?vM\:k!cYò6?obTM?d/ggX.R^5[C[8ʊ4;ϲ3^DVtymaymyY ת_|xu_i໤ָ^7#ԾW ơuEitυȟھTf?~~*_x[𾷥^Eoq:}O<1Ϭc'w~2W>{]'Pմ[%YRrŷJǟ,g\L7I BG G/Hq>tOWOkvUψl4{MezrW,`I.fkY~gxo?c6/Q>:iCo+;5_C%V6KM[YX^~o?v>ȃ''|BG'cޥ͡kO_B罯o.I/&eI5 gmy?uuw}DbH؇>]ȭJ<0To{t{l"oy'҈o%des֨ڶ6z:?m͟=ڔM4?-u}wC'O &ƮY,rL72^%eo/ep̞\?<{VkNmy'kE}٣mLY\4C'y~n|IumkmXn G!O}'u~RM`4wyqT7kkH<_iCnwkTٳj7g5i[n>*ky=;kf>v{yw0Gl$M4KqF7]OXwpku6}CW$fw >FK}a[>2HrRti&WFM{[dUܫ2jŸ4߼*ۋ94g|Cx1yWK?m}#+^h̛?o[1G".*QȀ,hatɗٙ,[g^hi@כ$X_rQ6CǞwqC 6oϹaHYr"=#KhZ4/6j|3'ϱV=WM#UUsyֵYz3Xi~;d/?}o%Om/ z9{FuI|gn";˯18v'sc(Kf7}>X{Fz,zpq0\RHf $ޑξݺA2M"&my'̩q:9z:Ck䥝~DgW!՞(eK?L}+<=A<ɶW_w+g2#IUh|!?Cg[y_Pvߓ*֥43[=>QUS??O=Nnڀ)_~Gl/JwTUm|*@yy_?ި^d_8o}ߍ~>2oV?ٰlՙ<˗ xc}$Huom\[iU55S}/U Cll7-|WI6~5EeȆw>]̑nYZRXNow}{j::ƪ[G%?h5ˡ4)3\٣mxYRDۿGlR}lŪzna' ^ԷruJT 776\\.Ͳ'(6?&khn&M'l{&DH"+to,mIqx7o-zntb|4wY?Uq9-[P1ɳ~>g}ocA|86vV1}SLm!om o>/KfgVfGi&[][Cs|Yi<2}VG-JGԮ,_*W}7oit. u/MTx-{ڦ#a#VDmmY>Uٿ}m[L0Iqs<~ʸ*6/k,~bu\IVմ}$OYGwWmnOQ(E*C ZY%Ǜ8zozP.o5 zu ?*@egmqx}{XoKu-oJHuI:YrƚW-*7+}=|{pssm=̐yV7<_㕥/7nJ}*8*} G-K~fyw^Svwj]]ΥjZoڥ[/|_;&ou?. .K=&M?ܮ,4\oa{_ȾO.t{@G^=ϊ %?/zn}K⥶xGiq}$K׼jgn|g6H^6`| CkSC&W^sR;PA"g/ߥ0CoK|g'.%u$?j'Mq ihvg6Xn>cT#ׁ ߇pN^W>m6mȏwu2񥵏4w|1 SXCۯ37G^iZ8 /;7`}I>?ﺾ>L/ڢOc^&5o okך"jdM x#AW3$]B5yߒdF{7DUηo5ŔRMߤm}owWtɦKz_R_=[& [oux6&guwR~!VPhӻb?c}rRxO`m=FHZ/ }u{FtOu_x{G׵."5KY?ןxkzuɞk rd%s#[Cy^x[K4;k }#oJ\-yP@?]^=3;k? C[%H-WMGﯠt½KGx{%;_lz-mƷno6&͕/3^;ɣo6(o͹饇 }gKMмa[mgo^rwVx_{ ~իj] te|U7hm<>\hiw\MwHˏ ##յmMמW7`yb"yy56e^d:i7|IMD7^r~V?oz nCaIylȿu%Qs]x/.-d#:s+6RBѷ)~&x'Qկ_vRCo?]>1KXoo ༛Qo&o+S:gom_߮:O-y lj}myIM𿇬eTwm ^K8|1yiZ gcquCo=rCOd|[k{Bo(O쿓'gI^ǥ?(gg?dwOΈn_[~ y,k>?'ϿOWZ ROy`3X|DM/.4n<7a>hc7*3D׮m-*:Śm(uIO׌^0_D<=a|ړ}p45Ԯ,~/_G^k ɭTlnH%GD+5<9h(ӎu*Y7HdnJ!,=,S[[~8+ɑUR9'x55:'!j4uGY lE}Jf+WT^dOiFn϶*io*&emM0;qyuymssټ]Kgg`}?b"|W=xRԮ?_.Ƽ5+xncO:e_lE}zmisoy?7Dh>.d!ҴJ?c4OO|W |QER>!s2Akg7:WIk]bmbDv6ls¾$T?5m*E|"%qN@⯌Z[CqkR[?~O⹽CƹxooXx I~"^j.no?|Ծ6"W7 CâyOk_#cq>㕯+ڞ}SRkm--=߲[C~_hWQ] ?/gI Vyg7}>o-xΡaCWwzڒ|&3~h;4z]̰[fwa^'Ꮙ>;6k\B|)=똷|eallQD }L}/OKm/JK5u %Mۏ z7![O6+xW|N=^u/ >j6ޟһ\5ľF{kȟcO{8VK;mO \Aּo!a}~x/Ėڃ_}{i uO&ߖ_?PPYs^[8_"1$o:#Ao Z>gRm*>u_I#R\mO~X=U6>x?+jSPGiZ$-s~Ͽ]џ;M7Xx߈ߵ/"k뚎'uS%¿5Z|y%7}ޏ?bWꟴƺoGԼO۬:N4-ZڿjAgn-.e뤺tQ%]6K.M]^ x74tg5BY]7Pyg;ںB&͉ӍbI_Dyt5k?D_&| kQsyyx/^}roo e[o߿;s|ˬim i+jIYRH]b{6'>x<~׬4r[wZKd~iޟetΝ* ~]x^CxoI^xgK_gc4>ɳ6WN?x?t{wrIn0ʐo$&&/k6{]5 lMA6:#*56/XW֫1'J-F+?w}}yp?3/_ #XYïk 7pX,et/߿%}g/Go;/n+7k /khuqMsmyzP"),]|!M4I)mj>q ^&|y7<ͷ[YQԿCm7^gwBiTFtZ$?$oS:ޓmjDVWoJ\}M~*WY<%5 ZN.a/jGnįe?]~<xW^^\}ISu_5ݺ"<5m;$l[o`cOgx??x{XͿm7Q 3kӾº> x'RƒEo+U.Rj|G㟆NSkAjVhelj&~K,"}%$ 6WĖ!g?د-[5^,c텙~թ]}s|zf?w,MĞki;7=ݬJ[Wj_Rp7ןg|:Yվ={xGҭq{+{5ʚ>})>S 7,%kiwOOܺt{"~~$NGԦsr6;~1y N?k7Ǟ|:ȊERqkdqS_U|3m⯆^6jุqZz{ᦱ?|ApyYnSiZxA_yCyu殗e>r/Vcž*[=lj4خ6766w&I~O)\ʜjZ⥶ei/3.W?Oh9`C{}SQmSojr7%Zv>7zt6 .~=K|F<1soz_Ke#|OQOG+t.i{om~C.%ׯ}A@|/xM[|"?Ǘk]3+·>&xh9¨cg|QqoGtz~g6~nu oZagum{XOl!9/G #=/M^ H$֮|d'?鳽uO_D?Жw=2Gtόl| {Růou+Ǟ[|_kٿKş|O?'\lX|CP:y~ʬ?>tO<;ٯ։+Imno} (vz_ōs^Kbs\ImsLq?ǟte~:q7<1o\oO}qtaJo׼7 X{*}ToҿNW/x3W4fRҵWOwޗ_WY4 n;Է#͞xHvsBCi DOCW]v_@ůL!O_L}'ԼI4I<_E]?Y{Y3'][ Uxz;m/®vΟyOůkx_hmXS!Gl'/n+z-~^P|C\|]<= 6p}*_%6ϳ0ts#De[ ǣFjOV}rXbtĺ? ?]R/|1HҡoFV__ZݜWN,#x^m'^??tY (N{m\>7^05?-o6?q}~xG|-&iGCNԮ4gVzt=UCH'<1O xX6w_em>+x˘g ZΉx WP{WUWܻ؈Y"x?/'> j.v~)}vW|+_!M>Gnחb~CYoSG>[mB_]}Ӻsfɝ+<+F mc·a.CA%GS>M+~.k~,R7Ɇ{*kmO}j|koIߴiV=<޽z΃.x 95/('?hMEpN_|^7υuO;Yn-a'+SX"&ޟw;WM4>jWtmY色?KT%q IԼ+tK`ۢ#)gueҩ.]Ms& _eH|}͛߳Ǻu5y#7۹yVuoVԭ'Ox"lo(BXu.t7~տWʖXk7u5޳o=ƞ4uyw=Mzh ҡXn5oR_o+m?*Hܯ1HoK/ _h|mX|7Y4/{SMooMtM`<7:obMiOI-FI + m7;6qG96~3u}0$\vy)7{+a|Z⯌}gx;MgTˑo4$k_7[yq5,?ٯ&d>ki\op \yן±}eWfG~֎ 톹ga_}T—m<\M>ɐ=˦.D6U=kUwVJ=2#K'U߉5+k=n*c[&?ו%l4{ %,SUo%O½f2C35EdO-2lOWⷌd//x[=_CuV׉,5 S:o;Q6ү RKTKY|"?Cu 0M67?5<`&ǚ5}JZRiDb>s~2"Ҵ`>*Ķ_}O>k?ܯg Jf51o,Kk,~az&=DoOw _nxoW$s= r|?^kushwSqI.ئ-OMo%M<7__K("PZttTܙ?J Kƚ:?Zt+N뭚SJlw'<~]GZCmmsh2 &# G \jWJ:Zc*_:JKǃ 첿7؎?ﺆoXigy$ o\?%xMԼkf9ȗM5y,<=| sgZYǒ5\ܞ$y.>4eXYؕ>tby?cIwKoeN=$^m}Yk8V|߻w'O}atsYVfO2'cʯK눎Dl4ȱ̞tok/[n,쿏z7]\2gu" |Kپ GӚoM+C}7,C$<&o-WikI7dSr#!xon?y͇}ݿ^{ ١my=o/VtZ8iIMmSGYKWKgkד<߼犯kQ+qs4}VR}7Fܿc7CG 7ʿ;+f)ê6(oDp̿nO; ߻w Gͨy7?Ͼ\j "do M!~m?TO2gܭ\wͺ앣Sdzzv#nW̟++!aoy%iGpG|~N);7I;5dzՏVFXs"C'yUǬ#ot/UˋO>E?_Gxۤxf-6U9ΖK~Gx֪꾷^[MC}=/nL 3G1_I.]#xvo x[O:4Glbfxߧ{*}J=_IC6\h-d_g7ڂIfCC{_3g$ûUVF}a|l ND=5;XD #{_|4߼WczoU]YfU̷~W=!׼ B]MyTo}`ǩ!Ŵ?5{3^xljR=qo"JoY\E5ٳȖr]l-bgW5ݟ:MV=Wjh|-淗cV-u2d$v^F{"}ߞencfe= S&_-R H7dns/WQ?uKԢYL76RcI$KiG̿?^]o#5>Ǔȫe_R,poݻwG"ӦO$\զ+T}ܻ ﴯBo_]R4{kWYj?0{F]lv?\Mg_T~?Ϸ|?oo+TOץ^:/ KGg~=8???|+mZ֟]Đ_3 7*B}gD@54l2Cu3i^޾UiѶxi&?崟]$vwRkK|W1nGTFwk#jׂGMI?woevW:C7u [ϻ?u7+ocfs'_֓]C!ty$@yslCq/_SZPhKh>/_$W4dSVЬMg'ͷ^/ DW=jZ6𾤒[w=?{7{宱#Է\?^?q6W%yڦm>$: Wۭ`t?߳9Y9I/,Ǽ_y2u{S7~%i0xJZ]bO&߮͵knGX<.6Xm!\? MԶ5ϳĐG67xŰ=#ėj'ٳasq7'ȏc/ πGVq2D;?e7V7k4YԦ5 Dd#UoĞ&'%&}F{8]tؐn?|%o^x3,_޼R a<4N9dv_? ƭ;cRշ"xQgf@l"O?O7z|q i~lj6i7ZYlSlaL^ͥuKg?i <\l_l庸H?~ |?۬uk ~*Xnv܉M!W5uOVi_iWߞ ow&|cڴ:m56xjT 9+]Bz}ڤ_]izF74=JӴ{C~|q]WuKu7yi[[<=u0^mpA'=7=X.l#[gX֩>!.,=*Nug2׮|CvTK'"egjʵ$V> yu׈F;ˋ|(x_'w~"g/;.sfAԴ]&k?xo[ҵ 1/pl~Xujilsy> D?]oȀlt{Mygj?Mo>w{;Jy$;eլ4R+sy :7mt[ԡ> -v2xPy/hO>*GXg7ﭤhi pmyՍfO"]lxGo~"\>\>xTW箏hby sƿu_dOˏjVַJ凕y\ <3IjGTZZO7CT&Qwk\@s;w|ony{! _ïVGZtwM\]6t5M7J/ȲKO+{YѮ|_Z>g'`t?>y櫪 yj[-:[S̓Y[gX7旧zğiү&?)In7iwͦyS>O~3F|g_ ï%冉]sU]?H^i:ɥk7i~hWgOoW׿_}SJW<1ɵT}G^Im?EΛh\]OOX81j_gW|L+VnxG&tlD?;lu sXJ\MyTDTptO&Ο_Mwy8<|믲oc[cVw0K-$*k k`'W<#qW]jva_7}zć> ֬+=6OPo{Śl: j{׏={%bh{|=s{I7q,'`?׺cg|Om!)4"YO:+3odyv4Ԯm,"ǦoY5ůo(]DŽ)ogRĚϥ.mܨ+:=O4|aj~9syp^OWg㯇3??ڇ,Z&,=oRXKm/\GΟo--ί5EzmSzݞywnSl=SEh? u_ c>/Br*xT'Οn0I{;]:lOu*Cv>ïkvzއKCSu[wg O篛AO|AcyxC.o7RO wOkwEˉwH6lOOJǞ$ҥ*ٵ,ܷtx^0dixR%汦k3t*ͫO}W--uj  } }+6嶷$^kGp}xUmssmkˋ){_bz|ym[\x[ .dt׳h>z=C26D6^FtMޡ[7UMbǒj}u t_]k)RXCpDfϓ}god{j JG4 x_ioGؽ?S|Y4>Ѿ[ɧI/t@*xOg$h 'U/M,/6;+?xMykv ףmn6=Y٬pc̭:6w=u܎J]/^7q5?"yoפ|1|?Znj<7y[\/_q)ף+ku5idx#'wFOmA4hw'}߫>߃sDRԭUmopiO WwH7avD}} ELD|cԬ^{GϽ>Oes'/4ԻKZm=`yf^uTPȳ$(מ//nW{K[u[!O!_c?{m{ xoO[t&?ۢIO?.zm]5^կ?ۙ;zSXkYoωzm:@)E7n>&xKZ5?|=?FF67uM7*g |W7.u/6ulE*~`o4 ;o^ yԵK˱^{u|B՜>-_>\AW/oڶK,<=O.Yyן6~9/x?\It})?5|g Zk]F񶏬[DhM<|GϳMJF~{Y#/,?n#ӝ>O^w6,|+_k~>귚<3\=\Γ~Zp׎*7}ؿO>JּK4O zYe|O鲰ď773g hj Դ-U흛A#7_+?2ֵ I Jj"}FkwSA97z5/x'GYlz}Id_ "Ѿ_/.B7ROPC|J;a=3E[;ºnOzk6gI-vM.>A/?߇~luefu+? kWNg%}.ɾ+~0(u_ {>K]ZS=>?ܮ3o^3x3S{POa2BrdOcVF\MIhN&;ʖIhDG}?r|1@؞!IO[My<{k{Z|%- MRo%=?+4?JA.YX-t?<>k+(T?G:ït?A?k\Y"ڴկg>74>⧍Uy#?4oM*RXGt ܮ?#O~$i6w-o i?z'q^?~c7%^YmluY:'J'ܭ+\2;;|U?ꗚo?:|zL2ܵ>K_-zRhk+Qӯ>OqM_XߊΛ|+f{'|x"5%i:U|<0ctMcǺ_c%Ѧt.u]AcϨ?z'ٿ\xF-_G^./!G/?黻+پUJxP{'K{=a͟y520ں>xU}? uԩC3g▋סGK+}?HtٿLOg'f%ï~--C^›?pb& ?0.<%Slֶ}x'O}u7q4U/}GoɆmeNOMCn>Mî$]g)?.mz6/'|=k?z?~fo\ߊ|E{$ ‰؅ޙ e7אQꏬ&G?ġ\k]<7pKd}:>WD3x?b?#C}oTk%uI?_g ׼]KitsKEw?::B"%lxஉ<7\iZ;H"ԟ]Bﺊu'Lg|32|νi)O>ˏٟGl,1?G"WExuu j'fEkzNXX6:lIM{AḟR?H-miV~Oߝs?D} ߃6M7>x|Ki~uI;wte+߼+h=[ηOu?dOnV0;=oU.tOD5斐J#;ҵ(iuxz X,M "B}ϴ[~V}O>!~ź׉ wln<7W 6cV׼C hw΍7.S|fĉyo#Taӿ;A7{k7w/Oh;q.ktM?@t.W8|dNT&fU,E7W'uߋ^,hb[76~o!͉4$yu+GM^}tJړ>s9'+mUլ ?^g#?|Z.zߊ|CmQbطҧy%ݯ'߾/п߯_xW=G/< ;5(/)S}KyA𮏣ɥ:Ku oO2:~O+|'}C/u/I;uK6h\ӻZ|?TJ|x6w>}cJ첤w_$󧐟o&g7sa45&[}◅ixot; J 6J`}|'ù}(渃r>3>[mw]R\{Vl?1Ox?[U}JoTԾΟnK6+#NK7OnOreL=OC&<_mɊ ]? 'ox7B4[YyG"W_j=\M +V^M|B5>#ڝ?-|]L7m6'6V-}|4TM}ܮ3!G8n_q+cK%fO ZtfKjYt=Sƚ=$_\D\Z>} }C3G럇NJ?={X=$L?x Nj5[=* ?Gc}sVu/֚ǃO jZ'xnu:E<tT dt_V&FvMot?+_O~lxd,ےG]úW/-uԴۻ˙?Mu+>z֟}>CJ.ucje{gqs!SO՟^|mIgyj;$4=x|ܯ z w?ldY|7*m:Gh$'}.>=û={>8{mWOi*k7p~ ?Զ9oh=/lgy;?wuq_GO7>*h> l'⯆,K4-ў_mk۽"g_?߅~CPZ^m[z֣OH2?n_> 5 xKX ɬ\OwK7ߝw~exƥx>$1˾XaO"kO%tZd?i5gΘ2?xե7g?5t.$6޹;_\|"T.!O1,Vd2m)YNtsŭ/EnMUCGquy}|Yk.7.^(aMHVa8nnbjtr#J;MW$go}y]fm6~4{OV7l3[>w7u!ȋ1rkk6y^Ὴ]{*>Ǯ_coo u﷿ǽ<;g?$]iZjykWw3yx<3[Mbx6=2yϸ)S- }6U}֬E*ڌ"x/uWZαUe>Orֵ>R,PO6Xf}>tz=r#φ[MOC&""s+o4Km&l2?bwT~#]RRcV4K} +Zס,4}.Um]?U 5t\+CmoG | X yWMmT^_xʧ5}tTޒG/llZMjVv鯨?ٱS92*SSnjo4X?Q6:lB<1gz5-bʗN#J=Q?dc6/3w?z>kۥuh-o>M_'nY湏>ִ1cohx~=Jgbx#M;=گu+wO|&xi2\jYcڻL[Y>w ̸wws>FGjPh-PvIi:}՞v6_g'E.K>m+-M,-IdPټrGf^&dGGF%Y}J7 hi%hk"穚̎s-cvo׌#/a.UgǴӆ#g-]ۙzď5֓jƿ?ȗ[Hfiv"ٲF,6zl^!fg~?ȟ{Wᾉk?a7. 渺ћg+/a40ȉ)#U>f}Nh?*{]aɶ߳ˋgTԤndOYT8Gr?v\;f{RݗoC]sPM.}?NϿ ogcq-0? \w oiqY[M'ܩǮ|QMGKo i^:4$._V/5WjG#XӚMV`t0~vh9&~wȫ&m5ZY.O_y׶I/TKmcn4Jͷ$X'|k?ܮd1퍷>bC}ͻ~AȏB@vyG.i>gxct}W'{+c_~x_6+cMҵYY^Z~oCM>#uotsTwm7Wf^o1}|2}+]A]4)WOgϼ+[KN5ͭ٤n٥خ#X,O>!i~3q^xPԴ6 > $W=Of_ko~ >.so}S췥xĚoX:jsGuek?&HOq+;VGKkn)]>_VkwElڙWس8@PwXD|xė_7nwu_W>- OdUۨZsOP7MAlgxG7{o~5|= O/*Ox5/%~)`>:\ԆO7T5^8g{9$/Q*®[v}?=6=_h]_Tbh>cmuq4~gnF?=6..mҬ$} =sڧ4am[O}\-h了_M\~K1= {wJͿJ}s,v7*:by<=?w#%zKZkO?[IZ[{xtҲmZdۯC_<u|PW= "4CqgmmY7sşu]{ZƱa$yroeDZ/zr$GwNP,`F̕Or=R 4n$Uhjy3G?eVvSާ3H*j=[?fh&fF:5E=6cy [ki.f\|鲴7/-+cQf.mK{/+*Uo@G3Ư#O1|_ܨw0vjvsMR3~ﺥ-}WE} ;l]:c}`s@ot)껤)C4g/ wf^o4@pT_{ۧ;jю7yV՗6y2}ϗ ;u&>ΟUɮ&M߳vԍQC%մ/5ll^x&;wMU5I<;"mK?o2\[MMA$}csI|͟]ii[h(P}+KmSȼsgԐ7&o$֬|Y}[kȖdr^"Wo zKySM4#M}Y=͍:αBbԼTd&+cS\MK[=eO;gx>\|gh5+y%-O3ÿd{7x>?A7_S~,55y,H,{o۽q u~!W4_yfM:y?;6km;_iOx~N򿷵)g7Se!zΣc'ڮCqa=w&iȈc#ZF?mwth>'Tե|nGox3-%VjN_quwϱ+'FP^qV7i'dG:-KuY<?6S!3?=p>0񖳨j!<7ċZM"6oO>JIu+zTl<7o})I| y'wҴdWwOogk\i:ny,g"Jo_鯣蚅v:ڮO4^\̛:麕cdE孻,oȌ}:]͟ʌS/HD)invomWM?{摪i͕4ޟޛgfg^~vn䬹-͏Z=k;gDw[>_[Zs{OӟMRP'P#/OZ1\^[ 6G'??]^_[khmʗq>y_:u#@t_C\k3U7X]%t:kn}_/*Qu; O뇋ҁ>M?߮3ɯ< XCg?O+˸xXCJ0qƒA>Sk>,BiMay ;^m#CTOkvg6Ur_?mWKԵY>n=$؟%{|g\&VqE[Asf͏˯Zh gMԔ=O:֧HtmvykCk<:5q,?cw~*-J2yq53M'%kȌ$xWrh%C\O}:"}N>#jK }/牡V3I`qs4yx;;]=.ood}VIk8wJ/;O[_[֮!]b?&J2OԿ> H&Gyey_h>,~>!?A4G?{;|S>cwϊ&MI <?gcZ-|gmkH?Dm^mi\h6vΞk͎-KW6krA ftw{x: ? 6gx[ޏm[;da&GB_Z?&WZOg/;SgA 뚯 >ĎIwsƇUyJōEqx1s ߃jl_}nKYemb g*}wRߪ,|H񆚞 aOIׯs+> |7 WמDWZ] wcʟǿ?Z}}a.l-BXlNy.f?Ͻҹ]C淥åMy7_mk{OE iV|^!Պñ$krwM}Hבx&^o=yssq][~eD:O>Tׯ,4_Q͠WltWI'HQ6V2vpZgCTO|w U;KeΏMC&{_G*u%L9V>uOX[MXl_hxI}}iwsrDo_~$-^K`mý?#?}O7>0׵{3dw6'߇p|Cq<6o{Ol4}5$5T?wzۯxZԼakmT/ssٳ:5 VM|7}}/wM|xG6œYO+һ#gXܧč{ƞ*K_웤ӗJw9\樒^jZo>J͵'?Wmxnmͪbn%=}+J敪~.rfƞ"4sxܽα*u 9C gd߆:pw}k[;rr>on/ ^ ,Yܿ%}hz٬u+OmXl}\x<1g{7O&~(/Z*ܻ^ c|aV''ʖW_2{tO':xEȏ<32x@N-ވf$BVn o+7O|U#ǎu.}vvˉ^կdot =XK{J{mgڑ'?^ ς~hf"W?>/,$%{ o{Ě0ē"<)| ƱxN--etW2gt?>0M|;ŭk^崶pl{+[w|Sg?"x[z =~~ Եo;\7fgN_{bW[m j5qu/^"}7}|%ACaO ⿊+oğ?vkk2L?Od~/cE˘o,}A% s{ϲQ4V>'>-ߠo>O(FOO x3X<'JYT{;R>tM_ZÛ {I=φx/|`ėQs+e؛6&ϟfsI|1[x5+mKkhD޻*~3~>O4-?w)h(w]j^ =Wޏ xEnk] u~96uwHO_?|dmg4*:W.>mOk\בĿz:ˋ +W[SI/r?<;xRԮ5z_NH s/zߍsx=^UżVR&}[OWxO:| KOh:}Z,Dq5>Og_y~#Jfi6wisk按s6<7?Ɵ{:ďOktB~zb%B,鶷Ag-m7 6WП,|Qmk?ٴW qqD~{vX;It|{DŽfQ hۨZ':}v11Ca9c5T4kÛKaԼ?<͒+f:\%n6rΗ7߃gD-y'>_mMR +r-=M>x}7&Ͽ^ ¾3ٻGu?lv_3x#?Q|PRi{זsjOM cOWm1mu[o~65+?쿷ԯ_V?&*:$?.!Q轏{[74Ň-/^I":x߿=ϹW(cm[6SP?oMi?e{sί]o[ Yk\"M;+7ķeg_hϨ#-Is碞3&xi@VI>>K-=復$7Z{yoztןh~8|QaI+W[ ?~Oj^|QtOA\_k=)<Y}32/_|[?7_>I}J$y$Qis^~~ vGfj~SgHw=/?hxOAl&^/-~H&Ho7οr?+oα|BN"𕮕=Oq5OMx= O6vt(`ٱ-Xo~:sis9>.?Sjw{?$SY}O\E|B?hM*mC/xC,?.N?pu_W5[$ӭmnm{(-Q'O|~~2|/c^wWG2xf:Dx'^ Wǟ=Ly3>k"}'wۤȟ'2UKt,t_\7(.?5-?V ۭ!Ҋu9>??WW|%#⧃}oO2Z}uKMC oh>vA?'u~a!\H߃͑i[j?kMۣt◈<40O=Z}!tL{Xv _ O[6O'|q>Mi<97UaX:O-؟߯c~ u |W݇ړE%ӿ|7%|&ψn|ufȕm-]7ƟC~ai~*|BTexg^MF M}+*'ZMKB췷BX-?_7kymm-y~y,Yv}b/)/ ݺ?bx7ʏi#c7(~(i-A<}=eKk>M+ͥoR- ^mzQTiw}~>[|BYhvKG?$n!g_|&XO7_b{H<9zO͛~{'+`ta獾3~ɾ|s5}{M@n˧|#ͽ&؟G}sKρo_Ao<ͿjBeT~Ggl<%GwmpWO=D}^Ptvq[iĖ%߱G&Gx¾-5״"(,ҧo;#WО_&o'tj8)%w؟:}$v luc-xQ?؟Wɟ]KEԵ{Xw ΍yew>u |g)~!k?[&tkOlG|h:=.M &yk}o7LBX#Pg?x_0j%ׅiQowM|y iUy}Oִݎb[; C~H<w y|%p [|J֬?|?h,Uԣy6Wv?NZR:<ڭΥQ|7bm?+?!|;ho.txaK_7kwW{>{++XSGg$m5]K6g~ej* ڶmmoԢt2tjWK?_}y߿t ?|GtA<7xjHWσD>O=|o|my6z'}}*r|#=~6Ҽ$צmn{tě#hr~"ԭDH$f~׼I =/~Eͩ$6[g+5+[?z]V|~[=_'G>꧌$ϗ-fpKvvz뛎Riyy Lٳϟet2k_}Uӣ{?VKukooAq ͬsͳ{/ jM Ļ_ɾ_ggG\3_˦٦P gjo io-aVTm})b1{#!״sgsa&#oi+xwG֚hR;-௭4دUT&kOq}&_[C'OҽPiρ~(M<1xۨ>ܻ_S0~kk^4[?z+yIveső$}HS̿-~x㇇t}K mKͩ2hאۿpz?t|8¾3?е-[?'WaS3L~8ԯ4¶z5}mmSϙO7~,Mi>xc'.-nd7::WB~~$. 5aFM[Q}6Wf5 ^<1}=e.?ޏM~z1UsDޝ9SOOx7*m> K ;뺧_n/\ݶP{Uxֿd|dִo𿇼Q/ ȎP>Hom"|߯ϩ[YЏGu [>#k ?yZ|h _ih6 W>5D1tOo7<]//|1ImJ|%٦yx? {db7ڦO%~t~џ1q%|7&:e7\G^Tnj>ajQIS7ėRoJyb6imݎRj,!myqn<v{Y?ѓɛD5UBI |K{⍟-ĐiWO˼}ſ u{XDEh:&?+^աr[I<T~3'ZU4kʊ]ZV.w6lK WSIZJCyX|ȷ7U?&I_!c-ϋZýK!ԾxV>{Ԯ5>9.&KawAU3:Xw,#Qn$6l&? . f^x3V{<^?oY//_?^Q%M jbe>;y(?J ڑȏB|ai7V7'ߒO[fm^x;6%%xK{|w Aƻ^K'i=r#/ xAֵOì.mk>^Wui^^$3D.y-cCga??خJ;mvu5_yiZW&յ)|ۼ+|77yΖO+W[ks&sdMu:Kkfo}ɿw<3IMoZ/˽n~ ҥNRҿޯ|A|[7KWԵ-nM}fvThf73x{DcmW?6*¡WדwVMK+R^Mx$[&=?؟W֞ 4':oc= v}f+\MB-$%H'c⻘aH[I'~~5~3Ju=9|B=Ğ$͸y _*|1I7xu y7\~犼 sVxlMg]:/"Zۢ?gGmk?oO_m FMdcz?uP,?uBxOx\{n6hgey=ԖfKɦvJOw׋?P.l,ƩmaXd,5 { X\iW?l})Gb-;;oeOumЄK~? 5)K̻?fR_/b;x x%">u 4~՟߁|&(n||YHnںl~Oqh}nNVWPU,lᶎZ/L|e4N '~\|6 RӵϹGWw=_i4{]BտmY_~ɾ =(+d<庁]S_]'<@cHcQY^yKtw s6 g-7KK4۟ǃO՚ϹO>61d[j$Uo47t_&]kMԭ-ӣ#YP= }?x~CoO~~K_-Έf ށN?fr>Z?}$u>To{YO_4֝>6rɒ{'SO$~<.~~,F÷&nڿ.|QK-c D*OW7v}zމ^'ڢU˿;ﴮ^<=_[_H:|?:<- Ox'-؟܅>OW=^i]\ejQ$r\'7RL7RU}l>\Mom4oG+ʞGAcWW7 àd}w֩['Gz_V:X)rL$զBt7jʟ(P>kjk:b[9efWz~X|aTՓvz|Wa5MU56EmozcC?}.RN#OS^?$Y,-uk]KC"{fOҽ;_}Sİͯx476~MZy{3M7?7V0Mg \}o>Zvr_mg\rr|Yã{smxi%+̚g]#DPbtpéyl?~}t2]k~WɾK˳{+mLL 7߯K<=k[IC/lrWvz̿iv푷> njvOUP0gYnsWsH#P([oki :ɺKyKk=J嵿%?yZdM';@K"7;vl7՟.fdwyH̿~_P̜(5pj[gzϭk}fk}? m:f=oU}H7lgo ->]ZEvrMAgt-I6Pƾc?M 3y3$~w-@fO-<:$RGپExo~fK{;7Hg G* _.oJyؒM\zSu2}cgj7[M|˗̍Zki&Kq4ޙaz-C7?ZV7[s'+ حyɥ1I-M{6ޗ1?Cw;^K9?G11yD>7jwoOng?}C4~OirϹ +46$3\}-Z괟]"iFsh*Vߥƕmx, "߳R& [ؕmfo}{Codt:Džt? C}ږ'r'|%_u֫YUK^I7*Ee#+5)aI sjVTFwaixLOk{U1}>dϟb;cQmoӖϿ Wx;[[.2^Ny&?țx5 zVKZqwΟߕOGb}^-?ºONpooNW1> kk{PԴ{ /ٿPmk˫BηK%Vl_\ׯX]^}-Wg{GD\?h:%7W mY̏㼚kǞ-{{}Ksċ}WMѠtVrܟgy㰶qfkc'lk o#룱{ϳ Y!Ÿ:l7\־א̟uߟΏgfoҒK|˧3P4v[=状ʚuk=:DԤCM&MX$?5ǞPGm|oas6Ǖ`<^bolEsml>4c]dlz /M5a{lb?e}x/ /}Uyq/q.?VkM|OM&]%nus~JOxo'`J}n?|W?|&Ii9少woGwkk6opGΑTmJ[=>u坄y7~Ğ3SDӮn<.8c{W=Cum6qfTJ#sf}VvϿCԯ5}'X_x>DOWB}]i2<1H|'KZߌ5O {X" /4ג{`??X_>+ͩG&YA/"l:>!xPu?jw6?.aNtsZ宮]do-_SB< nO/ee,_ ?1?flsnxR,cX>_/<7yZ,_K/m?aKi츚K7ed͞"4_5nl%g |V3ŇA._ZM뼛/Zy%aj/TjMC_=CĞ-[سE+r?^W}K^hlwWwWOyR5%|Eh~(ZRީuR=/Q$>*dJe<}՞65m{P֭^{' d kjZZ;Y^w c_ |YkxP?>MAr_%Ji?Ptt+W#}xkM CGOԝ}^?35鵍+UO _iӕ?~&iRiz$^!4-,ۗc׼IxV|?X6ἤҢpoW\ռ'^Ms6W> =yo5[|3nj4_\Y=y)גF~|o΋$cM?焱as?`KzM[\y <+`h?to[͠(ZPh艿? 75MoaO` ~(xKA\V?~k?'>*x_WHR~s(+?EsE;kTd}ϟ irEsoGas#mFzKGcƗkm?>ytA[m/̏Vwsolޑ[Y~DJ?Ͻ?ث:O xWơN%^Wos xa<-#^j%MXf u?]7ؑ'>O\AxGƭľ?4C]vܦ)🋵]qo>?;^}:tꅏ+xGs4-חZ~2qhBo2|a σz߈uG`L·9./7sȖ9v/ۥOjPhFTEu^<<#yk:?,lʊk_z'+Ix]?UrW#|#Ꮘ7a/^AYʓ >}Ȏ{þ$&tKŷj/>.?>O+;>?̓[x{,~"}+J:曩xK4ԬZ]~mҽTĉ]oX?z5 yq3ocr GgYc?_~w{}6 ,|}ʭ~0Y66_|#. (~,?q~+Ho4=cӾk%yD3~(/}?M?V^ket? oͳĨ>Wȳo @0^cEWKgC4wȈм+?E>%{{[M[[HwLsÿ:4旭3Ğ*m6'T{TxgjϿgWW mլ0:\ZOLGr|]H&zuiyx_7+м/S~ƉTwx{DCT?gi^3=wN{XxQ)ؓoV>}=z?_^|~񟍵ɴx{߄ƚCksۧ١KXgnA;>ݵj qe-RAuoPżHvWwR3kV~$YC!<WS\y?#CkgW|p|MKG<=-?]w >M1>_<;o,};xMcX\σ;H~dH~$#@o~0qxcLkWB,>wltO+?iφDžmmM+Ue{M<h."௕,~0~YmnE??$)"DޏoMW?|s[V惣4|oI.H7M~)d}?h ~$j[ Iu(,VY'» ?N$4=CGL'Ñ{CX𿄼Y|>-F;uO|L[?PWG+yiS[ve|Zt_ |?x>O>$^47SQheyDVOZKԼ+y-Yl!.7}VʜCW^?r7|<ԯ{Ꭱx;9VV rlYOy;3ׄ|yPtwXկtĉ'ޏBum{Da {[Rc%k:onoo}??x^|[Jfe8_;{u'g-]dwWIyLvt*9]5x{QKwƖDOfK<-/ğU )t?j-HdޗoϹ~6.~'jk⏆]Eu{;}?|?|H|3m{zW"loc$jKD:7:^';čR|Xfn,Q?N̏ǯ4xgo~$~$,u~?6#%}|;iZ|=c> ?_Wr};oW_CKѵ͓vi,΅+Cr<x:loMմgxM3; {7ල'?qrtxv'}gȉ'7HTcxQKp]i߿W|}_:=/thђѵY]'_<75K'}BmfzF6o AƱioگ-_3O$yyNy>%#m#骗~R?ύ> ŏ~$xC'>'hYj0iOH_j#7u-qOURUgGM]vw]PȟV*s&G1@M>*>V;}_oޟW !ԭm_)!QtJ/&J^>[˨UI?ؚm ҾF&*/|%"7Dc/)qO:^g].mIkw_`?hO'egu'OV~ |7w}O$gE>xQ?W˺W:<JumJm]fGs~N49#i?ujox'z>gץ f>&Ch:W?x׀vKuk:KyH|o񟏾]ƃxZAn"~ʯk3_K>/]K8|a"rmot{ş3m6''~"zL4Ч"DcތIc);u5c~ͬj |x O̊hs9emàKa\t}rʗKI;0}j}{G+쟀877v-:6?^EuWZ灼;? j\iP;˥Ksj4N4WGjwt_zij9]{[?*?H7[OOx<剡|rgm-|:;6D𕧉Oq.)cx<Ο?77 haԼ{6P +SeO>zNk7TgЋO4+ 9o?O/sۧܵٳ}:~ ~û6_Gg_97xvyΟsNvz^~M>/C[s%{??msC G<>鮒ow]7>J䂳>DjzZ|"KyRK7u_H~:.Y\˦/gt'M;?Q?"N!ټ.uu*Aϲg׫3/a7^:ez^+kxO?½B&C[4;gz>W爾c4-IK|Au/qxma_$پ^(1YO6T/&O[4|-s~l>Y~Ə-Ůi3Q\>D)~6v~%UޱvMW$~.Ծ|pVvyH~7z>#_>xGt[Kkwm&댟? l!՞^ҴB-~"R|6| ɿ^' Jn)^X$W7tKt_R7Djږ"\ٹ-}ObΉyrڃE|uc |T߆7=.'#$?|n}~XԷ4I| !.^FiEouX-g_]K 5_xj QGJUlM?n/4 iE/} {Oyƽ?eyt>okǯokO֓oW}RJח冑|WZ#ʗ)7%|e_i||[;^{t߽&agT/Qx3K'xxĚj6ڮkiQ_~/&'w?'c^ |7~;xm'+?^\Z]Yewg~.g^c=u Q|1v ub~ɺ !u4{tMuj>ڥt߱rA`=V8<5hUdO8<5q>!|k˭JԾx{E,Ou|?vTx:%¾Tak  q&۟0u? N|O,zMՍœt}z/ 37GXQx~{},Ty+&2xC.D~~-_4M7π|OWMoo)7n/Z_M3SN-ծs/wwޕht](C֡?:yRDӮO+~xƟGŸ {? 'EqismeO{xyVE'?5ċ[X[V feyˣeL+?'x{vZhU?b_,pU?c A>TJӬ!(S~ϟt~_ |RFkq?UWO;On{֮/u7CCԯu<||=u{x˳мMS[c}Vѭaoo;+<Uj0Ə{2A=-^cyu2 ;}& 7ΛѤ]Gg4OS.HΪy6TƸHYb4?M2Ѯ>앋&f?߮=>|7zn~6McɪZ\'5Kao`EPHl&';?]B/seĚ?ک[i_$y<1c}.?5O _+[>=>MH|p,<T:V[%WogVvft<PxER~s4_ϳ,=7Ҿ&';Z3Oev6?+f5_YY>y׭[úU埈ڗiv"_uN i|_g'Wbi%߱wlMHlJ"7f3MB㧲[Y\ojkm>2d[?,4yyJ)>$|l&>9[(cs}ě~A#O/J41[w~4{bͳdcJȍxo>ž<+m}Cj^O?^[}mWM!^kʖKF?RZJ}+ElOz{{_%7 _PKxwIcXȿ ('=c2~%oqWCå4.#P꽩%ǘuʿou&j1ܚawEJ 'Mo]xfpo7[jSA3="0M?"liGog|a-Wŗifeht'}㕛K |Ti=KJ;mMcO'QƗ6~VV5ͿQMMoO}zұҮ- C2Z? ?R4{M3XOp[?eDŽx≴UOFkΛfT~gܫ?~8_!֕x{^<CVUg7P3㣧x⧉-+OZ=I|/xFM*["]#9߮U' 5<[6Oj ?x{XGEIo7IOxe*j,w/ټMcD<gזzK]y;w~._#v>|IiVoI,'#SaN鞮I'?_o/m4[O׫_߇.n|aVKj^_'.'Yg߯|s4:m; ]/o_IwJiQ|/*.i6 c:LL7W ."o,]P5#yԍHȹi zAy\7kirGIcA<%Cu<5o P[Mt7>{?Jǿ[ItGZr l7s}}]ڃ/_4McM\J'e '^u*rӄ>W_5͞7_xM]Fk]C_Zý}C ~Ex:M?uhu^JO Y *]WO~Y L=~8|Rx^_v<7i?Eyot߿p.ǟg} ,K7|o+(~ޗZ<% [ [z/-kt_x:|:݆l:]$(t_?e?W_f 9ѵmWOgs=u ?;^/3S>?mb{볢>z l>Ӣo->ʼoy~&*{ῆ:ޕơ/Z~~g%,4/=a ~^0+ 4.$ m 7ږ[åiZ?ttr|+-,>*kO.|PAI-2&Ҿu?|:rxc.'yvD"Ho}&DL*~{T՝Ok/޵gKvKUχ>7>}Tm.{2wO'z}?ܯxsx'^MuIO}խj_|A@}֋'k_uy>L;Srby_fa2PFig4~9?֧r+C?hU߳g($ٲ/?G-?o9PY>uZkT w>ޑ:i3@M'<'WKi-fKMy'*l]<ϟVy}og =أU}f3JSwր _}I7Z9 |Um.P;[zPy%R3byG2;'kR]}pOQy%/7%R-#陿O.v[[O1he}O~t_!㳆ϱ^i6|4ͿdSeҼHOoq.cA.y.o2%͝.Xusw6YǺH ۈQ;k;,_-kz4ѮiI*-=~jBmx\}Uz>ϠgghmӓdஷRtUK zKn4ܒYc^MjIr\9?m G=y|?4 ~Șm4[FI&Wnlwfԯ>IFƱmXF7ڍœdi3Y[K$\\~6ذzu|i[+$.^Kk},ikOѷ<oj"O ɠ귗[/䷋ȖڸYtjP\Bٟ*5qmjRIsxlgPQkċWzUex-V^vꬼkm7QӮf!O.n>ړys)~l/I%VUwLŽ. ߾-^MR6!~i~S[;;V|/tz6뗚T~R/Γ\Y\&Х6zmb?@i:޽̖YI/CRm%QߢCEK3OK,ڬ:~&. jڶqM$}m0'wZ52ֆK,nt 66{~kwkhgmmImoiSȶ;7^tYȶ;kw~ .R>4Exÿ4.$ ѿ'ODI`iV/5.#y/5YG.uXSVݿ5k7Dc{hy/rTmun"uO6:'Y'a4ڗc&E7鲵|QZMjڇk3J=}!~!?D:Oggۧۛc~ռQ-7Jbr{I#ςӾvVAjyH?ZP&Jf>N؉|Wj{oCyGyՏxQ"xo1fܯ .i}UmdZZj^$D_hkJt#S/3+CkkԴ,RMq$~O7 zpkwz¿e~,4t7XҷH/m;[}VĚVy^=1?Rќij|ګzոL7.g:-%y듓I hƛy'?mN]:I_["B|;rKޫῇ:4} M6ϹϿZ}lDxͶg| ҬVK}G5-po/-|W1k\"<:jV6o-18l^O߼TVYkm>iU_g^'%}iPj K %盱? ௉$ 귗 :͖Ọ-/jocơ>*qoXZM4ߧ?u4>t߼I dou72Oa֑z6w0yпXg 3mR8y6u.MDܵH(\Jooo<XKRn?xSey*Jj|=c%̒F,a'%}_ sx~->okpK|y{GO n-dWP?=v (xO4 g"y_ltO~`z*j7xdsɾ_p^3f𻾏kڵ_<*~g#I@n- n#yg<;^wöɩkچ "پS# φ=Nj~!xPZxiz=i_kZmB${aKU~u]@C莉^+<#uMhYo/N|W=+|Ti^ŵkuk7O{?خ~Di7ug|g&{`V;Xw+W_ l$a7nj_Z>qbh\г*^~Zσm4 ,t;x-~OT?'uEΕaX\hz{[y'kM?.cm K.p&O4?oG/x_[s-q^דgI Jt>/hWs*f[i^U6DDX~!|]Eω,xVӭgTM|M/xBJ$g޾։nEOZ4ueyaó=Q|F.Լ[[j?-ӿ4H6Db^co|VM- < 梬]ϞsMዋKn8unoxVGawt^g| ~R}B{Ikku"O7+V'Y&?k̿a{ny?쯧>t*X$xO[7F>YuAbZ?+wGDwlswZ<=<+mVs/G/XR7C^5_yjE4g*9^#E|exoxbG+TdԢ/5?[Gg<=mbMlO>wؐ:L >1't=\>UIzlkMnᜟ |O}Ū^xs˗ghGrh{Ï&gKƳ?čKAݭt]b}s䮆gXY|=񦷬ikKx)i>I+ΟHτm`?\%Ƥ5-c#'?tcXG|=qi a%Ao-o%*0{CK]/|HO}Q׬+XQ?Aq-KO<;W=K ;ywHGO+ֵo %u>!' f]kynGm>;g_zGn/>ߣj <h?s^]O+}wl{E.\4E|Bw:TLJ ,|kw}|+X3◍ hK ˄eޖmg_ oǟhO .v$>wގ%gb|z׿hҾxgR7VL!gٲ+h 5j^~!x]3 ^oY]/]Hv^<1}Ek{?;nxRgy?dNji oFU/쯾ɱ>6tDOz>%|F>]$xM:>duI4Cn>+{Y^4n[G 7o/4ǟcΉwOD+?i? TC+k?4+XLƱ"Zۤ;r<>o_ҽ{> @_¿wZ[C]FKJXm~7>+eo[o>*xznjVqXjo/oK}?ܯmSාtck_~& ;M#>'_$|!;N$o^!Ͳ~jR‰O%?o-ut>0XpA6}"lwO+g<*{sξ)xw>vxz KYc7cec_xJ^7جԬbSͽOE?Oq|:<[iV(6Kיm5{G}ܯ?c_5j' ٶ>()fEսW'GXo+׾!Ë{^YT%Ho+u>x(m[6vOW?[ᾒ0>$ԼCo~{%Ιm|W mv>djliwEww}2f'ucEzZi ;a7פxߌ]'P|g:ZO}y ٳd?"MٳbRú$)){7BL}Gw?ۯ{_F< 꺯=UGd)??ٳ^\܆'>+//t}zX߇%%D?Wïuۿ,M.'{DBM7mι⯍:| a7ڤZ~~߯"|=|kZLjuOzǛ-֗?m_>|AO ُKR%b%=fϟ?G c?4/ž-xʵ}>9l>|Vx⾡y,mٿOm???o|d׾#xO m/ųIkxtwKTDXomrmy%M"8ďX} -=$gC_D^m>tqs¾3o ֗q; j/}~/ÿ7^|Xm [8._JW;ܯ~k?IxKX=ԚK.loe_x~l Xh:ވ|o w/_"{ut?qiV2Kq@e]/O?K+iQs  RTxxXWٿgo+[ˤ.WdV^wwٿTmsRҵƥ*{z]/ǥ\kybTuҟwz'|]~SDCxu--lM?G~k|BNw;we߽?绢loQ7nS?鷋5ƋMTo$>-WOS}t̊*ם4{;kϿ^wֽjח7oy ݮ]>JH/,-^Gq>hZcy{\M6 s%{{ucN_Il:}̋߸gWxV~-Wb~fx5XO;е]BVmBM>} GMnCt{{]jLaaIs#eȎ&]o^46)!c_:rվ0x\xW^GVxlMks+}}&JeO/+ ?K?2EžGr?>H>$XljZ?Kk*G:;:){*o=sME{ԣoپ🎦ּ[Xx{ 5]wF쫣Z*}b"#ɯ<7ψ_dխ'_JK%__]SXO"XKuI{t6y/͕#_i#/I?RO j{^xaGGwzĒxrQ3_WPIq6;ﯬ|aI|T?>KjַrdWV:͏g_#}-JJ?o%7lV4Ƒgx"5+d댵h6>GmX_"H{Oyrl+u}|7&g{c/i4/ϟu5Iy.tk4ɾOo.kG |8G>"iCTHObn>~ºύ>|a}|Z_"yz$__?|=🈵+ό%s]躒O:\rdDm?/o ?tK3ƉqySMk߲ugF[ʼI|]G~׏ ^fҼ?R/XHEQ?rW~0ox3OsIƚ5-q?ۯ>&xyX}gO:pp=h> Ko ><߰.ٿ}?\g+hwמi|7R_i67vWxC&,1l %oޛ>t>J# ??-UE\^ʾO##"ٱ?>鰾) FRK.l-Rdy?دĝkAY[ VG>}:AOHN_Sqss=ڬ-񤶻O6TTS@^GGk0|I?qMpa'ii,%kZWl/RXce<"VM*W> 淕.7^%׋Xzz=ė7;/:̙K 270Xy.XzEyhֶ3lMaOD5okn? !KJ/{H.UC?k.x{W>-QT[+;VŔo <wM=O#u,gO=4>_|g=bM5_ȏkjWR2[G cM>-Ҥ 以(&yn:xOk/xu1oC+/jVSU_ZOLhdQM~|@~4QHҼK}ٲ GOW/[xKf}?W Ax>{tObJy׳'klנԴ7gR/-?|n!-}?zl-cφKɪvP=X-7lO'» (|Cw7c Q>w9*.M\}ՏخIJ߾_ZgGP^ao?-~77^Yw[.]?몝xTε_ jP_n 7ٽ?ﺹxfIu|Oo.n7?PϾw,zqyyq"]?+ƥԯJ$.? ΉV+\ZgBܭxIئk4ݺ_#Xr:\$263kȉq?0WU焼=qkh3+O}zч8 Ӊc\ }SIȒ#?)爼D=<1V6ssM&>q-{Fbi6ͮ'f??9T&o;=2=5oUE,[hH_mSGpɿDϤ}Rjd_3 Qַ6J/!VbO bj72AuZ?$z&wG`o4ZsjW\zͶ ϹXɤC_%{&1}O%~H?•ǿͫ12 GC퉿u@j\n׷6oY#w_Oo5Mm::E?dO9}כyjȋo c7ߠR{ԭmot2]şKIXh V {t؎WiImnge鼽y)-.n&kȟ?PxöJwsƿl_[?ߛcV<$-5y .'G oFuz;h|<Ȋ~ݫr#b96 wU?w d?5ayaoG7,Z":ֺX_ɳ3سFO=HOc_d'ij?ؠU;C7%Jmg'ٿr|C⧊4k~>uRO.'otOxNygky] [xGPէdžs]<:GSd:GA_fKt7[h:m4K2ˈ7>_KNdeh!kc?a=oCh:oo_}KKJ× .6#>,c_,D_-RyCuq3Ÿ"=p-=m?hƏ]}./QW98~X!l3ֿ_;cq~!xXwx>GRt}_y]:\f?Q{kdjƾc'ocg":o؏C]DXyֱٽѿzm?.9f}idm (mW(f5i&7ج\57ɹԮ,.mbOs4{QdGԮ-K祫oZvzh/'.n?RdW5LХ6_ďknw jk##RkϖhRO[jz<>Jy<ޱS-HM;Jw{͕CZKo^~$[v+Qב$w[-MkxoD𮱭k^kt͞s}|-oZxk~^ HyoTmw> U-ºḹE,2s3k~5TŞȟV<+~'Ɲ>kCTc-?}l>O&<]*_ )s_>"k0'M/. w^rf|&6I/Vnm]6}GNl]O+Ŧn|#K_Ŀ{]~[ly_wn R5*rɜ>"?uWDگ>{,l>ȳ?y0Cqu3RԼ[Guk7ھOxmyc|"l4g+lòi >]_sJյOOHlyܯTadmk)Y"W if>j=yy|3qI>yW᳅ル4Wz=CǗ&_pmV}<ֹ)C*|:?SjvDӱ:]Ɨ yΒ=MY˱}2K{;&ۗ'5c#J%|ttwVFy$OO?wyޏ0{xѴxzdrn [*SZIހ ?MywZ0L+].8~7]~jcG8SW>|4JXԭ᰷[~^ksy5}Յv*Pk˗PO<~G7hZVUo_eCvo7[ﱬkb6E}Ss}mꚮo \\[i>ڍaz#$Cˋg_dzֹ`߾|ɒ*r]a&k #J?M$^dX>sgȆͶ l}zBLBF c{Qx[.g5꼋__ Oym2]>M7atytߴ&Ď_JqqxJkir-%/g@5|w呿y>ҳ㵹igMHZ\&նҴ6:|[?ۯE,/k[楝ĨO6|Ob."e2wTqe'zZ߹ fsc[yM>IjO|ǭ\qsoV&?u|=Cuu m AC"EVޟ~?fi<ХCgHoUԝMb/m5.Wo/ӵSssf |P=\ym2CorwmLeMKR{͗o)Yo&3O3G.͟[G_Eϸ(.<ƅ4ˍW]e,StVqse|S[]gMe2\O} MR(vyw[,_SkKiOdG7 Y_mt^Myy^]lO?LXjh~H HNᶴ0+~7o;kU?t/Y]>ُ r;/$u̞? pԾa47+=rJl,!]7ڶ4?A"8ˍ&eeΛ٥^U4*'5ffO_P^Ү.fdK޷-曤!ׯ5> <6o)H^Eux_c~ٟd͏&R0>h>(cMz/Ψ_ W0=ضs: fOS!?v|xQ:⏃>G}g1[4v :󫯊$wHo强}+˭\mmaqaFuT.jkafV&%m6 ynȣW"J/<:?ٿp1Y٣}6#uCXi^WZGoE𝿂AͣX4IyLi+koMś^.ikv޻Mk^^$fW̱ſ&V=7_4O,~|' x ܦ,VWW&?g"W]Jݗvzs #cG?'lo~.{$?su<2ZU?|76sWKm,c ?Jdgm]KPu) le=Gu {O7 }~ z^L66v~pbO K K&x6vn򿾕"9i3ShƤK_L~t]'%LJo&=fd>V-FMþ!i-=b"Yޏ׈5CKԝX ń^MFF .Ko6*/|I}xN[n|_lM5s+=z>m?D'.M6Y7oeuڗoo.lx2~dqG<_mx;{f/m{^o 6l|<7yk^!ǃ¾/.(5 JmCN/-Jfϒkȏφ+׬6?Ү,m^}O#f~Y&~'sxz-XH? |"BYcZʟiG%}x¿ u_>sxTDWlDt }~|~"q_ɩyOg} mC v]n94߷KlwnH:Z[jk6ZKr/.Ʊލ&2gШD9 ]B^ X7P6 ސ^ebO7L=f}}{f x_cPoY[[?zV5OI|^R[ o+|C͹6ڢ8S\7~'|1靈cG>=zf~ɾ֡Ҽyᯉ>O6 "w|r^ +/ MԣRYS.^=?Iu+yf7>M_Z׀uOzޱmC3s_S?<;(5KI$l&ϒNt#ϟfĞ?em5񝞱tnJV72L'}]6GGƷ5k4/}At/m.&>O\4q&W/"uxoR]熴xϫM禛+:M~&/~,d/|r񟁞=:((.*'#+|M ]I$}x<_ٽ.Ϋ2Qk[Чmc<+ki}_*Zlz~"xž8xD񥿆%fDڭ<.1?M{Fg oU [n6jP[E- ?'ɿK_}E.|Y}[yQZa l(/h=i0|?yjWVvw[%OدE>&hƏpz5qkKapܣ0F>._:&ߊ-!|yf">M?fVM<جo>S5MoU}[ԶTSlo}b^y=n_xnn%K{ i#O%b|gᯱ,g}?Nt87{ =ι %'/x []nZ:C"=].vXu+=7zEǑ{7qg>3~ ??4mRYOW6#{C xGkWZ-5;&mG>J'̾1[=/~ηZ[KSr' 'o[?mn'%l5K?7POQKi^9&t_UO]Zɩ_iQ?ߴEj#^3/>KAZ|%?jMn`7.wgS #|DzSIKX o7xþgz#K6/l?x_znj%{_ym_ﵚk>/>o OP /\ZI C-}v=G||ISz?ok<R'7;?0|K][ޫ߭ڑ*x>]S^ĿkcJgymhyϱ_?m>'MZ!aklnpOӝc~^#rj־["^|Z͛gO=ȏ{xb? |Klԭ&&7;}t+~7>|MgǞ)5ˉgӢ6e ?ܯE' =%q{mamѮ&xa {]$>G\M_VdZyucg y{MV4wy_~^2K׆4xu_B/:cOO%^gɿ~φ~4?tj'-~ogS=Q~>'|L|=K>4>/-lt<8oO=|/^ڇ%4yld:Cp{'?ۮu q9xoj$ z^Yl_uY Tߍ7Y3Gk;弩ҹ cM_ QxT:L~ڜ/,};$/%߉5ص z o-tџii!7M׾(|DOޒ\zU̯Q6V <O \?G|OᏰmKwǚ"GG4]Fggk.g[?DtDD^f?ÿ+\ћK85wӾü_o:4C3x~ үzq'N<|拨BNHugo|N?+ k_84O# lD|:?Ώ}4^J|IoY=\?[_-kߋ~*j_ >'G WKoYǬm^ɱ]J_D}ë|TŸ\N5_ V#_Wzɯx?i綿ȓ}7׫5__W¯$(𽶩uKX]]iW'C}zGlK%מ5;U;oa_X$m!+ ٞ?ԯ|1O=]%Ŭh]6+~7|W[x{-6 ^4l,nk~|W~zf߻?e Rı\Gn9bc)x!wh?ٳ֏ƈ}U%-A>\MDOėHvj*%}&<|E8:}/^wl/,/5_f|ua{ꉥkzmƕ~֬u?]|qoY[h'ij\Tn|AX[YoE?ݓM-=fƟgsy cy'[}oohtMA,Z[^o:|?z13fV䝳k\pa3TMr'%42|{T⳼/ ?闛{Q!gzG Y/yz,f-4W T>4Sʭ_H'Pnkm'o7{ȭyxԡ|+id??嫪:nEL~΅fjOog$k?+uZwgɲQJoM,ݎ|i4rՍysbX?S_]<%*xĞ|_E.]Y@CpܸGI_+K6 VJ˗OLg^&]׀_<7]E,y?}0rS-x6ox {j+4q'E}!Do●;m71xomWO߲] _Mo  ůwu[jv=|JVxo?t?Y7MRriR9bX8x{A5OiW}Sڬ=䗟ncޭDEWd:SWԴ}X hr^GOڝ^ȳAG,,~=,e}9a{zO^u㟉 򮡒[kwfcgGկM:k4"uKM͟'^ְ xſ,_?ȝ59ϟAgͩjmW\}ci[sm mzotR>+_noBմ}oG>h6vey'HI+ڣ}+__<7muM^\?wϱҵ#K[OQa_irwiL%dz~5^k'}/tW&xk-^'Qq?u˿E'ٷ[x} ج ɳ#߃ei? î|>g8u U_{Kټc䯗dcXφmb)tROy(lGz|+(hj !+񖔾3~!|7k;+=R __4Irͯ5&w"\㺁'/>'x3tyk,]ōϣ tcL?c-u]XԴnU.$Imj?is d+sx#Z/ۧ[4t'ϒφ^!o–oKq⋧ak?3et}q v<2|فIdWQ㹛Cž/D>|*m|o8yyMm&;4J=I9kO_eB\ɝ/&HܬvVl]t랎Hd6IkҎgw�V|'d~Mgj4k7t?S˴/z95Z -IGl~_ yy+J;7ncZlWL*5ZHm?l0̑, =n9|H,)"C"6Y~sSdMh 8l57?=>&Iw?5Q?G'C2Rh_I;յԦhb3luxFT!jZQ'<i4[{_1?絅K׆^tzM=ipyO5m? ֵ 4Ե; VQ'?W,V_޼o>OW2p`|mc^ikmsg$i\~MdOWCuuCXjV˽w IL5/vzk%wٿ雦?=ej ρKM4I&uQg=H01KV.]Эz|:?+|BQt]S-2qrG=jS_l~5 ز'6?ۮfo4}ңRR%\GA<\_r o!~yOmr_kplQ]I!tG}tGX6s[_rFy__ k/_t:W|(k YzNhof+O*{7Lyys<[d&ҾnH^ ?W׬5+|񞁫 Rՠ,>眈5+|/׮Ex>TOc[S&ylj/}ʲ|?Huɶtnַ̿ٿz?hW'Gznɣ"37-G%9_/#w+UǑ0s[ "MM4[s{t0\i*?\|7g?n ?Y't/5,[ܟeldjYꚮ4ϡjf5M=WG[b׮Z/5;˙$Lh\shfMBgmtʖp3/ΒyeAg*??K [XxVgut4=.:Z_W|s~ësC^ӧHn.|/Xkvc{*}zM/J¿?g/xn:<:QJ5myagzyso뗋f։ѡo-K.$ogשx¾ mBRgIoJ _wT𮯫xcĚ&hk}kV?ɿUI34- y[a]$L/5Y<;/Ms\h%kI'zW_#:>ky'Hf}[{_3cvo{֙/_p?{zFٚ[co7s2@3O%ƥ?W} LdOPbO|?~k&CͲfi^3y~y6+ړ+UƾH@*"\?aҡO]J ֒fQ~͕rfh|}? |1Gd5_k_MyYz?j4>^}[a]K_Ԧ_w?V ڵ<72#. C?};ʷ~9WKy6KltKo˾${3o iCky{ w_C{MR״y͗O ?5}o-41ꚤco@ {M 薗oml帅vпyC:z-,R ;$OzoPɤæΚ [;4omkV&i"~Qz+> mWAU>[~X_%y;jjV;߹g@SCĚ+?U}b"߬-z^}m+Gͧʸ;.+ey_9+š&G?>& g &Mb6UcOi">?xMKRnK}Կ>zg<7$zږya?{dzlW/e|Y;?%4ʉ,Zm'uk̛?\5/yqͨ2@MD+u+[rKɧKo+W~+oç6s.f?EwatɟT] H_i##|:M[kkyw%exms~CsqHeGoa^|*',5_n(Ԗ6}ǫ_>hү1ٷd)<oe@xdž-IV4?^ Yi1go<[#*P?A43Kfoɲo?f1~nc']`{]wi%f^$_W¿eɆI?}=tl5RKk;.Nf&[{KO7iStʟgxG[ү;oŨKnvt5[xbO4rɒk%&Ꝝ.v%%QY<3\J/,5,CSҾм77RK?T3D+͛ujYɳ}ʫ=I!,5:[`'@s?c-|Ʒmo4KcWon3 h;ԗM%eĝƖvq!a}RKy!gbIcM"=z-sch±e,绢~H_CO?G4^Dhvc_An&Ү?tm ^xt>-e'+U'~6ė13<鲧?Ǯ>s[C~6o, kfuszo/᥽q gѥ;ǞxeH~M7zHhtn%ծ"t G|Bؓ^z=ƛq%xΓG^j[E,LG6Ͽ˟XvGD𕎹q+CǬJzo*_ ]jņ2 lict~7JMil/%}=K/x^j7 {}W["RCbk%񞋪jV6,"o4 Gl-vu4jĭ7m7'<վd[Zs+IjVla>f[STu_]èi[f*o| |3g[XXuɵ"T;DIay~ r+>9ŏiYƟO[?xGԮW^O2gZ+_V%<73=k=6[-.ԧg">6Ҽ7y$TZOu2&}s7?xX =V}q) /O>3OywڥsqJڗOX${ȳ?۬X Ow ->P_E{ߵ?L#m^ԴO^,SB{X'd/yk-i>(:mi6&!tۆMUCJ?iIek[_.{*o6`jyaNjyWyxW<=sUKﯡw^ůo}[[{y>ttOC>(Ե/+{huG5?{č;I7/b+xY{FeȌSxoC4e7Q+'tx|7lwn ȩ^{|Jh{{g7$+ 2׍clңV_w,5˨\k=a6W={?ܭƛ69y^o?ZUx?ϊI?wl֏jZnWm,7OG$gQy*JY>gɳ{S5]=UFyRʐEmׅx䗗ms[RIﲹ]sņfz<1m>>;_7v'}KMPO^\oe;ɦΉk+E  *Knq}NJ+|.]7I'se|^ZލysmxoP&>Cŗgv*Nq6K^s x?@:^gri-<'AO v6]Z6dm,od"W.|i? m'o<ԼJIss܅Gÿ߅M5-sFm_P" >'W)ᯌZn +XKgp,2߁gx]+iԔ9:\UρIs‹k{{ƵmR?ף&ϝ}}φt BO\l}GgcOijGٳO:?4K"04^7^X_`{Z |[%kFo~M'^aϓ|'^ k·*Ŀ\/>'u7G <퉱~9>z0{ J)n4`y{MEC o | ýl&{H^ٽ-f\gdO6?N?+|?/3zVΫawO?uEe?g}?؛h?? \ XGsidKw~9^ƃsO>$ԵkJ{?\}OďsVeΥTEsCo4/IO|bu~T/Sk(~ñ-w}LjcNԼaGfi}g }6Nsr(5~ ^xJ_R񞫧m4t{8\_ x|5{{z{^ZϨ\y{b׃1Z xeUH<'+ٗď|1o_h4i#c?e}-xOďWC^FqS|E#3f|H/^I|Q񦵩i🃼Ru-oϓWx+.~ 5RKX5+#~m&ϒgR5 =;wO|.mǚxnxe}ٟGzwy*i^ 漸KYu[ew4/ W=+UφZ'_K|,(݇XeZ+Gz'ϱ+⏉XH[{ݿ(A> [Hf/m/m}a6?u5RX<h }}8n?ޱKxg^ '4|au&˫] '=sx_J[x ~xm{9n"gZOӬxJ|s|X?M>}i$sqg?_/Jx?Z_m|[][os55wɧJ!釓:X~2j^~4GR46bl؉Lwտ7>$xĚ'GASRKK^}^Y^W军_Wktl֗?dO'Ο﯄yKgި7ڤ?:WfS'~^gkc a[{MSϞ+h[|=Y'|~o6gmonm]6>gg??&izU-<=~w?i4YcE?t_bbGwIح?dA?^xUZPiWܺ}'u$x?x{O{kuuyk;½wᮉV#tyܻ];6W1'>,|7>.yf<+Wu=EH{C^}.xOCOo6_(w6w6}_ueMj^=^xR%_`xmttlZyG[Roާ׫)؊~4+YZ0}%"u󤉕Sզ®t62G'"5_f6ڙ>N_תGX_+WG^IkJ$(g\5{@ּpZmnuR;5 &Kh>Bfḛ{~@hi&HS)7ݏi&y?իo ay,?b ո;[Mg-#=mtVִ]KBotK|oz#ekr\KuHy_y9?{OV>]~r{SdXMӮl.&`X[˖o]փ˛?F$?ڍ}_iM$CFD_ֵ-*kǥ\CG$?y4GxR|e$GUR-6P ?_i:֣g^ǥxV}Iaã??\߁lJ4-{NMv|WNzWp=j'^ hbY m)?g­C7"-kTnrGĚ?2u[9qkfDkZ~7|{Zni%:ٵF, rW"b}-?xIA/gG:Pj?odM?l|A㥛O7T7i//{tbsX+}Mg?x2%dɵI'M6M\iė|=gy?fIy]h?xu*{ICXf_ 񵭶sr^/ȟ ^x?<'s? {Z4bu:^0֠дMWĒxc.j%EɟzoKEuJ.?#լ#JYS!xl,5kk=bT X6;+}]:L^('C>>x O_RM?9a+ j} 幗_Ex׎t{m7>RyvG+kt2?ƕ]Rͺ5*_\ǁ|I\x&o ïI}a\?@9 ٯ}-/WµSD,^$"?}z~#4s{z!-?ѓW˱7?jg6ot/sa!x'm#rdOok 6ai{HR>ENzV׏5bm{M."k. L7lmڄ:R|4qq-COȕ%k=nm^º7O~ <57[oc}m ~M<>!߽Pl}"!*'uD+W^Wk:f c+}r?g&?no7u}+ɷz[yF'֬,K{N~q1OKc ,k+mCa?z ˘~g{>g.בM뛚OM3[&3mhJ<#zk4}->]v?۬FJHͷ3[:~^Iayϕ$eǛᾥ}K&bm7MW/"~'G},fņ'&O~4U$:ߊ7g$R"TtzoH?|ڽV|gټ+yh!)4`kkMG?xJVأɳym[q{#kI-jm6[7qi5圐۾aoTWaη[nh<|heב?r"UmJTҿ~it?UmSm4r$JP->jo2^gtީY^nۏ%\{xnli<>j@{"ȎlR?$IoQ2rMW]?0SB~yZXOoٟ_4Q $j4;$NM~+OhC??ޫr眕no~՘wVg ٭U*ɦqO{4|?9G?hsm7ϳɼgSZ#M'_\2]Bu2MVYkgZ{B9g&١tϙ-# -'+^$, ڑ]~ <|ז7[K=fKzW:Vi/ZMO?ƥhfԴ{Vq-[a롵{ ?6׉M߉5H.;k͟~nz|߮WT__iX񵞡yK__=c?۪q@"%|aaY}+5lH'w^'¯7H׼=<|9_k~d!tbon>x^0?ji.KD̩?|TҼ7#fgqyOW 9M5-Rxs\W3UR_⯂^ "_uWu 7o罼?b߀w?ikź域a/학?!t{W=_Qk!7fKu;'oo>+?r>#O?#僤W}]f{^^xXIhc/tޕ'|Dg/UŇu+6$QMjh| =ʺԭ亖?M>8u 1Ğ uiw_g]AwO_ ן.0ZgsƗ[l5HnhS{_/IxR.uR4S%?*::=}gq^=ğP.gett|/?|yx%[Cj>K/|孪+b;缙MZk|ĮVA Λx(uklިYO זrHuOhsAuTR|y."_7uNqHd)efj^:oWuOvmcXSx''o yd]<"8eL-Q.œz$i-PEPEPE(j3yWe6>O8fj6q'ݿ7P&;gtO.7fwGo)*jsEmhoUWcA [8m}[P L]i,+~ݶoƩfj(_[Žf$.SU=6L6tb_jWGm 7շ]?uB7Y>Cؼk9fcU%|m.1Hdm|} s4P%ܾ\TmJy'y#V&R +R?e6|rP}ͯῳdRF^"^4~ZWZ㼹8Ov1>c#H|ɢ?{7= =}]dli ;Z۾ԭ+koE/s=̖Y^\qnYgoGY *KWtV,"KJ 9Ԟ?}JXtiI$Q }}7VKMôlutO[ KAu5O=L?sǹ">c\驦/>xԿeDEƕn՝]G|1g{q/7oXyK Yۋ#؃<]Ht?.۬MnΟW7q]j=?^Ԯ 5]Vx[oi/yC/G./5 o4^b}+Dt?i3k&i'"{gyC}X/ga_hV_+>%RM ?j,_jvumSJtY'uYWcCouiGi:{o饾9z|9C'^j{ϳ_zIcm_:=f*w3_´Ay6iyxX6[D?H9-i5YҴ?IY7ڄϢkw3%yhU,=w>{z WEWm-kG$btgRe ?i9aݾh F@Ѽ+XGy<2K׵At{oekov˖zw</ _ºw+\ ~."ܧYBzLEKoerծo\³?KÝ^_vlyk_MSc^^iΏ{X T7Z{H">fhNigmM"}Z#ohvyuS 9{k_ícm΃'n['rdϞ;;?x7K[/ǧIcg?Dy,>艪ZnuU[T;}}I4Y-ߪԜÑe¿2C4_z:|{mGXno!؊k]=syI,+Tz2! ɦhm~ѽ>O3,o﭅~ Mio=oXS&/<7s}KٽV@T甋H?ꗡt?m'EOiuԵ/A-v5\*֛>y}" fTI5ɦ$ڒ=|]2åjWVgsx?{ͨ7ly[KU&7-IWo\C R}@>"_Ğ-?;+μ9}KC^ w_w5C^坶yzo/c)wO7o Nju 5͖Oa Btzizٮ綋Mg9[-ǃ<7:$ח[n̕p?h',X>moHr1IB2<>oyMA9xlˮL-޻fgn7'/ 7)*P^\_{k$i^s MkG"!ԣ~kvX~+[x _>n4mow[~ ǥ}ah_4MBtW+>J>+u{l6z<+ڻ"_3Y>, U9-[ۼn?g~)xXuΟM!lEqM_BxRuC!Λoyk+>]_߂gUH4um~kt7+o&g7[_^l|:WI*=7MƷj2]Eo޽}>Ib?ܣէּ7ߋI? o[yۧltO¿Azo9v.|u~i<=&d[CqZ.-[V}U,n|Wgd>}T;o_!|E&m7ַ^{ſ_O{GԬ/ l5֡K0 ^(_!f>v||WM7}V/x3G&/M/>͕|3׼%<^Gk žmٽ?uMSU:~m<{y_|>%{Vu 5o:Ǒu_J}὾㙵 x; R=5 _>|߮jShYyuoiMeپyMorr h6v? yZktjsGy&W+ŴJtJQvպ}io"IJIhS,mαyq \}|.M'Z-{;x?K{]:kY}+%uq'Ŝ:|٦ms];>5֛ 7R\/u)^%g͛ҾrmjM{[ws{C~R&Ԧ>oqjϲ$%y]/46ԞķHTZU?:M&(|C%T>ҞF?7rgW,&|!mcXm/>6oZǂ[|-'ď<>[ƻ /~6}Dz=ӷm{ķ6ƕK4^d>2&k yi=ˍBo{; =aKxFDE|Ih6OӢ:;_}7ܪqh}3kKsEOMO W$޼Zt;iM7ğ<^rh^jIE6+=OX:#OoO]G7eGjyo|?G{C|e{ W^!:Ec/՛<s]7=7+2Z/ ѡ7؟ɳ篒>@y)5嶫HIT)+oRxCߣx YDԑ㻢"'{O^9߂tO ^x45O]i1y(w+ž6|6:4xn~ ʷ֯y/R_WWIK NGudlO+oZ1ƙ nya/ٿ}_eo_gx۫_ș?4 6z=yYm';75RCJmK?ht~4Aao 'B-mMs co,WW]'f͟>*fman5 WT6Jߌ4i|1ew6=ۿ?H2tCgu Oʐ3ۿEe}Y|M?W<R5CGͬ| jxK$M54%:>txŞ/O"H-,wO%.ťxgZmm1]GkYy}7_.]xcOF|:={eռ7efO|?ױ>*YQUǟ|;0EM>ɧG6'׺Fx3:=oĚ_OO2GZD&Ko6w>(| Ҿ oǚ>FWϿ6#}2:o֗#cyC mltJ[;wO>(?at1E Duco wKtOz}VuN~"xWB|:ږ#ڡG|xo :6FFTzd<֞~"vyo-?_ź_*Bu{vz>+QEڑl" kp";%zXu_^x2z+gǾ^7ҧu Eckk?BE/q<={~οWt oM<%}J=]M1KK*ƿ5u|7<xm.-^ddl>~6oGþόNy^X\Ȓ&v?]v=R|sߏAuyg%Yqܮ?X>jR׼Ks~l{f`?˹xoI>,%ӣk4Z'ގZ3߾-x7[ִo "NDз柤.GM?߯mKG<%ởxO^QX[aSd>|Xψ~i Fmߧ4sEKUӺ#z8[~¿mB?- ,O؎?l|ii eZF˿Ktt+|Pm<=x Q+o.$W7~୽/> ؖz4?x{G݅˨5-CNhvty?GRZ¿<7jdZΛ~/]c{mQv1lcM6^9 ^k%g4IS?M%t M'EjQjW=M/zvׁ%wR|1ҭC =|eOs^ X׵m7^ |B-Ɵxr^M]iDm?riӕ??xu/u𯁵|yok -֏'ҧ؈>/+ZV?mRoucf7 |<}wsǚޱgx)/K_\:}o޾l;aV։y^ZEHsBh~9jg/k Ikj66WWqYĕy珃|=kž׾OXG?ۮ-`o,%W뒽/頽{Gk&hMm? K桭xDu:;yjJ^x]8z~>=__}⏈5%Ɠ_lɟ'_kޒ@|z|V|M;>k;otG6xqNyI$ޕ:sTۻooڿ{͕ggTt[l,m+Kzן:/=rνh/dsYMtlr O(jG޶浚9"̳SCڔ w\h7^7_^\{]U"~-iKi>~*Դ]X!}.T_kqks->_l3G/.m!Oxu5(GoȵSi|ikif=6WRp|zҼieRe_'}<@u/Ix4K95)4q:4.=oY̗y\/lbsjk{;qo-_ޏYV̐3k+[Z3Q^0J𾷭oŶsxty"+WIg;&u+9x'oΉiԗd>zT >5onƆ?OZo5+.O˵g_+&-g]>Юm|?}O \u5&a[{ ٿK0|.M+ڔw:aԬ+ɯ^c7s}\iz:gcLoylz̟~ݢة+f`Q?z4w>"Fmq?]N7K<._*/^~+xwGyዟVD+ϳfMcXIC%ΏeZ[OlYKMRﳾط?5͎%:?M#﨧F[]Au{^O%^`'{A5+ Cog;C2h!Mv=T}w"_<}$:G v/rTO}O7xKnKT[7bgGzl|igM[m ۳~?خ~nkyac~] n|'h,5 cR[+lo"8L 'm5+kQ>YVTx|jip^*͗ik$?'ZzNjPig%Z~ O+XYOMC,~C:9xU7uY麖%Iv߽6Wj*wЦyok /R{quǙ?㇉-#shwiV_=Մ+=mp[ϊ/6 =vtد|EC&Bh-w.;;LEgC7G5-wDWﴮg-z/"}jGu Bѯıh"C_~Ϳ tbMqK_iov)4>`_ڥזVwQK'?ePm(l4-Jm_̊iSᅳ筿|t|Mub%?J5x_I xZſn[7=m_*4~$x$h$ 'X*/]q=L^iasIxLu[/-R'f?>9~,{k7wK//aJ~_⾖V:Cۦ9Wwaݜ&EoWG9wkwU}{&MU}o^l![8ﭯ߽68i'ҵL-د|/: ]C.%z^]?g𿇼7j>?{mB^]Eoo[\=q<;p/'O>OζwW6s\nC4{?Wǚ~5/k`?k3jv~ ?&xĚ_v67̛7_Ow޹~[xĞoxgZwd4[?#:km웪ව$'umI]X N=|i; Ğ!ƞKi:ctwd&*b*=u?*4>9[h7Ix%ܿ[__P${=7J5)6y{Ի;a+7sM_ę5|i Z^ZM{w~O|I\&fȃP]7Ro6ז>% CH6M3q4_}swmu}ss 7C}m/F^${b+(gOߟfE;fV/4rFŽx[72iV0:w[eym2V=Ɵg+Y[Iasq>.*ϙ͚)tG֞4 XY1i>w bH)v}s3gjl~j 9ybyb9$dt֦~6<ݿ}V|Lȓ~Oj>{6Ά5W.f|iܬ7Vf?:3Mq=M5ϝ5jhcl{穡Vgt}>]s?CllO⭻XLmźVW$W-c-Oс=cM$-m9[=<ߴl:=?yY+#lD^]Y?{Fֽ}oggs?mJ+oKԼ= :T>!.ldZw_eq޾$2yl_;5j9!w-|6dy=TtC?PWLH{yk/O_/x>1x{Pf|D`iyƮo^KeͶw'rw^m6wFROS뫘f?͋MYB-xvۈꚧ kP%纵dd֥ܛZgiįzLJ-BYC 7G?͊i, wmv#Ԧ?".an/&߼O>>.>WhpoTGʷ}s3¿|CRsCja~N%m;/̞!_r||?:]PZӒч֯ jWjW1%_WPq~8Iz<*z$ 5jd4bݼY|JOIh :? Pm$s]XRNM\quvo+)?ss5nr"5>")N>it;1'nf;mm$?_%\ռ-Y鷷>/kqp[y_ޛs87QmD- ,{lԬ7JEJӣM6=bK5_3cy+? Z?<}[[x ~4~Hįew6vhmp=ú?^aǞ4JO{{$_nnX|?W Y>\눶Ə[?㕃B|ڭ$^w{_\۸I$O;̆kCM];|;?u4B-4qyl;y~NvLwH%DO.]ZCTx:DOWopYM_e?'G/D/?~=H_M4SaQP~$/?~Fv?svcTǾM 8n:'RPybUͅ7?ep;'$ȝ߭7O2{{dm>/OyY6\M3M tkj/VżVM9?P˥RM_v֎E*7͚+{Z]qzůyksf M2eRM]l |=iŅǕq(͸ͮkoͷC-[wI3q]/*?OƧmK\NpFO]t:~.['-/s?5E CW|jZXU+o6V>᷵[ϰhw>$5=Vl2xI׵={S~__yF}oxTWZp/s$h}4ki"CpÿIg>zҏIҷ{V;bgG0&h_CqM%i-}Mq&\Eԭn-iFekdr{I[&"jņ'؏]1Xy:U HSJKZ{ɓO[<ȼ7Q\xO\_Iq2K<<5G/x[TtWGQEai*}ﮉoϟ쩽ϿeבOdt>$E3~ou0ywvuk_ix¶7Լ*Ybo[6TTcd)"<ޫ :nxd ׉y[ [wC~2=ǕkQ?G Zx7'OꥷfJCa%<+?hX/zF6~*4۔]bMKJ~3ʡh7<7<:ŞՒ_.W&Ғ_wKn7q(qꏸ<:>rmMJIM[o hV ~Eȕ>Jtkzotm?WYȹԿ!\źyIMsqqU6DU"C:6oi}[IO.+pze> ėhH{ZGm᥇5 \^E筚?ě<<2sOu{++JfWw?ÿ xGt~*Ե vȱ=S'2tO(yXxR; ,oI?"O߯dPl헟&DŽ0siBR -Ο?9GқT{U}c^a;}6=-<eσ~&#o-n/KϞ$U7͕yۨcKCѴŠZ\r-޺C_f7Ý>o̐DWz]_DG-k5>MVO$>CR* Or?z-WM^-CPJ?׾~!~$xKҼC]|z/#'|ڇMGCmիyԉiմgԼI軚96S,t۟-VHnt_6ye?AjWxĞʸlO%盺oX:MMXޛnSèNܿeOt:=cþJھxTg۩ΛkG%6~$vH_^2е6Dm}Wa]HB'X_$;^W:ƷV;CO}kqqQ$h귗hb*Q3Vé\jֆ|ε|#oEwecgд߶\پǸRx]nxVK=nn?tWX]bU/O7~W{I">g<;5BIkzWzE'T{{\ݟ5+; ;쯴y3?q:=+é$TMt?_aŞWu'4d3Tw}) i~$ҼxVAGo~7O=[OҭZ,]"a"h~ԡKǿe-O<72"Fb?{6TDu[R6,vi 8k]sjfLJxIu .iKA]@;%sx^u(u ?gBΛO_ 7 0KXƕyoIioiz٦=b_;OsqLngO78|A{]d\>}*/ zY~y/E???"/-ν[k= XX`Xwg~x=4=bvؤݴ??0YX׼~,楿1wO_~lrYãΩy7qt|_ _ZzPԼC|T[6aw t{@9ψ$ ,H5KHȂuw>L˻]XOyΩ5 MͅD_T}>GBͦwM'M'_ȀO\x52Um/+c--<7jEV>t">Fcv.s\/u?z?%_]j=(t7Df6Hҗj<7ob>oj?t/4l<1[?k]H['0o|E& VR;T'9F]cK ,#ױTf#M`44kG<8>d{+eV!f.6$߼aԮmt;CG淓ΝMk^4ͳl4mwl{WMto p>mߓ4յBd_Uc%x$:jKrvoORMүH A𯇼kzV޺i:_go?ݓq;q44k]kzhO(Q?+Cp?nMӵW_~M y_ ]KƗ3X^eH%EV gyk&~{ uKOWI߅$dž^j^-kKY"oO;J|]wx[\֟Nj,o wm{P/|;k<+i~\KB-WrZ/y31#iZY?+4 WΥ9vEבw7{`zE߀=/kxƗkq'=<7߽~3F;K٫Mzmk8өK7ȓ'D>J|axGRW̒b鲻MǙ6|;\+ bI@WG |_DiC [kn 5C'x|/y[OyRC/&oU COLZڦu;%+9͆PGNt,mn?X>\C vE5ټ3ewm0imoJ~ʟg8h$MK/n>X|(fZxŲi:G&.a}jcצnmoE]^?[xz;_hĚ[SMΟJ8hI/ῆ>"_ 6vQaz~)[VZƃa+ w?$r)l l"w[mZ|!K_EmOuɵ5Wٲ).W"= wxϵ'7$JMgg[MKė[t?"E+|Isk[R&[7Ig}'g c⿄<'wZY߫#imߛϞ>*|Suyu[WakgJ}%O-<o䯖.5=KTҴK kVlűuSj>-ƈ$U_VWR7<RngßW!K_!ԍþ ex?WhyKo}x)$W0/ /xGčo%ūŽ< n}&$W߿fϓ+ 'X[k[/.^_}k{<)~q@t8l,|ycÞծ7+_ßxw]WMb ng<܊L*{ 2^j]X_Ij-S};/4oI5?iI5]m\SK}鲴}m3]?;/.~3<7yKi@7 ,tH_?9|Oįx~$׾ Y\[ir4>?d_M=}iϏ>?%\~ Z/4OOjڦ75[ym=CFmxϳ??o!# ~w YMcºlwP_q5lw'Pỏj}tS;}Ⱦ&"ּCxX/;[TW7z C=>eoeN<G1.D6rjAmof_~9[mzIynmaW\^?c&Zdž5-a+Ek9^x,xC|ro|Ak˩5yo o>O*%Ly㏎Zc ;//ڽ'I_x/B~Mx1iwTMMM?ܮ'UGi+U?tк$xb<)|Wοx|? k*/?ȷ6߇es{H]φW:W<x2ֲBs[q{uJJMK]JKWɿ ~0xK6Mz\lEKqq,ϝ6Wӓ|JҼEiI'|K=DOМ>Oh{6X?Ljt[,wM*}GD7- B<+ƞ}BW|8s~G~!GOax>)4[{?.z7<|T7w:~}kmAQ 'Y6e-U'/=#+o8]b[<ݣLޛnw͗={7> ^9eQV9f񶓨x{ޕ%u]~сfq5ׄl4 {~~XKXPON|=|ͩxfI&HVTuO۝WW5-kĖރ\_M-s+o|/m-5+un/Jdr#sO2_7E%x%Ϳk?įK<)ysXk&Z4߉} |?ៈWυ_,5[\jL2']Xc>gh"w|ܪaKv_V)o7U3c7ܯz}׼/6yq\Go{\9e~]̲~:׮j^,5P4]%Om̟kv_[k M"iv'y?ʹ .dz=e$ұׯ,tca͠ a??'MI?mj"W}o[s]䥞ɿ][ƒgKo3y7Dszwa6}l|+gn7=ٿ|{&kMKk${͕o 6{>~}O1̏m*17Ge=_{MyKwOM-hzL/!dqoWu*J|/Íd5vZOS-#C2:?#FM??rY#oy?[{;u+/dk$~j]֨vZlo3X6cYKb/7m#y~6i_ Kyp;^|^u+~Hyszm^kޏYQii\l¼q+ zmkY%&"^|<75; CĞo%H.|yȎxnMBY^jͽ*~{>6lL>|uu'g?)AO=i|@|a[|k?Eg-%\7CI _Ǯ}7H&Owޟ4z?~0k?O]^o7c.?V'DK͟D7v~CiגO(7 |A׾%_4/gu/ư{tja~?~7zo4'7Zël6 ]oץnKO HռugzUƃ7g2ʯ7|IS͢[:k_='O% \LJ~/j0)j}ߺ{FZ~|EH>Oh~xEg$Ҵ [菮&庎Rg><>86}O}~.x?Ě>/ⵎyS._x^;KwݶVTy\)Ρ֟VR=zj$L^Q\x?k4-.d{8>,8vju7 o2/7ח;u+~yg?Ÿ]v5okvpmw$:>Z. iUYJMkOn:I%k,k?[Wb9\iouĒyxkmy:^x.[O^}5庽[ip'ݛb\+%.ttfM[?i])ܳtu,-o_=f 7SZG7VzUն=Vvm%C?S_xUgHi%|{!￝[[WNWǿ/njN_}N >+_♥DμLUcq᪻Vo%cIVUSw1+[]3R?ciYb|v9y掟]X ~?\J'cY-o\3+ͽ7gOum$o١Ry뤾k;=k=Ko%[d&x-+u~Pg~jVw XO*7!ʂ9HfO=UwclK{_2IյmIgqXy+>Mӭ}GYE}swp4pŸ`k/2 }겵˭_Ά,ɝG6ټ śfYfa Σd~u xd̟wZmXO/^Y1̒I?},n͍穩fﲀE7'⳱M?ZGy-_9-?}썸&+cO.ᶰ]W71Ohm_l3ΏǷ1J|"mryyq~dLIgqgo6nK߫qvzƱI&S[5Ԭ߈m#״ m>p\/'kdO+ɛlǯ{kmʫ+nI ^%LWOth>ިן+M7|UMӦA"7}?mi[h:6o\>Y'|#f֬\inrvg=[f.d+m[;9.gyK4*'yy?>!k;k ;Ox_޿2=.aG7gmyo>_uxORZHg< %[Mu"%ziW~"mV8u)-v,~W> ].96'ݪsi0[Id-pS&yϗRQKۿݯ>J(n~Zc7˳4jjپB2cگ8Ss_qjM?ݮZ7䥜~b]'RR4˾|E쉴gvp|˾ ?J-A5 4YǾ? MKo \}loA7yOuȎsv!>ϧl-쮪IH^K vq}}>X6%U?xl^L^{'{$\\hYTq@o75g;M[.uIkw?7\֡^i0SYflDC7i>moz}v1<1 ta冞-qylOu +\}cd|S_aq,L=ޒG%Zugfw}׭?Kc\5aOK]%w%KOdv}em2uI/-kss|xno[cPu]-Y?qG?a/?ߪ[RmgZMy$,v_7i>~![7[B式\|5ߟ{c$kȎT kĚۯ-2o[>:uC]K~S&O[k{_ [sH5}GL_i;G#/;RX2ooqד+ry?_6VAȎsR׭#[[k=y꧅ 9k人7u|omqmROq2M7~0xP\Vm>ZtO6=`~cͦ_ E ahk}ؕ:=K[fo:7L|Tr =kZm|CqgJ 6*X&|?dxnxD^5^nߵE χ]m*w Edړ}x~\h5-wAy7G"4x/?؟˺h6[y??nh-Ə˪,IךZ׺:ݽGF͟s.4ۭM=:G"hdKyu%ηKhOyp:e׉]6gԯ'>([W<c6qm%Taewi 3D$>'{w/OMLfqjw:ݑg{)υoGʰDqTH+X# _WK<[3ž ١ڽլ7 6\?Y@)SWOi&XSϟ jWmϟtKT6m>9KxQ~dW03f7_G/:mWOe/dO_[p.xoP &6a[6M6#mQ,=Yڥm:y̟-L׼J{7|m mcXx7?KD44|):xO] nFW \?D~b;AM/ iWMFgZAa׵#&-mxoK֩?;ɲ_ u KOviy@7NIݟ[\xFY,$:'+${i>H㽞+缾Gr¿e|[Uc[?u_GØlm?e6)rI/XKbXBSߕ֞ЎDyǂsYh~c黣43*k8ߥf}jksj%3s/BK׎Sg{owցȎᦗ]BRZlsYT~Ήx?[ؼw+yME)]ǭ/7:淯h> ėǔ/ η«jRx.4[oΙ+<=-SAԯ$)[x?^O#vvmx=;WOΏ\k.as zi%8.gh 4].!MAпl# >S;{k׳ռ+5zީ KJ|?u|7<7}eCWKHCHuKG8o4<==Awz5(tKV(uHtcF_W|DZ5-QoufM~~izƻq%s =k~PҗX㰒]5۟i+ݯt}ZAGhciQ?ޟ~~54Zރa[m7,2zOcl}\_xT=楦~i"X3xg7W!aradqWm~#\\jZW!|Qo=?V~$|g&mi7/vrXY#sA%Ja[koJ/< h~"[5K;Ԗ=67U| Y sggCqqw:SI׼E藇YVUa/h*?pj|3WX]WM44I7Oa擩&+mǕ# ޏY(m_i^g} XN]R)ׯu$Kcly"ϓt?B/d{;^渆I|?_doP/fmyt勾-_iW[> _R\|1f|b Ϫ'OpuPMƏgyVc$?u|CԼma_'|]Io}|WIVnk8/\|VI/R/P/z/1E+"^.nuSGofY?3?xG/GV?/_Ko/Y<r[ n?kJ;E{k~3>:}m?qy3szS;xb jZڮn?guE9ӭ!KG :K __j_tcUO xǖ lOYi\jZW<=o^jZIr%!DO~)&7.z7u5Xh7ڛZ\^MN7V~7}i:1%3my-ʣwsPOA;i;{iOh׫IŮڬNj|gl#Ԭ-l|D\>,ke֞Vv'}KKj7j<44_lV/g~~sg j7¶zW/$ѫ귗S u?MR.DH^gq/Klja_z"[j *iJG;_ mm5|C/ny_~fR|i[񞫭麥t!>OGR׋~'k7&6)i?خ3Ė~!Ҭt{=|׺͙?ZhN[}_>9.q^~k ٣M&_޽O3d_r_<73}tMqPm7Z46ۦ3=neOۯ.mۘk+?q]?4.RF<3*q%lSz3rRid}ugZPKi$mԋ/}ϒ7VH'\Mn_G"$!{k6<'Wa>jm`魽E,Ro"ZyO~yh7ٴ{x_!|]Oh|+ oP۽Mk}E{\~F>!Glڗ-lUS%7{[oŗ yctdYt?x[⇉)jV*.<3;M:MK"܊&I{>j{C7IAR`?N ?VE^*C񷇼i}̐K<pgɳc쯢7>٪*v=Z0y/?ΐM>ו'|AᏉ?IvM"?b;د&xU׆syE'RO6ou="8mKop?Ɩc4%yH#kծl =KCfg7~l艳WW2y$'|CỨ.y_ʇýsc5"IM~r#ſ{Uď >d7 8#/[yở=oks[^ExN԰Y ș?7㕍c}SxJkDhj#xQt_`>kc[޷qyE^Z*oO<x<_Oi&l8珓4(=<Dg>&|=ƕW)u؟7z,4 kz٬.7~t #4|yu=Am,: tD+ m:CXi-KMoGq+PῈսnC[ttҽ ^Ǩf^a&_">"lh${¿װO"*yi J7vwQ2ym[|W'"=?|sg[|s&k8Se;?f 1_ h:'h-cuyI'ȟvUυ_vy/'SV d!N蚥tc=qRC]bM O2K=񆟧m*_]>W_lNYRǚ>! %+ε/[~,[O/hrr#937?M/h&y럆6=q5?7:>7h+ރKlg5g}}g^񟍿[̞$_]M[ab' &}y4R/"%ML<X u/-DO M #6m"zxVxl5-;[\<x^׼= Tgz]ψ~-ԾMW~9-l/ʟWOcZҵ+? ǣKgX>-OkBkXS69o\ ƽ4$ym7_躅#,/M6o aMu= _ksYPcI,*}7u+mV[fh}sez_x'wPYJmb/U],<굏t[Y'?ϿM>OVA*+ߪ?i>%_D/H4MgynOikCԵ[  qky?oownǨHo6}O=?Ǐ]6FmzȰyrq#ukvW6r\GsO?gEIK=7{msCyU%ۨR_o1xWėZjy#oxٟ?ldi:߈KM-սח+m#^[Ԥ;[m[-&MLi2XwŽǟAȎV j7ŝͽ}ۨf؋} q-&?3I%ګgǾOzT67O{r?w:aDMF5˛@r#SAnRKv k7J)u&6_߼?$0y\f9wsyn痼?<_z^14j.b6Y<_>/9Z̐M5_-w6V 4yxdΈ}?'_*[jKoȾ7|N?O١ڋ?u*s{F~=[UOso'WC~z>&4_랽'FvO^/߹YRx9^>վ(<:["v{5K+~cﯛhmY>ej+/*oxmYCV{;/Ay_d[?\:!kms^_qƺ{Mm[A6ݢO)>?G"G:+ 6 >O͕sIG<%\Ys=_x&/m~?oEpts_Hh5SZ^_Gs?&ϓguɈƟt{yw>]Z!g[D4 ]sW玏|Ҽ7khۯblߛ|r2 Hn|k|DW7d͇ŋ [,zWO$1OYzXS g>W9c7<o?ڮ4uwޟ#oGg]o{Q+\leI_Hwt>JԾ%xCXx]kK{G5-?u| WD[}$,?z}VK>D~'ួ^ u G%t﻽%~Bx_ ĞPԮ?W¿ hǟu-r)uK%٢?{ڢN^Q(C_>qkgyj /'Gx'~#/}ko%wj^=4?Ihך'wO޿+;xV~"iq{k:Ϻin~#%xo?_1uê^[iwOaW^'\ ߿T| >,Ckl Ct^𮲞kʎ{WWO\x\>@?ۥ9߇6ּ1 h~|/׎I/-+OGʸkW7~Vwfu9Uo/6scʇ.~Meabk?7{Bj ϲz?ڻ7T0 ><Ҳ˽__:OZ},5O IJ~'O+X}R{;ؓw1gVCk#Bo%!i]ȟ*MtHf_+X~!\uhqוCR^kSj/gl+r6ӚC_Ya?d\[IEΔt/cAObDcU43w.m;~{~5}yOLԙؒu-g O?/SkQCjO_eё#>M=i"crDm77YMspC-BMM(/$[=~y'jK hoZ<e%֎/3esv>񞛧mcHeֳ?}}9ա}_>7*z=+2PCm?^n..t}bp:gᏌ]C6ںƢcj^.t}oS}Ig/7Ÿ%x]>umi>vM*'~Mjk =Wz忕kqy+usOe/u+ɒ?j?6%M&Th}.о|oj^<ȹzlt}\ ͦמXԬ*[y{9?{8nojŜqn}o*YdnSPʮ_΍3.]2Wi.WKjڟy皿O_i<|Lu~;#iwvf^"C6_4OS-mʎO7腟ޠdiG+~Kvi$4fݶf~4۾I'˷j(57Udu?Ȇk kJ񼈣GWR|`\57;.m{2u ך>\Z-f-/0G3M %Im5Ѳʲy2j=iyz&ea53O;^x~KsoI~djIscCb={ޗKoUU$W|ټy !}aG;Ū?ִ{ɯ-gܿ?\oqxU<جcﴯ5}Neo$Yvlbp~Ғn|+.HWֿga{ a!]y߱*mWYM}u 6}'l쬽&Rca%3'9ٷ&[y;8J|^d?V/5+usލ`,3Gf'mxOԭKkhbѶ]zĖ_Nsf;3㕥oy<3C6͓[#-j:u=q&s6j>߰:y].Gui4٤U5~ [Fm5/a<,3+𵽽'yf+`[~%x KRF"<.xWMn>kȼvchW<˝>zDhr#΋pgLon4ө[Xxc[۵f6KyDw*GhUƉ<w~g%xΟy|7ņagykUo+ڳŋ4Kb"#u YruoMbIˎou它]J#Iq*|:{/%χ.t[D~᮷G}JD׵<5x"+=6<;=RV _XwFO О&TI%Oq}u^ ƕ'1,.^>3,tPyiob}iC6'R>to%7='o/O|I}-}[?{p*|&ǯϋln&GKkW_Y{F~UioT֢2O&^,|L3>7wߠ=e\k_%/PʲLO/7Kd)q;v쉜\lK9oWC_yr[Cl_:󶉒k_FkuY.7[krK̂GmKO.}k6H{8HK_C^\>?y@#jm[$ V֧y$+\aȉ|3ZC5&ʊIo2hIנ #e̐ͷoU%smoT,mv/My Y~eyU[xdm./>ۭO5ޓ%ynsl' rZ[JEo%fDԖ?hnnl>m-"wKkxAҴoj=V%aj4i ΃oxc'\[ͩ[\yuwo{S Mo'>$дDƁ'ͤax[?sm˼~3r{I"xsfZo4(K/Iwuxtm>sO:;k(u}3A/{tG^OD=xIꚖ-&k ]Kt_?u =7Z9 ך~Cq[Z|?r ycϿJO3Iw~!y.IWMO>O}aj|S~W\J[?Oev7VQ|. ![Cq>yuoua A&'ƛ@4ɼ%BXk Դ&I'X~HG؟'ZMMkxW_֡mRH"m[$P#XMhrӼ>|6P^hO/^/Og+Bu xj¾3euW$X ?ܭx:oNjt?2&O{DScx_ _x ?gQEuyg} LԾ,[±𭵴z{ۦzܧw(_ ~:%O1-_{wtV}Ƴ^k~)U]\X}YeW,o쬟vW}JyH^K.(#@Q5kxnuso.!7YԼC} :RY[˶+8Ds}.f|ygj#yw㕳E׉tKYZ#O*}c}w{8w/[jZ<:kRO>Pww׮4Kx/TpMuuKz<6o4#55nCdž>hIK4_HQ+Ѭ4?FZZu{Tcv/r@5KA֮t}K^}z WV{.؉>JnQ|+ah o|FM^atLOke\|/mM/7=Ԣ=+ƖܚmyKa-g՟7܆>}=?⿰7ŧXȟ7~|E:_ wgޕ#oy27?GJZ2jgA_ڤ̟7Dμ5\łyEay!My_kDD+o_iyw嫽lkW>0,7 2Mg+Xuwn G5m+^%Ήanj[ X^i_7[joӮ4Ժgz%|EtjT_;V|Eu7ZtD+nkOet +k^0}/g/.mOzW/xN ^Twr<;[Y>ߨéOʟ9Gv^xoDŽ1OHM?SoΙjiO x/mo&͕rQt# .<漙Ϳ<߹weƅ5kƽ{i{M,6B*k-&i'xº ϋ5ulW sϱ6Q |g7UN,Rw,GU$>!6v|,%kC}ם>&X,t5ſ(~VoxM/ [i^12x|؅7\|=ci|AuAsq7?+f^zn?+FfW~~EoUhsq+x~*Ҽ+gmqO]Ū'-}>7O*Ώx?PjړoeoA'>0Ӽm ]Z7_ClHa|=k)m^[| Wo<=sj6Vy/\h~'kd/$Pj֯M t6R6Ҳc~ү5 mn BzŭԟoM7Mʝl]$oq=ڔ)ɲl{_??^4ּ{oY-ϳ='VmbT}n7y,]&ŷGzogOqo74]jz}WԦΏEo [.i&Unoe|oVu AlG]#/;wz;'Xxz`_o\X}-={q;5w9IAzU揣>ndgEOxΩFk;mbP!@d?&k6TėZΥ$[4?ʹm"V|Em KPo4ESX=/hkȏ׼+\z?m_Ǭh1IJ=몏_Ko.~!j-ڌlTofS^֙4 oxOM٫+?o+cuͭn? g|dR,Z1oEYd~^-0ڃ˯}BKv/)~/C?~$|A?&k%։g[ˍoA݋qqj3#U1gcM6M%ז[4m![ ik6em쮳36;vwWmv'Zz+aO>?]<ޛ+Ӽ iCíƛDl<7o7GкKb`N4XXxWJ۽![gOTkoTMWGqs4lo5}7UҮ>To]#bU>\xvD׳H4.}7y}j G_߻ĉYơ=+bg}}tϺ?=Kv6SZ&~ճKCo-bmSGT*k_+@<> SDfq߭^d'ܦxĚ<XWJ1oqtϝ۫W/&MWVG\D[/|uqm`Ǎ/5/#PoޣPoG "^ׯ5HB'ys~| oǞ.;; k|̟aW=v~ ^j'6埗=Q蕃i'Eٴ}Ty"W*E鲬 k~{j'{Ŀ:}g=>.Ees˥^$Mg?q7ǯ{ϋ $=,r:3Jx 6.aMKM-u#KwHxm7,Ma~}?nm3+]ޛkt?>mx-oz=.ھڒiϙ۾6 zM=4y4"[ϱ?\xS>aaėuKϴ:\o>;j[l2y_w-iz sQ'~|._7mkzo5nOwkp;߅ͯiZVnVWS|_cWX{ Vf۫_If}굞}&ރo gOMSR [xǚybWWҾj}G׼Gj ȶozRnV ye?Mh>JK$([zles߳_<RO͢ZkYųy_<]]jJlu[ɦyď~P3>Kþ(` ? &&٢>x]IR8<迿XtcMO7CETz]Km/z}_|C׼U[_͟O,)͉꽼BmVV׵]6M)?O+dү/g%?JS߇Ymo5 noM?ۧ?xoX׵ c񟆾!h7 .~%GOO6WmCR9 *^ZkPW7?ךh>(U p%֭gԖkt\serY|'}^[l,.u _^F_y Kd&_5O_h|9Ε㫽[ox?@]h kmxoM.7ڦh>gigonWIk^|UxG5HBd[&//&x^u];Ck`j<$3x OUO \OO(O/&Og{>wk{5O,[]Rq+>Di X oRUi" Gt؟׳h<׵?RWW y΁wⷆ#Դ߆:ƯϽVS}$z#xԵ%t5WMǖ}c"{;;'-oU?pDå񥞷 kleB$ew4>"l1\_-#6 [W7ƕG/伕:Mt+_xXiZVℇOTV6wPOg6gX9=;7,úşYP&7x;%auǃ/#][o'Ou?xX-IO>xUOyy%t}dCӧ="f]:>+lZ-?[Dž%Zǂ|=qlt7~_f;G4 b(O;q>J쯾5|EKɼSa7_TfgК^Qzkjb}[ lRҮ4/dz^K5+y~0|DRU*gk;ؖz+ߏ5/Yͣ[j'I|l}r ;[ᮥ l+oFm̟O%khdeܯMx[m֥jhݝוu$+yz/m msok=c1;[_#ttq;7zƛdҴRٴOSKmnṷxm{ȿ"|P%7 Ұl)uͷ5VKo 76k;?n; \ީ㇎7Kϴót_+_"濼߉>hyy_;:,~ 75ꚖO5+:mC5/,? K4j(!5}##ɿMKo>5XrM?*ddKumܭvhfug͹/"[q?CI]iv%͜﮿u~VI{{?I{Lz֔[$?vʷuxk5y(['U3M3|v*4ڒLG$jV?&cElMog_so>1Y$)q*?+זKĚ=STO'Wz%ٮ&u$ҮnST]6-u獞+RH4Jv| s:ݟhOꟇu kaO^xnPn-]}rHW7-{[!:ln%/KtSZ0$/W3qzn[$wmcX7˿{rjOãQuBU7־DH=MԾ n{{͕xoĚ73x?X>Ry>,׮uOBΏYXetz~)kͪj[[;-{9~o-5/᧊]oo(|#_xn?q,)|@U/H|0=-uג7}_ew{)ў>!F-QVbֶyO+&4\A/.d_ޕAa ͢{ IͳJ~6?jcͬ_Qy_^8]KɆPٿkE'X//4bXO [Ot]ym׉i4S$l7֞O\ЃXsxWM1CƒZy<~i%}O$- xXU.Y+!xOM{ű\Aoy*jU?sٿ>=#Z_';鱤ō'4u*==$Wrza<7?tNU? OCOmG:c(M߯d7_V?;o vh[J}"Ñ"ϛ_>Ծ'x9񆇦|PR u?3%[{ksx^Ⱥ$wb;%DM_O; 5mW:ďkv]-ɿ篚~0~ƿokx?ʖG$vO,Ӻo؟=z|g99kmWTz6psV~,[=zhm4g׽[w[}JX}"oJ~-|-~g=[例<;+9x{>.x^|I=*[OExl?W_ ~ Zk υ!ou) d+ž8'o3VM.i%2ez4ƫCMR9|qTOu=}/>!-Ioj>?^] ۻxOr9~4xӯ5]Bm EErﭕX΋xE36,uG'}sOdžt=jUOKEe|?߯?4|1|c[kfJ_c#y}Ɩ?ږsypel/i#?Jםx/GAo͵K[l_ GƐP9wb.^\^My#q{F~xⷀb=KU-\#\:7j[ 57׋RZkmcs]lj5[tK˝7GpGGtL}ӽ{o7ƻݣ]'o4{VGM{ϙozWΟ}m5柧q˾Xnx{+h 5σ>U|'iU |W9?M<:| s_ZwQ\ZWѮawW?9]^̇į|iyZkaZsgruO˫7}_zOk R첶׎#~ KCA<%m>j-'c6?|9?[Yj!-[}^K}7⿇~,>jk<Y/M#~~ _57z}:eC>O#XL%]?VM?{5܁M&k u/X.W/_]$L4 >>o55ȿҕU._t}+?⦃gj^6_ٯux~ J g/-Ou4x 'N.l#ʵȓ\ԞmM>kQ{#$O|Yi2>ę~H+ټ]I|o3h>n&^ zUHk,\^WhfWO}OQK}%SK%\yN`>'xS⷇7x:}t9=~6Mҹ> 'gk:5_1>7\c7BM6'nѺy'U =wD:mdu}z)lO?Y0/ o+9ʖdM1ouy[[i[xz,5_/*뀺s6ݵrE6MH_gcA^H~:u+bWq$&ON=XCm[cCa;yKqy_|</$K5 vEpohMo߻X,e< #߲?42GYrD h[fo5]k^\BYƛ67i$7CjHח>dl?iWYnVlڕǓѶXv5ZX[wL'Zݞ巣Ɵ-e2Y<O:.t{l>*sM2Fxyyv#2}9w6oOiT1;7g?$DCҳ3I6RO/d>>#R?nMJ?et>ɛ/d28b[rhڿG|;/ඓcmψVSoqyW羽Ěm駥l#Y%yxag^>SSR~:)O>:W|I-z D;i-/oSM/,5We>\ּ}j?m+ylx>C?#כE]j \#@}z3MMkWԬf3:Gߵ_+oD$.ʖr6^!_coklJU?V~YuJemhw\yv;g3d=iE=g]vOש?<97-|Ah+[ _^Wm쉛SZjWKy3>gFJe:nmaB6n>IQ?߬u~Wg*'9xIkeƠן>ʭ56:Iao.!Lz>\%qcVO-7$:^Dm/~k} n[-'G%?+).ImIyFG6k Ͳ)xl;ŷu+6? h:[mMg֍'3|qĞĄ>9%Rϣ4=O1еD⼖*>o?Ƙvs[[qYͿ[+> kadZmΑrT9ۨFa+]7ⷎ4?WXՄv-竿s}e|8Ϋ⯷VP$lIGzTG,QJж-޳[q>nꭢxE4}7v.#[݊3[oOelxkmf'WHkizͥGjp[ƿjzJ,;GG*I ZƉo\\}c4_]4>UυlChzaJ}fD߿t+YxSr隔ni"9iٿÿ'>z;="jT;Y^xtO ZNlBh՝_y$[@ Fh߇ h=_;7zAu,>qƶ*%?P5ōΏyz|co؞ŝ?m14k{5=tz#xBIqe?Kfo,$rwl}?߬}JJ6o-qw?iB7'~Kh m/?~=bxNyx\1IkvOy/"tkE冃{^-g?kojC [,)ZkJͺd}=zNMվ^LrtSGyy4y5FgxO ,׵gJ>4#|;W_ԒMc[YΛ_~ yh7G/wV["^h"ʉ>ch74Oh%ƆRYmվ37QJ'{ /YBf}>}j*y ߯B/ Rf~\ߴKg%޹xV5Gc'wX7Wz=ڇm=*t?^]< |W_x^/n|OZ^ٷ^eܿlޕ"[%αo;7v'hl&nؖ^E)&K[cI#X=zv|&&߷/1Sq1,6\meUPI׈tuO /*\=pĪIȿ+GV׮OJKԴ/hW;VKA{['Z =TheEYϸM{޸sZԮ$o,%,lLKjuiz=ze䍓~% 6snv<]A?G2C0}*[Wy7ojwyPmqI5MamW6WS4[6RޟMoqk&Md7gO=K4w5隇SR:62_߯Ix%Zo ͬX_qn_&{a ^k}tWذgy{CKMUg+XYtIa3>*xfKUx{J7v[F\Mv*ȟ}?f{MҶi&ǒdIO#3ЯWٷ!/u}5Dz ^_Ir~m:e%敫Wk7MVu4KbIGg૖gq鯬:Lju Bʊ5ٽeh֡۟ ^<=6oe,^Kc'JSkzz|3WlI/C_sotDCCQ&His^D\}Ŝچne]<+R.mnu; ?XOܧ~O ~. ڮmbDE|N+K:TҬ<˝J7\[nDȿƴ]U|ؖ;t?+^2do6<Hϲ7+|;]o;_4I=&bjggjj;.!g/>6XǗ*KIIa,V\/<ɵX໭V4}2lߚԒzp:;ꚽiZo,Ik/̿<:7/[RoKUe[{=JVXҾ+|'i?bǺW+lnl: <'4n\zXn_zI\oԓEmKV^(|IS~4>'{%Jth~!]?ugט׉gyyp4Ҿb#En6MRJ#U:|;lꞏg}4in{{4W5oz6'{{"9%߲55K \\6:H z u5[/+VTֱtҴ/y}~. >s?k>GtX[GC/fGkkKXCMʰe}Z^2߇|?5a_;m`WW6zpe v+|y'/ iVi2h>&p_A\@s^O-o?R߰Jn-%oUA>{7?[|LVh#-?_΋oCkosYحt;Nhn?绣r:_%ͥhx3DX^-l;υ楩xw:F*oەWGwM_k>$<= QH>j(/SºUeo{:~.|TҼy¿V(|m7.5MKQO"Z{@+xំzxGoY".a^ /-Cyyy-mω??WIx?_+iO`]}TwrgRG֮tIKGpoa@>/G@m#skǗMyzy(>';w>-u_ZD;_e;9cɿ5xJ֭>)xW ڮu u l.WDXx TRs*(öN[Glfz#q4(m]w4~-fXQx >tzS2I}oẗ<g_+]sB[]_3Oپ|CD‹JOKkչoMW> |yam+KXbnl6UҏU-_ oR]dȾױIo]xg^¿ ٽEiüGel6xᾔx7ޟ w>ujnxG}=5G^-Vi1xᢋ}O ?&O#X]kZh:č,yu ֳ?c물~o&K#wejQ<q>|U:z狡xͨ|[grL>͕Xz~4~S߅7 ٱVknM>DwΫq _bV{|kkGn|-A^Mpﯡ>PshVzVyU!HOj'ӯNT||$S[> SKOGʛD_V;]\~jWVm>xd%c640٦,~U3.*Ogpڥ͟?3k-5ya\'íS嵾բt]<_A| tCp+ğo{Z-KU|7:Pk&ǏɋMYF~*߇k.wtC|igᶺPmmȒ_l~Kԙ/[iI"*K=s4YMldwsggWzoY=%Sg}[U_^\~Fg_ZI!-{C y |kCMyoMlXM__ijvshIS&}wf_^I[;=Mts'^c|)6u߿_H|Lfkڬн'Wq5)qm X~vW]_=כk܏=7 :sGғ]5IR5Ҩ/u{VK5)?tu]Ri!6>Ͳ?uwZk_ỷ)9PgơMcOx|sͿ_O#6ԡG- Yo/y}?ﺚ 7!ſ&;X.ƶz[jZ{+_1_elk+M*埈<[g\ @P.M|s^}ߴvbS}]6Xxn_Y_sg^3-zmbKJK?XHؕgc[{7פ,wf_>D{[}| Ioy-.%{c~ҒK6x&d K=}߆9y?OnPdo|IRt?}oca}:OZ Ήg⫇{jJ#B?x^CyjvZ}^l aחAqklKB8K/Ŀ*+ڦ6i]B+ֵ_ͪǩYyWhQ|;oX?5-H\l؅χ^xc~$|=/!$[޿5m :oܾevDZ^u> l5.?iך:#۽.I{HKfaxo^ BkP:lqg"W^ *m?̖uo/u/,G~ ZjOh0ԣum+O \~?i~fu+͋ٳx7A񟄴sAn.?ocWWύ> ìx0 bW I%x[ΞO{]/Q??ZΡ>(7Ǐ 3wo/4}CZg?sJu-zGҵ]JW_ S4x7⧈|# q 7~ePԾ!^$MyOy^(uT?%w^f>G6ڣ2\ͳo]UҒd5kuХR X ?.+'~Gc_~ގg/Za6sm{^^|qʒg_4zͷ L(Y&zEwG":;k~ Q߬McR{O?:>3C5:#/,wm?u2i6+y%đDnsoDy>7ɿ[kjMcIl!=+#羬kK{o%/&Eܬom[CWPMq>Gd؋-@_l>G&d۽RG{uM0콷I? jBe{{dMuO9oÿfPn?kaZg~k8'oPȹͥG[j?f_&3eZfXIM69ؖ'3u$]c;?'oKˋo^\[C"y OW7{O*O{vj`gz6Wh%}-Gg^:xG&ĖT y[K=ҹ{{Rox?_ mmzK>7LlOO}s,m^MWڂhů_7B|ex4{m尼8/,";x'Cx{CĄays9||=K[e[61O&-|M6wi:>y__[__ޟl~9&9gy jEu'a^MLNic*W|K~oq9'Emk_|t[C>gxw*~}oŭ/A[ML4~J$m}KnjKjV>'Γآ;_+ <17S^#ͼu?_ֵZx^|@'DRѠDH?ԣu/>TE̖ [}'Kmv]LdJ|6$?cM>e1v隭Ώkw ۠s̓|;u}b'/$Lk{eͲ-Qu3gK{Hz[6$ kԓl_ oky5>J&hXuKRMJo[ŷ*ŝR2u ~_++ڔ$e̗L&xڄu4qm앝.]D7}bȏ'wG4} Uԡ"K\"O6V=j!Ѧ}$_Vxo6}V|_wپVse36ggs50ȗ<%?>~;K9=䵚N[MVWr#O+c+yx?'틏*{[]^ to?:C/<#x~'aks] 6?e3 G?~|7R&:Oc٧[]?;_ mΛêzya/O7O~o+|fL _]Gt}>gx%wTޟW7O_'tOvs#k{Kf?],UG ņqWP2K^2iO|Eo>@})twO>o؞Hmg}.K" p%_O\Ϗ TlPyiO=|WwM6ݶ5+'x>WǗ\Kķ^WX_z'/xG[uVKGVw,_Ji0u e#W An kKu5ﯵn>>i<>ΗV3ŸWl.-5_'ZfO6'm湠EFOF#G/LC|Y῱fVڣ|K~ &+yՒ߈^-NuHo%G}_ŸI.nlƱoo'O6=_.uܥ̗iOm/ͳ>pWVwO/xGnT^]_fu]cºV6AݭW&Up_{&dzDVIWIMbJXdy 7h޷cXm:~HM58?߲ս3%8}7]BO33y *#.;;{|Uh~$umIn_oec }2Cdm}W`vڵZu+?|H}֟5:jYyFc,6%V^G.o}W"Cھeј8ֿs+gyseڄ46%v+Lj%o*4v!GϿL]W~cP$&D:'>x-"3ywiJ;}7XMgm]6|Mu}{EjqejHjnO&Wڞ3Cmb+/y#Ʋ~}u-X'-Hu[SM~-c7=5SS 菲o+zg͏چ9ϭ>͒i3VFH^'V[h>poln(}LN?O9gskuygy |F'[f?Q<}鑲'zdrn M 'm77%ܷ?W,nm ;9ȟr?25aSHb/7om3WXɇUYA>fF%S~|*?y4*4I&W7'wVsc' f'\7Mv:=CZ3COVV;⫭&i&t?\fqml֕rvw:u7yܥM{?j?X 4k2>~y$syVl?oyȲnWMxoLz%m yWhV0O/yaI'<۶kd{Zf}`;[9ƶcKIJlx_k76z9ړx^o$sI]]:"&m4m$WU&O'}4so+مd%c%O62 v:L&CF5F{xWyD~y[VVz<}^kpY ]][CfC ۲WH4=Cn9jZKXjH{~X_Z MfSP縓_+ZnI{-Kۙ| s^DpZĚsOnjy&6%ih:דJly󿂩[,oG}17],rD7Rhƥ O+2?V^E$7fPu+kK=JEؾbizdž-J?:R϶}wz-C_?0HZI?Yeu9;ԸHUO?G"=^GumU4۟>3*O6W]KA^gگ%W1b;k Oۻȩ_%iP[n]J,$C 24+M{t"8<ȼ\Ms_k^~Y&7>P |{Od$2#>spۼg/hZ}[\ VkۏPI7ߑ?W4G;R-_1Vb7ɷK u޳F\ĮDeަ6f·GIKPڦ2wcf~eg w]C?tukkɦ}7Lމ,?|\%lm,-4yuEiSy}r^$Լ dMkfSl+4G[>y'7gQMPZWp~Mq+O <7yZp *'ψ 4 3[]JH ;;j iϲAkyo=ʟgl󿹿nN-&mFkm*iu 2'z6$:Ɖ`,%Ok6}2%vqO|1xpk7yRh?S*,>~:[\[?fo>]/RϚS},_2?}=m5 H^j\6˿~޹L>_nu D[Ϋb-ݳ|WkwlPҬ.źx i}-FgsT}y_E𾂚ޫi3jV7WoPjsr|3];yšxאDJ6^4}m/,smZ핕_f%Ė[MgskTc{֋O ڽEהh/$_&?hx|:O4 Is떾SM,2~}O5/>gag>4^zs*ͯ,?K˙eBgi{k9}גE?}Ϟ'O!G5]I%vEv:.tfJMC-%5O7?I&K#uqu 'm z_er]z7ڍt[' Yo>n.Ϟ7פxWB<7C?O{ =#͟=?ž:qjP&ywmŝ<_}s^DxT.> ;ǥgL|i>kyy7 tDO= /jGs5yy蟺~[*֗_duҶsߕ"/^.gn~~#X%g]Viap?g򕮠?iΣ≥дhm=V/%M? fIϷ?bDiSi O-ɩfqnFsgɾ[M϶M\]yW]_n|3[\jjx_1D|1]tߵj=ڥ?nd/Xnok[X_?+5MbZ4_=lc['+m·k?Xi&gu-oGnyۮ_+端 heΥJ>LGdo`&gx87-0y'ܯ֕C^M\nxZV>T?9-iWX<>㣣buo:Ƌ}ĉ ìowY?eu^ >Kx{=^IfbexTu]`I[dO˸^xY}{XƝb \> Zt->ϒ+ _h?+7U,Ikg.=W; h>-ԼO{>X}LrMq}?óh[hǛƃȕ[<1g͞bwZ.5k]_{Ēw ~Q?zn-/ GX㦏q.O4?Z'47>A ǯ<=}c67wVYTW3=|aSjd2&i^[Aޟg {MSh_?|Ch/%Z_-4Ck}7voZ,x<7iGrrG vw_ߺ_-(E}sb-~"XV:kwn߸l+ԞK=/.&&𭦤kUM_J% 7M6g{7~=7|o>>x5%sqkzW ̑C%|sssMWMoSg9^h~,g<+bh+߲D=<\|B𮃤ۇ𮸿ԭρ3u[^o[ ^{R'OO}|'}i cǬ:n_\}]+ ^iԼ-"O˞@|P9}"x??$m´_Ώ=x>0h'{=_఼?sg?;+hMc=T-L?7ӟ~{'IǞ!e^4_Ο^"oVڶX)&֟˼>TJuo YCX ]qs=[o!X^Y~hUyL%}K_?ޡ=5/Ωkqas/8{j}bA\?O|e?|?Ӧ/6Y͚_wznYO[xD.?}+|+} 6V>Dog<I{Tog75->THo.?u$y+u8tL:_ۧ,_(|?m}s ƫgy}|wM'u`CjSjeH߹=u^ ιsGmwǑ>t//aܸD(Ծ,Ԯu^|(>%$nٲW?u9 񧏮~n [[|ųore G͛Ě+;%KVt?0񭟇𯊭.7,7e}xP~)Ҽ8kFp]jJq~m|' .^k֌ol.msŚ!4}C'/ZƳ 6$?s2_ƹ/5_\\K-ngǾO;WU>^8?4o|7?!iyw}B;{_hƏxIE]n{K2lO[G+^<3xJ:Ayƈ}{χu o xy>?/lO!>V|&+˼I,'KxK_ˊg??i>h<7V]&>}W^|h7>z< arGu翸?S>$ox_^GK=W@Vm>_"tZ Yj_3,7cW'-n;H't%@ {} O^'őw{kGOԝ.wGKh]5vTҼ-x{ZK ^v͗ o+Q_ğ:ׄjqXUog&DRcCtg?t}6K;?^~Ǜ댼;NO:'-_V:X%ǝgxǚƱ ^o{o~}?ywȿ~ϊ>(u}6Iy ;|v>.Z>GDwsg/"ϿW!<9OT-%yf%4`Dy纷}'uH>H=6 _|s5s|fviukh^[.o|ECX%>fh;_-/k'Htm`nYwc}z'M+JzCj>WڬIuX缩r:|oX^xJPkM,y͉E:U*{C ^Ox?i~//|}m Z4kz~guϳ|?:TƩyI7-͟=y 6T>4yPIkQs>k=!/^Լau?'xoZV|,FMb nO s䭿ٟAOj7vw}R:_7|9<+bX:-6ϦyNlk _Xgu]/B U4[|"}&g?^i|hVoyoyldc>2񷇵K{m+XҎXDvjS^ov]C=i*yyU*Χ:9=_w4W $||y*k:}Ta!dXȷuq]SP<ge-6Gn#>?|>u|OgmqG?^Td{|}ɥXxG以dzmғTMYˉޕ󔚦ǬCa6||ZRxoi:VyjKnTVQoXbu|#3ºNkwV/ǚ/GG[▫m5I,;5}ȿ/}gͷtkGL3ռU-RB_˿h~ψogszwΕ y!cW7O|'k5JI'7좥8TC3դ-.l/{iTO>43<75bX+ȵKBo\M?q+\}h{.qhϪ[Mo>$^E7i/}W 4?x> {q˅ؑC/ݾw0񵇆u)!VIo>诵(_JoD>pVgx^l=B|kϊ./ n+>0xdntyfd{?ᇉ"]CCh2Z=حsVMCvi%/ϲ_ mt4KMlv2Ƿ5/N!O׭C4&%cDֿg'jJE2Dg/h?z׌%+ \h|lIx:o+?^-ƫxWo%,6[m=|+PU//.??ĉ)"\Q<ϵy.oϱ>yKj|/Ƹ%漟|XH}c 'Gԯ4bBfWVƏ٪^],$נxş|;4:ڦjY q7׬# x>smey5_jCK쬫Wޕggs-~lx:nO-Ow\~} <顆[}Iy N g;;f7iaY~dM7T4FTBt;X6CA}ϲ'6V9[y~2EpZ5o? C_Pm$M e/"X~tO<Ɵ?ܯ7e!4{>P<5_k]}wޛfR$zo$+3sɲ¾xWOvٮroo,o*?Ӄ؏hΆĚ_D٬Z>* Rygt?sog,0P uˊfYe[殿hAYvI৤ѿ49^D}%`5d#JGE?Ŀ#jڦVc_ =+)b|vG<&>ԿYM5ymkk=4%I<癤*ҵhyjmL^6 osnꚵylmhG+4p <ϳGR>*ͱ|[}ݟܠ=jnt:ŭCas I\>ff7+Q~j̗SK>wm6;='Ra涷7-o.,eJ+1!o!еlxdW+«5&;uQuRKukg|W%.ó-nu7]CږմRMwl7׳Y> i>1M?4돼-.K;=>J?k{[\V_%khm7nį|gx7mKTRlO}c;[J[ qw_o=/oO뀷mBmJGϞ+vvW8'̾]cK,> &++Q?֮I&ٿ4=É_i|ܳo}_f[6 '$$[K;vo}}}_9\f^__T_hf~m}{">lGo:uMꆇ 3C^\Ț-UdKOnKxVzlzi} -[M?ܯW[xw?6y[[[kCLO^0L=%J>XYKWOl#i^gO "K^oEai^%}!G/~/ |+zҥ7}l<[? 7JԾlodO4 He X~{?#?υ~5'ׂW|HK-{ i|_|]jŇ4O}Ϫۿ}O;ڕy 4ď پ:/6ܙ)cAoXh~'lUΟW~/ +?xo˹DOҿ=~9|Eᇉ7Mb!O:w^ ?4W'ev^[Zq>?=wJ9XOٷ+&]"mCQM}x ^c{MҾ+/$_o[_7{ĉ3į4/kZ6ߝ_GbÖ{z+ |@l[>0Ύ[XDo>tc>M{/D|=G5 OZ/۠t+ĭ;\^~Ifп>asV#o6>03?|M[τ?K߿z;}&͕ÿG ?~J]p}/J+:i>s⦻x3ŏZ$UW:l%}'-Yן>$iVn*6Ox?%؟g/XK4}A &Wd>JPޏ4:W YvX/qo6^C|Pc>vDrϟV*By~щ'/AҼτ^!Tl9";?O>0I]^U?HWkxfrhxd wTOƯ|)v Y9?ͿO׵ :{k~nu=V|פ|!g3N[|?5+h5[;dOVGt?ŵ٬/5oc~<#}}/ZtblU|+&·ZYYy䶙}gu?QkMsH5χ[,Z>I{#sefW9xƞ񟄵/B_V:}s+HSc 4-W7ω/G-EmyMvAgy߰o2OXt_!5.[d+Gqπ~WO^ oʃT +D}74ONAEFi@x{WGwOlcAw[Y}q{\k~P_.5{Om]JΟy6cX'쵍O¾~ygUS>^>G w^We4ze#Zl44:\z|'@_ kVoV^m/xWUܚM6bג~Hfij'~^?Ο@ W>sz^8<[xsep Ϋgsqv+Z; ;q!,nեHOq+%V"|7@)L[[^}O>t~OO=.Hܯߎ?+oG$ڣh~~WT owsfp=y%[X_2&_V/ sM5~_'Mh~ؖF+\ҡCm639*/w}|w|zBsy:j\t1C]Zj)Mк>Z 1䩋[}?mG]s5ag2ooJ-Z1WMky?o#vn[Bmպ|%rQfRI63}¾ 񕶥it{x[>|#Z៉?|7Tֵ䴳"пi _qܴw7&C zEI?t 0C3Mmjm̿3vfzs83٤meS{n&?@,U7s ݎESg}<y3}c|S@ ưKT(љ7u^ַO=P77"ʓmޱgW}ejhUh$&_&oz6n])s[}c3O5߼S.:l? s*[~>5 seg? xWHmwodv땾G }6/,?o巿y-\gTݿs|ȑ${:oXO'WYW6o -fƾr,:yk8I$ ̖uje9!| UsOF؝k}Owp7ٮ`mjڵy62\-vU [otQIҕ8h04==vޏWW^ggk '/Td&n>w_+Y}]=h5-Rv|럞Er# /x u?u7k NWK5VMw]/Lm?RrL+Gr#)xb? %汯GfKLĮ]t?S}*[I-|֒iRy->׊4i7ws[ܼ,.onh[irYCDۯ,k3뒒^oqOy//O&kocǧ&կU7Z'/-r0YU!/ 7Vo=ﴮ}q+mKU;hw:?=s-B"W6|wOq%tX/.hn& N|Cx']W+T;=WK2뀳[;5-JK2l»]~OZ'5{}=7%ϿY^"M㶛Jmα m}/IҴCCdִOM֯umٷVDr"jlw:\I#?0huGPҵnw>ҡQ\G42j>CiWx6S%_GGg[gmmywEuckoY_UiVwG O>='' OJҤt~1cX|&$ۿ'W7t_ "mw:{/J:)6WgxX7|7 ꗐy6s}6-{T}J` uبCM.orMMz>3Oh{x|i≵^h[ W)i=厫g?=Ͽgٿ+]KXe橮[hFoOlڕǃe}>I-5,=KA-|M'6Ww \'֭K<^]>xZw/kkw k,h/7εeo=tzx"Լe=_ +ɾ RR4-nmۯ_Kx=ďgD?iwϦHv K $|դmŸVQt/ڥ5 K3sj"YxbK}z ͈* >manhKu_mcۋٵ٤{7}Xk\E5hVp>ċ/]!}2lM$WOmZTȕVmsebV%#ge_+]> u֬[CinuO{ߴ'͟%u_xwW%tYl-_CCE/4J9w[?wCM1$źoםȐ{7X{dEj[7Nֵ{o%m}޻?جH`o=Em?_tfӯ/5ƾZ.jZ^7]\O"ٿ+ OkZ%ͷ&ih!횢%lEz4M{9mk7^z׮^g}/^^{ͧB?حyjZgoMk jceVa5k$۶̕u}K×ZֱyC [}ȕC I`} kkzziZ[go%|64 4?k~? ^?5mo+ƛMIgqu_JEҬ4Iyc7^'DqO"xWQeKI/`;\Zow;muz^^KA .kɲ?Z;{AԴSoy7??׼MkX\Ai]+[$>z_~R/5B-!k_7.׿l/,4}wZ_>"Oך+yhl _$t?] C}X&>gC>[L%ϋZ,>|U O_\kWϮ'>msWhXo"cequmh0,/,0SzI<i)&ynK R=reҼIgM ϕ?mH.ms?P|{oj,EMG=z ·7p}-x_͕[A0_yVP˱ۙOrJծxM}wYo<~$-|#Clٳ/c S:棩XA8σ"|Pdy=׍r }+GKU쬑swAHl<7gx2hjMצ3Xż7ڮ?&v~>|&s[[%KO}͟kȀilt{˷Э]54t{nUt?ݷ *ZZLJ~h]k ky+-Ϳ?د)R-ḗlKyMެ­!?qHWlگ]W䷃ȵ=\No6%m>Obx½&I|9_%ƥ?3[~aoh]|GG;Vt|Bޓmy[n>rhn,ɭJkyPy=αq oWg`>wMJC埆47[]^$F^XK+X֪}?5Jރ\vW/WJ7s[[kzUJ߾ZzηqjThXy+ w/- f|5ιcm7v1`76wywqiql۱9z έum4{.Z汤!>3m-{ w<IQ6U^C?^ 5{߈^*~-?Moz95m{ᦫAKmr^qtq6|C=n>ɽ+^ãGHTԓrE\Q>+s6?G?՞ȓr =;Mgÿeyl| ?k,LxXXkmȾ[M+~%^mJ$5KK4OG0:6!ۿZ c|Cg;F&x"xc^ѥuK{;7X3x:=W|}-i|=MDe~[|W🄬/ -"'W7`yx8ּ}su_Oso<*慭'cƃº_fRնOhr;{~*KW +_ve׵tAf߅z)Wڗ~xCrWޏ#Mnߋ+Ś?ŗX}(-rO}'/`K_MM6Ǔ6lOo5_|M>:⽿"sp"I.J_^]?!5[KӴn>y؛|zڦxzwݽn/'wﭽ|Aw_:-ݿ*iV h$[?]Um[cTrjx^T_lXZxZ%LjO~$[xZԼWKHO!?Zι⟅^5oߝ"VcZ|M7$o4 xOuJϾ绣|Gol< 7bT2w!OY =t h?<#m#ԯ5&t4w{d<𖽫?k$u{"|f'[:<'\Y|IdzSmDOzo߿gKMеc\Ӽ1%֑ogw}O|>z8ώk{&=ƟkieykǗM>uOxZ VlѢn* c1Ү-|#UƏ럽ԤJl>Hj|78lk w9.7"/$_Akʒ^Kקio< Cmm>/4ki=WhoOa>zmOh|%Ćm.MuFE%w+4MgjZ7C_N5G jqۥ_/WZ;n{q?dfy+hĖp=lhYs宩dwH,kV.n6o-1|]{FV5-UXͨ$6}G7ٹw:w:Ϳ! u3|>(ggmO&qqj}{Ȏc h2sg?uj70޽xo+~kUq[\Zʟj\}ϟ7>Z@WMVmnb'J槈r#-oVbOh>6) =OUW5b۾X}}_0Ͽ^KMzͲ.o>jZI{"-[< aZW jE)a7"mc+:R쵼'bKn-aԵ xLKT:U-^dT+m랽 CR3#~M{Ce]OE3qc%ĚiCqt |W {_Q[V]o;?ayՅaa4KEoselBIy,}ufgԯ5+fmo}wo!5>a|2Cnu ??W"G"1t5Ҽ/mB\<;Y&kYߺܫ՝6gg[Gk(m[TԖf0}_OgO g_gVƟISk JUҼ?u%/>(S똎V~ؐesC#ydޟߠ==7&ܺ"ΨOI/+Ȭu6cK6ܿ&ȿ #'5zMԡ}W[-RO( 1jڊM"Q'hZ.pÿ^OҴǃ=q\y&Vv['{޹>kw֛[\k6ֻO}{lmg%Cknlm$zl6ڶ:]e?^oXMٵT|G߲_W=~)7V#iS6i9w~_6W1,g[Zď߹?úVhc؏}USO6gskΗCt!KwO9ɝbI?ܨdwկ4˝zzV.~XunZ:5{{o΅~_߬K'DyR)>ɽy<~K&ϻl@<3d4o ?w֓z'y7|$?ޠdZ;IqU<O }싞gfi*>Uٿ}V~Nvm/ϒw_!Eq6IԦϰO7??i^xwC~c6opVfqql}{G2YJ\v0^RZob%y?0Sm{RMHl-o'(l.`4?4qywO5gK-7nq/3CV k R iQ+ܬ_KxK-txJOlC-_n&+^Z3Yz-e`3i:\,״d.'~Cg`ֿho&gíbʰԮ {sv>Wo7ǝ¾?Z;I![]**oN4??ۋSIԴO\!ukkt?_:U/ l<[ Ԟ|-{4OIGg<G6yso|6xm[]7(O>J jԼYxo[M7ڵy r-݈߼7u ]+5+-/h f~!|3u 5aȏD_U f/6_țOq?%xA>0-ύWm:8n67^.6C4K-d=ISg?>x?A}E%jOz??OO mCMMB?f}c 1UCmK25?ǁo,- q/[-B=R{&:>1OۃG-5/zoHj>a g\|mj灡'ƌj}-O:;W7umyc7mG(П.MЫ:2Gyk=D|yx..?#MoM?|ǨX=ϳVco}l\|ys참eɑzw<Nh?>`emgC_vEtqRt#2ImRkĆO o~;JK26!tg#閏o⇇5_׮t_\CEYo?֦׷MkZ=xoR}}[x=otɯ= ߳΃i%VyMKX+RnK4b$r*Gf⦃qjon;~f>hz+MHԑ?ءsuv[Rk}X.r-Hw\|g6g >|I_wo"U|oskߋ6/ĚU֗7Y!7>MOuH|Om$ ?_ xDK$"D-O$j |/1bdٿQ }iMOBѿ u7፜+ڦ;/yo-<x'Oƹ/klrTُxCĿx<-|@bkcY${2oþ&7y5 "tf'W|etڷ(tEg}NG_cJ^~_mͅvO'?VxkĚnW>]uī2g־dI7_~֭̿u56K? {g>}|IogCUViׅY峼t?ޓlq7]|d'6|+h={ﵛeK xKڧoWvV 5 h$߀e彿L4[X/'wOMt|[V,eI'e{ v?7ns]{F# 1[|9ԞdY]}x'wJ~M{F%MsSռ%藚[9gK__Ei>&9k:ďٻXG^ "?5ɚi~+{}MszyWq+~s]&ag\>WVKf.o,7x'k o/<[Iey_f>)h 4PzIey?VcxkzΧ꺆\;T\L4? rWZ+6\ޟy\<[^gOio5tkO/k }ul?u_otknĞ׬;;2tlΦCTOE5ʾDI}hYw_iW0q=K|Yc_c>,!oԚ[?gZkymݑgaWk\+omt_A2W㧄> ^qg s\sա{~bX>7^C V|v~&[GiBkOKMOk3Dooկ%Ds笋ugFlR| _+n-kkvzFsVf>ƚ=lZRykXgm>3/ozh+ɉ"*y$kP\: 7KyZ#tbx?^iSh=]]szo5-7MԴ 4;tlt|VW۠Kikuز,y}m:Xi u2yjX'f̓ɏz֥5Yi\=Ζ/KdMBHߕ||0f:}YDf:>wŸi+ fӝsM~}Q+|_xΓpg$ X+P]V\#K}?=pY԰Ow_<ԟd~~=Z66:F|dρS}6[Kο߯=M G^hҴ/qu¿Wl/> w+(5F3I4rlYeew»k} \My'?ȱLYumm ?^jhU,=cxm/s?7Gi-wqDo-s\{dgHd}t?kj:jF7-ΟT*r_log$Ҵ8ۯ[C\Sq}"}du:7kq,sE6UǸԡioKMO5WoʏѵY^Үl?~o6f|?zns6-Ro+\\x5#f]y?h+{{/zĶ^ ٴ־|hPzcBivG}ZiG/SM7x^Rvxwoq%%ku=?6SMqYķtr ==vu-;KM֭p 75K;o4y~б$Iǧn_kdm7ٲ9#2Is z=]ts WʛRpW|m ;Pj7lUsl47~o6mgq,)<no-vNȎ_d{#y}+[L"nyxMUJ >ʺf{ VDfKi{;;17~gןȎZMsy3gho.HR -ϽY'Idޟ$4&thwq}'u_νg=^:ğg? =y*[Yzss3}OOMҴ.nnu Ms!~*I\y}w^d]\W7<qLGR$v![4'Oh42ŸvT8e7RN;dO2/FZΥm53kw~dbo:;m4[IS\-ϿTѐHחm21m ͳ\ܣOWM Υ,4xCojK7-RA(`Tb?bW'xT_f8>k}Vm5i?swckH+KhMͺ_??jMk>*yٯͻJqմ?[ybyP\[@֓6C-wMH? >J' ;Lȿ՟#n7-{]xXԤԞ/'_+t?M?nƚvC\Y%Ǜ{"cgxovr̞0MWPc?,^F}]a"/l/nff5$۶&*חMU{hb?֑[##Ɩ+ܭ/,:u:[jmT?PmMZo}ey_Φ$OCpѳ̉)_u-cRO'o.>H_͟W"ׯ.yO:64667}֑w>`ZZ~assT&N>t_X|>~y?ߨZY.Qm&yyq zؕfhhImd_ݿ5]J{ n9k$/;[Y&_jWRo;\7'ڏ~FzZ;vl՛9l7FgSgoez]ٮ[Դo :|:lܙ?OSPoé}=Z9xkwLr&5ͻ~Ͻ?r3IMKfGԒjQyy'-umoĚSLҴ5IBk-qֵo޿]s_?ܿض-/stS??߯w?Ob?5_u`?u[ Yss2Co!;뗞`x?&vuc^/u_ Zhfxo`?uxzn[qq+2ӮKZ<`X|=}DiMsih=lS^\y qW|)muwK_*饂  .<'5}P-v2/&ֵO冃uKd][.3'tCX^^}%"do^k~?>6$̉"O`rOGt5%od\UkϞkZ.M\yC;iol;7QMk/ qAr&Vkm ~ں;­Wh t&xe.|??ckkm%φ[JA$׵(-|w_l_|'LN tdMuAnpy0>g,?z%yׇOXērK [+GΗcjߗ*]Z.#>V5 ^+zǍ)CjyV--x|eMԼ7%^9o IaKȫ|߮tWMԼW:h:՝6+TK}wQ?댱t,?/.!eBj>JRUƗm_Yپ.gO?ݬ}SR\}@yMym:jRS.M>J{|_+dlo4O_]no躇?,}医oһ@)4MG|?qgsc^|_u%ηg}g˸Yّ(v8Rǹ]L7?{6Um4_iTvܿ*)}HBƾ!֮9Xv Ǿϑ6?hGۨնNqGL P7$\4^lm#(Qh$&&E4[[-}Ok =+0Ӿ|iuM~C*}6#se|ꖑ[\\ivw^ ?ZV׈PKX4kOhzĿ×焥-{#~'/04:M|G=a^cqqI=z>/xkW4/iW5O.>լj kkIS w׊/4 gЬنR?V'u_𷊾-\6Qt{>;'g?}֞c^5m{߂:՞˲F׵Yﯕo ZWtkM7]Mu_qG?ğM}o=ZꚌm?,<+į?񆱣vwW a5H~?#¾%񭽷񅆕ݱK{q'oGzŞ'ٵ+ [koIEm6⏇?u<'j8/쵥o=?ϓ}v0ZZ|T{IJב?E:GD4HU(X7+{kҢ_Kȑɽ&C i^jg&D]Wi^M 7o [EjDѾGo OxmIJq ڮneO;+5M']qsG̩Z_ hCRu i[ʁ ϒgߞ/jVR:ڝfW'm+Լ=xMyw?yVok./<i]7KȂ|gojC4-6OVW}? xJHtmyF/OLطX. @[,M%R??߮oiZFu-FJA>!ΥWZ=_`k'ԑGOs!4*I ;A_2-6O_Ἒ2.y"}rs^{=my6%vkHo8uK \w7[8W+}Q-kK7헟|Uyl Im-u[;羻L/^Ěh>uƩcoݪWK,5b'Ϳu K͕XږymsOgd|Aŭ77~H?ShwW3[M"}){sVz~]%[%[G1kcGXc!Kg/h_gG+>$w٧g#gk[ͬxc.MG+&+uo)6q4ꙛX3I{Qrp_x'X5=z:[ S^?b;kBkkZMėl03[.|~PԴ.J So姝~|7_ioVb\^?+]O:$*yɯ͙,!vI9ϧ.U.}Ka/俙~߆> cǚ$:=g_s}|lOltٺovCi|E7^g"/3'iWaŶt\߉>#xoRAs20ӿu-ƛҼMl[ԵmvدV|jZŷ.%/aS7P[/Xզ~Y7l7ky4}V׵YmZk#}$/_nE{z/aV?ޮ*;'tO麝Ͷk_em޼}a_cMc?w+YϺ7s{OxΏ[RQ.kk&O}zwf 9]O⾏;MT{4OqjR'?Lto,J%b;AT߳>e燗³V$ؚ=0ޟ7^6 z:˶ˊ/GoŏxE4Ԓ~iOon?|)OoMxK-7P~^ZU5GfW\)#>_>J˷E.^$TW߯zo>(?M%|ZiD|%r5-MD'-[qٳgZIb>֭ixto&uK_Mk*K͛Ҽ)///~ΞR4|ܮv*[\ooFMM\:y6(k2l]]ikԴ;džWD`!nbzoo Mgm#l)6_߲3FOh?Pm"%w^BqM?z|?7cx6N"|$I>ž6ylK~t-_v/5/ 'I"3+g?G<7Ꮘ>%][Ay/'rWgiq,~X]?o^N"'z^Oj'ҼYsK]b7y7]#ׂxMu_.Fy/oJW4g|k[s+߯@zlZm&yyE_&^iwn5O7͕}կ!K kɡv<1u|' S6v:]պZvjj7?g8Z\IsoH]$ѡj>6E 7G_Okmܺ ^e:qC˹57|O~OCE <cOoW4ߌ)?%m&[K_'_k<χdžuOM/ZK̛Mg9Y?>ܾz&|)4:<+[6IO6g'Dٳ诇4WPDb/ť\=/&Im1_& [. J?ΏnowȏOxOZ[xIYRֳ¿ۗo$vl6%{Kxսsao<*O~4YGm'5?ԩRU69)3o*oNj4{j@v#̉oJ$ԾjZWO??V;YO?߬>Um=mov֗Og _["WU7>-_}wOܕ7ړ/i?;{u/Y G>٫^I\OU7<@!xa+ZLIo}cO|T𿇵+ŷ] "]V}}۬G.o-x_ :Lipic/ϓ&'ĉ2$}|ͫ~?-Sx{P[>Z EY}~\~˳hixE-6-i?^PԼ#7AYˍۯ[1xlﭨc>ȏ?oE x.|6OzH7OK>%oԭԼ[#RX~ W7ŝ׼Zÿ>~$v):Ïk[:ǿ7]TYOg"oG<mu"$I|+&צUow.zbO?dƥ|LwIK}=͉_aC=5k=Sv?gYK(ܸ·Y!JӇ*o~h o'ۨ]l/ Ow6"V.k ?ޱts-;Ҿg|%lj>B/ePO}?د+NW}gOٲ>6-I^ ˛gg11<kDKtO"o}|%o ^>׼y^!ӢҗM>ȞJ?zkK⭎%-/N_׫guΟOMvV{io; |=hm,S}Mz^!#?|Aci~6fr槝;'oo_G/yV$OGcmn?h |x`WVs;6B%~?1y?~:N%o#`wi4?:dz^{m.YңTH*}q?׉O/w}GZծF?'g/Wx~,Qv.>->|gcz˞gj?g_KKȟ.!t7YuO _>#tO~NK/ C]xDׯ5}ڧ.tDO^࿍;B~..y糹n-' 내%[7>1|/'~+ |U<+/VOHﭡ,jDc>/#b}KbL#oMkz_?%qǦi͵>߯ dϋbo3M ܾJ>^ߎ~ oxDÚ=f^cz2&5˗"'V~GjC/;5 ϴxlkCR5wɳGq4k?:ᦵu7'C/Z6W 2ϝM6nQCusagygηoYgg4G3 *S 9#ЧCUfX}&lExtOïi wh1ȅBCyrM{|oY_h>fܚ|Ҥ'ZEE~~сhΏsog6%_+ϋ}SkItM쫋 3#>06,i:E04Xʧ:6>J}O7hN743luz$m-5[ض@sϱ둵7/+fpXCi>c}mn,ٱ'`kZ)assn[oaOL/ym$zOWCjx7d6ݒ?6tt 3<;dډ??UT_ܼ+HMI${?%t1CoZ8힋jtrM y#~$1<);³Ƴ$3\C yM粀/6ͿIQ}5n*ۯߗxU;83}hQĚ?lo|gybcDZe3n<z@o?%ݧ**w7gt ]jo3t{M l֍.nxd/H-P2IOg6?@ 7KB!|ijzUns%bIg|?ݧd&HC}W˞؛;/ÎY#R?ujOiv~Xkml}YIzZ|byX濸}^||F" L7ܾdgeU\[*/o~ĮD:;ϳ y;o]M"?گn!guxk?^߆-uO?WY=`ѧ_*R}6GssEb𾱨pZ<Df'MvRv57ˋdyW}^m?5Ϻ ϿhaIo{lTgM͝٭/"wE9ʱ[M4?i`v]g߫:-R3o//5Ƨu$cb̔{8/_y'?ЯB,BFw#Cdo4?͞kyv/^hmbO#}iy  o2a_i{>&\\M$u̯7xxg:˃i"9xLCy3mFk 48m5YK߶Q?ئ]k6op%bS%YtͦM&Is|U=CUGhmḶK8Wj8IA=TG"-,u2QX[y4K0Oo/лoPdC^O2)?m_SiDGYWRV uD9]$44{COi#^Dvse+LJ|͎2MKQׯf-B,ܧ=0hR;h/iٺ})]>%$ڄ:MgI>qm6J\n5_O=n,wɯ?dM4ngEwTi$GtdOw޳w7ubaP'of:+}'le}rsWNg}Gf]rZWW^Yye7^|+i~z?6qY_[Y5גw?og(,u]kė[XZoc,2}>+յO6lˬ&|w^z^v]^-ʹvouBbnG_|`{Nh M:_ncGk}o?ۮK:LZd\^M_ֿ/¡乳մIOWy^[B_uz%i~ vy@l?ᇉT ӿ+O_ 5]ߏ1hsCt+lG\_|3i'eiEս}"wMVP./G&Ĺg^ MҼAZ_K-W)]&~S .̾߯AoLM.ik]luPnSĞ*K %[O7O7, Mßj~ ͖/d{WZm5Kk>wg^k7ǍJyl/'߬}z׃)zydiy_Z n 1/_x}c]i6}}Ԯo4^^ңk}%<迹}ʮt;7DҼw{u m5l {;+P4oG-$_=ax|-o^|FWE,mηӿ]y[H'o$/#ouu!;h</~a nu-vIn&I||3Ե͞kuV n 9 ?p !Լ/g鷗GqDXz[%V>Yy^ƞK5oMm~uq⿃7X?5 9 =oy<QȀ͵nt}Z.j'zֵyc XkR|\i+ 9/onK_ 4Si붸Οqxy1iYz|i͛**u_;P/c6o. +?Y:|U^*Եj 2tFl-Ɋojm*#ףO>ĞחL^QfDzhz'?xrOMljZksuc[Dɼo67+:@׵dk$Up菲 o۴\}oK6xMbP}G6yj/_-<7{okVu{G?|77u4^c$.7߾Vn>#x{6 4<+y_^)xMh,l濚8{A׭_\oqkoc%k {J-dM4oĞEXHl?]lڗ/!n%XZ//ƫ5yɥb]?Z*_XxԥX򢷎/'AhY濎OTPlj-qkjMsI_K\4G}axD#ʺg]'VΑ+r:^TMABԴ}-WGUdxɶo_̓\>R~7>%jZXIiay6ym΁FI?gjyȞD6-}q.|-RKobrqO"} >MPK; {o7,r7˿vOi{'4Xt~vKD&oWOf8lf>=<{=[gŷhu5+-<).s2h7-Dg+4M~٩}:Cr7:_5/O>A?y?/d~m:_ k_ٳA<)wOq~m#D7|y MI+ݵ~|%sP=JLo1dY4[GywOcK_Z<{_jO$]G?]-e}[g]Fz'xfĚ׎5 DK%Ԗ]Co.k{xRM_ʷVic=s(յ[kPI'>M^_/~ :O|C\Η,QZg@Wy c!߂u^'W'^y?RSOZ<7<9mjZSa؋ }z!gm ' }{\MSbs`:t?|Z׵ uH})?783hm/WtpIm2+Ԛ t{; ~їSxJ%ž{ɖ/DIlɵMWQmbK[ov~<>4{(ctBSIWh>D]!Cyg4s}I,S5.*W+o##U&OO Qݼy?S]js3C >cǚGٿg5YR-MqYmMf;/k6_>N]RU&3DS..\q5|7Ƴ}5ܭ rGjO*ڎ6ϑdm,3**G}Pњ_{;۷o̕ 暯symx j7&eoxX·J#M_PW"9oGO:?y֤7mo4xq#ǓT-ᅦx;vg .kig}OByf,bl?;ߖ46L%FO4餟u;;kپf̲&ɼ1tĠ#K:,Vm:5_܉?!]Jkqy߲k :/ɦ @}̚vl֚<6.dX<_>%Y7|1fnsk_akogկ]~7dUofq4y'/]x'TtxtmVX*\Xwo$_H|+sLB~٪Z|hm_4ny.Ck 麖gK rjs=/T?Xy{> eĞ:-V齖'EzA >cB<3gJt[>OǨ|9𭟈~*|8^K--gKMCA|Ay5 \@7RFkkiw=s{Hm ֦%\GO }yI_4n/gO*[qMG7Zg: ūku)ox]6vo5]}7At>? \ii{yCyn77S\\oi@OOaKw~Z5/iww%."xB[oxC\u/XU-?DKѫ,s_Kӟ¶>嵞[HG@nɏ] ,a/mʴ.d\$QUגr ҹ}C"K{6mNg1W4MR!Oz^+9SMg^[lUG'7ZZ&׼1Z4:&u^Kq3>$m֛y[mKG?WMk~gx>Js~/o~6Үt:y?oY)MZ66/2KM@<=K.|6jZ-/OýKAƧ z<:?exW/ͬYv5rޟr{mU՟$hPyI+@&w~?ב+6_M4y_wJ9nu[45Ǒ,?_lx?{WOI4;iW$~^7AcYYç;{MJH]G7^"džuVW#};}{~| Q.<7Op K[m+JƱeLIn<mh:VờW!gtw<տf5+]CG_7TIt-'_^!=.;=+$7.&a}?{دoFx:2jC }ye'kwKω:mwG\uԼ?9 ^'|PNm7fovP]p^=ySq+[wOxc⦽gt7R HO+6Y|7WROpZ{S?g>"74WiK)};}et}|`ힷ|7; ]|iُ_]JU4x{\l/ۖ?5&;.qmyῈU7ֻEyëjwe̹۸6h4Ksc_|`>CJfMMOh{^O|H.3 aw[͉g2}oҾx 1 ܦ*@<`gGw+7Ýzx_v[5$oK>Yt O|: vhk[O&?mTwh}g=Cw_gS#?: t_d}6Ss4߂ƝN/lKɿؖzy+㗂;us>a&VD+G{C  M_ڊ]6ܴnzO|;' ō-o+;7'WukmxUҼktby)]JC&oA& C|4<7մI[hn~?G+u|~|?UK;ۻi[ϟg{_Asj^}m|:o髣^٧럶&kJm`;?)G:t?/=*^gMQ~-A x{sbW|jgϋ^>&ƱSXmkǂWJ׾,[|ސc }> 8ͬ|Eʿ;-VT'%vS}Lh|gOaWzUb,uH5]?|Ii]Ͷ9,gҝ?YMc>?$o6z~#MXR&moim{C7<7:o kt|ke4OxM5Q^M[\B!?دsV{xW~i>&n Ho߿x>*xwsRaqmKI?*|ϒ| T|C[񇄯,w<&h~yoÝoGҾx?Wa]h&m|O? o?C[M'be֗؏4?7a_,|ml 5 |yg4ۋȅ'{+7~׼Uag2\/i7?gWwtO ȩτ[PgO/<#s.Q.b]6' Tcⅳ|?/4 Ծ/؏}5KxFm6 K>k-'.>g?֮~N$MK}u^ 4)WK |:?.S_xbԞBJT>iK _ ]cANj< ovyyQ^>>ޛQO?5O]k5O?z׫*~<M_O4;ˍ4{JcKύo7lTOyw}Owx,{?Y.s|{_4|#s' nwEC@MM77ٓω?iXMpoݤިmK8fi,e[o*ͺGDI?wYFןûJb4"j}˚*&Lf>%ٷRUy."0So_Z&=䊊$V~=I_}Ҹwd$y?Ÿ~cg_9>2 :y^& ʇm?ݪѺ4{JTw˳o5|9BEڻ75$.oGk6?O}yݣ`];U3:gΎyglo欷?ȏo9&Qy]+jܐeԛs˞5y^ͱ?O|͛?i?r@i=ŅEzn\Mqs'?nor;oeϲԠ uκr|)ٓxt[:;-[خcO]./5u$ir-ZrǦgswݻ{wȟ|XZCف.nk'VHEH#yWK5 j>2IR6Gl4{ˋkBG]$ t0z&Z,9%&[;oÞK]+UYYe7*1jؼ~ԙʡ{[\?womoYtcXwmU__V>qyk Mxˮf'y )*Oyy/H^GcḚOXOUg-.j}wt]Jwl_7*3Ԯ+h"6پZr=&oxMү"+\~SS!i~¾O=?^I.?t=xG/gXn_-_+mOuasy?&W5bWgʫڗ3\[M7>l/J@C>wKWbD[\f-DWPiVoX{/[Rk^M>aԯ]d?>ʱx)JZwK nbm6:B&殪huKxRK6Om?IMBOc:mK'/V@rW0-oTM~ѷino>M-Ns~ϒĞ}?[k/xT_j}5&m>4K=BP7_r6^!ty/,.u }-l{rq_x oW> Ҵ4r}){wXKwt#Pi3hl:7_h;7lꟅ3kkxoxᴶnזZ4K~ϟ4%=jkϱqq/qx~(럷!j9-K}<[uKiq=Bm.E6d[?bm<ͭxԍJw:44jTWM?5vY߰}Jmt/?nxGtjKCKcDx>G"[mkpz75k=Ť^|yו[VԟJUԣK ?̱lަ׵MbhmKj +yJ&&7zE$OA,dZĒƾhXkfu-[T]5#Hn'R5}Rm*K oym|UF/k6=-3(E{Vxe/]΃#Vv 554{]ogܯu-7Pt?+?ho7׼Y{s >x&~ԋ;\|4fM"ox[ۢ?駒]E$R%ﺒOWm 7q|J6V`Dm>i u7\}l+ >}5o/^Tp[Mymg7sqamz^wZφ/4:w}R?]>YR<خ<ޣZmS"yrCm>y w[{;mo6ףeAO?93YgivЧSu)| zO^iͿimg5 7?MV "mYX_|O,wמókMoYۮ˫"~>8g}r\,DW7DGgb j)z?xݱuC =4~K?=y)gIg o?z*mrM7PhaK;;{޴LVacc"iCsq<_|gY٧ :i8>JO:|OjsiudtK⦹h!?{od)uxV7|e'Klaaa{c3E4;$eJ>{ F9 J 7\^4mټ[ /OR{W-i|O{?xD=Ld%?Tx{]yD 3xĶޥ7XI#fޟ\7F| hRi/~Ծo$OzOu[mZgXIm{U|8?h8u&m/?Y@qRsan?_. [YwLo㙦=ľji7\oɳD/ u?? ? Z=آ5Rỏxf-%c@ ͛?D0F~?!|5Դ(}yI?E7^OIMc^tis^jiZq=kK߆V?+?K~-oJđy_ٷۿ%Owo>)xT/#s-Y.uDq#w׬hw'$kbYrijya6{G]R=6?)RI"S{Jb~:\^x{v|^R[epoG|T.ou{˯i1}:3Ǟ0Oiˍ>tb˽cX֤P/5B]Cy|scߎǃto\6e7{=rt; J>aq^k~޲ޑ|]?k{~Go뱵nQ_r> -Qmu-WDm[V/޿+KZwƱOjFWҸH]f/9gm$?5?_Ě_h\f cXmRD_E43~{;+QUwyHR\MKo!ˍx] UTd?f;if?_> Ե6mtΐ?#]{\]oR|wd]i_ZKm$\y,w"|$G"9 wVN3Mkxyl??J--R4ϴ귟Ȓ޸ {_ԫ9n/̐h/* *̗WawU}iΛLO|2C27`Sd\My7?ȿ}u wu4rry)6lwUGԴf6EFt 7soS2*=RCX8SGO!_'h\"|_w@Z\:TyO&| ??/ߦnON!|~Mܠ &S~ZzY.:D,s֕ ?ܠ s.m>_ݾ}s̱ogޙZV:孭[^^C hm͘^Dz6ho5640m3%֛h7y5Ǖ4_4yb|~ouo7soVi|j寙fT+&#m&v wDI$TOI<n4YtioI6F =e\FH|[S~ G}};zCMp2_'Ǫv~ ;TyѿoOv#}Z -& W_dܠ~7vv3[ZҤGJ~ʍt~*D_[^_:=ĻXqOXoW7Ԯ&/'Br{I(D[;NEYάFMU_?Ͱ5>d%|aO]Bha>>OX{ok~u#^kY4ٴ=V]CW c\%E|W7c#ؿhϫu|ޕ=RKZ-Ӥ:ӥ]X2GNU"Ǯy|ݼ~F|=:ٵOxo;_)>ϓ?f6U6'hS<6/ayomhwXjZjVfkfާ}emÖޒ.JNT΃Ծi VJ}";*%Կ*[?gs5?~C$۶M[+ zX ̒o3ijh62=}hl[]y-{lun lk6g4sCշ?P:kdw ޓZHfhwDmCC7gE}Uѳp$ŲV]bG ,2[ŽxlcWg%oiokk5o w+z-G~R>_R {5/?ux/PQu'B.Ȧo5hl/D2EWcwǚ6ID-J1kh7sz"Vu-WBO X[;izT?ol'k_G<'}O,'b:^V33t|.ˏ]߽}~UkI{  $r2A,oٿګڧ -u\YoO6oG؛+k^v]XҼ5]2hH'}6:M^9/<$ڗ-OPyO6VVMK& ۚ*ŏ=sY7$)[7(U,VL{~>J[᧍?hDymn4kz[Mq,6|KxAM|mm il??{ Vz{g V<3DuOo ǚUs{<_V?y%߳BԾ-Cy74>khv&+OO [_ 4ohlqyvH;m|7$xoAK o%ˏK|,|}~>wg[8ǀH{+Y|Z\C>O+5?F?-/4O^~#xඹF|6쳬U?}__ܖxW_4j;~ln]^ >^_jtfoFٕb\gA}ƞ; lo,n;]!ƥx#ʰՕ~l]?}}!sx'Ċ mWPx-t}n0.u}[-c^k?mObړaI{+H>t/Ӿ˨ͦj05Oz᧋|IyxU[#\ZZ?źM>wVG_z'>^*-|7OH[׻/Ο''g;\>xMW/qoC3'D'Sy߃j$>!iZ]n:w'O#BռCxOԼ~4IiH_h_k~ |W6skI\Q&{+ 'P Am_CMpK?iۛU>gx \M<?z/ Xo>;=y#wotGJrC^_xzMoճ廿C_~_ |9ͣ |?qq nHeGocy4'2߆/ A{X mr ?3R-M Ǚ?eJ2xū=o[nh_>-e. L{D<)]د_kڗ֝o}{| 4l-eͽijƷRE[̛0;"o6Wy+;6o2o2WZ?RK{I*)kQfnKŮS:_t:yvuq+>B>K>?ȺC<_x}q"3OP^<]*>G>7|>7A+)>Eguu"cW ?h?9^caoKuSǥߤ؛_(VzƝuWnf巛[\q?n_~/j_lzW//?Kՠu$ۧO ٜsG7>'NCs A2\ϫۿ?ۯ=<'Vw qhWO:;ψ0][ںIyxyg]|QIOnXk#jWZj$ֵ[:F?_[mu'ZHgma#~:mo:?iI7ܭsͮ6~/2_6o>,ҵ-bG7-U|:|_[wW6m6A&۱~?U@\fe4?^> ~&z/}cO׬LGe};]TzމUq[u}<淰ȵnQt 6ͬiK;y"|UoJCO%n>+(IO5 &ݱcTDlߒ\L3v¨o] j^!>u +}{F'k(#'b>ռ?Y4>'mE["xs̮cRU\;~a{mј8g7?4yҵgrs1n?oܤ/yp1 ec5;sݵW7l14W3m_˙.y:?ߐ dUgRݼ73|rq2}I"#o<]['gOT[YkOE馗{e_/4ٮ_·Um'/T ?_P }(Dbynys* } ;;EҚݢŵW?кmΫ͵?ȿT-6v?fM[4]eZ|k2RYk IMM. ouXO|PIl37N&_Y-G}}-DLo-$y_:{i?OkUHQ7?S72C']~= >r3"$o߭%u40^6ަZha2Ku /A4;4߳YƛGt縼Ls^k dvy'm-O&? zRtִ/T#ۧGi7gVwj&X^&{=s{s\gOT&x?cihVΕƐ>ȼHVK OMnەcLͻo'Km{g#[ߛ#j~O5o--VTm;s|=mS?\\Z^f %_%ׇ%[Ե m6]q$ 7+rμMv6#+ϣygs_PWMԴ7[y+f𞹬M'PJtO7|=[]kLCKH|,WV۷;^Qx/P"iVvڧR+Y."Odد%x?¾  xƚ%׫4qOk<= ~|MO2$o*=d.i-]^Bm^F9Gк7};oGsI#I J}6l}?߮{^'.tiR8<Ni ^=o[QOg^Oco:\qn}35#I-+:NJM{-Xka&ŲX_:Q}%m\jK?wKOƅ^+O.gc:t֙&-)ok¿|AoUysy//yryx/Ś7N=ΖjܶߗQϯkvwiyqK$ZLjnmWԮ!ȕ+!=k?V,seov]^,п jZ军5坅Ļ^i% Dmz䵳k,/!ԣ}GM6v6^+K4׶n|Iŏ+@=cGOivz&k[~[<폲}KE,v*qy:ʇXj_\~\>ghvK`v/7[Swߺg?uch<2j2V嚼?{y?֮6Mkv^/ߦCxMM!]j7]#=Td@?5 Bm7ڔѯ:%tGZVkm6Uk:IW[k~ǞbWMHdG$F}WwcQq/']@ oIsy~kuG߯oԼ1 KͶ 'x7κ_=_eyM)׉ /7RJ~@g]7lojw7+-mM<5 bUCqu^[+7nz<)^M5ߒ/$ɬ[[[z]_ݲl >uk\[Oe]?2ݣi:mo۾hWXjI+L6'z~*^j.nG7}ܪЯj=ɭU$]+}.kRږrHD=Mi/7jZyRڼ%exGZ׿,ߥjl EoO㭿i^e: 42:_;~+ӵR4_Û xc֟Z~~&~<gZ$6;5h+£tiZn[YysѴ:jZ&kT^K/l+f{g<+moo[{gyMMӿ)h~Y ԝ?*CdVnXO.4t7K_Os߮U[xOX ]ڢl౞O=?|7'~υu< {k^v/n4څn_[~В+GXg:ǺcO6o@_r]cSZH[Tnn罼?ۯo·ރ';5oW =W~O h7%=>TxX5 A4{fKw:_xFC~xcA׮>+{V O__]xVtOrhz&cͬ7.Y?z8 ז>&ou-qXgOG/ZZ+ii])u;_Y/9hsn6}oZύ4{bogu+Ouw?^DuOZi^/5}GEz? BGg|Y-~uukkMsbWF{M{afn=tz? wυ \Ki+ȀouM]C=扬܃)$w]k R"l<]-_$k6mK{]q/]ix^\? 5_U /wWV(~ {N4k63q'߃f͟?Uĭi|Ig&w%nKgٿ؟}랃L{X5]$n|4KzTk=b>oOl t ͮGM[vo96DbFMHVnkob>b麦"wzH];6EkK];ڢX\|<>gXITc[$G#&-l+ 47KRmMC ٢sMk;ˏ5#dٳAfyx6Kkx?}^=.$zwrHpV@c]t2Fyϓ?/ч[IQ=u|?1>zu65ګ+oɳO>f͆&/'Lm{kf싲+Hz|4]#MkOODI}̇ʞNSO'$Z&h=7i$7>y<ECM~|QHg[dwny2I6dgϾ;}mvYRI4̿v/¾ub&T6} *,߿S/o"@_??uZۏ8lMw͖?/gM_|Iq巍g#ozs{Kk?Տ˳/tz:G"ZKގyfm] ڥχǛ-ו1,t#e[s۾y*KC4vn_3SNC[^\%|? ٶ_}{,3>M+ZmSKrIu}?ˬ$M.kb}W&v~8dz֒&H}¿> béCyzesuoN:oX:S]$G]|w'ϳޮq:&~$7xFϗ*|@㿅~$1)VƟ٪$:2jPȣGz>lko_KtJ6Cyk#_ ڮfK$}#-68?[+@|zqvis42ݫЬ_3&o@o<-['I,́o1_>˱>n6/-J$]֒}bT^}ހ6.$&D5Vv@:|7wWmqq_2?ݏY~ -+Nn?xL5:o٧MB)wfIygu3̑^\?p~ܨUlhc6sWx:>g40 mi{+{uԦ·P ow&6][^x ;{ccq;=ݏW~DS3om+3Z ?6oGͶQ-[FOº}͏=U6;3タԝv{Z.U8y~<tSo/ހ,7(ڞhHm-rao4-'s-0ﹰVf_Cl[[mTWOb5LY~_G \InKTިVO&M?n4vX^[+Ltiwi6l*#̮2{[d0FT+s}v MOW#OJΝ#-z./<7/qk~+BPɩj) qy?,zﭼ;oR<#%wwZHQSFswl/<^^hZWڟMcf;-<[JƟ̟|NMO"[˱zG4ظk2GjfY!-Uܯ]tkU|Ch:Ɵa]A|/M.? #(u/k냹ԸfoWWzw(۸ԡ-?˲j冽 nwu!fa"O.XO0Ş״ r>%S xSDb|_F4 Ğqu}J6"{M%p ~|"ڔdo+u-?quĈu:~Z <Ύ۪~/M|[i6o*KO:oWN~D}Q'!Z?[=bJEq3ݝ̿d/s˶kgĞ$߻}^Yk[7>/<'$hXgOsgiVh66Ľ|se{.!~Bsc|CҼZ|/_K{uw߿F#'sᯊ"< syh\iSY+·g>i?UmiHg5 gԖWTkGwMVޕw . 5=+ϖ%9llO׹ZjM^hCahvD&}6U>#^yWx7Nݳ񝆥M-|[O&_x:'oI3yq;_3}&wz?bQwU,-a<&ߺ~ґ?OJ> |h)gGM]> Yl7=Fi֕xO,iixMǭ_x>2>!tZ8FOdWֿ m):ͅM[Zky|z,(|UXxO]:KK>Ou?~oJS>O acR7laat"4|N7J$4umOPQt޹em"z˿H]?o^ |C k=W~|yaiz3=y'Qx_sO xfOͿyO|=7G|Wg#^$ w;;|Is~$׾Z4O]<כU^xR7iCka?W9|O>}~߉V)l᷵RT[w7aW/?~*MxC?:庺htl>#_/kK / +9/?΁?pW$OW~L?'OVG4u=k#F'?٦?d>(&/öEt&OB+T[5xW!𮇦[J[ig}u^8?jk? 6Go)-Sb}+ZV/x_Ue@|?s:D?Ï<xW4?xKw%7N?ʧ|7yXh^3״ >ˣjLVɥ4ceV_ٶMwm7UKADg,i?!䯘,3|C'juڧb6"QMk_jr?f]KᎩ'1^\~RYOzb|Wx٬kw/E-śo}:oÝo[6qlh{q~fާ7~4b>GςhMهNzq˺?CaG᾽ gϾ\=IGoFM6j֮rTtge޼P{y>yH[Oha.97^C^}oJ:59|3kȮPs=o ÷V!쉾̚o {OYw^u]rEfۥgaMDw#V&'ھ$~NssXkιo47_ U5lYD9^5rIm*'soy6׳h?c}K~0Ru uwo?.zN6G#Yƿ~ynʏaxgeO⋍:TM}RuR}o7lxgŚ%^}_1]ͷU>ylr}⯫$?}:vqlޟ/-e,㏾62^FRw'j=s[KnZMͿc{}OWg%Q7nثsyGIjm쎆NkgKғkG/<:|!^%/T:MV[,&ɿжmog5[C|<GR\wr]b4{;b/T\!-S>%?,;Xn?%fk7ivna}̟l'U?tCi>__"dr|ڔs4^F>'۬&KHld7|cTfzזvvzVx8V=Q}.`0_^.؄C?t7p{8Q{V> Myy&E̖ҳMFmj=@q}r7)5^luNEo9O;P|={FM;(}>I[G+j(y;WhhR8,K:4 ?bk,G<DZhf}1 \צdM_78~m'Xim\k3?iM}/>VØde+Bg?.mRܻ#M3TKZj`}TK:ՅwEڂhYz$f%6$ûPH.4߹myuaZ[êo'܎4P)RE]=mB;{gM q献DѢxojLj^Cj̟ƭ+_oX?4kmkH}tmG6ioXj6vo4/}gs ٧v땸,PƟ>y0n[F:q诇~.u{ xŞWwPҾπ,I|I|uM7UI.!m$G/]Jc.'?g}םȀʷkoMggaCZfxmx_G|Hŏc[^\oo7gܬ xZI'MΨ9RxZWd^H_KuK? ']g/Eē^xB9{nC!Λcu=+xcAO}?t 8[]WYh]tA! :l;2G ̟]O6q˳΢^-dR]ES88D0O3MB+|&w7nSOҾ8wLՖeͿMޠ z57/cW4Pyy*iQyÿ_h+eohߵ'w{8qy_M6HtKfg+GNs&yѦ"WͭͳIqlݑ|7lj5Ś^h|=F"s{IhVu`ZK?=ŷlo'G{Gɿn'/QI|,UWo"߂tj/DH~uz߅ݎ~*A\xy G[ ~?!7l.&tg#|rL =CźxrAhg%w^.[kz/7o :HSyT.t'bw_&/1Gz4C3Cw ڥv#x}fʹ!z?[hM-o}r?_^i{|#y_Z:W.-a_M)oWOQ&JPKi_b'Y4ٯo7jgaP}eP5CrcH.ذU$=I-Em_ivwG-+ffF Y.7~I Ůh>&Cm#>Oz-.,_My4.*OJϹ^w}h6ɩM%α|[~]\j #57g{}9uk;MBOQy?}5gVK3xM+{>JR.dduKV~&o}~M{ ~2=Bkg>+UԴչI47:eoBpjm]:3\Im<mz1&V5;.$_#cWW54ޖygިixGƏui^MU;D  k횃ۻq 8;ys4cO~ˏq'*I2Ē?[zI^XA/f?+gs%圗2..鼈*ĵ/.&gܒF?ܨnR[C&,G7פxZEӟJ mymdN-SG~?o=Ox}5E%|aYgV>-uQogb>Oo.K=fM6:?"?uo?p6V~"H5U?{r,+io%uy#?gD~m?ctgd>Uci+lx\m6_&wOn<*-׼Ga6~٬hjq7ȰğOayRU.w|/$ K\wm%,JSuShmw_Ჵ@{m]#_[sT4E$/5O4]zMt*XEW~&ӯ i?|Y?})M6? GqSīS5A˭GXwy7G^WM|l?גzo=f|}* KK׼%{k{[_6*kwSiSזVq_]D.|Aou5_=)t5ROwk )Vez.esz̺FȾ׵=bd9Y$O-:mOQOCoM7ZZ:lz^}KoD/>)r 16=ν뗚tdgܒ}G]/:zl> {C|Z^UǛ=1!g[Z^񇄞}{-B$wV=Hq⤋CˈJ4d;#XG]?q-^,&xf!mԗLb|'Z|IfyO{PʯI"o{To6W ~#IӟHO@}ٿ=iOU jw>o]/Q\*a&)w__.o.i.mw-u~Dk몍V 7K5>]|5x&OV0б,6ro֟zVٵߋxIG,yW}s]6#ۼɷۧEi[zu+?MF{mC[HѼ5kpKGn_d4VEmb&T?_vúPMyg\j }txk66]nHa_)鯣<[qGNGg]}+7Cmmgi?wxjEG.b$F¿WYo-O^+^Mw h>-{?yֽ/:6vz⩭.\\Gu?bQCo麵4zuo _'bXޭdP۾VƩ[M8__+^^\˽͍: w=rƞ3|xohdMK_jf},2qyg. %?6_3]`2ghf4_1jεq5[}[f&X\|]Cso+#̖r'ܹOooxze]}"O$(%gVvL?;Lmޮ6-f]%rڡk[x\ǿOUSI0e_[?g Cr5ݑWf\}#7WW$[7rˉ? HXVx{mLC74>O߼ff5_w3s&UV{{؏c|;94;|]qT1M?ZnC_7?@G4%6%V:{W k4[ϱa;\LL #ɾO<ϟuYg4.~*ͪ~dޠ $;&B{ :d-v#~]z{sqmOmȲ:猴XzM oo+Hב0ԡԾY}7^yŘGj?]lnhiIQKXr"VݯC}jv6Ѯڿ2+iw6[^^YF_۷6}[ ɗg/=f42B߹WKhVjٱ^o\C~M$@]]O3%.浺vivH|S5:[M7;IMy4vsH.&Jĩyaygs.ʺ}r{I2xc[Zį:o5QڢeVOL&{?{|UC.ge_}ś_^GymEsY˽o/>zy_j :6=s䵚8E3r'SirAiumsyƻ7xU6y{ml!__e8 fʚT~St*7o>ǿlQ~^Xi[^h6OLevө O-yޤ7,/=?~_eLЬm맱[yOayy5Umesq\%cm6|i>&޷Ᏼj:*OloMd[|Yƕ,?-|#éh2^i}#gQih謹kMgH7Zvsvߌ?dEyw?]o"xL5 X}!dW2sgWĒy>$$Ԭx4)}ҺѶO ^k/ڑ|/PLj?Ktl6{${ޯOi&t'n,c7~>XO5,9"y>w??t"+MliVrigz^+[;?/,wܯQ_|:tK5=?'^YYǥkȶ3䯵~\K7K~R߮:i}̿܆/^V"ZfZ^J]Iu fϒ ?ֽ¾\Y4(9\[Ҽ_n5+=6[7>ǯxWHoYV= y?委]pW,tSo Ğ ~Br_R/4MK2$i _lww_}3=Co*j[~d2C{z|[xzL7V%7EG>"1j_MG[>_YcGOW/7Z#w詩4g_vX𿌼UW9Ԭ"K-g~߯yROxl k=_b,G"<+P麕:> Pκ=gfsVǫ&D~߈_O ooRX{m/oT|E}'^n]"DbKi-K}OCƃ~-O>[[=Kw6;fG|2 ]hx˿q} ?D?w"Я4{3UqoT[]q"Mj@մx/vm>(=Eu{w|oOM/Ǟ$סj'*}6gtĚƟVgl"߱hv?_2Sꗏ-+Tm4߿iW>0?P|+^%#~Z^-i??_<5:x|1C$y&/0o jh^񆕪^h!{w۽yw4 >|EVzN=q|7MKRү/'jSiKd 7ȕ>*QxwVM𦕯hy 4Oޟq_V?*/,Q "9Zhml+xoRO I5LOW[6fjK=ۿWz=6H_[yn:W=5C2&5Ŵ>nidOws*W7u<>!|}kI%?2|qim_y^,?Gi|"5ʹCmlÿw|&ݎy;^Z}M t/݇sdo2tx͵U>礇jߚ"o) ǿf224}zh^8ldxoTV~msU.q̟=Sf<ݓ'>vZV_46h~$ұ7 2I7c\ɩY۲/-wW _=hYQ<_#K:?6vx{[>46sM%ylO7cihw|ڮgyxeW2 +P?cMm(+ڝk5=bBʕ̕U9?YǏ.WkF*@{S/V3J[Ķݳs}-_8>_fΟ6[nGvgޏM'ZUr{*}S(SMԮlڲ[z=¿.~I?WyG?ݪj ?+zzIha0E'[{ < xfy-1ö=wz]WKGŋ[l߶v7~Vh7o\Gufl]Gu{::5<7scD~9>(F t>5-: ;zb'LеCԼagO fk/͕3XM C:\?>_"<[5M<;&v_nO=O.Կ 4;km]k$;IΕcxV؂]]zNe38ao!Dj$J'Bo#_m q}Q!G~a%n&۩gXmH﷨[|gk/i#$gIOeQs+$ke7.͛* 3ިLͽgm2ڒ;hw_q41ڿr2XnlW{UwKW!$1~6_U?c;i' nsc[jSc'dmzº=W[M޶?y.\ioakg?׌7x[gKkV? |/M#ڵ7!vsH>}oI2Cyaqgs'H/i6:ֹmY^H7|~ҵ,߈> ^^46O)?ۮ+Ïx/ΣԷ[tJoj}5o2[%]Sٯ5vt+.oEszv/.uOͭwcyj:tc@|6zޕ h^_jo|O A%hŇǨ|ENm|#Gt[='磭  ڃj7ٯ&.Wcm/1MOWZZiڄ-um G kU_?Ugd xΟOxbZjR=Mggqē//+>.+e/hj-MR_&o/5)U_z/DcjMpΟs }[czXmO5hxzxl-.o?F%AsYq\ڶ/%ڵ2C 2C]:/? 5)-coOtIizvK;Sgl+֦JIؾ]^S|VxZT\̟7*߄y=C%+G]FYxw/:ԏ<gnnO i.sWkH3'g|NR4}oºյ(Rf=ܩ/~Լ@0~mq>)[EkK,}c~]&j 8u-,5|ۉ$[J{P8OK\fuzQԼ#whyi̿鲳_7i$Zgm|Emf+RCx^mɡW5shkȎ3N𮥯^^^<7W_?K;+\$6<7VoSPi Ү|Qٵ4{heKlOw>Ze K]uoZuOxQ1#Cs%_}MD/.u/-ooaiwTߦbz5M am=$lDIM:|d"KZHR:VuK Gu\u 6an߼`,T-<+f=EXΞ >stsG[I6'qM namY#5O/wX:N jeHϟeY־!iך7/gYmdxĚ-6ڤ/x|]> > o~{;;1?p<_tJQI\g~<ouiw.ZZRuSoY%-?oIꗏm^i~}aY>tzg/hηM~ 뛄k$i_l'i&KpW\nt9?˳xaWGM-bdͽ?7n&rn&>?کΓܟjZ{F>I'/:g WIll6?YXXQb$o~orCq41q5:M'C|DXMgw<_TKh_G4}vȏu+[VM6_n+o" 1k]ex'GWh%/G1q޼G\ WDw-.26ɧ[G 'sֶ:6Vy¯??@J/|`ԼEf_2$ltOxT2F[V-;A_2[s/"_O1x* 7D%Y5/oNGƟ5-* ktAtYmKz5k>]K?XfE,#<sN6-J_" .%z CDm<HĻf-17t?yxڰ|txU;oݮ!o~'5GٳZ/Im:owcc1T(d |ܭyPl-tZۯ#uwXc[/4yuoqL]moj:YWPyWʒdg3&OIZrkqq/^ʰ)izCZ[M\ Կi4[k9&o+K{Rȍ3q+_:iI>K/?d_΀96dtoO2rKZ|ujywi+Xv0[?RtQ6qʑscוjZͭ[$:oud*}v>*ee ņwA6 ҍ?\64Yt)c~+gOj]JWW:d~şٶ{o!եȕ>r_i7敫_ى>#՗Lj{iK[6طWGWƼ/am-֟oTnWcKXۨ]dOIgQ/isq&kݓΎo?IrQH|HayeM'>ol_k:a5䖚n?m>4_oG&آ[FϷr\^^I'|Uyf%?&Dxڝ;6Ey>pבVtUŸqP d5Nb_/:_4ǗZyA8]O_:_yM\ځ)ϙ>'׵\Eͩjw-~=D /_xyek[Z'D~Hgd6v}w߿OB3xI'j~,n#hQ>{}bSwl'滢E]<{n?_~yo֥iMoFW4Kž[_XgUpt۴47Q]|*(ۮyO~jyI -{7$xGȺkkE^Kx:Vb{@)LO<;";Gڮ_#uh5{*ESbɪ/[~ sa/R/6y|Au-i/mwXHK[|oMV\v#yQ}_"7s䭩 z6},mq ~&^u[mD}"*&\W > ɪY{MҬ5]V+] V?zDr!cp7ovY~WcpM[fK&%C4 m4Vn?{T!y?_"ԉ'S%j0ɳfռZmagj1leIorlw.RLf?ڪq??ޫ0c+(ai7SA" ~tTf)2F21՝~)9?OGyo?gYi&ki?':՝GɝN6*_zPw+7g'm2R]*/ߚ.^8O*,ISy$O2t2oQs^Sc%6ooŨ>4)q|*/qG|y?_I+~;m7ΡsMC=f| l~O=،RH>W/ʉtJ8<*S(m5Z_K?DU?xmWM&h!E5GGn 'ٓxztRK=*DK_2W[Ob=[Gny^/'W,?oJ_[;]6G. ۾?ۣH9f<ƫ29[{ϰl/_ lfeϋ4]Ke?߽H㷳۲o&|:>vv?l72۶ST|C dI{fҠ5˛8mm5۹uwZ/,>өihsxX<g-J_[[nu7y?خAٮt dž-'Kw4V<בw$7Pf/ 7Dٲkiohc%M麤w+4\s}c|~O&8f#H!mẒ!՛n>gxm]_k 6أO*7?-]JXԯ./&?oY $72E>Gf"yxd7𬟼}Bզ49+ly\ܶȭ1?ߠX5ĉsfG6]o;'Www:sX4 xKva^ŭ6[q&WKփ A/Ia,QK%鎉ow7 -C6w0ǾKK6WrZu;O.v$m\f渰ף|}JSKGc'#t-WXH%K)|_^3It^ٴO=r'G?ۯ o{J.xTW+پm>5I?/S'\SVg>'6sjRx'Lگ~߯u6z߇mlxKP^ ;PY_Qkgaz=x^-mVZu[;Xy*Iwrng\W<+>VSsO :?Nt\*{3m1G4C*[[2 ;gɳo~-h>iZ c]>MW.|O?k=_z{ )?H^:q?y#n5I/16aj6ѡao;C7[JI/Pğg ƛ|c;hOQi/g3GUo{[ΟWmO?|ioxѺ[{tWO&ܯLj4٭ _[{\Z]ecŚ߅hu(o,CH-dOOw{=K񞕧:?vYMYlO0yaq4WzVnʝa ~|%w&iX{>.){'+=?,Ah#AMti>3_g7zmνh%W%~t7+ȠOQ,FcBtzWPߋloOPg"}r+h^p?ܯ`3zf'1ͨ?ݵ5;C>T>/x=Oo5޳,aǝ+G~V~>yY:忴ß*Kh><9\O^ =K[쯴֥IUv?J~¶ol/ ꖾl ڶs'm^'7mMh'4ao1|?ž ,%{6+]Y$/>^Ma K߆>05-ז >ygǹMZŞ{X[^ nl_Tٱ?kMֿ|;:%j>}?y)2MWx׼?_ZRe|{)О zzŞJ͵ԡx&OX,biRưy?ow⦱kh;I{yc:}L|`Z渉ya7}R_|5>;5u rIq*j6n?^Kwú}=cM-w<^>ovWM=cAV *'?u>amZ[s\ȟc.}:"V~t5/O jV^^W}bhOs/? |;co[gV!Q?\fCIԼz'KR_2+;C>e9s-D[ SžUvDJ_^4 iu||55e }-5ޕx#<;hk~kn?y)WKSxɵIu(R^u51{ ׮*}S5).y˽c"?F^IK$%_yDVt>ghzt>" nf}C4y:6^m=~ľC=i G tԖ3Csgs%ͷݚ?(X^^imͿh-R_V=o%|ֆ'IyKz!57 ߓwt$1Il7ݡDyO<\&u@嶵,{4x, khwCMYw mqGt~ԯ/k9OM(wIu=? Oe}W~ux|7ۇt_o̐B%w>#UNJA>԰A,=%e$v##cChu+/RoEq?g|J.|U6iik}mtG`VuxAbK5x? B?,Z?do4ؚO/I?\߼D*pr5%WyAEV@,4O֙Dr"L4j?y9_JDz[CC'}Ҷ;;+?`\?Vmie?µٵֻ!KO쿻D 4un[#=sIcZ&Ԯ>f/Y}hsh_~g:}%Msm=ZkkqT;Jww\nV_3RX0?a ,Ǖ,?G AisI~@>*y~#e(+O jXonO:Ֆ{OL'fsoݾמS\}Ƌ}8Mol]̗eV?߯EtOf_:R/ConR4aA4;]mƇ$ɶF͹+o& 4}o<DŽ h -B$Ke޻oxBk x{Jn,. j'\ҴۃȻJn_c\\.ǚ}3OhvKim9:tuųgIυmu+mGlWR o\t_xGssO$?Ribo_]Vg#$-}KXxM>{^/%pؽ+F8^=c%݌~m]ͯMktHh|o&K .R/*]QMΡaj5Nt}%M=ݴwzEO/T 0s=72o֜ ڋG/ DM .]g{'2[[1mrto\ay]ן_ KyImniސț>O^yi6>g!v$_7V=6h^7g_״uK7O.cpHzl@띉U٧ڰdyVV}G~?LeH/sM(53c_.=\ Vi}᫒+\KA|$dۦFɅ̳v^OO>ѓZ7^GiqhƟ~-mQ1?mtUԵ7\뫝=<=#oLu7;%Lg%=}TW]\֕iMym]|sȳ[-ݬ2.wl}˳oօܚ.aoIkvt_xS|7]K8d 6Yh+YPq-ԋ3^#ƞxĐˋ񭯟ey-jzI|߶~8?_ZoJ]\@Xݾ\CUuH> yo42Z_ ><|KWhփOE "Wwj\O6ID{/7QдOxu v,sm~ ~#XMMc~-l.<~Ͽ_6LԴ vs^^mi J/]xmk[焯?èOb=翕 ?E? yv|'[kK[j}czćNōzyԤּI\|гl*+ j5Om}P_x@д-ž`6[.ZxڗxE$*d\I?[3ViK{?.u;C+˸Z~kךoo{(<*@jup,2g΃^h7GU4Eɿ3g _)*[ޥ0q?M@4>&xEy]Y '^OxkKxI>t:ZּK?l5W}$ ?4yZRZu_u f'gP6Hƙ'RKv_+M ís-?E"q*:ᶒ]<Tփ3t:ŶKnD냷V7Ra.&VW|YuF}^Ӧ|8ԼMg}VԲj^|/M?߮-)x_7Q藞O[dA-r\^jyQD9k#.Dv~vXt:^/n/+:%潪bO_[x>;D{3*y/ڶ|%e~vخBԴLL}oeL*Ԯo//H<ո[߫e+a3}|S]~Txo3Cblwuw| naM[WRdi ~_ߧZYu|ERMMqk/g/h7Fv_+CD'>X5Dlo/-wI})]~iMIM??QlN?5@Jƻ͕Wz޵5Kxo[I~y|>fxSɚ7 lk>E:qх$q#]j}t;wywڰ"'TJs3Nk-bG,+Jt,>u3[,3:l3H_?Ǥmo.wu+cEד>hy/0V;XRo5Wk{,M 0_/}Yɍ-b>|}dsTiN$e>O۹vvП67|@(fj[  d>\=>ul濶kcWEY$y0zyñI3oC̍7ٟˇ*}@<0><o/}33ɸy"yֽZ֣zoFumS?+<g75UGHPX.u)İ\FWč| KuGu0o&ס4{x~4|+}gi%C:Z^ ƥ_;5sp\K3̟dzH9>_CſBʸ%InZ֑xlxM-6!ۿQuz~g{.ڼx/RԬa;;i-ho+wK<+"_,v)؎/7Yͣ:^i|6j/7^'o'_ڗVg;me|1{gŒ&⶧?<;~񗁵mK¾, [{Y˒k?zxG/?i<g)?ύ^>0o46j/w}{g~\GP>u)J_eG|ñ%.tˏ5(m?s_y:a֣4ZO2E<"M=MS5K <+g,[nH"V>x~ P9>X$-r/:u="<G߆6<ү&.<ƙ?DJ~|MIzozvwy{Two,0x"{='Z_p"lf]o)7凗*P>.앧;D\ឥ xU,4u/%7-V|3EmXu]UO+}ږ5"qد_1pm/mՍĻc}hZR4>楯cL} y ȏ-?Gf:htΑ~'}*oAujZ7kN+ylzu+.*,?~< yJĚ{}+_~xKV_O0MLJ̳/ZW< ^]y^uƝsxo htiz嬶zMwğl}Dq'_5[ğ yg.nlZ]$_^?GD𗁵_跏,:IBw9Dӧ¼7{.Mcz7C{tOg M2se}QI4i=<7Y黾ǭ+η֤/?b[ Ե>-:lW[l~;mm9JuZ^`iOA+7f~[xv%}7l|767㰳ʞk>?|5JwBP+uw5_NEa~q{ Կ?e |^&;c\-v[nͿޟ|~V~-lj{ZR6<3WO㶋vח?h6->K/7[ 㖓$/º:bwo*x.D|u{^c[q/Dޟ|#7AY|y鿒~xhxG>NY'>k7޼'߉ZMK=pbkI'o+ep9/96gm;;6ͷS]?k²lWRg?%}؟l ٴ)>{ nG}.ן t K.^<[k};ΩWnj>2^x\|Uiqx햲?lNtYga༆D^+5->htC'ݛUI,A5)z4;.߇}w*}CO > :/|Wǖ a5źo x2_l_^tE 궚gsȖo6|gĖԡE?}Y|36._7F'ƙ5^]yZOotJu?Ƈ D:@xO><ԼUOyַo2MNGsmo'ӑ⹉?|:VW_f}g=|%b/v͗A?|WCW6$Ҭk]A3~w;kTnY`*ɾ-xWzu ۅ?s4JyZOԦR58fX}oꏅeԬKk8u?$MMr~oBM 0St=JKHu+5$eesşjW?>}I[췏n9_>0RPMJ?6}fȏ/M\vݶVfKOw٪6;~OǸٗ;~Wz\l->}n!)"&O?]8y?lo^[|QF꿥ZfwzCwo,@ ͺ ߼gvGC&˟I?4r~TQpc4нͻ~mմRXc路_s_/mꋷ ޾9o0~,~㧍VkY7/y@'4|MY麵mnbO#rΦcI鷞:u47U:}:[Y$I_ ޛu^;7:TͧyCߛd[!SvɿéM{p=⸆h^R%i@*O&.e+0=FѮěILL>v.HSߩLhgt=_(tX[cִhI!,<ϼ~]7gk b8Q/fTT/3Jiu'ڼm-ﺦ$#^?os;+h|˗W][mZ֮~hhQ$Xz(o]w>٥IEqtw_IEOg$sj7[T7n_vWjQy?﷢0u5wOm*_ivWt^vTʊ(#kwyXtKՉokm yF,袀; xNtUhZQqė>}G7"G㢊ʪ5]_;j[.vvyK~aa7o#wu(@Um/=6m:(ff;-om*m߾Evi:UٶM"U?rlVҬ[綎d߽Evṯ!Mm5ңo+*-_:aaym6_>OEyo:I-v+NKi?卿QV{ -M.eLm+"oer}m}q46IUpQZ{VNj0xO܉خ%g hٳؠ;t=ƛY?lcgCuoht]zGuKߴ]y lQ\rzD?J5}Xe+.o[j`xyEZ]kIntvm],̐H.cg۽ob(ūL'^D߹[~~2[.~l÷Eu{S 2:jVdo}zϡz-6/]oy㢊WR%Z<YMy=cVv+(2k{}e~\r}(D\IM̹7pҭ ]J{m+O}$?gk+\jZijoֵ cڽΫX)Q@=iqigody]?ztcឩ ~'uˏ*}QEp*4Gs\?Uו-["eIC%򤑝"H ~HWO($Gf$_8Ml55&S/~ƻk?o:5嶎dp\E)?(H`]V上?-~_x}z'!V|=?ĺ[_3dQQM u-.T3\Kl7F2My%֛aqX6-/(:iHg$%3mjUotE= SWmjWd˯v"xJ}KRQ~jOMዻ=ABD*&eseWR]x:=MpR}/"/++7Pf|gmm%W(%ս3Y^[ߩ!,>{xc+EMSMco&%!y<kOEo1ji/]Ev,k?}3oؤַ[^DwlseU{FSO4+CjmGM{rRKK}5%?%T{5}Kbk;=7M}\/rMkSռC}e047ME 8)[i}'OԴT>4߲"%GnT(D}q{s_|7HK'߯oox]=z^K}Q^]*_tMso5ώb/&g7cx>sh:4iq[(sxW¹nnuSVz;u^ /a7\w~ioQE`dr#~RuS:}R*$Eiz>sꩦ3.J(eRFGyy\yj+c/h~V#QAX|DIfbw4[EY"V롽GxWMZDլ4""/r(5Go?[ztQ\~Շ".sn)w_o~Ed\rds:IoQEik7ٚEuB>GS(7M >_?EK"Muy_h~_%ﴼ2-*E ;-ȟoxThh0ꑤZzy;>=(0{3_h Ɵ[EYR?P{5x~Zo( 1/?soq4w^r^~EKY^,NLJ=z-㳒ԣtfi#_WMW,:+{þ JmU߅nt}#l[nn?盦+NoociVԿ(eM5+a]/PY|qފ++i?4yz(kMy6º:!iKoWߞ ׵/|7%/[*I"7EyK2U_}W_-DMכ|?' _ߴo=OYouKH"?{QErueWp>/Bx:߃$k6d6O潰jmX/$^o<ޛQOأٮg 4K[VH<ۅGey?g@n|^}aZ~/g7:q!=|^ּC[x'+M6[{{ԻO!?x{Zh|Owv2+\TZ/WJ[MXrEE>K=+7Q,1%\%BIQEtftNOOG>Ϫ_[K-6y}LJɤռs'/.b/ źO#袹S4?_ w_6|n4_ܛJ.MWwOoho&}J(i fj^NxM#V$F<ּ7Ꮑ+_jEȑȏIM3ZZAo[G>*h$:iaya[ͧ޽"QEzk#(~oǖmw[Zk"t篺s|&}cFouK:QXcf۔Dxo|Aχ>"7zn{h_Kez׉uH_|E⏳]ǽJ(`G|LQt/4x՝Zft=ҵ/Pjm]A l)вxźNG6屸dSEL\zŵ^hf{XE~ՁwZU76z:I'ގE"od8l>TU{yw<h:)4uoIϞ xva5PWI_tz(7ռ3siZj/8=eLuM&saqkdy7EA c^^Oxd/ױ@kK,.~j%;ğ8]袴|h~}H?􍪯+6ēMsy]/Eҗ)Ȍc^[Aߙv^?ysy7/pR(Ks-6IbCgyo[~ ]#z?4ogqk5ڬf{VJSn?hE's"0ۓzT,Ϳdu6QE0o57Mqx:4lK=R6VڳtQ@#oɲG۟oE4yZ.;bI_EhΫHSsgoXj}_r?(edq$.[]zD~/4ҮtM/Mtw޷V)}̟>(e;{:MrO㢊9{F,%vM}vL}QYјR^*oMҡX.??ۢhT//jls&e=m͛+7Pjm= 'oEG":=1|u;8tbw]?틥PW$6s_cCMW6lbCweb2py-2.12.3.orig/applications/welcome/static/images/favicon.png0000664000000000000000000000050312564727260023467 0ustar rootrootPNG  IHDRabKGD pHYsHHFk> vpAg\ƭlIDAT8c`x6?6Ƈ2X*'#:Y 4.|ğD{$za ;d#F YM o4ీ+p 1^e^xԲu 7%tEXtdate:create2011-08-24T09:31:07-05:00hм%tEXtdate:modify2011-08-24T09:31:07-05:005hIENDB`web2py-2.12.3.orig/applications/welcome/static/images/facebook.png0000664000000000000000000000173712564727260023625 0ustar rootrootPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڼMhA;M[[ Q+B ~ԋ(*D"&_'^"(~APD=XڪմiR&g6[ y{7;p(Tj8 ?CD~mz({G:4X$/zȖ}g [WbxYyʅO0k7gxu?$-XK|4 M&3X(J{ݐl `<cXPLɦD|e5p>/n7EF5֠B.ѳ@)c<փkVr(U s ])W.;_ubH=houX dS.,Ek:[P 2Pk ~|.N-ٔl ʿJl2 '5\d0tNذt kd^YǓ[ c;oA0ݿ_ 0,q?78IENDB`web2py-2.12.3.orig/applications/welcome/static/images/favicon.ico0000664000000000000000000000030612564727260023456 0ustar rootroot( @EE}E)E)9)UTTIU)T11q1web2py-2.12.3.orig/applications/welcome/static/images/twitter.png0000664000000000000000000000214012564727260023543 0ustar rootrootPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڼW[hUee k/K# *D4_]|PAW>(Tl >UTE'ܤm&mf9gwͦ3Msٟf￝?52@2ڝJe~^SS?|ܷ%y%rO]a\,,Iw=#Hzr/@Dנo>i$")k5 L$FӘ)FʌQeW(Lm:#td 041SWQH!ãa*lfsboNF"pu|:6!|wnF2j3 ~fպx$mh+wdnBLE}5 os%왉MTp/!`X,C= X oVm%@eX7inp.[[ĽêB+Z]G +DOƠ׳}1 s6tB'`ƫy@W ~)9z3T=!rcWwbn;6Y*75߽ҩQ/')U5 .[` ~zIENDB`web2py-2.12.3.orig/applications/welcome/static/images/gplus-32.png0000664000000000000000000000275112564727260023425 0ustar rootrootPNG  IHDR szzIDATX{LSWwlC. Dtn3>%l.ɖealc.&̲WAPgi)(g([ZCo*&~={ˌ2֕]D&(H6rOߗYgfB!CO4o˜!#~ygD-J~cq#Ь E͚`T'ٻ jzfr.QB- xemCToˠBD*>!EUR3lc#~X?\PڞȵA}x{| u6oEn1X! O,EQR$@g0#nѿFXnх!-޲sk:_"kJw>/H'~~q (X 3{; */ } fieldset {padding:16px; border-top:1px #DEDEDE solid} fieldset legend {text-transform:uppercase; font-weight:bold; padding:4px 16px 4px 16px; background:#f1f1f1} /* fix ie problem with menu */ td.w2p_fw {padding-bottom:1px} td.w2p_fl,td.w2p_fw,td.w2p_fc {vertical-align:top} td.w2p_fl {text-align:left} td.w2p_fl, td.w2p_fw {padding-right:7px} td.w2p_fl,td.w2p_fc {padding-top:4px} div.w2p_export_menu {margin:5px 0} div.w2p_export_menu a, div.w2p_wiki_tags a, div.w2p_cloud a {margin-left:5px; padding:2px 5px; background-color:#f1f1f1; border-radius:5px; -moz-border-radius:5px; -webkit-border-radius:5px;} /* tr#submit_record__row {border-top:1px solid #E5E5E5} */ #submit_record__row td {padding-top:.5em} /* Fix */ #auth_user_remember__row label {display:inline} #web2py_user_form td {vertical-align:top} /*********** web2py specific ***********/ div.flash { font-weight:bold; display:none; position:fixed; padding:10px; top:48px; right:250px; min-width:280px; opacity:0.95; margin:0px 0px 10px 10px; vertical-align:middle; cursor:pointer; color:#fff; background-color:#000; border:2px solid #fff; border-radius:8px; -o-border-radius: 8px; -moz-border-radius:8px; -webkit-border-radius:8px; background-image: -webkit-linear-gradient(top,#222,#000); background-image: -o-linear-gradient(top,#222,#000); background-image: -moz-linear-gradient(90deg, #222, #000); background-image: linear-gradient(top,#222,#000); background-repeat: repeat-x; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; z-index:2000; } div.flash #closeflash{color:inherit; float:right; margin-left:15px;} .ie-lte7 div.flash #closeflash {color:expression(this.parentNode.currentStyle['color']);float:none;position:absolute;right:4px;} div.flash:hover { opacity:0.25; } div.error_wrapper {display:block} div.error { color:red; padding:5px; display:inline-block; } .topbar { padding:10px 0; width:100%; color:#959595; vertical-align:middle; padding:auto; background-image:-khtml-gradient(linear,left top,left bottom,from(#333333),to(#222222)); background-image:-moz-linear-gradient(top,#333333,#222222); background-image:-ms-linear-gradient(top,#333333,#222222); background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#333333),color-stop(100%,#222222)); background-image:-webkit-linear-gradient(top,#333333,#222222); background-image:-o-linear-gradient(top,#333333,#222222); background-image:linear-gradient(top,#333333,#222222); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333',endColorstr='#222222',GradientType=0); -webkit-box-shadow:0 1px 3px rgba(0,0,0,0.25),inset 0 -1px 0 rgba(0,0,0,0.1); -moz-box-shadow:0 1px 3px rgba(0,0,0,0.25),inset 0 -1px 0 rgba(0,0,0,0.1); box-shadow:0 1px 3px rgba(0,0,0,0.25),inset 0 -1px 0 rgba(0,0,0,0.1); } .topbar a { color:#e1e1e1; } #navbar {float:right; padding:5px; /* same as superfish */} .statusbar { background-color:#F5F5F5; margin-top:1em; margin-bottom:1em; padding:.5em 1em; border:1px solid #ddd; border-radius:5px; -moz-border-radius:5px; -webkit-border-radius:5px; } .breadcrumbs {float:left} .copyright {float:left} #poweredBy {float:right} /* #MEDIA QUERIES SECTION */ /* *Grid * * The default style for SQLFORM.grid even using jquery-iu or another ui framework * will look better with the declarations below * if needed to remove base.css consider keeping these following lines in some css file. */ /* .web2py_table {border:1px solid #ccc} */ .web2py_paginator {} .web2py_grid {width:100%} .web2py_grid table {width:100%} .web2py_grid tbody td {padding:2px 5px 2px 5px; vertical-align: middle;} .web2py_grid .web2py_form td {vertical-align: top;} .web2py_grid thead th,.web2py_grid tfoot td { background-color:#EAEAEA; padding:10px 5px 10px 5px; } .web2py_grid tr.odd {background-color:#F9F9F9} .web2py_grid tr:hover {background-color:#F5F5F5} /* .web2py_breadcrumbs a { line-height:20px; margin-right:5px; display:inline-block; padding:3px 5px 3px 5px; font-family:'lucida grande',tahoma,verdana,arial,sans-serif; color:#3C3C3D; text-shadow:1px 1px 0 #FFFFFF; white-space:nowrap; overflow:visible; cursor:pointer; background:#ECECEC; border:1px solid #CACACA; -webkit-border-radius:2px; -moz-border-radius:2px; -webkit-background-clip:padding-box; border-radius:2px; outline:none; position:relative; zoom:1; *display:inline; } */ .web2py_console form { width: 100%; display: inline; vertical-align: middle; margin: 0 0 0 5px; } .web2py_console form select { margin:0; } .web2py_search_actions { float:left; text-align:left; } .web2py_grid .row_buttons { min-height:25px; vertical-align:middle; } .web2py_grid .row_buttons a { margin:3px; } .web2py_search_actions { width:100%; } .web2py_grid .row_buttons a, .web2py_paginator ul li a, .web2py_search_actions a, .web2py_console input[type=submit], .web2py_console input[type=button], .web2py_console button { line-height:20px; margin-right:2px; display:inline-block; padding:3px 5px 3px 5px; } .web2py_counter { margin-top:5px; margin-right:2px; width:35%; float:right; text-align:right; } /*Fix firefox problem*/ .web2py_table {clear:both; display:block} .web2py_paginator { padding:5px; text-align:right; background-color:#f2f2f2; } .web2py_paginator ul { list-style-type:none; margin:0px; padding:0px; } .web2py_paginator ul li { display:inline; } .web2py_paginator .current { font-weight:bold; } .web2py_breadcrumbs ul { list-style:none; margin-bottom:18px; } li.w2p_grid_breadcrumb_elem { display:inline-block; } .web2py_console form { vertical-align: middle; } .web2py_console input, .web2py_console select, .web2py_console a { margin: 2px; } #wiki_page_body { width: 600px; height: auto; min-height: 400px; } /* fix some IE problems */ .ie-lte7 .topbar .container {z-index:2} .ie-lte8 div.flash{ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#222222', endColorstr='#000000', GradientType=0 ); } .ie-lte8 div.flash:hover {filter:alpha(opacity=25);} .ie9 #w2p_query_panel {padding-bottom:2px} .web2py_console .form-control {width: 20%; display: inline;} .web2py_console #w2p_keywords {width: 50%;} .web2py_search_actions a, .web2py_console input[type=submit], .web2py_console input[type=button], .web2py_console button { padding: 6px 12px; } web2py-2.12.3.orig/applications/welcome/static/css/calendar.css0000664000000000000000000000561212564727260023150 0ustar rootroot.calendar{z-index:2000;position:relative;display:none;background:#fff;border:2px solid #000;font-size:11px;color:#000;cursor:default;font-family:Arial,Helvetica,sans-serif; border-radius: 10px; -moz-border-radius: 10px; -webkit-border-radius: 10px; }.calendar table{margin:0px;font-size:11px;color:#000;cursor:default;font-family:tahoma,verdana,sans-serif;}.calendar .button{text-align:center;padding:1px;color:#fff;background:#000;}.calendar .nav{background:#000;color:#fff}.calendar thead .title{font-weight:bold;padding:1px;background:#000;color:#fff;text-align:center;}.calendar thead .name{padding:2px;text-align:center;background:#bbb;}.calendar thead .weekend{color:#f00;}.calendar thead .hilite {background-color:#666;}.calendar thead .active{padding:2px 0 0 2px;background-color:#c4c0b8;}.calendar tbody .day{width:2em;text-align:right;padding:2px 4px 2px 2px;}.calendar tbody .day.othermonth{color:#aaa;}.calendar tbody .day.othermonth.oweekend{color:#faa;}.calendar table .wn{padding:2px 3px 2px 2px;background:#bbb;}.calendar tbody .rowhilite td{background:#ddd;}.calendar tbody td.hilite{background:#bbb;}.calendar tbody td.active{background:#bbb;}.calendar tbody td.selected{font-weight:bold;background:#ddd;}.calendar tbody td.weekend{color:#f00;}.calendar tbody td.today{font-weight:bold;color:#00f;}.calendar tbody .disabled{color:#999;}.calendar tbody .emptycell{visibility:hidden;}.calendar tbody .emptyrow{display:none;}.calendar tfoot .ttip{background:#bbb;padding:1px;background:#000;color:#fff;text-align:center;}.calendar tfoot .hilite{background:#ddd;}.calendar tfoot .active{}.calendar .combo{position:absolute;display:none;width:4em;top:0;left:0;cursor:default;background:#e4e0d8;padding:1px;z-index:2001;}.calendar .combo .label,.calendar .combo .label-IEfix{text-align:center;padding:1px;}.calendar .combo .label-IEfix{width:4em;}.calendar .combo .active{background:#c4c0b8;}.calendar .combo .hilite{background:#048;color:#fea;}.calendar td.time{padding:1px 0;text-align:center;background-color:#bbb;}.calendar td.time .hour,.calendar td.time .minute,.calendar td.time .ampm{padding:0 3px 0 4px;font-weight:bold;}.calendar td.time .ampm{text-align:center;}.calendar td.time .colon{padding:0 2px 0 3px;font-weight:bold;}.calendar td.time span.hilite{}.calendar td.time span.active{border-color:#f00;background-color:#000;color:#0f0;}.hour,.minute{font-size:2em;} #CP_hourcont{z-index:2000;padding:0;position:absolute;border:1px dashed #666;background-color:#eee;display:none;}#CP_minutecont{z-index:2000;background-color:#ddd;padding:1px;position:absolute;width:45px;display:none;}.floatleft{float:left;}.CP_hour{z-index:2000;padding:1px;font-family:Arial,Helvetica,sans-serif;font-size:9px;white-space:nowrap;cursor:pointer;width:35px;}.CP_minute{z-index:2000;padding:1px;font-family:Arial,Helvetica,sans-serif;font-size:9px;white-space:nowrap;cursor:pointer;width:auto;}.CP_over{background-color:#fff;z-index:2000} web2py-2.12.3.orig/applications/welcome/static/css/bootstrap-theme.min.css0000664000000000000000000005547512564727260025312 0ustar rootroot/*! * Bootstrap v3.3.5 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}web2py-2.12.3.orig/applications/welcome/static/css/web2py-bootstrap3.css0000664000000000000000000001343612564727260024710 0ustar rootrootdiv.flash { background-image: none; border-radius: 4px; -o-border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; color: #333; font-weight: 400; min-width: 28px; max-width: 300px; opacity: 1; vertical-align: baseline; right: auto; border-width: 1px; margin: 0 0 20px; padding: 15px 35px 15px 15px; } div.flash.alert:hover { opacity: 1; } .ie-lte8 div.flash { filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#222222', endColorstr='#000000', GradientType=0); } .ie-lte8 div.flash:hover { filter: alpha(opacity=25); } .main-container { margin-top: 20px; } div.error { width: auto; background: transparent; border: none; background-image: none; color: red; display: inline-block; padding: 5px; } div.flash.alert { display: none; position: fixed; top: 70px; right: 75px; cursor: pointer; z-index: 1000; background-color: #f9edbe; border-color: #f0c36d; } .w2p-toolbar-hidden { margin: 10px; } ul.w2p_list { margin-left: 0; padding-left: 0; } .w2p_list li { margin-bottom: 6px; } .w2p_list li input { display: inline-block; width: 85%; margin-right: 4px; } .w2p_list li a { margin-bottom: 2px; } div[id^=_autocomplete_] { margin-top: -10px; z-index: 1; } select.autocomplete { display: block; font-size: 14px; line-height: 1.428571429; color: #555; vertical-align: middle; background-color: #fff; background-image: none; border: 1px solid #ccc; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; border-color: #428bca; padding: 6px 12px; } #web2py-logo { color: #c6cecc; } #web2py-logo b { display: inline-block; margin-top: -1px; } #web2py-logo b>span { font-size: 22px; color: #FFF; } #web2py-logo:hover { color: #FFF; } .footer > .container-fluid { padding-left: 15px; padding-right: 15px; margin: 20px; } .background { background: url(../images/background.jpg) no-repeat center center; } body { padding-top: 50px; margin-bottom: 60px; } header { -webkit-box-shadow: 0 0 8px 2px #000; -moz-box-shadow: 0 0 8px 2px #000; box-shadow: 0 0 8px 2px #000; margin-bottom: 10px; } html { position: relative; min-height: 100%; } .footer { position: absolute; bottom: 0; width: 100%; height: 60px; background: #333; color: #aaa; } header h1 { color: #FFF!important; text-shadow: 0 0 7px #000; } header .jumbotron { background-color: transparent; } .flash { opacity: 0.9!important; right: 100px; } .right { float: right; text-align: right; } .left { float: left; text-align: left; } .center { width: 100%; text-align: center; vertical-align: middle; } td.w2p_fw { padding-bottom: 1px; } td.w2p_fl { text-align: left; } td.w2p_fl, td.w2p_fw { padding-right: 7px; } td.w2p_fl, td.w2p_fc { padding-top: 4px; } div.w2p_export_menu { margin: 5px 0; } div.w2p_export_menu a, div.w2p_wiki_tags a, div.w2p_cloud a { margin-left: 5px; padding: 2px 5px; } #submit_record__row td { padding-top: .5em; } div.error_wrapper { display: block; } .copyright { float: left; } #poweredBy { float: right; } .web2py_grid tbody td { vertical-align: middle; padding: 2px 5px; } .web2py_grid thead th, .web2py_grid tfoot td { background-color: #EAEAEA; padding: 10px 5px; } .web2py_grid tr.odd { background-color: #F9F9F9; } .web2py_grid tr:hover { background-color: #F5F5F5; } .web2py_console form { width: 100%; display: inline; vertical-align: middle; margin: 0 0 0 5px; } .web2py_console form select { margin: 0; } .web2py_search_actions { float: left; text-align: left; width: 100%; } .web2py_grid .row_buttons { min-height: 25px; vertical-align: middle; } .web2py_grid .row_buttons a { margin: 3px; } .web2py_grid .row_buttons a, .web2py_paginator ul li a, .web2py_search_actions a, .web2py_console input[type=submit], .web2py_console input[type=button], .web2py_console button { line-height: 20px; margin-right: 2px; display: inline-block; padding: 3px 5px; } .web2py_counter { margin-top: 5px; margin-right: 2px; width: 35%; float: right; text-align: right; } .web2py_table { clear: both; display: block; } .web2py_paginator { text-align: right; background-color: #f2f2f2; padding: 5px; } .web2py_paginator ul { list-style-type: none; margin: 0; padding: 0; } .web2py_paginator .current { font-weight: 700; } .web2py_breadcrumbs ul { list-style: none; margin-bottom: 18px; } li.w2p_grid_breadcrumb_elem { display: inline-block; } .web2py_console input, .web2py_console select, .web2py_console a { margin: 2px; } #wiki_page_body { width: 600px; height: auto; min-height: 400px; } .ie-lte7 .topbar .container { z-index: 2; } .ie9 #w2p_query_panel { padding-bottom: 2px; } .web2py_console .form-control { width: 20%; display: inline; height: 100%; } .web2py_console #w2p_keywords { width: 50%; } .web2py_search_actions a, .web2py_console input[type=submit], .web2py_console input[type=button], .web2py_console button { padding: 6px 12px; } td.w2p_fl, td.w2p_fw, td.w2p_fc, #web2py_user_form td, .web2py_grid .web2py_form td { vertical-align: top; } #auth_user_remember__row label, .web2py_paginator ul li { display: inline; } .web2py_grid, .web2py_grid table { width: 100%; } input[type=checkbox], input[type=radio] { margin: 4px 4px 0 0; } .btn { margin-right: 4px; }web2py-2.12.3.orig/applications/welcome/static/css/bootstrap.min.css0000664000000000000000000035725412564727260024212 0ustar rootroot/*! * Bootstrap v3.3.5 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:3;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}web2py-2.12.3.orig/applications/welcome/static/js/0000775000000000000000000000000012564727260020505 5ustar rootrootweb2py-2.12.3.orig/applications/welcome/static/js/bootstrap.min.js0000664000000000000000000010772012564727260023651 0ustar rootroot/*! * Bootstrap v3.3.5 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under the MIT license */ if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.5",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.5",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.5",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.5",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.5",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.5",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.5",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.5",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);web2py-2.12.3.orig/applications/welcome/static/js/calendar.js0000664000000000000000000014506512564727260022627 0ustar rootroot/* Copyright Notice for Dynarch Date Time Picker */ /* Copyright Mihai Bazon, 2002-2005 | www.bazon.net/mishoo * ----------------------------------------------------------- * * The DHTML Calendar, version 1.0 "It is happening again" * * Details and latest version at: * www.dynarch.com/projects/calendar * * This script is developed by Dynarch.com. Visit us at www.dynarch.com. * * This script is distributed under the GNU Lesser General Public License. * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html */ // Calendar EN language // Author: Mihai Bazon, // Encoding: any // Distributed under the same terms as the calendar itself. /* End Copyright Notice for Dynarch Date Time Picker */ Calendar=function(J,K,H,G){this.activeDiv=null;this.currentDateEl=null;this.getDateStatus=null;this.getDateToolTip=null;this.getDateText=null;this.timeout=null;this.onSelected=H||null;this.onClose=G||null;this.dragging=false;this.hidden=false;this.minYear=1970;this.maxYear=2050;this.dateFormat=Calendar._TT.DEF_DATE_FORMAT;this.ttDateFormat=Calendar._TT.TT_DATE_FORMAT;this.isPopup=true;this.weekNumbers=true;this.firstDayOfWeek=typeof J=="number"?J:Calendar._FD;this.showsOtherMonths=false;this.dateStr=K;this.ar_days=null;this.showsTime=false;this.time24=true;this.yearStep=2;this.hiliteToday=true;this.multiple=null;this.table=null;this.element=null;this.tbody=null;this.firstdayname=null;this.monthsCombo=null;this.yearsCombo=null;this.hilitedMonth=null;this.activeMonth=null;this.hilitedYear=null;this.activeYear=null;this.dateClicked=false;if(typeof Calendar._SDN=="undefined"){if(typeof Calendar._SDN_len=="undefined"){Calendar._SDN_len=3}var L=new Array();for(var I=8;I>0;){L[--I]=Calendar._DN[I].substr(0,Calendar._SDN_len)}Calendar._SDN=L;if(typeof Calendar._SMN_len=="undefined"){Calendar._SMN_len=3}L=new Array();for(var I=12;I>0;){L[--I]=Calendar._MN[I].substr(0,Calendar._SMN_len)}Calendar._SMN=L}};Calendar._C=null;Calendar.is_ie=(/msie/i.test(navigator.userAgent)&&!/opera/i.test(navigator.userAgent));Calendar.is_ie5=(Calendar.is_ie&&/msie 5\.0/i.test(navigator.userAgent));Calendar.is_opera=/opera/i.test(navigator.userAgent);Calendar.is_khtml=/Konqueror|Safari|KHTML/i.test(navigator.userAgent);Calendar.getAbsolutePos=function(I){var G=0,J=0;var K=/^div$/i.test(I.tagName);if(K&&I.scrollLeft){G=I.scrollLeft}if(K&&I.scrollTop){J=I.scrollTop}var H={x:I.offsetLeft-G,y:I.offsetTop-J};if(I.offsetParent){var L=this.getAbsolutePos(I.offsetParent);H.x+=L.x;H.y+=L.y}return H};Calendar.isRelated=function(G,E){var F=E.relatedTarget;if(!F){var H=E.type;if(H=="mouseover"){F=E.fromElement}else{if(H=="mouseout"){F=E.toElement}}}while(F){if(F==G){return true}F=F.parentNode}return false};Calendar.removeClass=function(G,H){if(!(G&&G.className)){return }var F=G.className.split(" ");var J=new Array();for(var I=F.length;I>0;){if(F[--I]!=H){J[J.length]=F[I]}}G.className=J.join(" ")};Calendar.addClass=function(D,C){Calendar.removeClass(D,C);D.className+=" "+C};Calendar.getElement=function(C){var D=Calendar.is_ie?window.event.srcElement:C.currentTarget;while(D.nodeType!=1||/^div$/i.test(D.tagName)){D=D.parentNode}return D};Calendar.getTargetElement=function(C){var D=Calendar.is_ie?window.event.srcElement:C.target;while(D.nodeType!=1){D=D.parentNode}return D};Calendar.stopEvent=function(B){B||(B=window.event);if(Calendar.is_ie){B.cancelBubble=true;B.returnValue=false}else{B.preventDefault();B.stopPropagation()}return false};Calendar.addEvent=function(D,E,F){if(D.attachEvent){D.attachEvent("on"+E,F)}else{if(D.addEventListener){D.addEventListener(E,F,true)}else{D["on"+E]=F}}};Calendar.removeEvent=function(D,E,F){if(D.detachEvent){D.detachEvent("on"+E,F)}else{if(D.removeEventListener){D.removeEventListener(E,F,true)}else{D["on"+E]=null}}};Calendar.createElement=function(E,F){var D=null;if(document.createElementNS){D=document.createElementNS("http://www.w3.org/1999/xhtml",E)}else{D=document.createElement(E)}if(typeof F!="undefined"){F.appendChild(D)}return D};Calendar._add_evs=function(el){with(Calendar){addEvent(el,"mouseover",dayMouseOver);addEvent(el,"mousedown",dayMouseDown);addEvent(el,"mouseout",dayMouseOut);if(is_ie){addEvent(el,"dblclick",dayMouseDblClick);el.setAttribute("unselectable",true)}}};Calendar.findMonth=function(B){if(typeof B.month!="undefined"){return B}else{if(typeof B.parentNode.month!="undefined"){return B.parentNode}}return null};Calendar.findYear=function(B){if(typeof B.year!="undefined"){return B}else{if(typeof B.parentNode.year!="undefined"){return B.parentNode}}return null};Calendar.showMonthsCombo=function(){var I=Calendar._C;if(!I){return false}var I=I;var H=I.activeDiv;var J=I.monthsCombo;if(I.hilitedMonth){Calendar.removeClass(I.hilitedMonth,"hilite")}if(I.activeMonth){Calendar.removeClass(I.activeMonth,"active")}var K=I.monthsCombo.getElementsByTagName("div")[I.date.getMonth()];Calendar.addClass(K,"active");I.activeMonth=K;var L=J.style;L.display="block";if(H.navtype<0){L.left=H.offsetLeft+"px"}else{var G=J.offsetWidth;if(typeof G=="undefined"){G=50}L.left=(H.offsetLeft+H.offsetWidth-G)+"px"}L.top=(H.offsetTop+H.offsetHeight)+"px"};Calendar.showYearsCombo=function(K){var N=Calendar._C;if(!N){return false}var N=N;var L=N.activeDiv;var S=N.yearsCombo;if(N.hilitedYear){Calendar.removeClass(N.hilitedYear,"hilite")}if(N.activeYear){Calendar.removeClass(N.activeYear,"active")}N.activeYear=null;var M=N.date.getFullYear()+(K?1:-1);var P=S.firstChild;var Q=false;for(var T=12;T>0;--T){if(M>=N.minYear&&M<=N.maxYear){P.innerHTML=M;P.year=M;P.style.display="block";Q=true}else{P.style.display="none"}P=P.nextSibling;M+=K?N.yearStep:-N.yearStep}if(Q){var O=S.style;O.display="block";if(L.navtype<0){O.left=L.offsetLeft+"px"}else{var R=S.offsetWidth;if(typeof R=="undefined"){R=50}O.left=(L.offsetLeft+L.offsetWidth-R)+"px"}O.top=(L.offsetTop+L.offsetHeight)+"px"}};Calendar.tableMouseUp=function(ev){var cal=Calendar._C;if(!cal){return false}if(cal.timeout){clearTimeout(cal.timeout)}var el=cal.activeDiv;if(!el){return false}var target=Calendar.getTargetElement(ev);ev||(ev=window.event);Calendar.removeClass(el,"active");if(target==el||target.parentNode==el){Calendar.cellClick(el,ev)}var mon=Calendar.findMonth(target);var date=null;if(mon){date=new Date(cal.date);if(mon.month!=date.getMonth()){date.setMonth(mon.month);cal.setDate(date);cal.dateClicked=false;cal.callHandler()}}else{var year=Calendar.findYear(target);if(year){date=new Date(cal.date);if(year.year!=date.getFullYear()){date.c_setFullYear(year.year);cal.setDate(date);cal.dateClicked=false;cal.callHandler()}}}with(Calendar){removeEvent(document,"mouseup",tableMouseUp);removeEvent(document,"mouseover",tableMouseOver);removeEvent(document,"mousemove",tableMouseOver);cal._hideCombos();_C=null;return stopEvent(ev)}};Calendar.tableMouseOver=function(X){var T=Calendar._C;if(!T){return }var R=T.activeDiv;var b=Calendar.getTargetElement(X);if(b==R||b.parentNode==R){Calendar.addClass(R,"hilite active");Calendar.addClass(R.parentNode,"rowhilite")}else{if(typeof R.navtype=="undefined"||(R.navtype!=50&&(R.navtype==0||Math.abs(R.navtype)>2))){Calendar.removeClass(R,"active")}Calendar.removeClass(R,"hilite");Calendar.removeClass(R.parentNode,"rowhilite")}X||(X=window.event);if(R.navtype==50&&b!=R){var Y=Calendar.getAbsolutePos(R);var V=R.offsetWidth;var W=X.clientX;var U;var Z=true;if(W>Y.x+V){U=W-Y.x-V;Z=false}else{U=Y.x-W}if(U<0){U=0}var e=R._range;var c=R._current;var d=Math.floor(U/10)%e.length;for(var f=e.length;--f>=0;){if(e[f]==c){break}}while(d-->0){if(Z){if(--f<0){f=e.length-1}}else{if(++f>=e.length){f=0}}}var S=e[f];R.innerHTML=S;T.onUpdateTime()}var Q=Calendar.findMonth(b);if(Q){if(Q.month!=T.date.getMonth()){if(T.hilitedMonth){Calendar.removeClass(T.hilitedMonth,"hilite")}Calendar.addClass(Q,"hilite");T.hilitedMonth=Q}else{if(T.hilitedMonth){Calendar.removeClass(T.hilitedMonth,"hilite")}}}else{if(T.hilitedMonth){Calendar.removeClass(T.hilitedMonth,"hilite")}var a=Calendar.findYear(b);if(a){if(a.year!=T.date.getFullYear()){if(T.hilitedYear){Calendar.removeClass(T.hilitedYear,"hilite")}Calendar.addClass(a,"hilite");T.hilitedYear=a}else{if(T.hilitedYear){Calendar.removeClass(T.hilitedYear,"hilite")}}}else{if(T.hilitedYear){Calendar.removeClass(T.hilitedYear,"hilite")}}}return Calendar.stopEvent(X)};Calendar.tableMouseDown=function(B){if(Calendar.getTargetElement(B)==Calendar.getElement(B)){return Calendar.stopEvent(B)}};Calendar.calDragIt=function(J){var I=Calendar._C;if(!(I&&I.dragging)){return false}var G;var H;if(Calendar.is_ie){H=window.event.clientY+document.body.scrollTop;G=window.event.clientX+document.body.scrollLeft}else{G=J.pageX;H=J.pageY}I.hideShowCovered();var F=I.element.style;F.left=(G-I.xOffs)+"px";F.top=(H-I.yOffs)+"px";return Calendar.stopEvent(J)};Calendar.calDragEnd=function(ev){var cal=Calendar._C;if(!cal){return false}cal.dragging=false;with(Calendar){removeEvent(document,"mousemove",calDragIt);removeEvent(document,"mouseup",calDragEnd);tableMouseUp(ev)}cal.hideShowCovered()};Calendar.dayMouseDown=function(ev){var el=Calendar.getElement(ev);if(el.disabled){return false}var cal=el.calendar;cal.activeDiv=el;Calendar._C=cal;if(el.navtype!=300){with(Calendar){if(el.navtype==50){el._current=el.innerHTML;addEvent(document,"mousemove",tableMouseOver)}else{addEvent(document,Calendar.is_ie5?"mousemove":"mouseover",tableMouseOver)}addClass(el,"hilite active");addEvent(document,"mouseup",tableMouseUp)}}else{if(cal.isPopup){cal._dragStart(ev)}}if(el.navtype==-1||el.navtype==1){if(cal.timeout){clearTimeout(cal.timeout)}cal.timeout=setTimeout("Calendar.showMonthsCombo()",250)}else{if(el.navtype==-2||el.navtype==2){if(cal.timeout){clearTimeout(cal.timeout)}cal.timeout=setTimeout((el.navtype>0)?"Calendar.showYearsCombo(true)":"Calendar.showYearsCombo(false)",250)}else{cal.timeout=null}}return Calendar.stopEvent(ev)};Calendar.dayMouseDblClick=function(B){Calendar.cellClick(Calendar.getElement(B),B||window.event);if(Calendar.is_ie){document.selection.empty()}};Calendar.dayMouseOver=function(D){var C=Calendar.getElement(D);if(Calendar.isRelated(C,D)||Calendar._C||C.disabled){return false}if(C.ttip){if(C.ttip.substr(0,1)=="_"){C.ttip=C.caldate.c_print(C.calendar.ttDateFormat)+C.ttip.substr(1)}C.calendar.tooltips.innerHTML=C.ttip}if(C.navtype!=300){Calendar.addClass(C,"hilite");if(C.caldate){Calendar.addClass(C.parentNode,"rowhilite")}}return Calendar.stopEvent(D)};Calendar.dayMouseOut=function(ev){with(Calendar){var el=getElement(ev);if(isRelated(el,ev)||_C||el.disabled){return false}removeClass(el,"hilite");if(el.caldate){removeClass(el.parentNode,"rowhilite")}if(el.calendar){el.calendar.tooltips.innerHTML=_TT.SEL_DATE}return stopEvent(ev)}};Calendar.cellClick=function(d,U){var Q=d.calendar;var a=false;var X=false;var c=null;if(typeof d.navtype=="undefined"){if(Q.currentDateEl){Calendar.removeClass(Q.currentDateEl,"selected");Calendar.addClass(d,"selected");a=(Q.currentDateEl==d);if(!a){Q.currentDateEl=d}}Q.date.c_setDateOnly(d.caldate);c=Q.date;var R=!(Q.dateClicked=!d.otherMonth);if(!R&&!Q.currentDateEl){Q._toggleMultipleDate(new Date(c))}else{X=!d.disabled}if(R){Q._init(Q.firstDayOfWeek,c)}}else{if(d.navtype==200){Calendar.removeClass(d,"hilite");Q.callCloseHandler();return }c=new Date(Q.date);if(d.navtype==0){c.c_setDateOnly(new Date())}Q.dateClicked=false;var V=c.getFullYear();var b=c.getMonth();function S(B){var A=c.getDate();var C=c.c_getMonthDays(B);if(A>C){c.setDate(C)}c.setMonth(B)}switch(d.navtype){case 400:Calendar.removeClass(d,"hilite");var T=Calendar._TT.ABOUT;if(typeof T!="undefined"){T+=Q.showsTime?Calendar._TT.ABOUT_TIME:""}else{T='Help and about box text is not translated into this language.\nIf you know this language and you feel generous please update\nthe corresponding file in "lang" subdir to match calendar-en.js\nand send it back to to get it into the distribution ;-)\n\nThank you!\nhttp://dynarch.com/mishoo/calendar.epl\n'}alert(T);return ;case -2:if(V>Q.minYear){c.c_setFullYear(V-1)}break;case -1:if(b>0){S(b-1)}else{if(V-->Q.minYear){c.c_setFullYear(V);S(11)}}break;case 1:if(b<11){S(b+1)}else{if(V=0;){if(Y[Z]==W){break}}if(U&&U.shiftKey){if(--Z<0){Z=Y.length-1}}else{if(++Z>=Y.length){Z=0}}var P=Y[Z];d.innerHTML=P;Q.onUpdateTime();return ;case 0:if((typeof Q.getDateStatus=="function")&&Q.getDateStatus(c,c.getFullYear(),c.getMonth(),c.getDate())){return false}break}if(!c.c_equalsTo(Q.date)){Q.setDate(c);X=true}else{if(d.navtype==0){X=a=true}}}if(X){U&&Q.callHandler()}if(a){Calendar.removeClass(d,"hilite");U&&Q.callCloseHandler()}};Calendar.prototype.create=function(Y){var Z=null;if(!Y){Z=document.getElementsByTagName("body")[0];this.isPopup=true}else{Z=Y;this.isPopup=false}this.date=this.dateStr?new Date(this.dateStr):new Date();var V=Calendar.createElement("table");this.table=V;V.cellSpacing=0;V.cellPadding=0;V.calendar=this;Calendar.addEvent(V,"mousedown",Calendar.tableMouseDown);var T=Calendar.createElement("div");this.element=T;T.className="calendar";if(this.isPopup){T.style.position="absolute";T.style.display="none"}T.appendChild(V);var b=Calendar.createElement("thead",V);var X=null;var U=null;var S=this;var f=function(A,B,C){X=Calendar.createElement("td",U);X.colSpan=B;X.className="button";if(C!=0&&Math.abs(C)<=2){X.className+=" nav"}Calendar._add_evs(X);X.calendar=S;X.navtype=C;X.innerHTML="
"+A+"
";return X};U=Calendar.createElement("tr",b);var R=6;(this.isPopup)&&--R;(this.weekNumbers)&&++R;f("?",1,400).ttip=Calendar._TT.INFO;this.title=f("",R,300);this.title.className="title";if(this.isPopup){this.title.ttip=Calendar._TT.DRAG_TO_MOVE;this.title.style.cursor="move";f("×",1,200).ttip=Calendar._TT.CLOSE}U=Calendar.createElement("tr",b);U.className="headrow";this._nav_py=f("«",1,-2);this._nav_py.ttip=Calendar._TT.PREV_YEAR;this._nav_pm=f("‹",1,-1);this._nav_pm.ttip=Calendar._TT.PREV_MONTH;this._nav_now=f(Calendar._TT.TODAY,this.weekNumbers?4:3,0);this._nav_now.ttip=Calendar._TT.GO_TODAY;this._nav_nm=f("›",1,1);this._nav_nm.ttip=Calendar._TT.NEXT_MONTH;this._nav_ny=f("»",1,2);this._nav_ny.ttip=Calendar._TT.NEXT_YEAR;U=Calendar.createElement("tr",b);U.className="daynames";if(this.weekNumbers){X=Calendar.createElement("td",U);X.className="name wn";X.innerHTML=Calendar._TT.WK}for(var c=7;c>0;--c){X=Calendar.createElement("td",U);if(!c){X.navtype=100;X.calendar=this;Calendar._add_evs(X)}}this.firstdayname=(this.weekNumbers)?U.firstChild.nextSibling:U.firstChild;this._displayWeekdays();var d=Calendar.createElement("tbody",V);this.tbody=d;for(c=6;c>0;--c){U=Calendar.createElement("tr",d);if(this.weekNumbers){X=Calendar.createElement("td",U)}for(var e=7;e>0;--e){X=Calendar.createElement("td",U);X.calendar=this;Calendar._add_evs(X)}}if(this.showsTime){U=Calendar.createElement("tr",d);U.className="time";X=Calendar.createElement("td",U);X.className="time";X.colSpan=2;X.innerHTML=Calendar._TT.TIME||" ";X=Calendar.createElement("td",U);X.className="time";X.colSpan=this.weekNumbers?4:3;(function(){function F(P,N,O,L){var K=Calendar.createElement("span",X);K.className=P;K.innerHTML=N;K.calendar=S;K.ttip=Calendar._TT.TIME_PART;K.navtype=50;K._range=[];if(typeof O!="number"){K._range=O}else{for(var J=O;J<=L;++J){var M;if(J<10&&L>=10){M="0"+J}else{M=""+J}K._range[K._range.length]=M}}Calendar._add_evs(K);return K}var B=S.date.getHours();var I=S.date.getMinutes();var A=!S.time24;var H=(B>12);if(A&&H){B-=12}var D=F("hour",B,A?1:0,A?12:23);var E=Calendar.createElement("span",X);E.innerHTML=":";E.className="colon";var G=F("minute",I,0,59);var C=null;X=Calendar.createElement("td",U);X.className="time";X.colSpan=2;if(A){C=F("ampm",H?"pm":"am",["am","pm"])}else{X.innerHTML=" "}S.onSetTime=function(){var K,L=this.date.getHours(),J=this.date.getMinutes();if(A){K=(L>=12);if(K){L-=12}if(L==0){L=12}C.innerHTML=K?"pm":"am"}D.innerHTML=(L<10)?("0"+L):L;G.innerHTML=(J<10)?("0"+J):J};S.onUpdateTime=function(){var K=this.date;var J=parseInt(D.innerHTML,10);if(A){if(/pm/i.test(C.innerHTML)&&J<12){J+=12}else{if(/am/i.test(C.innerHTML)&&J==12){J=0}}}var N=K.getDate();var M=K.getMonth();var L=K.getFullYear();K.setHours(J);K.setMinutes(parseInt(G.innerHTML,10));K.c_setFullYear(L);K.setMonth(M);K.setDate(N);this.dateClicked=false;this.callHandler()}})()}else{this.onSetTime=this.onUpdateTime=function(){}}var a=Calendar.createElement("tfoot",V);U=Calendar.createElement("tr",a);U.className="footrow";X=f(Calendar._TT.SEL_DATE,this.weekNumbers?8:7,300);X.className="ttip";if(this.isPopup){X.ttip=Calendar._TT.DRAG_TO_MOVE;X.style.cursor="move"}this.tooltips=X;T=Calendar.createElement("div",this.element);this.monthsCombo=T;T.className="combo";for(c=0;c0;--c){var W=Calendar.createElement("div");W.className=Calendar.is_ie?"label-IEfix":"label";T.appendChild(W)}this._init(this.firstDayOfWeek,this.date);Z.appendChild(this.element)};Calendar._keyEvent=function(T){var Q=window._dynarch_popupCalendar;if(!Q||Q.multiple){return false}(Calendar.is_ie)&&(T=window.event);var V=(Calendar.is_ie||T.type=="keypress"),S=T.keyCode;if(T.ctrlKey){switch(S){case 37:V&&Calendar.cellClick(Q._nav_pm);break;case 38:V&&Calendar.cellClick(Q._nav_py);break;case 39:V&&Calendar.cellClick(Q._nav_nm);break;case 40:V&&Calendar.cellClick(Q._nav_ny);break;default:return false}}else{switch(S){case 32:Calendar.cellClick(Q._nav_now);break;case 27:V&&Q.callCloseHandler();break;case 37:case 38:case 39:case 40:if(V){var Z,R,U,X,O,K;Z=S==37||S==38;K=(S==37||S==39)?1:7;function P(){O=Q.currentDateEl;var A=O.pos;R=A&15;U=A>>4;X=Q.ar_days[U][R]}P();function Y(){var A=new Date(Q.date);A.setDate(A.getDate()-K);Q.setDate(A)}function W(){var A=new Date(Q.date);A.setDate(A.getDate()+K);Q.setDate(A)}while(1){switch(S){case 37:if(--R>=0){X=Q.ar_days[U][R]}else{R=6;S=38;continue}break;case 38:if(--U>=0){X=Q.ar_days[U][R]}else{Y();P()}break;case 39:if(++R<7){X=Q.ar_days[U][R]}else{R=0;S=40;continue}break;case 40:if(++Uthis.maxYear){v=this.maxYear;e.c_setFullYear(v)}}this.firstDayOfWeek=q;this.date=new Date(e);var d=e.getMonth();var a=e.getDate();var b=e.c_getMonthDays();e.setDate(1);var k=(e.getDay()-this.firstDayOfWeek)%7;if(k<0){k+=7}e.setDate(0-k);e.setDate(e.getDate()+1);var y=this.tbody.firstChild;var s=Calendar._SMN[d];var o=this.ar_days=new Array();var p=Calendar._TT.WEEKEND;var z=this.multiple?(this.datesCells={}):null;for(var i=0;i<6;++i,y=y.nextSibling){var AC=y.firstChild;if(this.weekNumbers){AC.className="day wn";AC.innerHTML=e.c_getWeekNumber();AC=AC.nextSibling}y.className="daysrow";var g=false,x,AA=o[i]=[];for(var j=0;j<7;++j,AC=AC.nextSibling,e.setDate(x+1)){x=e.getDate();var w=e.getDay();AC.className="day";AC.pos=i<<4|j;AA[j]=AC;var r=(e.getMonth()==d);if(!r){if(this.showsOtherMonths){AC.className+=" othermonth";AC.otherMonth=true}else{AC.className="emptycell";AC.innerHTML=" ";AC.disabled=true;continue}}else{AC.otherMonth=false;g=true}AC.disabled=false;AC.innerHTML=this.getDateText?this.getDateText(e,x):x;if(z){z[e.c_print("%Y%m%d")]=AC}if(this.getDateStatus){var n=this.getDateStatus(e,v,d,x);if(this.getDateToolTip){var u=this.getDateToolTip(e,v,d,x);if(u){AC.title=u}}if(n===true){AC.className+=" disabled";AC.disabled=true}else{if(/disabled/i.test(n)){AC.disabled=true}AC.className+=" "+n}}if(!AC.disabled){AC.caldate=new Date(e);AC.ttip="_";if(!this.multiple&&r&&x==a&&this.hiliteToday){AC.className+=" selected";this.currentDateEl=AC}if(e.getFullYear()==l&&e.getMonth()==c&&x==AB){AC.className+=" today";AC.ttip+=Calendar._TT.PART_TODAY}if(p.indexOf(w.toString())!=-1){AC.className+=AC.otherMonth?" oweekend":" weekend"}}}if(!(g||this.showsOtherMonths)){y.className="emptyrow"}}this.title.innerHTML=Calendar._MN[d]+", "+v;this.onSetTime();this.table.style.visibility="visible";this._initMultipleDates()};Calendar.prototype._initMultipleDates=function(){if(this.multiple){for(var F in this.multiple){var D=this.datesCells[F];var E=this.multiple[F];if(!E){continue}if(D){D.className+=" selected"}}}};Calendar.prototype._toggleMultipleDate=function(H){if(this.multiple){var G=H.c_print("%Y%m%d");var E=this.datesCells[G];if(E){var F=this.multiple[G];if(!F){Calendar.addClass(E,"selected");this.multiple[G]=H}else{Calendar.removeClass(E,"selected");delete this.multiple[G]}}}};Calendar.prototype.setDateToolTipHandler=function(B){this.getDateToolTip=B};Calendar.prototype.setDate=function(B){if(!B.c_equalsTo(this.date)){this._init(this.firstDayOfWeek,B)}};Calendar.prototype.refresh=function(){this._init(this.firstDayOfWeek,this.date)};Calendar.prototype.setFirstDayOfWeek=function(B){this._init(B,this.date);this._displayWeekdays()};Calendar.prototype.setDateStatusHandler=Calendar.prototype.setDisabledHandler=function(B){this.getDateStatus=B};Calendar.prototype.setRange=function(C,D){this.minYear=C;this.maxYear=D};Calendar.prototype.callHandler=function(){if(this.onSelected){this.onSelected(this,this.date.c_print(this.dateFormat))}};Calendar.prototype.callCloseHandler=function(){if(this.onClose){this.onClose(this)}this.hideShowCovered()};Calendar.prototype.destroy=function(){var B=this.element.parentNode;B.removeChild(this.element);Calendar._C=null;window._dynarch_popupCalendar=null};Calendar.prototype.reparent=function(D){var C=this.element;C.parentNode.removeChild(C);D.appendChild(C)};Calendar._checkCalendar=function(F){var E=window._dynarch_popupCalendar;if(!E){return false}var D=Calendar.is_ie?Calendar.getElement(F):Calendar.getTargetElement(F);for(;D!=null&&D!=E.element;D=D.parentNode){}if(D==null){window._dynarch_popupCalendar.callCloseHandler();return Calendar.stopEvent(F)}};Calendar.prototype.show=function(){var I=this.table.getElementsByTagName("tr");for(var J=I.length;J>0;){var H=I[--J];Calendar.removeClass(H,"rowhilite");var K=H.getElementsByTagName("td");for(var L=K.length;L>0;){var G=K[--L];Calendar.removeClass(G,"hilite");Calendar.removeClass(G,"active")}}this.element.style.display="block";this.hidden=false;if(this.isPopup){window._dynarch_popupCalendar=this;Calendar.addEvent(document,"keydown",Calendar._keyEvent);Calendar.addEvent(document,"keypress",Calendar._keyEvent);Calendar.addEvent(document,"mousedown",Calendar._checkCalendar)}this.hideShowCovered()};Calendar.prototype.hide=function(){if(this.isPopup){Calendar.removeEvent(document,"keydown",Calendar._keyEvent);Calendar.removeEvent(document,"keypress",Calendar._keyEvent);Calendar.removeEvent(document,"mousedown",Calendar._checkCalendar)}this.element.style.display="none";this.hidden=true;this.hideShowCovered()};Calendar.prototype.showAt=function(D,E){var F=this.element.style;F.left=D+"px";F.top=E+"px";this.show()};Calendar.prototype.showAtElement=function(I,H){var F=this;var G=Calendar.getAbsolutePos(I);if(!H||typeof H!="string"){this.showAt(G.x,G.y+I.offsetHeight);return true}function J(B){if(B.x<0){B.x=0}if(B.y<0){B.y=0}var A=document.createElement("div");var C=A.style;C.position="absolute";C.right=C.bottom=C.width=C.height="0px";document.body.appendChild(A);var D=Calendar.getAbsolutePos(A);document.body.removeChild(A);if(Calendar.is_ie){D.y+=document.body.scrollTop;D.x+=document.body.scrollLeft}else{D.y+=window.scrollY;D.x+=window.scrollX}var E=B.x+B.width-D.x;if(E>0){B.x-=E}E=B.y+B.height-D.y;if(E>0){B.y-=E}}this.element.style.display="block";Calendar.continuation_for_the_fucking_khtml_browser=function(){var D=F.element.offsetWidth;var B=F.element.offsetHeight;F.element.style.display="none";var C=H.substr(0,1);var A="l";if(H.length>1){A=H.substr(1,1)}switch(C){case"T":G.y-=B;break;case"B":G.y+=I.offsetHeight;break;case"C":G.y+=(I.offsetHeight-B)/2;break;case"t":G.y+=I.offsetHeight-B;break;case"b":break}switch(A){case"L":G.x-=D;break;case"R":G.x+=I.offsetWidth;break;case"C":G.x+=(I.offsetWidth-D)/2;break;case"l":G.x+=I.offsetWidth-D;break;case"r":break}G.width=D;G.height=B+40;F.monthsCombo.style.display="none";J(G);F.showAt(G.x,G.y)};if(Calendar.is_khtml){setTimeout("Calendar.continuation_for_the_fucking_khtml_browser()",10)}else{Calendar.continuation_for_the_fucking_khtml_browser()}};Calendar.prototype.setDateFormat=function(B){this.dateFormat=B};Calendar.prototype.setTtDateFormat=function(B){this.ttDateFormat=B};Calendar.prototype.parseDate=function(D,C){if(!C){C=this.dateFormat}this.setDate(Date.parseDate(D,C))};Calendar.prototype.hideShowCovered=function(){if(!Calendar.is_ie&&!Calendar.is_opera){return }function S(A){var B=A.style.visibility;if(!B){if(document.defaultView&&typeof (document.defaultView.getComputedStyle)=="function"){if(!Calendar.is_khtml){B=document.defaultView.getComputedStyle(A,"").getPropertyValue("visibility")}else{B=""}}else{if(A.currentStyle){B=A.currentStyle.visibility}else{B=""}}}return B}var U=new Array("applet","iframe","select");var R=this.element;var T=Calendar.getAbsolutePos(R);var e=T.x;var Q=R.offsetWidth+e;var V=T.y;var W=R.offsetHeight+V;for(var c=U.length;c>0;){var d=document.getElementsByTagName(U[--c]);var f=null;for(var a=d.length;a>0;){f=d[--a];T=Calendar.getAbsolutePos(f);var X=T.x;var Y=f.offsetWidth+X;var Z=T.y;var b=f.offsetHeight+Z;if(this.hidden||(X>Q)||(YW)||(b29)?1900:2000);break;case"%b":case"%B":for(N=0;N<12;++N){if(Calendar._MN[N].substr(0,T[Z].length).toLowerCase()==T[Z].toLowerCase()){P=N;break}}break;case"%H":case"%I":case"%k":case"%l":S=parseInt(T[Z],10);break;case"%P":case"%p":if(/pm/i.test(T[Z])&&S<12){S+=12}else{if(/am/i.test(T[Z])&&S>=12){S-=12}}break;case"%M":O=parseInt(T[Z],10);break}}if(isNaN(V)){V=W.getFullYear()}if(isNaN(P)){P=W.getMonth()}if(isNaN(Y)){Y=W.getDate()}if(isNaN(S)){S=W.getHours()}if(isNaN(O)){O=W.getMinutes()}if(V!=0&&P!=-1&&Y!=0){return new Date(V,P,Y,S,O,0)}V=0;P=-1;Y=0;for(Z=0;Z31&&V==0){V=parseInt(T[Z],10);(V<100)&&(V+=(V>29)?1900:2000)}else{if(Y==0){Y=T[Z]}}}}}if(V==0){V=W.getFullYear()}if(P!=-1&&Y!=0){return new Date(V,P,Y,S,O,0)}return W};Date.prototype.c_getMonthDays=function(D){var C=this.getFullYear();if(typeof D=="undefined"){D=this.getMonth()}if(((0==(C%4))&&((0!=(C%100))||(0==(C%400))))&&D==1){return 29}else{return Date._MD[D]}};Date.prototype.c_getDayOfYear=function(){var D=new Date(this.getFullYear(),this.getMonth(),this.getDate(),0,0,0);var E=new Date(this.getFullYear(),0,0,0,0,0);var F=D-E;return Math.floor(F/Date.DAY)};Date.prototype.c_getWeekNumber=function(){var E=new Date(this.getFullYear(),this.getMonth(),this.getDate(),0,0,0);var F=E.getDay();E.setDate(E.getDate()-(F+6)%7+3);var D=E.valueOf();E.setMonth(0);E.setDate(4);return Math.round((D-E.valueOf())/(7*86400000))+1};Date.prototype.c_equalsTo=function(B){return((this.getFullYear()==B.getFullYear())&&(this.getMonth()==B.getMonth())&&(this.getDate()==B.getDate())&&(this.getHours()==B.getHours())&&(this.getMinutes()==B.getMinutes()))};Date.prototype.c_setDateOnly=function(C){var D=new Date(C);this.setDate(1);this.c_setFullYear(D.getFullYear());this.setMonth(D.getMonth());this.setDate(D.getDate())};Date.prototype.c_print=function(d){var U=this.getMonth();var e=this.getDate();var c=this.getFullYear();var a=this.c_getWeekNumber();var Z=this.getDay();var V={};var Y=this.getHours();var T=(Y>=12);var g=(T)?(Y-12):Y;var W=this.c_getDayOfYear();if(g==0){g=12}var S=this.getMinutes();var f=this.getSeconds();V["%a"]=Calendar._SDN[Z];V["%A"]=Calendar._DN[Z];V["%b"]=Calendar._SMN[U];V["%B"]=Calendar._MN[U];V["%C"]=1+Math.floor(c/100);V["%d"]=(e<10)?("0"+e):e;V["%e"]=e;V["%H"]=(Y<10)?("0"+Y):Y;V["%I"]=(g<10)?("0"+g):g;V["%j"]=(W<100)?((W<10)?("00"+W):("0"+W)):W;V["%k"]=Y;V["%l"]=g;V["%m"]=(U<9)?("0"+(1+U)):(1+U);V["%M"]=(S<10)?("0"+S):S;V["%n"]="\n";V["%p"]=T?"PM":"AM";V["%P"]=T?"pm":"am";V["%s"]=Math.floor(this.getTime()/1000);V["%S"]=(f<10)?("0"+f):f;V["%t"]="\t";V["%U"]=V["%W"]=V["%V"]=(a<10)?("0"+a):a;V["%u"]=Z+1;V["%w"]=Z;V["%y"]=(""+c).substr(2,2);V["%Y"]=c;V["%%"]="%";var X=/%./g;if(!Calendar.is_ie5&&!Calendar.is_khtml){return d.replace(X,function(A){return V[A]||A})}var b=d.match(X);for(var i=0;i=0;){var G=I.multiple[D];var B=G.c_print("%Y%m%d");A.multiple[B]=G}}A.showsOtherMonths=I.showOthers;A.yearStep=I.step;A.setRange(I.range[0],I.range[1]);A.params=I;A.setDateStatusHandler(I.dateStatusFunc);A.getDateText=I.dateText;A.setDateFormat(C);if(F){A.create()}A.refresh();if(!I.position){A.showAtElement(I.button||I.displayArea||I.inputField,I.align)}else{A.showAt(I.position[0],I.position[1])}return false};return K}; /* http://keith-wood.name/timeEntry.html Time entry for jQuery v1.5.1. Written by Keith Wood (kbwood{at}iinet.com.au) June 2007. Licensed under the MIT (https://github.com/jquery/jquery/blob/master/MIT-LICENSE.txt) license. Please attribute the author if you use it. */ (function($){function TimeEntry(){this._disabledInputs=[];this.regional=[];this.regional['']={show24Hours:true,separator:':',ampmPrefix:'',ampmNames:['AM','PM'],spinnerTexts:['Now','Previous field','Next field','Increment','Decrement']};this._defaults={appendText:'',showSeconds:true,timeSteps:[1,1,1],initialField:0,noSeparatorEntry:false,useMouseWheel:true,defaultTime:null,minTime:null,maxTime:null,spinnerImage:'spinnerDefault.png',spinnerSize:[20,20,8],spinnerBigImage:'',spinnerBigSize:[40,40,16],spinnerIncDecOnly:false,spinnerRepeat:[500,250],beforeShow:null,beforeSetTime:null};$.extend(this._defaults,this.regional[''])}$.extend(TimeEntry.prototype,{markerClassName:'hasTimeEntry',propertyName:'timeEntry',_appendClass:'timeEntry_append',_controlClass:'timeEntry_control',_expandClass:'timeEntry_expand',setDefaults:function(a){$.extend(this._defaults,a||{});return this},_attachPlugin:function(b,c){var d=$(b);if(d.hasClass(this.markerClassName)){return}var e={options:$.extend({},this._defaults,c),input:d,_field:0,_selectedHour:0,_selectedMinute:0,_selectedSecond:0};d.data(this.propertyName,e).addClass(this.markerClassName).bind('focus.'+this.propertyName,this._doFocus).bind('blur.'+this.propertyName,this._doBlur).bind('click.'+this.propertyName,this._doClick).bind('keydown.'+this.propertyName,this._doKeyDown).bind('keypress.'+this.propertyName,this._doKeyPress).bind('paste.'+this.propertyName,function(a){setTimeout(function(){n._parseTime(e)},1)});this._optionPlugin(b,c)},_optionPlugin:function(a,b,c){a=$(a);var d=a.data(this.propertyName);if(!b||(typeof b=='string'&&c==null)){var e=b;b=(d||{}).options;return(b&&e?b[e]:b)}if(!a.hasClass(this.markerClassName)){return}b=b||{};if(typeof b=='string'){var e=b;b={};b[e]=c}var f=this._extractTime(d);$.extend(d.options,b);d._field=0;if(f){this._setTime(d,new Date(0,0,0,f[0],f[1],f[2]))}a.next('span.'+this._appendClass).remove();a.parent().find('span.'+this._controlClass).remove();if($.fn.mousewheel){a.unmousewheel()}var g=(!d.options.spinnerImage?null:$(''));a.after(d.options.appendText?''+d.options.appendText+'':'').after(g||'');if(d.options.useMouseWheel&&$.fn.mousewheel){a.mousewheel(this._doMouseWheel)}if(g){g.mousedown(this._handleSpinner).mouseup(this._endSpinner).mouseover(this._expandSpinner).mouseout(this._endSpinner).mousemove(this._describeSpinner)}},_enablePlugin:function(a){this._enableDisable(a,false)},_disablePlugin:function(a){this._enableDisable(a,true)},_enableDisable:function(b,c){var d=$.data(b,this.propertyName);if(!d){return}b.disabled=c;if(b.nextSibling&&b.nextSibling.nodeName.toLowerCase()=='span'){n._changeSpinner(d,b.nextSibling,(c?5:-1))}n._disabledInputs=$.map(n._disabledInputs,function(a){return(a==b?null:a)});if(c){n._disabledInputs.push(b)}},_isDisabledPlugin:function(a){return $.inArray(a,this._disabledInputs)>-1},_destroyPlugin:function(b){b=$(b);if(!b.hasClass(this.markerClassName)){return}b.removeClass(this.markerClassName).removeData(this.propertyName).unbind('.'+this.propertyName);if($.fn.mousewheel){b.unmousewheel()}this._disabledInputs=$.map(this._disabledInputs,function(a){return(a==b[0]?null:a)});b.siblings('.'+this._appendClass+',.'+this._controlClass).remove()},_setTimePlugin:function(a,b){var c=$.data(a,this.propertyName);if(c){if(b===null||b===''){c.input.val('')}else{this._setTime(c,b?(typeof b=='object'?new Date(b.getTime()):b):null)}}},_getTimePlugin:function(a){var b=$.data(a,this.propertyName);var c=(b?this._extractTime(b):null);return(!c?null:new Date(0,0,0,c[0],c[1],c[2]))},_getOffsetPlugin:function(a){var b=$.data(a,this.propertyName);var c=(b?this._extractTime(b):null);return(!c?0:(c[0]*3600+c[1]*60+c[2])*1000)},_doFocus:function(a){var b=(a.nodeName&&a.nodeName.toLowerCase()=='input'?a:this);if(n._lastInput==b||n._isDisabledPlugin(b)){n._focussed=false;return}var c=$.data(b,n.propertyName);n._focussed=true;n._lastInput=b;n._blurredInput=null;$.extend(c.options,($.isFunction(c.options.beforeShow)?c.options.beforeShow.apply(b,[b]):{}));n._parseTime(c);setTimeout(function(){n._showField(c)},10)},_doBlur:function(a){n._blurredInput=n._lastInput;n._lastInput=null},_doClick:function(b){var c=b.target;var d=$.data(c,n.propertyName);if(!n._focussed){var e=d.options.separator.length+2;d._field=0;if(c.selectionStart!=null){for(var f=0;f<=Math.max(1,d._secondField,d._ampmField);f++){var g=(f!=d._ampmField?(f*e)+2:(d._ampmField*e)+d.options.ampmPrefix.length+d.options.ampmNames[0].length);d._field=f;if(c.selectionStart=48){return true}var b=$.data(a.target,n.propertyName);switch(a.keyCode){case 9:return(a.shiftKey?n._changeField(b,-1,true):n._changeField(b,+1,true));case 35:if(a.ctrlKey){n._setValue(b,'')}else{b._field=Math.max(1,b._secondField,b._ampmField);n._adjustField(b,0)}break;case 36:if(a.ctrlKey){n._setTime(b)}else{b._field=0;n._adjustField(b,0)}break;case 37:n._changeField(b,-1,false);break;case 38:n._adjustField(b,+1);break;case 39:n._changeField(b,+1,false);break;case 40:n._adjustField(b,-1);break;case 46:n._setValue(b,'');break;default:return true}return false},_doKeyPress:function(a){var b=String.fromCharCode(a.charCode==undefined?a.keyCode:a.charCode);if(b<' '){return true}var c=$.data(a.target,n.propertyName);n._handleKeyPress(c,b);return false},_doMouseWheel:function(a,b){if(n._isDisabledPlugin(a.target)){return}var c=$.data(a.target,n.propertyName);c.input.focus();if(!c.input.val()){n._parseTime(c)}n._adjustField(c,b);a.preventDefault()},_expandSpinner:function(b){var c=n._getSpinnerTarget(b);var d=$.data(n._getInput(c),n.propertyName);if(n._isDisabledPlugin(d.input[0])){return}if(d.options.spinnerBigImage){d._expanded=true;var e=$(c).offset();var f=null;$(c).parents().each(function(){var a=$(this);if(a.css('position')=='relative'||a.css('position')=='absolute'){f=a.offset()}return!f});$('
').mousedown(n._handleSpinner).mouseup(n._endSpinner).mouseout(n._endExpand).mousemove(n._describeSpinner).insertAfter(c)}},_getInput:function(a){return $(a).siblings('.'+n.markerClassName)[0]},_describeSpinner:function(a){var b=n._getSpinnerTarget(a);var c=$.data(n._getInput(b),n.propertyName);b.title=c.options.spinnerTexts[n._getSpinnerRegion(c,a)]},_handleSpinner:function(a){var b=n._getSpinnerTarget(a);var c=n._getInput(b);if(n._isDisabledPlugin(c)){return}if(c==n._blurredInput){n._lastInput=c;n._blurredInput=null}var d=$.data(c,n.propertyName);n._doFocus(c);var e=n._getSpinnerRegion(d,a);n._changeSpinner(d,b,e);n._actionSpinner(d,e);n._timer=null;n._handlingSpinner=true;if(e>=3&&d.options.spinnerRepeat[0]){n._timer=setTimeout(function(){n._repeatSpinner(d,e)},d.options.spinnerRepeat[0]);$(b).one('mouseout',n._releaseSpinner).one('mouseup',n._releaseSpinner)}},_actionSpinner:function(a,b){if(!a.input.val()){n._parseTime(a)}switch(b){case 0:this._setTime(a);break;case 1:this._changeField(a,-1,false);break;case 2:this._changeField(a,+1,false);break;case 3:this._adjustField(a,+1);break;case 4:this._adjustField(a,-1);break}},_repeatSpinner:function(a,b){if(!n._timer){return}n._lastInput=n._blurredInput;this._actionSpinner(a,b);this._timer=setTimeout(function(){n._repeatSpinner(a,b)},a.options.spinnerRepeat[1])},_releaseSpinner:function(a){clearTimeout(n._timer);n._timer=null},_endExpand:function(a){n._timer=null;var b=n._getSpinnerTarget(a);var c=n._getInput(b);var d=$.data(c,n.propertyName);$(b).remove();d._expanded=false},_endSpinner:function(a){n._timer=null;var b=n._getSpinnerTarget(a);var c=n._getInput(b);var d=$.data(c,n.propertyName);if(!n._isDisabledPlugin(c)){n._changeSpinner(d,b,-1)}if(n._handlingSpinner){n._lastInput=n._blurredInput}if(n._lastInput&&n._handlingSpinner){n._showField(d)}n._handlingSpinner=false},_getSpinnerTarget:function(a){return a.target||a.srcElement},_getSpinnerRegion:function(a,b){var c=this._getSpinnerTarget(b);var d=$(c).offset();var e=[document.documentElement.scrollLeft||document.body.scrollLeft,document.documentElement.scrollTop||document.body.scrollTop];var f=(a.options.spinnerIncDecOnly?99:b.clientX+e[0]-d.left);var g=b.clientY+e[1]-d.top;var h=a.options[a._expanded?'spinnerBigSize':'spinnerSize'];var i=(a.options.spinnerIncDecOnly?99:h[0]-1-f);var j=h[1]-1-g;if(h[2]>0&&Math.abs(f-i)<=h[2]&&Math.abs(g-j)<=h[2]){return 0}var k=Math.min(f,g,i,j);return(k==f?1:(k==i?2:(k==g?3:4)))},_changeSpinner:function(a,b,c){$(b).css('background-position','-'+((c+1)*a.options[a._expanded?'spinnerBigSize':'spinnerSize'][0])+'px 0px')},_parseTime:function(a){var b=this._extractTime(a);if(b){a._selectedHour=b[0];a._selectedMinute=b[1];a._selectedSecond=b[2]}else{var c=this._constrainTime(a);a._selectedHour=c[0];a._selectedMinute=c[1];a._selectedSecond=(a.options.showSeconds?c[2]:0)}a._secondField=(a.options.showSeconds?2:-1);a._ampmField=(a.options.show24Hours?-1:(a.options.showSeconds?3:2));a._lastChr='';a._field=Math.max(0,Math.min(Math.max(1,a._secondField,a._ampmField),a.options.initialField));if(a.input.val()!=''){this._showTime(a)}},_extractTime:function(a,b){b=b||a.input.val();var c=b.split(a.options.separator);if(a.options.separator==''&&b!=''){c[0]=b.substring(0,2);c[1]=b.substring(2,4);c[2]=b.substring(4,6)}if(c.length>=2){var d=!a.options.show24Hours&&(b.indexOf(a.options.ampmNames[0])>-1);var e=!a.options.show24Hours&&(b.indexOf(a.options.ampmNames[1])>-1);var f=parseInt(c[0],10);f=(isNaN(f)?0:f);f=((d||e)&&f==12?0:f)+(e?12:0);var g=parseInt(c[1],10);g=(isNaN(g)?0:g);var h=(c.length>=3?parseInt(c[2],10):0);h=(isNaN(h)||!a.options.showSeconds?0:h);return this._constrainTime(a,[f,g,h])}return null},_constrainTime:function(a,b){var c=(b!=null);if(!c){var d=this._determineTime(a.options.defaultTime,a)||new Date();b=[d.getHours(),d.getMinutes(),d.getSeconds()]}var e=false;for(var i=0;i1){b[i]=Math.round(b[i]/a.options.timeSteps[i])*a.options.timeSteps[i];e=true}}return b},_showTime:function(a){var b=(this._formatNumber(a.options.show24Hours?a._selectedHour:((a._selectedHour+11)%12)+1)+a.options.separator+this._formatNumber(a._selectedMinute)+(a.options.showSeconds?a.options.separator+this._formatNumber(a._selectedSecond):'')+(a.options.show24Hours?'':a.options.ampmPrefix+a.options.ampmNames[(a._selectedHour<12?0:1)]));this._setValue(a,b);this._showField(a)},_showField:function(a){var b=a.input[0];if(a.input.is(':hidden')||n._lastInput!=b){return}var c=a.options.separator.length+2;var d=(a._field!=a._ampmField?(a._field*c):(a._ampmField*c)-a.options.separator.length+a.options.ampmPrefix.length);var e=d+(a._field!=a._ampmField?2:a.options.ampmNames[0].length);if(b.setSelectionRange){b.setSelectionRange(d,e)}else if(b.createTextRange){var f=b.createTextRange();f.moveStart('character',d);f.moveEnd('character',e-a.input.val().length);f.select()}if(!b.disabled){b.focus()}},_formatNumber:function(a){return(a<10?'0':'')+a},_setValue:function(a,b){if(b!=a.input.val()){a.input.val(b).trigger('change')}},_changeField:function(a,b,c){var d=(a.input.val()==''||a._field==(b==-1?0:Math.max(1,a._secondField,a._ampmField)));if(!d){a._field+=b}this._showField(a);a._lastChr='';return(d&&c)},_adjustField:function(a,b){if(a.input.val()==''){b=0}this._setTime(a,new Date(0,0,0,a._selectedHour+(a._field==0?b*a.options.timeSteps[0]:0)+(a._field==a._ampmField?b*12:0),a._selectedMinute+(a._field==1?b*a.options.timeSteps[1]:0),a._selectedSecond+(a._field==a._secondField?b*a.options.timeSteps[2]:0)))},_setTime:function(a,b){b=this._determineTime(b,a);var c=this._constrainTime(a,b?[b.getHours(),b.getMinutes(),b.getSeconds()]:null);b=new Date(0,0,0,c[0],c[1],c[2]);var b=this._normaliseTime(b);var d=this._normaliseTime(this._determineTime(a.options.minTime,a));var e=this._normaliseTime(this._determineTime(a.options.maxTime,a));b=(d&&be?e:b));if($.isFunction(a.options.beforeSetTime)){b=a.options.beforeSetTime.apply(a.input[0],[this._getTimePlugin(a.input[0]),b,d,e])}a._selectedHour=b.getHours();a._selectedMinute=b.getMinutes();a._selectedSecond=b.getSeconds();this._showTime(a)},_determineTime:function(i,j){var k=function(a){var b=new Date();b.setTime(b.getTime()+a*1000);return b};var l=function(a){var b=n._extractTime(j,a);var c=new Date();var d=(b?b[0]:c.getHours());var e=(b?b[1]:c.getMinutes());var f=(b?b[2]:c.getSeconds());if(!b){var g=/([+-]?[0-9]+)\s*(s|S|m|M|h|H)?/g;var h=g.exec(a);while(h){switch(h[2]||'s'){case's':case'S':f+=parseInt(h[1],10);break;case'm':case'M':e+=parseInt(h[1],10);break;case'h':case'H':d+=parseInt(h[1],10);break}h=g.exec(a)}}c=new Date(0,0,10,d,e,f,0);if(/^!/.test(a)){if(c.getDate()>10){c=new Date(0,0,10,23,59,59)}else if(c.getDate()<10){c=new Date(0,0,10,0,0,0)}}return c};return(i?(typeof i=='string'?l(i):(typeof i=='number'?k(i):i)):null)},_normaliseTime:function(a){if(!a){return null}a.setFullYear(1900);a.setMonth(0);a.setDate(0);return a},_handleKeyPress:function(a,b){if(b==a.options.separator){this._changeField(a,+1,false)}else if(b>='0'&&b<='9'){var c=parseInt(b,10);var d=parseInt(a._lastChr+b,10);var e=(a._field!=0?a._selectedHour:(a.options.show24Hours?(d<24?d:c):(d>=1&&d<=12?d:(c>0?c:a._selectedHour))%12+(a._selectedHour>=12?12:0)));var f=(a._field!=1?a._selectedMinute:(d<60?d:c));var g=(a._field!=a._secondField?a._selectedSecond:(d<60?d:c));var h=this._constrainTime(a,[e,f,g]);this._setTime(a,new Date(0,0,0,h[0],h[1],h[2]));if(a.options.noSeparatorEntry&&a._lastChr){this._changeField(a,+1,false)}else{a._lastChr=b}}else if(!a.options.show24Hours){b=b.toLowerCase();if((b==a.options.ampmNames[0].substring(0,1).toLowerCase()&&a._selectedHour>=12)||(b==a.options.ampmNames[1].substring(0,1).toLowerCase()&&a._selectedHour<12)){var i=a._field;a._field=a._ampmField;this._adjustField(a,+1);a._field=i;this._showField(a)}}}});var m=['getOffset','getTime','isDisabled'];function isNotChained(a,b){if(a=='option'&&(b.length==0||(b.length==1&&typeof b[0]=='string'))){return true}return $.inArray(a,m)>-1}$.fn.timeEntry=function(b){var c=Array.prototype.slice.call(arguments,1);if(isNotChained(b,c)){return n['_'+b+'Plugin'].apply(n,[this[0]].concat(c))}return this.each(function(){if(typeof b=='string'){if(!n['_'+b+'Plugin']){throw'Unknown command: '+b;}n['_'+b+'Plugin'].apply(n,[this].concat(c))}else{var a=($.fn.metadata?$(this).metadata():{});n._attachPlugin(this,$.extend({},a,b||{}))}})};var n=$.timeEntry=new TimeEntry()})(jQuery);web2py-2.12.3.orig/applications/welcome/static/js/web2py.js0000664000000000000000000006733412564727260022270 0ustar rootroot(function($, undefined) { /* * Unobtrusive scripting adapter for jQuery, largely taken from * the wonderful https://github.com/rails/jquery-ujs * * * Released under the MIT license * */ if($.web2py !== undefined) { $.error('web2py.js has already been loaded!'); } String.prototype.reverse = function() { return this.split('').reverse().join(''); }; var web2py; $.web2py = web2py = { popup: function(url) { /* popup a window */ newwindow = window.open(url, 'name', 'height=400,width=600'); if(window.focus) newwindow.focus(); return false; }, collapse: function(id) { /* toggle an element */ $('#' + id).slideToggle(); }, fade: function(id, value) { /*fade something*/ if(value > 0) $('#' + id).hide().fadeIn('slow'); else $('#' + id).show().fadeOut('slow'); }, ajax: function(u, s, t) { /*simple ajax function*/ query = ''; if(typeof s == "string") { d = $(s).serialize(); if(d) { query = d; } } else { pcs = []; if(s != null && s != undefined) for(i = 0; i < s.length; i++) { q = $("[name=" + s[i] + "]").serialize(); if(q) { pcs.push(q); } } if(pcs.length > 0) { query = pcs.join("&"); } } $.ajax({ type: "POST", url: u, data: query, success: function(msg) { if(t) { if(t == ':eval') eval(msg); else if(typeof t == 'string') $("#" + t).html(msg); else t(msg); } } }); }, ajax_fields: function(target) { /* *this attaches something to a newly loaded fragment/page * Ideally all events should be bound to the document, so we can avoid calling * this over and over... all will be bound to the document */ /*adds btn class to buttons*/ $('button', target).addClass('btn'); $('form input[type="submit"], form input[type="button"]', target).addClass('btn'); /* javascript for PasswordWidget*/ $('input[type=password][data-w2p_entropy]', target).each(function() { web2py.validate_entropy($(this)); }); /* javascript for ListWidget*/ $('ul.w2p_list', target).each(function() { function pe(ul, e) { var new_line = ml(ul); rel(ul); if($(e.target).parent().is(':visible')) { /* make sure we didn't delete the element before we insert after */ new_line.insertAfter($(e.target).parent()); } else { /* the line we clicked on was deleted, just add to end of list */ new_line.appendTo(ul); } new_line.find(":text").focus(); return false; } function rl(ul, e) { if($(ul).children().length > 1) { /* only remove if we have more than 1 item so the list is never empty */ $(e.target).parent().remove(); } } function ml(ul) { /* clone the first field */ var line = $(ul).find("li:first").clone(true); line.find(':text').val(''); return line; } function rel(ul) { /* keep only as many as needed*/ $(ul).find("li").each(function() { var trimmed = $.trim($(this.firstChild).val()); if(trimmed == '') $(this).remove(); else $(this.firstChild).val(trimmed); }); } var ul = this; $(ul).find(":text").after('
+ -').keypress(function(e) { return(e.which == 13) ? pe(ul, e) : true; }).next().click(function(e) { pe(ul, e); e.preventDefault(); }).next().click(function(e) { rl(ul, e); e.preventDefault(); }); }); }, ajax_init: function(target) { /*called whenever a fragment gets loaded */ $('.hidden', target).hide(); web2py.manage_errors(target); web2py.ajax_fields(target); web2py.show_if_handler(target); web2py.component_handler(target); }, /* manage errors in forms */ manage_errors: function(target) { $('div.error', target).hide().slideDown('slow'); }, after_ajax: function(xhr) { /* called whenever an ajax request completes */ var command = xhr.getResponseHeader('web2py-component-command'); var flash = xhr.getResponseHeader('web2py-component-flash'); if(command !== null) { eval(decodeURIComponent(command)); } if(flash) { web2py.flash(decodeURIComponent(flash)) } }, event_handlers: function() { /* * This is called once for page * Ideally it should bound all the things that are needed * and require no dom manipulations */ var doc = $(document); doc.on('click', '.flash', function(e) { var t = $(this); if(t.css('top') == '0px') t.slideUp('slow'); else t.fadeOut(); }); doc.on('keyup', 'input.integer', function() { var nvalue = this.value.reverse().replace(/[^0-9\-]|\-(?=.)/g, '').reverse(); if(this.value != nvalue) this.value = nvalue; }); doc.on('keyup', 'input.double, input.decimal', function() { var nvalue = this.value.reverse().replace(/[^0-9\-\.,]|[\-](?=.)|[\.,](?=[0-9]*[\.,])/g, '').reverse(); if(this.value != nvalue) this.value = nvalue; }); var confirm_message = (typeof w2p_ajax_confirm_message != 'undefined') ? w2p_ajax_confirm_message : "Are you sure you want to delete this object?"; doc.on('click', "input[type='checkbox'].delete", function() { if(this.checked) if(!web2py.confirm(confirm_message)) this.checked = false; }); var datetime_format = (typeof w2p_ajax_datetime_format != 'undefined') ? w2p_ajax_datetime_format : "%Y-%m-%d %H:%M:%S"; doc.on('click', "input.datetime", function() { var tformat = $(this).data('w2p_datetime_format'); var active = $(this).data('w2p_datetime'); var format = (typeof tformat != 'undefined') ? tformat : datetime_format; if(active === undefined) { Calendar.setup({ inputField: this, ifFormat: format, showsTime: true, timeFormat: "24" }); $(this).attr('autocomplete', 'off'); $(this).data('w2p_datetime', 1); $(this).trigger('click'); } }); var date_format = (typeof w2p_ajax_date_format != 'undefined') ? w2p_ajax_date_format : "%Y-%m-%d"; doc.on('click', "input.date", function() { var tformat = $(this).data('w2p_date_format'); var active = $(this).data('w2p_date'); var format = (typeof tformat != 'undefined') ? tformat : date_format; if(active === undefined) { Calendar.setup({ inputField: this, ifFormat: format, showsTime: false }); $(this).data('w2p_date', 1); $(this).attr('autocomplete', 'off'); $(this).trigger('click'); } }); doc.on('focus', "input.time", function() { var active = $(this).data('w2p_time'); if(active === undefined) { $(this).timeEntry({ spinnerImage: '' }).attr('autocomplete', 'off'); $(this).data('w2p_time', 1); } }); /* help preventing double form submission for normal form (not LOADed) */ $(doc).on('submit', 'form', function() { var submit_button = $(this).find(web2py.formInputClickSelector); web2py.disableElement(submit_button); }); doc.ajaxSuccess(function(e, xhr) { var redirect = xhr.getResponseHeader('web2py-redirect-location'); if(redirect !== null) { window.location = redirect; }; /* run this here only if this Ajax request is NOT for a web2py component. */ if(xhr.getResponseHeader('web2py-component-content') == null) { web2py.after_ajax(xhr); }; }); doc.ajaxError(function(e, xhr, settings, exception) { /*personally I don't like it. *if there's an error it it flashed and can be removed *as any other message *doc.off('click', '.flash') */ switch(xhr.status) { case 500: web2py.flash(ajax_error_500); } }); }, trap_form: function(action, target) { /* traps any LOADed form */ $('#' + target + ' form').each(function(i) { var form = $(this); if(form.hasClass('no_trap')) { return; } form.attr('data-w2p_target', target); var url = form.attr('action'); if((url === "") || (url === "#") || (typeof url === 'undefined')) { /* form has no action. Use component url. */ url = action; } form.submit(function(e) { web2py.disableElement(form.find(web2py.formInputClickSelector)); web2py.hide_flash(); web2py.ajax_page('post', url, form.serialize(), target, form); e.preventDefault(); }); form.on('click', web2py.formInputClickSelector, function(e) { e.preventDefault(); var input_name = $(this).attr('name'); if(input_name != undefined) { $('').attr('name', input_name) .attr('value', $(this).val()).appendTo(form) } form.trigger('submit'); }); }); }, ajax_page: function(method, action, data, target, element) { /* element is a new parameter, but should be put be put in front */ if(element == undefined) element = $(document); /* if target is not there, fill it with something that there isn't in the page*/ if(target == undefined || target == '') target = 'w2p_none'; if(web2py.fire(element, 'ajax:before', null, target)) { /*test a usecase, should stop here if returns false */ $.ajax({ 'type': method, 'url': action, 'data': data, 'beforeSend': function(xhr, settings) { xhr.setRequestHeader('web2py-component-location', document.location); xhr.setRequestHeader('web2py-component-element', target); return web2py.fire(element, 'ajax:beforeSend', [xhr, settings], target); //test a usecase, should stop here if returns false }, 'success': function(data, status, xhr) { /*bummer for form submissions....the element is not there after complete *because it gets replaced by the new response.... */ web2py.fire(element, 'ajax:success', [data, status, xhr], target); }, 'error': function(xhr, status, error) { /*bummer for form submissions....in addition to the element being not there after *complete because it gets replaced by the new response, standard form *handling just returns the same status code for good and bad *form submissions (i.e. that triggered a validator error) */ web2py.fire(element, 'ajax:error', [xhr, status, error], target); }, 'complete': function(xhr, status) { web2py.fire(element, 'ajax:complete', [xhr, status], target); web2py.updatePage(xhr, target); /* Parse and load the html received */ web2py.trap_form(action, target); web2py.ajax_init('#' + target); web2py.after_ajax(xhr); } }); } }, component: function(action, target, timeout, times, el) { /* element is a new parameter, but should be put in front */ $(function() { var jelement = $("#" + target); var element = jelement.get(0); var statement = "jQuery('#" + target + "').get(0).reload();"; element.reload = function() { /* Continue if times is Infinity or * the times limit is not reached */ if(element.reload_check()) { web2py.ajax_page('get', action, null, target, el); } }; /* Method to check timing limit */ element.reload_check = function() { if(jelement.hasClass('w2p_component_stop')) { clearInterval(this.timing); return false; } if(this.reload_counter == Infinity) { return true; } else { if(!isNaN(this.reload_counter)) { this.reload_counter -= 1; if(this.reload_counter < 0) { if(!this.run_once) { clearInterval(this.timing); return false; } } else { return true; } } } return false; }; if(!isNaN(timeout)) { element.timeout = timeout; element.reload_counter = times; if(times > 1) { /* Multiple or infinite reload * Run first iteration */ web2py.ajax_page('get', action, null, target, el); element.run_once = false; element.timing = setInterval(statement, timeout); element.reload_counter -= 1; } else if(times == 1) { /* Run once with timeout */ element.run_once = true; element.setTimeout = setTimeout; element.timing = setTimeout(statement, timeout); } } else { /* run once (no timeout specified) */ element.reload_counter = Infinity; web2py.ajax_page('get', action, null, target, el); } }); }, updatePage: function(xhr, target) { var t = $('#' + target); var html = $.parseHTML(xhr.responseText, document, true); var title_elements = $(html).filter('title').add($(html).find('title')); var title = title_elements.last().text(); if(title) { title_elements.remove(); /* Remove any title elements from the response */ document.title = $.trim(title); /* Set the new document title */ } var content = xhr.getResponseHeader('web2py-component-content'); if(content == 'prepend') t.prepend(xhr.responseText); else if(content == 'append') t.append(xhr.responseText); else if(content != 'hide') t.html(html); }, calc_entropy: function(mystring) { /* calculate a simple entropy for a given string */ var csets = new Array( 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', '0123456789', '!@#$\%^&*()', '~`-_=+[]{}\|;:\'",.<>?/', '0123456789abcdefghijklmnopqrstuvwxyz'); var score = 0, other = {}, seen = {}, lastset = null, mystringlist = mystring.split(''); for(var i = 0; i < mystringlist.length; i++) { /* classify this character */ var c = mystringlist[i], inset = 5; for(var j = 0; j < csets.length; j++) if(csets[j].indexOf(c) != -1) { inset = j; break; } /*calculate effect of character on alphabet size */ if(!(inset in seen)) { seen[inset] = 1; score += csets[inset].length; } else if(!(c in other)) { score += 1; other[c] = 1; } if(inset != lastset) { score += 1; lastset = inset; } } var entropy = mystring.length * Math.log(score) / 0.6931471805599453; return Math.round(entropy * 100) / 100 }, validate_entropy: function(myfield, req_entropy) { if(myfield.data('w2p_entropy') != undefined) req_entropy = myfield.data('w2p_entropy'); var validator = function() { var v = (web2py.calc_entropy(myfield.val()) || 0) / req_entropy; var r = 0, g = 0, b = 0, rs = function(x) { return Math.round(x * 15).toString(16) }; if(v <= 0.5) { r = 1.0; g = 2.0 * v; } else { r = (1.0 - 2.0 * (Math.max(v, 0) - 0.5)); g = 1.0; } var color = '#' + rs(r) + rs(g) + rs(b); myfield.css('background-color', color); entropy_callback = myfield.data('entropy_callback'); if(entropy_callback) entropy_callback(v); } if(!myfield.hasClass('entropy_check')) myfield.on('keyup', validator).on('keydown', validator).addClass('entropy_check'); }, web2py_websocket: function(url, onmessage, onopen, onclose) { if("WebSocket" in window) { var ws = new WebSocket(url); ws.onopen = onopen ? onopen : (function() {}); ws.onmessage = onmessage; ws.onclose = onclose ? onclose : (function() {}); return true; /* supported */ } else return false; /* not supported */ }, /* new from here */ /* Form input elements bound by web2py.js */ formInputClickSelector: 'input[type=submit], input[type=image], button[type=submit], button:not([type])', /* Form input elements disabled during form submission */ disableSelector: 'input, button, textarea, select', /* Form input elements re-enabled after form submission */ enableSelector: 'input:disabled, button:disabled, textarea:disabled, select:disabled', /* Triggers an event on an element and returns false if the event result is false */ fire: function(obj, type, data, target) { var event = $.Event(type, { 'containerTarget': $('#' + target)[0] }); obj.trigger(event, data); return event.result !== false; }, /* Helper function, needed to provide consistent behavior in IE */ stopEverything: function(e) { $(e.target).trigger('w2p:everythingStopped'); e.stopImmediatePropagation(); return false; }, confirm: function(message) { return confirm(message); }, /* replace element's html with the 'data-disable-with' after storing original html * and prevent clicking on it */ disableElement: function(el) { el.addClass('disabled'); var method = el.is('input') ? 'val' : 'html'; //method = el.attr('name') ? 'html' : 'val'; var disable_with_message = (typeof w2p_ajax_disable_with_message != 'undefined') ? w2p_ajax_disable_with_message : "Working..."; /*store enabled state if not already disabled */ if(el.data('w2p_enable_with') === undefined) { el.data('w2p_enable_with', el[method]()); } /*if you don't want to see "working..." on buttons, replace the following * two lines with this one * el.data('w2p_disable_with', el[method]()); */ if((el.data('w2p_disable_with') == 'default') || (el.data('w2p_disable_with') === undefined)) { el.data('w2p_disable_with', disable_with_message); } /* set to disabled state*/ el[method](el.data('w2p_disable_with')); el.bind('click.w2pDisable', function(e) { /* prevent further clicking*/ return web2py.stopEverything(e); }); }, /* restore element to its original state which was disabled by 'disableElement' above*/ enableElement: function(el) { var method = el.is('input') ? 'val' : 'html'; if(el.data('w2p_enable_with') !== undefined) { /* set to old enabled state */ el[method](el.data('w2p_enable_with')); el.removeData('w2p_enable_with'); } el.removeClass('disabled'); el.unbind('click.w2pDisable'); }, /*convenience wrapper, internal use only */ simple_component: function(action, target, element) { web2py.component(action, target, 0, 1, element); }, /*helper for flash messages*/ flash: function(message, status) { var flash = $('.flash'); web2py.hide_flash(); flash.html(message).addClass(status); if(flash.html()) flash.append(' × ').slideDown(); }, hide_flash: function() { $('.flash').fadeOut(0).html(''); }, show_if_handler: function(target) { var triggers = {}; var show_if = function() { var t = $(this); var id = t.attr('id'); t.attr('value', t.val()); for(var k = 0; k < triggers[id].length; k++) { var dep = $('#' + triggers[id][k], target); var tr = $('#' + triggers[id][k] + '__row', target); if(t.is(dep.attr('data-show-if'))) tr.slideDown(); else tr.hide(); } }; $('[data-show-trigger]', target).each(function() { var name = $(this).attr('data-show-trigger'); // The field exists only when creating/editing a row if($('#' + name).length) { if(!triggers[name]) triggers[name] = []; triggers[name].push($(this).attr('id')); } }); for(var name in triggers) { $('#' + name, target).change(show_if).keyup(show_if); show_if.call($('#' + name, target)); }; }, component_handler: function(target) { $('div[data-w2p_remote]', target).each(function() { var remote, times, timeout, target; var el = $(this); remote = el.data('w2p_remote'); times = el.data('w2p_times'); timeout = el.data('w2p_timeout'); target = el.attr('id'); web2py.component(remote, target, timeout, times, $(this)); }) }, a_handler: function(el, e) { e.preventDefault(); var method = el.data('w2p_method'); var action = el.attr('href'); var target = el.data('w2p_target'); var confirm_message = el.data('w2p_confirm'); var pre_call = el.data('w2p_pre_call'); if(pre_call != undefined) { eval(pre_call); } if(confirm_message) { if(confirm_message == 'default') confirm_message = w2p_ajax_confirm_message || 'Are you sure you want to delete this object?'; if(!web2py.confirm(confirm_message)) { web2py.stopEverything(e); return; } } if(target == undefined) { if(method == 'GET') { web2py.ajax_page('get', action, [], '', el); } else if(method == 'POST') { web2py.ajax_page('post', action, [], '', el); } } else { if(method == 'GET') { web2py.ajax_page('get', action, [], target, el); } else if(method == 'POST') { web2py.ajax_page('post', action, [], target, el); } } }, a_handlers: function() { var el = $(document); el.on('click', 'a[data-w2p_method]', function(e) { web2py.a_handler($(this), e); }); /* removal of element should happen only on success */ el.on('ajax:success', 'a[data-w2p_method][data-w2p_remove]', function(e) { var el = $(this); var toremove = el.data('w2p_remove'); if(toremove != undefined) { toremove = el.closest(toremove); if(!toremove.length) { /*this enables removal of whatever selector if a closest is not found */ toremove = $(toremove); } toremove.remove(); } }); el.on('ajax:beforeSend', 'a[data-w2p_method][data-w2p_disable_with]', function(e) { web2py.disableElement($(this)); }); /*re-enable click on completion*/ el.on('ajax:complete', 'a[data-w2p_method][data-w2p_disable_with]', function(e) { web2py.enableElement($(this)); }); }, /* Disables form elements: - Caches element value in 'w2p_enable_with' data store - Replaces element text with value of 'data-disable-with' attribute - Sets disabled property to true */ disableFormElements: function(form) { form.find(web2py.disableSelector).each(function() { var element = $(this), method = element.is('button') ? 'html' : 'val'; var disable_with = element.data('w2p_disable_with'); if(disable_with == undefined) { element.data('w2p_disable_with', element[method]()) } if(element.data('w2p_enable_with') === undefined) { element.data('w2p_enable_with', element[method]()); } element[method](element.data('w2p_disable_with')); element.prop('disabled', true); }); }, /* Re-enables disabled form elements: - Replaces element text with cached value from 'w2p_enable_with' data store (created in `disableFormElements`) - Sets disabled property to false */ enableFormElements: function(form) { form.find(web2py.enableSelector).each(function() { var element = $(this), method = element.is('button') ? 'html' : 'val'; if(element.data('w2p_enable_with')) { element[method](element.data('w2p_enable_with')); element.removeData('w2p_enable_with'); } element.prop('disabled', false); }); }, form_handlers: function() { var el = $(document); el.on('ajax:beforeSend', 'form[data-w2p_target]', function(e) { web2py.disableFormElements($(this)); }); el.on('ajax:complete', 'form[data-w2p_target]', function(e) { web2py.enableFormElements($(this)); }); }, /* Invalidate and force reload of a web2py component */ invalidate: function(target) { $('div[data-w2p_remote]', target).each(function() { var el = $('#' + $(this).attr('id')).get(0); if(el.timing !== undefined) { // Block triggering regular routines clearInterval(el.timing); } }); $.web2py.component_handler(target); }, main_hook: function() { var flash = $('.flash'); flash.hide(); if(flash.html()) web2py.flash(flash.html()); web2py.ajax_init(document); web2py.event_handlers(); web2py.a_handlers(); web2py.form_handlers(); } } /*end of functions */ /*main hook*/ $(function() { web2py.main_hook(); }); })(jQuery); /* compatibility code - start */ ajax = jQuery.web2py.ajax; web2py_component = jQuery.web2py.component; web2py_websocket = jQuery.web2py.web2py_websocket; web2py_ajax_page = jQuery.web2py.ajax_page; /*needed for IS_STRONG(entropy)*/ web2py_validate_entropy = jQuery.web2py.validate_entropy; /*needed for crud.search and SQLFORM.grid's search*/ web2py_ajax_fields = jQuery.web2py.ajax_fields; /*used for LOAD(ajax=False)*/ web2py_trap_form = jQuery.web2py.trap_form; /*undocumented - rare*/ popup = jQuery.web2py.popup; collapse = jQuery.web2py.collapse; fade = jQuery.web2py.fade; /* internals - shouldn't be needed web2py_ajax_init = jQuery.web2py.ajax_init; web2py_event_handlers = jQuery.web2py.event_handlers; web2py_trap_link = jQuery.web2py.trap_link; web2py_calc_entropy = jQuery.web2py.calc_entropy; */ /* compatibility code - end*/ web2py-2.12.3.orig/applications/welcome/static/js/share.js0000664000000000000000000000510012564727260022141 0ustar rootroot/** Created and copyrighted by Massimo Di Pierro (MIT license) Example: **/ jQuery(function(){ var script_source = jQuery('script[src*="share.js"]').attr('src'); var params = function(name,default_value) { var match = RegExp('[?&]' + name + '=([^&]*)').exec(script_source); return match && decodeURIComponent(match[1].replace(/\+/g, ' '))||default_value; } var path = params('static','social'); var url = encodeURIComponent(window.location.href); var host = window.location.hostname; var title = escape(jQuery('title').text()); var twit = 'http://twitter.com/home?status='+title+'%20'+url; var facebook = 'http://www.facebook.com/sharer.php?u='+url; var gplus = 'https://plus.google.com/share?url='+url; var tbar = '
Share
Share on TwitterShare on facebookShare on Google Plus
'; // Add the share tool bar. jQuery('body').append(tbar); var st = jQuery('#socialdrawer'); st.css({'opacity':'.7','z-index':'3000','background':'#FFF','border':'solid 1px #666','border-width':' 1px 0 0 1px','height':'20px','width':'40px','position':'fixed','bottom':'0','right':'0','padding':'2px 5px','overflow':'hidden','-webkit-border-top-left-radius':' 12px','-moz-border-radius-topleft':' 12px','border-top-left-radius':' 12px','-moz-box-shadow':' -3px -3px 3px rgba(0,0,0,0.5)','-webkit-box-shadow':' -3px -3px 3px rgba(0,0,0,0.5)','box-shadow':' -3px -3px 3px rgba(0,0,0,0.5)'}); jQuery('#socialdrawer a').css({'float':'left','width':'32px','margin':'3px 2px 2px 2px','padding':'0','cursor':'pointer'}); jQuery('#socialdrawer span').css({'float':'left','margin':'2px 3px','text-shadow':' 1px 1px 1px #FFF','color':'#444','font-size':'12px','line-height':'1em'}); jQuery('#socialdrawer img').hide(); // hover st.click(function(){ jQuery(this).animate({height:'40px', width:'160px', opacity: 0.95}, 300); jQuery('#socialdrawer img').show(); }); //leave st.mouseleave(function(){ st.animate({height:'20px', width: '40px', opacity: .7}, 300); jQuery('#socialdrawer img').hide(); return false; } ); }); web2py-2.12.3.orig/applications/welcome/static/js/analytics.min.js0000664000000000000000000072124712564727260023631 0ustar rootroot(function umd(require){if("object"==typeof exports){module.exports=require("1")}else if("function"==typeof define&&define.amd){define(function(){return require("1")})}else{this["analytics"]=require("1")}})(function outer(modules,cache,entries){var global=function(){return this}();function require(name,jumped){if(cache[name])return cache[name].exports;if(modules[name])return call(name,require);throw new Error('cannot find module "'+name+'"')}function call(id,require){var m=cache[id]={exports:{}};var mod=modules[id];var name=mod[2];var fn=mod[0];fn.call(m.exports,function(req){var dep=modules[id][1][req];return require(dep?dep:req)},m,m.exports,outer,modules,cache,entries);if(name)cache[name]=cache[id];return cache[id].exports}for(var id in entries){if(entries[id]){global[entries[id]]=require(id)}else{require(id)}}require.duo=true;require.cache=cache;require.modules=modules;return require}({1:[function(require,module,exports){var _analytics=window.analytics;var Integrations=require("analytics.js-integrations");var Analytics=require("./analytics");var each=require("each");var analytics=module.exports=exports=new Analytics;analytics.require=require;exports.VERSION=require("../bower.json").version;each(Integrations,function(name,Integration){analytics.use(Integration)})},{"analytics.js-integrations":2,"./analytics":3,each:4,"../bower.json":5}],2:[function(require,module,exports){var each=require("each");var plugins=require("./integrations.js");each(plugins,function(plugin){var name=(plugin.Integration||plugin).prototype.name;exports[name]=plugin})},{each:4,"./integrations.js":6}],4:[function(require,module,exports){var type=require("type");var has=Object.prototype.hasOwnProperty;module.exports=function(obj,fn){switch(type(obj)){case"array":return array(obj,fn);case"object":if("number"==typeof obj.length)return array(obj,fn);return object(obj,fn);case"string":return string(obj,fn)}};function string(obj,fn){for(var i=0;i').tag("https",'');Clicky.prototype.initialize=function(page){var user=this.analytics.user();window.clicky_site_ids=window.clicky_site_ids||[this.options.siteId];this.identify(new Identify({userId:user.id(),traits:user.traits()}));this.load(this.ready)};Clicky.prototype.loaded=function(){return is.object(window.clicky)};Clicky.prototype.page=function(page){var properties=page.properties();var category=page.category();var name=page.fullName();window.clicky.log(properties.path,name||properties.title)};Clicky.prototype.identify=function(identify){window.clicky_custom=window.clicky_custom||{};window.clicky_custom.session=window.clicky_custom.session||{};var traits=identify.traits();var username=identify.username();var email=identify.email();var name=identify.name();if(username||email||name)traits.username=username||email||name;extend(window.clicky_custom.session,traits)};Clicky.prototype.track=function(track){window.clicky.goal(track.event(),track.revenue())}},{facade:147,extend:145,"analytics.js-integration":88,is:91}],25:[function(require,module,exports){var integration=require("analytics.js-integration");var useHttps=require("use-https");var Comscore=module.exports=integration("comScore").assumesPageview().global("_comscore").global("COMSCORE").option("c1","2").option("c2","").tag("http",'")}},{bind:101,domify:119,each:4,extend:145,"analytics.js-integration":88,json:179}],179:[function(require,module,exports){var json=window.JSON||{};var stringify=json.stringify;var parse=json.parse;module.exports=parse&&stringify?JSON:require("json-fallback")},{"json-fallback":180}],180:[function(require,module,exports){(function(){"use strict";var JSON=module.exports={};function f(n){return n<10?"0"+n:n}if(typeof Date.prototype.toJSON!=="function"){Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(){return this.valueOf()}}var cx,escapable,gap,indent,meta,rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+string+'"'}function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==="object"&&typeof value.toJSON==="function"){value=value.toJSON(key)}if(typeof rep==="function"){value=rep.call(holder,key,value)}switch(typeof value){case"string":return quote(value);case"number":return isFinite(value)?String(value):"null";case"boolean":case"null":return String(value);case"object":if(!value){return"null"}gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==="[object Array]"){length=value.length;for(i=0;i').mapping("events");Facebook.prototype.initialize=function(page){window._fbq=window._fbq||[];this.load(this.ready);window._fbq.loaded=true};Facebook.prototype.loaded=function(){return!!(window._fbq&&window._fbq.loaded)};Facebook.prototype.track=function(track){var event=track.event();var events=this.events(event);var revenue=track.revenue()||0;var self=this;each(events,function(event){push("track",event,{value:String(revenue.toFixed(2)),currency:self.options.currency})});if(!events.length){var data=track.properties();push("track",event,data)}}},{"analytics.js-integration":88,"global-queue":173,each:4}],34:[function(require,module,exports){var push=require("global-queue")("_fxm");var integration=require("analytics.js-integration");var Track=require("facade").Track;var each=require("each");var FoxMetrics=module.exports=integration("FoxMetrics").assumesPageview().global("_fxm").option("appId","").tag('');FullStory.prototype.initialize=function(){var self=this;window._fs_debug=this.options.debug;window._fs_host="www.fullstory.com";window._fs_org=this.options.org;(function(m,n,e,t,l,o,g,y){g=m[e]=function(a,b){g.q?g.q.push([a,b]):g._api(a,b)};g.q=[];g.identify=function(i,v){g(l,{uid:i});if(v)g(l,v)};g.setUserVars=function(v){FS(l,v)};g.setSessionVars=function(v){FS("session",v)};g.setPageVars=function(v){FS("page",v)};self.ready();self.load()})(window,document,"FS","script","user")};FullStory.prototype.loaded=function(){return!!window.FS};FullStory.prototype.identify=function(identify){var id=identify.userId()||identify.anonymousId();var traits=identify.traits();del(traits,"id");if(identify.name()){traits.displayName=identify.name();del(traits,"name")}each(traits,function(trait,value){if(trait!=="displayName"&&trait!=="email"){var newTrait=convert(trait,value);traits[newTrait]=value;del(traits,trait)}});if(typeof id!=="string")id=""+id;window.FS.identify(id,traits)};function convert(trait,value){if(is.string(value))return trait+="_str";if(isInt(value))return trait+="_int";if(isFloat(value))return trait+="_real";if(is.date(value))return trait+="_date";if(is.boolean(value))return trait+="_bool"}function isFloat(n){return n===+n&&n!==(n|0)}function isInt(n){return n===+n&&n===(n|0)}},{each:4,is:91,"obj-case":92,"analytics.js-integration":88}],37:[function(require,module,exports){var integration=require("analytics.js-integration");var push=require("global-queue")("_gauges");var Gauges=module.exports=integration("Gauges").assumesPageview().global("_gauges").option("siteId","").tag(' {{ response.files.append(URL('static','css/web2py.css')) response.files.append(URL('static','css/bootstrap.min.css')) response.files.append(URL('static','css/bootstrap-responsive.min.css')) response.files.append(URL('static','css/web2py_bootstrap.css')) response.files.append(URL('static','css/examples.css')) }} {{include 'web2py_ajax.html'}} {{ # using sidebars need to know what sidebar you want to use left_sidebar_enabled = globals().get('left_sidebar_enabled',False) right_sidebar_enabled = globals().get('right_sidebar_enabled',False) middle_columns = {0:'span12',1:'span9',2:'span6'}[ (left_sidebar_enabled and 1 or 0)+(right_sidebar_enabled and 1 or 0)] }} {{block head}}{{end}}
{{if left_sidebar_enabled:}} {{pass}}
{{block center}} {{include}} {{end}}
{{if right_sidebar_enabled:}}
{{block right_sidebar}}

Right Sidebar

{{end}}
{{pass}}
{{if response.google_analytics_id:}} {{pass}} web2py-2.12.3.orig/applications/examples/views/generic.json0000664000000000000000000000065312564727260022435 0ustar rootroot{{ ### # response._vars contains the dictionary returned by the controller action ### try: from gluon.serializers import json response.write(json(response._vars), escape=False) response.headers['Content-Type'] = 'application/json; charset=utf-8' except (TypeError, ValueError): raise HTTP(405, 'JSON serialization error') except ImportError: raise HTTP(405, 'JSON not available') except: raise HTTP(405, 'JSON error') }} web2py-2.12.3.orig/applications/examples/views/default/0000775000000000000000000000000012564727260021546 5ustar rootrootweb2py-2.12.3.orig/applications/examples/views/default/changelog.html0000664000000000000000000000011512564727260024360 0ustar rootroot{{extend 'layout.html'}}
{{=changelog}}
web2py-2.12.3.orig/applications/examples/views/default/what.html0000664000000000000000000000225412564727260023402 0ustar rootroot{{right_sidebar_enabled = True}} {{extend 'layout.html'}} {{import os}} {{=get_content('whyweb2py')}} {{block right_sidebar}}

SITES POWERED BY WEB2PY

{{end}} web2py-2.12.3.orig/applications/examples/views/default/support.html0000664000000000000000000000567612564727260024166 0ustar rootroot{{extend 'layout.html'}}

Support for web2pyTM

You can get a lot of free support by joining our mailing list.

Affiliated Companies

For long term professional support, code review, and contract work, you can contact our core developers:

For professional support, you can also contact one of the companies below:

{{block leftbadges}}{{end}} web2py-2.12.3.orig/applications/examples/views/default/examples.html0000664000000000000000000011370712564727260024263 0ustar rootroot{{extend 'layout.html'}} {{import os}}

web2pyTM Examples

Simple Examples

Here are some working and complete examples that explain the basic syntax of the framework.
You can click on the web2py keywords (in the highlighted code!) to get documentation.

Example {{c=1}}{{=c}}{{c+=1}}

In controller: simple_examples.py {{=CODE(""" def hello1(): return "Hello World" """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

If the controller function returns a string, that is the body of the rendered page.
Try it here: hello1

Example {{=c}}{{c+=1}}

In controller: simple_examples.py {{=CODE(""" def hello2(): return T("Hello World") """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

The function T() marks strings that need to be translated. Translation dictionaries can be created at /admin/default/design
Try it here: hello2

Example {{=c}}{{c+=1}}

In controller: simple_examples.py {{=CODE(""" def hello3(): return dict(message=T("Hello World")) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}} and view: simple_examples/hello3.html {{=CODE(open(os.path.join(request.folder,'views/simple_examples/hello3.html'),'r').read(),language='html',link=URL('global','vars'),_class='boxCode')}}

If you return a dictionary, the variables defined in the dictionery are visible to the view (template).
Try it here: hello3

Actions can also be be rendered in other formsts like JSON, hello3.json, and XML, hello3.xml

Example {{=c}}{{c+=1}}

In controller: simple_examples.py {{=CODE(""" def hello4(): response.view='simple_examples/hello3.html' return dict(message=T("Hello World")) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

You can change the view, but the default is /[controller]/[function].html. If the default is not found web2py tries to render the page using the generic.html view.
Try it here: hello4

Example {{=c}}{{c+=1}}

In controller: simple_examples.py {{=CODE(""" def hello5(): return HTML(BODY(H1(T('Hello World'),_style="color: red;"))).xml() # .xml to serialize """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

You can also generate HTML using helper objects HTML, BODY, H1, etc. Each of these tags is a class and the views know how to render the corresponding objects. The method .xml() serializes them and produce html/xml code for the page. Each tag, DIV for example, takes three types of arguments:

  • unnamed arguments, they correspond to nested tags
  • named arguments and name starts with '_'. These are mapped blindly into tag attributes and the '_' is removed. attributes without value like "READONLY" can be created with the argument "_readonly=ON".
  • named arguments and name does not start with '_'. They have a special meaning. See "value=" for INPUT, TEXTAREA, SELECT tags later.

Try it here: hello5

Example {{=c}}{{c+=1}}

In controller: simple_examples.py {{=CODE(""" def hello6(): response.flash=T("Hello World in a flash!") return dict(message=T("Hello World")) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

response.flash allows you to flash a message to the user when the page is returned. Use session.flash instead of response.flash to display a message after redirection. With default layout, you can click on the flash to make it disappear.
Try it here: hello6

Example {{=c}}{{c+=1}}

In controller: simple_examples.py {{=CODE(""" def status(): return dict(toobar=response.toolbar()) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

Here we are showing the request, session and response objects using the generic.html template.
Try it here: status

Example {{=c}}{{c+=1}}

In controller: simple_examples.py {{=CODE(""" def redirectme(): redirect(URL('hello3')) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

You can do redirect.
Try it here: redirectme

Example {{=c}}{{c+=1}}

In controller: simple_examples.py {{=CODE(""" def raisehttp(): raise HTTP(400,"internal error") """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

You can raise HTTP exceptions to return an error page.
Try it here: raisehttp

Example {{=c}}{{c+=1}}

In controller: simple_examples.py {{=CODE(""" def raiseexception(): 1/0 return 'oops' """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

If an exception occurs (other than HTTP) a ticket is generated and the event is logged for the administrator. These tickets and logs can be accessed, reviewed and deleted at any later time.

Example {{=c}}{{c+=1}}

In controller: simple_examples.py {{=CODE(""" def servejs(): import gluon.contenttype response.headers['Content-Type']=gluon.contenttype.contenttype('.js') return 'alert("This is a Javascript document, it is not supposed to run!");' """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

You can serve other than HTML pages by changing the contenttype via the response.headers. The gluon.contenttype module can help you figure the type of the file to be served. NOTICE: this is not necessary for static files unless you want to require authorization.
Try it here: servejs

Example {{=c}}{{c+=1}}

In controller: simple_examples.py {{=CODE(""" def makejson(): return response.json(['foo', {'bar': ('baz', None, 1.0, 2)}]) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

If you are into Ajax, web2py includes gluon.contrib.simplejson, developed by Bob Ippolito. This module provides a fast and easy way to serve asynchronous content to your Ajax page. gluon.simplesjson.dumps(...) can serialize most Python types into JSON. gluon.contrib.simplejson.loads(...) performs the reverse operation.
Try it here: makejson

New in web2py 1.63: Any normal action returning a dict is automatically serialized in JSON if '.json' is appended to the URL.

Example {{=c}}{{c+=1}}

In controller: simple_examples.py {{=CODE(""" def makertf(): import gluon.contrib.pyrtf as q doc=q.Document() section=q.Section() doc.Sections.append(section) section.append('Section Title') section.append('web2py is great. '*100) response.headers['Content-Type']='text/rtf' return q.dumps(doc) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

web2py also includes gluon.contrib.pyrtf, developed by Simon Cusack and revised by Grant Edwards. This module allows you to generate Rich Text Format documents including colored formatted text and pictures.
Try it here: makertf

Example {{=c}}{{c+=1}}

In controller: simple_examples.py {{=CODE(""" def rss_aggregator(): import datetime import gluon.contrib.rss2 as rss2 import gluon.contrib.feedparser as feedparser d = feedparser.parse("http://rss.slashdot.org/Slashdot/slashdot/to") rss = rss2.RSS2(title=d.channel.title, link = d.channel.link, description = d.channel.description, lastBuildDate = datetime.datetime.now(), items = [ rss2.RSSItem( title = entry.title, link = entry.link, description = entry.description, # guid = rss2.Guid('unkown'), pubDate = datetime.datetime.now()) for entry in d.entries] ) response.headers['Content-Type']='application/rss+xml' return rss2.dumps(rss) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

web2py includes gluon.contrib.rss2, developed by Dalke Scientific Software, which generates RSS2 feeds, and gluon.contrib.feedparser, developed by Mark Pilgrim, which collects RSS and ATOM feeds. The above controller collects a slashdot feed and makes new one.
Try it here: rss_aggregator

Example {{=c}}{{c+=1}}

In controller: simple_examples.py {{=CODE(""" def ajaxwiki(): form=FORM(TEXTAREA(_id='text',_name='text'), INPUT(_type='button',_value='markmin', _onclick="ajax('ajaxwiki_onclick',['text'],'html')")) return dict(form=form,html=DIV(_id='html')) def ajaxwiki_onclick(): return MARKMIN(request.vars.text).xml() """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

The markmin wiki markup is described here. web2py also includes gluon.contrib.markdown.WIKI helper (markdown2) which converts WIKI markup to HTML following this syntax. In this example we added a fancy ajax effect.
Try it here: ajaxwiki

Session Examples

Example {{=c}}{{c+=1}}

In controller: session_examples.py {{=CODE(""" def counter(): session.counter = (sesstion.counter or 0) + 1 return dict(counter=session.counter) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}and view: session_examples/counter.html {{=CODE(open(os.path.join(request.folder,'views/session_examples/counter.html'),'r').read(),language='html',link=URL('global','vars'),_class='boxCode')}}

Click to count. The session.counter is persistent for this user and application. Every applicaiton within the system has its own separate session management.
Try it here: counter

Template Examples

Example {{=c}}{{c+=1}}

In controller: template_examples.py {{=CODE(""" def variables(): return dict(a=10, b=20) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}and view: template_examples/variables.html {{=CODE(open(os.path.join(request.folder,'views/template_examples/variables.html'),'r').read(),language='html',link=URL('global','vars'),_class='boxCode')}}

A view (also known as template) is just an HTML file with {{...}} tags. You can put ANY python code into the tags, no need to indent but you must use pass to close blocks. The view is transformed into a python code and then executed. {{=a}} prints a.xml() or escape(str(a)).
Try it here: variables

Example {{=c}}{{c+=1}}

In controller: template_examples.py {{=CODE(""" def test_for(): return dict() """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}and view: template_examples/test_for.html {{=CODE(open(os.path.join(request.folder,'views/template_examples/test_for.html'),'r').read(),language='html',link=URL('global','vars'),_class='boxCode')}}

You can do for and while loops.
Try it here: test_for

Example {{=c}}{{c+=1}}

In controller: template_examples.py {{=CODE(""" def test_if(): return dict() """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}and view: template_examples/test_if.html {{=CODE(open(os.path.join(request.folder,'views/template_examples/test_if.html'),'r').read(),language='html',link=URL('global','vars'),_class='boxCode')}}

You can do if, elif, else.
Try it here: test_if

Example {{=c}}{{c+=1}}

In controller: template_examples.py {{=CODE(""" def test_try(): return dict() """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}and view: template_examples/test_try.html {{=CODE(open(os.path.join(request.folder,'views/template_examples/test_try.html'),'r').read(),language='html',link=URL('global','vars'),_class='boxCode')}}

You can do try, except, finally.
Try it here: test_try

Example {{=c}}{{c+=1}}

In controller: template_examples.py {{=CODE(""" def test_def(): return dict() """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}and view: template_examples/test_def.html {{=CODE(open(os.path.join(request.folder,'views/template_examples/test_def.html'),'r').read(),language='html',link=URL('global','vars'),_class='boxCode')}}

You can write functions in HTML too.
Try it here: test_def

Example {{=c}}{{c+=1}}

In controller: template_examples.py {{=CODE(""" def escape(): return dict(message='

text is escaped

') """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}and view: template_examples/escape.html {{=CODE(open(os.path.join(request.folder,'views/template_examples/escape.html'),'r').read(),language='html',link=URL('global','vars'),_class='boxCode')}}

The argument of {{=...}} is always escaped unless it is an object with a .xml() method such as link, A(...), a FORM(...), a XML(...) block, etc.
Try it here: escape

Example {{=c}}{{c+=1}}

In controller: template_examples.py {{=CODE(""" def xml(): return dict(message=XML('

text is not escaped

')) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}and view: template_examples/xml.html {{=CODE(open(os.path.join(request.folder,'views/template_examples/xml.html'),'r').read(),language='html',link=URL('global','vars'),_class='boxCode')}}

If you do not want to escape the argument of {{=...}} mark it as XML.
Try it here: xml

Example {{=c}}{{c+=1}}

In controller: template_examples.py {{=CODE(""" def beautify(): return dict(message=BEAUTIFY(request)) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}and view: template_examples/beautify.html {{=CODE(open(os.path.join(request.folder,'views/template_examples/beautify.html'),'r').read(),language='html',link=URL('global','vars'),_class='boxCode')}}

You can use BEAUTIFY to turn lists and dictionaries into organized HTML.
Try it here: beautify

Layout Examples

Example {{=c}}{{c+=1}}

In controller: layout_examples.py {{=CODE(""" def civilized(): response.menu=[['civilized',True,URL('civilized')], ['slick',False,URL('slick')], ['basic',False,URL('basic')]] response.flash='you clicked on civilized' return dict(message="you clicked on civilized") """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}and view: layout_examples/civilized.html {{=CODE(open(os.path.join(request.folder,'views/layout_examples/civilized.html'),'r').read(),language='html',link=URL('global','vars'),_class='boxCode')}}

You can specify the layout file at the top of your view. civilized Layout file is a view that somewhere in the body contains {{include}}.
Try it here: civilized

Example {{=c}}{{c+=1}}

In controller: layout_examples.py {{=CODE(""" def slick(): response.menu = [['civilized',False,URL('civilized')], ['slick',True,URL('slick')], ['basic',False,URL('basic')]] response.flash = 'you clicked on slick' return dict(message="you clicked on slick") """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}and view: layout_examples/slick.html {{=CODE(open(os.path.join(request.folder,'views/layout_examples/slick.html'),'r').read(),language='html',link=URL('global','vars'),_class='boxCode')}}

Same here, but using a different template.
Try it here: slick

Example {{=c}}{{c+=1}}

In controller: layout_examples.py {{=CODE(""" def basic(): response.menu=[['civilized',False,URL('civilized')], ['slick',False,URL('slick')], ['basic',True,URL('basic')]] response.flash='you clicked on basic' return dict(message="you clicked on basic") """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}and view: layout_examples/basic.html {{=CODE(open(os.path.join(request.folder,'views/layout_examples/basic.html'),'r').read(),language='html',link=URL('global','vars'),_class='boxCode')}}

'layout.html' is the default template, every application has a copy of it.
Try it here: basic

Form Examples

Example {{=c}}{{c+=1}}

In controller: form_examples.py {{=CODE(""" def form(): form=FORM(TABLE(TR("Your name:",INPUT(_type="text",_name="name",requires=IS_NOT_EMPTY())), TR("Your email:",INPUT(_type="text",_name="email",requires=IS_EMAIL())), TR("Admin",INPUT(_type="checkbox",_name="admin")), TR("Sure?",SELECT('yes','no',_name="sure",requires=IS_IN_SET(['yes','no']))), TR("Profile",TEXTAREA(_name="profile",value="write something here")), TR("",INPUT(_type="submit",_value="SUBMIT")))) if form.accepts(request,session): response.flash="form accepted" elif form.errors: response.flash="form is invalid" else: response.flash="please fill the form" return dict(form=form,vars=form.vars) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

You can use HTML helpers like FORM, INPUT, TEXTAREA, OPTION, SELECT to build forms. The "value=" attribute sets the initial value of the field (works for TEXTAREA and OPTION/SELECT too) and the requires attribute sets the validators. FORM.accepts(..) tries to validate the form and, on success, stores vars into form.vars. On failure the error messages are stored into form.errors and shown in the form.
Try it here: form

Database Examples

You can find more examples of the web2py Database Abstraction Layer here

Let's create a simple model with users, products (sold by users) and purchases (the database of an animal store). Each user can sell many products (ONE TO MANY). A user can buy many products and each product can have many buyers (MANY TO MANY).

Example {{=c}}{{c+=1}}

in model: db.py {{=CODE(""" db.define_table( 'person', Field('name'), Field('email'), format = '%(name)s') # ONE (person) TO MANY (products) db.define_table( 'product', Field('seller_id',db.person), Field('name'), Field('description', 'text'), Field('picture', 'upload', default=''), format = '%(name)s') # MANY (persons) TO MANY (purchases) db.define_table( 'purchase', Field('buyer_id', db.person), Field('product_id', db.product), Field('quantity', 'integer'), format = '%(quantity)s %(product_id)s -> %(buyer_id)s') purchased = (db.person.id==db.purchase.buyer_id)&(db.product.id==db.purchase.product_id) db.person.name.requires = IS_NOT_EMPTY() db.person.email.requires = [IS_EMAIL(), IS_NOT_IN_DB(db, 'person.email')] db.product.name.requires = IS_NOT_EMPTY() db.purchase.quantity.requires = IS_INT_IN_RANGE(0, 10) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

Tables are created if they do not exist (try... except). Here "purchased" is an Query object, "db(purchased)" would be a Set objects. A Set object can be selected, updated, deleted. Sets can also be intersected. Allowed field types are string, integer, password, text, blob, upload, date, time, datetime, references(*), and id(*). The id field is there by default and must not be declared. references are for one to many and many to many as in the example above. For strings you should specify a length or you get length=32.

You can use db.tablename.fieldname.requires= to set restrictions on the field values. These restrictions are automatically converted into widgets when generating forms from the table with SQLFORM(db.tablename).

define_tables creates the table and attempts a migration if table has changed or if database name has changed since last time. If you know you already have the table in the database and you do not want to attempt a migration add one last argument to define_table migrate=False.

Example {{=c}}{{c+=1}}

In controller: database_examples.py {{=CODE(""" response.menu = [['Register Person', False, URL('register_person')], ['Register Product', False, URL('register_product')], ['Buy product', False, URL('buy')]] def register_person(): # create an insert form from the table form = SQLFORM(db.person).process() # if form correct perform the insert if form.accepted: response.flash = 'new record inserted' # and get a list of all persons records = SQLTABLE(db().select(db.person.ALL),headers='fieldname:capitalize') return dict(form=form, records=records) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}and view: database_examples/register_person.html {{=CODE(open(os.path.join(request.folder,'views/database_examples/register_person.html'),'r').read(),language='html',link=URL('global','vars'),_class='boxCode')}}

This is a simple user registration form. SQLFORM takes a table and returns the corresponding entry form with validators, etc. SQLFORM.accepts is similar to FORM.accepts but, if form is validated, the corresponding insert is also performed. SQLFORM can also do update and edit if a record is passed as its second argument. SQLTABLE instead turns a set of records (result of a select) into an HTML table with links as specified by its optional parameters. The response.menu on top is just a variable used by the layout to make the navigation menu for all functions in this controller.

Example {{=c}}{{c+=1}}

In controller: database_examples.py {{=CODE(""" def register_product(): form = SQLFORM(db.product).process() if form.accepted: response.flash = 'new record inserted' records = SQLTABLE(db().select(db.product.ALL), upload = URL('download'), # allows pics preview headers='fieldname:capitalize') return dict(form=form, records=records) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}and view: database_examples/register_product.html {{=CODE(open(os.path.join(request.folder,'views/database_examples/register_product.html'),'r').read(),language='html',link=URL('global','vars'),_class='boxCode')}}

Nothing new here.

Example {{=c}}{{c+=1}}

In controller: database_examples.py {{=CODE(""" def buy(): form = SQLFORM.factory( Field('buyer_id',requires=IS_IN_DB(db,db.person.id,'%(name)s')), Field('product_id',requires=IS_IN_DB(db,db.product.id,'%(name)s')), Field('quantity','integer',requires=IS_INT_IN_RANGE(1,100))).process() if form.accepted: # get previous purchese for same product purchase = db((db.purchase.buyer_id == form.vars.buyer_id)& (db.purchase.product_id==form.vars.product_id)).select().first() if purchase: # if list contains a record, update that record purchase.update_record( quantity = purchase.quantity+form.vars.quantity) else: # self insert a new record in table db.purchase.insert(buyer_id=form.vars.buyer_id, product_id=form.vars.product_id, quantity=form.vars.quantity) response.flash = 'product purchased!' elif form.errors: response.flash = 'invalid values in form!' # now get a list of all purchases records = SQLTABLE(db(purchased).select(),headers='fieldname:capitalize') return dict(form=form, records=records) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}and view: database_examples/buy.html {{=CODE(open(os.path.join(request.folder,'views/database_examples/buy.html'),'r').read(),language='html',link=URL('global','vars'),_class='boxCode')}}

Here is a rather sophisticated buy form. It checks that the buyer and the product are in the database and updates the corresponding record or inserts a new purchase. It also does a JOIN to list all purchases.

Example {{=c}}{{c+=1}}

In controller: database_examples.py {{=CODE(""" def download(): return response.download(request,db) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

This controller allows users to download the uploaded pictures of products. Remember the upload=URL('download') statement in the register_product function. Notice that in the URL path /application/controller/function/a/b/etc a, b, etc are passed to the controller as request.args[0], request.args[1], etc. Since the URL is validated request.args[] always contain valid filenames and no '~' or '..' etc. This is useful to allow visitors to link uploaded files.

Example {{=c}}{{c+=1}}

Using a Smartgrid

All of the above database examples can be condensed in one simple command using the SQLFORM.smartgrid:

{{=CODE(""" def manage_transactions(): grid = SQLFORM.smartgrid(db.person,linked_tables=['product','purchase'], user_signature=False) return dict(grid=grid) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}} The SQLFORM.smartgrid allows to create/read/delete persons as well as records in the linked tables (product and purchase). It also allows searching with pagination. It can be highly customized. The user_signature=False disables grid access control features which are beyond this simple example.

Cache Examples

Example {{=c}}{{c+=1}}

In controller: cache_examples.py {{=CODE(""" def cache_in_ram(): import time t=cache.ram('time',lambda:time.ctime(),time_expire=5) return dict(time=t,link=A('click to reload',_href=URL(r=request))) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

The output of lambda:time.ctime() is cached in ram for 5 seconds. The string 'time' is used as cache key.
Try it here: cache_in_ram

Example {{=c}}{{c+=1}}

In controller: cache_examples.py {{=CODE(""" def cache_on_disk(): import time t=cache.disk('time',lambda:time.ctime(),time_expire=5) return dict(time=t,link=A('click to reload',_href=URL(r=request))) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

The output of lambda:time.ctime() is cached on disk (using the shelve module) for 5 seconds.
Try it here: cache_on_disk

Example {{=c}}{{c+=1}}

In controller: cache_examples.py {{=CODE(""" def cache_in_ram_and_disk(): import time t=cache.ram('time',lambda:cache.disk('time', lambda:time.ctime(),time_expire=5),time_expire=5) return dict(time=t,link=A('click to reload',_href=URL(r=request))) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

The output of lambda:time.ctime() is cached on disk (using the shelve module) and then in ram for 5 seconds. web2py looks in ram first and if not there it looks on disk. If it is not on disk it calls the function. This is useful in a multiprocess type of environment. The two times do not have to be the same.
Try it here: cache_in_ram_and_disk

Example {{=c}}{{c+=1}}

In controller: cache_examples.py {{=CODE(""" @cache(request.env.path_info,time_expire=5,cache_model=cache.ram) def cache_controller_in_ram(): import time t=time.ctime() return dict(time=t,link=A('click to reload',_href=URL(r=request)))""".strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

Here the entire controller (dictionary) is cached in ram for 5 seconds. The result of a select cannot be cached unless it is first serialized into a table lambda:SQLTABLE(db().select(db.user.ALL)).xml(). You can read below for an even better way to do it.
Try it here: cache_controller_in_ram

Example {{=c}}{{c+=1}}

In controller: cache_examples.py {{=CODE(""" @cache(request.env.path_info,time_expire=5,cache_model=cache.disk) def cache_controller_on_disk(): import time t=time.ctime() return dict(time=t,link=A('click to reload',_href=URL(r=request))) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

Here the entire controller (dictionary) is cached on disk for 5 seconds. This will not work if the dictionary contains unpickleable objects.
Try it here: cache_controller_on_disk

Example {{=c}}{{c+=1}}

In controller: cache_examples.py {{=CODE(""" @cache(request.env.path_info,time_expire=5,cache_model=cache.ram) def cache_controller_and_view(): import time t=time.ctime() d=dict(time=t,link=A('click to reload',_href=URL(r=request))) return response.render(d) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

response.render(d) renders the dictionary inside the controller, so everything is cached now for 5 seconds. This is best and fastest way of caching!
Try it here: cache_controller_and_view

Example {{=c}}{{c+=1}}

In controller: cache_examples.py {{=CODE(""" def cache_db_select(): import time db.person.insert(name='somebody',email='gluon@mdp.cti.depaul.edu') records = db().select(db.person.ALL,cache=(cache.ram,5)) if len(records)>20: db(db.person.id>0).delete() return dict(records=records) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

The results of a select are complex unpickleable objects that cannot be cached using the previous method, but the select command takes an argument cache=(cache_model,time_expire) and will cache the result of the query accordingly. Notice that the key is not necessary since key is generated based on the database name and the select string.

Ajax Examples

Example {{=c}}{{c+=1}}

In controller: ajax_examples.py {{=CODE(""" def index(): return dict() def data(): if not session.m or len(session.m)==10: session.m=[] if request.vars.q: session.m.append(request.vars.q) session.m.sort() return TABLE(*[TR(v) for v in session.m]).xml() """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}} In view: ajax_examples/index.html {{=CODE(open(os.path.join(request.folder,'views/ajax_examples/index.html'),'r').read(),language='html',link=URL('global','vars'),_class='boxCode')}}

The javascript function "ajax" is provided in "web2py_ajax.html" and included by "layout.html". It takes three arguments, a url, a list of ids and a target id. When called, it sends to the url (via a get) the values of the ids and display the response in the value (of innerHTML) of the target id.
Try it here: index

Example {{=c}}{{c+=1}}

In controller: ajax_examples.py {{=CODE(""" def flash(): response.flash='this text should appear!' return dict() """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

Try it here: flash

Example {{=c}}{{c+=1}}

In controller: ajax_examples.py {{=CODE(""" def fade(): return dict() """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}} In view: ajax_examples/fade.html
{{=CODE(open(os.path.join(request.folder,'views/ajax_examples/fade.html'),'r').read(),language='html',link=URL('global','vars'),_class='boxCode')}}

Try it here: fade

Excel-like spreadsheet via Ajax

Web2py includes a widget that acts like an Excel-like spreadsheet and can be used to build forms read more.

Testing Examples

Example {{=c}}{{c+=1}}

Using the Python doctest notation it is possible to write tests for all controller functions. Tests are then run via the administrative interface which generates a report. Here is an example of a test in the code: {{=CODE(""" def index(): ''' This is a docstring. The following 3 lines are a doctest: >>> request.vars.name='Max' >>> index() {'name': 'Max'} ''' return dict(name=request.vars.name) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

Streaming Examples

Example {{=c}}{{c+=1}}

It is very easy in web2py to stream large files. Here is an example of a controller that does so:

{{=CODE(""" def streamer(): import os path=os.path.join(request.folder,'private','largefile.mpeg4') return response.stream(open(path,'rb'),chunk_size=4096) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}

By default all static files and files stored in 'upload' fields in the database are streamed when larger than 1MByte.

web2py automatically and transparently handles PARTIAL_CONTENT and RANGE requests.

XML-RPC Examples

Example {{=c}}{{c+=1}}

Web2py has native support for the XMLRPC protocol. Below is a controller function "handler" that exposes two functions, "add" and "sub" via XMLRPC. The controller "tester" executes the two function remotely via xmlrpc.

{{=CODE(""" from gluon.tools import Service service = Service(globals()) @service.xmlrpc def add(a,b): return a+b @service.xmlrpc def sub(a,b): return a-b def call(): return service() def tester(): import xmlrpclib server=xmlrpclib.ServerProxy('http://hostname:port/app/controller/call/xmlrpc') return str(server.add(3,4)+server.sub(3,4)) """.strip(),language='web2py',link=URL('global','vars'),_class='boxCode')}}
{{block sidebar}}{{end}} web2py-2.12.3.orig/applications/examples/views/default/documentation.html0000664000000000000000000000073712564727260025314 0ustar rootroot{{extend 'layout.html'}}
{{=get_content('main')}}
{{=get_content('official')}} {{=get_content('community')}} {{=get_content('more')}}
web2py-2.12.3.orig/applications/examples/views/default/license.html0000664000000000000000000000016212564727260024055 0ustar rootroot{{extend 'layout.html'}}

web2py License Agreement

{{=license}}
web2py-2.12.3.orig/applications/examples/views/default/index.html0000664000000000000000000001211312564727260023541 0ustar rootroot{{extend 'layout.html'}} {{ import random quotes = [ ("web2py was the life saver today for me, my blog post: Standalone Usage of web2py's", "caglartoklu", "http://twitter.com/#!/caglartoklu/status/84292131707031553"), ("Get Things Done - Faster, Better and More Easily with web2py", "Bruno Rocha", "http://twitter.com/#!/rochacbruno/status/73583156044890112"), ("Please use www.web2py.com when using MVC , no PHP/SQL stuff please...its 2011 not 1999", "rabblesoft", "http://twitter.com/#!/rabblesoft/status/79189028431343616"), ('web2py rules! as a sysadmin I like the no installation and no configuration approach a lot)', "kjogut", "http://twitter.com/#!/jkogut/status/61414554273447936"), ("web2py it is. Compatible with everything under the sun and great interfaces to googleappengine", "comamitc","http://twitter.com/#!/comamitc/status/51744719071477760"), ("If you are still learning python, web2py is best tool by far", "pbreit", "http://twitter.com/#!/pbreit/status/48260905775017984") ] random.shuffle(quotes) }}

web2pyTM Web Framework

Free open source full-stack framework for rapid development of fast, scalable, secure and portable database-driven web-based applications. Written and programmable in Python.

Current version: {{=request.env.web2py_version}} (LGPLv3 License)

Batteries Included

Everything you need in one package including fast multi-threaded web server, SQL database and web-based interface. No third party dependencies but works with third party tools.

Web-Based IDE

Create, modify, deploy and manage application from anywhere using your browser. One web2py instance can run multiple web sites using different databases. Try the interactive demo.

Extensive Docs

Start with some quick examples, then read the manual and the Sphinx docs, watch videos, and join a user group for discussion. Take advantage of the layouts, plugins, appliances, and recipes.

{{for k,quote in enumerate(quotes[:3]):}}

{{=quote[0]}}

{{=quote[1]}}
{{pass}}
web2py-2.12.3.orig/applications/examples/views/default/usergroups.html0000664000000000000000000000016112564727260024650 0ustar rootroot{{extend 'layout.html'}}
{{=get_content('grouplist')}}
web2py-2.12.3.orig/applications/examples/views/default/videos.html0000664000000000000000000000154112564727260023726 0ustar rootroot{{extend 'layout.html'}}

{{=T('web2py videos')}}

web2py-2.12.3.orig/applications/examples/views/default/who.html0000664000000000000000000001731612564727260023241 0ustar rootroot{{extend 'layout.html'}}

The web2py™ Team

Lead Developer

Contributor Agreement

By contributing to web2py you implicitly agree to the web2py contributor agreement. Please also send us a signed copy by fax or, scanned, by email.

Main Contributors/Developers

  • Alexey Nezhdanov (GAE and database performance)
  • Alan Etkin (DAL IMAP adapter)
  • Alvaro Justen (dynamical translations)
  • Anders Roos (file locking)
  • Andrew Willimott (documentation, TeraData support)
  • Andriy Kornatskyy (benchmarks and profiling)
  • Angelo Compagnucci (mobile devices)
  • Anthony Bastardi (book, poweredby site, multiple contributions)
  • Arun K. Rajeevan (plugin_wiki)
  • Attila Csipa (cron job)
  • Ben Goosman (keyed table and Oracle adapter)
  • Bill Ferrett (modular DAL design)
  • Boris Manojlovic (ajax edit)
  • Branko Vukelic (new admin app)
  • Brian Meredyk (SQLite, executesql and scheduler)
  • Bruno Rocha (book, new website, better forms, grid layout)
  • Carlos Galindo
  • Carsten Haese (Informix)
  • Chris Clark (Ingres, Jython support)
  • Chris May (new website)
  • Chris Steel
  • Christian Foster Howes (GAE support)
  • Christopher Smiga (Informix)
  • CJ Lazell (tester)
  • Corne Dickens (import mechanism)
  • Craig Younkins (Security)
  • Daniel Lin (Taiwanese internationalization)
  • Dave Stoll (DowCommerce payment API, security)
  • David Wagner (security and cryptography expert)
  • Denes Lengyel (validators, DB2 support, DAL, custom forms, legacy table support)
  • Douglas Soares de Andrade (2.4 and 2.6 compliance, docstrings)
  • Eric Vicenti (email with ssl)
  • Falko Krause (mysql support)
  • Farsheed Ashouri
  • Fran Boon (authorization and authentication)
  • Francisco Gama (bug fixing)
  • Fred Yanowski (XHTML compliance)
  • Gilson Filho
  • Graham Dumpleton (WSGI)
  • Gyuris Szabolcs (PGP Mail)
  • Hamdy Abdel-Badeea (crud)
  • Hans Donner (GAE support, Google login, widgets, Sphinx documentation)
  • Hans Murx (Database support)
  • Hans C. v. Stockhausen (OpenID, Google Wave)
  • Ian Reinhart Geiser (html helpers)
  • Ionel Anton (Romanian translation)
  • Jan Beilicke (markmin)
  • Jeremy Dillworth
  • Jonathan Benn (is_url validator and tests)
  • Jonathan Lundell (multiple contributions)
  • Josh Goldfoot (xaml/html sanitizer)
  • Jose Jachuf (Firebird support)
  • José L. Redrejo Rodríguez (Debian Package, pyfpdf)
  • Josh Jaques (web2py_ajax)
  • José Vicente de Sousa (Layout for new website)
  • Keith Yang (openid)
  • Kenji Hosoda (plugins)
  • Kyle Smith (javascript)
  • Limodou (winservice)
  • Lucas D'Ávila
  • Marc Abramowitz (tests and travis continuous integration)
  • Marcel Leuthi (Oracle support)
  • Marcel Hellkamp (Bottle developer, multiple web server support)
  • Marcello Della Longa (italian translation)
  • Mariano Reingart (pysoaplib, debugger, pyfpdf)
  • Marin Pranjić (dal)
  • Mark Larsen (taskbar widget)
  • Mark Moore (databases and daemon scripts)
  • Markus Gritsch (bug fixing)
  • Martin Hufsky (expressions in DAL)
  • Martin Mulone (new welcome app, grid)
  • Mateusz Banach (stickers, IS_EMAIL, IS_IMAGE, contenttype)
  • Michael Willis (shell)
  • Michele Comitini (facebook)
  • Michael Toomim (scheduler)
  • Nathan Freeze (admin design, IS_STRONG, DAL features, web2pyslices.com)
  • Niall Sweeny (MSSQL support)
  • Niccolo Polo (epydoc)
  • Nicolas Bruxer (memcache support)
  • Olaf Ferger (Informix support)
  • Omi Chiba (DB2, MSSQL support and Japanese translation)
  • Ondrej Such (MSSQL support)
  • Ovidio Marinho Falcao Neto (tests and plugin developer)
  • Pai (internationalization)
  • Paolo Caruccio (SQLFORM.grid query)
  • Patrick Breitenbach
  • Phyo Arkar Lwin (web hosting and Jython tester)
  • Pierre Thibault (Eclipse integration and custom import)
  • Robert Valentak (Slovenian translation)
  • Robin Bhattacharyya (Google App Engine support)
  • Ross Peoples (MSSQL, multiple contributions)
  • Ruijun Luo (a.k.a. Iceberg) (setup_exe.py)
  • Ryan Seto (template.py)
  • Scott Roberts (testing, book)
  • Sergey Podlesnyi (Oracle and migrations tester)
  • Sharriff Aina (tester and PyAMF integration)
  • Simone Bizzotto (scheduler, dal, redis, tests, sphinx)
  • Sriram Durbha (book)
  • Sterling Hankins (tester, book)
  • Stuart Rackham (MSSQL support)
  • Telman Yusupov (Oracle support)
  • Thadeus Burgess (validators)
  • Tim Michelsen (Sphinx documentation)
  • Timothy Farrell (python 2.6 compliance, windows support)
  • Yair Eshel (internationalizaiton, DAL improvement)
  • Yannis Aribaud (CAS compliance)
  • Yarko Tymciurak (design)
  • Younghyun Jo (internationalization)
  • Vladyslav Kozlovskyy (internationalization, markmin, admin, and mercurial support)
  • Vidul Nikolaev Petrov (captcha)
  • Vinicius Assef
  • Zahariash (memory management)

Third party software included in web2py

(... and other third party modules in the contrib folder).
web2py-2.12.3.orig/applications/examples/views/default/download.html0000664000000000000000000001436212564727260024251 0ustar rootroot{{response.files.append(URL('static','css/artwork.css'))}} {{extend 'layout.html'}} {{import os}} {{version = request.env.web2py_version}}

web2pyTM Download

For Normal Users For Testers For Developers
For Windows For Windows Git Repository
For Mac For Mac
Source Code Source Code Source code docs
Manual Change Log Report a Bug

The source code version works on all supported platforms, including Linux, but it requires Python 2.6, or 2.7 (recommended). It runs on Windows and most Unix systems, including Linux and BSD.

Instructions

After download, unzip it and click on web2py.exe (windows) or web2py.app (osx). To run from source, type:

{{=CODE("python2.7 web2py.py",language=None,counter='>',_class='boxCode')}}

or for more info type:

{{=CODE("python2.7 web2py.py -h",language=None,counter='>',_class='boxCode')}}

Caveats

After installation, every time you run it, web2py asks you to choose a password. This password is your administrative password. If the password is left blank, the administrative interface is disabled. The administrative interface /admin/default/index is only accessible via localhost and always requires a password.

Any url /a/b/c maps into a call to application a, controller b.py and function c in that controller.

You are strongly advised to also use Apache with mod_proxy or mod_wsgi to access applications in the framework. This allows better security and concurrency.

License

Web2py code is released under LGPLv3 License. This license does not extend to third party libraries distributed with web2py (which can be MIT, BSD or Apache type licenses) nor does it extend to applications built with web2py (under the terms of the LGPL.

Applications built with web2py can be released under any license the author wishes as long they do not contain web2py code. They can link unmodified web2py libraries and they can be distributed with official web2py binaries. In particular web2py applications can be distributed in closed source. The admin interface provides a button to byte-code compile.

It is fine to distribute web2py (source or compiled) with your applications as long as you make it clear in the license where your application ends and web2py starts.

web2py is copyrighted by Massimo Di Pierro. The web2py trademark is owned by Massimo Di Pierro.

read more

Artwork

Stickers

Download WEB2PY artwork pack in editable .png format

Logo, Stickers and Layout developed by José V. Sousa and Bruno Rocha (at Blouweb) All rights reserved by Massimo Di Pierro © {{=request.now.year}}

Favicon and HTML5 compatibility by Martin Mulone

Icon set made by Christian Burprich licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 License

web2py-2.12.3.orig/applications/examples/views/appadmin.html0000664000000000000000000002632712564727436022620 0ustar rootroot{{extend 'layout.html'}} {{if request.function=='index':}}

{{=T("Available Databases and Tables")}}

{{if not databases:}}{{=T("No databases in this application")}}{{pass}}
{{for db in sorted(databases):}} {{for table in databases[db].tables:}} {{qry='%s.%s.id>0'%(db,table)}} {{tbl=databases[db][table]}} {{if hasattr(tbl,'_primarykey'):}} {{if tbl._primarykey:}} {{firstkey=tbl[tbl._primarykey[0]]}} {{if firstkey.type in ['string','text']:}} {{qry='%s.%s.%s!=""'%(db,table,firstkey.name)}} {{else:}} {{qry='%s.%s.%s>0'%(db,table,firstkey.name)}} {{pass}} {{else:}} {{qry=''}} {{pass}} {{pass}} {{pass}} {{pass}}
{{=A("%s.%s" % (db,table),_href=URL('select',args=[db],vars=dict(query=qry)))}} {{=A(str(T('New Record')),_href=URL('insert',args=[db,table]),_class="btn btn-default")}}
{{=LOAD('appadmin', 'hooks', ajax=True)}}
{{elif request.function=='select':}}

{{=XML(str(T("Database %s select"))%A(request.args[0],_href=URL('index'))) }}

{{if tb:}}

{{=T('Traceback')}}

    {{=tb}}
  
{{pass}} {{if table:}} {{=A(str(T('New Record')),_href=URL('insert',args=[request.args[0],table]),_class="btn btn-default")}}

{{=T("Rows in Table")}}


{{else:}}

{{=T("Rows selected")}}


{{pass}} {{=form}}

{{=T('The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.')}}
{{=T('Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.')}}
{{=T('"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN')}}



{{=T("%s selected", nrows)}}

{{if start>0:}}{{=A(T('previous %s rows') % step,_href=URL('select',args=request.args[0],vars=dict(start=start-step)),_class="btn btn-default")}}{{pass}} {{if stop {{linkto = lambda f, t, r: URL('update', args=[request.args[0], r, f]) if f else "#"}} {{upload=URL('download',args=request.args[0])}} {{=SQLTABLE(rows,linkto,upload,orderby=True,_class='sortable')}}
{{pass}}

{{=T("Import/Export")}}


{{=T("export as csv file")}} {{=formcsv or ''}} {{elif request.function=='insert':}}

{{=T("Database")}} {{=A(request.args[0],_href=URL('index'))}} {{if hasattr(table,'_primarykey'):}} {{fieldname=table._primarykey[0]}} {{dbname=request.args[0]}} {{tablename=request.args[1]}} {{cond = table[fieldname].type in ['string','text'] and '!=""' or '>0'}} {{=T("Table")}} {{=A(tablename,_href=URL('select',args=dbname,vars=dict(query='%s.%s.%s%s'%(dbname,tablename,fieldname,cond))))}} {{else:}} {{=T("Table")}} {{=A(request.args[1],_href=URL('select',args=request.args[0],vars=dict(query='%s.%s.id>0'%tuple(request.args[:2]))))}} {{pass}}

{{=T("New Record")}}


{{=form}} {{elif request.function=='update':}}

{{=T("Database")}} {{=A(request.args[0],_href=URL('index'))}} {{if hasattr(table,'_primarykey'):}} {{fieldname=request.vars.keys()[0]}} {{dbname=request.args[0]}} {{tablename=request.args[1]}} {{cond = table[fieldname].type in ['string','text'] and '!=""' or '>0'}} {{=T("Table")}} {{=A(tablename,_href=URL('select',args=dbname,vars=dict(query='%s.%s.%s%s'%(dbname,tablename,fieldname,cond))))}} {{=T("Record")}} {{=A('%s=%s'%request.vars.items()[0],_href=URL('update',args=request.args[:2],vars=request.vars))}} {{else:}} {{=T("Table")}} {{=A(request.args[1],_href=URL('select',args=request.args[0],vars=dict(query='%s.%s.id>0'%tuple(request.args[:2]))))}} {{=T("Record id")}} {{=A(request.args[2],_href=URL('update',args=request.args[:3]))}} {{pass}}

{{=T("Edit current record")}}



{{=form}} {{elif request.function=='state':}}

{{=T("Internal State")}}

{{=T("Current request")}}

{{=BEAUTIFY(request)}}

{{=T("Current response")}}

{{=BEAUTIFY(response)}}

{{=T("Current session")}}

{{=BEAUTIFY(session)}} {{elif request.function == 'ccache':}}

{{T("Cache")}}

{{T("Statistics")}}

{{=T("Overview")}}

{{=T.M("Number of entries: **%s**", total['entries'])}}

{{if total['entries'] > 0:}}

{{=T.M("Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})", dict( ratio=total['ratio'], hits=total['hits'], misses=total['misses']))}}

{{=T("Size of cache:")}} {{if object_stats:}} {{=T.M("**%(items)s** %%{item(items)}, **%(bytes)s** %%{byte(bytes)}", dict(items=total['objects'], bytes=total['bytes']))}} {{if total['bytes'] > 524287:}} {{=T.M("(**%.0d MB**)", total['bytes'] / 1048576)}} {{pass}} {{else:}} {{=T.M("**not available** (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)")}} {{pass}}

{{=T.M("Cache contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.", dict(hours=total['oldest'][0], min=total['oldest'][1], sec=total['oldest'][2]))}}

{{=BUTTON(T('Cache Keys'), _onclick='jQuery("#all_keys").toggle().toggleClass( "hidden" );')}}
{{pass}}

{{=T("RAM")}}

{{=T.M("Number of entries: **%s**", ram['entries'])}}

{{if ram['entries'] > 0:}}

{{=T.M("Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})", dict( ratio=ram['ratio'], hits=ram['hits'], misses=ram['misses']))}}

{{=T("Size of cache:")}} {{if object_stats:}} {{=T.M("**%(items)s** items, **%(bytes)s** %%{byte(bytes)}", dict(items=ram['objects'], bytes=ram['bytes']))}} {{if ram['bytes'] > 524287:}} {{=T.M("(**%.0d MB**)", ram['bytes'] / 10485576)}} {{pass}} {{else:}} {{=T.M("``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)")}} {{pass}}

{{=T.M("RAM contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.", dict(hours=ram['oldest'][0], min=ram['oldest'][1], sec=ram['oldest'][2]))}}

{{=BUTTON(T('RAM Cache Keys'), _onclick='jQuery("#ram_keys").toggle().toggleClass( "hidden" );')}}
{{pass}}

{{=T("DISK")}}

{{=T.M("Number of entries: **%s**", disk['entries'])}}

{{if disk['entries'] > 0:}}

{{=T.M("Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})", dict(ratio=disk['ratio'], hits=disk['hits'], misses=disk['misses']))}}

{{=T("Size of cache:")}} {{if object_stats:}} {{=T.M("**%(items)s** %%{item(items)}, **%(bytes)s** %%{byte(bytes)}", dict( items=disk['objects'], bytes=disk['bytes']))}} {{if disk['bytes'] > 524287:}} {{=T.M("(**%.0d MB**)", disk['bytes'] / 1048576)}} {{pass}} {{else:}} {{=T.M("``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)")}} {{pass}}

{{=T.M("DISK contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.", dict(hours=disk['oldest'][0], min=disk['oldest'][1], sec=disk['oldest'][2]))}}

{{=BUTTON(T('Disk Cache Keys'), _onclick='jQuery("#disk_keys").toggle().toggleClass( "hidden" );')}}
{{pass}}

{{=T("Manage Cache")}}

{{=form}}

{{pass}} {{if request.function=='graph_model':}}

{{=T("Graph Model")}}

{{if not pgv:}} {{=T('pygraphviz library not found')}} {{elif not databases:}} {{=T("No databases in this application")}} {{else:}}
{{=IMG(_src=URL('appadmin', 'bg_graph_model'))}} {{pass}} {{pass}} {{if request.function == 'manage':}}

{{=heading}}

{{for k, tablename in enumerate(tablenames):}}
{{=LOAD(f='manage.load', args=[request.args(0), k], ajax=True)}}
{{pass}}
{{pass}} web2py-2.12.3.orig/applications/examples/views/database_examples/0000775000000000000000000000000012564727260023564 5ustar rootrootweb2py-2.12.3.orig/applications/examples/views/database_examples/register_person.html0000664000000000000000000000015112564727260027661 0ustar rootroot{{extend 'layout.html'}}

User registration form

{{=form}}

Current users

{{=records}} web2py-2.12.3.orig/applications/examples/views/database_examples/register_dog.html0000664000000000000000000000014712564727260027131 0ustar rootroot{{extend 'layout.html'}}

Dog registration form

{{=form}}

Current dogs

{{=records}} web2py-2.12.3.orig/applications/examples/views/database_examples/register_product.html0000664000000000000000000000015712564727260030041 0ustar rootroot{{extend 'layout.html'}}

Product registration form

{{=form}}

Current products

{{=records}} web2py-2.12.3.orig/applications/examples/views/database_examples/buy.html0000664000000000000000000000027112564727260025251 0ustar rootroot{{extend 'layout.html'}}

Purchase form

{{=form}} [ {{=A('delete purchases',_href=URL('delete_purchased'))}} ]

Current purchases (SQL JOIN!)

{{=records}}

web2py-2.12.3.orig/applications/examples/views/generic.html0000664000000000000000000000064612564727260022432 0ustar rootroot{{extend 'layout.html'}} {{""" You should not modify this file. It is used as default when a view is not provided for your controllers """}}

{{=' '.join(x.capitalize() for x in request.function.split('_'))}}

{{if len(response._vars)==1:}} {{=BEAUTIFY(response._vars.values()[0])}} {{elif len(response._vars)>1:}} {{=BEAUTIFY(response._vars)}} {{pass}} {{if request.is_local:}} {{=response.toolbar()}} {{pass}} web2py-2.12.3.orig/applications/examples/views/cache_examples/0000775000000000000000000000000012564727260023063 5ustar rootrootweb2py-2.12.3.orig/applications/examples/views/cache_examples/generic.html0000664000000000000000000000011712564727260025364 0ustar rootroot{{extend 'layout.html'}}

Cache Examples

{{=BEAUTIFY(response._vars)}} web2py-2.12.3.orig/applications/examples/views/simple_examples/0000775000000000000000000000000012564727260023311 5ustar rootrootweb2py-2.12.3.orig/applications/examples/views/simple_examples/status.html0000664000000000000000000000004712564727260025523 0ustar rootroot{{extend 'layout.html'}} {{=toolbar}} web2py-2.12.3.orig/applications/examples/views/simple_examples/ajaxwiki.html0000664000000000000000000000010012564727260025775 0ustar rootroot{{extend 'layout.html'}}

Ajax Wiki

{{=form}} {{=html}} web2py-2.12.3.orig/applications/examples/views/simple_examples/hello3.html0000664000000000000000000000006012564727260025361 0ustar rootroot{{extend 'layout.html'}}

{{=message}}

web2py-2.12.3.orig/applications/examples/views/global/0000775000000000000000000000000012564727260021362 5ustar rootrootweb2py-2.12.3.orig/applications/examples/views/global/vars.html0000664000000000000000000000232512564727260023225 0ustar rootroot{{extend 'layout.html'}} {{import cgi}}

{{=T('Docs for')}} {{=title}}

{{=T('Description')}}


{{if t:}} {{=t}}{{if d:}} extends {{=d}}{{pass}} {{pass}}
{{pass}} {{if doc:}}

{{=MARKMIN(doc)}}{{pass}}

{{if attributes:}}

{{=T('Attributes')}}

{{for key in sorted(attributes):}} {{doc1,t1,c1,d1=attributes[key]}} {{pass}}

{{if key.count('.')<2:}} {{=A(key,_rel="nofollow",_href=URL(args=key.split('.')))}} {{else:}} {{=key}} {{pass}} {{if t1:}} {{=t1}}{{if d1:}} extends {{=d1}}{{pass}} {{if c1:}} belongs to class {{=c1}}{{pass}}
{{pass}} {{if doc1:}}{{=MARKMIN(doc1)}}{{pass}}

{{pass}}
web2py-2.12.3.orig/applications/examples/views/soap_examples/0000775000000000000000000000000012564727260022762 5ustar rootrootweb2py-2.12.3.orig/applications/examples/views/soap_examples/generic.html0000664000000000000000000000027012564727260025263 0ustar rootroot{{extend 'layout.html'}}

SOAP Examples

Result

{{=BEAUTIFY(result)}}

XML Request

{{=BEAUTIFY(xml_request)}}

XML Response

{{=BEAUTIFY(xml_response)}} web2py-2.12.3.orig/applications/examples/views/generic.load0000664000000000000000000000024712564727260022402 0ustar rootroot{{response.headers['web2py-response-flash']=response.flash}}{{if len(response._vars)==1:}}{{=response._vars.values()[0]}}{{else:}}{{=BEAUTIFY(response._vars)}}{{pass}}web2py-2.12.3.orig/applications/examples/views/template_examples/0000775000000000000000000000000012564727260023633 5ustar rootrootweb2py-2.12.3.orig/applications/examples/views/template_examples/beautify.html0000664000000000000000000000011512564727260026326 0ustar rootroot{{extend 'layout.html'}}

BEAUTIFY

Message is

{{=message}} web2py-2.12.3.orig/applications/examples/views/template_examples/escape.html0000664000000000000000000000014612564727260025762 0ustar rootroot{{extend 'layout.html'}}

Strings are automatically escaped

Message is

{{=message}} web2py-2.12.3.orig/applications/examples/views/template_examples/test_def.html0000664000000000000000000000032412564727260026315 0ustar rootroot{{extend 'layout.html'}} {{def itemlink(name):}}
  • {{=A(name,_href=name)}}
  • {{return}}
      {{itemlink('http://www.google.com')}} {{itemlink('http://www.yahoo.com')}} {{itemlink('http://www.nyt.com')}}
    web2py-2.12.3.orig/applications/examples/views/template_examples/test_try.html0000664000000000000000000000016712564727260026402 0ustar rootroot{{extend 'layout.html'}}

    Try... except

    {{try:}}

    a={{=1/0}}

    {{except:}} infinity {{pass}} web2py-2.12.3.orig/applications/examples/views/template_examples/variables.html0000664000000000000000000000012512564727260026467 0ustar rootroot{{extend 'layout.html'}}

    Your variables

    a={{=a}}

    a={{=b}}

    web2py-2.12.3.orig/applications/examples/views/template_examples/test_if.html0000664000000000000000000000021412564727260026153 0ustar rootroot{{extend 'layout.html'}}

    If statement

    {{a=10}} {{if a%2==0:}}

    {{=a}} is even

    {{else:}}

    {{=a}} is odd

    {{pass}} web2py-2.12.3.orig/applications/examples/views/template_examples/test_for.html0000664000000000000000000000020312564727260026341 0ustar rootroot{{extend 'layout.html'}}

    For loop

    {{for number in ['one','two','three']:}}

    {{=number.capitalize()}}

    {{pass}} web2py-2.12.3.orig/applications/examples/views/template_examples/xml.html0000664000000000000000000000011012564727260025311 0ustar rootroot{{extend 'layout.html'}}

    XML

    Message is

    {{=message}} web2py-2.12.3.orig/applications/examples/views/spreadsheet/0000775000000000000000000000000012564727260022431 5ustar rootrootweb2py-2.12.3.orig/applications/examples/views/spreadsheet/index.html0000664000000000000000000000150212564727260024424 0ustar rootroot{{extend 'layout.html'}}

    Excel-like spreadsheet widget

    Try insert "=r0c1+1" in cell r0c0 and "2" in r0c1. Formulas start with "=" as in Excel. You can use a subset of python commands and math function, and reference cells by r[row]c[col]. All computations are performed serverside via Ajax (input is validated for security). Cell values and formulas can be set and locked serverside. The shape of the spreadsheet can be modifed serverside and does not need to be tabular (think of it as a graph of css-friendly widgets you can place where you want). Cells can be given arbistrary names. This example is distributed with web2py so look at the source code of the example to learn more. {{=sheet}} web2py-2.12.3.orig/applications/examples/views/web2py_ajax.html0000664000000000000000000000142412564727260023224 0ustar rootroot {{ response.files.insert(0,URL('static','js/jquery.js')) response.files.insert(1,URL('static','css/calendar.css')) response.files.insert(2,URL('static','js/calendar.js')) response.files.insert(3,URL('static','js/web2py.js')) response.include_meta() response.include_files() }} web2py-2.12.3.orig/applications/examples/views/ajax_examples/0000775000000000000000000000000012564727260022743 5ustar rootrootweb2py-2.12.3.orig/applications/examples/views/ajax_examples/index.html0000664000000000000000000000050712564727260024742 0ustar rootroot{{extend 'layout.html'}}

    Type something and press the button. The last 10 entries will appear sorted in a table below.


    web2py-2.12.3.orig/applications/examples/views/ajax_examples/fade.html0000664000000000000000000000034112564727260024526 0ustar rootroot{{extend 'layout.html'}}
    {{='Hello World '*100}}
    web2py-2.12.3.orig/applications/examples/views/form_examples/0000775000000000000000000000000012564727260022763 5ustar rootrootweb2py-2.12.3.orig/applications/examples/views/form_examples/form.html0000664000000000000000000000013512564727260024613 0ustar rootroot{{extend 'layout.html'}}

    form.vars

    {{=vars}}

    form

    {{=form}} web2py-2.12.3.orig/applications/examples/views/session_examples/0000775000000000000000000000000012564727260023503 5ustar rootrootweb2py-2.12.3.orig/applications/examples/views/session_examples/counter.html0000664000000000000000000000030512564727260026046 0ustar rootroot{{extend 'layout.html'}}

    session counter

    {{for i in range(counter):}}{{=i}}... {{pass}}

    {{=T('click me to count')}} {{block sidebar}} {{end}} web2py-2.12.3.orig/applications/examples/views/generic.xml0000664000000000000000000000011712564727260022257 0ustar rootroot{{from gluon.serializers import xml}}{{=XML(xml(response._vars,quote=False))}} web2py-2.12.3.orig/applications/examples/views/images_examples/0000775000000000000000000000000012564727260023265 5ustar rootrootweb2py-2.12.3.orig/applications/examples/views/images_examples/index.html0000664000000000000000000000011712564727260025261 0ustar rootroot{{extend 'layout.html'}}

    Upload page

    {{=form}} {{block sidebar end}} web2py-2.12.3.orig/applications/examples/LICENSE0000664000000000000000000001525212564727256020004 0ustar rootroot## Web2py License Web2py is Licensed under the LGPL license version 3 (http://www.gnu.org/licenses/lgpl.html) Copyrighted (c) by Massimo Di Pierro (2007-2011) ### On Commercial Redistribution In accordance with LGPL you may: - redistribute web2py with your apps (including official web2py binary versions) - release your applications which use official web2py libraries under any license you wish But you must: - make clear in the documentation that your application uses web2py - release any modification of the web2py libraries under the LGPLv3 license THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. (Earlier versions of web2py, 1.0.*-1.90.*, were released under the GPL2 license plus a commercial exception which, for practical purposes, was very similar to the current LPGLv3) ### Licenses for third party contributed software web2py contains third party software under the gluon/contrib/ folder. Each file/module in contrib is distributed with web2py under its original license. Here we list some of them. #### gluon.contrib.simplejson LICENSE Copyright (c) 2006 Bob Ippolito - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #### gluon.contrib.rss2.py (originally PyRSS2Gen) LICENSE This is copyright (c) by Dalke Scientific Software, LLC and released under the BSD license. See the file LICENSE in the distribution or for details. #### gluon.contrib.markdown (markdown2) LICENSE MIT License from from #### gluon.contrib.feedparser LICENSE Copyright (c) 2002-2005, Mark Pilgrim All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #### gluon.wsgiserver.py LICENSE (borrowed from cherrypy) Copyright (c) 2004, CherryPy Team (team@cherrypy.org) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the CherryPy Team nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #### gluon.contrib.pam LICENSE Copyright (C) 2007-2009 Chris AtLee Licensed under the MIT license #### gluon.contrib.shell LICENSE Copyright (C) by Google inc. Apache 2.0 Lincense #### The javascript licenses are in the code itself web2py-2.12.3.orig/applications/examples/cron/0000775000000000000000000000000012564727256017733 5ustar rootrootweb2py-2.12.3.orig/applications/examples/cron/crontab0000664000000000000000000000001012564727256021275 0ustar rootroot#crontabweb2py-2.12.3.orig/applications/examples/__init__.py0000664000000000000000000000000112564727256021072 0ustar rootroot web2py-2.12.3.orig/applications/examples/static/0000775000000000000000000000000012564727260020254 5ustar rootrootweb2py-2.12.3.orig/applications/examples/static/403.html0000664000000000000000000000000412564727256021447 0ustar rootroot403 web2py-2.12.3.orig/applications/examples/static/500.html0000664000000000000000000000000412564727256021445 0ustar rootroot500 web2py-2.12.3.orig/applications/examples/static/title.png0000664000000000000000000002527112564727260022112 0ustar rootrootPNG  IHDR$PkJiCCPICC ProfilexWgP۲o"9$IA2s*i 3ΐEEIADTT(ADDQ% 眪}^Zk^w ((Y||QB43k ykp}|Ħ =@ >@Hx IR \a73 @p|ѤhΘDfp: RxbT}|-'hu1,)On @p`yy|.FVdnTQBbq A:yοh1%v=V+W8<+| ˉ\o!Jn{*oТ\zVVn^ULLYXencadw#sKCOD/wX߻~y>rK ÆKEu$Srh/ ѧX8xIv\SSrL>lzDj:!'p*#+:nXzP3 | x;Ζ$S>:­G*PW/9]&\nrj57nRoհ ^ͨ3qg.{\SXF9Zd[?8u+wۧ;?K{n_)J7GgU}ok׫}owo??u>b k ώԎq~~<j/&&}+|!cyad.m>r{qOU5:mZe2<`cfiǘ_Up(X$Y V^VN.{Bbm*jVVZc:j1z ;(FeƯM1fDs?TˊmVcL[1; {kGSIbKn<=zL[_ݍpKȐ*a:&{-"(QNTg>3)!&2$ADŤ-X|O:uAڵÅGJ09&\M'ϟ:m~Z:rrw-P)+=ļTt\smˤʟWWY_4sJUkB׾]t[F5|5ͷOבp1QG PZliYy֠FmmK}>BѮ=R{#^{Qxvm`?> ].xh,a)tbg/V_UIMqMwi9Ҽ–Kq+V?~^Yol>W0:w PX|t<=D*+.9-)L,sC{#%"Rң=2YZ˾,?C3mN$GSSS?<7xHQtlzGF1ǻ2O8>u*+)3\yg_,t,*);U"Z\y /.s(*^Х ՙW\պ~mzˍқɷj,j֭ܙvwa$L ONNw=|>X~r=V;וI3 ˽IL&4xPpLR ` ID F*DY J:GZNGף1BL2+`_Xq6 3<;?"BeifeeaºV͎7pqq4vn+['ėǟ' $P"(#xMH[艰C/Z*%).B2@8$*^&SPvZjnya>@Pi 4,߼΢rŊ`moh{nA)yU-'//n=A$m0ܽQ#4 8扯Cږ~$82.7x2=K9;'6OLkAd@s/UUqگUkn1lȾ*-}*ۍ?֝F9}ovvAs)esm1& @"7P8\6@"Fja/j'*UVFG`0ɘ mqȸ$>ŖU5 ǖʶƞ4:Svl>:!#$!/V+#2ߢJAɬ.lSXRPoPURQ &l?q[֢^~A6@Bs ;̝|6v&9N.Ʈn+~-ފ>~X]s{A1P_(D} ʄ=I.-yulWʉS9y6EmgϖF7(P6QPqon.ݨjnllo^~pEQ֢6vZǫ$x҉2wF_-q@{⟊b>, |#~lKdWoJ=}llfei^dBőf+U?=V1uk\M_\~L&lT Np.{-(yGD@O( `<:y2coaeEh1. %{xBd89E"[Ǻyr'j9/qF_%R=HpN| 8XB "9 0:Db b!@$ >(@X€ "FFWDoNF$7oG2D]i=3FƘc0} `0ba0&C6Fkaw@8!zUP: @txJI!'XPia13B&XPh1d 6:DMA$j (R}*IDATxݮ-KRLjȜh²%pF lƢe|ĥ_{ʌ̪A4bh뫈2*+3k &>~,3'o} BǁΏfU|~9?~DkP?Ït<ǟ$r|"!RjyJkb{BVKۇU1ў,K~?'EyV<7h$*QI 怒r9 FT"xr7T"'$2$rD3F|G' i9@%okblƍh~غvQl7@ȁJo3D+1Jc#?J oJo%btF@NvVzq缣@3&2'#a7P"9m魛$̉UVG%D&ۅo2ed@' zBmd9Bgb i4#sbwKL25], D.33xr); Ub|+D*~Nd“R~i*sA5KVIJcd:*s| ̼ J/?+J&vHh9X z7s:Qv@wT0w&VTBm41G֤ѼPK72eP|B22jo3Yb4gQzT̡0wshD["&%x#ƜrvUnь:2l]jWo e9cBv ZX`qWLm?\ 9ȜwUFp#3aR $S̚hmu2ekqxFHU椊c]FSC1EhNs8.ƍ9Y 3M;L9WuDf VҝhTSoʟlTIIsF*CUXoBv)݃N/cV7w 4kp31Ua>`#.˘CFY{AZTFW D*YF# m#3wrFT4YS|Rc<=WJ}x󔹔ۏZwJ:P11C[b>̭m?G B.?oJ5ޑQ*uy15諞@7kMR*v3Ba HEeޣGoMuL0#s|APݺYKé^)l݇BLTTҼwviY'*f`e{MR#Z;vWڙy * 5wĊcP)|!R@g+e$+Hfsj}ff&TC0sEVNTB3|GVڗ("jʊ%2jQ2p#S1>2i0k]P\3>jffn0嬘4[Q5?uA̝9:g(c EéY9 Q])ʚ*N͊q!kΩO@f4J+([78d Qkz/[c=h37k\x TF`oQ"@c&75ʄqMS)Sci%EněXHuTA ($)8r̍Jc*\ Jǚy* YV^{ơ ؚqzzם,5B@WSߕ:o8sj̅ӯu`M|&"q( h"5572?5B U (ͩytbAQͼyDYuDN,dM1zod @2:O)c(s ƽMYةyk:B['׽$}ld̽X#"k|LVuLtWYO~),G*=< 2Iuz).5AN[da^~l M$BCwoRj DU9j]HW<7Ha# uF)d- o";'Dj =Ȇ{?"`V%Ï0*PPk'24PK^ixq?(JݏQǡy@xmR^.=4+|mƨK5r( `=p#9VqQi0x[0=!@La}Ec W y<#{,&n_Ayi5U \ 2O!fuW?f5X߳+sBq)}~[5X?|*ǝy-|OLZ"jL] oЌlʑcRb3Xl?#QfPc7rP 5qe~3BjL75r`Yse Kk205ZHZ[[*غ9ObiAxB丯݁;yr,?4:[t%*#W?$[ʄic<@[MsV #swzVa&"C1."rq J͸/MUUk&h"Rt{E;Q1EdМ[#jG9n4cʼٺW͡y,h5f0{Ꜩ0ov!p_p5"+&^zBfyihVsbTLNpO:YsЛy_Q0Nحpl/ُ.okGn5++cJ?* /@sҀ~csk.[95nY Y[[jNmc(ZJ5xRsw*bXskWE~s[QFUP֜ʢ Pмw_56WfHD|(lQ3Bk"*߬Geu}}=gd(7 Q[O~k=uW 1;[adVqD[;LPUe:P*u_mttT/=cm""2P2AyUHk$s^aǝ [_2mdQA!c8TGΈ.rj qF)+ĜgPW[qt'1!7X'sV܌Uu~rjs(zgk(= U3wW?KYB֋ҘۏUyAOw3J3u2s* hÏ{7X7SΩ ??L? *Kи#b FHZY1 Y˿ .VCI=p3k.pmRۈ4FfZR 4oMYYm#s!5kǁ9Tٞ=*ֺ8aw@*ĔdP82Q9@sOVּ21Uq!ghUwʸT\ZkG@Lj LF{ (i9.?R:wĔ7Mvlu2޻wdTV]Q:Jʹ& Zk[6LEX[,b%&Dhaʩ` ZLZ˽#;L[[^iZO= E`:O;|!VgZT~C@]{MR]QbVXQTL`>7nbT e{μegJyf!Sǽ*a{_Gܻ7#2qY&pq!QBCcIw5GXAWy`NA ]1u2:"` C({+1Y;3_.޽Տj*ݷzSjl3sukБYGu5wOv+V~* H8"ݺ׿'[ xq ~*j`ֆF ,D񂌣jMc#Ԙ"*KX75>@cVLFoBSY37&/5[siЮbAc{o.rp hPGh]ərܗY~bw51b#Rjbbn<؞e#XJ?PDo?-ݕdڕ]iNUƠ gě}!U4q~3s(kNDZ7p1u Tn? 6RvCi״iAq!a726B8jhQ{~q˪^fvŶGC3Ǡ},Տ:+AhP1?}R ʼb*Dy84lݜQӚ Xk/L)xYCG ӺwJ:c.o[S܈5B{ˑq}̬_LGTjuzL֧X_*Al$1xEPZ:fHS3"\~_L[{7?÷#POJGlKXQ~_PzM?Oƍ\[F&X2 :D3Ȕޘ27>@"Gk󽯙е1Dn7oI(f7dj*a1j/:5m}ӿF`ɛ2v͟}k&n?lͺ9]w~gnS1G6w W1{[@66j`'vh8pL6H52ohm}b#r5afЛ*u+w"[b][N{WL|rO>T5qu!Jz~CUkZo.gֺp?P{̍YlO&2$=ڭ/?kL}G}]3_.ԷR{T¯DKcgLSh(}^5>4&TkRE3“#w 3':87*+UGg%oP}z=ž:yvo9{9rXW&?|kXRO?i秢v9W_M-yߎn/%ٮdjM:÷i#OQ[~px~gv)x>kvo:I.SbY#sp/Ef[_c[WO\ ^y>[V9`_']գNtI{:٣u֋O>g0 }%:NM矬?|^Z⋊Q~=fx_({@_\9QB]cF3b?nH>IENDB`web2py-2.12.3.orig/applications/examples/static/404.html0000664000000000000000000000000412564727256021450 0ustar rootroot404 web2py-2.12.3.orig/applications/examples/static/markmin.html0000664000000000000000000003770012564727260022607 0ustar rootroot Markmin markup language

    Markmin markup language

    About

    This is a new markup language that we call markmin designed to produce high quality scientific papers and books and also put them online. We provide serializers for html, latex and pdf. It is implemented in the markmin2html function in the markmin2html.py.

    Example of usage:

    m = "Hello **world** [[link http://web2py.com]]"
    from markmin2html import markmin2html
    print markmin2html(m)
    from markmin2latex import markmin2latex
    print markmin2latex(m)
    from markmin2pdf import markmin2pdf # requires pdflatex
    print markmin2pdf(m)

    Why?

    We wanted a markup language with the following requirements:

    • less than 300 lines of functional code
    • easy to read
    • secure
    • support table, ul, ol, code
    • support html5 video and audio elements (html serialization only)
    • can align images and resize them
    • can specify class for tables and code elements
    • can add anchors
    • does not use _ for markup (since it creates odd behavior)
    • automatically links urls
    • fast
    • easy to extend
    • supports latex and pdf including references
    • allows to describe the markup in the markup (this document is generated from markmin syntax)

    (results depend on text but in average for text ~100K markmin is 30% faster than markdown, for text ~10K it is 10x faster)

    The web2py book published by lulu, for example, was entirely generated with markmin2pdf from the online web2py wiki

    Download

    markmin2html.py and markmin2latex.py are single files and have no web2py dependence. Their license is BSD.

    Examples

    Bold, italic, code and links

    SOURCEOUTPUT
    # titletitle
    ## sectionsection
    ### subsectionsubsection
    **bold**bold
    ''italic''italic
    ~~strikeout~~strikeout
    ``verbatim``verbatim
    ``color with **bold**``:redcolor with bold
    ``many colors``:color[blue:#ffff00]many colors
    http://google.comhttp://google.com
    [[**click** me #myanchor]]click me
    [[click me [extra info] #myanchor popup]]click me

    More on links

    The format is always [[title link]] or [[title [extra] link]]. Notice you can nest bold, italic, strikeout and code inside the link title.

    Anchors

    You can place an anchor anywhere in the text using the syntax [[name]] where name is the name of the anchor. You can then link the anchor with link, i.e. [[link #myanchor]] or link with an extra info, i.e. [[link with an extra info [extra info] #myanchor]].

    Images

    alt-string for the image This paragraph has an image aligned to the right with a width of 200px. Its is placed using the code

    [[alt-string for the image [the image title] http://www.web2py.com/examples/static/web2py_logo.png right 200px]].

    Unordered Lists

    - Dog
    - Cat
    - Mouse

    is rendered as

    • Dog
    • Cat
    • Mouse

    Two new lines between items break the list in two lists.

    Ordered Lists

    + Dog
    + Cat
    + Mouse

    is rendered as

    1. Dog
    2. Cat
    3. Mouse

    Multilevel Lists

    + Dogs
     -- red
     -- brown
     -- black
    + Cats
     -- fluffy
     -- smooth
     -- bald
    + Mice
     -- small
     -- big
     -- huge

    is rendered as

    1. Dogs
      • red
      • brown
      • black
    2. Cats
      • fluffy
      • smooth
      • bald
    3. Mice
      • small
      • big
      • huge

    Tables (with optional header and/or footer)

    Something like this

    -----------------
    **A**|**B**|**C**
    =================
      0  |  0  |  X
      0  |  X  |  0
      X  |  0  |  0
    =================
    **D**|**F**|**G**
    -----------------:abc[id]
    is a table and is rendered as
    ABC
    00X
    0X0
    X00
    DFG
    Four or more dashes delimit the table and | separates the columns. The :abc, :id[abc_1] or :abc[abc_1] at the end sets the class and/or id for the table and it is optional.

    Blockquote

    A table with a single cell is rendered as a blockquote:

    Hello world

    Blockquote can contain headers, paragraphs, lists and tables:

    -----
      This is a paragraph in a blockquote
    
      + item 1
      + item 2
      -- item 2.1
      -- item 2.2
      + item 3
    
      ---------
      0 | 0 | X
      0 | X | 0
      X | 0 | 0
      ---------:tableclass1
    -----

    is rendered as:

    This is a paragraph in a blockquote
    1. item 1
    2. item 2
      • item 2.1
      • item 2.2
    3. item 3
    00X
    0X0
    X00

    Code, <code>, escaping and extra stuff

    def test():
        return "this is Python code"

    Optionally a ` inside a ``...`` block can be inserted escaped with !`!.

    NOTE: You can escape markmin constructions ('',``,**,~~,[,{,]},$,@) with '\' character: so \`\` can replace !`!`! escape string

    The :python after the markup is also optional. If present, by default, it is used to set the class of the <code> block. The behavior can be overridden by passing an argument extra to the render function. For example:

    markmin2html("``aaa``:custom",
                 extra=dict(custom=lambda text: 'x'+text+'x'))

    generates

    'xaaax'

    (the ``...``:custom block is rendered by the custom=lambda function passed to render).

    Html5 support

    Markmin also supports the <video> and <audio> html5 tags using the notation:

    [[message link video]]
    [[message link audio]]
    
    [[message [title] link video]]
    [[message [title] link audio]]
    where message will be shown in brousers without HTML5 video/audio tags support.

    Latex and other extensions

    Formulas can be embedded into HTML with $$formula$$. You can use Google charts to render the formula:

    LATEX = '<img src="http://chart.apis.google.com/chart?cht=tx&chl=%s" />'
    markmin2html(text,{'latex':lambda code: LATEX % code.replace('"','\"')})

    Code with syntax highlighting

    This requires a syntax highlighting tool, such as the web2py CODE helper.

    extra={'code_cpp':lambda text: CODE(text,language='cpp').xml(),
           'code_java':lambda text: CODE(text,language='java').xml(),
           'code_python':lambda text: CODE(text,language='python').xml(),
           'code_html':lambda text: CODE(text,language='html').xml()}
    or simple:
    extra={'code':lambda text,lang='python': CODE(text,language=lang).xml()}
    markmin2html(text,extra=extra)

    Code can now be marked up as in this example:

    ``
    <html><body>example</body></html>
    ``:code_html
    OR
    ``
    <html><body>example</body></html>
    ``:code[html]

    Citations and References

    Citations are treated as internal links in html and proper citations in latex if there is a final section called "References". Items like

    - [[key]] value

    in the References will be translated into Latex

    \bibitem{key} value

    Here is an example of usage:

    As shown in Ref.``mdipierro``:cite
    
    

    This is a test block with new features:

    This is a blockquote with a list with tables in it:

    This is a paragraph before list. You can continue paragraph on the next lines.
    This is an ordered list with tables:
    1. Item 1
    2. Item 2
    3. aabbcc
      112233
    4. Item 4
      T1T2t3
      aaabbbccc
      dddfffggg
      12305.0

    This this a new paragraph with a table. Table has header, footer, sections, odd and even rows:

    Title 1Title 2Title 3
    data 1data 22.00
    data 3data4(long)23.00
    data 533.50
    New sectionNew data5.00
    data 1data2(long)100.45
    data 312.50
    data 4data 5.33
    data 6data7(long)8.01
    data 8514
    Total:9 items698,79

    Multilevel lists

    Now lists can be multilevel:

    1. Ordered item 1 on level 1. You can continue item text on next strings
      1. Ordered item 1 of sublevel 2 with a paragraph (paragraph can start with point after plus or minus characters, e.g. ++. or --.)

      2. This is another item. But with 3 paragraphs, blockquote and sublists:

        This is the second paragraph in the item. You can add paragraphs to an item, using point notation, where first characters in the string are sequence of points with space between them and another string. For example, this paragraph (in sublevel 2) starts with two points:

        .. This is the second paragraph...

        this is a blockquote in a list

        You can use blockquote with headers, paragraphs, tables and lists in it:
        Tables can have or have not header and footer. This table is defined without any header and footer in it:
        redfox0
        bluedolphin1000
        greenleaf10000

        This is yet another paragraph in the item.

        • This is an item of unordered list (sublevel 3)
        • This is the second item of the unordered list (sublevel 3)
              1. This is a single item of ordered list in sublevel 6

            and this is a paragraph in sublevel 4

        • This is a new item with paragraph in sublevel 3.

          1. Start ordered list in sublevel 4 with code block:
            line 1
              line 2
                 line 3
          2. Yet another item with code block:

              line 1
            line 2
              line 3
            This item finishes with this paragraph.

          Item in sublevel 3 can be continued with paragraphs.

            this is another
          code block
              in the
            sublevel 3 item
        1. The last item in sublevel 3

        This is a continuous paragraph for item 2 in sublevel 2. You can use such structure to create difficult structured documents.

      3. item 3 in sublevel 2
      • item 1 in sublevel 2 (new unordered list)
      • item 2 in sublevel 2
      • item 3 in sublevel 2
      1. item 1 in sublevel 2 (new ordered list)
      2. item 2 in sublevel 2
      3. item 3 in sublevle 2
    2. item 2 in level 1
    3. item 3 in level 1
    • new unordered list (item 1 in level 1)
    • level 2 in level 1
    • level 3 in level 1
    • level 4 in level 1

    This is the last section of the test

    Single paragraph with '----' in it will be turned into separator:


    And this is the last paragraph in the test. Be happy!

    ## References - [[mdipierro]] web2py Manual, 5th Edition, lulu.com

    Caveats

    <ul/>, <ol/>, <code/>, <table/>, <blockquote/>, <h1/>, ..., <h6/> do not have <p>...</p> around them.

    web2py-2.12.3.orig/applications/examples/static/favicon.ico0000664000000000000000000000217612564727256022410 0ustar rootroot h(  \^ONR:NR:NR:NR:NR:NR:NR:NR:NR:NR:NR:NR:NR:MQ:ehZSX>bgIbgIykpTbgIbgIbgIbgIkpTzbgIbgIbgIbgIMQ:TX>bgIbgIpbgIbgIbgIbgIobgIbgIbgIbgINR:TX>bgIbgI|mrVrchKbgIbgIbgINR:TX>bgIbgIbgIbgIbgINR:TX>bgIbgIpbgIbgIlqUz~ebgIbgINR:TX>bgIbgIjoRbgI~jbgINR:TX>bgIbgIx|bz~ez~ez~ez~ejnRbgIbgIbgIqvZsw]bgINR:TX>bgIinR{hmPbgIp{fbgIx|by|cy|cy|cy|cx|bNR:TX>bgIfkNbgIOS;TX>bgI˾srw\ltsw]chKbgINR:TX>lqUu̿bgItx]}inQNR:TX>bgIngkNqvZbgIgkNz~dNR:TX>bgIdiLw{a~hfkNNR:SW>bgIbgIbgIbgIbgIbgIbgIbgIbgIejLnsWlpTbgIbgINR:TXFSX>TX>TX>TX>TX>TX>TX>TX>TX>TX>TX>TX>SX>SW>\^Oweb2py-2.12.3.orig/applications/examples/static/web2py_cheatsheet.pdf0000664000000000000000000043632512564727260024371 0ustar rootroot%PDF-1.5 % 3 0 obj << /Length 5291 /Filter /FlateDecode >> stream x=ksF+޺FxYPeszDq\,A@K7ۯ{p=X45h{zG <5jr`T@7 "|(&LIΞU"&lZXXP-X 앮Q"*X}S/Ȑ֋@DQڋe-RHյCX Έd{,*V4iDQg6A9q$HKUIT5 8L]8eJa竘&+&Z5, M"Zd$Љ:$ݨmODDx!0^ "9"fSDȟXD /pMm̐,2ft2Q,y"iTWؑrFTR&-Vb x#.a%#F "0 $ Bߧі,7<%ȁ >%4[^[#J-q@Wrg9T-U Bs n7 ͌ߍDŽ~, bJxQِAnx;?:~]_/tdҁ("Ӊ"_#E̺ R V,UK!()ĔGg{4HDiN4I'p K]Hڜ>D+^9ܜ_'q`+A{aP̭TXPh2 q&)p $_Hf SLBW4"[#`gN2x8OHnyc܌'0"YD^1~8GzDߌXj+%-򧰩27tQOt)n"II°r!W\Ȱ*B `c?|8S }DZ "zFO2x"DQG8tCwp{ Y6ӗ6}!'h,HyW8؆ j֖C`7| qk@nZb7؆ md*$83ŗUMh[.dB3z]py>뼑4lӜ:Ԑ wmtDNBW'W!,l9$*Y|_K)1abm k{' !Z_00FWbkֿ]Bb7ĎU\;xiHG~eM"k7/I  Z^Rv5Ь$<'B<߿n*ck5 9`Ыe }Us \t.20C="ÞjۢQ4!S,;!Je+v1$./v6=?py ngea!;UesWKcV#`IfaFOd^;$.{$e~U]V n3,OWGߘiVVphuiii4蹜 ępYy"3f{w'qTE&Ja"qUn/i, 9Yl2F/#sq-uv,W>@9 O./WKR­n+clgvKğLcp>/ P*0˴ VYj%Ɩ!sQ\0>ҟnޏ( ^m*\f7=) nHI[*bBf!  ; T؆Lu,Ga2f- `:cI2GTLWH4}ב"0;bcEZ J}!j ߣS'_Ч~>l{# /H胰 i; χnґ7u|"ZF|هG .{oJqq̉Gp{3<ӯ/¡sDTBHAj&̀Vc`DE-\I (Kҷl.z168RfB2Ja' Eplm?qeL%LئvRY!\A*Z:v~-EM;1H> bF|Rpֹ;wh%fa}gx\8ٷIw/F΃e ìr!+4 Sp?T+vsWB@谕u_IDݳe?5HKDvbqO涾u f̦(wݫm u2oUs% ۈx]׮hoHZ>y*[n~q;^e;{p}Q[a]{$C^jhe>{߈^]۩+*Y- R1mdwջl[EB'W~>N#{@ʝw)DW Vk3٤dnND;3 ۣwZBso.>gSи洼cW(neκWPv ]wsIw6-罟]軗{J\U NnĖ\cDr_/+8F^Bε)0js9o@q2J;es"[qY.ws2i.l*볦S{ Hzsym ݫJ|ٵ;\{fחU,Fw/C ib|پtSv뻈~bֈ&w~#jswӹw~;̀i]q9mvgs/), {%h׮HpvrnDqm4mG~Qd6Ci;dm]5.>{n`;q|Rc UEk4YU>t֌%o{OLBH|wL 43S`}FbR*عUݫkx[ .K4.[ù :]>Ut-~Vdq!SovHc|Ͷe}!nQ5RUPQ{u?!;{yfxJs y/Y=S'J0Fެ]'|'L !ky-⒥X`[(:kYr\e UN u\UZ W!91:hW99^^SxHٗl[&V@ߦÕlmU(C]xha]v@^4.qn2vd.{`W$XƮV6fUw-'p|.%6k*-N=veC]њd-.zYrrufy}Cpky_*Ky,ks҉A l)jJZƌFYchj3WBޔ^Oc'g:^f6 4 T%=>08cS(̂?ͅ{S-עjqGl⎵7u095Y:g{``QS,wG]F||p=]pURGx=QOA/ 2m`4WlnoFch`fKpV,FGﳗkj|YdS`T̋/xe~=&c]ĺd/;ּ`q7)'Nj<],a9(#\?,Yi%U@o%<3psg9gx; i[nӔ;,Oa+RRF%؟J~E;s==NYϾ/~}~G:!k;,"h'_BDl@%݋_p0 (:-s|m /M':ׯ3GY_Gl6Le+8ۉp}{l~=A%&B!잟s2 3M҅U "/`]Q`/h,,aEr L b4T۬:AZqUb!iPd%t@nŒϹp;@Vo endstream endobj 19 0 obj << /Length 3347 /Filter /FlateDecode >> stream xڵ[s6B~ >EWe48umڙ4B$,1+|X֥o%RlQgK$b߻@~<6IwzN<6z=sҳ'N<}a C`d::d?F!8Iv'b\!2p45ۯhoCenLmįy#&>YpٚɉF/oE0ڼE&d5`3ڂסn㮜vtT )4*ă0Ҽr)1l*~gju&(G9+<IRV{M[{g]@]w EKe΄̦t>{-bf= Hc& &fwYxk6qAє,RZv#u^31S2~U#s@ä6J\DMLbfgP|R;*pN__^KŊ Q^VQ&i)z8gC' BɇCmSuٓu׏94JRw_߾[%)[A+H~*Cwj$Q?QLL蚻4aIпە~//}^ԃ8-† uX.hV 55jŏ?7 1CVkc7,ЁxnhEi< C Lg0`p@c) /s x\yXo],OjUR>j{;Q7!-c6ƒR_:qp0buXE<kQOwNqqcog0JwoZ,>X?،X؎Jn,bi9c|(;w+h i665mB[xnڝU<0ŷ[Bi\$U+!dz܌}i䴺 Bx`3> >>ߴ<!Yikr9DijvLY6 Vi|LXYW%#*`YXd Z q9E}iI6ӄ-*Kz#u%b<LQ [d SYAL˸Sr liR`٩qέ.O~{^sl})vu*&,J1^+Yne/V$[7a3{e l{vâE>ʂIx!Tݹu)sӨKkZ)DBBH;M@ȴ-9;l nY?] < Ҋ㗗T{RG=R;-B0(iq%bzyu`j~Ĥш綯d%J mo f<91`7@JL΍318<Y93Td(y?/X2 d '),!!ꦄ߯2cb!{X*/zٗg(MCRt"wOZ/@h[q$`ΞG("eĘuGznVJ ZT_C"\VA]&$3 ]0!<`hXY[1+\V(Ymň^0C1_B3 QJ%)4I` DŽXF1&D hsZ 6>gA%D Tp=; i G+!{/첔c|~;s,nC&PsaҝGZ.5Bqi&z;jؐR/I(+rqFu 7oxr +J}7؆MH]-C#k`KH-q.B ~ʪ(Ol\jHc6&PgY1{ bxB:%l.jbŧcЁ29 (&ExN(J#_qxC(z:BM}p܅HRN= UQܯqWCjKsw^a*\Jg!~k_ ,,IXqmv;^Õɻ29Y\ g5Q[H@*pms:o,`4*ÒeжdQ|QUύ5YYqg@VH{ endstream endobj 32 0 obj << /Length1 1948 /Length2 14258 /Length3 0 /Length 15452 /Filter /FlateDecode >> stream xڍPY 4R@޸KnӸ;4KH~ٝ{"̓'s2X^NXƉ ,+`ddgdd%#S6w2Lֆ@#P l`b0s3qp32h dR6Ǝd¶vfN@iH`s9@h:[h(;W J^3'';nWWWz#*Z@d/ide3s9lM\ƀg#c%IW;c+$2s1hnnc 012|wrsmZ9~ͭ * h`nHhnF?|#;~;_kicjo2112C_1&ؿmN6FFFvN=Ќ t2aigk0amnbt1898{{027tll/s7G1IÌlmeUD%h@`bbgp|0:},|:ql?L#Aob0M,ɿ )M-7qC\>M\GW?> 3Q?#?C?G%ǐ1?~kwvZ+cLY51?oUeY9;#G~Ҙ>:?"J]J]Fe?zՃʜ|K|4cc7cC[C@jALGH2 D W \oQǨO\{:O!^NpnXG ^tŚh5TbL#urN;1$4r\J2c !*8n툯6d~F?38UbD\8}>y1w sHu.0anw5u8~sIׇH--Ue*co6mR9CtXcH:]5Dk|MД )+/q {/*Wƃ5C/sZ:Wm-#E7m1W"Ga *s`ͫ/){l۠ ?i'Um(b>L/Q֥gΓ%WU zDBps IYV~&Y+~\S!X3u }HNnVV*eṔy7Ze`;0䚇E83%ٝFb)ԎGF\?[߂VǁqMk^La8~tQ(^d,PHLj]7Hl?{E(JLЙ,S/bOrEk,[`:1]w6΂+/26'"a?+#5;|E~83F\ؖ\NNQlS_}nchl~yE{ʰRC[3;h8`sl3JZzmRl[mB$K5.2ʤ4K?Zl7a$KJԑvUNwB}O!;5>'hzw%cohdH>+R.H߇\k;z%5}B"8[9᭎Lm6I;;$qc7#T%}L;b$'J C :9pqrk(Ѱʫ*6 3;M-#*lA$qGW_iz o rd޻| VyjˏW?^Zp3>х"i4 F_%ѤRjFP< TK5D>vVpb/-Ŵ/lQhMnffĻcJÕ!pf@[uhJx5#G TdY98#mRE2qw?&V#JM]fOLGpp%*lťԃ-@uOz7h5[NPctˌ:BlIuG}dR9]!u4Ř4(^_#*9&v^튜 7_B!Ck]urymfGUZBb!2d?U3ڏꅌک?WغmHo{U?wjiD}7Qa}Qh 4m !2MٴXC &#PEn7 QҶF3|{Բ]UWD خJ5?4;@r_a[NUyW.037oc }w!lJha- zI&U8M; p)c_ >͆ŅP~OzuIO]ci|`/(Z,K[F!(aeJZ_(S#U!D}ip=^wyEz@-0ȿ k:eRo0Ņ(XַBS: Y%#ז4ISL A&<{`UdE>-J]^aKs )&bE U\۸HyN dKi?ClܒӮ e7h>Rv"X/u5 g}2.VUPcTiLΫD^hgyݥ8_r˔ 0x|Ee>X r_x6G`|B3 r$hɄ81Ҙ/^Dl yBۦP[OeΑm{A䊅%~kGZl mANH4cU?01,2D=0M*~P^|Z ͊vGloK>oYEvwFJz \e9jeINk, D ӀC1cqdڦ4rL+3bPU#)kQ.89\@/R2OESh 7h$ cl '̏r|Fz] bhވowo V?_IjҹhS*ֶ `)T~ [8(5bD09%Y{G2H+yEW/v޺|5pwȞlu45}޻ҝBAO XM(އՊnIKrB>T^ʈtY]b´S{9x?f`|&B.)xgu_&`}UJ˚~f{4-vdnࠕF⇞l9H e݀B\c"m-Kni$R7̔_ kbC11N0HeAp"ںF͒smBuY'N~Z}(·e{; vV[.(J6I؍ҘoѲϜ, CnOnoO8k>]{Ӻ3hp rHJbd=ʄU"zFeڕIOZsܙ~{vx bt~("2:I =w@һӶd:g$> ]\Xss^Zodְr7O{(>hZE3t$D*MfB;6A<*^r((v 2y'CtN ʾ`+s`Cy0G^EjҵDF~Ӥq"=ޝ6t` Y4uG 4]NiԦ +'Jx^st-DW508ënꃤ`Apwk(pR;#4J]m#;`&8ٰyJN^z 7- Me=XP=klJHXZ798yxӍZj7w)i9NGQ.=޲Yo̥*#"kU}ՌW٤bf,NOgZ֥̔[1 JqÒ /IäFr"S(0F]/2%=:}jɚ›z2{PRA7!a;2G?T[VC([ᴲ@tiӐ^yB'>>QwD#k#* _͈6-iOveY1(C=X4ڹXVYOJ*#mV7[lj2GmOzE@L{ J((>Qn fnW._P ȿԾ/&"/ f E&MjD1Ni*(jY>LEc`%!HJuk .;7aw_|qϖ*U!bx I\ūD$~}f$ހ\%e.y.'-aNE'kAemG^o;4]t`6TLP`ݳn,7 &z>8֤' $lZRyVN #!@޺^I96^&81nfdsc#1˖] '=m`':,Ͷ#dTiO2|‹\jiaxĀ])tC˖j8*Y_CjD$Ejomk s' էa4urC7X627wNag»:{~D̳X$6РŻzbR3}#̞7]Z(LC0&#a- Iy۞]G+Aby0ŌݡG_kป [pXֲ (9U5?e=Cl<\Kve U>]BxE\k뷞GBj}zE|U[ aIE/o+y.4>O jmd& krNΐݳvA.j|](Q4qk&YX Ϥڄ#epe\f߹5(E6Sî+~wrݲRDwQ<`ܔ#gh. !f%0ε6`Ģ\aI#[ifNZox܋:;?D.o[%!EÒ7$@T+yeщύZ-5̻gMpfyC#"LQJ~[fsRnSآWe%4xJP8)T҇MMKjh.oC pZi?sʓAby2Pcv6d(Y".T4@ޏ0&r##vE?a#+pf!}m Cwnln?-t9"Ln\A`:.M|Fٍi^ EMO{s7/$Mˉ=Fؘr00 pviun2&\wi,J[@x.GL7mvhszøp$Bԧ9Ll+SJ$a9Er㆞oёH`$hV,4$Y#9|7sV$teGIĸQ W)xH~߭iiGC#AkzG,y*QbiȄҳXr 'uoYjt\$=ʹ хGŭlQI=U; 'нm o%a OoYT+b_Z.qݼ\ؽz7PdH2+4l[lk,fR` g.7duGJ_J?m2KmVtLΚ*rG}¹q ,jڊ>䔑ɬd&ul3E[,yן0-6ٰ 1Z2ࡆ8fV;R]Qⶐ{Bvx4} }P= &F}ky'I+5TmTѽ0♋ &%'.!ɋGî#,(-REbU'QZ8F K428mx؄lKOnYP.1le(xB3wlI }4Q0f5T.%w"mF/Fl6 Ԭ]ߢ6!*8_q]9&|t$s’Du4Sh! F$;.TMh}Ge=0?E~+ f%wEu3'\fU/\"R, !r*L}[on˛%`H%C7%t>/݃HUld?ٮh2R CB&~y]+{ג PwFjKN9)Èza笒@m@f$u45,Vљj`\t3Fp9g菉Yj}orȂLE8RY #K).Wo4C]N Cj녿.nADѾk~"wd䞐`ۇz>32f ^O{|!6! +b<1#$M}5r=Xe! zy}  >6ʼaquAghxgt8Sh?ae]!yՅ"n{/NgglPs A$p Y,`rH~&wBn BE]ҍikX ==vPa DfHE;0*˿i"8/vdDkq({b0{wТؒ+@aH>p2..c wֳ?xitfo7[bEJ2Y/2a9f|.G7hqfgշT_]ҷ!:ē(`HK=(`Ak?]6KK N,;'Py8Lގ ST,Z:9ke)O GC^^ Ex @7!*si9涑lL:#L3,{ ]'S27IsLh_y,c!Mo0 b˗wVHDZ -=[> P0#U3"|gBRLY@R0\Qo(N_e {FMju)ɚj"|)C\(8L_DQ.Fzz2i.P+Dm@Q] &rýQAD0C99|M4V=FXDLfnN6? j2Z|KΕӮ;}Kmz}T ;2oyiej. m`4Л?f4Qs;J^^;TwЩ-BUN_:̪L+iq(I[jLa)=A"9V_62 X00mA`t[<|_N\rTmtvu䀸RfnCA_vƥXExPy:F6QvqzQW xoQC{CL:uL.I2"?ܕȒb= ],^}fn8ˋtNC3[FqBZ[;b@gT᠀[N˴ҪQ+s=,lnh?8&~JzS.1MmX)A1cXĽ豹+Ul#ňNMߏD3E~4$|q ,Ж6FBIa >\s?!sm_<- -,|]XK3\[ %9q} M4j3 ü_ BBDagyЩAॗ_05s(oP3O(<TEhlDdG~`5 B8TeCTzTQwǦq'vLJL"y#4/i^"0U{?5{_nzAC²$̈BߧcZBŲgr)ź:%ƻ:2txM]kSIoswP0V%##8ddXʗ^iX zTZ$1&:8˄Xfr%>-T6KD`P^X +d7*D(,'$+W'·SȆaH2V^[go/%XfpL٩&,07]kt|,Y>7QMl^4 г=c/Z_ɋk'46GV \*"kLLς;*W ϊRo-gN;cJLV26ݿ<2p\\   ytʇ7N pI~Nr’Feu0=c_j"h͕Ű ŷnt4F]Nd{AyR=~QfGwhE#OMi#j]N:&Tr|vKn\V̼ e&n .A룻UfimW/m\ɽ4a&)ǚ!؝3ɯ9mrs-G|ctKz|brDH\{!Ot@ Fw@ŅWkxN ]gYcInKZu#_4FdAFB.CD썝I1ﴘSr^׏ Ƥr2྿/G{(b oc$d8hmH\Fy@ 6\j`.+g*[8I#ZlZ*G+ʘX=]I W!OIWӯ#Hx;k[L~~V^iurlz`=k1?n Фk%tihK|4YSc* V1w;GG-*AvI$_tL\ OydC";fOZŽ;y =S%7en拕&O)փl Zg_PiKTѻV4}>VfOpjspp~0xS9w}٤Ņw ԥ] v}կzgd 1RŸ@}ցG9x j f͊ ҲI褻‰P0"A{8J2aP7-f:lQ gכ-1~Φ=3R?QupJR{jiϝdo-:r%KG[;3-BAo-iaJQpȾFcݰbP߳@^~vr9gVrjt&3W+c0t6 R2#)vxGCz ,p^ߛN x}ʻߋ E6x!|(Z ̙ќwFR,A FdK!(|Z0bU=^wZO+~wgY6fLNq*~~jݷA\("=[ѯGS͓"4,v lc^ ,|L#'i}N`Ŷ4`- +,"ȕqlCnzs74v_pJȪw/]=) i9<}hcHi(mnhG)è[f!|EѓK2$LJ.^ܺ7]^P3=#o9s3 mt݀~L$L9)Bꗁ z^l~7O*-U;zEXC|\#(T׸DG# ;8)gO<";E3E(jZD3DQG׬bPL'zrczx^vGgRW`eTѕ̕ nǫ13A{&ʕ8,FɗN-UV9f V;kp߲ZZ'ʘy4 dńLgӘR6b75-uMBg)3Ґ}*@bqV(PR9@."\qi(zipcŐ=5/kI_~Ou3{Öu#|"^~F{{CĔ\;ߴ$sTVP 2 P~ jaJ~!4j\YdU1bDʋzi~kHZXqVc#ZK\;y_d֮ hIYYC>NF*7+!w%~[ 5<5*/^Tj'~̤EH{y toe`>Cjv ncml( ꛥO'2l~tÀTNcLբHw0ɝv̭B`B?wjO xR\1^4rԑJB\u85Yg+[;_ȖUcv;܄Ix?,[ǎHG"ϰ͍:N\wܝMfb̅F2V =%5ue:?scDW=:cNE`'5[ ~3D|4o%ĞHJjmUbkq&YNXKQXp46%x JODfj0!p*"9 20X#,NNQ,Y +ϴP8Oz̞&ԛsn`qY/.h]W&i4EzBUu~T_8=h`$׌T_콚A|D)4:fiiSTyQV˞McC/ܻM-V[ES@vtuBF#;N=zic5ǢDB /G(F1ўv`cc58Tć"ڦdžŽ@F9tFuyt%p3".iZ]3!SCb=698_d9SVtnn% CjyϺ~dE.xeZ^ًyl^D`cPX/\{CS/2{kW R/E8l85Bh( Ƞk_L du15fV(*MmUE#qߚ7pڛ{6XD9^Yh2A+M*ՙ <%a^F86~ѠSugi(/(,Χpet(h-]PSR|[bf2ryt6$OG&Yvcܠ∣8WsvyR-G(o=B}Zi/"|ow (|i2@Y|Zl.BC~n=9PTz;Z [}a<.@GCeNYeL.gbx֕K%\&ݡ+gkC4]\!U|`:jGl&!dwQFI%k cluxDbmcAǢ"UIU^̓rSڍa6R-&$23trEP %_#?e$<&;QAVZݬVY 0. a) 2 6||oUAڡ^'q#dcXft"Jor9]=Lg뱫߾ R5c}Q+_-m5mah~ӷ@ X5qHsp5 B)[Z GR:s2ϳ~FKZ6(,Iw=$aB3f1F{Sw׳6\=hgcb?mk 1Qb&nۭX{`D-B o9*0vld^>S4 G7_7DzU%W0\vls4}n PZRk2x[؀zK8{kE\?'Uvr"n͌[txnp5x P_n]zl;G}cl3kʠ,!LsmPe"\s3pxF,5FS-s5@"an]Q@׈0 TĴz ;lɯ'2&<$fsZ =#T ;AX-4c0 i1oe6v} /sgGSe^[pG6\\)4V 'R /&DvR۵9\=q}HɞTՄQ$c/C&6>!Bӄ>,@yx endstream endobj 34 0 obj << /Length1 2064 /Length2 14627 /Length3 0 /Length 15860 /Filter /FlateDecode >> stream xڍP[ӆ Cpw5HpK!w'~%ꜚV{$UQc53I:32ŴX,,L,,l֠S~9:YCt~_:;*\V.>Vn> @W "@O)nghafcZ+//76 G c-@lyW4Z-@F͍ٞ hdh&Dpp6@ _%6O P7pA /X[l޷ؚ5Y=_ r`pL {3haak0ݝ@[Nv@ kѻߩR ]_52%mMll@N'a2~?w_2L\5l-\@y_frpps@9_-eog0}/ca zrΎ. YY&#- ;ZtYۏ;W,#$Jksx1r8YnN WUΎODY[S;ᅧx?ΠWAA?by7#)k4rm,=.ﳡh>!U66YgښY-,A&*j{pk [_#+ ϜC6G%%mL=6N.`l/!5f&[;-|v('YYqY%K,f? `Cl ̲]]+wu?ՕK<*]O!zWCлz/ۀ=3?i_FM''g|?=?໬?]uGd_xl>vH={*Ndvvgqg|vg' 7vqt|'dz/ d 4oglYP-JƸ7.8CL H[x'8uuGVd븥&5c۳a^$vDh]!Ⱦ+.9ld\u}+{^J4ReA;3ҡ_͠gMDxlE?y9uQAܢNQy&,xȅF7 u8jHJG&FpLܦeՉ]]4j3b61HT-,7ޚ8F00ik/w>O$n(Y tgbB6SF]TH}p8jN4SsJ$jꃼh͆\'[Rq=ER]Tt%\-s9Zn 1#trE@Zb 0?)<9^o~d /*1x)ɳ/(e r s֌2v̈́p.9&lY"du<š`G\r$ 4&˞;ܡdnUo;/z[JL4Ε ;~4!C͊ _Y:(4ݗ"tF{yowm~u!SVrqUt1/ _iQ4(mj&e,Ԡ[!f/?ۑ)p any~k{k)v+R|@tTN:z4pn?G*!\pl1nOsP{ٚo-iH ?tt҈lqjbelBB}mS"e὚* 9B.C&(|]^;NF^' cZ\`=H"y'(n0>Mc'N&G!&ҷO:UI=)I Ug͍9.uXq夏4*nV`[GJ?IW X!BB[anSf.rtS(ƲL&-S,_şv?r:V*\>mVtn6F_P WAjk(rT+_rW!ؘ ˑN K/{ g( [iP6!T勆K ɋ$ňiL?1=&bq<̱&OHlt]x"zg[E0$r3Z #odMGlC2 /~ @G)T'ixt$]tYg⬾V&nkq}e˒5](6a]bBsN怸o݀myzI kssc'*8 /'/@g(cʆm$n0R~[eHr~Pp̎sA:D*զZ_}I1:n$*̍d-$}tQ lN<U(f^ t%90B~{2k>Bfk (B7$ؘ'LۛtҚ`2Y\5rN:JVD9( [+A"t%ë! : ]\%FrW:-]߉q(hV_R.0Κ9.[㿐׳'!{a=oK,1ݣq84rE1\tIEQ/؀v]~b*OSJPUf߷KgFO٠gqA(7f>0l#vdS{G l٢ u@H`0wtzGB=䢠>.h7{b&*(+,yYTT9Iqѿ;Ssj7tCuuD(!!{~o8 l(kۛz*z[_+DղVBԛ23Sh]j]1Mnw9~5{+8%`?AA㿄 WzTĢkEV8?S06e.Ff:>j#^E;rֿ I*_ʜȑ|xT= 7x⤎ֿV#^Xh,tT+$P3BOcF޳KP.v}ΞfLk__ztSTVpKHZСtV /Ric: ůR,h ֵP~/d2Uȳ(ـ2q1b1nj6 cVٵح{&쏳CRY*gmFlC56M- dy?s{*GT)#7m El߸DY~0TRGɥJ1¿Q|>)B\$8)mkS g5c>9jhʃ6oZ5{]7a1g6;x(@sVDD9I1_F*KU$xn'(ڂr_߾YjAi9A*:/IV՟d)ЙҧkM @dfGqN"'z^G~!x~EJr)4mfNؐ[%Ȩ}6ڙse.ĿH@=:^d,kQp?bP;$[% &|e谶FUWJ!Z\E,~5L{}1rJ4ᛦz ѧ>_ۻ OazdHggŠX?9y:[?Eȡvʂ |n9f>g>ƆQ z#o!.4ZPV}:J^g#lI#K^#&>!!l8o;H ~0kG# 0y;)X ~ hֺ)hU>z4jyP3T.a)4bq7bkx3MATLuڜ6SIMNa̓ 緁x~BbiIIyQ'@h9l_!_mނuמm72 Nڎ0-As@bm e++4몙?Ww]1me̥N(p+Ksk:r-[";6 6ŪDUUX 5TlvC3[eObBx3g#t*Akbah9Lb *?a3j7%"Oĉ_BWD=9CDϒ¶d8zlL^1>a8C|j(:o2D^ *=*\lM9bfm (r0KDގCZ,eK/Ǡf >&qp)Y}ƀ̅}wX6PH0c +]qp@@],>lʋm%JnkA^iT_r(.S Ŋkd |ӪLK, 1g=6 :_S+x<6cR&H=8X洣^4S]RPaݍ0~>ftykQ[áTu]Tiba 09]i d"n-lDHp_&\mrҷrDѤ>H;uM:|wx=Hqqv>Rs"վb'4`/jYԁ.sm/OrA KUٸn$;c8Oyx]jP@['+H0?-ÿwA ϼ97O mvLS" 'ox/?L>R$hۣhrpz3i}8d2b+]W˶igi[".ZJbu8[lb_M zoaMiZV2L-(yZgSsبqdHIrKЉ[$XL1s#v:ynFA/?4m w|lgu>qՇgT7_7$WTPo. |bd4ŀ)boT߱~SKKy7}=ˁ^ kp q>sRR$g2$8 u@5VX|H/p:ۣ̐3XxͷF5Wī>O6=sFF}AX$M^{^}lS)yYa~G#[3Td=oS$E.$?0at*(D=%b)ot>}_,!ʦLR4 cNōS !t1m 5 >=Q$gm_PaBRĴ9Jvtlǽܮ 8q1 E%Boh~*dq <|6S8JZ삕]{/2EE.cg(w.]W3/xr~v^ַb"C4d6 nz5 ўn,BsM1C n܎u_bAT U{觅`zfOdڥ&Ef#a]๶ۇ1H8Ǧ=-\7%)y),JT:&7U>4Lj k,~6@Vj 3b7SeS'nW_SHM`.k䜼OyF4AF4AAgK/e8$h4Lfذ%}kaMCo< |X)6t@`=t,P`dmULaa[]kFȱ)Q&V9!7UD/ng ΍ ?y彨gJߜUU樏? 7@ံNrCE'Pݛ<R}foyF٤7顴;2Ys6]p&^Ll$T]'y".aTڲ@8EIR.D07(bFyUëK+*^! 6yZFl;`2 \~v?~:SF,2霵 wߣY甏P~?X.2MQV@X[0%ٓ_YR%Û{t&eDߠvA-O` B%!]Mygܭvwgܢ^`꘵S7^.cI(O':DgnBiׄm">7e ^J/2ΦiғD l !8 cjeP{iYgɾO~Tg 0"28GNA@^w܌J5=~WYGXI9ެ?#km)KFы5:O7 ʼnөO'4GW ?-Q3{m丸saBk%*ulw1erʻ E'xk1ZX;#6/WX;~-[!(u A^pgA2֜S,lӎL~(r3figiκ*81u'ɁGmu= Ce42w p!VN^7ZKImҰ T.dU:A/ꥬ9ł/|ؔk$DofcnUgO-+]r`lq (|?D>9،!X}g5Ik2dr& W xj=v80s6r=>l4V ѷ+;Pjw؟!bM$fQRO: R~lNp~Sg㱿=RB3 YK?ɣ<|[B`OD:_z,~6XgQGzNE\Y>*~Jf$Xsx|dVc~k.N][ W) WI#Cz_[P4yҞ5qb/.$OkFwݯn-u tjaL22\m8l,cƨ)Cv\a&ƿ7/V& 4WTj,di#yCq8g%PQ@# }KAE-l!6 UqHMɩ+p^_W0_G[?zN|Gex,^{Ws k>ƋP]گ8*̮_1@lЯ?kRB)imq/K7 +U^-jzG ULhWgiWTa]YXBӹ4qC;T8O~.Pmd\P[9zJP;G\\eL2V>0GU$Fn3jNxf a?O-vC{C(q7Lt8pb|M+oV*V bW3DȵgHT{zY'Z:g%Đg*}՞.v錤$,a]`q6͔Ոᅅ_ znfN ".ը >gb%;IC?Oxbԟ6D_6$Jp]xgp7Q>H OGUj(?ߤ':u)N9x^SSnbZX>6Puz8?"ǫC{u_G@L@BW_TkLP.8ay:L}$=6/GVKc,=g~["I?=wV)s-j$=v.z8{+,z ޿zX+Vn:Tz@݉IQ!#}ˁG"JQZNvEbR αhzL=Jٯf)=8$&e)pAMq܁nFʡy?u~6xQA_"{&qe\bH/wW}yfizX0+-K>uţ $S9rT]"{1F$m! p_+}[<(-KTͬt99tBƥga}ǜ}J,A5.\t=Xk4q@/T{j)cOQW\v`U,`,6Ԭkfc NO4)5lYq{vBei V w/16Sdp(xrVp=Ԟ2v_/XBI>YWw ({ }&gvGdϨear q54 / gW!OicqrzQ1iNw|/z;:l䞘{_( 6Ujؿx/Xp5_Q !3|GAy"PI]{g&cĺsZ$1dDR?^]qvlWN`yW2ߌ@7_<ح_„oޠ&lJ|(qtkeSrp>ܴDq1"4c9u*o-Y7j/ 4Kwl4Ckf%C@/$^G& I>a2K_^a:t)d*y pNur\xuwG0.j7>=jCk4LQ'Ti/hhk!_=w?p붭]뒈m mM-ͤ"n 5+qz/HRU;sWcU wPY$H#c$\%vkMa=<4 Wg|UOߕڭ .*U9FoN5rIW${mJc}+̆.ּRXgoLKQwnq.i·ຫϑK- vc(q)0W/Qc! e6Rx1X՝s|Q̗0J`/g{]t@Bk bg%u_HTP2ooihpt06`!?] m<25kc8 Lf'齵6l[)j-r1ԼVOOr j~H!rpW8wb?w, iy$א1~8@慘Yb\ͥK%B^( I-FWtX_b[o_ROiLb߽c@wk̼0hrzDJ48h00T>:ľ>UK9;sg[?2y2L p-R|43~ /4}5X78nNi?{9<,q@5 Y\g~0Y+J=BfO$7oXӈ/HKw*S3t-/C"JPs5}TbZ)L~~+ 68[.)dzU@]=ovN`nw&r^&^/yPV9I%_HC8 Rz4mXsеhƽhWGt-P63 '!dk+N+8J2(פ#MwSD^R+0!+> stream xڍTj.LI ]2=34HHww)%)!)"! )%%%) 99{׬5>z0>U┰[Be0wNX()y`n#O)QpÄK!2i 58 !a0  GJ[x[Up (wAڹ?Db  pap",`@ w;CD+ '_.XD]A ///. g7.8VenԄAPkt?0kmܽ,P s{0YC@-e  JpAvoG?-.0{- TUrvZ+Z8-<-,,PVBh_ٹY!]ݸ~g20k)3}?i{>?{<ìm~`ҁٻz@xB݁|`0X@ Vvε}\]6)@m??7 O( 7܁P[{b͟{oa @'ٲÜ|Q e-]%?{8|`  x8OH- 08Pj4< օTs 3`>y0^/cpreMX g{')p^WU@=Upx EwZۻ[9@{'{TfrBv)q{a; n{yXNks q&6pw? ߢ? $7xTF` Ho$Y  rA6|@CA! 0 ߐ|xLE?v C A^p?'õ|?*㕃BV)ճ0a-T^âzX9f=0X,#%: eXΞ~є,Isl03ț]n,jN]= /yvWOmhlW¾k\:X`zݝ|(oV1Sg5VۭhpOr;]lگxhأ$gD.pj K@>IF^vC.j.-G*ͭY^ ) tm7o.?fG)?=cN=ByҊʝRW= j| 9?b+aɥ{j_ޑP #.NP4{IEq4bbZ"#Fu\hW>yuȑ#eL<(s/ ] LdxR/257%}2r+α+}3:|?]Cj4A;mH<? n[xkA$e{A;ekuX_/lAgcyV:Fv{ǤFsɣu2:p̃uzG61퍡}ڱ3M%,wyH[k`gHRjxlyw4.^Bf: +dcaμg-$eP`w]IVWT!Jv{21ClotnmNNbzyx]>n9ٴDҞ#wtӀSY,A]DXbL?GIW&q$.0}q76R;ѾaM#"jxn0RT)qrr?uҌ s PqMq N㔧Dm .3p'M[Iߠ-w1 FTgE.ZhSqӝ+/3,cE!Ο-E ͨ xZWkGz'JjZ΂2Lo «ljl<ժW!`?vUۺnHf_]):7XHu>wˏZTfΡjlPL)+IhBN$fa D,9{Pp_GtD5UrBMzC'S,/GpYK×VHx[-]ZM)~2Xt3K9aH@B *꧇G^MRoNwVo 昤ag<:1“[4.U`Rjq+2 8GlݍEhf;M+N34>J*gj-2> q}_ts\~+:!!imNrv3Pg$z5_RנY^D3gF( k䗓[Iќ ˖9vVhr\d!A"V"@m˛\5AEQ>.cf,bQ.Ů~wf;*Fҙ\c e? `Gt_oL\rе0k?9', & oQ[ed%<ׂ1!2'ۜB6OıεIVrsxޔB,3ãs\\ 'd fgCIg<,8OogT>-6:ezC[3cC> #aZv9 tq)2$ܟk9ϳVW~!GW]9 k.nձتn5=L*q^51Y 0#\IFK_ڳr*+#NHO ]z (PDY-i>XFrHY/[WGl Q4mMQ\r ˒֛:`R}r0w?8гgN I۪H3vYB9%MvuFV޺i0pXle>^Go qGNwy.Q]=2dh% dc$}LQb&ƹ}\7JK_VR_!hJ61ϊ ]5]o4)|A#y>*qq/V[]JN3akX•Kdh?׏ ]< pߡL7(@wR NN vyKCM؊GijH AJCLV}[/$$W7?t (E%*G3[UD5 -a-P/G8htpOybxH1Wf~ {^? >j֝Ze!^ΪOOXrU(TS?_Rl;$UL쯱IΩ`\4 'Gˉw#,duAj$+:.[-əO2ܖ[؇q_5H |{,}|UuBl.KE<v)U >C#oݬq% w^.#꟟c@$nգ==#<82dQ>][[Ff4ܙC~aq;WZ=c~ҟy(%ddH"gvu=Cbe,B7 HD)ĺ202rH.I4%jĸ,bM;ӹ.IP 8p?1b8nB+GhQ \{a~ms58"TPGsb9DWTO@[ ٞ(qʝ8!]o?{cZӵk2a/ )J[[!NH$g-m/`l8wP? ya2D>c6m O?|* ;4yd9h 8NB8|1v % *)Cn$.F.Ȥ5”DFd9~?oHr\c#[Ү)`?轋]_?n,ˉl" \h;mHfxt%QOpJ_l(s m>*Cx,^~x;fpA.0ib:1wG-™W5 /['uTb950{o;yMY.fR<`ºIWC[S~I (5OR[(v=Nߏ}&;Dn'm+"kҽ#03"oW93;D%=K/\^v誖gـ,}(G@Aї!%̂}.io3o 7Omb:9 lyYDwq$ܰy8҇kf6'-])o$Ɛ|٫W-dHqzS +RGuX ZqиV#' uYsxH\5Ëo]BJ"vX*隍*= P_#<8E_!$anTaG9C#2s"+-O||g#֨؉><ǹy=1MI>^S$^ĐYJnX_]e^k83pte"P*^r$ UUe@ PnΘV/c:#WD[Y_Hh?oE1>HmW a9ߖbA=eoOySYjT b#4o⌃נvgdW9t^|=kW qhݕ<9"`(dzV{*`#~EΠBUYrf̀QR@EnN9 XX,TEPxDdKe64y: icMν}gK@QjQ$uD]ST ]E ѦZn_Un+F8TlOALJ8䃡Wfm,$@s"d Cws'l4'v:ksSasdwHL5Wp |np&SR$C6`|+_U]66!_XV7Ǿ.$|{Fl_ ~ /3=FEx- 89T|ls/F5ܚ.-{mp G٥CG@f杅ro>(Kі7 TS}F; Q/aq4ipD\w?rZO] v' > 5CDx 94i9$sƆR~ߦ?6܅N C =8ȀEdjrz!~ÂҊȍMu2iIxWPͳQ (t`C8!MmN ;?L؜aW y{X.eYn Iug'CGm޼l9]WFku_?%,vEU$HL2T'VW$ޫFHg]2]MV?!gm?`˓tݽB/>E'j݄/q½\`-]Aٻ\mw ;Ӫ&'+WRnj]u'NXh>aGL1{Q[h_WM7nǽ0Ƀ =lzTi^#qj>M}<0JtDBh#=v|PI{ᜢj.}ϸVCiQbJI,MoI˖8(spJ67v Ͽ A"QKK;@+䨞c<^ԋ?5QΈJ2g^ky>IKs;c: ;!RTbka}[=okԝ w#\M2 oN;?gjA4=S(qrh 9 N_n+fWGvA/ո;/}*-Փ3,R[3ǚ9s\* yKk2渐mQuf뻏֛_u[.(K^X)m]5S3hlN~>HBSo3Yw0;':|G]Q*7{?D{5sJʷY7{HAB//'68>3}.PWd~\j~v|"7[MM5ZЕwcX s <ֲxIipdtr P?Rfƿ(PNDLd'X+0r^&kHdW-L&svѸ)G݄ UAC}-D]KUlD ^|gM%>,YA4;qMx_,1Iz'b 2 5los6#vnjVē|6!Iqpu7"]*Fċ]5-o'+x]&G[8[-&J/N(QsER=*DyyrGdҎ;,l2YwQX>J{yvT4` r'IFA{f4>/f fɚUOdvIrZ愁e-yɰL:qcu܅G^lPY!U> 4ݏ>uք, _`M82Z6}á(NMEc3QCUtGc8h$tS|2.>^x -NvkiΈҸ801V1&eJvN'=Y*-6lMK܇eH9Jf1p=ևx ɇK?m27+ ˑi-Iȑ(uXeɿt$&p'2I:J9鏷A=Xr} 1H/t[Xqh֍\KZm!˥/CFÀ1rX~+TFs'/efN~Lf&L(~BjƹN )2=5 r2ґK5AfWDBj?pӌt`ua1H2øU"&1fg6E6pdacyQa>{^xs0.e$JQo i܇}{WToK>>[o| `J"4_r)`~6*R5@X¾g#E( mD4nDM@!{2x1lMho puԻY|DѢ*i mhA1p%̗#Jnn]=h?3V!'w%h3bx$8cHeƤѳ(|cB-qZ+>k3du;M^DmfhDfݣ]-?]#'ŲRn5}9M1;{HLcISŔHT ׭ K0Thv}YZ";^aNHk e2?0[>H6[TLʈboD}` 6í~h]i m _FvFLrڌ{B}Ջ}.+1?מ֞&)U7=-0hN[B}A5+龣 3N2+MQ㧏1bN,ADMϲS\寢jX,.aei%*r+fSP ? 47BZzƒ|+9Ws$kZs皢ڇ8Pno\mk%.wDGƴUd~4;0!Uܘ&(KJLesɶo .Lqd5Mpr` I{'N3'ܒwft$:G5j7,sdf |}8i8dX$[\n Ѡ|~E0)l(ڌyhE IUgA2Xd 9a@ ɌKY=}7+s8}'+crbnB 0ΓH]m.iEa'pE-W 1H6bAGf'JsJч6h3;(~Mr FuzJtXEn"׊(Es2S$M+ФKh !/Ͼ` jE 'Ȩ_ {^Nc5r#ϑSf'MC՗ R؋Q$BV$CWt8UwNrlL>Ab {4OkI7cKQ+ "8RQHb 2~wYؘMI1,b>]ùl)7HVQ۸ %6۝aQyb<_D?*oAo(*F=#r,xiL1q*1v&?\*>6EZZ'#̧qQoξ٩C;v]&|ly-U 8&hl7Nyh[Df0+R endstream endobj 38 0 obj << /Length1 1945 /Length2 12390 /Length3 0 /Length 13585 /Filter /FlateDecode >> stream xڍP %8w+.łVwCNRwK>g;I~ϲw=K$*L@){ 3+?@\QʎDMa-E:9[ۃЋ;M\^e&.f`+`ggeމ afmPdكHN֖V.@gF`a jt63M\v'f@ AŁݝΙRnbP:܀tJ&v1#Q4[8 6:^*࿍6`46fw k_&ffv&`Ok%(K)0x0L M@&n& W7HL^357Ca^, 6]~'a4{'_mۻ~[` vtJUbeec@3+5<)`x~ y9.N@?f.S5bN}c~d:[`5E[KEGK/=^L&v.V++X'7#ʂ-|Sxig&.=AuހoG+Gkbg u]]^7Bu/T+ͭ]Vu3Dh,e4Wv1{ۃ k0P5`bce?]3}J_; J{$αsqLL<^^lik,`{W+=~Xd~F/7E`1XLE|׫JN;se1X@<^aſ7:X0~Ŗ\?|Y_y__Y_i_t /pW{5)HY:_Y9_Y9dmא:Q,.&||G_ 8:2qx⿾@œ'O-ULc)L^ NhWE0~nJ],=y4‡4}Vm~~|6݌co<@ICd[+]:ѕM+{GMoHܶN%Q^zkw4؝;HF&i罊WFgZG@{tnύh Xqd#"Wd 8[=i4ufT~QTﹰIiuIRI\PQ!&ѣ y8Tjw ȷ,w̆H@#NEe!E!4JVt9w/[!OL\tXVf7U\8&Tڦg"c3=jD[|]!Vjf^ZӋEi8(ĎϦkFևT MD&@)zϛJ-8XTRE["jiӶ^|ƩV_㉰Ch9XXevXk8@$GV sQ\ njq".)j '/KZ.UYwZ_AK3[oI ǥXr 2mzXI/-yԍxƆ`ޙwAVaFvH} pvةZrV4ѓ( YOT,F6NV:&kAGz%ᲖS- k#:^a?\m$˄")^L?*@c 蜴=,DpxGږ۸Q1Π@')O"3eͽemy 7 Aj_QɒN2|"g<Ի涸mJ^Kӏi`^s5K$a 8:9 Nυ{G8k|s8@ϯDOE,| L|ڱ

    _-0>̮64?Niz>i8w?4DLd,5r.#QNPXGR^88Qźs%;BCulyG NXr۹g{ oO>=eW>8_RNB5Bn݂I2,lњB4T^&Բ 5"r91Dܩ`Cgɠ:kO/~qaI+K<A̋=RkV*G eHC86$ё2WщAdY MmaSo ON.BM0L׿I#g˔"SQ&8+WvQ=m =CG$w{ B#ƩvbeQgw5b7ޓv7LLgARhQߣtȣb>)c?,R1^49{ ~UMIɸz0:ȐrӂKMat,V8l$m:y]܋~vA l/Umu:|w3!o ꤏ28p^ۤn]+}pp2J'L[BJ~`# dS">u½W$\[e5|AMI /XI D=* vn󂪤G$2#+X eBAOߔTEq![gguNTmq' |ֺ_td&/;,%R) Oˡ:&+f\_Q7ĥb;ry;ҠNPȹRv b%-H9-DD!#q7 qeIC7/ELJ |#GSƒ/jvXӀT@iګ(lCsA\틏)^-T跴jhm.R} 0Ҥ6Ie5G}Zǐ IFK0R/Rf~p; -A֟'?YvxX= 1^iu!Ǝچ3Dbty'6^oc6 ܗR\Nx̜[1jJb6C!h@vXjYv)Y!j漍>f*cۥv& H]FQ8TB\f4+G"C E߭©5?f6ҾPRKʍXpAؤ΀Egdipͽ^/4S&"/E[̫8 ?7'Y`1W8c|a簱cĨhe0?_#n,ۮ,>#h':bgg%D `48[KFpCc{==qH^|fݲ9e X5t<|@Qåޥ@6ύmRБVqNIٷG6NUl6D>ē_"]-dPt$uFi$05O P,>lANMF:GUԲ|jz6אsG8=idލ7Ͳs95ު o}z^ [1yu=0꺂J+{آwo*\/Pڈ/ T\ɷT vE.NY3\M$]2[ rOA6?B3B iլУX DY)(3A#; wGnSipHzF !VGU yOo5v4wt/ŖSK6c-4lܣB7 ]Wp8\`s}[t sntioa")[ r/eXQ4Tg^w1ƠVHo`E4&ێLL4uu\4S=ОIL(cH)H+`UmYUx^r]YF߲uk&r?2 s:%̱T4:L)$!diEX_bpL]Bl̒n\e9O_ce d) 4)34"N˧N0<:793=@J'1+~>ަ/aSG};E-QN8VӦk kA3.Af9ւQ8P{qiۄf<oٍB O'R@_"捻%sH$7jb\m(JĎ\ 9++C ٜY@ɕ4dČ7[Xzz6F蛪I倖_^o/cᕍQ :Wfzd"SuA|{Mi\P2S:AިGbT_ a3`k[ @}}! [e8[(Wx|+oWL`c;Jfg7 \ىjQ A 6%ԭ}s{NYrU_c?Vwl n&WTN5%ѿӣgs Lm].߉p[vi|Fҹ|t4 W(~?=  ``k <Y 3POK QRo\QkI\ED7O4z 3'hH^*Ģq!DhamEYN}Ki9m6쏠0[x)#)3n %~A?Ӹ~v2ɭY ,};kt+}yT&}L^>.fOtk [٫qy~^Nui{=fLy9{جi9ľKH#2Z"|+=V|xeٮP"߷.ߝLP7GM-Q4J)NԋCMCRNHC/Wq{hيlC8߬K"xg[ :mՖl 5ՎBuG6}6P}m4d~Y)M\E(S Nit{Je K{SA?v+a:=iʋWҽoY aKOYhrzBIywc ˛i,t.;4duv2]m,LB\0v+]w9}xLl_!璂sgSLyxwz)zYHm4 x{f,\n1b./dMVILobdjt kSGBYER+86F*Ts|]D+ DR6S2:qEju!2ݷ0RDM.Nld4.w@URc<|BR-un L϶ê &wb y{7}#N`^{}=,A_E[gcTF)ȀHyP09S1)JNE(U0+֠>J@hS& eoiF(q(~TR;8~c+}t4G)uP)iwdU[KKx쫖fuM0H꜏D\kaqCL7Mۋ~u郴XuMu[2O堖i5(mO; LNki_*x_zsY ֕Gjn ES&d62fMy.KI;%H)ڢŴZp`ȹgaP29:8_ԨQH C>7RRP6d+Ĩ`ك{͒(-C q SKjz]V5*ŏ4L>s̡ZŕљHZҥ$S[n8%/=/Bmx^ȓNNCh ?]D%| 5"=/R}U3TX$#"Z`BT`"#7!Y]6c M,JfVPk,UJ𓄮&E1c:^ͪR%w*| !jJ{Z #fCj]Z8 ۟)ˏV]N,z< #ƨ%_tj tΉ(Yibf@*jl=xJ:GXRNQ}O~\tXҕzTGhTPC0M^4Z8K2X.';_=L5޲FNī,u6[v@,Q?q ?ɰ(ܓ:T[q N)n ~"nfp}'>A Pa yJ5*)AON~@w0{R%eT$mOiE'}l>wƄHj᰷(Kh" wlm ӊ#\bJѮڅc- S0۝?nĨΰ{҃rU>(a΄SWV3 Rf$eiulA_q[4oRsGDI?3(swK`8)]g"kw6͘ uX}?f#@19a!5$S] S}LX/m*׫\C)n4#a.JEiop2:&&ȥAB&5Q hLNjo*2ᔈ۷T]RfTxkrlogTx\Ji8]lD*~vڷ-\ qq˵zbUaHKʓ扏ʧBOV:":tC JJ] J;q"A4.$|l|guХ$n:M֦"DuZYQNuFfRVE<]~ ڽQAz: |c~/GwtFly#[o Oa9 2\dyHC*}d'bk!m AS> 749w\H{[*ۗIuO:r~?|Nw>^L+x%ٶ4 0k/)1doIK` Մm?diHyLT˛*ϊYZί;6wMM~7W &x[w ihmɤ ۬9gĒ]w?( yE*Uxkw7|jU_FN879MW{*:̉Ҩ1@"4zVW*6@ظzjCT')sF۵7凈`2l,wINg^7ukv߆H~8!4??P^U؍v|PCO=@l;)L+F ͐_,}Y[ ]DJ:=[LI(d?Hba} jZw "_/,Z=8c_!x9ƱevQ>GlOZQѨƱ<*zoܝϦZ=ݒn;±qt*VbI t$bR=M"am1 T +Hc1g"GZqcueߚ'AE9b0T^jE+'] Ž*kh# <ĞaaTōqitk n@l{s0Bvî("ᝥz67Eq֥t-Ձua^Z| ~(kcu'1QeJ@1`ػ-S_Z*6S01է#*1> $`fqaCkf S̾|xPSв%?Sɫd{0*ZDҹ7˞VMaeȚ\>2W=J:κwU &PR{۝?T6X`*Z_k]#@O dL9HlL rY]X>~&2k֌MlO2FwB𫖚>a6v'E?fCV\RZEӈTӢL9qCӜU |.᫩dVXQx.˥ia:iCS'SI&S+8EeogQua|-^8?y+Kt.(*8|jCCja;7TY 8g*C9q}Z+-&+m_Fp7 X}0woS߱:z2%'C|aM%Fo4W$]#[7O.E,XH피T "-tS*.Lkp͓9}*96'ƠƵK@{Z O_ƦA9y l1zǻV9 ]xuSO2lj?ʠAB~ B E(DICta`RNf(Xkd.m1-9;|5QvNNԎ%z0}hfO(3NӐ(o=XM7<JwA{[grBy{5VADzI=oo tHcѯw ͳ5Z\wd,>L9)eU;V|+z=zևb `rFHpqVI.&eB\mFi*,A#;hCqUF!kV7mǻu&ߢC'Cp]ӉX`y7ڡTb(%+AТ@6fɡM:"-qB_ЛF%8QX9KB,H-aq84i(JK(# /a›FYkMQsl+k-EEn"}|%O]?A<Z 1:j,dzІE32K ( $,|GXcttFU";{'aߒ,aR-ܒ Fh gg#GH|gK)ڔhLh{Z%ck1ᏡO6_z&k\V}fX0Dz'xݮ@RI@5Gk\T|FH\A#5Bw\9[;=1N'AU7Ϟ8$+uc99%Ug ( *vƝ.aRf,2;A6|)-0GƊ(ͩ_/8 12hpӫ5?gFcQ^T88}&}R#c9}..2Jsz3w50UED̼͂g߅L)" jLjiy\WZCM)] G:ۖ]Ų ƅ<~euTsُ' n17C^en 51I,nr4!#14xV)cq9 Ae܍U 64ʺt$b|2gk L;7v1ӂZ8Bm쮪]ˍ[0T 92sx'].fAw|!mNF>.Iᵊo\JW\):Qp7`տ{+Y2Xb>9H=fTM^nIG 'oi"%')6[|qsä7{ .VIlrXzȐeÌTjA9 4K(-'Mvw<l3{FoH  <80dJ%=)/n<"$ac歝O|6^CEdQ6 O`1הYŘ$ '~t9&H1ܮyћI <ӀrĞpI&:}?c3)CǣmaIņD%M&2AJ+$`BF>.=s`.oͬ_|^B [Ȃk<#EnٴcCaVK-Ȟ~f&WE&MS{WuBOqҎfrՌK`H:څXxRu" 'z'|spE Ire9@#eǦ!1 ??xF3cƾ;u{t=0 H'?7k+(49qyΓ_3j 9XȓUwI>?4b iEH6\W+y%G2pVBxXvM2:/p0h&nW)N6);ޟ_aCX<*hdɷDYxt,-Tf7m#ƒ,SN&j._IA'NOǧMJ Lً #z !?GUWT7bkrla[և6b:KPnxc> stream xڍuT6RiPFni`ݝ" H B7Dy!HO07!s$'gcsc22@; uY )ӌCr@phxvP,Sg>㖏Fx8~d t'~T TF*'(& HKd. s9* Q@pZ /p\y0%-_)7_H嗛pC\.>pTda‰ߡR6BpPA:(.("mG`4p uMW@P7.KX|8Aqo na\pW E~OTBA!>aDq,oR8@{sbb@!\p>C=h~/p(`f wztT%-1IV]Xg~WUoMg<i O~ZT;ms߆c)"&s?[x%<_ XP$.EyM!r TRsTxoO8,`R&/&kS{l#!w,Fues#3 ܒx.KC]YRסP޻uWLh>;WB+R+[)3}<ͦ,HJ n H_p.1[FDjc,hg! Bq)RÑ -UfZhSm ԟ]^H;p| 6Qq gUHmOS3i+qw8йߓnJf\f^xi:(A䈾#ArQ ~KK$?}:O_-G $Zh-Ykc"]0CnJb|^+!?29|NB7;mmk.{úK.td0 kY"|mIQܡ %'-ZS6l\X(=ibJ8)?,ޯ{&Ɨb ڞu3d]+_!)!ʉ/٭r;-uWURsOr?Dy7sqjQmڇN &VDՆьK9qЎB f{.^Q`[y(+$oESt)||`q/WR[im~rmz0l=qYx)uܡ+-ꖒ #K!b_-s |QbJ#kL؋ K;`5NLe9QDWj!IX(R!O*lnkT<%"Pڕ}g71R @o5<`]G8dBdAKemWmףa7{K%nH_N=Z;P88.:񔊣{o"wGNk,': W.W6#Lɬ,Q<3 woKr9f%t0L%d]fo;9yx.[my)hswt74_cl ? Mzͬ𶰂n529:Dܗ2AUts*NPq,ܰNy8!zcvR'RO+oR~|5& %P^ޚ<$K3}`LqIƦ}9ʧ#KpeHV*h")IE1O+"W˶8[zYo&l#sQ 1onVȂ 5Lix Ejk6YyKXg" |Ӹh|bD 5K$WX|֗L`,Pnj~GlY_NJM_sS269YU2~Q>ڤbvd/%-B6n~"F84~gnxg+9zvђ*/ˌ#iB/;z3jL"7e1Jgb&ɍT}8_hǦ;,"{OW?imo x*>ENF$g~>P 5=X-z9+ cW>Muuљ0>&R ꔣz'6W>tdWzxĤRcY*fvZ+ptTO⬫QK~,_VMp©#%yrl=x&fÀtj׋ƫWӟ6kf:<̮yHKMFq3OEN}p'1F_H>,>4D)Kn/.OŪPMBnTڣ|FG#B'ⴇ'VM~L*a8;P.Vئl1yX`1?YntNOޡ bJIŹ.Usakk]iyB$8\[lh00w`}(p-v-xu!*#{ . ޲ΫZMOKchG8[& CShC qࣟ~R'="]HJRs?})na[PNʜ}Z١ F/FԖ:ߜ0'p}n2R aZ!У0b4(K;)"4 {C2@Ur[:D,/9y:x_FZ⯎c Y"׃t 9%V#"['M6ueAdq|0҅d1J5?D%gQ٣-ضM8$|8ފSmBLL\[޲$3o֊%~ [O7ëƇlC=U4cTZg>6_܎c} r&Uq(}4teF} г D`McmA@ZmZLd`/Lo:8ҖM$]vc"?ߋygye%x垡6#/{ Ir_vb,+OX@y|pvөgBo@B%xATw{+xDخ[ V~ޏ@JL:8}- fy|?cQL(9]sPgSMb4 ű{d\#>|;UY -¯uO;BCvKRJ-"N*UADZ<9@N̔Jp'5C5[f"~]I` =+c:yc=t9ߛaSuDEy#QB SƘz TJ@R!G/[zzeJj!es*[j1Xo-)2Gdh-vDzLޔw̫뮍/:gh?Gw|K$p0oN*y_}{<+TJܮ!p WW~FXLUϙ#iw I}+)2JlMLUR+2*q<#SK˯'ķ(VrfZ=`Jt0щA%QeF8F Ava>#_UNb )UOq1& 9|-P5vrk"l'n8cҐpQm}AFrI$r6ۂgh߱*r-*^o>q!#L%׮*jOw4&Y:_!Q4s:`<@;4;GܩΕ܊"UpqK@BOdw.)n^6Șq(QЀFM+4*ɆE⻗q@%#/JSWwyc⽆KXhI& v$5%x=G/\żd&[wU:ljd^jШomNJYı, mƇS5!Cx"?GZg g}4ѿZP@2q$YX(Jl/aGiҴ*!W`L?r͉ٞt{z-͟:̷,dˢ*AgHZ" ?`~}U'T2O#BuR<jٕP =3YJ5wo3Kİ,iIBlw!7^Dp],t endstream endobj 42 0 obj << /Length1 1428 /Length2 7028 /Length3 0 /Length 7994 /Filter /FlateDecode >> stream xڍtT>%tɐ ݝ* C3tJHHJI4HH J)]{}k{?{qWaUEQJ:BAAAAac ꆄ!RPrP>e4ݝB"RBRaAAɿ7)24p(C G{ $%n00η ' Q[r===@H?BP7(2@ CM`lC0Bآ;( &(((!,^`{.A_[.- ?zGy@(7wi  00 ` ] ˾7~ZY* ;y**|(+ oo>gwQQnHE&GƆ[=C #)?w;aNzvGΆvB 55:P((nu~OHT@P/? Ba(_Z2n{8P}ݹoAo'}U` @ B z8(GnS7_+)r6ou D6v;qߏN#ҡա-g D᙭{+<ɋQsb[ќFj/-FffoB|.MbGh-שM52]\D#1t"D U mȃ#?nL;W[Ic"v:ؒ{yAz 0֩Bw;%) rHM:Scm@`-VЮQo'Si2k//VҼEg |DĸJ:KK(eU gUǿV &ӮO2F&gNS~Ƅ[e:|rz<2o"U'KlwtgHMC:tl6}HnUuAγBf1O" :@Dڬ. L{Etvc'34Bs0ۉU˛H:˪ﰛ=ԛ;&UCф9V`o}#kw.GkWtx'jXbym:k/'vPV~{>z?E{@^u ռ]Ul:E6JW՘'=͙dbc;]iYmdŤVe!|>9ek u= /Ƿ76f(} IYW%l7^!M>vx,D}qg}Y ?8*g:~w]o@-Y+XYR}Y4\re8ם98t y" ^8f}dY>aZfv? <{#cqű5sנYokVق*Liݶ%"rasYmJQ7nw\\^Gd}ilTS`YX'Nei3(gNfcL5Aai+3eN34ɝ[w_=MS+ڏ,j$3ac=?_u@LW,>KIc4{E.|dmb+@Wg+iɠm(CW!f}iyfN}*}18y 276c40|8Cm=4oë-mt6$2!Y[FbK9iovY ;iBdލY/)Nz}3ied*NpΝOu2.g<Q\GsTOe$>C>CAva 4RCsX8x 9l%fC&8R׹ Sb!Fh5L(?-;x,k(BO}p~$n[Y'Ҡg$h:Y)G[V\_iFq쒩p\HiT 7î g<8yB_InXd&<5T]LGR~תv[mp{3ge=dO 9 ? >nKWб̲2&_ek:K7;}1x=a,O6,@E >^o)޳e-]!0NVQ kP U'#%Kג :S{> P{猪U"^j ?C+)B‘IlGE'9y0찴i~XDqӓ -1cظTpMGˮ 7cuq$9 ݄V./+)(EpZe6Wn ߄ k(v}Ik.X Owm./$|"\OnPF`vLHt,'cZLxbiƜ]>g%xݴx\axgR;7b_ږ QSC?f>9GNVv|3 ĸF'#ܠPR`%񖔓V@l T|1@!/<oꈔufBݘ]\3`I^~nj圬k`[ ?]) gMtTHXGxphly-}i|aY1pne]݂XnN,{lUFbyz}@ 'NU%<-6h<^b),H0QlÆgh5l}ZG anܡߔjLQO|D)!`FX[תma+L%ֱWmKㆈn+@סqwƵ1Ej%mx SpJq4kܝ .l"e-r4>aLEFQ3Q0{ysJ.'މmCF؊K 2Oι갉8 ]5*᧌q-y9?KzPuiИM?ymcA孻zov({`ܚv!DsCf5Aa܂.YbQ:lk!58DQw|3[O8NOqvK\;DiR=^u!Z as8Lw'w MfȼQr%69Ed>3-Gk~@k+f WM9v$ 1{֥MJ08 %^"~WO쩃ԯ ;}.eּMP#k&ac"yhXe~TƶEdw!(4UߧRwSuḎd'G>GhrkSD` lʀ&4܌&rHiS~(y+QGDb[TW}j.oFQ6C5&2i")x2/'Ir Ng5쮅Q7Ĝ#)& S2,ƳmcȞrU[ʪbN2f6([%"k.& h\I4L{/cQt8|Ƥgޱ/Kh"i:1&Ý5&u/(q(eM$l055HߋOyTEzUR[¾t($[$%kemDƃJ,̬0)8FV#L3;ո/7GȮJ`QRx *6+<2W6E*?8 q?8;fm0b҉Pa"z4fux %kz|ᳳ\0^3yc@Ž[>}|sh=rq"8IPFaE'j;1ʝXh.93/ G"W㛥ol9T[CgYY*hiwP( <Wkg@H,jy_]u41vwR.ܹ`y8GS{V,Aƺ8@u |xM&N^PBY_cVRt\Sj8vUMF!B,4}g4#ٴ6A+/=+' E5N z "%P}ʫ3FZS=wtu8ݱv2f6,)\g~>3 l˳Sc4mq7M?"њN[0lXSk7p|+)G^̳ "z%J6#l~O*_T1`O֢ ȯV䓷գV7 ^?V?Η% ,./t3UG8|9;sFI> stream xڍT.,(!)!Hݍt  1CK HHw4HwtHHHw gs{׬5=RbYeaPV  @JE[FK qET_ Rp#'m]@.W'[HA,*lEF+sCm\`1|,$p P1w;`IОqi}j"|Z'+Г7|U1Ÿf ~k11 [R-g "lIΗd~Iޚk@MrfMn|ڥ? Őcqᙉ*m&k-c RzpQQwݠȽjͲ92" 3< JjZX\yq BG㏱r#OL.NJ^(Tܰol6x\ٕNCfȮtz9ufd$xтTU tq,XW^I)L5"7!h6Rt@1žzԴKLTOryb:o2D*9ŷjqmװ2od5fq-ߐ"ehWN-T=+=$+U3}'VV06\eV#V59GN߶Xv`ńE**#Z O=пmӚ^}dJ;y쪁 y}G-}haքuz}xI(&E*ń]bSz[L6=U!i0ӳQ@C\fTm;* 9REw~:$'DUuvkĔy>q'=_{G+]|߀7e=:5&5h&HpQofOҥ2謗Φ#4-*uXvtXQ-K$"|Da'_?$/h?,n*S!9X3s G rr}?T)i-#v3yPq&xQG_i2L! CI!d#1.34{< k1&krKnʏ}Qwqfwe?Ҕx?`nQk*7,;g('E}ZsjB ~!Qna\o|'sU\eui/i3ms W>'b2,.*`^7sJ?tzl9shB}HkVLwDcQ= >1̪ڙWʵ(%9M~v]ἷp2*0EwAfJs T+OcHѴ"%met!t|>=`Nۡ^/t)rũ>BP09-C/$,oo4ld&`WC[pp1>[^/f`K͛KCQ+F1Jmsȣ1db]1' v==RQ?W[Lu(n:T{Q*ಂ0pa,/ӕjr;H^TBJ-S`g"ж88My..@dR,]BIBӆzo)n2fGJ jCӲ\d zMf EZ#IY7z{ݧ>uY΋. bp uK^>/2/i˔/a E;VLӴ9dM}7wnFxv"Y^W}2qZψICh-u=&o9P9gKTh$i]#|k{뺱U <0_d^K/6V,P}m>Z3VO\&_q݁ϹO+uX-kw1,-1Dc 2\ a:J0X R5%ST(='1m%{u.}*cyh*bٳ5i__4 I\m Y: Q:;FT.԰~.1l̥QۧܶF+P'㦂|v$Ū@W 䭁b 5vVzp_D4EBSX~bR:z84B;j[%zxoϓ@25HGP&RE5= !E)090{2[LrN}5z@aBK&S6ST;b,j.\Lθh!ߺ! KTcևBJUԵwtR 6L z *eed5LMqΓ lܺOa#|?$X>=Tc1JȖ{GRbag<ا֫KJ*K`pV33Lw&}Vdajd]|%3zZ'oֳ.ner;TXut54s;v%>WיTA-]6 +V[oX{4j!u\ |O[u: q54d[Q$) 1/)\>ctwH;vNʘ%zb47Xs|ZSK,8p{(Aud #@̊ F KphAn>6vr_ RmJ_j%_sSFNn&m)D"XvIסͬYLa96Ʌ0Զϣ[G/v5l?]w W/D_j :CMNä_}x+1I~װ́SL.mOAg[?irw  8)loQR2)p)K)N2JDՏE$<+)*9HŨ|;|o^i'e{ەulUG/]jU8~lA>xsċp,48GTo=t3/R? `t&SNhE"z)BӰx dzwbd 2MM tč4&=)|RkVL$#ҋn֞ZyxDE8"m@ӡn ^}?K>B)dGz'=ef\8Gw_Kąl7Rf+xOg'R'ݨQ-,)^_"ʕ7TfFhyN}1*E OԂ3b:Kz|s[/A=xto]p5]wmLJ.pBAkë׷f#KϜC\Gv_~֣;4~ZvȎNn?(kxV%; nrsKP]$}vđOD7G#qg[޹OP̓^x B+GS*gN$R`Zz 4w{`QZ\J8Q3F 4#s#7|S*nϞ=~A]2]ƊΆ6XɱkP h.1V,QDYV윍X 6m dJ1m_)XuguA|S"gQ9CNC^IL5%X C%LxHFi[pUTz1ȓ+o%k):뫪<|Ay9[՞g_ҠWgk I뤾{Qk>d^H|x]{&drBn7m{0kJdn8ӀW|z;u/;p^ۗcܚ(k{SVs&BlR%_Ylr4,!s8',V& <6HDEܱcD`mو?cUr+HGTgeXh!9$K8z^]ݬ+%28 IOJdce_QgJ}5۔?~%qH (fM^IpW9gR)ʳP[HU~MC!hyRjl.12بm~tH:vontKkkʳ[{fO!.U%@T ^cG csm[3:p)yge')V\9tT׷vW-@7f\!=on ES9 $6K4jΤz`'l,/, չ1L4$pʂҺ/ślQǜ<:'F0&DQP8T}"{T[cZ;Qsg3GY0McYUիлymr4}:n JBU~wKv2=ä<{mpS=y{f<=֑R0!8H4booBs% aYZL c,\F*B/c$cj ߲gQc£܃U'%Xjz^߬!*$.5}pŽ2LY-Nşmd2# q Hxp"syvXM+,H;VT O5Wz ^AiO@ps;=i7d3b+oM+ɭ|5)ϴ$mmvd.ѦHa^؜GK1 !. ot!{#cfw=L˸kB#wSq^·=, +k_|M=V(˰(7i\*d'%GeCQ4i23ޯ}IE\F PZHc=X ڌeW߽ifo!Ȅ%$+EBa0iDϻDƗl{O#M<?h RȽ;9Zo,Q{<\TU]@LSH -V𩥏:4|WmS}mDk'"'uh(lmQS\ ʽ`lo'y_-G  N-qŬ zHLpCBcУmBXµuZf9d 0"(n+O {9)Z4F8aIL'eK5;hخBX*cXhZNf:7jɸ^SX՗)g"/j ?zϚK `YSW< AzuGB)wV¬֓Uͪ/A`c\/25Y n V sUd>SUp13K/wEw &-fS-D;8z#k_s_$ Ys!: 2qzZZ"]Ԗn-2Ktad ,Ŝ*LOD#>O&+ߒF/!|BYH&1g[Z'gX7gɌ8"d*+N WDLtӯUf/%>oIX" n%nV`<[='*sOmD٬ eXh5>mߨO#C$aO\9n6[;MW$hJk0L5蜲,ST=阮pZb4r:MzLn@ ӅJRm?ߗ&n@)ss&jK /1~IJ$RNpHBd^ٛ HTOpdj2ٴX%BDikF0!VynT8+Ie̘* Ofsu72js8H(ȿoo%-]8]Z 3.ƙnj٫rI7GŮbrCЉ#WCQ--@m7>)?riv|E\+gT[^s4$`Pa#Ҥ\}j 7%=ȜZ`Ӱg> s9r۩0#1e7lC њ94|4i94M2I>/փlݔ/3r+Ajwf\#y S(E%iyys)<jY@S#AXoj@} g*8N/ǸX{ a@W"h'A-w k㺇vA]]K%{:ˀ'\>˹ᕾ"64#Z^G,,9woɫtCl_Fzb.=9 IM7;{cf11 ZbgzX >31)d[QPr]pqdR4I7<"kn@t\M9^YoFEe1y2><`/60%|~"KK$зJ{ &DB)C$Kѥ߾r?hE-2+f+APF\/4k2j=p&%SwԯVٲ#9`3v G[Ǧl- N+kv11rT\%WCpd*mn5 Dg^I2G+Eb~ʍ:9RPVhqF*SʾveT;?W펑 '8^Ly"ˣ.ȏ:>{3cOS/`k秎`^qEj)O'?_[5 ZT]|>Xcs"|ƈX!3Sk>5܁FK s =w<%Uz ~R?; R!,Q/]& 㓜XN_.&`@4 E>)AaRTf.4,m&Ҿ>bc"͵td_?-O,|Rb.B`h,5/# T/lh26g5 ~ɊEt7U<?߳ꉲ`JyQ~ɧ`_~**sNɰ?n~c^fb2M)ED=0|S-49 3ƭ?|{DZf/^asV|^w$!5gc4;*pٵo1qwUlL$?x;p3pv 3Рo9~Sq0]jҷRQ@Zw'M](.~>qӊ/r,P0# OQwj}*V,IRm:/Q%A¸hU׫|B׻> +^fA+nS2={2]|n8=$JFD MξTIB3UэcE 9e&? UIHm|i[Dw4& ǤA5P t4B:!׳Lݴ(5ߎ>ү,do뚞BW{7DDF6*|(33Mb=g8niab *<in4r1Uzg#\IM!JdV6R Ĝ;sPS Om}MCw9hR.K~L!"~kмҞIh6H 7+ҝcVvXdm{-V1Ot 1FGg![.~HKmE_DchՐ3TAhOR+KɺVK3(ʿjŰFhhrT ӽYڗ 4h<A5rE9d]"k%m_ŸiLv;\t>ujRjč% 'u0DNmƧKJۼi_~p}̗{\Ch,gCg䵣WðP+iI "VnAUyk\Db2&U3ܬot3B=p$8};fU&JH4"zӫ,*D;^Fxؠbivpq}$k筞>!Kc5U8לG!A-7kTᰈ9ܖz7^TVbi{`r˽_#y燼(jQ-O.P̏ʚ'H u M ,6Xb )M4GhY_L^"_?קķ&V (-TJVjq i ߱3}y3h$ vH lB=BnCyYk\xdI<';O JG?Yw ;8>E$qv%I`? #- 9uʼnwxow״Ka$t9-E; O[sFOгV%$q|?[KBQQJ@9C"$~R L zoEk2|Wnܪ6Q ǩB x?@28|KܔJi0 '^BU("#+ȨlIJzecoVlȺOQQW\mizJU]{LJ"hXP[=|*G>jS'K T/ڀر}|֋_"٬v(j*C {:v`xp֑̳p{gPgN(AUW7GQE Kǔ/;GydQ1,R ;YRЗ):#!zQSOp{Ro !ߩ5:|9`j*ϖr~Bq3YLkl#OnX){1~od֞t rFė(* d0^VY_u7O>Maj]1N*G+/rziH<}8 2YyɤٍT=> stream xڍP\.w'XCp]ơq ܝ@Bpw  93s{U֮꽿/QbC- P'7vN @JE[ B׶usGNBe!=ɤݞ UNEw'7O_!C(L ma P'+:fkm?&Kf ? G bfq|hiЂZBܼ+ 4wtBablO[7&)T!Qml]ThAݻ7;A=|lViݝAl]! 9 f_\_ΧChmu{r<XAaK 忑z@ ^H2 @AAN/_)?ANO: y8?5_ɞ8_)_)S'RKwi51"OcB ^K9p]M* rO1iM fvlT؅D`҆ E{:d[;DV}h/]ts]?\yy| تS¸+b}ci>,)-;%* 4~#b"+A,G_UY2m.2:2RJsI_ɝ4Eyߢ˜@^jvC!Ce|؂k-(H-{S̙y{SVZSa@8etX3n3dhN(,}OLq%W`ULWm7~) vDeؙQl9s%JBW/^*~Wl=U ߾4-ɻ㽰fmۏB1xnԘKzN%ϫZ1+) M'&h8<Ɛų3{y9 ު1Bհ*|WN89ȝ Z8#Kbm~%[5u(prBm^{a[vz2ԟy[%H*|.\ˋ;k|ᰄϜ9v7<ҝ;φnSCi1u6gQMk, tྏfQt7o"pisO^MX _H]΀ӻ>劖eeJPӎ~c::3dİ6n% ˄f7/&?puȚhK}wUBbMsiyՑ*inYnTgob9y+(Z+Xer7B2@ɮk,%N''fwEqxvTwSP,⥽ͽ"+v[j5*&Fٚal--H$z-Xǖ?եlylt:%)3Aa2#cjBy6lFdZ@ո0rvkP~R%1u866z:󪪍νDKMͬRH&/$X%鶗^&}bebC {+$c%h煥"JٿC,f +r?i]_)6;Û41cJ-fDv̼PbQZb˖YUWeR~g*~ iOKw Z y&=#0nvژ wajk+:GB~4|2twٝk|1x1 `,rXfE*l޺(}>YV:PyNop@D+:U%N.s7eKr'/ŰŲ [\#лti#w }zN%vw BD@_|I_kij:_ ףs*0J}y2@f|l731^ jE9V`C@9K(xF 3M%q!1g`Ku`v*Q+^>U~@A5Cnc^f羯_PVRu3(\{|]:4!L{͇b)>w B#2DV*;a'_۱Z =ԆI95<|[a$ eJrf*yV͠d.m׻^iZo;N^Vr2w@O]7P4J(Vwl~ HUYg.")=^,5: n@)clD wjRřy]hQg 8CUq/[iae(#gheWfi@#Y Pzzy>+mBqr^X扸 H*"-# QE7Q Qm ݦ:?=]O5]1mZ>=񧬗.b&Wq~gG5<*nLeX!n'E-v@<]rņdݼ7ߗ[1ѝ֐-"V*Ɛ s9iąV6q^Pu7O^ZFiC }@FVlo0oޠy$AE[6}gulS`a+!Ǔ/6aqjin|c\U~>C:/,g{*1ƕ&Bq{d0*Is43N_^r&FP&fŶk4ji ZV47 |/sO^ O \z75JF@aXV et٫^khl7,)xUˆַny^|jzqES΀K)6-\}6u%J2xHY yWDOoʓ#&}كp>_ݠw{W;Hq!Iѫ6U`~`Zw}ѐ(n3wgD.YSp"uCi}l}Y F65/+VXPt!g'\UfuңK2~u( g tpv#_(*s fY|Ħ8jkl΁}vx{ȫ_4.ybFQh;+|{DԷ:]oסXv߲r=ן!u"eueJ3?Y87Ǜ %²"2B}ϯ29wr:?qYx19/YEiK{u }Ap_9򪻺 G}7iBC5K>Rrw$ փd2:k3T<_]f]a^- 7[if|5gu9SI,`i|gEwЫ-aa9-+nvdxͯrG|I\GΣKOI\P3QwU SLdh'j5`ݛWF|>V uэ3O<%\*'y/JBAB"2L;n'`,7fv(92 Q'[@Iy s0Faʇ7ĀF_}m kڼ1@i)cvYDɳ6zŒEL ]pDƙ~tu`BpML0ȩMڴT|U0oPӶsKlBVA^yU}ӯO~jpFW@Q2 `k8TFQՆL.HZ7pSHR{0bġ1JE? Y##%ݙA.Ekt*y>3|Kkp[IzgʶG%/a-^K6/GJRTѵ^ۙ G߄e+zʵ/Q?_ S}ܮh)q>! \ja_GmC ~vpJk[f !/"WkigEG䔎#XeX<pq1Ka]mXW&h kknYTI[ "x~q7HJBѴݱ[qrVnuQMC ]I&3P y| )Rsg~_rB᧊Lr&]=u+wMֿϐt近NjJ#jJ_|ל7}͸Ϊ:JP-iy(J>rbj.GFF0rub'_C'3:I*ۨyq%mj[sn?D5} ]ZCk2~$da؎&}+L/SΛ/N^w/PxBg,B8jG՟+WCj-{&>7v o$]~2 7A9?*ͨm߂p̄gN Ե%QX(ӝ˱>yf 3[&-=+#З8A&j~=]1TK|@{ Q ^e1mUQ#ۚCPS-nQ9dLSoPRA1fvSGj@Wn{y|] nݐш9 9D,ě@-.3ZKu+ͽ0XF[_GlJI}H9瘢%wӒB¼51a/䤫UN.@<3"_Q'CB<Հ^븕KVI͸`OYzڕU.,S U}-JY [NBM䞳֔I~m.xǥ78[Z7sP9oƶsѱ+va)E8*(2B1QCM%Gk^qfc}ӣbZ U[1NCEY[]1}_Dt׍9Ke7*s,J Uꅸp6"ح!s({wd.O`F575#Gny[9!bH.VjcP'}_o+ʄ3#lxKw#64i\Q~p6B vk!d&¡I`hS5Wb61XԩGe(t}uRh(&Sl3 ޥ4,&:,1z(pJTYm o-}y CȀ%xP3s ϘÙ(P:.3)}{h}8G B5E8&I=՟H)8 W \)qjR&y>eq kVcj9_ QqMa%ݞW\3}QtstЋ9R:o[L^Q98yoP2OQY;5DcڴwkS\Og@+ ׈;[Yt*9^kA.0$5Y@7XQ$5`=)}O_4 B&ݏ<\#~6v֝.1R2U )'X,o/,mѝYzFæjrV-^#=f#YJEda&Fc K9nr::$kw1*R+ '6f3@TBuGO{4G(G8bp _)R]Q 2-.9%)~c>1ĆT++a3 th TKbxSƄ4_Wa .7*6$vӃI{wwsaHx%<⸉Ԇ\Օ? Ϸ_@$$)~&\ i]{Ů{N6m2/^/`QЅZƒ$\g%~FG&aJ}'v|&:s/|v4:&vץ1d?;O4&n|sªPggSQ3l2ѡ? 49*솩28RNX+< b_ NΔũE7 .Hʖn 2i ֎J{TWN00Nq G&gJN&etfp!Q{Ih˓p(× 3{vxtR,dh&[k _^^9L3Boa(ab ?L/J[Me:.7պd˾ʞ2d\sw5@oKaЄ3(ʃzĭ?mt`\Mk>| [9qP& :=q{7(z&xK FT?Cs.>q%HPVڗ/”S;t鬁˗l2V/ibN6IYD󈌐 ;gͥ)9gwd9N^NNnj̒df~{zY a!.@` ,N (q~yCqz2,Ja1yR!)+KQv&~T3X0kz/BIF]إρJb.*ztr$`莻.q'3qWTwj"hvn{n o%$p*jPz1G\mFC 'XKbg¦=fX  AجzΏ$m[Ou_P7W.DHu%utF9|b|lswR)) ))bZCYGs-Y5J CwibM|DfuϘU{cT6q<$w.cf3 v#V= Ұ{@f endstream endobj 48 0 obj << /Length1 2814 /Length2 13522 /Length3 0 /Length 15104 /Filter /FlateDecode >> stream xڍT.LwK;)-)HJ/`N ii{֜=Kv 3ĕ%RzFځѿ9 BH9L]2iSWfB@!..7 Ҧ` @rArpr[YBϿ&sfPPP/w=ln Z'^:A^IQÃޅJ vh\@ 3@hY]tt0u;9pX/j  7?޿!9;;B+%PUpteB,~ڹ8@MMvfPd%4I"0*@,AW shٽ8-C,,'aȩ ;1ОdV Ws. 4^[ ` MAn ??Ѐ@`CОC ˿1`Ot?:^;'˩/#w$%<>|vnn/_PAM?%U7C) w' 韅a Iߐ <M(_BnvvԦ`; ] j@T",nUp5.2]d u_&@ہ! utm U@ee `l.n>> Ͽqp,~7)[7pJ>!z~BNS rO)x O\rQyBP.OE_E AhŇF4{BP3Ss[;S?;!mljY!G_<ZtM0@>ΧB@_';A'hO.Pn`?bV;Q.SDKJл*LmxbMf?u@Q|X4LУ!nfob?(AN'ИxD3,/J:ЧSd`?Htz7rudaGPB3|*4=g A@_BYBR>IΠ?ZW?1ܞz_M._?  347ouݛ9C{ } $nVQnn7VF6s(w?`U6j׸ Wֶ䒣 Q YȄ\cFLWc]tcnEocʊc}Ґ:uǴP&EARM6HfVs1fTޝp2[^N8 rhe7|,7|,8]CmGw}?Ȥٱ8qm %f*~冇/xN\0.8L|rĸT>+׌b/'nDnױ0 o t\\0(᧚3H|*7 [m2hau1LwB#MqǘEhc;D0CXO铓A|<@W3f5w|'O1fu-fW`gCxL4\?T ] xMbx98ؗJGљ;(i:cd>Pu$x ,;= 854!bkH&08 u[[~ЖKKs7o&'xF8m qL -d=>?6G_ ᗿ–;?c(| \Ro9|s~\A*1hW@*95N xĞ7N KqY |`;{2f?o)nY}dЃ/j |MJ@*wPFjjІ'PAYURwR$ 8ʉw[FJ)>)gEL0L‡ZTf@=MęB& ,UL/.k0$d_0(f0UCCcH Nsu7eOܮtw7zՀ3F R:l 4lTe^#5o}ȘJѦY/Mn2 zΒ,4ȵ7FBKs](6"qMWRh!/='͸΍F\n˂<ǟW}h&DGw} F (aiƦ9[̹Jp(<TKd[1t&cSI2-NLCg"|K 4w82HzSK4cz[ nxv?{LeFN{NwD'=IC%"R1Wz<ɆD@4=` Ό'e(Cȼ#V2oػB2ͥѪ@t]Db7S f`M5YPaA|_92{_˃K bxw͍<. .kE};yYu//̬7״и.~/(/)jLdbg NfbYU3˲}bcex-C_K;0a3q`:JoqQᑻ^NL~SåH2Lh&(d(M~eJrʜ̵2[0 dx/"&HTgAoE[in:G\4A+7RqtYVQ E=~CmkŶwy;1Ftw唁β8mu.BΦ"džOob(> Q0EALBc͵\={&7F{ܢ?)lUf_WS0/9#9*J޿-:L.FpwJՇrUjA6..& $խv&W,WzZlbtPݾwq9v2xl=5LXn2 SY5櫉O)ZDY} C#g<u/}_"?)/ǯvP2JkU~9w`bWyH w( ǩXC.)<'3]www=QR 21 6 " N/py~Lke<1ݨ!P/kި~#VHEHEg Ӎ 1Ꝯu(eĨwY.0TTmۣMAU?8 c!G-0c*btwNile 3wZ7g-+cKJfL $| 8 Ř8cx`ũǣ>SNio '- o+{0xލ"c'w娦%G#f]KzL\PIV*0ŻW:crO¶A<#Χ))!s%gǐRqGX{(FwtD?s]N|pIgp߀K5@gͶ)O0t>tɳyNs?%X UEU(z"Nܾ ~x{@z E%pL&|Orb4Y] Uv)U`e<@YWlͳ:cOveKFկnf76ie]Qyw[k`:{7&wDSܨlJg~NnUE[ #8Kvo{%E+=w:58ߒ\Sxa+p;C*D4w?X@6y3IrEX: d @j|o!oE:Y|qsVN0#MM_{k)%$h#MBn{gBީ ÓUN13*`.D$Yƪ|Ap>bǂ麧ژ6[x22I r đ/8V#Oq@J(Aaig["\ǙHϥϹkUKwEoֈ:=1+p ީV9o[附Ѕ%ݩ#5D1' #Q 1I߃v6?pȒ ̫Ymiu9.(]OIw,CY8e5澰@$eaеcxmdv x<,v@R, 4G\0Ӆ"_iiඩa+ e7Kx=v쫿>xP2l 'ռ25iwɵQ8gMKZQ.t.4aC]7AYtJ8!V>_Ca_iAVΧ.5Tך$d p) <~iiLaIuwԹ`tcSscvnE~=S{EХKbT4kr69$YFw.w6(})mz- QSX|WQ)9~"b6hW} sSS? D/Dl0!{_TV4!_1;o\*6Fthr*X4#!9>W$P-ZZ9"p*]*Y 3f!V?]oDrLv/VUj |{ {Ȳlp4}sbRDPe^v,PejR(\Ԅv[+w4>wTtGڻ"-UN3cZAWƴ "{J~QuBAӾfNHܠcJV(/#/'3z E{LV8JP j:2 Vj]~,o/¥F -_3O.3r>{IF3rQ] G;׹c87r?T(Iom3)lNpPrALV0cUpxfr~SYd򘬛gBz$B2F.غ#.fO& 8g:A$v\!^f\Jf".oy<9^Bt4l*qRc`Vu2j0E${}r({ew'*&:6eGjĎ&;L$9Jb6G@P=y?@b1cm_z#,sWbcE~uUԿ@~|>oMZd[}(q% .-mk|#,g;W:4 zϑTOh/YL@+Ty|i=ȶ<+65i#)R1R^v(xki j[ʇ,|r8cVݑKJ:2P7Y9zSkK6y}/e;SΨap# 'O&v`?>~D)SsykaU7-nmS"L0~XB y/|+E)ߍQBӄ֖cP@LCЮ'epZ&tvC'\HЂ4 Dvw>#Vpcp&sqCjCCk+S7f "Zzzo#蛥0iv*>5HO #97aߎYp|/b9  W bq"`cFl.Q[乕J L _۶"qAA 5w18hbQ`Kl0NiBP`݉)H+RIOEuM]ruASIHDF'S].9 Y;u:ԍ)fze]cnXg~nZ_1^ 5U1~e䊪A/y:z0Ik[P/\^[:W75~oj= u";fiV' {Վ YAo_M22dWdAV-DxR`{DŽr-ָtߙ)1_hc"W]*"W7 ^옣k3I6y|K9+%W*ߵo9[7/,ݮGXFyë~0 Gc{M'M-`R00<~fk{K4HSh$RJHSo6B~V h| Yq i ' 3Ig:`;ɔ j@ R.4+TGOE;RYnH9f\ .4![f,=]RnCg:;vRiBeL*/45Xn]%G`mߺZL$K5hU;n"K- ژ^ wJW>Ηڴaܿ(?$bAx?% ӣ5l8:V|n)p0rcdz8ZJ*^p9p gFF VԎ6j(Lp{|29g]}V`V)c0$~e/ͼg@|R`߱ !m!0< #rvDVNաN`}^+47j^\_+uӊ$lQi/0خa?'˴<]>&16 $}oz(tusN^lOCbc]=ziA~Ѱ'W~ܐ)a>)3+be~Ufsd( hv?E*}dbٳ33: OԶ@fsKM-ΰ Zä9RaW5S jŪo#7l&1Nf:q<ِ!^z\'# !9MrUt.>ML ) lHa*U7Lyju,^H>YQc݊VMq*" )"<+۸:1Juss.˂Ol1v1S1dPs/Sv& d>WXt] m {}%{#ּ+ɫgh4 3^[ID˴;]b}ɬ.d;x_Uil ɉ$}[!MH]{U}}Fs/ebK|˜p50^pʺ.Q'scMSOS+-3~ܘJ -!,1@PIaGva6گ֢Ʃ9)WyYUnynT/UbT"^h"{BkM~%Gde]@x.vzJY0HQCڑ%sʱ n5Pu`5bo2M?^q;1 mDrF]@`*|QXOWE,s&/ucAW:Ajj\]pIE;ʁ ? y&4Î DM`ǫ??(TU)i]-H< }'Vd:O:X23 Wn[ɣo1Fw} Z7}:5/Vc* Ph}W:4w­zb S`k" imZz?'5t PQlژi+Stqهm| ZK*ly1s)̯Ia/KY(}׋SLYf4( Ѿ=[1J/"hB1!ץ{tP7m{q]$gz^u;fTO,}R aȭ?D6aL'צ3,>k]F+xxGnt k#džpFLn5Fsdشhi7L 璁%)rxKZkb;B,Yo8ލxpù@qrA6B?zo$z< C/ų\M=tr+?&11*ߟݐG OYQ_~#3@ZfBpNSӱV|ʼ9婒Սs<6U/O4B[cd}AZn5Z_qD׹osZ4`.h*FЕOK9`g,}_5_(qm"J7qsƂOiz#E1S?"NM{ B#Tdl#~"1[qɔzD5U R ͕W!zE$_KZ.8KnT(z5u ֵcYLoWO~Ѯx\ҊYaV* iMԝ}Щ:v ~绋Eq3R- 8nN~5 R4=)F@-MyzH@(gVJ&ȓrB,VZ#My*L`\ukeը O.pajhZ"BAR{su'TXUK405||fy cVg>6@fEwӣD_fRb]^S%zXT[|;1,7E`ycO@|`yWZFF$I^aH$F[d1#K fԀ[]ݾP&`V[6,'TE 2&G@A6&a:C !5Eؗ.kWEGֱO/da ۪ ֮^aq(r/ҧ;6w!@9t SC_Q\Y;S®4+Tv~[<`dϹoٮޅ>xfA0jlkm!j%ԑ;0A7Uy˜A>.@Kl+VDs@|}\6/'rsg_ .!ݪ8}tm(ItBMD'ߜt*)d7*XP|ͶHR6G2h]!ׄE RW6i88(Ej#d/y W9x :RHdH\?ѪYQ\=ΏOwE`e6j~Ky ns4RЇCp(p?>-"bDKLV#B*1윸)[kT0Tyg3b|0cX6rd֙F٢{d[wҜ9kj[bSW:ƫ5ˢ0E d/ls#nz\%n-p?(SϠCX@<6F0O.%*?PaDq%fͶ}A=>ظ~旤lS1.z$^(8% zNĴSЯYj^+w^ _[̂a`90R -p&\\zU4hp4Xqt2m㧞%~)WK9gIjhHS$UFﰾɏK]l EMP#w'gep$s="}F:n37bܣ(J%$Fi8Ɓ'CN5O\e1VԓjnY}Yje}f9*dV4əR_|M.!\([hs,drz ]Mp)rźE%?xփ( /ݎ4e=f3fi_j22d .)W,LiC?,ȹ} e GLl8;#eaKV)vr7)ݗ$&Fjtځa554!/_9tb>{weԳ ftS6\u=IeZ]ᆬ?dzŜY.i7BO;cɧ:+7$D<:4!Rg6qc9Kjƭ/yI J8p&ah -cijt tOzBI8%(%N)fYBNa~2JL0c;<<5eS|k/~,hswꕤjwOG AE"m\nWhbN˞m-%qdWqjb3%a QA O͝ W?ҿb: m mJg0byz'Y۬E2yIx3N(oy…-[PM4p0V%G;cw{,L޷󕲈9L!)-1zHì-`=LWk0+b8%Q&{Y/Z5HS:<ʬOj+x!=XC* /t4IGonqIhAo[-C;(uYU`ҌF~i8]ZR=4gmx'Q2NHx!+]्쒓Z@H(xlg~ _R}Lm/ΎcB눵7뤪#n٘l2wcp)нm`c21g %?+@4Y[L;:΢[YmZb:WȡSJ #V[5^c[p6'Z endstream endobj 50 0 obj << /Length1 1587 /Length2 7827 /Length3 0 /Length 8864 /Filter /FlateDecode >> stream xڍT6L1HtHi0`lNA[RFJDi }_=;gusu?L =^Y[5D @ K5B|0򧙀C"$ nm `m&PsbA~~PC" nHgoWu毿NtfF4({mG0AP)!eB9K|`'7>+'B [/-f|}{v= 06a q6j!?59U A:90`CJ|(/!o`l}`|KOzn60g "W)+"lNNʍ`۱{YG'!l~uw `.U?CnMؠ@xvv62uF:nI@av_7ru_D ٠( AO[3|{0/)>3-'U`ON D-7?O=U OQp0vB*Gf"6__Uo)7 3VۥDޮC@XdM-(r"sSyAlA0ou 0tzi6~ ߎ]] ܮ-뷮@>ueC[u@Hg/*Aa_6x+} _Pt ޢGc`UBs [ = -?SĆF2̡>V֓w4TN^ĸI5!kgIýw79N/24>mMi򻶌םn#Xx3^/0@Oǫx0K5!1(³_٫a|i,bn[gFTus0̲׼ %帯Zؖs8idWU`oVEŲ_F{‘ ۬4`:3-ͧHv}^)4p9eL sS#Y1 Cm^*rU][b*ğl3(8[,zj(EN)i+c:c~h(E(MK24nY(m"Ss4ikI1{W鴡 !Fm"xb쑻\8aRXu&?Jlھ~ܕJ{ oXuzvrrk(!wzj"=)h<29?6轋̡.O=u:ݍz\XWF\L$ly_y(z=YߝR7묺t8"]FTk:u;ObӘt (#`EIF!!h7ONXݱr1cAQq.J{!QR+Th\j|U&S6_I~6.\谿-ꝮŌ70w[d6A6_jCuuYmXO7d_ZIeQJSvEk^;7Nz:̸(^*a.6%Cs/ǗpۥZ6-˾߁>1k <c>}z .b@6,t#0GOR3;7+&kh&;̆}9U7'thq6{[W`U;uՁwJD!_ #Mb(x-?~HM@v7Jp/ BYM(|Vº iK5je>؟^PNii/G : 9̒~\ɽ A?e>{#1L 0tWC3Z7^jՕDq)G2c?,OɎbyl! #3[t`|5Y'w1rg=pڭ\IGH^3ӛՆr$ ~]|&Hwݏi2=>ORtW^tR ܏[y'} $RFV4q QêZޛ,?7ب :*|BW:c0F>M-~G~5Q;ʹwU ѵMTQ#w2plFG>[M:WewGyKeꕑGz)$ѡXC ?~IzE3f_Ph'#x֢ZR# F Ol=WIbJ8AFo8dD`q[8UN%=Qn5,Zj&~GZ~Zm-Rbps ~6At/mAXq+0:hi},=T~=;Hټ <уq[S954C 57Ӳ ~/]^ceRH0~PBor;z~Anq1pd5mV9iT.-"\:B_>sJp3ա-h,A{CUo82!#Eڠ4!=? *vQ-J yj*CX/oMflֲ.fN( `W3uB>J> ;m*7n<Ü.7ySQ\ERKfҭn 2t<*+t|o]ak zGdLlg*%O|oG{"sˉ.f W$^ח6n >l$^at}6: 6J`aQTDoXzItl\oטM@+[rx\FV:/ɳY.-<: 8"a%YLruYg.Up;|oGXɄ;Lȥ oK;KTp6 u練<؅ݬ׼iS銱ШFMl~ga#"[3~L[gmpJ6,(( l3.\c*;An)&_sP*@ʇWH$z}[ӔDa{~:k* 3V瓡-gGXl7-km/%!mJ/ 3cs#ɀ95O~8FMa۔<\Dא+W05dSA'Bf@Sg_Uyz). B$rZ_H?9-i̡n$:ڛP;DT\(2'b ּ-,h;R׳7tG9@F_f7xGI؋OiST{I\9 +̥Xkݛ in<@~C4cwpAUo&%K:t38ʐ{j~HJtb}#Yu=PxjSNJ/[ QQpܨWʍϚg_s,T{O@ 2UqUJS򔄂DM|MZB)^̺y?g(+6{}éRE*M+r>J&f:q|jw1r>ΕU,/i˲A&Rɤ`8n:ts>zg/X{ޚW)ywҜ/Z7 pLݦ• s^ lFi,vP~7iUVsJPUW. KT2:S+Ou%z9μpp!s1<ǯ$nI/@#B-?܏+O K?Zk^kZ&58t53?Euxal?lT~\#0W'H5_FVUB@"ZA9F܅hsVO?3Gc]ni`X/ UU-<4weī= Ŷy{GFQw_? )8o՗Tqbh0^~0] 1U X> vp$0?'@0!_ ݬq,©WMjC+>/7Uo)0'v{>OLI Bs>Jv pEX7ЬeF1eڅ0P>zl۽! 8ʊ Pې˂e~I!M$nʾ3:1el%]-Tז5ːpfR8\|FVBw,lM?x{Pc4Sy 8ŝ q-JzSv0.x'WdA,g+VcxTg1QI$dFWAԁ<՞Z9

    2֜wWt8d\cRT(l\ХmՠL$0Z(.Yc}GP_)6ؗ5Q|UDKV kBN!e# 4mud#p_k>yۮ^UL]ifGIFce~ 49eFduk#72H be'y\sl^&? )8|nl_.[ f* s~7!%.ÎhrɷO}Vou(e'ŢXڥ7S,x oNMuvIi)B%jJƽpO/m6ڷLxE ku't~(EVKcp]^(yMeA-Nje BO -&"2*?m5v-wiR7ХO8m5~ !1 mION66%Ɋ,Q԰]O˘ɟ-rXdևZȮQҗNxʕIAc\f -Tȿ*[K8z{xm-a*VZmx.8 ,G.hBKBu鄸K)u.7o:*F:Ϟ86BiZA-$ chu2aq}n_D1f' S=G]d4BScuREE7hf쉣G ,|d ER;@.7Y{h\o{}pIAXu'$ S]UΈ/Z|eOKC pikN.jؠxrT+.^̚x7:%\˕bjBr| r:Kׄbg?Ʌ""e) qae`L"7Ax҂ң2!%Z|I"C,2 .TB 潐!*€*/ډs&ҥ<ѸÐK(6"1vQ+.:' لf::p |DTWٻ[d碻ǮTn\xMF@Gr$Չu#LnB?ZmϑjA}='$LD=lV07߱/*9Krp&I1z#*$|ݏT C܊oO /ЏT\&hOX1Qr}$*V#U%8Y %J'XXjPWbľ2+սkw1^nY~Vfܼ jb_}0623wu{2'zu畕_/Py$K%u [/0нZ)lul1dl̾%v էXrsVhKN"UhNF~l1a/PuBL`o {X>D?kq" qJJgI;7W.' v)D %H}O]m5jmc#H`+v.eH[qhlmt霒n $+eW-x_<~G;OKš*`[\. ziy!>kFUpAQ4Q rrMݑ V77oqW .G.6޹zNaTGY.~"cYR jkr- pcnzww'fol_(0 膇}ܹJgf%&pQicuM,MɣTw"b{YXVKc4v7EC/)dc9,q*ˌ[ mᑔ욨&I,Pi|{"4 uJBw {} 8헿?t=(M# ']ld$C8i8 )hF2hkwa7nu" E.xɯ#VR9^C-. endstream endobj 52 0 obj << /Length1 725 /Length2 15972 /Length3 0 /Length 16502 /Filter /FlateDecode >> stream xmc&ͺ-Z.۶m۶]oٶefm]mXwܑ?3$#sQt013r2r222ҳ@8\,D\܄SB!3!3##4 ! տ6FN6n&nnnnήN$.B3K!ddCjlciB(kisP;G!43&gs8ޖPNLUH\A^PLAUΔPVt;g&..-J6F+^'HLL&.sK;h&egfO>B8"4jc#od upu8ٛŽ? 5 R.F!dg}1Y:[zL-]?c#0tO:NUS{;?]w{ 2jj4[vٙ؛ZڙçV4O(B8Yz0Du=阙XXظX9٘| ߤӗ]Lzmބ'*%OhfnPf xeFr ^;o6ИorG꾙({<9MZBRig]>BLDKZ"kVi2>$ h~pՅG; *= LoX>M EhᵱHx~. EaEa2jT@dqGj *}uh\+׌;1taZnf+,/k\TxDv7]@mKZX,zH0FOE+D%(,'~CTt/6UWqهw([ݍUuRٻEIm=V).}lYԸUr:,"k[4(Z d\2SE? $}jP4 ݡ#k$צˬSSWƬ,UUGXrGm[/@<B)F~CL8.BrzvZ*+|AFt8_de8yMv0.R[%NI/DV:ФNPC$C}EC :ͥZ_H]'_9FZbn6SvnP[Xx6<76b+G~-(z\DF2댑ts`(0xObaG7 ``1R+OyL?\yc5yIy-F3, H!p3 V~4R>?N# >U^Ri`JHnѼ(pB ~7iπq(3ɶj sXwb /36?,֑F5ͦ$ul H2S&^a>&`[i_˼naF=PgT^\C]6$FEՏ̏@-|(t̲4}f~NNCtTE3G[ױ U<02vj &ȓ{bXHe\pSZWϷ7zW)_"?]Fvj~V !ŏ#GDpՌq*Ȓr/O!&gRnڅ $ޑnV4pAwW4R-~\l-} [RیQJW|}IGfUݗByda,ֶj,Y4>/xG(9ݒJ)=-/_ ɊBcLPͦ>Q>Qϊ&V-fHw !2p#g\[0F+2d1NkD**԰b~GkZubwE O1:}L⧐ gNCll?Z,x0Tc ?* %ѫ$9̜x= oN؝)~{Hm0;e ǐ 4gsZÝW "g˛"ָ\* OD#2yyH[`s℩IMTfR;`@Vy9)vW}dδ- V6G/e(Q6˯e{_K%wTSRL-1H")~{ۤS" X@}oc}jpg;juxmB$+Th,SoH7 ӺyL?쐎ƍt^D0H`lj:ҕᓓGSw/6NF)D&ju5tLvo.}ߴj L^@~J8Қ\s[pYڍSyun!C.Ȋb&n`5 Nu__.~N=L2熉A|'eAK׫ &V]3&FkSYL@ u$!>vUM^RosK

    eU>@)&&0"aycD'up-5LMPYxG_',mF0}ŇߵUo@C)&wNtLxP 8zkSvg, *Zd raFh s0׌3n)Ak/S@VJjJ uj fd keXףm26AJr#0g1GMiEi>mOh߈Ӳ$b NI p-)RZ嫐Yݖrt{zΊwKth+n,FiZ82ѐ}S9B41ޟSڔ2$G=ɧ|]JҚȏ0E&$`48￲yĖ8[AC|aX'po>:?"ЁMH *IoD&1Bv󚣻*NFUh Nk*Oi(k49BZ H<8$;,Bd3+4qJ;*MRLo ~kc\udT*Cẍm=z^ =Q-LχZxny%2od (j3i~ (S 峓/!1Q(sFU^/֠?˵åd7BQz5=iٟY83lgy7hQU)Z0Ҷh;?N3~l(!2uc &.`C OTaY3Zq^%{l(#6[Tgn$%]WehX!ث_nPŽʳؔA)ظE2itӋ>!kqqWA{U\d:(h߅L[;v_Ȅwpd+BpJSښG"MI'?TZ֯iPG!tD7NO|ZY%Q[maSoGq lP&G|Z=B@an(cKڮvX) mЃ*NŲ杖ͪ <%VakG [e̤ h%$t La׿,E:5r^N`f;Ġbap(kc{%t}ɱNY̿0˜x)4W0:"% O/@@ߧ/%0VIFp̳!ßPABˊ'>t/ p<0Ns,g4S32F0B^^d˅]:υ秐΄%EvsPey#%6A@3ssX7Cp A@=-IIf ]VLaXvw8Tdj@,n[u$kՒ;z8dfp&p-9{B"~RZ3mu4Ak &ꁧ!y9[naZtUk[ ~mRڈ7 ϑz #ϙO97K}Iq YtU/h gnCC>Q׺mjE# lRVhm&|m?4m8'*ZjH3uqp N;<8ȵTlrXAc6vG2P|菊b4_q@P?8j+_~% N#K$`\$5\w(D,12Ί;bgc-' LBt j |Od>*80W+a]z-;n+5w Ƌm}kbl%,}?Y%a( ]4B߁l*|w.O4VVag p{ PFd^oAcҌ*VJ0sz:ڿktpOBQb^n(Ӭ$VH',W)Hf-8g$ݽK!F+ǞO;ĶԻxY5iy nv.uZǿd_QX.\l^d~*p)ICC[D57OS%5($C=_@BԔx$g/jhNA]v;baP%kЏlM,T&s(;!Js6}wMEibnjpN̒-mߤI:Ta U0~xϗv] nW:{~ag>gh2^7Y 1~;Հn󶦦O>9}FECx ^; aGE+/kGob+]KƻZ׹Ϛ o;v$܃3F4X L(䫐ߋ=R#UE£\D̗.⑟6V [`EAfZFt<e~9kyw":.$}"0| *ok6Q3˖ N.%C ƬÝQA}Z 0>rˁ+7TNZa"[;EޥCΊaO_Xj˒1~>]oD4y\ѷx%DA)4iǩ1tI ZNZ],8C#YGm9a_T3݉۲nȷMI=$Dsny~|=J]2J qw qjA)̍76A9 c8ӗj|\XgW)O҃`V^bJgWpҐQ4ڠв|H 2quCU-5Ε'V>¸٭|1QfLjUO\uȿa)~ʜ sf|80 ,88_p]m:~ݺz*snhݗٚY2|1aF&RvmZfƄ.l<:iPA`mNqâ8BVq:8dbdL]60H8uq+LWx^]Vދ$@w<7i+ڰ_2sCFKt41GB=3[rW S']F33zݖr_mAqy̮]qӚ4v0^x &%LbS0+D@esE7/u@/bL)\C@(imuצ A?j}@ÐDt8ms ]C44oLr/LO Y'^ (GfI9I dga"Qd]&/m۵\#C}T9,:yiCd-2O]Z/4*VPo;QS|@'I2OTw*Z8!Ht9?{$;sMY.uʆDR <{ lғ@l'?`%*:D>T:GlXx[,yWX"`e@^7h5ݐN>ҮCP"?!m1C_ UW+(* 7|MPҧ2q2An9 AظF #5"9=(jamJyrS߈&ID|@U|8h.ٛ45:Rί_R9S6xQ/SїDN4IZʫ7uy$E>0ؠ,{Vcw﫵W@j-1|v?GyM&-@Jxq˜8HylDo|\\[P40i79°ALfp'&|JΡO㱣.*czѯg?7zEr%IPyn?4Y.Z&i4e'_# TL&} gy HNN$oHZ1r|L% Mo*mL pG6Z3~&\@8)üwD]1*G*}KEs9.d-rʤlӅHRo@*s/ȓ\˧?t>n<s!eiqʗR*B4-4)iFf>䂉CX#\|-W!S葉44V -Y:OΦq VBr: ,yEDQ`E g>rc@\#@s@_'AOQ!ȏu*ӍA1J S @!Ä(j:x?W6*%* .IcR|#a~6 's|f["@`Νr@b_DIIUY0ռIdmO?L9D{UɎue}2M|[b)Yo_g`Ӈt,XsQY]WJ֥Zas'6!2 T9!nׯ9#+lz5BS|"eL5y$F!+$NNpB {Qa ĝuu</hEXuMSFb/Ziƭɹg8+w[R,J=q^]Ԣi<9tL-㚞 .=|Qbe~b99" pHaz:|HBk"7ʈW/psQEJ|)*dS k7h?d+w}E\'ɤ~tt?;q!([^M\ $ JD;Ǐ"?b~ZyNUSZ'ݍ tkȈ6T:-5)}ۋD Q&enRARY2q,Zz?\2TC3U!d-=l:-6+H켐0ȃҳ0v5v+{iΑԺ8tmy_[Os$mWNj ?)uv%Em{F?#?qB-'X@j m`r_h]ՍyҚ2\p ĞOucMJOh*Z+L5kQ-Jz} ^Z3Ҕ vtkY!.fkp?cdJƧ*C2U'nٱQ50J~.I؏x aDW)j$ ;4:ҞC'_N{S`7kܐz0tkhGM=2wEgT{YlQT-*@ i<$B=fGMj)0G#,C'g-S>;< ]N[e/֬>HPS׬Q*,|'{oU 6lM}v> iSsRΊ(7e<ў .L< b _ʭT9)Pig_C*.1O*ge_OrK}d65]"Aj?Yբc3+w9Fcysv9ѻF55༟lXr@:r܆Wy`lr55I{`C@0.z_\(M6'3LgUȊ 0rmBZ;aGX娲ƴ\`\3}rك!:}Ww$!E")pV˼O79X砨X'3-%6 T֘|x趠53{A[ &< i mT :PYZszo9#.!10R}~#>> j[ɃӨgg~Kڽ& ㇻ F@> p$Sb݁(-~]BEV'КOjĿgC}e}G .UYz.O;yo*3x[F+6x!/)"f=󽫜:~L5y2m: $O.^k6_U^”UEɑlݰT.4k!$Pd qjQ`^ҡ{ ydn b8]lR_~ Fa`4\LI-ŽvһJPDoyy _f3%?ԞaCy|QpA\WK؟ jTA$>D}k[HB.M*N tNF88r4J%I)Z:=11EEkjyo?Um+\ՂC)*UIPE-UmbAo2;(+zA. ntãqlvUoz亃K4YzA󘩅²4feԬK"T3c BY#{Q/0rM2͠a|q\&L,'q$eZM"^Xq I6{8:OA]5enC'6FHo͋X4;‛TPTmɖ~dC!}3-{+cbM7#03c͕ʁyߜL7GT`艕j8KQW'XN~[C'G~dHMD9;) y͘ǹD1; yBE :5h*yiOO˃sm>e6jɗgį}Y'ins3#B-zy;g%fMBs7C'ecBcd/,o~-V/ ̾?Km~Dg=ғ໵P%2KE(f~YvtX]V1-Vi AEՑ@q#;Z6Z0Q=UÔBWIVqV/L{iv͗fMIH@=_П+TWS+qF%^n#_x\h]Idg<=h l4Md?l0F7ET)_SVJmE ՘fB3p؄H&a̘ [70q># g9`!{A[.(\F-!6#*ĭyjDWOv/ M>(X"`̨?0`#2RS0 f{v?Ow& 葜di bg'ғͰg]2#v,KS#^dD~,1BH!2=pJWVɢ#T\?kq(&nꛦ>{wR{#QL8 `Y+wn88yY4cpNrZ:z2F[;l|[,=d&'Eԏn𧓃b3@d46aYHu&ޒu ~dN\8OqJ od({u^L+ob@6Oǵ썫v.*[(fl]UM0vϞ3{^la|%a}|FϚrCj*!+y!vĵX! $3Tn ƃ)zfpJʷ%mj2f&}atC1M@u]by諮\\iogJ٤?;!< [N욿vt  p`5>z'}ifu|tk3wb/Ւ9Nc]\­-jI0c bq}7XȎw*ye6u^ctRVUQC}Mԑ`d}/S†r- hcr".|G)N8/P~S T̷~o-|Cm/dʨ>Q<^d֦tH 3JW|K굅F5(q`o9>Q.mF%/C5gs0}M+I:ys G:PNDLgQWm4e9ѱeffFo>NG-:g@Uzmzw3S2f6糜 ɨGT.y?ZȸgH `Ʉ }~2 6Jxt&/0Vp v42}\8X,jsgP(Aq[M(/vATc]f 933%|5윁Y]}MIFk?>_WDXF)(?H+l쏇{|bw~L!ҤіzLˇk*Nd >qe˓k&&X$ _15X6vޑHNbY]&nAwE=~UW.H5O^&mepԇ V݄ATX)Mb!j X" ~e[ |A8xyYl9 wJXCq p/5*'^9`G΄jR(τteE3O'ƆJ\IPA*8q3δ<7Y{2̉;PEdh]ruZoӬR]؅jf 7b+E!f̄D}|y.϶ }?{}2Nc S~7uFٕ!Oby*5 ( Zscj")N!HV̈b= eD.^GB{LAz?a9O R{{LHO_鼐\sӨ=_!65{-gpВL h& =OlޞLnuvfjd#j`Kt>> ,.=dL FCBi8 *hHeXER ohZ5'B k~\=[LYa&`xfϲ T2 +q\\+8miŜ8u?gꏗ,}~ڈl* K`ڥwR42jIxIa)IHMi`֖_`Q,1I} "OTu~W17Aw >n'\6̞LvPQS#?Jqvtt%Nň;Gˈv\X()Uy.ҋ WEznLY 9-*Nٻ3և;㌉<3Idx"R}; ,[hz ,Oz^3C== [.q O߁Q g`-g.f)viIfW6=w{9F W i_=U ?[אƻ?ފI'.*~QֽE2EmhslVuF4i;A9r)~ KӴ7\Y:^0 vD~w4ʾe.oz-ݏK:Iw8-ԭa[.?t䚢;1<%IL+z.Z!ykxv4N"Xz}k:," Kυ.ZȌ^9F y&ډ8/HZIjϐ(S43"M*gᩎK-QՋû 13RmHjS1=bh2Q+ #SPbvXEy)u?\[fd~9Rwr$磖݅?5Zwd|g4 nc3*7_ʑ;p6 a%ѸDžzƻ/xw_ϯ(ʖ;_뽕Bڳ.7HIIfc X_1 :I0T>DmGlWƽޙU{Mf=+}+]r F@Q{zxBC*Bj82xiٹL>z817^jDQXͷHdKfS1r*6+<u ~|IГ +۔C`*Rpw$, !幰.-z/ o8/:KZ1JyoT$4NeUgYNwȨA5!EU Yg:^33ҟ-)=!?s\.mJZwbDQ]v=_$:Ȓjs-U5C~?F}IfΘK&hLE4i8ծdQACF9p> endobj 15 0 obj << /Type /ObjStm /N 40 /First 303 /Length 2503 /Filter /FlateDecode >> stream xZYs9~ׯnMEldUj+&zb$凶ܶ5%G-_HIl]cyD`$Y @<1ҁɂiyTL(mL'@ \K}A[&A-LLyi*F2e33ӂ'UK+f f\)e0k= !Ŝ>ɜ  \j i[" K'y sX(Z3˼p4 ² `LEh|'mk-QT8{;T <-}~w|˗i3" ~) N`Q^FVku%:Byp! k'aO]Np? u_fO>چ=*ںAdV=xjúoCv Aַ!ykk>J&=A4BO"6Nd M Q!L1 r܏e*6s]4jh B0ZWH@%F^>i.ƁAE+*8twH: $#ޢGTqcg P}Le~zDT"bG{+ | QS.~\Z[lkf#V #)@ecz>*)mn -hBP0De0Tʬ$(q*-Xn bmh ( |.zF4dڞCE) EGM$i&**J*FSۑ裵T dfҐx6)ZIvbl XfN-;&)߈>7bL\䣌fagC' Yi EսP5@G–@(8 C@+n"O %P/ R%/ƾHF 7GGaIyMu;d2U^Ol\chҘhᮌc1`//IlHRxj2T7/C,e/I$2nf!{Qp"QlR+C;GbR̲x6cbsxxx;搛ιX^6# /O8Yzz8"kU@E]҃%4#DZo` X)%u:C' x=&^a J|$2ZfF;9G:*5PSㅱ셄n즸lWujaջKo[ oe}5W ԟ3P3&Q]9c~;wywx_k^~x=!_݌#7B?׼ ʿ߿=X뙿s*b&`3|#0|v['=!&<Ɉ_94k߆9ZhLoػӣon5\MS rnK= .D"uM1|8+\۸|~vrq..鮂cqٮuSlA~yHMþ4wΛueVI):u1nު^#߹ScvlN, Uy)Ve|st| u]H `FB40FR55 55lejOIppz9&301>D%g-74ZxA,rp˺{ XL3/ǐhWesLrįFe".fl8xeR)mB'#QU]ݏj0+:zж+Xrv0crˤ=X U?&uߋk`}QU*?\pTO KMSoU_wv)wܱi@??w9 |n@Ƿ^_|)|DHgIek"F̽nbq]lswQjk VAwx `wsSAWTȕ`/Mt+ҥM;}zctr+Ӆw5~ǿ2./%a\̌'oL%~iYloyt]0M#4MM/XTf/Oh R-4 z{ ǩ'{ᔲ`mNsN Mvn; ] /Length 165 /Filter /FlateDecode >> stream x%9 Q:n㾯&"x#Cx/ DI>~^ BPuDH@b(#ztvg"&Q-.-"%9"88쭊nU"'2}[UŪJnVV5򸳪h &>st5v endstream endobj startxref 146229 %%EOF web2py-2.12.3.orig/applications/examples/static/robots.txt0000664000000000000000000000011612564727260022323 0ustar rootrootUser-agent: * Disallow: /examples/global/ Disallow: /welcome Disallow: /admin web2py-2.12.3.orig/applications/examples/static/images/0000775000000000000000000000000012564727256021526 5ustar rootrootweb2py-2.12.3.orig/applications/examples/static/images/logo_lb.png0000664000000000000000000064760412564727256023672 0ustar rootrootPNG  IHDRpsBIT|d pHYs  ~tEXtXML:com.adobe.xmp Adobe Fireworks CS3 2010-10-11T14:11:47Z 2010-10-11T15:00:40Z image/png HtEXtSoftwareAdobe Fireworks CS3FtEXtCreation Time11.10.10M) prVWx[ p߻{S;p A! D*.&wf{"KT!Lujӂ͈@;0 CDpo6#Um~N{W1q@%ңGOO\=]]]Eo#ỿ2> }sR|ju<Ww,1 Gl\ߪzAe.6SNLΝ;oݏ%ճgA'C 6vؑW+uk#g6WO#Gqaus6֭mQ_/;?}z4 ¿uV[ݶm!Y}}>L=~xǎ>߿_ݷou[?'93̙3ɓ'{ĉiTS9={| ?Z98dGWl߶|9Q>v"իWS||\Nr}x6?"v` 6tQA.m~ez]:ą\,Bd$ Z^+b{ɣ;&㢬ȓn2,q1;nD/t {QnW"aSZsnOS-wF-dghRQQLeh27\niJL4r)z7mMmmmjҎV+5EӚn@gGMc'#f8˓ZKCKF\25|4LR2V ?[E {YtmVv\7<}\izfŋSkNthXzL6 [H <' $}w: W(IfzNJ-tW\1?<%Nt#H4iJT6WchH,,>!'1{VG­FO?KO;򓥅N 92d ='R{oo 1 5 .UnJEVuk[ߥ7]{uZs2+*!]vA3/onh>KzAE+>sa~X Υ'ov-"Eyӂ`:"onO?`r 27  (YPb=H.[9/7fo^A3%b |?;b!lw8K ˆ6hQޒ%ƎlbIIm ~9cO yy\R/pa>dJj /&bTy6&s`s_+HAv=7&8%)VYR2$3X-E'7"J? JfXrp͏, BkpzD,eS9ؚZI(2,K 2>eb$U,u sb"ɼY&9Y>r %7Q(١fz"ZJp4~FWU#*!%`rCTQIFlӸ-mNE^H B;xy/F$9qNgi=UC&xI C1Vv0X6/@yfFp/$#tΎ^%' CB'GXݚII5LbU]J&*K"r]<+lYI}9R ^`ᆡ`![]NHy Ak(vAߛ`/bꂡ`8*|oww4oewo3) Amy5o̵fzu_5Da)< Z=0olϳILWϸښf㊟r|Sƕ ~Q':bј_NB`Mu~ֲe5NIE,Ie 6qlŪ5w.5,)FY+E$r̶@ixmc ʴ8-i^a.4sO"p&*8Ў JntB{-$m9$WӸ7C{y'܇-^y[`2i/SI0qgl+CrU / UUD{@ V[Uh bT.,ySUUT,T^?IR]Uxϧ@pC_EXjJLbؖ\=& Nn VCDt @it؁ba%Oēp7&mXKq߆W:oěf~?/+5G {{C| ڭve`d/'ks va_edjڱXx%o/;^u ǛCd rsG;2''/N󗗽;qowڛǧ޷GOc{=ޟ/D’rfG96y8>7|țS>q 948o3Ve`7cۍ͢f{fzz+|3>}{73:ץΎ{/{`߫lnlnVL& dt31V72Z;BYzFV=ƪXK\e)VM8~q5´`t#ʄ`f^l樃6#KۤFW;:YZpxz` ;xMB?r Bs>ߦQ۪K1WW;ndq;vܮ] ~]v ?nG+yCbOy2vxlmc?<<va۰駶giOu#LlPa5TX 5 u?KMPX5VM#US;7XUǭj:]j}p(J^kgt'CDٙUMfUYdV5UMF|?Gڄۛ } xiNWݴCG+ޟԏQ̈coȌrjHY )!e>FG ~F>n> C'mdmV*9VV̫n)-`Gvc}CjL\" vfmu;ajZSU;o"tjC?9ɦ6]lQ5vUux9+JȬ RV֗\Jw`М*8R(gVuMOwV;ٚcku~79O`]6wCUz hLoM`G sC=i7ϹHkCCI}֙|֛gn8lC&47汊I׈t\NʥGNrEM=5n3ay|' ֖:s I'9Z6;ȳgQꬬ:ԙ]*M;h[ fYI.HfV*gN)Uu:2Vp!MS7JY0?f$z{/6wLB!XY+zeĥ&6-nc}0xtU_]Yqfe9 F/X`G`5Fu+;k̂ƀkU:rcs(]xQ̺NoxjwNwOk51l~.z_jVq*td> NsjMu WU7m3Yj]{9-ǸIENIF9jOPlSb2j!:٘Y㙕VNny+yjSgmB"-GVq4Ӧz_1]FϏ1d">!Ogu r<FV`6OB0cCB1UY;j9#[hF k[`J'H'&lC>$Cfi-M;v`iRf,#3϶1]CN\o loeOf~Ⱦ m?p:Mu\Eݪ^@M3SbKlaR! ֙!gOkБY]GioCzM蝏dߔ6o-C㙊v-S+R>Vt7v*ɥ늓g.2A[s6E3> #V2oQ%.\QE sWuݟ~;s[5M~~ۦ>tvLp7:C1hߣ{a$Rz\=1gs.c+_x}Ecgy#tbߥt[^﹛\?[nU*Ko2֢]blVi{.5`L>|,z2ڦ>pUNN>pvijee6}L}XaU؋0_w막ɾ;!b=q@ܳ[MmM}W5g+^m5[3[}ol.a}߳ v빹yawzw7<}lwkp^FGyl|So$u8.f33^s5}tOMUهmJ>~x.rFF꥚xU[u *՚\Ne]R59[lAU *Y: .r[ <'޼fZTny{UN{UPƸ˱h~;ptFZ`2Y?ߖxJȒMDܖs =#:SNopԴQ35:35{u;puNpIG)39)Rb\bNbFI&iuU[(6:XzJ8B8ȹ-ռƏn]:W}^߹=磵ȳd}Z~fm-#$5 'F:=cwsgu^趙ܯ!FAT"2ni<5ȩWOh'3t>\ڃޜWwxͮp/8: G֑Dsokw߽^{uOO{ ~O۔Og[=) oU,w7ᐻe#߫9WC'PGP;ڗ41k89 kCO6}oCy/q]~KuWX>D=du#^OjyVhax[^G~T;1jr|`Yv)cҗ z?}ȏ)Kؘg?7t f ڟX,[jk!/%]Yky 氒ހ{_!?ܝZK "p3d{v|~#_;x\G??Œu/\o<5ڇ}G VGg8]~ Ր{ ~a٣cأ܆wV}cG6~!<5F=F_7F=F1z[8x{tޣsG=:yGAz׎r{#}hz׍z{#t@KWޭ{W1{ׁK|uUm@}}w{~z_yG=BwA_cW1z8~w{t~y_yG=:oTm@} Bz*6 n{^""gxE#;juh=U=?S3W֛8QT^TuX%ǮrÝb=oO*:[ӑ:[3[glm:kokdd1h\e}6WK<B״}+\Fs=Bz\"KqiԮrǜ؞!I{!k5X,X|묭~žuC9)z|z! Y,ˋJ+2)y2.qJQJޖu?q^1=3=3ා{-~{Ù)ř Ϛ֡2jFz[ٍ{}g|vɻhˏ<M-wZ;vӦ6Hgj<`6aemu.x5)zN^w9=1z;]>?ec!Gء'rGΈ# g뜨n5D黿^mS}!W+5E7 gBd)2Ym;_\n-vކ?]?qgȯxqBmOfQPMQ?|ϸy1ìAC#Y (sm}XUvTLq#F77O؃-suWUgϵ箯K/{\ *]rKld'c1[c87a-cc-̮]WKkʿknpF|v]jW*zۮ_߈Pm^ WU(,W-뉏ys/TMb?2-[gB_S!n!6jڥ(hVُ-lo3+tǜgMIǻ߂W$s3ؔoqG}[m7=nϮ;lֆg< _gجҾs+ EtFj!qmWUKvlDww~fN; =aozۯ~$^]w=JʛXѶ-ˬ~鞬lEGmƫ5 +ͬ.G HzuwL~_\>꯷9h񶌞q΢{ö- {}3Pe&. ]ժBj vq_%O=_1 ӳOY#UK^fF{9s,ʯ oE#"ZIM̮͝UC!7r-[FI!pqz|>b-[n=>Z>"p ~v%\79_\9;s,Ο~xOq|%ewqⲜO՜5p|p5<>pOONNﳒOά't'ЄX?=!o3ÑG$/ӿ_\گO?<߆t9{r}B;o'g9!1pH7!};Is G \d-|-sXΤ,|z'Ksqۍ,`;a>ł7Oi{~/w9_Oj' ϧ/ O x%+1X<`Gb˻_5r`_ kCݏNO1쌭čѤ1ЁTyr7x=>d1GKOh> NZgpϟكez.Ê_+u|v~8>c3OnxMP[b\Vv4 1GɔQlngc L\chᘹ֙\Ll{%eGAU lMߧ:=Ԑ% `H^߱ _0`ğiZ>C}W93G4h?x?|АG26l+`q`p`7 OCP[C{V Eޯ,rq%|. HNυ#+/tU)eE_ž힪_TUUCnT2ԅd۫\H]M/,Sj4.tOZ \>smk(l[E UgqӹDH- hZEY>k(!*mUuQҵ ߯д\ԝژffsz[+Q xTt79mB+״2*4uUi<_ ѧ^F6M*ViU/Ɋ*״)/-+wa[ h~q6N%PʤUb0 VzEpa~f /dVPFab^چ+M IJXpv#r暕',B@_DA 8_ JIG^ 5{4nWgMN`U@c,U0:iPVTECUg_8]&P]$NT@v;dHw*dYhTtᛸiP a`[Д.f0L!RaD Ol4-(kC#Ff` j WGt^5U"˓kWsqd,=`\y!SUִb X*3V*7&K4-yYVEL3&㺩h]?A+_mtAvs(X_kQ1X{z \Dleg H Z/ %.l= .1\ROXHH!B"t$$hMXA*rO$pIU_a8$UN}$}UQ$"Uc;퉴qShzCZt`Z\Ғ&DyI 4$%ߍ,Rw7$⹗W'aeHmHȉ.{I䵄.9R6%FVK"Saa:zoWvIO v'I:i,B'hS" tUV4"tR5x.$ T?'k,B'nU^xwk/pkR:AND'2Ћ̤ԗPPJ(AO&g9k,4h/MZg D!.,04e dRzI gRiW5gB2l ^rDnZh:,D `(Ҩ7-f :{IʹФJس,ϚRtق>*soUC+Bh TNrqU*9 mBL6+*J{I9S9΢.r . J'IAk&AR)m -P[E4),[ =G9djl%E1ҒU˜ MB)AUCWEQ*UڨVO 81II1ʧ!>FrAP,eJ]ĝ*z+Ri; Ny+@rN:%U $ 9"Ftɡ UdD *D0k9d %"x` |,zĢÝJP1h a"@H?8"޻v4%8L_ g(%Ȭ zK&j (& KiUfZ X\Ɂ+b,UZKZ&QR@vS֖4cdbr"Q@0ՓieGD#qO4giAET-\2 Hy $p HOjbL]M[MsU | (8jЀ rrXzny $p^_4"1dPȒ84" y$qIbBPQYS iK]EEٰdyMdMe0G0B*WP n%i̺dV較&P4Y""  =8i$ _[dF@Bq{Y P d,>@i,I>*%HF@"dF e"sp^@mY2oe$;peZ"YFI(@eA@R%s:QTI]\.%,ұ`3 QЧpc4Fx7Dq(B#Βhh0u>k[Nh0![%\c^5?Pt@\246gq VE`d:ClVl, 34:(T@D\w{ s' AE\A19Te2٢".(i;Hʕqd` S(oCṚͮ 2 ~W4Dq=u /K:W=EՕR@F_7APU1{?)u)A[͸,+ @ APWH*$1rʆTBwȯ M1 ͝#pcA5Քir^DR Vh~#/9+ׄUED$_"LT'X&K' '4u-]R\i_*|+ŝU"\DU(6hmтQ (4=GaF `#Xoؼ4Q[Ehיi[ :/YX/(yFSO_[ߖ&ɪElVI+Ρ?r> IAQzaU%w`@YI30tX*YPJs hiV); : 4+3Zֻp3'tބ(1TbBE 'Q[|=7z"mRP39;~~WJGޟ&~ABG\xTfTb_frd~8ӑGPGrQ SO~R!-$ZHm)ZDr o l3Yf9HE *Lb( L"-h *ɛ-LdEzH—j!ZF@"lCzE2BX?W;A.+# *Xwƨ,Eh+# P7"y2V k)A2Kb-Ur2 RD:_F0"qԅO:\"[4 xdeQfI'GhٜQZUi2^5e>gdHE&]MQF!TzhȜSR$Ηj>[ DZ2!$MdƧWT$bXZ7UYF1|^+ da:!$*,dpXszIU (JZR"9aZFȂ]vq€ d}:@G2< ʗ_S^ad$H^T+:n^(Rb/Dp]mV$!D']v)"PZ48%P|MFZd{!,(U"ӼDA\9hSJRD'K,MML'hf-zgx K/E"&%c8\<=ibF&ЩNDJO T@вK$LKYUd2'hV"]gVhEA*oȬ I+{L(~Yb(G( -JJGX'TXR/vLL.@P  EJqT(5U`T`K)LC F٠"ohXP C$8LL0LT!TU;x/=F j#* (&ZU* hִ2j /K&f8Sj0&E-˦uYh嚈_ (Y tuq|PŞDk3"~0<hRW sD@<:Xf4 YNP\^Ilx5oZH>9W{2l=E9`Re+0ð[y&P-3Zg0+ug;z}yLO,kl pjGkg 9GҮ,ޞp]tx6ӣC\lxqY->;{l ~Xۜ 6j P$eiaGKك!{Y Cj8wz2{mOgolM:{>yG Dunftf2i&۠V;ਬUȪXLƋm+y1C7~~d]ڤGڬ樃6#KۤFW;:Y@UO잡U{IxUAޙ{49j[u)jǭ8nGێu:t]ԽD[-t]n>Z{ݕck! ۆχN?=K{ڨab j訡hȾ1?KMPX5VM#US;7XUǭj:G6@Q\?[=W;AO?[om$#fgV5UMfUYdV5! hno2NKq"NA+NWwjwM=ZY~`F44}Cf[ VCjHY )Q6"> W6:q3 6k6+RTNxSrygeU7e~yo!8Lo{rji&.AS]m;t:UUvJjMdNm'ups4;f-jvNʠ6gEY 9B'l=̪0)j)ei}I%l\W5G$Չq:Qά&::v5iGXg2*co8rtݷ|heg)ӛ{#/eOsn>PRuÙ۫0{s`8zHd\:zt,ZܴZ6fhw2`]om3t2W3(/ͬm7w!gJ֫nooUa7݉Ygp>oc٫.Y34anjuH̍(tԖ۴ՖՎN0GH$z<I^'Evsd#_ec<xv!@Hʪ JMٛڥڴ0iվ}B ~B$i3+MS픪: s^Q+B&Z)N^~3BIk&!,]2_WK~KSYg}_D_sZM۹K:ԬNT||Ը=T괛'dJ83nfԺ3s;9A[q~?&48rBrt٦,dJCt13+癕խXV ⣳lITDZvhMb:D%$/x%b4{gED}CΐT+nWzʼny p|ń(dV>`>ξN}m׌ =Nnl\vٖkNe6'QU.2\޸Km4R>-)Z=/^#zѦNQ8}>G[jYqrfs(0KJM!I7KYNׄqkAbշ:uѺps5dϠW!e%ͽ1{nh6| Xu9i6b6E(>7- e=)~ PY=J,)읥0 [nnp-n顫ӟ udd׭m.h]5)Ӛ(sz+UJHW`-㝛Wt16"?7i8Boz?͆|uݛoZ(?&Βz}&.햙ƍ2?jɲ2\ܼAQ]m1^9XO̳j?ca|1=׷6`ڢf<^ AvXnIRK)E8u ['wF=̺g㰩M<|jR.}c+cE]ˢhȂJ}ɒԥ '܇bprrP_;g9'wQ[5g=|*}vSZ``pozpvć}9mzgR5=5)M8g@1uUy / ) ?qϠ'V#|>> #V2oQ%.\QE sWuݟ~;s[5M~~ۦ>tv极4g-5{GmzيW[ll[ۧ|vXlþznn{nh`Fޘ8"dŽ%H2=57Ibq ]#ggkX6MG/^gh|chgeO,mU|f{yfrE<G*ApK㩙DN̈́zD;ͧtUӄk1f6*B+f41^.д<ހNq:9W}08z}Y{L=c5?+֚P.|97^p,yMf7'_!DEjy0EOFw~lƑՎ|̥+_.؃Dt]ذܿp4z%$v1MT.2,a^Kx%|RCmūVm<sXIodfZĐmqQ}%r^Z;>?k{ݑ/Zl|pf<#녭KWCEi~a٣cأ܆wV}cG6~!<5F=F_7F=F1z[8x{tޣsG=:yGAz׎r{#}hz׍z{#t@KWޭ{W1{ׁK|uUm@}}w{~z_yG=BwA_cW1z8~w{t~y_yG=:oTm@} Bz*6 n{^""gxE#;juh=U=?S3W֛8QT^TuX%ǮrÝb=oO*:[ӑ:[3[glm:kokdd1h\e}6WK<B״}+\Fs=Bz\"KqiԮrǜ؞!I{!k5X,X|묭~žuC9)z|z! Y,ˋJ+2)y2.qJQJޖu?q^1=3=3ා{-~{Ù)ř Ϛ֡2jFz[ٍ{}g|vɻhˏ<M-wZ;vӦ6Hgj<`6aemu.x5)zN^w9=1z;]>?ec!Gء'rGΈ# g뜨n5D黿^mS}!W+5E7 gBd)2Ym;_\n-vކ?]?qgȯxqBmOfQPMQ?|ϸy1ìAC#Y (sm}XUvTLq#F77O؃-suWUgϵ箯K/{\ *]rKld'c1[c87a-cc-̮]WKkʿknpF|v]jW*zۮ_߈Pm^ WU(,W-뉏ys/TMb?2-[gB_S!n!6jڥ(hVُ-lo3+tǜgMIǻ߂W$s3ؔoqG}[m7=!_'e.dGV;n*#--8xXB|Ͱ.(>꯷j'"Uw 9翫79Umܮ]`vw?,3(mǏ\ p{ ZBk Svd8*'$ hvD+G4WeMUCԖoz{~˸3Hݞ]'\/|]xsU?EN^.3R+)v\\_nk9kMd}kVXO1MWxgt\?cyX}M@n`˃Ó|8[ ܷm,b=؄_lx4҈3W\0Pu%drťѣK8x ?|pysp?|ʛ'N?;vs?>?O/.+88?_ϭc+n'ԪlqT\\lrsTfslrY :=犿Z>#{vy`r@kpvć}9m^_ 'C}x<8dn{>2|x8ttqYΧjZzb7C# !f#c-v˂CݜǃGېa~='qbONYOq'|'C:v~ͧ t2|F#9r7әtO}9[sk8bL#:KNYk/q~AC @%;'Z=f=O<9 $3Oa{gܑg2hts6KJhzGI>]jc\\ov#&6xbxOi{~!s:: p|ȳ}p8n}3`>jgM¦^O՞P1]ٙM8A{ݳϤ~P;zl;v?8Ng<6qi^$T9jS ,+&SF 1jᏙd,& H1<3+1s3J SL3\$?^= j;#G|pvܶ9 hx|~YU8? Q.N!C"LUU߇8BH8}@{r83u@GCSWW;~ynaBY?+q!m[> Eޯ,rq%|X}pK+""JYJ'g<VtUtJP}mZ {>{~QUUhQRjyn/si"u5QȾ(L d=?_j)3\~s̵ѮU(BfhmITigQ?M6NC%#ٶ\.pqje 0m\kt.MTY?EJ6~BrVRwjcM͕mٯD%5RMel0i:J \BZ\peVUZ ~Z+DzM 4eZVɾ$+\rȶD~Tf܅anE.u\;`dB)VR4XR ¶Y.sS4PmX) Bqyi4%R&M*aYڅkVvE#}]8) ~*(%9KzVи^5;iWW H1C XQ} Um}tQ_CGnt՗ D8Q $foZ r*ߡ :Rd1KQoR`¦C)HӂmAS1 ø0H1PTPFz>"@$ Ȣg"X嚁%\U ycRVU,Owe_Kq9qjOadTY>r)0b]|ZSܘ,=д#teY3 Yw~a5]`}eE`{3pmJ0@MW>) -?`ԾIGA'RS*()iI.xI`13* WyxHZRD6>C E6YTK"@$gQPEa&thS"L9e,h" Rax$@Zf$% R2A^D3 IE[p߃ ySH ɬ FQR+-Z*$Z@?rX4Z5tU|xRjZ0P) C |c$R1@$Eܩ顷,EfS@Y鴙Ǹ$SR@`)O#bToL0QJ6HĠB>λC@X/bLҩG,:ܙ\ av,b@A0 4Pxs (kIS#mDup0ґiyh[ B;dbJѾ|ހVe֡Eui !"P%YYe%E $`7lmI39&O&V ' Y=^&qD8"1*M9 }X:LUn"Ʌ)Ӏ@&.&$ۅ8Ф9\m4_"  ( '@Z1jJ#R#I,yCљ(ҠHA,lo,&E5)1[t_MQ KaJVtX / ly#Kr5V2&PȬ*LIf;jE%.- ЃJ F(P0Mf! $ e:z MF ƒRd$BVMoDP()(2G  Ԗ*VF@]/"Mi#Z t7k2B`=e%BSNiEeǹY^Sa2OG2FQ9uP:- 1t$5UY!RFsFȀeB%tt22VY$%M#uپQ LG20\5r_lQhS 0YƓE2(SxF@i 蠡hCk4*U21EԥRB^"x6}7OaTI-wC"42,V SñUԊZU5eZS I T\կ^PA!Hk3p&ϭ@lP F3ĉfβ0C2Jo;AdZJd%}@h;wT5CXi_CoY&-*⒌AQD8\qI06$*< QPGqICtcPP䨯sNCPTZ])d/pE^HQs>^GՌ˲ y~B#lH%tޏÐ9bj 9$_hzqQM&EX)a`Ǻ(;brMP QdZND%(`Iuetr"Oc]2%ŝ~q"̷RYu EZn-U^"OsTjfh"qFA:);Z\AeQqYfE\RO|RuZ_aA8Nqźe)9mK`\viUtz,*ZVQ}!; \N=}?MA*0E U18;f,@2e ;qrNMA:*X/ti^pJs.M&E9SS'0(Wyti" G$t$:'i=N|nLKL!e&h:-WKg(H3~Ex$04ב_:(%I:ٖZIyM$,FI˹6e3PԠ$VA$҂摠IۂDV[!Q.|Yre$I6)Pt )#$|ύ2)xoRI2) %|s*2I-#oF Ļ,-RL,' Ee#RIG]3%ACGZ~:etqU:-cUYsFTdeBHehw̉1%M"A| 泅Lt)BDAf|zIAME(zYu eCH.絡BB"BV '5'(4\\eϙʀ%+hchhzEa,eg, ,( I' \ Dq- |5FQAtKM:隸2敁,u(B gEfEBJInhQ~e"KS!8 L7d4e:\L&H'"ʂR%2ͻʘMĕC}q**em(=KTq.'(dvzU+DŜrU\T$PtpwǺGAmE/ C\(.+ST͏qr4-Gh ˕U_ѣl: v}!ٽQ[a"&MaWCs3 IìhV[&x+zX]:6Z-# Z6tR]%/(DNWΎV Tche"<iEru$%f%bB{' #*]>3As ģeFs\Pde5y͆gYES )yE'C0:ST!Uf‰.; g2UxF 3"];Zy&(K#&CL4jCˠ$4"=K?qcSyhQD7.9v$FВRj|!JfYnRZ&n]?."IUh9 )S*Kg)4T8(]M9fFh՝+*KJql Au?{'*?xϥ]$/=\Zoxt9`g)kv`i=Rjߧռ|RVS=Y&wZy.=gj0st8fƷ-ˑq|Y Wcc^4*jݬeG]z^~xYz.=>~XypϿ-x6?z㳣חlqLƆ :pLʦ}Ļp/v|)2oi!-XVc3֕]P h\izӥ}B{2^ו95z_/sN/hux:'?ާ{bmkBSx]N0QʫajohlU&fnÃsfd,>Op3]E1T яjV2ڃ-p uyGpodl`d/e>v 9]Aݩ6ٞGÃT{1H QlH':iуŏpa'D:__CEmkBT~?x?.Da( B,*X?&s&y~ɳ8sDh5_ʹ"֛1NCoky P.Yky}4Os:7@:l#cѼG]GGm7oQW]omN Pvb= Иnst5hLOԻ}Ի957NkoԺmԺQԺVz E, vc.ீ ?ùL4IJmkBT~x 0t@@ 9{^oۭnv[/zKm^oۭnv[/zKm^oۭnv[/zKm^oۭn_>-UU ?9mkBT~cx!TAF`܄`  `%fP PX@P3H'߻&v;xrػ Ls}v={#;_4}XSƟ?KlKǿ=o{ǿ=o{ǿ=o{ǿ=o{]~L ,ou}{;%lkk?OToǿvoǿvoǿvoǿvvow_;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;['Iſo^Lsۯ<ſvoǿv[7OESmkBT~ x;kQ7(EA+N!";X A,Q 0Jg`QLϘHb{3Lfǜ9g\/sp8x1GS%Jxb:Ss/Y3P1ADL,Jlw} 9IqMlq-@_PC@7]:@WP&3/xuO%³22>K#Nߡ7W%@+g>ڗ#Qw|7-~_@}aU/更E/_ If#:gE oM:2;Nkg's+fgM'Wc2R_?x_fs+N𯌧eLF'WSN𯌇e/eedp ði˞]lx.~ߗuvaXPw ? ?Ʋ {ʞQ]yk/ew.]R)wI9+sT O5s&<7(kS |)̊ϷeLaVfE_4YfwmwR.o?iϳf}w's̜13ks:ÿz߿ gwz%Zge^f7-eV_v_l6Mg>炎=b+g:\obny[?t_l%: /ロ|B?u=/λ'-{_XnaXc{hiXC<kTNQXCeuI5uI5?*{/ _'"Ϲ08'eGQٞB<ł}8o/?}z@-ł:Rovk  q @S_, {"_,>[EG='"s.=/.Ŝv ?X]9?sB_owewǟ:vHsG?'"]u 1qqL8_sbw ÿ 1ÿ 1ÿ 1ÿ 1ÿ 1ÿ 1ÿ 1ÿ 1SHXvۍ$_Ӱ?ksc?~mNz ЯiX3~.YmkBT3xIE_L$.#"b@#`0Ѓ=ԽNxlvv #}q=cH}F~w1[ǂv띾~JuxӏNA?%'Ǡ_ =sg/W9_o'ǜ_g'|[ʑczrgھOA9ӛ} s3SQn.rur Pr~ J/Or?s~Pr~2Ԕ u/9< %sD99Pr&Tw&Q\_:SVy%sD3s~t*܈RsGSQrJ_߁Rs@(9o19WiqNVίR}1m"U|{`Ja+q3w_8Oqw z=հǝ~η^zzk6;͋6kX{}'!KK`{s~gY9lş뼿,3yRZ&wY[c]Yz2-sk}Sqr{^leC/oVÜ|#n"n4cD\m?M|-ql_]U:} {9?-`[sl\vvL j6x{Z{oxX x&pqجbF8Oi_:Vv7HYd\~k?uҵ? %W"i`0wtC[#i+`{h [ Ƌ7{])a{9Ku~K[{ԎiUeo-(Kcv[(}e6oXtجK!Wnk|p \xWA?MZU2.`|\x0;*'41:haΏw{[D𛷴C{Zs~*Zhx~ԙ>\mHy9r~=B')>ߡpƀ(e絖;$1`ouy P~Iޑǝ:{VI8/}o:|1MTy+%1j!R%>WZMI?)r繤U9- mopqG8E,q,ƚX#Fȵm,1$!Hs:OH8c#r2K\pF *tWJms~3Ǧk]`Jlb_exF^DJ>ێ!SK8]j$RA%FK8!}T*>6QSMad۾ ku~mpFCHŷWEޑH-z# gwRb3Zd 6sx\ gtimÎ-{$4j߼I%ё6=Rm#%=$h#IV-pFHPJ}5 >uHX_Id-b-/$H{GXqج{@iFlT9F~k9??$IuސCRiXqop uH ]){}cSp^ǽH^l[*ymkBT8x횉m0]HI!)$FR?6c>>~sm+vuՑνYu8uN?WP>1JsWiV_uKEϸ/rˆ_gKW]ױEYcl,[TYHT}xL#}A GV7^}>iҞ-i;}LJX&TP3T#ߨgJl e'=?͘ona|7>?ǐU%;/mN/IfQփz{G}?v✽3X~j{zTAO^ʰ>?sy|G)PbtD>3y{k׼<>s_u?>{ AdNO^,Ov[t/鸓E 0:+WDxdݮ>LdNWt3}v|~#=jQ}-vt~+l0' NRANH{?zƯDTCg,slˎ7_ED-pHUG $5a5ؕG@Wbtn?xGdvwl,Mv[mw>Cԉw`ihW5~5bvl9{t d˪1pNU}`{myUkZkZkݸ{D 1oy3b ͼ8 2)iK u)]G7'+5Uӽ2c$3l>Aߧ#QG̫Pz&C"ި_|='fv0+CnAàz>q>}xL.O;ž>LLߢ ڏSam)ǹwEPKmhʢ=[^{Gt9=YO~#0\4 4@@861wbSc ʿz81v\0u,.t(.`c >nGSS'O\`Q: u `Es6=8Vѷ>܍X;z8 *'p=h.o6ZD̹kS[F9v2[%xe>G9CgU [D{ꌁ.w4eo+gPoU4K~o7?_'{;؄}_UwׇZf/Xwuz_Hz~w!;{񞟝/W /sj=_^ve{z>2|/_Vwp s{My 1WwOi6gc>XY(?^E7ҧgtY:gEhї6DZs:n>vE37[jW}>G_/Ğ:{j]bRa7/0y m-ckZkZkZkmGD+hmkBTQxA 0 79BJr׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮׮W,FϜSmkBTUxi`Qqqqq ! COMlS$I$I$I$I$I$IqO9˵wOo]ss,Խu˲<^0 tc}av=7_{V9z}ٿ^s_y~?}ez۶@wE՟k$I$I$I@? =TmkBTxDx! qP,tSUe<џOZ@%adwmkBT|x=kTA D'؈APT+;A^;l,j (* s$&<b͙y9wgn;49=0z3MƠFk*|1ј`[b&»p!ڽ19C#m.i|߂s,iBwg|`I{< ~Ff!BU ~?vP)iB,{ Iڣ`6-f,$O2#S|?a+FҾ%reHړجbgN$}}y_B2^"Ì^C%}=Yu2usΦEauɬM,T,u dB/#~= k 3r 5 :(+,i?ru ]顑CboQ&0ga3ʁߨ9tWy&Yb2'2SL/H{!yZgG Ḱ7:]d/I hc,sq{˩=8{́Xs|QlzpfT``F|foQZA̤)y yx{qҚ)LtS0kE:)c>aNl=t8{J>5ԉ_%mD:asBHkAakO0wn)WwstkWiNLou }9pc'IC%&~m_)wI459߂RίC.G^:9#s^E s'5>nzZRWNF%c8.9Ux\ș8<~qt|j9wRs'oKMع5'!.V }fê2Ng#] d|95*aiOU*ar>>n {* OkwS9&|ui?EP'9vS[,cpnj?MNDZI# E;;:-C<*Yy`{I1wbld跾|@`_k/)Hs\ķ9Xҷ쑳0ȥc#=f#MYțQ++tmZב%p!W%p=1sqv*K1^{܎:ݿ@ϝEuG<dz \cH0k9 yߥ=ʁ" K9hb-Ǡ_oHB{4pB2[ Q:k yW=|G|3O,}Z-ZُK-9Pó/aҏIM}N5C7tmkBTx[VEBDTz D n" ɛ@RvĈ(ɛH۝@Hɲ/CK-+*# j^W=`xX ޵wf3x7?M)J3&D~kÚec:p;XOWXe8vqzMKӌ>ylq{k)^ 7>5-)fkぅ)~D0%Ҹ8p {V7l:Nka3\cm<0=.{Ncm=0NX}`-'ku؊ 0H0NX }`-ӌ^{{. |gq)~B/1 {g-8v ]c=ka> S({ ,c3=}7X +]uPCOk`-kyaˍuȵ9 qIsX\?uhǚ .cr_mZ'7=UZ'8bm97|0 W!S[&X ZGt^=`-#:ϿZ' `op|ePό>%:e~_BsU޿K"j|;K⊵?Ήc򞰢𙹗1\_N8C w)>0W_ a=Пǡ#|Ư?K=u>K7c@ÿm xs'qZh`o()hz@= c7= 1h{@Py=֭o$t= |OW'j Wg ޚv<u@`Dž[v 7v?4mkBTDxIE88-DA *(HХq6JDP O"d!ƅ\YtbcT8)Nq&(>Opmn{ !CH+ lwĕT nlWq%;A7~RWyB\XVVgq%T;B) !RKX=#Auo8Ę 1cFgUGFD,Y. ^g@Ĕr36π)^ àhQucLĎqߪz1&bǸ \ 1!WUw8El^[qB3ϪB#Z1`R3ȈVEGR3xWp$9 $gZ_| dZ!N $ecXpe  I,/#I,W]#IǬT/Hqx?s`{.r#LG$:sj`xI\$_W?4pIddRx}$"`M_wڇL"FT=H/ɤ^! 7 |Esց(^qn<4 -. 4EMx4z6opo!ۆOk/ HdnL~ :ߤ5I\'/V!x!\y_㹿,R!5O _UeC&ŵ_c |ߤ瀍fِ*O s'{@Mz~ㄱ_y('2;K\o&%2#eBʄ^`ۀ/Sw_U^ ύof/u`-_&s{SGzawD5ȏL~_Ɵo ~LJ/ӧH&0'5u1缛>E20=:1y$|b1ydLjRz9qd<_Ua݁&'͔YǕs%W?9i |{K.)xfLF@q/XM1)]<x~!e#իo`7< ocE'U)Yo}|/ c8e J<0)[oOqCuF\CwF\ /aQpt_UaW~]5en/|>{~!aoi^NF ռ-!ImkBTx AE l<`¸ȫuCcusxsηO`/evogvogvogvogvogvogvogvogvogvogvogvogvms^P{-8}sZP{-8OʕmkBTx1 7HHxc/| mkBTx @CEi6a@#%N_A_i8_o$N_A_i8_o$N]7u0f. mkBTxYUUWjZH4 Q)a= Df=PكB{`FB\TDR6`tO)Df~J+,k9ߡspy?k="үH}F{f{?`/?`/rr?1hH/yP }@_2Y/c }`~/@{kB,̝t5Z/}A (Z0+ȣ\`G#ߵaJGyh&/0WKoI?M +$ߵL4:`G[']KyBotw(*:W9I_,_7~2:ǚyGz9?\c%+Wb2C}l2}{?7Y9\d/O5N},9?}'Vg+>I}([ WrձQt^Ctƀ[ݭFD؋{rQbuopAgP'uJt#Wwsӕp]$in=w(1zZDt{hi6Z#i] oACGB.\k9lM-pp}~+g{Ԡ a?/|Eg?h蚗ʄ>6;QYv]{ƶYOYy?>':TqQ2 n=9N;k @_e4Aj"}Vk 5.-s~d]9/[E K#Eo_;Zi ^`\Zc=:مᒮSy EX,* BD.5Mq\ƪk֘ \+:}E_(l'!87ǞX ]֚N vmb~=#:s~eh]vY lDtEFY6;:aJ|INrҚ\?Z8o0_ 쪋cUě™ XbWK-1/.jN9?!#%vU S-U80eXVL U(X±iU" ʹf*cM=wޯV7+o-^" jJZwU'%wΔ3ԱgFY-'Җ߅]c`_7@*^%g{]3§9¡y-ʹ;l aݥM>kl A{_h*L*ސ{YͻҐ dv[i$ d<#ۅ/*Kpy4k<~_0y\?\uv2AOf0'FęouUi7.-|o}7ȁNuOxk12.g{,mkiF=*u~6Kb]Q,l*|{L60Kšk0/O) Ζ L$r֜9H}wSMdVX47~.\ZmomD{p{H9UjkI}mX ͱ P[C·e~4GD7]չ"}wZ##{hYف3lsY&i;sS5x..=LSS k@g\ Ί>?Wy 8k˔:?JS58k@HzGx} I O{^A{ſ~:?Զ(P0F 5cTL?0Xxs~ Orq}[|6ϗ~Q8&05xo||[pfwp3)ilBB?e:ASQ',4[\10o񱞟Ю#Hoq6%0_oH-^˔ d}cW&wCl0 ]ƺ@šzK"3¬U5 )Uv 7$5 ~\,^[Y[U0"vwhgސԨ~KLdo &\({|㕀͜?8):mkBTxx흍) q ĉ8D^>׻gI@XjjgiЃ`0 `0 ?ϟ|:seQ3|ӧO|:2|.};7eGFO6_Qv]T]^ˮg{>pjzkuo{yye?{-x/ D:3D&򈼹e^Hyi#/OGzϪ߯_~ :sMe#M3Y#=2 QЙ[\s=E8}E>GȩT ڲTg-}VfoSVwzV}./>~!?U1<#}=F[ ~QڋBN..+푹^edLo+[\-k dW(}6q$#?z6Bөi?L7!3O_Q}Пuo[=tkȋM!'}/Ƈdr2_Cﲨ: `0 :8o=+8-4}۞cĥXdq{bUq©ήm!ƶg*ΪU\z[GA=^+ru{LV U?)V>ғ)x|Yҁgi\yi^cUo*= !TY?rfgWsʽVn*VX#=Fϫ+[F~yH\L~[O҇h5ݵTow|Sfӟ+);F;:x )/OS yUo2e)Ve3'wgGg=J^`0  ľu kU,Ksؑ5nY,bXw{ w&3QהNQev ]ƷgcH˞i{A3I8hwduwUIWq8I>+@pQşGcZ\ƪUߝ]/:3d;ɫ:gB9R|GW~w2;fzt|+i5nΟgZY|<1NyŬ|E7k?z/k><=Α}N΅>uWydʬdz `0 *\?W8GY:Dgcg< 2+'W6qn؟{ru"wU쏘~c#T?+y{Q,,^qF/Xv8.֩g3}ȸOP ~n%hUG4(_sn|W}Tg&x^c,Fѭ+ <#+}/Uw8BRh_|33!mr\7U9m({ѝpvew[xG]߱?g;,nҽow8]וb?OV=Z_#ve?vN_WrYLo;1g9pV^G~>[_vNOS3 `0Q[ veO\k^8֔v<Zbz\Opbn$~}oz3ј mK vU]^iNWA#x딫jt q :E= z%օq)CcYEqyRG-+u (K\hP'*^ء^q=m=y|Kvūe\rȊ4={W1;=ݷxp;o@>ȘT\Ԏ+C=*ɫ|GJOCW]x1.ﵠ9_Eб Vq)v(ʑ}[GwǺ{-oSdו_˞׃2;iT&w*w:g׭SOsj%Z[~_˯d֮+w]7 `0]kIu+eL]ւoA^;=GR?v쯱;<y o$N1紈=:ߥPVu< <&3KyC/4r)i=*/|Ύ^]QNН1qGw>ù{ ?Kv:A}E:_n+{u=rq͓̳]>>d}+|L01`0 leg:׺񶊝`W,3O?]\9P~[kOWiGc~)-<w.3q}'vuw$Vnv(r52S;Wk_Kϔ8B/hEՠ'9w?K;x:x<|@cϽVyc@ۖSw8Bq]=2lBe6V}eR( VeZT4ade2ޒ+nYBTqSߔ<[&=f[|szP)G}{Zׅ3n7jpWwftEw[ǽ;`l? `0 `0 `{~i`oLy>uoi\qK|}7Svu9G쯿c¾#>,jow{ՆݲL=mW2u_8دjo?kD߱mw>#}E:OۡO;y`$j?tU mkBT"x A ͷU𴫠f1v2]//_nok~.zuzv\;[nJ$I$I$I֐ mkBT~x흍8 FSHI!)$FRHnw HYx3ꇤsaaaaxIǏ'U{o_ھgW9 o'GW {>~Jlo߾)*/N\ϱov[iZ_ձaJΝ/:6O- 92b?Tlk%?_21B sY5>:>c=1Ow y^- ڶ,XzusM#גU]>H_yYv!ۉ_mi Rus]Xm_g)YY)m]y,m z1aaaxEߓGקo/Y\k6xjgH|yu.\aæM&wk#ϐ$?]Mo\Ⱦ,/ڥQ@~6s?)}, l gX #vQg Bٙ^uのuhm?}{].~}v_J;xogJY]޳@.)oqC?}>@Xߘ'-(W? źvƔOʙRv[K?[A}?-wmՑ}g\=c}M ggg DŽ-B^k_g?F? v0||؎=ǧHPgs/hؑI t~{n^}ZyD5XWvO)"c0vY Z|~_%/,p\ɹyΰZ/;/xs_9?Pܯ5ݻ\[y|č8gʱL{? 0 0 _k3>z_\S |<)b|7aaaxn.ta?l^Cvkؽ#~e)3<3^kdlc&jK+o"e<.ʞ`^(3zu l+6v<ï k7]/lc[`On}򚄫 G뎱zt^v2)?;Wmr5ocIz?Ozx{&!ez."ѯ 1Gg{+ҏlw<=}GݽFƨ^)zIpG K֜{{e G12ۭqiumf>.}~a? 0 0 [u+7Svq֭y΅ ?ނ}XwŶv?ߩDZۓ-q/?߳=<~#>Fk"qzrQo 9r,nY[;o:)@-`ק-7({߯S@µK9֠ɸ>:n3 _[_*mtcmC>qSL=<6;ǫsaaa{xˌ\ފpx?0׋#5zяc]x^l򼠕(f:~٣^lin59W~\;?vn6erUbS~v^U O7O(|;+SG4|?f*?rW~2oNٟS9~daևmH6mX[J~s.ym4ٶO|Bd/b5ɿyU? 0 0 0 0 0 0 0.P~*1@G\⟿KrKXs2(ߥ纎J8'>X@▼QQbqwx b)_K|v 1M6kee-2Ǜ59?K^E~9ϱQﱮYF8N?~;:=J<-tĒyNAgC \NXKs)'^Kg\~2}6}Գ)n]Or^j~"{p29w6/.z-v:+M{WJYZ굢`% Ҥl9ힶկ#OUz+U?;sd~vND7*.Y+v:ye;8}~|+ÑޅN9}{Bƞ#txխsXɿkSV/uJ=o G<ջL'L:D]6jfgLz/+ؽ[{rCMYq~[{yy czA;w9zszWHVax3 ףmkBT`x AE?fb ݃8Ơ ˫uo3sI=Ftٿٿٿٿٿٿٿٿٿٿٿٿٿ}_= }%ZVr||mmkBT>xMMQ'H& 0k)H͍ %/#vJu޷Z߿~`Y9'NfvSi5wٛGڱxMeW'w}v=)옲v=v)O~(gi4F&̀*sjn6cxm>ݣZn7'ҋmʌ|6㖳=]0s/};s:=IGG ijȥt?wݚ2W'Kǰ۬wk8^5 3qpB=VxS9 h˄N{2ފY:β-}^ȤFp(xs2Q￶Y6.' 2Lה9yXf_Ev+ܟ,ݘZb9˽ |Mn߻9/_Y]`曓?tt[w9@ 1VmkBTx֡MDQ+H*(a"% H$Ao]3ɩLUڞ{g\sKٷÛk^i~e]~jYnI?Gc\Û?ߔcxcu4Mlg?Ϧ6Mlg?Ϧ6MlT`!  *mkBTx}+(H,"H$"#X$,QԈZs>U{ ..T}6ڳ-F`p]k߅~b  О$wݓٱ|sCoA+q3lOx@(0a+? T,_7s\Ϙ^Bl1)C+k(FyN"8dPC_9>O0&l4Im+nwGrŰ)/tihf ѸX>E)<,6s45zb?J\<OM%O#(76:= ӋYAƒH Ls6MXBcX&ǘJte. 3.je(??Lj=%wZizFTx$kP8Em jAOހ>~؆B9 ֤8UKCvjbL Cy ;mj P. DkwUE€3ܨ8xUJs\ɟ+;}sFQ(KIXݛƨ 1 +KdX];Jģcx$D׷X`i @l̏rnm$^9΄zBGϞQ=nfkDe; <a>,⢞jk0B[p($Ǡp4 nq`XƓ vϵ.xHnorJ5Hu뇗 f a[Z:>36[g RL؍?( &w.7C#~B{] UW 71jk~ecGrD.=K@WDZM0倐0\xvqNZ ># BE )&yA}t?B Ym(WIpɱ |2+\2 )l8tl@Z.Be񅋍RSƃm>dIl'N adĢG3%#)?$s _5=YBR#-k"qGP-e"f%֩-ϓ378M9ϊ,_*n;HEBƱcl~ ˝[/sagIE2,z1t:kLș壋G){7ond{@rP>kwk׽ #kXfyEAB9uM4P=_lgW؇N#_nGpp ,ZUu6ȓVӰ0EK7*|]{75F\ԶzQz! uH>upT٣o3P)[^6` -d&*=%fY<^ط`_6|h3ء>2 Pq7ώ ,NsjF=B` 큳CiU)R鐏@LҮǧmb<2FHRqùFXi䎲OmGA}:*u f:@ʫRH.66jcGOpO- 6HKJU:Jǃv,3DZEƮqq7p?ȌK%ȧ$;?Qr6pP7`a^=R_)m>D3#£ _' Iɭu͋C-Rne㯄ssL<ȭ/R)|Lt_1Lk=rr 4/gEr~PnB[\g[{gYvRW' {Fem1{ wL;7&$xc0 n&u@5sCCձm8Heft x{q(aтa?Q%l4ςxmWI׆GC1kQ3iJh,KRO`ʲ4)%b6B8\pe;u)ko)#WSncRx{[sXv195_0Kՙ7>Tp5ٴl3S"؝LX睫[5m Q="u}pϘ*xbՉ#iM+@Z! Ϯ~jYݬ$?5mtu] %@݅:4h8ۃtu3; ΑO1A/r R*5i&j#Y2:$Z(ad@>'z L뇶6Z8|`6"X1_z' F-я?X^ A:?1;h/KVB' vOnFS ƤQ{=kh7MwXQp\v͓O/. N3HKRlK"q^Wh1wt h@3e6N|I;y?8t[[! $,ήLe"z%IކAkRl!3u8ځy?_W)AbCO!rza5Sn֗#<43y6"R߃CQ&>[# BHǽ{vekOTlq(UH͵h ݔ8,@tՂL{p/*L"d_y k,4 G̖bD>,.ok"D;|7[.DCA#ilϟI֬Dq]+eE _-- ڰc^Lq1~CCC9gNH8BkhJ#Z-`VoMa 9r$պZ-hkh ?C$ ^tď9d(8P݅]ڶw[wl;dn׆oKd Hބ(DInI M_(5)6H/Y1 QRk,nXHʉ?>df&6^EJmt{CCc`0ʅv5x<\9Yc}106"״!֏9dl:' 1H"z'7QqɌ#KR./CVgQȬ\ `?d1yuM6Ƶ8ZX]8^pwQE &1frRKi$GݜЕh3'{;;~FK37ku<pdʎ+C RMzƏ7)nҀ lEGyl:̑IoBS%|ЕsTulebA}Aʹ10A{KʘӺtjdLI=r PRg_LbR Şl?␔)![Fo wi&k^CV(t@pW2{hxHGRn͉eCbxԉ6GQd27\ثdS=\Ff*0ۣOP5(rZߙxQZ>~GAeN-jY7Ҿn;n?ӹ"Px}/NW:݊&׾:x" ꭥу;R펔 c䛅љElmG§a= h¨BG_uYnZ쫭FYs U"zM&:Gnu.DX5Xn;}ԫ%XO?~2&Frjj8 yA*W I9/ub)Zl: s 85J>~iI3Yԕ;:#hELם[ROd^GA˩f~Y!En0~/A Km>^WYq"<цF*c:xw|͞w%ehRgd9̕v3v Dgh>>?3hYDkgC(ʹƒԕSԜ| 2Q94(?OGQ34 fccPopTYaW(>@tX4`LGٞpɄaŰl\[9c26U M6f,'C4i?W~psϠ?kAKrŵk@I|>^xs?\`,D̒5W^w DMXf_8<%|8_왉pP1Wlm߃f?4:́_Ԕv M;k:p_sj؎qw]$F}y ,b'N=o0, ~M YR46+!}@~ujctCP.Y(x׎z?70WXFܣo3z0c8RGg0 TU򄽻w"/4֏CQ`[{Ocn]+{{ N!33+5]qpj' r9FDȬ)~: 9Gmx2-?sraG"yvUpa;Ră A\& ?#n 0eed~oq嶭!!DzP^H)>oȑ.ļԶ=Hy7S-M ?8ycߧq|#5"2Б lm#UeΤVbM͘jAc7Z ]> 4gb s 2WRsKg6 's8qzTT[R[w)I95xWj #!nN+zPڔ KgTE,?{^RDݥ=Ru^zîc&D'i74SJߔ&HUG[crͦ<׿~4}څh;lpAZ%XZ;tQ?yk1+Ƴu6[ Dc4Ɯ*dB#!}e>samhG3c^8u9󼵕⸈߂UyB;f "Yi=D =4&|C3g]~WgjhSIXU"1A5Fr4{AljwTt6</N \Rta| i>T.Wo>>xϯY{緷m,J{gg}v~)]s!?wXGFl!7U|Cnfﳅ:.@mq%臔Ru?.:aBֺE#Gg'yXDuSWNJD)21ѵVagWPqȒ s?¶@g")s\T{f3go^w:^"{d#!φt},nyWFKv„X4|VB~,˘_&fjp/WԍwaO H 3I`u1ͤ+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_Wݚw)mkBTxSƯ}M`HLiI@J(I(y0I([(#~}OLc1?6a6,W>UuΫ?s\>9 ZgGBW1i_h'W  kۄ>93ʏR)#g&CQ~̔ogI0BqSj*Bg5#g3зJY 8Hke5Byٯcϻ&saxeg:M+#2`Gh'g_BY: `m\O| Ji13^z % pʀ~-pD3/2K&,2+M2bՂ8mQdnxeˇC &~#goO8z۞074ɘS9s2zYi1'+va=2EJYL)gJE/vIp?{T7/>DqSR^B sީ4O8e@B i R:X d4ɘf fS-؅k: 3\.VdiީS_P {'Op Ȟ3&Nj`-|XB+)Z=)=v*p snDB) 2 Nci2 sV"ӗ7}L7 qCCS5 ~TCL+X Ki9gA.j]y>{^4Ȝ[S`d@/!6';fmDAL ggS%JwCvvւIcd׀;s `-=!cRg.9>=| slPSu >I7S_φ\'u޽P~s48c'xN%8Hj{(?v {nG;w'uvr9x7v;#܍u{T*d@B  rȀҾ ʏB,uu@ )u޷Ǿ `= R >eRwឰK-3Oj̬8d׀pw}7[x:`c^=v<2 ! oo K.Z-Z{~@ -u6#XAkM%xFqf0<2}؝83Gc" sX G6K8c|23'%0 {}s..9/S.xda؛g@TK'75 woox؛Xaֲx/r;;GuWXj3a gk0Z .g{iWM G9 cgxHkM,:s675 ß]fDkOLC&751 j3ڰg瘫gVXW,mkBT߯x;q'""Z%R*5j$ (6| GPbW(frlfB06;kfWm&w;SſdK:iӷbmNӕjjMւzn*I$I$I$I$I$I$I$I$I$i2joTwK| O;N7jm=]ls{nl~5W|l-zY{n7br:mg{v݈m.3Hړ6 sOh3}Qu.N'c@ڗvhwuwmkBTxK\E2 qF#%$BP0APJ4]l& "]dc"d"B|W]L۠񉎑DOǞ{3>]߷nչUuEA{f9%軠ҽmu;{RAFs}&\_0̨ۃ4_4㷤6ފ83g~kbEIwⴠ{,>8~j>残w Ì(O7S'O \XF+|x  3X/zM:? ^meĵA?Nk~c'~La8G:mboއy/4yKf45X&Ss`DzS)f(3;w`s!zYE y9(j~'0H$us5Wf$…2y.w Ì $>;VüoGJq Ì9$qb؛aA-AӃIigZڟ k=rmbWm"x*!}b\*)xΈu~O&x:>D?Ӫ}/Rrg>&qvUq 3LV)"x}j~qGP#VU2pia> o`o/V'xᑥbooo#)yQ%fgث/9 ~UTA#kBo XۋayDz ՝ 3r[so0l˥(<﹌a3fIKb~u!X,6=K#/q?q 3{5Gf85?δj?F#kֵ f8bWR31W}Zo {:yWR^d淟aCn#xᑧ9AHQ9 Δs5ڙN e'K>JPloƔ@SK5?U1pGX[0!PG|w,θF:;*eקe%-=o^3::ik5q}\"6k~[^xbw5 ~R~e~ Qz>j5 |5f8MCxֿ7,2pEx{ '^,e/V`qyf8g#aݜvU}2p679D:?L=u~t~ 3Gp6jgZVu~ 36 oE Y@0!G-9Q2w7-j~ݍaA?0!޼/&xoo?u~j~ob]H#ewaCI_;*jH2QBo `_Sf8:'|bm=@q'gZE$>H,8+ nδ+iwhgZVO|ӠεW9F;ײBohZFOa\ζPes-#al{RN-sc]0h;gXϨ;&Z3j~x팧9\3%I^NkyhgMkzFs&۝h+F>9wS>ǽs$1@;NjHՅv֝u~LuQGLww LB;vUgZλUy|j3hg*|vpiC;qi_EE:mkBTxϋNQRR,% fR΂$RTb,͔P6s#b7,!%I~~g3ԙs9ϽMi8_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;[tg/[kD KU%s[k/rZSJI,R< z;82gk+񗨟?H\#{k\p 26ߛvau փaݾQCZ,S3/pw}+k+ׂ^TﷵP9*7Uff?8:OC}l2+X59p?ao)ߟ a*r+F0?D%-;QACT?DQ׎_;ڕ?DQ6CT_J_}> 0;A9\ a*_?/ϱǿr*wwP{7k-J3_W_κÕ߇ߌR%W_m!K]+&|H\#OY{۰ym9asb>W /< ?9_{o.o=:DYKvFe~=k_/!WQ_}s>W_̜Zd-}};_;_;_;_cМ>[z7mkBTxݽkA)RH,l bci'V`coa!X`a-F|LN(بQTT5~YA"\nyS^20?n皝RʬFҥt7 ŶAV.\:Nm4/ӈG]zz׼"I$I$I$I$I$I$I$I$I$I mQc^emHO۞IRڴTaּwM;LG҉t1K/K}2f.)IGӅ /u&e4csڗC O-Pw.u:_Rha= Li;"~O0zR`"oG:S=1Yq؟'eLz6z!tfoήztf:u:q -3|JaLӥBzVɶ+LJA~&9nG'mkBT`xͫQ@5n)SDFPXAf"% |„|v)c-7{ιgĻy7:z~O),-rZ>YX|ҋ̲,/;%h#1ܲͲ85Z]bJ;9 Cx7- 3ׁ{?֟W43🏁w׹-uWԜDUZ?, 2WhW|6ӖFG}j * Mi\6$?ԽoYGS_GƔmJ)=hCJKޯT e9mD k6g' QyT\wRh5"?-VJs~f{}갈gs.Zl溿#Zuڲ?Z sCԿwɧũQ<T|{1Z*ϳˉgv#Z:=H`*yo-@{ó+Z4Լo ZRwa|gjl”?;ӢTBA[z,)\iU$>߹mЪHI!GU6H aצ U6_km 6_km 6_km 6_km 6_km 6_km 6_km 6_km 6_km 6_JR$o}mkBTCxAjB1EQoN:PK)~IIdHˮo2ſvoǿvoǿvoǿvoǿvoǿvoǿvoǿvoǿe4?I*ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;nvO;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎw}-;_sw_ڳegeƝ^ o7o^J7 4mkBTx1ja ARR Ha:uXs nB0A%4$AQlidf >7Νq ʬ擫-<;WU}YxwfK8Uw{5 ;oݪo??SU߾/zlշnA=TUcx}?a߄'j7j_P3߃g~UVOUܾ=$rUZ?Z{~3i۷g~qZ-i2m)홟NOY-e޿3K˼2g6yӜYmwa7g6#@wNmkBTx[UU?cHT] (""("z^A|*%z(2(„$:'+ʗq 2+I.,î9ƙ9}[{묽n{ 6 u\med^m^f.2ALͭȳ.D߫aw7m047#sGS'u>#8.ٽgׯ0OgI.瑸csH{"Zd6Qs!#`r/ ;嗃~'\ވ.,pS*tOte6_;vW`n*ˑcD>#DQ_IL'|2McNtd:(].N!r\0yl]&V Fg 9<2 x[p^e1r !czWCƹ;2H)RJ)|w7w|/\: ?mG~~ H>񌝕Poߙ\&7'ZwX/1 1^f>c5eY)hn3Kgw<փaiD߫h">? <*?Da?,zxFtSp9oB7ŪTD]: PD9p2: |ak\xN.;_,Tss>94<" !6@gtt x0H=McX w(EZ Bי[k+NC>@+1]yʿ<wLד*(:s/;ʿ3>0֓j `;+x~`+, yq"-Fcx yzx&A]Wi9 ~FlNmOǣoDsy y*p:+;Y+,5E}_Mg±城My\ʿNg^Ljw_<\yiq\_ϫb0V"5_.Ov To >73/%|ۛivw|79޷#ʿX=355_v^{u>{Z癜y!p=-{^k쀟5߻k}U+ұ!ђqe=ͪ]U.ߠi׮ɠ,2}ܗ4|oztyd7DI͞RG!\2][{']6.]>Y~lo-ݳmkBTxA w~$,\kjF6GP]FFJKmkBT#x=\UF"HZXBKBKmRl,,DPIF 6FI$"BX}3ps{|쳟uX`-0g9srܔ{Y̅ lC ^ n'jmV ?n'??w8&nVyp1uZݾ&1x`QߺYGj*/xre[p4Tl9x]o??{gMyey{=G?۟Ӿu3esuMٽ7m5 ^ n'~jhwNdۿ_v35pLfS 2UMpL栳|f,^ٯ}>J.bd:)xW,jGlpLfwm8&OS 2c2y<4[1jI1q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/sghGnGV ;EL7Cc Κ/hsD|EcOgXh[x?t`D#%n-_?0K/+q}Ӻ}tuP`Cw)EVkym!T1ToE=>\W%zh2t^l7\|}!=7#?=u*X7:v{~>5xv>FNLSHkc(Q.p#5Rd6׉y~7^p(Fئs3XUxqޜsUi]={HIb84Vb{$'"o9f {M?9 y%=Rzk5ߤdi`acwsN|sjGBLs؈gQY;9tfaU1x3}W7pikcؿ6kcؿ6kcؿ6kcؿ6kcؿ6kcؿ6kcؿ6kcؿ6kcؿ6kcؿ6kcؿ6kcؿ6kcؿ6?__m_m_m_m_m_m_) (v 9mkBT5xÁ 0L MRUUUUUUUUUUUUUui%e~? mkBT?xϋUeC #h.0pFkDmj?@ BZ*hiѽC_8FjZ"a}98=y󫪜8ÿ/;ÿ/;ÿ/;ÿ/;ÿ/W/?k E['/2 nXĿ_5g=1=_[{/>,o%zd={vVWOM57X0l-uٺnĿw⯾nUc l#W`:oj꯱/jꯆk;Ͼq{g߸:hm`7Y7}kƂ/mm5gY[Y/emcWF ZϮ.q+z=q+{??c?W ?ZGϦk{EEzn_ gցZ_>Wy>/UKNJ?t?t^?tm=>6O9vw=ؼhؼ'- aO-aKy[ ;-=Ö?Ö@Ro?dwT3,fCIR?l;aK?R?l'4u yY^?lYe'v<_zyj=ya?|^^߀ڄ&zOG?|M,ƿ75M5?|E-gmkBTHBxѱ 1AGkdƧ䤈$5$Jaq;Yrْ{msK?=o{ǿ=o{ǿ=o{ǿ=o{ǿ=o{f{j?ouОߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;VToǿvoǿvoǿvoǿvoǿv}y?\4mkBTLx[fchƩQؙ&҈!}1& \ )R$Q4J1iI Mi 5 m|.>;oo}k==Ͽ;:Q#ŷTcOw TOY؀Mi[ś'{_F´/pƿ0 ?@=0*4혟/L^%E}ƿ#^w߂z9b'F:S<lMu){㟯q7Z$(ކ/Kg0>5en|SgoBmoP?3h/eoйp6<㟧B7Z ͢?]MAw׽OWG?Dzb8±7鈹׳ioಽ+r񏫳#:7qt Ľ-4:.o۳isggG65i0 }{?*i72HNE:<N?#}߿!>[VG?G׽c+H31݊0۶{\ F!>P~CrgwGu{[sBYu_ۏK3>_F}{Ms&"Yܓ˞ҳA|1>x_ltl} }/c_= ]@{^O>G2p-<܋G2ku}/Q]I|}&{f-Au_7(^~P3tRp﬇55lxZ\? ]l=/ggv:1٧~ߺ)y)ط ߮,Rlt-= yЗrvaPUs(瞶~]73pB詘kY<0 /ft;vW81ԳSpX1u|4I _Fֳw*܃[6i -y3=I _FײΫr+ C7^ܦhoz6u=.e|L?$z{>W5e{U22ltPʈ?׺KK~u f\7|śOi3tsճyڍUWWrݓp0(aܟoZ:ūDWѵl>y!(iu7z܄J!pr]أ|M,~Ԓ=&,Q&J?ghb? QJ?goO {^'(^%B}l"Þ7΍Yx>iЙ^v?'m{أ3?{X>UG|+0j?6{6?Ϛ䙓Zr]/f97¾ڋ-۫O|gI{~_>a3`gkyFguR VCѓwmkBTIXxܽ.a)Zt׉^C!:(JB(6ddo$2kw'u'W?3OvB9vKvvJ ad-|+ 3a:a*L0ϏA5 MG^scKz֫ppxQAFSwz'Em {bPc46uϰ$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$Iz}ӈگf4Bjuiy7y7y?"Rzp2iTXtXML:com.adobe.xmp Adobe Fireworks CS3 2010-10-11T14:11:47Z 2010-10-11T15:28:41Z image/png =~ IDATxw%EnCf` J0T0 E]sX+QAE d$(""ffpg07=3}V=[Ӻ2(bFSm:Eh|IEB~ YB! uB!a}^5bIXУnzm7O 9;?qx"uyvNGV]'rݎ\w^,[*L&ӕr;Nu& r9o(Io040as{lzqJl5<Q^/)9!RPL'Bj BH19ŎB/wtяyǷ'BBHAcB~XW,"(B<7'>v”h~P̍<n.{a~q8`2ýyh:r sn<ǗrLf ۶=]w=7uh!Slmle}A:HXB!tB!ƠN!T?+br: =#q--%W8\nCSy't:-ˍqX<ޙH$rt:udx={nm͋??hӬ"t~:t.-NQT !b:!RcX'BAr]*onyv ޒH&r]w?qrZFqD<~!J|>͎:L$ bL&=9>~y=GP-Ma6ᦑQIEB~(B!5uB!a}>+byG?2W7'W8Av8@qx,v} 3^RDb~"\fFG}qݺ;=套QTye鲝r}V:)+ !b:!RcX'BsB9DtspEW7r˗x8+9r'+]n{C/mv\#ꄔ5QX-ۮ/5R+tx:ќ:) !b:!RcX'BegVEEKX瞧465u}=덹>}Nft:3Դug^Xn ??tpn֣L.s˶0R0 !b:!RcX'Bev](k+CWC禦u\wC5Szq8O=wxӚmƧE `7 ,!V':)BHC1B1hB!3"y˩6zC[{n,v]I%ܒdr#[7m7^vFqB,~s\IA>'BBHAcB~X)݋OV/]D2V~I122zѿ=/Dea6b<~L!:) !b:!RcX'B%"}S /ѭEt8i7;8@I0915 5=<4#y4q0sCp[!0ԉBHC1B1hB!ȔcJwsg4Y8"x3˵INǷJz<'ˋڣ!q:) !b:!RcX'BP=(ݔu}X 3X0NNH@.}ut:ȃⲟЋ:$zԹ:) !b:!RcX'BVeJ뿗pAN64|X,$#͎lhik+ uDuQ mx_O'GQ4XB!tB!ƠN!T?ύFtYmy>H&0 뢈N=!Q}t:ݿ'oW?=^ɮu#!q~ sB!N!4 !RFwNZOz?p;y[(R8yQm-}7_g&'&2 *!=Ml$1 !b:!RcX'BRJ:}^qFcSg6^(IzꅌRχsw BHC1B1hB!Fwſ8rނgrx޳8N{ISLb```MK[ʝ}}tSO,ۈ86یR tqԉ !b:!RcX'B:K6쟜=b,{y\wOqV8R;y} 015U9;) u^B!5tB!ƠN!T?uZl4Y\Ǒd2Ib@8"Zlh̤Sw|/o50~*&aONA̠NsB!N!4 !(?em8s]tB*\6;>4<}랿mcЋ:'~2J]5ju sB!栘N!4 !Ӻ˦ywӟ|ϕ_brq]tB͉d%N~O= m׍T/մ: !b:!RcX'B:ϋ}gz^dC×8;!M6ֶoޓH$nogukF}QNQ9!RPL'Bj BHSyB.k;:~?sʐNBH\y/sϽQň6S{  !b:!RcX'Bϋҿy9Kwb=IqhtBꃡ-M--{_fSOB-n. bl(SPsj>'B BHAcB~j>/JH?_\ ~ ?񛮹oa-FDuiM#USSP'B;(B!5uB!\v3F!>{ުիO$>{#1=$T<}ۗy㍗ʫiܣRWPWVGu2 !b:!RcX'B ϻW/omo8˸6:!$L7^y/\,FܷekU:@ABK(B!5uB!\%KS8m:x kBd nmlneӦG.馩M뫛Q7 k !b:!RcX'BmFr٥wΟ=o GBt?6:{y]:7))+j>'BBHAcB~j>~g$O>흧wtN !L6s/[ܺnmT#m~uN BHB1B1hB!O M~suݷ&b!5B__ߋMMg=oY0WQ/N1FB[(B!5uB!4*ݹ+jnm 8㬚BjxõW^yşg##ebnzTQ:Bk(B!5uB!\9*?~V}4} uv!Ioo斖~qEwK0JJs%sFsB!N!4 !Fs|;㧎8E!Kώ;;^{u˭c.mU::FsB!N!4 !Fb^D2y#.8Ί9I!yW\vw[SPNH}N!5 !:!RH}>o$=v]9;!d6bǂ/==t _C$ێT"b7(:*FsB!N!4 !]+ۚ[[q9;!dO&^~ůr/!Ht[a=.R a1?`j>'BBsLi!B!BH qu?ώ !͢ŋɦ3kNq/ܪ#UZB! b:!B!BK 2{uz!ɢŋ7~W/Z@3 *a]% !BB!BmJdBEH&?މBx!Ӌ":0}D}B!2PL'B!BX7i!榦y}oޣNUnA]:!BHA1B!B!F6ofCsBH}H$xW|P MU:@B!*acB`|߇㰺&Bw%kV@<8aHIS>d2iF{;_Vda9<ϟz?ͻ}Ewx >cj>'BBsBHCcB~j>'UW{~8T3488f^.d2Ypd Nx{G<yy^.ynRBz{z^jlnn~xڧLAVPW }O0]D/DP+ !b:!RcX'B\k_H$ns|8*a$y<51Ɇhhon<ɤl&5ݱ}@m۷vOҹЩE!P& F}+˄1N{GGrj[lY{_l-jimkohlhI$x<>911:999MS'[-A;vljjjjr[1}4(F~21]'~ytT5PB!utB!ƠN!T?U^ ߵe7\tOQۗd^.%2L&JM 1MϯYӵyH:~ŭNM~cu+8:1o^CYx˗._dE;;646Ȥ)qܦd<z{w/|w0*F{.ևEtqwqdz~H}2GTy}N!PL'BjBHS8*= ;Gq S:hjnnjmkodҩё[6}ݚ5ϯY?<8T6SQK%42wAx=ZZ[t*5L&͟Di!21>>;ounwqizӽSL>'B eJKUF(ul3Kϯ5w6溇z k;lmlttkێO?鱿=uƍ#O<8 :%F"y^Ბ GۺiSGYCfJ^!da !A=\M>[fJ><`yrjR :sY6UKh8_{\`qZblttlp`p(ؐ?K/ч˶ёTTp:O.۪d*R#tLlw8-Ï:j /{iik['T{PBꅨeKʢJ*K1s]:1]5izFƛ[[;;{{<ƻo͛GQ\7z$ˎ- *BvtMJ^F+Sܦ|2}k^ o}kw#DֶEMMG,ѽcs&N}??+&N :ݻ**!D9کQY)}T8]IWvebB=Bd1 YVCF5#DG9UJ@=zZc.SBR1Ų=65KiFG[Z[Z6ov?_-JGrըVXUf&A=.b.NLn3=V]~o޸`Ѣ]7ٹG!7AfISY}m]{CnjIXꢘv)Oz.!#R^.}i~1D}m!ʠ)$R~RNGBj#j ʦr_z/B q, +wgc!m$p/Ug6|^u/S{| =x}o|#?KA~nIPO]6ݻ,/6|)ċz}BRO`1!G=󥴭˥B*0=(a9Q4ŷ9OeEPy>>G )3y$JURJIG=QɏTͱxg^h"zz]vް. < 7:UBfJ~֙Ol #ڱ m*?tK!/JYU6oيui3aik2d[a:\7TU60ugnT#QG%1-F5f~k*bw],s\rP&BnLyݦ,ZD1ؤKF8%_9xիZgr\-" Ͷ]-mL6s-.2]7\7%ta]<!ܯP;S=muyg}pZZ[}k_{F6hH&`jt容?sm/`(r8.6˦|MW4!9U{VɦovګbW<6~R ۪J2G7CⶨrH(J`!*]$vf6F*|D)LHֹMѥ0m!J;~=-پZ}p_Q R4miJp( Mm#OFMb.4SZ +¿kpg>f3Wq9c֮Ύt*kvwl E/ي~*q\*}UL?vVEMk66mǥ/@9R}R G}3>-\[gݳks)=c/5USC1rJ+=}&$ʑn9 5e6MU$æ\u\GT(qM}NF]X:4Uؔy$Omcb]XlyC"qZsF:N雿hႧ{l ۶lڦB7+P1:[p6XTW]Lb~.X_ꇖ''{[[[rD&NDo}ӏ?M.U뭇JH)ڶ޴mlmS_p^ӥUGH5kwmڗ^RjCҬuQ`,ZQ!Qqk3\C<FUtbh`~b<ӵmM#Nx6C]^]K8tm]I騔[Uپ,EWڱVk(Ou ,K,T :жf6(}tu,u.SʚR85wɔ7jFf+$ qEw ħ<"X ax az~3`D>}-%#zz2W/3i!{^Gxvy (me>!@ Ag@?^(!ϻ6壮 MվӅܲ0=ldz쿾Wt街mD`͵ft&c;oouc:ʷdQe DB~9s}~ Ћ2wN&[;EBz7ct_׽]/O2<83|[#t._0ST7c@-^ 0mۢ6Y[ cI%m[|Óןsn0$ڜmp6JG)OZ-^NU^5_ۡ.o%&lRA`+χ+&aYe=a){\ eMUe&v3'^_$]~?$J}2!0 qSi7:deM& SeX~8 wBӽ矾l=ϛbK%.;t:15O>5W\hwW׸"?P ׅ碘db/Ldl9U϶ƏRO:OLDV|Ύ9h90~ a\fTixȇfK}~ԏT<T<}!&!CVrLCXfƲ̬wDw%agA272w?.ތc~/#|,LVz!\ס+M畹uC% Ft@D2:%agdccW<ʣz2=։QTB}fSgeGO ͥUdT a'[?]+XwLf[m%vbJHHL颺,,.̺*!ĖQ=G1>b;DG WGti!&G#I z_G0:d)q%QgM Z]IT̺#k/-CPe7?/MCB]uިND t0<2#xn3Gۖ{ FS{pz$%@X&O1gǃ#+gAb{}׵oMe_ߦlS!F1:Lbjl @N[|{θ1\$d2Ɂywr=^q3BU=*A\%|E.Kf3CQվd0UBF؎. SukZPW|ipb|t2t*~^OYL/&Σ ꢘpFG?c{QeΙvͣ'tal&QbeD } @; hS) *uϯI'F+ߣw!p0Op;fa?nq1pʟz'MΜ##vbC&?P\!_[!eؽֵ<:JX)' /Z@{3%"_ ŗHq_U9Yɶ1y̝OX"6}?,z,Z{oHRO644U޾ptdds ktQRw_$POMkEUh9>eqL~$ꔘ2NLy!?o[Zv0I IDATgvH&zmz)OH!|͇OvpoUmTBJA+Mڹ\ b[A*"yET6?}ɤ҈"/Q?Bz~̛\<嗟Lcy[OeH^ 勮 ٵ ;: ʣ AJBɌHܐx֝KG Ce UWt"!_l_`Ә1R:Ty\_[!_@^Ϩ]L'Tq|A;yN%)#Ar9AۦMj_C)M奮 /b*oUPWu>pǣGsL׼ Nn,6Ok?;ә>n5UQʢ'+[/AnhwTӲQFGmeaQ'yyɞoUNoH&@T*x%^w?0"9`-"/"a{N잵xPYcm?q_ͻ6#p1F\EH_zެeFh8=b+ t_l9v9bNEuVUG 3 zS"L= c^T9"?zuL"ZF;Sla~)<S隢 2C\T"y(B, A熃`4Ozv &4J 8Qq]G_vUߟ7DbOu4D nC/yǺtBjԸID *?Yϓ2qlUz+WųeqdԥEF]NP-4>:⊄/b:!p:lp)18#ڦEM-j|s5R|\`⥨A: &yd=%B}LO.ÅI$4uV nb c^Top"wEP ߌhyD0`tyUy7z# jC\F sd=>?tBV= m:TQBo*Ýɉ'=7fD<\r=Ҳ౿=|ׅsp:dSblJD׉YntNPW}htվVL|~kV.VQ18g߃ݷlmouI-_r_!H'z "n/tBH,B0*MSlX6_lD/U̎دL p!j!]jDf3m}_p;L/B !x^ya꜐ԺXj)-H~nO yDt[UBBH ̬ole" !t`ލ@|;E]'U7R~u@Def9K_limW$N!mO#l6K.ƫ~*Npmm::v*y]lvu˞m:6BU'*|-8L& T:Zd[~n6>u,OD.)BJLØ>J_u6%ѥdv<uRD8?A[Q= l(k6FXL~/z߄`'.N [ϴO#뼉8Ax=J2:r8~ 0#s,61o!0/3"3UuaSL'BrwlC0SR6c#A,mܐUqUkڜgxb#|iŧ\O!>ljZu|3tMCaK7JP4:=|)U8{1BI /FH׉*r I4#"˄`qojjZޗN6'_ҫ%wumݾu(O~kzT@u;u&Q]ܜq?s7-K]ǁ\nldtd2v-^ .l5LLL޺Q2]5\#mtG{6=BiXƗœak]=B/ų9~f<\G9A>{{zz-^l y6ƒR]CF_,o)BJb܏щ\&mE־:'"SP'D!E#[\ޤUk.cM *T)c/@5{ w!=ʗSQDBW%.NhFm}aW]IAT266P~DW#a'myx UY k_|tϵ2{G|QvЪBUWo:k]/fV $ӧ5@^`Eygm: DGJFBHy\mj8zAvG1Rj9K qQT7H7ꈀ"cRkl gۖ7'oS+?yy ??ݾuEfc1[!Z7Z\'ܞ$LQBr[AFPPJT׈"dvVV=g]i~CCe+VU7kQa:v~v65蠘N)M0̳&9}HܢUۓ:Dp |h]lC0r`e &Ծ(KQ[#Ak~h!>tGt6 zBV@-qs c3SuGxWCTB,|סx!=VTnA1R.ʖ,e?be4NT<2`f(U:Lu6®۷g:Xa/O_Il3" Z=d _b:!E:-5۰24P y+I9ev܃ݷ7!vd\n(__}v]HHQ V2,γxu~2\'5'VDR=Wڸޟ .s;g{,^lx15EooKZLL0]2AV##e{Rj-a6ӻ*ݗ#ާN(B?܁'%p oL2B$ z_It5ъA yQT&/\xFnu 9E)\$@`CWU'\܎E=<#S2BʅF>:$[u[_tBЌ`fF)@P%tS۶e,TbcO?K/8*'[O7^ja]&B2?[1&Pa\ئǦOw Y\(n4^G=/H##uyMOC.Dpn.Cߵ/ *!d썠 r\tCgOKuPP'D!}+䗣˟9gA;Q#f4MZ׎ōlt DmMOA^ <2A?i:Y'P+awE6!x6`#ي6…9c ?tJ| 3f! 0J7A-YZtBl3Aٶ Ye"^]gNܢ{~Oww} 'K6˶mruyAJ4 #+mtպ媵UˎiTt纾 [qV_}{M1ݵ֣IΊ+{w'iqޚu]nx uz\oUyP&ʋLUBHH"ГV#(o ?U0J;QuR D[+3 ]-`3p,e~Q4hYM x1ڏN1(514* ]dAy_ 7M~(3Uy/mdeFg+ˌm鄐 #nFkKd؎LG8틄"6粴ؑY&_x+կqJH!l_ujr4QFیH"G]a뫈jKt)ݫm?`P ''f3mDD"L&3LzOo흀c]G}@/eetBl"hAǖ6B\EHo3 :ʞg {$f b9|*El/"M]7 pp1MncX\tOp.Ԩ2qѮ +U"HmbUfJݠ;^3vH('~68Ìgp]WkO}Ǭx~͚~~~g)ɄFPN!`O _ o7ۘ* &lEr^Vl|/'Yb"OF`Ճ8@E|)픰'k$Żd- :ncS[ou?ubYŅ,c`nhLӈ`m#1=/b1兘I@nTIaڟ^RdG[&RfyYF8!fz/#X_=K_\طyM# MD'>R ҲO(Ep*NFG%N/MLT¼N:Tשu޷CCX\]庋{ M&Ns+0C`MnP/1*BM/B0{R۝_ݦv}j*奬aJtDғCm-b"xOEAjd:\`a%HH%#XL2)S)`_]#į$d#o a\f gUªR(v瑰q#,2|LH;w3<; $3 d":|$p0[Y؁+2|\P}B񱳛a_ M@GY&hyGqGc8> PL'q޼y#8=H1 =ץ͕`oJځh"8$V]_oWK(D{^Ӡ8o ܱ Z?$Mk}9aVZWn6xq] ћ .oҁ_:G眨-Qx;B ;w\bpByXnEHk!MȎ8f);nMsIwgN>mJ f=9es\FЗ0hJmۉRªS|]I~+1C2ݥ@5V%FXy^FM;F]Ҽx. ;:z=)]^G6 F8v=[jةˬ 6ğ'L*; 3x:v$j3ksӶ66$KZ y.äksk¼kkRν$߰YFyyA cώ;>/Vx7)bi/LmSenő83 vڳsb/[&{/ m-}NS,= Sk̆~p:!:l%n@nޚ l44x,ap?kBkB|έ[Xh*;#g_QZ1Hלk5]4qim֑t;gAxԶqY$[uZ3nuǙ$. P= n95N~YA=Rm i~mR0_%&v )[em"Bç oTuTT/-!0~t.jݹN9e'Bݕ|?PkCbqgք[9K{'m 6UXoF4qgfCHE j44c[{֠ay<7p[dw⫄!' gAXל ^̱1|U.+ k0  ^iKل{fpGBܦnWO5'^O4z= ?B>ӳV&>3Uq~D>OZ9%t_y8N8g%p">B_zh͘N:l ͞dO!'K}ki-&$mSZ9S'K4aRKfkiu6Hk3ovv qN(þr5}ךZnsŧtWb5G6E?g:L ]});#B[%gؐj=WG0 帮#Nvn'OfO.ץh>@f[|+'P{eX„DҠRva޵~fɅn#4?>ӛ"- ONo*o#qi=^v#VSae:^"5DvBe=Mחz,cq@YiЦN^6J-Ę8N9w A(7ŘTpYi[sBz}zҭ,,|.ŴѵmK&.6%Q=Oі>rM ?|+Y}0g?_!0!$ǴpaiH ZM$Ͻ4r lȝz:+k !62194Q#e:z4)ZrfstW8K:0;ygEl=cOuǙ~ aFG͵Y+:8mf4j%9۽ƮO>?33"W>Y#'uX½V!#>s7RǏ kvL0???c< oYWό^i 'W|X˷QLn sey$g̹m0օ>)tGGy]M4aQpo=O'sX$8ztݚR] u4OK;6 a]qf3@>?4#'#+#8mdNͺrJmy6rMuϵ9jkmtmf-s뜚ss[$k3'|7t[a:#?[]]3яٞZbv0^Zxr&q+3Lo٣9[dƶTFI餉SI HX3K5VGCY6-|40([#L >QgK!B}7!}'ew[fEU#t-MXϕS^]Q1]q1,gn%T e't $7:8wy=!9N&8'P's--r/ںlqghByj83H8R 102|f.fWΚC:8jͫu6ih&׳G0O&_S5аi qr~úuq5{Ԗ#ʅOZT<9-i5c~ *5 ,WX$a0m~j!]5m 6&'J>O>-.tľ3ԥxnqcN -. kV"5 N(כ42^G%_ާqsֶ/sKk'ekц/='r洉Fsx}6X')58Ǒ܄,Tk|V_3q w_8mx`/\럗򤭚ڥ=s6*Re9Is6?!p#a]M~f9׾r2j'LpS6C:;7G %n{%=)Gɋ/,:)O!8?M=Ӭ ~hV/:a^gx|N83^rk/ٷ ࢃ8 ^k9{5׮cgE\^hג9; +8M~.d=z7騿$_C~Fm8nBO,ك%[jA{PKK[Sji)^O>M"艳01- GOc`^LK[B{nP3"Ar3_t`PҚx^Tc:W])k'Q`}i2SEױCy8lA DQK84s 9!tNI4ʕ]~ty9ӄoB&OFE<٠j"zs7u|l,F E^Ձ\ XjV9޼ `i܅pgɅ`*mS9ڋ=Zqg9xx0+sNNQ-$9H,FX׎[AG-8{+]ӧO~ i//8Nۙ'>v١&6imw_ 6-nM% t !~$7Lﴟdڌs&ѭ59nHf[O C[κf;cNg!l{ )j=-}P̉賎]SD8܈גpa 08vV'B֥l:g3k7Ӵ[bў-yiiwtQa݇']Ilf>ǙYSGsv<gl՚Kzh"$# T հk65+}뫑rocB'+InQR<,5ۿ'H`p"3s@jD*?LqM[+k%C`vǙfNnj8͒c27h3ffNofti3g?QSsA:%q4u8$Aĭ%rK"zihmyo'{5ۙ !A#}AH6Z?Țy^lBS 5LA*3khz |'?u}lz35pBL;L#GzmfvVfmy\f+Xºv]s尞-q&<;:t:3=9ុGY3]#k83,&?nFۯєix+A!q€kw3YǴ&˴%Z/~7y2_#77Խ'S+_Į@iCCoLK!s6HN# keF"8ڮ%VJNxH^_q;h~YjrgXWRdo)7%muM&<5ocL,Mڑҹɾv5k>&: _s;nsѸ2N;vMBJ) $UQe|n:mmѲ@ÿ xakS?'A:אjľJikDnb&o}NQ6'ky7#zQHu1=6 H}ysVnFnf5a4u8YlM:0з[&K~t$tB h7K4MD ʦY^:B3iE߃'^wY}̶hy[ՎkM[qv_zelUg{ #ؕ$vB֣X;m(4%_w6)kiZW%yQ&xf>4Ax6vɟ"/v֤K(syfapfzY7kfOC_:n(p&a,{RLg!9"7X fp) bp9poamHm\ZA]C+NYGA˵5ft_pDQ'?+-L{qFE/-52-Ah!ӴM4@]*aщA`~GK>tLJ3֥n r@{٤k+j ;ΨP;vxc(JxN}~v{ՙ4A{+N T1}ay{}}/> lnJ,iv])GTQ~0Ih  \N9[%2R\^+kyW-?*$.+{ 0JhZ8J~%͊XC~:7<ͅrJ6>tJJ"fve7&N;GcYfR?k΀hVg, g{}hKZnnCdӶI;WvVmrڵWB=<8Zd2k>º$OEhL .YvOgy3I;c;k8Ψ) o8g^;ss=n:ma`C^gA!,x2g`?򒶓b=f#6XTO^}r| CNHYYLs-a´M҇g/] ]KkkkljûkVgˊ3;n7B# Z% ['F/o`'o{fbvϖ¿K=78Ese%ӳ#7ud&mmxth%v9gXhV3֬tk, ɐmmʥ&g2X! " !Fw7+|D5}MTO`p IV`+6͙d:'|{ѻw!fQثZ_#gz&+5k"|$!B"!{m.$% Hx4aǕsYSSV;nJVwvuA}{i"!, ^&LMr&ֽV<ϥ4K>AG0񍱂YdOK3paC;M֋k|qe: dei(6n$ЛN׮G筊qv:o8!O&o5#rƂi 5/n UmDjFɓαY&gV+ak ؼ"8TfepadLёh8Dtmt+Ļlkts6slxL 7讹_EPn=*r>o?n:mò9#q`Uk; 3ף>k;-'~Ac0Rjy52}Ě MӁl9ç~ݵ)F(NОguO,a\ .ϩY~g;J:ݦlȫe5C)`ua<zW#ZzLbW`t_٦r,и р{8Z^^- ZuNOv)i^?ҳNq.ȔZ{kbmc$$22:0 MPcLFu3M+gZޒ#팫mBy䌒e^/"&< ڬ/Z:ץcp^WkmSL Tǁ=K+sF_gaaa[ WIg,GϯNEŞbAIi_*obڪzfUjZMt_$L2B!Bć&kٜN.I:w%)˙QDQ\KC˾B21 IDAT<mr&ˡ<08}aq9c[J6,ܹ+~/3,[&g#M#mW}gi:[;v4O(!|l>!!DXrV:I:H/EVhבZb:g:ã ԭƒQH B|6#JО;ɼ.ix E55-O 4FRvrl0o][Yj-#eƲl9|;wyGi"5s#_P^Cp>Z6FK%&r;ΰ݌d$ni$aM&g*Z~z:멿tmY)kw%N>]=嘶lZTT/-qLMwg w%ܵkWZ1^hۭFګizjYô'N=7SoOqLZ -~)'kVk4ı4SdЖCaݖi8,ks$ގl!=?AefEH~ &kFkK`[Yka}X15-!_,>-4#7E:x?xAL?24`8HhȚb'MNb}ddaN.Eo"8 >GCp:x Mgj'o4YsF{5FtM'M@9bM8ڦRHkq46Sgk\_x!ٛIgttb*u:sz?ɏ}fʀ{MqBxi o/s;w,--s+ۣ@{7XeZveD;ђ.NwnKf^5ﳗ0h!#A(_44nB!ɳWKTD4_"X}Z'fل>۴ B:5IN0,9G@4c^Z&va`9rXiƱFʺsɲ2Om3XNMЌÄ%ΞKy&6%|1>r.jKit#m[ÙEtꩿ1[~`uuUdSQs 6U{UQkꌂ,[4o!,){6^D0 4Gt-TB6%kjP][!uy='B_eu4Q2TJFKimҨY7 Wixdת Vvmxl'>[%W"# '\\,p.tMD }o }9#gɉ쿽O?77Nߦ #X9z1ϳΩmkhJf՚MU녲ufK,J:S'+_%$_ 9aksb1sƱt+6mLK,}Q;@CHO}B5Bh R4Bx5~%MPGIKmk7' 40l肷ʅx!lt(z<&Ô4Os(J~_IL !dO' e1fy^?bfBH/!bu1}h*K4ԲF.J̷akvzP7r(&Fy䌛͊q.~ yωHpHEp֦TiOݚ^;+hJq4r4Q&n;o_=u]}΂C;W-:eKvii&^նn:M(ٜifwc?//AF9ka$L5Y.y5u5}$7=$stMqL!BBt2;B"Bds$[&׾Vudxˏ$ҧs9g.+5E>Nj>%kC5"&֦K5 m\U؇)S?jmt휨UWI'g=kWGŨ"5旰ޛVHa rCF3f!2A [S>Ksz͌Lu\ތu]0CB- ڴ#XkAYkH cD!A[c XJԜa?2X'j`LސHΨF, |N/i m2`R#B* 攒9r"|zyZyّsnw$ oQR3 $e0kLOE`L>ntW-{؟%ߙMrZQH:Ǿ 朄{;毺#IvI6Lծ]Cϕe{5w{5||-?ШUxLM+z}54wB0 xDꏉt3Kӹciz.٥bge_lS6U=~hZzgIP0ֈ|EF4 !G'80}1vU'Dxa >h:9RT/l\_8_Lm/RzX`BXiׯ1:ghu#dUQ[-]<-zamS?zl'RYvU> xa9Ms8jH?^԰Z /o ]AB&H,Uo@?d[0u5t3j &7 ,*Á/|aD(ADZ[7ô %].HCN*~jĈdaI0v+rJlZG8㣦/g@jxHGf:`z3rf%;'CE۔la69f*Vi~06V >F9!=A,u'|9=El;M "z|M?/~9r w9nDr‰%ZN_3Ji`;\:g3 pԴy9=g]„7 hęAu[m#G!'͛̚Wt~&\!F!NץgY04m,_ckfXih'}0z%C-NM_ll@g1AšGXLtp'/F.9 z!'OalcYu8[ac8%g4FlZS֗_㈬-VF鰘F6YmrIC3=ơcnNd'q0&xkϵfk/Dd-@pwҫ {?][Ҵl\ysRFq{ՙ&jet8+]^Q?`z7Ljpx-1?ymO눴eNki`Zy4hc!g( 鹁e/cڀ5gm ~ kmfiD5F({b<¹Dt+ 6,ش6Ba[8B+s!¶nk#up}9k_Tg,Y-`qsXdN #߿ǍlqkuX~srPj*wXIiduȼmrڊkdS,W$8JF KY8[s~+m?MvNj솒bc~?y=v/׻ޅf,///8xp7>A6rNZ:&fWiFLJ[ݥEJbہ!ئd0]korĺ^6{?]PHM.w z,v_ DkGtԞ{˵е*瞩Vhw\+ɓ >Ԋ` 0bDƵ<Hg %]ՠi~V:_AMn/Gc,'PCb/0Y$ԕZXVtlK:!!8oOsYֹ9C439^f%{J 6{mSn4rAm3J:4cZsdYA޻hkE; ~+Uoy-d;vQk/lV@iN3KK?[]B:ss,ƭr]Z˪%S{H4ۦ$kHOk3-sgeJa=]JMOQP?x.~Sg3k)G{Wj<.7" N}2A38&e=YR,/ڌY9[Yy[fXaaJ3= ϛ(ϊݬKyM2 g]!&vmߪ1ƒ-G#gb/a nMP_r<-fg8f hi:8L;/W9[1&ATG6ɶGvؼmrFf&h}Kn']ீ#,Ԗ)1B[mTnrkY㌃~ YID~jOɜms;7h6b4yFH{)5[4O_$N:rࣿx}tcac~W>n(S_~6s|Y!Ny= ?gw)6 DN)#*K'c' g$9A0Fug\;hkcY"NN_qspke3m^%W&y^Sgr8yk3FGxFuRUymp{ T{F -U~k "ܬG<@TLtoAgKt]H-f6~A΂~hm |2q[\s>W'ZHfbz\Lյ4%t2PY'vֻ$BP .Ʋlhhh -k﹃P!ԓ˥ .hGX^GX3cZcr_a$qDYs8ΨcQ\ۙlgW~VGIO6:oqcZrƶM 졖z9Ax{̃o)$o/no7Px) %?s#.g^Nw|Hq]7p}Z%ʖrQ-b[aWidwy6fM=8B[mru5$c^ l_d bkFI16>7+]M9H>ckl0 1]Ȳ.k3)D\8HoD{pa`C[rN yv0$ Us+'vmPG|k$X"pyuv*9sQȨ&+c&g LNJTFt KT%Drj+~4-MdO/#>/Nk}ch.p9ŗ{_Arn|6t'gX6P]ȲXyh괍zX+%A=?, I_ XlG_?"'#tKPt[8gkF*rwa@ͳP>LqkfI#4[h*[NƴEH'T %zkb%kӑs"/lm"oqSsNhs4S]n6Z-oH'6-=lFh>XNj:̳g{o{\D {=O&Y%'m4'e4Q,3IgVszPM^i9!=~7yce3ӊ楯=}7a 3o`t|tN4,pOo*gyiD(3\&>[Yɺ0~#'{N~1x[Pj7^׏ )EoiDK}/;2j:ടR:9nJ{mrƁ7*Թk (爐oT7s8%/%='pXXN ?;_?c 'in~++\D7\ ,85ܲJĖ3괁Z{S;?w.6/'Lܺ F"P)vеvGKogktIԂ,;K.~m! 1*ҳKukC/.%I:l}=5fkv1^¬TL"`lJ3ѭ0֖!ROOMZc0c-!x?k9/X X@T<.4^+[ nsx^CVg_3ȭs~HYu8f{jZC\gQMcZm0tI$\GJX["{8GI'˼ܹ9Oȼ%vڏg߿];?7Y]:vn>^.X%vΝ+?`4۬`WgֹҽQ1q? k >CL_Llni>-z糀&͂}A*=Jѵ Ю +*$c53]"ܿtzG6B){`1 yr7qD(h6ѴۯòW^?: ִkٟd3+}yX$z/a'wTjDH&##荟d}blK4DtM$ϥS|3BZ9;L1]oq;Uv1( w$iKdωR@i6z6 OMܨ8qgC }^"6VAsf"RCTKE!%Ўi|lKd;"Yq&={vT1I:{mrFM{I9;+mӣ ?Hm{+L7M{{KzV@s/~O8x5;v\ozwt:{T:ΰk-ܹ|jt5Gp0͙,Zۧgņݪmjv{u|>M"v-/DAB%ǭDs%ڹF$1ɂz!} =SG_p'q`5[ ZZ; d&Nތ; 1]VԈ 8ϛ怳kNMD\x'48RC4,BDp;a m؍ll%>+|c `r©nU}zI%R{8ILwju4?嶃=H0EbgEmIi~8y,sBIM)ODH .X G^sAX~!'tK.^]vVztؼ. 5p?n$mf MBDt界f1T=am,V6X DQhF{,±`ܠԊVzД*’0A %:vk'-zf[N i~omԵMz69Y)Ph_<9k{i&k6?☼F-h;{@4('t_yg{vnԕzvϟ97?wr[ncws'?Ejk9-Gfʥ5̬"| Ax*[Bi}:J&};a ϋV{"4 1_NLKA=%g3o=DHgt3F[a_ҢhBz:AZ~gD<[-VHB |yxy89l/$Ĝ8Hq6àfD}lߠ7>+K{g˥H5OH6_xCq*uJy9#q&GKmmKmr&K,a=ubə黇Y15_+Ys}ɣV@xks?0P'sy?&^w|øOr={_?!gIǚsY^G&D['۫N(Kǥ1=~qq v{~AAsXƺu˚![18G-"6#<̈́|͘/LOmЗCۜȞ׶>ζOk|*1ь.\3qkmr&'Ծh:+=FG [/Xy@ɳd,5u=o#&͈Mxt~s?UK;w>>dee˽^9,_%g,.--~cW\q'Mb9}Kҥ#:4{d#lkc3j&2gR?O^Ֆ/0CBbº_ukDD-?'|NP{\;:gE#)dq8x/p+fGr&פpg6#4btYQc^[PF,FK10'["v,ܾK3a ڀѾI ~q:nq{pg-̻88#gjW_9:)t<~!Dd[;IkbeNkZfMcȝеs/~ʓK}glaqٝN/{[:'뮹P_쨶M_ھ&[|o}Lmp>iFUSX3 K?f}_0s"+@^PO?G 薠]z>!?O;G0!s19ü6 o͆/ ȓLm3 B__\K]LMy{6aDReZ~n&K4%FpjIA(},///w>?+#.RP>@ʵ6{rog tiݜE~)66D ,gUm0|Ml ?WsEܮ$r&fX6 LOklYLFeĥ?⻁t4ػ}q[B)[35Q];gRE@ c{vNN@o*}G9 _}Nz%n!z6?7ntN [? c楉<m6WzMǙ 3 i{ѦkęAUl9 &i_p93]G!J5̆L|E#wCn R]7}l{A %͌,q'BCv1}!ri-O{8VZ{ll'JL*5\,MIX\487 fH@K @+!94;=F~@\/i^ՃIS:esYqq&Ʉ5⌔Ne^\M/m9yK^_WwK ,~v͝yJq߼o=o_;6&U&4ezޛsev(,Q]JS /&8dRwoMOמ`iFklhJX/fGH?FXKBzܷ:(0]vfGYMtn 2wG0aC _n4a] n5@9QR6~q4jC!.eWb+hz6qS InhVO'XONb4|k܅˄A3VQqqIVP" ]<|% ,ɤݳD"]{<'Ǵ_:`_YX\n{Z}5?7H_|8r'<=|'/nXsz\;S]ID:aqFGsut׶}_%rZAz-m$Վ[Po"$ޣ=B xgڬrk6%kבvLIH *!#Fj]/1a)"9Qkք&97eT+LN͸F> x(g|i{fO?{-Nޒؚ9Kgm҄!G碘8*\<,"^Ha!BD'([bG9~~Ou)kyԛ<88pi07L }iZ Mûkasy,[jtmc?ޝb>Bx3:Edɢz& xFSu-vFp Pruf}Tc/ߩ][H s\#, !}'N-ezԹ{b󤧌J_2B:>H >ǟqsY܌--cbaLH Zժ1Bxn.2kk2uqcpyp( 8"z,(E |N4*O3{YWS=d2%Ŧ\VGX#n2uBtM0+B6^ _u6 Ifsgl6w 'jgRKɊYLl{C##O|ס;/e9Ci޵혰|nu[&I%Xi4̍^yT7ho#-;ϑOL?JWBAc~s"}nu"ǎD.}P-1]Q/;#{81]IIϞ"k#-+A5piR/t^\DvVt%*W{5z%M WfvYE)5a\[%KH/EAthxk,ljF:Xk#}пidǵ TA $@eJV^GL_?W #\ ~Rކk ~/"d2L&KlKp٫u)AD.K)[,-;ӏ;%gx)yQZ=lj67Jel(n(Ox'?y57R*Jy"KOl:eʳd2` O|+Z3|7]5RZ[us*v_<$_1KGH/p}'BzJ _jNR§t^DH/e?bzݸ~őE'Q薀87>y W&!GhQ UR.[z7'ˊ{t-$b!|NA{nV2=#{pmB_H&d2LKxMz}Q=dgz}.M\ťL?xT~ӟtZ>xhl4Ta^HGeL?84::rWۗG0v1KB>^ 9dBX:^>m A>]R(Tn[ZxZZR񾐠۲- ǀہ(׵Mu-Slg Zl:j@it)t?ø/W,)b:$[]F)F|e޶EVEUJ=6q\[1)μ DbA%%e <3sUQNeIyS $[?FteBaL&XEKL|rΕ_7$D%&*>[[.+W@lPw痏{_rժϡRYl6j5mZZ~nd~,oWo-t.׭rJKghGYd2nP|ʔ lq#>2}.v|Ե` MP|4< p/KGH_li 隀녲uĺU @M*/#Cm~0Gٿ"d3)<Lo}99`U 7z}n0 oE^2ǯƥKCy|ݫC8\=U|43pRPAAXܰ1~Y{CrL&щUoT?Ზ^q& z~K0 kbnA@OW*K^ם^7<2jVǩkZNݞΕ11=4*+e>^ԩ a\nb%5*׎ӎ{{ee>ee2R2$&. 8kW^%kY¹|oL8_2 EY7:@=O~Ƴڱ_Yן TƏhUZZNݞ' ]z٧NfTH9GCiQrM؆[e2,SgF/pnZk"sip)nv2ϕ)\!4@GB5!="I*di.nm. &th`n m-F]J5Zb[V@Z%[{zzaH2-J.GDu(uľz^,gSqOAzk@Nł4:o}B ;9'DJMX+L[bxAEc}R`}]//|^fݺ7gUƖVyfsNݞ&;o߳jU_񋟹)sciR/kXlUWj:le2R }!e x /)c6pnRZ%[hP{Fr<8WkEXe0njS, 4i}>^KXKa7ZwK0X/7աﲤ./x(*WRΟ7Vʓ>Lncrמ3riR bXl95\2IJd\hU:o!lL9ej3-ֶ3eG+u*kdPqSF^b#b՗{&e/ozoxyJVo:uzj(nGm۵zU_\/=cv*ohC,}L&3_6k)`2)oMpXO^5A]Ӎ|4︚!iW0;;-GP9b!e 1]g>.O> ])ŘXcBY+DrbVpA(Pu}D7{-9g {|Ď28g/_Weg.>ѵd]X/GJ t9;g|˾ m R}/m:>>> x)b[n:gH,{u=H:Qۡ`PPvPֱ̤֫Z}*H4/֗U {+^S՞ 4f`ZU'Q29w۸qshwREH4{h˱6̮4>HLAyeg|\rLH 3[NUqolQzOa7V 2 KMB#ҭ]ICm.܋]f1y3b_t=E|]ϭTFcOV՞SgŶmvXz'?ox5ۧ-&w"k󎦤O9CuK,z&Bʕt1<7b&ZeC}ԓ^coҟypB~}bt luM^\B:7y .x-b5NƥH5,0&$6?j)}mIA~.JL.ɉ9qV%kU.&]f \GH{NbǞXAb\6ZzZbld1R>ח>XEIqWϚm&}Ng1eVDv..E^P}}>\v{i ¾W ס愉"2*[d.,?3|S62:jFqW|^,WgQLkLMMMMLLj}Ok9隈M*5|R,g2<(/p_籹S׭XT;pb)W w`A_"E]$xʠ #a/_JL:ӎ+^/WTq#O͕gu^CbVncTs/X~xrEŭO!$M!Q}"?݅\"$&v\ҺkQ۶vW.߇m-6b.Piƛ 3S1mZз4a]'V-t!:*dZLJdҢ8+RK\xξ]?+5 &Dؤ3(mTJfֽY;/dó+VZZJhEuj=\VϬ'\s&u?Xڱs/=oߣ?!_Sӥv]sNۖOǪO RL&IAp\Ke}'DlzhAW)hz{߂ (xAgݸ`o|V_%%O!杦wcBzwD-)bdt?#c7Xb&YBSR1_(\cx9.LY%ttKT_7O!øۧb+M:2]^ FzL)F;Mo} >0v$$g|HAQ-o ΰDt,&҄Bp⼐L .q=8۶{X8~,s}(Mͱ#>DtK cd=.dYVާ'kdd* ZfpR;sV{fd2=mv]~-7x?|ߛzz ՚-u ^L&S` oiOe$lۻkE{͟nO)|o׹e1jc:NaXfW쑦8V 1ҵhD Mthw4/81` N S[&jHuMTAk> 8rFiʺ _ri&+:>s?޶2r[BQm}Dd%l7N8ᗇUFVZ՞U20&P׽ѭ1tTf=u(0)z\&ɤ +֟:r+cS.e#e;!׵c-Bv<gz$#i27!ݲQmQ싥qO.еY5;$얅.EO.Unyr6PSxPP_*H0 _kR:N~Sq'0[LyN42E"%Ywy`>kk9FCT_\Јt%#Q{K(3~[bŶ&2N_.,MiM[$='A2^ TE1mNi]%k%.g!^IZ6/Ri6wZVk4 Af֭;?M۷G?zݪwd;[ӰFyYB&k½!\d21R_d:`70!s]6,v 8kKGH?ax(fhm,#eݲA,%5Ow,}b:e}^QE@+zk '>)p#e RʵɊ$ _a81 TTfKXbqs~&h{ڳ1r[s4pmnNSe]e7=#&g+hB :)"&k_ozJnꮘ9)O~xnv%psߊWI-($[/k䦆VG薈n̺Ϟzҩ\2<2rPi6wZG깵z}ݧEᑑ.kOJ ΉFFtҹw:+TiA̩u]d2K Nl2'+Y g{u>W>M?k* ~Jm+NJp_>DsmPՏ(KXZLY+y'G:9:7Y0 IDATf$!.n9k^Ki|f/kaY iT"e'f= .~^REJܐ\XA |- .%n,iPFBU7[5A[L/bSfaK#R[ 5ARfIi~=#U@}zʿ{*}B}#9'2e*ZYH( ^rw81[6e?E׹Ӟx/[JzrѸh]՞LYضuu6ݳs׾O|۳(:E!qlcO;]UCNjid2>ܻq"Ee/~I$RPlPNDT~oOo˶۲K>%<%{ֱDwK%g,t)8އqi/ ܄b>Nu~m[pyL2kDYCGBz~<[؄3 V)yJ 8رMڟ ML6/'e(nXCsϿ-e|Cb)ZG)&4H1DJYϥ`A1Z%Lgeh{4oTb"u3?ťő=McQwWjDT/;N藈_}S.[mjVkk^T219119yȣ+W^y>w#ᕥK*ל`!O̮N& pprϮ.3FpB %޾\],ۑ:ul , !}'.cחItfhe{P6X6vT] %\6_aq̽NcFLC2&sm^J1r{ˀgPX”QV'L"w] .m)<I,ӞI/Nƍ_XV2j#2UBQ-?,B҉-djϓ_&k9ZCuaˇBOJ[e['2y)m6T?o \B$.Hk̕/r ֹWͺc>"egmmo}ΆM./:j6Z*ꓨV4,~xǺx=_߸kǎ#&E:t.󖩂:qP(T$@%f{DŽMXm3S>Va%r[ ›43;ee;څtK߱^)SFw2Oz'6%A?tQ;ȴקPTp(nD` 蝎N9޾핡ܖJ׋D29&qsgh͊VJ*pW+"ڍ@3_$CA,CsK2/g}n8w~>C,ږ|~ʧ5I`vbFy:Q~Rr)Az1 G?d_'5=i/CG!OrH2 \Q)vbLwb۩V'}ڟP;a>"4{99FFF\cnQ՞IGeJǞݻ,[62|?o7[D^i-2",EH&RjMY2KP{f{H8Qt<>/?റگ#u\NeZĥ2N[ V)f66zh sIm|ɲ#ӥC"AvQTq#Oť4k5 =6wp*HLs!^ކ_؃1Vh'h9}k.a=~]L;Cyt|_"QSFʅt*V<©띖i,SB82n}"e{Ե~ՋvRnEc}r}\|ue2󥸯ew:7};.sbg7.΢N)&6BBkפ]v|79&?7'W^zfVZC־drbbÓ7mpŗ|ݥ{/$TϤ8}Q<&kBzJf9A|_bAZ,m@pΐeݱx?nӋzru^xOWhjb~Bm CqBy\xIى^URF Fkx*w&SKNYH1ڝ>_􊣸Q׾7jr[) DtKT-{}# ӥ*81}(*< 9tֹxZnND3тY>sT)>oxpϽP9!l9ef2mzhZ׶3 a"N{IFJC:|xYH|6joe?{&CCNLS8˙njrD/nf&h}f>zZOwp/.[XѸfK>dݻv]q;vo_>xcҝ9VzwKDOIjBBfS!{&;eB~%LXdRݏ~~ [;Lm1s NP7gzI!㦽n~g-MHE,]B/kVn %kFV?8R-cb`ʜКomg'F'Ctz[l4B:\1r<Ǎ)Gq#~-[I5('C2MQxᕥ:ƺ̢ɌfThBo$KQ:W ^ َ1Z*boO5T}O̔ډLg/ 2.;qa.qxxD13WA=nPϬSnыz>s6=Kki&[õZiz̙2o{d纍6_Onۋ팎 ZYlV'b5j=EL Z}fkVݕmtRrޕOU;'Z _fl[޻.RYMq\?qSp6[Kqb/g 4qsߌS;HlXpA|$t/et4s*=;< 'Rp.YB_'"6w/K_n?>b\S*p_`%NȊ-tL3i[,ϙwc>zS#Cςܧ=K C2s4Q4>!7ЙlBb5(C-t9U/pjKyLfpy9[t֊b_h<6dFg?vXLC'.b8D>>)Z=WJ?#\2i5seG-Sluy~l}R|G2InۦYh1f:ʌp:^\ۘX TD 9}@w,J/VnuLo\EXVzw+DW/"R(}\(V2X_n3:mSYv"m\yVepYN4Q2RZ,Tfmg2)ezh:L 8@ǘNЭ>\b7Nګ>KtюEy%җ}ٲeJhYi6k:3ٳ{֬__uvge٨`龓XT!=Tl%2Iڱp?KtY{Cb 1鄘nTp> '}5p={ٶSp{eؒYҟnL/ j}LG{A,VF;2.М2vPKϥy$&觘nOqs%?{ WČ3M }Meox88 ߇pc%pRJdZs_]cx2OΏ\NB>>X`S>g8PLFG-`}W-gߧ9$m#OAdq}N[buLԲ8RtJխ~)h.Iѵ^*U/ {}hZfs[^?zsLf`ػgfŲ뮾/~;&'&Gg;&ǂuS9X1!GN b~yf6~c4QGRavremk63qޝ,N!}/Ξ}7,|o>ȿw6kΚ5)p#eZ%|蚐ZDX?,dhvIȠL7`;N~^٢6eHdt^hi Q{p,'qUOǹM٣CzX|S~s3~v*;[(v8۲ {L1D [xIU t~N{hd21 _yӉ"[?Rc駞~Շj6m5wTm[6:4<&pBQ#o5 qQI\N`S<z\72\`fHS9&8ځB$VY_i6dQ& 2S+qsX} )l5m+}r'M@ӮI2_S؎<{æ~Vlnټ^-_F&ÎGٱbW\~Ɨ| 'u*HTrDt- UK|!A= ^QR&"vXbIp~?N. 8+puV:(b.3ٛ_ \wTpnU`yqىw65H=&^Rl/}bo1]?;ޛ̈7njxn 2ee/uC?+kV^yѸjd=ڽkk׮[r_߃]--G_״ MLtS *;;Cu)||z[.8@ngS>Yo\-,n!}?NL1KEPH| <-I;qWq#m( 0D4?Ct2In t|-R)JV*3Wn)yltaQ d⠿^lx '#ŏTB8x 9߉a\2e \OXA 8拁 a\zcpfQ=bv;+nSBL)W+$kfo}܏]oh-V`%ky(kFHL/Ծk` )7?u]S|  󿬁qAo6g߲N 7sqz.?Wp uk>nTqM1UzZzIօߊԾ\²7u7tK@l9LL<걑6J.bF\pU8%kIjp쥍F+f#YRwDI=ȠLbnߌrzE E) yO 5Q݊_IƿLV^)롗vLJ,Vfe#Ә 8tp(zpb9.weA0{4}rɴϙީS}!ؖyEϢz& ~j>KKP(gau흼n[{cֲgri[.j5WaELڷgϾЪիW92y ̵7]{C|߂ ˖-C%~Dފ|1_*dF/e .GK1]&SB, 8{<.N|KQ/:\ ~cq8' 7|*n{)&qոK,;4,,= i5^㌠Sz9`p\3 1d1ݯ׊2?ͯ,gՁ9EL&?8k+.1c)V[ֶHAĶ%k*!ARb sz+^{CCC?jZ;)3{;55 ֍^wn.CS<[Cj؈uֵžc(:\^-ej<ofr'34[dR2X)i؏kz'8fs Nkz+\0RҗBKL@u"7cϓB6 M>)]Pb%jPTqzaHDݐ 94a\#X&6_e#ǯ4#<&[MMHDY7^8mm_HdkF7O# IDATN,$+Gh 92L}_"9̈th7}DSL&Yx+-'HN%M_)5M1CX_kY*3,[Z׫s?/(?299r͚W\ȝw+ݲؐc=rXw"w*&b/Zf҉!@_Y#eƮ_HU5w>e?O7|})4pBQt?V_ oN/ Oa.94c W_pq}P?(>FҸ[|,}z[Ir{!82]Rş=rz'j}2<+H5p)A&V3׭q<.~{!9K^̵EǞԀt+D<q|4c0d2)FIJX/s.G]T:SL&/qs$8Hж@loOӫXVq{-Dϔ7Uk׮Ϟ=_{wzdr G k"k-ttJ|=uDFXVP{u?Dڳ?h}!4ˀsp}8Y7KIu'/ǥ_*)8A]'qi1>2{ioDzSB})k"yhʶbϤhM>&CTfkq6膙5'tHXzc^47_^ʕkp JXVZV+TYP#K|~?v'g+U=: <3 8)߻[vfRn9jL&3GKÿ޽@3 {C1ҹd3ۋ1d2LWh,+$lYz<ʺKaEm?tI'Z>fZj'ŵrp|GV]jhxxct5Wn~p޽b(2$w"Xk$-AYZSLL6rhAR)AH[㟯{|K}pni-,;pZ@8LO^jlvW :_ތ eZ e%V7źuH{'fXzR}c?҄=h7Qʺ%uiF &\Z2+qL>J Ъ\!arpV1}ڗF8[k''s :φ|N,^3x$3uBL&N] \Lo+Eڈ MA#,g2L8g-%BX(6*&\ɾYmV.̛>4F**ڋdJ޽{<裏Zfu}xxѣ[۟ CgnL)"7ϷT_氖^N] DtTjYﷻPJ\3SqO.[qp~Cc krK$.{w2 vS}Yގ.8ٷفpmBƄ^)F[6eYfHr5udt7q ΃}ĉߥc/oN5cQ9m_ DϕO0 _sCJ똥Z3՜P˔/e7d>skNvuH}#<'"auLfϙ.L]ڈ Oa0d2e;.ps#-S _tTh/_cY>M?Vklngjjjj޽{juիoݺ+]v7޴crb~ 9o-aڪGdySR??99e\#iTwba`I;Ҡ^O,r} pYs7K,o0KGHZB)k¹%w"gtg'wvl bf $GNGKo_K[ۖhQ8K(|N>UI^Qc3k(b_|7o!ܽW81lAӀPzNNZ޶>W <) o,VE}rDOKÚ/0TȺ1?L&{&8Ӻ[zhK9c磬P}'UkQRy&Z9~F&S߿qXcيc+V\54<[^0TBzf8tСlll٪ի׌nߺu_~~C%T/@?"PY*7" }wIvl)}YdGq&-U[kp9Kabf'n*eH4;÷I(r_t=%{-#핂ض_ -[bX{rz?5't|m9%G)3xr(Af(*Pr{}\:+qBYX 8y"pah'ˀ3r63"tY9EJ+yuf2G!K[+O.1#R[FŲE{]gg2Lf18{X+5:qPW7L!^aZjj=?091qVV[vhtttG>t[rnyWرf??=@i=DZac>"z3B,e=(Cٟd2ك6~/мMrfAM} Bz̖"_ )֭Ϗ1wQ!*Cx-`9.jx._h2Y._%2ON ]㞏Ǧʩŭ_a'?7䘒TpZo7Xh2M4}=(p"okO~PS5DQn952C5Чq%?{ eFu:1d2qpNs`(,MBBt*cBYƐU^?'zSj4W^Lrry3w=S>:Ukk֭]3266vѣ?|y{2rZyh|;w(ev][cl#Pg2Lse8plѐ`Z2g?3cX\ ݚ=$F[62VAtAӋqz`\nYMDEE mCʛq{*@`Iiൎ^׎ C|Ab99b=S6~މs0|."m>Ռyg2vQb6'cF L&2CqrBiP_/CbmhA/|F^7ntٲIը4۫Z+{ѣ ۰aò=zzߍ|o|jjJ{>Z+ EN}Y[]W'~+!K~%旁 JS*Mgu18a,9n_έ'Hq"6L xGh"̦=y^t2=XoyL&tpsDΛ~="8:X:eP_%$YAΓ׮hS/]pVպ#t !]6qo[nw;}w~KRBS3Lf~l`Y[DH4֛8?懀|g+f$.sq`v^ tMP͓+Vjw͖BeH]YL<|WrU$o;6V9T4/eϻ?I :!e_Z .~?Y]1i's xr .Gsi3d)FK,_:|,XR3L&37Oxn;ޱ)uxc}i:Z;C^b_jZ*YHi|jxttxͺuGFFLNͷyUOY|sЄ搟B5A:".;^VL&̝)hkq#/&k6o=U)y1< 0>i~fiGXBySc|ں64Vqk-t&'& ]~ɉ#_]}GŴ s,DG*nk֭B0Pd2؏S&^DuK,2HQAcvZL2g^mfOy,;ybAuZ<ʺ2"[hnV\ [(w=ѝٲLi ;}&-eB!>@ :ZΪrsk]?;܋ n('фo>e&2'52sۦxd2O2V=J[)d2Lo)FOqzNTLN 匱(a̵0'rW*ufsG=- VV]644|8|׭uw˖ϒ%sX;ѥB(B~rw"ևKLmL&{p7QR)Ƅ;B>?m^))SKO:POMz̠QJ_NWi3#k#oc󞧊9Ŷ0j;Oq{Ey3IGpZD-Z^R?  0.wˊ.A84=Wf4;ky\&Mbϴe]L&?8;rj2\wm񲞶-O~U]B_VyCNT3(:mذ~dll?w_y?!q ~:F9!; g>7w Pe>lf2L86G] 1A[8;z9+bg'.3׷qĚmL*ǂ84*~d ޢ,Gy?U8gpNA+(F5mɑ<>nT9?0kȏMokPkN*NH Ewpζ87ȔֵӀcEP;$kDt,ԏY ߟ*z#(?rmFf2LُB؇H8 閨_=_\W?@&N\&o.[6oB ][nN1{EGG K1LO"NEuSqb5Z=/%-Eué=2=5b8(CR(˭$P+b?'؞l!.YzJ L5ठ \`C~Fsdf#6 R;d2rR̩x:濚b[͑L1쥿Zuϣ3) Yvݻw|߿z_VPqʲyq!qZs㕣}d2g;p.GkKdjׅpQQ\2yHRXn}-S`H~vi{;d2L&9GFLLJ*J_ wIN=UssZLY_Z=65u[ٵ2$jxJ-\{omK;c+/umiIB2L&3wvq#'ێWh`n:6vhBvʽ=%{BzwDeA-Nuq#݈˜} 8x`Q!];ޚZWGPoro0T}Z/OiJжWivz]}g#EDe;q(^\ʝCVoݫdО0d2KqY,O_eE &ov?my|N>cXӺg$SSSS8vr͚UCCCVuw>+sA%Ey'bykc:R^kк$ЙL&v~ [Hm/j˘0KnpZ#8&~h;)[BeQm,bzPTq&?H)B^HD&Qo9j$E=_+AX Eiwҁ$PPn=e;?8k_J[`R:&g2 L&3CP+ӎZ粎d2LyX˾uUSeV(Y }?vݺh5_ IDATW*ʪξ~f1wϞ=cãk֮[7422sm_vuxɉW݉x۩;Sa[tC`m]kBd?df{7dzG1"8߮l_]m0SF[h§xF8[?Fq܀;r 薠.eThe@5mb]Ì(UOܯ U\@弐exyP-q>B]ᓕxi\8JBώkd8< gpArνԀ|ܡ7h7̬-4e(XU&|ddcgCt7ooߺaȲ>ySR1Z/$tޔcC}:J9bp&􎝸Fo#|߹/x[n&.%ۀgu'xLM/oGΊBY B"n1!]ӊ,ۇ@$+ E'_/nkp]So}52kmhxIy[lľ k.1uS:Pv*YY1n'~KOiH;\ 8Ӧ?wK {pY?Esd{XZ&L\ŘC1m3L&3؜k>g \ +!ŶOq\y/yz{_Gy_- KfcUFG-}~׿;<̖,nߺ~o+C , Ȣ"ot\fD\w@M텭m]ܪs~D%}_D:S`',]"WW['ڷp8K`^>/7u:Ǘ,yJR۷uV\nݺ%g-]w]w};sId9˫%i-JsK%iRݿq26>fع}Ǐ9rll|/[b١}[?Oc5]rJ ׮U<6\Z\7o'}^0iO%^VqX|pزM[HfqOFבi|I |f;&׏O壴hNcQYN8Ǹ2$ 3]\gUU> K%5Vw=u kKM1ar^q \=w$Ю0# 4, J&J8/G e L_`v٭3KL4c5]a`aiHe=. 8\/Ya>2dqi.?0c(ȝB}M5\3}+k^q5ojOw&G=wpnd=w/ou[w罧Xǒ* 83Z{rst9FS祴v# A`-&gz ;_{Z&n!G (]/  2,MsWT(vR",ӽeCe݄LgނCJ#]ftmTqj?±TI ^x8sԑvoߔ(k Y3N \u)&;ӧ ~1*K8(*{Jw{)Ԑ8 C]rrw4O11q:д{˖.}ZYh:t''/[~ƍW\я}ݶ皼9ĉ^7M9/ $:cT,=G].0]uY(I7 e9'i M镳3HG 6^wgw>„R+W\[=^A9KIJ2t;C0;c*8*AeOEpKب!SUxxQZHµFR(s YVʇ<KwawSXMpr)a0TA Di3nOnCXl |&ƪ3VOw8 *\[:JV@~qi& ? HOi6`Jؚu{6y̽&& V:tࡩu,_r'-`N*ԉ}3KuH[t^:Kޯ޺fN#s,0+~qڴR_DuvO?xsIQNqKXp#U`?w)(L̀m ɵIDi7yʽMK1rOYhʃ4 ׊U?K8r c ;uWǩ#o֯y;LZXlY>DO\z՚u,[bC~?qw1۪kX8ѱ[᥎^;g;Hi4q!MNtyqgn&,}tԯ6q˶QH9իsi spªcFװdmKrxYZra8K" sBf;sYn#4Me=ay|$6rk3oٷҷ㼤,mҤǁ81K\A:8vcOs `8' 0A ( Hќiņ k3~MX d WO$CS,4xՁhyi^bV)~%JghY:$$8Nxs #!>[^^|?ԡe˖=Ǐ?zȱq˖WZq㟺;nȿl=rpt;6C^.կ-gi|N;,4 F4XkaZ =qO{xa5o[tUr쾫VJ>>xw!|6f> |m[K3^sk64͑.XsKL3 3drrU?]8 \NXz\F4۶ԉ>^x {x z$LjbRSDSE[sZtNM#KSU;'LL0M|F=/t]gp< }FS|6 ZuB24o(qu FuחҖ~-V4q0)HjI^C284-};ǣ8(M_~05uK/#8f}O?rr֬YGyp};n cWJ+tuu\Nݴw42CIWrǚ\)ť80mcP Xu>זSR.9B}>I˯83,',dWtYr\گu6<39yhĄ;҇Ǐ8|,ٰq+W8pOr]񦇎;V}ΖyKljnsr9k)8!#.:, =)뇭餀=YPAZ2@@^4層C}6-~Ma9&J_CnF6k=-+斝*=g͐Tgzَr"wMuCX&d}5üdj94=wߤoAOsIK;1hJ*m)1icDOCT|}spab:! .Jމfˁ/Mdl!2*9vzЎҏZMi`I{{\x[8H/q^F&|3rifVՁ g6tltK7o~FgrIJe!NZ={\jŲ˗:y-ؗ>[w=r}.ɖ9}J |Vx,?\|q,NJ;G8¥8&G8BL188S[F".IK,۽h`}3+G߰F%95WR:f&9snxrNCh3`+AoRm26Dr>Ѯŕ̼ޱ,| ajS8L0Nsʬe8ЄK<:8Oǀgd5LL+#!9{9kI?Xի!5CJ\vKq=U4j7v֭07ŰsiEn6]+9lIyu\?r,'C|M$Rs)e0v~ "8Op%y;l\FXy(|KFW~'Ϝ9lUع{l͛7.]:O~>{ r_"kz|R<HXJۗZ][ݞ#[}yI}8³ 7w+L7Y9*9FtwmFF[g: ڭ|%rԿM bv!a3Z9%Wumkɽ>dgzia ZSϳ3ougKyi~O g50`JK{)ξJՙw?qxA0IG֙Y^4>'b{0+}+pu{8IhR%@8>%4CXNЄI}ф8,A: D0#<9ÉTsՖ[dJRI R"NS&3~1x,p/p7e3ѧ_7lxTux)N˸|9׬_/}7ɟ޸_?LidbysZ/4.0+vfҖ;,<Q'mYR&Q-^HOs@tVzM뀟$=bfU0e-ToqS (2v,2Oh3 t`UX ~y5!l;z ;%x-|oWNI߂^ĻոKR֥F6v$j[\a6C 9 %a 2pb\'2&׉ߣ6 &;3ʔ8ze)hh`m{ڜq_)V}蒒PZxˍÍY-׶ ʯJV5o<;&g Zf{*Eߒ7lڴk^yy}3GVXqaH/U:C; 0{vz3 P;ˡ8wkT|'ݲyKˈR\i MqO~0^RD[r6뵣 KMEmP)9*$ú^4>MVXMX]B=/)%Q-6t! Z;}nՕ꼮'e (A3(3)\Ӎr%IAH jkuE^~7 *iq'q!HpnfF⋿k:b Ag6'?q#k7lXjU_ЁۮϚaƣ:S}-A{!a1W/ϓ:yrڵk/`5w;dʕV延n=JmڒCzn[K{.- FZ)Z:w8Nú9¤s_qgx8Dpo"ȬlG\3szf\9'zԝD`.amd<(nG 3?d,Nʊ}4-=>nr6Ԏ>I3b4ə^B}x#r<4o+q%3խkh OIԗd jeXUW*tI<+}a}yp:# H/Mזra e4a݁xM2hJJGQ:8C_?YĒ1,9F+[6(Wf:˜rU\PIW$8``x?xS/=|6mj>hޱsV^fmW;>qtTj5֒346're=i?>J껤UJ;Nú9´s^nqDe;>L,9e -mD3E 8C{̵=[^ !a`3Q;(ܲ_Ion&znֹj˞ L%|pF^5b¬; Te~ КAk k[0Aav'1<և 2,u9Fs^ +Y(Ad`ROkJN:4{If;҉%aª3P^kԨHNPMAHI¨&jΨMjs}T~45Wf>,Sgr2)RLt3oPguƱ/%,Feo?}-ͱ/{+nZVk6}+W,GgZ( DJ6"ėF>8'&Kt+{83<%L[By 8FX9蛄UbTUc& 2&h3M5ؔF$ˀoYK'|cG.)ʷ[ 8KR:҉;ǀWZ a+&unՙZf8',~1aDhS9I7)I:" "h!q:i-S ⠵]%38,E7> %lXn8͡]dMlRqEΙK+m՞~`<0Kh8Pw/s߶b5V\ЙEvl۶k9l:kbw-|曷c%2&s 5Cʣu.GH#0kWܱIR4^J/Q&;qg=~}𩡭G~K,MKtHItJ+Lf\>0mfhR[|0>Ma -!β/8m&z<#݊ʊe)SH2F`L@1p~Y BGi9^1?\lQ K:K:l-Q%4Uwig3~^/eBkf ߔ;0vrl Ҏt,A IԜ薂S"v'}gphQ%+(ڹTFӼJ+aA#jef*oq\w^c9Ӱ3=u 3:ywX6d⇟ybjjrҥ:S;^vՒK_M='k[|IܫpK?e<;)وeXLjdH\tn498aBK4_N޷N턉mė[\[ؗ9 KoXJ*>CmڞTS" U(1H@ /-%eF1gΨND%TZn_ܥ'Ɨ+ki#;$4xt^ԯFY[^-?q6_ =䬳Ɨ-_>s|:y&eN93'{%CK#:dINigšKPF&o I0^y~e9^OϜE[?KZcJS0ϓZI'fka%a}qHU{.Ke"o4uPP:#ݚ'}YOzΈ1J(lc4әp xeta:֚ynR'| P紀u1izY[\_ʧֹY\sP&ʼ Gmҁ(ToTNNoI&pk_'35Fz?21O i-cg|/(`KblhʦWXNX n>im.iTZ޲[8h_O2u*_+/ZW\u;{O=zU替ǎmilZ 6ʫӷ­-Mpܱ_zF&oqzݤq/gVu%AG:3 pMǕZ}b/'EIwt=rʸo"ڻМmf;b|RC|^4~cX*3Ϟ sF:;cʹGT˺LF6e3o%s3oS·]Q'xI%>4’@rwH=Qౄ*2\ 5kvzuxyS@ho> FX+ZҨ )2R/}gBQ:#T$e %IK$ŷ[eRky9ISK $tIqAnV5;}< ]{/g\k':/Mj}Нw޿;s|_k6Rڽ|\=RߕAi6h$ay7D6 'L GҴֱtT9t8^Y~Jp)m}āq0pg7R+/ q4!jk$#$XoP gp.w!9)![esv*LJf2oߍbag%rask3suܤ$}vFQswTF ,~qffLY)ޚ.m'a/",C$gFIizZg)ڱE/ꞇ;iV}90tZ}Ơq֍x:g7if/ Cm4V0G I`wKq)Q@r3-A ~)Q2rKsͨ )NZC94AS̖TߺU]}|Μ>Yi4'?qGVY7>ǏW˻JmV1XÀ-%K 1qn?D/9G HVgt"I -[N7%}Ki'R]<"bE%r%3H\KYuة>G K^ʒTȮ>r#w h3]kB6L~'gNK4Zʽtm:+}-zoO{ɗ.5in5PQrmHr<_zgP%8a"1^2;=o :3AbaQNI ع$ KcQ2 oK, kar"w#NYiCw4zIDr8BntrK'\kvW]i,;m۽~ӦuwOxnzd:* ::iK!^KD>) ,Q¤9~Y h'՝5[Dڡ::Q;:!Vs𜽠V+͞M49Dv)MOi[?:64?M*wms鿪S.u> G-AL/!oYKW3oOu;Vrl6=4Z!59!Y FX2Js)W}Gymb4Ak0T:G')K5C(L3&bkTpJiSB8)Ur}Ȇ8\3DILäj6Rtsm5Gj8&PO)ɖ@6&aW<ȵ5S 6{[񝔵udQ&Rnl %i#k˥->nv>Y(G_lj/or_tn%X2M:VٸzS{OەQAzUhIMKd\:b"aqcVWQ²z-L L[iμMgdOw-%T(O6sj%i]I |O&B8lGwUBl&ڀeff|9Jh#Kx$Xx* ZՄ3 7$Ǻ%0߅jA2Nv>J3A!qA:cY u/^3#Kvl۶n8|6:mm7u-N˟%GbM%Zԭ}:/X:&jהڛ`&Pgٹ-Yd]K&ޯE6Po3cNeV4ɒʹ%2V+/V;0MwwϴM o^|6pqj)^hcS}|^sX L¥γA'3χTzpA1As9av8*LZz37;=`P? VR_J4~T1K1_|^gis9EY,!]SRsM'+^YH[JDvw<s7Ow-~xsTNzL+cznf;KeFĪwי)ͳԖ`no!ĥaivf493Jz;mjmVi#qbJFݾ4_+ץG/&U7c"}~K C;ɡ^W9NlZْim%i]OYd4ݙR5RiX}]oDxƵKAkYAo;{}e-CoNX: )0+:"^ާSUzsPԏ1%M B Biu&=ׄYIGE=Gޫ䌢@oGRx-ʞu '^"iIRTjt^s3=lƲ.ೄCL+y_۶s]4;vٸym?['ΠRkkʺKeZoMgˆr&X>M.6cGV;#Ku^mSBI_R7Y۵T5gT:e\:Mf?S]9 %NKg`IYdbXmVnKMyEȨ9+:n>7Dgz<6XAI(ͼfR||L_35Bj\gP4FxzIڡW|a: ~/A6jV=}!N}L?JX* ʯ$HuDQϡ?}Є0io 92Z$^n%JHy2XG;I)VSKK%8N 8MRXJH`6v`s~g_{ݑ^V:k׮zOx㶩)M5GPnR8>f9}ƴ=D>o {MϖҧZ)Jcq}Ng2jtJ~n 9ˀ/;̼վ7w03ӻ Ixڑܐ, QOuozIuIl}WY.c %0hu$7[}h`wodfUrBHNXqB V;$)if4~?(ks}Is%}F+?))nّ(ʿRGzfPJfV}${sX2>Yi <2tY'O8o|zQ6Ԓ- /O#]G7p8,k}NOsq%W9)i ,9nluZ;MmSR6[V9TW"XAISNFUGh"=gjʖk{ߐK s9Qp p& IDATǀܥWNo 3o.z!O(R e04^&kqIVx~p}QT5ysҀg] l0MOϵ:3~-ASJGM 9e 9CiIݒ\mל=u%/_ΠHuI͑Y+y?c9t(fW\~i>ꪅN#عcǞs?ˍ`(RXݥ%gzt-,WY*JBXI$cD-O[6’ASlT"JxO9DIٰʒV,-4i}nXҞIka%t;ԫiQh'gdJD^S\Υ/'OY$3]#mʱ *25љ E0xSg4r>'-m\jδi%5oAu#{uf`%g碯Q -ԧg7G 3c 8VI%EǩXҾfKVpPGZ|^7MILr.(Q3d43_rѵ];+*v_W1KZWO}q;ҳZ޽{Zz{O?Ub@εCJ3I:KJd˜,9s)%J#[i8,{&N%mmG~i}F+} \&ԉ+WdptvzFwn=sZL iYČ3=nm9Mz? \lGw8k歶i3}#p[f5`n <ݯ4$W4Ǚ~{V֧A'ӗO# 8i*+J [ƶ4$,*&Ը)&9sQF7ʞ,ת'gxȕ)HnNVxى6qzEΙnk3ӥUiA$}xbAVYa <2B],h[Rw7WVSz͒eYh y6II4-Kaiɬ:@6+=>N3\>=?˻g8|e+W.w\,ql!\˛$C8$#}z뇬s^5u9[:!R۔[֒#͆qgp:eN諾ulI(ktxZ~IJi%Ka=B!TreL*ۚm!WNrq"cԝiW}ٶ4ә~af³fJêy"viߟw$|3}j\Rs ;XJ 9AeP t\7c)͇!vmA6:ҥ:}A8^}~~Q?pif%7KIfq-~J','];É@IIڔRd %4P0[Duʟ ͕W_zvرggon?dZ[]rsܯZBrKm~qi13m)y; cg+ӛJ˅i8mK56ZC6jNMA|D(KfVomp ̝u. 8y=83ҭ)>簵qq5 szn:%~10Q߽l,7Uv6Dnrg3̔8Szz[ )Ic >)roxӟƥ_AߺQlh6z-;YRf-39ĵ%85e )fdX맬s Sg|9\ڦAF},n-dZX&^ kZDY_C~vԨ[ΠlFj;#Xb|8#LO"a+G {CPsǛP'8wzqmI$np@*xI{T: o  .!anՕm&pGZoI-RHKߦ>&M) R aW(MWvr1z*BZ9m m9F-måeՑb:ގyvz_۷qu ֍bǎ{֬_/nλ`iۦ9IfkN8LjF[rl1̭Vߍ~}46M=m厴.r?)Jiv:RۓW!kh/Ϳ e%Kai($N[_10̓ 3QrkčUZv_%KMto"+ 3$HOJ܅G۲AO7r5gFHhDgJCo)py)w$LppavoS8Dx'ՒZCi4DxNå{-@n՗p~1:3"Hq׻'j ؂H&$\=rdrŸ_!>pKrf)V?a!%G'1pU4]15'om'=G򶍠j;vr׎7Gֱ֜53]rW{-Zۛ˚C1ɱ$J8CjW>gǫ6KJlq^'2aie'I]󽆔-,=WQB+!NSZrɥ'bqJ6\?5gE,m.95Tv,GaخIu͐$:$EܑWzJy'xF:Ջ gȓqO"hiJUOc4?pJ MrMN?(1bYe+َS2k'׿PH{u}+ʺFڗ,>vw)/9y=>'9.u#k48tT),b9sm5C̠Y1a쳣 o=9lش[rھc[> kx皣\Zv89ӥ}'93r>Ntjx8A"=%m6(7:̴tRbaҹMtM+R\J\,67'kqfqÕ6ߧ;F3KS06\a:+.%,ˀ}Bf아k- B#IK5[t-{Ntk)wmf7V zA!N2YKթisq7oI&r'0d*J}g5m۹▍[3x`t JH/.zα^LEޫͰ,u1;FsY 0kSi[^'m'5SJt)7iuϺǜ ť4YzAөcDi&'ǩbrJ6`~by%fӜ[icA=D8Iy\3j6UsjNxR%c{|om2ªj_{ZoDՃx>PwmՇ4tJJ8|,D>JSG)vReIIQ dV=Y>iwGTC?ۦ5gDڲt嬷&94TEGq^nrLC]j˭Tk'G۲Qҟj/^k6tfݣ$9^R?f~uqj3WUR^Gsz?DpF~zX&f_XAX\C3Φu.^vtF04e!K\O >͋5if tmI|FX -QT?4eTrkqV88,%H+te\R%cV_4Z:)88ÌcJqf;a<Է)Yzs8?[Yڶ{يGȑn#pל3lyܝ,Rkwrv?.kۭOgH w8@+?u:KW:8L+q0QUf.>A]p':S'wxt0Y F&[T.ISxpSgheg4*7 L  {fzNNtdffx7MIk#Hsls3pMSI1LG !o u\`kg_O 4r§,E!>M3SW<qE*gϮ;[lܲe;͟T7dYkb־[NvӾky9R]B_8 ǙC^sǑtguI׭;Vr]+]qLٍuj0楗%̺=7Y:<·`pT4\Ku b }ǁkt?u֏8Za滗sVRKfX6qqgeWF^:}gǏ;l埾/wLKK*ڲ,ԑ^gfz;#H҃Y$n.;k8$zu0SztWҡqQ/tL XEf:]Mp_>$q`\SV9(9 Z}єgӬ2N,{ә]ޚ:wZY-Q-^qqQ|8^g`ʕ|_āz}jZ3g}*ޣɹ=1n}|R9ϵxɩnKI-q.;3(v; *eεAJfRI.qJdv<932,l4sc}U ^4σ5:^ sa ҵI˅-4U[+4Cy Lft{^G@qnh{ZGZ0eqq:iuޗiisxll7 Fɹ9zΑ^gVvR;I8IlewqfӜ|Vjq[ֺuT^إ;3t kTN&2?KҬ`&}o59rrnԄ >LXntvafiiۣs|jF\=FZJI:88+,9*fz7˖/绞kXޱs+WZ"_* 7͡^2/Y=J閣(XYX,[&kqxlsh+祶 or3;FFwu;4L$Z7C0XB[a9cer >OjacPNcIpҠV~iKAӤeaMLTN`Š2c֣/vY.Q-c. qqR*\I>鉬۰.m\̠ IDATk{L//(ZVk ퟻ֛oމ,ג%wt}ל>fs#K"8EIJX8f%K+̇nP˝cqLٝC*x~xk.tP"]r}( t1As:ݥVHI)S}X*ϕa_',h걚PtX:$vWgyby%m 1Ms}ɨt883j)1U.2.RN;֫K6=vjw?"sut%.9%y sk6܏%vKRRuqɁX)%Nlm-{FnvN0a̓8PXXuBXm~|uӾ XJy[9Ycz3;y΁$`qh940 2%~w\L̓zC\o#l|J:O'qq>zLlk}m.8{p 78$ɺ$NJ鹙]Ӽ#Sqj/jאpyqH,̠t.w-Q8 Aq>XX ?f4e `?{w!:vwϸ 89IC3(FR纖F^rp< H"]/V" h au&VkVux"=h3}/8Yel'x7Oe)%88(PNz xܓ}MZxZ _{#;FJt[5#BrW9Jtw9NIg/",aSqq,vg:Bܥ[/#?} l$Lan>#x&WsAVpX{q·+c3ImȊbLZsEmL!R*M(88HN I|6au|>%]֫K6{>|\ I'K-g4Z%zftxǣIrg'TJZwhp݁M84$lYs <{XKA[-; Ǚ(<<|SCX^snJN<܌n M) o7\yo 6cqqO,&g ||uٚ7 `- ߏ% X7lvMMA("9e-zɌuѭ}hpaZ#,DfreS3* z'QGqq$4Ƙw joE^ҫK6g-_wHc^g 0df)/qrHzu7]d[hofEqqO2X1I#4G Knj&8Cංtsd6+]2pht&5Tt:i۔mjfVи<.v1L{\M KC884 ˉ1&VD rͣ%ŞݻNNMzޖʤRZ˷kr&3lYؒǢ4qqckX;gq588NYlTYЌ׿^Ep5YuNMrVzyYqD2HƐS$Ij8V$M/\|u ]|h|  y݈ yu?s788N9,$FH Q`w2z{ٻkW.(;v%9SrT[pֱ(GاǕ;Ӱ$d*}qAuqq,6gdonh #۩]GAsV[NtiŧmC: |x`3Wy *]ÈF[yy/9ea a'4gݳP*cTL5* 3CNf:iKT 9K댶%ɱ;q%r*h\r~<ӱ^f;=߳-[`߰ywܐD4>MW 6;q—ywq љ;S%3MWmo~f͸}EɅZmZ%%ᒣ:g(6D7%Tozhs;p NeƁ]Mzx7#^*Y7ltNlмHFzPwH4`q ymrR¬w٫ nܼ.cI٣ϪիW|=cGdKKW%=Tծ[؁^!9Х){8 ƣH88}d1:5$'{~0s[}A^M* 9,w9@(g;'9Sz|/i{&-RcvޙZr]fO$$[D%j8O ;H$AoA F;yK<%0;CvO%rؖdy2})އɶM+ lzX1Am"Ȭ6z_[~Q o=/] >~;qi?X Ql;T}Y Ꞁ}W b76> ~2زzN~\I;Ս= gWEKlx=[Žg=dQW/m,mfkn8n1u }iQL*iɿ~]-<3{tm$}jTv\hF:l#MMNfbZG{K^k -ӯ_vG~>8{6{۵B7Q/2V;`bULBo!Iߥ:aS>~)ILW7 JDϷMM=˴^Z.?+frS#ԍ*}CFx#vIymlLJJ4dj├QrގT*Tq_ x[F`o &ӡ#˺ȏ%_KNumM+ o.޳ggwcZ"+P%L~*Gx"{Fy^M~Ѫ;%]Ybi/kv)zd& YFfwfk%k,/g5_KYu@iy޺r7LeP&X7;6bGZDMG]kQGH0%5!]QgַmC4ׯ]q ]Ƣv{DMC){1^ۼk9鵘F~oTLϯHz2ߨ{$隤خRIODYFG93!~]¹7:%=%so4kkپR]uj \m!QH>QFjDIڈL*l"j)m| f65)o8JMzI~NGs%+Kq_}ϙM}cx~+ eF%sl al^Y =?,Zϩ/Kz:1}GcZqgrרm#a]ɱhH$(m﫻>.Y.b9unurLSvQ֎'VFgO:x_x ko9(;s_~^$a`[FKo2&-#1T7sڇ.}Ozv_v }?޼ysH<ݏ'ؼN<} }.|}_Cvvv3Ot}ױxbM8Q(ZͰM_`[~uӺWJzR[4W%n9ۆ 5;)l4ؾχ$s= ᓒީnKm8^?=ޠEPqjP6VEўѨO;uh)fek{dXP/%]Iusi]W}7$ig'}fbt;VoKG%3HsIHNl ┤+6jGfa XlMHSqIy1͚{ԍPK$攤OeVkkv4dHLtAk2QW.{?7.KQk:uSgo峂MHZGzP =wN5zetEbz'IHzRҳZޥN$ѫuIg %P]񆌸9vF$yK/Hzt-uK[\Q7Ńr:Y陨^N&b 5a۾oEr} Vf #7tXdMHj6I߯%}Kx߯/_JbzLIIe*22%]۳2ջ'*DɨB/Kh,\uB%e /Iy*but=rَid#=zoJdOVʾr 7,ŪMMjx{M ً-:?Z-PHsO?0'}Kɿ%;ߴ9.yuSf]r[nDO.g5g"ak]_G"[:2Mquҟz'=^sBLnsO,)v]mě:gElth)l+";؛:2pH,{T?]_P7"}"zϣ=e`+@L>zQ<ukY2<ģ%wmZFQmbb^>Ϭ~:9소:1Ϧz<뵥)em9t Ԧ#BoR#==l}gy/3_w77hu6uП~I[*<#[{lYMxsJs{$Xv#z/D=k!/)N8*x25ϩsxfkeu>xkwr2:DhW,=<{׎~|l#כƪ>7}BP>NL8˒roV}_[bzM!I?7Me7` $}IR.Ez&gnVwi;?#߫.=nHNJTQk$R{.zx9o PnV4#j_c;Ts:?ڿ_/GUy,m-)+MiJzH]HzV]fZZٖwnFnSwVem."a6wF{.k}u|VuA9޳Vm9Y!&=Վ-)Gu+T٩rԖ_"Zy&.וM쨋G? =FQ҃KFRZwܡz.a ׉Fޔ ޹l/Xy\퉄hV`r`;%}2EtnhDL8:{dv SHo=U{|l{KGl&Цwrr;$ZxcG`8/d f9n֭~=Am{-IHztQ` yˣqz16V HeruW=ݛ]t&teوMOm+1IbfNIDQ62;:DxHG۹J#߻Ͽ3J#ߋoU+_Q'wHzY39߈_ ߠO=y^:\ALꞥTḤ?(ʭ7)h` Jҥ>nLdz}ͻ&;%$Vl;z} 垱cS>?rMs |XvVz+nƳ[8uaZK:πΰ\^ϣ>m2Q};NAu9flJh޶+'tᡇte7`AL?79گ$֛ԉ Ѷ-S{SPM "g?Kz2R Z-#A|޾Qǒm y[ߪ7ntF&~J4˟p)FfbzMdFFe9D$F >njοi[Iuxۆt@:D瓳n;=3nVN6#b9'Z!#;t@\'..9˒.?0H(l#26u<G{^}e7`+@L?J4ۯwIos%ݒ\ϐٖsFgߧ.G` '|~Ysgk{b\퍖 R,PbۄqqI_Ls6K^t$L^;=6v<G6 :uԲ x"/Kb)"N.)[EA+$twau/Ύ 5.)kzi3^yޫ/fl FDJQzF0 g-Fzw<sl vٯͻQ[uI$=yPF)#|l4;ޡ7[%qxbЫ>&⛳Q) ѨHFFͶʑ6^'=t:K^T7COt=^)3j]:|=l{GA:1=}l}m_ݨ[zuIg%}G& zBa$FF/S~,5IWt:~V5 dDQeVe7'Oɓz…e7`k@LN4r_ u;~E'Y&£wވm3;7,QuIIz"؞]hLTd6_nyD7_שSLXԫ~Umg:@7ZO0F{#%%=(oFrA9m5;:uE IDAT=s(oFqnO^RkB_$yz&#vdþ/JzRҧӜaWxQ3&)[uzt):s`t:, xj/"}`Tm\t??(GQ^{^m^2a~/tڲܣn'x{x&6F`+}azNbd:"ALh$⛳\VEsumm$Э0QG[_A<+隺)=t:V<:^uxߤyf:F[DQHFk`T;:0C{x!{`^!;G>_7n,[blxBj/}D)uS2CuI K"aP|5lSFO(F`)38r?-9fw>"6{f?e@^ׯ/g iD_⛳V$uSW{έum_7T0;al޸Fϩxr;^庵N'N @sݧcXv3E6h%&RP䐥WGD~k'(۩ݶ/GPXnO^ymTzmmqGĻuI' 5nI\QJ&~ ❛MNxtUDžPeu%EtO˞"C:D;%tӒ\xևg=W]f7oDx>r.w0O ̵q?&z*r:dg@O%QZ:%4v+{k˲g7ވs֔SG`S{z yӚDv<GKm>AY6 OCcÒS{ޑx CxoUdu8LEI_酴hWDH8ok3-Q$z"锤ϫ}1mkDB_I{;a;%Iw,-̳{B#IT:x*G7-N0'"V"9=a`6W,;WklDXrY +ZE#p3ѯ?*p]xV[;DBL'ޥn< pW^Yv3M*a*ਯ~泥}DgAL6%IwKv%=8*eAvtԩG!'t>1$}FEl[~эgGQx 'gX-ސq'KGپDȏa OGf/KK:sA& z.u%Y9wOJzuY)tUgaʞp"g݀kرc9Y=~.xek&XYQ?唽qǴb8C!6kmxQݳ_pώ^*g4v׏ ))Սد,϶Evb;Qu.̭'OrN-7+A2v$S嗳 jm3 lfN:Lkz@(GN.EFzzf'CDu$5hnN+\RwtMw?u Kni 0: 'c" li4Q86LbKSbwTǺ- g}^͜wT H#a#R7{Î&P[򂞖КQ.貤;%}YOK]'wrN${,g{)<X<[;IM:ܱ1Į~]}gٿf]w;Ra ^&z뱪,mH(8g;2b\Q@.?N+D7Y6pknI:/.IH I_Rȟgܹ{޳g-':xFspFkPn2>_Ӓ~P4oYbu9О>+[qH̩{=Veq&SMs#飺mVxd''ٔd=g%N8O$}`[;wlmXeNCjeAQޯ&˔iTl?i2hS9gX }I:OI]k7] HQ 8qLKz\ғFՅn5$'T3[FGw vp˒^V7.u:q>gۣi_9{/-zk@ 4{:JMa Qz.[s΄uF|6JA76To%ݭ.q0-{f#okS:ZoUKPK8豔_h,9ݞGMPnYzNeIWu3kWwWIy/I/I\x͉7nzsk=j^>c?˥xF `( bxMmV^AA +~XYmT_V'^aG${π*m` Qڅcޒڵ xNrIx ! VZ]Kz@ ueuyzoi;߉+/xyttj#Ӈrl<0-L)9l@ؘF2Q&m@L@XNL}uNc]IS{0{z#΄QnOyߝ''%)@W,yI%afNn囪ND:u嵃宺皟RV'*K'ՉQ¦5!{NI;U Dbz-?`&(L@͎?KGiCtOφIALPX׿~LҿYTW$ou"YolY- 3Gs +\=KmrxJي;:{fMf;u`=q3%$ݭq_;x]QՍFDQ{zAILogۿo>1@46|{v>]3t+DoZu/75_'G?*Zv}RE=u<ř/φ,6ޗw݃W^uY#X/׶kǼg>G6 QS+m0[r9G\dzecGG[k#Z/";ssEو'\^wnmeÚ6ɐk&ߩ-#]κٗU,~^XMP{oIG¹Wv8Q;<{le ϲy/W )GD (_v"Dysvcck/E6iE=}Fբ{<#lQٯKT2vSհ^N^XpIz }'lHHnx+sWYa7mhXl/~z({+E9meٻ!njI_t>e5KẏJѻ&z}_;xYrV֘eV1_/2!}^2FPτv[`r=!ӾǕ< Jt$^*~dE6}L׉:*+@L_sDAqyz)zW-zAm8'^99XX:f{r}@EHԶeԎ~im[md^˚DxI: ^ٲM .$U I:?m׆W TA`5Gxb ^"J eZJ{L06{tǢGMi}d k+int8N/.{EzTyL{/0Yv/3 b|)@YGS:)+uxm)RZ ɤ=gNQN89HD4H@-,ׂ-˶É svH_7/>n&=xNjBz^&ςNG5VL/}玺,7<}%,/~>-B/Zo9^ ^= 9z<_~i;1zm&GSQh`|U7}mmXmv=?AL_VDCnqUiwKHd|V:}Go[LhYdae z)y"zf#F"!ծm jAI)ONlPY^=oo1k R v iM-⦨;kGCgZѰ~+š^ zt+ ylZEκG-{bw&C ʀae7VkՖ^ڈ{6⭷Lz79vtzv?^OE'5azy,ee{d^`An>rzv&gnmv畃 ]9 iy`^DtB|h9r濽YURV߱9j?{z&1}Z@yþO*-Kjr,_=x8QO@L_ST,#ѮaُHK験**Ѷ:HPy3Damī2c#VDc#9kI(/rt3K6SC.Zn(g:]d#KsK; "3=*j6^elR7t=:f֮(6LTlihsQ$Խ\H--k` e,;QT 3l Y9kkԡkY,915m~nb!xgdtzGr;e:iT:H([R.m]$ٲ =ғipX azlו6Mi#},Fx dWW13ҳ)#Yvf&XeڽNY`WcMjbx&Y>Cb7;`?jbz-'Y}]m.ԋh63k/g9_9^Y毣uI@LԩV`y^sKôKWshba94NӍ,Nwz` dmSz^ ʺ.Ik'e%e߱ӱܯ\e0YHBzyM(XJs@X}N]e9K$xO-bgYZ: F5u%W2Y$:z-@kE>6O^ +O޿@'Gq~kyHXOZOvma0#s}}Z^2$=Ѱm ͜o(9\FN';w"&}w?φ@L($g[9Ҳ_W9yXq/D2ZB$sQ:,HM9^/˰]S^+G7k{7IIvu^ŪIX=n?[b& 9tԮr>D@@( (h́dǕ>P\xY.}LѣPg>?es,i:6)fS`fӗG$3g5ю,岖<- p+˙X˶!k#,U.ZGR(lw2Fd4n^F)zL&`5,,gx^9j-gqiXn_{3<+@2!ƶ LEe^CKjbw9lL<:翧w"]a[ 1}1[:Xc+R[b{QYdOz ? s1}yN3r{^ NxVh=#6(@C_Qo%)=G;JHYnR4ς iL4lIF7qMH![)^g-:.PS^W谿mD9DL^!Nj{!o9Ṗ;lKAm(csYclk3,x9(msH+^ *ֳC|QL + YT K7[/rV,rC%2iTn2G{GHy]G"g#}وm#e[m9>&Rj3!=kTz9?+;M }Kk%i^TK+ʄV!=}Zhr"g(=/,D9(ntڠ2r{x}e]Rvx>{Qlpӗ' =,׭|窠,gdSkl˙X CclǖK"ɞ=>e.ǖv3ѣND.GrbxfH ju^lS6VH'.,5c -B0Ce3^6e TW!w=5!?Qutul)۳F.;wT7(d}_t.-^a:$\ݛ}dS{m9+ٵ]^]LZ%B.-;WnO6M-"r/rY Э u-K.?[vnBWGյ:H0땣vy[TKB)r-'}!6R[z]VZn$k7tQ`RֵKvb'->r߿׶0&niMdX}: b|:A`XDSF$*l}tM%ӵYemi&;FtM24Q%iYFuQ{&gjNWMq-C($U"S#jG,aAL_mj/1EjJMΒJS`D:vyLi#C:DhM:[iQ[o 6Zc??Xo2-xTߚ>dhSKL/#D﫵k @+z_^w*ikcHR)s9-*FZVSj'y-6m_kPae2:2#-ΐ{)gelU`{XVpYy>fgϢѱh|6Lbz1auoVu5FPclv/CV2|L iiӼ[Җ}`5":|Hպ,1w!10e̹wuaװ S  { H]O!zc#v&Y5/?r53|l, g.dL ah>ӡmCd̨Yz()GS CűHY5uvhǔyöGX>cE3>˾5 :_샘s`L>zYϗkXCכNlc{Ȇc!r%n6" $b}d[#,Xlqj+~Y#/87妛n{??l[b[%w+Ww_?ۿBc|?.N}ۑ%(ӧO? g۾^ Z놨eu|?>q}cKTۿی }b}Yh٘ C5EѪo.>OѣGiJڒc-?pܹw_ ݿ0{nFn26Y;4OmH'#jhor59_7lWoɱ|{/;/رc=L{յx|?R+?\Z?_w̙RyVxؒc}{^QZ9Qzbo'8yvaӉ  ?nƢ3[}qSR4zOtǔy#F}}?e|O{4@WqFۅWzi뭝 oUh*u2ʆt/ޠGvR'Sn w:0(FjºB+Pd-Od~7N jM_8Vnem&! M.ё:ZY2V(R5} J2Gt# pQ_n.\N5ֈ@ySՊI'ՈjEp۔^<)GzبƮAI0Aǧ"b$:Iӳ.X_@КaU9bѮ^C5tRsPǬ~Mv_CsˋV6RYMZdG`FEQ_UgBR&hNkTϘD5a*SkMW+GަzYa#4]|Gw)ގ ɑ>'tb|ǡ9䄔;vyzi*@5xQn`u uthP|A%~1 dg1~c@!(Oo oԤ+I=8Ga48PWrc=֡u)NC;jXrtʙ)KWՄvсOȨw|UCQZX5Xw.@8 *9WJfad )3Pm8j>+cb6pPjbNq ~^b5-p^WH'#V7IX#2 pq^Mώ\4HۀЈ*(QgB nL Pm$r.Gg:NS`Z B&#lf7֯ħ 2aܐjl'RƙX 1@Z m-&O{pdvCsIQ^cdC56Rf4Q J3xPЗG6RANkF#.Fvz1feI$N-$GԆlre^HPvf!IepInHZ2ƨdoK`lcNfhUShu.!R 8;,g_؟!ON8䬓#+h*t}h){Ţ8 p`^hĜh88$}ը$tkӬLGuM% NB3n6s &# &9k^ aZcpkE zsFV5&CW211g\`sǥ4)D$ztPųNq\֗a^jVXuWm;]]?k% fJ:: t7idK;jFNԉڎsYA*rH '9`xpU{h|9SJ]Z ^FZLhxE r.OiEiL7Ò6=OF]Lxoߊ¬S+̅`lр'ELb*sTpF= Goe:Z9)QִcZ;L!44{*t}&~Ch"#+YfFdG2ȵ<5-b[)Zb;S#j2U_8?Әh>)@ R<ѕd"a0)B(`Y84E3c.VV%pUBL.HSaS?&Zˉ?t2QfFzR5r{t ͱ&&2`ڻꈫmI!D)v:l¿Ԩ;9O܂iځKkEFomRgX8؈≯rQϕpY,-^M`< E*j`CBd74MT,dMHc`eӛ[44Ó "<)3*Mx#ahψ.ZχP}0kd, .Is$+&KkŪrwuYd x8*%Feh2LDq216iI9 '%Enƍ M0zQW㵩~}RdT{N`NkZ+)T#+701^yHG1e6V5%aWKZv?QƢ`4%D(H{Bb!IkZ o1*ӎMrenAWB 09.I Wp4MްPP]f1*[p*j[GolD b+34aBaSiBzY(LN+lmeeEG,h1+O (HtP^aZ&2h*22Rʑts gqq\|QqEEi&rɭ5pϲ'k- @ߕ+&3*[^4Z+u@ rrpnhU&BQDec^kJ,x4$ M2#v橳H,`P(n<=:2k8% B]5:)F=-\A󍠳θjRmMr6MS[qM@,/.D+_jA8lzijMeQĀ]|@v2 Miw;XOʡ9=(q fʚ"t>Rf[PvV=EN@` eFbne;qX6CqSpвZi*c+&'cf>pV`c蕞;ѩq9V+lK`/V^% 1 \怠 `&͂ z4!tz@ ͱX<|v}) y52e1Nc4M1Uf@rLU Zd uNRaYkF̴zy\r9T4' BBSym&W!\/WN5;dś#c5N͚pE L8":3SrؤRٮzܤFWA=)ِIgcY 9䬄j* ;4ۥe?,'Ӛ}#8plxeB$)ȳ/5- C-vhM7C#uB5 +Rwe(Щ5ZZOJg\eMQvEX_r^ihk;Y aHrjEـsPuM('D/NL-gUs>bXwztʑ'ہc&he}e9Y6~ֵ1p4m~9=R^`~J`urV:r= 8TBkn];E}tWrʔGɷ}P9V˸Modկڼ?"Vuqu4ebVX#t~LM)š>_V'uJU:LڨLt ʠAEh-#vɆ@/qc!|^VCAw bV\Hzj8eJFV >$DsɦZ=_B#;-^M+'4SQ9Qo?L9e8dO)[2oa:obq)q}}sTDC: ثnE,ZFy8R[*0Uۍ鸂ºNz w 2iOڂNo:")h^3=~b//>BG0gbM+s n %ADGS=zB!Agm CORհcrc"V5 RΖ&5e|((NsaWҵL?!FSNh27`8óS|@/K28驒pm7رZ f!z9|v Zt}СWeU}\хzyuAZ\IyWtG*WJ&D9]W~h{( {lxLEAt+Φ 2H#}TܺoO9rVı MqDkcϟ.߽oW95YNhj;qafuܯ[j*Μ/O^vH`LBq( =[''מ?S.gGkw*h)u!Cr˩ ʉϔ?gmW&ycx(2pZWa<@tt,oSOK m&qI A"Qv"Q捇wkzfJw{rjW[*G4_0?-Cz9b63^~?-{nݽ {nM>*7)ͮr}s4Mr)K.v;fʅ+ eJwwth]\X,SetQ4בɳgʵ;gK_YnQ~3u;t^SQ-;=7Wnطέrp&-]Z( g>sI%ɾG?^.\P/_ʫᄃLϔEﻷ4F $'Q#;OˈG/w*Тzp9w]~S^@/ wZj7.͗C<\Q>߽Ǟ)0y)±qD,9wٳUʇ~Tkh@VXDC[\fgwIU ?Q-{w)xn+g\o]w4E mM7:,QrFC[MCs,pQ`=U5iE٦I=u2O`%9ٙ2csݾkg٣igX#TDy 'ΡN)!L_8}e_5H8Ppguo&EUE_Cp>$zOg[Wӭ GH>wԳq 1db@9D4̋tVl$P$?ܴc.OpZ"x\wF)V&ԟCy1]@#CtG⛏ /癛qEA9M7NsZ],lGO|w˼ֆWuF9{e|,Z5o/Ǿp9uY,v'N&qA̼:Xm&0<KVN3 i Њ’Q[hc<"wݚ|tWx>m8^* ){͎K]2)Wި딿Igsr,iȷA[Z)OZ-ʥGrV-ߠWӢ/'tVwʿyY^ӴW]1`>񉏕':Q򖷾U VK'ʱZ~gePj3.ٺ@ΣԨh.vEp3u_|DlՀq}Ne p9PM-WSxAѷot$tQB⿠1zH}FH#[*4Plj:mgFΆ^u'`[ɖV>WUv JQֳgL٦c/Gj5oSNg}tvunHdJ-ЦB⤤/Φ QGsj}6˙ܝX?Eɯ)ǦZg Bec5HȢ>NP}PA9輕mQ56 h=>)]=TX\1Gy*x":+tb .NAh.p[ ۙhZeQ hWvT¿xd7} a렉|nH>QhN 4E'G)2mMGu Cs]`X$yC9dwFCF\xZ3 c91.J(3B0p^5=5"Lawks :K(-e[ûFm-xR٢@`D 'j:G": K| f`B6p~xʡEԣnTcq DrA0PW /}=B\wQn:sCs,{%ZI 9ĚaIeChex7Z+5}]: EK8@J&YЯa'&F#\v j\TK8鄮d!QATɃ%EutLէ/~ki>W:W[M[ͱa"jC `<1n2xytL;(.IrLb]CK8nYlmdnC vޯ=h^4MUqv/cѸ)$35^d$OSڐ -$95|WxBȒ&IgG/$<>**rՑ -9nAV`'0UN)K_y C<1U ?"'OJ#ɹjFp2rI?yy_篔ӗwDxP8nDh֠!^Y*^g9C+S;˱K˲Z]O %#rxGyѽ NwH8ɔɪ])Mkَs -b٩$`="${( ˴e9S|}UZR^=l9wN){} ezׁǞ(ٹWO'yH2;3Vvsa<q\X*{OearYл֧'K;_~[g|5ձcOoFMN/)HR?h{Tw. 5F'wO?hֻ%;'R~?^~WZr­G~3zɗ4vC1= s=s,O//n(AA2Ssmo~uyXWW)O(_|LYүU'OWo*O~L7>X^9Zٿ/tKs_:Z~O'GZQc_w/r˱ۏS쟯cW+O(_, M +`ƹyY{p* ]=ƺJ`n0Nyȵkckԯ|G8a*IF6u5no0n[Qz~=^z5RUU7.ܨ6].;~%r=5LdēgYݚ|[,H3;rG˗;_Pě-<:]_Ѐѓ6#ZNT.ށ}zzy;SccOWٽ\pTƧvI=m%n1~u7ebzt`:uK =:Ruzϭ%=:yEʼn2WWg`F&H7azXz4&kLjLt+Vi p *dU.zr~CO,hQ_ ;}fY]*ǔVՠEڜ۸_#3̟{g8zAOėݟ>\U{XbyýZʬ_A9rr U˝7=]2sf6IFWL,+k6|e-aZ+_~JЮr%ћ(Gh ܈Ǒc{vTXZkj?9Yfv  ڧ/+>jG/g/NYl'N6G5yp+etꆣ^5W^#5-BX_NuV)OZNC[^W:3Z< _cLrͼAV.PNkΒS!B<!XߢѪ(Kkrun`:S5\v1 UrH \UtXQDZk@c"sA"~6c^CD+tTtH:,㱭gTeC,ϗk_-!']㱗uv_FVΔC;~Z=)x{oZ%~__QP}  ]@jcIz@4E2+8+-K,A<'jQSc #_x0Dw|Tުq"F4Y)nɩdeHbnɯ`iT+:/XqZ,19i\طvn!0 чЂw p6KU쯣@JqQڕ}\}x$xi뚌 䰾 K>/C m X: }*X6ƼXb!@ KRARF=-(;4$Gt`5qC7nSW\f:*XK)^8-/]ꙕ0%·C#7eUeImd >r8]D@ !4 NGJU!?k+C0' U1iِҙhh7cIUUbB$|XZEґQ$YC@;/,!Z!cKfJQj:]^ѨƦˤ[Ne쳊fe|׾e#6YD'|DfT1*^R,pls$S@7Щ =9oy\g3y-w(nS.h?׼%|SG:F'Ӏv 4:X85PYm PCL+m5A9Gw~IYes$Ja#)05/TEǍxyZD8N1@'<9¹SE4e63.e)yLeƔ vɲO2yH]09ǻآo Z0qw)_8D!xIp $ӷ@453o*W:VXp!RB>( nbF-|f_BiLXy"L "V|a#xZRch{cM#^3DMhCG`*C nQ܍[265~mĞsp FҷƎ4>ZiXqįɃj>V'J$1yR>y߫ѹWKc *"pHCOL7<ѩq MD*G'9ծD&<z;Ȧ*E~mt.؊Ц'BW `"pP\\ -@;l pmiAӄ! Nip༜ q/Ɂ[#wDK4nCKdxUm5^ƇWs qUΆvԺQ0BXj|C/:ɔPRy(gEYybգ |Í+YB (gv}ׁ 9VGp?n1uQ{;򩬭 gUQ =a[4tzYS{ D@( tjVej/x#]vMp~bq`*)ٯpBSWBu>CK?Pdaamh։WbU; g̑e?FE+2IDATꥳe| [Z2iIn RD+j{64Bh'o' e$(!)=à{ SX(һEVC ,1#Ust_ۤ1+ iS. ѵL: AZQ僶bШr Bp ھ@%ʟ:woETS_o -`/5~7rCQ_ߣ%V9xĴy؅ȆXz чN@*(PP1fjH1]s`6L N-"15E!hYYyJ22#,10ƕS*as˂<3Ӈ>z "#T~qPe  B/j -XCs,X\;қCђZ4,ӬPI4mezWeDu8`qpZrml#)O}KLbmN3Fቄ$,H4Iy;loS3A  ⨕uU0[ \RЦB%Ji1jx=*)}kdH (ؗ0 -X]H_5$ЋV:5oyJF|$p*#gUY:$`R}34! XQk,+2Rb= 7 S2` 48VpjUUt6T>ͽ򔣎z42NGzbcy@`I >15i@8o9xHߞ&0 dʺ8 jBhBĤKY Q>b#W#*lTpMpp`c㓺^ HB/4ythҁ8zPW]74bF'd0!&E2#/e>ˉ0:*9O}&zma:! w8xA%;'hq2%Qсz:PDpW?=qWOLi=&g}PDv\_U=ȱU~ #7DZ#Z=vԛ#\#^>):[Q.8zx9i tl U~\r81[8J]g9JËX845%Ƴbԑ0yh B@|D7NhD'Sy,8 l^UpԀA( $!~O)|־^k|(,=XS-i yQKO"A4TOwHFCa*W~1kos,%)eP;zEkX!+I8t,(eaTQv]t;p<@^]PhD8Ol GL)xwnT>Tw|\y))u=wUyVP6xֹy XcX;B:k߉`—$!4 c`I0h-2H`AHIPª˄' WaHühDH 'GZF<(B1P2`QڵAL݇ !zw}>IIT[ <XM3H4j}/Cs-s](^w89&9W >C1Hʡ-XGK0>tAiv(8ځe[/h`` IG*!2;AN1]K@v%I#py群#'W U12e|DUd !:#>xpN#j"o/` Y~hIJV7 YuPT#zLMM:hNxl ( v8/h`%``'ƵEЄ`Dc&ZW8XX3SH1yqI]zt /(oAOv,dAƠo6) ud@E Cs,nӑÔTD}LcYg; _G@{`dZD>SpYsbC@k{ gEC9-6G j+_b(9cώ"R3Ewv4.c zf$/ .0Mծ'IH&]:8:ĮkYڄq\##6 (+2 zȞXgs͊K ;TIi3 MWQG\=A󦪩OhX"tm0~I-;D22b8O8.)<DS^u?|GIdXв"Nvi@.{9a^M5xaih1JąP GL 1r4uTƎa઄#U8jl'cdUy,I}I89L- MN)?;jhgAl&v2,tК ?$U7 zG~@mZ#vD6-},BnD /doJ{瘟u s,+zD9'-Hq.‰J(KةD^A^%^80h@ӝdc$?L}r Ǥ3A_!.oCsPTp4=8\#4B (7˲#5Tvp";LS+E\G+_hnZ4$DQ{\MyY JT Z8D9 gO2q `cU%-kZ˹҅`XᄏD8@pJ.yl ͱV⛐B="(zPGv (X{0S +:+@U,h/@ԇ;*(31-; Dn@~Υ>~eAiZՋk#AX<(86 u5r_alV0%szD0n"*ц;BT;rQv4SKөS~X\C#y*$BW(S CP*-/Ad"! :G^MDVE;Tut4oxP֊! ?a7'G¥ef~EH4+ZYM6-5EL 09A#I/wwe% "Op xuTS21@Rۡu= Ct,IR¨oR6YxA*ɉ5>+i d`HeN|c0?FH0BYEál Ѵ۩/Y$yzQv&2xmcbʅsez>ٛ ÇdlQQ^*)X։(A DGI K>m#6\"vwJ'jGnX<51?.qV"CG,Q0L8) '"->8.^)Tgd5eDžI:°Q^4z 䪮{m|gA ):Z:P~>xq/A;IAo& wT%Q;y`2uL{YHFQc#T_=V"1rF0LcԅaB4q*#:(N3)](DP)eq+X0?Q2%dтSBrޖKP6pͣh@I4SC+W`TN8Gt- xiO`Pod2/8g\r_ : ϱXV=ΥʱzeTp,QV)+9b6JYG̖.0^a5#'+kVŇ~zNU`E^UZpUk*T:$կ=! "::!`(EbBjkE㊵QZhVK"mL(KIv*=@"s L8 1i5|g^QAUX.u+Wzs~zBA} kC_ӗ~җOցXIyiJ/}|&AypNR_;, B4}%O#7B,F0*"u;emXD&9kf:Hqy#<3lݕ QOJuFHx6Nu2Tmrg]MM#r&_ѧW~+ dCR}9"F[Y:b D;*mt8^6_%,>Q x@g*(S/gUS345Ӡ JJiiLMF4YL-VJW0*nD," ũUQ.*8S%=V^(:WAԏT&5ʑ5(N vFx2.EӖT e>c:c#c#QWy!P(வ\Ȃ|i''2ozmIX-h)mڒҬ @_]C/ ͱ)#?4ɺ"8^ \ա OÆ.({Tc0>JaHU*X[YOjƃFkbLfyzkT89y5\Yԣ_Q[*",2 xvfzi] |R:]na <@[m3M^ ,u69֊n~iz)VmN!@|c(FB樢#6<`lHzFa_TH?V"G lOGM9ꕥTEJ9Pr_)CF|{[X*#Q6!OLg#+ Wk֝ZUc-qW=6$` LNxs=oIq#Bȩk%JH8cĪx%6YCz \ud=;R=` ѽڕXR;0ÀYKehĴī}v-T,Ec#,b? 7G-xTǶCe9pCs,^/YAƤibrD#6^$9x%FhMѺpĒv 3pgMz{ { M^1į/iz^U_8 8;#S[L(C$b6`LmȘS'GG)u8z#15Rql;$GGEYo,F*NWӖCs, G|)]B-[AuXgp#;z&jѕTd8aU* [ՃAKJD37 ?I"v'L:Vq7uTS~.wX)tmYͿX~ph~КꭘyR")R.Pr5² Uelx)uQCd r-EFU'#zZ8tĸ$vNjzCMc~#PwF}BWZY/1(q0G ]hD{;2w0@_!# Z";)+>^ 9֚.U$\ P/@YZڋuP5DZ8p(R  `cT9BmGwAq/ ^E IVV‘bx4S`$R$ ͅcOPHjs9tk ?@nDCw$?6ӄ^}rbkx%q"O6ddv8ZrE/ѻpPY5|ve{G'cLeEQQNj%BMWr1 i " K‡c䒛p7BwOE(XB&tJ)μN~.G F>Owf9֕҂zWx6Jmt5HR:D'YgAk80Z\).0q:2F q C 7L/ чo s])vQX["%6+'\99H/lZ| SyߎcQKR;[(,BRu=X\Q/}ejn+ǡ9&%ucL+QhCF;v08(S|ȸg5+Ak(y8b%P 5ąSLG&jO@!bHN;M蠧*U"}p{of7 ѧ#h&?!kDZ|u;c}b<@N0 YcFe 8u7t0F`B()ʁ`(1RP]9V**Ǽ'b iǻۑ}J6uC#]T0D> '^- ;CT Q]L'eWucgoL5u84ZA/ĕBxJ,`8#Yf hAR&z : aPܣ Z1u}˩ȏq'tpe[816 FNؐzT&28KȌpc\_2@fԱ*K7m|LVRh0f^L=S͆тRm)m(06؆|.A+O*W./*c@ vG {bTΦ:)/ɩyhp<w P',OnByKhbEJp!Qྰ0uģ3nU{!0R5@<_í+bLCA eXs?Iޘt2[$E}˳&%'ʸU'I/ֵiT} 2W5@P^ꈖ|L*k}(|^jSPx hcj܀&MLs3z9q.{k˞={ʫn|rСCxy]Ο?oGGGpҎֵN5N3̻Yd6lPq;Te ZyP,%Pldmz^:P-BR(bKA• qu%tХ˂t#*"Xc6+1MMmGL^=ϛ_/1 ܜ393{g͝%Da~3;vXl2& LQOOO4 EC[dېdyIt̙~#thhtFGGhҥQkQ___t_.zʕdK@C}RDMkBFT};H+o!4Z%ڬ_esyVjsqGӧOy#2\ޖ)y!WfLmPcx f_Q??d}H-J\ԓjEoǕҧT7ymKT60xf꼭cj/lQF~MҰM_WO@f’k4v#~k5Kkɒ%U:]=掏UϬc404ŃN@ဖ̙̍!+͒OM6@ !Xhn0butt+JχJQ}y[p3FgH%Py[G3.z>2L2 !dc/"gl*Xw)z옅7^\}ގSZ,SV6\&"'F V}eZ{2eUX[ϧ/5m(ỊGN'-[,ˌf;Nw[oahlOLL5ѣGۺu+Vu#Y#eK>" -5K>}4\W0 kx&v,M 6ˍnj9|<["˼Aeg[k EsΝ޴iӰ)c!3͝X;֪U;vXtb=y2ʳ<<d353e?l2@c 5mHyd8&8*%_,jfW<ϬaaqB9V%R od&IZ>CS"tWR?zQSl=٫礘y&z}DG4P=}\Dp4 1E[͍ OK۷C]P.@C 5q#:Sc3NkP,18͠f}0Ic{ Pomc 7ІQy..ϒAuuW{2gX&fPXet ~bhKOAr|+ au ~-AƀEJ@=G`0Aw cSg._pLi<}bYx7Rh4Iƭ_~ƍ?pB 67#$#Jǔ2zÑV؍7x-^T4`+6lÇ}$FW\ڍzKG|]u̧|1"|TuSYTvEW^*{Zo|T(ɓ'+8!$+"RΟ̈ #Gp2R8emJO4M/cY˒K_)/*,J9|_}ˤo(w'=uJz}^ T XVXgϞVU ra#/Ah}l6\Γ˫˳9ۺz۫cm޼^ ho3;}>x l vD R5sxejGWSj_ɕiLltlPeM=:*X71:EXO~{ߒđTJ O?~r2bIz*K }(f^TO22iMP>Ky U:;;8E~{/L4cl#uuKE , vvaCٔ9}oKꯦp,Bu>{~Z> i:qU8 /8IENDB`web2py-2.12.3.orig/applications/examples/static/images/tag-cloud-color-small.png0000664000000000000000000016425312564727256026350 0ustar rootrootPNG  IHDR,h IDATx}';9ٜw  FEVl>g?}wAϖ%[)Q& r&<~55SS3X,,?fg@qXU3 YU;+΀8 3@f@{ ΀8 i{fbg@v8 3f@ݫ=g@qD- 3 vg&Xqi3 ΀8oDڽcqg@&N* `"bWȤmڡUXN<|gʜߏim *'.M9fs#y>b+JY7|T&;I%EV w<;c}(˗I$;ڻ:Y'giNW]Nxkgڥ|yBy`f ij}tz9J&ӵx|pvf %5&IR[<ꚻ<3NP@K%xLO&w ^`>5jh"10;3$67Ikne &3O3iZ*Si;t^oJV֬g`m@QZ\{V@8Ic$d E>A㴶 L*1 ,֔FŒp/7$[|F4 %A"]Sx2I$X:HTJFg`-΀HWSիRڝf?p,^BxHD%D,E <6Aә {KO1i\0|,DǒEFxhu=05Y8kxDڽZRKXXȮb`d<,a8 `Txow $H -8EIGyV'Ƭ+B+At2m$ )Orȉ&JV:J.i7NbDڽZ3`kN7L8|(D<)hJ*rB&5G:)rX'A!P,R,Xuz˃ Z8P|[c\| * (8i~g썋 3p3 띱TNo{EP$%XZV%,mի5H(jV& =T;Nª%VRK7 '$Y]!1"^R]c , NCEko0-Z25PiM w[R+A@ zS kAT=͜6!bd:߈4]S'\&-aheK%_fŦX {i"j t] 1T jA^3;Jtـ^F8EYϡH KgFoMdƋJܰ1AelPlJF<-`FBZ4z8qQWmzQhnօ"+(Qΰ%<;C2q%tZT•E:!5vAx3g@ݫZu%:qTJl8c$KeґRk0i*8 x\Mf3c% R;_4Bu!q:>v<@{KPB)dJmX-1!v fӢ)QӱT^UW'"I֌_X"/dP%WBOV0Uzᦠ oznBsOt0 a!+X0+> ,XI1!dDڽ4zBHH9b_DpC3_v='v:9}A6A*S# Z&\?RB/ :4ZJ[jĪfȩxUlx5G`:v%3 c^Kp@B@lș'zՇ*lC'DBۇ8`=beȱ%F@BUb|LKpTg`mπHW(UR#@%"k > >Kn)JA{)? jjZ >b3G)/xp %fD=UD|7ӣ;GZ($Ĵ8i~nBEʕLP! B+lfng, A:M5YJPD,=OX>MAy=rZpIT:ׂO3P7]{cT)ZEY9XcpES22G1H k~ 5#+g$2be+Kx \"`z̒5LV"Ip+Ps׍2RTyz'<<=,T}Է25?"^ݏX)-Q`"`N ]1 LZݰk*_$b _sQq1n:!6-IOxݴ?7If$I3b3nv \I}={ @Cqnn ,LFAְ k/pT0.Ǯ45"?-p%HsQPeph hJ*yB$3_+B=fȕ%\]oÞӳS$$y :SCrˆ; RPA1-^NHM3NSL =<ϙrLmRЗsKX8)&+ @$|ԛL|O$䍄 RA%m͚@ +Le^X0vȎ"@W }/wXhoG}B`iwٔ [85<( !prMG$w@J@tJ7}pE8RV\H#!:mrVDEsM/&X3 + MYWe`UAPTt@9H<ϧMg_vbG tPFW5D}cń8k~Dڽ1Է äHY74zLqP OH' V.W-R-IUv.T l/` 0mjk~GJF `1ԁn5G:$- \E`U79ƼXıxm-wHԜaM'dz$еɺqw*\:1y(LmPW̬p";j2Pi4|VZ/r>IV }:˦='^UƼsh>`+{4سźqZ-rrj}}3h}mw8 w\Ff)P+Qۚm[Z6ҷH̻^Aimy\K'̾sB"6m*i"'jEi՟ W,ָfa3/LZJDy!(sqI&nMPE٩^UDAwG&g|&(,5vϥ7<=MEo$Mu|ೌ-\9:Gkq,yퟧE#ܢEM{rxf%k?)Q(IӉ/}$|s:֧} 3{8<՟bE~uh}p`D80wⅸg7vm_˙y^XEçu~+^Q].]l@v ,ʔ *jk3 ~P)o /L/0>Ee܇|uyœd'νgKFkjt**ܤY79RBi(hsHp><[\Xd|nTBYPџOಫ&&.˟͟xnV487u䧩pѪ]Kv/yVPEepc nx`:eZ\ːSAFVƨZ˕u* xҼ)v=XPjXENB5?z*5ՙD3(b>'9RVX~gobgɒu7͟xM_Vɞ&G~?[0/?Df"W,.,戩[m3@2l :wgs4@+2ͥhvm{]0*Q+w~d噬%%*PmNp|=KO!S5fW #0A*] $rhk-K?xJ5*A[gzNVW%ag2ǽѹj`vU_ { 8@|䬻pNiF),)S[0TWB/RU|ҶR%8EեDd¯1m<>`Qΰ\9T"81ZSۛjK3w ]KB#7ҋ7,DD.ʎPJKdJmceT."KsK+V,v*f.拰הjQKq0s1BwD_P@!Fn%iMA+/\hv/䴾msCgqu& R\!h tQrt[:H;#\o6tzR~vt{w Ǫ.="%%F±C w=GG`R@hrмa'S})́e sx`^P,/:\O0"^¤*oGgj]`fnVg9& ;r!GJV`EdҞ+T‹EKSFN'Ja7)/L߶eݯZ_t*:&P:l& %pxtiTLoml.8dZf|.:,9 ҺnB[+5l+|RJir@HI&lxFbfnr0\dA"Dj,*3!2Na(d:X4*PPLÀxHb5Q ˆ֊՗+3ȯhn2fH ,7jk\i ,L& 5Rrj3E^JSϼWTIS*3eD}i PExygK&X;(>{{zq"Qv ʔw]%`KK׫;:$ˊr6 :aNu#m_0A[zJ^D棤eOxhxrg@݋rNn]gFyUTlki雞F"3/FVKłȬX-WsL,6ߢ0lߔ\Kd G:d|7sBK̍2M3qcDڽɂK7o)9uRdl`j?w~ ݽ~=\r5..$ypg2dC%+d(&ӞG&CԷ`Nv_AiThd 5Ztye8D\+ȵ(6 *U>nk_]ns$#y!G2Tvch*v AFaފ+4@tBO2tmM?͏gW%hmMDPۚ`F;暩݊sχ;'űxg T΄22Jh#/ؚ~Ʉ;y^rR5[+WX>-ʺ:#ki@TbOܟyfa V2ȴ&>GL3p3 N R3<{irjlZ߸ ዽӚ(Լ^WX%RKxU17q &UeĴ85"^t/ QB?&ZgbU9J]5&C 𥇱[o'ڿEUsĉDj\Y_;y}'>;z&wdcQk.=iZ֛kp? D;=od "<}#%ok(JLIJ̀H; ̢] <+⤔ ܓm!658sue>Fu%* ?z(3O0wpz&'2W^'#ZMw\{5Ɲw⎡|f*NRw-顾I<.(v1 ڍNGkѿ ΗӴ^ji0epm:JSW'y^[1TS7$BO{7w\3P$4k{7{tdU+1}gpF@j';G #Œss_'l*|eu IDATÌp`gis#,qn)(i$ Vh4]pRC(0#7r K*{##U"ݚ:v$aDڽ aa@4K/2Bfet hGSK/IT>nոs~G?d&_F ᝎSwĢ?{f9SޢavK0v m&a4 uinI/s%]}^:lóⅪ[bsi>dx |ҥNo(DFy_r_ծ/^i.ᇻ=JNL| (p+NJ'{,D.3ld~ !6,7⮈{E<ݺu=GdGeju˧?#+ w)Dx0'/WI;_-˖L k %5(_6Xw]iiZA`Zp@պ|XʵFA plDJ fXm| M&Su@e5'Le7.DUZG–9^J#JͶ~LE.!?43IfkNgē'a2C23鹗^2ԯ.kx5`EU yt,  l%7AP 0aΓb&e:s—w' "7ZdNiY\do][pkJr&y"_eV ] ȋdWW)]=+K73"^ĆF_?D4[[#K}F[G,JB3#Wo*NO}={Rʤ825pʏ7>}Ɩʋ3JJ{OC6 78uO) pcM_Qxd~B?]-?Di7pay'̮}==*1[>YN<@śnR)2q Ů.c"μRAx D rK$r-VyK$tM %͡sa/U9GWPg=vvz L-8&PFBЦ_4 ZQMN #@նVsό6ht<<W@v9AeΠurBpS# qS] Rv9&36l VL9~lz@Sp:KsW05umۨuXlzcphvux]g*4Z8LQlQt&Hd Fh~W*)vZ{"7J O2L,YоTvɸ$8q#r\@ U~atʬVM]""+dl^uHU#Gp*!T~mWOh-lƉZ{.By:nor4AGzM`p Db-n-}_ohƱUӎ #>ArS8㷾_B8qL8tup78`pG?!޴db\g L{xX$ɾ`RY:w=:yGQ[mRYڨB JUdGDS;0o[eaЛ`L SRQ_hjsgC_@]9 mmH/Ϝ{䑒r 3II4-JXJA Dz+io;` 7L*xx,:Lv_*`@Pj$ SZ`׾ ߼ӆ MU7U|14K>թR4OBAtv֫qx 4( rQ!ŋUpS 4\rgUnD?Gp.6<<  ޓNnCKHp1q;L  \{Qu"I]K=o`l}Ca/2AR>g"8Өk O-sW[9iOOK]_p]9fmhרsC'.._-?0}iƇw ̈́ra}5ڍKK1@ڍQ7`bXC= ĶrPō%m <4y%pyWKr\QQ,jq5I, g]_Vxf'ڠ2tRqkn 0J  V" X! | oܺ?S-0ګ0$I-Y1H"gJ0cgwIOv6xLLΟ;*J{R;u?y8w'& ߭8`ctT,<`EטοcAڔǎ1ȔuUhmϤJEgyJ9Cenιs S[0t.̋~Pwsk.3f Zlۣ5aCV. k: Sj ':Wzպ `/5%bڴ߫p؞Z7\?m_ίxG. xMljo Lg*d ^(\ߣgk/lwx( sH0ķQ|Hj6Q[nrb~^5+sgbc,TNų餶T:A:6MO'}i;R_iF$%D5lû;I.JE|aNmm{?㼲aǃWغԵk77`C /B5 4ǭVWbڜzlHFnRG"6« tArVK7SRYx}-w^8x7jOY7]=b=TFmk6tnd%>i~e; eZ6 @ksXZhxK;yN$|xzuyN]cPY2ٻGYSH@F!p( ObzJAbHB$65 t>HRFZVWrϺ^m.,Vdc۷c@ILAeBT~#ag4nw?hwSbM8CBA9/…Ν=LqC@|XJ|PSBFibp/05 2"{E'`Sl? +hD|KԬy3#AWih&2.R0h  M &&^+JGB2Pa*$PZ)bD4vDK%]Psm&L8bS-O|~e.W,Kf3#. b[BE!#z#XW"ett/&Ҳ`hZ}jd:4ATCې|f407Sf@>055-ktޭ-B%+ 2{)o'@onnKdhSe rlW乏],& 䞻,E75^-/]2E;V  M=NvA*MS}Icfڐ:-b} * \2ύ) v{^~1d6Ҡzu} n e*Xmo1pjDxlPh?!ks/CJe{*|[#z$&:[E09cB3*Fd 12!Lpdx\K0@q)0?D!yv眳%$΋/>bKI:f=;o}X][t!tjz߂S``bUr__%OȄrBp޴Ngh0Ts7(H{9߂K+2ߍݺ{kP#K@G#,D2`8謸~m-TZ8CE#Po4+T0sH:qO'BUݡn" տހ+=Rb s30DuNO60N4/)(ztx?qG+aèݺLs= ޑ X$ܫ46BC?q)s_=)S'L{cIPާz03ߴɲg-LBOpR zؗq{qEya&QN+/td*L`;6(TI69GPo}3{"İeCxW]Sg0 ?CDZsoN *5lg^rgF#`:iPg>lYfT+=0?+MO87Zrl/>&z <{ޚʴtt >pg(9(4` 8Q A5LBq % ډO6OW?r.p*%6w14~{@t-v+xh M]cXy>' :{ٿ{[OmvPMKodDNv(5SȂaCSG$n;x/p΀d5~䣪flM[lyg W f{m`/cX|> cQomW}V$|NUM}wIəQ ^MA5 !sow7O`8k;:U TBt LBi* 7ĖJ@}F$«ܿݝ]uuϸǭR() OI/WIU_Ϟ6Mw6!@"+6 !ƆVe=pl-w+e@WOB]:0~žyzEeiM^Tj3|DT9ZwU7$KXڠ*xc{x-d_'>x͓xY-q)%/}Y}"ưObn;Rq _bv&L*MT F}B[=ogfa`eA6-}f> ;\N^JWLb u5]<F-Yl?9 wT'!$|^sͦUA?\|SoH;U}={a"3ǶHaoI0덦1K%ZݘlmkgWt9P\ǮDb2u_ٽ,zCfA745#МS*A+ Br m K%LyAGP 6-vV槢at`B*A4pVZ8/'H9 IDAT8+߉̆O6 iˆ}йvy!85}Bo$4(@KjkCJ64=u25XGtHّWO"\ϷɰerG#a/F`?ݼgO%FJ ӟ& xqw8H\r1IGqkA `w@.?r`@x2>O=5v`8x{t&N Q8ZJ4VQ<ЫL |G%_% ?Z`WWej N=pZfK!_g4笮tM GF@mB}6ӍwަezA rj|y(ȴQ0][EQds &by>m}'5O 6~:<. JmF5s!WAm)#a0DTz#5A ۶~s~##ܙ5; OhzعMy05E2eQ*SvKZѕ04pF *xS%w`Tdn:k2VI?{"͢Ɲc Zy؃`aFA{homMGKᎎaZ1T2)D߶O 䐾[j]gr۵, H UvCaCyױ#Fr`V˪&Ѡ靗J#CCёa @e>`,$;c`]U&@kJ'svb&HDk|i(OcB1 L]m мh M&/dCT# + }ș/$B/T[su-?uqs_YϕS*[}=jDl`nĶ7 Jϟ$~h֬ԡðܽuuBhf2njܺw4ܒ 4ںo?X$XQqd hhY{jjduuA |XKz:%i/xvϽu ]0)"āasBgTbG6}G墓̀8:S^ !zm#aϩBo5une+ u ;\%.ߞ|Ծކ=v 1f(0n&~7|'CdžM"Z"/$~lfSBUeov͖o7axHm'zyLknڳNB4]/톻P5Vpft.RG!t  % ӡQʳP'( x Qxϵ$*XB>Pt!!&l%iP(DڛV<*Y l'0,&}#J&# .r-᪩p ';m EZ_0TW]~~-$CDP eP/4d[D IxTj DĕM"RZ񝔨l`~|dLz iA ;TS\Q <2EXUTpoou~g6sL׭{atUS\d?K oyZYSQfn-G1w1l f3<=hP8TIxE|_X$q\:6KT Oy]Z6'Z'~{O>7wo K_ӄA2E]̛"iR6T;:}a-wTT u= "o(C=Ʉo־ǿ=Kߟ>cB[ ^*D ?*y(a'qc]P75,FsɵYk &wRqHff& n644\vs=NnpCss'GUJ]OX<1\EZT+vǒ#R"fssO Mǵ Dc\z~؋dOd!2;-,џpv&4D0ꪈ#8,n$M=4|諬Mɀ+ ώv °'4hw9=mwNF.(VPE TND,ڶ?»jG}S`:>ȯn!I0˜L1ةJ.8-N83|w25`\$kڙO ЦZ̀eH[t:E 4jк<5Ī@ vw!bVVbުkl 9J?~P.@;Ћ {|.h$hJfraHD.4{4Jc]"D䬄_*HH?s)X9ˆ/!^= ._JM]c@@!F+x:Z&?c!(BΙ_*RH >ao_Oj`f_ D2i~5 x!9`c;4Ni_:vMSڜ+KŵqI`[w# ނmt_$ߝ t!EU> ݇|;  cxxF:!= muW[E4Ec\ςmãή6 sgB$@gaGΪ@_8u٩cO]":O¤ڶl{2!w8,!rZ.'+禋A-^ lFoLѻ2M[G y`46&@06΅op]ӒH&056`s"bG(B*/O=_hh~#cH<ѹ!\ip uaRM>S9>"h1x *"@:,.Ģn tEɚҫà 9d?EUMB[*QH3P2) FϺb,+t3Cgbb@9 lݺM}g7G?|Go q^_ : b:7NE@|]E"VFnOEH$S52g -.C{@*Z:&n}`6 \ JSvaۮn5'DB1<Ќe U 1r;LB`9D\͈ė[jX8B^Lzw^ [K {mxpN8"kX$4R<>\h@$2ck4s#KÜ$]\HP bq,!?D;?=AxE <ZH^ k  IeO c1;@܆ Â6)cT";*Sr3X/qy:f0ub&I8S:~crE޾Kv}F"oYQK[wذ v:=2KBmiiՍόߞ8O"K6 @:,W!XEH -Z=׵xF?s!Eڎ+T\rq?03HynM{ÑD; JjӋ뛞zH8 ƏE9''O ;h᡹W.]LHF֭4"$0Pfj;fl[Y`8}zKI@̪O7=Kdwss3ug P j[^&:<*m:U,Pf=}<ހx"臱~9~* ̹Rp 5[ya򄛕Ƕ ; Neӱ/Ø04U XQg/2cܴ;*ȷR{_Jb8KFFyf۹I$Cc 7k'X^1=QS nc.7^%,zMhKhەIrmp䂶@avya.QhNq^ w\P]^bCXt,xpqct˩jA| 3tWpdRNDn{Sچ6yV![Q{/) Ѕǣc?pEA8B_/Q f#i;pq莍ttZ@>8w/D'B k>c̾nx¦sJ{`lP'P~Q.औ:nj%gJ##//m ׺:WF1?y|Pp,%e 0wut쀰)%dJс YŽ]]DYSc.gX¢F\qw?ꮫ~yim5`(YdH0}j{~;nYHqbE"!F `K1>~H1 A> ˟\1e'Q|vDim~nSSJpm/#IhW|!09G=0{}+,e}B0y5E$GH^h%UJ|sEcoWM NN-n{,(-k iOd2+"LJ d#XrnW̆P*Ҏt4 J_|L0*޷}4Gkh-QUy2So*M^mT73 nD7.郢Ds$YJ x00ؤ/)<l<ё Im.~g RB _nP#;3ICFSTL2OdL Q%'M3'2rS|eQv@;=k6%Z,=f'[hSrpϗG+{b SzZ0JAl vd nSl̖SZ]lRfJᙄ8^8YXgB Hױ[R[%x#hY*eR3Z7M8NV7wA877ǿUUU4dO6@'84޶{-v]:sVXvIydڍz2Mf BpGkL1/sLU#O˖rPGygK߆5r+ <`(yƃΛAqF'&F'~(O#tOZ9&q{bnDjO%M(lLn2{* 5۵Zcc*z%,dV2O9H^D<^Jop?3yy!͜p`F_o8ݧ[:f|na('O Bc!Vh7v&e3gy@̺76&Y#y7Ge>JdO8]*#fb3UsR`bg!/YĘwj5(?TğZ&x_C4AVӅ]<ɉP{u-/(y\9 >E}´iToStԑYrlSvÄi ZBmO|-*d20PpLY[C;6&ۋN ݸ}G6UvVDl&k&RB J+ejmOm-߹%\eo;QTP٣^jDd$нqQOl5OX DmJ^;ØNvD"8IJHq`S^Oxn!Nx02B3ڒo9+LG Q PO\.w8w>- *Tƒwpg N yHXyscAⅣ£UM6{)V@ SM ``I.Qt㯋Q8OH16a1~5q: |u{|hwS 8b˓j,9ڍMῇA+wV ǃq[GhYdqc5.wsQ^9s8H`bYF|>S+^Ժ\lDnzA\vAhv#}2̪hj|&savz{z<0nA`"b&&ƶ4YԖo%`SZ@ H[չ̐Cf6=Re/PU"AnBN45]h0jܛ' ~f J"$R(FcŌ\2 OM=鋎v񓻷l!9MoMG߾#M3 @F S~%|^e~,d=&N NWoX Tϩ-+B1 jE>3,3p}쌌d DzM0ndB.'QiFU[Y_Lsa`BA)QNS݊ I~ f".%Wn,R>*쬭l*46>N˴?ܽ R{SErp:#UU}H@[[*+?@6U[{e3oU;U`rIx׌smI_J,RGrYo 7Vu7Ci6~ fY'&]3m($U< HRPMOP* S7[X鮫 hir±M| !N5%pL9Z >Ԭa/yĻ3X^y0x yHO74HXCx"o7<BK&bF!dCVvlCx{!` 5R:'l(s`ʧvyGcIC1A!"}B9.e}Lc étxvHm3 MykJn~[H7nsc|1G Ph:Zq_1< 0;Q) B=C*( ɯ@+_ y5ZxCae-eB}^ Z d⸶1,#=NQF9qbGRE Ih4[S`e'mČ6+/$οye;O[|@ z0znjM9vEk݇Y:^؋('k8KK7x"숉WS ߼o?]ǹԃԬ8 +"dz,_2.R%塺:DϽcHøv9lonМT8bx|YgxeO}$5HQZ=Ek!^z +/Ķ7O]%V@$~EqþYAԺ,h9~(\Jݕ: *_%H ,{W}q2I(|g]_)[18q/ C] ˕ 0`ЧMijz"og^gxYLsF=8zCPm]WE[6SˇW߼]j\Ʒ >;l nOUHGY/.y_;zpC Jo_Fj,qWkYӠ0%. _ GY8$N)[%؈4 6lmN%S[P^Ο]"[`0C%T2vVbLxFb$q&.傼 Sd?;|\3h.?p%B'°hgTUzn7zwzq+#OJ8<݅A#uZh$КOUw}+6\|(Nx~CYmJ-f t[ 8]H)`Ī_YY1)_)ETǀ3Iڶ(/lZ/1Ŧ-yCsIJ1*_DF~ f7.mN٩vv,|%%%]]]^S322p8:Pna"Vd5OI' cLc`:3>C 9l`% gD^T~T4:O={l,V~_|ͫ[!dz||ԳbXU-5+"ZW˜-=vaex7ՕyVT:EMU2 hkSpqxm2z#6< DVmRجf*C JeT;Je WJ+QW q7)$YxEgPQ!"D.//3C 4v;yj,tjrrXdAq'#m%g;\g nՂ!ꥸ9TuM}7~[5YxKj9 Hpf{Zly^oNo<ɁGߣOs{?lkYERr(- M|,@ 4R-_`^<3@>]ڽ_^~CK*%+?UbyV SNpo -ǡћ*x ?cLOkFb~mD(؜<Լ0 , Kuɠ W~{LcRL垰 Y7/趗6WEҙZ}yvf~:'gU_V!BY"톀\qWKmB_ R#ywGYrB/&4rc=GuaW7]/ kjjpv%7o޼pBzb􎏒:VQI䎚D+ /nHQjj$_'ϋUb3禊j>[5ᩀ#Dtyܵ]rj) u`SEVC;eU<jof!Ur1>Tx@'t1<+%zQf)i8Pi0'd}ҘRTtXAWINrsjˍKǚZK.hf>!W$9A>sgB"IKs 1е%HIu35ଯ3%ᶖ5Ƣˡ0lGWjNa+E`X(uGGޒ(-:ޝMu@yUSy1..|Vы]Ii7b[Iڽi٩c> kC>il9&bdiwhƇA*փ0y&W{8ʪddɊǢ'}rGҶFvIu?yd0y}û$>~IϏM\ Vj%wƆ %]IIw(2|o̷:'2C>4[:pVLl-,.x/vQ%C.͎قr9’MAJEߨl_luWpj(qYՅ)Rda__APuf[VCQfKeH-0@aHTa:TؘD=S=2Y4ɖ^=?+!ڒN+,VTkiwCh Lx3,f-Tȟ n}lLę玑k [^#GSF5hV`-oaGEF?^i}GĠG2[[PʷxJ沐A_Bɠ\@֑4'Xa%G%&'1*3ŕUBdh"AUtٶ|[GO2 M^2:m-)M!U`( 1̻#HcI[ jna'!nRm]RTZ5]8Sq%gM%V(])%tR( W&[TO|񷄯5 ~\r[\7 rze&Ƞ\qkavf{WbB^)K2JyAzV4)`((¤fjoSʺڍh,Fh͇l,vC]=fTvO"<ڭJ+? ].[,L l1@Y.W.FBE<ť5^oh4]H $N 5_l:ZLY5Kӆz wy&mT_ ͙@=8Mɑ35xK {6׾Iu%B=33>bʴt{v#׮?[;99HN>ř \(鳥 _\|<+1+u6=Y( o TNJ8^rIshVQ_s/w߼J3+NMNv:6.ç ^pN2يԒ-ӿDdVgZ\e7`0I|2n+h;?eW$B>xkÓ '_w"Š;)K&CCjr)D㲈Ia)4Azl<&6쬁Լ#' tJޒb"9cPY2 F"A)Hl3⢞)XR{24ZGN̊^aj9LoHVT;\o;Cv]Zu3 αuS+6uS3Qڕ6)f:6MsRp$Ȅ*K l8G]ł TKkͷ 6F[C"MnŭV4I>9rF+mf\U=/oc?.8SvXApGE[JGCGws KA?S,y8cl'Y^ j>}+Fg4|wd;`'1$&JB755;v [nJ» PIgΜ2;w[H7n0NquHZ?Iڽ߭M14{ 1-v^n˲[ -SLD dC~+Şni/K2un?}pS;rFB:o9!#=_oa>dh[mK@DUF-̞*B8[ηwM|~QAz Βb벾M%ǣwoefe<*eH-ʖW~ddn"G%;sZ_b-,}jɉ4(i%Vtς]3eSۄ!x@v1dC!26bSЖJ %DDx`l6Wlo;ݸ۝hnqmS283ՔӻNvcP*ܖ^_y[n}u紛m^\]JF\?M;Q3(fA m߰Vʼn̍M}%I56O]_w>QlF%G?==='Nn?0C".`u'[v+mn֥jMjGH|Q⪐JE#jP+ 'Ш Xj)9"{H CzQ^X_n͞2TG槅a@ƟPbIN-y5U$' k DU哑wnR4\]h:V{ϛ^"e@q/'vͩ'a^<|XBV~2b EsX\Mh%[;WJ鲹~E?\5HQ]]6AيD [E˫Fc*)fM|W3F26iH!II?Lwq?̬zfGFtbMއ2z,mUz/ꞝ,HEF4_P5 פ}2hhCl<+Rs_PZFB_֜xMsHNjO4;(n-Ndvӣrv9JԔ&˜+7XE4t:#▲ރUq9ffƉ [wJyUB\" r ]#9l Sb3pƽk7I_Ò/kڈo:O ol~):$[>q7#PBL `ay)0+Dy:x4cf+7I'k{)HMϏ=%+~%5͒gou%yt^6^v('I Pj]02Ez%sG,`'YtIi*+0g Ydb$b$6ܚ8;`nܚIǃ>+".ROKlK5}?WQrǴV{/Fnw5w;j f‘7^>sm5aw@]ya\ &-/Ig[鞣zs$SK f.: qS4 75vo1'@̄jOjONڍIi wҥ^a97c]=e'Ə{.msrF)81nhl(Xyiồ9qMyhx ܶ *9\h7 JR`F7St "&TIM=y>E?kkZOǙ+%Bb06}J`MP |>uݶ-\u%U$v٬>*l_"MAߐ?.CUrzDJ\ "2c 0H+,47ySapi82AMa^[|9l*>{7=1D ZS {n>-)ښإ&my0}iw^AQw~pQE G}gձ7DHa|WP\{eG+={-XUG_).eM5_@(|eْI1L+9#"Q *D@aQ~g"B)..X')fBlʻKh7tđvG'y5Ly&IkAN-]g` ][7GX`rMeLM0ɔ5Ęɥ#ҹ-P.nWO~K>-LkNSqy4$iz;~37wv1DPPTR}~M+||wx6W_7JCP 3i?V-.dW3frz%<2 Qy 4glLlnF&`e>rLH^Efrw׆l&u$&2+}TD$¤#>t hN4K'ؤfQ VLTS@j싰[9 RUf&zz!<\rm 9$v Gs9jh`P}`a1 *^^˾s^&4Hap.92~qzyw*dR4:%ʏ5N$3P|ؓJ,nNDN@L.NR &81E!Yƃ G#ԔPc 05'XijpK o(tRGݾ1ml:W>'Sk[oIVe_?~{uտ}F޼0*) gCjETΒƴ܊', |XX2&˫̽U8^fdh92h4}p]S+nF8lvGbap|/ibTƬF&e ;\22|}ĵqd`)\_┇" L<"DǞwF)'ۼmỡ)Ȃ{eNʜ"@^Ud/m+ *Ϥ Q`;BW/HxrH;e)EJ+4q5QJLy=D6xQ(-= a ˶1*#3$r-4|ʔ+ YvJ/v'"*"bH +a} h,`Y(_"1YV肔0rYO 8'[3p'9.w~Hl&Nݐ/MQITEFst8B0wԒN 3t0Sق`[ÆC 9,Vc'R?9FGHL=L73JD..>h uzmm{;%KR{k瞃c'IyR4 @rdk2? ߘ&:oK;m飉JK>Cgnq7}r̀T- L6NϪmwp@$> {stTz(6s+h7V"(ٌcu-VATla/|71Ii0/*! K64h7 S= AJ8͞JHi̫XUƒ}N݌q7%f&>lMv̯"'*e2l+}cGņ}@|} Y` cC[ Yڝ&ٚLw&fYI%)kLM1͇~{;i;>ǛZƐbj[dzn.&Be\d.Rm FUe+,:WV) XFo0">[$֣`kJ'_5I#R%NRWd!KRd x:-ۨnKstfaT14M9\J3,GClҞo1,`q2xpr[$߉x! kt A{ ?|p+Ml8rԳ'ׁpT;q&@`"I\ĚԾٚ $](zm5(Z% `ƽXnȇ!ƉƼPX4˅GSc#~(#'Svʉ{ 鐄CYs)Ky8KXlV "R՞v\#et`NJU'4$# ΐc._BYڝGţD_^''j2 '@[Y -Qͳ.%`óylnVRL3j=aĭA2+Step4S2^JIZ,_~tD_;}+)=[_VA(ڷGe +%ﳬ$.PcvQSšPvk0uH!Le *Mq:h~iQ/Ce^d8= ~?k%?+I``\b՞AWF}^y}3}5}fۚo$/Zra t [˖ ‹4-y~n94WPdUć2ґBbuz:In Ic3MZ͎*R }ڧڻ+b̮g? k)@emؐR^Ea׻2.@oc{ cPM}QA"Tp)o$o٤As1eijha:kmZ}=kE}wYfLm=zESDPAY&iEVO$5:wf"g kAR ­/Ʀ&Hr=[5Gj%]ߛMy,i W?7dž3Ĕ2.8k"BZqSLQU64G//L XVMƒwlBSN^1$`T.G}xꩯ S"يAWԞp刌Ϥ1ȣmhbW >S {jeԻʈ=Rg NfYV& _.fҽ@nOI&w肿Ոۿ)[Z;љ8jHrHZ![M[^S`~A7_PR.N /Vm{E Zt& &r2^-Ii7LCVI̙zRm.lS<2*2wyٽj-EF^u)oBt5e+ T~;*@ ܶoBgy~>'!IUxsXxvTN;#{qYģ`3apIKY߆F sƑ5K-5G"WVtӳ}4hhp4UoZY*09iÕyJW3!{Db*R?7=CRj<%N&[W̛7 kyu.~47s$}ICi;I*OJ: FF5`o;&6 wy`_9r2rsхt>籐1fsҙDD8OƩ48fsJ3||J뀓gn-  笔Ɲާ+`-$Ēwte_oZlIՉ K_|2׾CX 8uŷ89?YӐ7o؈aQ ]GLuwJ>+C M,GM!ɱV'0kZ7?e_rHآz%/K"g+iy$GIݷgj< 5.7N_<;7{uw7C@A3nSMk%+ X0Y-V#[Hg\m=}?Ec KkԔmG.~kyűKonK>(5gȇZl /G#hln 4/~C]6$xc P`2c+U[]Ze^tDεJo{oTָ=~B8󠬴>IllE{vKosqzHr Vp|t^<7s䥆U)49w!훿8> hЯzcH~ Η?35Xel?~TULXQ?/S^d# cdeB6W6W2H=x1D&yhӊmZ_[} 9={9ZOZEWS;<;~&9|w7=1#zTgmVbwFFO%q ȷO{mCgG^bEjw/ غ{AZ88Cbk*{Wyd2r~~%TiQky[`߅Bؗ#G3B# efh.Lhr,617˞I4Nӻ7,f+5J3hgU Zk{7Ȓo)7͓UQs?״۪|>'67^ ޏod/Le<RVТw+0p *|ww߾b=Å@bzɝDWv [VTm':Rr*K%:[i(̏p@ z 8,޶OӅLͅW#ᒚf? ]w%ЊcyH9m΃'K[fBC7C+>_I`Bui+>8eN1`ORTn~w"7VW4-澛Kwr4fr9_v>~2,2bGׁh ?y/ǝݛɂ-e3c HJ,K0Yl}]yEDܺ$ 'óQDkn?3s|7T D^D!w ,A=. PChcJs&GuoFSJ!]!;F,ĥ3pdWRTL^f'8c#$7wniEɼU<Xva &6h7^S{iyor|n:;ꟹ5:8ੂA&e;+vH{Ԯo 3^@y%wo N{'z'V\KW#0S9ؽvN,-/wrIk `Rfo mgL ^NFr<I@lSDG~]xC,%/^4rb sZk6`Ц<8%c5Мx[ܗt+PBF9^5+Nr3$;2,mr X~9YlCfT|ia|pe~VY'Y/_d9˷\ӓ ;9 rl IDATY ]p"C~B4wOC}#~oW}%Dͭ{=蛉I?0"f&?U$\;6i7zNg?·b1\w>zZlhƋlD+'58٥ٶN'?BW^ZzJ1fEP nL 4Ӈ|qީs+ꚠRm^Z֕)!17?ɠKkUFvte$A%Ɩ?ƃPr;KK~d0K&?U3}a>k2xwݙ'3<5!Ž ^hΥ(T)XF,.m0J '݁=v*8@RyKZ^:k(5 ^GGA^%KB,'i""pW{҅c˒@PfNb_vq'}1Y|pfcGr[+kcC_?rb|ÛW9 ;=ī?&8o n;%c~05rj? {@ƒU5W;A?xm^J~ /v12<7\ i7?=;inF+M(+3E$Ww>(MI hXH3V"΄uiB6խݾDԎQdyq"K"QB, |<;WӍ.ٷxRۡc˫1~BHl<@Tz]=e&t N|5wk5Wii* nϋ3b#Fx |<tڼ>U-@Rd O |923ɕ'HQZG)G)a3w٣[sOii{u=B$X.m]$ݾhi 2G\n ?}t;xT$v0im#_T$il)3ي$  #?13.7y*_QKvܽ>`vouzv1K[FgJǼݟ [^;*CX w8w5^~(CIłbC꡵Я {ev3PU⫇!kB_ff_89^}$)1gI[ȭ\ϗ>5 wp[g|kka"҅æEѷ8o n‚V; /un*+R%f jEB_Wza2$"X]őGS_>tI llQ{sMNifnތ;VYܡ\r:47in A׎45TU ×{GRrz#̺ED؝qy7oh dH>ƦbxfQd$ܕsAvl$ʑs# ɕ#71jУllŋH5g ‹aM;;>2Ce 6u rziؘːx<%g .w;7l0O5NW>hK^SڝKv/޼g>+/s)ِ>Wĥq^4J,k&E\&R _02S@܌FqxL#`; Ex#g {7E]g-FL9kSF~|V5u@Jrtmյ.뛙ܞ&/0`{dHF%㵃8YN%?fTeSTʱ$ ~f\F-y}2>@%e&%7俗}|k_~zV6=V". L/nq`聳gst.|Ps޺%i͛m+V>CnǢnʥk#,Ȕ4|S'C^Q:s%.Δ6+}s4^UG~x9 ]'y4ܻwϱv.YM=Nzm0k]ߒmY:<г`>s+.6& [>u،Y\tW~Czל._;e ^\c%Dɭ/9͹+͡qƦ`.5Gf]0ymmϯtZmVa7{mL?(K;l7{wj6?÷/R{.)}qQjG 6Ҫ&(-$bׯ?Gӑ-궻y=k+%xĮ핃aKVhkv;&3OK2TV osvB]4_.Jd&ns utXKqh'lo?}O<9s#>jB7|:!_sL g S6ɔ8wEk|-sU;U pECûRª z8\Ջ{׽AIWzrqgɪuqvη'sq|,;_7 ڡCuwg>j|:eb8E+[:yi3"#(zº-zj w5̌weL'RW.<2tnѼeJesf}u]]O^ep>'Yywy텝/-^ ꕎZ~axdAGeNt3~oh xv=\ xf>:#9"=_ޕ {'ha"t;6vlaɵ^ rf-05-y_V\xAU*NGoU+%d d d zlJi,B}75)(#/#1ė̾cR*4qC"Yg^Gٙ2>_&v15%ǻbT`ZƷj} ;22ޫ,/ZhժU]]]5v\޽{⋳h7n裏K"֮]O7nǎۼy-[ƕ^֭j \>A`LիW)sܹ۷?}-i*Y[6M]%-Zu˩e=41ߖ/̮\rik.8>'Z{3?z417ڵkPѭp}/ϞOҫ&"ѣ6lɆ>?֭[p!# ),Q[ [C5xw >Wqajgrҥꛈu:>Xl?:dw}6YCH:J2>xT̅165Xp8TAYS5k:::h}w,Y">+9>ƍxOM< aK cŊbQ9`nҥ*7pBwcB.Yy޼gf|a  wxʕP%hWI᯾2V˗{4pႲOƮ;h MT\ ŦY,JQ_qzjBD}}}{1z$0?@tww1,%qp'==9 mR9gC۷o=QCb2v7Ȱnxa\W_G ˢ /U5AC]HtIr04oi"^{-B̙3;wb~)ādAU{=R\Tu7 ""vA .A(&#,lShBg;Z Ј/o4PhJBc4(% R+"z-ҍb\b[@JggW4ƧD7X`ǎBO)Vo!v3?k0 5Il9?_5O@駟ھ>]`۶mQPtn2? W"܁BЀ2rx!q rՃT.$qZ]ֿxz;0T$(dJdq-ma n 22KprY@X,b"8s[  ^ 86 Tu[¯*Dgb뭵x?-I]KTD|&d86s[cd.<ж*+Q4&-|#\ ħVU9W[ʌu7if8, G`2+T`UMgs=@j8TDQZ[$F>niF%$J0v>?S` 8YIQSBziQP5ƋG̍U{zq\oj ׬&B*WfnͳjA@LQi)}~АW CAmj _x? .( nBꡭLPBlוS{zsá`})BA:0UOei\LO "]8t銾UdZA@\ᦄݺ@g]#s) d#V-/Yc1ԫ{zEG{LKs]!l֍+l1 9 'NM,T&~[]LSp]8JJ8CH!Y/bLj"/ ^4mh_=,,!M苅D, VXfag$SJ*ۨS=[SُXJ =hɦ!qh(mq"VK/ L:rQ =trAΡGnc`kRh%Q)hW8XF]TmQF Bh0 sBQ2.B@rcbH]b:ɀ(YOI.2}t C[S9ѰIZn5X .[=[4/0U@v#~>\}7?)@MGl}By^Bx`Nv|y$\H:d_@O01 8E)FD_S ^D;ƕ)Zb9U04"' ޽;҅N/CI5 4?#cV_aj "N[#Ǽf6I3e N\OIxJQ5*&|=te 5RAL`X2%6Ԅa7  +ahԸE<@ԋf> >YCI}+ I`&YˇIDAT7ϘEf1EC+Cl %u F㊲MOpӤb+)v/p>q< -*r~BC͛?8#}74< w2Dk=2vmJ> .ADc#_ŕ={W/8E'pU`RtO_jPy_X&U0@ .*SєhZHa7y3idn۔|-mmth"UA !2$>f$]h5*%["JȦWQαhxweIFSWDID,hٹ>eG|p6XP.ZS8*b+}#$]aCxvb*}"Dla0 Ҩ×ԥ L'Z9u/mKжp)ik۾ pD#"=mz񸵂r{)14!Dkn.IυI@I4~-Pix*V4âY(X,'s=xMutHZ s\C6 :G;U:k0p# # ֐m3i3l< 1" [$@4 uQJ}r#\_-&L]snj2v7YPY @ Fsu]@S7ۙ>I V8d2z LY dnl Y2GnyP>EK/ r'[t*DI9!@3Di~_$\t x߂@pڔՂaq5Q_:D?Џ+hRV0Ww";z^ $\:=uE$[d`p>~.w vŵCuUz;nQ젔$Z&5T+2vOm`l間'r2+]pCp6Զ[ nB1-41"FڵK4 fDAzI zY4 di΂ƷgYC@C~lk*{dйmw̩Їyaq'wnf?}υI@:drfa\op 5iy~uc~dp x7>.]3f&nH6@Fq(N P2ʸFH.CXAymf\Yz4 U| |g-P+-Q#Ʉ-}?*EJ#-dܵMQ3DPǏie0''Yd@CYm-!B^p,-reM`R&d[.xXA/L|Fr!+P&KzD i)k1t^6m2v7YV@ Fxf{)^LJe18`߭J z0Je|}S5Zb@|Q[ gK\F 6>'aFX5_P ng؈$CT/5_z$R!2Z}jIbeQ #%+h[ cwm%f d d ܯ*g d d d 4o,![ [ []of~@8K2vۢ_@@@-6mh---x ?k>\IENDB`web2py-2.12.3.orig/applications/examples/static/images/favicon.png0000664000000000000000000000050312564727256023657 0ustar rootrootPNG  IHDRabKGD pHYsHHFk> vpAg\ƭlIDAT8c`x6?6Ƈ2X*'#:Y 4.|ğD{$za ;d#F YM o4ీ+p 1^e^xԲu 7%tEXtdate:create2011-08-24T09:31:07-05:00hм%tEXtdate:modify2011-08-24T09:31:07-05:005hIENDB`web2py-2.12.3.orig/applications/examples/static/images/Stickers3.png0000664000000000000000000000720112564727256024106 0ustar rootrootPNG  IHDRY`YsBIT|d pHYs  ~tEXtSoftwareAdobe Fireworks CS3FtEXtCreation Time11.10.10M) IDAThݙ{lTU{Ϟafzv:-R|BM*r A(91$(A%PL 6))A3m}7;[s4]{ͺ<]TUeΝly:NT@ (t: D0Det: I~IPUQA_UU~?:Nk #"(w^A$I3 j@@;w_~Mعs;h4FȲ,ˈHll,:@ իWbȐ!8   $@ @0DUUdYz7?h |>@Ddd$$Ʉ |>EjjȔeEQX,~Ah4"ߏdBUտpu544|".X,uuulذ,|>,[w}^OWWO>$)))ü;rAv;~l2dׯ_g\pJ Bww7 vΝ;FzzzX~=8JJJh4t:),,d߾}lٲYY~=7ofȑ*F1j.UUx^|> :F6l>ʷ~˗_~޽{1L455? I{졻,nݺl&##_6`0Ѐc6)))!776z-:ɓٲe &`0b0x`HLLdլZ5kPZZJzz:>TUEUՠփfS]]MEE=RPP(F#`: """$\BKK @3gp1~W222t  JNNO<. A0Fzf{Vk,$''l2rrrdܸq8N>L[[k֬!##^n穧vSXXHTTNEWWdee1w\Z8RRR~$%%9wYYYX<,3f Z$==˝;wq7oph><** ߏ( NP^^#G Fwj(oYxP2Kaa!ϸqHHHYbaӦML&mFss3UUU̝;Eqܹ399;vAwwwѪC}}=+W͛73j(nw8~TƎKmm-UUUdffQ[ԉ'Xr% *&JIJJ|s_C=D0DQ Æ #//O x}|\.{=Mp2EQPCjmZ ׿E\\\?w P__Okk+K,믿nk1KUU, /^d8N֭[GQQf|a$^gΜ9rI-ZAy&ddd˙3g|2)))|>z=N 3gƾaN4۷[` .OwQZZJtt4`P#X$F#˱c1]x'"nEQ[[ҥKٳgVEtt4W^eɒ%8NJKKYr%"f ~]eZN1{l9s 3ߏয়~BE41^UU5=Bbbb|^Huu5UUU455ic̟?Gy׫uww9 ɪbۙ0atRvMBB׮]cɒ%ܾ}˗SZZJGGǀ_#aÆ1qDN>Muu5CEN< @^^III@Xt)&grMrrrl8q}Q]]f0aeh.]VJ^/Wf!noGR__))),Xۭ)$@K^:XNǥK'''sEVX|@II ⋬[{N´ ̚5ӧOsIsőFTTGFMEEӧO9rd {zz(((GrMM 555/v;s!::#Gܬ}';;ǓCVVa &.^{IK.Ayy9k׮̘1EQxgx5Uq/vy0TUUIccВײx饗(**b۶m@E1c FEll<ɲLWWW!ttthCE2332e .d2uV/^LMM ӦMc˖-Z"G#̔)S8~8 TWW0uT@I&m6*++ͥ44q\~P/μyA`x<ݫ֭[IKKې>Srrr|}O_eqPcǒ,˚+ 466޷b| KJg?+//߷U$7nzkZE(ijjBQl6(µkCc(bZ1\~/yj1b&-Yq-IHHfe\rp8eh4FZrvr"@渚ȑ#@W#hdY3d?)Acߊ+/!sxIENDB`web2py-2.12.3.orig/applications/examples/static/images/shadow-bottom.png0000664000000000000000000002271512564727256025032 0ustar rootrootPNG  IHDR  tEXtSoftwareAdobe ImageReadyqe<%oIDATxlS˭1 g#8 $ZDhĉ d*ǎ'5>#)3sl6xߘx>8L&qx<fvX,Fͦ^/t]jpEqQcoP~⽇#BNYդ( )84ޕg21,yJ,9Ъ}S%;QhBUKքq+Tc /O9cnn"JǑy^ڗO!לK5*$qb(J@DG\;NK& r ^[D,{egdwZוB4M{ʲBmR4u=Oz<ReYvɺmT;N"YOH ,T) >F+q+[lC'eDamT1‰ Ʊ` PT!PVP1JЍc@UUQ]z/a( )LeRPD.pEJ芡 P 26:QDt'lJlx1|E4nz}:!'Tڼn4BQl/x*(U^cFҳ^}m<=yX`jR$;Ap=G.JEpK ӡ=ئ3ɴ泥Aэb z~l&㗵=g9r<t:4 Fp,- Pzv+^M|>+jUzIQ\2͢$:OMRabHLOB%{*b~?73uƵ4 륮7Ǒ,Vy o|WR KԚ=zGtZ3̧ Q1 7cWrpZ{/elAlxi\Yllt^e3r|/2:j gh G%6; 1 ]G6ׄd4!t͉a#hxzg+W qDIS00lHz$1d- 0֎Iɍ.q27TJLV (-r&>{TPWt|iyN/XJg* %?x{{+m֎K 3 A R27dC"2.B$ $$8xӓ&;cjRcpXG;gZ 'մ}b.zVZUg}}}-!rvv*@OOO7xkkJKKK .1P`a,d&@Sb K}ߨ{.q%1{(.{Qa=99Cy{{RNnnnHF xsiXͤ<@1&x}}=1d2I dz CzbZu/u=)y>ri0υ]yE&0 "D4Ü |$ nVUmTr^C~u@ S<͌7Qp{JLR<3Őm8!\D r {ˁb |NZJ)zb.1K///Rv.~{JKSX׹_E}yy)i{{N~~~ZuC`HP!Ӌ]\\Ee׻5%ALXpKcolj/a\taM%6 ipG|z+9~O*޸F+І A/WWL?m4E;rNSS6NxhS*Icb'docQޫq`$@&#y_1 8R\`pu]ݱZC@M0@,DFiE-VV>* +_ۣ`1_vk–u̕!Zy1/-bzlj10&W+&~x"@*: Qu}}]嗗 }#t %aYmjJXIXz5O65"[YRO^T6 m V9 s,ԁ-fElצmg٩O?, V{p ;p B%XfB,9=wiM@`x??J@AȆ&ms߁3*TjVoBbލ,PF6dhIg_NޟYJ2r!!queEZ:ߺohCK}.tAk׭"DH#pD"~@dp怄j36idaϝGO߹]9VFM6M ˗/Y7dib؆ /T D&J>\&֭[Ó'O۷o]V֍Š@ƍŚsuJu0^0} e,tȮ7 ӧO|0>B2~իއ?>>}d`Z9UkHQC`\IEZs )W ʚ ,ny"C/m"w5nTS9DZ(xUt*8.nPP W0:D5SŞ4AP$RsG[x7Z"Օ=)?wJ$m4:THz遑y=;R9pP#vΙS͕QY_:z K?b(o޼>~8c@z8ݻR|zzZJ={V0wCm }U# @E̼00Ta㡢LwI48i*j,GeDť恒.P\lրnk&`2aXQ maaCz_$lcj̀H "5,Yt9j#υb"'cdIX\V "3X:ղϴB )8Ϧ5-ᕦ,@絈,kU:%ߖzQ^!0RUQ$jq1Ӆ3G`ݷmgpm[ߟƖQ d SXcm"*cɿ|vV¤)%pqՔ,9R%՜u_) ̝IP>\al(YKyF Ɔf>-hF$ _ <jdS4z>8%מ>ljvhZlj<b^"+krYG|)A^`@11u4$k Iq nNWb@wOܹS@{E3.VX% 9aj>4A&nkn=KA(ZBE$JȮc$b.؎}_4ֈÕY:QK:Xp@9JC[z԰X;ejB ZIAP]ҌnWt- jw^ah`p=C:v|}+)&) ̙da;b<*R¥m k-5I%R)6Z (cNhNd̪1<.-J{ӹ>q +i6vpv&=G5Vۻ6m1.p1^e b{[<!dHD$$< xDB ^mܙ'Fjݟ>75S@Vrw4&k8\  ?vg90t/ՈPw.{p3N{ȫCKanE;Xp1(pH?wyp&9p8'5Ox]>}*1o>78')rx:6#9NMJJ> z#;Ř1v#Rݓ)}q)O(hî޽{1?p ;aUOssik.ȣWC$ה8 7 1mB:XٍݩlMAy<咕TE/## YWdS# F2n?O;ǽG7mfʀ A#U8|R:}ԚFd/WFuo2Pm;'oyg18W@%sPI_G^NE|܃9+ g@ eJEX]=ğq ֍u/\d'}ZSR}}p>͛742j+'UjA}z!>&Vbwp2xX@6Ow@ՙ:4m͜Ѝc#k7@%HtI߮Jrθ(zN8l/}/7كA*vW,ҍDIdIaG"8D@8 &ռlӞI^f=Tm8z[e(f߷eXe[0r>QhNp,ZEOg2(!W>NQ dSx|h5/-UK'(T) fhY%%Ɗꍝ{GiRlU;{@`6-`9fw$<({YaJ ;ߪ?{>xOZ B˵.˺Fy;Pm~Ǐk2-{?` # 0F˱{x38'VF ! `={ˈw-H/fO9,:B^b і}c<>|Xf ).B| fa5fr7p\uFyOZ+9L‰rKP/L"D{E#}(`F#d|- aTੱoBɒS%kLlS1C4 f.;E:4l'뾹z[dyWZs /.XSxUuۄF…rFT!>U0":v̱!SiQH1&UArJOMtjOz]N3r,]|!( PY's2ٗccnG#\hٗߠ:):/Ӎc̙p> 넀U"x%n/<m=:K p wU!M(f=   pp,6f) ˋE0@b["ޖÅb!ܜ3j3V`8R[Y$GM4=dJ/_bZl)a,9I6cn\4> N؇p@h,@8'IeVY? O@S?MXj߰#j9&F!Ri$g}аChXJ+FUo:%خˊQ3?DJuG*Ɏ,b N\P$={S'LfJsx56ZFԟO6[2vvxuZE#' w!}1'$uNvUKH8{کUm x Vz2u^L_ʴz*Nnl& @~z+-'Wm 7` ߄$DUdڔ-<^0tHV88,wVY7_@'vJYAn!Fh\  2GН}x#l3eUM$tdy*Z1Geg̴ILdd w΋) ᬯٺ)փWGEu0h2mkiXZ5:#">,Sb6# fk9:2'WX@MC*t'赦MD,ݬakjVkI@2Wn<:ִ<c޷ *$6ɦ<c6YwVry,n)!.$1Qt6-z+c]]O{K`a;["G ?ʖR~NN(vW >"ZS5P t~zq$~ɓ#Ul Ì3S =bi}h!+@&uD`C|PB2!@LC 6+1\hg5jduNlA4 +vOU)>BVWKZ}R; '|f a{L찼0c'l>ƁyϜf~uk߲-`Wj|3}Tf9;c[e £㙅wlI}7P o\$k\E@;* zFmH󂵏XfU. 1ϓ5ڱ})e g_uXdFaقy̓xDGf"Vwk݊gonͣ TT/?0qD$E&0+_~t;>ۋriIENDB`web2py-2.12.3.orig/applications/examples/static/images/glyphicons-halflings-white.png0000664000000000000000000002111112564727256027472 0ustar rootrootPNG  IHDRӳ{PLTEmmmⰰᒒttt󻻻bbbeeeggg𶶶xxx󛛛Ƽ몪֢UUU鿿rOtRNS#_ /oS?C kDOS_6>4!~a @1_'onҋM3BQjp&%!l"Xqr; A[<`am}43/0IPCM!6(*gK&YQGDP,`{VP-x)h7e1]W$1bzSܕcO]U;Zi'y"؆K 64Y*.v@c.};tN%DI !ZЏ5LH26 ɯ" -bE,,)ʏ B>mn6pmRO wm@V#?'CȑZ#qb|$:)/E%nRqChn%i̓}lm ?idd",`H"r.z~(bQU&)5X#EMR<*p[[%.Ọk7lIoJF lV!̡ăuH`&,zRk$|$lXbjߪdU?Σ$HW$U'HE3*խU\}( zhVk}guRk$%|T|ck獳"D_W+.Q)@ƽHbslTDR2Xm#a 3lYzj㒚#! 4J8(cvt]aT D ΅Q?^-_^$:\V $N|=(vZ'q6Z׆B5V!y3K㱿bv4xR]al!IoP@tVyL٪mlڿIUb|[*lke'*WddDӝ}\W_WߝrN?vޫ۲X%0uoui*JVƦb%}i5IYlNE-wςf_W3mI-mQ)S kTC7m<"܌bT|'$ҘR&>O p6tSN\ׯLm\r@3uT b7t.5.q3r0=8TiJ\6uF R32^'ŪxI F8O{%8kJMSȴdBEdWCYO:/ON/I_=xFE! =i:o~ y?''[͓[͓[͓[͓[ͭ.U>$PƦc%]\c:| ,eSZ,oXrX!R@Zv 0>?* <|N60;{ad2v+D^t[q!۞V}fۨϏYeॗ)Vyl|" fUq@Ǽ4Y-Y-!6aB:o%JIUQ|UKO`=\ :0x Pau@!KPdxhw1>$j΍vZdxSUA&[URd7øzk/rU^w:I.VǮc>q.!zSr&2)Wg R -iQ 8Pa\ОU%iݡU_=p Lu(N?0?Æ:]άtB%U|NsorNf ,P !v" Y6hL_@@bscqgv4||0lϟ$S9bʱj#~?o}}7sAPm:IV=n !{{hEࢪ8suoLT$;VscqD3 ༂3.DBB4&V' T `D6Ϸqyj8V*X%@s\jrN$|=5Ά 'mUiKi%CI:ssaƅ`*`=l)>u՘MeuSI_OL_}o&jzp{lu:O)s%Q@$<]f xO%PCbhr2PKpf5Në3^o]eJiB464^tuٲU֌:G4'22YpuG'/Py4?.SBP_>I 1t3ΓBɭɭɭɭVVVVVs]!67(g y@ 4>Q VF}^Xׇڼje26 L%YGh lC})< !EEPZWZV+@†R 5{@ouɐ4&H6ey V݀VťcqZޒrJyByFzFN$Hb*+jՏqэ ګkݿUXle1d0d^-B%} {Y%r*j5Ak5u",:~ҸY~ hSA~6 fulՇf{ȵQtATHZkƭ/_Sn u']b]|m`BāJ,O$du]Zs FL:aǙT4o~by?wpj滥A(x]†f~an֧/^dڲcՇ,!1i&xi_VK@ip̓9Vi%a; L?0J*Ū5U'x^6V[^ {eU|:0=0d۫o*Jq%[YN.sQLud[29I:WnmXlڃ6!lNlVէKUjV\J%UߊBLcKfb>a=b~R]aG%[js@/9MطݘU>yɲX@} Ftg^vO\Ӹwvpz3K5i!$P>ā'VƛL2r@UMKZ6tw맟¦bm1h||]}~0MjA(JJP68C&yr׉e}j_cJ?I0k>šW |Bޝ."TEXd 8!cw*E(J)![W"j_ТeX_XB;oO0~?:PC (.[!Wq%*leY)E<^KZT60.#A\5;Rmtkd/8)5~^0 #Ckgey)ͶԺ6ĥ<(?&uAVm0^h.txR*a':,H|ō l5z;8+e#b'#|}2w(|KcJ l6 w^Տoi3H R ̔9,YgPְ:N [5SR![)]i}`mN4Хv`|;f(FltL8÷Z#AO%Y)NU5YedJE3dZذݣHT1 ;8MjnʏӤqp 1h^<<>yt{?|'j)}YUU{@V/J1F+7䀉[OWO[ yUY!?BD%DWj>-Ai6xz)U R7 d@g\so)a4zf[W+> P> |qLG8vȣlj2Zt+VA6gT *ʆUz(m)CD `He/.:zN9pgo &NC׃އ>Wհ_Hj)Xe6F7pm-`'c.AZ=^e8F;{Rtn(z!S7o Iew3]bܗ85|iϠRJkʱZRO+8U&:]ZieR(JMޗ7Z@5a^\GzsρU*rMezT^:ɬͦX=>$ bi>U&XQoybbGk8 Ҙn).Սo ^MmdZi$soo*{4eLbLٳ""mx:`:mk[geTެ)'0*TB{!I ''''[͓[͓[͓[͓[]Zj Q.e '/yvQ71(Z&X?(_Z){tڀmZWϏ)-C jqn,̋"IvUL!h꛿skAcrN佚фVE40yX~4zʸV㳰%,)fqtpu~  *^0:ܲ33JO(ZB?K^ v]unlWi0p6[착C_5X#[wX3b廫R{NKAe Se|wxso>P\儔ԕ6;nVmfI$V͓J-J%֌0UwYЎSnum藮xz˗VƫIvnW_qLZ"_Xz 8]Ap?C543zw({7e*Ȳ`۰!AQ:KUnz]1yVGaCm0PY ٚUx6TT&hV9V ӬzÑ 1[XzZ9erqJND/gX*9oN6D` {I%Mz9—TQ7f\"j_3~xB'ܷY]*KЌ%"5"qxq~ƕ=jS>jV&~]2xzF1X_yD<#NRB}K/iy !V^˿eJ}/FkA7 S+.(ecJ:zWZ몖wQ~ä́p6,e5,+,tv%O^OO}ן -O7>ekC6wa_C |9*WA)UJg8=:mjUvqysܒLglC6+[FSWg9wV31A ND<$5e(s[ ۨbaF.]KIENDB`web2py-2.12.3.orig/applications/examples/static/images/Stickers7.png0000664000000000000000000000675512564727256024127 0ustar rootrootPNG  IHDRY`YsBIT|d pHYs  ~tEXtSoftwareAdobe Fireworks CS3FtEXtCreation Time11.10.10M) EIDAThi\uU3A`!r(X Nv*\6*v9Xbc!(-Il0B0hv-7^wӳQE!wys{PJEw>-+U% $ R8T@|Q\=K/+Q*3Bn+\Xv7%g{|ၞC=y$B!!)؄:\'m{B"P((F(V CH]x(4& V%c{htE@|¸_XWBN?ڒ`O=0DMȒd>dշ=TJmNf)y>%wgC8kibu:ӗKi2fY̽8#6ߨ!ިxv6BjA80ളC<$R+ &b:%~^gGtE @7y ߁3,Z%pH9N NC+cyZv$jӊwm` M;gW sh{56ȧ}$׉R[i}3EF<:%fߞ'Ѽ8DtV=1(+%!zצus 8>($ RteO8&8(2͋ˆ_W(,$)$_J2&A"$GDR@G YHb6~!IBnC HBdQe3 !*] sDaR f\I<¬0^[ \)A#0 hG/PK9OQY44!-bq}& sԉ:/J&14L|lF/m.'T1 ވedȂSS@fX7g}R2H UMF@EwA*0Q @w>0ÂH>vbH.tBbs9q: ,y q-lD DR $z]29o'Ӊh(G<_QU͖)(?\|NE5Uܸ~"o>/Qa'S;Qj]9*0xȒ+?_WTsO%Naryc0[\*h Ot%r ^f>ut . #tQ$D٩i<mjyGl2:.ݝy:vgY9+$(  5,XJ (f/ 4¶=̈4 MF.VqlC{bT VDYswVTw3ȑer!aGSɤx~ .$`țzVK$~t{C O4vLdݭPFRtyWXS5*Jҽ./qIabeEM~ZNWAb,.A 1b&X*vOtutBhdymZ/K 8s|md\Ym/L  }ډs2MOݑ`T3w I4631qQv^Ixt3h0isVEIg<:cqM$h#*Pl[[Uu ĤCtpb q3I4q&ْp\EWFJy|)ϴ%am2:wLf0b#}'u?Έ0in֝)=M3-}%a2Ӽ;SE^[%|" \'^z8qXg>p,΍r]d33DtKUf"Z6$9j_e!* G9ڑ&Z#t̻4ƻIѰCqŒ&S#⽍ςQ'>=9Aj2}(QE@iLYB=1as4gpi@)4ͳ{-#凛8f*m{zad  Y%"4hGH{ hݔ +qaW(Ϧ4䉛|x'`8*,$onד|h^b=r:k=%,`"L5 qO :xݻBiѽ業NJ b:g_׻JO#kZ7X~C N1cyoOc1(aap; Dӱ/;&je |x{\%i8U#XJ&9f7g+;hv!$a$'ˡ]^2@STh$},sniqd1Hv,3&,$6$Q8k+(Q){Na'x|'bҌ|[>K1ajIũzҮNq3eJF8aO^c#Hٙ[LɞLJθ#tgS\vo=w \Z#YPE+qftL|᠘0D! %Psϫ"4kw1F50ӒC裥`(Ҷ9_C\jiV[O;VGo4!{˂e7"v?bDZDjנ*%cCB:lŰP便(PXOr\N.?^YoJ@UaqPJEv>ԑ̗Fdg$;'\?+wQqIENDB`web2py-2.12.3.orig/applications/examples/static/images/facebook.png0000664000000000000000000000173712564727256024015 0ustar rootrootPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڼMhA;M[[ Q+B ~ԋ(*D"&_'^"(~APD=XڪմiR&g6[ y{7;p(Tj8 ?CD~mz({G:4X$/zȖ}g [WbxYyʅO0k7gxu?$-XK|4 M&3X(J{ݐl `<cXPLɦD|e5p>/n7EF5֠B.ѳ@)c<փkVr(U s ])W.;_ubH=houX dS.,Ek:[P 2Pk ~|.N-ٔl ʿJl2 '5\d0tNذt kd^YǓ[ c;oA0ݿ_ 0,q?78IENDB`web2py-2.12.3.orig/applications/examples/static/images/book-4th.png0000664000000000000000000004372112564727256023672 0ustar rootrootPNG  IHDRQj IDATxu AasAAaE1i-sLk^J^l*ٲdVW)&QDbD9 `fwԫ~TunUw;qÅƍ7^yo/^'N8u„ NWkgҟr?~L-kHjɸZ4]W~YgQ5bO<קqn&O7yU4}420m?ˮkq:+n˖-ȑ#'VZuDsҥK77衇zk&`i:~`ƍw]K]LZn;zfB7oyBaz0,[?~q"_T .+xܹio񯮽?4E\DZ!t]}՟ݾ}}T {wC< X|1 㼣OD!.4i$'n7Yfя~-[SXjLE]+===_fMbO${q۶m+w$"RqYׅg}T :7^xn1!1YqQ&²Z.+{Mjiicǎ+,3_Xo{nٰaCc,^=WشHoyMKGX0,_s(?\K,qk׮]ڰ,.Ԑ 7on*t ֭[}‰4:ôi~gd̙֯_?eٯI+/2UણGqi5+s7FZ&#Nonז>4\Koik qkF餼O%llUx=c@K8@es2(Pр@綾^*&µrE'zJAR{mʄk,Ri(ǸI<';]!Wӑ=Vh.u<": Ub ۛvci6T𷶼CE|=p pHC"?n²4a8f+?:Y-kpZ wthene:V8qLhѣna"6o)tk+]p?/$4UhH d+kd2™u G&UG @čy*(`Vʎ4Mb`QT="zRGM2%uRS3T dlYGpX6ɀ" erT Au0~E܆ M,uuӷGk;Ƿ2K48dy9% B(MIu(8)ß֞0?! ,nrXLy s V0AFƄ#ap%ߦ@Ƞ@ǾRE_ȥN9`uƄDGaB~1RVȱj)#L4+lԩ71xNƭD=E#(r~6-1bU bo;1oxSh G0q!?At" )k/0LgvzT ( /b(`=zRZ_u'ԖNLLb[{'c=P,R>t| &J~ixO:uD|jc~j, x#`z=\yV23chf0H;XLf&vH͘ 30aizȒnqX&{xSU$T)Ec'Miw[9'칾:pb͟6 \ UP)8Z\.W){b@-.L1!1c@pј'Vv4 CcW 1&T ;(?9FИⰟX3"q:6nZ^+ڔI4b;#u CKVoVcǒsVhםn< l@bHO"A8rm;'ͼ&$ohb,QGhK؞П7-)EEFK^mO19ꡉ2r41p$S->ͅHM+% ;`dµ__90y\ 0br<*cse Tqŧg6*')̃ G A_<>,1vL-F [yWb ha!4`vǠ)2V&p:"*Kc)T/2M,:..W:Myyk*fZ\ Zi \0M5Sbz5SQSm0`hiѐ\^4kτ\+ku0Ok4V@Yݣkrƭ{PO8q:UW 0?mY\;bmkD\m$i=q`EGhBԄ'FS>cZbc9ߟ˾5Qϴ/Y[1'yc_A6~ [$?]I3%M Gy<</aqP堍tFC)ee)ʑHT4N>M?tZzEm}T1PԲ+3͈_G  IoB7VOX3greY)sx1nkp,ԔN>.uJ,.Mk뎁-25ýgFq]9_M & 3dY݉gb|_^qi{j֠Az@EP\2HP`ea!tbq#4Qf p! ґcCnjp[Zx~p/:t\++& az::0:'$JH ,&"S ƞcjjUX| G'53<5dJ:TS 8ءwgOITղ=or>Vvb܇>u\ܻAz}tL)O7uvY-QLs#*iAw5"wvrtZ {ܣܿ^YHbqȓL2Yko)D6>/*t0}JՠpZ^D=D+3_K-zg4w=߹tkq/OSG瓛2|{&lϽj_Ώ<'=GGO'7gn)' Vg!}2q VTb^[1Zs3ÓA<=P}zX7oyRVwȿCml1~)nڵu{ۺu_k_}Q[:/| 7] yP8L@,.ޞ#~]:8]u$Y &  pMҦ2zΓ6q[o-_=C/vݥ\vxAwg~ڝs9~c~HK 64Ztm; X˗[622Bx˓z^d\޼R`{hKViUΗhڌ3FL@rIz]n…W- =澰i{~OMbi7{Z=ѧ񢮫}vwq[xnvx;<7C<]rկ-&,̮i`J Vqãxu e0K,%b@زe-ewD?2tpڀXYnD =>sHqg_ lM !E7HtAʰ o)c"-߿l;|,٣J2OMnlTp+^ wKx>hحG']ow?Nv=s_P2Zo-@2`3v*ǞSD r.{",'&~- 0Ŷ6H %2NрwyV҃׈!v*&Nc;@7ڥǯTҮ׭pNvΒjOϝ]^>ujN\y[q{r?KݕW\戳- Λ/Z͛^+p&L%nꀳY@-M{Ҁא5/xqK U.w2 ˖-̝ & 8v馈̝+x0-D%Kd.%d8h8! mu7ݮY{I7s7*NZ~[0ۻg;u;r{8L@_ e/䮒X\u啾㮹|ǯ0J"v}yz?<Ӧqrbҗ@ea\? sO`ё6-0LwqH &NƑj;H]Kw̙z q2@KLvI4%h۶m)iBsZaR.=3nrg۰~6a_~y%t$಴< -СK!{yw@u*Ͳ[,Ȝ5k۱cQ&7\b~!\jQ5GXrb;$ږtNm9n׎~4?pN 2v xH}^bgtdF#J/?}4iD~zs 0UpfJܝɅ NP,]~$e|vW]|V\}Fb{~Y)n*H mF_җVmbqN.^ț"Lwi*t͟>-c<wo+ʝ# ~i]}2$@TOWeS@uD$%J9܀8NK,Il8+Ƥvm=,f puׯ_bbM P_.2N;2-g\qw[,EmF#  gI X0Iqy&Ar^8b ϯiyt2>k&1Yppa @$D@'0GҞ ZxG+ש2tc]M-B9btE hگ? = IDAT?s{ޝ'DyKȨ‹/VDO~C[@>%ʅ aOTO .UTN@pă ^[ I^9~1B_OeBA0T͛=GyA/eyyp(9I?2/_7xy|;HZ]\q-vIÑ zT.{lvd~\+u@|qF( 1x7 Vm`iPE&!~7~rO=B\ܥm}PK;_%=Z!q5BڨI?G .G1TV@ٚhXʤm$N*Cy}#7"rLP1pkDk_:\D*>|Z'eq+n2ܦV^#g>Ys& zUn9+g?]+o}=?إfMi㨞T ;FVb#R'ðɤ؞!Zz*a⦠L/@كvv_Uo ܋U?Pi)Tf-d@%?iԚ1 ԮieP ;O Rn8?J- kNH͹  >\ B!6H𡧱Cıw8GA<@fpEz:.8}y̰UFJ݌a{HQ?&% Pcw]VJjEzӧuғ0[M)n:M$Z=[QH}=-̙u/8mb-!Ҟ+;נV+، 2_i` Ox ?AoB8 k{(2 ]H XzrDdNUe['}'VnDÿ28k.&̵ui.0!'$;|VHvUm`LBI>zyp uj/n@;OAL̙5Pzk^#WqcV/v?+\&pw!8=bD N()x yR=fBI,8ѳh<Cŀd:㻢Z08!b'[ޢء4a (ix4L ]7] }˟|V <"U(yᠤcۍ@z&=Za5~E>²\7ps ,*zYwt#rL$J1UGL ߴyV ݆ )U #~׬DHVj:BO+Z> d׀vMrXexEmȗ&vcerȟpJ0DIe"vPD +(ŝf*ߊL0 X(Y(A-c[A@<)=BOkY&eD;A>o{Y<.[*vcm \y XtL׉gy.`&+yϨظ] g V`c"Lq㒆HWե=س,:B`M,~P T2i]oՈI^ 4c?GH89N[V*aJyD _m`4;Mҹ1w4E|LZZC1UOLqCt?u2q86TG!.}1d69F^RI2xYa@&)J;$CVvZpyv,7EZhg(EtF1T-bE0pq3Y96v]$/iXySY2/ţeanz Aee­McX#hGXf6fM,tWKd L<{Zyq0/ 0"BNn0@c%;:4,ƥ{5)I&& sSn80m5?u67pDq g,aO92sq0[v ϛ+Y5HQNF$&X |9*j`h$AeRҀU4$Ո>\j,.qiXe"ܬiM,:h̾vgiQmHSV-Q% T'˵>.~7a3b;LHO0!j?aD6)U&7Ļر7K ()x)#vdqXaA&>LTHLq4iyo4}śd6pغZv zG^+7Xҍ6fO61a7ð}[]Zt/ |ЉG ֮Y?zKDH wE/"@"@X7bPñ+:MBRt `;z-oUb}0 eBtO=T,qpW_9 hORO .mQ*0(^i͏db%ng|]O}8)l2*/~G c'bJ}0÷┸}S#7mՆRmKP|?M,k'˃Q n7G7M>􂾦E+F}ExtynmK+lm,-?nh @Vj:`Uu0 mصaړjݽ'yw_>u)6`~SWæ-[ejvwW2=_ƠAGSSp7 h?}tKjj.=G뮿V +_kcDpYf.sP[ȻSߣ>g9 U38S1? r8hǢJ׮YE!^&P[^nᢅ;=y蔲ֳ+ʗ/[w>t*DQ`W!>X"NƚnSn&Zu"E|lJt|oi]|ƄϜ,{B9ir8ΤI||{9)pk_{8i)_=3^l3|:qIp ڃ(%֦ |ݺu> :ާw_#+cjTqW:n,QN=@kyO}S-Y_KJ6R҈pWX8F־8.0~,>q '(m{/2Olk|+ge›ZDzl"q``-:HQVIUp:5}GMAh--uc z R?>\g;a7DǵuO`Y`*qtY|Vxߟ0N?YgQ> ǽ2XOj;V/csu7MBZϟ/-}a8ܺ5~++o`{)ĸvt dqP$ S(zEi#+V@|[{CS&z`6nhIp4^Oa ozV+q"և5iUGêmDՅXIk@2nTskFgDH}+ވZFQm+02kn u(#25/V'vGT:Uo8LLqD@OT01mV{ivTdK: @1eo_ D 7?*=w4&Y1^6 XE8cee7/X3LG[؎xh L0Ug ykqV9`w~[,d\p5 X陪3QO珨:/[.)-^:A'4cbY(%&EmJ3&kAFԢY7Zie [@i埋ӡ7&`VAtg,@ 7K" FiπN.qjꯑqU,< D 2RV+^9'VCq.MCon/z>k 8ΞMr-JJ+?G?U uxqF;a#h-`ȣS!> S8t|ND! ({Z:c.%3s/&Mҏ1QԏxõɝH`oEe$x8e P"@v'a : hWyzӵWe/ Hgjw'HWH?_3p8VlEE$iKaM XliA42fUE%e$ I NR7Uk \~a4* 8/\ sXRtѥK[u,e0IQ=S:ԪOtYx kbc8X1eZ\0F^~P诖/8cx̓%G[NgA\cVxVl",t҄f-tH~~̪JDĞvMA eWbcjQ-g{% 5PYz@E\`͝;7Xֈ3``lBob O"6ǷTť M,iu g e\r\`"3(V^-p<~5.7@GXQP귊"`c3lgJ^Xk 0"Tk@e`\`c i G*2͟k{u IDATk``3"> U\O)q.f͚]oG1|dO*q+ys,/\`};yVKЧx:=F`!Ҍ21X ]_(2 җ˖-+&\z&+:po`2 II*Qϋ/xBlcv L\*;vĹjn!`}c{^JmÏT+L\ӏ̀e`:$+pݟRa|?׎EF6$9;:G `zg:.D8g>tDz4^!/YHߒ}\ :"Yt+^y6l~X !^NY6@s[5CnK pIh ٶ.s ;;;%i4V<5klP`|_^O۸6@[wU s=nʕ+K{6t>>- aaZFY~-0.i-q\Z8a K-yZ^ ϵQ]px?Nhˮ Z"dV8o2a-`+', rG8`EsO 2٢J.gZK8 #~cvmeZyq-V-bcea淶řkqvmk.淶i:tOpc'S}Y\K$uf1q%gg0W8.Zy(J%Q d$l@qF \xMxZX/+}V77Lg~s-MK¾0MPar .~Z"=DVb!`[|_O~Sr:f9y۾j}Z\2덫rz0V\9:|Z6w]~)[pBo?N3EBܩ$k_KW"iɓVF-}{mcSK81!_Vn}طg?6mp]z`pҥ 6|'8/p-[nݻW^ٺe˕Wط_ůo8ٷo믿k׮ֿpx5kvs ֮r~~;۶nC#M7裍6{=ǎ=}o:t# $Q A߯\~:/~ /z;x[Az83{]w][XD6l5UY,Ϻ<7nz뭷>xkOoڼ3(ۏ;<|s?~ŵk,D/|~[o=s۶h6}N{W~~_cߝ0]_Z@?So߆^_?s?vqT]v zq Wګٹsz瞻{ӧ>?~ʗ{;w#T;:qKݹ>>e-3gv܉qǘ[n۶m׮];rC= QOT`ͳMk]tKڶy'83\r }Y,`R,.uǎy'6ozM[{m6wݯٳg{?~?'A Pٳc Px_㶽`;vԹw߽1s{gΜAn?h~~aڹukl^ZZ~0xc_ʗ_r=uA^9z(Fd;΁fgPp¯}K׼5?s[o}mx}af[|#G>S|ẵw}+}nmv;v|s3wq';~~]kW׭[AA00 }7:GcGm?`awۇvg}衇._^z7W3Ϡ}ׯnXcC=vS7m{G~LC?'O>pS 0o孷O{n |?хԓO^r cfqw^|O ޶sGyCG~ty~@X5v /s<ߵct˿||`,3g޾wm[sx%n/>7>7;wM׮uΗ_~ya=~}]t}a='oK\Yv+v޹eɓ'.D77nt'3̚k(㑃yqLlXl~{vcHDӵ!큗^zG.fݞȣ;e_D5?\6~=g~O{b&vܷ- O?܁z/c[C7lƜ߰f ۿi¡{/?ɳgnٱ Ie+j붽^4 >?mz{za{?{Ͼ}[o~F·> 1@޹6L"չ>{W~ yuk|{}qz}… 0*9af>y?k_*&:)?zsO>so.<Џ~S%ݽsc_ٴm?~n߆]+lŋk1=Nƭ[0߶ms;?yϷ zvˎXl `>}eDAg#{#x_`vaf 3 ou f~K֭۳cc6[y#Fv:|؟k xiT=z . .RE܍ًvzkg_ .}}?tGyV+ k(& ?3l2KǏ7x}úuٵW_}ϼp 7]-.yg_{ ߴñ'pͯ?6~םΞ^{0Xs߽O,&C>g_8xWkW>ȃ/>twׯ]q˚gϢW_F]iÆq6 +0vɿw?g?4KË?ڽmn=qʎ}6nނ ʋ9)Q;+/~Y7[wn߲ i8 :aXk?$o<{a7cCo~=p]{vcp=#%Ti]{wًξz>l۱}>8뮽}ݍbvnf0'6m8~Љc|0l߉Yw=wye܉}|&3q}G<[>rmㆋ6uڱ}׮_zwKؐ1x KżuC_җy-{vb'?{ȱ۶֛s{,Jc-_:w=y?fa "`&}{ Ǝpⵗ62OB֭gߝ??/v[1Ọ#&m~뿾zoƯc?_~[׮`_Ž.@?"ީݲXb?wVyw6];8{ƵGNC}0Aaݣ3חf u= <0O!kgXgN/~n96._ޱ};͝xݺ;oPi`v8f^w*8s,׿{ ![n|?O^xa]y-<^Ÿo]oڣO/<¾{Nd '?jӫ~Of{ù[ly߾;-/|^:g=wƛ;{≧;pv^`[t҆pQ%;3.L9bص{&*ou'q+>rۑ 8e%m=;v//92=߆{ww߽|g.{$,Y0aKKkqv#buҷsݻon9sj۶X(ٱ ʵx =MѰ͑a$-HA⎏3yM?5j^iuPy$ D-\ZlՍ `$`3OB_5RLk'*%P.(K&zƔ$:멒N7- $LL[hFB>~5\]#9XVXV^JʼnM1>@i+h* <=3ɓր|*Mef\{3ćInGu{m%.%9ְ2S Q֡+9Kmȥ5LM&g G]2:WdZ“$r*uH9 sεW jʖI8O^"uIh*=vT4L)tF/*q=S"ɺHH){2I$>2L5L ="ee*ZYf1>p9s`h6v0ƥ<>rQ՜1v;M^9-@:Mqn{Gol]4L2yQ3+%M7DdIG( '~|OpzK&y`G_%G WW&^3-XdУLJ6i+X@V&( e8wHeuAxYß!/GJh9] _S=5))4jk*0oȮ2ijBSJu3ⓓ$D |{a&"'U;Eش@AT~Orzgh{-cnKK6~1_s-/H_* $B1.K(>OA}L@qMTB֡X.3)q]EɬR i{Fvg@3{&.y6ׂ>]=`4)dZ^MBӅJ~HK.WgDYxXg7~ I<4<JPD{3C9|苝Ac1 gWA/1=z_hp0\\3zDLW3MJv#"X@; S&tVe؈Fe0 O'W|'x:)ȶiyZe- 2Nl/Z΁ L)|HL1Ij>\TNzI"GHj[#O"\tuufYj$cnIIyGv8EY}.򝖠(dFpfb$-}.k1>`r*$5=,D9\5MݕddfIrDȏ3d5M2|3Yf w栦%,c?EcA˟9*nyZ{pМV(I [4e/pڹڋ$ Ɇ3xЈ_Ji&,s#+0-t5M={њ$][]Q&7$y䣣 P#eE ʌ .2HNj{XfRLVm ()\rC27 ,,&clĩA]93ak@U9pѩ PS3H(6,@_!EಫV2SuZօgqfF55V/s۵ɿZ5XJ_ iLjn Oe.n#Iv*snQc G~b֨(B]i p}X9_3T?_or˜WO`+\)m,rq6u3h=2|C4.i[.kXt7șq&tu!H@ų*,fyTBԋEv]gUͦN3ge mEd% AE$յ%nr;@`q?um:"4 mf2YQfQGt%3k:\ ׈t!xF[77 !2^>5~hҗ/&buGjO3Mfؗ0zLٞd*e˂Y:N[+i!5K 05{9AI PL$*A/]xƢ#1vފDU!' !xHBF*\)ۨ!iZL%~*B%|p^˨X/] 8K:RH8MCSH#z@`֣UQTqk81T at:3zȋKK"8,֏4 a0p7Bo.x/ M,֜[vcDRt¡9Ux?9S`XpفRg} f`iq}-/$4 J7)f\̊qqʂ>ÝҰ4S}VeDg\]EAGxFm{ <Y D\NՒv%ˁjë!7g+1KL#w)ӂbؘ]XtopeÔ^p@3h : &Nd o4q2FF~~  SZZh_[3C>F ;E0{8:=Y xj7:"EY5^K\t@2B0be!GTa 6Vr\}}t,a#q:^No\ nnUl5h`\E:N!/ ÊU092"nA&hpH%5pP354AXUs}ln!أ1k~ ե $*8Ws(>d dKC>Xd`PzX\ .aaT܄*w00ְưa ꉄ 2ו)`cgjsRCgłhMĪg[,+XM/j #yNWLW0nX( ҉T"*""5!̸E-wL9,| $LBP1PKS:IJBlw!s`cVX<?n\+肋.:ȸ͙q~?!zd|>rAMu 6 &bwnughr_wk݂JpM~>eun:g'3'UYEBk'ƅ#_)UfTu oSxy9LcligCZ[s=N7 —Z킛՞ʥzYNRs*̺#TJ̠)B jLX;պ3`YYc #ݮ5Gr;2lhɒ@jG3kB5@70M.t X԰gP3ϳjR트|N# w8ظ0StS#. X>%L3vمyL{j_*A[wElu+f*733/5(?Ho{5ru7<-FJj~q䭎0&J 8cQ q;C˙8pA^re@ ӏk`;/w܁$ .] T?e6+`.=" A>9?Izp/q x.K qlH_Xfn_sťݔbEa502A; cGWnwt#z䯆7 nX Pl_C{s"y-{GLw}D ~+[o"|,F=JpE/F};lz3`lb'YB mcgXLJrś#NW[[iJKbj@:pMe{9G %~ۑo{%bpc9֊Gb i?uwI, `@&9D~g{v v人Lq!7Ne ȿ`״YV4-Cl]fM<Vn8&>6W P(Ȝc7&ɠ8⛿Ǖ=Vl~qզYN]_GZ9ϔ_-ΡVL+LBƾc46U*gByۣڒp򺐀Uqp?L<6q2v:jG!z:b4f/wL$&;-j3"Ԭo\ |+2p N^fꓰNJpa Dok<3z1gMg ) 0jJM0*)46Dgb٬c9@hB}U0 \з&l"ClIߌRCl2^;Hǀ5O\M* V9tEb59MJLj֦%/y@I h@Iḛܚ8 j:͢$''ibӶ94yCǼ!2׃t3&ɀMD[O%ͬN$" |KL\Y}ZC T7Pޑ ގ{I^I!Ф',qqO yVF^{xSʤxaLqw«2M IAx4&lꡯ)J&K՗@Pvx$+ 2)Ĺ_n6$ dZrw/.}hJ+7 # Co  LfSXe2`M>` 9@f̧3La8q>I~yV=؁rGc~/BSa\ㆌh2U_&i-A5QiaM&h^'֫U@9JP}f kMr!SV&Зdۄv:O7vmy@V+q%B:Z&w38JS'AƾMщ,!fh6q#W;3[ We(Mh-?wr?/^vd} !# "et՜{I8nF7@~0dn(} ҋO, `|^|m0)M!ObVeZTڳx*?qD]3Dؖ_?~AR2:RSKckw;EFVp մ6DSe,$Ctf1I Tƒƞzg5tzʖ"i6mlžHd[.lK,]*D"0Sa5U n+Lr|.uL z7G Ľ90 .@l;}rc2(d{- YtDnJ8A1Yt~J7۩[dzA9z3@=(8pɎݐ|r#b״Iٞ414_?<_J+O5EeҤ. ={i {,rMGl "ƚpSl)ts2T*Σ_:k!Yņsr S L}FR9{FkAV%)Jrp].!D_0۵5{4@[j^31_B W57\h-<[%f "C!Pk2\ބ:R@GrT 't$(Ê!I0UQՁcJrEGq&:s |$ gT @&0j:/ %'X(^ţÁǦ$w 4В DO"Bl0&MUdz%I+ΐ}JHi(8@Ug%F’&vz@o9)t !d @gxP?zkF! a g:`r#@z5!zLi_vQD"71 ("P ܉l`@UBXtwd B#Y@@u X́& MH`Cz +:-&4M3ГS&I/*ö _JY"0[R5Ez57 @#$RFjҗ EBbQCNEtI0Vg ^pI,\^%GD8n|S.^)(T(f3(3M1HȀW)mRL9d]֑ejz*x4yKY*lL/JغXYlVVRvq19 5 ,0wJ䏭L !=FT@RDh;ZD!6'GV+I^(,$󄁕$W2 BpGNǨE>DədJڻIBqr8P.^ y!LDB94p*$`S j>9`<>$7Ĵ%ثw8;E1ҮHowXmalb 0R% -ϧ@ɇ IkˢWE\;  5caM{VoR.('bv Vr$S;_d\v_>3􈛬v0O Yߨ43!Fm; FM!?L눑<21O6(u&_Fʩg"NM%$7yAoIr6KuhD$tr .&} `J͹Ho˝ϤfDZ`+HhIOtX1TbxĚx ܞ(y&+8'/ÙĴL&|$O0P@v` _h~`<\< /^:ۤGK_~ , hUZn ![GmS3̓Զ|utDcsHAk&0NAE7JjKLz+ߨ'p'$QܤaɣsdOnjwN(y5985GxSa>qӌ21$Y;1HM ug/6''*#[Gknlܑ d$*igp!jpnY*Tu4H_i\P ə/B<-~0vh!^>J6D&6hl`*y4 2ָͨW kݹfi"J[ 7SFtSv:f~V$o s(ٓkz3uvѽ ]/\z$fH3iuYCz ;r C{Vl{ ?.c2\6Ԋ;bq嫻:Օb}E b |ݓ39wE8 ϕɿ ̡JB!#L`ps1?, 9_(1|IY@ZqV22y /gH Vt1A;NfԺ_mnѿO$Zts F._*:[%np@YUxmV-7gI.\\z5w9b|N3˂OM :xF%tհȕ'*7@<l&ufm'C!` @ &,)&c_ĵ iJ &zuc\X]>nۭƌ<(.d}psg2㶠"8pI´v A $(MX%ehM`k0!.WE\p f4-̃pI[3.Eɱ2Lj@;1.bajeVm/c3Dž Ba4rr/2RMLr 74\B'_?:(tʱrTR2(CL*rw]fNN=8([fqmV&T =R&K0dg| [L.v@_Qو;axE B(4!0IqkȢ=]}rg 8p:M2nv_ذG'"5Rd=U.QgаaFp+C(!;{wőMaj y.PЉπ)֡<}J6s?QPxMy\oJ2vY7jdb6\P۵&ɠӠC#_:}12 Ká{0]]3j[[IRoa4c5X+5i2OP=9xLg\ݣ)ՄL3My0XqDMC@⹇{Wjhz Z91 <8?}4#sv*fz;(LbfqY-Cde-T̕մZp+k ѕpݯvqwKDD\#H=7LEaeBmА@ea,q26ǤJdmZķ -q0 &F֠i |w;v*uv 4>Ш c9{$wy*\_, p/ë꣚tpciN[cKNŹŚ]l4a#@ZᲯ{([g[k.9\Q-{a&1}𘲡Nk$$@VR A$ |ҚF+ 洩Bbk!u,6jg 2${`5b Sq̓BeL:v{PȼUa ':I8BzЃ'RP, n%%c 5jKBknLʧM鍁 Io +-H)3XnFq*ǯʓ<iLH&/Vy B4<&E/bMڵN_ݬ#yNfM驄 ɴ:'kRђ2II|/^`2NWc{'PR`}5?\2L%z\ %(4`Z#2Zi-y~XyXX&VkB|U<^O$ӮNk٦$Omo\Zi)+!%U(aVT24wH+CS@&5H.9wL%X( h2ؽdM K 8q{,ʉY}q Ԡ2Շ(kk?O mA^SZşT&IdR)B$1OJ0WRyo˃|}p65D%F&MTI=WVXe=z/ /OWPK#S\IA 4kIeWf⹧AЉL+}w oYsS7TҭaNVM>/LGf|HjpLB>hU|rjZQL<"`R0y! ̃3֒*I>P $U-g,%Aj8:4 $V?C (= 5_HxZRF;}D@)--żF&Z;;i\Ńtai9c f+r!)%ATi'd& qDb$vbK6a^B w$X$Ir;İE|d*M lͩ'.TuGL կrmӻ(#n>JtTyU/w8f4MiL6D #"6=2ɇog;nWxÑQ$O\& l=[Wg?YiPn_4C<: P^E܌uU$i$O )LAF4 㹜/B|y18[hbez;*y 1Xc<5S7S)ͥf+;Y"i./ .M^ tϤ]?uꡚn=;,߅ dܸzʇɬDi5jZcfHKNGp ,XAS0+`,>a(p %M<O]CXUy|Rd}GC7p`FjSr_@_ }j?KTȍ]DK9G'(aV N58\q|tD&fӣ{090L 6zA C wQPI6{KAf`T*w/Yt@ρdke`$EV0=!! VeBG\Gp F^pZ# IKLrZ eA|! C&#‘KV! Rx*q& ͦ0hsV4v퐀YÁ뽑&ѣEs_ 7(Շ׹PP8ZഄM{Gbo\2щxJEVE$p7o#䙦 Ej L`X }{lP@ӏrЉz y_L*g+ͺOkSaд!ʤٍw MlqV$7e*+11%e)c9(SI&#u/,h! C |J-Y;i"CCLDM=bծdկSB,JFg2rIJԅXOՈԧr'/ٖrR MKtU_8󀻄T>ZyZ< [VVeQM2)z(H) ;ʀ3l5ZWC4rRL&B1ZلB?/ ru]YuBy2M5ލlմ3I$wJG;&J6BbZiEGšGOEH i| 6El8նQ`ȅ."3h’i4巜V&5/Ldn$Ăc$tR lˠ - -亰.$-7s?x|-s?YcLn)h*(fL^m̜qM^U(. T0>X}YL@ 0lƦX#njI]aMGH:ZXSX:H(t,SʅS_c {WJܘdeq K[G?TeU2tkXLk'əx0Oat}$qbM6l%&` 748H$h lbL%G 7,oBZMr0"Mlk)G?8 33 wlP2)I}@Nof0фϫ\AѪN%#`|mA>h%)dfj.!ҎC(-* MMzѺ!'GT@&N`Pvebq3榘?gL>ZN]5 #$5%-L͓ę$$C (CrkhLUٍ[]  ٺ#ȯ|ܩXʩ P@~lX&'jljN!NЦJNei@GV6yVnYeɅ`MlkB67cgUh%2JD3!Y݃&"RRZݗ[+uH6g)[]֢<!}W <*y5 mf0'i}XiNePwRVC"ۘdzd q^S͚$KxJ&IhIp6WߚpaRD Aϒh,!HP ˾KyTaԔ0ol _Wh Z 23>V-$?v%gLi/.g^\W®|& ƲG4+tSSů C0pdWSfUHR5qԸ:bng541~J cZ`F&*'dT]:7Gz*w\@# ʳH)!c\rOsTW<`Ps|+ ӤIةM[(6hE.@rlrOF Gu Mz@ >\}"_#@b՟!kKcd;hʑ&SAS۸;<) aVgKѡJ>o q_CޖnS-j2i[XDɄkr^i<Xz43SqJY% NEI2p bH:1a9[92/5/ӏ&Ƞwj6!r`Мp+sp?"O H) hlD^`jl,WH3/V([~+88ux;gʾCT<ҍJ&g@4?HK矡#3|&+w&ZrfF$`mzYj",j{M Vl,4w$ R IZVw!+ (M C?!%`*ezy MZ/3Z&XRh"룉v al>3pS(aYH+,~*=zVB縖TA_l K/(TJt1*%T s5ѱ3Vߛ R Î Ř!ᑹւS0&8ݯƍh$5v톁CTY"!ܿ<~@Wq{iN>0I?aaդ5ۦn~A$˚$cMґJ)L!p>p D84aWfvF^._i-EJ!:ZJެAULF. IA.x Rkn57;;7@ O6A8 9 NA=^ zr2D}`ƪ4*x -`eVh=& S8;\%bի0u]i @I&S]LP VWM{WJ,q|qnnUp\F, dF %u‹,, gf~[H [Ug!y g\gF=n\M{vT)n;3~ 8W+4|RHDV˿~OҬۊ֦;;VǏ$)?&!S?SgN H'|hR?dŮjSUO,AKkW[lҐR06fd',P6yfl_W8>!k%ڗ5 Y+&;gx`}d/j%ƃ{,3N9qĕAAO0F)Hw&/E+aCnqaVE],?siJpssj%HXbQz>'7n;Fhd| LW8 / _lőh*v*&WJidG1dtOc ǖl#ai5rBS ȷIWw1٣E΍Cb8(r`g5PUfcnT-J>?>%b8XqgkNJEn'B\ter_0 Z-XMm!kI5X -}8 #J!jG)cAaJ(UF9N =%0m _?~ןw`&xdy#Whxlz{Gm>-@{_-f,?VDY0bI|4ǯDSH#qmZAؓ:P@5nMyJ^Eȩ1GͲXiG[J("hlx`h@Bjs )4& ޷X?3@RX?~Eb iK5t}E 5-U:nL"qŸ0ܘxبL*rywl!UB^ȺbmYE6 \LW80yN6) J_q;T\AMm#m3,9L0bM29laΧ'.߽ XVf*xnG2r4 >酘ꭽFs=b @ [O W2< g!J YqiE35S6ixݥō0-oij^J|T]t\Iŷp}ԯX/]EΥXZ}D @!_|'[W|~ᖟ+,̯ZυY>!$lf;vRg+!H[8s Q[&vk&DAOk_=T*U?շYnZks0A#>_4`KaGKk_y极/ (w-.Y|&yBoH pDD m2 MC~O)6q}EH.|p|,s𩕢 mpB~9Y F( hLkoTѓu9,0!vMF!由l@7eUU9k8eICXd x eSw?KB*) ̕.r!)>?=a_;n|ٽMƦ"dJ*A[؆yݎB[Yӛid+o.εpGۢ2O'dX'.G&e~!v߬(?S+c\jE.6:۔ἇ<@b t?%/"? ~1d&Zt*4 #LqqW yXg5i<EӔ˱g, Pj^WS 9e ̳i19؜vGcYȱouuėXJ:7$>dE^ /} bXq̱`50!`pva4]9}p'c/eK/4nK8UB {ǼzycV ñW"z\ 0yDw,;*SPE9tNR? 3.q91Jv9zLkk E9gUvw]8 w f=%!̴8Za/U2B*r}i&gvfPѢGܱ%w_4~T_{I,*; K䱬W,/cl_v&whGWJs*+w]aחzYŖ?1_[u1*݂o Z\ CdƔo7CrH8{ V97DzPݞhJF+/C="l` wa^FY5P39w3\.3q4aOyM+Eh|N,JTYbÄ)S A3 '$ wwdh@ǝWl!1fK-3TdpN`QNG)]`>rV1]%#^iᨘC >Bvzhlalz^Vl9t5oI =ʙW3%;l+/,/'\?oA-&wB> H*㮝9M@}eX/;PO5:T9T"t pK1@~2 FՖ\9HfלoY]%P%Qkׄ+L c b9bZW̓i?~TON# 9/SQqԵ2;RŠBnsy.b IqS_i("X2 \מ-ZsrϘ#Y))#W/YYIׄN 7eZ%, +O4װmV"'o+YS伴ExnX`GaG7˯gVJ!prB£@GzBGkXiEw36cѵ@Hhs(lyhDvrώr΀(\G)NV=-k#„*,¼8/WltEC104y퐉Zxm[icӷ*z~׳}/u2,kiUo &mK`u"/G5OB~ ooRM.L?>#v.WSʽĿ߫D{Q.k#nZ2j<2mT㕆"Z#JcdH^Ʃw9}M];U:H ??"\Ơ8[Jih*c)"9tcJ7`4]ei2yH/-I,d* H/K`d5FFbӸCwrt 4 R;J] ߼0xʎlC|&)0D=@lbtۚʨsOwcֈQH/~Os1-[03H#fG`tuQ]5! 1$0UMq;A `e b$is˩%j uw!Vs,rCg ғO(UHo$]ɺz ٽ3\2IT2^lQredt L4:4z!L&^Y(VCXP}j*e 05/e+wQ߿> !@gC Wn yz䅠dphYzeEAepHĠpfS\瀞J2^ FH44o7`AHF_gwgbA y"+On[Zkb_zAېu9Q.„kyngdYiwI: ϚT Mk~rdh5K5(W&MOIJF++$z*kF0h$H6J7yOFŝ&7Ҧ̉  !0}%GT.> g\LWVk,Ĝ664YUedJ5# ;A.kYr=e{C '.#~dz(Mv5} ɞ@IDATlf@]Ari;ӀАl}2{K/Mq}G0-1"unMRh)@Bn$8"ThTp-8|7&G\q$./ Je8MY]  o%`GS:T͕=f1PX4<]v9$m?dey2碣3dr>z$,g Ƶe}\i_%|s SY `yq=uY Ϥmw6ĥS]f2Tif Y)3=?_3/`tPF"Xz@]Jϩ9>[Ks7HhIZG3^/Q2bu0˵b6k pT׌ޔayrښklZzŒ{o]e,dl#5=_|-i1E޿WW'0`~2aZ[33\@ 1ݷuMD:d?z8TOh=J!D3~;L=dbbRV2~~3[! `CȜZYe3ycᓭldQ?r}z=/t3|gY6xXO\ʡ2DʡnO8Uɺ*ϲ<,o]N!zM=f$h\ZJxOtI2ey8ޡr"#,pV, 22Uir[mBӻgrˋ0_+䄳\Ss57q JuA?aӞZ\tOI pҔ`?$8l &5^;ȍ6Q|wsi@/d#(}\SB̾X%9"(=ӺѯHp<ҟĚɋXj( erPo7=B^mS%Jwn@4V!ISi' ytT'D&G(ūt0#y%tOZ4壔hw1ɮ<%\O{MCA$\ӣIsCkn/?2w(̽db l4 |څa#ٗLܭQ1Y[1?#ǀr_p_2\p/ɭ6k!D"GxW.eY C룣4/aú@G[䨐j $ r(5[ׅ^Sǎc"`.=ceS9"fŀQH)]"TwJ,dGE4[<?VE.3Mqn|<3S/sLR qO2a5Wd^ϓV^Z*e,t&=IW^ДXEv<wf>QY"{ e@}z3*! w&,9#HP? )NrWBSֹܹXfNC2!q Gg {an~S 4Ѧ s.G)wm}`9.<7:ʜej'HlEٲ|N`W?$RͫWC6+,$0fD>:,l0'$2MH.ZxE5Syz(~ `Hj 6O}*e WGQa֛ e5ì4!LB\0]m.*_EX}& Tf.pE3#Cɼ6 i/˜_ptePCW+/T2,Z. m%"-!Ti%b i Fu  _-,В%EuڝpmU,C++Fs}R.$oQmĴffN &Ϝ= ;$yH4簒G9𐐳ՏXd%gMd.R6 6ݓ}GxJx p"XtQ"z$}6f.~\4j+y~WB)*emJE 5B^g_N= `hj 66sNJ'Y< .r˘iV~l Ck_+4#!!dٴv[zHmʡow>5W./Zd"ChrwEidd|?8?>eeYɟ9ϛ6';ixUdgg@pD hu=-FO?0݃QD@RO߈vdZ8]B*]!9s_!@X0A-poE+o(2Y6!70&Q=!?miGs}`|!VGf{,+-.?򤊐%A#AK(MC s?>!Ln*~ spp ex8^Ԑ[ZiJ[\DN J+z0$q=[@g`Ex4GZ?VBh \lvujn=rE.)OQa#VaXi^fZaf+Bu͘!`,<$6n rYpې”) RA$b&dUWx#Z hj (M4lɄxIB)|ՇPԃHu-֣ϰ&ln|x|Hv?wzF_3Ħ(pf"M̆R-Vu嫈7v\{E {{vd'?!w>T [#ɦ='|q4͟x|/6iXN !h;TH8ې?z\Bx HҘƁ+tz˶z>i<6:GT;GIu!}mx>9ph8d3!&\R$3AKf7oVC.9%4m,ZL>eJG:#JkmAQzV.Z 2 WaU22i:`B,j7_6kTA%Ԇ.Oi"jYi4#N}Bd{Coz%PVe4wS"XbG 78HI[3@BX/B,&Ƿs=¦CIۡ(9 -w6nk'L=[ \!8\TN}\j_2`K?⨖o"tWUeA/$cڢۿYj'g?u1=k̍G`g }}šКt+k+U&hZZ] ]4cKsL~ӣ|5~TAY)"|+oIIl\[cV$\#Z+#^Jd% C `f2,Yha9)ͦlR^Հ~Kճ"pp Ӷi&IMEmޢo'Ƃ׈ 4J EMHkFV!Gm:'UCEǏ1mYn-y9бC71s([Ef"J۟dpWuXc?GLk{*Z?K XmXNY߮}!^yj xv|]zLkj}~{5[0?B}RGw=%ŭ[ιL޳M q-vVi`c?"o ? ݝG!(n>^N[TyB=OO|8vk6Oc9MB{j0cݻG\{hK^upO ޚ#ae$>Q0$]v "YnC>lx3ۛoViCnfxGv {:18Vm2kRd׺aha޸z_eQOO(eE<7Оrq)E#moyM =>淛qeX崋ɏkH24sa%{݇>7C1k؇xH/F1r,Y[;Gv,ϑ @^p)!]kn zhb(&_#u-#/L-ĜG B!B$#ؑށ&c$pm-:xi- lYWb7ѳW6I5Y^sBSH*ֹi!@ dr ᡁd

    tdu; 3l.gO_=h0Cee-EHn?y]`+?Rmg慯r!drW8kfFV3zqm%5M& &{eXVf5(7'J۟'FjȂ>\JC&6my)^~oI"j*J酗t 6W*+W5.6iksF\3&c-(IWrcHzh9I&VQٓfPzxh)^rѸkB jLq(X:1|Yu"<e*Uơ B1UUo"ܤd+M0כg L# ]VW\Ja {Ky><>~.vgG1od)4& !sdZa^Y4Ok]8+ +[5Cs8kwRrUiWZZE^Jw{A{ATywg6mfΐno;zjzT^Ҋw4 -T(fܝnML _kw0vahv06k  hw1IdKtGָ_ZϚeEA+k!#d#+zY'*3gʂHZ8 ?l7ꪞlxi_1-'MYV*&6I^+se}28%h"1pD׀ٔVMkud wϝB=k 3_hXKe߉l![4B Yq% kcjRFgQ\ 7\ͯ}?Mռa5ȃ.>%SuS %%6aO  Ap֎0+Q ga$soyfA<*(/jeoCw Sܘޒ{t 4wa>sЌ,/ܜk +BNOGaܕ_qzQ|G{@^„1{mT~Gi>cp$HVY+ְd%0ta7r8^=} _s>$ϑi7OM(k5= } X7G@]E5?QExyRO&0:Za. d^PNkH$k/ևsj!R] Ci軹,-b*XKW}rq/s>edd#},G{(EAgh l庐N)>uGj4V?ҞBɇCp߿jWjZ-V \,^tfNq"FOMe+!NRwLUXy$~X,`ʵ>[J 0+'Ӌg15H.L 3,pPťt36F C]z{;j헺>~\f[O9_{e5 B{_!汐(y1CZ螕UXIVLWV{{/x0ɰe/Rlr<]^׳K[( O2 3m^Of}/08kgZ齾B7GX(Gkz. \W{Q2/ xqK<-$02?+eE ZCRe/-$bj;a9_h#ww,'ǒ/Gy&seɡt+5`ni2?7Lh[sZʬh1V8k#Bskk>:^YuMٱ@Vf|(@G:e;)t8ҡRYiaH5Lɬ_#Q N~ݠVùDY>"?g##}ðȗ -fn xtDEғ䬲|Du?%9(Fb(=t}B _Uk/GǙ=Lkz 1# ^ 'k{WV},ହ\u8*%LCkVlJ[{QEw}z5ܵKNIYJWs䙒׵di J!FGBIox4Vdؑf$9wyrsƘǂoJ۔my*JfBdwsڧM>lJ{!nmtF<$ C< gu7+3wRi1]kVDG,>5UaG|ǚnQiCBa{Zzb}{Q|T^?/JkI ۑs'$8/4 j#@&.4WJ ]Fzy&pƯQpra˦,ص˧وñ `W9gқ aLov&k ]a~a(H1GNcGpsYofǵ0hpqXehՄ$ |q]1^a" =ϐ5ֹPB@>Pdk[+ϰEw|fU?47}{_qCNs-qw*'<ՙg9;g+M7Kɂ)k4:aɺ Pr(] <<ϩ$8JMD> >LW<B{eNx:^޽I,UPOb짢U8³efv 9+UO#}4);.!x3V!gw {'BSO`ɾc)Z͏~~xڏ◽a< Vyx%JcEʕGᾣi*cp?*^{3VbWjlbcm٦͉\Xl`نdž՞JCl/v8.G5{$aP\{ݩ~7i~S8Qu}F,ߟ'D8>朸 NϝqOCN/3Nvf+g%ZNR\l nF>)“S,Z;{>Y×'H Efq)||<k,ثV0WyKKNGJ5wjYWBAGżw8V>*{k{OYv]<~ɮ \mۨ9{^,?z|khEgp/Cb:uך).e:=.?^Lb^h̹x"tg$/2B~\fG`BmsEn52&֟.O^jx Չ38)ŶB?ũ'Ngưl6A*Kl=sGV \QKO>LA V_zڼs,Cn؄E*5q"wM$HW&dۗ`ĢaoMbMmY *G[! -⟆lv;EOV8>~RdJI?(~?)7' !!sJd<.[ԡWO1JVjP&Z}}E )Vdehx+N->ץa 4F6nJNEJ[`gc|Hi 1kAVupTo+]S; "ʼ^.S͕BQN[A6\X{ZGVH# UFP! 8 69 Rp05B<~A?/T׊{S~dlSA-8]6s%ƾ[7Rr7˞A:ej'M+ihٴ6#[ӻF1Py*Nd`akmM)s$2(2 ks/(5Kio+.GO6DI V%؊1$nDBŠ$A]QX]1QXj ,%L"\i<-mb28FFb[Q7F!DE?r<2:M+)p 3ɑt0J4 GqJX'ڻG Mda送tɡdMxQ-k~۝<;qbUkTUaܓG- 4x3@tVE]A^BQ$Hz&7 +_+xK;~Pq ܄{rAoϷX&.*^d2˹햤LcAVklǰcoZ׈d7?Bqvt3-c"G~3s tKMﺸ:A] %Ƙ!Ҳ4`Q<.X4u(%7+͙a]2ˍٔ?fѧBMH)hʧWC7V쨇0eIh%)_f:3\n<6ۮ|hX|u`= -Egk^],`2~ӯ p^^}CD3"~vfeqQn >-.(s{p]w]ǎNqTՏwM;ti|*c =:䜻&42AܚcY c1Xגf“MsD4BKzk<l[6^( J#r;A UhPgna2?x_y۝,7To2/Dz$+71ӮwNaqƛh݃ZFKw@fpxa؇caBuٔD9D`MTo%+m/8Mi@Ge.})niɗ,6g@S\+tCPi!3< 9j2on\]z͐aV|R+z{D~`Nȣ$sO[4ϻ_Z DszjrYF`!|2uwAyHTM[Xt[XOO$C*4r/41,_ \q$9G,P]Ӱ3<ʪ29'VN02)V<qR 5G-ib*A,d4M Q= MBh5QBp19)k!z-4QJ2z}bCe[qz}VƲ]I2&I5k_:wӴ[F5}u{rxOnLYop<"?ҟq'Gϥ&jtWx?;9PZXBod%w%{pv2.fv7vD2!Ocŋ {ya))`@˾=8p`ghp{}//;j<#Lbi-Qpb_ϕy܄` ٞ^E8!士Y}Kz *wns^vP/G IZϓPz/.†GJqffO5yXr Ua ^N8ޥqx=bb]WcIdv5HcF_ ψ,H-#,gpxGPJ=F)prXG{{V+`ӕ K\`tF ]0TAtl*08vK6(0%Nyu>gNu@&u+̑›Q[b1} noۘ]"<*Q& w#қ8^3 >ʸk^WB5<#}sr EXQApn+벋wWۿքKό^@OzZE[NWyF+L_b݃ i- X jA]`XfnP+e\&_|CJ] v#-p8?;XkZ}M0g)x)g![Nv8 JR0rj3xgp|[01< oF}EM~dK}|K0$9JI&A׊U<+qukHW/x^+ןo9=1 a=Uq@eZ9n`M?Dߊ? ޅh4Jg $I!YV)ɾ]^3VaDgu ?z_'Sq2^|CƘGJAHN`;j72VDqALF=P.%}ǢliviHh͜GBC$%!llCeegn~^ؙArXۮDޑC͒ û--6GObbm¡l5ja}"  2لJ ݚ` }uDV蕰9 M٫r ?D 74)!Rf*6Ըڲf]4v4o,_CW"ǜG(+J941fErWdpo!ڌhܔfeL7QsK6Aaq_Ҙvq}pkJHhmdP鲅s}W IljQJO*E Sa*`sȡ&^rIC0!?uPŠ%decVd\ł#wu wd2B J4Zp ,\t )U.xP Iz8 RQH]- 4bɋ ·ioQЈd*]qhQ)3Iꩡ`QpNDeBHMw|dG&}>.cD+d71!ɀ,!ki +M0 g"'\|I,߽&%&q . A;U.a+;]Z&_e2dwa@z @$9ыaNr'W#H smO Θ"d\J;dN8ʗF}$/˲-Vޏxlv s֌AJ\ V4G zZI.v1RE θNLNY1] LvJY`<mT >$l͜Hco5.A`4skLQ]alG+eaf8׃v<J툟L^wbp]zi[@2nMkY~:LWg63t?r$G2]z`J u{Ľ^]!C^0_#wr<ǣ]y rvzX59 SjTw\`YZL,{Iه8Do)TG:mں\l~ٱ!k^:t+gW]V:Pi멐 WW;<ٲя JwGrwu{D?Ag>˶:P9@f2`ZDzY~eH/PL%hUr!![}׾z̑!QI3lnh631Y8;f$"TMUAN\&<دsC~U%[$_TJ}>h?y{yItzǬ)LO<xz^I@pw$ F }wəd9\ p 6M< lQ(s7;ZFp?K3A2!lf!["9E鮅IDc,LϘN3/{ÈBoaQFrqǛiwGa|JsEmympto͑ٷGJUBc=b{,-8hojh1!Lʡz  +#@OjLnaNL6hYwΑaXExJ<4%sHNCrQ['⏌֜:2{Y^ vF&4EYL ؄qC5 rk0"?K9U '&[-yfSAusnUҋd)J%w7ON{:|5bC/9D37 dXNwIJ^Ღ +L ղ쉡ݓjGzo pu'}!a,3,ˆIQ~ +ظDR|!n't3!cܵGfMȓ0T=9<=|W%bIt&uLl-@nIXUAAz ¿W_K% Η$IXYhw%XobostEawq@C_LLs u'q>dwhFs;P9v*lʏ!G|h&qXh@J׉:6m[Bz˽`/CewMIq3H=88pj|Iķ7G_W4w\"NLYYt:u-;i'! *3.Jܭ/T/.X]4-pJ!!PO뾤߼bV 0/<lP >>P?";$KHVPlO5yH_`fAl^fàܿg%ì 'ӓ#,r]{aS$3daJ B}VaSꕽ&<3O PvPV9+BK^X[_{G^ҸZٮis(׻ =湒scBq*{آ$/%}>Nx]2^ւPR];zcSpܝ`9!8y* I'D+dDއ$@uQzȌHU5dey s 'u^'k}l2fɹؓ!vHX9[ppz{}EJÈCetW70C|`aw9ڐP|S=\,zMqqWHE0`"<uMc*nKiON$ a`g_272TqY{kh]zl+b^h<ߎDH}C[ȜUO+ U 簓v{Wi"&{~RRV}گҔ̵}&}LzFb?x( M:'pew,pA{8++2ٕB/qCCL$Ո˲}rK͹r`l[ƞ &9><׳ub~*Tyo^VJ5 Ŕ3{vM&9r#L{=[akϟ|ЕƲ~~nT`I$xڟzK rC?JC@zIWaSG|1'o?li)eOW`;0j-C%݌ #:;Nm9ؗ)[yׁ3I4xgy{F$"DW{*fT1Mncb juS_ ay8ɍ~PJ;ϏO`$G|7 K7 x=C՗s+fUN|ˮߏJ vBDd٣7W1BBK^=ɾhm_mWlѿ,Ŷz684TwK8fЊ7/\TBQ _0BcY'LS+ @FN- h*E}~byGKAGJE4$K$2 %-T\A0Yk$;ک֏jf7Vm#ꦈQZkgǁ)ؘqR4l@+0ab⤋wm{nd'+X0R#_N.jcWIw'ʗ+jۦ>MNjf_Tm].+<\JmHU x(ۙJX:F?j-4g_< $\ʦ=."X?5_tAsM&2i#pkWm#gtLgIş7' g6vs"y~~|;{ȑ+4wBڊ*w>H?V-i&</yz}rŭʠ$U pe1nX۹'lpXN19-Z=d9\BByoCPWTs)[[&e/+y[z.՞ X|Ō1 [RN54eolQ{awDȐH#ac>>xPՠl;0pb \r3qUzheB`!!c{;cz% k7i9.n!_o=s3.itRw:Nwۘ/Vm0?ǍI$d-3ނEvya*=q[g06<@g^+Prҽq )NIγwo L]/ן%Ͻ g |Qz`Ɋ`۷!6%c()V|dQXf5R r5֪yGkTӧ57k_b-R30cu^@\잇QegV!(-|@捌`guw#ƴzJ'qE}X?CXg' [X&PasVs.T$}|IdcZJ nSЇv/^XhB1rɖSƙO2Ba&B~@83iPcE+1ب&v&;/D> `&:z̐KT)FQYqv.uEap`G*?^`yA`;z *R\ S gdh7ydRmxzT/hk>_>jJ<($1vOl}T;U|G 3 8;~_f눦h{ t}_#^?*ώ+է*y" r2y%yAF{_ȳ_u6-=;[c w$Aa[^& o!tZܠJ2ˎ;+c$Pz>H%ֻ>kH<d UMY)` &;j<  Gl# ,v=~PAi PS>R~&~$I6B хΌ/),sАUǒvۉ2HD50'aE5-=G*ֈm^Jٵ|&x)ew0RFZWF`CD|=gJuLv&: L ׮PҜ+%Gz *4d}UՈ$31j-OvD000aa #}XTU-K|%2`t{l_ Uֳ;Z*yt2oXyքq5u q{wf"N <$w܊[%0^cEUBa00nP2[xǬֳIn5 L|>G#'F}rxG2ժFKz'җE҂s+А~ YA>E/r!+ -B %`ReH-ܷfV/UX!9L8dK;v?`r tnά11(ILbP̕Xs}iWR&Z4x);V|*aե̎! <-aaesgcִ|of H@/M'p.1hF+kFx>sn&d\>T+"DϾ0L =ޮ}6o w*Ťf{ޘ1;43)[!p7,OW]ˡ?tHOe* I)A)'- 8S.Ll#2'`eXC)}|KVT.4dSǫc <) + a #/j[{>}WqO5(;?^H@ڐ73jMLVVi-wr9}A"A=`s*GBJԁɔӆKl-U-#Nfa:%PCy<_-1+/l`qy~~C8C Y4 54lSH7|nj VUl&!TG 酅 -l3\UMjJ&}3e4^$dK{R)y8celAf <[Wpd<I.if9s0v5KT^`jD# `v߿[?g 'QEgfZ4Id$a2S+<{wzdH4敕-\)M E,C(q01)cxxHL5UZ}(MUc!x\@JyQ_B+*OGPXJJae;GL͎ov]RzԜTA~% =8qLg#+5@28YV{,AqV^YU^ IS!WS${d ahQ'7h-.5}B(Wֈ# s^ CR93Snʮ\iu≄ /=948hC7|%Ɛ/Ӌm\ шMgjp@_qP38EJ f0w('F;"J GԖB{B(5 OA W&<e wx`Gl;ᳬ pU:D:J 4L֒B)@q2/}q;SrpVN0(E1$,sR2Zه2]AlDݡ)jYIN rĬtsSzE*IVfl?g5g߀ Ÿ]ֆWtQ3(j;}*=6:2Īw*OVgs20 ޽%Iă!x) 'PIV/﨏8JƕeGDe;Iu0B Y BWq/!fz@;hH{dpBB{=rn8~'BekП_yh^XŴ|7}zO[ M|LR>~S LA.kxPd*ajp]M{c~ dOwG aH,[>Y[˛_jy1m] w,mO1 sXb)]5&!q:_* HGzrF> O3Y|KLl$`Vrz~b̄Rmm‰+m -0x*op^>7Pt ETu֘k^aXٚsV*Ϡs[YF@#Zz!Ƒ}V\roI˫Zl}=uerJjQ8&fA|V#żJN$tŻr0EKQGxZx y,vc )4;fi'2ܪ4-lBVNP=bWGڄ1Yeֻ֠F>Y#!4(`Y $9&Gv0SHXH H#A& ԷdSM^A Qu_>o4tS,#v8eoa|v;I05VMd>M ĄWÎ/ZJo 'AMy&0TCY%pLJ}xtͱ 3 TU+I|?T>UJW2ax8`OAQF|gOA!P۩0Y1 b" vT)ZCʰVdpҤH.-}-%T ,IL#dj~M;, Ħ1^fk}xeBACax@#2e ioў GBֿeND%_ b!ppZN d MnrǚdfXX,mc"֙&q$w =H5\@uepY^`p {cL5[ѡYV 3 k290#(Mpo`W;c{b0̀ۂwo!'tǻ [*VWb ![{3-q=2q[Л:.ps탳jI>E\j$ϿwԼ {J,Ґ ǎ Nb@(1(Jz6[x_eZKJNpğN:UoW(Uv ښK4[ {kؚ`vHLP_==aj; AˣYz V<=gʹŃuKقO!Y2(Ӛ(wK3>٭H.֑TaXM,Rj(@ZQB jN5̐]PUr4P9T/C/סL[On^I?AZ=#1(!pR_}%r7 sY _ˁJi%eY_:ahLJ[@wG[xȑClSRmɦ3n<,^>^  >)[[ [U~߾ R.Cղz2k7eT&|Jjm.Vl:HEtYm6o`MIM;k'}mjoӪ!b9~v^v+f_Rsm.imFQw1B>bwGW .<Z.d:>EcmZSY$Gd?LN~G\HnY?xVB>c@D pƱak/}EEOt xU7g,uR2G3Ҳ/di-_6g):iNiZo|{Ͱ6G2e¿g}SyY -:w|E)WEbz /蟐8ޟ͖I"1l2Cja&6 Tg=!s= CvpXy"Ҕ]DLa( U)?pƗXE!Gܴkm8BQ㌵}Vg>fuxC?ڀ jrckPHe$KJm17 Ī>s73z[L \\;ڭY?} C W_\;봏|z M hs~fCU_^}~y}J}kU@z\Y g|8;E1%aR.ryws9"1 Xi-38MʥFȄL=L$8,15cHp>{Zf Rǥ"b^~Xwm}i&[jl5d&5jASV.v*NE(򂕵uq$Ɋv5kJ'b/zb>ap-AQHsAka-0LktdVp[pf ,+IUMWMu Ҡi Wݪ\ cS+h1l历>i`g/X.b"C-0N$f0,_ɀ3\l=R!}{:x)d Ǜ묭 7F٪Alk_0b/V=;"owҖOO0Ō266(q`<%!fde/x`!g'|yeA9 rAǾ} #c7>kck>WYdhNYP}'Z@Ԉ+aK[XغB$#2oXeJg"=s %x%9 S#|,Lr!xT J 9c܋Ma~ ȮKpTŞykk@@+FY^fb~}G\n. ?Cr3U TC x\T5![gw%,Y[\Y=P3NUMp C,sh*q^\ϯlU]JlU˴hx`Qa&=.ea4g@סܱy(wY{]ql|A`,Pl渰O0͗ե"taǞhk6ja+-g'J_rBɃ" *h8'pj+C0IUmJyFx&8SWsP5qIDATT&;l0!=WJTY7eh1})AQtHnZ,G (DWl\Dd;MSPv32SjLul0" L[_)f(#`F's}zY:Oz"am!TfJG(KFTDCz 0Ja(C@pP.9{ d6eBp#/K**qd ;f\}!b#f<1;4aJX/\0Itl#M G&^~h$c|2EPwT]ȩ30B{N/{׳gc(0@#>[.yDF\#ٷ:^2USfoҰ6ޚCD'w3)HD$-*2XWPr|,d$LsE<'4sw& ڗd>^|C#C \u>bշ^b:18]wHO.\Rg?ߠr57ET` SճUݡ=yK$4~5S.HnjJ %|4 $TVѼkR$f52qI^IUݽk5@|gG*?>* WǑT |v=sg`+CP)EsJ#>mye˂ `LJ$o]S0*!a/j门r 35(Çam@ɉe`/+WvdFDzTAboN/ 9`|j<G0U}Uٚ5{!°&-_\k|Di%l \Bo3'lEgoڎs盬תZm}|e\96SM h6BN0̧`:_߇Z־zk eF*uUwC8 JNL@沬SpY2 |k`!0DKsilu8LnєA:@Uj)Wg-@U!d PV'L`9[KG'6fVyۖ &PWgǾjjո\w}UÌm9\s`fQ9AL&tY Tu2Â@/l ֧q[@JZJf_`'9jBP{_62>Mc8Nʹ@W1^sSRJևfQq7 z{Xws¤!/+ o^Ux%=&oV_ XN9*SbwUϳ@!_$&M#;N)lTdd LF)m5*`zyTa!xAMM{3H:(I6df2dgEIC/L^b,#"fqIx`PܛZzGEOP6?N2?4YHq u2yAY#{#gf#FZ)Ƴ-f")$ }YXwB0_"Pu<,vJđ l㾢Sd&8\b=e0/9cFqOҷ(@3L2<>屬y~ {ru2ykf*lJX$W? E$2}Pj$2_LrRܳ(!^Gv{F.iyhr!cdk8&B31gkY2}߳3t#`S-“6[CB["u﹞mSxr KOؚէp-u- Kږ1 ХƣFY$ o AC%<-+\d f?8@0fhe}V< Ol}<zg-JIa-7A2 l@JOL ͜ ? ^1ҥ8C]FӉpDŽr+9xǀ!Ux< 83 T@|pv\7iSL|*[2V`; NXȠMBÂg(LVH9yg"9Ių0̛̑-h"@ !5Ve*q@Mf_D eBA@k&镐=^T=*A~ig =1oދ9!Ј' a gK w7{QO |Փ3߳BhQYQ@(SǼe@8,h;e]3<ȄL`wNF&L2R~2*Ȫ[H+xlxK3s;憀K@]wLguN +CpKYp}~ ;4Y8p_ ̪ɞcajDbPV {kO.县)+LƇk ]9f+VG-бpbs&*>e{UXy 8%J'[G [;v8O4UQ)hxbO 75Cu!^ܘϫxb8 %FIeHqH +929X* x/ ٺ YPefAjo?@X=PUgDFhp_#@U*Q OU0 Cop?֞ߦWfLLو+;%"a&KKѳ&_i&wDl1@O|kU_@K=n;3 &I0?X"#9W}JL[ YTa4VRpuGJbe)=#r|#c6HKXp MT[<פ)jzȳ*<{C+ L,>i ;R/~gRe@[^2Qd"$JBVnX/- p}~- sGvJR}BJ?vhPLC 0l, sWlYe 2k*p0'Iw2}ep1ܡtU$\i"a=_zO C[#܁S#p cj>tF..Wf߸%͡ޮ94L?%(|2C+6iFdTaUe`>1oINt$m$YyU5:TP B}qrV'~gSµɣ9w2XBC > ?HIgM+22 +8ߊٔ KC[cU`^&Ք+wヱvZ*w|^Y#:yx4~ؒGfi(FKBR@+/Y VUMɑHp_ =.5-} ͼC9Ӥ T 1*&Lˆ.CȚtFĭd_Ly^d2 &0 r9KPfLxe$V`Uڬ&+=O69R:Q 2,~hŝ wBO.0(#׈\̈́OdV yv}+”xoN2-72@¡%Ta^ 'H<r)QUGuWXb"t֏O@rhxBqȟЌ )#^#NU?LҬ }Y%~@)a+A+ *8aٱQ L5bPEACY>B^Ml W`qKa/p_KO ޫ .#<>HB $!c*=`!lZzfkX@B(e$bظ`\d]y`[\-a5c3c[r vPJQR2#*CSECˡ:2q*YErj{*PGZeo1ϯ34B.^+aU@oj񏕎FFdMr*U1ߪ,> vA"f)N;H8[#xUZ1_Wց@5hUY%"r+J~}k'=8QīgL3ٺwa] T* jhɄyk'&˫̼MxR. IhE i! ߢiIJ @~ r˄! W@0M&OlAm cùKts Q%|GR>8GaMda,W}KӟEdgc>ܗx漯is\!9H!*?B=FAÀ?8<L> אfV~%V se,C|^8?,vȑr'BLȅ! ,WbvD4;nF%}'?\ȳ`QχZG} ᚷ~ $b ndCLiQиa=XՈp!9y <j2YPw|2;?ٝna&BަXf9؎ƒp2NKS? F /xʷ= Qʁ蜸Z2#7$e^B-?6_ܾ7۳ߟpFנvO) n-٣v 㟛ymq5&`dMah, Z&lx{BuiW?dCwkc :Kn?‰X$mrC~:v$6˱dk|˃E+ɚzBm. ."hFRqi !XΠL@E;ۊ y!:d/&Ӈ)܍jmي8ጂMAgwU+ O&,!t|JV~d9@FE~|n/7H"|Q>Rg0doϺpvyV'g70ةKct@.0ԁÇQka3Rg;#rKB?xA^3z g)?O)nQlUau"b|7J1=ZY &Q-Gy$B~j'X]N(Mӑ@,2?$BNeVrnvY+RYCaqi2[m\Jg<LƅoَBtkm)1EmZ@X2$ qo X/U& Gji=[y~l^ cBckA nϤ BuUTBy|!SřŢ2;gRyO}=~uQu7?op.Pn@؅01VLwA$`㍱ *!);Tw!'Xͪ .~_P3e{'DzΑ?DSgP U * B$A$`]B[C̮|'c^)@A &EskM,~GΩ"5R6hYb 6eURޞvLY,޴z7P򌾰 X*svTJ36IcMF$CϾTڹnşqBGJLПcEYP\- *kՠiyG/VT4Ȏr,ratV ~"0/n xuX{FY_Ң:`>*ODU~ȰaUCA[5=6LC4'=y5%Ī`zr3@g# 3ʦ}yǔC nAyxh0hHz/CUCtXf0j>Eόe2̎A?o)<a"aHe) –NFVHZ!35 G}`$w)?W]r؛8.y?C@ a?lmivxy/#z78?)]ywG%7 lT_. ] LaaϡVvMn>$gl  %[{fTf4<g"OƱ(7,DU0VDq!3K8,*cdRZ {ay}3fOm-;2K/>pL4̝Tٽ@0b,?EXL(Ǣҟ;iby=8՜xAU@mY ª9_"("$鬻3Ux܁[|s L"1&Oz,wSx"{p&֠CVʚeM!Nٺa1rϬZ l}+yL?@3߅ \ *w2aXՐ3#~@/gٽ>$Q^\#tY:Sa/k䅜z$cOo5_Te*pweĉ]qb1/Cuweĉ]qb1/Cuweĉ]qb1/CŮ_z9X%^ oy7+{d^wWU}﮸GwU߻+Guwő]՗]qQ%^ïŷ?}k.‹{jwW.݅﮸Kwaǻ+.vw]ؑ]=M[/˦S*ݼ$רXsgqwŹXsgqwŹXsgqwŹ??1{Tgn?OL&??7zpRwW,%﮸ xI+.'uw^ҝ]=[wv9RXż:RƋ]q=e:wWRƋ]q=e:wWRƋ]q=e:wWRƋ+.6{:+^CxxvVz3+ΩXz3+ΩXz3+ΩX?|%=:%^_n)6V+{vw]+޹]rWʫwnwWܕpzIsR%^itn9qr ]qe%^?OFRAb^,b^,b^,b^,Y[OYSy+LVW]+9]b_awW uwWlدgWKOgrΪ_j%Jz+.OKz»+.OKz»+.OKzBvKy~xxTo h]d]wW\xqwOݥ^Sbw.xwŅw] ;+^S[o)ЯhxXӧpw%Xӧpw%Xӧpw%!XzkBoyb)2y[?[FBAp e; /IENDB`web2py-2.12.3.orig/applications/examples/static/images/favicon.ico0000664000000000000000000000030612564727256023646 0ustar rootroot( @EE}E)E)9)UTTIU)T11q1web2py-2.12.3.orig/applications/examples/static/images/questions.png0000664000000000000000000001326312564727256024273 0ustar rootrootPNG  IHDRF6zIDATx] TWHMFH#mI(h 85nj:䘜dnLֳ;{pNs6{&f4 N\W]ȣ}b$BZ׻]4UnսW}UEnY7-5PjY"pӱz(ї`mĠ0ߣ*@<&2X~{Xg݄eNeWD*@DU A,Hy$Kn)k r{ ?EćTW {ItY$*@$^$A$~ y5"NaSLȀ/HIbUHT}5Z7PoÂ䝈ؾi[Qҿa[/aDs {Éq]LdeAFĀk+#3c20\Lvk;*Q*˸_5l6Nӓ^J!}}=61Qv+jO}JL:J wkj$q y^ƸKCx,_}>y}=;kBLo6"ő7#J.$ 4F9(Q"d ŊKakt7ivSR^Lh'g`r5RɛұL(4@vG&WG=I0 fO(o],_!IGƖsM!1kbLO^+HÒ(,]oG= ,贵 b>o^rl8â\! ֣ XÆ* 6bE?%eJИns'+ 1^.Z_6+cvnD'Pu({# 广b4NtYq*zCDk%.]m Iu`@f_ulf߄Ϫ̰X`:%'W)c,P\6y%*+nIY]\,neP V^m}X*O`ܧ<ۀ)S9aW8Y..lȽ,w~PѪ6?2^`a,[CRR9 tlto欘x2~߲ueCpl5|& Ҟ$kzzHEikD9w|}PzaqO,Dɇ 'sQw"w.vuWO{=t (`~S7<L噐ٔp nKIoXVvk6EAeH,&v"AwMp Qb5%Ů7״|y)('릢_۾=qsum\s_cՄ47|.ȭǼ??i}2(^юC_-8!bP Y!w5ٵV=FfF61YqVc|nnAV{[N Nu7#gLԣo߹ #aa`=tQq3_NS :hjz(K>eDzY헸dg-;tByБs0|IG  wf 3+o%OCiBsztk"#]w^Igp1i5ހH[-4Ś XeLE=2ͣYt~)ch*x\ {8#Hh&Յԥ OCk{++ RAz z .[Q%`Hilea.{T.q4(KB6ZfҲBb$m5_&M2sk1=NLwǐ\DfH0J0D,4Tq#῝xY.J3tW I96_pN %{* C}X$r;B" \axܰɟ{cLA.&c yq\X)K$<# : F9dY.͢u$(Y)/'JɆ勑+ZvR}wL7Ul uv^tdtWhl#boY$)mkrv!Y4Pc@"u@DO?R.-̪0׈\rLDXD`#ܳXfE7 }3ROv瓳)CpT/ՔDSbI'F-&vAҡ@%H*++7xYDCc0-Ni K j>@iʏie8@ⷋ,.DqaV$BuVJ=Fc qZz\UHUȒ, `_]^P4@ YB YߖDHP.J74@ y@ ޸*͠i@RL Y_ QK- HM[}~yDn=A[} Pґ%{Z'y/- u |aȒtY{Q>R"Vݴ \̼7?kk & ^Ok61(Ѡ ðzX|2F86zwc߮m^ous3pM,Jۚ AcAwbxh]x xrڝКO8\GF6oӦ|o-1O=0|t]ioƯ/9hkEZ@|x^=E yU.V|B"⠏%@P g#:]*HJS/䕡E}H-KQFb0ezѣB|Ў&>b0mBl|:DbNవ[&\ tXG'NӷMaHH) 3]{$ Q!]X].ϩww|Kea2 'eF.籏HV5,IDVlAL8* c$ zC+mvo%aE݇GE{f cF=YI69%K{Btw-s_<]S㴅lCӞ?& < z}%n/rs ^/: o`cI(q }٭dIɒ<LK؂8SL\Gq;I:Edg1-7ʂ]dnC)n~9d9Em0cu/|/4Jh0޿+~=M!m:!>e񏹆+KTi}+b>N%YE係iI+ tz߉/nqhϙ7NM؅ .Nm8r;yޛPg 3jw&nćN ׅ-[,o: H)[s;f%Kz0#HOmBK f>6:S :MגEM^M_j)v86ܒOrBB^::#SD#W:X $OH3 Q>/Bn4QĖo?y'<'psz"~\ߛ0B MyU"r]=("uԇ|fӗkӘIkL.FqAIcv{l/崅t0ttKL|%#0HJ& ō@ꞌI L|w EQ &nwoDP!l<`<>iS[(`ם48GhB0v.LжȐ X[EK&V0؁@>SIuQ0N.tij%e`@,ޠn)jM/Ě:!J >i+K/@yf:T6G Wv|z~o, v43ώ99YG],ߤB_nJ֋J9UlAT˩e ^RU(ՔZnh_$wkT(ђZfi,?HJ} ėK& oQ$7"~IP 4 ?%wwq\i,4o΂qֈz٭!+@\j:5@ [*("wAսZ'DIENDB`web2py-2.12.3.orig/applications/examples/static/images/videos.png0000664000000000000000000007040312564727256023531 0ustar rootrootPNG  IHDRQj@IDATxuy;ns7A0LD tm^kf=s|9^xgǶlX33,Y5Ȳ,J)f 9:z x$*ݺu+rk>p RVVvuuuJ)ӷ/ fؘ'lttԤUTTonn~Z?~2V6ɋ.òhꩧj2SI[dIB/4=U=q%x'SuuuÇgUoD#sV?_LSU{gwuC'hh̓CL|ec[u,0CSYGG:tDNŋX-wߟ9rW_|x}_y4l@;kI2YX~]&\Y="-[;vɓ'M?VX 7a}WtM?#?PQcǎm4´2 Z.yʛE:F)kMoÝ6Ve][=\l#qP@o-QnS_=;@3;%O>%-ì}6I}߷9^>\o(K#kq]à->>`5 w X5EOM=p=^{":if߀z-\Ӥa&wlڳg΅џ!_~{L9F@taO~OnY E:Z[vmpP2`V1稶l({Ttc~bzo)]8Ji 10,tRXճI6BMz?v~>}zR9Cs<)p#ܧ#OxJaP,Ȱ<IsVAU1;ܺukƍ nЧp꘳v3}L:ɪ,Ȉ ʅbue6jrlShll埇׾5jäFÅí?TTf&.k. nө,*4GVt ֆX&oVUUe'N^*)2F0gu7*"OEGZw6xt#=[?fDeݳ?&vaƞlPqF\_-3{VE=T-ܱ۹sxAeF3"F3ի,$ؒnCrc#3:M"B-܈ 4:1( eQё1Q ܌ "9 e9^GEʕ1`64"eUVGR(J)rwQQ^aC*nʻ&,$AXcJgDlHOVLjȐ('zUeң޴Я' t^r#j6T^To_ZWam6۴iFsQ_0?3ZLzࡇrdU êDUO?g?_C]qU>*/Z{wо u*:g{vf۵cVcUy%)~H,a_W>󙿶7m6רU鹱A5jS[f ʶvQF۾su>iWm%v!S~NP57թ՜ceo[_z}1˩CvaSRcD Y]] c?v+n}{>[qWg:ʪm߁OB9jٰʇ:?eC6*CGڐОS=|=p#BC]W [E_=jpj7iPb ;{챏Tk}=YX̖ꫭ}m>=eX}Q_K}Z4밯jf{yw믱Qjo_(Ԁmyi[zs?֫p5*ҋz1knk[igΞK2߅ >1Z[ڋ/>oo[wKTqXy!'3]DCvTy%64<'vW+.r`W_o>hUV׾%=u!E54;%.-[fwmզm+~Reٰ^e.RFFۯ~v 7 T6(PV\g՛U9ܐzvkhKV.U'D5ԛk[֚}vѦ=Ǐz55e>촵/F=dn6kjl>UvwmyZ6g6DzvQ׭m*; F9.W/[$}=-j;n^{֩?߮bQ1g$&lm]o:;sj {W1;{:S:ߵs:t8z˭vX #}6aHҲc<`zuz_NTC:#ht(k+cG4t95FlVQQ%GRl#&Ԍ-sʔ|^izaG{EeؑءöT;QLvx5fA͎z爆d p҇ o%I:nnHYi'u a6dࠌ(3&tV[OTa,*g$R]%&;#B O((J~9569EY\ZUI8F^jmmԬmXbZl}? 9"W:0jNy[!m8e[36[^o޴ңV Ő5թ|i= KϿT 2Vo!H3abiDf<ؓaP#d߯a̙3lH)(knK[^;asrv#2PTZ`UwC9Q4#S?ix(,(*[sKDvow58}vPSN9T~>TJ+QhRs<¢db\TYHx>yN,3<bU > zE-IF}7͸jG b4 L{\gkb K:+[aE%K}GTkL }YٰΪ߆*ĀJ q7^ܖX`P}fU)/tU~j+e`@?vtV0rEQo֩Kk*ɱN?=3 OV%JL]NREZH|LY2`icE/):%,wK=juu|fP3#vTUWY` ;OuDE* $LPϮ'mUPNա6(P P\T:a{PAQ@6$ՠk$R9X ٰf63SJu2A ҉d7\wU*c<7}CC PPr_E$Qk>$_|ŞG\HbQ!ΠA;"y*%)@TXSx0C٢3r1ZA^@R4 3L"39eeJ O7);TTSlOo7TB}M#ӺluH>Pu iآuQua R5 R^UV:DZ1G͈+T>BH͓1b'(b'ɹ(I~Y'% Uv_T5y1sŽ(ޚ::"^T*qR^b5o {JO;Ę`@K32-4YmկjXf=*]ʩѰP7%cQZWi&YѨ$Fmz>OqhCNT&3 ߘՊip2D͟, FTR[_mN2T6Hyv 9ۥ5\\ۯߨSB J7xj±= ;D_SZSܻw ƭkyַT+5mZZ~arsA״Kb~3]gf&}J%X2EuԣEAƴͤ\CZg̷ƐyzcG8_Œ;VZ[bޡLRC k mDBB^Qhz\B?Z6yx(^a0!7aOvM30[lY;ylI c5T8]U=0I`-#+f_/7d>-X?o?ۯon[_}Ů*>Svw?26ٲ爘i_(T2aЧDSơdʩT@Vh.0SEר)!ivSf-\ZK[E4hoC` l 1t-hj1 GŌHV^_Lwnf0jWYf S,W&f|i+^{ΞT,gz4<*֪kliʕIƦ&QYQ⽆$̖u5WBoņ=߈((+TKE??>=nn?LثjgEm;9dGsU27Vhw- (O51I8 @sqXp T<(0Vx25`M -Cx P^NLQl 8_&R!uM%.,L`*`Ujp+G%6Q̜6LRJu'0{e x;%/R:e#F^x+%<+[A,ۘ Gƙ`䗆,<=.>{DՠV|oذޗؽЩI[Nkl%hnnkk滳v:o.t+Wt Yo`XUpqBo֭tRe^Rm3^-wO@d?l#.Wg 0UTjIFFUJO`JUCiFuj,~xj-y کoPRev[ؼ@3.Ur(U{Jfgc֮I>9/vIϪUnV̻VB% `F%5 El,>#+)͚R#WhƏBy1SG),"#",hJI 5'1T`H@Q,]Ƣ05C D`)}}SrB/v\zݻMުŋvm)e{wﵷm:;$mc8N]fw;Nѱ}m#Zb $" +V,CV,^bD۷no}[O`df}[.ټ٥k:oHa_y*2rB#ԟLAhp7DiQ7g賸‡\(!Bs&7,6EefȚZb! _xή*ՠ%_dwg/h A$>sD/t_7,yuafZٱoVu?:pH\ ~of̔Nr}q3pٮpCQ=ܧKJIȧĚEea3e*3@rߑ*5bS'зr|^N 1h,xGyݠT1,rښ%&F$/5_'_𡋡x/qgYx18c/6#/I~ff7eIa(i|p7ece.X-Vw/fjCJ8hrчtX/,l{#2%@/T,Q|PcGc2|/OFgfT~Gaye}`}0=a&f$ ~E8I w :i<"(?مLz(eF@<|72B-CAdJ ]4^؅;n0S=!pUzh"Jy`hߢ;ޤGPo_ ' ZQP]Y+s`J  \^]EC;JOQO~n#pTB`Ĕ ]z6lײַQ)L ~fVp)t'0}Np`wt AR$v#@ͪby:i[ݮZоĖImK*{zi5 L7TRf.F.%UJg8XoZ!gdoSD=! řhkBAQfv]dd(_֌]=Ndb@Hm.eDH2By ȧBELla/Oį^hh,faQE^y @3"_Sy}FUma|}5wk 6YsC+w͆˚ 3j|Ju`0H"-j4YZVbsx#OnHj05'_c`"`NlRy-Tza|Ƶl-oK//~KepBa~Mg*L1-_tl\e Dy:(聠NPIKvr_8CdMYt\=RegD_S%X4Y=|BO_?^P,s\? &\+G[κF{lR߸ Kypj--(udX1%*UnGRy̗jo>q esiMOC YbqO5 ޽ݾ>IX`*㹖D L, -`ӕQtbvЪAIs{&8"sٖ$y"aG߲O+yR,2/ |&w$2;S9#ܤxnБCHu*Ԁz!4t?#TwE=%W+OMgT R,Y?)T.bVH]>8c~3+Va\S`yPݧnNz2 sQq. Y'lBW(̀ 0'$Ft#hנ}Txa"O{)!CDRMlNT`_ڷ3zrsJd<4u~.?o:YpROBbd5o %߂,BHdʍQn$(BQU^߅ߩtE׳}Q.1Tq Xt\QUD'gM60SgC\l=PQI81=zMn.~ oU# RIzH4*s3)e>2&H%\b?S,ee 7 ; 僟Îʘ`01 ݨK̅nM8*1GM {fR%֨Nݰ0 a@~Ef\"d:4Z!C;>4C"rh( *$,:FxtÌ?ܜ``;`G"e?<*ib>?>1/g&sɀWvPr˜(ãry)V68Y;!hH٧УaY?`8P7)# =CCa8X&>:yp;҉'?Ydat=#kG逕G6P3{3{6C&O|Όgb6C@{\lBr/ȁ¡ Ppr2E ? IY)w7){Q" CF\QOE(/oɀŻ3 N`sBy'k&jۙμr`T2/TT?cEa55ߤ __/I046 jC]~`Hä۶Ws -W^v01yho_׿3!.k/ =TvtE]xkDj`p&:&hJyV3FR$RVT.y$FQ*` t~VG5b oƅmuY箼pP!D>֭󴹇4 `P<&B%v-M717:'ACG?;~Y0Ϥb&s:3% @AgRv<;id\Ӻ'ϸ0.I8o(f!ϴA7p7&~8}̐HCw7T Hā?w9^cL2CP n(;~ c7U2`Q0 #"`33bKRNYuP)MHAqh,@@F~7 {@7 wT#I?|Gž៸lkk8.GŌ=iG.LbYe#URfREf!*uޙ'F,/ϊzk #zY/j?TBy"_b Íun80= 'ܰ/pPeieLg.hd ?&t٘p0YE%NxL^5n۴"ohĹ WP?44iLV3p(KМ5d2X \0xGP,2__wؿ:yO3THRQ1%5|OO}Hm Gf|r K,##Y>|CXVh]eԈxx@hDիA\>kRSs:󰖆WV3r"Ÿ$[._ s7XJ9r[~rZ2IyL=gGYƨqa 䝸*ODĠTE'6S2Vqw]+XDO|Q?hQ &wY߬*tϺavbl^џ9 tuZ2`q ™|ǘXXڒ|ӠQ=%H$l%C@ rO4ͷ,anyV=GxUCdEurPȜq|d>ǁDiBƙ+k?tRM>MRSY5 {~Xu<X^^,[PwjZ+4^Sc]SZP+d)D,"nWuͤh?KD=Ņ F'ԛӍ6lUP4΍0CKÐ2^ u-zXr' )%%Vx9?|R `!awt_=CxXF;q R{"Qj=ZsSYr]T\✫H;@oYQ0ikfAuup߳vmnM p~|>b}LN >B="O8ȥcG<(ez.gУaw3%~qY ~ ][ITC). =*D ΐk|VԲoo=P730T QQ.ZL8ZTگߚ~'.}U.5 =]=+uQ.zc·-Hmnl*#OwM:gA{}]7ornDTjDwMоr%*ZaO'_hU<l\xp6)v0+V_[fh@nUzA1dI\z KE'њdb r*t$z YvNPn8cqz0ā? @bxiPPsBkiW_y|=o`#s9.ɯוJ]xU R{s ڢ3vzuE+)zS1{\2`Qr/p>J1l2Sق_*?% 8g:h;gsi)b$0ʸTr2ZBz;[d}/~/QVT(l3{l9_kSH1"瑺kHOU[CJ@fgx)QGa޿&E;K&(UB`T &!Sm,75q57TL{oR\ jUAU]/FZ'*4 PT/ܗK"G6X5aL\b =sRG tO_T'k$ <2Z_l>If}1egq>]7ٍFd19T  p㢋6yQ&:vHCV.ד)sTӇhTFrF&OI5m#5lv3uҎyjGjU|I?K6&26UVY/V~'QD"aPYsN/H$%Ȩ:a^yWi}9O|j˨7p d@%K.^zybG축 CTgj 6رgl55-wY:=uW`HV-j.1wm}FւZ.k:!1 ȄawmI%cWc=js @BϚ}&drax :bJvI V,YA!?A/EOB%_߻Φ}C{۲eq.r: W eWo-zJ <2h헯[ζK[녲![j`-j^fWJve>ag]tu.yKV)}MvXsKgt8{2.lIR.x19taLdE5nSqWR%'XR߉^xP5%TUxo.9OQG>^e+0IDATTt!ݛ{/c6LXC<^`~J9yG ycJ˾S1wTjSI{€,_qSedF{AH84J!''5aMfc4]AL Jvq84fk)\,¨N>ӿ zdEDqœc?ΪI2J'HMR |/fH rC;:B΅SVq{e'xI8A Te-8Jp{bѧR.a}0%X(| RS0Kſ#7N|mdo<# ) wXhߩuF=G0\ՏloaO7'`p# 9 @qp ~8KqEwi/6|Rg.gk<( %Vj< K09 XE9ih\Hq$G}(K*2ڛΠ>$܍a*3uar;uQ\$:aBf2Q,GX$M3L XD Ve(^nxpWuyETʎp3S, f 7*ո%-[\70(R(URwmd D(k͢L Ƞv:TTV@h]J=T2b@͓cHc P_:)V~z/#$g뿫h!BQ䎰 P UP1̱Cm0FV;߱Ǟz¾3gf?nN}hXL}{0^ux핝_ .jŰ_عwu]{amޱg;rw]|;wﲾ=&J!&wN#Ts|O忘 `yCd Z[ 'dM 䅪'7 8e(ҚQmMfHdv(CqzہÇC;?C? ^_~)KlGOr*>mP _Wm'~R'z'D^Cum. 7n(,슁zya7C ?ͪH&O&,1yX%Fs<G4ϝ4 hG]IڬkWYeRuD( ]͞:L p`\P:-Vsjm<V­]k.QsUk{qZV%K.$oߵVXΙ/V\后2;]ɀ Sl|Lܕ"_roB|GAToLIqwB(aM=՚_ԕhR ~ŕP”~@̼V\%]*7S|岃bWCs};~%j [lu/eK+2Uw>@[S<4b+_哂e keQhW-lsRMX v%,1YXTmX&h 393GPE4S T(BU yM,Je‹ۣ=C |x"m1&lזf@٣FqDb@nCb]( X541!k uthc;'~^*HQFX%X^Q*gi) gY6{ڳ _O2Tȏ;ϟaLCwn62^aVzېQ {;yΈ8z5᠘U^w6tK]yzŀxgֶÏNt8~zuq~q[b-Y؞|TE*",0ڊœU}Ba 94dD =9jvqLVsuzDv 83]ݡcڇcw˩7BUWi'M̀W=otQo^ E,$#~R]RaIH{=y Z2xvJkr/<PBE`/qϻϬ޳oD찭lu EEcǠ ɥaV 0|q.%JB>J*FU߶W_ՄI~aܔ <4PR6(*001"4_A8~O*3oHXJgb;bGl\#p@xHwZ!bLY_'^CZk|:bqi4CqgB-{#W"HPE\C0ph?ICۈ7?gJJfy`k-(QѳVmD J}~j; 9{n[2 Le#T_*.QvE?pȖKDҞ{[!@h4w`:h5ܺur-V _L͇rm۞z)OQ\om]fJ{Wq?X$tNJ.и7So\\@{l_%΋̳[Ee}o Pj߿uu/hS-cf!]wwx-~[naN@4 `w*;Zʎ㧭Z,\c޼:V2^[Qg['AɀALؙɽق ۃhS<|TtdN\[9;+%oq'xiu 9,hoGDMZEَjO3F[5`R EL M@5LjYVX!gbRQF];#V{,oFKdt!UB`]H6~|r ~GLq]|&V h?X@ԐbB6>~)[ަ--;tRQaɽ9U%^{UBNi= wO]!/kr37lV`BkC[aZ\;|/vgaOC!0F=4[j崍Zt~{`5 S*ʡ[O"Uh qO鲑WVH.QUVC?ف>;\DuvXg^4$"ӚHYs|Ϣj{6aX$2*%ȶx5|xU90.,/j_f?hlhx{@hW^rk;@dǴ\`7\}ּ`. zf9vZ%]7^dnyny=zBB+sIBUjXݥW,WyRO ^XD=B/w*@;햰'9΂ \DtkwF`h77QtmvQ4M Er52 ;Y?R ߝ nf׸ͩ|bоMpq_Rm"iag8`4i$Y?KPۇXlCj֯Cy=/~3am:'#ju- 5d?2 Eg 4:z}^%9@ѢBNWl#}q$oF *t<JSs#4'u!2Kc()WGjɧ$g֡3}]>ȖݦMaQ8O sS)/T^ 4/<(linL'lgc"9 8Ed@n~WtdYlbSxWj<J,os}ފvסPi+YkCVֻIIkL(ײͭ.K}_ ո? l+dP Pm Ë/!ːƞ/TOv @gA5& Il~~E ,$CAN>dFuX>9SiO>b~={}A۶6۵g! ,,n#7ol+P~oD]4 $~KF|s8n=x4teYw".;C/k.zl3u(UqF>;sⴍ غ Eo "{v{t1jЍ~ف/Y.aBߌ.C+xa 0g;׶d}ج&֒&!-i.^8Yf) 0PUI0a!3= 4TiY3<;kxX8Z4_o!eKOo23r]G_a.,?Vv?fs$k;9zRx:Nt,Ab*\˩˴~484V[zsHgKq\3۔ XTC82͜0sN |xEȎNR|ft>f70.d JPS#7qK1JTQ:NС B;K+`OqU;$xP`)mu;̀8Wh0,0 ]#4$p iX=5~AI갫tC犤 `Yk-[0FguMygR%ޠ5fe~<{aPR&4y|UЀ0kֶY_DbxF:7p6m`_xOzt(u5hZfKO\+N\P(((L6 oy`?GOxuZqΝvQ]Rkrڤv;})]4PlY?luT%֛|/[oT9QƲ2]^"P=Y:0>Me_2E}'ARUd\LaOS4^^/w|^ 3ESXAXٞӄC4"*QlndCqy0ʮOnkXlW:ewZw]X#_]h*0Gȑ| h,[i׮|Lq)N-" U_+Y2QkumF+YYdj8'q1 dtH&F)Mz%~7KUVQY| J'Cx aE$tPBQ@ițBx1T^7>Ŧo}ȍAuSeByPe|,eH|޳F)l9uD_?mV7V.ɂ)hqKERr4??IKl%ؐNPb6T=.Ƴ>WA䗫W+z5 7~v [|ɕ1Whؠf= }?#zr lArFRc+*\\出),x֛ *[,^N[G3f5{t"@T9:4Ʀu}NVE !f_*>7 J"u e36:U\S"j!5;; 8Y`Aux' ϊc](\, L;+gX"tg(AwDHKXeV6=7 Ô+Č2R/tjjrZ ̖ t)T7İ[`(hXW X!ܶCu `*a+$ÿQQVEdfc.rjrp/ M-ױrz-y| ʙMgގP,@PN@~lJCc(S.¨e(ErI$eXkTjxZ1j!Y\>Q\yeOwhYqؤ߅(wLQ_sMd#RQ(UYIC#,{YNɕ<|3P~M:)Tn!ũW! 5$”15X:5Kl߰ Y~ҬKAݔÍvqxĞ^*tN*([X+\W^ dBiK[^ku:ǞwEeBq wK>~źp[o䳍^R}gsMd1) Gaol7\:<KR <BȜGtgƓ]Rx6?N輡"(}PAE` dRR]x}}߶{ncfö<5o}{XW8ܾ9t`7M{ם͞7Re#ҙ+wnmEls9zƤ rk0 VCC m # ;L~+VoFL=F.Q* SH8d٦frJ.2JV/(1=E•B,D/=U>+D\LC,^?ϷښVr /? Is[w)7ܦgNuQo! &o t䣄 NV"4 #0I^MF ?ɗ12$ 7Ǖ7UK`S jdo 8 J3С76a0s -Ԗ0  VKTEuo su7OKl \`K45 \~g:ʑnjV6;';iE u3q_3RW@Ww$/,,A86>3uuu3ӔEC7ߚmz1BuުX6I9g>Ў'8-NhńHeӬ77QA|hz狑'Nc^4I @b(X7[E!ǵo#W);Ijl֛ċ=֥?n2虔xjT"MTz%%$!aX~{ѦQCbO]-hrqԑZ\U顷Xl̯c/ySzϮO&6 *s=lmūur%Z=@1дӖ&.c=ٳ'ȠW!8qs@"xX(^Xjg,ʜ!P-tɒ4-=XxJ 0 3MH u +x-bз\n= j TAeZ_ :|ķhxիBFn" <pRe&^ֹsΝ;uMңEf`t$Ҵnڽnx*wE9s#GlTu7SZH>HBq_=ҫXrBijY-ί 8@b)a< Ap2`i cbtR ک:9 6.O:eyBaLc_:*KGePI!ٓ;^ lX~)gbV"ZPf}%On[?s2?]RZ2xY%dNJ/繧ꦆ9?M; nMw =[/sZkmי u(y{Ltϸnd\1gl\+嬎Bҡ)Q|.M+[Go;ȭS':8!O2@-RZ^ΖLkO:_Vޢʄ4Xܒ>7.˚93??Uy*&mH#BXb68zz|Y`ih*!!bQX8d1J"ɡEŮ cee-'m62ف2wg\c»:B[).(Z֪xW)JVg:8aP MmyYbiieUW]<9nn*^x1uJ㳳 1V 49}4{ZWגU8vԩi=fkZv:/TAz\oZקk׮ڸJMvRSp<===N8Ɇ}75Vkr&:KL{zZWɴ<w@oѩ$p2PYj ؟^dЕC|,Z)Z[,Wu͢~Ll2:oSf)t\D\.o(J:][*VxxZ`վLƆA?.Tu.(c^G_F(/u2Ȋu.k, ERCp{ـibxAȵ]4(/8m cNU:/'^'(ypv[8TFu(r"9߲4yzEbGE(c 5kb(AA#`}<:5,ɜ:IENDB`web2py-2.12.3.orig/applications/examples/static/images/twitter.png0000664000000000000000000000214012564727256023733 0ustar rootrootPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڼW[hUee k/K# *D4_]|PAW>(Tl >UTE'ܤm&mf9gwͦ3Msٟf￝?52@2ڝJe~^SS?|ܷ%y%rO]a\,,Iw=#Hzr/@Dנo>i$")k5 L$FӘ)FʌQeW(Lm:#td 041SWQH!ãa*lfsboNF"pu|:6!|wnF2j3 ~fպx$mh+wdnBLE}5 os%왉MTp/!`X,C= X oVm%@eX7inp.[[ĽêB+Z]G +DOƠ׳}1 s6tB'`ƫy@W ~)9z3T=!rcWwbn;6Y*75߽ҩQ/')U5 .[` ~zIENDB`web2py-2.12.3.orig/applications/examples/static/images/Stickers4.png0000664000000000000000000000643612564727256024120 0ustar rootrootPNG  IHDRY`YsBIT|d pHYs  ~tEXtSoftwareAdobe Fireworks CS3FtEXtCreation Time11.10.10M) vIDATh{PTW?SX4cRqIgM[5d&Lt\kLM4X% b44@dw'3[;9$''?e4]|Fh4( nFUUtx<Z-B4MpTU@ex^ZێFA^v$IB)@e^/:UUQ!HPSSs`֭K[;aaanr!2f?СCq sѲ,*>sC G@@zEQp\~@$It*l^/NłC$ |x<wiB0w'&%%- |x,ܾ}EC]]/"ټ;z:u*MMMTUU[Xv-Ք`ͼXV ^;w$77(z=6˗sN>\.K,a׮]<6 I#F0L4ih@{{;NxƍGEE+V 77N<Ɏ;0L԰o>t:۷ofƍ7 "55"&..@yy9vK`` 7n$..F}]:Yr%Lhh(aaaCqq1#//M6܍*d!:pwؙL&"""ؿ?sȑ#w@Q~mv1cn"##tt:i,YՊ:tcǎtDѠj1 8qYfOVVg6y|$h.\ωa̘1NHHӧO޽{ٳFmFll,!!!=ŋt:Y|9455p8hiinF~~>#>>w@ss31vX)//󤥥a$IBel2L&:Tbcchnn͛XVl6ݻUEQ#l6X~z^h4Ter)"vޭݒcЋX,„b>aQ__Wc7nv{2~%I"wt>'*+{rqY2 69z?6717vOAH>EE<;$ In2SX*zU?R ~!FC=ʚ5k&Xl~ !k(eEwm6~T/7fa˞ӯCfr #pֶ6{͕\ml$'3shtM_UUN&l&<$G_|=l2vn#{qA֭[GRR\v B&MKP{$1%1NKYi#Δfw8Ŝr +~JwPd"#)ߖ|LZ328^Q^#5! Fiy?k\cfZ:! 9!"zsd&2i^F8NdKx<|M--}]yXQݻ9um= .."{>Z z@g++Cѐ4a"V~[sռBK>0'3%DeUL3QQȲLZ|ej2lDe%[<>7jc<]'eݸgOOW!90 #NT@09>waV\ɥKrddd0k,HKKKd4¨7H _~[_5?{۬Z?~INOLbLcFuT_OӋG3SRz/ɪJ ʬ\ͦ"&K*́m|/{ BPx_>VmDjD4E]600HIIATpC2t=*:.xg/`++ho`i)$FGCr`@3&ŵkT?*L!xs6>!-1q3>;̉rƎEDG#'`4 2s+/`UI˶A.+H) ngwIk.t>vn޾VaTLLgWo4x FhpЭ&Zں>g ȒDHp0!z/lFXD#˸rD{ {=(,,gZ]O/CUUaZ]W+k֬ٝP} ^Wٿm۶uZhIENDB`web2py-2.12.3.orig/applications/examples/static/images/Stickers1.png0000664000000000000000000001004312564727256024102 0ustar rootrootPNG  IHDRY`YsBIT|d pHYs  ~tEXtSoftwareAdobe Fireworks CS3FtEXtCreation Time11.10.10M){IDATh͙kp\gyEjwYו%ے%;عع`LCO-CiKN)' | $\I 6M@'VbزdYqlKV+=o?ZlRxF+i{ԣ~J$B(*&B)#—>AАJVϔZwe=)%b3)J[@J%5PLT~f=Ⓩ|?o;۞KmiH)-hkBR"=@4t]z0'N fs9ϝC49E\!`q ~ 6dM.J*m6ӜjĮ7u u @IIq6H\h$C/f&R^J+TC7ukbyFϞE)noG)ũ1vݸoNS*E8—>5(''}4kpe àYd,'GOAtY1cnNt$aYV~ɚ'eYSX* 'J)Eh4"#cg+$ڂR _ cW~4! dghki!˫B \ʠ:u5TBR$5DQ L>,y lߵ޵ܯ!"1zfD9zin!`goi"Ҝj`mk;gNڽ! !t!u+!@sx#0pS.ٶ[mE4yy;/9YIl]C__/O<$|X}=N xFΜ>Mg: a褒IJx{v8W0@ рgaV-x9na;w̭okn.t=iDkjD"(-bt&TE"QAr<xcN`nƜrfnr?W⾽{293MNfvB޾^9}D%kjl@)O{݁LP +~Luinʋ^&?g]op /Kr93 {񳴴єj@ٽC$I/W" ViH]]nvi\-ͩ}1%t|'Saq*B`6G_}G)n۽J\a7Jk&p\ߗlٶs'<.:H(D!E%R D׾VU&F~sޏ'>WغȞ{?+~5MX,22˺u1,'N`& "3<6oB~JRoG>v֒dx>CX U0x::ɨQ?ygOwOϪ*PRޏϾ|I4oz+DccfR'Djj0*ɱQzֲ_c.k:y =kټy.^$GXX(Iq?KgG;a3􆇇} tULVTdJ @f˱sګb2@aq ǭ;o%b\b=i[ZD(u]e ,wyCutT0ĕ 0u />T6K},F(V`r|bcc7&2H׳gh |<8l6QV_c*3Mw܁ ؈bٹmkP(^x $H'r=ҭkKQl_Ϡs*\ qرKO8G)FxeAj_[ORwUZUiqfd(![Bհ 0>: z֯p]FNPU/LI?cxr,IENDB`web2py-2.12.3.orig/applications/examples/static/images/logo_db.png0000664000000000000000000071747512564727256023666 0ustar rootrootPNG  IHDRpsBIT|d pHYs  ~tEXtSoftwareAdobe Fireworks CS3FtEXtCreation Time11.10.10M)prVWx[o_|I,Yn 2=VH6L Z9ئmA'F\A&w-\Em˗(IdD6/9E$^{(P޻yK prΛ|]?SԆmTjSnp98sssT\5-vTt TLg\Gx!vZaSɓSɩS3O y$/dvrL&7IrJM5;{kz&\cZ6Q;9aX7ҙ3gΤ'lv4SWaBўMg('q\xר:RX2@ ^0==A1JiLL=h&sb17 4 yX3;yɳ^~qd09ʾXϔz#D^= eV,3bXvlY;g39*RF1moMf-c66t[G'$Nℐ>I H|I>|C ~/Dt=+[DQCQ#B  !5tiA4PX`QW  zc㨢K0=1F}mOs\ 4|&;ڱ j1 vG'pzW5(lPt[9pW#jD1pD[˸ڃA1z- =!^/)?}6 ;  ?}1_w@[)=(揳ݏУ,1˔(*"ɗQuh}W,сqԋ%U/A$ DH "A$ DH "A$ DH "A$ DH "A$K;j,,d<{.UK:(0@0;wnSu뻮qUz=g{mLO`V7&8 ƵA׳&w`8o=g6"E4nGneZ`Zݡg\6d򎧇v. W!W4s{4hX?-=Xtd6*fp]>VVw:_\ 2_ .pgo.WƽIAo{ջM<!~ٛNEo=OX}ZťZY͠cg6zӷՐk[z^~[jG\,h e}tty Mߟ~t&Pk'cTC?YC?2ojhc,ʭՐR׶WC|S{Sa~txgOٙ m"ET'[rb*kSf^uSN0w~}S蝚Q?~ܨLFa_d}fmYM2Mu)Mnu)tkmԪLfWD(M2캩lWj(HVAbܩ(:ldib@ДFu Z0Pw}DuvvNzwNG_nNXD:62:3<;?VuWAE -οMF$e2F!tmvVL1U$|A_\{lj50 "=֕;4eTt7ĭ(ݖbW](IIF| z%+3,؇#im#E[N'&uYM1b!ԑce}Ĩ5A053YN<ʯM]:D ӵj5N*vbb'Na?4>ŤOqWum]t7~9(EquMD9ާAXeM[-j8) }` z /Yv?EMd%rzjr~}'"&'9VgW˛PgЭpزbO,lA0NqJ[yҞvSwB9)t[UE*rdiVjB )Kf43756MhtDu{!)-1pLo5-٪0gh\0xZsۙ&vqIܴ٩M]EwǔmΈG =Λq>.&M4oӠQPl+$=^C^TEMPV*ԭvJj.[a0sgW]i$pE ڨLݻd5*=ibhҜe?Hk3s>y}7itO(iX5ko}D5밭=s:m:rٵuTf8,s0ϙGJ\F 5Pn6bWG1_-EVO'J֥s֥PR6Ї64n]S6\Yu24[˺ĺ f3E׬yU`G3pOsJ.h4Iq "rӒ ~h}6zLsYc#2I607)0[)զwsgC"E:?\)}|ci·7='3Zٴ7.g40YJ`5'RObmj/8Wx6RI)[2ɮyh? |'4r˱zۚ+n,[YG!rCxDb^]A&?mZQ|uVkp5LiI{ZbkУJ;P qbRs?3G&l]3^ _ׄ__!0-f{8Kv+4 ;bSj[Œt9"R239d&Vm4gʈ/NN\ԟ40nrBVD:xs?pG=[uljUȉņc2}9m'(6="I=٭Im6B>C{&a>bumU≫ 7 8g/N|?93zˉ}J[v =}E#vwNWss?6p[5M~~ۦ>v6f&[ʛ|ǡڎyztd{tmzn4@\k~߳ v9e{N{nh{5^_Xl?Yc ]w6]V#Y.4ٚwvW]zInߟ}*moڥNX#Ӡ+ߟ}2̾魏\ogV''i;Y}Yr|O SDaſOO}?mOwBpGc.8 _٭ϦϦ>ū}ٚw뭙پv ϖ\ 찾ن}ܼѰzww< ۽%H2=5oM5'w1ODWVѱA%lW\b VUY6ȪQUuR!? R5pͻ͍߫rkUAb,ǢWYS3kUo~yͿ-3$%9I Zɹ-u =O#:SNopԴQ35:35{uw)to#s%WdpaG)39)Rb\bNbFI&iuU[(6:XzJ8B8ȹ-|On^C:W}^߹=磵ȳd}Z~am-#,5 'F:=cwsgu^趙ܯ!VAT"2ni<5ȩWOh'3tO }ߦJ#K+-WyCW/kyv䗼b :qZ8Ѿ饍Y9e9oq=Nbk?[Zw^3d_a#P׍x=FYetwКVz!oI\=F=?KDgEQ K_;rw1Kؘg?ٛG|`y/Kޥ_;;:sȋ|mgZؽ V;a2zW-bȶwĸ(w羇֒yky ^5ȗk-6>N8347{aƉ7v~M#%~#3.uWjHf0Į`ۣcأ܆wV}cG6k{_"c-r^|\y{t"Qc{###B5=BZz{bʻ5~ʻ=f1:0{ioٿʻ=: 輯ۣnB+G.kcʻ=F1zǯn:+Gmrʻ=B #A_OWzK>Qd o|d7nG7R ρtS]ނ{=5Z/!OCȋpѿ FĻw3FHJ6ֆ}7s~}ཱྀvb{! vEٲY 39[ y֞WGqM^W v?lHfY"q nf5oj1mҴ)|ojV|R *7j81wɪȞxau#y/Cd0w)Z&y|[A1iR22GÂ&f;M4=ǸoXVcI$Ye+wCzjg lV?g{.e:Zݯ^ro󝳛Yƈ3)[Wv|~7/:lmvd/~믴7_% i >}h!uOZ5j4z8ӮqϾu-l־Zj"} M:{ok3ee~f됇= ;wow||KvUf3?C= gnv=^͂wi];Y?.Z<8B|~zH/n򢰿҇ŊLG^~r?(yRo˺?9} ߚ~;~ǀ.^pz,Dq&t³&#u5Q疹rv#ޮu[;6>ESliNmxi>R٦Z/0:cO<皔 =Az';Cƞv=qĈ[.2{19A#gđ[3uNTND6)>h"{~[dhIGR9˧P/iWqFuccr#ί/jR~ekh\{c;}@ %,a}<^3 Q!2Q,6F۝`eX/[j.vk~oC]?sgȯxqBmwfQPMQ?}Kg\߾ a֠ͬoj96>*;o}goȳsW٥|ۇ{\ *]rKld'c1[c87a-Sc-̮}WKk__ c8xTh#>.a5+o{ m_ߊPm^NQXx[_w[_׷/xs/TMa?2-[ gB_S!n!l8KQ Ѭ[fl9W96au'wӿHkg)p3]7㈏Gu? nz]wج xm_|aJJWI4ĭ]U/YZ&]5+vQ? '3zHGu{,cw_Iy+aO1B}5ݓz^ֲxF3ateU7rFN4|-na熳ް` {^ rYBWP?]j/O|v^WFg٧}_ު%\/3݌=˜9Wg|[&ffW*ِYk-Τ]8r>M<_4=>Y>"p ~v2[\7ťX {h7i8~^=REn7_-ke99kZ??{sywxʍ>;;9J>}bX!gOnN vj7C# !f#HS_zqYvh>3:#eHnj=_I_3j܃)v:|F#9riLJC'_ 鐿=<LB[8b";ok1|p&mg'!xX?zɢ 't<̧X@x䐶Org_ũ Nx䈯8{7cV٣SCOb%?cv$˸ QUs(GV0Yں&1Ԫ+W|? NݸMH|S|Cs1<~?>k-_<=aZ,V뽿+~^KlփYt??z+[״.Z`eeGS;Ms4*1,ɔҢ I1'jV"b6rssL9b?Wb51hcP*TAѩJSv4UDpsl=4nJ BxHN@+KZ$T(/ @$仱EPYf$P^<0$L I29Qe/E0@ʦ$0xIr"L0LPG.3")DNQ$)BR' sEmR5 a@ҜYN&boх$ҒBWswwEDԭ r A]4"Q.Uz#PT#ЉWzQtR~B e:)'ľJ{+dt,B'~6Q:H K@~$L`ҦȻAN pw:!40A[5<`6S!^KKbTDD%LwJ'a\]$5 ݷIhS.$os @ %%HR^b8Ò]io $8n{'7(-Mg"E\RAMlJABCE4iC-% ECxN4V1 $J+))7ZF) i9/. 1KsYD)/,=$gYĤs'`¤,"9gePI,y<7"dEQeftUJ/ ,W*fސLH\fM+UMM%2ٝE%A~/6Bi{Y3Z."[0Ge |g`-#}Rnn',c[0})JԓV5*;-NuTPR4Dw#\̩cfU!"%"&mɉl}/$l(+JgE(I?΢V5gMh#Ц|EREa/) r2YUEEA$I "h$HJ0 ej+f eA(L@YA0`(F8VZRjU3I~" hj(3?2JVJ `i7S:))BY4tHNs3cZIS%CoX>|yi3qH)RJR$!GĨ"894a lA&|w-0L$_ĘSTXTu3B *S>1Г!XĀ`i<@:AP{NGڀ@q`#"4vBoD Ť}q)ʬC"0 B+29pE%JR+?sIZ$JHnjڒfrLL@N# TƳz2-L∈qDbT s,-(tܰE S))iQM\LI AqIsxi*E@G PANKϓ-εKcKF[A'4QX`a ֛̈CPH(n}/+ʰu<ŧ(%GHވlQRPd+-KU~ \ ^D"KH! GP([Snd$zJ ĝӊʎs[Ie-ee$krJ1;tZ cTbIjJC(V dKK>e4e$2=ȳHKF}"egdHE&]MQF!TzhȜSR$Ηj>[ DZ2!$MdƧWT$bXZ7UYF1|^+ da:!$*,dpXszIU (JZR"9aZFȂ]vq€ d}:@G2< ʗ_S^ad$H^T+:n^(Rb/Dp]mV$!D']v)"PZ48%P|MFZd{!,(U"ӼDA\9hSJRD'K,MML'hf-zgx K/E"&%c8\<=ibF&ЩNDJO T@вK$LKYUd2'hV"]gVhEA*oȬ I+{L(~Yb(G( -JJGX'TXR/vLL.@P  EJqT(5U`T`K)LC F٠"ohXP C$8LL0LT!TU;x/=F j#* (&ZU* hִ2j /K&f8Sj0&E-˦uYh嚈_ (Y tuq|PŞDk3"~0<hRW sD@<:Xf4 YNP\^Ilx5oZH>9W{2l=E9`Re+0ð[y&P-3Zg0+ug|쏙Cϣ`SU'πߩ?~\y66ABkϞsY"9;<{^^ö{S叙Aa7v?l^7o+yow)oBE8{ۮ7{Ǎ}DSfm]r'vNZ5;Ŀx08zs}-Г]Ù?\>]p?+?|{Hq8.tȏ:O!.;^\V/k_`l _>E22V,g$!58ԟn:OM+rŨ/"P禧+tنg[<]>k{t~|x; qw6G5ǿ-Gj?o'B;zgXGoчNGzW~t&Pk'𨮟҆o9rjHY )!}m{uHTt2Om Omt!~m3C۬HQ9UJڔWݔS!'{~(1^/4J7tōZD]alð-2I|y榳.ɭ.%muy@S:3]6|G릲]WS 1l˿':ldib@ДFu Z0PwhhfZ;Zz=v;#zV픑Ec/So]?óà ;0=KVE_N7)޴5r:Sw>(qYE^gu49W<{N)97l4ky0Z7m>#N9oߙc&t2)w @lfu;:ۅ "=nt&c<":;1 Aɾtجqc@΍c)tԖ۴ՖC }ϣL>fp =ʨDX-VVLjZVjњXcAETN<)RS&=j+oW;q"+o1LHue))M8 KWbW](IIF| z%+3,؇#im#E[N'&uYM?rUO9VGZlTJ S3Uj:ɣ刬ND0]Vjb'*v;1qNCc]O0 \L:p5]>Iw#NRtA]J}u[[ִbىnPkΩP1ʫ.Ojb 1uoSDDV!ʭWV)+NC9dW 񷓛r(pT6qpq\9lE6 5 4h1odATfjT^{KjΓ}mjvMj?43'|"Narjuv u|(vC~d[8aZ9>b:))ߪo!I{vM]?\}=Ó4}j}:YE" QwԳ^mPh]9~Ɍf&msB[& quM1ni0eziVM9D*Ӛά7MNm 5猤-+=msF<׍ԸMP>wqdQ%v 76nymT^d[\!r"$ױPsѦCQ(Ch V;l%5vwV㭰 3CJѫ4opvds"mT&]vUWc4J4iN`9~Mμ>xIn:u'Ecm]o׬öbTtbe*WQi)ϑ,?ge+qM78bB<]|UX[͓~?q߃*[YBJ@pswizNupIg(n.*d9b^TL=-)Qv(o+&i*Ғ6MK.RO0f:nKD&FPܨ> ;Wƥs,`U޾(TS燫9ςW}l;>CyQ+%{Vf& V LWjU {6av<5W4| Rm W*)eV95oQ`YNs9Sc[s uz;k(D?r(Hl٫+M9ʃ4o3j-) ~\?8s3[[,v zTPz;8!NBLʖt.?r$ݢx0 z>ceկxr=إT] M)NbV TtulK\ۙF2{6Uf3e'Go.OOs 9!wQ+"sw<9*bÉ1[ 쾇v6zg@[Ԥgk֤6 E=01u6*`|'Z=>b%-j垿B};'[Sqݟ~8R}n&m}mo~gK8Q1:[l=M #ym{an=lϩ}2mf+'7ML! >\eZY YԀg-Skdߖ|Oe#h˞Y̸۪B~ ɥxe?EjkMU*-"S3 {$v23OǓNo ׺cl5?%V2ib\i5*בxFkWO-7*urt"{|rRɏ|{ED~9~d{5P2WKK&,1_ڤ׽EtG}Ks蕕AS.x,<ÿM-_$ޢ{hTC~+8uWX>Uƽjy.EOFw~OjG>+Y":.j+EO_)M(&_I*{Ho0>` ߻$P[kgo2-tw^+KE ٖZr-V{5![뵖_|b33qy]d]".M_v{v{#; U{cccEc+! z׏G-rhGcn{n{#; B!?= =f11;ca}ckFKUVމ=:輯ۣ::/mWyGww{#t5V1]}MQyGww{tޣ69_OWz]z_yww{c6SyGww{#p?Û ,B/M㨛E)M!\ ZoG8;Ug]?>Fr.*†lp')Flӽlk{~Fy_(suf5b#/>vV;17obs82>nLTDc{DK<B״=.Xs=Bz\"GK_P۬eG<z}[{zr=Θu*f ފ(;E64gNGMq4z טs ,}kd#6w|Gc+~mH}777z{73$F߆|KaWWsľӀv Bs8@h81 L1Fb=7a}<7mo7αY{.VWv|~7/:lmguWZw}]~?]sKqulk-ZH]VMt m^'52ٗ.㲅Q66_V]t⺼V(ːCp%Pw|  fHI}Sq&z{;M4GoX:Y7I$Ye+wk GS |kQUiIF][Mֵ.マY!j?f2_dK&mw AY@Ρ@61 {?=W4~e7oyQ_bE&eRK{r?~J}{gpC|5> ֞s"κ*˙rd7g|džh6mY6vsΟ86閸gKn'.n黠;|L!3Qsg%Y}Vb{@2Z8 x{.zL^Q_bT#F g\½)s9VŽ9>hj:7co&r@+N~bHW34`O\~:]n}p~f> GiK2bLE+l2&[;2f*Fc=e|j]'\u$[Il+0ozmxs?I.^euHxxkt+~qMոXusn{Cao ^?sypxzq9Ϧb/NN 76ֻ1ba5a~[=4bĵVT)98z:\fxq)gfqpR,?FϣCp||Ɂ 'e빕~>ylͣcZ-KMNbJޜn$m'Ks,WHci<[Ķ 5uu28C3:#eHnj=_I_3jv>5^?jhl}mሽ3OG^]rB{v)ۋ>??^scG/xsx&?KyosGXelow'(Lʢ$ 6Dzs..7svElOxb'=`t~%mSa'8xك'(x1ףc;{tj7tb!!p5 kp3= P;tozWe U:}gY"|'>>AvY91;vgjA^f7M-n3Ղ%E!RLQOdJrᑦbR牚8l(R*r8\kbtyVyM( 28:>= J;Q6;lm:msƀy"y9U=j~'! u{d?SU!R.ΎiOntž='9'$5!hѐY쌰Cr[yJ\HۖFPœUeZ.FH0Wυ#+/tU)k,|hTRy_.&`|\}KSBEi2]f_0RKCkgvE2CmHJG26n:q(qɶwS(PЇqm%DZsm.JU+4 nVRwjcM͕mٯD%멦or64U%Viye-Ti2*-|yzOm2}UHZd_Ui9 SSHiRqgsT LZ%cH`n]Ka2;o* ێ*gaN!lJWh4LK0t)2iU ׷BG5+GOXB;.ύ0RCđHl[+e5;iWW H1C XQ} Um}tQ_CGnt՗ D8Q $foZ r*ߡ :Rd1KQoR`¦C)HӂmAS1 ø0H1PTPFEhIED,Xk15QK>9NY\˾ʗs c[(Ȩ}S`ĺV̵ V=Nuu䀎,"`baqT4Kz ܯQ bFUk̵,x=o.``2JK3$]Etl]`_kGϘ1.)',xE`w$!iF:lJ & 䊠J'ըLT$ĸS"TaRK5IRnJS:Ip*;H*#I9]+rE*hDT 8$,-$}Pt+')Ҕ"AѨ*)nO%@ҢS# 4$' KdPi$ (n$`*TVvY$ ԸϽ$" < +@jC@NpK"%t4)) 02^䤤S$ {ˌH*| }4S8IиIÜf:EAMB4i"&xt!%EU>]f:u»\APGHԀK^r8<"t":^|`&$E脠PBz /, A'4 j)@:*h/MT"tERh&_bo&,B')D=".F,20C z:]N"+M0LV X@DT+`x;:Q| S(݁IWIMxh`omi&: \=;yII*TN$b@hW&8 ɍJ jbřBxAp5uPwRPPMlڐEKImaSA%(qFwC-!Rb-s#A Q &;lC q+pqQi e K(Y&-k12?&/I=ؾ0iG(fS w;'*pӺDDA`d %Lxv'(kDFyl 0kKdmM&EPĞe!}֌Q{BYyl 􈦫`[I  0juRgUͣNDD])4$$0s䘙GAcȫ ]1 bd)EV"T[O3_) tc\s)R 'I1HNMB%$bP! ] !S ,1kcT#ULPTOA0d;1 B(Po@\J2ТL4 L\c \Ҭ2"Z'+ULf/8"b{>K p,*7l”i@c A}ZTeBPh6jïdAQepc s5ER)$@<ǡLic$Ɉ _HdʚH[-(ʆ%0k%+hU,ۅ<ʥTBLt+@NE(de&$B5qAa`IM#AV(r؂&3@JA2lt=&#fiJcIQ)A2!7"d([LJjRi+# ߁.ׂ4RFHBT-T5! !)q财ܬ@0VRYK#A#(Z:(R@efUX)9# dU!O~M p+,:}El_bHOQQRuhi)p]t," )md0ƻ!CtDFD+eX*ujE T-*2w)*.Wp/AHŵ8V B(#sdg_MgT\A2-%Kc ;I* @/̡,qIFI㠨|؉HD"NV$UByhvdE\(U(ڤ!1(uKx _r׹J'!(*2G" (9XMQH jeYax<]b GZU!S6CG~UhaHun15KkA4L"rrְF_Bc]|I_& z(2-'"Wa :2Y:9ǧkNC?P[):"rBAYEk ܌*/LAǧ9*53}4Rw }UP-.ڲ(B,O3"'a~:Z\Ak0 @Jxb2%0IVe.e*M]qviY`|-*M s(Jz.Ğ JvVYE̢*xWҘtSTFKHIPiY- .'L97_JLU8;GX`%yI+y~*_ύ^H7qeLNN_U:ґ0!nБ (x80-2\- 9t\{Ӥ_Gꠔ @H $I꼖2Rd[k%5D%-LY@,CQ X9JH GJ&l "Yoe$DevȩH@$1ې,Ba*0sN<7rH 1*K&=H4Dͩ$uz`+lJҶXF0BKU2LNH%AuδV E@YhYtDYn2Z6gT(r4VtqWMgRIWSQ!!3,2'Ɣ4%2ѡ֧bI*'5I/.b?. dՁDQ !׆ Y.bI 6 Y5֜$. Blss!?g*Hez0u `]r0`£8$Y*|s& הCYFq y.7*ckʨWʲԡ 7A}Ie*$!EI]. N h$2A+|tѴr1 d( J4*c6QWZT*clb2Q.7Kn Yu ^=f -)ÒfeQIIi=Wed:OO@Q t*&&+,R* ӒbVA( Z}HZQP*k4?2+Bm%)*-)f v@B˽"j! >K TBD.D11am ki31;a+%Pnbs6۠*Z!젧8{ N>i; 8U@U AOQqڈ7:ssZ$y5-(BZ,$ 1Δ$*)g-#zA˲i|Ťs&}JV<%:2]gD80T%ZLu_p/0.z, 86Q(yUY",᠖zh`3#A )"[h-ƩXU,]WPŹX“ r"tWJfTpswYVqSELX@ҙ L0$bZpҳ{LQ7?Ѵ]Ӳ2bF/W~W}E (+",K۵HgFme|C4=σQZR\YFQ $G&22ZmQ`uh(TVh٠N;Ju▼,£@@6:]9;Z'\REzRZzLR}r $*(t( hSϩ*ͅsCa!TAR4e.O2D -[`OQuT ' 0VITˌV5th誢,# !2MӨQ\l.o -hP,H::<~@`NG>I CKJ׫(Ng"Iuj書u^8&UVA0gL,'`T~YRt5(b@WwJzS/))zbDZ%s=쭟柿|KH<:zp(UxtUä?zi5chs,I3wW(|MFAóteHO/Ϟ,)FmafTcfE9v|vnu;y޽W>=J<},TFr6Ɯmyq[ԆY}\yI{-jvX|ʓ{^XpoD}i+[<|@IAcik8/sڕe==c[Y: ֕]Pt hnizۦ}R{BPV^(_ %BA {%OYTNءmkBSx]N0QʫajohlU&fnÃsfd,>Op3]E1T яjV2ڃ-p uyGpodl`d/e>v 9]Aݩ6ٞGÃT{1H QlH':iуŏpa'D:__CEUmkBT~WxֱmA@Q\UP'PMDMFDpLBI{Քf[:|Cx OL)zu_uj߄-&|gڥavkwG"l{_^}we^wi'}׿z^h^8 =~???vnnnn?wp}jVmkBT~xѱ QA˱M3;y0vܟt/oOoOoOoOoOoOoOoOoOoOoOoOoG_oE찷t|*æ4mkBT~x 0t@@ 9{^oۭnv[/zKm^oۭnv[/zKm^oۭnv[/zKm^oۭn_>-UU ?mkBTxñ 0\ ]gmQ }2:zm>w!0%|mkBTx 0ߵ-@RgGUUUUUUUUUUUUUDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU =jfmkBT8x 0ߵc`IUUUUUUUUUUUUUuWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUՎaiSiymkBT8x횉m0]HI!)$FR?6c>>~sm+vuՑνYu8uN?WP>1JsWiV_uKEϸ/rˆ_gKW]ױEYcl,[TYHT}xL#}A GV7^}>iҞ-i;}LJX&TP3T#ߨgJl e'=?͘ona|7>?ǐU%;/mN/IfQփz{G}?v✽3X~j{zTAO^ʰ>?sy|G)P^{6s}^w:#n?YG''6s<4DB L2v}c[2=b{8vMqo/z719=oz7Q?ݾ5Q󯃂qob[9Ϻo3{g>ql}ޏtoyt=WpogU_Ž{/ sk7q2m["cb;{u a%a'Bܛ,,_foS35?>^"y]/5_gaBݛv/{c{̿?o( 59HoܛdwH^^ae517dw;O=p&j6c{7YC7q)On7j6޵(1Bk ̥=/5?5ާ88B]R?<#Jܛ3Q5H#KfC'ec;dzm=t=n?xd'{U4wk?Sv?q4?;Xc[W=zWgrQzn_ ϸEFGfS=t;P{-'݃ǜG}s#e-<|NE\k'kVs?:϶9r>;yl_=t$l嘫?AY~'Ltw=j6C'd}ԩwnh!q5wR! C'D 5TXwѵlb4y/!릺_K^{߹t"xi}3"?ѥWywKx %Y=tv_:Ԯ ]5XX=H++2wѵl~Ʊ* A7RGE{{u=H̿덮eU܃K3vCU XIW&r{=eIJJ~2=^=ܿmL,Q987K}ucg>w1Q{<߰5^]Sn.k=̿MX.l=?Rv/Ih/~-K$7@>7DzLfWSv^E˼_96p_P7͗p6BM[^wOaϦvUS^j3E6wgpQ~gP(@F?=%!o"}5XZ!I?=7Y/=rҙ׽W{?'Q4q 5sHTQ".Mwg;<6j6EwMI-y]~%lzg8Ƚ;,WqNIW35E=ꁦ=~_.=lbot-P%R?.Щu7'|NBCSn=tTPS\mkBTmFx=kAစVZ XlDƯ (XXZ h/X6b _($_;a0 <űݙۀ90~K̅ Ͱa<Se=/6tjO MxurbOIHbO|{]\]v[Lվ.矅a?t׿f^8\a! {ooÍp lQw}ap+F\f:} /հ?{z^ӥw޿͇t=li%~ -f;; g[Z3pZ8D CA^NnFׅ+1煣B&l$AX)X+( ib5yg,a1V~U@_L ·25NbTx-Jx^~n=g}^\3O'%&zO砞qD}učAs/yXr%n4{,UD׹0ќuč.k?dp2o7}g~RqÙ_T/t*(5N%_TӰ#Pɿz?|ǧrqᵏBO3?oP() /ƿRk (=?MKп0k׹$[J ÿA}' H ÿk6ӿ}_qV'W迶iנ[~N#cGEFV}MJk7K{JϿD1axƄg UjD1?L}2<򯽿z['LQ Ok _. YE??YD{a ^h?Dh5{!X莏?$-Xh?LhV?$o[ls~]WmkBTx1 7HHxc/|mkBTxx흍) q ĉ8D^>׻gI@XjjgiЃ`0 `0 ?ϟ|:seQ3|ӧO|:2|.};7eGFO6_Qv]T]^ˮg{>pjzkuo{yye?{-x/ D:3D&򈼹e^Hyi#/OGzϪ߯_~ :sMe#M3Y#=2 QЙ[\s=E8}E>GȩT ڲTg-}VfoSVwzV}./>~!?U1<#}=F[ ~QڋBN..+푹^edLo+[\-k dW(}6q$#?z6Bөi?L7!3O_Q}Пuo[=tkȋM!'}/Ƈdr2_Cﲨ: `0 :8o=+8-4}۞cĥXdq{bUq©ήm!ƶg*ΪU\z[GA=^+ru{LV U?)V>ғ)x|Yҁgi\yi^cUo*= !TY?rfgWsʽVn*VX#=Fϫ+[F~yH\L~[O҇h5ݵTow|Sfӟ+);F;:x )/OS yUo2e)Ve3'wgGg=J^`0  ľu kU,Ksؑ5nY,bXw{ w&3QהNQev ]ƷgcH˞i{A3I8hwduwUIWq8I>+@pQşGcZ\ƪUߝ]/:3d;ɫ:gB9R|GW~w2;fzt|+i5nΟgZY|<1NyŬ|E7k?z/k><=Α}N΅>uWydʬdz `0 *\?W8GY:Dgcg< 2+'W6qn؟{ru"wU쏘~c#T?+y{Q,,^qF/Xv8.֩g3}ȸOP ~n%hUG4(_sn|W}Tg&x^c,Fѭ+ <#+}/Uw8BRh_|33!mr\7U9m({ѝpvew[xG]߱?g;,nҽow8]וb?OV=Z_#ve?vN_WrYLo;1g9pV^G~>[_vNOS3 `0Q[ veO\k^8֔v<Zbz\Opbn$~}oz3ј mK vU]^iNWA#x딫jt q :E= z%օq)CcYEqyRG-+u (K\hP'*^ء^q=m=y|Kvūe\rȊ4={W1;=ݷxp;o@>ȘT\Ԏ+C=*ɫ|GJOCW]x1.ﵠ9_Eб Vq)v(ʑ}[GwǺ{-oSdו_˞׃2;iT&w*w:g׭SOsj%Z[~_˯d֮+w]7 `0]kIu+eL]ւoA^;=GR?v쯱;<y o$N1紈=:ߥPVu< <&3KyC/4r)i=*/|Ύ^]QNН1qGw>ù{ ?Kv:A}E:_n+{u=rq͓̳]>>d}+|L01`0 leg:׺񶊝`W,3O?]\9P~[kOWiGc~)-<w.3q}'vuw$Vnv(r52S;Wk_Kϔ8B/hEՠ'9w?K;x:x<|@cϽVyc@ۖSw8Bq]=2lBe6V}eR( VeZT4ade2ޒ+nYBTqSߔ<[&=f[|szP)G}{Zׅ3n7jpWwftEw[ǽ;`l? `0 `0 `{~i`oLy>uoi\qK|}7Svu9G쯿c¾#>,jow{ՆݲL=mW2u_8دjo?kD߱mw>#}E:OۡO;y`$j?tUmkBTxAjAEA_x0`""Ydal_=tAVk=&[>G;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎW[>GktYoǿvoǿvoǿvoǿvoǿvoǿvoǿvoǿvoǿvv{ſvoǿvoǿvoǿvoǿvoǿvoǿvoǿvoǿvoǿݻLm^odwmig|2_ o7o/I?SPu8x GmWnIO:yR~,TH M`Df yƊ|~E9df^8y1,VC@qY9\d X~FYXBx?;#aOç.sYA_A;<~XkB=yh9~=}ysﶓruϕ&1!Yw{I>Uﶒj5Geqw;I9u?[؃rI}$MFϖxnI1/>7nI 憓YCnIOK/(@[G5@;X/&@;B!B!3pbލ#bIߡ| <6E3vVzO Ʌ1Xj޾x yqXX?4a eYKl+^j)ix;uѕbgw+)w\S5^ȃ7ž  8:Xg{Ul3?pFtFG)VYӄw(DWUSAxǩɺC^yM;FMb4]gi䠛X'M.z]b㒋Xx%'m x$'|0\;&9 a@}#1Mbν}>=~%8;id_o鿏^YNAo鿏Ζ8@X*x?BUqUE?k=-SgYk=ZH} qU 9 ߄N;w?yB=`c^bgD9/;iy޾&1}?p&~uwLrjQ?]"~D|Tb{ZaęzHl?kV5?XO sw$9/?6y5:G {_z4}ºGR>k=N5~H5_.и='V۩nZZ|){[|iKL:w{;k\~osW+ǰT/]{vNl w#57 {^kka]~c_Fkve2`ZQ?]Egc^;-$ؗ=$8{nϻM$ؗ#ywH:(KwH:OVn{'YsA~ mkBT~x흍8 FSHI!)$FRHnw HYx3ꇤsaaaaxIǏ'U{o_ھgW9 o'GW {>~Jlo߾)*/N\ϱov[iZ_ձaJΝ/:6O- 92b?Tlk%?_21B sY5>:>c=1Ow y^- ڶ,XzusM#גU]>H_yYv!ۉ_mi Rus]Xm_g)YY)m]y,m z1aaaxEߓGקo/Y\k6xjgH|yu.\aæM&wk#ϐ$?]Mo\Ⱦ,/ڥQ@~6s?)}, l gX #vQg Bٙ^uのuhm?}{].~}v_J;xogJY]޳@.)oqC?}>@Xߘ'-(W? źvƔOʙRv[K?[A}?-wmՑ}g\=c}M ggg DŽ-B^k_g?F? v0||؎=ǧHPgs/hؑI t~{n^}ZyD5XWvO)"c0vY Z|~_%/,p\ɹyΰZ/;/xs_9?Pܯ5ݻ\[y|č8gʱL{? 0 0 _k3>z_\S |<)b|7aaaxn.ta?l^Cvkؽ#~e)3<3^kdlc&jK+o"e<.ʞ`^(3zu l+6v<ï k7]/lc[`On}򚄫 G뎱zt^v2)?;Wmr5ocIz?Ozx{&!ez."ѯ 1Gg{+ҏlw<=}GݽFƨ^)zIpG K֜{{e G12ۭqiumf>.}~a? 0 0 [u+7Svq֭y΅ ?ނ}XwŶv?ߩDZۓ-q/?߳=<~#>Fk"qzrQo 9r,nY[;o:)@-`ק-7({߯S@µK9֠ɸ>:n3 _[_*mtcmC>qSL=<6;ǫsaaa{xˌ\ފpx?0׋#5zяc]x^l򼠕(f:~٣^lin59W~\;?vn6erUbS~v^U O7O(|;+SG4|?f*?rW~2oNٟS9~daևmH6mX[J~s.ym4ٶO|Bd/b5ɿyU? 0 0 0 0 0 0 0.P~*1@G\⟿KrKXs2(ߥ纎J8'>X@▼QQbqwx b)_K|v 1M6kee-2Ǜ59?K^E~9ϱQﱮYF8N?~;:=J<-tĒyNAgC \NXKs)'^Kg\~2}6}Գ)n]Or^j~"{p29w6/.z-v:+M{WJYZ굢`% Ҥl9ힶկ#OUz+U?;sd~vND7*.Y+v:ye;8}~|+ÑޅN9}{Bƞ#txխsXɿkSV/uJ=o G<ջL'L:D]6jfgLz/+ؽ[{rCMYq~[{yy czA;w9zszWHVax3 ףmkBT*xݿq%2(0, F$2 &b)ʍWrȯrk}ޟUQ9Q{ƣz:2n!^R&ut?uͧ2Qj#!7=oqsxl7C}k}DžqM?n€ zXߏH?&uR|7&uk2y=L?h|n7}!u~ 2)do\f_޶{\'e{Μ߸L1{r 2s*7. !u~6CVbo_4!uS["{ '7U;;ssk?hiCΜ88j¿uoU_UqWoUoU_UqWoUoU_UqWoUoU_UqWoUoIk]k_-5Ri뮭V*m5MJ[w ǿs]/DuK?7*m52>lt6;cmkBT1xOa5Vv&Y‚,m)yҬ45d" ),NI|N}}dZ)>^Sڝp: ?*|_Α+^Y?CtLn#~Vg =1g =1)aG*XYy4֋b|Vm(Jawc~T0|XY;fkwݿ`Yg{T*wjg ܍p 7a_/E+umr5}BYz޵W]L kYE:D"N~)7Ϻ[<Ra* \,=.0w9{ ݟi:?wN:T |vV;>׻'bw<Gg`8Le mkBTx @D 66"yċ0;) { Muߊ}x/_e_e_O?;gg쟝v?;gg쟝v?V/hnX6`XMH$I$I$IzMHimkBTWxߋUu#)(BzĤ!CQAу$DED=M IeCP"(L TNEYK퇦MR=y.pk:{9߅8% %n,q:,K,X(1]_S^b' ЬR#bhVg0aCfJmnu%;Bzk?(pĈs`V} =0nC<_W53+:-8Z2>-xz:p1Zps up.v jsnxWֵaޅ;qxv48` ș a6A ̱Z )ޯ7֮`f@՚Z^{' Ю]φZ@/aV=Ok ִZ0 оoGO^Pi7:}Z%`/kS\ LȰs Lvax9ն]^ ?}hz]ѹKt@ೳJ=ab5tfIt9F8O3^]i~x/3 `/pOu@ v y\?_$TGտ=tߦzo?mm_?Ҿ`FWA޾;y{P/sTs^ӿ=<[GӿmE?ywqݫ?}Lѫu`g;kn_q?}fy?wf>v8&W<_?w?yϳӊ_a>xcWZٽg*cW]4Galo9c2]Ghsdhs3Ulsݏsdfmߞj^W8&gB3},y>pLfǜM3c2iy<L>>09c2|{>pLig{污Y}>nY|!wopLfy ^,8&>﫡N;c2Ktj8&/]nsdul8&t?q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/e%+"XmkBTx!@_1c]ٔ(?qr`?????????????ߴ`%i ܲmkBTȉx @D`KAK@Of[!0[gߖyOX} Ɯ #K<:mkBT\x1 PEA$ 16B0nA gLxwu'.ftk:Ns57$&44"mkBTUx1 QD`"l$tiaqߞ}KMti믿4HMti믿4HMti믿4HMti믿4H_l_.w~HY1m5mkBTx1JQa`R\uHgT!#ir08[8 ܗiyĢ5tluoTKw.w_{s_VeKK7GnܖOGnT^G#Ko~qLqWk?teOؒKo}'G]};[._k_{|_K,_b;X̯Qδf3?f=wwsCg߮CKe]6M@Xn5j*mkBTx}+(H,"H$"#X$,QԈZs>U{ ..T}6ڳ-F`p]k߅~b  О$wݓٱ|sCoA+q3lOx@(0a+? T,_7s\Ϙ^Bl1)C+k(FyN"8dPC_9>O0&l4Im+nwGrŰ)/tihf ѸX>E)<,6s45zb?J\<OM%O#(76:= ӋYAƒH Ls6MXBcX&ǘJte. 3.je(??Lj=%wZizFTx$kP8Em jAOހ>~؆B9 ֤8UKCvjbL Cy ;mj P. DkwUE€3ܨ8xUJs\ɟ+;}sFQ(KIXݛƨ 1 +KdX];Jģcx$D׷X`i @l̏rnm$^9΄zBGϞQ=nfkDe; <a>,⢞jk0B[p($Ǡp4 nq`XƓ vϵ.xHnorJ5Hu뇗 f a[Z:>36[g RL؍?( &w.7C#~B{] UW 71jk~ecGrD.=K@WDZM0倐0\xvqNZ ># BE )&yA}t?B Ym(WIpɱ |2+\2 )l8tl@Z.Be񅋍RSƃm>dIl'N adĢG3%#)?$s _5=YBR#-k"qGP-e"f%֩-ϓ378M9ϊ,_*n;HEBƱcl~ ˝[/sagIE2,z1t:kLș壋G){7ond{@rP>kwk׽ #kXfyEAB9uM4P=_lgW؇N#_nGpp ,ZUu6ȓVӰ0EK7*|]{75F\ԶzQz! uH>upT٣o3P)[^6` -d&*=%fY<^ط`_6|h3ء>2 Pq7ώ ,NsjF=B` 큳CiU)R鐏@LҮǧmb<2FHRqùFXi䎲OmGA}:*u f:@ʫRH.66jcGOpO- 6HKJU:Jǃv,3DZEƮqq7p?ȌK%ȧ$;?Qr6pP7`a^=R_)m>D3#£ _' Iɭu͋C-Rne㯄ssL<ȭ/R)|Lt_1Lk=rr 4/gEr~PnB[\g[{gYvRW' {Fem1{ wL;7&$xc0 n&u@5sCCձm8Heft x{q(aтa?Q%l4ςxmWI׆GC1kQ3iJh,KRO`ʲ4)%b6B8\pe;u)ko)#WSncRx{[sXv195_0Kՙ7>Tp5ٴl3S"؝LX睫[5m Q="u}pϘ*xbՉ#iM+@Z! Ϯ~jYݬ$?5mtu] %@݅:4h8ۃtu3; ΑO1A/r R*5i&j#Y2:$Z(ad@>'z L뇶6Z8|`6"X1_z' F-я?X^ A:?1;h/KVB' vOnFS ƤQ{=kh7MwXQp\v͓O/. N3HKRlK"q^Wh1wt h@3e6N|I;y?8t[[! $,ήLe"z%IކAkRl!3u8ځy?_W)AbCO!rza5Sn֗#<43y6"R߃CQ&>[# BHǽ{vekOTlq(UH͵h ݔ8,@tՂL{p/*L"d_y k,4 G̖bD>,.ok"D;|7[.DCA#ilϟI֬Dq]+eE _-- ڰc^Lq1~CCC9gNH8BkhJ#Z-`VoMa 9r$պZ-hkh ?C$ ^tď9d(8P݅]ڶw[wl;dn׆oKd Hބ(DInI M_(5)6H/Y1 QRk,nXHʉ?>df&6^EJmt{CCc`0ʅv5x<\9Yc}106"״!֏9dl:' 1H"z'7QqɌ#KR./CVgQȬ\ `?d1yuM6Ƶ8ZX]8^pwQE &1frRKi$GݜЕh3'{;;~FK37ku<pdʎ+C RMzƏ7)nҀ lEGyl:̑IoBS%|ЕsTulebA}Aʹ10A{KʘӺtjdLI=r PRg_LbR Şl?␔)![Fo wi&k^CV(t@pW2{hxHGRn͉eCbxԉ6GQd27\ثdS=\Ff*0ۣOP5(rZߙxQZ>~GAeN-jY7Ҿn;n?ӹ"Px}/NW:݊&׾:x" ꭥу;R펔 c䛅љElmG§a= h¨BG_uYnZ쫭FYs U"zM&:Gnu.DX5Xn;}ԫ%XO?~2&Frjj8 yA*W I9/ub)Zl: s 85J>~iI3Yԕ;:#hELם[ROd^GA˩f~Y!En0~/A Km>^WYq"<цF*c:xw|͞w%ehRgd9̕v3v Dgh>>?3hYDkgC(ʹƒԕSԜ| 2Q94(?OGQ34 fccPopTYaW(>@tX4`LGٞpɄaŰl\[9c26U M6f,'C4i?W~psϠ?kAKrŵk@I|>^xs?\`,D̒5W^w DMXf_8<%|8_왉pP1Wlm߃f?4:́_Ԕv M;k:p_sj؎qw]$F}y ,b'N=o0, ~M YR46+!}@~ujctCP.Y(x׎z?70WXFܣo3z0c8RGg0 TU򄽻w"/4֏CQ`[{Ocn]+{{ N!33+5]qpj' r9FDȬ)~: 9Gmx2-?sraG"yvUpa;Ră A\& ?#n 0eed~oq嶭!!DzP^H)>oȑ.ļԶ=Hy7S-M ?8ycߧq|#5"2Б lm#UeΤVbM͘jAc7Z ]> 4gb s 2WRsKg6 's8qzTT[R[w)I95xWj #!nN+zPڔ KgTE,?{^RDݥ=Ru^zîc&D'i74SJߔ&HUG[crͦ<׿~4}څh;lpAZ%XZ;tQ?yk1+Ƴu6[ Dc4Ɯ*dB#!}e>samhG3c^8u9󼵕⸈߂UyB;f "Yi=D =4&|C3g]~WgjhSIXU"1A5Fr4{AljwTt6</N \Rta| i>T.Wo>>xϯY{緷m,J{gg}v~)]s!?wXGFl!7U|Cnfﳅ:.@mq%臔Ru?.:aBֺE#Gg'yXDuSWNJD)21ѵVagWPqȒ s?¶@g")s\T{f3go^w:^"{d#!φt},nyWFKv„X4|VB~,˘_&fjp/WԍwaO H 3I`u1ͤ+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_Wݚw)mkBT՗x]UUN C 򡇤-,z hތ(A^Bj&(J " jSD4M>]㌍ZϮt̽}{ww}^{^ڻ nf1GYDXny>0lfF{60?by{Wfy Bb20sD{2DU=iP!XL1P.怷R#\i7zמ*#7ryGMuQ`<*bn4:+*n^f?sy@<$q0Lc~''<|P{HĚugj iA yBZ`z悫CZV`;@Аy|<;@IL=  5&})@]:;3rL5KyL@~+'Lr@?b(ǘP;1扭<>O,25:bu@߉Y/^dIϛy@{^%bnbaybcO9μ}փ+~ (sawb!fq w?Ov\+l/X{ 8󽂱ߛb Y}Z~-'>af'rAM 1754įQ|4{@uU?zY8;ql>En8}?F|nLArwϋ,exG.mZԞ1sm̜<0M}JnwLoM;(Kh0_Dx?Cn5|= ~&3V+q9}nbLrs /Py mkBTxϋNQY))HȒek3[)egA)X*BfJV(˙H ?CJGx[oޛg8}Nwl_!;c?v;c?v;c?v;c?vnIm?t?xsipSajC[sip uԻ6态1pI/R+HYC/MMc<Nj0-֦态1Rw/x5Gjcs̿}1Rro`M9``T]Nar=ijY9``_ޅF˹-6ʿ{=hv#9LO}՚9``TϿ{ ؇rerZݕ/J/HswUnT/fwU*1Rsr7˽_&7iRs@c?I"w#5(iei"q]?w_Niw"6]4s7_ nRy'(2u7icI~˳K7_Wny]UrZr噯R{Wro]kc=:r o`OeF~Q>yr6~ω:oLUۿoɺo[O/L?D稜^{yJ7eO4izVEuuj{O}۰|ߗgV:_l# Ÿ' _5%KPmkBTx˫Maq!92(T D Se d@#LR.klkh=٫й{9>qͦ"Ny'?w;Ny'?w;Ny'?6׿~5t9 XGk5ͽaan[CEk֒3@F՞1ef`}bX+CU9b[ UybZ Ugut֨:oL6?[;:5jc5֚ef`*?i?ppC3@Ff8 X _u:7t X _\Uo7kT>9ġf`ۀQIVտ\&6kT\!cOP?½BT!ZOT!yv`*??B9~'Sh{EW3@Fύy8~X0kTq$k1/0PoDNʟ:O8 <xYycOy5^3@?1lw?mxNxi@GO:#b_?m8P)b7O?,b?m1O[ _-egȟXOY,,TSשFiC(ڼqi+bߓ?miY=?mxgi`-?mW~DZcS_N˟:Oia?u^xȟ:m5'{۟D+KyNqV'Ƕ5KI/O_h|[|Oп?}q$ {ʾn͑r=?}!q?s({Wžfݰf?:6 g/d/:5;wteqsYՎ+chi^dzxkLe?}3kyY{Ş0$v8=smkBTBxñ @u4$7+mbj_~tXF7w5TUUU'YPs2UmkBTx=oaFLDjdCLFc3ĄA M 6/ VN;y\ŭS<ܗ8h*}'NM;j͛zzi1}M]/۞EjBz߼f}L}evylF{҉t)ݩ{;_;t,]HӍtuuqk} U4?NpQ-6rSI$I$I$I$I$I$I$I$I$Iٴ{[/4]wIތI{gC;ם˻~[Vn~{]FX7ڷis8JWt8(ߩn*_?mպkiW_Ks|:mx-;LT\:];Nt(О?ޘ=l%mkBT x_VUŭlBDL}D"!(!{*"%"-zf0"JIg0t,H:{ ]=]ڜu>w 6`/S+)nMQ:jO9;bDo ?@װ}).u tZ]gfAٱRbÜp\`O3?=?B\j[0B ^? uN3ծ0Ra vffz@L/=[\aYt\ù eoǙ;=lx_@xd/*Ua8wnz׮^Nzy e? gCvmY솮K@UП \d>_QOqp>O@ 仢f̮sߥxg|swOCuɮ0s}^]?[] 2ܿYxlp/0My>:3D1՝y15zvHB{<~c]`/x.0Q/Ymg.p/KU=k |gmnYlsǩ9F8j ߳2M9p8Z EX C[C8r+JS~ϊGP;xZV2<ݹ ~X~OD[|q {A<Ǯ>t> M3TΥ"o@0YJR<>pKRI)o{E׀A.KU^(GU :=stUl()`/ A4u(CuAJOסfKh9 U(6t=t OWҹk D_zZ2,A5_UZO_ nMJM s@霵w(6lY-w"yږxKmkBT-x1j@EQKtD* I M,mAS}S}~}c7]n矎;e7iKokǿ=o{ǿ=o{ǿ=o{ǿ=o{ǿ=o{ӛa5|˛voǿvoǿvoǿvoǿvoǿvoǿvoǿvoǿvoǿvoǿvoǿvoǿvoǿvoǿvoǿvoǿv/ſtZoǿvoǿv۽AglmkBTxKh^U㛶H*E ֑HUp$D-8R:t NTETDD@`}56MmںXI޽|{:9OӢse !K00. {`yn~ lo?l}z/~{~g~\`?np"}큹`1%^N/8;Yz].?l,-.xE, Sca[XN]xVG=v`,uEs9#?,O7aNq#zG&6=M"/\C`;9  z|coB!B!B p͟-☥[?OX:C3EU0*w`tP 9&ҙ^]Wrd>]looQKw|t.t-x|]ׇ.mmq[o a?;m=f_t4hC{.jM,c{lΎRu]W [/V~KDXI7Z+RrCDl-x#VW[;Cd]09DmaVs|AK-ZkiQybrKIcx[*Kk92Kgmwy3ŷ\[wyxU'-ڀwYL}wYٵ+S]Niv o>a7X]bi>ׅ(-=Xq.AeֳzP-V:_IZh:!jкRZ#kM;< a);ް\m:Y?T?L}_~FHd2`ߗei[/G7='Y*_ݡݗeY_.D~z{z/+3Z?8yz?V=q\=}/_" ftW^R?/l7Yګ;"u{'-oN;V39ܟŜws^͊9{. hkKm[[:l-q]u|~-~+Kg-lj1;P#5<B!B!B!B__T lImkBT /xܿ.Q-܁Z t׉^C!:UIh[XPl>6&g%6vg6y̜_N;rnj6zZX + a),&,0W0ftT a,}aW·6g=-p*2{|Y8G!uGhv>$'_6z߭ t7n~QWg%I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$Iah5i5+j? bx.x.g?oϛf?oϛf?o I2MmkBTGx]UU-fR P(**@  R nHI o "1Ȋcy7&6eEN|cF}LsΜ^}=kZ^Ӧ21Csr|yù}L\`9`?;Z"g&%4ϽQ2wGµw8yy0kݱ+X>{}Q煆C;:E ֘t%?i?.\[<9o)[9\9kwJǝebMX~ M_. {w.Eo1Øyms9+7x>k!ts/-o!tKs1O*!lBEq.*!h{}%dϷ"#7}XR-߹xȶ5 FXCG&q gΟû3k}%$.ژ~=tdYPH}ily>q]C%boއq,\g߽Pb3saGzJ9o?!2?U+zww1WBּ){|3 0^Aw8$[;ic{!!¼ |}2* hLϪ_EX7cmއqMZwUT9E*z_^_E^wy{k/&4W}J*zؽ#[N*&o͓>]VG^EOu~OGs}=wKR~9e{k\.٫h>LBؚW2 0 7vèA bwy.{kdQk(٫h[䯢/^w5e~cdG:_Eo:^'Me`?jYOj:m;W ad~_E߈5u~Vݘ"?:H*B}zWQoGnd~k|q:{~ij3٫%-oe^NZ=Fw]lf~^E3?WA5C?[X稵W#X^'m[}?w [}2SdYǝ{,%d?(Pp${6Ҿ1u?G*#}C::2ZM'G@*D^"6HLuc_?{ ?=[0?_ל7R#{UtQ&gƿ^o7hD*: }X|{Ol;|%{ e~xo${Y\u!{ {,f~dEuqy+hXB淄U2F_E&{5Y߅u~/N k.S&{Uf5aWUlyAWUlϩšNڊ͵[c٫+6no%+6n| 搿b& Ͷc Ql{RX)bǺ^|2}}0;|;;CT}?븇UlƝ5+?b3ngd~gPF>bsğn ؜ۙu܋Qlέqq/DYrMج[!ͺx׃}_bn62/Ⱦ0lԝ_M)6F=ɿ0f>Jͼ řLmkBTC7x=kaQ !Xډ [3;`؋" 6jh^ 8U&yegV+KK|y>K'0)C}Oҗ>EzWyuuI$I$I$I$I$I$I$I$I$I$ME5VۻިeM7}XoT~ٿMM4n*'JGt)K/|9W XwL\O7t=ݖk:n0C~Grsa2]G( m^ǿ?Lζ~KUFm̞V{bz=9}IO mD{w־gaSJ3Ў~;`Tj{3}_H_S/'lϞϔ/ge۝JC{O+5KpmkBTD6x͋NQǽ5,(E"QY[MQ?`ac!eeAmFS C4ymSyϽSf3}s=w}~O?+^sLϸQ2;WKp  3JgϜ1'j @Ju|,K}\z3~z햌"86AmW>wz5=?oĖ.eOK慱s3і>-;sthM3>ʿ{t("{Z 6U56`h^9>HO0Չ";-Dp4#=Fmk:b9˚Yrܕ=p\J>{cӼ^<[K>g,S}.XR/LׁZg:ex#\3WV}ݏi-H\ e̛U}`N/Z>k8u⃖<3TH>ڒwWpC8vPk'{ =#sZkwd 3}c1/ļn[yy8=7UmC鱡w_7V:1wZ2?nٿW5PuY!2׉&53jeZGXyWaq0'Ŝ_^*[ FŷTs~o@k/,L^X{a ƽaE{,C{L=痪KxQ&9P?r~D9痪׆~ޱ- s~ir/e". H NUԚzoPORq~gPqA2($^#k?~j=&<^n9O: KxHbEu8Z阇ErgANMx.H}K ib=Hr~wC.q>goF7ɟ=H"۹˘4I2.IupQ$W|azQ9 O/:?]ɬ/[p8@t)>i#7V燵~%wKM"gε;Fn-K}Y>߿ o 꺊xIyjrBQlQ@qz#*FĜ2rHUm1y#*ƪ/ucί}#"yTr~FR?oHZv5É FEls~FvL>Q8k7Rc$}ܱ9ɳ}[`2< mkBTR]x[TUKf"]̄)a=VDV=PكB{W. A" Yd72˧y[i1s`sfΙ34 k:keGw9BGZX個#ܿqC^XzmI lW@}?>pA Ŋ/o |`VӁ>S?#w{>p4`H 0ׂ{pw Opw/(|"yЁ=_0l`=&49Jl/59Nt:з7MJ'\69m]{MVus~ohRvί?mBXf_#4i5&yV&]k:80l?>ȏ7K.0O܉lkb^#o*r%7 lr{6ĀG|ޓ{jZ{P|:m`ӫ;wnlيǑ'L߃JbqƊukG+2Y\ubL|y1VǸA!#hzuRg}-#o4Y{j=¬W'xzEo 7siIF}̲bUO8z:e۴rbXY>F#6o.e瘮w^כV.0 pW[#Do:b3%5Wu\.ƙf.pIJ+Ft:tA5Y9L[;ZKu@]:M9_:uL5/\M̥<<oso޷AqY #@5uc߳S?ͻfר1Y!*Q^KpU#M+[m= GޗPu~s25Q'J@ɻ/ui{?b?5CxoSG8jZ{P =-Rj5_S?PDyʛP?y< oqc@6SØjws=[ʽA9ŻǴr S[I7 tL\b]w.?=ªU=mՈ 7$==g<@Z1G[2oݩŻcGoSZ{P/3Eh3@=5.?'plkC95 %YmkBTv$xϋQqJ ɯd7bJY*YXZAv"%J¯aBll߯5ysy)?yfvȶ&ڞ*ؾ./:_UUCߤu+۞? !9GU&1xmml{_km7stvX/kmkc!JX׽qVK[>3w{/u` C=lJollK_q}ͬLi+mI\اP^*=3ߤ>-%{/3۶=Oi~M{.{罿mvTz~mqŝN_L>&ټ =m<ۛRvG[׉ K{qWffsbyvua s. *߿s+7 xw-qG۸W!~HA_~~2m|+C?Y 5K?^w4eBl,xse;l[O[&7FOb>_;_O>_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_;_OmkBT2x1.a( B,* KТ"DHb sI S73o6֌ "Բ:}m lkLNZ&;?oE鞦u}veh/ Hw4~ llLVZ/o@ H3~s lmL ߀t7=dcO@\ 5ҽt/duY{)7o@2x*3Yj}Nze>zP9 G-t]λt=f>SlG_a mkBTxKhU#  A""EP7JTD DƅR6ժ *jR>jMmk8g3s^mg|93whYjwןc%'FO4r@lOL?Yfg I=5$d' Hf?IHvOJ~$Ws?ySqxLr6g z.>Ond] i|/VKE'l}#8x1g zLwJ1G)G?K. D?d5GMt?jo$K9R_w7k-?'i~g{9Q2%& _ \A#_I?T\;{  ۊq x}N2lO_?2/g2[ϫǹu4Y3U?]45#3} pRs@>#&of|]w?HߨuƳ ~up&zۄ76PϮMc KA.ۻ7u@0irW7k4L~bNr2g[6o٫t~ec%gLڲ/yTBڽ/A^>#g8_GNڏ>ϔ)#jqk0mw~ Sr!ga:׀ :?Sp>;e>W5wyK)]~RnSл=NA:, tʏk>3 xί?>Iv;(w)s hOgoL}o,. 8.=г[=_55o/)>3`=\o*xkWSg f3ZU7<\]8حL#YKV8'>q]S~, 4Ɨs~U#У¸׀(47i9Ur)g6 Adobe Fireworks CS3 2010-10-11T14:11:47Z 2010-10-11T15:17:57Z image/png |R IDATxw|?;uٸf 6'@HH# $ BHJH 4SJ jn6MdIt:Iw;?3>Kݛݻ;gg"V龞h|%6F}-p+;-cYjqΓs ڏWɂh݀m>bϯ@տs0y=f58{ b U=0T xVhx{{!{!VHot.:2*`GR'.$8w+ ݖ){^Bte *ߞܪ|<<Ҽꅄ:ӼU ;((naNz=s=yu,+˺{)vY]ryEAt)f|sQyaN0Z>${W9%4g^D#XqwNjA>䅔=2M9*hɷl|/sy| ׽;5\7< u:yuɦUq+Y'η*( ӽɖ uնSPna*yβz^ ]T&z|dQ TW-;$ժTNB u++S=.~꺗/6{2yaP-5 X0@KO4}LDD;9ywEch]@ 0cQ2 # 1Œ@vHDlGs #DD~"8q6G#pέͣw[Nt|^SCB{{ EC`<[[}sSKp8<L6 hd5m#Lf%4 ض=,㜻~ac!4˲H#l5 Y5 n$|pӜeYeq(1&10~U^~5˗,庬N .*=7ߞQA08݂ukxn_}CS'}u2'lFHH%"9d2뉈h$\Ѹ1f7Ykmۉie['""aDBpέ}в~L\ۻrs֬X) uR:2^H(/{/$XG03c#B/v}_8;͞}hn 00m fzX mڶ=L/ l #tzyʶ!bdD-+aYv_*\׳/|Z~K7 ˲Vض眧c>XH). ime s-S ۖ՗6eo?/t<5KٶtYxS^nEH0Bu`(R^{{?{ߝܹFcC<01–eM̫m 3n,k1f@ 0öt:~ %/?cV,] oY'vs竖ؽ@!LTr׹0@?cbGxͭabE,Zlv1,;ԈT24$ VbfGrhhkCޛoS~fwޢmt^1Pt ы Yg{A c8}mwQ1vX0dLsi]m@K d:W|ѓXzvv݀uI'Ozj(>1-qkv1aLg1U8`v"9O<ٖN#Cg=+{tY,TM˝Pa:%c2I{Λwl]]g ow"bm䜧}s4ͮt*1 3^wkߠzdA,w%ee!9#|"``,(wΈ}?蠓 o۲`́:@Q .Z|/{n mmÔ`^|8 1]#P LZV}IÝ1p$90vm{%.0Gs(T2L7"cD"EXt˂s`%UE!a:"{'~?ɏe>D cH:TH 0ƌx_[ z'zxQG{l^C|QeE)\4 TO@-)GΈ{OO74m|qC5K%LD"3,Xfcw|C˗,SaAh~ +#PmV\ҽ?~SmkCI |3|p4@oo7[(.^nDw:1:a:TZoτ#oɼ>Bt;L[j#o;=ExnOvp]7TGCJ'D[o;}q?kv3N"m5|=c /=@I |d? tuԣ?zd%]^k.$< ECYBuBkotoL]} omY(^0^$כŶƋ/=?HI/י1urL'40 t&;#"vG:SDn0va2ᡡ Tk{ }'I갼Р}QDP`ZȎS.v_tK.fٳ E5ؖKlfe2CĊX]vt獗^^pu׽L\{q/ut\G?tN`(58 ,2ce2Cu3M{n-3 ux.O{{>t(K C~8@0x6%m!DЗoN{ރv;:=D'xWd$w9ec/ugB8ܶ!D_6To7<8_Arx$q`. ҽ[-\ ee$ t(F? ?p$rܶq9w" W5457~*8g[仪3@GJ\.N?SyXs(t*ՓNHd˖=zͷ:svuR)P*E~3.| g0ƶ-GTjS*Tа;~5 eTQS]K}!Lb+Zos.qj0>缛EaTB&3?{[D!nn:|^STѷd|<vyOs^a|cZp_(naDk޼v;7|╉6ic/;;Y&߹M稆N0˼3Θc%۲^}j@<6 tߟ~۫/|Խ-Iūz0g:;Ƀ-=Gr߹<&"j  ooX$K % ?l3y;aNꅮ3O.1DT!LBx0jnmܹ0@8iM ~>#w\>L/Nn:I璕^/wG|z;C,;6d0v,@ιED|C0r U!; wR]tu䥐˺?~ Q0=KP%6uw/iln_/4^`,s+[":~鸇:0*(H䪫&a|۶cl/XC@H,E vSO_`|q دK 5!m#oчO%6n\h]ݍ$cl"clfjT03|>a=͛jٲ6uF&TW E@[X_4t'眯0 " oBud2~GO;Iˮst/z:0ƭW:;O6 d"6 c-%he w'֮\їx':5a:@t߽6>|9n|vH`HPa*ӟ\cD&Tv`3 {=w7_yudS. IP\2:!P"@~Ka5R28ee&N4}v^{(3<{sA @c T;o~O1_ NL3mV=/ dcR,}>_U5$H4t߂;ny⡇824k؎2>2s|d9;$cUoc9݌*TPt}}V&,+1 1Fp۶ms۶-˲lضͭL4M3mYVd,+cel۶L32V4&g2LiDDaiV:J۶= n_( 2f0~` >0|V&c&^"L4mnیB745{Ցh_/F⺁,H}l m:D'P* a:M?@1JΕZ0&'S1 CDD >𛦙d2f*J&C`"1Ktn߰m{cP:r^A/ouങ3'M0eISLh8qb!́zrx8L&T:Ey0 X$mX5H$zE?~qں73(L'P]7P!@Ft?aFD0xwu6'M5p#J%`eJ4<4'~y׻Buߝ=z{wH:G#jA%OvAjV'^@za;ouƎL2۶7 O/t:۴7cP8ljnib4]K/n{㥗v r^HQ浗*$Wn-&h=/!7ev٥iw8sn:p$ikhXH4ٹ?wk[].ON9CrLw>?wZ#c)s; Yj[-w*/t6]cA]㵎@`@kmF/1ήcu Oڶ0=˾cƎΌbuH~0Htw.~ᚷ_}mUH|v UUe$(wy_yu1Ncfl]aG9g^{2at1iJ k/kme?[aRPw^=^sj蝎*kƪkT/\_vS76S7#Pj#o`փZo'u\7z5L'"v}^. cl2/2H ¡`SKKKrxxpz寿b{b` 52(8'{Q9 Ee颡LXV^z$앮(팈X.l7 IDATknm6mZg[`t:efW_{\}BuKsPtB 9sJU*GVcI-o˵PO>/뙿O†al u u\P?{vxuRuQ5ӈ4t"b7?c{1عX{{CXacGE-\ԣ.i[6A UtH1.FqNȧ(IlΞ{~ꤓakh{a֙y,3hݴ#VWxW q uYn :( Uu+W1hRm{|ZZ֗#깥Rd럘Uq(ԶZnPGXQGʱC_I>1V A),|i˷e9#RŬ=pcss]̓O~SOїez γ{y.yFi$x, e7.8t{θ[=j|߃;x;uÑH ]kM3ww^v˽뜠BǺ^7hz}j9Pkqf^Uٕۇ*d'#.g*/,6ZnPG@0~xT/澵z)߳ ܾX/uz&:Oņ[Rg҃+GR?ze9Ɠ{͓)zN-v[y *#մbedF/`P$XC &}MM s.{Z!9:M uQȞ;q*oYgܲQI{  mB^ޞuKїd;tQuޝH\r~:k@qTc;X7X'cKC+Ft%}y !޷+j#ceToԛڗOWg*򪐓MUi`+ =:wE>a:;_o9""?97iӜ8i :G}~}Ev!s$ I0]'Jm uttѐM>-v)׾|ꅉ7_uɥ/Zp#/o;. E:w F1@Xh}^L!G_5w{^!GN+(붳zUeNZvTLY6(Q uڑoH{GLC^4ꇞjmyʩm[UHHJݞ糞b>6@վMn-Azv'rw!˲=oܰa5577.|w֭KPa!^ʼ\]$&*'Ÿ1 z=[3Tw:}z)_⡻qT*XlD/J&M˳`]vKzEW(7_MUռP9㶢|Wh`, Ыi_J}gxىȎ{C#pru|At~ |FحT~Sߨ/[ZYǻm#Te>_h;922=EuU^^t;s-fi.WMٰζmg}ýU*p-'Ay4gD@t~cu{R?# E ~y;ϙs\o~?LS6=/>U42YfJΞ{ꦬy*9N춽.qbicE[Uj9J.}]EͫR:(tBB:)*-^BBxaa)w6PG@&:v{>n(Zb(ozU`<~U/;^޺vZʹM¹;d^Y^:,j~':nTؗ3Y$=1X ʹiWh=si[`[4UPsu?R;=7D7I^77Pw:LTXtWʧ^rm@ u2(T>ײ2/">,&R7tCbes{mgN4T^WZnVO]lt눌9|nuDGm^6#^G5RkjyQ;V[UXV^λjh>Yzփeuu}/eytK$wY˹rlށ9;a}4mXQP_13ygxbPrD[aqQy$`?PxI~um'lUCUqs^ꂧ83p lB-.hwm[޾O?2݋\;Ct.oJ:'kϊk96[j^(-clz+|>v[9D "`>rz0CggPg'QLP:^VHn+Nj}TT #Rsee㭪Ŭ; c>b4u^myvi+ :;18 P|wu-:|Q=mYrF;s.89 3c.a}[GCSc]:6Wy5#!z 2Y8scr9?׃U^nbmt't\O>V sg l3whppCCcshk[|78As{{tcN^ګyGLcIl'ݶ˲sdžuں咕2Lg\ղpk/$heuUm'ퟤ IrsUXly(jvU˯ut~wnh:⼼h\UZ<,\7e?Xt>vvm`Ɠ|ߪ6뎸c؏ݖI<:d3A:#"_k9vm޽qc1`wޏt:PtqK2> '{L^ Ť eUB:fEVOO瞟ꨫ.s\3'zO?28ܖ. eeNPwUU}t 0XgU!evmDc0޸m/mw۴,vc١s\w߅D$ESd;2dnwRv"/;ĢI4Վ ^<=-_!JYGD#[c(BθUy Qߠ׫:PwSp>W5nd&[7UdY[A5.z| ȏv[[Uw%zj3MeMQM]uӍ_k8""2郉p0 3 K}}c^.{-qgs9ur?w)drA9DzWRH5%X?wNV l|`(iDZ@>L&#M3D7s4w-$3uk{lK5.z| ӺK9ܲR!deDu\[}?ݞPO+Z8dsU .U%:A4˗ e;2rL=-7Nc^w$mem9:*큪~S|Pb^}T[MJܪwg]TCBN]C瀹칕h+Gvy2yiG 2:xb) /w.. e[wzH>o'B{w6k ,S- ڝc:K"un%{ !Zfv_Ev-/!r{G8n eu^X.يT w`9s{oiĻ&uv0w{oϠj eU]inZ~(j#ۆblKEwZrާbJ.rvX"*Ճts{! Ws:0nt;]>\οQf)rgs}=V& -7vr,_od|z>2m[}m>sa9uuATsU{r:fD\p1{ΛwV"_4[iDZ ?LazcYtUovQu:%^^=-+jj:cn'ɞ-hjl{\j^;Km-6]U Y5y{غp0vm{9x4{4o.9e䏹Fu%rO~IH|ɺAsi IcTCǝx>oߜ߽ADd۶QT'Fׅy͜ӝ%;NκkxDDܶU8cCH-UG_30Fo|8 n2DDsLηWs63$ p-ۖLes$"d2Ύ~t@|cphxr>}_5NW+uY}~VNh9};`d\!]f2cɏsqdm,cfR>6M39'zzz?\瓏=OӢ~Trdr;4Ѹh3ݏ Dw}3L{ x͘|_<裫ҩT'eBP;?K5DӜ/ztQ99~s_DT/ݞ#;pXHI$sF3FqP|q+׷)F/96_'E!LtuFnH^hcXD"ںmIq]YqB:rs:ԶH4m0D,?"FD""m۶9Oڶ=leጕ-+E[o?+gU=`cIǺyem_P }uGۑp0"Qzv1^ ~\s[GD $:Z Tt'b9=):|^ q=Kehs#dtۜsSB$Y6i|_#'Ӓiܶ3m'mQVȹd}Y6Ms-JS!.ff29<<4rT*'2̨C9'=m=@dž n'<[~ǵYF:\Nym=;6c,9O>zu]L&*g`(C99mۃeY՗NnokO<$;H'ZDdmaюs&W}d{Nz764OX]୎!,7dq3mC6#JJz,74c ˭Op>v7B_'lι$?AvQ'=Nx "I;Av d2|aκ[cYG4z'"ycl/4~#6""ne[)"b~?FDDvs۶t+L|G}K~.)MˈAꀢjqgR0 " @08E #}ysoJ'>x%E!z*,2MrG͔=}?(sNSUrOx±c/AzOtte~g?EohM#@o|V eA)(s mQӝ=I=8|ګ˲i{7mz/|oVd2sg;D4s=Z&Jh+֯ٷq۲5|ʳxNV7_g~'}=qF^\LCJ+ evzֶ3)9hZ;vU|OXרɗY9u„wiNcEdkgH1D~fN"B)'Aijn~4/K>e )}-'=1 y/ ^7<< >ObmDn,;#ז>˲T= uPh*c,d6 -ook{oڜ:ۧǪۺ/\gݨO \^0PkGDO9epe \ޫ(LL766?ȣO߷`eqY`V%tr~C^~;OT6M6oӳNYUMWTMiJ񧜲g_ !PߚN,˲կw;=LH{ ԝaYݢg09_*xaYVkjKUw4hrt$ ҝCtͪ=ZZ[q4L Ws'kV6IOyre-"aDt8P]15@yRc#E^V,Ms8Ź$wp;7}1k%Rk|~trS1#EŪ#:DCa5cVGXCcmPvʉەx;t4T2eYvb,Zݶ~KK2ͪT}6}'b`>mtZyD^M޷`{}}394Hl\?bY() uBteU!LXuogUX. `I:e]^뿐EˢsBN %l{w׿DM%e„s{CF΃ױ^NfF2(ECpwNJs;ۦ^Bu@ݭoO4;̅u%Tv~ ׇwaLaM*UV:ڔN/\MvJ`\4$W90^jG\FsTmsNr$&#clw@a}Bd39Cs|h隕֛aYu4WN:~D#UPovo:Zx]O6uw/ E" ӿO"y^Qp)z].;]'d zf0Zʫʋ%w9'߬7_U!"nY cO]urH89Su:@q@|`]Ģ`=;<^v8vi6BF;H'"N0cS WQ}}} TK}4PsRɋ$ňrd2w<CzojjMDG=pUP`ǖ> 9/ekA}CHdgO=e[ʯzs9DQ9[w%"uJND.YyRw!!;PH4:i`}a>K^|^xs>Sې@κOs]wU}/Y>3O<鿏?q?6L}248a(hDaͪp]׷(WDʲzKBsQ*SкT,(wW]{ -/3L2"" ;{2֝1C.گP4-{ usֹމtv*;q^dy"Pj_/0 }SϦB`//ggP}^~[l9QN.术kzO$_W:Z;/Y"Z{9(!kV_c}•^J@+_a^G|$nB: B)?clwuJN,w ] 98( D3[Z3fr>g?C(DWTwNw+E)E+EoGzv&I[o]⣥?3z_ߒ@0Xj.8zW^ΣNw{܂V/ṗ ٳ[T,P uNFwH#P͗zgy8FuuU.zj}xmUP4--~tѩ  ]EMD[;JPIڨi|S9J]]G"r_;H?֩S'{Rnu0qc03++]݋"pӌISEK9N3 :Gqr7JT56n1÷v;\Hב|T躮OEDZ1snOk<>^΁m6ǹ}/ ;9o3 c" 0ΤR`gcS}}K~]ޢID,miSc P?vu QwjȲ@ Pcwd=׭h;7dI|f8vT-mtGDUS<:{IT& D'9BY}]rU_>s /fF:7n.>+DNq(ʮgM9vwEuz:{BTym#iqv]}Ʀƙuȷꋳ8ĖL'BH8J/iTg..S](P(4ew4s3r5+տ.j֋6۾(`V]HtԔo}4WJ69dLPZ%ڮ'}Xv۶?Azw֖]n~y/xvf]RJD0ks1.xǹÓWX Kz6eۥ՝-G,H; AEu{ۋ^MuwM1v٥m7~͚ě/|E41͍4744764-0䊦9]ccX]6u"\u;]1dۄ_!uy[پ຺l~0ʳx3M|oK<:C$E#r啖m+1cpp0Jn=ns; sˈ<(_ucl"ڮR OιqwKov'>j>\v«*^@:lV'弼(.|] nvbhp@0SO_ۋ/g/=E]rݞꢠ_;CqQos[X7VMyrXwU]ʷn_L$^7MƹX]]aG9)D{I@46N1eyWTmܶPu+ C%kVа`ւc>HoÍ?:/X\oe:9DUD9t"x<~cl>KGѦI'͚6QR}< ;X+ %;3U&8,vu |cl,Vu C3g&o=ӝ'D+,ԑ~ _/'2//&N`1@Ɍ{Rh46{v<|ڶӦeX֋:mvY]f]:C:Kkz[82L&ev|-]iܺjw E`7喣aLtV6_[omџSB=p=]_vł|Ñl+|qeu,PUet`^✣ EXurNK^MI6.@귵or廴9_7t:=D}o?MUtQ.[x:7*Lq79mP[rMM48[o|'&qotѾk>: -FDDL~cz9"Iu/:_vVGV%#c1Ø\e&==}EaFnCO>Ma+o11 @vuum;TTSg(?Ϊwbf 4PC-LIcLLh PB'˹߹\wIGwtE'i>ϳήF;w٬Jݞ9|ynPti?gc}\Me&F{Ϸpn^xglZwvUul*>>v.Ώ !G"9"AzB/Q^ڑ DF3l8T:9sx?ӆ BN^K R9,!}9o f{5jyTuIC}aef{4vG1RSSAGt-"TgLl#LMF& d=N8^ ;D挓u<D{84f]G40@wU?"{Le**rZj4MLp8ݻ:;*nj>x5WSk< `Wk-5:ik{vY\nt=D#G2{4<\!K$ VD`/)?/b_u&Dv^:/{&iii@?f,(0\6S4oO1@ۨ&FaKIII= ]ITgO҂&( /rꡇ!0* !EXwVD:]U3e>=Ⱦ0ߎsζ:4k! 1@QqqEOOO;jonFrtgct:ې[׶Mj LiPŒ$JNsTYYږ/;W: #\' Awt^ sٺ@4My2lXF$Te>/3?6v0P_}*A츨3 w*c@aۚ( LWˡhM=d#iKr#\h"hΖ9f߾xT:/R yU"-E;@x[*o#ΚfEeOW\W6j(Y48sZD'-Ap7w(էEa@v`?C|*Ǐ/Ё `e۬^F v̻']zfUCضʌt@xm/@h{,}ՈP߳Yx84FBH1vl޴iCj'+WyA)qJm"P2 cD{dPotL8M˼Ew]aBH!!diD=꘣|]N &G :tw%lDF3L3vqD5fĐ?b웯=ʀJ5#iwV&88j NY?M59ײi߱i.cS\D-ш"]EeHEd#%q]&yfz~__qcӼMa:ΊԵkvdh4NJJ٧^;s!׆R,@k0uY4c^~dyjMEť_}˗]dH4(Fv (O\1}q3MsS )Œh rr v},s]:Zg0"n#}e^8!'774u"hꆪ#N34 M\h4A._޳Gu+&Cfi4MLq8۝П~suQt*zLH絳1{k_ybj-+pƌۚآ*QW3xv*ަvV\gJW o޴ysVvVͿwS|\6HGQ9.11>}HSRR\ s;N5ؼh[?]s0FX;Jl6 ÉAHOO9c@n`DD:rh4{D)xMƢ'fDt:E\Fɦڤ ('XY$.+bB([&iTXV\}7)yӄ <]n+F IDATx> ? L ~'v8+y.e1!) 9i,¶q$k4͠cae-}?7Nz)iata'SH3222z{{}gΝ;"&D/ 7*4Ft:g`} 2)...r8?ăJTm^U5nD (D2JIÇl3.h4Ɂi-ij"DA9Fdfet4#y@.FFTddBhtEӺ`yD鴀2m;OPCmyD*yPD #eпIQ1n\>Ө *?}FUh4͈!===f{-_OT"]EP} <t: 4M#B^YVRZW4;!"4M/Vp_Z0l!?be60 ᶁD꽱٧wtEřhk"`ٻS !{(uY⁆ˮb_5S7@#zâqF oy!FNxT+!C;>h4#̬"owwrsKJ< vX:HDuYi' @L@l us5t~(s DTHo H722Sw|BۢJ#s.vF1gx{zn7@}ɋNTPg} t̳OUuYɅɗ?}a>,!===k_rE2Am"UҰy1@ɧ 5~?aޕx\'N(&?H  Q <;۔|$eyㅒf;~ % e΁hsQ9|y5j3c]x$?+;;kw@Ԏh@:lDA7,~Dq8XD$2=T1~~h4!+;9u<.z%oҷ9MD)#TEDt)E9@;~OMɬ蛰(/>d-gnA<I۴ Qh4#ܼs/8o{WѣU7ƢGYH՗S[1 d7_wG>ZToDȎDsa1lyڶu6m oQW[Yh4qIVvvaG{G9Ϲ?jM90 }q iT" xN *(]>S6;%s"a7$&(u sF~;M 뇪#f; =K ζHᵗ4&69>xj@$OjXDiMb,y7lS I _n[~AA'~ yx "t,qH|\1}.Tfp0HGlhlZ;!_Ww#&\<" 1E%z"QM`%L6]G4M HX[k<sE5kkο¹s={ Es14Lζjm5 в)Y_oLs%yyy.HɋDuAv 1ȠKvvYi~7܅w233SGdeg@hѼ '`LdDq{ChF4%%:;:^yg6#1A]Yxۑꢶ=I$Pb~aAfIiI3%ŚI"cc62]Lyi!1(Scw8&M,~vp VxLdD wϛsa.F 2#XhW?#ǃ\8EK7xb=@o"DBLD/e;soѰ:B$1G1ctFIhvb\v=J *Mکtoy>iV/BMwy4jfŎںtYL2":Zw\K5*]t6mn(⊬s?BjԭL7¼PARRR@] T,t:jBL8ǜi"FZ41 c]F~kZk,wMl?&ͯn=}/FT| UңruG`;bѨe4LQ582wFKnzoSN ;hu]JKUlSVk-'*#bܼM\ ^Lq?xov&qQ8o4_jfeº,BKClfQdza}3M7zo8뜳\VUPgs;1]Jb]x Λ"AUHuBuCכP+~(]G4MlΗaaFЌc&Np.r^QT{sB$cNk7*a>4{FB;e^%8 rk_F[222233ǀB4VŢe=E6);l/M32Qy GEEo@Jmm?bۥ^UOO̦|yYj fʈ¾(7$TTs̸j: y%Ǚ٦F1"4H `EFaHMKM7~;5>*B:M"4Z>X*{f7hEd#_gpB܆Ͷp.D><e~@-k4#---u)SvcS!Ԯ wcDU0ALǶ5nG>B'_~^8u$TKbwo߶^0o0H@ ^N .hoIϨ5A7SMx>>mu"|F'f]z'M<)BesFE 6~0!GYH8yҽa%@0/lih9␟}ɢ*'L <2ќW.xb:|4_ߝ,8< Yĺolx )AUu8O=whif069& /s/C56t:/Yii)ڡHlR15mq,?Wmk6qO$nwW_~忨dÛEDf:d[vz{{>ɹqid~GUyt*Q ~Z]I)%LqV4 }=/@u2E"z.`N/&h4 QhīL 0,2Ch>?~?樓4GYts`Qt;.|F5w.ki]iH2FU4h}&!0M3vlŃ΄ȧwWeJd: OmBYH83~p8.2M9^fmr|ŗmlƘΛ]uzw^Tz:#s@ԩ趭[_Hs ǎ *h+F"$F⡬ 17;4o! F YYVh2P5[/xBFIOO?4Mihb*cdySOMht,: i=,&^>zt[o|ߙ{Ϲ 6O< wc=뻱~ uB ³y{l n#{M7 ݐoLeSV2'@;ۡoWPBgf{ H47=ɯr ]t^ݢ ]'t 7\q$BHŶHMZv BL*a积a(GJxhaaa>0xY##IM6MB ՛77Gzҩ jF%%%.CXګ&A'ϳ:蚤EۚCtK:9gz*viݷ1xkj`YLN;oھpdz$ ~oASQW[ZQY+/1QHޟN R!`n5 r/4{x% r9 Rjk*эHTN'bB&#LJIW}nK\.-Ae'A{x999sLH8JtGjinfTDbhMޑA`3@{ ^ѨhF":&F& e9-]ҌI6YmaMfv`wwu{{{{}RSS=.H"/??33Cf|'H )r}!"4ka RigPV^vՂ@YH_i%@͘9<ŋuuף|_b!]rU]$[Xx~AtnTL/bUt٧w:\gDqsʗ,|x-62qO6;YK;膗(Y A+ IDAT q:`=ٴ>;  g/?1 QA4]+Ndl>e;wyTFwLugeau ^6l(l3y4OJ(9-*IM'/?9c̼:x F;tz^oSccc___ ###-7//gظacͭwc?cX%}v8Z =`Xgth9##i#x׎ 5[;LlAyF}>?0Q.+>g:G2'߯iT^^އinL!+=#>\5W92K埣r,R]U\X?@W6Ŕleo=nfH74w?;th5ъXNԁ9]B`Oi㦆9{ܗ5>td38Dhvl%c! A4.P!ӝx@-"C7E3 fxnƬAn<']"ׇHMX^&Ͱ_ޮGwlɑ=n)Sƺ=w[[[kkKkkJJJJQqQ¼,rrsGN45WCn9ha}gtv#zXY>̙I;;h{%aTi&3l6ٮzU|Wj,OfVGQxԱǎۤ”e{JOOҏ|!QZZ_#O?ww!/|Xf>r !U+K1Msc2Lz}=}_]{Qև1?.tl{:d:;fubF <3ǬQqIjZ0pAd*S" n`w@mf40!bR' %clwVD NDtl'l ͛ev]GI rageS,{5fc#QyQd<'6жI &sϯ{deeُ9s?oڞ{M\\RRuy7l7M ժN1Q GxB3X}\Ci /, )u!W^͠_[f+- ?N(9Y8t456wtttfddDz# 0 |';՟5XTô]g~oTPi'25 ާEtHIccɀn4ڷjmm_} W]{̈́/0n٘,B)!lJn^M=dז#qySTh % ӌ60ly_ex62!a476t0ɺ>?^<>47[̺>}O8YOaScc}ggggQqqR 䑙t.cAS4zIo\ Lg-azQrדK)564t466v^u1yi40MQ~*v@5MHvX}X~ad+\'.ضuky^0ӏ?i"uk; J*g8`ehPE` t֨Vua+t$jImf( Pc‡W.^OU|;NLMMMReC~A~;4KJK ZZZ<{% ^mczp6-bzBsXkX?Ha$E3fv7 cit:abUF^Ռtd}Fa\S]qϝw}wϝw}߹M!Aεy"n\w;\_5qյrDBkkk7޻xN;xuFTxaa 3!d*yQ1#', l=Pk̈F3{w/tl}L 3twwxh|aI6i1l>;={>jT_WHAaAnܰ^3ūaW}dҁٗ,Hea"`MEfHHxfefC2umUUr;!}E4Y9g94.3iޭ Y yمș@SvۄҪTY#PƒYc<4ּ6bH9mgo.P8Nf3jBTNu]L{{[; qyKx]D IMM=4uZLr6pypMc#rX5FT{6A=w&NDD=Xmm&*X:/^^?/_0~1qk"% ?+%%%ewXOmNZ}bDaMSN>4hiGx_0dqqGU1]^`ہFګP۫gh07_xG|W~%$ĔwnYS]xr剈׃|M<ƏߣvcaQQedff5хnW_XuNӢHP7t\@0+:G)DEEH߿wyg02j7imnnKq]~2{EEh"WyʊeʭIL?d_XXj媖<{LRSSUPXXt:(O\R9l477"Ox3kby,duԇQ WOs:W0pmUUmaQQm el{UEut3pOs14EFznMA;'EbӶDHPd; ;Gqyپm{kSSSk #剄榦3Ϟ;Ao.146/]d8u镄B1.SuU `ț^>*Zc>zK }?v.~vbF8VDº!Dm$m^]ضEaзQO 3++wK͖5{=sk,^ۼY۶l}mF#! JoO$SQMO ^eEs6"HU^F/Djkb%:<~ϧyas]Ny2`fر='}1cǤCiֶCWdlWO4dc6v1ga5MFe?̳5Y?H6;vHw wc#0i4k9}>5v_ BM~aAfzz p518Eo"A/f(vLri4:WXQ³Wx3[ZZSc].l61e_t ӼcGu=\٧}p(R-ο(mQh֘9x(Df|BvdmRI3ȜW靝Y~׭7\\}{UQqqBM XV^o9f옴 7t@h6mv)ھcoBшEtx={嗎l'9w'}}}Ύna^?G];&KOW)aj@֚FU:$hCX?NmFIkӭu瞹vMaQQ81].WJ]m]άo=?Ah=eip t_k~n{5 Ѡ?Ld*v{< #ʑ`w8k~Ɋ! UÎWW5 9tdC<{ٕW_uº%6{EeEyC}}#O=qL] p]u4Joaeةټ66e!}ͦeeg= I!ݓIy׾-"y:&.~:~y~$YTxb:[ĢjqI<{dFLgE@9  EXb9؊O: !L벨RW[ך|g5X+7W7λIW~s;"Ay(b=W%m6OB>s[m6kV K]nXH COHgnfc2Lz}ɿkT}ttY:\ *h"/#u})lp',-Lq|>Z9eXCa/R#xSWLJ--ݍ }}}s/l<{{^vƸxJX_@xPqa3lkJI:9rLqiBj 8}C7K,T:S ٵa&X7"gpM&P2 F&sex-z|S V&,@,mDst`$'vM*cB stuvv95kZd09݋]{\TD`8Uz_۫Bd󉶕{7_3߻r8rTTV<ԓǞt^["6۷lZpAWkA=zDBzH~OFz Y͛75kS:.a\u7$&c3NbnѳYd?ET"ӱM[H 4Mw"򺺺z_g|ڸ3h'H0Eز^:6IMKmJBȌXFl>W_67ttvvN80eS%/??464`ρ:f2` t:&bǺ0IBl='Ɩ-F3' /]Vu#}&^m la`-W^ro< 'fcAQ`06}-Ʀs-;E dc "zcrai6(B;6jEv#fCxbaU=/j{7!v^e5ɍH1{TUL74=sϼcǍ6܁|xrtvtSOc6]uSE2byޱc?gڸu5tҒO euoۺÏ5oU)Xz1ՁmO٦4'Vfn镂‚;"-Hem͗^yn}'# 1B^yt on0 nnmmM׷?1ٱ*Wdeeֵ1% ^ Lmۚ$Dmȱ+{E]3 ̙U Y?R6'̺ߧjm\_FM4{^~~ncCCӉ<3 \Ov 0T1';P>iD~a+,˩GwBbEbHxVU|>e9D|f(RWY,XL WiGBKM$t`%Xh:V dEA4dkD ]4R -:  >Һ%Ou:A;ނX}u:- &|TBH R%' ؔ7mabth4 V7DNFL\9Lfm862'.sgdRk6iMC*3C_]w;+*.ݞ:f}3=~X؂U|.hU!FIDv\o A*g‘]Of&2#^]K۫xhm1J8_ IDATujm_yeO+$@29gyڪE. BYx z=Nt]lm{hh2B{8>l6 i6B鳎>֯ng<[$梼/9,GE4bTdpͷ\z+Lt$>,'%%^V^ޙOGcV<ǜ*|gPC$;;{i?BEf7>l}ƀn*+/x2R+T:6xNHN ^m$--mi!ZL XG3EƌȸM4OhSZ[<ؤu<,#m&`mUϩF[^xhmiY?e=|8N{yA~~&M*ϳES[$j_X\ o;.+5=ݗ_2xLXYuEHFI  `Z;?5ׯ/(cCܐi_׳_}印ژ5e: ꬖCmP"^q6t4 !t1fͪ۲rSgp;?{{(HxWyO:OTgf4'Cr\ 9n=Bns-W\wy~aP(y"%Duq2Ǻ PV^X+qn_JEY@ p1G[N6{;&xsfQG a?X#Q36[ju۳K>;'gBOOO#1EEٙϸƳES}b ~,7_}Օ.k B֎V@p"Ʊ5z~<0*+ڞl%^b{0MLv^Hoo~ZzzAssH2**+ʛ~tG}t£Y̾ϳ{ylNO&Tu/rQG[9- -*)κ77}b!ߍm"zga:O!U1}/BAvv{}GsUx hJjd}@7_Bv1.27lkmmژC&X-Zn|%vD~ȢApmlt&ft$z+֮CEIQ#ÅTuES娊@ы^bޯU8PMJMzIQˁ7/Ǹn<[^$| e#(hbIz$":93xR\ZHc7-@pL&}~ۭWYS^Ջ^%ҁko뮒 ai6h!]윜2{f0ۆl>@xWY*&TD}cP7ߴ&_w99Ih3f؊M7U߿3Z vQ{-fQe/[CldQ!}]ͦC=`k0Qنںܼ% msRտ .A:2^UHg}""0cPx 9nSDvvv͞sz9;" O@Fa#:X.{' pib]HK_ƛC&[jjzoR_W7SegggM}t:/ r8rWp8X$I=eAwQ~CFc@%ZD|lжE L93ԱD^jm^{AlGEGl߶^o|Gwwu8R&E O%'ᄃ #ѭ?=I{A(0a/mٲ):Jx'Uq$"@l{,oڪ̿?:ᩨ(eL6-)UytwӝY$+B6o3;'-3hnH!=-= /} aH=c؀l<@"N(/ϿGI;ue/yӹ DxW6m_b.*uuvM?xVv7mnw٥deہD:ڰ:!s^$ཏ5E1.O2sF bFaLTEqӋ^xAv"C[4^hX ѶM1I4(BMz%Zg3ث/Bff@tԨqEB:X M,kd~ԫ.xW H c!$cpVVjvϳ-Y{ yy9DgD*4ɮûox{ˋ=_f! e n{ᣋOv\(W9n0yeӽ|ZPE{ 6r0\a،Pҕ>Z} r!'m\$diDU&i,E;;lw]}u?H޳=E7 P8쒨D#Il![Ͽe%fuuuza.gd!5LD7kb!+$=#L4WB⦃|UU::::;+TSDAQaI)(,HuXq^dҰ}D,t`T ss HBz%rh4C ^9dFQt> I4{(&hdRM$R92 jm94-lnj27ncNpcNOSt;Dt Bͭ)./`3l=ˤIc}}IPUerOՖ!6ʇ62,`&QPߋ - b_7WPXT8=o@XI,}c.{·ݽo&?v`ue5Dԕ|qޞS| HY^{MMW_~a]hUQX"%U2/m 4?,3 Qz߾m[sΞHxf s.`q4wlmm;xA/7n؈IVVVZsSssLݟ*3ks>vrl6uY4(Xَ?/r`<^2 mdXA!Vy!,1\:- bx_x["a-ؔl~پ-j{_u\]]]@r|1>pOn@tSOǦ}g";o+i,l++ ?ĵǔ= QH)ypl߶}>l@ ޲)ܱhH0>tM`7|'}ߙO f{}$5 F5*ǃk:bn8?Y9R-: vöaz/'KHcɧV<'S6IϝOUb6I35ٙk#&oz-lt:b)4"xDH)YD}"أj-vLs[wRvQ fbFb4 Źオ\- r^':RU^@ؤ3B\mQڮQG^\kԓI,sf|̮.-7G?z;۶$,9̻m6 4! UUyQVuc8B 8z Boဣ\q=@ t I# 8}]Y~kdۭ5hg4g=ISpS߫v^^g':Y}&NIg,J_W[{_ xCɨnקO}֟  }ɼ']мg@8FAa*.Pu/*9C נmh-,*̉M)GǓVPTwuv.[x»X$}.(++Z%ǕpD@V>@;, o 0N]3y-IK~AA^]]]o/ƆT d :}L} u"'|ai!:vF1~lܰ./??sY>3m8¸Hlz.;}M 4HN@]~{iy0ջvTUV5KwyG((6ydOx$ƎabgnXQB"sqE YϚ>]kvŻ, ; /ƿUE cE-C]d“JZmg- T&I~(ۤx-zE*tu}m[t:%x뽾ɻ t*Ѣ9Od}ya]&P/;60{v}Q-Y|>Ӧ}o)almx~?7?e"EiDX)X_UK-j'.K,{y@UtDRRRR\fwe eA6*Z5‹a`l'aXg}v}.Ƹi$**KKKs_v?B:w^/aBQXY:p"pyUPgb?3z<ւěZF`56&>ZOvユ1Nwnۺ͛^6j{ݍs/́1,갩m9w|EMШ@ul0TGkW*\&.XV95x"X򰾃Hl(, ,)ۤ&2f3Ha8h7AzK^*4MCӴp }3ɧ qQߧC:N pt=u`uaI'MtM45]F454ꚦ}vm2K,T[H6dCYP.{~R[Sl,ql߶[o9/νˋa< y6lD|H֞p:fMfFxeSEE}aQQˇAO? yvۼ+tybm1!\1d$ <&hkk[ɹvhK, ].=//ܼ7K,d|b* ScUD7,Ӧ1nOG}~j{{{Iتqf>`A5ȶMR ߓλOD7VxǦ}l00ƛ5)PW8$ zG"Q`xyhѱXx ~? 6э"eF6xJ1>'9@ݷnwո\0hTt"%ן॑ C;µ:=uLyl614Y+=*deeeIV>۰E#* 猌OJ}~9]uT/ ϗ(`\1۶n~wқ^ݿKdo>ԩ<9,hkePx{YS}acli&:pŻ _XsxAƆƝ - ugL{@tX Z:MfnM3^G6O7yA$rrԢX/zi91MlZa\x0&lXPLJ_U(dÒ.Xg6-+4h9cYO-_΄ɓWj`5] ޝ;w?*]e&,9.Kl`R寪%h/=2k'4;z{{7Ǐu=w>yݲ`4Efwi~4M""Mkڪ3 ㋑ {뽾̬,}wo3c]26DUCGۜຕD:&q'NS(RLg965W^  H q3i0wľACrnW_Oc*;{-qݎꦋ/dLY޲v.+ {#j<Hӊ] >K gv#ԨE-\yIXɓ Sߙ'X^UPZY{ k/Pw$Վ۹#DxPsI}9K@'yf/pU+(x6f;HӴ]b";=Ge#zk IDATO Tuo|VrJ7EfԧH@3[a:͸qc~`]_w{{;8#Ϙ|N=;].3e*}~qؑO0suXV<*a} }N7'kFt94xۼk? E̻dϕHh dekmRĂp]^"ۼHP D}NcteKH1]m*WtSvbd"{߳ /(/+(RoGZWY6-G\%^v`_q t6!\TY_寎LzY &)[ZZWNG%E Ytʹg; !ߟγiH┆d',{!@+6+*.zc\3F1϶rgL.Y` ,^3AM\qF s_B0{QqC+F<1SZX)DKTPVVօx$=K$BA _ii7644E($''7bک_x`ZԒ.$2ǔA6_ ۈ~O:MG&bGt̰FѪz&$!}}rE""YyE"uu+j';Lzvٵז>[ʊ/Ǝ}1Msil6tPE8deee|wA]}X~>sED9Oz=![&[n BOO {Cl!yƁmTQebǓ.۟NЂE@< /ZOx<!]ޗG;d:#^s^Ԣx.48p*߀aj?[mRKpWtAF I EXee E>Ej1VP "(>/{=Ƚ]44iEM2B qp'5M+EĦx]WWvsŚo;:N uV42:ώ 0kg1g(Ӽ`“3^˝MiUdža YW^<1ie&V0F!@~< 5^g4//;n;# mm=O{L:.++[#ߗܗ, 3xx _iXӴT~2˩॑vG cϯPēhEU 6it^:l"ސU&Gۂ(NPRaݦ{@rXS&v}Oyu?dߞS:Ͼ)E%%8#L06b[5Miњ$Ra0O?_*ӎq|{o;MӬ4mϛ*8N+6VGD;E":+]rY4Qa^KQqщMc]6V6Qy?K+vMΦLUVӿ 0P2SװFȈ{&pAaBMwaK__t:#+m|NtYN?/(P$pmml"^+6OV@x8j} YRџWWdP94K^.'Ox>iZI 0&6fdqMǟ[ b[e##_5zE"!=\6{ҭ: Eki,#_sU@ >l9cvؾWl%p[CVO q4Ļ PXTY[8Y7Z[wy;::ڣWR6zti~GznD4i$ҭ@Ӵ#!7" EӷژC]ПnyG_z|gif ƸfMlQD̬ŋ}l{岣1qXǕk?$Wɀ螷B4ғ5mp___5R3/(ߝ~ӭ7Ob>,!{ډsr!qlh{LudhqZ4l0p8t , 8`P( ?6) ]/I2XGQ p8r#R8Hx;V1dVe#ـl=j+Z}Пn'O>v447LJ@6%)r~?mٸ +YACh jOih(Ud]D?0N&z7;qCAIIIm+)^oCK&:+p`OMbM&N,߾[o7sGӻӣY:o:w9҃Xm C$.v`ym+ohVjfm KJsE8ODg#:/F V";ڬ 0eMI}~k$+k]Yٞ(;LqЄw_jD:ս#1%ܠ\,oNNΙX(Ҙi~#P( B1-jnifm&KHӏ$X0ټڎF[m;`Aǖ,WVk}W:΃Llll6tMJ)b@@5/hBE-04B~St] )ƕS_Wp wSt99Zj:=ZGǗxdz,`gv45#EH/*.5W^_Huc>'#eEF[ k4m1K$㟛w0{NNNzKsK /(H'Y频 )΂D9inwA¡0빧eB ΀1o|V==a)-+J8iRg-݃ MnƦTAյ3eP( BGؤqºM9FS6ztWkuD}%+hNn% ֳ:3'奋_?y[6}40 #+)bmgiRH#Gˊ輆"@ؗT,x i3]Y^/_2=XUAA'ݦ'v55͗\~$"p'."sﰂ32DxtDi.p뺮uvvU( B7V=ymb(k nz}++b/`O^YdGG&=ܳ{rO=u9yy7B4uM7nG.N2/,+FotmBȊ4~`66xk5M&ǏkjljO>YyY>u< 6{m(a}"ll=3_r#JwW6IDB9~m`'rN1q[2GJacӴέP( BxV0o_!TiZF QZ[[~ ƧMd\^J<'|Ht {}lo}k61;Ml4nOl3)ֶV_E~hM/. l,,ў. w'MP&I탏?a3|= 畍.K_| ޭtdEKP9Ɵx<1;Ft|\XeFo42";`;w\iv "cB HdIXPӴcaM=yivjA -7o4 #iFǓsʩsJdv&38nu}!R1YO6yļ``U5U> ҀP(F6[E h"z>eKx\]4L< H B:{[ӴRP1dK?jik{֒};ω|^>rÝޝ5hf/B:@Gp{AqmmF)z/U*ډzWV"Psь7rU2c!T MӵgPĽ/tf|Q}=Kt}Xؼx`';`Ż fӵ{ˡP( BIni6@pŻ,C!=#ӏ?5[d$D '"|"%ܩ/ը/zꢅ//]++22f4vԧ0 Z-nDPΊXEgQB9uHhjC)rvwuw˦N3 ԏ#?Ix~(=J(w_i 1croij6*B >ׇ6PEF(y PcFnc?,OC R]UՔ\Xe.\CWqԑDr"J]mmo.p~As0 杏'XH"7O J0IԴ;N}ƊxEP( "^l6#e FF}Â'FXcLN%Y|$ǜsS>iҬtmo@`iN]'>{u[\ZZxjv` 频Uh0zh]tH&ӓH BW~7esXPK{]P(8zn~(q B,JEƕ}nTo}^]. .Eyl$u<- jrw![{mw\u.ӑOvp(ɺH3= /^44#.4{vp5O#A:HD @>wZO8t]?.,>v_Yu2"H 2b~ްVK(vx[/B}u:{]/}'{uݑǻ,e-/>( BPXC˷?|pgfҼ&-=;mJ0% EoR*Ax^^|n?'%s~>b>rlva4٨iZnaGh!ZZڜ.o{;"|`EQ5Fz)8v&bcWqc:;zxf%L rO{gh}]^T;C':O.m]"39e0M}>urw?B VeEroP($Ѿw &v/8e˫EOz/3+|]tNv͂3봯ҬF @mR3.ՠt]/Q9FQqG44-hXSur3B͝l3t2 V:vMS(qf5M=HUƕc&<³=7YGE#Y1vU,i Mo #{zzc7^}ż.?wޙN~:W4g"-z0/Xr~ .hw%V#UV85zq\VZ"L\4w9d񗖕>Û]{#-{R7xx2:3.YGt5V'+'"}=@I[7oiZ]eyydl'{<$2"}zzzm-7^M{X>.g uU}2kgIK,yc!b=?쪆-a%TO;` kƋgx#O 'bE_|!4cwdnx8SiJ5 O?3>h]W4hjh83v{ꉅ[diHNvX/5b'~_Sf¸*O>Z3R4<^Z_ bKKU/񀬇R6g0=|yV!vmPRR5_տÃXN:H@6gcL9sr>HA(*`+Dzq6/"9#Mg"a=Y!?lx;-/͚F[69?_Y Gw* eHuaqr;jsx3 8Bc1͆aT٠#޺Ί*CzuV`xBz $,3}PGHUMP ;!I3-YԳ{/.w&p/ uYۃq@ҍHB_4.MvGe7UT;N)Nz ` Tf%rdg'YFi7-/V-u<٧zwݎw4{y@<$ӬB+!JHg5؆k87Nee/=B,2G};vv!\ M"nAs/h '_׭i 끘lݼok]![x >Z=[4=%Do};"*bNp軼c%uVz4+dw]bnqq20*YHW޿4z?/"#$E:o_2#Xytd R;-MK|O-_e^ѣ{?u{nnWDܼ<}n5MS;Ý=`4]6^p'l+ {NPqB(3e \.gWggaG> w˼7h:~/}׿vo4m6].s/Oo"'㛈F,n/ǀHI9?%#s>ua>{ou1` OalHCHO3|,j=t!hZu"KuUUS^~~[HT:Ҡ?8mN.0 464]~ռ=֬28 b|Z,OtlX7enOcBe;jnښc*O9eL6"CXiߋ^GT:+? |'ֈlp>2ISld!s>?.oQ4wlC]h/?>wڟ$;A$B:"^&`z%2gz .l M7Msa`պ復nWĊjofvv?Vb*,=!QSբpy{ "5An{Ƹ !3yMMMGsA]ס^g Htyh=\%-|\xl@#BhŹ6ԍ;6ﴓfہuu2~ =<udu*v]B:@ z?38E\GkKN5xbhl,]$Z$Ad2]ƆkxOfĂܡ/^l6[z.1F1sxB@ĪսcՉc}M@Dt1rǎf_,Z0VNoLȊ<RF@uNM7N9]5M z `v!i4MdQn"b~wgg7`w6oY#Y":ݤ:+`=R:VB!t]?c\")󫫪]3vGG vswˮOPu2MdKMEE.5l~nOeE3vum2=%N:uʇ_LӬ4-iGշsyc}T Q"_L&w +Lg Yw)lG"T*3 \ӿ!q8yHDHlbIg 輺H[Av+:Ym! ec܁14mf.Qf"ZZlv[Wؽ~ G4eK gjwVptx4P(2 )>ZiBh 8TMe۷m[=|˕:4ӕ ,AkJOO4o4M)_d떭 cƎͿW_ht2թ/YVBzk*mDt[j>J0YLhok93tG":ow }tx !;1g9u9{,bt c}}ݗP ODY4n(o6)"O8Dϻ})u}qc*ݺekCfVk /zv .jFi;8.+'۬<m2(77NXP `lfa:'꺾(QڛY]kΝm Kf "1e" ٌ+IgI'iYhq`\1۷mMseI['YXu >OlYCB Ii;+6L\h旚SΔ[e?Ȃ/=pV:NП",1PotVhX'ޱD@V@j:KT 0P|9gOdۮ)N #Pλzqh:n?_<Vw[R8p,_Gb;5< 2嶯7E9I&F;&  <N³w <h=Qϲ<.)-=p40oMF6ڦiI33"zቅWu:,y F=b=BH,,K.{.`h%ǑG?xW̜ыOZNnNFZZAwz[t/ȌN*w䉚@v1.pop; 2v7MQHdgvIV=A7u$0;""!`M hߔU/@| E?Z){( p"JREHl.(,̺Пk,AK$ԾDBVDAAg~kiN-,)n4-0oLӬu}(Ҳݣ#w~tht5uFõs B!c&k;Ƹ%ES K_].rV5BtNLleRV>~all3,ΕN퓕oQh"jwQ_"*w'Ɉ[52m1N÷0~P1jkjZϻ`n,[^5Ґ%hT~"PHYæ_T\yRX%5 jkK.+'E<Ǟp|W`!P>a<57$Dۮ71sE~lT}*).hD:=Q:%@|̐f AT:Mc%+=8cS^[Dwzb"6@ ntK/vyb~De"]/;6O<"v 4 cqK DO> Ӻm_14VxB:Kg `5 c@Q( +d(-+oFMr+7Y IDATG:#~nu&S1`=W؃M!ֽyӦk_GV kF!Ax>l?V $#_0d{r83c\6}Խˈ$Q%ZLƺ`?/EMƱ,aQS]ݜf,AXFJ=֭]"yѦq%ݫ_LbWT:dYi)0MUVۉıUbSRDq&vA60oMبJ@W$ UUu9'|Dz) ǼeF[;5L$ԴcV~B e|{Oz1hv`4 _ŋ-=} '.ho3M -|AU捷i%^'KuUU̻Og7/ᵁQL.ux$jw$#7tZO>dv;nv͕W~Lz;e@lthl HדFLUZdHuQi /Vwtuufˋ{o5lJ'<*  iG7V>_kOƍDAJŇ1Oen‹D0QtV0\4LkP(x|Vi`q:a7 FG/gMmr}=pe^_b7y~1C]Z )Ic0nv:4MY9'Fƍ]|=l8V3|ڏ ^ ^b:|ЃiC)N^'I+JB1r=<\!|/ƸYӴiSljll>g>q|lYBoӂ:;nys hlvUƟ7f{<CH;EfT̈pޓOgUxi#Xd a_A3g\SgnRWmMM 0pG90Cz&Z 9C@G%M $d˚x?篦ivhK:0g<VC'*$EX'rQQ6nQ:oLos])GjJm-Y >)DH0j*ɆU%nLg O jexX'ݡN$v  [F{RGT}RDn@rɊ1seiG꾾-N3_cEkKkWmMe+/n []=9m0]?3KNi544][45Lt4544n;=ғO?N] -.3"LFHy.JL? E"#[}Wԁj{+LySĈ榦rh}]}7k* /Fz` }_⒒?6mB8אl[>/xc;@,LV~cއ.ZuՇ⓰KGY cWk7zIo=sw6o8oH[2I>>@ix(--<p-]D䀰 +k<U" [C&kLKO? 2W]Jt]&LeN`Et@p\XDMӋt=tgfo 4躮m>7d===hZnXTL0u!TqK7E-)8 *~IRgVKoLF?'Y[aӃJz<)\z9W^}Iee;{w~Wt:Ļf떭 'sܛNaoFHO2G DOb}n0MsiB͖)F&]]]EEK~z=XXIQJ3vjvHJ(y۷mf4<|?.PCLjuֳET<Ͻ߸\r ĦҲ{ 6Qg;s:O<#S#O1=8m>_ωOLÍ~-- DtN쁓?9eXӥ'$>3+;+meU.xG 2]]]fkkgYY{Fvշν[nz@`auf$Nu!McDž¢MSTWU zeEPo/4 y`Zgm+ap%;ұ}{Ҏ XWBzC>x1|6ig1%_=k=#9TP(¢lt7P>C),,Y5d|NB:) r*Xo矞vI?ջ'''4,B6n%ʼ%:>Pۦ" /wxEU%K.; Џr8J-$zQPr tp!$B*vؖ"M,ffWlK|gݝm;wfW6I$Uw XAۧ5tI˂_xEg%@ xi~6[$RD׶c)/tH7LV5edJٙUެl6}Άkiaz#Y֍ešPhgREy9俼ֶ&--md\;|g/X|!H{Ǩ-}9o _HxK 9FדmkGѺT=7/|yWU41%#Ӿ] gu~iθ!V)Mf?l$adKטd|\xE( aI=5nÑ:NSsss5>//q::hHv(8|m &ljq"A <1^gh!^:\भ4$D$xlK $$I%I$YR0EV]a\D%IVEʲjb2E%IBDeIB WdUdԙuQ^QU%$K3ukHpUUk6l6{#͑gZ f Y3dYwDp8\cZfebݟ,o)dI~GBlבWO$6J[,a׭1KO>SӝwʊrG[)m 5; Wb6~"N;,uotc3Fta(OKCiqߒ~W_ ňG jtDVTUQTZs1 kF(+-xin\͛6$)r. OM}Mimm]2ZMO|4ϾXcmtmӑFi6&'=J*`[pjI2Icj=F(Ý4qa'(ɊWyF0 9"go|OD8<YS%ezjN8oy|4vF k5; 8}$kSB:@1(/977`A<P bXVzA"}Xqecp(% 5 ]a>?=|~(9 ھ@`h4FۑVIZ,l6[|/ٶukMQyg++4bM,O@gy󲮍e7Wzq,хYot} W[Aj4 j({ԙ=;y23~үg3e򻞘uf7*Nnm%yeOH,D@p2 owA/' ْ$&<HKsX`W<@ NOۖhN9< "av"/'Ærj;ߖ-VZ,):Y (ќĈN%F {d6_C1F*&ӱ=^ ihG-]pWt!t:S7U{@7*kY~;;I_*@NȢ$H!d_3vH$l6qBm򜯿ZyYIIo8hK^1B}jkj^~ .EQL0/3s6/ăt& V9ܲyΆ {`ń-侂-xEbQZ9/$  ӝ9_~7g]HqQ<]0h3!F Qo~'qz('h${=U^cb__}ommi Cl@dNhXha`:0atZ=ðO@feXmkŲw,&g۩YitЇBisU"o.6|v?dz2=Oƻ}pn b#ӰOLrjq-,EQ&v 쨬lX4MzÚƝ52&l5 !Ii91op(d2<הP*+*&LK~(xXhDHd-}Vf8q Y,P %x̇U9h&@?ttt U \؛{/F̍D"O7C3"+oF NZZY-NKB򍶭$>A}Ѻ~ՏuX/RY'k"Ų82 ޵=Wt('"UDMVeުgF3L[<3x:Dz12u;/=\<5)q+vhe5ˇIo<艈}m->*${Wh5-vٟ613+sJ$Yc6pN6Y3cfX蓏e %)6 g_=o{wHYY/s{ff ++N.{B+c~6&a%o';Flm|#l-'ZGl>뀃SGĿ4 41ozƜx&4xB }=h$HP~[wK 'h*X J#:->+O0i⾝b:*Z^➌Pl'$7][yPI B)m|VWgWw*q^.vBp<{{oHcDuyH$yO+srҿ >K|╇-z8v=ҋ-.vG/(8:HKO/M{}⥗-.*jz̳Qh^xDsrxRd'F"042t"@O=1yXj]*OQpl6]_p3"N'sF!M@Iz+-z"$Iڷw~[MMu ֆTbۈ56y,|7rm6˲hD=򨣆25V)Y;PܼKB$I(^os="D$I@3.H^E! xڱx;{B8$Ekj/BHU!YtVW0op{{xjouWt7XbkzB!idF&V@iiB%IJrnw]IɂM/^{`ǵ7FV=~$;'iۭYYYyJhih<`HGPw?zs% ?3_lgmh9pUCr p+#@&{5MOfa4;PiFs8Es4{xF3EtyyBQ:EBD xjr|k룑ޑS[i~Zrsp'ӎ:'BzB55k" +[}iIz͙0vopxbIzO =l =w‘cP0 v]nP__%SUqKhʥnel_}q'|ҜA9cGYI='l7jNBHO!X("!@e埌=`kR}w{لv\:::6Z7>aYF|wqå Yee_vrz~#{O>۹s[n^/WVT45hStYB:61iXoF;Ґ{#0a$Fb.t׮\|i TnQpM@ MnT,꬞}y;o/$)RfڦvPҶy -F^˸߰n~HS vg';؉ "(q}!^os4 D)&xL) t| >)KD v~5 hCSXXcauy=oX":k-<ܳ(㑪L875-+#lkm{ŏdIugܷZx2K&y6Kvs^Oa0a3!Zۦ xNH't5t)m!2zqBw?hc;*yN$brPϝ8.۷sCSWld?hYᎂCsb#G ++-/wޚ]=vҵW_Ynx`#bM42ږ]h48xg904hBh$I>i0[,O~Ik@f)ʋ/mh lv hzC-r{N>rVH$RDj-K@(*NW^|4۰kijjvU?ۧl߶zC#G +-)){rSwr,:z%}7C!ik٭tNUJZbNklغ W?+JLg tM^?#T 7/o402 ֐9hba" Bl6_ :^0tМ7<" /'4CqP(,=~'7/Z.!}ZOdipBEQB=m9{og:t{bRDq"{D:@&4;.̎zOf󛯾pu7XBϑD:h┞e$&Ѯn``Yk ftnT!T!!'$r3ҝMgnX,OHӰ+,a9̍NӚ֖kC:Y"ֈtr. \H'ϥ5S? |X>EjigҎ$6#ZF]#ˢҒ 1up㏟E%۷W? ߏ,,QVZV1e_rUig>hڳO_X_?z abOEO<සiY۬cz]ijID}'824ns]FwTﲬ(6M6܈NYadJI'91S$ſ%IR!Bȓc)%tۖ͛[IX L#/=qU<_׵z_ 6P__kˮ'G^wݤ?7[SG/<{;wl^_?j ?VVZZ? ~kӐ":M$mf1bњhqD]ML5Y,#zJAGϞŋw 37yz 20h.uB^aDu몰 Z!LZc5@Y Y9_,<FkE/(I>C)"GQu Tb$>_N$Wk"Bh$INc{D5d@ G5hƴfou \b<@ `Ɵ~ۍ7st~X"Ob V` UzPۢ>@ҋ.(x^ÐnxIQq^`@ eX,Hcޜ9<b0Ϳ 5OPw& ceym< P֬IOL6r:IV|D:߳|A7\.| vb)˲+ mD"-5Vuf;r7Y۹jǎ͛6@lKI?ΩOLagn/1rTaA?B3ba5553g{j3fkZzs?m55Ձ~ ۬w'Xy#iihѳ]Xzi-Mz)wa?./)+- /ZF P%u0EؚFrb\eB߂v>eD0bU0 G`)LN~쉆[︽!N1}d\UUѨѣӊᤧN t8"_O|>_ ^ mwҀ® %~NsFd'h|*s@ gj~ŬTWUv_쬭 %x˜QQ'pER4'U7Ԏa/vօVO@wt:)cIhBtT<,$|Z]ǂx P %sҮA8 ի;GBM${ C4Qǝz~ ؂NNxӻaQ8"P$Iczsp?x D@/@(ZGHA1X 䕩8d(@ 1>9f뾟7{ڴ,Q]Ȋ3*0k(=ֆ_x{.{$I]"qB$#p8hllD"QGz#tY,sƍ~͛; vsɵ^Y-xBè'$X^Thk } 8*+*}LF0b_$mrٵyۈ8މnbyb|Æϼ 󑪲k^? 64o}"kL-n7EH׳aX޷ҍnӾM)6v`a$J-c&H7QV=yk/lS6AXm<5 h(9M$o ٫8Ih *#4^---MMMvp[uee͏~|K; /LϿOynT wňF{ID6N9 榦Km)j bYe>u,v{ܖ#:P(Ծ7ޓZ\>rD]  D3pE n݈-C+zx  Bsk| H$=zmyN1&߸s:K` t\eXhd'~ŕJÏ*(V!kGFDwok!4hoob nw# G=p 3Ht0r%+>Q3_H ]hb:i hJu' n7;F[ֱ@Cjp8q2luϳ? bR h,A)eo,zSHGdx<!T.˲.` 6ɤddfz6-,/)\kWF"<_@|Zt,@ldc|oX,FDtsĚ,J@ d:fzGv?|xwU~ ]BPOM{{ut=[p0ndu{"LЇ$" dXI('͑永nA|b!OD'h2\f@(l*ٺ$I#` 8uufT]U N,(j&~><TQ^c/03:k?SĞx;F_Pz']Ǩ=B$*ɍoj%»Tl!Dv 3.~-ښ7 Y#Ne@ `0\Q^0l9_~aꓓ7ܡIXXM` ݤs'T:v뺀փmg2>Ť\FeE9^+$P{{XQL;;P0^\\d7mj B'XSx΋co>Z9 [+Ӯ3=k`x@ I0 gx_xi֢6Яh(O0Uxu_K$Ibz RwKKߙ18?+rrݍg?gȬw+ f9igi":o-иH6A6!ECfeE^RNHOk zZ:#<ӯD &@'0diyC=f_c#m6Ku83[,W"6Jt%`> IDAT0<$gֻwS1@ mD9(t6YNu0bxa AyeEŁpog֎YN(Z{À#Cmϳ}E(RjYQhtAX__ 653;;۞h׬ٶ|%e[0-i/^>O+FVzyioU>+LN@  P^VDwg,H\(p~_Zj{~A~EA/w_sD9D4\%}Xpg{$$wtS~'5E"T꽡‹/w;zSDts 1Kg8%|4e9O'"/0Hhd5X hC#prrmmmyzG>pzo6WN{A("h#Sʊ bQJKJ:we ; gA/[@ DA>=r?;n;r/_XHoL:e0^['α:vy|S2)_wcܙg bJwAAYVܲq~xs g9K6"bD'wnL{@i|@ }w3"D ,ggA,tO[XpױQ@<OI:(_\nUoYMCKn̥9^X"fD'ꪯ^ioB@A邾S<[m6;33bZ[XjӒm/*w&kLosgAy~ PM4Xqtݣ5+ (@ !`0n-YxzB:M0}:˖,{Gyo2$?Lܰ n`8X|yC3vK(Wt^:mMu89Y06c0a"#Ik$wHee3fv\\_1pdn$Q;+Wi,\}7q#rr_19@RtHnUX郈pZHÔ֎iAn#ߙ1~UUeYN+I9!]D=pBzZIIn$p``hA믽r>H׻+I'fCeYvi t R8zTv >:}?*OY^Bc0~l\2V!v4XvW=s1^|S kkiiXOVVpZ[҅ K˶o?x_Y0b%x> A<w-mֳ6A54mSE_,!SGr#Q`=`0n 4zM\w`[PŢfOh޴0Nۉsw(Ӟ iv-/kBCeEeu70l26VO,wq'ӐfPol*2TQLkܱ GZ8PM;Zb~iMhtk4M#opǓqvn:D& V~EHdWSU+ٶ>GA,x9gd Z*'b,={@Їx<1cɲ,yn0~Wi"}rư(^GS;o=|Td:j"jv쨪zPl6[ht5[=7_vqgΘlFOsԒkLA'p2M%Ί#]#x!JXн"!ُEnd w#q4&iHBHORedڋşM&ӨFc?C3~3O3" MsH v6,Zoߕ/y~=H5X 5eM?RKK˗8ˀa-%Kjj+W /<_h;t~K4!d7Ť_.,DQ{m*d2H~a o2?Q#J #0 A Nx@7@/hp_`EP(y'O*#>ߖ7 @o%'q[/:lkcCO祑 -IFp8np\Nlu沅?0tVڙz"kk^Zm/iB9+<+efW D0 /7Oݨ@y3Kw~윜=ܖt3Mі-5YYi唯JKW-<,,\MD'}z6 `a$>'IL7Bi򣏯ѱl6>S<OZwM76y&4`yz#jpVPHB:5'-t:'"ҷ3n{oll52сG+pkuh6U̠\b19QVZ |\É^gB@@4ۈ'ִҶ@x<4Ǔo}i''/{&E9d;'xٷjӺ#~_[KKj=bYrٲǚ2qY-IYzyOB{%c!ڧ@`{n_7g `xN R7\}_|AD"&)dkqpԨApw?|?iDm~эzB=΢#a$FgML41*ٶ1.1='ӓnZp( ߬oBb ow4Q5 Ϝ4 `IOknin| ZC+%ƤVEkdҮ (k< ҙc48}ԳӞނ;z#yEoDu8x D%IJ $?pAgia$@  N (RTϝuҸ|Z lЄl#)ݍLy@ dYq-H*Onlll|„̘Yhhy";-=д G^9~q=DQLKѴnGkPҐk_[SFmy,IA?ӹKqhyÈޗNbp8W"6ItǐtTVT}ͪMA @ 0-@ w~;kw9}7=8Z6MٕO(mQiAS^zi쐡AL. @ccc$nl MJXD G,7$xn$ g# mּmaC A؛~筷}:Iik=aTow/*rf},@hM1,B Lb1,ғiYbA0(w'ÝFՙ޻{"9k[ꜪAڬcS۪ϜaCBa$Rʪ:EVj߹ᣙ3kx[?+˷Cx'=#q.K[œa g!aJzֹ݈Q`&362(q4+@ ![ÆϚ~'5FBƬz Nbɏ=juu}pP;]N_i>cTD7'硽,=2 ##ndk/DkqPyi[wGQL~c6RGG{t,O<92 餠(qxF%9$i BO)-)t\"Dhhb W8g $4xZ47Ij}W_{ۚ Msʩ3#_IEe$)Ɵ@1xm7޲uPA `9yuQp f_dǝÎ8b{QuUumj|ɚ'ku wVciCgwK.j݂Tu();4ɤdx #b: o#@G~@8zY82WUUs`ONxrN oG9!TJ߂kW`DFFGf5JƯ]"E wyRUZ!( P| vRu.u8!G+ϟ&K y23F$?dtJt@92wX[:Xh^゗Fڶ@  v5sܱc?!IeBEtU"=?ٍ}]ݻ3~⺛nx&qH^M0 FBHi )jDgDئwU@ڂJ g@zJA5ʊrD_<APWWB43##d2+%5_|XQ "@a˵Fl*pL6l+CX5aQg@٪–>h˖{̷5"iB)oJwiY>^G|h]~AS79!'` vKmۑB6#ۼ;_ULG`LzvU8jFԣ>zhb:.dF -vQFFzyDup xo`mf;Xn)-)ts]+;i#ɵp%pB"+4L!}Ȑ!w~D0it "badZ}OEb )@ 6j٬eeӟ{\EQ9`Nn#P:ORDžunvݏ=؃~Ae$Iy$}䡵9heErgz6ol-? !;Ym pKwyc{u_?<5֋'"0YU ^+vī|^&ȅi##qhb(Y_u5WN>ܩɑlQ& Ҝ4ctɑ.keYg2nGf$5h9-k8VNktBz9}ԭ>hG4O(r]iii6ijnnu$qm0|>RQFK/e|"4A,<7h.|M 3A S}/{[F+9 6:zgO>jӑhl6; $fYnOfWUΟ˖sY=4`F?# mMڗFm=.E[ P#%t ' @DRR %tMԛҝ?u'\|/(Zph˖aÇg~)oX3Wz k)Yh٦Yapa A?RdgNN >|~'MFDrPn.H2YL7݅h}p4`2knÑYk ,,Q5)O-SXf$I$ 'vhZ`gB4^5]u_ -x@ x%K/oÂiBzcXl[wک'*IRN]Ydg3ݶž H z$ޟ^KL zSLi(q~Q@ #//+/㝙r;K/]:)kۤ[w#5l뇧Mr-Vk|&LН][ZӜNn-)..; ׮XQ ƅYE;-6 7*'Z`'!"z<ϜN4x-Pٛ~$ ++ꇍ=WK:h6 z:Y/%K ^CwBPS\TT;jo~5x6o&x3};o*wN!bK"L"H3Sy?I=P[rrݍg{U>475Kdg}+!#S[вȋZƈx.@U xzy;y\a`o,ylʓF)2s t:fZu(''~eY>bD:ߗVѹK3 ф )ͦfMWꊗ:_ZzIԕ4o$^.;uj?9$ 6l(nit-:Od"L A1|;*++_x?SnlllXAx.[zHA펇; 5Y#|+>9hɴ[[ZӊݶϯM݉~6ھ'^=b4&xN~tdmښJB؞@hӺGq}ڵ {}7M7N41{ݥ|5D}w/o[ 2 /.X>b-,?I1%Գ|h,!fcMC4IJS&S+#@uu_2dJ?]_Pog=joʹѶFEt1;7M{`XMoAgOD00(fƴ^>"3?/n]~JCfq|U5s+o;&1DBe}I~A{_J 剮,7f̠ys/%iFDK 풄B r~3b^ZF]!1{ z˘g5*ԴB˗F!Z#t@ HQr iinnz뽷;l,D3HgN*V`>̳k׮~ 60l׉b,PVr]wzU׬Ze^d:#='%[M0)Tz.L[[;50IXQfl[v ٗVluku}KOԀK) 1e1D"ssLIZ[CwVtj {& \:@j|zn6f'x5k;˃ޏ Mۼ=uPF}~SR ^O8,z؟L(* L:4;%seg9:B4%o뮺d^.*_ڃlF:5ko+&o;2=N>G6SB صkf 5>kE t&S3oE3U^[- 8RC _(oAcĊeۘ$=':`f1?Gs hؽn3lN=LB=pbO6dMh0d20is4eLb]Lb|?M"/r`im#쓲23U|t;h4"%={Ր(7AJw k6z~F.EeMdvok&`$2ʃql?bNj_re(YF:JJL\ {5<AUr2RF3IDXKss=~`#U.V [oS b``^sŕ].Eg9၁O6EX8~xqoŠ &mo=A=|A㯋O:NPtRg{++|y_N?S^`Aj۲`:Vy;{cM`sffBumMXPTՠŌtJROaF(r6PO%#XgFO<s+z~deU3c{]w9=B+K9QT6_>O"㷱g|=56T𜚵ڶ)i8Wp(a6>N]vfGl ptr.395L>mk]re`ݫWf(\y兕M&adzYIX,^OIgx(}ז|pQK_5-e\6)cY[&@;l}*кFLh4ִac)'WD@*AtޗaeUs(0XKVwr˦>C 4| Xߡ|TX{VN3Â27 E9B!UHi7\{ U4޳_%" Qv*Oeu i6g.䎎\̘9(eAd`ceׁG6OB1x+9֔N?-w&fSl|A ?zͶ;?<%y&Q*!+$IWyT+bsA Ck6'j[X]5@2LN~IOQ=&ulұaw!0k-6l7lll,KKJJee~zCf'ͬٳg[8䀟> 1aLo7]xSR23g(nwUՕ.~+ }'Rn"A|ѽ֪:;n3d_4zh4IfUmiu˯rن8+ bQ~;5#+C;`:_nJ|N9)ZZ9@PC@^.cS~X 6fNQtxr;4M{mm.f7[tgcy|s?]l6[fې3he L rlM Zq!2hYbc{|ۿ~J148>%0tfͱO*a6nnv?5 cn&KwC_5+0Dpa2CR&}B)l=mM)X*(Ga5QI35L^d(pZddbX5%:;;:{~3g̜^ twwDeUUU SWt/7}j3ѓ/w]X띑jd;꺺@%KV[\aPW ~S}1:@)wǎuT>ni>i2XY\F3ɬ^yࡍ_' b> ՠ,t@:_GcYlϏ9^w#=%%+(fʎJaRKs0E82_(ߒ=vDM@Jt1L7!U@AmZ,zmN;u+/l)^Seu>~] z>+E{* "cl :?e؊VtG‰Db]ᘓNt74DAfefہqra# xc *`zmmmoK9eT|(WS(~[hHȜk\%0',NL-v ڛL>mQ}5lb[m| V0p:S8}=k@ieUUͤ:u֝w-?m'UU%kO;xv93<@ȾRz=(.[9a!}ܛM$h4VS[S#m(SdʞH!:'Vlݱcbv`. K{{{=;o}5i*X P=pb?NYKook+ W:GD}OdbAPyVP3ΚC/q'jKO&JL D2ko2Ŷ'qҕE=irM}H$` :Mx}9gm}a/-94))):g͚vg_fA<| ya0 WTJJ}|PO >SHdD1M4hgl]xiin)))q575OG( 23`7mlgQ<Δ?;h;o} =0W Swl|G}H~D__x;8`m7w1%ߘ"I=AK)u2%{n~c5{GW*2]X @'Laצr!j`r 0ͮ5|1Lx Ko[mU酗n}ឦi&7߰|Rj'~c#>~ )2'Ϲ?l}b##>>I&ʪ`"H<~}|-}")=Ec/Nv\Vx ͧe\hcFL֯[nM'7I4"`@x >'HoxWb/b zeg}/ϞyzyH|YH]v`?&҉kdM(L7a| xmm5d6V BC?l_hMؾl歁{lzݾuo@YuDLSF6Dr^ɠO_{{ݑBz0}.@0kJDy˃ ݉\dR]SSvW%L#J.&DN/J&PF: fd&?|Җ(cj|]Pa@! .Ճ#_o&[Ȝ_lYsYoǞp .@ݸai=OQTuk׮+܍{^{:44Qs57Y::}n[VVl[@HFTyuQe@P+T9w6ɾ( ۧLe=~k4376Txc]wcW_|XccKDgע2N"`B [v wH(z[[[ٳ*>|zL?ʷQ6|64EF!UH|wWڿRpί_h:hny*3EǠ=L&; )X .\% KAU4Pedz:5 LD"9 4ΘQ=444W3ﭷ;nԧD}z@}?p|e IDAT26+C\= h!m}~민j}Rg0X."B(^;D){*r Co(3:T Շ3îE35"=j[2$k*؈m6O}'qO+/?4MiUF"'ym7߲ɲ@uUUaO:m-`yiYY |ǾāI1YOٴ"=ie::kYDc?te~.llʶLEi>6~OnF"tvt` n鯋z"F-"=B%z_jnLt&`?DybC7k/bxlWQB<(yyFW+.uN AOHm3<"HGN1-!Ưᶛ+, vlv ÖL&EE}K 5@h218(fsvLsSSwEee"ȌalЕ).k/JO9N$y!!7%imi riی A4KN"8f+^k þ7+Wt`1eBgDJ f11N (e 0eR)SA! 1k?*k3)kL-The|b7B5δ|Ltf2c6ӓ=k3O?󖕖())]헿>{{-Mw?;{U](bXW{{Oumm-y} 㱘 tLhJW-rY:V_ѵۀ V<ʂdZh_Fcc"h4S殡HMmMy"X;כ2B+lG*N6ʧ;]# u|oiyo3k ,)z[[[Yi'˯\>L/LeQ}BVmn^v,ZO* -n H6{{z<"fϪ{WpQhr3ou<&.}L*oA Z[c/m!L) q/)c\TV I%wav`ow9,aOArу&~A>pͶǗ\=rs幧6.s6'(%`Q ` TJH=u*UA+xgb̊XQSeM&䒵MoG~2&RMEtk=k]/M9dwصeu}CCQis/o7۴zIs@GsDl?yoF@TlC#UQzI:kA'*5;?8;ayؾ(ڧLZ=.k47.GMmmEiYsO?244-ʏGXf yq/GtEon٤*>zؘr/غW}xsvxoᢅ@8nE6;]X0d2lsu٦vZ][nYX\ŨU T.6y`짔=#6v6.`zCcctlve_/_ X-{[x`>;o*"brtaN6gHK@?MM5hrA*j?j,eL Y5֦}^6Qw\P(@-`#}>?E=??-;Oikm]5`>QRRYz39{mUmmɜښY]b WTiwh)*p, DzHvceUzPբ1ӍT~ HnDCTY샤 TFLZ[Z:#.Q z}^O(;h5O>ş|aujLف1XEYQ4;]% [S>1Ὼe[ҋ.qN}v0_Zq)Mkkk_$׿l4IE?_42ۜ.k> 5֟b [l^s/3M]d2an3Fwylt*.='qI&p8%=h37f.%paSd7kikRz榦8cK.M,>X2!ͷZkgl_tBC߬ YRD}d"kͫUd[NWE%T@M>0Vq`ڈM"02p1@@h,nc:~%,_eGGǚ`0Xx9qihlfqj]ʼ>_d׫iٸv;y ~ 6NN馋)h+H,-ǧ{J#yX>VcNh480M穫|%}}}yvD"^,T-llԸbCb$eSҰc%6?1h8睿_e0rtڟ|U]1$[_P9yLtvF(_VD?Á MSb0XVAjLBs/OOCccvΘ9۴q ܒt_mv{ng~5$aʅH ؘU132&ؾ^=&xμ248 /׶H'p hs8[sO;nm))-R@(e`S)+2IË A9G1 @bծ6æQ JAvhՍcM4Y0=%ȃӟ׳Cvt\,{())Y?3drLv掲@tϷ L*9[")7PDeX"҉(] $e, 2i4& E#i^{~_Zmذ?jzi܍˿ZfM|h3! xQ5. u.U{P|}:9يj2Ev 6C5NB `5joƿ?޽^=t/lu/;j ~X u;㡱Xs۽[n>{x}^~eesiu@ s{<Ȉ`s/d2]t/}v(s.aWLmO5T uD0bߏd@5H1ǜJ;Yf, |nGS >!Y"G-2C?>p|:k4E4ۈ}F՗7p`|0 aGKx/ Nv}^i/))q܏PqELǔ鞪NGLǠ`umc5eP0+Sk2rXw )/hIwWWO,O ĒɄJl`3+*+.r=uvtfU~ضh®x cTS} V3P50P4JS٧N:[Pt^|geùEHږ߰eC)tD$>uzؽL7!թa5nys8c4MVt至B~hp9qҲ G4MV~?]ea zR{69v1 `4 E9؆GzxAnQ{W}Eṽ=t:w0M+W¡кE)T EP7 f?9;s.{_(;o阃X4VmP&VWMa ?(9!2pYD"\)}k˦wxŶy;M3kZ[Zϻ.n m ƶ3MSҳ`$2% ~W_xᛁv$/ElPJm@E _ȶE@/*#F3ظaCiʛ)/|eMf#6Z}OW)Vn Is'x,O&h43дqc K/^'^9Slٵ?Af/bfT#RzH?%T7 5Ζ7lSԾ "Mͩ߈+kiB @əP_n9<ʼPo0 PyK]66%0yѥq83m`SZZVo"!ϦcLaL!4_߉#p8rMM Y8G?Svz72|wҩ;v<މjP;o]නB / !}{&2(TgRfLhuï4֢%2SuaO'PTufӱ67&ff۹qvťwu[gGDzںWt y}'.N,uLYtڧ~diWGGcL>d7WaRjbV.^ӱ1W.M^77= :|G؀m˳Ҭ~2o3XzJ6b 0 n-H0 s hozŊޞ޸tl#ئl6UDa?n!EJ@EAj0TLԫeLtXͰ g5ELUHs{39B}{ݴ`oo!:X?әyLukpI?K&MNs\^s60р+R2a"== >7_)-r[ot2@oSm=C:j]Et"zkSޯnae w7| ~Zi :5C]P NknMSltRc /9ӿ4MY(Aή=f`>]*wՙ)?ꈀ0(/-Z;&d^Oq3`=t5A=X"zG7225#B`Ee٧ie>Sʸ3UL0H2#$ײG>lMl:Žɧak&\dЕ">\b0}j4FPKk[8O~Ŝ wTgN2/V@Y) )E{}yﴀMG9mRS"?L*e)H>;YYاS$73O"]@,?j4,~F6މK i?."FvQߕ~LS  cO ݀V:PMUtYYƄtE5LgohiB tvtr.{ !y \vmbN!W=kk>WUaLPUy!mxAM >ل+)yޓO?u}2v\{e98g̜mڸqRV[g aU4AXI"f1WcSFD 8 T7>v_YQ"Z|D(oso'btjT䐕& P2 '(:k4 t뮼zUO`a+S3eƶ|<; ~L9(y~&6:GՏrV?Tuޤ}jlԎcF>//lhJVFak~[QAf&S@:-DoHw]N_lYY@݀ylv{1 Jop*:0ն,k/"94MSt3mS 7ߘd2a3FwyǍlt@;P};Ht*G8x<u\Q}4֞Hc/& zzh,˂U]qH5d -ݣF)z=>ZRƪsNDK 3;_gLvQ y|G&*~hR)fGlgV-%TeVoEm;4ڵjQ4U~V7Y݂~>\Z:X־\gvն0.5E~*XYק(`:%ܳ~^0V^N*n;0AkEGּ/t|\k6lhmiML`b"GLY 2->1lڸ_[m9KNxA[_5_/F|(W Xr IDAT_׻ܮ K(*{Gd2)Tz("y}SԄZNi&2"@DRA Q LRu\j4F0Et6 {`sL|gnx%꧲rDՙt6 L.m-6À"_`2҉"TU7l[0„T!71[(?6Mnwӭ'|_\g !6Iq!Fz;Zu"b c*_6Jl'xGx|=u:kj<]]À;5}Q?}a\CcxP}P$I2TO>lbRJ(% [I)r!43kM~JhP1 DVVap(T${ml\.M=p̱47!Yc?̃gdpN_D B}e\77&IJ9@쁥tDQklk6luDb(%d-0^>׿~~eHY0\?*ts8fd15Fa,O%Bfm,ud%j{ԚT~RI#t@E0.Ҩ<`z66Z}XbJދ~/7_v]Mb\cyvԱ\Wz/}IJAϼfNs3Ng_n.{JJvlJ+~RΎoṳNwgWaGh0kT\9q\v{w{`& `„?[Q"mؾ9.v`U2\p8avnVӀ~s@|`7h4t^ZERpDSx);EPǔwv6ǬJJ35HGn7JH'O\~'mPHaz@݂^LO=t?k3ddm40Lgո @8z_)'Ï447<[5[nx d@)"&|ѱ9'H|iHg͞U7888{W|@ѧN}?3*KyySO-5BԆE6 ,+׆W޹H&:0)*cҩf kSX]Dyi2q@&[Ȃ|jf:nـzJ;D"RVVbs0uw1 bD24nXbEHv[u* D`hv:>)1=ݔAqmDh4Ø "Y*z؈}:FC7;_0?վE}On$xN c"}y@;WٵpXPm_v#obLhR(` )镗ɧzmv;a],ȧfbAűe.X`oyt#*BS)]6S`֢:+؁e99>V;㜳M❞Ld_-Ngnr@4:&YdP)_vSߔbا"Dc1Uڃn3%oeD]sh:OPǣf|}\0́>R\uճ%{{>_ɲK/7} 궥JGfN7tn`œl-&r&`}!l(uAIMd2am0_hl8|T} Oci9mt ,"kcXۦ| v"lb{0hcuI'~i_>khyo5tOP@J{䀃`$l<\ZinjۺkdYVTsv=&R:tK2'HL}T'-M\LMDL?TJ0&5i4@|D򰀺 :'>]QoV[Z;kk+=f'^LD٫رLWyջƲ H j\ndʶj>c4H`Dd2zʃE*uhTX{T?*`(St=~j4+xŻ l^x?/_Q;I mޟ:7o29`|65grZ!0^˵W4!}-Y:}@z`s8ihln2ڲ{uGZ9>QlP%S:EJ#@}ED Dg㼚Fd.&T&LLeT|@ߖ IǸw}?Sgƀn/K `7a7ll,{λY4o^3,L^3Lĩ* SJ}qI65N)L=d:4U){;_46Y[T( 5&Zˎ)' 5S )([l}qd~_j4EL%:{P_L&wu%IQ@ P/۫vFwe#Gjjkks8:3O0^:c7nX6,{~z`T JA2>.4\A*ˮtۑkvy߯ǻKJJˠ3+VBzB|hmn_\ۋl٢ .ONDl&5%Ez6'z h J^n|F&S)G}6<| Iv}|)/-KYNCӑV*:PנѤPLt VXtO:=ܳ4d!꽡8g͞[jl@:hcy??FY=_."DxaHY -E,BMC^I[+-\u޿=ͦMm@V^6a~#X8l?Q͓Ͼimg"Lģ!Q?XY ʦLH)m`<'+X3oO<-A쬑ͼfO8ğ (/>W61\nc[o dޙU"DN|gg%]X"Xrvc2< @ O m]wpPv믯?Y9尾Ae5{Ue|j&|tJ~:+YF'ml&KvH=^A2?6zKyڂ!#h-|9Y0]ed D66`"X>`0LLԃGܔ1iXXq?ec/OT{TΫzSOfC2 Ty?֞ҡM(: _W^k hyr@__~5ڑrX},m̙{&X.hD،3j\d,p.r8Y !?$!#h#6DuQY`Ep]U/Z&N>ݠ<@-կmZNXe@jNu,]p̗Qz)ޅj+2HXy7X=?>m 0%/T1E:#U_'FȦ43}ys8c4M3Qz/}e2oEe+; @Ḡg\:t&B{[{(P-j %;`锱/ *y:i% =]S[{c3!zN=>44rN^r휅B,  57wwmE* t ɶhf: ܔ^oM 6pۘ>mS@e~td3Ѱd&Dc%&a0.ocLgbj"?[F#+Oi4Rmf Q vѥ|opp̽I&ƒş5٘b +SWU|!SROηld2:O0Ӿnt8lPG diױO"PhLQ?7oʧc2&WܚCSh^2E1F4ֶvZ˾Y0<2S֌;| zaʯE>HnP=Mu9& ,H97K&]ۇ5MaB*" |d5+)-ݔKq/hW=_ u<>IY*"_ \W1 o&`z%R@G2Lǔ, O?/1P_5pGm o@̴M ~g=R&{r.Y$()A>f(:j'k/H|eF$%-f͞UWZZm@$6~VSyhlYWwF`Saik4&˘fF*ʨ#ҋD^ɒn0[,㪜˒ş5CX ##?0SV [nh4j ]W}ūJY7NxI:Ʊ<,Q)hߦ|Tx|39{PAt~XOGGt~^\ark6]SP~ѤM1)H /I&+Iqݎ[nQY)m V7/)){'HG{G4M^Be5N) #V@,Qr _948f/:ĕ:$/XLL?k9nwEYYٌ<\BinjminYfhP:sF2[Ecv*DM +#ӝR'{'u_ D",f[竮z/xИoT q ~BUScǣeFi6$M4*r E/DK=<>i4 PPHuMt k4i|3݂$)ߨ{2P^~Zf͞U7888~?~套F}4qnϜs6/-mdN_8<bdN[JROR4v9U -&_?|i6- Nd2a^=P~s TVVn "oA9t?e77F26[?&2~U#8DIÈڤ-lLZlyLr̬v %d9 {>MtS^Fȼ `q,N9ϱcA .Qm H:"|h4^&Ǩԩ #%K)9`d6TSҭmʇNDPB_^q?;&mufLy/}_:'lltS?9`}oOIʃA/JPrʵ,ˣh7`Ǔ0;d26HӟTԔMt>,XrL&|_K6}{C?ӱAXpFh4@5[+]Wi9*>V4Gop` zǟh8('2\VV6󍚕,3 g hxT02"z f E/x`k'mxtY*MQtf+AH?S鵃bǚSt;qA?P&/?ȁE1@Vr8'TA뮼K0)37߬: >=CC}6ihlVٔ SEXPGi%h4F2yykn4QZ:O[]bEp; $mɝ`Dtk-ocss_d&ME/ =_L:J5QCLh׋^TYP^%X:c |vT.?_5F͔p?'IcU=:G?RWwic(3fΨ~pɘ1Jǔ cuRu>LL0_ՑD"a]!Uq~:m4 {DUUU3nOJ&?WB"]VocApQ srSkl:t] ^2,.WE/\ .T&[2_8j4bS &U83gTAk6@__ӷU(/dȺ:z{z, b?N)ҡ[) !0ِQ759ʌޞ1Ͼ^4 } c2LTTVlϺgd2a,Z&7DtY\s,rfVFh4_ce6={Uփг 200Jfh2bf%N} Sթ\~:y,x.ɣ5͔AUX:\.*mJQ>:Qt"} 4MRtLSL0?䓂}{0,7Z*kۜ_HU"K>I @) !{<>]XL5/sghk 8Nm7><{6}z=w mOV)%R3Q֧Rh4FʹӾL$vؤg@,%WK}ǖmPzAskfSs׷1g:fˊtt }]&_60wg+}2Y"52ÎO L =|a Uݝ]u6 ]5kw 'RU]]/U(j"kLcC=aǦ·O6٘`.??L$W$u]!Uf͞UW]S[ o,po>{vikvF"ß~ wB̶qoP;G4X`٦bh4F6lrqmzV(m7Pv @:tX.;`3E QJ&P1ʟ+*cm!q ^NvV/NwBX")h4ŦL\&so*߄^nPy!} #p8oZ'D`JHQS 1#3v=0 uʘw~[3I[׼,W^U]ݘ gd2a|ML>)(>fꀺFh4"sN&}T~&$IҪg@kSS<;"PUg򨅪ˁh4BK0ƦLA2(_^E%(BC;tk4M)MncO>yth& )KNӃ~\P p҉V]S=#Θpx+CP|45ͦaAL91*D`H[?|tlWH}005[Gu]-nۛ:gӧ+mYP9eejh4F(Jzn gvH,H6[p{{*˟OV.[M]ScuQp/Hǂ|(_;NǠh4Fŏ~)_ H]/zQ]r1cZXT ;Eh4`SS2DbTmbN:@q“O;uIrƔ7^}m?˂| :ocJTT@dyܑGVH}r̙^?{0λ$T{¬]3y{!&YԮfaIh4F?lZQٰJO$y؂"LX+v z-x[MجuTp سA㢇Yn\v#.D"}]5@*Fp#m^p~!n{^形X}̫޾ '?mdn7uK23331\XZZZ{bSZ'D5GhD"jty%OTZ{zmO?,mׄ632:F]luCLٶl[dĂU !t9CjPM"9ԑVӉ4?8KKKQUR6w}:n"W˹z'?peUd]%`JlM%*@GG>9 [ַ-hٹsgත;c0b<PySBQ5j&=‰k{8 uCS[:E պd15>>;|M]6k#smUdqUGKJTw U6uv‚E\4(T m|T*F}``϶7ov%6m޼y`Mⰵ?0>77tQ reŗʣLY]ˊR {󡀈 XU&##3Fj!8q ;v_z%fdڍ" b9yޓtWAJո\C2511q}r٬GPm:rmjTKDUw4mY#i ,qu jD+*?܈Su-,,>?:U_8Ï\?ܖt9/uD,,XYtjgan}jbrx8;+xl|FgMݗ^|M'Ylm%8TB<^7 (>?],<@ٲu  ĥ =Nmf;,>⚄}ӳ+'mx @3c%/}_/1 |_7x6NW uӷ:3Qi]XW?V=O1V`X`/~C-;nq:/ G7Ó =ϛKR/y: ӠDD|+Fr) m}F5%IPM%*p#5%JMD 4fܲglttjͽW^x/C|\>fxxED':U[pNhȇPܸ NhUQKR/n!_H1睺XFr]W]~tMI ws":<}eLz%:J+++Q!F{"5919Sh yտqc-[c5L/'5pϣiԍj4Χl{K+sQutXB2Gq?Z>&^ET.k2"vg{ -/"-eպdCqp|1r8׎窮9rm%aqN Eiٷ@cpg=90;yT*x+;wnJ&N?O.P +^޷y˖|WfZ3rt*JLOsmT8\{9xш+~@D5ǟpUsw<{H8)zb2lg:~}-QA'Wc~j8aʹt- ' 6ƤRmo_X2|C0Q76bro (ӗ'q\6Yo>UEl`-gH"n7 ]׭ NQ_O7ewEWV oު8ENq&!C~76CxS9v p026@L_,r_3lOu,|>t{V l}WVGz0=WtvxOߨ¹,PF_nH$EInoyؑ#'|8m+LnOO2&Q&;GeC P**Yr|f?n@3͚Dl`->!sN>7mm突ND469IT^LA@tqkgF'0ɂXNK8Eh0ZYLDAyTٻK_3n`qz笊;us''&{lFڈ*a4זG DB.Hw?_t[mOO6>۹7|#TBNDU¡itl' iTd_ =A.y[[ۙ IDATYO>_uwww5\еo[Rl:v<#CfAP%^| ߓ bV8a0Rqb &y%bv؊\G|Ӊ't~sDND4瑇uoxiB>?<>}ѩ;wnۮf2܈z6¸ɇlcL؎|Z;S5S:T}ه[٧ybjt33e%Ewņ - jgLNP*zM?HD8TD뵸KG#?|<$d>qΟ&'8Mvӟ>" UyN MU":1Tz3$E_aE~3|ⱹb?J֕eqT=}܇"WgM~ew삺(#ׄJGyr"hOy-Z rF];M*(+ %wݼegbqBJr9JZiy8= ~3 <ϛlމ^WGHm%7nuWqBIċ2$2٩՛%9|{򖗗oJ&'m-}}}]333 Oܶ}{|HH&YnS-+]'ʦI0w5"8}r@vU(GZko>A]d=&w s}瞇xۉ'7  mmmD}^ 1>5ETr X@LW#&J&+++w&ٞٹkt:$"j(I&S}rSt#^užTHrNT,OCC>GG/nܸ+n{21>>_!YV=L}lFzʹ)JGxr*VYbU3O0Y@lJ9atӼ;DDw;N>唿q]wSX|2Nookk{mV hb`N~kwiqդ#=<44J[m[Ѓ(sBX{WN$U쑷O^W;8z7HR'+bC׆m7ވbzoo_w;AH~l;D]9D<.~aB~NE*PQ H-XG:?@NNDdS#6PDD\tzAP-d樻kCZj80 obVӻk_ݛl~G:>5?Y(F_L&wNEr2sq4=#np͵o߸5N7T=|!n;lٿoD wqnjtH%jqnD,77v0!oƑUʎ'K7v|*cswJ8 ڌ<:pw쓴/>G͈}(bzý+=,mܴK.=ZU9qP 7#WQ9Oy[䩓}-b E4zbfBpQ33={&Ъ8_?|Q[{t:}|2p'UL! NV>e9 @-nq{߽sMtlj g7nuUWŜg#|s"!'DwY`'2S7WFDxr;r)Zyqhb|68u}7zMuwttttoH;dg*HR}d7Ju'D"їH$zp'IDdyWL^T:ur*8Mm @L?,#nG{z3^a\+2;B>x'2tU 6",֍HoD/7M>vy׼m-Ioo_w;븡 :h M2t/w c_qp~ SKTG; 7sIH"p/檳,bXOrtAA@b1KDI]iO@DGƩKj t3Q32z k1VFȪ@Hu( ߿GˈODDg_o;0;yd20Lod_QGَFB\-{(;W\mPA,A놎a0T yָSiFDD[r;/wZ.sI˙]6½l$<ϣ\VVPj RϪ" ٳd2ܚ[b2D:!4fwz({h󟀈&u~k4=J:;wcI+@ϓ:x_:A|zbJM}A, rwL[ubIdW3ULQS]q8m}-A&Yؿ /: qX('#f[.f2@K1㕕SW۷k[j#G k}&8A]es+Q bi6X=<*9J(jxN'd(4mkQ (%ܲaxhhX,z)iQFڌ<9W'ʶV Um077Cu19I&n{LϯJ4׉r_‘ĜJh` @.XPD_n@LG)k^ zKK'Pd;:\'vܳDAըboӟpc"8zr.{︡)nxewL/jBH++-m @L+7:{6'وhYՔ&AH-PE |s?}PX]7d"_8uI0I- 2QE*-m R@L/N@ (x/Sےd:7lhʫ:*۶nu"x]}$ @WVn#T|4۶\py{Iɇ9a\u$+60,.e)Lbd:Pg W;3MD6`l&S$hΕَ5ĕtYtW_)~@D3˙n]?ĔK%Df@3ӫ+|Ǥ`tdd~nv6;<<#>َ ˢ Ub#fȝ .SS?J$cVoީl6rE Xܖ}öISu MZݠ.7s6eК8T69d"uV96e1Cǂ#cW@(yw|,΅QrӨth[UFP^O44n z<~sm"o[S PB^1n3点r@k͋arAY@LNP (;߹qvjv.~z,DVlPeYM@D__e>g۶m=gVwUg)޹cܾm)@E qӫs!}߿λ2d9Nh$eT;XO\`} w{>C8[6DjOHP$hye%nSZ#tu!ǔm-ӣ!W挕k0;l&O>FmZl:=cuwA0_B;Q3>>7܈snV5xWPHmmq>ꡊDv1@1:({L^8Nz_Koo_nq?UJ2Ż@H99mPQD؇xb^F5;v^4W 6Bi*4,,e)JmPOt".'~X8;m4w\,H@́^]8?Ͽ{2R__UW\9Dӷ3tN$$*iОrn"Jgd}K+ ;US8UVN'@" @=P"s6!@ŘMp͝Kϛ:F8UbztT1ee-3d2y|=kf2yRu"y:/=_L&OuM+zw'N!Qs>މ~o[ 2%w 1u疨 aU?0λI? nmxp PF-I!_SP1:\ߗ>/os=\> *0r\XؔP#0Q0=5uU"8ֆ5GFNMN~y.#lMb!W*$SL#@N@Dԕc #?|xii@c*?nq[^^ @@cM y[DC 8qbteqR(4kGßq~LNyEҊIW &AF $nb{tN-/vg3|Y6lg<(DkPF8_21>y=#lvgC>FFFf 16(U9 U r:NcQhFF⸎u(lX|S}StLċ*W^oվ (oےyOGgɤs-'n'Q}4@M~$&'2yp&YhhOMLL}>Oz~P;G%s媁3>1E]DsP48l.Vu2#6U% L@DM(d`p+6t=11>I1RWQ TtCn$rJ>IǢpQ]]d]= IDATǬҞ_OTVT~j*;\2vd,;6utv ׿B ]])u}}q gj !s*:X 3FT e rD<UkKPOuZy٥L,-.T" 'Gi \UtC3l͏ᣏgÉӉ.^0|b'> G$r'3Bf=u۶-bћ]{UW]wϐ>c%oܴ}iaa6it͎idzQ6gT"7,98lbM^ZI%ue16Ok/Q"ZMLO$ӴvwDbn3Gq8!= xSsE=H&^Xwkcdjrr{å]wH~6M~Rd¢ a'"es+ASMm 6tvwwoސsy솟zHMȳmI^P* Ҕ 6*lUL6N5b62+$D]ӿqg`].?gE>"b뭤A@1seb~"IP"^}WWdGsJ@u5"CS⦟t]wA2'QY}w=gy4Ct@ht"**Dk+\hm:8DDGFG/عk7BO*-cZ+:b;:vwq$LNUEF>hbT*TJzz>BĩGo^s5IRIR}0A~wOO ~!_;,W\vnn.73=ݽ{mu|tdD'PfJD瞽ozeiߺb=XG4O}p +b$$/bj.5bgYgoذG+V7Kp1( fA:8v e"nKbu%)m'5v9"';sFa=,`։ 6!OE>Ϻ:?I^'\^>BNrL nt+QDe?4I*?,x{&\f';Zn4W \NLQ]GeۖtA] % \nЍ8"RgqlUP=\^$@UZQR>UEbS.\4Kpy"Tj]A$02:#+m"TZ%9a=mqu~ = )ߗKۺ/*!]pU4֦w*l%@eЇ|a[3?'_BX¾?#wg?OMS.5u1H=!vXR3H%T*ۺNH/WD)GP r9)1F6ܞ(Ӿ%ZP8 *Eus:|ܾ\SU|M^$_OQm*W۱%ry[> hHt,xJGXוJyzwyMV$\ Gom*:aPU I۠< QiH8v9NDHJH"ӎ*%M%Ŷ Z EȕJ\" FsU ~l.rMW՛Teqյu6(zA]T;OZ3@@5 7H΁;19Y9]a;gTd-fS5M )k촲h#WX&C@H{eQe$82%Q0%|fu"`IPXa2]Êh*"#qmӘ)r&Wl#fZLȕJ;%fBZt-G+{`}sum}lPQLkZ6TSʺQiFb\ܖ̬$lQ2鲾#稹 1@Ձ^]8APN`#qq_7]57tUp ˈ elBN$UUDҋIIa#ΑERZޓ^OqI9?:pLd "Wl<ȕI)O/V&Z% d?;JٶM#S/}N,9N 9&_VH@ւisyiuAy!\wrS8DT;UyOer|3*ŵ.~պ5.r_1NA6R%څGX#4}HKAKP\,Z۠Mz*wP}OPp#V$YD-GT4% Up Ƥ_t35ޗ e%~"u.tCؕ)JNDI7DqS]FٔEV]SgnDu]1MhLoPAt: 1QtyKwr~lMν#=L $gmUu.w #oo@Y@L8DtLt@fsyyj]O#1@=t*[ĵ\}.@rզ'STaG@ee?նOAUd/_ \cޑ]/Ŏ L">AWWzTb9'WMLbNܶ\;UO+b,P%4*9KC>Wm צ֕qk6 m03ayۑ9UP{ Q;|x}3+N}{c64n[Q\{ 1Tڠ9& I患.xPo#6%DtT/5]%Y%hRkS%q|DܾsAi[91u65 9[k;\ERs$`ъM6mLZu,jVP"@9кp܂WB9uYDE̅b\S*T]3LktO)ڨtM'U^Wמ!I]T&Q) Dp qmJ6 pEדIUY dt6^| 9$ ;רuB|C売m }. ʤm"U}EWQՇtIw];+UzX.T GД 1} E Ir>T$vɁj;*]aG[A 6I,+^K &KȽdd^A9\pEJń\}\|$ܶYD򶪬R?|ԐUHt J+\|}ZG*wᶣ6$Mk]ò ρ?JۢY @$U9:%xUnHnϣa+˸HB6S% ("*T*#܉rٔb6w~DӠF@L1h/T. Nt=Yh4#].#X9*ȪuE[H]9-g*9jG}Es]e(T#ihXU5T>ATmBCWRs6WBʸ{9!JJM' @˘ s-ĝcGLy|@F˃8QFq 9*-8*H6ӛ>.%fsQ_U@E@L-0$%X(M!~^TAWsG׺F(}*\G\DPG#^omUϧQjD :!]gsSNQub[4qdJԪΥmtU݇^JU]T#gHP ެӍL伷*)=g١}b*w-o7gMxDA=D  魉J}bGAl$:P'F#ƇGB}ދ]^mתm"8^N&A\mDk;Tp߉D$8c$AWgDMm$]rW1+WHG J]k̓ 'TO1ϩ.^4f >r׵QPG` 6ӔFrުrQU>Uœ*d₫9ս8[8A%L?tnjwJ={g@N&6~bе_lb͢w/=SF,iTi]@G%ywe6k.0Qi.%m&Qr׈٠lЭԉsTum":lN*Е#sǹmսU#֎  | w>b[&fuk]DU:Oj(F=JrJԣԧLꎛ꨺:LumԋRn$ܶɃpe-h=th.TlWy9Ε 4jMlJ0}WElJl#WduT(>bmur*4$M :UD,OlΕJ[l1:q\ue5l;^@E򅍜^#"RyueAA~T*۶r}T6U.|^9۪t6R+1lW"6LeoT@3M{;fWUDUu]= бeդTr>:AFn0%D5z$gCu~TL".(@(PTM:maڶlTDlTvC,jL=uQ\Unf;$j=ǔHC@5VF9 -` fFn})G,mEusQZ?QJ@+6*QmOm[&;ˡZ*cx~ D,IDATNEԎRnP':ĕ/+h=*4zkU*GAo L&H<6cTN$uו>bEu\e1s5jShـ[FPnt,R]WgWjOu(׍P֭Q2kl;70QNn!j.BzmC?W掙 x(G0 l^ѕ$El"hT4م U})vemcOW 1}ƮjmJMͽt1)NuCɞro2q9:ls!qrgӦdS4i9l+hGS, ~ E ZrqP[>ey9z|^~b#66OlGkb{'ըDMe{G%u*Q<Bӹȅ _B+AnTK0䎫HR-+7I-Dum<sQ;7/7B|@TZ)g4yu?[*]":zQ\HBR+ֹZ[! Z4t㧜Q$Z/,8By-G[MZ%> ~U߱{?WLF=e=?u΃ boEIENDB`web2py-2.12.3.orig/applications/examples/static/images/glyphicons-halflings.png0000664000000000000000000003077712564727256026376 0ustar rootrootPNG  IHDRtEXtSoftwareAdobe ImageReadyqe<1IDATx}ml\EW^ɺD$|nw';vю8m0kQSnSV;1KGsԩ>UoTU1cƖYuּca&#C,pؚ>kں ULW -sn3Vq~NocI~L{- H8%_M£wB6EW,ĢpY2+(Y@&A/3kXhߍ-aA<>P'\J;(}#Qz:4%m?nfntK*l9J+DIYu1YZ^(]YYEf@ОlXz]Ut u &5-PW}@t|#LY=s܂,w#+R+?Ƌax X0"ea)tG*ԡwVwV^rf%xB(qּ4>WG#lWU<ЁXJVѶlR$kDVrI7:X%X1NEzw;y9z9O%~~uɗ*=Ixcy}Y(ou ±N$^j e\iX񝜬];Y-rѲ&>!zlYaVHVN԰9=]=mRMdOUC JUiT}rWW'ڹu)ʢF"YU#P׾&ܑЅROwyzm$Os? +^FTIEq%&~ >M}]ԖwA? [Nteexn(措BdMTpʥnqqS?bWXmW6x*{V_!VjΧsVL^j XkQjU6sk̩n~[qǸ-` O:G7l"ksRe2vQ=QƼJUX`gQy~ ďKȰE]#P:td\T/u;س:Jc-%'e q ?j"/yh48Zi1|JUu>_N;hxwNU JQU7\j̮bT:B?6oJ1Ί%I UY-Ii4{=rǤ7@)HKJ+f4X8Cd?'j1 N< 39EWo VTGzg# %D0#ܠ3[tiآ( U,]125|Ṋfw7w u+Š]Db]K xbW ՛7|ВX㕛{UcGXk¬|(h)IUa)lp 3luPU]D)/7~4Wt5J}V X0z VM;>Gԙ^|gF:jaZ^)74C#jwr,еSlGu;1vm><)}ZQՖ&mZ:1UMB~ a:/᜗:KWWOҠ&Y2f7cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘g*3fF5LbN2#Tf=C`!ZGUe꣇e2V<1mkS4iϗ*.{N8Xaj~ڀnAx,%fE:|YDVj ¢lg6(:k~MM5?4 ]WO>诋WZiG|QGJeK[YcյpmjE\f/ǎ8&OQ3 .3tt2'-V8pXSrY#J!Q ",ub@FK:u^iy[]<.Cw+W\)b kr-.MtڀMqʄ۰#$^X$"V`T4m~w%Pp1|+&UxY8*r8:k7QЃҀT$Ўƙ S>~Sjs:5q.w&_Z.X=:ވbw` _kd{'0:ds#qi!224nq\9-KUTsSUuVo@;Uz>^=Np>oPO @I@'Gj5o*U>^*ew>ͫʧ᫠Q5 ̈́<$#5Jٻj6e)_ d]2B:^(*:8JYS鬆Kݗ ]U4_rj{5ׇaǑ/yV?GtGb@xPU7O3|鍪 IQ5QGw *(;wf0*PUU<YƔvbt5{2!,}Ҧ:)j2OkΪ' ֊0I.q\(%ojQĖՇa<ԍexAgt'[d;׸`rcdjPFU$UeJI6T&Z}z(z vfuz {}ۿߝݞlxUZ謊.Y岟b%nw@ǩS9|źs%>_o#9\EU~/ځt(r[QZuOo;!MrU]0TcpDő?.cPuF;L_Sb}R/J_+h2$ai UǩS9>Є}76rzu~国4oĨ 1J ^̘~iC޸55G׹]gwsn zTuO=?/zƲc>Οb#7ֻcgkޛTUj*-T=]uu}>ݨNЭ [ ]:%/_ Sz]6D.mD7Uƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1c>J4hPP+A;'G_XKmL5I.},wFFum$S-E-;Õ C3I-`BRx1ғTJݕ;hΊ8 DYJo;Yš5MKɰM;%Pd9KhnD[zgVh,'C p!^M(WK2X>UQ%^p8 ˽^#Ζ؄+.@gCz%ɔ-Pr KX n>=ՔѨeSvRLz5%9UQS \WիK'hp)ô Jrh M0F (f_R5///G+x 1"eS 5 :Tf=+7Qɧ\TEs༬rYs8&k#pSՊ5MTbD܊[Ng5Q\s5PB@[8ɨV1&4Wsy[Ǿ wU2V77jމd^~YfC_h;a.&M i UWpzs`>/"'OI۲y:BzdTq£=йb:"m/-/PWDQǴ͐57m`H%AV!Hԛ׿@"Qzދ|ߒT-*OU^Ҧ6!Cwk|h&Hd5LEYy'ƣ7%*{=)Z%ٝP *G]/8Lw$?8M)\į/#7Ufd7'6\h1 vIfEIr=1w\WKVZHKgZ͡$mx % `j}TuTQJZ*H>*QxkLFTyU-)ôbiA|q`F'+ 4^Qy xH)#t^?@]^`ARSqjgB:rK۷l<2-4YKhgQLxVwP~M Φ0l 3ƅaŊITȀhwJmxIMչ|U7xˆS~2ߕ?kW1kC3];YnSґAeXYz8,'x< k7Kx]$x$vgT#w;o@ z_Vmn|HֵhZg-^TAn- )@4[*9xKƋj>!,Vt:eqn8%ohS(2\Q^aigF3vTUDVlQꅧWc%Ueq4ҝº/U $_Q!>t| ,țG<tC[xTXmf|Q%d#jUՆ|; H[bά#,Ws7NT1~m&ǻ{' \㟾 bBKJo8%!$Qj:/RX)$Sy޳ 䍧RDUg_D軦J\jN֖SU;~?Ohssdƣ}6(T <_4b5 ^N N%8QejF7toMyө`)g[/|?өJuGL坕/=CTܠhdifHcǞG4,`D՞{'xG_p/5@m +$jVH3a"*ũ,,HJҵȸT^Qyo&IÉJUVwWLeM~3tA6rwɤ6տ \0HL%LX5c@HHÃZ|NV+7WM{cig*ȸU7iÉбzd * ?gtX8̝OX:]2ɍ]p^++>AVڛE{ DB.&/56ArxY#ܕy)cKQtȪ~! ;C}ʃtf{6$NVsj wupZ)zŁ|-wg+nMVj/d+U~ͯi:_ix whqr>駃-x뼬)ݷyR=! ì:J/lIkV@n74758Z KJ(Uxz1w)^\ԣzȪ󲦨c2f؍v+6f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘2N oC\F1ִ UZJV̚\4Mgq1z{&YT ,HX~D u\g}x>+YdN̮ol ZX+F[/j+S~2/jV8Jr^ԉ]J}J*ۏ<2԰&JݣjOM@ѯ#0O[SXB^ uze\]dd./xXE f'vO_H${%;kt7ށmő|d{aފ^ǛڎE5ʋBr]W=_SAf(0 oU5q ,_\luz˪uz㻲o=Yi~| 0+=VJت /ލzM\zCL[U:|k*^8"\Wٚ\ .XTjX5 SkFu\1 q'mģ/QUؕ*AɽDNZ׮?_[# ˍ4:^j|5LG ||øBW{6[uQF.1$qF9IHg)\5>C#uXZ$#*<ߐsRv1Tj>Jm>*#( [Fhsש5*jQʼ&&&P犛L[Q1* ;X}Iΰ[Q?qQZ Hݙ֞VEsBCZ9JTK tup˷ /O,.kUdsOHMg4=-)+ؿh2Nw/r|WQn=GIU;'j,vfdzpe$V GTYsBZO1pj:r"nTUSCgr veAۘ˜FC+Ֆ#[JTe'v9-3 Dmӻuuz?0 o hxuY &_54=f07kלU0]D:jdw/+PGUVS<\2uatc^zYRąmC+7#,|:iNw*|^sm|X>Ъ^1\#͹ &%{,2U>ݎ.c05z# ogNO+Q쓭 ,˗-%K\[S_`y+b_94"U+Ύap}I[M,B.NtwHj漬E L߀ 0DX(kڵ NoU{gquz RwkէRx'uZ[3'zyyד%sƕ3jYF\s=m1&VAɼ?k\+]6yモ1gtOIW7al|1 >$]e 7؝WIe?ަL#>| ҭ] pM5MUdI61ԠeǼYGhOn3խR:^k_'Yuuq#p# J2xl>OjcY馃!ڡ+sZ/ D}2AY mpc#<'xSKx`*W[,e|6BH)㶤kjpDU(2qzx9*tqa/, Z[ 0>Ө֜xN)fă@qըFU՝w(a;ˋ>|Tc|w2eiT]*!_\WG{ ]^݅Z5t|6oYHaO@= my^akE.uz]#٥hWv(:,6A߉JFa\ wWex>vetuMYA>).,;ɦCbwjE)W Fӫ@s4e6^Q9oI}4x<.B?B߫#$Hx.x9,a!RTpgd5xBe.L7@* AsduttSVUaRU|I xG߃$T񭟬#_IFMŒ_X@foQIDII?|%$r {ENĸwޕqq?Dؽ}}o/`ӣCTi /ywO rD 9YUD] Ή@s]+'UaL} hrU'7:sU|k)H@hNq#ϵ8y˭Xű#w 1!흉R'7fuד0p!WÖW+Nmp\-ioD$g٠˅%%ÐmV]̱rw*Z}y+L Nouj}xt)lStuqxmNyKUOnDbhf}k>6ufT%{ <񐮸mjFcmUïc;w8@dGFUA& =nq5]iP}z:k⼶-ʓ Κl*'UzaxWFdZzTNRs+# wzgi:MBqtM l#^'Gߣ*^t{=rERnQ$adJl02%Tڊ^<~g?Of*U^?:N+o[PUs|QR']V-L)H K䐞 mYn\4}YVD hR;g-'3aסM Dh}1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌk*Ț4`L$b U4\dt'>HȄ|.+Y+/Gy2OCWv3v,'kia W O6߯E=Hv $LlxI躍/}^]x\3 ɮ5 QT&G9Ay^i}O[5ޱwq4,s JJI.myE^%'VB~dׯ}*j* ~uTk\fKЬ*Y]_v'I˨鑩6Xo'j&uɧngT]oڌ9\*wVHӖ| >:5EF'J ɝ`!A e~_;5ױϊ镋m_&OVi<}"靍hW9X6KPƣ G"ƭ?/O^hCHLciPj)}QQզ#tMg9 xGw~d;_J+RỲ<;e 5/Qs/5N[!a+NPb+ѺI}-t_qU=MKʞY5no*vvbʊ{]| ~ Z{-끇^FVviϵ3Ya=6ndS;-ʹ^;uꪪ^ |=_w+"i&4l#wir|W3U$"J~O@]~tRJVMHw:̦@?>O?vdrtS*$&~1>Z}^nL(]f*&*QaIꝄ|3*O?r?*4Gyz[k/tkQϖWCCKk/x5|S*`ϹγQEwy o KYqTb$-/PtsZNKQ*>ݢU@Џ"JQ;¹& Lx;+T /+O赟> (T?ķD^N*'p$IW֐W~ =J|_UTe7ְP`;CYjk=sU[mߙ-;};2|wo1p0~>0m @Jrǟcٷ4͜?q\UUIV?2L/+Шꄾ< ܇^T ?tj\JrҀB*=km X,n}aՒIadp׷ll{\6v8RꅟҲf1F|Տ;e=\D ,D:ψrxQT◎*|{nS 9~=}ӕG~%j:Dj<ឫ:jO% $T8!jvm|'OЗ¹➱z\vsIv`Ȕʨj-^$-^G Q{m`T#c֞㸝|n.ߪN$O JUVʼt,jg-mסּNV z:(Ι*|1Ux=Yk*t MNNDUhK ؞X(刄Rv!#B_cxRŹoE5Dg>?fXQQ˔|@"աMveC>mO$H#]Y I=)_`k* :a>!X!W^wҒl'<;vwgIt_?Jh`#E:fdx=6Wu<Ӌd2di˂c#h¬c4?<HFYoVpN;ݷJ\ >` (t3{>⦊;;qFx4YcS$w.da*k|Q,+xs^K߫P^nO֮L5mIwl?-.ʲJ8 F B.-:2Ȕ!/A#b_m%I($|PZ[1G{^#o>3mw?'cx[^:Wk/`'=~֥W(gQbfv7UzM3+؍K:4|GCtA+Kʨ{@Ɩ [05E|yn4MIENDB`web2py-2.12.3.orig/applications/examples/static/images/book-recipes.png0000664000000000000000000010312512564727256024620 0ustar rootrootPNG  IHDRQj IDATx]GuϾ}{jջeIUcc `JJBhwM36Ƹٖ,Vmofj&,0{ܹS9̙33Yv.+++OܟZ\\\5cD"q5<ȈNM?NRl۶w}w39fd7e/~n]]ݿ?xY(]]AAwyp£/[W !;d^'CY__詧ڻlٲssscXlTbRH/ ۏ?dN;4cW_v0w}x?u* Tj2)-QÇ?駟Q>tN|7k%JhѢW~bPe{mc Nv/Bx ߇0lS+i5-p[nFus=׾60\C'>O'^'6~N6{}w',~M\\!߿9;uF`FK0]D[x3/` C<9?03U8 wkVVz\!B[re83`-ήNGyP6T~N|W9 871lybGpM X TK)ٖoΆbeCfntl544Xss?4X3pBCx|Y *,p}=_&8+1YNK.0:!4!y睦5Vpu*7 w=}t/_wNB,.w3N0l yyaWMc )pdq„8'^÷j\>\߄8.G(Uxf×̐Ti%-,)NKdxvsJ,/oaQ8EP++\}N0\MrFSPv`<Àj44Ahi*$ RzQyIbε" {Lxv΀5iqQXh?'T- MFFo(N0"pru@ LzQn?!I𬰡~!&: P,M|P+A9b>B6#(MNsSkjs铉Py!PɪC!*hhAQ8B\l7ZH |n <CϢr :&<$M][3f8EO#gEJa,JyJ}tp)ԓކMf2ORWSi45ƒ󞨒M gP ojB[*`8S? %/U$JNsEje&rءFű58UN(1.'? τ \TσJT)ð4S% : DݤF{)H\2 9GBZ { ^<W>j$ /5#ظ_{$vs`OD\͝@ FQx{NX?UxX&HH#*G*Rg|_{fD(4Y2T(&Lv??Ub~唵tn$ZM64 pIPR!ƫOp+Y̨d ~&^(.,=VBHOqIH:CψH@+9#:xٷ+PL]rbBt2Jˆe*7nHC~C3+L0}x?u΀5DsьȀneڤEԖ7 30S%G,T>]DUx'`zD ř/TS^DH}Qptݐ7ʧL+aGzɓnyʩ)MB)(CLHˮQuV#)XC EQK})6?sPN9V[m#Vd,e%=ň4 %`QSs^y+x9eZ Xx^iDD9l|^gaTъ~8htQ(*UYN:igJz#%hU )^ʫa{x)4󁰿>ؠFSX6JkDATYyҳX:rE ^=`ktx-f=Ǭ#}JH#4:%H*[ (\/A=K[@8 jXKZʰ5%`UO>p** ,/=’WCݔ?pPiM\Uٔ4eVC}6uhDVQQ=D!G@QB':Ss ͱ7`IO'Lz٨ 5Q P#TGpQ4r^5**Ԩ 㠊p4(Tq EQCB|5&] t ,Ʌo?5l[=SʽrE_8**M4ky* CWBTQFQ#EQyEN;5&G;?R%׭6KNNf2xZ2Ն huK[L3ŰQ*Bg(vP*7`OJ[hOJxU@$P2+G|T[FTK4P!%a gt xR9$G5(#CQ@ފIJ.*Ft<=?"‡!t}X8>NI!O1 Kl25XQiUTV%Kε2 UAs  [Ss;x WD/PR H/ {_wPɄDƇ钹h(- ?j oŶTEi@-\ʇ~zH-L'gp'buf1Ct2Td@5؛( XH+A`Y@3ǿP<Xp啖 [grVʨz,(iUmA[P[e ۩TUHKk55XK!z3ML] ̒1}@2$~΀aTqM:َ۴9\Km!2oIՠyAd!kL^4GH9%FD[Zra0xSIgӜ1⠊{d3`M΄,<;-360CDQwa^A!7h0ߥ eXM]RGWjb* RIɜ\t#䣑EoeU54AH?Sc;/T;5>QFE==JSa0$c5#y\|N *WYeFQc+,?gԨH^H1oeWl7F,7C} 2FYPkN ~U'[dIϙrSٳ I6{xm hk)lI(P@#F6 +`ܤPq)x{3󽀪Za* u}ûQ~rɜ._Kyizlxh #d.PQd+Yz#q Lb X3LJHp$;Zp^&`Xii-Y\#R̂Yؐb&[eaiAEOHjV G h2h/ߪJ<|yy%[%S9JW JbE QcgգL#(z;}~QGť54}>p)] CxiL'LrP1[o/ [n `R^\hM {P6>P%B42.܇kNBɮs"*.o{ ] U7CWjH?oKgIl8Ѓ9*u*QsTT=\{x>K,JC}#{UXj9h+VY+c:lŊUVPTb):iB RsjPCD,Gbck"77igW0$m-hGmQ*jR8E첒bd) rRGZBV4t/`|I85TdOsJ)Y<9E#A j! d㯚RD5 t"8| V:hW65?\,UIBiv;o]jkٛe]m>d,"u񭫩E V)w"W-|eIqjFz:*wʬ|u@ ҽFZKMhTDeIqYEM"\rcf6;iZmx0ڳt{ⓞ(-JP {a<~q5mFC^Jb]BM"N(&5tQ+EqBC'F$ .,~~΀%ap:%XmwhyEYvIke۶[q P_cp[zm}ʊ cɷa"6E/򞝗,v4iXhaQ!>b^k%)a/,Xy5`yEvhߵ2k[zY` Z?swP<(ܥ.BIjӠF2tS@҈S\0ޞ02 Sl9V"O&F| ,DQa,1D߸K𞞊-j* ('G¨Lj !'YLẬVYa{jVP#vZ{mM}3kM`:,wҶk.zȣqV^Y:aDK YiqWmm7۩\~E)+g`vъ,`,l6.}S~zz{a_kQ")-sc Xj@80qڎ 22L2+*,PyP,7rk~P׌Bjq 'OCȻZú‚fQKlӦ VV_"f;Fնd2B{.q!iC"uG%tXEUJmǡ"i+)[}Im1*94e++("M~Ɩt}izh !ad C1˘H1 yoh0A`}@O9(=2\,eH{xuODPeiYX{Gԡϖ,]ňm15#(f++sH+s56TG׆N:T;aUTP=؃Q j"8UZu IDATC^t:WuTUV!.~Tٵlaz[-,|V vںueL}5Uj f  PnIAH~n-)E9gyt la} kS/\MW5z' |dUHhNf8ů|VƁ=T!t#2t !Fʠs@"#ф4W+ ֦&Cx͐)(m^;U M@slSh|zzFG0]0Ia/uUnum?zکf[V-ZnmݝJƘLl:#LdY3(_kVUyE םP٪^MO}jkX+XHZmŭy6f@Y#[m႓`GVӠW_ &n|$P_2);PHb=x]@IXM6W-$@=`V"?@S9P)QjQ~Y=2D&=*d:< $FF+v-W>hzr `5 `, {w$e:{ li:d;i۰ddb,5K隌aMq+ާ}P)`Z-C4(탹=󗯫'¶޳:Jm͒ջCm=sSߠ-^f *aG9D*?4EPbÇ:i4%XjT)J J8:)KT$`yBwKnst VYLj+Ae΀5SD>2䘖փu6;m&KSҒTC<.-GJSˇQVu[fxzv[wɶ|:p6lvTM4bDr<+8~Y O{UTF\lv7츊Yko'ƃ{:ٱǎ߸z*m79mg A`-lSZ +bdnmՊ)"]s]G' S):~FIJ0Հh27'-(^4$dD **uj%`i0Іt`%)N?Q| bڵ}X}:5Ao9Xq*2id':~!o5_.:X/,^ſ[BBZJad8oѲvib{[nUk72ꫴ%ui['+ kVTT {P2ɩoqM`PmΝvkej8:ladןmU ~*QeA`Y)ZGޘ~Yxuu@o14J꫌W j`2 L);4"[2*A"19t6Yh>bPd"TʓDȧELc gV40v݊׮DE 3 ; DS֋*'VN;̱оGieKmЍ]E_6aq,ȺѢhdZ u+.#?^F Kl羔575Yg^dkWYm^ӌd0@ cZI)+ QvI1SLLhYʨ&J#,DVVp|ohQhdx\ "jG˧1P]2Ӌcus& T״uCmeJ8& HwXv@ot)h۽^Zq'n,u+u\yݜ+x=%P/E*jlu@a{<TLB:IR%-M+^ 6~ikv-?PŶdZU˞mЍmyvt"tetlnae /z߸n*bBfTs~fb+LvtԈR[U:w.M,T]M$^R,GU e "u^Xઞ,!*wTSCѣ̜eql5Ŭ.s,`Nv; ٍڅ/:(|C^Iqg]U+T]ڦ7#`0h[ʾ/C_hsKc7rw?VX^]D5Sgg>;j_ns8n# s_r[t FQ;08gU9 *c(O֟P6FmMߤj O, J#:39,ӊ Pt۾>w?g~;kf4Ǣ"U)Ѫc)Q5rI*;|2a·5ێ}n%ugX.`Όp߼\w8_jO{^ @K B}[6l\eaqVRL`1pj[{eAm̅uQYdL֐Oe+ @}Ke*?#r!?Xjz7d. 06>F-eQeDxpm\e>^X,*u -YGw $ JK0++#M@ Se[w`yOܶ?~hgYIklC_J^껺g!6et䠴1 ӳ󐭬}*,v y$?ȃ&6,Y຋:7FWMz rG%xI{X)ꍟ PO>M3y XkD '[v-Y>$왴RGTEEn'KN/$K.edA{H+ 67;DhձO&N9 BTH1&3k^/M1-v-yDdff7Ildž}J0dym_>gaS RhK ؁}P(VQ ]@_ $\ǽP4`5i!U"-ҖA AU74%TQMK;{`bUnS '5cވf/XȮKk++<v^`u+ &A^qȶݷT'>WpOSH 5l TS:&PuJ%j.n!Rn]3_frs25b ]<0_z,CcN;b TxELXMҗJ KcK/j`CA˭J"JnR=)Jc/d[u XŸCȳN<`؍W͗1#ޞvFY9YQ"'bfHs56[V{:aYUFQӫr{ +3TG8/Ǖ`w2@=Ϝk胯H6ڢVRIDKZM/t ]F{* ϭjd*r3αT|Lz?P;mlP#jARk6-1ꊊR[Z;l\kjҖ.;ph\zdD7=?7}N5L5L}hϖ#Qa%*fyr:Bl X|!ثHJedj(0;(_4n2UG Tg̢҉G&U~Gx;}8>ɤX(dZؒ^I 3le(H>(bHY s\)VUTCiQ7ZQlJ`aL]o V(J٦VRL[GO=찊ÝnocqC!9P LhO'Yت/%KڶTV-XJPa;]=F)jY+Ӣ%creWSN鍃1f<+)r#)*Kc}P*qP2@,NT)/'TshyuYRvkEn*-Š4 m8irpgA!˻`] kW |nm ࠜ=0Wn;k4-ۚ'X[dY oO,*!֩퇚?܀4 CB$ 9 ~W8ŚFhp`0Li*Hc0XFzǕ2b$T)>NT&Pq:k?ݜkbdD̍FLCi>X(,\Q(+@:J{30 0Unɟx׾Ln3e)]2K ң_T+L`h災?3LRK焕J* {b'j:Y zD5b;SK ~&}XjH4~TnԨP%HDD&-5dHgoؤ(f$O5 ZE R`wD{G!;g:I찗d5S- LR-:l] C췵h9{j^*2ڻZBvAnef1|C S{>IԓnþٯKKVj׎[JJa4l U؍_\u28 v5&Ż,U,YWlcL,|>L/UKBs6Ee %Tl+BSS 9 0n !:,PY G_ϜKe:4ݍVR VCi3> Z)#9}DdV>~ or9J- TV}Ni7RiVX=$@U2{n{V*]lZ!C"xNA.,-lĎ7,V,[iP #L,v*JY@1hºְҺ6Ib=YjIeCB"{ҴAow#+7e:j |5?Ea%5u`-+Մ-JwXa&OyR$5m= ]_ ߰|Hâ\ꨁ`,ݣG[}}v޹F-F7V bOo<(Q12ow>.(#{݈Py-lDK[0j %Q9ZdxbCM,J,M#3NnqUQg,Xefk > P5b*_Ov,6d*if99ن2'ե`6TlCt`-O#GZ*4Xnb̢͐S`;VU+[$Xmcj)o5~~Ra9v܆uW}槙dz `99%F!hFl{`'$"PR&OuzF{Ƴc;7v$gbVĒ&W5#P bcVH+n'.\nCR#P=G$ujY'2)!AaaڈN M@SXj 2557=IL1b Róq,#94Ea;#e؋k";a#+z: YK`ˢW{;.5r:۶azcF{6~d#]l7)FIL[i$d q.YIve+V$U<"0j$yeM#i׉Ɇ$vѵ {PB,/5Ld(2Sd(P۹9gi@@P“wRQyםVx&gəkJ &ʤFmYNANƠbZ/̥еs"~D:&i PWU#yQ˻.8E_,_ hXKbEdPJC/fH>\C=t3`$cMӨ-1"f~K2(D½?;k<:r*}ĩgq+.[gNhёUQAںwQꆈ0b׷VCy9=S"޷i=O .8a7'A02_Ok \PžE~DU5k5 ݻ|_^hJN'KD͠ܪLnrD{@ՅE^tsR$K'VٶXR3`6A:uJR0YZFFKNRw?z\o۱?=,KmqkmǩX1t57ljJdjoFPJi+!S/@;ˁ`""'Xpo匳ςi6c[j-1Zme {Ek kjwXMf$OZ :@/Zb hoS'#IQ, LkU%w,H@Ǥ?ʩw}KQNF&Sӹ9l)m-X0@50Z$F~dbk싐+j]FLhd6g= {h4BX@iH_lVn1 2AJN{[};?s }j(fjgG/ K0+aG"Ci컺IMb7VXm9#j2 mx'.kPtOCZu/Dj$ɷnQH=•rsYF  C qYW a긿U$p IDAT jP\fAp,SZt,0]]lǖ`jbN nZ'6.J!?;\[>*~.vOƨeaY)KTSƆWeЄb;K\1I]\z gn*Yj +FG4tn;D @A=9+TQ5;* i]'9?,?"L"j*"P"8%\XݼKk4eAՆ|Ϸ΄ $]@XעלY #Smևv((~󛭏iR@Fz O ^LAl$cIR2**>FxyL#ci׽O|X^f|y,_H=BA(+B{ QDdO/dG"2 ܢlŌEyaI@5dυuGu8Ew&K+iXX1GjމND醪Gxn%5*bJe)^EP"|!^A(\Hv*H 0de1JvmMm6Eth+0YW"kSf贫a&m1JWRe~gji?AO(ʥe}թl%4H;p{ɄM=9Q&.^p+VLDaz/K gYG9S?^\#cS9  x›^H<t2fhqQ3%U|g&7Jcus@9fʀi(Шq♮88 lq{2β}q#ŜM94@Q$2]9uJ6PCj@S$ IݫH NNý|-q6` kȯ޾/4W u=N9d[R`m7k;H&%* ac3겢 # Z*N~,9VLW7QƂŨyH:PiT+Ǿ-آd WLUhQ+IZdr=/Pಅ[0sM-Rd(.')ۑt.J_2لE,P HBg5~gXQ2JUS:Ϗ$'z q?bÐ|BlO]+S:1>{/ &]>jgc>pUN;-ie|2􍫿H9tqu vg3T{ѝA'kh;(+<Өj#6.P]&|EC+PcQpQ,3oݙ!(&uZcfF@Kn3Ch(\Z=\-?èMlNi9= |\B4.'HOe+Z*8~#o<D|OY5Jx$ xx\GN Wַ1 mDFHZ.֞YvOo|Wڹg*JaYnI)Xvig1:t4=V sEqw΀(ʤIR2TuuPZB_(*exUIbgOM/J^PÎ" f´lՈz8ʀ33lEiԑk/V`y^<3\RuPw)PI9R^oʥmH"w{X @2ys 2.fL`d* SRJHWibQU~Pu)([Ƨ|fogXkE}i;Z^ -ɴ?ˀ.r~ѳ%zXk"}5\3iu >l&p!,Dt'Q>ůM:zGW<(@)8E7IXr^͙ &a[%ҌrzC-VvyubW+JZC&{шk^P2i6/bFi2]HҁJg$=9lx^ 4* ,E+ZsqZdk0+JA<P`Q.:, zY2uE]@&IHpɋ8Ƅo.*%2[k3ׂ: KKPS5e􉵶z2[ [ZJ]FLKqq7W|"V4M ?Zp?ZP*@<;[&ptѩ\'o| h몚4>O&>s9+|~a%VvK'#{,HQ?Gܺ}3ezfdqr1"|8@3:! [j|+GA46|69ǯ0{i.)ˏ(G?v|m6 D5vIr)N YU\9_Ưc}G ܩGKՊzfn$vSF2 `@6(ɟPVqfa^$:WUȮT`2N@U/7J ːybR79([<ӆ#ϹsK ݝ5ુ+ZMñlr:ˮW앯zv\x9EƵeө~lN^]qzHK \ݕ;. f'Wy<P&{7`)Qo_S;IU[>O{7bRhh_̧ޮWmM׾^7݋ݠēOfwuvO~N.=vI'٧?q{K_曫?!N_o[PȞG?!{+^?~e(ҥw7ʭmo~x]aW#k7۽c7|-k_m=iOٗ_nO~ܞ~XǑC ~d%~iOt/T ߜ™K@5L@qg+ {ū˞s]pvA6lr{rBj7-74y\M,<~sӯE{K^ \^ےKFf/Jds=?l-wl6j=YBV}?N94z^%WkSA[f='OYZ=yϳ8NfcN{uc pQ#KZv]'s`Xx^+ IK^rSUW?Xb @᧬ BJHv}Ky~q/l=l9wEA*X~9hmظ,[df_5lTnկWFw桇>!7w ۭFJދl .SNas뭿z?pm)P>Q{TJu?!IQ/ַv2S6`|}["~ӟg3khU|-Lv7nŊ]ԋ9Xb[d),b?n"C@͛QX=}>wʁ|ÁBfU^`0WOv'b{-ZY8a0ԣ=oWV,}<+`!n>>sN? ~Z{{>hNC}jjӶw.얛o>淾e5ntR?b_R(c}wk_}sai[-9l~՗U ϡf1᳉+ֳ䤓Nz!_}C6ST##b _]{G C*%왖&=jW[+0A#*6~UJc3:{כ-/SN;>/B\jm- !t&P  }]uzݶ=88 dPZn^,wP7s |jѮV4Jm;a^€6_rF1~&HE!v_ 81\tQ1A/|H~ϊ=]w7`LMOKVpBВݹ(((Ca=Vt,夎E yLj2;nc/j@Cr.gu靤n QUZx j<(}'Z.]`" :Dˊ+m_@K }P.Y,Cs\]UClnFKfF XтaW)'?X "mOg8Kfs1\݃Ճ6cp8#pJ/EKU_Wj0Ķ=oFA1#)|CP}Z7(r$H^;WT؎ǷЕG?iXr亟ٷM^P Ǜh R4u kT\k_9.|.sQNYNG[;>t/ ا"t:N2Xfby޵bT挳7ŗ< {SbWUqB)lԦh"~\G-A$Vrʩ@c9Ͼ9 |1K?qna3b/Q_-R(v]Zb   9gGw& _A(s{E>yϷ8z*;LʿlsϻK89FϺyē} ZI^{Rs`a*.6 'u晛?AD5%yXʔd#-ڽs-gmנ}>O}_kCq4 }q>{;t㙜>>яDz7~@G~Yv%=Ec<Vt zm۶٫^U_gJ`:UW_u^j/Qj[G}^a_&e};ގ G_j΢γ7 sfStn(V<IJ`ոH=IOpe-]bil'z:ZK^rϟy&׼9֮K+']ΐ/>"We\3/BKI˟k5 Dt {9KX{~v+B1J!?xZg oz ꌫlةPw= *g5\coD=E؛X[K=vߖexi|;3WN&O;ٮZ: d~׻ƨu@XW`yb4lQQ ˯cJaVۜkcv7F?o\{7Ponma-.^w.(];-h%!m\Su) jCZΪ-(׮[`SJqۿwMoD9|t,?]8B4fF,*E]؅^hN݈P Nhimqo_u?f>?}^o|]W47CNҀc7 }2]xхv5ه?|s;*;F;VZl!@7x*yS7L.|Mq陎GRS[&Ӡk GNC}+%wu?PA2Xi3h4Wfu Nihh yYNXm(#3PA7Q(Up^Xk !÷E$4TqT'79=s\u<0$A H"-ɔlٲE*HITʮ$""./"&ˉS~Ȳee|x3;h\`4D6~w>}tڤӥdE&דLI^]]f?_qI(֯6mwOST˫?5`ITb`gC=c-Ԟ.s>׳s_%d;?yN&*JPXVvn D+O(clv8$;T?QE"dJatiq;XRDZY}hHΡRqPZQA;,L#YUr R(uLF&8N5p!-9HauDV\W*J{^c. ~{:e9&%QR*QUSYHc%ZLNϧ,iFf́1|*Qb:[בR#4P]nQ24\* zݦj25)@XҤAy\ʅU%XH_Gq, t3 6PiK`.EO}(I ]9SY*ai:~wllMVϡuO,z#5YʠEP ڴdLX "BαLcp6sHjjm8i?h"Q*1~{ .;"/@m&|fnJy {D5upJ,"9ƶ}葯Pg$X:6nl=DaV`yz!v|ٵ]nh)@TO XnRzG!;vfr؊ en8١1yfxb ]}ܴ 62Y|-[?f5;֟!A-{ĤMjy~v]t~h*r_MFAl]zX1;`7m\cwٙsvvh/Un"0oUP"-w\onܘ-Rͱq"(\_FnB?H՛l@> 0FVw}i+-"X~h4`,:bPC =J0RZ+T)޶K/(^|jmԫ6ji ?^tDaMuWj* ^rH(or|ʆh[>59b7SŬYd虀+P#C4 ޤ>E["\dsak(͙ El#i } alkz2Yygxpso]mEqvѕ-ơ^~~k5+qeϱBYg n1Ǫ|i&&Xqf 2\eE{qjs>>zӖ` ܱ>~ `u$_JWSVT/ۿ6Ŕ#r/=CaYN@zŷg;[]aClD0?"pw7f'vW[5AVlۭҲ3 =ݪ!ʇnn lf \Ľd#nh"DVe[#ZW,#q!j>twW7ڣP1KF? bC{<ja>fl:J[F|<w~{e:tio^6"mMXu&h] @^Ҵ?4`u+^yv>2EZItsb)mμ^ MqT> g|w$ÜeW)NV2r>_P@Z~5uw&;3 iV쏼3ԗVP#vwV?ݕ\|Tڍ-f'| 8l.jgPX֨#łx3xÝͯ/7x8.Fս\^6i1bQ$61> ״nz456ړh"승 @ֲB3:@JnBn=!N5lnA4+13M`tRLW93"d]j_רʺ' Ѻ,åM\w/W5ƒnÏUH(O6fy[m6|/¬504G9@̗ڥ=k)K;FֻFn:NhPh{:mr{U+EPiHeRÏ)nC^"S07˰ly@(id-"(R[%堚ΎzA Gyqܭ:`[ osCc"E I~C)x,âe'P*gh$Tɲx^xu4iXSpS`m;-FiO+c!OEp{<*re^!O:,[O4!@X+nԖ>/DvSo#X.lv~@{ ˰ҭo<- }CX m$OH|정<[ܯ*t_rKr4RGq>1]@p0ŵ>T`z~+%ٟ(p*$ 9g.]Peرg}Jh?M{sob@)䠠RC kFigla+ސ\aeFiQM2{P>(<OF4KcN2.o AЀ]{R5r[ L;:8nZt$8"ZJL0${j%UnI6jNR!i5Dك(l]֮t(ǩMh*MC jTeyt)t,П+/^2SGȔn5UK H:(t>yV *M^Ow:kI'`)/@G֞d9,i{*TSe|lKGKzO7\ɷNWVGe'O%Q<)(ZO!J{̱p% sLI;rxCX[f?@ Ij39pӒMZ]/t6'9FVщZ^۲#]G{YN{D ӚlGrlfj:pG5IJeQ=yVͮSQ6ٶfB}p(th| tJI̲ł_Ȝ>d* Q6 ;v]Ij=Ƀ|qўdYG˅ ҥaDK! ׀uCnQ-"Sָ&ܾF0`/DmlܲV"Ql:mQ'KPGB1W~Wg f>`su36´_[-X% ysr#ֺDPzqn_r@ @Jasq -7VSMkHKS| kvXjxq M66Pk6W}qSiw޲._a=w]|N^8i-?xhLJٗrAuDeN1ml|Fۑ SR") ]YVCvj|VQnRF9FPoo&:Ɗ!{xuɖ޷E x$7nw`{aLq36ٰZn v{3/'OX5E\d*;,;CT笀 \ۂm,"[]kf/"n udžO[C/?L N$mQ(I>?AF Pkyc$SL]HC.leK/ ae6×6ZVџ//nٱcF-[Ȁ#w^$+BI Oi" ry|ٮ%;{wETz3_25PgF"&<gGO%) RN[4P 6]+C)qF[&{hڛmD>&&\Bu;[ hs|Ս Imuaj0 FF8$X՟?Rq-D[4ELI/Sbxjv.T/o:524mqzޏl~e&W꺝bFv 5Kuql_he% CPo#Ǩ^݆v]b.Z.KܙO ZemnoCh3Sw?@ qiIJ**yc@wDf o@OQ])hv&Re?'Ic1b{) t&O ܒ:g @iN$6+dBY pQ>)䗨VǛ ԅp0'?`T*hX[̀}#Lx8iC]3vʐ0Z?uģb%U+ !"O|{ҽkVXE/ Wo]޷fe$2BR}š61:BC+OPJ5S(0ÓXZ=rKb?Tsg&i8~;SV#4e/]-"`m @ '/:1xˏl Lq -b/+NTѨ>TpiaJWL-K=fWZMǫtNaO'_5G38}EgQc"S{%}0Dt!NhX'!>"W? Ҩe;/hvf op⁍cQF*g,|q)<+K2`0j ?OTPyeNA/[A`H kиa#n%5v4Px4wbٹT)>׬A5 wOCc_Hih~(AIn̈\ {ٹ=ur0ߐdab%\'l?jvS1 ɕxReX-;kZZn)J[7f'a'9ر3r$o7?&-ǘSuZam ZBFf].wrk.9bh\ʄגegqIx>nf)|nxY:PJ |+u`N@Mph a'!;7Nx\DYí#fOkJиۦ=' Q #ZrH> r& 4 \g)Mfk-LN3UJ ɹKB$U0»Ȕ~TL^ n8$㾇 >CBoކQX::Ʈ9PkX!*_{#6!$j@#/YU٧`4^qCc̿ڟˠYJY,^0K-⁒Z _NVF/LL6wGϮ-vYo=rPy_! no%^L実NNL^a{y$IWhGE 2OLz8z綾^}>r}sP}KPT+?uK~Gn]Y?u~u I@]g)ٟȢ[ZE}0zvK[JK6>z~- %~ORP+Cb}J(!/ʥ:C^LWŅu24z(γ݇CƇAXbߍr zK}?cUwȃy[@PtrAaP^Z+Hǻ:wd~3Z`Ҝ LN`8%HV /K0133;o@ y_PN`z͘%Ba޽{ K|֛oŵ#`!=+u}k?'zwei;x\#5'k&aȬ~^z饯9sfgZ)#g$+^Kqpά.e6+_Z{1cQȮ0_`K E^;2g hoW2J|},0o KS ('w7x/`űâG9j-!ϛe(ҷa!xEQߓIDATR?XqHO5E,t.tDO'NFENQ"Ϭ*U]cUy?w:R?mNuP[᭾AZhE@?-֏Cmᘬ'Z5w~1V-_j@0G 2Sq2]@RQ= O/'#wO&Ndח WS_~7i6XGuJM=Eф"0&YvGA_sw\µkf~Vjv6+)iAۉ/HDjO]0Q+ +ko-vk>o՘: v^*I륌^ z48Ȼ? ۦAueֲBř}x[Bԕj,3?E:ӹN;iWnJKvyw%`:!& vҥ09 , dE4Gt\OF3EԹDt2Ajp[;`zf.g!Nè(Mlq8,ӧÃ}~~^x6e ?/#ދuˮ+nW`]xyΝδR8X}Ũ~pK'b躎8W~Q:YCWncvTQ!Ni84˞O̼;={yêtۗdIENDB`web2py-2.12.3.orig/applications/examples/static/images/infoworld2012.jpeg0000664000000000000000000006116212564727256024713 0ustar rootrootJFIFddC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((@" ]  !1AQ"aq27Rr#6BTUbsu$%&St3548CV'(cD9!1AQ"2aq4r$RS#3Bb ?5ךɡBmIAp!^s'vY&)Œ6t{y+OPUZyˍ qiiN}4O;amΫKfl6[FZjS8oq-l> $=1idͱr_Yzry:k)ԚԚ}T:۹{}GN,ytk__]jtk__]>X&{'>)a1#aWZ&ԻOoyJ֢y<0q{qEi8h?zjҕ%35lbYünpd /^^Ĭ?ZIX&Ԗ\e7 D:HBjpQґ}d:N9:R9+ѐ pۡ%VZryw}3 BDd-|i w JH9u[@ei1nA#SX_X'7>,r6v^TbQ}]HN 8)<C;[(#IcA@l}2ص{_]Fg˳*$@ |7z4l-#w5 )O(P vDDbӵP(_#b\..ЃW5iih $[O`-+{/Mڌ7wsu[9"y3j>jS :]C,h _h{kM_]:ROm _h{kM_]v#4:-2^ZGWEmٴ֢?km<< -iHR:ihuFi8Vw<{*t⺀RM~ _h{kM_]:VN>CC~Om _h{kM_]9$d9:oMZGWK _h"G}Ln槱|l>2^ZG_]92G,Tj{?&`-֯44|e}t<>cYcw5=_&qH ObnuZ#45qKm ԤX2O}@+4M▟dRN-ǘW3AkuWYw_y{գyjMTJr78QscGkn}cc\XhR7,:lڼm9xݡ䡓 Bf/REIVN 6jn ^]>CM:zZQ]$s"b+pz{ش➍js֤ I֤ s]CurNE)>#@|񣞦/M5M&J'l>~Rχ`Aj\{c;l:3,,ǑmWed_M4s9D]61)Hjzdt3v5Z+?ʖ†J@ϷԺ=`,(ܤTb:GESM\S0DGHJ>sQEtHǞ#/umX^JDžNUQ\xlyW'*.;v Vfڕ617b#Q&bl`mrz)k۵ޚm-)R'oH\NŷBZ)- ueJN! s `6Ό{ 7폔E+pzwmzSѶmm ˘NQvnK&{^nZggiU> LZ, Jʎ;x~â-W-c>B]¸>e~[ykP4у wސWVV<$ToI:1< 6:6}tfֱYi0!(GX7HRTIs?=0쭥RuDv!(Q'͏B4Jq-6L!%G𻪢洢e> a6ߏjpxb2 9#,%<6W:^2{|9 B qeH:{g$1дaG_]n~Y>k`+jޓаnt;Wi5 H V @ N*  ӆM qF^᾵O1lw-*5b\msnH{* 85R3븯RfRoz٥Xcy4T~&G1tԴ;?njy@R@i!8u#%(+xݎfZҶd[q]qqO, egs^=r>JĎPUa(HQշGGQ!T# ;r.#H s-<ҕ%̎xE9_P6]TƑR/#7P^Ab6jzC&̉rf}=!!n G#ǐNme?4KGN|ta68P6x89)%Ӧ'o0”q\o9I)q9UקvbEP ROH_qP +dZuhcGaJY ,ݯN'x:Nz#~%S4ŢN4gz&򴨏GY&546Ld&iћ,t̫Gv$9 'wG4o#k½Ev[Q.#|>*?=.6PG%r>P\p 1ZnnjHBc[mZr%VB85Mĵm"kfAb@eNm"k!RTRFqM{0ֱl?$JJҒ7wI0^B_aG pD86YDkM4[[:R2%p'=#5.WK#Zl3!0z-6nI)FFqي`C"cwӳS/N3:]fsum{{<5nH~ZRfKr2Oj ez^l\]$^Kw;)Ipp<*9m 4}*].l)%d$HH']t=sqmZJyq6sgm"fQh7rwTxlh-ؕ mZ@ma;>UwBsYɴ< +R*OYϴyim;5KY$ILYPp8Q$ Tt/oL:"hzi"Ǜ1W:C Ɏ>+TI(Phñ}$&0nA#=PiRKq[IRÍM-nJwebc ըi8gUS6̔% ô֌7Z;帡Ȭ<+]m&&p, [0b/8Fxmz9[z]Ma%V ( ;VƱq!5%Rpd`r_LnI!4M,c= oz&ݒkX">\Ȓ%&K i)dBNkjXuG]dCy)'8+`-kMؒ/W!m oPT'Qh z^ME(lHZ|x*]h4ӆZ#MhӺIO<K<'SKU=m[0R791¢{КOC\]=K2_/K%-l (}U-tgjJWebbQ dgEqYJ"Kt˳rkr!ns4X{# (qύH}K7wÝZﳽv3Bm64&6H u6ڛ8FR]Okө$VT9e7)m$'O}[t fT6CA{B:"{gi]v0 #a! *.8N;Hnc EArc<@i'W7irg71FvM a:@8vdR\#68kA$MmOd-"|SlZZh6:f[Teg<}2U[P,X8ski֝ llⷚ^\ژ^iьeIQ$U͈%ia t4*T֓~WDRW٦*l}2XfqTժ~wHSתGzwHQ3՞'}Ƌ?[o4M1#ODޮ?, `L]L=Oj&$W"|V~ #+|m"JTGwdz!7pԶZQ:yj8 m2=EW{PA5#WxO2/?%hS:0ۿ. mj0l[Ll5P]stlW22 =ghlHg}{m>=L6utǡ:-/Ȯ!w4I eIW5%96>nu̒ tlr^㘿?SF;.]fF"@.xBJw$ '._uc ? u-k#EigHi9kE 8:!``\z-cXҮ_mv46Um3 {nՠ|%΃ ]=eZo%'V TD$\&L;6)hʻ>vfZ12_EXy-8 $l`4sl4ڣ< CcHg>P*C($ΰ'Amf>vzz+)nKJ;g74:sy,ڥGۼ<4W }u Av(68YKv)RJ;77eypQk>KyGiIꚶG\zP̺'@e#λ҇UG- xOj̵BQRҨqK;AQEnZilM[-If8 ;w;j Q"QQJHQim{rmT{zKS⑺@ rS.@bץ}.Ztުr<2շDY~ou(7Ͱ)u>+Rܖw@o%'jȰ].*s[kzX70";ij(ԗK1Q#ydPmڽ:kvF~<+a(l㎭䕝)@moE*ǷWZTt(+Qh M;'wanGmӏl/')#S],2R6 /eCIvٶ;0rnq3-%+J吠8ѷomFD qHIpcX3rf7* )ZIn4F`G i/MGSh"n;4Q/=hM'rC(Jԓ.Տ0ˠk:^EAꟊD(qvg1@}Uq=[ͭDҌ Z)rpqR;VoѤŽ㩧RܣZ00O>+{61C;kݝ\k}N9EF_>r p#9>xlIi}TXvpvHʣ(7[8UZP UlKE!AnqN\fMiQ ! IvI|@ӚkM-P]gN k 3?{DȻa;~TG} HSrnҭ$'s n[J[9-nw? NJ8XO>QMzvwHQ3'}8џi4ˣߣ?HyUuz:3xk׹,$ĐI-+z#[g+\+-%x޼=S߭T#I@RIkRh3RT%mU}O;7ID>vdu2W9޳ Ös멦lwߘT)DdvE 1#Ɏ$0ӌ$c’'5i)z95% DVi纕GRٗ+Ltz;<Ӷw4x‘F*%╼ 9T1WW~'blpQFP7[xM2pfDRWӃG|vU]ɆRL! R9}.CX\]0QJ&4s;jo6ya;o!x wktgv4$W94\9Op/-]7z•=@ [qYȼYYu%Tb6\s,6{ADi[ ;$3F.eǜ'lwI4?6f7a@m XJӧM4(=Arqt<uIo${2OQ"@#Ujl|Du]^1w1]u$Bkx 8*c )'j)(䣣h {Eb^- 0q}uC~T;ֺ hlvS֔P3R6OZ]g_\dt{z_4'mz~˶5=}MyleX&da%ֽҋ}bj( FI|V9qPs`y2o.x,}[EH4/-s|Up^nFϵWѡ2`.9c5k a\BJyr#*'^Y\i^sKe$OB ֤ғP;T2Gb)v˘%⊃m+Wqo&dD,VahFgĔԄO6sROxi&&bkOT wY7JIWzOaޅYv31!6j)Z0R{ve"\5aC}ړ-]ZCao㻰$h:]pL&ǫk<ʂ`2;EImRFqCeDy)0O(Aw-gbar(0*VKS  x#^>)\TdTy5ߵ_?@jo-w%Ǔi^w3f歼\2lO\R( \1O{ $ַvy;[Z5IԱ*~q$"ֲrFA쮍Guwb\]b[e#j>SPr";v=T4£%+BJ{EgZXwFr0Xp#{gR8e=:cҤ}Vw^ Vix)bj,jSѾ뤤a]%0Ox`Td4 h.kBb# (I]w#Pg #:ҐH9Wfl]Yn>Bjr@٪jE͎ݷ%,.e;;H_P{<)rލ!;2(5a&Jbe-2T _&z1 )C`r s!py,oflkvLa q''Y#L˼\Pܙ4W B3μ_a oQG2'W=TjNFL1qppmXU;w ٣YvSk͐ݮ }<9zEGuy" u@qyCdm M/@\W}nDwBV$Exʉ= 7{9 LFviNJr6o6}ϸOu 5/5J%t^n[*P?y)5N B`1:L;eq{i4olo{vȨ?ѫ4MY(sNRTуG8Ibӊit9}#Es\. YۗE'ϚKr!_sx#ؿOqSўOQ(h^t(̥W# 'MGߗz͕7>ǰw RǙD(ymL3wx̛㚙>xaweGGwWggx IP2r0׏h@Znuea@M{4Ū! g)e 89ݵ❝^񞂟bk %ʆrT053^ί xAWP-7:IԺWDڸxEaDӅ*pLHiRP\R ̶]a: pdm*o?N@] H5zٛɌU$ŵ{Iea:ڊssc4Ip ,oXY2 2_l˗1>2{Uc7oVm9q\Y#>V|g\iIJx3֗xzޞ70℞y>\ϒBa*8=H}ǟZ*ZD4")g:q`4ܮ>G gu!P>%p)=q`rlZ֠AJ'T_2" {][)^!JN:~ػ4$d~ UH~wG!֟Hit+Zz'TTݺ炮Z5r\kmK^܄$}BE֢JlwwžI1cM9{ XXv@RrJ|bQ.Iy}y9Guk}$ط< EKӐW`I)?Gyh:MJiP @ā'ʢxyI7ܻ؞ ޞt=Uh#FH8׆ѹHSF5j~}![7xZL }4FsLOr4MrNCF/=Zq[PZ9C4ju 8wS)C^]OgF){'[y<.'* QD;qi)r si 8aO Q*UٞrF݅elTRJ*U\;|KUGGnC'V9yAPGYYWRx+r+’AGh (cS:>bڳ ٳ9drܟS$a@a%C@ɦ0r@O`6E-Om/5u(i\RaVj-ĎKD)NRGh´&67&;c6 9~]ns<K]XQ{$`+e?ѮgjP(&f;|rTR%J*%9nx>Jωm ,e#%o, |6J̡iJ0<5MK%Cї> 5\{[dXnob9A󣇥)<'`FJ9 Hڽ?#N*~F *Ow$ fWxɌ!ăX Nz^|!TBhB%/ a8JH^~E8htc;m'ѓޙ@L~S|ǒjx֭9q4pjLbIMuC]} i q\2Ŵ Գ+-(xRF? pTwmfa-6;[w~Rq(CC,c>6䧺VV}f"@f0ﮤqH5sێ8` (UѬ>nHS)Xc (Lw}O. ,~F3M:_~?HӦh=ZOw5kGTR9WfXZ=ZI)mF{EFE꣧딚Ԛ6 '?m?m_+/Pˌeq!ո@m#VEiH)QjױV(H:O>* vEQ]A\53b]Z=E>mO٥]nֈ\ZQH<7 x$yG1_TUݛvRqߥR hMYeڑduۤ!`H9J/UmM#6;ϛۏ%53HdIYUDǐ\h0մ֤2X55rvb÷ڣ*`B Dxg^D%h7;Y6YTOenS 0V q7sFy㶱mzTjӐڗ) iGrr5 :GYh MvƢFyֶWq@ոEήNk>5,zUޥ۴&H+J0̊zcUhV֤6F3*89mu[~5ES-:r#r%V(NT@t֩mjk{p5J a9FQǶ ?vNhq-]Jh2IRJ3N83Ϻuvc-)IB !(Iϙ5:O09X6qMI aZYڦ,6|;{%S$Y5Fպ!MU a8ˎBvRpmifҹqT$)16)k!7wY,i\KrK̹״(dzj?j~j"\m,(P$(g' 1-*RSʈk&f@gˬ,ZG[!qֶNJ {A/*#*RXHP73Uu5dU7{L^1<޽c }qފݤOj{~F5i iέRTE.|QbehME&SoGm sT໤{#QEIz63r +mO--i[COn C-I LXoD}r!>))*I#+/ܓKcOjkPյ@?/~T *'tN>YP^w%C~Yͨ먻>ݦ~[NHL`TJTsdzŪݨ`̚9mo[,Herspn,>u DW1HMMZVY#,=5.8=)~V6m5 E7@;I 3:KOɼ]0cJ($`ct=WMy|m3 ǿ*Rj9ic{h{g5An@o}k#$rTyI4j> 5!K@;;? -zv[!oh@HH>J[ 0ي)e,8Bf0!RnRk[-*$ڸۥCۘ5z=(}(HJDgV#oZR鬴V6rYӻ87S>zyU5GXN@^U/j}0l߬6[ze[MHJR1yk%trY-hs …QM?nҿe[42{a ĩIP=/O0է543j"7-#!KZze ڷ8pU?A)th>=ѷF1uєmnX\x#$wkWan\'v 6 Ԣo1)D;2[([E6mçyA{;q. UhzPh!M88)=I"2*jS^4ԕ/g>MY~R#eΰHpyR4YCڣ`̷⼤'v{=CX;/r)?PY=տv[ J5o'z |D7N[$\_Ke^9|>jEf:jmژV=UGjqSQBQhjl$x];JW`călHj+G@E~ў.DΥ퓍@MzMV4{A%f%#wNI=˰Ev5TPllQDDI,8v Ot)ziV:ҷZZxuˆ>d5D˽QN\d=y觌V]Cy齞H fzя) fփ+rB;u'} c'?Hӑ95iĚbD}md|+.G4#UdCܮF44~U֟^l/ܓKcOjku]gv~^Sd{jYݨ~wMXMkv{ػ1FlR}UH^̚4tWU"\-yMI !`̏]Wv˞l.D/%,ua\Fst5q"`u/GQI炕Bmț7MX)\.6Bx/<ڭ=󔖢' e:`5S ӛSN -=,d~o&F4sC3XTV8H=eU;2,E:ӚqJ6PRsfȮ8p<؄*mlW4C=[*YVxUKKˑ[J9WQ gԪ:t(ss棈2 W~vmڍ<+T؎:Z p95 ?],{T:a}YYK.ж Ʊ(_Dt胴J4ttly^Dt~Qwsnc4;j$sm/Jj&7DzږRGPc`̝&Fmꑬvyi:iGQ'<G_AޘG%`KXщ仱Jͧd!^~Gm%NFicԣ5?A^Dg1jBJ)Oƭ:It԰u;ZHJV3ٺ(1ŒjAK^\)E7G6ء_KgO6Ɓen*lkJ;6wlL S@9ŝ3;\UkWym1X䤠>>tc U95oE]?VտܻJ~Uױ]L -)%y,%G .`[' >Ca?nu,zذ=|ڕsx*ee6dacjCkiPxf&tg;T=8xr{22hw V\v.o6%'Q]Yu+zP<t)RWF߭͞zuDN7{w+ۥ.İix̉R<-ԎiBAJs*Q]UWwS/!ݏZo4+jEv!^F0/ Y% J3MOz'BroB 8 XSO#6er:euaĀ^k$$e\0xqG!RAX˕扺X[uŅWk2d/Zq! N3Èܵx##xpѮslýAWtp4 z'7API4hmv.@ZJ{XR>-LT_lcd9uP@=;yFv6jYSOULWTDѴ0.v#h '^k iV97_C  S.չ~}!O`S.Kqu'} ?~sNY8q&XCD7H?ƺU))QyhFJ g[}cDY-wdB`4C{]/ ߵm؝%rCo%*Q pj%c)#ƳòtflSɽi;YBлF7y2#gr8IVT=;z[=5+[ɎPtp扒UNʊg^QXtw)yǵ^~l76RR 5]"%4y-Bsh=Du.ġV[Ŭ8=ÉS}lnL!o72bIp>Z+**zGh>Sl[X %3c)=jپ3ƦWZ4p3o>$,r;I]v]ٝ3Ryⓕ!$DwUMB)-+[qqetL/!QRVI<^K$<#iM]٭yCooJppQ9L{ycK[:E ";̩ourKP^űm5f{Kvݨ7Tߌ7prip8'd&ǵſBk&$ɌJ$x xuhZr*JPSnvrvu,rfQ@Y>nsBuTf$\xl5T$ڂ@k T$t$d5ͣZl-j#Ji($JtJ^4~ž|D]y+pIq p*f¸mFf]b2swyv8dP&g.\2,֓t880S~6V&Xj6*`z (7T}oH͙]4qe= )fCe0G4ilV\'U= qSHl)D$a}* p*55"lR8')qwzۃ;cV|\ӞjmWU[v\ "eDp${ԑH荳}=5aRjlb(&t۾dI[RCI4I 9tK1q_jb/P=8}u~km7ނ2B($GǶ({J-zxT܎4:s bݬv]()P3/ǁIf:0 TwF=]vUKDC/)a]B#$Ɠ?4T j$y]`Tx;Rs'<(+)F'R%>nItGR|tQov y2qYg<Ug{2m8]ws%s*g k?et.K1%AD x㵛F67ƙשRR)QƸAZ)Pխޕk!l.d˳YmJ-ՌS&Թ}$ɭHQzm jv>F .$/tg\a`]+Zgj.N)X<;;+llZf[%) uCG.'b ֶl$dōn#>ܒJN8 dB[JA>j[üNH(jqBm!*I9 [NNk;mICY(1~,,."lȊPYq d(cH_AwH[LԳ+JuըHh3Һ/}]JHNY[B!?J87˵ڔ8߅Jmj{kRBe]mAK5ӑ HJ=͑zjF`ݷMjnX-kpu RP@:P Pvv%IV#=B}(S )#!ԯ7X%脂^^6.7ehO4HҦ1hqTS S.Xʼn"JP܍/[;o%]% Y(|][vr 两>.NsGq푅ʤjD91>2C+TZRFp9p0ooۢI1F!KVx1 ~17dr^^AcYވ~sZ;mMdTHܸHP5cz!Mh۪tmG5{bj ==m_PFh=Yk֫9ujwA G[{4x=j4ު~5tM>՞&iuJot(w'qVmA6Ip uѿ;Sy_Eߒ TMB:`{[Z7hnȢ]R|7$4UV3ٜs7ܲʤ=]4,F@SJP2"l9oJR}Fo5XΚS5 G^e(+.DFlAm(G_z+W[Q P[K%*W'>9lf#Tʜ.*< eXO@,Zbrc[ HPiW4`_|z۳ K.(xzHO4aTF! rx4&k8OzpGg]*QIZK>]+#{tӱɸ'z2}u`vӴ6n͝mZSr37K9d:2J`T}~ngmyCB_I<@#Y~iٕ$`˔]|&n2l˵ea^1VrR1ϕYŒUt~P}䒮'W"!t0 S]Nk^ns $%NPh+}! Hb67]5u;iKpG }b9mFĦUO~j7J^'%*˲ozMלi!'yJQRfZAlBq/2u2%@wwлrqpcIBՐIUGmQ2nvCM&tʸ)>;- +RRN<ޘZfnuM%Q $d9EBƌYuJgHܶU"C)Sy N H# >AӌT+ֽ=ciI]fH@⤷QݒT)H䁌}c_?Q$Lɰe8tڥ) rsv`oŶ+ig| UT+B{k LjHշ]+]it*۸E+W{<U8-, -* B]rqW{+ȵD(Iy#8/ lK1ڼ&vm:*FAkKRDAqaMΕkmOei~ r-#~;T88zomNKBޕI+ԇֳ"Y5-nCA J[A#)H)) ·k\..[ >⹡ANJJ <ǗӞZ8y{ZUŶIm{dkl.1zxr<l~UX7iYѤ͖8Rm#$qV9IoGrV By*'2)S\*y(AXÌZK[!8˶UCIQ/FjJU\~ qލ]m <+YGn6 }1znex$PJR@5٪&!;n"i-D{T i;^M\|3Z~1'kURF9U |?oGvW]{_>ZJڻ~xE^Saו9RI1r}prt=6j` Ux-bSQK"FqW~UX'}}[šeZR-G'O:z#ể/({o`sQ:@@TA3]#+Iѿ;D(_6A۩ish2VNHfֺW[Cla`Ry(vb'iiZ;HQ(*ݵPTfOKmÎXX*IQn(/j\tNOS)QR!.9CjiZP :+JesUX[$ޖ\o(JT)'F5ؙe5Md8D'ЮW+d_mqNZܖqÿ5k]\!3.͋ޱ)B7I'H6RY;fty-\}gP-u~"aOPk#퀝:䧻+hihUi~8,'9 IkctׇU If>;Wcwswӌ, \P#oD=鐢R K2#":#r[8qSm"[cT(ODsR#T` 9ţSm&hkjv-weH$=tTsǪݰӣVܛ|M6rr>B)0kMAQ'iZ]}2£a y*KYu4 ;) ~Lx}P9ń쪹jF&ȻHH-kʷO@{*3QRZ& Hmoya[ 5bv%њujĉ'ALjO@8->ޠRJC8f"O42˸>LVB.u^lmgm& ԥJ*eb)1ٔؒo26BRKU[ N#GC_D T.Ps.4P&\~KsR]k/KsR]k~]k^T(ZWZW*%ֹ/߫JE/߫JE/߫JE/߫JEֹJ.ֹbtT]Ks߫Ks߫JE\\ҥQq.~].~]*UR\\ҥQD=t=tT\(ўj[dÁĘwWF3 i FiY@[m!)Hʕ*4zҥJweb2py-2.12.3.orig/applications/examples/static/images/poweredby.png0000664000000000000000000001006612564727256024237 0ustar rootrootPNG  IHDRY`YsBIT|d pHYs  ~tEXtSoftwareAdobe Fireworks CS3FtEXtCreation Time11.10.10M)IDATh͙ipTו-խ] hڒAV^Ȁ IlȤ۲I*L*'jfUqRq<)-dq6&fs0d(`"֒z~CB"qR$S{{?{S[[rUU4, EQp:XE&AUU,B4r!DQ "LJa:ii(bҺc-@a{)%iBˍ7>uwwtŊ-++#NL&(*irY~?UUUDQt]GQLӴ6ML&w:i rH&d2 @ N#$ ! N`r]*"v)߃(BggݖeDknnx8ѣ]V4^+W} ]{AJ0wy'Vbǎ[NmF8&1g8y$\pO}SrsO?4\.,WcddUVQ^^"֭[Y~=LիWzIJ,B>EUU yHӴ0sLN8ڵk馛ؾ};6l`͸nN:Ů]472>>Nkk+.]DҗD?~Vǎ#x/b>χeYvkׇXndt:q\b1|>w&!Lzuq㘦I 0 )%lL&糃%IEH)bv'Yc<'p( iyDBLL=E:eMRIL洞NQUL>E?齪vVTxYz5 .Dag)T$(@մ?z8e!-4]0 ^z%i'Be@%iWD)%C'N3؟r+R;H ҲHLLA&&x)!RIP]]mDKK f( x}k.xYkXx!Hx`(dS6M?^_Ҳx ec&(-9VK--ZuJ*p])~i3MSSS, _ꪼ Ě<|W|3T̨FaHsRJFGF8k<#̟?D" !PU|/| ر1^|E"8)%N݉’]I"@f8u=.̙34L3ķaҥhvd)%(jMALj*A|z{{ijj(^L@Q#Q6tE^/ Q]89L2-Be+Dd;yk︁4즟|L kiFyy9%%%4\tEb8?*^w )B>4;([cǙ>̦aRQ][:z|~?_V($Il~B@_MIN'ÁB()xﺛI(13<ӅQB{9˼sQUyuL,bQFFU[hǏI&Av#`xx~lٲsM7Q_SqOK)ID4@E{6ۓ'iDHRx|^u5.ooO~+DW4Y8Օ4G">}n@u~q;mG Aŋ.t:sBp8() QYQAv41/ N2lN;OY$##d2t]8}4===:t#GF9ho`YP(Dee4 @<)%gS];~$w+hnn&]'MUw0>6NՌj\^dA.W޽.\4xuxu^ÕE'OŽN_ 2 d(I M6[oM6SOM[\.JKK @CCMMM~x{?QTuQCs"˫?,{>1-[얭{エO SA##1*L}CgΜ(g`dNϟ$6zY$E7; E>꿯f,+mJR__x߽f|$Uj,/_Ys׀|WfZZZ`0hOeaYS{ 6~(K,j *3?oc̛7U#RD_~W_}uJ-KJK9|n A.o[V8Q[R2 ;; hˑNpXd=TTTRQ^a=.l.eƄedQUtXRJػ{4M$d`@6Ŵ,TE֟v"@ecc54;7EUȤҜ:~cǎq7SQQa( qmz{{I',XMU9Iellf.µ %-83XjX (?6cZ&pPI_])Bb|{rD"Y+aBX4cRqIgM[5d&Lt\kLM4X% b44@dw'3[;9$''?e4]|Fh4( nFUUtx<Z-B4MpTU@ex^ZێFA^v$IB)@e^/:UUQ!HPSSs`֭K[;aaanr!2f?СCq sѲ,*>sC G@@zEQp\~@$It*l^/NłC$ |x<wiB0w'&%%- |x,ܾ}EC]]/"ټ;z:u*MMMTUU[Xv-Ք`ͼXV ^;w$77(z=6˗sN>\.K,a׮]<6 I#F0L4ih@{{;NxƍGEE+V 77N<Ɏ;0L԰o>t:۷ofƍ7 "55"&..@yy9vK`` 7n$..F}]:Yr%Lhh(aaaCqq1#//M6܍*d!:pwؙL&"""ؿ?sȑ#w@Q~mv1cn"##tt:i,YՊ:tcǎtDѠj1 8qYfOVVg6y|$h.\ωa̘1NHHӧO޽{ٳFmFll,!!!=ŋt:Y|9455p8hiinF~~>#>>w@ss31vX)//󤥥a$IBel2L&:Tbcchnn͛XVl6ݻUEQ#l6X~z^h4Ter)"vޭݒcЋX,„b>aQ__Wc7nv{2~%I"wt>'*+{rqY2 69z?6717vOAH>EE<;$ In2SX*zU?R ~!FC=ʚ5k&Xl~ !k(eEwm6~T/7fa˞ӯCfr #pֶ6{͕\ml$'3shtM_UUN&l&<$G_|=l2vn#{qA֭[GRR\v B&MKP{$1%1NKYi#Δfw8Ŝr +~JwPd"#)ߖ|LZ328^Q^#5! Fiy?k\cfZ:! 9!"zsd&2i^F8NdKx<|M--}]yXQݻ9um= .."{>Z z@g++Cѐ4a"V~[sռBK>0'3%DeUL3QQȲLZ|ej2lDe%[<>7jc<]'eݸgOOW!90 #NT@09>waV\ɥKrddd0k,HKKKd4¨7H _~[_5?{۬Z?~INOLbLcFuT_OӋG3SRz/ɪJ ʬ\ͦ"&K*́m|/{ BPx_>VmDjD4E]600HIIATpC2t=*:.xg/`++ho`i)$FGCr`@3&ŵkT?*L!xs6>!-1q3>;̉rƎEDG#'`4 2s+/`UI˶A.+H) ngwIk.t>vn޾VaTLLgWo4x FhpЭ&Zں>g ȒDHp0!z/lFXD#˸rD{ {=(,,gZ]O/CUUaZ]W+k֬ٝP} ^Wٿm۶uZhIENDB`web2py-2.12.3.orig/applications/examples/static/images/Stickers5.png0000664000000000000000000000621312564727256024112 0ustar rootrootPNG  IHDRY`YsBIT|d pHYs  ~tEXtSoftwareAdobe Fireworks CS3FtEXtCreation Time11.10.10M) IDATh{lTם?yxKw~شsvu!d2MiA2220LS5M䨪l5 ]ɤ" $D<GJdz躎?^z9SMMMի+x<b6uuu:I,[]bexx ^skoy27}@vN6H2fdd6p̝;H{Y;0V)%^5)%A왙(J4n-|It]7d}b?o^ X7+JH4J4q7@o/o>LqI16nࡇSf’EsL>%vپ}s%{dU}IrQZcǚhmk>IkF4TUٟBrA,bs IdxhQ7tkq6hM75'ʦPHT,Q2Tx d'p:Rmۣ,_V"3A27/_NSqI$GQNneɒ%d9|dhh(鍵[&D5QTTtCX,FEE׭Q6 N<źcΜ◎ywBMNBΞV_JO'Oɧ~M 牽#ֆvJ n7B纺zYzFFimmZ7 ֶv. f3{S19mk"c!|N1NDnu|x||FB-*l6S?yh4 @(b0wIv%9rg;] Dyy999dggknf[tTW̢')ƴ,XpS&f3@S~>\Z\ĉS կlbL09־ 9Dj"Twy?؜n2`0׌r=|eF6F%l"/Mw{ېJ^vTO[byf"~ O?˗/coqpa`ÆF֮FӒxb hmk)… ]{رˉ'8et:F|oP\N]mKcY`r>97 2Q^VFII 75Dmkf5^~ˌ!7'5&wܜ#@AWW:u>@ϙcl(B 6HH#}ΎI>p'Կzt7bPUU믿TW{Sdx1<<ҥK nۇϪXlkARrmMJ~*u]GӴi;B 'nݚg``UQUhFv pEn'ĵyz$‰1-1܅]tI5CD{2ehh3OsouFIq RFnnn>3B3 NsB)%Q2wر_ ={l?ukKIENDB`web2py-2.12.3.orig/applications/examples/static/images/Stickers2.png0000664000000000000000000001006612564727256024110 0ustar rootrootPNG  IHDRY`YsBIT|d pHYs  ~tEXtSoftwareAdobe Fireworks CS3FtEXtCreation Time11.10.10M)IDATh͙ipTו-խ] hڒAV^Ȁ IlȤ۲I*L*'jfUqRq<)-dq6&fs0d(`"֒z~CB"qR$S{{?{S[[rUU4, EQp:XE&AUU,B4r!DQ "LJa:ii(bҺc-@a{)%iBˍ7>uwwtŊ-++#NL&(*irY~?UUUDQt]GQLӴ6ML&w:i rH&d2 @ N#$ ! N`r]*"v)߃(BggݖeDknnx8ѣ]V4^+W} ]{AJ0wy'Vbǎ[NmF8&1g8y$\pO}SrsO?4\.,WcddUVQ^^"֭[Y~=LիWzIJ,B>EUU yHӴ0sLN8ڵk馛ؾ};6l`͸nN:Ů]472>>Nkk+.]DҗD?~Vǎ#x/b>χeYvkׇXndt:q\b1|>w&!Lzuq㘦I 0 )%lL&糃%IEH)bv'Yc<'p( iyDBLL=E:eMRIL洞NQUL>E?齪vVTxYz5 .Dag)T$(@մ?z8e!-4]0 ^z%i'Be@%iWD)%C'N3؟r+R;H ҲHLLA&&x)!RIP]]mDKK f( x}k.xYkXx!Hx`(dS6M?^_Ҳx ec&(-9VK--ZuJ*p])~i3MSSS, _ꪼ Ě<|W|3T̨FaHsRJFGF8k<#̟?D" !PU|/| ر1^|E"8)%N݉’]I"@f8u=.̙34L3ķaҥhvd)%(jMALj*A|z{{ijj(^L@Q#Q6tE^/ Q]89L2-Be+Dd;yk︁4즟|L kiFyy9%%%4\tEb8?*^w )B>4;([cǙ>̦aRQ][:z|~?_V($Il~B@_MIN'ÁB()xﺛI(13<ӅQB{9˼sQUyuL,bQFFU[hǏI&Av#`xx~lٲsM7Q_SqOK)ID4@E{6ۓ'iDHRx|^u5.ooO~+DW4Y8Օ4G">}n@u~q;mG Aŋ.t:sBp8() QYQAv41/ N2lN;OY$##d2t]8}4===:t#GF9ho`YP(Dee4 @<)%gS];~$w+hnn&]'MUw0>6NՌj\^dA.W޽.\4xuxu^ÕE'OŽN_ 2 d(I M6[oM6SOM[\.JKK @CCMMM~x{?QTuQCs"˫?,{>1-[얭{エO SA##1*L}CgΜ(g`dNϟ$6zY$E7; E>꿯f,+mJR__x߽f|$Uj,/_Ys׀|WfZZZ`0hOeaYS{ 6~(K,j *3?oc̛7U#RD_~W_}uJ-KJK9|n A.o[V8Q[R2 ;; hˑNpXd=TTTRQ^a=.l.eƄedQUtXRJػ{4M$d`@6Ŵ,TE֟v"@ecc54;7EUȤҜ:~cǎq7SQQa( qmz{{I',XMU9Iellf.µ %-83XjX (?6cZ&pPI_])Bb|{rD"Y+aB%l.ɖealc.&̲WAPgi)(g([ZCo*&~={ˌ2֕]D&(H6rOߗYgfB!CO4o˜!#~ygD-J~cq#Ь E͚`T'ٻ jzfr.QB- xemCToˠBD*>!EUR3lc#~X?\PڞȵA}x{| u6oEn1X! O,EQR$@g0#nѿFXnх!-޲sk:_"kJw>/H'~~q (X 3{>h^/rLMw͏N#..nǼyXb0 f1 n$ڈ &YfzD׋lnīd6djXg4t?L&ScHxxkʕYYY?TV+6t ?]@9 A$M ضıc8z+n\SYkӛ^cH;>W^իp& 3IMy`0[$ڇx77g`B&GobRu/^$eV:Dnk n3v84gOOir69}bz%|4)ܺI3۶c0H3+r<#BCC)--edb"*^4urь5Ec]k{1qqL{<`_ sKyҥ&24MËifN'ܿ" zȡ5$3kğ wU8Ё|_VgXzNtU})ň!C|uƎNޱS_oO7SU &{;w`g5O\={pBd㷋3fd))*4mj< (&a4>I^EuU8pƎLd9s[8ve%{RR9uq{38!) DaĆX&}M~>O{icPpOl_pSY J«z c6m7S&mkm6grsի,_rTl P߼ͶGớטKp8ɒwsP&enW^+b! &3xPRBQ ZN߶]< +7'{S0sOaT}=w]`ZH|AjoC aؠ!-NEAl&=>]^]&U9YoP}[7V^ 64!GirWh":wBpppClZф[TTVֱV zp9/tؑ7n4{s?M+V}0ƗED7fee=vw4`P͝;JQsIENDB`web2py-2.12.3.orig/applications/examples/static/images/logo_bw.png0000664000000000000000000045104012564727256023670 0ustar rootrootPNG  IHDRj|sBIT|d pHYs  ~tEXtXML:com.adobe.xmp Adobe Fireworks CS3 2010-10-11T14:11:47Z 2010-10-11T15:00:40Z image/png HtEXtSoftwareAdobe Fireworks CS3FtEXtCreation Time11.10.10M)9prVWxeT\6{ n!nݝ4N,w[pwwwww %[skQj|)U=ypp0>>B@@\L6"$[#iUpPkbpA{3D; |ub /pP:n$N/*ֺ?ue Z$VaOӞ*v,+!I\arp>*FT6Oe%Z??Gǜ#1l[Wxճ!b}W?jt0J̪mw˼]!WXƇc0O55]SC+N}_I@#~9zYU,RGmUyi|D6d4#dGB@7ϥ-/c}ĕJQ 8XB x@P:,Xrj5RB{Zyg&%u^͋ 1e($>GW\jƂ9M̰XH ?շ2a^!&z 'd:M/+x_F`[,"ex)3LȾ" W,69O{7k%ޯQ#ѩ̓0utV?hXX?a`aa o=0q7_c OZr]( /0ak6PCbWpȚ$0S/ϿK PHI[CuIF#<0{׸Mx߹}ʄBq3cI%˿-dG,;>,R$Bkns*?"ğ ;ȏI0‡+A_ aUO{A8ݫ=?OnA_~T'fθSnz g~/F`A{Ew5Y-%дbRG.TGd[dJ.F0 iM?S {=4??!V+D̐Sڮ4~3??)a:8YXh>msN;Pw< WQR8߲7ay0?ϳ_Yfol)6fŁпT[9~`_?Y]} >M@_!W'&vWYkK7*ᡠk03u QKjWۄ<6,%e4,$AT0Q &Uɚ\րY3[ ,("^6iy%&-(k Tg'O $&0q\8l[7D+=W3়1(E}-SEmD}PIg|jezuĔ .KcaA^LNUcX&;,*(g#xf2ˡ]H*0]DpZdd~r2}#'!?ͷ-oě/6@eC=; N{$:HŋG[N( @1KlNZ:MJoJWFϹqH8djM+~/0TYnlEC (^6k2] =V66¾𒬮c"vĉ}1I:ruF ]LE~6Q>D>ĂB*y{-E=]ɝ36A" ]p'aYy-e(R| R'D'D`dd$361~$ tuS&wSg޿"vꁶJ^7-Zt2Ɋ-FGL #hQlSwƲRF2hGyscmL@>al3ǦgǑ-]r6>nǭ;ZGPkgiV3O+*b*mѩGKDl_;$T›T)2ˁga3!G\ IqMׁ=# 'Sgf #ne'U78y/1MMgX7Qy,ňZ>aul2A|}L9Z!é٣Zu2V"#x~7=Bxl-u{ϮCf]Q )1װapG PeKR)&]w(c_~ Lc)]㍫k {yu/d߀\kvj obvu|z-Yo-c8؃Ԣ6_>|(qn dO{?8"<75z_F؃[S}/؂W5Μ\%G=t6%uqwu%xiո{UMZ[&TJ*&,4Y<#jW66)h1=t4ˈTu;hSXܻK#Zݚ:^;,xvZ\ք2,쏘`k2zvN,;z.v}| 3.-RW}ס/BE^DY%?P~f`2 ^)thg3noH:nckϐ:ڏ:K4_AD)UXAs:7笢 e:օV8 G6B'iZ|pG&P{c."~3 '&3ci# 3amsIҍm1X5O(uؽ0s5z y&67V %9#'Z:FqVuvVt>aG{ jȷ CE7s4`_OaӃ=HcXL8nb/)ё̛e^9 <qj7TYc.\5 5tʝ?Ϙp#aYK=0| ^7\],3tiZGM_[g8e19.\UJܬ!- }ySJXYev}\|+_C`Bf6җml$`-Bkҏ9t6x׊=\dFZfP֖gY +K.%е"@g, ,GE,WK|%jekrSHϮ-KIu9n!j/eNl,θ^Ի|4]Z~mf:h$}@17̖'J/+CiG]`gIJkTG%{2K3b&;UJ:^W.-F^1M2ʽ}sn&$!UqENǣwnlr3Dstۥ5qm#Hn>;׺bg$֠RƥOڗnwAJI]B-<$.b?/1ܸ.5xrS˫3S_Bwp=85APv$ut"%Sr^_pń8 -%i+;h}5ѧ|]|'ŕEQJӻ>kG\C I(u7:Hy?_Q!b{ڸ( ?j7ͺ›N›X4>mO=7zwY[ipw08z ;j^Qp0 F&nMSjAҾ#u-Xf1\s|-#Dk5o:7#aįWPc>S5cs *p,?4Ekw=yڭa{n "yG0YO E %[py fŖ ׀@xԳ/Og(räyA;ɗ }#VLmwHĬx@P3 EVQexrSy$쵃%csGv⌾ zp<$o_svFˣa?m~  5GEYwA;M{Ou]hlc-m7y RP¶ԯDP΂^->gWuبov7md].}r8{Υxo3f-z =$-#a\8Zfqw~zK~C/ViT$t'`.I&H]5Hingn>8*iGZVR=PPmU?.y H*3Gc74a}Ay55qԂͨ40]YN6ՍL%2"Ct r2X4h0$LH?}TnrA3=tw ;: K^zҺQ1eRaY:pX2AAnSP|jKhGg ;Hmwo.ğ)" vw1>Gs2Goi7c7 4b"JI\[;/,F4[+X x:dZ_c"2!JՋx-면$t(iJS@ňavvEx4c =dOgQ=9lXʕ1(Z7%Z^fz^0&}iv3eHhUĎ(|W~1~5 o 7԰EQ te 8]JtL4NE+Yܺ2D^z[kAq*=#(q+qŴVUcIPΫ@F\߄h""ɤIv&Q`&xn ?5QnSpHم1|o␩@H?O#3 RW0E7M=-1CDwF='vq@$E{eC!y.^Y;nGr6Jlyeb8a;ak.U26v48R("M+Nۜ\bZSẅCT?FTR"٢6 ʶOt<4vL^x&0 =T`6}-r SQ}8- Ki. U Ī虈ik~)ek`و.a_L@2f5q\F꾵~TDSmsGl]Ey p^UoZ6ŧo#%HzNIKӑ(7R"3\hE qCOu/"iDsQC]KHoDw~C/!Y^IR uʱ^!@D1ݱyөAٮR} 6oQgR"bUBqHQxCS[+ !pƂV55|=)2ZnI"ܻ5CDtkҮ.2S"{ZF{2Q_[ w{fi_bA#(Jׄ$2HsobfI+-u+ ٫uRDK0-l[MZ1T3%+ R@๡0 n~ۥ ć3׽H2vk}HD4VB(:z}No ~=L&j&(Xʁo6QFaEE#G_BJj#\VvD6^G/m ,/`1$b0::i!.BFG%Sglv &VWҷL8)R|iryL4:'Agmfi[q-+ *D}ަWp/*izfΩ67M_ٻl~[S:NLx:4I;fl|A4ـFxHMMMO3tGRك)T%94}҉X*ud޹̔_6Ym4€0i.Q>5z̗'!fD2<0ܗ.})3dV{_7o@"AVd2R7 i0nAJe[^҈ ʊVxw =F ʌ]BIsͯEqMY,F 9Ł4#N/)OF0O2ZbM1VtaFQR9ߟ9*HAyclpqt6E0Yc-MʫT7Y c?9%~A Y)NWmFLW0B;:OQNuyf %:rS!at9@aa;}StuPHՒij+_af [}^wRvX5"u 1c T̒joUg 'FwHrPn ; XJRAL$F3ˬ~AY1[oеumz2Zbn1r EJ )N-vҳQi"?w+UBUϝ٥-/;M_F-tiob% Gjm{4 Hk s+~C(hoy~v!\VS*, ^lǷ/+- T K6lLD< OA{w߯!T Yytl{_%*)f8ƘaSr*hDTRWwM˳R]ГVHcz9k鄵Aog aN'Qvo-=B .Lu, Zvx>9X\ vι(~ V9[o0ԀŲށPR̜2F ?NQC/\ |k,0Yo 0 Љ|Q{1 :/ "=z@;,HKa+0o,Dg.&&aD=s>޻m% ÚO<81OIK26bIXV6Z43tdȨ3&,Vܔ UzV,'L |HR+lU)(oMOu9b`+{GKuHOh"&RBag;Ǫ"|O@jxd궩pkc-ihVTF/M֑bpt `"BYTI4cf ,vEZx#Sk%MaA[SeøD< 4>e}q{H>qA84J:L !/c; J`NQ1]W]q:B ʏ,R6RIfn[q̛MKP/Ï ;++2뫒Ya~ifSmSD0"54tbp.mE8IZWڞE2g*T$m[S2䗆ڷޑ2&VŒY$a}6K<+dޜ@Ƞ7k鱤s|_"fGNYeܴ {MK%*ˣZ=:݈2Jz_w\MֿR.!+<0WwM_p ǯ|Z/&K$}ejǨ,Z}6 3>W6`׹W%&hP8,ypxS֔#fe0N{:HG@ofօ7.E͐Ȟ I1V()$ܐ}n3Vc7'k%jф7_ilcHBX /p^Δ!_N':fϩNK"Hմ 6ea F\rbD겈 goYLEq7G@)rArJ`cY eQe<}vC 2dRN):,~4sj+lp,ʯ\31<XvJЌQ5*^O&4XY#펬"'Sg @c"˦^8A& osL JS|aߴuAB(be&#M__"aD]*lʥsS/VgX*6]{؊%c ߌXm0>)tVxF!)|%E#{@Lra1GCGT{řZə^ntyOwb?yDrj{Йwd잂l8{˷}-Ϗ@6=GEc'9UbkM|qcoW y/ux}dny.Ί7W4v<8:VJұG}*`̨/e17 x/!tKqPTO0r?"WծЇ~B uhQX=8 y]LϿ C[ rzVשrzvXu-Hye"*6HeGğ|ՒǹV6*(;nJZWបN4n Yw, Ge037!kt~C2y5u_%[;K$뱏/wGBf|XɥzEU8@بrh Ӡ;qh0&+E'٨jP~Q-(tAV̹)JVk27?򃱡zW:}9{@K+j,F w (VѩXMŹ^.)3x1$ pD(M'E)$_5>vIT15*_9v~yڗЮK9~|w;*jy8OPЗdMH.nɄj?sMI<;O  jCp\ݨ;c9/^KFp xfsoZn4@6# X0p+k;a5A*_JrvXcV /f/-S2o v*i.j˰QiNևxUaF"b)ɡj { !Co}n-;mxfdLvyѧzYc5*#UUJ ۏ3;<.!d %L5 YEEd8 Sgxn=2aĢ^#QqppH` eU=-k aa.6"7oYJ] `p_eJc^lS "e+:[U<5©ϓI螐+QK4aVhgo7n|fIuY'*$\\|0+q9{5fmk}US-Z]pav8`{)t[㩧uJR j4kH.eh -SKCFp޲WEeI⹺*/,?n)qv+`3g"f!b8HrakHC/ D =3M2&)7䪓;#eT^97#jFՌjH0TQdCuPmwZIw6ߚ#mR?{eLb/cFy 56Ḓ.z*e˜)O̮DQR!j_,\#*=ZW^ >+bNb>g$;gnz*E& \O؜הD˚ žpWu}#v-ɮG ֏9--V6$\>T.nWb 䋢ޫ]ӕ̅)u`V}m)"W ;3;Jğv vl _޿]ʑ[4ﴹQWyT}zZj8_Ϯ5eBӨYӴm(,;l~qdp耡 | Q/ld~Z L-fjfq!>50t.FRrblTF.Ύ \qBgqzr?yٻ&zY{tvcyg3^+]=OX}Y1?_ch8sÇ|88/>/xrx ;yC;y> *[=Ib*> AâfM3{>?}g73:ץ^@/?WFN7 Zu34tm:(vD3r9Xc/b8ӧК C7~xӂկ+YRo樃6#KۤFW;:Yƴpxz ݱ?zxMB? Bs~ MUb_UhqNGwln'8u-ɮG7 =kzⱵ ~mCڙ=mԑ|+Gؠ!4tG }FC3|~ѢSvj95ڹ>nU9TĀk5@Q\ǿX=+ӝJO?_ H.'9dN5SMT9doHKK4Mɀz-Ǜw??VuM;zL3خ2#4$ri(wj#p_l7 6k6+R^r)xUU2eMzeUpv?o(:mډOДWĵ6AlT.ZVG:U;EH_C&N6#o]?>N6b]AwVԝA欨7+:G"˷w:sjb'LoJYfZ_{+%;/誆rT'ƑBF9slz֔g<c]˨UW]W:# kTM|hcg)ӛ#/*!ʞF}a>L|Λp^ŇLMhocI׈t\L޹OG4%7m $̈́6Z 'X[[̃$Lj,j ʓ.LzMXc-N:sjyk{^g&fЌC3] QZQ8(-%۴eӖqՍNa<@Hx3߷1N5G7!fyVw3wm{"%g:KN&(5ufojӦIPAڧIJmx|yVsAQ+B&Z)N^~3BIk&AnV.fG}EY+qIl }_D_4\>nxMu ;WU?c3Y\{;#ǸIE_&48Brt٦,dJdc ggνgΝn閏n=fKڦ*$|G3m}R+CTBˈ0Y"F7,#p\^p*7(N+ i f^plHp#J1kS^G.jOX+ފ_r8@:1d# ?ۯ!dȌ!.-)wю1MʌUd! 6+]tہ 1}7Ilw^|z <[K4Wn̔ؒsV̰F* ֙!Ξ֠#s*@:ކ=Λ;]ɾ)-m׭lC3[&DS+ҐQ!i;iUmumi3}UָHeI+CǪtƣrQƃ~PG[;J?1̤pwPMK^_ Fl֬unv tQ@mOGЪY~ Qx,rC,}}7ڀE[m$o]e)Sզ͉mgTLK7.Rg! wbHE!z%xs|ߛSjS^nǴgjܥ8*es9xGG7ձI#<7;w49n-HV'.8ZnN1z[c>T=8{,ZMi]NZb)?tg=8Zp*Jʴɲh^YӰ6ZA Gؒz*=g)O %#%#e}n ns1@4+Id4DS[RDc'18m3Ź%8~P0?0 c(lWWٽI"6up;42qnko+㭖J[a=ULڕſ,<9NQ#kOqsu54y?1˭91)Z:xv?8|^e;k+zv=Ulnat[\Vv0ُæV4 }VW#JV7\_HXfIJ>#ZeAپd)dR< %b189z}9-䚳߱J=9pV1p*88KΎ3w;ū}ٚw뭙پv OWgsssFVf4{GAȊ?K߭gzx$j'7>'w1ӏJ\GtKTU}#륅k͎!W`o^IY^E)_@HkFp1uAnrnKIנ6m rU +,5j=ulu=|+x;޼fZԴT%^҆ͳyh5?͓EutF[`3YߖJR%9IQ Zɹ-T#:SNopԌQ3535u:푎:k'G)ĔeU1. 1^U1FI&iuU[(6:8zJxB8ȹ-ռ_l7m]:W\eh-Y.j{_Xo>h|chgeO8yXgʆBtjisW$__?r.7՝D0!Bs+}./8: WޓD{o5y;e೦'7ޟOݔ?wdW8CYy3e+߫]9WC'QWP:4p1kuO=ǐ5x6<₩Mow}P;[/]?aޑdu#AO½jyW*z;hͷf+ W~T1j=HKDw K_ro!oSv1]jUo!浿Y·>5ѝC^J0hHw~sXIodfZĐmqQ}%r^Z;>? k{/Zl|x\Wohh{aƉ7vl&Ցu_{5$f=p+oGkG+G=:UFG=B_;BXG=B %/}1z׍-rgz=:Yy{t"Qc{###BAk<s{#u##]!t%+֌=f+u f*6n{tοʻ=B # onoF+mrʻ=: 輯ۣqv*6 n{;w{~z_yG=B/WM[v~ոfz|+{9N!^ ZoGQ{Suk6Kt#l_ o 7b{5le[ 5U~sf"?uuf5b#lmzkokTd1h\e{6WK<B״}'\Fs=Bz\"KρtS\]޽ނw=3_Y/!OϯՓwG6E;{؛v#m+y64Y.zXhg`Wݘ-kZ!e0g $?^1OU~#nv IԞ+Ι%,7[YM-Y8Zwmav{gu[Na!NUrAV351zi7 ozMo+; <lEI54?CI!ֿQV'F9zy˷wyf~w4jWevc|l o*I{!k5X۬6Y[6}'sPחOt~wRk-XIȫywW*W*}ٯoֱug{g{1Coo8s=es&t³&#u(5Q疹rv#ޮsY;6.#ES~liNmxi>RioY&ܼϹ&%COy~t9ǐ']O71Vχ]fypzBrH9#,'8<]Dw]OO&z՜Z)"ξAVyC|ꏜsqFƹc7bso~M}Q_F8w޷ $PwC9LB6E&˷v{-5j[n{ǽhOA@z4UѸzz!6ut SUMx>s-6귐q}1ˬ@#Y <0UvTLq+F77O؃-suWӕgK/{/wW`_Fndmcñܘ-`ѝMX~ ׸gol>i+y﫵o c8xT">.a5+nw moy6Oi< onKz#{^ܫ*dwE&bz?1-[gB_S!7jڥ(hV9-lo3+tǜgM)ϻ_+B9{l7_M8⫾sUzOw6k-?6~W"rOzH4$nx~i͚znw׬iG?O>g8}HGu{,cmޚI{VDqqnkf ڙ0~rDYW_MڛOwySV#'M!VѾw}plos}ke*ԭ`%|ˇʨ^7=luZ23س̙cQ~uw+Jjbfn56W ͆ZmXou&5gח'yӪȹϯST{±=svt| t8aRťX Ύ3w; !f+H~NRq>>uS6kF8$oV)k 5;>Ñ; !̓/dȟ?&!1p\x>&>??cqϏs-<__⟋K;d] > ?s~85'? 0z*<}tt!V6X#q]OҷC9Xw皠P/_`}xvVphҘ@<9z<G%'4HI =k3wb?sXgeYbV_<8c3=~P}W]y旴łTuBLݰQg315ln|' ?T5Jh^]35sc?L3dYP&ٔ(}\uH.Od` wxb+X#!)'8%Rg.¼ࠚ-xX>PupV Ǐi@<ף/; |mS>>1 ܁Ar8*s'|sGOU$1GOh Aa:SvKOϩgOpeY_/,d8=PqFL,e/p8sLg5g4} {$UZwzh`xBqzJ;7KHl?+ Z> ZKeF-/Ug,/SFx9prTiڔenRLſR;S5ra_@*O̥{̋:4U_Y mf S~(9Sk|}@kITegQ?M5@#6)z SE e}DQt.M/.· n_i2m3XllVR–ɦ)V嶟J7Mj/$P_deYu$E cRl4m>׮iLZMY_ a\K<Ϭ{0R@Aǎyn!Xǚ_WV]3,K%a^Z`k.9- 5 o HZxY̷ oDG v`+Kp~0.뼄R#`@5>RyYT1nR/10.7Z[G]K*O›(x3c;) 82f\cdAFc&P*@BU= _ז~Y|CT.0tݯK Nc3v%@颟ʬWfX7 CX1l1V"ޖFsDlmgUz0I;*Y:0j W*;V,=5ueQ3&U0Y Z}7J(@L@{opA5 Dz8,@%`8H<E=vagC\K`8zoIG>a+k#!H6‘DDUF0_6=Y2-O*s-3Q9GM+$A mCQN-B=(1e$h=c YƌoR 'R rFv"c0g@P ,zFM䔃N qhP!7Ӽ rbT)AN>5sv+4>p&m19=Ud) H9# b*M!*ʓ 1Vd%"x_ **4šy7S+tI1|'ױP:C{qs (kGS!mD.u3)!%Ɯ 8L@PLX)ϳ3@YEHBs :*9pE$ a/QHJkZ2UH@%Em5ACSI 1(6j 4嚥;Db豼]( IH"m(@<D+Ua-c$jJ:@P$袒#aIN 9fi{M $Ld"(Ɉ _Hd tʚ҈ H[ނ-(J% $Vl_d#H)e2p2d#0EYMMftH Asa<)ć- #$(U%Ȣ=i+#$4%$4E>ST$T UGT&u"$da]l"/WEH]TliYT%[QT-d&cJ2Roǀd*>̬@4;.Ӱb(E߈*$cQ %)2lU4cDAxv(a}E`! DH>#voT21Jz@S]++*2#B@P=$xʭh 𶐛*)0&!̋<هiR"dr)NGk*%BpP3 %n҂I"VaB ȦS$*# SïUPU3Bb$"[F) D~..n+UH2 91IfeHg(H3Jm#ǴȖ .򪂭oh$cU L%[r omtN A8v:.Ǡ2q`CR.&V`T6 :.Ơ)$D^<sc{R j&}5BQH3{Ռk!(iJUzŭ X`Ye1-ӂ" !%bj$ױ_z#MHaTPS$3 'dk *pb]Q|9PT$HG^+B3*,{BBL]k 9b>'!RƠȟAIk $Ub'D"p*.}4ϔ鞊+.4`%Ez@=,YpYL:.\'P"TPZX}ZN鹺2 -9XkJSb U2>5 j Lϟ8'""3JSz%')g+?-uHy<1BR`X2qT- Trޢ\;'_98#(_7Р7q֩>ZJYch$YISflRPT@sY'xBQo*@:iM UiM2Af2_R*H[D,\2OQĠΞRm]GQҼ@ BO4S+Ab* gK+ӡk $V2uI+-@BJ.X,"HNNDCG҆GYWgT!KTD 2R* 3Ms6Y*<.:mdUQ;T`?EvE—RTeahh} EGk>jmA+TZ`<|iB1תTI|CP<|'W5`4yr4BmA+l41SPE iI T ܭ3LJZÚfFs6L>MA^8R`ZR'$SU@ EϮ MRji7]bdW;< RTZR)Hb*+))"su~/slL+T-)$ѱ1ZZ*YqW!|J1dF%u}R,&7Z%ieL &u;Ame}Ȑ#"7uc`]l \I!fSMG+c|Un)iU!D5Q::Z)=qr[V[ЎH֦sR;&0VTm2TBUa /}N;JYjXtSj734EzV3TQBࣕ2ු{I(UG X /KVwsl!:K/h;˚P6:$E7%-ueO`OQNIuV}%Iʖ/2k8y<🴤x.4Tr2KhsDӅ8-)1>NONJpzϭ(sF6QD7aވ UO@Xt6kM*̗K%+Gۤ)4(v)i s1EqzY( U}_m%SL)l^Wz垉D->+[^_> ы00`%LG ?h;xGY@C3z!txӣC;{i> ->DRG&8;l<8П)i6-7ܒ;aK6פf?qdnrdL6fbnZ;Sȩ:X'p1 C7~X02-]ʺ2!I;樃6#KۤFW;:Y@UOܙ;UGIB;wjǭ8nGێu:u#~knMv=hE7oh?W)o_CwWFmV#7lN?z,i[9 i!4;j5r_$F&{NMکi4rjjjUMK~_J1RW>tİ=I^TzaѡrٙSMT9dN5SMF|Dڄۛ }9Њi]Sɝ~|R?6`F44}Cf$P4; .^mD|mtfP~5jh)JJ9<Ǫ*|Y2~˿4=~a+",Nv4qMж3>jNWпӭ [8GsMmآfWkP]Uux9+J2m5әS;aR|Sj7ܓO^)1ٸ~u]sHub.d3&NlMy1ٵXuu~o8ro6SsM@s,ez`z;^=?Dٓvۨ6 >iyÙ۫m˛Xr5"w#c5ͯEM=5n3ay|' ֖: I79ZtQ{ZV$É҉y$i~!$Cfqi-M;v`iRf"3Qȶ1]CN|o \oeOf~Ⱦ m?:Mu\Eݪ^4uf4Ŗe7JmVe !puT6~wބLMiine[8}=n2!Ҷ^D 7HIjS$+NnK{y/C]ftEMWбj<\ `VLx+30vWbG5w&]PsF[1j{BbB2  n:gM6`@V.@j~=6lmٹvTisbU#KYH,rQȺ^!TfA+)קis1ƙ'g6w) p\#=^Q f}uhN]:v2&D[ I 儛S֘O'{U}Ͼ')c~h9Voӭ,/EZVo#fmXtmaEeO+N`0\tR2m~a,Ww64l:~u޺JOG.CHhY=[!\ :M +jR5 Qԫ1VT>.QG;?cj mD~oj9NLqn T!¿ʆ6Uvoҿm-H~M.n%;/3\) L\e[f7x%6sqVXhEvex2 ic=1fN/~H)Úc{om\ExһU lr?V5,ψVYPe/Y CBX N^_+p!.j 欸'awgkxeU ҃#̝{ԣ8 "I3֞٭I5 U>A{&SO^SxY !; < r?Nib%?)NWt.{s9bGԫ$ӻ?v海jJ3rM} m)ou{V}vͳ֣#ף}nӣU#҃Dوy-u=pn]e,x!h,_5oBt.]rɥ5]u.u$rR[>5[b[ր52ze5[6cVGƷ:9OϒW֗rߗ廾/x2e5:VF]n4q46t h͜|y&ȗgv볩vjslū-zkzk]e~U~نsܼѰzw7<}lwk^:FGI5>O$ux ]#ogѵ])7@3<5Fkz{ ?Xio?j=~/ m ;|~G`vwLj2-?g9w :]my 2w18t zAx|~U=!(Bݛx޴cni;X{sɿ>@?lY Y,39[ y֞DqM^WavmH\q,d9 joj1mҴh '~{5;C}p uB )!AlջdUdOSO_|k|[Ud1w) Z&y|[B1R22GC}v}&crW,hϭNHznV A؜auh:Z޷/^p_׽o󍷛]ˆ3)[֫Ov}yw7/:lmvd/럴7?%~_,.&^ζ}آ?jDsNF=[q}mEa.Oz@OzL2?1s\V[u7ǥQ*˝sc{fpw|VنN3t Y;f޷i];Y?.\<8B|~rH wX,ZoŊLG^̻K\RReOWo~E~{=3=3ාg~{Ù)35qCeՌ<̕vm՟wіy.ZseKwjăMkm;J{j<`6e]u.x5)zN^w9=1z7}>42{3#@qd91:'<ӭzz"7+\| 4Mp 2#S䜻׌kd44ΕkؘHl~kꋚv54?pm  RϙUd)2Ym;c=hV-vކ?=@~ ϐ_գ[ 鷯ߘׯK@j knɷQFYf 1V 8g&؇if,_1!~ͯ߷}l<ۿw}]ʷ}٣}Y+(6wS%/ols$p=o ֿ[Ǹ={[fI]Yͻה_}l~}O)ƣ*Gu _qhM o6}#Cy׾NQXxPw[_ַw^U!+ 69hsԻ_?oق8W_$ quW.E'{ު%ti[0eGrB9FlGrpEQY]3Lm6z;/Yu͵ /..]\h z8E> y)x|v ጿ|^\fqp~ߞ;CN;p=5pmPc%>{ Ύ3w;tjxN;׋/(dGp2n:>;Os9[s8bM#|:_KN9k/q~_Kv^{{{RmI O|w z狓7珹#Xes6˕\ e _rt (rO/ťYa〮( >?9}'? O<>V_<8a?zpr^$/y*TC!FlEl&\xD6l|HU](<53]]37& ?k8[~_qQ4J lM߇:5??]޻߼[>8;eW|ZZy1*1Z>_%nBugT?RW3tFZ/qF g@RZu*' ~Ⱦd)2^h~eYfK?1<>c~ɥ2υJצ,seo,͗žݙ1 @+; 4Ϊh\ɼ+lSOZEeyf>?j/RJ_H=ƷJh v" ,@3׸\h{$&ZVaUo( J嶉E^-K4Mm&CwkMs۪_R244J6״R ImJ4,ΔhaLZJAiLZMY_ a\K<Ϭ{0R@Aǎyn!Xǚ_WV]3,K%a^Z`k.9- 5 o HZxY̷ oDG v`+Kp~0.뼄R#`@5>RyYT1nR/10.7Z[G]K*O›(x3c;) 82f\cdAFc&P*@BU= _ז~Y|CT.0tݯK Nc3v%@颟ʬWfX7 CX1l1V"ޖFsDlmgUz0I;*Y:0j W*;V,=5ueQ3&U0Y Z}7J(@L@{opA5 Dz8,@%`8H<E=f 8=gX3K: ^X )DFZ$"0z" biyjEPk*dm""-9c*%K@4iE/-8o!  E*AI;\! D,!ɠ)B%"$J?B 5#! % `[y*Bxb[Hҽ"(ߢԈrl9 3SBPz[8&Tgfz-׌qmC(FTu<&hΈheF/iMYif# s8D s;4( ?(H%DC}' !U<]Tҫ "^\Q  YSETnu@kܴTL1=id^>ĬN!Kxt:ZS,#ʟQg(qMAQF6"QQ\P~JV.@hQ7&/#uٲ0B HQ upp[!BeE nȉNM4+`E:ÖE@RQj;lb*8xSJAP~ G )P;Y )M:{f"Q-u0\5Xe|EhTVIF-T5͉8d:=Hh YdŸ'[)"X_Jr^5FsˊJ^[ARre9dԼN—<рH쎋Hr d"eS_WQUys^"cr"q6* 0ZM:Y8ˢ, RM"F6e!6T' t_ IA/ z(\P4ِGQQD"di<䲰@yz>"u4:(m:&}J6Z WY8[Z](n A1KZi(pP=v`IOQ@?trJ&z?64>ʪ:Y" HRPei Rqi$"ؑ{.ڶ+* CDC )"A5&B%tZ(}vPh6V[O#(-ܱU--QҒbNA@ʆ؄3 V\II;3{iccZA h!H 'yO7H]R"u6&4 )"UmL-$'tU brD9DmRr14'*IS ADȪ3: nQU EdjZPLͥ U RztqEfK%W]2b ȼ̽%ڈ^HIV"N&/LR,M^a5)*>9{+Um ^6R"0)ࠂ([hriI^c^hU.;d/IIiK,jy/ХiZo,|KYڢPV{l-$(tq9 +W!3*蓔~|e0Q(I+cJ0oOw%% o+ԼCgL((b] Jhp 5˅E?j>Z)૪vKH#ިr Ao& 1)J퉓۲rvD6m1هj젧x( Sx#xtځVBW;} ƚtmheRx-Co2՝܀@5:ԐKE:h a511`]LG?h;a>uGǧt搪|]gץ^g)?uWi7pe*3 _ˎxvnvks_!6;W?VOV+ mkBSx]N0QʫajohlU&fnÃsfd,>Op3]E1T яjV2ڃ-p uyGpodl`d/e>v 9]Aݩ6ٞGÃT{1H QlH':iуŏpa'D:__CEvmkBT~x=kTA D'؈APT+kA{¬ Z(~DQQg$1lvw6s)ۜswSJm֥1ћm20ZScvA?lWGӿ7އ˩|w>i#UW)UgV/^5΅;yʹ.a[Zy^+3nC #]Q^{Zsx΄] j3oհ/lZ,UTuRtMe߅`P׽Tl?p)MQ`<oF8v.ԐG9<97/Q*Eޫ,:9Rߩp3{z BqJ%ws>M7/#ipQU=lΗ3Қ|+sx~wK,~!Jǚ[t33|_SCmxJwR9w]I%ӳD8nxe4mkBT~?x?.Da( B,*X?&s&y~ɳ8sDh5_ʹ"֛1NCoky P.Yky}4Os:7@:l#cѼG]GGm7oQW]omN Pvb= Иnst5hLOԻ}Ի957NkoԺmԺQԺVz E, vc.ீ ?ùL4IJmkBT~x 0t@@ 9{^oۭnv[/zKm^oۭnv[/zKm^oۭnv[/zKm^oۭn_>-UU ?mkBT~ x;kQ7(EA+N!";X A,Q 0Jg`QLϘHb{3Lfǜ9g\/sp8x1GS%Jxb:Ss/Y3P1ADL,Jlw} 9IqMlq-@_PC@7]:@WP&3/xuO%³22>K#Nߡ7W%@+g>ڗ#Qw|7-~_@}aU/更E/_ If#:gE oM:2;Nkg's+fgM'Wc2R_?x_fs+N𯌧eLF'WSN𯌇e/eedp ði˞]lx.~ߗuvaXPw ? ?Ʋ {ʞQ]yk/ew.]R)wI9+sT O5s&<7(kS |)̊ϷeLaVfE_4YfwmwR.o?iϳf}w's̜13ks:ÿz߿ gwz%Zge^f7-eV_v_l6Mg>炎=b+g:\obny[?t_l%: /ロ|B?u=/λ'-{_XnaXc{hiXC<kTNQXCeuI5uI5?*{/ _'"Ϲ08'eGQٞB<ł}8o/?}z@-ł:Rovk  q @S_, {"_,>[EG='"s.=/.Ŝv ?X]9?sB_owewǟ:vHsG?'"]u 1qqL8_sbw ÿ 1ÿ 1ÿ 1ÿ 1ÿ 1ÿ 1ÿ 1ÿ 1SHXvۍ$_Ӱ?ksc?~mNz ЯiX3~.YmkBT3xIE_L$.#"b@#`0Ѓ=ԽNxlvv #}q=cH}F~w1[ǂv띾~JuxӏNA?%'Ǡ_ =sg/W9_o'ǜ_g'|[ʑczrgھOA9ӛ} s3SQn.rur Pr~ J/Or?s~Pr~2Ԕ u/9< %sD99Pr&Tw&Q\_:SVy%sD3s~t*܈RsGSQrJ_߁Rs@(9o19WiqNVίR}1m"U|{`Ja+q3w_8Oqw z=հǝ~η^zzk6;͋6kX{}'!KK`{s~gY9lş뼿,3yRZ&wY[c]Yz2-sk}Sqr{^leC/oVÜ|#n"n4cD\m?M|-ql_]U:} {9?-`[sl\vvL j6x{Z{oxX x&pqجbF8Oi_:Vv7HYd\~k?uҵ? %W"i`0wtC[#i+`{h [ Ƌ7{])a{9Ku~K[{ԎiUeo-(Kcv[(}e6oXtجK!Wnk|p \xWA?MZU2.`|\x0;*'41:haΏw{[D𛷴C{Zs~*Zhx~ԙ>\mHy9r~=B')>ߡpƀ(e絖;$1`ouy P~Iޑǝ:{VI8/}o:|1MTy+%1j!R%>WZMI?)r繤U9- mopqG8E,q,ƚX#Fȵm,1$!Hs:OH8c#r2K\pF *tWJms~3Ǧk]`Jlb_exF^DJ>ێ!SK8]j$RA%FK8!}T*>6QSMad۾ ku~mpFCHŷWEޑH-z# gwRb3Zd 6sx\ gtimÎ-{$4j߼I%ё6=Rm#%=$h#IV-pFHPJ}5 >uHX_Id-b-/$H{GXqج{@iFlT9F~k9??$IuސCRiXqop uH ]){}cSp^ǽH^l[*9mkBT7x!TAF`܄`  `%fP PX@P3H'߻&v;xrػ Ls}v={#;_4}XSƟ?KlKǿ=o{ǿ=o{ǿ=o{ǿ=o{]~L ,ou}{;%lkk?OToǿvoǿvoǿvoǿݷrߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;?IRoǿo^Lsۯ<ſvoǿv[Ow\ymkBT8x횉m0]HI!)$FR?6c>>~sm+vuՑνYu8uN?WP>1JsWiV_uKEϸ/rˆ_gKW]ױEYcl,[TYHT}xL#}A GV7^}>iҞ-i;}LJX&TP3T#ߨgJl e'=?͘ona|7>?ǐU%;/mN/IfQփz{G}?v✽3X~j{zTAO^ʰ>?sy|G)PC#m.i|߂s,iBwg|`I{< ~Ff!BU ~?vP)iB,{ Iڣ`6-f,$O2#S|?a+FҾ%reHړجbgN$}}y_B2^"Ì^C%}=Yu2usΦEauɬM,T,u dB/#~= k 3r 5 :(+,i?ru ]顑CboQ&0ga3ʁߨ9tWy&Yb2'2SL/H{!yZgG Ḱ7:]d/I hc,sq{˩=8{́Xs|QlzpfT``F|foQZA̤)y yx{qҚ)LtS0kE:)c>aNl=t8{J>5ԉ_%mD:asBHkAakO0wn)WwstkWiNLou }9pc'IC%&~m_)wI459߂RίC.G^:9#s^E s'5>nzZRWNF%c8.9Ux\ș8<~qt|j9wRs'oKMع5'!.V }fê2Ng#] d|95*aiOU*ar>>n {* OkwS9&|ui?EP'9vS[,cpnj?MNDZI# E;;:-C<*Yy`{I1wbld跾|@`_k/)Hs\ķ9Xҷ쑳0ȥc#=f#MYțQ++tmZב%p!W%p=1sqv*K1^{܎:ݿ@ϝEuG<dz \cH0k9 yߥ=ʁ" K9hb-Ǡ_oHB{4pB2[ Q:k yW=|G|3O,}Z-ZُK-9Pó/aҏIM}N5C7tmkBTx[VEBDTz D n" ɛ@RvĈ(ɛH۝@Hɲ/CK-+*# j^W=`xX ޵wf3x7?M)J3&D~kÚec:p;XOWXe8vqzMKӌ>ylq{k)^ 7>5-)fkぅ)~D0%Ҹ8p {V7l:Nka3\cm<0=.{Ncm=0NX}`-'ku؊ 0H0NX }`-ӌ^{{. |gq)~B/1 {g-8v ]c=ka> S({ ,c3=}7X +]uPCOk`-kyaˍuȵ9 qIsX\?uhǚ .cr_mZ'7=UZ'8bm97|0 W!S[&X ZGt^=`-#:ϿZ' `op|ePό>%:e~_BsU޿K"j|;K⊵?Ήc򞰢𙹗1\_N8C w)>0W_ a=Пǡ#|Ư?K=u>K7c@ÿm xs'qZh`o()hz@= c7= 1h{@Py=֭o$t= |OW'j Wg ޚv<u@`Dž[v 7v?4mkBTDxIE88-DA *(HХq6JDP O"d!ƅ\YtbcT8)Nq&(>Opmn{ !CH+ lwĕT nlWq%;A7~RWyB\XVVgq%T;B) !RKX=#Auo8Ę 1cFgUGFD,Y. ^g@Ĕr36π)^ àhQucLĎqߪz1&bǸ \ 1!WUw8El^[qB3ϪB#Z1`R3ȈVEGR3xWp$9 $gZ_| dZ!N $ecXpe  I,/#I,W]#IǬT/Hqx?s`{.r#LG$:sj`xI\$_W?4pIddRx}$"`M_wڇL"FT=H/ɤ^! 7 |Esց(^qn<4 -. 4EMx4z6opo!ۆOk/ HdnL~ :ߤ5I\'/V!x!\y_㹿,R!5O _UeC&ŵ_c |ߤ瀍fِ*O s'{@Mz~ㄱ_y('2;K\o&%2#eBʄ^`ۀ/Sw_U^ ύof/u`-_&s{SGzawD5ȏL~_Ɵo ~LJ/ӧH&0'5u1缛>E20=:1y$|b1ydLjRz9qd<_Ua݁&'͔YǕs%W?9i |{K.)xfLF@q/XM1)]<x~!e#իo`7< ocE'U)Yo}|/ c8e J<0)[oOqCuF\CwF\ /aQpt_UaW~]5en/|>{~!aoi^NF ռ-!ImkBTx AE l<`¸ȫuCcusxsηO`/evogvogvogvogvogvogvogvogvogvogvogvogvms^P{-8}sZP{-8OʕmkBTx1 7HHxc/| mkBTx @CEi6a@#%N_A_i8_o$N_A_i8_o$N]7u0f. mkBTxYUUWjZH4 Q)a= Df=PكB{`FB\TDR6`tO)Df~J+,k9ߡspy?k="үH}F{f{?`/?`/rr?1hH/yP }@_2Y/c }`~/@{kB,̝t5Z/}A (Z0+ȣ\`G#ߵaJGyh&/0WKoI?M +$ߵL4:`G[']KyBotw(*:W9I_,_7~2:ǚyGz9?\c%+Wb2C}l2}{?7Y9\d/O5N},9?}'Vg+>I}([ WrձQt^Ctƀ[ݭFD؋{rQbuopAgP'uJt#Wwsӕp]$in=w(1zZDt{hi6Z#i] oACGB.\k9lM-pp}~+g{Ԡ a?/|Eg?h蚗ʄ>6;QYv]{ƶYOYy?>':TqQ2 n=9N;k @_e4Aj"}Vk 5.-s~d]9/[E K#Eo_;Zi ^`\Zc=:مᒮSy EX,* BD.5Mq\ƪk֘ \+:}E_(l'!87ǞX ]֚N vmb~=#:s~eh]vY lDtEFY6;:aJ|INrҚ\?Z8o0_ 쪋cUě™ XbWK-1/.jN9?!#%vU S-U80eXVL U(X±iU" ʹf*cM=wޯV7+o-^" jJZwU'%wΔ3ԱgFY-'Җ߅]c`_7@*^%g{]3§9¡y-ʹ;l aݥM>kl A{_h*L*ސ{YͻҐ dv[i$ d<#ۅ/*Kpy4k<~_0y\?\uv2AOf0'FęouUi7.-|o}7ȁNuOxk12.g{,mkiF=*u~6Kb]Q,l*|{L60Kšk0/O) Ζ L$r֜9H}wSMdVX47~.\ZmomD{p{H9UjkI}mX ͱ P[C·e~4GD7]չ"}wZ##{hYف3lsY&i;sS5x..=LSS k@g\ Ί>?Wy 8k˔:?JS58k@HzGx} I O{^A{ſ~:?Զ(P0F 5cTL?0Xxs~ Orq}[|6ϗ~Q8&05xo||[pfwp3)ilBB?e:ASQ',4[\10o񱞟Ю#Hoq6%0_oH-^˔ d}cW&wCl0 ]ƺ@šzK"3¬U5 )Uv 7$5 ~\,^[Y[U0"vwhgސԨ~KLdo &\({|㕀͜?8):mkBTxx흍) q ĉ8D^>׻gI@XjjgiЃ`0 `0 ?ϟ|:seQ3|ӧO|:2|.};7eGFO6_Qv]T]^ˮg{>pjzkuo{yye?{-x/ D:3D&򈼹e^Hyi#/OGzϪ߯_~ :sMe#M3Y#=2 QЙ[\s=E8}E>GȩT ڲTg-}VfoSVwzV}./>~!?U1<#}=F[ ~QڋBN..+푹^edLo+[\-k dW(}6q$#?z6Bөi?L7!3O_Q}Пuo[=tkȋM!'}/Ƈdr2_Cﲨ: `0 :8o=+8-4}۞cĥXdq{bUq©ήm!ƶg*ΪU\z[GA=^+ru{LV U?)V>ғ)x|Yҁgi\yi^cUo*= !TY?rfgWsʽVn*VX#=Fϫ+[F~yH\L~[O҇h5ݵTow|Sfӟ+);F;:x )/OS yUo2e)Ve3'wgGg=J^`0  ľu kU,Ksؑ5nY,bXw{ w&3QהNQev ]ƷgcH˞i{A3I8hwduwUIWq8I>+@pQşGcZ\ƪUߝ]/:3d;ɫ:gB9R|GW~w2;fzt|+i5nΟgZY|<1NyŬ|E7k?z/k><=Α}N΅>uWydʬdz `0 *\?W8GY:Dgcg< 2+'W6qn؟{ru"wU쏘~c#T?+y{Q,,^qF/Xv8.֩g3}ȸOP ~n%hUG4(_sn|W}Tg&x^c,Fѭ+ <#+}/Uw8BRh_|33!mr\7U9m({ѝpvew[xG]߱?g;,nҽow8]וb?OV=Z_#ve?vN_WrYLo;1g9pV^G~>[_vNOS3 `0Q[ veO\k^8֔v<Zbz\Opbn$~}oz3ј mK vU]^iNWA#x딫jt q :E= z%օq)CcYEqyRG-+u (K\hP'*^ء^q=m=y|Kvūe\rȊ4={W1;=ݷxp;o@>ȘT\Ԏ+C=*ɫ|GJOCW]x1.ﵠ9_Eб Vq)v(ʑ}[GwǺ{-oSdו_˞׃2;iT&w*w:g׭SOsj%Z[~_˯d֮+w]7 `0]kIu+eL]ւoA^;=GR?v쯱;<y o$N1紈=:ߥPVu< <&3KyC/4r)i=*/|Ύ^]QNН1qGw>ù{ ?Kv:A}E:_n+{u=rq͓̳]>>d}+|L01`0 leg:׺񶊝`W,3O?]\9P~[kOWiGc~)-<w.3q}'vuw$Vnv(r52S;Wk_Kϔ8B/hEՠ'9w?K;x:x<|@cϽVyc@ۖSw8Bq]=2lBe6V}eR( VeZT4ade2ޒ+nYBTqSߔ<[&=f[|szP)G}{Zׅ3n7jpWwftEw[ǽ;`l? `0 `0 `{~i`oLy>uoi\qK|}7Svu9G쯿c¾#>,jow{ՆݲL=mW2u_8دjo?kD߱mw>#}E:OۡO;y`$j?tUmkBTx[UU?cHT] (""("z!|*%z(2(„$:'+ʗq 2+v׬2qg\^~cmX?"3*:r"s9D ah>ll=_ɶ n}a=g~lj4/gMtک#Mx`on7}t >O~27טDQN|n6779}FN2[[g]W.x267כcsGS';u>#8{埞Ar9/Ne9ܕ /"qOڋ+ 9\?-ψͩWx-輕z1#^_C>}埖{}~0:k埖c|Z8{yӱ>ϓ3_+379::m/KyU^ [Qr$|n+X`b~p~[s !x[53So{=pp<6WS ǰ~&?7Z5Qk畿w\ } sg<3:5-k͵{/svE:16ڲ>Y+942<{EϞҞM.Ls>2ɴs_DK~3|oDMhDO=; o*1w mkBT"x A ͷU𴫠f1v2]//_nok~.zuzv\;[nJ$I$I$I֐ mkBT~x흍8 FSHI!)$FRHnw HYx3ꇤsaaaaxIǏ'U{o_ھgW9 o'GW {>~Jlo߾)*/N\ϱov[iZ_ձaJΝ/:6O- 92b?Tlk%?_21B sY5>:>c=1Ow y^- ڶ,XzusM#גU]>H_yYv!ۉ_mi Rus]Xm_g)YY)m]y,m z1aaaxEߓGקo/Y\k6xjgH|yu.\aæM&wk#ϐ$?]Mo\Ⱦ,/ڥQ@~6s?)}, l gX #vQg Bٙ^uのuhm?}{].~}v_J;xogJY]޳@.)oqC?}>@Xߘ'-(W? źvƔOʙRv[K?[A}?-wmՑ}g\=c}M ggg DŽ-B^k_g?F? v0||؎=ǧHPgs/hؑI t~{n^}ZyD5XWvO)"c0vY Z|~_%/,p\ɹyΰZ/;/xs_9?Pܯ5ݻ\[y|č8gʱL{? 0 0 _k3>z_\S |<)b|7aaaxn.ta?l^Cvkؽ#~e)3<3^kdlc&jK+o"e<.ʞ`^(3zu l+6v<ï k7]/lc[`On}򚄫 G뎱zt^v2)?;Wmr5ocIz?Ozx{&!ez."ѯ 1Gg{+ҏlw<=}GݽFƨ^)zIpG K֜{{e G12ۭqiumf>.}~a? 0 0 [u+7Svq֭y΅ ?ނ}XwŶv?ߩDZۓ-q/?߳=<~#>Fk"qzrQo 9r,nY[;o:)@-`ק-7({߯S@µK9֠ɸ>:n3 _[_*mtcmC>qSL=<6;ǫsaaa{xˌ\ފpx?0׋#5zяc]x^l򼠕(f:~٣^lin59W~\;?vn6erUbS~v^U O7O(|;+SG4|?f*?rW~2oNٟS9~daևmH6mX[J~s.ym4ٶO|Bd/b5ɿyU? 0 0 0 0 0 0 0.P~*1@G\⟿KrKXs2(ߥ纎J8'>X@▼QQbqwx b)_K|v 1M6kee-2Ǜ59?K^E~9ϱQﱮYF8N?~;:=J<-tĒyNAgC \NXKs)'^Kg\~2}6}Գ)n]Or^j~"{p29w6/.z-v:+M{WJYZ굢`% Ҥl9ힶկ#OUz+U?;sd~vND7*.Y+v:ye;8}~|+ÑޅN9}{Bƞ#txխsXɿkSV/uJ=o G<ջL'L:D]6jfgLz/+ؽ[{rCMYq~[{yy czA;w9zszWHVax3 ףmkBT`x AE?fb ݃8Ơ ˫uo3sI=Ftٿٿٿٿٿٿٿٿٿٿٿٿٿ}_= }%ZVr||mmkBT>xMMQ'H& 0k)H͍ %/#vJu޷Z߿~`Y9'NfvSi5wٛGڱxMeW'w}v=)옲v=v)O~(gi4F&̀*sjn6cxm>ݣZn7'ҋmʌ|6㖳=]0s/};s:=IGG ijȥt?wݚ2W'Kǰ۬wk8^5 3qpB=VxS9 h˄N{2ފY:β-}^ȤFp(xs2Q￶Y6.' 2Lה9yXf_Ev+ܟ,ݘZb9˽ |Mn߻9/_Y]`曓?tt[w9@ 1VmkBTx֡MDQ+H*(a"% H$Ao]3ɩLUڞ{g\sKٷÛk^i~e]~jYnI?Gc\Û?ߔcxcu4Mlg?Ϧ6Mlg?Ϧ6MlT`!  *mkBTx}+(H,"H$"#X$,QԈZs>U{ ..T}6ڳ-F`p]k߅~b  О$wݓٱ|sCoA+q3lOx@(0a+? T,_7s\Ϙ^Bl1)C+k(FyN"8dPC_9>O0&l4Im+nwGrŰ)/tihf ѸX>E)<,6s45zb?J\<OM%O#(76:= ӋYAƒH Ls6MXBcX&ǘJte. 3.je(??Lj=%wZizFTx$kP8Em jAOހ>~؆B9 ֤8UKCvjbL Cy ;mj P. DkwUE€3ܨ8xUJs\ɟ+;}sFQ(KIXݛƨ 1 +KdX];Jģcx$D׷X`i @l̏rnm$^9΄zBGϞQ=nfkDe; <a>,⢞jk0B[p($Ǡp4 nq`XƓ vϵ.xHnorJ5Hu뇗 f a[Z:>36[g RL؍?( &w.7C#~B{] UW 71jk~ecGrD.=K@WDZM0倐0\xvqNZ ># BE )&yA}t?B Ym(WIpɱ |2+\2 )l8tl@Z.Be񅋍RSƃm>dIl'N adĢG3%#)?$s _5=YBR#-k"qGP-e"f%֩-ϓ378M9ϊ,_*n;HEBƱcl~ ˝[/sagIE2,z1t:kLș壋G){7ond{@rP>kwk׽ #kXfyEAB9uM4P=_lgW؇N#_nGpp ,ZUu6ȓVӰ0EK7*|]{75F\ԶzQz! uH>upT٣o3P)[^6` -d&*=%fY<^ط`_6|h3ء>2 Pq7ώ ,NsjF=B` 큳CiU)R鐏@LҮǧmb<2FHRqùFXi䎲OmGA}:*u f:@ʫRH.66jcGOpO- 6HKJU:Jǃv,3DZEƮqq7p?ȌK%ȧ$;?Qr6pP7`a^=R_)m>D3#£ _' Iɭu͋C-Rne㯄ssL<ȭ/R)|Lt_1Lk=rr 4/gEr~PnB[\g[{gYvRW' {Fem1{ wL;7&$xc0 n&u@5sCCձm8Heft x{q(aтa?Q%l4ςxmWI׆GC1kQ3iJh,KRO`ʲ4)%b6B8\pe;u)ko)#WSncRx{[sXv195_0Kՙ7>Tp5ٴl3S"؝LX睫[5m Q="u}pϘ*xbՉ#iM+@Z! Ϯ~jYݬ$?5mtu] %@݅:4h8ۃtu3; ΑO1A/r R*5i&j#Y2:$Z(ad@>'z L뇶6Z8|`6"X1_z' F-я?X^ A:?1;h/KVB' vOnFS ƤQ{=kh7MwXQp\v͓O/. N3HKRlK"q^Wh1wt h@3e6N|I;y?8t[[! $,ήLe"z%IކAkRl!3u8ځy?_W)AbCO!rza5Sn֗#<43y6"R߃CQ&>[# BHǽ{vekOTlq(UH͵h ݔ8,@tՂL{p/*L"d_y k,4 G̖bD>,.ok"D;|7[.DCA#ilϟI֬Dq]+eE _-- ڰc^Lq1~CCC9gNH8BkhJ#Z-`VoMa 9r$պZ-hkh ?C$ ^tď9d(8P݅]ڶw[wl;dn׆oKd Hބ(DInI M_(5)6H/Y1 QRk,nXHʉ?>df&6^EJmt{CCc`0ʅv5x<\9Yc}106"״!֏9dl:' 1H"z'7QqɌ#KR./CVgQȬ\ `?d1yuM6Ƶ8ZX]8^pwQE &1frRKi$GݜЕh3'{;;~FK37ku<pdʎ+C RMzƏ7)nҀ lEGyl:̑IoBS%|ЕsTulebA}Aʹ10A{KʘӺtjdLI=r PRg_LbR Şl?␔)![Fo wi&k^CV(t@pW2{hxHGRn͉eCbxԉ6GQd27\ثdS=\Ff*0ۣOP5(rZߙxQZ>~GAeN-jY7Ҿn;n?ӹ"Px}/NW:݊&׾:x" ꭥу;R펔 c䛅љElmG§a= h¨BG_uYnZ쫭FYs U"zM&:Gnu.DX5Xn;}ԫ%XO?~2&Frjj8 yA*W I9/ub)Zl: s 85J>~iI3Yԕ;:#hELם[ROd^GA˩f~Y!En0~/A Km>^WYq"<цF*c:xw|͞w%ehRgd9̕v3v Dgh>>?3hYDkgC(ʹƒԕSԜ| 2Q94(?OGQ34 fccPopTYaW(>@tX4`LGٞpɄaŰl\[9c26U M6f,'C4i?W~psϠ?kAKrŵk@I|>^xs?\`,D̒5W^w DMXf_8<%|8_왉pP1Wlm߃f?4:́_Ԕv M;k:p_sj؎qw]$F}y ,b'N=o0, ~M YR46+!}@~ujctCP.Y(x׎z?70WXFܣo3z0c8RGg0 TU򄽻w"/4֏CQ`[{Ocn]+{{ N!33+5]qpj' r9FDȬ)~: 9Gmx2-?sraG"yvUpa;Ră A\& ?#n 0eed~oq嶭!!DzP^H)>oȑ.ļԶ=Hy7S-M ?8ycߧq|#5"2Б lm#UeΤVbM͘jAc7Z ]> 4gb s 2WRsKg6 's8qzTT[R[w)I95xWj #!nN+zPڔ KgTE,?{^RDݥ=Ru^zîc&D'i74SJߔ&HUG[crͦ<׿~4}څh;lpAZ%XZ;tQ?yk1+Ƴu6[ Dc4Ɯ*dB#!}e>samhG3c^8u9󼵕⸈߂UyB;f "Yi=D =4&|C3g]~WgjhSIXU"1A5Fr4{AljwTt6</N \Rta| i>T.Wo>>xϯY{緷m,J{gg}v~)]s!?wXGFl!7U|Cnfﳅ:.@mq%臔Ru?.:aBֺE#Gg'yXDuSWNJD)21ѵVagWPqȒ s?¶@g")s\T{f3go^w:^"{d#!φt},nyWFKv„X4|VB~,˘_&fjp/WԍwaO H 3I`u1ͤ+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_Wݚw)mkBTxSƯ}M`HLiI@J(I(y0I([(#~}OLc1?6a6,W>UuΫ?s\>9 ZgGBW1i_h'W  kۄ>93ʏR)#g&CQ~̔ogI0BqSj*Bg5#g3зJY 8Hke5Byٯcϻ&saxeg:M+#2`Gh'g_BY: `m\O| Ji13^z % pʀ~-pD3/2K&,2+M2bՂ8mQdnxeˇC &~#goO8z۞074ɘS9s2zYi1'+va=2EJYL)gJE/vIp?{T7/>DqSR^B sީ4O8e@B i R:X d4ɘf fS-؅k: 3\.VdiީS_P {'Op Ȟ3&Nj`-|XB+)Z=)=v*p snDB) 2 Nci2 sV"ӗ7}L7 qCCS5 ~TCL+X Ki9gA.j]y>{^4Ȝ[S`d@/!6';fmDAL ggS%JwCvvւIcd׀;s `-=!cRg.9>=| slPSu >I7S_φ\'u޽P~s48c'xN%8Hj{(?v {nG;w'uvr9x7v;#܍u{T*d@B  rȀҾ ʏB,uu@ )u޷Ǿ `= R >eRwឰK-3Oj̬8d׀pw}7[x:`c^=v<2 ! oo K.Z-Z{~@ -u6#XAkM%xFqf0<2}؝83Gc" sX G6K8c|23'%0 {}s..9/S.xda؛g@TK'75 woox؛Xaֲx/r;;GuWXj3a gk0Z .g{iWM G9 cgxHkM,:s675 ß]fDkOLC&751 j3ڰg瘫gVXW,mkBT߯x;q'""Z%R*5j$ (6| GPbW(frlfB06;kfWm&w;SſdK:iӷbmNӕjjMւzn*I$I$I$I$I$I$I$I$I$i2joTwK| O;N7jm=]ls{nl~5W|l-zY{n7br:mg{v݈m.3Hړ6 sOh3}Qu.N'c@ڗvhwuwmkBTxK\E2 qF#%$BP0APJ4]l& "]dc"d"B|W]L۠񉎑DOǞ{3>]߷nչUuEA{f9%軠ҽmu;{RAFs}&\_0̨ۃ4_4㷤6ފ83g~kbEIwⴠ{,>8~j>残w Ì(O7S'O \XF+|x  3X/zM:? ^meĵA?Nk~c'~La8G:mboއy/4yKf45X&Ss`DzS)f(3;w`s!zYE y9(j~'0H$us5Wf$…2y.w Ì $>;VüoGJq Ì9$qb؛aA-AӃIigZڟ k=rmbWm"x*!}b\*)xΈu~O&x:>D?Ӫ}/Rrg>&qvUq 3LV)"x}j~qGP#VU2pia> o`o/V'xᑥbooo#)yQ%fgث/9 ~UTA#kBo XۋayDz ՝ 3r[so0l˥(<﹌a3fIKb~u!X,6=K#/q?q 3{5Gf85?δj?F#kֵ f8bWR31W}Zo {:yWR^d淟aCn#xᑧ9AHQ9 Δs5ڙN e'K>JPloƔ@SK5?U1pGX[0!PG|w,θF:;*eקe%-=o^3::ik5q}\"6k~[^xbw5 ~R~e~ Qz>j5 |5f8MCxֿ7,2pEx{ '^,e/V`qyf8g#aݜvU}2p679D:?L=u~t~ 3Gp6jgZVu~ 36 oE Y@0!G-9Q2w7-j~ݍaA?0!޼/&xoo?u~j~ob]H#ewaCI_;*jH2QBo `_Sf8:'|bm=@q'gZE$>H,8+ nδ+iwhgZVO|ӠεW9F;ײBohZFOa\ζPes-#al{RN-sc]0h;gXϨ;&Z3j~x팧9\3%I^NkyhgMkzFs&۝h+F>9wS>ǽs$1@;NjHՅv֝u~LuQGLww LB;vUgZλUy|j3hg*|vpiC;qi_EE:7mkBTxݽkA)RH,l bci'V`coa!X`a-F|LN(بQTT5~YA"\nyS^20?n皝RʬFҥt7 ŶAV.\:Nm4/ӈG]zz׼"I$I$I$I$I$I$I$I$I$I mQc^emHO۞IRڴTaּwM;LG҉t1K/K}2f.)IGӅ /u&e4csڗC O-Pw.u:_Rha= Li;"~O0zR`"oG:S=1Yq؟'eLz6z!tfoήztf:u:q -3|JaLӥBzVɶ+LJA~&9nG'mkBT`xͫQ@5n)SDFPXAf"% |„|v)c-7{ιgĻy7:z~O),-rZ>YX|ҋ̲,/;%h#1ܲͲ85Z]bJ;9 Cx7- 3ׁ{?֟W43🏁w׹-uWԜDUZ?, 2WhW|6ӖFG}j * Mi\6$?ԽoYGS_GƔmJ)=hCJKޯT e9mD k6g' QyT\wRh5"?-VJs~f{}갈gs.Zl溿#Zuڲ?Z sCԿwɧũQ<T|{1Z*ϳˉgv#Z:=H`*yo-@{ó+Z4Լo ZRwa|gjl”?;ӢTBA[z,)\iU$>߹mЪHI!GU6H aצ U6_km 6_km 6_km 6_km 6_km 6_km 6_km 6_km 6_km 6_JR$o}mkBTx1ja ARR Ha:uXs nB0A%4$AQlidf >7Νq ʬ擫-<;WU}YxwfK8Uw{5 ;oݪo??SU߾/zlշnA=TUcx}?a߄'j7j_P3߃g~UVOUܾ=$rUZ?Z{~3i۷g~qZ-i2m)홟NOY-e޿3K˼2g6yӜYmwa7g6#@wNmkBTxͫMQ=RR !25S)ef@)*1BL ĈezK;Kӱt:=}~S?`u^kjN /ieDVkuڃ\֌o:T>`m_^5L>lm_~f.x ZuP5R7 ߌ'0_xb-?lk'a_[7(f=h ! ?dmkk TuW6^?\mZC\?T)~qJu*X%>+X5>paJK)1aR F0/?D9(QC ?DQ׎_;?DQVC_rǿR}@_SSÔwR)g?R_XSbUJ??T)߬NǿR}M(k:ڮek|ٿgmԼ9>{ojſ=7}ַ_p n_AwKk&eOS%<׋qm͇=WWݳ]+̿命o|_~kvkvkvK\Й# emkBTxxAjB1EQoN:PK)~IIdHˮo2ſvoǿvoǿvoǿvoǿvoǿvoǿvoǿvoǿe4?I*ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;nvߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎ;ߎw}-;_sw_ڳegeƝ^ o7o^JAݧmkBTxA w~$,\kjF6GP]FFJKmkBT#x=\UF"HZXBKBKmRl,,DPIF 6FI$"BX}3ps{|쳟uX`-0g9srܔ{Y̅ lC ^ n'jmV ?n'??w8&nVyp1uZݾ&1x`QߺYGj*/xre[p4Tl9x]o??{gMyey{=G?۟Ӿu3esuMٽ7m5 ^ n'~jhwNdۿ_v35pLfS 2UMpL栳|f,^ٯ}>J.bd:)xW,jGlpLfwm8&OS 2c2y<4[1jI1q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/q/sghGnGV ;EL7Cc Κ/hsD|EcOgXh[x?t`D#%n-_?0K/+q}Ӻ}tuP`Cw)EVkym!T1ToE=>\W%zh2t^l7\|}!=7#?=u*X7:v{~>5xv>FNLSHkc(Q.p#5Rd6׉y~7^p(Fئs3XUxqޜsUi]={HIb84Vb{$'"o9f {M?9 y%=Rzk5ߤdi`acwsN|sjGBLs؈gQY;9tfaU1x3}W7pikcؿ6kcؿ6kcؿ6kcؿ6kcؿ6kcؿ6kcؿ6kcؿ6kcؿ6kcؿ6kcؿ6kcؿ6kcؿ6?__m_m_m_m_m_m_) (v 9mkBT$xϋUeEhABa8&CPp%p1AhSƅVP#FS qԉ L$dP{< ?:yίr---Q/;ÿ/;ÿ/;ÿ/;ÿ/;ÿ~7g/F4g}ihi?8cmƿ_uzbzпnZrzz 0zb{^Ŀ=_}gVPc;J5:mݪFF_:;S!f6WN}Cgߨ:hm` Y7} _?[Oe`?gW:am?]m/Um++jj_i.86߷Mm9ym{E_?<'gEZc?|J?|^=(>/Vl'W׬7>?t~<56O9_ڎؼ.߷>?l=KÖ?ؼpR/6oaK/aK} d?dY*,3,&aKyo-aK#aW=݋ؼϻ/ka}~yOUUCewh4<>|^_[,7~>`)}Ezmuz`) lj^k>jsj/6=_OUm,?|m/XϮ6u6ֿ,_({7}:e?F1_k}o>3;R b߷VuMƫl5|5׳zk-\j<i{]׿l?7XmkBT5xÁ 0L MRUUUUUUUUUUUUUui%e~? mkBTLx[fchƩQؙ&҈!}1& \ )R$Q4J1iI Mi 5 m|.>;oo}k==Ͽ;:Q#ŷTcOw TOY؀Mi[ś'{_F´/pƿ0 ?@=0*4혟/L^%E}ƿ#^w߂z9b'F:S<lMu){㟯q7Z$(ކ/Kg0>5en|SgoBmoP?3h/eoйp6<㟧B7Z ͢?]MAw׽OWG?Dzb8±7鈹׳ioಽ+r񏫳#:7qt Ľ-4:.o۳isggG65i0 }{?*i72HNE:<N?#}߿!>[VG?G׽c+H31݊0۶{\ F!>P~CrgwGu{[sBYu_ۏK3>_F}{Ms&"Yܓ˞ҳA|1>x_ltl} }/c_= ]@{^O>G2p-<܋G2ku}/Q]I|}&{f-Au_7(^~P3tRp﬇55lxZ\? ]l=/ggv:1٧~ߺ)y)ط ߮,Rlt-= yЗrvaPUs(瞶~]73pB詘kY<0 /ft;vW81ԳSpX1u|4I _Fֳw*܃[6i -y3=I _FײΫr+ C7^ܦhoz6u=.e|L?$z{>W5e{U22ltPʈ?׺KK~u f\7|śOi3tsճyڍUWWrݓp0(aܟoZ:ūDWѵl>y!(iu7z܄J!pr]أ|M,~Ԓ=&,Q&J?ghb? QJ?goO {^'(^%B}l"Þ7΍Yx>iЙ^v?'m{أ3?{X>UG|+0j?6{6?Ϛ䙓Zr]/f97¾ڋ-۫O|gI{~_>a3`gkyFguR VCѓwmkBTz'xMȥc/ "Y BI>ʒd)+fB6$ BQ4,D,s*c#9 q][=կyCON]'vOayjk~IhdN]M^n]zfz"#vewz,'v2[?G1kK9dW}w rB.o1~0͎=Ow?kqc}]v|A/ j# vDN>]@' \Յ=> v;@[t = 'Ͷ`}aijSNKF۽ #,f٣X&[V!7*h-C;*hs6XkZkZk=c_gĽ#˟kh xwUII[x\:z/}XSuh}Lsr8w=>W/lz}q?h N79EQ4zNb`V݊؇Ai烙owY j,Q3t˩-oiʠ8UvrxW Ԇ,ڳ1LyO أ!0yCD7˕=pm==ȩM>'cοM.EO+ԁ<NGL]<} ʽ ؊r};Pnlԇ4Ǽ3ԉx:y*:a*' ֢v]zќDžMM[pοUArmr\LoS[H8ќ@. և96>s48>bο]nF8yo{;Y:k8ޱ:c<ho[E{露p-҃|iݏp D~r}_QA59ZC>3KοTz=M7q7/j;({zѹ;r^x:/sў!?o_ׯG,r幆nCy ":Owݠ1suܝAoG߻q{9ο;V+裈59ο[tjz}~F" ̝sV8}nGd5;mW^2㮡k:z3 1qMY*}~Aw"7Tz~k-嬗r e熹λuhk[kZkZkZk?^ޙmkBTIXxܽ.a)Zt׉^C!:(JB(6ddo$2kw'u'W?3OvB9vKvvJ ad-|+ 3a:a*L0ϏA5 MG^scKz֫ppxQAFSwz'Em {bPc46uϰ$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$Iz}ӈگf4Bjuiy7y7y?"Rzp2iTXtXML:com.adobe.xmp Adobe Fireworks CS3 2010-10-11T14:11:47Z 2010-10-11T15:40:35Z image/png z IDATxye}WV* ,A@Z@DQ-ZoӺmERUvKS%nD&,a ge&sιx$wB9>טUV!I$Ie̘1#HϐslL6m)LvOv"0f%&~u|ϭ X,KI)-]{%IRE$I$Icn,f;[~%Q*#M" ldDѽ6c~I~ȾՅ]-ު#{%IRXbK$ITA9wkĩե-w)v= ど~ Qx/! \,H)-A^iD\$IM`-I$IRYbk]]݉''K2v Oq`o|~}DJ?`ρˀRJK[$5%$I$Id-NQDYq*z,Q>LOSݤU7,duL q SJT۸+I[$I n#zY]VoEu wo ,.~RzTH5뽒$ ,%I$I Kf9O888a=8dmdQlOn'IJrJ&Ė$I$,%5R)iXX"Nnڷ.~RZZ.^Iؒ$I$U%v'wX8؉(oHp=p#[{^ RJ+Sm+I[$I ĮvY?Z#(3UOSJ?-Kz$IjKlI$I*DŽgS[W_.J)-+Kz$IjKlI$I*rc7 ܋;{݀)/ KSJ%<{%IRXbK$ITAՒsޑ(I7Vy󁻉B{3\Oh뽒$ ,%I$I KrSZ6ie)RO+I[$I .'qxIV,U?T`࿁O.)Iz$IjKlI$I*r['>`v\R,@ d)ESk\$IM`-I$IRYbw_y,q,D,\2kN)]W6:^Iؒ$I$U%vwO$냁k'ԵcVMpW$5%$I$Idy9)){W]jE-D};i)NJҨ+I[$I vi1‘Ґ*N_66뽒$ ,%I$I K9o X)Jً.*I#z$IjKlI$I*{7#~'(H 'RZZ4^Iؒ$I$U%圧> ܆4O?}?dTZ/{%IRXbK$ITA×sN ܎I>džKݶ ,)FҚ\$IM`-I$IRYb[yQV kcV!J&[:$I$Ip土]1`Ж;}ow(I$IMIlI$I*ȓϔsx?pp +0d&I@x)s i={%IRXbK$ITA!xq`fPf.0xyJprW$5%$I$Id 9#{R e>RZR6R+I[$I jss p: %i$[wf:tgysqt$s+xwJia LR woJ)pFqW$5%$I$IԴ;%eI~`J&Ė$I$Tbv%=S??q@N)-/\$IM0tI$IL9 ޹h(IU3'LOƑ$IRx[$I I})tg ;l"I O<ǜRe0Uz$IjKlI$I*%vy:|.7.fGSeJ&Ė$I$Xb7#q|'&?Rm0Uz$IjKlI$I*j%vy_B`"TN?p@Ja^IcK$I$Ip>q4,%3NH$;,%I$Ipl6m_E٥H$;,%I$Ip=/0pI/|vyB0$I,KlI$I4SY$q7H$ƬZtI$I1cƔ,9Mم㨼`{xr?S#^ƮOfv멚;ǧ.- \$IM`-I$IRU9|8pu|`98lccX] OVE8yxlc ~eO9W>W c?tYMM&oMf2)9T/5 ,뭟/҂aJsW$5%$I$IT R??`W'C%C෻E#D};p'@Ji5sJ;3?{Ӂmߋ=b{Z#l I)_:LIJ&Ė$I$\b3O'W%D( QD\ \ UbrΛ{ vD=tG*AJrW$5%$I$IT }.ڃJgiycbuWhk#2^yGpH& jRv0+I[$I I;lVn$F'"F}_\wJiq-2(X05a.8c+I[$I C s Ov\1 ݙ8ik'e); fӠ;oرcN$NkO$^)e뽒$ ,%I$I9syz8u8YG|p ]҂4L9I"-QZhw?I)}t^sW$5%$I$IT |!q{Yjh>QVo NZ_|=tg`ꌜnWcIԞ]0V#0tc0z$IjKlI$I*%iǁ# ǩzw` q)KR 8=tC?HJAz^Iؒ$I$UPJle=0}Q sY)'JS9ge&x|' ORz0z$IjKlI$I*%6@Gqb. ؏(*~RZR4*#f9EC5G?\sJaz^Iؒ$I$UP]Kliĸ6ZB _ |8?h*UZystĝٷc W)?+\$IM`-I$IRռ0pG_L)]R6f1tQfoeh'6<7tS0z$IjKlI$I*%6@g |K Q^Y6n>7^`2XC)J6{%IRXbK$ITAu/rΧ[?3 UV7?Jܛ=؟X )a^IcK$I$I͔Rq*y2Q 5I?1y+ RJX`[V\~~g}nD\|tI$m'%I$I&9Ol.69ONXl L/>'74z{%IRXbK$ITAM)rλWcQ8v!NRqO^P:z SGεV~O;l;8ػtI$%$I$Iw/+cm1ëCSJg*I2={v}_"IlHv.~F>c"z}lhǓu++JQm Můט0O^לC`aF&H5+#0n?fub=E^]Ff] > gRj@%s\L,)nRL t?Jjn?FV6﫞5V0cknm8_GRg\S:Hl(&JiO_,Dp-MonI bz`aVNlEg^t6 }nm ֵ`s#lh`] >Mjpj4rDi 񜻜4fgwpc/Q7ؚ8o dj:sLM)=tQZJ K#)bCXbKW{9QlH7#hr{$F I\RHE#@юБ9pMJ]%5 Y$=F$IAXbӱ\N$vkRJ7F,vQ`OH)b6I)x;0p 8tI*d&I# gvI J웈{yx#,~Cr=pZ>l[#$Ik:Փw nҷo;~8{_JGZH)]FЭ #u4 xr$L8pT,`ڳ.p?Cp8\J{1rif !NHr<0Lj$I҆ x|X@A;\*\{  ?"N`?[Ά:HjuqTGM;̚X BL_O//y#gKQeI,.Ă6o(I4<3Sڻo7FxrѪ/p:?|{EJ霔c9FH)}82t tI*l8RM#-=uwɧwy5m୥C/&NUp3ATISm~H$mB{+b+;+RJ w3qĈo^RSSEv9tI*lqEΗ gkhdˁγ<^A5zj1WZ!c`v -N*B4;IњDp"Ĵ)lZ08|:RJ> lM2 CHRM]cnv?14u}k4oĎmJQ弖uhsKP%"IN, >71!iG7&6 qJ') '5D&6_U:HtI9wQ(ĤY\5RkwӬCO(Ds qRW<5>F$Ia:p$/ZRJKk%NO?y )'5AJi1m+Εۇ8)A|(v \f$|1!T)['w-*z݉L/D$X]\.! i3UFJQbwA~~*K'5CJ gTtஜ%);ťN;8Xf 1J4kɥ2N"FO/"Ϥ!o$X"I}(]y_{XRJ?>N,v<}bpLJKx6j-IRv"?T8${N܁݆{xOF0am%M)>x8tUiğsY$2-B$eM'VHQnC\tCߌpRJs)' ǒ*Z:6N\S0tI VDY:Jޝ8dنw͛ QdtuA*fMpu1qHjp#rV ZrTU`Y8&~饳vK\_Jeɷ_+EOcю[Dp46"VZIlyoN.BŽX:D#^S:;^!I8(k:kĵRJ)l :#I68QgTD7en ˉoe# !+31I#ş)BEE!]:HE-\:z1Lj$IRAH) FtZ![p-³F9{}%oļخt϶np y *b IDAT I$USqR{aeHj i)Jpl #_ \6TIG=.qQY_ C5RCvzq"_k7xxa *8ŧ$Iu{q[Ƒ @lMy\ Tq;#U7iU%a!ƉچJiH%i\NsTBb̃ggby,$I`p6pz, t8t6S:$8은eHkoiO5~bbXGlľfxv3 ,.fSJQϽ#$Iu4x3 gT'öHR DLwYv.%BxS_y# L+&nT:zj qaA$IQf>Cq%Nv(Bjj'bׁW"vb*ؕY)Ѭ[=%vaO': #$Iu6xشY$<`!*`$! gz3&hdž)Gߛ4R|0[: MHL$IR#&+lI5u˰&w;J6Ĥ"uT D{ ~1")Lv`t̑4k#FwǖJ\1tI$uLbHңr`~,m2HR'<qPjNӞ{xn~]Rq'#v.fQ/m1tI8ذ(I#X lMK8xUe.LbV&_l%M?0ؼtuהAun.B$I7qeY$˓T'%s |Xw-= iO}p:=܆[b|}kJQ׽ͯI{a 94k$IV;x?eH߉^K'Iv Q`t>\I;&%>MHJ+iHC{5rg ؙN!IfڇfHRMI:1Tf_&5|gS^~ᑔOߧYfA5cRShǓpx"I#}4ZA1!N3f-Db`E$I*jW➳ T9 ObKR/mAU^ \8t*y״8Z7-v`Җ%JѨIR,$Nw ۖ@JjIS}&ɬjf:p9F`IړϧJh_.m B\q)K S8K/' pg+Q3͈Sٖ2b>4$Eě8Oxg|7@<{V~dT O+E(SMNL$6'O$^.%ö![6'ps,;8t xt9ti z 0՛\n"&<SoK7Dxx=8=>Ӊ8pIBB,-Ev*BDНMӉZ#K|(w ñ)?mFUv.!^<"QWhJر&=.$ PKz;xt +hM ^R:$IR-%ƿnO%Nż x 6vb2W[OJlZ= 6Jsދ(bJgFn*ٞ$^3-ZD\`zs5XNClnc1Yb1VY u KШN[ `^o4$ANon.BjNR$w&Utd!$Ny si}kqZ)WCHj3YJ 88p.t~&\F\"Q:%6׉ƿ jo(D7@k_u:1(ޟW:(`E$I-f>½MOsސ[):HҚN$[6Jsۈbo߲Qcc"6įL⊫F#`s3R| pjZm3Jd췩߽9zvv^%YRs](CXFT39rΟ\p[:$u<T~\P8z5)YB?19 gn,OE ?w 3 [gylz #pz>Cb|}NmL N:Rzzۗ$Ijӊ~mn,Aw طc=\{_-B:b5r$q@e>M{N 8X:UUwt]*Dz`a# |zxuL!IBWߡĖj%|8p>}, sRJw"IRPdj!6s]ӅDҖ{[bw gn'N6eB൥C&(d_m]D䯋>bwWfĸK$Ij" @_F8 S2-W Yյ׭K}M0x@X:שĂPL#l"`1pcwt `_u!IbOߠ%p_Isp-0G6W5AK.X >=TdG`B8m)+Ybc۔7*c`L#(s)b&K GIҾ I݈kj$UL؜|M؇58'T %wB46ߑˁ7w&4F~]#.ˈWЌq*o`GuV`bp|ki^bwJ#x]:$IRC옿Y7}ԎT99罁AD18xi E CSRLYXEic|xvߞ1yC}qԫ[ǀcKhMSu1 y? p=!Zn:1Jn9$I.%j멗ǰ,z.WZD,3~]:$ n^1['s+8l -끫 g)%Wi] 3Ex S'Lj#=]`g~Q:D˽0B$IR5,!kpјV:9s~quw CC R:D!&\@L;Q5@Lt_?-^!bYǵNĝ;wV'S:$Ib}]mW:d9ĵPEWw嵺K)]\:$еZX9;|hbTcG+pa,Ћ؋M)~/K.p`R#0؜xߣ^> זR[dxRF$Zn,b 5QyiZ_VgsAxcOECT`9p1M,ZmkĦ#F鉡bjʲq%68zm{eC ]4C7N=tzp?.vH$U]&9sfp21qnq.꬟)R ib gQWa[R)'ghHՅ͛?Cu*gt+- rO}~3wwN&R:$IA;q<-ZyTM?{wge] #* fV#.Wݕv۴+\2+4+[&&IeTDpEL *xϹ%b3guc#s3su}?5Ϻn]gY3޺Tt&na CXMkóukTQԦb A;߬1)/? [})ώ?"8K+ X̬<_ߊNY@kd+iEft=pUp3(6QZM- 3P!5J{40*8K,Aeމ QElK."v/}cB-$E<4Ccub4Tyv؍21":H Å"E[@7w LNȲc̊`.nL:Hw tnl2FkoFF_l@#W_D=S'zb G$f _?jS|nG/`Igw\Wt3?:H <.YHHtfy_t~pp# <,,"IqS&EKb㴌OAFiv鹮Y^ttsE6ԟ~6pNpV1 qS*b¾?]ЎsW3333k>[Gf$`$X]xs@둵X13K"`MnCԍ8otҩTc8 7ElP[41YX\nmPT`.3+ xw>VdAZx;mPtX afffVc;Dgzu|/M}mj;Y̬ )Q bۀO|S4B;ppi"yP&8ǻ DmWF)vU( IDATթ`cVvfffV,;v!8 f5)v4/s.\z/iff*b"PѼmj(MFvdpCp$4(ڡi6d4p7!48KF]T`,~{'Igg2j8ώ7 E(bZѻmfffE2t7v¬< 8ނmwtdYXt3&Q}f=3 sW8utmv'>|]8+qa9{"vlDR{5{63Dԁc0^%y7333+Ѥ;Wz->fh31htܞyGƅY̬YNў6='y/. CϣPD2yCF炳h> X ,ǽP>n=pDEߔo<0&:Y m G#Rl¬v,ބp:>,:H CsAvbfffVcfytr,yNހ:轀 tu=߬JugY̚C+gx%{8E6]1:Hʢ^JX""vy&XqDsRZC?Mz'@nCYVmV;gN{M83:Y B<ɵ޶a)y^ƽ GE' FJY}::Y qmhm3gb4WaЧiv;08>:H"wVPax>jx+"xuig)> 5PBM"T`n:::ٺ<Z <:}IRnt\ĮPTмF)Lh~:(I~R7휿3:Y F:M7d5pMtKO绠1RGy}Bf nn\63@D!){::JOY ؋{HƲv Ry|Z]R01)I*tqcfffVo91ȢCX|(jdvG.Snn4eØ%/ZW\ں߯?V1m_/ {]XR'5j 8KGRhgS'F2:Dn AwG0333OaEM= h#h!o ZtpvT~',ff)Ȥt,Ub OGEs:x-QnGcԺk"E8m&pnpTvT~ ]֒N{*ڍZܳ桧n.j??:Y Eg*۷DP"1kYAϽ,.:Y҆x-y=*qaF /gC$j /j9=yJo]19ja5[Hjfffx %tA,Vy~e߾}Bk6Zx]NoL#vt<l3FZL@EwNE!j&͝girR|VtOgI83+%5CJԮD:;VY\9jaffff5uvTt(oҽ'45\{EG{Dni)uLP#,R`BD'&ΔSӀw(jƢke_4P3/>A-Gwܛ.Z5FEG.LFAUfv;"Y ]ߦn Z|Z8͸O{ siӉ6OtecẙbUt5CB_鵓F[iŹ>YZN3ЍR.bվ +x5i2B7 {Ԇ%%ۣYDq+q333K@໨r&1sD|(tj-f>ejt42)~] )9sShMYZR3?稅 <ܽv$y hK/,f"v%^ ̬ƢEP!'AEnIyh-E t]kX@W,cp3":mt;V}57Z\)`o |^p u]v44wC& ΒS\Tl\͝X K:'G4nONIԉN̍bfff So hTףXu<^ C`J::L>LϿ63^naʅ_^٬h%R\lEPpn"v<%YAITL@CmD[kUWQwJpztt\[ oG35E /fft&p7L7nGӼ]}wC~ݮ'JsxplElPC@ Wt Ce7CTh!6\}L6*lnY*FC-tEtϸ~7ouoJV<%eY{p3"e-^4L/E#CAQ9\^Zf,b J`T)zz!,cjI:3ס烳4uߘN ffff=08,^}b>z&ih-dbLBޟe[ۚ[gHm5hij3wFv桟,:I36éoC NAqoV{xxtS@tH"ZNkQ,֭ؠ)˞ŝaюZw[{R!*t/lgtb`t[Ys | N>Cq ]^&yhhFBt<6\6OeEبmf+(FP*<NDTUz0\n*Z!QKra(Xl5 ؂^VjtZ$Ѹ)3Ѽ=T[YszZ9r }$<D}t,5hl,˚i4YM 3:t!TH4(LJUvt?x&ҬEЮ%p0xI6}S>bF;Sj?v9yFԋKۢC4@?Z:v"4’':Y8;'2TEãy%^8mgu ˲[yZM-oY&kǢMScF;1 u&ӬEl_Feɸ1DLRх͸sk hC=ҌEAj`7C4V8E03+-Ѭ룁u QZX؅6\8Y<ϷF( Bǭ-m%vi,ZcfxDb稥!oԞDnhSފZj")FKh'ѼT`З-Jr8\ސCQG۶ȷBʗF‰df-PGWkQ exZEShx3nm yOލF=:jM5 ʧVfYvGp3V6,tMpZz uAsxSQ!FZ~'0 $pEpۄf.b߉n䖑G< v}ܩA*pytMƝK:_hG,c UZLt3A3+ߗGAl vFMF農ZF\[u;':H|05v6؁S]B;z  e󘙵P]Wِr;6`;Btة^8FJNkWogh"6h!jAMG@ d3BZ =E5h9ja,ff-1ʬJJ^l-1'dTy j~Z,G2~,~̬M.@Xx zjʭ砑sk@Zac@ oG5{2Lo)8<:DZ= A67CTA`6.bkojxt*us),\':>S:.^ 8--v zaYdfFo(\`3t][Tl4t|T/Ѭ5ͬj;>zً@ŭ.~1 B;giǢӷ{Fj='4뤓tf)dNn! 4333+B9o^coFdw "hG˲^M̬^䨀reSE5)*챨sw3xQahgʇH{~tot{f/b~G1Nvb^hV{=:]tS/޽"50rt333UB<:q(ڰ}neo $˲b#uŸb.:xaZ|_Z6?f/b_ ؠ+zv$Alpt*u?E1333kA\4<^ ܊]"(;ggYvyl$33[ i$4GiB2zWk|8XNf(,Vrn 1^$VF w0Z@Ir)p/K p2zMRoffff8;q<O|umKvR8 p =ҩ Y ~$A*Rq-i N64|it*uv>F1333k!gg)<ϧnWCku׋퀋,{(4o$qT #5<`}r'&"с7F 5lPp::$kJwqC$` ~4:՜i5Gjm/fG2 Zzn| ffff-bo RyE@)KPA`k`,j'zTe53x{}'w֡Z~ޣi*d_UldbN/g*R^_x&WTk*|;g驑od:kt*>̬Et>Jn<χ[|qցڬNBK,{*4opڔ?p?Ii=V:?ikixSHTu ;G-q^Ro)i" CThҜe 6$:H& 啨LʺP~sml̬zh7Og)< VB歸hlЉZߏvF oβTffP@t@)Z:9g{gO-F'pFFm~O:Adf[bR*b߉v-&~kߧ֞ZCT`.ʝ<ˀ/D"ʹf{?dDt*-@̬Z*y~ԍuuHidY. ffaK`<XYӣ5.=^W:rk_Iu[ѕG+ub5R*hw+9ZJMj!pKtpZ^hg ǧG'+EאKyG5CfD cm,Ͳ`ffF_` }r_T{x)QlЦ76OhB% V[̊Qǣ_>)w;:DV|ϑN{*Bgiב܅v&:YAuS8|jNԅk |< m?(?dY3iCQ1G5!sz~f[oJ*?uQQ͇.Iڣy{x IDATXVľݠ/ 퓊3Q;V12[hAsq p* 4lJ &4sh8Dkch|Y+αPk~h&߳,끥DtX~Kݢ(m(9ΫPAqe{%=PE르N{ :HpԊQ18:2kIk-uB&Jk5*RDt618G΋afffV0]hQf;`nkyZW886F< @kI[Q{fYvo\4Gt^xzv6$4'~|)dR$\.]8)Z<\aވRCBa"c]D=J]B߻ks`2Zd|(qMXtÀq ,]P.FXhfC5_'a/۰veqGp?vK2 Wt tοRϣ)/o8 48KXJG@'j> ;16NO__=:t"l;t/'|=˲5 g.0Ωgxq ijB\.ע)l}nx`,Ѝc9j `vt -C@ZFt&V6[:sꥄ6oO6{`/y> (pp30%0Z'~ ̲lU\<33P%#u|3}p;EQ ."Bvx%p]pz;gslږMly1,#`,vOi!% ffff oc'Ϣ_*`5R->~,̲lu\<33k+Mdj:ƃgIT0[/NE7OD~5 }KԂӖhVA4u/X,qSQiJρoJBh[[[Y? pOZmPp :|ՈˀBv*sXZ^Z㣃T?pht: AZE 5cCTN4ۢE엠E=TiKffff1 trntb@3'"V{Ѩ\ ffffV>]B *Pczh +rz07m *˲GBE_騛 g>k-YI,jGt*F3Z>-$=:H8&:Dڀ/g@?0:HffffVmP[.f_ |uZ</w;ژV@?OZ?\:˲rQ'휅NDG 5!6uk2,$"6e!4|<D^`et:8ZJe9ԖE7nTfY[^ \z>1׆%<Ǣ/nówJ`ss-p0˲bZ :pipKap!A]g@o~?t[F-.RsgpJߛ_Q݋^ew0 x$8Kf\ĞlTYr1 Ԟ||`|?>K:5t#PzkT,*\PW'}uYefff*P οs!1:hyNpkE(b߈ ),^68KZWt p *4ciސ Ta,bffffa:#|;pGd|5nnF=NM A]~eE.14oY9rtDϏ+X)BϤR|1*j=M=n?"trYj`'|Qafffּ&G?S%?MT<Ϗ@S0&0u k2.m@;t霰} ];:Qg&S"_FR?B:% vABwoEI U9:mRl}R烁g ÃY- ffff֎ڇ68K?⻯IkE_pkBE)bXE-ŧXԆ;e!S!E9WŀYzpxty jt*'+333V1 r8uz}l |XX؊-WÀ,+BG+33V֣S 8Ȯ}Q,Ameك̬~.Kq ~Fr| .`[}=i$ E/|JlN<4 A~\BbWECQ˼6o.: gt3333r!Jqaq;uP= HxoeE333+Z>AϠe.doZ;{c,=E+b?~vR h4,:x$oIkEKZI[P7EUhnmp`ff-cpB3x<DE}m܊}?p!4Y=>|5j @h{xS.boJ'Z?cpKLъ_QEjE왤7w4wu[ӎ=7k,{:0@PCxsb4he.`[/p#z!Mx*:ѼpWpz5ZHk MJk EЉ;UߢffffVLЦj?`w\nf]}X`ԭCܽYffffJ4ZUEgыjҽI?#Ѯf/ZKEY!*z(b@'FR^Jڈ׹7 8m;ѽӱֆǡW?r;^yK1hY̚N;궺-vzWhgHeo:QTɬElPCT x#,3fG;LCmS> @' β9'9)afffVwv羨L`{`1:=Z}=쾕 4i&nYiGƣggYTfff]? M}hBT:FFņofQfw8::DJ5A̟I8%98:flN;Rr+AtbsiPhq;/.QنūVYk&]n1jse'mfffB5n`?\?v5ځ}7 f5Qؠ{<~jf; y7пpqt -  T_@'6n@Yym{ThѯڍC݅.n_#} 9}[e dfff EZE]wB_Csi5/D-R5k;18D-R+4S)8lfTa pvt333&([u2hAQmſ&:!y~)fh!?p0+˲c#YDU^Z_^Y||WN`_yQNWXK{Cll/%/E썹 XS\콣lVhA)U mݭh۫>k͜D5m^>rC1W_B/\nv<e]633nuT] .`73P'yYjK_cVsE/b?R+kZi`202:H:Ќ4PKf4}=SToC5ۀhv4_hе9-ܿiRJЬݲ,;7˲#YS@Fǀ5փhDO{pZD  #`UNs6c{Cf̶1%h~kЮ6x Bmb߉afff_bM[u GED7jܪV.^A'Oɲ,VG333Ps&aCm!YJX`kTB#.>k-VG}4hUl]\ N.tBA?HZB=ơ fLu1\|u0bYvNz8t2nҹAyC V{%t%',+ 3οE{jf=롣=pOb=BsњIhVk׮`(5ЏtثFX4B\޴Iچu βQ1UKEUg}hNMDγ}YhԨDu=Z ʲ8fff`Zt-9f[_By.*U|&:H5@+AC? AhpA*dG1wsN3щA0\t333Du3ϒWBv[߾}rq}b|^ͤyⵙYu_%`[TߟBXY?̬ZKKhWRPog);Z^l\"wI;Z@ےis~σ:8~xšD-ZVAH *ͤyGy;(ˣ$h*FYiv񃁽m6^43333J!gd33f zr]vq6Ps,{26YCu^fϣc%>4nqe%UQv0tpnds*6,K6 sCT~4G<>M3/D0333+dppl;3xG7nܐ,PBG?e#,Q}TiVs[D~^~o$:DEd``  |j-@l1333αIc֬Y޻}r̬gZ$6y!x-?$w[Su_t w3 Y00ke8:offffp&:۴MɓYjUtu+eYZ1mIDATHx(:HKZw4U.4AZe!Ǝ 'e8p`tTc/gYv ffffffk"27Ֆ)W71gIkja;`?l?f--nafffւ.- qŋmݢ㤠 #133333+V-b\ Qx'h)[J4:DyxCߧj8pyt333ޝG]KF $ !rFb1xKb 1n=ۺi䴧N'%iv6f1pj2@f Z€64c< mguΜ1ci=s~K֡/_NGGQrA~/Zv{pI$IV}-w-ǒfVe)+RUC5<銮ug~E+Zp7I?G>}:\r 7oϿV]R՞$I$IM3_%8sm)t u&yH':0-azWt+H*^VD$I ̎ O|W_}6i$8$I$ [- C,|e%_HȊ~+,"mF|2)lIH?f6V1r̞=/SOjH$IҰ'!͵x/p;fFf%/mJNy%_,=mA$IJM8 6^s,`K$IR n-DX5N׬Jh7WKyH'?Q5f|E$IjrU}رΪ/ V28$I$5f/bC*M1HmsGK׬߱x fwEtL2]E޳[[CH$5*/8sL?|ۈYinZlpI$IjR|3V׉X+ˏI7prq:g%?8T,Qpn$IjO>16nȬYl. Oj$Ib;\A-;@k k9}ԆN/_KfJs $IbM[`w~G~ZF^I$I,b'oKӁׁKX#v9b{;:HFVzwitF6&H$ ȳU]+`͚5ǵZZ5:$I$5#ׁSɷZ%{5]yN_16FD9A~10uD$ITՅ."N8ۈsH$IRSk \ש~cIsyG{ ZXD;E70 x<:0wC1Y-,J`ymH$ Έ|W^SOⒹ/`V0$I<}Ѝ9ZO疑Z 4w#Ht&p3p&ymp>\ Wϑ%IK_|9߮,$I$,bMR|V_^DhH7wVF) y9CpktI$M_O8 .m۶y=C*b^Vw|I$IV,bT[dFתz`: MuIz~f Zj+5 $Ij˖-c~G}jږ0$I"Aȷ"4֚ |`\%58G*0:D6GI\BY'IQ ?K}. ػH$I"}M-HE܏դ9mDV6~Rb`|k.(GJc)IVR\xᅌ9S=\]՞#I$Iz;o2M-_~u.?VNߌD]ʹ8{i&Mol^"IX]t&mdV{::$I$Pu'0-: #׆rt*0fvZ;dn$H3wkxq"GL$I>޽{='ZvotI$IY>MR|&eCX㣤S9  A!setk\ IL^?/NSƙ6S^!$ItXID 3f.],RZtI$IұY>H PŤ;w4wRK8UfRa7Jm`| x NV$IW .3flka$I$IfXd~\3} }Ml2y=WN!j<^N;.ҘUA$It 4 se/3n\/ "I$I gbe!}xyXOm MnELF7ii2BU`/pWtI$Ť Zp֬Y̜9;vdV}ZOH$IΓG\jo:3TiZ7NJj)M|̇|:B !Iúx/R^|Eۋ\67+"I$IE#{x$k#徢K; vt8 u\Iz]Q+gH$鰖X[[gy&cƌ)rr$I$"N*u|GD!OעCts{mۀJKT^$I:K7 |rx f͚UԒ9Z FI$IEpw{ <&]+xQ|Ԧ/'O {#^../N H$IRSXlȑ> {ijH$Ig^^$ϖ3I{/6 Ӭ^`_tRA0 ҍH$ӀeE-8w\ژ1cFQKZ9:$I$ip,b]p7fBT]@z,^ (7Niz6~H$iE-5k0nܸ@wV=:$I$i,bߓf/R x]%Lo$Q1I~Dos0&:Dڀ_W:`Q1):$I |ߗrg0fLNj=NsA$I$ICcغ R|1u9-ߛ ϢC7߆=iWѣ_7p$I^SK,aΝ̚5fCZLtI$IX>}ȷ*<#x,EV%` y}9z5q D$Ios)"=زeKK YtI$IY/N,t´G2Ca|ot֏i&<[Gtҍy%*\$IG;p#80Eۙ9s&SN-jLVD$I4til)8F^~WZ;pFt:m" ?ˀbwnVQI$5V૤IҥKټy3E.ZkA$I$IŰ=pwgK6R{õJl&I'Ĕ)S5kV Z`tI$iEra{$rl)>$^,$BE*:V`Zt:'n|]70ytI$ޛcڵ7]pA$I$IŲ]ȳL`'8x 5Cn#_8t&' IW$I|TB l>}@/GH$I@ʅE|8<[| |=:uIA08 8Xgl%.I*p ӧOgʔ)̘1Yp6ZF$IT,w|g \m"]wk F7&PWt ?ECgJ/I  4:$IR8Jun:̙S%r뮻.:$?2iҤ֭"IT&bH`IhlDр\OC*`ARJ򜇽UtI&5/'g]ʾL#gkH$I0d;@-WsWg45S'DNqE$IRX>RhQtat $cTyV\D#H-F% / !`$6ihƓo'Tx7I^%WgϦir#I$IXkC cI'xhHnstaIGCH*qXF?!`1 }4hz;ɦM3gNtI$IJa{h$Jx9ڀ!{XlI֓ZaDa_OixM*jDtâ]NvC$IҌ0 |1 oEQ!!:$IƌÉ'H[[[tI$IJc{,1 'SAouB$I8Ss$i8@$5C8tTvt!`, D$I՘?>[n!I$IR,b~l[m!T7U Zi߯$Iܹsٽ{wt I4":$Ij<qi~xt]7HUQ!$ITS2nܸ$I$"v1ÖEz x8: w'p*Ա $Iioogʔ)Q$I$I*E1Lnm#Э<):$I1w\oIlI$IҰg8_EXL Ρr|[CB$IY`===1$I$I*E<–C4{Wt+!L $IΩJ___t I$IJg8{A27':J x7{ Ji`]tI$Ugɶ$I$5ź[E0#:J1n$Iرc;v,SL"I$IR,bt"Sxx):Ju-pJtgE$IRuf̘޽{=-I$Ij  xOŃT;8GVO/G$IRu:;;ٶm[t I$I*ax"Sg7EPH-7D(!$IT9s{$I$U"v~ǖZAjž*:*q0=:Dzsp$IRә$I1}tvC$IJY._ f=p j-!P XD$I1&OA$IYĮ- f5 j!^$I3i$vC$IJYĮ}Dl)Vcqίz%ҬpI$ ?=@#҉M5~ru׍!mn<=&$I$I1,bWvnTvίN`^3MtI$j `40y'=oyj#J$IlIV^M4NFPZ @:,8KnD $InRNi `ؒ$Idz"z` jhCF$IҀ〓H׀g63:M*$$I$I]vif;Njl7h?CH$ݤկ#H߽I:Y].โ9>"$I$XĮhأH7t9Gl'Im"IԄV'_L!EIm2ĵ%I$IjXc>BY9m$lf}$IROIS;x#H}s/pK:x1v#+IȈ##Hn_t!pU1&Jk&IE_Gة5!2'ixAs t8oa?_[qfJ~J:E4z ,$du!W# 7>UxG9}v/e?TI?s{7X*ƅkIENDB`web2py-2.12.3.orig/applications/examples/static/images/web2py_logo.png0000664000000000000000000002335612564727256024475 0ustar rootrootPNG  IHDR-Ŕ=sBIT|d pHYs  ~tEXtSoftwareAdobe Fireworks CS3FtEXtCreation Time11.10.10M) IDATx}yٓ<>%Qj4x%Q&*yUPC0(r, ˱]5ӻ;‚ӟ~V= c 4% ``?tBcέdewFUTI`P@@BP{`߾Z5Ba_˄+\ jXIBzBBRHqƘa'ǃJ{۶͛^ bƹ/99.p8RIRڣ Bh[Wݻ? ԂtasԼ܏P=.Cқ !Jkꦔ1ښׯ\ҏ?8ؼ|tƘٚi~dE$1BHLG$DQ۵{7T<B@XG"-!SR Bw 110!,#?7wYe<ŕYQ@AT`0 iQUU5Ñ9骪B h>/x̟8y(pK #SK(V/3W N;k5q=O uPb僀r¼x=GR'QJ/lxiB(:z`#s uW q\y}f8E.رK!hu]%9{v Yzg5ˢ%b/y")]q @^X" Tr@'tKS-K7Z@ߌ1XRiB4[ .Y:ZSL: 3HQ?K굙PcF4ݻV-lޝ;'7bڷa)F;kΜ:u:4{,w>zP 3jhͷ'fleex؆`uk֊L`*_݋ li0 $I>;|K0"$^L#7f9 ʇ:w|w:B仮.=M|q<c,2 Ƙi`Ec~~XUuU՛<30ж]vB}}01e_}X @=3 Ӆ}{5wJK2r(ve1R\diAp'DMOON?RRS=)RRRFBEQ 2dY$ː$YG+@#&Ҏҧ4hE͙}cO&)*K)wЪceD Q%p)MƠ9ZZzz*u7.uueeaeef\37N4rMBJIIE~~~IS1 Z u B1&@*x ˵>{0bȾ[kNF!SJl!FfuUUКWbiU2f VD BcUUU!4I 2vSJt:S\3M0 ׷- >_t /os3A*d)䢾di&lPB)2dfi:^?,Vg؀%O0J)QUUu\(F.c H?ŵ?ݱ}^2XyLeҿO(cc` . %%ޙӯ\ZQ^^^n 0d:T (!-_Jƍ?E& 0Yx}:u#1W'4|kgJ(Ғa-! JfaT8|^4^PJa&ns۶BR 0+dU,I{~?u_wƬdiy]Ѯ];~?[o+5ƴ>lmىB G">W0&&9xb[K(RB!!<'8F%tI9jT۫f0dICie<%%+ĉ"!$,*oKtu,yp8P]U}ϗ9|N }Lc\0X0 dffWϚys<8wYQ.$\$~+=UUUq& aԫf5ŗmz4z';Ya0@ 2uꈝ![ J[[)8A}"%boٖ߮Yl0re0 61x:pе:…s4vs$IBMUU{U$cx`вb5ؿ/xy}>Gp82D9EQj]o7mڂ8輄d+yF_i`0妛Wlߺ> Ntw(?VB0a҄=l*80\ne('IOH*uWO4?^pV((K<'֤>+QVؿI]tG_tatڵG?,wc=1"й=տV9AB/GxaGiNU$lR8Nl=+- 2pvkT^XgfRڔ K{r=OqAiUM>aBr?#Z8j'%LN30B֣:.8$IY=ݭg>mπ/׬-w֯JDЭQ 2H*|WlR(8^Zٱm MUGaa%$xBLѬD(QζUDlYﲟS\m !d=\?Z};Kq|Q嫚s `Ւ%{UcbcfRGwvt!tix^`qU+F|b-ceNs)4T,} =[ MdM H0(Jܭu]v?qBuk#>= hQpؕ9^#Ijjke}Vhx?p:rcu]wk{]ݴԦWEr;@S4lmKIi"-=v~V۶W4HM~.NȢ5 ֣GT.555ءCG{mzᐕǤl9\fvl:zn:wqckSOW #^[`nѻ4BHdb2Ң~oqqpG}1)hMf?BΉ<](¤)ٯۓO [BɴW}+ _^uRF;r 18.tս׭Y6V[w*;VxL Q]?y;`rݴyMo p.k4nx#&Nhl6eLX% -MV*{*b͊i w)cl:% `͸Sbk 6w.(//$dᵲr? J)$Da;v| ;-\JWA}k(c`ZO|KyCJqk?/2*++~]#%IG8kfMxa˵^}m-,˝<Ry˦Ӯ\Nw#ԂF4f\zE_~x^,ODPJEPB6 z\ٶ]u1=S.u0DQ(~Cճfe5̻ib먄!+(N!,A4C ϖ{üe7͹a{Kظ17~ [ D01 ,QTeG"y^y='wjZ:tذX-[YeꕫӧR i99{w^ǂGQ';zX=ٞ/UQc.ۃ(`Ly21˽2|h־{d':rt{JӴ k!z04ʊ wQAA}/u?QnoHVLcj\.zon&EpIS]))(,9 |/~~L6G4MHD;d+%3_o\ ] Xfup4x? 4:㚙ݳ'c,*?q)!|q(8_Sge|j*kEAgff*3f?;`J+݃!2L˗.; jۑ#$I>ŶC oNDpqt]^7M}=f]yk>~}=oJtRJ"BPUQQQ\XXwm?VVZF|O78[[c <( !)e[~ypT\;ǶeFQ1wӉrYKOⅨ5 wŸ nO$77x/$J(2՚([+B=YQ깩]V\baMSCQVTzm$벢U KTRJL^c;B?7Zؙti؟"B5 xډ%8UUQ2۴iB)E4E8!cƎx/~3nĨ=t_$gSF Y:pcss޾}&  #bS L 6E$ @u|G~{]rsOj^z]yS;v8aj^o]b={_V.lH4WC}w2?CrIu\t%y*PL%=FTEŎmۋ<~Y/ʛR ~῟cE!>;Y%gݛo.yݜ€O'tqzm97:vF?C_Gdei]n-·}||EJWKL5mq)!~!kZH);6.|WG_+%YcE(BouU.E`k2$ipG^q$|/(ڶm]5o!w_VLYFى_>xx2nbSM1ZվCkڕӻ<AGL2Lsw2 pԛc|"xH7Z~X+مR<>h_lXfzzz70x#oˑl"Wѻny_ۏ\^C֬Ho]][0dE ɲioh wF"įzfF1V322bO,$٢EତǞ؀f7ikṊ$ \koL6u$I1T{v)KD)1pxc"+2mj/ @3nDIWV8/rp_;Y17jG1JM;њj,ȓss88o!O({ KCUF7kʎ}畹y`*[Jg*I|QG=ERa՗{"81CJ% 0=Qs`N:/z4K\CӴp8^]L]azz۽:%%)04xP/i6ݺwh/nMQsbOmmtZ lMi EZp@c}mdIBu`@|hi#z{11-b{ͱ!g:O]TWv0ۧ}ex/]&b@ ($ؓIw~~ {leTѱS'tva0zIP]]|R]h&'~뺎ݺe :cFFFv78Lf vRu-; ~5F eQ鱝}t0PJ8e5Oeu[1}M(񑸡c : p)'b*Kw5D$^e<%pSM,t{7K4Aj4pZzZF8ăTUER1fcFQ%FiUHP.\1'zȩ)ǹp%#WWshM1Dg3r%MIP[EIYPH驧}>7+:F.~b@\di1NN [~~/Dtz8%i&zԊ?"+Ƙe*kKRHMQh1α73 1bK?6;Ȩ1}?}H)6p ͙ބF(5)!&avx9GQ G4Yi ,y:rRM?][dAUUkTUE۷ FN&l6oYM-:ծWVdC}Njkkǫ+u:vH۵ 說UU%YRBHV4!_`3UU#F$YJ2kѮ 1I$*I$uAx>PIJt/IIMqڹh:L pIj`0X/! S[6o.Fc ٵh@`i URUU%>*7[ڷJ;b5&gϞY@$J+I% ^H]O'.9IjСdDBCX|ݝwR3l2d&V~7l>2zloB{Dx+ iH$K_Fzv Q4bOU%;[TMi^qII5 c%Mԉ=[UIP,˨+WQϳ$g-+I)7 x^F)%?$[PJc}$ץB$JE TRϖ"mZ+oIͧRaHaHiRp`֭yp|6- $IF%0$f8jD<\`kFu,?-=gg)<ۘUizD¡J#GOlX.99\xx}Eu}>x<0,[?κ0v[ B4OĒv~0!Dk=SDLtBhF"dHxzX;0BY?Yףtx<"qKoշ9m~nnꪪPi)NBc өgdP4%L10*\kUaA$a51a3=y|ݷ[6>w߾UU]pp((//Oڍ+nNZ8AughbQ. vBdMi=&ή7IEg@\ac"d[F,>{/͖ jven)0 FF x1WE7Tor?iX-|hp&޾zE#vX;#BHFmQmRST ZD/`kѮ׺Oc8M wz6͖_tpv{jIENDB`web2py-2.12.3.orig/applications/examples/static/css/0000775000000000000000000000000012564727256021051 5ustar rootrootweb2py-2.12.3.orig/applications/examples/static/css/artwork.css0000664000000000000000000000606212564727256023260 0ustar rootroot /*---------------------------------- ARTWORK E STICKERS -----------------------------------------*/ /*logo*/ .logosDow{ border-width: 1px; border-style: solid; border-color:#CCC; border-radius:3px; background-color:#FFF; -webkit-border-radius: 3px; -moz-border-radius:3px; margin:20px auto; background: -moz-linear-gradient(top, #fbfbfb, #f1f1f1) repeat-X; background: -webkit-gradient(linear, left top, left bottom, from(#fbfbfb), to(#f1f1f1)) repeat-X; -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#666, endColorstr=#FFFFFFFF)"; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#fbfbfb, endColorstr=#f1f1f1); border-width: 1px; border-style: solid; border-color:#CCC; border-radius:3px; background-color:#FFF; -webkit-border-radius: 3px; -moz-border-radius:3px; width:100%; padding:10px 10px 0 10px; padding-bottom:0 } .WH1{ height:190px; } .WH2{ height:90px; } .logosDow span{ margin:8px 15px; float:left; width:700px; height:20px; color:#555555; font:bold 18px/30px Arial,Helvetica,sans-serif; letter-spacing:-1px; } .box-A{ margin:10px; float:left; border-width: 1px; border-style: solid; border-color:#CCC; border-radius:3px; background-color:#FFF; -webkit-border-radius: 3px; -moz-border-radius:3px; width:250px; height:130px; } a.box-A span{ display:none; position:relative; top:-55px; left:-10px; width:235px; height:50px; background-image:url(../img/tipDownloads2.png); background-position:center; background-repeat:no-repeat; } a.box-A:hover span{ display:block; } .logoDow1{ background-image:url(../img/logo3Tones.png); background-repeat:no-repeat; background-position:-10px -155px; } .logoDow2{ background-image:url(../img/logo3Tones.png); background-repeat:no-repeat; background-position:-10px 0px; } .logoDow3{ background-image:url(../img/logo3Tones.png); background-repeat:no-repeat; background-position:-10px -312px; } /*fim logo*/ /*Stick*/ .stikImage{ float:left; width:100px; height:50px; margin-left:15px; background-repeat:no-repeat; background-position:center; } .stikimage1{ background-image:url(../img/Stickers1.png); background-position:center; } .stikimage2{ background-image:url(../img/Stickers2.png); background-position:center; } .stikimage3{ background-image:url(../img/Stickers3.png); background-position:center; } .stikimage4{ background-image:url(../img/Stickers8.png); background-position:center; } .stikimage5{ background-image:url(../img/Stickers5.png); background-position:center; } .stikimage6{ background-image:url(../img/Stickers6.png); background-position:center; } .stikimage7{ background-image:url(../img/Stickers7.png); background-position:center; } a.stikImage span{ display:none; position:relative; top:-50px; left:-50px; width:180px; height:50px; background-image:url(../img/tipDownloads.png); background-position:center; background-repeat:no-repeat; } a.stikImage:hover span{ display:block; } /*fim do Stick*/ /*------------------------------ FIM ARTWORK E STICKERS -----------------------------------------*/ web2py-2.12.3.orig/applications/examples/static/css/web2py.css0000664000000000000000000002054612564727256023002 0ustar rootroot/** these MUST stay **/ a {text-decoration:none; white-space:nowrap} a:hover {text-decoration:underline} a.button {text-decoration:none} h1,h2,h3,h4,h5,h6 {margin:0.5em 0 0.25em 0; display:block; font-family:Helvetica} h1 {font-size:4.00em} h2 {font-size:3.00em} h3 {font-size:2.00em} h4 {font-size:1.50em} h5 {font-size:1.25em} h6 {font-size:1.12em} th,label {font-weight:bold; white-space:nowrap;} td,th {text-align:left; padding:2px 5px 2px 5px} th {vertical-align:middle; border-right:1px solid white} td {vertical-align:top} form table tr td label {text-align:left} p,table,ol,ul {padding:0; margin: 0.75em 0} p {text-align:justify} ol, ul {list-style-position:outside; margin-left:2em} li {margin-bottom:0.5em} span,input,select,textarea,button,label,a {display:inline} img {border:0} blockquote,blockquote p,p blockquote { font-style:italic; margin:0.5em 30px 0.5em 30px; font-size:0.9em} i,em {font-style:italic} strong {font-weight:bold} small {font-size:0.8em} code {font-family:Courier} textarea {width:100%} video {width:400px} audio {width:200px} [type="text"], [type="password"], select { margin-right: 5px; width: 300px; } .hidden {display:none;visibility:visible} .right {float:right; text-align:right} .left {float:left; text-align:left} .center {width:100%; text-align:center; vertical-align:middle} /** end **/ /* Sticky footer begin */ .main { padding:20px 0 50px 0; } .footer,.push { height:6em; padding:1em 0; clear:both; } .footer-content {position:relative; bottom:-4em; width:100%} .auth_navbar { white-space:nowrap; } /* Sticky footer end */ .footer { border-top:1px #DEDEDE solid; } .header { /* background:; */ } fieldset {padding:16px; border-top:1px #DEDEDE solid} fieldset legend {text-transform:uppercase; font-weight:bold; padding:4px 16px 4px 16px; background:#f1f1f1} /* fix ie problem with menu */ td.w2p_fw {padding-bottom:1px} td.w2p_fl,td.w2p_fw,td.w2p_fc {vertical-align:top} td.w2p_fl {text-align:left} td.w2p_fl, td.w2p_fw {padding-right:7px} td.w2p_fl,td.w2p_fc {padding-top:4px} div.w2p_export_menu {margin:5px 0} div.w2p_export_menu a, div.w2p_wiki_tags a, div.w2p_cloud a {margin-left:5px; padding:2px 5px; background-color:#f1f1f1; border-radius:5px; -moz-border-radius:5px; -webkit-border-radius:5px;} /* tr#submit_record__row {border-top:1px solid #E5E5E5} */ #submit_record__row td {padding-top:.5em} /* Fix */ #auth_user_remember__row label {display:inline} #web2py_user_form td {vertical-align:top} /*********** web2py specific ***********/ div.flash { font-weight:bold; display:none; position:fixed; padding:10px; top:48px; right:250px; min-width:280px; opacity:0.95; margin:0px 0px 10px 10px; vertical-align:middle; cursor:pointer; color:#fff; background-color:#000; border:2px solid #fff; border-radius:8px; -o-border-radius: 8px; -moz-border-radius:8px; -webkit-border-radius:8px; background-image: -webkit-linear-gradient(top,#222,#000); background-image: -o-linear-gradient(top,#222,#000); background-image: -moz-linear-gradient(90deg, #222, #000); background-image: linear-gradient(top,#222,#000); background-repeat: repeat-x; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; z-index:2000; } div.flash #closeflash{color:inherit; float:right; margin-left:15px;} .ie-lte7 div.flash #closeflash {color:expression(this.parentNode.currentStyle['color']);float:none;position:absolute;right:4px;} div.flash:hover { opacity:0.25; } div.error_wrapper {display:block} div.error { width: 298px; background:red; border: 2px solid #d00; color:white; padding:5px; display:inline-block; background-image: -webkit-linear-gradient(left,#f00,#fdd); background-image: -o-linear-gradient(left,#f00,#fdd); background-image: -moz-linear-gradient(0deg, #f00, #fdd); background-image: linear-gradient(left,#f00,#fdd); background-repeat: repeat-y; } .topbar { padding:10px 0; width:100%; color:#959595; vertical-align:middle; padding:auto; background-image:-khtml-gradient(linear,left top,left bottom,from(#333333),to(#222222)); background-image:-moz-linear-gradient(top,#333333,#222222); background-image:-ms-linear-gradient(top,#333333,#222222); background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#333333),color-stop(100%,#222222)); background-image:-webkit-linear-gradient(top,#333333,#222222); background-image:-o-linear-gradient(top,#333333,#222222); background-image:linear-gradient(top,#333333,#222222); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333',endColorstr='#222222',GradientType=0); -webkit-box-shadow:0 1px 3px rgba(0,0,0,0.25),inset 0 -1px 0 rgba(0,0,0,0.1); -moz-box-shadow:0 1px 3px rgba(0,0,0,0.25),inset 0 -1px 0 rgba(0,0,0,0.1); box-shadow:0 1px 3px rgba(0,0,0,0.25),inset 0 -1px 0 rgba(0,0,0,0.1); } .topbar a { color:#e1e1e1; } #navbar {float:right; padding:5px; /* same as superfish */} .statusbar { background-color:#F5F5F5; margin-top:1em; margin-bottom:1em; padding:.5em 1em; border:1px solid #ddd; border-radius:5px; -moz-border-radius:5px; -webkit-border-radius:5px; } .breadcrumbs {float:left} .copyright {float:left} #poweredBy {float:right} /* #MEDIA QUERIES SECTION */ /* *Grid * * The default style for SQLFORM.grid even using jquery-iu or another ui framework * will look better with the declarations below * if needed to remove base.css consider keeping these following lines in some css file. */ /* .web2py_table {border:1px solid #ccc} */ .web2py_paginator {} .web2py_grid {width:100%} .web2py_grid table {width:100%} .web2py_grid tbody td {padding:2px 5px 2px 5px; vertical-align: middle;} .web2py_grid .web2py_form td {vertical-align: top;} .web2py_grid thead th,.web2py_grid tfoot td { background-color:#EAEAEA; padding:10px 5px 10px 5px; } .web2py_grid tr.odd {background-color:#F9F9F9} .web2py_grid tr:hover {background-color:#F5F5F5} /* .web2py_breadcrumbs a { line-height:20px; margin-right:5px; display:inline-block; padding:3px 5px 3px 5px; font-family:'lucida grande',tahoma,verdana,arial,sans-serif; color:#3C3C3D; text-shadow:1px 1px 0 #FFFFFF; white-space:nowrap; overflow:visible; cursor:pointer; background:#ECECEC; border:1px solid #CACACA; -webkit-border-radius:2px; -moz-border-radius:2px; -webkit-background-clip:padding-box; border-radius:2px; outline:none; position:relative; zoom:1; *display:inline; } */ .web2py_console form { width: 100%; display: inline; vertical-align: middle; margin: 0 0 0 5px; } .web2py_console form select { margin:0; } .web2py_search_actions { float:left; text-align:left; } .web2py_grid .row_buttons { min-height:25px; vertical-align:middle; } .web2py_grid .row_buttons a { margin:3px; } .web2py_search_actions { width:100%; } .web2py_grid .row_buttons a, .web2py_paginator ul li a, .web2py_search_actions a, .web2py_console input[type=submit], .web2py_console input[type=button], .web2py_console button { line-height:20px; margin-right:2px; display:inline-block; padding:3px 5px 3px 5px; } .web2py_counter { margin-top:5px; margin-right:2px; width:35%; float:right; text-align:right; } /*Fix firefox problem*/ .web2py_table {clear:both; display:block} .web2py_paginator { padding:5px; text-align:right; background-color:#f2f2f2; } .web2py_paginator ul { list-style-type:none; margin:0px; padding:0px; } .web2py_paginator ul li { display:inline; } .web2py_paginator .current { font-weight:bold; } .web2py_breadcrumbs ul { list-style:none; margin-bottom:18px; } li.w2p_grid_breadcrumb_elem { display:inline-block; } .web2py_console form { vertical-align: middle; } .web2py_console input, .web2py_console select, .web2py_console a { margin: 2px; } .web2py_htmltable { width: 100%; overflow-x: auto; -ms-overflow-x:scroll; } #wiki_page_body { width: 600px; height: auto; min-height: 400px; } /* fix some IE problems */ .ie-lte7 .topbar .container {z-index:2} .ie-lte8 div.flash{ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#222222', endColorstr='#000000', GradientType=0 ); } .ie-lte8 div.flash:hover {filter:alpha(opacity=25);} .ie9 #w2p_query_panel {padding-bottom:2px} web2py-2.12.3.orig/applications/examples/static/css/calendar.css0000664000000000000000000000557512564727256023350 0ustar rootroot.calendar{z-index:99;position:relative;display:none;background:#fff;border:2px solid #000;font-size:11px;color:#000;cursor:default;font-family:Arial,Helvetica,sans-serif; border-radius: 10px; -moz-border-radius: 10px; -webkit-border-radius: 10px; }.calendar table{margin:0px;font-size:11px;color:#000;cursor:default;font-family:tahoma,verdana,sans-serif;}.calendar .button{text-align:center;padding:1px;color:#fff;background:#000;}.calendar .nav{background:#000;color:#fff}.calendar thead .title{font-weight:bold;padding:1px;background:#000;color:#fff;text-align:center;}.calendar thead .name{padding:2px;text-align:center;background:#bbb;}.calendar thead .weekend{color:#f00;}.calendar thead .hilite {background-color:#666;}.calendar thead .active{padding:2px 0 0 2px;background-color:#c4c0b8;}.calendar tbody .day{width:2em;text-align:right;padding:2px 4px 2px 2px;}.calendar tbody .day.othermonth{color:#aaa;}.calendar tbody .day.othermonth.oweekend{color:#faa;}.calendar table .wn{padding:2px 3px 2px 2px;background:#bbb;}.calendar tbody .rowhilite td{background:#ddd;}.calendar tbody td.hilite{background:#bbb;}.calendar tbody td.active{background:#bbb;}.calendar tbody td.selected{font-weight:bold;background:#ddd;}.calendar tbody td.weekend{color:#f00;}.calendar tbody td.today{font-weight:bold;color:#00f;}.calendar tbody .disabled{color:#999;}.calendar tbody .emptycell{visibility:hidden;}.calendar tbody .emptyrow{display:none;}.calendar tfoot .ttip{background:#bbb;padding:1px;background:#000;color:#fff;text-align:center;}.calendar tfoot .hilite{background:#ddd;}.calendar tfoot .active{}.calendar .combo{position:absolute;display:none;width:4em;top:0;left:0;cursor:default;background:#e4e0d8;padding:1px;z-index:100;}.calendar .combo .label,.calendar .combo .label-IEfix{text-align:center;padding:1px;}.calendar .combo .label-IEfix{width:4em;}.calendar .combo .active{background:#c4c0b8;}.calendar .combo .hilite{background:#048;color:#fea;}.calendar td.time{padding:1px 0;text-align:center;background-color:#bbb;}.calendar td.time .hour,.calendar td.time .minute,.calendar td.time .ampm{padding:0 3px 0 4px;font-weight:bold;}.calendar td.time .ampm{text-align:center;}.calendar td.time .colon{padding:0 2px 0 3px;font-weight:bold;}.calendar td.time span.hilite{}.calendar td.time span.active{border-color:#f00;background-color:#000;color:#0f0;}.hour,.minute{font-size:2em;} #CP_hourcont{z-index:99;padding:0;position:absolute;border:1px dashed #666;background-color:#eee;display:none;}#CP_minutecont{z-index:99;background-color:#ddd;padding:1px;position:absolute;width:45px;display:none;}.floatleft{float:left;}.CP_hour{z-index:99;padding:1px;font-family:Arial,Helvetica,sans-serif;font-size:9px;white-space:nowrap;cursor:pointer;width:35px;}.CP_minute{z-index:99;padding:1px;font-family:Arial,Helvetica,sans-serif;font-size:9px;white-space:nowrap;cursor:pointer;width:auto;}.CP_over{background-color:#fff;z-index:99} web2py-2.12.3.orig/applications/examples/static/css/examples.css0000664000000000000000000000100412564727256023374 0ustar rootroot@import url(http://fonts.googleapis.com/css?family=Economica); @@import url(http://fonts.googleapis.com/css?family=Belleza); body { font-family: Arial, Helvetica; } a, a:visited, a:hover, h1,h2,h3,h4,h5 {color: #658883} a.btn-danger, a.btn-warning, a.btn-success {color:white} h1,h2,h3,h4,h5 { font-family: "Economica", Arial, Helevtica; } body { background: url('../images/stripes.png') repeat-x; } #header { margin-top: 40px; } .btn-180 { width: 180px; } .page-header { border-bottom: 0; } web2py-2.12.3.orig/applications/examples/static/css/bootstrap-responsive.min.css0000664000000000000000000004071012564727256026557 0ustar rootroot/*! * Bootstrap Responsive v2.3.2 * * Copyright 2013 Twitter, Inc * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world by @mdo and @fat. */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} web2py-2.12.3.orig/applications/examples/static/css/web2py_bootstrap.css0000664000000000000000000001740312564727256025075 0ustar rootroot/*============================================================= CUSTOM RULES ==============================================================*/ body{height:auto;} /* to avoid vertical scroll bar */ a{} a:visited{} a:hover{} a:focus{} a:active{} h1{} h2{} h3{} h4{} h5{} h6{} div.flash.flash-center{left:25%;right:25%;} div.flash.flash-top,div.flash.flash-top:hover{ position:relative; display:block; margin:0; padding:1em; top:0; left:0; width:100%; text-align:center; text-shadow:0 1px 0 rgba(255, 255, 255, 0.5); color:#865100; background:#feea9a; border:1px solid; border-top:0px; border-left:0px; border-right:0px; border-radius:0; opacity:1; } #header{margin-top:60px;} .mastheader h1 { margin-bottom:9px; font-size:81px; font-weight:bold; letter-spacing:-1px; line-height:1; font-size:54px; } .mastheader small { font-size:20px; font-weight:300; } /* auth navbar - primitive style */ .auth_navbar,.auth_navbar a{color:inherit;} .navbar-inner {-webkit-border-radius:0;-moz-border-radius:0;border-radius:0} .ie-lte7 .auth_navbar,.auth_navbar a{color:expression(this.parentNode.currentStyle['color']); /* ie7 doesn't support inherit */} .auth_navbar a{white-space:nowrap;} /* to avoid the nav split on more lines */ .auth_navbar a:hover{color:white;text-decoration:none;} ul#navbar>.auth_navbar{ display:inline-block; padding:5px; } /* form errors message box customization */ div.error_wrapper{margin-bottom:9px;} div.error_wrapper .error{ border-radius: 4px; -o-border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; } /* below rules are only for formstyle = bootstrap trying to make errors look like bootstrap ones */ div.controls .error_wrapper{ display:inline-block; margin-bottom:0; vertical-align:middle; } div.controls .error{ min-width:5px; background:inherit; color:#B94A48; border:none; padding:0; margin:0; /*display:inline;*/ /* uncommenting this, the animation effect is lost */ } div.controls .help-inline{color:#3A87AD;} div.controls .error_wrapper +.help-inline {margin-left:-99999px;} div.controls select +.error_wrapper {margin-left:5px;} .ie-lte7 div.error{color:#fff;} /* beautify brand */ .navbar {margin-bottom:0} .navbar-inverse .brand{color:#c6cecc;} .navbar-inverse .brand b{display:inline-block;margin-top:-1px;} .navbar-inverse .brand b>span{font-size:22px;color:white} .navbar-inverse .brand:hover b>span{color:white} /* beautify web2py link in navbar */ span.highlighted{color:#d8d800;} .open span.highlighted{color:#ffff00;} /*============================================================= OVERRIDING WEB2PY.CSS RULES ==============================================================*/ /* reset to default */ a{white-space:normal;} li{margin-bottom:0;} textarea,button{display:block;} /*reset ul padding */ ul#navbar{padding:0;} /* label aligned to related input */ td.w2p_fl,td.w2p_fc {padding:0;} #web2py_user_form td{vertical-align:middle;} /*============================================================= OVERRIDING BOOTSTRAP.CSS RULES ==============================================================*/ /* because web2py handles this via js */ textarea { width:90%} .hidden{visibility:visible;} /* right folder for bootstrap black images/icons */ [class^="icon-"],[class*=" icon-"]{ background-image:url("../images/glyphicons-halflings.png") } /* right folder for bootstrap white images/icons */ .icon-white, .nav-tabs > .active > a > [class^="icon-"], .nav-tabs > .active > a > [class*=" icon-"], .nav-pills > .active > a > [class^="icon-"], .nav-pills > .active > a > [class*=" icon-"], .nav-list > .active > a > [class^="icon-"], .nav-list > .active > a > [class*=" icon-"], .navbar-inverse .nav > .active > a > [class^="icon-"], .navbar-inverse .nav > .active > a > [class*=" icon-"], .dropdown-menu > li > a:hover > [class^="icon-"], .dropdown-menu > li > a:hover > [class*=" icon-"], .dropdown-menu > .active > a > [class^="icon-"], .dropdown-menu > .active > a > [class*=" icon-"] { background-image:url("../images/glyphicons-halflings-white.png"); } /* bootstrap has a label as input's wrapper while web2py has a div */ div>input[type="radio"],div>input[type="checkbox"]{margin:0;} /* bootstrap has button instead of input */ input[type="button"], input[type="submit"]{margin-right:8px;} /* web2py radio widget adjustment */ .generic-widget input[type='radio'] {margin:-1px 0 0 0; vertical-align: middle;} .generic-widget input[type='radio'] + label {display:inline-block; margin:0 0 0 6px; vertical-align: middle;} /*============================================================= RULES FOR SOLVING CONFLICTS BETWEEN WEB2PY.CSS AND BOOTSTRAP.CSS ==============================================================*/ /*when formstyle=table3cols*/ tr#auth_user_remember__row>td.w2p_fw>div{padding-bottom:8px;} td.w2p_fw div>label{vertical-align:middle;} td.w2p_fc {padding-bottom:5px;} /*when formstyle=divs*/ div#auth_user_remember__row{margin-top:4px;} div#auth_user_remember__row>.w2p_fl{display:none;} div#auth_user_remember__row>.w2p_fw{min-height:39px;} div.w2p_fw,div.w2p_fc{ display:inline-block; vertical-align:middle; margin-bottom:0; } div.w2p_fc{ padding-left:5px; margin-top:-8px; } /*when formstyle=ul*/ form>ul{ list-style:none; margin:0; } li#auth_user_remember__row{margin-top:4px;} li#auth_user_remember__row>.w2p_fl{display:none;} li#auth_user_remember__row>.w2p_fw{min-height:39px;} /*when formstyle=bootstrap*/ #auth_user_remember__row label.checkbox{display:block;} span.inline-help{display:inline-block;} input[type="text"].input-xlarge,input[type="password"].input-xlarge{width:270px;} /*when recaptcha is used*/ #recaptcha{min-height:30px;display:inline-block;margin-bottom:0;line-height:30px;vertical-align:middle;} td>#recaptcha{margin-bottom:6px;} div>#recaptcha{margin-bottom:9px;} div.control-group.error{ width:auto; background:transparent; border:0; color:inherit; padding:0; background-repeat:repeat; } /*============================================================= OTHER RULES ==============================================================*/ /* Massimo Di Pierro fixed alignment in forms with list:string */ form table tr{margin-bottom:9px;} td.w2p_fw ul{margin-left:0px;} /* web2py_console in grid and smartgrid */ .hidden{visibility:visible;} .web2py_console input{ display: inline-block; margin-bottom: 0; vertical-align: middle; } .web2py_console input[type="submit"], .web2py_console input[type="button"], .web2py_console button{ padding-top:4px; padding-bottom:4px; margin:3px 0 0 2px; } .web2py_console a, .web2py_console select, .web2py_console input { margin:3px 0 0 2px; } .web2py_grid form table{width:auto;} /* auth_user_remember checkbox extrapadding in IE fix */ .ie-lte9 input#auth_user_remember.checkbox {padding-left:0;} div.controls .error { width: auto; } /*============================================================= MEDIA QUERIES ==============================================================*/ @media only screen and (max-width:979px){ body{padding-top:0px;} #navbar{/*top:5px;*/} div.flash{right:5px;} .dropdown-menu ul{visibility:visible;} } @media only screen and (max-width:479px){ body{ padding-left:10px; padding-right:10px; } .navbar-fixed-top,.navbar-fixed-bottom { margin-left:-10px; margin-right:-10px; } input[type="text"],input[type="password"],select{ width:95%; } } @media (max-width: 767px) { .navbar { margin-right: -20px; margin-left: -20px; } } web2py-2.12.3.orig/applications/examples/static/css/bootstrap.min.css0000664000000000000000000031702612564727256024373 0ustar rootroot/*! * Bootstrap v2.3.2 * * Copyright 2013 Twitter, Inc * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world by @mdo and @fat. */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} web2py-2.12.3.orig/applications/examples/static/css/web2py_bootstrap_nojs.css0000664000000000000000000000760612564727256026132 0ustar rootroot/*============================================================= BOOTSTRAP DROPDOWN MENU ==============================================================*/ .dropdown-menu ul{ left:100%; position:absolute; top:0; visibility:hidden; margin-top:-1px; } .dropdown-menu li:hover ul{visibility:visible;} .navbar .dropdown-menu ul:before{ border-bottom:7px solid transparent; border-left:none; border-right:7px solid rgba(0, 0, 0, 0.2); border-top:7px solid transparent; left:-7px; top:5px; } .nav > li.dropdown > a:after { border-left: 4px solid transparent; border-right: 4px solid transparent; border-top: 4px solid #000000; content: ""; display: inline-block; height: 0; opacity: 0.7; vertical-align: top; width: 0; margin-left: 2px; margin-top: 8px; border-bottom-color: #FFFFFF; border-top-color: #FFFFFF; } .dropdown-menu span{display:inline-block;} ul.dropdown-menu li.dropdown > a:after { border-left: 4px solid #000; border-right: 4px solid transparent; border-bottom: 4px solid transparent; border-top: 4px solid transparent; content: ""; display: inline-block; height: 0; opacity: 0.7; vertical-align: top; width: 0; margin-left: 8px; margin-top: 6px; } ul.nav li.dropdown:hover ul.dropdown-menu { display: block; } .open >.dropdown-menu ul{display:block;} /* fix menu issue when BS2.0.4 is applied */ /*============================================================= BOOTSTRAP SUBMIT BUTTON ==============================================================*/ input[type='submit']:not(.btn) { display: inline-block; padding: 4px 14px; margin-bottom: 0; font-size: 14px; line-height: 20px; color: #333; text-align: center; text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); vertical-align: middle; cursor: pointer; background-color: whiteSmoke; background-image: -webkit-gradient(linear,0 0,0 100%,from(white),to(#E6E6E6)); background-image: -webkit-linear-gradient(top,white,#E6E6E6); background-image: -o-linear-gradient(top,white,#E6E6E6); background-image: linear-gradient(to bottom,white,#E6E6E6); background-image: -moz-linear-gradient(top,white,#E6E6E6); background-repeat: repeat-x; border: 1px solid #BBB; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); border-bottom-color: #A2A2A2; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0); filter: progid:dximagetransform.microsoft.gradient(enabled=false); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05); -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05); } input[type='submit']:not(.btn):hover { color: #333; text-decoration: none; background-color: #E6E6E6; background-position: 0 -15px; -webkit-transition: background-position .1s linear; -moz-transition: background-position .1s linear; -o-transition: background-position .1s linear; transition: background-position .1s linear; } input[type='submit']:not(.btn).active, input[type='submit']:not(.btn):active { background-color: #E6E6E6; background-color: #D9D9D9 9; background-image: none; outline: 0; -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05); -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05); box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05); } /*============================================================= OTHER ==============================================================*/ .ie-lte8 .navbar-fixed-top {position:static;} web2py-2.12.3.orig/applications/examples/static/artwork.tar.gz0000664000000000000000000713675412564727256023130 0ustar rootrootLp%=& nvn33333gN읹ظQRIԣLUI'}'W[KzWYY22"@,, lL@ \Xw/@@dlcAGE?VȀ?fcaǟ?şjr]XXs{. =噑ROC4{G+w׀nߩIf57:|:ty㙕 UqRYlZ\N6J׉b:ӯe y ?%⦥Kx'pO +ՙݿt}."J?G?R93{g"9t^SR :ݢ< 5T8h8@"C4&UH3Z5Z~bI'r#4 K*Lr]*AwdMxHG!8: ,!Gdh":'.lzeM* s*|qkߖ\NT~T?-lx#sxhwGFS+9lbӵxuoI*4Bݱ"^,Ov,b e4OLWiiL`?X ;Dsnu[MH൑@ V2/(E\\2pC4 1D y\X۾h!kYGm#0a~M~?\VŞ/A? <α}!X)B:0"}9&Ԉ !,x8avH¸Zum끵м;(MMal0wܰM{A};Iz@{Jpg)#y)j@;cb{n0FcN$QR!"~ގ)8y_ hoCo;|#g*$aHPD7R H[44(FoV݌6dtSLwNFc4(ḴzZl0?`sӦU1+OI{MW8{. "t[ !(ѸHNwaET'3jƹ([nc^dQya3O-LOa_>Rpav+:?.dV*7&ݼ3 ?KީL{eeL}NVfwuϽ:YjfB9$ |ٿ"XD mw\4xfOyzB؀:[f޽k0r0ϼ>mޖ }ذ?'׷Vklk@sxk~>pOzh]i 6?}$ OAk'{n'CdO;@;ݣ=T&rTAd[j>P6{\h^`ިxwno"GNUe0A&Bv$6/x,8d@*Ql&ͥoU.윝jW)&IOܝ:B2n~5}WmڭS8p`S:zXf:n;(MǕWQ3&aIg `ii-׃ZjpM涀R Zl Zlm /n쇜wP&oIXS:-?}wPYWF}#{14pWӎ_^f㍙b/re*ky8SsJcȟiES6|sSy/7lWS KqGZ3/Oak>Zbڵ_4)f0ƸާNNP28;7Y5>7N͋{dWs/OBBLf)4X!IKq X{k+-jB^iQw<)}c:]C\^^ʭOnn$9RN%*s0z{T2uV:Mehs@;z9^(U:P,3^5אa‹#;)&fgvqrܲƛ=ZV S4\3 ^v[}<XP -oS4reXao: Mzulfwq]?7),qy*+7e$.v՜]wϣc(?1ad`JVbx%#i^U1"s<4J=cx kӛLvRx9#UPHS݃7=$'MCs?΄\Į>c͔Id,{*9 Vs Pתx۳!QkE#e 7{w!g׀D3z fMT,E2Vs)-kJZ_ 9bB^{h^u 78UUhKMihKhĕ#^xTeYd{J%_%qWQ8ĸdklm*.3W&c8Ow?ckGwf&wYTy!-pqT.+Sb8vxvTx؋J`{yǨWJuw~!Ǩ 7k $j,,+feFm{en}^N1PU@WW|"]trmʀ,WY0_<R3ӔVmgߙ[hɒ9jȄ&1>,gz/ '32cj˖'Čr] A-4[ST##\<򳀷m. é-8[%:p^}S7o;snV] ĩt%whѶXddsPz9΂F-:,joA(Ԁr 1"u8hv9WwǢ^r9غmDnL]ό-.e髵ԫ FAӢ(rvOC6AUqS $WuJ;]݁S] bվ"`s;wFTm"Ft{ `79[6mڐb"Gc%ٙ&o/z>T/yyATz)rп3J`jQd"x9Jy+e:Ɔ!c4-IXsҗO9L[hW"mJV1`ړev `ptH"wYo(lZ+ʊ|qkIj{j?μ;; [a]ȋPO&Յ]"zx$r!Z QgjeUrjXK4o :6t̷w/IƎDZ`ˤ:X*jx 泀R?-?3qOo1/@(NY,m7WX/1yӞ֚QM"8h!&f$E1i6l3j׍bz/-"hTv6oȟ_$kfCX6m|7/u2:vٴ5ۜX"':;MJEbVU}1#M8J&uo]u4Hg@7uO9,$y?ytt."AH;~hVÕl2ŷKT"61W4|,bТ]*qvD2"zzρ,) .\F~:70yhe!b\kbK_]En5e dШ[Jޥ8!Wk\Wٴp{TSwag@ϡv֦(A]45V^bE~: q21Q恷AmSGSq!F/~*l8#Io:WTr畉j6e )m~{*_ 4- 瞁쇲G2PlA)r򿞥2]YE 3¯FU d8 6䨗*r`6PʲJ(s$:SXeJi.he^6"{Qd1Yea8t.P:vpq W  A M4lOGgX:F#f}'j)xY^hFb$38s?Q|#Xa?7l{dh-@N?{|4d[K;FֵXse}?|6Jv\Lڴ3GccܗҶ<4~\p{^yڤ֛y>ͩ[knCtjбdu2v\/j\ou<.$q'l^wr߼[m?׋[eՉw'sSKdOkYu-n*99~9}{CՇCf\IRíphP\7]\̏)i){hDmOPӯzZ]ZfRv`/znB;6771<]\y`ON6?rIoxXspmdX{\ڄjs<κ*k&-C󂧽 &#+ 2`8r[u qjkeeQ[) |Vkjw0Hi*l+O u*-m(?.+wT&W꜊ީtxV<0)hWlj(2[67O2& ērJǟdj.uӂm9CW! r)nm-6,)0rg2z9\q(ol7qHՌw( G9)'+ d+ J_[}E%Ȗ͝U´(ώwظ=$Vߟ99:Gi lZ2uo½uwAx'O Gˀg4K|{i_i XAr?&DRx ]MQs1_uO[7k UZ牘 1myXGșߜxk]2촶쫹'Kt DiɆ'H13T p1M\(ɲzGlb,2"Ŵ߀={ꎯ?{xsFL<ΜdIq_OS#FZi<{sx@fl|֋uN:/^@t?na vJ>A1w$/^kw>B{hԺor#j8.]P\#!s=Eg8kæ9Cmxeg &-5]+wt0jwcq>_KWx_D*4N\g3n'U=mq$FG+yExMD`/A'G6@TjZM/ĉi3ZX( +[`u=nn.HR/tkeM{yn}Fm5ZіO+ ד??ukqssX+GS-id9V,wM O}?.W?|dGI}*7qtjoy!^,'Lzo>k~o>efV{9 vU|5'-vsnwCiWX]W=rJC^WڗsӞND# AďMď&ځ+xށyW r`c'v<6poW/iWm׿Pw=ހP<˲ko78#o@;;v[/ ?ZN䎶wն$7`hiPet]hV-ZQzHjֽa#۴bd}DnNDdU%{*E~3ݳc.zt%Kmi-#so}cUCkfez@DF1'rعW kgĚy{h>><&.iFH>DvaM?ȥn 6 />.|y)=ɍU#i(l<3d8t@7dJ9̧XZ3滑Srݽc=դ$ʵ+~yݾ-yEy)-zse藼f[yfqw5$w^k(ǩE4&a/_ QUҹ6o%]e׶Ad? =rcaf>cQ3h< ?7L1jQRΘ:V1SLS^r2[A/drQzLIv~%R`@Qd:fJ;qIn-;v4i;{jX*A=jL 1naI`oYJ_`tʥqUV}}gݘyCc.ZQ{/szeOv1Zآ9ymf#<8zC _1'ko5#td;gi(\vKYYlo='.\A]bN061I* m~s|~>zyJ2Mr{A&F)eQ dSxDIgmKeA׺ gyc+t~`:Z rv>V`6$~}ajrTxqpr"/>->e3󘦿8Ue{mWK]a[6sXyazٟ~aYyV1V]_M0}*u1lfDaΨ՗UؙeȱîvqNcXMV4YSu&`9;ze1|dFIϺOmzu uh: o; @WPq[rz]i]A˦w rWևxgڧպ5Ի;T*e ^ZqJzNf/k[Zkk&Vj13l 1 `';v[:_a+wb-9o065*ؗ윑6V'4=;͇ou`8x"IhB+37a1bל#^4mћ Z]`^>E ܣr$uǁ_0 H'׃=8B0%*m? |dlxۑYo浺ݫwzgoAv;L߂r(2 b9w̬A.ND~1-lSWg-cojG<Q/ݘϳ7c= o0{7-WA_T3LzB+>p׾SؑNFYw _j~=d}R3.rKTOz: l#j*k,FzIv2yd )9w"0 Itf+T (ބ,-$*XHJͱKÑ^⭴9f9#a1VkXR7*r/ -%{.ZIKJִ֚۷S$Ar,2>Le4T͎2R;g2B:+aMo+W4 aVֽtWK(Ԃ%I56D_K骟cVe϶"K!?^bz,ҋB_SPwUv2crO1V -g VH- 2L7v#ii*O>)gΙlR*rr ,Ƅ;d_sRo܈:,zᵨwD2jܯ&%ͽ@ L"h,X*:_hi48hWXH"1 -Ô1,EY-u@ck$}IN4?#j33 4UBsfyxߨ?n _`JaRъ{ \bLNѮHƞ=(7SP;h!3d\!(|OSsfR5S}\;J. eu`K nAíJQo% ǸW;~Q\g}<@B8u/{bxm^"ܺ]T8"I3qq9*B:zLuT*۹nʅL\EH*uJ?C"C$޶ 蛗HHtPJ`HcH&("9s@8-GP# K$7k*JP~+*ꪕTrA`U.s*mOavEE'9OGAЏ+?!$(ﰳ>OB^cm$DI%a7JVB1}xWʬkR]ԙsB# B`ar.L/$O3Mo,rL&1P{GC4im,>XfݿcwND!x1$ʿIEFovܻxIL2uVY f]Cu5i2zZy⌚oELr\IC-A߾2JlDU*?ȴH%, ®ڷ }? MTPbj@OVH⛊Ȭ­B#Hb)Ʃ%+SME(0%b "TXMë1fKDE)KӁƙF4PT6EЊ6EH$̦H%aڌ@,L#[z )J%h\ 0΍.(PTlP`Ηl!:#0k8`eS-^n}kEI$5". _|i)٦D:/d 7^R8ok&>MXZ$ߧCB(6XCɢ_l& IJ*_Gҩ7_[.E>g6R}/79Oޯ.LAP`u_{ظQX@ZQ\mDŽaA ߺ)ǫ"/Pr 8DH$%4'H$#0l,Ls~CC*7z0ftK (\Ce8R A:Ul։&(SR+hKHI8VR%ÃŒOICt"ʞThhO*{PBf"x@u5 i&*KhE rӞ 씟IUygVzXGЈ F@2(q*i<ٮdR:|ZAh,Ѡ 'a3'Ä)l~xScb9> fD bRDAUele%[)( _PcJ|UG@tԆ Z$ oRB=iX1 " "(.Xql.Ւ05Ή5")Dt8CfvLJG6T>3h*:P i$%uwnbL[5(&!z>YXCḍ/n!̸m/tSV I\47Pڇ EIa$_r;o͜М6fr/J *yUTDqPWj!a3{S< M@Y&MѼ rujtub9*,|J ɉ_ emzy+&tZQaȩSY>J!I. MIR9tޱ~.$eaL! = ; dZʃсDvLt ?*CYS$ ([$Ռ-z)PeׅhP=w EW@`rsUĻ+¡38x/J0Z)\7J>eR{"nCx#~Ath,~)? .^G yMYaRz A} Fg85uRܰ_i"im翂"GLPi5*pAEprKNy& ķA@-_hQ3]5YL@s5Ll)a }{-f#mf ާtRt}ظO#HnH`9sZ|z-՘6Si*c!($y)AA}֞9Â@1FƩnT#a8o"KȣI;NdL.PobƶiWŌK~ L\}pSm_.u,CU{VqF5h(̹}v6*)K6& (]|<~bפ1bѣgPlwȱ#6 /$p$TDHGW9.oMY"46mԔcŬa('K%mzH+MDkE5 ZG&m$ѕ p4 fNX)8~J#R$J{F$쟂yy)R3YWUhˤ:J & ~HZA&XEa)=QdP`9,m"-\`(7|Dv 1,9HMYaDݿ (arȲGhߌYh, Rt$pf.S! pZYʢ2I}odf0=NIC1KHo U%;$uGH)Ϭ=D)!Q~Q%#(:.~cб F`\iPfx~&)Ufa!(WF'քSrbRL( oہCQhB':9g!z  [>1/g2 va)B4F: :*)j4LG=Ru9D Nx%&e0X8[/biU(.F77:0ȱꛕB5+R+)OBUj ʢ2JR1ùVyHK"l*DK\G70<|a-88NĨ#D`vk<HFYeoa7Z?cKc򲈥S$qMGJN5b-#[&3ȻiBp]^2ӺoP^?u:43˲@?28V%`gзYW Q{P6P%lrM(c(.t)+ån‚>3XC6DS;E7Bb-(VC2`3K ԓ 6Wd70uiCǟ:-w2`yZf`EydSʈXQBQz̶.ƦRBĈj ɡ.ex"N  X yN?iөjEg TY#Nɖ*2l><) 25)s07zGK*J@/%Y!mQɶ SZ⏤ k6d~)]]/AV<Q_PaOs.y]Ʀz),t{1r qݘG1S}Tx&P.e ?XіO SEn,˜N침tzT~'߹onInzJ9d+%rбQ1ΞX x.U¾6yq8%_yp!;M7X['?oD{aoZ`7Xuӏ;i8x{rZ#V1oٯpȪdhMTd34v$).Nu) `5軕bnM.o\lP[q#Q"IIZH鄩gGWOײ[gq" ұY_1^[*K j[UA}+֦\u1/̅PY||1=1%&*?n>$Ėsء2B\#Y\ىi^g[ӫao߶q+u sFZEFzRV[1a/ cTn7.}8>{P~nC3܆՟:ZJ^%tctέR*32uG'.JtPբ>z:Nc&zX/pf~=f&ܝ.ܥkWI"EJc:D~ D^p?"=V1tfnI&FɶSm7:p%*-^Qwah$T&>;=5Vplz#bMQ&p-]/?ZM#Y, C7쁑֋|Ęu;dNLi;xj߬LѸ6 ZxmK* :‰_ц8IN)M-MK)-Bk 3|&v0=e/1괪s۪sXK="@?eoy)x, yFK]֙ cT'.1^G#p!#ujyU7'7['&)Ff^Dz{;C$w?@~M ߓPYpJW/ %M A6soF̾:,րW~s(%euVTU^ʒ?ro-;Jt|.x]rOqVPa5,z,b* z-s1֪:C~Of6YǨRoOb /P 834кL֨nyE>& Jh\45G͹df/1% K'3K~qlQwfn2J6:MS^P`rnIU&_';L!#rEi"[*KW*1'ƫX\'q~/U 1TGkpZeAt1e $+tX(zs,oQ>3B,\dp,7X~0o~{;$X84wA;oyQiqџЌ\端뿼6ࢌ۩%< qِ) =x]i!SE4بk,o 3er\Bf(XLVc 'hc`Qi>*p$}Bڿ1])uT2%k r zyUBA[d(Ӱu&#zimAžhS n0`Mxv簋ۍOER/8W"@Q)gzmErzP],->Wu{Ubk`F$ڵNeƝar |$,{~tN.PGl&X'g.*B%Ț'kdǕ?-Aϯ3g-gN?RƍW3)giPc9 x"ug77T൦}{sWwִR5R%~u^86{:nI,R$<] !_PeMp6b*?>HP*<ǸPRwV!͏ S!'DMHѽ?m]+ʅgz0nJ^?&\,>Ef~wJv,rˬIh"gqLW,sa{u )2C * 'JoqۙOydւ5nXEo-p5*JJD5V'P"\YhJ3ZC)ܖ_(7)V-ka2Hか,9?-h{1k)a}v9cQ.h\`==Nހ#9eS?!GI '܎`{|Kni/)@Y:2!c?;pʝ0_6/D=+TL2_Kl[r*Pe;qFTot R _3ƨu7'!-2b{r&T&DHn>o">k%opFtr\ͽ۷~LޠA>EgQNGO"wm/S@e}V6Uuuw-~v)~+ǣ NVlUl3oL6,q1HAuNߍg oL5|5VυݤV~%VTDpcK/Ç͖5swm6cxb1,࣑fYaGqq?W ?,u?_THb[Hk驶Wz,t-G82Eul|7ܔZB^UD8|Z[|^s1tkoul_JOPYY7^r>;q_x7l[s27r2ٱ 5l'g6|ڽeOf6 dUl)$s?ȴR=!qw냺ԙ|D6-A7ۗTᾥlZxE|.'\˜Sߛar"Fy)5.*llNrJvҒhK8ֻET7PU.\rQ^x[_XY˒Jc/$5Wqe2ixH=Fı{IԷZe<'K_H8SV@ϠH=Sbl &3cˢD<Ą nC|mmYdXy'1;9JTe6z V  ES ?<l\^ QK [oOS, >Hr ZWBAm9C XE?SZ%޺D/W,/ci3܉ɶ֩Cر77Tc~X K*Za% ('p&Lij YR%\IsV1R`բ)&s.[9M ϟ|Z=Oi{!}j5u/Tp7ⅅy%D[oiqʵ%8͗ܩ%VC[LEx*ڒm CoNyKS;LX'Kk0Q4 k)Vܣ͗YMZU=?+\B攻te {\|wZ#nc:OiWH=.A)"|s66Cy1&|;;=gK YtͿ-|Ax QC:w _Һ*k{ʗ)Էv8/W⢯~}[Qso;uIv#'oV+wS!9XQw vg':rmgGX;5j?4ko2e"生23P-b*:|tT!V5vV3 !V>zg-&--o|.˪/܌_ݍ}+ˎs%_GLs|6וQ†3+R<`+M_h}tꅀuH\ǩqIbg?Ťxd ɣuF^im:7ԟN^hO>D mp)Oߥbt`2{O3=XJ/!6]E\|y\olLѡ _UB_I^8|\7Tvw77>_x=ߵP=Q=|yӜL#(EXLdŐd?Y;^<`!Vah-ٞ\|q A#/>޵m/%_=Wi$;!^R9jmjŎ/{= ~.u0_1r+9:1E/ xQx̱~[vDϼMkB"qkeB̳+}+.ͷ rpu۾E{+y kR[$ M[EXk̕}wG{9b^kU~:yi >} |چ0A݁4Zd74Új,hf dR?K pBKIHkes>+| vYadX "Zm.bua3! d1I{R0%7&+9;K݇W+WYP:uXZI/0J7k3{{P?POx'P,m-?{#7={^s(aFr`Il}<cޥо4Ժ=T.d7Z^ٲ A˧kڗK+[/2x=a .K*&kY ѕUCdoA1Že|5̜OZ+e 0c \%*G!l]/?׋gޥ7~n@^\%f|_l@wyPw gJV7߱Y#-ZǠzU|J--cewvO Ns͓ VIՄ57tH3Y7 ha7oqg֢טWA.Kn 5تs[شx5\[SB3W׋Ok}LUURەeS^R6N̕M'f$,n=gLɃA,4E#NH_x}V}L'/^4`*z2%'W$K=\t__G]LPm!-n-'j E>yUdc D܏@g2z1yEDhzrtaZ\ ߟB00u%8w;s^g)ȖEӛc˥)w6Ǽ6uyf6Ç3farzb ?c]R>#*>"8=Bj[XfX"F?@%ص8^:c1(n< wv;uxb}x v%/8; e+>p { `wDtI;u2~< mLjr@αw<涻H^K鶌xѱR8mxdt 0(|'#yȶc: ij[>عfہz>q EZ~HxG|zVz5΁Rxl4 B+-">;py_g r7 g*;a!S6IküL,BX(&f$9_R6pb8yZ;dsHQuxB5P24[3ȡmi0ᮚ|p IQf#?4_tX>gޟܗ lhV/7u/p\8Qُ_ ~ՓDǑ3'*_>oCk{P;kAFJ*/1t1r6N9 xw$#f{ksqIǗQuM}9]B9Z 3)C{s *9ƚtp=!k8 ыV1̙db-z'l$вsKfg/寂 @wb%w^RJh"WKL:&oozM _R{B95.H"sLB֕ E?Ę^lR[2(Z@\D+URTφ[# i:[It?Rl*ZfdN%_X ]5:ald?֘*ט]0URz-̺zTuGL[g0yWkV%ԘsTT_A2oWLGiGm 9_5uRχ)$7l(ϴiqLCuc>,K8 `GrN !bÌEzRj2?|_ &dJPsZLD];ѯ'.k&"@1A}0]|j ,Zژ՟\-Gt}Z?̩x [&O,o]'M=)kTh8a`(kH[͏0L d.E#FNByyߛ%B! Ji@CēCE.6DJ$PDfh-YPjCJ)}o@ȹўO->q$0<ۃ8j^L-k(>CW=ء6 ]+|ESI۠#]?~KEc /yE ȠSTvf-h& P?0Ap_^?HV!:i#k~ [GIc[ qJR@h?/ʅf$9p | C:Y5'BT&]LR>2zXD_t*U͊!`#%aG5W-NE,L&YAa) űO^BC[A-tNMNyS9 M$:WFAi#WD+po@ xz7!%u`\*\Ȝ ͦwznrMڸFjfb X,Nw\'2iZ3H|+Ij&I8)HCҐZ'y^ s"Yo {rEꚉRk279Bo#(Ҁ2i7r Kxnw+(Y#P2ycB娶ДȢQGtJ|]iV0ya%sB6$ `V~3X8G(=L> G& S&%DmBw08 V9ЖKh9a_ Ae@WG̟?k JZ9$6RԩLi!Cq5Q++xJe5Lڣ3*[H WCj2C%$JI[/H&V@F gd"Hi!eDLrr&갴 m^8' $V5V$|ObJh3-fY_4qRdD>*, c# ^USkY-9fmJ?*ICmLjErE$rQDƊVp2ie$P':0J4c%}?,w ϔATpkƕ 0)y^eP(~|rks=_U@TRHL|W#iBAdPr'aJ[Bnz8dkܐB`[S=8JPlm{"Omĸ>@p?v8V?c*#RƓFJ_;F16$ ; Hko5BC( O:ؤ-! d܇$6POo @/Vn ’rƄ%,BalJ?J(x jT0$:_LXE"a5ya)b΄$@o,?ɝ9Ľae ;щV JzaH8ńb/51ݏyEQq=DeeeKVLB$QJӦͪ_ RAY\A&ьM0T:2*( 9T#uu``AN(z;<>-5()ǔPRzYQtn5k)4oyqJ9#LQ'crgQ}oNJM[ /.AW:s׃^7$,6YD6攕9,*"&!hIDSE~#=2ƙ;$) r-Vgqp@bq݇Jo&ZC>DZI=//OHa>t 'Z9'q+zHodMa N+IM;kҦM' v:@|r8P'uDKD+IH+"Œ5^!kdC:E4MB t:Dq {2`+"dx<[ Cp[c8_$q94sTEQq 3K< EEhٽTRd$ ?L8{5EI:DioQeRfϒD}HE'qKnOUa~$a3?v4fLze&c>/I߼MxˌED>@ڕ14\e) ~wJEƊ*qI_BfOwk/4w%R##o6 ,By+~dB~S )I1 gh Su~74 rhRy:Ñ! !6,?ZIH-w ^a_2<-/ToX_g@D4B$!yHՉLZ 5; YdrJkJ9s`L'>1 Le2dS@PӼU.jG12`RMheJA^si :5!`r6aԻ&!q1mΫVVwbl%'+#M! ԉ*(1b J1 j!@U"wQG:j5ly3c7*<5邼A@#[F&e^)"(!3snd*%WT` "ع #A4$5%Q%4$C0k`IX$UcTs` ^h?۽A$UߋxHtpM8sOH4JYV%<<6ׄSPd J-pF@QCDD$,n"jl%;! ?P=C'FT<Ϥi[}z,hݬ%BBl-$V{vNs?f/d6.NntrmE >E͘x<ۨc鴌'xE%8Դ0l(J\Йr*X̩`G0!DBeCEB`92&aZ}B;.Us$'T0Y'#p͎AO+ hc~2,)h[ |N0|D≊[(A5WI[zJJzR9e^Ϥ\NqN.f.??JKUvT&ML/yd|"|?U|;~МJ]3ﺞ⫽QxDĕ i,٦?뿭/ݿN_JgC:5b$oD\9^u/bIꡀ~1|uM!A*<f^7SGjhJo] 5ӌ_{AKTLܧdaEi>kaRӉC@4˰7D6ybE R |񻒹?}=#LGK$(%AT1ՐJ|5S~Quq$?ŅdN`^ҙJ Ã#g¹OeVݝsⱶA/\_09[PG;/ſNwkd8Or467:b3J:EN>nE3maYoazRj:+9S"xV4Z%Y=k|\]]ƄyH{ dtg=}Nwx%t4О༞~.s%_.կF_kwpM5oVpxƇ_7˯Sig'o6~W^Ѩo|_#q*)ܕ7H՟w91k/& ˁw< FglgF6oܧ)/W$_}s%n(Sa{)RE*G)udƘm9 N{eQٽs1cj#zmM )eIX`I1y.yٛ}ꑲBSKvm5ezհAs<>cMi IVHֵ5~dޡµ-Mm6[W:A"}]̔[xje[=bcֵ9B{J\P ůJj h%|!DtloR)Y{Zk d}Čļq.Yݘ1̀1udTOWGV9ݙ9>F~lq[1\zeF\E X G_|G4/){';7lE啱Dnउ3"69КzM/z؁_@} Yiyi ^1Ώ_Jn.^/0Ycύۙs3s z[?d|n7 Լr_e>~<#1)B7+ ӯ}s]P<-k?T=P9os{恿QB !wô"N2>.dA9鹑;hv}{Yqq(yYvFhat`ݨR=}ry{1ۡ5sX9qY_xox\l|O~־㭼TYrY]_W< ?ܫoroN ʈmI(lDI <B</<,op Ho^D` p$(2)Ne^mՀOg]ڧ'6xǗki]׫n.\b̎-^~ 1rr6G;X߉[a|k&(äB-\@g'7ra(ޣ8|፱ם-VCm`?_3Ze3ov<rLq쭼{clݷ|KNN1jv*9zCoo=07g>Y"5^0?q9)MfG ;lY3tzul`k5]V&=z䅾o mx}o9[+oܑT㿅)/irft:۹*m̊wlO{wF'7:{yf, =Wk| u~=e߱CX]l7S0 Z,g}9=)zye. G_'rF1aX/sȏzNVq44}e!UoaZwssHu[.(,6oq [7 M#bZ&} := p[}xHUm#`FA1æML֏GQ)%^P:v"оc,1Gb</,mk-񋘣UG5+<\ݴMAq_&wIčQZ&ߙJބ{=.}t]?tSk%DnX5 c=rO;9V~B Fl*?$v5/Zl'k# /J: ?t#=Swڿn+CS8DsŠ eju )=N.z\m5W:/;3"ȓimud3\ qGZ ]qYL$sйcW|"8f`Чi5s]^ "@cXBmX )yt]?ͫ۴}j:q'Nsy6vR˾X%xhfʷsɳS̪[d3tAg6}*S?6B/aFsSB+E~k~ Oxq*^cPӲc[MEWd+Cc)0b- M_Pђ1Zn6!U")w=SR墢~c݄)|躋g±OR<˯0GQQ/R­߶Dr9sLX%7ʻA y pO_VD'R`ehsWVsMB(j >źa`y=wٟu 5Ż.(ħiUݓWk gn^b$lNmZ:޼fv*N5?ϖ;m~!gK1NpZHש"W*ۑխwZߴZjB#Z PkVD'gdC?f@@AR`a~sC3 O\]NJ*N>O :>"/=ێ+BMŔlTŗ[A\槄{\W6dEKz$78Qi7$vOuB4hF0 {j6gOWf1ZbÎnCtS`2zQ C?T_}sYy塻P;[[de Y4[PSxhlvMYyQR۳~f-zz{ߙ.oԥ~ȱE)˞f=f u虞}ZxiBnbObZCkٽ6wtů74Nݛf;8.Ў\>u͎ G#d|y"b}|Ayogٝ ?"hEf!ºÂ~پ~uh443$i,&{Ǝ3|'>?2iMN6׸jiΏ1ir,@ `ɂ쉂S3 vΒY! S'QwR@ G/sXL?i U}T~Ihef5PvJtO ٳE1fN9[C{L/#/!dyʝ= {; FV.jSOCǶp6,i4'=*9k+5s6aQ=O( "A #"A b 9 IAI"9À$I"dqaC{={w?z>Uի{5i~ t9m0 N;d7@A3ۓ:4U8"T!POךlr:Vf 9h}Gu2;iU1_0!ȭDŽn!,aEpP['7µжh0)\" ]8^ @p9t(1-`ޏ xI*4&3yy ~TM ,vnv Mm3a˖J߻O;hCT@϶SӀaI 5\MBqkw/=h\ӑ6%YPQH#~A9v930uгMK2j*@Ur> ڢp/agx9:Ը9*451DLF1%R& >M1 6aPkT "bT-Aw,FoP}wZ\M1aρ||Fv ~V@{y2|+K@8[XTF '`Vӄل ,'ft{^Y@WBm|'p̌lSrUMQi,Lq>a ̗5TOaTK&pkz hdVoB 7f_&}@A)MMk` .*'\U;o'kH<'Vx48lFU4E`f =YM376о;r\{"MCRv|߱!bL/ bydR0:i}MoYf.Od^ߒ㠿I_\w tz*&xHc4<ЉpB,v3ҝo~-K0cߠ\[5C+w3TTJJxQcv{+|4^QzѾ^pqȂcϒo8+%hiK|ޛ;?]}tk[udt`(F!zRAIWE0G ɘB%S߂Ջ4-sRt| V?1|#CΕs( |¢ٙ|ܣdOM?2=}EWHj40zw.l#%{ %{ңzNP~J: S  w$,}cvwMH;ڋ~Fa\4|ѹRq$]^}7x:̸tyVѹGg6b9)qUf7X::WgrA`.)P~2C焑tL֓Ep<ŦPO&[S:xɪQзNct+Z"U7y9\k ܍'&V9=F9Y}q] Vς+s'<+'M,YO%g㬒oez>A y^$Kww[MWǿkd.,lףGߚ,=Õ6yxR7i4$7d0mf^|qmW5*"v3AKJ+ieW@҈hX~:th: -F jZR6bW;.#_hMp >N|) HzIy1ԓJ}͙WtJ/^.ytѓ7&1ٹѯ<YK#Lt̖ ][3tݧ#-GV{⵷xEߙ읐 0 G Wá|z.Xs%sHk,t i mIΡX%mAh2WHJ3}B +D;mNcؐ~0n FvL;29k Κ*Gִg!2ֆ*~h}.>;[ 3okf?ْ8yN]d^z!]h}#n{UM~_ʴq̀42.+^#gP0Γ|\椝f$\?i3]l I)pMz'gϦ6F\~/Rz,v[ #$ȑ@'ٗ0_(f)i -~FyyW8O`^o7Y$wZ!rfxt;O얏zZZp7ZT5(ݷ4s;pS]J{-l ذX*o͗6֞^)X4Z?.c5$6)1a% A}mQb{HdM#+t[$ uI<'s띛4@2_8YMLz!7 ""mqsKM[q9+rDb0&-$^}~Ojfg"}9s&W>;zdp)?0Uj_K_h8~:=aV~Uypf%.93t;G5녔6Y2[olѧڷ*n?x9.G8Rܯ-OcKR]l"GWUXy)9#+4۳*䋡 #sԙlwln8Nئk%:%Z \~>Əvlec]$k54kyp~{!!Dkr^˭7}K~rULNGNo\wك=MLPoA\¼:%K[= h+hOM]ޭ9X}MQnѮ{׫.s,%\Bݺ%̴+]^Jl^tdn1C^/*q#A yQ(8H#_kHxkpK )R.բˀ!rq ƻ$<_¥<0nEasq3od"͆*tatټ tɒf}G-I\$\ lUV^;6񥅀Qi&%@ubTu 5+=Nj9}GOŮi`2ӸK5',b/z֫U}$᝕'Q'.p'qOhgs!]JWu }B'&@xFIVFLiɽ>[>x j5l|$~ ]kg_Uý 52m Ć%[;cLQ[\@oGJwcY/v͐-o!W{cvnsސ0v͵8 $]$bGTXBi 4{i{j$xq zV?)O̷<ޔơ `ʍ¬&żõҏ@@s8O#~/:bȀ/)ǩі72F*U OUɽOav@kX$CQO.{j92 b=BQӧ=r:vah`G]ƶE7l~AMzX2 @5ѳɐguaVpscY<ӉgYR!{zޠeOy6(Kj8TSb<[cEߓKf=WwvoҔ91_PvM<ާT+eʘϥ(•)?/P? }g.a=lMՎ j|5TGO8>(P`''^;ьC/1Vq>ZgBƩ Kf峎&fCx> ({1%r}|AJ1=^Yg>]3<:/\ C\zkK2a2D}3@^Ef -;5[͍Emb2ۇ].اj(Zv{ߛ8nbaMh]+Fi|+ "'~hʛ;O]03nDRT>pȇ;Zd3ܶ9- ܳ!oX)|?kn>N§c¼3M X `?0V{ܚkg\bO^> ]!szyG59>D1]wٮyvB9m{}׃şYհR3wg'A%f{Hїaހa4Rr 8`lDbTzw3y #dd1-CGM뙭?D.RaS7KémE>1sfSŰ(%Eԇ؉.'Kq5@ rB!:].XV53pE&.9)&Nc[h&Ԣ· ۀKǎ1w)˅P-`oM*YM{\1$5_SlvO)bBXKNizP V5%XtUeh2mwwaуĤ(%@KΥ20^~dp($ l?2Vb^ K:=\Ԏݘ,> E^gm,~3Ugѽ@zuVz @e_h (B.Ǚ;Qq( ۖΎCl3 2c3m/s>e.0Mk].??; H;nHsBeA8!ƻ F<ݩKLcVq܀#x&Ddy(-H )!R*5gw|V[d޲j+࣯.cq+}*ۉU+ÀȞxfY6`рqYd5f@W؄ݯ;mԭ\{|ceؓpẁ?j:lKR}tqvӇ5_FscBo"2Y&JpmVm"pFοO `8\RI WLG>C2syHy[H Bkp-š9K - ]nd[IS^Ů10/oR|ҎTJ8؁TDc ϱjёhMȼMezjUtR&dk‰ZޔπMƜA;I{|`' 'qcn":^W7rIp3/!(⩜6"z{oz]:t2?ñE?yas\G+,ӹSsf{쿘B_̣HMTjoWN'j5'A"-E. 0`ʺnwFl0?z,״aۃfKRWX5m XsOm v >pY8?"17Lyj ̆ra=8oe Ako \ J,Ÿ s/jx1 ! s3?AOq  =R̡#tZUA {}sr ȝ\9HVh3,Կږw1<ٗqI.v\ȼΙEc81Vrlo{*guaj{\s s6B1Pe>†>r'(-rFt 6mbw>9bw-hc8ס7/;C\^N.kYo/c(\-䥁'5Pe$n^}ꠛPS%|,(cv)$IDtLbV#rA*[Gz]mǹwːӜģEO˫k"BvO ='.IPq6qNC93eANT /$OQ!a\RwSuðrZᨤz?㰉iE+QOt~NF#{aρ)$` 14d៛]=ӓDz/Mz5ZP4̃Ӭx693VuQN%؊#l%Jd+]*?)cY"k"tt-TYvE^ٜD/xrQn>S|)sZr@D+#(Ѭ{ B?I 1E#5+@1!L9 DZ%O A.沙ҏ!# lǡ$2S -ߑ_zeHV[A|TLբ_í4FZP*"CM/fZ-Uo,gW@$1VVnf:qlx;-D}J&'t1"Ih%=M52=}2C2YͿB7(~=3#Wާ,ܑKuvDBS.$t$""U5IW'^p9TKɍWFLOe/S}Z$?;l( _(Z*v=9Ё9%9aO"\KRBߝt+;wS MkEEcgdZI,_:w~$/i 8 >Jas*j?4h eRS*\(A?qKHx@bi${2Y)<峗^}Z$*NA[* *4!>lNYw+|Zv&!W1Ӯ: TsjB~ rOU=EP>ʇo9 _aI:KpMI p1FS3ɉT #fTT1Ɍ\J#N.͵VK2q{EPj{3KR-+3ϥ*I1OqbGLaX6|BcwMpzhT[G +K{SUSY@ ~v.-OB͎2^u:@#?ti|2ׁ2=Uo]=;ǔ?3@sAJBJ\\.2W{rqBL?Mtyc39P8@nMgl )]~OF EJP3OP͡JeFC{;49 <xb+,QW;-V!-rIA ;O@&Ն{;BVjw9&Ͼ*sߌ6d}pvDԗ/_q`떌Ե2^T HlEOs+NFDЀwKAoW_gx?Sz8=Tp$JH]pnӠ.̱`VWA_5;$T40}nd,o'U=Nm8{;€8CϨ#§1/;sJ1.eQKRFn]*MOu]j] u+ hɛ#l!=yYў&F9@| ' 4bkj;$nfī:qVߥ?Ha`tjy wWq6\9hR4Mƈ`JRVf^V_לZ;/殶Z|3Wj0w_WyoJTPt.,t$ƒb6 f%pgJ]!_%^KLX{Zm"٦۵hy[~xHY$ȵ[29k7/V3fD*+b`qql/>ErX,}%Qa셜FRbW0 4ݟ==ny-vJx-n#-[)ږN n 􈍫'hs䉃ˮg ]avr$uAp4YU zg>$nA_mUƐCdك{,=H% qߛ} s7k|e]N_%mb;ԜM^ e9#kPM]FWu&WvYĔL/'ܚ`nu"qe hģL+]'įdTꛎ~n5^p9Msoc75wz@}Sʟٳ739 B8?W,ONIy-}z_`_kLMD =~XkvHeC~U%GWP&h6 ϓ>cM) *ήZGk$ڊUDDWjI =Wr.^m}RoTþHIpd_ɝ~:wKi VپB-d^2vhu| % ' "ʌ>Jzˍ9햡]qRV>ѫ_6=(?qO摌~quHBȶˡB=ޢ:9Y#zˑEdݳþQgiQ' HmpϗE"XtCAFNȅ)JiYrX햱tyW Ymv\i-Ӣ(֖Ch[ThъraZR~ vuMhWHU-1kq4lJ?cv- JՄ^pJnN}Q-SȫَN++w ø~{jީ e|4#y%*D]_}pܰ[K"=+9ɠQ*aC(Gx*9pyr`ΐNx:%lwa!`M&߆dO̪|!u1c1{>̟IpqrֽSVUaD}!XL)xUFuHK}$L68{3lf70N kIʹ+shɆMX度) Dé4"k$z "{g ݒBU=}O֭|/lR2&jn ~HGnu^pA1/elc;ևeD*]V6AQZte&jV1q2ݨ^=9>AYZ_ES RV;kɏ? ڮ4 09Yc￟mlS74OCٽ&K> Q4&]蚗5E QR&u|l>{i,?/ CGd(9p_軽{FrC˧[_x~7PucCu'$,fxp\/P앷Hz)n0LWRcq"ɑIֳ?BUj !oyX_fT"6ܿ_י gnY640z(\G/{SaJ{?6 ܾb$@eOΎm=g=Ħ=о? a1R ndԪ{ΜTu̟Wn0rH!5`fA֣`K]o2~kX{=4$@7صd=-5q`/qFGR gb/\&:?-; F7c*["w$e Qޏ$cc|۫' )ykYy2±SprLd"L2ODňqYDNU)R{n~ޝq=pRKx(趛KE:(+-ȸY"]+qv'+-2霹$:=SJ̵Nz GК)Wb:meL[=,:+A)[8Hd]p'-%z U=6Af7d2}g" RQTZQ4wq'W~H)s+_t& 7B7` eW($ ?%>0e|JNp ^S2FO] 'j0~H<=~.T3ukYTgV7c<.V(?Ȓ_/: }X+~1L"f@lu/27xDR_,m0jr[ C@L2t:8)nj\s񁅘~]>0S񉖽w̼YZDBGͫG21剔KSSoz9bI>Āݨu+:i:DQy; ~үz?{o*0 itRi;n䝢 w+}dw^z*I=FL5-;[~1Y4pDrV97q-2Ya!q*qHp3򝟋!/V&DA4}e?wv:7(^{\Sk-ۡTLq@%0J|$RbA_~yboBbUjӀBsӦP6a6/cCq+5 2fjx_`_TɘvSaJ)W_ydD! ?bO@~l/|J'j NzB| ۩Ю5-zSiQO\Rp O]MmDL^lP|{<|9:ŵJ:{."[#BL QSsTusحDx剃JBPʱ%R:g{ ( $ *EʇLcPjV*Ֆn2G4M#){30lβ7,6$E9wE *A\~zzh s KǺ%uSGQ1aD4͜,NQag;TNvrgds;<{/Q͓ӏ~ J)3YFCk_g*mvg.ޕJ[?~la]m7zX<>%2׵T(sG* #B ӽn db #\{Eت* 0{S:h>a/gVP肸f9 ;W5$ &Mu$=%.GۙvnC!vYVk[QQίz!T"5Ǡv~C7k?O{ ڈ'?,fOe1Gs9{T[Xo=hIbؾ/|tZC)ĿdXpj2##&pN.ig |h/jW#* haWȣZ򒆩*l]/nsj$/m"~*zm` zIA g(q'TRBw< rM nw]eEO!UTOQ1ؐrƮim wŷuw9*1}]#scߞ; Ϛԏ(P_‹,]RHZU17rc溉ؾ|zRv&۷qy d3}!a۔[ܥ(ΪEo~R(NɥHZš|b0QfN@_W=#Qbek 9Z.ߕ3b(`3x aR% e[.$~qh8Jƽ΢9ڝ=J*Eܫrߗ|kf{= ik1&j*r;3vnA Wbep+4(x޶A8~t[7Y'ͱQ D%-?W#X^UxwE:Q{KD5(J3t򽠨tq̽҆ ϯ[>iߊc%!xE{-HҌ C%gsz̋&6;H^:@)gIpoI}팉hQGbĩ Ty#7$:1R$8gvJmf1( L6C+w =ުO_Aɡ{q'WXKJkٕTE‡G ,]ll~2` J-׵\5 _7^Ď&Ƌ|y_a$CHSwWpK2(-(v8TmM[5UR "7L+)2.3rqE$SW0&glRiȯEiբ")6lu7,['UWlJ{f=$P=l`WQ.ͥ'>KO? PDC~؀3uoE,E!*&#w^;\!EuS=x 15 q'+O Luփɜ[,A(Uq^m j? 09gŦ9mnBq= '\[w] wmd)Z)rh =u2&h=RD;\f?&WP+#A1odtKkPW084 Pv%bWCXtJ \+Id f ,AqZ.$k nՂ?겘;:=fGuۓ~7IS  dRMMΨ[t 6&^Pf҈ZKABYNnP g$hUћ]:sI07ՔF D}䧀1h5+V*aN_:MΝ󣐦V,N ͚W{JH||CJ}⾧p}#ެm ;ɩ4!w2{;V7kjSy'xzzbҸA`fM8(F}oH%[ƾkHcLſeƴg&w) p$ Hq];Fd!N?m_w)j|S AIW(d?%5JL龷vEtzNc; i.:b u6?kaT>zuq={^+s4;Vt4RčWK+{7|]ɣv2a<1MF;ӅͳS, ߿ gOiG4,CCoÆz1 L"E 5냯P>mzwvwxzMPG˕^ŊdOdbIUs7TA^y:6YjoԹ|^}FrUʟ7Ͼp^t@*| yҕW܍}KKW =RiZkM,o1{61+-5b>.P ,u52m x?ʔGِd)INWq}IMH]9Jq음pic5(50Fxl֕6{<}H<=EBCv$dndHs?nJ`^k-=O)ݷiG_pB +,>Uʆ4q䄟A]M.ȭ%ndz־9Z&"ŊSoͺe==.s$QuY DMq$K7z|55D/ZYzpnG6\A<7ѺAIlJFiM)8,3X*B%xen+'<݌i1CyHn4N +[=-T\_ԯ%wV$(05Ru;m'3+WpJAo`:Av>_oVN| -WFpV;|~ggs[\Ń"-Dͧ߃0Q\W6K>YKHVRT^f>Lfu0ڽ{빱Fn߉ Ro+o1 \RR%-w2WNq"ZÃYn2s!BB#5 'T@|soz6Y&+zՏ*oK'e<ժ]EGƧ6]$h[N̝(s5mH#?R {]3ǠgU d b^$71s%#<9 \8^Yn |59 4)#W/Vi* 7 J6恭ӉmjwV Q6ci| tda'B3;"s"ھZCu~?X+YU,D`ju1K!3ݥ~+]]Wr;?xd6atȧ33iFtq1LPL4}V`{0SCGu.>棄R'ɞ?DDzEt"-UzՖµG7z6y>~}X򉣿e[gcyG8^~~qŧj2F_g/k%;n&to))&<3'}gk(, ();9[L y^s Q1#ҷ oލx@.Xy߭/~Lr udD1;0 RAI$[;A _]y7knoWjA3 / b/E}2HWD]WԠxӂn'ۣ`l;S$XɓVcKkԃ Q~|Uhy8x\!fk*W,?也Cjƹg`^%<;‹Iwd>Zm<.{utc~ F@˰8υUvHir h[8r!r:E:%zFH-FwG=QR.RlIc)9a15&ր.O; ݕ.kG*v}|$ ՘mc$6kSS +A+E/oI39&f:dC+u_:,UL7Fc˨|Gf* `D̠t :h-H-Wso'xaC N%5>īnP"TZAurɠVȀJ&ry!˗o9)! /KJa^c4bU3#30MvE&cڗXpA +qMLo0^ړ7H\EM~556),eqc8k*NJ4 @Tg qtP%tܚX: 8Po`k G J.,NQ]:[ ,ȶ 4#cR j-NdPx*io~vv#,@;VCUEB+ $%? o~?͋7B)<f$*: :)4B?N/,Jo_1Ұ|o#$Dr\X_S QodAɎ|胃4/N kD 5+3 a#̓4J^;//8Ia==\ߒ68rF$cV. })0<%z|Ul6 kGOxlN \!/Z9b:AASd_4\.t[ WÏ{_4Tac!|H@^'yq~>>*i@%ءﰀIf1W('y.Wr&BkTQ>w E9֪'.xMC;xc#*l3Uh-*TO(p+*/0 8E jO[&X'b@͊c!g^h.'Snό!ס#t.SlP}Y>qKutx{8V5 FcXv5L>@0[lHH0 7T'Bw@-ckvtK7c*Rhbh 67dqɕ lPf#/'{|=(ΐ<ĭeY9G3\&[\{(1$᰻aV9`noz/dG0f!&J:5rDWe6/gOO3-rٟ۵9 8ՍŠsQO7ډJW(m"+7ӡ@CҎQf,݇U;l+>7gyH"GDG#z7-S!EDghk)||'qD uɋu`u05!g'Zf[`-zf3*ܵhRGZ<`v}G#8~BKs&{dE+ލH9q,ʭy 侃q8uﶅ[ITgO!'tӎ&ϯx/T+GMWK(}˓,آEV]7n`HaװgCF#i4!LgUjX.6N5ML qwew6?SOB:daw6NsS WFY,f6q wd  I8r%-L z|'as)|V&= *tL!IK|i!0\t$76`1ϔ{طwS|O#C[0c.!q%ެZnwreVU]Cqȃ: @xexx*ҕ'L~Xol&!_| ş@ALx-m3|fHPw($,@Kw>rd;j&!TwZKΉ _ZgDgW5xs`lzrcliGU³k`Hb6DJVm]r! å۝-YEz~`Ec";EE8 (soNM@coٿYZ)$B< fvJ@*٦d3) d&Dh<xj3 $A9MòmĕFy_Ze,zA4j;#Zz p" 'FÂ7a,xa/&8'>Lp6F[-A-4|JB+ O ?HNXd!B2GH*ȍ@6/xD&!D_ ^=|ҪWI8Nʻ({e]`҃DjHeUf-8* NGgS9tm 6#Zt%iJ"i76e; g6SUIđNC^"5ҧN ,Tv>[ůk$Dܤg[4t"Gl) A;dXT<5)M5vL; t5R6nUEf{pW ȿ M_<{~R!""bFoZleo=,WqkQ|Bk xL? \35r@fWL݇[$.*6켦&;tb}L\3,-<4~5@Ctz [p\Ut]1i¿)*oVP&dE1-4nwzFKNMp_K#_LE~$|Ck/ga_/gM ~13 @Ө1<%2*{(-8?Ap 4e"G}/4AZ~9ʎ$l CAIc>setVۆuh)`'{Au8S\1$zGci $4t7*s,)d;5A@W{&.qbRf/7A@a3{hf-Ϋl>%G-"8| -!>~ ?Fל3yV@PY3SxLSFW5KΧGܦ@OD$\]u tlT-_.xWxMV6D3W]q6pڥ#7tͷJ~gDH[neTBMVXYʟZkb~\E12h{:WE7|!h?LEH˓KVǠ>U|(<!~Ť8e(Ќ8:w$BB)$Z4ߡ\T^̛EA^)OTlP*V yB5;d^) f=Wf[FT3U\KFMeNQ5;k-SM<%Fgڭ&Eo߇hz$WI$>0OwC?v#pAeAj;@ip$r*uX|( \d\,C %Z=H?PV?0s&Hd5rAE/ ؉1# k ˧4pF<Pu=ē d~j!{ Y/$Wq7JkL|~[8n{"m8DA2ŚL1(vbOses6Ju]d4P[fIcRiDf %'#ց6w.#_m|fgZqi0uPL iA/%剧fTC׻?Ŵ4f!0`JRg!26;nBgS[~$Wy~¸TxvOl$mvn H1Gǒ ͵c۔|y{{U)|g>Hdzc*X/>μ#+ꡈ;>?} D]*štfa7d,HO.5׵~3NG!:̖mnmoHW͸7KӁ TV 2OcXbHSdjɲฯߪ)=w%hC~ ltD8ٯ 7}1:g?B__fg\6w@0>PZ33x*$gJ(M ڿƨo?/0Zj],I(>^kUFy 1Zc}D,]=/NQwJ4ޙ/7IۢwQO*AfXaq [ M)qkmW%7Li GBN$c]*#gl墨v2Rq%Qm|<k*v{M]޳z&'t1{7}]ׁ5IZg\Q=ff5y+jnxLծ|W,{c{5&1yi9Mvk=jy3t@Ou ŭɋGP"y8ڷJ=4"J uҞ_a5?U;6 iC$wCt;S*~QNqtha /@ȝR]\%h~״MFpt$L k?qF"?:7$`hoMPzV֤Svm.I B3BBħba|{[Bo٥gOF&#|t4 r`&m%.|wq{ߢmf )v48!eҰ笞g8|e@!n Bԝ#ra$Wp܃0 BT  fCx( d 5Kr[;`;! d# S{:݇u*K-2Ly!J'g  X,Bk\_Ҭ,ɥ?|J躨|E<rKHCLD>,hm~j1A4Yj`t;nH'd5 S?K|[aWr,rKțי#!2|mJp;s å[T_ldmPФ7OY7CҞ+t^y8MsClDwP;իa_2pR1o|'cЅϽp^AZ%ކI '_!N=¿F=eQX4[CsN(؉nuR,@guo12obLy,JŠ49~STbccVcd9U ޑ'c1N<=jX'T̝ܼz28@O ! >mr0uQ"t0?6a#(]9I!4.y,z i"I:ZfptvDPQ4tE^hI}'V}bR ,ث;gY"H H4lo 9'3^.n0}|2YVTAH׃IFK^5E .TBzC\ui|)))F%&w"ȯ~k=h@.t=}Wmyk`O2<%JOMPΆ4f lXzU==B |Is4ҏ1#$=)a|M>V3p{ET=RMt:RyG.h6/=x4Q|Jgz^ҪِDլÜYy.~49>YX7E ? F-98!n ES%ݹE\.-6uI9irR3 jrԁ8;c4OE~ω7]%Eۃ#/G{%`meɽ39 ɀԱ/ \ tdάPϿb4CvLlcM@n/S{?z=1Svi nW.j7\Sǎ:|I2WuǮtZwa+tG:]la1:"T%|ރY6h;b1.k0G8)RDlWE$X%8RJhytpBAxIԅ鎤cDcrxmzK ؐs `KION }5yV:;X lfmyγO=eד͊!j"!*d*oǁwٜ Z)=Y{vHǘ3oZiJ (;[o{xQ\J9inpݡ%`v;8䲧{fj=Fc3qoo4}*"mfzĚ֫exE"ȼg!ޮp-3bٶ`n7 o]ʨx wȒcS%_'x/I]du,e r9j$mD@Ѻ8$~zk `Qin;gQDæC ^ћEmTCP8>(uճ{|aF+UxFwQ9󮨪`ZwhT,x$ޅ^PqsjU3KB{)8їũs:Gr6]dUуu/~=I9v}έ6FY>ń^ lu DTn22>`4U`P.8Of/ LP2X/gOn&F?9l6s< ہ6CF,̓./kI~9jʾS߇'-8a&eQгH jLn+l&4ji3lAK/hm0a,=[6ӶY沺G)A(gT WDJ2i R$Ho8Τ(r^Y^Kg UndmBC\w HԦ]BDN툆h,Lxedeψ/R>RoyJa& %AoݪJny 慏8ʸ"{6WHhqCoj6de#Rm A?nk˖qkWn J tp4)݂.G ޡIXƊ"K\@tˇ״;3K`]qolk}j$)=r)=f jjD14띐a]aP1إܘQƇ6ugh3F r g8w[}+,;xU 8|N1J qdgt=KYeG$Ԩ`'U}_j[ISBjzYWg=-UrWbi]AޓGFW[YR.x.]aO f!kC/D'tjxcCO&,!zd9b>^oLÌL*#_&9w*~Iyo_ + d f9&q Ea̐yXh%)#oCu]*sUF#,?. V{Z2-]>ր.yZ@^NXI̷Z.4iUWAYբѯ;YLS(~GIX-AU]究 #K/-el>urjS(QJ܈vK9sL$:U:n-Xb$zeGu+*XJPI؆iՈ㩣%F[4!V<(1~^;vjdKꮬ7aߦ.ywB N h:ߖ̘H|b]DxEim;t p X׾Z~S /6<%5mB%!2&QA+D*J~f˒m2QQnEa\V;{G?[&#ͪx{'=sa}d滭u;ys<|&)+wqel/+ɶt Ӊlk&1fl0=]EG} FLYIq*\`8vLX:^I9n2@Ntˠ< e} J1aC4P:M(O=q.|Ƿ:Z]], ُv*hj+4-A" P.xj^to}v:~]WTPYKW } "WyUhTP/T/ L)+R$2v50b4!m=R{"cvdjФ3Q;y@\B_3:x740P0^Q3=`zw3/myA*?}:EcfzqCxk1>i7I_+ڼ(߿dV*j"}~,m̿g .Ng߰Q@G\gG4Acnt$?NMDܻ}Fۚ KЂ:`6JR*ם-Gl=FGo!GrkSu%ۿ(xSQu-h%ÉH~CnPMjCtцWڥwf b4 0̤ #~1BxI;:#oF4ЏHK/]?sz U̗CdCfM`ᶧ ëΨGhD2yvn?Y$xaVB`b7G7$WkPg)?Kr0)^KO@bLu\f8nrf/FzgR?E5|gڕr"?DmR *wP6iI\;xRKӯ,p@]km{wAmvv'J՜>#wiLh{LO9Rps p}85x\4\ttF󊚆eUI,1b im|a;2Klw ir2&(&w`EN= *HFn}v>w#]R53e|k 0鐆U IE1&c1nSD[Ċw%pGC̓V W6kԪhm9hקI aVtJ9`KTȓ]{"tM0׍z i &֮fE0/L **Q zw'rnf,ٜ [b+bwH,f (L#aT jKaK0FD0_Ԥ_܁A?ީc$)iHdkڍ1-f[-:uODaRn!u(VcO(-֛Iߢk3}xN[5F7nz`N*[?/ ha36 ­Ob/Ry@\Z{M%LSGjke=ɪU{Hq8á[o" g#/sWlp< ՛$3:DYAtVUь*34^]df<{+K2lM[X8Ҏtp{C)lf^$9}N i7 _uWDGҌf/qލBj263&c=݋'[Y?$kYdxZs U?nwof\KثnYpƎ2oXH0/C9GAvBVKMҊl|@1| OYs:xͿS[Ajn4M ճ{}+qy9ooE]ѼٙTS΍v*ţa8|ު StGqBaǘt]'j8:Pz o[XKG HB+σ$1C>m]HFԻ6q11z;RďSEO8[q=H3Ǡ/3#35 §w'6/TI,.G}/)#Vѭ1)[eiFPRb=-sydʠKX/KRc7(^]v&\qH-jQr!ahX&YHUeyҌˏQeTsbC1MM(@<4fx^6DJ&qhԽ#<A{)r- orab_]/i]w8>SOh0~k4/f]O -Էo>s.)/rE_]e6 dV|K% W!}٢P'w[/s"oK ' N]0< :$m;n[fosmz(Q!ҳ~@vϞΚlWgɭi -)-#ygWjqv+9g?g  ZOReh## W H&ai "ד=Lc1ofy)N Q4/W]%`}uW CTeCY0[=Nb1GSIX=?ou&*IaZm6y_!;=h/u54EPŒw*j |N5 L_ةt@_1x|y/+KE#EI} F&SZc.>*Pw)P{Gw_ spuwtvjQb.w =5y;0uruP/Q?Pc'S ҫ8Y ,~gM1M%i9y1yE)Y%Ye%ŋb&v>b`qbg<yt Õ FHFJ*ގv>PoS(Mkx;C]ab&rj%S-c*#+JAFEz)WPQRQK?4/<}~ }3*NPow;uw;gG־?JaKqڃA {=dكA {=dكA {=dكA {=dكA {=dكA {=_NG`qqzK-&&1&=+XV,d;^5?ibIp]] ӏ?,WuÏ_79z]oI%WV rWQbl ]F:;'N! B~+ .i7 xD'տ`Q0m vMNذ wu}_1QW+al"`YˤI\vOES f}K'6Z/jDcE_O >Kp[#OR@ƟS)ӗ/ r srbڻ2Xl`9Ǝ܊ʅǥO&>GW+\|`r+葂bIfg╟M=o( /?3|/^uY[/{^{6E9D 4Ìܐ.T$y8iW^=#lSI"Jz/+jFO۲xO$vVTf` [#?5l*Lo P*rtfUtfga.`[HFΟg[w&tr=Cp_|Dˬ]㣁 A+i65b֦ņtWZG~a:&ݹou \*t7fbM3"685&Qv5/L]M⏛j&pKci?hG1}_ZZ 44k_wXchI7IQ}$8eښhjeMpIhiw]9v =..}9w}YiUPP`+j1k|x>]ykgs5Wn|b`+i&qمoiS#SQ",~fO"z@kC-?W}<]!sәy H|wfӕpS8~bqq:=J<^hAKpz]uV7OE|jċl57ĤΓjJw9?#Dߣy7 A0Vo' J qyX#iꊜoSe8riw6E~fyѧdVKU Iq6jȫx:hP,( tw&!6s_TH6gAB:XmrOpK=E1Aj3oXp'MT R@CmOn}$z|{*VNLG5i_v邝w1 PnY;C}mƵuAoBV|+$sxIjZZpBr9[rzR CݟoUSs̱<21^C_)4C-0 ÉߚWV [_$|j kY+},L)66uy*~ja1VCv(4"͘a 3$9=)4ʋa2N;Tz6cVTԇ 3 m!Ed1hE_fX%>?X𑼟Y_ټ4{yd&^'#[XicnK7ߣhy_uQu(TZ1`~;Ov~[ PkoL@LB٦1aݓ>6m2/n<;_A1_9ӎ4[8W,_j_\Br'9W5~ưHKo{l]ឳ?\C_/5 ۱,qoGg5"vZ*df2?PqO ot~5J\0QOu x135ϼZ2\Fj]0G9:B5S+Bp"1=:O}PC4fh?OpǸ,;t(dZ.䛧gNࠨoJVgUD@hoW~Eqim\<ǒ4E=x ,yYGTQdԨ1jϪ}UYk j< fn\jm4-#r8-z> X<*r>k3/ms:*j4%{\4"DBŀ~0}3w V} $;台,T-} ۇ,U qc!J5.~{G<ׯUKxQe⧺Ll7|-Ckp/LrVl}fKM9北>i\a,a+q~5f/̭k2ۇ"]"1JIn1:[DG4 =z?:Dl1Bޱ!imݬ kin8} ~~t}aOb?󇝧gxdPPWe(ũ}k]oɑFZv#9K\o[Vw?@ɞd^  ~BRZC։Z FxܜQ 'Y=u.,RB)cDѳN(8uVu-OuLޘ"kyV܂PL@6LPiWEfSgӝ!9%hz%R^*]yٕrEH;<3w}(r@D\oeN7=l/OJoEo Owc9 ץ^?u)Rܰ_W%l$(Zd$%{&Z:oKjVjRD0EGYh{!^XV3Ҝ:7(hn 3jɚvھJAEçD+OM^I!˵!\}>_1"x_YN3F9hS ?41[J2.fg) $E:gݰ'`JA䀾W\tȤ#emQmG8;= pe͢oc:UX/~l-c+FCm&@izAn쾁]&M.:0m =d:^+voWL,\vMš8ue#Ih(OM=#HSU`[s!3g2!uyo9ik52M2t!2QauZHS;šov Baɜz))p5 5#(~|?t?ˤ]迾p'0&ά3GR @w3 S.]IxvZL^ܿ!|#¯t_ԎmF^wVa%j&k ?6.G+LYwSjbbbBDdڠw;;)Rf^NOuB¸ h=4.uA *{+ktAۜse^ZQ2Vҹ ⇺kD7 C68uߺ}r۔ wP3Da%NVsZM%#xlUZ21NW"njK1щxPyf <K*@=2ʄ'k5:!2k6^2>Mq&M # Y$(ܫ@.E(U乭sylf<V鈴CEqхH%gsl-_!S=7ϱ IKR>מZ+qA}c}=~P[W+2` J}8^҇BRgsQf)IkMb@aӘW ڍ& į6jܪw|k_4:~wLNJW6OP⛿<@A J>cG9|"1>n>"kZ/p՗ h/fYfF@c ']×˼bk>eni ES)sV3]g3qBw4Ւ'NFy'a9b¼cY+vԅIn^]6?͉Պ|k_E'%l C/H4Z"N0lQ@_Hk;C:S 7xL]?[_':x򽿷,PSQgDF``*A>^GOo-`ʼYu<fX*U5ݘƻϪ6eyݘYl%򹲺fDP2KO/OuVC r].6))7$F)E < u+&N̉{Nm-@]!n墏#/W--_WE9:{RE#tJa {g XZh/$/me½>mA͚sL" L/_yH}`g!U7Mn&Z\5GγkBqֹd+`d9xoƈg(e ?uxLQc)Ƭ4ejftK"ɐ/`TtOfg- 9 \LsR{TݾGAhACm{x#^rfopڋmġp*L|E# _2@ߤt_xڨag `k⼹.A^)ZKadD*Ma'kzh_*ξ1^ VՖ;`+|=+ИϠ:ʮ.E&0zzݲvEߥI<:Iq%kpWIyXCѝ5pǬ=;;84K".%YyK54g}D/Ђ/QߑPֆɊdlW6c VMipxt!5740K튪jMoY1$CQ)~eVF?#`<zz~"_ޚ۪K~BkVZ aA9JsOIկIBc"t+9jn`|w~ީmݬ cM;E,ӭNuL|vk 0G~ ֫.Lxm=ơ6`Mr\XTKMg~ZwQZ_3P΋YPEokژpuc%Hj&ߝq'>mcg>>7OHe yeef CrwPxԙ"7G|KMD>\rTTi+L$X4+EQdFq=?ko,cysuײ%$W,lIm[fbꏎ>WEMIZo\hÙWW[fOgSAd⢾ʽj dL~='M :~pz OPL 7ͲWͺ>wȋ c2_ lJ&Qs.j+c$X8+ug0v_A gIlNKҮ׳\mc!?i] p",եfGxxiha3bPt.H}U@x_-f(}]w/' NIU|4h`gsϏKrOB:4A9}>g]dO54 Շ{?;[e3TwC 28mLS 59 ")*g*4E$l9IOV5*%d$_. eJ[W.A?MX,&kV.+DN:1\E {t*uYI?Ⱦ͑O8}5_PJbm])S)}SA:Lnٌ?Ȇ5.o*OL+.lA&']9 3ѻ}gὐ $#c$R27U# L^^?QX?%斞B\wez~x?dc{yP{~|7,w}oJZO|CB#Q(܂ hhS S'*95[\/R~.թ{s?82ư ?mǘHvuNX~sCwAUǑَ˛ |Уآgک%E4&fY5lrGѲo=ڊI5﫰X(BDC(ľ@;\S;io[nk<7^0'_߉w9OԚL"9|ZϠ`|u3NרhQS&s @7.w8=# 56j/W {V1q?yȆI]-S-zpLr:ְdȣ s̻1/?ʡ\@]|97ac1eŸ:UaKm2:ʏƚs)r8dV)ˍ+˷[:>+i񯵀2oqq{GUqZ?4J9 V\ToݑI˲HFTxgt ~,Z6^5_Uo#>8й =uCeuOZg_mx6_ʚoQ席P<"=L:"wۤaw3nhv0t/W{;Xcn]CaeH$YrekKS̹/yN>Y͙*v#kaNi|Mc ݘد^u_aO ,!T72"?h?L,e6 shJ+*2n 8r ygv_Ax+/ϵJ/YKjʅ:x^[ۏ=)ײMv%̣9FDFp:rF9S:Sa- _ k̄r<3 1 #m%Qѣr{ZRNџJG|sqa;x1(X< {=Z ɀlu~ښrrp=}T`-wabND=nk,ßܰqc\/e1TkZHsxSw޵P]\ssӽTCYiO t+!{3)k}> f s9w+[,,M@yY$<**ޤV0VM4#w;yE%";|7Yi)U9$/RT͍ױYGCgA"l옎yàrUfIGM~W+Z*VFZ fFA$z/8OymN4wyD7oWO0/ܻ"px[];O|swK(yd0蓱!пsW[WgiV|Rk48\<&%_$gxuw-Qd`opgV\CpU;|.`N첞ɮ/t9F+J|}9{>kϕP^ehʸ.Re^4r'pqΚ~ZϜYn%<\oʊJu]١_ZZB.-+=G uMolй`֪{7\:k\97>m9W'')F/bI`nN7Wu2oV ^h9´着c~1nR_l}' { ["|a;Gtnj[ 7=3a6t)s sEX%1_pHgk ]W?B]^ޝK*yMk;{enHګ ,K؜18ٻ)vYvC"N[#و'dm0BK}h vqsku i X%g F_ӽ{_jn#,&Lʓ6^1!E/*N1бRlEj( ߉UAPSm*Ic{}Arԃ9ZE7dS\4͂6`MgnX*"(v7[5ϥШ6_P5N7;kjbmkmk;̢-  GN7ZB W*_9Ffrƥ9Ob͢'%3MhS=_#DB V8̶VEt[>KZ<+D6,ZEW셝ձN?ɒ53Ll\YX`TNkoγe{Ia7h^\9c #ge@2;Aj; "2]Z֩ΤT~ Reg h;JY@y3~8. $2 ރD @㮎U5eÎH y-8ijD_= +T#Yٕwʸ򻳬-Xт_j?xpx#K/]VEU;(F@C( 6ד|gqb$eBwp'B]pN$w"KS=9jpf8cB\Hw5/Bv7nݡ۲0"zH͓wZ>eQ~ȩDPcʘ'9@ێ0KJ{aiбzdR"NBq*'YlmbgњMA!guz |4ٽ@8|R&؆#K7%/"[hmC&)W"NN?wEp!Q!n ̷۹YLZOɸ~&%C&O`33OÙ:;; WܜN߳Jx&c>jecG\*47L'|ڭW7h)=5wRkɆȜ9RgE$S<}!mξ`yl1_s&B\i~JmqtiArwsŻA*YJ7Vlw,]W}G<U>]a lX P͋_`gL*g˾?y.yom{EKFQ.op2Mɇ˫; }7րO5Jj^On̮BĴꛓF#R^Lj?Ojgy#JhaFr7ۿ"+?UsInI'K[FcFKso~ wr^W>s)<]F%V`7UlN@bēAoNzӍhii' l71ukMK~|| 5kG_$8~2yEE@ ½FdIhLQ,We:߭UL"DC#>}ccyp@~_$: Ըf+lMmS/Ӣ+8_e;=0WsnMm> bzмQhjǜ#fezcՏk;-FEK4) xHVsr}ͱZ*۷a\{N'=H9CȈIEu>׋/1/_|C$&׸UqἼݸۊ+3i *3k)eGF,Y+kz2Af6īT6??^^U1i`_8wŷ^16L19wns\MvKW5@//FWĿhcЩׇ>1|d/'{Ghqj&ni0Z7]OFht^1Rޫ"z7^>36VJ2ED l ~fu7i}n=$5aJB!jsnFmDg@D8w%]$NyZ^' 5I";cO1*Yh9y йg֓:nG?TȸiTiha@nv[^G3t΍F w.:kȃ47Mvćgd>  -;u=c7nsVwmm5{dcD]Q^v%&717:cqOqӜ,&5l-oV/31t.!PMEȱYCmjY!@$,L_SQG5=Eŧ#}&1~_#ߟʿ{kgiDI%#V] C;ɛ5 tQ [Gj;8)pk\h`o}Xo^t׊u8ﭏرL=ʃ*&J9r- +,J(g?E'ؘ&kߥtN8:qhuv…*؇0+s'o/K %Z9 WtOgA÷Hy"!zDuL6P| =e׾H]J^wU b/O=LC{/~T _"Ujn΁5??SW*_[.E!#vi #FFHƄH쇂Q.Ƀ2MVIGh}r1@Qsm^=x[J7G3&|Q;0*^Ez[y'Rsq {_Wp@#K0Ǵ!N-c /r㴲{v qjrS EܱnNjbQcWhPq'^ڠ3/$c> ZFܝz%ŏ 5ǬypMTnЬ2Lc|e1\_ٛ,Runv&#5 U6G(A>+ձ1w4M QWla1J,%-g@;GK2z~gF&n9VYc3eLiEG@Dux[`w4l?Qƀ] L.דi5WssYk+ϋEvmצփ;fqη~|:ﳐbOfʴ*wǟXL[[_Y@Y"_5lQ|,!71{VwN,X‚ee?FDشBAjY;"Crrő ٟaʷ◳ַ=$7RrZ:P>W\wX{k!瓍N8zyXA/ˍ?fq݅<|s[N渠yu9ԶvsU1kT&m|,z6ބ:+h`"]xµc `B9!<6"%0s-ix.!67= Mg?feS ڱG q ߫%|7"[= 1-r07cv_=8hϩyVk l':5'5ϺN&>yo LNYA`EsY3cEs*J˥P |vJR wRъ#]ڞ࿏#➈ Mq7lF %/7u35F/C5)d>x=1X:Ej?WL-,^9]7>'͏ȢZ.1v_m%%;'BͿ|ZyL$*ptm,:r6rGk9ɒTE~`2mOaV1+\-- 'iH)k1;,z4P0S\O]|pa{+aWF=Y18}b=(~]JCgN~)v(<KЋcDZLS/l.8LkZ]{,ml)>v&'k '! >px%irE(ʴh 5U>+ϽG?VrL%|ލѼդQl}½H:ǩm{C g7B%:42ˌ%c{w݂6>{b~!b*H\0>jVR"I+q*GL&[$fUkWI ow_λXv'Xm汫Tk[B: ݋MddV[ ӺѶ}7VQ**Y[X-kisv=)joll^6m NDȻo%UN{W05q{ ), #a7**# r(_umh{#o`|wJc͇T&U,3 k?ihu_nG@~\s3" (*1 F{ebY 9A8+!lMTbBŪ"X/nQQr7$#Z!6u2EehK{!A,~\5_Jgq%yJOl-Mhwa#( /\Xdsn"š,͊`q.9ZԸ=#.ĒR"k9/h TZd Ъ}j҄1SH.mmC -/$ݾ񐖒vTn1I~N;] 0My۟<x(|R"eqdxԢʫ& vT]2q80Gpk7-g&TK.(S1 z͝8/#=ZA_AAGт'c--ͳkdGk=

    *Na/cwV]9; e%L ]Zeeܫ"uG1cmkmH0dFiy2[.j+10yVOCDեl㛻5ᇠ˓-+'uz)~* X7,h]SOdїNUᰀOk:}5Iv(ȁ %+QCS - fV`u:P'(]|)a|t_.SJšءk[^u֟1xf>$%=ӥ.Ù:eAG"1n$sg { 4VG\Sԣ?`'(^͐ 1.|FLg;!Q# 3;L#\qեB#|VF |T\RlIFeFIb6W};>*/B4_"lC1i[5 -~'ӼҦ2<uE\=tOTVtw5ԕa{Dtg ϝw;Ξxb}bs>0}^rbl`zd =lGs +N/.~ДIHZe}P Uƍ#+e3$ aPA] U꿾_ֲV alu// AۣݪTn'QW^K q@.Zֲ[f Yd{@JENMM 55D+jDt =փ翡"o *vT!ll@n/}jrr:gΎj3CrJg8U`wgnKo|*D%3^<GSbD#+U9-lę r=&ZQlɽ68,+zE'uWzagt9ヵ}  0z(yR.Z_gԋx3I~:-}!f.` "ޕGo34h %6 4BZ%&& E T#`Eeز =]6t@R(lU*qΝ֥GҠVOMVi R쓃z.ubI;ߴP ]e|ŃlZ4:CCodU@%3B[!zUmr\Uo޸K4xa? Xc-vv-Ƥːв<#ܕL! "ERΪﵘ5H"ZKyqluREf/C:cyS61U,fm3>AdX0eXT[jB ℭ2ֺss{N:CMMÃgL߃# S};QΕuB)*8ʱbޒQ#En[ơ^j ۷ܨRxTaewHK+`!\ F rD6o=FG>3L\Ok[Nd5G3]lu͟XJ+jK^%Uׄ"mlcqdk wS;Fr!0EcL\X*jqڑT{{hR\vИSlnnMt`իDB0f]NtS5 } 5 S “uܝ9H?ܲU͏ /c&ESbUS;l $'ݸuwE;pk#&vww/Η̥zL5ˠ`/Td||c4S$t 簢A.GCmY=iϠ7=ك/mKLebx-O~so^3!OwČxD{Sxʸ''B4$oۮ8R,` OofkraG\me;K1b+ O7V)O(bð'^TU-+{_5dFvYA\kTRI`\O}{v|\cDvu^gۈH9pA\*n,HؐL!#EЃgc yHfm13}[$P3VQ1s|10 |2;PFfM|ᚂJ8_-nbtN'VpQ) Kos\Qe$$PubqTRbOIBfSW8uMa1G_&Q#S ك3Nn~Uk9ܽHEncm^a ,Cy`2I*N;EƊkZRjkywr=<.y{~w@PMnҞ4>(Զ؝|=doeVimLRa٪٩1yRv;;fxJ"'KPؗ_8C%} ww9-|[ᡬpF;% V}* zaJD]`|~EK;рFrvVF _ b3 }MX ɵ5!ZhIhoDK@C!!mO.m0,J9 v)XMUAv'Pl“kK9,:C=yˢ{L(y=\zIa'UsQI5<МPFx)Ytj61]1z֋o8k Q~9ÂC˪[7}:ʰkYM RxYCD0f9Id~;hEӅuF_37B4;EI1k7k<yу MO~18+]ܛ-L+O`aeIzqyNw봎D.#c6Z>^^>"b=sr3GS/`nc`5z lGʒ V~vR_G,u+ejp;JD`?̔^IMk۠)&A\\|̪e)|8D D Xg$^T޽˛>?Lr*cOufD30v,==$HI:d)}DW;D+u(`^ґ!7;mch>uHOPuXug[~TXA*|i y|L2 !_@դ6*2UVT++p͛T[b/=tER =jZ[0֧Q9$%-NIFJ*.S 8vW$<R,+;3qE۩uWqWL]"7nԽ}AM1(A}$HJ9Y I:cK =<̲(o6q{;vD1>$itv[*| I0j执klk%B4;Fg>i-7*0'6}I!;pt7}󩸌; aך6C[{5ZCS5<'cYS\4L[Z 7v^X9pm&v/f\@*mɧx)ww0,Zzm~̘} ` p؈#j}kmd|+*jO>"Y;q>IR C.B̞A]r :dĩ;V ]7RƋ]]ESw+gڪ$anǛUH-r;ګ*= G!ɨ}})qe:*,n;N{T2kzY1wRV::n?tr9.!* վ} X?̇mTS XK܇qmXO Vt!Wgr%rq@$3%M5qr3hL 1󊆎LH/Q#Q I cs%E75ke}Ȥϑ!_ VءE9F>N`<U#H05$dy+KёѠLG@d y/IcTI;L쥉rbňTE.a2j(%{5h{ 8R4~5LMvjMTe~xo&Z4ZDiq.?l>{mV,\oJ)G˲I\!Nd\Ư;)f 9;]`|B,C&F35&-NY!z̶ | /Ϛ縻SwBZD<ݚb/:u bqGOkQY-Iv`ӷp7-PJTo3Bp;d(6$_㲆J:i+,C"N %E]I] 1s5&}"VW2;Gmu_o~%):k6;1y B4#X |>?)T#C($,m#7p|W7ل-~?gHXF1 trDDG#> X:j5}v}y&.5N,^F+8(Vi}}~T4F~'QZ*S""8aI'01瞽Rlbw &a\S9w;}UTuC=61aI{rgv@{Jb[H0/BR 5ZGlSOXLB-.>bn35CqVIw76jbw-9Gش rEgO6Ԫ+/Z-37OL-47՟t3q.RHyR^[(ަY ZTXxW-x@dYT Zo-04-eߜ-^$i}{'i72X m-@~ǫ7Le~afKa/Ȭt>#*3L>*^tZq@ - W)ޮ.g?qGNkhjD>zﻸ&_Cl`3Fv͓p/l5^@J5FJ8oB7xlѤZ5&^ ڼBB g,Ӓ~ItxoG*+r RY:zΩg/WU2UKf}~/ :6%=q$~v ϼ/;g|}/dE.g,)/;zI iCz`p>SZc ٟ or9`V?o&mdj Yh4jNm.cw.mF0aWm>Cks c/=+hwBq@F#s{6#PUHI2k93Dԭ0x9TVy $t\w;|8 K,φ[%PqTo6و*UF(^OC2*1߄]8M82d<>W>TNa<џ~g3Z~*)ߠ?QP(mRsS&nJ|#vH#AIؖ6Q5Zqe"YXv2mBCXs)|yD{FDh`7зg8He}wxdbzv?)]43BxV+w?I?]?QX4\~=@N'7OyQ#_(9 1Fͳ E0ÊS l۹YX5'A#PYd=0wlLχhk62cGk\PvYDuTw;{hr՘ YXAeh?`4%:XiXxcu4&{;V 3PÝOڱnPQYX̱U8KԀFɞy]ywϠ8AXieڊ)  م u@O[KWT*Q.8ASf0$%.0Og]V}tUOfgM\>K#FL?9$lj'AGE#"mbTfk\tƲ As&4@{iޣ¡&|OӖroD+"/8Uxy4/o1:V9%Z?ÊȍoNjz뵇[ F\uÉ^gm 2BfkŻօa}}I2/fsOkx)FNP^ΘgYD[9|"{WCiKbn$7#5i\9l4XU> %[';%&#rcS塚+vΗ?V*;ˆ jXEl,B&3_ˬM4# }E^YK˵G wށ&hzfi2VݩcvsIg*5:(H˚XKC>~Xؿhji;5W]os9s*JuFr\\;i~3H:Ԟض%N:'K$khU3,Փ8^RħQtJ.%g^}CRv=K zT5CPt P?[3J;DT[m/{IlzeЉ}ww7@~fD<˿Ts$]3{S"SIzb? =ޑ,})y)! bW`Eʪ)D<8V:nX+B^ӝaf1B^`Hms,v(+=ڱA ZT\=VpǪ|K[/398@-]y~Si`EZ$-a>OY~&㔡S_3)Z`6g o=K "TgutYz/UM52(MU-!#^>Ҥ$? ,У|z?!Qg/ߌK,kj%=MXWV0KKaNߓncA 9kd#4sv]ھɽ_St8:䗣KG{sG@!ŢsǷy'0VwEe@Fl4iNznڪ#h\€,-c1@b%6FM<V3>Ϧqrqx! Ϋ_?!#K2pg~SKR$? 9F{Gӻ=,U%NixL; V p@5C$Uiɕ5߿')¦@P0F@=Xٛ]ؓ1z~.[vHe}x9?~K*309jk;; Thaw/7؟ժ}8g{ZL+g2"ẃʏUSlj|ݓ&WYqTSU}, W槡rz5-Vטb:iuҖߞ;e/($( d!";, ۗbbdGK =龜y; K]A }5='Ƨbpձ,0ee pELyVCD8S^%jc'=*<zW.QrL>rkKĄtҢcD%2\0mliiA>/(pQSS}q(2rJJxy~Z^^(qӿ{oS"疘O6{ޘjؾfԪ%hBz{ CD"nͣ_K+I2>U!vcn]/SN*>mp`88r]\]@`&@(K5^KJNN>P$ƌB^vdR1$fz/ͳku'qRz&wz&RiAM2dH F-C\1 vu<ݩZ%ϖJ'{"4qeĆYYY+++.˔n)쾞By\D>턥[}1zҬD;Gc,PUځ7 _{s:N߱)rJN ow`zކod ӻ߉LLL99ˬG['G $6떼&nk= J`"d8&-_%@@&nFy!JKO"G끘d|)M ӗV ׶!J$3hﱲٗח_^F9;nT-ab%<6Bl4@[a,O 礛%4h9ޖHXt*N,\j:)?a,**z+k!0h|+\p+ ԕдdnm`%T@]K3xcM1jܪ!IXovL#N==86SQ{%XAFOdM)l7нYI 8peý♳,zHZ!t`{їF_(sWWQL 'a&?knG S7nxh(/0_>6"ʹڲtl:/USz7vSiWVT=bWTPKk֏0221^Mmfu:[ZZߝLj?`=zT_]'ŭ٥\ W"]x튷QrUy.:;a{&F>w-=I!1nI;wj2NQ+ZPFgRڗbC5\rKHUXiET1G;R1Vg|.R="Z*6GU:\?UkM݉Xh1F a4 'Jz|WY֢u%JZ%~L^8$bXYsX}6Ys҆XXXZ. ߷NA%}TVVWWWfg ?~(Wx4z%c&&Uv< A xHsw8^#;]l85ɭ?ۤT.bzT*COWڪ>"!+b3̋ܘ~&^QWn ( 7 8ϧP<BhѺrtuɼScQ[jwIH6Kn9b-KR#+>g}TQ}mgGؼu|_~W%cZ ZCpI(рq764Lf^RRrGa(1˲e`cAf^/ )99@73k_}e:DV,7Qb,WTiOMcH d8>9|nhbIFZ =2c|UQ73QÝ%xQgC·Rh唌퐱&HūеXq2O=Vg}'tݙ[kJˢwۣW*uyy=/$sK&Gf͸4^B@ ;)7S(+)#qu@ov8] (Ǧ>8"Onn!ەW,$%S1Se,CEfa,ۨ'Vhr+g 9Lٲ_ XfdFÊ,hR`˵嶁)LOj>ߤdX4(irr9^0Y!!AJ]jt?(JIDS{pZ&_0歨v*t, ɮ;K)췊 fM*8w5rVkӞUVhxr֮r}'b+O<&wUǧ'\k-|GUɑ;Vgz_BְIiv"=`!$ZzL껃IP}b04ϳ#aG!g:zjƄ/z3ykCFk UŌ+P>%$q^z}n=TIEE|oLZ.ً6` 9+f)Nnzyw0ޓNU S\בy1,"MWpZ 06>K 86Y:nG%/g:rє`HW>ˏZؿYLCoOobbVdkY"-*NQn ƯT7{ihX6>-*^X MtX1:-| ) 6J(ފ(I)"׺#xYsQD ::9}pi4=񑓳;"`{9lYs:ZdZfrKiU/vL}~NY{ .zfQޡ"OPp_7¸Vykً+TM6NǫЙd;|1˿]];nks/c,sjG}@GA_rkJܸ<4CNk*'!-}˿G+[r3g>Erl ѥRT(6R&¾i~+2d;-J| v>#Kx4ɝ'ilQ"&|{>f} Z$t8,ܸQ*^|Nb3{C3?+s(B}h\<ɼ>noẇ1,8&-65CfZg\i?ܾ}a"[`cSmm$}۪8{]qL3&x|$x?7Z|M{#q ja5YcK9y?;m@;ͯ"bɒ9z7Qtj ̋*j|Xs3͇ eKmKcdX,:褩Q%[\ Vys[ͩ[]_K>7P[%?:*pV;T:F@@N7}ϟ.psڅ P 杴ظMt2^$;㕩wb&VۄRdmϧmg|:us 9oPn }@q]~V&K)h%;Z֡HشeFST;XE"96_sʛq[dϐV 8Ā_&bc'LRA[pUr뵫?"} O'IS?y$DcsRiWeQEhO\0\L:}ALFnZpс$ϊ3a,o%YΡw, T{lwcp|qBfGtԐg0~b!6*V` NEp54Np@kW0"Y=o*&ZfF );a+O @xPmF 3M?W8I͂bIjZM})@Tq`!߀x/[:`^uJ٧'xo}PAL=NFtj[g=L倻" iP^aBB5{8 ٴߴefDYSema7|lr9ec%_ǚ+o^q_/A~Ln"HAݕ# &GvÑ=Ԩec?7kyj!.c'q!2E];[6{ZZZuA?w Ϗ@6G%w ]gqf:S)?ˠ+i 2Kjxu(.bZ⁂Bmb5+ gR6]!ZO_<}rI3!b_KSSg_+ &a  / Y%keA*Nbd,Lkvj 5X JvXSY[!=+˒5oMmN 3N 6[Z)h:/ 'H"zn53Ԧ:_FcJb"RC`[dP,"-ODDUhް!gҡ(*\KNK54X?8߯{nTNߔ7dWkkZIp~hgu_hw7β ׿Ŗ#@- V[Y-p ^G,Y=څɯԽ\:nуy2)TT^ywKk9,Y$%Ta!~!}M $ ~%LEPdڛM᱙$jJ"@/!?9$;qp8FT<7rYG=*o};7I1EC,;\R{MȡNvXB9ѷF#+rd8?Z{.]z@hc(.˂L8WJՓҕΰȯ:\7e|8yv 3ႋ c ^Ee+Ե(CVDodi#M/nuˈuoQ~anظih8&NK JyMr9: %*WIn$EAsyI1^*૛ ~׋tNۣ/1Blt̹U:ku-e4*iՑvJ$@z0N)Fyl&4y_25F}B abC'hB٤#^LkmzY~7+Tjd/kP%]sn2~z? dŵzhrM"Ym` BpQKx)!Q|8VYptvù.-> `{4$Kti Īmc)E|q 극$Hۄi夵 Rȇ d%(sNh]`ΖAK0z}1kJT`ˇHz$5 :>^k]z*FkbìtltRS}2?[̀e#pNo M%~?҄ d`5_jOG4?\\o.S~ 9|1󬆬W'\Z/7%! qWE@̩opuZi^{Bu":U9U X*X^`HHв;WWC{iX-S<.&ZwR;|ϫ,c'Ǘ5<cAB Df3iI;|}&mYg JkJierE-F>%Pu:X]Lx.ZDn+$7o:caT9v&vunA_I1*K-\`W@HPm=8t9R &GeS6 _WDc#N\oDX9QD oN% dqlcyy'nvJY@/уZ}ȘK/t_u B)~:=DFU6?K.Wtr-x+#XIIwUfA^Dd堌<Ξ_&_vz1 xg*ͱ:>CWvB-i۫ҬTKXJr,o%̮tXV!M1~ϗq!E ms/[Q:یsS.7wVDVR.|( ՛O3A"S#hT ުc3TkL\??vn0̨A114KO^5B7+j\&2'pGj.Em(G @O:(р 8[7rd"/ԏݡOW:Xf|/ JߖJ~swyoBEy` L,P^D H Hp}Sy8$18edV_^3q(1֨QK!h1Zrڲ޶~5شX8wyڱGA'oDWrySGUjEH`cEG#$9ʝ}٠40kAO>Ŝ(z? }$M=>7wF[w˜\>L's0~oI>)wPlod5jd)?w!p[RisXGS> ,+F6<`xfYu1 2%.ή\#~)!,@樷Z$u#v!rxu, VFn}N}:ŵ,} TJd2뎜0A_BmTXi7}G1Nn? _.`8ɴܞST5FBUJ_)aaajڥާ % ]&)ʗ 唹^?sBeN lHN`mT\֨vghdiH=QSvIyL:HyʧH .rt\cQbޠyOݨx 5n|꽽u_$/lT :ZT&<.))k-(AwUejH_Rod_9j8߰S||69|[|[[mkk۸G%t;FM`6Ҕtp "FG{>9Ƒ|vss+Y8r< {*'KaJ/Hd&bx׷-1(0^~h|Tf 0~jpZlMeںmLURNA&CH-:f Kt?V-;' 6oד;'jAUHD<U({%^y{]/iH#CZ۠h86r+tww}>~O/POռӎ8cq1r!FGi4ϢY''K5$QE=xx~nI{/av0(hLjPa{Hz=Bʾ RVV'9[.EdoH UR*tPHY6,}ˊbgK/&<Ah/ht:p*`OֲznW{zI7X׷$H3 W:yzFMZ]P/XFFF[sl̋Rp 0`tlaxJ*2R3.p.F5@݇ 1=i B)jCY]Иm[q@,ד{zC೫xz|pzmM(L1Š<#GMS#X9Y)@` AIzBqn)*++ەR޽_mV>9߇̙;:*A2 Lĕ.^́YnP F  M {hUm&MKG 5Y";7;-L.$@# *Fwh>X$P7%k\G;:bƀHO s[?ZɻN *u{] ktL:ŭV~*#T50=|s7^=踉V>[ ]mkE@񏴊I3@=lC2pt=f.ܾgvt򠻛[b'6w b!mk-_u4EXѵh9x JaW: Nz^\^f(ײ̼ 66wL a6м1&E%P80[cЙpET[3# EB+s3'G';-`\]]ɼLOW&,橱yrAtJ`mlԤR!ẽ_%MC>0W¸OCw ZTqY6]2<@3l8ʒW u(Fۂc.bh CC r^N-Xy^Iφ!j)_Bhfo]CȔu׹RG WrHkaDeΏ?W>/AYטb߰Uw%\tԞiN̵,̨L_To3MD>/}"jԚt/f/A<7nj͕2GZXn%FUI?LCCK/p# ^ >"jl OL(!sG 2]tϰ7.ܭًAQ޼jPK| ̀ -SLA~. \eY@>nD'7c7\(bďDĨ\UIh~;̏L#gǚ7(I(Y_䖺2qP_9QDQw(IL~ #: {?bTxVUT.hPOVE_II#h/zvb70Z}rAdO |WWJƐcjK܍4!t %zD۲S8}W~o8ucq;4x yҋnU.1$ |O+ l=9Z?|s?{)=[4zґ ĒA1‚㲎:x~~V #1w&wy F.4#'kbq?ۥ[Y# Sò tjbuܣE˰~4(I<.Tp?ezy>Aq%?كKfi5XGq1zL4„\0+jQ$65|OTUNy(\qv|*Tc L bHvc=|;7.wk,7`6(idljCnҤu:J? Žk*= ~egSe ~Ąj֌LMˠ9"-вQr꘏ T?_;wljb@j ѱqk 4!C2yحTui^Jht~hs=ֈTj/c@O֤ 7{=U7,@iGRVz0J;JxFBڦQ#T~M)gNrAeE5/SEOdkMrv~ڡXLD+t`0I^rb7y=IBhurOk/:sXޱ|Xu[Sku=#o*`(YnRш J?ƾF\osSa~ZQW({HvyBԷkDŽW&ȦkpȀm(7U5&M';H/9V=S&^r)bi\'uY~=Wcuё5 76qQ$XXwH>>6eB/}3 a(#&b 8"#4UW߽{ xRG$w \icuJ,yD2sHpRp-PEo 7+|WkȖ">9چ{˯/blb1saƄe\3K?%\@Z%<~XJDwe!(Ң]s32z.LFDt-wELa71o\ip\=g.MOdTu*Z8AR@q/"Yl,_SDdkPnӃybKjjY5c{7&ǙР|ocZ]`>GPVw1VcMCr+[Юŏ󩒵 Wh*ZQqO F&rn<u\?1U~m\yCe~w_2D!{ZAAA{N҂nzM[ 9*כvPu@$xBmHoSAMVG=[$Ú`JSA<~81aFãBQA&Z^7]Z;O̹?WNi/=B[@ { WAE}lO~oӚ̌xpq5+ayp]MbRRi\v%W 7U)ua1WN]C>Zeݏ:K~"_-t,!> `7]|73'4> k6Qٳlg7U(ZLNH;V'%] 4}_4Wkhz jeNߪl/|Iԍ:ƷyK@p2LLr;yUG*/??PMm"i$&# 418\-rzRa/8] k!>J=29{{  &SS>O*WPNdń0Ue33 ,f{g-0躋U!ga"<"=o{ډi#kLB_/۩Q;J[M*,Z%%RhffFӰ)Q{ 勛F{#;sc*I'(%A"m 9zXh+0Jݹ t21?8 0%bfΠlRFi2V)kRwwv>Q}==흝=rBM9~~=Fuiάo먨~WH=QkOsWhEk!C`%˶74+ؼp qdo8Πٰc{ph4Hφ3{cz̲iT= #Ilp=_lw=w%Eտ' Ŏ |dLk[L􆢆|vͪD7$E.^Vo\ak{Y_"켪&Ҧ|:j̇eei3Im@Q$> FSl6GYIO䨡s 6:_|%T+ᾪBʿUאoɹUN@Q0;?ehhJq)u<{e^:h\3e~T#Ow[_H{Կd"`p*;&B%Xm~GF }W6o% :Kb2W҂^ԕ)a_D^%}as`KY;|.7RTJp"CilhlDS\Uտ;o@7o!UPR s9N?05rGdd@bC{fa GwHvU{uGIΰU)m D f@^SJEtY񺝝5jAѤp_/6a!ߩN^ep,j\gNw8{꟞DyfqQld+x*S 02Wd"Sz"umC%9a 9Zg#({$ F},d𯏻m5*N9-{oɴ]$!TS0 hc}2:(ہ2b2_9E2Wd8]i&[wP-lҭjlp4֋h`Yph:*^Wu/i=u 3>@QBNTu("2C<;gˬ %}:B͐IkFk'1cb~Zjh4EbI5Ck2u2 e. T1*3 'x_7^qlv~]O$wnVA.sբX9F嘇Y?SpZ3&wz &GAk[f`)cS}Ib$0l[fY0>I t"K<#+;77NLvnb̓H܍z+(L{Ku Z }}MP*fffտ-lr᱊2H 3nMi`Fd"raC ,qdZ_ͬf=ߴ~}"zK&h}\J`#JyֵۛSoBc:G_o-cU (=]-6 Mv~'M~+rE*gN}6 8#$'rhҊ=ۋ?3q?9͛nWBDd^ty.!rgI[c?!rt燛 d;0k?3_:Ѓ*W\2!עtlP)}"Ԙm5`{<qǎX:HѕǞ#V$nT%Nzs%| .qŚt.Ry|[vfӂ#̔bƼ7Gmek9s~V%Fy/vP11QKFPP%  ?h~pM8-m4S Y94T8{Evz9-gYeVWEi f7\LܸBh" 3CT;ah5]Ix !}~&8Pk"Q4c{~>eHRZ9÷Sº17`UKn]9hjvjjymi~0{V?y>B%숈{H MvIQ-+I]_oJ.BK{忾#Ǘm&۩y&é bDŽ:5uBZYV*Dh+ =ؓvAKS8*< /Ϡ87W|hL^[_ 8y@%6)B {HZ"Tw4%İcWݎ;6#﵏aGԀ>jvgS~AeƾV@?NO}~aSXHh9O{y3KGT/(ܹ4O-܂-LI^?ye3W<""(FFU{齮~.4؛K8 ]5+Ÿ頂*Wߑ\' ۣq&[.bin]Nh8(gus~d ɴMBhUn\'(PLq+{l%r i;rTUڅ1ow5ARVlll#RwcWi\;-~5 IEe"h!Ljó/4B8sX.6ciV ex+]p1R[irllCX4ɀIIc`2^VيP[(s"H lEtlFݕBH?I\ǎ<446T%xmO(qdY9f 1Z3XGGGF>e ~F z`llR)D 96NiTJbMs[7o(S |um;Wi`hF*3NMަʚ#OTI!u¬곝?Q/$|@?0O;*6&Yh?5=ք"7vUէ LDL\J_@oC-}IbNEEBnWjnAArVoH.DJý# &!9>`Rv+ ?ab9o+~wr}X}d%7(uKE-QϻSŐ~~-G+:J#Q;`1E tۮ{7؍DႆtI4%% ZyyS |hҮ1$8VrsuK<.]m٦A Ö W7l-_Kthn~ 9qlb:k={o!/Gt2@^n}ͭi'?E/!LWտG ׿1 Orlu9*H{ sIy ĥ<ZjCe<˾>>;^eR|V8_oU3ZN(Fu&{W=b""*e%7 de l>Hyy;G_;O 5k8Z Vj0ř$H8 mH)8]P]\T0$U:\B_9HɏOO I]6_v7}c4Čۋ^qE8G AAZJfdJ66|w}vO٦DDຉ6G@,oɩ5ldF[| - ƺ?0\NW/l\ɻꆽO H@0[MqUt%瀰2 co'N7hmD¿(O'/eabDwaPM L5GBKaS 2A]:-^/wIșȶ@JQTK\=dxd BoB60~ ޞql4<}xxɫ 97po}Q'/R"QyM KS9Fqדlj5 ٦.bv[^-Rʗ+HN)++sPHlt;j8;Fxk^,XFHD$U+$&VVޠ3;NkS]2t&OWR^Yn-x2Zp+N3<?L3Ǹ }gjw^gV̫r:G89`xjnnRZrj͑o)cVK[TP0]Wd$`iȬe.0=>7P2k} 1aO~[XuGj@݈N%Sr> <pR9_ti*z&lZ|e>=.+t(PCX.[X b- 8 s7(*/mT]Bc>_/t6u Z%WOs)CÛęVăFk'f49;zH8L{ ^ v{8-0u(Rv,p Ĺ *V>Ow"X23iڕǣ PS:MM*h;O~1«+u3U2b;k dVG:}" I%卾 3-B}J8 hl`H: IbЀJ/'mxY5{hu t.EE$KvUtvfX"% ,A\}[vdN-b[m !M8#>glll$z* \6LmԖX𭿕#(98NW"B/PICC ox=oȏ 7⊙c5R (hL+g/g 닋k/(8HX bR&"ud[~ ûN_|!̓sw~z8h{DD:t-H\! Vy>άǧWe'2wBh?DFz߶ '6C K!*~ Zt4-5~(}XZfWHDX>j} a6jz_̷' ߂;*0'c6b[wkbo܍mS5h)Іi@I_5GH'HoHoUaq)!2 u&)3lЄiP{n~ BGee”Ql{=2NCB$* /n]5{#]abm4yv7(&y B4$_>;9J &<}4/Vt7GŜDu둗 ӈ{"SQb0.WÑ] WSFI"#jwDŽO;skl*qr5l6dX?)c a;R;=!vT`;5Ij'5Cl{!]1"7+f.h[tOE#1J޸BU!zIRN ̀z!>+'-|2%%M_?t{*#:@{Q󞃛@"IegX:TJ #ƕn"maoRFF˧~~7] ]1 /ë,L H0"g>e6!R,:ULJtqQwmRǐf;9əjz֬ĭ'@t1.1F݋\?VB4&\*Uw=;&ۭKpd CZ߅;X.TYu`vD0z~=C$|Lp+.űPR.xiYy_]ƕ"?hQvJEvD#%vVAW/ jwY;3<_# t[Zbbb҂/{ב,E H,r&Ĩ!]QL~>@/GuRE,!d|ڷ:v@4QFlhl)ؽ2UtHQ"լ{ +_cGQ^'P nbeųTn@qf[b~7wpfR\D/#'Ӳ5_gx}UG )-/.q4 6*b( 8:g cˮrc݆@ .ПC\fUZ+nMwR@n!}C2`CwXk=VĤ%k ,1YbPotp)>>6tm~˴Nik|*:~"|pA#mru+WȈQ!>6<)Xݼ7kox1+Ԕ'`Vx1۴vFbO}ɖr<]ށ*LZňa#Ȩg{,,:\;?mIH+jI)#ǩjxuo `h_abՀyi wbA]pX&z%mNR #$J *YgٚͅKSMSkT) ؇'ױՠCvI˒>ywZiAAqKΓEyY{2&gI캯H#rrp"o(_Rv}!՛klW-4e#Am+x ``@w"S!DJK8NPW {6B, p7qy0Ϭ>KwZElfkfH v!Yǘѡ|J &TmWr9vt^jΖ{p~}Cjx4 tj];D*ϟqPwf6VФl~F=V1ʵ;o=;j=MBcN{~c'=֚ kfSkkOߒۖyTw,Rz-ZM-^ h xQo&vJrҎToFaQ;-$g'K{ cMs>;a@~NG afb@&(>}ɤ޶a2傧}%ozu.23ZSۉt<θoy+uyED0se j H lj/mHp}x_RѻU_ Cm6Gcn!YY*Hn:COǼw;~f; X4b BxSkn>;L4̨tY/$8]ݳ₢&;޹Y|e͢>{/Z AnEj?ovu w-Nw K.[_<)U e::in.\oBiy-i6'믤O*[]Y<k_5fSٳ-Pt_~<5Vb1MWM1.uFBAOaEQW"bFճfI Žt\pړ1931@#2>ѠtRaR[Y_I,?6.En^.-~.:|gÔ sKd8Y55 n02wuoJʏ v{!@%r$? {fZIq&n l*^vonh$~pm{{P_Rwu5Yh.pvhϼ؛1r8!V g{4}hކA#Bf'6=J90wx2*F/-{Xl<:X󽆏#F`rUT4Jw:[~_h{<G6\=ōuQ*rL#S򮤦;Q}}ty<@/޽ȜÖ25 )Xʡae"r d>rj}8\1J 7QM4 KP3CZTI0%/8w*.pf{䄽){l *"oNKfGtՅ"X .31#/4l`79d^d~zSjU:PLƑ4­6sXXOb<1\ʖc`ۮ,S"^X]E [bWy2_Ȉ,_E+ڪ\I(m\Fi]55mDTj\ U.@i ,;>C߹6.wf>zk,H.e':pώXRPZG 8ErkԃW]ϊ3sk}||Bq[r.uV\>bDFOdq)_Yd)ʹȤ]CIZi=ok#NjΤ \(}Dr뿘0@VT ߓh2\޿ sY/"WgVd̨A 4z1J{EEiE|msEҥG*?7A ŧv"_h] X&7C`# LߧBTqDFqXK7_l*S;\/2VT}W|pr\ Qvx/ev|EWN?زbh ]4)WJJޑ0(=[G&frP{ڸd/G|ݙCu s ;tnَ/_m-K;nC~cc#B H薤0<VlV!4[o֐[븾b*9@Ae"Wwo髻.7sI+YC# ty@٣^}>n>HkK(~ nc6wBQ~Qi$iZs k\_:=Otl>?=|L,mq>Ķ+1J&>"++*F&y6Gy^+*!;LFr- ǖ6$j$K@A(92Xv:շ*G7'1w 0FU:E:euMYW fwsŵKVZvA^en {g7粶5ul83 ĕ2:B.PM\ #) JNɪ}U)I AKG#zfd6>RfV{!V9S,BY6%c/ZSbt]&RD.E3) LZ ]]~KegH†>ü+}աG)qۿ‡|Jcc6$)_&~u^Z VC:R޼a,nSs> vBəɿ7'|Z[] iW&oǚ|>8ˎ<1WKKhI|RCPFVH'R!R2oTr~t{BG$-s"~Z SCU0"þM˙E m‹{i@79G0E!r}pGe,/}i `dDu9 XHȔY8("$*=uED~`ŦFy\= H1"Q|S&`LW=>̣\-#uxu$`#N\>2YS;v]tt*rtyUtaYO,G2 }W6oV;e7tqk3"a?4[Ug>]6 NL4(S< ˊ"[7 @_0r*Grv-.V\8)W6^yru? ttD)FeB\EۮWuof!V;Kȡ=x ԏQOtm"!eTl9O׫Pz>DN F&)wFU[[[RnfgyMƎ.fUbOVw&<S"((gB?ㄧqV|nM7/GUƣ_{hhlh,g:*gBUOQEVO/*0%ݽ]؇UEG\$ZElcߊ*KFƾ?war7)ϫ/-cC,w݂~jQJC!,9~ί6vR8km̤J4ѣƯMv,OvY;x5d3#7Oe+KYZ :_FVX$".n'0g;$ %)|m UXY>49֒NBS JX#Ӯ?x 35kyS.6.9EîK"e~a; *2ԝKohoR@%^ /sL$]M'&Q:O\l4M~%qOS?3a"lGt0~"pmFl]U#!jUoıE..<7w&F07CC$p -(,408I]>4H 5O QK\%Od-ZEHj+M1m?0ra/~+oFS_ׂTU뎵. I?~/x%&H[D7O T4ѴSA7ϋZ)]PRRTW*|: nlh8:'=ޟG1[ vd>Ɓjӷ;+<I٤O٩冏Ӄ䏯41+Sߧ;J0S15B,tma>s+k"t}uv}SYOWA'LIb*+?$%G"N;OKE?S.~zЈ^aXRN轍5~ٞmp2iq;f˾rViauWuK@ P\,6NRfRN!2h7N:Wi3fբ8g:fBಽ~6Qs-짻;̧8tT4]M,>2QMrOF2M>!:mL=pbwXv#H^*d՞ohۡCTr`OODll*^MCKɋa5牂SgZVm/Xx3Dž߶>}gv?s#KҼ3'S&CY+CP0>]B."B#b|z"${uaIWf^v g41ElLe} lO1#}pN>,P{ mI؎JaxKMJ,ֶ<4GY9Ʒ{֎y yp"XVH;6"eSL|T.+wQ5DkRK\;_11-L}Пp܆=ו*B.FAhx&@'0_tx(FWbZ+}f_>KSV55_|}:) ,owIB^Sӵ^0z},jw`Co6Ȣl~0D(*pnJ7^7U…小*ȋpefƒZL2sd* Aa`;q: VȂmFg-$܍i\*EH/5bxˢ6N1Z.T'7շroFN.\=r[&辺'@ސ^]?_U$8&-kn K;)'nI0?jNk[eK_nda ٧/$*Qj?YcGzerwqu}XՄCvGZZ[oל6ç6 iJ߷HɩXHr~(1c;iKOa" i -c͐w&[i=_uQ눈=? 7X}Qe<~D]ssp["UWGH]I`]rx8[[Xd4npė`dW@w޲57\8;vl|ɷ6.})F|ibQ11Qur>vt4Ɵx4n9 @$>̑u0U»ՙ5fk]`O,+W{ZyS۾%ѓ?M묧/gGPC=E nB %7FwiD!J\ b[}.E˞w|pER u + %?'UňCysu{ Nȕj;,2bklNmfQg^ 9i4=d2޶(vFhnENs\c7(ggz:}ƕ-{P{@Q5 \/a3A4D-]KVBeyEԪvntn4k\WL9=~51(hg؟sqC޻"DS]w9J6p 8TvFi &y1(*.+ef<85rW6g̨btJ7* f "Kflg@],^G萈u@.וhWjomk >=S])'p@szmjq4{gENjEQ~"&c<~m="V🵦-mN8"'-ui%mmu}ogϺyh泶2&G$7B #G0Gz[TͱG22U]E v .fa4 cG}&=8@1F(ÚL <ǔ:C' ^gƋN>M}<.[ o^>}TZp~]6"/D s8T,ޱj]i5wڂVwՒ0+C癡n!,Hew],82Y* اr0҈?#Sn8w-m!9D؀VBbjs;E;S9Md>`w}YgX+ }۹/HA 6̾-?>WUخ.n/+%: $>߂1`;Uq (Xٸid ??1Lz.,\灁O[?#e8H ,GۗQUݺd0=`ɿ\VEW̅m%V5 _a+atw}汏սvDi^ =9vE"qpkRi[ףvX$|wP޷|VUhg}v"4WOmyUũI ?\.WLU1A:mw?f;!=tR r-w*&]p'* R1~ D(HYԆ c^ϑ"brF'_QcݵzZ{^ia~ TL uBg8G'@umTPρ8n8l/.8SYee^WpNᏥM‚Pa_՛zpO@хAV1Ep*RD8 oUM3\ %1$R-W7d@ rrCΗ=,_/Q\!*U(d@bMVpvJU0]HZϝ?&z'"z.L V;v5cM~SQ8LVu<">Al=$j]ke4¦+D:&7 *~DF>d>4vxP-[ #; O$-]W(L" &)l#sr3bCR_o++UKVT$/&@,uIJ+g,5gْ=b䖩.й utejBWf'/S%NLvL]`U]{ٮ7+$!=a~g/ _~jhk{Yʨ*q>gA{"Ù+~ǟFL Y;0D~ '>)zg֡;і(17c[fyJo,mww.ZCK&ؓkv\ɿ&v1 H 'Z^ik܎۟++rffSgk nDŽI8->&O:R{QWlߛ.ay lODڌ[a^/ׯ6vk([.|aª)iFIP "e"La1%tqu STWɭj1k2]\?N9pْH1?~dž$rrTc{e 9ǣqѵg#yo``paU_9VVN]5vVJqЇwwԉL:N12(ϵ200 IGpKj/bj +4#*н#ƚf#"[58JT܏}2 OtW^uy?bb &rAF.O ↳M3r@ge`8e"vO [5h])iJitG~G#Rt 6xL.-JMb0x)ָ7:Fvb"6V-:| B ue>JouKP9} h%/J&x.K-8Nu6e;W蘄nE)/=OB0iU.,^kd"ac А'Xp`^0QtRLI?  PSǝ9f,`>E$?]/Iy<_ŧ{xX:zY}ILkp"08zwԋn 7ieUj-SlaްO\v_/d4^>,Q67Y e">и'+–X3|_28@뗨Eo5kJ2A mK YYN- ˯ ǧ>;m:>kރE;e|GcyӟUTȰ Q~Em$mMP7gU?m.05.w߶wx NgVPbMgk=jAvgM.F"L>[^bބ*!ggg)Rb҄2mžIH0~=g>ݻF| OD!1١6"܄/&2_>H'"Q*nN'\s\Cc\iz-|ؑQf\2 RT=zmb6 õ@HO'="k9fîH>i蛦&6숤Ŏ/l]@;`]:fuImPTL.7M^*ʲnɌx-6CIsUA|ȈVYLCʟ9_fb_ H K%mhKf|{X0w4-*,N}.˧XX`>R8FbUŏ}6~j";KB!~S5?IN% edf-8:tng!ӝ~0L {6c"0%J]uCH9 ~0LMF򩎾՚C{r֡]d ]`a YM]U g՜dD,<;gmX{mUK?^si9YxG L_[kIukvjˈi:'m񎂭ME.ƌ 4}ؒPm{CzνBP(pað mNKuҸk+ޣceuǡ}6 A?8{/N[iȼpqϿɿj6ٶ=K8r&LU #<֨wHzֶA=9%ҕ5ʫa]U͊F=<gmIj2 wf&~0OŧMS-Qe^j6Ez>N% r-&3,4ĉ]3ʈv}TXʸ5f@>ߵoKt%` 88YӺSNoX`"U[pl$ <@OGy^)Y'P b̢)E)DEls[I ]Ipzrra-O3 Vy6_N´ixp05ψѦ3BC hت+EؒH%c=0Ʋoim0k[5 :ԉחVffIҒ'x U8Up W9i vϱ1J4} _^$H =( K7D4aw!Ūyݰ5Dž :YCSZn\vZOJe[##+4/[cIDN:ٲT~?iY*pBҎ]<IXU_lL9N.=ϘmDeŮ  QW6ҢY. 'A XC͂M!jhnRk Fno|orN{a6}5sn`>`D0P`sQ.)^(M"ZKKCŵlDuTSl}[|׈c>n]4ЫCkR <]7XU\q T7ͫ#N87*TRE^-1 ^Vk&̺'~LT#5}k=zJ̳. /OAv@;] h_NiaX m];9唗{Ss89ɐjqd<,_C!)pL!::0 LX6; q+\gp25Ӆ'?)06abyUen͡rP,SRmKXew!&xGYc@1QiOIXN3SU% P:3پؾt]{dfOqkɼ/MJl>A; CÀ{|992!@"b#ː!VU7f;;R :g}S@cGI:+Уwz}YT-.$#2kE">/\e%;Ki1{*!Pb-ݤ&`675ID6bʲpEF+jgژb,Y_3!D7|nrŝӇZBbB\ iL?r Z"] PV!,dnr~Hx Ro8`oR2*Dpԫy@3 ]J"<7 r&EQz'ǙΌK$I! \M҃`H`̹ qm|ʬc['Ud:,5IFZKHϵze]w1'LwwcpBL cfa6,R"7"?2KZE!%kvV{V(~'s yiO:m *y͓\z9d O[^ޅxi!!04(dP1Alxݥp:ؔq֝Ώ?M_CtcGcAhf*EʢɥqgGwuJH˻Phh"`=e,*!m'iC?s_u=4.q+24m,>,*Ҹ|81'.ē)'YЦd:}}*`_,sjN$_?6_ҝB3GR|nG7|O( =Mʍei4-*%'2hHt~Y|+nև_9gITQ<(/:gkYK:9LGn= 3 CF3w;/G.ZOMSh# 9<}31zEfg%${`yZ gs?5~Oz.[k}Đv.9o(ΜV-qqM"$AjBh"x2i뎠涮3!݃ 5(Ϥ[|Ptr?ȹ%QpV~7qKK5h LFFȒ10 WjpDlIw-;OD(꿍o~d[X۠|5ǭ~TuDH# ,jg_Tl158` *YH;es;M6zeJV;b=:FF=DxoDİNa,0#}^mwrR JGHZi]}NUTų?L@dEsgxȑkȎݖ~CiOEX AN"kc~8 ?%\G:rWۢQQxw֘i)5[N9rzM6zyyI_ >x@lxʤ*;,\QRD )ޙИ&%aDX}EI,U{>R>B&xZ5k:+pYG͖(K '[yyFwĬ zG`x6n&_2gagL "lyB3xn(O%φP͢m TP> )%* 9~DU?:!LL0VU7hױVWV^ 1{T-DijM5_UAгۆ#V×T̺]eO6W5noI_-?xxx8˴9a$ 5͆GwMnE(@M ܱI :ǏO_Ba"M?'m[uBBulѸ *%"<V,4$yfb.PBQ bɗ% νU?-QЋ\ *oاe75 / ;hjc%|7mIZ_)N߿wSicH{Qc5H xR!r=:8(ij/xחš{a֠I |~?!H~iMl b4ӻkX0r14]ąUWޡpG+4bm ]!*qa 3O-WD-<ڜ47xtٺ#XiXhy 8 ?z' Љ< G3 tdV6^'1ɯ.f]Z, hw}NɊ1a ZOzÞgf(DKQ;9?lِL#z8\<oӖz(^nF;*!Mfse1E^1T@!Ry&Vt`K $<C߇&/yn0"ΟOuV]g4Ol d&YҲ8r\.VLk}ވJ~#rmn݂Yd~l+g# Pn`PYyFKOQNLoudDl,+w:+l\ؕ A(fC8l"!ǯ#7K=VBq sM*h.ˑ&r(~ ٷβ nrՇhn`y-eٰ@ .th?(|!= 9{sWSA̽Ef`u@"yc__p69YQ[&wɗkK CD](5?{F1nόsڅ7Qs*= QWUA>461Ty䥙95:eI= nOPZb K&E^ ms|>hH8XMh$cw?Vκc/ȿY2`ʎ Sӂ9KN]w Xceaiyu[UnXbT9w8- Y_)1x9@u8x kˇ]d";*o ksr9ʔagUƕ5R l`X "lC3 `j_>CWp{ EA6ge:SȒ[=*n!K!B.7)Ȱ5 Gyi*e4u)*7-Na[6~ΗiImw$uqR _" 7^D\9Eɦnh7>udCwu CAiPUwʯ\P1=2hZ|QݱnYѕ!4'ƓdhBM2]izi (\4s.X͉шKdj ,grcaeرu&kv[>#`v4H^Qjp暮ހbefc,Jူz6}!yr`JtyGt!qdQ;# 콷媅YߋnhÛٙa|d$PtfPޟGf㉧B@4܉S1q6b"մԾ<7܌;B@E|^QomiJ#C/V3R;|ׇPAK(mAS4N_0Kz2 3I~/J­dcu!%y hƙ2;TܓU@L!Dd(聦h<# G".Ooq޳]4pJIo`yag {%PH Ad]N/p$q\{D5㖃vk; հGnxEP%Dw@P2] iāfAOU;d$ J߈ZaY%IJ;,Ώ+I4&>W ۹˃n& *RS<%n J걚%'?7~3ĞN7vәeOm ФO&{~D*.++|}wg]l B1'OC1G`@EǡkajUcUw i"hNqoEIX㬎N3QK aH>9%7GJV"I~ /@#bZ|v6PDI&w~9=Zc7h0u?i+dfn-9iYI(ɗw?g R,%Cؓ)|}XUO%`2b2@(z&]7y76c]Z9xA7@_ca >fФI>Nh=;냯`ɐy3wvvE7Jl%&6|J ҊrS<8GXqjb<'1% xœ?S'!f`CvӒ]s qhFпD2T:VsjYFgp4 Y/˖WK ~\LQ{7cb˴񇁰H'n<;;YWܼ%kƸgSnu # ;|@Fu/,J*-J`ʃl|p^G3y:6}A~̓Կn~-5UL4 $kŤ5 VA2,.68lX0p5cF6 \UR?FN4,Xo;6 7㭡ӥo[%Y ug%̲ѷ⇺Ӈ^iE%½'UY*0)^<;rZ*g\So,>j$@P#!#v]cF4`[kua={=!&~iUW0Sm{$:-8i$lj_I`DV|^:oBy"(z{poc\9,\&be;mW 77ᖏ'$HܳUhZR T]v$GOޕTtcewncxDk^...g$/PPTi`k;[Z[}+ʏ˫ފD-n )E=,cz)g՞WVJK@mʦS4~|k&xP ;K㻞X1\G",s7Idvn'wSL|zJ|%<?d,--~P%^]gqn'e xfilHǨCp)Ji8Ik> KCXusrq1n%s50(bQzh>lN $U_` e6IXUJ0@ }2'=pįM1b%XfW1Qߨu׋XNj? &⫪9^XD+۳eDq&iq[,##{ M 6̫rx:㴒C%x,5 ?knd2c19 *[Z V5rxXt1 `!bqAy֘.-C#ď]ϭ5cՠ6>& 9,.'-?E}||\]]?6? +JqتH Wٓb/=#kܐgni5%xcY0o1 a{懥4 $bd6jB1n<4!F"?.76t*fcS ;T T7rVy$E@o+(`/RBl3BeK_Jȥ<2SA AeSNP tATֲdԠp7 ݤ?\U &SX;59۴*#k^Ygi(ngyj0^[^y:"(d[\֑bʒ-dkGΚNQ7х <ބ㧯fF].4w.I*r~0G"! Ž[c6ԋ'r"@ ad:kc\%' 'waB.9;fz#.&_gɌ ov[8)戇Dv(DF4Y?*ow3pAR53 *5wOY-VT{󳳱D(@\$h\hĭ+x̆o,oB5d'Ac q1~aF(IC!/{j$zA{)IX64gO&.>]Vbxs:8#W~8M``\)9#aԳ#anכq+( R>=1Kg !u=vo;Mz 1v!tO.4󔏛zI.BM y/L.^=u.A>"J^/Ž"_ځәm3]NևM""䞑bÿj_HSP]߸@6$QZ0gIi*n`Zw[HxTsNs6!d֒5J V0!EŖg*RlKf@KАTy1Ny((r7ɰ? " O;_3% ^ ԃZTG¿*ʬ řOc~4.gƉiOs*wg~ WL#z7MiRv8r<& ̺ڿ&jy] =WT, 48H)znFifģ0yQ2n~¡j3uOו/m ]CNDĄWIf;5ܲb1Tnor^B{ި5~}=s6:L #FDo6GXYauqLWrh#~ު-{ )˧/ :[QflYYΫg &R$Y&ͱ0HR9lпY}oeMGQmE>iXsBX7;>+z%l$b<>33+f-6g (?},+jhAAJ`v|'&{0ٳ~8^QC6y Z&9ar37$+f_rFMQȺnD \QnϺ!w!Ά y0؞ڽ?E=kqjݭSU'`TAWUf߽YDJa; Um8"xYYg WV,g!omh(筐jf̄=|+ɣi89!OgS_ ~2m'4[ÈZ>,~'y[5ǏBƥzQ,[lɠAs|!TU-7TX !ׁ܌?x'ԒƱ}K'2m9p7?n/rZl8 I14lsX]rN^_sy@쪚v Y{= |,PDm6b2FRŦq4HU7aٻ7 E9¢^SQM-ym*g~Ɏ6!c^_N4g (l7vg1T,Aw@Lp``}f Ĕ$vpp6k\䓰cz ҧ+QǛ.2 ;̽[8}flۯl ?vZRM?72Ɣ*Â*!5m L'V"g .ڟA57Ys\gZfQStw;0JvP!,?VkJjq)E"iތYO;[ʧ}g&9mنb>Wb%x^= wMjŸ.G]EnimbW Mݹ͌ph G`!| ߌ~g{KX]gݞW#H E.vE)9TkGc ߘe dËiiٍgR56(f:k^r>Ĭ: MֶXKl*"8[[^gƜ'=!;v G盔쥛GELd!)M{S>L6ƅ*}識 Tw^wp\eVAb5 :yÆS6kg^bz+*hy[ϭ=yWF3W|qLoV\6EL\Pbu?7*9?TU Eu"o\*\#>t#K+#AhG3ƖJVa ־Q;Ml* S*.v@.{ƥ$rt{Uy: S|޸lBVWZn{YY` -!pf0 aJsiˤ" w罵/!)LFV`W85)x(-1aC&@r^SQ,L((Q\hnfu 9_}ekSIN%?qnyEh0RF1)_P"ۅ4]@{ ~5'm~&f: no. ;dwhDN!A8=w)Q{Q)=^! 4>l$s}PDR8,i3]X[ -*}}gA)+ؐeυo[Q] oPl hpݯ-\|ֹIne^ Vc4Vb!MGXu~6@W ad;E?5sgkgs@ZPY&̾9Y ߃ۂ2 d4MM٠ }Cz(PbT>[=GTr"X1Sӵ#DX * $Ҫl^pUt:9~'尽n;2יWSLs.]g}f/k#v><TI:aΉ28eڼCz,gJle5ޠ 5CS`nl(G t:6r9VV&W]QzYT[g! Q7` a7KD<`mV,<>[My঑GGy6 m;GQQ%r\5_onIqW_ZG%IJJ1ŝ;0`Fx;tހv3H{ Y١ p;C v?nön$1`KT@'KK't۔a MԒ-$7vuj-R_h^Qgx¶a5vwAPD3m_Pt.O^jHuY։}#-&3x9C܅}:6Di%FIqP5yg(Ie|R#b/ЫDnf2ߠPR6(izO*0jkHe$96eOJ8:Pźoy3͉vJȥ5GHxn50[  nbR.4 gLh*{XwYt\QQ1eޝ{MSΞԈ/pP=,7[ζDL}yӖlOlX;wys\w?9ΒyF[Ɛ'=6 Pz AiDRy=40mт^n~속o?}_r3#H+)h*/jJg0-:l |c B*Q̇& +5lX&+NU*=q6ϙ.;+:$HNpM~\9=?4bor;~Y]OӬE=VVy7F՜L9w1H*egZ[[w13zj^`A:pQ3[UCwׁ?LLYz_v{ жpZJif&^C[e5T`&Kk]u13Cef$/.>Z=Gs/tlflP D?'{D52|*}&Qfy`- ~ؕ1u: 5{"vm_K@<@{4Տ QIQW2H?Q@ Ct k!vJ3us!SѾz/Cаo=D.nГsZQl[ (XmT^ }-~!Gլ.+Ki-$dZds_6T k3r.˭lk}0jyw̷̄,^Y0RMNf^-bD b | niy>)#^?og_VAkgIՆe`5(䶊&Se4's`$Ȓ}ҟ`լdr ` |--@C?u;ځhGDn_/u_QwKċC/Pj7|ty~{wtRyǫҬ7~qlRa޿wҟAd4"fQNm~Y9<,_N/B$A k4ȑ1]RLW07]⣠{ ^@Џr|lĹg-y{!qyl:yV3c{4eY{Ow;`mxG$C˓7>@r!/pׅ컼6cnxVη0zܴ37Ix0am7㯗 ^wp:U |GۺZŠY[۪,cǸeZ jތ܇7/w[gIY'ٕ$:Nw_i";Zk*-ߌ&ש:D.7W6pGwoPڲN >+Ӊoྲ(ZNnT< ^& qOKQg$fM_tMD{>:D޼]I?=:\pvj ~ `PGpE -wӳfB^|IwJ=@3b՟FH,~xvyI Q>/:k-0qqqRDӺ@T73#!"ZybqKcy%f6!ֵTLW"o!لqvK7~l}nr!5݆|Ëݨ/'uamwr/7`^Et:'/°DP˓um߾Ŋ珪&Z@xT?!V53N <7$JIxGJӡ-{YlPO'.Ә[᪫i-OF?GZ Dcl#ιu (r*\4X( Yai4@,:sZT}$QLZzZI]Ht[+Y1 FV_2ޑ 5Fo%fi/t'xf[B}'e=ɟbԇfv"Y ;vVMpJ]0$A&;7I)Utqq>&Һ츬 0=;V|j 00Ky9^UNR_Si*-Jb Z`nh<+ww_=1z /Z"vJu-5 WTe 9 O1{bWiv-56U󦼿4[l? leiP7ȂlѾ}m(^nM.&/1{g(s~P-l\e8]UqMp濕Bd/Y/W| 6S\;\/I ģ;o([ם $_xPj'sXTTčll"hѺvlg}ː-w 7EKim/Ua1W7{Uo}e!* y[U-~^׳}Eʡ3d;(3dKԚz.fz')YYLNNf$ )H^.P}e5]^wtp΂)ԾeAj~_ dȖ,}w-{8VJw;T6A5ٗp$S'psaGož',:1Qu 炚Ds[˾yn& zC̲|ir4;6@߾{^Y탷Ӭ_i"i)ije4ńŇc:)y9 )h~TUmPPf~5W~(^vs2{kR%F/rG0y-a$:8cSmگA60v,1?n'~S&Xe#6ixTw^vNi'vW.:OɏyMHLԗV!Mo<@"HҬbZ_syL"[MWMQ%fQך `0JP{5zwlRRihߢms4tؐ (}ZgnC~TZ"wh$EWEt*ol,HV'({V}_k/QBifv&q *ͦҐwAT 0Ѫ,7CÜ n`-f;|S@[sr>uY|[XDzLvY"3[ C PBb4[qVPJQ h] ^y…D$o_֕=ChˮTñu.Q.)ȂvЪgxAz'Hg XI6b}R"8wf5M)7S05;3;1n@Șv X 7[]q`6JKԓo23)S!8 ං@ip9|A-E7Jw4=x.S`~{v؞-M<КL} ?e#Zn_t^nbDggݎET~ky{ yw/DՍv>vn $ /rѹREg*%JXJ\},NuU6,$vYc":Nk?_#*GSuCXoZ˅T=<0x=~`N=G$iYҝ A̓oȅz$u~坪uͷ,DSx$ b+]p^ۋ>Y8 ls֊Ġ >M[;@ԉxBk8&ƌy QC{A<%os$YFqKl2uG0K* *td;=DBcA#;~KNonw^'_1!h'|bv(\܋[LCg[r{gۓX^IpAׅ̗zx뷽?眦cNL[bgEG|XϏ ct/ZB*?:$s߼V>f =ߢ kFSi`")$ZdP2gG,,lm=Oڛ'>*:Ȧ~\rulJՔb=Vʦ 8I\\>.zw'uפKT)gKacwI`E.~ ôAGC QB;oΓ0O|,jm&|lt}ny0IMOSsyy*=Jh2$P*0ȿ+[`S9C޿8uFIЀ* IYO?\ܲ;éĦKr6=myy :`A,UVĹ}^_ξo-r֝wD͏?8?0iHt7A,?lp`ia szgwK-/`H r"5{ylk^fL}1K3ߵI%0@[[P~ pogsNVYSU ΊóWuED.&~x.;̊KHP?pa0*a8>YhBM"!){!t]΋= 3v/% Z8zudy~TVii Y'?+6njQlݫ laM} >@_ש?\qQ(@Nqtdi\ѾMv~w'7Ox9d3f̿*-|ةPܙQSvFn FGqzz#o+ƣLOXAIA_)ɲXSݠ{վn$߻dju}#b#9W1, $ bO90(:Kwjb4̰%8Ϛ^<}sfgM:UXtjsnU=&s+^Zs*A4y?q`LoZiz|H HGD{RG6H8tN][L%O!888w]؀=)>Vn FEefrJ΀aCj{7)Q 5*41Otܩq}er_gLkJrnѤThicS D-C^VYN(CBmsx~% U⨺P zdI};jE6Fgkl,5Bbѵ lojly@κ*TSe czvaumLu~>1xz@W]q~t o-.-`׵7t{Bom5[ry"H 8lm[\l7(eSrܞ{D: /JRs XDSx?GyN,2xKb'T>fe~n 3Gm>ellΎKˋu??C4qv2k6Kypvs߹3QU@l9wcU=1q@ZN', 0]-wj;ɊkM4~=={?nii;-U[y^vh[mGw 8C TH7s,I?c>nBe⡵9c3/?Fok|n1sQnhd }eY˙"Yo ?Ea=Ht̆4wY#.=,W1yFo7ؿQ8ITm wnFֆԇ}mur5f{·I.u+Ƀ _xg*/].' YnO! 6WT901G=wJ7x cۣT+Zsb{^7#򙃵d+,/DW[(v%C N/oeM`=[FIko{\ÃSM;*weg_69VK/x0[Cߖ}b] $*B &O&clFDU]-+kC`Au-@L[N+ WPhToGMEXr 0)f 4Z7UUG[X~\vNZERjXpU\ֱg뚺ӱ N{ eA^BBHL0# ܬ](DO>:_k1==ÓQ+"t}po'²4.,^F^8,:E#BTq`rQei-5$, uU&NOVdރmU~s::$H9Vk8G~77r,|!썻S1ǟ 5,"qHϫz88:+2C*`]^k. vB.br]*Ebù8`:&Hyk-N3#>B0VFh1Ի%Ѡݯ%Oka?O먨%QD$~ O"9bS`T &م3 3 O~l_I6 TT2&߅OΎf5TMgE=gV[Wޡ4i̶cYk{b1O< l.VUt~Q`L]/B69eL1'vNMĐdVs~k$F)a.&BJtu?Ob8r;%r&VlysXH?ݍu^5΍ _QSsd1YH&1+E@[XW6*E舘 խSr--C#YkamDA3l$p^҉>$~o cnA:/> ~1rp4SKOp?("e!.U ٔLWTW/tL#lXD@H̞P% y`evpnׁ ]w"m7^]TU! yl=,45> :ϯ;pCi*.7XXi! ";F 0Z[4=5݋[ p* ~I]FGGߺNZm;#>Ӥs "zrΔ Y$I$jOy D9?Zn3 VTX+?~%2K DBmSEī]FcB{#q؜" +)ԉ$·/ $[M@^|DI3zj]技қ,G)^ EG]Ȝ[43uRi:+D2E;iPT cWE2IF[Ճf$6 5 60IOM6kCt"֫)]뚮Uގ)N:go&"sfb2Ӹ/3f)S_1$~S&!m%Ek:=He5#cwD=p;{}ΐrD2~ %"ҿ5FIyq ʹE/N,ll #1KuiL˧Уv˅KLK-389>-y/D|}*uuuwX!Onzz,~*tB\w~9oU<>;TEV׋EWY=c麿EOTݭ/O`9m8]F}טeٺr\쪥ymY񳿴9uJGM#GnG٢>iI"}n0 cQ쑳u뛫4c/n'vЩ{Wa@/eb ^z.6"&@ìXHVgPP~xYq1fHR`9@o"7It0bGC.R5A;P3>YS8l?Cc ^䬢{{G>@ۚw^~666Ùye+ :}_~[Ϫphhgŕ{l sLS`%U6erl念UU#{Dp}2#i ̉萤psKdȀEWj#Fqo '0'_?{S<d{AGdC[[m(jxOn>ScTvH'6p |gu伒}{\{WOcNUZoNMC7X^ ݐ9 CC-ArGn)DĩiLNSgܳb[g{63W5yhߒQ!rRiPovjhdc(cOlCAHG9!!!k~v{E-Ghт5x={Ira uB]cV&C[1nhH_RRhB8oL5H "f¨uMjX˸u,ulQ1ww!d9}^ozZ8a6K5y7;HQZqˇ晬e$x쥌.q^#;J`;> <-Y_5,qɍ~}/5EMpIGa+ ͸"xlEvJ~{}k ^K._.|8<@*yN^ƩS3]۶ZGפ(Ƅ(CR'Y"@zsr —lظnmL i/j%@xɋ/zi(t)[} -K  :d s>`8tvb4x =VQdq#6BPlg~!̞$m0cOWДλVR.N$^T2E4YPȻNJ M .Q6v_nONIf&JƇ/0!(>-`qY9h>~>R¿tHk(7x] )7;acԂX\nҫ\DbĒ QyꖾMLÔ?m~-HODl=X29$l'vquz6U=$]jYXUq^;1яW4;s^r-RBRUمH?qt殕dȗiQHi1WCϥ)t~t9N?@3FljÏÐK)0J}nי7YzIPog~^茛\cƖAu M>z~uĽ}opcp5l_ţϗ%(p. $bp.;3xQ#j*{* (Of%{ɒ`[k Zm1Aϔ Sf"ewFơS0GjR_WV$qD*6Jԫ-sY֩YL#auݓnni  "2AaS&æ!d 7=s) 1~pN$s}X|uvBՈhRdK>=b^h8 S:ԛ:ȳþMiHJ:W`.Wm`.,w"` XY]UR;ΰ %M%,6j;,1#d #=׫8&Qm^'˰7^S"+z^@HZܹ։l`€K% da5K}oeB~KӆVW3Ո!ӒrZF(J!Ӣ[Quۆ`JK AkK)l7@6T\j͡J 4k fKw!z(#U".90/BSj bCk61qgTVt|gt>%){MδӘDK*OEePQsÅf=9o(Z%W `s6%B{ciY`* l(T7_АJڟ$l\(1nXAa:F A,8h.MJ*CMNG/&hM Cݻ%RPu_x\:}*YJ}Rc~ihqW#/%0Hs(5ZB?ݳR~,{ ЬIg-gJe~)!-{_>=6Q`:ni43Hǡչ9j^J>nF"%b22{ I5"!!},g3#r(XwX]'YnQFua_ʺnzR}eYK^Yf%B sߞj"m\+[ ]i=|Ql6 Jfv~+sW{E =gg$cQ]KRvt CUuamyi\!t8E$'[/`yQ+7?8@7G ".Уl'=ǖIB)wb7=6Z<,(g&UEX1(-˜]{q`4%4BF铜揍k1ĩr\~L;Q^ ~Qh>UJs9E4]`~tN% q[GbY0d\ׇgu?4%?z Lv@rXXhS1!\Q nT]w]d04ڻn00^HYZ~իZ$)-J_.`g9UoldiK12>n^7 b'փ):Pu ?T hh ijɨRtXe$"wn&(QS.,fOy̍q)Xi,QZO>/mJٚrV'Za#\h[%w (/&v_o<1ܼzUwwyj j8myU U6Z)tԇԵS" l9znK̜H-?#pcez\{߇]"u>貁V6o`깵k`7%d5^(F\$ HBL14i%FP_}f$NsSH Uþ]3#?tӯ(~~fGhFJܘ-"t |.dzVxx\hjW,gc$qK!;11W]Aߪ|30yr5"uB*+.foTݙRDv4.߼@yJLQ -e:XULJ=+X+^x IԚv GfB~zTK@;B},"Ml҂Հ;WOs ma/S`C5v_qhM2^))PhQL)WRP%{ (p:WM) y\X"hzE9O%`ܶEfr Ҷayd3=Z!ۿ_/_8MOBSiBiJaTbsF8ȝn\|ktRoSKMFДH?b7W"|Ku=2ªD mh%,)k&7? ^ *; %Wh=l^_uf۵}ğ>+9^tb64v?@ΒM8wkf[U}'E#/B7>2?}P>1x\>5 ]4/ҳv5fTX^*'9W85d郌H9[8SݻgFķ)3"ΉtD4_p~sl<=_ޣ?\'<<.RnG;V Q.)"*oKdF=sr)I 'AXR-찍*hRi2 TOR˜څ}zp̵d.Iri,i/_?]eFGW"p?Cv|Z8ӛj/9/t6ڸc 18ڨI6._MMNej]Cfo,/xW6(~,̴T^$fX(Ef^LȰP% C(K>!7w5L鯯(­ zQh"ѮTD_~!SPD1} yM&UhSDfL: A=O]./4=$>}_Ӫ#3SY )h7Au3JRM0{wJhh>pq6Yc[PɃKJHSUq>bET5k2nߵA**e/CMQUњz?|aCvS!Ky73tYRs}H]qaûb bx) /+!K/p8vy=s(OolLR;F~N-w]+@c+oMEA-d}llJn/b-Sx:KRn̯Kֆ `ܫ_ͯ/H&cTl]\z~#ȖM Q j:'עnydjnW„dQ u-;bG ^lM OmiUל'ʏxy *0j&hspPk <1ZOe_\%'gҶn K TOIEo+ *l n,nTTc.v[/鈐4efI\M9'z Ԣ~#?$ WQQ^%z͟+}gڇΌIJ̅fK(},x @vvx6bO4HfIԚiOFϩήl}i4Ͽm7e#>N6BQ䑝(*ϜXEYX)(%I[J&@"M3K^mͲWxcAj>254aUo=?@hL_`ۖD[3DF.6iAqml*7!/5ׇ\Vw4/R&gLnOU3}7IU澝yXyW2HJo]4&'ߵQVs53:S W_;qY?Xi\J岕U->\V3ɴ[)9T-̅BiZIq8m`yؕnvf^d6[۩ˮ,M.=E`Ӻм($X2 i} 8%8cq&im;(()uׯ6V?I,OAG\' JmOH(nTױ%but r/}ſ% Ok JЧ9$ҦLqz&N6,J'@b.Æ*=(C[%'/GzًciB)n銋PcxêNd1[~Rp+(c``h -Pc񠺻A8!}rEK'@sRJ)ac<똍vT5Y?:axWθ {kS#T-T%KԡݛJAg_>w5ABɧ.? >iJ)g#YɫB -CERNU={TÜ J,][cnNX ֚x+?I皢 ;n&,ԋ`*q@nڞ+N =/oGyY wFݵ=⏍ţƬKEIIg54fUd|[I^$v^כ,Ocϙ3@Km=o_8!S=upZwS/$ٕ@9z/8-!@¹m <-\jBJk~';a!K1x Fπ (ͫ `pb axv^ +NF/lPY! _f#]liϊOρﳨ,O$m4n xؒR 4 Twk^j9SO,h6/XȍqŘ jTSJY}7Yt^f-6śk1nxZdw"2utYZÛӉ rvyq `KG/R<.["P 8d ۡJ;4h4Re`6229 gpʐ1Z bn9Jtg\(_:.6o9e9<Ӕo>:v8gl3~=qC*OwNën:s5˩/,Yu4.yʟ )~ m ݬb$8ma~yHo"7d'`] DW, Hi;4(fxfK/fH^rMc2߫eoY~ʹiX?7ɶ,#?RiPcON/2.NJ&.J4?8owi]tl/-i8( τ%\7OPg ht o1 @.Z@]XXۿ[w6C_{xjzIl7BcL&{&*,)#-/}W jRW??Tx?#IAGIJ>!UfȞ2/z䤆3QT7r94E(^BƜ場_SG6Og{dWyTDeAߥPg|%?Λ)9Ipp_q_vi僾~`[لbXoOY5v@TÚv%Hv*dl[6A,7VcstS0"ns`܃co3O2 թ} ߅WvIn;~:5 )؛5Bdž{;8:w6+#8ztW\oݠ³PWZ'ՇkZ׋_$M 7CDd{kE8b) ~3m25ejD7)7IÙu{=tfSo|%6v׬[,34]3}x~EdsW?L}G)lφwe_)c4"QU]/~1cs&*͵_ļ`6˃ Q~x=<;B#+z1['a)\8t.;lwބnF _^V]C=smi'S.ٻCE3>XNh &V=OP_ƿއƘ"{Ah*K_+Jrw̃緷^lrxkV4RYPm˚a< c|mϋoYM!+x7iz3/:Fex>y@d`o#H{Sh_קHE@5eY3FrNxw$gк&cCZN,'{4 j~卶+ !M?Hh&SWT솠Rf+4n5l+lg[Jqh,G}M iJ90VpSbĜ A.}=OLoa<ac[BgQRRT=1>~]i+4ƆTIǠ.˹1s٤ZLPaъ' J=x{(c;,Vh.?C?] h[lf,VCӿKo ݼލ}JuHWIa"/bxtdA=m>n2R2ϣ tXMpz|_Worõ~d[(T} q Ĩz>JD"=0}Cb}c_bxBL2s&*˧ϞOYJN.LE[Sx+8F6)Ƽ6dkO/cҽp2H,ا+*) 8%*e7hF[G>[[rחbb""O6Xb3<(wl_q+<΃hTn߱,ĺrnOⓥ_@BRz*M#83F*&VQbsk^BJ7glc{ ' ޲Z kwkAKAj0FaЏ&~P'~}79ppfpU0c+gf'fC=]Mhˈ>o "ՕxZT49Wsd̉6eS"FJB@p߲J)db~-' -lɹLxmVOЛ+?rz)Dq?>Y[݊b_ht=M6(H{x?Y::gIq83d|K +ڗ灆w|k<\6=Le u|΂e߲jBn8rJ2ZqHf=IZ)W)`9~ Ӭjt㳻#??MkT'jeqax{/ Y>%O[ﯜ'ʾTb$iW`[ޗO}΋ a YA_jYO&uf\GО=/.o' ݜG{ǿînoRϨC̋r i8ln"ss㧷p;W}撥4M@)xZejW#v5o[b~4@d+lFv4"}x$ I2ΚzD2[WD1)B&#l#o/J|)F1W8iccW -)Xjg+OL4HHW;j ]i28%44M3_T,'xaInw]iGReR[!?Q8f_|QoM17ΫWVLgKAK^9?4M/^0d#ND0\A05x21d'c4;;g+ 0;{htolk]dwKEILmt,7rݢh$E4;٥kxb }3h$ K(lau oCvJm{bs>b5-]-bDB"0,w2IK>!Ԫv"1$wYr&3yyFxTΓ 㗚U /PV绳h%0F~i[$ޘ¥N6<{b/IߒI6^eysS'º_0¹سZ{7zhI0;%#QpG[Ģ[{ sIyE W _:Jc0փRMO_!\_̿$lX5#1G`IdcTr5̄kk3镉/c{i?pP] )Ԣ &8\lTS(2[ĉ*̣tc"C m~Y4b%.h vKXU4w}* $"]LEO ?P=GoN+#`ALY?Gg7) H`^MҮmh~X򠨌Nܷ=p%ȶ/q+YiG*-NZ |#sx;:HgYC*8X4h-ەi;qtQ__ g0,օ9bJkR3NOtV#n\ܨ_X𗵚 [Ee'3PagiUM.Gxp~殊B>wEd)7fT/jJkCP}[Ӧ)TAZ萹߈B>5 MڈH$Kv[XIj#Ws UGDLV^nM.+㕗QPhOAuM-LJ ^P< J?bP"J{]\d$xH/]଀'uؘRhN/Mo~N[C/",B2\뾍/ ,E.s "JBvكfԆY[ B $>F1a!λnGpQ3H?L|I?.T(Z/Aڽ===FȨƓNrtjD)Lg$԰d{~Ȓ}ddtvS bDo hECOpД/ṧI_@F]Ƙ>קgw 9dr;:H{M}$8_vS@HÄ7'q*vXV,|33K }>tv /{ܲ.RSEN:vF5P6rQ*e/!{zH_4TKS"xO`7/ /~reE'1@͝ 8["Ѻ(/zW #F]/ٗu'/iznnf8x̓,YS*%_qH[TZ| QnR wT3MwU# ńZ,(D&z߭ i Ycפ4OmO3'h23(ΎCVK+J:Rbc>subiA 4>thׁ'zm8o}w%E薟$JXG^S}JJgɄ#$ #?ȧ'N&} 5hCiI1L '8~{-Z"T=PlX5UcS;]%.ǃ9cǸYE*׍EE.ZXuD>q3<}c ߥA,Fei)0U3b~ jvyޮĉ$gt^T4֧m@JuaaU1'B{(DQl"%(!xj9/ޣ@k}p yy-݃2^HDÆ޿ڋjɩ<Ƽ^1O"qגkU|V$FIL]ҹr~{|uJYzҰ. XY'ן[w(˳Ů{ڎTسUrTYAE?I6#J!6S-M~ܳ損l?fN]F8PH=ALPlK]$cj47Suw `ױ19c&'g(?dDdY&.5Z74BhĭҪ߸Bw ARZKWza\0eHH6Y8e} LƷԊ=ӕ<+78n8m?^z9 OmK¥ ' Ć 2?jҩ:cDVC^/Tf%{\ _&Ys%(G{{9Ivuk7D,#Z=› ޙfXSH179\:,tCǧc"9 O/5y&WSJB51-FgrC2PtbV聘hc">/H۾j8Q<:p;7*cyX1B, C{(- &dHMʹZ'G.{,I:mBVŅ+'yxD&$*kۤNtyqq2>)q#RR=xSnJpByѪ}nW>{j.w]ԧ8r%T1c6^r~po60lc#S˅Ř4a/4+SoM?<<?jMزBOdLUtJ0䤝/kD|,{`Ւ3(↙D_WI@30Y׶e8IO%e*]a-[̝}s)u{B- bU5ww$񻩉S:f-D !8s<I6;H`Üiǧ~O/>xxioAm ,|<W֭q-k h~4ӕёR_aJsu>Wn:C?sLK/O:AyVi%TRnLgCQάqZ,n_^FD\rT P8TeR:`rӿė6PwNٿ|~o?!DPUedlz+\)K`g6C +/!1>LJ9-`mV'-.[s@ttFY,B#'? 6 ۑfu{=y;AtRG+:?COfj4c|6 wIsfm2&WA.vz.*D~3W+?;Yzљ%RJ#1\p2'P4lFs-O溎CGꦋpk)z^-UD<I-nst&S_SoxcCڒ{8a?X$Q4ӐtˋL,XZǪ,zZ'$DRUU%yLxZtt@+ʖg\ǚwr,WD?ןmvAJR yG[sO qx\=n\5!~֦ǟ&2W󛸄GI縴oey+r#ig00K@|Zi#P!ZF} p` 'p0r_U!Nsv6ʼnZlm{< }f}z䆅r WGtN!8b_-6m)+VUz53SW?~^xn:{!ke'Vѫ&!!A4g'LIpQ|sWWX@% n4G[3Qy5EǭNfizӳcBCݲ-@tO."?T52vjCsn0.dתۨI.[:WʠY2FʨmW;9 vxY4:{697A2wͯnhZI~BzIs05㘍:?ji򃅬cTsb RϚX|i#at赸ͻ\WlȞ!,6a]X/nHC;'6SDit$ "+igJU_ u 沪pX)}]>Sd}PF,:}j:MZ A ECQ6$$ZC$/~c>޼?t,2!PGɍbݨ#%aRR"`^om{ OLY'.+!"8`->w;~?c侐bFX#OS5J ƨU7~QxW__ ŏ^Vq=OUJQ>#1tO8cZ}!y(!5k"izf *JaW =NSR:u"a~Ɨ\npg?-JbQVr7:G^BYI,g-z]=;sA) ʼ]KOԩya7֧t"5o5yCTMeQdz*rAo{=gVBi~ֻcxv}YL8I"Y!cw6a%4B47PWåf Yc>IP| ƌe_Ʈ_L81yCXm%d>t$-0 x2dxTǣǝK!0@PXLyW4x#|虜lc,)ZwϿA/]mte-2R8ۈ|)@.d^ +ޙkN|kr-`o3ts}t8twXb҅ySnyّSܶߓ'),H]x]8;qw.3wf2dԂ'[W%_G)InOjUb/^=xitJP[|H /u.L?Φį~[ З-j1 L:gLV?N=BnҶUb98n.F!6uzmU]du]iyNa܊7LhXaJ)CsP]PO4Jtw+@j@}*4y0HPS MnLZ H K3DS&д_׫jI@!_X_|Զ0㎇{1IwB4*""=FFU ̹{ L_μwxlPvn_~j졥>jtH}֨z#9?d~d|ʨ%ErY ;WI^K7]ɤHnHF>Xi\GGBgzp{]_]޷qlq9A{y-=4qmv G/sI9x|[2mÖﺾsc5N^hOyS{heG$ӥ د{8Mx~>€'㽹?"yVHG i#fa);@_ejD4=q&wog0zqmOFy#{kfu2q*ťq}O|e&<2r +ܜ_ ֭N$T% uKX:o`E`VR@L^`~h# 뇾T-/+0'`L0ڹݏ,̜rh^ߞrS!y2C4J !}/'Hr$wRHTF@\?)b??:KZ3mop*I W|&c*H@@G}λZI9Fh׾641M+fÈ|ן\uE.=@',bo= !P|d -gd!|? 0 E"_b.\16v@J|͌71}dsisY Oe0JMC̬uwՂ0 i+:j8y/=D6;ۃOyRS*8콲Mȶ_HoOJV:|pv<٢BT?; d_\I׿ 5 <#wڡ~L4I~#jқNFZzj^9_mQ'{6A f j;+mi r=0aH|4/u^no|AT-%A\Y9YDgZHR;J73ϧ۫E`3OGL%-;@@X@6/ZS<⎆,^s2UjgjI fadС#`-rv/>ڋ.r\H+e7t֭" 0|0 ZCl%7Ȋ%7TQ$o7ui+1c2壸=y/D,nxf56BC+ؚ͈ t&6mMOZk|SGdY`0I}MM3U˙SIP ⢜qzaN(UMdA5 @&\#}ѩD|)"-Cw?mXչ7;MUKeahQHv^,OwDi:p<#8,92kuj'as:~u<_ĭs>YudfՋC{3ߵ Mx 1o @֫KWG[d'kuƗ5\H< #7*CQL C8  we~2[#Ja(ھՁYZ"\ &*ĥS]e%,$ZQ!; jFXT,V&dgRw4@{G~,-&[v]!3g#+8Ϳ=gcrpj ד(w=cM}&IºɋWt硶̡rJ\{ +D cm'>KxK(_G3TL'xw~[n9g mԔ+!Cfƚڎ)t0'ˬ K^,?)e!@ԹBABEM+eZF5 qoD*G*P/.qX Uz:Vt!]Zi]*\ڲJ k~-5;rK.'̧>ʿZvҍ|ޕdB p7eoAѽW}v>vOnfzrrdc-Cxwj3ۚuo6S|Xv\:) 9 au FqND%ch4v9bvuމjhĕzpY[_[3w i #,wE@z&ZR`œP]]8-fxHִ![r6KD3g pػŽH ק^VzfМ_^ֺCWMmRmƬrYT$=zv^Qnj|C ܸ𛶸3hv6)ij_Nes0G*zyޮ F'}0H۬{-? $=p Jx'4Uŀe ge⤦g܅Ϭ})IQO4' cL98>=Hz}AUlGEY>ʑu Z5pi\A][A2{ P9#5^[* \ZZ"NT.,":~N'D iSyᤦږ6ePm(B;e\fYat˭N1|~4qIJy,Z'~mzt6r?{Ksð0w֙X̛571]Qxl0@Z} wZnoP*AS]W u)FG`sSg/D.7QGF%Gs #tt4cUm[,$LQ!X ~i+gv׶ Zϳt+e& I=IZ8t}LML*ZQp/+s\;l"%OΛߩOTje>r$Xב7ѡlWe ]j!Q"fV[\S(8m$ƇK.϶a96D@G +yVsKdoi6{`ϵuaW~{W) J mJ|E,]8r9evqgM 1!%AJJ2:1-7֙?'LAAX;Ogx`! ޵ נ\:FhJml8=[n؆>j*#J~.˳},WD͌+:_2sш} yf0pLEp&dϙ {sfr Huvs ےjVÎ@SĔȂ .sVEgTTTfmomide49P`~[P5iQ, U~jmX?_`vA.oDTOJxٖBT҃tQS{;!B); a=ccc|S^7OtJN_P `h @v\Vp^_E0_;Vb_;xf1ٙP)ᰘhjvC|%R=:ֹ$;i_P#2Ⓟٳ6,_=G5z#e*X]9'Rf|8*ʊMnS͂ԵβNG[ %'p o坉0_k3;y;<϶jӾR(5M)X *taƍ <)tmIx^}C'z][֎ ]XȷSd) 0nn=1KV)XEVVdۘhSS>WKXW-2rJQ?. ev-E8ZG_3./1;PaqJFO U *TŅÒ"93{4@61d*[3e!S{-aӰb 6= &KjnqJT>.D@89FPhqAW|&>@3~dxAb'|viUehw2,\]Y9谷.Z'Zיg\xM֓W33{Wᗛyɲ<5sgy8V|voTV`F1A zYPʊՅ̃hWc0;T4>fsUG #/Kw " }ĿrEUR*akglPyv' U f/s߰Ypw&|! |ҘW:D \+4 <13`5m.Nb{6'bak&,!) ]7т31YbGpOhiɨ0묗;/"H~96˧fB9Wi)/_7nߣ/f,"ɼ-uFhh7kNjvقة0%*ż`0וe\HsR?Ni9O@&l @ aӂM \Oɑ3_}0F }LNA[VSvD|jg/#U"{(, ø3~,JM#u+N)n?-=6q~?4 ٴӘDAWExq!W2a5eGkwЈ$RB 8Q% ' +g>˭F~ 1 +Յ-bKm ʉqu඼憐K>1ax T^oD vOp-8rfadY ;Qp~K |N4ͅ?JwG\]HH-ȁU(:r0&!F{;qZ*aߙ9%$E늕d \]r5m`!GNW$4+!(QQGIcd6 k/3t GP)ہ,4]U4ys)!i#$ WcRXXPX#Tp?~լXAP`r2XPs[uqi~#iɖ~V˜VnL"_k* 𺠻!vM" |5yd+-p ?q𝉟6HP p9Q/0? Vcdd@Xڎu4-u^zyaao9Z^$JD\DHf@:ЏwO6Q>&}\aWŨHi$] =GCoFD@f8>KK.H ~o=ݤxx#V\k=& xpɇQV)L!$Q"\U8<pYj4\ B&};V ?S̎;dNo*@ԧbCP*kәUq~#R;<^ԊFL.EFַ^Zbd $lA'%Xl}W7"435X%5h(%/MF4 ciSwJS݌i&nڂ,z!\y)Ʊks =hp 9F|y i}hM" D.v 1@Ѯ%L?"8kG:cLoFDJ)`ا }N}tHVRw_^jh]yB>Ùxi" C*l|G?Xŝ^CMr7|E @,P^b|M^)!WBeNBQTTSU: >cS5{žKUZduܨ!lrr2o91v e6e*NW#"3xTT' Fdy) }/D7' 7NbwIY){mC:R|j'=4T֙1쟙yARզxoZݨ7voƮʃ%g1Y s[ @Z'屵+0g疛_kF:OAAjuoXSAb/@/I$YOV@BZ =Zʹ>xZ`g{nT d,C]1ӗJRlϢRt>+(-YG<cmmUAix̄p/Ɨ Dtl)2lB IGnѡ.;nNW~*!a$y-2PQZG fMHKj0u\H!l\S{wCW@~߹-eB]Z' Jc fy]5"m_t-,姧%쮤 kShf}c2]U\fNt*! qCt==z,k}m{cd6Js{Xև{>᤽Zs!f_GK=&ED3Y/ fD3"hzA?77rrqiӱd(,3E@ EfGJz'J=I2,ݾsi=/iVRA3?QiQA,W{W;BcssQ>)-+Z#~# {u寋.~/=<ܞzP9+.RossA IV'QXBf<@t%(u#EnOCD\% ; a/xT+TQ++LP+Ƿ?7S?\ *ޛ{)@Nxv!ar2|y#,_hph Q4n3gj:q(cbbjֶg ]ZXgG9K4T!iCN};(vbFh; ճ!n;Fp4>c(o M|NK`5Ƿu ;-rM߸Ha}&J+v009r!૔ ?[sPnmgW[8's}cK{Ct%+V rqq~V{"ryyZ][[[]]]#ڲ~ a=HFbp#\C5 i5yB* o trRd gH!ѱ`HaE֓^,jHz[}ʞێ.\ՋPATeƔӀb93<}5ݯHXWTZ]X]i6=6[g}HLiӴ1D1[C򳳥]a5\l FuWW^ C#cL +|>~ CC-_j /%fc=w[sO E^dFMJª/,hRir۳M?{|Kjjj~Kv:0a!0ahw/MT%߯wi<*zHR+T{/ ghe?`=E!)P$jYk5ܟJ%D`&\?H2huZ߷^5.5q7XKӷ$74D_aX>2;S֠7.| Y݆>] ڟ.c7*3PQ@[}Gbb&n^gƗqm,K$9:QKw܃a587-WWW[g7MZ1ZU1DDg .OD8 7݌ dF2}^/Di0Iee ny+R;3}޳&GcU|$o~"q+jkBoBQioh!FE'r,>RU#=4oz!q6LE[QC6/c)"lc^u(.Tǿ9Sz$ݠNɌp5 FY6EvʦjEcg݈:,ԣN9#$c3_wuV,c/IDqnҭ;o[_80tJ]l:6zC,, KV*+ ڦfO8lrt`z*ǟt?8fHp̟MN 1^{;"^jBJf3iȳǯ9uJ׉DpY*kEꎱ,ޚv0YH` 7kB~7qz?# RuBNttHZ+ aNKiޑ2qRc>Zc9juG8,{HxRFFyg]&3xٕcFwı=dY;+~-j&(K8XLedCId,C^\&tNST "_No1]?U /z w"_[b8GfY}JpEKםsgD>2۩t_ n+4k1Z94|] ΀6؇6H p"wAqhcB7E~5AYX{y3,_E\Kw~}$*Gs?]AqrtyO=< WNPj Wf l-7#|Tˣ6ؿ>P ]~I3,չ^9llX>Ww"aZuȮ Ebq0^DFD.T%gj"E3q3k*uknJ !'*fe;G?hB~b+2$;P5?n~UomwS((fKf'"ؙ!L]5cK{TN<^URO7_(Pq"]cQtv1΋Sږ NSծQ(rF#sO-^\ /^IVsK\i -VǦ23M"+-!իйe6?<]i2AejsLY"ؚ׸f%(?f/SU2Q+}fMj{zuV70.9]?O$lP59o63ެ1X5/X˹"L0%1d} ^1o#Ƌf3SYu}K$xNcJPZj~˒N_9=O}~38%oT NAZ{PA3:⣂¯b"jV0l_b?z?iQof2:9 MA@/;1R-VcEa550 kmQNC :bi "•+3&dF/SS˫wTX7vq(lg<:CrN0-e8rYR\*V5φgXici̝1fm;d/ʏ.hy]<^mN#ryXJMؔy[v;{ ovUsN54 /r;ON"5EÄ1!AgQmV\ۂy,N"Imϴ=Sw u Hͅ3}W &(d6,ŗa'[2?rCNn-n RK0iZd69OIHv.V~QH:>j-^"Ɇؚ搑)ԄxpGg5?vD%Y_u8D`kAz-ίI15 ~GȲO 6Š漄Zyz}2Rg헊 : 7|eۦXWG?O)~BTs1S5}uՅr/u<&GCKQF$<] @zY &6cI 4ST]sDk@ W>T,̅G^bU o`"#e }4u442hIK@iIq!;Okf3.E.Ÿ(dǏVh竈 SSҽFkGF'%[E`7@2 | qh|ڑ0EQ>xfm _VZUgXB3z67߁Y֤wzݶ{|6ro3)UDdg&x!r7K{ ,?`vE( ߼^3<ҴAB{lU u/u Z :Wj|N:UPtXV[X}}KZ#Yl(fYg)e4 H7MQ97TI{a3Eg |AgՇs3>F]1,>sĚ5q^k0EEcDzvK;oNuGJ3yUsqNO2>ON ;+jѸAB,#, s#S9:e.\ HS`p鼦3i cVyv?sFaoa&v5>S1 Z5.S}7.mZwR*@UxLNvSPK#Xh}jFbڄv6xxޕ>xӲF$}Flhckuނ:d1E_~->h]k lW/ 7SWl mLZrݓWF!Ț4lXG'JZ/Lx˱A~&F?VmA 4v #Id)t}f325|[zz&.EV07>?Lop#9Qv7ؾ< 0 }@t4u ҧtޘ>pdt Ztui_(h*>y܋ Aʜ/7p}񣥜:R N9;$*C_d{3.<(ڐ9ҙh;ɟ %΢ Ga7 OMWT3YɄ HnH`ɲUS}YaڂT.d{,:t3;!SGo[N SXJ{Yx<b^5EfnuӛSvf3~k'oD؛9k /-WR~UcM@ 8K)4dF.fZ@o鮹Êl opcgmVǑ H=/Hܹ SZtꍕ!z\{ږ,]&8ռ܇3) }mIBmgP̏lv,8M/% $4{\P};,.nn°X$s߂6L9m@$'~H>狁}5qDOA45<<!R YX߄UKOv(Ӯd 3#$gQG%!-a:c&\cXa>&iLiy*^e u)d 1uwCJp$ cZ{.)a!+*a3-s[fx7 Y`$ %'.F["o#`Ͱ'V u2Q2BᲮeC٧CIK bdϚ&F$--SEXuJWʚ٫ U爑d2 X]ՙjޠH ث;~ze@@p°)X2BQձ_qmg/QY^R4|N=&Hd咮hBG0'J^F =vWƤra#.pVl%iHSX;aa1P(ۼ6,h +o3T4v%]F򡚅s;⯌]>l.iE^ti滖]>>牙AJS钅Ip.Q;8Z *B4Fz ( xHZe &*T< hefK;3g:c@.bAV7+rR?jwKBWTB}"*K, %T AÊ7|",4F@͢jcrՇ+czrHgAԜ(uEc_cXA[G͡$`Uhn`E &;R;ﶩiNc*Dl8.Ռ~Tq_0ݹ.Zy ;B(C.2v$5yX^3+Ȩ#pV]% J;{Uw_;ۜ4wj6$hJj d'2)eOS0~\N3пT!u Cr5A )ma?w&DRoc1^{Aw~DAc Bt#I@KΞ@^CWTM\ifpF+-r~QDj9I' $쫂=/M3'cbuW_m }5wa'Z+Hhe,%ykUxR?b|Mݬ6_כBO=E Er+9!>yJTOқ-'rL .$$Ӱ Ћ:/ >l`y#ge(5Ud9Pn؟ji+HhE!% [s?n%2So7|.lM9!$"!r>%ߪOFƽٻ`AQ8}o_0sՖ 4îl GAmm۶m6Nm۶m۶}ڞ>ܙ5{\2#*wC &aS^]PiԾ,;?J\䒳Tq k(]mrŰjTW[e>%z&`Lf6,\sVz6VJMPY[KZWA^ϒt~ CDqZ0uwr1z k Ź$b0B'rel`QDT9Έ(9+u58n1Sd|AlΔ,Ir>۷\Y$Cl˅%6%v"hFKvX/5Z(4VB`Ee~8,D%|rZ yq\9 'dу%受n+ҸѰ؆ZyltFG7 59w j_ږF JQ#k~̶SY0'T].-6JF%g-4py*Lh vN}ϊ+Tm5|a5!J2b5 +ˋpψ.dڢ T˓,{W-YH=INEN4DQ QQW>tnl05T2ZvɎqH@'?w/%N[1DC"%I *;uUIq.yJ5䔕L|l-kp~!32+3+ |gfdcbc```fafegBOl`bkW&/+ X qaEfN<f8 J(C$/??eH{q8,.#idgCk`lghBncno`deohbfaCOoaC"C/c/dbn!h)lieaL ClclncmC?`:B8[ Ws4ge1#|fVZF6F6Vj|%g|I[|Fsbd`dfD sv46T/?%Bsgg{N::777Z7&Z;G3::zF:FF '[gw['6q2rwW60Q-??+P1Yh# c{GU5+MңS _frӛi\gmWާ嵄Z!b۽oS :S29,T@*Y^e[[eJc+?INR",?4t,{}Q7&}ʳ3s33ujЮkdffvQutiVu0FfD_3η+BoAN6}׽a/r &ٽN^jBׅ {fCA~3]~k5 /;{xa9x8n5 B1oD3\Nw[,*{oXIO uo/+o V/g6t[͝/=续/kkwں78 Ξk/Nϓ/냂1>c+ͦ=j󯾯i/x}_ٹt4h? d/׽.##0zhThlF~4z]Z=]ڟ<|5c ލDqk!IAع9Ձ󝬶܍g\Oc[hMFu .m9؟uo,ӜFx9>'.>cktms磸˾:r&x>!/M7s_ νSdY 5(F\_D>}$&]j&؊$c]~c$Ƹprt~gpH${-a׷_7iC/+<~"U5 >_>,K}7}:?]u~hw*(W+Ko'e9Z` Mؽ_]}9Ne[\7Ut5%O m݈6x,`≠Z}oo v,8;Kؓ}AO%|]er4Oͷʮlvv}II k;OBތ+a]W–G>up,яkư[urX `&`?ap(ݍl1?=A0,37 鼸 K![ `pz:f Ϛح\b~؜:31 owvsPOJ!,-ц|M.]hv6؉ۦ_Ǜ+%23_C5]NW(.(j3S6 PLS1ff,-f~y߃ñnv^ ϴQWR=z﯏3_w65'EBXvsG[|r}SR$FՑ\Vhӧ̌/tMzfJq~.]tO+c.y&S3'7{Le%{3~MߴIT천N{B|; 2o ۬׫[ò?|K(e>0 45k749=?,*:tGEJJ?A˼KtI}4ZمC\NGNWm -{%>@@-}m񪆡H,e LͫX,YbW%-y=J}qrPҰIu fCFq |ne,}u82Ti{TISyj$ Iy)Y^*JE$+ _6D&Bч_y%eeU +5L'˕P,)PȞ"3mDDzj|h<0#I*.,URGjE@Vޤāe_2$"lZkV-h ŦtL2M'4Z@apV? 28_d%y]aqcnB{ ?9c EgV&|0d ڰ zʒm n!E)FJ-3*A2X*O&/Ĥ^f'h+inZHlLd\HIыɏYm 5#-m抸 *LCV.ZWdmFBA";Hy>?@kSO8E</ߌU2"(8H}bn1g1j%J xLQb Hjt(z8DaMi2 mb`wefY0xgI}l_! D]ch"(L!q̥?ŭH(6hk d&LSU+?w_Y W& 1Lv#/ۼ'miqp:^9V˜:Ȉ=2A>E?pkɠْyGd΋I!]#eryZ}~Z Xjũekd&EӪKUVqDzz\84`kT@5M4?$".1f¸ ^ 9+2#$(iy0V x.РTҝW:Ȉg2g-~cIB?d>KiF!a# |Me`,at;؊99dZ۔nT d*3XZ I]vF$ ,]p&Hq\ F>b=ZÖt׿ SU2oRp0`R\@^ZU_?٬̦AYu4J]A'^F)7 y@X0a%` 2 ,|uL>Pkg}r`kb@4fpBn]U/iN%>|h/QJ$Qu5jˁ@[1q| p0%l9FIҊgJhH-aBzYF(Ђ6~Laȿ495NX{ihXgU7m yL:|ܸ#%q ]{k>n3"jZ dkXvԾHeT|ȩE&&|D|i(Îb Hf,T%v~DŅ y&z"Ldrpd؅8R[XbTrFhUYoUl݌BM@$齶 J\C i%8feR4OrrX3m@q.֒Auqg}.O? ٱ9gfC[gj/ѿr Պ02mYTsȃCUi5 QYN6̐'#rCRRUaPe.%#^> `ʭa]-N i(s䥬 !VL# EѓL YU('`gAj7K Z)_ [I(LGϾĂ32IzOU39\9ZLfr{ :KN7U .NiG.5$~U {lS:(ZbHHJ3+ĩNLH"+w/㳱3"8)g1D`$27dhg8BQ036 k?T7XW_C3&v1 LD4 8/}Z ,(Cu 9k1++ ԓ/Yܚ66N$Kf٣f8F,@)EZ$D6hӫ hO5 FKb1Bl#̀<LL_MhRWHÖ`%!% gb(n77E&Z^ HH^{H3r sOÆ . "gȘ% z R4fb(__6E191 Ei7Bj"u`i_Frѻ2l]ij)>rtA1W)nc%(=o'B<T+e%Ko:Ө4Ħgw4Q'E*ҵ+ղEGb0شJUhuS0n__G'fkRݘY8pf߯ pԨo=TbS=_N<4zF^D*ghw۔("ճ3;ك}nrz:71 o?\ܻ==?^v oZ^/Oϐö}o*q qS^Rm1cN_pdO̜ٽqvNN0¸8xAQӖ:ܯKsbp1]=iJ] ۙ1E| ̓4frYͨ5t@a/#+( Wt!OB~ɟATf3؞)Qf3Ʊ A\zz|'Sih3-Pch6*$?M*vw ˕;\ߢu*3荱WkUnO֬%jM<]mͽ)٭i Ϳc}7_N mܩwz qBICyu@?>=o'j <6p{ȹlBr#"mӁ,bhQqm#Ky ;ɫޛ\tgG aV 9HHlCtuG1FJe[7N2RSjg$RtL"t5'BQ]p"O&NߎW^ŐpS K1kOZ*{CFj+͑/˙^58! wV:aDXEaC;^hm;yiaW#wt6)AC+1"tW4e SFbI}Y/Q;q^9<$YӼ̇72: (>5~4LyJz1139:[#TDGͨ4ާnIi4}oI۱}2)ʱܿÉemNi#)}`>ihX@Jg 9k:N QR#@(U&]!˾|趓H?z hD8ȸ_)m&^p4V zSMP#Z mSvQf#cK_֣|$dj(4d&<&xۓcȿ=\:a-t(B^ljg'}mFJ“]6)QF^_%cmާ@!^1f9g`]DgzmM$ G2y|_]`өG9I͔Kmެ%8#p;{uߎFکAks<+sc4搉]At/pJ X0oGZGq -M#{3s'{>+8 ~gQmDgFFn0LJ7I}ީ>x380X̣՚.EDŽ`M Rae$9kuOBatAũTp]_Q K.fk'=?E^9AoZf7.zXxL.tf>Zbub qOD5Vf?!OZBJ&&'Y'̩wt)M-j~J"yN@|iޝ9M4K _ˏݫ>LzX́P_ZGXbĎr$we/yWo ` !cÅVK&v=W2Br}>u2ԶY\4Lז'ĴZ^zn5]mנ?rg&y+t?(0RЍ SEx_xíqNfmc4} Y푵 d `dlix=p{:=ڧt|f83>Op2 񚌉+)>NXprxzsXV  'tSj"d݄,떥r8*28Rsc,LG&70]qy. @E/vJJ'NؽoJ(5VZUc#OO˄3mZޜeω0]PuMsmMs9SOa<߷VTzQ؟L|ޠVYaߥr*eA[~f9sb%%*@o[cFWp7Fzj~CB枺Pahg7"c֛uMN:ZbM۩yGˉEUEPwCŋWzE[EI[ : Bːn ⊛q a;>lttڛTXy0 a1(7,o${MA+Pr9z+R;Rnd:1P2DhW"w Ei&9[ 0!՘G% J;S6Qoap2V@4Yd$5[zT}U ?,T1x-?DP^|=1.VV>6A Yee}c)kw`]]Df12teţNr)fXIhCJtG,H 5StJ[qH[D KsѾBNe#DGNlm* *6OϬhfĦ k< {9*ȍ..F$v#$e{wi%^>D `L:=Mȴ.SVήe Hry)Pn&2\S6e\Ъ# ?C?jÍOFK<xOtxaJ -" Q"Ή=Qr-\2zh+e`~32Cv \n)+SxՆjYم 99n v6x(8:l,6wmӫֽz=>0[t|14/6 dQI/ղ'~e@pL#B-7D7T8CY8~(]F4uvnp2#OمzPd]Ն?dKa$5o2{Bq]! u<, C]KjbXNz8 05q-ۺ{AИШeTaw&\3tEw#Kw^eޘ _'y0(蹮r ;_1;]mOs,0A]uL{y/u?b;b~N0zmn:B6پ{?>;3pgG?^NޞS=ZFN[ ~Gn=2D#s631S3ǣEG.p'g!`rQ2r[MļK##SC%[HńYFi(̰+NYTHǭޔť޴%QtF}A.@4jk:=ش˓fvqˬF7ꪋ7f bk s/mCtuy [W 6~7B>mKꤾtJ]IfVK *u/~-/ٱ9{ۓ)`-l(ލZwЗXpq6 ]㊭j@Wg!(JvFpz=@2钚.ң&0Gۛ1.fcCȶB{WiqFmVFi\{JYBrV0t_KZnM֎ڴ 'v!N"eb U_Qgw{~-=>A,B-(96](N^pHk Gbގh$)+X_D_' 6c8]m TfZ8U;)Jto==8+Oi7m|vAu"dcIX'=Gpb^+tˢbޟ_+5 5;/zc5߮l'H5z{Qxώ'6xsrsg'λv:#W'ol=W;>Hw\/Z9pU߀&>Ϲ!mX (1/Ҟs`ݙR^; ^rRC1-k~5OW')K2RG-K 6ؽvbqz ofW%4dƎݑJXYgEp!/edIPQ2=њznp:1cFy'UdCۓ5ƹZ/M2B,D(|#jՑbco. }lx4p=7?mSq] gIHrz8M Y!Sh+s ?C~ [ 7|N= "y5o-c}ey <)ԥ>}<[Գτn}#)Q _b\NaW3jΕL|g ";s¦f3|eY#o{1tNw5i+FxT;NC*IEvAɚӛwufwD^$fe Vh om5\7M ?Ը%,S$iF11(9YWDo|'/z6E.RHom2r|D/!Uj6HVƘGؖ MnlUSs%7稜$5ج^64̉:| K[Ʉ\>df쿞bYvVb\BSoGܫ)n7ڿrh<:`)P rq9ZCm\ka"rJ[ R8s^֛bCʙ~xky{v!ÖIV؊ vꁍƨzz7UFyLWQ8C9WgЙEͿq4^M%Bի!^3UM]cjL3NJ,IԂ̨֏ ۖ֔a_͇x>BaЦM{,Յ\^0zoDФ6-Kfcz3CGg2rɕ5=z}KzLxkx 5m؃SkTFeqR';5erc VEɕΕ=|@\A\d}} ]|4 !'dh`uGǥߤޭ~zD~gg"Fn`FoKسDEe{ ? ܏")vE? p#n?yzC~kk$_nGػK[ >XȖGrԽvއs?Ceěe'ٟf!7msTWǐ(Iߊ1l`HIGħ=-9 >>Epۃ7"xsR jt)R EBsyܽdt5< (;vH%Ʃ/]:,UM75ha۽Tu{5_h.#o '*SBVxǰLů0pĉ[nNώ 7ЇsP\ ~uXWpc^ݧ*w eKpQ9vT8p,ďENLvYʄT5KTסsP"=m,-0U1uE]cx=@_ރ宾W@Ed劗I8AI{ӓhB&oZo ^2tR ׮Uh yz<|l)݈P߄vbؖ8y 3k9Hnb5%;`#X70m#CEm 6NwT:`ritu,#/5Q?۠(Dޒ o.x<$#A(h#NO.05=,DA"ŋ|=U[K쪹XU3Mx߼"Ʊf JG+az!k6ZNa'{8B)8+qKSJM/ vq<-A}@D)(]ť}^ ` ٔ3ȸ_#L5sчiUG@>t :#1+RQ@f݂udjXQo!ka{5^0bo6U- (V]YZ1WP 7:4D-¶O'Hr M]<""b!ɘo"*_X #Y.YJjѻ@*h,` d(0,26\D_Z -()@P@4JɣKM"u!x`,1N`Dak$)2;\O?lh0/5N K&>ϝ ה ʛ<Wh4ߛ"h_7Q)8)o$"+$##}Z@'[l?{ .`P 05f m1c( xE Wt(2oeB *4C v Bf: =QLyF\ $;&†D&M>7qB >oT2D Ru U/tP]}گ4<$Jq7{Er/Rt6[ǔBSg,/ee8OD@|-:T#B~b">ox(ydFI#s[H+iPE\x$SڊY`|]q ZDt[B*%0j>}=[\!vydzBvRcF\4ClPuy :P~IYXP~b$)P@rS۰xL;\")@J]~6;%typ;Rn@Cw ][HVQ1tyܼTzFU Q7Y(pT~⦉7wpD|IW~.KCX$MPRq %b hf0ã2"ϒơe2y$IV_]&7J1:Ez_chu(e X%~&#}f>HfJDzZS&rtT/ZE@D FdjT+Al@|@P3D«rW ^56OhwcLa >m0#8Bs i- %]3IO6Tp@ mU;J&cm8eifC+`M/Rp>(4gF/ByVRi߼0 S WQ9vMtΝ#Uijmc) % oj(:^)Hj/u?v``)Z\ιÄdo@daD9)JĜș%[~[뢣nw[*@\)2>лlK)pypڄaA2&} S\[}-Fè8~0J3Ṑd=#O"!Xdo;.C@kIՔ[ wkjjwc aH6FINe鹇Qx1#r("V>#!z[| V^7QpHv<%A5p"c$!RIa n 5qSJ<軜(  ,"HXҤb+p.e/b5\=G) @w{M FU6K/+hN%y[u5\5(Ctٓ4B%nճHxzI.V`a/%6ԹM[=B4,1 7ĉBwK )6 h<~%#Al:ɳE?yxޓ^OOT \: Uo;!p8 *{nAp ڌ2f Laj5b&N֎woڻ sj:E .AuಿB&5X\|/zNw@rA=BEшIJt0M9"R}p{ 壮wU zry3( ڶ6PT܌f]9 nJܗ#PRL^b Hփy?# j[pH~ 6 l=A,˫bIRϛ-\iB7eux *yx$x\Ei?X񜈚ms:};]\``lX"vTur.F0}=\ * Ҡv$}b'Iudt}$MW n÷ BR ,4Ic|om:j*Ȯ& 3vZn/KRİ`49F SFFZ}l%V5Ah1 {B M4@"% =Our0SeŀrTCݷ_z% 4lĻ"t} eeS̔F2ӻTC֏˿ɱ Ti$)㴆;S,)fe]~4^`+F[=Kt4Kn#酿qoƄ Y\([eͪT:'eBJͰwcFU(^hbO'^ GO&ˉ AoM6/1YYm]^C2N7췈 IJ:Tg$e>CY$#/f0G]Dڋ2Jih_9> /M\Ҫp"u22Ug6%y/ Hf!'3FD)K=Yc}F {RHQ<c_9Tk/TaHjq VvN/:DV=sSaE2Z'ҦV޼eGpTa bON\Pts.*2@0(sB4q"<[6rp2# 0QT!AtI "ueXQr`܂FZ~>l:BI}@JKQhywJ!ka4MhZ|uR?֊YJoȔ!@s>51L~}~10"|bL~Ƥʯ~ |1%+Ǎs}:u6`ྊ榁#L 2`9Vz/w{MNIRw3%NCm*5P$gr-#vR2 f9[,+* a q= TJcQl"K\*hO2tbc+}7;6'!ZFܦ% aKש8)hMݦŃhHjoNu4RG_al6z)2l>fe߭:D 0sQ\x8 zY,?Z];v1BJ)$2wJb_k?Cǰ:z.72MLYWk8ޏeτz=pe@d68dDg8?6*ϛOFW,HE02a%`OZ1)JFMeh~`'n lnnuWd&%ەL87|*hY=f9Kd7L}e6QU8]șL"[tƱ2A^:9SHdOIjf wtI0""IċBV85$!Z[YEEI+SaW)1{Jd+pc(|Z)4R~.dB+AA|нKIE!_Π:gT0w]E蚿(%mJ+}Jl14JJ+;qV"Z_"$K/X-۔=.Q!x.%Xy_1C(C-y0,$ |%X:#r& :P AH˒F̘BNV0| ʟ5|BЇbOG 8I*>$4ڝIwzU#_9]U~T C%+/qZ]y vD! JlTcYV^TG5R?Av)΅ziK8m}ϼ r)8 =P {wV~BC&k=]aEMi}}biJ~9 `<L% VV 0-\:~M`XuF}P\&P޽RFᕡ8|Œ412I$o !ko 9aK648:/ za9!&diy%6ȩ*"X w)4|HE зRz-! N$&]zh>؂/_%[ +ZÑe{-JE:TQMkPW֡d)=oM!|Yq\aяlA! O_ 1}ՊBR ogI\EB3b:ļ29w| }ӭ Եbᷰ4#J^GTCL89<7~m-r4 e*B0aܐjqs1LWJi4 ja@5DFȺ?vZԨ(Zǜۺ%ցZ%h$E񑓒ED+!% PP8'U|^,gJ562$«9LT (KJ,k;CgdbJ*X!B+K)*kk#O듟9s4Ihkb$Y070-+Ze>$ J?^'Dn/h,i߽?+AJO87,TlщvX55pG"`)\&% ␋T)$ɣ- >V wHnJ} cgU'NBR7(8OZX01A:ݥTvН 4!EaL>B߾2ziL%yХ0\:I?bȥL+$BTyҁlWHDH.#D[A嘶WiԀPKj)k@?)4YNkǗe Hh/Y] u\@4-"9A[+KyP6lA5k `i^Y$U*GNa6s7b6L KiBhh'a$[x5yVMK!n/)74PяDk)@`(Zd~DBk? r5ffLhj(R9usQ$OD?iLRz!4D^Wo)gka)JЩI\iX,cZ"% [p\{ !&)s4:B]59:aBDhk3*' ݄¤B̌"fI%0 bx~ bG1c\\?a{6 C_ix/}Yܽ_K&6CD, էx&{D;// ?m |T 5!`` ‡B$gJ䈸ƒ]`#uE LNm2 *4EDJ RvGÐ\+g'Moač @%Wt1\ #N@(Lh_kL.`7u UdE{5%Q$-kA&"YL}h46߃ .j(&mH$@= 9J#fH 4Ӈ~LbT~zff5uI}͐q~Pa҂|Ilƚg}ăyt\Wn]V]]TgT#YT]Kؖza塷ROK%u6Z3IrX%u:zŝ]Rɔ0(إ NZ Td}#jmr?daZLG?A>QӲ{a3y[$J؄,dp_ciNsȇֿ(Hy|l +4Gz[)$BͶ(aܜ38z(LPs A! muu $ &EN$Z%҉٭w{و>rMm StG!Piw325$LC'0zjl\U6 Jfu9Å $g ҹ"L8p evS+zcj4_Bi 0@L=]jTdb .B){uHq'ۍifƝCa`f:͟).4Zu UJW|Ȣ4ry/~ky=Q}`3.o#f:qFr@Vc"tY[Ib%~dwG6{|dhNZ7j#O `}3$"kpOV,`.M23p?yÉvs_&}_`$W*J8 ӯ?LX}f2b!Z dܺcH2y nWsWak;_|(b.-PC^va/IR\.U2{r4tm [ex迨Qv<,HV)K&[ٶI+X <<ОLi̘k iu XKJB 䨖$Q Hhg1{8R9j, @!%A}{Zڸ qITݮr{~K0,f"+&2}zÔIU! <2J,iQu^B")j;2{nLO!{[0>:(է~Hq(A\mEx YH"r`|dH*E'&yX4F3_\lN`}LҨŷ ĦC,ƗK2{!}TW^y/jy}CVƂ ΢G.8F]L/Iڃ6㍞Ʒ5tuASe"ɬ\Lpz/$VPf* z P \Hܧ*1g&hYF= ܩSS0TuD0ePGu&NqzMӅJ0ԭgUjO '* )(񭑲E] Ӊ䠹HC&ܔ\G~ Cv5QWds XTݲ([F~\7uc r%(1fjwwi$}ĪdÆP n4a08|zIsv$comb\;R{5,Z!\;j/4w@*r{logNEn8go0T㶷˺a8Іo :ҳp>l?<^pz#ff!!dj%d8D߽Eeҷ/aeϼi'6uQf2vZ,kWGV{'2*٘.܉7WE{\.,k>,3-ACށ0KHOmx elŐX'gm[ɼܭܪSɽsgHUl54GQPhp\|HTt:ݒ`3rʼnUk߁K } Szbojg3Cn*6 Wkct&Ll0FۗeUqbA71{>ZhA[w烒! j'4Zig#wXsx~O86_N4DsI&oBVo `V.G\kfC2Uo"r?ֽ'Rv-3^WkۛѤp5rk@QGbu| vf_ qv8#BDZ5-\<6*{C,\ϞWl+=zd_S'uSѿEFG7 ivB{)ӻ>> n JqUM͢S{ܞ-sh5mJ/*|vwsUŬ: (>:*@.%}7a()k6:W uamMQeP;_H@7#Q'Du͐w D$e kM.\3u~>ƻI ݫxOsJmGZIAoV[sOZy˦zd}T0o`۠>$:x`yx>DFSBc>ټGuS%й"?0*Wmð~e `gEӼؘ7 1-stDI oq#4FWj6.J'|UɂX1Vȃd(H~ކPۻLSf@_k"wILW X]Hnrw׽}0_qc#u 0`\kE΁jKGsfrcCJJ K.ǜ+LCtdh'ÕPY&fx*n<~?xQhI-cn򸉲]`m%Xl?Ur)Qj9 qK{6bzo-NPFz Y:PZyBsà,6(]HȉS'^7BM"[KeQMq樌a%AJFʔTNv9L*&21602UM2Unq#Dm=:t`{2}[}ѿb >4|OE]F&V,{Cسoʤ [,0|~T7֎ɐ Oyi*R\4ݬh3a_$G ?gCYsB,$_4X44d 69VF'ہ }Ko%ex P|=XHk:tIczOѼŵ_}Y.>fk `fcZRPh7f;2F4gNz2!alb(1!ZADKP%*A~7'yG.y4HN|" 85hOn0qwR PAzޤܟTZ b\2zݻe)iyŒZؼDe< a\'̆3(s<~U`?sx~C8uI`Z~9yY5c3kɧi.*k8gAVuXa{WjM=C\?j~Xȴs+=Sݘ0NqNtv\SnTekJLЪѿ2ja'hxLy2=מj;.l0X̑]; ͝#'ڳIFW3άk=Ma~U,gZ2O} _f= «A͏c f՚?7u)^| \OAԆJzT20z ] ɍ[+opr{mdNP2-dEϫPLRF)Уܖ: 2j;ifb.3D#2~4Wy{ژ7咶b;m6V)BlLv"ccH/ ڰÄڷہx7Fr3NS/78s#SÌe$B븵5رdgf>:ű8x*Q J5 `sSbӱ5=;y505R_F}8!m"cvQg-q6"H;fJ]XE7=в&?SLWzgr`-4Ƶ+*kFFuMjFj-'Y\.弄6de9QL%_L@yF>Ecb&R3&k ^YX㊿MQ`2(2֑w6{jݙv)0iI9i>k)ܵbk/_ŎS㝂wbC_m̆k8oV3U'M7m:j=Æ<3DG^;E6Z2jY])fV7:.)˴].uU|QeK1ǷöDnfA OEJ3"KQng&r9bq'e跊P;LEnZVUiuzq5 H81򿨍5?7sZ1ι_X:ɩѲѶyjh9 Xɶim֚љт4gH..8Cy6DMn"@9:@wv&[+DZx5|s )6k?+b~;.")#TL?z+Ж%"9RaJڹA}9ao2"u^>>;)u`b `>gݻ~]0"汙O-rM3RP2R0y0PW]Y'%pl`#i r`%E,te Y … =Wȉʛ|4/Ko7-3҈꯹2}xJ`@u:`(&6+9=m@5O?_ժ/{PR_돀M.^ԦZ9 =[i9G-w0*ytVoq[o)Y͉ kI.X9_QD*>ޯ8SNtخkih_JW0A*J>v3мM4'fvO4k^ȹkqx8@»ɰhbݴU)0"GSϺ#%!yp>+v=ϛԘ}=jg>׷ϧѬHX}ʺ3e}4oGSv_sZOf_n6Fj)-^7j=h?NxJKJ?9gwA_+]!W,c"!IU DC z?c~!jO 's r;)kRsW/֬ǿh?Oromcf!c}f{/c3zLs?ŗQ>o,_D%7n~y1ߢ!Y؂+$\=[. <^TP>3v`d `U%JSu00u`~iISL,t%WZSmWHɪLɪ\2BJn:ZT"KU<`i % Ӱѕbh~ưJ3mV=r $  f׊Ռ_vc1Ιj7x=aC؉„t=t$qVЪC q#k~ҹѿ#α[ݵ p|)W]ϲmE1XZ.У8N{+y56YJ)c$v՗CcI1ƽu2rgrn5FhJ9z%V-]y*z<y&ky#G"nyQN>v+] nnN`+2[Vud-Qۉ5o5uUsTJz {c]"&y>EQ3Eǻl6߮@XIwGH7D7i[ sD V#x55Ÿ)j: \fk}U1wE=e~v7v M<>rXS&gßvm+q;= ٯMsq2zz|Iߏ;l=$_oO+=8/Q+Vc<[c=F2G=6ilwĜ8qZߵl ۺWKSغv?TsKC.|HBr nyJ E}gP_\s|ĞO̵t9|bh;nل9bfm7=dvY!Iw8-.޷㮉[n(^/&k67* H=]wwww܃ ;n{̜3sνOa_ZU]Uz6.5j~-{xy5Ŀ!dT~.CYvnK{IF u<(IDLLIϩ v젛u?=˩ř/ mg-j5OQ7mvLͮ~egTQ`ShiV( SNhgWN^LJcf~ # R#G,{b'gXULpl24!QrC!5[ODM9dHuLl@ؠV3q3Yir7[оxquU! } + DM w@Vɏn54O$OK K|ۏ@ -96ĩ:8625ici.C!+76:;Mj<0eg>?vBʅ\+EiՖ[[3Smށ-:@YkWd=^;sJDP EJImQz2+N͍J fl뉲[}o ܵrQqS)QkYs=x15b,ruڃ|xu:ά^``Z_}">]= ͒ہ<حƯG8kٝoԓB-[蚫:Ķ Im~(w ,4C [,i$:57ҷ=աy\lA]X%rmϹ뻮xs =zZ6 (@u l P@lR#:&lّpy[7Y=}%;|d8XwQ Jy!#b?/a7]ll3>zxߦ]~`9cwܿN嘽 Ѿ|0i ]*DCJP83#s;_|u8$Y =cTv)v g|@J@(a/:y+lMbg} lJwOwM/[wY=.=g݁W=)>fM߮jVHM8{@77+ +G/#qߕF>QY\CnPGtvN)bt9qT{(vP!C_uO~fn򹃂rV;wgND8@Ǫ:]픣=KH }B1\v<ͷI MDN^ʨDJgÅ'_x#`ﻷx~ե 9i漿ӆj# ͇%/d$g]r^Sk9]sCS+#7a~?)BDB5ǚO9_F^KK,ufHы+wnR.|*w88aїy )0 /Lf^u'*8&ҹRw%c~k_mG< ID~`9k4>twׁM0:*u>{75~BTߛƙ8ϖ0k ec{_K"'-doyy!!F!$G$,iU!);3UKH&EU%/h~ci!yF` ^oU*BlUa{k8ڪ3M‘FtI4^pߢdC q|LcboS_ rWBݚn2w& S=W6٭;ϧTc>`m#kG1zmxEs)3}.qk IVLxmj$ɾ0ɼUѼ6Ȅj\N8* ER(s(xZ\O󠋝}0sʂR&K8t;ǿIa}ݎ%qzK72#›ACA(P^a>/ߧLW~It"(MKI.$|M7ӝ25ЭC[#1EPqc/a ) a#3ڍlK0GgrΦ9F,C:D;.y~Pad+9D8,};60x\NKSAݳERч/b>1Ţh^@ϟ"݆ђm1täIdC ӉjmoDf:U/ړxvЗ*_&_QYvi8@߶3<|nGG FM \$#35<x9%s7GNa^I.Nm8P' Ea·btZGabϽF/yx,jƱ&GeJQg~29DݖW2O8V֤Ů[ab?bE7A#z"0;bdWzT« W+U= -R|l=v;j|0 HeCb9yQ Є1!N,1߰X|$xa9!9bAQr"4AW67t ,+X14D* v?= WIqr6PPh ~ | .FɦC+~MǍ݃|k6`2fCz:l'uxIsz^oƺ{Dx5\5Д8}+N~b9u ,X4MV2Vlߙ/#ʡiO#syꎧJf\@~4fr%̨|+{sq"n eOؠrR%jf +ίcr[CzJuGLdC$(}U]kVDLhO4L ~z=L5dˊZ궝9^?(z5>QGx`PH|" ^muH;%6cA-{>2|I],dkZ ~?eՇ{E#`3l\u@zȭ&dr-R3$Zܪ ֐i3DE枡a5:tbm'[ ]cdβE$.V [GM@lvR D|H@@OeĒSMoh"z'8hLHa x8\=Gmև:N3||m9F_2$Iqy[|N[|Fs#~gvgMͺ"ĢsNmS*oӫի{sa΁*\¼,1Xml񺏔deRN 0Ï)KUVZ_KU_X6iT!@P8"B=Rpʂ'e-hX#Mև"h1-K>d =YWrk=џ/>p431,eSoNa֎5]^8DN:֐)1~ia>&Š'~`9V:tK uaDW,̷P2 VmAV;/7 <:5gTdEdG |z: z)j2z])m ?oH_O"Wcq̤7O+ēgL g gNV$Ny{FߘΧZȘo4:z~et~ |d*YS>R+؁z׽˳ᓆТ}eJ>w*h9d  D7q k퉃 :5PڂcI sX<]O>%ZC۵lgK1 àunڙvV>Vȵ:mFUE}{Oi6&hecA"k|*Z]48m(,>BѢxepOWfsq8VgoݯۑjM8U%mKD'-܈?Jq{i6R}m(eď.lr,^!? tAR"W K7Cjl)W8s9w$$4ol5ﮚxLt< {SУ=8er9~S lig8{ w&vBج]fd'3`9 Ow\D"=HT-*XfĕP\!SvD\ي.?EG|c1Xڸ 7zёTUarc'?.X~BDFU6ְ㢂 {U^9ᾧ54aOl;.+-Ec_twhŃl2$*jML"Jw GޙriI0/OM* ۿ8=j`I &gXe*|bHoO!jE `I\%O",ȼ)eK+2Ml쐉52({%y6Pii#; B|ͱ}RYD1tK9C!8G(.^&l{7fZE; 5e16'(~Yb18ys}F=+Tډ"Hs|o4h?ߚ4xLG7l*门;^)ߌӁN_om|+a!0~1,1[>3B>:NJH_/nFR8 RXHR>$2Rw"ۦ~C`((u(>R,m~t Mq9Bi1%UkBőc.{)]:9wr?⳶) E*w9:: [Q*H(-%Tk46{ <(ΈUZ΀L[MD24A~qV]^lѺW#ڜ~im('VRK`樳ys rnx(hWa\9?{6Nws{?NF481?(UX{ǨGꚁk1R1³0k0H=U&z=㙷wK4$ ǚVDrIVw.bP( )M mX׆&nC=L "/fR;~kC)_yDi.}^8Q'{'7Uozr=,_O ibx= TEJ,o Rttn Jr}u Lx(VOƷN.3w]5i(“$M$&^Fko/s`[.7x3|'[`[6tyP{ ;{ff׵1F7`?A8´[Fx@`nBrR0׆tqMl듨KVMY9j;g/۟\uԏ#Τ1[}v~zX9h~3D̰U=x ?ӳ{=cƸ-E G@|mIB:(Mb[;L\i=k~C>n\>ݪJk _܎t 4[4Hǂ:?]ӚXF8 QUV4%׮}Jedzxw aYQ{99-y˼,v])Ӛ 0/-|4d2,l9hI_'r6JM>ls]qz]02-{zyz n4< yךCjV;)%mPPQU~b=ioi?N{;8SzX:WF:m>"sVWf|O Vln_VpqoK{[zB)$S?3?\ N?f܆u8],ms9lF' ̊F FjP4Kxtilzr Lcn.\>Xt /ڬ_R8/f1#f`C#˜Qw:te\kT479~]4Wxxvm^Y- 6,>0^A=F[*Lg t:6j' ϩ:aSYo֊|56>{a(<7+}Uڶ>SߣgF_JٙoLg kqHq .B?|8VTZO;6d 9uN3x &*eIKCÌ) X_SVh&?k8pe9扚Q4ع,pvT܈LĢk8S}-+)S4f 0LyӰT2~$[Ӗ2OK(*b"~/jf'Ɣ@5=2lv(iU~`Y9PE$XЩT+}1z٦zJvʼh.E[yexYIfT<2..}bܪE9hl S.a4rfEF?ZNٗ!(Tba0|^&RLd{UB.J!,㾒W @-R"dG!@U:(,`rcfy=2 \:? 0NYn#27O_N|fy/ nt+9܈~HZ'G,Fe/"a5"C 7Z(fWb44;&*ۗ& ~} (ϗ|\3A"K?J%_H[;-yo}M[**˒Hgp%*YZR_(-6]+-ڬf^zi<7Dr՘> S:tsq4fI-P,|"CaNQ7,_LU3C+Mv (gpMZ:u[_"+&1\Ċm v{qJn2s뚉_t{4[n2;-:A;w$y^{6am̻ӝUX/fۻY c\'}TTr[uU :Ow# !h^.0)3g.#Nj&5)}fk,^6AIc 5G'G`Avt#J3ϛ&;|mլ\pe5s~VʐE1mV0JtKi_џ)l4큥ia;1\r%& {oK-@ A4]Apxy@334w!XJ䟣4,RCDȫQҴ'tUp*ݒ?DݫOJE6Zpt2\^(Tr,ޓMSyy;kTJn[i2N)SCXGQ4vEte4N .֘Q@g 2:OSGpg |Qjzx囱F4=J:m֯ށϿ?}*>UZXp3E|OgBb`/F%.čyQ&^RԐ ղ$eADْ.NZt55kV( i!|T3Ԍ ieʰ!\nDc-2\+zڟ]5TH77Y1F'shn֜|,ap"_CRNU]x,yy[#~^) : b6=$2]M+7 >UĂ~҂!)6NJb җ$% nDJc=g_G8?hJ&{j%Gu&pV K8 85JIbYKH2r qT:{גi[4;V(ͳ=cr)Է2z+V")0EϚX^Ǟz5 Lf>)&ݸ˥%ꖶY54{ xK} L5NlXk YL4q۱[!N,zv|a[O>wҖ:/i/X&>5WDl i "-8&gJ(|L7eB5QeLܙ NLil.wA6m= *E3%˘3^77ǛĊK:.JKRJ}]Lk/&,_+4!\IFоt!{{Y~~UrRmKĽpX(Ħo=@w93q"3R޴oZ̡!Y8VrXSBIE_BQh[_zS6>>D,_% TQeDdMt? W( } _Aٞl&Xqn=Y Hv[a#ga4;I >Xj iT`4c,:.->\0MP7'0jvjSgw+h3bCٯD܌g_"-:>q7vf`&/Fъ޹-P:{"J1,|-T/5&F*87Q4/%N-%boǔ4X[vO.I[>%=qʼnB.Oq)=xZ''b)/orh9 W+b'3g+Vk UqgO[U?fn7 2q"9㜆酾G&Vo$-vnI0T|o,Y&,/MV8ߋZK."W~4UsyW@+@ |q5z',[TSh˅2]A̪/jyX_yg] ^ BrB֡|V0Z^!WWWI߂~ǔ%(> uHSMb M'$/"cȥppחK+1I5 7HkqRw| D#}E>S|{>%pC&pCza^*%TM bfqɠ9"_"˜!\Y+1ED/P{<? T O[fjK0T1$͛18۔H g-Q!H|mo` 7!932ҙypmRU6b,3i6uiQr?O?qK+?fv[{$D{XYI>$NreLvZ޳4ËQGtFt"tpԶ_'yNi4 @>Nr{z"8 Txy\X=SM"&ch^7M>3-K}k֋@ѵN)SʉȺ%$z#zf6 <տuK_HW{Ro@HִjU}X?-boAb* #Z47\w 8,}qs.[ W`e4Y=`A_ɮ (4h_d߳8Q?{AG+T+h,|o .'0Po\l+}jXsITUwIu%w@\Lz매"P00urwdG!; 6'\y?iOͮ*G ۩7\{*[S+gE\]hHyc;s9n 'V.)!6I).v>An8 G"oOׇLP0~(X֐!15R*9lmlW&֡V'=J̆F#]7VϺ73o [sk-M/ux_֙ߪ{1{O3uܗsEO7箟vHrr D 1_!7OVs\codzN&BЙ{(fAˣr={x6| hG`li ehk-{rm?rGˢ&w-J:GK`rqFXBC,_JtP>YB(~-}Aш{׽Lإ̓+--6`$Y.n~dɚS+(dZv|PlXzW1d^H);?'<[`[җY uso} aߢP3YO.e _Nٿj΢7]h칶ga'u}2NRmlsDoLl ~{͏p[s|BB\D8 D ']z{y]RsnBlXY?\ok)_6Uxھ=:qZw٣B@̘]c{6P=#VziDT 9N2-D}ha\lh[R0(nNA+tmu"^wCASח7$!ƐPcJ{*Wtœm tUv~;Ph o[lk+:v_7"zzP,h9>β=(u9"V}YӾLbK%^z\wQ|ح:ȒbR.Kʮ7#ɶ\e|5޾zB{`-ǃQq`eKgϰOgE7 ׶cW?0|GP3h Hjؙ&o烺)1<wG rz}7`| k/0*oZv!;O,'.; =뮾u +zE(2~} 6s-nf0; !}/;U14'~W XwNzm(lmt1ɔk 14W]EMHtawhz{Z[Mj?urFr%E@g}tgKzx ^^1ӀLnΊ>ڣ`c.?*G]~Ig0;^O$B}/s;ҖwK-_FsMkȁX00jbӗo27_߹:)>ܿT[m~x/n)#Mʻ =o\x+j;#Yu{v{qeb&nLGeə'wT]zV5 /9'闢ƪ}} :ypRys25pg(wwJ[_t= CxȺCIji:Ux39 ~:Z$ע+eڙ}mIBXD]mM zN_n;$ow$N[-׵51/=vLA"t 2l:])$x2[W(W.G@J$4\ i7C\7, #(\ iT9O|)W9..*3F!BWwέX+]NNʓUJ1h/fbM2I1RP+tO@J,|bií0=An[/ Q0?4:~ WM !2Gu& x!n Gױ-Be$KSu 1kߵ к 1>#!VCYjy7dH|gs}&wXL 2e5L8 ܼv}k{{M[k^PhdR=I67|W Y1l(uT _Y⇌2 bf%sOgbiLq>w9iM)? qL0(2j ^O~g * / v‹d]IbnX6zc+^uvG, 1$M2)D{k{)hS_k>`g`Ƿ{ C6xz@"g<Ԫ֚ q; r 8}zL)r]v1v2Dn^Bk 6$à pvItmwpJ,wus ]oK/upgE81s%=ԁ\HsOŽ=ҳkЎ{ܥCP0jpB[pFxuWuYg9Kv&pp |Zy#Ê]&jUz{v==6-{Ng9w79nOɼ4?:wǀ@bCu?6Vھ\n @j yŋyyq!o ׍KA-i17u5̕o =/19U779O g`ϵIh-IW~;tChn߉wQ^(߽]w'kk3cñdG0Wō({PB#ʺijkqjF.Ki7_Lr5@bÝE=u,qBή8ГՕC$CU^@"KxCIіw$ڙ34GxGM\焘].(PPI^JX19!HP%-ߪa~q(~Bi?>nj~cʻ>\Oדnq.ǖ!@zŘwS 7nƒ!]I{k{C}{mAцûϷY֤%W:9]@奯kSʎN/h*䙰}$UdTh\w}M)070]j4|- ?^WT!h)\'Zq,x:)K!P*-ճ8ƻ++#5i)y6ޠVR&vN3 <_WҴ/M?_|:)7L `?3zیo+,M51/Dc;r +W72sN:+D|msoWz_fĀ怡_It ߳!C3@+kYQ2hejg<|_}Cbr'S18nة$uVDfm:P0r-dr m׳,h02→ 竣ETPܸbTfg ;c_dd!jy"b}Fa,[{Q{C>lmm.#bEl?J\<8ڊO/mdnp&U^o؞x^ّ)y6CWSO\L*[o _0;e /m 'z] URb+FKY)T4ȉMPn)-;e1(lj_ ę0_ ެӇB8Zmzwʰ?h{ hi8Q`Rd u75٨x(XsBd#'xcs%s idˇ&5Hb<2y_څ%"<Gih"}X[C])׌?"&+ĭ5VNtmyGTo"lfy& So_N|]o;>DrbVc{!N- @ϯs.=+'Q7r;I+^)&>;\ºΣOE`Kɩ?`B`{uG Tpqjt}D[~8]\2/$ö9@Dz.eG+SLɟ [/H2?P/jgg&voPs2CS96j96b}l}KBZ\C?}y̷/>5C7˵'(=DG^O|FZS}wvn2W[Vw,;ѾsքXjq-dK#$aQۧ~,8:umˌ0U4cf;J*C,qN}U[D`S ϾP1L"3SC)S腳W吴ء{D'Q)k IIGĥ$yޅ2(& < ~=~7[]M%nz?w#;iX&'DZjn*0y;w97ƀb !/5w= g*B1@H0ކ%)$zڣ|gmZ.5j2 3j?xWm@怭LcI@uDV4Oh!+!VI'?Nc7'v/ hPJȬ':<$9gUu?H RkQx|a?yYCoL^nC7۰Av&9iySBhpSqvkCQœ+ta3eA@FR~~V7Ƭzͻ:EcR_1tR1(39gb{$iIɺȚk,H0T\$KgYH=QNnEC "SE(DXHH s8_Erx̶ , NB6{WM*g{2ҟ(BlBOn;6]U=IM!1Tmׁn\a|$Ksl$E>WB̠1HCrn6(~GvČ-jI09$5d@ `>І _p_=N6rC|vUbe NO}[ ?L 9lE51nGCKw3F ~],z&M9'h֐\}/tyu=G݊/u)CJj0e6jl rm~\3&vznI?*鯸 ;5" L.l ? W-&1lL07`3@/].A'܏3⍢vt O6a9M'n*Uӿ:US\bBBB"KN{ua"d癘v rMI0_!zs*芬Yl#NtЃn8 t+ \!̀VZcLǝ+Tfޖ$;wk*>ޮ_ǭyG=8Ki"l=xQ6'4C&&õ S *S5O{33%zC0c%1gZDw;2<2s}vS|z0[q݀uqi{rG]HH!#[)ed[H@3F!)ϗJA7 vbLvva!t|Tو2"g4nТPP?8 u2W6ۼ\ ] u9WZC5y7>~ߌoqJ}W;0B>Zrwr>~qC $Dݱ_[bOJ7a[봾d±h՞򾴥8߿ ;H-mUb6wWcR;ΤZcP`kI0|8X\`*Hw܄% 9:-Sd8!_ø7+2R3.N~tx$E5#aN%1 ##yb3)*^mEVtpN*Oȍ&X"})_i*,3_!ǒpN~pip 5Y Tu:t9Fci/)sq*2tcxڧ#<As4n7hy>%Zc{wIxOt(୹؅xWݝ_f'V]_e~SZ*٧n] ,*M7$<=kSO fACh]xploͬFPJ\M]]+NƀH/M"a\ee?[{Q ?g31$:Rσ`j|@fGqJ҈ĖX2;QX a7Ǭ_hC}GŠUn=2*aWK6rN9cfD'dב93à^D}j{PW6)h׈j1iSmˉd@€M'..:>1RCs1|4YB xOnc5\"AM](~ $'A5m'ҠfurScS .Wҹs>B\szh",16@j1tҩ/e}02Ӽȶ] K:W8Pߓ+$̣x9c@I۩ʗӶ۽@ 'bX +=Ũ혎z68_ƀU3RX ye[WPE!"{ˇ]C~y6??ivr1~{ckwp`FkE$J;?i&gffWP3dG>}ϽZ,EIHjF-a|x:tJ|0C oΔONc8KIPAXđ´U8[pʧk74 uH:Tk$A[Xm BL{pцmWH%&5s`n7 u7%9AWX˩c.6'C &oh^u~- H:H8 q2; +'An^2{YY&d& яr!Y#YXSccŧbDXP,řܐxbK/wu n ۊ5)Z panq2zQ"_,YyNLhbhBՔ0)ѹ4jL_l۔D%NJhRgT &;7b׾ F[ g!>/~ ⿅p[m/Z ey s)Ow Zv:$#Pf5c9@Ly{VDSY7"`]=ٗQ%d#]fEi?U>(B h4R(+{HTGAJp;@nwu~ZR夻Q?g -(V&z&ծK!e[!sy՞W!ˆs|]E1[RLu kCR?M] lNap0@ojuPܱ.I^`Ӝ(d/VKS,Aj6h:O?#RT:-3؋idvF\~WGf%g:VL/\]Խݥ73 +Z7_,/;MQuĜz;AਲҊgv)z'-˷"CXit͝Ci,]rgoĦ o"]%fDcBsDWkHKvaP@xJWBUڲ6Ћ[f)hMKJ &;VЁk?>K!/5 mh  tg0kژ0/KWL; <sk~P+]|K9>)6u~.~@S~Nu`Kx^>>Wfn~2LABv3jR,А~u͘"6I" -c'_ e6US#7xOM]o9Pq u 1ZK!D(a7l^ĶV mQ%Asac_˲VL`Q%9JW u>|T]p?d5#'ОFnEs }_>|nfgU!l#w(*m3NI13Lt7»9}^~I TsZU[a " (SQ[hXgj۬~*lH;nNbk:Qr{ 쮇\ꎜ0FJZH/<=RzEj6θ,g6æp'oQ:܉P;k7LF )ޅ_qTZњprgH֖iKDdjhyZPtC)<}iJ*&ȑUn: 4o!#2`suġgᓴ,K_JaRُ9A>E 5sH2}=D_3LYYDB]o"k>= 3y+Wz}%#x)N,NBUI>|A??ɏ H8ڝTH6(c5{ wQ2 &½^ă5`{p'G!NiC~7ɺN Z1 mE斮@:[2]Wb]gO^?ڎbyGˇ4)kx7ƧiD׷|8O3 ,.Sz=qSxb\+t8:Џ/_q~ymKgLKX\qLF F> ômA,W99VP.'?][9 gsS ȫZ( 8R&^$+OAvhV$%TƷEvc/OM/Џ~ uӃPVYpB**ʕwG/bd9fݗPJh&rAۺ@:ݔgM)DՓ>Le8@E"iP8]tR1/MP~X>d:Qa,]+ۦXㅖG+ΒJwOң^V~c$1/Jf OgVZ|,h0YFk5p/N^QN?ㅜVx,Ѧ6w\;:*'^<Ĝed+~wpN'J0/xŊڎ2Ku0 $څ%7Q rIn/rE*lZOXd:%I}Ȕ.$CgJ+._>(nknw7B)5"3ysodbečmu"4Eb6s9X~RVKZ>y>,~NPlG*r.w.I/QJז~tsš C#iȦLIP.rDa׭ZteN;^hv_?ŏΝ?54>oaw&H e5?Hm;EaGcz^6SU7Sm.~n+V(8/Oav*wOEA7L%q& fjؓWՃ>6mgk\UIQwȭ(ݕXh˅cFtkΰp_hFŪ5 7כē&@V!7 !&sݛX:z.q%2~F2h{ްYF rG-zZbyQI W0Ԋl]:˛c+5GgFXfmVG|-zC/&nѿ}/!$rxj(ڿߝ`ɕ]/H$"K|hKG &n%#^x?瘋5-b5ttY2SnRZf*P9c4j! y ,)SOt*D!q*͕QRD()!׈/$kם|P<g)Xy2$ ֤ ˼uxJȕ l8"(<sKO(O 0x?6gE QYa>`dѮ\z>Rx$^QHٰlX';x|kOh!%؄h.-7` 'mOn HZlo4ZmJmxA|cWS[Bf_LBӁEQpW'nur2šy|GF}[¶JocA.sw^xK"QFMMKKgyz OW-t#VӌwKȁI#dKEvB }ŮpL"|%|&K;C?ç&w#z[!XpYF]D]]4/ۗآH?!K߾G=Lz㨐nb>{.|rT]b|Xw 3?QV٬q_nueJi|+;4{ڋm]QH *L97ۿǯʞt'|9zytdW 9r5+5cpiI[K8U,E i#\HJ]-g+>G)$X%K_8{3}b8HDGR(I*m0!c㙁3R-,f" Q}QY)0P6;˕L ѧM~9:'Cr!lxeغGR+җqL>`9Stͥ>!Sp#*nsaiܪoP*F>:fv$k-)~" w̨P0a_#Mφ}}av4Bϋ 馘#{]>7Ji`WsʔXte $tO(H!UFn ^ ݨ)͘3|Z4bT9 !=l_ޜ\%nhP9rܥ893p#{{iU2;3\n{L*R8Ǣ9 =F€J,֛k=חq{Jj_!=22m6j@K[o]i)hr0ɳ.w?*mlco|wy ;- W pɲ؜a \IɼQ0KaP}hwB`^3jLrFr.o"3AeQnQ<[eekCNq;7/_Y=<}̅501aO^ÑӒEFto(DaK+ukĞ?V!iGPcMj&b-luH]haUA2K-[gsv*q6y^RQcZAq] ٲYq BȲ@iK~^rCc1T[ga|ݓ'2'-6 :;9qaF0 B| _yҦh:E9@-mx=wy@vi`[K ؅xsyFhV8ro:ir:n8z{~M=$;WtUr]${HC3¿􅐁xף Jf?$ nЦ-{թG697̣|U˧1h{2O9<}s[LVQRԔk1Osgȹ qCwK&~l *~L>IOw⤴할^iPw00x5k`J)+Ky!y}Pۮu;'Bzî2"Zkyڨ}X[/!P߭}<x̂)6x'pؓR~|L.[܉?)F;9He9ZMٝn46uW[-+Y\{sz I-^;VSa:̺u,32 5P$TTJpA$!RLb & (E LDpiAEAjD::RܓęowwݻfA֛st(qHp\oDG}'n](⼎lmAs0Eaaɇ#,SϿGd<E\ 'k-L/zWAGz_ KTggj1ůbkݾ`ah΋y`"l?I{7=>w{{xq7)|tMwsk 1MRb` QA32\.ugd%,9[}QֹtgB}I1S 7Cz&+ʚ#0L\|1(i'~ú_q-}eP_||ɒ1oݫ=/_`G٫2U:덶|ThQbnx/ŵ]ֽ.Ϥd95n󽒺)xw1ZORqjZ|8(KP=OA_?K z0ӥpb|ȟ)h`3Pd*@"H5`F#]}H4?!ܨv=KHousH*BS]gs06\d-m(ܾ ShpcF|kPhjj Xu|?[~i6ZK :oF1SnEH xHtL9ûtCDB" 5߮O8 %⯼4e_ @ @ @ @ @ @ @ @ @ @ @ dӃ@c ]`p#m}& /-XUF*^*F NtrFvk3uϺұ};2Z*CWN.bõZ ,BQԗT%[#yo&6YT rF.zy;?7 2!c2qYgX,@YzgzBmr?e:=e?ngt5ѓ9?yz);.mx/CxUu!oJ,YN/&\dĆ'G%v'vv@ExX[hLEB6묓6Y8%O@7w//6T+UTLPoulrEFV9D(&LbCB,GTqLcͶ']Z@‡DY{{ k`'Yb9S5-GMAoЅX+͛*gdlkl. +;=-*~t8@pul\LjO:=K bCӓ\n>fVZDr7t˭fm͞Eoo N.;Bj%W術8SKZm8U̳T)u^YET00VD/|<уX1uSV\l~Re~N˝4ߵ⭞$'4"D`lUUa/utboJl5s˼E*Zi'iR"ؐHq3MޭO{K^G\m`$#~gz̾3 o(>END&VpJi5IO\#(Hظ!y9WHg9s.?C̮@=jߙ*EkdwTɳgٶ(}=EZ>>ȃwdo2[Z6^ѓSXf[A o,ÀWo4Y[Pښ٣N }|;nfz%lnF&.}{Ќl`g96|Z}۳lk?:Vcb e7KQ~ҝ:{ӍYxڵk&P_ B=KK2`(f:jAc$M8h!6ޝWJJk%'qvL*, wKw$+ߌg^,+T>i|O$)Yl9h@{$Bd?{kW(lZ &-*C+\z?ͲI5%>֚8$ұanΨfKLM®-[s?e١Ǖ"A2<ͷh\jPUԺh'`IlnF4FJ)Q~y;Mտ%P+QvTQ`:ImĥYc=3#z/]lݞOTU#v.ԧ[@=1Q]SϒźW1OSe8e+$ݩOc9`~=}{K:vKνFUi}pJZ7EU\i,.+\)J:`HNw`9•~t @Kwas~JحzNe '~5POٙ" aHQSľR~;NN$1 j2{aJU#Vxp ̲u~sqzإW9rf'Ш׹.Ա@ "?+L ٯ7j$v#0XWC`Mb: E3Ĕ7orEt0odj R1sWc sR_Qi'5'&uȡW. GTrlz X3>XrѻGd;u;%=B\?w 냗^9xME_bcUQSPh%z~x}f/`NQe|dRI~ 'bN'Lk$4VQ J)Ɏ>fP x%JEe *<ͨ´qQ6p㣳ƁZjS3'a@FGbDևDoFm՗x0n{3%x8ei& );Bwy)g3v3sqԉnTjojH\QCVSJ eai\>{hb%©Tj{c-o/HZawOTaߙCy='0+;1 r6a[-Ҿ|$Lf 17u@](" R}ķq]%gRj[xn-ȀEԪK單|;%Ľ_RJ௒Z䛂g7{{H(A]O&2( IQ;`;*b^sso.BSŠS'Tj 5XgwNCkZ>h硴4 `\6 R$-8ss4!;V10Vө#ਜ਼^I@Y=8ÉDv(m/a+D< ^6XUUs,TAJ 66?}59N:0} Wk}CGؤ21eK ^ xQ@ .j/g w8΂rqg`}Yۗy[Q|:7=f'xiF p[QZ[8O]h_F(~"!P`j;֤\zNxDU69ܲk>Z9hjw * 3{؂4/=`3pH|<&U!MSv XߩAK7<1XEj]U󲉾.1/~T~\M)S%>j zՙ$}J<ٷӉKcVYCh0'<|]M/ < Qac-r5\+}9 U8Rky wF3xƎȭ Β)ɀ%[e6χX^E^RNͧNM @oD?ݶ:zAv%ӾSbJgտK2s_zWΧijT$=ހ>sx11 ^fO`f^e9˴we6 _/ͧ)~B 䓧~,.RoV(l(ϐ:b2{Êdg$Ϫ&'~:}@G޳6uR~l.Dᩂ)ru?%d>XZsZ=$M9: h`u?\.@Ğk\9Z?3XTW>wN }vٗ뽙o׎ :z B2DgzK'(Ώ9J85 [NLT5AGGƶ"SL: i'+d?RE|9q7ȀNսA>O.Pd5[HHH|jt$Z5bFj (ļEsH D k~O(t}鑱Z"``MA><.[S1ݳ>g0$xl#꽽h7xڠαpLI) B|elx-WVf[l:I 2w5zWCEnϣA@m 6)+fg>*F}OגjX|cmvPG맟gMA?Sc[-  d+bD!EK+Oz|:r.%]]ᘝx(*O{@m#n߽ ʴ\o2NYtu2y:z'OO/fg\0DYZKvՕuIp2 6IfV $\c|$MŢAC;k?a% ^T}DG 6g_( hZMp)c5KV|ē:b!k4 c.;ԨXl^q'܏AW^+[ \^ꏀR ̧3)Ɓ% kT7nMM-PyO(hwO|5W 3(Xe>)ib%dk҅equXKQm9ѬU*>TfÖ0XU_Wa1;˧pՈo ScCD-È ~:oz'toCmޱ&]&Xo 6ݴqfEè N5|,ge@z7.Ur^!zVRcegN}݌H7iẉZ8]z47y5o8=wo`@  h4o'_^=L$Ɋv]of6KV6Wi5II+U "v@nH,7tdbW];` uG|3^^&&5/.sH%B}y Ddi7d¡qq?U#-o:ȢuFI;P@:6.ϫkD))/]܍c9J j/mܓrv9d: Ic''75a6 CqY-w/AI<jyx>.?t!pHKnh8J0zs]Xmvәn̈́x#0ⴒP%i ;N)^hWc۽M 5gً(OPqJ]\}oZrS s<ͺ1Uvt^Úz(qH)S,xWq\gc988fi$iˌzRQÝħW#/e_mX|wnjSU ̃gއ#G{3vˁp50JtRj`K}MC2 '>\kβ0ؽovOVt+W%8<Q4kX}&Nne}srR_9LI?9~jE:~Mh{g܅׃}H c+Cשew-~6ҁpU^oSR㺵µqDJEѿ63y, 1QemcIKB:+Ab{CL;gwůV@R][ɅyКkct`PrsJ8RO}5wT7?y̎1yšDciҙžI<ž0Gzm11}cE&I t8>Yf7?|Tuo[A9U@8у8-i buZYNMo%<9/[/3~;&./oM)m]g} vc|Λ҆QCջo\gާX=YwuYC6*&¼o=6#|/ 2dh.R Mګfg-r,-,~Kv24t{-d;zeK\qaH}$qa>ޡc>0##3?f**raWi/s.0}|]ARL@y1@بo4n&8mA =}wR֏OrPoKݡO:'&r[7(r7-7ĭ\}_*j.Y660@{Gq :}қdvLF47ܼ2O) |JM4nwo"|_ a]w׉}k Wmfzz&njC8 /5u I1Y/W~L!TL tDk'n^\7Z%oFz)[wWhr4;nܾX{yLg{?űrd~5ev=i*xnPv\,ǕC''=k+#$$=[S]O.\  bϺ.2|styC 『Xۓ@1 . RRF\\+Y>J"0-,9k-h߮d-KJl,γ@S&>Jf֤~\x͸>4ov0zeWoW:iL"^ŧRnwNw$+%ECL7_}Oӟsrp[:p7jDwm E[9!d6C,TjT Ε^VV~n$ .cw"Ph1tjdi⥘KH+G7ӹ=Us5@FDyxRDZ0>L-װ[MӉ뭬:F.6YC3#wCЯ^~ tYLŋ^;S] TWs6OKK˫njbԃ-?pfbb 8:30T[ȩiU^8^⧶uڪ_a]O!|I, k홛uBe υ[j]C*zdဃ>-Gby.sBJ:Wp9|lk7f{LHf"0 H+gs)n褤dl p(pFԥ͗#ۤdn[5!6rѬ*Xeٙ}.ù}b>}B!- C@$^.^5\(-5"m̋<yz| LXb\TWWiݵPw>LaPɃ3yˠl tEΝ< `_S hK]̟? n>U"JN_lK|Qc kH.Rü_K<.){-jQUի/;5\MֻQ/ZϼfU0+wRgo֮n>HScwbSWSżוE3{RS_yNW{}G~L1ݣH,3L_rv檭Т=#EG(DЩ" #DoQɡkKZ.:Bh,* KZg.iB v }BlM+/yU(2Ј06< 3n/=ϟxyeʛPNPw?FEya3kD4#( 4IkYjApuΓl]~TqFJ5jbHxzK&IIy>-u5 F\f{_܏x3h}J^h:8ZHܟ_8~8D%1UcoAeD!%Dg\u }B)-wM/ٰ~٢)3 >Mh! wJdx= 0^~avH'_e ńMwmqgrB^< hc6cXZOF>!S6c-z:ڹՂt;=QZ]J^>T:GThZgb./o +E(1+"S{\9ۂtl$>^ʬ>/I[i8],|"#^UZXTQȿ(óas7Q"k*Xr'`*:#if|CzɦIl-WNR`!X@Qȯ?w;DP99> #B*VQa=HCWh ߫AB[FaZqΎFW\1ޛx'# 80A4s:' ^XJ&0>#G8]+|ɹS,<䐼7aiiiNAVmfUqGU8!F+SQoũFXXF'!:jwrydȓ,|9HKՑWI9?dٔw{;}x٠%tz!nñJ`]|I8OpQ*4al*R%o6APZ𺚬@!MY8jqo3T!+Ι,Ox$o7.w([d *Ȳ$)=nRa 뚊{F&&ʑW buvaHaVdA|)lkQO$GHR;6^;LPy*QyIԬJ@%FXNgG' *?W3D5Iț22¶nޟ].3$+c5ڱӆPJQYT򲉂_^Ys% Ņjh4mC䙇ѾZ@5r#EDwѨ}Rv5yuO/S!Dw.~D%nPF{yE%(Jr>BuqG#!Rpko+ ,p(qM7 VISQPv&1D/;ٍǰ翯gl'Z;"bBa3)\ϵj!HtxvD{W(DE`j?m)kOhp"ZIj >)*gY ~e Y\V>Mю*cN^0Y}?v(p9d>(|lSR ~j`&+(k.(u_qGx%#|EbPo{R]}N `Zn%ˣc:c19wCUvACvL@OMDչ -#C.i;WF uGoE<e󺍌Π0FV X *`@g7SyFkG}~p?bR#䲍L=0äƃ,k>A""~vuzԾ *)74G'K+12O$ag1MG4a՞my!JښQtp~'xGjɓ`Q1f6ہ510ao]]S>+yak/ؠ]6=W##y زt;ϾeICTNp_rUܰޗGJ92x%ё·Qs-/c/~XUv(("GM:Oc)|Dwc}t~dmEH|wYM5X*wf.=qb*~o #v6+ ( +VIG섨u:ݐ śB ٝ)t[<܇ CM,ԲL<NKd2 DQF'r4b:nǵa)cx) i0 n#j0g>j UU k*xۓ\^hWzlb^܈} 0`j}piUi1BA;b$IGZhGGQ?a(9$~\VQ8N%`AH=އJ[F \Rej5<ӠNRBMxJ>/Ħ1;,)x97D,@;q`5Km>9PuG׶ĤƢjXPddW(uFT9<ڑh[f9V8| DLq2l5CXljgӑ >bXFz gLH  8F_OZNdeFihE(egK;zta[g9R edFLԇv /ovL@6H@}lZ\\@jFQFG^-T U@Z~Um{|qpp%[ -q‹? w]-OM%f6dSn3bLP9" M{:xt:/<^J:!|{3p]=NI|`mn ;ι%o$vkur0+்5:,8 j;Ml^ ac&dz3=ﻃ)VBb` ,d qdžK2eybߺgF?Jhv5]R/M"{FuJ.H"+lmPu>f2FHa `b¥vAÒt#{ /T:P^|V%7]1Rbeh^;Ϙn5}WDjռo=x"lI]/(ºxŅ.68yyCműo@@uK$":{2@N*~89&gk1+rDDׇ霳sϒD ᄋgj,4P挵۞1A0~Y8b ɀ*"=:_U7ZzP_gykt)ZNV bӁ8Š ؝LO"lS Y₸Qf?ԽlG%qHzCW4x.ţ4׈|@(+CZ(N},t(GPΆcʁ-b(2]PKfHh2삜 !O;;»!݃Mw$"BvYEֹ90)5Yw%y-/4ȸIlNT0+<`aojEZ$$Tm, ux䋜.mFJvMŴuzU["- b/sȰP!.hR.9{|'l!hhZiw\~.%X 9Q`!Q׌wOCZ.[rdJWmϭI4O 45(5E&;BXK-kwGRAwIrATYHxgwZȺcvUPa6?ߨڛ<9Hi0{# gm+ސ%Ʀ.1@`- * F&-py+(yOjx"X2񧸻-kY{NbM;jcT[Bb=c ,PXQ9[868Ii c Na\E, ߄kLBͅ]"26&ko1{@3T~0Ҳ@.2 :B RJBՇ4Y,@k~ C %\"T&Q!_}C.>(^:10:@ oW47!|s/}PFw %q8aв<+q <3<}~OHk9}&֙ݎ? Z|YCg u·1jr.eQ0A{\U7v5K8M N~׼ >z=7T||:FU/S݆ R5")M3s z͂0yOzȂdl#;AL"!!k[6aɠ~HfX~ähA <[B }4.uxuU b ٿw< akbМ|!@z]3G6RO n%e gyY;c7YDɋ@u:yANieA W VM{$b)Gm90ƶ,8=d9Hw]@M :/c4W"Usw4__Nq^t0mt/bͭO0n"'x##*Wm1`?:k9OՖg]nddnaXTnxg9ﷃŅ߽߾RD4q w,N|d2s6dz D 7 9Jx9 GxbihLeI Ė¿qbG&:\l=,k~jg3rx`L˃xold3Ĩ|VJKFUw`d*tb(#"¼ serL<7U1ޕilN}^񌯔+qgc^ń' Swv?}ThU Ը>Ƣַ߿ɖXzS+ro].6Z8x`~_1M CD['#,ӾxK(ԟƦ~4"̆C':~)ͷ[h2pҰņݰYY 4S[oAؚ<?ac/TKQ:}e7!3}X٥u~YݘfJ]2\Tt\ t:g)*9b5Y[hR _7[68Of,Qa'֞BV})pwWa!*$ޯ5:5J ?7[%ee020UPi՝ RDXZ. 99PR\(J6.szJ%Ɩ|B02j6_޽5(iըA\+ W(ف]^*1"ZLq th%Jh,Ee\?0à*Ãʾ3`$'vh2ZoFq2Y5];"׮Tx}pw}8 "c.طYC@; ~S?V9ҫ<|?xfaX_*[Ic mL}aՂĂg$ 5¶7a@j{+GlIw`웊Uu;UVMd!k  2(gWeL8Ÿ LE3H jN1:OQ??K:~w*׾jhLj?$!AϬj2zNvcY_of)G{(I䨙roT>@mK\T~ML`L\B>^}S3hk%̏}ؽ@l`(1X[Et. Z5%ʴ({TP_/"OdmN+%Iܛ=a;$0!L2,HQ4tlޔ6 2Q8dl^Ib!gq^5ٌ7`ۆWZ@{XF)A'kF',5֗M3@;D^xdxuEկ /A}Mg!;-q(_8hKGFpYJwN4_8Fb?~)Fw0`;Qu͆跇`a7 ǐ^?; {\1):Ef10DeiEIJ>[1L?8D"tⷸ{ %Ey6t$vzzzgHM:s:l{|ȟ>SV&DsF6of𵤠c%xwΧgsZ-+OzRiMX"Trs5Vt11ȂՍU}-DuQÎE%v$LKa!5\?e AR<=C#\5Y*a1|]KXHpF7elpvU5}0+/ Cb zPqkl|=m9:v̉V/J/s7?LcIQX5{wN/&xND%߃1jLGmfk ,T?c儍%h\-J8/DT1*B#ْ/OZ]Ig 3w;e\+v}գ Eam{6pSlXmrկ|/ z@8%L!ᏖDyi +An~T>X5N_=po= (S4 :0Ç0ձZUP&~qŭ ۧ4dqf.Mr. YƲPh|Jά_jAFe2ɏҦ[nui1d"Χ/T+{n=ը!&.q u&n]SW|]m/Ծ {I 1\L Z~<#7RI~j.I:b`1?"B$$)!zE3q ImugsqSs)2DTMM)BY J8UDv7ގrcf߷#y$'-($놿ɦԞ<7RDދغjRNCg;Z0Rz;NI Y.zZ]l}D./ծa2<'"⍟[JO.fgߌ,Ly \GSRF&^G/6<2:`{¤C!'-\#f5z tWж{g7ʺ>dl5I?,P$RYptxbCx="g}yU'!ݍMj,r:JzH8nI ɔgCF+)Kt6C^f4\4 ,[bC")17zz=*vcZLLQW{;ޱ?.7l3WRU.IE(9;pqaPn.o3F*wWxxLZJV:# ͌^hBZ*&}–sj>ЁN" `O0uu?{(nz*eStgD^-yrc(ku|jb馯7@Eƕd?s}ú?g'%m哼7u]ĽՕju{~U.ۘw3_Ɍ+҈#Wiʭ)KDKad2TXFrhq*K[x /,rkF^ k%>fF4 ,VJ1R쉼W~bI2KƄN|P@5[WE?8~#jL<4McxIąJkΉFQNNUm^`y"*i(Dڄ㮿%ՊG=Ս&ͣabrʃݱyˮ_>ř׉*F_|йdK~_iRD0 ;_.HhjAtj %C 9( iuwՄ %>"@~,#{Upj h)1'Xī"Sg!#7˱榸"| # XRg%BD%7q=ڒ[Q9=)w^qоn?{xlD&^y'{Y_-⍘%ݲ&3aX\b%I 'd)JϾh/EU "z.{򗑽70r l7{ gx^Qc3$VeR[v_Q!,**wLQ{%xM<X \7K4A]_4;bS8 R f -t0 +3D/(H=-&4Ϸ3HB3a}qwN;rU?T -6BE !lwY\OTEHjo`rZp7LӦ2Z;Y }Z+xoPF֭媋!M52ЏAUoMs;ͩ܂]w|dU-XQI"q{)w sta=:y% Ҡx1oIud-zD^;mAi+Xԍ>l,GgO@ͺGhJmU< R9-E@Ҧ>*{lH,z-y~츷ZyE3Fu-+~ITtGt7LX<(8V/YeP9zE(1r%2}畽#G/FoFGVkR!0I0,v=~ *'}V@6֌_*TǩHGy "$5#s9,}2 ĩ<W~EXz5Z%GO#^ =e[ ,@۶o6x0mLZ60& 曑(#ɖBzY~jg/5< tS2FWr/ ,2>DOЊpxYUEtL|U_: KvUC-Q8cC͛$)1d*Z\踐uݱ:u{JJ7/.#'WR/ Yi057\>dvwT^V~f+ӣ&Sel0 lo<&fePpf_p[ڴXo+M6ܻkӳf/rٚIBsnDQTP ~f^8Q/ZpA _QTjR*8DQl30#x7:ʘ7ҍX{:ↄR~j "GDWoSi?A2Z3F cgMGCv؍wOW0MU_vLCߺ˵EnoPB;Fm^R4䒞5ۡ@&H7 L`/.1Z=)Yp3) HxPS8|Zh~yOc{_~01.vTk`FX SA#I[jtܣ 2'^8[0ޟ_kn+@bUQ A vlDcB$1H .xz]gG"IaRCB#BvϿ_亱ǦbFt'xë U~(iq|Vx[ )\=ƒҲTK)a|[M!FS~>^s³G0/K|ơ\K D|^0<ΟT=b V%Wȩ=(dVܰgg ~.)y2ه:ڿX~ #rr_#T>`n:` ?ٿ b|F/yIn(|J#]0WV{H/w'`"uGO}^ߩ`@JDhN^Ll{o:_ߧFAWzU!i\":d%٬yXw7G ៛H @ e9HoU,:{ߍveK.;=ztAC7IJ@؝^`aIrjOZb{V ޶{uڋ&S~Ʀs%H 휺ѻ=x6~:ޯUxӾ8 1g~cs2w%-[(9\R>a JO:4>8JU]L+ulyTcAy:`.o@8;מ~aT(}`,d?ѥZBr?>7Λ-~s!yua*\zs'}+Sj$RvNϑN q%Ea1il.eA--o$$Meky9"&:"-`Bwދ N7iX)k "'ѽH ;a6rBB-FAq5 BJF(ꌰ quF;$},\ȩkrD';uvl*(OyS @kZ+ ;Q'|M1=k Zi 3-f 7Lh\6F,O93P z&  i^;]# 8xy%+f ߝ`og{¤v9MKdXXE =lģ~ˤe))uJm<2!^ }o$^]r 29LY hVk<.C³u?<)[j=ԯ>z F~HVkn fg[E3 $PRw3r-5DBE|iD`cv?2 L\=Av['W>2 Idd*AzBi/g66 E9Nh(|PEIx2ڭMES SL(~}TGnz^" 45[ #6x͇Gd/. oFv[껵} )o> 3hba=CBx.dH"O6_ytu.EӦ(6hCB5}xES*ҋFjІ"?S ])Є?B&<9>z"W3ԯ՜?>s g$^ $<6rGC&M|$c0ǘ ֎Dy["+> Qel¹bMX7V w~(e l=H- x<㎥-?77Yʄ ɉF\քjW_OWu'  ~Q^lGXcO]BM{6S>뻿6FovG}I=ÁBՙ)Q?kk0^3gTfOdNՋ}i=4g3~|Dǡw)fv`AѴ|j.|\2:Rza,Dʼn(!5ShޒK&-OUo﯒KvClt"v ,Y+':1{4_Y#))PM/Fkbq{T .0F|l&9Cקo-}Mmo3'S=L n*AjYcF|0.ݰl_ovFB ѻF05^.h0h9.3'Ow=zc<(*¢ ;qR0lZ~=]G^-b$mO1c :~}=,Kwl$ĠȐsV9ɋF}Cyz}"ʠbAAlS,j0Wg)z%vPѕ'kw菛R=)YXTYϧ*TE:ek_lےfYȂH:>Mwn,Ow/8x#Ů ٛika2[w=FTIyuMR*F4Hq$@zC?D+ ":?#/'k/9p Ȋ^>gƕQijyRNSɦ=U3r}zc[XfPDגo?φ3 ˂qVv߽u_F=x>=E?3ak&DSK@[~LKG\2̿;&qR(G򥴢d$j]&?SJyiMʻ02"+Yp7/2CНZBaQR^wlr9j?n=d7~}gf* S_b^d oyaWTΡ5ԉk Xo>N<Yd>%9Udh;m_n>zÀ^,y);V3q : I6iDtWAkieOF|MnwaLMAw_?!6uM,+Ł{/e17ڛ|Lp<~(0>^cjѣc;$\|bMf*:;Ok}SEd؈,?Ju|b|WJ}X0|DT3j4`piK պ?h>ބ^}:(C82?U'c _X>Z'c^ ԻdPޞ΃RH@)n=daDZfq0[O˭6 K=kL._y yY{V]AY&B7|${ݗ/"LKǟ1^W <]_{[Ċ߹uP[>H38qX_Ϥ"?(2rcΆ}d0Aȗ @%-ρkCb/}7,_0tLM3:X~O6^Z\rUa 0w~<'{N5_@J7Li9hg9VYxs5x q =W۷cc =e\C8wN͟x|%Tvy ~v$B]Bݷ.2|n"Bͦf%QtYANTj:991&~‚CJ)9VRҹdlƘ#ؘrʢ\(Ǔ2ykɦَ߅L V7iYSה])Nx S'1t=^<ڐ%OWo;]pw'v;ڹ"3,9Szob C<Hvy!b ~=\ȑc.`Ҁ~wǡ .kϾ],T, <%n^I!؛HdIda$(eވ(Й9z 柾EM%/q;?Mv 060Q SgъǸ͆ۋݔ~JH80ySXUD~u]wgQGeްxHC1#?&ZRs3"oik. I?.8.b)𱶝Y;4ü1߻/^DtMK6`(QJeA*mbAvvl%Bɕ>pNtOnۏ4^VXeGy 2ʰdO9$]1X`K‰MZo:W2DF nҰqhs>DmY-_mُ~" -M/؋eR{NnGfGZ;6ٖ-ŏq#ms:^ps]kA:,ܠn[wl#Q,xVAsWEÐ<9S.wZ`f FmdAicBa(>7VDT29hwrFm+~̅o٭5`;uՠ3N D!_!GJϻ8'0_!Zs;gxQAQC)kX V 99#`8^@ Ny3_6F>M_/.+ 4y# 2X:Pѿv}S,/VLÔ挨gudKB eT(*AuG@RNliSj% Ewη׸rhJT[Qڶֺ͙"K<*{GVD(PvVhnckQxh꯿ijAz~ApQh2\,g^KY}9{bAfzcg~m#ߔ41eh0!}-UIpn[GFnNמ9T&7JLV ivݒ/AaqͶxp~ܕ`~d/dUJJfDrzzDXf  ] D9wAqdƿMѓ<_0̓DO mbi3}A XH6dDe:cPX|Νw02˼1Щ։e~ԁTt6=t"y?709@\]6k_bPR l$b-wTݎIKT F31. -OUyf/ғ9' ^4IMЦ,#;AYN7N'UM-`o9TuFTϸ'ɠV@b?6$)K D"^osȠWQWD4ek P`gȨuEQ^om>ip=珍v$ܪC 8 ?5C?ε>3t?)0})22JҋC@)hXS ek]2+iG Ft⥧X]3MYV.IE䤭C>УG9`E-7O7*=.QhFb#ߧ]'\ 2,r&cC rĪ NHQXƎ_;Zc:G?r$2Hv:JTѫtu}|kBpOkp=˭s|`=0Y"Hxsn\Hk: = ,3f$SdWrz'_%W+%HL])?p2nX>'(l{SULHEe4)}*lÅcz_uPQ6T,hh{?(ޤ%@sXAm ngB(˞#"B>?;1kD),*,R+=h~ LEN o.NUG0@*c-$M*t߁,"~l}N:}B(`'0S|v_rnT;Т5s0+'!t1u/*  e3΄F^WVj2>]܈z1 Ǩ}umd.[D_m $<3&GX,!ǑQD);_l:[E!Ḿ eUXYTĵgfUz]jwҝt$^ 2ԾYإ9<5M"/s4r2N]bOx(6?znB#G Qd}]'0Y nqVeVK:!a<"ݐ0sf=)i R[xS`K=w׋8:\1KŃeE6LHUsɜJSt{سXb*$vQ7Bf#ڝ Z3WExQrY?ӥkɆڤ^ ͸EѕT |ˡsab[g<䚚ֆ֡EX3Rb;$k Ǟ;#*qk%^<}uX=|GmrWɕ|\W%q-YE(NM#_A m44]'WI40Ӗ]$[ 7JNܗI>`b tV G86w5vŚ+Mڐ"ѭ&oH(-Di1`ܸ^U?Z!_,PlǼǾ!jߏ`5mm,]{Nπ13}XݺsrK^Eq V Xwu03$Gw~ĉY=$×NWXΔ}U+'w:GqdnbcFއI'U{E_spE'f?(1~Pb~jM^5d(80=UstH1q Uͦt1p7 fs~a`՛xؼ&OEHl`nFxz˷=mrCKp )ڍBrɜ1: C.>Ju8m '鈰GB=Iɋ#cɳL0͔T0(zMb/(4p0³5XtCZ}"?{pc'C|:fH=!Lb#_[NxT=Tv [B$`dE807M}`,՚M0\N .gc|"Yȅn1Y=V| NG~Om5; GYqGaMJ0,X"sږ7?󓎳ޫ\#| )4tdvZ_E=j f@)C -`B4B Nj (Y"Y`'Փ1dIτ/ddP K-T<9n9i1۬ZAB ڣ=r|/a~@`;f'g~]*FC-0}?954.opW*74"{Rc\urDa~?V+#@`WT$)w[^w;~$m.VdqdJaf>>!ϯ}_/ڷgy@>?W,D=f_Z)ySds[ATOAA@)x{@}{\oݑ=ںz`zWA}MC|D'Xs:M^}z r]K㡶"Dj? A-^:_ jQ叭!~ q$L!ZteU"godYV]7.߅)21 ߥ Bt*~IG n'7AaLO߀IBmw4~D.l;iErsED.1(.Db4~,F IQKvx4JhYQ+( lc5SfBWck9^tx]telx˴L,Fv^R=nw _ךߝPp9:֫&ؘ5?%w":?:`ѳQ~@ԞVEbW@ Hj/N џosM)ay}axwAJ TNa"G B: sB@Mrg F"FVm͂y*x>Q^SW9o#.(=;'GNM`PMp'ş-qR~s3*+"=~fN>u!dByp=&&dDOH:X:QK/YM/?h\hLpfY#=SQ`DmgǣWXX_R%qK"')/CP҆,i~gn q,r~0\9Z"n3F>mqA*$SB(g %|B<൫gc/HyvnV5ŞT0tM̵GAA5AIwk" $2GFLnMTKzfX|X*k~1s6i3_8nNMcY5e^Ϸ{餜$ Aws,Ii9 _.gs03ruL)9+k?_5(5X\ͬ;.Zbw*"{ѐ=))s9 $ bcX/4b_#m08Իb{{Wڇ}cUXԟe JQLOr\b HޔGg>"\{R~@T7Iުـ15Qqam,6Q1x W-b~$%vܕf!3[8wU<1t仈|6%Rov"g,H79p6?c> BHUF =jFM|qR$ZZxJd3L}j#Bdkfb}ǐb}1 9t;מlIc?+)Ƿͭ6@ _DO^Q&XǴ.-ra[l8n72{W~]KξM;;.~t$1n qQopzwN\cƤg4Sb+N:};y vnCK pPR-u^WP0D dl 3nLג/xPHI:ENE.25}1(Ph!?k OuqywJJPչݝ g*][\ϵJY Tyh7ΰ<=fSRG2D"#,|<`8|NrMQvzY7jz# CxZJb, @.Nd'`d=~tPc`?*K5"~Zay*yJ/̓$"ݲISiHzzĭk_+BH -zGѱM{3 X迪M 5M>Mb7kK[w@R dvG00 @@/\ (zz@-l2bGy5A߀MajC2 " nBzHHem(0?avyN?C@(QFӂ)cHbJD[lπz*ZSl5_RbBM:EZX.+v.~qr6;j|'ccÅcŚ_J 0s#pPX._4b4;ȁovͦ#Zw8(3lKj2_ J Hm TL?ڼ%V 7iw w&^Ͽ˨EH N,Hp@Kpww{wwwo&3a;k͚5o/9UIUfmE-0EDhy1[Q2_e:lwnǽn lҭr(1#Jd3A4Sǁۇ* gK40=IBF &MF6N޿Ak;8 7Kሟ9k)Mbh|n;1`k :4@գ,f^#bAOTc5u67q0faemקgD7߈hnmsQa}G54~h~ @ގ$L O`PRx7q Up/.;KpUq%e6"z%L ךPTTL_ ck4>>h^w~ "~W`R9 ˖ӕ-0^?دM\ՀíkxceҠ#F@ʦkT(puffxT9wY EV(#ߗ;I{3y~pj0wc*#rG4ptWA*>:d!kRe;>ri 6]WɤE{}6,BQݒܩ]@18 kpcjJԪIscu4"Ht.R!|yêD-ۅ1"l2?F= 6rGƣzIA'SBN`]\N?8F&Cl& 'JI(VѱJJEH" Ĭf5-sfϚ kB?rOiuQ|CT56f린繁~NH:=J'>a,>t~tJs1CQZ/珰$.'kbV |*rRR bCYwκ,Bg+90ڈؗ|O/Ѧ͠T{;L1}Нگm^CdsEeY,s֛ /|?h,k ]3~c"vw0nAuAO0}{;c뀰7 5T@eC1\ ’d>3&;S:0WodȌ/OeGK+0ERg<2-tc-ɺ 1H<ǚp|ƘO/Z+݋ עOuYs11Щ{cSҀ|< T zd>57O?^9 \ueӗ2~a/y(kL57Pݾc7<-W>..QSfwt)KWR( 2B*&ԋ$Iꌫ4ՀVZ=BRVQe|BI6zʤIF hKPJP3 TE/Gy2>C"1q5fr޼R}#Z̙Na,@֯^mef?(8kc;wˣT@ ^n6xM߀gK(t*@1B~,N]̃ +lbRyZ[Tj ڸ5](×j챨1. &hbKwH  S Ѷ8.CQdvVey×E7vWOCQqOn-=DB@WfIQ}GEU] _!pD *3XHJ2?|>&@w}:GH&w*,biI&Zr#b  `sKOpQ0zQwWA|Ø/T`4%#j~2hJQx"wҕTT[?XEGUf ֙́zwD+Qyv0t,ts-x^ X 5QdaMOIkڳ@tJQ@Im>ջřna~=B aL#y~ P-vb$ US|`hzy c%8?d F^?~52 ?C\yBd wtX>wݙ{U\އ: JǻWz/eG}[熄Zo0d?agўח2lm9h;UL7taw'.TĻ9B 45*o;oobF?!wa$ʚ:ycO_hS B*{а~4ze;ݏ]gJO۟@绪fhq50H9 re_ZxR'P$H)S(Vʕ@g:4,hD͝?Q^dNW4}RF Ϟ peuwڏڲr<˺K?C8l>=n} 3*`O^A;8MQ:p7`,Z6.r|<@3BT[0y5#픸x$B1oz,ed~/C޼X'A_Ы_awV??"\LeQ9D38FZ6ٖZQ,̰3VO"VbKnУ|1 7/ì8:E. RPSSz%KvyXc&-gZer${ɗ*PVSSeKQdZaa)2? 0&/ͭms(6&gGdW>쨗[0 {Ў#{ R! ,m4XnC4G٥c2Ag[3;/_8&vo0L~]zfJ溃ߤBB{NgAī OL+v[rkån} a<˟Z>.ۉȒWk6Fb!J{!-˜h <эoMZ^l?ruX ZcW3bP2u!Wob~NE%.Uznzp-},\_ZJ,u" q4y}?BT[1g%)S1kumr4fmE?C1*)I>Qdb?cCCI΅|2wQN Ҝe_ba``n!$&3 (<9(eeZ#0¡KG̈́ƒ⃟;d@ < ̸KkjJMdp8- hVFU,"yeo.7b=3wzkhx2F% /90(eL8ݱ5>P?C(6zl~aaסQ*w_SCʨZ!dFit_T||:9y~v4~z)c*o! ŧh,2tc m}j_:T9r)Ԭ1:p69:&~AA+W~>Vq\0Qiذqب~dacAKU@-ۇ ݥ eLܚE?_eڭu8A|\%QQQ9E};S% &rdQ7gDĸ ݤ,%|OFD&rq;\&B bt ~J|߹r KKoتЍq 0Rq 9{_$ ~W<ی E ?~ (.3S(, ;Iǯ{mR*S]0^Bb9cld=Y:K1PmX|$Jq_),0?hfIas[Hw B.GEG%A~繄 B .6ڹa`ѓ_8O>qnp4xT PӲa;!:@7BQ"{c{7*|@ӷ-A58H#)ˆ@0]fĄ]^2z CixH Z#*(jl<$24j#o\ hK.|dML n4w#)IhR"8kgIV([MāeB\qmnI p Z, i NG %n48cWRJм1#pR3%)jjM-=%%[#~k@}eA}E?XLcWOLX1 %Ty8-/{{)hԱy¤iXhӀ8{pM؂,Sjk(YWJR'~ͩNN 1Uh(8{V՘Ͷ+Wத'p|1بY2 W1T0SgQޅ.A0g`#: d[Qp9DxeTj-we~sX,w=CY h7጖$ &ǧn Vwd8Gl;ƭ*}; 0F+CHZ\:w*V+ޭ}EP4tED`+snI} ɾA+ss ҩ$JA͸X\(ڸx&!!&.1f t\rUwrwdDA[! :j0Ş3%Cxs <{P<t֐,-500XVSͪX8dPk߽CMV]"`[S򱝀Z%bkŪ^``hnصƂ2{7r[p:p~300#!Yp&:sB_S{Ievƃ,-2%>ZgDc`B/J,)'+s**t=\~BzleM'QYRNyz7m{mF9dQތPZ5%Ie N'~̄LH/>1Ŷ0OKivI>XW}6sJb~l[L>m#u|<͟ZFjB܄%ךЉ8Ѽbx_6Tvc@eKFQ ߼ 2 qJRp/n63YSN2Nntc LOqbsEl:n tt{{m^s*Q~]rƫ4 <9%;J&rG+΄kJqL#Dj*aN\|[ƅJb67CefZ@]?`rWR*f{C졸t܁oCŦi4m3tn쎷HH ^kU]/lKOV^\ֱrPc+sπέ6ZR,H=nmp,J&I h2@pBBܐ?Uh]L_W*==b3lDDw)rYë\نO@-D H\ǝoVu Z"|55nE` QSG2U`,WΗ GN{JRaJMNNV ρ!Ca36*9 E9οhyWn.0ٻ^1à J92|`}+3={IR__T~۪N:gsmq 1-};@4Hju(SĄɅ%T&pxY/*s*)1Cc?2/5+#&|*|rplތxJ>\`zà2u7.(W41q} Xr>g-z0me̢[֡|\RDr9Nj^Z1B b;D#Ww J,\<nj>?u!Q;HEd]gNɕlX/ňӳrLƓ g~8M:g!@.Ѣ wl0KVíz~ACxPl)`<* @2q8]SnMM;G2IR)@ZlX'e{ Z& Կ+(A mb{⥟1 {DTZȄ*->PZe;="Ojq"vC}KIk " |1铴kvf¾1ZLۃw" Ği]ىĬ3SU+"",rЀ5%55$w7gH V{L Yu2zO6v=o %?aIY5,x΄=Z^ùes?2`#Y!Vw]-[^Ssss(%xNj=nq1;JzbČ ДۀF3f 8o$(Xjў:$UoQ2))n嶧Ⱥ,&jV.6z@M2NeJ7㴝sxrj3Y2٫ߢP`o} 5cHOQxdh'xN(,nMrqhw(yV=ZM0ꐯN#&&?ErY@7C94~HMCpx G3y5KL]oD[ dLHc #;6W/LQ.R7R:smg4eta)cBבsoӣ3ߵ!|\7Cyߩ']C"rpTvnGm`?;5g3m8%ށƭSEX83|ߓ;H'mÉ*Yi#~Ofoȫ=عrz)3܌4uܪ#U2e LoscPw6 wJB |f^FKu@/]61'/HpJr zyag_`6 @*?^O,g JgƃCԣl s>s4;[1'3K;($oì WV x{ҡ#й@\[5^],hfYUh;F+PZ.pJ̒{N~;2 3)w ތ/_ؕת%s?)j\/D,<ɤ Ĉ@0 ؛-sP{ca-MCsӣ4:s(lf>3Iq;ߦ\owde̸kŔ#cs! $Ks AGn@5u\1{JH5nnc1>5^y=PkcNݗl9 DR|bg/:+ 0*qȷ߀ɑ?~:y}5z :EO:IA |2Fyxd;SgȍZ#l֫g,})mz<$$ڣcMf θG;Q4@\D! FcI71c`jAfs~8̌m\~=gb/.Jl($R*d{\]Ґ6?| ĨZݳ*k\(_L0\iA%?'Ac§K'̵`eS U|ƾRz>&92 A]fHH-63pb _:\fͫP ܲzP y;9TPpS @ 6;J(Y#{+]evm $ #'+v_`r \0zj!Wut6]|^GZ])k.~zq@ #_KQ}c myr3QIz^-.@\6{PD6 ˄Y/#ggg(DdgțReFG)Nyiokhaj1X=1+SA/Wxzz7W{73f"SBLᵀzXMs r]p5gnS wό|:-i\xpqt@-=m?au z*83ւRB_3KܠˢpOCbDݣ 6w^]¾n?Os9H@3,L9E4o=m?Z=pT?<83; `,Y r JAw)贩I( }S^7 9xhSH7E<~m0!HIN }r-!W@m`h=g,PX$i6R*˿ 6[Z%=* 4i56J|?ц(Pd԰uFM< uw5 @DV?8] WfZ&ݻs_m kx.~}.@;ڪ>apϘLe*Na@Q!.I̜I؁^ڳ0 F>j΀RǚRF`R|S2$*cofPQ9s|_nfN#D^aQ ;%Uxbzn(*WA M L4 f^nusp] G̭n.ZdGٹk06QRuw| zEh J2}"Fų k ܂Jg2 iC۔pvN .yZ "cO ^ mN49fs,?8YUm̌)ZP?&@ȽLxB ]}C}AhBڌ\_BSWJɓ710oX9#3g3("x2 b.,10!8ur~uLcx8m I?sӊC@dF39Ϟ{Bk:F;rB~{{ת*nodeo'6A,8g0^Ól슟pTe)Wj `Ulfo\F84vN!7ICKg&;VaFK+<]CMKֲBr5gC$"3 Hޔq`oL!_]WjCYK&ЎQU&7wf E)Ӕi #/'7`*꛲ S4"66N\ dOHc}|rP)7雄L¦=P^JQ* k;6d`Y1Uo)p #ĔџT8N=3A*A޵(S-A6fki $-6Y ߋ)-F2v9&^**~Rн] ]̌,S tz A"g̖3\ITX _vv &vs.x pS(v0t~Mme%iR0y$2т"Bu8, \ {9: wW=]Co 8D_@9̉j Xr<1rH(u,ܤO^;!9W4I}T8{:yj$p59AӤr! ^ҊSΗw,|-zNVpqq9_2pOHNPR`Lp^Lm0{, rl"x4B9tbXT5p.SQc-L2A ['9CQn$YRpQg׀4 0NK73nSd]CHP߰Ur': 0} 6$oLaMс"~X=TR?ZJˍ؋A7$/RO;AWA@)ˆ#@}R~\Rų#HEb ?o(Wd)`WSNp] eS it.Pi1vmwAwsjg{-9g@-,Cu 5.Zߊv[WK:Me<`]LyNV[( q_KJ-@'[jZwlu¥ ]VfZO 6:%T ܴRۥ[\R[k{$O+$ϼ+z{^a` P]/'ڧm ~RSlrH+9uǴIm-n  .|ʖdwpD;$Ȱd(911[7=YԄbH[Jesq~pdhD6}>1^`9q"3@بC3==ٿ$'ç p˝4Kb5 ` ]= AlE!?3@Z2 ˟ې+`u|~&TXR)@R1>; 1*W˜U`P9no߻P.L^3N E7nNַJ8>fVZMKPg'OwBAv{Z#ʋ&,Y@Ic\|I(".sTbؿ=D =_cґg ˱YlG5ۭ&M=Q8Ö' -N@GD4 AQiuZtQ;z0garC,̑nwJNa ,"x3Lmj^j|*O7MdM@Rhks; wA4 9na"ΧXHy %پRC+_3Ὺ=A6C{p/z/?i7:Bma.sc}x@ -~sZǣ"$u[sww} jP\<!;?JeĒS=:4$x\=ԣ>E_ka<񝝳hJТInt'|$_=5VΖ9M u?-T:c8-LU>=E6H g~ ]*89qdޖ8|OU{Q6Cݻ6!7݋O֘\kKᤙXw7m0j]e-x[s(?S߂ټ)\ТzB 0P|Wu:2Sn&5-&sK\S ? +i|-l?ѫOuf, #jiY:SCB)0y f|Z,+%_UhE %n(˻S?3tn\uvi~PTPa;+Uu.bjݼ^Lee^IebSǧ¡x(:i 9wSqU0ru/l>Sw/YchuM{|4IA.~4bT{BTqW:xd"CeWǘDmj7)W*\pB>~ 0D[TAڢA9d,ja %Cbƌ_$IͰ[9`B %JTYFր5̳ B-V|y5ZwQ!FB%BqBnZJChmLKS|gAO]ܕ 4b6a WLx~f$k&!D'˟"RӶ95VL<]^"/c^xP1huX<'eZʼf~=*[-9&|6m!md24_闘XC_?^==Mmod*mr t~YW["!{cUr#`qy9O*_E qT+6.TM֥ NiC)zb}RV(*w"'3~J)⪢ۢƸqJl3![dH Y/fRf*YLw=pBfM$R S1Ӗ^_8!0Jތ?Oۄhn'1&1[Hac$ʧxF8zJt)xoIΉ'º~cZ\?Sdgn s_ ~CVz҉ gfhg[y-2Pah⮁a']0b"6zFWˇRHE )RAXM c׼V^Oo~,6C%66~A^73F+gAot}hN|7"`9mEisXFƦu;.# Cik2J ac;oVbcS759۴YH퍻ZLZ{T8<>-E#ĺIC)˖N\6=o明cIJL~ν?&Q3KtwFkIXn֜4LGQԬ憹Yk+"g[H2u2ϓL9}.k %[m페O EmRєSE3* NC+MT7kǪqY ̎%kpNZ)mkDV=W_xo/ШӾjjt.i耘9{p)82zG#3W8H EK"v"iC ~չ?l@|Aѳe `fŲLDkwhWոܭIé˘DkN@u|!ן %Lj=aBµU>Y2 ?UhꂮK4ft~*|ڛryX7XO@w=Dzˊڨ 3)L{9ӧv(\I<M84kڊnx>s rϓ1ubzб/-I_/6Hn{ʍpG~ᇌufmdKs}^Ggx@3aґH?| &^y]N}aN' Wy {)Dt2%:1?B8:aNj[Uc*cr 85}ʜ]7AMYh9ķqʵ? a;,1~k1iP yw9xZWPF5V gWY)B[WХ[X/S _c7=ԌPYr\.t#׆O羞Z%/)t<2 *Cvկ<gr-CF׵;C_tНܡcyo )+M4o)2$M9]N0y4_;x#`϶=_𙣜:pK]o7_le`%A qR%N,xnӾ(Hu+<+ iWs -^t_VW;+2Ǩ.%q}f8ݽ>=gߎ+CJC~SNPE{rUG-}w '9OظGU$zaC]3OqNO #녟cAuhLDܜH# 9(:lG[ԋGmbe_Pã+w+cSߙQ_$i;6&H3k :tcV6h֣Ѯݱ)MؔrHN+~zd[E3pe>)]*鯶NhZϒ$fw5Qp#ސCַCm =kRm"\;ssSA^cO9` ] 퓝9xAGu/!KMwl.—xr^"zJ Mq=h"-ib RR^ [eaF2tNqTf(S9øyx#|LJ,yl+yI5\DRw’>|*2/ dFAR۔]'-]mܭ( 2d|3%Χ F<ʯ! Y ʯ!2ֱM9?f!?c' wA_A1)E2^ 7c\ yf`^"/T?!^RoZ~g1ߺߖ {qh:s6E8P+4ckKt{A~6LM Gɧa}[:o#GmJWtH[|{ EI.9~\r. CKmsYU9)rS)r@*pC#opqit(I00 9KFӮwr ۋ;{:~-BĦPN`ǃhTe{U&?[c̥R˙nu.B %o'4xߖ[k3kmoՌ|󒑵GفQ!ҋ}e6hzkIVXqBQD1sy_\*c#b7bs1 xnf/}ty wr4N?+{TN„]=hfyn\d `%(B]x"K>#2ξg[RkbvkP9scc)hB\OpȮǒQLl_h׬ܗ–Xg}5Q@Qp*u^Yu߈ғrX+Fls⡊{}]Yuqt!עz<; y4mׇ2AѺ :nkB^qf4w9<ugn%E:^ੑ JrE2W^aP{0/eWQOǰl?Y#љ{o2.U |{jrͩ+إS\f?+S6i)$-+{ N7GnQTQm̭6wTD`[jЛe.oRͤLxP؝\e}/|#T+ќ]ݷfxc|n;e}r YN~8m.ۇzy%174.SͻǷG;hy2ﲃ3A0qa /1#9}fOԲyعС/Od|B-yKk7ȯKLE∋|0 ־ MU;L=.5Zu14!yO/7;1{@\2uDJzQx7bD 2k٢)K9 ·Y#zѥG(AZI,rӈ:09aqF Bo%t:_@9U,FD(:;q-m꣗p_l5\= \ Ygf0"n-%߼;;95*ywwS୉HR _ax\ψ!6gNvav7<#o|ˢoSMl#V=^'!GٸpŸBӁsA҇Vȇ3Ts%.4/a)8hB=rٚQx8~ʴPg1 hL) Mbb]6tsG77y֖#t4(9Xn'luWɼ)A_f]c30ëQKvT`h^|]t`;~w8Wko%ڔӤHR+?ljiʦ] )x;ޱ:p =|Qz E(Ne|sHwyਲ^+P\ WLVٌܘipml[?D6e%%[fG sSCn}nCvIhw˻Cw-ȵCI+yޓߤ2#(̉IV{}wtc?2͖L <( .Sz0dxBGZ .>BW]JbN,4WwNP"d4)3w6i~^ˠPtRǡ)ojÛ_k@]`%HH*pWۆi`cxWL/.>n3**q@zb:'7^ڃa]ǿTRBڭDwmq˹x9]AHO< 3pL_#; '-̛% jEh`}ܯUtfO'j*2Jwk !K_Avc{g\95۽4ynp㯭ۛ-p^1^&!qBV;c2͛'eDɡ([&5O4@HwT_lQn-3/0Mں>It:qx`ihG1њX_k# Ep`|e~(0QP# ha`.t/H6 ܱmͰ!BjV4=ڦȎH@H OE{ȰFC$߯ӣW̿ęɿԆg ӡgi*g5I-;o6͟Ŭe`ke P G,'pP|JIzbgdSU.!9Qr^rm2|Pw~ K'5˴M-ٍfs۝߄nۦbdV֮i1g;ciM-_i$H1QtX +63d0&!؛ўp$ -~Vcr_73[7iwNXGhIfJ]G"ݩm0ꚠ֋ӭ\KD{.W? %EƐ َՒ 'ej{&٩~7DQWϗ[a2bDšZ ͤd֋(Dj}=xϖ%3Pl{D|kx$IEƸLy*[y鍟5j):)bNK0t{cYUpҦ EђRR\n31gɏQt%&38oOM3u];I#JZ7J'\]EEz]\ ST'U"\)WM䵒ƒRCi-p {; b,U^"r_9bx>/㚝ݴd^FjmlD}6h["|9"1h؇<7&"eu-A۾'q?C=hJa_a 羀b?䇠cr 'GM]~F{w/vLnf9r[{IkKNGWv_Iu^V> :s-q] @ aLT45 lǯC|*?T~L8ThU~[:)M R:G B|ǡ-s{L-iv:CXRDTaȨFW 1 IɺuFS CG]: BJBN-ĥ-SG =]Y 29AX{KFҝ.p[/wI?03UMj. C~q6QOsrZ4Z" Y!?@^3ރ@l;]8^7|ĦM'Xeζpi~5XSkWo*@7+q1hHyчsƼs3})sxND=%è\=}H}pjKqk"uN}Ebd$\+1{ؙG<4#Ezw鷥xe ?`*9}~QXUQV;*(}T\Us.Z4 }ܽ^?Q9`(VKc'a%7̕9{7L~ jwzYgq}LB_:zECa_MǽR%b6θjTU8oJp ѓo2!a۝'C'2'wE uW$ nn\NujJtk=@W M)k)9EH q6 ns Zꁫ}ވn.f-8ME-o#o퀊=q98.U{Dek_|`EWPzch5.gx8Zx^R[S,/8Kqei]Rim9xs{}6wl\-fr1)(I6TwÉGf\S;OSj4H٣^m\CG 6V;B jXCVOD~3bnLl\&`ҿ.-Uٽ$zFKJ- |60aL C˧;=<1,rq=qK@ˇU 1أ#/QBnnr nIx$F䚿n{BGjOI] nm OUD"Eik؆Mu_*"q.9g- ;N n/ (41^B+?(f/ȵSlC.;?pi/cҶnAzˊi?{Ő~6(r Dl}LАHY|\ì`vSNzA40,کᦖHv;pNjE|Dy^Q!'J_}S/? rܶt2=h/N7/5;ByH w ߻|OzwhXtCzgSd1kUorx1OsymD҈mm~ViZrsRtONhìnu2K 2'2p۷Q \戸ofGT]Sv 9j61&]v%P>Bf.L ԜhrOT[t4)Rkˍ5Nuǚ\C K_$\>K >c4\e3,J<l`r+d=Φ.s#_gcԦ=/V{=8~=@s B)ޮ>4:w]C"j-Q/U:BAGNޓhPK+CIے,1R/9*rv}Nt'{lW\Y#2g,?n,hlp .X8qo6y|WdnFho޳Ӊc>꺐InzBEyzv>)oUk-aèDt`>ŭtqPқ 3~?s2 ECE5:^Nőq| QQY}67K>~|U^ v푺}5Slrc25{3ēqHBF>'T)zPWO=S Sd!Ÿ}%^ 5-_ ^„M_7*ew|+]}Γk8B|!;o&oI҂ҕ79ACoF)茥Az8TDb|)XsbKlC+'q-KSˋ7l$:fwY_} !FY ۯ׹$'/;1IKdAyLn70`o2vῐ nJwvup>BBa$$*tT*Ç|)4neVj̊% * v/=}NŽ2骮#|QB6 w6V+m]V}aUYa}z\߉y㱘Kk!4R;>jV>2onWok`{>[cIF lؒm;Vֆps.q3(Q:82'3f?uئ嫥K7? <]|qziuD;Fm23i|t]7BzЬ'a2VVKrq0Q~"=T8;9r$ARxP-٢e(~O8R})@u3cD&iIT"K6Ǣ Y1zV~pԽ38-Qy#=,K!84Gɨ&6m-s&!JeF~%g"31t" O n̏;G{xBퟑK: >-mZtVu ہ+3:#{y)?%֢I{.̌Շ+Ȉ ]HeR4Tjj^] i`Q:D1"s"~e&7W߆^S;xi'y{z4/I nhL~}UU{]hmrJyO dduO,1'~"+5邢xBep"qdugѲWx W!Tj* nNwI& GpTf`HKÌ'l<49㢃x19"旺:W-O^rws'#ug2zv]O??rzo#/x%;ۧo'e-=.INz?@0ak8ld& fQ5WB=wM#V3Rލ[mfPjBqKHsl3|~/ Ĉ|ъ?}+Fd؟[h ?^v`f*aH.M{M"+qόW^rWc/=/zh `}=jjk /Ǟy5O0~)JD:ho£y[ӑ7>r}y*8!򁤛M\+O?ݰ_cj핹_klP(_ecU'%|0lSHL3]^#^'OMXB)>1B.E@u@ օștgL%-ltT}t}euo`!-Nx­s~damuB2 8Lfs ZɽށͪtŇ |wxU{|[DK75A8iZć:9NRC_(|IōdLn忉x%EZ?ia# D&aH2}16=g`Mjg<\e Ty|E񤓠yX(2Q(!RTQh^=>2O\NW͈ՆYbҋ zu!#D3b25L{_i@탍>%6*lYdG?pE!&&@M%CuLK&u{Bt' 0O[afD൴(LtUEbzd*Oqn⟰^Gc0 +]3@b1nUkɄ\Pw2-BfƗzlr,c>/ew[m*hP^"l&Zc[齄aѲ=ȏOYkzʃXs+r bxќߓmF"IMĀG7J4%fCH]e$sexsO#eEA.b2ׇĢ$W—2$氙qhq3>|}l1W*#ոQT6YwB5xLB׶No눵~kHan$G~04/8r>Dr1|2_>FYlY#RG23O2p_W00NIw?anG:m , _ Rtiib Weڱ 4ɲ_%2\lyLe/k?&83 ϜVg.<.8lXi#UI:~@Gqaw+\Nz+qC' "^ %YTDQ[c\s1i +ҏ0: ň׼!֔^eWc @k_ Tiy=G%-UOԯ﷘ &_\jUYWRcMkߛWt?ꚆVcbvHKʕvET_9K0[O6 w_u~<;ep{ (yG64N]ZɄFb%U2{Wܷ#</ϩm(})xd+G4gS}F謰 VoSA{7/;Ϫ#xқ5_8P$5R3K$\"jm <=FǴqn8,f͈I9AnA,Ε2=A\/)kL85ƣtȹ }%e/QZ7 1 /8~@ VD'aeaTD+RUUɈBCø14aÇR: w%0UG/ P3N׵%$ӠgWq3Gdlj@d`x>=BЮy%B#8v; {j"IzY)fteAN!6m))T*X  b* UdKј] OܶXhD=SMhX`zC45Pn0c( 1/\rl/s^ {t!)gا,w`D.ne19.,?;dțS#y7P!6lyy6SU42Ks`(6#[ggzoڈPf5钽Ĵ1.a"+<E['-.B&_I;p:Ͱ ))ڙU<%_|q6e]r͗eݕHSDy3k[co)7։xˍ&So7iL¤֚Rgƫzr[ [*]O5di&ly@Z7rcB5TؾQ0K.A?葨(OL lMI#MSv=tCOiz˙*n$c`3"nQ,$V4#kEE&$GV/s؟3f < d(ߗPHʐ#?3]skRfxLxqn,E LX(IR7d#2] }` E e5%B}2CxGb1쎡x.qn?1W 4VD$'0M jxp16]2򷏡=(\ˀ1Q/i4,ݯ"YZIaSzErފ", /(U\0 U9{U# 6+y聨ĊB,;R"0Hȶ0HgH0d8S d 2D(qRAG&;f/V.αS %@Nc%iuCIwIi/[Y/$@G1sV)7,2ڥSifN fldd@ 5 9˂\DxCNрgR˩ cvqDp GEM;)ȅbh2"A+)HFl/yc%D5ZC42sj14TGjYmf;DDC^}2OR\inslVEHn.S@+Ù8QJ<3B `k>-F#|aso= 8U(|$.@ӱ/:8&L{`9(v:&@dr1ZB"5P`+q M%BaTX?<&)؀ -|[w4)B i:4tTwȺЗ_V!N)x{OF9RVj:|؏Xq7@ ~ LA~MOL,sI'jiiݴ , O3 HMGL lzV@ %āJAAF)@4C SUiwJr2iD g-D4QU4LnB2Uz(40bR'V,F$5p ]KB:+"Uڣάq3LWPsJ[E^2 mX. AaVO*Eqi6 CӤ#kQ4DºA Т$1Uք1Rxby Z vm"Ha %(0j_uE3kNR]2b}&k RNdBhNë}{A? 8Ht]xO>6Bq:A,6/BӾ[j![h?IKt*ˎLHE=Q$+s x2zm: O`7r*Z4k]UyFn(BHBHA9''f]GgT`Lই&ɁjNۢv_Aʤ}_!1< ``(t&pڄr݀}[Ps AUv'wKEA] 9>3ݭ/MF[bks=d{DItПgMz Fª#vPg &0 amk`hJ )w\ 6qw"&vSV lhWҨbEM(>Y+ /ۈ\cAp2Fp\YJ-^Z4a!#u0s42esBR ]րRySl"!5SyKMRC,bD  UaY-Vg W<, *܀#ep*0joUҊ![T[qCA sD~03nx.㩣8%UJmNtoOS;by48&t1UOu#zK*]NFp!R _mƒ+vG5 8"+^Bۿ -?zM7M`pAt|b9`=ld}XiˢR4ШcZX#V S KAB⒆MB A\s쬋Z" 1଱ ofD.DLOx]Kv%sh,JPV[L& P y&C&$K&"T3nH8u!`Suv8] ] 90GtT2vnG|Hᶨaoj&t[Po*4W'KRARǻ0zXTFxsT-KkI*ZFRP°!3YӨgrOR l(&_0\7,Σk %[.o~(`VlĪw${A,(s['y-tc#HWrO zMr6$ Nd?b^| O`1;\v5YmT9SATHbe*0e`bԥqrEeRjw}lait8MȕW˜5-վP7`]X&sarWڱ?Ц?Fd\es| hkޭ@C)e"X'_$)vm 9]B:(&݂/h:<ߵ'DI%6MyֳF8+ʺ"u΍O41E0`Rm@;Y$,ѽcGRX%'c8[VYR܅Y, &*1W@GkEd_P bȞC)G0-y  )+PХVwq ˉl?cEs'$ /6Z$W)IhN(06IeJ'&MۉZd24`n L;M(j E"D}R7:$;J˦^d)qeIo]ԙ +ZXXP $:`--ktn!OMRU0ZvuC'i;Xe)hc  E0q@U@VPD/ 5B10THq$[W l٠L9\\H W"]r4p'sQŀMtTꁋi:Ǣ*)G&pU_aU'ZҪaq*NHZѮ@rԵa__*m8AuR m*E/@YKM3@w$Bz !(mV2 i+kKP1Q*_FmT%,k.9B;vgeƑ@xTh3֘2A2CJMT*\(B;FR%KdU&|"fF򝋤"0?F. :/PS`P+yf&V//vOQ~  CC Sb!W~7"L J^6gGՁWTrGHiMț" QRk r$Uh|7ȭg%R{ DU4,PPMД"6N9MjtAq4$NύuHD0FE0}_pҪ q1;> H %Eyi=>/IDY0`}tW@Lcʦ 9Y̲vLQ/iEX\d}+ llD9wk[:H!̑4!Ü $1h)4hS"SIsҋ0Lz)D6H*ʃ4Z)èIϠJ$^W(/E dR) N5=U2*}X,OTcj((c+[i|HԮdp{;P;vq 2\yĚ 9Z(0Bg%* t%t>`Wi2\{%W(KO;yŢ G!4 55c9QC#ÐȨ K)GRU%}_H-2 Ac&mWJ!1ZI%.7@I%2Ip9H<}nFʈ1VY…1̏atpUOAtniry盦b)m>t*kh%e,i#Sm(K4' K{.ʳS]!ҍ*qƠ)jf_;b{r0+@ Ty 0@Lc)} WQ:9G@jC4DtI,B,[5сjxr.CmWuEFQz`ŧڡRHE4pRaF2P^_`7+Ŏvy"*0f[lj(}Q!*O .М?g\ 1vu+]LR%L PbBVJw;*\,BѸ@n$v\` r7 F*ϤK1"83]C kHݯ ~a+Y"&CnAue"/Bcz4mh2$Ir[< <'cqlSPuiI0h$=Vh ֱPt{Œi{] ;שǷU#w0@UzF[ql&"Tbj)Uk5 "թ"WH\:^"yhBIx @A: 8eC\*w!:z t28Պ 1lN,F[1U,眠jBdĨRiza]z[)2c37m'k B^aG2FY0 'ʥZI!tq򌕔r1"m!r<σ񓣒pPM+5̅9oVhMk4E) 6$qW~4Db61b`5[=/. Coh lZ"0M 3A,;ތw4 q7ģ,pc~KEb1|~^ǧm46TQ%Nȍ^Es \])4!{TO217JŢ)L]m.Bv!ҏ` i \j8#4RNRCVKc"C"dZ r3t cl/KnsWOdAL6uucM>r<$@E;^yaA  .r䮰 S*ڧDU!mvZKa`DŜë1m2Qj Ҹc2im ?iC.N31O//K{yڸ5o=! NWF9'&KPiyuGRHi˔ȥ8+qC,&В"gSMb(3_G6nS\ҹhCB`(@wWc:\GAIc;/J%@'pՍv`Djq^2 Z,Ļ!gըN7/B1UCݢMr3w77nӲ05s[9kÍF4R9֊`qIJ.ҝme!UT؎.-^(.QTD)tRLNfRk#33HL2`[zg6'(Fe]3^i,4cvkxݮ%rbJEZjҾ%vءB>Xx]!Xwn8K`Y>j5|{+y9V!#^ &>\? G?_;{27^ʋOpsm{4\/ZhAˈJ2/8qNYIOXpA@YEʫR/X@zuNʊXtdQ Bf#$5^2 w0;3뜃锶1IBzޤ7 5 i vT8?#u0x):\ɧ[õq!7@} o}'~j1t#<(Q;Z׭[ȓ=f~GewKX:9O }~[UZ8a~$_ai'q:͞Is;ӸWӎvPQt[L9z`76s?a\yxY >;Ti\>>4cT{P}zp5IkzMRU*E'ޭEg>>b(ԡ64{ ᫟ʪj JK s*;0 ><(6?+VK⼁ Ksf:L47P+@{J8·(DqOSgTkvZ]8`i=h(j9r\ݥy=^rW܋t<ϔ֩Y2s ab44TXPQ~ _~jfOue=z.˪YU_;2ðhdCd=Mh8rH9ksByU'{f,ʓru^`C</9&˨G,ӆdIJІ&x|1f?%pcv9Ӫ2HjU/L&&oWHǫS˭.oظhY"al5b0_IcmFbE1yٌqHFj/Eʉpw}%d]B!/|akzO~8r;J:"Ib([] x :W4=YKNvB>.>N翳vZu-Ed^woɵOqLx.NQ 3oTrN Dݟ3a4SLS^uqT>xU%s8Cꃀ_enycw- c)W'z]+Jmi 9P|zA`Tb:vakehk~~RDJ6Z& Q`^rOhr GSlygzyRe\<#%S`!%f2& -Hsfpx4kc&W.~.aVtxJ̕37XՔFQ|f=ܸ=<<ĵkѭ )0iR}RxxJL{kd*W ާ>⠺,p|6;fྃ?+^u1~,;}8uիw{\A=}W]}U޿V;߆GvϋF%q0hpM%|%Vl{IwEoTBA,)?IXUMI9E/8PgwO5SU>(97wwMwǜ ?>ӝ;9ѻ_]:w,?HB6f|=مosO_U]bAC?n>5 wv١Ւ؟H oP ^(L,޶ɝh߹X("&1IwaTK/Py)Rso2#[XUF3Hj;F.;c:}1%a괰Yb]xF1bUċ%㊙{ sEu%vE?z7}+lǭrNK04 CQZ" 9W Xn6aF4PS ۩9dZ?%t淂xA?v` Ur1"8В2+N|+z(EN4+(Y@h'“۹8G׻cl%Iҿ^AG&I+z Rm ɜ{Cw3<ā59-!zT~·k Hă9ܯ8lc7S=_ML=KlWs%/'Y|9)܎8w؋z}-^?߫=痫=$d+~{qE\dߛϊpJvȜvC7Ƒċq[սΌxW譹ֻ!<-n hw$!m}0|%gr~Enjuݤvc9gkNG8b496;OԷ.Cic9BTnzcLM, 4n#ZWXϴ띷BZDuW:{&{-1_?Y^^, ;g_{%ɮ‡ף!e't<}X?CU|-nd^%uI=^=JRh2^"{CsOIH>E+<]g%g[IE4\f =mnaWmHȿzYmmLѡ=II|Lhvu|ݱ<Պ{m1 9ExEvx{t9"޿'OξZcܩ- %堖zGg,|*uYE 2"}<1_eg*sc4DP컑Ny d[A7CSG !$}Y7+_!+-I{hswk8|.{zaDs~{ ޾`Ϣn&dMby{3uKH^dnRMKPv4k-:587(*W1-1omLC i]J5GP"tfs yA5o Y&p;UJG _FeztdK>B;&StjF#0̀"FCYF2N7?_2=)˿^}ݞlVANk7Fjg?wq^oK&G< BE䷏clwT 繴Ulp_ǒ|1>ЇxDkTobr}DPﱻQ:^JԊ`Z{b+gchv|jTbZ7S 7.yv|_۵)WX'e_]m"8{ia?_Z?iMDzfyR̬njl~=qgJ< ww?I#|:O+e|O24hJ:A7<DD:V/?U ~v^~Tr~ӆ9S)L cz_7|cb{*n3[;TK:ῐ̔b8dfϞ I c/]6k-e+Rk`lE͋$DF3W|Zx1o-V#n-/oB_$j?FVHF<74N\'GZ.ԝ{{ v}tz9-~]:2ۉrw?gA/`;F,dX1FRjAnMrqt͛{d"שڸ|Fhq@8}.`AqB%xj3}F7K5Ul=cbQ}6wNx~~gJ)(ЋG'i*/ϧgf 9 `/&[<;3w!qi_Xs`e&q#}l,/Y,?Fqk~Tǁ?07(߇uOnq Z|&Q~.UM_W$ "V].-~vXs~ Gq@? o!89ƕpO;&Z/ hpoY`XZċ3/oTN\pA TqM{7ȿ"O vGy]|NB _@g1Д8}Pys:E=ЉgӽJus4$󢶘)t\!)A#`RUEͺgo')w捻=S:oSZË2kw>OXSIH6K&aIVz_/3 }))x}tzmmT[ U4ѳtFG)y}Rcٟ!~!wa:2,ːml<ۯҏb6ݏ5]tǥރo􃵝F @$(}?,#~VM{j=훕UF?F&F0Е?bwJ޲{?RW8܊h0Ϛ[ꇛ5c0;P|mdGv!^=uf~kw5ծc%ul1kF{igǮ{Ԕⷿu3^Q+h4 M{oޞ;',NR֧&ی9ݙviڎv?Fx\e|j)m=D*r=\|*i|6q`,Ej>3GgJ1آ휼^*nh81l/|!iwqr޾nAO2w}滿hA:c]vMߧ3i]eΗ܁Ubs\`I(x'#(%wLz!&IC!tDGEhCS~qLBaRBpdMހ~&C E`ǩKRc P#p)~pASޥU&{iV9Ex4#);!~u+9U5rARh=)'-~c323 ]rao3a0h+ Jjh#"<#2Ѿ~w_R4oF7PT@R (9"DFZʃm;"oFRip7 ]KɈTYVMjF\$Jo!pq8+Dg!b-0D|63JHxHI5 us3 D#]_''~32rj&,9?dJ[{qdh Y)ؐD%jZ HxAzٓU$"ś(i~l'8VASjQh׉TC\WZjZ vz?9#);<?0EK>JZV*Nred_ #ԈЂZ%Bb@#ZIụr%]U4T8?!Q ; ]RIT) *uBG57%8q;mÑ@#)H*azIM) :VQ$h ]׮7f!/z%EȊid/i:{ՕiBlfKr&S)e\, Jt`V?Ihp%;.%緇JM0MzpWH'hE})cXJ B\*ҋcmµY@ +!ꖢ  8ȴ'&f (j ~&V ͍dRF.<2K!ŨwsI%؉'E~ o{ ŏatj~ՓQ<ެ/F`IFe`>S%9+3$/K! p-!7`C#S) =D(r`R̨݂{lVLo(I^0g €6o\ᅂFu`X' 4gAwzd87=q.@ԑu{p$HRpm6dqw"YP7@{CࣕO_\ʫ+C¬KxpKO ? m-@0.9/.!&MAju`j+?H >dADut18F>R in3 C:ё tJb_>b u ^C {b HT(U#.R J̃5ٝ`N|"L\⪒a^f/&3; nq$!#K)limȄ/e(ʛ EzNb shrM!6ApҜ$b`+Ý9 l %".bz\CaTVx8SL9C$TXʐ0$|V_>GEW7xiП죌*^-^>UIWGzNf/Q޺u@5f: $]qMGimFRi~6G|{S}Yi]gk9 owX-PgYqȖ!|LK_m mm]? AL*Bː iP^h8s= nz`UE$+DƎc&suP$[zhĉ}z C`u%`e Ѡh7=>|y9]Q`pRYZ 涞~d>KMG ]Les(_}H【D4gA_o_k&xeoJE^̇ S͝dԹJG{t_d(hm 8c9ohovh+Jyy3|L~.\f̞q+o ؜c'pa7$ܵKM# g~Em0ޭ-6 s8C[W^#:l]:%1?r;gDmf5RA&@cmJ>y3-HRf#RhiJ&cIkv2a QyB Ϡ}76~J_2PP WzJީ_m\e3cGO|T>vAіӤi 'K'q9أc8bCu/|OnVj{#;ݪ?lJgB ^U2|Ag5\]1p9މad? *7 å'$Qg)_b{PM@ک_ 4Z bnb˿Srh+,U<(M~uzbN4m0U2gB6D窈fJ=g3VFAa_W.Ǿ OtuTDlm U Kߓ1[ { S"gr`ޓ&g}&V!(t>Њc+ %*D^-60tOT0t,GĒ4ئU=DSbh&B||dhlb<18-C] 4ɜ351-!z7_62ҏv5Үlvjg^>; !r^- vڿgM% iwyo)c2Yw5M릍`ndJ-ٯ(C-lY (؊j"Jp A,JPـ˜Y7aH*66rx9x:~P*$/GR @{IJ@a ({ f5:=~`E/ ;yĜ:K]<9 HP0ɪq-*2ԥ󾪿$8%*c.3B@dv bzB-IIB)9E^ ~C7$uABآQܰsk`bRG1Wsy P¦s&ޙeh K9/?D9o:.* p{PEBꓛIb,̊OB*10n%]DW$9|ma4|ݵNNt1s.aRE8 8!#yҋ/DkRV^cf̠}lTr; ]Au\\NAu4 ,eׂ0+#Z] w#}G|bOXw,!]5?t `N/t9TKo47]9.6MΫJ#۶34*22sHpi] t*)ݖ9DL)"ɶ Crff8y#xf:_ LRsκ3!ȓ_=tk_,Hg:G/^PN,(i!*g~!Qj & uXe8_^I6!փN6|eۀ[mߑDN"hV" dMa DRBa ,Qz,&H0ͫ*IU߹!}d˼|[[?F e9V,?.rWQcpH&GؕJ6>a4Z{ )'-aܙ!W,>6q7mlʱ@]XC1}i'4gnΝܳ'i1m W*\2 (!S.uCbA&.kja [EBB0~(^ԦOT$溊= (q@W ȣNwYv[||VQ\rɴY9@fe3)*>igƓvdZD 3 HkV*HȽ !(5]rWs3Zr0J cp>UNS&]**U|sVvAa{z@= #XԲ}LFϺS5IH Z6AlռiYDi x(KџН 9]zei1w譙ܬI%`DS|GA2\TH 3@i>[pD ת3 DM`S)g)==H\\ "ftt}M'W,@r :]/Sȣčsq%OSirUIՃoyvy@.]IMx^?ݳaQ#>}Vw [WhYnV<P6rtTx:dF jW! \pH*N !$U#&mD"їB:[{Ig0[rdUzHDzp:}'/i>:nK../S.W0F 2W=f:b;ߗ}U"K|HR*~%MV|,HTZ"Ҽ7@"!r B8QXi,4DJ4'7ygSc~"2ԋUTs5H{PTi0&gJň|#2*E _Ѫ[`f#b(ؐ4<f3UH+ Ss|%NeZ[Y]/$ц@94g`bDC,VBh3Kk!6ODq 6\kn@\qj sr8$@8%}(wIpGCJSVH`~A!u7ϧ˷r[>mi°\ #VduRB jNÀj nb|~UV*pzT#+zߖQ]9 zmC]I U8~gWj!BВ4U $i/^؈eG4Rؿ!8_"[- JBblYW6A?DzTRS̘lD4i7*= lgb6mHDS1(Op@QTׄR*:5zY1Vz`P)A2+*\ j#Ӕ:ܼ")T2g"&[saf znƂؒPi9/T2Z'eѓH#'TP 28F&jF-:#t`Z`^(aMRj ڸ>=XHNj$D鐲  r*cfCQH|SHFC?ɿX.y]ZW|iEMoY6WEHNmjqwV 'x":8Z }%vFd4_bSwbҪ1k)XK`(QzQs8dh܏B'! pF~q=^5kZn[3T[{"_k &#u@ b܂/$>99l.7~#=0d An qgGk5 ē1GҢQ宓}3MajL].ڥOAHCM'>2rVc TC2П0i_P|ڝɄyϵC\D 2cg2mM17e)Қ!>뷩?Ez1ߞ\H4If@H3 Ukh+z$ 56 h}?#$ &Pe(*q a؈[G߸LKOɔJG63EZDžvծ=V"pn˵d@ͦMXλW /+ј3ʪkFbTMmd5Rs%ĀHWcI fxvDR8Ic.?$Q%ЪL 3}#x>?Wr/ӽS2dǦ*UbEx ʒ^˕Z7f*ڹ$ӪœejFUt,x?dI/TЗOsf=4`hR92j?f(3$f>pbZ/O4grVNHԃ˝XxE{ fIWwSx50;mn_rׁ残/ጹdu;;椮6lz&=XkFfL;1^/V O^Fjuy#e!$@ ktg%'I~r` d1˂膶MdPU kPI@_e3{rF=\Ǣi3D=, S3)}O9@")ֿc8v{_O}d.a(IZ48V(¬Vvٽ$z6Z~l<,Y:TrI}:k)j5kZe zmF?"0 ! ౬ FYf}ٱ`_:a [c>g\,Ir #pYMg=Fo|$] ?Ke٩a|JĀuZM(MI٫DN' ~m[og_UԛzqКu1}/C eMzTJa#ENÖ8ϱI:6`rYkz-(VK"DQ:5cǩ3aJcR.yۉӵ. nH_N[wS2Ns7\n)tJͪٶ׌xFYsb j"C,<_ŃtpG@g-G^~+ZNꊴYk=UOcO`;7~`\Kt!&fRc;;S]^6T%7ʩ0;M#su}e;ɆHoL>ax1)2Ezfj)'?XNdNB-BefJ"I; nNT^qmY8-Een "xpe<)4:F5RiwxRApjFx1e5[9њ1EH )q !QXhIiuND0BWVtIڙHҏG.I+n{񪺄sJYIN1Z#"$uӣ+bFj,K$M,wjkߟ7JU4g{ŵ)dCZ7fXJsz5e7(IA`RUH4Pw]0(X7Їmḭ s+D`P2o%1&#I=f5Z PI\該Ƒ PKLtF[/>h*d0LyBj!\]A+J.漮5@daScM (/~N 7r{ 2*hQaONb a,8ӆ?¸9pxD nV %6u݂n'4:T8$9uO~zOh*G‡,u9 S[Y^ :0s%%І{Sk-@bL]ڍN/f'.2% 듀[ȨͶ-M/I;M`CO%=7aL$bmcy;aU &y1SWCiAV=S[8A8!x O^|"+7-B,1|HY[RV $a2pT0} ŀ,r@M1xogA0|eKѬ1w4"LUN$̪=R]mӯRKT3ۄ|IS+aBt*wo•S F]11 ^$WS7ltH0nd\I m Ɂ%Rqc?jCIޒıwސD M"Q$)30Ceę4.+rz"9D,H2`5c?c%O$?p#mr?&|9x8=́uX69 KSPt+/ Q;\+FTX.5Cc9%|VJhʪ$/eْ>vI`Tō T-| 9h00h8 xb/+0Ow9ǘe9Z9r;U.靕Ø[S>g)ggSz|$g+!ӛAn&,NyVP }wI'

    b;@nL&ʗiB‘HYw'Oô[IʹO0xŒR/M,0?!ȁp`Ow*0 a4I:O0}䞏LVsUvnu*,+"eO I͟!Ŕm݀8R;YO>a5dds򅥏wiE"g#-6F26PsT{!KL3`HfJBCb2gʔ˾e92hcُyb ֮H]e_X1wm)S\b[rÌsR Z^*V3f[us=т FjSbJ+$[GOUKX |sԏD0?fxbUNu1`LC/^V#d8+C!.PT&?y]T%[@0@W쒃4RźI1j5!AB"Qt]%Gd v2΄#_.p&KV nnLq9cnۺCk")t7?H%oFyQgT%drcf%P/andrFI>XUcSžq6l%WR QؕL-c!)3{jmO^Ԓ7)W֝UKx7n.X YF/J: Fk`=r鶈~J@P(>Zf3QdYG3G;vڪO O:gOWJZH- FUp{rRN^IR 5˂|=K3r6hMBDZOܙ\7MPkD>+G@IRfƘn`Bi U!r¬4FT I)38c7K,~o,q9 av M2ԔjRY7[v`.5@@\d65[g/(^ՍDAٝRE05 p֑.V#7R2MWLoU޹a߅r럊‘牊ݣb}R =6teh5#bB{>c/w94l-g]"ƒhY*R܆I B5 ? $.ףmLW0{0U+O w;=Q͗/r1 '7OFZlLeR[ey^  7o;L_F׫vXԿ|Yc ϪiSwHE_yrGqofO_^5Жv2oc)nO{W|o(~ACt[l{s a02p9O';ۙ æ^ 62S^ꟷVi !+ˍ~%r㇧Y* V, Pin/#< ΖUN"I 8gwgSo}ok8cYecs4o=hSMY*b&'{stw ϟb˟-yy/}@l ?u/nek7{suUkAtzJoΪO\{e{V{}y.~?xuVCp]0=FtA7֓@_{,$}۫t5]x$Mc'}cQۂۛ,q}h+GP}/l]S2]FQQ4"%)( JKwHwwĀtwK5twy=Ǟs9(̽wP,;]_Z>Zlk#\<^?jIGu]7wkm53"BU"ϲR؎k٘b& 0Gf}.< ƣ lKŻ]CŻ-b>#I;CĽG=b M!\ƪ#G䩔);7"nWm(af #.}=7a_0 ?4y1pԱ]3?|o\s{Y)o1K쏞vZ2 RidlN1|6'a!bp-aG!~(;EcA݄ց] F[7㧎L"9mϞwh%VTXZ)S nӓ]g'.2fui7{ PqY W($YXXN9Obuk4iƥZe+ʳR?u ۅ̄@̩a!RAiM*!A/۽#geaL=͛x9Q̹=K 2)"Gr%F3-?S~d)'pP|p*aBxb>Z*j[H%*QNR*:V5zcTf Bzh ~=L>|+cmhUi@y]&[69!pr6G Ĝszs?)\+sW^/:5.ܽn$&(_>4fi Ӣ©`HpRf#Ipu2)Lt}Sۻجṫô` &70ME ^{xK98)n ,IhYxib)9x\QpvN]MXۜ0雁Ӱ=fK<7#aLyhRTs?AiX s^oo#4N׭T%4AoeVhK28y+W?m K:/#@dzH܅\uW3n2kzY6F'i D.3v@)- opͥ :J$:W{fc!HHdvԋ|nVMZBT ;fJxTBo2ru(چI^l)Gq2Gװ{/= ֿ[e6\SxJqo+ IqǼʧks5J^27׵JZ!k2ܩ^NPƵpGIoMܶw< M[0j1%w}=8}h%́=Qqy3)aBrf{wx~Y4P|`(|lԟ |rrGa]%і!% '5_@ﴧ,\bͱȆ- nUrl2݌8?bq3= ܏=_h9<X=eph +>o.]4ˏΊAVRTbBc^^d ^ΛVvKnV׺ M{=N9/Fx\q7!D;77(.}<srw즰ΛN~0hCnqWŕD;PIL΁A!45~wa@s=0dyVSjݲ:Ml&P+n.!sDn.h d%ћ>\1W*]l4H(`as,|Qp.Yt P/l40- ŝǒV?nc:|M<;Ĕ-ʘ $͵+I|zm P)5}WgW;[~:by-Pq^M#>~)VK0`rØt{̱!XZMYm E7؟+_{am{oROհ - m&fw*^NiCy_x4<4ƂݻVQS[2.1oN{$WQr7R$=2ey3G#J]ދO6h-KYqeKc Ϝzg@[:ٚa3"JphE;ϝ Z akEHyZ5Tb,dv-sKj}GUHne-T<#p6ŨzP ݪy^,0r- 8Z]-UAa/dLYutHƋ/l^vJ C34kNJ/o*ʛ"λ!7K;H<Z{)jbosXמlށCtsyd4妯 `=W0uL?F{~_Kځ:m/$]'Hb=qöhdHCFx04mwv̼7Ui)xa-|pvqS2wws#ӐOG2{娩ӝ>n_<78ń].x@0 K>b7-bb>^Hz!>l;lxfSg'2_ڸiJ[Oa;9__n.@A5>o)6dZaHESþC}G2;=ť`Ҽkw{ xVE V,U߽5Jùhk{8A,160Ɵ&k35&vcPlyl9*y ֛?fufO[<i L [*n5֌J#i|ʐ][U twd|X0/D~%t _w|4M} ouL#C־@Q\LvB>ܘ)pޭ~CBt\*J! ]B D!;f9(|(tSx n/]x Dt.}YuԈh"d,\lƤ1ٵ ;m;@0mq] 90>clL28CPk t^!:k>蒻Ķ̰̌'|ޑ9qXPUG5Lb=.P0'رK>i6@{tYI!p*lol}\(wr5`ؕmw(}0l8% q b\͢}os?}xu?#~6u%>gx-cٺ "VVΰ{ iۯ%jO]yԄ3Ztz}ʜy4+s=1uθ_/1&czi=ċgniٓvts)|F!&o-# \\zT^[2-]ϟ$ $("'|4|źtfgDz^>ݚNn+#< ` {?QZzXO`xDaD6 =rڪ_@>>Fq x|9P]Nӭ/ՃVg{Y}0N & $ &|L anׄ \FCR(=NVj$A>&6]H!ืπ_HmsGRҽ@`bxwjηiïŮ1:}ETZi0IH.]pd=#[ip8/M]W[G{ ߯~ 8\ ᲋5j:d+N{XCHMxٙJ>IF.AKՐqV${]-/B8)O},gUiqR\uzul/W 7&%O/$$mӔښfpaLyA]~Bg_ RJL11 Ԥ^jRDmbdwv1xN'TדuF¤ a\KWն)4b?娎W. ȄI_*2m<ލGɁŮ)Dݕ7mE1XgZTDMy#[/c.6s؄cHY.'Trnj,ReިK_>Q1q|b2zDn*q/]G+İW|ATr'2!<=S|b,=1PWz~.>S9­$;3XﳵjA*iR_OۼQN9YPA.p2ۀ#.pS8s~Byr*{ ۛGKeaB(~`MYL sY>׶N$\gN)g<%\lwӔF^ ܺ8ٿm4-0G\]Uoe+"q(KZvFMm+L}'H a=c/H%t_?W_n̲y]:DF9dʵ|eWOv’c0-VMICIE{_={Pbِ9 _D6=Ww?IzNE[jHGd|=ˍwWNѯ\W5GK ?G-%c)DD/#e\d㓠 EhX:19/e#6yLc @5Ⱥ =׋ڋ=OPn_m~~{ju+YyYI/Sa7vq)gmb3~W~ί3ynŀ`픛#zlrH&DD/uۋ}{sow~Jmj֙-U2*Ql +cc]q5ZV[g'4v߫/Y\|#)A/_XȊ7d?tKwRLڵ\ C@&uo 97Y|P8݂l!YC)踛92[O~]خ=^M}rMgtsK&mw)hj!旸UD}Ԏ) [TJ|:Id&s E/ \=7ڡ3mn|,_a/#m3Qx:CDg?ݝR+./4fsT?_UMO͝fM5{$R󲳭B7N(.x1/rE#,8IUn|hJ̻IkMtx;_Ay5vƼVZF+xPۓg^@Z6^͹^rs C`]ql_$n|_Y;VţAj)l(G_x4wF|D3ݒQvRfƻ)楐%Ymk  6y[DGn?<>sH39ۧ c=zć-DϠ=kfރF'Ly5H1qEJ%}Χ6I.Z9XMؐ)q"$YբK?UVϨ\]½+dj~ n;R>vO^<a>RB0&ouE3E/e=ubNZ|xb*CQdJ?Ayݾ *)bX5R{dc$#Vٗ9[X;4cVBm''7Đ#Y{j;^P'H{  j,4C3RvۨoU/wHqG>OtóML"]CWA{54x޲'fWJ>UϺ]ty1m4ٺxE߆ Sn6&S`TC}L-m]deftȯ+HSncAp2EV:6AW=Mo8f0]yYptNa+6Tl-so|OleְY\#=݇}E`vBu?o$ }vƣscZSHAVt4jePvbtOKbX4 Y/ 0dQL[/ݪb|tgbR}#)krr_x奮Q9<_m\~_O8Myۉ`Poxg.܅ǜ `P)DRhpqB̓=eMjsyrJA|Y{>oVaX峜uyLmz0 _i2{%H_-h( I|^BnL:F^ebEg8,^̹wq~*1Yn~B/KnnqrT7,"?.{swMH +}COliNVoSmA iz*'>fib夃;wBUOL 7Kxl3Z\P֟Ԟo>{. UuҤ3EC_|aXP{^!j^ء'Ngm)&&\NÊ?jr!ad9>#Xً2>){?([y&R/;e1$Nˇ\^WVaÈi8PzKp M/Cj %w٘@ߏp\{߼-yz1󕒰%ho#*!ޜ2SSYF6%cw$|#ztB{5/?) =Z7" 1-kllEF;*˙ҴG1ϳ`ÅP^ qDܫƿ<k/>^tҟ9>Cb;:ue-gEp~L!U38we2^HHEch(}:%΅lm^jncFzr& z)*RI1{Cj/K9W}oWPu {qTQTp3h^qd =CXyKX$ïweAw{*p`@3vplnN5 kS|logFyϱSs6Z~$ M3%Р _UDWo^~x{H,Ώ|g)U%SEj~nÁN=׏3s6ǝNЗ_ ӑrE)2:Oxx#6azCZ=09Nr69Q!+[GFZ!TSf_6WEԥlx`RlzY#)iʢ{a5ͼz_Gޑu.<،AX6P58s+Vvcz6̠ eGK"V|)mĊm:N0aevx [I=yW퐬q$4g p#텇VAMnה1^=+:6B{G\ӞV0L M5Xy,Mn Z$G>?7_] }k0Hae.ț`yO8Ck1{ .>L9L%T~ƧT;frDGՇtu1MHC=˾Y+m;5b4eQbpX^U_vL~TuB"MQ0 (D=53Ƣ: ̴e>ĔL}/)fs}Bs')ǗFH^-9%q@&=6ܺgk+ gf*!:E_;[lun6d^"1zxd\=%'\i>yZ6Uko{x_% WYJQgwgʼnlv!rѴz?Xh9(P @"8lxdufkuJA%&Q҉[g U!He1p&5gSI6X:,q!y:qXp;KϥO 7!`oa HAM8HyyȲ_^ qQmER8 L6=Y?DV`FRrIO-J$W5J=0}|8?ă㷗F𙁀EȆ?+^S1g{fvIX4²J5 1;y15=ωp|:zgM J2#Φ1<O5Ll -߿.y-͆Z`7YévA/O%*l^A>ֺԾ |»9*uVNHt;DsB1=A\1֒+Wӑa.ĉT!ZC|.2 õ)7B{=_9~HgU5&/{|3XLϟ"K%E(GNb9#.'J~Ch;dQB[kz>REyRz!^E us`9**/_5(t3O9YGݿp'Z@7 Jii\4R;<[ yrvxyf} E=czS/|hE:~JԦ6Ry+s+կ=(K=\ʰsdW=BОsz=!)@†ɲc}x<_pp$#I*{ mab'{g8`xOF|x!KF ETgz~m2^Tey+SY 8lǪ$QH_FgZ)I%sjsm1 5Gog\bו +iYI1'c .kf$BO ? lG;5 > ;1r|Df8nNwGME->U[ŏNGrM22bΉ[UBmBtX>FyLMvb)PspUP0|[N!R#E ƜRbn{< t 6^OR[5OV}EiiI[p ]UtK謠 nqh0PhAtB=1VPFZhEX^wH &)_2[!ӺzҺ;4>dt2u` Ig}<:OS۳. -LQkऻ^!?Cv'ɦ{\1~V%A1_A |xWiG"ڄSO_&w* J:rW[ϳ?֍էR#*\q>H׭3"1'HW:L1N[5.Իn%}96H9&~W4Mi;˗EN|UIx o5}pHM}j/%ևGcK.J- /<b6TM _uu3(= _nG털[OqW]gMىL4}z2CgJ<>tfHFTAn;NgJGZIVUU O˫g"Gv2Ob7;X'JV ĸg7bnX6ݳY>/q/֋%{YU\"ٲWӂi^ <`*(b>Yѕ›IJ7LI{Ő["#[k:48U֢PNv at[N̍9j)`NP?|Q6vYW'8ȉg рc< u0dYX _K\`Dbt! B4HYM,Hf'M@r󻁑 ]tZsثҀ78AIЏxFEmlPj'k$裡_*Ly{~1YJͲlsykaˬURL,jLOv­2u%mZJ3.H:VC -HTm p34)rib)Z4|9m@O#!12u}e-, uxXqE{KĖၴ`TkɪT=$O}`+GvE"~"3&5n'dr0xmJ,3,~Qڢ*|⌂Qlڧ] bԬ5JkΈ/ܭIyڧZɫnm酜G2H./^൛Rٕ)϶J{rIF޳O͍#@4ܕKS1Um9hQ}W2aiCa"J so1iirS yWbpR}o[)+ؾYLMo_|k7Y 7֥z/s^7(0bG9^(KǺfh_bvԖG&fgHe&ruɠ2zam{T+/LmM[ch+$8p:{%#ݕ@B1afLGfJ h>Q0s;=ΠON?m1\J%{ַ 2d8rY\Q\Ldh=4+LpqB֯ԃo2 o1bQh^͙G5Wś89o>GzSb$(XVل;Q#"HW^Ūcs~Ӛa 1͠)jƆ(&wKN» ǜj(K[lzW~g*2 4}N!ƷW<^ 6wsش }T:YU/iHEFn1R %+RP-ȧĴ4.r-Na85:\3rBlf>J#>US􎡟A_o"([(ùBH2ˆJavNo^L }"(B)p2μSl9+ySNmbJ^rvϝ,2}J}7q5ʪpA(Κ>/kx Y`~_#{.+:niگE.~ji8OӶARKG2Ѕu/luaFMgjҢ0Rw(gjn=8L kj;½"MM[Z${4 _KK>]C\-bWPo2evC5ӧ$V,*C^;,iK(͸*[R`鶉^T  y%N&=L]a#$c7Njp&E+*ѕQ͐Bpoe5J,wMMKƂHڹn%4=Sh)qѷ98m?š[[Z=''I~·Qol-*T^Nn,31iJPiOA¬>?;T>u,,=3͑2sm =ftm 'jVtV!E] Zq SxJ,*\'ͲFw Ώx s 꽗ꂿWvtvyJ 2-ȗF^7D1P9y¼_OߦLi\ߌ;?c{Aejޓ 1FyHq|+fq: j3`ME!=ށy^sj.w ;?7R9 d^``{?WF\xRPEN]=]l]%Թ_o. |ɡ'+|zNWt4:G+AW9;yaiL'_N.vbfnngno ̙90z> ЖӗDz/ȿ /ȿ /ȿ /ȿ /ȿ /ȿ /ȿ /ȿ /ȿ /ȿ /ȿ /ȿ _'I.)5[7^eР)(drxRO/=e !ɷ>Oh4^cg>b}Ck\5hf=CIܴ浹-wE-yS-(NΣc?"_ ~SA;wAr^SeJT+OˍMjožRd3(a@)k^LL@c%)dzbсoш} V7-j\t;hXtH=JH-֚)hFI? 19Y"ci$'oFyhdtC Ϥo-c2W59\,.#̜BI棞Eϥ[|UЩLp|)Tj4C󶻧[ft5V9ܧͷ٭&NگbMO+M_C?$#4$\!J m-iєZz:UNⰖP_`[ַ& HI,2`w0o\:2?P R2q|#z2܇ ;/wwK#5غ`[tAa4PozI@/i-AJ@@rjz?^5koM-,˷ɾ1].`2/ xg)Ŕ h9KyY'T57kSY_nl4=4tΫcVAxl fvnzrjS||6c;ncvcc\鱫'}1W7_Q6`R'TU\ "mJxbe~?4\gUo͛јBN ډCD\} *Dl k <C1O$ja#c0ܸT9P:?0iٙjV+}kfkhzd7cڭc>o4.X'| }F>t/g7\Eys"Ȃ+QN-FXKn)ÃSL(,\~l`6$tkOJgF .ޟ1?&_?4{6dQSS8Ñ2Wn#clWN:4쬍3OeiŒ':R[:"kkk_m[}Añsc!OOe4RX_ 1&[Ze <^1P@fosHkH,.IZ.V ^^JBid؁ `C@N AtgNxu`\X.l*mVznڞ]_>tf6#{Xn̦A R>wFկ/83XRh!fwDvs{ RY֔`T}.4sு`ӫ1e~,L 0%lwBҗ ,v$ &c2\7]v X H|-GbltME6YTꞳ)Q Tz2:Z`08)7 ̊pV1H+pr4%>`;xavXaAWP~od N6,FoKi1̹U(^YD_Sx`ʤ\WGm<˰so21"*cze b6~W[^.M{d$Q^N0.!sl92:'n"Z ^Z8i8@u}jD@v2R? u>2ޡc$񄫍;@A;iye($ϵ痞2@ڎUPT5_@J%|-f#;b`/B]*HQUwĿ %|)zr+"@;V\\0"*jP\g# Nxxg2Dn20+dpwoBC99 YV0V qcfUo\alOGg$$|q0Y@L~Q'EA[P]#_H j{rDH*m"LJ J1; wقTI+- լȨȍ C"@'I9貳aAŠP"r,@]d+t|??A D(W3PaG-|R`D4˥>=-kyBZ4C8}׃Pj`EaQ,b˱JK 75@lտ8 Q?'Ppszv3 z` jyd]o#~u+_*"qBY sp4G)yM]2ƬSr/ @>=]4p69u"cLGfqg*DC{(BG#h5덶R.D} O+G%@ހ)ߛHGȿ-Dl ASHx&,`%#}XѮG\-ytWy"huÚ̓LbnyJK:һ$ݵJU 5F?uyyk4u6vqY 0Qא>]dN hdGtAg:?d'g|#'RRdLfX2ER 9poƽ6P7\ed_ف8U>@@Ihhim:$Z#hZsU5Wqс2[PPYcQ列~6-OrTKʐH VwnKٗ?Nt%nbalpQ}C4g C%R~$Ct0cҮQ iJҼ_yvybng L  VkN& OެcJ#<0 )}?9vHw{hX7q_r4;i=Ҁ{)QQEEK3[4!j%f~v@Cmr܁ 'Qmy8zOwmZ6i}XY0$o p\"{Sxęo46 ۼ LA9@<@EEPuJy|\OjͤO?ʧ%W!`+ɿZq$6*բ0@lȾO^qI/B`sʕ,kM!D֙|" &nvuyp +W>XyfdCV>m< QK>502-E*$ IN"H'Pu xF3BZիCQ/.-sl\ty*7Q?̝vC\w;@Rki+4)@rV__uLU$4ٷ`_(gKٹY ->;i6,m1> vuXʳL'*MI˙; $䨞 *զ-& {e%n/f2fDAA`gp }o\z]@\ .+[֋GЏCHeH S5#t}g33^Tq8?YMsri'Ԟ]4n3}@_ `~[2 ##zwDIɧ@~=zR/R7.L2gсЦ;M7jܙHlGl2g>\e_K\b-X=߇UF`+ XBF?zMF5Rך/?M/L[1) C s@05`prp9WX\w(WV#r6Wsh!jTd`f64؉C0(MDoK1 deXai#tE}3h4vnr4 sB$&Mk;^TRJ`S;?h$*8U 04jfj^FIVuOL y#hK@'AlN}ON,-%+2-f1h{B~ALh4<z9w2aH)(u V;^LIUH7#plof ^[&2w3R@Z}HI]rp*7{XHZ#_E/h@s0mgq3 wI0R-} 0+++}+F dvpJBDQ`($2 gBO6 d-hܶ>2z& !"VcLlh:+"җM(vR9O/ 6~T]\hlFvmꏒl܂E@]15f{@Hu+_:r(7]W^2}+R_)^Iko W{cFZLq/jj+46dl3  -lPPKR'1rrwUjӔjE曷o_WlWb3+ؔQ;H:SE^rJ*1^.-5yOkAy3k/Mw~apnSkj ۅ.y#B* @]4 [جVe/Vw~,xߟ.XZxl[i z YFaz|}ݍ> M΅A?DҰ 퀎L݅}GِG*`wFzS{kCtPNicEɕ98sĈ\J "Cxt9C ~U\i%EW eJp&v~yQ<]4;IKiv2ZD|+ZĆʘ( Ltz7 ;b4V4e0xhɋ ĭW-N-_xC{1q`.;>3|G3x{Z2L_֚'FB3pz2 ծ=;N- aXh\λ_S.]bD}U?WZJnahkaP)eT ƨ+[8dx3Z_i8; J"׳6;iTxw28pZ5 UO`q(VLZZGNFsy-{"N{Nu22Ҿ z=(7ԝ୨ש>)Ǟ5=t ʃ%TEMSOgXszo|ٶ8g2{^;nЭ jck?hhI*{oJbSelduLj1}WVק`X >g:j0H덭Aqa+)%֔֨G4DuMC܀:z}l:;8<Պ6@m3(PĽ<WlKhW܋ֻKeU9ƨ-*gۥKIINvjCA}7N+GARHG| h1{BBFCZ>\$".i>Uo2x;qf3dJ|.|^Nv\  '~"cW=p((rZ3?.>w6raMp}|d,r(#"WaPޅ[k٘OavvB2˚9%Cb LMm,|oL=ZR RbZ]X">r˿f[ezq Dhl -%6-(GGgYf/-**%cLtղ+&= Z95I܃ΪA[ы켑0TjVx=0WuKQd|VFѡ~xo=$ro+#vg&-#-z{<@Z4u 8QVRD34\Vџtwkb/2R O,v&Kٴwhg`DLO'=OIIH7aQZ~:o,8Z߲$FP` AdL noЫQ2C3i2'z7f%tW^Cs*H a0IdyJѝ]qI0PmO//Pz)4UˋlKvNXRQqkݻn f6wdC -3 n .'_ C굡A\4eRL P8&$9T7YDQf V[{!{t˜loLS~ SAp-(|i@w7#$; ;ewiج,E-}]OUҢl$W4,vb^k ],;g/S q3{' NV66;.i`c1 P7KɮϘVp|s7>?ό[`r).m(n&#ۚ r_Y1p{_-ݞrn a[mlstxĆݍʜ9D5Sj5ow=[[2T$DjioMm@bЅ)^h$$E.uui6|%/;r)G\Q>;ѿhr]k9?81HB砂"RI^Ppbo}p ΀>9+џV,侣:~jĮ!/_C= ]{Hw9ϺXAB)nÖ!IҼ!a@P ˔!ϡ^zpߋ.kqeN^I-OP?> d<)L;[e#Yû}()&jyo6VV%i@ fgC}bM2xTrs]Qp2S1EDW6H=JhjÆ=5Y#U? +궻Œ|;MAq5/v+i VLF@RNQ] g1ϟD+f).?fwO$B@,FYK J͛1 o.J7d6hQвCAx6m+]-~F_آbM<<4qUiɈ@o$/ːu)NozSj b-$XfY"""W 9OWv49JV=yp-x?VC0Rٴxf׫cg+h^^{nwx,c#+fJ}Ym'EHz%V]8pZZa*= qi=(y]R%$/NXm\-0L~qZQYPX^ȵ0ݣqG*Qcc]'wQޱgREy:faH A:`|{P6ni+@U`?4:6~}$)ɩf(tPh,4V)#QWC_X8tEifhhL;97ppC X3+QK@T˛JqOM:H7{c~̲FCRҍHG!,u[ fffɟU빅$bPU/z1,`]1mN$tڛ^- JpZȉi~P,={Zn].s: ,!wtʩtNsriZ ѷ/ t&:RsǭT$5Q/NV >朇*2ߟ/rJFlWaLDp2AdV:| 9bʊkPT̫ꯇη|&J:܁5 (,>8|t'# mr (0Y&A)\Iyxj Czay*bB ySZQ %Eq je'ǻ)lWWDX4|Fة{Y6Ry#u%Os?TJZ~EulpC.!NCCyE  s6zLl 4ixLObNh#8RTYNѨ~7X}i-K=gXt 切9)F ǺXp ppYKt!3"D8a_^A Uzu Qƪ5v!0 uFjWJ7/(^foڬ*<.FWg~JXmߕs$ey|KխpѴMgAn+,б/W* ^mnfrxƘMSAu+Sou6/$z[[lmW%G?g 8|Z<33hTrR-}+SD])~g2b-*x@H#0ܶz%}eSa }),{2{%9ӜÇӄ)i 蘷 ^x1%jɳ |m]z/Tʫ5N?^fA2Y;eP\kC &}5P+0J7rqۤ:\)"7kl *=:`I^4Awiγ5@ad? *`H{ԬD }v:0^+Be 6a_6Ofj3@4VuML6"/yBLU[UM CBn6mF5 {A,:pEPsq>S_>dReLT)lUkO6FE^0C q[70$t.l}X E޻BBNRSkUZh!aKM-(y_fs|Adt\ԷA4xgģ7Z?=Wю owYXB!T;I^~%0bSX2R8ьURWG Tlodp'b~v>bc~q&8?``_74p3yM0u*HǟPi8X&9E#*jW#~H!CkpdUڑr]6wPhBa)z3BovCJ 1gB76s-r!4Ki"s)87urvyE:'-R!OARC.*@l_(l=guȖZ]}="W==&Ӏ($M쬖Ͷ"ᆚU(eEfmjkX.W2CȺkkŠqYar``uQ]}F>޼$$aьaaWq9Z˫Mfa}fLV?y07Y)mWrg G|9n/G{0 tɅـ.ʢ AgI[Rjlpeťo}d}~;+(%'NP JM@A@otC1cL(aC4::6$RJ<ϟ8Wvi[Jb E 6RƯ"߈A屍GO̪=~ʺZ`:.~vs` H+ Zϓf?W쯉v'3lТ{m!漯TסGz{4iRI>_RݿvS\DWi"/ 2jo}%JPDuO56r1UGZ_z4<g $d#77ڳ$wVY4d]kj@UrW: ˩gUX~u^xx4z!ns. В˪:+PAb"@cdB |}v ]60-(<lrYf9jE 'INFAPpV*\\x08,?0Z۟!ܫ{;R@U $߮ qNEh)5X &R Y+Ny?E|Z,AmAS1Tŋ5{K0O1㠹\ ;4<[G[&IrB<[C:4-hA=kb̍RtFRLFQ*!ll4~[{hӀȝͲ(aOjVfL}/3]opG=Cbc.+a>_+vX'?9>  3}"u&Yܩ㞜ɫ$(LMb%ӘHv H+Xs , )΋rhoxw `Y/Ꮕ/ #4N߳Fgb#'OwI216Yg%`nu̯~2 2O{';F8I `B2̽}h_E?.Tzf5a9S#tûIԔUӠc̥ 5F@'^^6P],X=FC-glRY:L8ʾOaХG}荓Zƞ㫯~Ǣx-kD/f0Ig͒PRIAaV%˜݋:MGD)'-1 I,dj?7CT=lG8!GqC-$D鐐l_Z2 b@n}~heQMNJ%_C55~6S|;#eW`*dĦJP AU~ /iAMs~2뻈mhط O1VlTGThͧld֤cI !J}\lr/(;Dx"QD*BJv&U%uJ[_;WveQs@=ԙI&B"S^1j?е sS%%u9/я% Nm)8"s=6 njqƒ/1@Y=fk=`b@E7Vgr|K_ ޳g//0+/>z`f%tS*BGOT3LxO،o/gt@%wҪݔ}U䧲 UÑJ˓Rȱ:ULayy(}37JGm:p3䴺PP rp<66*.pՄL/j;se=|QEI Q#GnE7=ϻn6XIy=BYq,Ԝ5??B)ߢG !}Vda!ltʦE9PN`;@*ˡ7dG.W14^y@/7Nz 1pȹth" ˒CZ18Q(MLN0nBF>6-k쁻{Y*ӌ]_Ft Ap2c)Xq; 1-5z5m[8VVm  f *p4ΡbU *EwfCW\u5{m~4;꾮fB oGlMxiX3=b fg[@Eu( HtK H3ttHwĐ "-]],^f> x@”:6߉Obk_B_+Lq^.tg؊/َJY?agL#oޚi+Զf-T$ӺyD.=ɟ'p"`ԯY-)[W~ߚJ(3nk{*}q:MYYV>D̲jF{[s42 >"#A=0b q88[N[MوйSdaҌ1&4Q58-Hю085Auyy( ɥ-rN}CE)bjԓJhU+ %%q ^'Ү__M,8ƧB)Mq? ewʇ;S-QEӋ, | R yipn*Y҈@̧U˦Jj]L_ePvh5 cҥ`OKY2 nb d Y [Cy91&uQ3,⭶F<=6#p)񋖖6%7ibߢsx~RDϧ#kyO6D /;Ĭ0>p>>oby@T04]on  ( t}Tَ@d҂z]40DgMb^  ax>,P9 wJF\6nP}աU hlI7N]~VݸZǞ 0ߞX-#" "h|F`HO⦺AAG#Nw.Ƅ?Yysq?%ʑ1vQNp:nЪo.T% Ylv!l)2*Ye9k̔qi|l*t17υ%uMdlh:}+%'scs*i@O RP1<_r#54tru BFjPZ&zKrj8ӈ_^ueq9 pޭNY*ol~:R^{%sfa.O Aot_;x.rdWE1(_b"cؿC'z>k LF̭q`;@= Ɖ3ql3K]Z)Y vN5_~{%;%b=2W;*~5MֻoAb$"I[ѴHSy-#jŀ.YYk=s*Df&)YYT/?$N_0HܷK]˃5Z59f8TG%[=βTٮrCGq`O?4ksX=w;:ᨾ $iȾ0y|}p 7]ڄ43 |&E> E#[$H+5DoK:l{g~ry#u(Z 6X F89_[0Qrb9O`{^[1.P6?,^G֑j[Z(|bΪUҦ, ;!XS|1@ٸ{drJ}``'W'etC% -"2RԘ|my#(RD32TgB)]ɚx,ez4B2*uhe5@B/b95U{ `@XV]&Nb "Yj2XWWwf,r2ǩ]bӋԧL\D:HPUh[Ǒ_|4ĒTHo>_<'zrBU aa6-OB5k %0.v$gz:s8)_2B:Xj 4ᠢwR{ny 1=|=5p޵q=4W @+@zSa,jR 鯩{ޕ1j@0M=7JpAnX!Nߋ,FHb4P@yuL宭dKrVԒ_ g+K)*Yv " <^dC92Y *ȎzisVMB||wt햢viY&sRޭɎ_D&_ZPihNPZ1qtgf]j/B ({ [l՚B,Kf7f̩TL9N'?X]8T 4S gqH˙U)9| 7 ȗ#?-'N.Ya,+R+rlq WSѢo9IL H5*q\n)/P$![HO]';SsZMzKja\J6"sټ *xQB^w_l:LNm-{5iՐqՠy6tgncOåZvUڵy8`72bؾN(7| z[eaj؁M`?[EySۊG?m*Clzs0SImsB2զF!_G̴+; v(Z7?{jO/A k2ERex3bvf{qq fa M7"**l=Iͺ7 nʚD vM~Z~z8Ph8FPPj]L滍w?H%hJZp>޾qASQ&9y4kM\NsY~@gygh >#8X\4!zQ[)!Ϋ]M]WVqgSaٿ.xgvW.Lyl>IyRwE<] HbS]^i7M7bfdBɒPXeWVu$ݽbgGW).}9g~&c0>dnaӷv7A\"&-/6Qʖ e:h\4⌟1E3ƢՄ^KR6Ϭ?4#Qx"T"EV‹ǁ6p"B~DA8@ǁditLch9I`kؙx1H_|cxd &~{[-"L[WXF_DIBo_huV!bP(z5xm.}LL 9&<`{w%MźK}Eu99 ŭT20a}~l|#K0V|7f*i%wbHuڱwTZƴ_̄Kƴgx׹JODDәM{*7{&k@}A!I<aGCߕTؽUO!`@0Gl Py#iJ"YY<1_~)q"<FTj#X>P9 F;*}{ppG)`2X 9EN6*BYTB[UC+z-7V,ZpcQl}DdR~t!#]☾uU;ߒ/dV]tATW*133KimM8U ^+O OJ!zto =7;L8LmOpi |hԍNp;2*5 0U|qv: 2>>6Q+yȘ`7KU:lb쨩1EȒ`ӝU, enT"^K+n}X*_ܙW>mMp:*2or,v*1>.&v$CVTQ~S+:Yi X'7džS7?I ejp![OC +hEfV3̚0_qzZ@@et`75`gs1`ADG'e1y(0" Z2> x>azNyidwUI-݋ꈹJ uq/"] \GgHN8/DG+S+LI˖mQ e.Eɸt\į"xam}_^{~ʭk2yl2#&@H6нJ!/EED: _7Apb;Bښ9SjRo6Zd8E{fhxP$y|oQ!BҘ#"kLk*YYQyl΋lDSD}エ.B_*6f  J+a^Aq{#ůG-jg&79. \)l - oIXF4~jaNZZ"+9i`f0޶)sihhSGԘ_pT%C^*PP~V>rk*="! DW`+Ԩ[tJ#{a.#|4X$1, m?^ޤUu<Hm~΋ *SgJIDyJKQ-~GfJ9^B˝0*olifrM&<| ' i:Î`/d;ݦp`#KNhVD(:*MJLߒ&D~?{5yN^$7~H[m`L:iέ]TJFUaăO rIgnLbxpUqZZߡ?5}ږE@,߷RdwGOuxGcGGfQXI^QҕY߀訿)=t2$O“9 F.R7h*-b,7r0J%&ED@ 5*]LQ̨gɖ/É>0Ot"=;0V 3AzsP$Kq~"Nji]0;zvcN&/BVby]$GH/#mHwwg 쩅aRWҠlzQLhRv_t`^LL dCC(DZ'RtxDƖJ Y\ Zd]yNgjO/QG Gp j#IB||nJKM!ă8~"xKos4Qc4p"IݚwҶ[fswFjh߲:Ԍ\I.;!p$BzW_PGfxV*=e˿>Tڙ,rsp {0ьS/K)]M; LPKvߞTVT|gV*q,g M.ӂ{Wjpǥ`8hvEbL(5~ܳy/P7`?{Yz(Z ߟS .~ǢCD_nY<#DAi@@"HFl&‰swk8#WV6򕘆u${lGs PU996∊aY,Bm)utF|+>L+v\[=OTSe@C0&\N[R͊ 4Ȳ Uv',L(ۃԭ](q=_w7Wͼ-24+EW'{Ez( cwuAo6I/]JeHv)ÛxܛI r~Zefx _#/#:(wK@Fvdf\OOI<"Gpp7)@6 sZ?Q)RSad̅AlkSn.t+ Mtߦe&Vol;j+BC6.|h!ߴhA./TQ9z]<[, sG/h ZitcSb?'w dG UX# JO[j՜BK@k-ģٌ5^>_ ǁ>_+YGAԒ%YW%YQptpTD$WпonsgGAQωtcH҇.)lT,8{܉+yrhw-ޏƪ=R>77s⼗]?R2iM0q E{"Tycǎ+Ƚ-Bլd([~S$?u.֪BEX_hß(R Em:-].~kv.ɯk7C6:Nz28@O|4vێcA.N.6b=iM$bv{d"RUcA\kKLW_9҈$2Xw?rʅn|SI猂eXg'E_J[fN382K 3Lt}:Y? R88hZNܶhD{O*?KD2؇>ԆG'Ll^T/vw8g3칉 ot<ao &.mjrtBe坺IӠݞєH5Jn+.Rvѳzh=턄9Wt) ZJۜt}W$# ~?X_tf:2%;se3-XcqgjΦjNSDqy C((j~xy`+g&oa hoQTJj\\b*!#4 D>8ZҸkB4q{DAimSy1u#ԑ"Ru'zΤ.oLɀGhg?&@\T=kC`>c[ ej a,V>+2trFK|Zö i\.a#0n=8j31WqCH@ޖ5}#P^:DE^hL;mE=[6}fvZ &~aAqD%$X| ||xH)8Iz2P}, 9]L>BMgK)\$y{enZ;'?žg9Vh{_ĸ@VhZ0q'l&bz 2SV]=LLPȲJ{k::h&-ɟJxl[Pz&Dz zĎš{{-_Bg>g;UgwJn.QwXR =WQ]v\02LЄfV }"ujJf3L x[J—E6igk'~,WL jVHj xN xa0pVfg(z_CI:P-bpY4OK->w CJإ> 9`&n.\k)٢IaKCcofaRL*e*pn_%udI!ݬVk.2L}\㛪zl'˿H*=c2Ǡ# '-AZv6Gg'Vm.M%6ve37͏]x F]T= 46$?nINQqѽ$!@MM ~*A$SVaw?'RmZgih.P kt=NzI&Y ﱂ2/B q>aSQKC|cO_S4a'r+G @20d+Wj Nm >D_:KXsU;p0څ 3Id:Aq@x3JG߹jfܼ, *jjB@JvBXu}mM9( 4r_o2cIr']cthaJihb> /QfT [@ k95/*7rX'9.j۶^LueuBNwxy A*DZ 0{~Q 3KQC?KPY{Twʿn4k檴Yp'uԉBsq`y]y vPpoWl[vK&#U-.i=̚2MVOM@(Ы;"nJ8KXWDLȳ U9$IwDI9_.9X 8nLXuضP+TR 3g)[vs')"jIG[:k({B?3K3e<$Ev{wGZ˻#uXJ,Aom?W&@rSĮ$hD6?-*UWo($!^yi!acќCM}Q#!Ë&=5ݼ|'Qx[M*Q4CHOsNNVɯD83[;w2a'| bN !)Q˟̬k&G7[fĭ9^T.^G X*&6_ZVir;P2p.8C?1E{jfg-L'lx߬uj\1CH "6Vam[!)EĴ!nx+GF.4cn﯎{1_W>2cnM.09=_%ֿCA(Q[DEWx ':"Vmc 68-jѽv Ȍf8yHDiL6yu$VN-@V/ݴ?ao d!i%E5>K"ʒras婓+{QW;Vi3;f/LbM3ِYKN (:ߣ v^C26I_PV[4%SxX2a-n myP=Dnu]=Xm+"S@r7xo'[Y}AWp51}q]!bdrzuλ|&&4&̙ȧxjDC|8FKw!_ɧI ]lrZ-Ocd]w9{Q`\1,,r?ԥ&?#獾ܭP FN`g70GS4NO䂻q`F.?l#/ČoJ8e\Qfѳ 7ӻ;˧ך; :S+8<}d R$3(=fkWIDs2Jqf#qluVt{CQ4ݕTYH/\qՈ~Y,+SEa"?IfNwM6Kײ8GſǺFi_=cK;‘{bTC M<+&b561gfuX/2Og|neQP.?HOMWO U|z4",9܁`8æ*+hAl|XgS;GH%d”;MFy=ȧlܗ3_cԀNuTo0DDFw&x!PoJPyt?\s[ԾRD*o pqaxlԙqB 6K@`ѹh+Pel:4]F(h'pTGV(sUWduռrN3_6EmZR3;k]FGf{k:T >WQgOr䶂1 grn޺"vw7X5OsZ6ve~8-?)LTǥ]~R`nc5n|(56;4 <QȢ,qb燏Dc^X6n8O@|xܛQ1fF@7tMXKruۖ r ?muz`e@p 6jKo8zio`f96 8y YWI\} 7MlnY.#`"l ~}S%`JBuGܳ/h@s51`sm˽vO:zdJ@Aۖ%;QrGJ(>T+v@# |͞bdݫ˰1\۶<˖n] #aC jL䁝$)0[/oT@uupnE8"%/ JvkSb#UXcRIQ |BH@f?bX}L+DVL EMSI'p^Vhy,m: ͗S8M#2-N-gխ ф l(9[_!eE*4eF]XY^^c`(02[D---IΗnv~h~lc 1pe4cW1C$^I)s ~SNa=-NAeb"bE4x1&Yc U"-kuk[Chl1s`f{w 1j@P*_i_*;,?̀G#UוYR 05'G,Fʷҕob j/P\B/jj1' k]C y#eu,ᣧM<׌!T}1$w "k?m R18O'$Xb"m3 &Z}wÇ:rǾcu֤!QeGNwhbχA˭#IRO M9kY:k-O>K IB+3/vl)/]"WY"v'eU4KgᰶBytQ!g)Z"T1!g S >}iAdq5A#ے]=9/#@/P" ɗ\ Ivrs%]>N0Ƨn/MY/8(9(#= E2|JS/is|͒@4$V>"?R5Hm,QU5B!ju+6(cOh&Xkdu 01^øn6< h U;h bj'QP7Bkn+w= WHlא?2ꇫ4AgupqޖEP&0)Qb"RIUUuhB^-癯ҶU eOnl6%.ڳ7n?`bnׁ~x~[JJ  ES:axScfk_`O6msL< L9q h8t N:gsJ{h& վjB^q; T޸{O^ Pai%-˿mq`Ъ!" ^ʜМ2Y2/uq1A9 .ebjts4LQg#E+M+Kp>Ԙ?td/Nʝ=%nRjhY]v`;⮸007Ծ\}1"SF x4Q b"Nz숕?x%_liTD-sso< "l|16 nIYcq5u!Dgl'Sݐ0tu9X&@>sN)8{tUSxЦ7qW4p;X>}dn& jT2 n*_yѼglO"2$~G\.$.. 8e״F.5!˧ > U1]9Nh ;^ sK>|jRk;y[=` G vJj.);e_oICXycIqVD_t"*M^9WPsWe'&"vJwYP祛7/)5rK~p <t@#CY[ !l/pwәY#فx05)+'#(ʴp1Y$A_ @h'uբ ';~}+niܡDn7-Ȗm+,6 . ]sx;"3ql(YevGD^emdWhH$GpdɬZ;v ~沷ZdtK:a^l_aߧt1"/1߳)󮖃%nNěĈ*/ۗNd9o pNST.׭"eӵg!t/\Xk0G(R#h>d7Vć'+ |WzË߹v ϕ4ST:ABf3X 44J)x6{|Ye]w >Պ-35)D֬}]=++;B"+f qd߄Ӌj€@Mfh4To%j2pFD r3nnҘkN>-*°3pEQ5NA:<m#֦cn#a/>Fq (ҋ%[575(]]vN|(N|VK"ėZjCJ0bgX1luDll;MB>C S_l[NZR +=F67z`5(SM7ioG2[isQ>x<$foJTNJv0s1q9hD)&<^4ۭpk+p!dƘEbK/~/t*5b$y`cPI% ڵ<# )[Z>>EypuMm@,.6>;(WD7@Evdqg(9XIeo. RQra gERDV$wYSIS cax]3NRu/bԒjm{󧝬mm~S,\#zjIj`fs^ 56OXԵ 㠤Pq=%i?Gg=PKc+i{CC6ѤK+9j66p[- JDZ/99Z !d3wn-zFp3Q$iDԁ`3}7 4GooA_7}wW),."̱ ˲/Y_B}sY\%|ô#su2e"yqKu07c3Ɉ&mϑ~>G:2Ui 0(mj)'gJ#L{6bo6a㟢g.5]6kŊ3w 0/Q|ӎ+pjDcDr$G^9Y操oD@RfN)F@ҿ3Pq+FP{gmHX`|6IEHwJ)}9rkr" Fulo$a^f;͊?C8̗G zƝ燔|Yy " wv"1h 8?L(uq.E6E(<óJq(eiQ~K27L}`x U\*ܠqA94- ff'9O _WAǾ^N(K8uS));^p}8#ufr0}KߞR'\Ί((~'ӕ-ɝ+W1XmV_JۨQɷԘHŭ\SH)v"WՎKc%L5 )5v؃Rݰ4jyrہLQc`a2 GSiOydĒ2ɜcQD>}~":mS v:(K~ѣɨ~\FݣlU|k3F =a L4Y%deVz$$"F*uw( :pY/C$@{囔9u]wXh\l$m.( )9|v ኋRjɿ} K#9[AAYl9ub$;B#&]G]񞠻3v4m ;VdVbe4 }Jh~:Yh^aLd7$J 2|C HD \ׅѫ͏ m)Hpv6OP3jySh}8akղ(Rsg}Zb8n~`yU?(AGΠ?i劲B?Pea\57=t}B:1JƁdǚk9: A Yos/V:/Z$$1dߘy NSE.U)D5Ķ? 7T.S}?妛}0?|7 ؃fL?smCAFL m )] >nKY7Rs) ^͐)m_O@tMd-Iy4ѸqVkQ?{h-~*?"DlwbQUO9t绂x>HyՕ+J#v)쯼9! 8b=)&=Рj/N_] Zp&m30 q`ee3C̝l2S)t!o~᩷:x箴5# D?YD <]!+jl x8O#]1_t% [D7WXݚmipuno?oL5Ud+*B{N\% N=80Ts{[vM4^|,LӰ֩2!W~+h,rs]d|edt6; :aBL~(jvݿilPu5Z{r J!&^7f| T) 03򅯼9=3ƕ;)b5[AzfQ|sZx}В,%`ӖG s.-:) KYwxuRbΓ:O(bהOIW '-\Ż^zZtCȊmkL%B6gw t'Iġ3_e+۔z$/;RFw55yhoB}8ELF,6 *Ox9?lx$u1/-EѨs"?Vlx5Z48HM6Zw _ 6:S|?#]ŇsjgwI{zaB:Bw`)R5jdlΆ7B"]}Y>X1 ŽʒuwNȒ9##b /?LL (*DʞSY1lJJme^1 -$_=ff3TL܇\'~f#=sVrK$pȼ7qWWQ j&`9" Ƞ9h*#; ACI1'xpZ? @"9|rH0`.=N7?z`VFs ̊*_^$\"Р} [^0c I}}?ug6 }/J >ǰGtDaXwoV WqOM\hjlPC ˛  ԡ#@i"ЋgYj  TO ,ld2biS\)X e:7GSDi &\[kRC)`L}K`JrD@,[;D7][2+L7}otn+MM4|$ [dn|q4oz BzJ{D>?Y%8PHM jF%bQI0'w1қVUUͪ[kK*'mgT]$AV近 _ ~舸|NW63v2>V-KQ3_600nGۆ)W`|w;L.58O>Bڟ! >Jgc2EzuS>@ ?ʽ# WD1즟e1'p͎ݤ8QqԩYQ_8R [QHj{ 4ʛA8}y* ~)_(AwV :1i;U6`?*ö1a6@ Gv_Н' (`Vܾ̎<ð)>Q>J ǗfM3[ܨI 1">O0]9HZiX_Q%+'`%YɨTg梧b3iK T+XE I;wO<[  xwS4l*(sNޣIXm"7!+fD|mt}Jc pO5GJ%Xlنƛs$V+`Oq6iKu, !9z ]eG')ӨΒzr`=զ5i{c^1&V(RFJ҈ 6_dA`-@"OnG.Pl4U|Ty|?=Oȧm,+(YFA(ezȉ 8taV._g;3媼jBV/?}^6MGy LȕMrΧ"ᾨm|$[Xlz6< 'Oad +\wBT2BcA{Á,U'}9764сB?į\!j)HA3k.qe G!eUUzCad6m۪A'tbX%:#$?ƈ~S٧"F xiG!I8sӟ:Sٶpw1A 4'gݳ&-reP3KЦvf)-]16`\IJ(G~1{Ͽ7j7oў뱦\u1(ci}tqYS솷 ^dZRĽR-%-b!7/gxEorYmWIygjVcAe{R-,jj1T;ʸ yj"'XRc( bn,/-<6N418Cy-N"[W#]RNi`P[0= E'@ކ7?cE w5hR0+s ȝM fSR+3+иjvNWhVUA$cC^f%ر:!؀SH7yHçQ`vVÅOJ8]=շ%qn=qn;5כC6@WG g1Gd| ι%S G]}*owjl`Htu”gVD-X}J-'n߈0:{Ƃ0]0j$3 Ӹ'x)9i >iߐY.BR[68/ žZx?.N!P| CbK҉@N4uYjE p?cݥ/.i7NmD~դf 3~ycY $;[ɉRaST#tWZFn<vx o(\aU8^ǖ@{=sݲpH!Œ {YW}S(EcMwYy " l1͏b؃cNpGDxmC :)r~?J4غ7:#8nA@¦pU?9='Y<LNf,;K.́QA&Ҥ3P*d DqīrF!+z['"p]\cі"k){g< aAwSS8Bi!9{B"F--Mn*Oܪ$'@QH[Ap8Vdq}35h6y3%ۜppO ۉO}nZ}njZT8[ܙpî"usG Ky6UHr|7}?G/-L\cm330}XDԥ&“sw畽ЮU]ikЧ|_?s-4d+YA060|VUbNuXث]{Zstunuݑ#Gsr7+ JFy½tgqX6qdY(3Mtݣ1BD}K.Б{:1 qg 4lL(p&"4z%z<>K5kvh6ݾ5o}4X q]>k9rk d^W'A-v'CL- Ŕ({ {Bjc3W K Y U*~3 帱f\Co^Z} }}5u)ߗ8 ,٩dyKKaD¦QK:ј曶<$}ws!?ýSYR͵掾PU~:/J@gk 4Zϡ PhXh Y ;.1';[o|,b ;>FqNYK:D?iUշ Lf#^!H-\T5]InM}zrm⁽rh]H*ݷ穃|_5d[} !O͟$CIK!os\zηs#-MϛBA8c> }uJK/E>iJr+R(sMgJ LKii h#7i)\ɘ=}'YIJcGn_s_kiS<4V|v梛PVM\NDdSHZWW>xn"RJ:QMR&pĩwfnAfVv2t?d|l0rů=MRQb\^rW_tʟ^@"vddޞÖ)*gՈiQ?R.JC;7FL~|_}`\;%5zU`deZDCC혆˶I;=w7LJ}j9ve{,]{,joÇf,S>+o*K4w'WK<&%#P)n.?6M$5w>&CiZ1W?̸O˸X΋@DSX://YV2$A?`.g^[.i?\ ȣOW02X/N0]vrr"#O jOuM&8h})"6o/"7MO,ũ$hT;[ tAoc{B{׫@=1&JϾUaK[Ǔŝ]taj\$e nreA^9I(z Oخe.t눻z-X6̏Qɠ2휴=.ywiv_DLŠyM~>ﮕe)I,z`~|857?}~߈3eVQ+55_M65wJl‚-ϽJ꺫kBך>tWW iJP7%cѯ͏}T:٪8 *<`!oG|No">N!!~cM~S͓>(C=$BڥK1B&rvO PKi^Ř˖@XnKbcgϮϓ5g)F%N^[wE~dNhjo@u#?.-~ۖ\4/$zBv~+gjG*JjŨ`A?;9;}8@ɒ$]vpq 0w}3$ C"{ӏL9f*,}t_oޞxwׁ*Θ(U2Uz'YliodxiGAy߇LlAq]?O6f);kTYTM'I&luhT?}&>sЮQDD[S3cq33h&Ɯz#?K .,t fa0.L{7/șcbJGM|sNQQ5_Μ_.ТH?rް g7n}? Q-w+)6,]Ь99p GwTfmcTE/Q/{v#~T'RҝڻC ')e +oZ_cxIwgsEGSvYzQW89FDD>B͋z<7x6^LPd".ed&6Sn՘c}Z6eahXFFCZ*a H:KH CQЎ8;Dϗ}M>:AC_`K,unfL:ץ .]g֧ %V$p.B wd&+Hrmo)ËZ5R[o`.WyBBrz7󔛇^^ Q[.%fL[x [*緊]A cRGAΛf3z[)cq2,>ЩNA௔pzA&ۗȼlzќcr 5<' =\WiPg Q>- @^i_w8LIy(DIXmyK* $sB ?7 7r/l#6GH_@ ߭W='MXCVŎyUra &[t}gC@dCT}A N/Or҇fjZ \8~h2Xf)!_n4 rkX[ nkP^8uxhi=Slw@A9 rt`kB{4䎦8/{sd.-ZwKR BjDDB9 K97,ёys{QhCfiW!C, 1hsM`kR޸y( x"ހ}uBŽE*R>7Vq-Xb[bXICaYWt;?Ei&C .|wzF1\ZU>E)R{[:%)$p@ցbW&dM L_H.==ogII䡼YJ_e9/J^؎[mF0Ĩ~BV<ԚءEKB@ݺTYa۝ONu\wTʫyFb7$>$S$̌8jY&Iګ.@ˢglka!LP*Yٝ[:R} viZ;\,x7gߡA}^ P)ɓ EjhK'0dj?UeItLyD_</zo_XO^;YM)Gez/D\r iL]pgLļ. d.y*5x/dYu98ם Z[Kn>I듳^B[hzms~E ^ Щעy߅Kk7,SJyen;Gc\⇯KygƳtaF Y;+IvgkK4S1%˾zTe,ǩŞ/ mJJTfXl7=!f)F~PK:yt :yCӭJ#ᣐguZ|5 C&Sxcn/'g'@}Qvx&W&ZII mY|@DK}gtq$tIklJVQ8םuGk%{(82uB/lT9oMFLu'l22 ٛ ,S穧 te>P_ԣť)bA00PO&\,yu1M}ĨM.{~2xʣ}U$e}7YM3Uz\ v1ܙ x`5`:nSm(FrF\v[ [^д|:-#9K_WYr@OY@~^mh-==kusBؒNؖ|Bri릣jo yq!=EzdƉ"5n| GZ0V7%ӫioj)ABe R\]=}5Ώ!f.LP"^J>h]v#q7Hx5Ö0[G]Dawnh$zOn.3a{,:cڮOv5EÀ @Y԰<} ]-Τ!h̩]锥?l<7"% !jظ*PdsMi(\|d`_je'\w=NR|Pp"͒f)tPGM9D U[r2DO{)k>w ?Q\sjj";:i W6edE@λ78sc0w<텶st #M^ I>Z5ZsAhLGw+fGhgN%&X!ݸ}dm ۼ1Z: WnҎM3qɣ$hp0;SKHoak+Ҧxfjw ptCjLJa>ٕy:}6[$-] #`Il'ZQ?L뽂K7֒HfeUUws}:{|iw"a!r!nVR o'sEosd#Uj7&|c ;Dž*,19qΤ y9FXLj0ykY}E洧B|{~N|x1I6pXY ~Йɉy?OɊo+QTRΊG׫fy-,\{vw[LhJ'd-[;v١E?ՙ}yhP?_ATR1l9PsWXy0l&쨖 %!&sqR] As>eS7S3G8Ʈ*$D@~F1>gL `K!~_ }(2= YF"~!ү.?]״4=f^jA*txnEWWE^>yߩ`o(&^df_r:Z8e[-p0I2Q$.CNJ,fw lj-Ml!/tӡSa47IVG:4"rT,L|O߯;\UXFyI^ Rp>Z6O ݣAD`H`vv!PFaA+sAB=FI I =_o} H-6N2j lAVQW\J Y]kØ64P 0,0lREx  ]Ea0,Fs:k_mӖiNbdxxQ~Rǟ^Ms-%>qp:yRd^6j*KyS:9Q[eF?iqRgZh˻snȕ[QQZ`I2eFydDT1 48Nx7>&iET%ݎƪ@ v6[2tijfJ.5ʓ|!uW}m q WK>6T YƮ,C۶4G*JAvwdUJd&͹0&O;+8@^qӪCv`8 C~񑑲.C-YAJ۲ 1\=NZsj vJppu> PSS8 u1jVO!7_._d&%^_dןKA=RU粢(`'L` .cvRSY[FMT/UNz/P]u~A0EС kg>`ŽX6]LAFY)FhiZD΅F 'd J}Tv ;*_ 1VԨnf_қ1CҬ& t:gggdk \ҏJ]xֽw',U)uUnO{= 0A̬U1(:Q\>U+(%mԡw/ak}d+m3" Ɖ5lڄs>w[هd-U7~\vɍ=";,CHL6&I\M].(iΰ\MU\ڡ]kÝcy+j11&1,^XP%R.OiG]XjŌ2y`%H2׹:x%)0#)tQ,UI}{1UyhRvܩrw"?aNhp7 /6'Gɲ,YKS[͔Æ?G PB`~9H]Цc3-Q)Fdפg 'Hs| 0\JorMrξInk$Wy"lrPo Ͼ{3I_Lȹ_l++w+TAg<-C?+؝zx l-y &NgUh;LIA*u*9ݍsp5%89C_*Y=,D`x)ڗ 'N~^39R@fE|l>yqj ::(i2w7(zЃ- YscXҘe-ºC_\)ŏ$d`=yZ^My>xv}p KК-4|t4GlYR1{LƧm6D}P_KS"/kAQzI8?89i0.\t TXmuE)Z?v>VOK:]60:3gTad:ɩw jx2?O&}8I|j!U"X7Fsw"iσ7qK̏OH0j5Y`KݷTV,:ŭrMe(mh؇k|ԠRIzjO7d/);7Hrh*(ܑda/j|rJusvd+5.K~n}.lm[VyZ̝Է Pz7-k J .~lx|UE xo_-3SWb.F;[M~h^p=+)*7\k'`㉨( kao^mCG䊹 ](֮' w۩wiȗoq})hwtY>Pt~{FSI/ގ5R^.|vqs 3)cAvbOKrgD, lr?@\d*>N`)Pcuf\BƽguN&&f>%%}TlM.D=##^.<'<ov9'iSD[gcPr!|q;D]Pyg/q*5T~Y}Jf"r{ gM,ya[_-r ܑ1Hiz烲mԽ ՙY\;Ƀ38I@׬ϕ\C[`cS;TmƂ Pnxдm7i<^U t`iiX`SGnn9鶃cC唍bJ[cVV6'ڤ>˪ 459iL nGᾸN~dư~Ke mܝq >^ča(ϘLV眞*W6-Gɒq@}2>o ?"5egnR`mg &ng/)S >*/gPSyjd_m3 S^c$aIvQ/􍵕5CtbV4)qQPw& .SB$03=;iwy 1^6tf 8׶CS`mJ}g|~^hʧr\<>TKU.R+If[qU[<3x47u7S[bL薙 <@VZ,uLMifŒȍBTBK]}SQp 16cזP T 5=JRFc3{&U%\2!tmjoba&17# JgsHWloqVπOeף(c?Ŏm]QET3$ ٞw5`J$sdriqQGbt{h J7T/~KrP;*1 \׉ښdy8Ylx@9F<tP9t@rUl+adm}!&f<zE|YqїiSUVA6s bo3G93iZr]ϩMt?gڵ`ٱm۶mwltlwl۶m۶m;~o:S5sfN^y{y]o!$HI+۩?`C"`4nޤ8l62|0Z#aAȃ$b亖J@Z 5o 4Szj7*rVN{T)^!s%e4څ鯜Ki|ÿ:|Cu44wفVJo&a7\fJ碢l_S-;I)$gL&Cy5uwlЮ]3KGsNX @)Bb}уx]Oj4w+4 6lc ?»ߵ~{(!I+%Nq@a俱#(Yz"uXwrJtQ6,պ? rk\ssv@) YkE ſGݬp!G?1eISkCHw?ѐVP83@rB MP(0  N-HaҦ,YK|qBKy]9Kx@?F$\;+H*#*M$7UDM{VffA1R1G omN{ Ԟ(+80zp +T2n.y۲Mh8L55U,@Kb -IdO&^4W Qq ĮZ9s@l8_*---X&p|cۧ8Q'c#&@vOmK{~f[hhEbb:gA5li;|E4o3r->*qj) aW, S!̜컊~.VG'c UzhSHh@tG$߳32fZX4+WFJ;:21i{*dY d4_@M y >sv׿L-aWìt}Xح ?`@Ͱ8Ri?IU]aZńÿQ}_z+)1|߈iq]퍝MaCG'?NGDaq6ըJh}+ZGF,tΥB) -:V$I Yng'}Ӎ R͵QO/a %IW{ل$?gS`J]EY u o6]) c:ZLNYNtvN߹4}w(5KtW 9ri;^F8H=@ΕM5Ay!\F ҿĝ0C2,U|Z=⧡7ċpqnXP m,6L^ha~2aVN+v ے?ujC%ind5$ʶ6hj⁝P2|1F8ܷa*$y7peĨ2"~#2o3TҹrdFVf$Jh~C't~YoyxW~?mJM MtE|hSDA? 4]eOqs78MXwCsͪS5ΙTmCXҞJڼ1!Կ vP!Ǔu7(*r_%GQ WWp {lմep]$gEԉۚi'aݿL5vt(T~m'SS|G&7ZW p/ ˋ-28 A'ѸNC~K@-];#P='Dc_>dm18Q&$-bki'/VQY.t Wu'sM zL n/ FدM ݱ 5mٞa G_oNWNvƣ~G&C͌fǣukގP$}8mC؟VO;UWävEC;;?J֚,xS8Q11HJ%FT0IfW@`yz nbF֙+#KN:Os}YlS ooƤ..H3[H+iKҋϰx'_huQi.UK5_4T'S`/AFop0/Wɲy6Jdq3c2):(Q?Bvʑly0(DBXd14xyE w/,5/U]N"=U kjyK~?;LH^[:k#= O!V03i) Rxꆠa\>eeVmyavSW}Rh=z*Wڄu5;bZ0 X^Za%<,7Ac*xN5@O`SE8<[DpCoR3F~|aT)uטw}=6!%>x.uLA*H7"C"9T2c.l,:CG\=_ZE-XWB+x]hb;:ª w߱sY6Hj8{!]YBER{--A`sȥ++0蝼9Kw.:C*iMݛg]f!PtWSLɄOh|:G7^S5d@_zz_ oU@0/6t]_}>Yt n!ge5֯`0_C^i_nr_-X>Pb.k/Tm1~ %~>4My+~,!Nu\l}JB@u5k v:"ËwvrM{>]{~d|a-5Koùoz .`4'0乯z-S$hx(M: ςy/z z , ~.` u,@Q8G-'zuGONjp͊nP7&@^Ͱ/qW">+>ssߎ.f>S2?EO~OD{~7*}<=<~MnhJЈd.]@yI*B=s3ݡn-.o^N{}{Q uUGwa(V~"õg1e{U=y)b{},="x`SW3}iy圐*r~RRIe{,ݪeKR|dZ|$et+6Um_ b #6b"?B88XF̿DiFTzkD$iVIZΨ WKY 2KV=@W=fz@LBMiԤ45Y'.wQہ&kndɽP:e]8cI Nvaw6}/'ЪǛc|CU\]30M0b? Mz@Q<N7*2~o)Xc~m1 :mD![ CCxbDBi|މ&j!Zm>#0ΙUswM$L+>x?E㒖26"S- |[ â(hAfbf-A6!L."X2hC"r׼‚cFLv^ǖWsfa@,f;D<;x^`ыr9@iK {t#| = >SF~ol~F>`f? yHӶ!SXzȿun7&nVH*S &[2::븢HhEqQ7tX+xGq0I-R'*=Ea*`Yؼ;X rꝔi=kѡq(H9,[{{{$gӔ']T/L<)WrH]!\owXp0Z͍--~'s8tUnG7`jܜ-VKGek"߬\ζ.]ݭ$52y}0l\Gn[[i{"Eh ˞ ic ~#̇1ZUĢ=c,# %`/>느E_/4b.(KhjN(IPR1 pVv_s;1ao+;r&4*_?Jvjd_mbr$pR-D;ukh-3LP}G%G`w[t st 2k\u)I18 23e awqOǸr:L#lf0 6 ,hㆳ@krQ yM#dy^U-]py#.M짧?F`3BB' sv~Fc=CEx>6y0O.g8a兎JC_vB~:3coM,bx0〞3zqɽΖ6 s$(r2yK++9o. ,7mBka2?/3Lpɗ&/)s.㫜1q]/U9~0f't>% Kyz?xv IJ*|J[FlEGa2To\yPWwqGH {d'Ugt !l?l*l73"V ;b*cn5.g9ZI_\9 Y=%Ǟ <jcȨ#!.uJ h%iIR&IG(W"#T AY!^b<ޓUp}8lDUf,sl.crG%]=sğ ׉$=%,8G`*%k`K("T&q+BUxD͇*!ROOjXwG2ҕ՛h3PZe/nh?%_=io<~O;4a>o;E]hzvhH ͼzX3;5<`Ke]]FgQ N*,WcFT@]d͈~}˛FKYbUQBmW)swr_m1TWmW1 lRFجeQS/Ej٨7̪y*T5CJ c,X9IJSVku(Jɬ?M4'Q'PMpNB DU%F<͍s.,Jۛq"Ŧ*S%;b'86\[Gr)TR]9lqp"";^hclNoiڕ"ɢsZxRXш{HtIpx'ݛ_wѢ$lљo`:֘z> 'S Mr"u5cnϼxܜ6{wPaT|2=(%Cy֖v [MZ r.^_믘-fa?+ D'>W&T`Z/9K"k PsTWү743g )U,0F) 8۶s1^99:Uܺ|? o?)׵9 J]L`VDyd:żt3S٣A920u-\'/1ז|c,ܞ"%Nx]8! ƫXZ>&7'~~m{h WݎvcuY!6g%=߲⌺,LlF6HN 'u@Gxl[ޝ%)*iq٠5vSG+%"Ԧp m]nMϜfܷ)-C'OOEK:-+S,1)0뿰tbeOiMσ GrAԺMeZڸp{JgQ*Z6ǒAO&MS;d≲ausVoyҬ5mv;N{x cCڟuyk|#_nKw{.Bb-狨 zPd?IHcK?ukVAM(d ]dsǑJ_*gзf`JaK$lQZRn Cy" سE='08ϐM+G_}xK>׉|.use?ezLZb\9ъFPO`IA%”G rakpGЋxPu/QBݜ}_vVRO@f+7$DpL pXCMg3ȉH4^:?2M5ڋޫ#y2*fuZ=XahfH+gVnᧃ=\p-zA/z+Pץ qѕOfM,#C[; c;+>Xao=U?,&+ژ7ad!ڡHh{FCxϠo_>$>c +iIQX8WVsu.Bf({"Sq'y3 :CdQ zOAp:.wG[CZvx*{&&+(—jG59UڕT8z%&:~Vj#EX&pU/o@U< ^1? v4liD1:-ܗëE[Y|L[Ċ͎ΖNcų]x0mя7zk4Nlq2>6Sl<|M,*vU`_w7$.`b?W"xÍF5ʂO,2 %)' O6HsSc F  9Np8J;".uG@7Z|:zwEUD=;8Jgt5g[ԳQDkd8dTMFЊ# VK- XP<$ʻ*pBͲ sw:2 \,&&U-4.t8%l+|a"`U]H-)A7Z" ^JUBV_®0:e6,Ee6ӄbn2Ǩ;\ 葥 0.ӏ;Ef gKض @ˠ9Y1~Bc3yyUc2?Hm'^aW Wl9l~Oh}1۬?/ O˾ü)8f-쫵Jx%tæP~{U@_Y |c[bĴ&%<-fKJ.s*7 TZAP'ҧ0 G%V4t {QVmڐb%W7NuB`J;!426NM9zv5A!Yj]N;@a֘f8;}(lHZt0Et~aafxO-muGxR/)z9 "㼡ʱn1MK~{9_&8BYeʳ!C+5ľl0hBr[?Ansb/ hH8`DU`L0:>H giu*Hi>2Zr3Y~t[ # TDzO#?)]F ,l0Â+L筞qfL$=Z n{? N|ᕁC~)3j(2Y"NCVc^"nLXϡ}OLJqaԱOnYl!֬2|R_ol^>9S',5y~ AI텙`+VO\n!VGJau$ry= ~1CN,:65P67x@[_( CLPv@/ JXWJ&ɷԝ)Mw R}yhWDT~/.3⽺p{:'C-B䧁5 Bd0觿TM R{0IG{Ȟ b:}r߭hJ#^h8bwZ;ҭQb] )c$7լVJ } 9iz仴,i>@3 y@1&16x9;YC{Ƀ47ȱ "F)bn &ϟ;0K2MNufqΔXC9]HhS+@#(O%Һ"]{f?`m; E~7[#/3Y">@goSFGy g#`jz:uߴᣇhQP*ٶ ϹjBp~ߨ׎-b)% Qv&^ ~UߎԁT`txu-|x09,F@.ƴ_hEI~9VuYzN*Jt:CEmc$OMf etv0޶|M57z@v->RK6#UM8tAw nɖv\/%%v:yM9Z̑~h^@5AZhL *{sl<:P 鐰Q\!wz\vڪBsn>@E :4=JA*sU?= ?<Ӱ mVP})m> [e\lI?a 3$XP{ UY4w ?IV3o0UꔻT{IA=Ģ"7)- lwdٟQߺJ:ɚ9!Q(^Ы6*m 𐭫3w1>m,=0[23UlL1R%ype6UGsT @FQ)d("^}Oܒ*k|Db8+Rta'pCOv&ֹ&ҘwGCWJp0Fu@y)r[`_:< ,U 速V"h _͗ZpZXK^waNG}zZ=5PJY A6'}J M\C'u5Rd@cj[Sa?)pumi3ڗdQ7\7(^ד%'xWr d w3o8bb&pz1#_X]Hݨ}v]Z2l`,G5rhiy#AM-SKzKa?d,j~b8NY:Orʣswv(KD|JΓ'ZՏR*%i\U-BWSeũxjc8MLw1%яұ>-?}?Yib3&;23@Ur_֣=K2X3dD5X^`lꚡZn cѢ\vNʐv$b7rNHԋ/ԃdifず J % G]fx}#عMᷓe0>~Xkt-e$Qpd C>ȑE5U 9doN9tgiKupTYB=1y)*lDo!\Y ΠF5"•}:7*15f2UϘGJlh}'ů@b#dzւ*tګI4~m 'rJ/tvU7 iA^CP{ޛj?#/P!][b`4`kPT`J^ݜQ2cŊ]7*)XČ?DV=qbZRC/qUXN(28Ϭ%R4c7T3v2e/G 2rA՝K DJAY-:2\C"ft58%Aj*^qh?EkBfyOZvO+,{UqA:;fhD:mU%8dI̊k.{|UQ%CA y6(f `xYG"QrZsY44ĕrvݜ)r;P?7c^Zև&T,7𺬯`6aR ﮡ5i=Yiw$ں͓CTB\%q  ВyZE3e:=]UheՋtߍhIr\ m.cT-^t ?n 2/sHVs=j̢_tjD  Zi|H/1$ў݆x &ZJ@*0M*0I+i'N ]rhZ>`*3 8{#C◤=X'ͩܢ.cN[DodStg*nˆڢVO"h'QEK:ta$: b2 TKsG7hRmB$1{R7&,>_5$ ̳ƒ9֓4Z^{H):qAI7eϿ`v>OSKe`[m5֡sP ĉџ?I~,l%_mu, W05"J6"ܟ'%;(iZY:G]c~PvA\sRi :KճUzv>2P%ONi_t;O?XNLCxtoؐm [$5ŚA?7A[mƥmǾ/X #Ԑz%+z4,+6(?~V%JX*Bu?Prh)r!0OʼngFQK2e櫘؜lg]3OrT/ :xgj3bUYzE#R,zmض%iU/ȉ;^Iğ3XDĠO&l1Gȯ9S7rwlN_ WohhuPdy $ ] XxejTYG@qD>W!WhQƼIW46@ǯmW0{*ܵ%4Q02yVDiC.\xiy ݬU6mi ݱk\$=J k`?S?QNBL6#JqIzfᚄu43HQ7 -r )Ȉ˯j961;0%D3kDIC=s~Eϯ;bgrRʤHnmQ"xLd M;A9{b-!BC0]ggԖ`Ӊs3V*o{FQbC>m$= x7M26Mp^Kl7\g8@E:5YAAnviƄj2]շȫ>+{6bi&tfNUD&27 t_|ZWRqZ{m6|-h.<_ϝٓoE3ՀJ6O Y37._l=üK0K#ZSNci˙89RC sh՝"vUlаԳ 8ջFt-G\wjm%'tK)u-'ڒ؎7'KLwv \ǥ;lϨsa^C#D柤KPG/}_WU)wIi@A~O\Mj=tBr 4tfgB)T[ -fZf 1d_hYS;j  KGjJU>EV@ܴVG<&x {5(W g+Hz*anLb絛.>l98S`>2|٨ph?D|Ļ~SPonU>m |Nx.@^`?S>,5^Ĭ,D^7G?,:y>cqKEE&k-x#Na?;|H l\Kal3Y.VjZ )"_ $p)m z)",K{3jVwg3RXϊޅcЀeb,Q.̻B|OddNkwnvH_Xޮ+msO$UnEW3oN7#p&C3o:!qoj wCQ(`}l}All;p<};.YS/=7;!ov. )=-Yp8<  XȨI(`<}qƟyҌo 3l &qc^EcEdc_uDÑ1!jzcIrAlo&F~hh:gKke pƃR4y9)?#AƳ^Dk5d&w^19"=u4Zy}HlǂOtL-3qK{ri.CBQw{U%29}P9EQP)&@LrI)[cҍzc(Ǚ7FqAs2M(qw0(#Ю(g݌p7oiD2'kVgHs;E4 BN];Krs{ъt NvrڤSx} Y]2jtj ڤ*ƺ5+Vc2nIL=6o:6D K~XvC |F_Say1+e0X3>Thn%q!'7qi݅`̩}i%Yb AXqvЕ*{ DRAGBf)P \!= hf}Ѻg~uN>ϑTdZ @ xRT#fhT{S 1=QQ~D M4ڒ?ц>W h\]J]3 pKFõԈۂ#ڌui:lۉ8}9΁ I[[t`66ƕ<I15ZQzc\eW=(>{IԸͭ&v5Gn[!cT$Wgɛ27wb "2fGc󤖹B@|բ'Vsg.*)w?}I4&0 eupc::P1-HUiD=wBS(w\XByvn^qI91h/hVEvPK"QUUc䭵%d4DXkt4Pظ+cԴxWXNєa۷/miHgdv'.;^1tHe_vjvBLmWAW5`T?պAwܹJI&j!a`Hr [)7);64400̰^?I N*G~0\- دe:R,T {S'c͠I,#<úݷ *jim`%7{χ4ֱ%,SLIAD_91U FԵc㨡2$_z5ǝǧ/ w۞ W6ǃ\a)|v;Y=Y;d_\[qn̹ ʪ+p\dzR)/\Wi)X]o^L\&o ⾟LՎ$Z .!8ĈqQI"DY? .U؆iil?80bexu}쉚]ֲrv,f!N)8T y0g!?_p%w & ǹ*[EW1?k,*]$ #mXh 7n#+?]݅|'Be*N8ݓ5#pPXӪG˃O0Mv*yiBDRAd+̈́B >sؘ0qK(Vb HbѴNVa P=ɢyzzE={ˈ(krBM8>*W,+I SsOvkjW6$Dkz7Mst,%nwܴ#*h 3mФ?9& OUl)ss1/FjMubz7WaX4N,C.Ǻ%Rp-͙`6CWy>5[;c,?.OX4dJQ,Qxiz2Bzoύ*&l*9`bh!fCKUd@j9!PEPzx>nYĄ;a:%"f}z6v7O:bԺ@ v[z[ 466,;I:FN>}]-w?\).Mw&%",%W%L9)75 /H'gJmFϑOp^^i5P밄/*"!'{`l{*r(+ܧREчէ5ǜ&FSc%+O5):ͨHGVN! 82Æy='˾ 7g+w뤚cm{Zܚe:إvVȚYV [KҤާE.Mg%m-ͶEaq+uR$ W6z\jX=N8OӖ"XgS.-^+U.IMJ1O]빤Nv \ Ǜ9-ٵ 漚])lx+SSo3*~aWm$\ݒPkg갥p~eq9a*ƽ~KKqz(༼EѤ݉\k ٌ2w$?3wU]]}p4h:3TRjO2=krn):<ڴKǷQr*n2V9G@8l xRma_\ݘԑ;h2m[sW64~Xi菶z=},y VAtgۼs^{С a@aqq:5ic{e7ҊɚqhC s^齋\Ԯ۷Ld TmKix.zd!zF7GS]H1.Zߧ+V;ڛ*xKz'cj;,v3nרIwM!yiMU{',~{.  WMw#Z 6}L:?>/p0jz<~gɾ뼵[dWh@ xGU:mjgl~o׬찺"qt˻h] 4Ǜ3= 󧛮k߁¿|,ֽJItZh>5qtgҁаi]YvhSt\|`t!,m< Ęfwɼd4\ZaRo4&utl4njd'Eu({HY\@y?XT2?k1zz3ʽq_gAP-@H)| :jX $ժǶ;gnQoZ= `\Ҭ:CW^=M=G~S Ws[2{h1ju{GYjlv?'}ʨy| 7;6"ׁ`uwie?}JcPߺ6wDX;08>Ӝo7{V&z(]jXԽi^Ԗ61MLQko$S[hҙ@Uu.ޥW.(Ήy~K3kfpJXq̫ҬeGƪ3ެ"LfN" ldlryqXP6zslˁ}(Y[vs~Wf*(P57;MW 0_H(ȹu᧶l'BzY\a9A;d'vk~`iTS,XV {8̓ /iOתmTz.T/ȼ&^,P)OaZ!Tj5s΁Uk鷡0%tm2V7Lf37w̺G;Ee*< Ӧߞw8Kc=|[K\@GkotNJ[R(EXX^e7PTbLޚ*j%_:hiϜU|XVymzF[j61먣,s]ZBN*k&Tۀ1O.5ŞsľaMk1Yd f髵.azp Ė>lP//.5Wٶb~~eϧ-/SSKsKpJtjiVĩ XUtwQgݧE/ݲ^^ 3 W3念Elp-ԼK,eU^uvn9bLD .^f]KnïWKf;ռ눉<&lޞbWg AT7UpamU!VgpӷMEh99#=*B~X[୦еΎzۅ Ԫ.IM~+!ž;BR iMNLg4OM[Hl83LQEݺi é_Mm_p]ߞXhqmr5+wEFrx30%F 򌄹5s=.DƘU# I$JTqǷ" "EMsF?,+-nJ|STrN-G`l8zϻ s/j}9|vE|GZZƝ } g/v,k`zzx\prde^ogq`/:=͆ivۅt;y{{ 7GߒU}ճ ɒo!†uDtiC|:'/3 6(qc<6p8 'n 6f?Jg{wsTeu=1u&פnVdv:v 6 xT'彽3).owJ\&W֣Vhq .O]X|kH5:ڋMj=cGMCrOyEoqo=_}:]Ulw&LgJwܸppkD׉HĢw?n -j7_gkny6L.p3Tt pH4]X#ȟ^TԯoFjƿNIAvD6&5!H}HwʰK.(HC];/h6{)|&OI]wP"咁@ g7[_.ѿ$#9zWY%g{G-y)4x0v24%SDa;iWֿbLfiKE\Zl^W㍬j"^r8PtQk)e S:cGQ8ruߊ Ҟ!v?zvr o*bXx,z[ (d6J2O!l_4O5@* WBy Ϣ94I#5F6X1|ush- άԄU*k?f{#޾{1up?txH# wA?*OF6n#.ɣC dNgX,,7&ZH(OAN7ŗ[=ZžڟQ=]43?+V}^X4l$QY179ӠOqJ!!$,6r !kp:Qv`YoLq m,SQ15,cѪ1JHI/OhPqLf(9iԐ%Z ԱL#^!f@ =m`B?B~f+m?` ?al8`揆Pcx-ħ>r ˬOEYLT#?Gʿ$?<L)r4AS4yt76xEpqX(߳vkPS!~]_# _ )|"XA1g mBt43~=@8S-؃Uqc{a>vIc%@Ps%~qx @kBvuCS9B Hv?)}NrRczs񡹊[),w|գЇ (e/ Y \K; G{M/q">*,:K̔R.͹.Ol\@uDRQ,*i)o67b,YԊb qd<ؐKSTc I22L %q AT=xw? t1H+~ʾTs\ PӅlAk`Pw(T7tӎx~|fwdvs\\#r ҄բ,bhxƇr Y9WD=H,gӅ$V1B,`>CHJ# >H$7?d K !0 `%^ #)%M׎FVFڔnOm >['T\ $!_呦$ Cۗ_&5&2F3RG QA&U)s<#3ʧC1 擃Bsܑݏ b*:mDƟ)g>lj2; 6j`TِF=6 =TbGb4>ۧord[eːx`EꚂi 5U!V# o&طZC}\/nőU9&8M#"9rJ"*~|5q`:},T]4#xpT a1ܟpx>?)mÉZGfhK#kź%,J4ѲR}KQ#Y2 R &8AkP!অ( bК jzV%8rꝊ@EKCfvKoE6B":ǣinSVI!>ū nQDX1 #7g`E'.-mP]. o?<$1(P/EȲvGUX hǒOY%%`mML yHj0C PXC><~|U 3L4sd[y1GDq0a LB.N?"=@_!@ ʼna8(2I!kWޤLc j&*s)I5nN{$#ÏJY J^0UH!0#Ǯ$ {a|&'8VA ].T$H% TljT>AD(V`x'{K$| L.uLݚr_5G=O!QdX)UP+P}p"Tm_& Ҷr!t6xIf4z =?[P6ﲻ_ c4q$?U~U*%,`q fo l seTeo0Hr?QM7'yKMdcDv_-'1UvTnDG5GYNoD4T[D(-$HTĈG\mzbV_{Qc=H֧[WLT'aJ'Ul]Ow:)m Ȑ9v}R||d~q X"e}L[ POPJP_sш5n|TA)R`A4MZrJWrj2'-} ԡHjC({k >x( <~q̓k槐RSYlȤwnĈA&pԎb \XA> EF~c*SwB6(ރnjLDŊ%gg#$bޏf XS"n`J.~cRA.޿N '!j^%B \ Ȇ<lD:%\9jLΘAWK 蕚8G%k:NK OnnJ(ڴĜ"_8AEdJ*@"8%L*1z7t4#l˔+Ec`-;|T<`P b#me|y*|4[2&eMFy!9 3IqU(AS'ux^(T4x {J2QJ* ):Kc0Nb7~BꥨMZ:"( !7YQݛG0XwKXjֳL*p;$㧨55v%Gw9&U-Ƀre@`%Sb䡈Jh BA)fCnD T+Bm[9dR̭柹G׿2˱! VaDrCRCD:9!  UOP5QB—T@_ (mˢNEak,̉ wZxI7IAH/ԴO8@"ؗ~<%;? 2YIRiOxXDA9.RU_ȹLv˃LgՏwVuL;1%эr 3(@f7PJ R`"w,eOR<{ő}c'Q@c:l 94I`[*BJ*,jXZP]Mlgڴ>h?E}*%99r=Xnzw# 턽e1 50yL } hIz~`?oiU|.a –?ѕu Rdux`d@jswv,($B:6ȣz MSPՙlECGc|2]hR_ $ h} \( s }_MF֑Phl¹~qY?#Y乨ZkPu &6?P{2J%cIbs$I@~AI_QS_#2IY!RD50JPECJq Ao(Bs*j4QH dqb$ґ#?us80z ik]mvZ~-l H&zEEQ?~(3(f ʑB;́ yܿ4U4a# #8IޮT⓰P*AzGpNH_WwP4g]ZfdBv;P)leLŬ^PB,.(K`nGZqn$S@S_C[s>¯:C?ts, U!HxpHgj/Yy@ǔFOrqĈ -?\]}iB+@v$>M죅"QW/ʦ}#Pb G{k`Yay!V8:z> i $V⃓mYJDQ]r&*r3.Iՠ|SA$\2Kui9_r4* '{,KW?+6#$pyB5eEdG03h=TJت=2'|KeOюXsguyՉ]e!#{[Scsa oZS[;/{XgWn{ Ode8PʞVĊR:#n8!#B+<˔qyG:<03at%t/DwxL9#]nDZW?\`-]~p?cO~AuDaRx (\͓qZ>rNg _o]>uPԱrI^~.Bn0ڮ(mtð5E uX?:~]s<3Fqjd6LFҽ4G)5h+~r8gDߊ22,zJh( ˶%λ;TVws6kѵ5G3ho/*uii'SaVS^sr]AgUEĨ !{IVKL^\I }M~PG8͏1OtDHܧeWK͏@_%7u%;@BTyW?NuZ2/^}'fr"bWn<{t X XK>\lgl4Qj5˲KkmSИ(#0N)f;OJr;m"_}+y4 \J}ktcS=p%k;+"[ sP&indLh CiZmo9(}$O%T[S͂ҡDCЩäUsE?&h-L=M;!6I[c8}jljaH|a4i>(Lr o}xl#Re;?ALzPua" y^{ؾِW"L 8x"Alf9-QN" awrd`=ll#эndK뼆;`x9ӥ0х7Jur[Bӌ j/X%'UǍ'mASSoX.s76_Cڬ4/_]? 0@0ْ.a7F3gŽ=idzz`f|`QPTQDD@cABZC@sa衇`y=u={9g^o{^{{̬{jQ;c&X83bq?;yQI lqnvߵ.tI/F“?i[Lt㦿IحQ=3 /bLH ~ųUndEΦjW;n*>_W`w8NU T6Naѡ[Fû] ekSeQc!7xb~ 2Lhyb_,'=jKaX6IeF9p@upD%SqMbϺOtvD/ J(tt2v>o:q, Q Ǜ##ݠ=7 }I~jiQ@,^Yq1~oLL>n,BY$qCH2޲I WsI?<jNab$P[+yQG}~U~LO Չ/kC)[W᭜cONm=.vZ6"[ȳ6D)i-1wEfubԦXzPɈKy+K~jN/G{PpUlapϾ`si` 8uqZ4>g귤Zw;@}'hy}g&w6v`/kL}Lb|rr~ZÑ,]r^5t'h-ڥ8x6{Bm)Qw%3z3Wz^F59ݹePl erפ@@7B˖&9h=&"? pwMU :-if xpGy7~VopA]4A#5~3i_i s_ `__l/{ 3/9}i6o#[ؽzV}l8/yR-C̥ v\_F jB`f)Yv!] l2 =xObIS *lL^J_*@*}27p%:plJ $ebCKiLAhfȣ/'Ψ' ) [1̍@?)6%{`9;eB `bnǮVa|4eбq ?8^z|6Qݚ4곹J+)O{~L yf.@Shm({W'ѡcM${b@nEWR#G%;b~>\fӶvg$3uma{qМ-Ov:&k܌%BFMBS%nZ>rcm6<w/3f!<)1YdS] _:*? hJ15\U.˘̌n?4pN T#DZ.Vsߕ]<~)?`6<^fn9m3 X*SٮP>::S4OFE8~4u+`栮?BhYXx}v 3Ͷ?V4d4ɲjW*w{<.wdxf4<( R~h}/œkz uϝO:ďě!\eιo .7S+OӓLKȌWXL81b5bO{DǴߢƒutr e,_蜿HG6#Y;اw6!Swϱ2׆$}˗' k۳ݓTMmt1O)!Uɞ:pĺM>/@gc|1.@'!p~plfFA_MYϾM3s `D\k|Mp a f;hQ䐲pTTeaw߬ Y5!D3Y\lo"L"8UvE#lw]c'|:D?"1~Sjs̑1G cMb˛'DeWԸ:OGK6z[x7~\?Z|8|hnT6bg\[*8h7`.ahC?x`ɕ[;EJ荒ڧ47%eO[+XAvq_E\ߍʛ-s4ѐ͆ݎG)/4_+@6)[$wփM;;ĕy-T"p-o˲ ~*9JKf?bBLVؤVڜOrx3SodbǗH϶lQ(51اP/@>mS}AB6޿Z} _J}#d};]y0 ÁB"W%#]OU^5F"Tۇ⦱*@thu4m6pG#$, uZgqX~tb3X6(OFn$[uVշ1qlqqPNl7 }Ƒ pQ垓x0nu |5b^8Ҫa m$4Z6ڙǑހT/TwU|ퟢ1ԈķacI;்ϣ~\ɺ2b&Rq$) 0[9l9-n|jQVObM;8uߌr;f}^cO|/= Eɋ^l\IvDP5bCqHQq.Q(ӡ ߤhۮJrBTh70CItE&Vso/s$l2[>`D>Kbm:O]VOn{|vc؞LT#@N{0Pjd n8-tKuI#QǶCTlRҊ|ǧe3Y%Ubk"8ordv$%-*Z{ 06QY8}hr:$@c0sZe[:o˽^xZ`fh8 4;[%?]ǧ[-*Dž*)C^"= ӱ6̘V3TzTy:zͨ`'#^3嵪lO<876oױ嶟.r5ǰ|a C"sƻS݉ff[nkriZa`8 1yn&hOk-plnv},Y.xp(+f J9*1Kxt,z8ڥO`' o޹^E`1dbWKy2lM@U \MJ(s2Oٺb^ګԹqR[cd!NZyp#SGH1N5o˽J +_>(\ 79ƺor i[%}'g2*2e9YcaHѻw0`7O|LU4S@r/蛃=?x6lCg=p/鼚oBN(3^B0?/E;sH^8|W[P!@ Q &a73I~S'~܃âE> Ey1/G6:XM?:;tBeqZٲr->6_ %MMuRԮoNOѲ- 4oU%#(8ul˧NMxN}S],?2b?r]7\ʗ7{]>=?e2Iv߾lpV/Vk o{{0`K{8$R.=nq 4x |" DN)X: ub-+eW` sK &;]dawQ*Nb[_dXdc).;[\{&הR1H-sl İB&;,B0߿"( }u#}Su8Q~hVnN|T 'ۿr4I-6)1.nD]١U"Bwlw7+N(rnON2[3&nYCn]nyLDx!ݧoϯgӰ:B5JVþ 4*ȑ!-iuHhs[egI\6AK5epwp=p3f]?̽ELaW9/񜍈x?9"lL^H +~ 'f"bwfK> GKXD: >)P/J O΁]m<wT%`5̾/nCLd 1{ ޢDr,yo{ggߧz(mBuq #^O8bXQM2du/&`|p=ڦs{!٢~\PUnP| (%}X\'")r VbLSsE?[ѣ)+iDIpdIv  i_*[7ӫ!aDt-T7 k?0yTpŕ *b L>w,=[a02x1WSvCDUᄲuCЅ͝=243F]!Kb OK0-_@9܆ЫCd %8z;VPtѨEly$R,6bN5d.H̩nxi*&"O W{ɶޟ_1eF ˝bَIG@fB<$D3e(=.*{U &$?9Ky8[}Ҍ!zIZK%؁ڣeB礘65Z@@m)TDD"R-Co5.Ɠ< ?#^)K${{;$@ _IMrXcrcB)g&. AWX%dj;ۜmɏelS8_v4x<6Rt 'Fؖk[q=JPʟO?if-넫kRlKeNs 2c*[5q~!_#D42Nw`T8/{@*'g/)h94&Ѳ4p _SM~4X OMJ>8'|5LMR`ƙKБ<ѹjOMTdxc@S=/ތP>"f,FVAJS7Ӊ_'A.H\T\8]*/q(Wì`g(zR~cGiYI$nvV ued*2M=Ѹ F|܇B"4imM)utV4KU8?kPM)"cK^'{&<_N# Z"-".kƖS<ޓ RP%=g  U5|?0@C<H*ۥzb,g$QG;z*!_ʌOO vGŽH0yCIKۙꞇfkbGvgJ Ԍ8eG?h׎?,s^86&rF|ueLNX%ý}tu5z5`GmՂ7*QNc?~RHDQTm&;o ?_}UOPN8%E%k^ ,L%Eʉ]ɱ_}ч_y vMJ 0Nܸܔ!×74>w޲k\БMu|Ri:8~BK&t+Uk'T!OlibETqi*l3adDžc ҹi7S9D;C uGeҌp U#׹:bI>gZ@zO j& HGj^jU2PF(dvg^١M2uQЅaM`/ xσ=GCT Ec>޸rGe͟H[^Dk&NaU4yv!GRѪb/m-[ށK382qG&3nECeȐJ>wO iU\Gx+%$TyƧLIA21W/Po6?XJg[_&*<fK$n}|=95:kHqQ]m1?y?^l諐b"aJ‚5~M!< !a"BRi-s”K)ɚ2ݏ%"|!x0/7mg+ "אc'q HOTx_ég$K/gf,4: vf>aCDEriԫ~].1t2L4OŸr-!?4 dNBrtm:դVj"dARy)ť3c:-B@85N14SJ8E8Uu8'O~39 :ܯzf "TN 2ŤKeLOr2ngi6* 'mt 6tbUY:TTM~ŖbeeW0L類Kѽ^1,aE#Mig=K~Q۵qgQm2Ml>g/w)3Xg2/Lyzܟò=]eMGS(i߉3Q@&=mCUQi4)5i9O%χkhe%w$GL9tIV8YVOo^1~0ŴxCTwe4s=ЈLΣ§*Џ?Y3 KG=VQz-רeHR񗋛ݭWQď.qG[%k_X݈$-PԹ*$eIK4e|?rP ?6x:/P śQ- 5KuB75OG#>oD~"%!6}`m ȇoRsLBeܜrKÑt杭ᔌA&W]?쇳'LJNKLLWM9NJY@1eCُ\.꟝?, +av5겺4k^D#uƚ2KFk~#֍לZ犤}Ušn~_|n$jJu"4l>M_?[SK9щɰOnwbBu8~U֓D2̉;xC%ӌB"si3 L;?©T 󗆱-6uzCT j:[78l>HD' Cm2-F\lqSmIuםflEr^ /6$Pv$?"y9?q$/E^t{$8B]?'q65h" CsTook5*Q(2v$1~QHqO3+.zܯJU~q?K5-׾dՕ +-DD\,+V4eܴݦ!V-,[t+o*ὂixݰN{4$Dm!rT'.2ὖRзzqNS55,YxEmRAΏgtx%覟AE-tnαgtfb8Fx)h3ƖU }aKri}+y }B)Ҥj_[4g|4'ФF/{UC>yU-.c&\lN9̭?% ~(?kTR\CȠYKH(2vkM },ia78wqf>:?]Qg}NhP0g[++ ثW^UB8J4j|B}(E@%2 Ej?ȣo;-nzXNc0O8P?s/uQnksf/ub3YˁEOe8*A?V5p`%2ҏ>t=0 rԑaGVoN:a3xw[5]n,ͪr?}D8 o$zi}}};OQ FC;{A&X/tBآ? Q,!ϥNad|R']In3YLɕ[ pMWM/59Jqc1\-D/_u5*{߲tR_g&9N;Oɻ^@KDuȥYG%R40A?e?uRkbC8?:tl33qsuX9#)CZ s7{C_ߝv/Cjup5AE V#;눅L>fHuZMxnpxTOSpi{Q}_{ߝwLW_zફ/NfnsEk!h!L- bYA({wOD"D-GfTGR;wWtqN\6O)B8 @nh qnz$~QFBX ^(Ь` }ع6V-n0` ]V`^; W}l/F`L+Lk<1(kPٻ2?wxekŶ lNfE7D8 6 |u%+rn<-VqJtooqAZaЃXzlcnl@7i$Ubdya![%_+U"NU>Hۉ1eN3^0ijha(z^qɛ۱!4Vky4/oF E|xp4Pu5eM;%_?}c}EAr_$ۤ6.{xJ '/ez4;e>[8(4(Xoݪ#V gox2*]a葤Z .9^WE1{3"ƂuW4 gsۈţ7)'C|zeRBSvZ)!0WzQ"} $}0&9/sIyf^0gBFQ7R2rI<ׇjM̪:g6,UVS, [GH~,Erd hQ ny7 -*#e2AJ*d쳹VhDKn?%?plUpLT>wl­9(*,KoԘ:^N*RK_/ ThV B?'HXXe$HYvt:k(Y8_qӣeo( Qꐐ?&TaIyN Q}O+NqVVMGiH+I*WJyꞺאM`ǞbMubMcjRS?~$>k|@->|6S/b4ۂޜ 'YL; ˝Q#vE";c eZN`hBW#יD'싯=qcN3WN!w@" (tWh|DGm&Shxx#ދl >C rݵ0ݵbgߪ b6 7w7vmP-YqÿlL8E\fqaIf#Z%`l4`=h+dy^yg4Pڂ]?![`7Edoer\!E3PS`ɡ G",) ͠]2խʤ_8f7^V`*| K5&~/i ,uUd vh]Yaݬ5 X! {f#е/a 0 K+˧m z`8/2 m}E1 cXkP` 6*:y#z܍yƚ+Db\N`+b[06Zo(|&DZAWJw*Z ЦE%{ &`F#π~/pdN.sezb}snHnsmaϋ 9'Zi`c~W`~叵!{K+@:۫/aV@_Ӳ-s NvotRBИ2XvwO F|E2Ic qߍs9GKMzk S!࣯Q4!{QGuC@?2W!ns< OH.8š`dE " Vկc!89k> ruEsL\ȷq!{qG98ʅED{w黡ۥ3dIiȺ'&ڳ?Tz}Gs;+̝ |E  CR{0~.?^=gaĘoC2ㄡT#"[U#0zW o=K<5KFf,&"c<\ع2Za;l?fjm:hG& pfE?6xinR Vf*G;=0r3 *}ujIMf:Eׇ_^(Ao&ƄI˙O Leek` } !.?#{yL _۵X*9==n9׭3ê9/iϴM0CV`ћmvL jC[Ii*cOE^}`9\m݃&#ļ7Y+c\ћUSnMUHLb@`4Ւs_Uw]o&k14{GxB]5r6!Ǩ`I盩젽Du%+/v;9 sFy*4-Lvks)*CGdXpnמ\R0| *~W5;w aJ$ŔMq P38JRbj4TOu۝zP{Iۑ1-EOB/ȅbJDx2T|U~w f_N<۳t7Ҡ_סvҀ>`D gE}5nzzpy'nT*-HDoQd?)#|)NwA\uވQ5ߵ?t=_‘Z.oZ'ǼQb|9AmKBgID҉CmI»5뷩tċT 9Ub CC|++WVG}AMՇÍO}1MVcU魂/L*ۆ+=؄cASX/r4 lHpiq_g孶cpt Lx\:ua|{k8*w Dcƞz :Aoռ:8̸hdQHG.ye`ԱXSl-ZLWԇ=i_ndw:__#T'D-FkԼW~YRn0kΔw,vi+z@tO$߁tAj/ϸ8{8,m%$ Vۏ"QrgWcкYI_v0b9&*o_UAP tw_"$g`8EEW,4fx'vE >fTWGXJg"w+٧MB:Ih\ 1i`<3uԈVh;j1W@p&޿bN?s_-i8S8S28SjڂHc"A3cz N?[μ1)# *ɿG(B8# BG[4Hld#@-Saf;[/P#p(e+g<39lsvC[8׊&7%wſɼɱ8)qίhC!nzyrب +6=]Uo3Mp>4SȾ ?+Ieϸ:rn)2uy%CH^XU\ެ=dn9a\!S(߰3?D{h肣w:s X=B!|1=W&^xw??" |yqⵡ<&#7IOǜ0GHG(PtxQ1fd'䤅!XXjR?ͿI,r3=oaq}q'kJ_+`K_n9x$W!!_#_*{4Ϧljw4W\VQ uҍ<ݮDo̊k}ͷJiut]S|Qfpf"-EnF`i7Uf词 R0kOw\w n(HtXcRZpt|W ]cM!<$AUlIdItių[@*ǟ =:̚F+wڌ((4 EMb4Q`&si|:taԔ :`k:|T.mNء>XCPBUQ*{<&7y5]ڧP~A~ ƫR"/&49|D)aqJuչz<{o؇Oڶj{m V#FaMҸC< UDSk&]<^ ArEֵvFNiN{=}v(2Sp57#(dqaԩ<JuAŶ'8Iu{b)Q\rF/JKTx~ l fwMgL= /TÑ# x}3?ۉt9~% S[,H.xBWs]ډ;^՛\sNXSx'ry>6Z'Tm8$fMÑ>yva; P~'f\r3\-kt\,pq^T~Av"WŗY|??qښRf&X;kK/UrN[8 5Ƞ΁0 9t-1@GN+;1e4!+l6yl[1-zb<'CkHJUކ_ʅ O7/0I#|LTdސByhPP5M*nn2u騺/gb`|YF9 ;"cTC}VX؀JŶ?[^m,tXc!$V]1.g2VM_ y6Mŀ27г!o|_sr+x0C1np?WOx]EH"5q|6sk-@o913,ϏE^ShSEh)_'K5+H2QaNoY(Fk( Y`?ZG3Hyb_T+B}vSQw}i aޑ=仾v }D aOkz6B^ Xg6L6IwрY>-iٽˬݬ!5r{,+닕Ѳrh;cjk:icĮMSGKMtX/ ?4pڿRv߱ks mW 䈃=#0 .g=W* TWdd;1&$zsg;KHvʼw% -)lR ˕>G&-0}w> Ԝ͗z,-SUO^N;,-~EhxpZEY)9._[c)d;5x?)jϓs՛A8NtY~ǒ4@v᯳l0cਣq.ι:uyH3W}d' k-G+UhX|4~y#oi,F)V ̛d#J6ׄdx/ "FvvF3| aZ {؜p|-]AsХ2ŒFdp;_Vg'i)StՍZ3RQHZ 0KRLN}:Dά΀:5eWe._ 1lo!ARna_qݑՐwvt:しޘ8-/~%Pb?`*>2Tج.$ƈ}E&'r2e[kH(zaϮO35H0;,jN=!`;(pfFlwKx%3j܃]0U*-;J1@2Ez<g.cJŧ,"߰?di\䣸e%YwWn~U|= ?[qxOyTsª*R?s$S2&6 W}pQq tc8q"y|IPp5Y֓{hMD,ī$ĉq8rc63^.rsM;EJ U4~J&i'KZܢ)͢Wt/; i ;YdA *)>ҽ4P{j B y)N΃z B AU2Y _:oh`DžG9A4=wԮ|ݾ,͚>!5xcd4LիxŸO.φB-EmvLjB2ŰȃЕ2ΩwB[ B=Md:5^'Eb: 7ΗҶ ?I2W| Ç<r,㫗70ǚ'frr 5Hl ~Z]-AF?_9 ޑj4Q5un3?A/Y1=o%苓SHvNo*&rj|f4• !FG!Hu%Ⱥo((H ?& k4Y ^ܽ MT 4uTz7_E0@/' em]9! &VR"H#}!&3%eb 1V'ËRRk>`(u0t+Y}㐰`v [գ^Y:zoP1Eît(xY HKNG%1Fu8Yp rB䝼 :UM:s-SI)"+ PCSV/Ӻϗs.ID{iyV o] )sJk !sR~WsMoyw,Bb̓> coؤġK\SM1lϗ% ((6vn(R3d 055)S;ߎ8ښwkվ?2Z]n\-1"+G o9ⵯ!F?MR45CIw&dQ2,,R[ɕ]rU AaE󵿁 `'*D7|E]GIerۮKwܩCKk֌9^- rx1eq栋6.bm]fϑA;˜JA1'J=wܽ01տ쒍7%h@_W'D:X xi^|LxٮoחM߼Еw_x15 }wtR]^0c# [:vr/`'@]|e*kJǴ _j}MnY5nrR%fB  m|Ra~M~ܑCvh!hTcEo+ݵaq\ d<59R1G=d(fC: Z ]ǩx7-jo~'ri͐>Yq`$9ᩯma@qH='2u*q[FWYμF3\Jo#ϒ,3-%dӽU|,y{V{E)/SR.ŞO!b[ɲm#׉"j88;k Ҁ"!-s&yU. 35:nYܨMVV*"O_"^G輿w+sT4a=vZ- 5mV6swƌgCQ q ߭N'X cn[3M֓߻̎J/FT 찥5~8] wl|gns9J1"~UAe0SO_wSBB$dgWQ:]FQ5fȠ"#o_ (#ƉV^uJ jGhhe5uo@ڑa=r Co& j[1 *kpS|Wv̲5^͎#Y6?DZCȭengB**Ɉ; >"~b\BmD94kWJsbE5Jb* W>xزdwAJ?m&lz'ÀTnSOfԷF=/bQʧFwfi,yWR6^PEZ 524K-:=X? !>,bE';${CjP(apMg-iu4}˗dzBLRCcqн$u]bNBY0%5\{CFNѺ~hFx&VH Є9F s}V7Ey%`çkFlҘ_'!efVly'6kf!y99B)ueYInQ4sFzI|,>!:gY|'7;<$z3A"FBviBp-nX}Jzqx1JGnGmws Y3<~qi>10lGp3w`[yɓQ6!zǴA\QɁ u^vJKԢ)bx5u6iȓ#AKl;ٗ4Wk%4ҫ*t6f ĥɼt8 \;=Ю챈6M gX2+6L.WUύ O$MύNV(gN_͍:|U+oBvWj[sxcEAoIGk*_4>o A~Kb6Ә+ nXTnܰ$ij VuC,F]8TUĄ^V݄E8c\k96􆆒I '`vp2(T);b2EէIkΟL vCԧYc ؑL7>~}x'1)M ,ǫM۷^5%$[ک.Ask&~!m3A%!ZƹFΔOX@&SNq<+ 9rmKp 篰aX~(hu"|591G]5O*K]& ӏOks+rvt/x|e&d68HO 2pyx2|±)_D}G2QsS%ܐs~eIpjmh&./SE>a׿ksONI'B`޾\"~[M-%5씔.nj_@^lC9@ x)tõޅٻDaШbnζ!`ĕ,ZB4.;)[#1ԹH*1w2{sVuόݼpW3c\˞NW򶾌AM MO7^Z~ig~p`]f0w齟k-v჌b!U t1 Uz[3,n-Cd/fCӊ"`Q&YRu ?UJ_,b{Qj#s?+G >bYmA#}_z>_E~x(* P7qa&ԋޕ<*D'6:/M8T V~yVIQ|54QĴW誘ͮE}迂ݗ8v^Atp|%M2 gL7-ts/aLt=[B 7kNL|>e_؇qAa_H )x p̱K)D@JRv·A t9Ω%cMe} e6J8M}&7u*J۳4.HW3H4T1PqmꗉkW>Gjn 4]6ѿ:s\z$OU@Y}~| }RQ!n= 3ĞN0Lqj7`]r3}(` 62T"r9{cL u#/kde ~pm1?J/:f;o`-YQI+dzI#&3؝.U_Tu ehR}ӗQ}r{`ԙK *?ѱ 5#UrUecZu; e:mςG\(g]ϥ=<02>9LpJ`Y?PB"LJGocєBLވ\ave26Ϥt.`~*I)sLebeg}c!6{@=m08*<ݨ=ʪ Odd$\HX!1f(CE)n S4ޫ11B sRl˖`rlZG.E{%v pY9XSؒKcrF[Bo ۆʇ+&?hw`(թR0< 1jE&/lʮ:l侓\ n <^Aa j$ڳfC<&] _L͢(ƦXq Td{_|tncͳ_ExHϖЬω 4mhƒ|Oz/s/P 7t=Mge$r]CnM}Ogc,C Vq.QYNYi8{&[r_[P ^ B@&q=Z*k'U`{ 3p 6ki2^8ð! AHG󘖅a&6j*`Q6:gL淴yJ}B}v)N6`'twӔa똛$jڙKa&>0~R{;fYЩ0 =}~]$qӉT2MݲM1ymV v!U+w+ l'~3d!+3It A,?N; qnu:c];q9r[W%'NBÔ_# êSEyjyo?k2kdĒ)*e 2 v}N?|LƩ~$q/KV~q̋u !먨p8t:%#X`_*HDM6M2Wpm>BB9gderGc_6=&BmA&*No<e-]l m|uhg]c0d1 :۞f} d61 4~Kq\E=v&ؕqIpՇƟ2gO/G<0F3‘Z{\u+2jl0 Q<Z},+W 8_x7r:h@e 6鰳s 9!Ae4KEn$ףŘǙ 4kg:Ǩ4Fz*4n'Ƚ,d;El#욏2?Yg+Q뛏= Ȝx[F},80fQUw?:/fGtԚ)(`?L3 _#~B/7.ڭHy8ixQyc#Z9rmi8ctJ#^]Tic7*Vt}l=ڄQ#I@>RO/?&<vҍi|+iד5l>kL+te}Ur}5d'dμXNZ(j+Šo n׼7Z&1ť=vQgIgΕ=3D|})k +xsxvEٙ.a^*b=te5 !Z`5% ~v9R ජ!{r=k`<c V3n.tυզ}fpBh[&E䈏B_ˆ~SyXޥ˧Ѕ~xrVۭ^O^lW8YZ׮:I܉o_ZCZԓq|9U'=\}w%U?KS#U!4R[COpS1Me )R,n %DA^fq@Yz1>fBIW,TҜx>tys2bEf1Ea;y<n7XXI:]&}\+Z7fJ&rc|9NPrȋ=/ڇ!<2|C)b?<o19=6;Wz0:UQ{rT?U)>Ǿ\5^"rY|yw{uڼI~>[~3;n12NVM}'"6n͋%ܚ^(yGmzN,vDr.;֩~9LBdH^Nh!&#&6f^Kb@ Ɍ +W!=>Y ԪXm:02%.ɇ=_ v:ׁ΍~vs96r=Hn9̡}뽗_)^\(Ѭ֐{[s6)`+&X*kV(c vDBk \$T;1JJTw5ZXG}uv}˼Rq> Ll `eƢÅ[+ɝoh.ܚk$Fqwvwφ6eOʼewf~nhemMfy{/ecNai1*Ƚ)EeQV& -df8C4wKJe+r߅ٸU/%I s&aBz$`Ⱥ~ n.e uڿR=;.žKw;';VEZD맵4s"\9g{:8'1!Pq8|u-ۖ1Ρ[rJ@&g^ `¥sa2<3o~s3)˷/Cwo-W_'bNZL]o@Sڝ^&z{+GsI't lIت7Իa W3<Ho/ l{xP_uHdl2\,:25yVBț9KmPs"i{ z6mmpa7 hYf:ܲ;n=֓ƻ)t|S=\Ĕofe(_ zwdu=l1FZ`?~1/j\Sx>H96? @ 1'l,G\cFk?{IH1P3_ZOpd8<=V}"2>'+av}i( YzjzdҾ-5 ^αBj^nH4PF5;N7k>k-kY~kzO/(w*_AE>; 5fî|rֈc~LKCsI+`׃ێ@.[9͡lˌ}>#g]w✮"%[Gq\ڷ9ʞ0;I3%J{f,= F29OGdd \.f!8jsj>ێxc<ʷ|}Du0يBN1LrMTM^5"igϷNUl0G 9v{6J_epe߯8[~ˬC56-PjS|6swwab=#A$E*UiR~(A3уʀwt:P䵞sypg{,JX 36mg2z6/z ՐLPҏ!gdT/G5<ƍ,T`vZ^a>. ]G"?.E_FLdYwdMBsBߑ}Xj UzG+Uې-41r64@!K|Jlax;i_@fEor(}p O-cR~>e-a64.<_bRZ #. \^M1O-pOVFr|xQ7<Ĥ b`^-tBl|yWMφ-BhUK\:tŘ`Vѡ1WME\ L' G0:g옊3z )zi4^GڄO ǁ~4;&bZ:YhŤֻ7jB Ϡ-1-R1Q|  o7t:(k1Yg^$?@MC~Ic ˢИ6 J;Bk! ӛs6yrπ3pҨreTB  +#.[ݰN[$xk)ٴcLZC)|{Ӏ đt-_@Źl(-H@w %@NC `7ius־w1oj՜eFls_36GG20m->=B|:AS1h3|?h*2{Gp$A-TeeR썈4;ޤy'wi| .bٱ[,=R8g ~ضw^u".]d,:[t=.PFHH1hQ9t88hIT-]K(<}򸙡Դ VlYV~ӂwBd~mp೚cXR%_^q@-7,ԅIpsyKt#f;}ޠ]g wo ~W"Ծ4%wugZ3fv܍ ~u ?J}kn g +LC!1.uHzGƙX()`جm7'u04}Nac<'Avs_ʇ܆%E7W.E9L9&Vh!FSS LM%'8'2 ~cpƈZim\/ڥ#նŖ.xЮqqSge<~LgZ3dYS\>l3{y>s/@*Ky^:f_( 7no)vofpPK3TDj8YU'iS j3sRx,,$?f1m/0j$Ԙ58`+zDpF(.1j3.͏'> gcwgr.(92f5o=d=5o{> 4N$(oym"D֑N<}ٌ2ۉ凷/FM(MIkb8V &*;=:',+R&@Ԫ s{@4IY] ^:[b[mp7ܟ,b9n[z9axi~]OK:ZZ5ISr0]ٛ2>墝wEyu3mX1f$Q"ЋЄmjjoyo@`Bߞr˖j ǣrzt [ qy~ /\|*1 ! ͩk5V4Oa~TIϒW}P㚝6:rd~#/FfaFs_C&8'aq (.Ra8ݸ2֤U&SxCBA^t,'h_AsNGqt0o7y,C*]dV߯H'pS[Mf$y\|O\4QPHK%U< [^d*sJlMP8'Բ7K{h{*}R1MJq-JB>fh YLo '> XCdN{jKƇR!DKO} ^b_?! sxy%%{ͬ۵|Z`xJBdr;־mփHb4Qݚ*UZB~/Djx{;`N4H_f!>^؉% &c6Da߁P/Db7-9=EP̓4iLQx#pA3 l *m:-6zUhjN`9n-jm[8c O Kh'ye-kDEdfvG凓GaNOBM!:[t?,0l*ϱ8DqezC51yj^yz,M0D"勒s,Ž@;dBwAUsvpgQF7 H:Y s~w_b 0|;P(4>9Ճvc!Ymf.&7ŗ\?HL`^ͧs\"?~~QˢxOz)һ ts=' `7a <6)_pO-Qz҈8 N{ ǎie|Udߥ r:mu^fzs˗ă}>q]݅x̭D~ɤs/d*dԉ_JbL;$ %.Dj20uΊRqFГ"trB_L׷PMl2 ȻR0ڟiZx!^BO^ٟ._-~px}͆ɬ#W[M)=&)a -fymZG1 C_ߺ!EN$4qjxtw(dI63+?mL+uaŽ\:Tmx,"eBLA)Uۭ3mB5T.gKMjEU▋ fG#d^֘ tϿWi+eqZ;lNOA-Ut" S]TV]Q u罿O؎8c^9KfhM)|B#W ]fn '΋ծX)#ӍZ%m${rɳk/&9װ9oǒG)0DíG{C~W<#JH^?4tJ8 Iź ƣݑeA/#Je|5y0**ѧmeto=V(z'>j\ڪO76bV"NI2{kt/4!y*vs!=r3Q%m+3H۠'~ʸKCEBDHͷ]a`j`m"!ey#kF>_z!jq9%Bm,OU/6`s6㝺Dz{lֿ.>]`x)A ?`B3O3KDkƶ;$u}:$!$ćn'Ι~VM(.pU7Wsx2;{f?mƿ;n<%*:Q3XG!þ2 H@ը6y?îXK ڏzۯ877tRhb_|<5sϋ/;t)pM7*\]s n0X߲+!ў7&ƼwE{JB~,rJ:eщb͎A}2!ipw+&PrwqW:?ߋ"7h_gQ5lS52[v? &mTx{ANB~7FeviqF,@R@`7S5*hD7ͼ;BfHV_eW':)G(ו=8#= MY&uךSYBnTj`Xd͠O3v?ɚq)]h %i 7lcUO Z25?P6V*K$E=`w[aVS"SHQJퟎnE7Bdz_d,./5o 49e|j&a#K\f|qJ`b=L.NtNf\YB yWÎnlJcMDi=뛮ϾS[pB~ó1O,pe\j/ ңҵp6ۺ:Lwʣ;S6NBG)T'B¤J a_yU KS-!--A3 dƨEX9ڇ\{o2FJ%g;BQ݅s|&:(`SLgt˱m>1s1ֆCj%ʯpWd)5=D1Hn"Tm/ L$Gc$6"}ֻriK}[zx' v0A8HP)]Gf$O?/he%dM=tc3_]2ޙ;^OlĽbdI*4w:D]E 1x/esXXww+?-bjedc $ggK[4񥏪H>II 9,)тm89 :>'H _3)Z?%Y 7ivm߳ Qc7#sB S>a9%k zsSKY`9)Ǭ'͑ b1R$_^~%W)0fF;p䗑f) H yzkaw:?%ry9?>Z 2 YxڊST;ץ uK)ξa6]Y|QHyx*7u8I^BU g{X%o|kias?u> f;?7"JfU ~E\TxɕW-E$r`'|o,t r(x95Ƅ%w㪾0+ lM)}\;ןTfrb2[Pd e{akvE.xgjfq[Bۦȵ~1ks=Ȕi +sILQ|^" fģ2:,>Fdh)NNz>Ȱ䕴?+ȍVTINx[Bwp16/s+6CZߪw𶈏Z[oW)vԗD EM\#*})^t Xp qQ5|d轪v3'Ċdӧ3yC?ҩNmXCA}i-XC s TOD~8dqjz=ag/\9:' ?^{(6awF Ÿat|NHG7%N:P_;Nqah=1J6N|{wPư1Q8fOҡdU_z 4t+AGl c/p{^LðMLNOI_C?R)K? !*zms:7UhnO5P~MUB.ǎ$M5s;=ig)P Emc1qV$r31ŠPx"F Uosui:ʬ9:yЗ?jDObs7\"J&6) V(cEu}7XɘvuL1l jIDALdz eMO|=˗Eq_&0bm0qBZ%~hϜɬˆw/̥(mq~Q*zE48U(x0^71=WaYUtnE:澔׏y6,LN[x#O,iF|a_m[.2]g"-N%ȞCVf'ԔP5|2oÐA`AӃmxʑ_XF,Uy((t,%#I'Y,98'+nl~ؙo.;?Ӻ\&F‹kK~ئF2\?"Dh>f3߇n^t+6DOhcΝ"7P%OV᳋UK`n~6@Kz̦vnn]wUON84].,`, .qz ,Eѹ!d>]TTOvzʔ1zlDƎ%6=reez.uo V]*0'臅>,v#d⑀8=`-jxF'i}?&e푆5Y&0Iđ3۾P{6;~LHz?_P8S^੒!\Au XgPԄJJV%I3!%v[#e|V6; +o{_F+G@6Y`ii~mC66⾰ʙyaԖ=~;1 ."y`ecKWW!a>I3 !xn F).滦oC;{g >% [s9šCYL/cLNRR|{@_MiDo-^o93Q{w[8(/_vD-DIlzqFhs,D|w&esn) A_t!CN8-aGYS[԰CI0dwVLo@J3Yg>o`v"HK&pQ2J3q%@/pQ3U_h#sG2cS 3x?k$Ug6|:䌠%^+CG@>¡qM:iʧ&{S3Ny)q 0:<=taOd{`i&uMk}kSQɧ(dGY1/"#O G_DfҼat0 |qױ9g-xӹM7' QhE;aT{Qp^N!D{VAXA-gӂ{E[zn\jvOH5!WXBGR+O>XOQKk)Z@Ȇ!w U_]y>5L[%AX˥:iw";fKoӧM^zrd%!2c `=ӨO$h+  %sژf OJ?a&K,xkNޟhv-Vmm\_5(w]6%m1/Mإ]%st$4K)uP|¥օL~,IWqքn$E9691gL~'8/9͂R=&L(mToR=tSPI O#( }qO4N*K N!ZG)_ǃ;P:F#F\g:ӝ(uз*W<[z}W > ~Vb$J[U6MүqYcW[IY`07fW˹eDgE^Dl–6}cƎ^QP={trO8ϙw0BgGe ڍZ :g##YjKy2uĒ$Em#kh'2[X+Bdē>x-VKq$bsGoq&9ʍ&cgv>2 ލlÎVaX η (^7 W|K((Xz,|hdd]vn4Qˏ_f'wJ-5j=WaS.*b;g~\f9FDs l.̹K_ݯ@u ^U <Ԩ\r.BbhS(WćٜigjUo1ѽCqrX,m6,r4Zi[.6%ʃpB:7{/6BԧEI?ZTR p'EQpm-C[,%NtP{1Z mR 1ϣ)ڦ`3*-k@!Uo aT9݃@Ӯb—/nB!\{/T0Lp8SXA/y =Co.6;Cj6|]w+Oi\ٖOtՌ~lģgn+. 7Hj:#zإ9]R:_U_VֱG51i\NYumvlS_3A3E[KԐ%A݆S4D v_Uȭ!mשj$iNBe [I7&AJfЬ>sʙ@a+LDfWfAgSM6oawstoQC$O=2͸[jGpS6ox8A=䵏wP@"4Rǔx"҈ZW#-"2+tD%K"StQ8ݯ(}:m>Y ^"gI۽JG<鉩nZt՘k^C e^qؑn(|3C؏HinA]5V>w\M(huoǹ\ŇysCEUhEp XțLF8RĺML.YN0]= ԯi*W:VͫFGN i6]-~F? } =rvx[lgvI^7 [󌅜GTDt_Om#N\ UŪg=Bm)C+ C !5C¦RLTM;+kF#uPERZst _%8C<[;h>I^T9W>((ؑ'T~?3'?ʾx(rKE8qݻk&tT㷖Lo e'F?$$SR1ǿ,?8C*ʤ[V-γm^/vdTSĞu|̛rj(; Оave=JQ{K ZކLyGcú mCÄ / ;XAi$mȋSY?~*3%[:]4nm,M AE%i\v۞f Nk~3J:9G{k }0?B/@ q.T8Ye4b4P5s=,qxmZٔj.ZprX\EìQA|ʚM@b',㱿a(eد^>5wT)dmGP~?q 9D6f^\8& /6DN ELj=&c.q\Y Rpi78 'n# 9P jo, WtXpgwxVEݮo2q9RCF;(N|ǣ?޷jұ&I  B,chlY܎}GY!v=:1z}6C sKR|y|Dgn!Q^<3/iX}7K,\\\Qi]oBZ,T%M3K .}%sǜƁAv̅?Jy9|fRlWa{c^~[Z 3vAcPyf=EDZ1>"p.>Y3_xɄ:u m07PMûSiUîO8ʣJGZG ?@ UmzN M[=5䬁N@ʹn}{6/lK+qCD/%8Oy,0!2 a"Dޤ鏓M?Q*HFBaO؂ 5֍R'Ǜ^BB<4r1̩7hGpei"oz[o񎠀my?O#[PC+R`_7K㸲Cع؉&~X6+7tDc ',3wWy1g%1./'O`W|4yY%5jof#½c>yuVcô3tI0&+\ѝ1-Y vɱ8wCMc_ԽXGVi"'QF^r dVt gc}\xbR?+̜K!F,B֫WBm2LFgW~:&gpvޢjOxf,๑x(Rsw)t4`_v^oL_+d_X)NZU]&UVNJ-] S`/"!]Ss0ƾk/tjS1|OSzWT*6R#4#sr*XõWpD+JI uZ0T. ݬܲ~"(؍xo䣍q^\btsQ>]YG$AшNnCckHn{a9Z: X 0,}XDK/}*DHx9 3Lxx35csS12Ɖ_CrSJfh ?ggGЙN|Cr<}y=,lcؗF ,KLރg#=}1}WL^osZQD~OIqYg#|=X"P5/eD - S;0inP*O\PPPOo]'?4'| O"_w,[R"4\IC-bGXѷو\ 4iBynTg$߫owSN$$AaeJnOUуN]s..cS\w ǟhqй_R]s ?n\C^5#,}gJNn~shz{p=}wXA*}wi6@zM.1]S5GtWa4Ou '~kTc.bY84#>qm?A,:lΤ [Y?'eϢXIHUI^WVn8vI̠^s&]U<(\B_u٧Y+Yɓ]Dw`v{aW%sKa=F'ٹ&Z`#˒xXϫ.4ѝȴiQKS9:#} 1X70~D5MKv{O"jH=.z**/ДׂE 71}#rF̆%?Y?£uspE$5!^yA1jc@]:k`tߵ>gx'm2T Ѝʓ`+::L3}ݽ+\岮F:}vzP{?F3S!x zޝ[~f:mh|FU@K;#wn mpS"h`|™.bia`5k'হw/MC=AMψtƁc'WzɟoLiw#-g% D+,x!RP(ʚl?ǷjkulC-mx,R;ġ8q \AMuoSz49~L_ISźdg'ÿ\GdVI͵䟚: @a>5_Ug W-,VHv/! H&SX`t"iꚲNE!6?;IjIDs \6 v/U(Qя,V>MW}/ڌ, {fkKU%G]e·-J#W#._{wg.C#xЬ|}?n^OJUD}jֺ7@lEd[Q_%m )0Yjo^j)3\np:nCf iY/h '~oG}͕' st B_?@6VA2&[%Z_o(RUFT -L eUb`:icTW8rrʿTNShTW~„%.A?hˠ6WHQcW~#>ЌkfḄ3}%2, sSӬhďx]nznZKxa1uat:`#3},.O('ױGp?֣G >jc j7d5ӂ# `Pu׽窫 qx*Z-xp|<1FT5^` 99l7~TC$M\rX. "2x!`Be(qzo}Tp|5$KE?N~#MpOka5']ۉ .ۉSoEf)00H\ưws6\#/'nɶ0˻(jJт>gl +!w˖ߣ! .TN2FF ;IW> xXjpBt!gK+ߝ:CMCKM)Jmy愈F]b;`ca.FgZG=FY5qk%/z:.$= ^E;:;q|.]7,#d|J(7-_juƮ@LNTź {kn $SW7z5KH(Nybo^o] e!'`q?|XglH;"9J=^dž#Y[E<,=- G4*ӁA+ xnw!gz=݉YU%U7}‹^Gۨ *ǬnAYY(RV@yda/"'P0dޒ,x:}2723s˕0poiYYL u`P=H\w떡VK;ºpbpBk+Q?)Pi{d3;/ Eգ'o8UF9n {)/1,)#{bJ՟Fv2D˓Z sd4@Z56B] qyxqEg׌u/D6n6sJeq"|cMa>]7_ :JsF*W) 7vB!ܶDJ]OM_|A)0S(>%6!o^iuFfN^TLn Cf' /dUq7;s}E_5 "y5ߨLGC|^˕ ~N gӃ,?~w[[4c5}, է 9 X^je1WxxR5)R%p[hdX}g#^i${ eӗ#Il'Z'Q'~`ϱi'C8a_& TXCm94bុ|mȿ՗/`| cwD,-y82RM @#S&;%2+= BDY p%Yw8-,r4okt}XVgr0%Gm&?;[I?UC'ۗ h:XlCs~up...SBZo^HsMP$0 j4S5Oѳl8}M9g'@CyVp`Y@(dQj4Ȇenc}w*˲&lĸP\jB&Ƃ£uK,X21UEC=ׄ#tuVu># \`@N7gDZ0Wহ i"xvҌg7f UX^O}+~AGqbN驽<2Dg iGtV+- 8iM!Wk0~ q~BFZ3 Ʊ~ī3-B:뛯9 ۦ @EDJDWCW=wRgpAPaqfAZ0nB@{zW"9ݧgQww%=t_'ݬj<*>q]Vpn~ 5@I<'R)\8929Ǫf5LX)]4w"(`@,_=?(etA42/đ0hT :]I:\=x,fb @) r9^ [}У(= (-,Y}&*H 7xF-|qc錗G7sr6{>#^=o<@D#^ˉ 98C3>D*t/z\3:?6%s'd60*Al9Y)"*_e<2HSzXPyrWtqa@𐩴y^Q9*] 擃<r۔Yw} W st! x^E-8iBXLsH!Siÿr_eP1zXi**tTDqa+^h&L'`Ÿ/b>O[% :cQYe)?ކ?NdPVK0'S3Ǻe'_b׹noλw64 v;[UP ^@ݣ\-ˍkiG X;o5EPseuo[5/L'[;}.(9Y;{aS뷗g4|tG 1zMA* \wucukBCx /FBA-25;pSQhL-Fm;֊uFR[ҭRW%a{xHbv5w̰jKbv\it*,wU>`%i\YԱur"\urcj y9aj3Fdޝ) q=&MRV~;`T>';N_ȫv|&h*fP#Q[u3 U(]s3yO%`h\<K}QݥF_cu(spX=x%E ᯋM{ΣEC^ϑ [\Eu漉2s}ff"K9wb},G?,|zA+?AKIIU`KNΓXbs|v0) ^JGqf,9(/o.ۅ~KgGL Ph&f,+S/ !o|be+6FݬP:P{0ޣ{"SMwrG!"]u6*"&s׹޴E!'=jK;==Qdߏ5A0.aP(brAQKa傤"~UW8TrY y pbu)ms6C~,ׅ3C'4/r}=3V?se\s;ĺ{$^O>-$]P]ki'ẽ?YPJ{q r4E•hP!hy vmþ@_m۬-GPF̢ȫ`(Nu:~58mց݁/˧ ɧ,( jQl^0d 5ĸ,1z,NҜV"v'\qm[T'>^z5b-ު} * 4]o#w)(3esEƤM$D |S߻U~8}dg٪z?WJ(_kX&{rˁNUȗ-PJNwOx\/xAKuel/; x \;*sVw@e.wEA'{﩯&nmŠ%VV6vRL&FRLzBrVvJV:,,2q%}ő<}=}+lO)&/\ܭ,yED9u=U̝Eyy~q>>qA>>qWI Dl==]yx|||}]mxxxy3<=}=A?[yX۹zڹ83[xyJ112?3wO g*J7/RMyS\?Wsqqw`z+y4?//W|hEǤ?-Wwykgo˅yLI1 {krrw,o-y==::{k)nd)mdncl#KqHOol7  7  7  7  7  7  7  7  7  7  7  7 1aVɇ R反ˆ,/7h/w*{#'LQ1@]W5\.˷N/NtcUK(,6kԭzwTZf0+M$yc;b ߆:!G6z4xOϞ {z'jh ]X(PUC:"\tuƕdO^Y˘gjO-W((or;jq$2Qf%+9[w|9,?%LDqyQcA|\t;n6j ՀA\k@ѷP-+ KTbP4-ҁ=Ԣْ$Rv:y-ۡa`F-_lO0Aa#LN%vC;y#Heu߂hcX8cf44-VFOUƯfB6X-8:(W>W`v>9MhHߤ< { =it1SqsjK~\Y-&A|ջ}{ѣ;2jurJ4Sq?8' 0LSn%vy5KLD'e+8UۿPaWʓ OTɨzd=" %M5mx{'-&Z)3+Ht~6C^ UI)f[w 9OBv0*h[_eiCc8zz#8[А;r Ƈ?ލԻk'G^B [ Jǖ4+s7[&0:ʳSF-Rޠy!bp4e0. 9Qpe>=QGSucp|# /%E;A yW5rM[rv ! !RĖJxBBTuTПUH'Ϧx%լ+ϊ6;툑 = 2ҴmI7[r @ g zNO6KޗjkY1ܬN[ ל{+3FOfi7;rƿ >lR06D?a{^Nÿmq?N[ KΏuFhdt hz)cf}\'BBXOg,NceiK\;)_;iO bQ[^䳂$N6KޗN;PG4f6a_Tʆ4T8Eÿ)}rD̅(A'> (#沌PhY72Ο+|za~J }q;_o;ehiȝ&G Sԏ y}353+aF1$(+(#g9[ԅ45:_++A3ޮ,z|O%x`;1xӗȍBnf=2eΚ77R?gG!3$lukC&Q a{<5kFWD =E}Cc#^i)Yߍ]{܏Ta]Tܨu ~ -N~-g:1Ak~xj #iͳuG3T8d?bӻt?y 'cǜ[雩ibs1' 'Ri4\0 /qpr1w/*^D#KƂ8[awJ֓QI3 ҍ:mi?ElC$y"li<5ym?w+w|!w>=muHȔ+C6ҦiN!ٯ~Gu=ܾ>`)1y=QP8Eah*!Ơ@aÞMڼ嵿vj 5BN2uی4m8|&@ǚ.@]Q^10 (cʕ9|3kvIԸ'DYڷN^-߼າo(lDy"gvPٯ2?%Q&om;GIdTTOXtikp.G&e9Mɡl[}^?ehE| H]!mXNc'SV#M)0-x퐕OuldM7d͘2^i]wOW~pISRi@T&=*Gn $y + bIq%TF[@]"eyCGE'$IEb&֩HDo*ՆMXLg9p)V)@].D5|@ag0=;IJ;E@B .R?Y݆ob@V""WZ@3SzSKK}c\M+$/.B`3~ȡD+M>y 6QQfz]PRiﮭ Aubyo9;k xӦMx j|=C nt8eoSR\$\YOa x䫤JDZЧCcAR{iQt@! #ި2gڨA]"=GsmPSF-u #<#iTlT ȷI%\{+^q\Nɨ)+C-0 /".V뇧iSs&~J7~w%$*f }l4%0E{ϻK9h@ck*' $ L AFw` Fmon \ l?ʟ.aX\M$|;VB"~ ",Q[ V{q х,'O)Q` &)T!?%1p*<Sԫ%Z`Uqe$2Oz(y:98V:hPig*n){[i.DR;lv{ #*c.-pns(w"p ׭಍D5T{~'),E^F)8URϜS\UqDzAVR|ޠBe`UҡgڠFY]ho|9R'<~>~RDV;}n lJC0IvR}Po2sƪkņ 6X3}. (іCpcscu o2k={ ]1埂l5=oCаS5vcmS>OR-kH+1V4IO}? 7p(6 /sTssWIL֑UstXČ?a]$^/͋} @@=5.\JBU>:(>e>40}ǯ( {B fUo^u9/7Mcy#:eg;jbu9rӖ݆慔B>d ibhIxUJcI$u"uB-DkkߺmJڷsBPD&ԙ\yJ<W<WtCv p%iFʛ@%(bbQi^ AweB5`o;6cq,QBQsP cZ]]10zGS[uI뇄lޅ)?t-Q&cR|%]ƛ@K҂5_7J9}ZC5y%>de 6"$I1ft,.IWꃇ4Z %$8Q?zLRFjhe(Iڷj<d{gB/©W+ןoy-fw0DFLmhQpVtĕﶩZXT"iB4M9\]Qhg KpT3suY{/lLr<{ۅ9;5My0:c՟a.٢д,DJ4aٻ2G璧 v.l YLQ$f~R ̞Nֲy,ܱWs3ee x7LurHBAĕ^LQYr)+54h&Oi$VFϜ~n1%GMѭzbZ J"_̥h=O'N~e)U]uiו*%bxN9#ZU]e߸$,x!kd=/,iq`NcC@m$ c>'~5!"\2$d@fZבwC:HػEL}\="FXW5r_G-K93h&˒*P>(耞}t_fΚ`U>q魯oAw;}ƈIJ sCV$~/J&Z 8 L#;a 2<@`Me^ehxdxC>%EҭՒbqhv->~T؏ :YH*U2'w,T;.狰 m#&)A'٭{G|>YSr*~F_Ln`PMt'V._wFѢ{Ӵ!(kd\eRWW^X>57e d>~BNh5%r)<,G- S2ub GGBـgqB%B!(2UB|P݆.i&:7X7:[/31z>"!x6Ky Pۙ}xd׀ʪP!Pp񀥙7B\tQlj$\;N+rDyzX7Tr0=p7C 8 VwTo,O$Q)icctwҧ[;azz7>x58Ao] NȌ6iWO+Qэz'Ҏ!Ct9lEMe$}UHETW\)E2Z DIimD4^mm,/>,̣LW'omhɧ{iIb ݓ]o4umj;^CeDt&x$T~1-EA1£kScz7ʚ]{SaPYǩdKa U0W1Q% RZa%iH!`V=y w ť7lc٣|ޘbMaZ4*MZS֮,h=j.P1bE)T8!0 -A/'`,ջJ~ac; 'z_|ݧ̒8\]U=gQܡ9F:yyz- B-7'v1Jɛ{jfP>4c9_ZoH9zӜMpX,'7]5N*2[MtQ\y \ l!kWt%mcykL#~Z*۲qRwS` YPgҢ=+fqZ{%ofGd-k4(:KZ;8#o6dg(գgQ>}Ղc!d"˃7Z& 1ee!6S /hiHXxD7d}/4zahC3Uh*׀EPEDReV'Y>'ӻy~%mVIVkR֗EPT| ߍ wmƣ}npz3MWl}Uljϳunj*GQ@E*=4M:қ %"A@iRwFлJG@wg3-;*\@)c:1_`ffWImرǶ-چT',OnY>Ly1 '( wS,/Z+ BGŻ3Dbt;#*kpcxy=Ec=3?ԁWjXbl~bI ~Ku-+r" -Kj->T_,rz>hU Ŝݐ[#xr.WǽpfN^'  >R\Ü ×!l*LWî )xF c2݊5 r7}9һ=jv3ٍC* ۚ73sӞٔ]9JV>3gdFRB%jDho6 VvBjj:&ع''H5eΤ<!Z_Ui*1*5#㆐⓭^78Qd=jn8a-ɇy$eǡ}{qy:!HvdJίArRr-cqǗtRZ͟J9J|P[뉭Q_>d#l*BO LG]Jz9BdO>-*r)a_0.s=.ގADug;z[Zr$}ZUnr.GZʿqڈ V[T*:ްc [kZ_7K\2u| U/:<0^=OD̗DL̋`H_}Őh ɾ:?͹4 2<9`+-nXk⑵xnf|| Iڴ\ڲ=:=]7M`6cԫ꽞)NoFu 5PiC Qq &Hm%)ʡ7{2M9:cٖ7^6v mlf%Q\J0Cqt|`3.Bzٱ]ljv:8#$uL;x'c#Jz#x,9#e(Q$@Kf?{1VK%jTWi5kҏG6YXK[q6'85rI%̛E*m6Nj c!YlؼzP*u~#*>EުZ 0gx'|>.pipYe?Cr-/galo&(Ocsunv)ĝ6*@$ kxr4{>;o|Cpqn&eJc.vŲ(Jf_-.gAUI ?.l ˪|E_10Ux'OD\!I"4̍01 s.b9~\ZڄIYuBr! :U꼇/=4@}'A^XCڏ0AZ ~I.[<%vq㸻K%ll>G^`";TÈ5{Q/X55(^^y-&Yl^,\K 7ke((s'kc-$T (]7]Nf]kL:=I&d#m4$kD_>nnyZ^!ƮbRbh¿Rfec{c .7 veO ^  ~w**Xiĵ]̶J,ߕB[ƀF`T4R~\ŵm~x9,я=Γ/xtKҷʠtпЗa|d nST( ܫ!oyyAꏜE0VKi)ۘczTn&d1:]_T:|t%3:2Kg˙娢KI:sB 62[1&@u%?I2,T`ȵc'ΗDQ SŶp[x֓}W+UFw 6Nyʆ=[眛Jn2jb=x/'~[ŝseEgެ&-&VKb)H鲐h@Wy|^5,F%ZG3cQWU"e D?FKƤ/*3=PRޜ 8gyKT*%Q$ͽnAV|#C/su= ;BCf_SoExz$(^e-g ŵ?Tcr4MƓ }Iu#N<YHTϓ`*CCh$8 aC *:ngh6d Y,(dqI!`{%߈ЧZ5aZ 1IY?BUJG33ۼO/K8(aJnrCͷ`W Th[O쩵J⏚yL:oCHvZM>4u {I#v/QT)֥%?Ђ_ی5M\<}4qzmbpM Ң3R׃8An=D;fOMnu עs 0 Ͽ"7~;ص#V a0d9]V "g9ۉ l7u]ٴq{=b"fU 03zĩixbN6bAgIrO픾Im2aY$86Vݥ1=0{rP S~.-Xw7Lauz`1K'I )c/sR*I,~EKRFWtqVΗfa#B's_c#M}b:7 Qٯ"@mzjA)8~_畷2OK7'KKvS }xEkRA8TIb_N[ic~JFDQ,@<,V">IK=iH+JMg'zT8[I a&fd..&@v\P -Mз.M2Kf.Eݎ,:?8|kTÕz}>pj eZл>G7qÜ^Ynk _j2^g+E|Ʒ=|ՇrЎqy5k%m ~+{|s!q .5^Ԃ\*6_vaZ`iU;*DAE z!^FĒ/vL҃wQ @p v}Cud:hM"ZT}OJy֑sDal! 9%6[mvs^ۀ!kеXbY̗Г;- 5qܶesⴋ)pkOS@ҫ{#UL?ڊXִypn6!~t"= boƁlws4Jw; ;鄸\PE%k # f J_,^_"FOeZR? 2T /<~=gd91 MgKŧofoTGz\ed'oIuyUm=|dKϛ:.'!MmXq\kOsھJdo=^#xA(hq.$?K]wD||*ӧ7*_nMHY3\bMs_^YE ;QV5?x|WrM=hIC˂qvLD74d)(յ8#o ~] - ,غ֤}WܐH b: ΎǑg|񱬔O ędӾ2mi>mvU՝Ub-qk: K!=zeROΎP3G߂J*$R(N6a"w6 mXh#<1Fr7z=$>WF3lR׾w0|ݘ`=:]⫯2틕" vyJ 2*~/[<JVleҾxΌF@{eYimuk?횤 )W CG6j)=6HxNMTmlL|o\+TLOJ_q!d@=,} *$DZSvβj,fБ0`_AZXu)'e엇wVG7$!1YTdu?W8,'zck20!Mwua+mLk*u)Y9*wY6\LM˒ݎ)1 %DbO_\Zp7}zM(`Xʸg-CDݑrLcvjQĂ5V3b7:Oa^rQdg3ؗ@\zsx0:c-6Hqa9--HPb=S$JembhV<40e-8>ka9>ڤITٯ$:z\8ƘYZ-S !YIyT*rtDVwͼh2@7" U5f7ڿ/u?^?PȊ|H|wb+ɏ8a_@_O1 =j2ҝ(Ny) (Z'Y_+L];s6o;B^} ],cJ~*An%RhSh~}dP_ŏb2LB)gi3^S?:3|)xRf禅f8ͼdMNRuMDjZ0Tp2MFK҅'Fl,c:`5  #|CJ8svdF^и{ՠ%GAy!*r\&R#y15Vq}%f@Fvx^9V86DL,׷eÙe-P_o&99/F-[Sg"(1+tT2+8Uu+R]"^!fmLJXҤ|˲S,it!h'!h?5zmܷ]`cLaT& ĴH" Э',h߹K!쮞wu&=(K~I06 ˯*؉ݡAeG2 Q7m ٩x޸/Uifpq GW0 al!d{~ ėjEI2PާevDZ@TwnT&LpTQ060eF'L7ȴKVĵEN9@Q. 1tk@mx{ue/6ʣ(SI&I+8>pBUVȃ~eC#ץ왔p"v-JQpt"C)^bN.Ů`CIR=^^*hmK "odzu27.fjbd#p5_Ҹfj(4kD:8\I} LmD†~LW;(׿Vt!]r?@.I!~|<3cIkVAl]3/,ҪzQpGZK|+E^n-MCI\up<[G8ByM[/o=_P x7|Xɉ΋kb +B+fݼ!FlދZ z S=;s⪛ PtFw,oa6~ nS,0j:~#/덐ؙGd Ge&"גb=glGFQ[7̙]R4Ԋ6JiIVf8J$3,08A\eiϫD1H=G|`Yu{xB'o2"7OAPpa&hD 0Dcx}*Fi:6WGj2x:MgA3<מDr#ƹ=D]>8ڌ4]Pn\XJA[2u** u.þY1Եs>۲s ҨL%g?i$w?6Wo0Yz !_cN}BV bN͌OĤt툵BeN7Z!7_-P Zxde֨\;i⻖n3cR IgP LVcV#Y%nZY?&DZu-IE} Yh{wU tU1ë_AEPgכa&Xi uMuD#CkH.kR4oΒD>brvI||)(xnyvE[孆揨ㅂ.UB \y5>)8 rҔmKKפ޷2~;s ]@QQA."#AMw֕$v l?͹Ò5[d>@hOŶnp7aEhOa[H7N;T/.f _0#!wxDLYkAgR2NsD5DSES LupVO$*xqZf!$r勏lxjUw4SW#qR+Pϊr7i ^)j?u@06a$ۧⵒLY`+I^;o0DFuVkTXb2w)^$`Z*{jbE iy ]y&jw}=OГ$F(Gީ0ѩ(3Jw63KvZspȽ{C {2{_l ?}V;´sDոoh!P:g()B1x 12 \WGQ(a#{wyԤ[w#ת0!']$ZC3|8ղNy!w",^$ J:s2FWhu< 81U<~7tF4Qե))q<81f#Yl¶+a+.|3 >~2\X Cк/ȡ,oV*,RYףLYWf|RM(0k#FAsOHCUbR"]aӺ;i+ ܢ։>eX$cg\~sHd-o?yR@62 MLF5}/oLXqDrxR'm69-y*֕2>,6~0Y}K٬S(gHϺ/M.s\D ij:KW ^=j֭I|(oVbUL`nH5[n B#㧍FOeg[G462)WIȲAi P ޘ)P4&'piQ]O[&3vN/z?eM82{FcA2r}_6r ]wYw7߱U73xj6?$= [50v!fʱLvz'Xec$ *C2mfuȝ..jKJF t6Ȋ|+Z{:]tZgɧ>l& #U8Ƌo炭@;[f^N?j"҂Uf5Wt#K(ʸ$ iQ& .>! 'SA'9&Pi׼F^~x#lr~i> i'|$o6cN[}1 ﷬W 5rVnWrw"փ`XZMF n)x]t0{̾[͵`'jc Be o-݋bL7aӦx(f)Y֛I3Ek"u|~sܹڿ~,twޘw+W 7^xvW>)6r(S!OT@قj1ehGg@"5* GZN/Ҹ(3%G U F$Eb5<U#Ea}b,k`Qj6-aIS١[ Jſ xra]ɰ_,&XTrcWJVGz=V)Jr^=!2?"\or[a?:UKu9/XFہ_t\f싕Yxl?>lSRŗjq92P o`$ێkA5F.cA^Dyz$5\4M8-Iҗ&'uJ`: bE&&X15Rpxyddvf#G 'BA;I~1GFQ%,I@xEZD02Vf\m: ?Rv谺zbht@Qv<] uE$ZRßk]-J,7exÄ$fNyF(kp %RLDgl3-6OقL#%tͲԱZ%YڇϗLPv >V8R(E=.Q̛J$_^\CpT9* l5|\hxw1 T,̌>ji0=|vLũʝT.kSN_HviYUt2־w5?/l }ji[x(zoԛw\J~ű?BR2(|zqwq S>(?xG@V<y&M$La@i&ɗɐ/0o13:M>R޿rʎiWi}hi~S , o,TN,7s%sk6ѻwl8 k}=˗7tFaga'] AYt,Z>1/;KEyB+*) ) qږ)HϞlp7H#kYQ @|U-*|d%vf9Ovq3 ؆d.ʺVf;Dl)*j:9Ësu\;!02)3ݽn|5-\67)e^zp [\'Em=}NI\IPƒ"tez fl,s%߲; +y&֌;5(Xk?wa]t:H<ʢ*W`>[xxN8_V(Id<&[:lC/n[[ft(Ďx!fqWJA%EM6ׂ (jҏDlK"iBrg峡 7_`N!պ02Vt?p馬&%J |UPCzctaٞGڨ,8P*A4#7Z>JjNqb*V$B }N\IHtZH1^E?`ۤuw}&;TeZ [̿`*J@%4{e7箏1#6yଳopo+$S@]jM=8=N$<Ө6ukU;c|"guL\+DusZ 0ao<7ɠ!=?U>/Nmhg>Wsw 1p).Z!':;0mbtA~PTA?o86ǏN܇h!]M'/J {l glЦk?Jv~⍆յC6^;{Wm=<׹:N“Wq" Һ 6_/Zac|fF'3J}v=(?5_CE}e%$JpDzC$&[JS+U.q)j$sރ[ NN]0ȻXPg=5ĥ&u=ګM2ϓ3ÿ, $qo_,kCYݐ-R;D0PP܃ʮvM lߏ]񤊨)J:p{QkqCAR'vo@Lf c]cE~؜uCb -_=ۢsMsx; )|r>cmi rnء7.@;ۈX9 68?_=HW)z_vImKŏK^m;8=![u윜lchOmա7x <ʡï+@Iaa=*mLŻA?XM,i -x5}E4u2p|XP* YKHٵq*bu.:?k іLKscv' <:M&(R=E$uWj*D"z22?485YF{keA/V1-: W$LQpXECzd|c.6 nAD dJMDXHR t?iD́ odTVE2認A3$6eelT09uw#\171b&eWyalto,5}<\cXVR'LYK2&YȲK,^!s\<9(5>`>F0 fcS9zkJ͟X@ )3%z,HaH1 jf.NUeV['`fke >~T8~WF˔tK,8N"3 >>"n.6cj}Vq>/s!"֦gk%Jd !=dB<ar_/!vO,orF5s|hߒ|su)ż H7UH@8H5d 5:1~ (Wݵ(=WCrHX䱄+yE"4NG<-!BT6%LvIcs399A_qJ \790rD;pjnYA0 #BX#2Bd@o"F#Z{!7{3qRTfcYTi٘bp |AtYd|E&bЯ+`h?3HEMt2pAo)Znaޯ9zkbT^&?;"#}v?d!ߩ?rt/# ya*Rb~l]`F5#bZ+) {r =P7aP1OK`ȇ% #{ "9ʵ]MaF6|PѵyWKwsWK>e?7{OlFaXaQ"Im? 0BOЬSnE7м0>L߿=xi?>c=h|)NM7̣s6`b]"#O +$˻+z̓~1-)R36Ls^A,դ4|C)i#!x’o}WWb[5;arɖ%{ f,;ۀ ocJ"Q&Z`#'Y\HK{F- W!AeB1ew_2,ӷt> ?eTA@HߙCݻ /,_Q81yF8D;O]ql ba`ٛ%+dxxUkc|  >rDJgtREIx]VӋl\^!zD"Zd WEPO A>4TjUPQO kd :<#\ڨ(fu~Թn9]z e|E2`bs#b6E`>cLARU<ND_vU7Q'f%nz {eU:X;73%ȧĉNN8שUvت.}O`]U?W\  UK[s$=ñ܀ן+x¤\fvĢ[SCvdGq(s`b_fWs ŌT[Rnjiw'}@Q:w$Y˪x ~Ii@\dgZBYA:piVr}>$"jdH}j~4)Giv37,5~:R%s*)(5*-09~z_9c9NTEjl*xk)3Q=j'YF},mzXT-HCun`8pLV 1Du#NY ߳օgUs d4|KV~Bϑ]O듉qIQ"/%ZNs `wt0BZkG$:EMBN%zQjH';V+50j?S* "?:xU߭Ӆ."nѝ$|G2/Đd@ȯ- *#V ^/}H ,j Uoav4UrLCBaZ 7s=t{eŲORX#Ȭ^u4^uKk3 JoA8i3nK_S> >n4iF;mwc*!.>nXc'9 > G;$˩޶W%3&r"?g8bRBūFвfCɉOն.^Ӈ#JQ iґaS!(Mq\|pBqM7yų*Hd} % 5'R:q@jj[\]FꦺXr3Pbkbގ4Bdhm96qbFزFBV:W6K)E 6dܡ?e^fxF]'Ed)#ƗgZAG]da4.:Q71,ߵr]zP;Ş]s^[t@3LbUɻ[Q DfPЎҬd٠QU@u= ȜKƚV'7 'bmɁ,FHC8wn>H9~Y,O֧]mg لp#8Bt_G:q-uSk7tZ$Uhpf`mU~z0c銩+,~=r`:ex9Yc1fvUtes{ =uZYY5-S E/d)aR \(TjLyY̥ t }d.:^RbB@9FiMOoD7\E\FtrbbClvfU%>orS9Q!ӍwIjfDMLp# IfS 3 >!Fg8]k}:/.{R@]k=sC )vPQ))9iv5HHps /X- }E21_|.󩲥Y-Y` aD5Gn< {R7h:ZvTeZi-G:lϠ#0(ŵpk`ݨ jɾ0P]KTGXF;58F;5 YݤFƘ޲Nã-oӚn?G=;e$ԍiyfΟ& L.|A26hryƛ_{dl4 ̈́2u9k>un*/|Uoi+cn?[5L}_/|fe-?Ȯ`!)>R[%_S НxU6pgj'{4iː7*|X+wWIy: (|%֨m1DDY5px/-fe2Ŷ_5hYѫ'mN_ 8JO, +>JsTKZ #JW&>@ i:AK`[:ۓCx&k^"nّ~\1N;/PLsmNi#x1*3PG:e,ߎ">Tv #[%ErmM"ϥ%&WЮsloF^y†0jM kf>`!Oq0Q/a\{XOY5~ƺoI RiitꩅFMEj[>䮔02r{sti )?^oo,*+SCHMBm\!h`7J8In]fAQ%ՉAo~?ܼRԐHֱ[:cZ;[Y)Ȅ Z1|M) XY6?:hqYj⼿ wl~v1w/VXc~mZ W8|thw1WB`map epu?hah2SDF}Yw*!CH<<Ӣ#qKq@=*xࡴ_,/}|!Ma6Ű`k9إ-JdrҼE@,Jbϵ.umT?2 5XPz.cqw6m[RE;quv={-uG],(-ϓ$ Y|i\p˂t:Y趪GCQp)Y J~ ي |OՋeo_8j\V#ԊK\Н#Co2%mĮA-,8[enÔOn:]}ajhI{TG"S9õ󡡢Gde_~s^ȋ{5~qjzUt t2h'»HDwC? ~mc:RT֎)e?Ovl/|!ᑳ (#U^k?z)Һ9~K7"ؕr d ǯrT##@y6dɺ: @k'TnҼ0̓{ tg4UG]|Z>e?ޔzsP>Z:u8·oVaPj߃>˅a&s;/k1΅8<5[g壙UIq%7 ?+ RH$K}ڇp~ n>&WœX-m&C e/!h#iMBZo5[8>a&%ï>4>E>^.P.Z. ۈ d!ٯwqN%:2q!5O[,եZ]˶}Z̹u_{a L9֨ODZL2rM j<61{ . 12:C@?2 nr)==BZ|'\3/ ڑ۝b@HxkVg6Xya`}`kyfx/hl)y a{S$=O!q3dlThS#("&3G3 cuH`7`T'MnϨAf9h~4kS4^_D{aC;ZwECޥiUK H#Sjtl$+Ɯ8idWf1'Ӹ5>D;U&0e/ %Ƒ3uwXn1bnf26PJ8-?WgaA_2op%HB4"]@v[n7SA["|=r*.5V"˨=Z&Y:Et ]%~5'yKI.KtdwkW>!=CM}EuKN](nvjx'"{y JO<҂֊%eƃsrb"_\\Ufp N`P#a( |ʆV^$O۞麈k6יm<\}kDjG%u#B[ GI9G2z9>]pu?#vh_ꟈam~qd0P 6b[ר![`Qz&Iprj޾4 Gtfýgdw w#Tn[#(Ii #uLp +_lI椓áR kÊ8=>rHyv=FnWWvkQ4? 0>MU5ZglFLOќ'O6|Bbk%TnRKУg1k7wwkÞKQ\0Θ=2~;ԼKӄ棡@T"ɤKwo?O.Pnv 7t8Wsvix$HqL3eNy5tt&I9ҍd üxJȚЎ~ɑJ"e^X9zY nCF?Y^}RT^-B^MU.N`:\$M5xj ~/@+ 2r+'Uη~qqt] 0|ihGIģuD4<1~u펏;T`7SRw|ZueY h$N'$roP2l6Ŝܵq Ţ㟣1֍1M1k&Zkq>Œ=5ES_w^R`za?d@_LUс?TiC/ɴl­5_k{ |+.^T]w"x'O&?l `mvtF}cʩsQkouYځWɎ>P>SZ~{4o1:A씣8'06Ʒ2p Zɋ@X`Ǹ*C˭uilD*XEZ1BD0$2w(xтmkRSFaS]y{0ksڊөM`uH(E_ϪDA@<ð"+b2Zv`OkxiiTUUUaQ,?|7ҫZJ{&dwY8WŚ[qIF-LzuUbXn(;F o d:ZåƠBxi&I[X Li-jSY~ a4e&*P464A-*1.M @xIoVTKזbߌ+o, ܯ6Ա}`+syK&9e>K*aߞ18{T>3ԛ!vݨ5V5<,͐ȲC5nŤD8!pyq>]qk#S4'X1l1x2$'nk;/R\JᄯV+nTGiY9pG) y%/OSbPDTh6';:BW;9Q'W"وSX2Øu]\V^E4fQ=+^ʹ'U&YVAߣGrst"0}|gX=[hD_PDl][goLkt'<lvhyiDgLm%:{Xe ' ?uf(O25qd8k^QiGƺw@};[+i{$z T*[ӹsd@o${upĽl\TlS< h^1՘#u-2݊H݌[ܞ@n:>\/j7' _ צimy Ʌ7-x:ߞO9Y,d BL!y;;WCa1ʵT5@Bvaan&Z6FW2ԑC*Au';%+֜g kDeDJB|Q ,5UHD37~P2Y\ 9Z#[[ >M]Ke-udK]3s>%IoM<",J cmh̪{ȃ+Dq;tbv+ؾpOۤݪ:;rlMn9}6Y2G3߿ʦX"17{ zY4@$Wl qa{ Y}ky //+՘FR{WvBS7s&{Ic,@=ӟ# nzXm`^Qԕ ӧՏhV)̢_]'w,7I2vi`6caJ$Xh *D y`h:3;`%!yӝ@v57)[cw]}gڿeO֟įguYiX2|%zm[3KKF`njsKv>y]g+e:K;*o1U#l=#GB=gQ (*-mjl+EI? AˤNYӤ-b]V)M h%uB 탐rYcn7%уL] -dMϴht5UǏO9IB \7"+'ڋ>\YaÙtφs(cITs?Ts|!QΚ3Vh"ova]#'𺏉Gz!Wz1r HqP3^y ??rE)š!:n:s:$b)u=7a ob\O%I(;p;*pw#>)5Z?@u7ʤ]9]w1fӝV ;HʭORyWpiFD2T脹*-))MfgE  ܇l(, Mga{tnrX@Tv8nCf&2 #*@*T^!$E=kiVT^ҊHi YO?bg"x?x2l#ie=QEAՅ5.;ҧcEL¥wC}[(Z؍.NncQ;U{$nÜ)˿|߸x {Ygy#o&S>orZE&?⛴| cWJVuvQ{ЋZN+!ĐuW,oޮkR/?,24DYĒ~ˀPC=ٛ+|EUzMF p Bh`mUt$Eom"0Y{O0tYZ"6&O5gfC2_ 녝-^R+.ݏ:BJnZYs&O|w61$RpJ064=༥,''¶J6ٲ nWy4O}{ɓ(S$60ݕY\TO}Pb8iV|=x8l69sTv k&v֪x"Fv>д0ZK Ӟ_ ۇ&hN]Ȧt؞iJd^+aR\}O %'xvZξšh(ř^,̊߻yI5kLK'R1 JD!Ӭw0Bh7 Y갯d撄'jb'p"E-EiFKɃKP3v‡M#+s?S('99Bb7ڢj31`ظ3A9}ʳݺ;:)'0ם7B0נrgbWLNݚ:~!5_i40Až۬n'pF=[UX:Zys*!H3 Ӈ1ͰwgM oi4] zAT#(+)ev今 91WpCN0(rlMw_qbwܯji2{454D\>%vV؈gH2%F?dz4Z .SفC^ (jQnTzc^ %suVΚ Œ>(r17 z\0GJoVQ4+ZӦ0Ƀ ,S`#!0c߶Es\b_@ٱsr`7fPV+3»e^ \Bߟ(2&s {dc#5oNH>_ákK3EIF7Ӊl 8"΃9_\/a:z<{xc%թg!ɴOٜ&_CկGW=ۑ ԗ![` /W :L;9rHwX@iH-:ߎ]QJ)Lb{:# iQC]nѹ.a?|J~eQO $K~ÄjFokZAET5Wius`Wxji;Ȣu+CZ$gqI2j\BE("qvI@>Ad7Bx_ӏeJj^pul⯘]58niy:=wU}ba1E5yN \4/!' k7|s>ŏ̪@ qdl4v"]]Q;\}̫Uϯu3EuWKVCI ;- qUdŃfJ[=נ?Txx l4H&|=q-L! [jֆQ>:o~Ӱ/ (B׺cx.."vhmsӏU .`Eic(q$ aW|s&ܿ>)o╔vt?- 0#lƙ'k-5f߷@uʹx1v8 $YںkDC|8(CFULҕ@ `xkW {% )c@_9A:쿘ydo)F t ~xyM*:+Fދ4=֙]0=cI)K*H9ϗncB3c }%`yi-N8CBsD$E+Vqd -U&fW-/6e<*0K+]-͕|"zyL0ūkṰ u_=񢮣; m0q! \ʕT$Ag_=8 9=s1u)jkD?O]vo5 ` ?QqvB]͛pI;!| j@Ҝ6dYg0?e!NrcYtrCߑ?y'FKs1B%R84H6iBCRPAL hrоZ \}II p;4ZWG yDg)ݥۤB`ċ_"|nfusZn o” W/=9r_^Fz_<6Qn4㺩Y~#h017;좢weDl7vODG{/ꓮYS$:c#r{뾉3'v~b"Z\JGVlvi.\V*M_?HSr㼶.<: ٧<↟?$6VoUpZ:HoTIm\7_b\LE9-^0]Һ"G3;%cb#' S{ G͋EPƜ;=4+,"fYg&7Uh̢sv Dޞ<&ލ:˭$\x\zFrŖ-wIS9|1fxr 3=MՋ[ݗaT?iO?lϿƞKlm >`/Gs:?u6H`QpE,r/AwRo5+.]Xͱe cfw¹o[w6?^ٝNh/`_ꧤ+(9a\˱Y3q(}ő.=ry%CtG'a9bO ٭&ە`Hˇܿ ccfKf4Q /m/S#E:"=+II}객xWa Nʞ.oHNo矎.[>>I%sKGF/,}/WNASZ]S'nMőZCD11>\./>\|p%t~"nVSS Ĉz;;NTg߻A,GZ~XOW"DKy# f"doBMbo޾yAlO߰_;7)T.T#UOexwjȫ4U8Xz\jb֫ՓSNHNe{螲;CwEei D3[7-v /ǰگ=c9y8!L@/8E3~$qZhUzەcGӷK3mZؔ˓wA+Վ;Eu[[->xJ4 jWB#^&aT%bj咓͗Ӗޱ n1r,@K=/PFj!~%ׂUHxt?gLf4XP 5 3z5+eRIVx8\cQ1+Y~mu{u^&#iS`M8資>b Q}⑹[%ףgcb)FH,4Rg4E+uJBoꍆ]p|~swF@Ivi%' EV>1_)f¹`HAbZSXGRf/+;^>ƞ]ɱ͜{?i=7&Hh'N^sވwڎajYUՍ63}xgۘ~RC #Il)ĞeeĠ"㲗JnOh˞v+Eom2?g}W-c: ci {k&Osa4h|')[xos)_x,r_,ƚoWKկ~3}D>7DU%6oFyw ^uYI'~4ocfih*-P=' kDOKn/ Ȥ W[]i6{{ ¶ݶm۶m۶ݶm۶m۶9ygbefT\"m%l)LLz\5^nʑY=]S嫄=Ŭ(M ì'YnMJgp#6I< $I5+%$ΥM ZK ͬ m.oU5kUB=sU.XB8ʌ.˜+*`.u|Ճ +gH0kA Q -nŕ/+~%gU.r?]C:Ư 'i1.^:p.R[ F Y FAYpGOuץbؤgO>=5KǢ>7WpNM*[_l>RBC?@0쀞LO}AXԁKzY8@C }&´9o{fBY դP;Ml/ӆ<3*B[Mli=S 0Ą¤ġ@ۉ; %a` i 2Gg#߈3tg"E'eƋBg]R8d#$FF$ky_D GYLaqc(L =}Gs/Ϗ`:Y1b8aGS,f3^70EyhM B# }HǭClZˤ  IIX <^a XB j#mf, f1d@?C|e $MGTh)'H )'ZdOK1qpl9)ok&[G-hQm1vE^;3ࢯ2) +G)< (aZ$ K~ dCeTDڇs.*R4,(6r2]w8C}5B,4Piip6|)q҂иVCrB:ȅe3zmoe9DAjɉ`z#,Fәh|V.!K̡Nc)\6P6>8`Y%qJU4S?sV̾tۘU>rrjFUp*=e9ChPy~qN݆p(-#m/@; 6 U(Y׵Bq fhM٥{!PEOQCs4^3VX<ɪҮ3ҝYCP:ZuV~2&d-s#̖^oYȵ%u0 eRUgZ(^cya+rñ?ـt9g|_ 暏|~)EUgvw@YwFu!wa7n%wmu#UjRdQAɣ2؁(Aܜ}+! E|7-$k|_w({{j[9^7%Eͪa43M@F]ԝqk4g!mu P;I%ޣz٥\{42^[_ 3ַ]߶;i;hƗEʵ׷lT,|,g2%#.б%qF@;HcJUma~0f\J6LHf\D Lf\Lfzo5LE-Mp>i9SM[) at[HCa(LJ i #Ўi7݁8sEt=}Gd~0BABX߸0^8!h;2A7V?YSDw܈*F 핫87knh7LE\`n7Ms=ZXnugѸKZ/}`J{pУO[Yz@:rB^=d/ rOf^rK1.rK*NrQ(^ PjY7"tзMQ/v t^?tKBJtbn9`" vDYh" vj = 2l' @x?DlT^5mlj1Ϧr.vϦ; jͱ$̐ 1^ e)v"Lep>gpF/o黡p4Tp;bJ6X2T[DX+K4#Rp"t$3y׈BУFFsc ں(3QzUt>Vh"=SW;> @>tt txJzQF0$Ĭ)6O+/Q(3wH#AaZՇgH޵첰FI[)m$1>i$ęmr [0Yx%Shr Q lI0Ϻ,᛹}51[8,]HW9ׄcbWH;YÇŅk%% Y ^爉Zˀ$ud%o3JӀN5n<|A0`KvУV+[ZW9aJ "p 3x3=5zs_}pC71Jm/ $d')!<r' i2c=)gFi+3(%jKVw4>I3ސ>2/3RxHlPAK !cՑ[)WE"g 9_0Cw\a0D8(ԻHޟ}яpcLTIr'c*S/*JLHxQ3^R*H`X;PDc -uW[lqf\ZDyCi8<ڳ˜ɦ :pcoS {fWp]<38g}YdIZ ƳF7%ԛg=|pc.sR& z#+![!3=:Xϒ͓4/GQ&^d<͗ŘUcbEKsetƊn3gLa 2p_Z{AZڗ9CۢCPq\S5,X~?LhTInFQc82Ťm3< +v2tb\1fzsƘ,?QcǮ{WcS Az`>k1:+6q/Xn]&3+",c|}<>₴O~gM:DzjH$+1$6tDj2 3M#G(lʘ(C`MfĝDl|s(ɝKər^!~coHs|0Hћ.z>a -!Oi+TZ7|*gpC602DoF)rА9W4$Wl&'b+W}]ܝ+qŬ!m;|%#ĩ>#4Yn>[iYбH15wˌSL؞ȓ]Uʴ,hUjMUӿ#ˤ`dje6we;>9>]>-9sds$``:#[+؟.<+|, io ]@Ĉ8ĴڟIgJ.H]!dF[ޘizE7kX>0h}`hg=D6KLÀu(Q=^^n0ƚHN4y4$b"BglƒBD_.$ЇM}xZݕ2/8} ;1Lil5b6ob٠!=m;`}bnCJ0ybCKy:M"k1nNu`p:3Xk2%[}HaK:S:m{:s:r݋?鏦_=GniDVZȐFQ*ԘUs\aT^lp[ -` u`϶zcg0tl;]H}pdfKXZb$yO+x=]dt'i!fыBI"s~IF*m? v{Ke g ;TF"rW)͎TE ƒuARs 7Pj#Fo{WFW=mэF5 Ǘf=YcbZ1+9Vҫ3GjCGo5}?Qk ]k7P{()rửosd?MBcLZH35JM+aA`a&M`ќC۳Ǝ#hSqr&<ڵ"µn_hS z| yIvKH^+η*ٴsUb5DN*׺QDTQs ,1]ԘlX:]XrUL-bjM|4}F̎ep@ZQbKh7$s gaZ5?[Y/1I3u36EAm\ ݺ+:W=ٓPO4ъFZPVv@آ~Īgk4OQE #LYk%8*b0+5h""~C9p`@N2h8󉲈eQݛ<\MWzh΅*]xZۓuFƂu'G՟UCbOߍzϵiHVXfIN%eA$YAb=KG&1k\ um(9D[`C|3{E{e;d+u;Ŧqsr6=5-3P3=Y5#}ZFe-jcLWa@Y`{J+bvMj@gu$n")!O!$՞0Q؃M%r,@zE$W~:ru8Sv;|U(n[bޕV}4!򭞽6{A3I~I5#zXU\o)^_a0RN_L -o?jZׇwL8ZP-VH8{ht8T7c~o0f6~9-$19@쎑3vHZ',V_ N̽!I2#JA,剼3Q%.H>ֆ#'؝88(tuq5*t4m)mbpވ;$۬GvмWx t-0C9*K*bwM5ϴMWo_Mx`a眢k&qka6{lG%L5ZEݙ0&)]=D׋x IlH 3t 4kn?= ~h_.9YR.;jU{-1k3N3+h0G9#:Tpt9ՄCWC3j)oQe0bӱM0k3#-c?r}x{x;grcCp|3t|۰pC;}2#Jiz&Yvuh<ŭ 7Zn;%Yv5X{l ~ ]_38\{/8PdSc9:^Pk\%QeGm82H#l\{a'\;4<1׊CZ΢UANІ7F=\$WH^/ $e\z WR +B*|g%&#Djc# C%˦Rn Ey$!ٰFIYr2YsY tS]P2%veY(^if5/F^|*+A=+=) ==Vo==*KF=޻dW۝AkIZ "So+b +;= +lmPx/!E(;_ΗWɨ֩ĵc." :n"_T.:}{%[[ {ZS|K i2t@aԅ=~yh2}M?@ ?[I诒`pZȌ/Y05(ɮRf R;ϕLƽs: զt71|4{{b$ֻnSI6ts[ے{ lzqNԉ՝ژE\NFhi|2l?Gk~ Y+JyiR{60 ZdayDŽvM#$ו8Zf~<(R9/EYN#RNgikL\-F lNԞuX1eX1UI/Oɹ]5ϴJܦivs #I\$t]S>jY5fԙRb7U+a%7ֳ~ƾ-e ,swDk7e<"B1ٱ=F]孫d^&/y;g"ͮy%ݏל)ӦC"=&&%{Y:f DZ!2G8[Ll×ݧ##0ڒinS3Вg6ftZc~* RڎFdyH6 e7acU6)ZEoNfPl$BP"_eJggFe͟X27$2LIwJy`61ݺs Pr'Є.&<.69]QʔDZs\k.dNU%Iۍ3qY FC. ٺ֖% g/a&rӝN#ו&KM,}觊GΫ.) j+dL!&X)u7s 1f*Z_{?"fpns沞[#w Něxo@x:GnsÓ/8һu,ke̵`M5$e}ϙD,2emʕ+WXV18 B!g1*L\v2Q,mz3d6"蛜/!׬%su fL )ͫ @e&ᦌ՟6Ah9{v1v4OSYAwV:Z[cNUI]< e՜_TS]oJ/d0sc 9xlK8f wa%k*A[݆ͮC9Vklj&`"#lpUac! +WW6) v 䵔SJډNl8Ws>4̝mުK`<DKTL70 3b{ =_f+^Ϟ"I3@O.񎽧Y_ -⏜w_O͒]^k=[ %/<%שFѫBBX[5@ᣋ0:֜ŞӧSW0]_3*QK)JO-!WMUFn bGEH^:$W3+V]Vj@+cs#dҴVx^6&YzW&&MXph/;u7ӵ:,i=~vС 黍yIi PuIFy=NrGCu}ꭃDG8##X_:dF#J7!j8OT8J8-Pl$qҔrqAk٥@>"2ӬXji.mh]\sIb`5bAfj=t,U%iQ\]d 䗠$l &6PP`h-{Yα ?1.W(ek\(KN]MIjxoǵw^ߗU%`b T4>2쒭4,9}km ]pQ Z'߹8etl[wM * wwҪx#DKn~Z[]k29|Ƣ7c!UiN>E}IF*t9!e욳ajr<&xD T9p1(_!,=v%4+Ȟ:Y7XܴqkAgKGhnGK56׌zp1ΙXVz)hE/Yuxg?Eޟ&FM y;`S!?{>8e)9p!C ̍|0A =,K9Rpނ<=I>ԝۣٽ;Cf=~]J1 h1~y:r8l&ݣt;+~[*[%N|v=Cq?gm-{zٯ2q?ޙ^f?3$ٚ8<+pS5r!FP]ظx2v3z`H{w%")hR ) 9->f=#h⊎>xwUT( `J[1 X23O-Ҝ$!Շ:IyUDoa㛘tiV ]yCa}u19$3?5e0ށfb=x/*b{ [I`;So_SŹaCL71`GᣃA3v+jparg7'{7K[GPKG3vN ItP[zlv^c׽z`t5O3_n+5qRݾ볲kiD9:q߬O%gYfߙq{dbޖϣ ǫ?On8b~=_5_%{.o[ ў[`N'bӎp=LLd+YEǨ8ؚ]y>qv´LxM^to䘁oƉ̆⏁\d}K`柟?n ~ԧ)y*Q2 nA^(rgFX0E@?!cÚgɺ.ftUux0g+̵]z>=~=8;+JޙnfͿsIvEQkvAyNX͇/3Sded㙶M\dR8ypPxՙtlXv>Xl=R캶L~| (j0~,|0hNҟ:Bm=Vx}5'/w veC+Lڡ\zuC٬~l y=T-R#P*?o>_?u ݶDVft^hݱ =\V)eԄÿb5[\+&z 80WbxxbhɎt4ʬ {mKw R%so`xYOmM鹭 (l{^Uh>rYq|a陭U-|"';-P8Z8Tڨ =J}6Xܵ6̉uVrAy<m־긵Ե}JNdϷF <8n@^D{EiM.Ǡ'>OHut~͌HvL~i`ִbr̛C޷Dt:ο˜wl >B'6&2B,U~[@:tV~O?y*?'FԢ^VLTh1NmGLfqy h!T N,@^ejXG^^Nt;x+D޼#Y4v*rNztr W-$G9xs'GRwgh ]B}O8lPOgt>z^ ξn_=Dx݁90=gx۳`sɽ6&t->9ogl?}~] ؅3 Ƌݿ.ikcn~:IΟ q]>g }EpDɝ&3m`Oyٿzٳez<dCo>2nݧH΂m ƶQÚ-v'~<5AL}ɠ5O۟G+ 1<=$c߿O$8xz|8/X# G7;DH">WQG5Ӹk-DL3q2bF3_H}?>:kH+" %cNj={#s>xk;xnx𼥩(ӣz\E̬uv1ù@gDYt+TƋw/n؛]HҏrhMI\9t2𓓝F)Kl܃$t45xPN(rqeKX[-xvbh( m, > 1;ϥ?JL%l) hQ)eo O[O! 4iC#Jca؝LO_o#:u\;qi c5Bo\loyf_o4$̩ތ%=c9# =lFRYWJ8EͭҦ3]Ja2jBc\% A$ *3lPMRu1%jM҈*qE9fZ;-ml+VUJ_H3銞Dk KAomA(u-fBiP< pkf^f擈B-TA‰rt*:iQfMEtyt J\9 Az5o.٢GE: `;uLApg2.:}h]Z#;FbO>f!s鳳Ǜ`ݳ?&ZO Ї+^2{" #ӑ0E iv5O TPfBbyђ@ d\\{ClV:u!YELxQ-l 5}AWMTΚg[Q # ˭E XCvH0ZZ룆Nhԭ28Ce]Az#SNp k2_YDH-p&7玐l"hLLT[[/K명;qIct%RtRg?RVDFS<6(hk*hbO=>9 ]aa]$VEdhUĒ ̘TH4;pWt^1*ߥb(IDRU7 $dNS:;yd-Y%yɅv9 meˀLE22C՗X$ AN_!n5Fo /"[IP9Bb_m4/H3O{OSKA/~Dh@q<pq%}JeW2_[~re@јB_ '@E#g``vD0/JELT}4 vnqFPDofduZ`S_M} >B|8Lɘ$T$@b͈dY l1=vflDP b$~^xD iFJ+HbEC|r(VDj McxPl;mʔ=)( G0y*$mEaT#tcӪ+|sD }`kP,eMy$qu XcQx|a=X 5l5γ| f!Y$|p貔!r rF10W$%UŒ;‰tj" cT%PChJ Q tʏC,B"gV)E%c3{s*Ɠg*&@\6-o !]ȡ4yܭJךU1R Bb+&pk+[QG X` ^(h'lϾ43T%4y,R$ũ,w4w4C~(Rk e& /e&,ӤƉ\Xʜǿ`ڌb*iֈUST4X e`qup +wIDk\ +&\|:( %J}O~/Zn ZOԂOLG_De_R|wjC怓)ݴO(͠%@\@)]_W1(B;{)V-+)@qȖ#dDmn`('"&ጋ| o7nd1(1tff~QITABufbiB5DZF rqk+2ϲ3$֠<.\&+AVǘ!k@l_z!>9O& <j" ai CT7&{c{:nǰL/seb%x1bFɱ @K3d{k j"04JzvqD4@DHKȘ!Ml\* yTs jҺpq!'3&1dZZ~Il)"|0 `,jP?{$N9`D(JB0gm"="P4Ï1œ3bwp3ghT e,eV=6 >_A) 28)pduQ7E\.+x ⷛ׼sRg !`ւEm(v.{/D8 A|$, FRqƏ@"-ۘ̏,$kV5YGTwL` i9ʢj!qh231&i"s" Ox 7 =#A,!+cŚ| /z-Pd" /L*E<^ݪRB**k+(. aB`&+HX+̖1cGm+PR1DcḂ_JAuy-hqPXՍ&2NXZRJ̜XG+=3CaNp"!Y*uV:%bUĤ3%`OjswnSV]p2ɸ`Fl}P<!߰/P 슁\uTS.ZR4 qx (xRCW(amu4ݹ#h@Ua`!G1M3#4|XAD 9-N {,jys`@ Mɷ`GYW(rd"( U$N@TIi'ZʨrDҚcCi,kCM86(_\vBٴ߉| ֬=#>̱*zya.iA _R@>9I~86dJ%aG8v\%&.>::[`nv*WVhV)zQRdYG-ӫW(߫)SF%0" \Q*;կ&̎8,m ،dW)@<{!9sRo)Zl(L`~U4} `R\3ŗG'*L!LB!&r]0iJQaS[Qx(6E"Y< CS,,(p ϙ0zOXЅl0/O2@狃5vK,iy0%lq]vs_s!͈*W:..$YhH`Dщ''Tog:F,af}T%6oȀ \Um,»wۍ&NaSX'@sFPg_sVB6RkE uw@;V@ۺ:.3KtDȦ@s^m'wkP}N' -ݍGW E]O'V虌vUTuƑNn|-ڨX-]AZI4 O?{ X]!/YGX,g\<kW5jn. _=0ό-b~=? ;# X#AZDlFhJDf|qtsC%%vPou\$;2n \baJaMVx̡kuNiagq nCdv ]~5>Զjafcȋp Iе5ƈ58dByFN1R7XZ!qWOOA%&z% QmI"Y%i9YLK kI+vgN zh&8b߃V] q*R7.K̉JDz.:7&9c^gq̹_,@UI%kNW'Ps,Fsո޽B]aog,욽PgSIo,{37|"rI=cǙ$6_eǸ]j#$d(3, mt=%Z|Y0ld[NYyVz}D 9ƙ1m׉k}4/ҵtYvXD#l;6XbClÚ+V"V FP0uAٗ{YrS?Scu&BKMjbMxV'|!780!fCAFkjFO8B,MިS|O{1VD ߟd8 P^μƎ35>$ e wFr&/%L߹L醏Z2E0bbrƥrdgǪ@B l{?2MYJ'l_)|^t#n+[U:S1(`zj RR޵ G~m=1iW5Um ث o=Qu}1)VQ9jn+ .рb]*.1υ0ж*A.;w)x h?%&"ў[ u~$ ~[ȴsĺX(V2*0$aN젿0M*O~am_A.k܁N7j-K1ŗ.N%%8L}G,SCY{舡Y qۈXP1jKd7eʦv]"`EsUi4^n]` ̍ Wi|3C$4I2\4r~^[{RdlTuZoC j]rRBtIRH`ve%ι#z4Ur<|f25F#omHcJݹRQdyyt8r?6biBZ@d_3۪@̈́f-lAofeKhObSEv>%~Nq̴{\ VRQ\t 5EzB'N,fi-GmHB/GĈ','PTI+bwJ#׏mKKw]6cxJzƮe֫jmUfxw%МzM^{Ye|]Uk.^ 6mĸpP{~lR}>%SSUzTY\YCڕKYs؋KSŽ{|wa}a~]սYͪvo>]ѲkOԬwEd~da2jMney* }撼ܮ+zZx[b`-`H\:LA\L=.HϺ2>(ؼg*V٥^q۸z렵!#zV~xmNz07>E@#>#=mIz4p*Tɣ4ֈ71jW. 쪉J M}@e2QT*öեu>Ks^ۮ6Yy"v\LoԺs,O! 1NҭGYLt%lt)1Ȫ*6t63*PԵx|IRw]5cc sizI+(- \oYjp8m&s*?|HC|whO78}p7#2བ52V(&5S1&[$dcC+Rgڣiʀ01}jA/lP˜#+*̾%bt6vyB}S ݰzxl|&jȥ%|R˼ =z69,):"l;1_tKA륷e[XU[=zFmy_1~5?pTh$MKrtBԴ :Α$T+Q<iݣW}W.==/g_yrG~€ww?G~?k6ؽ0g] ٭_#h/S^hD ;;&vi4ӃKqN%p9G^Z1[ulݳ/ʠ(t"jMRmmEЩ꙼]>&]^m)Vܼ-;%2hublpnqiRpŊV^6^3z) " B]' 4Oe§P)k6çhݮc=g"3=gրu-"ɺV,K\*@7 ^};*xN;آ̃a3Fg/KSTw7U~p:o?خ'OVr.Lҝ&Wp\ .|g:-;k:cV&AQhTq]fnCܪK* m[Nef,&)bC÷jͪϪKESHV~zN`%0Z$Clei胊JB跁lMWa=xOLuƎi^ܪO;K̰Yk]1MqCU 0*]&+G:0k;QAT q?|UcEG*]CTɟTɞZ+߀/S^.o#WjWj.WnD)JL%QKug5ǵzC4+l:@̠FHe[gWW;R+K%|($ܫח hDωY cK-sV=[Mqk׬ͮ+X;{3F~5;+󇥋B9'6~{p:m)J {gdUW~0Bӫ?M̡6l0{Qf0,-Zi7+u/OeY:PGi֨k&LǠvcg867)lY u3VOSiwV0#Ow7akkh- wun9BwD,Qpc>7?FZqQDadgHKǟ{[ճ46+1N#:i`{_Ngd5MmY[j9rPYm}`oK?ҥ_C=g K>$IRfff&s/_ kdq?y=R>DO0}sUs뻭/^OGbt#@b!!>3#ߍsuJ' >IMQy垦Jlk¤KLy u=T/3b9{cu n^|T)>cv?JO>g|x{CNSpa˄dC׈ :ȉ}|% hdpύ{px߲%ُx 18sr{~>Wf>RbE ߋS4 z x~Q{Q1+giw XIZ)=)n|E` ʷ2,۟9oʵiԐ:"T+!MXg)|m'>$#?PϵHΠzTЋ~.vεG4 G}Ҕ7}tU 1?M6i?#DN7㟋Yg&[$L>@2@m&˹KO:l K4`FئM}t \֙r3C:g UJګn0ĻKOGd:{X'.VՌD֙)>͔A9ˊ\9iU bVh`/?ר=93"pFڡPFى|+#RRXL 3 %ӆ >AFo}U[QpQϷQt׊72؂$CPH/QdWVQW p)ܫb :{/jRG$77Cz3iZSRơ3NF89|X0O_+cqBO)Hbk, nLЙ9@ O^%:4"/?5`|yޜ@z5Fhm&`g#dlszOmi7cX؛"p &":qg\j{5,MP fE_rz87kFci9sJ$ ao]VȕT)ɿDV9=Ovfi> @ :Y[ k˞Oqo` # ~ܲ!@4>OgN}$$A U1AȄ4bѪL}=6Z4rM@L)M8p3Dž=R2TIH6ocYq'\+X( B.P@BlI˃;) '(ɆT$ry `(Ka%@۪% #-6I(!֡pHcP1IH,'\X wXjXH4'EK@FɑH2e'%޽#A_/ML eb&BXG. &E}M$czC<{o Z\ !0H!RszpvbDc`ъ+:4OR#UsJa͍#dGKm픇ͅH=&u[ ysB{'݁QiËAS䠫w']ꧮ8XB4LJOޘ~>W@ʪY\VؑF AXK9 b:穥\Y5)ls' %^.969}Ҧ 0N3')F) o?A4CH)Onp#H@G'1!"aQ%t!LI\b3ҝك&l [Nsp!A>x_xB%2)dLqEw\84̜<ڟZ /&Hp8 /s21=0jD q+X:]KSIigb>\B4$bVu\X1:N?p儣e7f5 WC-Cb y&i#cJ>˜5u@TMA .J.Xa0W@ORRYP˔~eH"MgN"MO6pC!7\|A؂Spv![>vQÚ+Pb])-Դx38oj_/rcώo)<0xEGB9NfQ)  H;Դ`!8918F܅1B@AD_XEFE"z6OOPp~"BS"$8*S/dpX_累(Ө ("D,[ dj6p0˝.qۓ&XPf ox/C"Ka%ϩ#JU' N[T."@4dJE,M!i׵8igØXáQ>B&aDO7f;M BPvhA05%er2rI3:Ȁb; E-3N43\+Leji\GPn&qbp-N`Y1{`bj$1wrTfW,KvE@N9 PM:6'P`5 IfEqqL!5F]?( ,-'ۍ"^6MT2b>0*t&. CzJX7R B&f"F@\V#DJX?/Ǒ0FΊ&0[I{L [l(XeWlMMoQs32:%qD6* 5ݤޟDxxMF'A5ƾ7HͷtdSxeD0|N$v!0ǶOygܥuvۊqjɲ7u :rـeɦ }}3V 4e9jylF'enAHj2Ān7s RzsΆp <-<6U0!#$Эf6sԩY8l3ևoH"1M!R;^_yIx" |rmE. b~r 5ӆ?yqMyl}+cҞ] s@wZHlDEΑUq!Drlsp|JJ% mKcyBZ9y0 RU2gI">"Dmk"%̴GZ+ŏTpKQpzd;OQQ4߾0""T IDrE,3H%ḦD%K"9 yC3Lso~}_۫޵]{jWUׂn24EemW!dmJ }[ [K̏>G1(y#D\K車f#Vg;ϱq\w'W's둃?JirмfyS;ob TvfiTWkbod鯲gYvBeװsO?tžrw_=IH4$qpaQ\-dd=LƍRE>C5ePYoIZKGԟu~wR=f7LXۨilcA /2Zu?&Gό~Z=_6Uf!s-%[9c, ¶}TXMӼ&j&·%ܶ4d,n[ʰbbCH\vRr@:iHambc+s1WE _Rk0JCHu\=u:SԿM_)" ,qFm=&QM*Cg~6-:}+KiڷΣcw؛Ϩn80AY,B]{uoa:߻; !rPaNR~Z!^ۋU?LdRo hdMFz+YNbOM*Ñ8;sKjKgL#eE1.x&_-AA.U~D8KtK΍.}~2wCG{=XrUn:Z8=>6b_b[/d&ɿ¶ՖcdsPC\6R?]{o ܷ>HpVXʛ`wI.A7̦NZ[m?hR?{G/ys:|Kcb2s&Ng'S)|TMnGݹPj[!:Zl#7οE-d::˖k摟 7='e[qq4ک[FoD䜖~a{pY^-w8l"N%' DsSt}[nDfwعjiL)ZN+RۿXݯxvDnGR,w5 K^lrĠ~+tblM YlDX +zL_e~x$lB<X)ASHǪX$,2/q#*/́ײ+U4}O:'+oiru_䈻 ۸MfC;/lNy$+(b*guc ^NwAI,/i2i|gz7оTf ]A6$۩5vQTTTΎ:3 "Yڴ-8v}K7m;0d:5o\ocL Db_?py0V]-.ƅ/|j巟]_sqQ>/=u fy|OGus,a8D1*QNU| .^;a~i {y#y9%**H^T!᛹;^y66ϳ,4,fΉ[$)$ςL ¥4;>w8e9R3tc2u=,tGgbh1IW06/<ًȟن bȪV:?2$1uGoRb?`Q>!Lr["TƱ_WV{f3vGؑ&߾IYW%SQ79&nv{_; BR74m4ST@=m6I*MǣK{;5!oBw'U+*r BI\# J?A_@7-;|{qlln/ *:+$ܸOsH?@N"jxˑB^)׃T_yS0 | 'y#db}ғB: )x0XAv8HxAל p$j5͟:" `̀eD H:@, pIM4w= ۔"MxSsTn6}$b7a޻|hpv¬.|80zAk1+Q:sQwLn$( 8ځѼ , ;`V쏀2wU(߁Ij^ApRx+% z4I&:cT3N꡸@D\#aY}FbwA/5l-_mt ޑ(QUe#>QK(@I!&}/E!0rѺ!M8L0@Ĭ ŵ $e_,,MAD\$;Fux8CKW'wœMkD-7kF!ֶ'+愚g ăn(1rJqr==y>3ʵ7o%\e$HZIeI:gre5/_X,"'wҦ.dEr xGpW!n+Ozz "/JA=)((PyP; x{}HvC @^er4j4Xvww"| jA37.gbz\)f $ƟBHΓ 2~ؑ V{qRc{UVjQe91^Y%E<}LuD\Bv+-1;G-챬8t;H~bԥoxgLMXdcy\4=F9{=):'Q>nL"Nۏ_n4k-E,uRf()Axy ƯT"=4; 9B㍒##_2qE ya \Tzgi^osk>)w%0| k&mw!%@NO՝Y(ct|X5g f܅oc?8aFVLJn t9NPw{9@M_n4t8s(((AU0ཛྷr5D 5` vhg:UxN vW1yd9I_Fᐗ"%O8Z=`T;&U dXQ'/0hd\h{*Iiv Y-u"O;pܗ=>{'CV#JsjH8iОחd<$pDE>;?Bg'7`kTط{{Vn{YzJ%5oD-rR+/ `.4jk}+߽g$ ͣ1 \#tМaׇNR6%s rę#!K絻&'Nv]PoNl 0mEiDbo>g`^WZGeh6 =:m3axpQML e|J"O)0FڿdYr+kgG?-[ xryqr.p3%+ ]ں!?GOe pQ7`AmsaU?ړHS3mP~'(EpRHoW@?hΟqhlТI$(O)j.|OJ'6+K(x@ˡHlͼb7Ԋg(zE6}HZ4&D,XwPr0 e LnBec?QeDAj&$dID3u <N7=ϺD{QZ@P\J41V ߕ@151ǜOR9JMyf0 %@'X(DdҨ6/+<%m/'ܩF"C*牞\PA)dJxu]R* 8cR`ɖf b;p_֤EjZS@rMY;ɂPP\bsx'0jkx6W^%[M[/qIwp;0`p0t2,pŵq, xdϐ˿D:ګUcbX4_RXwf)FK΀u908AIzIDӻٞ+QPIpw.%KiI~MoH$wջ<6R x>s74^vgV#Gl/?a`8$_ h`ױpOdD~{}LIC/`u7VVӭa]4 'h?x]D{nika#'ZԔ\rlA~J{pF7Zݖ?ְzluxمX/ƧY~̗nKN ud>JAk1:}s*nݜ?k=Kޏa) D˕ 88ș@CR|jqځ;3vl%Fkn().3ͺd:S2ENwrrf<`c=qK]B*h$>Y4؍D=@X~+5r|+OgEIs%䯘/X>Ąaw"fQN}dDUjS0f]3!@nR 'D%i݃+'pK'TA_Z?ɮ7DyS %*+V6%Pm JONj0J[߲*?rm_yȻ:IW/6<5zZ$;ub+909]hEiĘzڙ^07½B\iFX#[TP Q 3C/}Txb ;oAwH{[wƫg K Z4$Rw3zCB/\Ce6nG7OdE`pZ E]<͒.jbVJ+=s~MZg6<5= SkB!$@1ye>vAfgQb (ufon,"'0%dMֻ1bY!+ d܏4Xh&^ a' b[3nDN.$׀'$==mȚVkh6FhEp_ Q$ %Apl1Qل!SiwO3<Ǖ˿IEu&oxCfG\xq|eƊKȮoޝA>F#M=  k܈z߯GѨ>G{s#fl&S&ִg(j) ڢwesӉSKoe3"IWE,;=uj<]N*bƩ2Rk+ƽXe$S$񠔑ո4zp C J#p%ɟ|٤$j14' foiΎzbt.u]}2Y_*NBO`4)Τ'rL jpz γ4' QwK#|~TتI7~TQљ47$h|#I C:!& A{׌۰%4WdO3-,N~C4%{IbÇ!A&B& ʟ%cpm߂fߐ0G}c6aLn£v#)kGuVwh5 ;~T/RV%4muI9xQ/ m#t (UJ =.m4՞&1iƉqcg̛ q%OIg/n|R^FB)#r!>#|3-lr!-mB?UqEKPЋq>/<SۧX&C25LI3rT˵q&Q|cRQw؏/kp,ӫ`zq} vOOAT-P/ҷ|39km[F󶞀5C1+YlD8KaYEa;!~ [l4lzp}Xwی@eγLv, ٷ_8Ed]Uqa;dbVh,CBVX%+Zt(j|V& CMX5yʅ+).rh8Xvft@(͝97]U%!ORd]Ƈ63f؟6g4\A(ý&WB#ŖH]5XsV즙o&e\sue0&>}$'cޢ`G buǚs f v2/\Ha=arr?}GcƽhH1HkǩR z@'4H}iQ|lNiLbSEKD!V ˟ K)xy]DXj|IPslO[0c ai~V!Ɔqg4R,cMY< ai<!PʱMESBNJ=8 Ss !ihqř4'AY)&jr/U@z.e6M-lKRLa(ʈ>4>hKFŀGt{CtC ǰ=A/_LTTt/X&fԂe{Т.||+RC;?3]u#˗<~~6HŧGiֱ0nds(ȬZyPK0y`Q{ACf>-2\W] Cw%<:Fă;=Z_ +}Oʞ<}F,lW[ȡ 쩰 A A-=!!H+0l,#,o񸻊s`WB:1b7ax:H&-B3ױ.n^gGݒ{Cq>nƊS eiu=MsǷ\g4Na~oRpY?|3nZS13 6✢؎ٗOt:T-쎃u"m7$>G\֤.I P'0#/"]z6Qy' X|Pnx n {Zu +URyRUmL>;9eCSwW9Cp. /t5nƎCTeג9a#77!Pʝ5mOi\?!c]R^oWꛧ9zU9Nێ得0 >Y夲Rt@W9t;H3P~:t4dכA^AvoT3OJ˟G-{@Qng.PyŔEE8lV:6I8H(aF7x|ԗ n:qJ}i?DvXz>_%P:+D ȣ>m,l w -B\=PLV|ӕ/A[5^ܳĎ4cG COt\=mC^:-hcfex|Z~(oxjKӺn,-^+mE&&8\tEER3EA]A"޿\I A  #Vt+ iHU5GPCsAY#0;Xysr@pƿO-QxM6AYiמ*BJA;!ϗ>'~ LP0Vi4vރ JG3`t`,mu*ǨOa}J;ueg*}9qB}oz+ڲpA4OWQT״ѣAj+Z+W1I1ߠg,̛NHfGIĦg3YW ~~U0vofXT-Ad7/AI$: ݉Q]tMi~k{m+a>͍{<\}Xp_B D e"`nB,Ʒ8L^\ZYRxkKc 7ڼy^y/GYcKHCͮNd>$TG)4f\R%q[ptwfi#[h=%0m$ sBЇMAEC5j]&mȌ260^fʨBD[3ss;9 _"1Oy&0Y,UWo&^ÁhM[w69F*ɤ(xe 앃?|eܠϜ[nLf_ UѼۏrSa5\d&YI캺햧qq2r 8+f*MkŇ(I0vexCg|ny En+˰w9QxcoTg ,~x++EUˁ byOT{9(wO^+ajEy+0ͰtGg'Υ~09~TmH%\PcBrhYT){I:mB˱~f@$u.`=C@uPȷU/B\B/vѼ{  :Vx^͑Y Ё!N2L n8g"a(8BmgXyq3p>Gt S={|KyfW𖰏o]UzO%$+׵9%:[8_m)wKvnvFC/T'gpF}JwutR7Z+3N*.L% !H*!՛ 2qͽGv6[0z˄SAtNiHʧ]Z-a`?{~<2S [λzNLU)ꍿåFUzs\ g'c㶊ks|<mS_O3;f;c(>S+MCLNt J^6n~YC{6̢¯-N[8fkp#A΢dWC;4Acu4`֛-M,Pd oR^5Ƈ;ojjg1[.151s`4cE H*f[OF$a6f΋O''0â7#ُe aRF*jM=cva::(K9 "\֯KɑEmtં1Lَޝ*3$+gKw_ 4,XonYTC)#|l1^퍋9UL/ C7e#Vxs.=T8Z~K:8B-iUڳV6xm)pDh &^lk';G͝]ΛNLX}ͪb*GnTɦIWs-N&Ip -3:Mu[Kޔ!xڢNlٮGۈ=w;'SC$ B }W(c(ck~y>ePނE+SLSnv tѲ#WO_Y Ίckc[ zyyeUn~]JKtf8ܵB,zc^^YpMVXnܕ#8=^=|]VӃuYG4$7e(񪫯y\ ΦRb3c+EsS[rE<0ܾf=p[JkSDQyCS-w Moˉ,u{oAIg]G'JH҅Oa%~NJ-"q\ŹP' 8,~78W#[;>S/ SL5WrJ {cc , ~/53CCM, rڗPls 9C `u NpX4')܊C\>i'%ʄcV44U7$ Ï'/͠Oev^߻6w3vj"6(g&g=G8n!}7LSZΐŮ//X;2Pué4H~u >";A "钊&EU3Z5;D/PQ1|Kn0ӱL > ̤:˟!g`ѱڜmKz%{F!/z_{G/qym$8p?C=م;W/˷ w%MY _SV9j*mB6ϾkoC2!:5r(<9c/I5ќ@{(:c(޸ jAx{ỵ22u,@=+4O6V8 EySt3/N#?Sx*@}6ʀ7e,xҷ.8ҫfcʐmf) oҸ(Hv>KϦx$.7{5M.~UȖ khDRT}ө-ȑLl؜mu=1^t6Y>2PWDO,O˗R dzYc0B̯ t{uElBNJ\F1aR eS `lNu1gxO0K잁 !o/0(vpՇl'XORgD/#/~>Im콑מ (f#5&Oc(Ҵ9s|p@ oJ@o'ydoe%g6μJ>0;;f* I65Nv!͇ =s9iYomoSa%7R vymλ.r>o6M`!!~΄"7AL={% \s!;φ(r**)^&Ab)"H>Ҭ.2d'ʍ%rZ ?b2WmFqX@**[b9>pE]g%LlsKd F6(wpkgtv8,;%>;Ù-5$ \@.{Pٜ`MGX @&j%~;\C[YT#qBuvr1 c~N.H"pYKVO^k1/mPx,YsDx5Tp3  0!4J:9X7?i{JξsfSl?j+uOPry!g!WĠ={61V16WRRSfj+>.+vB 8?ZBNk^ЈrȰBQpw# ,n G\Pl 99ĵV;%O~f|bpxɑL":G#MxNX`7zBTs06r96V/#PxyRĞS(MBi 3i 7KFCXG+&~sfCץ{s۪~oȿw_]I3̧ڑ>t~fd_ nDogǻvYx3G\+^|vGRlC1x| 4j6]!ʺxOy-[a} ,䯪V3zJUTo7v_$RSg.>lhl}F&)ۥɣ^sl|u1UW*,=(m^&=2 `.@}&WʴCO4Jm}F>=GaϱHaR{p\,܃Gk;ަqjwB=dĬC[],%;Ӧ8]`&)[,c(2+Zx[_qw|"Ύ&t/g&FٝUYUu&䳯sG滄@Td޿<8.`Sl/8!qB K{qr T<k44 ;, T$;-llq̘+ʥء Z{\6Ušך_뒾1xm̙ڔs?yxa˧ 2HvV;h!{$~ kDK$ } yӧ^nѐpWV5EjBAw'>%:(@l; h4r{%bIjnDz _>3^yKygNQ]҇nkEHi=aQGz>W HdEGJqsXju$ILwI]-_@H۬VoS>ÛƄo6rfCJ 1B3#hZV5 O&V`,гwkm6ꍦC]!mC-mx7 iwYUq? j!3q̸ ȐhOzf5 iz :,U6 JS] 7>virLjs|cY:긥4wǕZ]iu|e?u?Y`$ FnԬɾZia^1xT'}l ].$?|!uRn[ZuYKeP MŻșr~Bwf/O;mQ&TYk y6%kbQ$sfLcaw6IB1?Ոmkl_zs.@VQÀ4 |u6=<+UPʹjhY~Gٚ5,o!lFfaR@P2J6}[zJ\%x/t /C=#_8ƘTG`ѥR"tYopJ<)w|@`UQ_C_FZ/;jf~ZX# qzE.V&k$hKϠ"g[Y`Je|@w8f#d6Df$Mmv/-##l0F8s?',<[Dp90') ޗp̈)с:߁@q`8e:zTi!*omL 0+Jst %裡C>kTCweð* 'Amt1`dp`ZG-\0~\w MܢvTсAY(A2WKzP{}j3P'sp/= 8s3GLrP#;ol<2ĖRS_6!٠2vn'|:wx˾}?S)ќєJ,_J^xPLFcTP0>fr"FS8'e9%Ewpݴ(v1.۲gE~|eX98//_48&oJUi9=M=؍RH,DY?X'V5f̃4l-EҾb ;iKۿ9WAL*dSlz2tlrsW`t ]G&jʶ>ugQ2Q6GޒvfH6Ehg!9tMaQ,Rb,\ly%qܼhѼLŒGJ0ErQQ}{UF^e3=ʊJ)~gkwh|_ w,s텚 /TU9_VE!љ~Cbh,f7rq#'Bgs,] `l]!}UELӕs \:TF$|`-#QTݠ3DBJ:}ORk+PV$rwˏ+ x:3%! >Q`1 PjG ^| L*(g0+\r(;>Ts@0Mh1!̯ 15UvrDKur?ϸ?jI̴7^nٻAB3&XƹY`5C\~{]paH*r{*Ӯs{X@@za̧CO  rN$~"^c磖h4Yhv6%3>17(~ v{dew *E;"PC(VW^Q16pKO373 ]ٞg.8)|)6-cd'<7tTg<>^s z8F}zGF<$7Ԥz2K瘬30#44*(*h W`߼ʂŋGSqYَVڍb"Ă[oLJ-8=Qeש C(y\>+\"+1 JQojA1v#uy!:K:@Gh-uC'U|uVbM1 *t^j9)ywV[jЄ5fIQ or2?؞g޾3۽%NlpMXeq,N&tl± d\bZGAj)8غ5'^\)Px+COd`X6ݨfX1_+Yw֓z 1UuvHAAe `(jq^?U`UަtNV~ezsTsu8z~e' v1ݲ 'JT[GN^ՀpV+{e3kj5.!\ٺNJxf5'ی?l=V5lCF>gf0ݱo- , PHm_i=sYOGYy5q5 *ʻi:XA×1H9Xȗ V@Ɔzior{!!ֺԟ;>h:8]Ē;0'C3 ^gLD7$E rN1\'pIDfMՙQhv[IDi/Bk rR'_ا*wG 1_F ![#R| vm'3R xnd&ɗ-0+}BgJqPTnQ2 Dͦ;M?̴AOiFmY]kSIy>q LQjXyrD5䩎 g2͂MvJpM2O=0@n T SZ 6?pXjT#AlXN`Q$.M09{hQO1&nmEׁDʞ]ʽ2 z2xFp@bŸ8e{Zkyѝ^A1lgjI BrWǰ:It[Awbۻlq̚o{2٣t ә܎ohτw^7 ,q.ڻ@*w#+Uex86rl8.}߿@[SimEgaS~X-D bB>uĩ!lv:nf@C8uk^I24P ~TI#S̟~M!u mCûBDձ^E?3~V6Guβ! gf5v6{>Ca۫}iG/əp\{Xd8($DՌ;L${T'CE" | uZ;D9<&56J5A찳".N`~k;R4F;ہ?eV_9݅*PY;N݊Hă=IslC$Ŭ0(e~4{; ۩CoDnH^p>_{Pi}p1i@ohoMB{*(MYpɥ!c:iU50W.>dkܲ0}y;V*k6Z%@*VA  |Q PicvZq),b7 DB(WXw!%[#]k=9-@NfOVKKZx)`j19138,Gm/N8kp:U5WMCJ_EF! u^4+ фGxWeȥÙ;#.:J"Nc$ n%Qs h3}_D"w)]h%^D(xO`8G$<߲3( sZ24H_CU2900݋Aҕ6gKani^ζl)I Pay>lp0,8r?z"ث!/yVҁY, }@j-Ke^3!}v;kg@ }} 4g4/&:n]Ɉ%!K&ڱg@M7{)T{toȽBACcYBuj~#z! xДd4/`Q3[8ozTf q Q]EIl'B{ L2vMVyscxٳyª[CUK:a>+$-~KA;lV< .W1i&󄭷\Z}xt3/ X<_O Te4o9E6Mfc*`HAtW{N5lݰ:˳ oK\nIf=1Butq\.&fN|D|@q)X`k42营x8bd*po2b|Y%Zf/H C+fh2G簇ӵs(@En51{"UXdhK3v At*wq(.7~ ˟ޫ7S LOb0'Po`v!9'D9!B޻2R7M'0l(7–m|]saw4I:C%dnvmD9W/Ѯ dH,88`nEYH{†bo1?٣M`>COądip|[PrbW6T^DGA/Ա%R.0bjtߟr^fw+^0n n-;vΚ1p(qAvl2[:ſ_RAEXT_ᯗsQQQs`=W|!&{Tl +c(rʓџ? ;Ic7]@cMF RM2Do( d&R11ąX^\WCΚsQzABjF3z2~ޮ_>4_-QYߊV?@/_2Qx•u,1UE< X;:kBc>P{[ᄂ~w'pWKdZ@rdMVgofU)v$1Q~D"VuSD^жW% YOA&9hfît\;HuuWVp$pUakBbdCh6HAU=e]%b!ci3Hӽ=g"G(u:!Ҥ %QHt'wDQA 5Fޟd4G[p˵9{&O \ѻ]1|C:M-4\d&- Ԍd` X & Jx5+G^_A͑xd` \8nXߌOhvyL֩5oHj6QaZݖ7%l|>UaʑčW>ͽ߷/˄Sfibj * :~ IJfpXy_(. 9k§0"vՈdf=*tܿ.x,J 퇂HxJdܥZ D-o Zѳ.q}C[zJEcɀ,2@5J1fZތ!$׵{a(&_Fg׋HTTkPgfŠY#NF2?j<;EzO 3~S"Mw|.|7kw6Lf0yl!˽v=vw~s\U}AJSNRwb@;}i H&.?l~Wvicdx$(Wè960rc5O' Ҟ~`ZMALf׃uC ]u#ElٻYGsf1v=ki@颢 a*i1u@W>@VͶe=ӝ.Fiik^WUL(ܯˇ@x.|Ou{zeN I.cKM'wŪ>cv!JAوlQU!K1: x:4iWfW4`/?|tY$)O (c3 2#…NIdT ]6nQ,縞^yDtdPC/[cS7%X;wu1\ɚXhP \W&˿y0N^kr20hcC/J[I.1>Mxkw3yg x2 2T_$B֝Ӫ >EYl A;|O*~LTu*ΛhpըؘX46!s/;{7Gyl*U_#$f,"r;N5uB|@[q-g=1}g>i}`+Urc 7V'MˋY6[6 .}{%gKS.Za5K5St'>Nebw{qSk'WzF4ܿT>yo%goV-޽$6mZNG9S~~PI b电qʂ [EIN;93fsz*~kr2F`55~\NRA:+wmw"T,NV-άLԧ$䂩>WsKJlqv/iO(j×&wۅEqŠe9fh5;JO1zv>( -;QUolFm}v4] M'"olS'΍+q]W<\g2.$)xع_}{1ᐻɩ~[OrUbQ[h:ǹ_a*j&}Q3)ZdN}yڦIsX;'&`e nzI-OE^v)!1{+N.#"j}r34mc-u!tPn Uȳl6} ɥRR?x$A|ǞqQ_.gqsTo8XCfnE?{{&Z Ós5lN`ũ3sytKU9txW;Xm3o!4B#ce资i:!J~NL$廭ER|lUg7z!qgN{?c^V}^-0xUtAk 6^ʾ>{+n9=N#xKТ.3{2,[+7AݯwxWN s\?W>h^R ZH awcəC_p0F{BEEsiM=\) w~?[yr@_ E`hs}w?iNnӉbKH.tذ:Ю0gשC7Nû,_,p;6 EKÉ8Gc..sא[%M7e-aKHnO~%qKn HK] }Qdcʻv|ŮpIk'h^%BqX%Į9+k43l2պƐCgrw9{2F+s\sty]tQX+UO#5р/ҤR76A_ҿԙ+fj7se_61|yKZ2*-[zAܗ] $l^AXE}%D{u$v,3&WKy(?g0ǯs\Ŵ#O&$V&g+ׅ_߹tO>[OrPOaSuYE7\۴bS9 !\Ȍwt*z#QPãաYbG}nhUCi8O/7u"ΌNu:[=`yҭ'gGóg}jcMǤy溣 {ZY~Np=+~&Ls8X!령C"!az]Yf| ( ?V}>6sEEwXkGRJYgܜӄd./+cQR8+Q썓OexQF-4umy7U0ܰo "͛odx6W6S;nCV %~Ȱڵn|`{0;m+g51gn|r1;%?.;f\1q~O0B(_ßA.yE uI.h͐!0 4H5 W~ wETcdsaZ?C}(_%`7  BONNً< z3ۊvҰO^P LWk,6# Ov)|5urHv }rhXѕ`aZeTn^w$rteO|rlw*[z^0P˖Ax+] #"94~Wy _ h˿ytRnѨĎmC#TIdrݝa, ngxYĎĔ~^࢈0ZfbgSZ,K]l*EQ 1}ZhԀ .ɢ;d_I}}h\<& {"~ƫǓO&*3xTVllP ] ^GqQ 9`+,x^ F 6Kŗ׻)uor<ԧ U0?M=ܞO]9Ð %V \B[򙮕/Pt=>Ʌ6ԡh>=Rz) ml5u="9:>c׮7&n[V,nFõY½A(N)ުԿHfސ#);Ocu,lFߏHwb!UꯇY*WϨĆ6><{paMj<來]jIȂA͈uA{9fe.-c: Ow H=afd3`늖jKk4*^7D?5તW@H0p 'MT lE&{b_0Js/l^b1ݜÏ"wG1wMȩ4?m(Z᛿FEy!kz;RVg,5:cAʅ|y?JC|R9@uY1?[Z~7>Kّw9 ڐavãwyw!ʻO6^ں%G$)F9n ژ2{_=Mj |CϦxXcz Zs'ߌB|L^zzS؝41JR ]K&nw>V*AF6@6.Gcw[BO}K;z9kRAs|M⁁ǮF]zh嫓KooPIqh.4~̏<` aO2| )b -Kۑq+=6E)jew: t:e? rhFA$?ѕWgP'ݥe6oѼi%JnX;&9MmxDttu5|ͩ-HȬb%qgL #C#TJW&-,of"qo%e^] F9r,aq| +{bN-ng<"MG܎{ lX}jNX,Pfch4]a/Q; 42:gYzBg՘KʫJfOmG~o0Ji 蒘yj-ƀZaO{3ئxo`v H7:٩7"zwޚ.xN?9|p|+o5 F2M}@hLj;13 b5UT_:}Tr3Í3w7͢>8oѝ*,۷#A򉭶{sYx4FLDz|~-A2:/7i n?_87v 1/L bb߹&?N0ٚ.)#!8k ?Sbr!>Z!QB_ľ//qIEs<`8(QRz#K$@L_>cbX_?645DHl1S}Mυ')5-OJNY[M-Wn5 m"mxn^"WDgK܄WߘGC^;@U.Q{)oq&^Vƕ绢7zO }B)~`7`tל4݇톳 –vVV>Rk3EvϽV.LW&`s;Q?ߠvQCW7]!yfcnyk'q7_g=1@%LN?svwN6"V eR;}!@1Ln5JjZ[x7IV`aHK_̍k g0nGAb9/Ons5ƺ>^$Яc8hHL 9pӈ:><5J 3)[h^ nВN_EWߑα|ks} D_v(PK9wzZhdc9:׾*ziSw ̙ʳn<9ufScU  $MW-8POYQۘ59dϘ[ D6Dk|T%cw6),'xNV|m{& "] H/Q HiR NDz "*wBiH zf~;sϸ=c;B\9e$СT[ᒉas2#Ў/"xJ읶5`MX2cI:)P->}Z3N@ӓj!OTq~C5;8y[W#4 one= ^h[zET#gf} wjs; ;o#2qw?N=jiB/:ժq֍xݬ&8kHÍOpQvwt"ᷩvmh1`ؗ7xř5PA}>O6lA?p;tV>ܿO'0w4vcnxW[?wz6JޗA~"Wh~zk}2xD: 9 ݹ aH|}=Ի֮|-@I%:mbWKP(螼*UNlc!VK?NwbPs "yW{Nw' ݱ2ČZFk~TnZM2{8;C//!wzXMj#ZIseFw̰[ZDT_LM}]Y_6]d|YW x5`LZAHwW˚v[Cn`b#Y0?ˠlro0h~fb9 A'_-qi-i?NM5]B^ť0Hk[Rf)Jʀ"QH!կ`4OwCP0ۮd4VqV7!4@|7],>6Ljg e{G^b'TC^ζm3>CnBKx@?N854y~ŪH #}g}Kmgyt]P43p}6oلiaF* pEx"I}3C1l}èoTgbmϩZU}]Z3(N/|╄T,Jfvw'pR"f/>|#%&쫗`ªL-åkYWSWX=R@ֈk b OEߪJly7-wi8$A]3ԕzK!%6˙#廳,3 1t*r=lTk cUHVG.EN^՟0Y\VuIPT*z^}C׉w,3iњ4O9 '{Y}'{4-uz[T%k~Q]O_xcz8#a0o d/9*Nc}͝C\Td-S] в4{D@D. a#LZC؇Mж> 6Zbl 56μ'cewN0rF qAƼe4lu-><r1EkAق8gh9Q*;!fkσPԛx[ge+S䫳`rPVo:582'c^uI=七I~f1J赝& ռ'y/mcSYF<*4P0Oxs^m/PdaKV2g.Ϧrompt2>3SAU'v;*a]U`>W=BЛ~Xa VQ_r`ߵ :k:2+O}LE(,bm b︚QM҉Iw.a}g[ݶ}NLS,U갈 );6K:O)aFþ_WǕ ]|xU7Aqz7 _g<`0%\O3ֽ!uH[y\Gi% 3wW25Y 3 7RGT9;񦫺k~ʣe :l|祰oe8RlCJ6E1ʇ6XmZ:뱑.2fY(7— .дh;=(Qyo >2g7‰YPpʻ N+//^8z*FD^ub.K_!$NZٓ!O`ϻRubB;qUE[$x]f㙭th ޗ8<_ amh1䠌h-|\Zf#Yކfy=w݅#K_57)W9?!-۪-z/Mσt+5'S%bTFŒ[o7|ׅyU/[W~ܠq\i;6f33ZB{ 3 5e %' [Oʶ3mB:j; }VgwA6tm;7 UUșMH7 OAP8_<͈)OHTϭ%N7wlZVi\I;X?HMHA1wL_ɞHyy,T,jAmIVRNߔĄ %Ku?SgGu}y-pM\uZo KKk 9r.ODT)o4 *CܬSYl<rn'^$;7]/ 5W% ~p_).%xjr ݛ ZDF_#L~E_y gS3Ę,pg 姙;NpvOD]n۞ }znךMσi籯 Pp_\6Wlo}t{qA=<*NC֝sӤg>dŤK'>s&yBbEsXav42n Um._ܳ|/ .7pw:2 ua7ͅ릌lt ~ V<kE8~[6Pzd& %z0r,2t/$.]%iZm`bݥ_j6`Y3sw^%m{<\>74%m,P\^rMuȷpu;Z>JjJ}߶K؊)d@*>qTao>tF4Mrb) .{TL_˩ίs| JVĈ=ig|_,߳w9*RׁA@eeol2ɸi%s~\t{ÜmdՃs5ʌ Y]KL(w敉g5S./zfIZDR9t3 @-/]RA7M4 Ыk^3*T[!zE6,DݎMfzQieoX4=UdHklh|N!9-|-M|ds_W\兿\&gMi3JbS:q]6Q "PESitA꺳~Or ӵ|">bI4%+NZ|A (H75@Õ8ZaBH`m>uVÓ\C7T! g/>VOcEÿr a8Q Nfԯ3Se );(e~/s÷*p YCl3ZcwL =JoibE{tx:~(ůbSM vxLԢe>WeDc,Rؖvc= T^P`VSt1^FK#ҥ u}_f!-] K/|}[&n)>k1wҭA-*oP Z/a؟fIe3 s_0)ߺ :BW[E^zS?=͎Kq&3'f81*= !}r',@[3v_58F)~#˕8۝%PhԞ*g }k5w,hu_8`hU\z5:75 Z2l`@^Q*Hwz{2[t56}80I;U7~:`/˯{?>izk!uD,MhN+w_ucz*eQػi?7mROAe\d^ԯ8Ѝ̨oIh`#[}[8H٦j~r"~-^Hҟu,M^$`)G\t,V ^\>}-1jN' Q;pʇ/+i^K-2z-qe:ov^DzG <;Zs\WC& /'$QԄ JW&@_s>cB|~l p1}[WHGvTӜv[ϸ5!uOCnyQ";>j]]c2/ݻZ[MyWȗJR"~.ikQAkIa>J5כEȨΧÌX?WϢ NBQ LJ>>Y?2DQO< Xsՙ.YwzaR(K'O(e:u~j.t_w Gu?:%=rȹ䞂=S,}UNi ͏J{)HZɓC/p^얺r y <>vzm)YS=6q~ J(AZNzuZ ^I ~vE|5gEe&a 6c:^sM=jg"wDžO6-ni7c]Yעvgm 5-o7v&BCxzWsS{,XX֟ڭY$? 2룜zܸ.FidkDߖ 3y0mW̓9 lH+WBF 6qLle7"p*vJx$~g^] 3J)r'/֠O0.T^Spw>ZstHZlNMf @#6*xLpj/Y(r%d'!}mˊwkwtсˏ1][}:10tؾpYX˟6wRw<3dلT|Cȕ6fpM+tl3#)s< 4 vTV!w_ke_Rg.--c{^Ϲ}/m)`豫ݯ Mg.>Ya}R ]0W ]rEek7=N9.!Vy?-Α|w\x3RM9==gbG JԗxԈ43l&<};E8Dp̚緛AM 5Z 6M/u''&KRy 7!m u³® y'>f#~'"l#Eur/򴞒TBx:s]5 Zs4+K-0P,n)rӥ+vOzGr((7觮.c(]IOZYRfyG+ bں,dSQd%$˳d(98hOXpEQfI|#zǎhnnmE 4҈:f;lU[] =*33i9J$+i57p$, E~חҜpd?) w 2h`?E;/P;vo66ZW)J .UX-n2YtshSaG-o1iaQ|Y|#HUOAF"E&zh[h }xM/[}/NRQYPa&%@dC 2kt]22$@ wO)Ij %1~N"Ͷ>oʵ+XUլ8Cnċ R- u9N_+*ڒLxZXHV)FqG8)jN :U(`@G}[k/Y=" .OQ_JKsY (!B,> |k/nvCd~i>~DYbi k3fKkvW==K5YM홍 D@oZ*%&Xgj1RƭWp) $`$O)detMSU͔h-uH/˷j~0 9) Jw2XÃEI@DDc-CЙLX]VW ;%5C`A=3vĦil' 3S=_NaQ0{ӂMSY]V|JU[ÆMi3%fڄbm<^\M{gFU<ڭH(Mp30.pD'Cdu-ul*G@9Xl |.\W=ҽ}l \DbR׽`~?4@Q羁%`Di[)l0u,γe ¹c ,ӴKGl'nh=ooW:K2]U{.hTk*vo˼g|l#jNܵR{Udvc)+EjcJ$ ~n0➩=g=6ݺV~( N%`ejIH4X^삞aW8.FcҞWɛ+$?)= ۽j>M)ӹ&ɥ")q^鬖gDΥG<:.wNC( 8+*'@:oۦ2NKH.qmL Ag\W o%6j3f&bLc >yDټfyS]Ť {GSeNG9]0ٹ(/v؃{7~Nս{\13< A` 9kZ$9mkt'-(?$O|ݵA3> 9>-Qsx%!4xMhڛ>zfDks,###_uR~ ;6XߔXe]L-?zhSSIQ7 #뷶ijC/ܥVYol{_hXr9c߮1`6EQ3|&FO@#dq#MIʕLC>]|ʖ(PP`ZHT s%!LVI3} 8^x o%zDe_w"#apSzWO\S\^J5t/(1e"bDϠit}Wd]g]cP;ymދrjvs5Yu^8.EN qdl/P:2 "ZiqZԏdhxTx b} ]L6<}ѭ}2@fPC/Uj~~m(S祈/SrAM_-Ĝ]FLZG3 ˅(s,/ltLH4ˎ-.WWˆԁ]z~ƥqA=z]}{x+^(9S60cdkW -+ozϺ)WR{[7=)M5DIuJzdMz}5 6ڥ0>~2ɠwǀ$,inU#-BGyO}AgĎ n~<Q^4b0TnU~F_lږ$jLP&sgLZ>CDESegM %V$'S$W ezep{H.3vu Z ,k$ 9x8I(!.D-z h1T};ے;T-DCCɏaifǬLboHt̒mA]`+?չ1ӓ>;xqCO^KYO<)D *SBY fsoShuF- V>=I N%/Y=כ-=B-L琡)ηfVO.89A둻04[֎kl[oR&m^>GHs-{~@x-Is9zRD8?LHϽCEFv?]i {@[t8|TLreK16Z!Sgf~~3M\.=zu 4ssiw{{̬LgT딙6ʺRXJ:+н|D] -f(Z5W3RZ|4\WI|OWb` ф|Yz sy0mw)`ɯpkj:𣟓[@dT"Xr0*7ݨ0?U/渍d쌁{+?਄K׹Mďg”=TY4P}2f tv$6<[(.U 㝂Rj%'zįK9R+xn!\j$._rbQUsC@oytLi&(5 U(?b0C %dv{ nTAk,tW`P \撅 (1ZWڄ5}5FG`s9#Ԍ OȺK)VYMIu>O+NDiʞ Kh5ɯA"xtA@A67bi;Vj&a/5ZlWW(Gx$b}F`C kUeTx5M~Q 8:[18KAF`mv"§-N: JžmZ=4|AL &Yl|xȴ@CϬ@sAM/arBeY 1ԴM$ ws,Oů:ԉq80 C@ﶂb-B(Aϳ撚i]b4,pk}sЂ=eGc.?f` C 'D24@F6^f &ГT ksTeS1Gwz1Wh9x#fyLN$)C^2Ƒ" b47qүp&9,Z]h߾$j5ek?:0PVOb~v,!$ 㧜U pwmvq\=j.r4uRsҶ5U; :UR/_mu>eH8Yt=>0 Ӂ&sƦW p>A Oa9#$]fefQCgm3]nO\ʦX>5enݻQU&x{f+ kIqN"ۜV(!s>xk~#GEC5߃z 41.(!<]1(>H] \m?> L]O+;7#$7 /ZfH&Z>+FPxRg{[CTAq]0*87 )mWj!ywYj@8IP=OxTG}xeE m8T+.hU?Dݻͽݚg~ZoFcH;IxvsǶ43 ʰ{uzDlC[FMI{&Yq69%~L]LxMOה}5w?<ïڧ)L%(D1ӫAm?RBiL]rl:YGcr!sKs_@6f fNj6cMeXnESU`YEYFϰ!,-D1򶍫ߟT,~3I lGmfl2Y _~{rV{?/f$M([e/SxiޱOǜv6{@Jܭ&N>kU.U%dstu6QW\M6dd \(U?}zqm3+2/ś|L$jӰDCk_{z1Ƽ<QAΦ[)680[ͫ<_i+Zgh֝snQi@ÙoJy&ja=1\g\軅d%l_S?[4 yPK7um.>IJRT{8E +hدFE`z!RJQ} ^,ls^(Mf2s|DgKߋw?)>saƟןOQU`r9,a|5"('94lO|qe h;9/p {ZgT 0&.|2O\/ 'нJve6PK;xGENVtnN<1ˀ`7D.^$,ξ. 3f 1!>c9y(׍wh))umH +_rEͩTW +x ȃ]{EX3Y#M#ZJΗ$ - Xe0k]_6992hVbĜוNoH{{ïwicsrwvr-Ǖ_!(L.'Y?ǞL_<٭. qX@_M!hYϓt;xۈ|i¤1}ʢ˻z/Ge~]K^@GSUPmoϾ 2O`m!Yo3O^=;從(}}7@} $ EEu "<{=&ub(Rğ*;D2T3<<@ ]%K?I?4EԲ-J`;e Q߿\ّHEz(F YyR}o>?hokw,ˢȜ@pK?)wc0[A"EtUݵLݳ=><|֖"~7 Ք' 2='fgvA8W_76)ĸYd KSIyOb4 1nMZd8LhQTq~ t45sp!@zJ19.1l~j@$ Lҋn~1Д-}UbbxIi W>L$(4O. jވ'YIe(~[dbh)GD p k_u`e^֫%}+Y*>ј6%Xx_KarO GH8|kR\\ ҤQ"NCZ5;2>Xj8 /-#χYϥ R7n}%>J==sf Qj QU%i7('sTH`ƈ }^sLwSL}GͰf 9|5KFVpӳ]%mTo[&nsSy=uwb&zH8&DuV> {-o$|DZɗ1mpxQHSgTIU /u~ތxrw/_i']^IemKXka j~nRx>n=\;iS}=_Fww7lh0' a\Ou|7'Sj?/!k_Z0 DE>8_ 8Ŝ[m/Bdh9$ol6qaYc5H)ܝ c'#`v|ni-otzuqnV6N<ֶJ|F+%>C):n?ynd#|QWߟʓt9IOO7y11QIQ{1q999b""~V"-_zؼqttqme T_Y_ $R4 &.zW+8S^'s Y/58yK*gj_ewE.~OȘFפ\\J_z^[_n^oܖW6bζ.$wqTvtssW_$ ؿR? ? ? ? ? ? ? ? ? ? ? ? aaJχL%\HFCHs߬fJ^PO9 8e8%]p} ԣKl?|P,Z]=#,.~e܇89jqxǿWKxL=0{دW;M $)565ԣ /j% 8ۊ)$ޖl P{IfRs $eJn2feDCꄉk8.?wODZSeu;yR'wY2l8wu oNמ.hVff0%zvᑖ&/4kh&TRwE%:8hhWkFQǾ˴Q4]7Aq]l-Sj.8m*㒈v\y3%iQxI5躈I EhyM5Iž3t) ZOW lQɢFOe?eux#.(fKB&qj}X* "[+1{ZMqa=ioOcwuqzPROMp+@e%mEFMtY{+ү;䏊ڋb^\P{wb2q6BsOqyaOW[-gx3 BKi[ubf8;Y#rQj#MhɮI矄ߔn~aW6Y3~pǯU2qIt̤W>Qg,=۞&Z̽zfd(OŎ~l֟@Dٴ42H4oTY/|7 Q7Հ`Oq/_Xgk;->"?> [e~['"jaE%7 L]Y#gw[/5"t%4S t5DТJp+ oidCy+amߍKg !kM-i9諲4KްgstգJ\t/sd @v{rS{Qƿ7{p̗Mޭ8Qb5Ʒs7#>jFR"i,5B3~7rtH!ſƓllj>?>]+e}K..(8&?jTemWүDh {r'2t_sbV59rYrn?7GPk ^ BTw;M4,ݷ~i[9A _& ؒ1McܹIs /8a*t/,zڿH7 ׿<^2Ϻ\#w#qOOy+7{{pfURyp)j/AJ}p}ZV,gkI%_U}T$W2kF9*kZl _`Tz\o#Omy+3Zt ?(G箕 ^(0Pjg*)ra9}_,\N(dĿ RNJlZ#څbhk0ܞ2Ik͹Z\X\[:hfFG?!.%MҐ"ÜsBJ5Mw"i] 45*{  9Qx΋Ut7aG%ul T|vտ77+;.q~OYQe-e22 UJe+RK K/|Em_ED y\X]}+HC2j:/{r=~=0ѳ4z_yѬ])ӊ> :Z<8_\*p_Xwb#Weg4ߞZҿz+>q/͗XVsa1ai,CeMq[⟩2(f% ~' xVP|7h9Q;/<~Ñi/kgoZGyg2,@7ϰGvL#{D5 `jf:iEԧرY,GGQ 7=w3 iW'>)5rBWt*i<+p. еc%R%W6֫iǿN6~i :[]wʹߺ7Le3Ѝ48Y޿"bFT1z /c5  yA{l5X6"+~3q=:ȕ T ܕ1ȧ*T7'P_ 8P֜lKǙ~{@r)jE+Ӛk`~ TZ AΩئREp]H к fa'wUJMST=8|ރ}\5a&m8PSМؼ{X1R]ɭgut$ZѬݽdXlcQ7 W69݈w3OreNb3&a $\c3VhgզN{W^{rӍy,R׭]} "|6̤$؁3;vSi_o<~)-=dm{9 +hhhok"JSCNHl[cZ߭*CdDݍ֗—Xyai9f!"0j-_u3ͅb rv=ZLV /v~", eѰ2E񑝻8fʱrC0_tqN K7TpcY6_:)z"Nbˋ悺J5):f`z}] K~w){l$ #ZdATa]ӽ"EÔ ?5C ^:97n'9 ' rX@L&7g}7}>rUgU[_,KUXUH d; N[<{ Nid.=A/ zgx'{[ݭ8ʹU&wXʽ'brs?O~4 KT3)`Fߔ|Dهg =$1Rr91i{do^OUMq \S] :ەۙҽy;v B W!Ab\M_'ANҎԩއޅ4 FW۽_(n܀b +xv2F`dcXa_f/A/i%e7 vWnU>_m56U6†wK_æ@atߖ{Wj4Q,m`(te dsCTwwF\J5k<نaEi(~1?mdunJy- y|/+. neDV\)th}6܍۹'b`f_P [ץM.9ZwsVc$=.2J!B3dO3y!H߇] O46/6?qtٻ'BAWVjC&UNZIH<׊J=3?[ CݢjmILuL;Kh$=.ݝBv`c鯓]jj]f+MS8||5X -!XߣACη ,S9 7{DhS.o-`EU?("+nq Zsű%&lnz7boakxJG`@Ⅰ tb]P06xE3<?^#q٪ # )%Ep\+7:{' k_h>2vٵl2v:w_eϕx\If,_cH:R=ȀYw#+bXFDkh%tɹ)}4cRJS[/VD..⋢H,2/Nd$ 9- "%*1r*s]a๞t!C 餼0s*T]gz}S`VZjr vq5S=d|6??j~xus*F;quW }8.b[iPR XP&sl-1(d:ōg;ŴMovwl&zQ4]%' 2Y8(/loAz-u2V);cݤ25?%JƒH<76N!_g5+-`PFta{r6Fnj湰m"&$JE]}YOIC~*" mk x~FXBrE^a_JZ:e\W97X|ȣ fH1rI8㯫cuE*[NU͌?ʼnΥ&Zi?X-hJg}|Ar-!L$w jJ/jL IzBVO|$J0x !|t_㒔Pj)MύNՠѲ/H[Peng!(s{\)-}WĖen=%ϡrPd)SvgTUkpS*7'_Oq&?J)`rѢ5OC0&Ϛ| lpc$>IXPP08Fr'^>tCEKU5]4ArC:^RCˀwF##keWMN^,'-Chomo\WN*NƠmi0ϫR4'c4%.J>hYy \t贵nQ~ҵ*5/[L' %m/$.B_3)&['g[#{[z\Úx'2pYck6*CJnFz@cv7I)Љ$`s4{|rV]PInm^d=زd)I\=b qBg5Tġ_YǕ\\V:$| {In?B8^&M*OLUo|GnncwjڥEF007`| ; b _'tհ~!\"%ȭ2|o|ң' '/%}tZEp-]H(PeXCcH!)|HRHVm*h\}R3ܛo9TP4|!fXQE&)8P'ljh\0 U$$ѶC CהnD=yDl3$2茌JB*i)Q€'Mq4K#Nfzqn5e002M5mJ0M@BEr!nF.Br1?bmzo{h`6E|*>(gsoȵڸIv"`7Nq;Bi}pw_ݸ ngi9|jSP٤f]7Կ @];V?GUP6oDe^fn҃1[Q U9W;ٮ_)YFaOS|E$H2(c2FҊ&;&k5q["Pt3Rjj\8Wr3/:BοΎPPFfn=>XxJ:_ǘ5S"\adGTAQ^L m{{&=~J%X2=ΐ+sA"Wcc5O4f.^zS]7JV_&MOTn.ܼ0"[?kTkfxtyPɞ73slk/*j1r\ł cMLBXqŬ^ˏr'%rՒs/}ץG-Bop0] J\uV̾xpp_@)oJ'C%J-\@ "oTQNU1?Ҵb!Zg8+H)*XmYxOZr[U56UۖJas)YFi-'y69~*֝0Ռ^2Q2dFhFuxF9bI-9ks(5l> XmR֟"S~M, xfl6Lx Z[D쁀S=~N TNt'3i;_1'NtC䰆{60Z5=XenN kZ tT3Nu@[o&K5%B1̋ӿV/jO?@hMJ؋sEM1U 8/W=/4gb)ˣE7E;^wr)jS sH?:߿7"˓͉PF;_nxñX:\3u$)]L{dTw=*uz PXR=O{aO,rS҂B;@ēVK0k2w2 4..i`['|(W]w#!]/,{ n\QkR۷v0ZE6ؽAyd_ sU/&dRɓWJ\i(*[duLU^׭Aq3v9%FӤk &C rL㥿̽R9]"\L`҂LTYwVQrr*$ ":0!(g[=ol5ݷ9 Uz 7}>ϥ/Ԥ8Uٗ(Ԍ_đ$6&/;.QMuaUw7*Hꩩ-7 MP>GWns]gT]gm' ;`[۱pz!H?Ȑq۶UYDnEi.ʉSlQ-̊?#lJassO4%Pm٫K{,"y:oKq09w͜]'A'BƁV s"nX>Uk \%s8yxRk|/=HA76ͨnngT﯅ ڢ#T-W=^BW x$e* s-l~ ,ĹU!/)*ܑ&3ţt*Y#|i_!CW} 9gx0P&q$ȃx2g0_R *D5nSQI]b䓚!IZF 0zy+pЉtqW0%'LAOR%*d6 i@ S|"Xk#q.ʌ;<˶yaM>׉miLNqu!fxw v&>y2^Uc}_;))3-kvG_OlNDDGDuLek\BwD0} ) orGȾɤpIrAAZ+$l=N[W ,j[To6 zNM5W<2.O=fG|w佬I口p8fkCkYAҢhN9u ježsSdX[`kdS" @rVL'O"lxh# ö.]hջtn} 25h6<ՠ N qcd_w1\PzwNL!#vͦ˭s&ZI~_r1omv#Z8#= [H46*WĕFpeۿozPw}?)S}|yGOܾkDe*kbߗ}O\0QQF!r'QT ֿŚO₩[HXGl}( RZkN(AsUrst7{d;\iR `u\jIu*v;3VwGԈq]Fq6SQ!(RQMz Kio 3B.WRN4/hJ<95*\JOSX$j0)CJ?*bLfշN ;z Q)UAɘǝq;BIQgr}o ͦ!tmO^)FI˦R3g\։UrS7@%\@w`.n:62"E V5!+^[:Y&ә|"\6,%O Tʌé5ۆUW^%#fZuļU&XUb"AVOl9!AVLv\BBc*h1Rȕ sE%E>iWC[ &=ji$Z4׏5=`9^;xM~3Y]iXCz}Z_%an0qzR3?/O~(G齑+H[-|@䢻?ՙ0V_x\Y3eh*dp8H̾cqپ :E [iߪMqQ-,9s@o/Y*R̓fA{ $ 5q ^sR /ݺ&@K)U3݅ Y IQjbHtBvԭToWl.u[#d!EgC (PVl=Bkcz2պ M%@g/i N6x9.Zl>|;<7Oƕ4-3D'1":zz cxρod'%V0t5ۺAcI-Q ^qw񳻋8&'I>gaXaw9f~1q<`j&rl8=}|42*6nd[)ANSzR @+OnSmK`BxM^҄? s-LR|oqd_e?̫8`dt*2Σ|1Na'PG^PM8 E[_`7J֒D >dg?ݩFfC^L -hUB/pIކa٣m>Жbմ|Lӱw9Zf٩1?| DrK2fƒvΩ3g`̼,z0{eu0@g]nCnZ( UQj4t5 Jx/OxT# r٧D}1IIǕ n /=DÄs{Vo`qg4 zB%,+][pآW򈘴(1 J/,tlǩj~ŵ|~RG]n*l*ΡIҋ^}fV}֨ d)v,?3x\[]#j'Jt WI?L*Vdiԫ ybe襺eYUnv+[鎬" ̲Os{עCs GFZd"6 F M؂"Pf_8{q%¨D*dX};pAWt;pz>@҄_ٞj/t 6{E`'""NSOWܳ#0DiMsS匦(Tʋ5m}S;G*{,a.ˀG KwOn6AI ~:€ܽojx,Efq] jԡD?F #i"D!bqe)":KiJ42 '%>Wl $H3hVg (W\#;U36wz_+1ʴk0#T<2(xj?ƾW3%8+ZQb(34k&1+ѲG;Wx[$/LfxsRLx1lηҰ\]j#el]qJxVnRg 4DKVOՖ%f戆MbDP2tbz9U @_ |imb;i69(ʔ[Vҭ(+YuXNtIHɉk(> ˽IbyoᥐX|WYnGb7.F-7^ \<)H!*xͳ"9Ӓ5s %6͋i|O%"xvk.Ld )S(VVq^|e ;!P3JVCR,552C̗ "I6lǏw)uGYeHTّ+_hs_رUVr 5b%ޥe5K,JQGgrWMP 9Cq=Ɯn^5#$jH{vqjpNfNQ 9+|vlږbF 4S[ll2Zvj/A܁ER8 k5; AP-7Q1qܭ[:OwrN/h%ҭ^ ư`|?Ms`9L l?AMtܕ2,Ȗ;r>:!w.'\lGFP%f~Po Fuƨϣ[\tS*f8 kLupI u*$RRvA/v(Ghxÿ2vF8~fX"d~@:NWnޕgјda0\GB=\͚szPƨ1?m*P kB}evaN e0ipA3F}|$JE>T#ԙBñkwV,: XQ}G6'j-NX8V\y'A)`.x eVsbn9MvM4"8a׺φk:gkc3eE%ءe( 9츱W%8Z}J+j_SR TRͼ j2—8砜e;ƾs@j?l\n_ؾ`{W 9[~kLS9zB;mzuc}Y&|prbDZ~jBk/.*I͈E诇VHkD&RՅ^ bG2pqA\frPńnڪCM;z.U4vD۟|XY3}}phfTZMJb,7~~WzaRj=v^~z3~#+ް[AٹDoc7<#2I'{/b(U+MP|5eEp=Xͥ@,$Fcڀ bD0mɁrE KQ直%;/5Ԕ\ݽ 3Y;|'lf鳙(˼e"YGᒕ?6Z2zfjH:cBF3YRWN.D2h~ljp}Hو[񀌮]8Y{i#&^1ib{ۼA&~aa场%̢au+⊇/4(V6~!U f`_. >lN?kgB#?`J]M h9X \?KC2_`F _`]n7!|'PRԧٱCkHvۨ=+̥6Ĝq?i5s11X5w%V|׽fkCXIݮrs-t #,Iq;_3`_`S=}|O~p wU &l>V05 & aĂ֜wzW+~ܜXحN_T} MI(ZbjGY~^;c%a9||1NrN*^]1PC)lti)%} -ՊDMֳ yXh?_R[}ܫ/\2lėAO8,?j+O]Wz8G>gW,*^Inx2'[Z}݄S2x~=3%?ƨTHȠ"윲dsZJ͙F@5{v(9EŨܓ$l)06s䡑s߅Rx<_KcXp0$nսw |.ms}cSܰ@-ߦʏKp. 5_ 2JśO<s7 V'ܬIɐ+17v9)Nr>fMz{aBQr6TyW5'C7]{%]9-F\Ai'wq$WUQp۪fpj>0Bۜ$7D}\['oC9ńbV?uzO]%t?n0JЙsy`afsK˩"A즏fȮDL dԻ-AV=?xt(.LP%oEFPD§B|.@Ė(TJuK!;O)dL0hvA_*ΈW=wzc{(QlOIl坂G3 7%KV ZM$yrF_wCfYA#hV)PFtyﴟt$*8yȋYZM$ABz1nl(/a)+,l!-S\c UwmIK d֢8l|*KYe^y; xT|#kK\C^ YcPmEN2vqP;jO{63)F!XQHYݙzG2)<.!r^ameHqad2S{k*ԾKiZ@:P&kѨX3~vt([m p߀Ăl , |Y ]9BwU9WxK.<E6y'b kQҙ*n~~~~ҙJP$[ n\:_]eRSlQ+ӲLnvu ? /aͪ:`x}5濡dt x~ױߚTsӚk7s(Ic㒐&KT¤i]CC\-5x[Bf ;o- it<*_f4TǝMRHe3$OHVsI i{5Jڢ;+b8tz^UI>rZnu,&F"HnΝ1zS)[kigɩPA.x ɛ }r\1y[7{qğ>OdTq*ZKgxsiU}I1)6HBTƗE8f8[L (9KHf9Py(yd`~ huDp̿hT[bC="`TG zx~e#x{Ln1Jw1?sJdbRˏS3Z#|LJJv֜u39|R1b*EkܵU FF*؅LmYm >#6\8K)g_ʇ/_u^Au7(q1,ީK|<l_uI /rS4˷md{.RTmLayH9.g7=z9D<v<ә{e^̆vG<73m>o)в]j9 VH%<\t$Wŭ=_ ,*f k^J3lx2ַ0L$5/+%'^9[.٧(fⱛ9ڱK:[FbR.0sT~:I $|wB)k35#u,)ʊwKNTUWD'ɯf(+ʶv@bZ࡯yfjB*tUUt͵^\p# c+ޚ]J֖:woV(?M?/lGybpFVkUTQUժQl)jD5+Aզbb!Aw<{+:s>s][n7QՑ /)?JrN^\^-AFsT8X\qYBX:t~htz{[|MTt|KHdM:/O;_X4J+1#U,30jݳ>!?eȲ\'_0ɒ+9 Sr塭^wqCsrC{# LwGm87!]b;w4 6\ket/8q ]ss^і%Ï]mmX0d[qe!zB.x|v[0<۞Yz]PWpYiFͲphɕzmLL d9eH @L)3[C قQ]KK}$sIn4N<&f]cH%ZoBpe9LbcETqwv? &zŎl7DPm.}Ԯ%!jMY:$I[hւQ>kiV*ޯr7K}{T_1K5(y+ -wkcUf º}cmPƕc #Pg/~2y7YykAt+'3W\:r 4p8*kAiqnr`D4sa_oJ*sPJ6urx61QQ)F-½9@ݙ7Pu*ݪjI١\jwٹ#si$U~[ۖxB U,Gq;~k`dX]Om[:דg}F&Ic7ݟ>)yj_xmo֔}.TY*|*xoaΖ:o;>qeE™ԡ;.răwTƕw|mYjk=b:dIh?A "qxj:uzak9_B5BlŶ 4 ^NB=)+0ZEрujLJCB ˊCgLYv 0W=`)<,a$U!gҫ\-4hpDj: r{'MwH7kZQLPͶf2hayƕECw(=+|? > C:jg5sc @*j?AaP)k.Ycs//H::.=7Ʊʲe]]@֤~fl݄| ÂVɽf35#"CnQCq=tWʴIj?G](U6FrOR}taaEvaxԐߝQjyЂ@:?DOzM9&r(fhxth'$( N:)3+)tǟȁ“Ɣ1h 19XԹxCo;{Zk4CbDtT W[U?08۷qtr%LJɀG̠Q9wq,.KbP5 ]%I?g yJ l@WWihV-T)b\* y8H~NCMz[q8k tn2PqwzmepP ͬWǾ~ya?-iۋ @~/1N, >l2G*QeSfM22nTKYxI~f'l[4PAi3E\ɛݫ_W򻺚Q|,%Ykvhx4mNҐtb4k+ù65ܘyGcVE4p:nT4";uKIT Ӏ@y wmW-99a]"DdqDH|8rq%޿:# 4R1BPp)jں]?oQ9'>ʦ\̤2d kTƅi[/J=y 1_|}ZN#(u׋l]Ol8*'O_ROF$N 9jպ8Hr _f- $ 9[0iqiIuF)?etQ>;9p5%4v%ljvٷ|E]y ՠ9OmQ0k]h%,Vﵸ9U43h۞{_l.'ĦSWGc]]lVxxs|*(KV~=险X2sb}+x dŌ3$4"ʟXp3+ߝ ⭯fL:H2\-G{Y8eUkgu4$½Nnf ^XŠ̐սOAu妷u;qLq"e(p WKZ1M{]#Od Sw|&ƚ3).mGkͮ l?soDHk<7#4r+{Nl3NHb_ι(rTZ3LZ] ;*ky&2sq9J$yƽ^3&K([ܰ0hUοVB~tR KΚ.u\`RT+jERF08doz㒊4[YH`ZDq"b@tx-s[}UtE+aꍀoՑ{Iak*w.APK,"#FP;pܬ%P^sY`tճmQ"tn H95Y["\ Ea'YmU-@M-hbkpcew0"}h:ͳLG-;RFG}ۜC?FS{݋m:qw y@fyTD%㺚ZIp3{Oܕ-r }`1TbqAmKX8 h[>˻%ȞVJvʭ)^&t*LIp&MeЏh`"[ɨk!?$Ac_32 %/>Zm1Sj`B?廧G_*I[nEmoй,ӹT5B*B2Tkʢ#A.%YȸY3R,m\cX^-Dv/@n^+EyfT+} Q3[7<mb1u6+?7A~Ta-ˑ wJ]9Bz:ڡ\;*G^;)ŗNT %40緼߻$*ʅQ`ɳ-ujTSb@5NqKqu>iKqr7YLtSλhY[Py42 ##~4f3X xǘCj=ՆKzM*0P(vl+#qK# mUNjH|>y#ڄ,c#-ؿ܏)1z@@N 9 Ʃh-C1Cƽ) lu-w珊Ŕ2uFrRM0(e7UX0AfA+Pm*eӤv|;]%bQ!-jY|컦f}7g0n(V[ӯOE0}ߥx:ըX]M6OQTwx rJ^6w>dž5ը] p-9ݍa3TԇOR(P-";7 NvR$:[YOQy H5t* [& BQwdFVzɴ;Tͅ `;44>Ot*nF?p5MdKwzpeHqq(yZcm: ?7m &fQ$b`Xpd*_d5w*Їδ\\2ޖX((4TƟU0!*+e|*zX˟%v`ǹrW6s{N(R'n7qX`L}yt#t;UI&1FBxdlrQ_Do) ȕgKċW?3ceŇwlP le%i4Nca{X9U4R-U uQRZtU*n.;E;-nfљG7=vsvc EiY%Sys?yuFϺ|ca*{Z'+=Zwi%BpqM qN"#^s__Ss8"s>>@iɮ8%\X%C"~cqA'aAHDK"u scqȚWd^n,ᖗ#'dW>/3eسEd77w|e_Y؝gu j׸HK+>@+.߸ݒL>N#/$?ekgj|=`/c ě~5%-1~ֱlw|eEMIE_0G lSWfFe pN .pʩTÅ&Ti;!DF{3$0_ˬŹeO]mBx2GɬfE"BWΑ%K%Wj@j]pԉFF6%Zz.׉h=YܠLFmf=Q7#ǃ I zײLfMl_Dz=M+=תݏ2iHn` HF LQ'\zmcx>B_JHOj1-ap]V-U&w L>ݦmj۝* 'oq MŘ)~Cf@s":xh(r cp z1%c0MԿ\];~{EnWVSEՂ 5Ͱ&bOy86s]gݱ.#Fq -g=LAvI~"@wz WOlz7Lܻ1.d=:ccIF2 m~C´XcGj+18g׿N%2Sy߫ %?llKM@f md,>,zr 5n[.'ɨE, غ*颭݉ Lzo7=*+R7K 5N!Y7$ ޓL良l8d7fUmUAK@6fS˻&k1J4V=yfO_Vij{shs[}Sh<3[FꙖR æS?~~ՠ <,c{C'{@TwYysoJa͒j]4`A3gA3wj .ᾂ?&~AT&=^]8,}EQ]7 )PKG]E;csbam-m3+TȌDܧюN*TL"'P.)L&#_2?ym T>7"yRS,ɔo1J̇nHncAtd ֺIX|FBIƢV3, -2H#@E1C;T?\yS7^Ⱥp07R2ڷ%H\RZxH%ceN{d\ fPZQA ;\>x5>x{d^;ibx=Fʸ_7 H&3s="gԚJP^ŕIj.ű!ha"R*堡k{ܡua1ZlIX~?KTqU& scmüQ9EWB9Ͱ5c`ׁu$V<!\ZA.UHl)~ Vo#) m3 J-{ҵ+y&ּevpk;~" jZ_[y)PyO"VߗJyb1h9ۣ3 c27F!)=R.s7S=17M,SW;X{Yvջ@&'7 t#tsjOF]OoQwO{ & Twz !&I[ zfPB'Nu8{EpU?7$""LTGLSX lar'&nݜFaΟZ74;Ɏem91a>l?T~UiR]%Ñ t4e\Bu;trv#V ^W7sJl rv0:Ie.M;l%g~CO^1dbb? K~<D9,|MF5C~5cTBCs3[xs(WtP:H e`3^(%*:=UYz'Ē*G>|?r˧$ECZ.G">k 0M2۳pDlĿt>/wƅ.5g p[|dq{|d4PM {wEeR_ y/9˼Oi,rAa!{7|U@`3Nw]>6^Cp^2D^b1͊|y-,`wA.^C_j4Dz#+'Ŷ$ -8[i-'ݿnIvqЖt1|˜4+g,Xt_ .I)P,-;oC]c' C]긐Oeen&amŚyL#weiL8+@@kŒ֦ aQę;s<(uvnfdeV{g$^#g^5i\R]# gRxcA}.>~ܣM^`rکQS B΁1Jz-dT :#dP9i;Wg h8ę'ff6Sf56̷}Q7GD r4忛 ٹ1rz.W2 FKҎK~B (#ZL@MlT 08E~fIK1h?[VVN#.J4]U\RzfTkTZ,3"S)n6Pp祌 NҾ"׹̵% d5yzr8SxۀyeXX=sЂf;ٖQ5(.%mf{7ej { բpy7CPK;/I/m4+$ZV;mxEkݍ+ʫUC'e +S"ٝFb }i F`!"8eCz$ 2՞3A93܁<|l?)?Xp ._~P#I``3f!zoHbٍ`[>4&#vѣ3/3xNmmӰ9cS6硳Rq\% F>U=/FoŽy @8./KbT|hhg:'#!yOG>yѥωUN \55ΙLOYE"k|3Pgϋ"R55U2/ wlKJjrv-$lr7t&yktc+ǽ$lwV@oL}}sXs6غ4er J6w`^WW,vQzWHK|E35"SfY'# 8< km̱ۆfw9&Vf9H9Ė$'04kg,!dz3qL1=7&^wuV@tʒf1U(>(fdڵ|лU}f>,ؕ]hz .ƴ1N~UȀET3Ȑ'$[+o! Vz!B8wF‘\MEC ;l A 4)* 5:6I_ /9EXd4" вhav!ɚaڀ1֢=tŭVG4&:Ǎ"vQ>yi!,mRevÖ;);}ꐒSm‹$]kqin(H',krW$Sa2JGOW@=˲~ԘWD˃-"y\~AlXEJ]J&>5r5im֜Lk",Zg T❍Gœ!<^g D[#$poLhMJyqY'`WEv0Lj>~L`l Kȷ;guPRG 3ІR^C]]_GOyK2FtjmP:@.˿toԟ޸čg?~X6nt.C)[O,k1mJV^mF=k+0/w˘q.EnCWl {r=k@}_^I"[D{qt! 'w~ClWvD'PV6[V)ȷ 9oa oIvuD!a_S' i#䳾s5CEt2o I*1lVɔkXF%9܂^T[Qy)=M{|Yƀ:g`F̈́4fM_nt*_Y8Nf,Wav\8ѽ4|'OV+ >D26=qg%{܄O}EMEsvsw0-eX6;;_}{90B8.YO՝ |AkÏк1(H%y$jD @zƄl _8"1zWc g>HL"ix]L2atx={BEmS0+p Ҵ. dv¯0H z<./0`0CEGfFk٦~s+A%?ei#z*!{GꂮLbR\ BsfY5L2čg4U$Ե%>9UCljRRUMG]N`=c羚5B-vU.ʃ+aYNy"C"2ټ؋m,g3v{cIRB,S\neQ(RBo@kz=b@&$&J]b@k5mhƽmǥ)8+w"yߞ؃o EQ!dd02/l݊Y&#Y|-uݿVHqԗ7('L߻Un6MQ~GVo sIȋW5aa>h!˻y%K_3Q(S!Rn0z٫#bdț-|}j m|""D׮$Dۢ$6'wH̔aIG2Jh'GY%h>Y`Ȏ\ZN7R'Bk}e~\9\;@h& ܨ$ڗ,JJV{xOHӡe];gfq'ȺƠ?v mFE৥5]r P`_Ʈ.1|z;2+Mf-nZ{p֋L8,&>G^t gA_jQԝr}z+67ʋq͢|n;Z2GG}I{=G uL R_߳? :rL+ j3Z:7mqz``>ˀv SG8B }kڔX qqKWܓH֊-B@;O`mc*鏑^o- Lۙk^V:P(&$>PSdcPdcki 7+8Կ2bDs-ev|$խ-!gǙISG%2_CJӝM`Ύ?x4nCyKuO }NKz n%!ʢm vV4m{8^Ϊ$@YoJK歶5 ;3m ^y kjo Tt}ZJnjkN2urϢjJ]L0F$y`49c> [uPQ$ۏt; XD>&Pgy] [g.Sb{,ڒd!!i,x)ȾT+ ݧ~(xErty_:KwNQ0Ga*~c!4KM.봾%Q iW@=5]OL(uwߜ+:FnKp|VҤJI#Nl^~{SK6Oe;WC}nM" L BZ",rnp!̴Lo,jwg%Ϫ9eTkE5_ԼsWP~7+LOʶ)7Qr2؏eނu C\ ɣUbaa1 .JHnG/k5uq^~# Z] 8Y;=S4섥cb>Zf?wDHa,+} &/Z&į(4Uꂛ@_\dgʂPmKG]'_aqvӛ촕K!KX(ya/w=hb~6:J]vڐq^kJs)[CxVV1+kT@yI uU)7S?pH2C c0ZɝL:k~1q*u;^'&^n՘7 ٔ#>ҁ8k3hRƳ ቒa4f(% -8{ rpIvտ,~@tfS ]ʹơa˿#ylkw}=V8/0'e(a=V8p :^M5N5a]C$ݹ=5>V)_E>yx!*_o,T뤄=4/#zwΫpsbީb>̚lL:HqrYvh LKrdriG8{_ȮRn WŖkX'Ř|i7"&*_t `g1{>O jsGev ͔UL~w ?ښ У4nPM<&Πs}a;J=2푄 zC- 3Cl>'q+-dQ_cYؽ.Z?\J'xxs!5Kͬ&갫ro3mڿ}"D/K[!<]fo$7?Iݍ(=bOӧO[=q%y6S x.H!^kd>`.Q}%]1PQPFhǏ:~Z/JL8shUy2$(FbbYRw!TC։_k DZ0#bӵv?5 vQ FtMܯz[E5?O+e}MAr?p(!sAHֲIQ^F" `FJ[KbwHl@|iy+q %fdUrR4{私l&> ʏH[3 16S_s{ŒKq<|ݸ<' ?}:\{j;Uܽ9ųӝg@m~CMi[ C6J|c#a;Q)qe؁j^AnOpfW)YxwPk!?[\'ڎ{Y !.?)^`P:"%(]D>h4Q?fZ ;:u<gXGr Y^[4WTf$^ 9a *ІXJ=yuŃp|PJOr `lp{C9A+ ǽU fwL6O2gMH5(PiӀ/}7o53?v#>z~5~m$"hEi;_m.()셸W BdE¿Hv*KХ_{F/"tI o瓉[]T} d3RڔB;s/nNrအR#, VZ-Ѱ`%N_JHg80(O.8qrؽu͟?3#ejGO:^RZс9ng$X~0bQcĞVq}ҸmÂeM>{%"Pƶ/w5펯5RhD8=u:0mXw$^i%"N]b|N!oH$ݬ%ަ1B< !ߓ}(JtЅ $g78wfgSɓK `~Yl" )o;D=14OyuM$lMvI,4SQ+o ËKW6"Kj57wuopaDJCD6} hl~4#CyEjARvڍw< ֥beib4XA~kQqo7#v[9= 7yf ֌3]S6;bᦩYי^lԴ9D}ܐgWZ É @T | uݟ3e(os*tJC3@vmҘ_p] } ~0Q]D\&q;D4<̇0]mcCnezIuO]6Q-Ny,o4PlE>QzBE[u^YL~aTeIv.1I1eN:qKY{B dCz#}<BW]e~=Wq=tEZwj,k-Z"VLEZgEzrU(B:}us8QشFLl9wޗR\Vu Xft|< Y1I-+)}UE56}J`O.r5fL¸)g^BLX[Ԅc*7l,}lif}?9ڿvF-6 L>v|.ԁ㒗 [U9nא_ UGvKF4^HKdf7^U tkx6⤟ii]ާ (Ux/uDK.،i-1T"Kic d:V*hJ F|6ܭDU+vi:NŪ6Iv6bX[Zj zOtǁ@CR%w(?#OSSG2"'nՄ_>;L/İk$"T۲1݉=Zh蹠uˣJV?ZH{Ǧ_;_t2Pj<{,|Ly8gC~F̹U:J9}˻Rz4}b82TUw]ET[^;ҟjչrd*g7Zca!Z,T_gjXnSQ7r2%4OH2+z6(lVߊ_!{@EPc:xi~-4j6Av׼{flPWZn3qs1.9}ͮt;;q>?9_}[Ku:݃è.#1zm2w 1MJ o(D4GSxlr"2I?GpSeQ7IϙI;R ?廩}E `dCq]߬6+ǯ?x`ýY~^W;-ʷ'j(ȋCneqH* z"fLE%z4<7Zy]n{bH`ɌD=CO,g7 5P^dSA,peyN>)#;\%_\ -w~^ҠP!zr÷ځWqR߉j0Ů a J6Ժq_,)1€@2Ӹ`XüY?:]]R,#6B'RW~.>"$OY`l &~W+ ;aǯ hGZ`FHKx PIw%JИi%jv'oP.h#-˧zap̵¼&i`s"zJo2=#Xpn/*VyjFC kSp(WY:vT T'at&=*7e$]lU mG&0ld[τGH?TtvTύJQbgLr(%߯R>L#-4/PEv lXAA,;ks7,F;ʼ^=\KSuPN =@duInН[%?Ց7jSVJXY]Ff G9gVP;h,f|j'#+PڗKɘ0W&%}J>@KfJ=r&0LK*C*t)+{ҶNϮn '2.~gKAu_T{szFytyT~tk,!IYWؓ2X![9!7V8'yyA^EdNkNh$%o*gASm1u rH_$/9QğiN([Ҍ߁0dhgE|gjmJM cVj> m !B/bUl%\DV 9AN9g_{`Y]W8AaTRZYg<ԩOPJ} ZC@㋨1?Jv4K{gKx$a(b6ArErTm)JݤO_a!%h/.a$bBٝ^*Bϝ{tU7ZnMy:֬hPf;>ߥ6"xU55L9&Z.Gv.O`Pw7h PI>F(ʝPprV |8%(7}*2+fdKA/kBNV 4=*|BrWV4]\L"6Ptx5Է_OIH!5CE1PfSޤBYA|#M- #ŐzIF)ZpJpcn<1p$˩{KMįHn/|ql>2q)C8A|YpwnLB}'[ۻJT6 Nv]A-_>Z czzv$RW-O~RKYz%t_纋`LEi_-[#3fmnGP Wg6x,a@@}T3z*ofzmΤ'= \YfR.z_J">4X9 ¡w>P:I}NΗsR7MJDPLrDi4&]E}9I)DԭxtϕVotv~7.XHVr C+8,{qIs ) 3/cށա <^Li g7t2+Z©h}W_t!gPX.Æ4[lY^.@q?0 V;02sے@[i;5zlܱƲqo?K1<%GU + á>Z`&`ݨ{M2${_{o%m}sHi^?Ge.?'q9V/dש`緊D뙚y%27o'0I8W>ӒJ{JI/P̈73(x8nZMA(fh%vuZ,Qǜ;H"z3y+m4py~| gQE$a/I^IF uS 3ʫi-2w |5FxȫDGW=`nZlQ~IKsNim)uU8Qkz!mf{Jcȣ2ņ}vQON]߀?_)iUUN#rRBc$)ZU,ͥAL3|8RRHشcD#@5 !W,*g EvEtnxT3я86㑝npyžq ;Ȍ^^dӈ]2R~9f=ÝObBk'>vj;KHD7ϮiveIA'ܹ=We~:Tc^ACm (8*ErUr`Qyw}N)XN; Yf6fRm!UZOjVr6̝ˇY/7±NB &{nv_Y|/b/߰Qrߌn$Ut%ky{P^P٭ofU|x卍yZÇhre4;*/"O~s|bk41̙=(Ϊ(;1 ui3G*"jE߳""9*_bkkSE'j|3~MdQ:ߜ2(tTĽKο},ВΌrZ2T^: 8 IQ?pOsmi \=ދU<sdl%Ȯ,NS\TU߻?;+)[CuÐ;F(mяܤZRȜD94'%9giFL (F ݿ/Yyі&*|PSnPfOv>%erwNoj$h>ܛ10$s}92|XO,^Z)R(fC?8^th?-j2|TsƯAzI7%-Mpy-?ņ {j9fyc}~'rHuXEeA;\)I̛6|VC C^g!&\jOzʼnzVnf^yM<?E>;XҚe?{H_:|¦1̘8k,:y__waK-Grá$=x@SM5s4;4gïf7kZXMxDE|Nݺ@W_|i϶Pu'CjijY~:T}]~QE~ӪeNǥ3\cq]*`?o [(et^@uzBQjݛr@r*VLdLgh?TӦ:$E[tDTY'1zK{h&O̗6U݌t"=dxdz5N¿;pwlMj?0/h;ХhѧfYyPo Bp@ԖׯYM|$ z=ZLؾ+-^vo9Frޜf0bݲ\+J=jn^ySPW+gmSe"bme6zX ro% H>G`{0^+[pJtc6ZūuekmW{J^[OGu"$PjyxiVitY '_t&ߕ=ΐ{qq;(>"GfZP )Sf SYa]oX!)!nDSzHf}wbn}"wa&vD;_fN4L2~' iN%_I3 UǦ/E= z$ 98Z.W%^ mb:Y \.s) 4ا9:#-j[S>$W} K;S꼜OཀྵI3?I/0BD!kc6ݦ5M&0C_> 3N lAfVۉ+R/{uapH pvNYؤ#"_5= Q^'i5z;ʬX 'ًVAȵQ$,T<#dwT[ w,Ll7V+ѷgm;Mpw_ʹ6خu z;#? SPFE*Ds Pæmc;zn V'I₷~A 4%OK3HλZAƈ9].V[|ǽnj=0#i I!Q3[?蚥wyA'뛂e>pPt{{amΎQI3R7VVCպ,R q7nEwi߹S @xqA6I<\&@GX2}DGɋvz!?3*'"UW!2jް&G ifcny%IE[4n<Wm|/WeߪG+hVD3|KY~—vfC,J*J qR-#B5r?A9 ]>:Ez볱^ y~rwPIAgB*C'< \ K2nnӘ?ɉ-*'o5 5;A))iZ6 PFz{4Ke]fe/6D,+T3,G'{DG3'ۚRlՎ]\; +`jHT;[T3x\pѱv:N+SœxM/Q.a߻÷ /<^oQ .pӾ2A[F!W"J0a!֖cϺzr=IV)ZÜ2y9cki<%qf5N[6sՙʈnNn D<6fr)=wf?|\ah[Pl~:c&H(fk亮$uC;6Qш+3D:o$X#^|NiN[ >Fi ȆF]I.ǨQ63ӳz4Q @){];:=v4"Wr[߂0YXIF)v{\"<,/_\yo(Bܽ]_ Vj|oл>u7Gh' [Yꥳ0enP360?Tk+&Į6u.8M>=⇂LܖY-UK$ud9</POq']%qP-?En6Qk%cK( ?;h_g8Ƽ$W3TFk"6j&!S'0B[S[:S7>!e|dF^Um @}8$x8(ըif ̺9y0^=_Wu|Ngg䪅9-?][1A2`A>W|?yFűWTv8߂\@PJүD;Dyt`Y$m>՟Jk%% GJ_> ]zN@Ӧ8t3ĵ<ӊ tfx+\ afl~lKzZ 6=&ȴ&++i)('*TvK4Dψvrtǻ+ᔰz=mD(Miyz&rb3(&Ts]@SK,gD6i>dJM\:ִ /t||h D/<]ӫ뤩Tk/  }SCڃ>5!C4C-?Ҍ 0 4(4rHZ꧸놫(O% Y>DxaI[TT<:4uoJ&w ןwP!7 Y8L$4=KWRnnLX_VZI; jI,G ua7G"snh5T%nկ g69n*u+<(_k{ݦ(fq kZUǷ<ljAo׮&xh@loa~j, Px~aYlSvP؁- 7tγӫe$Xu"k&J j1c7|kӺK#oaCҎ6cKFYʋg7sL`DģuV*|À^'TMzYײ0VT,`bGBۀaZ9>9[ B~ ic.qzVU@,4KG"iJhH@ii7sYG~Ψ`Em%}~\nN#ÉVQy;~4SA ѝOyۼlx?][[\0%U~2ʐUl⓹ռ¼O"P4z0ȴc3ŚB,AÀU<%N[@kg)6v:s݈p>~9sT%~)pT,kQ )󾤻]͝GnXp\$YcT?1DhT}f7[P;`tzQ7l(g[l[["z塸\{e;B5FM =ep_;x:tUw I: l!Aֽ~-"Vo5:&k&֥?irѠR G>͊O4F59*1ה''?sR)G.nl)32_D%-/94Ț}-3Ѭ;Wm?.S"-Ҽ;k;DSE%Sgd>ܥ;.bhnimRS6>#X]ܤJ`+;Ca'x‹c^y@~vEoqoG528BPuk/#116$[Dhy"peEɣ{G&+\s4VbȞWq1B80| 'ga;aҪa׽4WUZR s<|#aioGKՂF3Rj8oc6G1g墺^^@ɏ|u}5<Ԕ¸A=_Bz*ګ!-'"f7=&6W$xa\i5- }@q߼d?_ Ё  u.oK}aZ~k 0mJvFBG-& ٱ{;V:ί='#1!XgVy GcB]D;MU yD#!b;EAX'Q9:u!.>k0u0\PRu;ZA3~Ьn(G'fSye]l6g59q<\_My~o**{Q}mu辞KMo=k3(ReAPjH>TtxNBH5 ?G>ʘ}K[ },AQnumMGBWԁy)3T$Fj*]u.;̟"-cƹrt9x~BA.vT&n@X \M&Ff=ڢ݇8C|;{V{=_+}"t=ksѧ{{UoԡyB0d6w M:aU”{keU,;J=͟2FnK2F1\3PBSW ƶNO~cM Y“YͮϢ|5ߒ ]tmitvX= ۑ۟Q'gA'C? ٲ\kw9@VXEEvɥw;=wEՊoͯ秉8" 1)WƈͲGEۙiV~(&i1)qz8>=! Nrm qvC'X Ј#Czl؝ND6_km^8ǎKӝl(UGlNjdC`u@0.2çX"6_ifob3j,+7E'H%1Agj(T[tdNqX3 F񱭎$̑ ~18,0Y>#+>ml"Kl=/9ףaOJVm 9UsVj5UӶG2JYu50Hn22iy)wlGY%tǐWV?j2@ZH, z?@ Ӟۊ6%dNmw $C*o+X^ogCD&O{Túo;Ft>!!.pL k` I a:S"y#Đu,' 3!?E"UeHK=ƪ!4S&jgj)p뵎~s= K7Ggdmm/L';Mdy".J5'l>vMvTGojWt6$Gx刧֣A=#p`4I Oё"X\ 0^%8bZ"X{_P.DF-) {~j. w*lY `[Yޝ-G`L^]q>@˴?dPy,h$ 虝oι"p 1e0/1nE i\9ol&OS1Ibi+HXq)wuc[vJqXUn4ږ}xe,ZH{t9;SfXEXtH+KWۯc'ywzEl yRZ$/iW~zkQ} \.|Q:zwiu?VE6paWeIt'!z!!7Vnjp$hrg^Sl9ǁZ) #G3&Ts574[=_)AC +q$_P%ٌ.؆{/} O r9 H9/%N -73G4[>Q.!=1Se`YTc ]?F@izoFYoވȣC\=~?~m q-k|Ϻ=P$E4hF4LN!c:M7"I^mtD Yj)jO$>LSV}00 Kk| ME{$x7K8E DrwL2PPeF*ݚ[DWفmgk:cA9~ /d)*٦>㰐gl^@諠mi@: -n\3C#^CiJp'-p|ϻ 41bOT~n1o̐_&{^̼i9hv}\KŦ}QC=w͵m&.?2pgo޶f@`^ +s[Z1p_)ɗ\R:E _mK*.}VK禝8Ρ;uԲ(Oܣ|*ѯzV<=Qplo@"?G!Gƅ}>P:,s#'NO23h@dm;.7YLj ;)k{C )KsMTdc*,f/Wz͘>ZX:(8%N0 '']v(0}kO`-g"T{n9ܙfztT-w,El]sSڒ9E^&fF} Xn:?r>(lP YU$ qC(HQXƵ"]Q ICu:r[oKsVL isT Ԇ T9(Hdrub?w]䲛hi|K~Kudz &/^\DA`xI64v0Hyڅ uphm֍E0DqpGaX^Ӿ:-ƁGmO d@l0rW OspuoVnT/9ajU͌[(+\Sj:J\ }ޢVa,ޮү׆@wC S q *RlT ړSSm7 S>Uuc?I`*B7 _b5rdg6h;#\~h"aIN`%O73]2(9_ H)jϕΔF"n3bYG%n\b9f6FpTfZ3( ]ݪ6k,[=_ƛbx/'}Of @C5EZKL~ӟbQRe'WRwLMtziKʛxe߅c_J`;yѾ^&i9.{Gb..;jQQAUkjZoWԮZj,-BQEFiر*cSA~>5sٙ鐿!!՞gFe=[3w1e?=WC սypDi';WۻAp2Q}d"M r;ݑ,}ˈO2*V7L=^~x$]>ٛ?pwOX6~Sie\/:`f>g}E@kIf졼_Q)O |R^\/&ؕ@/!4\4V j(]ga0, PM"-DNt:Z/we+@2{1\"w|/_{CLN̻TLt09o1WnBMLHJ NZx(|$c˰b"C:51E/t´Rqa8iRpҌn,Hfo' ueZw}oط@at=„_:Yn65^n!) FJ{? $ZMF^&iEOjNP&.7UAA4bЃl{Z:d-w0S|$Sy-7 ãA]Lq~)"QV0+[WOQŜhިu!?LpOgftm$R 03 MܸW6]~S,j% 0-/ޛR ? ;P^Ǘhc],s~FB>̇%hՔn<{*Hi+Е: A2F^DyLJάr~wA7yB,릟j _ s'#bD\?_`Fn >ysHՁzdW*]vz~x)~DQOa sƨr݋*Y4e)^8zSBv\DSqk}!c sm G- W(މλvCoztI:u^ ۽=º~DZ;d$)!Ἇîe:'?|u -ɚF8ީ?G4Ł!M׉ʰ_2t+"͎-Ysa~tx8 zybo{L P_L/^Y92V9{bRhI|Rޝ֓^z~oɰ31dbw@lOyGN3k$Ys|?y(NDu&& L[@-mWYI% Wō%ԯ Bl8 JDiwlHu {C,'D0x踑D^!qd6s"uQzGP S]ii썻Yz,vwLN0Ks)mXH~hf ҩoDzoP^ױ{T{AL VJ=5KʢI-J:@߹y?s-~ mGE^=dBd<XG{E' :󆾢R{{PUݥRk>O|F%nr Oߺ$z @sqYKiņ-Nt,@429c ; ]WLQ Kq5Rb3ΐC8h2dPy"J7WoFR&B [LK^l+CI-P~GzFI&!l3;{3ay9QnI ;W|;x tj;_Om>}.TrT~ Re?y –Y ]C\\ G)x rQu96DtCjfGp]&h֫zKg+Ä^) E{XV5/[( "n g Q5A%2[2әZJfbX+&$U5mm+ʪsAXK 4TdhNH,I?[r(aW&{/#odGA7'U\`p*8wƕp:& z@z'.|m0!Dm` ̰b&˄oD$b_D=s&+P(Tg]m~AUR[̿7ڨS2+M a_;_V^q3dh?l1v3v6{^6v1"/dn}DQg`Jo=ĬmY7!n0:t+IZbz 9ꬴ~T4)x߂.a{$f UrG6ՏFV*#e!bTpg;.~0 š|ܓ7k_b08giK]( XȐ2r}?3 |: $C#11:,2_|;oq;W!{[/I|fsEo T@|uʎs]f'7=O"Dt4PXzom?)0҈6k JȌ|BhM}ӊH*9ǩM}r){Io:0er>tt׽W>np.tbGfQQP͘{y]]`d[}{7oYб U%g̓eM*Xu X{4 =oO;jʄS5kՃArB$I1=ކ@ߥx ]'|f\,U[(t5΅|bܝ\?m@_M#H13bDE5 Qsnz4C=8Ljױ#"(KZv&9xIL?A{i毠hsGLNqj'Q-|dM~ݭu);.JXAÏ #[%} V> [Ci|'-X:%3| _G<bIe[wt[l0"dF;Zd  Z !du *+V6fWЬ[ذd%B3 f]Ruh=:Tkcԟi`@uLLqBb]zө|ng.S" ȼ|ngE!*1W>gÏ&O0DTj/|L\?'9Iбp`Yœ~#瘇?/ /%nQzLU85^k?e ^v410:H.%YupwpQfq K{ Vy%CL0cd$pvUl qq'-{R1mEVsqv7 ק+;)K\G=-*|{~ ϯs_u)ߢ7x6M͉ ™̬*vH`!E0 CaI F j'%݋agOK?+AEO?bA /䱯_T@H9na\ {m7#94Nh>Q㓡W AppA:`eRHO iN/XaHmahh%-Y4=N#Dn5!rFe,H1RnS=Kg]>RLl~^Օ#J"]:izqzYDO#-IVr:`K+V`akpf{kW8w( 鼉bfn\} W8SڽvsLe(x.WPKV0A{ o.!lgHw圷y<=E gBcمZۋl)f 70sdoҳT8 l]$5ݑ$_ a*._;f^4PNWCpuݫy6JXYF02-A˭mH–;WP9rNUzElS' s7*k ķNEJtRU$GHf? X%~ԓ]("O^a\sLvcɻZC Vw8TQqsTVtX\mcېЇRf q-d9<lG *kSͥ\,D9to\>Ї1:sc5^a|@IVP/ٸ&HhR~J 51E%5{ʱi{;1us>"JX^cLd6&cY m *mӉw'9ڂ*alIfa'[w fQr{,XPmJ>E8yTo4UC[+F4ln2)I\  X}~Б'_3#Jn!z|#Cn~٬%_͉筴(4Qz>S{1cgޗ:o=#;Wp$_usz|P" \w#dUP 7_sSW,)Unʃmثhct9Xf[..jmpmѣ{M}؛"e[F^rsou5z̵պwo*צ>}rft*U6"8Q/y-|8Cv1iq[D'6HnvVCy*ltDϴJP)lW1X?fuHOIY/R!/C L4V~Z_ i_$o=+G4bӕn3/yCy KƧiP3}j\`9˻ۙ^)ڞRݼɉMDihȩV~${?vKΩit;[Ɋff.K,Dk7Ԅ_ #ѹcd E2>TP_Ǐ'W%ɽ-gφS>=Q"Pe+`X%]`R RK7hD`G K8~3ͅq jˎ ]SqXkd)Fy O}xzH&[oݜtwּcGnosxiR6h-^q",?r>6UO Yn{7urXnGW.HξB_#P7mzJKN6K*[X o #_[e/ _1v-*!?<CJt= S!NN G~f]EC z߽_~~#2#g~2]XcsY3/-eLh¤_/׿U%H|PcVO H[V3PCxR}h0K/=B ; kIrݪ_>'L^k3 \ IQ@vHK:P &g|YYiݠ{p9j7@]xJRhmQNkᒹ@+d%xQ>c:Of*/,z m8|x% ?]yXwvv:.HԻB]j?O}0T޽.W؍ HqTpK3R>Fc˟%tX_%00O݌Iqb0`Y>^_ D='Zh5^ X(0V t[b3ą a v CnckAڻӹ5ly+mE4j`uzޏ9;~'xN]nQ󕘪 ) O~Ԅ4@m^D&kVRHO^;~*˲vǖ\F%ݭ]{\aYiN0C N{v ߅r>] =`w46` `՞zJ,2&,p'e.oQBJe>+Y~ctpB-.afBkƽlbuE6t[lI@aWYY!nx*I @=3=6b.&K& 1t~/,z&}+LvU=;YٝihlY2q. PIʞܧe"f98 )ts8ZF|ծ%$%wVOZȼVL4Yfr$cf|.Û\%I.?ܪ3˄:|~4ƍ$m2)n}D3]΀~&i%,+f\q) O"5w w`TzftW2$4+Fhhlr<5*^YLUIev5*0Ͻɼn9>!X>W&ݛ8h RNY0TLXm 91p`=ii[} {K$KƷpZ㆏sΛ\?Qx82jf22~U"on晒ﳃ,Ȼw]'>T9Q)MZ6| G.~]UH޸P+G0RԜ&NO4Pؼ^ܩ;y+?mLC4N2'<Qt܎|ܻ> +e2ܰ~fo-8dHiH*)$VB7vX@(C}*i?쾹m^Yu -Y;A; Y[/€~2WV)luTN^̀͗u[xW٧nS[nY+kyp^PVs+>GÿX\8ԢzO=3'$VEis[4͞g궪  -cjH8yPCdghdS-α'|:,]];\覵WWML' zǚK6$"/y5^f\ۆ1'ǼM>?wm؈3>v"m^`tT*ڸoSCAi̽+zjB]`%q&Bi0ۊI@A@ns }bkJX=TļZ[ @ {T1QfKvt20y2 ke୸w%y]ouvclK] S"Șw!TgCƅѾ\ a\ՆZ1TqAR^qb,CS;U 08XF8 ]s~>)$DPY? yO-RqjR* i]p5Y%.Ϯ"wY!. =T.BNYp_, QJh~y1m|}e̞#9`e] ZK8è(1RjCjnȋ1Wcqe&Z;MhPx%/Wd A-5/JWdɳ٦nb'k!f63VP1?7gZ єh}#c)9$z,;52' J=SS9Z{ گ5\[PLSX/geCOΡnf@c>?(::Q(fo_au.g q~ Ur*wksi! oYaWD㣵=ěn|+!sW%`sqC!BJG^ Q?`ot􌺱@s ^DǼ3ا}-u;ȤP eƕO"oѷ6G$IWrpGB,C(w &}$¿wFD־.kRLOQiǎPr*9rO\S65 稳!x[s; U$A#l½ļ^>O+\s=2ݭ$~?̸yEvxx)zׁ4\e)D⪦DɊ*ס?q/g<^ km ;k1gCV͚Xopށ5̜ ;?A|fTM_M4ύ-Ur/\ߦR&o ܒث.8OhW(lkuvU8ЪS}Ad?7 r =Z!+8&Iq!KI$1TWeB~^( -PO웱v..]S/^7zY%ު>. ڱB;7#k's!K c?L 2NWrTsKn+%vF~ txTE?5ʕxn2B%Po$}wRjTОs֭[i,[+OXP'eyE>_ջX5ݥgJv_׵ݰN̹!٬]w8ɱzf. Ϟ`o$;U{Wd˔*Hu 8n6'Zpfp[ )Mvy: F2ˋ\e'R&یQ<fĆg[nGo(IC&gaw(2S~e5>ߜ͹3F"ͷ FH3 ֗n~-ޭXM3&$A]LǪϧn_wb"W I:tC l3v>EQ ̻{_yJ2-Q}µn|# "v$IXEXw`*ڨǺf%}9 ^8DG}ppi_|fe͏E%p~Vych%5 ttF!ߨ_vIoI%^ze BmaDLjZn>8s`Q=n''m`u5KY{o=]l 1nU⋥~ٍõ}:墹Gmi 7#۾-rZ%:xe8+H+OONPt_O?~1.?GTWe&dZR(bPqUq%ͮtIoxym',=$Z݅Dmky# vrݕqr ^SJAIgM[oK!GaX zAbj"W}2toh,Yp1I]>mrϳ .9iĦ~[TˆYJP$~*hg[LڠH*dPr[2 ^{ `/T/[кyuLsVLR y""+uXzlCGքa'd2$٢$dS X=r/+Yrz/nXx&M?H7}FżO? d-wF/cmtxizw ytyPfҴ+U!#pI3 K-ʉQu.Ԓ[-%ٷIݴ#O+Z4ФQExS'# nj*?jY WRR XxIWK8buTf7׃Einϩ.>&63pYL 9*QR-*O+hg3a.0j?^Yc O!+IϾx# 7 WFg/3(wZAAX3yj,0U<ePLNx(9BTƮV(r%q'K4~0hK}ib_v(k1aAA> A}CQtIB~`Ll g5ؕay׎T=:y$?]tŠ<>ͨeT[yO*@L_Zz EGۘ\E1 'g\À53 c0sսcv >;3)үw팍ۮWn =>fG0  ұ|I wvI=POh8hp=LS@x6̫^.Q^72c 'F<[Ֆ~R{߫\؎ /k{6 *j+/VO76ᤁI0`0$"ʾdtt8܅{&Dب&#զ7}a"ȧ~oc6zjb} ;S-q팡9>~^P6ZJt7~Ы!P#Jd3:'{e3:j~"V$z|Mi""Y7"3FSAgRU d$n\c]s{:Շy9ng ƹ2Z_Ѭ:SmSѪu a.{uç8R]-M[1]?+A (૟EM'nS%&{9ЮF+M*p3cſt)No_.k3䂃K\ RNQv 8棋c5 lT-?sJfuS!$/h>mF0q2[6tsCaכ8Cz$Zc蓡>Oο^ι^=]Yy-~(kj񞒣yC,<,OduBK9Z &Zon^#yֿ^fd J^ΞuRKjJr/։,Ȋn_ǡe_KUgLҨ22rν4A0rJL\մ.o%&X@v X^bRWha2,pGEVp,ůR Mh}ݰ9@v"Vӊ an(>YڐyGkn֖}zŹx15BB$͠Wjcq5vL4/?bL)Qm5s(ںDsa*mކ3UoK(:7|(;dpR~o8l?u\ o ^c*Xc~Z@u[DLmco[=*OI[S̲ӧx٣稒S$.yܻ½q:q:=U#F_¢hutn8+e@b[0hpɌ*4NSdkA_S=ݿj1b憔UW-{A >-Ety+)Ґ?ZH.\P֋_?V-6| 3 >$Mx` {%nS u#p|4_vfw@MjfFB6 3h0Ĭ礈;\1^nx=0j5`ujrr]E}QYmx~zć7&%6noqTۺU۱)}9,*pR1O.kfztZNmy<2dJԺdɖUOEMeRQl5Tc6FtIMu l^PKcTq)2Omi./bw} ,u(LX|jtaEO嫭_Ӯ9gV\2 cj]܆G3j6q 't h:tgnJh giM|~__G o7MeM"3L / UY*L3߱vˣ%`wp[rgxB*n  tm{ʭئw0jmrk!} pfe~a_ˏ~ ɽZ4Zmȣ8J=aZ{SbSJD+˟*Fm>Wf4r-8k^+T2f8Sm6qJ!p'6vJ!RIg^.R|}h4s>[#y h,%Hhِ>;`C`_Q9V^+z𾸤 Sⰶ..i_.6mI][(HIDɝZ' z?]dI)༪^l^b.ܦ*MpMn!4;t#Š^LjŒhTe)_9 | jW]q\\9`Q`0xBeRG#W+~"!#gz9ˊY '#[L׈ց."pp?q4dӣQ7iCvR T}fՒoX÷;`ҷnѝE"j3- s% {%Cޭʛ#ǛEߺ =zvP`ToeF:Pz ]~,i%PS[pe!n ҽg2rC=~%e޲Wq;vؤO` TOA)ǁ B*r*cEGۮ~2@]7c^{!~ $A"FSriR :Mt.E/CKkv?crYmiӳTS_%jt+wXo2x"2$t%3I}YGG7xV](GDd'Xj&?6pU[+LbiQʾGK<g/6 )@І*yKGF]olgd_7:I70,DSU~Vb [ sL{q FloCy͸oF&kr_{[jޔu'J\Y`R5K/mp? ux> *u24+ OaWdWk e5j;o@N*E}k>Srro{pOd%hO+`ma\O& H'h:\B%"A ;)EID#_j *)bjض5\>-DnTj}?=ߌ'P f,kJݐ$bֆbQ>u_]SEKQ D?vLI5/U-Ow/՞HḅN}WW/ڍw=Q߳|Ang#K޻X*/.j4xאwϋ>'7kf}P&KfSώ4- W`?.9E%n DR4GJ5 `S bPɟ,i)O]%F̚3%b+nZ1%j$jhSŢJ&_os$v?` R$,rjB 㞳Ꜣź3w&[9 qJ-Z[ۓ_ ZVz x´glj< {I(A_!&Nە>-vUMsV2{ٔUÝylG$ {}b^IVIAC |f%gZ0mlIn]CFqTy$!&.'^(gỲ =/HفKsy+Èb3Ȗ? _XMx)r)qI(Ɖ؏s*Gg`oֵ5wwjHZLwA3-}orwE3="nru ಙw%tvv`PaݏbYKQi)$ |⋖ <|9~!syؘu?wqZpXiC0"q7gxDn.irN LA2SVq1fc ᘧ0BE~RMNkeW*+%|7VQs*_UnŰC&@}@8-tOgB.ZϫLQƸw.[9AgQ|wARvŒkp E#Q'%(s_NbI+E.Hͺ\kguRT4Wq|p~la񟜋Ug( zHZ2$7@a{<4ci Ul:wdhA)dyW0Xmz PUmPN $|ysʛbAh%tgGvcT"dDHmL:Z+w)aKb|^Ԏ*U\ a-`lS 6o/Q/C`"נ_X ΗC vL _L%fnqL%^/ED j>a^}?0:W_ '3l C*xsLY~r4n0g~ۓdnA^K` 'b;߿.s4S"w9v {c&Nf*n%5.cHvYM|}#C| ;M29'S|*lZ hq@v\e Vp3 %3˫ݰPM\}Yv@ͷ]jaY~5y] =#mow$Z1͛/K"!L5 zI$,o;z{=tsItos皕]eƦۚ8UnOy` Fdu); S$yxPZrf0?oCF΂}ovR %.8$oID,vv?v^~) ?s "޾:'>. Y⌦ٺM\BRo>=d OڶWxZJfR<ƧPfm7)?J{idf{+VvsϮTpR,5w~;wQyYÎSJpDJvĞ#L'f)S5ѽf ߓY trG;>`n?-`ƕղ gAJSEVoxd 9ڑa֞ıټ ڮU`*Ͷנ>kж#lU!ほxywYi,W<3sraubW,eUsqhIֵx Ў_kjw;kΥlqpo6Yx NK>v=V1.;y#9%I+  (KktQ{h'̋l1Q§jmNYrI9N&#>cƊ1t,X0f5~J}SonGK Թns7]4rztbvOB87y;;br7 7ŸŲ8^(J67yBg{|kf?Fv7bQT 9Ͳ.]D.LW @?h}ޱϰ"궒<[OVֿ=ƒ:o.%=ݳooW⏊> _fȮg)JpΆ;]/iZQR%"觍}.)Aa4*Th5wtm'jʧV@| !P ZG;;w&Dm- c0  ;lzj;=Y4؝.T>H#\Yw|VP].4\K,0]P\zwf%Ou@Fs Lm4>ÍpZhmMojߜBiI5) wIA"j+ !Wq)Qvq.eZc:Bڙ7ZŮ+T|ю;\6|4|wįX5Y)S Lޓr ( q!٣b^k)U{dni~gxNML9ސgI.Ƣ|!-D%&oW⩏a3 j[}QHۋ[ȞUva_W8CsųRO %ZL]UZYWb+x9v-ip\'ykFv6{ojPv7]Y.ChU'0o{~>Iet4ohN,?-ý$wj#qB6fQe8afGW؜tr{8(lij X` &FДH/Kbwvyמ/4ȡ%y߈3@\ '+ǖ7<]2n>Qeh 3X9uJ0˒x 鶤rp nY=w]9fZ |p g/ĥ'_j8;bæ]"Yy|sv`B,AӤ2m>6_V#=jR5BNm"L!9+mZҼBBߓ/\ͮ4_`Vn<7Mw2 5^*JWӗ}Wg n z6?+Jl{ME{.ga㉒母24sQyߛRjY}dQ;jO**E6•cZxxnQv35I!4Jg#r8Z84p30RrSƝL!h|TJn6Rš-(EQC #G׭)Kܯ ø6*7l2$U)nȰE+>1_pGMT J,+ sYḃ 50;<{J0 x a:hkS(']b5^[SnkdyJ׀:]&wDz^x|{"P!kH OKppT]k}9%W 䂑#)/x ,ïQ$ +ݱz .pky(7wJR`3O4_+8OBb{<.6=su`>2OԃVg|m.^O9Z<`2`FzۂBZn:nCo3R#x"Z^˛rIK" '*ٝįq(|]-'z*gY7̽~LVLSv<KuiS-XJ9TX 9JMH(lpM9v}}J<3*DS#4Z1흍'zmZ ]}a>|1tckTo{Xhϻ,.=w1v}36˫Nɬ\鷔/["<7E5]T:79-*/.>ѫ5;zfp t%v# #S[xA72à#.Ly;28Jd|j)$n^؀MPg^g@tuMo&Dy͹c7*ʆ5.uqi"J@TrɝoK?J= &H>';ʔ;#'fF|Ijh29}hWsFyy w^9]D Hd|_6egZǑ\SA1iﱸ{ r !RBv+(ԕqkb`G_.Xk7HT듶2Pj?Sai’6ZZP+Cԍҷh!d@ ̋F.V;=PvPu G"Q6({S`Ŀ +w,8]czR|KV( ._[,[ڽKL.yOMc3[m_I| !4D+){LtrL#5wvo,F"goDyUx1+}TڱlF$J‘ 'l&֒³947{t35+3%A!}ivJ6+N~'#Qǖ%P-h̜A"b!^>tmboim.qhoCq)!? [?T UmKN8qr>%\;(;g\joƖ2b r̖n QsVPMf醷F[N$0LpK?K/){P$1!g, Zp03|N4v7sY]⚾B( ʽJ‡,9m=~D O S~DI)a;6M,[8:=|FvDDUE-b[.voR# W6[~ZPej a=Bu!nK9J8qgk#ܿ/4mމIW _%C. Ojԝ QglGS@ j[q pQI yT@C(x0|nrL|Kacu8tZ ybmZ) `[ã,ںnk!+Wp-CW0bz02nkY8Nh$I|YuQgH/'Xxpg'~ӼKWr##ֺݶ<-iI깵s9’54^rCYAPXJvr;͝.X5T3L5 xaA@uFtQT u?nnDn5PE l] s! 3,l֕CzgBaN ~t]\`4#0j# (G&L!z` ]]}v}IяW!Qr( {';Ꭽ qNHNijCۈ|207+A}`Hq~]zǯm%Kbg"_ɕm8|?c|,:eO:Rd PrY^d-yB#Ϊ"|hC: 3|yr a ?dz9dzeᥣ3P2eaY]fY]/~@Ɯ=p(! %qf^G> aW>8$ Oj;D12; "yM$"JjoeyK65tK"ybYI{K!z0|_CO[Bh˿BHsx6'iBu/ X5i֐Rՙ9ǀ %frjL]k7Ka N[;* <Y3ĬL‹8j|{u}> >ӞF3O0>p&P*E,l_2}%EX[2vIi?irOlV=}0<њI9#kA `5 R}Ew޻k,fǻ9!`PiW}@QނȌ{ץnڨSKwWDv׊Sc1C pbcuߕNYO4_2EL2ܑY=)l3o qFv)yTٖ3I [ ZhOj>xKg0Bqwc31CAjy,:5kNHXH &H-gpWejۿˎ|w1QeY21̋Zd6+Ȱ$eRuYso`SDiS񻰮Trl "]<~=1l֠Nj  Lit<[vؤ[=S@ƾzThT M~l܆ySFԣqMEmߋ~` Pk{oJy-@XGmj`/]f AϢk I| hlbs^K~  M|4v1&0> Uނ,jJ VyOҲw7t\HQk%Lmq@]EcTĈp;q^n-&ORPFrP}X eZH3{Qn~GdA0{p>aWXt b"KJ0\/hҶt,*VK˹y|d)U!7JzyOqZ:w%_>&S>;J-)ݏ>1{ULށs5/h_ЉrX!uqfVNr[;OӶyoߴ?yVsϲ@0gʗgRNdT\qX}~Y{֬2 >X1$kkQ\EƳk{w4o^t2,a`Z1uVf+5*B AB 3wcr5,~j9Hkf1 c̈|=wpי2ɀPE( 9D!c`>vnD+,aP˗ٶ]^Nx Pd@K}d8f.a64\hY2`bw Z`)e0o]S]ķWiEAܰC Lq-!m)*2A"kGaGJ~z'k쐭Gkqwyy): #tî2:.}д;x"͞H8o;cx]Iy{ENKȺ~{ł3"L#Аv꧊I .p}USCe >E96#x {Cy2|bS֠碹Z){HO>-(2im_w W}[j[V0 ï3Hs0D0e>:ە':l>e_BS+Af{߰]"lG{3*{ vm≔u[u EzwL"17MPRRE*/g $%,,K.+^A"bG r`Ny`,yZBNܔIM>Y72ﯧҬ |o-x5J"AzZpy6vnqs ݾUG06x_eBJ'?U`淥S[vqCC(<s~VѤFkZa <%,xP.E  5Q-̡ ?VJR0XoG[m'?R2MױgRs8K$#0F! b_eT{Թ$t=0GEB|}lGmf"5H2y8cM:m,$M ih~lh9[9TtG$`}кڦ9~ʴ\3YΟ~MD/@6v!h2{E& e]34w3<.0: ^p49<-W$j 3땑ʼ+lչL5{8Cdu {+Q ~/j9pyP GC3}%_ Y /;t?|] Cc)8FLuL<}:jhGٿUwf(('q 7;1L7R7.n'Yy'+!L=h|b޹JrA71#[Z$T6lSO7pn奐0सǕ_'Q!ppZץ7"$snG.nd&x+Pez˼rnWq% y=ЫLf|tb">DK|\;&.7z7zM2/Seua>D <xjӜ]0za?A8c"MHqCߎ=x@B߰ XĠ1!# 5md-)ЕUa>2}jMJ#sXeQ*H ՙBʵ`ΫB|zwo~`vq{-T˹ebݯe\jm}ڿS;?CΏ6#WpCxN}ηۻB玫Ck/<4Sl)0CaN* ~`Wv-h6, :S6&X_Md-pUS).f,֞}xНHgs<0/B+44Ae`0'"Хl͂~RTY)Xc_se^|ӻ~Y}3[?'t|.ӔNKtf* ;:P; tn|8&E|ulja?tS_ uOnW (mW?_͞?c̟;t2"Rj3A C'>N5ij8B}ټN#ïJ5 1|{Qdg>m63 #yHeQ Pt$ddV'ϴu y 3Kc,_6^wXm˾myHk[̴T5B,2p&Ux &;a w ꜉~?ӱ1~ϧ?JvBU[*&r3aÁZ-XdѶ |_.?% _p(5%Aå!|u[Ѱm gcż/b/1k: Ct4RE Ň;PY'XB^7UP.IGP|N+)!}wre8bV- U[1T/g6(h R96r\_ˍoLr%e5 yiH ~Łq.w0!<{]!:dR $2qQeD8Fx;^jzK_ [=`\V_i-wndR]'tg6&\_ sƼ9*Js1[6nB ]{m59]ޠ K@*7]Sc_=ϴ\(OI9c." xq.3g#b0*,?]Uv Ig`KʜT adHWҽM1@fwc { cnfm6y\B/ڞamֿ1z^jH(HYursoCj/LIc55@ R˄!TQ[ޝ P py\c",Mr8m-P mPlSw 8MU&I IPQH+DY!" ߑk˝DJyyΊ]b׶X=?G+_ ̀TwyY`函1*g|` 6e9KSGlئh *8 :}3+x;E]S }-~JAA/Zwq,{+GܤQߩ35Lti n%W\)y$Ow~u6PȦ\c5hYq:XBHg]OeӔPFdu:\㨝0˟4~ŦƞJ2vv4"̋= {{ri#;AG.v#o9^kNPL1 T&Q&XדZTNFG3v*nrQwGג.ZAA[yd9>5f&g7mqTXXKω6Q oDNep/f*fnZ"._`;X)^u'0y"!֐ J͆ZI }Wyk^+bO2-x7Mۖ3`U-fjJntYi>*'8ɑHg"WÍ]9~PzuDαihuJR$HB=NxM ͌} ޛ V[-ne_u̷Kg#bbG3Ӕo%u|d~̿ī)<)f缑#t=ƀ̟­{X4 |GfRZ)? i Ҙ32Xﴄ~A['8k,J{J |BZYݔ갱7@PxA8Rκߴm8FFojəostaJ~ώD [u2c! euz"6<-[^acțˀUYGvtC%[|5ׯSXZX*O*L,36`"Q&FRE*M oASDD_ꍨOGdKtKjYHp1>v Ip&.JkF3(_ehNjt5Ȫ|+Ụ=D8]; F YX>UKj:=c?hߠ;R2_Zi̮=Y8Qa{;Yۼ:zҷBzRBXEe;AkS2ц/zWfGޫhYo>?VZ-Np5>|LE;HeOySiPOZ!jףt5(0X r]Ԍɣ.~J@ΑW>I1{ *E!]A'`w粂xn8sQqyKø0*FXZmAk )P-4G=E@F=0X,޳s 8 %[}>ڀ0GZþ0 쵦{V~o^p{|x|XWvZv`#<:Wgk;Z`Z.}4T!,X=7ӆqh2-yؒ ) 7j-~*>1 `јA \.) dF`^-΅c6KS̆H}9"ҒLM1Nfm +er\j[a{v`bHw+p%EA9-noAUKǍ{@k.L7Ve>bJ\$2`Gʷ b,a‡vUc8TǏi@UXr|̱wZ {\)ܳU*q _յ͛Ц5nV㵗' ƽW/8|NgKEi_[";%E噃t@aWE[ 8Bu αWɶ]hBn{ܩ}[)^^Ք<~HJ /$Y}eY0~|m'+M[#c wmZ,)–Ee^Pq2w'2r<S2\y+>5߂w+ݯW.P(p#y2!5XҌWTˊBʋO0/^) \+ԧ:U;&5uj yk* sr >pzi:z&,v#&;BWǒ&9p!4/c!]tʐL9bpTI'A"'r^Fꨥ݁Ǹ5"ŏc|/ZA]DY5+hۚ0x˞`mz$pigeIe"}O)2(>*ˎ0@UX%id[cxGTx t_E0V`zſ6G>i>dÊڽtn(~ #[ԓX ΞM_OF8XrAɗG\}=bxNWbP2}{q:.Rhw24Czl ʫn6j: @T^u/R feԹVb5"aA%ܡ7!U>yz)~ǵO&ޙ RGpB\<J[ ! Gpmw.c9eC ϯδw"^>H۫Geך~/Ngk+UGt!9+" ΏR5*+*sOIu6~Z WvEN0P.CA.^bKڕ܂WGL*GW[w&zUN4Wq׍.B ANi2H؂lzkdk{~u$?s1-̗vpXcX .Kmc*{6[yZ4ZdKJDu@@ht]IUl-0݋!=_Ų7%Y13GIGI&έM=覮l $g%o/]1/{ LSԵLNGF܀o5D'7?AWam/}*)J5\^GvWe:>_4}6f֦hr^DN4@-(Ð& 3cԮ*e*2:4ڤT۶3K:Ħ(SZVONJj!gqYM\?ޙtB_z Hs~_6^0$,^w)d6ڕEr.^EI.l' '|X-( IF3p)+'6ɄRTkZ7#g {s+ׇP '6!k "?u)v`X91H/*iOcÌܹ-Й$#{xʤٚf;&l+F̏wQl͞$/u麚UcC9fῂT@DlXsĔ*GXDRt8`(OeZ$)pQ >R DdRt(pr ;=H~M|/B)OҐGΰ\3ePcߐ&ž8W@G*Ar(AjoXuXV9.JK>y!p>_X.g7#UsIn$$_SndGFBK|/s(vqf2u0֝  t=9gdXSf16h,{4RfWD %k|/2ŗFpO~sSTWIu_;2Z8 teW`ru.4D: π˫@ݱ&TמO, U)NSCvZl)SFg<>P){m6 h#aɣţ9C^X\7w(Vݪvvݟ!d4qJIǭ?ԕclzsdQ+&ʎocĪE mڏl'N` ӲAKmiDH(N.vbֶE_PIc#M"7>w11d 갂}z3:#0%j:1_Gf>$GdFd;~[жZ{#P1zsʴ+5VDѴj^NM.,A]NxQ K,71(e$ qkcU1Ȯz/͹v-P]tT}h!R+(.P%p*`Ft)ig+SkSVUWF f Al1#B8@2p)TS-Y>NVƔoxn9oYEXnhX0 9F 30[ie3B[IIy7l})Xšwe!}v1>R@HLTo](u1fvvH_if"ՙ"L7Jz|zҭ氻gڹ:k MrXxԣ@[[U-weڍ= b 0]2˸q;XQ2 rD"j3{VyfhBܛ7$Թ VGOFl ͏a^BP%~;~Vț޷ V}*^ҥI.?A(_7Aѥպ݃9pAŻb0`f:Wu؂\15 c^IQ0:FHGڸn39g^ztdvwdĚdO&'AcLX~o/AA׷(:MuTZ]jMYZA7I{+=~b"b;˰ tЍp4$n*g3vY$n}: Glt=s]6sFm\/s|tsưdXd1.+XuS'9i͓ Ƃ#(~I6apQ $7ܽˠ]j\VDݸN-{H"TTwΣI)ț> {/]t="ﬡ:cE޸ P}Y?t)kB0*0%_w"-ۊW:($ͳMĞ/5>Oxwƨ.8l v@i/\4@Z> (:Җ Usbߓiu8f=OB־.$xˬ6uٷ--9B;MGB#GBMZqKkF>' [m);0qaO*'*#c8~u7y|TL~@>f <~ F{z:()MbKz% B<Q8yOxjtkXu/{Pu㺔+8yqI'(eӟ6P2"Фo@ְ̑t\܅v@~|.B_k|hVBG34n?8Nlm Q#Y͖;W<[WZvf.D"SFl]&;SK mN7Af3vG*KϠVe)뒍R SvHW焘9 "Bf 0?IB %H]? 5!<觵(\^f'dѮ89I%Nmq ] ;_$F_#Nس'q 0XMd5~}, qމ6L]AJplSr0lq7'Oq> of!wJkeOՖvz l9~_[aq8F䔂cT}0xRt_xי&?LE]M~:*_#~# ?ݗiS#;=X|p4oŴq *ֹ*m:6n98~ۋ"::7=ear]*%;&;۪],Ygٕ9)2Z5P9̀9]+f[͙SքSx 9܋N6%ޑ$*h6xC/CshhUw%jZdZ2%GNb(?:Q c=\횀P5;gYէe} nY<|y Zъ#q~^4 C@~J3W~M&mrs"l- r+m ؀pW˨W9zXK, A" F>t)=KuyBnO9QFc5- HpܐA\UD|XiWiﮎa}f/"$}IwV ky%G?ӛU{S\94T% .5^;ǝED~4Rr/gfv4S,M N:edqmOG]6+J88P^ğB#w~McA{<lNS9ad# .:Gt-;6 G q.'0qckϚx_gaׯ}!6=m?~V B1.84Q7?o7J㶌?lVdkqW{ρ . 1>xHYn# eAnx~@)C,WuF$Pjb_<"ĪG|nk_ U衹q4afVMopo1j1\ JHH?/G޷⪊:[k\""X* \JlEU4h{omio೷jK`(g!W =C*E-1Bl޺Η2S&B.`· Y~;8H5 Ey-_Zdx`؎i kئRL!c 4mƲLP Xܤ a\ 22}Hu+,~")ӼK7v_%hzv0ItpPuJ6sYZǯ/s6vA_f4a7rgsuKFxKבtMH^*ZG ))`o:$\6la>u dzy= & ?srBxOtm$ZҰ-gՕE\9W^nyJm457QµP$JhN98hIxޛ]w򚱑?hDڸuvPV:k~%kR$QNM.Eds^g׊˿Qz$xMyLg)Z;ËN4xr~~p7V#(==87To{}(A˺mM ; …Sl:C;)JOgw=4IVMY` aҚKBp@̡nּaJG- ߇Ret:zb˩Ë^ŧjNcEV?ٔ 3H,oJk&3Dՙ+#[ i$UџGV3[nPgu૓UIC_.,ZZ?X:WOVz_r2^;YfZrdY;arjީp9v.A 9jNFs8P Dm|~ٝ(\^:  矞uD M5EI4Qgv{[J{E3뉽{i69} h U$]=qcBVlݼ]R&Bp-Yoد;>U٤tԦ`t}WVH`:Zf9cBs pµ9n}&;~CA׮,w @? = )?߲>P\%_5Zr]~Bt9!S#XQ<Դ RyN<#2.)%J2E򤻧W}mE_ggS&&v7^R<5.0g)m9ILjjwwpzӶJUtgD6\j_lrtȋ}z,0x2{o,ԑ~b݄݅ V(.RP|y{z~4~x'O5)خ_'9:.MaKTX'Ŧ^58 ƭdڹGPT؉N_U gyL9 F~>~_uCT:]qpe\,&B"LܩU0K'ʺ;WB|0 lzhhj]SYT0 DH>UG&fetT~gԚhWWUSb 2M(#bv"v:s!r۠tMByt%%.Wh[噑b]fQHnuj | =yAʅsd z"MDdSvFG7dGԄvNܽG؋iP*{7R=?Z~>fQG㨜ڿg yɽZXޭ C!_nyLm{6n.iz+(oE3`z{&%d/S9ϡ_r8V<:yK:ʩ3ͽi}a2U/`V;ZM#$$_ s=#QE=dZΥwܴ4Z3Tܳ=NE{"$-_V:qɢewNf=0!(>0T 0XKKF=t\Mpbq5cS&sK` 3Krd]9GIrt=s.'-3x w|^CWnS(T/y\*> %!R-wiP7{ y@@ r1rIur 'ovgmۀԹ'Bldv6x$zv\ ɑmȅ2'zK/%GW[sbwiiGe_yʂ2a*fH1"İ\ۛ䙜d#N~U> t3D ip4(gvRA4\}.ݱR`^EѪXej-^?>#0،.e֍֪P Lyߓξ6(IEjT= }Ԍ4m zjBIC2w*L J/Ţ%[ls7hq' <ˢ :qRzKpANwe8=gбae+uv\F <x㥡Ҭ6MBG ;V98={Q6 ͐X%Pɏlwuing8`ಜ[iO+qe27f&BQͿ,9dIuM$V W4'D>r ;{ l~\\}QXQIׯ#*ʪJ=}\8|-]L]l]L]=M=<]m #~^?\|󖛋- Ps?_&/Oswjj͸"N{ {y{! THg4W}/Jl ;eaK'vs+ kv_'W' 555 .;wݭ5U,,h$E}a;Y{S:9:{504 ty;5jiwkj^v.6KN^j^~vnn!~VjMsOܜ?\\¼\$qt_Qw+a  $FULJ݇ݖKHH 6ܗكkkKw;WO;g?-\E6bv_əܒmW )" 2@a z8b@ (n :UWxe^Դ_NrugÐdX9S pEG<*>deyNH;#aBy.$p:5%GIe9Riw):+SB8d9&|),q)(%;l/#QUޗޭaCin_+$J1&zuC0ihԢO|pWX츩37Ki>k¥oznz[w(^ T;ZhPٳ Hb֫xmlU"丁 3[{Nc%[ 8bQ$}b\Ukhmʰ#ע-a_۬# xSk g+ ]_a m?Pϴݐe M@1T,I4>Fzl tEHW(t ;/'N`p8qhyw9FYͯPPQQ/.Sr l2{G)`b"en:17>gXp8湶RN[W܉BBEqb3ZhSQz*,O%p- WI>%T(~e-X9un,j?߁j*žV+Wr5F"y_uTʚ)I9n\0~hY(]ѷ׏ #զKGvԘJFmO0yvQ|5&>-;6LsZ;gA6CѲjś8WX0",K[卶 %]?W)J\i^ń|v Q( Whr|^Fx3EFxoُWbEVuV~E@D 9Kd k c'0n #5g]J  #}W*AvWUuexZBT` ޓziwAҡD6<["QGz -4f8ZWěCj(|qvyfe^õm(^;q*"1ڻBy|섂 ĵe^W 0D_rk{9$3e-2QIٖK?wGfɨ9QgҠ+^ { oKBp" 5˜|$6bqm$K8eSsVZJtũrIầ8FXV m'<#P b%l˱@T<6L %1"q,QRvNܩk{2Z=EqG|꒻qf5MѼw?IDXT}oaKvIdS$<5ͦT}2&:RRl4'(O$kZNiSz%dG=W~~&qh{ASU4 Y[+1ƏݥhW nT44jUp/Cl!;X%F Hqn1k`Kgj9aBс5ԗƂEDַ,cgȸZ-yjAeK=\rMί+*d'b&Ф=Dو,1 uDk+?\i !RH]bw XQaZ_ S$KcxyٹYLq?YLSwqG+uKkΓ҈|]1]]]\NX+Amc$k qg쪞wzM?;8X:xyZYt?/?<||<NnN.~wR_Ϭ*wU$,/Jll؂:W!U\t:> *d`cӀS> ,;$ t:]i=C3Ef ,2U ]T^ A|gf":$|U4ܗpV$ûk(HDNuHXm~Q8\ɪZLRN,rxO!/%_%WTFΟ:1jE EU3y䯼X/$fyw&)p׉t[C5-2[$Nc]] 'kC"6ePO NC?ʇ%Wl)J.{7i+ͻl$5p^Wp)~fVuzDd}iF|-y/JĘ(TQ5 J(Rl5Lj}'yk+ȡ9 .l=RzKû' ('P&!4#>mLhEkqpvZ*vKA9ˆM) F_p0ӛA k%~Žah0^y~z=]9#?iܱH-yqथ^2SY6[ ,CO#4ˆ^xAn1FX'L UC) /7͘5K1s +Gs_wܟW%p.4E(=Q^yR!,#h vh,-t=KLm3O֫MzqX! X~# ITtY},FO0YI۞Ո:rp`0)+s\$,w9;$D iuK|on^ Kfz5"eIU;\{CgJ^߷`\ Anȼig/Z3_X0>"B??kSum {5R^ٴqZbKޟtm_F{ Ypg6èW=5 E@dOJR \ݬ`jf>T>ޮ@j tXXv 7Drzd=IQujBw!%nhVWVEشOH7N_>wmi^e1m턜CN^=,/@ԙ~H#Kr~=a+)Cbgw>F.84~MFLQDc/aJ10$A Bss3rPQ5ŵ5hq8y[~{kœMbPLC\ kld52سu WAOuϿfꇨ5vFM uI$iZ:Wtr ŴG4z`>{:l3"DaNLrz~["GYz?)6J^W.XƁ's=1ߠHP@%dd2~I CUN4{v<~`b3VԘ&^̆$ԺSζ'&BƮ1lb=#3>Hr= I+/Qٲz̤uKV @-;Y&;af2q9&l>rȍV\<2I:>͹_=Fֹf?BE_ՀgຢPΑX,cUڅVn/茟F9[&-cMi&nEWD-jۇXO^Z\?q<>Fh)U'}6Yj^a1d[iEZVH1E]3.JZ~`_CP^35̬kV o-VWif[ʪ佧|Ij}2$}I(&"C>[jr"eͳ\%"GC!އeQ.bjMD:A(q\,ni4)gk2+߃>C!B$Wہ3 rᲓGsU`|v*yܞHGZL$ȃIbD_^|nv}5q F)T.{7ע4qRZ+t7QԞVuNveK*i%'~c)QV;,򘒔8(dw՜ngv`o,]ےp\L>?EJ}v1}zRf;GʨGez1ϲxlqm_[b'XĮUdFf~-I^F 5b.$x~[g9`W2xّd^(88} >uooDKjp(CD}ZQ/#ap&FӘA޻+F$>avHR7 ߍ)rR 6 [JgtdbH>`84̇ӑ~Q:&dj}O{SE,u<#x Bs|癌+G0AWҐ >G6٨gk0-bHescY{iMx#_nԎw:QԦt:k: _]bBOכh9>M2?g\74m p-TG17NΉw\Xn,0BEpBܙ L.z Q4hUፊ욫a#yWOOiら! T-'|CkYq w?2~1|iQ^8p`mKn¹k逺 $kgt7'28Puڬd.:+!P N9"Ҝ3wH7VX(ɸ M AؓPy@mSu_xn0.wZ={s\gWx>NY|ꌈջ}& 5}O߯ћ1=7gr77_ID5\/_iE!`ޤ'ps:?\\\ţ"DG>E'ܑܞ񳉡fx#]>lOB)>y4V9ټàLt+BYNSkjФ*̪ m̫+my%*5~bd򏮕y/&owv3@PK/iѰ @կ9;`fhrJ2uQuyXkkdb鎎`xl3.0#Zq,ڸ@BugWd:"bJwvh^RIOv{x6 K}˕%eó/7LpUs Fw`1EW^C_'҄~Eb>o;?\odk~v^D^5F#Mnaz;ʩg=1j'@bƨwVdڿ0nL$~e$`aGZ&Z!r'*DuӤpur_bm ϑF؁Nt4y2#Ywh- k;T^{9-6lERo3 R#e  M$yϯ|$V/?&N9>!f)!I j\D=ڵ%&!4ӎϚd2PXsPl2F,T\M易1!S=џRVV&8p(ފ:h,CFMa;x5m_=ko']1# 2qhz[6m>˽)HWB15~:2LPasZ]'hyu]0gtCn_T.GyCdd]8ۨ1"i2+# K9tLB_4szcllH=nErz5߈P06 %ZX/9H5QEV(}~ K2MxVbfRRXb[޸1D\3ܙJj12m˗yu[%uP.PtQ2E #ѽ Sx uWu|4ڢ76z߬.3^KհN }8c/7[~Y!kaV!_i늴q"*8_ƑĨ)K1H)Rhl=N9g1sw*j@+G"aw>9µ{+5i8+AZN^HkP"T' US]3aMJzP@ R~=lF xWnsL˪xA#/Mb`Sq FFꃟx¹vB$)ZOg[iniÂڦޅ.ƑF6kWYw4V6~~R( O;vIFʀSG_:Q[x WB23A[%ەVGF7.w?I[/:5 UE-%!YOTY:|:m#;?9?߿ п_@?s%ztNr>c6" ߨoG$T3ġ{ӟ(Gy5 ><]H$<2](ՑJ=9qվpS&CN%{ < ]exYj6:*u3[dæR*4E(9R 8DOK>mPp@]Y12&QrNUEbg*chwO m="YqeUd8dFs![)gd Gaz{P&Q5߬!/`SAnj;Yi}: M2r C-O w{f_f?BR pл;1eL|G\' ^tH#vUm\͕@ƂlHɍGv|U (¡zՅfmEV6Fv~,$xwPXO~C69'H(Z,_y% K{6Q9asJ'1!mYFDtޕd(iOؽd r/VgGRXtūkU1vi A 6j ;O|:ۍ#J#v!k^n,'_=0\Q'':&&'ʭSͯG)0`pےv(R T&Qaf2>eD#ps&U[~ ?8&QfF\:IT5{Ie%0?83.Y|ң{IB.ݟ>`WqN|xOv|Zm XV4I97rL3gLt e Jt3#=7qFSvϊJ+0?|=$C@I !8LTla!<Ңo/@@r3[[@N#'Z5mr(?Y'W ѮezQoR̗eRHD7ow |eR6;KcKpjCn.wˇI4{Xo|Pʒ1z^H^k r7B18撳̓j|)JfDUh Щ0-)d,WAm'{DYVEA.~aUH#v{S}Ƹ`7=M͊\6CtO*ֳg'$j4,7ޛ7YonyN *@ Lo-yxyB|df$o[K8՛yk^F<8>pղ^Gӟ7izew_@?"6/(͸]a 'uf;܄ˆ@VbW9$ZT+渦v@0e|U\IO} {mfU/\¹skN ^4NCܔL _N dY߫7 UV/(Zj扷ݷw or1q[ +&ӗƝ- ;YTGS iJqy q,qPV??\2t-"~=z7XowiKxAK6u}vO= [ck}ۼ8ʟ> >7G4W} m_cd!U}^FVz8Flρt"\}_9"S7U:V?, L;-V8JS'ga&`jt #JX*OauWž/NQ6S9L/*uD)557?.&LXlPK#7斳q;qHx4y=pky,ߤҤr?~ ѝoa/#Ҕ-59n3/?`=wB6ԶɇHW=f vowOq' ( qqIFtٲ榗23/&|4jzr.jMIAWy{iU#C &ߜXG^>ٺŎi>{iϸn0^@#{CKI'ǻ< 4Ym].9w[>?=e^{`>T?^eѵ7&r9UG2*2 V&Jԇ@ˆ7ۓ9~Ѻ sM'FFNus wQ;:p0͹zD ^ |-a [N˟4M7]Է1G*O j4۠D]MBSS.G:?o.Z5@ V0`v"X,Z]+[}B!/ sSp{`IP:YfYf*gۦE#UӝQBԓ vG4c WI,r\w^ ׵0I>O<.R\g6pZl\E[BI-4dmgyYRM0:ue(񆧻RA<:X3[_% Mdh#P93l C*[Z8|;FSl]5qv:0K|]7?j8/N%o eƴj+X :ǣ#ɡc&uNI}d.ZwI`Pb81nj>zeDCt2))Z-{U핗18Kăd܍&=;GĻcۇDZt|G/׻Ҧ- };9wr9n4Ø쳡KRdxȌQ\ujDژ[V?+)yk>?YK!v0Nu# mکo>`̽7oS#xd #G4Np_yF$0{tpKSL7-u'`S¦YL5jw0?Lf5.km~T'b|NDfxUgFry=#e X_y'Hӎ}VvӬ9KR4Q;2{`p<"'y0, [҂coH&5K۝0*P]g ,L^xd{=~wT-$|GCS"鲻:04 :``wUk`mHYIo쫜0D3ZhtP_|Og藄R `vlыrk(*l6w^BO!Êp`iB-;waݠ:lUP Hm _vn|\J-#x :FinJsG "v}qHwCkEB21jlMisGXӛ kUoCfS;ףs^b6~)ΞaFGX.$hfojlj?0-oMF*5 fEM?an D-#ɳttis_W,4S5TGt)IT060oHE]1n9+>2Ʊ,\̰㦮N׾qu8}vtHLxDQaP>K2U}nYgyr0LKQPt8V׸f9򺡯>`}XN䏳Yf 됂|Im/uckS~ZOD厃5rck->–z@(+۟$6AvIn6C=/FJc,E&e&`:eјYaܱNݏrq=Ir/qTTW,eQ= Oja'>Y Y7}lWw.i-"֋Sﵰ2v,ҿr tᾚZSeV{ 'Lmb>&rnk nPkNz9e֩gRp7iE4 }}!NM3zo6i.} pLu7so1͎H7y=ӗ o⹆s#Ё9,*G2A3P~7zze~)6{'1#fD _n٬^?mkL| )kDw- UA9zQxuG#taG'~O^||п%L8(Qwt#d~464Uri63"aJ%v{zk /t$$ KXށ8F:)`]^GY^|d`n t Gh&%R8GeWUx m: |2T m6e%ґS*5jw8SK`wjS'幓x>n@vVKw@_е'm<ӨMnH*Tc ukt0Qg{eF$'N>MF+z*`4WS:$z|<ܢ',>wu@S*lv/w*a|p<48𱯩\4p`EO_vY MuѾCÞDk5 Kš 5|濗jɰɻs2#FSGCi-s'P9R6x'oiN,?Y|m)˶m۶Oٶmur]m۶ͽ܉/ndXkd]HXZАN엱N\I{R&0sxRٱ r]eb>hMΏ`ǕOeAh#Z@%<^;Nx~\כֵ:3bv?4zƾ󅤤.Yw^p;/O2)LLLvuשU3\]ֵbSмD~i|5S~#qzz"HHSωa i *-Cg9>D暩R7x7]qh}db099u} 8T?t}G PXLOlw[<7d5guT+sѓ$ /F{MH[)p~{)8p@vx皣lH[\FgIk+.td<_;Pbq!%)\N#kwi} Xgy?6ma⧩ D($'ˊRVIN)|&?Ӄa\ #x 1źnH4xhie3n>"t$D]&#^c]ơ B_UԢBLUU+`r`~X< > ,Ф]=r}lr=Neh,m0 %<`Jj)4EE?wYj~~ezA4 3m*9iN&/*5޺Y ')?Tur瘶Nyݭ vlcTC8 `(F1ۖ UCÙDxoH3O^"g {3jXhcྏړt.2IUl Ʃ#tus|vWf?c+=H}8 ^M a_XHDXol3 zб$sf7n=ܨ{> "HIY!p>:~&)ue%"6y⁻jG?fB-k)Gdx`hѦ:Q=&LgsaIGs6prft"9`.?WYa2@nC`R9:4NCZ)vx%Vz"N ܶ/DDyw#NdK4%6Tfސ pqUdvρ݆N =0w5qoo@m:=B|; UGxÊHՍjg@|dĕ.{!Hg4a2tQ1$k0ts|ZG鈢4P8 :eC pԐɍ71L͝Q>XeUILy;hy$lڤ_YRwi,627%2lJUJxIwYOJYGtFgma|lۗb8Bs!_-L=W#{:bfOM9լW Aq)v73}zAKo& r2U(ر .g缙~N x[|HF-s ~4~QY4e*e>ۚǍ%&/* yJ@aU Zh1=7{[q Oē`Kr@ ј%H$鹉0Ô:~Ob: k:K?X49]kk.عU޶LMrx QdKUASeeeE5DUdXBŒ'6o'ԀeZ%i";y?u4GP\&@>|q>ȏjΙ/gEqt=^8Nl#8AIMS ! Mb+dߜ% )bPhW"X j<21KD'[⅏SV>vɣvz*4pba+OO'_ۋѱZdaZlgGz-L_ 9̌G bf|dȸ#`gđܜQnZQFƸ : д7o ~8VnhZS$JD*\QhQ&vjnz \Rp㍡jl RqX#)`g:Nv1, d::xe ̱l}']lFM#:$XJG!"Yqo8RHYE=i1_Q.?G,Մwnn#8}*jpc\TIuI$Ճa>Ҷ ĜOR |6k2URNWaJ_]ngqn;tE fIMr5[I0aQOʽ^5 *ozLlEǯAq\.ZY1JL aK6'5+gGil0; r$!cɃc H޽alDʝ/e_lpagkWT5JL?w]5͊򱺭&OkI.g f,}=!k9-9mSn!U1Y0C/gqNFdWX5i+xgܠ q՘o;s +Ieb4'QH27r`wO1(ށ `=F͡> FqTD~\$.Ρ]r>S,S,tԩ 85]Bo[ߘ[Ds")b.*!L'=3hlB'ݔ?Ofd˜y~Q&e >eQ>WXB? ے"Q%x֒c8jYqޣV(=kD_ Ow7z@PȤoAy4 iZ49t3=(UKEKFgeU#qs s VH]ȟDNjDЇR]ctH7iB gHADK hK:A˜w=DoJ^:d{cdr;)?-ptvZG&8`,5z*Ϸ^LCq@l+9we^?t$Y]{#>]aԐS# GJ/Eҷ%&a֞Bhrr~QFZ/խnh6zw8?^+~ˤ'Nm!#y`Fvm OTDUǻ:ipMKwh}TJB9OzA/Hz`M$75UVxdV~ʸFJdݨ F,dSaд]ټ [;ZL vM?o{)`aeeegbLE' L_|畍6\^ z(@3m6I P6떂f t DLcvo5"|;oD_4|^y٫:cUi9 A6y( "7;mDrjtS$dlA&c$$T6%ҫRR>cݥ `|?DXKFٴ ?ήuCq4‘DQEPET@=NhC2K(χCzwd}֛&+.DCP- \x*ma*k?PDzX:ϗ_9? Ϯ #BG6F.6òh\ YIJ0sZfr\"J:k5ގӞxw2)QdXzy@-'ZH3@X(]s J10X55WV&47E DG*鱿0bA 9܎lN"j) A -##2!UgX)G9("pCXmq]y_\^/ TearIUdvY5n~*a 9+»}(:uxJS*0z֔[APx7<^}禑xv;Ԧn@wXV6=?wֲMo<26}7 wE x1c3aWhXZ N(T>&ZIZse+lMNYNXmĴyPM+T6/]-mU9֞)$eǣ>۟gJg& lQ;Hk`Fg6SQutM%C=<%؞q,:kK`JL[3i$NƕdU 9E7!9(h8&1$2i;\^٥h!Q2{9P>,H"@fA}8gk0#&s jaf}yD \{HO F&,"&`^CC 1p̀t}c>> f.vBZWUu&a \?&l -oeIMnV2PNW 4#-$@.{e]CĖV%)w F ky^AW09DIE_5Y-kM~ 9|鯯Hro+Vi-.E\bLA4ۤ<['pq#b֥w| hBFY8 VlK:7#Ulʆ-ce[dD.= ;=lƑB.Qߔj ж*B4v)'zip)}0c%}{cS3XٓMSKs 6q:M "DIxcCUE5 nA%W6yKaA}RD+MX! YM?,Fku$M[(:F0CrCA󑟭Oo01U\~M(!BQyi+ AǞVx"zWN--MXlu@ZNJЄZx![y6K*j+ߜjw2Q,UHOTp tw]ӳY Q&}KzS:h "4 h (􉏿۲PeFijc?zq:!C !vxqS"H0$5LOO8ܞ+y:T*"gH|P\䑮gjSXL+3V f|_+yM$dIt'4Int^C;\Jz@ltn" X,{r&պLHgLpcә^[.|YPW\Z8#ʅ ddQY*E6&,d]]?`'σwvl -OZFLɵBDH”dܳb"D I{2 :HۄO;U:\h~$GiZgGLˇfLpp7QO<3<_C}?]] ɤEs`2 $Iٽ?.0}Θ}qqq+oo:MYkבE\TRb]uiuiK"`}*3̐ $Kv !2 ?0:   ^RGa2 ݚ濷bݱ7J|S(Z}q۽Pv甫L'ː_,YWLaCWB9fO+(/h]{Qv#k׿BĿhakYf{wٔ3BKMq>X`OQxz7ٙfDK*O(/7g‚ TTM!:w[Fskr_)U9`kםgǗyt}bcQݟtLpSUgeh.&N 8a*euH1^qL [d5b6H8K*O4f 4qfyԶ:qjCnHRT١wb+W LĕQvh\o,n5OL|'1q#@!ŕ8t=c܊fП?ݮ.%dK!؁qAׇ~9A{R09{ OfҾU@:8,+x #+1o2gà&Yı ZL~jU1V/jQ Xעjع^ungqP7!-^?44% y%4!̳n7ܩ:Q掸R6fE#,4cWu,n41"wˌYϷsFǍVY E24lۗh~Z -X:G)Y5)M sh,89Y7I~@[bUNݓK~^ZTS!FlV+.O,K7m|Ѵ-[w}YPmWzjũW9"7(p1|{'pǤx`=DErģݕ8sK)=itH{%kAo2p0cPBgJЯ}~_ET>^i65+uhsJE=$7գuqIë)'xt̛0,LIAs^lwsdHa ?y &ݧP0/YOKP!E6$ O(DmbCFd8٢: jlF7zPCVsBVѹaXWu +C@&g;ϛN۲.ђZ%oBeb8Z{&V/#i#8/{E$%ZB14o;o|+#z$aW(Ddpz FTUV bc˛U nsLmbh)9TfVOƙeT iitlaXOiX>kQfF]>=+-@N >ŀLPd(|#"$h1 ZX|s&{z;._Аy]G r+Ls3X&8vr @Kx$q5[nD,nRw, b8|@LL n 庎b #|=,2fQ,) NYͬJK!z:6_M4b}= *P΋9dn+d rnM+)˱y\ }dޓalCِǢ`=g{Z!Zۻ틑!:۞BvL uҽq)NSU踏 z|_7?s8$_䥒yMh! ~B46L8jV׹e!9#`y#$f4y-p^dNO\Ud^HD~*u55S=gյ$|W8@ut0MN&`Z6͂t c.}pՖru 3G|szelttb2& dP1Md2TQ,?!TIU:]"|K6~g$0?UR*QyD-?Q=zm#yU' eu4oC:Pt Z~D;T$YcW{% t%Ys-r tTY%'&&PsA uzf27 d,T%_x>wkM\\/>O)Vpj0gIVT`v`j9ē` |'%}]{cڭW Uy/ꍮ˭q:җ|4E䈐4+dbbNx?yx կ2F"KkyON :CJ/ޒoͯ{,+//ʑ7K٭GDzT`qwMp; y/6-66₞)ӒA~紻:myqs~ _Jb 슾wmH%XłE5]/vN ,hoʱGaM`W:Pv @jK]AS!d-+^gyvB[0h`Tr-lllqPu72 K$jO7/#",Z]YC1 c{@=GNKb5ѠR 3qi޸v]S>uyB{}Kf-u=/@+I%voxu\ ew6KjjgpoG5!1P36-v'H Ma?ilI9;X>m[^NO)^ý%CcU/P KRIzz'5:L!0uhV(CHWw=m9w$5c愕 ϟAӬ,,ut Ed7K;EXù(+NPQ2!rnd#j>ԵbԐs̛&Pa$X쬯W`Y/Ĥ5E}91)_= (ΎZ= ֳ1H2t#ɿ ]\ nfT+>7DQE N8֊ / C3M](%_eI~~Tݹ^\-4,$:irr&- 01C09gƺTo(Y(5JG}KQJ6#NrCډM&HlȳdWu2V-Y:u ŭ׮}(K 'B˙I*Km:sa a/aAJUAA6Ü*%&af?0ʞ"N)(JQ:UpgZ/3 d\>+/3 %ZIO5S[U-mEtOq1 dNRUA֛883AWfOSd"!!Q~K]oBxzc"`nDŭ;fʧ9}Xh~~(&%Ā@b$Yq1kA$0 AuڭmbK_8pXj~kZ?;!SOVQlp7wΝ3]be|x -]F~rcfE:*F(\xϕ7Ղlbfۀ\Zz#hU3mT݊߆~VdHLQiYbfU hg8œq ^"ո4Hz]hʘYpiN<5Q,r1@nž&㘘7yӵU&7HBԴ`s{r?96a͎lG|e T0+l4s $χ2B٩).o)I t]G,0Ɍ[HTF9eGlZIHVp-a!t^C،;Ig:jPVNґQD& :@im񲲲̀9Z H ǧz2 _'pZ jrA2%q?42HߩpojH*i(+$vڴ?'KUފÌ}JTKU^-X]8pd8HLd)e\֧b|P6Xnth5KX|C~Yy!//%TY1psz-i_v{#(fJ?`M1 }ay~NJ>THuJ?d"xiC_U=?EwEl]Ǐ($1DeBYZ. w}A=y$>puxXl>n[]>+/Wjɱ¢|ܞ~ B-V@)<`>Ti|H.iZh#FV /1uxxlZƿ廿ٌ.݅:;R]P12>*_βWv y1Ve^$2hZr"`O1U$-l]*\ ldBb: #сt|K'0p2 o>{0 2;6 vRWXC32W!@ K~ґb˻D]ZDJ"]]QݲJHD'Z5 lH{)[p߰^nSܸ7Gc`{Û 7j2p`=?,_+ٟO6N&/"g'<_O@c {+_׏iGgu KxGEv$phGpxabL.^1]?I[>$/?!dRGԈ>ܬ+惫&# ⦄x{DŐ8I_v_O_כ I>N%BsOezzz ⳋsssuuI o,{[ߓ?p]TZ&|qkj4<:0~1Ï>Inn_y ?^3r|*B$ ;= %tOXo1}P'|p7Jy/>G~8NfCz|gQ60H*Wrctyr<DZTel >!p2vޮdvJ>951-.3_(pm@|ZG{"l4gw  =TI8'hǗh_\OWq:q2W"V6ǭŽ{&hnewЮ U_]CY"nA6Cm]WeaLt,GdLo4J\Xst"[}+xd0Wƍ]S>˼P(#,tNWbɮp",eFvxK&[pbV=ȗ*>b񭩅2r\mʜeALa; }̵-n37磝\Ғ-|}ζұ i(x6@VTV"Zݗ-CNE`)֔z;.('_ `jMBN9rk|xBJew\/Nz2<e;1<\Itw }ghm.`<_8yI$iVr̨)I%I ]1c5sO:īd_&ZDXn"]rOUjӖC*W>_s'%mD)00 )b*bgQ/bN?1>qn.E,3Gg94Uz'xu75cU{xM8.F!pSsgu'$x ^Yg< $P-0ec,xTZJR _:i - i_CӜO¹h0cƍĶ\oIPp`3;ahh#[ICquEvC&Ǔ3mgUuW^A^y*FȦ 2oI`j^7..R9C\7Z*,d7?5["_(9HdACe5R_CC.'b9{'4_{<4S<^<Ж /~b۠8["`fL\:

    w |{|н IzmƃYw/}܆/o=U jm,2ө?uŸY ~7t~YflX PvHȽklnldxzx$!8D٤ ΚZ q##$:MQw$jQ+ftюN g+$D9vjA"^Ii?̍8Q5i瓮챱/^._>><캜9@Hv2 ;y {?ߎ# y>Gۑ%H|v=& s'xhp\:.&Be&"ceI|nے A#p1JL_ U?_\ڔCʿ~F_ovJf6Tydx4=g-g/1OPji;+[ǪxRbXbcmSʬp됫Vo*ĕGncGqHG. ĎuFBϳco%/U?M&9Z?qkb6d=MRdٴIU֨~]w@8䖋QY%W)eܴ%wx.l8|ft%4 tx6&zzLؓ?#oSbJ#= h*G` Ӊ+nd0.؇B&0*ζ-֍ s\\OIhi]!o& ZulF<5Y*&/Z޳hFq `\A&r&b y! 3|ݓݨ/?7}qcVg̙ ]i~Aqx8DQe크#xҵU.V=U:(Lٵ%+wTx Duka+4b^G/t2 =Bl:z7]ؙix0RMO@R#wC C^WWw!Fks_H0UE(ji~%I_Dhpש?|0#z"jj$(AߢCY鱊(9ηj|+ kG&b1t->siMlq[? g}wsģT6)$eo =^.&O?$xRZ8HȪg1f,IvZk@ VB$u|D^3^yRGn̎Kـ>f~|8Z'u +ACWJzd9A1}vd~_c^b?/xA(Sdh C05 hi*Deri=m1c3$Y[r<\P`sZ@x)G$)Zѽ;yMEEE'L빏zw;vazhXuG]4'ԘȫfGq9x ->g@!i᜙<|m˗!Of|69'r@xQ}pzr?ԘZؗ-.! iANIQ}| >ʫ\ATx/ gBs>D>ʝA~i wvON481ENhNa@ea'xC;Xzqma5ݗurL &KW%^:XXXpZXڞ )F~}LeiXTT*,N%ϗa>[5Eُ$aLk4gAb;|WyGJ9ޏOYZ;h xZrxӡ'frDsq9I0?Q"ZY1m3-^۪UKNRyz)OM>=:pL^:Exu6+ LJͤV{r(߇_kFEI)dN2fѓq'ip5Ki /,6N-YdI~fNį'Ϟj=3PB&!4@6f*ۈ|NQ|N٥(KWeܡ&wYn}#|P!)x4R3#բ5gkax 1zglE '4 gZ['/.=_!BҲ1dHmodJKTG^t&[TI"1|3پ'/L/N8Z.0G7(A|T46mJEjz )n"u[̵̹xѬC"DUGspgbb 3׷ii< UŝԍwA^B/?bLFY_;w1T 3Ikւ#μ_їY3P 7?v5:I"1M a>rlOɁj[LK)~S PC$yfUe}ZU=ut koop>1ߋov$l`cf<luxvl<ו2j(?#:+Q;]+OH(9н@%  Oty0*33=vVFM Ouvyi@(hZ3m!%2S!V#^T,I-ٙL<<ٌq[FZ&[>ju N1>F% $.LjM}jdIزוnD3ߵGBpԤy o18!#y^鈶g$ݴﳳ,2!6dϧÍ38.m͛ώ5O6aF400?5:]贏Mi}R(G|<΢;yW]"ŕ!mlQUMߍ}a׈ҡT}P΋@h1֞88 "On X|8c;w(ptǎ^H en9&jc:t>>?B݈GJݾT^a!XPQ޹Vi6%/R(vSM^=MhsIp;vaLR-xb)8iNl,GyQɀ(W[|tznB8)Je::H[&itIvb"F9}`*I8pcIѲV&lxZdZJJW4nڄa {ULqJ:րT߷I67c?KW{j<-nzdqpɆװ\+{x4zn7a\7vR'?Dbfx W4dd͸"Z5r˜KQܝ%R7z(ĬRB:z9 Շvf9N~!onsZ j|կSim3ؓeb# Y2 h L ^<%{c8bXz<ߎ =b3pAcj÷#_ _T>&}3# ֓ ew7at,ݱbR<>VT47Q}}C]f[je{xep',u(T3`@ Է/P ORgG,,lm=;[&*ȧ~i9ٔЅĞ\MK3+6/&^"Avv{3wmL.(Qj\֟*EA KGb0ѿ!y#|aHm{A}XP}+Z1jz:tr6zv>gLD 뫡byu \p8mttmMܤvoU8QiF[Yٴ9{B^ D c AI#qq([`g} Y͗n՗SXÚbuտ7RNJŰEΪyUǚb%@5Uט\jDZ)qBwN;Z\;s>gE:]`1wpn}lBZ7b| {yl?- W9'M k LɒįP=da+Z ]OT zn-H=P3Cy-}^MU# n +V|1ogyt*)8"\s 7RNf\01ț;wQΗz@xab6TÛ? vҮmx8MFd%Z*ˎ*ҎU]V0JS)rqF,RVU C_Ӗ'DTA6;r1$l*%6;11]-FDn͑ڧ{=.MȠQpQP*v.@Ra<5oVW!,_\h`aa9}Mӛ'[6(T눮Y7{C"9NК /8ҼtzBl̚Ƃ{iȎoE딓 dJɘOY96=ݵz>h6\,'>H#Q}Z;'~[$ np s%oQ >;8xxѕfFߴa D8hr[[6(tFEk*jtV6j&Ú$֛ho-H`)FsZQ5QJ':PW8p6#/zwstwYYoh5–F`$y^hYEW簪;l}\tco_>̪HZri{?kGzPDZ>76az(ɐ]LcaP-8vok'WcX<(4&"F&E Ξ]@(-/+aTޭ[=BbM[Ze}]{r"LzPD{B/ͰK9k|qB x$v_GR)Dc6N}i"O'H%>FfXgDi;Fc~U'0kP'ǟWʵalX*g͙G'(S/,V# 놞q d@z.21iG{|:7mIIJz,/nM\n0kjijy=mBD:z Jj|ipRRde3Z]Xu]:UObJ]}^k*OZǑF^r3m{.Ep;yl#.ؓ+"=N!\+)("u?ybt91_'w{g3_>oض_˿A紡2yE ?|  @?-<Ɣo4n:( 0A\,@Ow~]3? D 9ifz1:Ӛv2+1w?Y8n\^Xsj5fdbl坝UUݛ|,`-3 IyFa;G+;7[%kXirŇ:9}7[5!OFMkT)9qwe-?)I%4`HUZF3̳ MDKJ6nq+=z'>%/Foޤg6oTx l,SS2*sڿ}!j)l:Tu<0syZM', 0^,lש{מniwz6"\qRA)~urh VV@Qj :+H vV́ҕE E>FRv; W6Wk[H7bc sKy$.rC5&cxnRt}ON]^()3hMwGG6 XYh6;\DeZ W]aCN4tng??\i2X;9Ksg-;%cnM+n8 ]?5v Nӯ!Cx%3"¨&2Y [xQux&j8 {7{Ş(*jjȦ  7=nw@acc 13QiVMuow 7i՚wC9‚uC'۹,b{s)x.C [6] e(xs[Rlֽ*_TYy;F&֭s&O`Ի_{g)ޘ= Y!B69c`Pvܶ*#Krz( .j-Zu b\7#Cd+(=ɿ ,' u-CJ/<37RDQG hjiWHIK @s\! 6`A*0;l#b f҆@ v׾{hwc-u5zxH̉!,>.x^[>οf՟X>%?L)Dfi5uc\s̨

    &)z񾞾:r @TzFjl[!ZrYU}p˚Y$\624>elV4%ٶ쾽r oL-.v4o dPy(ߔ:%|%ߤ\mCP8/yì`y|~Gpxu[*5+cGْM#!b$=m+kCN2P6 HWA' [_h`U֡$""KJ\3o+uܢ-,l'GD]) +|@gU|Gú .6[Dbn{C[{!!'D L!+\=%H+U>0zznǻ|.0m&W\áFRouf4(ScՙW/6"D2(_,Nku'JRf_@H:q{xr\u{Ax .ҲT9 Jy{.ܨ-/oR̠~.y;X7'.*JTm'5GZ0Yh2GIH44Aw8wB^$<yuh[,V&x)Q%Ēه0ccE%%$51ʈ$rC&*QYf)*`q?;HÌB z3;ުgi- tʚ @_*w>%gG3!׳ԳNvа f?!1u n6;j SPF0bujf Iד}Nؘ# /JSQֱj̊jVp$x<6=||2ωkgNp 2d`8`"cŎ?P6:ũ߲flԯ経z>pfdT-p*._Nʥ^<3 YlG>}=>.N뎓ٽfõQ0\%|Ӈx:[_wNRQ5g|*[KJcBzbmU|BQJ(qΊmw`6jȨkiexcck47Ոs6!F =í+*Bihi/*uOS=g72W Ōnֵote9GJtvȷI˟ঠ+.3,^&Q?}b |5, (}F[0Č 4QlUUi;Krʠ)GȘj瞔_d#itpS^aܡͮҙ ~ =+AEFLJ7eIEJɌ_Hk\iG eNkөknջ"=`~6@;qZ׏7? Aqwe qwsrU?Z>rT(J[|Xx¹I&zLv[N|̰DhӀO+Uhb:Ls,슘@KU(s붌/RSS gͭv\5c~p#ZW wv£֑ gUF<~Z-ߋDQ5s=sa'l/uD L5 5Eں$!cc#fRZt۽q('4Ξ8#nJ^39Db f~T6qNv|)աyMm(ǻ<WIB_s>G"$~ٳ뢞+F4}0M/gK56ubhхyV$M~"m}?Kdd[u41^mc8tnڧs,];Ƭ- GbM[-[JubB)@&E}D)rNNLߍf_\LQH=Oz 3W/O'voookZ\AEEUƄb^98rbKJ ރjCY0wX0G>kr,{r*ԇju~na'oC}>Z A]Obۍ'LVPTq6kbc3zUm1_m~N9btZawGKg0,Q"bdrW!<(eM$ɮp[h'rbOΔ2@)[Wfּ}y>>K`Wu1N v>Jd-.3@ٶ`׭JLׁӟo;.,3zm?he(Z Y [gee1YŔ "/sD,䄇"k^}-]u<+af)6f58i~ewuvbJo Ih9'پ%Ww܄O/1l)Ax\(3 "界*%,sLX?YZ)^xtWNpJ3u 0<N~xoд8J=!߾oTDj$^)zgY5WԒY) Cٮ),v"ˢS?b%t7 Gf+,%+վ+eCꄭ*/ {AI qNPf"!1Ϣp)manisseNH޲bﺪ]>uw veᲲk0$x 9%PRw|AEꂪ#Fq/waqóLUTT\>zQz{x?gG2(2Za,[1nxKa>SkT~@+86pe?y #Z$u!;i%BE'++֎ϹEFoNU KϟTFӐ% K]5Qr8ͱyL^@.<ƟۤVW'Nn^;lN]6JNjO(b&F¤_ZaEs}s E,$"U7/ŧ{RO8f6jUl5j[T+n<-,G)#3q\ L;WԶ/O[@r%k\Srز'Zf$a+u->WsXp^c.*;uk;nwO|z`|{ |gyu'-N-AO7oݻ7܏&FXJT5+U|71-7I?u}ׯ: ;FX8 n:zG/ AEu|Bdxz@ȭ/"u0.4L/GjpJ9e0sQFL~v_cLN GB̮9_> bS \$6[ %8/dxߓ:y10q@ P~)okE\]X/"ADt|>3wxĄnɬ3-?1GS?Zʚ}g,6x>6"z%$Xx?\O1A6oRFZ3[]nMUI|!V]EP<:FJ`FPe`ɐg'ȒRZ.F֒w:ֽ2aJ$>mԚL% oB`q?D~رp]C'ux]?AtW1^ZvLDh` 7M[O5o41B X _+LZ<)bOE;2yRvlURk~},5۔$Fޥ!Ih@'\_҅ubۑzg>]r& ^*T!FI1JBK=MΪ cQ>+bU+kIWf9Āyp*9El9lj !r5ISN-X' j''U>c(SBU\ 逾uG@_ j.qΔ#}=,EX*C\8fh Ka&?QUN׌"3GǷ!Insr֌XM)Z2O:Zi>.0ڕꖫ)lLS`;ww[FkjRw~E@C5mYxcsxAle`@VC@9oXMىǽUzm 2[-Ws"W8ROq>E=)/wl {v[8%5"#$3wҠ>~-09ՇRJ+N^ZQ9G.0iPӘd&ے e%Ԅ3C}dKNh0G||6j.M}G*.W%[ĕ~xXGB \ӹΧ6̠ gX"§Vh5kў{Ɋ.-2ۃ0$qC 8+|Wק⁇m3Lco gZFuD)_ JTUAD죟eULؐ*ܐV W)[`L\vIRL#X^1D̑?.kBA*synC';Q|qQ_C񑺝Vzt KEeqmqiB.t8@UKNlV= ~Kgn~Ni7Sӊ bx h-/ Yd<22)N+ {򇬾5~jBrgB$ 1ݵ6>psm0W9v6g X+,9hl;%tCBpVp4ۋ<]OʌowuyN<<_?-:=O|NnSe D1b-ƕĪu( t^R8}Biv ҲT|P"dMPO$\E%83 z[.ɱ0/+gR B ㏱DI]`%XH,δ>! =\bpPdEƿɦaS 'aX-[űo7.pB}.˞&^3?$&*]˲bV%A{ q/VwK * 7nKIjQSBO8${J,ЙhQ%!6JzdzE-ILSAђ!m'Bs=l@: 9B㐉,K܅Pa#wpM cn p/Gݾ{!6#⤡?Z쵍#c?.,(aݼ"b\aN.NY Է3Ol/i-ϟ\@6aU% _ZʭcU *#_lzDdiq2䄜YN\Z=MVyF/2mV~gd0B.B^VZzt0%00kZ ("w &׳F_c7ML/K;G ;jC'b姼$*LyVČ jZ)m%J;Lt? !9Qo3=_ql&m$^s|}<4>T =I1~;PuBqޖ#sыFYW$W̡R1EaV>Z "sTJ9¼c3v#7:q~kz54]<!I١763X1|VzWaQ$%:%jH`tk=|O7[$n$ &AL KF@ZDa nwu{;" Bmlj BFŪX=?H 謭]$mLSJQ\h~ K;pѼstni"Sˆ/9  6Ih/<V5KdE_IQ+K1̀W.Q_bRwk*݈!isżGZSk3FeTU`"B>&sۊGh79.n8A&zwBKsfЇf<&K8Vh\-,獡,o]m_mdTm_͹× x >+^i+X fߕCz/m+k<ƂO& PL XIʚX+zM4O8mJDK}֘CKahoY?}:4 &~ey5ɖDzqS"k-H٣8}ٻ(+MiU+­蠢HKNB1 :C t+$mɾ,Ͳ?+ĉLzM3_lܹ+}M%>/|O@4 +/$XكZ|ٹq5vʁ ;|ˌ*vK þR9wI&&?qoT2{w6&wcj2j FY94r,LS, R;$NΧu;9sꑀL9oQ61kewz3aud*\uZ,k~)Z;fPScֵv*:YQgX2/WY?~N}'l_w@h`Dlj;)U m"sz%n^u+CwVk::}~| Bߍ^*K߱;\S?&q\)nu 'iд]_^٬d|ڥW"¯Ľ(SxVX7kC2T ؏ձs}@5Ÿz 4yxY?Q9-3ּM ]9EC ēV&{_t)`:l` 5]|b]-{)f"=mPC2ZI5PTQ#^ȁm`ĚLۍ1a-nɸډӳ!M/o:ܘj&*W 8/9޷ii?bG^/VE!GE%<2EHBًG*a`=}rc^2RLz #[@s2H(?:9z:t|޲!rYVwc:rZ.?x XNDAB-ډA3rOULX gqL>ؘY~o"+ekRJ*O@V9J7mW}/&]> 4:Ҡ}<4Ngd:MZ_,%'\XjI5))`Ѿw:r$LAWf9ʜowQJӣm 1~SZ,-<|r79_3Δ_>xpr^jxwЇ #|j_ˤ~, G6}vw jx0y_JA97,!Jtl_c˒5ӳalli ⯮Qĥׇΐه2t+9ʠ_IP\~'jmu5S{3 1gY)irZlv.jp8֤JS]<$vL $g%[{Wd-jN)CL|s(6 Z81s0@pr!L7:=0!u(xD#qenuTfן X\`#Dlqy<$PuN 10:/*1c) (P[|xG7HEjKkXȀK:2E 9X DYf5^൹-tyuD=+R*&ү͙n1{TTJW&]&J6c<ە}_lvsطBHӁBcsݟ-mo56:jN"x$E{S%Z>1lDW@`Ԕ ~{-^٬Kkacxf:;lڻ7$ȢYW,=?䅼su \ک թ3,-]$?f{>Lz<5OѠbY ꃖ:b)T H$.ۇo ^Ib*{ZmࠨZ6wqWr쪴{z!.)xIj]zY{yIᵀ,]ܴ@U%S_ccG ~tlMR07G?ZjR_ ;;W(5ǂm[GKl 2rq˜{d%PT=^ueWe <)q^{yfƳU;=ռ{;PKJCd:'>W.GݧƔ9Mpv}*f/_ ^S[oģ&M ]3=)K0="RRI&s`=| s^ye?֧h0Q2EU ?ظ,ή _q> ։Ʊ۾m笫7};tѺMw#-o3wL#*xE<+Ҩ6S}9K}F"ӠX }歏iE1"1%-l68B&{\~{჻0Zrᑽ:HFޅ88gH>$Dtr9\au 2x a a0]WCA]S;؉|R&mB>/tK6POOxx}UON3_QIdeeׇQ"oV3e͒l8G%Ri(m$cK%g(8pKodO5FG_UVmق`)@&{D1t[ _x L@^h,D1"n_Emb\_s 3<=:다_?5IMI`cTLr9ۦɼ~&D?ar wrTI|Hj%2ƬYM6K4ϳ:ZU.;.sO^=s.*ss<7wQ)++K5,l-`&Tc S eL.y˜K I]-y1V~d)n_ʈz#KbY8,[o^~meEu77X5NNi_Njgbo}ўLtâKu~$@5z6Ip6mƠqH`{zYd~15}$Py\9 g=*AݳpFD.w1^=, KI/𡞝~_[;un1N [߿P~#l+s*yFX[ߵ/(Y\lv[,'¤ҺL H]!$nH:X-a"qs~qr RͲ44Dꦌ6eé-5o¿<~t޻:%N/$ZkݑGr*A4Q8HD1RD wo͖YFQg .t.kru v;]`W.o>],B:99dniSƼ9c*iCPH^38Ӛa4УRӏi84Gi˩I8v}I}wii A9M>J,Ű)Sxg"=obP۫nTY ⾭Zʄ ± H̨ɠ hqЕ 9!t 8 gO(p>Uv \ ^gfѭY\[_ }mMbΙy 551 ߴx'yU_/ X JWu:>J!RC.=%:a,X<.eWX۾Ǿ g4Rq"ĥς&{HgthI7pm~QsMwJֿ,zf"AzyX*n/eͧ=ga9-v;!7p,qYHDEEmyrY.l-+[ܲ_QcКTS(>|F }lޭ xq:Q~+ {i$a5RY S2 <ʳHt>]$t}%RcqlRg !2unm bݡﭳtw%YOYx@B'iLv c*]).Q[ !@a-zFڻ!݃#2m6ªg#>17=OYB ]6fKdYo_b5ʻGрhmr.Oov[G&EN*!rsEo/ 󆠯Wmu-ϘzR`gUDeyv"oRf5:0[dq'.Fkדs:>ؤ踾 ۗ.a5 iS/)sGL;7.mp'(6  ،^]k7Œ56hyӘ(9{&– {:c) IA8iYG\1IIwBig~Љef8i(G$Ub*5zQClDOa:6 ]LYL@|P[s7VjWw:Q}'>g|LE@ɧuXnjT]A8q㭷HľP" (iye}hkؾ&ꉔbtKbaqNAR? 4x$1qj&E ˳%ؚ2R ^|aNfgOnNBM"KdcuPzNvO31`G | ! FKDu*XBn67T;aS/iJQ:.X 4p2f)<*55̡0e1͞T& ^ , Ȅ`ě',mL>!_s[^)qU1q-^rѐA/;{ ̱ߟy9ُ7UڀUU8f\ţmekcV^ ٮQ 'nB'8c?xGO/O_91ogݴX'G&l TmJ%)1ڽfmŽRK]M98~a{'; )^T~мrz9ڥ_a!k~ɣ-mF_P2p6a\>F C' !MgW4kپ<4Y젩yWHipUdnqoQX;Pϐ3@ pKgԓ?^h ccEn^l9`Ԯtu9 'X_eV:ɃJwo>Ӆ2_fi%aǨ~Pӣ}QgZP4i2lT?p1oxQKJxJ,\/ꂿ՛pLoIUvfp6*xعL3~?_R43?ƁBV< kbˑ6(Uq;y_K{LMYI}1|;x!JFRqFkbڣm*^4 gg6Ϸh5*EQJFɃ&] '{9 ) ,E:yґC1 Gfi Ax Q(; Xˁ}*}vR@ xwlt}!3xXVnu0XVKjHQN}eGc#6 oE gcl l;!m])JȢmB 0^*EoCyF*wM&nwbSk]hG\GI_Ja5^0VY KtDiӏXv!+줤+9ԱX!Wg\$IᶬI크kќ3QwxojnRlZxSy@exf$D($/_ 'ʈPv_Mi0}/y̻=f]A}ݧvZU>~|z,1(e-%ardׅ aD+*2I5Tk_ʈ魬bZ ͊RPط||3tto3z*0lJ5w*gt^Vz#hYߎ_!m;F-Re҅U}lAf߀s2dFfr vdWhbMQl ;59R1 Z7!JK ap_ss vs\3Y|9W/ᛦaSkS +>N?Ljy>i'[v!کw,m=5u0 e詟̣>u~qX8uS50RA+%#K$fd ĕC<6g)P .---m<<+Ij?sTqodžMm?)<$m{bs)[H|XN& Ke)2fi,v%R-8_}*q6vZ ;yRlS8& t$[aNׅߟ" {WBy WTkg̩BYCbAªCPʾ"%{p/l\PCP~崀ld*r'#C ( gְ #ɽ'"nZA3#X.Yk]P מ/ fa8KRɊ11Qo8@%#Ì(W0 MRxVa!K^ûnTt$D7}ˁ!;XxYh/tO݄H%H3\BhzJ&0_d1fTGf:Q`?tGj0!.  `󽙏%(3I1~ܜaG,m\9zTQQa[S22!IZRQCF) 5?zȕ#A_+C`#P3^[[!;IPwKKMy18Fm[0އB#{'dlADlx%k^'4DݳsoC.ӕځs r|S3.JU;֒==PS1_7(!To*MGQlf"V0zzY-]*ĕ45OCmMǼ 'B93yZq_XcGJmȑDgg}$eG"yFm7bM*+ZgOE@!L*KtIiF;"ё3nT%Hdd™#rط50E²s rz02g60+ȡ$DWj/vgpcj.͟>OQP;)>NfjZSUhu'&%^`ǗU]]z8|h+D' xe#ިײt`Brp[;]H!gi*::+Uh,ɬhFP߻ 'B9'qRj CQ"Z:@mRĀfo'Rlsd"G֗mg|8߆D-~ra.綵||*G5"!׋)yҢzaN#Cu@ _>۬?@:kZ8_Gr錪mĿCԕuSej/8u5FlR@xC{ITѓ`G_/_ :OyIR// ? #VBAJ7!o~4Y~G,fҠ3QwmGou%rRJ q`1JoDo"FޛìmQ۬ȡәy: v$޼llϕ6< aLXGUGI|r~"<#=Oދ=쭻i_ȳ򵿗F4\_ ^?籲d&?vr%-iH:T1ڶ2&y"gKO9sPm41yMLJ,s hR1|fM :73lb,mݬ|$.sUiyqS艺r6Hխf0R<202 i)S>^I -s03}n-|`읫O9XU#G~SRv V"U_z둿c㹁;*LJOOO͔z+gCmbRg[11xCQ-BNsQgıK̆|IT .c$Eٷe^?kYWkXKREG`7xmzdS#Ml5VJ_vIqp6}ڹ+[n{WSz=GcaT Uq loeGLޖM5\Ecգc ;$ Ê.'QԙnbOI5>*fffw*D T8FdgoM}U*~m8G[3k?#\ƈ-SBp&ߜҔQF'g~Ǣֆ?W?U^9_fqcaW 5%J&Fr簫B`ec6'?Ϳ?Vd"bmØy[ZU;HQ, %85ADaU1:5Ĩ x ROb@ϒ Ԏnk~;_r=8b"םIw$ y׷gf0kQu}xP_t eS6a˺>_lS<*t>~̿S\BO1-$Iq^fecc4G]SSPH: eBcE" {EU~`u'wJ9YkMOk9 U6@l:!֡͟ZU{8|?#&Tqf؅1ϰUO9&\y/l._պ={\_P Ut('JEZ'P|D}晅_@ ԂB͘Ybh\ZYY3bi19xj@!Mrv*R, ÷:D!]T=UIW )b͸+ _EfVδ$dǂ j(Ձϋ~eJJ?GH)"r: ӆv*eByԥi!$^+t73'OA\v.phÔXgQM62jQNXZ`oh"i_@tm(<$ FB[pwqwwF̚ZYSڵ]U7 ' FTW&'g%yH3\{gQz&J6mc0`1s=<>Do:mcaJO4haagfI;z\z_(ϽǪ6{Yb+MnFGcԀ9.x6f}<Mp z{}@O%p)R0xkhhZ]^^&nA u*&vk*088DMu[K,@懃UE"2Bk)gV Ak lf88Gn& '=c?y}e>ah: >\ĵk8ujz3N22cG)Et92"4w:x|BK UNٗ6YGΝGD}濮͂J1^xz]iiH 𚪦Ʋws3Y (7>0y ݵJ~#z=tC4¹ >h$REu/>(aU0QWT[b=S F|{5^m ^PfWD6!N+:=tO^^^ 9vSFݛ uOvYX)F91tQl8v.|P=b#, B#Nzuc4sh_G]ZC2,첚'm2 4iYax9 ~Km\Kczle. \RBZf\FqrYZG~YZ^IzhrL/f#+/1\JI+A9%̞xF Qi ]?^RSَH:SDOm1c|TWbQ5NВfmڼ,P(S4)@hYSw g['˫#9>w?)1T~/=mݿE2.d3TCW?zeb*UmKbgBڷ LSd F2W['ybFsݢ2n\dvK/!p(x͢Wf [؟+ֆc[0~ϼ;n+>p u>,=,\c-@R66ljwH+5*-g| ƛundѭ{ :mpT]|rSO#;,Fmuɰs$Lfr[=iչ}rǑ$i4`÷7Ged*g^?m^ yӡΒ%&3{/YaR" >+qE&pZ9+Yo1 J6\FCy%S0ի h1biQGk3VCNkv69?FLCg<1Yf\7[[%6nOxOyHqQ}1p|Ӷ/%xk˫ݖGyTUI^ |^*(lÙ21amv9%fAnkP8c2 qČ/N*65l7A릂% '<ک@EyJ\^%]ǭ]KTn!RV]rI(-}%Ь =ˈnJ^NQohxH39=O=0E`Wt3a_)ԲRg흙Epef6U vXZIIŊ$Zf272]e *IT u'h`jã#О  ^N(uLmpϨ)Wb`…oUcˤFknX{bGUQ^ HvSMHr*z.#_H\}@ݑV6o^)e(=G|}`nDŽɉ\;` G-ȴщsy-otMCq7rPIȿ  n.w[G na3f; Y !Lp kIW\RB>V(o[~RZCWUlcc!=c^Q|+.>a~qqrC QD y 8&2exin*y.MR}v3L ݤ\Q4 ϑ-KDNKW5XvƐgv(Af]~<>pO3WV6(◂~٩薚*r2cJlaօ.Ǵ/8Vߏr})rQ"'sU8~f- / رo˟g=빂azϳǧg:zzжj[˅^u[ĉ>?G!6EUe88ʥbw6gEˋ]m?5>fZGFJP,kIYؤGOQz^sY-,H[Mɱ5Q(oP}~"n(ښϼ*4lyC !첎$^Y'1!UL)n8N c8%uX8`%Z5¿n|<;פ.;k|* }N eYSCz \6馼мU)ۊ]OݒQUjjG{OxIbˋClsq( ` 5MPlVձ\nܲ˝YH۷hK6rn~:"9)ae>u}l~X(ƚp [SxCTܩZ \ia&mW2z qLM^S{9JOdPGwZ`oJ_ӵ}eG|W8*(ABQ 7q@XMUB,+IvMDx"R]mj;h`45=l*!j̬>~2M,( ǝQ4saILP)_1MK ؊PxW9P{Ź+':EHB<^{hU~hy3̷^F%X8~\Rg3|e5zs]}l،!ҳT*7"J'}|qbϩ`TGo7 gfMD>"λ}&sAz;\P|r8!zK? #*5 R%vvK[kS]bٶIܤm<~N$b0 f`w^/4xHK "WqM+v#l\vDN[OӀ|c^|)TV0l̲յt/ :l,38ǩ]Tb?PJQƩZZC@[OrAܑhDs. ZyuyYzʀ<uhnQ--;&O;.G"( ? ^2శk,yIv9eu_ FNF!"~2uWW7+WSd8H*n5Ų5odTBxY)Dތy"xnT6W6JP]]lG]|UnQ|ՐH5uq)(lT${X(%6aȯ|.VK͞, ,mT΍!Dsd dB 6H }JUY=thlѷ!yJl5C\kܸ"!A6 +$ K)\ _I6XURmsZ/;lǠىJvlR ,b$Sr{^y_@h2uU $JaeeE!y[?=yvIHPEk[4D%)E3P%? EKVE!ra"rS)8y)d1了w~~CxnZ+2Wos^(!C 89ՑT$qx7 {yR)h$N^Cu:FOS0$Bec@@"@/_vw__)]wg8SRjRC%G @ɏ%ek]^h3{b"]OIiWUS4HBUX_>w=kY”Jq~wj\V}xect\*=YReml,,<T:"ϑL=\o S{k.f$Av39ASr_%D8N R^V-KQr{YO[^A${Y[˵V)HM@eլtsnc2 Δޱ $nqWA3{Ed[Di% ` "Uw^ Z9CFOQxmNjQˠU7~A YA;;_5jM9gү9@PNa(jaNuXW*xwQRrrUeۇBZF|mV7bJ3E'gc[ШńZ++j0݃gXT}|ʗ"vHz5U m&vs ]ڔ=o+-{ S>v;թfm ۶zKoqT1A 1)M2!w#jOpiCcL]W[؎lVSe9Oac=?ZZ.ۀTe_揓vzNADIlz#Uér:^yW܍O;4z!qv_|D1O-LˑKQt oQE73f,ƮZbi=3T)""LX^PI<&FPӹcg%qMKj"d8q&87;{35QD_#7G2YrZ,\=q۹xz>`>*vZUŝ=p8 O p\nyDXp4\FEOAWGJ #$|{ 5Eokf7"y3zo!9%*u Ɓ4a"py~ylkwjZ<ߠs ½ R^nw+?qI'禅WUˠ߂,vk!rg{ ^ςc Z<^,*pB?#GʦO,_4? Us#/kB ?/99i4$a& d(朞 _)ƬˀN$Ha39$m'Ӫl9:vR(Ƕͯ~jMmY ;]S?i\7N^@ ⫛kzGH典1\E*D)'j2D;a>dV$5--OoVo PzQ8@ɞv+e_& kzƧc[G{?l>D%|צcMخZHsfpTA ˤNj 0q8_]%͵ԦG[1HBeZ3 {<O8sO?MKSQeX]FQ fRlGiJ_o2p#3!Mr:HJE2Uêm7;= 3H]צ WVVpR3{{ O?ۑ5?-S乗[<0gnu -K8ӀHW3 bq0ـx?n<<$v\=B|>HY@0S8]-.j1zTF LUhGJ00OH3Qsjb2ۿ:1۰e&FX^R6iMoAFtCt₮Q'ɧVJn-lc˿!O$@1NBC`EQ \pUUV$+ņȱK2䴅IC$Y}BK|Ķ8k\rCk 2 HSfnnIil)uR<=.eEtwDžfǢy\x~ {D$y&S%ApgB"$iFVr],]Pce{\ yW7PxHqch©oɍWYV0?ۓ}b^&ߌ!*o}Z)b˰-Ku0 v3ңnz۷QND{>@fk,u_dAMbzfX} +Xwf ﻫi:{{Χ3IsQ8TDVٰye a[*d̺C&cTz\m.C^gAw HOt FyXH^K-)Ą~&hS8n@Kձ%[H sGz\Gzdl@6d|>pł`em$LS/g#Q$Sb.f?-,!45gylԽ %SW(-Fo:%4,7LH=E72eLɟV҃TO0hK]b#{y|hfF:e-OcXS ?{wZ^pHs=ӦH-稈 l܎<4g/OnJ_m4F P FpV޽@[;7>\Xq KN|D9uR#+"L'E"<[lk م|K>8MI8/9R[mx(jK?KBNC D^Jر$=~O04p&Em kp0+!v}m"s#lI8AnkJСMY"%2\ WANmW/p&0$_y8".0ƭL[I?  ^QHDVH:5Ҵyg˶v"kr9 >^;BJzhRS&Ra#hۮyHapvZH+ (QF yLHxXVe9uw [R)QԚ.ױu9j8-t}* xespcIk1fGx=Iֆ$T,v*ڲ TF4x0ݎBۯ4gOFi ,鎺ԩR=LhKjb 1\h s:=1p7׶LO$ZzSwzWu҄ Z?tmLb52>\kx}w#[sXG]7_W}Bz6 c nWЭފ&34eTdvES\̾>CX+CLDZ'm f-wcp_)P'|bX:fUo||) mCY;KS*䘗>Gp(SJJRX}}6+=|DXU_ꪛUj9|t'{"{M e%?= mHTr}e o_* Ԅh7\K=GA pSSZ*b򺡣rll-/?!֟h|cVd{6Z-xJ-ٕHu>P$2DٚkDHI{ja !rBYy46v٥8#;,-[CZ Nm[/@k@fUg 2L@uV`?U1O+KmV] !3Ӈ06{qчKfC J[bSb#e?^ЪI99"`Goh!%0!}9oC@LyKS7#Jk9"߻pNbnf0?m<;vdIu۽)+RA6 B% !(%zI0ʵd^4}sK@{UvH$+*j$ AL"2!: 83bnֽ"Y>%s2:f`'X۪ QXzK$:srCA`uʆf]1v,^磽֋(]65]&G@ڴ.a7*cZ95F3Rgb{C>qZmhVK @`Eg ړv/o=҂ WX|vUԴ7S񬋳DDCpfehiQsxdR&m"oT O5J*$hD շֿ6pv=c ,NtOLw߉Hפd.(}wGXf##C7O_8}xhc,nNudnӘ <L-hFa'!L!]/XyN2tO'.MhEvV0{lִ e y2fw `4ɻ!čDdbn.j4lzVH"D)Z9]_=WTXJDl}c{ !`2_R4_,cGB< <%?ˍ̘ㄶKZ> t/EZΑUT.Q fKэAo8Atl`q9x7|Rj}u2ԞĀzQLp(ӆi?PP zBU< ]z x "`RhC*7 !&')o=j5l*, ;?>+ɟmԽzfsx&lJmj |969~PE=o>V³C>`(|gwRs?a"eedGNB-e?R`+K e!lzz:,%pu̬Ph'rɀVz=.!E@'$=D "NV ].~p~!{˵Kw7ZSٯ]!`J>-٥xK_ndNTHlR /RL"XpL}b`zow&4a@ܿ3+(jZZYȋq%,n; ι&_Č7PJ㾅&V%=.ԏuY} =ĢŲI7{_ ʀE3{uToY^ JQ;6CiJwf[Pԩ\8u)5z ᐡh}H\|5&$,)zYƎvl5LOMdNG{1BcG2aȗuCO4R0J<ώN{Fz,UXG8T(?CJ +dр4 iIml9!ύaVDPSC)PvbJaߑrX)) ٗu&׶ CDGghH}%]OKKiiɩ#zki>rDY1=,WT8o↮ܤr89:נ%ε_;D"~::朰[@b5:].)Ş3zkCPnY| KKĆMn xwOd̊Q#T1̱ZDgG%r#'iՅ/U>9_bzuI:*u>xv巚i]AԷ|Wg]fӻt1C2"5+//%w#ǒfc)à2b:!m/q@A)(ucY .]l/: obXh߼˒IQc+m|f~xxiɔ")Ɔw""-ϽىKJ߻n؅3Y7ONyt<:_8إYl)aFgDQT9m6V^ՐqvoFĹOL>Ct0\rtђj#a"Z}s[S ^QӇd6Hr`[,67,V)fV;0 I˯{0ׯ̑EQ4hSN{ë tpp@ژ{$œ*ussT[___[[[+af ՗t оcS6*;UbtQ1 'cj))L4?»V oW&uЯ$B.X޵'7~a̳Lv 7å`3e(,+UHcf3܁ ,ks|5S+$VUF߾ ܚuM0F~?ߤ}x+NAbOH@:Yhh@`lV'P1$O@Z}XEXeeRMfݎ/ 73tQ7Q&5r !hܾM\523璔EN[90 r] p] ϾمTs zۚ5yP13װJȌ?NJW޾٣+NK7"M!q*qngVQlȁNxMSfdvC6 ۙ/Btb><ԊJyɭ ]Ȝg=eЂO@p4k#v2H]{ϝt f!;>G ]N؈Tf÷2cڦ`Y~aiNrSSԭ0vi! 3Q A7ف[6*2jNI>kdS_y+XrGs2jc /xLLj>b7/OBX`GLŴ qm_V?'yRq1qF9pay$,3|fIwȓ˳\bL,&"*&k_yL{#. ]xD$n}Y`8i}Ͼo]ۑ1#O!7~7NjhiirHښ?uʪ@"o,"iMkq6v@_l]T{#C7FAx9=57|-,,ct'n 6 v!5ެtn8E6:9 YEɊt8=IC}'P[[H4ȱè\ zЬ@}UDX;A2]z]XdkǦ#:'ζ ۽&`=pͭ8ȵЃJ89tItN# ,uo؂O;QV:~LAG!7+Qȷɔ ڙa\d&hvCXoHTJôw.St)vT4ݻ*I%k'JOh #nd :A[YZy麬ȮO5);Z;{#w~Zjjna ݧk;4B{۾n9G9&dͺr'L}^Y'6(XtLwXmR"z)u#Ӧĸ7xicpSWg]/ʴyA@Y &5OsHܟFO!>y[e)mf-tR3R~ VtɁ'ʳlmbF{EiTe!S&"6Ӝ)'eXɋk'lKG(uĆk|emD0QARsKGm }#y׶RqZ9\6S;A Q|8Wk*! Up܇/g؆iLdG}mS4Ja)=Ѕ/9mYѤf{% E@߆O9ZGX닶<Ky}[B27~Y|_]ւXI`CQ$W0!ji?:J*+lo׽ڻ㫕?j ٗrZ-`1)NX%2υ*N@(ΧbtnGs qРLs0JFRA1O v)>qt 66"{37];;7uMRtso k1U Aiv<"-O!OwT:2X5u݌D26: Ŗ˦HM褭j(Weء-F`hݏ9\ }FpZag݄dEi [Bk0pD?E5OQW+*z o:UP[ SI>Lm+@ˊT &qӠgGhh)oRPB>Ps[Vۦ>}l/~T&3+u; E%Vxן4{HV`;Y$[Y[U} 5jz(jUSy' q1Bz&q=={ԢU-Dh(TFt Q%\)>^HBFU1rMkN`ю=$DؘR?b6 ]djT)˴Q3Bmhy˫ǵH2a̶}%[:es @)lbZʢ`ʞM MRXDDLmvtY j ,2~YFw&Yhn։c:GXvlL2\&5/QJiBbԗwkk[[;zIvimY*rj'?82}FksN*KD1hcHxhDqB\LiD6d<ⁿwj!=;z-ئO[MTj͚9OlRhF;24-E{o=WFq<&aCӴղ_SYapһ'_|28÷1 UAJ]@yXiI!*LLM{)ruiYw 6ONͼ?r qsn^9ؾu#=YRLDB&C%$"@77/񣑢E-]+Ѻr$vaU܂W<)҆O[djٖ`XJOrLTD#9pHP$+P'CNT˴%K_]\Kvii/JoHUbW ǬciٮF24\٪S)ُ*rۼ*nrXF#;=އ3M-Wag`[e‘8 EXuy-K|ͪZ[>M;0^Q5-v@w"%'O\atIJ1x`WeDR =Fy,sde[/DI7&{iwJet<?{[iy[*bb=XP#wvJ:be 1˪:J&"=>6IndDo ;ģ0o+8}r{ ?إa2Y?F[fQ)MT 7]FP~=$Eב؜@ nl@tK4l{N!ctA4s9rfAGVwvV}Lw2,\aNna 5 T`T]c}Z,Ke iJD&x5 a5`Y!e}niY*\]'pnE\RA$!V[HPYC>?=c2u`gFR\Z4=~-.@Ƙ*ňRd2CCPf<[P5.JfJSThc,\$rHY&sq=NXc)74?QewS}ecz"xΐHӝ Τ+6~[J$6:o+XwNo" 4% UgV >q&N(Kc>cȿLNۤ|dժi=)P/ھ*5G;d4=QS[ j8-Ir{S60 Iu*|39F͔mOA9I;W^JSܠ]fa d΃h>(&6HCƣf9hծƫKxtۨsձs!k63ͪTJ 0(x榝?;: ߯(5QYȀ^H;r܋,j(1AA)0%+2XloCS ΐ #ʔTy@cUPm4/_*b/+xFQo)@RЙŵe< qXI(oѧn_uѿ ~fQ73? .i1b[o?SFFeؠFZ+{_.6ʬPfc,9^2*6%s0w9PJ*BŀViog=W՘GZGiqt5dJ= @Hcv *m_6k| 9Vd %W ]RtcgWKFb xJ[j+̻p(6fv`'ֲU\yo8TlP@}{id$oLq^,ZH_h:>gjWU#2PPMyK~+j" puNm  }ytMs$`~~x/7sqi`qNfZEWm.-j=p#Nrp q'd@-TZ?cٶIt.ZREc)t֐J3]M<4;W0$e;*5m@z|6~h0NJCl/Q GI^&0uFwp_+/@bG0]фMl,^d (wS8 t }тܿ~k#H>?=:ݯoUPU}o-0l0([DӶ|>X{(E˜=ώ*Rtڍ~{iɵBȲXG %tQ4 MQe ݩM8~n1 '%Į }\ bv{$;ɐa7TwEiTф#!]aYO^Hœ>S PFtʴ{PV sxĊ18QsMib4S^{}w;bx .yo]L["BsGnYl|0ɫ~kE-ٕJMbwZ:,fB|ʉ?pLGD J0hd*LpvSit#L/DZMNwՇc2t]{ QGHڸ_|&..oYUJ1S)O!VJH^4*.S[׊$rȊKWkJX۪}`l\v[2 hRY8(ֱO,"Qg&S  Vt-G緐#@)12v% bF6 *׊~ ""E9n"O(h+vܝW&ǀ!: )ir-c|!rCKqZ`#?l2[R'@j =DXREPeCjXNA4XVNc ul2<*=wɏGer/R`pum(i-hfVmָT<'%vKY:/$Z{ UC|5KNXVY ) !#›uʴA:h-/e?LD2O]nPc#" } ~ceQLAZr8.frm?ti5)\#׸HM%(;Dzgr2 j&'?Xľ@'9ғP_1ϔ oe&U_j zh#…Hf"iRo+dx*/֕Z+,Ā ͥk/}h ~rmBc^ s/ T*3ŮQSf?Շ\眓'$N3d%tJS@!JIc⃂I%Vqpiz*ޡLM"-&&s̿?D((X׳1u1}V<ю[|Vi\$M!,*+.\2hZS)qJ->A:j3O9ߛ+UVv/ۗǴ9+ꨙ5}\.)&}.|,hHae’3逳@e?3㞟;ie{K0Kmx'C+3'33+';=$'PN6r/MJJ!ui$b9 ADR< HsDzГOJ6Ǝ.퍠 mH^ˁk¬V k/FlIͬ s- +,y Bs3_z'{[gGv zE^0.:yn><'<*U=2NI#:5j Ώh۝7;Gϰ{wٷHIr/2kаuC;{ƛJM(ti|Mt@BЋ8Q1xW(^R9p"W49QѸ8a*OJ X"X(^0$RűbͰzbF $|! s\ft^*<}E E'eMxog/BBr ghOMgq1!ӦOl[Lk+m1:n@rܡm@dPhV’ZX 2ְuxd|Mt:eůJ}lW[lBIЩpℲSIt-|pa:X?z SC5?;oω|AŖi //UiHVKڎ. zl&:>s#RfN Uq 3.;ވH.KG$J拖*]t2p c$J1 /bg8RaMac[)=Օd^9Gy}~u駤$-'gq(BϹX@Jף^C`EqZĨOEbXoxCNoy@C;܄V s2 i-F;S?cC40GLfVD2bddS*.e:h"q >cgn>NPr|x#].,~Yo0c|66/B*Vՙ_)Q +*cQU@:CHl7+)f9]ۨ-+`2XJ7cDIY?"XӖ4y8/9RGI5s`WK&r_]ooRW~ % ~zFła!Ĕ܆fgdf}ƏYַP Ρd3qN4q/v2ӡ,R# 7j4%5zMK"}ځՉj㛵~ԌQ}!P?FU%td#gB{+L5e*۪yuɶ.3.j).8E'/:/ʅT]k_qhO rMoapTQBtCb=wryH0q$U{P˓ڧMٟ0㊫nM=3T Jy TXUS nER"p!&4%A#9ԠZlKjGNĉm8{ۋ{H 5ųԙ}!*l_371tcBh.`Ϥv[P`°VEe$I&|^]ls`rgع>`wehPQ/{**Z3wN:glҠ ,azs=K̎ |rF@BXA!G.0^2e{)Cp}_}]Q[sMg6  L܂}?3$~h`z [@eeq#;a_ /: !!D>_R BAl'?dPHGȏOp&6!7qt[qP?O{eוwX~M92/pzʉ)9Ȉ`b*8APlqnqj3eBsUH**!xAµZ:0?oI|RXTFq .uZ1pt;o;5' dEcLɮPCZa$i`|HTIW;_'Ox7+M9#M~]Q춛HA*T!7&?Z% +Uqz|bU+IL+">R6Qh4NXtN`.Ll]Ȣ]kj 6ͪI0 Y)(0Z}f͟+GϘ_HX7Z^CxunlG@|w&/v2R6yCS Nk2~woG tZz+W}gYQ#\ao:{]'WSkY@>W#o} 膕,Nzg+ّÈcX2y{B?Rl&LzCófe6B]5vd,b?vxlpL#"k&*4O7QZjyj}?SG\8N6 (jd PaUVO7m/7O><` w q!_d Sz/'I]`jeӴpK֘]騪C\Ʒ۝#ak\ NԀ!K5g7d,V3VJk$P+5:hm0hb ,`IoN`c-1mEnMAW"7FbT=]d[&suj]Gv%pѓ/\vkJ&3-/xɷɸS6FQלQu]ٲ 1iΪrD>*+~A;9{4_}D?oŤ\e#6pIH֑a)$6AK׏B Ӹrwrh j!5֚@ '~wN-n;|~/y[ʴIiy%"'1M_uzC?qz1xym ℸ-H8w}^&^%[5;*ۜ_ T,<,Iw~1fl*SDތmDΧ+|RQ荴&r4FA ɔ%U{zv(ïqOtt=Of%*=붽t* *dc)J3 ?L͘ F8 sdhM\'uL|]i/mXُyQ{l ̲,L/ ΁>b"~\GY9FPC٩e8ԧOd¾RgǼvT<:qu5jmCe[p.c[ ae`0Z2 :qӭxaGh R&gSn#i/rv;)ds;-W ه]I?ͭ<&ļp_}VH#nKt{H?"Ë>gAР43cd=\C~q?azב*,]pTR#߀. aqlW9 սvpbW-gPVuh=zmúwrd#UsPM!򙢇|&6i >P1kLAڵUb+E7kfEɔ#!< n1<:}90S7<|8DcI+k9Ƌք5q"Sƌg*[ ZG&Dj%߳,V%廝k*mgJ.Z'8ɸN\lQqx//$UM8=PW;N0(}|Ix@T)OLȼu}qh)~%)}U*tJk{k|l9u1K"a-¬b/Z8[uJ=[!)- VOmD\CZuvu\iKbm$z e$G_EHcdξxȪGcjq[!|vRKnmtlIӊ`xT7o)" .r70iI-]#N _|#߼[,E>ԏzY?=0mXƞab[L>8*tOk& ~ =^7ߩJ8lZoX㙶1XK u=z_ 避RЦ>>8lj:mVj^+Õ/??[~ S4ws.CEAG v2ں}'o;~FsU6,^gt%`Rz٠ۧjE&3|ω 'ħKou\!V_r޹<$P `Jl2{|PҦ%K2()k-L~FN _Dyo/f7|R[F!kt#&.Ϙ"\شRj#^qe$r e=+ l .+ yHSo!D?=N|rЀߔk].bRYd[d)oe&X1(̍5)1a]26>/_B=w|.=n()6\ /@~"HkW^)B˸j$Fج- 4"Ua O!=3Eo6߅-Ή(E "" TC"A2J+wJp_vwEVPHFsUT}h.πzNXT> Lꌊyjyty4RfF%=2ddJSd ݮRQ9`7ip'G?>tOayWїHSҺ^wBhS!_}?fwLx}%2}gi r rӛܔ"3$WϳfXDo laʯ~vo~7l~RsD'^3w60??5;gG뛋_Ov5v*cx} Ώ|x ^\(gL\bvs6V/l vpoAʅEzM~~_IӋpt/B {/0 NI /gF*!wG[`{mo%Pǿ}2&DNەkA}: ;++kk{衝0z;7^䲰XܲR[ ?UjaBg\xuo]Y *YH8=O[z\ $xǔݗ-g3NcۂLcU -5rR35?Syψx{myDc]*>+$˪N+ŋۋrf*{=wpGwo8SN$Y5c"*Ľ!'W EꮷSOxW*O)=yn!Qؐ#!uI!%W&4;X'1m!a:qMS6Aqc`WkVW,~ n)uw@b(GÊvP~8Z`ȵuOL.\8⩌>؃8pƓZ4FزuQ0jUcqG*=[vxҚ݄4JK\6B+ަ:#,Qp(QwlݓcAsFeX;w-NKM'+y=RZVTUz3X 6&k=1(Hܧܷ%>r\]2H/eW$"U g $Q,a9´NWӸM־ri0PƔ&:0vm%^7hdDVZ4 n;IM'gOwBΒmЏ^(MB]'VT;C3dABS 5Nk4H~zA6[V)6?.p R/O.o+ &#y:h ֲך(>~JWG\j0 }\UE|ͺf!tn5),o-_A#S7v|t|ǾĽ~$oٿ_Dž`oCΔ7g<|c _LßBY#z%D(; O7x*s2*Q#³;M/kI]rzkC.΅BĜy[4n|(P[VۉRЮvczav'1u9(:)+Dx򬆖5njME<NH&_ ;Tәp~l}_L:g5d0\n]:a&|` ǡ6KԺ5|cB|Eޜ Xo~HHY!Ls!dZi-\48rJvg ?I 2KKri8orc &~+UcOɮ$"2VT^Dp+ ٌHSAlOףĊh(]Ir'Ș2єw,c+fVlU}| o4a+P}t6F&Y !Ye4yxafkP t RninӁ[VŖ5rD=zrVX'[@}ڬ8x#wSsu0Y >mQ9T:{cp+u׃W2}rޥ\sS$-=g<ĬClH"leQsT7>i3Y}0&i6ٻp3y/CpgFO@G)w쨃W's]ffn3n 5#o/8G¿쏚֍Z׈X6τ-3XyoUC)*`hTρ&6S|=LLJC&1YS*MedErОJR嗱V*)WP|$Mz[Z M ;: TJXq8{$Luo**b*y<+*/<yCw~2(խ%d ͕M*L<+/$d_D.>CY;7ott׌UT1}l~@\']Z$gjn?6'w5^hEuHB Ҙ\:t>`Py%"yڹϞ׆LDu?X ) ;MmlwgHg-l]\I.-N'su֍nVu(%^ 4WsvqY}Kp]=(A67z_5_>6" A6g(dd]{}έS;OпPvZ?슋eܱG3B! a9qx.kbڼ~1՘\:ou?1&pd~JO2fy/mZ3CE{/sˊ+٩0 U`Qˤ٤7RěbR2P:֣4vm? sF7E~%ٮH_ٴXi4GY.7*17`7֣a',_~6F"^[:MrMV) d q]՛ hîqxYњ۲DJsKZU$o?VȐu$|o\ժJf́ uqxt-;;WzX?2OkϐR~ꍉLPyDkzZN\h-?v| v,U/ΰ_a4se`_G@IY}ӴJ^GMIρ{* E?5Atރ8I%+55C(2 M)Hd/lN5&/{ V./'*躊VGCsT۵wcʫj*Ŭ[n/e,P|b|7HrZ',d˾\TroeF `Z}5= :\'92'j:2'mՍLeS1F_u.i\LJSVO1LxG@J<oo仡,eۑpȶՇf?r}N z 3P3 Dfup{ڍj-@}Glxl&iWe}L=x'Nc˓G1) -_?(m lkl_cT{`?pRE2>Agi;y#EaŮgWoUgճ THKk"ǾJޚ{ŜͲ,2%K/Aفz?2cPy۱$F[r?y;jyI4m%dyj.`Qf}ŰXlDٰ߫9NZ.!70ʼN!T}l~mjq+Ӊ,= >MQTM]!ǧ l+yT l?[|h]9sn~fxh7X;g{p_4fsqMv!RbI]:} exS|wͧd65]qmdk_ԙ*1]N~op$P|m\ſa © ̷9z\m냪+ňub ~kLyB3v{ºyJ!H7 =<'3Ӑ纾2Gm"Jai2ǟI2SwO61>6@3JA*9aXr3k9ϱ>P{\MH'3gpV+yx &^u.@+?X-g:6wHSr}۹N ^tρ8b>jWOJ,Zktg [ԅ1``vÕX~-ua;ݡ/#oP z.q9~Xpnc5kb},euݟMj6mk)jZw|٢f̫Fi܊p0dd^ W_.5$½L]vO^cѥ'v~M$vwdV*t \v7<};3wnp\$o:$Y6֣ɇ]qI9PVк\C.1(VɂEO0_0/;Qĥ웷?t%V]ͷ9hdh{ˤoQ9H)L ʐO!`=q-øo>Խ۩]Ӛ)ifݥ<0Q}96S `V5ސBe1.w1| y3L4PrS,|trW?2`)rt9`օ~lM^1flպs Uf 9܏EYɻ8&vrAm޶:?ww1q,[{dތ5f~ǻ?38qyCNb(A²px@o7=η[bez}U{l|;sd9,2?qW)MO _iY;rsn!˄}!%z&Aؓ1źN0,H"2k2.-8Bwyt,|d4-$.Vepj4KwCO1qDYsCe@.Q_դ+o-B^^v_kMnp)6X3_jNŝ:@L^͇~bNΓ}GtXN$GeOW=?8s|zҺi,"0+2480Qi'o;pp#)y),볼XJ'OB.\J*WnLJY)%uK6i7|o!n'#yGOΆRlo>(Ѭu *Sl׼LC,"C#u_.Qּ,gZrìxV9 .K1ѣ6iMTÀ(;K|H[83}-h]Z?eaܺETygۻBn_]qA h?c[Pp%GVIFd' **Y#dN˶4 "Wk> f'/h9pgνl?i tH n7Aoϛ0>hmb?orq {}gc1þ}fo !6Ԭ. i1dXI\0{|xM y%wbc܆=fU~Fda+u:uܷNV8`f:"mc-ap`eTY£F(4l zYՇhekոrQ$F&1Atz .vV$9Σ hpja?k+Jq&Sg֭M2CnM\=2]< //3xbv1,}A=?%3?+rU` sc4{-VxDb>}޸֨|(p*eal !R4 rLH`!o놲 v0h d,\Sn?s[mJI×h+ͫy6RY$\/dL><"2좃QW/JsOe0)h3m7wC N*;`[6%3iEf) j+%iR}3QcH]uͺ+XAyB$G&6\5mH]B+ DHR"mZ'uzqu<8dje- wa \ M[+kB:v;K|6]ګF֐z L_߈ۃ*9|*_}vP~$473i[$>2~;]OR]Țܘja6kH5I?g("C׾^\*# L5(qFMƛLb2G.u:Jg. \{t)B}Oi5c ke5\D]p:8 8da+.G0h|{fO3ր(OiĚmSCGM[P^j#73$c ,GI/|tej 8.v1\3A[Tr2R]z#t?웭ʷ9B՜4O }E?WE3SzYh?WϢ`#o^3'G3J515bizH8-h|,Su)-6u\oƼ%KՁ*#}k4g)4Pg;bpTo䭒,hi-j(6#+&sJqyJ BPH'"nE ŔGaEaZ#&9,l]qGyhbpbz M%I , ŷ"8 GR8ߙ@Ӂ؞;2U-.؟։0KֈtzV#ž.{q3jE$CsMo^SYm"<´@>NInC5$+췶~dG{@X'܂E-uʨǝpԐx?{QūTP;#oMΙG}dB.ĸ(Zo1.#YHF$SƊ_K^w{,fdll1쀏?+pa ~+KOUe&_t |'1m:DSm*2^DgD8E"$j@o..b x*DiGw$q\%ɏf 81(_DZyǼ`he<Փ s f5:j6 ܝdeq"ƶH*6 !F<|g=ʹ=nf0㏤@!؁ZHYp3E>Rrg')7GU*L ','h&ZE(n?kr9HgmkQh2  i02y78}Eh_E"G;gzY| #M%VILpw^Z~R@ak<#ㄺA5?,ݖ<U1v7F3'Z{&߽ѿ_(Q'q'E1#WXmp"c]Aq@XLǽNɃ*P {҆/5uK#RuQuXO=bG=g1#Y4ћ/ue1MbWxI(To3[Ooi'? ~|dܷ7D/ԏ[|~ך9T "VDϫ8<% ND ,-ۨ3,߳l{! _kiZꌚ Ҟ= 6=vbGGGya~Hq5ˡ1p!=M_Ԣ P~{Eq,3T˜@&8:X%T_xt~ϿkO=axf;R1koQi,(|fc@0w~ϣ(Vee pGi*x28l>ߐ#lHSó# ؑ|5fćw/ǂsC9 soHq m_kJV)G,N'1wiirsŲ6YM3XF~BE)l Έ'3mǾ'%Z!20|)]:J_]x]7}z$GB!`2 e.mw)AƛxyR^zƇ!lHҘI@\L㣭-lX"QD=8C0ǐvʶoCdCy5c &)=.UQau"x 롿iȵ~ovQ[ 1qiE'Bg8 22_D^̿ibN)eMܬOⷩ =Y&5ea(mN=2V|UKDWGaabIK~(V)h̸఑toU?y5;sO\\DU b?MD'pQ/g-?3Q0R,;F16X]Oď4'5Uf,#Avm柔h\&g׃%TU`Oې݃n7WE"mtpfzv)}T8Ej /ġSMcoq5)c d\>9D:0'IS$1͟= ϋyŽ7?ʫ\;X3 b^^n;Q+ ̒8Q R,b+M u1ȗx9,JUR9|=#*1j㭓/H9yeW֭0'[v"R64pZpȟ̊g<=Qnm&ҨLK<-;fvɈ}$|6B&n$)Cޭ2k8y5rjx8;s>)XMEA"9ZUہY7da?Yl)G~cwÔڃi ؑ$% Ϫ#/K5 % b ~eW;Wi9!TF]Qgwe?Yh9uca5*W &=Bb-8U['R "n: P>oLy%g;=q$Gߊ43=J0Պj4?hSEC9/ɑ,Sl1G/|yx-ЯlPT XQ$I?+Zjh lSe|8~Ze=H;II s4U$SmI]f~Zo SYqM-bNYE 7aK6[YIǍ9$8㼐"HkPƥ hF߲~QH0*&3[(we3x8M* P-,tq~ lQ8Wȶ˅骃˅jɺO41T nZO!ҔH1ޏux6g߻;>s:ygzR~X{cJ7.:<[0z 9|Z ݚil_Muv&O_A]V1ڬsVF2,I rvŎnR$#Ii11+Uȣ>+Hʩty|J6,Lf[j,IJjU(fL&&<%)(fxn4wRީq0fPG{`^{f9;1Khz{OaMY h,{[#.0Q؉{dZOEc2$XeZm샅r7̭ a/b70uB *RzYH9e!D5[KhOaj{(:J) VKƹ8F_x|,gTX6b*莓\ҡg`R$1#ۘ* ɘ5XahқRWYXqąU^2?JuRQ#SĬ%/>èe )$[x&Z4V(Wy\\-NH~jPw'Ȕ&Ra(qȰSUũ=):K N/bפY7͈Ď"f2LNrg +iKT?a|)ȚJhut4Q7ܓFjm>૊t_K.Ë> .162U/l I\׉|Q6 ?y$hZbjbQA3 8.߁CbO[,0z ^ 8HpvRXCJ0ϔُ !'Ư89 O j~$Z~5!|p#d'ڳohc깖  Ey^ {~ n2uƇ(0%ɬF~ 6F4lWWv JU]cfʏefo=!:2n>+:iȂ=֯4f˯4;d As\v($exM&h] &*JeM_b)Pހ3ژ} ȉ]BL4'@.T?6,Ґb9K-NMs,}~b|юIo,a?ɲ;m:&ڟE iHj_ B\lrÒoa.Ǫ6򮗔y^a$)V GrߣeZҰ3qV,jl 8Іts v6Թbrl T9hZBl5P&O i 3g6~siܜD 6=c*E-`'2:.0A睶. -v%~9>Eq+ݕq}PҮI&6:la7OzgNXsVL%gKNafLy+úu(+Vg1 +*<)+ٮ}E;DxUE 3ujCp%,.}hDG'+j x!Zn{ȝ,6ݡ$N3g>69 eb5=qP}LW7Sz W>Zn4:?hj?YH.X߃c6OSP3M<x.;-"lFM%y_H0LG͚t;ӼU_F8rRKb ԔWJ{|:Hh΍6?Ya&3KWMDg~5֚_CltNN{.XTJ8|J  #,! kNh}+͍wY r+]e]LUgW+֡

    kӤ-"Z_{yP/#:r!(Yv f5DCYn.42K3ea*ޚCRv!6&%DI%4 .!"z2|K-t;(VEa\OMHD/'Ȇ\{pW g†lnJ$_S5 NF?-b{L6>0}XnU'&ѷ-vV)[gS|%ѡ %:,K1Zk7lf+<{Cv]̳ܠ7p&wM߶Щn{gѯ(!ai;/wJ/ڄg%:v K:ԇQG ߘxúKK}3`yoϞHK6b}!Ъ'SzxU=jFk4~)Ŗ[4U,<tlE8wnJ8|{ci`56k#=Byȁ#nPrl1'ՐLG;塖3D:)Rޯ!΅.i5~TbE4Q*.)-7]mb*`%Nd|tsgF/s.&q십ކ/fa! ϱx>^  G#~9m&3q.C7kωlK3tcc~y]F&jgX2AZ>BS"RW#M!? /j".zz\NGU)\~^Zg!5ۨs#?vZŎVVD^$оe}Ph6B+]OiE$-3Vts}@bfDxE рl֝-z/e^5=UX![(z`)fjy4s9b2rx;as,DRx9{^:Hr\9PoR8tZj֔n^ͼyPO(hCQ#69+,(/jdO@KrEm0&gSU|ʻ1N9639P3YnFZLnޕT+3x=P!e;KVUY`M)&nE7hEw~ھ~6E-b^eޥʓv.ÃziwbQnf ̉Myg@bWyieMM.i{PGJCҵ ڭUyMQN Pk'xuw--}R20 <ߙqLnKG,حOc~Z|_U=οnY ?~UZ<ՄyEmnAbL2)d[2\;wC瘲 "ڀBeQDWxƶ$d *>|bv:~d9V@Z0;,,F;\S:'# ̯w%DIWyӠ׾vgXy=GӯКFQaY:+|ҋ_a{UH#*q+գv+jCkzQxO?6|eݓI?0<ͺV׶Ry90ʼnzm[b%G=v-V6mXz=׊1&.k|OZ;-0"j vY92J\Jdo@V7 6&_v9 HN~Cp:tLΒ5CZȖ lC4:{ NmM585XW=He) S/5S. Mf1`23DPRkdMxz_ Q =F&܃tYٹQwgM~;1WЎ.%g1K;r*wzؙH:*5A}kTkn듚GS@?t 8 lM_a2"#E}v끈:`g􋝆2Gx}%l/j?_v̆Y/RjiOc' hLT8se ;#9B{2,Y3Y^,"Vv~D(љ­kƿԶsXB.?6`ӈmj9>Gm9. [xDEgcr^VnT_\CJ=DIbf>{ʷwxkhzr7C :V}ݖkR6)6@5Swxy!WVh!DQCѯk_uט?pg] e :zQPr=Pf=Хyb'gSh@"ot2-?A$о-ex|=0S<VGzvQ9xcr?Ypf"+6@Kvb;KA>Afas{5Γ9tfSi@n[ wac0ruRHpq[pCґXu:-OoRTv|ԥF!(Z  'ݽ7]+or[>~Q1xTigmJu_0y'A;4a@Vһs%)%ϵO]JM74JM^5sߘQ/t\g9n .tӍ C]4C&xQ?0}Sړi63R˽LU45 `Cphtє8Mrh\ jpMg*usHAH6oָppB/m!2E?H\͚ s+2{v'$N[wwDb-*&ǟVFUU$O $@ sJ!Rv ǀܗ䕚vɉY[ܚ:ݦJyk%Q\~wˍ[<St_WNtfúu٫e([fnoRd\لjBu~Zx$kXZl>a;ELzپkasHJ^лaǷPE&?j'sc`YC}Do_VrWi0+lgc??  o؞cj=.vV[ŔNMvd{)}jV%diOyUyD6nl; Z!0Հ@fuA~.ŕi_!VՐͱrHZ0,9Fb*sH;/A#%Ei _y$QO`h ٴ"{[#2/.BNJm:ڽ}/ڙpwʝn^9&y1X#zpsr |"9G;,Ad!3{kިu1 ddh'??̶$yy;(|"7\FfZq(v34+݄DE$7zJJftwjdswĻ78-2d!z;JlDvvygNרvl FMƘVϠ婢oh2S;IFLd !zR_|١o0튽 ^<ѴO-t8{~1z}{8w k5{K.K{(H'2/&؝xeHZIEf [ђ0}+"*pu99L +۝ZLftw7Y|{sIy[Ё "_ &̴Ռэ #x1>T.8sF'*9m4".$fcVٻI9?jvӊC w)20Rn"m7QM77&(%h?n=l.Qv_1%;{bxaX~:%'<,BQE0V`?_׎Ýj703q6'MW[&G| w|VbXefAJ&ǒmX9MPwsPHq|zZv6ۏ3 JF2#b`?o`d?dŃY1B .,C%q2$EfO>k\SV>m2^Ul 6H3Q[ըҡ^R!6?q3D!DYW=)#GTubV]o.'=)R/Y`w/1L2=r(|n$;Wީ/DIRx~m4* Mfr)B5;%r$R2!%Bf,ShȣpM Dyh2e-(%Ogv"nt v%$h lv@WsvQ=?1̓~@l#q89y!1DZg.p[:4&yR 7fbl vq2옉ޑ/,:A]Gie<_c!5\eW840sUhxIHdl1dw1ƒ@RR;ַ;nq+G!QჰQBmóۼ TyF MԊyIIj848qdINa{oӱ)m Q?|$:eYd 1b.O|N!"[.-DD[Db03x7R@G<[UJ)[>j5v.nn'B XQF"OyKF3{|_f8[ o׉ΉLг&^1L4ܲF̪1$Z.Rښ7›4 |}Qu=4g[Y(WMn'(8*yNYhQ0[ ۢuKO!3QvEHV5&ow@-uVZ!7/-Oi^1Ո?oFdtꈳFTTw jY8P|3p >|}Y} YBEǂLR곓 w*(pQzT0I9.eɟNhr7\VOZHHf0.STx䄷ZX0ݸt5tɊ1wP#aJ (F0+9:b?^#l"Uybavbs\li 4J*Vޣ}X9MpaQ y O0 uͳ5) ;_Oc]HÒЛ%.-21T\ѢD}Ȧ|֓)$`#T2ki}CDL8cU8bDatcJ(JlM]4̚8T$<@̓A[VĥQkg9!??|.2)ΊW1BA.|Ͻ82, t >+x;FE0\4`mmٰkȒD6?~)b rga68% Y ŨV1~'H)p'Q3GJ W9C?ǍzCr,B(2~I ?XeTrEcxGBy~bb|KW)\[<9Pα rk~C"^I Wo;sMS@GS;_Qz;H '}P]GDžt9Q~U%&A*)ꎎbR~ &K9ɢ[&~wJw eU>C %{bK|g1j I]\2:痸~\%K|y;tV4L}%\6CK a VU8bQv>>J?!Lm96$Ŧ'vtwxN2 :&2sZLu Cq' !Uo\7x( yoXĕ̾BdWV-<3`M>\S~YU=o[0 "m+;))e0Sɱ߱"$psZSy`?HyrIa?R*R䰲?P8p']ۙ!cR O>1BsBS(ܿ7*-ky|GRW!eN?72!P3kʬGBdbB&{Xyr5Ӹ/l'/,, a*'^FIG9'țIЃw2e0#>3e\uqpѥH^`Y gTBqQ88>z'&Q  'q:x(}3ׇmڢ<J#fihӅY*YJ_d.EX|fg.>F6c? [GCȘS1 %lFV(9!qu%jd!"*Tf((EO|'Ǘs3+gRͰMg$ᑉqWH1PS٨shJH,\U(Zg4\N]7',0#;:0=ӡ%2fF!4X;m_5`/H$cќLي+Z>DQ1j+~dv?/ Fʱθ&ϔDo][5JHY^^QxziEVY2?Z]isʗBHű+C~(ghAt޾nEdQL QX:ү4Qj fbrz?ċh+]]q3C7L*y Ok:-z7;| I& 9J !L7)0WntCSUX_g'7bqge`% ^PAzG?5͂M?FkuKa.pDWk(C+>[ēG+G-Z q͈J gM*T撾(k7I/hNcB˿eja#I ~'RZJڦ!c~ M} TzJE^7X@IwSL> #AX bWd,1G*0!`/nG ,IAVHXgf7{BU%%3Վ(@R=xzBH<l6X1!T],c 9:D)Ri4:AX ;T$0+upN"ɗXGI2lv(Ux}Js^+XG"\7\<j} JsAa16sh@r->9_\|Q Vߦ)#3\+PP,XcPSiv[˺]D/b`{ J NlA[,ǍcSW?SiNe9kFd)tqhqJ7\  +q?ƃ ROtӉrRS@s??}H^ =ī3Ƭ<>64=w;oVTUwVgo=I')+*=WS=Mmc?wt 퓁z  pv'/,6Z# K=Sr R !3:$ͦVs kS^E`vϜSSGwMߎ,SeN_\U~"Xn,''? '4h [i i#Mpa{a ix0#j> ~ycnllsF\w죾L>;Fse6Vk 䟋AmE ~?u/$w9mOM]=!=+ c‡1%00ȿ# '-8McR$']z|V25E %ԈO >epg} kVIT~naeڲ <^33ʺdcg..w6s/&>c.:zJ5ZqU2 .t٣/EpB Uh8@'J 2. :<=ERLaй @Ejqۍ3E N$EVǜ{fc-؇NW;A3;s]Wɼ+)؇~Z}DG/5; +>ߦqKdFOC{t⡭n&poQ}v;1Hbp^_Ԍ7̉YRCSY\J9ϏzW}֎\?!Q]d^i~SV-La /o`/3}^;XǝUZE/Vkd;15h&gf7E C}xj- i(^Ho3{=4>uGĶHj{ܕSgu{Cu|~UN26o˳"Kl Ƿ{FĵyM< -5 I/{bF8WL0%uGo>zd "ݸ;2rwn ?M)26WOb܏f hL e2<>4GR1dV0,_W/jւ <us5> aj"Xj`B1eyrL#;Bͫ*̨:c}Rp bWW 2ͫ2gs7Yn TSMM*ɵCܞ̈& ˔4=GY1G-倜 Mfx 5(s7OwTED@~=P+TstL5T)Ct_0Ïƨ8Fi@Yq{Űy7{+Ձ  hsrzB^V!Nmn:N6הAܧ Y!g!kQj |+Oh!ZyJV 8brxoipOٱ)+W+7 `s_P\A OpVIGeǾ)y8"}RƱռ9L=K>7QA~y ]uUd^Kw#'#YoK 0]%`V&W+fSJT$QʒY%[?}_ZE9cxr' ҦO!/H}se?(0oA4k M316@ NjGWR0\Aχj}괧׃i+)ޮ.vA?n"6EOg= ֡Y|~.伔2(ir4'G5U?E.rk5fތRMwm V69,U,mMK5MګwfכɏW^NjՖGϵf9UJ`Q;OVVl43pijˀm3s~eu/`e}Znc!ϜUaM)py(ӈ BMinUg%:^bRBm-Bme(=7RTuGGúHrbUg 73mvιnS|ΩcFcPƒ#~CCg{4Cnd &ߥ5p[ ͦwFG㯎Ae(&L\]WZcH2IZ#)U/ݧ?I͈~RI@tq7+:VRx쵇d6kDת׾4}״u\\8,$&5nh,iCawws>l4jp%5 eu^C"׾pG0쎼.\Hy]r %a'/`I:W#@ed~k3Nppؿ#󛽀lD2dԾ8 o1Uv٥<4otpBbFÎ(^Ak83 !ZY)NK{w:p}2.$KHOGxЩny(} 4rniC>x0W4w-4@4RoJRSgSmrkE7' ^=#ĘkRvpvs3Y\\)2xh^[f hgM/?;{.}-}* J$;:`?S`;Z-_(zd>|>(.Fei\ÛQɢA޹8uܗp0i9H~T\QbtqsA֭}fn@CD2Wwq)E[O3-*udZR*<߷k}2'E*"=h bs‡⳸!1~IF|ݖKz7?t*PI ##>9i} ٗ+uI:-uO Ԧo-K4T ]k# ih]ˁ y|X[9m~\GbkN04U6weyH9907oo{h*TzֳO5kZ.%# MU"_)#v<~4^^d3`T~'8H.c"m\:ƆqJ5'1^*s{ Fzw<{;5|W5G7| yj?w5Mn=ŖZj);/YN(7Vb)V*yE 7^ -{?2g6w9;Ե ':S:7e鍍UYx?g&v#~;rGrzbse$(E\`^Ďx u'n-<)S)=UcRKBY"LYb(+F:oNҨ8iW?0} zrY7oԲNVsdrrZ+XxC7CA-= &'Oϯ >x=XfB[`|nxO *nGlLϭ0.g_Qո*D5(g=]rB?NyN2q\P6?Hd=Kz'l%gH2. I:RKppCxRt`lrmD#!=+&kNYcYHfa=7}*E9ݼdxN{ KJ=5ֵ^Q 홓  CΧ=oF"/c4UB 53swH3eVfy \F<#ØZRA7݅D;{_i^'*ϲ}i7K=ӛ,NP:8/ 0{<'ٍH"f4;"y,0M{/mT*foV'-_N -! vd% 'mh%i.nX3e\mN!hy|Aʶbјe.%4؜q]S'59iM$8}(巗ݵlE![ūvx0OH1YēҠ (]VC=mehԢը5lAec˚!׹H1qjE'rzWz!SM^hk)V6ay@s矙ik Tp! s?sjsGb\W4sWdyRקuJ"f~f$ػ&JRK*)^ieP_m%P]]ΰ{,O*W(+E#i +Smhv-ABldf6.PϠ%=Ϟ+coTsq8:aT0ug-ȳqo?֍|@@x w9z9+}΁3H, ̊Ҙ֤Vi rӳ@ v;P_S ŒȪxԵH4HVχ+ɿro$( -:WxBk?ҾQ&B~s3c2w5L`a I<#JD,YG_]!܋|^K",~Aj]D0r]|+"R,__ܧc/'쎻ݦ)r7OZ[@; [j8&seV%8{d$dqӣXf$#!ѨјfC+|ЮԶ#Ub\XV^yW4_^)V"4F"ܪ ~U[u x45}< y~T |*y/+Ztmfp[SC7:E.sALÑKR&Kr- PrӇ, 4*Pu}=ζIQv/fvw\>$53hD>^͒+=i`mPZfS1oU z~WEe3Q=&? -np# mm{(i}cNHLnwqQiUʡj]8T :mLijFuUvԶk:)(,,Fu0psS^1y/ 8l`|$iw=٤EqrjSߏ- ?UO81.RXVS蠀7l0xQl56ҪbiQ$gTzaNyuvcf}0_|QM㮳{b?BX'ң2y~ɩ0u+]}h=~nRC)=8Z=z tdmUIm9?> %MA :U N} 5*=\|GX٣h\E]mEgG< ãz/v?~+`޸!pFD, X_ݪ6wTNΠ;=>4|&A2,&PO3ub@Ew_ե9B_8s`C/e@~pwtvRe!H\a2CW%8r֣okI53[x,Qz$V,ÆcYu!v0f{-GޜFQТHp(v:fMe3߄XMx(@^Xބ)DI9~c*U~|Z&odY_ bo9Qd&@(cW~$>OV^KZ5(SLwo _x#Wf lwv ǭA'aߊphΞH5N\9) Jw147ƍh]ryFkhpͯ\rKAƉ#Jg|~֪\A1tK{wvAeIN<⫲j*dG+E+?4r+r[+Dy$cE j VƟxzeܤo`>_Dj6Nj66C_ZuN>SoPRCM)(ڍ! > zDFPmA(xtf]fOD[MWwob=44B !| (1l+NU |2g 2Cs??؆~}8FX;mr 0c,8G98-dR#hJx#LdR4(Dw/ŢG'CGwHQ~®B;^װnsfK p0c2=F?r.8g.@>. |wcвTpqὲWA~7Lfׄ'/$ V;\},dwYէ*P׆,kp6k9Y_Z jC@$Z[wگ@ًNX|HUNT@!Tܼ qE@pϧH;sT (>4NG+l]JאkkoV)ei@cUzfqK{>*68bLxkt]ݙi/ESkԖ>k؉t, H2_0Ti+kN?d|H͊`f2{lǡ7\~oa:6="@?#dmUd' ] 3a>wlR౶{`##S27ON 7g/ x8GE|yjJaG=18b:3pZ0lٙ\^6m17 /|)EpKP9C2LqK>JTHHiAƷ[C&"wq^~G+?sw<]6KwRa+{lV6? }b[vea+G=v%&X|0'׳H9C (w}?8\Lgs_|s͡E*&e1YE} V]!t=BIBfnD -sla⠣ 2whaMM;=Ut%@}GfViB hީ&zXj" HdSGZe⽝9t5*.Kn"'?mM3g-VЩ"0pS"h+w)pO/HVM UP%E:b?)'\"Nokp}׻yB\_}m\"2!Zg[+,]>H1|v..E ܅]D46vor#;`]&w̤I&{˓YT.Q&߹}ZXuӒA ne?]t*Iczl[o``jV v>U+oײ={g!'uB,eQ'$ùZ@t֐e?#~O hkce/^~b6_XiVuXu궨Ĥq~v_fY2g?' sO0+X|93_fW"&PD jMdpY`V.&Ցmr}Stop]6Kdͯ vG <)=Qm$=4V۾q)̓q-]l<sh\ K7-@NFb3\r_><SP{_X#>aG^6&=:@V;BZ)3# ׹/QǬ] <}PB=HDYNd[Z3UBbosv:ߗ  ZvUG||``SKnaq65D](KS!ʫmeӾR5sEO@ +loTd.u.#n5.B^u`A5`/(y#ޅ2腟6}WoL' bQk| 6+֡8ʥ(sv?:HW|0L AF5۲ sKơ 2gN)Ws[].mW0"y+uO>y 0~UmƁD%ʣBBoP,bB.Yߞ?B6ƃ00TD # j1`j{L,ja/\W/[̡y H$J z{ɌNVuZt]-)6 A]N*|.g#1 Qs+Qo7 eNgCb^?ʉU{{`"Gxu);E>3t|@FYa/e D|_fq (t1!? LDKUF,,w,5/]ŷ_GeoB"u/Wc s;/XtY?pyaS *jk0Ɂ@YUO@h-a;)KIWkϷkyOģ1{N ѽM(5qH`IC/M鏎nprbJJAj8ٖ2oDWa_I4e7[N?!խL7C=%d75tŊb_쿧^xJ;SMBrZܪwIcu\cja*%_TLI1hH;|_w%`ʯ>YuOaחMӋ in\d[g]jA7c#s;Q0[}ՙmvDޤrZN7bd>[c}3OE 84LR+M%0t'Fpdpxld^$:2;݂niRX遢9*0uлw)2~ܩ t Pbn04\82k˝y#Esۑ/ijհ⹋lm"yY>{dO ݱU?ɸh@I~(>t1pjBL|[erˇ&c'L&I%#bqY#`CgIi$ b&y8;y<|7:?iW\4(lֳÅlEfH%ˮ}  0Mzo|.co. MSWJ {‡e.n` \gWT@&YgOq$[S+LnmM[EGqtݛ0z7}C5ʠbSvl $6d) n+>y[?㝕a.N^D*U'tZGǭڥ G,w]e P!?b:RQGfa/\+>mTտ|Aۼ"3w}f #N'7a܎XyRHmp@iFppuK3G]qHR>700 BRcs)b{KUP/^N6liPyY^eP?c?'R׺nÝ+mvjh 8 Pw9oHY·NP/N!Ihn"@xݩBf٠kAѿ Ef߾;#$Tb+5Yz3Zc)|繞n7Pd֌ңі~('օ]m'AL~T үEX",sE" qv<< w'yue@4&!D&<7Na,*Ċϸ3Եz2m)AX#\#o?Gp; “ Q%5 Hֲ*]ÀU!ިy />C$98ldmϯjF7S߳,Z[tH?>D u7h'xO."g5$!Os 4D& aGPFYSiX {,qfn*D. O=IN[RW9l[ [&X-~$h!ʕ<u6#M[\fc:ם OWYIaNS#Y ~Xt^ɍO¾1l2BU1hLRD"!s ʧ #hD n5ܨ'†2Aoٿ~rңA{ĕZޔ- hm 2PIQ=NޜH2t-|<ʼn"Z(Ө;Of[jߖo0\/>}up?_Jp8 1~zYiskVTy6w!ΒՋ֋U>ArfaίXʼQDo XQ k3\Jf~R}oKO{u5}(bHX/Ṇ X# #z?dp_ɢ3D3v 2WVy8,Vw^tv "pCgC8d7U9oow#C{>GriƟn mc&Ŋ6,zOP9D2AkD" ZRxdq+s0mp|p:LtFB9/|xsS4' w~7;J<'woI Ur +,7> ~_b{8D;B^)z ̢ڇ_SW; ̛D ~O.нfO;n6xuY#?v< O>h%̘q#oɊpog ov߷J-| XScuPМuU:;A_77$;uy7x)e^jsW(wX*4«n) ׋,YjY6Zp͙ ea|rH'$ Fz}ygmr_K|:O8|"̖3ۈ|pm>t{86*Og#-al+uߚ :+:l?B2HcDK迨זGɤae~Yc^"*zzһ;.D֋yg_FK7l_ͭ썙eƵQ?mJII==VIDYf iAE76?a"/[Џ$Y̸ـ!`&rk2u ?$Fҭe͉Oġ.[ب&7>+a%K}(F>yY_MbAICYIfo Ycb@EH4}T\F:`1+bwkdž3%{%Ԥ]I>RW >oP ۹.ޱDIX]T.c1i/|- >\ˣ$niwzMY%o߾{glL<&P3E•eW-ژ'@&6i5=iQ,"Wr7B7IP`wHdO}9+(xdpZ[CxFcfr_Nu`.:;HжEȡ#|r6OĹ_F" G&7ߐ=\KRrJ.<҈D?$ j=Oڇx@D=1D<vbZob*ZJò'$>Z8(}"/Ey̾9m!v?4wLM}>sT74ek&hUinP5cFѧMm )/+ogtD)GE1Q5WΏ=9FY|'MUvtu(ؿIiհp$?JjLC[~SF)9ޖZGϴHȩk1zj/XQw>:Rp+7PLqc50j~jbC(!\!_9e閫=F EE[%u/E?<)ƥWn_"W͏ ΐz6bfKABZ o( ̬;K/1m,P<@+})B]LbÇR~sfg2Eƶ#~(TBCy,mAJfpm>*c͝O SÉwXIzܨs7#~s Ky LUi?¼p|bG*Jxe(:q[A F\gf&m<*H(f~3OW)?&޼޽y݃zhTs$oܠG3M7}pUʉnSM7p}S\OzPzoULXB_unDŽ=]gaa+7W赒!>eTE-F6N?zW0z,b5.O|W0Dşf=MFx>u= o]Һ=LiB/l"x5Z"F3dG7SGF Y/ڤuՇjWTرQF܃ßvLTE5&WZ:=JE7Ku'#fFt^G"䤕@뚖k8M.b i$fZvSmKeWҭtok p>yTo~   >$ߔ>Pw%<Ϝ'qhR%Mj=SatrW5'Іyj`(P@AVڏ6rmN2Z{wX|] [Z\Υ}U%񙷳7쐏i4; <4\HvxSc| K <^?+g#`fܑ "'>|_$]:A'?qxqw_3{T< ~pJcg9#٬Z\50ceV$7v;MIYrcdO;uoɿA!M ~Ek![ߜW8CtK5Eno&N"mo};̓뜃 ט􇖦1kJ¨} 3(\߻%Ӹ2nhJxtj2OnO$+l`:M"ۍ̩?\ޗAqu낒*V E>8^GX?2q-p[.@T|L&BTKTr4čKIs|Q.\B7),6RnLS7 ^kŀV\1d{]o!BZb/r[lr²[$d]cG9:JQVV xcj Og# r}D16ļ?Uy|45ZqZiyٜ`MD%%%'RG cS MJ 3hiZWd|ijĄ$Ktqr[SWn9J{^< L}ZC ۾9{s诪{Sknȑmm@U ;߂ipܞ+~}z6+ V>hvgյŅ$q{I{UK%fA%uwaЩ$&Տ S3(gu5OcIa{׶q.Ӆ'dȧ~A}:|Xoh>þ%26~qAa.7&ܮbc5z\'?Nzi(s?)<-ssXqx* O&  _%9V$ yh1Ƭ2v?oqu1#'äGvA3.a(uY *cPјn\_e-~8KfbKV¹{YP@t+=Axy [= [~_鬍\Ifm{bm",68.}b3:pbLgWQGZ۠ ?`7g<>4n^%zKV~-f-;~XNZ%T*`rҢ .+V̓9}`DRgvױNJggK8{m wUW|y:lgp ?M31Qd=WTwGD6!D/pJ~-^Ӡ.4tLsqƪkQf[; U7:0D *^n vo0+'$-ߦz&v!c_({5gegߙnkģWRYzٰzZ>ȬGHBNaz 耵1[~Y"t->oxyOi51fm8#,ͿߌgW@`7lwu1( QhFђG)m~8% x^.wzI^vl2Icp+7D g"cHj9 Z(d]xlX|"ЖQ7G8ya]-җ2cK\_@}<<%1Py5c;5JqNcfHWq T-#\'?:kZۄIKX79r5wq M~l~sozסOt=fVsrJI'r҃"qSu~MMbfU.h((dŧ7I\^o_.gu?ΰŐ+(# ZWS>pzl9U~ͰZ:`fi ,"f)9ra+.JFdmԮOdTmŕdf}vt"Z,ǮZI9G {pqh/Zow[LHUx3>Pb)nuQ0;f'-.`4٪`:p${pٷT}$ñ1Hؓ>y0 ndDAeÏ..=N{RdlB|F5"kk1G\8N`}W<'ѧQV1NBk Č[2tTv{b<⇍Z@^y_1~]dK~!HA]yYӨpQ1ЦWfU3_~d.ޤ &y$|PVO7%m%_Xi N]Y6)$5L\ncoā_V HF>y9?v珌T{v_JB5>A[1k} f7$+:5B̈́D)xX?gIYCrf}ߓ7F ,{@0R%1Ãd^Et#_, !aDHw͒㈛z Ҿw76Ы@n:ɬ\jG{5Ӄ֍ N':Ӷ{SsEY>ClH́)fBX%(ep#!EyFznMz z67 c4 pfFY{2)S4gws$DX \=ex] )dTՇW]S2uɦ r;ߓ`&GS]/FqHz%s}(YY ̽I}ఈ|^ ULIŠ/+1Ťupuj| M*,NgoEmm_Dsa9 4`2tSq`Qm4_7O(DpJD mv\Y`=^yѮJsiM2>Cʽ?ZY^hש)x|Rw/:/٧7rC[wNwЗ'!Gj-Bĩa%[(ڤ1>?K } g8k6ؚ䯷KoJ>3|/{hKgi2x6sOuyo8{&%mfO=toFߋNh4?^kWp|eu,VfV1^W:]:}Ckҭ 4SxB ~Sܼ,_kQh|sEK~QIgK613tho:M޻|*]ݥp)KZ7)@~[uXPd8XTfOTRXj |ft>w-i v)گWˬ9fuʅ’1s)wEh}!Ø(3ؽʨjYuzyL:hPnclk |DQl >}ӧpQNp#(X_L܄oLBrk%|}:n\TzeN4~P^#yka01_ -z$#BUs dn*ԎO: &#A$-C[s{ 9'(v*ǭV+$<fȣZ6䚼v 23&?ZzkTB2{fSJQcyW~ Mktѕ{OVWyKP:s`6`ui<Н6W{-TwRgK[fZgN> {^;TBb$zaIe*X^aj{,%&[ªp+>or'L*7 r0!A7̞7[Gp[֏B3{\IH`;⩉[S7=mss>jJ:ӱ7tyhb O-g7`2_g d(5t# ~U{&)R|4S$⦏@T (Ĺx;Ysm EE{$}B C0/>R0\?` rxw%1v \VDH^^LiSo܊A&WQI-6B Wu É͞MM S}BeOOriהTi7#f":*aHG+M.+Q? VrJo7RbIS7}EH+h%/` ߙ >}qL1(9%aݝd&‘*jЂo: ,6 [/ʭn˗Y-7 @]_n<"it5N eIS饙4&'.E3V$S+ _Syy+X =߼2sݧ6?bZk0U,5ld~)|(Ўi|bpw- 7"LXG iytطVP}.= KW-9%Q/U^r~8tex1qR^z{ZWۛ(Ζ/ [NjƋilÓ{^4}67eFޫg - c%{Njz%퓷IKvԴ]2`*$٦F%CVٖ7aaoy[KC"E $_>|lNz6tviT11ý^=0mq88T[>@"TT%NxqhDtdtp^ʕ#6QNH7T D~ ȍ)wgOs}G.";iL!2?`y]'T>B͜5\E?=}3fUx]-u:&?T!\^ 𭧹hY%C=eDjQqvzPZ.U==sWO(n]q=\p 2>;1zV푬nyɒd+;G6iɖw@ڗ+vu߯Eaw4hD*{5 vr]S dMK灀{2'B<__27vGj{^skwy|oFq+2R.jC=jj#ߢ[3F-b+iݮ n)OpI4f;Es oNKH7UkSc ׈Q@'61|=`f1ׁs_ęKlDəh4sv[=N/~3sa=#;?OG[Շ2 5]%I#79zr*d<|au!4sQgBlh>^}rMj*RVzʰ/XjP;:/dҊJmgN!+M!3?6%+KGN]{ݗٜSw +v,pTcHfn2<,wHx#~N3RÜ^~s!59j:Kv: *Ĺlŧ-qV.Kуcx; BXrs~կ$᡺{Gu) imslIƈxXLF-w [YkV&}cY@kmgq8' yk|uCK#&jPo(ڇ¯ɱcB xl]ʫbxlP|ax}쥎z_#ɬ*&T^*F;Qvh$u}2('S0;+wV1I7~w Lh~PVZp.LI]y3y j1Uɺsꑗ~ .昪]wَ5HVhA^j~|X|+!yN%0Cqf4_@Pv W Ep41}WL| 6\i>!FW39V\-.\h%g1:6rYB&xT~*b}ěu%MQQEKSg%cW/B@C}_"Վ~ޛ8egJZbrſX$c6114ZrGN ] i~ !"Fj[#y |.,'vƘ!63zsbat{(ˌ1hljB5T3.I[!?qwc G|,o9kfH?\kqD(g80tCZnQ;O!.%ٚ<2lHg[=m;w;U4šez%:e>?Nf}aؐS1fNȾ> p(MQs5 LUD?qx48$6'RُO$$E. Exjt;G#1't)a#;D6i7H$8\K0˛ 8;/< ;71$k\!Zca[ gax!2e3hյRI@$dyY_O>6U4f]Ϝ@aĥf*fa 2[KK ?Ya]Oyt~hx:wc[V+έj%Ś kT[{>S5쭬i\86">['2pCzr~rѲ l[)1I<c/jZh%YAl'5*7VL¶>ݗhxSbw EO!%{m=>l5%AB4d9i< PUd6%-IMLLhFs|-o]thH%St\Cbf!4 0'8Z>vQAӸWͤ/]ɞ0DxyCsTt' s : v8寮7R v|⻔Orr٣,-y2ֽ+6%(|8 yfby'"3_Mm4>J> ݒ]XNx&lV|G*b*^ #){߮rQMkM@z]y<ک;c8OC_=.Bbǩt>!,a|9nƽfÖ$88HkҮ/0÷Q\Vr>1GsFVqX6 l QNswm1?i%${E{RZOG܎z¼*mI9 *XP-jm 4sI%DSl-!>E [pVruA& jMW˽d1t샘^Ôq'iG8ſXGoԋ;h*3uNL#=H?x 8Zw_Z(vX D7Ϻ贑,;[<('?}^psMh e_ xb^P!}<"s0񱧒+N_/I͗}MV0i}EVb^ R2;d̠cp#x6N "Uq7eknhŲTt*ikTc=V.5+vU}ٕG2a i+"#%~mf ʍʾ9]fl/zJ,X{JUw"`Fe =x.kr<]Qsn"z _06,a|3,Wn0S@$2yD;#w\j?呁-'5  cM3NfBHi.  1sd=Xok摮zsD'$/$y<|C]OmM0]9 lM]#Ic2,jSwT6]7yUMmn_pz#.oJ|FyO><`Aʳ2#J4PVq0}Т,Rg+rz]g"UM'U=BfZ&_>a>u]c)i&O~Mڅu_ܲa5Zb6ӺLL`duc!xw8Ǐ2Ӷ7) b7GITӱ?m{1*Pehag3cÁ{ı/&-.e[6s wAӑw(ÞEO"EE2;EJ30Qz?z::+B(?CG8\->OMpuD?.VI)͕Ã{ޫ'`TG\7`˧Q' ,\<]*Xyŗ74 qeviG?~'d#B0m6Q 6_iGJV; PΙt6*9,˷|cڟFrF y[/O.pϪDʔVBnghl;BIk͈+"ד21oȳSME8xbE.{w'0xkEwRI|8gVC]'^諪2+I '!xFj>S]v,'V]m;T(XrI$/ |6 NW͖HޛZk)$=z4&}( L80AӞ{L}۫CA4-L54_bSE}?oW dekT_XϘ296Gy|k٢uBA.n U$;\R+ڨRfZJT?ȼ+j`̆1.QJGMPG9;ebFZָ#',4ϺW02U~nkyuzqKL-*C >}$2e%||_yߥ-~e޸խ`Q۽eei7zXWg\bXύ^fVU%ucŏ^е݈"ZeM;'k#_jkƌu+w!ԸBnXg7!9h1{\UT#V9J`8s EWpt2.56I2y@ʓ*|U⠇]a3q_M )%sVα EEP7L0Zad3yQUX`*>mZck:#S6УKK/,[_>Ps4}8XXBhuI0pQWw _f1bcܠg(^>_eNo^3Eng=D!l+cdGL=aQaMB.jU:1N>x1cbύd$3vsXl=ܒE~4.d~CIV6M34Ƀ) ٣:/gh+ۈ m&O.4Bqm%lɷx|@=eh<ͣ?kyCZEmvU-L7q#] m!4 0=iJf\p53?e>]SSsX NVq70c Dɾ6pesF<)(S,W*诉b$C,}g0YH7UtqY9e1hCzuQ^wQn@|*gX)tIN܎)ڹ~Mq/PO|*Ͼۮd!^tVH'HG AA1DzH /2 밦[MrЎcH:@3`-┄vEcȳU \& 3Vpse=d~2qC#pl'!| >r?.5u,5}[>  -9g܋1$7/5A~RKæ!?إO 1r .?'o@1(4vSZj޸ʘYzIC_f~iW7u-ez{sm*qm $f|8al2qrxRŮ*JHiR#TGhgx@%ڷ~u.v2M'X[VɉTIZ 痂*]3D 3gG(}7\ۇfC_/:CoHuu-p)Fa8%丢sE2'H<:=*9%"Yy'6i~='QpOVjѾ/}TO87ɖWTFt,Bb?j 줯m`U!뙳ږU#K6)+ngA:e:ɜ/KB^J ޓ>ҝpokf.r*I(B2/Vw6@z UU9VcN?lHQ=X8@o\3HAs'@)lS€ $RcPuW "˼uH78 ʑē} ȐTHء|04>q~{uCkx*e NkecB [&kt'V#X*n-;%XɟB.뤻Ee(pՋʦ{pHEv -{pVs)XvK9q1sW8I1+M@=?+l{a ڗ?OyI}70_ nN0Vb2o؁ڛʜ;#fi.?VS jpj=#6h8(aOZ>N\BU; ^[Pvb?!_o8ڌ9 8LTfKr x7_iU<g4JZيwԕZ -wyCnYA]AJG,~ho!CwS g0:~{>R|<^k=m?O=%>jf&R)$:(B^Ji5}f{4"*+ag5N2: V(_2bj:V5Y$b,Rb(o e)jEMI%aV{$ >Mg5Aa_.n+02P W,ursVeמ~od$Δ_*)Cu \՟ҤqrZܺtޟWKILŪWLYTAP'ĸę;oM6+c]StL3FzۋVas ]O NWZO ҳf{5CNm?Ӕ fM7:A￘&nSn<򥽲>o[k'Hd:-s.HEÚF:\+XGކ6"#,Wvdx6 \\?{s3Ƶ=r;sDf$3mDtbwc{ZmGQVw-ٳqLy9bruV* 2)ɘgC=c6~HgƍAhe64?*D#glެlSE?(cG3+^K!1]zmQM}m`~ZL}HoaUCW1Ss5ZXu9~)W"8~-7NZ8HZ~8\ڪ\SGg?TVgԐ~Wg !JgH,PL[R9t ߊ/"{Ga~k,[# S&6dL u􊛹b`-  ـ2}^}9@>!?,H*ѹ.A `ed},鏎#,4^ s܁˛FDϿ;ui &T>yt[6st3B%u?o9 h'}ѝ;"蚰 :;k~Q$ AQ$c-=HdR3aev0yut)I%j>[?yUÀPal#9@NYzTfWLG-"+*N1 zng)ZIn"՗oR,}rAsQO"sEi}7߽9<ݢ,`ȆiBz/n|=Oʛq Av+ݱ*O0-*Blڢ1 2¡PcIOhfULchN# $+#1;ZQB5׽Ѣ|M.''BR/qxd?.r"޵"Nv~ZQU`\pXY\֋@㗣߁XJ`K_bԝIB9$=ڮJtOVMzg^Cb*Ap#^gus8D9xFZc^(U]w 4πmB^ׯ[06kJnjTCVf(NLfSV/*Kfgg}by&o;F,B0f{ \NywD kA,O`(bՠ yov~#ś{>u>ٻeS2l1zy -kkM¬Vgˌ<_?53 [pNf6yә(@(˜ EttB=o ~zCGU>WEQHfcIE{ŀ.JS9#ք?ctA1`kOe{vz<(pG*?¬-Ww CQa5DӽSrmWmP+L@K9ӉmL@ijȋe됽yO͵/2' . KyHִd!h )3)P%L/V?xAqwTj ˊd*3z|ْmp & P (8ProH]%a}druo* -Z&opKL0Kɭ J\weceA܃n,~GP3fu%m-ѤGkojPj'nx62~j_%8Kv1V4FjkU'}{>vGf/naͫ0#~}{Rfm/Ok>hQ35Œ"W)PߜFk.|./$mE?O` N:hzAoS;uHrΟrNF>2_iB!>2Lp(=̰nX̧pҷYGћۆ*ɭ ݛu]7'[$h@ਸ=TyHɉ8dAѳm2]Wf7C'ɰ0㬬^_8 q:#SGm|W9eՇ^/wlGɜPa ڒJ|_WQnx0V t0G+GDUqɏ[9{ 0~IW-^鏏8hqcliŻ`vx o)R"9*a>.`xaRq M/cfF|& ]z%շ,PA(ե45+fL;([.D$vM6S`!Js6Lfir$\Sfq9[A}&Dؕi#; a_׷BނO!z ^Lۚn,n&-'ޕ0C ơ^Bc~Z+R-.&@0UzD|1aqzwK)[ݡ\y3[\0P>EW S|WF%H/tM]NLv`L!6h."N (?I癃cV~+WG6tq:U:'rs-(WCC6 [*L]WEp1CeD$Dژfcct~߾マ}|^q*eܔεMNI2#:xar-qqwlt'5BGv`|dk}ݦ;M!聈ANpMAܾ&ݡ-=N$/p^tDWfJIEFymajsm/ `P6++8)*^&֦(rT>ٱ1TT>TVLIb7T2/chzy-|`jʻy:ݙYǂ|Jq?n\ZQ7]y%_^ k쾍2J0^ݩyj9CI3s{c;P̸Q)-ԨM3&MA\wk2ǘc 8wt;N<]ukmjFrRs lgP+t#f;"}82c38rf+v}e>-Ҡ oY83G*c?16~eqrTie;RtpAfBbvJXwTڌ])x1׉Pf'r8xHӦ D WšCc9XC,v C$/~*GŽGP21F#8~d8?dW6Nv\oۃ,SvK{Nff>6j/Q#_uۀM;vX#JFjit^:ךL5/0!Mb#[H/b O:-F?όq [6f {\RA^F2c㺜Lzl}1/9i_K&pYf̳oaNقC-kU zsSfm`aTvWVkEy"g&.!.vG(7G ^- =Ts69q$؟p3o5T3;@xp 9Rmѯc`$afp; ؏AF{{L f`]g3`@⋡C *+B0޾Xg,΅aaaaF( 2-O^V~`T` b& }pK wR @}psC 6|kO ;A4 ipdnllnlroߺ̾w]*7|IPLxÁ>>HX3n =CHO?`p߷%p)/@$ D@$ D@$ D@$ D@$ D@$ D@$ D@$ D@$ D@$ D@$ D@$3D?=|-`P b))V'p,*щ6=ֹڣ݆)[- zz\\ISNi'3#oTdp3Z߿080%ڐe[rdC" M'O|a.{,իWf"-ĉ)2 rRMRt`/ #)JHSh6 Inm/~v R,X`Mդ 6,+{8X~YWeeHhjBT^HgK 54+[-C-w/2q?T!sZшh;~F(KّDkvsR Fk~ aҪ 35Ń8;H> 5 `gr|=&jۃ~)MR.s_ [K2xPk_r30۳fKɱl)k/Pskvžh SZM`RghhQ/m5vWYۇo"i]m{N&Pܸu'8B!BdPcFӰڈQNBbX*t^a/MiEk 5Ʀ쪋޾J1=w^ILT|Oi)rK|-ZNe"<{IQPŚπЕ {RXgEVT5hS8lಸopսƇBgklrs: '`({p[OgjTE|JޗQ#d񇠸-ޝJugr2dxYiWTPe[9a=x!A񰔅]9~_wur{EU%+_dzU)&ĹXiSfMtij >>huˣ~* -7ƈ#r* @IO`U xH6 0/fsDxk1):uh+Y#(5NݨXprBi8*#W1 #xuC.K@0یg%ܦ![gH$R%FE|IC LE.Cem5UWT-}[P62OfI]c1h;g@E1h^8V(jnbxXzȿ:1$nB.|2[e*eruwl8C^kzq`ړUA;uY?cJ_4R?}ahy L͞ ] 4`@m(.Q7;ب5P5ASb)<Muz\F%$ 1-$j!NwIs9~X~r K:%G lK }ZxH4a}s¼$VǮdqi{eY-tej 29 RRnh,#xvk!r`ã[\Nr Um(vRp 3(/[|!u& ED{ԩoV=ޥ8?vjft+Nk)0ggWmZ3E6ljd|{vJ96))6 LfVUBLOY ȃ縮8M U)0`KEn*EAk_eMXEFzϔ6B _Ko'GOFS l/Rە+P5>i[8(ԁVSf'$Si9:z-+VZ붭n4B58+_sqQ$oZYP=vzFup6γ޽ *}Y>-Hu٣*n*}԰]2*D T;sv>x/@xJ]VMi(񷔕Zd\ܧf,4+/^:PIk=VsKL]mȳ{Civ]T]*SzNq07/cf'wbh>MbR^a*-H\:isݗW:)\1Z3آIV%G(Dۡeo"F614`\$#@MW{m>KS~WF*O^]Utuq{U03ѷ"c^dbѯ2HS$T07&U~mmvZ?'9>S\{vk"ȱgO߬'=% 3DJf$}pwɑiPe}i|HYӪ~|~?f|}Z̷<: }}!3OJ}nɊ!{)Ϙ3 Aυ(y&^2m8nڸC AbI‘'y>MWmMWy?㺵CtCfFf" K,E rAPm7 I$RD=.KC;ކږY:CNC3l䍎遽c)(SX ^..>tAr7GNw[#Z&fUXq<<AÛ;fRRK|JfԾ*Y w"Q rA\XPNcW΂ވCV)mKrο0 <'RQo;`|ZX[p|lYF{KJ [h+F&8WL6^gnhA&$`l`rKi=.ġK QCk}奩[:B6̬38`ft_q[m:ku `tR`qҌ Z#Y9v_ iy}9MĠU~eW(`xAy @߿P|=;qkl-C,wmxx@y(}r[R=z (f{(W;ꒇG!J"C*jJAAM{3r0*]3/Zގ0WU Q:l1 $UQ\(34_?2Gܥ< *=8Q׿FezHC_Зe,vF.QKwO-DOq(ܽ:,|Mn:q;RoCy ˅G(&TI?~ 灬mHFҰC=Q5*JvT9Z4Jy*4M|y HZt\Ӱř;AYVYY&DGA5M#_*Yc. s湐h:M=(A{O.q*.X\^fl<݉&} ,>fCJ/+yBY>5vJ $vۏDA&Vv:9}k\p2Ic_2+ˣL@;~:]MnOT=,p&6hhS0o҃Wϧ/=)?Hb"ݱBМ(pfP6\E> ؂%Շ{TɓeyKX,{uqzJZ@hO.rK7_yt P;$!=yEN\wv`sp3{l^L5ƹ-9 9%/(7roρ yGR fey)Ym. ( LwQ熽st*4*0wWuhmY#(gٽPN~Hl^AS)ˆ%\ᑅ`ȤCc<\,,#}xPAs6pϴԛR `2$۫iOˏHp^]\\ďhd BR Q(K4^h%ΰ_oWt *(r(ЛyT9:hJsT\Ȯt\9/YsuON>2Nj͇&>[dGݏ$(*r$6"BvI$bD a+I JC<ϳlYEG O,QGQa ~ԞW gc70F,[oG|huUٮ sK*JI[jA\Bmu`twLfyf6֢|DS\HۻGk6 hwi4ȾHJh85>ƌB:3 N#m`0c_]PnYtBB3Op;U; B1KÓ{ Ro[ۖ^G[*>2=̡[vԻ+:fӼcEe30f+ 'D5dwS.9/W\1ۧmIR%Y &FI"bp @vwx }k4g5YJ7Rů@^ƒ/%`Q8HD*VSߟ_VsfVdv]2}.Uy-r~O:O_=ċfyr~Mr=:ݷ dYyK~o}u\lXq֝?}_@{@ Kaq"!Bm'Rr >?֝OʺT`scf% X((2e Wؗ+'i _1'aɰ1VkЮ1};3*Y1]U,QQiH0G$UE2W $~."#To@yg/7H0φ(iG)ˆtrE]lRf3Aumo#@0 dڀص~Mdv}#JE PeMDn麁qSOXV}dcQyqwaܱ_>_`vQr`옹'̠I]kُƔs`!r*L|C& J*cf'2޹#T{2-R2i0~K@o?P1O|k%Tn\o9. Ww@ .Vc}.0CRIZɂ$cbDGd㈔;\Mk5`@FYO ~o|!pLdWL:>Ti+(ݓoF^)tie2rͯ9*_VR2Vs7Ih2\kG:7*oC:9tm=ip?i / *SR[=D2Jm^n*;HH^?we7|ݛ+ kyջ#N 1ks->O# Q B66s} bxlLvK|Xtbr@A%QɐƳHmyש>_*u Tku ̙JFk%~X #t+k1&iA<Ws_7m!.GY7 </q1zըޤNSU+ad^^n +vgmsZkúUϺ3?>rum; yq2ĿLbC *d#KQŐYθm`G2BgSIOyuZ]P2 dR.63)i0TiՠNhE)I*ढ\.`'% vneQOh|^fjD] B1h2&?,5Z"~ĺ=y[~tԃcgTHg$rq#2)Y(B5mJ vMglM|( v<+N~#aoJ,;}zsY#$Ec$g70Ktޭ.=IYO-‚#䋌\mReH,QOYEHYMs~3v=HħsmJ}yENσU {㸽ЯV ;brCT|-xB/ SDőia[P( j4|%Yq9aIwc{, ¹t4u<]CK:D}m} k=w1w䯽uѲh@of}C:r]*J9)t"6YⵚXD2D YzG?:niJi ،эi&Aio>}!PP(x|: zT̚7!'4T UjS>.n3X1%p7kN/rؒlVVM.Q(m?r2֋9̫YkT+˖ۓ+bo&ک>Mkg?yz}|c[w]S#:5ߑY[f)B'!9˰}S|M̌[&j0+4y3u9&-%SenGˣ?9KafH2)AtL%taf6XǛyZDuY[cŘE< eX&:u_ .'򫖫1;pquybw~&Nʠ72pױɸ:XDJ5HJ⊼zV/Q^F$=c-9Jrx$!mvK\"b*3{M`cbs({ 4GSH2 nn󝶤7$78E'Bag9yYp H{f#ΜM4f3 e[ g'A|g8](X80`Q↓hq(&M@Q$tiԪ;;0w3iV[6WD^q7Ga~2,hmԠDUTMS 籲ݧ.@:'$|w 7E^ }X:5"?'].TU[/[#iPMZZw<ITLJ> ReGJTCVkV]~q>S9YTT$-"ظ24Ll¿ Bm:+f"uz:E3"w{C dN=IGnqخ/;n&@H(2ҁJ%.ߊyLے\\G"[PFuM|p$f<=dn׮KA oZ:J+]5*-@,LLqܑc]p j;* rk1! GR&^}jlso'F@6>BC;!ǖcɟxlh6lfO.qHl]?vW2uFeU4KM>h7 *"W;،`EzMvmccxn&q4жm+"lag6]FL/W"ϛ?j7<;;;TlgrJ|-oQ~.K2ey )P6y`H IcI )t֌#3LpSU8'h>]pۀ)s2B4 KtG#*oGLDGG7zw $e)0$Ngfr]Z:Ӧ-lI[|/ÛJhۈkb; +~]hoBdnQdQO7/-{&=zk<: gȆG(;_!Zez;bjl*h"9MO>l$qDMaQ[Xs;W-֭5$s!jCUͤ#8a:\ܥ sj~F#P*-PfGB P,20V*!a4+ab%RJ" \~_Y'qQ=Y*eD9/H#Ng\0*K})]Ä*Mu]ۈfxNz@d!EvȟQ20yffl0U<\*`O6<e6XǸ8ƺd韡w0bWLxٙəkE*X11K}pf#l*xS?-wvy9(TѢ=K@Ũwޙ>g,(O9P;GӚo.7א. 9^`fBg|rq~ eG䗷l+!!U<obp+y{(pr"|vo2q) 52b2VZ>_dC3]T 8eۤ7t RH}HJѓjoΘmܔ*k؛P"Z'/9j˜%< 0X5$40!%Rx憩% FÝ#!‚O!UXO(6BJ2q6omXdͣ ද&y`MfCܤ"X-YѴ DgڳxlCV;3csd]Q[uccBܑX:'1@Q8MoF(\ҕKiek؈/vx&*B>P\-e %""zGG*xIhݔqIldUz0:nYbv&L='|3&Ĕi 9(.((j3!oԒLC:4׏_OѴϽ;ᨊjkwNF%CQ311Wm{c7!Sx(f6kŸVwڍ{}>,0JQ< #*+r|NeM|HIG𬗜Ĩ}`ݧ 3@c\vRZWz≯uHǾ;5T((ՀItG*|jgQC#at,I?|sVo;֎>.I$6kn.-dB?wmɰ~Q+=Ldb "=ʚTXn+2߆Vh& %%ad[l58wӤޱw]bWMx.ds_d];#a‡GJ,$VH?j!`w.DPEေ 94ؒ$aȵ& t,@]K, 22$L@}w$WR 67J}!P ..PnGa"c9O%!NԈ7n-*VƮp{JmZE($ BDʏ,@ANtVʻ-h-۪ p)uX=WU `s t|׋o4Z]:sN@^\^aAxuղW:_=v::ĺG`$5!A.M>[o֓/*8H}h b*m Z ^(,h ғPp&AB`U|Kbvl˩>e,ƞB5(rfrGM؉׸k`Q{$!}aOjG,K YSlym0xM"Л 1g ePPwL!H oR3j3X G1]I  D +Sc? 3[Q3|05y.݉րIMfOE`&䐦pktA3gg9Vζ W>%F o/=mppYHy$E Kn\7"<:5䘆S.Z<=|7jzY r`Q6#t$e )GH4^.q2.שOy]< nx! a7قIs҂Nj,sg mJfj`ZsFBj"q;KcޯvVbMQ߰2Vyyhe\!6RwL:!9 ~XISD4nݮ%V!V sl*+_N6fc`C0,ۛkGK9Pu{t.C=L\{1yUa3!v}͂lY#]Yȯ-^Nv#B(uPܮqF݄N.ĄB+. Av *6M^\fҟC_ sŝDcKIR1`o뮟垎>4 Sb09<ϐbg~vH1w`Ч;#TI^`b62|棳&u)gS~5/֭7~Bu!:w-X,s#apeM&E33j6G|WX$>ԙE&{ie \~$@V]VִɘW^)E!MX]^AP!@DtY˔{Yo};?e1,Y&B9ܒnӸu&4~u u<殙_(ۧ+ˁ ͇˾Vnoε2ՈϽV=ѕc<] /3'XPYY\{N!&NJ5Cy}ga[C\ 8~+>ou2œ|2xgn@^eFyE8lB{Gjâi% ;z:d?ڜ+G_+n33{Yg{gݩ' } :H3H[R,LxG wV-퐙('blg ܖ%W>p2#TT|` ?qz! ; c Cs4]sR謼:7jNv12=m{l(a_|߈*A\Nw$n&c:f3==aXP}H3K ?@Mں-GLBaZnDw >[EtW}zÃXܵ-H\"~~~ѥOl\k940D_Je(RdRupˠ=ӽ^jQtQҶIhxyy}|ή δ6mhdWQ/R0O6m85o*8w}N5 HX$E%=w;( e!ə@:]g,gc?쌦Vex?  |aGHm*hխOIMnoMi~k+A[jQy\T,DMP 4b5+Ի=˳!D>)Dʈ[}6dnj"q߉i{s'F-- .̓-GI˙:wm{#:=+{Ī=.gw_k"~>BN}|}HcIJ 9Ft!&(m'0Z@eP"rt &;yp<|' (W ⭛mAgމ$_-bK&HK!Th 4z8)z!p|>* f5FϩprqxY q[U vX0J*8鼋N亃-[y#_F_Q y\D~ *M$4Am<搞gjByi A}Hj 6=0)?8#1 (eTU8dtbxbM6M$83=+ltͽ|c(Wb~vP5tIt`⼈ ,Hpf(l~ bY1?&c[84=gҤ` eVb[b`+Z3Еf@>bf@S ]{]C)㾝+Eͺ=:P 9ehpYaI8B&|w*mNĜg$U~ uop2C`edt4x?|_4g\SFhK{2 ]EՉH=QR֮-f'Ͻ$DuB46ƉFFT.SIs_Lc* FІ< HR6FYd*59߉Ҩk-j+B{5YN$z?~|l5E᪝,r.rfJR'!_DCh`(Bdm]0ߏHrʅRFCB%ߎ"= hNI1@²FºY S+: <~@Rwow?# *rhi,=^ [a퇞 '#Ul{{XD=4VŔ2;Ԇn \n|%J`}}FU$4i;ur3a,t忥xPINq`y8/;ջӦH\(&qA:q,/ߚp1,qI:.~V~y/,{CG]'@ϕF8V㱞祒&70n3Mˣ__=l~d3-Sw0>C*S}d/Tz-1j*1ɏ*B(;aYC8ѐBa69\\])`-Z9O`U&|y~1),HcB5Kl[Λ;;oO@ ~3f^k_ƛNv{~2+cgos\ yX~gZWzr[1X'Cw JA~`(W$0`N .Mٲ'|z '>`$4&Xd; ˎfK"ˢ{0\>*Gh ?^i7"'cwjPk6~:xe'VY,~ʮc@Wc61ZQ)*M}vu9˷\'«PpDi˷[/>~S]l*9\!j8aH!K]=|]_$dpHH:d)YHx8f8PN`(kţ5iϊ™3TwIF/x_jbnxoXs2ZO7ocG>] G>?>0}ֿz*1.%P|6zK2*ayhBO@1UJ/ޤQbYWjt<т]3m"8iby&.>v7ZsB&GQV$$r?S1!LLNfp qwt1nc= C_40?4A1U2 i(^gۺr"Y3gAyD^U6xߵR`I[Ty M~ iݏ!qe%x50,)?Ģ(&rQ%Bӯ}ke*;D3hj&V˓ԈᐇIt9.8ruo[`Eujh{F9.% lq7Ȝ!rrrr/%<(+K%UwʴˮK*0+R'uZZn3ӱ:mM&t俛XQɸQ\Ӗ^lHmfrf<2r)L>>15caXoI|v:ڪa6?4 䕚R+Drwv-J@LTX>;UwhdTӇu)nkl+G'wGhۺŊ=,B\)L(y@8eh"@IDW#,bѡ%%#9EB?5ꇇPK6ʰ9l1HD7a;vww@2R:P4&_ 3^\/r񠄐Iq%" widU x{'@N7١Z\"&X.'bx(:z9s,lKZ?6ovwtgxks֛fz`M48NgVο Rx%+u"8g?.0cR]^+,RI\1]Q7S.7_/9N&-Zs5[Vˮ(~+>憝EE)z#)ҪӘ`7ƿ혳AOdtkv}Q SWulf`w]Ǣ2ynݤ8pL$q 1ܔcA^ t/5ICPZܝ<ނW gypA6 ck 9\Bi;Vrh.^:o u`}?ԖG~P{$<ff8!M'ؤR3 ђk\m7&kh!< 6Ǣ6>XNrl :dsٽUKJ2thje`j,Yj—9ke*@ƕ3&f+ Psl"8f7D#vN%,ύ?id劅wlM&TTU͍k}#tH݁¼^v}!<@X͞Ebݬ=g~ƗE2W=H[^Y;{ Z/$̕8խ:05G_.I==#vߑ漾BNmOLi㜀dWV}&׻$>[s[Q2Ę`cgě;v6E)XTMڋA Y=]R:u DMocFVd1uꭡM® f[L@]ڣ *%1[qY&8Ӈx`E[GDЌٲE͐y ϳ0F7w7ؠhy$ֳ!l0(ژ:{kSl01TDEiq_ Kr?*nRm܈yڐzjW98c^+pr,x W+UYi2S{G&.^3ϩ"\Pۯ:>c'Pse.bTm M,EMA O-BLd=:."YY}As=Y =Uӷp%-$׻zwukbEQjüljay`.>y(Dô]e#nDaYO_6wU@X {bf˵hոl;NrF%rv޾sstKuEWA>7dE41? =?IL 9m{EU’q),@x)D*xlw2+&5Yq!8$tW,] s(rpmVGkә5۰9#fdGS]BDM?D'5amU1P&t3TTO38{#V5 " @Ω45Ϸ %eL4!P(S>f09 wH]u#9Y^soˇz Li)l6^$$7K}̘Gu(A2L&ehrk@:*߅rzAԺ?iJͩiN> ΡV"pa-߮Au6֥y-.$}& *Yw5Lg_09}㍙}> 8 _:6V(\CbPl˥O }NHiڧ u \ΝM vYZi 1A;Qq64ʼ7cN̂D|Wq2g@&q)/Z6ݙɷq[Ǎ#DJQ 5^v3{93nGeVPe٩D۲-%ۙ6lQT -0(6h )W4tPUju$@7F9DSh49Tr"8XDȬ0 yj)6 }!=oNƾB%8T7w(06cٶO7R3~4:꬟ ~Ĕ K˦/*?D, ?JL8YيÑ̥.d|G,kY>!_zhm34@quo§cҺc%Kgfp.)NH$HJ+tYu`QPǮ]q]ڼ,9|)7,o`-ekGxX>{ڃO*6|KVjEPB U[-iƏVM6dȅ%]][w nSY"W@LK~]9(#R'd| դb8Nl!$g=f"|mR `74]iAu)70=_ER.؝ݵ== vi-;m;kiU5?-oG|殿BHPfM[ђ1m,{/KZu: TP$fk%h$ZIumD5cI *+m7j 1ȆsԩgZ- 2Wm'|cWn>^Xt+ƀsa[2n!+vwtQPȰiAWW ;63yfi~-WJCtx<xi/({(;uQ[+b lL8&1Zrmq%ɝv@[&maQW*@篫 9{x$^WaN`߻ʤ /^X[u5&:8|(px5팚ƽ|)^ؼi.lql#2M.6by'ſ_AӦњbFh*aKKjDED㮁SUk`89.3t=ST"+L' ? a5]۾&:~sG髪dK1_X-T=)Gu |΁nJ*gfaAeMTFVnZ͕K4rx|G7~lnn=|uT2p#a!F 8O,z4 W-s9-U,jNn~L $k s"|(! /M$j@4#rR͖gg.J/[o:hDž$^@C1czUGo-S \Ʀ0yU٥23Cm_}P VMa&(Kh-wU N0Ӯ幌@~GutvHF,Fg|%/[`yhdz+R7|܇L Gfk !Z3 qRK1fUu4dķrl\Dз5xT#{-ҙq9ZJ fk*EvW kv<>}I.\\\f 3Y U.js"S vA8\l- Üg]mTRVu}X2 9Fۢ5Ǯ&xőDUjrbr;d$P9R 0 !i*.EeH]qH$vu"72ᮡ,jSkh6S#0NabV,+.88w;%%}SAlUDi%IߑAOn&Y\u!;F2y1S^)ר*CUvˠpБ#:{ uaȨs˂3*Z_N_3 +#nw]s.0'SPHg׆O59SugPe۪@6Ꞃ%,0ve?sqo]CSx T+_w+jۙa>p!pZ2ğd)n9PE %K; ?[>pvvB9άYzi{fRl).0 e@"kY72KDƥq_m_X]>{W/; n,YBPą4nA.b̖];QI%Eͷ(^)Hƭ߻O JL }f/zny/偎Ƙa3J7O.\]B'_PMl.6;Ngr|IR‹XR|"` }El \I:tTbL月iOйHk}`w BѳA]2.?1QBڪJM訤V@ɮG}`d3l \Sj+|_7*X5Po1?C}#s.sj1XLK%)zl5f7YT.g\G *e S;0LXǴrڿC|XE|,:=Ssn"Q]7@ Ttjl oY>:?J̨u9u}5]eѥ!de:z:/6Q-tVr$+ -^"?V )$C~)q8oph=|o3诎OW /ǀ9Hԙ̩yNA.C7avu#fYNO.k&e*ɠN?ՒCa{T GϚ3mfJgWثeY{u[]HX/ZDw&D~U|l#D{neS%ZҮ~zjydT:M4WA4~m8[qxwzpazTPp;S2 Jp[7 HbׯkESM^+0&Iim/6nIOfR: W72!hY *K9I)Tcyҳn@#X9߾|jKm,{ږpp";iFKCZ-`͓?Z9,|rh*#{Ӎʫ4!^"v138>lp[sUxGrgA&vìCZ2{bpMHj4k\fCQQ5zZN~l;zjBQQ+e9ʫPJB( vZQqUf0QS|%x`r-'qZ~8iϔkM;Բ8D) ߪWc{{;q}ƍ> 'gEAM-p=f77h#!y )&::zUv55t'bsmkE 'OyDF&uT ,o;tVJ/a5N;'fݦǿMs'g{m"1BK@+U%JGP{",8Qq!\Y/{gkAkׇ&^Y^Dc3Me"uYa*a'VV=`<šGwR?+hJs&ɛtcrX5v,<me;j-ށCS-=2߈֟ի?k 9UBP)1M 7Ѥb?*65YBB/hEy1& 5JFAwE=KE< eeP<:&w;okV8O3ft4JӶ۷.:r`CPMD;¾wͲ{=|Ls ! eU ŮcL߶;/3^\kxfPG8ソ>߽ϟb<˩`qY&j/B))8N *U3OGCXoI{ j;w +d#3bPy_U2-dpDw9lt2_qxdQLw&R2Fߑedv0LKn rNF9*P&Q3|Co7su (d(i00vݾO-&L xҧ(^MTh TN&TӘ>ýnaжR%sl4cMByЋM -F= 9hwj`ѕX' lB]1L$32T`^ԧzNn BMDܝDZ91Lct5Z8ny՗pP3RSg|N60:JIv?va @eFca,vx_\^,h1g҆ ׿|[.f] 61pG{7,Ocj;ԻL)y ;T6kuuol1M> `X4(\K|2"I!CP(Dw0እV8-Dl>7'I נ炮_@ ~:)$ }dyK]$l1ܦz<;r(ڙ;X\X1yC᪇5aX%S"0c8NwIQnwR&"Z sWNN0Q/ώURJ;يή~1F`)X>FU6ppN!ȪDݶmVqTsT8Kq-3Oqh_me`XM߫>3}a~yhyIv<;d7ȧʰ'?9aK4cqO޻SΪDYVG}1oׯ_`e2 K[6I;:9= U.׻x;;;ix0iG'*6f%ALl% KvhVNHՌ+lx y [:b:)v9 6ky+-PNȌxTK-5a֜0K8#:lOzK9C9M,dתʉ2B+»ϝM5yGFe]&9vvNLrXi j#fKL(*E4*AhO~\y61l&ٿ*U3u}pWP@}1KE'kt#Out56՞ |̃lz5C6.:BW"ԓh®. >D%E{'[τo "yu9H5x2vѣt 1}QC1ˎq5 xM'?|,[ZXSչ(L/ET-@h hgO(M=e8} !6~Ւ;&OHHGábFFAtI`JFi|<U6=aE.(oPPUƾ'ڪxi9C9dFhzw֎J& .|̾Ϩ Y+*??}YJh~rhfzgy&H %G~A%chڌ- /2?7坶JW]^vɢ\[[n-OSqA M*?fo39$RĩRǃ g/5]~EzÓ3 qcLiɬ7a]NfNePMɂ ~x[?}NQ:\ GMG̡EߣQ_3MSiփ1S]6` ,8nϖ p,Of8LG`dhzF>egV]zKjٯ`)o.Hw!k|8k˟~L/y؃u: R]&gR9hzQ܄ 7_C+Ҋ~ҧKV`3}%!tѠы`>ͪC;O>{)~%CzߴDz+Ibm̮CEh!VѦqNdž2Obb+@!VZNwϐ!͍;컲~(ipՙ,ϳLʲÖyd{YtPv UG8V~\  `u-]𦆅j j?[oBѢ!Py%36?'˱R 1ky3)h{w~J]FWllYli޾Jm} g<;/0{?56-H oh0x|kBUXpSɌom=ϫ"DC"@"GC |xSY ClI08Xߒ˕ k]!:yj}nI:=&Ug"Y1ɔ; Z8iV7xy-++moֆ^BK$i!T%ε6@.Iw`8qG͢LJ*o=U&{ \2ͤL 3iUؠ$;Wbf3_Z 8 1K_7oz=}RFHmm |~8܉ŤdHK,fbXtB<y&l21l-*rgjlɃ:U-sP9B5u pp_5[,WJL(W汣a@&ݹ!0(IҦVhQnG ݍԲCIgC#o`|')ocLCK!YB׮řӓk4a9OuqssjQe4m5&тsɪ4)^6I[׸ƃG#HLs`ݽ iŦյj8`J L:,%\BbvP=ؐ!ͮ{ q3q3B7Sl&@λ 9>Y[%'k)颈],RLЬ@"<cEmu `f% h\ҿ+1{Vj{m$8zG ))xu^9D֠ effv\ ?|',I ̩i@TS]Se.ȝz2fG̘? |C0O0ptYXsf)x#rL` ^/(o։@Y!%O])a]NEkmaOO {Mi!?R '.uG̥x5e%t2&UDF2 |}7Y Nwڠ3p}ܪg|yi?ғYs15TR~yikKoy!V`aqI !:B1d^W\l9oMo3L[]?C?-rلWؤ|Ơi7UVvt ;ص94q|w  Elu\p*|ZE q ? /~F*T񦗈Lx-OCXLǪkȝ`%!g-1ndR&E TNԧF#g16ׅƑr 5ȥsI%[uYo'gO덤3hKpPdDZ$A }a٘BxaMNCV9fq bJbS0lٻj+`͵ErWҺ<]-)gyAEfɸ^PR)@r+~p)Z=To9Ud>\s3 !8yvPJ́̊u{n86y˚dXCZ]2vRnsCҍU fsUCc12R8;88w3>L~qpckL{t ],81kEr%GE9{M^q-TԦBqƉRGSou*8NQDrƜILel˵]L'M j%/4RMN)[1ϔ/ %ODcdAOuڶm۶m۶m۶m۶Ӿ}~|7މ{cfb&bvduVWeeKϳ](^>Ӗg,}1QMK^ lSs|`}KKbcy#ղ|/pXy|[ YzØxYlˉ&|FqWm s>9)sHgL4<}0ODHxޣHR ܐ6Y<ǠhՒ"I~ì%njɰ![ttH̿]L -Y8K"'Y)%W_NXd`R`SMi9J4j@vZIj҉-)=4:xMB|Va!W ?Zۻ )xHjc3:[I'}v>rʔebKhɊ$"|) H|HB`ATJ˭V IUי MOA*#r =y"> P\;3ZFj.\GTUɎ cÃ~۳j{ tÿopPGf>5B4RF&?_(\|¶`O\ e}2"9X&I{xz='*(~ 2q cTv1/vg-S G3pEhPj{܌\cxďPߛc>C I6xL-m()6:{- xu֐J&yCziXjtl _osv255-&9axS{g\VHx;8?m"V9 EqSf2}`faj ~[$a]AGCJh n8hjg﫣dM?J]Rsv]YYA NRPlQLӥG7'е8T;[AnˆܨCuv z'72d$ZNo,g Z;QC a酬_k/ B>ʃ&Д22-&2s1)=WШ#miQh9E~+ /5'CVy,c Kuq#Mspʧ3hc0,nk7gؖV0X)AрO/d/lr_}jc`Psf'+YWVǜ啭%Pw$6j_`WR+B㠲 ,4+E gn(" Yo.5f>y!2pM48#@-y^ڻ|o]7|gi>(w@4[bXKJKdFbKbmАS80*^9YңԜ\0Y/,wwC5Q3j°ŰԂ>k|Ĥh=8Sum\m7~ raMt &C!K*ln2,ki}#J<$5 셼X-f!`JhRq)]Q{jTYE{-`.8vg*STGsČ[5O־_a~D u ڒ< qL7s#u:]c2m105G̐v~ ڡ5|L#%B Mge~Kj Z_/dt)]ssvfӵ~>GAғ3qdd̒>"E()%兀 &:A]COEXel6zemf+A'a2,@HN$:̟C9A-1cO'̷3 xt‹˜VZi9Vj+BݰlķfRJͨp&%QՂ6d T0&y>iUrDZ2$w8VE+ɈOK%^ܞL3>wii3 drJHP!HA! _3K1NGu- U0\R@D%]ܨH@a~0=_ïPdVЋS޴J&dz~~>i-/r1VT1B{Irtt2]:UL oH1BUG<[Z"x dWA^RIZfg 閄X}ˆ66f&HW_=Yg ͥ;}0jrb2ɨ׉ [[wܵ׾EsupPέl _ȕs-{oF:HmP t6\iFc Lm/iyt=sUu$o[Ee!QՒ=*@p2rT)C%!O` D>]cR2`PmO^ y#$32s)Fe㾭L a޴٭Cc5G_Ҵ/&JV 碢ZBp*Bip!!?ݽKî\$G}y ,aԨa ?BHbӿ\Q"s'd% tk_ZLwfN4WEh~&19_Ҏ32s833J$hb 9qDL6:8?Ⱦț{!--|A14 ZUUH2.3U&)0eȐ+ًBm9CM}hn}fNzZ+Д/P! '[/ =Uk`(x3o8$XEcQrlW bnPw^`xI"~$~q|jE> =ϯG4&_Mu++E²dsBra.ml ԧȚ+~7`f3N S0 B.?7 ^3F~oSym]"A.yw#CRGj:戟Q0dGdA(394C? (Uxc0?EB8Y.I9ˊo!\3 ,mi"$4_uzwy0R%_[b?C_z Yᱺw&&1Տp˕"h}+E6.RP?ۇ$5^1Edy- ](L6 Oh7 ,zqAM_(6n QǴ1 qw?Hά+w`-6<2 _9K2hk{!eAqR+ vrZp+@jl >!m~ԫ)z`IUEYzZxva(*3&v{ п_Nq݂aXp%+&(Qytb܍Q$ ˆYVVVyw-/]ufλu}[n7^lV>VЍ =j=MA[[NpAVM乾=@de)O0)/s$ ګ",[/Y7$%mt󈇺YGfXN3]QK'3OdZ;:D'lr) O; <8'ԍ_lkJT:"&{ FSΘ< IeÛ46KAC '!#&{Z73C ռ D+lmw z|07Rcx0&O(JpRLFBUXA[fy}&p&/$Ƿ@4WADҥM&N=Q/Ȩvt5( T@28?<`K?˃GJeW)tIz›|ey-b~w~^LeB;;:QI̞Xvb9\~%c=R1" jv1{ R?<px2x(d0֖wΫZ&} (zJ&H pX)G+QJqE(통̽G$Sط@v 38ΗQ&&̈́C~pG gHNJmVH`Lj3W袝 6^m˫8.572YLF/?`jl?{k XjAtlP PIwTpfohzޱ||\;\,m]6g *vIJ{}%ʳvdY!` #06`hd5E@]YF S 5XsXo} $+ozg&:\ٯ]oi+SZ}l[b :-gʫeњkύY<%TL 0A!S5uJ:%^;wM z8:{ %p! bc0 iARYQ1sȰS.چ(Aa*e2t&.tj5T؎΅~}k^-6fc>bkfBsW¸{ҞMvaoRl@-KKhJ9_7E- gPBr‹MfIjq=r\ھnYv5MpVҶ 0d;yT"zK՗ ABv9% ;ڎI9QE(&$ 4X& gWssf||b:9~l5AeցEyVyk铞QidYdħo=#8s|Ԇb|mh eP̚ d/{_M2Kw; B+9cAtS{UnA|1zX3 \WȌXcǓJUL-H4) Zf477}K P]kX輺lj.9x YAA)x  h- `RBK%6v`w>| N EՓ6bЂ0Wp*8J? S?LF,{d^ C2kwﯾKpm,D6C4obhh➕/K(OK6Ji!N{8YV%t.!:31 rsnVb /WZ1mܴjmbb`hvn$NmkQGbn&?#WbADArPh= n=1 ={_:U1ܱ#j% .6 i1vm Bl"h$Kfmwψ'O\#Čߵp[|=yPų^#km_Zw)DJK$a5qL_ k,-..Q{\\[S6;'1^p/bIYnBx 0[KR.)9&caȕuCK6&XB2]iөˀ!sxăCNEThBg>@vt$O,`]NBƄ_LΖr\9Kɬ^Ù LybfbO|d|&S( & ټÐ14]me7mnzzjǹF7,Y25A('~,2pyZNLم_ࣅF۵GCHp uvUBx y쯇 FXT|V @7=fp  )w bO]G_.E~"mKkww)yïY(.jz(\,Kagm^aJLLF¬dhli{mgEҋ4tZt&SAVĘ*%GincOKS۵m}ik~xGWԷZՏhَYym\;]CFCr_5?~X##'q:JӣaI!4[i{ ЬN*U\ޓX@`Db,)[+^(Im&N4I'@VBnh V쒴uqCc3<;!!F4h\ CgѧpX2vê'owt9r[B.>?6@u9v_Ģ][Mp|U""ua@B-ۻ?}&3o{c?gaʄ/T=4 ]HP آHdzcDϣKpa(Mۼ y@ fe)cWǁ@i=&Ba^>۷2\/1Ψ$Y>`:rHdH}Zga4;E5"K ++ uJ=mbXlp=ݐq'Mޫćp r]yfg$`d{nQfSv[PO4li,,K_^Q @3ӯ,(l1fC)vU{ g;3!19*l' +UQ֯TKB$IP@۔R)Iz-=I6vp蚕7t~cg+j&gUཿNN2+ (&V_|fE"Jt(9{z>a"xs-}v//MedW7ՠv`4,g]n"Lk'O +'X`ꄸk<z`׍D6`tDx 0j?rck2M(H bgO/H3ыSX^V#ÆBrտHxƬIbwUU뮃pBMԒFV suYQl1Xs F->ѪӞX-n8H+D&_u%u4H @V~ |-^K.*{/*ύYX##3c6BWw(zK$wmݑ>ύɢ.F'KZNT]›2o4K}d }̽th%9%l|êGx0X/4hõl"!%<$#9U1[AP?AMOK9;قe[ ŔXH^SbCbP]u<1pcmh҄3 dEfkQhmRL#nlt- EK #}?u*W̫YS'ytp#HB34T"0%n+S. }fOFL׻:Z~}W^B.󕠞s\5,a <([[z% rBYWGq02cH2fƛ8^'fIR$EtecM続4 hU  U({eAUI&}A~jA%ɟI!5NjN}4RvZj_-GckvVGI =ZKTasaRK.fNV'8vQ_yB|F"ٌ ILR9fhe{ʼ"|GVnOKgo{֎Jr5ܝ7:5_]P$%$1K~bvH Kɩ3'Uf&}Ok d;#yGKM{&#ӸUԖZ?Ɲy38BSk=(̪W VYzϨ# PA.-mZL9\$}wZM;_SkQHulsަo{VZk rݢLYb%p* 84k'F~f悂\04օM5 f/U0VA0 LPF4UcL2 Z(R2WMA~x5oV6!+OO;vO̚am-m]<[~~rUWsK⦋'hᐆ}ѷh, s<HVFY^;jt1AMsⷒOch(&7Hp, 6hKCA#NvAnKQsdKb\?CbM<N:LQCrdf(JRnBۉe~F1]*%+OOnx + yJ1jIcIUJq&NF\ٮjGN#CO$[qɃlKtɞߊ tȳ"FfcZ;qv1pB :C(u,ǻbx3ۯuvو#"bd|ED']8%&%lhۭ?1lRBHNN~ )_M_}ˏL<HA|bHb 1MLJP3sW&4I%{rlmaYXeLBjݬ&#[`8#18oEa!LD{1j!*Bngͤٲ%$IԬvhħvE"*-'9ʄᏱ F¢yW ~x`:">GeD¢3.04_=4HX ŹڽFOZ.짝4W~1ɯRN4=oI2r-P|q5+LMHw^1e`>',(xfo6cmlq ɐ2}pOtaJa~^c4|#TJOBFFx4HJl3;n& .kCg\sr+c^p }FdtGm0KȘrM[.$cˁ+'Ĉ?c^,dk0Z.BvusMA2R={B(:ϛv`n]:L:"|ӳʀڏ՞ӑ]qw'c#2_tŒ gO*D d2x̿8ٌgp=$j^Vo$!KAFzNhlt'ZBBoFth72\NϱÆy,}TT޽r+dD(+8!_y GaeG'@1LLF#: 1X/Ѧ'ЩzOä.KEF9}y$Z34ܿ0L=@OOֻjȿi$9ԫ/Ҋ@ֲjPCԲ TF灺(-_#" ;}H1zfEK Ku~!z O%0QώlCWJ ^""F 'oOK0sucwk7}FsȢLb2iv󚄮snͅ_`RYDO{bعcD`xQs,~֛Y+3PP c ~4YRtZ9S@3BFQmnA^ƨP֑c*>U7;s0ipmOeX_ͰnFkC9]?8:3Q_j}njҗR 篝hڐ~г\^ kt!G,wL~}$T'cnA3TmYLH5:PM^~\$!(?+3+kGڨP!\lB߆[+#C"ڮp*u- $ko6YEH0s \fܶ_=xkL&K )*ILZe;q Dٵ ƽgֶƿyۥRRʅ/pjz}d Dj)?j v 8)8§Ah~ZH`rNj,9˝t}GucYy8b A~7.H)a3EAQoThn'uFJȀj_P "7 bڠ#>/ ~1s!ELj)O D e[%+"5FsT%\vfUdg-]Εg#r,\13 *+f6t0j0d{֋V38i_<)-Cm;`VTӯ'P;߬-6?qPVG:=X,b@YR<-]EE?+_TZycVמXdC4%*PHrq,``VMY¡}({c_Y uiƺijNV?( TOeәO!/PO|4Lĉ\0pE2j,j <$љM2RUJ>^]K3|/{~xtj5 P Fj|7/t49_=rU>5Eqd\F\'y^_u?-2D~YbW5Y.F qO88fs2ڟГ2`;KQ)kjټ WVL]nVTHMC U .L:uͶ-,sFJxplk2gS,;{C p%ZP'uC=}㉓_.3:ufa5jaxB,9FC\^Rw"C8Z,_KlIT VFĄBH' #^K8{FZVv)US#.$78d`yqQJ t׆+lR[Sc-O,dٌȊ˭xA;j$;s 6qnFblK yT< Xѳ2 ])6>? of GɁ޺Wv$yN~N!ۑEYPLͫf*C ^7fSOR"Qk<%.vfH 0ǘ b :b%]SMEW,eP$-hvYe8@ë ,U@;ƼN׾YO Ƃ!/$=f>gO<oI}#^;n+ rT^5 O~R6䀤$hòfph'lAҋ4*16P8˶%ڶ#c ɂq/lKOL`yZ\⥋-פ{u?wln~8-]ʏPHf8CGC\qi _1 q/ zN:yyB'4sFb*AY^cHd| T̤J ٫Z},Y>a{cp/3h3$׼|P-'k7^/ ?܃9`.Uf:fyʿa FRz'`9CIn-,,|$ `ybYJǝI-jZa{qr22#&I>@#s;f&hpYԶ>Èi}s ,^pm?Fg8s}+`fHH6f[CW]G9 K0.Ceӈ Τƛ;K+τc$ N2,ƅ啖" 3 K+Ɛ Pʮw?c7+j& Z3ɖ.CMą:C3ĂIGę;z.c0cb _ +#8>?Y]R;5 ^ 8g䐂=p紥KhӤ#HE'2εF1Ȣe4ŅwPVh׏%+Ew>X7f2OMA/$L0/+5$t>K𓇵#^+)0)M=`&lBr_ݒbi6i,jKo-hݩ+L8s}"ֿgt}9;je&T<j-ry1.p13?B>C4|2RbpZ-MIF!v0z(NVGC ~b5];N=צTǪռU]^ᑐ_'鬄c*яJfk;3S +OЧ2r'tüMiw8Ud(1ʙ*i.zO3lBjyH3E5ʨ]/>@V(;(Gĵ=HXP-B$a?_)"ƤN%4hDa'IyIVt lpV KoUgzi%#vRQq@o=^^W( &3rxhPU1ޯqP֥j?8u@Z]~?'󈐇 =`^2gSJ$uth|<|[PPj@3YsLo@f>oyo-q@_W1,Z*<;5h 5懚+1Ff*[2k)!z9Gu9M(x;ƴ^K!2O5oDnX\J< ϳvzmee$?B_5}Eדʩ[_:^rM Ԣr&B%"/ȃ3N^nA֟VCW;Dа@lpiiR(7:Dsdw4Ĩ6[LȗNG]$6nB]LH&Hq+V"Q֐Mg}7 [:Gfe*@bGVd'KL7;TIƠ8u0a+vl+mf(ʗdC5aźLv{%@x>6 KHoX I23쑸8NذA3_LW<-gyn^V8^-KoK\㈘l7 <^?wv$X7ĝ|j۶(U\&hV eH aS=޶Uk^Jě4pq0s!ZИ ]*r2wԕ-s26q ֎p *юy|`K!zgj rp}s~o΍sDcim9 K(#% 6C{U À51+S`ET1!XG)_v.cp+Z"9y2XC+iiCx4:ḏ53D * .qQGŌ5(Ѐn؅7ƀrDl-kueLⶰIQ@8RB tp|DYyĸb3ƱHD<=H4mE QpX3:-\%xy>ܑc@~[\͙D3wD5FM+iīZqK׸5Bh gm:~Vzyu @k[ٌjIj{e!7#&?2̤N5 BM'Nگ.;Ot j˛K2%XR<\s:29n-@LSQ|Xf$ቶ+,x kXs7]Y/[9!mեέ->_Ac’m4 <*3 \ɼs;~t?4Iw\[-e 6HefTyLy&[mt;c ejMY^P]w`5 A}8 OO ͱĭy$[6[n$`/xY\vBf[{J5Mn4{_D]zkuu\ҧG;`S9a'hP HWk$Ve ӞMrZ# &Nq8vʴ eSUou-@aEpU1B͢)DfQ_s1e#RjԎ˵)6P=/@٥2G20qu}.znj 63 oָ9+PuhU䍳ό8(e[,cPC 6g"JT&|rmjA?) *7k<aLڏkNwF~G\F|Nh' A\ hVv\AB;#Nt^T%R 0zFgٰA|7ە/  {φLe:-Jd*۠JNq.WU~rl w@7 `HjVA7hUGD|$\w1}׳I +nhC3?X|n<:0['65kP2=FRpgwCXJ\h&Y?a #OM13LթډZzى8Ղ9Ty6gyi,ei)^ m ι2괷K^Q}9$ d'o:@ד]˺NiGJYpБ/QUMN* cIA7qv[( ;ݥ.e.;Ё~6#;[;y.h7͘$IHwXwS4}<B{[EH*8M||U]qbMcOgG# GJ|[ 51l1pHpY\g_sʂ/mi*v$;{ꎛlawuP~;V W?j_-@(ӝm30z-[)}:rﷃ%Yq.{~OYbޕ:ߝ!ydq=3~. &$-XͯRӳwtQp430w6| ڟoOD221212031OQ@dE!!~B ~(` ?u~v@b`?0p[Q5H_[?/b: :*; .\e?!;NHWGt?[?s3J4qi7wijW[I"ڈ'Zm[m AȒ(1+#*MDy A+x^ 7>/2&jDG{2U6I Oz%`0ٌkbw85"?)9q?Y,Pp5AQ w:_lrN}Lbٟpq ^sq`"ؤ/<٥/$IE=eV= @+<3Q:t\ t`s|PFG`?쐓b=+NX@K q SvL譿G6Lx@Cc2c_릉cg5lq큖Sp>)8J# ɇ]?;gs"nzHI -SSEE!I--PֶMwDR שO} rPR"JAyY{c@߱ }OG$]o-lvs6y>91{|#I "'<6r75ILݏDrþ\ҒHB; d ,0nc ieڕzo!##1"H-MOS[e0/d6V_n8A|;A ف1ωiF?\`o?=h7R\SD` lsBHhMp";!*sjV ؏ 1őy_N2Ztt؎A V7'qʋMk%AfBPe77F/Ѭ M5MNf(#D-Ҡ+B2Q1$#P'KڄP%@◵4 =q l$(u%MwYn;HK|?闂l *o:+dDD%ƯqaP) ZבXOM{i,$H-2*FA"DL+˔,ho!zܺ<8DS7#( aڷD?$fxSSQ"aY2`@oB$e*F"DNSvSf 0i:q [ۅ{u~M'L~`a|tm_zP "x*g_m> E{Ǚd]FunN~ (/.oJlW"I<3%jXRӋS|% 5[B{5A^9) 74$pu/LJdztks\"; ` zL .m으ɟݭs%HaanK6(9&oL0%O,'. PYݼRע8X'RG0*,Ӳ:@; +XfhFlXZp`Pt^ l1 C`"aA::3PXw 54TZL7P)q@TP"cnfT/ pR@nFLC'-=[%GDY%Z¥ϵfST /:,lN͖{V+ "S|>!f;r<^$e($̚#@yrLl`li:$ =PJhZ׻aX BE.>rphĉhQyֽuσ3H0ͥf TOpktϼ gbSc 1ͦU|rp|9ɁR-%Wl˼&`׳_6=qo?dб߯[^dr ^ζ?hjMOӵδ?]TYwn4[%ͮgUg{pV^e'n0x!,:Q ˎDTUIg~WkjZ>ϖcpHHҋDpscтxrC?"oqZDz>=]dBî6F4.ܝ.!%G87 r60Ǔ iYrfP LPˍtd>>X"###bp}X{5d?WWb&?9"]qLQusqGj݁V7CѠNx{"ʟ%d'%"SkSV׆0ARU,a3 }-lrY@8Z.//KTL͸$mzעrT8ɅjJp9VV6!ssuO!#?ÆH?h{dIS ]C=TI e @@"`mW4 6"0rȚ~ ̃JIi;z`} Lf8̞WN1 gr] ҏ[k̲%vF&D!A_j><ՙm_q#{\xAd!Kvmkˎ0B3AۑɪO8wYGkQTW5C/.36 l88 kK _f\w_)̭UZZڵYY" ʻhliʁDk0x )e90 [ژp){Hwl E_ÈHNX[Ey4uXɖovRv67[U`ٷw>X櫝w\Ѣ[MXԤK%҉\w:s^<$װƞLRib^`ȔDe.Y74ȎZ-j*=ԫ5J?Px ])N=+`do`C?3 cdgo?FzZ:&f:7Ey~f*?$#[{e+vHM 0"{^be ENM2JqFIXl I3xn7VkWxH26WJ0qN~}Qq~aUE_'/vjTLJB(j]@vנU?h߷LPvPTyqC2y[:z6 iՙ_ՀFk-}pU!l<6$ L8BQ-a^'+prӨU:1mݐT8qVbv9&B\y4p9$vhQC,Dt|=Tr)zW$GZ:^}|}z`\rYfnsJf2cd.5}9]p`5|Y`|ēEE<1t=,Q& ygs}19A[%C{ڟnrF,fZhFLe${ZZgCYZQ eŧs~ץVUCai`%DDГi/PQdjk_Cl;E#![OsOQFr͖Et{Ja@ 󪻗~Q?2qfvj?ϝ]ДeMZ|:IO^S~B3eJ[A1Gr5[fdWJ]uĐzbȜMFAK8Gͫ9A) [xK@5[N>ީ 'ζF]/2X5 H['g_ SL8*%{g&UU3aB0pP'BL(By'B` зdo]Gg /l j%}H։B`8nrFq)ruYqFc'VNs=/y[ )sw㌱sz*P8AMS۸~Li */WkeOi}4ҕv'gTodKe/c%aDֆH'.IzVUU+E+ORt./PУ沬"9t-T'5I>?{Na2ܰ&fLvsBZ;+4?`p٦>U:)=p㲊:~R. +F~S4>Zúh ]ѮryMNbM>Y©E- /Cb0$u%\$õף(¡(@N!3S:17sOB{f)J(Vː+!MN|&YaF/|3iSfH0X1,zGުW7E.1$nBT徬,_*poY\P@UXTŒ|sNGܳ3$USr%3I4#xQ[X|(1ϡ_eb窂DHI+@zZe]s_fεgYUq)2">ހ"fk8 &=GCZ.N@&wgf B,SLŭ +^gGb%Z)`w=%,DAѢ2#1^W&A1'H Fqf)E"s-O+,G({& iju1Zw)\ VM_=%~ cPL@| (SRSшflYpB [M)oӀj71i|$23@d&bÔh(K^y)( T}8A4 Iޅ5imqH6Aa+zp.X`/IM3AHS4`WGhwSk.v(F3DP'Ѭù>fR:…Ȇ,pT r"&=x'w/nKF/4g16Dcӡ7N̐@vi(-~H  4`BLLN K :tN`uc +%bx#hg _γ/-=PDX2 Nӣ0aLjn5cPeFlJ10ΥULdz0}_Y"PB&M* rz'l*Uخѻdq 1@k\#~2j؀͢G|_JBw{)*ة!JLEtEgWNdMNN-&az;Z -#A!^)E?y`)O{h&8YqRLn"5˿'?t |*Ixh@-Qr ޤ2F:-KI0C[p󇼜2&Nuos:~C!(v-"[<}b[ ܏rO!“0<}qfv8֖|0T~@4c%?{<| w&gseϾR?/рF8Fa/ӡb!`"f\*`E0f>7.3۔TɈA  826nvCpip%Z|)T9gcјcS٣AY}B䄇U4>2y{uS`B"h $: ֤^.`J\7'Wi S&b=crԆ?`]p~7ī U/>s]VpU0cɤgɤQ)ϔS%V$ [8ri%vyxvI5Ĭħ!~#A+{a Lꍯŝ/OP\>0=@?P9D_6!FeK3(W)9DhzR(rt JMC8$ †gm~Mm7zQWQ.[(B~wS 42.1V `->Ł#g޷w#8`g`t 7Մ PJ=nϐ*%he3؄hk^}k֒C4v:`gZ[&䳉]2_Clb2V!b/O62OqnV _H" 5u1ƖHT{n=eG1Oʀ#yLVf]čoeM/ʋEB %'ұViҰIبj%>AaIyc`@bi>7Aρi}Z8)7 мtj_TqՕ>WPErf?/2|~ˑ!bH^zť2^I_\(m>DmmP.Xg^JT%)Pv)wJ^!g-8+uK$Fj"2r]ijKݡYW9:lN", 8E `Dzbz*Q]c""H1(RgsurtPA?Vj eаؑ pHra ֐~90Ϙ+xUltN1MdgԶDYH$k@%v-%\꣢ "`xy9Sv'zQR#M88[y^wMfwM:OפCkAc,2uF߇>xw'dQrOmeEP>.mkZN!\[YNn 7,p[]<(7qFbDem .~mƉq 8dӷ3'T&g_* Q<;VpJ@U#}Pbǐ|`zc_"xVp%&;?״.џvrFu/KUfN{UXYh'ˠNhF8CM=4AQmȝ4nO *!E"%M:UPԮp0B&Ѕ~(b H\П|# tTfjZ*J! FoDv0ߞ(v@{vೣvn59a{"Ne_Q\#wnbt`&2sC$}Fg-` j't[臥R15=EP)8aT7zwzo3PAѤ]l:Pw̚cdaJ@DIXsk%(7p޴1wk^]X턪W|Rܑw5bruχ{unNcC$Y3CU?ZއuLQ߮iw( HsWcT4XMu*:rEF٧ [;Zf 3FoFDQ 63UO\%$6DpQCt}+W_Y.VsZk\dy(<Q< `K?W缥/'%)Z]ƼCKb-s,&APW\)<.A} vsaҼDᮙ}駋 \s lR׳(lUXJӢ0u ˢlpM h R m ScT mTTˉAm4DŽ`Ԁq;"X!~'&~k%V9iʹN# @';aU #p^tGUCλ'r/ZT)>jؒ cYku`3JV\;J_×c hq&a-M3b%W(N5pJq_3ps٣J*$>^gciy`rQ+ ~ UB<#1+ E̫.9' 5bf,o` !7ţ6B&@<3aFy &Ŀ7JLlȜN 2FL^OnE(95B6P_Rlgs\:aC)CIcsI C=Ga08Ù-99)*Y;.Yb'z&nkm133^>џ1B&nlCs'YkjϿгo)5r \꾘ڱr%s|93nBݽlpt9FA9 cdac}(SyW2(.%!٘w2-r5ɾ${?ېHx!v6ЙєS=͏eeRYR 2; |~"e=Qw Y:s #i0o*m$,6'یCŎ?`%3i":9s~ D!ÊРȌn,D^.MQjIEp<1KEͱëU0e]vC$$j\Tj~6'm5zE8!pi4Z(z\XءI?#_#< S{^-ۿ~ AX$Aw$T(|z|j5\E)'o cNMVB{-p z1rlTg$#&Wiم#*#GF_ג >I:$@O"s=DN{ 7}8JC;WMM!ɴBi(F%~Zf0&hCpJ+l@G5e3ڜ4%C^X_{50l [ZVAô3T.C~ "9=-YULhљK H@,+z"[yy2yeF%T?Ƥnc#PVy#.rqdRRMhT ̰UU{-觲[!#S Op6"עX2`,Fxi9Ad zk<ڈɠxhɼs}ߟ##dJc0^ Eі 3 7*ND4\ ]t[l=#tuW1@)KܮVo1EE Gm˴h-3.@րf1-[ `{.1jUҗd?M{ XiS Yý߆Ve(ZjXfl^WG. ]@SMH U/ 98+Wy ހ~Q芸X 2 m먔"4U(=g8IPV_g묲l.MxCQ,3GmE$@7nnK^&7q{DLx|:$ҳn8Ǥ@ӟi6+_DT4O\sNe '#YƦx qR a\vwl Đ>u)?AlaʎdS@>2A(fc%7΁5ݓtGi}ђf1 "@-NQO蟻YTҳXN&"H2o\>_( <3GO٘lP ӕ YfK#Ϲ+9~8Ee|'~+-?NJsAk,67(job5tùu9Hnv8T>C}$nYfuLj]1d<ƽdzM#83OtǴuiE)Z#c$;PW]=jA1r; ;/l[˄fSB9\ UwJV'FAC|6󯠶Sڏ0C98h{1wz9} 5=BW0k/5u4glcxo:5ڶL-l-<>6+q֪vlκwZ`zsw^DN8즭_N{Qx5W&-WG/&5oڴT&}Y ^3KR$Ҏڤ:>eV.w:^[ϪFŮ2lsz4l[ƽl5GC.J,o5_ߥpvoHpFei/l<u4?1 l;mo鿙ߔXiٜS,t#Mqh(;k8q3ױ:zjiNONH<)g Zڲl/P3d;\qwan =mU*&!]cd=}_Ft(MB-XolyqϾ;ƳFZjլZ\s~uCr3?p-ɚdBxK1Iu귶ْ ym:kЪE/j}]pL}eIMm{/UzJLVڊcB*4"OeK!eѼ!FCq`T>6H:<@IR~ѠD8*͠B&[<_իpтxUBeNV)DAKHOvǮW|, Y%f7P PZnu i7{+:cVe 7-+#zDp 7S>"zV啞:z3i7}('M 嚮wC_sW1èUm`RdP+1`n,arTD6gѼX>Ot}9)7|b pθF|gqyƛPf\eO͊C^/!*0O NKg{$R; +;HzNZb80 Wz~!!JoŘ/;\ML@t}-uСRs ; =ԡ V?ZpMNk54]̹Kt.WEktk~.~9?դm=Acsխkz@ߊt~ ,whnX<q_ ng"!wZt$b]5d/uMI⼅pA5)g%n.,O (WUL;15.TUb#b?x:W"QX:+o<&Y-əHLcHq{]!3EܼS:SV6 >Iv\SǒE/D nDEFN)e8kr܈ڢ:a[2t v%EuXn}S9G0:8 DXuh[f|2ņ WH0Ȫw$Mw6O|ǽC,Ӏ1Θӄw}ԣ.J[{KN IaMʁN &҉ġML~v2hVx$&wₒoIA`T ;KƬf8W#ӅքBan>.)>>[̼KJg=CECk_Jȃ%6d\ހl Γ\ng"FJai-U W~Uڐ6Pe *zI|}~{;_H7Њ6g,ㄣ>>Z*ZQMC-ǘ^y$TLg\xE|X<3ƫ5f-׾GsuB[щyטNiyo!G `a&k/|(0PYU&Ø+?[etV@PSYrO,=ckIő6Q=g;y^.:FVYq(Fw5t9-fC.܏Nu̠&mӉQx;jѤ,T&" 3+c9q~ZR#& U+nv.T $"nz܁;|MobӒ66kWVpB1dK'kOمy ansǤp ;oErm-GˏtySYry˽B*;,ZZtY$aR\\j0uE^杊Y@A䁢[da`o֗]U¬.g_큋gKhDǐPa\t9 ;/<`ure_b8;W CSVz^.phFlĄԱ[a,ok٬F:JFʯO:{lcf~.g>HG TEE2?mmL1 !p !-y3PfhUmWNЄrxVנ@{Kʆ"6.UFf$Z@rT=sۗ /_O?<yES{X6kTԷi(PpJ)?8MX*Y> ~͞23x͸r6p5L~wAvywwUY/ḵcȣ{cn~3;Ht!r$:= !ySO3+DOjPJwN6KWϫ,ee5<@]S2kڃ.8c'<KiYx }IA'5\5.ܽ5l@_]&6 8Ź>NJdcQI#SfhQw-]S8Mt$]$ J *?␝_kUհύ.Ìpl8!r +up3,QRC4@>G7SL&]Q^CFpPoX&1~y,sS-ѱGpCx1,%5DQ\*X[]wMں<9_K!Ŕz_{I0}+/sreL<`4>HbrbJb8FH'^ÊWVei~|8'PRd 4q)PE^jw \jAGj+)QN3ET3DS[O-SZͲ#d)[j$Īevm!;e~dD+xdWci  zktTGk!@Z[vXWCXK`-_`ϗ쳽˕LhR\9+4>z EK/̐8"cXϟs-Pw3=>–\ۍy Ua6eb$82mu7YS/} tehd 5jD9;i =ff9HNt57[:Rufm#+_&*HM:^6&?)eSw|Q݁w^`Cg gb';_K#qK/ 9GwKc`$d게ԁRֶfYϨM"m20mnƪJԪ`i|vCb~|EXxy-1k,61gr_'d-D˘}M1Z>w]06dT!0z]Ps%w :l^mƩrMw]3oZU "x {oȔdMTK345\5P颱|;s}laxbøiŴf Ù2a{C_aj}T }7j6}Keȟ=kj} _?tW)){gG8wGbHûoQ~ Yl\V/U {{/']Mf+U~|6Oi\ yo!ޓTv.yȡP2ujvSʑZ+"u#bml7#U#%,eFazF;!P Ng2cEɖћ o^Y*e.uNs`'>m ?zͫ/{mzpqt\Qw0"l, rJNF_+p(wf C?< mh50x'е_4t|L&;zh)&IGj%GһrÇ<(F_0+r'SS84zƳ܄쯰3Yw?TxeFAٗg-PV(_?X}{oa$.]Y'_ɖdz8P)vt{ooC'k|;JoģZC k>5,YȔ*5t!7'e|oL5e$2O}<ٓ"0a0!ḗp:ZNQCvCz.Txo_kvc6[WsNР,GW3ÅyPP^7m1Ro-IuO~~z@I{ˬcHVgl`*'!vݛX7^uci)d2\Y'.}'% Y` Cjx<ϬJ|)eZyqS ihf\b~ 䟥}X6ꑄ #I{wY Wj: Q裞_:o̜á/L΋*|MTT.igM }ՄBVjcnh/ۃPo]RxO "1S|ISQ$(}FCBS-J-?Lu%}1ìB) % BsR ȿo*0%֋= +<ѓtn}cfA'hf]Zlz=m}O^{* A]NL-АiD~s\mJ(yW<Jۍ[{B;TGd2&^imwv3s2C?‰8?OHEBmq>|N̒j4Eyx@?d_Yσ_r?r.&xc%/JvrOG~+oP~sa4LPxRbEDG&e֮Ev +5P3U@mAX[CG~y;w;"sFPi'aOD- }E?~SI<)<_|i0&%UW3A.-(T5ݻٝIv9.fQ=dh 9 +M[#%u&!q'7]DTa~&PJ%p*L$yo: *l2u\|v ?W{֏C9(_{:cJ*#Q`[3/kV6]~o&MGV~1&oP6JyNm{%cf"uL[9mOk ZHtx'.A^3D:F0!55WF` M vXR 3&qywG-9~W;]CE-e0`ѥo-nokF|޷`7-xC`rHI3~=ߜo8ݕ}'WeU sHNu"φ=I\FT/W>%I]4eihH-G!whrCl*,9R8T=HX S @o)侨ȍ/#ԇ 5J759)=khmxLanC8c~y[dg|³); ٷӄRuV;o?ҒOl04r>gHtq~[i'AR"kea =izx%ǒöLg&cKC߇@ͳ΄M!ͨ+𵔲HĂ/,.Eyi;Sҟ G>f\Vާ)r|=_>Qa3 GN&UaKC+;ھÄ۷d?%S9I)9?y"B!F\<Ω0I"ãPttzo_Z}؝Pi?ܞ3_ӷUnBLH Q>x7d"=s  /4҂%]~nbt76ٸHa&najE6 D"'bFY9jR?FqF_q_ Z909q Ɋ嵚x>~@iQ~:?C ~gU?SIf΅9Z)D659L83Cmҹ]}OK2($QMК lgX(zBs}L XK.-/ S酞E5uV4gA\ŭWLwӍsأ޷6LɔTҟs v),(J~lYq(lS`]bZoUQǡ40ianBSxJm^L)-~zj\)ն5fEk #)KXFɇxyՏW&$v|/Vh[4RSiߘSPRH_7k3{]adp(o_Y*tvJUk+v>TODް3'/]+/b,.zV5P.X!~GP 3VE1QZx 3~o/w"Ҋ|~[W4T7(bhNJ9m̶Vu^x0o@ݴ7l;s'kCar͌2:fxD\4C].J1l=S)_a/? ' hw\DFhtP! %^rT2=c$g"XR]̫WfO5#H޳]7=$g~Mյ5nd_=vBqN+:8=EQ ˼yN ꃻ~e|ŅħIqdu[KfS|Oe>g'6 jL ?p.?_]z]1/"L%45}bR||va}2ͷHui>G/b i8LWp8|41ѳ"X ۻ{\!Ƅ\e7|,h)u_"7 RBxRj#8!JIQ%{V&aR;!"3/煞T>wz=BJ'}, R<:A`7M~2,a\@z_qࠛx%K^A:M$DeY蘍³!DDg &7n7?F[|-/q3oF8j~:SjԴO/=o=U+0eCyNl؅I[F1o$ii]lJL[Ӣ)iWmޞ,3Œ]-GViK5o'V5jwJ3tzyv]cVUz5o>T L\-F~0Ĺ)'O#;M_ 8"bq5:/Jܒ{Q x{wj؜)_BxːJ.`zXHNk^]0TmoieWUSF~v#κ^ъwK5ڠZbxl}$ÕI%]F2gO9O4t|9I_T.ƼM ̆i:N(WIMEUv+XσB dl.숤kSL FJQj3F\f hիzK&p*T}4v0.U/-Q7S I N:EZeirՂmzb?DdH\i0HOݳw'rtE_Yݑأ-աe!.R"3U.QɑٯRwfG*MV6 BZ3i`תnLd_IN'wkf\ǁ1k!Nd_I$AkwAH$%Cmu)7M`\BSGB"29Xp'Q=^{<ƩIRэMGg>^SJ^Y\%Z2u]S}eɂt%6/Y>ڧN vvPtS~^UQ篫TKnL627Y) nM[=]M}uIf[/ۑ"!>/T ѝ-c?(cFIn3RTL <uk&"MGYӶ1k!Wjĭ]:ݣ$_A9{ ݊5vѨ-]N|hIz؊o^tFNdL:~[R]uOiٮM_WPq09O7#k.beJ}>Lu'/>˺Z%ݾ}"e?d53nUKdr'@Z&yw]x| ?hXBTW@%fQ-053o[ʟq;x4yQ-vIG+Sȳ0ҹqs8^D{9#.S?y`M;}Jbt;V)-5N}gʩt1nvPLRơ"E;Y=ǛlMn=æ^b].ҒH4Ѥrf*ݡ'?$Q?HˠKYZee O@K~POUv,@ °SO%,YbPWprDU+<ι&~ݒ!:ynn]`o漱d{<͚ݸJGup^-X:pSmM\q99XGN3c}>CvK[1;c-lևW NK#lxe&.B8O4ո!O 涀ЯB'UG9`Wz. 8g[|ZH\JfWՎ}9_$4uZlZn/II~]a.oSsAs2/'U'<6Y(C#j2pWd>S d0n7Unug10$MVO' VV ^.s=Υ%"V>i6n4;ߟɯ Y"D@L*eeeF2D%Ansn7C@tZFحt󘁰E$|Ƃ[40 Z29Rd"[ob'܌9D{黴q` O%:\\0s"kVHmκuz_5cSZ,e5@Ey:kCY]K̚%]%:EƲj귨uٍo\6!|q߱W.A"A^3*F=uAM(}tgs5 6'4uKm9?5A/m8HrTc|eY  $'kevK}czAUDˏIv'yZͬ$/⮍rp2wW/+4()yWU*kz'd4*5nTIyh#t fഎ:iEiSj>ָ4z_(I-5bzU}s~' Z;9{WewRFfwC63 y{HSgO=zcvi׃QώX?{ <Ͱ4ƙ(ZQ`=yi_,ҥ"p>uSPG}šA)wprժVPKIl3 u=3(F ŗտ (L& fi%9nKIQD)E N |= O\Xr~9 6N .D!/<_az~ƍ|߾u{I>F@I'Iff6Qv@KH%1>ъEpJvIn=XH0.Kj;m l=#DLc:h6\énS1Mv&!Guĭ:ܔ `CѾi,c. wN!F!VJk0 7Uki"7lOJA5w'7DזbZKT29~5DI|+<[ȑ#3$!g hBԊ,Q&|{[+2[vQ%[HwSlQ"+mTsӺj?\4.=ԁT|>}0cyАj26F g0k; s+]2l\ XHn!Beьh! >'WгL ,d2贂eM'BsC_~Od:|A92$/HufMS"#צi\ev)CE}uKBw ꌷ8R*'~* [𽓺cLâL(6J\[) ~RCYn{o`f=>&7]>7{~99,_Yǣi&&λycw>-g]S ũ'a-~s_syK ,ˀ.kEJ(/y+㝣plNI:5er_inW=88D%ߍ}A8wqvu96!f_vPHJKm_ NFT.Ұ%?H8SwCP %soHaDwb:-YDo4q{kbYRҽ׋. TsƮ?06I1`Yx[?.| {<wc%6PJn"+"ݞz!o:]QO')x`˹4=7VYкI}U2">;Ѿ6Kk_Y=tq\@Ώ@lm#Y35s=NzwDle}W9&Σ&\M%"xb{Țu )C$J^ݐ7̧䠀t6M r! \D+l@;WӕQԪ&̟Uy*K ǚ`cyx}pA%3z)!vԩE̝ T& .DkoBVA1˚^P0Iy9 8w͘26.|#VOLA@ߠKzCn؈XQKjT?FѯM Y+/PdDs߁ҋ2U]^ Umк*ihDfVWW׮G蟤$9bCNfeyGlYV={w<삾 ׍ #,Rm\d.y&9˃+.Ovq1qp^'] AEےfC>sfɁ@5`p8/ RB'HGktR{5`DA49.cGrq7 b3+&1š29 |esfڥ8`nMǏeke!7/S.Sژ:8imHnDW|B:cQpbsAswPf5^Mo oX,IFao9G4^;*6`c_x(t?b pUָ1o[Ȯ8| XO_oo-&Y8BO=>:]l9!4Wͫ]R'zě(ϊl{Yշ Fx':lf_u1y4Tub7s1JJ c!}mq{ k:;c":ql_({$6ZN#PʉIU '|pgz./8OxMZL+[MFW2\yt{?CR[hb 5Z$Ӛ?`G\85iaJ"r@mѳ|}px|]4zgk{!`(qujmɜ4vd{v.oB4TS_~7K0U{#r_Cm֋Iʡn_,D?)4iG~*'CW߁ Z & )] *]6[ }U8s1A87쬡{|$ v*/@mO]`,LJ~=2Q8[[a_fwme'T n{Yuh=sE&~esWZGh%OD}eWKgKD%"6f9-ts+#PĿJT|qv{lMK;}pW/ŝvCo,tn.U^r>l5˵Wj`EzgeHuiKnjz<-NxBE-)PL}ޑʗ%wX##0,鄩w]Č "!Ӌzl^h\+v ,TK*4E1S@viNur5R7o ȿA A7o ȿA A .l =k7o ȿA% XoPT@QBLM]ԁe0T =a$57.6i5*VMf$r  m\` \C'Ja1gd.wm _6,•xk` 4'@2bDF!,s ?Q .X6fj'=]cvkV|uxjԫҦ212>i9VPK ㍐b>#WzE <_B>)k%3g&koBSIKr4e++)}n "߱ ͭ]!5u#6FuE,,+x?9 q3gkϴn?5`Vs~zS} qzٯo֎/GDjUSPM}dW  HFڈvvv _!Уէ,8W+ȯ IKܸot8,aT ㏒P?P9 uNVVKf-j~Ւ y̜zx~_.ZH)R/ʜ-f R:U ay7SNq7iY=I[5!>=#X6k:]w8B- *y_ =AXkwݤޒ-5N<T[013{{BL5:Q]HNlXH7b٬YtNO>keoJ梣Ζ欤QfN5)/QЈiB#vײ9 ,jKh|Z&=ћu3Guek>cڻKn灂(sG9TW5I cҁpY·>ev]eїѰO%?pH^F( >*cCc瀛C9B sBQ\PV=iW-0i+ 0?I=))"<(+~VtC&8xt5>{&:畒T3gX6LK4Ͼ1PkpXy2[7) So 9dz=%=$C{taO>; N~[>L{Q{)}4Wl0V+S矻Q(Hjڂ,tvxpˬNrǽ\׳Uܤ螇[YS@.gySQ[y0?˗]zc;ǝCNMRrC Mm {R(l @ߕ u$=\eXt,P G1R¾] DÁ͡&%ڨ/'ӎΘu)uj:ҪE@>DL%z:uc4ZTz(K(fJtW8P{LAct˳6\ a0C?5ie@/ܞS+J7`'u2YG.JXzm7r8a!BtoPVԒU=CNV@+OJ.PʫhꫣpGH74\@?x> Fs )ϗ;C: 6Qxo\T.] ]x@WSR-@ԇ|ro@GwpEkDkC< El(^vl 9Zif7%xQQj!w 3h+:x7I0zHiQIr(]t ^77@ S=9ICNn-˼b@~ҢV8O72fA(ڿ好)ڋtUC%g܊}l-N+s4\H,wx Iz39ꯗ(3ߒ%<|HD SHl˂eOV?~1&Wzd`+2 sJ0"ѐ`>v~*t!o\(#g\:F?裴l-?y";:50q[gD;%Z6cc'jfV1 PrGSuZS 4jl=ISہ{L`YZŽC~ec X˹W +"סKfkL&M\w.6bf`y<6O|yF&_"-7ҋ7G(䭍U}{h-]z \y+ۏ&ZZp/K]i on>$q*BM?pZ߆Y:Dlr9,xܧ)oTco0FT9'AW@:TۗsIsz sYgq O5 L]Tۥw0  uvd`+^0,wNpkN%nZE\/LކtK^Tcw; Ė]}xXxy^lWu$Z›A yIoC&! L)$}/t7] 1OQqC0bF+:$@(~Ga?b9_ԘQ8_~XX /T WTPRz.hK?9 W,<2g1JE_}c^8:cqud(IЖkK:dl:GLDtCIY$,Xר`{)&@#XF%4(F d0dz)e&k5KvjDWM!RiC_U,+`ܡ~&NbӮڜ{mS4wѩus0p-;2&l\ _xˮmj.Ty֞5_a"d@7T~ڻbīBdߢ9 V\Pc)T&}MR;+L)];.e 4CpPSxrBqDIO1?gث)l<iWC.Uס2y~'G1{ x1yӆz-T>xtswg.\vy6ETyl[ȧJgI]sȸZQx5*ׇУ#d\,OxjiuUڝB9@?^-т}GiJKr]`>u2xकmJgm g5Kιɲ>Ý'G0)[EO&[`lu~ӛF(?ʓI< 5Nœk ic8(m{|@8%_- @Z~˫HcQth003V&pQza4nƶa>ZhHV[ :4g]8N M ]Y蹲#a^Մyfn+γQhϸVUD$>ȐMZ9X2C#8䦓h[Epjn !C'}A2#OIUa`).+zg%n]&c1 _9PK0 }r(1M \G7oEl {y2.v$Nk1Wl1ɐ ^v.pG1i5.^p_A3+[AfTGqL@{^(2a"ZܳE;)KWVNPn㒼نt?vGܔǜ]ĆX䲞wd*#s:`A2Imu<`CtT2(WݟSCG?P7YjAl1NP;G`׳O'Yםb1pLPn*ۘdi\a21Ww۸j-"/>}pK֬b~iu:#`"gnC߃g[A֫f]lȚTN*xb_L>ySD=l޼֯QRb>si?f*̕YPWc]v`wӄ0U`1_ʾjufI>I xǧe뱌6׋j\C4fEl0_yEiNE)#&.G[!CJhiL@58ڠ[]iƐeϠ02Ah sI{'1 vN xpZYljό 9^#/n4RP"'(,:3OZ.n`pJ/nz +T+up%GP(0|LINݖiiˎ%A$ N*.%x<2)̃/r)&,f jKDOO1Ռ wÿFG. Mi5wWWf.I~$H1:FH"?mY}?}ISQ$؝FVЌ3!I`Bڟ>;:x7/BN9+榰lh.8:r= _A#^{Fa&լcÿ*ŎO_,x Ëq5W_{WRHDK,89G|&d>‡|єn*2}ם5t}Rv(qmZ03ƒe_01sKo!~\(M[H {%0BjhY;g[4iRw<:vN"|]٘V8 1ŕ6θ)r)L=.>;P3%jĞ r7D,Bd8X&Z@"gdu^Y8Dq{Qn w.c>eҢ;e:#n}#,!Al곭5mew0XoEnhۣ7X0|#+@9% أ療Ku^5o5 (.>PһuZc|D0S_X3Mʮ5>(VP[Z\?= lRܓiQ {*kq}~wG]+?+WJ%ht)sL=rFSa<#w9ٻ݈g5`Hu5a0{w_ | ܕ?.Ɯ͛? x??ߕFR<:"^!Xc ox"E<a hIN xzD뾂4+D+qjh$DM睺dW"VebI1UZ?-4asG THbI56I`A# O?<"_O1凢XYL+c}"r2[YM?L}7^/ ,`kCxj tob$|V#^wπmun̼PE0Rv b tOfh4)$!:'Ì }Ta_v>FA5Of4Qag6A}f$:P;xb$;~Iö'a刲g3{]@ǟ8梘(/ Jx33#*IvW\R7jiO̥JhחѺT5k96H_KAkFG@Us=i+ .970l1bD0Nq}5@᱉ 1WPhJF%y"rA 7JaXX:F'#~jṑṑRS!j.aDC4'N:*SbqwA4c>0`&tɃ~#dh 2 Y@H7Ās=} l51,WeN1AkK&8 Dk`7 >lŅ<%>{߽%WH, s5'=(zE˯/)>V|G,<ݴBL>ţ Ff|;r*m©{ +O o.- .Z'56t:+Q3g-*={T8|m|~Dozrpk ՖޔLd5:]e xL: /QJ\BpUlj\Vn)%nZgIL R$spyO z.TB̓}b30Рw*KH r.(r {5 CϹx@?ik@㨈Cs'Sɇg-1LsߒrCgTfwkR&u<9'~e~jOlX7QI\ˣ9M$@yHHA6i<<[E6kdL?tp_ r&_k}~0P*S>f+c DU!OE:sæ(B>峒4k.A;B=so.07VHS [CAgpM۠ $J}>(BdBe瓐(Lcm+DL~] 5U^6es`oO ^q'aaIty%;{qF19xE|i>OR*x1}f?$=]x}blu**e՝M-SXם/r={V:t1ٳP,Ar>{-3'Drcd/Z("G XX'a,`OK"`D2gpXR_2{ViMIg[#ȏO ~?c֊IB@E#^l n=Ed32y*. y{z.w  }[HW.? M/Bb-32'$DlʃsP!8ldJ,3,-#v@ML_-^ZƯHy]۲4j@0:ZŒz!R8s2Êz%7P&۹/ӟFb4й @L۴jgR!¤"`K3h9I_q;.o~$GZS T' Ee|3$9Ou((> z"..΁pyEGs!}ڏ3`T+e),/aBZ%ϝw2SZ$GIT=cp E/3䕯^ <#!ٱtwi#h3 d ]{+0~vs}ۍ/ їO/(."hpI.6?C|"ou'hezqvc5}} &Jzlkꤊ r$2ĵY?rVCVSQz!9|WvujDzs,Po:Rbs@vb x;!DǶ`Wh 5OXêIw1(.z&[PEetuRiظ`Y&HS +ϚDc\f?-YGGK[yR΁ݰ9O+qIӶA@Zb6k;)M%j}cE0צ窮*o0P1`/OگX䌠 gu(V^`˛) r<}k;ubspN뿠Q+Nqw:1B:TZMpsm;S;WӢ$z UbLFp`~<: p\~UmLafxwᠴ]IMYIvFbh%I%ĝWq4t!#7*=Kb+,ΕYa鶺Y:خ&UFK͙~BxM (`ٔ`;]YG7?Z');T%MUinoXȊMu_A"B8&w yYpz#H30{2q}y^͘<[ਹ[mqXN^1pyئMZ_!W~sZ5oi@d鈲ҧdS!U1AP.o871OJ򠹆HHE<'uxFf'f!Ġ+A)붓ȯq)M5GdKͿOK )QN$=% z:A1}”R9TkE:;@v%3E:=ejnY/hƵMbDX$  K2$"RF wqE~]}4(q]uYe_v83Ѣ2䇠G'߻BqtmY5d _;njl)/:Ѣ#X9Ye5O ᜉ,фPx$nOyҩ\4eI=ysdncaQTX[aUq8xF nV[mn62% "/c&wj.Y0 ux8ddٮ2)MRnZWUH&oda:t2 tgi8mƖnkt̩ԡum򄏰Tb~1{bke˶(ޤb%}R ɇmYheW7m w>ȡ8;eeDΤ e6ѡ"d\5BpAj&zu 97z-aFAh2v0C{&-sx"֓@-+98jh)nnR('%$†$WЄU!J7z>N4ҝ,TJeFNly@ê\PDK]yᏌufʿL0]_͇4[?0 GFq~fEK?]C>6N˝;=6#^@X x"hH}տl&+O_H]2X_\;B+;Vg>͈ |w6S𬉢`I$s֗¼9gSeeoX'tTtH> 1 dR~>zx VNB?rMjle~Sz(Ss ) ic]5?!6YS ٢n@큌]56Uf3?^O"pmrw_\) W:{BEyR %)GPXo!_a92 & ~@o{3L.@6{ H60 @$)lE7!_yM_i(M<*t$$[/ x1VBOQ6zviu_߫r[ÎӓIVbaGEzQ $TqjEMA e~ݧnM""ʌ)"krdx}'|g]>LyG͐ +&h Γ Y]%.{Lȕ _zUBl>j$q%!hn$' ̤kX+!'u.W:,E2$^W3S.D }Jûņ|rE^pq;A}*O,H (Xj>3[m0Nq,"mI [J=C@P7^Y\)5\A(eTmSm{dJi&^H2'4Ug7(c *%x1p^{Q4"L|?<;wVn5]i{M~H4/UӘ*n+otd#O"}gʶo:5Rֹ0])2,0trm>np69lVw;n dz8G+L f+mZ (Bb3 -7w׉f-?TjÓS2gnQ e/oC/\9AsSN[.KCojG%j;$4IcwS0}ΚKG(>1`n xWuek#ʹKh1K5ְX  ܞpEAS8Ƒ# =~!7;FIKO.oT1R4Ip^]nY @x9sO=4'56m.TKH̑)NK0#z(-8畸+yK+~N4"F{ct `>֭9sS 67ƹQhwϬѧb"o0(Y}^e&g:J~#7}£:Ѓ}_*kž!f b¥h_f~"؛c&Kdg^v4>SPE┵1O?t9AgVl%V=À?_MrwU>mGUG6ne YeRL;|P}oV}WyYS: -ܼ,&iӗDwfKo-.XR]l[s/ͼO4QxtX/(}y[Dq9KEuʻ1y+ a> CFU)Q׵wWt(7TQ weKDW</v(N~>Z?0hfiJBu`(e#7&9'yEW+q/e+pO6a|m{.&^o &K_rH.b?ӱA\oV;=4`_~2c<?h`?@ ,KOWP;zV%܇}(q5Lܽ:ߧg6co>٢k+ñ_#k8$lStH#vPT(A>S#j16D/ot=-уoRs:nU#KU{Y[̞tR}2Ԧo/cܠksrЄAnws7$RT{C1ru>|n15& g\&t\#ٵ?]n谌>[vy9_)EFEFh>WQO -sR%w~AC{+]0D9 ^Er|8E4ڲ,s*q}3I1ψ&KϽ0 neip8r2̘"=`7R yk= pf.="T9՗\F*m+sܛS] !ߏ!FϷ_`,[Q3j:QJ)J  & "KDDP:Hz衇zH~Ϲ}yfZ|f̞dLKnQ3H zt+zQrAіg5z"SqGwgr-_ פ$z )_4xr g\6%jG? կ6Go.qqx2hrZgxL֟ F>gcT)ttaoЮ8rKk[=4=^eD҂XMN:-j)@C-@sbo_bZ %U:8ط|f`"5 syB? Ϣ2kTQgC$,>ۆCA+9d ګ|2IBŕ;W*3Vu^EHQkjMw2  ݧSMToDs 6=GgQMllKDո.q?xe!,SvOT§ö/Q '~E#L<^; zSmԋ5\?O! 3Ry!}=CNФFȄbIPw0/ŢG'AGwHQ>®/[c\ק(0Rwvz޳N= alfanp z `pl۾@}5!3M ^j6#<=YB"#n{}׵{|**]Ӑo`Aܞ@mø]HYkbP"Qz~5^luܖ|XVߧ"^>+APa|vo{:7ԋ1S_=,mS!@XЀon:|`.w+t`BNtla[% W6ꕘ|my㌋Q_{j|Ά?Ny|F/9_ NˏgaׅyJۇݲ.8u j6?3?^~Cx^ )ȵqw*!7T*k"3?x T3 J8-+=;WHLZNhL>:Eۨ=S̫5{'AL3<6-#LJH΋?DUsb؜o٫/{ׂ%.q}ɘq__YK)#g^VEsa[PBx2H 22'S6+X6\VQ9џPS0eB7Ȍ[ܣ) +v{X+1Y{2oZ nӑ7'«rBTtyE,P [QM f@`Uh`y>OuxMZļ?o]UqZ74 ,SP\w!,N"R1tm 6h!M2-[ڿfҌ4a=Cʛ֬.XO@eti짓ԻsW Z|%8^rRSRv@_*L? TmNgI^Mt[1짫Z E^Ì4#SEg&@kR[\>c0&9ids`߈Ybo)4lr.0a\193(ޛ$US) J3;Npi7oY|Dkue,_B&oж KcDdTm)˧$rlJh.ק 6)=GWWMM,G*?U4<˝;h1_ J9tّ{uWRm[R&\(U"Qu,[P %>fG^6&>:@R;6d!T(cV.†~^1 YD$p<"|DIk"O=A*G)`;mZ՟.ģFeaɕ8?_<X\SOƿn}X~c:v#-p֮Ȓ+ye Syղ~Wzɱ>(\] 2\ǒ%V"$^ TQY6\)^owVX 5Snb#]뀲?9gG*CtuM> C d@8 ݖU'^6 [p L= ksPc把đ vkt^ˍgWQ?q8 cpQN 50G7mɤ7dBaAcUD*! KP&WS|:_DqQPf>׉2{gk0P~ɦVY6mP bJK z>c*ig=Dsl!BSʴ _^z03zˀ2yYp Qn+Ft95U.3 ݿV0"y mO>y .7}U D%ʳBBP ,|\6Eρ5<rl|EM`raj'g? j1`r{L,jf﫢g3C@ I2ESC>nZSl:\F`"8Vj"boJ wż,^ŗ+ӷ EG 5^]pvn}(g/z*~/.^ʖj/hˈy8PbNc4(w\=X䗾PQP*Xbj kDd]=Pmfp9?"K{FĘ"e w˂v?-˧ұTz@#K1ZOAlX4U h Ү<$-%^O]ՓP%:p-WKfE{GGsTv*"ivpdt|lӖkWj?T 1m.Alx HEcYvt 1^E¶92 '-'̽W|}/Vd3bz)}/hu7ŭ Kqi^?s~L>d\ɵ+?Iav0HZ2'=2hz!ЍtBSK}¬+?B͐6@17?7pLtc.`pWx;w=b<x"2͎H›U,B]ѩyM,go"h0I^j6}I"dNl ̋dW[bgו[P-pMg xk@bM]6BdFApaXFF iv,Oy`BQ!?.6-߫gSK7?PTDev] x7.E_m[:~!zm<njrŖXcUz9O(y?Bth?}V+& V0f͒_Gv(;y'W-<t410/+ܖ#FYVО_ >{K=l[{|y$9\3,?.$r_,8kl,) Ã$@PPS!"zވ&B>ʾkzv|e1 ( {}j[kw&&Aޖ(_ cRa@ֺ;X5ב FqxSqa2zɩn[bC`V(.n55{u@s.t 0tTh *>\m8O&Aj6_:DAQ^ۧ;oWqsz1=+v؛)\ߵԃNk5cX={{}ܭ]΋*玖ѳ<Ĵ y@zǻ%{aæ'|kځ/ 6X@bQ G\7?86KFFC"EQ6}lͳqo>j" dPzShf<27^EdbhON7mn}gG $r]Xi1;2m \] cA\K@W!$[؎[@V rQ7e ±vut2,7v3#lRWCRc.ui_"8L@^f۱lb2lIĿ0%nǓNhpף mW}3p}gЫ]ې_NK-COe$m9Qiچ^{ =j!β"Ն ٰ^/I-10PйR"es^1홉(_T\@ӣ^lm07f?Y/u_6̝ouÈGS )`GR[i;\|_d\rRHQWnj, ml4pRy%Խ8볗[Fbp,aTV1vp[ou?+Vm#GDZ۽y3W~7\ M' s>G}ɋޣ@v 1$mz]$=Uؗg ˉvʉ ;- qK U:d{=~ ]GqȒ ~?=稆WM`Z*- `7c1H/ qcAܶ4%Z>8q>QUrI#z0@%_D0ɻHt%v+*+g`9@'KX?p;e^Yq"`l|D|ڵdbVMښ_: ̾SY40;t5Q652PhA3} BLeo|hPܝ%7%! "i;Qw[y M(}m){rh=y p8H@AŠ}ZhG!‚>&X"2gsCp;걒WΝFDSB8>)hSxi/w|^{M,?C] (3 ]A?5R c <UR3ۀtl-k 2=4ub3Ds›fo q)FJt:eX=µE3hCk@jqF`Zb8("aVUbTl @Cd2ι /E˜AuWM`Fz-v P iso*} Apl0߳ ڛm @9Gڎu@v c˂cUq8Ӵ 9+2! }$ k4V 37M&6MtI oeBgqVB]D1홀X}Ր"!DQ!-;g+wq-=G\ oI^ "Ȁ V:Ai*|_(*2aI垉FCqze,덂>D>v-?mٙ, e237D*L\'+0_A뻦-~gc~nW(^hH^>A~-(c7U=?<7'| IHNoXVs}$Q,w^P0κ4Wg=:?,ߏP1,7ɥ~'AY[G x/eV[MzoW%*s_=!?Gk0xWP˳AP{J췷λ@A=BY#/yþn~ us&Ŋ6,z/8@9X"AkB$ N{ \)A<3969޻W_^tN! ۀCpbrV䋉4 w~7;R<+{oI U| -,3= ~[b{ؿD;J^);~;igdR Mlïy,= z٫\p"k'@'p*VA.jo.8'uL>]N;n6xuY#*?? tH:h%̘q#wɆpg ozwu[>-|XScuRԜuY6;QC77<ߌ#~w3^[>$9xby(e^q+ X+4Vx]z4gLeFdxW_֤[QY[b o[>Y:ܚ|1j1M"b6"GWy^`HN/[Bs^>W2)?I|^=pxآeq.!PPʊRJ,x.yzfn o} ww+lj8` H|3R6\Vx.%f|>!9O4*5(1,QlM3=;7Wf@NyN A1a=CHzfDNs!8o뭶|@Q\3 I3Zvݳ!lnG52JޅfK<dg- hc-.-cՊ0{̀^\-+ k'ۈ{oT ۸z.ޱ.DEX8I:]P&că3i/2Z翿GIY>9@Vصi3%fr}3$".ҦBIIWR_\/ü)Fu?@5INz^e9Sjf |ܕ@5%{@,fo~DBt5r9.fOY=Z-  =]tt$ ͐ mC3'msFM  {XjB ,1]y@a>2= @Dz/3" b8P1 (Įc6enOJѷX:ϿQ^NX|{8)Lziƽ8: X~}Nf؇o8ie镩=DFF]&v/EQ K81KDRK!?tKmFϖ5^ҹ4w[YxvtUW ͆Rھ왯WKu[m8*jphн!}@R 32}[*=jUJWj|PL{N%a&arbٌJ )#,^/0Vr_ Z2j ATޤ*1Q(`u`+`7[A F \gb&l<*Hr(fl08LEWu}MI?Fj޽y݃:꫰(K?$oV܀Yצݛ^qF*xMwP]S倜/ Ou8ʫFHO?iunDŽfۻ:Rgaa+7W#>WG- F6A?zW0r,Zc4.COR|W0D_M&x^u-#6e{ZUg܅4^؁E2p?+Dpf3\)nn *_GQk⠨c 8ه}>^^WcXiT/ /1G֞ Uʪj#zLW6.-kZnɦ06\؛)j)ڡOmnդ[iޮV,}%>~?hQ}ԗo^c<Ӧ_]i\P^#ԛx!cGY{tf6L9#Ml_E橁@{P#k?[ɵ9ɐkLhydbOc61nie`9W>Lg5Ǿهe]:vOoM&r5]E2~ˬqhñ5W |SlϭS~wFǜOJT9>,8Dze,QZ+IU^}]%9V$yh9Ƭ2z?ouu13;ݬt; 0,u]1pTf5|KNgro2֟ޟ|-3ϊY'PK=̯ XM|O<ۏ8Q靄-?/tֆ$D1T6d>Z f]Bf-~V0 ؛ 3|^~1a^%zKVsBS7{,C'}j-v*` RF9kOU`iN .Tr7]1yAYRN^;:tU域2[.G $|unB- /ZF?Nɯc<مi.X*Ì!A2&C+0?A͕fp4Pׄ/ߧFv&]^<,t=K.;Ț ]6%/Ȉ >9g^<w,kEk Z?jqTP$&3Ǣ7k̿(ޡc8%>aVTj@hckGX|:&4>gф"f+CkuwSD?  e/IWw#=%#x<<m' -w+;IQR -lKW^hEq><;i^MUx/PF/8Y@: }%3.wŦ\QvjOezH~Gu-P ur&MF>?Fy~MN^ّч#WN7vF(5a j |5 ݬX/ھJa^JTE X& d) ɶfc9'oX `VoKKc(Ȇ"Α F,;"YB \ߑ 37})nXl" WthYz%Վj'=;;,Wܭu3=$+|&ׇ/.zGؐ̄VN JP`>H"a) `﹦.e|] )`TՋW]S} r=ۓVuM'*Pޮ8$8g>Nd(N>pHDAqv֏Kw&$~敐lַ]8: }5KQ6{Gwsp3ϯɃ_Z Ҝ1xZKz-82'¹j̢t6/|YHg=^.hSG:$ژ!WtV#z;2O\@XyBQuEA4x6FN|k~Rz(_E?5 s E1=g doa{Arm]][wP^ gwҖ^rqҙL{5C!Qף\S.mCHȸ*Eu"M稑e3}Qm'y NlZ"cJ3JP'(v͒[z# O>(tʀkMR O9/shaI/*(8ѹIfF~|mmP{Oe:5eWy>uNh[W 6(lM%H6Jq%E.moF//-_~B|~Bm(θ%M"D.\jM֧Yx~|$j\znP"D`s8e{TT<+S/NT|L-o1Qw#(0_O_`6 )]@ 71PlZQR_׷$^ G/w4o_n@o E^@oM{W[cMBEu9$³4<>T_'uhKN:$" xeė-! %wL 쏔ܚ#RE޲3wPzXn˳Jh.8r٬GhOWΗ|Q !=1|^V$K/mb`|-}+ xTc2BSWdj"jbA0K:roǔQ'lw愄_|ARԅ{'?`K6zt7:>...^( =CgL<`-w |W" {n:ÃzέBn3峒Pt,wJ,8.^rg7Oi޳JA B?-+B=V*N8U)zzǥǯK_|:j):8MS?},H8>pI9^RcK諺Z#~~-ʌpT ˶ Tj* \(a-)4i uY"fv=zeS5sn Գ\>s䧏p@w̲amq0+Ҙ=" -%22[;:?(.楹 HLJ >V5C(~1G9Df {R(VPnShj "򡺡3M{~Ŗk/?e^ޚl4P,ay9w)>#O/'yo<'f} dʌC6CmR[kŬ c) QaTIo{J挓kUl dicröEx W%.`8#{*-OTs)0󥻠>'Ck!4ګs: ׇ&Qxv#&1u?@cO$p$Co^fȆJ8|nSh Zav9z耤eQ^_|f{_C*]IlHr>堬u:ìs*R"#)Td0u"~I뗗jpҩxu>KPm%CU,Fptfs~'|qL2(9&b=\[dƿ"UԠuX]ؿ*-_f) mqG:F>S=xE9=yj eoF[oh.梁K6=*QvڵFT_}HmVJsYEDݕUTzS(sN'+x0nBZ@RPgq1AfoެD4IU ݒI?į둫˒&J2ht)A3?YR R 5 П1$ʚ;8~Qk`@&6_ s0)\h]>>SZ1\d">N"n>7X<'WxCZ&?nӆ}[Syq+H -߼26POm|zPY)uc`X.~LhU iYaM.%aB$40]=EH!{'UjM#ZJ7I=[ 5GƜ*|Oﻫ{:aD+^8)4U[jbktPzFS&n4nG9.LKV9jHiXľ5 K*m!)E/!)o]cGYTۅj;3LRî'#}.K6(y\TdwsP5;%3ͽ@e*SdZZ}NƴSJRab|VڝYtKH5O7r7j!pn&W`*WtUROy8)Wf{3-yXԃ翼ܲk./kf1+9xiGLOvwX7|+~j=)>_Uf;&EMᄴ<Z^e)>PԦ]"@N1U5E0Pl-/J=U׽U5ʈsVBͥs2~b $[^MyY.R],adLdikudC6i͎SZL$:< z9~*f =/?-o{H%ꉻsSTgwHhڇ=h>܆fκ5,"{ͫ3F vH +ʼn/Mb^WNKqV5(P}o:enȥ>ZeE4Y(|E[E\f 8~P|!]HjOxM*U~`YzL<~ ,a[|ReKAwԧZT\,b6KO<ԓ ߭-GKNFe?Qު95-+^,~ɧ:U)nʿ?@e ħW°;4"XSOrS Dukǁ.3Oσ2!o/|qd;^>乵Ju^oy<.7കIt\qIa5{)%U? e|QZqn _Gǹ¤OvZ8ފ}mJKH7Uk %׈j@'v|e`OMbF!E?3+?D{3؉3jiGe+( 9>Ny,}se=#;?OK[ً2 -]I;#_orT Rx_(jC~jFΨ\}r Mj&RVZӟʰϫXjP;:/dR Kg N +̂!V3E?7%,K|!LJb9 BjrT*pPyO>/g`"t`7^afoPPbpx[by;m(r4.lŧ-qV.Kуdcx3 Br}~է$᩺{Gu9 ikwlB2. "J),\&r>H@b82jmgv<3$ yc|yCK#&j@0ڋ¯ͶeB zl]ʫxlPtap}쥎-bdy|OpL]"/I ;x4lr:JXOةSpĹpb+טČ?i5/ +) 8&B]qK= AϧU֣ U/o]=K.\1Y=x&Y'wȿ #E[yi 3'WLҹxȷHBvXvѶSw)lLK>`+:?d^îQѹgqCT۴?i[q|~WM9 #`R+{j7#hEc`@GrBHRUPr$X<99 qޝyf7Ӟ_}B-h>Ї__Ĵ5w3NΛE9|6Hpuol@ۙ+l^|%(Hэ鐿g8U~ "@/6DV倴kKӟPpH=hZߪe~1Kzqwn][ z2u6S?܂mKvfBEQ1HLJ}$#Fx.ykbH ?\v6.] srrN~2V)e4CҗзKnT"OFޏҏCS'_( uA]_EJ pֽS=bS΅0nEs"*segT竀m悫/o[>}=+boΜ]DuG Lj $j*ujLAV<9z>xCZ>MWϧ0!Y#V<2lHg/\9@f,: VT~V=#s^ Ud/#QICƾP Ks'0 #''Pq頉JIʱGyY/|fX&?$ӟݘՊsZqHtUB5Cr/gR];v FCTZg/ķHpRT!oTrEuªFtk`Dh|XȏDroս<r5}c.<\:Ȼλ߄=yvWb^?jɌwe',p£)^pD+x w eq|~o4tgf&l[ڊYjz'=%zO}x$ S`f{9pؽqqR%^2;˔*}# /U=+t"eKC|<ে"+jW'NI0v"N:Z%^æe>B3<^ѫV`(>?vPϮrc%$|6 G;.w/*ug8TU_>p^D\"]|y^S$DCfH7 u\(zeSXYbMkR[3s*3_+[צXi; ýI,f'3ӎ0s:x*ו8 KW' #a==^elw&']񻟂|UƄs : wʸ&sLѥlO_Ts2D w)dceYGYZ (W=0zebkW"mr4QP/?ME0fiH> ےYX͊&tV|{+*|*N 39צrUM-kM@z}4ҡ;,+/cݮBcĪ7w> <,a|cSW/ qs"b570ݷA\Vr!髏s #:(ϝsCi- ȏSm?W F[ %~ӐKH 䙫ҏh3vyח5ATqa+n[H7|[Khi;մ=l!>hf~-("5+e:L]jq+Ce#oE|軛S3QO]zAE>Non&VgD >4)z(։ qgڔ4wDƧ+|&Bi0l?,+<Qo0~hl~\^b$_'mbd.smGe;2.\΃Y7K31A'8Jn^D;w\'qΊo wH^}8p̾>%OvUq8a{7JP|7'UM:}2Jӿ?!!B2L{ Kr:5.1HYdգW@ʡYB\dǓ]_k5hPNFcV*1CaADғWmeu2H`5/AtS90N3al`# ӵ?[nԭ-ܣ?`pn$}୚3-~սC:⛪/Jn8CiT y) 5]cq7T17gBIuFq%}2/1`I볽d.Be:wI_MY̾: &TEAjߕm^nRS.rtw S Ȇ{ \"kZ[W$+1f#d}M1E"%|kb ̺>]fl/պ>QvYxŒ]LK_{\gx4";H :|a}/lHgvWY*~6-Hze򕇃F\Q9~[lO n12Gbx4Ř*#Tj-pbR.{@J#]C%2[1oHnHyk$Ǽ#zڨ?`٦5stj/Y;7GFgYT2lnݶp(GlJpCݍ2<eT''SgGJv̢!"KJEoY 7WT ԪV{Eړ NX]T]]Pr޻I~!OǮi{R͞>5/|얍ۭbc$BD<Ӥ#4O '~5K1?u+&Dv>| ?U濌;v6#*+3GOblF~q|$)ʸ| @"o'EJ0QZnW=塥y#NdCb MG,֧ƹYg$BFΊ\=NLKq*#:&maH[z.\. B^Kts*,q"`TeyԇjҨbnZ!7~ʄ`$74vB1g#$9l?)U'N_rQ,eLҪK Mܮ j%9[kDrHIF5' +λ-r(.'.fds,b";LVZ\ɮ= }otvyłpn꼐J5r_Ž1FsnknA3yGфD sάB~[`NfQQS-YG& 5|QGSo 3in?GfSUz'gAnJOw`>ѱvUwTJ}h{ě͞|zu9B;*+QIgHΖ(d޽FP[Izmdg)-0Y0+ڍݹhDWCB3<,35<"v6BjY8͛ȅ\s̗u68- >^E8?XZJia05;nV8AaƵjb˒bsFPzf,wX/q@JA^U6_Tg0k}m0:ӳ~CW˅qm t!1ϨU ]6%j?9֮i~?w}FlO}絫sRcv7kSo4 T ,#ZWgǩyCB+V B|xUodYߧrmw]}2AơG^B >OEX/KE# 96a /N=j= S?6yY]7 \QZ MbٺC∪f%N:^0gn DZ=e [PC{ YGY0xy_{~9k}bL Hfs!|+R~ HR_f%KOOVؼF*CaRo|.-ƷM]_^K;PB]@ݵ`0Y*y^Aݯ_O5n iBq,x;e>UhdH:g ~0]!7s b|КM3Nϱ̛(Q)v-sEmW{Y𧗞 u=Y4ɏ$WvM ͐-JX6t/}uһyVFMqBݤ]`mQ.JE^=6)ŵE^еވ,ZeM'[#jk-u_!1nXG7!9h1=ӏqJܙ߇)F3&r_*t_Q(.s,`d7iѹY6;s'V| Z%*xZ9*h"X w2d[86P=H9;I^S+ opv=O>yT lWŧNpC{OzR*K{<1֗2 >OWHs!Eěa^}eZ.S~/m誨HKV  H(ۃ&w׻(萝LnWUENR s.vpYa%g]ߪi] 6/ pzl宕A\(K>50{~?DH=歬qbɺuQVekjk(57]m_oOgvhWI˂G>IJ@|,Ј/kB.~4}cz(W}[:BSTF$8D||ҷQ\.< -M TL|0 )ΏRtl"vg"mDk:Aۛ]G8v%O}rLх¡G5߼mu,pxvNs#T@J}Q $.=f\%*yozB*7|"&{:b[]--V:1M:>cbϯ$ʬD3~sHl-ܒgZY"۰2!ޤqfl+JNP{?5m} M܎ YUm6kZ{fQ #KYo ÿux<@}eh%<M#jxC嚙,EV$hm*u&%,3y4Ke!l Eo Z *-K0r%n/ Q¥@}+PKƁ׍ڤ:G11fE'R}i1 \oFXRV}b`MzmQ^w Qn G|(c\)tJ_"P*}d=礬3m@8UwVOH58 H?^:)Փ 5%GV!"ۺ 4ݝ QXk[/=iT/Њsvv(F(*%ft/=qbee܈7%׀Я+ vb0jl&.b98E"o͔?F_7b\m (y p_22k d.?ُ_G͊1An[Mu/r,!lELh 3 6ҍdc wA P\#a©U!J ;mU 퐕>lLlCzxx\2In9l{rrEEvW[JaA;ekm:Q$`g Xe4 Z*hkCS9B6f[*x1&"0p4[6%h6Uyb>JLHlE%*o,NU @ g(J/[_[fklX.ybU: ~̓H32>|1eAR;-X6!FҜ\ M-OhSݵssF_-lߙ=}2=oُ;xuQ./1EB t3&R*|D 'T'#h-Ag~5S9A"FV5pW7<),! ;! ݝLsnp}܂ 3xd~/|(P`?ߨV"ݱ9&>.+wbu`x53g8F9$%< Ou%ˇ4"ԝ|b]z2^՗ٗ%Zc!Dr6SM'| Z6 .}@/Gkt >i3FѰkBP5eUKivU9LLoQY6ûΛ}Sgk! H4mSIvS;CB*#՟a"%Li#vTWw?Lk˜j9Ji`g$CRPŽcaF$daR kz,[}墣xeBb{?wh ݽ.H 'AWxXwvP⣲a0U,}7/%C$/x ~^-:tyNӗLv*sRl卵ilD7hv"4 !l*n{@-Nz{#*8y"V &psp.&= (=_R#nMX=9Br!o1'?Iy.sQؘ)/7Zx=ⱬ*3qr)!O¾oj{ iDtWtMT!V'He:w BD񩷶'jEHޚpCW1,h,WaOڛ2L\g(6ۖX"'݆vVU(o%}i@hBFx$;cPh(=#A Ag)Ǩn=owm>"#E'6 C;ڱ-Q.`wrq*}/} &Qu^ ~N [A'}J7Xm$]S%{8K*bT "Ev ڕr+2ϣ痎%F-&:U|Cfc ip.H;P *BG9>',ģ-{ۑij};, \V޳= [ZPLF_\7i6 eߛL%T眾,*DdG>e,v R*3х, 0sUZS];F}u,-odAO!h-ޠjɪWk"fѽHl/ p G&N'/Yxb"ޮ܃"Vs՝\qK>-u2AKvڇAaӳ]6V*0W:gl.03< qx :h5KDi0^bY* a)qXfֳ 6d O=$lQs&\auQvh)>E$1.ZΛk5v@.lejSGGl7#&d`Jbw]|+|"Ajɳr!_@3%auEoī^ .[d=xG0N=ydY&>Jbm!oW@E2 1Ƕ>zcjf a*o^w: b"ܠip[󒋸cmayh1TE9'27a- 1r"¾dH,SlW> 8Tݽ[x.Do^*l=No = Yi-AZ6 Xχ.]?v;6$Xubho!CwW :n {>\t<^)ꨄk=m;OY<%>j'f&P)$fV+Bz^Je9ս)&hG4"*o+~g5ΐ2:V(_2b誱:65}^ ;,8-,,TQ[I|&Y%E"5p"R'EE5m\!z d"nS@^cŃ.4%Un:01[/_ <\9.h^Zצ?Wb^Qm}ak#q=VNAҴ=-&Cn4%1sxW>iUAcg5;ܜX%vNq3k8æz𿵟o)jlNm뷌SEӣo[2YU@m_ZLyεh\}N@k&kr9NW3Z7X!JQC_i(œBWpt@L߷`ЇbH5y:J/2|g{? 7zMPM%6 \ndi )HF7*2QG[a.fR<r+fد'#dkսo+?X^zi{V}KX2/*Ӳ37Vݽ1a<ͪ,`ȎiBZ8{7^8W}Y(3 gFaU&:)FadvC}FTΪ1b6АF8=.m}I,SFb;v*4{D7]w-ONX[FR^=cn~\DE[yf Y (r!*| sS^ f39<".G~D 75`ĈarO|8M2e 2Ns !h#+N(xe۪PupjyV `8wCxmuPmO5 MՕG1_ x.v* XJE|c3֨z!Lyd5u d8o“ut4?]<E] Qr9ߋF,;@N-OJn X-RXP+X;JRJDZ -4;:jCS-7y[5YfgyO6ۊrM={'՘΁<#=~S^J-?udw2oBWJMp9$y^hͧ\[off=E\aԨJs6yVD2De(\Uf.'g$3 :>*\l?E2L(:(tR&VWxW-o}f# [+l%|(cޫ/KAQ;B(Vfms C&Ќut阔 `noUҳmb^g*]@ql#4`ZMUKD^l/;E^}l}⌗ *C\:x9v^1DnNNpɑ?Qu7.RV|B!y&ц2ɾ 7c}| D4ϖ*YX"HhH?cpr^iJ{G^v 3QVb#G~85c\[ MIyt%vBd莧4u_ 2"G}ɢ4ًFTKmmZ-(^y K͙mԼ"қ!A]486ƽQ0s$'w4~/yyNm̯"ؽY ڵ|sru@V;@6M$IY.=k&3~!am`+nh%L\mv3VN}K #>/3tw{h[2X'Y[|n5hr6Z-F~ ) D}2#͠{%zCi!7E'RPz/K~d[Kb2h H|D EдcO/ wP,ep9x!-B qKkqLjC32w3)̝mқm.epBޯ6A\13`ޞ@,v!" 1C Hn7 i ddd!`Y5lf]oFYYJ=䊁#V[)D?EЃId[ԋ! $A=:gh"8k@&bBS S i x4;jAo6k%_LX쿨ޕZl+t O֓z!52Wմs" j@]:XӪp qEx yXU_N@lJUBUJi .1%Mm7RtPuHLS -UP=ScԀ891 uDK.˵Vr/hj']M {P#恤=>< 7??f땗iz?:k&5ȑVaHngrxbPӟϷS?] F(mYKV\wF6T93b]yސ-|! A YIsۙ 9ߓZ&FuPeD9SA" ~D_WXa/Gi P8CE`LuE7~BG{ 2v@h_IO&_I!žCٶ Țb£10301*[dE chcIRD"TB=^V*˴iN}yo=O}}s3r:?B]T_nMn+J+ĂBe.W^ *fVgI ;%_՘}oҹZ)hgʸU.˽^)`qVboU.y,LF?k=:qcl!3–g=ɮ~{)9I铼5I*}Kݕ= E:n(h =~S|$tq#=NiU,eoЯudJF ~$6rT}Ne"{Jp+#N%yC8-RДEqQ}Nf9]Fg\x+K:ݚ (\AS ?dl9,Ǻu..u@PemG37C*X7 N'~/G#b]q W6 zl5̑D}@dkL#CC8 J4]whF3> ;3H8 JU?y=@MPUM* >T(Za}/&KIJUH6PUUG(|)X/yB~1]I^DB`п]%r J؁@ ?%o$B Y>?7"7RMA|"QHeDkh5?c9=LGh5m \O7WRȠP37W;R0^xAAj\D\P@8@8@8@8@8@8@8@8@8@8@8@8c7=pn0*LS}DakZXH#crf'wZ2v.sWeZø S2W\j72߂ó&,N9OOu5ԳauÐd_ń5ؕ>+=F|¨!q\+@/Q@PD(_g=V0 23,aέTlh#)L->&1`'BW [YZ[x츞M5p3\yVqU56力bQbx^"d\ЌSZit.[P.|ֹ4a80KV+&Bsۃ6t;%r88iP/4!3[ y:.UQx0B^TS/O`n#~F16D2hC-dFJ|N ͐fo5gv|an$@N:1#l;Wܣ Qs WK;֍G K"iOC=vԬ3,!Bx cCj~D:DF%A`mz<t't ɝvƄݿt'ϽwlW Գ9!y)3_#"j:N掟]djsZWs ihF9[D`0T20%xKanM 8<0;kXf;ÓbC}0G[?Wc=#kR?#݂J~F s.H'B/Hx[觼%[6 fbwAtFQ"&!CpY2w_X-Xw좋p)9qt/@G.b./42+/ܳ6sk3s#uX 37tHmn_kdߞڏ]tCV)|肨̐)O>V aTbר+6^5l`Wv`SB۬fjL&swlIhE|QHĵs'5Uyvi6GJߊ*VR'|,YXݛlZY opEU~0zTShlWpXgH[ #r8Vx^mxOT\6h yA5!~ToPS$/VxhHe\Lq[MhdTd`3vjՓ@oPR^\Ë"`eV3 (Smx1b /`gt 5h`liiPfeA=OV W~*gRַPuƜyՊGd_d:!\!F~dw]+6i~+1-5=j33`Ӕڤ A˦~H̀ڿ4R =i;~ܒ8]tTcה-ri@9[.[yv?\}I6".M|&.KNu ړ/.?>?9ߐ}m&:Mym\P}bDCxVدrR$ β[K_7m'tq QNЬ 4IWv?.A)q;2tK驵òcB2 mAj 1/tK ]Y]~.$2Xrv'w(0(SFi[,\xA.Gq ]pɣu@s׊kʼn`F-ϋZ]5_J<'sVV'Ot<4Vi1awf{{2=gRϔ3v-#O۬{=z\R.dL9LYN;mѿW 2|Qқɺ}"(b*O/wM鹤r8X}ka TԒy,I鞪b\z*.KSZ[eƬ;z|S;5RVK_CK?,MTA4˟g}x[\%@쐸[ 7q#$,X$HVYzEoe7*lě7yk+f/!,KA3CM<޷u?{SV ˒YyaWKo'$}4HWw5)B]ːU(q~m1x2Ka̳(6q֍wlA݇hL os}9kow_p e{JMBcS`GjZR O . MCW6> n?oD!o4eQ19օo V{jqwDkzsC}bˊ. n_1و3]fc[mފGMuW=y\ d>| &yfk)CUp.0nޜV+8Rb \˒aOy_~z}G})-|:mZ/knwVy̾fm#?<,r{Lԭw5<;UbʴwBxT_Y;4#Y:[S[-}n\͠i ;WDsQb=\<,!c+JIJ|%=XTjZ8C-2"CݥS kNBI14x҅x]1QI+7]:Q(X~*\I]$5^t-R2)a|ɏ>6tVs3퓎oڤ>?88Y#װ(+61v(nƐvC|ml/׶b5z߲EX?r8E/*Wc;}߱ma[M۶m۶;mۍ7m'?sϜ^{k;;6nR{U8#g}QzFW#Ô>>:r9"W '{m~""ZkHZfWô{5cOR/=^V߼abUbl !A |YֿiQ0AW-`2ŕ o,V2ŋ ˣźŎr?hn ~;J^X8`WM,='5+P)R-Zo#S` g~r罂U@UYgdb3捵:7|qH73}X $-.]tO(]C.dyN(L k .${cg+]];k\RمO2td8@BL\]}ژ5 Җ_ҿ M+R Ω*0¿ܲ/4`hCgxp^5\MG;*^oݥjQ_S&H;?t'm5ΘsZ?:6󵫾\=PMqo4㭯W})p0#S m,O#jBS r߆FT6Vhg ݏk]WDQhrԢQH tt7v9 Σ@/t*kyqԫ :-å[B_8:7=U.3M:"#O[l]/g€/ױ(Rha8DCRL;DHH3Qem+՛^ ܿQ :=0hM/eNc%~^@ޖ/=ϳ \D;>TvۻsC/ Bڿ͐TZ1TWS'ptq,BW봸l^1/M}uL:`7I-jF } dʒ.PȐ%SLc;{j;%shbO\Y[t#Kض SX ANM8P_26 Ɂ4UQ56W0 ;Ć< TT㦬MCXC'^jIZ HrXެAigY~ŽSuͮ zS,^h_.s-J]׾$&bUkU;lrh?Cɽ ]lSz# Wm}\JU/:];~ b"<[M4Ԣ@ƮlmjE=1r e^ЇQf.O"bWj*y7`%J y&Ǘ5;m:D+X 9hnYB8}Tc^UVȔ#(Q¤WUtAX*x^Kj}xN6I`",h#  n`(κ9|KACP'hdlA[b{V!nR"bi7Q?]ݹSM?OQy>C-9[t|VڰqqFRL#TvRmu5?>m6k-JN1 #8"h҅Tf)K\?|~rt:UY0zˁjVE? Dn b CܑkwSc%❻%o|(QFr_.g8=nKU** bh f~xbz`IO$%^_fCEcÛMxd x*៫q1ByקS=W;K2rdhHU^r0AUOCaHA~*s:q%D\!|~bU@"f1\K*5s.NЊ%vʚ>sn)>GW/z{ d*=Q:/8_I_dgX\I9qłU#-i`F׽8 e+0a gѿ[e)v[)y"~i5%(˭Oi'w &ˁ ADA\Eoה FkXV݀u}4Q8iAGTC>ڜsͅ@^q=۸NM;-P7\Xm;O'_pL5*M 䓙j Q^=XUzM׷C8gne1;埮[I8 :cxF^!iѻ 5.TؐSS*32c؊sG"A8HHWN:>,_tP>˪oUhtE|ukgS_\RGJy1<ypMVu35QbEp$m–m&#K8{qe-sYihRGWytH)냐(\f &+ZkH!q t牕UasT .Xsi+F5LaU2JKUuc+ 2ы rʴ/sD)fRlϓ~q6yS1ڑR!R:~2?}v)s ?cvp7\ GX/X=~6DoD/Ԓ3ڃyXfd4¡qv×6eYVR'GG QIaab6[HuL:߳Am3 l͘; - €{c s=ZY03J>jO eKn߫?ە~o6js;Z*Cv//ˊtr`̳\^&*6ϝC DB`x{rGbV[ɽ$ K+Z/x899pufrn=.sRhPI`*s.Uf-k>w( jgmI:p^\O0[zܸ; 0Vw)zr&p##j Rd(0w^BhdRB`lcCŞ/4[}|ÎAW컾ip4zl{TV-gRTԭNN'~ZhAYْ HAg]@c[ Tz2+v_|R ]1ץ6/@Y6\:ݰ0qm?}װ܁ w~]{zih6"8NO A0]u]b,=7{l>xje1߽OQA͆ϮHb a S(#z€p8{ }I+М`z\z;FUn3 |<ϘP XN9) G(;)P}l{EE_HؑλNq8#\R?}so';\`{DZ3_PQ) :1QhNF}&!7u882RL_ε)N9Q PH& RV0 tV-e 3_|=LS\\oyu@vUUҘ3dg=Dt̆c6Dm\}izf*&(5ct`Z39hDVCYlc=>Nۺ` FiRv Ǯ9tF(~DO0u#r4N8;"6s4 j$&wGpZW!ٓ-~bquH`fr,W ,%F/ŵ ɒ8[ zzow;iz=u^~jXFagU-cC_ V1}6NYXWOpYf>*ϸS8fs<$ŞEqȌʕE"ZA~ao ߕx=86 #p1L&Vv[[,0fB H;V-t$G;#l̋>Ay#n Ƹ=c_3Vvv}:_Ә2e|\]_'.&r*#2g|}b *x8ț,Ls#c\bXo.P@αf~ˁRyfÖ+ wjJߎi/~lprA o, i׎3IOOøG{$ KHs([ߜL[ׁAO6/[慿6em q/ >/94IŰ> +csG7|7 L4Կ(0MWĊMmph{}  $B&sQ7!4/`pqw@swYDDjxxk<(8Dx^dX֫\F܋no:uU@O {s hp3ЇO"롮;(AٟH)QΐY.wlW( 켅TL(=ۧGr0\7>Q1T.f N%|yIH\NQe9(aL=?;9*-]/e6j j; (eW )A萕6dD1FDpun]ғ./POdS {XsGQ*xbC Jb_hAYcitkk~X*I lFK{'Ox)l CIW$wHg2 }6cnrΡ5VoJU|dk:sXwSrNxžnZJȳ!'5D`FP5u nh*x(+[r,5s >ZDomzAc'C`FC Ͱi]#3s ě@ `AlǠoP!Wrʽդx?G# z1q"V3(BM4j>{([ 92$/#VB'*i]^Jz 8#xNN W(.~_!eΠrb(ݹz-2CEhup;넵{$pY4*) -,Ո 2̎~̰gfLAc21WĐE5j2mgLsа3.} 27`Rf&4wwb1DmJIQH 9;cDT/oo&+!lQ Ʊ>Aϭ+ϻϳ>KV}K/ꊡE|?ށeDC[?.6 ~CFeB/_Z%xd^|~hz:oaUϣhQqT N3A9{kr :~SkPK*)'P;Ǜ\(XhuV C6v U`AY +Fk [e@,HvrxLqIOK8˥v{Jnb| 61Ms~7'?55{A9w>ZF?:a>Vj1[]hw*?-rIpRY)М @(?UvJ]mP|jQ3;֚jlםyy/vWe!+}a` ǩbp SZ8cΪF0 \V9c 伜3=㲶~"*`HZֶ*ִ )c_ZgʐyU@"++J^O"StˏGuF%*isxP(,m*87u8mp F, Ikߋ@yR U<ؓr ";snb<׼BZjKkxpkl"nK1am%jb˫Ga:'j3Ud6yd bŐQ\T tY3$$,QnRoÝ v{_%70C>LT]! 2_$_$2^D^3Ԗ@Jkb]s!B W~'u5{N>#E6읛<]7 ,H1` `aM`\i3+@ɜ{T-;ARN=fisjJжS ,>V1qGrJk/h#\ؑ=RJ-lWjČv߬.}#a3 ; UtVKVesoX(+KTeM7-r8w]S O]C3 tƛO5T3QeqxDF#ͽ=7vl۫X1"E*MƱ-NցV1\/ Sű N&,tm|\s= ѮfSL,'DDi$RIŵ?[c8A P QǺD'ZN00+[fn57Ibp{-Z-X`6PK1^kJr:3YWj& `! B ,#Vh1 ӞMPJ!Ņh؞`?ZD):3U3OzJ﹝yVl?Mkk8xoA,(uI. P'Mx vy mWYsSWÉN9,PJ0|]P<,PS9\yk8Z(=rir>cDi$MRz:ӗmT O9e7` 蓛"B*l,b/HJPjccncL|hK_ꮷJb ZwȂ-KfYJZ 4}F}{j'@B,霋!֯}nax8̙#I._WNnRдˈ_6}Vx@oܤzy9TS~nUjXw] a7'XEKf>i\M05'^ 7͂S зys(V{KqvC8#1$Z݁WUqr!0<`eƟ֦y ){^USL&PJ9r0,ʨa^Ao:y;Ϩhn?7rn#cH+t0 C#"WdA1v>0}@i*`F"=Hyf?hR\(+{K83\;qCdS9P-̢ih+*&D|9] ]kްVjx fDPӇZiVҌ]8֦kpiHqN0 {XɶEnAKQB[ %gbCe$dR  ,),dKZnՎtۄeCA+JfNfI2ۣ3KŠjVm/Eę],!`:uFy;ֳ!2EKa/S{R:=؈!ՅUMQ&|SE0L<]VC<"$m#")j(RD6MȹYV'<,=lm|u Uҍn*Z`,LA`VQKr$vPXZN|u& uLAx@KUFʊf1P\NeCtb1n"4$XMKRFD،,OBV+lޛm/ 9 # B(x{1#o6kҮ0m(oTT3 g\.-ک䣑YU2ڂ}$$kS-.m[38LRn$:@i aU(yX^yHY 0Si0(@(\sbD=5/`Nui"{\>hؙ4JSr}=l1D<0aDi\^_?UFKSha<[1XTc"|L4IMz{ >ԍ5u]ks|f}fPZQ"Xuxְ)E5Ԓ"UW%`@MǠâV10ƬCCY%QT^MsBf,ZfNQPyjϞ{@7}jqM´UhX#tzw'Monw&2h"u"NQPAֵZ)6viH{^ ]5r@A=Mi^ti QUUS}Qh)C5Ssg籉՝)mZv@is\%M3[1tUfF좐LA =s:/1KM$O9觓MMLq-Q[*kwO*AcY_NZļટ5q1>tdV͋:kʟ]ݏsnծ4Pޤ#"*UWMteMa›9prvukCq}Es(GPHa$)k}9X9wTP({ZR=_()#,gNhؐ}k`YʊקicDǯ?o=ȦWM:iɜ$œtia\t~jJz/zk~B7ӆ\di qۧ]CV^϶1ֈeAsrbo"@˛-7',T4 EdAR<\a'N-yss}xYE1`"2Z}iأ/67\,;¹8 WǡAVVVQcJQsÛvjtoN/)RqRYcХ=+PUL~i[:d4` }??blllj"3 +]ymRcGn]?X3LICH8 HE`Z6F Nhx#Yw.m+Ǥ)Cs#I{ned$?{gan08,sw4ӛC+TM7$1/Dug\i:0n  'ZU  NMMm<؉Wd\b0upvF]hيX=v?eC2w.J>ܳbWKݛ~ۉ|z鍉v{g9L &?˕c$ hf甧}U 7Ѝ5LcaYޓgRBSsq| lcym-ŋL(Ra1霾|C2 aā[%5t(t^\t-MVu +J!NrζX KT8Q-92rxpz%8\wAhQ&/}?V?n~ƪ~:;#x'rJ 2`mvmŵ2%7M$఻ǫ\)$8',aYXׯ$2r!ԅeB[~2+Hm/b$)YD+Ȅ_$oa*E[tteNynpe9˔UNUCW`9'5Z;[ ctK~br#.Jg&S MT,[硌><_&oh>qDZd͎YxWpv,cBq[ZqWsD1v?,Wyq߬KX'9W-o#͸CB1.TùtuAHi O1J??6z6z6潟@P!Ml͟4QtKk$J&hmQyiGbDPo{%ф)vĐN^e*8W!xpc^kcُS?Bw-R#W<؋t ȜoFΚL;Q' VDD4f i A&HNSXTbq6]s-)P0ZnjKۙc竷g'^w_b*aN9y DO,GH1IaS #?, :ºt 3Hӊ5Ӱ9GiWĎxOQa,d_7#(b-!H$v+hŢ0=gNLa@|xKrNV6~fYΟsq =J8: $R_qFfm:"o ~ Gy^j3k?jl)K 71^1NH {u* !J}|.өP0%r4ʾ :@Tǁ=+Lrazjڥu5Gv+~M+qKnKu;;!qI#O=F=Z&F? QGyr.UU|$bDBRMd [ 19$L%+cnw6{:44E 8^5wB!]|[AAhԒb~ ;RN& #%"iӃ}R0p=^{R \D骾Rɥ;jtJKݛHVKL*$Q;8(+fӌc>I%5l8gɑ-x~K5q &Gvno7|j& WnBG )]ktҪ E7)%m$%S!G-=5U6|vvӜCM#Lj `["zM`Cv;͜PaeH3@~bwTp|Z#9R7^m܉€//qVB}0Nx"D8 :/F,vMtz><+TKfsu[RnY >֨/v_ac[eeR2#)-gPlA/hSh,'}O$2UH" CMaW_aLR6Z ת E* R%s# .ג"IIgUE 튳6|KR70ᶃ` 5)ŏn͢!Hp#IaZQ:$s܄D_?M"'v){WР8b+ WKǛ"]m?;?Ih/ P쐫8E+̦x)XօJC%Ʉ`TNKVVtx1'Z֑<H"ò~#L sALPQ!e7oN;Z =It}jcSlOǓ ' @FeAC,gsq!e,ȬH2[AP-9`˺(ȕqMH˶hٗ&7[h{B.qک-~kRrJWK7/4[_}l>ۢÇg%AF3Mj#~e+SlkyA i5FMp_ !#_{(:j\:MX$ɀ܆&e$>:qQH.%7\BVR,-/ϼ|܇d\rJ>reQ{u ̕{lIn jKG%f2s0P#m-<,v]8&C`3sr\ؤh>d,3]m@Y T0mwGpbDȦUk( N|F:?8`kr6te}QH`y}^0WGsC5+sN=*PI~Q Ԑ)좻LWZORB^PwɢN:9 e@-W tO+*!RGѾI *9: Vpd#+Ų) La Jn(X! JbǣZRȡ\c`/r|F!ژ UMs;֫ԣE;W!끃xK?q&7yş۳,pK[Ϻreǭ?̎s1Q"mzp@%}+c9Shjګ^cYg"~+#%BlN]F%Kit]"ugܼ= JS}-Qīׯh|T$'Fy9bt[wg*{TgH|J;<-(s0Vp:ڳٹ:? __?vY%*grl8F%f1t96<vSJM)̥@ΈaElZ(ä\ C)!>+N#ŀ;=='Ε͍1enܫ^qނk Mك}RKrt60uBt׶/rcmȹ\qvhtsO~%C59q,S 8x`$C`M\rҟa# )ޭ'8ǂ/Tak^HtX)Yn>'{vϒYK:~] 9͏Mc<LWO)Ӥ)#tTOuuW}#`<ތ릠מS8e&_I}X5 ٲ*ezP#Ƶ"d 1fD-++ggkWP4KȆr車!d9(e`j; G=4ix\N+Wn Cf0ip$8 /s>2htҕh(]:kVB.E8m s nEdk7JsfUGasًأ.&ΘlAj?4nԡNB<}oT %ƌ#I~~J|TFyG 4|쐳L4-B餎/nuCS04䗌6/*pՒ@a U^tmG ٘ .=ŭ9x>ȐwbM%ƥLXiQ:xT=ߟ X81Ƈ*t"S*sRld$ލZtΫ6’f+#_1iQS$Y<(yRe4[Yjڋ1' 0 DV[^k3>1@lhjRPtK+M;!N^Uok*'8]X3&^^@U3aȿ7,il/@5ĤU<=E:,Ġ8DFAiHWr*nh=I^MlV#[.QwD*ALTIhOnϨ\q3u:k8 wc^[6Gc~l_`$X _VgY^Ǎ- bE9g*ڡ4p?ݟ&_Q50ޥ՜|+ຢbBot[SXV.cKdĈS<Ȕ9%Lzӟ?#VY8ga Ur O6Sr83h/V>U/gbo }uOE~gnj"2],? {іHO1piwу5?`n{}9**{J7_IG^yQ ' JZ4ҞS>YGPNj p!sp' 7gܵq# Xb2h,B5, +1..&o?.,m~ PLF.,҅&i7ʂh"&^AvVTBWQ/g~ |s^4Fh6R[V`k;5 V_$YH4U`fb]V):<l*,٬pɫ{A 8̅2'ܶG6掤$j6Y0)X_SKࣩЃ}mx>edSOcU!xXLw 5f >ˤf@c[{4f!#?>eBRRCLh|*dg0/8H2}h)"\/?4|ω<בdn3XŻTEX[֟EAhBaͫc6 Egjk?~zMʖ, o^1SՅY^ N޸z&,~$PAlhM?n3aG37+ O4 79ۇ~|Ȟ`}ݜhZ]e^3;ͧtw#'~И{ "vݵK2ҢP5G["P2{TU>"#<Q 0 =efuJSL#Coo_Yd@-/ʨ &AN=&v*@p0w9 8!\WU萡(D(S|}2%cBh-Cu=<1I+7{u )<͔e^;@ g')^I3lA-?X+!*;&ݲMaiX7ZEΪ:e;()L^0iT"2"ȿrRWimw&so4+109(M:B-kU=; >$񉛞rpwk$8>>Xpa]hϷm19w #*`W?N`*S90Şû?ݺ5;&sDMoFWHK.Dْ1@I&Ȳrs 0H_|.n%>UY5>=h2*1 ψ6UC5j6X׮=bJse 2Y Z $$x' ,1zԝ;>l )&u}6E.aX9&Nw!^ka~7/ 3'>(ͼ!q_e3}-5/%iVPShz_Yoz#eI"{]yXv JnjȻ`ߩ^y[۵ R:4c޶bmȜwvrOk뺽.:?ixW,=pY! y DA2rsPYQEGg_i4/>5Wd'"ϣe(Tf߯k&8)^q*wM/?P \iEk~`!n><>^?IY&f̝Hd|pY%V(.т)/K'Ȭ6R7Ҙ Yɵz)ME7@`NI[GX/cNF餖Cna0^9gԬQ[?Bcb(Ht%WNB}jEvkݙyK(hts~/U!Vl'lwDTܐ١:Tk&6;uAuh sf`3/𗾟A5q"F Ţف-=BM?u4S~f$@*RiAI#a[i;&(в.ځB-Ex5bSBqijW̥Tɉ cuGJCH`O4oAc^E,@3R)1"Ҭ& ā<7L=q0 `‘2fK^/O:L9upK +ۖopDh{9s=:9}< Uk`)i/~L8򨎚yD}u>L [ȀlOFO$h5#霰 etq@$.mJ m71-_öSOLSۣ~3S^{ oSJl6 -=|OwovSS^R0I>iڂ^ d$0`0ӏ \r)&r (,!(Еh 4r#H$He0e6 ?Ƚ=^3@SndjMN&a -^ZjLj@0:sOp:۞_GW溅705.%ӊ]r栨I }]D]I SJt3bˬ@e+TCY4,'a]jp#Q CaE7ځ";V.~l!OWy N ui.Ei\"KM>AĪ:Yb;m{$yR֫a)ˣ ˫(2-^. E֍cVRvů SʑBq9,DO@y"il0 +;;mlp5otS TX#!ȅy5|"S׌9{`EGIPKL,=d|K*MD!r[^r?NƊJ[b)E_,4(CRFGc](_\V"Il4KwprX/9j16 _ iY_I^y _cP ZZ]}HQscHTDBk($bfgo>/Q ;N%(;ЙN5'.|A; as8GN:ږDaA;T WLُYk(dS7:pN$|C,O9QP c-ZU2Dr ܾ l:7sn ^*` ` MJB{(^`M;Up.22YG&֊l_J (n C&uSAogf:4\>Ɛ|x_gǧ>BY뉄-g\-nȆbN뙿V|fʔI0MWfͮ9o٣[ FyʉDa❆fdo)Yg[XBbF~C{֏9o -N߇}#U5P1{#:` k}x<@F:fw_KܶGt^|?ga9{!rt>5=\JQ2KEF^̡Xj3KD6 g+|2؋=o<4+Κt=߁ztZX@RnfaR$Tە a6V\!|/=r/P2ZO BJxGb]doQ{>ж;LgBN#O!':Y0*ѷQ]E1twas^C_hqZ^YO-DO:"i=[CȔE?0k~~#D: aJ-ť.:F Tl~^~KG=ͬC.S)SE(287p%|ڧĽaaQGtr֋BouM&713|aijw8("ƿKiβG%3V C 䌝h;5 8W/55wzvܞmǓnz>/PAjB:ɼ:UQ&(\dU 193\&Q[ ]~S},iiްx7Py,z^ H՛w VG1Fnv[ѼkWn/GzFf&(|o/ngnH7I]&~0ܚO*VX$q}$2th%r==FR:o~  }GY$){[S>Lr)Z<[ŏn27ETvƷ>YAƚqM.\_'8Z%#͉t;픕mllqO˰5CO{IJr;[F35ܸ*}#Pzi KYKS7:m$9BbpBZGK\ 81byeBCԐZU8[FDK`-GRXPt'hϺYFHGNݍ+ oO$'P.:_w?Eydr(VriĜ6 Ɖu/1A B>njÏvc߾d#\I&<ǹm+6Y\d>FѾ6o($DQŷ{ 0( @"*V^zy9OޮGvW[I 6du⯽dk 8b3洊ndǍAnD0\okVمS`++Q7+I@J@Eohʆ(fRaVn FDsNo#pe>fqxidR.Hk`ao{a_aEjUnf/ڕ.19x<[Q%&_r6$LJ ĀHo-#R2 pjhU6 x5HO{awuv7:_:lGk$77[- QL-{6V\W7l؇EU7i6[<=J!0kI(I7e|.zl) nڴY۹F b̺GP|uy<^nMee̙t/ c%ɬ>H>ug}R@-O-Ba^ XJ6Nw*xgȽ.+q|c (`'AnhY?!N{" '($ R*nBUe ɓ{6?)W[G)ºqz|fVs篶ʊU8U^Rd7c ; j Ss:h`<&xf%ϩWd#d\s9z77|W LSC7YqWY!g͡Sx5mP!q2zY!ۧr{>I` X1Ce 5O*Xd>W*h:˳,2P)FrFvV՟U"f)OKVT`zm ;T"yZgNFIzX)Z,Z(sbO$OQsnhyLhāq*ʠ\bԙPnX, 񸣃W?'X#3.|ğK-5}+m*jE,MIJA}(?qb!'[9918Ec}Om/DԠkX< %ؿ=r9@@.ܙ 2 Z6n7d+yr=7i#jJ21zGth!*WlDYeYor.l#P_&.u _L!}\_3.UxYFgZL^BE'oE{#|5sҞ_qY%;]LUOA11H[}[- #)$jߟl-%jQuߍgo}鵐;9w읝!D7xٗ/9&f8q3 IS!ؕsdqkC::Gt'?!39:,q)G>XYz LH]Gy3"r.0Zs잝k}U ރP 7r;ʴ|DJ9I,؇f0T֎olj4c;|l?gIgH-b9V3|VcQh]|R\x4翭U$ ԺEG)eaT*k*:-IQB;_&")frTUtfry7喝5",P'\n)"wY˳ڭBt9-3#6MHum>rAaVA+a(`F{~积w$2[q40 PKpm k;܍s7FkM]4MF*Y$X*#M*ȟ_ ]qZPQ-$yHV`['@aSScZr?e% 9 ъ_NDbuȮ1GdAl.tJK K1gF2C/nN٩? $͚ Sxuk2@WYSKW6Q,=bAVH&/wѷ||2-bE~NeӸVkTtQYDC'(<zF+qg13D h ɸl?谮P@?Mqp೤\^/"fRh4#8JFguiSq\yNvk$ m (j6Sh!S$/2{ٮ +zu>ޜOz݃-$ (J"2vp$w5d~.@>{=tF>⫱s;WGشؖi3 K)j0)"  3\9ʭ~ }>]=gI򒡢mڿMW="*\?T+rt(؁^4C>YQTaStZV~Y&bmӟGE+?\!g5q)J[92tD~yk,!E$o1Edn`^PËzz֤ty®"gU-NPE?{Gw{tk vuR|\$apU)Te.u 4pɔX_x!e|TN'2_QVJz'M@ PM2D'"ϙ'sf~1R H3>dKR~7$FM:aT& S#7i:sڧk?0t**`Jؿ9N(.zMV1SrOV ya!!^]L1('!J^d5X϶7 p\K hJVϐVЍ~_Yt*UbaP..2}yv"qjXys3=]1h&8C)1ozn` ,`'{zRxgc%Yp^.؁udt=˴vT Bh֛Eݙ|}ש=J'^"]ӣs&%V|SR\zKQNe~VPCÀN1prz,Ns l2 8Oh0%P뚡4O{B;:)Eƿ[dְEG8LO@ b9M]Ց"GS N3cvsڛCj B.ch: M?җ)P!M{[a뢔Cmd&nA%8 F3_ݟC pNTevPX":"(;\UosЖF˳d$,Խ-H82z9"ƽsiJ'NojD\kOX9Yy,Hկ42t %.wH k:Sud HLA83:yIxDrû_}qW _7qIcnOœhO(aW7eFZ ҫ(0ݞqN-Aerr<+`JM̐)[L9)J/nPSo8>ජnm4L1옙1f13333%cffd&c;nuowOM)ёދg RnWC2̥\]e mss-2Ɠ* |pId;g6,E'ghRHGnttJChriݧ1,T~wCre)̴ D_s[}glIΤ쎀M悗=@ً 0aBѱ5bƢ/0+0[١ayE0nF'ub&|8aj+ v ILTQ$L \p-7aũ 0Mg3~GSꂨ3'2Z" QJ qyW/ z]h:4ݛ A$ZIC՜}/aU(nmmA#~' wdQ10菤^ ̿P(cbxNK,YOMU^=Pr>uO/4P6N9v^ M.)1V=?0zBdR[G^#d*-|&S,Y(DCĄRdAO3ۼ T (#:XREQ }Jğ?fiSKCxc ]mtE%%'WJi=;:PqL| 2ֳMOUMk*>+Yiq±GѓQX'.BĴL Z 4@?nG>ZskQ -2&YռbhJlh Ͼ᳎V$O=ooǾkdViũOR+|u֒;;B,mmb,_EFLΫ5S!0Hlؼ  Jӱ./"ې|&HM*vdA~]|#T1r.5$0w-" Oi pD/Zրhhnw 0;!'HG_z{ǯT@@mO=aՂ/u%g7ǝ3rGMySΟQf\͞D"V-a>4O.'aN;oW2!ۡO*&)-{TǸk}*F ʋ|s>ϵZfh(;3_T/0U,02Ge*m>[Gj@v"4e5\({yd+7!Ml&9M#K+ZO i$mGy=Lcx%"Evf#j減^mVhoA0备>2t%J=$$-btFfrea7aGT\`z-' Yt`$g^዇] i] #$.TQL?>>Oa"Mc[f0,.?<>ή:/We~r[Q$,{@Q"aNJ)9@C Ѳo'YY=aTǼh˺8-BA:OiIn1ۙ‹`Sqy3^ K2Ҝ7Xg@oy&[vY(jyED^gw:&ok!R]߀ly,B0ȩ̲_hFAm2bnh~VomC!881337/={ x("w |B*P~}x%;ڨ\Y . nⰎ $w);BW>z \&Z͞Kkg뚪=R>)8j;t1 쌺3M | qJ|;ۊбZq DU #WX| @8`ؑVaSQ~8l]l Sp-QP{HlQIlO-+Xܚluj?,ΓR:y͍Qv|U5Z`đQȳ y1ZzHˡT4KiN8.N ["S\)̹`r$+cqXbGc ?'/rO<.w CxNODu~Sb RL:q嘵tÎϵw`9U#\V@G50lDϒ +c&Srk,VsA%6x&K/ ew*|Ft#gt 鄸 Z*B̄7:FqkߞtPEwl&[( F mr퓷3١viOٌ,%xm~s]pLd&Vx P3M{d$COJU;q{ا{s)I;>KJ*w'`J٤NK換G'"X PhTY4ip" 0_?_C ֻ.7jyj&*h &%][R9@^p,7ghPkLPEb8#Mrգev2Jv]vyRs)"іhz%>.Bϳ4[861ƎmiLEc %rÜ3;E^}p5~]U:,xU"L/N>$C!ty6wQĥ"؏{+lʉzݯ|z&3ao_fN1*>ԴLIyvxz) r\~y)ahI^WX`|4yDz"]޷;20 {=7t>ImŜD'8II+Tr>"p k_PO4K >OcofbWa$bBJQ<rRwC>s{a6'M__4PFdDZj+Iɕm`9sn^1W&tRZ@ G $A}*Ƹ'*voq&OȢG7gG ^0 .0/dY^i 6PG+ x1L%ƥn3IW"He-?$ɔI$ M &D🚷E&F7['`tmpܾnyC2~lϭh *rOhx>ȗL"YR;؏id/(p|px5쎞.ŏ75SulћQ{Sc)s1s@CMr5Dw׏#C{,?ez{((As~-#,k9_š] 2nLA{&ҰG:tkZÞ;Y#yc32X)S_~!`rH( /~@ܩ[SXޥ)~-9ڸsASAI8wb6 4؁ ik*vIiivf:~:"|R Fb犀f@ ҠSm8O<,0ZT"~Gsysn/?n rh'(6֖ fm1ǀЀ-˹w_iΪM}VЦDz. KOb"1H0N[3}QJA*N-^%z}U}C $ MS+hSCX&|9vE10 b|į' 6\C!H!"mlg˵k^.1Գ%5 ]//D*x2QjGKRn01lgs ]MH$FbksVvD4T!1 ,9Sd ọxHXs}r4{ag|ϛD g^!~`:i@BcC]c#;qXkNl5c{NjXlZϛ;{L8dV })ܙ UխXN0P[vު< 21?oAIPUzqF?No._#9cY w_ /{]ǔa ҵdMygymyvzvY4J) BF7״rp.=e4O7JƮC.% 9ӵpX/'͝Q_.tLLڈdd*<= }NJRt2AL܂'5D/LK$3 S=nH$89^kqd~/ߑ^Y6G_Kί$Ϲ1 ג3p-&W.R=7 Mil?N~W؎P.ՇmX^Ͼ7C&d;WHH>X6ğ)s8W6 /<S  %& ThZ3IbG ڠL4#Zj_Q>´:Q/hM>/g#D mGbF@,EDρGu'c|ѫ_9v w~\EkkmDvj*,ad"5_N0J/q7ү/5s ^,d56Ē:IzGEl Ӎ mOYљp>x$a!V*:"mt]ģgvF7k$8++d=}<絙1"ӱkxK^k䪠 }16hTyoĕϊL@ kRs*e-+\wA=&ixRztGA !Н/# sf~ʂ--6ߥX`#zA"op\|9ƞT2$h#2I\$ UD5n*㙷|,wؔC:}q΀\\5N&ӗZhg #q@&k-!Ba=ż'K92D=K r[ŝK䥣K 3Ť/RӣM6/vN z3le b|u\:1c#a |[ȿfx\+%j%&R$\* 7o4=`%鮴?}JKs 4^} {8YK'qLϢ_ZSUVj)IK{)"W~ ҝ`PX, iNd~ < l7)Ei6!bY(5HOT3G']g|le]ϕP&a:' XSbCV.AYM7No[$RUϘH})PsP$nfu>^_0,btsH_#Q-S?FZ3@r({_e%@e8`o )0}WDX@`a; ,/R|2M~݈uuzID)^z8>i^[y)p ŢK*Ǝ5& A0P9H&콽 ~.CzQD-VgN{fEOd̏Q#G~ "͔/}.p3P`Pb2\ǕjS 0- (b_@y֏1=x;@&q)7 FQ QL_hf1(30PPᵮ}}5V,&7Wi"I^D=UNv 6`NgtE;o? '-BM>>+%S4ǐ%Np.O{WeJs;}2 qwsMP$[֦e=%|%` rc[y1 7ibSR\_~#lBur`h''G0,#Zp3`K. ^)7oY*|$bG?$CSjiH)u=R0H /7gfZfxGslzg+)|\B d!5rFp;9{S%'>?lk*# B>E%r$Na ̸W w-%#8>:@CAJ|+sаwȑjߴHK!^SYr)0ئnB魛8c54k*XV`ġ'>vrIn&M'vx(q]o3$-Orka>,kg{w+F2V:~/nM_kf[_>`%o'-QwᐆPfm<^$F=w}v!zٴ5QsۨVpKʋ-TԔA) fȈaL՝<-kׄI塤MV=Җ[0&f;]B6\4j{8fVlNF^K+g> ?^qEvy(jˈeE~uzO+v>+ ہ6,U,I7NjKbyo`/'b垨ȏz(:km/ҜU7 a9%æQYm/{ͮC0!"zX/ޣs`l9ˬZ}eswUL̉I e)Վv``$6K:2=}9G ype6ZasiY.CCuRT0 CGE!"m W0:g~y':/Tb ByM"Lw7[UtzHmgY1ج)]9vDI +s|;Nps5/!Kn-kmrUÐr /p6~[FF:z9艫ˉz=Sr\s(b~L?TRɗ7'Bo*u1^(ܩ?|{w6ȴ~93gUiSx2{D'8"r:X@Z)pFo&5{5}Fq97Tpt(hB*te`tt(W9ܠ zWV z}ӋYy+H岡F8%Rr &.X '1s᣾N'C~Ȉv磔xަW~jLARY^26/IF1j:U!m#3o<>~pETt@lYpHB}48RB b_ϯyRQիLJ-P3S:ҳSĸ)c͟ ['+6_X; 3)>NbܭeAhAӨŊHhdiN̺*kܯ޴w|+) ˆlyˏi?!s8u8%7hz@ėx9{+B+**G`_s$v:&Jr*i:8tvqb^H~=.4Nvtl_RȼGn4,t"5-Wo$]$4ÿ'f Jb%tی9pb`uY2ma|MGT=)B^gv4Af}LM}[ӽ/DީxkX*Ym+wW]`CБ$^bAy xwKd'>R<QiO>㴶{]&XOս%8DPȓļRYZ0\f0>EQ8O*UK2hU>c%Oc `2R?3[GDLcEdو&fVgy}Ჲ-~kNf)Sva!-ί Lj` .h9qB\dדnHf#6b$H6?? )jn$jF,tFidli} LSvLN PQkJCKam"R;].mmƝN Cuòՙ>LLPi__@/8ٳ Uþ\" 8<3jU:c~;uذl>_Ʒ s w3Md WfĂݩ!=2/ܞE4E}}=j:~(5g?h -qqHD̮ހ3O#-(6N²'L4>f[OszXG/Ues&6 E0wCTpD =V]~ܹ2b^Gd\>{xYFL$ӺR:Da'+O3}x!gms6W5lCɧ`N,roڢ_M-Lf}''dL)ip0a"VR%jͺRWv=0K g6n0Bl4ۅ桢&---gf2ҷ٠ e|gOVvQUa j7FF&Aǖߝ>\'\Ax'@;@F8[ʧOHDnRx&Y&c0?1(o{b#a& ǩcQtJod]}}?g? %Kb ʱt3h+%oZ,1&K > VL*bC'}._a)mrUo*5BZcYa+?c*k P8-1:{L-F;}kj)\Y(zǗ }>hKBbNZe{s*6.-zZPPe>^hP&{_Jmn^] q;.f.g^П3)PI88܁s-H$ph<.zY]`.));"꼍tU}gCsΒ]N}DB~jGwdVK+yޡv*RV姘PmBYOr5!==81{xg G$ {Y* OW;n_hz 8q Ι{2 Mٲ?j,\" NoG@=!o./'5@0M ~g1Qܵm 7}\=׺J]v02r|'v8zӔL%ll]QKfJAN5H|nb5 f-WDRDOnx}XGSd=|qssQyԶ6[8d"3xǮGBzpQP"IZR@[t%c"}]sYVJf#x'mܠxcvZYe-ۍz rO/wΕW9{kTƷ[]|=}VvL.&]~Aq%`pmY`BW6F=,½>B@qebgu ͔[Wz1,P Ώ{߭iϋh._ K%BxYРQJp4_˒BO-=Z$w>vUU2[}q&5g֖Z횮gi]%BIIy)Ҋ@6W1QP$Tv~g77=i^`RIx> M>1_9+)\U%}Un8M(d >~I|ħV,8MW&rpTfmXClAoU8DV`@^>bxp# ?8݋C`#Hţb,;b zL- T/U@T;qB+;aՠ}Ym^i&G»2 R9(n;U=-:^M.I5l1O-9Ƚ P_ƳRʣωq^IEEWNzk,0M퓀`d!ʟ۟4O֋s6ղOS*i_b^8໼U\řܧ>B/j駹%aYyfHZRAUBW>ݿ+V;'_vdgW+8;|t9BEp%ͭ]4RA&ғ}\aB3=g> IIDr"gnZdX+ڪ|O֛mRH-sViz("UCAxauT)~O;S|"oIZHtTd!stn,Tfz= -|r!˖ *ͥ '  U6Nɏua\GkC=$ucMe>XxW|)=B 83Zo򝸸&ɠ_=bu6$6l+ nG]xl&Zu~N2ڶ}@<> L*~<1N83, e[ ԏ x_R6~!]Ý}026B "Sc,}do\ 6R?`zA(/߾Qꄻ˨z<=<۴%s+ @_Cn:ȷ[/Sg˹H8 z/r3MlDx@Z,avAkR/H v@M:nTU3p+ 2d)<#7TQ Ue)P$EAShD}T޷36mtUG=Q3N`$3]~ޭĨذcLG"m I(>H`Cբ;8/Q@gֹ2"3E=O2X?1a3z߁5u]n431~p#gZH`5K-o<\@Nȧ$UUqs~ ֠S-P<=ڵCvC5OKGiVQjUt_/#B/lP_R9 ˈBM7{Gs<7\va_p k?}6 ^lm"ɗ_}Y^Z T^D/_S2Ax;DMR"|TWьa {kڌd&$K[9cfˑtΐʸA7e>)ۮnH5 Z0t<{5w{9$V1e-0(g%cj}eF.N `7ι"aᷛvt7^?Y58Fo砯l )(?k0U t$fgF]{*=6 <*g/3\ 3\%9D?nَx($ğpxxɦ8-Yn9*ϗY |ZMtK^aO{IZS|EC8;㫉nwbIR#_]S5縄S~(?1!'ZWgz1fBqusrzϠ1RFms5[V AfCqSOΌ{ JJA,NfjMrQ.<`ÌNJk5~Ӄ9*҇Pn/:m,^F4h+0Qus^)?X&R&(/^1Xmj|O&?UlDfѳ;zRkIB%VQpdmK+`Ǟ3zE6?ȍTJōֺHgrd3fưwَR`/Ӣ:G??McyJ@2 t3ijƹuX5CVj1/ɂӢH|.:8A-?KyDI po$eu>㑧J8!eăCgR@A{Dx;6v=Vo(1z] SЎ 䍳?W`$c tA]vcGF%ut ӯYPheeVTGL)lV~$K[^Z4vxe'#|"us}TWQǧrܬӥ£Kƅּى/nyK2G _恖)cP4ԑ`+5畩C8LrBqޜdӊ3,I7jxho54W?jn Ca+5K,= HԮts,IY49GQ}Fh5:P aBWfzyqJ7=qsOyV.擞qweG.1B/h]2e$qE+Yw)7*w"'M=2ub̌-:"(k\AIvO$ bΏaQ}5w$m.sƭ]d`p5Y'FMv_xVF~l4??ΝUan a#Y=I`emX?ߑHdLYTO )/]5lU-4%9]>)X- >9nIt8P&?C+.q՛kd=dF2Ut]!П7;{#(P.ٿ FR|g. Zn-Y|n.mi 4vyj<ڸuhX$ *>3s3~W*r@@s)1BѲ_<f77(-#(@{{|d MS$q7LDC-7cPwpZןwBYb BaE/wyPGn]348>w~OT4Eo YrW=cR)]&zoB}pyd[Hf&Ol IwD˛.fߙyĀfR$AiXvQן%w[YL16fgm/;*za'w>wN: Kwq'jUqYȱ[ w!Lz Qp5z@Nj/Ƌ Njs/ZͨYӓJK[gaSvь3ʈ=/BǮOжCG?}kUhcxɔx #O11H9+6暘.͒r]~'a#jHj605% l:Tau8㬸^^X-wՂn++Ma9 +T*]LRw~fe5zf#Zd+4v?;ԁёf@1EPXP;714 ^1?WtgYOqh=8LƛH7`*XcJ2(r,#Vw ቋJzR.CVLUUǛ ghvoWdOT/hp@-T*ʩ%~VZ£X}I^BX ˄ߟEvM3ۥCe4OZ- {2awb! R8ti 'WoClaDyDHLwwMʴpbs8 6ͭUBƚP¨j\ӆl`GhvQn6f|nZ-e=>(,R;gKY2 jp]̀ii=u1o* VpskA^7=do3]YP CھL\]G55<{*0BrCwp4Vլk^!#8qh2FIӣI&0egTC [6o&B{Gܶ?0@BXDS t}\] W^uv(+{{ UD,Σo}feh8I>6b:W31<{=@İ ?i.'G7ٴ1+"VxN \54ʱIFNi2.S{5/3\ jуqk4ug^1'\!Wj˫Y@脽!5(SdB0zv ƒVjbaŦq10vփ9,Ɂ#Bb$=V5ݕjHch3{fӊ5; N0ݣ`Nj˽YK\Q\8?phDp.O*:1JwziyH(Dmx䂏d_IMTTfǯmv8 ^Y_n=YN2c_!mg9/yAeLEǺHT~N!!8&D0n17xsIC]CJXߖ}T3m;@ci_1Rsdy)2V)E\FhJ!eFsY[ vG3Y~gp:סvP">4V19W{FR9ƅG-GZk.tuwq9Up`,qV5B(DaY&SՀvlKy$_^ Qs=bpͨ.SJ}PO.m{;c(+qmjSێ1(Û|Y!@wf8_.oOi!l]ӛ@ C;=;YNa$vlz:Ѿ(`pȯVzyeme}zl%MDɚ! OS b:E*UO6{y"E.$5-n9d-Uf!l3I%`*8I5)-c+9Ul_dҾ Y/syYg$o  MOX 脊TM\ӄײtlìsG {T;|*f_qFQ]: k</c.̟ o+vŤ7tuڒꑮLgr:[@^3#C) 7}h_ ꍹd2Tŀ?ãK&SBLlJQ-]4ڼHN"Q]}nLF|Bh`Z3E 4i| #ayO#/dRqYKv6'P!U$7ӮM. u~ĨH$77^/]/].Wܰ zNL7TON:ƸTە 9 +IyE5Fme 7(kUZ39Fi,(O}y`_4-,Spr +*"CwR wD—NJ3ny–ӥLv֠<(Jz`xի} OJu\Ku:i[l QY>Pim!TfT3 a3bF U,;Դ`L>&bNS0ISF7x!? J(iːfwaqItk1F:fs0CcE>ъ5̾!F<[f[+iKגNaml2 <~\| l<=wvbֆGbF93xJ_h" YD#uÇ '^*7Ѯ~fڋt ==- {bD/ETUp#sk X_qMh<6G=/M4r r̚q(xh>؁G{)U?9fx&!: =px`-LQ1f6yR%wO bg%c!RBNr0'Eg/OIv 5K8-|@HΧJn=Ʋm9蘟J2,3F؂cAzI6޻edtha,U`+=#OR Qj flraCߘG9 b ɡ \汄؇xZ)Q"uXǷSױ/%5Ǥ{Qp&[Yʾ3r3T,| V.w+$ς||W r#!}\)^ϼѝ˩ր9-r6m: Ayq:*"T I5;),`2&JEfgz)Ƹ$`%q ATjKPfy_[ \/>KK&c-؂yOc+9<)bn#u%›o^vqbrDmEmlvCfÞ" y93 gDu?|JYZ~ZKx?Ά,e+:)\tF;-ObY*Rn0H%N'`.V8 9$\#jDlyN,怕kh)ھr-LR ؊V<W 3ʕO=qxݓ 9ghlmxgG`5Wx2}MЌ,nTMg߿;߆*}zxkI{$S&W{qXu;bn)'|t,>Ppt~o5&-'9Fq*R{JGY7\kں$ζ->_U;"1 >AgϪJJQA߅]?..Bg`3&3){m~3UĹeENc5͡% .Ä q৯(]Glfqd[Z` +yEݒ;=r 1ʓbsNۃ+"#HdBTwfSh"9ٙf`ۈ8 i>7wK^L(+1]UDۮl}fR_]9ؿ{73s1r &ɛgQ0z0E,Zq^O 459}'/Ȏf)RB*KfZ(;:뷸0iznF[/SOCq:]zX@_>:tSo cw:4_5df^[/' 6ϑ[ȭ/:Wڦ \Z75uX5Eõn^$ Fr(#gq@(#54~nF" J?4 "-T^SS2{2Q29=w0o;zYUpKj@^-H HyN8W.Kt|W+sb~`C#J9]O{ᓘUk|Ğ(>:_ojDE)PxqNnYRv GE1RA4rP\VB6̧YOeoFscVr=+O_(FT'|>|.4Je@6]]oo pWsc0T Y&X (aW4kE &"7vL;bCS nd[juF7!O}eBQX!VE7_2XS}5=5pQu4U0Tgf>+ʌK_rAoW I+Wk3mBR~;v@L;s.y^Xw,<0W>菮 > Ѕ p0勎MT9Îەgz~N)zտZB^V"l׹N똶i6ϐkVq'5ԪhG-_T9L$1;;ձ] $(vyyu_J^ţ "Q#"Đt_VDn\4b֘nd{%xlJ-yObq_W:!լ'~dߟHZ1N;"X 0J=r0[]!pwS J﷩ CӉfu,qvQFWZ값<~7]. u>ih֞oR:~_%T::b6a|`sx|T{a.H'r_j^%j"-C9!gF9tп78n#\ə *yyD|`:e{;ܣZ@K%Am~JlNnzC[wim9hf|灮bS6ݔ":m||YoMew:z݁<s8([#9 # 1As㸨^omL+{Re,/cz.4Z)SNloeГoh__J i #V9M+2~ zVB 7̿ϴO;Oa9K뛡ѱvp@y@3U I J3)Ψ?6Ǚ4tC=f^[ UK\9i烚CԙQhsیI%3IK\*Ѫ.d`l8AoXWf&{.Wq.8Vy)%yN#_,K CRɜyyx3v텦O]MKJgeIξKkDA+dk+CWW6'e,Mp,# 6B:9: s` cS(d~Ňcwȴ&\mɈŰ+h4!#~zon Gg~g]/9f#?!9V&(aיQ8Ft-=9myi8:e(@Υ>e"cC )ǮKn#Zq{Ob9uɫ~ϖSIm&kAcS u?? g Z?,yyukwbI9u9uoz9?.ɸ+"a@ܐw:V'Od Hx|gz,g-}dL) '{h?ulKժdgJgvݝ7`V,觮TyɣзKW@a|N}_rSܴJ^XV$(v#VA>>a٫vOp> Gc JX3#廎}`MgI9 =:4&!vgRolVjiB sm%@tLS5|9ռy Ԝ~F1!nnt ǢSx?B]^z:9@=@lC)[\OC~u؝I _C_4*0zCwh - g R5p#k Gk j ڂ+5k~?(w%21"0 .c6ω U!O;$'vx-`{_=dOFoj$PO3}c\  }a{I !z{i>"7az!a!;|^gߠ ;Cg DQ0?]=mZژ;1;[_ xfd?> ~?\\II!L_Q _|P?kÁ6o?ɨÃ/_xHi@@ a~'99ug.IAOT{fV#P-c*h*Q}9m$cZ*c-YT`4Yh0z}|2=_NNtLfN\.,1f!}Fx6܉;=zm(]DPǻP46 Eb6A֗0'_,{Yp3KeH CQڦ=r7qX?B"C'.j}iFT&e ƱcSdٞOlRBI p{T֖y L5lw[In}%!&*O^,tscqm;E@oAPkSknϓնIWE'Ąv7'.%]:%mb7O9ST!< 5O1`qw kMH :dvqz&ޢё%&˔(A,,H!5XL_="x<,3yތhHl=1J^bA}25Ap)tB b{\!57]F}.e*^@`j`ҙwwl/Nofo-PPSSˆdXWPZY4?#g-R]}\ "S𜪬멍(dpAPYC2 oW]pj{"I^<ӁMG5؟/C,8eWd'P kSt|"b㓹lwX3:cھdggO !`_N_";c8.B wWhI*x3=o !m&+t|0m26oF,ĨUH v{/)B<=3;lWa{Q+ "P]@ *j1NJrt2#x">$\7)4QT=} 8[ߦǔ$49굓x9sEݢVljq6jE߇bQ`vϕ.sǑAE[E=Xtf_,*vJ1_I%]G(3CPP5B:=N7;;۪Ja5"DV2̳߶f0T7X@|:fMy%B( c7'"EKq1{CwC([,Ά㳳ڙBZB R$\&r<4w):f|f(I'po𰹞b"x%W@,| WmoSÃt 4y\&~OҷP0|5ʃea+E#6g!sۣ@̆?xryYZ]=hĆ`Ss eJUܢ. B_PIψ,epO鍴/_ 7?30ꗕĻ)PHՃ3ṁ-⏾!E&~~;}* 45%S]0בCXXX珈8ӛGgWϞڹ |糌{=Œq>BXsSt[ӫ7|&EAJ\N/'m9v,Q_:LZ:ez<׋w$*w-N/IHiOO%>;^a'q-vWDiEM/fT#%`{:cW׀gC]4@_͚# ʢh#+\ts0R؁/Hbnfh~}G~.?`pn:} 8j0عX4<rGl~O+ 9(a΋@ n_I/sϓ--IM`w`;S'n+"QN^Z(4.T8*(poyR3e]]yʴf ћ`7hl|->/,/jrs,N ةzVAdxλݠ8(㝇u"h21.s?%#鼥BRkװ`W}q_HAY qj-<MO dL9Ө opl(wW xbwąv#:sSx@8CdMsMOqyEġJpXid%+az`u$Y@3eVl䐣>XY :iPTϿ .5c33@-2c>hZJov?opOw\WCYf:c8g&;˝1IWl\zgxcQaBZޣ0Ŵ袉0TH͋\tXt8E/'s|v>WL _t^áy$k^|y"Ǯ|p(_$X$] Ie0{Hd*X0/5K?g4EM^H;a!H)C"HB$G_C0P*8Fc'" 2ŋ.VjFEG&"A#%QFiys [!"72&afFIOG2J +%{h9o-F0߄ "NԳ0f&XIZs\>s%fnbpss]TUnQ9c$LYQ17;ww2OGG{; ?8:r=w)8?][_hc3_5 ˆ#yxpv"v_MIy{{k}TÖLHOtf~vGQ0`4i z"ֹMX=g'''D|R\+E B-`mufspr 5p#AAJ>iJ&a$H$cfOX۴Im..`gm-zj/>2xt>\CCCv;ޕ4i 5zy&]20wނ  hihX6MGgް:y|\v{Ȟ݁M}Ki<1Ltq iђ!# #JQB,(X6a/R)J⊢M$RK&%gSA+**1afoό Xa5VƋBGV;gI?ǿ6R rΊAtQ@ke$:o,"o/^`ɘ~\2̑0\p Y#_]]%N~jQf 36&+))g|w&T;wxT!Sc>0ǟ!t)7=1) Aي ϟ ,S9h7=x~>O$gg"3 iW0js &+pG9[HFVvŰb\MlTjGU #7Cz[>W 93]ǻ6IG|{N062r?I===aRxBeCC%p½{V3lb*0 ~50{={RJ1eeEAt.G@Iga]4 DfffN@0n62;8` aIqdwT`MEPlĤշ? ~ssk %֦dib/&7U^ұ ,c߮'W[ bbP5^otNd"-=iHVVa<'X nt4%%/ b`@,###RJ6gБ8^q {>Eut!q? ؼ^̭2 5e; Vj[4Ce^$jh}(8 WQi)e4vиIjTi}"AΧYRoL!挙/SrOtL bcc %KaZiMM|z:TAoN@:"x{K;+(prrB+ .Gd||^76hs6"dH}ls)| ^^65O7В*GY/-I^u#`SfWWeLMJLLM!y}}!9)|?@??<7xdӛ7ۉJ`c#K}Jk#suu*+=*flungOt"IAb1%7w2NE]ST* 2)uv\ cSS%mmY;+ G#]?Âcf%FnJ8 쀞®'< ݩ N`E; c8*m'\k/=%`qn?rv#nh M]cȖFl򁑸a LfNAX8~c&gmm2g(tޏ;D׸pj~؎4,`Cv 1>($(z&w9os-Q m۶]vٶm۶vYl۶mގ8D3cUŪ3s7rԊvRlk(lDmNmmmtt)*,o8 X%cn1؏[qi?vO3qE} ƶ՜;h0U9~xvu!%mZOMOߝݬ@ni!Bona!bņy)"- 7 ( 5}>- @OiKϗhO3\6ju8L93nAhW5]'| \<܌7 &~1_J5RbF+ۼ;80 Pj˒=>թh)?ߣjJAFxV<;_ ??,h?0.#s);gI)59GKĒhj#`dOP^bTL5ylHI2kTC%E4lev`_$ȕYm9瞻{ss:'ůonY@o^J#D {X (lE~D©OlР`ySVH1BpiШZ-PH"!X28GÏa&nBmwT%5W-6L&}3B?R6q/oB`;;qs<:D~BkODߩSA9ZeN >J ~|З{ y0B))- <|I]]LJ׏NaIV+}s~/fx?Gsw9Gt.g*U[٬BwfuaU€Ԥ<:z) ;{[f>w<{֢C!VĢQ ,f ?*[6-#/U+ ~z=͐.Pkąl;lR#Mf"beM.( ‚#!^Ҏ[,GnCBG34$/#A@DƆ-gB?3XLIč$*#By;וti2""n_~ßHz A@erm<lww( g]'OuE^¢*#~Hx7_pL|BSHplޢ#?FP7Am?ܽH~eG[$ dYqq|G1#[YFf F;qwyqPЮ4'hg||9 qq?lf .j?Wϟ`?+%G`$M̕d揥H朒(lWQ&bT D7c98ڮCkW+eyU}m&t!" DկAEXRk>fɳr;֜Sl"K܎a ՞]c}ͮ+J4uP"YOb0oyɭgD3T؆w)Ն,d~t  <S'vgV폅ؿѨ {v]VsGzjxl\^3^/\n鍮 k6!aIVRP~vmw15_m-ﺼ#`aIqqHN{xвYq3CQ_m?ÃD&YgJu66t>/sjDPToEh Χu=!m^}Ҹi]_g۾$А$?nJ8O:z@QTk(,Moe#pm5Y Ǔveƛ_ښzYQ E'@ҩe>.] 0Ŵ`޲hNNZmg6Շd"<_:xTե?Z!@nl Gݱ0$јΚcI r]s{ u?PgJHdxƎQRW+KOdC,@.2%(NSyt7&w*B eZ~L y P'7r.phU; ՚GßDq{_"RTDqZ.~}}d2 R[[_ $ӫRĸSI&/Y>[98MǁFDĔ)^҃uL: 1:%Ĭи#;!Z5&\hЏ˜7D}}Fd%L/:`9mCpFR?C 4J]MbIp:Xfyʧ7 `zCM-T8ǢOT2\cw7qAP;0lo9wOt3%8Q%Y9EAavNZ آiHؘY'/k֢GxŴ[V3!'>m=12'Vuˍjx###%:/J0b_+eA}MdͮL~@D?9^h (AO񑐕60*+p^nQ֕띏Kb.)RRGˎ- |(*}J],#"j. ~;~h,4uT-YD_%$~}CO)u7FW 19!RqeӹE͎PRSFvTܿ9 0~ 6Z*gǖSI ''pR/J`M&KIKp`GGEĘ\f /:we#ts\gq3/ :?aܸ(7&.2BI|J܈!-V=s@x,DPL%^p>Q2:]NsZc)A0'= ,%ߓi?[!z~L*3' )~T9LLB"aBv7iw6Jčm "-teg/mYik/2 zdA111PҀ/R4 0AiyD9FUN+ 2hQ^,0k0dѾI[LyynN?pQRNGtb_-VtWDSv=HO(dc3Hu+q~}Ⱦe4lмoHԳVQQN]^.'s~{-->c&N~(RڤOA~F88"Z ]^yyx*m& ! ) '0A 2bM7;ή_R%kWH׃Z@1~.-jFd8k֖N,1g[{{댷WE0*B-Rp0ёF{c^B( ` #/s44E˟KeXo3EO6/cLThb2Nqjzzϗ5Lmy]RDZeta\|C5;Y_; 4IZ);Q$D,7ga~@+±n21Z&r0W1I+tT )HD֙"DDܢπ9&'جa;n)׍ll_eBnz9<)%eΡ-9~^6\x^TTk APSn5y`xxVѤlC[CR@EKHuNjwRW8oH.g?\o/_Qg5>s^7iko:)#".\/i6Zh5O#1BHsV'QYhc/!ESb.hpcC?x':gy "e;ɞ ;Ǥ**!yΊ.b}8fnĺ>7GNzuZH|K' ,yg>tC+vA6Fqboĩ ?>;򹃯2b'**5ʿ=yx&HO O'իUXa64[R[sh,xA@*Y};ã[JC? v_ax'+/NֽQ ΋S'dc2Xn)B;uY`tD3AH4^ QY +MH "H$W(;y>Rzvv.?2`|VDQY:me19vx֑L!V:W|iu2 Bf>ASm-:2bEÆM 'aG@իOԟbEX%g>| ~g`[PGχզ~x\fgo! "<,L{eJm8HͰWBTx($#'ssgXTI2|)z?:ݟ4^[]ܲ2s.'`Prɻ !,sw5售fٞnԝ×n|"AxJnnςٶ gBGDxxb挤&u:*䖃 o BZMn>ӞѲg5/<}!kˍ-6x"03x E56e:~i= v/$, LAIIf CW]-~3Ok6KEeæKxtyaqQ=hj_ڄ  -y VmSgŘB^^9Ll‰ =FKWpM :,&עр% !2ĶQ +,#d|i]vr axxZDalEc>7 a*'F\!L9ppࠠF8\pj,,+ic0dف ɔJLɑ=7}ĊOJ*zmkGGnb_tJˏ*sv8+R:vKPSfsIDDw_R!Q8$U:=F-#?OI:'Ouqj„y";])"EV!,ghwu}V{w.Sј! b9 ^Xmw$;[.,ab<=q×Sz~xVO G9iF0 [≴^/'(?KFrcqwd!AR=z)l zh_S3޾>Id&v!/VppxPhu+ [gls!M9Z["9GAgNqkaМx%Y ]qde3vS=A PYͶ珊p:$1\ 66.,;rrhG_l7wWs^uh,]mE8M 8!ԩ<āAA BBFDTC{:c,g{?F&b8=bho/y΃ݫw6[9v#q:E?|$K|/ G&ȏ[2$̖oo7uh_M*3^c79j{/N*ޔ`EaBq^؅C1Ų[#_>gtzmT <]>MsY}z 7G1RRRlt[[6PdOooI8tp$ H}49Ospay<6x%tIn:s6SN6%P?2ksk6lS꣣ ݆0|eփU 4hFɦEX崯9)ɏi%ۢ׭Tcr2e߹L=c)ݵ` hhhfyE8As\hn7s߯]6[C<ޜ9E (Wz}{uЫ!WV% Q6{DW1vK2廵= ]JU8vҶ3s'իoC2Ee8>꣋AD/ZlWٸ&e 31QbO fEǛzn@\CFQ?g4 `>bW|N9UɉfHiu͉״LF(Hp͇_W/Sӆc5Ph+-W[l۴K<2yOK`ݏ^lcjN#F=vZqFcSGbz |W&S YlN~> 8,~A_ A; B <$ԣp0d8XG\mi>:AbN)"ˀؐ7PG4O'v͜/Pа1HByh@ ۷GA9.$S֕qzP{2`'-ۃagu PАRJ2! %"W#P7`!."hLy1U0f"E8, ԆqD/.W1 H9b@@J,|l ӢOl&F//)R ĂA8OopcM>tGr @"c0'JopMwḦ fn4?5*gP>bع*"PW](:" ՟ A*Dѕ?@</ڠ3Q.I3 *}>vchJ$E8]C6 8yzrm>|ьX, iGWA~2_+KdG$npUeŇI!M\{g-M!Bfm$z_wg-J >ƙ&f3U\1SD;U?Iߞs hׇl= Zؽa6 ܪj9O}ubŒȦU%f;z[['u v4( ?< 8$* =K事tUͪ WQ LŎO?iQԔPYک$1:"k%C Ed/^}4d2hPHYкW -5< se}n4>jM/ 䍖$3&w\ -ƜZVhpp(VZ`Va*"aej/CjFLַ&o:<ץrLt(GvڞY"6Ş n5aN I;e`t~W5n-W;73>%!JN^1a͇AT귵_TMR6e/ 3m7DS vA'|G7R3Eʐf Э(̱:NyG}iA9\U~HKSf#H9<ߌߓ1 >lhK#ff4'_mj" 6Ο?RFq$;Y'^XvzZhgjZAL"lW"댞XTH'/{dwTs vJ .i'.{X~>faW1k.@2Y_~I;J\{s]SaAh |w[0o=ڋ>2IJĒd,&eMn4{`"s8%( <fič.&* Q76r"W oƺe/() Mh4+M߿xr!6g;Tw|J.LBDsV<=,K x `/QMg4t {lEAk3g;1\$gATx|f"JⷓT!Jpgmb\ikDG t? VH.I9Xn[=%Rnz}iii^;jMb-KiNx1G{:.IA_xO*RC@AT.Z?(1NNrbp:e!u;lq%TkZ*PŅo~!>e"UiZI77?W?_X_̌?3#1OyTvݲ:=To8cHd7Xd2X*$Q:-̕(8W H(˜Aҩ( "  " Z72tmNpy9އ$)qw\Wm2^Ddp:ܫAjTwՒD7[EC5&BC!@.¯ȷ"JFRi<ohSH0pM~WT^ O_v UJJ`'6PMg U]B mN^ͼZP`-Znw _vL2h8V^xtQ\QFbLsk936ӂeW{GӉH~[}A ˖ VokϤurz~~O9_5,TIP-B5@X*bR:~I֤WPE1]m_NϣȶE^?P3/˥_1Zj#IK7|cbʀ.Q"Ͳ8vzOƳ@wF\wBf @XUlT8Ղe[C(\dbCIџR;C9B )|eQKeco@V.0g2Fi">+2\~}iWs -DaH~Qxd9\l,OR S"mm`Q[K\̻>FH89Nf(r-tYФ<-4$jS6blcF@u{#?F:PXp/p;, !jd* ]!ۚR*oqIK)ƀ}br%$\<%Z_ 9m4,ZC={Y;̿!KO/m(U4`.$) OAvLҝ{8BT(c|U51.$_ϣmODh cpb(p#`ʀz||#R0`wk|K^Z,ZK"{aiN?-kj>ag[ ¤f*ſq* j^t+Vb墚׫\(aWQOLڳw{?" vz_QPoDU$UxR9FmDt O{~ss 83HG A ||ߵ'<`#G/u7}!)pfqMZOu*o8+՟aۅ-/?{DD}ƏG@O%}vP8ʒq =/2YȵTi !/f)@-HnO%PyrF/Ɨ7u e:}^ +]2fa^*.otUph!r=㳝Y$qd0O *BfJj\>.5Zbd(s m 4KI["`GQ?[Y[BV\:'2e4dy+ݫ&؇ _p-][/L?!þ;/r貁cfnmNH=rw;'wsը" k m4FwSСR2'~R7;WP\Z2ht"+={M/!!ҩXD Z Ų{##G#(sH H@J#(B 8; S p8]9 :Z=%"arE9zW &#Q;+ jE|XfXhfᨖ̏!?KG(~}pRU^|ƶOn Sm|3N:i#3P5҉x&!1!h-j!.SV]M0 .9Nrl4߶ dC Ъ>89w %55cޘ|a%[6&@h[u֩!AOHC9|Ւ!;AP'rwi`D_hLu-Zpq<(Ct[7=Պ U jQD`My2cR q̤0qEi35x#("3 1Xad?ְknqoOPM/'NHD'BLhk9TXrB=ƗE1'E0eUR&7(1E`qҠ$Ag&Wlu{F`Sxnc ù/K(͔z4!gF Kkf\ @nƏ艤L^r(L$#L1 钔o.#KΨ5ÒlBv d2P/14_G=Zr{;vV Hę#&X`dapqT3"E3'(רmͿ Y}k _=pVe:WtA{ &o~~l1; ䷒4xٗV6,){bL:hL\jZ,(Q(WE{m&X_'J0D?u3e<ЫdzGy)vl3ܩQu 9G>Wk!9 =g]3m%4gDxAL?yKC@ko߸9dhr܄Bhthcd>t_ANJѫ`0~gfnfve=4gp+OtNŰO)C郛E;THь۱Yd(SJH`)w!t/M 1=wfM- e6iwSٝ ֠ MuAua.uWٚw'MƣePLY]Zjgܨ4@GBHC}&s4cFץi/aJ =ΨB唢R`Iڱ @c%{@'Na[L4Ps09F702@ЩD]9朵u^pYy;&]$N[>3v4Ҍt!:Dye,PZZ#3$ Qc H_p)B*t {89<^^Z]&]tLۄ9񯐮FL ˵ɯѯٯ1bLL_g/qr!a5v=\eg."({-4kVZoto4P93;Bu0]C,Ɵ={hw@Uz/⟃'O0!.qoQ^10sMmtC:%#Wt1?dRWzVfKfuQUiŔ1uWP-_5{D) XT8099v8[rĭ-Bɉԍx}wX17Łߊ^NDhX ^1} 06ObqK{J~f\rlԼ>-V0fƩYyĶ%q9ikBa\CkY!_Bk^ɽ伱$V2$y8YWYޢԃepW2T:MpB7 SlADk뙪=l)ւA~r#lr^ OĊT{ۇG}p9=7l%\~}qSߓ'B_6Y7a\bQVt'mT@~vE^H H ur8#\>gP"2 AP:ӓ^WuSQbP.U?uJhJwuC@˅a_߱w(G3KS{tZ\!0/-78BHio(Я>5,_aWlj*-2T3u8EI ]XSAZ@)#]$8"ֈ9G:UsХ\? +W,ϧs ލ\3A-zfpysET)Ʃq2K G",%0(Z+"c&݈]VVWZjpGX00W=ܿ $1Ӷ;wwӷ/h><ѾS#;w-aJY{[DW{]DW{_Dx{Dx${DxD{DtDt( -jSZZfoS#[|h   ( $  h0 ( h8 tCp˧!PxaDGu@ DB[$!k$ i;@AU"8eFOdz2^$XYvJ0ڧK x/Oٕ ~Ȍ^0F/t<|{ꜷ/ $$^+t6(`m52J*>Bّ$0̹D' zI3Jd( >]H2!CH")^r >^nG}]>s.15હ*)52T-VJojԿNY^D:MW]mvDxDuyF"m޽Riӄ*cYY6QsU[^^_?!yF;e;T#;kA_]T.眏89k-bJ ,1ʃAn]Y_|mn`[1#xڵq@,fτcC߰lYB]ʮUqj%7"ϢQqRF$M wOfPPa;b?9"1rOիEzQ2I!RZ9 EGTԡTpJhRIIɱTT ]e¯P,TT*Ugyggegg5XXXX2bʱ)e9 J{y#`U9-RTxn@vU)QT UXT`U.L]id]/WH-)lT.v)׶]+Rz?x/}/// -^ ^ ^4\_@^H\`tµRw7uȱs]D/eAnN'ӉgH7ΧCIXAhnD7[ 6VyFLT;6{^NVFWäRc): 7k;'; 8K9RBּןW#S 赡55-k55555ҵ?k  rfK636 |%*jO OOupmS;ڤSjgYgee'hhy554+<l:07M6U7ڠۮ}!*~1@ܓ#3ͨve ࡐ(U#?A@V?Jz'i%S%t%[%yy% <&IIIIvZZ&kNc.. 釮ӤӨSybziߴ/O6!Ut#գ##{{ t|V[f|nװW{#ˣ ߁ս (WԖ<=s|v;-=HnW+ n}Ao W+֖{՚(h"ֳjNhEZhs sz ({U܃1Q5Q>&/S/ڷCX_kX֋ KV+f6mKoq2KKKU55_o y`d121r-n!H$vБeIvZ!sIrnD3MIO`2FR-- kQ"~c#7X[O4ZYmlTYlj]k{j6t]|ZZ ln7ҵҵZZ t|G]_YYb!iC$J\l>P.NF'Er;;`K֕s+7:/ɓvKDak:"c<7;8pAae9AE]̱ĵębegsrrrr6hc?`p۵/4l>,KI\h8^䙸F+S.PFe.=BBk?W$'@d2Rt)QC:_T(Q%ݖ 3,;a>1YN/r44a[uz;ɋUd[%I̮RWRVRXC&eQф;]R2R;XJұҖga<ԟ,WgeM  řt,q5F32!EhEhH~%)TEג+oGam_gbe<(,d2rEql4UNU\Vk/  ekBslEOZkG UsM%➔nk% Obkزmӷ:e<N^'l1{m<FKt1}>Ϲwg}`e6Ww'#ϨT);K[CS[k'N]NNfg{fe_srqqs|},{쎈OOOeGb3LRLP%%oBg3HJe|aܷjfn2vlˤ_pHȮQ9-wvqtuXh}L<;]wioO^ޜ\\ڜn\\]]Lk_;sLm$tm,l+i-i7m3m?n;nGoAoMmImww? y}~f|F w q%Ảak-CS$ ,v+5شɴڴ44ܴqaZrz?5GΓ͍#}q&sٳsKtʶg}`}b399mNshsjsssMskkk35>9#gU-kkkkkG{穇ǩgB}o*co{+?oY|Xo/ok\o\momo/o`!oPރ]]]]ɶu!M9mllCW5&&`=}_sEED'XgD/mDRƓT+}rF=/+c|&2빍MGt:~Լ¿n??u_.|{S~~9~Mw~~g{~~U|Y~m,~nC@ʃj 0IJs/x@EMiA0~t+[}Wk9,es>@[Ezh)@VUx D|wakP(=NxB, h@@m'/8睢zx"+V{.(8Y~8Y2&r)V]>N- )5x|\:ewD/Zf4푟OG[ 2ǝg>>AۺGujpr'[[|\f@p7F|C_/.vvX3ϳ+%Zܚ1o+b+cJV|G+Y@8|)N=@p}$xn[[r7'۩BZC=חU/crIqb3':C;Ӗ;|vCTn-1+WHH/BDž}(*pێ1ÄE8Iqѡ- VP<.77Q@Sd4mU#NU I?}'PG<:==`:w+*'V+/3Jh5YHxdȳM):NLMb#(V)@mhS~}{V(j0DkP59'j@d዗,<;$?kBv1-a[lC{wNt'r90 Ҫe0+37tͱ? nܖ ӏ=7GD$9g;?%"Q< 0"Le tt%J-rs ǐ`=G\eBa7M9b3 U96@~J kC&¾wW'scfZ!KAQA1͟S90GAΜųU;v[v 7vv9lsޮ<ˈ5(F#W<hI! w”6^`, ž3 KW#ԥ!7Z@a9h54*} }8$,dCd0sۖ)[˜UƜ G+> 3AyEy`>ޱۢܩ6h#uIkq4V'eyɣab _v/WMB2NKqSre!c~ k%%9Jmob^nh~y{سo &:!26a{ 6,ŏ yޏmQ>Z448-6ZQr}e+JJWKKOqcS|dW3V$^,UFmef#lrQ尗Il(' /6ˌxF>m4'cզHq$r HؗW _V+\:E7fW5\&!(NϘ&ԐuEvAh#;]d(>Pl^w>X٨{$xFQ<:%t&1i,`+\JV)p4._^9aY{1nim1UdQ٘+C+鐟 cd-܇Żb<ա!Ds_k)jc|n`H91 1ÃHb`yY;[(JFI^ rM;"_.}0TD:pʵ1n#P~M1ڶ~(*rB:0 ] dMpr&iX`pdyM!"-&?wܝh(:g{smcQf^D}yϏwwpwiu'}w@z0>ga Oc1C嶦ZsnbhNK&miSzb%CTXfR~ZzڡI=8'Ʋ mudT6oҽM<=I>n'Fg=X bR6NfA5pǶbAΓ8L-Gu]U3$Xԯ}Xm P,Yґ㦭 nzmׇEqt\611 +w}"쐖v.2B'rZXl]c)Nndvm@gi_WK`IY/muT[EmDD ׽ tFKn=gcmeɃ-+Xn}ӮY\/6 2/;`a^)'Sm|pG55ؕf;]X_6C9O66]yy'xy$6rFʨOyweϼ=oRrH q\kr^C0B43!sI B/- fǨ,n+~Qx77RdL&)DQ"v#TRȾ; G||c̰لwHoJe$SE~LvD*BgYw|u⍚nXso_9Ÿ}|Ij=01u ,zɉKo> JF`@3buYپ$ĩTFW+ TezRDU -v~eH'>ʸV:R!}0\Z١TH;\txeTfI>gT`yvԹ^T`n =FOQX6/F7!dXB}!avIPDEfzWJt=‹e?(ƽw+8rj߽6‰zK(kgjuTv$4!%!;,0)iS yry2RR$pՑ$Ҟ˚gӘ6g/j3bq8kW3b~Ӝ)K'2mL .ec.6=SO/]zdz#y Q 4ޑdx.w8.{v1 NBNY͉pNf7%zNQAyOʁ[L#\bCS-Վ=.3toElkWY iej_3ʺr;;X':L!b7qd7L.\*@7nhո6Tttn?ΩlyQöf>S3iumDʸ}I|Ddžv z%&ۖ]”USu"?MbS^"_MvetHp􄌀`i%1A[Na.?&df{f,w;jKAŰaMcC|CZ;\cKw)n.%n{l0X?,8 S 5pH+D Yp)Z5ݕ{bKIEυ0:p{Wp,hx#tF9ͽdog5Cwӵˉ{{Lulsw{Tp/OA]&d[h.Xg .K=Dpk}X~.ryI Hi֩!J:|W9ƔV =4VLM[:>QiED;Oͭ.$wg4iEci;ABS:h$ٽ`u S\G u~y[_-DP=M!Y{ |Ag!Ce7oI,4CIBܧ=B8fԩk "wLFVcP.t#4M3H$sZ3)&N607}󎯀.Pz $!Oȵ|'w|6"G"wf} Sq\hPW?5_wHI_lFF4@ 5lK xU&Ү?΍O~$AW=jimz_nysjLaF/ͫ gb :W5p}Oϲ[ohmpY0ؤ Nq@ 6  9KAOڶڵy9//ۛ-g&%;V?G5[cCy}#){X 8!ݤg5~9~6W~KR R ࡗ8&-k T.2_7?Vn{{;Zxd/B>~+ o?q=͢c*Ͻ?o5U="=uIwOkx|krZem L?y [x+~r xr9 Vn-/tb2e#*jG i-j¥ay.]aU}]`odzeeȭ3ȷ0"tud7}('<#HϲM `x<]o^tg^'pUm-} x̷>O} (vR~AL} +\gtV^U:Wn7]dv\]uWs:S +8V!9:ʐ XJw}ٚs7ӞEX#1SiQҰvI^KPtZ2\GV9>"LOI+NpNgݠfWncek|;1v9!<ƿՃFLh2AK.v=)>[x']|0T5Icg#&iȫpGi|_*%QDrpR8A?[5~kO2x=]cF#-x9W]H Ԏ@L9#Nu8ݤq? -'QwѺkXnqCniMsp+WUsN̪pM5b9v|զfִ&,3l8˹%gW ^;ZG6분;.Z\!~QX7=en=͝T 8;F*bNg'b&vf SPTVW}}/~tg/w /Ϙ SQœꪨ$U\+nRmOsxo$ЁcpjI騱g)8Hm$(V*RmD1E V8E PWB#_ŸUVHWbJncjDF]ק+O[Vmo_̃|ݴgJn؞sr0qrt6?yp`O8n./>jH{*窻 `=&.Z"tv&P'7燋[<ձ.W .qv~=wz' 89lt9{p .٫%گwNN:e&+/7x0FMz775alF- O@+<NMSa *F7nz=2̈́! :SQR< )d㷕,^`@^35N}Hn;W^7'NCK6ٜ>XЇś^J:}[qo91BCoti_ L35 tݞ[)@A@zK@-KmY\ރ;#aE̚| }dp[F3#l~1aظԗYF>Ʒ3ćWjY Og[W ߥٙ=aniq4ńbोؐ \Bqp)<~m LXZ*mXx0~, Mnk~ETפH>-h/,ĮZeo+;4+_($4c7 f#+~(4’`OnyBNʴ~,ڧ1Ϙ^KBI|zn,.gۡՃhcaI2gו]yi"VG6"*xaMDJ7iiJe(v"g!$zp!zBXE9~5,C:bPZ"ZUPc*͢LOH>ᾁ>T4U&E*5챠NUGZ][0oQs(DV8(G6[CKECtˣW0 A5>U 4 XN@BF Pt08<3wUqΒ'+2#-N]}[FFgU90 j qbE[{i)nL qz I,y B@ EyrEy$EIRLܬI(j؁øiQw$f"=S"&1q"8\?k !@b@ ^ =#XPj:=l#d8 !HfTJT.mq2/5`*^K*AS#`LBY_y"IzL:(QČ% hy}ccTBcP& Ґ0kPyʲ Nz "{l}G8@aaa}&U' v8A(f7n8%ćc1N!@c#]llq9GH<w޹*v!Cb"`p#h`0q5HV;k;Ur fPB9 ^iE!)i⒔[T4fܹb(?ZF qY$QHZY\ (I\:99ta{>CaklrYd!B>-Qh5+swBS9Ǒm6&GJx Pc~"()  Y+bxƚgErJ5.? PG'( N{,(]vhHr/eLy-Pr8n+ÊŽ< ~DDȇ~yM\ Q!6^ WCY  gUb T'Z>=S8AOۉR:>Zx#[;(c)tGX BT>&G59@\@>Q(@'jCdC3(,1q%B<@GM < 7E3-OLD0 DzT(0AL0HolPOÉrTY6ˠQC9yHt/HcXq ew +ҍU+Z\ÌCx) t\*RaDHA%MP"/>4/Q遹4N[JD* ^^~-_;z/R!N/\GS~_9p=R^ EN) 0,D3j= ǍVH( O/!pu%RNIxkX>a`~`' dQ-OB16ڲeSB׈ HShQ@*y?F4m۶϶m۶m۶m:۶mysճf}YY;8?C:v4PuiP%&2@7gFދ<5H p rX?.Q"1 aC:8r  H:C M{hܙi%sx@=KT ƞXN9 55Q!6*D |n }ZA TX8ӹu(:yu6lG)0J ևѭl+dRJj h uG皩Vt]ՠB]TUkň|ydI}ل@|YgveI;HQ$yUCޤ|NudV#-Ddk! 4 Y M (T'uVW!А{f,3YݢLXiJxs]j1ڴQf%ۮ#F5-.^>4VV G6(tɠ142߿b5'Tbf3(h<dUZ*^L v(!dNp҆ Wm{Dr[ gO<gOJ{Rk[z*)h-#!hxն+u䔚↶/1msaUZ1Al3%"2y K@[ 0Ibn>X@SOA)r<^cCHs=r.H;ٰ4[NpqἭF"v(_xH:* p k)S^p?*\B?4#~҄b<3 ]K׿}B2C,H8~:x)#p\1h;jsg$Ϧ+~jsO_$*yƁ9ohV(Q?SB A6:4ʯ,x'cX'5TJ=lpkr'8:lP+8M;' @oǏ V RN!`p0K4qG Ns WvLkUE\d{;?"AܘC)x4Ϧ-?e5J_"?dbs.5MrZ52>e^E0#,PaL P&3 :(~nQ*vt2F%U\DT[ U4A! c m,*^6N@jˠk3Rt`" 2N ĭ?-\w׋egtvIHۣasf"68uBT #HO-vP %mNwTl?!Gy(1xŬBjfq%;tV$-ഖ"gVwۧ(յ4##. "NwBS71R=5`y:=xJ 7=J`B1_tԤ.R?i@0ήHap"ͳPHxHC8h4H,PͶ0a,H{ Bض P /J.mJ4tb% -.wl{K> kz)|ڨOB{!dE^&G#lѶ'P d&r+LU-МGqUc&èjY IKZigI%J7md=%Caʮy*R]8U-t7$R~n;+`fM# dzi~ˀD┿Rf%c< M9|`ǗoMdzJlgX1n#ul 6qnh8龱eד5`GPV 6IEp5lk>ŁZO1܍ 7'W,f668LШ*40 |Sx([gHb0.V{MxY"*k/rHN24 FIl))^H#Vyu^b8-G CA}wrh5̹=_l!CՍ" ْhMHHO;9娍.Zt.1|BhJW.7,@g %-d1jpQr@.c ˙qT.,>Ԣe]Yb~H[%hǕhYƙA=Ti ?ѡJI,*_?3 Ձ)RX=OO?4@T/H황e4Ȅ8 2gVVz V~/*p71Ю@@_l!* x/߶āEZsۗE3`x#Y4s_pQ> ExC<' saQ|`pH=/[3uvLXc%90c@LH$}i^0H86ѽ}  NDh]_П=rq[N.;A;31ʞ 0 6DAOtyě.p%A'>L0aԂ[0欠tD-DdCS~0tQڹs]r) aao(J?4#0pUaS>OlVb2O~_8aJCCq6Gj_;]X`@y?%,.N2yjr wVڣLO}ID [A&5w d/\27Ads @wIWtv[g4=JtZw$: ȫZ! /VD|Pu[biNV$|?SsawRv[ː/r]EB> +d6L>a~yjwnj\ߪ /e5r HJ׍Lbצ8RzbwgKPd&d۴3N{{;a9=?HQG@|%5fFMZxs 9m4r&HBMrMV0 Gta4!ꛥ`7K.+ MYXN,g =TSsl(hUw~Z?Ʀ -@$4f/aT)$2PMHH0`Y$/F`P`ͽqU[b-0:q&.m%}1#fj>{ 1.O+%!:6"TQ 0ڝ4rknZ_z^a"y( ermnBbyCS%Nb>wRG[%~MX`K_oE,z F `H=-V {z&O;4P b$\=\h#l*ͫmHCI&@G%SB@w/⡦B@䇨"sbHKrI DMlb9e6k0D1oD%uд]Ek7t&l3I8F4@U72noڔҧ^]V1yM錽.YLux.]=сaTf^|7LKF/v${2ɦouV+rA>?g܅ԵYqZx }&F0!_^WUbTjIFsPV}٫mo.]#/zK\UR+.г@*{57 M #7UٙR=@Cfh .ɀuG!:hG(Zo $Y]< <NcwfwÖa-!€ _>>>B)!hÉt<,b)3P$i_HkCb0ef`jo+̵Tdtҡ 2zAF'5 #N\8ۺ8o +-Sm2.Tn(`hWx xucsHƍTsY$RH)Y~(j Htم.HF: SOʦGd8rtftckR,j|8ҋs4HPeH:)@t;k~]%vorb$hJ2>bB{V@'W ;N)eҋ~w2 (]o~1 nPZGwlj1)3s`PsWNg/`œ7=eN^*7xF/ D@(ߴ.c߲-PbR=v)B  PBv=x=CtB/ :tbol,D}G,b^Q#)ub+^v\][y%^Okr ƀ 2L3p eP-*b|>2ԋ4oJSaM9x_\g& j4ߖ lew3a޽/iV#k-^|?,Ag\G0(һ̨PeF흑H ~aG$}0&]hj-1t'9ARl8"7H\^X̟xV/)ma\Rqm*|Fpw%ɾQzoASCPj=]/(&I `ezn| %K7FyLV Y;Cie/b%͋wb9vs )CnKv DgV$R{ 6f.}˚#>.C{HCyXVZvUhƑB_*dFSh}qVHdڽy|vm1(Cȥ6-⪴rcWM!WUΤyDON]ޢHjCyxPfNG8k](LI2YikF>Xs jv ^!g>7Oр<>ޖ|6=DN_FNAj3K5/nL{Cf>eod:X 5j]dRS-,0T29G. V@HzL;~E{UYN.==,= ~\:~厄ݎ_Kܧ>4/םϊWzSu12rxNjJ6'Rܗ1w>!..b#ib?i0c7aaMm;qԯp7sS?{,nӼye:gs3Hq!ߙƞp\/}-!_sVz=8)Qszynj(:{p; M9g[; ÕuOTqPFwM<$õS"ْp>]^}0p%O3L12: 2U.`SQȑe0|e!Rܑy"ar hHSAm=~4JZ5Awszs(+c[Eܓ^.UY.GS{oȹĉM[(($S==iLzZ3سC@*X>/O76D]賂!о'%r mya*JZ&JsBy%zh|d5UJ) bc5 䮤_R?Ee ,&zm JV&#`vԩ>Ԩ: D)&$3HR HHNT8Cn @%cl4sT)#% ?1zHD)![H'K) *KfTka^ !Fi* r5/Kcx\pPP Fm/K*7* K>;Hӕtǰ:GP ޽+8* ot:!F|=v`MTI[|Msno-ƪ#F4ˎR;:.Pb6ݮf*\#;ʷs43P2U . W69Al9z8mgoeV jE{ʃ](<*YB$ƅYU@JbWԺefp 7"ָ[Ws"x*U :!op5Dm4h D Iꘑe'OZ O`2qeܼWd nJ Ufڊ/P;sȩ+Ėu.#J>2#OPG%Yj]G+1Ҫ#UN{&XULg֋q-`,EBlȈP Wj=y69; Z2hF={}r决@O ׀9dŏ0a=Ew}^>I+$̑)?T 7/k'39d‡{@-Z8&mn=h-v"+Em49]{hjRobS1u\SI"I;Y²QkM!c@*,!"?ߗjibCmyP?=&?Zŏ1(Z`9Ŭɾ|?-,W݇oB/6^&LxO͑،Jg9ToFs3U媾v&zN{<OzԬ2&4LcRk2Z39eӒfgE9t%v.ɝܪ:FH1Qs:QuSmyxǪ`7'4OFȅ#UR+~v ݻJ&;j1 4O4KRI?H#Bbnw8„{M8]uj<7#`DcHZ< 3ϱS2IrZp!VX Ւ&o0'ѧ U 4mbStNL-Ε' w05"Un\a:QjyTm@ҬLh}8ฺMg09<-ė\'}cC 6R]5:y63F 9ٙD13)$(jã4-x:]x##|&=9':@~15vo-)sRkJ"8AI*s,d|!yPxl"䊛)'\6R'M+puʲMEMqXR^;LSk 8W&{߸~67fIZLV)5џϹv4ީǵL#(k-1X]XSlɸ3="ql"o`nlrg"͇EGKաDB: r ̻S;(ts(ۄΩIt]F.1;񪾼d'ZUio[ (i& IwZ4essgGM\oakx!s6Np` q<~ݧHk(6p= yE{@5uMP:E2zWjf7]~/FCIt$XCN_ƌf+SIQ3-cᚥR(QAIf&Qr9I/tPbC#^Gp?|O?z$ S lP~SԚ /ؚ @lam)U*VB6.4@).HCJ+vCTX5=}X8].!$c;c꜃\ӵϥ}q_*ֲl.~!l(iCv&rHHlOAk|U].;.)F2+"H9>˔־&gl=&|$Vfh rW3ߣ1qeZ?|r lע&P`ђT*@TI,ZfU_ۘdK LZZȨ /HoM~ukФ>[eY < JqZ q OoTSJ$hU!1u c$ {/4 Zh>k-=ԋߩ2 -v A6E2w e<Ɔͥp]Z,YNY=V?/3BQg4 ]^<)re=q|5A(_QfAU{/3q:\|f:{5V|Nd5M=uߣk Z2qY5!\>=>i~"Ojl|BW| 7đ,wY)IԽUbr[y-Suރ/`]A8oVxR5sLo3j> q?r7dgbSGExt֍'d."V ,[C,w`?I`kνCW?5gQmCWzQ ^aˤSS \ob`ojWT?$ߕW] ʈk{ɦL_ZFDk(IG-m|`L?K /tֹw+w>7LP+NS |v Z۩ۜ л9ϜrY‘< ];Dw9)vVdMItQe\Nꘚ(C}{BhcJ&yFsʳyg{4)攀|fҶ /uF+h0'/'yO+"W3P Cдy|t39"c]£횫9zEhO h># ~G}ֵ,mSDoLq.VjfN0N,;ݐř*gSPߢ7P3dvs|eIoR,2&GAPH0(Zrp9܃˩6;g+g;̌7Ĭ쯰ՅJ܇/ow>;k%w-lm[<#<ڨSg ffMj6 į)t8>CiIL4YP8</ZDžSG],BO*VݞSgc6ܼ'x>B([+ۨo W[)M6`7$07 bN"(9HQXicwzO=O>۽я2񨷤UD 5_09k#O/W%|+^3x=:PwFJ] ȡ׺kBρcN&um "7m4':X54TJS %Edꗫ8gU0of=+4L*b訟mD,俺t93ݭ]/&F1U-Cy&fl~6w8Mdжsh_>[J) A  -ƕuDOsg%>r]Wm(dAKO/h@&Uvk*Ig Or.o7x07׏ɌTd'絼 |+3_uTQ^BIUQɝ֚hbۛB$Y9sm#CI5OܕCO3Kc 14HB:I:w$M0*@LMswI֌hw9}#F1jdw~ -b^^jzmzi0eF;UCӽu>e۳pF)1C鍽@Eх}ѹӣi.y +:ת)s f_~#`;~df{@#f×[*;u_@NB6';~^''ݿ7{V8}6zkyR-,-۠b򖞧Ah0_%8įDi'UH2#Zx$zيXJgd u^G>~֋^~WǛ7 Fw:O|tldh1ʙSM~6.ln{dޞgp.ݓi+hjzbAa_nbn wtM3҆/;>UwƲSt[V ~t} n{]șo;ntm-x1!WZLAw%NnW[^zp;G6oSV >`ky'fp;C1WwdMC۪ }yVuL3BNΜ`NtiPfh@)qn5={]1鴴j 至O\Y  gҠp`nΊg0(~hfh?hC8tv> X/? G9495P̾s_4Eǐb|r9~Cs:|Wm0.6\VU\oK b;,.v^Tw(QeWW+#s"yְUYx "coh%NvAܵҘ۽-ʙcov̞,ٶ$PVTTΞ~>ܞOcHﵠc'>HHhFU#V]Šᛄqِ) 67> ]Y~O8T%B{:OQn]Qd01 (z\jg5[J_g<^oI3t9TŽSQmVcq5A 'Dڱ&Vdj ȝΨFԮCU \sDhW 3!U<3˦Ͻ7g`=A2u= NG?,B_}!%D"-Nh7@.%6*@XUk x+u4 ' t9U:7Q'"i%W:#$#B]6^I J3 !D*]2?tڿ̉}D Kza8qbckaҷ0]9 'BϜR.)XH8L,_$"#‚#8f85ezo'I,sLQI%xCE,Bq=Y Ŏ l^ᢊ89/L-ł>N.4B[_,|᰻E X[" \aÓKW(QITcifEVLzs"/ڄ?'WD\B~3Sa̢D1d% AA"gaH>"VIr!t@ =p ̌'DfuWZ8 1wئ"`Jet&*\@I6P\e#Q2a ~mx JgB&%l~KcܷEQ&J!,sJM%D.f2j N \0 Bppl ʳ/NN\5D&^Y5:Z+lE8!/yb}Id ZY yBG!bJBuU$x lQ }Ks#B'4p x'Yyб i!&08a|;Zwf`@/-B#'f =1!!2)d x3@5 Ruq y"`6eKJnC&߀Td$erXBj`tX9lf|ErDnV U@"O2Gw潒RO!cqYCU2WPt{%se$Xh<]3$oWE6:֙Y> r縅q$XGH@Owx$qAD4ITKx. "BGU[F3 g`E ,zh"d7V{9dmfbcaY yzt8y2ABGjz|pP iZ$ߙ\eXSQ Dn H9J CYji椪* fl\ >iPQ.J#B dJ۹i=ՔѸp aY  {DZamATFfxZT?zS84Y ƛaZƬ9AufDHk Zq/)bG~5ANĂ1*1}kĆy*2b@>H*A2Qy`-Ϩr9=KÌ貱zjX=T[}gY^$#u?(Wɉձ2-cd5uܢCXL:|E>zNZƵ<[cpXNTyAut*D3H$kh/Vkq joS`S=E)| d js5PGH5D׍-CPj`4.Ur<`Tֱ%Ɔ@6 !EU1jtڙ([>EV-<fJUuXJo7DdKIJAi>G^Ŋwn3y.DԔGI:pPTXַ?m#J!QIv՞'`{[vC;M>vKm: m)dyYK+69Y _$z!Eaʞa}xCMj%YrL>肁{Pd7?oCwȇL/Y9]V?Axl,AR00)RZYzԧHPL֫I0e %ݒDua1O%r9D;mHǏaPgP§0 A@~g [%q+:qj,0;W (mb6;^zuarNcۺjVZO#>JNTi[5 !7B;ϐ1 ϛLF'K_ [|W. f]JsNK0BHITda-Dh:D8b'7.ې>0NL 1o!TBee7dcMzQ5x0?&cP' CgVnn!߳"p4nV?i8$?昒'Uec/X2ʣ>4O˫b|LyirIթg>q%plRUl*Y}3{Fߞ@F:UviC2FNKsm9YԂ,i\ ~ޜ\4xMA6x)oM$c_ HtNSuh$'WH ]7*T+l B[ܐ9E'' *,y.`gc6ыPqI,\Q#SQDc8P^CkR>g@$#-eʹ|ܳC}Ь9^b|-T6QDcr@=Gitr/ )3Pd\`6Oɫ:\#b0Nγ'Udx{ m9m^WW[%b@PNĕ,܎;̿OoxtGw~W%H^;Mh|E }i 0QG趭\5\w(W5Fosi 3c׍J 0䔩v7?ONt4`/z-G22F1BT{k[HbsXKhQg~ W:4t \zdd] ߏibܡ],Rt!I4XEI iW&VTDYTwڪ߷7I;_,DCcdta,*%BLܡ  @ݵ2m>&@4YIޅL6<V @f"m~|4G:Ib"3w//iĎ G0ȯu57ZiAҕm~4Nj|D(P$`5/)N(Ɯ=+\j$I&0AꖇK\J4x/لR4 oSu9Y8)t,WHoTaJtjY S$oP,j"iđ74Q?_&HCH [ U{Xg3cXy00M֦U5BN8cŸ*7BYS<&0~ t#4F I$8m1| <.m/@D3"& KB/IcA:*bn "|8axTmi_^]g7m3gQI9q`I7}WzN6342 NmФ/[L3AFͣ[u_x5o ǜ.-rt8ؖ eDx;r#t8b܊?F-uO_,UJ>#T/Qkfd'oMdi70"%fi$O@Wku 9 1umkLm+I>+vAh~\!4Σ^t.{=$0;^Rl׀\e!ˌ5}=2']u0pfjrH.ecCQSH>B_"(*|HX>rع(AV67T7![ u(:Y\ev GCbb 8Sr,"Pp^>H X)Ь{٬kXU=,AhHwwd 'K?U{;ӣEU:+s8SPz^Ƶ. \F{[ϡmޘu][Mt.Tb8_=Ơ6oKg ;%SYK(S&46V_+jqӣ_ydҶ9r2f3pN*W ssdb]JнvXV$UM!':xNڊSa˞ x!O3w$m}ӱh_WR>kZZke"!l'[Z6k^WV3,HpoRc lycY-z*䑠$ sP_{llc/>.C֘}c߳%K흡m;h/EcxF+!VVB t PLIW&fUR mV Khfې-b}F]6k$i RcD2laʶهE]D?jy6S۝h#.2@'XS:6SSCato(@q<Y=J (MTF| 'zQjuSA p C}/u^K&*y@:.^?aN507 U'jrTfKqyWsh485z<m +g˄4{]I! C3kPWm*FL00@~H[ܵ(Y*;/pH67yWMYMȴ6 ?Ӕ 3C9ܛacE(Cr2AT6ĔI`eFJ#s) "yR*0#m TG-f,۽YpTjkx'3AZg0HP"{sR-١Zj"^Puy5I8,xϭhg4cIeBH9GqTlh,R/aZwҋ s%hB`A?49X|t/\kgEۀ3 K@[:Dl,o +{g'4଀lctk@i*@Bi;*RtMSi۹!0\зa>xkz>SG | ##w(*h[!l8)6Єe$² "i  u%?YuzOwי=w3R?)/üvO|4vphn^lw.C /vt6l% 'Jlǘ| "nÞTyE }cgn,/ Glxy\0QۧbډBL"of{ľ= :EA 6&r9!VG$/D09*oax:Pd-+)Iܑ C0%9_ cC QH9k_׼(F[='&DoPy-)rYi)ԁ ƑGE: B b6&uIT2ԑI4#ĂĄc`W ա@,X W35dڠBa?w/gXr~s:L=CDbG=I#b; ~]x0{ubR>casx)ӃHʗq,yaAJ')& 3G! O1ٓx O'L ޜgg3<]jhg=\VWXdF8H(rTF Ի Wa!Mc–;MYFtͯd ZvJ~;>i`ѓoL/:amSOfy8)o|GC*iWG5Lp0 p?ƍ?tb'7VaCKyuҊPS̐dT)}R^<[@Y iW㛻poxU+"֒Ȍax`1\;C6Ƈav;iU!TqR4Jj|caD:9qFw[@|I*/t4p_/*6ANhC2.B& +pxԳw]'g`BS FԸۇfxu)eԛPu+vm!=Ah_=K`O]38ΊP$8a``@ڋB!4^h1|\Ѱ , GWn*&}^Nɨ4_!*6,9_ИW&|%ɿZ:Gɪ/Nidmsv4pE%&VY|MNIR9=T AK{aM" q>RC)[_Lr Z9.vl o)iJBT6;\SP:TRkgY* kzՊ?!pB9+cYAãLbMfIyyb@پ4I}D$Uջ5=d}QEemSiLBeSA?1 n\<_[фwI|=n{~}s0u]NEV|{;Eo #~? )ϻ{C \7p~ WN0ozc-ML?݋QqݽYlNPg/;t|޾_\5m[}wvu^v~y m.>z>ҟ쿿w} ݥe=\͟y|E~|=~yM5}Y}y}vh>}\cj&AƎQ>Q6%?TWp'U|uRҞ޾,1^?; scҿɽ;ǹpwwaic} "u)@pn|,]}_|s Οx7ʽt?Qx~? CKPG}yVȥu52{Y'vׇ;>V}ZDw%i:C.hǷsaOUHn\w!|)"wq!aeilq/gHVucCӳ@bx+2\=Ewwo/S4๭@!LXHNVƗ{M|cPĎ;!:RZJxƉ$_|y2p9ƺxXZZuvalw٬]zZQ?d~!tF[34gC]Wz++:.iܣ9z =Zۣxq~ M;WB ^ȶ3xW4;k?YCZU0'i[.u8uȱZ)pxNIsiq#YlH#U"✳eEB2ga$Vj셑<5\SZX#f5QiL{I3s.{.dXFeMQP QV8Ά׾>D ϡ8QGs~Pcϋ,d &j,UJǬ%y2xX>*w#+7kS{:SU}s~cb.}ZwSu#d4eȧ <Լ*6CESjjc:<2$ wAմy뽚d=gKkM21ǩRmSKJ2Db_(PG* TGe=Ek3¡n[{y4ޟi]se["=sڙ XsUj'C3bgײ2g-,pBӄP dFA%2L1S,"gq F\c `=3whC۝ݞ_ǯ*^Z |!߸.t1ϟcF>_J{v҄ vtaGI݋[^ϡ,|/Z7y0@ﯡ{#;,8ϓ.# ߰9({xolk hS.oA;7;׾o቗/_<мw CjwǛkk5o]J_.^RZSR/}jȽ1/@{\ 2@PdA%JiӯPSq _} 3H)#ī2dBj FPs3m>xlG} }16>1} ߄+ҜN JvE:SzX P68B89WBPlnH .bPNʻ57-oL黭uUS7;F ;_7XJ*w-R\aWKK١DlJЗ=ϒ9۹q;YoIB/pͧ+5w'B ʯ(ьn/)W\[Kz^׿z-/-՜3'gVx_;fsmH^u9`Ӽ8ݚȺ72.#\MW2?:C^Vzmƞ0tʆ=I_%znJnҬ~4[M{X^Ժhψk UҌt_ 0][&UJ~~L|~G~1^~]{0cߘ'ԑ}-{>Ӽ<˞t&_r<&k[v(KyW}RrWC1zl^)&*\'D{J)V7.3֣oSQfV7W ?{Br"Gq_JNøu-ρLԋAş s Q)-R=O} G#Í~$pᇥZRorB 6u]U%.]Stx;~7:3WW7]xoV-?TaO|x??Lx$?|9oSmȷ`u9o쎇’<~| /Dwn 7TcsF-R#)ߞ01Zio1\ uvV-TguЫM.`u2N7sj$Ҏ߳+$2#W?#\>O^1v3ؘF͑.".V:FMG^0O.`(2TZ(<^ \>rl2m>Ls;NV^}pW HOi`p9㗴| פhNW~~V|n۹{ mP+^qhn"4s|7) }lə'V4'm9;}%{#l붷7{>vIsOGƽf8WzBJE6lEt"#t%ivۚ[1WbszGws(׉h\7۩i_f^8.Lt.W Y2oOjnSdwXl걟qM R Ӳo㬿jDQMJӧ@-nV/MO~ۭU\eoG'wgJx+go ,zo&3=@{얙aabger%f_oYE}ż_[ms3ޞ}OI>_;ݍOen^;J95ʺBߐS/0XD0S(M 7dۯA6v5z|5~\nzZ" %>3ZOO3yxtnٲʾ uԏ{~șK<)yiO1HSh=_i9yFt[_rFq/˻%+?E_cvn5~f‧"uVǯO˪觘8/YYav]O=k~ޜ󵛽1YaxRz@%p?ƨ 5mPaanJ~!Nn6X^;8OZ F8o/:__9_l枷C ɺ Z}4_lY}_邧nC1!X4ނKj")/ׅMMΉp-}w1Uti[1G~T: UUe?ѾK6ĊHܦ:lU~yȼwϿO=~6]"PyX>Y_KɐQn:M72||d?]/ϑ.yy|%IS&|'XjP6hmϯ[DHJܒSCѯ%:ˑ)|Ԙvif_ }+c7xW_rWMG?YvFboO.q&%#N}ܐhjΜVHg3TFx׋H\x|kYf_wݽl \wUI)-xO  Щn\cOU&cږRh_g-wXtU Dߺ ^F~9zwԭ?LuUoCx_-d2@  p4\p%$VzjF22>b C7 cSiG]B>.u4%;,窐㣉{Ƿz,aty;eWϏ#z9yjb߶kOc'1[д+ _F'_Nk^nͧm_{K7}y![(ny>W+yҐ51_>pڼf=k[߱WWs˿bgsVxP6Rqm3I{'ԙXy{}H[<~q)tKxp8 jr6~==?7PQ@&c𿭉 |2/,ɣ#lA\7ɰL/2( w -xݥL;5Ut5ֽ^{tix-AR0~ț62G=? dm~aR fDq過 ]kӼoڐ-4:*, ^VYZ8M6maizc~15㼧fйǒ['/F>a4L`):H!cE* Ǧtlf/(M|d}#j2VxO{ؿ~5>{^Vs.(;nΉz?Yt ?X^ߝ/u@b%}7MF,S[jl!Dқk gCG:z0JdYěMzl2O狰i6<.FH4~~DTJD $A%~;fK@o7 33S4 Į ؈t{?u_eW fp;|z{ݝ.m&ǫqv;JvCg1љtɷ;['4-ū(-6rVw>]uǦZkwddwooSm.Aͅ\mo韯BZ Kűo]2Men^"ƋA:o^g\҆WdqjdL-r˰)I"i"|bXEgKCDƴoO#/FsCVߑ#Be|7eI- B/_e;/|C$Ji8sF޷'۳WO7Q b`^A7rKaY2It tԧ1Mچ3m/Rw-;Hw*OQGlgj&FM^vqFIOdu<'2oϏq 5xž;A1}$}vL:BOĢf }uoc55grz;9ǿ)i*@νf p8|N4e}+Yoe7y2ʸz?J9y<O87b,S&ctw,1oqWŵ̠tb ?Cuɯ)sx|| Bpduj\øNݘ' a䎉lqD~RQ֖nkcwO3h~3FDxin'|>˧t K?L?璺8ܽU&F;V^ىn}stq BۣIէm%51:ρV*Ɵ]obiDO_1*{&_Qo@Q{o+9sɛLz03 [&i+q[SN٤%;B8Oj<>T+<y\Ws[OA.Y;s4kLǿUy߃ζe[yu@9dN/NMc2:*}H55)%kHʌ1jNex:/$ `|l=Nzawҹ\φvmN8'CoY`sqQN-BD LNǸۧuGJ!Y5:\ۤ!WyW,jGD dIMgoӨy+T Y'KhWN%/˚~eF\5>2N=?Cq6^/^g8|liwTs3SpCR, tsA|Y}›l6ɚYQ' / ùjԹ˛gE9%[k|Ŝpkct;aV ؜9v~7|V *ءIE7=捫_5fG3F^og9<7[s k:s^.>㟖tj)§v|sT\we֤ێƶh &=^wq=Zo6n@-/oYkCHciUieKbir>}?ը1>IHy-=uw'K=~rG ׭> }}YNT t-9i=`F2XD N){7\ɿR4, o)ݩ+g>zd2|T~MlP (WxA_;I9.tyJjMQ[Kݹ9ZjچH^{x`9GO/N*:hͬ/ʮogQVyK,Uur"JA  f-KxkOUYwޖA03|7=O3=1oDJOddy@ ĔvPOY:A8BXoYԅ*O~#wmAJI;ErIvwmge?Rǝo~ _xLzdK\/.'TG;)2={MU,xV?Ŵ-Gm^8Hm*e~2' T"`tx*~ZuzIz2<{]:"Dd WsK;%cA74"}e;(=[N.s */W[E8_!U,0¢eE?=ck7m?DB鞸xcG//p#7/Aݝ0]=T3z!aܫns 2,Jd\wKhi^GT{&*it}PLzc$f_K5jITcLFd5JX]jD8xC`NJUծV5̛n]N`.[^.<\ӵſޮ15njt{#?:.`G?}z޷ ׌zhY?]_Kj ڒ[2FdO:FDg~z`JLvn_n9θ` ^0= d1I{hp۷hҶn>A59s>vٷ1;QVs2i[(#sKjF+rAEJ SJuUkM2!M2\so3[_\lPҍ[cϛӉ$g?n݌l̫'؀d@|gHk˞Z>![7}cM;z06 cc飗9+7:#W95%Ġy' oo}g' &D 1_^Wc <}]ӏOYBAy YÃMc;.AXsc/: o#+-mۮk=#8fW2v;w5>Ά9s{~_ >ܒ~MmrJoT>{{ڊ.8_v:yYBY` 3JP-3<2^}SEţw3I]koRë')]Gn#Ww]l-ONg)Uvd ~窕ߛqmەpxfڏ#z~V,2kƃ^dT~V~Mu{#x~ y*QFb6E)r>+.gEMVJW&e~7Ӗl#vy듯Jz ^No9MJԏ b7/, FDz*~{qq^Ō!(q "uK_ [~c;TiV%_і ]S'Aі,+2E_o]zo˃oJ볕7D/d(71/b[;+Ck(v_uL[UyW͑' q|[?Ul%+}{XLrv E8ѻ8>k􈏊q"^[a܏neC150eO9b}L&Ԏi ;*W+mH8FEI<_^ˢ=qlUF` иM-NsYuKuH(ўP[d鵵v9SѰyNDb%lF7r_cDpNd״?K?AFtLʹv_SI$|zPkP/:!t*ׂ3*m?4> bLv\ɍK }hbEt!Ӑ,NE_G5j}1uZlY yXwK's85r=[f:a^PJ|B?(k}(q6"Eʩ*B֪f[1+5JK2u F_AЦNlw*t#]6oyт֚S~5 nM`&f{<ʧ3mM#YeUz֖BÆKڗMC ݦ j{8E\ vF{ʹ_ڂ/BS3g2 ߄Ft81d>[4F}~;;v>[Ê|H+CG]X(Ue@mTAIêF3g>Q6ἐFaQ7Zztw;z bߩL6!kGu6:f^Xxj |7eVg7N 7ݣ"Y> @6†3Ol\@~ه*pU`* Z=yRBШ%;rX^䓸>1d_%IѯYF !BaޫmJdC;{N9 l ;M<Y|Od;l\piGa0j9H%Rl)cGiI;@ ݡ1aRč2~I{vZz#pjP6NIg1sCք'o!lتhjX/ l웾eDlb(iw8GG@[Io篢[2=Z2;GYE^b&rշGHClӚOI:>ϠݕfCAΧ- \IB=NfzRB> #s-ͼ#N|>6>r~Rtw0߬vp9V ziGA M }0I e_-M GA(>_u5%aZ2@5H[wN>lǴ5dlt'Ǔ(_,F*-?is gbYݕr>`Nme3fhPn} kόYyeA4^wwHr+nam!3Zzٵw, <:NB0(D<= P"y QqV < ̓W<j⍹oy١C.nh7_v6C Fq|a"TBDq#j?VbgU:v!2/AwX?iDjD)Fo3s/?8};Gm:<4ޛaڕc/*Uh >ѐϧ; cKW.N2|dP}H"pIy~͟]<vN,)UlV]\"4z1%Rnh25QF[p49X`N's ox/~og nl1OAd%߁AW ʓњڊ}0D{#7*4WD;L~4321#͙; ^_S`_UEY>p$nqW ,X]7)%,_aB8ry!'[3ʓ-hc<u }Yh`ݏ5BWwPJ?)HCOB  ,xEcm+{DwUM#v"oe-K^WQnr핝x2]&NM^ .hlf.'<<)aK렴`@¹*K[;[7$~Dz$cU =DgCR驷j'},cJcyK➏4q"./\ƝJuX,IGpuM=",$ 5(;`oo߇d`9՞sYS*]lP)eܞ7Cnh{?Dtf z#h8voI h&ym o,L?V% #zA\puz[41>~`[0eFx,pB1bDϛC I-]8>柲[T&ƼzT^mj4d'[9X- gvwJ܂Y?-D]#k|äSh<!*eޙŐ4g}o*7]{Cs%Wܓ)2=Q9~^铱;-[ffW<oEX8ޤ/&ί>g8N+- ⺙%o NLx;zyu":$As5}^P9oMh:#c̮L=AXk =\m)t;'tDN~**csT:#vZ/t;usˆvv|^n5To+ٜ,r"w݀,ꖠ( Fśz+>.NSCIDAgČ?reDnܧB3+EK Q[CRl*$[˷Ĺktګ:1r2Hbva@Mb_KSb k\͵eSx!]H;:k Q> O+dzx!Kyg3%Bn6l;qTK:I4[xƔZj)vLVGB~G!Z"Dޯrg1Xox?#(@o՞u\hi'+Ƞ?R}Y#wO0/RZQS u\_Ʀ=mb7\q]9 ҙ(m}d3哪6?#l6 ˆ $v - ⋓8•_ -t_QȚ; {R'nEܣ͋h,=n &BaT\Rbdi-Ua To+#v&I C4"7X]Ea_]Ϣ 945Ib>K5&Fsu-H|e U~ǂcc}]']_@OhVέ#@7;Ujj.1&+ k i1FͺngFV2xA0uw,Íw=QJu&QȈ-q(4_*zfm`kq_BH#>"{gӰ!$N tY sy'ha b fZ^*B3ΕN`^n] wضiQa_%f&#,Uh?tIݠbB=F^= rfED\qco81MK$"si?)Z$Isab}C?mNjrmnrEO/Y;w}E @yg lpg qp1ɒGDq ᧊ `OV/_GϷ_t(}[\>`dCQe n$ 7'{Vo+ x?4l` M[C"2 Cڀ{Pb]JۈP)E@'BVnkMN5UĎ'|-\u1瑁y38iL=g-߬wQl$_OI \%i]o-=L I.AMJMt%zzL,;ht$Auqg V8'wpNAF܎0yR yʆ`~9 )/̘%<]b.Djo,Y!N;9bU<5K°2L`dRT`>`}X^*:u' a?{ X*5Q_H]Oa'8eq0)&dIvxu.p'.\6272o=.,MZ(,7){n̿džchp)wt,|5nk2a^Ƕ0ɒGWH]EAWkZ.H0a#A ۲ Ez"*-2FI "/WlZYU٘⻆٪іsè[`. G\/}'o3<_di-džjS|:d{ZT_fh~8tF,++Lgs.+AZ8UcB9j9uV|H8Sh7rTG`_[ԔS2-y+z~k"M- +X5ql}uZ=6rǘ"HaÃ1!$M/'>bO_̬E-OcW\0vw?5BJ&$ͼf'^[@՘>-پ%JgKRMqƤT|Aa@pѺĎ%V W ~U(|ڠUl :p4-l cT0Mm\.e^ M+wV :8k_F⋇{ҙ;"LAẆ&jBCM(37 A3HLr]/,EmbYkY@*'P9l|_L  =N fbRz(fDu<+5:]hbG <%qI܍uYZhV!2IfXHg{f˖,=o".-A [*]XTV@QN\U_ډ?._^`[Kа\L >b5¢xAۙ[1TSp(Dۛ-`w--ó|7;6`!U_H-ro:׮Dόq~;uS y7 d>1t D%<~/ Lty͚d]o1/ _/<]._5g/܎/ |f9LSĊZ~A?xwFƩ |P5AΡsj1(p,@rW#~_X8'(g nt.9j[:sf ZEs0Bjy,[l$Qq_*҄f6nQ#2TTEWrڭ *˜އa,G(96&JaظCGWLT:} hk Ks.#gYjPww5PVZekc2$9  ,D?"P [w!mJu&N~>:d⾃]Z'dE3NF+#'#Ot/ܟ:+k߱V.mZpo|3rx κVQRJ/.DN1˕Xy vbNJ56%SG24?c=5ƒ#~ÜX-2,FxYݭ/ #-Nn]w<CW6fWܵVV ~h79cI+dkL1udJC[N^ _rǔ?zwo&0ݮNŇfwIECm voܞÖRQQ#N>E7(װDV%$8+jo?/šouIoUw)tw=j{ B9jW,,*ܔAcX =.xޞRF ߦlhaY^o,K&ٕc/W6~Ψcr;WOvM:7gqd&();BMgK]X2$#\Zd5Ę 99[Cƕ]HբMy xXbN|Ί6.;>Xk-E D᫪RFVQBo;y4͕cC Fŋ̈́U6szLr;-}w+aƯ> Rػu͚ /=lIlRoCK:vViJ(#'"+++t˥ L\.gbdb`A f fq-VWsYY:ZXW’Y] A /_ A /_ A /_ A /_ A /_ A 0/3)?91WaEUo$k q*"j$3$b2d-_ؘy\ݢv|xcVRaO~~IY DY\\o{ʒv M"1AR P¯UH$h⾭虓^xu\_N"88 )X=?>oޘP>>/F5Eo{vT:>`<#` <{V}Q  Jn(ǓO`PRL`E+:i} WͰFH.#w8( =\!|Iu^1h"!덨B00v_@f\k/i M!R38([ϖN֋S /.dF ޲2/}1/]x,v% xwq0kŅ~=R v$ 0`Ń`0Yė֞`/-h{f[-\N03`R42C\۷8y9GtDwُLgd,4=ryw 9X$ڵ>ڸcK 5kÍ#oEĿ˶c07BQ1JC=+RIBLx>0``S^|u]bwK&<A%O("׃e9 RG{ԯt@I#n%,#.N0EhHlc 9CnhuV]}z<6WfJhA&"(_"XH*U9[d9iZv>8HN %j$Z߬8/p>7Lu'K^E}啻qyu?W}暦S{vŸ"˻_%A,V1^Qɳ]iGp1QӋ[6j m3*$?R9G|M)eY7R$Q.K}|˭C=Wr:Nx0بa$ABsw D<ڏ 8m)*r!~+2̯eymG)'y{Q3NkԻ=/a} )`:5RlnmlhU,Q =ve׊L7[` 1y=B\6Ӑ{?xIxV9Uۄ!=rт8f3ޞ|0`(SN #P確m8]ւ5ŐYp5\ sB 5 4X! ;/ .g0.ísA r]<(XJq woBwǔ4jQ KaGck}eˠwäZg:֥ǛV2RY=qzA927N~LѮVJESžKaMƲAJf,Q-q-QO}8CsʺS=Z01iaZv4)Pte)^_-IIFXBhqf%'}w. (RnaB#~:Bwyhnnp' G@=WG<ƫļRc:]{)"u26Uό@ֆ#Lc}^q wfE-TwǍ8j/@|$;I!ZN\; 6ljD[;ݖ4Dlf1 We?ƴFŖMgX܏.Uhܻ*~-:᭢{[aJ%jS< KJ:44;>)DT̤̽J0Ha$6Tn<@Yrgd\m!N xT$ j_Zre S _6'՟S ~rZ=r;.ΗN*gCb~Jݜ4|AӐ~Nouv 1;`RkkZ&k/ :|ꇃ;+J! ^eBӉҚؽ_ h~wҁ?ѵ%l M;X2 { { /M @N#P,&Ğ5MűlQ# $-ˁً||[d6Pbʙ"aJi3H/Z6R tJW7C+%d77b)g6K-}Wnd~'~ Q>'+396 qڌh)n投RZib65nl^w-vw܄&s9-}nlzNOۄ '<%J&ZKYX)vOYkLҫs)QOhye!F͢Od$UIv  i1GWGes k<nC 矪Z((,w.b%'hq BXTOR`ql< vqd7H0.)VV$ߗ~u_sK tYr) vg7Q>Ceݑt;,:wn̴XJ˲h2 ?ߨV?6ϫbȾb9,/1 \$VebA&Zz1Pcm}F@.Kȧt^7[K0GgPaƸg&[/<9-՟ˀHԤ (iov(c*ʙ~],v@630_J"+s-ͺTJc޻К0qRTIjh7=ۺz8raHS62}W*Zf|&&{0 M@3 r"{}j[?5ī~)J\UgT^ j-xd=o w<=$!) nڞU83 8 9ώR ұBw:3Y,)ﭭh)aY ۶ºz~3|Q}Ynפ[۠AcGeC/&?(yk6K/0uk\ڟ i_ybZi\SJ57ʭT6k ˯E*u*uxMgZ/hfG:g o1P|4n)K쓣C5gO}XPghB9.u*4x1jєۦaxP"L6q)+Cg QëL/V>@bg㱣unXx%sSsSrzP@RRɴ|XasNf{pCVw|5+y(n(C.oǺ!iYsr|IP Ls.n ϟaf5"d  4Ә'(VO(W7jW@J㏬v~Ϭ6F VV廓XBE(G~R7D}0_ .,>4C|9H|h|0bq *۟eԉo9:+pxu@5MHXm$Uq{Q~>ٺn%{ŶpCs; +իLc)1\~RPoLmْ9nT?ek!5#?nàαx2@cˈiS 1'YOFDCI UdƻX98i .څd%ǹ@GEUS`3 ZV))[nv]ܪ~^Slk'b߲[T4,Z(t!_-GZHfބUש7'?ѣ YkNvhS.)&Qr.,)\s<~~3gn1ҕOtVfId,ʹBH@!JE!ɶ)݊.*u4+y0p%:(>oͶj[A qxT&ƭA_tGuW8@nU$V4yhЃc< 0e_EF/L HaUJ,"5vx$ꕆٌ& S>N7bdVwz"{] 21,.e5IFr`F'%@D}}}: `޵XSJ̓wD\TJ3cKl]Mr_]JmT~Dw a_\u]VwtP܅=LhHH2pŭrwʙ̞bm[Є!3HUHSBSNOk# I%1d[}rNvC5ԔRM\;~y01b Nol9HDW29,] [)^/HQH@ڐCЊgS&&ZSSAA]j[gu8N4plh7>ڇG|@ZgQWp׺-E :p}6 lf~0d2L%\[kRhjEm, -vP*#ڟPo'I)*19ж7{xw/9`:L~aO֎P|mP"4L:^z@a<&j]6t;@x(t7'^9cM>nr]e!$zxF@3@ E]}ls BQ} z!~ȏr,s7A0`n3iN!RkTKc"7a#l 瀎C_*MJ/PUfh*, ՙ -[g6[Rqd~taX+.SE@ 7"#y.'5}0Vťv),J7kD}h;}eJu,>NzKs'f6Y;/q8'*+|8~T< gr| t?'8)hw}E1,]-HⰙsTM\~ b D#HYf|X{ _ C$o`69.ޱdbcTT)V$Y>~Fߎ&] 8s3LFL dLEpd!:;hn2lBkAҦ*\`cCդHB&P5DjԤ6!$V|`6DؾSKDvF%.; +н #txc84II'ai]HHTli9x`|6\@+@M-qLZ(<9G',0*0܁ Vy>i3?,+*p@A 2}&<j?,mOO:U&Eǔ]8͈>vK&%kB¹pAZd@wgi_u!Pҵ[Md Mm^`!sI),,p,a Gq~C΄LU"XG0ɸ0o8H]$jjf7uSi"ywW@ >*5&៷LP2~gչ,` |hM#;6$w=GCOVj >0܌!n:?XMf2!f+*(=Vw[C1or̙"  -|"AHoT,4PurgEt#PQz}uS/X_BX5Zӥ:n~xU 1Flߴij"- VL v{-6`)$Ɏb"?{dჄb٠T8\ɷ/z3fl,!' nr^^Z%:}\q'Y=+gGT|FUcbmSy?pxNeߑ~꺸AXl9.߃s1x6I(`hrv jR(:ԢbCSkW'y8-jC}BRwD~bc@ $9 Xpܓ*$Ev]t7ZI>0l͵M-5L]L(?CQ_QYWzr1*Yʙ4/Ώ3QQsxTo4?GZe:EhFOɽ,OI]8^tRd&};P4GOA ԡ㨄-A&FPH piWsMN'OՇI& AVWL^*G\/E5% sZrێ8 ً |;?W4t"/ia,WH T^sd{F{w끐J_BZ]dU]s%bOKabJGM[HZύ3f xW1hwЁKq,XR u[VHAJiU>n ?&Ö/X6z_3+ LOd5:2(2Y?/ 歆DzC}D֤dӶԳ&&Z>NΡ|x^ЀLJԳ)Er~nsuaҫQ}`D h]?UJӔ,+pDŽ?B? Xo*q^cJ*mK#fCy< ʹy/9iŻy< Μzvѯ`esER2!?\2}Ԙ"zǔ?5!g/Sf/YNx[q1d am\O#4JnMv q{ اq[` IBu \ʔ "&rg>EK5jWmܢw89b1@S9ѳWwNwQR)oY %ډiaR\*?P*\q>:F%Td `'VHFus':w2C;[iQ ,yZ+$Ԁ5,SH'tūٛ?P 4/op`'\BVԪ A""HX&ũ!s7OkeOi<P |Ǔv"qy]D=,wXMEj2*9-56,ѪbHoM48K. 6nk3e8gZy4gɲJEyL4!u69)K yTՌ_y*#*~"vQݜb77c[Twy菟8ZpLܸD冊C aW1ͣI >x=.tL΅iC'XϽ 0n"z[eOYJ>̉ń KEK*9M;b={7zod ,HSv&rXvǸZ fPz}tL b-3;LPi 7nl7, ӟrCBdl[=}JHSkd/$=cR1Yrt qpV8wm>V/j-\p|nh/b۬*Jy(@m˾75-_GP0\Um=3Gߊ{TU,Q,qI6In &')7qpNr ù1,SG ]̤mY^>(5M\ NoxwFuי5$伽)̪:\~ C;:3WmB= y~xrE.}hn?"[G S?N|LCJx5pxV\kX9y뿹RzNGzJOZVH!]{#y2Z7\(G3*2 a- #8W]x,&k>B[\NEJ!N_g~k}2ķaTP9La}}|S`+Ҽ,Z݄-vkuRn0zgϙl>R}D-e8t'|TQXj@2̯/)j^%@XVt/uE@-T}QIj'CoH5zSNkqnF)pmn_Eicn\ ڴ枞ܙ$8G՝(rȎnYOUxEMb7$gƆF,b&> tZ2K}|逺,@y~/ TBIP6x |+޼>z]_I 9J3_U[=/qPhKv~~FCH\7.eCpztʺ@:%Rjbfͧ؃ $묅r\+7$-+6_I7maLjMО|?R/WL4;|U7CmrT~7; Uk8r ?WHV"1 #-7꾬Z=2?Nq9?OW꧘Hy XP{C.-%h /^?%܎H4 mZX7`i=2r$fOѤ=I},? ىG8nrseNc+('95nȁ;d$Eap~AB₲UhI6kA22>Ne EfxF;9osq{D黉 rdaݫY?PD(gp| ]iƷM1ۦv5Xջ8oN+vM2W$n *pVO"?nSzG B-4E /M" X\^TJ+e^qϢouC@cs0 FP2G/e0еqEZx~ v3P*EMpxnĮMv6hBѕ,4& Ge62TTSV)j6ݶ쥬^dz 0TNG3 Dam}%\CADIL+ab}%_ c۬-ٍv]~4((KjFoM{\@,7ջD[]~%&U;/G|VT0 K}^fmvıg3UA?*xZ)b"d]ro9kV*wL.+6 N~⥱뺒pI眐-^DWn*<*eZ>2됶q}7#Tj$kInVK:y f([e~g-WIdi@X8brB:8I>MuxMu2HkaA F/wd~؉h-Y}|; @$/^BoY  񄋠Fi ZnK*f`|T”iYVymHz *=\QZ~H.EEt|˘_ xh^x0^dǷp1b?mH7ofz@r y? .C>we.Tvn'DQÕx7J\P|⦔i GoD.xx`>OtZQ ]|r A'gф7'nqNvnB~  6xmenpI ϛu6?NF ԌV<{e&zVr\ u:ۛrЖrg7vI*{#G),REhc\Փ4AL|Q9گO79DyI] , ۈnqX@4KZl{6*0hC*?GWXk(m-\ẗMǺ3ik>5W*Dy[ >0f('Y3Iz~ aFj>icIG$FHU߽oE廯T{-yhU3@ғ./Cbdk\aO7ݔr{:͞6ϝ/oWm;9'}3:tӁW @GGp-mLZwm眣CѺȿЛ >|L\?d'xKC%P^.bak¯Ig@7zH=y߲sj= 2Jc3 S0XTdQؓ ϴOOSxF dy!Fr=Ϲ~ -MDTlb߈c"~1f"/=7fU ?b\,~pjdӲ^l Yጯ%VUowZ"jŽf˖ױ~%nUBoad{й$ &n7no[8Y>Z-Q"W G&߉vN٬JI=nAQ2¾ugsS\Ū83리&+Y`Ι:LN.%RKyٟ0!Dq(D߱鑫\.D~YG|qE< ulV3}R  v9J1{Q~ tؤMG1_cIz־{:)Gov3sMiohfUS}2F*IrW|6<`^J ^wyC.R+m8bQ+?vҥ 8m2D| {W} Ph V"y#vvL-8և "0QdYYNdxB]7#}CQ/aNAa=x7L߼!寍[ri"Ȋ'(Eez`꾣a ^ޟL}JZe^jZa$e-EmCzpr>3#_BjC}?fuVDu\4(sSII,N+((a%'-J%lϚR *+!1;^׷ έMF=t""qRD V a/A[ Y}ZTmcBTKZ=f biß.VݐY̏B;!4DI@Mx#kIo/͏TRkmHYDؿ5Eߙm vnkSۖjWUamA'"?F<,bÀ񻟀,Bd^*J3@!LCwHuRrQIrKv;kI5}Cy}lt yjyEH誤͌SRI53 ҍ(C Ob,2M \\(-TCzDht#&k"5Mm{-s%69t@`[K:cJg6WW(Y4n ?N,j .-X&͌p`q{ /ճ/~<&_ڃ/R9"/-:!'sqʎh1q[}V0<( 4N$o,i/ {q[7xbQL(t  *Zd=Wұձ9kTqO< X/4"Mbɻg{g]$F9 9gh I]a@!Zi&Bj`alCB[#,Ǧsv;d?3Мʅ4ZKCOM(aQмIO Ji1#``ƾZ29A+eT'+p#0^ ( .XGb)KOɊwgxA>(H'ėN&firvOwneW2:qA4ҟN۹/`C-lҮߔm[" &xO7&Lӆ懽5q)"Z.#WFrKEQC" ikQdv*ʁjw@pJ'!G+1Q@ BTR ~l2:<;>8} %W_9Je TGer7Y#8a`XM.#Ǜ DQV @%we,i%J]IQ4.T3v4_hQD0&wߣŚot2u)q% oQRF6ՆO8k+ZT3tXLpUmNg58m;j6BQO=Nczr׃9`^T}2E:Xێ"?tʗ'XHy:J|Ηܝ j 2hgt+ȃ;-P!P c::ޙ}:Lmx9V}Í}0ދ| =v',ձ+g8=#u *M+-H$Ig*Ds9mz |@䨝KVDh}07|9Ђ.t:YU,雞 U udbձ PEP~kOv5rikfJQ$$iN нNxxO5S_w([NHI7a>3IenEdh!4MDǷѯ*><{0͸} +A*N`JC W_.K SX)1OgȘǍԫf*w2$,5L~'.jb=^+`soǠNl hڅ2zb'Pc+,d#wvGXOBº-MP7(+ V fDG籬zԁL,N}gOXtt/j:^v 4`,T2汕nKs7Hy|*"Nw!pG B0 :\ f*(ʛHsHQPgdٵ#DwPs;v(,BiWL{Ʉ. ?;*HwE(Bvq>iJPKXq j,DmUKM@lGGG8eG93;Š 8wP'wAa@$a⪲qd]@W٬^.O", 'Katxen(ZZOWoq()oQDZ3pAߦ=ҡRo5Ii%ϝ4qv?ZN˴X,P4YU l՘M1A++>MHutVJν!J*@z?yfwkKUx\02n;>HSO)u+:iZ˹D3)) EƩO?iVu=ӐP nfIdŨg ]* ݳ%9EJ?vdb}Ou% TW^z:]qrlR\RQ)w XMHUMݭU}^XR` '+bP<L IUlGv1-Z]~lX`sP# j Px}:6u<[OPJGtR1E:%U2 ]eWٯ غĺ %ֻ3H-t:jH-EHQQQQ$8Gt)hؐ+şyF ɥ Ήl͇6sWu}7;W߿nl7j \VLz1KL]syx*Qvx@cs}t鰩:ތ5i͘Ԝ@#D  7> Bc;gvk*Nm?|ϧbOQr6pp=Fs .$d 䝇 +(]7e00?pR 2_cmA ۶m[ضm۶m۶m۶=}ޯfjcP5UսW+Y鮽4F[ Oefgdz̿3[Ԥ"ǖ)[vO܋o?,~r(qδgr^ 0 b2{?݈smUFp*VovfhF)O&F Ϩ'fn)#g ~TZ23=;cs-~h_8X{D4q5r-Ww_l 0$xvu-?s@3!>eS`$W5@\j3*踡]ׇ]824с۟`  t 7FIz:`0@7p=Pu@o+2o%_dBu9\7@ڦGh-=DOw;B_Yu͘v쯱ev-^/Nm^B|b_))QŕO?nΚM[[KUW5>\wAc͚6B6l&4j@NUUAXY( ȮizvzP68:K:3["^"oZ_߰bSec=YmdИ ɪu.茜oeUMx*o4p ?%mҒha''H2֒Z~"zycL[,)4U^淪w9u4i2; i_$ | ވ_S(Et__$;)*uXս^Ъcrr%aX aX%I'#w ҁ{JS{;J5.GNG[5i6MVETŽr8)Qw\+e뢅$h:Xjڨ縦pGOXO`߭JZaN꽔 +f}߀+ 0j_vu LwqO| 6(S\R13[ YZA@ONw75p0ssq425򟒑d``bcbdf`ddaeag`abf``deWE>#~"e`}VW:+@%!7q{H{q 'h\;_*qEԝL Mo*  9W12K'2xwTUsϾњV^fV$7[b F:'XSD!p8; (Ap jB8!?M,44,Q4yFa>~{Ksvvn!抋₇}{- srfQ×kA8}ItGl⻱lc #TwD]:}-{k= V^-ec + i=oۭC0`@Xw3dz 6ͷ+Ju]fuwiaV OK꤄:dwhYS \FI;N$*U =ٟR#Fk춊o>rZYK-O#FR RL +aGmm<Ѥ@O)#POMDe{rġf~y%]uě1 NLeby/QIlasE{/0؀: yvˏX_ /^1О \&û ^WXb ֈyo ʪP~r-X0a<`]{-ew4zޅ o+b xvN}U:gJB+`/eo3xa#ṗ#RF<݄͸pڷ)yl6_09|ej@1 3,&0!$my3駩MBє. s/B@r5ɊQHa5;3j^J;-{3~(U ލ?mv-Μ@A@73:6 ' N38OGFW೗|'=ki$E:T%hU)ˬk5PM #|'Cܴ'KC7/H38] rLf|a!G#_IgbD+QI=b'Y&]*s kl0יӹWܓfT.IP!:F8ĢO ch_MRģ4oS, iLb`&\kBQX x zAI(G>&6ԘW;_耹CCDlzd\6_mbD~߾/?ː\>=ǘ_q\Ϋ祦Go_a>,Cpcczӯ#?q㻀l?ӀR(?0 ݆9//5 W|TywHd;{N ;`)]OWN,f+p?pE_ݦI Th=o98=7@ӯ ovE/(U`97IOv2`NJV#|FԟHxYh>0,5_k?/oo4ߜ,́+zvϿoww}a?;Ӳ&c|;O0WL4 qI,hbOi?ļ%0*f@q|MNT~W(~Pw$ߟRށC? }IF-I?Mڻ 3N$/ݸVǡ_/Sl˞.{zZ<r$hO8m#Յ>Dz<~=겋Pۛ_C;v'x0ICp)=Mp=K9ߗBK>[텟~v'w} nm2M >یlLV}j6s?QJPcw?-e1s@{uT4D&7Ί1o)Ӽ8eeW-߳M`FI8,)ސtcd2Hu,YzjH$ 0}@0k,:M߾/QkS#;ߗϜV\_>)<]N>:}$ᡑwz|n~#i:>E=8;33F=;!--W\+1r]We W-p7OoH>ЭҞ]k,Z8؄gB\0Z Cח m뽀}`8!ly{xnו1|01]M8#GXeԶ$0Jzϔ=GgF]N纶k* Y#e@]f;Z`9Wgyg&gmPwo]o$d7[b޲X5xeK{=2u{5#n)M{+6=r@5MGʂ# h :X\6G`S8m7[X9Ox:|5(w^^(%)a9 X `aG>Az TjgyRmk@i:x&$B܍kPEL"" Sh@2H*5 ]T׸I|T4:55b@\ Ć 4tCJoVcf몫~:Lw@H㜋B2?UG#oHccI/DĠFd w׵bQ-79 ,C8s!MXQĂ Ylh4Pj}d6d9FJy0eT!nHrŜ@W#5sCq0_W7XLў{6Kٚ&9W(S$&CꆨGh&(e(Tu_mNAMB]#Yz|@HY=͓J`pY2Ja_˚^F.-e}rh ͍ueqi qU* å7uְIc_06QÕUN0jhiXS~L1V]LS}Xz()0* -r+' Sf$LM|R+zBGIZAAtDŽ7aP|4HD6/JY܋r8 u,ȔjR)+y:qN[P*} D }ruӫyt}ⰰaNJuHgtt=szqW^`^b$d1y}WK;z̓b/#&P-H(-6!˔*pě~UbB=/YX6#>ϭq]'su/,nKMJ(r\<˥j?yk]DPf]u/xk+g&zQhVw*wV.0=Q8U#-KP̶_o} ; *0%->"#,@O(7zm^Mţ:{X ue>-@y/f(w\PCiG헁ᨃZH+ͱkG@}nb?g 5I4rkéJ\6Izy:ɼF-iN5ji2H z߸2.ް``B>p+"fX} RUmd\{CUf VF $*SwD+-"4fPLoǮL7]cӡ[]/ g{Y-ZRC'*Vp ӽҵ..'rjø0]H)_7p3P(j;я_Br^gc /lwĕJH_#!,T[&EjӞm;AB9i_^%|.^Ha4Fy,nfnYQTQCT,@h"sUIs^2 D|{NB_MYhF%KQ_CVʋ0k tXR|Qr  سHQ&M2DI.TXֽT|*pS:DtAQ>z-tZ_|JPgNTeuZ4u\(ݦP3%?+&M[<Dk:cp: JH ">8B rpƊWZҗ;_hwVéЦȊz-ie݊,PQc-)/LW3D4[m~>"}jPAӠ6ɰw}s˳Eg/k}^g>spg7 *΋]<"~H.=? 30׫ū6p`lZНlsXY`⌤iy1n:\g(|/ &9dˮnݞuUGtfd@Frw eo8%t9`p* ߘT7ȨkӾV43 c 1 X}Vb@]Gc`ja薕T{5Vj%Ft?iϜcԷ[w kJq=NEGmͫeۑju;]JW8А=o-iDMs*t^g&#BLZšI noGLTſ*zڮycQδ~[SkP~<@{}ԥ_3(mض.\jhGz3C^R/.G=Ѧ=viӞ]ns?AƝQy]tmWi;+#d솝܀OF;CIs6$`8 Va:!t;FPk˖7?7x`E 4EWy2 e/^ Dp@2=vf?YM lYҠq q&8*g6H]ȦYӤxHQLGwݯsNsR*[xN ɣ*b+y7^pMsH F(TcbLE_EJX286 ,ƒ,2 p4T~{#!lɝoftuJ/㣐I=$j[ rBaD9q{[v+Ɩ'v/EgUPּrO"b-0cy-/Il7LMsr0yӹ~9s/WzTyKnfd7-(=|i:^cmUUMc/-ߓ{:Oi)79QvK]LAq]P^N^۞$?*r6 HF{iYt3h:sFhs~c&^?jFu'\\x!C3W mC4Vᅿ`rZWm~v*V6nZ6idžq܌ U? mWk Itj]Cس~]?/[`[Mc_0Yjhžn~$yy岫~ܬqjzZ0,]x[v44 S>v?hCI:ﮜqݱy549]7+o2Kϧ g0Qܿz`=Y':zf/&6&. /7oY@=Ƥ(]L\fQcc⧫"\9#R @/<6/.2^)w9"d \RSX_ͨ߱1?S/A{Wj[Č [;_.tp7Ua}m9uz~#DjpvyY<ɜ=> Zq>+cv5Yvc_#p[V%j.Jhx\I*E5s ;Gyc H4uHfޝ8ﱪ:(9AɯxUa rh/'aeSYH}R8% >F9TK@vu$l{tWbuA⩫.#0ܫwZ2|L =~̝joUyu1ߗd7Ц/t>4d3how־\|8/<ƎqOpYb.k{ʼ;=7*H(CM |f솹y]߇#}zօ2c#uT]r~}C|=F7טD~#%/K4y2J4yqb i'>/FwBsȝHwKo(l.Wl]Ҳ]'+J_.o93cR`cv_؋X%^WQ,'48ެ%LQ&$[mr*Ǝ=:+Fk~^ W3mA P[LsˌC_VzI#SOz0UoM5NQ |\D06D+܆m׃ѝLQi'%}Ţ O6^f6֕i9+}|SJ0>uorv}_΍ޢꊎ[׹KWz.|iboxA_AJ7쥑hl/ ߕg!>Z"ڙe"[n1qpoB e?=_q?]}Ln^ |] |xey= /Nv۳}󻮌s3wcjAWE+;^#$\ZnYkÃcm2Pcld% 9k3ZzH5_ ,9e.AzdlQNuEv_l0S4rB):2?(Z|#{{j?G 5h[SjB/Px@{Ř@}} ^<>^^c~ncݓg BO5sx! Awx.ە>8z٭{^;C0Ez сm1j|bCQe}v#T|v1",@1l$BZMH_[^ ce;?I.d(d<SjGȦ &9wE~!Oj v,l*(?8 gN1\ˆI,ϰRT:I|b ^M,0EꣃɯA,1>gzfD < G1!`/١<̼xO/S2񤽀48NDB@ ,P>28(0ݧb` >  %Xę/ 4e2-in<(4$J G ԭ! 8W,1\s|dΧ dq dΔ bTn߁W@M^A< `)pWIym] V` Q-d97<\LDүx@A$嚚Q@5׊:-;}D}ӟt4`]l"SrSN1Ut-VIyEUIxmD[I xtyd4uݝXצ}nc"?0"(tb =V{hjl?,i"r@TǑPzȨNʋj8m\,DmF5h9(GbȟƲ<5H}b G=J˗)B,,b+=iYeHŜsD`ED$$j:@.* G9ozhҼ:$e<dն.CL!^QK@(WvD0&0A44Ŀ#nZ'A(7 OY PKݴ>Ye; u? zBxAqzCn ' jOS:(>m 1AaB %d1@08 &[䀄ɓcb v sק,&vw/7)4GzTgs-k HzaO~ (Fc*ε6%A #ܘ'wzQ_1uHB LGԝIhb?.z \DhKD޻H}2 F)|/ DZ0kohdc/7Oi5̚W,~_;%ۀL Dp:9}#jz2dFt $p˿Y&&=uedS}$ [q-o1Q$=o ēRuobx5gpW)ePv^b\}d9u5%! c0(kf {̩hp*A%\h}0CܰbmbQwO'mS_,![Asa2ZR1ˍy b5]b&c|rQ&.39Qcu&d#!?TŅWtcz/c`!k#m}#$xInk٠'a,}($I3Cb`(#>I@ `_ψ0(P@@KIT {phb!h<١qUqe }@b#bQhP#OnHVаHd pt[g4q}$qo VΔ:Z".;# bae屦R^ e̎$~[\ђn5WyKl-w/iG0I0 u.f.BtS?IKlgɃUʔtPGHGt:p΍PHv))/SB(ŎI$yiƭY2):Ed,fdKQ|+ hPNg74l?),(]*krApݏv`C SD2.[TM~ó %_6Ld-f 8hxiԍĘ\37҄y),ᙳ.w A $pfY*fK7,Rg;ָ:ee\8ET" d;Jx:(@+k5S&:EY/S^My֓;ݱçDqf }ڤwHx> p:M#;3Cj1v]Vױ418V Y"unk TRNS0d*ظBiYsYS͙.] مc 0@`Pl 'Ks3'(CLFK#}i܇c'xچ:Q>U~lLƀN>޽u r& hoR$ գaA]M'L.TdbM(Բv(XIfZ〯t߻j&:$xCˍ=SL,BDAbIdpanRPᑷ@DB~t?pX9{ Gҙ}~n$ށo)70׿~H~>fv菱Pggx/{?lMnߖMJeٟn/tWI)M (26QI?ÜYg1NbkqT ًbCX'_v_n4>_}-&ܯãuem e0Fjg7-Xq97a|ocoQ2D=+ٻj#g " ^Oa sE~?@@[r_ty;ː5 I5)_KdC[M7A Km5G(% IaL297r< [K[AR"v۝&wZޢ:{m-"ipz<ߨvPRڵqxܠmYv5UnP۔eY.)N~d! ZAg@S#Dq!1;p%ma|etu5a6DZ^~f@]Bk X ^qhtfLB1q oTn^Fk_#37!ȯP*Sd;ކ:$D!Ąqk K@9/xO2d= (%=LFØV_qg0öxp`҂@%" >-\e(lN] hn[!2 eG :Wuvi:H<' !|r_*"TđeQ젿 :Mѣ/0)}3ad鷏j n,Adï|IjHKO䵺W"|mbof,}b{} B^9y^3 U^[ۭQujA$C(cD2^C%N3l5jDb7- !JRibU@ %) wµ;-m!$8ZJT1|am'V E+li;nk>!V!3sfP |QKN c9YnBTF_`G  CD Yth%/CEۄ"TGNtL|*?\:%ݍ4G ݽɅ9Ly[IچDŽqJɬUP8ͬU_¸e*udDh-8bx Xn][,X1h=9c>`H}kghF| =<7 SJF?0]MEe㬋Vw<ֻAO%hyVV'ף}w付SVB{b%Akb92ؑAɃ+N?[yܸ66yI] qmkѠ.-mgZZr}{YӐϐQ#sLPY+~p-bx|Q@Ef8>ˎ$C oO$/>)oTƴ|}_Z 4|7VuYY͡k5L-:Z_ c]@oϷ 'd)Ǫ`ax9w6nuLZ\5 ׋΍.˹d?uS7ɠl ̵y(sXa`Jo=v}Ϟۙk%ymQ8yeq<'-")Dr[?@ ,!w< fcXHU p|exxv2>CZp{&Cm~uyS`ew+ ><_Qi9[WcNA[sXJgCB_<ӟ!s#bǏ[.e556INRBN8ƒf()UC3TS-=H!Ǽ'U@1"j sr)Kڦ߂564k 6;wo(uq_;+"J˂/O̩j^]E5&3v?4!}!*QnVs`F+Zf<-_)|ԜQyy6(Q^07s"xČ]='ys{wa}; ow{wmoCy~IFn( RS试e`dD/XW(3}i2l]"v/j$fm{uv)^M}f{Q̹<ǔqaw*>Jf/w3 (^X,ouɉ¤׊8<fgMr8S2]s/+%J38:j:;ْTv5fEg}N,azbaZL"ou))~kncE^皭='׵9W} N"cvbUJbT{2SC-gO#Ήsw[[a^I9#tT"LnQgɻ߆G<'s׸ɣ1@f ÉP*mn?}#l"Hm_ʇs]b( Pc-(>"RK+Xoc S,NӤfj+: z깚zzq'^0cw@](^?b"am `€ YFV Vh żzroT?S+.(̊Aۉ{ly hk u6_"{TD1왦ڨ1% ~SNO~s^@}jV5v5{i@vY\cpl埩Ʋu]q3qixd]D.yB;Nr-(Z)-l|\{ZI5T.v"vcs毊_:RWʣr%频R aHy33ttc*Su9(-}!ѩ2ʼn%OgmԷd?a4WoK]lrRSx17wlГ >|6i SqnC+%l3೻3&59Y6MBBL&v1VB* #OjiM,OP3-ϓSlGrEZ&wptyغثh¥䘧q+Zy&u} KGwK;]7vvV71E҃Z/mlnv_]3ZG'QR7a匧5GQӷڕ(rKYZqmuĦ5+rQCꊬVK8Vठ'AbKc#%U`s.',A֍|o{Ĵ%E C\Wtu9"2rhS2c%U^[UY㞼].m ׺-Ryܗg9vvxwok>%:A5@uz:ku ?{n\붜tX~])f"tT&(1rury!쀛ΙUtQDNx1o`GqܪլF(ə\w}pIuwR/oXtyj8ꄉֽ} uWA$Zh֕Uai]\Pɕ|~z6cx>M<f^^J8&e}%.0~d(}KVA*H;]2I+Oӂ PۗA=GhA#{xRCXAmb"^WqC {^jG[{Z(Vڒ;+GUYKU>B>{ypHUCg.ɝF42!%`]չEmkH2{ qy~4eU-t m}z@v38+MT5t=YtYἤzjի(uzu0͈T:ZviX4pQ孺̲! qI{:6T¾ RU )_J=[1'Jsٜ?VT.k/*TB- s^umzkKy>{TzJq̭6KyPt[҅W9uKiYcT(,g^  i\]Z:cב[ |B纣VY jsnJ.G מ{I+D@\"v+Hg{p~kH* }\ݔ '-p)]qf/cU7S͛CYs}R]x52=3f]N65WZ ;~Z-޳sѣm{F>#vFZþJʹY[bSV]敼إ:뻺ӗR2wd1a}7Y'N )|lXo W]w5wmtS.kEֽ7b[#a;'Ҝ[$%ՉL=x5W}yng*X":iguu+z .73 CWeK ̿tW3jWI!eoǷVv_;ܵRȝG\bMm.>b=f<{^=chsUuB2w|2X c^E" osccjW_wUyzm 8`đd%&c%:?>4Fxas4s|_?TiEY:C#eޔV"YePj^M|jf; [nOsԧNw{<.<}Z[(vWK|rkjf/X=s s3覬iT?W3esuQk  j/b߶r.cԨBkhZD?.9OEq6+`>H>JBMw 2UC@]f-%_Y|hX ië:u/:HD=*9 .1}V}QꪨJv !axbc\H?kc؍RXY VmحP?z2W)Ck>4ǬmCԪY6/t^&jR(wM3Zar|kIk59/QB~\>sbB_!N:L|nfmVU>߈ڝM7ڡϷ"帖&5>pqy4f,'7njC+f׻UK $r)Xc떻Z#*?!ŏҞX/s^SWtv7Po;}+M!U+i)kq+3/c~rfAdD[Ed]e8k`l >N[~ā j%E:;6Y̑*{=٘N,o/*T{SJ%>̙Wc3$1r"MLtSSV+^xKz :VuŶn3f OIʔ2FSL1f+vh~q >=Q>~Wގ5FEᙩQY%W[joɶp͞4lkib.ةnVbv9RY@\k=yQY @d;tL$r.Uu,^zPm,[}]!ju4B?aŸ qh՞낛M2l5ֿ8ף[3e?gĖ`2NZA[{ze+}{?*G)2<.95]^AjrэoO↠#_>J2WU_P_>:qLXJD|9[j=|e۵oB?t[)+RUNwn+a 7M3;t:8xy5" ,;rI1yXƛTIj2)ʝ%cB;`y|6\ZTe`H:|\y,V؀)T(|U;Nߵ3Q+q8zސw(8=n,2>풒9abSNnPuB.KF9SΩ8L[P.=C*JoH8X4L$yInw ]xU a ƌ 4/M-ho@V.{l-ǭ*Ssϋ]wԙUh3=xyt0ZT"9m܌1!4' ]2rmo+>0>ըt4ncË]Yi%$IKjB_mҐ.|#ud %=δt^'<${ _dw *Ң{q >jzE\su.__;p]ScX86[e;ȱ/'KkF=\:8#Qvzq5Vcv92o m;7cqtg3h^,X9-,W0|" {'?(ƿݒg`n3`@>l>_n4x&=:ڰ&Ƹ9;wx ؠCqvzD/o0690*cؗ/r?Z|mX1nԹnpmH2 WS0!ߑ(:x:NQ,XE sk}0-돻%,w{ A-/ǞlHn{Gۢ-[̬GW|b?Thk@J, /~bt;A2nJ.Cn|}.q`Mg{,NJp/n0B2Ki!~0Q|òY P>ӭMA#c=#Y <Aerh(a?qK~^K}e|y"y 3`|Ib>I"P>7c2 مcb s+nJi4x$8 EYkEG>-=hz$p3$q#-E DH> AU srfCz+c IWTW)L+TAx,Q"3}1$^Fx+7Mq$ "GANII&C}(ֻpjwGreٳ _e Ł*KG6Al%!)!ɡ K`(˹+u|Vce79ExpO#z</&pؗ"+@ȳdh,J6@SE$ K$Hb_D CฌF C2e&:,Q)c\}_[$Η+_0dXO'cIϡCb Nݔu@B0Ղ&r&^}ZΨY_I 9a?Zb$AA~੄Fs2۽ SZgsZK$Jq?jACsFʱpSgy(i33rb4(D~W{Cٟ[~1_=HO5v)=kXh1Csxf)z`Px #[(!rua. B}uoY#(%É 2cQN#S?A*PAꖥ"ͲaM6!(RDE'T"88Bbs ,Rl,1z#(WDk \qr0| !CeN` vH2yA 嘙Itsk( k#a"ؤHkۜ#[EAh ,O8^{fwMcШ%6ͅQ :UB$A@#WhFp6W80TƛM- a' aȗ#SvΟ5BL8f!|+CZj*f5S@? Qrfٵ"'Tعìx?h\c_)PI߬9R 9y̝/WzBKyb 1$ Uǧi DSY+`N@caT-79@1 3p9R> sd9:2^RS75,Nq=SvU ~znSVVyW)١sXV AI(+UBYSSk! +*#T5SPaV>_yga6z#;Q&u @lE*q0Ϭ`RQV^~VX6JZ=f? ee:_C%RE`IxӋH"鰎kXi)S7~7@,r! >t™%"IF'JHk1NUCQE+OZr7E<ϓȄD􌵺"q#Oh04Q)Od(2[:x(J@= Pae+Eb86 )'A֦"b|;vyO5sU =]ߨ+a c!1PbpBgc{}~P f鄥T=}i=(s) HV#PpXqAz*(XjzW",:QM,ysyr )yj&z)Z%HL,@ [=fG>wBS`p҆NS!xidTy]Ov":cMtN,?Zà2W E\ !D2YKAiF%!,ou$,oRƕ"YC&F)49SIԇN<>o1[|32:ƛ\€E迖\VC 0_Ө}"1 d̤0H[qgCWx{b%\+=]"EAf X}$``?ԕwfF bIQhm$f((ImiAk [fl9^pA 9 `7>O]AZt/PƒZ&I5tf/-'@k 6seǑc@a@YzP&vfR b:!SW$ GH/ D^^5F ԑBYb^́y UG4ȗ`SeZ r5mjêmBz -`ο? ȭG2d3 ",C~Cˠ7MQ# &%9J S COeLS@dzHT(INh(7j.Zfq\U ƽRُؓ./q'&vȿ R eVb7^)-.p 'G0>0@BP"U*-/G15XlNN%X*+x>iH̩zd?}FdaGB3| &oFo!%Goa$3!(_GL+L+0ruV]08 ׽C%ޑa\M1MYؑ^ Ȁw<`$1R_W)  .jbsB5RNÙI}:Z&c}csT{0 b!\498Hd07rr&9P:tٺmeHo_DX7` +ݡɍtP7eI]xKME9QT jeW aLCVq;7,X@G"P5xvR"MP-MzƱilҝx{f\ϱt+xŇ8ҒDe=3aG&2ǁHv1O!O0@g`Fwokda>-s>|vae'8iI:?3N[`m_qBkOA,yG*Hxg*]r`]6'l_hP RH. OvEi}KLl*OQ10Ŗ SKeLe1}M)$o0xicz]QH 8|i/r(p䂃~OD (Q9ki{= fI1AI?P}+S."Ve6: ,VDaa0t9+5Z9v[hW{Y47)sm1b;7XCbC|1xxM=0*KY.ðLv$ DpZ5(4'aYa ~ty|d`|h3U^U4G udNU eE,LLsX‰*~Wa=ILGuNlƘߎa^LJȣ\CNlNuFi2%AKELJ r `_yŒ 6P$SkpYD w8%|= ]NhLBn"Gpy!0,KE9?A :b<M.̖rX@"<f]\R=0bU%0,I6_?]1D־كɀK8sL%|htMIR8O*,cG4M8ަid:`lWn,d1+x䊟UAFR!W(F qUSC4!m!#Y#:f^T9`~(h"$Ň%cMeωo^;_x&B;lUE8\@*mS-GOCE^˰ǁeWdgLK RȄ-HT|M먄 Z};= 5k Pr0s?1}ЗX{E1ʶ~VáURM0dAM0M_&\t)wU- Xz'D둶#U[!X-?$.l nP C~2xq}S1ǨWܓ:Ͽץ7C2ϛaYOQ|r*LFnf׷Ffazmnc,o'U* XwwD)Z_+\!=!J-n9m[.\il۷HRfb " Y'K.ng"P2F"|2*HCS=Tr($W{ ad{ri"bQY[ZIYcngW;F!3w'<* ?8Rۼ/=1`^=vK4up8Up8]h=ZX<Ph%Ё<ؐk^@wv,IR@X,(v: )84:gĞnu_"rM RKl0(Fceu'E @-6킣@ cSj(@D7+: ho+X r 4 ~CaJK5P#yr蒪 xVQ}n\DX\˃!=nƟ?+‘ Cb//Ѩ R؁8KӘQii ʃ@Jf1G_-=MB4Xmwhr, 6X1Ls,(ita)𽆤(ĹRdٚq9Q|Zo6Y#NScˢp3+w4G *5vto6*0K peP2ȹ$ 5 P)BT50r+NUq& SbH(JD(DPRU1bQb!c *j$hRW*ZQ O͹z:4f&']Rd $:U:2{J-ua}*%4TChiXS|uJ hr0Lx;z@ddu S" [MxjSy t_jՌjnYlĠx D5hOJm8ӑ24L N|K :ԔMr '`& |p"+پjd=:B AQʻWc!<4ሹۥA6ע†#>c%M=? T)1(Zl^%Vv. @625B,K}T!ef#h@ă)!NꔋJ5H't4]9SZmdqg `."ԈdDq?y}֠kk%z"cfF`) opH=-aJ>:OUoYghc^{ѷq'Ku/lvm 0M)J?|j9[sCmQڒʩ/!|OO*_wNoELI-KiA((  ;FqW3f V!#b"Rz{xt*EژڴJߥH*ir K,EqH ZF-LKwpo3pɓCLMwGTK;zj޲j#0Ey-*VkxݑDMY2 K(d\&WR4t[py^B@ {_ .ͭC `uCɒpS\@;J*Nxbpt6XjC2zuj;7\N[&VulB%qmXH>[SQURM,9h)> \xg]v}ˑݙ9 \/6>~ 1qm{uet$Txq8Z BY; tHOdFRߵAr26mE*.ksWuwqz(tW`ؓ͠Cij~·=Q3!UcEgGFpS#29S_ G߯a1RT^Vj w;w[ Ye@҆a'B!Fnl Dkܲh&gZG{(]VO3J{7=)T>=Ǹ>?WHqj2!1dc2$1x@Z*]U”=>3ƠB` `S_xwwϤg`i )*5r)y?-ృHO. K\b2̷H[C~'n˄[;EeONh+׊Fz Ia Xţ5aEB] c%ji(vjpjx?1tԈ{ÕHD_PlvBW5-,7`Gze5 I F5,eEÇB{?zT ~l}\3&1rq[;Ǣ?bRBփ}P {`gyXrVyy&s;>VkYC~<4PUWk!J+'фh驶2̄z>cT[4LUzK5}-m7RuR&PZfvs|wwT,n(<͍1kY=Ǖ3g6v&\%ۊ7mgO+ KEvnmkM{B/uuV-c?~6ז<>D/}Z׋NSm/͠ +c9m"3uUJ}oR6W5EkD{/b{y6iS%M3|+J jwsO{/KVkn=ZHWaCJ8{Uvkc=uYN(18S6Ov7t?i?L$4JF6#.TN=_vP-H8?51}HoN9;y+ߦ[C@SBn%2wj_3G|VV{2.ZL i3G^g[k_D+NxBیi^'\Cv^hUU>aE%Na$rGsEL케TDA(78!tC%ko(d/Bo7M u^bSrO1+aspe }ޞ)d]ȕxzgeRB8x1V-vXF']Yer%Iۈj =:=nĿ~y ؞j"8qKk3(,lx7\,%$r .f8QhV[~`UЧ4'7mqcQrswUxټk2ѓjPpMS qX tFɾ :b'(x2yyM 7u?7Rp'Pn%ݥͶ ̈d 8G},DVb]8%΍9,+wT'k9bHsm|7$նǟ{{Υ!`wuF9tWU5L*V7?rP^k{j[q3K >#: 8aVF>p\P-QÏm|cZ,?Gk֕3HGvLr7`*-?|$z cҝN R/Ms542wl9+?#'BflFO!ҕ@m$k_W&g7#Qwz fR)HF xjCcra6]ddNS*iL{p>0YQ`ݥD`wǥ, Mqwg2:[CS>sq""@J];cʇ[ xUY~5VTh9M,)*|i<"j:yow{s1wdTr7Q2J ҋ] >L|@7&𴁶\3z|t༼6p.xw2&vw]m=$!*dz%ns4kĞR s k܏-I(7/U% EhcWGe^K<_߾^N|x@i_TS"ٍ(IWMc=%sPoE>s=)-ݮ?@HY YۅS ˻9| Og9d= ƴN] o~6׵/=πW1,WI zΧ<:2 JdР_r,hgpY7l,h5M@P=3Arx!}UwA F݉ -g5k.\wJmcKУyʘɆ';XSF5bzx*xaF;bЉG tZ|_lxXm>` _h !NoG_]@ٛ3^Ao$c[=D'K;TĨGՠv1 :UIfEy?rK_!JF8>_3nΆoݭٖ8g +UWoXEl vNj:5%CO;V[2s7Ucux=7좦&V¶s`=$9^OB"1X>%nE}<_N{W(L2teH˭Oy x)QߺRAi&B([GnCTwf)Zr6/mה3PnvT|)Ȣj pŤhF_I`ݾXqb8L#~ '~E (<qi9yqy'sVtܖ^5_l}W c f5K!G,̐ݕf0'q x4,1>+q!G.@N ,r{m-CsoJa}xb3u)Έ~Ŷ.P)5Lţ_ƥ' LsO Xèʚ',c팚$SN[HJ+YijTTC<̙/jj|įcǎm 2M޲>k.H.;'Ʌ1" <ؤ=Y%5jH}w#lgQ e', -waX˙(hXG>`j3)JL 5xV̦ęz{5j $Sh3xI'/wnWeDOF]9NsEA0ɓc+=1mʕ2ˆ9+h.do\ v6fAOg:&fgڎ#7'wuF`F3Ajhޅƪ=8=1zə<*'gaW⪟fU)lLc+2̛}FS#䀲><u oQ+7'݃#Df(ƥQ xܠwЦ,7+Z_Dҷ2.l JV^寑z;eh?dgiZNw-CH;wf:B-{]ciyypfS7%^CH1A{5R"fXePqR_ pֳ>lafTI/WOd*r*3+KZJ12Z` h>̈[6< lhXx2T]!5cBmq-K9\e!`.]fB2 qc=tޡAGE5TWup  !`"htBHY3^3 hW*"}2L  5,M<[{F u#kSpK`7D n:.IaFm%KkgB4'FZ TKo$Ks6e1[kׄmd}\ 캬,>fN$ĝۊɣyW)ָ-ѝ1iq@]3JF nuOaZ+3W=qGIȖe .^LSNAsrw!Yj&5&;M<@=1^ql,S1dj֦Ӭ,ΘU_vvG&\]+@DG]"d@UF^U:lr:sO/D p򘖉T)|5Kۍ2R&@Zyj™ աEE%)!Yϕꡐx8Gi/ȚɽVL{*NOHEVYR'$p Cդ*19&?n? 6C<Uvrr:߫hyhȺIrFWg18P5mk60D)K]7;awwN"3Q(_!ųA} (uBwR9H27O0).1[sˎ*(ly!JJ22Cuŀ;[[5ҹ%5cc|xB8%?E)RIh\*1e]sdcT7cA@JEoJj}6ϭhzl7cL)2+C\ s)?H"C,{՛#m?=BCN#XոK!@SP4VٔJ`Pz Vؼ0f0ÃtWCB{Jw=)m6Į4<#%7Տ[ݟ*V'Žq]J >H6sSqћbZ}73 ii'wduFr|ZNQ%]瘍'ԯg6u&0l~Hٺ՜&꘼޷eG}FȈ;Zc70~DŏșEQkNCۥh}k!I٠1xKqE%+RR[NyZ>blӚ6EY-lF?2 Ոž NnL9J޽@z= Q9 z˾IH}) c~ބa >]cײ9aBP>u1DtT쓗"}dԈ)u^'X( |wPh6M]8=_BJ$(@l &XhE> !(A΃?Z l Se9E$Fi)~@;$i( NVJRŝ>',+l}M@$̣ʸ&L.-7n}gkN?,^S(9QuФ>3H("ٚT`#fΣi6n!Zzg ˬATfVӻՖ7ODV K̑E$SO;EO+@2߷c6 E|`ӕ ,Zcc 0O#ʼnp귂LBp?.^M;J݋ 1 dn#Ŀvm!_X)"¾nN lEq.?~>^&MmJQ ݵX ' b{þxk({Vw# ]l7Df s'*qؽVZZ}I`f传E¹d5]р]+w .J=Eו듸 qxd52f}+~eF!c;0`po]<ų&h/qsL8y$''8h}5J& .NK‡H+϶=7ǵs?z=1hRݩ7Bһ g.9jVȓq{8I^jH] ,%~awx ?S-%;k'%j5W|.0&~] fa_iV H|W@?%5?2O!.ɣ)p.~TEm>Mr1EGx(L4_d6Khz^#{B`au,)y]_@F3rog}ZFvٕ/,DPH3!2M </N]j:F#ou%S mZ?~l#>t'˴Lzܥ|-Ym&N.X_gSvU?e^J{ y`Bb]Q \Q"%ONǣ ^7=ܰ̽YXkO } м28y1m壉u\?Â|6ֈa^A A\o>W!~!uz yMl?.x>r Qܝ:}Vg5׵]<}8\o~gY2@"䯦R+TeKC_>-Gfp>Pij=+:fvT6~ `Hp[S[ι;+P.18aq)%TkV֌U3+#SGCB#}`̮0) ijQF1ȜGSc>zdwW2Jo'aQ] ~ W\N3ߛT7 C _A/8}B7> ڣ)`)&D>09O@̗ѳ/ F.!88Ph[OZSRZVBbt;xYu?n<_%_-L*\e% =/;u0vGH116V[4x8&0`;T·!|ߣDl$VE.` z5E=<&ONT _NJX&ykIo=~RՎݝf@}0sy>t _ۇ-6ɻD9Etrø4IĬc_L 8OOS hߒش)fVB]2`wLᴧK&jS0P\d2AڬB ;yNZaYo:2X/MM | rynMȯW|VA[PDtI<~bk$x\st] Y:MF^=cm2soXd@}n &Ⴖ+_d ;*vy*,rZy@( [ =&U_T8.T47QYQ˹9yJNR* *zQMvX^ Xg}k3EGhm!텳~Ĝ] g{e` texNgӢ>3 uuPWډtpxdId$+1s~ߥnSw(F`@uRS!pvh|`s[0"P[`rfOjPz x~X*~>iU)n[ 2h<(3 @ \V=Z*ƪ/ (K5k-k(׏s A ǗúJL}Jպ>-M{́T|4iX|B+X{}ơXr`480w{)jqL έϓ]Oȩ"uۓ5]+C{u|Ϡs)u#M%ZTg # DCOUP}/Wdmu Z(}<|_YjBmW-d ,H}O$N޶&>Tz߉֚@ iy/L=Ŕ[/%c{/ɭë3x>0ãA_3cyO|RW|D8LV^eZfAG G_ٮ__2$ZSuԓSW쩄#m_cF{p襼}О1_[{U<ʠB bzcj#SnXYqmyiyCdo?5] x9znl[Պ!4^QyoivuuޒOlVv5^%w|~Kc8Y3m7ҾSTAJ+zw*Sq!\g)-oYdȤIΙ((A|-78ȪR}[2Rqn;29Lf!@eiBuG@DZS~{b :qYq!q:[t%͵W]s:$ 5NgkWF c\ Sm+۔vS!FH"A!QxGWP޵DPb2jeC`/}\m_CEcr@!ϲa0>@çg;;87y[z(JOix+'H^2z$YvR;2b4*uD53zt_ZlyCB;qv6 yA`&1p-S\W"1JZmǺޜ^U^~~wAtWbDCG.Jp?@OTEp Eh6|O'qw6h#BȫCaq!`d߸gW42B( ?kK| RF9i)_1G8borJ U wu) <uWr֘j,$7? vdVQ4Ť]Wg픻f'HWZm<}}K_Y7Q2P7$0h{=y{@Uz/f=G@e:AL/]1B\&  #@F;ai\sd#-vh]LwyRk\W[ xNZg0s FTwyV&Ivw=I ;iIP|h鸣1 f2Dsffhj{l`=>(0B=p(_oW,XL^vUދP5&W;ۯ.+f?+3BX[qZ xŒ~3̚[܋Or'dHe/x RВN1wL_CuUUbKd nw:UӕxLR+VvW?ӏJ\VE.=iÚ7cf13=~J[lL-Okc8(p,R1 c>k*/5b(xi[#Y\U!s}B{A^+.< <3FÃ=]6e!ļ`l..YO${[D'M~!x1BRO@A)~j@>Du@QElw~EI&ąƺɋCR)ǰ|?e ^] ƌD #Wpv >raG ITU5>o9-W~[\H5J5nl{n-)(?3պ\8b;zm>-n;=m/ϔ OtJw_;)l: wpzb@k#ߺZ#OE= cc nYs {Bi"o5̢>(5r.Gm~uU|r|jzCI#'P_xPY4;㝳ͯX:jAi~y4T=}i^/ m_PaIb=;1_bU_ɺ $ѯZ3 ϴ (d_3Ar~SGmtުi-D9if MثL G'X"gƐ7_~v}>5""QKͻÂ#o0nE&azU@Ǟg6jWZB]5OYyF˹~? >UW+++ jƘsĊϫ6U oc{zR>sNEq^q[rNJ <d+I=Sﬢ|رdd\%":<N-F/YeX2%^L}K <~B_tYPffcx9PenmbU)OuUv0d=knO9$ȐU_bn!rG)(Y_~߈X5­:<y{z)y˿1Kg"g rz+*)MM[TXιx(iK yE<7looxiPBZ(+[P h.-ZKܑΞAMo) 1TS=]sQYhSE.݂40|mGlT84f`/ 3>?* hX;ݱQDհ6Cz[U_LșzVZpoS>$e6-G'X,|:$XZr~owA K9iXrig`y=Q4bS3j{6QDV`CJx [â/[pev!#vpjI%RےX18emlk?X|{ @aKq@$+7cC93O %WÛ[ZsmD^D !ɏcp%7wp~׆)ePu [DlcɊ?Rq­Ī OH8 k:OLż;6| jzZ? {dL5ã]/}iJi_=лnz:u DPwZuFZUxF%Y)5Dl'>fYf 4b*i+r`VnIC prdG/HwGZDJ':8,݊ 5BLbY<|nf32XX Т*(.RPInëvj \]vdiTwD1@.5;&NW|;}1"Ej$O'RE:M V< tSY4GìSoK4p~F qr/U~ѥGJU_b&=`briI|eJ<~ FxN 1Q:8I{?ŒIAXVY.$ŚyB^5h2Kk?(L~ߏͤҕm {'>}fS_Є38^ޅ욺 \ۈذ1uD?]ʼ5r%4M~;E:@5Ƙ@)+}g/5p+scH:@p9 ݚ*m(B6$LL -8ܲEp`=cU *We#r$K $BL%Ғ/J)' ͕)ԊH*$ 3(8Թ/8ϋ~Į?}sJvIa}nOy4IN6!OYFZ_~!!f'cYj"F/>gLw+۵`"FsF4>9n:m8r $| q'?so5q͕M0L0*L(xsu”x'{_tN)*O`#"._JE#Di 2 쌹h;b|F,^0958բEP,}q[?*==q?C-ƃX"PpȚ0WѮdtG,(3CA9K= gp70}Qںƙbٵ9kUтGXd>{Gdp ):t( U-B0,bUB/D-IՌ֋YȹsU<dTu'4H2DM _:C&й*g|҂4_\RO&9QXz"FZЧ?EBwIpMf#m)[*(@2o1.үU PLC*80;r!qȄRs!i[vM~D8M˃/j:5~W^EܩOێxOrZ84t1/WFeeO 9AOJ*ԛ)NFe6`,Bhpza&|i7r09Wjj)j1x/F'V0U_r >_A 0S=Q2 ]z;"tD_SQ,R!-jE 2pf<Ҩ%5tP;ITW20T0q>.HLU o&Td>jȯE^ڹ)I-H=>"I7oM: oW(z?\ƣ~Z`zU.IqNM "!myW[?H?,+e# *NϝCHoن2|fR!IOBZ~[aj V 1KҢd(^' )QzS ;Ѳ׹W%r7 9z6KFB uҝ]!SC^bLnJ4#(P=5O9<A*_r&m;9vEFC}j4;(:$zkbOsVuռz.:׏w#Wjq?k, 8xv^BTSYhyLS{sWWBǭ|n^W(3Uz>30INV~}H!vh &MY|`Ǔ=S.-T/\HweI\+=]P!ʞvn6~%&1i}NX)Ċ_2u7-QlL KNS)9"tvjL(sӼH?= n(z㪥)|C9YF€fwdJ푇E6YL4`2ecqnddx]SAsR?+<<>79$<'Ӎ8atnbd_|ems;9?1C܃ᗰi*MAxxNeF"O P?;5+ExRhfݯ@1pZ" 0 | 2jlL}>h@Q/!69k'ɏrSlp0^i⨻ip|g'%Z^ɰ3J8ᇨc$k5(m fl]2m`q`-Ϫx]FX."ܚr #ۜp:S%i@ @Z鮠x8\23f ;gi?݁8W&t54΄)џ"C os-CcyXP,ޤ+H}>+ZEW13qF#)j'Z>%n+dYv. 7L=[EE]?uG]tXJH/ 4ٹ@fwlBh=ؾ?P}W߅a4A;"!ͷ܃{H4JEaX9({{o?)n}t0qu3nyBo/eT.h\LnTf1jѤ?cmk%.$Y?ͽ*cg0}!2۰αƖHEBW T&ǹ˓h7 {oiW[-,QP)%8g< ~ԟSn t6ǗwupY:WKTq,;^3AajFHvw x/)Upz7> g# ̅_KXfH-!9 m+2\&!`e+͊M_[HO'bL/<)1@s 8?1 v-m )#ѸH<:$$Hb:YĖ( )0 '\myv٧U SܼHb~+.GgIeF[lge' ±+#:8=k:)`/*\o#:}@YEvU}a&8 8Q#ZۧGk^+Nຳ S ۤL$OV;}p&bNIb'5Lжli(ހzvfHwb](pxw{~~v ^#쾮©Q+QyJj<<" g{s<...!ctR {y`)dHxBAgG1v.PXw85}ڢMa VZyǦ:xcYyr:=9_4s{H s$ƒ3Dռ&r8[ T8ZV!W^}oD-OO,D&ae꽈/~~ $r#(-I/kTfhʊi%:I-'qҿ:h[P\{;'cY9H"G؋ rsM͂=1?lšx , 7,a}Sڏ]$o Qof>G^sbzX d8c?{/n?MZ_t;ۂ|Ω=:(sp|+u>V /APDžǛ}HwdoN='VU&":NU9{x@%llδx.jkWN ҅^.wl{.U;YR9?'ZEk@-J독7@4akIP~w4鷦9N<^QWNII vS`jvM>=}{<(P~1gkw*ml&VAKWe'6C ,KnP3s[)}/]Ɖ+ĭ!@->﹪z\!թ6yeXA]x~X S'he+ӄspN,aAHf̭ӀX{8ǻO#ezKoU?{W4UU֬TFmOrR+b&l7~-g:˯P4v LGf!.rះR2JeMitg4cabqx봻*in:|E޴_" t[!_u|Zz`-Y{;$Mx DTer8,_e_Ϫ.D+lK -kVOv>yk~'}X,L b+\9aij!%n>H,"rwb 9x/<[V,:VL^idk9+EhM觼Pj,mJ%|u (o2_#Q-;M3ykq!VR}n BK4F]7 {*^Cb.3痢y N#~4zNZN/xô  ke HD5-F< 9\}pn\jYk4Z9}=L=_}߆d<(|;ZD&5t3/^UhՆ#,`jк`F_[g_Vj#K<Ԯ|9r79XlrJaIlS<ǡOedum݂/xHBW_$e HECz^}[|&[ZbLyۃ/W`Lg- =. P]=@^ ZvٔFE齎d;/WYQtZ%7lg>+nADv|/z#/+w{jOA牘 ?Q>aWM_"uMاxh{"iǾoaۏѱpk{ Jj0L^w8d h 9n3;gzZm"x͝T?{םaj~K6m7HX<zל;k: lr_yLU[`nvFRBi*{1b; oJ |sW>[sI}/nnr1Ik 64v6Mi!!lawP?xJ=p*HՈDn%-7(7κuT#]e u߈z{ǜ}yIn泰1=Gg&]6*8[R.fwYZ B99 F|0jI@Vl˗a%bEfYEvd%vGCc1&3ˏjLe&Ln\|n=G^eo)KȽ=m^xyAl;&_;w~qM:A2ZJxciHEcʞꓻVPmw!.~v@Z㸺eb̿)iyůةK|3S 0c~t.)nR[U$8  +m%5 wl=}2կ} @7u00.δ fG֤VR׉zHbq"!\J%X G;oZc tv)}dx^d#Gea}*݋͹a(;Ꮲ^o.8AL^: )ՎR=wo];a| W<z5Etc'avqy@]4'@cYrU&SЩDȂ7u'hƹd+κE00Iygo%&I5#(J~R;t 3~)!Kߕ_t3-ڵqZ]d%A+i-4|ULT.OiG=kwva& |iA P{{Y65C2)c@:3٭0Ʒ#+)7i!}:>y]aU}MMlx ͹}}h˛B}S<;i>: `4aWX$zd*Ou>D|`wBHz5~B r*3J|e_^+˼mS_r` 9AMf{ʻkGMw R5㤂(0!D&Cja?zvz$8&`ed,/ \S;G00a +SN2}QDl?g8&ND8#Wvg^MOPڄ$`Uju|]F=>[$Cx%c5Kd߁DbcoND($[%~=P5`:Fj e}I gQ;rEICLdӷ{TV/I,f^Q^ :YkǠuEc[nޡS(dY 3-|^8Pn|+ 0q/Zzۜ+dయ{v ]QW  0US!T\7+1Y `;FaH4B;_tձJrw0p#g ]-$")_D6{׾N2yfzi=Up>KŨW:^ɛ[ضxɑKJ9[Udx8|'L[nTΜgs =rٮ5=]ΏVj> tüzO 5i?אװ'.M7b}罹[r޶Wj`G]⭋_`q.Gzxך>c'4ar˚ }C #ax Ifb_fr5.*6$[ /_W&Sq xOA覆0S֠3z !R&9^9whOW|# lP\  yw{C76 ڊ|9uJpc`|;Gca}M&ϧQE8scO 0@x"G?c6#u OcBEo5Z=wM3ZbTPe>a{ݿ~6iesMȄxN#*Ќ&T L0en/W6&cz0Cئ"4-)p֍co 'oiUu_VcZp y=fAA'}WG1FDe]喔3+;PvU҃e50o݂:ۈ:R$2gի_>|+YsOȿq ’wvn:䟞9KL JX͏kΪ#X3SPIlgiO[@UC~-K`Y{@a1E̫mhsw-. 4hEmOoR4ӍD fm Xjk۽bp4Vzqݢ0!4FFҶ]Q9u=y/sq~~a{5~ͤ|K|Q3L2chúX(J_f/Tھl0 7'ІeN ͎J[n|+>SxJQp*<6 *H-sG;z_&/׸%MiVS\r.<ŜN1Ec`%wշ87lgZ+g!sֱ1KަtޔZt)=6"K.f<+Wuu%xu^<&Y;ۗ"_ww~e + }  ?O l[9 8E0m<=?%]=x ˂%Rۉ㪋C_֔q,dxn;"pN:.|+:\fjC͌덌\z۲ ok*!w. ׵yG hC4N (} e"m*.}mn C̴* }էD6cqHc|ze <[]fc|jsqUqEKbGm``! G EO~P $բǫBFod8ݯm*x_sYZ yɗ)yp<\zgLv֎9۳__?QE`4S hl.KwW.*~y|݁%&3pHL` w;y!Vxh\ez[EneԐe׵j8*n#{2|^$o)٩}Œ%Q~ۧ\ߝowFd_Tw++OcQJ aXUsg靎?I[3e)#YuqL^x9HlKOUނ >aШEtssEva91ϿG͈WJw_`7_Mu'K@@@+=X&4򤝸NX&WA-op!uvj`\ٶ$G4[)%VpUx 4%pcodr'ʉsZ$J)vM9̐g3eCL7UOr12^ԁCc :q X&;8{{ -9=EL?Bq /gQx;6T$/̔J 5rSP6ǖzqT"% W+>۶pp ~)JO':;Ї5 ͆_J G؅>W[~{$2_|goUk;ze%]hGG5Vv~8E:b7 hrx?;ƽ;*ov`;~ޜEe&b|ߩ ¼I# }T,CxCޣ_t1&/  ´CNt=4v³ lwܰœ>^mm_}q3f<& ]߻PEt^.B#@w]`U\W+dxbSJgF$7u7!p'!\tsz%z\U ~a!bHfev2 p?~9?w`Up h hd;~1iS_l$oۓ HpH\ [DƇihn߇9[f)@L*X摖ÿx;#X$nTh|bcth]>YAiAk 2H8;\*M!a'>>0eux%mX |laM%pZ+˾9dE\^#v!NS]\g9,c9"_tqXzv'%;j7g-ƠkDZ#";3#=(4~}듚X)Ң}JҨnbߨMte S(RgDg vJmfPO!-&U}vP  Moد*n]_Ť[b^0~_4T܂lSX5N%GQjca?)*Opo$Cy#ﴉ?Hh|Puzm_ne;90d|6UL=Mwm!|őG,~ yⅷ ţus"Nű OQk߄c;/.ERn $(Tϙ]V-_P&`#3p֋IFq؋xad vL/\p& hRFI0`WЇuKPW79! ugGMhZM#XJ?Q`v2a58325q›wTnnʀiN2 ewSQY7ٮTQZ}uO("m*]ZId Nˎ`qBk6>Xޫ![2nwԏS4[KladG/vGIؐ#*Lگ "gb\CS}5_;ul+D0~uYKO٧h;DZ;d?Ņd4Hd&=H>`G{6_ ;hPV2ˡ }\ټ޳AG+i㢉1)DR ^ue;D)sw$ @^`W;秥~<0}$rg8֭Ͻ׆_;"~ RptrLՇ5³3U!i":'[(}0/^H,V0Da?& -L.̃Q9I[D8Ş˙70)W\-wL"]h2SJ4bzYJtyD)֋:XG*N#uB%u/w j ̗JTkl]Ly_6]i_Vc/HI8Ѯ~7c*Ay}7W)jzɰī 1Eqѧ|%D:3lbB*{"@mA[]\,$2dt> fI`)Ҝc=whl|XE#my(\M$equD5 : OuBL<ñ; ղcz ~g}Nu/~]9!2ʣ?+cHWvU~\.gi'ܙC)ۯ`>-b/.!zdP!̫I"=O, OK/ߌ[r&ΫDO;/4O:pB-ں];Džfe$u㕈+yW,[BĒyg]wA)D=zk",vN,t39=i~nzܥB|?ߛVR:!y yߺ-&^\۾\jLoeO^i(p\٧'FNudz/ܧ$e@m,mV$7/SJŤ9zDSG1$H&@6#?\k*r8'yFMV-tCFF'}`ǤMl0!Swc6<gE/ @ *V5U#E7H7#ߤE8Ӄ6 Efźk>EYCJX/T?8H tP1_=UHH_4oC'0PFKO믦~d=Sr~5IU儵rn:Uxf4'c2hs](pn(n 5r/!PQ={mGUH!n sx'A(nfxB\BN5[\fA[~Ƞ)uj1M^Ypg-Lߴ@w䤇%LɃo_R>͆Ǖ̒tox}7i+ 4NdBBՑ Хgz)៙D:6g44bR winAS$*ˡ -Ys]"D-Psi}\؅øB^ yJm]hSǛ78/Ns'㼺 oԫwblhGg:kD$ȲL͓Qw; M& w]]*ޜ9&Ud^-I*v*j߄z+X^GjbS o5 zA|>9h䰫 T}_]k;v1/_3R}Ɉu x W<ܹNuTP}f5E32p Hl{}kRkŽyhɬv XkW3ONL$S,-^NBGW >TOd9Ifݳ ;;>`E#o5ADVMU4i%Tv:^g%$dH.KĔ#<ֻ.1&;||g)Sab,Aj[f\lU%Fuu^n^(ە;Gv*CkJ;#1h/dFixsjikVs0azY-s7îp|ca8>/j_OґIhh;_Ҥ bSy:ᒺ6~j/bW&[ƜIj-/J&͎w<~8 9gr/ _L4`?tTRcfފ?eduLrֱT[zxXyy0zlT WXDZ c<- [氕~Ľ,F? Ù^b/,n؋LK^ZwCwI[eNm?)Uz/p脟>sD8J1d1:9ᇶV1ӥERgcʶ"`k-7]Lh15@sgBpr$l 8ϓ!T2꘺K=})χ;(볨fd Ld 9^5mEJ}U ^M*zv PGVr5 }#KEݶ3D0]9Jr<Ћ7={)[sY(Uh |/KWc9L=vATw5L2Βh;9"|VIɠ z lhҔ䝼s:>n nqxkXFBJ+OU2};h+&$) fWq{Msor`1f(RƷϦ#?V6V@cUCgM~U%R }A*7gOB^,FXQVANcvY$PM!E+-0VbܼYk_, NZ×$5sMi aEԔ>6]S:'6%:Ki' 5ʼ?]"~ }ck'Wn$IjvFQRp-qN^簪FFp~Ki4,k߆8vq)I<̧eOD[x-2]Ũ,tOu>YUlLO-RzMatο`1F4Cl;Gm=/PHIIЎGwU}V<7eUuݷwб7jn+J]u\5(>Jh"k|6YJuy@ssJK6:Od=v{)Iw!I_GM8IG˵e,$<Ly1a 1N/Z=;1gyf^v4P:}6*X^Ã>tkK'9w-,CO,E hOO4w3Q!b?ac-nJTKbNyvGlEnEPWB֋"*K]nvp:8K력 YMP*CĨ-Eu`£c .V6iD+&SV0d.plzz,T\TOrr`H>xdL S8xi >qo /eWKӗ\tY( ׋SIwh4wIe"ȣ=A9J& |z.Wl=o %;ZaM0:f7)=i+=W5* @4m;hb=lYS)tC m*L&aD )Ig|0[|uc-t?Z9-mk+**;ُזIdFi NSFl V`>S%JU 6?01ilQqpDV6 Nd.׸njF|8y'[6瘊=it-^`7{,E~sQg/IKCIMΞ^[ KCQ ='vpu+1 +&z[(T]sz"ݕF N?{Moa+a 6+\hjKb1+ v)]wO0 -]S=KӵϑB gN|85;d51tgFs@L9Qx+'+~ןt mLv%7&+3*x@ƒD]2߶=L[E|zj zF֑:(KG_瞘 Z*HS2Q i\);m:n#&#jq&7sMbor, "S_~&2iA1.3@fEԈuk-sŒ> 3# T΁aB4{lV3x::q SwTwkB6y 487.ֿ 2ž"/Usswld/g>)?L;_^Lsa\~}6M

    VnLFl;N?5{ѻfcefS 6'5PveH(cV c'Ӹ7vKz 76ֶ,;'*b#OGZ&q?7.O]F^sy`~9alv֔D$, W&cx}]HTzsKucGa IO 1:zR5 fΤW찀!L0@Ϗ:c<9fM}7x_)7jgsK[6eW~acN@]yu'kwHu,MQQGLD]v7V;6Է ~~NЊAZّ;{Բ2JmiHٯ78k{Sn~rŃ$:f?ᾡ xU% s W9%*&87"R9BzM%)sj[&w1Tm WG.zg+y,HSTxABw;Y)}#1Do;Z|_V oZ]$+J^m+xv&F-t>J[NqԴm(}!6<:ɔ »/ؿJj{+{fJ7ʰG8ewL'p "(s*/t& < Z8jHq+|aSh&.i"n%HAmsmi>zج/&xo'|éx<з(Y2kdGd7*zVd4JQUSD7l\>kZ[RDl#/53~v;li3@evB)!w7kCfg[1}[Bo/Y[/gSd㉬5klrO8FtPK;}08k$gPM&Ƕ}{:E.EG)3K+9/g35/%u/AS:1Q aS;3W# CoqAOsVFN-En g\\OnЉb4JKkLM/G7gۿ},&ffvf.O9\E,8-9^4,%?ǥ{[S #p8G#p8G#p8G#p8G#p8G#p8_zٛADձ,Ȭ%OG9]1(B lT>a@x@הhVhe8qLw󮡢%9}n9.k\iCVbk'*78((vڳ X;(;!^JXhYď="nP~ߣ`Frں~6>W04MR IDDaO4b.U"i$}- '׶Mc6=Z6?T4'!y%]t?1[7{^,ITz~@Ju϶$l3FF q .^G2u{|S2_-QR (ےAg, 5Sl7:*%IĢc6D,oGSd'` PEaTK^*9z8D0TF&L]>B>QKX:J5Zu+GVPUle8()-C#}ժу&T-5\`oË́Bn0XA A&UIA>=W+TW)sWGޭʏ8oC%gܬN/WjfL͗Rkt"LIeY#k4|rw*bN;٣-TV'8Vs2duzNwFVr~\B*ècNE dmu(U>8n5=%;rԫg@nҺ`W]QQh-ϐlZ))oJ}=ط/mx!!vZõ⼱4T.tL-o|dpC(Qmfn۴e2R0y%bX< U}/7R0oa)([͎J1H ADPx|Ƹ"螡R5l杧ҎŚgt8*9aM/1]2 >]T(.i$RwO]qmQ$Lx !( o|ls-db(7BQ$>q<[Wb3|&UorZ-%H]I5a8S.۪%6;;S=>1k) pQW d`"v+;f}Lg РnjFfOMDwLlda +ẙhT:(vh*ÜaO-3~20a2R F;FT,÷{N5'.ξF ƿjzqV&].h/e&j'}><=~8yV33ɺ)>OYTLեNeՅ`NsXO}̛b6fj&C(} g:•7r9Jl$xjSQg}U#q!'nX[gqQt x% Q N`t6E.5^e6MFoFA퓽>kZs o@Ghޔkh*gKǫtm l2 ue,8(0XH+T|2.ʯm l[5;\ "3UzLx`J>w|}ƖGZ8Kin诿`&;Lf%nxao`0jj6~VeFձ֘!4ip#VN);ڮl3( 19u.7XAn)96>:ڄ{$ >0zP:"X M2A[.fC[kJwd3>d=w=y"7^1F21t+X8䷭ 㮚A<3K8 xқa=z!Fקc4!5~ aN_r|5NLS.ҭGD.\A Έdjnz޶I͉46}ت7LF4MG]#t4&?Z%"&⢎ozA_pKg"0¶DBJ)(XT»"Ή5n;T/T>Q?_^f^e#)j/ОXk H5>2ecl-2 u(/@LF j(Hr.|5ݿ&=O;l2)S^=egwΫ 2zlS(BY99x''y)bO8}G>]9r\M?Xrr 7Yڂ[t&+3C/EH}199 'BvV+r‘\Ys٧jL3Y*VfVR4Z-؞u1W5rMG~ġ|9&6= g&:s'=(AȤ x`sy"fee)*8xeHh[wլyHiRIJhp(б ߪ*eju9v6zq okckeł7o(edZ5Oۚep̎7@\64NhP5;2MR\fREEqI奣 K-ŖiJ5{]-ѐi8f8=L)B3N]GDɹL/eA/epDJ- (Gh+<|C8,XQ*=+WbduCR[%ANgx;_ym\Bƚxks뇙mpbP34YNR$}wL եnyM({úH}.r_]sH2‹r<q[yÚP%7;x!s]NCW`*g 8QQPG"$|-7/&IeIge~X y8d8Qg sv4Bn~FxAfR_!X+AN%62\4;Pva壟.$ޡ݉S^[1sٔ8ns}Llc C_˵9%''Z<\B+ :Ω2";DT oyOMˠlkZR: <qm "#X+G+*s*<_m 1scO uOYثnܱ .O:?bzd]?128k}D4j9zV˪AM10, I4K:lzcg\fZ࿵,0w&kz&K  W 4iwX'rRwɜ蔩s^ }%TdgHNʍ>,onӧ/Ow`OXId1zc\>nͪ~!;^ĨF; ^ eQe$L v8U_0@wy~x1M SKS鯯Wٖk qIG17=j[ ?cqV/m'ۗJ")~8*1#┷

    .Va0{td] e(z]7|#!#t=_ͦ 2ͺ= ϻ+y @Q׋[tqW]4Pi0 ;9\- ޛ17MQ#Ev/ >ui R֖M1WB F%;߾I~Ky[k -Pgi94ߘ2n;Hɓ՜6n^控̐uH|*6^>?eLzM[Ex.d6W#be|p7әWT]%Uw5 Vx) h[#7H7qQXL~fh5N8ت4肖K?SM$Hz-\P4tRp>|9pk3lcIKrǘEz*/5΁'Ą}Nm/t~Pspf czedxfFlϠ͠u\q6L[+7-> \F*k_GEiw핐Ü}$H? D& Sqd̕R67@$yy_A\+ɜ-FbID \9Y }T`WUQ:*`?kϻ:aUܯ?ON(_4 2?czzlCL;) qI0EƱF̂jjp,++rpqst0 ĹmLe AѭEm[\Y RSʰa_:W* ŷJonnnn/W web2py-2.12.3.orig/applications/examples/static/web2py_contributor_agreement.pdf0000664000000000000000000011350412564727260026644 0ustar rootroot%PDF-1.3 % 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream x\rr2UeP@R﯍w]TnݽnmHH$hϾO`%t /KSʽU+ =Cvw')on.߷.q{7?Wv?=_M*g%IϘ?lƥC}(g2x=wɽWn]~zhbY6?Ϳ_ndGETך%)^UnE[輘>Nmf^,q=>fQ/_'~>Hpa5d:h8uz\ Fμe#y7G[c 9V- B?(]bdK\^2tM=Π>)Db A@'BqUF"E3ĖedX QScLq{c뽹x{e d;mA[>)(1Z::iis=Kg鱥զ*aWBwyEN|Xl` @& k߇&FqOP tS\_->\s8ײh6ߒnD 4C*<;Ek)>X?7 B0sdLGޭw"0wU(h1·)iwV/"/b 8HLC|kTf`FcY;|AJjjNJ^9 t˱M14I$&b)u2,Pf=Ϟ& Ļ+pw`X V4]NtҮ9Q2Df"m՗( `fL|wv/Dc،O^h)fd:X?K="ZnpTdۢE_e55-Vf}oE>wt|'bRq)U1k!CtlsJ1sAIhH)F—_L=bt:GpDHa{ I 﫯Ҷ-<$Ny[CcP}' ~SlPl79uGCPu"L@m]KbV9z4RY(Ǽmi;8@[<`EMn]v{,7COt]N/^AnRLߐ!rRY =M5f…?YIϛl7}ʕz|ׅ޽J}?JAi[q$"ɓ! `,gyRtecYNFV HnE2-ck $O5_37u]k:kH,k9?&C 5J1_|qrw~ov;[ I mLYq uVNda$/芙0?q\)՗*>0I}\ w“#P Er*",a&hͨNYR3<5(4xb w6Ra$?Bb1_@2 q]:Bd<2p:ze_JFl_V*.Ϊm -ά8YBxH@6$=_lS|{II)6O=[Hq K jZ,r[mJdcW_u= qV͂< ۿXw ?A2M49ZPLgPUda\[VfbBg2=[ ℾ*ŁՍ$soVX44lUPF-cd-5HRlj"#ֈԵ@T D>e2ke{#tLfԂ14r{\4J k4b-ɌZO'SpyuXk?DpnDO@sxv.'WTq)'P0Ń~h **LZ2d{íFKeO$JLv`'=Pm{}=|t?_YX%N)1:S PQ.>Yw;iա*]azV:(_{yA2H.H R|0:?%iUǨѬG/sBU".B* zx$hPapD[#qЛo;P4d05-ֶi0$ @ 2wDyLPɰ>':L^Lx^T%yp.1TY>$ P%J#`&\+ޑBE~='ʌ̠٢ucfC+,dg:: þx1[I'-_sVcF3 ֔_V0+ L^T9B0M<^~\WD̠SPjP9y;yq[D8g9Mǡ$'Ӈ.8e|7o Oޝu#T44]To*'toO;_;JٽWNaes2 dpY÷2Й-9쓧86F*hn ;b;U[yfhCB H*G0{ ih_ˮ!wRO;%NK'_/MM@!x7[w;vXBuVӉXM(<]CA=8ҩ64f(SQ%ipha 9n O2ऍݮn(4x:z\YB>яbpCdkFwn⒉.;ehBԵƊ5X{?K *q^~HD?w\xy4{؇mU!WNW VIj(g=2ӍO d@8j ϥha)~8&# 0(#^D!ܠ-xlL?X-L{p*7{a4#7).%nˍ  S?\",m0:w]o/! `omobAg*7蘡=螙6_=pe$E?}=ױx+Db FS@.OӰ!n_=aebT4f*7ץйACPI\H4hT''9 Gxy9E`Sgtu舲YN+~pTi|zJD|ݼ. xnHt&$&$Dǒ8vG[,h,s]}rHiU?V)m"W.5EH䐙 [pޠ H>[KgV-L"RC/%K ^"Րiu./t9PEn[#T?>Da৒ mæ/ )n0"> sKCV/vr\;wy{J o*X0'iM}89)O䔑rEFj+E.f595 #GMOq(Az_tBqkopZwpD>VUqO+2-nn <kjIw+g o-wc:L]{R[J50!̙C򬑠l+BN3j]f@@RA`j>5NMzoP{*=@I٥AU9_ ު]9t@G[,fa805Oft;'^ָU(K@1}˅/1,kܨr"Ù˭kYֈO:&^ Xo+vD|#dUIZM.Q qP0 sػ0"\m_I(q "ډz%^k⟰tG~P"T#c2@$:_cݷ5hNHGUiGFz77sޯ.3T)A}!&O+-o?PΎq"&Xn{ @mxfn/޽GZ_t#abJv^13p0~>2Yc2Lf}G c> endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R /Cs2 8 0 R >> /Font << /F1.0 9 0 R /F1.1 11 0 R /F2.0 10 0 R /F2.1 12 0 R >> >> endobj 13 0 obj [ 14 0 R 15 0 R ] endobj 16 0 obj << /Length 17 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >> stream xROHQ6Axw )vuYm[Ңgߺ3ӛ5œ]`鲙}v*b{a[QÓ'a?dy֭S{=5ڊ^-CT#hsM9s1F9 1w7;aYf ]%{w;ћ9 \Ir< X}I<>Uw(gRVzWOelπ~v{|u׶>UEP>,l%KTn)=J+vp,ZSk9xw"zmMWzmʨ)(ͳDf[xf8:罊ZIE?9Z*UVPog~~\?A< =ѯ tIsQIi!3NTc)[d@f endstream endobj 17 0 obj 704 endobj 7 0 obj [ /ICCBased 16 0 R ] endobj 18 0 obj << /Length 19 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xMHaї$T& R+SeL b}wg-E"u.VDNC:DuE^";cT03y|URcE4`λޘvztLUF\)s:k-iYj6|vP4*wd>,y vڴ=S԰79 ڸ@`ӋmvUl5`P=Gj)kP*}6~^/~.~a2 nײ0%f|U 9l7?j`l7"tiNf]?uhgM Zʲ4i[&LY_x {xO$̥߬S]%֧&7g̞>r=g8`候 8rʶ<dWT'<eL~.u"A=9뗚]>313X3-$e}u,gmg664$ыEzL*LZ_j_]Xy[?Xs N/ ]|msϚƫk_WfȸA2)oz-di2|m٣j|5ԥej8ɮeE7[Q|IM%ײxf)|6\ k`Ҳ䍐.> endobj 20 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 15 0 obj << /Subtype /Link /Type /Annot /Border [ 0 0 0 ] /A 21 0 R /Rect [72 85 240.3018 91] >> endobj 21 0 obj << /URI 22 0 R /Type /Action /S /URI >> endobj 22 0 obj (http://creativecommons.org/licenses/by-sa/3.0/) endobj 14 0 obj << /Subtype /Link /Type /Annot /Border [ 0 0 0 ] /A 23 0 R /Rect [72 80 240.3018 85] >> endobj 23 0 obj << /URI 22 0 R /Type /Action /S /URI >> endobj 24 0 obj << /Length 25 0 R /Length1 22628 /Filter /FlateDecode >> stream x |T8|]۝>$d2YoV{E@E1 V@JVuE-++mUkqh}UھoѾ2s'A{ܳm~OEt1hƣxFp`Rn5#fGȁӅ$z}~@胃p$'ʒt&[Q7s뚾Wv؉ Yp|QlQùs#>?9bs"mDwVlDj}~&9v4J܈רup D?hGOm514AjEr#kډ>G_up;#D(\VrjV=>&dCUhZ.F?sϡwo)GYxO'n@; z'zd 4 zF&l/WFđ##E{O.S2 Nx:MHiPD4X܉7{xkx5ތWVpk<~S@Ow' @^CT :Eh\5g_Ih mCxnAы=aa;K Q&*O{^Eo0mb*Y:r#`}w=h/:{GaT>g9r3|(J~c;qGNO?.fװ?fW8r#7if ^.W`It~WϠgNΝ888Y\ نx<O3`~f^&|/~w8~Ŀ NG9dj"fo!ZF-VR7!jDw 7HߡKq3+c1Ǚ2߰egTNUA5z@$w!wt"Du*BTF$~ G~2*ু52!9CA)yEtmV$ zV9FP`t  uuzh!4, \>n[]d#B(k:["׈$y#acRw/?# v!2yC(Nay; D $(N2oot3%Ke`8{C:W׶Y%H2irUx\Ks3|{aMC0܀STds&CbNCg"@1ZJ0 $:Y%Vs%Ҳ~k]-s&' O:a23rϺƌdE BŁU5WѬ'.˥8C؅pe]R&!:=CyatzڤX7s2[IງOMXjn6 zMx ^o;T$8.Lsˮ $=sΗ6oMqẈn^|!t`P r@Ma9J0,v蓵KsfW=KxQ@%ԏ(j5&!FvDCndzߋjʰY#@բla˴Z=/\:Ke?,s XǬe2-Y'Z36G`Iv"b( *(s4Ӹ I?W&C40`trp !b )d9Ie[KݧV(z} T$^v6?lsQހ?sIᛓd3m\3b1*DޡFFUc %%PGUi$ISR~6bT(HlV=g&GIX$krƋݻq|cx|$:bxs:'+ENr8ŗhFqˆf@O_'YLV&Uz?*:V0wOU:U]ƈ>UlWA Ơ;! v1!yRČ/Bz1u7V56c$y+YtiXi䦝.˩`VeU]h`m2<:zY3*^1s)]w1hlIJDX s/20jNj2$L 4M<, MM+JqԈ/ƪI&+ro`r{ՙ?8x?gq~'߹+}JlF`W>}0uGqa{8 nrX된NS8(ʢNAtX%f%…>Q}BRq JQYXO.-יF` Vn'p{*L(: ;At$ֻoܖPC?xF?~]wĦ-[Y|>©c]w+NM< ]?_QľCO!=N_FcVbG_biG: Txq@Cfd5z@e>f(f<Pɪ*Z @c4(ap3`_7J, TؚN2@.j,Yr-d jjfцl[fv Op늏)s2}{J_ʱ-\[mQ k ZmZp F%fÂ+e_DC]ddꛈ0xpmFQ?]>}e^G UN*Lf!dxL9&eab_I^ xQYvaHT&Dqeƣ!D9y"8I+> HٯU^x~`MOB0 ۊg>0i㌮ ţq~dSWcLmռ}Cjv*6nY=ntlg/r<#@WqDu*tz(Y#NJنLaLoc WEaM oX͑/% _8XfsetDZB՛O ߗпv:WzzH){bߓ `G nH .ŘftI t) mk nUVv}x^v;N8\.xUǨ ^` ]F2a^U.Tk4 3ܩrv0H `Q)sϔujYRthP*á)5 fN]N@jpY:?F- w*d#I;Ij(Han<ҰUh ߀D̐I·G凪hK @lES,q159UV{e. T/#}uyM$;ʍʎ箲T,G`[60z\vNs.wRq`=M28nAPv .G;^pAP=5QhD'aHBs@xD%/ĠHQh#}g#C@Q Kl>g )DUKS(P Jdm/[Fۗ nE`/ ʡIY-%78|n=pK|Ń!Ϸ<[Û%'[$#2[(MJBa^5Q!a.hEB>@CdGC>J^FD>JUyvAz<< I[!@ P-*U6[X}W Qy`G |@mxU1jJN®r/-!O<f$Ytx;˭^vjg$ c1`:nLVK< b"A5P'JE(ٟ́`hd7NjPd bɚEWd)!%jPX2$a9R^ ?L5f!TQyοD;.8XsA/?0VkUKڂS%._W/Eզ@5juy} G!z7am,J^[\7p#qYN&1?UZ׊2c^}9d`{ Gð,'$`xMAnRAΨVR%U]Wq|߹uW6+林M=wFVYkyg~HNҨq hуr׭wǭQN};;LϧE#MjQ3XSwhRL}^LA>LVQܮ-"ة#0@*+$*3$Ϛa@ #  a7P"Hg |۞V劳FYGC' ^"8af&Qe"u2_7O0zbc<4(y!sМ5q\A+5 3O: Up&g _US  MY2e}.V(]G^LL ы (37Fglj?7\@ŠR{ jK᷌ʀ>*z৳kMSo=إu-S"fϤqW u%`WL֎^a:o=Ko\@ӳC-9*_~CC'% rLHާqS #2ӆ녕0؍ҡ` uK[.Iy " JYyJIFBRɳ0?X329 L+[a}nYh._Afɨ60Nf`*(R%+Eŕe̕ N[&_=;V]ͦTj-\ۨQ`?sS$9j m\ݮݮS7̌PZ ^s~k}fszWؕJ{H߽IeNwE-^0tB3ZTyj&{ㆶY<'!KrBMop_%j3xSx۽} ަDNV_qlaZe:9lDL[I U@(12L53I&LbTGiZCdS;L_^RGEx@BNJQh\:/?p];LΣ/+%hse F)w\xBfKeGX*N:z)Uf^뽮 ! ]S r-I*=е)j>OQ~(<ȃ 9[\7 Uc+ 1ނK|, -5Xhp35ӳ=[.+_ұ+7^k;BF}|{{ڼYU[=9`Q wd!z k *jj+{ֻ.܆nD{OEG3g"OE_ *O6!3ù87eq6[Q2FZ:@JAczD.3z6 xxSrhdʊ w *3VVKx΄/zơ8К̩SΓ' `&?$\= 7;.|ygGA$hԿۢ ՄsNc7Kg@ڌ؎7UL_|{oh+aut6JXXF)Iw+ks`jۂ߸!D\OGF-X'_Etb*J[swQͣGϪ_Wy#'|!~3q|eP2j[s.T-\K!&h3-erņDlOU6D!YyڃLt"8&l V"VP.D]~ U< լ. XjsuTȦv+Le[ͯ AM$;/3hkORR*2}e=ǒN>EXߩ5I *k3=Q 8z *3``s WʹXL9&+^.t!~_68$0Ԟ,a1+.BhVBBH`w!dwrr~n"rFU֍3og?FRtRkh(4*Q\p~T-z L+ l{W~s4K.t?+/"qX[ &fv9YEve cT)Z=-Y%6@`I \o_y;C?_SqI9'?%pxi+zǃnHhp9S.M(,5BF-v6gNlThDCq/1R(ñ BɈ 5ѵKHS8<U|뗨\ʋ/^Q++{,9Aod'ymzKXE]vʷ:륪PmNlY#VEgћ]m7^߶òq6nsV>d}ȩnTأA$TN'fDKuS/$ĸ) ٳISwDw*^$\M/C,ǯeCá=kaig mdo_op?=L|ր@4A1Z Vy 15?;5BckV '9G_{ޜQȴ|.-yzf鹝t-s(޿ù#ޱH5G,Kf 1u65TZ毫Z|fƇ;uf?[lesE/R_̀o΢Îu`۴gP§ l n}PYBcd7J&!VŲ`3Xf>M8qAT:X)ĒTV:W80 31X"A8{)'Ψ= Qgj 1^ 3oƎ3W$(#W<-] ~ZT2e[fljõ4Gx7|wWa[ץe+d(.Ʒ./SѲVGwX_tf C3 8D-b1+b s.3 FңV4w+5JXaմb,UT#Œ2GRdajcVkLy*fkMK-c ^WKc^^eLiEx1`-NBR'8â!i%˜8_2h>#ː,>0j 8F EʌB#81faSD$% )O@ѢM[ס [Πv{A^ 6;s! @03uZQlG \k*!+ o@h(l.]>5y2bejɵynWEua:VL :驳sLTU#X PjJbJ% tsMLMnx/ \FjH(sX'!}*Ҙ.rfc3rJ)_x L=Uc34 1#{k w~  @,L9Nws%cq 15+,j!q<[5yF{EuřY8 a%t~Yؤ]2EMYk7*( I?̸x 2=S5up}k kGVᘩ!u38s׺l.-D!R=v#xq(F 8Rȡ1-Mj(Y8(3 $EV$`"KeD,C4b5"wXEUï3.~yoPw`K{@̡|_yW<ˇ ԊqF]#+;`D 0 /pM( ҉\ߤӰ78G-JhscLR$2@ШgLB$,W:+] ؜8MlsaHE*A*9EK5JQIȨCnaE.`--opiEwݿ|"9<=²so/jrM몢i]o>yםµ|M> zJ #뉔IQ+O3˩e9''4iAd2% ŠX`W2YHcRE $jf7C / nqw7*؆kaO`&%@i!Xx4jӨ],1ZMUƭRxžٝ7/.,x?4%{] =-Wc(xcO"ǩh<؟%} 0`E}t23NXf/x^{W98`V%u`P!_aGG LO;JѳȊ8"R~5X 6I=!R̅-srE$m]_H|E~iLejS#<з1\PlF# kyI5z/lĴ,Y۩_[ߠݠۦ$X?gI('dc)ޒ=9=SY4 %!^!9b['ήl^}ź͂K;{77iЙY7Mȭ[[#}aYusƭ{IGt3@-MTTZI3k2je > M)+>!}1( B>Wǔ1SsO"rF.Dyx`܎Q3N!2ڨW ť)oP.<8Z RKU%7;-*y3_F\Yz_e ^q4~]Ljg KD}0^aT6COD&lrlVJu[Yg0\ojUO:B7=N3R⩋Z!Ϧp9<np'`?0~ˇO!|j/˼=| e@dH9O۰5_a ^z`4Ba#|`~)/mz`أGN#`$!~>㊡xYL5-Cmv52}=Ґ+|k=|l+p%A/x\%x+Ue"2w{}tuiOJkT4DRLR.rh]cv)B:m QnuB<9iU"'oԍVT+pՀ +h5qpi &Nnf?,ؙҗwp8PwY 1ZlZNtV8mIzM"]wm?VV ^(ه}yF*q\G ?OK#DƆWhzHN,vTcד\Ф?Z\P|{rkf_ASkRj7G  yPĀ 'p48:pY(G|/AxR&5LF6 !/oBy+ q(awĩv(3P lUᨀմ-.>GeU/FNC!M'7~_d>:E?c vMn1gvuX=@sV}Dw~aq4iL7--ٮ}fؑr\\2k_x.kŻU#G`c*P l45]fk^62KW}׵қ|KʧZbKYJQWO(YXԉ5 ;:ൎ)j)OUݪD?ǣuWƁw<|SP|l|Sm{jsy~u%eW3qn~3=X1*i@I%Eρ!Bsw_[PF) PA(ۻiJ{D!⅃\v3of﫠eU |!'O5)J- feZޖZF)~OC0r7vq,F#?طey 'nVkdC@Q@<9*`'HeC}[G_{a^`yCqqq@\_„Jc90A W'n & Ez߿txq XT 8~7#ٵfXUT@˩Xt(ag# fs/Jv‡۟wvno`%)x&VŸvŸS4]jsN;?X>'/Ϡ#L<%A2xU95eח.SvNrY:\ rm H6)lcxY}oJ3JAA^A\I_\7W|w:U:=tzrNKwN ?n|{ȷ Ա7 G7r|m|{BKO% Ev{}yyʇrӚZsӿxMakȻ(ӻ:-]]][-ʻ;Oo_y\2?dp endstream endobj 25 0 obj 17003 endobj 26 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 669 /Descent -250 /Flags 32 /FontBBox [-203 -428 1700 1272] /FontName /BVFNAX+Times-Roman /ItalicAngle 0 /StemV 102 /MaxWidth 1721 /StemH 44 /XHeight 454 /FontFile2 24 0 R >> endobj 27 0 obj [ 250 0 0 0 0 0 0 180 333 333 0 0 250 333 250 278 500 500 500 500 500 500 500 0 0 0 278 278 0 0 0 0 0 722 0 667 722 611 556 0 0 333 0 0 611 889 0 722 556 0 667 556 611 722 0 944 0 722 0 0 0 0 0 0 0 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 350 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 0 0 0 0 0 0 0 0 0 556 ] endobj 9 0 obj << /Type /Font /Subtype /TrueType /BaseFont /BVFNAX+Times-Roman /FontDescriptor 26 0 R /Widths 27 0 R /FirstChar 32 /LastChar 222 /Encoding /MacRomanEncoding >> endobj 28 0 obj << /Length 29 0 R /Length1 4756 /Filter /FlateDecode >> stream xW t̾  3되l 3&؍$w$$S_@PAX (Ud *=GQZ)~w6Fpz<==wf#N"i͑)pֶ*;'aCd` 6"cE7-hu%΢H_8{82h@>Q ͭ7 tcQKmh5m͑;c@+E+}=wp-K[F/}毀H6 B,p$X+()n 0N`|;@'q$,z )imGg{t) l>͠i?r4e4t2=)NReetO*h1J^jT MyVN*BcEt!BBjf:BGY:P>U6wLf-IFDA6tK쀑ntb4Gx%tC'X JTqd5NA?]ӨE3݊Jӫ}Dfٕl1kgQv@*^`[0nC2@%_L7=S,#:TDhD2f0v/obG4̠VZԳv6+:, E]\ !Mȁ1*rZdcq=ȎgD(YTC!C5ǽ:;B1:Ml$Qd *Ȉ#)<' 1[#OYXKw[;mQal31!{:P, `f,!]`7Km>L78sB>8щ|6"9X`,Y5el9ug.@7`Q@`SP,A*W"B 4 NK$b#Q}V-ZZޱXa֚jͷ^ims&lvٯ?kboPәO-$l~x^#^c']1tq1cɀ.^R#s! NKM$ ۬Q`aE ,ut3a]l]vԠM-kT =nů*!ճXo!E?agMZ傁w6^}7нd4- 5pׇXC&f#uzլ7 y:VIs;AuO֩uU䚠.FB1rOzΟWgu!4R-յ:4aNEփQVX lI'WnR$um T ׆Ո/SU06Lfws)p<\oODZs+x$ iJDET?> ?L CS`= %-ʪ  %8b>PZ/Seξg4ބP4}U/D3:1UQ*T *Әyòَ5;<KNOODx':<wC6DMXgtDJZDQd1HUZͽ™ HpfB*.<] 1iK0\ֶ?<W&>{"fՁy)'YLx -FP^ >c/f y55Z“@ܲ^!)e4Ϗ +rv@csROuKs:XQy8j)IoXJaV"SoΊ93SF dgl쫒J bއ_=A:V/ Nvb%Ѓ|WZj#nd 8-ഀ恪ByDţVT>bP&E4/(Iɂ#1ɪK_^2H~4d6&R~=A Il9ߦ REڨH+E ^dLT%]%MU^6+ڐll)-=-ݚ-eKlXw/'nM)+^+Kʥ˥咫\.JFKq|wM)e&i&NK \x9nc Jʱ0TN9hn%ob&_ļ90[+zhILaS܉\$K>mxt}H.IcP{b L/a[,uk5r5qOyopN@ąc1/6T~;WsQ^ /y{ܦ|(niǽ[ǼkGLCݓny-,Ç!&__# &w\ }Z xʳ˕He>t5$C.fȗPILcDyfycfȹ(ϲ[#_LW.ϳ_i`ԞoϲgG3CAdasX8!q-tR94#N9- ;M*g ̰/|O]3BX02B͎n G!.v_m]PYϨ '8]O lG#Gv68j=5ռBvu:s0AŚGkL5<'2χӋ Z:7OMGa ;@`)$v' q)8/!~(!~OyVX516\+J\o9 GjO_99.:vvhmyݵzYZ<6pgKxզ9\X~kڌū7L]z.]: ! endstream endobj 29 0 obj 3085 endobj 30 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 669 /Descent -250 /Flags 4 /FontBBox [-203 -428 1700 1272] /FontName /ZPOVSM+Times-Roman /ItalicAngle 0 /StemV 102 /MaxWidth 1721 /StemH 44 /XHeight 454 /FontFile2 28 0 R >> endobj 31 0 obj [ 250 ] endobj 32 0 obj << /Length 33 0 R /Filter /FlateDecode >> stream x]n {bKq_Nr`X[HָsRl|0O= 03qc0Ht4$d}͸4EZw8=8C^#y2l)}႔A cT{.?\ǞJBt?\&-(RFnF ӑtFQJu*Zx6Ҧ}U)`o} pD endstream endobj 33 0 obj 222 endobj 11 0 obj << /Type /Font /Subtype /TrueType /BaseFont /ZPOVSM+Times-Roman /FontDescriptor 30 0 R /Widths 31 0 R /FirstChar 33 /LastChar 33 /ToUnicode 32 0 R >> endobj 34 0 obj << /Length 35 0 R /Length1 4972 /Filter /FlateDecode >> stream xW{pTνwy l6;BPh ,nHH@w1nIL$1Ҍ1Z UpPBl2*Gm}Zgj;R[[:*߹IV(?s:6%S7o "C!O$6֖@$U%&ֺqGo DW")n⟥OA ҡ }zS[ݶJMT[Շ4ILHUצб]۾";g;? |LVt XK7K3H&2DC-QPo3xJ }tCkVKˤD:Uы0P#tvS/ϡ6N66B@h:4E֝t8hV!?2U蕮62lj,G1#4 a5soM{ }eFi6Β4AYtcLPV .9Aa~v;`n#+K[,S``Nѧ9Dp)b1%Q%vwNĞ3+jf y*! @[P\&֊פ;eaky:M%'L ;Ikseu};j6N ;= Xda/t,K ,C/%Y3xiJa5C0)z^0{lI,bKіY#kf1& 8!AH ӄNhׅn1Ck#hϋo EZ"-*h&E{BzRIXZXYV[-[-z.Nk_[mm;N3MYt3=8,LQTW{|SV 3Q 'T^D[Z:`Y/ טH"#Y2(~U^,@SvΔ<˅ S4RZYgSH,,8<k(ɁGtTnA^2\ l0`‚f 8i[rڰMP]Kڀ&R󵩪O~SeHL󄶁\FAZaK0-# 8 p# (ZU-!K+tO_ Ubi4S),pt… Xrt 7luSb\' Ԕzs`+RLb'ȰfY ѭYafFo\KHK{yES*#T}<X);AkEcQ$nrM|;3:sj8fm6:Ҕ :TPelgPg|J [.P `sA@)îx(Q%ZUʔ&6G8" 0XO+zq1 C< <D Mӌ4UXк})| *7DTQ)ojv`Ey_?9"5ե FQ{uF4xF :lܯjŠ2Au. rNo@IVN/8n1.L pIs gWc.4Þ8n\aebxxaˀ^|.pť^ @d21t< /7Ƒao /r pͥ^ vMa80.qc^AWڋwӸ{dRju??t{Ntŷu m:D!̢S]^i_-OH^CL/uj3'(ّx>Zsrq]dE=? "5m}+#R\:mmIv1O$&;Wuf/x8K t&PD8{Hf$7ۈ^ۗ*:Hf`,s|[bE;*TT(P ,&% dBL9oO "|*ޘc0.'r Ej.$s]llΠ:伢阈0IݞTys<L?{qvSU,_ 5{.?^7V endstream endobj 35 0 obj 2690 endobj 36 0 obj << /Type /FontDescriptor /Ascent 770 /CapHeight 727 /Descent -230 /Flags 32 /FontBBox [-951 -481 1445 1122] /FontName /PUGWSM+Helvetica /ItalicAngle 0 /StemV 98 /MaxWidth 1500 /StemH 85 /XHeight 531 /FontFile2 34 0 R >> endobj 37 0 obj [ 278 ] endobj 10 0 obj << /Type /Font /Subtype /TrueType /BaseFont /PUGWSM+Helvetica /FontDescriptor 36 0 R /Widths 37 0 R /FirstChar 32 /LastChar 32 /Encoding /MacRomanEncoding >> endobj 38 0 obj << /Length 39 0 R /Length1 4972 /Filter /FlateDecode >> stream xW{pTνwy l{!(4!,nHH@b$Hc*8 -*8(}X!En6zF>@G[3J}-$+q ̹{|CDԷN%Pv}?IDɷoS{5ij>g)gsCt_BqDֵa gCnG?>rG-b[c=}F3Ew@l_iwB^'D.n PiʶtQ4d"M8 yKtMk~VK}J77taF;Mm4 ]ml\G[4*i*F]t8d»Va?2U葮52lj,C-54a5[$soM=Lctfg4 NJ0D6b#Qg'CL;gY(*Kuݏ {:l[F& +CnCqX+_bIs4t3M):C/\S0/A/TvF8aOE"$  &t6-F[–Fh'M,pB*L5B&t ]b+.WGў/%t4IZ(UMڇ^[YXVY,,;zYM]֘lٶ*Z gP_?3g>VG{qYjlcI\(@5{Ph#mkg0 Ҋ]+KNOq:ihyrrs2]<9%#=1I2.9)1nZ$Q`WBҤLj%T6:FS0\"=lFg(d)\[UE{ɧ*:[,yO *yS^l8.&(~GOXHkeMQW=# POт&U_KS!'zYp<5 5 jvCu!.kjBJ&>m_#%NMp#2rZxiƶ[Í~+Ԣh Wm@.-=~5 jTyL ߱ą/cѽCWt]0ZRo.lE(Z_ < 45#5"uՌh b i|!ohST%zpG[;q'?xh,<"w`MoyUtN ǬMfVV\AJ= تO $z Ԛ}XJA> .H7+eu%D+J҄bG$kV`EO0#.F93G2ifWT2Z/C8@u@@*#͎a30 RQ&h4#oCϰA'uUTW7.XAM(鑊iǍ&EW0x+K$T}:St3\,Nmoq ZwY,gޘJBJ/jyb/|9i[Ͻ@vK<{*> !5g0EYI=| ŦjTwnBR pCZ ^fq^y3\Y|dD][a_}z^|u'AEjfi=6GХtZ?l=E$I^11Mv$&ɯw@~ FKq5~Inl7UuѻEءԙIOnaN&M1B]`1T.axf*4xyy@6$zp"ɇ:<44cr[^WՅ\ *O<%r/O zJ-|ISI8wsgA?܋ފ:<Э {sʳ9U;,+ m[l7fpʴl 5d{nױRzuS)h[=t1G~c삝u>^7u݇aՔ:;#Yd:RP%,%-—NJ[,uNZ\Wq0Vag gp$1"|q\o^^-gꏄum5NQzZڇ&]hjħ>Ӝ͗SPE:=~~=[3jmye-/OUgZkU37x@u5ZŲP>=V endstream endobj 39 0 obj 2689 endobj 40 0 obj << /Type /FontDescriptor /Ascent 770 /CapHeight 727 /Descent -230 /Flags 4 /FontBBox [-951 -481 1445 1122] /FontName /ZPOVSM+Helvetica /ItalicAngle 0 /StemV 98 /MaxWidth 1500 /StemH 85 /XHeight 531 /FontFile2 38 0 R >> endobj 41 0 obj [ 278 ] endobj 42 0 obj << /Length 43 0 R /Filter /FlateDecode >> stream x]n {bKq_Nr`X[HָsRl|0O= 03qc0Ht4$d}͸4EZw8=8C^#y2l)}႔A cT{.?\ǞJBt?\&-(RFnF ӑtFQJu*Zx6Ҧ}U)`o} pD endstream endobj 43 0 obj 222 endobj 12 0 obj << /Type /Font /Subtype /TrueType /BaseFont /ZPOVSM+Helvetica /FontDescriptor 40 0 R /Widths 41 0 R /FirstChar 33 /LastChar 33 /ToUnicode 42 0 R >> endobj 1 0 obj << /Title (web2py contributor agreement) /Author (Massimo Di Pierro) /Creator (Pages) /Producer (Mac OS X 10.5.6 Quartz PDFContext) /CreationDate (D:20091026041042Z00'00') /ModDate (D:20091026041042Z00'00') >> endobj xref 0 44 0000000000 65535 f 0000037461 00000 n 0000006052 00000 n 0000008168 00000 n 0000000022 00000 n 0000006032 00000 n 0000006171 00000 n 0000007181 00000 n 0000008132 00000 n 0000026567 00000 n 0000033746 00000 n 0000030519 00000 n 0000037297 00000 n 0000006319 00000 n 0000008526 00000 n 0000008301 00000 n 0000006353 00000 n 0000007161 00000 n 0000007217 00000 n 0000008112 00000 n 0000008251 00000 n 0000008405 00000 n 0000008461 00000 n 0000008630 00000 n 0000008686 00000 n 0000025780 00000 n 0000025802 00000 n 0000026041 00000 n 0000026743 00000 n 0000029918 00000 n 0000029939 00000 n 0000030177 00000 n 0000030201 00000 n 0000030499 00000 n 0000030685 00000 n 0000033465 00000 n 0000033486 00000 n 0000033722 00000 n 0000033920 00000 n 0000036699 00000 n 0000036720 00000 n 0000036955 00000 n 0000036979 00000 n 0000037277 00000 n trailer << /Size 44 /Root 20 0 R /Info 1 0 R /ID [ <4b8994816e63474ba73ba7b1416adb6d> <4b8994816e63474ba73ba7b1416adb6d> ] >> startxref 37686 %%EOF web2py-2.12.3.orig/applications/examples/static/js/0000775000000000000000000000000012564727260020670 5ustar rootrootweb2py-2.12.3.orig/applications/examples/static/js/bootstrap.min.js0000664000000000000000000006772712564727256024055 0ustar rootroot/*! * Bootstrap.js by @fat & @mdo * Copyright 2013 Twitter, Inc. * http://www.apache.org/licenses/LICENSE-2.0.txt */ !function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.alert.data-api",t,n.prototype.close)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(t){var n=this.getActiveIndex(),r=this;if(t>this.$items.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){r.to(t)}):n==t?this.pause().cycle():this.slide(t>n?"next":"prev",e(this.$items[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f;this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u](),f=e.Event("slide",{relatedTarget:i[0],direction:o});if(i.hasClass("active"))return;this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var t=e(a.$indicators.children()[a.getActiveIndex()]);t&&t.addClass("active")}));if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}};var n=e.fn.carousel;e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.pause().cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=n,this},e(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=e.extend({},i.data(),n.data()),o;i.carousel(s),(o=n.attr("data-slide-to"))&&i.data("carousel").pause().to(o).cycle(),t.preventDefault()})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning||this.$element.hasClass("in"))return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning||!this.$element.hasClass("in"))return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var n=e.fn.collapse;e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=e.extend({},e.fn.collapse.defaults,r.data(),typeof n=="object"&&n);i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=n,this},e(document).on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})}(window.jQuery),!function(e){"use strict";function r(){e(".dropdown-backdrop").remove(),e(t).each(function(){i(e(this)).removeClass("open")})}function i(t){var n=t.attr("data-target"),r;n||(n=t.attr("href"),n=n&&/#/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,"")),r=n&&e(n);if(!r||!r.length)r=t.parent();return r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||("ontouchstart"in document.documentElement&&e('

    web2py-2.12.3.orig/applications/admin/views/default.mobile/git_push.html0000664000000000000000000000064212564727256025005 0ustar rootroot{{extend 'default.mobile/layout.html'}} {{ frm = form smt_button = frm.element(_type="submit") smt_button['_class'] = 'btn' smt_button['_style'] = 'margin-right:4px;' ccl_button = frm.element(_type="button") ccl_button['_class'] = 'btn' }}

    {{=T('This will push changes to the remote repo for application "%s".', app)}}

    {{=form}}
    web2py-2.12.3.orig/applications/admin/views/default.mobile/ticket.load0000664000000000000000000001124312564727256024420 0ustar rootroot{{block sectionclass}}ticket{{end}}

    {{=T('Error ticket')}} for "{{=app}}"

    {{=T('Ticket ID')}}

    {{=ticket}}

    {{if output:}}

    {{=output}}

    {{pass}}

    {{=T('Version')}}

    web2py™ {{=myversion}}
    Python {{=snapshot.get('pyver','')}}

    {{=T('Traceback')}}

    {{=traceback}}
    {{if snapshot:}} {{try:}}

    {{=T('Error snapshot')}} {{=helpicon()}} {{=T('Detailed traceback description')}}

    {{=snapshot['etype']}}({{=snapshot['evalue']}})

    {{=T('inspect attributes')}}

    {{=T("Exception instance attributes")}}
    {{for k,v in snapshot['exception'].items():}} {{pass}}
    {{=k}} {{=v}}

    {{=T('Frames')}}

      {{for i, frame in enumerate(snapshot['frames']):}}
    • {{is_hidden = (i != len(snapshot['frames'])-1 and 'hide' or 'inspect')}}

      File {{="%s in %s at line %s" % (frame['file'], frame['func'], frame['lnum'])}} {{=T("code")}} {{=T("arguments")}} {{=T("variables")}}

      Function argument list

      {{=frame['call']}}

      Code listing
      {{if frame['lines']:}}
      {{=CODE('\n'.join([x[1] for x in sorted(frame['lines'].items(),key=lambda x: x[0])]), 
                          language='python', link=None, counter=min(frame['lines'].keys()), highlight_line=frame['lnum'])}}
      {{pass}}
      Variables
      {{for k,v in frame['dump'].items():}} {{pass}}
      {{=k}} {{=v}}
    • {{pass}}

    Context

    {{=T('locals')}} {{=T('request')}} {{=T('session')}} {{=T('response')}}

    locals
    {{=BEAUTIFY(snapshot['locals'])}}
    request
    {{=BEAUTIFY(snapshot['request'])}}
    session
    {{=BEAUTIFY(snapshot['session'])}}
    response
    {{=BEAUTIFY(snapshot['response'])}}
    {{except Exception, e:}} {{import traceback;tb=traceback.format_exc().replace("\n","\\n") }} {{pass}} {{pass}}

    In file: {{=layer}}

    {{=CODE(code.replace('\r',''),language='python',link='/examples/global/vars/')}}
    web2py-2.12.3.orig/applications/admin/views/default.mobile/delete_plugin.html0000664000000000000000000000047212564727256026004 0ustar rootroot{{extend 'default.mobile/layout.html'}} {{block sectionclass}}delete_plugin{{end}}

    {{=T('Are you sure you want to delete plugin "%s"?', plugin)}}

    {{=FORM(INPUT(_type='submit',_name='nodelete',_value=T('NO')))}}

    {{=FORM(INPUT(_type='submit',_name='delete',_value=T('YES')))}}

    web2py-2.12.3.orig/applications/admin/views/default.mobile/edit.html0000664000000000000000000000426612564727256024116 0ustar rootroot{{extend 'default.mobile/layout.html'}} {{cm=URL('static', 'codemirror')}} {{if editor_settings['editor'] != 'default':}}{{pass}}
    {{=XML(plain_html)}}
    web2py-2.12.3.orig/applications/admin/views/default.mobile/plugin.html0000664000000000000000000001412412564727256024461 0ustar rootroot{{extend 'default.mobile/layout.html'}} {{ import os def A_info(*a,**b): b['_data-role'] = 'button' b['_data-icon'] = 'info' b['_data-theme'] = 'b' return A(*a,**b) def A_gear(*a,**b): b['_data-role'] = 'button' b['_data-icon'] = 'gear' return A(*a,**b) def A_delete(*a,**b): b['_data-role'] = 'button' b['_data-icon'] = 'delete' return A(*a,**b) def A_check(*a,**b): b['_data-role'] = 'button' b['_data-icon'] = 'check' return A(*a,**b) def all(items): return reduce(lambda a,b:a and b,items,True) def peekfile(path,file): return A_info(file.replace('\\\\','/'),_href=URL('peek', args=(app, path, file))) def editfile(path,file): return A_gear(SPAN(T('Edit')),_href=URL('edit', args=(app, path, file))) def testfile(path,file): return A_check(SPAN(T('Run tests')), _href=URL('test', args=(app, file))) def editlanguagefile(path,file): return A_gear(SPAN(T('Edit')),_href=URL('edit_language', args=(app, path, file))) def file_upload_form(location): form=FORM(T("upload file:")," ", INPUT(_type="file",_name="file")," ",T("and rename it:")," ", INPUT(_type="text",_name="filename",requires=IS_NOT_EMPTY()), INPUT(_type="hidden",_name="location",_value=location), INPUT(_type="hidden",_name="sender",_value=URL('design/'+app)), INPUT(_type="submit",_value=T("submit")),_action=URL('upload_file')) return form def file_create_form(location): form=FORM(T("create file with filename:")," ", INPUT(_type="text",_name="filename",requires=IS_NOT_EMPTY()), INPUT(_type="hidden",_name="location",_value=location), INPUT(_type="hidden",_name="sender",_value=URL('design/'+app)), INPUT(_type="submit",_value=T("submit")),_action=URL('create_file')) return form def upload_plugin_form(app): form=FORM(T("upload plugin file:")," ", INPUT(_type="file",_name="pluginfile"), INPUT(_type="submit",_value=T("submit"))) return form def deletefile(arglist): return A_delete(SPAN(T('Delete')), _href=URL('delete',args=arglist,vars=dict(sender=request.function+'/'+app))) }} {{block sectionclass}}plugin{{end}}

    {{=T('Plugin "%s" in application', request.args(1))}} "{{=app}}"

    {{=sp_button(URL('plugin',args=app), T("back"))}} {{=sp_button(URL('delete_plugin',args=request.args), T("delete plugin"))}} {{=sp_button(URL('pack_plugin',args=request.args), T("pack plugin"))}}

    {{=T("Models")}}

    {{if not models:}}

    {{=T("There are no models")}}

    {{pass}} {{for m in models:}} {{=editfile('models',m)}} {{=deletefile([app, 'models', m])}} {{=peekfile('models',m)}} {{pass}}
    {{ controller_functions=[] for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functions[c]] }}

    {{=T("Controllers")}}

    {{if not controllers:}}

    {{=T("There are no controllers")}}

    {{pass}} {{for c in controllers:}} {{=editfile('controllers',c)}} {{=deletefile([app,'controllers',c])}} {{=testfile('controllers',c)}} {{=peekfile('controllers',c)}} {{pass}}

    {{=T("Views")}}

    {{if not views:}}

    {{=T("There are no views")}}

    {{pass}} {{for c in views:}} {{=peekfile('views',c)}} {{=editfile('views',c)}} {{=deletefile([app,'views',c])}} {{pass}}

    {{=T("Static files")}}

    {{if not statics:}}

    {{=T("There are no static files")}}

    {{pass}}
      {{ from collections import OrderedDict tree=OrderedDict() for file in statics+['']: items=file.partition('/') if not items[0] in tree: tree[items[0]] = [] pass tree[items[0]].append(items[2]) pass }} {{for k, v in tree.iteritems():}} {{if k:}}
    • {{=k}}

        {{if len(v) == 1 and v[0] =='':}} {{=peekfile('static', k)}} {{=editfile('static', k)}} {{=deletefile([app, 'static', k])}}
      {{continue}} {{for f in v:}} {{=peekfile('static/'+k, f)}} {{=editfile('static/'+k, f)}} {{=deletefile([app, 'static/'+k, f])}}
      {{pass}}
    {{pass}} {{pass}}

    {{=T("Modules")}}

    {{if not modules:}}

    {{=T("There are no modules")}}

    {{pass}} {{for m in modules:}} {{=peekfile('modules',m)}} {{=editfile('modules',m)}} {{if m!='__init__.py':}}{{=T("delete")}}{{pass}} {{pass}}
    web2py-2.12.3.orig/applications/admin/views/default.mobile/design.html0000664000000000000000000001764712564727256024451 0ustar rootroot{{extend 'default.mobile/layout.html'}} {{ def A_info(*a,**b): b['_data-role'] = 'button' b['_data-icon'] = 'info' b['_data-theme'] = 'b' return A(*a,**b) def A_gear(*a,**b): b['_data-role'] = 'button' b['_data-icon'] = 'gear' return A(*a,**b) def A_delete(*a,**b): b['_data-role'] = 'button' b['_data-icon'] = 'delete' return A(*a,**b) def A_check(*a,**b): b['_data-role'] = 'button' b['_data-icon'] = 'check' return A(*a,**b) def all(items): return reduce(lambda a,b:a and b,items,True) def peekfile(path,file): return A_info(file.replace('\\\\','/'),_href=URL('peek', args=(app, path, file))) def editfile(path,file): return A_gear(SPAN(T('Edit')),_href=URL('edit', args=(app, path, file))) def testfile(path,file): return A_check(SPAN(T('Run tests')), _href=URL('test', args=(app, file))) def editlanguagefile(path,file): return A_gear(SPAN(T('Edit')),_href=URL('edit_language', args=(app, path, file))) def file_upload_form(location): form=FORM(T("upload file:")," ", INPUT(_type="file",_name="file")," ",T("and rename it:")," ", INPUT(_type="text",_name="filename",requires=IS_NOT_EMPTY()), INPUT(_type="hidden",_name="location",_value=location), INPUT(_type="hidden",_name="sender",_value=URL('design',args=app)), INPUT(_type="submit",_value=T("upload")),_action=URL('upload_file')) return form def file_create_form(location): form=FORM(T("create file with filename:")," ", INPUT(_type="text",_name="filename",requires=IS_NOT_EMPTY()), INPUT(_type="hidden",_name="location",_value=location), INPUT(_type="hidden",_name="sender",_value=URL('design',args=app))) return form def upload_plugin_form(app): form=FORM(T("upload plugin file:")," ", INPUT(_type="file",_name="pluginfile"), INPUT(_type="submit",_value=T("upload"))) return form def deletefile(arglist): return A_delete(SPAN(T('Delete')), _href=URL('delete',args=arglist,vars=dict(sender=request.function+'/'+app))) }} {{block sectionclass}}design {{=app}}{{end}}

    {{=T("Models")}}

    {{if not models:}}

    {{=T("There are no models")}}

    {{else:}}
    {{=button(URL(a=app,c='appadmin',f='index'), T('database administration'))}} {{if os.access(os.path.join(request.folder,'..',app,'databases','sql.log'),os.R_OK):}} {{=button(URL('peek/%s/databases/sql.log'%app), 'sql.log')}} {{pass}}
    {{pass}} {{for m in models:}} {{=peekfile('models',m)}} {{=editfile('models',m)}} {{=deletefile([app, 'models', m])}}
    {{pass}}
    {{=file_create_form('%s/models/' % app)}}
    {{ controller_functions=[] for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functions[c]] }}

    {{=T("Controllers")}}

    {{if not controllers:}}

    {{=T("There are no controllers")}}

    {{else:}}
    {{=button(URL(r=request,c='shell',f='index',args=app), T("shell"))}} {{=button(URL('test',args=app), T("test"))}} {{=button(URL('edit',args=[app,'cron','crontab']), T("crontab"))}}
    {{pass}} {{for c in controllers:}} {{=peekfile('controllers',c)}} {{=editfile('controllers',c)}} {{=deletefile([app, 'controllers', c])}} {{=testfile('controllers',c)}}
    {{pass}}
    {{=file_create_form('%s/controllers/' % app)}}

    {{=T("Views")}}

    {{=button(LAYOUTS_APP, T("download layouts"))}}
    {{if not views:}}

    {{=T("There are no views")}}

    {{pass}} {{for c in views:}} {{=peekfile('views',c)}} {{=editfile('views',c)}} {{=deletefile([app, 'views', c])}}
    {{pass}}
    {{=file_create_form('%s/views/' % app)}}

    {{=T("Languages")}}

    {{=button(URL('update_languages/'+app), T('update all languages'))}}
    {{if not languages:}}

    {{=T("There are no translators")}}

    {{pass}} {{for file in languages:}} {{=peekfile('languages',file)}} {{=editlanguagefile('languages',file)}} {{=deletefile([app, 'languages', file])}}
    {{pass}}
    {{=file_create_form('%s/languages/' % app)}}

    {{=T("Static files")}}

    {{if not statics:}}

    {{=T("There are no static files")}}

    {{pass}}
      {{ tree={} for file in statics+['']: items=file.partition('/') if not items[0] in tree: tree[items[0]] = [] pass tree[items[0]].append(items[2]) pass }} {{for k, v in sorted(tree.items()):}} {{if k:}}
    • {{=k}}

        {{if len(v) == 1 and v[0] =='':}} {{=peekfile('static', k)}} {{=editfile('static', k)}} {{=deletefile([app, 'static', k])}}
      {{continue}} {{for f in v:}} {{=peekfile('static/'+k, f)}} {{=editfile('static/'+k, f)}} {{=deletefile([app, 'static/'+k, f])}}
      {{pass}}
    {{pass}} {{pass}}
    {{=file_create_form('%s/static/' % app)}} {{#=file_upload_form('%s/static/' % app)}}

    {{=T("Modules")}}

    {{if not modules:}}

    {{=T("There are no modules")}}

    {{pass}} {{for m in modules:}} {{=peekfile('modules',m)}} {{=editfile('modules',m)}} {{if m!='__init__.py':}}{{=deletefile([app, 'modules', m])}}{{pass}} {{pass}}
    {{=file_create_form('%s/modules/' % app)}} {{#=file_upload_form('%s/modules/' % app)}}

    {{=T("Plugins")}}

    {{=button(PLUGINS_APP, T('download plugins'))}}
    {{if plugins:}}
    {{for plugin in plugins:}} {{=button(URL('plugin', args=[app, plugin]), 'plugin_%s' % plugin)}} {{pass}}
    {{else:}}

    {{=T('There are no plugins')}}

    {{pass}}
    {{=upload_plugin_form(app)}}
    web2py-2.12.3.orig/applications/admin/views/default.mobile/git_pull.html0000664000000000000000000000066112564727256025003 0ustar rootroot{{extend 'default.mobile/layout.html'}} {{ dlg = dialog smt_button = dlg.element(_type="submit") smt_button['_class'] = 'btn' smt_button['_style'] = 'margin-right:4px;' ccl_button = dlg.element(_type="button") ccl_button['_class'] = 'btn' }}

    {{=T('This will pull changes from the remote repo for application "%s"?', app)}}

    {{=dialog}}
    web2py-2.12.3.orig/applications/admin/views/default.mobile/index.html0000664000000000000000000000136512564727256024275 0ustar rootroot{{extend 'default.mobile/layout.html'}}

    web2py™ {{=T('Web Framework')}}

    {{=T('Login to the Administrative Interface')}}

    {{if request.is_https or request.is_local:}}
    {{=T('Administrator Password:')}}
    {{else:}}

    {{=T('ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.')}}

    {{pass}} web2py-2.12.3.orig/applications/admin/views/default.mobile/peek.html0000664000000000000000000000060312564727256024104 0ustar rootroot{{extend 'default.mobile/layout.html'}} {{block sectionclass}}peek{{end}}

    {{=T("Peeking at file")}} "{{=filename}}"

    {{=button(URL('design',args=request.args[0]), T('back'))}} {{=button(URL('edit',args=request.args), T('Edit'))}}

    {{ if filename[-3:]=='.py': language='python' else: language='html' }} {{=CODE(data,language=language,link='/examples/global/vars/')}} web2py-2.12.3.orig/applications/admin/views/default.mobile/ticket.html0000664000000000000000000001076212564727256024452 0ustar rootroot{{extend 'default.mobile/layout.html'}} {{block sectionclass}}ticket{{end}}

    {{=T('Error ticket')}} for "{{=app}}"

    {{=T('Ticket ID')}}

    {{=ticket}}

    {{if output:}}

    {{=output}}

    {{pass}}

    {{=T('Version')}}

    web2py™ {{=myversion}}
    Python {{=snapshot.get('pyver','')}}

    {{=T('Traceback')}}

    {{=traceback}}
    {{if snapshot:}} {{try:}}

    {{=T('Error snapshot')}}{{=T('Detailed traceback description')}}

    {{=snapshot['etype']}}({{=snapshot['evalue']}})

    {{=T('inspect attributes')}}

    {{=T("Exception instance attributes")}}
    {{for k,v in snapshot['exception'].items():}} {{pass}}
    {{=k}} {{=v}}

    {{=T('Frames')}}

      {{for i, frame in enumerate(snapshot['frames']):}}
    • {{is_hidden = (i != len(snapshot['frames'])-1 and 'hide' or 'inspect')}}

      File {{="%s in %s at line %s" % (frame['file'], frame['func'], frame['lnum'])}} {{=T("code")}} {{=T("arguments")}} {{=T("variables")}}

      Function argument list

      {{=frame['call']}}

      Code listing
      {{if frame['lines']:}}
      {{=CODE('\n'.join([x[1] for x in sorted(frame['lines'].items(),key=lambda x: x[0])]),
                          language='python', link=None, counter=min(frame['lines'].keys()), highlight_line=frame['lnum'])}}
      {{pass}}
      Variables
      {{for k,v in frame['dump'].items():}} {{pass}}
      {{=k}} {{=v}}
    • {{pass}}

    Context

    {{=T('locals')}} {{=T('request')}} {{=T('session')}} {{=T('response')}}

    locals
    {{=BEAUTIFY(snapshot['locals'])}}
    request
    {{=BEAUTIFY(snapshot['request'])}}
    session
    {{=BEAUTIFY(snapshot['session'])}}
    response
    {{=BEAUTIFY(snapshot['response'])}}
    {{except Exception, e:}} {{import traceback;tb=traceback.format_exc().replace("\n","\\n") }} {{pass}} {{pass}}

    In file: {{=layer}}

    {{=CODE(code.replace('\r',''),language='python',link='/examples/global/vars/')}}
    web2py-2.12.3.orig/applications/admin/views/default.mobile/resolve.html0000664000000000000000000000127112564727256024641 0ustar rootroot{{extend 'default.mobile/layout.html'}} {{block sectionclass}}resolve{{end}}

    {{=T('Resolve Conflict file')}} "{{=filename}}"

    {{=diff}}
    web2py-2.12.3.orig/applications/admin/views/default.mobile/delete.html0000664000000000000000000000067112564727256024427 0ustar rootroot{{extend 'default.mobile/layout.html'}} {{block sectionclass}}delete{{end}}

    {{=T('Are you sure you want to delete file "%s"?', filename)}}

    {{=FORM(INPUT(_type='submit',_name='nodelete',_value=T('Abort')),INPUT(_type='hidden',_name='sender',_value=sender), _class="inline")}}{{=FORM(INPUT(_type='submit',_name='delete',_value=T('Delete')),INPUT(_type='hidden',_name='sender',_value=sender), _class="inline")}}

    web2py-2.12.3.orig/applications/admin/views/default.mobile/test.html0000664000000000000000000000172312564727256024143 0ustar rootroot{{extend 'default.mobile/layout.html'}} {{block sectionclass}}test{{end}}

    {{=T('Testing application')}} "{{=app}}"

    {{for controller in sorted(controllers):}}

    Testing controller "{{=controller}}"... please wait!

    {{pass}}

    {{=T("""If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code. A green title indicates that all tests (if defined) passed. In this case test results are not shown.""")}}

    {{=T('Functions with no doctests will result in [passed] tests.')}}

    {{=T('ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.')}}

    web2py-2.12.3.orig/applications/admin/views/default.mobile/about.html0000664000000000000000000000056612564727256024302 0ustar rootroot{{extend 'default.mobile/layout.html'}} {{block sectionclass}}about{{end}}

    {{=T("About application")}} "{{=app}}"

    {{=T("About")}} {{=app}}

    {{=button(URL('edit/%s/ABOUT' % (app)), T('Edit'))}}

    {{=about}}

    {{=T('License for')}} {{=app}}

    {{=button(URL('edit/%s/LICENSE' % (app)), T('Edit'))}}

    {{=license}}
    web2py-2.12.3.orig/applications/admin/views/default.mobile/edit_language.html0000664000000000000000000000056312564727256025755 0ustar rootroot{{extend 'default.mobile/layout.html'}} {{block sectionclass}}edit_language{{end}}

    {{=T('Editing Language file')}} "{{=filename}}"

    {{=form}}
    web2py-2.12.3.orig/applications/admin/views/default.mobile/user.html0000664000000000000000000000113512564727256024137 0ustar rootroot{{extend 'default.mobile/layout.html'}}

    {{=T( request.args(0).replace('_',' ').capitalize() )}}

    {{=form}} {{if request.args(0)=='login':}} {{if not 'register' in auth.settings.actions_disabled:}}
    register {{pass}} {{if not 'request_reset_password' in auth.settings.actions_disabled:}}
    lost password {{pass}} {{pass}}
    web2py-2.12.3.orig/applications/admin/views/default.mobile/uninstall.html0000664000000000000000000000050012564727256025165 0ustar rootroot{{extend 'default.mobile/layout.html'}}

    {{=T('Are you sure you want to uninstall application "%s"?', app)}}

    {{=FORM(INPUT(_type='submit',_name='nodelete',_value=T('Abort')))}} {{=FORM(INPUT(_type='submit',_name='delete',_value=T('Uninstall')))}}
    web2py-2.12.3.orig/applications/admin/views/default.mobile/change_password.html0000664000000000000000000000022112564727256026323 0ustar rootroot{{extend 'default.mobile/layout.html'}} {{block sectionclass}}change_password{{end}}

    Change Admin Password

    {{=form}}
    web2py-2.12.3.orig/applications/admin/views/wizard/0000775000000000000000000000000012564727256020701 5ustar rootrootweb2py-2.12.3.orig/applications/admin/views/wizard/step.html0000664000000000000000000002116212564727256022544 0ustar rootroot{{extend 'layout.html'}} {{block sectionclass}}step{{end}}

    {{=T('New Application Wizard')}}

    {{if request.function=='index':}}

    {{=T('Start a new app')}}

    {{else:}}

    {{=T('Basics')}}

    {{=button(URL('index'), T('restart'))}}

    App Name: {{=session.app['name']}}

    Current settings

    {{=button(URL('step1')+'/#xwizard_form', T('Edit'))}}

      {{for key,value in session.app['params']:}}
    • {{=key}}: {{=value}}
    • {{pass}}

    Tables

    {{=button(URL('step2')+'/#xwizard_form', T('edit all'))}}

      {{for i,table in enumerate(session.app['tables']):}}
    • {{=button(URL('step3',args=[i])+'/#xwizard_form', T('Edit'))}} {{=table}}
    • {{pass}}

    Pages

    {{=button(URL('step4')+'/#xwizard_form', T('edit all'))}}

      {{for i,page in enumerate(session.app['pages']):}}
    • {{=button(URL('step5',args=i)+'/#xwizard_form', T('Edit'))}} {{=page}}
    • {{pass}}

    {{=T('Generate')}}

    {{=button(URL('step6')+'/#xwizard_form', T('go!'))}}

    {{pass}}
      {{if 'step' in request.function:}}

    {{=T('Step')}} {{=step}}

    {{if request.function!='step1':}} {{=button(URL('step' + str(int(request.function[-1])-1)) + '/#xwizard_form', T('back'))}} {{pass}} {{else:}}

    {{=T('Begin')}}

    {{pass}} {{if request.function in ('step1','step2','step3','step4','step5'):}} {{=button(URL('step6') + '/#xwizard_form', T('skip to generate'))}} {{pass}}

    {{if request.function in ('step1','step6'):}} {{pass}} {{if request.function!='step6':}}
    {{=form.custom.begin}} {{ for fieldname in form.table.fields: }} {{if fieldname is not 'id':}} {{=form.custom.widget[fieldname]}} {{if fieldname=='layout_theme':}} {{pass}} {{pass}} {{pass}}
    {{=form.custom.end}}
    {{else:}}
    {{=form.custom.begin}} {{ for fieldname in form.table.fields: }} {{if fieldname is not 'id':}}
    {{pass}} {{pass}}
    {{=form.custom.end}}
    {{pass}}

    Instructions

    {{if request.function=='index':}}
    • Insert the name of a new app.
    • If the app exists and was created with the wizard, you will be able to edit it, but any manual editing to the app will be lost.
    {{elif request.function=='step1':}}
    • This Wizard will help you build a new web2py app.
    • You can create an app with a name that already exists.
    • If you do not have an email server set email server to "logging".
    • If you want to use Janrain Engage for login: 1) Sign up for a Janrain Engage account; 2) Register you hostname, domain, and obtain an api key; 3) Set Login Config above to "domain:api_key".
    • ATTENTION: you can use the wizard to download plugins BUT we cannot guarantee the stability or backward compatibility of plugins. Moreover plugins may conflict with each other. Anyway, we do recommend installing plugin "wiki" with adds CMS like capabilities to your app.
    {{elif request.function=='step2':}}
    • List the names of table that you need.
    • If you do not need authentication remove the table "auth_user".
    • Press enter to create a new input row.
    • Empty rows are ignored.
    • Other tables for role based access control will be created automatically, and do not need to be listed.
    • You will be able to add fields later.
    {{elif request.function=='step3':}}
    • List the fields for this table (do not include an id field, it is automatic), for example "name unique" or "birthday date" or "image upload" or "comments multiple" or "description wiki required"
    • The first keyword(s) for each entry will be used to generate a name for the table field and its label. You can use spaces an other unicode characters.
    • Keywords "string" (default), "text", "integer", "boolean", "float", "double", "file", "date", "time", "datetime", "file", "upload" will be used to determine the field type and they will not be made part of the field name.
    • For a reference field use a field name, followed by the name of the referenced table.
    • Other special keywords are "required", "notnull" or "notempty", "unique". They map into equivalent validators but (at this time) should only be used with string and text types.
    • The keywords "html" and "wiki" force a text type and set a representation for the field value as sanitized HTML and MARKMIN resepectively.
    • string, integer and reference fields can be "multiple", i.e. multiple values will be allowed
    • For the "auth_user" table do not add attributes to the default fields (username, first_name, last_name, password and email). They are handled automatically.
    • Some fields will be added automatically upon creation and handled automatically: "created_by", "created_on", "modified_by", "modified_on", "active" (only active fields can be selected).
    • For every table "table" another table "table_archive" is created and it contains the previous versions of each record. This is only accessible via appadmin or programmatically.
    {{elif request.function=='step4':}}
    • List the names of the pages you want to create.
    • Some pages are listed automatically because they expose Create/Read/Update/Delete for each tables you have created.
    • All pages, except "error" and those with name starting in underscore willbe listed in the menu. You will be able to edit the menu later.
    • You should have page "index", the starting point of your app, and page "error", where web2py will redirect to in case of error.
    {{elif request.function=='step5':}}
    • Use the markmin syntax to add text to your pages.
    {{elif request.function=='step6':}}
    • Almost done. Click on the button above to create your new app.
    • Once done you will be able to edit it as any normal web2py app.
    {{pass}}
    web2py-2.12.3.orig/applications/admin/views/wizard/generated.html0000664000000000000000000000123012564727256023521 0ustar rootroot{{extend 'layout.html'}} {{block sectionclass}}generated{{end}}
    {{=button(URL(app,'default','index'), T('Open new app in new window'))}} {{=button(URL('step1'), T('Back to wizard'))}} {{=button(URL('default','design',args=app), T('Admin design page'))}} {{if have_mercurial:}} {{=button(URL('mercurial','commit',args=app), T('Admin versioning page'))}} {{pass}} {{=button(URL(app,'appadmin','index'), T('Database administration'))}}


    web2py-2.12.3.orig/applications/admin/views/gae/0000775000000000000000000000000012564727256020135 5ustar rootrootweb2py-2.12.3.orig/applications/admin/views/gae/deploy.html0000664000000000000000000000247712564727256022331 0ustar rootroot{{extend 'layout.html'}}

    {{=T("Google App Engine Deployment Interface")}}

    {{=T("This page can upload your application to the Google App Engine computing cloud. Mind that you must first create indexes locally and this is done by installing the Google appserver and running the app locally with it once, or there will be errors when selecting records. Attention: deployment may take long time, depending on the network speed. Attention: it will overwrite your app.yaml. DO NOT SUBMIT TWICE.")}}

    {{if command:}}

    Command

    {{=CODE(command)}}

    {{=T("GAE Output")}}

    
    {{else:}}
    

    {{=T("Deployment form")}}

    {{=form}}
    {{pass}} web2py-2.12.3.orig/applications/admin/views/web2py_ajax.html0000664000000000000000000000142412564727256022503 0ustar rootroot {{ response.files.insert(0,URL('static','js/jquery.js')) response.files.insert(1,URL('static','css/calendar.css')) response.files.insert(2,URL('static','js/calendar.js')) response.files.insert(3,URL('static','js/web2py.js')) response.include_meta() response.include_files() }} web2py-2.12.3.orig/applications/admin/views/shell/0000775000000000000000000000000012564727256020510 5ustar rootrootweb2py-2.12.3.orig/applications/admin/views/shell/index.html0000664000000000000000000000676012564727256022516 0ustar rootroot{{extend 'layout.html'}} {{block sectionclass}}shell{{end}}
    • Using the shell may lock the database to other users of this app.
    • Each db statement is automatically committed.
    • Creating new tables dynamically is not allowed.
    • Models are automatically imported in the shell.
    web2py-2.12.3.orig/applications/admin/views/plugin_jqmobile/0000775000000000000000000000000012564727256022561 5ustar rootrootweb2py-2.12.3.orig/applications/admin/views/plugin_jqmobile/layout.html0000664000000000000000000001074012564727256024766 0ustar rootroot {{=response.title or request.application}}

    {{=response.title}}

    {{block header}} {{if 'auth' in globals():}} {{if not auth.user:}} Login {{else:}} Logout {{pass}} {{pass}} {{=T("Home")}} {{end}}
    {{if response.flash:}}
    {{=response.flash}}
    {{pass}} {{if response.menu:}}
    • {{=T("Main Menu")}}
    • {{for _ in response.menu:}}
    • {{=_[0]}}
    • {{pass}}
    {{pass}} {{include}}
    {{block footer}} powered by web2py - @{{=request.now.year}} {{end}}
    web2py-2.12.3.orig/applications/admin/views/plugin_jqmobile/index.html0000664000000000000000000000152012564727256024554 0ustar rootroot{{extend 'plugin_jqmobile/layout.html'}} {{block header}} {{if 'auth' in globals():}} {{if not auth.user:}} Login {{else:}} Logout {{pass}} {{pass}} {{=T("Home")}} {{end}}
    Search results for tag: {{='tag'}}
      {{if True:}}
    • Pages
    • {{for child in ('dog','cat','mouse'):}} {{title = child}}
    • {{=child}}
    • {{pass}} {{pass}}
    {{for tag in ('dog','cat','mouse'):}} {{=tag}} {{pass}}
    web2py-2.12.3.orig/applications/admin/views/plugin_jqmobile/about.html0000664000000000000000000000403512564727256024563 0ustar rootroot jQuery Mobile Plugin for web2py

    web2py plugin

    for jQuery Mobile

    Try click on a button on the left, it is a demo!

    License

    MIT (same as jQuery Mobile)

    Instructions

    • Download and install the plugin in a web2py app.
    • Replace extend "layout.html" with extend "plugin_jqmobile/layout.html" in all your views.
    • Only link pages that extend this layout.
    • Link external pages with <a rel="external" ...>.
    • Optional: make a different response.menu for each action.

    Created by

    • Jason Blum
    • Timothy Stockman
    • Harkirat Singh
    • Massimo Di Pierro
    web2py-2.12.3.orig/applications/admin/LICENSE0000664000000000000000000001525212564727252017252 0ustar rootroot## Web2py License Web2py is Licensed under the LGPL license version 3 (http://www.gnu.org/licenses/lgpl.html) Copyrighted (c) by Massimo Di Pierro (2007-2011) ### On Commercial Redistribution In accordance with LGPL you may: - redistribute web2py with your apps (including official web2py binary versions) - release your applications which use official web2py libraries under any license you wish But you must: - make clear in the documentation that your application uses web2py - release any modification of the web2py libraries under the LGPLv3 license THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. (Earlier versions of web2py, 1.0.*-1.90.*, were released under the GPL2 license plus a commercial exception which, for practical purposes, was very similar to the current LPGLv3) ### Licenses for third party contributed software web2py contains third party software under the gluon/contrib/ folder. Each file/module in contrib is distributed with web2py under its original license. Here we list some of them. #### gluon.contrib.simplejson LICENSE Copyright (c) 2006 Bob Ippolito - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #### gluon.contrib.rss2.py (originally PyRSS2Gen) LICENSE This is copyright (c) by Dalke Scientific Software, LLC and released under the BSD license. See the file LICENSE in the distribution or for details. #### gluon.contrib.markdown (markdown2) LICENSE MIT License from from #### gluon.contrib.feedparser LICENSE Copyright (c) 2002-2005, Mark Pilgrim All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #### gluon.wsgiserver.py LICENSE (borrowed from cherrypy) Copyright (c) 2004, CherryPy Team (team@cherrypy.org) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the CherryPy Team nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #### gluon.contrib.pam LICENSE Copyright (C) 2007-2009 Chris AtLee Licensed under the MIT license #### gluon.contrib.shell LICENSE Copyright (C) by Google inc. Apache 2.0 Lincense #### The javascript licenses are in the code itself web2py-2.12.3.orig/applications/admin/cron/0000775000000000000000000000000012564727254017203 5ustar rootrootweb2py-2.12.3.orig/applications/admin/cron/expire_sessions.py0000664000000000000000000000150712564727254023002 0ustar rootrootEXPIRATION_MINUTES=60 DIGITS=('0','1','2','3','4','5','6','7','8','9') import os, time, stat, cPickle, logging path = os.path.join(request.folder,'sessions') if not os.path.exists(path): os.mkdir(path) now = time.time() for filename in os.listdir(path): fullpath=os.path.join(path,filename) if os.path.isfile(fullpath) and filename.startswith(DIGITS): try: filetime = os.stat(fullpath)[stat.ST_MTIME] # get it before our io try: session_data = cPickle.load(open(fullpath, 'rb+')) expiration = session_data['auth']['expiration'] except: expiration = EXPIRATION_MINUTES * 60 if (now - filetime) > expiration: os.unlink(fullpath) except: logging.exception('failure to check %s' % fullpath) web2py-2.12.3.orig/applications/admin/cron/crontab0000664000000000000000000000007612564727254020561 0ustar rootroot10 * * * * root **applications/admin/cron/expire_sessions.py web2py-2.12.3.orig/applications/admin/settings.cfg0000664000000000000000000000026712564727254020570 0ustar rootroot[DEFAULT] [editor] theme = web2py editor = default closetag = true [editor_sessions] welcome = welcome/models/db.py,welcome/controllers/default.py,welcome/views/default/index.html web2py-2.12.3.orig/applications/admin/__init__.py0000664000000000000000000000000112564727252020340 0ustar rootroot web2py-2.12.3.orig/applications/admin/static/0000775000000000000000000000000012564727256017533 5ustar rootrootweb2py-2.12.3.orig/applications/admin/static/codemirror/0000775000000000000000000000000012564727254021676 5ustar rootrootweb2py-2.12.3.orig/applications/admin/static/codemirror/addon/0000775000000000000000000000000012564727254022763 5ustar rootrootweb2py-2.12.3.orig/applications/admin/static/codemirror/addon/fold/0000775000000000000000000000000012564727254023707 5ustar rootrootweb2py-2.12.3.orig/applications/admin/static/codemirror/addon/fold/comment-fold.js0000664000000000000000000000371712564727254026641 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.registerGlobalHelper("fold", "comment", function(mode) { return mode.blockCommentStart && mode.blockCommentEnd; }, function(cm, start) { var mode = cm.getModeAt(start), startToken = mode.blockCommentStart, endToken = mode.blockCommentEnd; if (!startToken || !endToken) return; var line = start.line, lineText = cm.getLine(line); var startCh; for (var at = start.ch, pass = 0;;) { var found = at <= 0 ? -1 : lineText.lastIndexOf(startToken, at - 1); if (found == -1) { if (pass == 1) return; pass = 1; at = lineText.length; continue; } if (pass == 1 && found < start.ch) return; if (/comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1)))) { startCh = found + startToken.length; break; } at = found - 1; } var depth = 1, lastLine = cm.lastLine(), end, endCh; outer: for (var i = line; i <= lastLine; ++i) { var text = cm.getLine(i), pos = i == line ? startCh : 0; for (;;) { var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos); if (nextOpen < 0) nextOpen = text.length; if (nextClose < 0) nextClose = text.length; pos = Math.min(nextOpen, nextClose); if (pos == text.length) break; if (pos == nextOpen) ++depth; else if (!--depth) { end = i; endCh = pos; break outer; } ++pos; } } if (end == null || line == end && endCh == startCh) return; return {from: CodeMirror.Pos(line, startCh), to: CodeMirror.Pos(end, endCh)}; }); }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/fold/foldcode.js0000664000000000000000000001112512564727254026024 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; function doFold(cm, pos, options, force) { if (options && options.call) { var finder = options; options = null; } else { var finder = getOption(cm, options, "rangeFinder"); } if (typeof pos == "number") pos = CodeMirror.Pos(pos, 0); var minSize = getOption(cm, options, "minFoldSize"); function getRange(allowFolded) { var range = finder(cm, pos); if (!range || range.to.line - range.from.line < minSize) return null; var marks = cm.findMarksAt(range.from); for (var i = 0; i < marks.length; ++i) { if (marks[i].__isFold && force !== "fold") { if (!allowFolded) return null; range.cleared = true; marks[i].clear(); } } return range; } var range = getRange(true); if (getOption(cm, options, "scanUp")) while (!range && pos.line > cm.firstLine()) { pos = CodeMirror.Pos(pos.line - 1, 0); range = getRange(false); } if (!range || range.cleared || force === "unfold") return; var myWidget = makeWidget(cm, options); CodeMirror.on(myWidget, "mousedown", function(e) { myRange.clear(); CodeMirror.e_preventDefault(e); }); var myRange = cm.markText(range.from, range.to, { replacedWith: myWidget, clearOnEnter: true, __isFold: true }); myRange.on("clear", function(from, to) { CodeMirror.signal(cm, "unfold", cm, from, to); }); CodeMirror.signal(cm, "fold", cm, range.from, range.to); } function makeWidget(cm, options) { var widget = getOption(cm, options, "widget"); if (typeof widget == "string") { var text = document.createTextNode(widget); widget = document.createElement("span"); widget.appendChild(text); widget.className = "CodeMirror-foldmarker"; } return widget; } // Clumsy backwards-compatible interface CodeMirror.newFoldFunction = function(rangeFinder, widget) { return function(cm, pos) { doFold(cm, pos, {rangeFinder: rangeFinder, widget: widget}); }; }; // New-style interface CodeMirror.defineExtension("foldCode", function(pos, options, force) { doFold(this, pos, options, force); }); CodeMirror.defineExtension("isFolded", function(pos) { var marks = this.findMarksAt(pos); for (var i = 0; i < marks.length; ++i) if (marks[i].__isFold) return true; }); CodeMirror.commands.toggleFold = function(cm) { cm.foldCode(cm.getCursor()); }; CodeMirror.commands.fold = function(cm) { cm.foldCode(cm.getCursor(), null, "fold"); }; CodeMirror.commands.unfold = function(cm) { cm.foldCode(cm.getCursor(), null, "unfold"); }; CodeMirror.commands.foldAll = function(cm) { cm.operation(function() { for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++) cm.foldCode(CodeMirror.Pos(i, 0), null, "fold"); }); }; CodeMirror.commands.unfoldAll = function(cm) { cm.operation(function() { for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++) cm.foldCode(CodeMirror.Pos(i, 0), null, "unfold"); }); }; CodeMirror.registerHelper("fold", "combine", function() { var funcs = Array.prototype.slice.call(arguments, 0); return function(cm, start) { for (var i = 0; i < funcs.length; ++i) { var found = funcs[i](cm, start); if (found) return found; } }; }); CodeMirror.registerHelper("fold", "auto", function(cm, start) { var helpers = cm.getHelpers(start, "fold"); for (var i = 0; i < helpers.length; i++) { var cur = helpers[i](cm, start); if (cur) return cur; } }); var defaultOptions = { rangeFinder: CodeMirror.fold.auto, widget: "\u2194", minFoldSize: 0, scanUp: false }; CodeMirror.defineOption("foldOptions", null); function getOption(cm, options, name) { if (options && options[name] !== undefined) return options[name]; var editorOptions = cm.options.foldOptions; if (editorOptions && editorOptions[name] !== undefined) return editorOptions[name]; return defaultOptions[name]; } CodeMirror.defineExtension("foldOption", function(options, name) { return getOption(this, options, name); }); }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/fold/foldgutter.css0000664000000000000000000000066312564727254026605 0ustar rootroot.CodeMirror-foldmarker { color: blue; text-shadow: #b9f 1px 1px 2px, #b9f -1px -1px 2px, #b9f 1px -1px 2px, #b9f -1px 1px 2px; font-family: arial; line-height: .3; cursor: pointer; } .CodeMirror-foldgutter { width: .7em; } .CodeMirror-foldgutter-open, .CodeMirror-foldgutter-folded { cursor: pointer; } .CodeMirror-foldgutter-open:after { content: "\25BE"; } .CodeMirror-foldgutter-folded:after { content: "\25B8"; } web2py-2.12.3.orig/applications/admin/static/codemirror/addon/fold/xml-fold.js0000664000000000000000000001465212564727254025777 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var Pos = CodeMirror.Pos; function cmp(a, b) { return a.line - b.line || a.ch - b.ch; } var nameStartChar = "A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD"; var nameChar = nameStartChar + "\-\:\.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040"; var xmlTagStart = new RegExp("<(/?)([" + nameStartChar + "][" + nameChar + "]*)", "g"); function Iter(cm, line, ch, range) { this.line = line; this.ch = ch; this.cm = cm; this.text = cm.getLine(line); this.min = range ? range.from : cm.firstLine(); this.max = range ? range.to - 1 : cm.lastLine(); } function tagAt(iter, ch) { var type = iter.cm.getTokenTypeAt(Pos(iter.line, ch)); return type && /\btag\b/.test(type); } function nextLine(iter) { if (iter.line >= iter.max) return; iter.ch = 0; iter.text = iter.cm.getLine(++iter.line); return true; } function prevLine(iter) { if (iter.line <= iter.min) return; iter.text = iter.cm.getLine(--iter.line); iter.ch = iter.text.length; return true; } function toTagEnd(iter) { for (;;) { var gt = iter.text.indexOf(">", iter.ch); if (gt == -1) { if (nextLine(iter)) continue; else return; } if (!tagAt(iter, gt + 1)) { iter.ch = gt + 1; continue; } var lastSlash = iter.text.lastIndexOf("/", gt); var selfClose = lastSlash > -1 && !/\S/.test(iter.text.slice(lastSlash + 1, gt)); iter.ch = gt + 1; return selfClose ? "selfClose" : "regular"; } } function toTagStart(iter) { for (;;) { var lt = iter.ch ? iter.text.lastIndexOf("<", iter.ch - 1) : -1; if (lt == -1) { if (prevLine(iter)) continue; else return; } if (!tagAt(iter, lt + 1)) { iter.ch = lt; continue; } xmlTagStart.lastIndex = lt; iter.ch = lt; var match = xmlTagStart.exec(iter.text); if (match && match.index == lt) return match; } } function toNextTag(iter) { for (;;) { xmlTagStart.lastIndex = iter.ch; var found = xmlTagStart.exec(iter.text); if (!found) { if (nextLine(iter)) continue; else return; } if (!tagAt(iter, found.index + 1)) { iter.ch = found.index + 1; continue; } iter.ch = found.index + found[0].length; return found; } } function toPrevTag(iter) { for (;;) { var gt = iter.ch ? iter.text.lastIndexOf(">", iter.ch - 1) : -1; if (gt == -1) { if (prevLine(iter)) continue; else return; } if (!tagAt(iter, gt + 1)) { iter.ch = gt; continue; } var lastSlash = iter.text.lastIndexOf("/", gt); var selfClose = lastSlash > -1 && !/\S/.test(iter.text.slice(lastSlash + 1, gt)); iter.ch = gt + 1; return selfClose ? "selfClose" : "regular"; } } function findMatchingClose(iter, tag) { var stack = []; for (;;) { var next = toNextTag(iter), end, startLine = iter.line, startCh = iter.ch - (next ? next[0].length : 0); if (!next || !(end = toTagEnd(iter))) return; if (end == "selfClose") continue; if (next[1]) { // closing tag for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == next[2]) { stack.length = i; break; } if (i < 0 && (!tag || tag == next[2])) return { tag: next[2], from: Pos(startLine, startCh), to: Pos(iter.line, iter.ch) }; } else { // opening tag stack.push(next[2]); } } } function findMatchingOpen(iter, tag) { var stack = []; for (;;) { var prev = toPrevTag(iter); if (!prev) return; if (prev == "selfClose") { toTagStart(iter); continue; } var endLine = iter.line, endCh = iter.ch; var start = toTagStart(iter); if (!start) return; if (start[1]) { // closing tag stack.push(start[2]); } else { // opening tag for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == start[2]) { stack.length = i; break; } if (i < 0 && (!tag || tag == start[2])) return { tag: start[2], from: Pos(iter.line, iter.ch), to: Pos(endLine, endCh) }; } } } CodeMirror.registerHelper("fold", "xml", function(cm, start) { var iter = new Iter(cm, start.line, 0); for (;;) { var openTag = toNextTag(iter), end; if (!openTag || iter.line != start.line || !(end = toTagEnd(iter))) return; if (!openTag[1] && end != "selfClose") { var start = Pos(iter.line, iter.ch); var close = findMatchingClose(iter, openTag[2]); return close && {from: start, to: close.from}; } } }); CodeMirror.findMatchingTag = function(cm, pos, range) { var iter = new Iter(cm, pos.line, pos.ch, range); if (iter.text.indexOf(">") == -1 && iter.text.indexOf("<") == -1) return; var end = toTagEnd(iter), to = end && Pos(iter.line, iter.ch); var start = end && toTagStart(iter); if (!end || !start || cmp(iter, pos) > 0) return; var here = {from: Pos(iter.line, iter.ch), to: to, tag: start[2]}; if (end == "selfClose") return {open: here, close: null, at: "open"}; if (start[1]) { // closing tag return {open: findMatchingOpen(iter, start[2]), close: here, at: "close"}; } else { // opening tag iter = new Iter(cm, to.line, to.ch, range); return {open: here, close: findMatchingClose(iter, start[2]), at: "open"}; } }; CodeMirror.findEnclosingTag = function(cm, pos, range) { var iter = new Iter(cm, pos.line, pos.ch, range); for (;;) { var open = findMatchingOpen(iter); if (!open) break; var forward = new Iter(cm, pos.line, pos.ch, range); var close = findMatchingClose(forward, open.tag); if (close) return {open: open, close: close}; } }; // Used by addon/edit/closetag.js CodeMirror.scanForClosingTag = function(cm, pos, name, end) { var iter = new Iter(cm, pos.line, pos.ch, end ? {from: 0, to: end} : null); return findMatchingClose(iter, name); }; }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/fold/foldgutter.js0000664000000000000000000001070612564727254026430 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("./foldcode")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "./foldcode"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineOption("foldGutter", false, function(cm, val, old) { if (old && old != CodeMirror.Init) { cm.clearGutter(cm.state.foldGutter.options.gutter); cm.state.foldGutter = null; cm.off("gutterClick", onGutterClick); cm.off("change", onChange); cm.off("viewportChange", onViewportChange); cm.off("fold", onFold); cm.off("unfold", onFold); cm.off("swapDoc", updateInViewport); } if (val) { cm.state.foldGutter = new State(parseOptions(val)); updateInViewport(cm); cm.on("gutterClick", onGutterClick); cm.on("change", onChange); cm.on("viewportChange", onViewportChange); cm.on("fold", onFold); cm.on("unfold", onFold); cm.on("swapDoc", updateInViewport); } }); var Pos = CodeMirror.Pos; function State(options) { this.options = options; this.from = this.to = 0; } function parseOptions(opts) { if (opts === true) opts = {}; if (opts.gutter == null) opts.gutter = "CodeMirror-foldgutter"; if (opts.indicatorOpen == null) opts.indicatorOpen = "CodeMirror-foldgutter-open"; if (opts.indicatorFolded == null) opts.indicatorFolded = "CodeMirror-foldgutter-folded"; return opts; } function isFolded(cm, line) { var marks = cm.findMarksAt(Pos(line)); for (var i = 0; i < marks.length; ++i) if (marks[i].__isFold && marks[i].find().from.line == line) return true; } function marker(spec) { if (typeof spec == "string") { var elt = document.createElement("div"); elt.className = spec + " CodeMirror-guttermarker-subtle"; return elt; } else { return spec.cloneNode(true); } } function updateFoldInfo(cm, from, to) { var opts = cm.state.foldGutter.options, cur = from; var minSize = cm.foldOption(opts, "minFoldSize"); var func = cm.foldOption(opts, "rangeFinder"); cm.eachLine(from, to, function(line) { var mark = null; if (isFolded(cm, cur)) { mark = marker(opts.indicatorFolded); } else { var pos = Pos(cur, 0); var range = func && func(cm, pos); if (range && range.to.line - range.from.line >= minSize) mark = marker(opts.indicatorOpen); } cm.setGutterMarker(line, opts.gutter, mark); ++cur; }); } function updateInViewport(cm) { var vp = cm.getViewport(), state = cm.state.foldGutter; if (!state) return; cm.operation(function() { updateFoldInfo(cm, vp.from, vp.to); }); state.from = vp.from; state.to = vp.to; } function onGutterClick(cm, line, gutter) { var state = cm.state.foldGutter; if (!state) return; var opts = state.options; if (gutter != opts.gutter) return; cm.foldCode(Pos(line, 0), opts.rangeFinder); } function onChange(cm) { var state = cm.state.foldGutter; if (!state) return; var opts = state.options; state.from = state.to = 0; clearTimeout(state.changeUpdate); state.changeUpdate = setTimeout(function() { updateInViewport(cm); }, opts.foldOnChangeTimeSpan || 600); } function onViewportChange(cm) { var state = cm.state.foldGutter; if (!state) return; var opts = state.options; clearTimeout(state.changeUpdate); state.changeUpdate = setTimeout(function() { var vp = cm.getViewport(); if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) { updateInViewport(cm); } else { cm.operation(function() { if (vp.from < state.from) { updateFoldInfo(cm, vp.from, state.from); state.from = vp.from; } if (vp.to > state.to) { updateFoldInfo(cm, state.to, vp.to); state.to = vp.to; } }); } }, opts.updateViewportTimeSpan || 400); } function onFold(cm, from) { var state = cm.state.foldGutter; if (!state) return; var line = from.line; if (line >= state.from && line < state.to) updateFoldInfo(cm, line, line + 1); } }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/fold/markdown-fold.js0000664000000000000000000000310512564727254027010 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.registerHelper("fold", "markdown", function(cm, start) { var maxDepth = 100; function isHeader(lineNo) { var tokentype = cm.getTokenTypeAt(CodeMirror.Pos(lineNo, 0)); return tokentype && /\bheader\b/.test(tokentype); } function headerLevel(lineNo, line, nextLine) { var match = line && line.match(/^#+/); if (match && isHeader(lineNo)) return match[0].length; match = nextLine && nextLine.match(/^[=\-]+\s*$/); if (match && isHeader(lineNo + 1)) return nextLine[0] == "=" ? 1 : 2; return maxDepth; } var firstLine = cm.getLine(start.line), nextLine = cm.getLine(start.line + 1); var level = headerLevel(start.line, firstLine, nextLine); if (level === maxDepth) return undefined; var lastLineNo = cm.lastLine(); var end = start.line, nextNextLine = cm.getLine(end + 2); while (end < lastLineNo) { if (headerLevel(end + 1, nextLine, nextNextLine) <= level) break; ++end; nextLine = nextNextLine; nextNextLine = cm.getLine(end + 2); } return { from: CodeMirror.Pos(start.line, firstLine.length), to: CodeMirror.Pos(end, cm.getLine(end).length) }; }); }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/fold/brace-fold.js0000664000000000000000000000750012564727254026245 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.registerHelper("fold", "brace", function(cm, start) { var line = start.line, lineText = cm.getLine(line); var startCh, tokenType; function findOpening(openCh) { for (var at = start.ch, pass = 0;;) { var found = at <= 0 ? -1 : lineText.lastIndexOf(openCh, at - 1); if (found == -1) { if (pass == 1) break; pass = 1; at = lineText.length; continue; } if (pass == 1 && found < start.ch) break; tokenType = cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1)); if (!/^(comment|string)/.test(tokenType)) return found + 1; at = found - 1; } } var startToken = "{", endToken = "}", startCh = findOpening("{"); if (startCh == null) { startToken = "[", endToken = "]"; startCh = findOpening("["); } if (startCh == null) return; var count = 1, lastLine = cm.lastLine(), end, endCh; outer: for (var i = line; i <= lastLine; ++i) { var text = cm.getLine(i), pos = i == line ? startCh : 0; for (;;) { var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos); if (nextOpen < 0) nextOpen = text.length; if (nextClose < 0) nextClose = text.length; pos = Math.min(nextOpen, nextClose); if (pos == text.length) break; if (cm.getTokenTypeAt(CodeMirror.Pos(i, pos + 1)) == tokenType) { if (pos == nextOpen) ++count; else if (!--count) { end = i; endCh = pos; break outer; } } ++pos; } } if (end == null || line == end && endCh == startCh) return; return {from: CodeMirror.Pos(line, startCh), to: CodeMirror.Pos(end, endCh)}; }); CodeMirror.registerHelper("fold", "import", function(cm, start) { function hasImport(line) { if (line < cm.firstLine() || line > cm.lastLine()) return null; var start = cm.getTokenAt(CodeMirror.Pos(line, 1)); if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1)); if (start.type != "keyword" || start.string != "import") return null; // Now find closing semicolon, return its position for (var i = line, e = Math.min(cm.lastLine(), line + 10); i <= e; ++i) { var text = cm.getLine(i), semi = text.indexOf(";"); if (semi != -1) return {startCh: start.end, end: CodeMirror.Pos(i, semi)}; } } var start = start.line, has = hasImport(start), prev; if (!has || hasImport(start - 1) || ((prev = hasImport(start - 2)) && prev.end.line == start - 1)) return null; for (var end = has.end;;) { var next = hasImport(end.line + 1); if (next == null) break; end = next.end; } return {from: cm.clipPos(CodeMirror.Pos(start, has.startCh + 1)), to: end}; }); CodeMirror.registerHelper("fold", "include", function(cm, start) { function hasInclude(line) { if (line < cm.firstLine() || line > cm.lastLine()) return null; var start = cm.getTokenAt(CodeMirror.Pos(line, 1)); if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1)); if (start.type == "meta" && start.string.slice(0, 8) == "#include") return start.start + 8; } var start = start.line, has = hasInclude(start); if (has == null || hasInclude(start - 1) != null) return null; for (var end = start;;) { var next = hasInclude(end + 1); if (next == null) break; ++end; } return {from: CodeMirror.Pos(start, has + 1), to: cm.clipPos(CodeMirror.Pos(end))}; }); }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/fold/indent-fold.js0000664000000000000000000000313312564727254026450 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.registerHelper("fold", "indent", function(cm, start) { var tabSize = cm.getOption("tabSize"), firstLine = cm.getLine(start.line); if (!/\S/.test(firstLine)) return; var getIndent = function(line) { return CodeMirror.countColumn(line, null, tabSize); }; var myIndent = getIndent(firstLine); var lastLineInFold = null; // Go through lines until we find a line that definitely doesn't belong in // the block we're folding, or to the end. for (var i = start.line + 1, end = cm.lastLine(); i <= end; ++i) { var curLine = cm.getLine(i); var curIndent = getIndent(curLine); if (curIndent > myIndent) { // Lines with a greater indent are considered part of the block. lastLineInFold = i; } else if (!/\S/.test(curLine)) { // Empty lines might be breaks within the block we're trying to fold. } else { // A non-empty line at an indent equal to or less than ours marks the // start of another block. break; } } if (lastLineInFold) return { from: CodeMirror.Pos(start.line, firstLine.length), to: CodeMirror.Pos(lastLineInFold, cm.getLine(lastLineInFold).length) }; }); }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/hint/0000775000000000000000000000000012564727254023725 5ustar rootrootweb2py-2.12.3.orig/applications/admin/static/codemirror/addon/hint/html-hint.js0000664000000000000000000002611512564727254026174 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("./xml-hint")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "./xml-hint"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var langs = "ab aa af ak sq am ar an hy as av ae ay az bm ba eu be bn bh bi bs br bg my ca ch ce ny zh cv kw co cr hr cs da dv nl dz en eo et ee fo fj fi fr ff gl ka de el gn gu ht ha he hz hi ho hu ia id ie ga ig ik io is it iu ja jv kl kn kr ks kk km ki rw ky kv kg ko ku kj la lb lg li ln lo lt lu lv gv mk mg ms ml mt mi mr mh mn na nv nb nd ne ng nn no ii nr oc oj cu om or os pa pi fa pl ps pt qu rm rn ro ru sa sc sd se sm sg sr gd sn si sk sl so st es su sw ss sv ta te tg th ti bo tk tl tn to tr ts tt tw ty ug uk ur uz ve vi vo wa cy wo fy xh yi yo za zu".split(" "); var targets = ["_blank", "_self", "_top", "_parent"]; var charsets = ["ascii", "utf-8", "utf-16", "latin1", "latin1"]; var methods = ["get", "post", "put", "delete"]; var encs = ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"]; var media = ["all", "screen", "print", "embossed", "braille", "handheld", "print", "projection", "screen", "tty", "tv", "speech", "3d-glasses", "resolution [>][<][=] [X]", "device-aspect-ratio: X/Y", "orientation:portrait", "orientation:landscape", "device-height: [X]", "device-width: [X]"]; var s = { attrs: {} }; // Simple tag, reused for a whole lot of tags var data = { a: { attrs: { href: null, ping: null, type: null, media: media, target: targets, hreflang: langs } }, abbr: s, acronym: s, address: s, applet: s, area: { attrs: { alt: null, coords: null, href: null, target: null, ping: null, media: media, hreflang: langs, type: null, shape: ["default", "rect", "circle", "poly"] } }, article: s, aside: s, audio: { attrs: { src: null, mediagroup: null, crossorigin: ["anonymous", "use-credentials"], preload: ["none", "metadata", "auto"], autoplay: ["", "autoplay"], loop: ["", "loop"], controls: ["", "controls"] } }, b: s, base: { attrs: { href: null, target: targets } }, basefont: s, bdi: s, bdo: s, big: s, blockquote: { attrs: { cite: null } }, body: s, br: s, button: { attrs: { form: null, formaction: null, name: null, value: null, autofocus: ["", "autofocus"], disabled: ["", "autofocus"], formenctype: encs, formmethod: methods, formnovalidate: ["", "novalidate"], formtarget: targets, type: ["submit", "reset", "button"] } }, canvas: { attrs: { width: null, height: null } }, caption: s, center: s, cite: s, code: s, col: { attrs: { span: null } }, colgroup: { attrs: { span: null } }, command: { attrs: { type: ["command", "checkbox", "radio"], label: null, icon: null, radiogroup: null, command: null, title: null, disabled: ["", "disabled"], checked: ["", "checked"] } }, data: { attrs: { value: null } }, datagrid: { attrs: { disabled: ["", "disabled"], multiple: ["", "multiple"] } }, datalist: { attrs: { data: null } }, dd: s, del: { attrs: { cite: null, datetime: null } }, details: { attrs: { open: ["", "open"] } }, dfn: s, dir: s, div: s, dl: s, dt: s, em: s, embed: { attrs: { src: null, type: null, width: null, height: null } }, eventsource: { attrs: { src: null } }, fieldset: { attrs: { disabled: ["", "disabled"], form: null, name: null } }, figcaption: s, figure: s, font: s, footer: s, form: { attrs: { action: null, name: null, "accept-charset": charsets, autocomplete: ["on", "off"], enctype: encs, method: methods, novalidate: ["", "novalidate"], target: targets } }, frame: s, frameset: s, h1: s, h2: s, h3: s, h4: s, h5: s, h6: s, head: { attrs: {}, children: ["title", "base", "link", "style", "meta", "script", "noscript", "command"] }, header: s, hgroup: s, hr: s, html: { attrs: { manifest: null }, children: ["head", "body"] }, i: s, iframe: { attrs: { src: null, srcdoc: null, name: null, width: null, height: null, sandbox: ["allow-top-navigation", "allow-same-origin", "allow-forms", "allow-scripts"], seamless: ["", "seamless"] } }, img: { attrs: { alt: null, src: null, ismap: null, usemap: null, width: null, height: null, crossorigin: ["anonymous", "use-credentials"] } }, input: { attrs: { alt: null, dirname: null, form: null, formaction: null, height: null, list: null, max: null, maxlength: null, min: null, name: null, pattern: null, placeholder: null, size: null, src: null, step: null, value: null, width: null, accept: ["audio/*", "video/*", "image/*"], autocomplete: ["on", "off"], autofocus: ["", "autofocus"], checked: ["", "checked"], disabled: ["", "disabled"], formenctype: encs, formmethod: methods, formnovalidate: ["", "novalidate"], formtarget: targets, multiple: ["", "multiple"], readonly: ["", "readonly"], required: ["", "required"], type: ["hidden", "text", "search", "tel", "url", "email", "password", "datetime", "date", "month", "week", "time", "datetime-local", "number", "range", "color", "checkbox", "radio", "file", "submit", "image", "reset", "button"] } }, ins: { attrs: { cite: null, datetime: null } }, kbd: s, keygen: { attrs: { challenge: null, form: null, name: null, autofocus: ["", "autofocus"], disabled: ["", "disabled"], keytype: ["RSA"] } }, label: { attrs: { "for": null, form: null } }, legend: s, li: { attrs: { value: null } }, link: { attrs: { href: null, type: null, hreflang: langs, media: media, sizes: ["all", "16x16", "16x16 32x32", "16x16 32x32 64x64"] } }, map: { attrs: { name: null } }, mark: s, menu: { attrs: { label: null, type: ["list", "context", "toolbar"] } }, meta: { attrs: { content: null, charset: charsets, name: ["viewport", "application-name", "author", "description", "generator", "keywords"], "http-equiv": ["content-language", "content-type", "default-style", "refresh"] } }, meter: { attrs: { value: null, min: null, low: null, high: null, max: null, optimum: null } }, nav: s, noframes: s, noscript: s, object: { attrs: { data: null, type: null, name: null, usemap: null, form: null, width: null, height: null, typemustmatch: ["", "typemustmatch"] } }, ol: { attrs: { reversed: ["", "reversed"], start: null, type: ["1", "a", "A", "i", "I"] } }, optgroup: { attrs: { disabled: ["", "disabled"], label: null } }, option: { attrs: { disabled: ["", "disabled"], label: null, selected: ["", "selected"], value: null } }, output: { attrs: { "for": null, form: null, name: null } }, p: s, param: { attrs: { name: null, value: null } }, pre: s, progress: { attrs: { value: null, max: null } }, q: { attrs: { cite: null } }, rp: s, rt: s, ruby: s, s: s, samp: s, script: { attrs: { type: ["text/javascript"], src: null, async: ["", "async"], defer: ["", "defer"], charset: charsets } }, section: s, select: { attrs: { form: null, name: null, size: null, autofocus: ["", "autofocus"], disabled: ["", "disabled"], multiple: ["", "multiple"] } }, small: s, source: { attrs: { src: null, type: null, media: null } }, span: s, strike: s, strong: s, style: { attrs: { type: ["text/css"], media: media, scoped: null } }, sub: s, summary: s, sup: s, table: s, tbody: s, td: { attrs: { colspan: null, rowspan: null, headers: null } }, textarea: { attrs: { dirname: null, form: null, maxlength: null, name: null, placeholder: null, rows: null, cols: null, autofocus: ["", "autofocus"], disabled: ["", "disabled"], readonly: ["", "readonly"], required: ["", "required"], wrap: ["soft", "hard"] } }, tfoot: s, th: { attrs: { colspan: null, rowspan: null, headers: null, scope: ["row", "col", "rowgroup", "colgroup"] } }, thead: s, time: { attrs: { datetime: null } }, title: s, tr: s, track: { attrs: { src: null, label: null, "default": null, kind: ["subtitles", "captions", "descriptions", "chapters", "metadata"], srclang: langs } }, tt: s, u: s, ul: s, "var": s, video: { attrs: { src: null, poster: null, width: null, height: null, crossorigin: ["anonymous", "use-credentials"], preload: ["auto", "metadata", "none"], autoplay: ["", "autoplay"], mediagroup: ["movie"], muted: ["", "muted"], controls: ["", "controls"] } }, wbr: s }; var globalAttrs = { accesskey: ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"], "class": null, contenteditable: ["true", "false"], contextmenu: null, dir: ["ltr", "rtl", "auto"], draggable: ["true", "false", "auto"], dropzone: ["copy", "move", "link", "string:", "file:"], hidden: ["hidden"], id: null, inert: ["inert"], itemid: null, itemprop: null, itemref: null, itemscope: ["itemscope"], itemtype: null, lang: ["en", "es"], spellcheck: ["true", "false"], style: null, tabindex: ["1", "2", "3", "4", "5", "6", "7", "8", "9"], title: null, translate: ["yes", "no"], onclick: null, rel: ["stylesheet", "alternate", "author", "bookmark", "help", "license", "next", "nofollow", "noreferrer", "prefetch", "prev", "search", "tag"] }; function populate(obj) { for (var attr in globalAttrs) if (globalAttrs.hasOwnProperty(attr)) obj.attrs[attr] = globalAttrs[attr]; } populate(s); for (var tag in data) if (data.hasOwnProperty(tag) && data[tag] != s) populate(data[tag]); CodeMirror.htmlSchema = data; function htmlHint(cm, options) { var local = {schemaInfo: data}; if (options) for (var opt in options) local[opt] = options[opt]; return CodeMirror.hint.xml(cm, local); } CodeMirror.registerHelper("hint", "html", htmlHint); }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/hint/show-hint.css0000664000000000000000000000122612564727254026360 0ustar rootroot.CodeMirror-hints { position: absolute; z-index: 10; overflow: hidden; list-style: none; margin: 0; padding: 2px; -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2); -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2); box-shadow: 2px 3px 5px rgba(0,0,0,.2); border-radius: 3px; border: 1px solid silver; background: white; font-size: 90%; font-family: monospace; max-height: 20em; overflow-y: auto; } .CodeMirror-hint { margin: 0; padding: 0 4px; border-radius: 2px; max-width: 19em; overflow: hidden; white-space: pre; color: black; cursor: pointer; } li.CodeMirror-hint-active { background: #08f; color: white; } web2py-2.12.3.orig/applications/admin/static/codemirror/addon/hint/show-hint.js0000664000000000000000000003410212564727254026203 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var HINT_ELEMENT_CLASS = "CodeMirror-hint"; var ACTIVE_HINT_ELEMENT_CLASS = "CodeMirror-hint-active"; // This is the old interface, kept around for now to stay // backwards-compatible. CodeMirror.showHint = function(cm, getHints, options) { if (!getHints) return cm.showHint(options); if (options && options.async) getHints.async = true; var newOpts = {hint: getHints}; if (options) for (var prop in options) newOpts[prop] = options[prop]; return cm.showHint(newOpts); }; var asyncRunID = 0; function retrieveHints(getter, cm, options, then) { if (getter.async) { var id = ++asyncRunID; getter(cm, function(hints) { if (asyncRunID == id) then(hints); }, options); } else { then(getter(cm, options)); } } CodeMirror.defineExtension("showHint", function(options) { // We want a single cursor position. if (this.listSelections().length > 1 || this.somethingSelected()) return; if (this.state.completionActive) this.state.completionActive.close(); var completion = this.state.completionActive = new Completion(this, options); var getHints = completion.options.hint; if (!getHints) return; CodeMirror.signal(this, "startCompletion", this); return retrieveHints(getHints, this, completion.options, function(hints) { completion.showHints(hints); }); }); function Completion(cm, options) { this.cm = cm; this.options = this.buildOptions(options); this.widget = this.onClose = null; } Completion.prototype = { close: function() { if (!this.active()) return; this.cm.state.completionActive = null; if (this.widget) this.widget.close(); if (this.onClose) this.onClose(); CodeMirror.signal(this.cm, "endCompletion", this.cm); }, active: function() { return this.cm.state.completionActive == this; }, pick: function(data, i) { var completion = data.list[i]; if (completion.hint) completion.hint(this.cm, data, completion); else this.cm.replaceRange(getText(completion), completion.from || data.from, completion.to || data.to, "complete"); CodeMirror.signal(data, "pick", completion); this.close(); }, showHints: function(data) { if (!data || !data.list.length || !this.active()) return this.close(); if (this.options.completeSingle && data.list.length == 1) this.pick(data, 0); else this.showWidget(data); }, showWidget: function(data) { this.widget = new Widget(this, data); CodeMirror.signal(data, "shown"); var debounce = 0, completion = this, finished; var closeOn = this.options.closeCharacters; var startPos = this.cm.getCursor(), startLen = this.cm.getLine(startPos.line).length; var requestAnimationFrame = window.requestAnimationFrame || function(fn) { return setTimeout(fn, 1000/60); }; var cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout; function done() { if (finished) return; finished = true; completion.close(); completion.cm.off("cursorActivity", activity); if (data) CodeMirror.signal(data, "close"); } function update() { if (finished) return; CodeMirror.signal(data, "update"); retrieveHints(completion.options.hint, completion.cm, completion.options, finishUpdate); } function finishUpdate(data_) { data = data_; if (finished) return; if (!data || !data.list.length) return done(); if (completion.widget) completion.widget.close(); completion.widget = new Widget(completion, data); } function clearDebounce() { if (debounce) { cancelAnimationFrame(debounce); debounce = 0; } } function activity() { clearDebounce(); var pos = completion.cm.getCursor(), line = completion.cm.getLine(pos.line); if (pos.line != startPos.line || line.length - pos.ch != startLen - startPos.ch || pos.ch < startPos.ch || completion.cm.somethingSelected() || (pos.ch && closeOn.test(line.charAt(pos.ch - 1)))) { completion.close(); } else { debounce = requestAnimationFrame(update); if (completion.widget) completion.widget.close(); } } this.cm.on("cursorActivity", activity); this.onClose = done; }, buildOptions: function(options) { var editor = this.cm.options.hintOptions; var out = {}; for (var prop in defaultOptions) out[prop] = defaultOptions[prop]; if (editor) for (var prop in editor) if (editor[prop] !== undefined) out[prop] = editor[prop]; if (options) for (var prop in options) if (options[prop] !== undefined) out[prop] = options[prop]; return out; } }; function getText(completion) { if (typeof completion == "string") return completion; else return completion.text; } function buildKeyMap(completion, handle) { var baseMap = { Up: function() {handle.moveFocus(-1);}, Down: function() {handle.moveFocus(1);}, PageUp: function() {handle.moveFocus(-handle.menuSize() + 1, true);}, PageDown: function() {handle.moveFocus(handle.menuSize() - 1, true);}, Home: function() {handle.setFocus(0);}, End: function() {handle.setFocus(handle.length - 1);}, Enter: handle.pick, Tab: handle.pick, Esc: handle.close }; var custom = completion.options.customKeys; var ourMap = custom ? {} : baseMap; function addBinding(key, val) { var bound; if (typeof val != "string") bound = function(cm) { return val(cm, handle); }; // This mechanism is deprecated else if (baseMap.hasOwnProperty(val)) bound = baseMap[val]; else bound = val; ourMap[key] = bound; } if (custom) for (var key in custom) if (custom.hasOwnProperty(key)) addBinding(key, custom[key]); var extra = completion.options.extraKeys; if (extra) for (var key in extra) if (extra.hasOwnProperty(key)) addBinding(key, extra[key]); return ourMap; } function getHintElement(hintsElement, el) { while (el && el != hintsElement) { if (el.nodeName.toUpperCase() === "LI" && el.parentNode == hintsElement) return el; el = el.parentNode; } } function Widget(completion, data) { this.completion = completion; this.data = data; var widget = this, cm = completion.cm; var hints = this.hints = document.createElement("ul"); hints.className = "CodeMirror-hints"; this.selectedHint = data.selectedHint || 0; var completions = data.list; for (var i = 0; i < completions.length; ++i) { var elt = hints.appendChild(document.createElement("li")), cur = completions[i]; var className = HINT_ELEMENT_CLASS + (i != this.selectedHint ? "" : " " + ACTIVE_HINT_ELEMENT_CLASS); if (cur.className != null) className = cur.className + " " + className; elt.className = className; if (cur.render) cur.render(elt, data, cur); else elt.appendChild(document.createTextNode(cur.displayText || getText(cur))); elt.hintId = i; } var pos = cm.cursorCoords(completion.options.alignWithWord ? data.from : null); var left = pos.left, top = pos.bottom, below = true; hints.style.left = left + "px"; hints.style.top = top + "px"; // If we're at the edge of the screen, then we want the menu to appear on the left of the cursor. var winW = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth); var winH = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight); (completion.options.container || document.body).appendChild(hints); var box = hints.getBoundingClientRect(), overlapY = box.bottom - winH; if (overlapY > 0) { var height = box.bottom - box.top, curTop = pos.top - (pos.bottom - box.top); if (curTop - height > 0) { // Fits above cursor hints.style.top = (top = pos.top - height) + "px"; below = false; } else if (height > winH) { hints.style.height = (winH - 5) + "px"; hints.style.top = (top = pos.bottom - box.top) + "px"; var cursor = cm.getCursor(); if (data.from.ch != cursor.ch) { pos = cm.cursorCoords(cursor); hints.style.left = (left = pos.left) + "px"; box = hints.getBoundingClientRect(); } } } var overlapX = box.right - winW; if (overlapX > 0) { if (box.right - box.left > winW) { hints.style.width = (winW - 5) + "px"; overlapX -= (box.right - box.left) - winW; } hints.style.left = (left = pos.left - overlapX) + "px"; } cm.addKeyMap(this.keyMap = buildKeyMap(completion, { moveFocus: function(n, avoidWrap) { widget.changeActive(widget.selectedHint + n, avoidWrap); }, setFocus: function(n) { widget.changeActive(n); }, menuSize: function() { return widget.screenAmount(); }, length: completions.length, close: function() { completion.close(); }, pick: function() { widget.pick(); }, data: data })); if (completion.options.closeOnUnfocus) { var closingOnBlur; cm.on("blur", this.onBlur = function() { closingOnBlur = setTimeout(function() { completion.close(); }, 100); }); cm.on("focus", this.onFocus = function() { clearTimeout(closingOnBlur); }); } var startScroll = cm.getScrollInfo(); cm.on("scroll", this.onScroll = function() { var curScroll = cm.getScrollInfo(), editor = cm.getWrapperElement().getBoundingClientRect(); var newTop = top + startScroll.top - curScroll.top; var point = newTop - (window.pageYOffset || (document.documentElement || document.body).scrollTop); if (!below) point += hints.offsetHeight; if (point <= editor.top || point >= editor.bottom) return completion.close(); hints.style.top = newTop + "px"; hints.style.left = (left + startScroll.left - curScroll.left) + "px"; }); CodeMirror.on(hints, "dblclick", function(e) { var t = getHintElement(hints, e.target || e.srcElement); if (t && t.hintId != null) {widget.changeActive(t.hintId); widget.pick();} }); CodeMirror.on(hints, "click", function(e) { var t = getHintElement(hints, e.target || e.srcElement); if (t && t.hintId != null) { widget.changeActive(t.hintId); if (completion.options.completeOnSingleClick) widget.pick(); } }); CodeMirror.on(hints, "mousedown", function() { setTimeout(function(){cm.focus();}, 20); }); CodeMirror.signal(data, "select", completions[0], hints.firstChild); return true; } Widget.prototype = { close: function() { if (this.completion.widget != this) return; this.completion.widget = null; this.hints.parentNode.removeChild(this.hints); this.completion.cm.removeKeyMap(this.keyMap); var cm = this.completion.cm; if (this.completion.options.closeOnUnfocus) { cm.off("blur", this.onBlur); cm.off("focus", this.onFocus); } cm.off("scroll", this.onScroll); }, pick: function() { this.completion.pick(this.data, this.selectedHint); }, changeActive: function(i, avoidWrap) { if (i >= this.data.list.length) i = avoidWrap ? this.data.list.length - 1 : 0; else if (i < 0) i = avoidWrap ? 0 : this.data.list.length - 1; if (this.selectedHint == i) return; var node = this.hints.childNodes[this.selectedHint]; node.className = node.className.replace(" " + ACTIVE_HINT_ELEMENT_CLASS, ""); node = this.hints.childNodes[this.selectedHint = i]; node.className += " " + ACTIVE_HINT_ELEMENT_CLASS; if (node.offsetTop < this.hints.scrollTop) this.hints.scrollTop = node.offsetTop - 3; else if (node.offsetTop + node.offsetHeight > this.hints.scrollTop + this.hints.clientHeight) this.hints.scrollTop = node.offsetTop + node.offsetHeight - this.hints.clientHeight + 3; CodeMirror.signal(this.data, "select", this.data.list[this.selectedHint], node); }, screenAmount: function() { return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1; } }; CodeMirror.registerHelper("hint", "auto", function(cm, options) { var helpers = cm.getHelpers(cm.getCursor(), "hint"), words; if (helpers.length) { for (var i = 0; i < helpers.length; i++) { var cur = helpers[i](cm, options); if (cur && cur.list.length) return cur; } } else if (words = cm.getHelper(cm.getCursor(), "hintWords")) { if (words) return CodeMirror.hint.fromList(cm, {words: words}); } else if (CodeMirror.hint.anyword) { return CodeMirror.hint.anyword(cm, options); } }); CodeMirror.registerHelper("hint", "fromList", function(cm, options) { var cur = cm.getCursor(), token = cm.getTokenAt(cur); var found = []; for (var i = 0; i < options.words.length; i++) { var word = options.words[i]; if (word.slice(0, token.string.length) == token.string) found.push(word); } if (found.length) return { list: found, from: CodeMirror.Pos(cur.line, token.start), to: CodeMirror.Pos(cur.line, token.end) }; }); CodeMirror.commands.autocomplete = CodeMirror.showHint; var defaultOptions = { hint: CodeMirror.hint.auto, completeSingle: true, alignWithWord: true, closeCharacters: /[\s()\[\]{};:>,]/, closeOnUnfocus: true, completeOnSingleClick: false, container: null, customKeys: null, extraKeys: null }; CodeMirror.defineOption("hintOptions", null); }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/hint/css-hint.js0000664000000000000000000000363712564727254026024 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../../mode/css/css")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../../mode/css/css"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var pseudoClasses = {link: 1, visited: 1, active: 1, hover: 1, focus: 1, "first-letter": 1, "first-line": 1, "first-child": 1, before: 1, after: 1, lang: 1}; CodeMirror.registerHelper("hint", "css", function(cm) { var cur = cm.getCursor(), token = cm.getTokenAt(cur); var inner = CodeMirror.innerMode(cm.getMode(), token.state); if (inner.mode.name != "css") return; var start = token.start, end = cur.ch, word = token.string.slice(0, end - start); if (/[^\w$_-]/.test(word)) { word = ""; start = end = cur.ch; } var spec = CodeMirror.resolveMode("text/css"); var result = []; function add(keywords) { for (var name in keywords) if (!word || name.lastIndexOf(word, 0) == 0) result.push(name); } var st = inner.state.state; if (st == "pseudo" || token.type == "variable-3") { add(pseudoClasses); } else if (st == "block" || st == "maybeprop") { add(spec.propertyKeywords); } else if (st == "prop" || st == "parens" || st == "at" || st == "params") { add(spec.valueKeywords); add(spec.colorKeywords); } else if (st == "media" || st == "media_parens") { add(spec.mediaTypes); add(spec.mediaFeatures); } if (result.length) return { list: result, from: CodeMirror.Pos(cur.line, start), to: CodeMirror.Pos(cur.line, end) }; }); }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/hint/python-hint.js0000664000000000000000000000701012564727254026542 0ustar rootroot(function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; function forEach(arr, f) { for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]); } function arrayContains(arr, item) { if (!Array.prototype.indexOf) { var i = arr.length; while (i--) { if (arr[i] === item) { return true; } } return false; } return arr.indexOf(item) != -1; } function scriptHint(editor, _keywords, getToken) { // Find the token at the cursor var cur = editor.getCursor(), token = getToken(editor, cur), tprop = token; // If it's not a 'word-style' token, ignore the token. if (!/^[\w$_]*$/.test(token.string)) { token = tprop = {start: cur.ch, end: cur.ch, string: "", state: token.state, className: token.string == ":" ? "python-type" : null}; } if (!context) var context = []; context.push(tprop); var completionList = getCompletions(token, context); completionList = completionList.sort(); return {list: completionList, from: CodeMirror.Pos(cur.line, token.start), to: CodeMirror.Pos(cur.line, token.end)}; } function pythonHint(editor) { return scriptHint(editor, pythonKeywordsU, function (e, cur) {return e.getTokenAt(cur);}); } CodeMirror.registerHelper("hint", "python", pythonHint); var pythonKeywords = "and del from not while as elif global or with assert else if pass yield" + "break except import print class exec in raise continue finally is return def for lambda try"; var pythonKeywordsL = pythonKeywords.split(" "); var pythonKeywordsU = pythonKeywords.toUpperCase().split(" "); var pythonBuiltins = "abs divmod input open staticmethod all enumerate int ord str " + "any eval isinstance pow sum basestring execfile issubclass print super" + "bin file iter property tuple bool filter len range type" + "bytearray float list raw_input unichr callable format locals reduce unicode" + "chr frozenset long reload vars classmethod getattr map repr xrange" + "cmp globals max reversed zip compile hasattr memoryview round __import__" + "complex hash min set apply delattr help next setattr buffer" + "dict hex object slice coerce dir id oct sorted intern "; var pythonBuiltinsL = pythonBuiltins.split(" ").join("() ").split(" "); var pythonBuiltinsU = pythonBuiltins.toUpperCase().split(" ").join("() ").split(" "); function getCompletions(token, context) { var found = [], start = token.string; function maybeAdd(str) { if (str.lastIndexOf(start, 0) == 0 && !arrayContains(found, str)) found.push(str); } function gatherCompletions(_obj) { forEach(pythonBuiltinsL, maybeAdd); forEach(pythonBuiltinsU, maybeAdd); forEach(pythonKeywordsL, maybeAdd); forEach(pythonKeywordsU, maybeAdd); } if (context) { // If this is a property, see if it belongs to some object we can // find in the current environment. var obj = context.pop(), base; if (obj.type == "variable") base = obj.string; else if(obj.type == "variable-3") base = ":" + obj.string; while (base != null && context.length) base = base[context.pop().string]; if (base != null) gatherCompletions(base); } return found; } }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/hint/javascript-hint.js0000664000000000000000000001402312564727254027371 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { var Pos = CodeMirror.Pos; function forEach(arr, f) { for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]); } function arrayContains(arr, item) { if (!Array.prototype.indexOf) { var i = arr.length; while (i--) { if (arr[i] === item) { return true; } } return false; } return arr.indexOf(item) != -1; } function scriptHint(editor, keywords, getToken, options) { // Find the token at the cursor var cur = editor.getCursor(), token = getToken(editor, cur); if (/\b(?:string|comment)\b/.test(token.type)) return; token.state = CodeMirror.innerMode(editor.getMode(), token.state).state; // If it's not a 'word-style' token, ignore the token. if (!/^[\w$_]*$/.test(token.string)) { token = {start: cur.ch, end: cur.ch, string: "", state: token.state, type: token.string == "." ? "property" : null}; } else if (token.end > cur.ch) { token.end = cur.ch; token.string = token.string.slice(0, cur.ch - token.start); } var tprop = token; // If it is a property, find out what it is a property of. while (tprop.type == "property") { tprop = getToken(editor, Pos(cur.line, tprop.start)); if (tprop.string != ".") return; tprop = getToken(editor, Pos(cur.line, tprop.start)); if (!context) var context = []; context.push(tprop); } return {list: getCompletions(token, context, keywords, options), from: Pos(cur.line, token.start), to: Pos(cur.line, token.end)}; } function javascriptHint(editor, options) { return scriptHint(editor, javascriptKeywords, function (e, cur) {return e.getTokenAt(cur);}, options); }; CodeMirror.registerHelper("hint", "javascript", javascriptHint); function getCoffeeScriptToken(editor, cur) { // This getToken, it is for coffeescript, imitates the behavior of // getTokenAt method in javascript.js, that is, returning "property" // type and treat "." as indepenent token. var token = editor.getTokenAt(cur); if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') { token.end = token.start; token.string = '.'; token.type = "property"; } else if (/^\.[\w$_]*$/.test(token.string)) { token.type = "property"; token.start++; token.string = token.string.replace(/\./, ''); } return token; } function coffeescriptHint(editor, options) { return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken, options); } CodeMirror.registerHelper("hint", "coffeescript", coffeescriptHint); var stringProps = ("charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight " + "toUpperCase toLowerCase split concat match replace search").split(" "); var arrayProps = ("length concat join splice push pop shift unshift slice reverse sort indexOf " + "lastIndexOf every some filter forEach map reduce reduceRight ").split(" "); var funcProps = "prototype apply call bind".split(" "); var javascriptKeywords = ("break case catch continue debugger default delete do else false finally for function " + "if in instanceof new null return switch throw true try typeof var void while with").split(" "); var coffeescriptKeywords = ("and break catch class continue delete do else extends false finally for " + "if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes").split(" "); function getCompletions(token, context, keywords, options) { var found = [], start = token.string, global = options && options.globalScope || window; function maybeAdd(str) { if (str.lastIndexOf(start, 0) == 0 && !arrayContains(found, str)) found.push(str); } function gatherCompletions(obj) { if (typeof obj == "string") forEach(stringProps, maybeAdd); else if (obj instanceof Array) forEach(arrayProps, maybeAdd); else if (obj instanceof Function) forEach(funcProps, maybeAdd); for (var name in obj) maybeAdd(name); } if (context && context.length) { // If this is a property, see if it belongs to some object we can // find in the current environment. var obj = context.pop(), base; if (obj.type && obj.type.indexOf("variable") === 0) { if (options && options.additionalContext) base = options.additionalContext[obj.string]; if (!options || options.useGlobalScope !== false) base = base || global[obj.string]; } else if (obj.type == "string") { base = ""; } else if (obj.type == "atom") { base = 1; } else if (obj.type == "function") { if (global.jQuery != null && (obj.string == '$' || obj.string == 'jQuery') && (typeof global.jQuery == 'function')) base = global.jQuery(); else if (global._ != null && (obj.string == '_') && (typeof global._ == 'function')) base = global._(); } while (base != null && context.length) base = base[context.pop().string]; if (base != null) gatherCompletions(base); } else { // If not, just look in the global object and any local scope // (reading into JS mode internals to get at the local and global variables) for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name); for (var v = token.state.globalVars; v; v = v.next) maybeAdd(v.name); if (!options || options.useGlobalScope !== false) gatherCompletions(global); forEach(keywords, maybeAdd); } return found; } }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/hint/sql-hint.js0000664000000000000000000001621312564727254026025 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../../mode/sql/sql")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../../mode/sql/sql"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var tables; var defaultTable; var keywords; var CONS = { QUERY_DIV: ";", ALIAS_KEYWORD: "AS" }; var Pos = CodeMirror.Pos; function getKeywords(editor) { var mode = editor.doc.modeOption; if (mode === "sql") mode = "text/x-sql"; return CodeMirror.resolveMode(mode).keywords; } function getText(item) { return typeof item == "string" ? item : item.text; } function getItem(list, item) { if (!list.slice) return list[item]; for (var i = list.length - 1; i >= 0; i--) if (getText(list[i]) == item) return list[i]; } function shallowClone(object) { var result = {}; for (var key in object) if (object.hasOwnProperty(key)) result[key] = object[key]; return result; } function match(string, word) { var len = string.length; var sub = getText(word).substr(0, len); return string.toUpperCase() === sub.toUpperCase(); } function addMatches(result, search, wordlist, formatter) { for (var word in wordlist) { if (!wordlist.hasOwnProperty(word)) continue; if (Array.isArray(wordlist)) { word = wordlist[word]; } if (match(search, word)) { result.push(formatter(word)); } } } function cleanName(name) { // Get rid name from backticks(`) and preceding dot(.) if (name.charAt(0) == ".") { name = name.substr(1); } return name.replace(/`/g, ""); } function insertBackticks(name) { var nameParts = getText(name).split("."); for (var i = 0; i < nameParts.length; i++) nameParts[i] = "`" + nameParts[i] + "`"; var escaped = nameParts.join("."); if (typeof name == "string") return escaped; name = shallowClone(name); name.text = escaped; return name; } function nameCompletion(cur, token, result, editor) { // Try to complete table, colunm names and return start position of completion var useBacktick = false; var nameParts = []; var start = token.start; var cont = true; while (cont) { cont = (token.string.charAt(0) == "."); useBacktick = useBacktick || (token.string.charAt(0) == "`"); start = token.start; nameParts.unshift(cleanName(token.string)); token = editor.getTokenAt(Pos(cur.line, token.start)); if (token.string == ".") { cont = true; token = editor.getTokenAt(Pos(cur.line, token.start)); } } // Try to complete table names var string = nameParts.join("."); addMatches(result, string, tables, function(w) { return useBacktick ? insertBackticks(w) : w; }); // Try to complete columns from defaultTable addMatches(result, string, defaultTable, function(w) { return useBacktick ? insertBackticks(w) : w; }); // Try to complete columns string = nameParts.pop(); var table = nameParts.join("."); // Check if table is available. If not, find table by Alias if (!getItem(tables, table)) table = findTableByAlias(table, editor); var columns = getItem(tables, table); if (columns && Array.isArray(tables) && columns.columns) columns = columns.columns; if (columns) { addMatches(result, string, columns, function(w) { if (typeof w == "string") { w = table + "." + w; } else { w = shallowClone(w); w.text = table + "." + w.text; } return useBacktick ? insertBackticks(w) : w; }); } return start; } function eachWord(lineText, f) { if (!lineText) return; var excepted = /[,;]/g; var words = lineText.split(" "); for (var i = 0; i < words.length; i++) { f(words[i]?words[i].replace(excepted, '') : ''); } } function convertCurToNumber(cur) { // max characters of a line is 999,999. return cur.line + cur.ch / Math.pow(10, 6); } function convertNumberToCur(num) { return Pos(Math.floor(num), +num.toString().split('.').pop()); } function findTableByAlias(alias, editor) { var doc = editor.doc; var fullQuery = doc.getValue(); var aliasUpperCase = alias.toUpperCase(); var previousWord = ""; var table = ""; var separator = []; var validRange = { start: Pos(0, 0), end: Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).length) }; //add separator var indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV); while(indexOfSeparator != -1) { separator.push(doc.posFromIndex(indexOfSeparator)); indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV, indexOfSeparator+1); } separator.unshift(Pos(0, 0)); separator.push(Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).text.length)); //find valid range var prevItem = 0; var current = convertCurToNumber(editor.getCursor()); for (var i=0; i< separator.length; i++) { var _v = convertCurToNumber(separator[i]); if (current > prevItem && current <= _v) { validRange = { start: convertNumberToCur(prevItem), end: convertNumberToCur(_v) }; break; } prevItem = _v; } var query = doc.getRange(validRange.start, validRange.end, false); for (var i = 0; i < query.length; i++) { var lineText = query[i]; eachWord(lineText, function(word) { var wordUpperCase = word.toUpperCase(); if (wordUpperCase === aliasUpperCase && getItem(tables, previousWord)) table = previousWord; if (wordUpperCase !== CONS.ALIAS_KEYWORD) previousWord = word; }); if (table) break; } return table; } CodeMirror.registerHelper("hint", "sql", function(editor, options) { tables = (options && options.tables) || {}; var defaultTableName = options && options.defaultTable; defaultTable = (defaultTableName && getItem(tables, defaultTableName)) || []; keywords = keywords || getKeywords(editor); var cur = editor.getCursor(); var result = []; var token = editor.getTokenAt(cur), start, end, search; if (token.end > cur.ch) { token.end = cur.ch; token.string = token.string.slice(0, cur.ch - token.start); } if (token.string.match(/^[.`\w@]\w*$/)) { search = token.string; start = token.start; end = token.end; } else { start = end = cur.ch; search = ""; } if (search.charAt(0) == "." || search.charAt(0) == "`") { start = nameCompletion(cur, token, result, editor); } else { addMatches(result, search, tables, function(w) {return w;}); addMatches(result, search, defaultTable, function(w) {return w;}); addMatches(result, search, keywords, function(w) {return w.toUpperCase();}); } return {list: result, from: Pos(cur.line, start), to: Pos(cur.line, end)}; }); }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/hint/anyword-hint.js0000664000000000000000000000316512564727254026713 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var WORD = /[\w$]+/, RANGE = 500; CodeMirror.registerHelper("hint", "anyword", function(editor, options) { var word = options && options.word || WORD; var range = options && options.range || RANGE; var cur = editor.getCursor(), curLine = editor.getLine(cur.line); var end = cur.ch, start = end; while (start && word.test(curLine.charAt(start - 1))) --start; var curWord = start != end && curLine.slice(start, end); var list = [], seen = {}; var re = new RegExp(word.source, "g"); for (var dir = -1; dir <= 1; dir += 2) { var line = cur.line, endLine = Math.min(Math.max(line + dir * range, editor.firstLine()), editor.lastLine()) + dir; for (; line != endLine; line += dir) { var text = editor.getLine(line), m; while (m = re.exec(text)) { if (line == cur.line && m[0] === curWord) continue; if ((!curWord || m[0].lastIndexOf(curWord, 0) == 0) && !Object.prototype.hasOwnProperty.call(seen, m[0])) { seen[m[0]] = true; list.push(m[0]); } } } } return {list: list, from: CodeMirror.Pos(cur.line, start), to: CodeMirror.Pos(cur.line, end)}; }); }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/hint/xml-hint.js0000664000000000000000000001117712564727254026032 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var Pos = CodeMirror.Pos; function getHints(cm, options) { var tags = options && options.schemaInfo; var quote = (options && options.quoteChar) || '"'; if (!tags) return; var cur = cm.getCursor(), token = cm.getTokenAt(cur); if (token.end > cur.ch) { token.end = cur.ch; token.string = token.string.slice(0, cur.ch - token.start); } var inner = CodeMirror.innerMode(cm.getMode(), token.state); if (inner.mode.name != "xml") return; var result = [], replaceToken = false, prefix; var tag = /\btag\b/.test(token.type) && !/>$/.test(token.string); var tagName = tag && /^\w/.test(token.string), tagStart; if (tagName) { var before = cm.getLine(cur.line).slice(Math.max(0, token.start - 2), token.start); var tagType = /<\/$/.test(before) ? "close" : /<$/.test(before) ? "open" : null; if (tagType) tagStart = token.start - (tagType == "close" ? 2 : 1); } else if (tag && token.string == "<") { tagType = "open"; } else if (tag && token.string == ""); } else { // Attribute completion var curTag = tags[inner.state.tagName], attrs = curTag && curTag.attrs; var globalAttrs = tags["!attrs"]; if (!attrs && !globalAttrs) return; if (!attrs) { attrs = globalAttrs; } else if (globalAttrs) { // Combine tag-local and global attributes var set = {}; for (var nm in globalAttrs) if (globalAttrs.hasOwnProperty(nm)) set[nm] = globalAttrs[nm]; for (var nm in attrs) if (attrs.hasOwnProperty(nm)) set[nm] = attrs[nm]; attrs = set; } if (token.type == "string" || token.string == "=") { // A value var before = cm.getRange(Pos(cur.line, Math.max(0, cur.ch - 60)), Pos(cur.line, token.type == "string" ? token.start : token.end)); var atName = before.match(/([^\s\u00a0=<>\"\']+)=$/), atValues; if (!atName || !attrs.hasOwnProperty(atName[1]) || !(atValues = attrs[atName[1]])) return; if (typeof atValues == 'function') atValues = atValues.call(this, cm); // Functions can be used to supply values for autocomplete widget if (token.type == "string") { prefix = token.string; var n = 0; if (/['"]/.test(token.string.charAt(0))) { quote = token.string.charAt(0); prefix = token.string.slice(1); n++; } var len = token.string.length; if (/['"]/.test(token.string.charAt(len - 1))) { quote = token.string.charAt(len - 1); prefix = token.string.substr(n, len - 2); } replaceToken = true; } for (var i = 0; i < atValues.length; ++i) if (!prefix || atValues[i].lastIndexOf(prefix, 0) == 0) result.push(quote + atValues[i] + quote); } else { // An attribute name if (token.type == "attribute") { prefix = token.string; replaceToken = true; } for (var attr in attrs) if (attrs.hasOwnProperty(attr) && (!prefix || attr.lastIndexOf(prefix, 0) == 0)) result.push(attr); } } return { list: result, from: replaceToken ? Pos(cur.line, tagStart == null ? token.start : tagStart) : cur, to: replaceToken ? Pos(cur.line, token.end) : cur }; } CodeMirror.registerHelper("hint", "xml", getHints); }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/comment/0000775000000000000000000000000012564727254024425 5ustar rootrootweb2py-2.12.3.orig/applications/admin/static/codemirror/addon/comment/continuecomment.js0000664000000000000000000000650712564727254030202 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { var modes = ["clike", "css", "javascript"]; for (var i = 0; i < modes.length; ++i) CodeMirror.extendMode(modes[i], {blockCommentContinue: " * "}); function continueComment(cm) { if (cm.getOption("disableInput")) return CodeMirror.Pass; var ranges = cm.listSelections(), mode, inserts = []; for (var i = 0; i < ranges.length; i++) { var pos = ranges[i].head, token = cm.getTokenAt(pos); if (token.type != "comment") return CodeMirror.Pass; var modeHere = CodeMirror.innerMode(cm.getMode(), token.state).mode; if (!mode) mode = modeHere; else if (mode != modeHere) return CodeMirror.Pass; var insert = null; if (mode.blockCommentStart && mode.blockCommentContinue) { var end = token.string.indexOf(mode.blockCommentEnd); var full = cm.getRange(CodeMirror.Pos(pos.line, 0), CodeMirror.Pos(pos.line, token.end)), found; if (end != -1 && end == token.string.length - mode.blockCommentEnd.length && pos.ch >= end) { // Comment ended, don't continue it } else if (token.string.indexOf(mode.blockCommentStart) == 0) { insert = full.slice(0, token.start); if (!/^\s*$/.test(insert)) { insert = ""; for (var j = 0; j < token.start; ++j) insert += " "; } } else if ((found = full.indexOf(mode.blockCommentContinue)) != -1 && found + mode.blockCommentContinue.length > token.start && /^\s*$/.test(full.slice(0, found))) { insert = full.slice(0, found); } if (insert != null) insert += mode.blockCommentContinue; } if (insert == null && mode.lineComment && continueLineCommentEnabled(cm)) { var line = cm.getLine(pos.line), found = line.indexOf(mode.lineComment); if (found > -1) { insert = line.slice(0, found); if (/\S/.test(insert)) insert = null; else insert += mode.lineComment + line.slice(found + mode.lineComment.length).match(/^\s*/)[0]; } } if (insert == null) return CodeMirror.Pass; inserts[i] = "\n" + insert; } cm.operation(function() { for (var i = ranges.length - 1; i >= 0; i--) cm.replaceRange(inserts[i], ranges[i].from(), ranges[i].to(), "+insert"); }); } function continueLineCommentEnabled(cm) { var opt = cm.getOption("continueComments"); if (opt && typeof opt == "object") return opt.continueLineComment !== false; return true; } CodeMirror.defineOption("continueComments", null, function(cm, val, prev) { if (prev && prev != CodeMirror.Init) cm.removeKeyMap("continueComment"); if (val) { var key = "Enter"; if (typeof val == "string") key = val; else if (typeof val == "object" && val.key) key = val.key; var map = {name: "continueComment"}; map[key] = continueComment; cm.addKeyMap(map); } }); }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/comment/comment.js0000664000000000000000000001751012564727254026431 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var noOptions = {}; var nonWS = /[^\s\u00a0]/; var Pos = CodeMirror.Pos; function firstNonWS(str) { var found = str.search(nonWS); return found == -1 ? 0 : found; } CodeMirror.commands.toggleComment = function(cm) { var minLine = Infinity, ranges = cm.listSelections(), mode = null; for (var i = ranges.length - 1; i >= 0; i--) { var from = ranges[i].from(), to = ranges[i].to(); if (from.line >= minLine) continue; if (to.line >= minLine) to = Pos(minLine, 0); minLine = from.line; if (mode == null) { if (cm.uncomment(from, to)) mode = "un"; else { cm.lineComment(from, to); mode = "line"; } } else if (mode == "un") { cm.uncomment(from, to); } else { cm.lineComment(from, to); } } }; CodeMirror.defineExtension("lineComment", function(from, to, options) { if (!options) options = noOptions; var self = this, mode = self.getModeAt(from); var commentString = options.lineComment || mode.lineComment; if (!commentString) { if (options.blockCommentStart || mode.blockCommentStart) { options.fullLines = true; self.blockComment(from, to, options); } return; } var firstLine = self.getLine(from.line); if (firstLine == null) return; var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1); var pad = options.padding == null ? " " : options.padding; var blankLines = options.commentBlankLines || from.line == to.line; self.operation(function() { if (options.indent) { var baseString = firstLine.slice(0, firstNonWS(firstLine)); for (var i = from.line; i < end; ++i) { var line = self.getLine(i), cut = baseString.length; if (!blankLines && !nonWS.test(line)) continue; if (line.slice(0, cut) != baseString) cut = firstNonWS(line); self.replaceRange(baseString + commentString + pad, Pos(i, 0), Pos(i, cut)); } } else { for (var i = from.line; i < end; ++i) { if (blankLines || nonWS.test(self.getLine(i))) self.replaceRange(commentString + pad, Pos(i, 0)); } } }); }); CodeMirror.defineExtension("blockComment", function(from, to, options) { if (!options) options = noOptions; var self = this, mode = self.getModeAt(from); var startString = options.blockCommentStart || mode.blockCommentStart; var endString = options.blockCommentEnd || mode.blockCommentEnd; if (!startString || !endString) { if ((options.lineComment || mode.lineComment) && options.fullLines != false) self.lineComment(from, to, options); return; } var end = Math.min(to.line, self.lastLine()); if (end != from.line && to.ch == 0 && nonWS.test(self.getLine(end))) --end; var pad = options.padding == null ? " " : options.padding; if (from.line > end) return; self.operation(function() { if (options.fullLines != false) { var lastLineHasText = nonWS.test(self.getLine(end)); self.replaceRange(pad + endString, Pos(end)); self.replaceRange(startString + pad, Pos(from.line, 0)); var lead = options.blockCommentLead || mode.blockCommentLead; if (lead != null) for (var i = from.line + 1; i <= end; ++i) if (i != end || lastLineHasText) self.replaceRange(lead + pad, Pos(i, 0)); } else { self.replaceRange(endString, to); self.replaceRange(startString, from); } }); }); CodeMirror.defineExtension("uncomment", function(from, to, options) { if (!options) options = noOptions; var self = this, mode = self.getModeAt(from); var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()), start = Math.min(from.line, end); // Try finding line comments var lineString = options.lineComment || mode.lineComment, lines = []; var pad = options.padding == null ? " " : options.padding, didSomething; lineComment: { if (!lineString) break lineComment; for (var i = start; i <= end; ++i) { var line = self.getLine(i); var found = line.indexOf(lineString); if (found > -1 && !/comment/.test(self.getTokenTypeAt(Pos(i, found + 1)))) found = -1; if (found == -1 && (i != end || i == start) && nonWS.test(line)) break lineComment; if (found > -1 && nonWS.test(line.slice(0, found))) break lineComment; lines.push(line); } self.operation(function() { for (var i = start; i <= end; ++i) { var line = lines[i - start]; var pos = line.indexOf(lineString), endPos = pos + lineString.length; if (pos < 0) continue; if (line.slice(endPos, endPos + pad.length) == pad) endPos += pad.length; didSomething = true; self.replaceRange("", Pos(i, pos), Pos(i, endPos)); } }); if (didSomething) return true; } // Try block comments var startString = options.blockCommentStart || mode.blockCommentStart; var endString = options.blockCommentEnd || mode.blockCommentEnd; if (!startString || !endString) return false; var lead = options.blockCommentLead || mode.blockCommentLead; var startLine = self.getLine(start), endLine = end == start ? startLine : self.getLine(end); var open = startLine.indexOf(startString), close = endLine.lastIndexOf(endString); if (close == -1 && start != end) { endLine = self.getLine(--end); close = endLine.lastIndexOf(endString); } if (open == -1 || close == -1 || !/comment/.test(self.getTokenTypeAt(Pos(start, open + 1))) || !/comment/.test(self.getTokenTypeAt(Pos(end, close + 1)))) return false; // Avoid killing block comments completely outside the selection. // Positions of the last startString before the start of the selection, and the first endString after it. var lastStart = startLine.lastIndexOf(startString, from.ch); var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length); if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false; // Positions of the first endString after the end of the selection, and the last startString before it. firstEnd = endLine.indexOf(endString, to.ch); var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch); lastStart = (firstEnd == -1 || almostLastStart == -1) ? -1 : to.ch + almostLastStart; if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false; self.operation(function() { self.replaceRange("", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)), Pos(end, close + endString.length)); var openEnd = open + startString.length; if (pad && startLine.slice(openEnd, openEnd + pad.length) == pad) openEnd += pad.length; self.replaceRange("", Pos(start, open), Pos(start, openEnd)); if (lead) for (var i = start + 1; i <= end; ++i) { var line = self.getLine(i), found = line.indexOf(lead); if (found == -1 || nonWS.test(line.slice(0, found))) continue; var foundEnd = found + lead.length; if (pad && line.slice(foundEnd, foundEnd + pad.length) == pad) foundEnd += pad.length; self.replaceRange("", Pos(i, found), Pos(i, foundEnd)); } }); return true; }); }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/edit/0000775000000000000000000000000012564727254023710 5ustar rootrootweb2py-2.12.3.orig/applications/admin/static/codemirror/addon/edit/closetag.js0000664000000000000000000001664612564727254026064 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /** * Tag-closer extension for CodeMirror. * * This extension adds an "autoCloseTags" option that can be set to * either true to get the default behavior, or an object to further * configure its behavior. * * These are supported options: * * `whenClosing` (default true) * Whether to autoclose when the '/' of a closing tag is typed. * `whenOpening` (default true) * Whether to autoclose the tag when the final '>' of an opening * tag is typed. * `dontCloseTags` (default is empty tags for HTML, none for XML) * An array of tag names that should not be autoclosed. * `indentTags` (default is block tags for HTML, none for XML) * An array of tag names that should, when opened, cause a * blank line to be added inside the tag, and the blank line and * closing line to be indented. * * See demos/closetag.html for a usage example. */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../fold/xml-fold")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../fold/xml-fold"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { CodeMirror.defineOption("autoCloseTags", false, function(cm, val, old) { if (old != CodeMirror.Init && old) cm.removeKeyMap("autoCloseTags"); if (!val) return; var map = {name: "autoCloseTags"}; if (typeof val != "object" || val.whenClosing) map["'/'"] = function(cm) { return autoCloseSlash(cm); }; if (typeof val != "object" || val.whenOpening) map["'>'"] = function(cm) { return autoCloseGT(cm); }; cm.addKeyMap(map); }); var htmlDontClose = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"]; var htmlIndent = ["applet", "blockquote", "body", "button", "div", "dl", "fieldset", "form", "frameset", "h1", "h2", "h3", "h4", "h5", "h6", "head", "html", "iframe", "layer", "legend", "object", "ol", "p", "select", "table", "ul"]; function autoCloseGT(cm) { if (cm.getOption("disableInput")) return CodeMirror.Pass; var ranges = cm.listSelections(), replacements = []; for (var i = 0; i < ranges.length; i++) { if (!ranges[i].empty()) return CodeMirror.Pass; var pos = ranges[i].head, tok = cm.getTokenAt(pos); var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state; if (inner.mode.name != "xml" || !state.tagName) return CodeMirror.Pass; var opt = cm.getOption("autoCloseTags"), html = inner.mode.configuration == "html"; var dontCloseTags = (typeof opt == "object" && opt.dontCloseTags) || (html && htmlDontClose); var indentTags = (typeof opt == "object" && opt.indentTags) || (html && htmlIndent); var tagName = state.tagName; if (tok.end > pos.ch) tagName = tagName.slice(0, tagName.length - tok.end + pos.ch); var lowerTagName = tagName.toLowerCase(); // Don't process the '>' at the end of an end-tag or self-closing tag if (!tagName || tok.type == "string" && (tok.end != pos.ch || !/[\"\']/.test(tok.string.charAt(tok.string.length - 1)) || tok.string.length == 1) || tok.type == "tag" && state.type == "closeTag" || tok.string.indexOf("/") == (tok.string.length - 1) || // match something like dontCloseTags && indexOf(dontCloseTags, lowerTagName) > -1 || closingTagExists(cm, tagName, pos, state, true)) return CodeMirror.Pass; var indent = indentTags && indexOf(indentTags, lowerTagName) > -1; replacements[i] = {indent: indent, text: ">" + (indent ? "\n\n" : "") + "", newPos: indent ? CodeMirror.Pos(pos.line + 1, 0) : CodeMirror.Pos(pos.line, pos.ch + 1)}; } for (var i = ranges.length - 1; i >= 0; i--) { var info = replacements[i]; cm.replaceRange(info.text, ranges[i].head, ranges[i].anchor, "+insert"); var sel = cm.listSelections().slice(0); sel[i] = {head: info.newPos, anchor: info.newPos}; cm.setSelections(sel); if (info.indent) { cm.indentLine(info.newPos.line, null, true); cm.indentLine(info.newPos.line + 1, null, true); } } } function autoCloseCurrent(cm, typingSlash) { var ranges = cm.listSelections(), replacements = []; var head = typingSlash ? "/" : ""; else if (cm.getMode().name == "htmlmixed" && inner.mode.name == "css") replacements[i] = head + "style>"; else return CodeMirror.Pass; } else { if (!state.context || !state.context.tagName || closingTagExists(cm, state.context.tagName, pos, state)) return CodeMirror.Pass; replacements[i] = head + state.context.tagName + ">"; } } cm.replaceSelections(replacements); ranges = cm.listSelections(); for (var i = 0; i < ranges.length; i++) if (i == ranges.length - 1 || ranges[i].head.line < ranges[i + 1].head.line) cm.indentLine(ranges[i].head.line); } function autoCloseSlash(cm) { if (cm.getOption("disableInput")) return CodeMirror.Pass; return autoCloseCurrent(cm, true); } CodeMirror.commands.closeTag = function(cm) { return autoCloseCurrent(cm); }; function indexOf(collection, elt) { if (collection.indexOf) return collection.indexOf(elt); for (var i = 0, e = collection.length; i < e; ++i) if (collection[i] == elt) return i; return -1; } // If xml-fold is loaded, we use its functionality to try and verify // whether a given tag is actually unclosed. function closingTagExists(cm, tagName, pos, state, newTag) { if (!CodeMirror.scanForClosingTag) return false; var end = Math.min(cm.lastLine() + 1, pos.line + 500); var nextClose = CodeMirror.scanForClosingTag(cm, pos, null, end); if (!nextClose || nextClose.tag != tagName) return false; var cx = state.context; // If the immediate wrapping context contains onCx instances of // the same tag, a closing tag only exists if there are at least // that many closing tags of that type following. for (var onCx = newTag ? 1 : 0; cx && cx.tagName == tagName; cx = cx.prev) ++onCx; pos = nextClose.to; for (var i = 1; i < onCx; i++) { var next = CodeMirror.scanForClosingTag(cm, pos, null, end); if (!next || next.tag != tagName) return false; pos = next.to; } return true; } }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/edit/closebrackets.js0000664000000000000000000001447612564727254027106 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { var DEFAULT_BRACKETS = "()[]{}''\"\""; var DEFAULT_TRIPLES = "'\""; var DEFAULT_EXPLODE_ON_ENTER = "[]{}"; var SPACE_CHAR_REGEX = /\s/; var Pos = CodeMirror.Pos; CodeMirror.defineOption("autoCloseBrackets", false, function(cm, val, old) { if (old != CodeMirror.Init && old) cm.removeKeyMap("autoCloseBrackets"); if (!val) return; var pairs = DEFAULT_BRACKETS, triples = DEFAULT_TRIPLES, explode = DEFAULT_EXPLODE_ON_ENTER; if (typeof val == "string") pairs = val; else if (typeof val == "object") { if (val.pairs != null) pairs = val.pairs; if (val.triples != null) triples = val.triples; if (val.explode != null) explode = val.explode; } var map = buildKeymap(pairs, triples); if (explode) map.Enter = buildExplodeHandler(explode); cm.addKeyMap(map); }); function charsAround(cm, pos) { var str = cm.getRange(Pos(pos.line, pos.ch - 1), Pos(pos.line, pos.ch + 1)); return str.length == 2 ? str : null; } // Project the token type that will exists after the given char is // typed, and use it to determine whether it would cause the start // of a string token. function enteringString(cm, pos, ch) { var line = cm.getLine(pos.line); var token = cm.getTokenAt(pos); if (/\bstring2?\b/.test(token.type)) return false; var stream = new CodeMirror.StringStream(line.slice(0, pos.ch) + ch + line.slice(pos.ch), 4); stream.pos = stream.start = token.start; for (;;) { var type1 = cm.getMode().token(stream, token.state); if (stream.pos >= pos.ch + 1) return /\bstring2?\b/.test(type1); stream.start = stream.pos; } } function buildKeymap(pairs, triples) { var map = { name : "autoCloseBrackets", Backspace: function(cm) { if (cm.getOption("disableInput")) return CodeMirror.Pass; var ranges = cm.listSelections(); for (var i = 0; i < ranges.length; i++) { if (!ranges[i].empty()) return CodeMirror.Pass; var around = charsAround(cm, ranges[i].head); if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass; } for (var i = ranges.length - 1; i >= 0; i--) { var cur = ranges[i].head; cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1)); } } }; var closingBrackets = ""; for (var i = 0; i < pairs.length; i += 2) (function(left, right) { closingBrackets += right; map["'" + left + "'"] = function(cm) { if (cm.getOption("disableInput")) return CodeMirror.Pass; var ranges = cm.listSelections(), type, next; for (var i = 0; i < ranges.length; i++) { var range = ranges[i], cur = range.head, curType; var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1)); if (!range.empty()) { curType = "surround"; } else if (left == right && next == right) { if (cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == left + left + left) curType = "skipThree"; else curType = "skip"; } else if (left == right && cur.ch > 1 && triples.indexOf(left) >= 0 && cm.getRange(Pos(cur.line, cur.ch - 2), cur) == left + left && (cur.ch <= 2 || cm.getRange(Pos(cur.line, cur.ch - 3), Pos(cur.line, cur.ch - 2)) != left)) { curType = "addFour"; } else if (left == '"' || left == "'") { if (!CodeMirror.isWordChar(next) && enteringString(cm, cur, left)) curType = "both"; else return CodeMirror.Pass; } else if (cm.getLine(cur.line).length == cur.ch || closingBrackets.indexOf(next) >= 0 || SPACE_CHAR_REGEX.test(next)) { curType = "both"; } else { return CodeMirror.Pass; } if (!type) type = curType; else if (type != curType) return CodeMirror.Pass; } cm.operation(function() { if (type == "skip") { cm.execCommand("goCharRight"); } else if (type == "skipThree") { for (var i = 0; i < 3; i++) cm.execCommand("goCharRight"); } else if (type == "surround") { var sels = cm.getSelections(); for (var i = 0; i < sels.length; i++) sels[i] = left + sels[i] + right; cm.replaceSelections(sels, "around"); } else if (type == "both") { cm.replaceSelection(left + right, null); cm.execCommand("goCharLeft"); } else if (type == "addFour") { cm.replaceSelection(left + left + left + left, "before"); cm.execCommand("goCharRight"); } }); }; if (left != right) map["'" + right + "'"] = function(cm) { var ranges = cm.listSelections(); for (var i = 0; i < ranges.length; i++) { var range = ranges[i]; if (!range.empty() || cm.getRange(range.head, Pos(range.head.line, range.head.ch + 1)) != right) return CodeMirror.Pass; } cm.execCommand("goCharRight"); }; })(pairs.charAt(i), pairs.charAt(i + 1)); return map; } function buildExplodeHandler(pairs) { return function(cm) { if (cm.getOption("disableInput")) return CodeMirror.Pass; var ranges = cm.listSelections(); for (var i = 0; i < ranges.length; i++) { if (!ranges[i].empty()) return CodeMirror.Pass; var around = charsAround(cm, ranges[i].head); if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass; } cm.operation(function() { cm.replaceSelection("\n\n", null); cm.execCommand("goCharLeft"); ranges = cm.listSelections(); for (var i = 0; i < ranges.length; i++) { var line = ranges[i].head.line; cm.indentLine(line, null, true); cm.indentLine(line + 1, null, true); } }); }; } }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/edit/matchbrackets.js0000664000000000000000000001222412564727254027062 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { var ie_lt8 = /MSIE \d/.test(navigator.userAgent) && (document.documentMode == null || document.documentMode < 8); var Pos = CodeMirror.Pos; var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<"}; function findMatchingBracket(cm, where, strict, config) { var line = cm.getLineHandle(where.line), pos = where.ch - 1; var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)]; if (!match) return null; var dir = match.charAt(1) == ">" ? 1 : -1; if (strict && (dir > 0) != (pos == where.ch)) return null; var style = cm.getTokenTypeAt(Pos(where.line, pos + 1)); var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style || null, config); if (found == null) return null; return {from: Pos(where.line, pos), to: found && found.pos, match: found && found.ch == match.charAt(0), forward: dir > 0}; } // bracketRegex is used to specify which type of bracket to scan // should be a regexp, e.g. /[[\]]/ // // Note: If "where" is on an open bracket, then this bracket is ignored. // // Returns false when no bracket was found, null when it reached // maxScanLines and gave up function scanForBracket(cm, where, dir, style, config) { var maxScanLen = (config && config.maxScanLineLength) || 10000; var maxScanLines = (config && config.maxScanLines) || 1000; var stack = []; var re = config && config.bracketRegex ? config.bracketRegex : /[(){}[\]]/; var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1) : Math.max(cm.firstLine() - 1, where.line - maxScanLines); for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) { var line = cm.getLine(lineNo); if (!line) continue; var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1; if (line.length > maxScanLen) continue; if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0); for (; pos != end; pos += dir) { var ch = line.charAt(pos); if (re.test(ch) && (style === undefined || cm.getTokenTypeAt(Pos(lineNo, pos + 1)) == style)) { var match = matching[ch]; if ((match.charAt(1) == ">") == (dir > 0)) stack.push(ch); else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch}; else stack.pop(); } } } return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null; } function matchBrackets(cm, autoclear, config) { // Disable brace matching in long lines, since it'll cause hugely slow updates var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000; var marks = [], ranges = cm.listSelections(); for (var i = 0; i < ranges.length; i++) { var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, false, config); if (match && cm.getLine(match.from.line).length <= maxHighlightLen) { var style = match.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket"; marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {className: style})); if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen) marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), {className: style})); } } if (marks.length) { // Kludge to work around the IE bug from issue #1193, where text // input stops going to the textare whever this fires. if (ie_lt8 && cm.state.focused) cm.display.input.focus(); var clear = function() { cm.operation(function() { for (var i = 0; i < marks.length; i++) marks[i].clear(); }); }; if (autoclear) setTimeout(clear, 800); else return clear; } } var currentlyHighlighted = null; function doMatchBrackets(cm) { cm.operation(function() { if (currentlyHighlighted) {currentlyHighlighted(); currentlyHighlighted = null;} currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets); }); } CodeMirror.defineOption("matchBrackets", false, function(cm, val, old) { if (old && old != CodeMirror.Init) cm.off("cursorActivity", doMatchBrackets); if (val) { cm.state.matchBrackets = typeof val == "object" ? val : {}; cm.on("cursorActivity", doMatchBrackets); } }); CodeMirror.defineExtension("matchBrackets", function() {matchBrackets(this, true);}); CodeMirror.defineExtension("findMatchingBracket", function(pos, strict, config){ return findMatchingBracket(this, pos, strict, config); }); CodeMirror.defineExtension("scanForBracket", function(pos, dir, style, config){ return scanForBracket(this, pos, dir, style, config); }); }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/edit/trailingspace.js0000664000000000000000000000175312564727254027101 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { CodeMirror.defineOption("showTrailingSpace", false, function(cm, val, prev) { if (prev == CodeMirror.Init) prev = false; if (prev && !val) cm.removeOverlay("trailingspace"); else if (!prev && val) cm.addOverlay({ token: function(stream) { for (var l = stream.string.length, i = l; i && /\s/.test(stream.string.charAt(i - 1)); --i) {} if (i > stream.pos) { stream.pos = i; return null; } stream.pos = l; return "trailingspace"; }, name: "trailingspace" }); }); }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/edit/continuelist.js0000664000000000000000000000333012564727254026765 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var listRE = /^(\s*)(>[> ]*|[*+-]\s|(\d+)\.)(\s*)/, emptyListRE = /^(\s*)(>[> ]*|[*+-]|(\d+)\.)(\s*)$/, unorderedListRE = /[*+-]\s/; CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) { if (cm.getOption("disableInput")) return CodeMirror.Pass; var ranges = cm.listSelections(), replacements = []; for (var i = 0; i < ranges.length; i++) { var pos = ranges[i].head, match; var eolState = cm.getStateAfter(pos.line); var inList = eolState.list !== false; var inQuote = eolState.quote !== false; if (!ranges[i].empty() || (!inList && !inQuote) || !(match = cm.getLine(pos.line).match(listRE))) { cm.execCommand("newlineAndIndent"); return; } if (cm.getLine(pos.line).match(emptyListRE)) { cm.replaceRange("", { line: pos.line, ch: 0 }, { line: pos.line, ch: pos.ch + 1 }); replacements[i] = "\n"; } else { var indent = match[1], after = match[4]; var bullet = unorderedListRE.test(match[2]) || match[2].indexOf(">") >= 0 ? match[2] : (parseInt(match[3], 10) + 1) + "."; replacements[i] = "\n" + indent + bullet + after; } } cm.replaceSelections(replacements); }; }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/edit/matchtags.js0000664000000000000000000000446312564727254026230 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../fold/xml-fold")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../fold/xml-fold"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineOption("matchTags", false, function(cm, val, old) { if (old && old != CodeMirror.Init) { cm.off("cursorActivity", doMatchTags); cm.off("viewportChange", maybeUpdateMatch); clear(cm); } if (val) { cm.state.matchBothTags = typeof val == "object" && val.bothTags; cm.on("cursorActivity", doMatchTags); cm.on("viewportChange", maybeUpdateMatch); doMatchTags(cm); } }); function clear(cm) { if (cm.state.tagHit) cm.state.tagHit.clear(); if (cm.state.tagOther) cm.state.tagOther.clear(); cm.state.tagHit = cm.state.tagOther = null; } function doMatchTags(cm) { cm.state.failedTagMatch = false; cm.operation(function() { clear(cm); if (cm.somethingSelected()) return; var cur = cm.getCursor(), range = cm.getViewport(); range.from = Math.min(range.from, cur.line); range.to = Math.max(cur.line + 1, range.to); var match = CodeMirror.findMatchingTag(cm, cur, range); if (!match) return; if (cm.state.matchBothTags) { var hit = match.at == "open" ? match.open : match.close; if (hit) cm.state.tagHit = cm.markText(hit.from, hit.to, {className: "CodeMirror-matchingtag"}); } var other = match.at == "close" ? match.open : match.close; if (other) cm.state.tagOther = cm.markText(other.from, other.to, {className: "CodeMirror-matchingtag"}); else cm.state.failedTagMatch = true; }); } function maybeUpdateMatch(cm) { if (cm.state.failedTagMatch) doMatchTags(cm); } CodeMirror.commands.toMatchingTag = function(cm) { var found = CodeMirror.findMatchingTag(cm, cm.getCursor()); if (found) { var other = found.at == "close" ? found.open : found.close; if (other) cm.extendSelection(other.to, other.from); } }; }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/search/0000775000000000000000000000000012564727254024230 5ustar rootrootweb2py-2.12.3.orig/applications/admin/static/codemirror/addon/search/matchesonscrollbar.js0000664000000000000000000000717012564727254030460 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("./searchcursor"), require("../scroll/annotatescrollbar")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "./searchcursor", "../scroll/annotatescrollbar"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineExtension("showMatchesOnScrollbar", function(query, caseFold, options) { if (typeof options == "string") options = {className: options}; if (!options) options = {}; return new SearchAnnotation(this, query, caseFold, options); }); function SearchAnnotation(cm, query, caseFold, options) { this.cm = cm; var annotateOptions = {listenForChanges: false}; for (var prop in options) annotateOptions[prop] = options[prop]; if (!annotateOptions.className) annotateOptions.className = "CodeMirror-search-match"; this.annotation = cm.annotateScrollbar(annotateOptions); this.query = query; this.caseFold = caseFold; this.gap = {from: cm.firstLine(), to: cm.lastLine() + 1}; this.matches = []; this.update = null; this.findMatches(); this.annotation.update(this.matches); var self = this; cm.on("change", this.changeHandler = function(_cm, change) { self.onChange(change); }); } var MAX_MATCHES = 1000; SearchAnnotation.prototype.findMatches = function() { if (!this.gap) return; for (var i = 0; i < this.matches.length; i++) { var match = this.matches[i]; if (match.from.line >= this.gap.to) break; if (match.to.line >= this.gap.from) this.matches.splice(i--, 1); } var cursor = this.cm.getSearchCursor(this.query, CodeMirror.Pos(this.gap.from, 0), this.caseFold); while (cursor.findNext()) { var match = {from: cursor.from(), to: cursor.to()}; if (match.from.line >= this.gap.to) break; this.matches.splice(i++, 0, match); if (this.matches.length > MAX_MATCHES) break; } this.gap = null; }; function offsetLine(line, changeStart, sizeChange) { if (line <= changeStart) return line; return Math.max(changeStart, line + sizeChange); } SearchAnnotation.prototype.onChange = function(change) { var startLine = change.from.line; var endLine = CodeMirror.changeEnd(change).line; var sizeChange = endLine - change.to.line; if (this.gap) { this.gap.from = Math.min(offsetLine(this.gap.from, startLine, sizeChange), change.from.line); this.gap.to = Math.max(offsetLine(this.gap.to, startLine, sizeChange), change.from.line); } else { this.gap = {from: change.from.line, to: endLine + 1}; } if (sizeChange) for (var i = 0; i < this.matches.length; i++) { var match = this.matches[i]; var newFrom = offsetLine(match.from.line, startLine, sizeChange); if (newFrom != match.from.line) match.from = CodeMirror.Pos(newFrom, match.from.ch); var newTo = offsetLine(match.to.line, startLine, sizeChange); if (newTo != match.to.line) match.to = CodeMirror.Pos(newTo, match.to.ch); } clearTimeout(this.update); var self = this; this.update = setTimeout(function() { self.updateAfterChange(); }, 250); }; SearchAnnotation.prototype.updateAfterChange = function() { this.findMatches(); this.annotation.update(this.matches); }; SearchAnnotation.prototype.clear = function() { this.cm.off("change", this.changeHandler); this.annotation.clear(); }; }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/search/match-highlighter.js0000664000000000000000000001151712564727254030163 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Highlighting text that matches the selection // // Defines an option highlightSelectionMatches, which, when enabled, // will style strings that match the selection throughout the // document. // // The option can be set to true to simply enable it, or to a // {minChars, style, wordsOnly, showToken, delay} object to explicitly // configure it. minChars is the minimum amount of characters that should be // selected for the behavior to occur, and style is the token style to // apply to the matches. This will be prefixed by "cm-" to create an // actual CSS class name. If wordsOnly is enabled, the matches will be // highlighted only if the selected text is a word. showToken, when enabled, // will cause the current token to be highlighted when nothing is selected. // delay is used to specify how much time to wait, in milliseconds, before // highlighting the matches. (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var DEFAULT_MIN_CHARS = 2; var DEFAULT_TOKEN_STYLE = "matchhighlight"; var DEFAULT_DELAY = 100; var DEFAULT_WORDS_ONLY = false; function State(options) { if (typeof options == "object") { this.minChars = options.minChars; this.style = options.style; this.showToken = options.showToken; this.delay = options.delay; this.wordsOnly = options.wordsOnly; } if (this.style == null) this.style = DEFAULT_TOKEN_STYLE; if (this.minChars == null) this.minChars = DEFAULT_MIN_CHARS; if (this.delay == null) this.delay = DEFAULT_DELAY; if (this.wordsOnly == null) this.wordsOnly = DEFAULT_WORDS_ONLY; this.overlay = this.timeout = null; } CodeMirror.defineOption("highlightSelectionMatches", false, function(cm, val, old) { if (old && old != CodeMirror.Init) { var over = cm.state.matchHighlighter.overlay; if (over) cm.removeOverlay(over); clearTimeout(cm.state.matchHighlighter.timeout); cm.state.matchHighlighter = null; cm.off("cursorActivity", cursorActivity); } if (val) { cm.state.matchHighlighter = new State(val); highlightMatches(cm); cm.on("cursorActivity", cursorActivity); } }); function cursorActivity(cm) { var state = cm.state.matchHighlighter; clearTimeout(state.timeout); state.timeout = setTimeout(function() {highlightMatches(cm);}, state.delay); } function highlightMatches(cm) { cm.operation(function() { var state = cm.state.matchHighlighter; if (state.overlay) { cm.removeOverlay(state.overlay); state.overlay = null; } if (!cm.somethingSelected() && state.showToken) { var re = state.showToken === true ? /[\w$]/ : state.showToken; var cur = cm.getCursor(), line = cm.getLine(cur.line), start = cur.ch, end = start; while (start && re.test(line.charAt(start - 1))) --start; while (end < line.length && re.test(line.charAt(end))) ++end; if (start < end) cm.addOverlay(state.overlay = makeOverlay(line.slice(start, end), re, state.style)); return; } var from = cm.getCursor("from"), to = cm.getCursor("to"); if (from.line != to.line) return; if (state.wordsOnly && !isWord(cm, from, to)) return; var selection = cm.getRange(from, to).replace(/^\s+|\s+$/g, ""); if (selection.length >= state.minChars) cm.addOverlay(state.overlay = makeOverlay(selection, false, state.style)); }); } function isWord(cm, from, to) { var str = cm.getRange(from, to); if (str.match(/^\w+$/) !== null) { if (from.ch > 0) { var pos = {line: from.line, ch: from.ch - 1}; var chr = cm.getRange(pos, from); if (chr.match(/\W/) === null) return false; } if (to.ch < cm.getLine(from.line).length) { var pos = {line: to.line, ch: to.ch + 1}; var chr = cm.getRange(to, pos); if (chr.match(/\W/) === null) return false; } return true; } else return false; } function boundariesAround(stream, re) { return (!stream.start || !re.test(stream.string.charAt(stream.start - 1))) && (stream.pos == stream.string.length || !re.test(stream.string.charAt(stream.pos))); } function makeOverlay(query, hasBoundary, style) { return {token: function(stream) { if (stream.match(query) && (!hasBoundary || boundariesAround(stream, hasBoundary))) return style; stream.next(); stream.skipTo(query.charAt(0)) || stream.skipToEnd(); }}; } }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/search/search.js0000664000000000000000000001573012564727254026041 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Define search commands. Depends on dialog.js or another // implementation of the openDialog method. // Replace works a little oddly -- it will do the replace on the next // Ctrl-G (or whatever is bound to findNext) press. You prevent a // replace by making sure the match is no longer selected when hitting // Ctrl-G. (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("./searchcursor"), require("../dialog/dialog")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "./searchcursor", "../dialog/dialog"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; function searchOverlay(query, caseInsensitive) { if (typeof query == "string") query = new RegExp(query.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), caseInsensitive ? "gi" : "g"); else if (!query.global) query = new RegExp(query.source, query.ignoreCase ? "gi" : "g"); return {token: function(stream) { query.lastIndex = stream.pos; var match = query.exec(stream.string); if (match && match.index == stream.pos) { stream.pos += match[0].length; return "searching"; } else if (match) { stream.pos = match.index; } else { stream.skipToEnd(); } }}; } function SearchState() { this.posFrom = this.posTo = this.query = null; this.overlay = null; } function getSearchState(cm) { return cm.state.search || (cm.state.search = new SearchState()); } function queryCaseInsensitive(query) { return typeof query == "string" && query == query.toLowerCase(); } function getSearchCursor(cm, query, pos) { // Heuristic: if the query string is all lowercase, do a case insensitive search. return cm.getSearchCursor(query, pos, queryCaseInsensitive(query)); } function dialog(cm, text, shortText, deflt, f) { if (cm.openDialog) cm.openDialog(text, f, {value: deflt}); else f(prompt(shortText, deflt)); } function confirmDialog(cm, text, shortText, fs) { if (cm.openConfirm) cm.openConfirm(text, fs); else if (confirm(shortText)) fs[0](); } function parseQuery(query) { var isRE = query.match(/^\/(.*)\/([a-z]*)$/); if (isRE) { try { query = new RegExp(isRE[1], isRE[2].indexOf("i") == -1 ? "" : "i"); } catch(e) {} // Not a regular expression after all, do a string search } if (typeof query == "string" ? query == "" : query.test("")) query = /x^/; return query; } var queryDialog = 'Search: (Use /re/ syntax for regexp search)'; function doSearch(cm, rev) { var state = getSearchState(cm); if (state.query) return findNext(cm, rev); dialog(cm, queryDialog, "Search for:", cm.getSelection(), function(query) { cm.operation(function() { if (!query || state.query) return; state.query = parseQuery(query); cm.removeOverlay(state.overlay, queryCaseInsensitive(state.query)); state.overlay = searchOverlay(state.query, queryCaseInsensitive(state.query)); cm.addOverlay(state.overlay); if (cm.showMatchesOnScrollbar) { if (state.annotate) { state.annotate.clear(); state.annotate = null; } state.annotate = cm.showMatchesOnScrollbar(state.query, queryCaseInsensitive(state.query)); } state.posFrom = state.posTo = cm.getCursor(); findNext(cm, rev); }); }); } function findNext(cm, rev) {cm.operation(function() { var state = getSearchState(cm); var cursor = getSearchCursor(cm, state.query, rev ? state.posFrom : state.posTo); if (!cursor.find(rev)) { cursor = getSearchCursor(cm, state.query, rev ? CodeMirror.Pos(cm.lastLine()) : CodeMirror.Pos(cm.firstLine(), 0)); if (!cursor.find(rev)) return; } cm.setSelection(cursor.from(), cursor.to()); cm.scrollIntoView({from: cursor.from(), to: cursor.to()}); state.posFrom = cursor.from(); state.posTo = cursor.to(); });} function clearSearch(cm) {cm.operation(function() { var state = getSearchState(cm); if (!state.query) return; state.query = null; cm.removeOverlay(state.overlay); if (state.annotate) { state.annotate.clear(); state.annotate = null; } });} var replaceQueryDialog = 'Replace: (Use /re/ syntax for regexp search)'; var replacementQueryDialog = 'With: '; var doReplaceConfirm = "Replace? "; function replace(cm, all) { if (cm.getOption("readOnly")) return; dialog(cm, replaceQueryDialog, "Replace:", cm.getSelection(), function(query) { if (!query) return; query = parseQuery(query); dialog(cm, replacementQueryDialog, "Replace with:", "", function(text) { if (all) { cm.operation(function() { for (var cursor = getSearchCursor(cm, query); cursor.findNext();) { if (typeof query != "string") { var match = cm.getRange(cursor.from(), cursor.to()).match(query); cursor.replace(text.replace(/\$(\d)/g, function(_, i) {return match[i];})); } else cursor.replace(text); } }); } else { clearSearch(cm); var cursor = getSearchCursor(cm, query, cm.getCursor()); var advance = function() { var start = cursor.from(), match; if (!(match = cursor.findNext())) { cursor = getSearchCursor(cm, query); if (!(match = cursor.findNext()) || (start && cursor.from().line == start.line && cursor.from().ch == start.ch)) return; } cm.setSelection(cursor.from(), cursor.to()); cm.scrollIntoView({from: cursor.from(), to: cursor.to()}); confirmDialog(cm, doReplaceConfirm, "Replace?", [function() {doReplace(match);}, advance]); }; var doReplace = function(match) { cursor.replace(typeof query == "string" ? text : text.replace(/\$(\d)/g, function(_, i) {return match[i];})); advance(); }; advance(); } }); }); } CodeMirror.commands.find = function(cm) {clearSearch(cm); doSearch(cm);}; CodeMirror.commands.findNext = doSearch; CodeMirror.commands.findPrev = function(cm) {doSearch(cm, true);}; CodeMirror.commands.clearSearch = clearSearch; CodeMirror.commands.replace = replace; CodeMirror.commands.replaceAll = function(cm) {replace(cm, true);}; }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/search/matchesonscrollbar.css0000664000000000000000000000027412564727254030632 0ustar rootroot.CodeMirror-search-match { background: gold; border-top: 1px solid orange; border-bottom: 1px solid orange; -moz-box-sizing: border-box; box-sizing: border-box; opacity: .5; } web2py-2.12.3.orig/applications/admin/static/codemirror/addon/search/searchcursor.js0000664000000000000000000001705012564727254027274 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var Pos = CodeMirror.Pos; function SearchCursor(doc, query, pos, caseFold) { this.atOccurrence = false; this.doc = doc; if (caseFold == null && typeof query == "string") caseFold = false; pos = pos ? doc.clipPos(pos) : Pos(0, 0); this.pos = {from: pos, to: pos}; // The matches method is filled in based on the type of query. // It takes a position and a direction, and returns an object // describing the next occurrence of the query, or null if no // more matches were found. if (typeof query != "string") { // Regexp match if (!query.global) query = new RegExp(query.source, query.ignoreCase ? "ig" : "g"); this.matches = function(reverse, pos) { if (reverse) { query.lastIndex = 0; var line = doc.getLine(pos.line).slice(0, pos.ch), cutOff = 0, match, start; for (;;) { query.lastIndex = cutOff; var newMatch = query.exec(line); if (!newMatch) break; match = newMatch; start = match.index; cutOff = match.index + (match[0].length || 1); if (cutOff == line.length) break; } var matchLen = (match && match[0].length) || 0; if (!matchLen) { if (start == 0 && line.length == 0) {match = undefined;} else if (start != doc.getLine(pos.line).length) { matchLen++; } } } else { query.lastIndex = pos.ch; var line = doc.getLine(pos.line), match = query.exec(line); var matchLen = (match && match[0].length) || 0; var start = match && match.index; if (start + matchLen != line.length && !matchLen) matchLen = 1; } if (match && matchLen) return {from: Pos(pos.line, start), to: Pos(pos.line, start + matchLen), match: match}; }; } else { // String query var origQuery = query; if (caseFold) query = query.toLowerCase(); var fold = caseFold ? function(str){return str.toLowerCase();} : function(str){return str;}; var target = query.split("\n"); // Different methods for single-line and multi-line queries if (target.length == 1) { if (!query.length) { // Empty string would match anything and never progress, so // we define it to match nothing instead. this.matches = function() {}; } else { this.matches = function(reverse, pos) { if (reverse) { var orig = doc.getLine(pos.line).slice(0, pos.ch), line = fold(orig); var match = line.lastIndexOf(query); if (match > -1) { match = adjustPos(orig, line, match); return {from: Pos(pos.line, match), to: Pos(pos.line, match + origQuery.length)}; } } else { var orig = doc.getLine(pos.line).slice(pos.ch), line = fold(orig); var match = line.indexOf(query); if (match > -1) { match = adjustPos(orig, line, match) + pos.ch; return {from: Pos(pos.line, match), to: Pos(pos.line, match + origQuery.length)}; } } }; } } else { var origTarget = origQuery.split("\n"); this.matches = function(reverse, pos) { var last = target.length - 1; if (reverse) { if (pos.line - (target.length - 1) < doc.firstLine()) return; if (fold(doc.getLine(pos.line).slice(0, origTarget[last].length)) != target[target.length - 1]) return; var to = Pos(pos.line, origTarget[last].length); for (var ln = pos.line - 1, i = last - 1; i >= 1; --i, --ln) if (target[i] != fold(doc.getLine(ln))) return; var line = doc.getLine(ln), cut = line.length - origTarget[0].length; if (fold(line.slice(cut)) != target[0]) return; return {from: Pos(ln, cut), to: to}; } else { if (pos.line + (target.length - 1) > doc.lastLine()) return; var line = doc.getLine(pos.line), cut = line.length - origTarget[0].length; if (fold(line.slice(cut)) != target[0]) return; var from = Pos(pos.line, cut); for (var ln = pos.line + 1, i = 1; i < last; ++i, ++ln) if (target[i] != fold(doc.getLine(ln))) return; if (fold(doc.getLine(ln).slice(0, origTarget[last].length)) != target[last]) return; return {from: from, to: Pos(ln, origTarget[last].length)}; } }; } } } SearchCursor.prototype = { findNext: function() {return this.find(false);}, findPrevious: function() {return this.find(true);}, find: function(reverse) { var self = this, pos = this.doc.clipPos(reverse ? this.pos.from : this.pos.to); function savePosAndFail(line) { var pos = Pos(line, 0); self.pos = {from: pos, to: pos}; self.atOccurrence = false; return false; } for (;;) { if (this.pos = this.matches(reverse, pos)) { this.atOccurrence = true; return this.pos.match || true; } if (reverse) { if (!pos.line) return savePosAndFail(0); pos = Pos(pos.line-1, this.doc.getLine(pos.line-1).length); } else { var maxLine = this.doc.lineCount(); if (pos.line == maxLine - 1) return savePosAndFail(maxLine); pos = Pos(pos.line + 1, 0); } } }, from: function() {if (this.atOccurrence) return this.pos.from;}, to: function() {if (this.atOccurrence) return this.pos.to;}, replace: function(newText) { if (!this.atOccurrence) return; var lines = CodeMirror.splitLines(newText); this.doc.replaceRange(lines, this.pos.from, this.pos.to); this.pos.to = Pos(this.pos.from.line + lines.length - 1, lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0)); } }; // Maps a position in a case-folded line back to a position in the original line // (compensating for codepoints increasing in number during folding) function adjustPos(orig, folded, pos) { if (orig.length == folded.length) return pos; for (var pos1 = Math.min(pos, orig.length);;) { var len1 = orig.slice(0, pos1).toLowerCase().length; if (len1 < pos) ++pos1; else if (len1 > pos) --pos1; else return pos1; } } CodeMirror.defineExtension("getSearchCursor", function(query, pos, caseFold) { return new SearchCursor(this.doc, query, pos, caseFold); }); CodeMirror.defineDocExtension("getSearchCursor", function(query, pos, caseFold) { return new SearchCursor(this, query, pos, caseFold); }); CodeMirror.defineExtension("selectMatches", function(query, caseFold) { var ranges = [], next; var cur = this.getSearchCursor(query, this.getCursor("from"), caseFold); while (next = cur.findNext()) { if (CodeMirror.cmpPos(cur.to(), this.getCursor("to")) > 0) break; ranges.push({anchor: cur.from(), head: cur.to()}); } if (ranges.length) this.setSelections(ranges, 0); }); }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/dialog/0000775000000000000000000000000012564727254024222 5ustar rootrootweb2py-2.12.3.orig/applications/admin/static/codemirror/addon/dialog/dialog.css0000664000000000000000000000076612564727254026204 0ustar rootroot.CodeMirror-dialog { position: absolute; left: 0; right: 0; background: white; z-index: 15; padding: .1em .8em; overflow: hidden; color: #333; } .CodeMirror-dialog-top { border-bottom: 1px solid #eee; top: 0; } .CodeMirror-dialog-bottom { border-top: 1px solid #eee; bottom: 0; } .CodeMirror-dialog input { border: none; outline: none; background: transparent; width: 20em; color: inherit; font-family: monospace; } .CodeMirror-dialog button { font-size: 70%; } web2py-2.12.3.orig/applications/admin/static/codemirror/addon/dialog/dialog.js0000664000000000000000000001141312564727254026017 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Open simple dialogs on top of an editor. Relies on dialog.css. (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { function dialogDiv(cm, template, bottom) { var wrap = cm.getWrapperElement(); var dialog; dialog = wrap.appendChild(document.createElement("div")); if (bottom) dialog.className = "CodeMirror-dialog CodeMirror-dialog-bottom"; else dialog.className = "CodeMirror-dialog CodeMirror-dialog-top"; if (typeof template == "string") { dialog.innerHTML = template; } else { // Assuming it's a detached DOM element. dialog.appendChild(template); } return dialog; } function closeNotification(cm, newVal) { if (cm.state.currentNotificationClose) cm.state.currentNotificationClose(); cm.state.currentNotificationClose = newVal; } CodeMirror.defineExtension("openDialog", function(template, callback, options) { if (!options) options = {}; closeNotification(this, null); var dialog = dialogDiv(this, template, options.bottom); var closed = false, me = this; function close(newVal) { if (typeof newVal == 'string') { inp.value = newVal; } else { if (closed) return; closed = true; dialog.parentNode.removeChild(dialog); me.focus(); if (options.onClose) options.onClose(dialog); } } var inp = dialog.getElementsByTagName("input")[0], button; if (inp) { if (options.value) { inp.value = options.value; inp.select(); } if (options.onInput) CodeMirror.on(inp, "input", function(e) { options.onInput(e, inp.value, close);}); if (options.onKeyUp) CodeMirror.on(inp, "keyup", function(e) {options.onKeyUp(e, inp.value, close);}); CodeMirror.on(inp, "keydown", function(e) { if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; } if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) { inp.blur(); CodeMirror.e_stop(e); close(); } if (e.keyCode == 13) callback(inp.value, e); }); if (options.closeOnBlur !== false) CodeMirror.on(inp, "blur", close); inp.focus(); } else if (button = dialog.getElementsByTagName("button")[0]) { CodeMirror.on(button, "click", function() { close(); me.focus(); }); if (options.closeOnBlur !== false) CodeMirror.on(button, "blur", close); button.focus(); } return close; }); CodeMirror.defineExtension("openConfirm", function(template, callbacks, options) { closeNotification(this, null); var dialog = dialogDiv(this, template, options && options.bottom); var buttons = dialog.getElementsByTagName("button"); var closed = false, me = this, blurring = 1; function close() { if (closed) return; closed = true; dialog.parentNode.removeChild(dialog); me.focus(); } buttons[0].focus(); for (var i = 0; i < buttons.length; ++i) { var b = buttons[i]; (function(callback) { CodeMirror.on(b, "click", function(e) { CodeMirror.e_preventDefault(e); close(); if (callback) callback(me); }); })(callbacks[i]); CodeMirror.on(b, "blur", function() { --blurring; setTimeout(function() { if (blurring <= 0) close(); }, 200); }); CodeMirror.on(b, "focus", function() { ++blurring; }); } }); /* * openNotification * Opens a notification, that can be closed with an optional timer * (default 5000ms timer) and always closes on click. * * If a notification is opened while another is opened, it will close the * currently opened one and open the new one immediately. */ CodeMirror.defineExtension("openNotification", function(template, options) { closeNotification(this, close); var dialog = dialogDiv(this, template, options && options.bottom); var closed = false, doneTimer; var duration = options && typeof options.duration !== "undefined" ? options.duration : 5000; function close() { if (closed) return; closed = true; clearTimeout(doneTimer); dialog.parentNode.removeChild(dialog); } CodeMirror.on(dialog, 'click', function(e) { CodeMirror.e_preventDefault(e); close(); }); if (duration) doneTimer = setTimeout(close, duration); return close; }); }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/display/0000775000000000000000000000000012564727254024430 5ustar rootrootweb2py-2.12.3.orig/applications/admin/static/codemirror/addon/display/panel.js0000664000000000000000000000603612564727254026072 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { CodeMirror.defineExtension("addPanel", function(node, options) { if (!this.state.panels) initPanels(this); var info = this.state.panels; if (options && options.position == "bottom") info.wrapper.appendChild(node); else info.wrapper.insertBefore(node, info.wrapper.firstChild); var height = (options && options.height) || node.offsetHeight; this._setSize(null, info.heightLeft -= height); info.panels++; return new Panel(this, node, options, height); }); function Panel(cm, node, options, height) { this.cm = cm; this.node = node; this.options = options; this.height = height; this.cleared = false; } Panel.prototype.clear = function() { if (this.cleared) return; this.cleared = true; var info = this.cm.state.panels; this.cm._setSize(null, info.heightLeft += this.height); info.wrapper.removeChild(this.node); if (--info.panels == 0) removePanels(this.cm); }; Panel.prototype.changed = function(height) { var newHeight = height == null ? this.node.offsetHeight : height; var info = this.cm.state.panels; this.cm._setSize(null, info.height += (newHeight - this.height)); this.height = newHeight; }; function initPanels(cm) { var wrap = cm.getWrapperElement(); var style = window.getComputedStyle ? window.getComputedStyle(wrap) : wrap.currentStyle; var height = parseInt(style.height); var info = cm.state.panels = { setHeight: wrap.style.height, heightLeft: height, panels: 0, wrapper: document.createElement("div") }; wrap.parentNode.insertBefore(info.wrapper, wrap); var hasFocus = cm.hasFocus(); info.wrapper.appendChild(wrap); if (hasFocus) cm.focus(); cm._setSize = cm.setSize; if (height != null) cm.setSize = function(width, newHeight) { if (newHeight == null) return this._setSize(width, newHeight); info.setHeight = newHeight; if (typeof newHeight != "number") { var px = /^(\d+\.?\d*)px$/.exec(newHeight); if (px) { newHeight = Number(px[1]); } else { info.wrapper.style.height = newHeight; newHeight = info.wrapper.offsetHeight; info.wrapper.style.height = ""; } } cm._setSize(width, info.heightLeft += (newHeight - height)); height = newHeight; }; } function removePanels(cm) { var info = cm.state.panels; cm.state.panels = null; var wrap = cm.getWrapperElement(); info.wrapper.parentNode.replaceChild(wrap, info.wrapper); wrap.style.height = info.setHeight; cm.setSize = cm._setSize; cm.setSize(); } }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/display/fullscreen.js0000664000000000000000000000272612564727254027137 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineOption("fullScreen", false, function(cm, val, old) { if (old == CodeMirror.Init) old = false; if (!old == !val) return; if (val) setFullscreen(cm); else setNormal(cm); }); function setFullscreen(cm) { var wrap = cm.getWrapperElement(); cm.state.fullScreenRestore = {scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset, width: wrap.style.width, height: wrap.style.height}; wrap.style.width = ""; wrap.style.height = "auto"; wrap.className += " CodeMirror-fullscreen"; document.documentElement.style.overflow = "hidden"; cm.refresh(); } function setNormal(cm) { var wrap = cm.getWrapperElement(); wrap.className = wrap.className.replace(/\s*CodeMirror-fullscreen\b/, ""); document.documentElement.style.overflow = ""; var info = cm.state.fullScreenRestore; wrap.style.width = info.width; wrap.style.height = info.height; window.scrollTo(info.scrollLeft, info.scrollTop); cm.refresh(); } }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/display/fullscreen.css0000664000000000000000000000016412564727254027305 0ustar rootroot.CodeMirror-fullscreen { position: fixed; top: 0; left: 0; right: 0; bottom: 0; height: auto; z-index: 9; } web2py-2.12.3.orig/applications/admin/static/codemirror/addon/display/rulers.js0000664000000000000000000000412612564727254026305 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineOption("rulers", false, function(cm, val, old) { if (old && old != CodeMirror.Init) { clearRulers(cm); cm.off("refresh", refreshRulers); } if (val && val.length) { setRulers(cm); cm.on("refresh", refreshRulers); } }); function clearRulers(cm) { for (var i = cm.display.lineSpace.childNodes.length - 1; i >= 0; i--) { var node = cm.display.lineSpace.childNodes[i]; if (/(^|\s)CodeMirror-ruler($|\s)/.test(node.className)) node.parentNode.removeChild(node); } } function setRulers(cm) { var val = cm.getOption("rulers"); var cw = cm.defaultCharWidth(); var left = cm.charCoords(CodeMirror.Pos(cm.firstLine(), 0), "div").left; var minH = cm.display.scroller.offsetHeight + 30; for (var i = 0; i < val.length; i++) { var elt = document.createElement("div"); elt.className = "CodeMirror-ruler"; var col, cls = null, conf = val[i]; if (typeof conf == "number") { col = conf; } else { col = conf.column; if (conf.className) elt.className += " " + conf.className; if (conf.color) elt.style.borderColor = conf.color; if (conf.lineStyle) elt.style.borderLeftStyle = conf.lineStyle; if (conf.width) elt.style.borderLeftWidth = conf.width; cls = val[i].className; } elt.style.left = (left + col * cw) + "px"; elt.style.top = "-50px"; elt.style.bottom = "-20px"; elt.style.minHeight = minH + "px"; cm.display.lineSpace.insertBefore(elt, cm.display.cursorDiv); } } function refreshRulers(cm) { clearRulers(cm); setRulers(cm); } }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/display/placeholder.js0000664000000000000000000000366312564727254027260 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { CodeMirror.defineOption("placeholder", "", function(cm, val, old) { var prev = old && old != CodeMirror.Init; if (val && !prev) { cm.on("blur", onBlur); cm.on("change", onChange); onChange(cm); } else if (!val && prev) { cm.off("blur", onBlur); cm.off("change", onChange); clearPlaceholder(cm); var wrapper = cm.getWrapperElement(); wrapper.className = wrapper.className.replace(" CodeMirror-empty", ""); } if (val && !cm.hasFocus()) onBlur(cm); }); function clearPlaceholder(cm) { if (cm.state.placeholder) { cm.state.placeholder.parentNode.removeChild(cm.state.placeholder); cm.state.placeholder = null; } } function setPlaceholder(cm) { clearPlaceholder(cm); var elt = cm.state.placeholder = document.createElement("pre"); elt.style.cssText = "height: 0; overflow: visible"; elt.className = "CodeMirror-placeholder"; elt.appendChild(document.createTextNode(cm.getOption("placeholder"))); cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild); } function onBlur(cm) { if (isEmpty(cm)) setPlaceholder(cm); } function onChange(cm) { var wrapper = cm.getWrapperElement(), empty = isEmpty(cm); wrapper.className = wrapper.className.replace(" CodeMirror-empty", "") + (empty ? " CodeMirror-empty" : ""); if (empty) setPlaceholder(cm); else clearPlaceholder(cm); } function isEmpty(cm) { return (cm.lineCount() === 1) && (cm.getLine(0) === ""); } }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/selection/0000775000000000000000000000000012564727254024750 5ustar rootrootweb2py-2.12.3.orig/applications/admin/static/codemirror/addon/selection/active-line.js0000664000000000000000000000461212564727254027511 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Because sometimes you need to style the cursor's line. // // Adds an option 'styleActiveLine' which, when enabled, gives the // active line's wrapping
    the CSS class "CodeMirror-activeline", // and gives its background
    the class "CodeMirror-activeline-background". (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var WRAP_CLASS = "CodeMirror-activeline"; var BACK_CLASS = "CodeMirror-activeline-background"; CodeMirror.defineOption("styleActiveLine", false, function(cm, val, old) { var prev = old && old != CodeMirror.Init; if (val && !prev) { cm.state.activeLines = []; updateActiveLines(cm, cm.listSelections()); cm.on("beforeSelectionChange", selectionChange); } else if (!val && prev) { cm.off("beforeSelectionChange", selectionChange); clearActiveLines(cm); delete cm.state.activeLines; } }); function clearActiveLines(cm) { for (var i = 0; i < cm.state.activeLines.length; i++) { cm.removeLineClass(cm.state.activeLines[i], "wrap", WRAP_CLASS); cm.removeLineClass(cm.state.activeLines[i], "background", BACK_CLASS); } } function sameArray(a, b) { if (a.length != b.length) return false; for (var i = 0; i < a.length; i++) if (a[i] != b[i]) return false; return true; } function updateActiveLines(cm, ranges) { var active = []; for (var i = 0; i < ranges.length; i++) { var range = ranges[i]; if (!range.empty()) continue; var line = cm.getLineHandleVisualStart(range.head.line); if (active[active.length - 1] != line) active.push(line); } if (sameArray(cm.state.activeLines, active)) return; cm.operation(function() { clearActiveLines(cm); for (var i = 0; i < active.length; i++) { cm.addLineClass(active[i], "wrap", WRAP_CLASS); cm.addLineClass(active[i], "background", BACK_CLASS); } cm.state.activeLines = active; }); } function selectionChange(cm, sel) { updateActiveLines(cm, sel.ranges); } }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/selection/selection-pointer.js0000664000000000000000000000633412564727254030757 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineOption("selectionPointer", false, function(cm, val) { var data = cm.state.selectionPointer; if (data) { CodeMirror.off(cm.getWrapperElement(), "mousemove", data.mousemove); CodeMirror.off(cm.getWrapperElement(), "mouseout", data.mouseout); CodeMirror.off(window, "scroll", data.windowScroll); cm.off("cursorActivity", reset); cm.off("scroll", reset); cm.state.selectionPointer = null; cm.display.lineDiv.style.cursor = ""; } if (val) { data = cm.state.selectionPointer = { value: typeof val == "string" ? val : "default", mousemove: function(event) { mousemove(cm, event); }, mouseout: function(event) { mouseout(cm, event); }, windowScroll: function() { reset(cm); }, rects: null, mouseX: null, mouseY: null, willUpdate: false }; CodeMirror.on(cm.getWrapperElement(), "mousemove", data.mousemove); CodeMirror.on(cm.getWrapperElement(), "mouseout", data.mouseout); CodeMirror.on(window, "scroll", data.windowScroll); cm.on("cursorActivity", reset); cm.on("scroll", reset); } }); function mousemove(cm, event) { var data = cm.state.selectionPointer; if (event.buttons == null ? event.which : event.buttons) { data.mouseX = data.mouseY = null; } else { data.mouseX = event.clientX; data.mouseY = event.clientY; } scheduleUpdate(cm); } function mouseout(cm, event) { if (!cm.getWrapperElement().contains(event.relatedTarget)) { var data = cm.state.selectionPointer; data.mouseX = data.mouseY = null; scheduleUpdate(cm); } } function reset(cm) { cm.state.selectionPointer.rects = null; scheduleUpdate(cm); } function scheduleUpdate(cm) { if (!cm.state.selectionPointer.willUpdate) { cm.state.selectionPointer.willUpdate = true; setTimeout(function() { update(cm); cm.state.selectionPointer.willUpdate = false; }, 50); } } function update(cm) { var data = cm.state.selectionPointer; if (!data) return; if (data.rects == null && data.mouseX != null) { data.rects = []; if (cm.somethingSelected()) { for (var sel = cm.display.selectionDiv.firstChild; sel; sel = sel.nextSibling) data.rects.push(sel.getBoundingClientRect()); } } var inside = false; if (data.mouseX != null) for (var i = 0; i < data.rects.length; i++) { var rect = data.rects[i]; if (rect.left <= data.mouseX && rect.right >= data.mouseX && rect.top <= data.mouseY && rect.bottom >= data.mouseY) inside = true; } var cursor = inside ? data.value : ""; if (cm.display.lineDiv.style.cursor != cursor) cm.display.lineDiv.style.cursor = cursor; } }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/selection/mark-selection.js0000664000000000000000000000730512564727254030230 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Because sometimes you need to mark the selected *text*. // // Adds an option 'styleSelectedText' which, when enabled, gives // selected text the CSS class given as option value, or // "CodeMirror-selectedtext" when the value is not a string. (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineOption("styleSelectedText", false, function(cm, val, old) { var prev = old && old != CodeMirror.Init; if (val && !prev) { cm.state.markedSelection = []; cm.state.markedSelectionStyle = typeof val == "string" ? val : "CodeMirror-selectedtext"; reset(cm); cm.on("cursorActivity", onCursorActivity); cm.on("change", onChange); } else if (!val && prev) { cm.off("cursorActivity", onCursorActivity); cm.off("change", onChange); clear(cm); cm.state.markedSelection = cm.state.markedSelectionStyle = null; } }); function onCursorActivity(cm) { cm.operation(function() { update(cm); }); } function onChange(cm) { if (cm.state.markedSelection.length) cm.operation(function() { clear(cm); }); } var CHUNK_SIZE = 8; var Pos = CodeMirror.Pos; var cmp = CodeMirror.cmpPos; function coverRange(cm, from, to, addAt) { if (cmp(from, to) == 0) return; var array = cm.state.markedSelection; var cls = cm.state.markedSelectionStyle; for (var line = from.line;;) { var start = line == from.line ? from : Pos(line, 0); var endLine = line + CHUNK_SIZE, atEnd = endLine >= to.line; var end = atEnd ? to : Pos(endLine, 0); var mark = cm.markText(start, end, {className: cls}); if (addAt == null) array.push(mark); else array.splice(addAt++, 0, mark); if (atEnd) break; line = endLine; } } function clear(cm) { var array = cm.state.markedSelection; for (var i = 0; i < array.length; ++i) array[i].clear(); array.length = 0; } function reset(cm) { clear(cm); var ranges = cm.listSelections(); for (var i = 0; i < ranges.length; i++) coverRange(cm, ranges[i].from(), ranges[i].to()); } function update(cm) { if (!cm.somethingSelected()) return clear(cm); if (cm.listSelections().length > 1) return reset(cm); var from = cm.getCursor("start"), to = cm.getCursor("end"); var array = cm.state.markedSelection; if (!array.length) return coverRange(cm, from, to); var coverStart = array[0].find(), coverEnd = array[array.length - 1].find(); if (!coverStart || !coverEnd || to.line - from.line < CHUNK_SIZE || cmp(from, coverEnd.to) >= 0 || cmp(to, coverStart.from) <= 0) return reset(cm); while (cmp(from, coverStart.from) > 0) { array.shift().clear(); coverStart = array[0].find(); } if (cmp(from, coverStart.from) < 0) { if (coverStart.to.line - from.line < CHUNK_SIZE) { array.shift().clear(); coverRange(cm, from, coverStart.to, 0); } else { coverRange(cm, from, coverStart.from, 0); } } while (cmp(to, coverEnd.to) < 0) { array.pop().clear(); coverEnd = array[array.length - 1].find(); } if (cmp(to, coverEnd.to) > 0) { if (to.line - coverEnd.from.line < CHUNK_SIZE) { array.pop().clear(); coverRange(cm, coverEnd.from, to); } else { coverRange(cm, coverEnd.to, to); } } } }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/mode/0000775000000000000000000000000012564727254023707 5ustar rootrootweb2py-2.12.3.orig/applications/admin/static/codemirror/addon/mode/multiplex_test.js0000664000000000000000000000145212564727254027331 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { CodeMirror.defineMode("markdown_with_stex", function(){ var inner = CodeMirror.getMode({}, "stex"); var outer = CodeMirror.getMode({}, "markdown"); var innerOptions = { open: '$', close: '$', mode: inner, delimStyle: 'delim', innerStyle: 'inner' }; return CodeMirror.multiplexingMode(outer, innerOptions); }); var mode = CodeMirror.getMode({}, "markdown_with_stex"); function MT(name) { test.mode( name, mode, Array.prototype.slice.call(arguments, 1), 'multiplexing'); } MT( "stexInsideMarkdown", "[strong **Equation:**] [delim $][inner&tag \\pi][delim $]"); })(); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/mode/simple.js0000664000000000000000000001733212564727254025544 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineSimpleMode = function(name, states) { CodeMirror.defineMode(name, function(config) { return CodeMirror.simpleMode(config, states); }); }; CodeMirror.simpleMode = function(config, states) { ensureState(states, "start"); var states_ = {}, meta = states.meta || {}, hasIndentation = false; for (var state in states) if (state != meta && states.hasOwnProperty(state)) { var list = states_[state] = [], orig = states[state]; for (var i = 0; i < orig.length; i++) { var data = orig[i]; list.push(new Rule(data, states)); if (data.indent || data.dedent) hasIndentation = true; } } var mode = { startState: function() { return {state: "start", pending: null, local: null, localState: null, indent: hasIndentation ? [] : null}; }, copyState: function(state) { var s = {state: state.state, pending: state.pending, local: state.local, localState: null, indent: state.indent && state.indent.slice(0)}; if (state.localState) s.localState = CodeMirror.copyState(state.local.mode, state.localState); if (state.stack) s.stack = state.stack.slice(0); for (var pers = state.persistentStates; pers; pers = pers.next) s.persistentStates = {mode: pers.mode, spec: pers.spec, state: pers.state == state.localState ? s.localState : CodeMirror.copyState(pers.mode, pers.state), next: s.persistentStates}; return s; }, token: tokenFunction(states_, config), innerMode: function(state) { return state.local && {mode: state.local.mode, state: state.localState}; }, indent: indentFunction(states_, meta) }; if (meta) for (var prop in meta) if (meta.hasOwnProperty(prop)) mode[prop] = meta[prop]; return mode; }; function ensureState(states, name) { if (!states.hasOwnProperty(name)) throw new Error("Undefined state " + name + "in simple mode"); } function toRegex(val, caret) { if (!val) return /(?:)/; var flags = ""; if (val instanceof RegExp) { if (val.ignoreCase) flags = "i"; val = val.source; } else { val = String(val); } return new RegExp((caret === false ? "" : "^") + "(?:" + val + ")", flags); } function asToken(val) { if (!val) return null; if (typeof val == "string") return val.replace(/\./g, " "); var result = []; for (var i = 0; i < val.length; i++) result.push(val[i] && val[i].replace(/\./g, " ")); return result; } function Rule(data, states) { if (data.next || data.push) ensureState(states, data.next || data.push); this.regex = toRegex(data.regex); this.token = asToken(data.token); this.data = data; } function tokenFunction(states, config) { return function(stream, state) { if (state.pending) { var pend = state.pending.shift(); if (state.pending.length == 0) state.pending = null; stream.pos += pend.text.length; return pend.token; } if (state.local) { if (state.local.end && stream.match(state.local.end)) { var tok = state.local.endToken || null; state.local = state.localState = null; return tok; } else { var tok = state.local.mode.token(stream, state.localState), m; if (state.local.endScan && (m = state.local.endScan.exec(stream.current()))) stream.pos = stream.start + m.index; return tok; } } var curState = states[state.state]; for (var i = 0; i < curState.length; i++) { var rule = curState[i]; var matches = (!rule.data.sol || stream.sol()) && stream.match(rule.regex); if (matches) { if (rule.data.next) { state.state = rule.data.next; } else if (rule.data.push) { (state.stack || (state.stack = [])).push(state.state); state.state = rule.data.push; } else if (rule.data.pop && state.stack && state.stack.length) { state.state = state.stack.pop(); } if (rule.data.mode) enterLocalMode(config, state, rule.data.mode, rule.token); if (rule.data.indent) state.indent.push(stream.indentation() + config.indentUnit); if (rule.data.dedent) state.indent.pop(); if (matches.length > 2) { state.pending = []; for (var j = 2; j < matches.length; j++) if (matches[j]) state.pending.push({text: matches[j], token: rule.token[j - 1]}); stream.backUp(matches[0].length - (matches[1] ? matches[1].length : 0)); return rule.token[0]; } else if (rule.token && rule.token.join) { return rule.token[0]; } else { return rule.token; } } } stream.next(); return null; }; } function cmp(a, b) { if (a === b) return true; if (!a || typeof a != "object" || !b || typeof b != "object") return false; var props = 0; for (var prop in a) if (a.hasOwnProperty(prop)) { if (!b.hasOwnProperty(prop) || !cmp(a[prop], b[prop])) return false; props++; } for (var prop in b) if (b.hasOwnProperty(prop)) props--; return props == 0; } function enterLocalMode(config, state, spec, token) { var pers; if (spec.persistent) for (var p = state.persistentStates; p && !pers; p = p.next) if (spec.spec ? cmp(spec.spec, p.spec) : spec.mode == p.mode) pers = p; var mode = pers ? pers.mode : spec.mode || CodeMirror.getMode(config, spec.spec); var lState = pers ? pers.state : CodeMirror.startState(mode); if (spec.persistent && !pers) state.persistentStates = {mode: mode, spec: spec.spec, state: lState, next: state.persistentStates}; state.localState = lState; state.local = {mode: mode, end: spec.end && toRegex(spec.end), endScan: spec.end && spec.forceEnd !== false && toRegex(spec.end, false), endToken: token && token.join ? token[token.length - 1] : token}; } function indexOf(val, arr) { for (var i = 0; i < arr.length; i++) if (arr[i] === val) return true; } function indentFunction(states, meta) { return function(state, textAfter, line) { if (state.local && state.local.mode.indent) return state.local.mode.indent(state.localState, textAfter, line); if (state.indent == null || state.local || meta.dontIndentStates && indexOf(state.state, meta.dontIndentStates) > -1) return CodeMirror.Pass; var pos = state.indent.length - 1, rules = states[state.state]; scan: for (;;) { for (var i = 0; i < rules.length; i++) { var rule = rules[i]; if (rule.data.dedent && rule.data.dedentIfLineStart !== false) { var m = rule.regex.exec(textAfter); if (m && m[0]) { pos--; if (rule.next || rule.push) rules = states[rule.next || rule.push]; textAfter = textAfter.slice(m[0].length); continue scan; } } } break; } return pos < 0 ? 0 : state.indent[pos]; }; } }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/mode/overlay.js0000664000000000000000000000571512564727254025736 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Utility function that allows modes to be combined. The mode given // as the base argument takes care of most of the normal mode // functionality, but a second (typically simple) mode is used, which // can override the style of text. Both modes get to parse all of the // text, but when both assign a non-null style to a piece of code, the // overlay wins, unless the combine argument was true and not overridden, // or state.overlay.combineTokens was true, in which case the styles are // combined. (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.overlayMode = function(base, overlay, combine) { return { startState: function() { return { base: CodeMirror.startState(base), overlay: CodeMirror.startState(overlay), basePos: 0, baseCur: null, overlayPos: 0, overlayCur: null, streamSeen: null }; }, copyState: function(state) { return { base: CodeMirror.copyState(base, state.base), overlay: CodeMirror.copyState(overlay, state.overlay), basePos: state.basePos, baseCur: null, overlayPos: state.overlayPos, overlayCur: null }; }, token: function(stream, state) { if (stream != state.streamSeen || Math.min(state.basePos, state.overlayPos) < stream.start) { state.streamSeen = stream; state.basePos = state.overlayPos = stream.start; } if (stream.start == state.basePos) { state.baseCur = base.token(stream, state.base); state.basePos = stream.pos; } if (stream.start == state.overlayPos) { stream.pos = stream.start; state.overlayCur = overlay.token(stream, state.overlay); state.overlayPos = stream.pos; } stream.pos = Math.min(state.basePos, state.overlayPos); // state.overlay.combineTokens always takes precedence over combine, // unless set to null if (state.overlayCur == null) return state.baseCur; else if (state.baseCur != null && state.overlay.combineTokens || combine && state.overlay.combineTokens == null) return state.baseCur + " " + state.overlayCur; else return state.overlayCur; }, indent: base.indent && function(state, textAfter) { return base.indent(state.base, textAfter); }, electricChars: base.electricChars, innerMode: function(state) { return {state: state.base, mode: base}; }, blankLine: function(state) { if (base.blankLine) base.blankLine(state.base); if (overlay.blankLine) overlay.blankLine(state.overlay); } }; }; }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/mode/multiplex.js0000664000000000000000000001014512564727254026271 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.multiplexingMode = function(outer /*, others */) { // Others should be {open, close, mode [, delimStyle] [, innerStyle]} objects var others = Array.prototype.slice.call(arguments, 1); var n_others = others.length; function indexOf(string, pattern, from) { if (typeof pattern == "string") return string.indexOf(pattern, from); var m = pattern.exec(from ? string.slice(from) : string); return m ? m.index + from : -1; } return { startState: function() { return { outer: CodeMirror.startState(outer), innerActive: null, inner: null }; }, copyState: function(state) { return { outer: CodeMirror.copyState(outer, state.outer), innerActive: state.innerActive, inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner) }; }, token: function(stream, state) { if (!state.innerActive) { var cutOff = Infinity, oldContent = stream.string; for (var i = 0; i < n_others; ++i) { var other = others[i]; var found = indexOf(oldContent, other.open, stream.pos); if (found == stream.pos) { stream.match(other.open); state.innerActive = other; state.inner = CodeMirror.startState(other.mode, outer.indent ? outer.indent(state.outer, "") : 0); return other.delimStyle; } else if (found != -1 && found < cutOff) { cutOff = found; } } if (cutOff != Infinity) stream.string = oldContent.slice(0, cutOff); var outerToken = outer.token(stream, state.outer); if (cutOff != Infinity) stream.string = oldContent; return outerToken; } else { var curInner = state.innerActive, oldContent = stream.string; if (!curInner.close && stream.sol()) { state.innerActive = state.inner = null; return this.token(stream, state); } var found = curInner.close ? indexOf(oldContent, curInner.close, stream.pos) : -1; if (found == stream.pos) { stream.match(curInner.close); state.innerActive = state.inner = null; return curInner.delimStyle; } if (found > -1) stream.string = oldContent.slice(0, found); var innerToken = curInner.mode.token(stream, state.inner); if (found > -1) stream.string = oldContent; if (curInner.innerStyle) { if (innerToken) innerToken = innerToken + ' ' + curInner.innerStyle; else innerToken = curInner.innerStyle; } return innerToken; } }, indent: function(state, textAfter) { var mode = state.innerActive ? state.innerActive.mode : outer; if (!mode.indent) return CodeMirror.Pass; return mode.indent(state.innerActive ? state.inner : state.outer, textAfter); }, blankLine: function(state) { var mode = state.innerActive ? state.innerActive.mode : outer; if (mode.blankLine) { mode.blankLine(state.innerActive ? state.inner : state.outer); } if (!state.innerActive) { for (var i = 0; i < n_others; ++i) { var other = others[i]; if (other.open === "\n") { state.innerActive = other; state.inner = CodeMirror.startState(other.mode, mode.indent ? mode.indent(state.outer, "") : 0); } } } else if (state.innerActive.close === "\n") { state.innerActive = state.inner = null; } }, electricChars: outer.electricChars, innerMode: function(state) { return state.inner ? {state: state.inner, mode: state.innerActive.mode} : {state: state.outer, mode: outer}; } }; }; }); web2py-2.12.3.orig/applications/admin/static/codemirror/addon/mode/loadmode.js0000664000000000000000000000434512564727254026037 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), "cjs"); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], function(CM) { mod(CM, "amd"); }); else // Plain browser env mod(CodeMirror, "plain"); })(function(CodeMirror, env) { if (!CodeMirror.modeURL) CodeMirror.modeURL = "../mode/%N/%N.js"; var loading = {}; function splitCallback(cont, n) { var countDown = n; return function() { if (--countDown == 0) cont(); }; } function ensureDeps(mode, cont) { var deps = CodeMirror.modes[mode].dependencies; if (!deps) return cont(); var missing = []; for (var i = 0; i < deps.length; ++i) { if (!CodeMirror.modes.hasOwnProperty(deps[i])) missing.push(deps[i]); } if (!missing.length) return cont(); var split = splitCallback(cont, missing.length); for (var i = 0; i < missing.length; ++i) CodeMirror.requireMode(missing[i], split); } CodeMirror.requireMode = function(mode, cont) { if (typeof mode != "string") mode = mode.name; if (CodeMirror.modes.hasOwnProperty(mode)) return ensureDeps(mode, cont); if (loading.hasOwnProperty(mode)) return loading[mode].push(cont); var file = CodeMirror.modeURL.replace(/%N/g, mode); if (env == "plain") { var script = document.createElement("script"); script.src = file; var others = document.getElementsByTagName("script")[0]; var list = loading[mode] = [cont]; CodeMirror.on(script, "load", function() { ensureDeps(mode, function() { for (var i = 0; i < list.length; ++i) list[i](); }); }); others.parentNode.insertBefore(script, others); } else if (env == "cjs") { require(file); cont(); } else if (env == "amd") { requirejs([file], cont); } }; CodeMirror.autoLoadMode = function(instance, mode) { if (!CodeMirror.modes.hasOwnProperty(mode)) CodeMirror.requireMode(mode, function() { instance.setOption("mode", instance.getOption("mode")); }); }; }); web2py-2.12.3.orig/applications/admin/static/codemirror/keymap/0000775000000000000000000000000012564727254023164 5ustar rootrootweb2py-2.12.3.orig/applications/admin/static/codemirror/keymap/vim.js0000664000000000000000000057171012564727254024330 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /** * Supported keybindings: * * Motion: * h, j, k, l * gj, gk * e, E, w, W, b, B, ge, gE * f, F, t, T * $, ^, 0, -, +, _ * gg, G * % * ', ` * * Operator: * d, y, c * dd, yy, cc * g~, g~g~ * >, <, >>, << * * Operator-Motion: * x, X, D, Y, C, ~ * * Action: * a, i, s, A, I, S, o, O * zz, z., z, zt, zb, z- * J * u, Ctrl-r * m * r * * Modes: * ESC - leave insert mode, visual mode, and clear input state. * Ctrl-[, Ctrl-c - same as ESC. * * Registers: unnamed, -, a-z, A-Z, 0-9 * (Does not respect the special case for number registers when delete * operator is made with these commands: %, (, ), , /, ?, n, N, {, } ) * TODO: Implement the remaining registers. * Marks: a-z, A-Z, and 0-9 * TODO: Implement the remaining special marks. They have more complex * behavior. * * Events: * 'vim-mode-change' - raised on the editor anytime the current mode changes, * Event object: {mode: "visual", subMode: "linewise"} * * Code structure: * 1. Default keymap * 2. Variable declarations and short basic helpers * 3. Instance (External API) implementation * 4. Internal state tracking objects (input state, counter) implementation * and instanstiation * 5. Key handler (the main command dispatcher) implementation * 6. Motion, operator, and action implementations * 7. Helper functions for the key handler, motions, operators, and actions * 8. Set up Vim to work as a keymap for CodeMirror. */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../lib/codemirror"), require("../addon/search/searchcursor"), require("../addon/dialog/dialog"), require("../addon/edit/matchbrackets.js")); else if (typeof define == "function" && define.amd) // AMD define(["../lib/codemirror", "../addon/search/searchcursor", "../addon/dialog/dialog", "../addon/edit/matchbrackets"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { 'use strict'; var defaultKeymap = [ // Key to key mapping. This goes first to make it possible to override // existing mappings. { keys: '', type: 'keyToKey', toKeys: 'h' }, { keys: '', type: 'keyToKey', toKeys: 'l' }, { keys: '', type: 'keyToKey', toKeys: 'k' }, { keys: '', type: 'keyToKey', toKeys: 'j' }, { keys: '', type: 'keyToKey', toKeys: 'l' }, { keys: '', type: 'keyToKey', toKeys: 'h', context: 'normal'}, { keys: '', type: 'keyToKey', toKeys: 'W' }, { keys: '', type: 'keyToKey', toKeys: 'B', context: 'normal' }, { keys: '', type: 'keyToKey', toKeys: 'w' }, { keys: '', type: 'keyToKey', toKeys: 'b', context: 'normal' }, { keys: '', type: 'keyToKey', toKeys: 'j' }, { keys: '', type: 'keyToKey', toKeys: 'k' }, { keys: '', type: 'keyToKey', toKeys: '' }, { keys: '', type: 'keyToKey', toKeys: '' }, { keys: '', type: 'keyToKey', toKeys: '', context: 'insert' }, { keys: '', type: 'keyToKey', toKeys: '', context: 'insert' }, { keys: 's', type: 'keyToKey', toKeys: 'cl', context: 'normal' }, { keys: 's', type: 'keyToKey', toKeys: 'xi', context: 'visual'}, { keys: 'S', type: 'keyToKey', toKeys: 'cc', context: 'normal' }, { keys: 'S', type: 'keyToKey', toKeys: 'dcc', context: 'visual' }, { keys: '', type: 'keyToKey', toKeys: '0' }, { keys: '', type: 'keyToKey', toKeys: '$' }, { keys: '', type: 'keyToKey', toKeys: '' }, { keys: '', type: 'keyToKey', toKeys: '' }, { keys: '', type: 'keyToKey', toKeys: 'j^', context: 'normal' }, // Motions { keys: 'H', type: 'motion', motion: 'moveToTopLine', motionArgs: { linewise: true, toJumplist: true }}, { keys: 'M', type: 'motion', motion: 'moveToMiddleLine', motionArgs: { linewise: true, toJumplist: true }}, { keys: 'L', type: 'motion', motion: 'moveToBottomLine', motionArgs: { linewise: true, toJumplist: true }}, { keys: 'h', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: false }}, { keys: 'l', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: true }}, { keys: 'j', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, linewise: true }}, { keys: 'k', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, linewise: true }}, { keys: 'gj', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: true }}, { keys: 'gk', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: false }}, { keys: 'w', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false }}, { keys: 'W', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false, bigWord: true }}, { keys: 'e', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, inclusive: true }}, { keys: 'E', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, bigWord: true, inclusive: true }}, { keys: 'b', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false }}, { keys: 'B', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false, bigWord: true }}, { keys: 'ge', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, inclusive: true }}, { keys: 'gE', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, bigWord: true, inclusive: true }}, { keys: '{', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: false, toJumplist: true }}, { keys: '}', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: true, toJumplist: true }}, { keys: '', type: 'motion', motion: 'moveByPage', motionArgs: { forward: true }}, { keys: '', type: 'motion', motion: 'moveByPage', motionArgs: { forward: false }}, { keys: '', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: true, explicitRepeat: true }}, { keys: '', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: false, explicitRepeat: true }}, { keys: 'gg', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: false, explicitRepeat: true, linewise: true, toJumplist: true }}, { keys: 'G', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: true, explicitRepeat: true, linewise: true, toJumplist: true }}, { keys: '0', type: 'motion', motion: 'moveToStartOfLine' }, { keys: '^', type: 'motion', motion: 'moveToFirstNonWhiteSpaceCharacter' }, { keys: '+', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar:true }}, { keys: '-', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, toFirstChar:true }}, { keys: '_', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar:true, repeatOffset:-1 }}, { keys: '$', type: 'motion', motion: 'moveToEol', motionArgs: { inclusive: true }}, { keys: '%', type: 'motion', motion: 'moveToMatchedSymbol', motionArgs: { inclusive: true, toJumplist: true }}, { keys: 'f', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: true , inclusive: true }}, { keys: 'F', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: false }}, { keys: 't', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: true, inclusive: true }}, { keys: 'T', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: false }}, { keys: ';', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: true }}, { keys: ',', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: false }}, { keys: '\'', type: 'motion', motion: 'goToMark', motionArgs: {toJumplist: true, linewise: true}}, { keys: '`', type: 'motion', motion: 'goToMark', motionArgs: {toJumplist: true}}, { keys: ']`', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true } }, { keys: '[`', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false } }, { keys: ']\'', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true, linewise: true } }, { keys: '[\'', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false, linewise: true } }, // the next two aren't motions but must come before more general motion declarations { keys: ']p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true, matchIndent: true}}, { keys: '[p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true, matchIndent: true}}, { keys: ']', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: true, toJumplist: true}}, { keys: '[', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: false, toJumplist: true}}, { keys: '|', type: 'motion', motion: 'moveToColumn'}, { keys: 'o', type: 'motion', motion: 'moveToOtherHighlightedEnd', context:'visual'}, { keys: 'O', type: 'motion', motion: 'moveToOtherHighlightedEnd', motionArgs: {sameLine: true}, context:'visual'}, // Operators { keys: 'd', type: 'operator', operator: 'delete' }, { keys: 'y', type: 'operator', operator: 'yank' }, { keys: 'c', type: 'operator', operator: 'change' }, { keys: '>', type: 'operator', operator: 'indent', operatorArgs: { indentRight: true }}, { keys: '<', type: 'operator', operator: 'indent', operatorArgs: { indentRight: false }}, { keys: 'g~', type: 'operator', operator: 'changeCase' }, { keys: 'gu', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: true}, isEdit: true }, { keys: 'gU', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, isEdit: true }, { keys: 'n', type: 'motion', motion: 'findNext', motionArgs: { forward: true, toJumplist: true }}, { keys: 'N', type: 'motion', motion: 'findNext', motionArgs: { forward: false, toJumplist: true }}, // Operator-Motion dual commands { keys: 'x', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorMotionArgs: { visualLine: false }}, { keys: 'X', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: false }, operatorMotionArgs: { visualLine: true }}, { keys: 'D', type: 'operatorMotion', operator: 'delete', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'}, { keys: 'D', type: 'operator', operator: 'delete', operatorArgs: { linewise: true }, context: 'visual'}, { keys: 'Y', type: 'operatorMotion', operator: 'yank', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'}, { keys: 'Y', type: 'operator', operator: 'yank', operatorArgs: { linewise: true }, context: 'visual'}, { keys: 'C', type: 'operatorMotion', operator: 'change', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'}, { keys: 'C', type: 'operator', operator: 'change', operatorArgs: { linewise: true }, context: 'visual'}, { keys: '~', type: 'operatorMotion', operator: 'changeCase', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorArgs: { shouldMoveCursor: true }, context: 'normal'}, { keys: '~', type: 'operator', operator: 'changeCase', context: 'visual'}, { keys: '', type: 'operatorMotion', operator: 'delete', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false }, context: 'insert' }, // Actions { keys: '', type: 'action', action: 'jumpListWalk', actionArgs: { forward: true }}, { keys: '', type: 'action', action: 'jumpListWalk', actionArgs: { forward: false }}, { keys: '', type: 'action', action: 'scroll', actionArgs: { forward: true, linewise: true }}, { keys: '', type: 'action', action: 'scroll', actionArgs: { forward: false, linewise: true }}, { keys: 'a', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'charAfter' }, context: 'normal' }, { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'eol' }, context: 'normal' }, { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'endOfSelectedArea' }, context: 'visual' }, { keys: 'i', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'inplace' }, context: 'normal' }, { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'firstNonBlank'}, context: 'normal' }, { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'startOfSelectedArea' }, context: 'visual' }, { keys: 'o', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: true }, context: 'normal' }, { keys: 'O', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: false }, context: 'normal' }, { keys: 'v', type: 'action', action: 'toggleVisualMode' }, { keys: 'V', type: 'action', action: 'toggleVisualMode', actionArgs: { linewise: true }}, { keys: '', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true }}, { keys: 'gv', type: 'action', action: 'reselectLastSelection' }, { keys: 'J', type: 'action', action: 'joinLines', isEdit: true }, { keys: 'p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true }}, { keys: 'P', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true }}, { keys: 'r', type: 'action', action: 'replace', isEdit: true }, { keys: '@', type: 'action', action: 'replayMacro' }, { keys: 'q', type: 'action', action: 'enterMacroRecordMode' }, // Handle Replace-mode as a special case of insert mode. { keys: 'R', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { replace: true }}, { keys: 'u', type: 'action', action: 'undo', context: 'normal' }, { keys: 'u', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: true}, context: 'visual', isEdit: true }, { keys: 'U', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, context: 'visual', isEdit: true }, { keys: '', type: 'action', action: 'redo' }, { keys: 'm', type: 'action', action: 'setMark' }, { keys: '"', type: 'action', action: 'setRegister' }, { keys: 'zz', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' }}, { keys: 'z.', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' }, motion: 'moveToFirstNonWhiteSpaceCharacter' }, { keys: 'zt', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' }}, { keys: 'z', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' }, motion: 'moveToFirstNonWhiteSpaceCharacter' }, { keys: 'z-', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' }}, { keys: 'zb', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' }, motion: 'moveToFirstNonWhiteSpaceCharacter' }, { keys: '.', type: 'action', action: 'repeatLastEdit' }, { keys: '', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: true, backtrack: false}}, { keys: '', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: false, backtrack: false}}, // Text object motions { keys: 'a', type: 'motion', motion: 'textObjectManipulation' }, { keys: 'i', type: 'motion', motion: 'textObjectManipulation', motionArgs: { textObjectInner: true }}, // Search { keys: '/', type: 'search', searchArgs: { forward: true, querySrc: 'prompt', toJumplist: true }}, { keys: '?', type: 'search', searchArgs: { forward: false, querySrc: 'prompt', toJumplist: true }}, { keys: '*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }}, { keys: '#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }}, { keys: 'g*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', toJumplist: true }}, { keys: 'g#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', toJumplist: true }}, // Ex command { keys: ':', type: 'ex' } ]; var Pos = CodeMirror.Pos; var Vim = function() { function enterVimMode(cm) { cm.setOption('disableInput', true); cm.setOption('showCursorWhenSelecting', false); CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"}); cm.on('cursorActivity', onCursorActivity); maybeInitVimState(cm); CodeMirror.on(cm.getInputField(), 'paste', getOnPasteFn(cm)); } function leaveVimMode(cm) { cm.setOption('disableInput', false); cm.off('cursorActivity', onCursorActivity); CodeMirror.off(cm.getInputField(), 'paste', getOnPasteFn(cm)); cm.state.vim = null; } function detachVimMap(cm, next) { if (this == CodeMirror.keyMap.vim) CodeMirror.rmClass(cm.getWrapperElement(), "cm-fat-cursor"); if (!next || next.attach != attachVimMap) leaveVimMode(cm, false); } function attachVimMap(cm, prev) { if (this == CodeMirror.keyMap.vim) CodeMirror.addClass(cm.getWrapperElement(), "cm-fat-cursor"); if (!prev || prev.attach != attachVimMap) enterVimMode(cm); } // Deprecated, simply setting the keymap works again. CodeMirror.defineOption('vimMode', false, function(cm, val, prev) { if (val && cm.getOption("keyMap") != "vim") cm.setOption("keyMap", "vim"); else if (!val && prev != CodeMirror.Init && /^vim/.test(cm.getOption("keyMap"))) cm.setOption("keyMap", "default"); }); function cmKey(key, cm) { if (!cm) { return undefined; } var vimKey = cmKeyToVimKey(key); if (!vimKey) { return false; } var cmd = CodeMirror.Vim.findKey(cm, vimKey); if (typeof cmd == 'function') { CodeMirror.signal(cm, 'vim-keypress', vimKey); } return cmd; } var modifiers = {'Shift': 'S', 'Ctrl': 'C', 'Alt': 'A', 'Cmd': 'D', 'Mod': 'A'}; var specialKeys = {Enter:'CR',Backspace:'BS',Delete:'Del'}; function cmKeyToVimKey(key) { if (key.charAt(0) == '\'') { // Keypress character binding of format "'a'" return key.charAt(1); } var pieces = key.split('-'); if (/-$/.test(key)) { // If the - key was typed, split will result in 2 extra empty strings // in the array. Replace them with 1 '-'. pieces.splice(-2, 2, '-'); } var lastPiece = pieces[pieces.length - 1]; if (pieces.length == 1 && pieces[0].length == 1) { // No-modifier bindings use literal character bindings above. Skip. return false; } else if (pieces.length == 2 && pieces[0] == 'Shift' && lastPiece.length == 1) { // Ignore Shift+char bindings as they should be handled by literal character. return false; } var hasCharacter = false; for (var i = 0; i < pieces.length; i++) { var piece = pieces[i]; if (piece in modifiers) { pieces[i] = modifiers[piece]; } else { hasCharacter = true; } if (piece in specialKeys) { pieces[i] = specialKeys[piece]; } } if (!hasCharacter) { // Vim does not support modifier only keys. return false; } // TODO: Current bindings expect the character to be lower case, but // it looks like vim key notation uses upper case. if (isUpperCase(lastPiece)) { pieces[pieces.length - 1] = lastPiece.toLowerCase(); } return '<' + pieces.join('-') + '>'; } function getOnPasteFn(cm) { var vim = cm.state.vim; if (!vim.onPasteFn) { vim.onPasteFn = function() { if (!vim.insertMode) { cm.setCursor(offsetCursor(cm.getCursor(), 0, 1)); actions.enterInsertMode(cm, {}, vim); } }; } return vim.onPasteFn; } var numberRegex = /[\d]/; var wordRegexp = [(/\w/), (/[^\w\s]/)], bigWordRegexp = [(/\S/)]; function makeKeyRange(start, size) { var keys = []; for (var i = start; i < start + size; i++) { keys.push(String.fromCharCode(i)); } return keys; } var upperCaseAlphabet = makeKeyRange(65, 26); var lowerCaseAlphabet = makeKeyRange(97, 26); var numbers = makeKeyRange(48, 10); var validMarks = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['<', '>']); var validRegisters = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['-', '"', '.', ':', '/']); function isLine(cm, line) { return line >= cm.firstLine() && line <= cm.lastLine(); } function isLowerCase(k) { return (/^[a-z]$/).test(k); } function isMatchableSymbol(k) { return '()[]{}'.indexOf(k) != -1; } function isNumber(k) { return numberRegex.test(k); } function isUpperCase(k) { return (/^[A-Z]$/).test(k); } function isWhiteSpaceString(k) { return (/^\s*$/).test(k); } function inArray(val, arr) { for (var i = 0; i < arr.length; i++) { if (arr[i] == val) { return true; } } return false; } var options = {}; function defineOption(name, defaultValue, type) { if (defaultValue === undefined) { throw Error('defaultValue is required'); } if (!type) { type = 'string'; } options[name] = { type: type, defaultValue: defaultValue }; setOption(name, defaultValue); } function setOption(name, value) { var option = options[name]; if (!option) { throw Error('Unknown option: ' + name); } if (option.type == 'boolean') { if (value && value !== true) { throw Error('Invalid argument: ' + name + '=' + value); } else if (value !== false) { // Boolean options are set to true if value is not defined. value = true; } } option.value = option.type == 'boolean' ? !!value : value; } function getOption(name) { var option = options[name]; if (!option) { throw Error('Unknown option: ' + name); } return option.value; } var createCircularJumpList = function() { var size = 100; var pointer = -1; var head = 0; var tail = 0; var buffer = new Array(size); function add(cm, oldCur, newCur) { var current = pointer % size; var curMark = buffer[current]; function useNextSlot(cursor) { var next = ++pointer % size; var trashMark = buffer[next]; if (trashMark) { trashMark.clear(); } buffer[next] = cm.setBookmark(cursor); } if (curMark) { var markPos = curMark.find(); // avoid recording redundant cursor position if (markPos && !cursorEqual(markPos, oldCur)) { useNextSlot(oldCur); } } else { useNextSlot(oldCur); } useNextSlot(newCur); head = pointer; tail = pointer - size + 1; if (tail < 0) { tail = 0; } } function move(cm, offset) { pointer += offset; if (pointer > head) { pointer = head; } else if (pointer < tail) { pointer = tail; } var mark = buffer[(size + pointer) % size]; // skip marks that are temporarily removed from text buffer if (mark && !mark.find()) { var inc = offset > 0 ? 1 : -1; var newCur; var oldCur = cm.getCursor(); do { pointer += inc; mark = buffer[(size + pointer) % size]; // skip marks that are the same as current position if (mark && (newCur = mark.find()) && !cursorEqual(oldCur, newCur)) { break; } } while (pointer < head && pointer > tail); } return mark; } return { cachedCursor: undefined, //used for # and * jumps add: add, move: move }; }; // Returns an object to track the changes associated insert mode. It // clones the object that is passed in, or creates an empty object one if // none is provided. var createInsertModeChanges = function(c) { if (c) { // Copy construction return { changes: c.changes, expectCursorActivityForChange: c.expectCursorActivityForChange }; } return { // Change list changes: [], // Set to true on change, false on cursorActivity. expectCursorActivityForChange: false }; }; function MacroModeState() { this.latestRegister = undefined; this.isPlaying = false; this.isRecording = false; this.replaySearchQueries = []; this.onRecordingDone = undefined; this.lastInsertModeChanges = createInsertModeChanges(); } MacroModeState.prototype = { exitMacroRecordMode: function() { var macroModeState = vimGlobalState.macroModeState; if (macroModeState.onRecordingDone) { macroModeState.onRecordingDone(); // close dialog } macroModeState.onRecordingDone = undefined; macroModeState.isRecording = false; }, enterMacroRecordMode: function(cm, registerName) { var register = vimGlobalState.registerController.getRegister(registerName); if (register) { register.clear(); this.latestRegister = registerName; if (cm.openDialog) { this.onRecordingDone = cm.openDialog( '(recording)['+registerName+']', null, {bottom:true}); } this.isRecording = true; } } }; function maybeInitVimState(cm) { if (!cm.state.vim) { // Store instance state in the CodeMirror object. cm.state.vim = { inputState: new InputState(), // Vim's input state that triggered the last edit, used to repeat // motions and operators with '.'. lastEditInputState: undefined, // Vim's action command before the last edit, used to repeat actions // with '.' and insert mode repeat. lastEditActionCommand: undefined, // When using jk for navigation, if you move from a longer line to a // shorter line, the cursor may clip to the end of the shorter line. // If j is pressed again and cursor goes to the next line, the // cursor should go back to its horizontal position on the longer // line if it can. This is to keep track of the horizontal position. lastHPos: -1, // Doing the same with screen-position for gj/gk lastHSPos: -1, // The last motion command run. Cleared if a non-motion command gets // executed in between. lastMotion: null, marks: {}, // Mark for rendering fake cursor for visual mode. fakeCursor: null, insertMode: false, // Repeat count for changes made in insert mode, triggered by key // sequences like 3,i. Only exists when insertMode is true. insertModeRepeat: undefined, visualMode: false, // If we are in visual line mode. No effect if visualMode is false. visualLine: false, visualBlock: false, lastSelection: null, lastPastedText: null, sel: { } }; } return cm.state.vim; } var vimGlobalState; function resetVimGlobalState() { vimGlobalState = { // The current search query. searchQuery: null, // Whether we are searching backwards. searchIsReversed: false, // Replace part of the last substituted pattern lastSubstituteReplacePart: undefined, jumpList: createCircularJumpList(), macroModeState: new MacroModeState, // Recording latest f, t, F or T motion command. lastChararacterSearch: {increment:0, forward:true, selectedCharacter:''}, registerController: new RegisterController({}), // search history buffer searchHistoryController: new HistoryController({}), // ex Command history buffer exCommandHistoryController : new HistoryController({}) }; for (var optionName in options) { var option = options[optionName]; option.value = option.defaultValue; } } var lastInsertModeKeyTimer; var vimApi= { buildKeyMap: function() { // TODO: Convert keymap into dictionary format for fast lookup. }, // Testing hook, though it might be useful to expose the register // controller anyways. getRegisterController: function() { return vimGlobalState.registerController; }, // Testing hook. resetVimGlobalState_: resetVimGlobalState, // Testing hook. getVimGlobalState_: function() { return vimGlobalState; }, // Testing hook. maybeInitVimState_: maybeInitVimState, suppressErrorLogging: false, InsertModeKey: InsertModeKey, map: function(lhs, rhs, ctx) { // Add user defined key bindings. exCommandDispatcher.map(lhs, rhs, ctx); }, setOption: setOption, getOption: getOption, defineOption: defineOption, defineEx: function(name, prefix, func){ if (name.indexOf(prefix) !== 0) { throw new Error('(Vim.defineEx) "'+prefix+'" is not a prefix of "'+name+'", command not registered'); } exCommands[name]=func; exCommandDispatcher.commandMap_[prefix]={name:name, shortName:prefix, type:'api'}; }, handleKey: function (cm, key, origin) { var command = this.findKey(cm, key, origin); if (typeof command === 'function') { return command(); } }, /** * This is the outermost function called by CodeMirror, after keys have * been mapped to their Vim equivalents. * * Finds a command based on the key (and cached keys if there is a * multi-key sequence). Returns `undefined` if no key is matched, a noop * function if a partial match is found (multi-key), and a function to * execute the bound command if a a key is matched. The function always * returns true. */ findKey: function(cm, key, origin) { var vim = maybeInitVimState(cm); function handleMacroRecording() { var macroModeState = vimGlobalState.macroModeState; if (macroModeState.isRecording) { if (key == 'q') { macroModeState.exitMacroRecordMode(); clearInputState(cm); return true; } if (origin != 'mapping') { logKey(macroModeState, key); } } } function handleEsc() { if (key == '') { // Clear input state and get back to normal mode. clearInputState(cm); if (vim.visualMode) { exitVisualMode(cm); } else if (vim.insertMode) { exitInsertMode(cm); } return true; } } function doKeyToKey(keys) { // TODO: prevent infinite recursion. var match; while (keys) { // Pull off one command key, which is either a single character // or a special sequence wrapped in '<' and '>', e.g. ''. match = (/<\w+-.+?>|<\w+>|./).exec(keys); key = match[0]; keys = keys.substring(match.index + key.length); CodeMirror.Vim.handleKey(cm, key, 'mapping'); } } function handleKeyInsertMode() { if (handleEsc()) { return true; } var keys = vim.inputState.keyBuffer = vim.inputState.keyBuffer + key; var keysAreChars = key.length == 1; var match = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert'); // Need to check all key substrings in insert mode. while (keys.length > 1 && match.type != 'full') { var keys = vim.inputState.keyBuffer = keys.slice(1); var thisMatch = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert'); if (thisMatch.type != 'none') { match = thisMatch; } } if (match.type == 'none') { clearInputState(cm); return false; } else if (match.type == 'partial') { if (lastInsertModeKeyTimer) { window.clearTimeout(lastInsertModeKeyTimer); } lastInsertModeKeyTimer = window.setTimeout( function() { if (vim.insertMode && vim.inputState.keyBuffer) { clearInputState(cm); } }, getOption('insertModeEscKeysTimeout')); return !keysAreChars; } if (lastInsertModeKeyTimer) { window.clearTimeout(lastInsertModeKeyTimer); } if (keysAreChars) { var here = cm.getCursor(); cm.replaceRange('', offsetCursor(here, 0, -(keys.length - 1)), here, '+input'); } clearInputState(cm); return match.command; } function handleKeyNonInsertMode() { if (handleMacroRecording() || handleEsc()) { return true; }; var keys = vim.inputState.keyBuffer = vim.inputState.keyBuffer + key; if (/^[1-9]\d*$/.test(keys)) { return true; } var keysMatcher = /^(\d*)(.*)$/.exec(keys); if (!keysMatcher) { clearInputState(cm); return false; } var context = vim.visualMode ? 'visual' : 'normal'; var match = commandDispatcher.matchCommand(keysMatcher[2] || keysMatcher[1], defaultKeymap, vim.inputState, context); if (match.type == 'none') { clearInputState(cm); return false; } else if (match.type == 'partial') { return true; } vim.inputState.keyBuffer = ''; var keysMatcher = /^(\d*)(.*)$/.exec(keys); if (keysMatcher[1] && keysMatcher[1] != '0') { vim.inputState.pushRepeatDigit(keysMatcher[1]); } return match.command; } var command; if (vim.insertMode) { command = handleKeyInsertMode(); } else { command = handleKeyNonInsertMode(); } if (command === false) { return undefined; } else if (command === true) { // TODO: Look into using CodeMirror's multi-key handling. // Return no-op since we are caching the key. Counts as handled, but // don't want act on it just yet. return function() {}; } else { return function() { return cm.operation(function() { cm.curOp.isVimOp = true; try { if (command.type == 'keyToKey') { doKeyToKey(command.toKeys); } else { commandDispatcher.processCommand(cm, vim, command); } } catch (e) { // clear VIM state in case it's in a bad state. cm.state.vim = undefined; maybeInitVimState(cm); if (!CodeMirror.Vim.suppressErrorLogging) { console['log'](e); } throw e; } return true; }); }; } }, handleEx: function(cm, input) { exCommandDispatcher.processCommand(cm, input); }, defineMotion: defineMotion, defineAction: defineAction, defineOperator: defineOperator, mapCommand: mapCommand, _mapCommand: _mapCommand, exitVisualMode: exitVisualMode, exitInsertMode: exitInsertMode }; // Represents the current input state. function InputState() { this.prefixRepeat = []; this.motionRepeat = []; this.operator = null; this.operatorArgs = null; this.motion = null; this.motionArgs = null; this.keyBuffer = []; // For matching multi-key commands. this.registerName = null; // Defaults to the unnamed register. } InputState.prototype.pushRepeatDigit = function(n) { if (!this.operator) { this.prefixRepeat = this.prefixRepeat.concat(n); } else { this.motionRepeat = this.motionRepeat.concat(n); } }; InputState.prototype.getRepeat = function() { var repeat = 0; if (this.prefixRepeat.length > 0 || this.motionRepeat.length > 0) { repeat = 1; if (this.prefixRepeat.length > 0) { repeat *= parseInt(this.prefixRepeat.join(''), 10); } if (this.motionRepeat.length > 0) { repeat *= parseInt(this.motionRepeat.join(''), 10); } } return repeat; }; function clearInputState(cm, reason) { cm.state.vim.inputState = new InputState(); CodeMirror.signal(cm, 'vim-command-done', reason); } /* * Register stores information about copy and paste registers. Besides * text, a register must store whether it is linewise (i.e., when it is * pasted, should it insert itself into a new line, or should the text be * inserted at the cursor position.) */ function Register(text, linewise, blockwise) { this.clear(); this.keyBuffer = [text || '']; this.insertModeChanges = []; this.searchQueries = []; this.linewise = !!linewise; this.blockwise = !!blockwise; } Register.prototype = { setText: function(text, linewise, blockwise) { this.keyBuffer = [text || '']; this.linewise = !!linewise; this.blockwise = !!blockwise; }, pushText: function(text, linewise) { // if this register has ever been set to linewise, use linewise. if (linewise) { if (!this.linewise) { this.keyBuffer.push('\n'); } this.linewise = true; } this.keyBuffer.push(text); }, pushInsertModeChanges: function(changes) { this.insertModeChanges.push(createInsertModeChanges(changes)); }, pushSearchQuery: function(query) { this.searchQueries.push(query); }, clear: function() { this.keyBuffer = []; this.insertModeChanges = []; this.searchQueries = []; this.linewise = false; }, toString: function() { return this.keyBuffer.join(''); } }; /* * vim registers allow you to keep many independent copy and paste buffers. * See http://usevim.com/2012/04/13/registers/ for an introduction. * * RegisterController keeps the state of all the registers. An initial * state may be passed in. The unnamed register '"' will always be * overridden. */ function RegisterController(registers) { this.registers = registers; this.unnamedRegister = registers['"'] = new Register(); registers['.'] = new Register(); registers[':'] = new Register(); registers['/'] = new Register(); } RegisterController.prototype = { pushText: function(registerName, operator, text, linewise, blockwise) { if (linewise && text.charAt(0) == '\n') { text = text.slice(1) + '\n'; } if (linewise && text.charAt(text.length - 1) !== '\n'){ text += '\n'; } // Lowercase and uppercase registers refer to the same register. // Uppercase just means append. var register = this.isValidRegister(registerName) ? this.getRegister(registerName) : null; // if no register/an invalid register was specified, things go to the // default registers if (!register) { switch (operator) { case 'yank': // The 0 register contains the text from the most recent yank. this.registers['0'] = new Register(text, linewise, blockwise); break; case 'delete': case 'change': if (text.indexOf('\n') == -1) { // Delete less than 1 line. Update the small delete register. this.registers['-'] = new Register(text, linewise); } else { // Shift down the contents of the numbered registers and put the // deleted text into register 1. this.shiftNumericRegisters_(); this.registers['1'] = new Register(text, linewise); } break; } // Make sure the unnamed register is set to what just happened this.unnamedRegister.setText(text, linewise, blockwise); return; } // If we've gotten to this point, we've actually specified a register var append = isUpperCase(registerName); if (append) { register.pushText(text, linewise); } else { register.setText(text, linewise, blockwise); } // The unnamed register always has the same value as the last used // register. this.unnamedRegister.setText(register.toString(), linewise); }, // Gets the register named @name. If one of @name doesn't already exist, // create it. If @name is invalid, return the unnamedRegister. getRegister: function(name) { if (!this.isValidRegister(name)) { return this.unnamedRegister; } name = name.toLowerCase(); if (!this.registers[name]) { this.registers[name] = new Register(); } return this.registers[name]; }, isValidRegister: function(name) { return name && inArray(name, validRegisters); }, shiftNumericRegisters_: function() { for (var i = 9; i >= 2; i--) { this.registers[i] = this.getRegister('' + (i - 1)); } } }; function HistoryController() { this.historyBuffer = []; this.iterator; this.initialPrefix = null; } HistoryController.prototype = { // the input argument here acts a user entered prefix for a small time // until we start autocompletion in which case it is the autocompleted. nextMatch: function (input, up) { var historyBuffer = this.historyBuffer; var dir = up ? -1 : 1; if (this.initialPrefix === null) this.initialPrefix = input; for (var i = this.iterator + dir; up ? i >= 0 : i < historyBuffer.length; i+= dir) { var element = historyBuffer[i]; for (var j = 0; j <= element.length; j++) { if (this.initialPrefix == element.substring(0, j)) { this.iterator = i; return element; } } } // should return the user input in case we reach the end of buffer. if (i >= historyBuffer.length) { this.iterator = historyBuffer.length; return this.initialPrefix; } // return the last autocompleted query or exCommand as it is. if (i < 0 ) return input; }, pushInput: function(input) { var index = this.historyBuffer.indexOf(input); if (index > -1) this.historyBuffer.splice(index, 1); if (input.length) this.historyBuffer.push(input); }, reset: function() { this.initialPrefix = null; this.iterator = this.historyBuffer.length; } }; var commandDispatcher = { matchCommand: function(keys, keyMap, inputState, context) { var matches = commandMatches(keys, keyMap, context, inputState); if (!matches.full && !matches.partial) { return {type: 'none'}; } else if (!matches.full && matches.partial) { return {type: 'partial'}; } var bestMatch; for (var i = 0; i < matches.full.length; i++) { var match = matches.full[i]; if (!bestMatch) { bestMatch = match; } } if (bestMatch.keys.slice(-11) == '') { inputState.selectedCharacter = lastChar(keys); } return {type: 'full', command: bestMatch}; }, processCommand: function(cm, vim, command) { vim.inputState.repeatOverride = command.repeatOverride; switch (command.type) { case 'motion': this.processMotion(cm, vim, command); break; case 'operator': this.processOperator(cm, vim, command); break; case 'operatorMotion': this.processOperatorMotion(cm, vim, command); break; case 'action': this.processAction(cm, vim, command); break; case 'search': this.processSearch(cm, vim, command); clearInputState(cm); break; case 'ex': case 'keyToEx': this.processEx(cm, vim, command); clearInputState(cm); break; default: break; } }, processMotion: function(cm, vim, command) { vim.inputState.motion = command.motion; vim.inputState.motionArgs = copyArgs(command.motionArgs); this.evalInput(cm, vim); }, processOperator: function(cm, vim, command) { var inputState = vim.inputState; if (inputState.operator) { if (inputState.operator == command.operator) { // Typing an operator twice like 'dd' makes the operator operate // linewise inputState.motion = 'expandToLine'; inputState.motionArgs = { linewise: true }; this.evalInput(cm, vim); return; } else { // 2 different operators in a row doesn't make sense. clearInputState(cm); } } inputState.operator = command.operator; inputState.operatorArgs = copyArgs(command.operatorArgs); if (vim.visualMode) { // Operating on a selection in visual mode. We don't need a motion. this.evalInput(cm, vim); } }, processOperatorMotion: function(cm, vim, command) { var visualMode = vim.visualMode; var operatorMotionArgs = copyArgs(command.operatorMotionArgs); if (operatorMotionArgs) { // Operator motions may have special behavior in visual mode. if (visualMode && operatorMotionArgs.visualLine) { vim.visualLine = true; } } this.processOperator(cm, vim, command); if (!visualMode) { this.processMotion(cm, vim, command); } }, processAction: function(cm, vim, command) { var inputState = vim.inputState; var repeat = inputState.getRepeat(); var repeatIsExplicit = !!repeat; var actionArgs = copyArgs(command.actionArgs) || {}; if (inputState.selectedCharacter) { actionArgs.selectedCharacter = inputState.selectedCharacter; } // Actions may or may not have motions and operators. Do these first. if (command.operator) { this.processOperator(cm, vim, command); } if (command.motion) { this.processMotion(cm, vim, command); } if (command.motion || command.operator) { this.evalInput(cm, vim); } actionArgs.repeat = repeat || 1; actionArgs.repeatIsExplicit = repeatIsExplicit; actionArgs.registerName = inputState.registerName; clearInputState(cm); vim.lastMotion = null; if (command.isEdit) { this.recordLastEdit(vim, inputState, command); } actions[command.action](cm, actionArgs, vim); }, processSearch: function(cm, vim, command) { if (!cm.getSearchCursor) { // Search depends on SearchCursor. return; } var forward = command.searchArgs.forward; var wholeWordOnly = command.searchArgs.wholeWordOnly; getSearchState(cm).setReversed(!forward); var promptPrefix = (forward) ? '/' : '?'; var originalQuery = getSearchState(cm).getQuery(); var originalScrollPos = cm.getScrollInfo(); function handleQuery(query, ignoreCase, smartCase) { vimGlobalState.searchHistoryController.pushInput(query); vimGlobalState.searchHistoryController.reset(); try { updateSearchQuery(cm, query, ignoreCase, smartCase); } catch (e) { showConfirm(cm, 'Invalid regex: ' + query); return; } commandDispatcher.processMotion(cm, vim, { type: 'motion', motion: 'findNext', motionArgs: { forward: true, toJumplist: command.searchArgs.toJumplist } }); } function onPromptClose(query) { cm.scrollTo(originalScrollPos.left, originalScrollPos.top); handleQuery(query, true /** ignoreCase */, true /** smartCase */); var macroModeState = vimGlobalState.macroModeState; if (macroModeState.isRecording) { logSearchQuery(macroModeState, query); } } function onPromptKeyUp(e, query, close) { var keyName = CodeMirror.keyName(e), up; if (keyName == 'Up' || keyName == 'Down') { up = keyName == 'Up' ? true : false; query = vimGlobalState.searchHistoryController.nextMatch(query, up) || ''; close(query); } else { if ( keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift') vimGlobalState.searchHistoryController.reset(); } var parsedQuery; try { parsedQuery = updateSearchQuery(cm, query, true /** ignoreCase */, true /** smartCase */); } catch (e) { // Swallow bad regexes for incremental search. } if (parsedQuery) { cm.scrollIntoView(findNext(cm, !forward, parsedQuery), 30); } else { clearSearchHighlight(cm); cm.scrollTo(originalScrollPos.left, originalScrollPos.top); } } function onPromptKeyDown(e, query, close) { var keyName = CodeMirror.keyName(e); if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[') { vimGlobalState.searchHistoryController.pushInput(query); vimGlobalState.searchHistoryController.reset(); updateSearchQuery(cm, originalQuery); clearSearchHighlight(cm); cm.scrollTo(originalScrollPos.left, originalScrollPos.top); CodeMirror.e_stop(e); close(); cm.focus(); } } switch (command.searchArgs.querySrc) { case 'prompt': var macroModeState = vimGlobalState.macroModeState; if (macroModeState.isPlaying) { var query = macroModeState.replaySearchQueries.shift(); handleQuery(query, true /** ignoreCase */, false /** smartCase */); } else { showPrompt(cm, { onClose: onPromptClose, prefix: promptPrefix, desc: searchPromptDesc, onKeyUp: onPromptKeyUp, onKeyDown: onPromptKeyDown }); } break; case 'wordUnderCursor': var word = expandWordUnderCursor(cm, false /** inclusive */, true /** forward */, false /** bigWord */, true /** noSymbol */); var isKeyword = true; if (!word) { word = expandWordUnderCursor(cm, false /** inclusive */, true /** forward */, false /** bigWord */, false /** noSymbol */); isKeyword = false; } if (!word) { return; } var query = cm.getLine(word.start.line).substring(word.start.ch, word.end.ch); if (isKeyword && wholeWordOnly) { query = '\\b' + query + '\\b'; } else { query = escapeRegex(query); } // cachedCursor is used to save the old position of the cursor // when * or # causes vim to seek for the nearest word and shift // the cursor before entering the motion. vimGlobalState.jumpList.cachedCursor = cm.getCursor(); cm.setCursor(word.start); handleQuery(query, true /** ignoreCase */, false /** smartCase */); break; } }, processEx: function(cm, vim, command) { function onPromptClose(input) { // Give the prompt some time to close so that if processCommand shows // an error, the elements don't overlap. vimGlobalState.exCommandHistoryController.pushInput(input); vimGlobalState.exCommandHistoryController.reset(); exCommandDispatcher.processCommand(cm, input); } function onPromptKeyDown(e, input, close) { var keyName = CodeMirror.keyName(e), up; if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[') { vimGlobalState.exCommandHistoryController.pushInput(input); vimGlobalState.exCommandHistoryController.reset(); CodeMirror.e_stop(e); close(); cm.focus(); } if (keyName == 'Up' || keyName == 'Down') { up = keyName == 'Up' ? true : false; input = vimGlobalState.exCommandHistoryController.nextMatch(input, up) || ''; close(input); } else { if ( keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift') vimGlobalState.exCommandHistoryController.reset(); } } if (command.type == 'keyToEx') { // Handle user defined Ex to Ex mappings exCommandDispatcher.processCommand(cm, command.exArgs.input); } else { if (vim.visualMode) { showPrompt(cm, { onClose: onPromptClose, prefix: ':', value: '\'<,\'>', onKeyDown: onPromptKeyDown}); } else { showPrompt(cm, { onClose: onPromptClose, prefix: ':', onKeyDown: onPromptKeyDown}); } } }, evalInput: function(cm, vim) { // If the motion comand is set, execute both the operator and motion. // Otherwise return. var inputState = vim.inputState; var motion = inputState.motion; var motionArgs = inputState.motionArgs || {}; var operator = inputState.operator; var operatorArgs = inputState.operatorArgs || {}; var registerName = inputState.registerName; var sel = vim.sel; // TODO: Make sure cm and vim selections are identical outside visual mode. var origHead = copyCursor(vim.visualMode ? sel.head: cm.getCursor('head')); var origAnchor = copyCursor(vim.visualMode ? sel.anchor : cm.getCursor('anchor')); var oldHead = copyCursor(origHead); var oldAnchor = copyCursor(origAnchor); var newHead, newAnchor; var repeat; if (operator) { this.recordLastEdit(vim, inputState); } if (inputState.repeatOverride !== undefined) { // If repeatOverride is specified, that takes precedence over the // input state's repeat. Used by Ex mode and can be user defined. repeat = inputState.repeatOverride; } else { repeat = inputState.getRepeat(); } if (repeat > 0 && motionArgs.explicitRepeat) { motionArgs.repeatIsExplicit = true; } else if (motionArgs.noRepeat || (!motionArgs.explicitRepeat && repeat === 0)) { repeat = 1; motionArgs.repeatIsExplicit = false; } if (inputState.selectedCharacter) { // If there is a character input, stick it in all of the arg arrays. motionArgs.selectedCharacter = operatorArgs.selectedCharacter = inputState.selectedCharacter; } motionArgs.repeat = repeat; clearInputState(cm); if (motion) { var motionResult = motions[motion](cm, origHead, motionArgs, vim); vim.lastMotion = motions[motion]; if (!motionResult) { return; } if (motionArgs.toJumplist) { var jumpList = vimGlobalState.jumpList; // if the current motion is # or *, use cachedCursor var cachedCursor = jumpList.cachedCursor; if (cachedCursor) { recordJumpPosition(cm, cachedCursor, motionResult); delete jumpList.cachedCursor; } else { recordJumpPosition(cm, origHead, motionResult); } } if (motionResult instanceof Array) { newAnchor = motionResult[0]; newHead = motionResult[1]; } else { newHead = motionResult; } // TODO: Handle null returns from motion commands better. if (!newHead) { newHead = copyCursor(origHead); } if (vim.visualMode) { if (!(vim.visualBlock && newHead.ch === Infinity)) { newHead = clipCursorToContent(cm, newHead, vim.visualBlock); } if (newAnchor) { newAnchor = clipCursorToContent(cm, newAnchor, true); } newAnchor = newAnchor || oldAnchor; sel.anchor = newAnchor; sel.head = newHead; updateCmSelection(cm); updateMark(cm, vim, '<', cursorIsBefore(newAnchor, newHead) ? newAnchor : newHead); updateMark(cm, vim, '>', cursorIsBefore(newAnchor, newHead) ? newHead : newAnchor); } else if (!operator) { newHead = clipCursorToContent(cm, newHead); cm.setCursor(newHead.line, newHead.ch); } } if (operator) { if (operatorArgs.lastSel) { // Replaying a visual mode operation newAnchor = oldAnchor; var lastSel = operatorArgs.lastSel; var lineOffset = Math.abs(lastSel.head.line - lastSel.anchor.line); var chOffset = Math.abs(lastSel.head.ch - lastSel.anchor.ch); if (lastSel.visualLine) { // Linewise Visual mode: The same number of lines. newHead = Pos(oldAnchor.line + lineOffset, oldAnchor.ch); } else if (lastSel.visualBlock) { // Blockwise Visual mode: The same number of lines and columns. newHead = Pos(oldAnchor.line + lineOffset, oldAnchor.ch + chOffset); } else if (lastSel.head.line == lastSel.anchor.line) { // Normal Visual mode within one line: The same number of characters. newHead = Pos(oldAnchor.line, oldAnchor.ch + chOffset); } else { // Normal Visual mode with several lines: The same number of lines, in the // last line the same number of characters as in the last line the last time. newHead = Pos(oldAnchor.line + lineOffset, oldAnchor.ch); } vim.visualMode = true; vim.visualLine = lastSel.visualLine; vim.visualBlock = lastSel.visualBlock; sel = vim.sel = { anchor: newAnchor, head: newHead }; updateCmSelection(cm); } else if (vim.visualMode) { operatorArgs.lastSel = { anchor: copyCursor(sel.anchor), head: copyCursor(sel.head), visualBlock: vim.visualBlock, visualLine: vim.visualLine }; } var curStart, curEnd, linewise, mode; var cmSel; if (vim.visualMode) { // Init visual op curStart = cursorMin(sel.head, sel.anchor); curEnd = cursorMax(sel.head, sel.anchor); linewise = vim.visualLine || operatorArgs.linewise; mode = vim.visualBlock ? 'block' : linewise ? 'line' : 'char'; cmSel = makeCmSelection(cm, { anchor: curStart, head: curEnd }, mode); if (linewise) { var ranges = cmSel.ranges; if (mode == 'block') { // Linewise operators in visual block mode extend to end of line for (var i = 0; i < ranges.length; i++) { ranges[i].head.ch = lineLength(cm, ranges[i].head.line); } } else if (mode == 'line') { ranges[0].head = Pos(ranges[0].head.line + 1, 0); } } } else { // Init motion op curStart = copyCursor(newAnchor || oldAnchor); curEnd = copyCursor(newHead || oldHead); if (cursorIsBefore(curEnd, curStart)) { var tmp = curStart; curStart = curEnd; curEnd = tmp; } linewise = motionArgs.linewise || operatorArgs.linewise; if (linewise) { // Expand selection to entire line. expandSelectionToLine(cm, curStart, curEnd); } else if (motionArgs.forward) { // Clip to trailing newlines only if the motion goes forward. clipToLine(cm, curStart, curEnd); } mode = 'char'; var exclusive = !motionArgs.inclusive || linewise; cmSel = makeCmSelection(cm, { anchor: curStart, head: curEnd }, mode, exclusive); } cm.setSelections(cmSel.ranges, cmSel.primary); vim.lastMotion = null; operatorArgs.repeat = repeat; // For indent in visual mode. operatorArgs.registerName = registerName; // Keep track of linewise as it affects how paste and change behave. operatorArgs.linewise = linewise; var operatorMoveTo = operators[operator]( cm, operatorArgs, cmSel.ranges, oldAnchor, newHead); if (vim.visualMode) { exitVisualMode(cm, operatorMoveTo != null); } if (operatorMoveTo) { cm.setCursor(operatorMoveTo); } } }, recordLastEdit: function(vim, inputState, actionCommand) { var macroModeState = vimGlobalState.macroModeState; if (macroModeState.isPlaying) { return; } vim.lastEditInputState = inputState; vim.lastEditActionCommand = actionCommand; macroModeState.lastInsertModeChanges.changes = []; macroModeState.lastInsertModeChanges.expectCursorActivityForChange = false; } }; /** * typedef {Object{line:number,ch:number}} Cursor An object containing the * position of the cursor. */ // All of the functions below return Cursor objects. var motions = { moveToTopLine: function(cm, _head, motionArgs) { var line = getUserVisibleLines(cm).top + motionArgs.repeat -1; return Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line))); }, moveToMiddleLine: function(cm) { var range = getUserVisibleLines(cm); var line = Math.floor((range.top + range.bottom) * 0.5); return Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line))); }, moveToBottomLine: function(cm, _head, motionArgs) { var line = getUserVisibleLines(cm).bottom - motionArgs.repeat +1; return Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line))); }, expandToLine: function(_cm, head, motionArgs) { // Expands forward to end of line, and then to next line if repeat is // >1. Does not handle backward motion! var cur = head; return Pos(cur.line + motionArgs.repeat - 1, Infinity); }, findNext: function(cm, _head, motionArgs) { var state = getSearchState(cm); var query = state.getQuery(); if (!query) { return; } var prev = !motionArgs.forward; // If search is initiated with ? instead of /, negate direction. prev = (state.isReversed()) ? !prev : prev; highlightSearchMatches(cm, query); return findNext(cm, prev/** prev */, query, motionArgs.repeat); }, goToMark: function(cm, _head, motionArgs, vim) { var mark = vim.marks[motionArgs.selectedCharacter]; if (mark) { var pos = mark.find(); return motionArgs.linewise ? { line: pos.line, ch: findFirstNonWhiteSpaceCharacter(cm.getLine(pos.line)) } : pos; } return null; }, moveToOtherHighlightedEnd: function(cm, _head, motionArgs, vim) { if (vim.visualBlock && motionArgs.sameLine) { var sel = vim.sel; return [ clipCursorToContent(cm, Pos(sel.anchor.line, sel.head.ch)), clipCursorToContent(cm, Pos(sel.head.line, sel.anchor.ch)) ]; } else { return ([vim.sel.head, vim.sel.anchor]); } }, jumpToMark: function(cm, head, motionArgs, vim) { var best = head; for (var i = 0; i < motionArgs.repeat; i++) { var cursor = best; for (var key in vim.marks) { if (!isLowerCase(key)) { continue; } var mark = vim.marks[key].find(); var isWrongDirection = (motionArgs.forward) ? cursorIsBefore(mark, cursor) : cursorIsBefore(cursor, mark); if (isWrongDirection) { continue; } if (motionArgs.linewise && (mark.line == cursor.line)) { continue; } var equal = cursorEqual(cursor, best); var between = (motionArgs.forward) ? cursorIsBetween(cursor, mark, best) : cursorIsBetween(best, mark, cursor); if (equal || between) { best = mark; } } } if (motionArgs.linewise) { // Vim places the cursor on the first non-whitespace character of // the line if there is one, else it places the cursor at the end // of the line, regardless of whether a mark was found. best = Pos(best.line, findFirstNonWhiteSpaceCharacter(cm.getLine(best.line))); } return best; }, moveByCharacters: function(_cm, head, motionArgs) { var cur = head; var repeat = motionArgs.repeat; var ch = motionArgs.forward ? cur.ch + repeat : cur.ch - repeat; return Pos(cur.line, ch); }, moveByLines: function(cm, head, motionArgs, vim) { var cur = head; var endCh = cur.ch; // Depending what our last motion was, we may want to do different // things. If our last motion was moving vertically, we want to // preserve the HPos from our last horizontal move. If our last motion // was going to the end of a line, moving vertically we should go to // the end of the line, etc. switch (vim.lastMotion) { case this.moveByLines: case this.moveByDisplayLines: case this.moveByScroll: case this.moveToColumn: case this.moveToEol: endCh = vim.lastHPos; break; default: vim.lastHPos = endCh; } var repeat = motionArgs.repeat+(motionArgs.repeatOffset||0); var line = motionArgs.forward ? cur.line + repeat : cur.line - repeat; var first = cm.firstLine(); var last = cm.lastLine(); // Vim cancels linewise motions that start on an edge and move beyond // that edge. It does not cancel motions that do not start on an edge. if ((line < first && cur.line == first) || (line > last && cur.line == last)) { return; } if (motionArgs.toFirstChar){ endCh=findFirstNonWhiteSpaceCharacter(cm.getLine(line)); vim.lastHPos = endCh; } vim.lastHSPos = cm.charCoords(Pos(line, endCh),'div').left; return Pos(line, endCh); }, moveByDisplayLines: function(cm, head, motionArgs, vim) { var cur = head; switch (vim.lastMotion) { case this.moveByDisplayLines: case this.moveByScroll: case this.moveByLines: case this.moveToColumn: case this.moveToEol: break; default: vim.lastHSPos = cm.charCoords(cur,'div').left; } var repeat = motionArgs.repeat; var res=cm.findPosV(cur,(motionArgs.forward ? repeat : -repeat),'line',vim.lastHSPos); if (res.hitSide) { if (motionArgs.forward) { var lastCharCoords = cm.charCoords(res, 'div'); var goalCoords = { top: lastCharCoords.top + 8, left: vim.lastHSPos }; var res = cm.coordsChar(goalCoords, 'div'); } else { var resCoords = cm.charCoords(Pos(cm.firstLine(), 0), 'div'); resCoords.left = vim.lastHSPos; res = cm.coordsChar(resCoords, 'div'); } } vim.lastHPos = res.ch; return res; }, moveByPage: function(cm, head, motionArgs) { // CodeMirror only exposes functions that move the cursor page down, so // doing this bad hack to move the cursor and move it back. evalInput // will move the cursor to where it should be in the end. var curStart = head; var repeat = motionArgs.repeat; return cm.findPosV(curStart, (motionArgs.forward ? repeat : -repeat), 'page'); }, moveByParagraph: function(cm, head, motionArgs) { var dir = motionArgs.forward ? 1 : -1; return findParagraph(cm, head, motionArgs.repeat, dir); }, moveByScroll: function(cm, head, motionArgs, vim) { var scrollbox = cm.getScrollInfo(); var curEnd = null; var repeat = motionArgs.repeat; if (!repeat) { repeat = scrollbox.clientHeight / (2 * cm.defaultTextHeight()); } var orig = cm.charCoords(head, 'local'); motionArgs.repeat = repeat; var curEnd = motions.moveByDisplayLines(cm, head, motionArgs, vim); if (!curEnd) { return null; } var dest = cm.charCoords(curEnd, 'local'); cm.scrollTo(null, scrollbox.top + dest.top - orig.top); return curEnd; }, moveByWords: function(cm, head, motionArgs) { return moveToWord(cm, head, motionArgs.repeat, !!motionArgs.forward, !!motionArgs.wordEnd, !!motionArgs.bigWord); }, moveTillCharacter: function(cm, _head, motionArgs) { var repeat = motionArgs.repeat; var curEnd = moveToCharacter(cm, repeat, motionArgs.forward, motionArgs.selectedCharacter); var increment = motionArgs.forward ? -1 : 1; recordLastCharacterSearch(increment, motionArgs); if (!curEnd) return null; curEnd.ch += increment; return curEnd; }, moveToCharacter: function(cm, head, motionArgs) { var repeat = motionArgs.repeat; recordLastCharacterSearch(0, motionArgs); return moveToCharacter(cm, repeat, motionArgs.forward, motionArgs.selectedCharacter) || head; }, moveToSymbol: function(cm, head, motionArgs) { var repeat = motionArgs.repeat; return findSymbol(cm, repeat, motionArgs.forward, motionArgs.selectedCharacter) || head; }, moveToColumn: function(cm, head, motionArgs, vim) { var repeat = motionArgs.repeat; // repeat is equivalent to which column we want to move to! vim.lastHPos = repeat - 1; vim.lastHSPos = cm.charCoords(head,'div').left; return moveToColumn(cm, repeat); }, moveToEol: function(cm, head, motionArgs, vim) { var cur = head; vim.lastHPos = Infinity; var retval= Pos(cur.line + motionArgs.repeat - 1, Infinity); var end=cm.clipPos(retval); end.ch--; vim.lastHSPos = cm.charCoords(end,'div').left; return retval; }, moveToFirstNonWhiteSpaceCharacter: function(cm, head) { // Go to the start of the line where the text begins, or the end for // whitespace-only lines var cursor = head; return Pos(cursor.line, findFirstNonWhiteSpaceCharacter(cm.getLine(cursor.line))); }, moveToMatchedSymbol: function(cm, head) { var cursor = head; var line = cursor.line; var ch = cursor.ch; var lineText = cm.getLine(line); var symbol; do { symbol = lineText.charAt(ch++); if (symbol && isMatchableSymbol(symbol)) { var style = cm.getTokenTypeAt(Pos(line, ch)); if (style !== "string" && style !== "comment") { break; } } } while (symbol); if (symbol) { var matched = cm.findMatchingBracket(Pos(line, ch)); return matched.to; } else { return cursor; } }, moveToStartOfLine: function(_cm, head) { return Pos(head.line, 0); }, moveToLineOrEdgeOfDocument: function(cm, _head, motionArgs) { var lineNum = motionArgs.forward ? cm.lastLine() : cm.firstLine(); if (motionArgs.repeatIsExplicit) { lineNum = motionArgs.repeat - cm.getOption('firstLineNumber'); } return Pos(lineNum, findFirstNonWhiteSpaceCharacter(cm.getLine(lineNum))); }, textObjectManipulation: function(cm, head, motionArgs, vim) { // TODO: lots of possible exceptions that can be thrown here. Try da( // outside of a () block. // TODO: adding <> >< to this map doesn't work, presumably because // they're operators var mirroredPairs = {'(': ')', ')': '(', '{': '}', '}': '{', '[': ']', ']': '['}; var selfPaired = {'\'': true, '"': true}; var character = motionArgs.selectedCharacter; // 'b' refers to '()' block. // 'B' refers to '{}' block. if (character == 'b') { character = '('; } else if (character == 'B') { character = '{'; } // Inclusive is the difference between a and i // TODO: Instead of using the additional text object map to perform text // object operations, merge the map into the defaultKeyMap and use // motionArgs to define behavior. Define separate entries for 'aw', // 'iw', 'a[', 'i[', etc. var inclusive = !motionArgs.textObjectInner; var tmp; if (mirroredPairs[character]) { tmp = selectCompanionObject(cm, head, character, inclusive); } else if (selfPaired[character]) { tmp = findBeginningAndEnd(cm, head, character, inclusive); } else if (character === 'W') { tmp = expandWordUnderCursor(cm, inclusive, true /** forward */, true /** bigWord */); } else if (character === 'w') { tmp = expandWordUnderCursor(cm, inclusive, true /** forward */, false /** bigWord */); } else if (character === 'p') { tmp = findParagraph(cm, head, motionArgs.repeat, 0, inclusive); motionArgs.linewise = true; if (vim.visualMode) { if (!vim.visualLine) { vim.visualLine = true; } } else { var operatorArgs = vim.inputState.operatorArgs; if (operatorArgs) { operatorArgs.linewise = true; } tmp.end.line--; } } else { // No text object defined for this, don't move. return null; } if (!cm.state.vim.visualMode) { return [tmp.start, tmp.end]; } else { return expandSelection(cm, tmp.start, tmp.end); } }, repeatLastCharacterSearch: function(cm, head, motionArgs) { var lastSearch = vimGlobalState.lastChararacterSearch; var repeat = motionArgs.repeat; var forward = motionArgs.forward === lastSearch.forward; var increment = (lastSearch.increment ? 1 : 0) * (forward ? -1 : 1); cm.moveH(-increment, 'char'); motionArgs.inclusive = forward ? true : false; var curEnd = moveToCharacter(cm, repeat, forward, lastSearch.selectedCharacter); if (!curEnd) { cm.moveH(increment, 'char'); return head; } curEnd.ch += increment; return curEnd; } }; function defineMotion(name, fn) { motions[name] = fn; } function fillArray(val, times) { var arr = []; for (var i = 0; i < times; i++) { arr.push(val); } return arr; } /** * An operator acts on a text selection. It receives the list of selections * as input. The corresponding CodeMirror selection is guaranteed to * match the input selection. */ var operators = { change: function(cm, args, ranges) { var finalHead, text; var vim = cm.state.vim; vimGlobalState.macroModeState.lastInsertModeChanges.inVisualBlock = vim.visualBlock; if (!vim.visualMode) { var anchor = ranges[0].anchor, head = ranges[0].head; text = cm.getRange(anchor, head); if (!isWhiteSpaceString(text)) { // Exclude trailing whitespace if the range is not all whitespace. var match = (/\s+$/).exec(text); if (match) { head = offsetCursor(head, 0, - match[0].length); text = text.slice(0, - match[0].length); } } var wasLastLine = head.line - 1 == cm.lastLine(); cm.replaceRange('', anchor, head); if (args.linewise && !wasLastLine) { // Push the next line back down, if there is a next line. CodeMirror.commands.newlineAndIndent(cm); // null ch so setCursor moves to end of line. anchor.ch = null; } finalHead = anchor; } else { text = cm.getSelection(); var replacement = fillArray('', ranges.length); cm.replaceSelections(replacement); finalHead = cursorMin(ranges[0].head, ranges[0].anchor); } vimGlobalState.registerController.pushText( args.registerName, 'change', text, args.linewise, ranges.length > 1); actions.enterInsertMode(cm, {head: finalHead}, cm.state.vim); }, // delete is a javascript keyword. 'delete': function(cm, args, ranges) { var finalHead, text; var vim = cm.state.vim; if (!vim.visualBlock) { var anchor = ranges[0].anchor, head = ranges[0].head; if (args.linewise && head.line != cm.firstLine() && anchor.line == cm.lastLine() && anchor.line == head.line - 1) { // Special case for dd on last line (and first line). if (anchor.line == cm.firstLine()) { anchor.ch = 0; } else { anchor = Pos(anchor.line - 1, lineLength(cm, anchor.line - 1)); } } text = cm.getRange(anchor, head); cm.replaceRange('', anchor, head); finalHead = anchor; if (args.linewise) { finalHead = motions.moveToFirstNonWhiteSpaceCharacter(cm, anchor); } } else { text = cm.getSelection(); var replacement = fillArray('', ranges.length); cm.replaceSelections(replacement); finalHead = ranges[0].anchor; } vimGlobalState.registerController.pushText( args.registerName, 'delete', text, args.linewise, vim.visualBlock); return clipCursorToContent(cm, finalHead); }, indent: function(cm, args, ranges) { var vim = cm.state.vim; var startLine = ranges[0].anchor.line; var endLine = vim.visualBlock ? ranges[ranges.length - 1].anchor.line : ranges[0].head.line; // In visual mode, n> shifts the selection right n times, instead of // shifting n lines right once. var repeat = (vim.visualMode) ? args.repeat : 1; if (args.linewise) { // The only way to delete a newline is to delete until the start of // the next line, so in linewise mode evalInput will include the next // line. We don't want this in indent, so we go back a line. endLine--; } for (var i = startLine; i <= endLine; i++) { for (var j = 0; j < repeat; j++) { cm.indentLine(i, args.indentRight); } } return motions.moveToFirstNonWhiteSpaceCharacter(cm, ranges[0].anchor); }, changeCase: function(cm, args, ranges, oldAnchor, newHead) { var selections = cm.getSelections(); var swapped = []; var toLower = args.toLower; for (var j = 0; j < selections.length; j++) { var toSwap = selections[j]; var text = ''; if (toLower === true) { text = toSwap.toLowerCase(); } else if (toLower === false) { text = toSwap.toUpperCase(); } else { for (var i = 0; i < toSwap.length; i++) { var character = toSwap.charAt(i); text += isUpperCase(character) ? character.toLowerCase() : character.toUpperCase(); } } swapped.push(text); } cm.replaceSelections(swapped); if (args.shouldMoveCursor){ return newHead; } else if (!cm.state.vim.visualMode && args.linewise && ranges[0].anchor.line + 1 == ranges[0].head.line) { return motions.moveToFirstNonWhiteSpaceCharacter(cm, oldAnchor); } else if (args.linewise){ return oldAnchor; } else { return cursorMin(ranges[0].anchor, ranges[0].head); } }, yank: function(cm, args, ranges, oldAnchor) { var vim = cm.state.vim; var text = cm.getSelection(); var endPos = vim.visualMode ? cursorMin(vim.sel.anchor, vim.sel.head, ranges[0].head, ranges[0].anchor) : oldAnchor; vimGlobalState.registerController.pushText( args.registerName, 'yank', text, args.linewise, vim.visualBlock); return endPos; } }; function defineOperator(name, fn) { operators[name] = fn; } var actions = { jumpListWalk: function(cm, actionArgs, vim) { if (vim.visualMode) { return; } var repeat = actionArgs.repeat; var forward = actionArgs.forward; var jumpList = vimGlobalState.jumpList; var mark = jumpList.move(cm, forward ? repeat : -repeat); var markPos = mark ? mark.find() : undefined; markPos = markPos ? markPos : cm.getCursor(); cm.setCursor(markPos); }, scroll: function(cm, actionArgs, vim) { if (vim.visualMode) { return; } var repeat = actionArgs.repeat || 1; var lineHeight = cm.defaultTextHeight(); var top = cm.getScrollInfo().top; var delta = lineHeight * repeat; var newPos = actionArgs.forward ? top + delta : top - delta; var cursor = copyCursor(cm.getCursor()); var cursorCoords = cm.charCoords(cursor, 'local'); if (actionArgs.forward) { if (newPos > cursorCoords.top) { cursor.line += (newPos - cursorCoords.top) / lineHeight; cursor.line = Math.ceil(cursor.line); cm.setCursor(cursor); cursorCoords = cm.charCoords(cursor, 'local'); cm.scrollTo(null, cursorCoords.top); } else { // Cursor stays within bounds. Just reposition the scroll window. cm.scrollTo(null, newPos); } } else { var newBottom = newPos + cm.getScrollInfo().clientHeight; if (newBottom < cursorCoords.bottom) { cursor.line -= (cursorCoords.bottom - newBottom) / lineHeight; cursor.line = Math.floor(cursor.line); cm.setCursor(cursor); cursorCoords = cm.charCoords(cursor, 'local'); cm.scrollTo( null, cursorCoords.bottom - cm.getScrollInfo().clientHeight); } else { // Cursor stays within bounds. Just reposition the scroll window. cm.scrollTo(null, newPos); } } }, scrollToCursor: function(cm, actionArgs) { var lineNum = cm.getCursor().line; var charCoords = cm.charCoords(Pos(lineNum, 0), 'local'); var height = cm.getScrollInfo().clientHeight; var y = charCoords.top; var lineHeight = charCoords.bottom - y; switch (actionArgs.position) { case 'center': y = y - (height / 2) + lineHeight; break; case 'bottom': y = y - height + lineHeight*1.4; break; case 'top': y = y + lineHeight*0.4; break; } cm.scrollTo(null, y); }, replayMacro: function(cm, actionArgs, vim) { var registerName = actionArgs.selectedCharacter; var repeat = actionArgs.repeat; var macroModeState = vimGlobalState.macroModeState; if (registerName == '@') { registerName = macroModeState.latestRegister; } while(repeat--){ executeMacroRegister(cm, vim, macroModeState, registerName); } }, enterMacroRecordMode: function(cm, actionArgs) { var macroModeState = vimGlobalState.macroModeState; var registerName = actionArgs.selectedCharacter; macroModeState.enterMacroRecordMode(cm, registerName); }, enterInsertMode: function(cm, actionArgs, vim) { if (cm.getOption('readOnly')) { return; } vim.insertMode = true; vim.insertModeRepeat = actionArgs && actionArgs.repeat || 1; var insertAt = (actionArgs) ? actionArgs.insertAt : null; var sel = vim.sel; var head = actionArgs.head || cm.getCursor('head'); var height = cm.listSelections().length; if (insertAt == 'eol') { head = Pos(head.line, lineLength(cm, head.line)); } else if (insertAt == 'charAfter') { head = offsetCursor(head, 0, 1); } else if (insertAt == 'firstNonBlank') { head = motions.moveToFirstNonWhiteSpaceCharacter(cm, head); } else if (insertAt == 'startOfSelectedArea') { if (!vim.visualBlock) { if (sel.head.line < sel.anchor.line) { head = sel.head; } else { head = Pos(sel.anchor.line, 0); } } else { head = Pos( Math.min(sel.head.line, sel.anchor.line), Math.min(sel.head.ch, sel.anchor.ch)); height = Math.abs(sel.head.line - sel.anchor.line) + 1; } } else if (insertAt == 'endOfSelectedArea') { if (!vim.visualBlock) { if (sel.head.line >= sel.anchor.line) { head = offsetCursor(sel.head, 0, 1); } else { head = Pos(sel.anchor.line, 0); } } else { head = Pos( Math.min(sel.head.line, sel.anchor.line), Math.max(sel.head.ch + 1, sel.anchor.ch)); height = Math.abs(sel.head.line - sel.anchor.line) + 1; } } else if (insertAt == 'inplace') { if (vim.visualMode){ return; } } cm.setOption('keyMap', 'vim-insert'); cm.setOption('disableInput', false); if (actionArgs && actionArgs.replace) { // Handle Replace-mode as a special case of insert mode. cm.toggleOverwrite(true); cm.setOption('keyMap', 'vim-replace'); CodeMirror.signal(cm, "vim-mode-change", {mode: "replace"}); } else { cm.setOption('keyMap', 'vim-insert'); CodeMirror.signal(cm, "vim-mode-change", {mode: "insert"}); } if (!vimGlobalState.macroModeState.isPlaying) { // Only record if not replaying. cm.on('change', onChange); CodeMirror.on(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown); } if (vim.visualMode) { exitVisualMode(cm); } selectForInsert(cm, head, height); }, toggleVisualMode: function(cm, actionArgs, vim) { var repeat = actionArgs.repeat; var anchor = cm.getCursor(); var head; // TODO: The repeat should actually select number of characters/lines // equal to the repeat times the size of the previous visual // operation. if (!vim.visualMode) { // Entering visual mode vim.visualMode = true; vim.visualLine = !!actionArgs.linewise; vim.visualBlock = !!actionArgs.blockwise; head = clipCursorToContent( cm, Pos(anchor.line, anchor.ch + repeat - 1), true /** includeLineBreak */); vim.sel = { anchor: anchor, head: head }; CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: vim.visualLine ? "linewise" : vim.visualBlock ? "blockwise" : ""}); updateCmSelection(cm); updateMark(cm, vim, '<', cursorMin(anchor, head)); updateMark(cm, vim, '>', cursorMax(anchor, head)); } else if (vim.visualLine ^ actionArgs.linewise || vim.visualBlock ^ actionArgs.blockwise) { // Toggling between modes vim.visualLine = !!actionArgs.linewise; vim.visualBlock = !!actionArgs.blockwise; CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: vim.visualLine ? "linewise" : vim.visualBlock ? "blockwise" : ""}); updateCmSelection(cm); } else { exitVisualMode(cm); } }, reselectLastSelection: function(cm, _actionArgs, vim) { var lastSelection = vim.lastSelection; if (vim.visualMode) { updateLastSelection(cm, vim); } if (lastSelection) { var anchor = lastSelection.anchorMark.find(); var head = lastSelection.headMark.find(); if (!anchor || !head) { // If the marks have been destroyed due to edits, do nothing. return; } vim.sel = { anchor: anchor, head: head }; vim.visualMode = true; vim.visualLine = lastSelection.visualLine; vim.visualBlock = lastSelection.visualBlock; updateCmSelection(cm); updateMark(cm, vim, '<', cursorMin(anchor, head)); updateMark(cm, vim, '>', cursorMax(anchor, head)); CodeMirror.signal(cm, 'vim-mode-change', { mode: 'visual', subMode: vim.visualLine ? 'linewise' : vim.visualBlock ? 'blockwise' : ''}); } }, joinLines: function(cm, actionArgs, vim) { var curStart, curEnd; if (vim.visualMode) { curStart = cm.getCursor('anchor'); curEnd = cm.getCursor('head'); if (cursorIsBefore(curEnd, curStart)) { var tmp = curEnd; curEnd = curStart; curStart = tmp; } curEnd.ch = lineLength(cm, curEnd.line) - 1; } else { // Repeat is the number of lines to join. Minimum 2 lines. var repeat = Math.max(actionArgs.repeat, 2); curStart = cm.getCursor(); curEnd = clipCursorToContent(cm, Pos(curStart.line + repeat - 1, Infinity)); } var finalCh = 0; for (var i = curStart.line; i < curEnd.line; i++) { finalCh = lineLength(cm, curStart.line); var tmp = Pos(curStart.line + 1, lineLength(cm, curStart.line + 1)); var text = cm.getRange(curStart, tmp); text = text.replace(/\n\s*/g, ' '); cm.replaceRange(text, curStart, tmp); } var curFinalPos = Pos(curStart.line, finalCh); if (vim.visualMode) { exitVisualMode(cm, false); } cm.setCursor(curFinalPos); }, newLineAndEnterInsertMode: function(cm, actionArgs, vim) { vim.insertMode = true; var insertAt = copyCursor(cm.getCursor()); if (insertAt.line === cm.firstLine() && !actionArgs.after) { // Special case for inserting newline before start of document. cm.replaceRange('\n', Pos(cm.firstLine(), 0)); cm.setCursor(cm.firstLine(), 0); } else { insertAt.line = (actionArgs.after) ? insertAt.line : insertAt.line - 1; insertAt.ch = lineLength(cm, insertAt.line); cm.setCursor(insertAt); var newlineFn = CodeMirror.commands.newlineAndIndentContinueComment || CodeMirror.commands.newlineAndIndent; newlineFn(cm); } this.enterInsertMode(cm, { repeat: actionArgs.repeat }, vim); }, paste: function(cm, actionArgs, vim) { var cur = copyCursor(cm.getCursor()); var register = vimGlobalState.registerController.getRegister( actionArgs.registerName); var text = register.toString(); if (!text) { return; } if (actionArgs.matchIndent) { var tabSize = cm.getOption("tabSize"); // length that considers tabs and tabSize var whitespaceLength = function(str) { var tabs = (str.split("\t").length - 1); var spaces = (str.split(" ").length - 1); return tabs * tabSize + spaces * 1; }; var currentLine = cm.getLine(cm.getCursor().line); var indent = whitespaceLength(currentLine.match(/^\s*/)[0]); // chomp last newline b/c don't want it to match /^\s*/gm var chompedText = text.replace(/\n$/, ''); var wasChomped = text !== chompedText; var firstIndent = whitespaceLength(text.match(/^\s*/)[0]); var text = chompedText.replace(/^\s*/gm, function(wspace) { var newIndent = indent + (whitespaceLength(wspace) - firstIndent); if (newIndent < 0) { return ""; } else if (cm.getOption("indentWithTabs")) { var quotient = Math.floor(newIndent / tabSize); return Array(quotient + 1).join('\t'); } else { return Array(newIndent + 1).join(' '); } }); text += wasChomped ? "\n" : ""; } if (actionArgs.repeat > 1) { var text = Array(actionArgs.repeat + 1).join(text); } var linewise = register.linewise; var blockwise = register.blockwise; if (linewise) { if(vim.visualMode) { text = vim.visualLine ? text.slice(0, -1) : '\n' + text.slice(0, text.length - 1) + '\n'; } else if (actionArgs.after) { // Move the newline at the end to the start instead, and paste just // before the newline character of the line we are on right now. text = '\n' + text.slice(0, text.length - 1); cur.ch = lineLength(cm, cur.line); } else { cur.ch = 0; } } else { if (blockwise) { text = text.split('\n'); for (var i = 0; i < text.length; i++) { text[i] = (text[i] == '') ? ' ' : text[i]; } } cur.ch += actionArgs.after ? 1 : 0; } var curPosFinal; var idx; if (vim.visualMode) { // save the pasted text for reselection if the need arises vim.lastPastedText = text; var lastSelectionCurEnd; var selectedArea = getSelectedAreaRange(cm, vim); var selectionStart = selectedArea[0]; var selectionEnd = selectedArea[1]; var selectedText = cm.getSelection(); var selections = cm.listSelections(); var emptyStrings = new Array(selections.length).join('1').split('1'); // save the curEnd marker before it get cleared due to cm.replaceRange. if (vim.lastSelection) { lastSelectionCurEnd = vim.lastSelection.headMark.find(); } // push the previously selected text to unnamed register vimGlobalState.registerController.unnamedRegister.setText(selectedText); if (blockwise) { // first delete the selected text cm.replaceSelections(emptyStrings); // Set new selections as per the block length of the yanked text selectionEnd = Pos(selectionStart.line + text.length-1, selectionStart.ch); cm.setCursor(selectionStart); selectBlock(cm, selectionEnd); cm.replaceSelections(text); curPosFinal = selectionStart; } else if (vim.visualBlock) { cm.replaceSelections(emptyStrings); cm.setCursor(selectionStart); cm.replaceRange(text, selectionStart, selectionStart); curPosFinal = selectionStart; } else { cm.replaceRange(text, selectionStart, selectionEnd); curPosFinal = cm.posFromIndex(cm.indexFromPos(selectionStart) + text.length - 1); } // restore the the curEnd marker if(lastSelectionCurEnd) { vim.lastSelection.headMark = cm.setBookmark(lastSelectionCurEnd); } if (linewise) { curPosFinal.ch=0; } } else { if (blockwise) { cm.setCursor(cur); for (var i = 0; i < text.length; i++) { var line = cur.line+i; if (line > cm.lastLine()) { cm.replaceRange('\n', Pos(line, 0)); } var lastCh = lineLength(cm, line); if (lastCh < cur.ch) { extendLineToColumn(cm, line, cur.ch); } } cm.setCursor(cur); selectBlock(cm, Pos(cur.line + text.length-1, cur.ch)); cm.replaceSelections(text); curPosFinal = cur; } else { cm.replaceRange(text, cur); // Now fine tune the cursor to where we want it. if (linewise && actionArgs.after) { curPosFinal = Pos( cur.line + 1, findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line + 1))); } else if (linewise && !actionArgs.after) { curPosFinal = Pos( cur.line, findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line))); } else if (!linewise && actionArgs.after) { idx = cm.indexFromPos(cur); curPosFinal = cm.posFromIndex(idx + text.length - 1); } else { idx = cm.indexFromPos(cur); curPosFinal = cm.posFromIndex(idx + text.length); } } } if (vim.visualMode) { exitVisualMode(cm, false); } cm.setCursor(curPosFinal); }, undo: function(cm, actionArgs) { cm.operation(function() { repeatFn(cm, CodeMirror.commands.undo, actionArgs.repeat)(); cm.setCursor(cm.getCursor('anchor')); }); }, redo: function(cm, actionArgs) { repeatFn(cm, CodeMirror.commands.redo, actionArgs.repeat)(); }, setRegister: function(_cm, actionArgs, vim) { vim.inputState.registerName = actionArgs.selectedCharacter; }, setMark: function(cm, actionArgs, vim) { var markName = actionArgs.selectedCharacter; updateMark(cm, vim, markName, cm.getCursor()); }, replace: function(cm, actionArgs, vim) { var replaceWith = actionArgs.selectedCharacter; var curStart = cm.getCursor(); var replaceTo; var curEnd; var selections = cm.listSelections(); if (vim.visualMode) { curStart = cm.getCursor('start'); curEnd = cm.getCursor('end'); } else { var line = cm.getLine(curStart.line); replaceTo = curStart.ch + actionArgs.repeat; if (replaceTo > line.length) { replaceTo=line.length; } curEnd = Pos(curStart.line, replaceTo); } if (replaceWith=='\n') { if (!vim.visualMode) cm.replaceRange('', curStart, curEnd); // special case, where vim help says to replace by just one line-break (CodeMirror.commands.newlineAndIndentContinueComment || CodeMirror.commands.newlineAndIndent)(cm); } else { var replaceWithStr = cm.getRange(curStart, curEnd); //replace all characters in range by selected, but keep linebreaks replaceWithStr = replaceWithStr.replace(/[^\n]/g, replaceWith); if (vim.visualBlock) { // Tabs are split in visua block before replacing var spaces = new Array(cm.getOption("tabSize")+1).join(' '); replaceWithStr = cm.getSelection(); replaceWithStr = replaceWithStr.replace(/\t/g, spaces).replace(/[^\n]/g, replaceWith).split('\n'); cm.replaceSelections(replaceWithStr); } else { cm.replaceRange(replaceWithStr, curStart, curEnd); } if (vim.visualMode) { curStart = cursorIsBefore(selections[0].anchor, selections[0].head) ? selections[0].anchor : selections[0].head; cm.setCursor(curStart); exitVisualMode(cm, false); } else { cm.setCursor(offsetCursor(curEnd, 0, -1)); } } }, incrementNumberToken: function(cm, actionArgs) { var cur = cm.getCursor(); var lineStr = cm.getLine(cur.line); var re = /-?\d+/g; var match; var start; var end; var numberStr; var token; while ((match = re.exec(lineStr)) !== null) { token = match[0]; start = match.index; end = start + token.length; if (cur.ch < end)break; } if (!actionArgs.backtrack && (end <= cur.ch))return; if (token) { var increment = actionArgs.increase ? 1 : -1; var number = parseInt(token) + (increment * actionArgs.repeat); var from = Pos(cur.line, start); var to = Pos(cur.line, end); numberStr = number.toString(); cm.replaceRange(numberStr, from, to); } else { return; } cm.setCursor(Pos(cur.line, start + numberStr.length - 1)); }, repeatLastEdit: function(cm, actionArgs, vim) { var lastEditInputState = vim.lastEditInputState; if (!lastEditInputState) { return; } var repeat = actionArgs.repeat; if (repeat && actionArgs.repeatIsExplicit) { vim.lastEditInputState.repeatOverride = repeat; } else { repeat = vim.lastEditInputState.repeatOverride || repeat; } repeatLastEdit(cm, vim, repeat, false /** repeatForInsert */); }, exitInsertMode: exitInsertMode }; function defineAction(name, fn) { actions[name] = fn; } /* * Below are miscellaneous utility functions used by vim.js */ /** * Clips cursor to ensure that line is within the buffer's range * If includeLineBreak is true, then allow cur.ch == lineLength. */ function clipCursorToContent(cm, cur, includeLineBreak) { var line = Math.min(Math.max(cm.firstLine(), cur.line), cm.lastLine() ); var maxCh = lineLength(cm, line) - 1; maxCh = (includeLineBreak) ? maxCh + 1 : maxCh; var ch = Math.min(Math.max(0, cur.ch), maxCh); return Pos(line, ch); } function copyArgs(args) { var ret = {}; for (var prop in args) { if (args.hasOwnProperty(prop)) { ret[prop] = args[prop]; } } return ret; } function offsetCursor(cur, offsetLine, offsetCh) { if (typeof offsetLine === 'object') { offsetCh = offsetLine.ch; offsetLine = offsetLine.line; } return Pos(cur.line + offsetLine, cur.ch + offsetCh); } function getOffset(anchor, head) { return { line: head.line - anchor.line, ch: head.line - anchor.line }; } function commandMatches(keys, keyMap, context, inputState) { // Partial matches are not applied. They inform the key handler // that the current key sequence is a subsequence of a valid key // sequence, so that the key buffer is not cleared. var match, partial = [], full = []; for (var i = 0; i < keyMap.length; i++) { var command = keyMap[i]; if (context == 'insert' && command.context != 'insert' || command.context && command.context != context || inputState.operator && command.type == 'action' || !(match = commandMatch(keys, command.keys))) { continue; } if (match == 'partial') { partial.push(command); } if (match == 'full') { full.push(command); } } return { partial: partial.length && partial, full: full.length && full }; } function commandMatch(pressed, mapped) { if (mapped.slice(-11) == '') { // Last character matches anything. var prefixLen = mapped.length - 11; var pressedPrefix = pressed.slice(0, prefixLen); var mappedPrefix = mapped.slice(0, prefixLen); return pressedPrefix == mappedPrefix && pressed.length > prefixLen ? 'full' : mappedPrefix.indexOf(pressedPrefix) == 0 ? 'partial' : false; } else { return pressed == mapped ? 'full' : mapped.indexOf(pressed) == 0 ? 'partial' : false; } } function lastChar(keys) { var match = /^.*(<[\w\-]+>)$/.exec(keys); var selectedCharacter = match ? match[1] : keys.slice(-1); if (selectedCharacter.length > 1){ switch(selectedCharacter){ case '': selectedCharacter='\n'; break; case '': selectedCharacter=' '; break; default: break; } } return selectedCharacter; } function repeatFn(cm, fn, repeat) { return function() { for (var i = 0; i < repeat; i++) { fn(cm); } }; } function copyCursor(cur) { return Pos(cur.line, cur.ch); } function cursorEqual(cur1, cur2) { return cur1.ch == cur2.ch && cur1.line == cur2.line; } function cursorIsBefore(cur1, cur2) { if (cur1.line < cur2.line) { return true; } if (cur1.line == cur2.line && cur1.ch < cur2.ch) { return true; } return false; } function cursorMin(cur1, cur2) { if (arguments.length > 2) { cur2 = cursorMin.apply(undefined, Array.prototype.slice.call(arguments, 1)); } return cursorIsBefore(cur1, cur2) ? cur1 : cur2; } function cursorMax(cur1, cur2) { if (arguments.length > 2) { cur2 = cursorMax.apply(undefined, Array.prototype.slice.call(arguments, 1)); } return cursorIsBefore(cur1, cur2) ? cur2 : cur1; } function cursorIsBetween(cur1, cur2, cur3) { // returns true if cur2 is between cur1 and cur3. var cur1before2 = cursorIsBefore(cur1, cur2); var cur2before3 = cursorIsBefore(cur2, cur3); return cur1before2 && cur2before3; } function lineLength(cm, lineNum) { return cm.getLine(lineNum).length; } function reverse(s){ return s.split('').reverse().join(''); } function trim(s) { if (s.trim) { return s.trim(); } return s.replace(/^\s+|\s+$/g, ''); } function escapeRegex(s) { return s.replace(/([.?*+$\[\]\/\\(){}|\-])/g, '\\$1'); } function extendLineToColumn(cm, lineNum, column) { var endCh = lineLength(cm, lineNum); var spaces = new Array(column-endCh+1).join(' '); cm.setCursor(Pos(lineNum, endCh)); cm.replaceRange(spaces, cm.getCursor()); } // This functions selects a rectangular block // of text with selectionEnd as any of its corner // Height of block: // Difference in selectionEnd.line and first/last selection.line // Width of the block: // Distance between selectionEnd.ch and any(first considered here) selection.ch function selectBlock(cm, selectionEnd) { var selections = [], ranges = cm.listSelections(); var head = copyCursor(cm.clipPos(selectionEnd)); var isClipped = !cursorEqual(selectionEnd, head); var curHead = cm.getCursor('head'); var primIndex = getIndex(ranges, curHead); var wasClipped = cursorEqual(ranges[primIndex].head, ranges[primIndex].anchor); var max = ranges.length - 1; var index = max - primIndex > primIndex ? max : 0; var base = ranges[index].anchor; var firstLine = Math.min(base.line, head.line); var lastLine = Math.max(base.line, head.line); var baseCh = base.ch, headCh = head.ch; var dir = ranges[index].head.ch - baseCh; var newDir = headCh - baseCh; if (dir > 0 && newDir <= 0) { baseCh++; if (!isClipped) { headCh--; } } else if (dir < 0 && newDir >= 0) { baseCh--; if (!wasClipped) { headCh++; } } else if (dir < 0 && newDir == -1) { baseCh--; headCh++; } for (var line = firstLine; line <= lastLine; line++) { var range = {anchor: new Pos(line, baseCh), head: new Pos(line, headCh)}; selections.push(range); } primIndex = head.line == lastLine ? selections.length - 1 : 0; cm.setSelections(selections); selectionEnd.ch = headCh; base.ch = baseCh; return base; } function selectForInsert(cm, head, height) { var sel = []; for (var i = 0; i < height; i++) { var lineHead = offsetCursor(head, i, 0); sel.push({anchor: lineHead, head: lineHead}); } cm.setSelections(sel, 0); } // getIndex returns the index of the cursor in the selections. function getIndex(ranges, cursor, end) { for (var i = 0; i < ranges.length; i++) { var atAnchor = end != 'head' && cursorEqual(ranges[i].anchor, cursor); var atHead = end != 'anchor' && cursorEqual(ranges[i].head, cursor); if (atAnchor || atHead) { return i; } } return -1; } function getSelectedAreaRange(cm, vim) { var lastSelection = vim.lastSelection; var getCurrentSelectedAreaRange = function() { var selections = cm.listSelections(); var start = selections[0]; var end = selections[selections.length-1]; var selectionStart = cursorIsBefore(start.anchor, start.head) ? start.anchor : start.head; var selectionEnd = cursorIsBefore(end.anchor, end.head) ? end.head : end.anchor; return [selectionStart, selectionEnd]; }; var getLastSelectedAreaRange = function() { var selectionStart = cm.getCursor(); var selectionEnd = cm.getCursor(); var block = lastSelection.visualBlock; if (block) { var width = block.width; var height = block.height; selectionEnd = Pos(selectionStart.line + height, selectionStart.ch + width); var selections = []; // selectBlock creates a 'proper' rectangular block. // We do not want that in all cases, so we manually set selections. for (var i = selectionStart.line; i < selectionEnd.line; i++) { var anchor = Pos(i, selectionStart.ch); var head = Pos(i, selectionEnd.ch); var range = {anchor: anchor, head: head}; selections.push(range); } cm.setSelections(selections); } else { var start = lastSelection.anchorMark.find(); var end = lastSelection.headMark.find(); var line = end.line - start.line; var ch = end.ch - start.ch; selectionEnd = {line: selectionEnd.line + line, ch: line ? selectionEnd.ch : ch + selectionEnd.ch}; if (lastSelection.visualLine) { selectionStart = Pos(selectionStart.line, 0); selectionEnd = Pos(selectionEnd.line, lineLength(cm, selectionEnd.line)); } cm.setSelection(selectionStart, selectionEnd); } return [selectionStart, selectionEnd]; }; if (!vim.visualMode) { // In case of replaying the action. return getLastSelectedAreaRange(); } else { return getCurrentSelectedAreaRange(); } } // Updates the previous selection with the current selection's values. This // should only be called in visual mode. function updateLastSelection(cm, vim) { var anchor = vim.sel.anchor; var head = vim.sel.head; // To accommodate the effect of lastPastedText in the last selection if (vim.lastPastedText) { head = cm.posFromIndex(cm.indexFromPos(anchor) + vim.lastPastedText.length); vim.lastPastedText = null; } vim.lastSelection = {'anchorMark': cm.setBookmark(anchor), 'headMark': cm.setBookmark(head), 'anchor': copyCursor(anchor), 'head': copyCursor(head), 'visualMode': vim.visualMode, 'visualLine': vim.visualLine, 'visualBlock': vim.visualBlock}; } function expandSelection(cm, start, end) { var sel = cm.state.vim.sel; var head = sel.head; var anchor = sel.anchor; var tmp; if (cursorIsBefore(end, start)) { tmp = end; end = start; start = tmp; } if (cursorIsBefore(head, anchor)) { head = cursorMin(start, head); anchor = cursorMax(anchor, end); } else { anchor = cursorMin(start, anchor); head = cursorMax(head, end); head = offsetCursor(head, 0, -1); if (head.ch == -1 && head.line != cm.firstLine()) { head = Pos(head.line - 1, lineLength(cm, head.line - 1)); } } return [anchor, head]; } /** * Updates the CodeMirror selection to match the provided vim selection. * If no arguments are given, it uses the current vim selection state. */ function updateCmSelection(cm, sel, mode) { var vim = cm.state.vim; sel = sel || vim.sel; var mode = mode || vim.visualLine ? 'line' : vim.visualBlock ? 'block' : 'char'; var cmSel = makeCmSelection(cm, sel, mode); cm.setSelections(cmSel.ranges, cmSel.primary); updateFakeCursor(cm); } function makeCmSelection(cm, sel, mode, exclusive) { var head = copyCursor(sel.head); var anchor = copyCursor(sel.anchor); if (mode == 'char') { var headOffset = !exclusive && !cursorIsBefore(sel.head, sel.anchor) ? 1 : 0; var anchorOffset = cursorIsBefore(sel.head, sel.anchor) ? 1 : 0; head = offsetCursor(sel.head, 0, headOffset); anchor = offsetCursor(sel.anchor, 0, anchorOffset); return { ranges: [{anchor: anchor, head: head}], primary: 0 }; } else if (mode == 'line') { if (!cursorIsBefore(sel.head, sel.anchor)) { anchor.ch = 0; var lastLine = cm.lastLine(); if (head.line > lastLine) { head.line = lastLine; } head.ch = lineLength(cm, head.line); } else { head.ch = 0; anchor.ch = lineLength(cm, anchor.line); } return { ranges: [{anchor: anchor, head: head}], primary: 0 }; } else if (mode == 'block') { var top = Math.min(anchor.line, head.line), left = Math.min(anchor.ch, head.ch), bottom = Math.max(anchor.line, head.line), right = Math.max(anchor.ch, head.ch) + 1; var height = bottom - top + 1; var primary = head.line == top ? 0 : height - 1; var ranges = []; for (var i = 0; i < height; i++) { ranges.push({ anchor: Pos(top + i, left), head: Pos(top + i, right) }); } return { ranges: ranges, primary: primary }; } } function getHead(cm) { var cur = cm.getCursor('head'); if (cm.getSelection().length == 1) { // Small corner case when only 1 character is selected. The "real" // head is the left of head and anchor. cur = cursorMin(cur, cm.getCursor('anchor')); } return cur; } /** * If moveHead is set to false, the CodeMirror selection will not be * touched. The caller assumes the responsibility of putting the cursor * in the right place. */ function exitVisualMode(cm, moveHead) { var vim = cm.state.vim; if (moveHead !== false) { cm.setCursor(clipCursorToContent(cm, vim.sel.head)); } updateLastSelection(cm, vim); vim.visualMode = false; vim.visualLine = false; vim.visualBlock = false; CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"}); if (vim.fakeCursor) { vim.fakeCursor.clear(); } } // Remove any trailing newlines from the selection. For // example, with the caret at the start of the last word on the line, // 'dw' should word, but not the newline, while 'w' should advance the // caret to the first character of the next line. function clipToLine(cm, curStart, curEnd) { var selection = cm.getRange(curStart, curEnd); // Only clip if the selection ends with trailing newline + whitespace if (/\n\s*$/.test(selection)) { var lines = selection.split('\n'); // We know this is all whitepsace. lines.pop(); // Cases: // 1. Last word is an empty line - do not clip the trailing '\n' // 2. Last word is not an empty line - clip the trailing '\n' var line; // Find the line containing the last word, and clip all whitespace up // to it. for (var line = lines.pop(); lines.length > 0 && line && isWhiteSpaceString(line); line = lines.pop()) { curEnd.line--; curEnd.ch = 0; } // If the last word is not an empty line, clip an additional newline if (line) { curEnd.line--; curEnd.ch = lineLength(cm, curEnd.line); } else { curEnd.ch = 0; } } } // Expand the selection to line ends. function expandSelectionToLine(_cm, curStart, curEnd) { curStart.ch = 0; curEnd.ch = 0; curEnd.line++; } function findFirstNonWhiteSpaceCharacter(text) { if (!text) { return 0; } var firstNonWS = text.search(/\S/); return firstNonWS == -1 ? text.length : firstNonWS; } function expandWordUnderCursor(cm, inclusive, _forward, bigWord, noSymbol) { var cur = getHead(cm); var line = cm.getLine(cur.line); var idx = cur.ch; // Seek to first word or non-whitespace character, depending on if // noSymbol is true. var textAfterIdx = line.substring(idx); var firstMatchedChar; if (noSymbol) { firstMatchedChar = textAfterIdx.search(/\w/); } else { firstMatchedChar = textAfterIdx.search(/\S/); } if (firstMatchedChar == -1) { return null; } idx += firstMatchedChar; textAfterIdx = line.substring(idx); var textBeforeIdx = line.substring(0, idx); var matchRegex; // Greedy matchers for the "word" we are trying to expand. if (bigWord) { matchRegex = /^\S+/; } else { if ((/\w/).test(line.charAt(idx))) { matchRegex = /^\w+/; } else { matchRegex = /^[^\w\s]+/; } } var wordAfterRegex = matchRegex.exec(textAfterIdx); var wordStart = idx; var wordEnd = idx + wordAfterRegex[0].length; // TODO: Find a better way to do this. It will be slow on very long lines. var revTextBeforeIdx = reverse(textBeforeIdx); var wordBeforeRegex = matchRegex.exec(revTextBeforeIdx); if (wordBeforeRegex) { wordStart -= wordBeforeRegex[0].length; } if (inclusive) { // If present, trim all whitespace after word. // Otherwise, trim all whitespace before word. var textAfterWordEnd = line.substring(wordEnd); var whitespacesAfterWord = textAfterWordEnd.match(/^\s*/)[0].length; if (whitespacesAfterWord > 0) { wordEnd += whitespacesAfterWord; } else { var revTrim = revTextBeforeIdx.length - wordStart; var textBeforeWordStart = revTextBeforeIdx.substring(revTrim); var whitespacesBeforeWord = textBeforeWordStart.match(/^\s*/)[0].length; wordStart -= whitespacesBeforeWord; } } return { start: Pos(cur.line, wordStart), end: Pos(cur.line, wordEnd) }; } function recordJumpPosition(cm, oldCur, newCur) { if (!cursorEqual(oldCur, newCur)) { vimGlobalState.jumpList.add(cm, oldCur, newCur); } } function recordLastCharacterSearch(increment, args) { vimGlobalState.lastChararacterSearch.increment = increment; vimGlobalState.lastChararacterSearch.forward = args.forward; vimGlobalState.lastChararacterSearch.selectedCharacter = args.selectedCharacter; } var symbolToMode = { '(': 'bracket', ')': 'bracket', '{': 'bracket', '}': 'bracket', '[': 'section', ']': 'section', '*': 'comment', '/': 'comment', 'm': 'method', 'M': 'method', '#': 'preprocess' }; var findSymbolModes = { bracket: { isComplete: function(state) { if (state.nextCh === state.symb) { state.depth++; if (state.depth >= 1)return true; } else if (state.nextCh === state.reverseSymb) { state.depth--; } return false; } }, section: { init: function(state) { state.curMoveThrough = true; state.symb = (state.forward ? ']' : '[') === state.symb ? '{' : '}'; }, isComplete: function(state) { return state.index === 0 && state.nextCh === state.symb; } }, comment: { isComplete: function(state) { var found = state.lastCh === '*' && state.nextCh === '/'; state.lastCh = state.nextCh; return found; } }, // TODO: The original Vim implementation only operates on level 1 and 2. // The current implementation doesn't check for code block level and // therefore it operates on any levels. method: { init: function(state) { state.symb = (state.symb === 'm' ? '{' : '}'); state.reverseSymb = state.symb === '{' ? '}' : '{'; }, isComplete: function(state) { if (state.nextCh === state.symb)return true; return false; } }, preprocess: { init: function(state) { state.index = 0; }, isComplete: function(state) { if (state.nextCh === '#') { var token = state.lineText.match(/#(\w+)/)[1]; if (token === 'endif') { if (state.forward && state.depth === 0) { return true; } state.depth++; } else if (token === 'if') { if (!state.forward && state.depth === 0) { return true; } state.depth--; } if (token === 'else' && state.depth === 0)return true; } return false; } } }; function findSymbol(cm, repeat, forward, symb) { var cur = copyCursor(cm.getCursor()); var increment = forward ? 1 : -1; var endLine = forward ? cm.lineCount() : -1; var curCh = cur.ch; var line = cur.line; var lineText = cm.getLine(line); var state = { lineText: lineText, nextCh: lineText.charAt(curCh), lastCh: null, index: curCh, symb: symb, reverseSymb: (forward ? { ')': '(', '}': '{' } : { '(': ')', '{': '}' })[symb], forward: forward, depth: 0, curMoveThrough: false }; var mode = symbolToMode[symb]; if (!mode)return cur; var init = findSymbolModes[mode].init; var isComplete = findSymbolModes[mode].isComplete; if (init) { init(state); } while (line !== endLine && repeat) { state.index += increment; state.nextCh = state.lineText.charAt(state.index); if (!state.nextCh) { line += increment; state.lineText = cm.getLine(line) || ''; if (increment > 0) { state.index = 0; } else { var lineLen = state.lineText.length; state.index = (lineLen > 0) ? (lineLen-1) : 0; } state.nextCh = state.lineText.charAt(state.index); } if (isComplete(state)) { cur.line = line; cur.ch = state.index; repeat--; } } if (state.nextCh || state.curMoveThrough) { return Pos(line, state.index); } return cur; } /* * Returns the boundaries of the next word. If the cursor in the middle of * the word, then returns the boundaries of the current word, starting at * the cursor. If the cursor is at the start/end of a word, and we are going * forward/backward, respectively, find the boundaries of the next word. * * @param {CodeMirror} cm CodeMirror object. * @param {Cursor} cur The cursor position. * @param {boolean} forward True to search forward. False to search * backward. * @param {boolean} bigWord True if punctuation count as part of the word. * False if only [a-zA-Z0-9] characters count as part of the word. * @param {boolean} emptyLineIsWord True if empty lines should be treated * as words. * @return {Object{from:number, to:number, line: number}} The boundaries of * the word, or null if there are no more words. */ function findWord(cm, cur, forward, bigWord, emptyLineIsWord) { var lineNum = cur.line; var pos = cur.ch; var line = cm.getLine(lineNum); var dir = forward ? 1 : -1; var regexps = bigWord ? bigWordRegexp : wordRegexp; if (emptyLineIsWord && line == '') { lineNum += dir; line = cm.getLine(lineNum); if (!isLine(cm, lineNum)) { return null; } pos = (forward) ? 0 : line.length; } while (true) { if (emptyLineIsWord && line == '') { return { from: 0, to: 0, line: lineNum }; } var stop = (dir > 0) ? line.length : -1; var wordStart = stop, wordEnd = stop; // Find bounds of next word. while (pos != stop) { var foundWord = false; for (var i = 0; i < regexps.length && !foundWord; ++i) { if (regexps[i].test(line.charAt(pos))) { wordStart = pos; // Advance to end of word. while (pos != stop && regexps[i].test(line.charAt(pos))) { pos += dir; } wordEnd = pos; foundWord = wordStart != wordEnd; if (wordStart == cur.ch && lineNum == cur.line && wordEnd == wordStart + dir) { // We started at the end of a word. Find the next one. continue; } else { return { from: Math.min(wordStart, wordEnd + 1), to: Math.max(wordStart, wordEnd), line: lineNum }; } } } if (!foundWord) { pos += dir; } } // Advance to next/prev line. lineNum += dir; if (!isLine(cm, lineNum)) { return null; } line = cm.getLine(lineNum); pos = (dir > 0) ? 0 : line.length; } // Should never get here. throw new Error('The impossible happened.'); } /** * @param {CodeMirror} cm CodeMirror object. * @param {Pos} cur The position to start from. * @param {int} repeat Number of words to move past. * @param {boolean} forward True to search forward. False to search * backward. * @param {boolean} wordEnd True to move to end of word. False to move to * beginning of word. * @param {boolean} bigWord True if punctuation count as part of the word. * False if only alphabet characters count as part of the word. * @return {Cursor} The position the cursor should move to. */ function moveToWord(cm, cur, repeat, forward, wordEnd, bigWord) { var curStart = copyCursor(cur); var words = []; if (forward && !wordEnd || !forward && wordEnd) { repeat++; } // For 'e', empty lines are not considered words, go figure. var emptyLineIsWord = !(forward && wordEnd); for (var i = 0; i < repeat; i++) { var word = findWord(cm, cur, forward, bigWord, emptyLineIsWord); if (!word) { var eodCh = lineLength(cm, cm.lastLine()); words.push(forward ? {line: cm.lastLine(), from: eodCh, to: eodCh} : {line: 0, from: 0, to: 0}); break; } words.push(word); cur = Pos(word.line, forward ? (word.to - 1) : word.from); } var shortCircuit = words.length != repeat; var firstWord = words[0]; var lastWord = words.pop(); if (forward && !wordEnd) { // w if (!shortCircuit && (firstWord.from != curStart.ch || firstWord.line != curStart.line)) { // We did not start in the middle of a word. Discard the extra word at the end. lastWord = words.pop(); } return Pos(lastWord.line, lastWord.from); } else if (forward && wordEnd) { return Pos(lastWord.line, lastWord.to - 1); } else if (!forward && wordEnd) { // ge if (!shortCircuit && (firstWord.to != curStart.ch || firstWord.line != curStart.line)) { // We did not start in the middle of a word. Discard the extra word at the end. lastWord = words.pop(); } return Pos(lastWord.line, lastWord.to); } else { // b return Pos(lastWord.line, lastWord.from); } } function moveToCharacter(cm, repeat, forward, character) { var cur = cm.getCursor(); var start = cur.ch; var idx; for (var i = 0; i < repeat; i ++) { var line = cm.getLine(cur.line); idx = charIdxInLine(start, line, character, forward, true); if (idx == -1) { return null; } start = idx; } return Pos(cm.getCursor().line, idx); } function moveToColumn(cm, repeat) { // repeat is always >= 1, so repeat - 1 always corresponds // to the column we want to go to. var line = cm.getCursor().line; return clipCursorToContent(cm, Pos(line, repeat - 1)); } function updateMark(cm, vim, markName, pos) { if (!inArray(markName, validMarks)) { return; } if (vim.marks[markName]) { vim.marks[markName].clear(); } vim.marks[markName] = cm.setBookmark(pos); } function charIdxInLine(start, line, character, forward, includeChar) { // Search for char in line. // motion_options: {forward, includeChar} // If includeChar = true, include it too. // If forward = true, search forward, else search backwards. // If char is not found on this line, do nothing var idx; if (forward) { idx = line.indexOf(character, start + 1); if (idx != -1 && !includeChar) { idx -= 1; } } else { idx = line.lastIndexOf(character, start - 1); if (idx != -1 && !includeChar) { idx += 1; } } return idx; } function findParagraph(cm, head, repeat, dir, inclusive) { var line = head.line; var min = cm.firstLine(); var max = cm.lastLine(); var start, end, i = line; function isEmpty(i) { return !cm.getLine(i); } function isBoundary(i, dir, any) { if (any) { return isEmpty(i) != isEmpty(i + dir); } return !isEmpty(i) && isEmpty(i + dir); } if (dir) { while (min <= i && i <= max && repeat > 0) { if (isBoundary(i, dir)) { repeat--; } i += dir; } return new Pos(i, 0); } var vim = cm.state.vim; if (vim.visualLine && isBoundary(line, 1, true)) { var anchor = vim.sel.anchor; if (isBoundary(anchor.line, -1, true)) { if (!inclusive || anchor.line != line) { line += 1; } } } var startState = isEmpty(line); for (i = line; i <= max && repeat; i++) { if (isBoundary(i, 1, true)) { if (!inclusive || isEmpty(i) != startState) { repeat--; } } } end = new Pos(i, 0); // select boundary before paragraph for the last one if (i > max && !startState) { startState = true; } else { inclusive = false; } for (i = line; i > min; i--) { if (!inclusive || isEmpty(i) == startState || i == line) { if (isBoundary(i, -1, true)) { break; } } } start = new Pos(i, 0); return { start: start, end: end }; } // TODO: perhaps this finagling of start and end positions belonds // in codmirror/replaceRange? function selectCompanionObject(cm, head, symb, inclusive) { var cur = head, start, end; var bracketRegexp = ({ '(': /[()]/, ')': /[()]/, '[': /[[\]]/, ']': /[[\]]/, '{': /[{}]/, '}': /[{}]/})[symb]; var openSym = ({ '(': '(', ')': '(', '[': '[', ']': '[', '{': '{', '}': '{'})[symb]; var curChar = cm.getLine(cur.line).charAt(cur.ch); // Due to the behavior of scanForBracket, we need to add an offset if the // cursor is on a matching open bracket. var offset = curChar === openSym ? 1 : 0; start = cm.scanForBracket(Pos(cur.line, cur.ch + offset), -1, null, {'bracketRegex': bracketRegexp}); end = cm.scanForBracket(Pos(cur.line, cur.ch + offset), 1, null, {'bracketRegex': bracketRegexp}); if (!start || !end) { return { start: cur, end: cur }; } start = start.pos; end = end.pos; if ((start.line == end.line && start.ch > end.ch) || (start.line > end.line)) { var tmp = start; start = end; end = tmp; } if (inclusive) { end.ch += 1; } else { start.ch += 1; } return { start: start, end: end }; } // Takes in a symbol and a cursor and tries to simulate text objects that // have identical opening and closing symbols // TODO support across multiple lines function findBeginningAndEnd(cm, head, symb, inclusive) { var cur = copyCursor(head); var line = cm.getLine(cur.line); var chars = line.split(''); var start, end, i, len; var firstIndex = chars.indexOf(symb); // the decision tree is to always look backwards for the beginning first, // but if the cursor is in front of the first instance of the symb, // then move the cursor forward if (cur.ch < firstIndex) { cur.ch = firstIndex; // Why is this line even here??? // cm.setCursor(cur.line, firstIndex+1); } // otherwise if the cursor is currently on the closing symbol else if (firstIndex < cur.ch && chars[cur.ch] == symb) { end = cur.ch; // assign end to the current cursor --cur.ch; // make sure to look backwards } // if we're currently on the symbol, we've got a start if (chars[cur.ch] == symb && !end) { start = cur.ch + 1; // assign start to ahead of the cursor } else { // go backwards to find the start for (i = cur.ch; i > -1 && !start; i--) { if (chars[i] == symb) { start = i + 1; } } } // look forwards for the end symbol if (start && !end) { for (i = start, len = chars.length; i < len && !end; i++) { if (chars[i] == symb) { end = i; } } } // nothing found if (!start || !end) { return { start: cur, end: cur }; } // include the symbols if (inclusive) { --start; ++end; } return { start: Pos(cur.line, start), end: Pos(cur.line, end) }; } // Search functions defineOption('pcre', true, 'boolean'); function SearchState() {} SearchState.prototype = { getQuery: function() { return vimGlobalState.query; }, setQuery: function(query) { vimGlobalState.query = query; }, getOverlay: function() { return this.searchOverlay; }, setOverlay: function(overlay) { this.searchOverlay = overlay; }, isReversed: function() { return vimGlobalState.isReversed; }, setReversed: function(reversed) { vimGlobalState.isReversed = reversed; }, getScrollbarAnnotate: function() { return this.annotate; }, setScrollbarAnnotate: function(annotate) { this.annotate = annotate; } }; function getSearchState(cm) { var vim = cm.state.vim; return vim.searchState_ || (vim.searchState_ = new SearchState()); } function dialog(cm, template, shortText, onClose, options) { if (cm.openDialog) { cm.openDialog(template, onClose, { bottom: true, value: options.value, onKeyDown: options.onKeyDown, onKeyUp: options.onKeyUp }); } else { onClose(prompt(shortText, '')); } } function splitBySlash(argString) { var slashes = findUnescapedSlashes(argString) || []; if (!slashes.length) return []; var tokens = []; // in case of strings like foo/bar if (slashes[0] !== 0) return; for (var i = 0; i < slashes.length; i++) { if (typeof slashes[i] == 'number') tokens.push(argString.substring(slashes[i] + 1, slashes[i+1])); } return tokens; } function findUnescapedSlashes(str) { var escapeNextChar = false; var slashes = []; for (var i = 0; i < str.length; i++) { var c = str.charAt(i); if (!escapeNextChar && c == '/') { slashes.push(i); } escapeNextChar = !escapeNextChar && (c == '\\'); } return slashes; } // Translates a search string from ex (vim) syntax into javascript form. function translateRegex(str) { // When these match, add a '\' if unescaped or remove one if escaped. var specials = '|(){'; // Remove, but never add, a '\' for these. var unescape = '}'; var escapeNextChar = false; var out = []; for (var i = -1; i < str.length; i++) { var c = str.charAt(i) || ''; var n = str.charAt(i+1) || ''; var specialComesNext = (n && specials.indexOf(n) != -1); if (escapeNextChar) { if (c !== '\\' || !specialComesNext) { out.push(c); } escapeNextChar = false; } else { if (c === '\\') { escapeNextChar = true; // Treat the unescape list as special for removing, but not adding '\'. if (n && unescape.indexOf(n) != -1) { specialComesNext = true; } // Not passing this test means removing a '\'. if (!specialComesNext || n === '\\') { out.push(c); } } else { out.push(c); if (specialComesNext && n !== '\\') { out.push('\\'); } } } } return out.join(''); } // Translates the replace part of a search and replace from ex (vim) syntax into // javascript form. Similar to translateRegex, but additionally fixes back references // (translates '\[0..9]' to '$[0..9]') and follows different rules for escaping '$'. function translateRegexReplace(str) { var escapeNextChar = false; var out = []; for (var i = -1; i < str.length; i++) { var c = str.charAt(i) || ''; var n = str.charAt(i+1) || ''; if (escapeNextChar) { // At any point in the loop, escapeNextChar is true if the previous // character was a '\' and was not escaped. out.push(c); escapeNextChar = false; } else { if (c === '\\') { escapeNextChar = true; if ((isNumber(n) || n === '$')) { out.push('$'); } else if (n !== '/' && n !== '\\') { out.push('\\'); } } else { if (c === '$') { out.push('$'); } out.push(c); if (n === '/') { out.push('\\'); } } } } return out.join(''); } // Unescape \ and / in the replace part, for PCRE mode. function unescapeRegexReplace(str) { var stream = new CodeMirror.StringStream(str); var output = []; while (!stream.eol()) { // Search for \. while (stream.peek() && stream.peek() != '\\') { output.push(stream.next()); } if (stream.match('\\/', true)) { // \/ => / output.push('/'); } else if (stream.match('\\\\', true)) { // \\ => \ output.push('\\'); } else { // Don't change anything output.push(stream.next()); } } return output.join(''); } /** * Extract the regular expression from the query and return a Regexp object. * Returns null if the query is blank. * If ignoreCase is passed in, the Regexp object will have the 'i' flag set. * If smartCase is passed in, and the query contains upper case letters, * then ignoreCase is overridden, and the 'i' flag will not be set. * If the query contains the /i in the flag part of the regular expression, * then both ignoreCase and smartCase are ignored, and 'i' will be passed * through to the Regex object. */ function parseQuery(query, ignoreCase, smartCase) { // First update the last search register var lastSearchRegister = vimGlobalState.registerController.getRegister('/'); lastSearchRegister.setText(query); // Check if the query is already a regex. if (query instanceof RegExp) { return query; } // First try to extract regex + flags from the input. If no flags found, // extract just the regex. IE does not accept flags directly defined in // the regex string in the form /regex/flags var slashes = findUnescapedSlashes(query); var regexPart; var forceIgnoreCase; if (!slashes.length) { // Query looks like 'regexp' regexPart = query; } else { // Query looks like 'regexp/...' regexPart = query.substring(0, slashes[0]); var flagsPart = query.substring(slashes[0]); forceIgnoreCase = (flagsPart.indexOf('i') != -1); } if (!regexPart) { return null; } if (!getOption('pcre')) { regexPart = translateRegex(regexPart); } if (smartCase) { ignoreCase = (/^[^A-Z]*$/).test(regexPart); } var regexp = new RegExp(regexPart, (ignoreCase || forceIgnoreCase) ? 'i' : undefined); return regexp; } function showConfirm(cm, text) { if (cm.openNotification) { cm.openNotification('' + text + '', {bottom: true, duration: 5000}); } else { alert(text); } } function makePrompt(prefix, desc) { var raw = ''; if (prefix) { raw += '' + prefix + ''; } raw += ' ' + ''; if (desc) { raw += ''; raw += desc; raw += ''; } return raw; } var searchPromptDesc = '(Javascript regexp)'; function showPrompt(cm, options) { var shortText = (options.prefix || '') + ' ' + (options.desc || ''); var prompt = makePrompt(options.prefix, options.desc); dialog(cm, prompt, shortText, options.onClose, options); } function regexEqual(r1, r2) { if (r1 instanceof RegExp && r2 instanceof RegExp) { var props = ['global', 'multiline', 'ignoreCase', 'source']; for (var i = 0; i < props.length; i++) { var prop = props[i]; if (r1[prop] !== r2[prop]) { return false; } } return true; } return false; } // Returns true if the query is valid. function updateSearchQuery(cm, rawQuery, ignoreCase, smartCase) { if (!rawQuery) { return; } var state = getSearchState(cm); var query = parseQuery(rawQuery, !!ignoreCase, !!smartCase); if (!query) { return; } highlightSearchMatches(cm, query); if (regexEqual(query, state.getQuery())) { return query; } state.setQuery(query); return query; } function searchOverlay(query) { if (query.source.charAt(0) == '^') { var matchSol = true; } return { token: function(stream) { if (matchSol && !stream.sol()) { stream.skipToEnd(); return; } var match = stream.match(query, false); if (match) { if (match[0].length == 0) { // Matched empty string, skip to next. stream.next(); return 'searching'; } if (!stream.sol()) { // Backtrack 1 to match \b stream.backUp(1); if (!query.exec(stream.next() + match[0])) { stream.next(); return null; } } stream.match(query); return 'searching'; } while (!stream.eol()) { stream.next(); if (stream.match(query, false)) break; } }, query: query }; } function highlightSearchMatches(cm, query) { var searchState = getSearchState(cm); var overlay = searchState.getOverlay(); if (!overlay || query != overlay.query) { if (overlay) { cm.removeOverlay(overlay); } overlay = searchOverlay(query); cm.addOverlay(overlay); if (cm.showMatchesOnScrollbar) { if (searchState.getScrollbarAnnotate()) { searchState.getScrollbarAnnotate().clear(); } searchState.setScrollbarAnnotate(cm.showMatchesOnScrollbar(query)); } searchState.setOverlay(overlay); } } function findNext(cm, prev, query, repeat) { if (repeat === undefined) { repeat = 1; } return cm.operation(function() { var pos = cm.getCursor(); var cursor = cm.getSearchCursor(query, pos); for (var i = 0; i < repeat; i++) { var found = cursor.find(prev); if (i == 0 && found && cursorEqual(cursor.from(), pos)) { found = cursor.find(prev); } if (!found) { // SearchCursor may have returned null because it hit EOF, wrap // around and try again. cursor = cm.getSearchCursor(query, (prev) ? Pos(cm.lastLine()) : Pos(cm.firstLine(), 0) ); if (!cursor.find(prev)) { return; } } } return cursor.from(); }); } function clearSearchHighlight(cm) { var state = getSearchState(cm); cm.removeOverlay(getSearchState(cm).getOverlay()); state.setOverlay(null); if (state.getScrollbarAnnotate()) { state.getScrollbarAnnotate().clear(); state.setScrollbarAnnotate(null); } } /** * Check if pos is in the specified range, INCLUSIVE. * Range can be specified with 1 or 2 arguments. * If the first range argument is an array, treat it as an array of line * numbers. Match pos against any of the lines. * If the first range argument is a number, * if there is only 1 range argument, check if pos has the same line * number * if there are 2 range arguments, then check if pos is in between the two * range arguments. */ function isInRange(pos, start, end) { if (typeof pos != 'number') { // Assume it is a cursor position. Get the line number. pos = pos.line; } if (start instanceof Array) { return inArray(pos, start); } else { if (end) { return (pos >= start && pos <= end); } else { return pos == start; } } } function getUserVisibleLines(cm) { var scrollInfo = cm.getScrollInfo(); var occludeToleranceTop = 6; var occludeToleranceBottom = 10; var from = cm.coordsChar({left:0, top: occludeToleranceTop + scrollInfo.top}, 'local'); var bottomY = scrollInfo.clientHeight - occludeToleranceBottom + scrollInfo.top; var to = cm.coordsChar({left:0, top: bottomY}, 'local'); return {top: from.line, bottom: to.line}; } // Ex command handling // Care must be taken when adding to the default Ex command map. For any // pair of commands that have a shared prefix, at least one of their // shortNames must not match the prefix of the other command. var defaultExCommandMap = [ { name: 'map' }, { name: 'imap', shortName: 'im' }, { name: 'nmap', shortName: 'nm' }, { name: 'vmap', shortName: 'vm' }, { name: 'unmap' }, { name: 'write', shortName: 'w' }, { name: 'undo', shortName: 'u' }, { name: 'redo', shortName: 'red' }, { name: 'set', shortName: 'set' }, { name: 'sort', shortName: 'sor' }, { name: 'substitute', shortName: 's', possiblyAsync: true }, { name: 'nohlsearch', shortName: 'noh' }, { name: 'delmarks', shortName: 'delm' }, { name: 'registers', shortName: 'reg', excludeFromCommandHistory: true }, { name: 'global', shortName: 'g' } ]; var ExCommandDispatcher = function() { this.buildCommandMap_(); }; ExCommandDispatcher.prototype = { processCommand: function(cm, input, opt_params) { var vim = cm.state.vim; var commandHistoryRegister = vimGlobalState.registerController.getRegister(':'); var previousCommand = commandHistoryRegister.toString(); if (vim.visualMode) { exitVisualMode(cm); } var inputStream = new CodeMirror.StringStream(input); // update ": with the latest command whether valid or invalid commandHistoryRegister.setText(input); var params = opt_params || {}; params.input = input; try { this.parseInput_(cm, inputStream, params); } catch(e) { showConfirm(cm, e); throw e; } var command; var commandName; if (!params.commandName) { // If only a line range is defined, move to the line. if (params.line !== undefined) { commandName = 'move'; } } else { command = this.matchCommand_(params.commandName); if (command) { commandName = command.name; if (command.excludeFromCommandHistory) { commandHistoryRegister.setText(previousCommand); } this.parseCommandArgs_(inputStream, params, command); if (command.type == 'exToKey') { // Handle Ex to Key mapping. for (var i = 0; i < command.toKeys.length; i++) { CodeMirror.Vim.handleKey(cm, command.toKeys[i], 'mapping'); } return; } else if (command.type == 'exToEx') { // Handle Ex to Ex mapping. this.processCommand(cm, command.toInput); return; } } } if (!commandName) { showConfirm(cm, 'Not an editor command ":' + input + '"'); return; } try { exCommands[commandName](cm, params); // Possibly asynchronous commands (e.g. substitute, which might have a // user confirmation), are responsible for calling the callback when // done. All others have it taken care of for them here. if ((!command || !command.possiblyAsync) && params.callback) { params.callback(); } } catch(e) { showConfirm(cm, e); throw e; } }, parseInput_: function(cm, inputStream, result) { inputStream.eatWhile(':'); // Parse range. if (inputStream.eat('%')) { result.line = cm.firstLine(); result.lineEnd = cm.lastLine(); } else { result.line = this.parseLineSpec_(cm, inputStream); if (result.line !== undefined && inputStream.eat(',')) { result.lineEnd = this.parseLineSpec_(cm, inputStream); } } // Parse command name. var commandMatch = inputStream.match(/^(\w+)/); if (commandMatch) { result.commandName = commandMatch[1]; } else { result.commandName = inputStream.match(/.*/)[0]; } return result; }, parseLineSpec_: function(cm, inputStream) { var numberMatch = inputStream.match(/^(\d+)/); if (numberMatch) { return parseInt(numberMatch[1], 10) - 1; } switch (inputStream.next()) { case '.': return cm.getCursor().line; case '$': return cm.lastLine(); case '\'': var mark = cm.state.vim.marks[inputStream.next()]; if (mark && mark.find()) { return mark.find().line; } throw new Error('Mark not set'); default: inputStream.backUp(1); return undefined; } }, parseCommandArgs_: function(inputStream, params, command) { if (inputStream.eol()) { return; } params.argString = inputStream.match(/.*/)[0]; // Parse command-line arguments var delim = command.argDelimiter || /\s+/; var args = trim(params.argString).split(delim); if (args.length && args[0]) { params.args = args; } }, matchCommand_: function(commandName) { // Return the command in the command map that matches the shortest // prefix of the passed in command name. The match is guaranteed to be // unambiguous if the defaultExCommandMap's shortNames are set up // correctly. (see @code{defaultExCommandMap}). for (var i = commandName.length; i > 0; i--) { var prefix = commandName.substring(0, i); if (this.commandMap_[prefix]) { var command = this.commandMap_[prefix]; if (command.name.indexOf(commandName) === 0) { return command; } } } return null; }, buildCommandMap_: function() { this.commandMap_ = {}; for (var i = 0; i < defaultExCommandMap.length; i++) { var command = defaultExCommandMap[i]; var key = command.shortName || command.name; this.commandMap_[key] = command; } }, map: function(lhs, rhs, ctx) { if (lhs != ':' && lhs.charAt(0) == ':') { if (ctx) { throw Error('Mode not supported for ex mappings'); } var commandName = lhs.substring(1); if (rhs != ':' && rhs.charAt(0) == ':') { // Ex to Ex mapping this.commandMap_[commandName] = { name: commandName, type: 'exToEx', toInput: rhs.substring(1), user: true }; } else { // Ex to key mapping this.commandMap_[commandName] = { name: commandName, type: 'exToKey', toKeys: rhs, user: true }; } } else { if (rhs != ':' && rhs.charAt(0) == ':') { // Key to Ex mapping. var mapping = { keys: lhs, type: 'keyToEx', exArgs: { input: rhs.substring(1) }, user: true}; if (ctx) { mapping.context = ctx; } defaultKeymap.unshift(mapping); } else { // Key to key mapping var mapping = { keys: lhs, type: 'keyToKey', toKeys: rhs, user: true }; if (ctx) { mapping.context = ctx; } defaultKeymap.unshift(mapping); } } }, unmap: function(lhs, ctx) { if (lhs != ':' && lhs.charAt(0) == ':') { // Ex to Ex or Ex to key mapping if (ctx) { throw Error('Mode not supported for ex mappings'); } var commandName = lhs.substring(1); if (this.commandMap_[commandName] && this.commandMap_[commandName].user) { delete this.commandMap_[commandName]; return; } } else { // Key to Ex or key to key mapping var keys = lhs; for (var i = 0; i < defaultKeymap.length; i++) { if (keys == defaultKeymap[i].keys && defaultKeymap[i].context === ctx && defaultKeymap[i].user) { defaultKeymap.splice(i, 1); return; } } } throw Error('No such mapping.'); } }; var exCommands = { map: function(cm, params, ctx) { var mapArgs = params.args; if (!mapArgs || mapArgs.length < 2) { if (cm) { showConfirm(cm, 'Invalid mapping: ' + params.input); } return; } exCommandDispatcher.map(mapArgs[0], mapArgs[1], ctx); }, imap: function(cm, params) { this.map(cm, params, 'insert'); }, nmap: function(cm, params) { this.map(cm, params, 'normal'); }, vmap: function(cm, params) { this.map(cm, params, 'visual'); }, unmap: function(cm, params, ctx) { var mapArgs = params.args; if (!mapArgs || mapArgs.length < 1) { if (cm) { showConfirm(cm, 'No such mapping: ' + params.input); } return; } exCommandDispatcher.unmap(mapArgs[0], ctx); }, move: function(cm, params) { commandDispatcher.processCommand(cm, cm.state.vim, { type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: false, explicitRepeat: true, linewise: true }, repeatOverride: params.line+1}); }, set: function(cm, params) { var setArgs = params.args; if (!setArgs || setArgs.length < 1) { if (cm) { showConfirm(cm, 'Invalid mapping: ' + params.input); } return; } var expr = setArgs[0].split('='); var optionName = expr[0]; var value = expr[1]; var forceGet = false; if (optionName.charAt(optionName.length - 1) == '?') { // If post-fixed with ?, then the set is actually a get. if (value) { throw Error('Trailing characters: ' + params.argString); } optionName = optionName.substring(0, optionName.length - 1); forceGet = true; } if (value === undefined && optionName.substring(0, 2) == 'no') { // To set boolean options to false, the option name is prefixed with // 'no'. optionName = optionName.substring(2); value = false; } var optionIsBoolean = options[optionName] && options[optionName].type == 'boolean'; if (optionIsBoolean && value == undefined) { // Calling set with a boolean option sets it to true. value = true; } if (!optionIsBoolean && !value || forceGet) { var oldValue = getOption(optionName); // If no value is provided, then we assume this is a get. if (oldValue === true || oldValue === false) { showConfirm(cm, ' ' + (oldValue ? '' : 'no') + optionName); } else { showConfirm(cm, ' ' + optionName + '=' + oldValue); } } else { setOption(optionName, value); } }, registers: function(cm,params) { var regArgs = params.args; var registers = vimGlobalState.registerController.registers; var regInfo = '----------Registers----------

    '; if (!regArgs) { for (var registerName in registers) { var text = registers[registerName].toString(); if (text.length) { regInfo += '"' + registerName + ' ' + text + '
    '; } } } else { var registerName; regArgs = regArgs.join(''); for (var i = 0; i < regArgs.length; i++) { registerName = regArgs.charAt(i); if (!vimGlobalState.registerController.isValidRegister(registerName)) { continue; } var register = registers[registerName] || new Register(); regInfo += '"' + registerName + ' ' + register.toString() + '
    '; } } showConfirm(cm, regInfo); }, sort: function(cm, params) { var reverse, ignoreCase, unique, number; function parseArgs() { if (params.argString) { var args = new CodeMirror.StringStream(params.argString); if (args.eat('!')) { reverse = true; } if (args.eol()) { return; } if (!args.eatSpace()) { return 'Invalid arguments'; } var opts = args.match(/[a-z]+/); if (opts) { opts = opts[0]; ignoreCase = opts.indexOf('i') != -1; unique = opts.indexOf('u') != -1; var decimal = opts.indexOf('d') != -1 && 1; var hex = opts.indexOf('x') != -1 && 1; var octal = opts.indexOf('o') != -1 && 1; if (decimal + hex + octal > 1) { return 'Invalid arguments'; } number = decimal && 'decimal' || hex && 'hex' || octal && 'octal'; } if (args.eatSpace() && args.match(/\/.*\//)) { 'patterns not supported'; } } } var err = parseArgs(); if (err) { showConfirm(cm, err + ': ' + params.argString); return; } var lineStart = params.line || cm.firstLine(); var lineEnd = params.lineEnd || params.line || cm.lastLine(); if (lineStart == lineEnd) { return; } var curStart = Pos(lineStart, 0); var curEnd = Pos(lineEnd, lineLength(cm, lineEnd)); var text = cm.getRange(curStart, curEnd).split('\n'); var numberRegex = (number == 'decimal') ? /(-?)([\d]+)/ : (number == 'hex') ? /(-?)(?:0x)?([0-9a-f]+)/i : (number == 'octal') ? /([0-7]+)/ : null; var radix = (number == 'decimal') ? 10 : (number == 'hex') ? 16 : (number == 'octal') ? 8 : null; var numPart = [], textPart = []; if (number) { for (var i = 0; i < text.length; i++) { if (numberRegex.exec(text[i])) { numPart.push(text[i]); } else { textPart.push(text[i]); } } } else { textPart = text; } function compareFn(a, b) { if (reverse) { var tmp; tmp = a; a = b; b = tmp; } if (ignoreCase) { a = a.toLowerCase(); b = b.toLowerCase(); } var anum = number && numberRegex.exec(a); var bnum = number && numberRegex.exec(b); if (!anum) { return a < b ? -1 : 1; } anum = parseInt((anum[1] + anum[2]).toLowerCase(), radix); bnum = parseInt((bnum[1] + bnum[2]).toLowerCase(), radix); return anum - bnum; } numPart.sort(compareFn); textPart.sort(compareFn); text = (!reverse) ? textPart.concat(numPart) : numPart.concat(textPart); if (unique) { // Remove duplicate lines var textOld = text; var lastLine; text = []; for (var i = 0; i < textOld.length; i++) { if (textOld[i] != lastLine) { text.push(textOld[i]); } lastLine = textOld[i]; } } cm.replaceRange(text.join('\n'), curStart, curEnd); }, global: function(cm, params) { // a global command is of the form // :[range]g/pattern/[cmd] // argString holds the string /pattern/[cmd] var argString = params.argString; if (!argString) { showConfirm(cm, 'Regular Expression missing from global'); return; } // range is specified here var lineStart = (params.line !== undefined) ? params.line : cm.firstLine(); var lineEnd = params.lineEnd || params.line || cm.lastLine(); // get the tokens from argString var tokens = splitBySlash(argString); var regexPart = argString, cmd; if (tokens.length) { regexPart = tokens[0]; cmd = tokens.slice(1, tokens.length).join('/'); } if (regexPart) { // If regex part is empty, then use the previous query. Otherwise // use the regex part as the new query. try { updateSearchQuery(cm, regexPart, true /** ignoreCase */, true /** smartCase */); } catch (e) { showConfirm(cm, 'Invalid regex: ' + regexPart); return; } } // now that we have the regexPart, search for regex matches in the // specified range of lines var query = getSearchState(cm).getQuery(); var matchedLines = [], content = ''; for (var i = lineStart; i <= lineEnd; i++) { var matched = query.test(cm.getLine(i)); if (matched) { matchedLines.push(i+1); content+= cm.getLine(i) + '
    '; } } // if there is no [cmd], just display the list of matched lines if (!cmd) { showConfirm(cm, content); return; } var index = 0; var nextCommand = function() { if (index < matchedLines.length) { var command = matchedLines[index] + cmd; exCommandDispatcher.processCommand(cm, command, { callback: nextCommand }); } index++; }; nextCommand(); }, substitute: function(cm, params) { if (!cm.getSearchCursor) { throw new Error('Search feature not available. Requires searchcursor.js or ' + 'any other getSearchCursor implementation.'); } var argString = params.argString; var tokens = argString ? splitBySlash(argString) : []; var regexPart, replacePart = '', trailing, flagsPart, count; var confirm = false; // Whether to confirm each replace. var global = false; // True to replace all instances on a line, false to replace only 1. if (tokens.length) { regexPart = tokens[0]; replacePart = tokens[1]; if (replacePart !== undefined) { if (getOption('pcre')) { replacePart = unescapeRegexReplace(replacePart); } else { replacePart = translateRegexReplace(replacePart); } vimGlobalState.lastSubstituteReplacePart = replacePart; } trailing = tokens[2] ? tokens[2].split(' ') : []; } else { // either the argString is empty or its of the form ' hello/world' // actually splitBySlash returns a list of tokens // only if the string starts with a '/' if (argString && argString.length) { showConfirm(cm, 'Substitutions should be of the form ' + ':s/pattern/replace/'); return; } } // After the 3rd slash, we can have flags followed by a space followed // by count. if (trailing) { flagsPart = trailing[0]; count = parseInt(trailing[1]); if (flagsPart) { if (flagsPart.indexOf('c') != -1) { confirm = true; flagsPart.replace('c', ''); } if (flagsPart.indexOf('g') != -1) { global = true; flagsPart.replace('g', ''); } regexPart = regexPart + '/' + flagsPart; } } if (regexPart) { // If regex part is empty, then use the previous query. Otherwise use // the regex part as the new query. try { updateSearchQuery(cm, regexPart, true /** ignoreCase */, true /** smartCase */); } catch (e) { showConfirm(cm, 'Invalid regex: ' + regexPart); return; } } replacePart = replacePart || vimGlobalState.lastSubstituteReplacePart; if (replacePart === undefined) { showConfirm(cm, 'No previous substitute regular expression'); return; } var state = getSearchState(cm); var query = state.getQuery(); var lineStart = (params.line !== undefined) ? params.line : cm.getCursor().line; var lineEnd = params.lineEnd || lineStart; if (count) { lineStart = lineEnd; lineEnd = lineStart + count - 1; } var startPos = clipCursorToContent(cm, Pos(lineStart, 0)); var cursor = cm.getSearchCursor(query, startPos); doReplace(cm, confirm, global, lineStart, lineEnd, cursor, query, replacePart, params.callback); }, redo: CodeMirror.commands.redo, undo: CodeMirror.commands.undo, write: function(cm) { if (CodeMirror.commands.save) { // If a save command is defined, call it. CodeMirror.commands.save(cm); } else { // Saves to text area if no save command is defined. cm.save(); } }, nohlsearch: function(cm) { clearSearchHighlight(cm); }, delmarks: function(cm, params) { if (!params.argString || !trim(params.argString)) { showConfirm(cm, 'Argument required'); return; } var state = cm.state.vim; var stream = new CodeMirror.StringStream(trim(params.argString)); while (!stream.eol()) { stream.eatSpace(); // Record the streams position at the beginning of the loop for use // in error messages. var count = stream.pos; if (!stream.match(/[a-zA-Z]/, false)) { showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); return; } var sym = stream.next(); // Check if this symbol is part of a range if (stream.match('-', true)) { // This symbol is part of a range. // The range must terminate at an alphabetic character. if (!stream.match(/[a-zA-Z]/, false)) { showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); return; } var startMark = sym; var finishMark = stream.next(); // The range must terminate at an alphabetic character which // shares the same case as the start of the range. if (isLowerCase(startMark) && isLowerCase(finishMark) || isUpperCase(startMark) && isUpperCase(finishMark)) { var start = startMark.charCodeAt(0); var finish = finishMark.charCodeAt(0); if (start >= finish) { showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); return; } // Because marks are always ASCII values, and we have // determined that they are the same case, we can use // their char codes to iterate through the defined range. for (var j = 0; j <= finish - start; j++) { var mark = String.fromCharCode(start + j); delete state.marks[mark]; } } else { showConfirm(cm, 'Invalid argument: ' + startMark + '-'); return; } } else { // This symbol is a valid mark, and is not part of a range. delete state.marks[sym]; } } } }; var exCommandDispatcher = new ExCommandDispatcher(); /** * @param {CodeMirror} cm CodeMirror instance we are in. * @param {boolean} confirm Whether to confirm each replace. * @param {Cursor} lineStart Line to start replacing from. * @param {Cursor} lineEnd Line to stop replacing at. * @param {RegExp} query Query for performing matches with. * @param {string} replaceWith Text to replace matches with. May contain $1, * $2, etc for replacing captured groups using Javascript replace. * @param {function()} callback A callback for when the replace is done. */ function doReplace(cm, confirm, global, lineStart, lineEnd, searchCursor, query, replaceWith, callback) { // Set up all the functions. cm.state.vim.exMode = true; var done = false; var lastPos = searchCursor.from(); function replaceAll() { cm.operation(function() { while (!done) { replace(); next(); } stop(); }); } function replace() { var text = cm.getRange(searchCursor.from(), searchCursor.to()); var newText = text.replace(query, replaceWith); searchCursor.replace(newText); } function next() { var found; // The below only loops to skip over multiple occurrences on the same // line when 'global' is not true. while(found = searchCursor.findNext() && isInRange(searchCursor.from(), lineStart, lineEnd)) { if (!global && lastPos && searchCursor.from().line == lastPos.line) { continue; } cm.scrollIntoView(searchCursor.from(), 30); cm.setSelection(searchCursor.from(), searchCursor.to()); lastPos = searchCursor.from(); done = false; return; } done = true; } function stop(close) { if (close) { close(); } cm.focus(); if (lastPos) { cm.setCursor(lastPos); var vim = cm.state.vim; vim.exMode = false; vim.lastHPos = vim.lastHSPos = lastPos.ch; } if (callback) { callback(); } } function onPromptKeyDown(e, _value, close) { // Swallow all keys. CodeMirror.e_stop(e); var keyName = CodeMirror.keyName(e); switch (keyName) { case 'Y': replace(); next(); break; case 'N': next(); break; case 'A': // replaceAll contains a call to close of its own. We don't want it // to fire too early or multiple times. var savedCallback = callback; callback = undefined; cm.operation(replaceAll); callback = savedCallback; break; case 'L': replace(); // fall through and exit. case 'Q': case 'Esc': case 'Ctrl-C': case 'Ctrl-[': stop(close); break; } if (done) { stop(close); } return true; } // Actually do replace. next(); if (done) { showConfirm(cm, 'No matches for ' + query.source); return; } if (!confirm) { replaceAll(); if (callback) { callback(); }; return; } showPrompt(cm, { prefix: 'replace with ' + replaceWith + ' (y/n/a/q/l)', onKeyDown: onPromptKeyDown }); } CodeMirror.keyMap.vim = { attach: attachVimMap, detach: detachVimMap, call: cmKey }; function exitInsertMode(cm) { var vim = cm.state.vim; var macroModeState = vimGlobalState.macroModeState; var insertModeChangeRegister = vimGlobalState.registerController.getRegister('.'); var isPlaying = macroModeState.isPlaying; var lastChange = macroModeState.lastInsertModeChanges; // In case of visual block, the insertModeChanges are not saved as a // single word, so we convert them to a single word // so as to update the ". register as expected in real vim. var text = []; if (!isPlaying) { var selLength = lastChange.inVisualBlock ? vim.lastSelection.visualBlock.height : 1; var changes = lastChange.changes; var text = []; var i = 0; // In case of multiple selections in blockwise visual, // the inserted text, for example: 'foo', is stored as // 'f', 'f', InsertModeKey 'o', 'o', 'o', 'o'. (if you have a block with 2 lines). // We push the contents of the changes array as per the following: // 1. In case of InsertModeKey, just increment by 1. // 2. In case of a character, jump by selLength (2 in the example). while (i < changes.length) { // This loop will convert 'ffoooo' to 'foo'. text.push(changes[i]); if (changes[i] instanceof InsertModeKey) { i++; } else { i+= selLength; } } lastChange.changes = text; cm.off('change', onChange); CodeMirror.off(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown); } if (!isPlaying && vim.insertModeRepeat > 1) { // Perform insert mode repeat for commands like 3,a and 3,o. repeatLastEdit(cm, vim, vim.insertModeRepeat - 1, true /** repeatForInsert */); vim.lastEditInputState.repeatOverride = vim.insertModeRepeat; } delete vim.insertModeRepeat; vim.insertMode = false; cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1); cm.setOption('keyMap', 'vim'); cm.setOption('disableInput', true); cm.toggleOverwrite(false); // exit replace mode if we were in it. // update the ". register before exiting insert mode insertModeChangeRegister.setText(lastChange.changes.join('')); CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"}); if (macroModeState.isRecording) { logInsertModeChange(macroModeState); } } function _mapCommand(command) { defaultKeymap.push(command); } function mapCommand(keys, type, name, args, extra) { var command = {keys: keys, type: type}; command[type] = name; command[type + "Args"] = args; for (var key in extra) command[key] = extra[key]; _mapCommand(command); } // The timeout in milliseconds for the two-character ESC keymap should be // adjusted according to your typing speed to prevent false positives. defineOption('insertModeEscKeysTimeout', 200, 'number'); CodeMirror.keyMap['vim-insert'] = { // TODO: override navigation keys so that Esc will cancel automatic // indentation from o, O, i_ 'Ctrl-N': 'autocomplete', 'Ctrl-P': 'autocomplete', 'Enter': function(cm) { var fn = CodeMirror.commands.newlineAndIndentContinueComment || CodeMirror.commands.newlineAndIndent; fn(cm); }, fallthrough: ['default'], attach: attachVimMap, detach: detachVimMap, call: cmKey }; CodeMirror.keyMap['vim-replace'] = { 'Backspace': 'goCharLeft', fallthrough: ['vim-insert'], attach: attachVimMap, detach: detachVimMap, call: cmKey }; function executeMacroRegister(cm, vim, macroModeState, registerName) { var register = vimGlobalState.registerController.getRegister(registerName); var keyBuffer = register.keyBuffer; var imc = 0; macroModeState.isPlaying = true; macroModeState.replaySearchQueries = register.searchQueries.slice(0); for (var i = 0; i < keyBuffer.length; i++) { var text = keyBuffer[i]; var match, key; while (text) { // Pull off one command key, which is either a single character // or a special sequence wrapped in '<' and '>', e.g. ''. match = (/<\w+-.+?>|<\w+>|./).exec(text); key = match[0]; text = text.substring(match.index + key.length); CodeMirror.Vim.handleKey(cm, key, 'macro'); if (vim.insertMode) { var changes = register.insertModeChanges[imc++].changes; vimGlobalState.macroModeState.lastInsertModeChanges.changes = changes; repeatInsertModeChanges(cm, changes, 1); exitInsertMode(cm); } } }; macroModeState.isPlaying = false; } function logKey(macroModeState, key) { if (macroModeState.isPlaying) { return; } var registerName = macroModeState.latestRegister; var register = vimGlobalState.registerController.getRegister(registerName); if (register) { register.pushText(key); } } function logInsertModeChange(macroModeState) { if (macroModeState.isPlaying) { return; } var registerName = macroModeState.latestRegister; var register = vimGlobalState.registerController.getRegister(registerName); if (register) { register.pushInsertModeChanges(macroModeState.lastInsertModeChanges); } } function logSearchQuery(macroModeState, query) { if (macroModeState.isPlaying) { return; } var registerName = macroModeState.latestRegister; var register = vimGlobalState.registerController.getRegister(registerName); if (register) { register.pushSearchQuery(query); } } /** * Listens for changes made in insert mode. * Should only be active in insert mode. */ function onChange(_cm, changeObj) { var macroModeState = vimGlobalState.macroModeState; var lastChange = macroModeState.lastInsertModeChanges; if (!macroModeState.isPlaying) { while(changeObj) { lastChange.expectCursorActivityForChange = true; if (changeObj.origin == '+input' || changeObj.origin == 'paste' || changeObj.origin === undefined /* only in testing */) { var text = changeObj.text.join('\n'); lastChange.changes.push(text); } // Change objects may be chained with next. changeObj = changeObj.next; } } } /** * Listens for any kind of cursor activity on CodeMirror. */ function onCursorActivity(cm) { var vim = cm.state.vim; if (vim.insertMode) { // Tracking cursor activity in insert mode (for macro support). var macroModeState = vimGlobalState.macroModeState; if (macroModeState.isPlaying) { return; } var lastChange = macroModeState.lastInsertModeChanges; if (lastChange.expectCursorActivityForChange) { lastChange.expectCursorActivityForChange = false; } else { // Cursor moved outside the context of an edit. Reset the change. lastChange.changes = []; } } else if (!cm.curOp.isVimOp) { handleExternalSelection(cm, vim); } if (vim.visualMode) { updateFakeCursor(cm); } } function updateFakeCursor(cm) { var vim = cm.state.vim; var from = copyCursor(vim.sel.head); var to = offsetCursor(from, 0, 1); if (vim.fakeCursor) { vim.fakeCursor.clear(); } vim.fakeCursor = cm.markText(from, to, {className: 'cm-animate-fat-cursor'}); } function handleExternalSelection(cm, vim) { var anchor = cm.getCursor('anchor'); var head = cm.getCursor('head'); // Enter or exit visual mode to match mouse selection. if (vim.visualMode && cursorEqual(head, anchor) && lineLength(cm, head.line) > head.ch) { exitVisualMode(cm, false); } else if (!vim.visualMode && !vim.insertMode && cm.somethingSelected()) { vim.visualMode = true; vim.visualLine = false; CodeMirror.signal(cm, "vim-mode-change", {mode: "visual"}); } if (vim.visualMode) { // Bind CodeMirror selection model to vim selection model. // Mouse selections are considered visual characterwise. var headOffset = !cursorIsBefore(head, anchor) ? -1 : 0; var anchorOffset = cursorIsBefore(head, anchor) ? -1 : 0; head = offsetCursor(head, 0, headOffset); anchor = offsetCursor(anchor, 0, anchorOffset); vim.sel = { anchor: anchor, head: head }; updateMark(cm, vim, '<', cursorMin(head, anchor)); updateMark(cm, vim, '>', cursorMax(head, anchor)); } else if (!vim.insertMode) { // Reset lastHPos if selection was modified by something outside of vim mode e.g. by mouse. vim.lastHPos = cm.getCursor().ch; } } /** Wrapper for special keys pressed in insert mode */ function InsertModeKey(keyName) { this.keyName = keyName; } /** * Handles raw key down events from the text area. * - Should only be active in insert mode. * - For recording deletes in insert mode. */ function onKeyEventTargetKeyDown(e) { var macroModeState = vimGlobalState.macroModeState; var lastChange = macroModeState.lastInsertModeChanges; var keyName = CodeMirror.keyName(e); if (!keyName) { return; } function onKeyFound() { lastChange.changes.push(new InsertModeKey(keyName)); return true; } if (keyName.indexOf('Delete') != -1 || keyName.indexOf('Backspace') != -1) { CodeMirror.lookupKey(keyName, 'vim-insert', onKeyFound); } } /** * Repeats the last edit, which includes exactly 1 command and at most 1 * insert. Operator and motion commands are read from lastEditInputState, * while action commands are read from lastEditActionCommand. * * If repeatForInsert is true, then the function was called by * exitInsertMode to repeat the insert mode changes the user just made. The * corresponding enterInsertMode call was made with a count. */ function repeatLastEdit(cm, vim, repeat, repeatForInsert) { var macroModeState = vimGlobalState.macroModeState; macroModeState.isPlaying = true; var isAction = !!vim.lastEditActionCommand; var cachedInputState = vim.inputState; function repeatCommand() { if (isAction) { commandDispatcher.processAction(cm, vim, vim.lastEditActionCommand); } else { commandDispatcher.evalInput(cm, vim); } } function repeatInsert(repeat) { if (macroModeState.lastInsertModeChanges.changes.length > 0) { // For some reason, repeat cw in desktop VIM does not repeat // insert mode changes. Will conform to that behavior. repeat = !vim.lastEditActionCommand ? 1 : repeat; var changeObject = macroModeState.lastInsertModeChanges; repeatInsertModeChanges(cm, changeObject.changes, repeat); } } vim.inputState = vim.lastEditInputState; if (isAction && vim.lastEditActionCommand.interlaceInsertRepeat) { // o and O repeat have to be interlaced with insert repeats so that the // insertions appear on separate lines instead of the last line. for (var i = 0; i < repeat; i++) { repeatCommand(); repeatInsert(1); } } else { if (!repeatForInsert) { // Hack to get the cursor to end up at the right place. If I is // repeated in insert mode repeat, cursor will be 1 insert // change set left of where it should be. repeatCommand(); } repeatInsert(repeat); } vim.inputState = cachedInputState; if (vim.insertMode && !repeatForInsert) { // Don't exit insert mode twice. If repeatForInsert is set, then we // were called by an exitInsertMode call lower on the stack. exitInsertMode(cm); } macroModeState.isPlaying = false; }; function repeatInsertModeChanges(cm, changes, repeat) { function keyHandler(binding) { if (typeof binding == 'string') { CodeMirror.commands[binding](cm); } else { binding(cm); } return true; } var head = cm.getCursor('head'); var inVisualBlock = vimGlobalState.macroModeState.lastInsertModeChanges.inVisualBlock; if (inVisualBlock) { // Set up block selection again for repeating the changes. var vim = cm.state.vim; var lastSel = vim.lastSelection; var offset = getOffset(lastSel.anchor, lastSel.head); selectForInsert(cm, head, offset.line + 1); repeat = cm.listSelections().length; cm.setCursor(head); } for (var i = 0; i < repeat; i++) { if (inVisualBlock) { cm.setCursor(offsetCursor(head, i, 0)); } for (var j = 0; j < changes.length; j++) { var change = changes[j]; if (change instanceof InsertModeKey) { CodeMirror.lookupKey(change.keyName, 'vim-insert', keyHandler); } else { var cur = cm.getCursor(); cm.replaceRange(change, cur, cur); } } } if (inVisualBlock) { cm.setCursor(offsetCursor(head, 0, 1)); } } resetVimGlobalState(); return vimApi; }; // Initialize Vim and make it available as an API. CodeMirror.Vim = Vim(); }); web2py-2.12.3.orig/applications/admin/static/codemirror/keymap/emacs.js0000664000000000000000000003203012564727254024610 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var Pos = CodeMirror.Pos; function posEq(a, b) { return a.line == b.line && a.ch == b.ch; } // Kill 'ring' var killRing = []; function addToRing(str) { killRing.push(str); if (killRing.length > 50) killRing.shift(); } function growRingTop(str) { if (!killRing.length) return addToRing(str); killRing[killRing.length - 1] += str; } function getFromRing(n) { return killRing[killRing.length - (n ? Math.min(n, 1) : 1)] || ""; } function popFromRing() { if (killRing.length > 1) killRing.pop(); return getFromRing(); } var lastKill = null; function kill(cm, from, to, mayGrow, text) { if (text == null) text = cm.getRange(from, to); if (mayGrow && lastKill && lastKill.cm == cm && posEq(from, lastKill.pos) && cm.isClean(lastKill.gen)) growRingTop(text); else addToRing(text); cm.replaceRange("", from, to, "+delete"); if (mayGrow) lastKill = {cm: cm, pos: from, gen: cm.changeGeneration()}; else lastKill = null; } // Boundaries of various units function byChar(cm, pos, dir) { return cm.findPosH(pos, dir, "char", true); } function byWord(cm, pos, dir) { return cm.findPosH(pos, dir, "word", true); } function byLine(cm, pos, dir) { return cm.findPosV(pos, dir, "line", cm.doc.sel.goalColumn); } function byPage(cm, pos, dir) { return cm.findPosV(pos, dir, "page", cm.doc.sel.goalColumn); } function byParagraph(cm, pos, dir) { var no = pos.line, line = cm.getLine(no); var sawText = /\S/.test(dir < 0 ? line.slice(0, pos.ch) : line.slice(pos.ch)); var fst = cm.firstLine(), lst = cm.lastLine(); for (;;) { no += dir; if (no < fst || no > lst) return cm.clipPos(Pos(no - dir, dir < 0 ? 0 : null)); line = cm.getLine(no); var hasText = /\S/.test(line); if (hasText) sawText = true; else if (sawText) return Pos(no, 0); } } function bySentence(cm, pos, dir) { var line = pos.line, ch = pos.ch; var text = cm.getLine(pos.line), sawWord = false; for (;;) { var next = text.charAt(ch + (dir < 0 ? -1 : 0)); if (!next) { // End/beginning of line reached if (line == (dir < 0 ? cm.firstLine() : cm.lastLine())) return Pos(line, ch); text = cm.getLine(line + dir); if (!/\S/.test(text)) return Pos(line, ch); line += dir; ch = dir < 0 ? text.length : 0; continue; } if (sawWord && /[!?.]/.test(next)) return Pos(line, ch + (dir > 0 ? 1 : 0)); if (!sawWord) sawWord = /\w/.test(next); ch += dir; } } function byExpr(cm, pos, dir) { var wrap; if (cm.findMatchingBracket && (wrap = cm.findMatchingBracket(pos, true)) && wrap.match && (wrap.forward ? 1 : -1) == dir) return dir > 0 ? Pos(wrap.to.line, wrap.to.ch + 1) : wrap.to; for (var first = true;; first = false) { var token = cm.getTokenAt(pos); var after = Pos(pos.line, dir < 0 ? token.start : token.end); if (first && dir > 0 && token.end == pos.ch || !/\w/.test(token.string)) { var newPos = cm.findPosH(after, dir, "char"); if (posEq(after, newPos)) return pos; else pos = newPos; } else { return after; } } } // Prefixes (only crudely supported) function getPrefix(cm, precise) { var digits = cm.state.emacsPrefix; if (!digits) return precise ? null : 1; clearPrefix(cm); return digits == "-" ? -1 : Number(digits); } function repeated(cmd) { var f = typeof cmd == "string" ? function(cm) { cm.execCommand(cmd); } : cmd; return function(cm) { var prefix = getPrefix(cm); f(cm); for (var i = 1; i < prefix; ++i) f(cm); }; } function findEnd(cm, pos, by, dir) { var prefix = getPrefix(cm); if (prefix < 0) { dir = -dir; prefix = -prefix; } for (var i = 0; i < prefix; ++i) { var newPos = by(cm, pos, dir); if (posEq(newPos, pos)) break; pos = newPos; } return pos; } function move(by, dir) { var f = function(cm) { cm.extendSelection(findEnd(cm, cm.getCursor(), by, dir)); }; f.motion = true; return f; } function killTo(cm, by, dir) { var selections = cm.listSelections(), cursor; var i = selections.length; while (i--) { cursor = selections[i].head; kill(cm, cursor, findEnd(cm, cursor, by, dir), true); } } function killRegion(cm) { if (cm.somethingSelected()) { var selections = cm.listSelections(), selection; var i = selections.length; while (i--) { selection = selections[i]; kill(cm, selection.anchor, selection.head); } return true; } } function addPrefix(cm, digit) { if (cm.state.emacsPrefix) { if (digit != "-") cm.state.emacsPrefix += digit; return; } // Not active yet cm.state.emacsPrefix = digit; cm.on("keyHandled", maybeClearPrefix); cm.on("inputRead", maybeDuplicateInput); } var prefixPreservingKeys = {"Alt-G": true, "Ctrl-X": true, "Ctrl-Q": true, "Ctrl-U": true}; function maybeClearPrefix(cm, arg) { if (!cm.state.emacsPrefixMap && !prefixPreservingKeys.hasOwnProperty(arg)) clearPrefix(cm); } function clearPrefix(cm) { cm.state.emacsPrefix = null; cm.off("keyHandled", maybeClearPrefix); cm.off("inputRead", maybeDuplicateInput); } function maybeDuplicateInput(cm, event) { var dup = getPrefix(cm); if (dup > 1 && event.origin == "+input") { var one = event.text.join("\n"), txt = ""; for (var i = 1; i < dup; ++i) txt += one; cm.replaceSelection(txt); } } function addPrefixMap(cm) { cm.state.emacsPrefixMap = true; cm.addKeyMap(prefixMap); cm.on("keyHandled", maybeRemovePrefixMap); cm.on("inputRead", maybeRemovePrefixMap); } function maybeRemovePrefixMap(cm, arg) { if (typeof arg == "string" && (/^\d$/.test(arg) || arg == "Ctrl-U")) return; cm.removeKeyMap(prefixMap); cm.state.emacsPrefixMap = false; cm.off("keyHandled", maybeRemovePrefixMap); cm.off("inputRead", maybeRemovePrefixMap); } // Utilities function setMark(cm) { cm.setCursor(cm.getCursor()); cm.setExtending(!cm.getExtending()); cm.on("change", function() { cm.setExtending(false); }); } function clearMark(cm) { cm.setExtending(false); cm.setCursor(cm.getCursor()); } function getInput(cm, msg, f) { if (cm.openDialog) cm.openDialog(msg + ": ", f, {bottom: true}); else f(prompt(msg, "")); } function operateOnWord(cm, op) { var start = cm.getCursor(), end = cm.findPosH(start, 1, "word"); cm.replaceRange(op(cm.getRange(start, end)), start, end); cm.setCursor(end); } function toEnclosingExpr(cm) { var pos = cm.getCursor(), line = pos.line, ch = pos.ch; var stack = []; while (line >= cm.firstLine()) { var text = cm.getLine(line); for (var i = ch == null ? text.length : ch; i > 0;) { var ch = text.charAt(--i); if (ch == ")") stack.push("("); else if (ch == "]") stack.push("["); else if (ch == "}") stack.push("{"); else if (/[\(\{\[]/.test(ch) && (!stack.length || stack.pop() != ch)) return cm.extendSelection(Pos(line, i)); } --line; ch = null; } } function quit(cm) { cm.execCommand("clearSearch"); clearMark(cm); } // Actual keymap var keyMap = CodeMirror.keyMap.emacs = CodeMirror.normalizeKeyMap({ "Ctrl-W": function(cm) {kill(cm, cm.getCursor("start"), cm.getCursor("end"));}, "Ctrl-K": repeated(function(cm) { var start = cm.getCursor(), end = cm.clipPos(Pos(start.line)); var text = cm.getRange(start, end); if (!/\S/.test(text)) { text += "\n"; end = Pos(start.line + 1, 0); } kill(cm, start, end, true, text); }), "Alt-W": function(cm) { addToRing(cm.getSelection()); clearMark(cm); }, "Ctrl-Y": function(cm) { var start = cm.getCursor(); cm.replaceRange(getFromRing(getPrefix(cm)), start, start, "paste"); cm.setSelection(start, cm.getCursor()); }, "Alt-Y": function(cm) {cm.replaceSelection(popFromRing(), "around", "paste");}, "Ctrl-Space": setMark, "Ctrl-Shift-2": setMark, "Ctrl-F": move(byChar, 1), "Ctrl-B": move(byChar, -1), "Right": move(byChar, 1), "Left": move(byChar, -1), "Ctrl-D": function(cm) { killTo(cm, byChar, 1); }, "Delete": function(cm) { killRegion(cm) || killTo(cm, byChar, 1); }, "Ctrl-H": function(cm) { killTo(cm, byChar, -1); }, "Backspace": function(cm) { killRegion(cm) || killTo(cm, byChar, -1); }, "Alt-F": move(byWord, 1), "Alt-B": move(byWord, -1), "Alt-D": function(cm) { killTo(cm, byWord, 1); }, "Alt-Backspace": function(cm) { killTo(cm, byWord, -1); }, "Ctrl-N": move(byLine, 1), "Ctrl-P": move(byLine, -1), "Down": move(byLine, 1), "Up": move(byLine, -1), "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", "End": "goLineEnd", "Home": "goLineStart", "Alt-V": move(byPage, -1), "Ctrl-V": move(byPage, 1), "PageUp": move(byPage, -1), "PageDown": move(byPage, 1), "Ctrl-Up": move(byParagraph, -1), "Ctrl-Down": move(byParagraph, 1), "Alt-A": move(bySentence, -1), "Alt-E": move(bySentence, 1), "Alt-K": function(cm) { killTo(cm, bySentence, 1); }, "Ctrl-Alt-K": function(cm) { killTo(cm, byExpr, 1); }, "Ctrl-Alt-Backspace": function(cm) { killTo(cm, byExpr, -1); }, "Ctrl-Alt-F": move(byExpr, 1), "Ctrl-Alt-B": move(byExpr, -1), "Shift-Ctrl-Alt-2": function(cm) { var cursor = cm.getCursor(); cm.setSelection(findEnd(cm, cursor, byExpr, 1), cursor); }, "Ctrl-Alt-T": function(cm) { var leftStart = byExpr(cm, cm.getCursor(), -1), leftEnd = byExpr(cm, leftStart, 1); var rightEnd = byExpr(cm, leftEnd, 1), rightStart = byExpr(cm, rightEnd, -1); cm.replaceRange(cm.getRange(rightStart, rightEnd) + cm.getRange(leftEnd, rightStart) + cm.getRange(leftStart, leftEnd), leftStart, rightEnd); }, "Ctrl-Alt-U": repeated(toEnclosingExpr), "Alt-Space": function(cm) { var pos = cm.getCursor(), from = pos.ch, to = pos.ch, text = cm.getLine(pos.line); while (from && /\s/.test(text.charAt(from - 1))) --from; while (to < text.length && /\s/.test(text.charAt(to))) ++to; cm.replaceRange(" ", Pos(pos.line, from), Pos(pos.line, to)); }, "Ctrl-O": repeated(function(cm) { cm.replaceSelection("\n", "start"); }), "Ctrl-T": repeated(function(cm) { cm.execCommand("transposeChars"); }), "Alt-C": repeated(function(cm) { operateOnWord(cm, function(w) { var letter = w.search(/\w/); if (letter == -1) return w; return w.slice(0, letter) + w.charAt(letter).toUpperCase() + w.slice(letter + 1).toLowerCase(); }); }), "Alt-U": repeated(function(cm) { operateOnWord(cm, function(w) { return w.toUpperCase(); }); }), "Alt-L": repeated(function(cm) { operateOnWord(cm, function(w) { return w.toLowerCase(); }); }), "Alt-;": "toggleComment", "Ctrl-/": repeated("undo"), "Shift-Ctrl--": repeated("undo"), "Ctrl-Z": repeated("undo"), "Cmd-Z": repeated("undo"), "Shift-Alt-,": "goDocStart", "Shift-Alt-.": "goDocEnd", "Ctrl-S": "findNext", "Ctrl-R": "findPrev", "Ctrl-G": quit, "Shift-Alt-5": "replace", "Alt-/": "autocomplete", "Ctrl-J": "newlineAndIndent", "Enter": false, "Tab": "indentAuto", "Alt-G G": function(cm) { var prefix = getPrefix(cm, true); if (prefix != null && prefix > 0) return cm.setCursor(prefix - 1); getInput(cm, "Goto line", function(str) { var num; if (str && !isNaN(num = Number(str)) && num == num|0 && num > 0) cm.setCursor(num - 1); }); }, "Ctrl-X Tab": function(cm) { cm.indentSelection(getPrefix(cm, true) || cm.getOption("indentUnit")); }, "Ctrl-X Ctrl-X": function(cm) { cm.setSelection(cm.getCursor("head"), cm.getCursor("anchor")); }, "Ctrl-X Ctrl-S": "save", "Ctrl-X Ctrl-W": "save", "Ctrl-X S": "saveAll", "Ctrl-X F": "open", "Ctrl-X U": repeated("undo"), "Ctrl-X K": "close", "Ctrl-X Delete": function(cm) { kill(cm, cm.getCursor(), bySentence(cm, cm.getCursor(), 1), true); }, "Ctrl-X H": "selectAll", "Ctrl-Q Tab": repeated("insertTab"), "Ctrl-U": addPrefixMap }); var prefixMap = {"Ctrl-G": clearPrefix}; function regPrefix(d) { prefixMap[d] = function(cm) { addPrefix(cm, d); }; keyMap["Ctrl-" + d] = function(cm) { addPrefix(cm, d); }; prefixPreservingKeys["Ctrl-" + d] = true; } for (var i = 0; i < 10; ++i) regPrefix(String(i)); regPrefix("-"); }); web2py-2.12.3.orig/applications/admin/static/codemirror/keymap/sublime.js0000664000000000000000000004766312564727254025202 0ustar rootroot// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // A rough approximation of Sublime Text's keybindings // Depends on addon/search/searchcursor.js and optionally addon/dialog/dialogs.js (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../lib/codemirror"), require("../addon/search/searchcursor"), require("../addon/edit/matchbrackets")); else if (typeof define == "function" && define.amd) // AMD define(["../lib/codemirror", "../addon/search/searchcursor", "../addon/edit/matchbrackets"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var map = CodeMirror.keyMap.sublime = {fallthrough: "default"}; var cmds = CodeMirror.commands; var Pos = CodeMirror.Pos; var mac = CodeMirror.keyMap["default"] == CodeMirror.keyMap.macDefault; var ctrl = mac ? "Cmd-" : "Ctrl-"; // This is not exactly Sublime's algorithm. I couldn't make heads or tails of that. function findPosSubword(doc, start, dir) { if (dir < 0 && start.ch == 0) return doc.clipPos(Pos(start.line - 1)); var line = doc.getLine(start.line); if (dir > 0 && start.ch >= line.length) return doc.clipPos(Pos(start.line + 1, 0)); var state = "start", type; for (var pos = start.ch, e = dir < 0 ? 0 : line.length, i = 0; pos != e; pos += dir, i++) { var next = line.charAt(dir < 0 ? pos - 1 : pos); var cat = next != "_" && CodeMirror.isWordChar(next) ? "w" : "o"; if (cat == "w" && next.toUpperCase() == next) cat = "W"; if (state == "start") { if (cat != "o") { state = "in"; type = cat; } } else if (state == "in") { if (type != cat) { if (type == "w" && cat == "W" && dir < 0) pos--; if (type == "W" && cat == "w" && dir > 0) { type = "w"; continue; } break; } } } return Pos(start.line, pos); } function moveSubword(cm, dir) { cm.extendSelectionsBy(function(range) { if (cm.display.shift || cm.doc.extend || range.empty()) return findPosSubword(cm.doc, range.head, dir); else return dir < 0 ? range.from() : range.to(); }); } cmds[map["Alt-Left"] = "goSubwordLeft"] = function(cm) { moveSubword(cm, -1); }; cmds[map["Alt-Right"] = "goSubwordRight"] = function(cm) { moveSubword(cm, 1); }; cmds[map[ctrl + "Up"] = "scrollLineUp"] = function(cm) { var info = cm.getScrollInfo(); if (!cm.somethingSelected()) { var visibleBottomLine = cm.lineAtHeight(info.top + info.clientHeight, "local"); if (cm.getCursor().line >= visibleBottomLine) cm.execCommand("goLineUp"); } cm.scrollTo(null, info.top - cm.defaultTextHeight()); }; cmds[map[ctrl + "Down"] = "scrollLineDown"] = function(cm) { var info = cm.getScrollInfo(); if (!cm.somethingSelected()) { var visibleTopLine = cm.lineAtHeight(info.top, "local")+1; if (cm.getCursor().line <= visibleTopLine) cm.execCommand("goLineDown"); } cm.scrollTo(null, info.top + cm.defaultTextHeight()); }; cmds[map["Shift-" + ctrl + "L"] = "splitSelectionByLine"] = function(cm) { var ranges = cm.listSelections(), lineRanges = []; for (var i = 0; i < ranges.length; i++) { var from = ranges[i].from(), to = ranges[i].to(); for (var line = from.line; line <= to.line; ++line) if (!(to.line > from.line && line == to.line && to.ch == 0)) lineRanges.push({anchor: line == from.line ? from : Pos(line, 0), head: line == to.line ? to : Pos(line)}); } cm.setSelections(lineRanges, 0); }; map["Shift-Tab"] = "indentLess"; cmds[map["Esc"] = "singleSelectionTop"] = function(cm) { var range = cm.listSelections()[0]; cm.setSelection(range.anchor, range.head, {scroll: false}); }; cmds[map[ctrl + "L"] = "selectLine"] = function(cm) { var ranges = cm.listSelections(), extended = []; for (var i = 0; i < ranges.length; i++) { var range = ranges[i]; extended.push({anchor: Pos(range.from().line, 0), head: Pos(range.to().line + 1, 0)}); } cm.setSelections(extended); }; map["Shift-" + ctrl + "K"] = "deleteLine"; function insertLine(cm, above) { cm.operation(function() { var len = cm.listSelections().length, newSelection = [], last = -1; for (var i = 0; i < len; i++) { var head = cm.listSelections()[i].head; if (head.line <= last) continue; var at = Pos(head.line + (above ? 0 : 1), 0); cm.replaceRange("\n", at, null, "+insertLine"); cm.indentLine(at.line, null, true); newSelection.push({head: at, anchor: at}); last = head.line + 1; } cm.setSelections(newSelection); }); } cmds[map[ctrl + "Enter"] = "insertLineAfter"] = function(cm) { insertLine(cm, false); }; cmds[map["Shift-" + ctrl + "Enter"] = "insertLineBefore"] = function(cm) { insertLine(cm, true); }; function wordAt(cm, pos) { var start = pos.ch, end = start, line = cm.getLine(pos.line); while (start && CodeMirror.isWordChar(line.charAt(start - 1))) --start; while (end < line.length && CodeMirror.isWordChar(line.charAt(end))) ++end; return {from: Pos(pos.line, start), to: Pos(pos.line, end), word: line.slice(start, end)}; } cmds[map[ctrl + "D"] = "selectNextOccurrence"] = function(cm) { var from = cm.getCursor("from"), to = cm.getCursor("to"); var fullWord = cm.state.sublimeFindFullWord == cm.doc.sel; if (CodeMirror.cmpPos(from, to) == 0) { var word = wordAt(cm, from); if (!word.word) return; cm.setSelection(word.from, word.to); fullWord = true; } else { var text = cm.getRange(from, to); var query = fullWord ? new RegExp("\\b" + text + "\\b") : text; var cur = cm.getSearchCursor(query, to); if (cur.findNext()) { cm.addSelection(cur.from(), cur.to()); } else { cur = cm.getSearchCursor(query, Pos(cm.firstLine(), 0)); if (cur.findNext()) cm.addSelection(cur.from(), cur.to()); } } if (fullWord) cm.state.sublimeFindFullWord = cm.doc.sel; }; var mirror = "(){}[]"; function selectBetweenBrackets(cm) { var pos = cm.getCursor(), opening = cm.scanForBracket(pos, -1); if (!opening) return; for (;;) { var closing = cm.scanForBracket(pos, 1); if (!closing) return; if (closing.ch == mirror.charAt(mirror.indexOf(opening.ch) + 1)) { cm.setSelection(Pos(opening.pos.line, opening.pos.ch + 1), closing.pos, false); return true; } pos = Pos(closing.pos.line, closing.pos.ch + 1); } } cmds[map["Shift-" + ctrl + "Space"] = "selectScope"] = function(cm) { selectBetweenBrackets(cm) || cm.execCommand("selectAll"); }; cmds[map["Shift-" + ctrl + "M"] = "selectBetweenBrackets"] = function(cm) { if (!selectBetweenBrackets(cm)) return CodeMirror.Pass; }; cmds[map[ctrl + "M"] = "goToBracket"] = function(cm) { cm.extendSelectionsBy(function(range) { var next = cm.scanForBracket(range.head, 1); if (next && CodeMirror.cmpPos(next.pos, range.head) != 0) return next.pos; var prev = cm.scanForBracket(range.head, -1); return prev && Pos(prev.pos.line, prev.pos.ch + 1) || range.head; }); }; var swapLineCombo = mac ? "Cmd-Ctrl-" : "Shift-Ctrl-"; cmds[map[swapLineCombo + "Up"] = "swapLineUp"] = function(cm) { var ranges = cm.listSelections(), linesToMove = [], at = cm.firstLine() - 1, newSels = []; for (var i = 0; i < ranges.length; i++) { var range = ranges[i], from = range.from().line - 1, to = range.to().line; newSels.push({anchor: Pos(range.anchor.line - 1, range.anchor.ch), head: Pos(range.head.line - 1, range.head.ch)}); if (range.to().ch == 0 && !range.empty()) --to; if (from > at) linesToMove.push(from, to); else if (linesToMove.length) linesToMove[linesToMove.length - 1] = to; at = to; } cm.operation(function() { for (var i = 0; i < linesToMove.length; i += 2) { var from = linesToMove[i], to = linesToMove[i + 1]; var line = cm.getLine(from); cm.replaceRange("", Pos(from, 0), Pos(from + 1, 0), "+swapLine"); if (to > cm.lastLine()) cm.replaceRange("\n" + line, Pos(cm.lastLine()), null, "+swapLine"); else cm.replaceRange(line + "\n", Pos(to, 0), null, "+swapLine"); } cm.setSelections(newSels); cm.scrollIntoView(); }); }; cmds[map[swapLineCombo + "Down"] = "swapLineDown"] = function(cm) { var ranges = cm.listSelections(), linesToMove = [], at = cm.lastLine() + 1; for (var i = ranges.length - 1; i >= 0; i--) { var range = ranges[i], from = range.to().line + 1, to = range.from().line; if (range.to().ch == 0 && !range.empty()) from--; if (from < at) linesToMove.push(from, to); else if (linesToMove.length) linesToMove[linesToMove.length - 1] = to; at = to; } cm.operation(function() { for (var i = linesToMove.length - 2; i >= 0; i -= 2) { var from = linesToMove[i], to = linesToMove[i + 1]; var line = cm.getLine(from); if (from == cm.lastLine()) cm.replaceRange("", Pos(from - 1), Pos(from), "+swapLine"); else cm.replaceRange("", Pos(from, 0), Pos(from + 1, 0), "+swapLine"); cm.replaceRange(line + "\n", Pos(to, 0), null, "+swapLine"); } cm.scrollIntoView(); }); }; map[ctrl + "/"] = "toggleComment"; cmds[map[ctrl + "J"] = "joinLines"] = function(cm) { var ranges = cm.listSelections(), joined = []; for (var i = 0; i < ranges.length; i++) { var range = ranges[i], from = range.from(); var start = from.line, end = range.to().line; while (i < ranges.length - 1 && ranges[i + 1].from().line == end) end = ranges[++i].to().line; joined.push({start: start, end: end, anchor: !range.empty() && from}); } cm.operation(function() { var offset = 0, ranges = []; for (var i = 0; i < joined.length; i++) { var obj = joined[i]; var anchor = obj.anchor && Pos(obj.anchor.line - offset, obj.anchor.ch), head; for (var line = obj.start; line <= obj.end; line++) { var actual = line - offset; if (line == obj.end) head = Pos(actual, cm.getLine(actual).length + 1); if (actual < cm.lastLine()) { cm.replaceRange(" ", Pos(actual), Pos(actual + 1, /^\s*/.exec(cm.getLine(actual + 1))[0].length)); ++offset; } } ranges.push({anchor: anchor || head, head: head}); } cm.setSelections(ranges, 0); }); }; cmds[map["Shift-" + ctrl + "D"] = "duplicateLine"] = function(cm) { cm.operation(function() { var rangeCount = cm.listSelections().length; for (var i = 0; i < rangeCount; i++) { var range = cm.listSelections()[i]; if (range.empty()) cm.replaceRange(cm.getLine(range.head.line) + "\n", Pos(range.head.line, 0)); else cm.replaceRange(cm.getRange(range.from(), range.to()), range.from()); } cm.scrollIntoView(); }); }; map[ctrl + "T"] = "transposeChars"; function sortLines(cm, caseSensitive) { var ranges = cm.listSelections(), toSort = [], selected; for (var i = 0; i < ranges.length; i++) { var range = ranges[i]; if (range.empty()) continue; var from = range.from().line, to = range.to().line; while (i < ranges.length - 1 && ranges[i + 1].from().line == to) to = range[++i].to().line; toSort.push(from, to); } if (toSort.length) selected = true; else toSort.push(cm.firstLine(), cm.lastLine()); cm.operation(function() { var ranges = []; for (var i = 0; i < toSort.length; i += 2) { var from = toSort[i], to = toSort[i + 1]; var start = Pos(from, 0), end = Pos(to); var lines = cm.getRange(start, end, false); if (caseSensitive) lines.sort(); else lines.sort(function(a, b) { var au = a.toUpperCase(), bu = b.toUpperCase(); if (au != bu) { a = au; b = bu; } return a < b ? -1 : a == b ? 0 : 1; }); cm.replaceRange(lines, start, end); if (selected) ranges.push({anchor: start, head: end}); } if (selected) cm.setSelections(ranges, 0); }); } cmds[map["F9"] = "sortLines"] = function(cm) { sortLines(cm, true); }; cmds[map[ctrl + "F9"] = "sortLinesInsensitive"] = function(cm) { sortLines(cm, false); }; cmds[map["F2"] = "nextBookmark"] = function(cm) { var marks = cm.state.sublimeBookmarks; if (marks) while (marks.length) { var current = marks.shift(); var found = current.find(); if (found) { marks.push(current); return cm.setSelection(found.from, found.to); } } }; cmds[map["Shift-F2"] = "prevBookmark"] = function(cm) { var marks = cm.state.sublimeBookmarks; if (marks) while (marks.length) { marks.unshift(marks.pop()); var found = marks[marks.length - 1].find(); if (!found) marks.pop(); else return cm.setSelection(found.from, found.to); } }; cmds[map[ctrl + "F2"] = "toggleBookmark"] = function(cm) { var ranges = cm.listSelections(); var marks = cm.state.sublimeBookmarks || (cm.state.sublimeBookmarks = []); for (var i = 0; i < ranges.length; i++) { var from = ranges[i].from(), to = ranges[i].to(); var found = cm.findMarks(from, to); for (var j = 0; j < found.length; j++) { if (found[j].sublimeBookmark) { found[j].clear(); for (var k = 0; k < marks.length; k++) if (marks[k] == found[j]) marks.splice(k--, 1); break; } } if (j == found.length) marks.push(cm.markText(from, to, {sublimeBookmark: true, clearWhenEmpty: false})); } }; cmds[map["Shift-" + ctrl + "F2"] = "clearBookmarks"] = function(cm) { var marks = cm.state.sublimeBookmarks; if (marks) for (var i = 0; i < marks.length; i++) marks[i].clear(); marks.length = 0; }; cmds[map["Alt-F2"] = "selectBookmarks"] = function(cm) { var marks = cm.state.sublimeBookmarks, ranges = []; if (marks) for (var i = 0; i < marks.length; i++) { var found = marks[i].find(); if (!found) marks.splice(i--, 0); else ranges.push({anchor: found.from, head: found.to}); } if (ranges.length) cm.setSelections(ranges, 0); }; map["Alt-Q"] = "wrapLines"; var cK = ctrl + "K "; function modifyWordOrSelection(cm, mod) { cm.operation(function() { var ranges = cm.listSelections(), indices = [], replacements = []; for (var i = 0; i < ranges.length; i++) { var range = ranges[i]; if (range.empty()) { indices.push(i); replacements.push(""); } else replacements.push(mod(cm.getRange(range.from(), range.to()))); } cm.replaceSelections(replacements, "around", "case"); for (var i = indices.length - 1, at; i >= 0; i--) { var range = ranges[indices[i]]; if (at && CodeMirror.cmpPos(range.head, at) > 0) continue; var word = wordAt(cm, range.head); at = word.from; cm.replaceRange(mod(word.word), word.from, word.to); } }); } map[cK + ctrl + "Backspace"] = "delLineLeft"; cmds[map[cK + ctrl + "K"] = "delLineRight"] = function(cm) { cm.operation(function() { var ranges = cm.listSelections(); for (var i = ranges.length - 1; i >= 0; i--) cm.replaceRange("", ranges[i].anchor, Pos(ranges[i].to().line), "+delete"); cm.scrollIntoView(); }); }; cmds[map[cK + ctrl + "U"] = "upcaseAtCursor"] = function(cm) { modifyWordOrSelection(cm, function(str) { return str.toUpperCase(); }); }; cmds[map[cK + ctrl + "L"] = "downcaseAtCursor"] = function(cm) { modifyWordOrSelection(cm, function(str) { return str.toLowerCase(); }); }; cmds[map[cK + ctrl + "Space"] = "setSublimeMark"] = function(cm) { if (cm.state.sublimeMark) cm.state.sublimeMark.clear(); cm.state.sublimeMark = cm.setBookmark(cm.getCursor()); }; cmds[map[cK + ctrl + "A"] = "selectToSublimeMark"] = function(cm) { var found = cm.state.sublimeMark && cm.state.sublimeMark.find(); if (found) cm.setSelection(cm.getCursor(), found); }; cmds[map[cK + ctrl + "W"] = "deleteToSublimeMark"] = function(cm) { var found = cm.state.sublimeMark && cm.state.sublimeMark.find(); if (found) { var from = cm.getCursor(), to = found; if (CodeMirror.cmpPos(from, to) > 0) { var tmp = to; to = from; from = tmp; } cm.state.sublimeKilled = cm.getRange(from, to); cm.replaceRange("", from, to); } }; cmds[map[cK + ctrl + "X"] = "swapWithSublimeMark"] = function(cm) { var found = cm.state.sublimeMark && cm.state.sublimeMark.find(); if (found) { cm.state.sublimeMark.clear(); cm.state.sublimeMark = cm.setBookmark(cm.getCursor()); cm.setCursor(found); } }; cmds[map[cK + ctrl + "Y"] = "sublimeYank"] = function(cm) { if (cm.state.sublimeKilled != null) cm.replaceSelection(cm.state.sublimeKilled, null, "paste"); }; map[cK + ctrl + "G"] = "clearBookmarks"; cmds[map[cK + ctrl + "C"] = "showInCenter"] = function(cm) { var pos = cm.cursorCoords(null, "local"); cm.scrollTo(null, (pos.top + pos.bottom) / 2 - cm.getScrollInfo().clientHeight / 2); }; cmds[map["Shift-Alt-Up"] = "selectLinesUpward"] = function(cm) { cm.operation(function() { var ranges = cm.listSelections(); for (var i = 0; i < ranges.length; i++) { var range = ranges[i]; if (range.head.line > cm.firstLine()) cm.addSelection(Pos(range.head.line - 1, range.head.ch)); } }); }; cmds[map["Shift-Alt-Down"] = "selectLinesDownward"] = function(cm) { cm.operation(function() { var ranges = cm.listSelections(); for (var i = 0; i < ranges.length; i++) { var range = ranges[i]; if (range.head.line < cm.lastLine()) cm.addSelection(Pos(range.head.line + 1, range.head.ch)); } }); }; function getTarget(cm) { var from = cm.getCursor("from"), to = cm.getCursor("to"); if (CodeMirror.cmpPos(from, to) == 0) { var word = wordAt(cm, from); if (!word.word) return; from = word.from; to = word.to; } return {from: from, to: to, query: cm.getRange(from, to), word: word}; } function findAndGoTo(cm, forward) { var target = getTarget(cm); if (!target) return; var query = target.query; var cur = cm.getSearchCursor(query, forward ? target.to : target.from); if (forward ? cur.findNext() : cur.findPrevious()) { cm.setSelection(cur.from(), cur.to()); } else { cur = cm.getSearchCursor(query, forward ? Pos(cm.firstLine(), 0) : cm.clipPos(Pos(cm.lastLine()))); if (forward ? cur.findNext() : cur.findPrevious()) cm.setSelection(cur.from(), cur.to()); else if (target.word) cm.setSelection(target.from, target.to); } }; cmds[map[ctrl + "F3"] = "findUnder"] = function(cm) { findAndGoTo(cm, true); }; cmds[map["Shift-" + ctrl + "F3"] = "findUnderPrevious"] = function(cm) { findAndGoTo(cm,false); }; cmds[map["Alt-F3"] = "findAllUnder"] = function(cm) { var target = getTarget(cm); if (!target) return; var cur = cm.getSearchCursor(target.query); var matches = []; var primaryIndex = -1; while (cur.findNext()) { matches.push({anchor: cur.from(), head: cur.to()}); if (cur.from().line <= target.from.line && cur.from().ch <= target.from.ch) primaryIndex++; } cm.setSelections(matches, primaryIndex); }; map["Shift-" + ctrl + "["] = "fold"; map["Shift-" + ctrl + "]"] = "unfold"; map[cK + ctrl + "0"] = map[cK + ctrl + "j"] = "unfoldAll"; map[ctrl + "I"] = "findIncremental"; map["Shift-" + ctrl + "I"] = "findIncrementalReverse"; map[ctrl + "H"] = "replace"; map["F3"] = "findNext"; map["Shift-F3"] = "findPrev"; CodeMirror.normalizeKeyMap(map); }); web2py-2.12.3.orig/applications/admin/static/codemirror/theme/0000775000000000000000000000000012564727254023000 5ustar rootrootweb2py-2.12.3.orig/applications/admin/static/codemirror/theme/web2py.css0000664000000000000000000000237412564727254024730 0ustar rootroot.cm-s-web2py span.cm-meta {color: #FF1717;} .cm-s-web2py span.cm-keyword { line-height: 1em; font-weight: bold; color: #7F0055; } .cm-s-web2py span.cm-atom {color: #219;} .cm-s-web2py span.cm-number {color: #164;} .cm-s-web2py span.cm-def {color: #00f;} .cm-s-web2py span.cm-variable {color: black;} .cm-s-web2py span.cm-variable-2 {color: #0000C0;} .cm-s-web2py span.cm-variable-3 {color: #0000C0;} .cm-s-web2py span.cm-property {color: black;} .cm-s-web2py span.cm-operator {color: black;} .cm-s-web2py span.cm-comment {color: #3F7F5F;} .cm-s-web2py span.cm-string {color: #2A00FF;} .cm-s-web2py span.cm-string-2 {color: #f50;} .cm-s-web2py span.cm-error {color: #f00;} .cm-s-web2py span.cm-qualifier {color: #555;} .cm-s-web2py span.cm-builtin {color: #30a;} .cm-s-web2py span.cm-bracket {color: #cc7;} .cm-s-web2py span.cm-tag {color: #170;} .cm-s-web2py span.cm-attribute {color: #00c;} .cm-s-web2py span.cm-link {color: #219;} .cm-s-web2py .CodeMirror-matchingbracket { border:1px solid grey; color:black !important;; } /* Editor styling */ .cm-s-web2py { line-height: 1.40em; font-family: Monaco, Menlo,"Andale Mono","lucida console","Courier New",monospace !important; background: white; } .CodeMirror-activeline-background {background: #e8f2ff !important;} web2py-2.12.3.orig/applications/admin/static/codemirror/theme/base16-light.css0000664000000000000000000000327012564727254025702 0ustar rootroot/* Name: Base16 Default Light Author: Chris Kempson (http://chriskempson.com) CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-chrome-devtools) Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ .cm-s-base16-light.CodeMirror {background: #f5f5f5; color: #202020;} .cm-s-base16-light div.CodeMirror-selected {background: #e0e0e0 !important;} .cm-s-base16-light .CodeMirror-gutters {background: #f5f5f5; border-right: 0px;} .cm-s-base16-light .CodeMirror-guttermarker { color: #ac4142; } .cm-s-base16-light .CodeMirror-guttermarker-subtle { color: #b0b0b0; } .cm-s-base16-light .CodeMirror-linenumber {color: #b0b0b0;} .cm-s-base16-light .CodeMirror-cursor {border-left: 1px solid #505050 !important;} .cm-s-base16-light span.cm-comment {color: #8f5536;} .cm-s-base16-light span.cm-atom {color: #aa759f;} .cm-s-base16-light span.cm-number {color: #aa759f;} .cm-s-base16-light span.cm-property, .cm-s-base16-light span.cm-attribute {color: #90a959;} .cm-s-base16-light span.cm-keyword {color: #ac4142;} .cm-s-base16-light span.cm-string {color: #f4bf75;} .cm-s-base16-light span.cm-variable {color: #90a959;} .cm-s-base16-light span.cm-variable-2 {color: #6a9fb5;} .cm-s-base16-light span.cm-def {color: #d28445;} .cm-s-base16-light span.cm-bracket {color: #202020;} .cm-s-base16-light span.cm-tag {color: #ac4142;} .cm-s-base16-light span.cm-link {color: #aa759f;} .cm-s-base16-light span.cm-error {background: #ac4142; color: #505050;} .cm-s-base16-light .CodeMirror-activeline-background {background: #DDDCDC !important;} .cm-s-base16-light .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} web2py-2.12.3.orig/applications/admin/static/codemirror/theme/mbo.css0000664000000000000000000000327512564727254024276 0ustar rootroot/****************************************************************/ /* Based on mbonaci's Brackets mbo theme */ /* https://github.com/mbonaci/global/blob/master/Mbo.tmTheme */ /* Create your own: http://tmtheme-editor.herokuapp.com */ /****************************************************************/ .cm-s-mbo.CodeMirror {background: #2c2c2c; color: #ffffec;} .cm-s-mbo div.CodeMirror-selected {background: #716C62 !important;} .cm-s-mbo .CodeMirror-gutters {background: #4e4e4e; border-right: 0px;} .cm-s-mbo .CodeMirror-guttermarker { color: white; } .cm-s-mbo .CodeMirror-guttermarker-subtle { color: grey; } .cm-s-mbo .CodeMirror-linenumber {color: #dadada;} .cm-s-mbo .CodeMirror-cursor {border-left: 1px solid #ffffec !important;} .cm-s-mbo span.cm-comment {color: #95958a;} .cm-s-mbo span.cm-atom {color: #00a8c6;} .cm-s-mbo span.cm-number {color: #00a8c6;} .cm-s-mbo span.cm-property, .cm-s-mbo span.cm-attribute {color: #9ddfe9;} .cm-s-mbo span.cm-keyword {color: #ffb928;} .cm-s-mbo span.cm-string {color: #ffcf6c;} .cm-s-mbo span.cm-string.cm-property {color: #ffffec;} .cm-s-mbo span.cm-variable {color: #ffffec;} .cm-s-mbo span.cm-variable-2 {color: #00a8c6;} .cm-s-mbo span.cm-def {color: #ffffec;} .cm-s-mbo span.cm-bracket {color: #fffffc; font-weight: bold;} .cm-s-mbo span.cm-tag {color: #9ddfe9;} .cm-s-mbo span.cm-link {color: #f54b07;} .cm-s-mbo span.cm-error {border-bottom: #636363; color: #ffffec;} .cm-s-mbo span.cm-qualifier {color: #ffffec;} .cm-s-mbo .CodeMirror-activeline-background {background: #494b41 !important;} .cm-s-mbo .CodeMirror-matchingbracket {color: #222 !important;} .cm-s-mbo .CodeMirror-matchingtag {background: rgba(255, 255, 255, .37);} web2py-2.12.3.orig/applications/admin/static/codemirror/theme/colorforth.css0000664000000000000000000000321312564727254025672 0ustar rootroot.cm-s-colorforth.CodeMirror { background: #000000; color: #f8f8f8; } .cm-s-colorforth .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; } .cm-s-colorforth .CodeMirror-guttermarker { color: #FFBD40; } .cm-s-colorforth .CodeMirror-guttermarker-subtle { color: #78846f; } .cm-s-colorforth .CodeMirror-linenumber { color: #bababa; } .cm-s-colorforth .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-colorforth span.cm-comment { color: #ededed; } .cm-s-colorforth span.cm-def { color: #ff1c1c; font-weight:bold; } .cm-s-colorforth span.cm-keyword { color: #ffd900; } .cm-s-colorforth span.cm-builtin { color: #00d95a; } .cm-s-colorforth span.cm-variable { color: #73ff00; } .cm-s-colorforth span.cm-string { color: #007bff; } .cm-s-colorforth span.cm-number { color: #00c4ff; } .cm-s-colorforth span.cm-atom { color: #606060; } .cm-s-colorforth span.cm-variable-2 { color: #EEE; } .cm-s-colorforth span.cm-variable-3 { color: #DDD; } .cm-s-colorforth span.cm-property {} .cm-s-colorforth span.cm-operator {} .cm-s-colorforth span.cm-meta { color: yellow; } .cm-s-colorforth span.cm-qualifier { color: #FFF700; } .cm-s-colorforth span.cm-bracket { color: #cc7; } .cm-s-colorforth span.cm-tag { color: #FFBD40; } .cm-s-colorforth span.cm-attribute { color: #FFF700; } .cm-s-colorforth span.cm-error { color: #f00; } .cm-s-colorforth .CodeMirror-selected { background: #333d53 !important; } .cm-s-colorforth span.cm-compilation { background: rgba(255, 255, 255, 0.12); } .cm-s-colorforth .CodeMirror-activeline-background {background: #253540 !important;} web2py-2.12.3.orig/applications/admin/static/codemirror/theme/midnight.css0000664000000000000000000000331412564727254025316 0ustar rootroot/* Based on the theme at http://bonsaiden.github.com/JavaScript-Garden */ /**/ .cm-s-midnight span.CodeMirror-matchhighlight { background: #494949; } .cm-s-midnight.CodeMirror-focused span.CodeMirror-matchhighlight { background: #314D67 !important; } /**/ .cm-s-midnight .CodeMirror-activeline-background {background: #253540 !important;} .cm-s-midnight.CodeMirror { background: #0F192A; color: #D1EDFF; } .cm-s-midnight.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;} .cm-s-midnight div.CodeMirror-selected {background: #314D67 !important;} .cm-s-midnight .CodeMirror-gutters {background: #0F192A; border-right: 1px solid;} .cm-s-midnight .CodeMirror-guttermarker { color: white; } .cm-s-midnight .CodeMirror-guttermarker-subtle { color: #d0d0d0; } .cm-s-midnight .CodeMirror-linenumber {color: #D0D0D0;} .cm-s-midnight .CodeMirror-cursor { border-left: 1px solid #F8F8F0 !important; } .cm-s-midnight span.cm-comment {color: #428BDD;} .cm-s-midnight span.cm-atom {color: #AE81FF;} .cm-s-midnight span.cm-number {color: #D1EDFF;} .cm-s-midnight span.cm-property, .cm-s-midnight span.cm-attribute {color: #A6E22E;} .cm-s-midnight span.cm-keyword {color: #E83737;} .cm-s-midnight span.cm-string {color: #1DC116;} .cm-s-midnight span.cm-variable {color: #FFAA3E;} .cm-s-midnight span.cm-variable-2 {color: #FFAA3E;} .cm-s-midnight span.cm-def {color: #4DD;} .cm-s-midnight span.cm-bracket {color: #D1EDFF;} .cm-s-midnight span.cm-tag {color: #449;} .cm-s-midnight span.cm-link {color: #AE81FF;} .cm-s-midnight span.cm-error {background: #F92672; color: #F8F8F0;} .cm-s-midnight .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } web2py-2.12.3.orig/applications/admin/static/codemirror/theme/blackboard.css0000664000000000000000000000300712564727254025576 0ustar rootroot/* Port of TextMate's Blackboard theme */ .cm-s-blackboard.CodeMirror { background: #0C1021; color: #F8F8F8; } .cm-s-blackboard .CodeMirror-selected { background: #253B76 !important; } .cm-s-blackboard .CodeMirror-gutters { background: #0C1021; border-right: 0; } .cm-s-blackboard .CodeMirror-guttermarker { color: #FBDE2D; } .cm-s-blackboard .CodeMirror-guttermarker-subtle { color: #888; } .cm-s-blackboard .CodeMirror-linenumber { color: #888; } .cm-s-blackboard .CodeMirror-cursor { border-left: 1px solid #A7A7A7 !important; } .cm-s-blackboard .cm-keyword { color: #FBDE2D; } .cm-s-blackboard .cm-atom { color: #D8FA3C; } .cm-s-blackboard .cm-number { color: #D8FA3C; } .cm-s-blackboard .cm-def { color: #8DA6CE; } .cm-s-blackboard .cm-variable { color: #FF6400; } .cm-s-blackboard .cm-operator { color: #FBDE2D;} .cm-s-blackboard .cm-comment { color: #AEAEAE; } .cm-s-blackboard .cm-string { color: #61CE3C; } .cm-s-blackboard .cm-string-2 { color: #61CE3C; } .cm-s-blackboard .cm-meta { color: #D8FA3C; } .cm-s-blackboard .cm-builtin { color: #8DA6CE; } .cm-s-blackboard .cm-tag { color: #8DA6CE; } .cm-s-blackboard .cm-attribute { color: #8DA6CE; } .cm-s-blackboard .cm-header { color: #FF6400; } .cm-s-blackboard .cm-hr { color: #AEAEAE; } .cm-s-blackboard .cm-link { color: #8DA6CE; } .cm-s-blackboard .cm-error { background: #9D1E15; color: #F8F8F8; } .cm-s-blackboard .CodeMirror-activeline-background {background: #3C3636 !important;} .cm-s-blackboard .CodeMirror-matchingbracket {outline:1px solid grey;color:white !important}web2py-2.12.3.orig/applications/admin/static/codemirror/theme/ambiance-mobile.css0000664000000000000000000000014712564727254026520 0ustar rootroot.cm-s-ambiance.CodeMirror { -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; } web2py-2.12.3.orig/applications/admin/static/codemirror/theme/mdn-like.css0000664000000000000000000001131512564727254025213 0ustar rootroot/* MDN-LIKE Theme - Mozilla Ported to CodeMirror by Peter Kroon Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues GitHub: @peterkroon The mdn-like theme is inspired on the displayed code examples at: https://developer.mozilla.org/en-US/docs/Web/CSS/animation */ .cm-s-mdn-like.CodeMirror { color: #999; background-color: #fff; } .cm-s-mdn-like .CodeMirror-selected { background: #cfc !important; } .cm-s-mdn-like .CodeMirror-gutters { background: #f8f8f8; border-left: 6px solid rgba(0,83,159,0.65); color: #333; } .cm-s-mdn-like .CodeMirror-linenumber { color: #aaa; margin-left: 3px; } div.cm-s-mdn-like .CodeMirror-cursor { border-left: 2px solid #222; } .cm-s-mdn-like .cm-keyword { color: #6262FF; } .cm-s-mdn-like .cm-atom { color: #F90; } .cm-s-mdn-like .cm-number { color: #ca7841; } .cm-s-mdn-like .cm-def { color: #8DA6CE; } .cm-s-mdn-like span.cm-variable-2, .cm-s-mdn-like span.cm-tag { color: #690; } .cm-s-mdn-like span.cm-variable-3, .cm-s-mdn-like span.cm-def { color: #07a; } .cm-s-mdn-like .cm-variable { color: #07a; } .cm-s-mdn-like .cm-property { color: #905; } .cm-s-mdn-like .cm-qualifier { color: #690; } .cm-s-mdn-like .cm-operator { color: #cda869; } .cm-s-mdn-like .cm-comment { color:#777; font-weight:normal; } .cm-s-mdn-like .cm-string { color:#07a; font-style:italic; } .cm-s-mdn-like .cm-string-2 { color:#bd6b18; } /*?*/ .cm-s-mdn-like .cm-meta { color: #000; } /*?*/ .cm-s-mdn-like .cm-builtin { color: #9B7536; } /*?*/ .cm-s-mdn-like .cm-tag { color: #997643; } .cm-s-mdn-like .cm-attribute { color: #d6bb6d; } /*?*/ .cm-s-mdn-like .cm-header { color: #FF6400; } .cm-s-mdn-like .cm-hr { color: #AEAEAE; } .cm-s-mdn-like .cm-link { color:#ad9361; font-style:italic; text-decoration:none; } .cm-s-mdn-like .cm-error { border-bottom: 1px solid red; } div.cm-s-mdn-like .CodeMirror-activeline-background {background: #efefff;} div.cm-s-mdn-like span.CodeMirror-matchingbracket {outline:1px solid grey; color: inherit;} .cm-s-mdn-like.CodeMirror { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFcAAAAyCAYAAAAp8UeFAAAHvklEQVR42s2b63bcNgyEQZCSHCdt2vd/0tWF7I+Q6XgMXiTtuvU5Pl57ZQKkKHzEAOtF5KeIJBGJ8uvL599FRFREZhFx8DeXv8trn68RuGaC8TRfo3SNp9dlDDHedyLyTUTeRWStXKPZrjtpZxaRw5hPqozRs1N8/enzIiQRWcCgy4MUA0f+XWliDhyL8Lfyvx7ei/Ae3iQFHyw7U/59pQVIMEEPEz0G7XiwdRjzSfC3UTtz9vchIntxvry5iMgfIhJoEflOz2CQr3F5h/HfeFe+GTdLaKcu9L8LTeQb/R/7GgbsfKedyNdoHsN31uRPWrfZ5wsj/NzzRQHuToIdU3ahwnsKPxXCjJITuOsi7XLc7SG/v5GdALs7wf8JjTFiB5+QvTEfRyGOfX3Lrx8wxyQi3sNq46O7QahQiCsRFgqddjBouVEHOKDgXAQHD9gJCr5sMKkEdjwsarG/ww3BMHBU7OBjXnzdyY7SfCxf5/z6ATccrwlKuwC/jhznnPF4CgVzhhVf4xp2EixcBActO75iZ8/fM9zAs2OMzKdslgXWJ9XG8PQoOAMA5fGcsvORgv0doBXyHrCwfLJAOwo71QLNkb8n2Pl6EWiR7OCibtkPaz4Kc/0NNAze2gju3zOwekALDaCFPI5vjPFmgGY5AZqyGEvH1x7QfIb8YtxMnA/b+QQ0aQDAwc6JMFg8CbQZ4qoYEEHbRwNojuK3EHwd7VALSgq+MNDKzfT58T8qdpADrgW0GmgcAS1lhzztJmkAzcPNOQbsWEALBDSlMKUG0Eq4CLAQWvEVQ9WU57gZJwZtgPO3r9oBTQ9WO8TjqXINx8R0EYpiZEUWOF3FxkbJkgU9B2f41YBrIj5ZfsQa0M5kTgiAAqM3ShXLgu8XMqcrQBvJ0CL5pnTsfMB13oB8athpAq2XOQmcGmoACCLydx7nToa23ATaSIY2ichfOdPTGxlasXMLaL0MLZAOwAKIM+y8CmicobGdCcbbK9DzN+yYGVoNNI5iUKTMyYOjPse4A8SM1MmcXgU0toOq1yO/v8FOxlASyc7TgeYaAMBJHcY1CcCwGI/TK4AmDbDyKYBBtFUkRwto8gygiQEaByFgJ00BH2M8JWwQS1nafDXQCidWyOI8AcjDCSjCLk8ngObuAm3JAHAdubAmOaK06V8MNEsKPJOhobSprwQa6gD7DclRQdqcwL4zxqgBrQcabUiBLclRDKAlWp+etPkBaNMA0AKlrHwTdEByZAA4GM+SNluSY6wAzcMNewxmgig5Ks0nkrSpBvSaQHMdKTBAnLojOdYyGpQ254602ZILPdTD1hdlggdIm74jbTp8vDwF5ZYUeLWGJpWsh6XNyXgcYwVoJQTEhhTYkxzZjiU5npU2TaB979TQehlaAVq4kaGpiPwwwLkYUuBbQwocyQTv1tA0+1UFWoJF3iv1oq+qoSk8EQdJmwHkziIF7oOZk14EGitibAdjLYYK78H5vZOhtWpoI0ATGHs0Q8OMb4Ey+2bU2UYztCtA0wFAs7TplGLRVQCcqaFdGSPCeTI1QNIC52iWNzof6Uib7xjEp07mNNoUYmVosVItHrHzRlLgBn9LFyRHaQCtVUMbtTNhoXWiTOO9k/V8BdAc1Oq0ArSQs6/5SU0hckNy9NnXqQY0PGYo5dWJ7nINaN6o958FWin27aBaWRka1r5myvLOAm0j30eBJqCxHLReVclxhxOEN2JfDWjxBtAC7MIH1fVaGdoOp4qJYDgKtKPSFNID2gSnGldrCqkFZ+5UeQXQBIRrSwocbdZYQT/2LwRahBPBXoHrB8nxaGROST62DKUbQOMMzZIC9abkuELfQzQALWTnDNAm8KHWFOJgJ5+SHIvTPcmx1xQyZRhNL5Qci689aXMEaN/uNIWkEwDAvFpOZmgsBaaGnbs1NPa1Jm32gBZAIh1pCtG7TSH4aE0y1uVY4uqoFPisGlpP2rSA5qTecWn5agK6BzSpgAyD+wFaqhnYoSZ1Vwr8CmlTQbrcO3ZaX0NAEyMbYaAlyquFoLKK3SPby9CeVUPThrSJmkCAE0CrKUQadi4DrdSlWhmah0YL9z9vClH59YGbHx1J8VZTyAjQepJjmXwAKTDQI3omc3p1U4gDUf6RfcdYfrUp5ClAi2J3Ba6UOXGo+K+bQrjjssitG2SJzshaLwMtXgRagUNpYYoVkMSBLM+9GGiJZMvduG6DRZ4qc04DMPtQQxOjEtACmhO7K1AbNbQDEggZyJwscFpAGwENhoBeUwh3bWolhe8BTYVKxQEWrSUn/uhcM5KhvUu/+eQu0Lzhi+VrK0PrZZNDQKs9cpYUuFYgMVpD4/NxenJTiMCNqdUEUf1qZWjppLT5qSkkUZbCwkbZMSuVnu80hfSkzRbQeqCZSAh6huR4VtoM2gHAlLf72smuWgE+VV7XpE25Ab2WFDgyhnSuKbs4GuGzCjR+tIoUuMFg3kgcWKLTwRqanJQ2W00hAsenfaApRC42hbCvK1SlE0HtE9BGgneJO+ELamitD1YjjOYnNYVcraGhtKkW0EqVVeDx733I2NH581k1NNxNLG0i0IJ8/NjVaOZ0tYZ2Vtr0Xv7tPV3hkWp9EFkgS/J0vosngTaSoaG06WHi+xObQkaAdlbanP8B2+2l0f90LmUAAAAASUVORK5CYII=); } web2py-2.12.3.orig/applications/admin/static/codemirror/theme/eclipse.css0000664000000000000000000000215012564727254025134 0ustar rootroot.cm-s-eclipse span.cm-meta {color: #FF1717;} .cm-s-eclipse span.cm-keyword { line-height: 1em; font-weight: bold; color: #7F0055; } .cm-s-eclipse span.cm-atom {color: #219;} .cm-s-eclipse span.cm-number {color: #164;} .cm-s-eclipse span.cm-def {color: #00f;} .cm-s-eclipse span.cm-variable {color: black;} .cm-s-eclipse span.cm-variable-2 {color: #0000C0;} .cm-s-eclipse span.cm-variable-3 {color: #0000C0;} .cm-s-eclipse span.cm-property {color: black;} .cm-s-eclipse span.cm-operator {color: black;} .cm-s-eclipse span.cm-comment {color: #3F7F5F;} .cm-s-eclipse span.cm-string {color: #2A00FF;} .cm-s-eclipse span.cm-string-2 {color: #f50;} .cm-s-eclipse span.cm-qualifier {color: #555;} .cm-s-eclipse span.cm-builtin {color: #30a;} .cm-s-eclipse span.cm-bracket {color: #cc7;} .cm-s-eclipse span.cm-tag {color: #170;} .cm-s-eclipse span.cm-attribute {color: #00c;} .cm-s-eclipse span.cm-link {color: #219;} .cm-s-eclipse span.cm-error {color: #f00;} .cm-s-eclipse .CodeMirror-activeline-background {background: #e8f2ff !important;} .cm-s-eclipse .CodeMirror-matchingbracket {outline:1px solid grey; color:black !important;} web2py-2.12.3.orig/applications/admin/static/codemirror/theme/tomorrow-night-eighties.css0000664000000000000000000000363012564727254030312 0ustar rootroot/* Name: Tomorrow Night - Eighties Author: Chris Kempson CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ .cm-s-tomorrow-night-eighties.CodeMirror {background: #000000; color: #CCCCCC;} .cm-s-tomorrow-night-eighties div.CodeMirror-selected {background: #2D2D2D !important;} .cm-s-tomorrow-night-eighties .CodeMirror-gutters {background: #000000; border-right: 0px;} .cm-s-tomorrow-night-eighties .CodeMirror-guttermarker { color: #f2777a; } .cm-s-tomorrow-night-eighties .CodeMirror-guttermarker-subtle { color: #777; } .cm-s-tomorrow-night-eighties .CodeMirror-linenumber {color: #515151;} .cm-s-tomorrow-night-eighties .CodeMirror-cursor {border-left: 1px solid #6A6A6A !important;} .cm-s-tomorrow-night-eighties span.cm-comment {color: #d27b53;} .cm-s-tomorrow-night-eighties span.cm-atom {color: #a16a94;} .cm-s-tomorrow-night-eighties span.cm-number {color: #a16a94;} .cm-s-tomorrow-night-eighties span.cm-property, .cm-s-tomorrow-night-eighties span.cm-attribute {color: #99cc99;} .cm-s-tomorrow-night-eighties span.cm-keyword {color: #f2777a;} .cm-s-tomorrow-night-eighties span.cm-string {color: #ffcc66;} .cm-s-tomorrow-night-eighties span.cm-variable {color: #99cc99;} .cm-s-tomorrow-night-eighties span.cm-variable-2 {color: #6699cc;} .cm-s-tomorrow-night-eighties span.cm-def {color: #f99157;} .cm-s-tomorrow-night-eighties span.cm-bracket {color: #CCCCCC;} .cm-s-tomorrow-night-eighties span.cm-tag {color: #f2777a;} .cm-s-tomorrow-night-eighties span.cm-link {color: #a16a94;} .cm-s-tomorrow-night-eighties span.cm-error {background: #f2777a; color: #6A6A6A;} .cm-s-tomorrow-night-eighties .CodeMirror-activeline-background {background: #343600 !important;} .cm-s-tomorrow-night-eighties .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} web2py-2.12.3.orig/applications/admin/static/codemirror/theme/monokai.css0000664000000000000000000000252712564727254025155 0ustar rootroot/* Based on Sublime Text's Monokai theme */ .cm-s-monokai.CodeMirror {background: #272822; color: #f8f8f2;} .cm-s-monokai div.CodeMirror-selected {background: #49483E !important;} .cm-s-monokai .CodeMirror-gutters {background: #272822; border-right: 0px;} .cm-s-monokai .CodeMirror-guttermarker { color: white; } .cm-s-monokai .CodeMirror-guttermarker-subtle { color: #d0d0d0; } .cm-s-monokai .CodeMirror-linenumber {color: #d0d0d0;} .cm-s-monokai .CodeMirror-cursor {border-left: 1px solid #f8f8f0 !important;} .cm-s-monokai span.cm-comment {color: #75715e;} .cm-s-monokai span.cm-atom {color: #ae81ff;} .cm-s-monokai span.cm-number {color: #ae81ff;} .cm-s-monokai span.cm-property, .cm-s-monokai span.cm-attribute {color: #a6e22e;} .cm-s-monokai span.cm-keyword {color: #f92672;} .cm-s-monokai span.cm-string {color: #e6db74;} .cm-s-monokai span.cm-variable {color: #a6e22e;} .cm-s-monokai span.cm-variable-2 {color: #9effff;} .cm-s-monokai span.cm-def {color: #fd971f;} .cm-s-monokai span.cm-bracket {color: #f8f8f2;} .cm-s-monokai span.cm-tag {color: #f92672;} .cm-s-monokai span.cm-link {color: #ae81ff;} .cm-s-monokai span.cm-error {background: #f92672; color: #f8f8f0;} .cm-s-monokai .CodeMirror-activeline-background {background: #373831 !important;} .cm-s-monokai .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } web2py-2.12.3.orig/applications/admin/static/codemirror/theme/zenburn.css0000664000000000000000000000371312564727254025201 0ustar rootroot/** * " * Using Zenburn color palette from the Emacs Zenburn Theme * https://github.com/bbatsov/zenburn-emacs/blob/master/zenburn-theme.el * * Also using parts of https://github.com/xavi/coderay-lighttable-theme * " * From: https://github.com/wisenomad/zenburn-lighttable-theme/blob/master/zenburn.css */ .cm-s-zenburn .CodeMirror-gutters { background: #3f3f3f !important; } .cm-s-zenburn .CodeMirror-foldgutter-open, .CodeMirror-foldgutter-folded { color: #999; } .cm-s-zenburn .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-zenburn { background-color: #3f3f3f; color: #dcdccc; } .cm-s-zenburn span.cm-builtin { color: #dcdccc; font-weight: bold; } .cm-s-zenburn span.cm-comment { color: #7f9f7f; } .cm-s-zenburn span.cm-keyword { color: #f0dfaf; font-weight: bold; } .cm-s-zenburn span.cm-atom { color: #bfebbf; } .cm-s-zenburn span.cm-def { color: #dcdccc; } .cm-s-zenburn span.cm-variable { color: #dfaf8f; } .cm-s-zenburn span.cm-variable-2 { color: #dcdccc; } .cm-s-zenburn span.cm-string { color: #cc9393; } .cm-s-zenburn span.cm-string-2 { color: #cc9393; } .cm-s-zenburn span.cm-number { color: #dcdccc; } .cm-s-zenburn span.cm-tag { color: #93e0e3; } .cm-s-zenburn span.cm-property { color: #dfaf8f; } .cm-s-zenburn span.cm-attribute { color: #dfaf8f; } .cm-s-zenburn span.cm-qualifier { color: #7cb8bb; } .cm-s-zenburn span.cm-meta { color: #f0dfaf; } .cm-s-zenburn span.cm-header { color: #f0efd0; } .cm-s-zenburn span.cm-operator { color: #f0efd0; } .cm-s-zenburn span.CodeMirror-matchingbracket { box-sizing: border-box; background: transparent; border-bottom: 1px solid; } .cm-s-zenburn span.CodeMirror-nonmatchingbracket { border-bottom: 1px solid; background: none; } .cm-s-zenburn .CodeMirror-activeline { background: #000000; } .cm-s-zenburn .CodeMirror-activeline-background { background: #000000; } .cm-s-zenburn .CodeMirror-selected { background: #545454; } .cm-s-zenburn .CodeMirror-focused .CodeMirror-selected { background: #4f4f4f; } web2py-2.12.3.orig/applications/admin/static/codemirror/theme/3024-day.css0000664000000000000000000000312012564727254024651 0ustar rootroot/* Name: 3024 day Author: Jan T. Sott (http://github.com/idleberg) CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ .cm-s-3024-day.CodeMirror {background: #f7f7f7; color: #3a3432;} .cm-s-3024-day div.CodeMirror-selected {background: #d6d5d4 !important;} .cm-s-3024-day .CodeMirror-gutters {background: #f7f7f7; border-right: 0px;} .cm-s-3024-day .CodeMirror-guttermarker { color: #db2d20; } .cm-s-3024-day .CodeMirror-guttermarker-subtle { color: #807d7c; } .cm-s-3024-day .CodeMirror-linenumber {color: #807d7c;} .cm-s-3024-day .CodeMirror-cursor {border-left: 1px solid #5c5855 !important;} .cm-s-3024-day span.cm-comment {color: #cdab53;} .cm-s-3024-day span.cm-atom {color: #a16a94;} .cm-s-3024-day span.cm-number {color: #a16a94;} .cm-s-3024-day span.cm-property, .cm-s-3024-day span.cm-attribute {color: #01a252;} .cm-s-3024-day span.cm-keyword {color: #db2d20;} .cm-s-3024-day span.cm-string {color: #fded02;} .cm-s-3024-day span.cm-variable {color: #01a252;} .cm-s-3024-day span.cm-variable-2 {color: #01a0e4;} .cm-s-3024-day span.cm-def {color: #e8bbd0;} .cm-s-3024-day span.cm-bracket {color: #3a3432;} .cm-s-3024-day span.cm-tag {color: #db2d20;} .cm-s-3024-day span.cm-link {color: #a16a94;} .cm-s-3024-day span.cm-error {background: #db2d20; color: #5c5855;} .cm-s-3024-day .CodeMirror-activeline-background {background: #e8f2ff !important;} .cm-s-3024-day .CodeMirror-matchingbracket { text-decoration: underline; color: #a16a94 !important;} web2py-2.12.3.orig/applications/admin/static/codemirror/theme/neat.css0000664000000000000000000000126512564727254024445 0ustar rootroot.cm-s-neat span.cm-comment { color: #a86; } .cm-s-neat span.cm-keyword { line-height: 1em; font-weight: bold; color: blue; } .cm-s-neat span.cm-string { color: #a22; } .cm-s-neat span.cm-builtin { line-height: 1em; font-weight: bold; color: #077; } .cm-s-neat span.cm-special { line-height: 1em; font-weight: bold; color: #0aa; } .cm-s-neat span.cm-variable { color: black; } .cm-s-neat span.cm-number, .cm-s-neat span.cm-atom { color: #3a3; } .cm-s-neat span.cm-meta {color: #555;} .cm-s-neat span.cm-link { color: #3a3; } .cm-s-neat .CodeMirror-activeline-background {background: #e8f2ff !important;} .cm-s-neat .CodeMirror-matchingbracket {outline:1px solid grey; color:black !important;} web2py-2.12.3.orig/applications/admin/static/codemirror/theme/erlang-dark.css0000664000000000000000000000351012564727254025700 0ustar rootroot.cm-s-erlang-dark.CodeMirror { background: #002240; color: white; } .cm-s-erlang-dark div.CodeMirror-selected { background: #b36539 !important; } .cm-s-erlang-dark .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } .cm-s-erlang-dark .CodeMirror-guttermarker { color: white; } .cm-s-erlang-dark .CodeMirror-guttermarker-subtle { color: #d0d0d0; } .cm-s-erlang-dark .CodeMirror-linenumber { color: #d0d0d0; } .cm-s-erlang-dark .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-erlang-dark span.cm-atom { color: #f133f1; } .cm-s-erlang-dark span.cm-attribute { color: #ff80e1; } .cm-s-erlang-dark span.cm-bracket { color: #ff9d00; } .cm-s-erlang-dark span.cm-builtin { color: #eaa; } .cm-s-erlang-dark span.cm-comment { color: #77f; } .cm-s-erlang-dark span.cm-def { color: #e7a; } .cm-s-erlang-dark span.cm-keyword { color: #ffee80; } .cm-s-erlang-dark span.cm-meta { color: #50fefe; } .cm-s-erlang-dark span.cm-number { color: #ffd0d0; } .cm-s-erlang-dark span.cm-operator { color: #d55; } .cm-s-erlang-dark span.cm-property { color: #ccc; } .cm-s-erlang-dark span.cm-qualifier { color: #ccc; } .cm-s-erlang-dark span.cm-quote { color: #ccc; } .cm-s-erlang-dark span.cm-special { color: #ffbbbb; } .cm-s-erlang-dark span.cm-string { color: #3ad900; } .cm-s-erlang-dark span.cm-string-2 { color: #ccc; } .cm-s-erlang-dark span.cm-tag { color: #9effff; } .cm-s-erlang-dark span.cm-variable { color: #50fe50; } .cm-s-erlang-dark span.cm-variable-2 { color: #e0e; } .cm-s-erlang-dark span.cm-variable-3 { color: #ccc; } .cm-s-erlang-dark span.cm-error { color: #9d1e15; } .cm-s-erlang-dark .CodeMirror-activeline-background {background: #013461 !important;} .cm-s-erlang-dark .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;} web2py-2.12.3.orig/applications/admin/static/codemirror/theme/elegant.css0000664000000000000000000000140012564727254025124 0ustar rootroot.cm-s-elegant span.cm-number, .cm-s-elegant span.cm-string, .cm-s-elegant span.cm-atom {color: #762;} .cm-s-elegant span.cm-comment {color: #262; font-style: italic; line-height: 1em;} .cm-s-elegant span.cm-meta {color: #555; font-style: italic; line-height: 1em;} .cm-s-elegant span.cm-variable {color: black;} .cm-s-elegant span.cm-variable-2 {color: #b11;} .cm-s-elegant span.cm-qualifier {color: #555;} .cm-s-elegant span.cm-keyword {color: #730;} .cm-s-elegant span.cm-builtin {color: #30a;} .cm-s-elegant span.cm-link {color: #762;} .cm-s-elegant span.cm-error {background-color: #fdd;} .cm-s-elegant .CodeMirror-activeline-background {background: #e8f2ff !important;} .cm-s-elegant .CodeMirror-matchingbracket {outline:1px solid grey; color:black !important;} web2py-2.12.3.orig/applications/admin/static/codemirror/theme/ambiance.css0000664000000000000000000006273412564727254025265 0ustar rootroot/* ambiance theme for codemirror */ /* Color scheme */ .cm-s-ambiance .cm-keyword { color: #cda869; } .cm-s-ambiance .cm-atom { color: #CF7EA9; } .cm-s-ambiance .cm-number { color: #78CF8A; } .cm-s-ambiance .cm-def { color: #aac6e3; } .cm-s-ambiance .cm-variable { color: #ffb795; } .cm-s-ambiance .cm-variable-2 { color: #eed1b3; } .cm-s-ambiance .cm-variable-3 { color: #faded3; } .cm-s-ambiance .cm-property { color: #eed1b3; } .cm-s-ambiance .cm-operator {color: #fa8d6a;} .cm-s-ambiance .cm-comment { color: #555; font-style:italic; } .cm-s-ambiance .cm-string { color: #8f9d6a; } .cm-s-ambiance .cm-string-2 { color: #9d937c; } .cm-s-ambiance .cm-meta { color: #D2A8A1; } .cm-s-ambiance .cm-qualifier { color: yellow; } .cm-s-ambiance .cm-builtin { color: #9999cc; } .cm-s-ambiance .cm-bracket { color: #24C2C7; } .cm-s-ambiance .cm-tag { color: #fee4ff } .cm-s-ambiance .cm-attribute { color: #9B859D; } .cm-s-ambiance .cm-header {color: blue;} .cm-s-ambiance .cm-quote { color: #24C2C7; } .cm-s-ambiance .cm-hr { color: pink; } .cm-s-ambiance .cm-link { color: #F4C20B; } .cm-s-ambiance .cm-special { color: #FF9D00; } .cm-s-ambiance .cm-error { color: #AF2018; } .cm-s-ambiance .CodeMirror-matchingbracket { color: #0f0; } .cm-s-ambiance .CodeMirror-nonmatchingbracket { color: #f22; } .cm-s-ambiance .CodeMirror-selected { background: rgba(255, 255, 255, 0.15); } .cm-s-ambiance.CodeMirror-focused .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); } /* Editor styling */ .cm-s-ambiance.CodeMirror { line-height: 1.40em; color: #E6E1DC; background-color: #202020; -webkit-box-shadow: inset 0 0 10px black; -moz-box-shadow: inset 0 0 10px black; box-shadow: inset 0 0 10px black; } .cm-s-ambiance .CodeMirror-gutters { background: #3D3D3D; border-right: 1px solid #4D4D4D; box-shadow: 0 10px 20px black; } .cm-s-ambiance .CodeMirror-linenumber { text-shadow: 0px 1px 1px #4d4d4d; color: #111; padding: 0 5px; } .cm-s-ambiance .CodeMirror-guttermarker { color: #aaa; } .cm-s-ambiance .CodeMirror-guttermarker-subtle { color: #111; } .cm-s-ambiance .CodeMirror-lines .CodeMirror-cursor { border-left: 1px solid #7991E8; } .cm-s-ambiance .CodeMirror-activeline-background { background: none repeat scroll 0% 0% rgba(255, 255, 255, 0.031); } .cm-s-ambiance.CodeMirror, .cm-s-ambiance .CodeMirror-gutters { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAQAAAAHUWYVAABFFUlEQVQYGbzBCeDVU/74/6fj9HIcx/FRHx9JCFmzMyGRURhLZIkUsoeRfUjS2FNDtr6WkMhO9sm+S8maJfu+Jcsg+/o/c+Z4z/t97/vezy3z+z8ekGlnYICG/o7gdk+wmSHZ1z4pJItqapjoKXWahm8NmV6eOTbWUOp6/6a/XIg6GQqmenJ2lDHyvCFZ2cBDbmtHA043VFhHwXxClWmeYAdLhV00Bd85go8VmaFCkbVkzlQENzfBDZ5gtN7HwF0KDrTwJ0dypSOzpaKCMwQHKTIreYIxlmhXTzTWkVm+LTynZhiSBT3RZQ7aGfjGEd3qyXQ1FDymqbKxpspERQN2MiRjNZlFFQXfCNFm9nM1zpAsoYjmtRTc5ajwuaXc5xrWskT97RaKzAGe5ARHhVUsDbjKklziiX5WROcJwSNCNI+9w1Jwv4Zb2r7lCMZ4oq5C0EdTx+2GzNuKpJ+iFf38JEWkHJn9DNF7mmBDITrWEg0VWL3pHU20tSZnuqWu+R3BtYa8XxV1HO7GyD32UkOpL/yDloINFTmvtId+nmAjxRw40VMwVKiwrKLE4bK5UOVntYwhOcSSXKrJHKPJedocpGjVz/ZMIbnYUPB10/eKCrs5apqpgVmWzBYWpmtKHecJPjaUuEgRDDaU0oZghCJ6zNMQ5ZhDYx05r5v2muQdM0EILtXUsaKiQX9WMEUotagQzFbUNN6NUPC2nm5pxEWGCjMc3GdJHjSU2kORLK/JGSrkfGEIjncU/CYUnOipoYemwj8tST9NsJmB7TUVXtbUtXATJVZXBMvYeTXJfobgJUPmGMP/yFaWonaa6BcFO3nqcIqCozSZoZoSr1g4zJOzuyGnxTEX3lUEJ7WcZgme8ddaWvWJo2AJR9DZU3CUIbhCSG6ybSwN6qtJVnCU2svDTP2ZInOw2cBTrqtQahtNZn9NcJ4l2NaSmSkkP1noZWnVwkLmdUPOwLZEwy2Z3S3R+4rIG9hcbpPXHFVWcQdZkn2FOta3cKWQnNRC5g1LsJah4GCzSVsKnCOY5OAFRTBekyyryeyilhFKva75r4Mc0aWanGEaThcy31s439KKxTzJYY5WTHPU1FtIHjQU3Oip4xlNzj/lBw23dYZVliQa7WAXf4shetcQfatI+jWRDBPmyNeW6A1P5kdDgyYJlba0BIM8BZu1JfrFwItyjcAMR3K0BWOIrtMEXyhyrlVEx3ui5dUBjmB/Q3CXW85R4mBD0s7B+4q5tKUjOlb9qqmhi5AZ6GFIC5HXtOobdYGlVdMVbNJ8toNTFcHxnoL+muBagcctjWnbNMuR00uI7nQESwg5q2qqrKWIfrNUmeQocY6HuyxJV02wj36w00yhpmUFenv4p6fUkZYqLyuinx2RGOjhCXYyJF84oiU00YMOOhhquNdfbOB7gU88pY4xJO8LVdp6/q2voeB4R04vIdhSE40xZObx1HGGJ/ja0LBthFInKaLPPFzuCaYaoj8JjPME8yoyxo6zlBqkiUZYgq00OYMswbWO5NGmq+xhipxHLRW29ARjNKXO0wRnear8XSg4XFPLKEPUS1GqvyLwiuBUoa7zpZ0l5xxFwWmWZC1H5h5FwU8eQ7K+g8UcVY6TMQreVQT/8uQ8Z+ALIXnSEa2pYZQneE9RZbSBNYXfWYJzW/h/4j4Dp1tYVcFIC5019Vyi4ThPqSFCzjGWaHQTBU8q6vrVwgxP9Lkm840imWKpcLCjYTtrKuwvsKSnrvHCXGkSMk9p6lhckfRpIeis+N2PiszT+mFLspyGleUhDwcLrZqmyeylxwjBcKHEapqkmyangyLZRVOijwOtCY5SsG5zL0OwlCJ4y5KznF3EUNDDrinwiyLZRzOXtlBbK5ITHFGLp8Q0R6ab6mS7enI2cFrxOyHvOCFaT1HThS1krjCwqWeurCkk+willhCC+RSZnRXBiZaC5RXRIZYKp2lyfrHwiKPKR0JDzrdU2EFgpidawlFDR6FgXUMNa+g1FY3bUQh2cLCwosRdnuQTS/S+JVrGLeWIvtQUvONJxlqSQYYKpwoN2kaocLjdVsis4Mk80ESF2YpSkzwldjHkjFCUutI/r+EHDU8oCs6yzL3PhWiEooZdFMkymlas4AcI3KmoMMNSQ3tHzjGWCrcJJdYyZC7QFGwjRL9p+MrRkAGWzIaWCn9W0F3TsK01c2ZvQw0byvxuQU0r1lM0qJO7wW0kRIMdDTtXEdzi4VIh+EoIHm0mWtAtpCixlabgn83fKTI7anJe9ST7WIK1DMGpQmYeA58ImV6ezOGOzK2Kgq01pd60cKWiUi9Lievb/0vIDPHQ05Kzt4ddPckQBQtoaurjyHnek/nKzpQLrVgKPjIkh2v4uyezpv+Xoo7fPFXaGFp1vaLKxQ4uUpQQS5VuQs7BCq4xRJv7fwpVvvFEB3j+620haOuocqMhWd6TTPAEx+mdFNGHdranFe95WrWmIvlY4F1Dle2ECgc6cto7SryuqGGGha0tFQ5V53migUKmg6XKAo4qS3mik+0OZpAhOLeZKicacgaYcyx5hypYQE02ZA4xi/pNhOQxR4klNKyqacj+mpxnLTnnGSo85++3ZCZq6lrZkXlGEX3o+C9FieccJbZWVFjC0Yo1FZnJhoYMFoI1hEZ9r6hwg75HwzBNhbZCdJEfJwTPGzJvaKImw1yYX1HDAmpXR+ZJQ/SmgqMNVQb5vgamGwLtt7VwvP7Qk1xpiM5x5Cyv93E06MZmgs0Nya2azIKOYKCGBQQW97RmhKNKF02JZqHEJ4o58qp7X5EcZmc56trXEqzjCBZ1MFGR87Ql2tSTs6CGxS05PTzRQorkbw7aKoKXFDXsYW42VJih/q+FP2BdTzDTwVqOYB13liM50vG7wy28qagyuIXMeQI/Oqq8bcn5wJI50xH00CRntyfpL1T4hydYpoXgNiFzoIUTDZnLNRzh4TBHwbYGDvZkxmlyJloyr6tRihpeUG94GnKtIznREF0tzJG/OOr73JBcrSh1k6WuTprgLU+mnSGnv6Zge0NNz+kTDdH8nuAuTdJDCNb21LCiIuqlYbqGzT3RAoZofQfjFazkqeNWdYaGvYTM001EW2oKPvVk1ldUGSgUtHFwjKM1h9jnFcmy5lChoLNaQMGGDsYbKixlaMBmmsx1QjCfflwTfO/gckW0ruZ3jugKR3R5W9hGUWqCgxuFgsuaCHorotGKzGaeZB9DMsaTnKCpMtwTvOzhYk0rdrArKCqcaWmVk1+F372ur1YkKxgatI8Qfe1gIX9wE9FgS8ESmuABIXnRUbCapcKe+nO7slClSZFzpV/LkLncEb1qiO42fS3R855Su2mCLh62t1SYZZYVmKwIHjREF2uihTzB20JOkz7dkxzYQnK0UOU494wh+VWRc6Un2kpTaVgLDFEkJ/uhzRcI0YKGgpGWOlocBU/a4fKoJ/pEaNV6jip3+Es9VXY078rGnmAdf7t9ylPXS34RBSuYPs1UecZTU78WanhBCHpZ5sAoTz0LGZKjPf9TRypqWEiTvOFglL1fCEY3wY/++rbk7C8bWebA6p6om6PgOL2kp44TFJlVNBXae2rqqdZztOJpT87GQsE9jqCPIe9VReZuQ/CIgacsyZdCpIScSYqcZk8r+nsyCzhyfhOqHGOIvrLknC8wTpFcaYiGC/RU1NRbUeUpocQOnkRpGOrIOcNRx+1uA0UrzhSSt+VyS3SJpnFWkzNDqOFGIWcfR86DnmARTQ1HKIL33ExPiemeOhYSSjzlSUZZuE4TveoJLnBUOFof6KiysCbnAEcZgcUNTDOwkqWu3RWtmGpZwlHhJENdZ3miGz0lJlsKnjbwqSHQjpxnFDlTLLwqJPMZMjd7KrzkSG7VsxXBZE+F8YZkb01Oe00yyRK9psh5SYh29ySPKBo2ylNht7ZkZnsKenjKNJu9PNEyZpaCHv4Kt6RQsLvAVp7M9kIimmCUwGeWqLMmGuIotYMmWNpSahkhZw9FqZsVnKJhsjAHvtHMsTM9fCI06Dx/u3vfUXCqfsKRc4oFY2jMsoo/7DJDwZ1CsIKnJu+J9ldkpmiCxQx1rWjI+T9FwcWWzOuaYH0Hj7klNRVWEQpmaqosakiGNTFHdjS/qnUdmf0NJW5xsL0HhimCCZZSRzmSPTXJQ4aaztAwtZnoabebJ+htCaZ7Cm535ByoqXKbX1WRc4Eh2MkRXWzImVc96Cj4VdOKVxR84VdQsIUM8Psoou2byVHyZFuq7O8otbSQ2UAoeEWTudATLGSpZzVLlXVkPU2Jc+27lsw2jmg5T5VhbeE3BT083K9WsTTkFU/Osi0rC5lRlpwRHUiesNS0sOvmqGML1aRbPAxTJD9ZKtxuob+hhl8cwYGWpJ8nub7t5p6coYbMovZ1BTdaKn1jYD6h4GFDNFyT/Kqe1XCXphXHOKLZmuRSRdBPEfVUXQzJm5YGPGGJdvAEr7hHNdGZnuBvrpciGmopOLf5N0uVMy0FfYToJk90uUCbJupaVpO53UJXR2bVpoU00V2KOo4zMFrBd0Jtz2pa0clT5Q5L8IpQ177mWQejPMEJhuQjS10ref6HHjdEhy1P1EYR7GtO0uSsKJQYLiTnG1rVScj5lyazpqWGl5uBbRWl7m6ixGOOnEsMJR7z8J0n6KMnCdxhiNYQCoZ6CmYLnO8omC3MkW3bktlPmEt/VQQHejL3+dOE5FlPdK/Mq8hZxxJtLyRrepLThYKbLZxkSb5W52vYxNOaOxUF0yxMUPwBTYqCzy01XayYK0sJyWBLqX0MwU5CzoymRzV0EjjeUeLgDpTo6ij42ZAzvD01dHUUTPLU96MdLbBME8nFBn7zJCMtJcZokn8YoqU0FS5WFKyniHobguMcmW8N0XkWZjkyN3hqOMtS08r+/xTBwpZSZ3qiVRX8SzMHHjfUNFjgHEPmY9PL3ykEzxkSre/1ZD6z/NuznuB0RcE1TWTm9zRgfUWVJiG6yrzgmWPXC8EAR4Wxhlad0ZbgQyEz3pG5RVEwwDJH2mgKpjcTiCOzn1lfUWANFbZ2BA8balnEweJC9J0iuaeZoI+ippFCztEKVvckR2iice1JvhVytrQwUAZpgsubCPaU7xUe9vWnaOpaSBEspalykhC9bUlOMpT42ZHca6hyrqKmw/wMR8H5ZmdFoBVJb03O4UL0tSNnvIeRmkrLWqrs78gcrEn2tpcboh0UPOW3UUR9PMk4T4nnNKWmCjlrefhCwxRNztfmIQVdDElvS4m1/WuOujoZCs5XVOjtKPGokJzsYCtFYoWonSPT21DheU/wWhM19FcElwqNGOsp9Q8N/cwXaiND1MmeL1Q5XROtYYgGeFq1aTMsoMmcrKjQrOFQTQ1fmBYhmW6o8Jkjc7iDJRTBIo5kgJD5yMEYA3srCg7VFKwiVJkmRCc5ohGOKhsYMn/XBLdo5taZjlb9YAlGWRimqbCsoY7HFAXLa5I1HPRxMMsQDHFkWtRNniqT9UEeNjcE7RUlrCJ4R2CSJuqlKHWvJXjAUNcITYkenuBRB84TbeepcqTj3zZyFJzgYQdHnqfgI0ddUwS6GqWpsKWhjq9cV0vBAEMN2znq+EBfIWT+pClYw5xsTlJU6GeIBsjGmmANTzJZiIYpgrM0Oa8ZMjd7NP87jxhqGOhJlnQtjuQpB+8aEE00wZFznSJPyHxgH3HkPOsJFvYk8zqCHzTs1BYOa4J3PFU+UVRZxlHDM4YavlNUuMoRveiZA2d7grMNc2g+RbSCEKzmgYsUmWmazFJyoiOZ4KnyhKOGRzWJa0+moyV4TVHDzn51Awtqaphfk/lRQ08FX1iiqxTB/kLwd0VynKfEvI6cd4XMV5bMhZ7gZUWVzYQ6Nm2BYzxJbw3bGthEUUMfgbGeorae6DxHtJoZ6alhZ0+ytiVoK1R4z5PTrOECT/SugseEOlb1MMNR4VRNcJy+V1Hg9ONClSZFZjdHlc6W6FBLdJja2MC5hhpu0DBYEY1TFGwiFAxRRCsYkiM9JRb0JNMVkW6CZYT/2EiTGWmo8k+h4FhDNE7BvppoTSFnmCV5xZKzvcCdDo7VVPnIU+I+Rc68juApC90MwcFCsJ5hDqxgScYKreruyQwTqrzoqDCmhWi4IbhB0Yrt3RGa6GfDv52rKXWhh28dyZaWUvcZeMTBaZoSGyiCtRU5J8iviioHaErs7Jkj61syVzTTgOcUOQ8buFBTYWdL5g3T4qlpe0+wvD63heAXRfCCIed9RbCsp2CiI7raUOYOTU13N8PNHvpaGvayo4a3LLT1lDrVEPT2zLUlheB1R+ZTRfKWJ+dcocLJfi11vyJ51lLqJ0WD7tRwryezjiV5W28uJO9qykzX8JDe2lHl/9oyBwa2UMfOngpXCixvKdXTk3wrsKmiVYdZIqsoWEERjbcUNDuiaQomGoIbFdEHmsyWnuR+IeriKDVLnlawlyNHKwKlSU631PKep8J4Q+ayjkSLKYLhalNHlYvttb6fHm0p6OApsZ4l2VfdqZkjuysy6ysKLlckf1KUutCTs39bmCgEyyoasIWlVaMF7mgmWtBT8Kol5xpH9IGllo8cJdopcvZ2sImlDmMIbtDk3KIpeNiS08lQw11NFPTwVFlPP6pJ2gvRfI7gQUfmNAtf6Gs0wQxDsKGlVBdF8rCa3jzdwMaGHOsItrZk7hAyOzpK9VS06j5F49b0VNGOOfKs3lDToMsMBe9ZWtHFEgxTJLs7qrygKZjUnmCYoeAqeU6jqWuLJup4WghOdvCYJnrSkSzoyRkm5M2StQwVltPkfCAk58tET/CSg+8MUecmotMEnhBKfWBIZsg2ihruMJQaoIm+tkTLKEqspMh00w95gvFCQRtDwTT1gVDDSEVdlwqZfxoQRbK0g+tbiBZxzKlpnpypejdDwTaeOvorMk/IJE10h9CqRe28hhLbe0pMsdSwv4ZbhKivo2BjDWfL8UKJgeavwlwb5KlwhyE4u4XkGE2ytZCznKLCDZZq42VzT8HLCrpruFbIfOIINmh/qCdZ1ZBc65kLHR1Bkyf5zn6pN3SvGKIlFNGplhrO9QSXanLOMQTLCa0YJCRrCZm/CZmrLTm7WzCK4GJDiWUdFeYx1LCFg3NMd0XmCuF3Y5rITLDUsYS9zoHVzwnJoYpSTQoObyEzr4cFBNqYTopoaU/wkyLZ2lPhX/5Y95ulxGTV7KjhWrOZgl8MyUUafjYraNjNU1N3IWcjT5WzWqjwtoarHSUObGYO3GCJZpsBlnJGPd6ZYLyl1GdCA2625IwwJDP8GUKymbzuyPlZlvTUsaUh5zFDhRWFzPKKZLAlWdcQbObgF9tOqOsmB1dqcqYJmWstFbZRRI9poolmqiLnU0POvxScpah2iSL5UJNzgScY5+AuIbpO0YD3NCW+dLMszFSdFCWGqG6eVq2uYVNDdICGD6W7EPRWZEY5gpsE9rUkS3mijzzJnm6UpUFXG1hCUeVoS5WfNcFpblELL2qqrCvMvRfd45oalvKU2tiQ6ePJOVMRXase9iTtLJztPxJKLWpo2CRDcJwn2sWSLKIO1WQWNTCvpVUvOZhgSC40JD0dOctaSqzkCRbXsKlb11Oip6PCJ0IwSJM31j3akRxlP7Rwn6aGaUL0qiLnJkvB3xWZ2+Q1TfCwpQH3G0o92UzmX4o/oJNQMMSQc547wVHhdk+VCw01DFYEnTxzZKAm74QmeNNR1w6WzEhNK15VJzuCdxQ53dRUDws5KvwgBMOEgpcVNe0hZI6RXT1Jd0cyj5nsaEAHgVmGaJIlWdsc5Ui2ElrRR6jrRAttNMEAIWrTDFubkZaok7/AkzfIwfuWVq0jHzuCK4QabtLUMVPB3kJ0oyHTSVFlqMALilJf2Rf8k5aaHtMfayocLBS8L89oKoxpJvnAkDPa0qp5DAUTHKWmCcnthlou8iCKaFFLHWcINd1nyIwXqrSxMNmSs6KmoL2QrKuWtlQ5V0120xQ5vRyZS1rgFkWwhiOwiuQbR0OOVhQM9iS3tiXp4RawRPMp5tDletOOBL95MpM01dZTBM9pkn5qF010rIeHFcFZhmSGpYpTsI6nwhqe5C9ynhlpp5ophuRb6WcJFldkVnVEwwxVfrVkvnWUuNLCg5bgboFHPDlDPDmnK7hUrWiIbjadDclujlZcaokOFup4Ri1kacV6jmrrK1hN9bGwpKEBQ4Q6DvIUXOmo6U5LqQM6EPyiKNjVkPnJkDPNEaxhiFay5ExW1NXVUGqcpYYdPcGiCq7z/TSlbhL4pplWXKd7NZO5QQFrefhRQW/NHOsqcIglc4UhWklR8K0QzbAw08CBDnpbgqXdeD/QUsM4RZXDFBW6WJKe/mFPdH0LtBgiq57wFLzlyQzz82qYx5D5WJP5yVJDW01BfyHnS6HKO/reZqId1WGa4Hkh2kWodJ8i6KoIPlAj2hPt76CzXsVR6koPRzWTfKqIentatYpQw2me4AA3y1Kind3SwoOKZDcFXTwl9tWU6mfgRk9d71sKtlNwrjnYw5tC5n5LdKiGry3JKNlHEd3oaMCFHrazBPMp/uNJ+V7IudcSbeOIdjUEdwl0VHCOZo5t6YluEuaC9mQeMgSfOyKnYGFHcIeQ84yQWbuJYJpZw5CzglDH7gKnWqqM9ZTaXcN0TeYhR84eQtJT76JJ1lREe7WnnvsMmRc9FQ7SBBM9mV3lCUdmHk/S2RAMt0QjFNFqQpWjDPQ01DXWUdDBkXziKPjGEP3VP+zIWU2t7im41FOloyWzn/L6dkUy3VLDaZ6appgDLHPjJEsyvJngWEPUyVBiAaHCTEXwrLvSEbV1e1gKJniicWorC1MUrVjB3uDhJE/wgSOzk1DXpk0k73qCM8xw2UvD5kJmDUfOomqMpWCkJRlvKXGmoeBm18USjVIk04SClxTB6YrgLAPLWYK9HLUt5cmc0vYES8GnTeRc6skZbQkWdxRsIcyBRzx1DbTk9FbU0caTPOgJHhJKnOGIVhQqvKmo0llRw9sabrZkDtdg3PqaKi9oatjY8B+G371paMg6+mZFNNtQ04mWBq3rYLOmtWWQp8KJnpy9DdFensyjdqZ+yY40VJlH8wcdLzC8PZnvHMFUTZUrDTkLyQaGus5X5LzpYAf3i+e/ZlhqGqWhh6Ou6xTR9Z6oi5AZZtp7Mj2EEm8oSpxiYZCHU/1fbGdNNNRRoZMhmilEb2gqHOEJDtXkHK/JnG6IrvbPCwV3NhONVdS1thBMs1T4QOBcTWa2IzhMk2nW5Kyn9tXUtpv9RsG2msxk+ZsQzRQacJncpgke0+T8y5Fzj8BiGo7XlJjaTIlpQs7KFjpqGnKuoyEPeIKnFMkZHvopgh81ySxNFWvJWcKRs70j2FOT012IllEEO1n4pD1513Yg2ssQPOThOkvyrqHUdEXOSEsihmBbTbKX1kLBPWqWkLOqJbjB3GBIZmoa8qWl4CG/iZ7oiA72ZL7TJNeZUY7kFQftDcHHluBzRbCegzMtrRjVQpX2lgoPKKLJAkcbMl01XK2p7yhL8pCBbQ3BN2avJgKvttcrWDK3CiUOVxQ8ZP+pqXKyIxnmBymCg5vJjNfkPK4+c8cIfK8ocVt7kmfd/I5SR1hKvCzUtb+lhgc00ZaO6CyhIQP1Uv4yIZjload72PXX0OIJvnFU+0Zf6MhsJwTfW0r0UwQfW4LNLZl5HK261JCZ4qnBaAreVAS3WrjV0LBnNDUNNDToCEeFfwgcb4gOEqLRhirWkexrCEYKVV711DLYEE1XBEsp5tpTGjorkomKYF9FDXv7fR3BGwbettSxnyL53MBPjsxDZjMh+VUW9NRxq1DhVk+FSxQcaGjV9Pawv6eGByw5qzoy7xk4RsOShqjJwWKe/1pEEfzkobeD/dQJmpqedcyBTy2sr4nGNRH0c0SPWTLrqAc0OQcb/gemKgqucQT7ySWKCn2EUotoCvpZct7RO2sy/QW0IWcXd7pQRQyZVwT2USRO87uhjioTLKV2brpMUcMQRbKH/N2T+UlTpaMls6cmc6CCNy3JdYYSUzzJQ4oSD3oKLncULOiJvjBEC2oqnCJkJluCYy2ZQ5so9YYlZ1VLlQU1mXEW1jZERwj/MUSRc24TdexlqLKfQBtDTScJUV8FszXBEY5ktpD5Ur9hYB4Nb1iikw3JoYpkKX+RodRKFt53MMuRnKSpY31PwYaGaILh3wxJGz9TkTPEETxoCWZrgvOlmyMzxFEwVJE5xZKzvyJ4WxEc16Gd4Xe3Weq4XH2jKRikqOkGQ87hQnC7wBmGYLAnesX3M+S87eFATauuN+Qcrh7xIxXJbUIdMw3JGE3ylCWzrieaqCn4zhGM19TQ3z1oH1AX+pWEqIc7wNGAkULBo/ZxRaV9NNyh4Br3rCHZzbzmSfawBL0dNRwpW1kK9mxPXR9povcdrGSZK9c2k0xwFGzjuniCtRSZCZ6ccZ7gaktmgAOtKbG/JnOkJrjcQTdFMsxRQ2cLY3WTIrlCw1eWKn8R6pvt4GFDso3QoL4a3nLk3G6JrtME3dSenpx7PNFTmga0EaJTLQ061sEeQoWXhSo9LTXsaSjoJQRXeZLtDclbCrYzfzHHeaKjHCVOUkQHO3JeEepr56mhiyaYYKjjNU+Fed1wS5VlhWSqI/hYUdDOkaxiKehoyOnrCV5yBHtbWFqTHCCwtpDcYolesVR5yUzTZBb3RNMd0d6WP+SvhuBmRcGxnuQzT95IC285cr41cLGQ6aJJhmi4TMGempxeimBRQw1tFKV+8jd6KuzoSTqqDxzRtpZkurvKEHxlqXKRIjjfUNNXQsNOsRScoWFLT+YeRZVD3GRN0MdQcKqQjHDMrdGGVu3iYJpQx3WGUvfbmxwFfR20WBq0oYY7LMFhhgYtr8jpaEnaOzjawWWaTP8mMr0t/EPDPoqcnxTBI5o58L7uoWnMrpoqPwgVrlAUWE+V+TQl9rawoyP6QGAlQw2TPRX+YSkxyBC8Z6jhHkXBgQL7WII3DVFnRfCrBfxewv9D6xsyjys4VkhWb9pUU627JllV0YDNHMku/ldNMMXDEo4aFnAkk4U6frNEU4XgZUPmEKHUl44KrzmYamjAbh0JFvGnaTLPu1s9jPCwjFpYiN7z1DTOk/nc07CfDFzmCf7i+bfNHXhDtLeBXzTBT5rkMvWOIxpl4EMh2LGJBu2syDnAEx2naEhHDWMMzPZEhygyS1mS5RTJr5ZkoKbEUoYqr2kqdDUE8ztK7OaIntJkFrIECwv8LJTaVx5XJE86go8dFeZ3FN3rjabCAYpoYEeC9zzJVULBbmZhDyd7ko09ydpNZ3nm2Kee4FPPXHnYEF1nqOFEC08LUVcDvYXkJHW8gTaKCk9YGOeIJhqiE4ToPEepdp7IWFjdwnWaufGMwJJCMtUTTBBK9BGCOy2tGGrJTHIwyEOzp6aPzNMOtlZkDvcEWpP5SVNhfkvDxhmSazTJXYrM9U1E0xwFVwqZQwzJxw6+kGGGUj2FglGGmnb1/G51udRSMNlTw6GGnCcUwVcOpmsqTHa06o72sw1RL02p9z0VbnMLOaIX3QKaYKSCFQzBKEUNHTSc48k53RH9wxGMtpQa5KjjW0W0n6XCCCG4yxNNdhQ4R4l1Ff+2sSd6UFHiIEOyqqFgT01mEUMD+joy75jPhOA+oVVLm309FR4yVOlp4RhLiScNmSmaYF5Pw0STrOIoWMSR2UkRXOMp+M4SHW8o8Zoi6OZgjKOaFar8zZDzkWzvKOjkKBjmCXby8JahhjXULY4KlzgKLvAwxVGhvyd4zxB1d9T0piazmKLCVZY5sKiD0y2ZSYrkUEPUbIk+dlQ4SJHTR50k1DPaUWIdTZW9NJwnJMOECgd7ou/MnppMJ02O1VT4Wsh85MnZzcFTngpXGKo84qmwgKbCL/orR/SzJ2crA+t6Mp94KvxJUeIbT3CQu1uIdlQEOzlKfS3UMcrTiFmOuroocrZrT2AcmamOKg8YomeEKm/rlT2sociMaybaUlFhuqHCM2qIJ+rg4EcDFymiDSxzaHdPcpE62pD5kyM5SBMoA1PaUtfIthS85ig1VPiPPYXgYEMNk4Qq7TXBgo7oT57gPUdwgCHzhIVFPFU6OYJzHAX9m5oNrVjeE61miDrqQ4VSa1oiURTsKHC0IfjNwU2WzK6eqK8jWln4g15TVBnqmDteCJ501PGAocJhhqjZdtBEB6lnhLreFJKxmlKbeGrqLiSThVIbCdGzloasa6lpMQXHCME2boLpJgT7yWaemu6wBONbqGNVRS0PKIL7LckbjmQtR7K8I5qtqel+T/ChJTNIKLjdUMNIRyvOEko9YYl2cwQveBikCNawJKcLBbc7+JM92mysNvd/Fqp8a0k6CNEe7cnZrxlW0wQXaXjaktnRwNOGZKYiONwS7a1JVheq3WgJHlQUGKHKmp4KAxXR/ULURcNgoa4zhKSLpZR3kxRRb0NmD0OFn+UCS7CzI1nbP6+o4x47QZE5xRCt3ZagnYcvmpYQktXdk5YKXTzBC57kKEe0VVuiSYqapssMS3C9p2CKkHOg8B8Pa8p5atrIw3qezIWanMGa5HRDNF6RM9wcacl0N+Q8Z8hsIkSnaIIdHRUOEebAPy1zbCkhM062FCJtif7PU+UtoVXzWKqM1PxXO8cfdruhFQ/a6x3JKYagvVDhQEtNiyiiSQ7OsuRsZUku0CRNDs4Sog6KKjsZgk2bYJqijgsEenoKeniinRXBn/U3lgpPdyDZynQx8IiioMnCep5Ky8mjGs6Wty0l1hUQTcNWswS3WRp2kCNZwJG8omG8JphPUaFbC8lEfabwP7VtM9yoaNCAjpR41VNhrD9LkbN722v0CoZMByFzhaW+MyzRYEWFDQwN2M4/JiT76PuljT3VU/A36eaIThb+R9oZGOAJ9tewkgGvqOMNRWYjT/Cwu99Q8LqDE4TgbLWxJ1jaDDAERsFOFrobgjUsBScaguXU8kKm2RL19tRypSHnHNlHiIZqgufs4opgQdVdwxBNNFBR6kVFqb8ogimOzB6a6HTzrlDHEpYaxjiiA4TMQobkDg2vejjfwJGWmnbVFAw3H3hq2NyQfG7hz4aC+w3BbwbesG0swYayvpAs6++Ri1Vfzx93mFChvyN5xVHTS+0p9aqCAxyZ6ZacZyw5+7uuQkFPR9DDk9NOiE7X1PCYJVjVUqq7JlrHwWALF5nfHNGjApdpqgzx5OwilDhCiDYTgnc9waGW4BdLNNUQvOtpzDOWHDH8D7TR/A/85KljEQu3NREc4Pl/6B1Hhc8Umb5CsKMmGC9EPcxoT2amwHNCmeOEnOPbklnMkbOgIvO5UMOpQrS9UGVdt6iH/fURjhI/WOpaW9OKLYRod6HCUEdOX000wpDZQ6hwg6LgZfOqo1RfT/CrJzjekXOGhpc1VW71ZLbXyyp+93ILbC1kPtIEYx0FIx1VDrLoVzXRKRYWk809yYlC9ImcrinxtabKnzRJk3lAU1OLEN1j2zrYzr2myHRXJFf4h4QKT1qSTzTB5+ZNTzTRkAxX8FcLV2uS8eoQQ2aAkFzvCM72sJIcJET3WPjRk5wi32uSS9rfZajpWEvj9hW42F4o5NytSXYy8IKHay10VYdrcl4SkqscrXpMwyGOgtkajheSxdQqmpxP1L3t4R5PqasFnrQEjytq6qgp9Y09Qx9o4S1FzhUCn1kyHSzBWLemoSGvOqLNhZyBjmCaAUYpMgt4Ck7wBBMMwWKWgjsUwTaGVsxWC1mYoKiyqqeGKYqonSIRQ3KIkHO0pmAxTdBHkbOvfllfr+AA+7gnc50huVKYK393FOyg7rbPO/izI7hE4CnHHHnJ0ogNPRUGeUpsrZZTBJcrovUcJe51BPsr6GkJdhCCsZ6aTtMEb2pqWkqeVtDXE/QVggsU/Nl86d9RMF3DxvZTA58agu810RWawCiSzzXBeU3MMW9oyJUedvNEvQyNu1f10BSMddR1vaLCYpYa/mGocLSiYDcLbQz8aMn5iyF4xBNMs1P0QEOV7o5gaWGuzSeLue4tt3ro7y4Tgm4G/mopdZgl6q0o6KzJWE3mMksNr3r+a6CbT8g5wZNzT9O7fi/zpaOmnz3BRoqos+tv9zMbdpxsqDBOEewtJLt7cg5wtKKbvldpSzRRCD43VFheCI7yZLppggMVBS/KMAdHODJvOwq2NQSbKKKPLdFWQs7Fqo+mpl01JXYRgq8dnGLhTiFzqmWsUMdpllZdbKlyvSdYxhI9YghOtxR8LgSLWHK62mGGVoxzBE8LNWzqH9CUesQzFy5RQzTc56mhi6fgXEWwpKfE5Z7M05ZgZUPmo6auiv8YKzDYwWBLMErIbKHJvOwIrvEdhOBcQ9JdU1NHQ7CXn2XIDFBKU2WAgcX9UAUzDXWd5alwuyJ41Z9rjKLCL4aCp4WarhPm2rH+SaHUYE001JDZ2ZAzXPjdMpZWvC9wmqIB2lLhQ01D5jO06hghWMndbM7yRJMsoCj1vYbnFQVrW9jak3OlEJ3s/96+p33dEPRV5GxiqaGjIthUU6FFEZyqCa5qJrpBdzSw95IUnOPIrCUUjRZQFrbw5PR0R1qiYx3cb6nrWUMrBmmiBQxVHtTew5ICP/ip6g4hed/Akob/32wvBHsIOX83cI8hGeNeNPCIkPmXe8fPKx84OMSRM1MTdXSwjCZ4S30jVGhvqTRak/OVhgGazHuOCud5onEO1lJr6ecVyaOK6H7zqlBlIaHE0oroCgfvGJIdPcmfLNGLjpz7hZwZQpUbFME0A1cIJa7VNORkgfsMBatbKgwwJM9bSvQXeNOvbIjelg6WWvo5kvbKaJJNHexkKNHL9xRyFlH8Ti2riB5wVPhUk7nGkJnoCe428LR/wRGdYIlmWebCyxou1rCk4g/ShugBDX0V0ZQWkh0dOVsagkM0yV6OoLd5ye+pRlsCr0n+KiQrGuq5yJDzrTAXHtLUMduTDBVKrSm3eHL+6ijxhFDX9Z5gVU/wliHYTMiMFpKLNMEywu80wd3meoFmt6VbRMPenhrOc6DVe4pgXU8DnnHakLOIIrlF4FZPIw6R+zxBP0dyq6OOZ4Q5sLKCcz084ok+VsMMyQhNZmmBgX5xIXOEJTmi7VsGTvMTNdHHhpzdbE8Du2oKxgvBqQKdDDnTFOylCFaxR1syz2iqrOI/FEpNc3C6f11/7+ASS6l2inq2ciTrCCzgyemrCL5SVPjQkdPZUmGy2c9Sw9FtR1sS30RmsKPCS4rkIC/2U0MduwucYolGaPjKEyhzmiPYXagyWbYz8LWBDdzRimAXzxx4z8K9hpzlhLq+NiQ97HuKorMUfK/OVvC2JfiHUPCQI/q7J2gjK+tTDNxkCc4TMssqCs4TGtLVwQihyoAWgj9bosU80XGW6Ac9TJGziaUh5+hnFcHOnlaM1iRn29NaqGENTTTSUHCH2tWTeV0osUhH6psuVLjRUmGWhm6OZEshGeNowABHcJ2Bpy2ZszRcKkRXd2QuKVEeXnbfaEq825FguqfgfE2whlChSRMdron+LATTPQ2Z369t4B9C5gs/ylzv+CMmepIDPclFQl13W0rspPd1JOcbghGOEutqCv5qacURQl3dDKyvyJlqKXGPgcM9FfawJAMVmdcspcYKOZc4GjDYkFlK05olNMHyHn4zFNykyOxt99RkHlfwmiHo60l2EKI+mhreEKp080Tbug08BVPcgoqC5zWt+NLDTZ7oNSF51N1qie7Va3uCCwyZbkINf/NED6jzOsBdZjFN8oqG3wxVunqCSYYKf3EdhJyf9YWGf7tRU2oH3VHgPr1fe5J9hOgHd7xQ0y7qBwXr23aGErP0cm64JVjZwsOGqL+mhNgZmhJLW2oY4UhedsyBgzrCKrq7BmcpNVhR6jBPq64Vgi+kn6XE68pp8J5/+0wRHGOpsKenQn9DZntPzjRLZpDAdD2fnSgkG9tmIXnUwQ6WVighs7Yi2MxQ0N3CqYaCXkJ0oyOztMDJjmSSpcpvlrk0RMMOjmArQ04PRV1DO1FwhCVaUVPpKUM03JK5SxPsIWRu8/CGHi8UHChiqGFDTbSRJWeYUDDcH6vJWUxR4k1FXbMUwV6e4AJFXS8oMqsZKqzvYQ9DDQdZckY4aGsIhtlubbd2r3j4QBMoTamdPZk7O/Bf62lacZwneNjQoGcdVU7zJOd7ghsUHOkosagic6cnWc8+4gg285R6zZP5s1/LUbCKIznTwK36PkdwlOrl4U1LwfdCCa+IrvFkmgw1PCAUXKWo0sURXWcI2muKJlgyFzhynCY4RBOsqCjoI1R5zREco0n2Vt09BQtYSizgKNHfUmUrQ5UOCh51BFcLmY7umhYqXKQomOop8bUnWNNQcIiBcYaC6xzMNOS8JQQfeqKBmmglB+97ok/lfk3ygaHSyZaCRTzRxQo6GzLfa2jWBPepw+UmT7SQEJyiyRkhBLMVOfcoMjcK0eZChfUNzFAUzCsEN5vP/X1uP/n/aoMX+K+nw/Hjr/9xOo7j7Pju61tLcgvJpTWXNbfN5jLpi6VfCOviTktKlFusQixdEKWmEBUKNaIpjZRSSOXSgzaaKLdabrm1/9nZ+/f+vd/vz/v9+Xy+zZ7PRorYoZqyLrCwQdEAixxVOEXNNnjX2nUSRlkqGmWowk8lxR50JPy9Bo6qJXaXwNvREBvnThPEPrewryLhcAnj5WE15Fqi8W7R1sAuEu86S4ENikItFN4xkv9Af4nXSnUVcLiA9xzesFpivRRVeFKtsMRaKBhuSbjOELnAUtlSQUpXgdfB4Z1oSbnFEetbQ0IrAe+Y+pqnDcEJFj6S8LDZzZHwY4e3XONNlARraomNEt2bkvGsosA3ioyHm+6jCMbI59wqt4eeara28IzEmyPgoRaUOEDhTVdEJhmCoTWfC0p8aNkCp0oYqih2iqGi4yXeMkOsn4LdLLnmKfh/YogjNsPebeFGR4m9BJHLzB61XQ3BtpISfS2FugsK9FAtLWX1dCRcrCnUp44CNzuCowUZmxSRgYaE6Za0W2u/E7CVXCiI/UOR8aAm1+OSyE3mOUcwyc1zBBeoX1kiKy0Zfxck1Gsyulti11i83QTBF5Kg3pDQThFMVHiPSlK+0cSedng/VaS8bOZbtsBcTcZAR8JP5KeqQ1OYKAi20njdNNRpgnsU//K+JnaXJaGTomr7aYIphoRn9aeShJWKEq9LcozSF7QleEfDI5LYm5bgVkFkRwVDBCVu0DDIkGupo8TZBq+/pMQURYErJQmPKGKjNDkWOLx7Jd5QizdUweIaKrlP7SwJDhZvONjLkOsBBX9UpGxnydhXkfBLQ8IxgojQbLFnJf81JytSljclYYyEFyx0kVBvKWOFJmONpshGAcsduQY5giVNCV51eOdJYo/pLhbvM0uDHSevNKRcrKZIqnCtJeEsO95RoqcgGK4ocZcho1tTYtcZvH41pNQ7vA0WrhIfOSraIIntIAi+NXWCErdbkvrWwjRLrt0NKUdL6KSOscTOdMSOUtBHwL6OLA0vNSdynaWQEnCpIvKaIrJJEbvHkmuNhn6OjM8VkSGSqn1uYJCGHnq9I3aLhNME3t6GjIkO7xrNFumpyTNX/NrwX7CrIRiqqWijI9JO4d1iieykyfiposQIQ8YjjsjlBh6oHWbwRjgYJQn2NgSnNycmJAk3NiXhx44Sxykihxm8ybUwT1OVKySc7vi3OXVkdBJ4AyXBeksDXG0IhgtYY0lY5ahCD0ehborIk5aUWRJviMA7Xt5kyRjonrXENkm8yYqgs8VzgrJmClK20uMM3jRJ0FiQICQF9hdETlLQWRIb5ki6WDfWRPobvO6a4GP5mcOrNzDFELtTkONLh9dXE8xypEg7z8A9jkhrQ6Fhjlg/QVktJXxt4WXzT/03Q8IaQWSqIuEvloQ2mqC9Jfi7wRul4RX3pSPlzpoVlmCtI2jvKHCFhjcM3sN6lqF6HxnKelLjXWbwrpR4xzuCrTUZx2qq9oAh8p6ixCUGr78g8oyjRAtB5CZFwi80VerVpI0h+IeBxa6Zg6kWvpDHaioYYuEsRbDC3eOmC2JvGYLeioxGknL2UATNJN6hmtj1DlpLvDVmocYbrGCVJKOrg4X6DgddLA203BKMFngdJJFtFd7vJLm6KEpc5yjQrkk7M80SGe34X24nSex1Ra5Omgb71JKyg8SrU3i/kARKwWpH0kOGhKkObyfd0ZGjvyXlAkVZ4xRbYJ2irFMkFY1SwyWxr2oo4zlNiV+7zmaweFpT4kR3kaDAFW6xpSqzJay05FtYR4HmZhc9UxKbbfF2V8RG1MBmSaE+kmC6JnaRXK9gsiXhJHl/U0qM0WTcbyhwkYIvFGwjSbjfwhiJt8ZSQU+Bd5+marPMOkVkD0muxYLIfEuhh60x/J92itguihJSEMySVPQnTewnEm+620rTQEMsOfo4/kP/0ARvWjitlpSX7GxBgcMEsd3EEeYWvdytd+Saawi6aCIj1CkGb6Aj9rwhx16Cf3vAwFy5pyLhVonXzy51FDpdEblbkdJbUcEPDEFzQ8qNmhzzLTmmKWKbFCXeEuRabp6rxbvAtLF442QjQ+wEA9eL1xSR7Q0JXzlSHjJ4exq89yR0laScJ/FW6z4a73pFMEfDiRZvuvijIt86RaSFOl01riV2mD1UEvxGk/Geg5aWwGki1zgKPG9J2U8PEg8qYvMsZeytiTRXBMslCU8JSlxi8EabjwUldlDNLfzTUmCgxWsjqWCOHavYAqsknKFIO0yQ61VL5AVFxk6WhEaCAkdJgt9aSkzXlKNX2jEa79waYuc7gq0N3GDJGCBhoiTXUEPsdknCUE1CK0fwsiaylSF2uiDyO4XX3pFhNd7R4itFGc0k/ElBZwWvq+GC6szVeEoS/MZ+qylwpKNKv9Z469UOjqCjwlusicyTxG6VpNxcQ8IncoR4RhLbR+NdpGGmJWOcIzJGUuKPGpQg8rrG21dOMqQssJQ4RxH5jaUqnZuQ0F4Q+cjxLwPtpZbIAk3QTJHQWBE5S1BokoVtDd6lhqr9UpHSUxMcIYl9pojsb8h4SBOsMQcqvOWC2E8EVehqiJ1hrrAEbQxeK0NGZ0Gkq+guSRgniM23bIHVkqwx4hiHd7smaOyglyIyQuM978j4VS08J/A2G1KeMBRo4fBaSNhKUEZfQewVQ/C1I+MgfbEleEzCUw7mKXI0M3hd1EESVji8x5uQ41nxs1q4RMJCCXs7Iq9acpxn22oSDnQ/sJTxsCbHIYZiLyhY05TY0ZLIOQrGaSJDDN4t8pVaIrsqqFdEegtizc1iTew5Q4ayBDMUsQMkXocaYkc0hZua412siZ1rSXlR460zRJ5SlHGe5j801RLMlJTxtaOM3Q1pvxJ45zUlWFD7rsAbpfEm1JHxG0eh8w2R7QQVzBUw28FhFp5QZzq8t2rx2joqulYTWSuJdTYfWwqMFMcovFmSyJPNyLhE4E10pHzYjOC3huArRa571ZsGajQpQx38SBP5pyZB6lMU3khDnp0MBV51BE9o2E+TY5Ml2E8S7C0o6w1xvCZjf0HkVEHCzFoyNmqC+9wdcqN+Tp7jSDheE9ws8Y5V0NJCn2bk2tqSY4okdrEhx1iDN8cSudwepWmAGXKcJXK65H9to8jYQRH7SBF01ESUJdd0TayVInaWhLkOjlXE5irKGOnI6GSWGCJa482zBI9rCr0jyTVcEuzriC1vcr6mwFGSiqy5zMwxBH/TJHwjSPhL8+01kaaSUuMFKTcLEvaUePcrSmwn8DZrgikWb7CGPxkSjhQwrRk57tctmxLsb9sZvL9LSlyuSLlWkqOjwduo8b6Uv1DkmudIeFF2dHCgxVtk8dpIvHpBxhEOdhKk7OLIUSdJ+cSRY57B+0DgGUUlNfpthTfGkauzxrvTsUUaCVhlKeteTXCoJDCa2NOKhOmC4G1H8JBd4OBZReSRGkqcb/CO1PyLJTLB4j1q8JYaIutEjSLX8YKM+a6phdMsdLFUoV5RTm9JSkuDN8WcIon0NZMNZWh1q8C7SJEwV5HxrmnnTrf3KoJBlmCYI2ilSLlfEvlE4011NNgjgthzEua0oKK7JLE7HZHlEl60BLMVFewg4EWNt0ThrVNEVkkiTwpKXSWJzdRENgvKGq4IhjsiezgSFtsfCUq8qki5S1LRQeYQQ4nemmCkImWMw3tFUoUBZk4NOeZYEp4XRKTGa6wJjrWNHBVJR4m3FCnbuD6aak2WsMTh3SZImGCIPKNgsDpVwnsa70K31lCFJZYcwwSMFcQulGTsZuEaSdBXkPGZhu0FsdUO73RHjq8MPGGIfaGIbVTk6iuI3GFgucHrIQkmWSJdBd7BBu+uOryWAhY7+Lki9rK5wtEQzWwvtbqGhIMFwWRJsElsY4m9IIg9L6lCX0VklaPAYkfkZEGDnOWowlBJjtMUkcGK4Lg6EtoZInMUBVYLgn0UsdmCyCz7gIGHFfk+k1QwTh5We7A9x+IdJ6CvIkEagms0hR50eH9UnTQJ+2oiKyVlLFUE+8gBGu8MQ3CppUHesnjTHN4QB/UGPhCTHLFPHMFrCqa73gqObUJGa03wgbhHkrCfpEpzNLE7JDS25FMKhlhKKWKfCgqstLCPu1zBXy0J2ztwjtixBu8UTRn9LVtkmCN2iyFhtME70JHRQ1KVZXqKI/KNIKYMCYs1GUMEKbM1bKOI9LDXC7zbHS+bt+1MTWS9odA9DtrYtpbImQJ2VHh/lisEwaHqUk1kjKTAKknkBEXkbkdMGwq0dnhzLJF3NJH3JVwrqOB4Sca2hti75nmJN0WzxS6UxDYoEpxpa4htVlRjkYE7DZGzJVU72uC9IyhQL4i8YfGWSYLLNcHXloyz7QhNifmKSE9JgfGmuyLhc403Xm9vqcp6gXe3xuuv8F6VJNxkyTHEkHG2g0aKXL0MsXc1bGfgas2//dCONXiNLCX+5mB7eZIl1kHh7ajwpikyzlUUWOVOsjSQlsS+M0R+pPje/dzBXRZGO0rMtgQrLLG9VSu9n6CMXS3BhwYmSoIBhsjNBmZbgusE9BCPCP5triU4VhNbJfE+swSP27aayE8tuTpYYjtrYjMVGZdp2NpS1s6aBnKSHDsbKuplKbHM4a0wMFd/5/DmGyKrJSUaW4IBrqUhx0vyfzTBBLPIUcnZdrAkNsKR0sWRspumSns6Ch0v/qqIbBYUWKvPU/CFoyrDJGwSNFhbA/MlzKqjrO80hRbpKx0Jewsi/STftwGSlKc1JZyAzx05dhLEdnfQvhZOqiHWWEAHC7+30FuRcZUgaO5gpaIK+xsiHRUsqaPElTV40xQZQ107Q9BZE1nryDVGU9ZSQ47bmhBpLcYpUt7S+xuK/FiT8qKjwXYw5ypS2iuCv7q1gtgjhuBuB8LCFY5cUuCNtsQOFcT+4Ih9JX+k8Ea6v0iCIRZOtCT0Et00JW5UeC85Cg0ScK0k411HcG1zKtre3SeITBRk7WfwDhEvaYLTHP9le0m8By0JDwn4TlLW/aJOvGHxdjYUes+ScZigCkYQdNdEOhkiezgShqkx8ueKjI8lDfK2oNiOFvrZH1hS+tk7NV7nOmLHicGWEgubkXKdwdtZknCLJXaCpkrjZBtLZFsDP9CdxWsSr05Sxl6CMmoFbCOgryX40uDtamB7SVmXW4Ihlgpmq+00tBKUUa83WbjLUNkzDmY7cow1JDygyPGlhgGKYKz4vcV7QBNbJIgM11TUqZaMdwTeSguH6rOaw1JRKzaaGyxVm2EJ/uCIrVWUcZUkcp2grMsEjK+DMwS59jQk3Kd6SEq1d0S6uVmO4Bc1lDXTUcHjluCXEq+1OlBDj1pi9zgiXxnKuE0SqTXwhqbETW6RggMEnGl/q49UT2iCzgJvRwVXS2K/d6+ZkyUl7jawSVLit46EwxVljDZwoSQ20sDBihztHfk2yA8NVZghiXwrYHQdfKAOtzsayjhY9bY0yE2CWEeJ9xfzO423xhL5syS2TFJofO2pboHob0nY4GiAgRrvGQEDa/FWSsoaaYl0syRsEt3kWoH3B01shCXhTUWe9w3Bt44SC9QCh3eShQctwbaK2ApLroGCMlZrYqvlY3qYhM0aXpFkPOuoqJ3Dm6fxXrGwVF9gCWZagjPqznfkuMKQ8DPTQRO8ZqG1hPGKEm9IgpGW4DZDgTNriTxvFiq+Lz+0cKfp4wj6OCK9JSnzNSn9LFU7UhKZZMnYwcJ8s8yRsECScK4j5UOB95HFO0CzhY4xJxuCix0lDlEUeMdS6EZBkTsUkZ4K74dugyTXS7aNgL8aqjDfkCE0ZbwkCXpaWCKhl8P7VD5jxykivSyxyZrYERbe168LYu9ZYh86IkscgVLE7tWPKmJv11CgoyJltMEbrohtVAQfO4ImltiHEroYEs7RxAarVpY8AwXMcMReFOTYWe5iiLRQxJ5Q8DtJ8LQhWOhIeFESPGsILhbNDRljNbHzNRlTFbk2S3L0NOS6V1KFJYKUbSTcIIhM0wQ/s2TM0SRMNcQmSap3jCH4yhJZKSkwyRHpYYgsFeQ4U7xoCB7VVOExhXepo9ABBsYbvGWKXPME3lyH95YioZ0gssQRWWbI+FaSMkXijZXwgiTlYdPdkNLaETxlyDVIwqeaEus0aTcYcg0RVOkpR3CSJqIddK+90JCxzsDVloyrFd5ZAr4TBKfaWa6boEA7C7s6EpYaeFPjveooY72mjIccLHJ9HUwVlDhKkmutJDJBwnp1rvulJZggKDRfbXAkvC/4l3ozQOG9a8lxjx0i7nV4jSXc7vhe3OwIxjgSHjdEhhsif9YkPGlus3iLFDnWOFhtCZbJg0UbQcIaR67JjthoCyMEZRwhiXWyxO5QxI6w5NhT4U1WsJvDO60J34fW9hwzwlKij6ZAW9ne4L0s8C6XeBMEkd/LQy1VucBRot6QMlbivaBhoBgjqGiCJNhsqVp/S2SsG6DIONCR0dXhvWbJ+MRRZJkkuEjgDXJjFQW6SSL7GXK8Z2CZg7cVsbWGoKmEpzQ5elpiy8Ryg7dMkLLUEauzeO86CuwlSOlgYLojZWeJ9xM3S1PWfEfKl5ISLQ0MEKR8YOB2QfCxJBjrKPCN4f9MkaSsqoVXJBmP7EpFZ9UQfOoOFwSzBN4MQ8LsGrymlipcJQhmy0GaQjPqCHaXRwuCZwRbqK2Fg9wlClZqYicrIgMdZfxTQ0c7TBIbrChxmuzoKG8XRaSrIhhiyNFJkrC7oIAWMEOQa5aBekPCRknCo4IKPrYkvCDI8aYmY7WFtprgekcJZ3oLIqssCSMtFbQTJKwXYy3BY5oCh2iKPCpJOE+zRdpYgi6O2KmOAgvVCYaU4ySRek1sgyFhJ403QFHiVEmJHwtybO1gs8Hr5+BETQX3War0qZngYGgtVZtoqd6vFSk/UwdZElYqyjrF4HXUeFspIi9IGKf4j92pKGAdCYMVsbcV3kRF0N+R8LUd5PCsIGWoxDtBkCI0nKofdJQxT+LtZflvuc8Q3CjwWkq8KwUpHzkK/NmSsclCL0nseQdj5FRH5CNHSgtLiW80Of5HU9Hhlsga9bnBq3fEVltKfO5IaSTmGjjc4J0otcP7QsJUSQM8pEj5/wCuUuC2DWz8AAAAAElFTkSuQmCC"); } web2py-2.12.3.orig/applications/admin/static/codemirror/theme/the-matrix.css0000664000000000000000000000271112564727254025575 0ustar rootroot.cm-s-the-matrix.CodeMirror { background: #000000; color: #00FF00; } .cm-s-the-matrix div.CodeMirror-selected { background: #2D2D2D !important; } .cm-s-the-matrix .CodeMirror-gutters { background: #060; border-right: 2px solid #00FF00; } .cm-s-the-matrix .CodeMirror-guttermarker { color: #0f0; } .cm-s-the-matrix .CodeMirror-guttermarker-subtle { color: white; } .cm-s-the-matrix .CodeMirror-linenumber { color: #FFFFFF; } .cm-s-the-matrix .CodeMirror-cursor { border-left: 1px solid #00FF00 !important; } .cm-s-the-matrix span.cm-keyword {color: #008803; font-weight: bold;} .cm-s-the-matrix span.cm-atom {color: #3FF;} .cm-s-the-matrix span.cm-number {color: #FFB94F;} .cm-s-the-matrix span.cm-def {color: #99C;} .cm-s-the-matrix span.cm-variable {color: #F6C;} .cm-s-the-matrix span.cm-variable-2 {color: #C6F;} .cm-s-the-matrix span.cm-variable-3 {color: #96F;} .cm-s-the-matrix span.cm-property {color: #62FFA0;} .cm-s-the-matrix span.cm-operator {color: #999} .cm-s-the-matrix span.cm-comment {color: #CCCCCC;} .cm-s-the-matrix span.cm-string {color: #39C;} .cm-s-the-matrix span.cm-meta {color: #C9F;} .cm-s-the-matrix span.cm-qualifier {color: #FFF700;} .cm-s-the-matrix span.cm-builtin {color: #30a;} .cm-s-the-matrix span.cm-bracket {color: #cc7;} .cm-s-the-matrix span.cm-tag {color: #FFBD40;} .cm-s-the-matrix span.cm-attribute {color: #FFF700;} .cm-s-the-matrix span.cm-error {color: #FF0000;} .cm-s-the-matrix .CodeMirror-activeline-background {background: #040;} web2py-2.12.3.orig/applications/admin/static/codemirror/theme/base16-dark.css0000664000000000000000000000324012564727254025511 0ustar rootroot/* Name: Base16 Default Dark Author: Chris Kempson (http://chriskempson.com) CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-chrome-devtools) Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ .cm-s-base16-dark.CodeMirror {background: #151515; color: #e0e0e0;} .cm-s-base16-dark div.CodeMirror-selected {background: #303030 !important;} .cm-s-base16-dark .CodeMirror-gutters {background: #151515; border-right: 0px;} .cm-s-base16-dark .CodeMirror-guttermarker { color: #ac4142; } .cm-s-base16-dark .CodeMirror-guttermarker-subtle { color: #505050; } .cm-s-base16-dark .CodeMirror-linenumber {color: #505050;} .cm-s-base16-dark .CodeMirror-cursor {border-left: 1px solid #b0b0b0 !important;} .cm-s-base16-dark span.cm-comment {color: #8f5536;} .cm-s-base16-dark span.cm-atom {color: #aa759f;} .cm-s-base16-dark span.cm-number {color: #aa759f;} .cm-s-base16-dark span.cm-property, .cm-s-base16-dark span.cm-attribute {color: #90a959;} .cm-s-base16-dark span.cm-keyword {color: #ac4142;} .cm-s-base16-dark span.cm-string {color: #f4bf75;} .cm-s-base16-dark span.cm-variable {color: #90a959;} .cm-s-base16-dark span.cm-variable-2 {color: #6a9fb5;} .cm-s-base16-dark span.cm-def {color: #d28445;} .cm-s-base16-dark span.cm-bracket {color: #e0e0e0;} .cm-s-base16-dark span.cm-tag {color: #ac4142;} .cm-s-base16-dark span.cm-link {color: #aa759f;} .cm-s-base16-dark span.cm-error {background: #ac4142; color: #b0b0b0;} .cm-s-base16-dark .CodeMirror-activeline-background {background: #202020 !important;} .cm-s-base16-dark .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} web2py-2.12.3.orig/applications/admin/static/codemirror/theme/paraiso-dark.css0000664000000000000000000000316312564727254026072 0ustar rootroot/* Name: Paraíso (Dark) Author: Jan T. Sott Color scheme by Jan T. Sott (https://github.com/idleberg/Paraiso-CodeMirror) Inspired by the art of Rubens LP (http://www.rubenslp.com.br) */ .cm-s-paraiso-dark.CodeMirror {background: #2f1e2e; color: #b9b6b0;} .cm-s-paraiso-dark div.CodeMirror-selected {background: #41323f !important;} .cm-s-paraiso-dark .CodeMirror-gutters {background: #2f1e2e; border-right: 0px;} .cm-s-paraiso-dark .CodeMirror-guttermarker { color: #ef6155; } .cm-s-paraiso-dark .CodeMirror-guttermarker-subtle { color: #776e71; } .cm-s-paraiso-dark .CodeMirror-linenumber {color: #776e71;} .cm-s-paraiso-dark .CodeMirror-cursor {border-left: 1px solid #8d8687 !important;} .cm-s-paraiso-dark span.cm-comment {color: #e96ba8;} .cm-s-paraiso-dark span.cm-atom {color: #815ba4;} .cm-s-paraiso-dark span.cm-number {color: #815ba4;} .cm-s-paraiso-dark span.cm-property, .cm-s-paraiso-dark span.cm-attribute {color: #48b685;} .cm-s-paraiso-dark span.cm-keyword {color: #ef6155;} .cm-s-paraiso-dark span.cm-string {color: #fec418;} .cm-s-paraiso-dark span.cm-variable {color: #48b685;} .cm-s-paraiso-dark span.cm-variable-2 {color: #06b6ef;} .cm-s-paraiso-dark span.cm-def {color: #f99b15;} .cm-s-paraiso-dark span.cm-bracket {color: #b9b6b0;} .cm-s-paraiso-dark span.cm-tag {color: #ef6155;} .cm-s-paraiso-dark span.cm-link {color: #815ba4;} .cm-s-paraiso-dark span.cm-error {background: #ef6155; color: #8d8687;} .cm-s-paraiso-dark .CodeMirror-activeline-background {background: #4D344A !important;} .cm-s-paraiso-dark .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} web2py-2.12.3.orig/applications/admin/static/codemirror/theme/lesser-dark.css0000664000000000000000000000421712564727254025732 0ustar rootroot/* http://lesscss.org/ dark theme Ported to CodeMirror by Peter Kroon */ .cm-s-lesser-dark { line-height: 1.3em; } .cm-s-lesser-dark.CodeMirror { background: #262626; color: #EBEFE7; text-shadow: 0 -1px 1px #262626; } .cm-s-lesser-dark div.CodeMirror-selected {background: #45443B !important;} /* 33322B*/ .cm-s-lesser-dark .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-lesser-dark pre { padding: 0 8px; }/*editable code holder*/ .cm-s-lesser-dark.CodeMirror span.CodeMirror-matchingbracket { color: #7EFC7E; }/*65FC65*/ .cm-s-lesser-dark .CodeMirror-gutters { background: #262626; border-right:1px solid #aaa; } .cm-s-lesser-dark .CodeMirror-guttermarker { color: #599eff; } .cm-s-lesser-dark .CodeMirror-guttermarker-subtle { color: #777; } .cm-s-lesser-dark .CodeMirror-linenumber { color: #777; } .cm-s-lesser-dark span.cm-keyword { color: #599eff; } .cm-s-lesser-dark span.cm-atom { color: #C2B470; } .cm-s-lesser-dark span.cm-number { color: #B35E4D; } .cm-s-lesser-dark span.cm-def {color: white;} .cm-s-lesser-dark span.cm-variable { color:#D9BF8C; } .cm-s-lesser-dark span.cm-variable-2 { color: #669199; } .cm-s-lesser-dark span.cm-variable-3 { color: white; } .cm-s-lesser-dark span.cm-property {color: #92A75C;} .cm-s-lesser-dark span.cm-operator {color: #92A75C;} .cm-s-lesser-dark span.cm-comment { color: #666; } .cm-s-lesser-dark span.cm-string { color: #BCD279; } .cm-s-lesser-dark span.cm-string-2 {color: #f50;} .cm-s-lesser-dark span.cm-meta { color: #738C73; } .cm-s-lesser-dark span.cm-qualifier {color: #555;} .cm-s-lesser-dark span.cm-builtin { color: #ff9e59; } .cm-s-lesser-dark span.cm-bracket { color: #EBEFE7; } .cm-s-lesser-dark span.cm-tag { color: #669199; } .cm-s-lesser-dark span.cm-attribute {color: #00c;} .cm-s-lesser-dark span.cm-header {color: #a0a;} .cm-s-lesser-dark span.cm-quote {color: #090;} .cm-s-lesser-dark span.cm-hr {color: #999;} .cm-s-lesser-dark span.cm-link {color: #00c;} .cm-s-lesser-dark span.cm-error { color: #9d1e15; } .cm-s-lesser-dark .CodeMirror-activeline-background {background: #3C3A3A !important;} .cm-s-lesser-dark .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;} web2py-2.12.3.orig/applications/admin/static/codemirror/theme/cobalt.css0000664000000000000000000000247612564727254024767 0ustar rootroot.cm-s-cobalt.CodeMirror { background: #002240; color: white; } .cm-s-cobalt div.CodeMirror-selected { background: #b36539 !important; } .cm-s-cobalt .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } .cm-s-cobalt .CodeMirror-guttermarker { color: #ffee80; } .cm-s-cobalt .CodeMirror-guttermarker-subtle { color: #d0d0d0; } .cm-s-cobalt .CodeMirror-linenumber { color: #d0d0d0; } .cm-s-cobalt .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-cobalt span.cm-comment { color: #08f; } .cm-s-cobalt span.cm-atom { color: #845dc4; } .cm-s-cobalt span.cm-number, .cm-s-cobalt span.cm-attribute { color: #ff80e1; } .cm-s-cobalt span.cm-keyword { color: #ffee80; } .cm-s-cobalt span.cm-string { color: #3ad900; } .cm-s-cobalt span.cm-meta { color: #ff9d00; } .cm-s-cobalt span.cm-variable-2, .cm-s-cobalt span.cm-tag { color: #9effff; } .cm-s-cobalt span.cm-variable-3, .cm-s-cobalt span.cm-def { color: white; } .cm-s-cobalt span.cm-bracket { color: #d8d8d8; } .cm-s-cobalt span.cm-builtin, .cm-s-cobalt span.cm-special { color: #ff9e59; } .cm-s-cobalt span.cm-link { color: #845dc4; } .cm-s-cobalt span.cm-error { color: #9d1e15; } .cm-s-cobalt .CodeMirror-activeline-background {background: #002D57 !important;} .cm-s-cobalt .CodeMirror-matchingbracket {outline:1px solid grey;color:white !important} web2py-2.12.3.orig/applications/admin/static/codemirror/theme/neo.css0000664000000000000000000000164412564727254024300 0ustar rootroot/* neo theme for codemirror */ /* Color scheme */ .cm-s-neo.CodeMirror { background-color:#ffffff; color:#2e383c; line-height:1.4375; } .cm-s-neo .cm-comment {color:#75787b} .cm-s-neo .cm-keyword, .cm-s-neo .cm-property {color:#1d75b3} .cm-s-neo .cm-atom,.cm-s-neo .cm-number {color:#75438a} .cm-s-neo .cm-node,.cm-s-neo .cm-tag {color:#9c3328} .cm-s-neo .cm-string {color:#b35e14} .cm-s-neo .cm-variable,.cm-s-neo .cm-qualifier {color:#047d65} /* Editor styling */ .cm-s-neo pre { padding:0; } .cm-s-neo .CodeMirror-gutters { border:none; border-right:10px solid transparent; background-color:transparent; } .cm-s-neo .CodeMirror-linenumber { padding:0; color:#e0e2e5; } .cm-s-neo .CodeMirror-guttermarker { color: #1d75b3; } .cm-s-neo .CodeMirror-guttermarker-subtle { color: #e0e2e5; } .cm-s-neo div.CodeMirror-cursor { width: auto; border: 0; background: rgba(155,157,162,0.37); z-index: 1; } web2py-2.12.3.orig/applications/admin/static/codemirror/theme/3024-night.css0000664000000000000000000000317512564727254025217 0ustar rootroot/* Name: 3024 night Author: Jan T. Sott (http://github.com/idleberg) CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ .cm-s-3024-night.CodeMirror {background: #090300; color: #d6d5d4;} .cm-s-3024-night div.CodeMirror-selected {background: #3a3432 !important;} .cm-s-3024-night .CodeMirror-gutters {background: #090300; border-right: 0px;} .cm-s-3024-night .CodeMirror-guttermarker { color: #db2d20; } .cm-s-3024-night .CodeMirror-guttermarker-subtle { color: #5c5855; } .cm-s-3024-night .CodeMirror-linenumber {color: #5c5855;} .cm-s-3024-night .CodeMirror-cursor {border-left: 1px solid #807d7c !important;} .cm-s-3024-night span.cm-comment {color: #cdab53;} .cm-s-3024-night span.cm-atom {color: #a16a94;} .cm-s-3024-night span.cm-number {color: #a16a94;} .cm-s-3024-night span.cm-property, .cm-s-3024-night span.cm-attribute {color: #01a252;} .cm-s-3024-night span.cm-keyword {color: #db2d20;} .cm-s-3024-night span.cm-string {color: #fded02;} .cm-s-3024-night span.cm-variable {color: #01a252;} .cm-s-3024-night span.cm-variable-2 {color: #01a0e4;} .cm-s-3024-night span.cm-def {color: #e8bbd0;} .cm-s-3024-night span.cm-bracket {color: #d6d5d4;} .cm-s-3024-night span.cm-tag {color: #db2d20;} .cm-s-3024-night span.cm-link {color: #a16a94;} .cm-s-3024-night span.cm-error {background: #db2d20; color: #807d7c;} .cm-s-3024-night .CodeMirror-activeline-background {background: #2F2F2F !important;} .cm-s-3024-night .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} web2py-2.12.3.orig/applications/admin/static/codemirror/theme/pastel-on-dark.css0000664000000000000000000000402312564727254026332 0ustar rootroot/** * Pastel On Dark theme ported from ACE editor * @license MIT * @copyright AtomicPages LLC 2014 * @author Dennis Thompson, AtomicPages LLC * @version 1.1 * @source https://github.com/atomicpages/codemirror-pastel-on-dark-theme */ .cm-s-pastel-on-dark.CodeMirror { background: #2c2827; color: #8F938F; line-height: 1.5; font-size: 14px; } .cm-s-pastel-on-dark div.CodeMirror-selected { background: rgba(221,240,255,0.2) !important; } .cm-s-pastel-on-dark .CodeMirror-gutters { background: #34302f; border-right: 0px; padding: 0 3px; } .cm-s-pastel-on-dark .CodeMirror-guttermarker { color: white; } .cm-s-pastel-on-dark .CodeMirror-guttermarker-subtle { color: #8F938F; } .cm-s-pastel-on-dark .CodeMirror-linenumber { color: #8F938F; } .cm-s-pastel-on-dark .CodeMirror-cursor { border-left: 1px solid #A7A7A7 !important; } .cm-s-pastel-on-dark span.cm-comment { color: #A6C6FF; } .cm-s-pastel-on-dark span.cm-atom { color: #DE8E30; } .cm-s-pastel-on-dark span.cm-number { color: #CCCCCC; } .cm-s-pastel-on-dark span.cm-property { color: #8F938F; } .cm-s-pastel-on-dark span.cm-attribute { color: #a6e22e; } .cm-s-pastel-on-dark span.cm-keyword { color: #AEB2F8; } .cm-s-pastel-on-dark span.cm-string { color: #66A968; } .cm-s-pastel-on-dark span.cm-variable { color: #AEB2F8; } .cm-s-pastel-on-dark span.cm-variable-2 { color: #BEBF55; } .cm-s-pastel-on-dark span.cm-variable-3 { color: #DE8E30; } .cm-s-pastel-on-dark span.cm-def { color: #757aD8; } .cm-s-pastel-on-dark span.cm-bracket { color: #f8f8f2; } .cm-s-pastel-on-dark span.cm-tag { color: #C1C144; } .cm-s-pastel-on-dark span.cm-link { color: #ae81ff; } .cm-s-pastel-on-dark span.cm-qualifier,.cm-s-pastel-on-dark span.cm-builtin { color: #C1C144; } .cm-s-pastel-on-dark span.cm-error { background: #757aD8; color: #f8f8f0; } .cm-s-pastel-on-dark .CodeMirror-activeline-background { background: rgba(255, 255, 255, 0.031) !important; } .cm-s-pastel-on-dark .CodeMirror-matchingbracket { border: 1px solid rgba(255,255,255,0.25); color: #8F938F !important; margin: -1px -1px 0 -1px; } web2py-2.12.3.orig/applications/admin/static/codemirror/theme/xq-light.css0000664000000000000000000000423212564727254025250 0ustar rootroot/* Copyright (C) 2011 by MarkLogic Corporation Author: Mike Brevoort Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ .cm-s-xq-light span.cm-keyword {line-height: 1em; font-weight: bold; color: #5A5CAD; } .cm-s-xq-light span.cm-atom {color: #6C8CD5;} .cm-s-xq-light span.cm-number {color: #164;} .cm-s-xq-light span.cm-def {text-decoration:underline;} .cm-s-xq-light span.cm-variable {color: black; } .cm-s-xq-light span.cm-variable-2 {color:black;} .cm-s-xq-light span.cm-variable-3 {color: black; } .cm-s-xq-light span.cm-property {} .cm-s-xq-light span.cm-operator {} .cm-s-xq-light span.cm-comment {color: #0080FF; font-style: italic;} .cm-s-xq-light span.cm-string {color: red;} .cm-s-xq-light span.cm-meta {color: yellow;} .cm-s-xq-light span.cm-qualifier {color: grey} .cm-s-xq-light span.cm-builtin {color: #7EA656;} .cm-s-xq-light span.cm-bracket {color: #cc7;} .cm-s-xq-light span.cm-tag {color: #3F7F7F;} .cm-s-xq-light span.cm-attribute {color: #7F007F;} .cm-s-xq-light span.cm-error {color: #f00;} .cm-s-xq-light .CodeMirror-activeline-background {background: #e8f2ff !important;} .cm-s-xq-light .CodeMirror-matchingbracket {outline:1px solid grey;color:black !important;background:yellow;}web2py-2.12.3.orig/applications/admin/static/codemirror/theme/solarized.css0000664000000000000000000001062112564727254025506 0ustar rootroot/* Solarized theme for code-mirror http://ethanschoonover.com/solarized */ /* Solarized color pallet http://ethanschoonover.com/solarized/img/solarized-palette.png */ .solarized.base03 { color: #002b36; } .solarized.base02 { color: #073642; } .solarized.base01 { color: #586e75; } .solarized.base00 { color: #657b83; } .solarized.base0 { color: #839496; } .solarized.base1 { color: #93a1a1; } .solarized.base2 { color: #eee8d5; } .solarized.base3 { color: #fdf6e3; } .solarized.solar-yellow { color: #b58900; } .solarized.solar-orange { color: #cb4b16; } .solarized.solar-red { color: #dc322f; } .solarized.solar-magenta { color: #d33682; } .solarized.solar-violet { color: #6c71c4; } .solarized.solar-blue { color: #268bd2; } .solarized.solar-cyan { color: #2aa198; } .solarized.solar-green { color: #859900; } /* Color scheme for code-mirror */ .cm-s-solarized { line-height: 1.45em; color-profile: sRGB; rendering-intent: auto; } .cm-s-solarized.cm-s-dark { color: #839496; background-color: #002b36; text-shadow: #002b36 0 1px; } .cm-s-solarized.cm-s-light { background-color: #fdf6e3; color: #657b83; text-shadow: #eee8d5 0 1px; } .cm-s-solarized .CodeMirror-widget { text-shadow: none; } .cm-s-solarized .cm-keyword { color: #cb4b16 } .cm-s-solarized .cm-atom { color: #d33682; } .cm-s-solarized .cm-number { color: #d33682; } .cm-s-solarized .cm-def { color: #2aa198; } .cm-s-solarized .cm-variable { color: #268bd2; } .cm-s-solarized .cm-variable-2 { color: #b58900; } .cm-s-solarized .cm-variable-3 { color: #6c71c4; } .cm-s-solarized .cm-property { color: #2aa198; } .cm-s-solarized .cm-operator {color: #6c71c4;} .cm-s-solarized .cm-comment { color: #586e75; font-style:italic; } .cm-s-solarized .cm-string { color: #859900; } .cm-s-solarized .cm-string-2 { color: #b58900; } .cm-s-solarized .cm-meta { color: #859900; } .cm-s-solarized .cm-qualifier { color: #b58900; } .cm-s-solarized .cm-builtin { color: #d33682; } .cm-s-solarized .cm-bracket { color: #cb4b16; } .cm-s-solarized .CodeMirror-matchingbracket { color: #859900; } .cm-s-solarized .CodeMirror-nonmatchingbracket { color: #dc322f; } .cm-s-solarized .cm-tag { color: #93a1a1 } .cm-s-solarized .cm-attribute { color: #2aa198; } .cm-s-solarized .cm-header { color: #586e75; } .cm-s-solarized .cm-quote { color: #93a1a1; } .cm-s-solarized .cm-hr { color: transparent; border-top: 1px solid #586e75; display: block; } .cm-s-solarized .cm-link { color: #93a1a1; cursor: pointer; } .cm-s-solarized .cm-special { color: #6c71c4; } .cm-s-solarized .cm-em { color: #999; text-decoration: underline; text-decoration-style: dotted; } .cm-s-solarized .cm-strong { color: #eee; } .cm-s-solarized .cm-error, .cm-s-solarized .cm-invalidchar { color: #586e75; border-bottom: 1px dotted #dc322f; } .cm-s-solarized.cm-s-dark .CodeMirror-selected { background: #073642; } .cm-s-solarized.cm-s-light .CodeMirror-selected { background: #eee8d5; } /* Editor styling */ /* Little shadow on the view-port of the buffer view */ .cm-s-solarized.CodeMirror { -moz-box-shadow: inset 7px 0 12px -6px #000; -webkit-box-shadow: inset 7px 0 12px -6px #000; box-shadow: inset 7px 0 12px -6px #000; } /* Gutter border and some shadow from it */ .cm-s-solarized .CodeMirror-gutters { border-right: 1px solid; } /* Gutter colors and line number styling based of color scheme (dark / light) */ /* Dark */ .cm-s-solarized.cm-s-dark .CodeMirror-gutters { background-color: #002b36; border-color: #00232c; } .cm-s-solarized.cm-s-dark .CodeMirror-linenumber { text-shadow: #021014 0 -1px; } /* Light */ .cm-s-solarized.cm-s-light .CodeMirror-gutters { background-color: #fdf6e3; border-color: #eee8d5; } /* Common */ .cm-s-solarized .CodeMirror-linenumber { color: #586e75; padding: 0 5px; } .cm-s-solarized .CodeMirror-guttermarker-subtle { color: #586e75; } .cm-s-solarized.cm-s-dark .CodeMirror-guttermarker { color: #ddd; } .cm-s-solarized.cm-s-light .CodeMirror-guttermarker { color: #cb4b16; } .cm-s-solarized .CodeMirror-gutter .CodeMirror-gutter-text { color: #586e75; } .cm-s-solarized .CodeMirror-lines .CodeMirror-cursor { border-left: 1px solid #819090; } /* Active line. Negative margin compensates left padding of the text in the view-port */ .cm-s-solarized.cm-s-dark .CodeMirror-activeline-background { background: rgba(255, 255, 255, 0.10); } .cm-s-solarized.cm-s-light .CodeMirror-activeline-background { background: rgba(0, 0, 0, 0.10); } web2py-2.12.3.orig/applications/admin/static/codemirror/theme/tomorrow-night-bright.css0000664000000000000000000000334312564727254027771 0ustar rootroot/* Name: Tomorrow Night - Bright Author: Chris Kempson Port done by Gerard Braad */ .cm-s-tomorrow-night-bright.CodeMirror {background: #000000; color: #eaeaea;} .cm-s-tomorrow-night-bright div.CodeMirror-selected {background: #424242 !important;} .cm-s-tomorrow-night-bright .CodeMirror-gutters {background: #000000; border-right: 0px;} .cm-s-tomorrow-night-bright .CodeMirror-guttermarker { color: #e78c45; } .cm-s-tomorrow-night-bright .CodeMirror-guttermarker-subtle { color: #777; } .cm-s-tomorrow-night-bright .CodeMirror-linenumber {color: #424242;} .cm-s-tomorrow-night-bright .CodeMirror-cursor {border-left: 1px solid #6A6A6A !important;} .cm-s-tomorrow-night-bright span.cm-comment {color: #d27b53;} .cm-s-tomorrow-night-bright span.cm-atom {color: #a16a94;} .cm-s-tomorrow-night-bright span.cm-number {color: #a16a94;} .cm-s-tomorrow-night-bright span.cm-property, .cm-s-tomorrow-night-bright span.cm-attribute {color: #99cc99;} .cm-s-tomorrow-night-bright span.cm-keyword {color: #d54e53;} .cm-s-tomorrow-night-bright span.cm-string {color: #e7c547;} .cm-s-tomorrow-night-bright span.cm-variable {color: #b9ca4a;} .cm-s-tomorrow-night-bright span.cm-variable-2 {color: #7aa6da;} .cm-s-tomorrow-night-bright span.cm-def {color: #e78c45;} .cm-s-tomorrow-night-bright span.cm-bracket {color: #eaeaea;} .cm-s-tomorrow-night-bright span.cm-tag {color: #d54e53;} .cm-s-tomorrow-night-bright span.cm-link {color: #a16a94;} .cm-s-tomorrow-night-bright span.cm-error {background: #d54e53; color: #6A6A6A;} .cm-s-tomorrow-night-bright .CodeMirror-activeline-background {background: #2a2a2a !important;} .cm-s-tomorrow-night-bright .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} web2py-2.12.3.orig/applications/admin/static/codemirror/theme/paraiso-light.css0000664000000000000000000000321112564727254026252 0ustar rootroot/* Name: Paraíso (Light) Author: Jan T. Sott Color scheme by Jan T. Sott (https://github.com/idleberg/Paraiso-CodeMirror) Inspired by the art of Rubens LP (http://www.rubenslp.com.br) */ .cm-s-paraiso-light.CodeMirror {background: #e7e9db; color: #41323f;} .cm-s-paraiso-light div.CodeMirror-selected {background: #b9b6b0 !important;} .cm-s-paraiso-light .CodeMirror-gutters {background: #e7e9db; border-right: 0px;} .cm-s-paraiso-light .CodeMirror-guttermarker { color: black; } .cm-s-paraiso-light .CodeMirror-guttermarker-subtle { color: #8d8687; } .cm-s-paraiso-light .CodeMirror-linenumber {color: #8d8687;} .cm-s-paraiso-light .CodeMirror-cursor {border-left: 1px solid #776e71 !important;} .cm-s-paraiso-light span.cm-comment {color: #e96ba8;} .cm-s-paraiso-light span.cm-atom {color: #815ba4;} .cm-s-paraiso-light span.cm-number {color: #815ba4;} .cm-s-paraiso-light span.cm-property, .cm-s-paraiso-light span.cm-attribute {color: #48b685;} .cm-s-paraiso-light span.cm-keyword {color: #ef6155;} .cm-s-paraiso-light span.cm-string {color: #fec418;} .cm-s-paraiso-light span.cm-variable {color: #48b685;} .cm-s-paraiso-light span.cm-variable-2 {color: #06b6ef;} .cm-s-paraiso-light span.cm-def {color: #f99b15;} .cm-s-paraiso-light span.cm-bracket {color: #41323f;} .cm-s-paraiso-light span.cm-tag {color: #ef6155;} .cm-s-paraiso-light span.cm-link {color: #815ba4;} .cm-s-paraiso-light span.cm-error {background: #ef6155; color: #776e71;} .cm-s-paraiso-light .CodeMirror-activeline-background {background: #CFD1C4 !important;} .cm-s-paraiso-light .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} web2py-2.12.3.orig/applications/admin/static/codemirror/theme/vibrant-ink.css0000664000000000000000000000326512564727254025744 0ustar rootroot/* Taken from the popular Visual Studio Vibrant Ink Schema */ .cm-s-vibrant-ink.CodeMirror { background: black; color: white; } .cm-s-vibrant-ink .CodeMirror-selected { background: #35493c !important; } .cm-s-vibrant-ink .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } .cm-s-vibrant-ink .CodeMirror-guttermarker { color: white; } .cm-s-vibrant-ink .CodeMirror-guttermarker-subtle { color: #d0d0d0; } .cm-s-vibrant-ink .CodeMirror-linenumber { color: #d0d0d0; } .cm-s-vibrant-ink .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-vibrant-ink .cm-keyword { color: #CC7832; } .cm-s-vibrant-ink .cm-atom { color: #FC0; } .cm-s-vibrant-ink .cm-number { color: #FFEE98; } .cm-s-vibrant-ink .cm-def { color: #8DA6CE; } .cm-s-vibrant-ink span.cm-variable-2, .cm-s-vibrant span.cm-tag { color: #FFC66D } .cm-s-vibrant-ink span.cm-variable-3, .cm-s-vibrant span.cm-def { color: #FFC66D } .cm-s-vibrant-ink .cm-operator { color: #888; } .cm-s-vibrant-ink .cm-comment { color: gray; font-weight: bold; } .cm-s-vibrant-ink .cm-string { color: #A5C25C } .cm-s-vibrant-ink .cm-string-2 { color: red } .cm-s-vibrant-ink .cm-meta { color: #D8FA3C; } .cm-s-vibrant-ink .cm-builtin { color: #8DA6CE; } .cm-s-vibrant-ink .cm-tag { color: #8DA6CE; } .cm-s-vibrant-ink .cm-attribute { color: #8DA6CE; } .cm-s-vibrant-ink .cm-header { color: #FF6400; } .cm-s-vibrant-ink .cm-hr { color: #AEAEAE; } .cm-s-vibrant-ink .cm-link { color: blue; } .cm-s-vibrant-ink .cm-error { border-bottom: 1px solid red; } .cm-s-vibrant-ink .CodeMirror-activeline-background {background: #27282E !important;} .cm-s-vibrant-ink .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;} web2py-2.12.3.orig/applications/admin/static/codemirror/theme/night.css0000664000000000000000000000261012564727254024622 0ustar rootroot/* Loosely based on the Midnight Textmate theme */ .cm-s-night.CodeMirror { background: #0a001f; color: #f8f8f8; } .cm-s-night div.CodeMirror-selected { background: #447 !important; } .cm-s-night .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; } .cm-s-night .CodeMirror-guttermarker { color: white; } .cm-s-night .CodeMirror-guttermarker-subtle { color: #bbb; } .cm-s-night .CodeMirror-linenumber { color: #f8f8f8; } .cm-s-night .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-night span.cm-comment { color: #6900a1; } .cm-s-night span.cm-atom { color: #845dc4; } .cm-s-night span.cm-number, .cm-s-night span.cm-attribute { color: #ffd500; } .cm-s-night span.cm-keyword { color: #599eff; } .cm-s-night span.cm-string { color: #37f14a; } .cm-s-night span.cm-meta { color: #7678e2; } .cm-s-night span.cm-variable-2, .cm-s-night span.cm-tag { color: #99b2ff; } .cm-s-night span.cm-variable-3, .cm-s-night span.cm-def { color: white; } .cm-s-night span.cm-bracket { color: #8da6ce; } .cm-s-night span.cm-comment { color: #6900a1; } .cm-s-night span.cm-builtin, .cm-s-night span.cm-special { color: #ff9e59; } .cm-s-night span.cm-link { color: #845dc4; } .cm-s-night span.cm-error { color: #9d1e15; } .cm-s-night .CodeMirror-activeline-background {background: #1C005A !important;} .cm-s-night .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;} web2py-2.12.3.orig/applications/admin/static/codemirror/theme/xq-dark.css0000664000000000000000000000505512564727254025066 0ustar rootroot/* Copyright (C) 2011 by MarkLogic Corporation Author: Mike Brevoort Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ .cm-s-xq-dark.CodeMirror { background: #0a001f; color: #f8f8f8; } .cm-s-xq-dark .CodeMirror-selected { background: #27007A !important; } .cm-s-xq-dark .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; } .cm-s-xq-dark .CodeMirror-guttermarker { color: #FFBD40; } .cm-s-xq-dark .CodeMirror-guttermarker-subtle { color: #f8f8f8; } .cm-s-xq-dark .CodeMirror-linenumber { color: #f8f8f8; } .cm-s-xq-dark .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-xq-dark span.cm-keyword {color: #FFBD40;} .cm-s-xq-dark span.cm-atom {color: #6C8CD5;} .cm-s-xq-dark span.cm-number {color: #164;} .cm-s-xq-dark span.cm-def {color: #FFF; text-decoration:underline;} .cm-s-xq-dark span.cm-variable {color: #FFF;} .cm-s-xq-dark span.cm-variable-2 {color: #EEE;} .cm-s-xq-dark span.cm-variable-3 {color: #DDD;} .cm-s-xq-dark span.cm-property {} .cm-s-xq-dark span.cm-operator {} .cm-s-xq-dark span.cm-comment {color: gray;} .cm-s-xq-dark span.cm-string {color: #9FEE00;} .cm-s-xq-dark span.cm-meta {color: yellow;} .cm-s-xq-dark span.cm-qualifier {color: #FFF700;} .cm-s-xq-dark span.cm-builtin {color: #30a;} .cm-s-xq-dark span.cm-bracket {color: #cc7;} .cm-s-xq-dark span.cm-tag {color: #FFBD40;} .cm-s-xq-dark span.cm-attribute {color: #FFF700;} .cm-s-xq-dark span.cm-error {color: #f00;} .cm-s-xq-dark .CodeMirror-activeline-background {background: #27282E !important;} .cm-s-xq-dark .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;}web2py-2.12.3.orig/applications/admin/static/codemirror/theme/rubyblue.css0000664000000000000000000000257212564727254025351 0ustar rootroot.cm-s-rubyblue.CodeMirror { background: #112435; color: white; } .cm-s-rubyblue div.CodeMirror-selected { background: #38566F !important; } .cm-s-rubyblue .CodeMirror-gutters { background: #1F4661; border-right: 7px solid #3E7087; } .cm-s-rubyblue .CodeMirror-guttermarker { color: white; } .cm-s-rubyblue .CodeMirror-guttermarker-subtle { color: #3E7087; } .cm-s-rubyblue .CodeMirror-linenumber { color: white; } .cm-s-rubyblue .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-rubyblue span.cm-comment { color: #999; font-style:italic; line-height: 1em; } .cm-s-rubyblue span.cm-atom { color: #F4C20B; } .cm-s-rubyblue span.cm-number, .cm-s-rubyblue span.cm-attribute { color: #82C6E0; } .cm-s-rubyblue span.cm-keyword { color: #F0F; } .cm-s-rubyblue span.cm-string { color: #F08047; } .cm-s-rubyblue span.cm-meta { color: #F0F; } .cm-s-rubyblue span.cm-variable-2, .cm-s-rubyblue span.cm-tag { color: #7BD827; } .cm-s-rubyblue span.cm-variable-3, .cm-s-rubyblue span.cm-def { color: white; } .cm-s-rubyblue span.cm-bracket { color: #F0F; } .cm-s-rubyblue span.cm-link { color: #F4C20B; } .cm-s-rubyblue span.CodeMirror-matchingbracket { color:#F0F !important; } .cm-s-rubyblue span.cm-builtin, .cm-s-rubyblue span.cm-special { color: #FF9D00; } .cm-s-rubyblue span.cm-error { color: #AF2018; } .cm-s-rubyblue .CodeMirror-activeline-background {background: #173047 !important;} web2py-2.12.3.orig/applications/admin/static/codemirror/theme/twilight.css0000664000000000000000000000334412564727254025351 0ustar rootroot.cm-s-twilight.CodeMirror { background: #141414; color: #f7f7f7; } /**/ .cm-s-twilight .CodeMirror-selected { background: #323232 !important; } /**/ .cm-s-twilight .CodeMirror-gutters { background: #222; border-right: 1px solid #aaa; } .cm-s-twilight .CodeMirror-guttermarker { color: white; } .cm-s-twilight .CodeMirror-guttermarker-subtle { color: #aaa; } .cm-s-twilight .CodeMirror-linenumber { color: #aaa; } .cm-s-twilight .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-twilight .cm-keyword { color: #f9ee98; } /**/ .cm-s-twilight .cm-atom { color: #FC0; } .cm-s-twilight .cm-number { color: #ca7841; } /**/ .cm-s-twilight .cm-def { color: #8DA6CE; } .cm-s-twilight span.cm-variable-2, .cm-s-twilight span.cm-tag { color: #607392; } /**/ .cm-s-twilight span.cm-variable-3, .cm-s-twilight span.cm-def { color: #607392; } /**/ .cm-s-twilight .cm-operator { color: #cda869; } /**/ .cm-s-twilight .cm-comment { color:#777; font-style:italic; font-weight:normal; } /**/ .cm-s-twilight .cm-string { color:#8f9d6a; font-style:italic; } /**/ .cm-s-twilight .cm-string-2 { color:#bd6b18 } /*?*/ .cm-s-twilight .cm-meta { background-color:#141414; color:#f7f7f7; } /*?*/ .cm-s-twilight .cm-builtin { color: #cda869; } /*?*/ .cm-s-twilight .cm-tag { color: #997643; } /**/ .cm-s-twilight .cm-attribute { color: #d6bb6d; } /*?*/ .cm-s-twilight .cm-header { color: #FF6400; } .cm-s-twilight .cm-hr { color: #AEAEAE; } .cm-s-twilight .cm-link { color:#ad9361; font-style:italic; text-decoration:none; } /**/ .cm-s-twilight .cm-error { border-bottom: 1px solid red; } .cm-s-twilight .CodeMirror-activeline-background {background: #27282E !important;} .cm-s-twilight .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;} web2py-2.12.3.orig/applications/admin/static/codemirror/emmet.min.js0000664000000000000000000044262612564727254024143 0ustar rootrootvar _=function(){function h(a,b,c){if(a===b)return a!==0||1/a==1/b;if(a==null||b==null)return a===b;if(a._chain)a=a._wrapped;if(b._chain)b=b._wrapped;if(a.isEqual&&k.isFunction(a.isEqual))return a.isEqual(b);if(b.isEqual&&k.isFunction(b.isEqual))return b.isEqual(a);var e=g.call(a);if(e!=g.call(b))return!1;switch(e){case "[object String]":return a==String(b);case "[object Number]":return a!=+a?b!=+b:a==0?1/a==1/b:a==+b;case "[object Date]":case "[object Boolean]":return+a==+b;case "[object RegExp]":return a.source== b.source&&a.global==b.global&&a.multiline==b.multiline&&a.ignoreCase==b.ignoreCase}if(typeof a!="object"||typeof b!="object")return!1;for(var d=c.length;d--;)if(c[d]==a)return!0;c.push(a);var d=0,j=!0;if(e=="[object Array]"){if(d=a.length,j=d==b.length)for(;d--;)if(!(j=d in a==d in b&&h(a[d],b[d],c)))break}else{if("constructor"in a!="constructor"in b||a.constructor!=b.constructor)return!1;for(var f in a)if(k.has(a,f)&&(d++,!(j=k.has(b,f)&&h(a[f],b[f],c))))break;if(j){for(f in b)if(k.has(b,f)&&!d--)break; j=!d}}c.pop();return j}var d=this,f=d._,i={},b=Array.prototype,c=Object.prototype,a=b.slice,e=b.unshift,g=c.toString,j=c.hasOwnProperty,l=b.forEach,m=b.map,n=b.reduce,o=b.reduceRight,q=b.filter,s=b.every,r=b.some,u=b.indexOf,p=b.lastIndexOf,c=Array.isArray,v=Object.keys,w=Function.prototype.bind,k=function(a){return new y(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=k;exports._=k}else d._=k;k.VERSION="1.3.3";var t=k.each=k.forEach=function(a, b,c){if(a!=null)if(l&&a.forEach===l)a.forEach(b,c);else if(a.length===+a.length)for(var g=0,e=a.length;g2;a==null&&(a=[]);if(n&& a.reduce===n)return g&&(b=k.bind(b,g)),e?a.reduce(b,c):a.reduce(b);t(a,function(a,d,j){e?c=b.call(g,c,a,d,j):(c=a,e=!0)});if(!e)throw new TypeError("Reduce of empty array with no initial value");return c};k.reduceRight=k.foldr=function(a,b,c,g){var e=arguments.length>2;a==null&&(a=[]);if(o&&a.reduceRight===o)return g&&(b=k.bind(b,g)),e?a.reduceRight(b,c):a.reduceRight(b);var d=k.toArray(a).reverse();g&&!e&&(b=k.bind(b,g));return e?k.reduce(d,b,c,g):k.reduce(d,b)};k.find=k.detect=function(a,b,c){var g; z(a,function(a,e,d){if(b.call(c,a,e,d))return g=a,!0});return g};k.filter=k.select=function(a,b,c){var g=[];if(a==null)return g;if(q&&a.filter===q)return a.filter(b,c);t(a,function(a,e,d){b.call(c,a,e,d)&&(g[g.length]=a)});return g};k.reject=function(a,b,c){var g=[];if(a==null)return g;t(a,function(a,e,d){b.call(c,a,e,d)||(g[g.length]=a)});return g};k.every=k.all=function(a,b,c){var g=!0;if(a==null)return g;if(s&&a.every===s)return a.every(b,c);t(a,function(a,e,d){if(!(g=g&&b.call(c,a,e,d)))return i}); return!!g};var z=k.some=k.any=function(a,b,c){b||(b=k.identity);var g=!1;if(a==null)return g;if(r&&a.some===r)return a.some(b,c);t(a,function(a,e,d){if(g||(g=b.call(c,a,e,d)))return i});return!!g};k.include=k.contains=function(a,b){var c=!1;return a==null?c:u&&a.indexOf===u?a.indexOf(b)!=-1:c=z(a,function(a){return a===b})};k.invoke=function(b,c){var g=a.call(arguments,2);return k.map(b,function(a){return(k.isFunction(c)?c||a:a[c]).apply(a,g)})};k.pluck=function(a,b){return k.map(a,function(a){return a[b]})}; k.max=function(a,b,c){if(!b&&k.isArray(a)&&a[0]===+a[0])return Math.max.apply(Math,a);if(!b&&k.isEmpty(a))return-Infinity;var g={computed:-Infinity};t(a,function(a,e,d){e=b?b.call(c,a,e,d):a;e>=g.computed&&(g={value:a,computed:e})});return g.value};k.min=function(a,b,c){if(!b&&k.isArray(a)&&a[0]===+a[0])return Math.min.apply(Math,a);if(!b&&k.isEmpty(a))return Infinity;var g={computed:Infinity};t(a,function(a,e,d){e=b?b.call(c,a,e,d):a;eg?1:0}),"value")};k.groupBy=function(a,b){var c={},g=k.isFunction(b)?b:function(a){return a[b]};t(a,function(a,b){var e=g(a,b);(c[e]||(c[e]=[])).push(a)}); return c};k.sortedIndex=function(a,b,c){c||(c=k.identity);for(var g=0,e=a.length;g>1;c(a[d])=0})})};k.difference=function(b){var c=k.flatten(a.call(arguments,1),!0);return k.filter(b,function(a){return!k.include(c,a)})};k.zip=function(){for(var b=a.call(arguments),c=k.max(k.pluck(b,"length")), g=Array(c),e=0;e=0;c--)b=[a[c].apply(this,b)];return b[0]}};k.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};k.keys=v||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var b=[],c;for(c in a)k.has(a,c)&&(b[b.length]=c);return b};k.values=function(a){return k.map(a,k.identity)};k.functions=k.methods=function(a){var b=[],c;for(c in a)k.isFunction(a[c])&&b.push(c);return b.sort()};k.extend=function(b){t(a.call(arguments, 1),function(a){for(var c in a)b[c]=a[c]});return b};k.pick=function(b){var c={};t(k.flatten(a.call(arguments,1)),function(a){a in b&&(c[a]=b[a])});return c};k.defaults=function(b){t(a.call(arguments,1),function(a){for(var c in a)b[c]==null&&(b[c]=a[c])});return b};k.clone=function(a){return!k.isObject(a)?a:k.isArray(a)?a.slice():k.extend({},a)};k.tap=function(a,b){b(a);return a};k.isEqual=function(a,b){return h(a,b,[])};k.isEmpty=function(a){if(a==null)return!0;if(k.isArray(a)||k.isString(a))return a.length=== 0;for(var b in a)if(k.has(a,b))return!1;return!0};k.isElement=function(a){return!!(a&&a.nodeType==1)};k.isArray=c||function(a){return g.call(a)=="[object Array]"};k.isObject=function(a){return a===Object(a)};k.isArguments=function(a){return g.call(a)=="[object Arguments]"};if(!k.isArguments(arguments))k.isArguments=function(a){return!(!a||!k.has(a,"callee"))};k.isFunction=function(a){return g.call(a)=="[object Function]"};k.isString=function(a){return g.call(a)=="[object String]"};k.isNumber=function(a){return g.call(a)== "[object Number]"};k.isFinite=function(a){return k.isNumber(a)&&isFinite(a)};k.isNaN=function(a){return a!==a};k.isBoolean=function(a){return a===!0||a===!1||g.call(a)=="[object Boolean]"};k.isDate=function(a){return g.call(a)=="[object Date]"};k.isRegExp=function(a){return g.call(a)=="[object RegExp]"};k.isNull=function(a){return a===null};k.isUndefined=function(a){return a===void 0};k.has=function(a,b){return j.call(a,b)};k.noConflict=function(){d._=f;return this};k.identity=function(a){return a}; k.times=function(a,b,c){for(var g=0;g/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")};k.result=function(a,b){if(a==null)return null;var c=a[b];return k.isFunction(c)?c.call(a):c};k.mixin=function(a){t(k.functions(a),function(b){F(b,k[b]=a[b])})};var G=0;k.uniqueId=function(a){var b=G++;return a?a+b:b};k.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g, escape:/<%-([\s\S]+?)%>/g};var B=/.^/,A={"\\":"\\","'":"'",r:"\r",n:"\n",t:"\t",u2028:"\u2028",u2029:"\u2029"},C;for(C in A)A[A[C]]=C;var H=/\\|'|\r|\n|\t|\u2028|\u2029/g,I=/\\(\\|'|r|n|t|u2028|u2029)/g,D=function(a){return a.replace(I,function(a,b){return A[b]})};k.template=function(a,b,c){c=k.defaults(c||{},k.templateSettings);a="__p+='"+a.replace(H,function(a){return"\\"+A[a]}).replace(c.escape||B,function(a,b){return"'+\n_.escape("+D(b)+")+\n'"}).replace(c.interpolate||B,function(a,b){return"'+\n("+ D(b)+")+\n'"}).replace(c.evaluate||B,function(a,b){return"';\n"+D(b)+"\n;__p+='"})+"';\n";c.variable||(a="with(obj||{}){\n"+a+"}\n");var a="var __p='';var print=function(){__p+=Array.prototype.join.call(arguments, '')};\n"+a+"return __p;\n",g=new Function(c.variable||"obj","_",a);if(b)return g(b,k);b=function(a){return g.call(this,a,k)};b.source="function("+(c.variable||"obj")+"){\n"+a+"}";return b};k.chain=function(a){return k(a).chain()};var y=function(a){this._wrapped=a};k.prototype=y.prototype; var E=function(a,b){return b?k(a).chain():a},F=function(b,c){y.prototype[b]=function(){var b=a.call(arguments);e.call(b,this._wrapped);return E(c.apply(k,b),this._chain)}};k.mixin(k);t(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var c=b[a];y.prototype[a]=function(){var b=this._wrapped;c.apply(b,arguments);var g=b.length;(a=="shift"||a=="splice")&&g===0&&delete b[0];return E(b,this._chain)}});t(["concat","join","slice"],function(a){var c=b[a];y.prototype[a]=function(){return E(c.apply(this._wrapped, arguments),this._chain)}});y.prototype.chain=function(){this._chain=!0;return this};y.prototype.value=function(){return this._wrapped};return k}.call({}),emmet=function(h){function d(a,b,d){var f;f=b&&b.hasOwnProperty("constructor")?b.constructor:function(){a.apply(this,arguments)};_.extend(f,a);c.prototype=a.prototype;f.prototype=new c;b&&_.extend(f.prototype,b);d&&_.extend(f,d);f.prototype.constructor=f;f.__super__=a.prototype;return f}function f(c){!(c in b)&&a&&a(c);return b[c]}if(typeof _=="undefined")try{_= h.require("underscore")}catch(i){}if(typeof _=="undefined")throw"Cannot access to Underscore.js lib";var b={_:_},c=function(){},a=null;return{define:function(a,c){a in b||(b[a]=_.isFunction(c)?this.exec(c):c)},require:f,exec:function(a,b){return a.call(b||h,_.bind(f,this),_,this)},extend:function(a,b){var c=d(this,a,b);c.extend=this.extend;if(a.hasOwnProperty("toString"))c.prototype.toString=a.toString;return c},expandAbbreviation:function(a,b,c,d){if(!a)return"";var b=b||"html",h=f("filters"),i= f("abbreviationParser"),c=f("profile").get(c,b);f("tabStops").resetTabstopIndex();a=h.extractFromAbbreviation(a);d=i.parse(a[0],{syntax:b,contextNode:d});b=h.composeList(b,c,a[1]);h.apply(d,b,c);return d.toString()},defaultSyntax:function(){return"html"},defaultProfile:function(){return"plain"},log:function(){h.console&&h.console.log&&h.console.log.apply(h.console,arguments)},setModuleLoader:function(b){a=b}}}(this); if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=emmet;exports.emmet=emmet} emmet.define("abbreviationParser",function(h,d){function f(){this.parent=null;this.children=[];this._attributes=[];this.abbreviation="";this.counter=1;this._name=null;this._text="";this.repeatCount=1;this.hasImplicitRepeat=!1;this._data={};this.padding=this.content=this.end=this.start=""}function i(a){return a.substring(1,a.length-1)}function b(a){for(var a=h("utils").trim(a),c=new f,g=c.addChild(),e,j=h("stringStream").create(a),a=1E3,l;!j.eol()&&--a>0;)switch(e=j.peek(),e){case "(":j.start=j.pos; if(j.skipToPair("(",")"))e=b(i(j.current())),(l=j.match(/^\*(\d+)?/,!0))&&g._setRepeat(l[1]),d.each(e.children,function(a){g.addChild(a)});else throw'Invalid abbreviation: mo matching ")" found for character at '+j.pos;break;case ">":g=g.addChild();j.next();break;case "+":g=g.parent.addChild();j.next();break;case "^":e=g.parent||g;g=(e.parent||e).addChild();j.next();break;default:j.start=j.pos,j.eatWhile(function(a){if(a=="["||a=="{"){if(j.skipToPair(a,q[a]))return j.backUp(1),!0;throw'Invalid abbreviation: mo matching "'+ q[a]+'" found for character at '+j.pos;}return a=="+"?(j.next(),a=j.eol()||~"+>^*".indexOf(j.peek()),j.backUp(1),a):a!="("&&m(a)}),g.setAbbreviation(j.current()),j.start=j.pos}if(a<1)throw"Endless loop detected";return c}function c(a){var a=h("utils").trim(a),b=[],a=h("stringStream").create(a);for(a.eatSpace();!a.eol();)if(a.start=a.pos,a.eatWhile(o)){var c=a.current(),g="";if(a.peek()=="="){a.next();a.start=a.pos;var e=a.peek();if(e=='"'||e=="'"){a.next();a:{for(var g=a,d=void 0;d=g.next();)if(d=== e){g=!0;break a}g=!1}if(g)g=a.current(),g=g.substring(1,g.length-1);else throw"Invalid attribute value";}else if(a.eatWhile(/[^\s\]]/))g=a.current();else throw"Invalid attribute value";}b.push({name:c,value:g});a.eatSpace()}else break;return b}function a(a){for(var b=[],g={"#":"id",".":"class"},d=null,j=h("stringStream").create(a);!j.eol();)switch(j.peek()){case "#":case ".":if(d===null)d=j.pos;var f=g[j.peek()];j.next();j.start=j.pos;j.eatWhile(o);b.push({name:f,value:j.current()});break;case "[":if(d=== null)d=j.pos;j.start=j.pos;if(!j.skipToPair("[","]"))throw"Invalid attribute set definition";b=b.concat(c(i(j.current())));break;default:j.next()}return!b.length?null:{element:a.substring(0,d),attributes:e(b)}}function e(a){var a=d.map(a,function(a){return d.clone(a)}),b={};return d.filter(a,function(a){if(!(a.name in b))return b[a.name]=a;var c=b[a.name];a.name.toLowerCase()=="class"?c.value+=(c.value.length?" ":"")+a.value:c.value=a.value;return!1})}function g(a){if(!~a.indexOf("{"))return null; for(var b=h("stringStream").create(a);!b.eol();)switch(b.peek()){case "[":case "(":b.skipToPair(b.peek(),q[b.peek()]);break;case "{":return b.start=b.pos,b.skipToPair("{","}"),{element:a.substring(0,b.start),text:i(b.current())};default:b.next()}}function j(a){for(var b=a.children.length-1,c,g;b>=0;b--)if(g=a.children[b],g.isRepeating()){c=g.repeatCount;g.repeatCount=1;for(g.updateProperty("counter",1);--c>0;)g.parent.addChild(g.clone(),b+1).updateProperty("counter",c+1)}d.each(a.children,j);return a} function l(a){for(var b=a.children.length-1;b>=0;b--){var c=a.children[b];c.isGroup()?c.replace(l(c).children):c.isEmpty()&&c.remove()}d.each(a.children,l);return a}function m(a){var b=a.charCodeAt(0);return b>64&&b<91||b>96&&b<123||b>47&&b<58||"#.*:$-_!@|%".indexOf(a)!=-1}var n=/^[\w\-\$\:@\!%]+\+?$/i,o=/[\w\-:\$]/,q={"[":"]","(":")","{":"}"},s=Array.prototype.splice,r=[],u=[],p=[];f.prototype={addChild:function(a,b){a=a||new f;a.parent=this;d.isUndefined(b)?this.children.push(a):this.children.splice(b, 0,a);return a},clone:function(){var a=new f;d.each(["abbreviation","counter","_name","_text","repeatCount","hasImplicitRepeat","start","end","content","padding"],function(b){a[b]=this[b]},this);a._attributes=d.map(this._attributes,function(a){return d.clone(a)});a._data=d.clone(this._data);a.children=d.map(this.children,function(b){b=b.clone();b.parent=a;return b});return a},remove:function(){if(this.parent)this.parent.children=d.without(this.parent.children,this);return this},replace:function(){var a= this.parent,b=d.indexOf(a.children,this),c=d.flatten(arguments);s.apply(a.children,[b,1].concat(c));d.each(c,function(b){b.parent=a})},updateProperty:function(a,b){this[a]=b;d.each(this.children,function(c){c.updateProperty(a,b)})},find:function(a){return this.findAll(a)[0]},findAll:function(a){if(!d.isFunction(a))var b=a.toLowerCase(),a=function(a){return a.name().toLowerCase()==b};var c=[];d.each(this.children,function(b){a(b)&&c.push(b);c=c.concat(b.findAll(a))});return d.compact(c)},data:function(a, b){if(arguments.length==2&&(this._data[a]=b,a=="resource"&&h("elements").is(b,"snippet")&&(this.content=b.data,this._text)))this.content=h("abbreviationUtils").insertChildContent(b.data,this._text);return this._data[a]},name:function(){var a=this.matchedResource();return h("elements").is(a,"element")?a.name:this._name},attributeList:function(){var a=[],b=this.matchedResource();h("elements").is(b,"element")&&d.isArray(b.attributes)&&(a=a.concat(b.attributes));return e(a.concat(this._attributes))}, attribute:function(a,b){if(arguments.length==2){var c=d.indexOf(d.pluck(this._attributes,"name"),a.toLowerCase());~c?this._attributes[c].value=b:this._attributes.push({name:a,value:b})}return(d.find(this.attributeList(),function(b){return b.name==a})||{}).value},matchedResource:function(){return this.data("resource")},index:function(){return this.parent?d.indexOf(this.parent.children,this):-1},_setRepeat:function(a){a?this.repeatCount=parseInt(a,10)||1:this.hasImplicitRepeat=!0},setAbbreviation:function(b){var c= this;this.abbreviation=b=(b||"").replace(/\*(\d+)?$/,function(a,b){c._setRepeat(b);return""});var e=g(b);if(e)b=e.element,this.content=this._text=e.text;if(e=a(b))b=e.element,this._attributes=e.attributes;if((this._name=b)&&!n.test(this._name))throw"Invalid abbreviation";},toString:function(){var a=h("utils"),b=this.start,c=this.end,g=this.content,e=this;d.each(p,function(a){b=a(b,e,"start");g=a(g,e,"content");c=a(c,e,"end")});var j=d.map(this.children,function(a){return a.toString()}).join(""),g= h("abbreviationUtils").insertChildContent(g,j,{keepVariable:!1});return b+a.padString(g,this.padding)+c},hasEmptyChildren:function(){return!!d.find(this.children,function(a){return a.isEmpty()})},hasImplicitName:function(){return!this._name&&!this.isTextNode()},isGroup:function(){return!this.abbreviation},isEmpty:function(){return!this.abbreviation&&!this.children.length},isRepeating:function(){return this.repeatCount>1||this.hasImplicitRepeat},isTextNode:function(){return!this.name()&&!this.attributeList().length}, isElement:function(){return!this.isEmpty()&&!this.isTextNode()},deepestChild:function(){if(!this.children.length)return null;for(var a=this;a.children.length;)a=d.last(a.children);return a}};p.push(function(a,b){return h("utils").replaceCounter(a,b.counter)});return{parse:function(a,c){var c=c||{},g=b(a);if(c.contextNode){g._name=c.contextNode.name;var e={};d.each(g._attributes,function(a){e[a.name]=a});d.each(c.contextNode.attributes,function(a){a.name in e?e[a.name].value=a.value:(a=d.clone(a), g._attributes.push(a),e[a.name]=a)})}d.each(r,function(a){a(g,c)});g=l(j(g));d.each(u,function(a){a(g,c)});return g},AbbreviationNode:f,addPreprocessor:function(a){d.include(r,a)||r.push(a)},removeFilter:function(a){preprocessor=d.without(r,a)},addPostprocessor:function(a){d.include(u,a)||u.push(a)},removePostprocessor:function(a){u=d.without(u,a)},addOutputProcessor:function(a){d.include(p,a)||p.push(a)},removeOutputProcessor:function(a){p=d.without(p,a)},isAllowedChar:function(a){a=String(a);return m(a)|| ~">+^[](){}".indexOf(a)}}}); emmet.exec(function(h,d){function f(i,b){var c=h("resources"),a=h("elements"),e=h("abbreviationParser");d.each(d.clone(i.children),function(g){var j=c.getMatchedResource(g,b);if(d.isString(j))g.data("resource",a.create("snippet",j));else if(a.is(j,"reference")){j=e.parse(j.data,{syntax:b});if(g.repeatCount>1){var h=j.findAll(function(a){return a.hasImplicitRepeat});d.each(h,function(a){a.repeatCount=g.repeatCount;a.hasImplicitRepeat=!1})}var i=j.deepestChild();i&&d.each(g.children,function(a){i.addChild(a)}); d.each(j.children,function(a){d.each(g.attributeList(),function(b){a.attribute(b.name,b.value)})});g.replace(j.children)}else g.data("resource",j);f(g,b)})}h("abbreviationParser").addPreprocessor(function(d,b){var c=b.syntax||emmet.defaultSyntax();f(d,c)})}); emmet.exec(function(h,d){function f(a){for(var b=h("range"),c=[],a=h("stringStream").create(a);!a.eol();){if(a.peek()=="\\")a.next();else if(a.start=a.pos,a.match(e,!0)){c.push(b.create(a.start,e));continue}a.next()}return c}function i(a,b){var c=h("utils"),e=f(a);e.reverse();d.each(e,function(e){a=c.replaceSubstring(a,b,e)});return a}function b(a){return f(a.content).length?!0:!!d.find(a.attributeList(),function(a){return!!f(a.value).length})}function c(a,c,e){var f=a.findAll(function(a){return b(a)}); b(a)&&f.unshift(a);f.length?d.each(f,function(a){a.content=i(a.content,c);d.each(a._attributes,function(a){a.value=i(a.value,c)})}):(a=a.deepestChild()||a,a.content=e?c:h("abbreviationUtils").insertChildContent(a.content,c))}var a=h("abbreviationParser"),e="$#";a.addPreprocessor(function(a,b){if(b.pastedContent){var c=h("utils"),e=d.map(c.splitByLines(b.pastedContent,!0),c.trim);a.findAll(function(a){if(a.hasImplicitRepeat)return a.data("paste",e),a.repeatCount=e.length})}});a.addPostprocessor(function(a, b){!a.findAll(function(a){var b=a.data("paste"),g="";d.isArray(b)?g=b[a.counter-1]:d.isFunction(b)?g=b(a.counter-1,a.content):b&&(g=b);g&&c(a,g,!!a.data("pasteOverwrites"));a.data("paste",null);return!!b}).length&&b.pastedContent&&c(a,b.pastedContent)})});emmet.exec(function(h,d){function f(i){var b=h("tagName");d.each(i.children,function(c){if(c.hasImplicitName()||c.data("forceNameResolving"))c._name=b.resolve(c.parent.name());f(c)});return i}h("abbreviationParser").addPostprocessor(f)}); emmet.define("cssParser",function(h,d){function f(a){return typeof a!=="undefined"}function i(){return{"char":g.chnum,line:g.linenum}}function b(a,b,c){var e=g,c=c||{};j.push({charstart:f(c["char"])?c["char"]:e.chnum,charend:f(c.charend)?c.charend:e.chnum,linestart:f(c.line)?c.line:e.linenum,lineend:f(c.lineend)?c.lineend:e.linenum,value:a,type:b||a})}function c(a,b){var c=g,e=b||{},d=f(e["char"])?e["char"]:c.chnum,e=f(e.line)?e.line:c.linenum;return{name:"ParseError",message:a+" at line "+(e+1)+ " char "+(d+1),walker:c,tokens:j}}function a(a){var c=g,e=c.ch,d=i(),j=a?a+e:e,e=c.nextChar();for(a&&(d["char"]-=a.length);m(e)||n(e);)j+=e,e=c.nextChar();b(j,"identifier",d)}function e(){var e=g.ch;if(e===" "||e==="\t"){for(var d=g.ch,j="",f=i();d===" "||d==="\t";)j+=d,d=g.nextChar();b(j,"white",f)}else{if(e==="/"){var d=g,e=f=d.ch,h,p=i();h=d.nextChar();if(h!=="*")p.charend=p["char"],p.lineend=p.line,j=b(e,e,p);else{for(;!(f==="*"&&h==="/");)e+=h,f=h,h=d.nextChar();e+=h;d.nextChar();b(e,"comment", p)}return j}if(e==='"'||e==="'"){d=g;e=f=j=d.ch;p=i();for(j=d.nextChar();j!==f;){if(j==="\n")if(h=d.nextChar(),h==="\\")e+=j+h;else throw c("Unterminated string",p);else e+=j==="\\"?j+d.nextChar():j;j=d.nextChar()}e+=j;d.nextChar();b(e,"string",p)}else if(e==="("){d=g;j=d.ch;f=0;e=j;h=i();for(j=d.nextChar();j!==")"&&!f;){if(j==="(")f++;else if(j===")")f--;else if(j===!1)throw c("Unterminated brace",h);e+=j;j=d.nextChar()}e+=j;d.nextChar();b(e,"brace",h)}else{if(e==="-"||e==="."||n(e)){j=g;f=j.ch; e=i();h=f;var p=h===".",v,f=j.nextChar();v=!n(f);if(p&&v)e.charend=e["char"],e.lineend=e.line,d=b(h,".",e);else if(h==="-"&&v)d=a("-");else{for(;f!==!1&&(n(f)||!p&&f===".");)f==="."&&(p=!0),h+=f,f=j.nextChar();b(h,"number",e)}return d}if(m(e))return a();if(l(e))return d=g,e=d.ch,j=i(),h=d.nextChar(),h==="="&&l(e,!0)?(e+=h,b(e,"match",j),d.nextChar(),f=void 0):(j.charend=j["char"]+1,j.lineend=j.line,b(e,e,j)),f;if(e==="\n")b("line"),g.nextChar();else throw c("Unrecognized character");}}}var g,j=[], l,m,n;g={lines:null,total_lines:0,linenum:-1,line:"",ch:"",chnum:-1,init:function(a){var b=g;b.lines=a.replace(/\r\n/g,"\n").replace(/\r/g,"\n").split("\n");b.total_lines=b.lines.length;b.chnum=-1;b.linenum=-1;b.ch="";b.line="";b.nextLine();b.nextChar()},nextLine:function(){this.linenum+=1;this.line=this.total_lines<=this.linenum?!1:this.lines[this.linenum];if(this.chnum!==-1)this.chnum=0;return this.line},nextChar:function(){for(this.chnum+=1;this.line.charAt(this.chnum)==="";){if(this.nextLine()=== !1)return this.ch=!1;this.chnum=-1;return this.ch="\n"}return this.ch=this.line.charAt(this.chnum)},peek:function(){return this.line.charAt(this.chnum+1)}};m=function(a){return a=="&"||a==="_"||a==="-"||a>="a"&&a<="z"||a>="A"&&a<="Z"};n=function(a){return a!==!1&&a>="0"&&a<="9"};l=function(){for(var a="{}[]()+*=.,;:>~|\\%$#@^!".split(""),b="*^|$~".split(""),c={},e={},g=0;g")):null:a.match("--")?g(b("comment","--\>")):a.match("DOCTYPE",!0,!0)?(a.eatWhile(/[\w\._\-]/),g(c(1))):null;else if(a.eat("?"))return a.eatWhile(/[\w\._\-]/),e.tokenize=b("meta","?>"),"meta";else{w=a.eat("/")?"closeTag":"openTag";a.eatSpace();for(v="";d=a.eat(/[^\s\u00a0=<>\"\'\/?]/);)v+=d;e.tokenize=f;return"tag"}else return d== "&"?(a.eat("#")?a.eat("x")?a.eatWhile(/[a-fA-F\d]/)&&a.eat(";"):a.eatWhile(/[\d]/)&&a.eat(";"):a.eatWhile(/[\w\.\-:]/)&&a.eat(";"))?"atom":"error":(a.eatWhile(/[^&<]/),"text")}function f(a,b){var c=a.next();return c==">"||c=="/"&&a.eat(">")?(b.tokenize=d,w=c==">"?"endTag":"selfcloseTag","tag"):c=="="?(w="equals",null):/[\'\"]/.test(c)?(b.tokenize=i(c),b.tokenize(a,b)):(a.eatWhile(/[^\s\u00a0=<>\"\'\/?]/),"word")}function i(a){return function(b,c){for(;!b.eol();)if(b.next()==a){c.tokenize=f;break}return"string"}} function b(a,b){return function(c,e){for(;!c.eol();){if(c.match(b)){e.tokenize=d;break}c.next()}return a}}function c(a){return function(b,e){for(var g;(g=b.next())!=null;)if(g=="<")return e.tokenize=c(a+1),e.tokenize(b,e);else if(g==">")if(a==1){e.tokenize=d;break}else return e.tokenize=c(a-1),e.tokenize(b,e);return"meta"}}function a(){for(var a=arguments.length-1;a>=0;a--)k.cc.push(arguments[a])}function e(){a.apply(null,arguments);return!0}function g(){if(k.context)k.context=k.context.prev}function j(a){if(a== "openTag")return k.tagName=v,e(o,l(k.startOfLine));else if(a=="closeTag")return a=!1,k.context?k.context.tagName!=v&&(p.implicitlyClosed.hasOwnProperty(k.context.tagName.toLowerCase())&&g(),a=!k.context||k.context.tagName!=v):a=!0,a&&(t="error"),e(m(a));return e()}function l(a){return function(b){if(b=="selfcloseTag"||b=="endTag"&&p.autoSelfClosers.hasOwnProperty(k.tagName.toLowerCase()))return n(k.tagName.toLowerCase()),e();if(b=="endTag"){n(k.tagName.toLowerCase());var b=k.tagName,c=p.doNotIndent.hasOwnProperty(b)|| k.context&&k.context.noIndent;k.context={prev:k.context,tagName:b,indent:k.indented,startOfLine:a,noIndent:c}}return e()}}function m(a){return function(b){a&&(t="error");if(b=="endTag")return g(),e();t="error";return e(arguments.callee)}}function n(a){for(var b;;){if(!k.context)break;b=k.context.tagName.toLowerCase();if(!p.contextGrabbers.hasOwnProperty(b)||!p.contextGrabbers[b].hasOwnProperty(a))break;g()}}function o(b){if(b=="word")return t="attribute",e(q,o);if(b=="endTag"||b=="selfcloseTag")return a(); t="error";return e(o)}function q(b){if(b=="equals")return e(s,o);p.allowMissing||(t="error");return b=="endTag"||b=="selfcloseTag"?a():e()}function s(b){if(b=="string")return e(r);if(b=="word"&&p.allowUnquoted)return t="string",e();t="error";return b=="endTag"||b=="selfCloseTag"?a():e()}function r(b){return b=="string"?e(r):a()}function u(a,b){if(a.sol())b.startOfLine=!0,b.indented=0;if(a.eatSpace())return null;t=w=v=null;var c=b.tokenize(a,b);b.type=w;if((c||w)&&c!="comment")for(k=b;;)if((b.cc.pop()|| j)(w||c))break;b.startOfLine=!1;return t||c}var p={autoSelfClosers:{},implicitlyClosed:{},contextGrabbers:{},doNotIndent:{},allowUnquoted:!0,allowMissing:!0},v=null,w=null,k=null,t;return{parse:function(a,b){for(var b=b||0,c={tokenize:d,cc:[],indented:0,startOfLine:!0,tagName:null,context:null},e=h("stringStream").create(a),g=[];!e.eol();)g.push({type:u(e,c),start:e.start+b,end:e.pos+b}),e.start=e.pos;return g}}}); emmet.define("string-score",function(){return{score:function(h,d,f){if(h==d)return 1;if(d=="")return 0;for(var i=0,b=d.length,c=h.length,a,e=1,g=0,j,l,m,n;g-1?n:Math.max(j,l);if(l===-1)if(f){e+=1-f;continue}else return 0;else j=0.1;h[l]===m&&(j+=0.1);l===0?(j+=0.6,g===0&&(a=1)):h.charAt(l-1)===" "&&(j+=0.8);h=h.substring(l+1,c);i+=j}h=i/b;b=(h*(b/c)+h)/2;b/=e;a&&b+0.15<1&&(b+=0.15);return b}}}); emmet.define("utils",function(h,d){function f(b){this._data=[];this.length=0;b&&this.append(b)}var i="${0}";f.prototype={append:function(b){this._data.push(b);this.length+=b.length},toString:function(){return this._data.join("")},valueOf:function(){return this.toString()}};return{reTag:/<\/?[\w:\-]+(?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*\s*(\/?)>$/,endsWithTag:function(b){return this.reTag.test(b)},isNumeric:function(b){typeof b=="string"&&(b=b.charCodeAt(0));return b&&b>47&& b<58},trim:function(b){return(b||"").replace(/^\s+|\s+$/g,"")},getNewline:function(){var b=h("resources");if(!b)return"\n";b=b.getVariable("newline");return d.isString(b)?b:"\n"},setNewline:function(b){var c=h("resources");c.setVariable("newline",b);c.setVariable("nl",b)},splitByLines:function(b,c){var a=this.getNewline(),a=(b||"").replace(/\r\n/g,"\n").replace(/\n\r/g,"\n").replace(/\r/g,"\n").replace(/\n/g,a).split(a);c&&(a=d.filter(a,function(a){return a.length&&!!this.trim(a)},this));return a}, normalizeNewline:function(b){return this.splitByLines(b).join(this.getNewline())},repeatString:function(b,c){for(var a=[],e=0;ee++;)a+="0";return a+b},unindentString:function(b, c){for(var a=this.splitByLines(b),e=0;eb.length?b:b.substring(0,a)+c+b.substring(e)},narrowToNonSpace:function(b,c,a){c=h("range").create(c,a);for(a=/[\s\n\r\u00a0]/;c.start c.start;)if(c.end--,!a.test(b.charAt(c.end))){c.end++;break}return c},findNewlineBounds:function(b,c){for(var a=b.length,e=0,g=a-1,d=c-1;d>0;d--){var f=b.charAt(d);if(f=="\n"||f=="\r"){e=d+1;break}}for(d=c;d":return b>c;case "gte":case ">=":return b>=c}}function i(b,c){d.isObject(b)&&"start"in b?(this.start=Math.min(b.start,b.end),this.end=Math.max(b.start,b.end)):d.isArray(b)?(this.start=b[0],this.end=b[1]):(c=d.isString(c)?c.length:+c,this.start=b,this.end=b+c)}i.prototype={length:function(){return Math.abs(this.end-this.start)}, equal:function(b){return this.cmp(b,"eq","eq")},shift:function(b){this.start+=b;this.end+=b;return this},overlap:function(b){return b.start<=this.end&&b.end>=this.start},intersection:function(b){if(this.overlap(b)){var c=Math.max(b.start,this.start);return new i(c,Math.min(b.end,this.end)-c)}return null},union:function(b){if(this.overlap(b)){var c=Math.min(b.start,this.start);return new i(c,Math.max(b.end,this.end)-c)}return null},inside:function(b){return this.cmp(b,"lte","gt")},contains:function(b){return this.cmp(b, "lt","gt")},include:function(){return this.cmp(loc,"lte","gte")},cmp:function(b,c,a){var e;b instanceof i?(e=b.start,b=b.end):e=b;return f(this.start,e,c||"<=")&&f(this.end,b,a||">")},substring:function(b){return this.length()>0?b.substring(this.start,this.end):""},clone:function(){return new i(this.start,this.length())},toArray:function(){return[this.start,this.end]},toString:function(){return"{"+this.start+", "+this.length()+"}"}};return{create:function(b,c){if(d.isUndefined(b)||b===null)return null; if(b instanceof i)return b;if(d.isObject(b)&&"start"in b&&"end"in b)c=b.end-b.start,b=b.start;return new i(b,c)},create2:function(b,c){d.isNumber(b)&&d.isNumber(c)&&(c-=b);return this.create(b,c)}}}); emmet.define("handlerList",function(h,d){function f(){this._list=[]}f.prototype={add:function(f,b){this._list.push(d.extend({order:0},b||{},{fn:f}))},remove:function(f){this._list=d.without(this._list,d.find(this._list,function(b){return b.fn===f}))},list:function(){return d.sortBy(this._list,"order").reverse()},listFn:function(){return d.pluck(this.list(),"fn")},exec:function(f,b){var b=b||[],c=null;d.find(this.list(),function(a){c=a.fn.apply(a,b);if(c!==f)return!0});return c}};return{create:function(){return new f}}}); emmet.define("tokenIterator",function(h,d){function f(d){this.tokens=d;this._position=0;this.reset()}f.prototype={next:function(){if(this.hasNext()){var d=this.tokens[++this._i];this._position=d.start;return d}return null},current:function(){return this.tokens[this._i]},position:function(){return this._position},hasNext:function(){return this._i=this.string.length},sol:function(){return this.pos==0},peek:function(){return this.string.charAt(this.pos)},next:function(){if(this.posf},eatSpace:function(){for(var d=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>d},skipToEnd:function(){this.pos=this.string.length},skipTo:function(d){d=this.string.indexOf(d,this.pos);if(d>-1)return this.pos=d,!0},skipToPair:function(d,f){for(var h=0,b,c=this.pos,a=this.string.length;c/,c={},a={},e=h("handlerList").create();return{setVocabulary:function(b,e){i={};e== "system"?c=b:a=b},getVocabulary:function(b){return b=="system"?c:a},getMatchedResource:function(a,b){return e.exec(null,d.toArray(arguments))||this.findSnippet(b,a.name())},getVariable:function(a){return(this.getSection("variables")||{})[a]},setVariable:function(a,b){var c=this.getVocabulary("user")||{};if(!("variables"in c))c.variables={};c.variables[a]=b;this.setVocabulary(c,"user")},hasSyntax:function(a){return a in this.getVocabulary("user")||a in this.getVocabulary("system")},addResolver:function(a, b){e.add(a,b)},removeResolver:function(a){e.remove(a)},getSection:function(b){if(!b)return null;b in i||(i[b]=h("utils").deepMerge({},c[b],a[b]));for(var e=i[b],f=d.rest(arguments),m;e&&(m=f.shift());)if(m in e)e=e[m];else return null;return e},findItem:function(a,b){for(var c=this.getSection(a);c;){if(b in c)return c[b];c=this.getSection(c["extends"])}},findSnippet:function(a,b,c){if(!a||!b)return null;var c=c||[],e=[b];~b.indexOf("-")&&e.push(b.replace(/\-/g,":"));var h=this.getSection(a),i=null; d.find(["snippets","abbreviations"],function(b){var c=this.getSection(a,b);if(c)return d.find(e,function(a){if(c[a])return i=f(a,c[a],b)})},this);c.push(a);return!i&&h["extends"]&&!d.include(c,h["extends"])?this.findSnippet(h["extends"],b,c):i},fuzzyFindSnippet:function(a,b,c){var c=c||0.3,a=this.getAllSnippets(a),e=h("string-score"),b=b.replace(/:$/,"").replace(/:/g,"-"),f=d.map(a,function(a,c){return{key:c,score:e.score(a.nk,b,0.1)}});if((f=d.last(d.sortBy(f,"score")))&&f.score>=c)return a[f.key].parsedValue}, getAllSnippets:function(a){var b="all-"+a;if(!i[b]){var c=[],e=[];do{var h=this.getSection(a);if(!h)break;d.each(["snippets","abbreviations"],function(a){var b={};d.each(h[a]||null,function(c,e){b[e]={nk:e.replace(/:$/,"").replace(/:/g,"-"),value:c,parsedValue:f(e,c,a),type:a}});c.push(b)});e.push(a);a=h["extends"]}while(a&&!d.include(e,a));i[b]=d.extend.apply(d,c.reverse())}return i[b]}}}); emmet.define("actions",function(h,d){function f(b){return h("utils").trim(b.charAt(0).toUpperCase()+b.substring(1).replace(/_[a-z]/g,function(b){return" "+b.charAt(1).toUpperCase()}))}var i={};return{add:function(b,c,a){b=b.toLowerCase();a=a||{};if(!a.label)a.label=f(b);i[b]={name:b,fn:c,options:a}},get:function(b){return i[b.toLowerCase()]},run:function(b,c){d.isArray(c)||(c=d.rest(arguments));var a=this.get(b);return a?a.fn.apply(emmet,c):(emmet.log('Action "%s" is not defined',b),!1)},getAll:function(){return i}, getList:function(){return d.values(this.getAll())},getMenu:function(b){var c=[],b=b||[];d.each(this.getList(),function(a){if(!a.options.hidden&&!d.include(b,a.name)){var e=f(a.name),g=c;if(a.options.label)for(var j=a.options.label.split("/"),e=j.pop(),h,i;h=j.shift();)i=d.find(g,function(a){return a.type=="submenu"&&a.name==h}),i||(i={name:h,type:"submenu",items:[]},g.push(i)),g=i.items;g.push({type:"action",name:a.name,label:e})}});return c},getActionNameForMenuTitle:function(b,c){var a=null;d.find(c|| this.getMenu(),function(c){if(c.type=="action"){if(c.label==b||c.name==b)return a=c.name}else return a=this.getActionNameForMenuTitle(b,c.items)},this);return a||null}}}); emmet.define("profile",function(h,d){function f(a){d.extend(this,e,a)}function i(a,b){switch(String(b||"").toLowerCase()){case "lower":return a.toLowerCase();case "upper":return a.toUpperCase()}return a}function b(b,c){return a[b.toLowerCase()]=new f(c)}function c(){b("xhtml");b("html",{self_closing_tag:!1});b("xml",{self_closing_tag:!0,tag_nl:!0});b("plain",{tag_nl:!1,indent:!1,place_cursor:!1});b("line",{tag_nl:!1,indent:!1,extraFilters:"s"})}var a={},e={tag_case:"asis",attr_case:"asis",attr_quotes:"double", tag_nl:"decide",tag_nl_leaf:!1,place_cursor:!0,indent:!0,inline_break:3,self_closing_tag:"xhtml",filters:"",extraFilters:""};f.prototype={tagName:function(a){return i(a,this.tag_case)},attributeName:function(a){return i(a,this.attr_case)},attributeQuote:function(){return this.attr_quotes=="single"?"'":'"'},selfClosing:function(){return this.self_closing_tag=="xhtml"?" /":this.self_closing_tag===!0?"/":""},cursor:function(){return this.place_cursor?h("utils").getCaretPlaceholder():""}};c();return{create:function(a, c){return arguments.length==2?b(a,c):new f(d.defaults(a||{},e))},get:function(b,c){if(!b&&c){var e=h("resources").findItem(c,"profile");e&&(b=e)}return!b?a.plain:b instanceof f?b:d.isString(b)&&b.toLowerCase()in a?a[b.toLowerCase()]:this.create(b)},remove:function(b){b=(b||"").toLowerCase();b in a&&delete a[b]},reset:function(){a={};c()},stringCase:i}}); emmet.define("editorUtils",function(h){return{isInsideTag:function(d,f){for(var h=/^<\/?\w[\w\:\-]*.*?>/,b=f;b>-1;){if(d.charAt(b)=="<")break;b--}return b!=-1&&(h=h.exec(d.substring(b)))&&f>b&&f"&&e.endsWithTag(d.substring(0,f+1)))){i=f+1;break}}return i!=-1&&!a&&!c&&!b?d.substring(i).replace(/^[\*\+\>\^]+/,""):""},getImageSize:function(d){var f=function(){return d.charCodeAt(h++)};if(d.substr(0,8)==="\u0089PNG\r\n\u001a\n"){var h=d.indexOf("IHDR")+4;return{width:f()<<24|f()<<16|f()<<8|f(),height:f()<<24|f()<<16|f()<<8|f()}}else if(d.substr(0,4)==="GIF8")return h=6,{width:f()|f()<<8,height:f()|f()<<8};else if(d.substr(0,2)==="\u00ff\u00d8")for(var h=2,b=d.length;h< b;){if(f()!=255)break;var c=f();if(c==218)break;var a=f()<<8|f();if(c>=192&&c<=207&&!(c&4)&&!(c&8))return h+=1,{height:f()<<8|f(),width:f()<<8|f()};else h+=a-2}},captureContext:function(d){if(String(d.getSyntax())in{html:1,xml:1,xsl:1}){var f=String(d.getContent()),i=h("htmlMatcher").find(f,d.getCaretPos());if(i&&i.type=="tag"){for(var d=/([\w\-:]+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g,i=i.open,f=i.range.substring(f).replace(/^<[\w\-\:]+/,""),i={name:i.name,attributes:[]}, b;b=d.exec(f);)i.attributes.push({name:b[1],value:b[2]});return i}}return null},findExpressionBounds:function(d,f){for(var i=String(d.getContent()),b=i.length,c=d.getCaretPos()-1,a=c+1;c>=0&&f(i.charAt(c),c,i);)c--;for(;ac)return h("range").create([++c,a])},compoundUpdate:function(d,f){if(f){var h=d.getSelectionRange();d.replaceContent(f.data,f.start,f.end,!0);d.createSelection(f.caret,f.caret+h.end-h.start);return!0}return!1},detectSyntax:function(d,f){var i=f||"html"; h("resources").hasSyntax(i)||(i="html");if(i=="html"&&(this.isStyle(d)||this.isInlineCSS(d)))i="css";return i},detectProfile:function(d){var f=d.getSyntax(),i=h("resources").findItem(f,"profile");if(i)return i;switch(f){case "xml":case "xsl":return"xml";case "css":if(this.isInlineCSS(d))return"line";break;case "html":return(i=h("resources").getVariable("profile"))||(i=this.isXHTML(d)?"xhtml":"html"),i}return"xhtml"},isXHTML:function(d){return d.getContent().search(/]+XHTML/i)!=-1},isStyle:function(d){var f= String(d.getContent()),d=d.getCaretPos();return(f=h("htmlMatcher").tag(f,d))&&f.open.name.toLowerCase()=="style"&&f.innerRange.cmp(d,"lte","gte")},isInlineCSS:function(d){var f=String(d.getContent()),d=d.getCaretPos();return(f=h("xmlEditTree").parseFromPosition(f,d,!0))?(f=f.itemFromPosition(d,!0))&&f.name().toLowerCase()=="style"&&f.valueRange(!0).cmp(d,"lte","gte"):!1}}}); emmet.define("abbreviationUtils",function(h,d){return{isSnippet:function(d){return h("elements").is(d.matchedResource(),"snippet")},isUnary:function(d){var i=d.matchedResource();return d.children.length||this.isSnippet(d)?!1:i&&i.is_empty||h("tagName").isEmptyElement(d.name())},isInline:function(d){return d.isTextNode()||!d.name()||h("tagName").isInlineLevel(d.name())},isBlock:function(d){return this.isSnippet(d)||!this.isInline(d)},isSnippet:function(d){return h("elements").is(d.matchedResource(), "snippet")},hasTagsInContent:function(d){return h("utils").matchesTag(d.content)},hasBlockChildren:function(h){return this.hasTagsInContent(h)&&this.isBlock(h)||d.any(h.children,function(d){return this.isBlock(d)},this)},insertChildContent:function(f,i,b){var b=d.extend({keepVariable:!0,appendIfNoChild:!0},b||{}),c=!1,a=h("utils"),f=a.replaceVariables(f,function(e,d,h){var l=e;d=="child"&&(l=a.padString(i,a.getLinePaddingFromPosition(f,h.start)),c=!0,b.keepVariable&&(l+=e));return l});!c&&b.appendIfNoChild&& (f+=i);return f}}}); emmet.define("base64",function(){return{encode:function(h){for(var d=[],f,i,b,c,a,e,g=0,j=h.length;g>2,f=(f&3)<<4|i>>4,i=(i&15)<<2|b>>6,b&=63,isNaN(a)?i=b=64:isNaN(e)&&(b=64),d.push("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(c)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(f)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(i)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(b)); return d.join("")},decode:function(h){var d,f,i,b,c,a=0,e=0,g=[],j=h.length;if(!h)return h;h+="";do d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(h.charAt(a++)),f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(h.charAt(a++)),b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(h.charAt(a++)),c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(h.charAt(a++)),i=d<<18|f<<12|b<<6|c,d=i>>16& 255,f=i>>8&255,i&=255,b==64?g[e++]=String.fromCharCode(d):c==64?g[e++]=String.fromCharCode(d,f):g[e++]=String.fromCharCode(d,f,i);while(a")){n=h+3;break}if(h=b.matches(n))if(h.type=="open"&&!h.selfClose)c.push(h.name);else if(h.type=="close"){if(!c.length)return h.name==a.name?h:null;if(d.last(c)==h.name)c.pop();else{for(var q=!1;c.length&&!q;)c.pop()==h.name&&(q=!0);if(!c.length&&!q)return h.name==a.name?h:null}}}}var c=/^<([\w\:\-]+)((?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/, a=/^<\/([\w\:\-]+)[^>]*>/;return{find:function(a,c){for(var j=h("range"),l=f(a),m=null,n=null,o=c;o>=0;o--)if(m=l.open(o)){if(m.selfClose&&m.range.cmp(c,"lt","gt"))break;if(n=b(m,l)){if(j.create2(m.range.start,n.range.end).contains(c))break}else if(m.range.contains(c))break;m=null}else if(i(a,o,"--\>"))for(var q=o-1;q>=0;q--)if(i(a,q,"--\>"))break;else{if(i(a,q,"<\!--")){o=q;break}}else if(i(a,o,"<\!--")){q=o+4;for(m=a.length;q")){q+=3;break}m={range:h("range").create(o,d.isNumber(q)? q-o:q[0]),type:"comment"};break}if(m)return q=o=null,n?(o=j.create2(m.range.start,n.range.end),q=j.create2(m.range.end,n.range.start)):o=q=j.create2(m.range.start,m.range.end),m.type=="comment"&&(j=o.substring(a),q.start+=j.length-j.replace(/^<\!--\s*/,"").length,q.end-=j.length-j.replace(/\s*--\>$/,"").length),{open:m,close:n,type:m.type=="comment"?"comment":"tag",innerRange:q,innerContent:function(){return this.innerRange.substring(a)},outerRange:o,outerContent:function(){return this.outerRange.substring(a)}, range:!q.length()||!q.cmp(c,"lte","gte")?o:q,content:function(){return this.range.substring(a)},source:a}},tag:function(a,b){var c=this.find(a,b);if(c&&c.type=="tag")return c}}}); emmet.define("tabStops",function(h,d){var f=100,i=0,b={replaceCarets:!1,escape:function(b){return"\\"+b},tabstop:function(b){return b.token},variable:function(b){return b.token}};h("abbreviationParser").addOutputProcessor(function(b,a){var e=0,d=h("tabStops"),f=h("utils"),l={tabstop:function(a){var b=parseInt(a.group);if(b==0)return"${0}";b>e&&(e=b);return a.placeholder?(b+=i,a=d.processText(a.placeholder,l),"${"+b+":"+a+"}"):"${"+(b+i)+"}"}},b=d.processText(b,l),b=f.replaceVariables(b,d.variablesResolver(a)); i+=e+1;return b});return{extract:function(c,a){var e=h("utils"),g={carets:""},f=[],a=d.extend({},b,a,{tabstop:function(a){var b=a.token,c="";if(a.placeholder=="cursor")f.push({start:a.start,end:a.start+b.length,group:"carets",value:""});else{if("placeholder"in a)g[a.group]=a.placeholder;a.group in g&&(c=g[a.group]);f.push({start:a.start,end:a.start+b.length,group:a.group,value:c})}return b}});a.replaceCarets&&(c=c.replace(RegExp(e.escapeForRegexp(e.getCaretPlaceholder()),"g"),"${0:cursor}"));var c= this.processText(c,a),i=e.stringBuilder(),m=0,e=d.map(f,function(a){i.append(c.substring(m,a.start));var b=i.length,e=g[a.group]||"";i.append(e);m=a.end;return{group:a.group,start:b,end:b+e.length}});i.append(c.substring(m));return{text:i.toString(),tabstops:d.sortBy(e,"start")}},processText:function(c,a){for(var a=d.extend({},b,a),e=h("utils").stringBuilder(),g=h("stringStream").create(c),f,i;f=g.next();)if(f=="\\"&&!g.eol())e.append(a.escape(g.next()));else{i=f;if(f=="$")if(g.start=g.pos-1,g.match(/^[0-9]+/))i= a.tabstop({start:e.length,group:g.current().substr(1),token:g.current()});else if(f=g.match(/^\{([a-z_\-][\w\-]*)\}/))i=a.variable({start:e.length,name:f[1],token:g.current()});else if(f=g.match(/^\{([0-9]+)(:.+?)?\}/,!1)){g.skipToPair("{","}");i={start:e.length,group:f[1],token:g.current()};if(f=i.token.substring(i.group.length+2,i.token.length-1))i.placeholder=f.substr(1);i=a.tabstop(i)}e.append(i)}return e.toString()},upgrade:function(b,a){var e=0,g={tabstop:function(b){var c=parseInt(b.group); c>e&&(e=c);return b.placeholder?"${"+(c+a)+":"+b.placeholder+"}":"${"+(c+a)+"}"}};d.each(["start","end","content"],function(a){b[a]=this.processText(b[a],g)},this);return e},variablesResolver:function(b){var a={},e=h("resources");return function(g,j){if(j=="child")return g;if(j=="cursor")return h("utils").getCaretPlaceholder();var i=b.attribute(j);if(!d.isUndefined(i))return i;if(i=e.getVariable(j))return i;a[j]||(a[j]=f++);return"${"+a[j]+":"+j+"}"}},resetPlaceholderCounter:function(){console.log("deprecated"); f=100},resetTabstopIndex:function(){i=0;f=100}}}); emmet.define("preferences",function(h,d){var f={},i={},b=null,c=null;return{define:function(a,b,c){var h=a;d.isString(a)&&(h={},h[a]={value:b,description:c});d.each(h,function(a,b){i[b]=d.isObject(a)&&"value"in a&&d.keys(a).length<3?a:{value:a}})},set:function(a,b){var c=a;d.isString(a)&&(c={},c[a]=b);d.each(c,function(a,b){if(!(b in i))throw'Property "'+b+'" is not defined. You should define it first with `define` method of current module';if(a!==i[b].value){switch(typeof i[b].value){case "boolean":var c= a;d.isString(c)?(c=c.toLowerCase(),a=c=="yes"||c=="true"||c=="1"):a=!!c;break;case "number":a=parseInt(a+"",10)||0;break;default:a+=""}f[b]=a}else b in f&&delete f[b]})},get:function(a){if(a in f)return f[a];if(a in i)return i[a].value},getArray:function(a){a=this.get(a);d.isUndefined(a)||(a=d.map(a.split(","),h("utils").trim),a.length||(a=null));return a},getDict:function(a){var b={};d.each(this.getArray(a),function(a){a=a.split(":");b[a[0]]=a[1]});return b},description:function(a){return a in i? i[a].description:void 0},remove:function(a){d.isArray(a)||(a=[a]);d.each(a,function(a){a in f&&delete f[a];a in i&&delete i[a]})},list:function(){return d.map(d.keys(i).sort(),function(a){return{name:a,value:this.get(a),type:typeof i[a].value,description:i[a].description}},this)},load:function(a){d.each(a,function(a,b){this.set(b,a)},this)},exportModified:function(){return d.clone(f)},reset:function(){f={}},_startTest:function(){b=i;c=f;i={};f={}},_stopTest:function(){i=b;f=c}}}); emmet.define("filters",function(h,d){function f(b){return!b?[]:d.isString(b)?b.split(/[\|,]/g):b}var i={};return{add:function(b,c){i[b]=c},apply:function(b,c,a){var e=h("utils"),a=h("profile").get(a);d.each(f(c),function(c){(c=e.trim(c.toLowerCase()))&&c in i&&(b=i[c](b,a))});return b},composeList:function(b,c,a){c=h("profile").get(c);b=f(c.filters||h("resources").findItem(b,"filters")||"html");c.extraFilters&&(b=b.concat(f(c.extraFilters)));a&&(b=b.concat(f(a)));if(!b||!b.length)b=f("html");return b}, extractFromAbbreviation:function(b){var c="",b=b.replace(/\|([\w\|\-]+)$/,function(a,b){c=b;return""});return[b,f(c)]}}}); emmet.define("elements",function(h,d){function f(a){return{data:a}}var i={},b=/([\w\-]+)\s*=\s*(['"])(.*?)\2/g,c={add:function(a,b){var c=this;i[a]=function(){var d=b.apply(c,arguments);if(d)d.type=a;return d}},get:function(a){return i[a]},create:function(a){var b=[].slice.call(arguments,1),c=this.get(a);return c?c.apply(this,b):null},is:function(a,b){return a&&a.type===b}};c.add("element",function(a,c,g){var h={name:a,is_empty:!!g};if(c)if(h.attributes=[],d.isArray(c))h.attributes=c;else if(d.isString(c))for(;a= b.exec(c);)h.attributes.push({name:a[1],value:a[3]});else d.each(c,function(a,b){h.attributes.push({name:b,value:a})});return h});c.add("snippet",f);c.add("reference",f);c.add("empty",function(){return{}});return c}); emmet.define("editTree",function(h,d,f){function i(a,b){this.options=d.extend({offset:0},b);this.source=a;this._children=[];this._positions={name:0};this.initialize.apply(this,arguments)}function b(a,b,c){this.parent=a;this._name=b.value;this._value=c?c.value:"";this._positions={name:b.start,value:c?c.start:-1};this.initialize.apply(this,arguments)}var c=h("range").create;i.extend=f.extend;i.prototype={initialize:function(){},_updateSource:function(a,b,g){var f=c(b,d.isUndefined(g)?0:g-b),i=a.length- f.length(),m=function(a){d.each(a,function(b,c){b>=f.end&&(a[c]+=i)})};m(this._positions);d.each(this.list(),function(a){m(a._positions)});this.source=h("utils").replaceSubstring(this.source,a,f)},add:function(a,c){var d=new b(a,c);this._children.push(d);return d},get:function(a){return d.isNumber(a)?this.list()[a]:d.isString(a)?d.find(this.list(),function(b){return b.name()===a}):a},getAll:function(a){d.isArray(a)||(a=[a]);var b=[],c=[];d.each(a,function(a){d.isString(a)?b.push(a):d.isNumber(a)&& c.push(a)});return d.filter(this.list(),function(a,h){return d.include(c,h)||d.include(b,a.name())})},value:function(a,b,c){var h=this.get(a);if(h)return h.value(b);if(!d.isUndefined(b))return this.add(a,b,c)},values:function(a){return d.map(this.getAll(a),function(a){return a.value()})},remove:function(a){if(a=this.get(a))this._updateSource("",a.fullRange()),this._children=d.without(this._children,a)},list:function(){return this._children},indexOf:function(a){return d.indexOf(this.list(),this.get(a))}, name:function(a){if(!d.isUndefined(a)&&this._name!==(a=String(a)))this._updateSource(a,this._positions.name,this._positions.name+this._name.length),this._name=a;return this._name},nameRange:function(a){return c(this._positions.name+(a?this.options.offset:0),this.name())},range:function(a){return c(a?this.options.offset:0,this.toString())},itemFromPosition:function(a,b){return d.find(this.list(),function(c){return c.range(b).inside(a)})},toString:function(){return this.source}};b.extend=f.extend;b.prototype= {initialize:function(){},_pos:function(a,b){return a+(b?this.parent.options.offset:0)},value:function(a){if(!d.isUndefined(a)&&this._value!==(a=String(a)))this.parent._updateSource(a,this.valueRange()),this._value=a;return this._value},name:function(a){if(!d.isUndefined(a)&&this._name!==(a=String(a)))this.parent._updateSource(a,this.nameRange()),this._name=a;return this._name},namePosition:function(a){return this._pos(this._positions.name,a)},valuePosition:function(a){return this._pos(this._positions.value, a)},range:function(a){return c(this.namePosition(a),this.toString())},fullRange:function(a){return this.range(a)},nameRange:function(a){return c(this.namePosition(a),this.name())},valueRange:function(a){return c(this.valuePosition(a),this.value())},toString:function(){return this.name()+this.value()},valueOf:function(){return this.toString()}};return{EditContainer:i,EditElement:b,createToken:function(a,b,c){a={start:a||0,value:b||"",type:c};a.end=a.start+a.value.length;return a}}}); emmet.define("cssEditTree",function(h,d){function f(a,b){return h("range").create(a,b)}function i(a,b){var b=b||e|g,c=["white","line"];if((b&g)==g)for(;a.length&&d.include(c,d.last(a).type);)a.pop();if((b&e)==e)for(;a.length&&d.include(c,a[0].type);)a.shift();return a}function b(a){var b=["white","line",":"],c=[],h,j;a.nextUntil(function(){return!d.include(b,this.itemNext().type)});for(j=a.current().end;h=a.next();){if(h.type=="}"||h.type==";")return i(c,e|(h.type=="}"?g:0)),c.length?(j=c[0].start, a=d.last(c).end):a=j,f(j,a-j);c.push(h)}if(c.length)return f(c[0].start,d.last(c).end-c[0].start)}function c(a){var b=h("stringStream").create(a),c=[],e=/[\s\u00a0,]/,g=function(){b.next();c.push(f(b.start,b.current()));b.start=b.pos};b.eatSpace();for(b.start=b.pos;a=b.next();)if(a=='"'||a=="'"){b.next();if(!b.skipTo(a))break;g()}else if(a=="("){b.backUp(1);if(!b.skipToPair("(",")"))break;b.backUp(1);g()}else if(e.test(a))c.push(f(b.start,b.current().length-1)),b.eatWhile(e),b.start=b.pos;g();return d.chain(c).filter(function(a){return!!a.length()}).uniq(!1, function(a){return a.toString()}).value()}var a={styleBefore:"\n\t",styleSeparator:": ",offset:0},e=1,g=2,j=h("editTree").EditContainer.extend({initialize:function(c){d.defaults(this.options,a);var e=h("editTree"),g=h("tokenIterator").create(h("cssParser").parse(c)),j,s=[],r;for(j=g.position();r=g.next();){if(r.type=="{")break;s.push(r)}i(s);s.length?(j=s[0].start,s=d.last(s).end):s=j;j=f(j,s-j);this._positions.name=j.start;this._name=j.substring(c);if(!g.current()||g.current().type!="{")throw"Invalid CSS rule"; for(this._positions.contentStart=g.position()+1;j=g.next();){if(s=j.type=="identifier")a:{s=g.tokens;r=g._i+1;for(var u=s.length;r1)e.styleBefore="\n"+d.last(g);e.styleSeparator=b.substring(e.nameRange().end,e.valuePosition());e.styleBefore=d.last(e.styleBefore.split("*/"));e.styleSeparator=e.styleSeparator.replace(/\/\*.*?\*\//g,"");a=e.range().end})},add:function(a,b,c){var e=this.list(),g=this._positions.contentStart,f=d.pick(this.options,"styleBefore", "styleSeparator"),j=h("editTree");if(d.isUndefined(c))c=e.length;var i=e[c];if(i)g=i.fullRange().start;else if(i=e[c-1])i.end(";"),g=i.range().end;i&&(f=d.pick(i,"styleBefore","styleSeparator"));a=j.createToken(g+f.styleBefore.length,a);b=j.createToken(a.end+f.styleSeparator.length,b);j=new l(this,a,b,j.createToken(b.end,";"));d.extend(j,f);this._updateSource(j.styleBefore+j.toString(),g);this._children.splice(c,0,j);return j}}),l=h("editTree").EditElement.extend({initialize:function(a,b,c,d){this.styleBefore= a.options.styleBefore;this.styleSeparator=a.options.styleSeparator;this._end=d.value;this._positions.end=d.start},valueParts:function(a){var b=c(this.value());if(a){var e=this.valuePosition(!0);d.each(b,function(a){a.shift(e)})}return b},end:function(a){if(!d.isUndefined(a)&&this._end!==a)this.parent._updateSource(a,this._positions.end,this._positions.end+this._end.length),this._end=a;return this._end},fullRange:function(a){a=this.range(a);a.start-=this.styleBefore.length;return a},toString:function(){return this.name()+ this.styleSeparator+this.value()+this.end()}});return{parse:function(a,b){return new j(a,b)},parseFromPosition:function(a,b,c){c=this.extractRule(a,b,c);return!c||!c.inside(b)?null:this.parse(c.substring(a),{offset:c.start})},extractRule:function(a,b,c){for(var d="",e=a.length,g=-1,f;b>=0;){f=a.charAt(b);if(f=="{"){g=b;break}else if(f=="}"&&!c){b++;break}b--}for(;b=0;){f=a.charAt(b);if("{}/\\<>\n\r".indexOf(f)!= -1)break;b--}c=a.substring(b+1,g).replace(/^[\s\n\r]+/m,"");return h("range").create(g-c.length,d.length+c.length)}return null},baseName:function(a){return a.replace(/^\s*\-\w+\-/,"")},findParts:c}}); emmet.define("xmlEditTree",function(h,d){var f={styleBefore:" ",styleSeparator:"=",styleQuote:'"',offset:0},i=/^<([\w\:\-]+)((?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/m,b=h("editTree").EditContainer.extend({initialize:function(a){d.defaults(this.options,f);this._positions.name=1;var b=null,g=h("xmlParser").parse(a),j=h("range");d.each(g,function(d){d.value=j.create(d).substring(a);switch(d.type){case "tag":if(/^<[^\/]+/.test(d.value))this._name=d.value.substring(1); break;case "attribute":b&&this._children.push(new c(this,b));b=d;break;case "string":this._children.push(new c(this,b,d)),b=null}},this);b&&this._children.push(new c(this,b));this._saveStyle()},_saveStyle:function(){var a=this.nameRange().end,b=this.source;d.each(this.list(),function(c){c.styleBefore=b.substring(a,c.namePosition());if(c.valuePosition()!==-1)c.styleSeparator=b.substring(c.namePosition()+c.name().length,c.valuePosition()-c.styleQuote.length);a=c.range().end})},add:function(a,b,g){var f= this.list(),i=this.nameRange().end,m=h("editTree"),n=d.pick(this.options,"styleBefore","styleSeparator","styleQuote");if(d.isUndefined(g))g=f.length;var o=f[g];if(o)i=o.fullRange().start;else if(o=f[g-1])i=o.range().end;o&&(n=d.pick(o,"styleBefore","styleSeparator","styleQuote"));b=n.styleQuote+b+n.styleQuote;a=new c(this,m.createToken(i+n.styleBefore.length,a),m.createToken(i+n.styleBefore.length+a.length+n.styleSeparator.length,b));d.extend(a,n);this._updateSource(a.styleBefore+a.toString(),i); this._children.splice(g,0,a);return a}}),c=h("editTree").EditElement.extend({initialize:function(a,b,c){this.styleBefore=a.options.styleBefore;this.styleSeparator=a.options.styleSeparator;b="";a=a.options.styleQuote;if(c)b=c.value,a=b.charAt(0),a=='"'||a=="'"?b=b.substring(1):a="",a&&b.charAt(b.length-1)==a&&(b=b.substring(0,b.length-1));this.styleQuote=a;this._value=b;this._positions.value=c?c.start+a.length:-1},fullRange:function(a){a=this.range(a);a.start-=this.styleBefore.length;return a},toString:function(){return this.name()+ this.styleSeparator+this.styleQuote+this.value()+this.styleQuote}});return{parse:function(a,c){return new b(a,c)},parseFromPosition:function(a,b,c){c=this.extractTag(a,b,c);return!c||!c.inside(b)?null:this.parse(c.substring(a),{offset:c.start})},extractTag:function(a,b,c){var d=a.length,f,m=h("range"),n=Math.min(2E3,d),o=null,q=function(b){var c;if(a.charAt(b)=="<"&&(c=a.substr(b,n).match(i)))return m.create(b,c[0])};for(f=b;f>=0;f--)if(o=q(f))break;if(o&&(o.inside(b)||c))return o;if(!o&&c)return null; for(f=b;f=a++;)if(b.substr(a,g.length)==g){i=a+g.length;break}}return f!=-1&&i!=-1?h("range").create(f,i-f):null}function b(b,a,d,g){function f(b){return b.replace(RegExp("^"+q.escapeForRegexp(a)+"\\s*"), function(a){n-=a.length;return""}).replace(RegExp("\\s*"+q.escapeForRegexp(d)+"$"),"")}var l=h("editorUtils"),m=l.outputInfo(b).content,n=b.getCaretPos(),o=null,q=h("utils");(o=i(m,n,a,d))&&o.overlap(g)?(g=o,o=f(g.substring(m))):(o=a+" "+g.substring(m).replace(RegExp(q.escapeForRegexp(a)+"\\s*|\\s*"+q.escapeForRegexp(d),"g"),"")+" "+d,n+=a.length+1);return o!==null?(o=q.escapeText(o),b.setCaretPos(g.start),b.replaceContent(l.unindent(b,o),g.start,g.end),b.setCaretPos(n),!0):!1}h("actions").add("toggle_comment", function(c){var a=h("editorUtils").outputInfo(c);if(a.syntax=="css"){var d=c.getCaretPos(),g=h("htmlMatcher").tag(a.content,d);if(g&&g.open.range.inside(d))a.syntax="html"}if(a.syntax=="css"){g=h("range").create(c.getSelectionRange());a=h("editorUtils").outputInfo(c);if(!g.length()&&(d=h("cssEditTree").parseFromPosition(a.content,c.getCaretPos())))g=(g=f(d,c.getCaretPos()))?g.range(!0):h("range").create(d.nameRange(!0).start,d.source);g.length()||(g=h("range").create(c.getCurrentLineRange()),h("utils").narrowToNonSpace(a.content, g));c=b(c,"/*","*/",g)}else{a=h("range").create(c.getSelectionRange());d=h("editorUtils").outputInfo(c);if(!a.length()&&(d=h("htmlMatcher").tag(d.content,c.getCaretPos())))a=d.outerRange;c=b(c,"<\!--","--\>",a)}return c})}); emmet.exec(function(h){function d(d,h,b){function c(b){for(var c=b;c>=0;){var d=a.charAt(c);if(d=="\n"||d=="\r")break;c--}return a.substring(c,b)}for(var h=h||1,b=d.getCaretPos()+(b||0),a=String(d.getContent()),d=a.length,e=-1,g=/^\s+$/;b<=d&&b>=0;){b+=h;var j=a.charAt(b),l=a.charAt(b+1),m=a.charAt(b-1);switch(j){case '"':case "'":l==j&&m=="="&&(e=b+1);break;case ">":l=="<"&&(e=b+1);break;case "\n":case "\r":g.test(c(b-1))&&(e=b)}if(e!=-1)break}return e}h=h("actions");h.add("prev_edit_point",function(f){var h= f.getCaretPos(),b=d(f,-1);b==h&&(b=d(f,-1,-2));return b!=-1?(f.setCaretPos(b),!0):!1},{label:"Previous Edit Point"});h.add("next_edit_point",function(f){var h=d(f,1);return h!=-1?(f.setCaretPos(h),!0):!1})}); emmet.exec(function(h,d){function f(a,b,c,d){var e=h("range"),g=h("editorUtils").outputInfo(a).content,f=g.length,j,i=e.create(-1,0),l=e.create(a.getSelectionRange());j=l.start;for(var o=1E5;j>=0&&j0;){if(e=c(g,j,b)){if(i.equal(e))break;i=e.clone();if(j=d(e.substring(g),e.start,l.clone()))return a.createSelection(j.start,j.end),!0;else j=b?e.start:e.end-1}j+=b?-1:1}return!1}function i(a){var b=!0;return f(a,!1,function(a,c){if(b){b=!1;var d;a:{d=c;for(var e;d>=0;){if(e=g(a,d)){d=e;break a}d--}d= null}return d}else return g(a,c)},function(a,b,c){return e(a,b,c,!1)})}function b(a){return f(a,!0,g,function(a,b,c){return e(a,b,c,!0)})}function c(b,c,e){var e=e||0,g=h("range"),f=[],i=-1,l="",z="",x,o;d.each(c,function(c){switch(c.type){case "tag":o=b.substring(c.start,c.end);/^<[\w\:\-]/.test(o)&&f.push(g.create({start:c.start+1,end:c.end}));break;case "attribute":i=c.start;l=b.substring(c.start,c.end);break;case "string":f.push(g.create(i,c.end-i)),x=g.create(c),z=x.substring(b),j(z.charAt(0))&& x.start++,j(z.charAt(z.length-1))&&x.end--,f.push(x),l=="class"&&(f=f.concat(a(x.substring(b),x.start)))}});d.each(f,function(a){a.shift(e)});return d.chain(f).filter(function(a){return!!a.length()}).uniq(!1,function(a){return a.toString()}).value()}function a(a,b){var b=b||0,c=[],d=h("stringStream").create(a),e=h("range");d.eatSpace();d.start=d.pos;for(var g;g=d.next();)if(/[\s\u00a0]/.test(g))c.push(e.create(d.start+b,d.pos-d.start-1)),d.eatSpace(),d.start=d.pos;c.push(e.create(d.start+b,d.pos- d.start));return c}function e(a,b,e,g){a=c(a,h("xmlParser").parse(a),b);g&&a.reverse();return(b=d.find(a,function(a){return a.equal(e)}))?(g=d.indexOf(a,b),g1)?g[1]:d.find(a,function(a){return a.end>e.end})}function g(a,b){var c;if(a.charAt(b)=="<"&&(c=a.substring(b,a.length).match(q)))return h("range").create(b,c[0])}function j(a){return a=='"'||a=="'"}function l(a){var b= a.valueRange(!0),c=[a.range(!0),b],e=h("stringStream"),g=h("cssEditTree"),f=h("range"),j=a.value();d.each(a.valueParts(),function(a){var h=a.clone();c.push(h.shift(b.start));var i=e.create(a.substring(j));if(i.match(/^[\w\-]+\(/,!0)){i.start=i.pos;i.skipToPair("(",")");var l=i.current();c.push(f.create(h.start+i.start,l));d.each(g.findParts(l),function(a){c.push(f.create(h.start+i.start+a.start,a.substring(l)))})}});return d.chain(c).filter(function(a){return!!a.length()}).uniq(!1,function(a){return a.toString()}).value()} function m(a,b,c){var e=null,g=null,f=a.list(),h,j;c?(f.reverse(),h=function(a){return a.range(!0).start<=b.start},j=function(a){return a.start=b.end},j=function(a){return a.end>b.start});for(;e=d.find(f,h);){a=l(e);c&&a.reverse();if(g=d.find(a,function(a){return a.equal(b)})){if(g=d.indexOf(a,g),g!=a.length-1){g=a[g+1];break}}else{g=d.filter(a,function(a){return a.inside(b.end)});if(g.length>1){g=g[1];break}if(g=d.find(a,j))break}g=null;b.start=b.end= c?e.range(!0).start-1:e.range(!0).end+1}return g}function n(a,b,c){a=h("cssEditTree").parse(a,{offset:b});b=a.nameRange(!0);return c.endb.start)?b:a}var q=/^<([\w\:\-]+)((?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,s=h("actions");s.add("select_next_item",function(a){return a.getSyntax()=="css"?f(a,!1,h("cssEditTree").extractRule,n):i(a)});s.add("select_previous_item", function(a){return a.getSyntax()=="css"?f(a,!0,h("cssEditTree").extractRule,o):b(a)})}); emmet.exec(function(h){function d(c,a){var a=String((a||"out").toLowerCase()),d=h("editorUtils").outputInfo(c),g=h("range").create(c.getSelectionRange()),d=d.content;b&&!b.range.equal(g)&&(b=null);if(b&&g.length())if(a=="in")if(b.type=="tag"&&!b.close)return!1;else if(b.range.equal(b.outerRange))b.range=b.innerRange;else{var f=h("utils").narrowToNonSpace(d,b.innerRange);if((b=i.find(d,f.start+1))&&b.range.equal(g)&&b.outerRange.equal(g))b.range=b.innerRange}else if(!b.innerRange.equal(b.outerRange)&& b.range.equal(b.innerRange)&&g.equal(b.range))b.range=b.outerRange;else{if((b=i.find(d,g.start))&&b.range.equal(g)&&b.innerRange.equal(g))b.range=b.outerRange}else b=i.find(d,g.start);if(b&&!b.range.equal(g))return c.createSelection(b.range.start,b.range.end),!0;b=null;return!1}var f=h("actions"),i=h("htmlMatcher"),b=null;f.add("match_pair",d,{hidden:!0});f.add("match_pair_inward",function(b){return d(b,"in")},{label:"HTML/Match Pair Tag (inward)"});f.add("match_pair_outward",function(b){return d(b, "out")},{label:"HTML/Match Pair Tag (outward)"});f.add("matching_pair",function(b){var a=String(b.getContent()),d=b.getCaretPos();a.charAt(d)=="<"&&d++;return(a=i.tag(a,d))&&a.close?(a.open.range.inside(d)?b.setCaretPos(a.close.range.start):b.setCaretPos(a.open.range.start),!0):!1},{label:"HTML/Go To Matching Tag Pair"})}); emmet.exec(function(h){h("actions").add("remove_tag",function(d){var f=h("utils"),i=h("editorUtils").outputInfo(d),b=h("htmlMatcher").tag(i.content,d.getCaretPos());if(b){if(b.close){var c=f.narrowToNonSpace(i.content,b.innerRange),a=f.findNewlineBounds(i.content,c.start),a=f.getLinePadding(a.substring(i.content)),i=c.substring(i.content),i=f.unindentString(i,a);d.replaceContent(f.getCaretPlaceholder()+f.escapeText(i),b.outerRange.start,b.outerRange.end)}else d.replaceContent(f.getCaretPlaceholder(), b.range.start,b.range.end);return!0}return!1},{label:"HTML/Remove Tag"})}); emmet.exec(function(h){h("actions").add("split_join_tag",function(d,f){var i=h("htmlMatcher"),b=h("editorUtils").outputInfo(d,null,f),c=h("profile").get(b.profile);if(i=i.tag(b.content,d.getCaretPos())){if(i.close){var b=h("utils"),c=c.selfClosing()||" /",c=i.open.range.substring(i.source).replace(/\s*>$/,c+">"),a=d.getCaretPos();c.length+i.outerRange.start$/,">"),a=i.outerRange.start+e.length;e+=c+"";e=b.escapeText(e);d.replaceContent(e,i.outerRange.start,i.outerRange.end)}d.setCaretPos(a);i=!0}else i=!1;return i},{label:"HTML/Split\\Join Tag Declaration"})}); emmet.define("reflectCSSValue",function(h,d){function f(c){var a=h("cssEditTree"),d=h("editorUtils").outputInfo(c),c=c.getCaretPos();if(a=a.parseFromPosition(d.content,c))if(d=a.itemFromPosition(c,!0)){var g=a.source,f=a.options.offset,c=c-f-d.range().start;b.exec(!1,[d]);if(g!==a.source)return{data:a.source,start:f,end:f+g.length,caret:f+d.range().start+c}}}function i(b){var b=h("cssEditTree").baseName(b),a;if(b=="opacity"||b=="filter")return/^(?:\-\w+\-)?(?:opacity|filter)$/;else if(a=b.match(/^border-radius-(top|bottom)(left|right)/))return RegExp("^(?:\\-\\w+\\-)?(?:"+ b+"|border-"+a[1]+"-"+a[2]+"-radius)$");else if(a=b.match(/^border-(top|bottom)-(left|right)-radius/))return RegExp("^(?:\\-\\w+\\-)?(?:"+b+"|border-radius-"+a[1]+a[2]+")$");return RegExp("^(?:\\-\\w+\\-)?"+b+"$")}var b=h("handlerList").create();h("actions").add("reflect_css_value",function(b){return b.getSyntax()!="css"?!1:h("actionUtils").compoundUpdate(b,f(b))},{label:"CSS/Reflect Value"});b.add(function(b){var a=i(b.name());d.each(b.parent.list(),function(d){if(a.test(d.name())){var g;var f=b.name(), i=b.value(),m=d.name();g=d.value();var n=h("cssEditTree"),o=h("utils"),f=n.baseName(f),m=n.baseName(m);g=f=="opacity"&&m=="filter"?g.replace(/opacity=[^)]*/i,"opacity="+Math.floor(parseFloat(i)*100)):f=="filter"&&m=="opacity"?(f=i.match(/opacity=([^)]*)/i))?o.prettifyNumber(parseInt(f[1])/100):g:i;d.value(g)}})},{order:-1});return{addHandler:function(c,a){b.add(c,a)},removeHandler:function(c){b.remove(c,options)}}}); emmet.exec(function(h){h("actions").add("evaluate_math_expression",function(d){var f=h("actionUtils"),i=h("utils"),b=String(d.getContent()),c=h("range").create(d.getSelectionRange());c.length()||(c=f.findExpressionBounds(d,function(a){return i.isNumeric(a)||".+-*/\\".indexOf(a)!=-1}));if(c&&c.length()){f=c.substring(b);f=f.replace(/([\d\.\-]+)\\([\d\.\-]+)/g,"Math.round($1/$2)");try{var a=i.prettifyNumber((new Function("return "+f))());d.replaceContent(a,c.start,c.end);d.setCaretPos(c.start+a.length); return!0}catch(e){}}return!1},{label:"Numbers/Evaluate Math Expression"})}); emmet.exec(function(h,d){function f(b,a){var e=h("utils"),g=!1,f=!1,l=h("actionUtils").findExpressionBounds(b,function(a,b,c){return e.isNumeric(a)?!0:a=="."?!e.isNumeric(c.charAt(b+1))?!1:f?!1:f=!0:a=="-"?g?!1:g=!0:!1});if(l&&l.length()){var m=l.substring(String(b.getContent())),n=parseFloat(m);if(!d.isNaN(n)){n=e.prettifyNumber(n+a);if(/^(\-?)0+[1-9]/.test(m)){var o="";RegExp.$1&&(o="-",n=n.substring(1));n=n.split(".");n[0]=e.zeroPadString(n[0],i(m));n=o+n.join(".")}b.replaceContent(n,l.start,l.end); b.createSelection(l.start,l.start+n.length);return!0}}return!1}function i(b){b=b.replace(/^\-/,"");return~b.indexOf(".")?b.split(".")[0].length:b.length}var b=h("actions");d.each([1,-1,10,-10,0.1,-0.1],function(c){var a=c>0?"increment":"decrement";b.add(a+"_number_by_"+String(Math.abs(c)).replace(".","").substring(0,2),function(a){return f(a,c)},{label:"Numbers/"+a.charAt(0).toUpperCase()+a.substring(1)+" number by "+Math.abs(c)})})}); emmet.exec(function(h,d){var f=h("actions"),i=h("preferences");i.define("css.closeBraceIndentation","\n","Indentation before closing brace of CSS rule. Some users prefere indented closing brace of CSS rule for better readability. This preference\u2019s value will be automatically inserted before closing brace when user adds newline in newly created CSS rule (e.g. when \u201cInsert formatted linebreak\u201d action will be performed in CSS file). If you\u2019re such user, you may want to write put a value like \\n\\t in this preference."); f.add("insert_formatted_line_break_only",function(b){var c=h("utils"),a=h("resources"),e=h("editorUtils").outputInfo(b),g=b.getCaretPos(),f=c.getNewline();if(d.include(["html","xml","xsl"],e.syntax)){if(a=a.getVariable("indentation"),(e=h("htmlMatcher").tag(e.content,g))&&!e.innerRange.length())return b.replaceContent(f+a+c.getCaretPlaceholder()+f,g),!0}else if(e.syntax=="css"&&(e=e.content,g&&e.charAt(g-1)=="{")){var l=i.get("css.closeBraceIndentation"),a=a.getVariable("indentation"),m=e.charAt(g)== "}";if(!m)for(var n=g,o=e.length,q;na.length?b.replaceContent(c+l,g,g,!0):b.replaceContent(c,g)}return!0},{hidden:!0})}); emmet.exec(function(h){h("actions").add("merge_lines",function(d){var f=h("htmlMatcher"),i=h("utils"),b=h("editorUtils").outputInfo(d),c=h("range").create(d.getSelectionRange());if(!c.length()&&(f=f.find(b.content,d.getCaretPos())))c=f.outerRange;if(c.length()){b=c.substring(b.content);b=i.splitByLines(b);for(f=1;f=0;)if(d("src=",c,b)){if(c=c.substr(b).match(/^(src=(["'])?)([^'"<>\s]+)\1?/))i=c[3],b+=c[1].length;break}else if(d("url(",c,b)){if(c=c.substr(b).match(/^(url\((['"])?)([^'"\)\s]+)\1?/))i=c[3],b+=c[1].length;break}if(i)if(d("data:",i))if(c=String(f.prompt("Enter path to file (absolute or relative)"))){var a= h("file"),e=a.createPath(f.getFilePath(),c);if(!e)throw"Can't save file";a.save(e,h("base64").decode(i.replace(/^data\:.+?;.+?,/,"")));f.replaceContent("$0"+c,b,b+i.length);f=!0}else f=!1;else{c=h("file");a=h("actionUtils");e=f.getFilePath();if(e===null)throw"You should save your file before using this action";e=c.locateFile(e,i);if(e===null)throw"Can't find "+i+" file";var g=h("base64").encode(String(c.read(e)));if(!g)throw"Can't encode file content to base64";g="data:"+(a.mimeTypes[String(c.getExt(e))]|| "application/octet-stream")+";base64,"+g;f.replaceContent("$0"+g,b,b+i.length);f=!0}else f=!1;return f},{label:"Encode\\Decode data:URL image"})}); emmet.exec(function(h,d){function f(d,b){var c;if(b){if(/^data:/.test(b))c=h("base64").decode(b.replace(/^data\:.+?;.+?,/,""));else{c=h("file");var a=c.locateFile(d.getFilePath(),b);if(a===null)throw"Can't find "+b+" file";c=String(c.read(a))}return h("actionUtils").getImageSize(c)}}h("actions").add("update_image_size",function(i){var b;if(String(i.getSyntax())=="css")a:{b=i.getCaretPos();var c=h("editorUtils").outputInfo(i);if(c=h("cssEditTree").parseFromPosition(c.content,b,!0)){var a=c.itemFromPosition(b, !0),e;if(a&&(e=/url\((["']?)(.+?)\1\)/i.exec(a.value()||"")))if(e=f(i,e[2])){a=c.range(!0);c.value("width",e.width+"px");c.value("height",e.height+"px",c.indexOf("width")+1);b=d.extend(a,{data:c.toString(),caret:b});break a}}b=null}else a:{b=i.getCaretPos();c=h("editorUtils").outputInfo(i);if((c=h("xmlEditTree").parseFromPosition(c.content,b,!0))&&(c.name()||"").toLowerCase()=="img")if(e=f(i,c.value("src"))){a=c.range(!0);c.value("width",e.width);c.value("height",e.height,c.indexOf("width")+1);b= d.extend(a,{data:c.toString(),caret:b});break a}b=null}return h("actionUtils").compoundUpdate(i,b)})}); emmet.define("cssResolver",function(h,d){function f(a){var b=a&&a.charCodeAt(0);return a&&a=="."||b>47&&b<58}function i(a){a=h("utils").trim(a);if(~a.indexOf("/*")||/[\n\r]/.test(a))return!1;if(!/^[a-z0-9\-]+\s*\:/i.test(a))return!1;a=h("tabStops").processText(a,{replaceCarets:!0,tabstop:function(){return"value"}});return a.split(":").length==2}function b(a){a.charAt(0);if(a.charAt(0)=="#"){var b=a.replace(/^#+/,"")||"0",d=h("utils").repeatString,a=null;switch(b.length){case 1:a=d(b,6);break;case 2:a= d(b,3);break;case 3:a=b.charAt(0)+b.charAt(0)+b.charAt(1)+b.charAt(1)+b.charAt(2)+b.charAt(2);break;case 4:a=b+b.substr(0,2);break;case 5:a=b+b.charAt(0);break;default:a=b.substr(0,6)}p.get("css.color.short")&&(b=a.split(""),b[0]==b[1]&&b[2]==b[3]&&b[4]==b[5]&&(a=b[0]+b[2]+b[4]));switch(p.get("css.color.case")){case "upper":a=a.toUpperCase();break;case "lower":a=a.toLowerCase()}a="#"+a}else a=c(a);return a}function c(a){var b=p.getDict("css.keywordAliases");return a in b?b[a]:a}function a(a){return d.include(p.getArray("css.keywords"), c(a))}function e(a){var b=h("utils"),a=b.trim(a);if(a.indexOf(":")==-1)return{name:a,value:u};a=a.split(":");return{name:b.trim(a.shift()),value:b.trim(a.join(":")).replace(/^(\$\{0\}|\$0)(\s*;?)$/,"${1}$2")}}function g(a,b){var c=r[b];c||(c=d.find(r,function(a){return a.prefix==b}));return c&&c.supports(a)}function j(a,b){var c=[];d.each(r,function(b,d){g(a,d)&&c.push(d)});!c.length&&!b&&d.each(r,function(a,b){a.obsolete||c.push(b)});return c}function l(a,b){d.isString(b)&&(b={prefix:b});r[a]=d.extend({}, s,b)}function m(a,b){if(b){var c=p.get(b+"."+a);if(!d.isUndefined(c))return c}return p.get("css."+a)}function n(a,b,c){if(!d.isString(a))a=a.data;if(!i(a))return a;b&&(~a.indexOf(";")?a=a.split(";").join(" !important;"):a+=" !important");b=a.indexOf(":");a=a.substring(0,b).replace(/\s+$/,"")+m("valueSeparator",c)+h("utils").trim(a.substring(b+1));return a.replace(/\s*;\s*$/,m("propertyEnd",c))}function o(a){var b=p.getArray(a);d.each(p.getArray(a+"Addon"),function(a){a.charAt(0)=="-"?b=d.without(b, a.substr(1)):(a.charAt(0)=="+"&&(a=a.substr(1)),b.push(a))});return b}var q=null,s={prefix:"emmet",obsolete:!1,transformName:function(a){return"-"+this.prefix+"-"+a},properties:function(){return o("css."+this.prefix+"Properties")||[]},supports:function(a){return d.include(this.properties(),a)}},r={},u="${1};",p=h("preferences");p.define("css.valueSeparator",": ","Defines a symbol that should be placed between CSS property and value when expanding CSS abbreviations.");p.define("css.propertyEnd",";", "Defines a symbol that should be placed at the end of CSS property when expanding CSS abbreviations.");p.define("stylus.valueSeparator"," ","Defines a symbol that should be placed between CSS property and value when expanding CSS abbreviations in Stylus dialect.");p.define("stylus.propertyEnd","","Defines a symbol that should be placed at the end of CSS property when expanding CSS abbreviations in Stylus dialect.");p.define("sass.propertyEnd","","Defines a symbol that should be placed at the end of CSS property when expanding CSS abbreviations in SASS dialect."); p.define("css.autoInsertVendorPrefixes",!0,"Automatically generate vendor-prefixed copies of expanded CSS property. By default, Emmet will generate vendor-prefixed properties only when you put dash before abbreviation (e.g. -bxsh). With this option enabled, you don\u2019t need dashes before abbreviations: Emmet will produce vendor-prefixed properties for you.");var v=d.template("A comma-separated list of CSS properties that may have <%= vendor %> vendor prefix. This list is used to generate a list of prefixed properties when expanding -property abbreviations. Empty list means that all possible CSS values may have <%= vendor %> prefix."), w=d.template("A comma-separated list of additional CSS properties for css.<%= vendor %>Preperties preference. You should use this list if you want to add or remove a few CSS properties to original set. To add a new property, simply write its name, to remove it, precede property with hyphen.
    For example, to add foo property and remove border-radius one, the preference value will look like this: foo, -border-radius.");d.each({webkit:"animation, animation-delay, animation-direction, animation-duration, animation-fill-mode, animation-iteration-count, animation-name, animation-play-state, animation-timing-function, appearance, backface-visibility, background-clip, background-composite, background-origin, background-size, border-fit, border-horizontal-spacing, border-image, border-vertical-spacing, box-align, box-direction, box-flex, box-flex-group, box-lines, box-ordinal-group, box-orient, box-pack, box-reflect, box-shadow, color-correction, column-break-after, column-break-before, column-break-inside, column-count, column-gap, column-rule-color, column-rule-style, column-rule-width, column-span, column-width, dashboard-region, font-smoothing, highlight, hyphenate-character, hyphenate-limit-after, hyphenate-limit-before, hyphens, line-box-contain, line-break, line-clamp, locale, margin-before-collapse, margin-after-collapse, marquee-direction, marquee-increment, marquee-repetition, marquee-style, mask-attachment, mask-box-image, mask-box-image-outset, mask-box-image-repeat, mask-box-image-slice, mask-box-image-source, mask-box-image-width, mask-clip, mask-composite, mask-image, mask-origin, mask-position, mask-repeat, mask-size, nbsp-mode, perspective, perspective-origin, rtl-ordering, text-combine, text-decorations-in-effect, text-emphasis-color, text-emphasis-position, text-emphasis-style, text-fill-color, text-orientation, text-security, text-stroke-color, text-stroke-width, transform, transition, transform-origin, transform-style, transition-delay, transition-duration, transition-property, transition-timing-function, user-drag, user-modify, user-select, writing-mode, svg-shadow, box-sizing, border-radius", moz:"animation-delay, animation-direction, animation-duration, animation-fill-mode, animation-iteration-count, animation-name, animation-play-state, animation-timing-function, appearance, backface-visibility, background-inline-policy, binding, border-bottom-colors, border-image, border-left-colors, border-right-colors, border-top-colors, box-align, box-direction, box-flex, box-ordinal-group, box-orient, box-pack, box-shadow, box-sizing, column-count, column-gap, column-rule-color, column-rule-style, column-rule-width, column-width, float-edge, font-feature-settings, font-language-override, force-broken-image-icon, hyphens, image-region, orient, outline-radius-bottomleft, outline-radius-bottomright, outline-radius-topleft, outline-radius-topright, perspective, perspective-origin, stack-sizing, tab-size, text-blink, text-decoration-color, text-decoration-line, text-decoration-style, text-size-adjust, transform, transform-origin, transform-style, transition, transition-delay, transition-duration, transition-property, transition-timing-function, user-focus, user-input, user-modify, user-select, window-shadow, background-clip, border-radius", ms:"accelerator, backface-visibility, background-position-x, background-position-y, behavior, block-progression, box-align, box-direction, box-flex, box-line-progression, box-lines, box-ordinal-group, box-orient, box-pack, content-zoom-boundary, content-zoom-boundary-max, content-zoom-boundary-min, content-zoom-chaining, content-zoom-snap, content-zoom-snap-points, content-zoom-snap-type, content-zooming, filter, flow-from, flow-into, font-feature-settings, grid-column, grid-column-align, grid-column-span, grid-columns, grid-layer, grid-row, grid-row-align, grid-row-span, grid-rows, high-contrast-adjust, hyphenate-limit-chars, hyphenate-limit-lines, hyphenate-limit-zone, hyphens, ime-mode, interpolation-mode, layout-flow, layout-grid, layout-grid-char, layout-grid-line, layout-grid-mode, layout-grid-type, line-break, overflow-style, perspective, perspective-origin, perspective-origin-x, perspective-origin-y, scroll-boundary, scroll-boundary-bottom, scroll-boundary-left, scroll-boundary-right, scroll-boundary-top, scroll-chaining, scroll-rails, scroll-snap-points-x, scroll-snap-points-y, scroll-snap-type, scroll-snap-x, scroll-snap-y, scrollbar-arrow-color, scrollbar-base-color, scrollbar-darkshadow-color, scrollbar-face-color, scrollbar-highlight-color, scrollbar-shadow-color, scrollbar-track-color, text-align-last, text-autospace, text-justify, text-kashida-space, text-overflow, text-size-adjust, text-underline-position, touch-action, transform, transform-origin, transform-origin-x, transform-origin-y, transform-origin-z, transform-style, transition, transition-delay, transition-duration, transition-property, transition-timing-function, user-select, word-break, word-wrap, wrap-flow, wrap-margin, wrap-through, writing-mode", o:"dashboard-region, animation, animation-delay, animation-direction, animation-duration, animation-fill-mode, animation-iteration-count, animation-name, animation-play-state, animation-timing-function, border-image, link, link-source, object-fit, object-position, tab-size, table-baseline, transform, transform-origin, transition, transition-delay, transition-duration, transition-property, transition-timing-function, accesskey, input-format, input-required, marquee-dir, marquee-loop, marquee-speed, marquee-style"}, function(a,b){p.define("css."+b+"Properties",a,v({vendor:b}));p.define("css."+b+"PropertiesAddon","",w({vendor:b}))});p.define("css.unitlessProperties","z-index, line-height, opacity, font-weight, zoom","The list of properties whose values \u200b\u200bmust not contain units.");p.define("css.intUnit","px","Default unit for integer values");p.define("css.floatUnit","em","Default unit for float values");p.define("css.keywords","auto, inherit","A comma-separated list of valid keywords that can be used in CSS abbreviations."); p.define("css.keywordAliases","a:auto, i:inherit, s:solid, da:dashed, do:dotted","A comma-separated list of keyword aliases, used in CSS abbreviation. Each alias should be defined as alias:keyword_name.");p.define("css.unitAliases","e:em, p:%, x:ex, r:rem","A comma-separated list of unit aliases, used in CSS abbreviation. Each alias should be defined as alias:unit_value.");p.define("css.color.short",!0,"Should color values like #ffffff be shortened to #fff after abbreviation with color was expanded."); p.define("css.color.case","keep","Letter case of color values generated by abbreviations with color (like c#0). Possible values are upper, lower and keep.");p.define("css.fuzzySearch",!0,"Enable fuzzy search among CSS snippet names. When enabled, every unknown snippet will be scored against available snippet names (not values or CSS properties!). The match with best score will be used to resolve snippet value. For example, with this preference enabled, the following abbreviations are equal: ov:h == ov-h == o-h == oh"); p.define("css.fuzzySearchMinScore",0.3,"The minium score (from 0 to 1) that fuzzy-matched abbreviation should achive. Lower values may produce many false-positive matches, higher values may reduce possible matches.");l("w",{prefix:"webkit"});l("m",{prefix:"moz"});l("s",{prefix:"ms"});l("o",{prefix:"o"});var k=["css","less","sass","scss","stylus"];h("resources").addResolver(function(a,b){return d.include(k,b)&&a.isElement()?q.expandToSnippet(a.abbreviation,b):null});var t=h("expandAbbreviation");t.addHandler(function(a, b,c){if(!d.include(k,b))return!1;var e=a.getSelectionRange().end,g=t.findAbbreviation(a);return g&&(b=emmet.expandAbbreviation(g,b,c))?(g=e-g.length,c=e,a.getContent().charAt(e)==";"&&b.charAt(b.length-1)==";"&&c++,a.replaceContent(b,g,c),!0):!1});return q={addPrefix:l,supportsPrefix:g,prefixed:function(a,b){return g(a,b)?"-"+b+"-"+a:a},listPrefixes:function(){return d.map(r,function(a){return a.prefix})},getPrefix:function(a){return r[a]},removePrefix:function(a){a in r&&delete r[a]},extractPrefixes:function(a){if(a.charAt(0)!= "-")return{property:a,prefixes:null};for(var b=1,c=a.length,d,e=[];bbackground-color property with gradient first color as fallback for old browsers."); h("expandAbbreviation").addHandler(function(a,b,c){var e=h("editorUtils").outputInfo(a,b,c);if(!d.include(s,e.syntax))return!1;var c=a.getCaretPos(),g=e.content,e=n(g,c);if(e.property){var f=l(e.property);if(f){var b=e.rule.options.offset||0,i=b+e.rule.toString().length;if(/[\n\r]/.test(e.property.value())){var o=e.property.valueRange(!0).start+f.valueRange.end,g=h("utils").replaceSubstring(g,";",o),c=n(g,c);c.property&&(f=l(c.property),e=c)}e.property.end(";");j(e.property,f.gradient,f.valueRange); a.replaceContent(e.rule.toString(),b,i,!0);return!0}}return m(a,b)});h("reflectCSSValue").addHandler(function(a){var b=h("utils"),c=l(a);if(!c)return!1;var g=a.value(),f=function(a){return b.replaceSubstring(g,a,c.valueRange)};d.each(a.parent.getAll(e(a.name())),function(b){if(b!==a){var d=b.value().match(/^\s*(\-([a-z]+)\-)?linear\-gradient/);d?b.value(f(q.toString(c.gradient,d[2]||""))):b.value().match(/\s*\-webkit\-gradient/)&&b.value(f(q.oldWebkitLinearGradient(c.gradient)))}});return!0});return q= {parse:function(a){var b=null;h("utils").trim(a).replace(/^([\w\-]+)\((.+?)\)$/,function(a,c,e){c=c.toLowerCase().replace(/^\-[a-z]+\-/,"");if(c=="linear-gradient"||c=="lg"){for(var a=o[0],e=h("stringStream").create(h("utils").trim(e)),c=[],g;g=e.next();)e.peek()==","?(c.push(e.current()),e.next(),e.eatSpace(),e.start=e.pos):g=="("&&e.skipTo(")");c.push(e.current());c=d.compact(d.map(c,f));if(c.length){if(r.test(c[0])||u.test(c[0]))a=c.shift();b={type:"linear",direction:a,colorStops:d.map(c,i)}}else b= null;return""}return a});return b},oldWebkitLinearGradient:function(c){d.isString(c)&&(c=this.parse(c));if(!c)return null;var e=d.map(c.colorStops,d.clone);d.each(e,function(a){if("position"in a)if(~a.position.indexOf(".")||a.unit=="%")a.position=parseFloat(a.position)/(a.unit=="%"?100:1);else throw"Can't convert color stop '"+(a.position+(a.unit||""))+"'";});b(e);e=d.map(e,function(a,b){return!a.position&&!b?"from("+a.color+")":a.position==1&&b==e.length-1?"to("+a.color+")":"color-stop("+a.position.toFixed(2).replace(/\.?0+$/, "")+", "+a.color+")"});return"-webkit-gradient(linear, "+a(c.direction)+", "+e.join(", ")+")"},toString:function(a,b){if(a.type=="linear"){var c=(b?"-"+b+"-":"")+"linear-gradient",e=d.map(a.colorStops,function(a){return a.color+("position"in a?" "+a.position+(a.unit||""):"")});a.direction&&(!p.get("css.gradient.omitDefaultDirection")||!d.include(o,a.direction))&&e.unshift(a.direction);return c+"("+e.join(", ")+")"}}}}); emmet.exec(function(h,d){var f=h("handlerList").create(),i=h("resources");d.extend(i,{addGenerator:function(b,c,a){d.isString(b)&&(b=RegExp(b));f.add(function(a,d){var f;return(f=b.exec(a.name()))?c(f,a,d):null},a)}});i.addResolver(function(b,c){return f.exec(null,d.toArray(arguments))})}); emmet.define("tagName",function(h,d){var f={empty:"area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed,keygen,command".split(","),blockLevel:"address,applet,blockquote,button,center,dd,del,dir,div,dl,dt,fieldset,form,frameset,hr,iframe,ins,isindex,li,link,map,menu,noframes,noscript,object,ol,p,pre,script,table,tbody,td,tfoot,th,thead,tr,ul,h1,h2,h3,h4,h5,h6".split(","),inlineLevel:"a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var".split(",")}, i={p:"span",ul:"li",ol:"li",table:"tr",tr:"td",tbody:"tr",thead:"tr",tfoot:"tr",colgroup:"col",select:"option",optgroup:"option",audio:"source",video:"source",object:"param",map:"area"};return{resolve:function(b){b=(b||"").toLowerCase();return b in i?this.getMapping(b):this.isInlineLevel(b)?"span":"div"},getMapping:function(b){return i[b.toLowerCase()]},isInlineLevel:function(b){return this.isTypeOf(b,"inlineLevel")},isBlockLevel:function(b){return this.isTypeOf(b,"blockLevel")},isEmptyElement:function(b){return this.isTypeOf(b, "empty")},isTypeOf:function(b,c){return d.include(f[c],b)},addMapping:function(b,c){i[b]=c},removeMapping:function(b){b in i&&delete i[b]},addElementToCollection:function(b,c){f[c]||(f[c]=[]);var a=this.getCollection(c);d.include(a,b)||a.push(b)},removeElementFromCollection:function(b,c){c in f&&(f[c]=d.without(this.getCollection(c),b))},getCollection:function(b){return f[b]}}}); emmet.exec(function(h,d){function f(){return{element:e.get("bem.elementSeparator"),modifier:e.get("bem.modifierSeparator")}}function i(a){if(h("abbreviationUtils").isSnippet(a))return a;a.__bem={block:"",element:"",modifier:""};var e=b(a.attribute("class")).split(" "),g=/^[a-z]\-/i;a.__bem.block=d.find(e,function(a){return g.test(a)});if(!a.__bem.block)g=/^[a-z]/i,a.__bem.block=d.find(e,function(a){return g.test(a)})||"";(e=d.chain(e).map(function(b){var d;d=c(b,a,"element");d=c(d,a,"modifier");var e= "",g="",h="",b=f();~d.indexOf(b.element)?(e=d.split(b.element),h=e[1].split(b.modifier),e=e[0],g=h.shift(),h=h.join(b.modifier)):~d.indexOf(b.modifier)&&(h=d.split(b.modifier),e=h.shift(),h=h.join(b.modifier));if(e||g||h){if(!e)e=a.__bem.block;d=e;var i=[];g&&(d+=b.element+g);i.push(d);h&&i.push(d+b.modifier+h);a.__bem.block=e;a.__bem.element=g;a.__bem.modifier=h;b=i}else b=d;return b}).flatten().uniq().value().join(" "))&&a.attribute("class",e);return a}function b(a){var b=h("utils"),a=(" "+(a|| "")+" ").replace(/\s+/g," "),c=e.get("bem.shortElementPrefix");c&&(c=RegExp("\\s("+b.escapeForRegexp(c)+"+)","g"),a=a.replace(c,function(a,c){return" "+b.repeatString(f().element,c.length)}));return b.trim(a)}function c(a,b,c){var d=f(),e=RegExp("^("+d[c]+")+","g");if(e.test(a)){for(var g=0,e=a.replace(e,function(a){g=a.length/d[c].length;return""}),h=b;h.parent&&g--;)h=h.parent;if(!h||!h.__bem)h=b;if(h&&h.__bem)return a=h.__bem.block,c=="modifier"&&h.__bem.element&&(a+=d.element+h.__bem.element), a+d[c]+e}return a}function a(b,c){b.name&&i(b,c);var e=h("abbreviationUtils");d.each(b.children,function(b){a(b,c);!e.isSnippet(b)&&b.start&&(g=!0)});return b}var e=h("preferences");e.define("bem.elementSeparator","__","Class name\u2019s element separator.");e.define("bem.modifierSeparator","_","Class name\u2019s modifier separator.");e.define("bem.shortElementPrefix","-","Symbol for describing short \u201cblock-element\u201d notation. Class names prefixed with this symbol will be treated as element name for parent\u2018s block name. Each symbol instance traverses one level up in parsed tree for block name lookup. Empty value will disable short notation."); var g=!1;h("filters").add("bem",function(b,c){g=!1;b=a(b,c);g&&(b=h("filters").apply(b,"html",c));return b})}); emmet.exec(function(h,d){function f(c,a,e){var g=h("utils"),f=b.get("filter.commentTrigger");if(f=="*"||d.find(f.split(","),function(a){return!!c.attribute(g.trim(a))}))f={node:c,name:c.name(),padding:c.parent?c.parent.padding:"",attr:function(a,b,d){return(a=c.attribute(a))?(b||"")+a+(d||""):""}},a=g.normalizeNewline(a?a(f):""),e=g.normalizeNewline(e?e(f):""),c.start=c.start.replace(//,">"+e)}function i(b,a,e){var g=h("abbreviationUtils");d.each(b.children,function(b){g.isBlock(b)&& f(b,a,e);i(b,a,e)});return b}var b=h("preferences");b.define("filter.commentAfter",'\n<\!-- /<%= attr("id", "#") %><%= attr("class", ".") %> --\>',"A definition of comment that should be placed after matched element when comment filter is applied. This definition is an ERB-style template passed to _.template() function (see Underscore.js docs for details). In template context, the following properties and functions are availabe:\n
    • attr(name, before, after) \u2013 a function that outputsspecified attribute value concatenated with before and after strings. If attribute doesn't exists, the empty string will be returned.
    • node \u2013 current node (instance of AbbreviationNode)
    • name \u2013 name of current tag
    • padding \u2013 current string padding, can be used for formatting
    "); b.define("filter.commentBefore","","A definition of comment that should be placed before matched element when comment filter is applied. For more info, read description of filter.commentAfter property");b.define("filter.commentTrigger","id, class","A comma-separated list of attribute names that should exist in abbreviatoin where comment should be added. If you wish to add comment for every element, set this option to *");h("filters").add("c",function(c){var a= d.template(b.get("filter.commentBefore")),e=d.template(b.get("filter.commentAfter"));return i(c,a,e)})});emmet.exec(function(h,d){function f(b){return b.replace(/([<>&])/g,function(b,a){return i[a]})}var i={"<":"<",">":">","&":"&"};h("filters").add("e",function c(a){d.each(a.children,function(a){a.start=f(a.start);a.end=f(a.end);a.content=f(a.content);c(a)});return a})}); emmet.exec(function(h,d){function f(){return h("resources").getVariable("indentation")}function i(a){return a.parent&&!a.parent.parent&&!a.index()}function b(a,b){var d=h("abbreviationUtils");return b.tag_nl===!0||d.isBlock(a)?!0:!a.parent||!b.inline_break?!1:c(a.parent,b)}function c(a,b){var c=0,f=h("abbreviationUtils");return!!d.find(a.children,function(a){a.isTextNode()||!f.isInline(a)?c=0:f.isInline(a)&&c++;if(c>=b.inline_break)return!0})}function a(a,b){var f=h("abbreviationUtils");return!d.any(a.children, function(a){return f.isSnippet(a)?!1:!f.isInline(a)})?c(a,b):!0}h("filters").add("_format",function g(c,l,m){var m=m||0,n=h("abbreviationUtils");d.each(c.children,function(c){if(n.isSnippet(c)){if(c.start=c.end="",!i(c)&&l.tag_nl!==!1&&b(c,l)&&!h("abbreviationUtils").isInline(c.parent))c.start=h("utils").getNewline()+c.start}else{c.start=c.end="%s";var d=h("utils"),j=h("abbreviationUtils"),r=j.isUnary(c),d=d.getNewline();if(l.tag_nl!==!1){var u=l.tag_nl===!0&&(l.tag_nl_leaf||c.children.length);if(!c.isTextNode()){if(b(c, l)){if(!i(c)&&(!j.isSnippet(c.parent)||c.index()))c.start=d+c.start;if(j.hasBlockChildren(c)||c.children.length&&b(c.children[0],l)||u&&!r)c.end=d+c.end;if(j.hasTagsInContent(c)||u&&!c.children.length&&!r)c.start+=d+f()}else if(j.isInline(c)&&c.parent&&h("abbreviationUtils").hasBlockChildren(c.parent)&&!i(c))c.start=d+c.start;else if(j.isInline(c)&&a(c,l))c.end=d+c.end;c.padding=f()}}}g(c,l,m+1)});return c})}); emmet.exec(function(h,d){function f(f,b){var c="",a=[],e=b.attributeQuote(),g=b.cursor();d.each(f.attributeList(),function(d){var f=b.attributeName(d.name);switch(f.toLowerCase()){case "id":c+="#"+(d.value||g);break;case "class":c+="."+h("utils").trim(d.value||g).replace(/\s+/g,".");break;default:a.push(":"+f+" => "+e+(d.value||g)+e)}});a.length&&(c+="{"+a.join(", ")+"}");return c}h("filters").add("haml",function b(c,a,e){var e=e||0,g=h("abbreviationUtils");e||(c=h("filters").apply(c,"_format",a)); d.each(c.children,function(c){if(!g.isSnippet(c)&&c.parent){var d=h("abbreviationUtils"),m=h("utils"),n=f(c,a),o=a.cursor(),d=d.isUnary(c),q=a.self_closing_tag&&d?"/":"",s="",s="%"+a.tagName(c.name());s.toLowerCase()=="%div"&&n&&n.indexOf("{")==-1&&(s="");c.end="";c.start=m.replaceSubstring(c.start,s+n+q+" ",c.start.indexOf("%s"),"%s");!c.children.length&&!d&&(c.start+=o)}b(c,a,e+1)});return c})}); emmet.exec(function(h,d){function f(f,b){var c=b.attributeQuote(),a=b.cursor();return d.map(f.attributeList(),function(d){return" "+b.attributeName(d.name)+"="+c+(d.value||a)+c}).join("")}h("filters").add("html",function b(c,a,e){var e=e||0,g=h("abbreviationUtils");e||(c=h("filters").apply(c,"_format",a));d.each(c.children,function(c){if(!g.isSnippet(c)&&c.parent){var d=h("abbreviationUtils"),m=h("utils"),n=f(c,a),o=a.cursor(),d=d.isUnary(c),q="",s="";if(!c.isTextNode()){var r=a.tagName(c.name()); d?(q="<"+r+n+a.selfClosing()+">",c.end=""):(q="<"+r+n+">",s="")}c.start=m.replaceSubstring(c.start,q,c.start.indexOf("%s"),"%s");c.end=m.replaceSubstring(c.end,s,c.end.indexOf("%s"),"%s");!c.children.length&&!d&&c.content.indexOf(o)==-1&&(c.start+=o)}b(c,a,e+1)});return c})}); emmet.exec(function(h,d){var f=/^\s+/,i=/[\n\r]/g;h("filters").add("s",function c(a){var e=h("abbreviationUtils");d.each(a.children,function(a){if(!e.isSnippet(a))a.start=a.start.replace(f,""),a.end=a.end.replace(f,"");a.start=a.start.replace(i,"");a.end=a.end.replace(i,"");a.content=a.content.replace(i,"");c(a)});return a})}); emmet.exec(function(h,d){function f(h,b){d.each(h.children,function(c){if(c.content)c.content=c.content.replace(b,"");f(c,b)});return h}h("preferences").define("filter.trimRegexp","[\\s|\\u00a0]*[\\d|#|\\-|*|\\u2022]+\\.?\\s*","Regular expression used to remove list markers (numbers, dashes, bullets, etc.) in t (trim) filter. The trim filter is useful for wrapping with abbreviation lists, pased from other documents (for example, Word documents).");h("filters").add("t",function(d){var b= RegExp(h("preferences").get("filter.trimRegexp"));return f(d,b)})});emmet.exec(function(h,d){var f={"xsl:variable":1,"xsl:with-param":1};h("filters").add("xsl",function b(c){var a=h("abbreviationUtils");d.each(c.children,function(c){if(!a.isSnippet(c)&&(c.name()||"").toLowerCase()in f&&c.children.length)c.start=c.start.replace(/\s+select\s*=\s*(['"]).*?\1/,"");b(c)});return c})}); emmet.exec(function(h,d){function f(a,b){return Math.round(Math.random()*(b-a)+a)}function i(a,b){for(var c=a.length,e=Math.min(c,b),h=[];h.length3&&b<=6?f(0,1):b>6&&b<=12?f(0,2):f(1,4);d.each(i(d.range(c)),function(b){a[b]+= ","})}h("abbreviationParser").addPreprocessor(function(d){var h=/^(?:lorem|lipsum)(\d*)$/i,l;d.findAll(function(d){if(d._name&&(l=d._name.match(h))){var g=l[1]||30;d._name="";d.data("forceNameResolving",d.isRepeating()||d.attributeList().length);d.data("pasteOverwrites",!0);d.data("paste",function(d){var h=g,j=!d,d=[],l=0,h=parseInt(h,10);j&&(j=a.slice(0,h),j.length>5&&(j[4]+=","),l+=j.length,d.push(b(j,".")));for(;l","cc:ie6":"<\!--[if lte IE 6]>\n\t${child}|\n","cc:ie":"<\!--[if IE]>\n\t${child}|\n","cc:noie":"<\!--[if !IE]><\!--\>\n\t${child}|\n<\!--","html:4t":'\n\n\n\t\n\t${1:Document}\n\n\n\t${child}${2}\n\n', "html:4s":'\n\n\n\t\n\t${1:Document}\n\n\n\t${child}${2}\n\n',"html:xt":'\n\n\n\t\n\t\n\n\n\t${child}${2}\n\n', "html:xs":'\n\n\n\t\n\t${1:Document}\n\n\n\t${child}${2}\n\n',"html:xxs":'\n\n\n\t\n\t${1:Document}\n\n\n\t${child}${2}\n\n', "html:5":'\n\n\n\t\n\t${1:Document}\n\n\n\t${child}${2}\n\n'},abbreviations:{"!":"html:5",a:'',"a:link":'',"a:mail":'',abbr:'',acronym:'',base:'',bdo:'',"bdo:r":'',"bdo:l":'',link:'',"link:css":'', "link:print":'',"link:favicon":'',"link:touch":'',"link:rss":'',"link:atom":'',"meta:utf":'', "meta:win":'',"meta:compat":'',style:"',i.insertBefore(a,n),t=42===o.offsetWidth,i.removeChild(a),{matches:t,media:e}}}(i),e.mobile.media=function(e){return t.matchMedia(e).matches}}(e),function(e){var t={touch:"ontouchend"in i};e.mobile.support=e.mobile.support||{},e.extend(e.support,t),e.extend(e.mobile.support,t)}(e),function(e){e.extend(e.support,{orientation:"orientation"in t&&"onorientationchange"in t})}(e),function(e,n){function a(e){var t=e.charAt(0).toUpperCase()+e.substr(1),i=(e+" "+p.join(t+" ")+t).split(" ");for(var a in i)if(u[i[a]]!==n)return!0}function o(e,t,n){for(var a,o=i.createElement("div"),s=function(e){return e.charAt(0).toUpperCase()+e.substr(1)},r=function(e){return""===e?"":"-"+e.charAt(0).toLowerCase()+e.substr(1)+"-"},l=function(i){var n=r(i)+e+": "+t+";",l=s(i),d=l+(""===l?e:s(e));o.setAttribute("style",n),o.style[d]&&(a=!0)},d=n?n:p,c=0;d.length>c;c++)l(d[c]);return!!a}function s(){var a="transform-3d",o=e.mobile.media("(-"+p.join("-"+a+"),(-")+"-"+a+"),("+a+")");if(o)return!!o;var s=i.createElement("div"),r={MozTransform:"-moz-transform",transform:"transform"};h.append(s);for(var l in r)s.style[l]!==n&&(s.style[l]="translate3d( 100px, 1px, 1px )",o=t.getComputedStyle(s).getPropertyValue(r[l]));return!!o&&"none"!==o}function r(){var t,i,n=location.protocol+"//"+location.host+location.pathname+"ui-dir/",a=e("head base"),o=null,s="";return a.length?s=a.attr("href"):a=o=e("",{href:n}).appendTo("head"),t=e("").prependTo(h),i=t[0].href,a[0].href=s||location.pathname,o&&o.remove(),0===i.indexOf(n)}function l(){var e,n=i.createElement("x"),a=i.documentElement,o=t.getComputedStyle;return"pointerEvents"in n.style?(n.style.pointerEvents="auto",n.style.pointerEvents="x",a.appendChild(n),e=o&&"auto"===o(n,"").pointerEvents,a.removeChild(n),!!e):!1}function d(){var e=i.createElement("div");return e.getBoundingClientRect!==n}function c(){var e=t,i=navigator.userAgent,n=navigator.platform,a=i.match(/AppleWebKit\/([0-9]+)/),o=!!a&&a[1],s=i.match(/Fennec\/([0-9]+)/),r=!!s&&s[1],l=i.match(/Opera Mobi\/([0-9]+)/),d=!!l&&l[1];return(n.indexOf("iPhone")>-1||n.indexOf("iPad")>-1||n.indexOf("iPod")>-1)&&o&&534>o||e.operamini&&"[object OperaMini]"==={}.toString.call(e.operamini)||l&&7458>d||i.indexOf("Android")>-1&&o&&533>o||r&&6>r||"palmGetResource"in t&&o&&534>o||i.indexOf("MeeGo")>-1&&i.indexOf("NokiaBrowser/8.5.0")>-1?!1:!0}var h=e("").prependTo("html"),u=h[0].style,p=["Webkit","Moz","O"],m="palmGetResource"in t,f=t.opera,g=t.operamini&&"[object OperaMini]"==={}.toString.call(t.operamini),b=t.blackberry&&!a("-webkit-transform");e.extend(e.mobile,{browser:{}}),e.mobile.browser.oldIE=function(){var e=3,t=i.createElement("div"),n=t.all||[];do t.innerHTML="";while(n[0]);return e>4?e:!e}(),e.extend(e.support,{cssTransitions:"WebKitTransitionEvent"in t||o("transition","height 100ms linear",["Webkit","Moz",""])&&!e.mobile.browser.oldIE&&!f,pushState:"pushState"in history&&"replaceState"in history&&!(t.navigator.userAgent.indexOf("Firefox")>=0&&t.top!==t)&&-1===t.navigator.userAgent.search(/CriOS/),mediaquery:e.mobile.media("only all"),cssPseudoElement:!!a("content"),touchOverflow:!!a("overflowScrolling"),cssTransform3d:s(),boxShadow:!!a("boxShadow")&&!b,fixedPosition:c(),scrollTop:("pageXOffset"in t||"scrollTop"in i.documentElement||"scrollTop"in h[0])&&!m&&!g,dynamicBaseTag:r(),cssPointerEvents:l(),boundingRect:d()}),h.remove();var v=function(){var e=t.navigator.userAgent;return e.indexOf("Nokia")>-1&&(e.indexOf("Symbian/3")>-1||e.indexOf("Series60/5")>-1)&&e.indexOf("AppleWebKit")>-1&&e.match(/(BrowserNG|NokiaBrowser)\/7\.[0-3]/)}();e.mobile.gradeA=function(){return(e.support.mediaquery||e.mobile.browser.oldIE&&e.mobile.browser.oldIE>=7)&&(e.support.boundingRect||null!==e.fn.jquery.match(/1\.[0-7+]\.[0-9+]?/))},e.mobile.ajaxBlacklist=t.blackberry&&!t.WebKitPoint||g||v,v&&e(function(){e("head link[rel='stylesheet']").attr("rel","alternate stylesheet").attr("rel","stylesheet")}),e.support.boxShadow||e("html").addClass("ui-mobile-nosupport-boxshadow")}(e),function(e,t){var i,n=e.mobile.window;e.event.special.navigate=i={bound:!1,pushStateEnabled:!0,originalEventName:t,isPushStateEnabled:function(){return e.support.pushState&&e.mobile.pushStateEnabled===!0&&this.isHashChangeEnabled()},isHashChangeEnabled:function(){return e.mobile.hashListeningEnabled===!0},popstate:function(t){var i=new e.Event("navigate"),a=new e.Event("beforenavigate"),o=t.originalEvent.state||{};location.href,n.trigger(a),a.isDefaultPrevented()||(t.historyState&&e.extend(o,t.historyState),i.originalEvent=t,setTimeout(function(){n.trigger(i,{state:o})},0))},hashchange:function(t){var i=new e.Event("navigate"),a=new e.Event("beforenavigate");n.trigger(a),a.isDefaultPrevented()||(i.originalEvent=t,n.trigger(i,{state:t.hashchangeState||{}}))},setup:function(){i.bound||(i.bound=!0,i.isPushStateEnabled()?(i.originalEventName="popstate",n.bind("popstate.navigate",i.popstate)):i.isHashChangeEnabled()&&(i.originalEventName="hashchange",n.bind("hashchange.navigate",i.hashchange)))}}}(e),function(e,i){var n,a,o="&ui-state=dialog";e.mobile.path=n={uiStateKey:"&ui-state",urlParseRE:/^\s*(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/,getLocation:function(e){var t=e?this.parseUrl(e):location,i=this.parseUrl(e||location.href).hash;return i="#"===i?"":i,t.protocol+"//"+t.host+t.pathname+t.search+i},parseLocation:function(){return this.parseUrl(this.getLocation())},parseUrl:function(t){if("object"===e.type(t))return t;var i=n.urlParseRE.exec(t||"")||[];return{href:i[0]||"",hrefNoHash:i[1]||"",hrefNoSearch:i[2]||"",domain:i[3]||"",protocol:i[4]||"",doubleSlash:i[5]||"",authority:i[6]||"",username:i[8]||"",password:i[9]||"",host:i[10]||"",hostname:i[11]||"",port:i[12]||"",pathname:i[13]||"",directory:i[14]||"",filename:i[15]||"",search:i[16]||"",hash:i[17]||""}},makePathAbsolute:function(e,t){if(e&&"/"===e.charAt(0))return e;e=e||"",t=t?t.replace(/^\/|(\/[^\/]*|[^\/]+)$/g,""):"";for(var i=t?t.split("/"):[],n=e.split("/"),a=0;n.length>a;a++){var o=n[a];switch(o){case".":break;case"..":i.length&&i.pop();break;default:i.push(o)}}return"/"+i.join("/")},isSameDomain:function(e,t){return n.parseUrl(e).domain===n.parseUrl(t).domain},isRelativeUrl:function(e){return""===n.parseUrl(e).protocol},isAbsoluteUrl:function(e){return""!==n.parseUrl(e).protocol},makeUrlAbsolute:function(e,t){if(!n.isRelativeUrl(e))return e;t===i&&(t=this.documentBase);var a=n.parseUrl(e),o=n.parseUrl(t),s=a.protocol||o.protocol,r=a.protocol?a.doubleSlash:a.doubleSlash||o.doubleSlash,l=a.authority||o.authority,d=""!==a.pathname,c=n.makePathAbsolute(a.pathname||o.filename,o.pathname),h=a.search||!d&&o.search||"",u=a.hash;return s+r+l+c+h+u},addSearchParams:function(t,i){var a=n.parseUrl(t),o="object"==typeof i?e.param(i):i,s=a.search||"?";return a.hrefNoSearch+s+("?"!==s.charAt(s.length-1)?"&":"")+o+(a.hash||"")},convertUrlToDataUrl:function(e){var i=n.parseUrl(e);return n.isEmbeddedPage(i)?i.hash.split(o)[0].replace(/^#/,"").replace(/\?.*$/,""):n.isSameDomain(i,this.documentBase)?i.hrefNoHash.replace(this.documentBase.domain,"").split(o)[0]:t.decodeURIComponent(e)},get:function(e){return e===i&&(e=n.parseLocation().hash),n.stripHash(e).replace(/[^\/]*\.[^\/*]+$/,"")},set:function(e){location.hash=e},isPath:function(e){return/\//.test(e)},clean:function(e){return e.replace(this.documentBase.domain,"")},stripHash:function(e){return e.replace(/^#/,"")},stripQueryParams:function(e){return e.replace(/\?.*$/,"")},cleanHash:function(e){return n.stripHash(e.replace(/\?.*$/,"").replace(o,""))},isHashValid:function(e){return/^#[^#]+$/.test(e)},isExternal:function(e){var t=n.parseUrl(e);return t.protocol&&t.domain!==this.documentUrl.domain?!0:!1},hasProtocol:function(e){return/^(:?\w+:)/.test(e)},isEmbeddedPage:function(e){var t=n.parseUrl(e);return""!==t.protocol?!this.isPath(t.hash)&&t.hash&&(t.hrefNoHash===this.documentUrl.hrefNoHash||this.documentBaseDiffers&&t.hrefNoHash===this.documentBase.hrefNoHash):/^#/.test(t.href)},squash:function(e,t){var i,a,o,s,r=this.isPath(e),l=this.parseUrl(e),d=l.hash,c="";return t=t||(n.isPath(e)?n.getLocation():n.getDocumentUrl()),a=r?n.stripHash(e):e,a=n.isPath(l.hash)?n.stripHash(l.hash):a,s=a.indexOf(this.uiStateKey),s>-1&&(c=a.slice(s),a=a.slice(0,s)),i=n.makeUrlAbsolute(a,t),o=this.parseUrl(i).search,r?((n.isPath(d)||0===d.replace("#","").indexOf(this.uiStateKey))&&(d=""),c&&-1===d.indexOf(this.uiStateKey)&&(d+=c),-1===d.indexOf("#")&&""!==d&&(d="#"+d),i=n.parseUrl(i),i=i.protocol+"//"+i.host+i.pathname+o+d):i+=i.indexOf("#")>-1?c:"#"+c,i},isPreservableHash:function(e){return 0===e.replace("#","").indexOf(this.uiStateKey)}},n.documentUrl=n.parseLocation(),a=e("head").find("base"),n.documentBase=a.length?n.parseUrl(n.makeUrlAbsolute(a.attr("href"),n.documentUrl.href)):n.documentUrl,n.documentBaseDiffers=n.documentUrl.hrefNoHash!==n.documentBase.hrefNoHash,n.getDocumentUrl=function(t){return t?e.extend({},n.documentUrl):n.documentUrl.href},n.getDocumentBase=function(t){return t?e.extend({},n.documentBase):n.documentBase.href}}(e),function(e,t){e.mobile.path,e.mobile.History=function(e,t){this.stack=e||[],this.activeIndex=t||0},e.extend(e.mobile.History.prototype,{getActive:function(){return this.stack[this.activeIndex]},getLast:function(){return this.stack[this.previousIndex]},getNext:function(){return this.stack[this.activeIndex+1]},getPrev:function(){return this.stack[this.activeIndex-1]},add:function(e,t){t=t||{},this.getNext()&&this.clearForward(),t.hash&&-1===t.hash.indexOf("#")&&(t.hash="#"+t.hash),t.url=e,this.stack.push(t),this.activeIndex=this.stack.length-1},clearForward:function(){this.stack=this.stack.slice(0,this.activeIndex+1)},find:function(e,t,i){t=t||this.stack;var n,a,o,s=t.length;for(a=0;s>a;a++)if(n=t[a],(decodeURIComponent(e)===decodeURIComponent(n.url)||decodeURIComponent(e)===decodeURIComponent(n.hash))&&(o=a,i))return o;return o},closest:function(e){var i,n=this.activeIndex;return i=this.find(e,this.stack.slice(0,n)),i===t&&(i=this.find(e,this.stack.slice(n),!0),i=i===t?i:i+n),i},direct:function(i){var n=this.closest(i.url),a=this.activeIndex;n!==t&&(this.activeIndex=n,this.previousIndex=a),a>n?(i.present||i.back||e.noop)(this.getActive(),"back"):n>a?(i.present||i.forward||e.noop)(this.getActive(),"forward"):n===t&&i.missing&&i.missing(this.getActive())}})}(e),function(e){var a=e.mobile.path,o=location.href;e.mobile.Navigator=function(t){this.history=t,this.ignoreInitialHashChange=!0,e.mobile.window.bind({"popstate.history":e.proxy(this.popstate,this),"hashchange.history":e.proxy(this.hashchange,this)})},e.extend(e.mobile.Navigator.prototype,{squash:function(n,o){var s,r,l=a.isPath(n)?a.stripHash(n):n;return r=a.squash(n),s=e.extend({hash:l,url:r},o),t.history.replaceState(s,s.title||i.title,r),s},hash:function(e,t){var i,n,o;if(i=a.parseUrl(e),n=a.parseLocation(),n.pathname+n.search===i.pathname+i.search)o=i.hash?i.hash:i.pathname+i.search;else if(a.isPath(e)){var s=a.parseUrl(t);o=s.pathname+s.search+(a.isPreservableHash(s.hash)?s.hash.replace("#",""):"")}else o=e;return o},go:function(n,o,s){var r,l,d,c,h=e.event.special.navigate.isPushStateEnabled();l=a.squash(n),d=this.hash(n,l),s&&d!==a.stripHash(a.parseLocation().hash)&&(this.preventNextHashChange=s),this.preventHashAssignPopState=!0,t.location.hash=d,this.preventHashAssignPopState=!1,r=e.extend({url:l,hash:d,title:i.title},o),h&&(c=new e.Event("popstate"),c.originalEvent={type:"popstate",state:null},this.squash(n,r),s||(this.ignorePopState=!0,e.mobile.window.trigger(c))),this.history.add(r.url,r)},popstate:function(t){var i,s;if(e.event.special.navigate.isPushStateEnabled())return this.preventHashAssignPopState?(this.preventHashAssignPopState=!1,t.stopImmediatePropagation(),n):this.ignorePopState?(this.ignorePopState=!1,n):!t.originalEvent.state&&1===this.history.stack.length&&this.ignoreInitialHashChange&&(this.ignoreInitialHashChange=!1,location.href===o)?(t.preventDefault(),n):(i=a.parseLocation().hash,!t.originalEvent.state&&i?(s=this.squash(i),this.history.add(s.url,s),t.historyState=s,n):(this.history.direct({url:(t.originalEvent.state||{}).url||i,present:function(i,n){t.historyState=e.extend({},i),t.historyState.direction=n}}),n))},hashchange:function(t){var o,s;if(e.event.special.navigate.isHashChangeEnabled()&&!e.event.special.navigate.isPushStateEnabled()){if(this.preventNextHashChange)return this.preventNextHashChange=!1,t.stopImmediatePropagation(),n;o=this.history,s=a.parseLocation().hash,this.history.direct({url:s,present:function(i,n){t.hashchangeState=e.extend({},i),t.hashchangeState.direction=n},missing:function(){o.add(s,{hash:s,title:i.title})}})}}})}(e),function(e){e.mobile.navigate=function(t,i,n){e.mobile.navigate.navigator.go(t,i,n)},e.mobile.navigate.history=new e.mobile.History,e.mobile.navigate.navigator=new e.mobile.Navigator(e.mobile.navigate.history);var t=e.mobile.path.parseLocation();e.mobile.navigate.history.add(t.href,{hash:t.hash})}(e),function(e,t,i,n){function a(e){for(;e&&e.originalEvent!==n;)e=e.originalEvent;return e}function o(t,i){var o,s,r,l,d,c,h,u,p,m=t.type;if(t=e.Event(t),t.type=i,o=t.originalEvent,s=e.event.props,m.search(/^(mouse|click)/)>-1&&(s=q),o)for(h=s.length,l;h;)l=s[--h],t[l]=o[l];if(m.search(/mouse(down|up)|click/)>-1&&!t.which&&(t.which=1),-1!==m.search(/^touch/)&&(r=a(o),m=r.touches,d=r.changedTouches,c=m&&m.length?m[0]:d&&d.length?d[0]:n))for(u=0,p=k.length;p>u;u++)l=k[u],t[l]=c[l];return t}function s(t){for(var i,n,a={};t;){i=e.data(t,T);for(n in i)i[n]&&(a[n]=a.hasVirtualBinding=!0);t=t.parentNode}return a}function r(t,i){for(var n;t;){if(n=e.data(t,T),n&&(!i||n[i]))return t;t=t.parentNode}return null}function l(){M=!1}function d(){M=!0}function c(){U=0,O.length=0,H=!1,d()}function h(){l()}function u(){p(),S=setTimeout(function(){S=0,c()},e.vmouse.resetTimerDuration)}function p(){S&&(clearTimeout(S),S=0)}function m(t,i,n){var a;return(n&&n[t]||!n&&r(i.target,t))&&(a=o(i,t),e(i.target).trigger(a)),a}function f(t){var i=e.data(t.target,D);if(!(H||U&&U===i)){var n=m("v"+t.type,t);n&&(n.isDefaultPrevented()&&t.preventDefault(),n.isPropagationStopped()&&t.stopPropagation(),n.isImmediatePropagationStopped()&&t.stopImmediatePropagation())}}function g(t){var i,n,o=a(t).touches;if(o&&1===o.length&&(i=t.target,n=s(i),n.hasVirtualBinding)){U=L++,e.data(i,D,U),p(),h(),I=!1;var r=a(t).touches[0];A=r.pageX,N=r.pageY,m("vmouseover",t,n),m("vmousedown",t,n)}}function b(e){M||(I||m("vmousecancel",e,s(e.target)),I=!0,u())}function v(t){if(!M){var i=a(t).touches[0],n=I,o=e.vmouse.moveDistanceThreshold,r=s(t.target);I=I||Math.abs(i.pageX-A)>o||Math.abs(i.pageY-N)>o,I&&!n&&m("vmousecancel",t,r),m("vmousemove",t,r),u()}}function _(e){if(!M){d();var t,i=s(e.target);if(m("vmouseup",e,i),!I){var n=m("vclick",e,i);n&&n.isDefaultPrevented()&&(t=a(e).changedTouches[0],O.push({touchID:U,x:t.clientX,y:t.clientY}),H=!0)}m("vmouseout",e,i),I=!1,u()}}function C(t){var i,n=e.data(t,T);if(n)for(i in n)if(n[i])return!0;return!1}function x(){}function y(t){var i=t.substr(1);return{setup:function(){C(this)||e.data(this,T,{});var n=e.data(this,T);n[t]=!0,j[t]=(j[t]||0)+1,1===j[t]&&B.bind(i,f),e(this).bind(i,x),F&&(j.touchstart=(j.touchstart||0)+1,1===j.touchstart&&B.bind("touchstart",g).bind("touchend",_).bind("touchmove",v).bind("scroll",b))},teardown:function(){--j[t],j[t]||B.unbind(i,f),F&&(--j.touchstart,j.touchstart||B.unbind("touchstart",g).unbind("touchmove",v).unbind("touchend",_).unbind("scroll",b));var n=e(this),a=e.data(this,T);a&&(a[t]=!1),n.unbind(i,x),C(this)||n.removeData(T)}}}var w,T="virtualMouseBindings",D="virtualTouchID",P="vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel".split(" "),k="clientX clientY pageX pageY screenX screenY".split(" "),E=e.event.mouseHooks?e.event.mouseHooks.props:[],q=e.event.props.concat(E),j={},S=0,A=0,N=0,I=!1,O=[],H=!1,M=!1,F="addEventListener"in i,B=e(i),L=1,U=0;e.vmouse={moveDistanceThreshold:10,clickDistanceThreshold:10,resetTimerDuration:1500};for(var z=0;P.length>z;z++)e.event.special[P[z]]=y(P[z]);F&&i.addEventListener("click",function(t){var i,a,o,s,r,l,d=O.length,c=t.target;if(d)for(i=t.clientX,a=t.clientY,w=e.vmouse.clickDistanceThreshold,o=c;o;){for(s=0;d>s;s++)if(r=O[s],l=0,o===c&&w>Math.abs(r.x-i)&&w>Math.abs(r.y-a)||e.data(o,D)===r.touchID)return t.preventDefault(),t.stopPropagation(),n;o=o.parentNode}},!0)}(e,t,i),function(e,t,n){function a(t,i,n){var a=n.type;n.type=i,e.event.dispatch.call(t,n),n.type=a}var o=e(i);e.each("touchstart touchmove touchend tap taphold swipe swipeleft swiperight scrollstart scrollstop".split(" "),function(t,i){e.fn[i]=function(e){return e?this.bind(i,e):this.trigger(i)},e.attrFn&&(e.attrFn[i]=!0)});var s=e.mobile.support.touch,r="touchmove scroll",l=s?"touchstart":"mousedown",d=s?"touchend":"mouseup",c=s?"touchmove":"mousemove";e.event.special.scrollstart={enabled:!0,setup:function(){function t(e,t){i=t,a(o,i?"scrollstart":"scrollstop",e)}var i,n,o=this,s=e(o);s.bind(r,function(a){e.event.special.scrollstart.enabled&&(i||t(a,!0),clearTimeout(n),n=setTimeout(function(){t(a,!1)},50))})}},e.event.special.tap={tapholdThreshold:750,setup:function(){var t=this,i=e(t);i.bind("vmousedown",function(n){function s(){clearTimeout(d)}function r(){s(),i.unbind("vclick",l).unbind("vmouseup",s),o.unbind("vmousecancel",r)}function l(e){r(),c===e.target&&a(t,"tap",e)}if(n.which&&1!==n.which)return!1;var d,c=n.target;n.originalEvent,i.bind("vmouseup",s).bind("vclick",l),o.bind("vmousecancel",r),d=setTimeout(function(){a(t,"taphold",e.Event("taphold",{target:c})) },e.event.special.tap.tapholdThreshold)})}},e.event.special.swipe={scrollSupressionThreshold:30,durationThreshold:1e3,horizontalDistanceThreshold:30,verticalDistanceThreshold:75,start:function(t){var i=t.originalEvent.touches?t.originalEvent.touches[0]:t;return{time:(new Date).getTime(),coords:[i.pageX,i.pageY],origin:e(t.target)}},stop:function(e){var t=e.originalEvent.touches?e.originalEvent.touches[0]:e;return{time:(new Date).getTime(),coords:[t.pageX,t.pageY]}},handleSwipe:function(t,i){i.time-t.timee.event.special.swipe.horizontalDistanceThreshold&&Math.abs(t.coords[1]-i.coords[1])i.coords[0]?"swipeleft":"swiperight")},setup:function(){var t=this,i=e(t);i.bind(l,function(t){function a(t){s&&(o=e.event.special.swipe.stop(t),Math.abs(s.coords[0]-o.coords[0])>e.event.special.swipe.scrollSupressionThreshold&&t.preventDefault())}var o,s=e.event.special.swipe.start(t);i.bind(c,a).one(d,function(){i.unbind(c,a),s&&o&&e.event.special.swipe.handleSwipe(s,o),s=o=n})})}},e.each({scrollstop:"scrollstart",taphold:"tap",swipeleft:"swipe",swiperight:"swipe"},function(t,i){e.event.special[t]={setup:function(){e(this).bind(i,e.noop)}}})}(e,this),function(e){e.event.special.throttledresize={setup:function(){e(this).bind("resize",o)},teardown:function(){e(this).unbind("resize",o)}};var t,i,n,a=250,o=function(){i=(new Date).getTime(),n=i-s,n>=a?(s=i,e(this).trigger("throttledresize")):(t&&clearTimeout(t),t=setTimeout(o,a-n))},s=0}(e),function(e,t){function a(){var e=o();e!==s&&(s=e,d.trigger(c))}var o,s,r,l,d=e(t),c="orientationchange",h={0:!0,180:!0};if(e.support.orientation){var u=t.innerWidth||d.width(),p=t.innerHeight||d.height(),m=50;r=u>p&&u-p>m,l=h[t.orientation],(r&&l||!r&&!l)&&(h={"-90":!0,90:!0})}e.event.special.orientationchange=e.extend({},e.event.special.orientationchange,{setup:function(){return e.support.orientation&&!e.event.special.orientationchange.disabled?!1:(s=o(),d.bind("throttledresize",a),n)},teardown:function(){return e.support.orientation&&!e.event.special.orientationchange.disabled?!1:(d.unbind("throttledresize",a),n)},add:function(e){var t=e.handler;e.handler=function(e){return e.orientation=o(),t.apply(this,arguments)}}}),e.event.special.orientationchange.orientation=o=function(){var n=!0,a=i.documentElement;return n=e.support.orientation?h[t.orientation]:a&&1.1>a.clientWidth/a.clientHeight,n?"portrait":"landscape"},e.fn[c]=function(e){return e?this.bind(c,e):this.trigger(c)},e.attrFn&&(e.attrFn[c]=!0)}(e,this),function(e){e.widget("mobile.page",e.mobile.widget,{options:{theme:"c",domCache:!1,keepNativeDefault:":jqmData(role='none'), :jqmData(role='nojs')"},_create:function(){return this._trigger("beforecreate")===!1?!1:(this.element.attr("tabindex","0").addClass("ui-page ui-body-"+this.options.theme),this._on(this.element,{pagebeforehide:"removeContainerBackground",pagebeforeshow:"_handlePageBeforeShow"}),n)},_handlePageBeforeShow:function(){this.setContainerBackground()},removeContainerBackground:function(){e.mobile.pageContainer.removeClass("ui-overlay-"+e.mobile.getInheritedTheme(this.element.parent()))},setContainerBackground:function(t){this.options.theme&&e.mobile.pageContainer.addClass("ui-overlay-"+(t||this.options.theme))},keepNativeSelector:function(){var t=this.options,i=t.keepNative&&e.trim(t.keepNative);return i&&t.keepNative!==t.keepNativeDefault?[t.keepNative,t.keepNativeDefault].join(", "):t.keepNativeDefault}})}(e),function(e,t,i){var n=function(n){return n===i&&(n=!0),function(i,a,o,s){var r=new e.Deferred,l=a?" reverse":"",d=e.mobile.urlHistory.getActive(),c=d.lastScroll||e.mobile.defaultHomeScroll,h=e.mobile.getScreenHeight(),u=e.mobile.maxTransitionWidth!==!1&&e.mobile.window.width()>e.mobile.maxTransitionWidth,p=!e.support.cssTransitions||u||!i||"none"===i||Math.max(e.mobile.window.scrollTop(),c)>e.mobile.getMaxScrollForTransition(),m=" ui-page-pre-in",f=function(){e.mobile.pageContainer.toggleClass("ui-mobile-viewport-transitioning viewport-"+i)},g=function(){e.event.special.scrollstart.enabled=!1,t.scrollTo(0,c),setTimeout(function(){e.event.special.scrollstart.enabled=!0},150)},b=function(){s.removeClass(e.mobile.activePageClass+" out in reverse "+i).height("")},v=function(){n?s.animationComplete(_):_(),s.height(h+e.mobile.window.scrollTop()).addClass(i+" out"+l)},_=function(){s&&n&&b(),C()},C=function(){o.css("z-index",-10),o.addClass(e.mobile.activePageClass+m),e.mobile.focusPage(o),o.height(h+c),g(),o.css("z-index",""),p||o.animationComplete(x),o.removeClass(m).addClass(i+" in"+l),p&&x()},x=function(){n||s&&b(),o.removeClass("out in reverse "+i).height(""),f(),e.mobile.window.scrollTop()!==c&&g(),r.resolve(i,a,o,s,!0)};return f(),s&&!p?v():_(),r.promise()}},a=n(),o=n(!1),s=function(){return 3*e.mobile.getScreenHeight()};e.mobile.defaultTransitionHandler=a,e.mobile.transitionHandlers={"default":e.mobile.defaultTransitionHandler,sequential:a,simultaneous:o},e.mobile.transitionFallbacks={},e.mobile._maybeDegradeTransition=function(t){return t&&!e.support.cssTransform3d&&e.mobile.transitionFallbacks[t]&&(t=e.mobile.transitionFallbacks[t]),t},e.mobile.getMaxScrollForTransition=e.mobile.getMaxScrollForTransition||s}(e,this),function(e,n){function a(t){!f||f.closest("."+e.mobile.activePageClass).length&&!t||f.removeClass(e.mobile.activeBtnClass),f=null}function o(){_=!1,v.length>0&&e.mobile.changePage.apply(null,v.pop())}function s(t,i,n,a){i&&i.data("mobile-page")._trigger("beforehide",null,{nextPage:t}),t.data("mobile-page")._trigger("beforeshow",null,{prevPage:i||e("")}),e.mobile.hidePageLoadingMsg(),n=e.mobile._maybeDegradeTransition(n);var o=e.mobile.transitionHandlers[n||"default"]||e.mobile.defaultTransitionHandler,s=o(n,a,t,i);return s.done(function(){i&&i.data("mobile-page")._trigger("hide",null,{nextPage:t}),t.data("mobile-page")._trigger("show",null,{prevPage:i||e("")})}),s}function r(t,i){i&&t.attr("data-"+e.mobile.ns+"role",i),t.page()}function l(){var t=e.mobile.activePage&&c(e.mobile.activePage);return t||w.hrefNoHash}function d(e){for(;e&&("string"!=typeof e.nodeName||"a"!==e.nodeName.toLowerCase());)e=e.parentNode;return e}function c(t){var i=e(t).closest(".ui-page").jqmData("url"),n=w.hrefNoHash;return i&&p.isPath(i)||(i=n),p.makeUrlAbsolute(i,n)}var h=e.mobile.window,u=(e("html"),e("head")),p=e.extend(e.mobile.path,{getFilePath:function(t){var i="&"+e.mobile.subPageUrlKey;return t&&t.split(i)[0].split(C)[0]},isFirstPageUrl:function(t){var i=p.parseUrl(p.makeUrlAbsolute(t,this.documentBase)),a=i.hrefNoHash===this.documentUrl.hrefNoHash||this.documentBaseDiffers&&i.hrefNoHash===this.documentBase.hrefNoHash,o=e.mobile.firstPage,s=o&&o[0]?o[0].id:n;return a&&(!i.hash||"#"===i.hash||s&&i.hash.replace(/^#/,"")===s)},isPermittedCrossDomainRequest:function(t,i){return e.mobile.allowCrossDomainPages&&"file:"===t.protocol&&-1!==i.search(/^https?:/)}}),m=null,f=null,g=e.Deferred(),b=e.mobile.navigate.history,v=[],_=!1,C="&ui-state=dialog",x=u.children("base"),y=p.documentUrl,w=p.documentBase,T=(p.documentBaseDiffers,e.mobile.getScreenHeight),D=e.support.dynamicBaseTag?{element:x.length?x:e("",{href:w.hrefNoHash}).prependTo(u),set:function(e){e=p.parseUrl(e).hrefNoHash,D.element.attr("href",p.makeUrlAbsolute(e,w))},reset:function(){D.element.attr("href",w.hrefNoSearch)}}:n;e.mobile.getDocumentUrl=p.getDocumentUrl,e.mobile.getDocumentBase=p.getDocumentBase,e.mobile.back=function(){var e=t.navigator;this.phonegapNavigationEnabled&&e&&e.app&&e.app.backHistory?e.app.backHistory():t.history.back()},e.mobile.focusPage=function(e){var t=e.find("[autofocus]"),i=e.find(".ui-title:eq(0)");return t.length?(t.focus(),n):(i.length?i.focus():e.focus(),n)};var P,k,E=!0;P=function(){if(E){var t=e.mobile.urlHistory.getActive();if(t){var i=h.scrollTop();t.lastScroll=e.mobile.minScrollBack>i?e.mobile.defaultHomeScroll:i}}},k=function(){setTimeout(P,100)},h.bind(e.support.pushState?"popstate":"hashchange",function(){E=!1}),h.one(e.support.pushState?"popstate":"hashchange",function(){E=!0}),h.one("pagecontainercreate",function(){e.mobile.pageContainer.bind("pagechange",function(){E=!0,h.unbind("scrollstop",k),h.bind("scrollstop",k)})}),h.bind("scrollstop",k),e.mobile._maybeDegradeTransition=e.mobile._maybeDegradeTransition||function(e){return e},e.mobile.resetActivePageHeight=function(t){var i=e("."+e.mobile.activePageClass),n=parseFloat(i.css("padding-top")),a=parseFloat(i.css("padding-bottom")),o=parseFloat(i.css("border-top-width")),s=parseFloat(i.css("border-bottom-width"));t="number"==typeof t?t:T(),i.css("min-height",t-n-a-o-s)},e.fn.animationComplete=function(t){return e.support.cssTransitions?e(this).one("webkitAnimationEnd animationend",t):(setTimeout(t,0),e(this))},e.mobile.path=p,e.mobile.base=D,e.mobile.urlHistory=b,e.mobile.dialogHashKey=C,e.mobile.allowCrossDomainPages=!1,e.mobile._bindPageRemove=function(){var t=e(this);!t.data("mobile-page").options.domCache&&t.is(":jqmData(external-page='true')")&&t.bind("pagehide.remove",function(){var t=e(this),i=new e.Event("pageremove");t.trigger(i),i.isDefaultPrevented()||t.removeWithDependents()})},e.mobile.loadPage=function(t,i){var a=e.Deferred(),o=e.extend({},e.mobile.loadPage.defaults,i),s=null,d=null,c=p.makeUrlAbsolute(t,l());o.data&&"get"===o.type&&(c=p.addSearchParams(c,o.data),o.data=n),o.data&&"post"===o.type&&(o.reloadPage=!0);var h=p.getFilePath(c),u=p.convertUrlToDataUrl(c);if(o.pageContainer=o.pageContainer||e.mobile.pageContainer,s=o.pageContainer.children("[data-"+e.mobile.ns+"url='"+u+"']"),0===s.length&&u&&!p.isPath(u)&&(s=o.pageContainer.children("#"+u).attr("data-"+e.mobile.ns+"url",u).jqmData("url",u)),0===s.length)if(e.mobile.firstPage&&p.isFirstPageUrl(h))e.mobile.firstPage.parent().length&&(s=e(e.mobile.firstPage));else if(p.isEmbeddedPage(h))return a.reject(c,i),a.promise();if(s.length){if(!o.reloadPage)return r(s,o.role),a.resolve(c,i,s),D&&!i.prefetch&&D.set(t),a.promise();d=s}var m=o.pageContainer,f=new e.Event("pagebeforeload"),g={url:t,absUrl:c,dataUrl:u,deferred:a,options:o};if(m.trigger(f,g),f.isDefaultPrevented())return a.promise();if(o.showLoadMsg)var b=setTimeout(function(){e.mobile.showPageLoadingMsg()},o.loadMsgDelay),v=function(){clearTimeout(b),e.mobile.hidePageLoadingMsg()};return D&&i.prefetch===n&&D.reset(),e.mobile.allowCrossDomainPages||p.isSameDomain(y,c)?e.ajax({url:h,type:o.type,data:o.data,contentType:o.contentType,dataType:"html",success:function(l,m,f){var b=e("
    "),_=l.match(/]*>([^<]*)/)&&RegExp.$1,C=RegExp("(<[^>]+\\bdata-"+e.mobile.ns+"role=[\"']?page[\"']?[^>]*>)"),x=RegExp("\\bdata-"+e.mobile.ns+"url=[\"']?([^\"'>]*)[\"']?");if(C.test(l)&&RegExp.$1&&x.test(RegExp.$1)&&RegExp.$1&&(t=h=p.getFilePath(e("
    "+RegExp.$1+"
    ").text())),D&&i.prefetch===n&&D.set(h),b.get(0).innerHTML=l,s=b.find(":jqmData(role='page'), :jqmData(role='dialog')").first(),s.length||(s=e("
    "+(l.split(/<\/?body[^>]*>/gim)[1]||"")+"
    ")),_&&!s.jqmData("title")&&(~_.indexOf("&")&&(_=e("
    "+_+"
    ").text()),s.jqmData("title",_)),!e.support.dynamicBaseTag){var y=p.get(h);s.find("[src], link[href], a[rel='external'], :jqmData(ajax='false'), a[target]").each(function(){var t=e(this).is("[href]")?"href":e(this).is("[src]")?"src":"action",i=e(this).attr(t);i=i.replace(location.protocol+"//"+location.host+location.pathname,""),/^(\w+:|#|\/)/.test(i)||e(this).attr(t,y+i)})}s.attr("data-"+e.mobile.ns+"url",p.convertUrlToDataUrl(h)).attr("data-"+e.mobile.ns+"external-page",!0).appendTo(o.pageContainer),s.one("pagecreate",e.mobile._bindPageRemove),r(s,o.role),c.indexOf("&"+e.mobile.subPageUrlKey)>-1&&(s=o.pageContainer.children("[data-"+e.mobile.ns+"url='"+u+"']")),o.showLoadMsg&&v(),g.xhr=f,g.textStatus=m,g.page=s,o.pageContainer.trigger("pageload",g),a.resolve(c,i,s,d)},error:function(t,n,s){D&&D.set(p.get()),g.xhr=t,g.textStatus=n,g.errorThrown=s;var r=new e.Event("pageloadfailed");o.pageContainer.trigger(r,g),r.isDefaultPrevented()||(o.showLoadMsg&&(v(),e.mobile.showPageLoadingMsg(e.mobile.pageLoadErrorMessageTheme,e.mobile.pageLoadErrorMessage,!0),setTimeout(e.mobile.hidePageLoadingMsg,1500)),a.reject(c,i))}}):a.reject(c,i),a.promise()},e.mobile.loadPage.defaults={type:"get",data:n,reloadPage:!1,role:n,showLoadMsg:!1,pageContainer:n,loadMsgDelay:50},e.mobile.changePage=function(t,d){if(_)return v.unshift(arguments),n;var c,h=e.extend({},e.mobile.changePage.defaults,d);h.pageContainer=h.pageContainer||e.mobile.pageContainer,h.fromPage=h.fromPage||e.mobile.activePage,c="string"==typeof t;var u=h.pageContainer,m=new e.Event("pagebeforechange"),f={toPage:t,options:h};if(f.absUrl=c?p.makeUrlAbsolute(t,l()):t.data("absUrl"),u.trigger(m,f),!m.isDefaultPrevented()){if(t=f.toPage,c="string"==typeof t,_=!0,c)return h.target=t,e.mobile.loadPage(t,h).done(function(t,i,n,a){_=!1,i.duplicateCachedPage=a,n.data("absUrl",f.absUrl),e.mobile.changePage(n,i)}).fail(function(){a(!0),o(),h.pageContainer.trigger("pagechangefailed",f)}),n;t[0]!==e.mobile.firstPage[0]||h.dataUrl||(h.dataUrl=y.hrefNoHash);var g=h.fromPage,x=h.dataUrl&&p.convertUrlToDataUrl(h.dataUrl)||t.jqmData("url"),w=x,T=(p.getFilePath(x),b.getActive()),D=0===b.activeIndex,P=0,k=i.title,E="dialog"===h.role||"dialog"===t.jqmData("role");if(g&&g[0]===t[0]&&!h.allowSamePageTransition)return _=!1,u.trigger("pagechange",f),h.fromHashChange&&b.direct({url:x}),n;r(t,h.role),h.fromHashChange&&(P="back"===d.direction?-1:1);try{i.activeElement&&"body"!==i.activeElement.nodeName.toLowerCase()?e(i.activeElement).blur():e("input:focus, textarea:focus, select:focus").blur()}catch(q){}var j=!1;E&&T&&(T.url&&T.url.indexOf(C)>-1&&e.mobile.activePage&&!e.mobile.activePage.is(".ui-dialog")&&b.activeIndex>0&&(h.changeHash=!1,j=!0),x=T.url||"",x+=!j&&x.indexOf("#")>-1?C:"#"+C,0===b.activeIndex&&x===b.initialDst&&(x+=C));var S=T?t.jqmData("title")||t.children(":jqmData(role='header')").find(".ui-title").text():k;if(S&&k===i.title&&(k=S),t.jqmData("title")||t.jqmData("title",k),h.transition=h.transition||(P&&!D?T.transition:n)||(E?e.mobile.defaultDialogTransition:e.mobile.defaultPageTransition),!P&&j&&(b.getActive().pageUrl=w),x&&!h.fromHashChange){var A;!p.isPath(x)&&0>x.indexOf("#")&&(x="#"+x),A={transition:h.transition,title:k,pageUrl:w,role:h.role},h.changeHash!==!1&&e.mobile.hashListeningEnabled?e.mobile.navigate(x,A,!0):t[0]!==e.mobile.firstPage[0]&&e.mobile.navigate.history.add(x,A)}i.title=k,e.mobile.activePage=t,h.reverse=h.reverse||0>P,s(t,g,h.transition,h.reverse).done(function(i,n,s,r,l){a(),h.duplicateCachedPage&&h.duplicateCachedPage.remove(),l||e.mobile.focusPage(t),o(),u.trigger("pagechange",f)})}},e.mobile.changePage.defaults={transition:n,reverse:!1,changeHash:!0,fromHashChange:!1,role:n,duplicateCachedPage:n,pageContainer:n,showLoadMsg:!0,dataUrl:n,fromPage:n,allowSamePageTransition:!1},e.mobile.navreadyDeferred=e.Deferred(),e.mobile._registerInternalEvents=function(){var i=function(t,i){var a,o,s,r,l=!0;return!e.mobile.ajaxEnabled||t.is(":jqmData(ajax='false')")||!t.jqmHijackable().length||t.attr("target")?!1:(a=t.attr("action"),r=(t.attr("method")||"get").toLowerCase(),a||(a=c(t),"get"===r&&(a=p.parseUrl(a).hrefNoSearch),a===w.hrefNoHash&&(a=y.hrefNoSearch)),a=p.makeUrlAbsolute(a,c(t)),p.isExternal(a)&&!p.isPermittedCrossDomainRequest(y,a)?!1:(i||(o=t.serializeArray(),m&&m[0].form===t[0]&&(s=m.attr("name"),s&&(e.each(o,function(e,t){return t.name===s?(s="",!1):n}),s&&o.push({name:s,value:m.attr("value")}))),l={url:a,options:{type:r,data:e.param(o),transition:t.jqmData("transition"),reverse:"reverse"===t.jqmData("direction"),reloadPage:!0}}),l))};e.mobile.document.delegate("form","submit",function(t){var n=i(e(this));n&&(e.mobile.changePage(n.url,n.options),t.preventDefault())}),e.mobile.document.bind("vclick",function(t){var n,o,s=t.target,r=!1;if(!(t.which>1)&&e.mobile.linkBindingEnabled){if(m=e(s),e.data(s,"mobile-button")){if(!i(e(s).closest("form"),!0))return;s.parentNode&&(s=s.parentNode)}else{if(s=d(s),!s||"#"===p.parseUrl(s.getAttribute("href")||"#").hash)return;if(!e(s).jqmHijackable().length)return}~s.className.indexOf("ui-link-inherit")?s.parentNode&&(o=e.data(s.parentNode,"buttonElements")):o=e.data(s,"buttonElements"),o?s=o.outer:r=!0,n=e(s),r&&(n=n.closest(".ui-btn")),n.length>0&&!n.hasClass("ui-disabled")&&(a(!0),f=n,f.addClass(e.mobile.activeBtnClass))}}),e.mobile.document.bind("click",function(i){if(e.mobile.linkBindingEnabled&&!i.isDefaultPrevented()){var o,s=d(i.target),r=e(s);if(s&&!(i.which>1)&&r.jqmHijackable().length){if(o=function(){t.setTimeout(function(){a(!0)},200)},r.is(":jqmData(rel='back')"))return e.mobile.back(),!1;var l=c(r),h=p.makeUrlAbsolute(r.attr("href")||"#",l);if(!e.mobile.ajaxEnabled&&!p.isEmbeddedPage(h))return o(),n;if(-1!==h.search("#")){if(h=h.replace(/[^#]*#/,""),!h)return i.preventDefault(),n;h=p.isPath(h)?p.makeUrlAbsolute(h,l):p.makeUrlAbsolute("#"+h,y.hrefNoHash)}var u=r.is("[rel='external']")||r.is(":jqmData(ajax='false')")||r.is("[target]"),m=u||p.isExternal(h)&&!p.isPermittedCrossDomainRequest(y,h);if(m)return o(),n;var f=r.jqmData("transition"),g="reverse"===r.jqmData("direction")||r.jqmData("back"),b=r.attr("data-"+e.mobile.ns+"rel")||n;e.mobile.changePage(h,{transition:f,reverse:g,role:b,link:r}),i.preventDefault()}}}),e.mobile.document.delegate(".ui-page","pageshow.prefetch",function(){var t=[];e(this).find("a:jqmData(prefetch)").each(function(){var i=e(this),n=i.attr("href");n&&-1===e.inArray(n,t)&&(t.push(n),e.mobile.loadPage(n,{role:i.attr("data-"+e.mobile.ns+"rel"),prefetch:!0}))})}),e.mobile._handleHashChange=function(i,a){var o=p.stripHash(i),s=0===e.mobile.urlHistory.stack.length?"none":n,r={changeHash:!1,fromHashChange:!0,reverse:"back"===a.direction};if(e.extend(r,a,{transition:(b.getLast()||{}).transition||s}),b.activeIndex>0&&o.indexOf(C)>-1&&b.initialDst!==o){if(e.mobile.activePage&&!e.mobile.activePage.is(".ui-dialog"))return"back"===a.direction?e.mobile.back():t.history.forward(),n;o=a.pageUrl;var l=e.mobile.urlHistory.getActive();e.extend(r,{role:l.role,transition:l.transition,reverse:"back"===a.direction})}o?(o=p.isPath(o)?o:p.makeUrlAbsolute("#"+o,w),o===p.makeUrlAbsolute("#"+b.initialDst,w)&&b.stack.length&&b.stack[0].url!==b.initialDst.replace(C,"")&&(o=e.mobile.firstPage),e.mobile.changePage(o,r)):e.mobile.changePage(e.mobile.firstPage,r)},h.bind("navigate",function(t,i){var n;t.originalEvent&&t.originalEvent.isDefaultPrevented()||(n=e.event.special.navigate.originalEventName.indexOf("hashchange")>-1?i.state.hash:i.state.url,n||(n=e.mobile.path.parseLocation().hash),n&&"#"!==n&&0!==n.indexOf("#"+e.mobile.path.uiStateKey)||(n=location.href),e.mobile._handleHashChange(n,i.state))}),e.mobile.document.bind("pageshow",e.mobile.resetActivePageHeight),e.mobile.window.bind("throttledresize",e.mobile.resetActivePageHeight)},e(function(){g.resolve()}),e.when(g,e.mobile.navreadyDeferred).done(function(){e.mobile._registerInternalEvents()})}(e),function(e){e.mobile.transitionFallbacks.flip="fade"}(e,this),function(e){e.mobile.transitionFallbacks.flow="fade"}(e,this),function(e){e.mobile.transitionFallbacks.pop="fade"}(e,this),function(e){e.mobile.transitionHandlers.slide=e.mobile.transitionHandlers.simultaneous,e.mobile.transitionFallbacks.slide="fade"}(e,this),function(e){e.mobile.transitionFallbacks.slidedown="fade"}(e,this),function(e){e.mobile.transitionFallbacks.slidefade="fade"}(e,this),function(e){e.mobile.transitionFallbacks.slideup="fade"}(e,this),function(e){e.mobile.transitionFallbacks.turn="fade"}(e,this),function(e){e.mobile.page.prototype.options.degradeInputs={color:!1,date:!1,datetime:!1,"datetime-local":!1,email:!1,month:!1,number:!1,range:"number",search:"text",tel:!1,time:!1,url:!1,week:!1},e.mobile.document.bind("pagecreate create",function(t){var i,n=e.mobile.closestPageData(e(t.target));n&&(i=n.options,e(t.target).find("input").not(n.keepNativeSelector()).each(function(){var t=e(this),n=this.getAttribute("type"),a=i.degradeInputs[n]||"text";if(i.degradeInputs[n]){var o=e("
    ").html(t.clone()).html(),s=o.indexOf(" type=")>-1,r=s?/\s+type=["']?\w+['"]?/:/\/?>/,l=' type="'+a+'" data-'+e.mobile.ns+'type="'+n+'"'+(s?"":">");t.replaceWith(o.replace(r,l))}}))})}(e),function(e){e.widget("mobile.dialog",e.mobile.widget,{options:{closeBtn:"left",closeBtnText:"Close",overlayTheme:"a",corners:!0,initSelector:":jqmData(role='dialog')"},_handlePageBeforeShow:function(){this._isCloseable=!0,this.options.overlayTheme&&this.element.page("removeContainerBackground").page("setContainerBackground",this.options.overlayTheme)},_create:function(){var t=this.element,i=this.options.corners?" ui-corner-all":"",n=e("
    ",{role:"dialog","class":"ui-dialog-contain ui-overlay-shadow"+i});t.addClass("ui-dialog ui-overlay-"+this.options.overlayTheme),t.wrapInner(n),t.bind("vclick submit",function(t){var i,n=e(t.target).closest("vclick"===t.type?"a":"form");n.length&&!n.jqmData("transition")&&(i=e.mobile.urlHistory.getActive()||{},n.attr("data-"+e.mobile.ns+"transition",i.transition||e.mobile.defaultDialogTransition).attr("data-"+e.mobile.ns+"direction","reverse"))}),this._on(t,{pagebeforeshow:"_handlePageBeforeShow"}),e.extend(this,{_createComplete:!1}),this._setCloseBtn(this.options.closeBtn)},_setCloseBtn:function(t){var i,n,a=this;this._headerCloseButton&&(this._headerCloseButton.remove(),this._headerCloseButton=null),"none"!==t&&(n="left"===t?"left":"right",i=e(""+this.options.closeBtnText+""),this.element.children().find(":jqmData(role='header')").first().prepend(i),this._createComplete&&e.fn.buttonMarkup&&i.buttonMarkup(),this._createComplete=!0,i.bind("click",function(){a.close()}),this._headerCloseButton=i)},_setOption:function(e,t){"closeBtn"===e&&this._setCloseBtn(t),this._super(e,t)},close:function(){var t,i,n=e.mobile.navigate.history;this._isCloseable&&(this._isCloseable=!1,e.mobile.hashListeningEnabled&&n.activeIndex>0?e.mobile.back():(t=Math.max(0,n.activeIndex-1),i=n.stack[t].pageUrl||n.stack[t].url,n.previousIndex=n.activeIndex,n.activeIndex=t,e.mobile.path.isPath(i)||(i=e.mobile.path.makeUrlAbsolute("#"+i)),e.mobile.changePage(i,{direction:"back",changeHash:!1,fromHashChange:!0})))}}),e.mobile.document.delegate(e.mobile.dialog.prototype.options.initSelector,"pagecreate",function(){e.mobile.dialog.prototype.enhance(this)})}(e,this),function(e){e.mobile.page.prototype.options.backBtnText="Back",e.mobile.page.prototype.options.addBackBtn=!1,e.mobile.page.prototype.options.backBtnTheme=null,e.mobile.page.prototype.options.headerTheme="a",e.mobile.page.prototype.options.footerTheme="a",e.mobile.page.prototype.options.contentTheme=null,e.mobile.document.bind("pagecreate",function(t){var i=e(t.target),n=i.data("mobile-page").options,a=i.jqmData("role"),o=n.theme;e(":jqmData(role='header'), :jqmData(role='footer'), :jqmData(role='content')",i).jqmEnhanceable().each(function(){var t,s,r,l,d=e(this),c=d.jqmData("role"),h=d.jqmData("theme"),u=h||n.contentTheme||"dialog"===a&&o;if(d.addClass("ui-"+c),"header"===c||"footer"===c){var p=h||("header"===c?n.headerTheme:n.footerTheme)||o;d.addClass("ui-bar-"+p).attr("role","header"===c?"banner":"contentinfo"),"header"===c&&(t=d.children("a, button"),s=t.hasClass("ui-btn-left"),r=t.hasClass("ui-btn-right"),s=s||t.eq(0).not(".ui-btn-right").addClass("ui-btn-left").length,r=r||t.eq(1).addClass("ui-btn-right").length),n.addBackBtn&&"header"===c&&e(".ui-page").length>1&&i.jqmData("url")!==e.mobile.path.stripHash(location.hash)&&!s&&(l=e(""+n.backBtnText+"").attr("data-"+e.mobile.ns+"theme",n.backBtnTheme||p).prependTo(d)),d.children("h1, h2, h3, h4, h5, h6").addClass("ui-title").attr({role:"heading","aria-level":"1"})}else"content"===c&&(u&&d.addClass("ui-body-"+u),d.attr("role","main"))})})}(e),function(e,t){function n(e){for(var t;e&&(t="string"==typeof e.className&&e.className+" ",!(t&&t.indexOf("ui-btn ")>-1&&0>t.indexOf("ui-disabled ")));)e=e.parentNode;return e}function a(n,a,o,s,r){var l=e.data(n[0],"buttonElements");n.removeClass(a).addClass(o),l&&(l.bcls=e(i.createElement("div")).addClass(l.bcls+" "+o).removeClass(a).attr("class"),s!==t&&(l.hover=s),l.state=r)}var o=function(e,i){var n=e.getAttribute(i);return"true"===n?!0:"false"===n?!1:null===n?t:n};e.fn.buttonMarkup=function(n){var a,r=this,l="data-"+e.mobile.ns;n=n&&"object"===e.type(n)?n:{};for(var d=0;r.length>d;d++){var c,h,u,p,m,f,g=r.eq(d),b=g[0],v=e.extend({},e.fn.buttonMarkup.defaults,{icon:n.icon!==t?n.icon:o(b,l+"icon"),iconpos:n.iconpos!==t?n.iconpos:o(b,l+"iconpos"),theme:n.theme!==t?n.theme:o(b,l+"theme")||e.mobile.getInheritedTheme(g,"c"),inline:n.inline!==t?n.inline:o(b,l+"inline"),shadow:n.shadow!==t?n.shadow:o(b,l+"shadow"),corners:n.corners!==t?n.corners:o(b,l+"corners"),iconshadow:n.iconshadow!==t?n.iconshadow:o(b,l+"iconshadow"),mini:n.mini!==t?n.mini:o(b,l+"mini")},n),_="ui-btn-inner",C="ui-btn-text",x=!1,y="up";for(a in v)v[a]===t||null===v[a]?g.removeAttr(l+a):b.setAttribute(l+a,v[a]);for("popup"===o(b,l+"rel")&&g.attr("href")&&(b.setAttribute("aria-haspopup",!0),b.setAttribute("aria-owns",g.attr("href"))),f=e.data("INPUT"===b.tagName||"BUTTON"===b.tagName?b.parentNode:b,"buttonElements"),f?(b=f.outer,g=e(b),u=f.inner,p=f.text,e(f.icon).remove(),f.icon=null,x=f.hover,y=f.state):(u=i.createElement(v.wrapperEls),p=i.createElement(v.wrapperEls)),m=v.icon?i.createElement("span"):null,s&&!f&&s(),v.theme||(v.theme=e.mobile.getInheritedTheme(g,"c")),c="ui-btn ",c+=x?"ui-btn-hover-"+v.theme:"",c+=y?" ui-btn-"+y+"-"+v.theme:"",c+=v.shadow?" ui-shadow":"",c+=v.corners?" ui-btn-corner-all":"",v.mini!==t&&(c+=v.mini===!0?" ui-mini":" ui-fullsize"),v.inline!==t&&(c+=v.inline===!0?" ui-btn-inline":" ui-btn-block"),v.icon&&(v.icon="ui-icon-"+v.icon,v.iconpos=v.iconpos||"left",h="ui-icon "+v.icon,v.iconshadow&&(h+=" ui-icon-shadow")),v.iconpos&&(c+=" ui-btn-icon-"+v.iconpos,"notext"!==v.iconpos||g.attr("title")||g.attr("title",g.getEncodedText())),f&&g.removeClass(f.bcls||""),g.removeClass("ui-link").addClass(c),u.className=_,p.className=C,f||u.appendChild(p),m&&(m.className=h,f&&f.icon||(m.innerHTML=" ",u.appendChild(m)));b.firstChild&&!f;)p.appendChild(b.firstChild);f||b.appendChild(u),f={hover:x,state:y,bcls:c,outer:b,inner:u,text:p,icon:m},e.data(b,"buttonElements",f),e.data(u,"buttonElements",f),e.data(p,"buttonElements",f),m&&e.data(m,"buttonElements",f)}return this},e.fn.buttonMarkup.defaults={corners:!0,shadow:!0,iconshadow:!0,wrapperEls:"span"};var s=function(){var i,o,r=e.mobile.buttonMarkup.hoverDelay;e.mobile.document.bind({"vmousedown vmousecancel vmouseup vmouseover vmouseout focus blur scrollstart":function(s){var l,d=e(n(s.target)),c=s.originalEvent&&/^touch/.test(s.originalEvent.type),h=s.type;d.length&&(l=d.attr("data-"+e.mobile.ns+"theme"),"vmousedown"===h?c?i=setTimeout(function(){a(d,"ui-btn-up-"+l,"ui-btn-down-"+l,t,"down")},r):a(d,"ui-btn-up-"+l,"ui-btn-down-"+l,t,"down"):"vmousecancel"===h||"vmouseup"===h?a(d,"ui-btn-down-"+l,"ui-btn-up-"+l,t,"up"):"vmouseover"===h||"focus"===h?c?o=setTimeout(function(){a(d,"ui-btn-up-"+l,"ui-btn-hover-"+l,!0,"")},r):a(d,"ui-btn-up-"+l,"ui-btn-hover-"+l,!0,""):("vmouseout"===h||"blur"===h||"scrollstart"===h)&&(a(d,"ui-btn-hover-"+l+" ui-btn-down-"+l,"ui-btn-up-"+l,!1,"up"),i&&clearTimeout(i),o&&clearTimeout(o)))},"focusin focus":function(t){e(n(t.target)).addClass(e.mobile.focusClass)},"focusout blur":function(t){e(n(t.target)).removeClass(e.mobile.focusClass)}}),s=null};e.mobile.document.bind("pagecreate create",function(t){e(":jqmData(role='button'), .ui-bar > a, .ui-header > a, .ui-footer > a, .ui-bar > :jqmData(role='controlgroup') > a",t.target).jqmEnhanceable().not("button, input, .ui-btn, :jqmData(role='none'), :jqmData(role='nojs')").buttonMarkup()})}(e),function(e,t){e.widget("mobile.collapsible",e.mobile.widget,{options:{expandCueText:" click to expand contents",collapseCueText:" click to collapse contents",collapsed:!0,heading:"h1,h2,h3,h4,h5,h6,legend",collapsedIcon:"plus",expandedIcon:"minus",iconpos:"left",theme:null,contentTheme:null,inset:!0,corners:!0,mini:!1,initSelector:":jqmData(role='collapsible')"},_create:function(){var i=this.element,n=this.options,a=i.addClass("ui-collapsible"),o=i.children(n.heading).first(),s=a.wrapInner("
    ").children(".ui-collapsible-content"),r=i.closest(":jqmData(role='collapsible-set')").addClass("ui-collapsible-set"),l="";o.is("legend")&&(o=e("
    "+o.html()+"
    ").insertBefore(o),o.next().remove()),r.length?(n.theme||(n.theme=r.jqmData("theme")||e.mobile.getInheritedTheme(r,"c")),n.contentTheme||(n.contentTheme=r.jqmData("content-theme")),n.collapsedIcon=i.jqmData("collapsed-icon")||r.jqmData("collapsed-icon")||n.collapsedIcon,n.expandedIcon=i.jqmData("expanded-icon")||r.jqmData("expanded-icon")||n.expandedIcon,n.iconpos=i.jqmData("iconpos")||r.jqmData("iconpos")||n.iconpos,n.inset=r.jqmData("inset")!==t?r.jqmData("inset"):!0,n.corners=!1,n.mini||(n.mini=r.jqmData("mini"))):n.theme||(n.theme=e.mobile.getInheritedTheme(i,"c")),n.inset&&(l+=" ui-collapsible-inset",n.corners&&(l+=" ui-corner-all")),n.contentTheme&&(l+=" ui-collapsible-themed-content",s.addClass("ui-body-"+n.contentTheme)),""!==l&&a.addClass(l),o.insertBefore(s).addClass("ui-collapsible-heading").append("").wrapInner("").find("a").first().buttonMarkup({shadow:!1,corners:!1,iconpos:n.iconpos,icon:n.collapsedIcon,mini:n.mini,theme:n.theme}),a.bind("expand collapse",function(t){if(!t.isDefaultPrevented()){var i=e(this),a="collapse"===t.type;t.preventDefault(),o.toggleClass("ui-collapsible-heading-collapsed",a).find(".ui-collapsible-heading-status").text(a?n.expandCueText:n.collapseCueText).end().find(".ui-icon").toggleClass("ui-icon-"+n.expandedIcon,!a).toggleClass("ui-icon-"+n.collapsedIcon,a||n.expandedIcon===n.collapsedIcon).end().find("a").first().removeClass(e.mobile.activeBtnClass),i.toggleClass("ui-collapsible-collapsed",a),s.toggleClass("ui-collapsible-content-collapsed",a).attr("aria-hidden",a),s.trigger("updatelayout")}}).trigger(n.collapsed?"collapse":"expand"),o.bind("tap",function(){o.find("a").first().addClass(e.mobile.activeBtnClass)}).bind("click",function(e){var t=o.is(".ui-collapsible-heading-collapsed")?"expand":"collapse";a.trigger(t),e.preventDefault(),e.stopPropagation()})}}),e.mobile.document.bind("pagecreate create",function(t){e.mobile.collapsible.prototype.enhanceWithin(t.target)})}(e),function(e){e.mobile.behaviors.addFirstLastClasses={_getVisibles:function(e,t){var i;return t?i=e.not(".ui-screen-hidden"):(i=e.filter(":visible"),0===i.length&&(i=e.not(".ui-screen-hidden"))),i},_addFirstLastClasses:function(e,t,i){e.removeClass("ui-first-child ui-last-child"),t.eq(0).addClass("ui-first-child").end().last().addClass("ui-last-child"),i||this.element.trigger("updatelayout")}}}(e),function(e,t){e.widget("mobile.collapsibleset",e.mobile.widget,e.extend({options:{initSelector:":jqmData(role='collapsible-set')"},_create:function(){var i=this.element.addClass("ui-collapsible-set"),n=this.options;n.theme||(n.theme=e.mobile.getInheritedTheme(i,"c")),n.contentTheme||(n.contentTheme=i.jqmData("content-theme")),n.corners||(n.corners=i.jqmData("corners")),i.jqmData("inset")!==t&&(n.inset=i.jqmData("inset")),n.inset=n.inset!==t?n.inset:!0,n.corners=n.corners!==t?n.corners:!0,n.corners&&n.inset&&i.addClass("ui-corner-all"),i.jqmData("collapsiblebound")||i.jqmData("collapsiblebound",!0).bind("expand",function(t){var i=e(t.target).closest(".ui-collapsible");i.parent().is(":jqmData(role='collapsible-set')")&&i.siblings(".ui-collapsible").trigger("collapse")})},_init:function(){var e=this.element,t=e.children(":jqmData(role='collapsible')"),i=t.filter(":jqmData(collapsed='false')"); this._refresh("true"),i.trigger("expand")},_refresh:function(t){var i=this.element.children(":jqmData(role='collapsible')");e.mobile.collapsible.prototype.enhance(i.not(".ui-collapsible")),this._addFirstLastClasses(i,this._getVisibles(i,t),t)},refresh:function(){this._refresh(!1)}},e.mobile.behaviors.addFirstLastClasses)),e.mobile.document.bind("pagecreate create",function(t){e.mobile.collapsibleset.prototype.enhanceWithin(t.target)})}(e),function(e){e.fn.fieldcontain=function(){return this.addClass("ui-field-contain ui-body ui-br").contents().filter(function(){return 3===this.nodeType&&!/\S/.test(this.nodeValue)}).remove()},e(i).bind("pagecreate create",function(t){e(":jqmData(role='fieldcontain')",t.target).jqmEnhanceable().fieldcontain()})}(e),function(e){e.fn.grid=function(t){return this.each(function(){var i,n=e(this),a=e.extend({grid:null},t),o=n.children(),s={solo:1,a:2,b:3,c:4,d:5},r=a.grid;if(!r)if(5>=o.length)for(var l in s)s[l]===o.length&&(r=l);else r="a",n.addClass("ui-grid-duo");i=s[r],n.addClass("ui-grid-"+r),o.filter(":nth-child("+i+"n+1)").addClass("ui-block-a"),i>1&&o.filter(":nth-child("+i+"n+2)").addClass("ui-block-b"),i>2&&o.filter(":nth-child("+i+"n+3)").addClass("ui-block-c"),i>3&&o.filter(":nth-child("+i+"n+4)").addClass("ui-block-d"),i>4&&o.filter(":nth-child("+i+"n+5)").addClass("ui-block-e")})}}(e),function(e,t){e.widget("mobile.navbar",e.mobile.widget,{options:{iconpos:"top",grid:null,initSelector:":jqmData(role='navbar')"},_create:function(){var n=this.element,a=n.find("a"),o=a.filter(":jqmData(icon)").length?this.options.iconpos:t;n.addClass("ui-navbar ui-mini").attr("role","navigation").find("ul").jqmEnhanceable().grid({grid:this.options.grid}),a.buttonMarkup({corners:!1,shadow:!1,inline:!0,iconpos:o}),n.delegate("a","vclick",function(t){var n=e(t.target).is("a")?e(this):e(this).parent("a");if(!n.is(".ui-disabled, .ui-btn-active")){a.removeClass(e.mobile.activeBtnClass),e(this).addClass(e.mobile.activeBtnClass);var o=e(this);e(i).one("pagehide",function(){o.removeClass(e.mobile.activeBtnClass)})}}),n.closest(".ui-page").bind("pagebeforeshow",function(){a.filter(".ui-state-persist").addClass(e.mobile.activeBtnClass)})}}),e.mobile.document.bind("pagecreate create",function(t){e.mobile.navbar.prototype.enhanceWithin(t.target)})}(e),function(e){var t={};e.widget("mobile.listview",e.mobile.widget,e.extend({options:{theme:null,countTheme:"c",headerTheme:"b",dividerTheme:"b",icon:"arrow-r",splitIcon:"arrow-r",splitTheme:"b",corners:!0,shadow:!0,inset:!1,initSelector:":jqmData(role='listview')"},_create:function(){var e=this,t="";t+=e.options.inset?" ui-listview-inset":"",e.options.inset&&(t+=e.options.corners?" ui-corner-all":"",t+=e.options.shadow?" ui-shadow":""),e.element.addClass(function(e,i){return i+" ui-listview"+t}),e.refresh(!0)},_findFirstElementByTagName:function(e,t,i,n){var a={};for(a[i]=a[n]=!0;e;){if(a[e.nodeName])return e;e=e[t]}return null},_getChildrenByTagName:function(t,i,n){var a=[],o={};for(o[i]=o[n]=!0,t=t.firstChild;t;)o[t.nodeName]&&a.push(t),t=t.nextSibling;return e(a)},_addThumbClasses:function(t){var i,n,a=t.length;for(i=0;a>i;i++)n=e(this._findFirstElementByTagName(t[i].firstChild,"nextSibling","img","IMG")),n.length&&(n.addClass("ui-li-thumb"),e(this._findFirstElementByTagName(n[0].parentNode,"parentNode","li","LI")).addClass(n.is(".ui-li-icon")?"ui-li-has-icon":"ui-li-has-thumb"))},refresh:function(t){this.parentPage=this.element.closest(".ui-page"),this._createSubPages();var n,a,o,s,r,l,d,c,h,u,p,m,f=this.options,g=this.element,b=g.jqmData("dividertheme")||f.dividerTheme,v=g.jqmData("splittheme"),_=g.jqmData("spliticon"),C=g.jqmData("icon"),x=this._getChildrenByTagName(g[0],"li","LI"),y=!!e.nodeName(g[0],"ol"),w=!e.support.cssPseudoElement,T=g.attr("start"),D={};y&&w&&g.find(".ui-li-dec").remove(),y&&(T||0===T?w?d=parseInt(T,10):(c=parseInt(T,10)-1,g.css("counter-reset","listnumbering "+c)):w&&(d=1)),f.theme||(f.theme=e.mobile.getInheritedTheme(this.element,"c"));for(var P=0,k=x.length;k>P;P++){if(n=x.eq(P),a="ui-li",t||!n.hasClass("ui-li")){o=n.jqmData("theme")||f.theme,s=this._getChildrenByTagName(n[0],"a","A");var E="list-divider"===n.jqmData("role");s.length&&!E?(p=n.jqmData("icon"),n.buttonMarkup({wrapperEls:"div",shadow:!1,corners:!1,iconpos:"right",icon:s.length>1||p===!1?!1:p||C||f.icon,theme:o}),p!==!1&&1===s.length&&n.addClass("ui-li-has-arrow"),s.first().removeClass("ui-link").addClass("ui-link-inherit"),s.length>1&&(a+=" ui-li-has-alt",r=s.last(),l=v||r.jqmData("theme")||f.splitTheme,m=r.jqmData("icon"),r.appendTo(n).attr("title",e.trim(r.getEncodedText())).addClass("ui-li-link-alt").empty().buttonMarkup({shadow:!1,corners:!1,theme:o,icon:!1,iconpos:"notext"}).find(".ui-btn-inner").append(e(i.createElement("span")).buttonMarkup({shadow:!0,corners:!0,theme:l,iconpos:"notext",icon:m||p||_||f.splitIcon})))):E?(a+=" ui-li-divider ui-bar-"+(n.jqmData("theme")||b),n.attr("role","heading"),y&&(T||0===T?w?d=parseInt(T,10):(h=parseInt(T,10)-1,n.css("counter-reset","listnumbering "+h)):w&&(d=1))):a+=" ui-li-static ui-btn-up-"+o}y&&w&&0>a.indexOf("ui-li-divider")&&(u=a.indexOf("ui-li-static")>0?n:n.find(".ui-link-inherit"),u.addClass("ui-li-jsnumbering").prepend(""+d++ +". ")),D[a]||(D[a]=[]),D[a].push(n[0])}for(a in D)e(D[a]).addClass(a).children(".ui-btn-inner").addClass(a);g.find("h1, h2, h3, h4, h5, h6").addClass("ui-li-heading").end().find("p, dl").addClass("ui-li-desc").end().find(".ui-li-aside").each(function(){var t=e(this);t.prependTo(t.parent())}).end().find(".ui-li-count").each(function(){e(this).closest("li").addClass("ui-li-has-count")}).addClass("ui-btn-up-"+(g.jqmData("counttheme")||this.options.countTheme)+" ui-btn-corner-all"),this._addThumbClasses(x),this._addThumbClasses(g.find(".ui-link-inherit")),this._addFirstLastClasses(x,this._getVisibles(x,t),t),this._trigger("afterrefresh")},_idStringEscape:function(e){return e.replace(/[^a-zA-Z0-9]/g,"-")},_createSubPages:function(){var i,a=this.element,o=a.closest(".ui-page"),s=o.jqmData("url"),r=s||o[0][e.expando],l=a.attr("id"),d=this.options,c="data-"+e.mobile.ns,h=this,u=o.find(":jqmData(role='footer')").jqmData("id");if(t[r]===n&&(t[r]=-1),l=l||++t[r],e(a.find("li>ul, li>ol").toArray().reverse()).each(function(t){var n,o,r=e(this),h=r.attr("id")||l+"-"+t,p=r.parent(),m=e(r.prevAll().toArray().reverse()),f=m.length?m:e(""+e.trim(p.contents()[0].nodeValue)+""),g=f.first().getEncodedText(),b=(s||"")+"&"+e.mobile.subPageUrlKey+"="+h,v=r.jqmData("theme")||d.theme,_=r.jqmData("counttheme")||a.jqmData("counttheme")||d.countTheme;i=!0,n=r.detach().wrap("
    ").parent().before("
    "+g+"
    ").after(u?e("
    "):"").parent().appendTo(e.mobile.pageContainer),n.page(),o=p.find("a:first"),o.length||(o=e("").html(f||g).prependTo(p.empty())),o.attr("href","#"+b)}).listview(),i&&o.is(":jqmData(external-page='true')")&&o.data("mobile-page").options.domCache===!1){var p=function(t,i){var n,a=i.nextPage,r=new e.Event("pageremove");i.nextPage&&(n=a.jqmData("url"),0!==n.indexOf(s+"&"+e.mobile.subPageUrlKey)&&(h.childPages().remove(),o.trigger(r),r.isDefaultPrevented()||o.removeWithDependents()))};o.unbind("pagehide.remove").bind("pagehide.remove",p)}},childPages:function(){var t=this.parentPage.jqmData("url");return e(":jqmData(url^='"+t+"&"+e.mobile.subPageUrlKey+"')")}},e.mobile.behaviors.addFirstLastClasses)),e.mobile.document.bind("pagecreate create",function(t){e.mobile.listview.prototype.enhanceWithin(t.target)})}(e),function(e){var t=e("meta[name=viewport]"),i=t.attr("content"),n=i+",maximum-scale=1, user-scalable=no",a=i+",maximum-scale=10, user-scalable=yes",o=/(user-scalable[\s]*=[\s]*no)|(maximum-scale[\s]*=[\s]*1)[$,\s]/.test(i);e.mobile.zoom=e.extend({},{enabled:!o,locked:!1,disable:function(i){o||e.mobile.zoom.locked||(t.attr("content",n),e.mobile.zoom.enabled=!1,e.mobile.zoom.locked=i||!1)},enable:function(i){o||e.mobile.zoom.locked&&i!==!0||(t.attr("content",a),e.mobile.zoom.enabled=!0,e.mobile.zoom.locked=!1)},restore:function(){o||(t.attr("content",i),e.mobile.zoom.enabled=!0)}})}(e),function(e){e.widget("mobile.textinput",e.mobile.widget,{options:{theme:null,mini:!1,preventFocusZoom:/iPhone|iPad|iPod/.test(navigator.platform)&&navigator.userAgent.indexOf("AppleWebKit")>-1,initSelector:"input[type='text'], input[type='search'], :jqmData(type='search'), input[type='number'], :jqmData(type='number'), input[type='password'], input[type='email'], input[type='url'], input[type='tel'], textarea, input[type='time'], input[type='date'], input[type='month'], input[type='week'], input[type='datetime'], input[type='datetime-local'], input[type='color'], input:not([type]), input[type='file']",clearBtn:!1,clearSearchButtonText:null,clearBtnText:"clear text",disabled:!1},_create:function(){function t(){setTimeout(function(){a.toggleClass("ui-input-clear-hidden",!s.val())},0)}var i,a,o=this,s=this.element,r=this.options,l=r.theme||e.mobile.getInheritedTheme(this.element,"c"),d=" ui-body-"+l,c=r.mini?" ui-mini":"",h=s.is("[type='search'], :jqmData(type='search')"),u=r.clearSearchButtonText||r.clearBtnText,p=s.is("textarea, :jqmData(type='range')"),m=!!r.clearBtn&&!p,f=s.is("input")&&!s.is(":jqmData(type='range')");if(e("label[for='"+s.attr("id")+"']").addClass("ui-input-text"),i=s.addClass("ui-input-text ui-body-"+l),s[0].autocorrect===n||e.support.touchOverflow||(s[0].setAttribute("autocorrect","off"),s[0].setAttribute("autocomplete","off")),h?i=s.wrap("").parent():f&&(i=s.wrap("
    ").parent()),m||h?(a=e("
    "+u+"").bind("click",function(e){s.val("").focus().trigger("change"),a.addClass("ui-input-clear-hidden"),e.preventDefault()}).appendTo(i).buttonMarkup({icon:"delete",iconpos:"notext",corners:!0,shadow:!0,mini:r.mini}),h||i.addClass("ui-input-has-clear"),t(),s.bind("paste cut keyup input focus change blur",t)):f||h||s.addClass("ui-corner-all ui-shadow-inset"+d+c),s.focus(function(){r.preventFocusZoom&&e.mobile.zoom.disable(!0),i.addClass(e.mobile.focusClass)}).blur(function(){i.removeClass(e.mobile.focusClass),r.preventFocusZoom&&e.mobile.zoom.enable(!0)}),s.is("textarea")){var g,b=15,v=100;this._keyup=function(){var e=s[0].scrollHeight,t=s[0].clientHeight;if(e>t){var i=parseFloat(s.css("padding-top")),n=parseFloat(s.css("padding-bottom")),a=i+n;s.height(e-a+b)}},s.on("keyup change input paste",function(){clearTimeout(g),g=setTimeout(o._keyup,v)}),this._on(!0,e.mobile.document,{pagechange:"_keyup"}),e.trim(s.val())&&this._on(!0,e.mobile.window,{load:"_keyup"})}s.attr("disabled")&&this.disable()},disable:function(){var e,t=this.element.is("[type='search'], :jqmData(type='search')"),i=this.element.is("input")&&!this.element.is(":jqmData(type='range')"),n=this.element.attr("disabled",!0)&&(i||t);return e=n?this.element.parent():this.element,e.addClass("ui-disabled"),this._setOption("disabled",!0)},enable:function(){var e,t=this.element.is("[type='search'], :jqmData(type='search')"),i=this.element.is("input")&&!this.element.is(":jqmData(type='range')"),n=this.element.attr("disabled",!1)&&(i||t);return e=n?this.element.parent():this.element,e.removeClass("ui-disabled"),this._setOption("disabled",!1)}}),e.mobile.document.bind("pagecreate create",function(t){e.mobile.textinput.prototype.enhanceWithin(t.target,!0)})}(e),function(e){e.mobile.listview.prototype.options.filter=!1,e.mobile.listview.prototype.options.filterPlaceholder="Filter items...",e.mobile.listview.prototype.options.filterTheme="c",e.mobile.listview.prototype.options.filterReveal=!1;var t=function(e,t){return-1===(""+e).toLowerCase().indexOf(t)};e.mobile.listview.prototype.options.filterCallback=t,e.mobile.document.delegate("ul, ol","listviewcreate",function(){var i=e(this),n=i.data("mobile-listview");if(n&&n.options.filter){n.options.filterReveal&&i.children().addClass("ui-screen-hidden");var a=e("
    ",{"class":"ui-listview-filter ui-bar-"+n.options.filterTheme,role:"search"}).submit(function(e){e.preventDefault(),s.blur()}),o=function(){var a,o=e(this),s=this.value.toLowerCase(),r=null,l=i.children(),d=o.jqmData("lastval")+"",c=!1,h="",u=n.options.filterCallback!==t;if(!d||d!==s){if(n._trigger("beforefilter","beforefilter",{input:this}),o.jqmData("lastval",s),u||s.length=0;p--)a=e(r[p]),h=a.jqmData("filtertext")||a.text(),a.is("li:jqmData(role=list-divider)")?(a.toggleClass("ui-filter-hidequeue",!c),c=!1):n.options.filterCallback(h,s,a)?a.toggleClass("ui-filter-hidequeue",!0):c=!0;r.filter(":not(.ui-filter-hidequeue)").toggleClass("ui-screen-hidden",!1),r.filter(".ui-filter-hidequeue").toggleClass("ui-screen-hidden",!0).toggleClass("ui-filter-hidequeue",!1)}else r.toggleClass("ui-screen-hidden",!!n.options.filterReveal);n._addFirstLastClasses(l,n._getVisibles(l,!1),!1)}},s=e("",{placeholder:n.options.filterPlaceholder}).attr("data-"+e.mobile.ns+"type","search").jqmData("lastval","").bind("keyup change input",o).appendTo(a).textinput();n.options.inset&&a.addClass("ui-listview-filter-inset"),a.bind("submit",function(){return!1}).insertBefore(i)}})}(e),function(e){e.mobile.listview.prototype.options.autodividers=!1,e.mobile.listview.prototype.options.autodividersSelector=function(t){var i=e.trim(t.text())||null;return i?i=i.slice(0,1).toUpperCase():null},e.mobile.document.delegate("ul,ol","listviewcreate",function(){var t=e(this),n=t.data("mobile-listview");if(n&&n.options.autodividers){var a=function(){t.find("li:jqmData(role='list-divider')").remove();for(var a,o,s=t.find("li"),r=null,l=0;s.length>l;l++){if(a=s[l],o=n.options.autodividersSelector(e(a)),o&&r!==o){var d=i.createElement("li");d.appendChild(i.createTextNode(o)),d.setAttribute("data-"+e.mobile.ns+"role","list-divider"),a.parentNode.insertBefore(d,a)}r=o}},o=function(){t.unbind("listviewafterrefresh",o),a(),n.refresh(),t.bind("listviewafterrefresh",o)};o()}})}(e),function(e){e(i).bind("pagecreate create",function(t){e(":jqmData(role='nojs')",t.target).addClass("ui-nojs")})}(e),function(e){e.mobile.behaviors.formReset={_handleFormReset:function(){this._on(this.element.closest("form"),{reset:function(){this._delay("_reset")}})}}}(e),function(e){e.widget("mobile.checkboxradio",e.mobile.widget,e.extend({options:{theme:null,mini:!1,initSelector:"input[type='checkbox'],input[type='radio']"},_create:function(){var t=this,a=this.element,o=this.options,s=function(e,t){return e.jqmData(t)||e.closest("form, fieldset").jqmData(t)},r=e(a).closest("label"),l=r.length?r:e(a).closest("form, fieldset, :jqmData(role='page'), :jqmData(role='dialog')").find("label").filter("[for='"+a[0].id+"']").first(),d=a[0].type,c=s(a,"mini")||o.mini,h=d+"-on",u=d+"-off",p=s(a,"iconpos"),m="ui-"+h,f="ui-"+u;if("checkbox"===d||"radio"===d){e.extend(this,{label:l,inputtype:d,checkedClass:m,uncheckedClass:f,checkedicon:h,uncheckedicon:u}),o.theme||(o.theme=e.mobile.getInheritedTheme(this.element,"c")),l.buttonMarkup({theme:o.theme,icon:u,shadow:!1,mini:c,iconpos:p});var g=i.createElement("div");g.className="ui-"+d,a.add(l).wrapAll(g),l.bind({vmouseover:function(t){e(this).parent().is(".ui-disabled")&&t.stopPropagation()},vclick:function(e){return a.is(":disabled")?(e.preventDefault(),n):(t._cacheVals(),a.prop("checked","radio"===d&&!0||!a.prop("checked")),a.triggerHandler("click"),t._getInputSet().not(a).prop("checked",!1),t._updateAll(),!1)}}),a.bind({vmousedown:function(){t._cacheVals()},vclick:function(){var i=e(this);i.is(":checked")?(i.prop("checked",!0),t._getInputSet().not(i).prop("checked",!1)):i.prop("checked",!1),t._updateAll()},focus:function(){l.addClass(e.mobile.focusClass)},blur:function(){l.removeClass(e.mobile.focusClass)}}),this._handleFormReset(),this.refresh()}},_cacheVals:function(){this._getInputSet().each(function(){e(this).jqmData("cacheVal",this.checked)})},_getInputSet:function(){return"checkbox"===this.inputtype?this.element:this.element.closest("form, :jqmData(role='page'), :jqmData(role='dialog')").find("input[name='"+this.element[0].name+"'][type='"+this.inputtype+"']")},_updateAll:function(){var t=this;this._getInputSet().each(function(){var i=e(this);(this.checked||"checkbox"===t.inputtype)&&i.trigger("change")}).checkboxradio("refresh")},_reset:function(){this.refresh()},refresh:function(){var t=this.element[0],i=" "+e.mobile.activeBtnClass,n=this.checkedClass+(this.element.parents(".ui-controlgroup-horizontal").length?i:""),a=this.label;t.checked?a.removeClass(this.uncheckedClass+i).addClass(n).buttonMarkup({icon:this.checkedicon}):a.removeClass(n).addClass(this.uncheckedClass).buttonMarkup({icon:this.uncheckedicon}),t.disabled?this.disable():this.enable()},disable:function(){this.element.prop("disabled",!0).parent().addClass("ui-disabled")},enable:function(){this.element.prop("disabled",!1).parent().removeClass("ui-disabled")}},e.mobile.behaviors.formReset)),e.mobile.document.bind("pagecreate create",function(t){e.mobile.checkboxradio.prototype.enhanceWithin(t.target,!0)})}(e),function(e){e.widget("mobile.button",e.mobile.widget,{options:{theme:null,icon:null,iconpos:null,corners:!0,shadow:!0,iconshadow:!0,inline:null,mini:null,initSelector:"button, [type='button'], [type='submit'], [type='reset']"},_create:function(){var t,i=this.element,a=function(e){var t,i={};for(t in e)null!==e[t]&&"initSelector"!==t&&(i[t]=e[t]);return i}(this.options),o="";return"A"===i[0].tagName?(i.hasClass("ui-btn")||i.buttonMarkup(),n):(this.options.theme||(this.options.theme=e.mobile.getInheritedTheme(this.element,"c")),~i[0].className.indexOf("ui-btn-left")&&(o="ui-btn-left"),~i[0].className.indexOf("ui-btn-right")&&(o="ui-btn-right"),("submit"===i.attr("type")||"reset"===i.attr("type"))&&(o?o+=" ui-submit":o="ui-submit"),e("label[for='"+i.attr("id")+"']").addClass("ui-submit"),this.button=e("
    ")[i.html()?"html":"text"](i.html()||i.val()).insertBefore(i).buttonMarkup(a).addClass(o).append(i.addClass("ui-btn-hidden")),t=this.button,i.bind({focus:function(){t.addClass(e.mobile.focusClass)},blur:function(){t.removeClass(e.mobile.focusClass)}}),this.refresh(),n)},_setOption:function(t,i){var n={};n[t]=i,"initSelector"!==t&&(this.button.buttonMarkup(n),this.element.attr("data-"+(e.mobile.ns||"")+t.replace(/([A-Z])/,"-$1").toLowerCase(),i)),this._super("_setOption",t,i)},enable:function(){return this.element.attr("disabled",!1),this.button.removeClass("ui-disabled").attr("aria-disabled",!1),this._setOption("disabled",!1)},disable:function(){return this.element.attr("disabled",!0),this.button.addClass("ui-disabled").attr("aria-disabled",!0),this._setOption("disabled",!0)},refresh:function(){var t=this.element;t.prop("disabled")?this.disable():this.enable(),e(this.button.data("buttonElements").text)[t.html()?"html":"text"](t.html()||t.val())}}),e.mobile.document.bind("pagecreate create",function(t){e.mobile.button.prototype.enhanceWithin(t.target,!0)})}(e),function(e,n){e.widget("mobile.slider",e.mobile.widget,e.extend({widgetEventPrefix:"slide",options:{theme:null,trackTheme:null,disabled:!1,initSelector:"input[type='range'], :jqmData(type='range'), :jqmData(role='slider')",mini:!1,highlight:!1},_create:function(){var a,o,s=this,r=this.element,l=e.mobile.getInheritedTheme(r,"c"),d=this.options.theme||l,c=this.options.trackTheme||l,h=r[0].nodeName.toLowerCase(),u=(this.isToggleSwitch="select"===h,r.parent().is(":jqmData(role='rangeslider')")),p=this.isToggleSwitch?"ui-slider-switch":"",m=r.attr("id"),f=e("[for='"+m+"']"),g=f.attr("id")||m+"-label",b=f.attr("id",g),v=this.isToggleSwitch?0:parseFloat(r.attr("min")),_=this.isToggleSwitch?r.find("option").length-1:parseFloat(r.attr("max")),C=t.parseFloat(r.attr("step")||1),x=this.options.mini||r.jqmData("mini")?" ui-mini":"",y=i.createElement("a"),w=e(y),T=i.createElement("div"),D=e(T),P=this.options.highlight&&!this.isToggleSwitch?function(){var t=i.createElement("div");return t.className="ui-slider-bg "+e.mobile.activeBtnClass+" ui-btn-corner-all",e(t).prependTo(D)}():!1;if(y.setAttribute("href","#"),T.setAttribute("role","application"),T.className=[this.isToggleSwitch?"ui-slider ":"ui-slider-track ",p," ui-btn-down-",c," ui-btn-corner-all",x].join(""),y.className="ui-slider-handle",T.appendChild(y),w.buttonMarkup({corners:!0,theme:d,shadow:!0}).attr({role:"slider","aria-valuemin":v,"aria-valuemax":_,"aria-valuenow":this._value(),"aria-valuetext":this._value(),title:this._value(),"aria-labelledby":g}),e.extend(this,{slider:D,handle:w,type:h,step:C,max:_,min:v,valuebg:P,isRangeslider:u,dragging:!1,beforeStart:null,userModified:!1,mouseMoved:!1}),this.isToggleSwitch){o=i.createElement("div"),o.className="ui-slider-inneroffset";for(var k=0,E=T.childNodes.length;E>k;k++)o.appendChild(T.childNodes[k]);T.appendChild(o),w.addClass("ui-slider-handle-snapping"),a=r.find("option");for(var q=0,j=a.length;j>q;q++){var S=q?"a":"b",A=q?" "+e.mobile.activeBtnClass:" ui-btn-down-"+c,N=(i.createElement("div"),i.createElement("span"));N.className=["ui-slider-label ui-slider-label-",S,A," ui-btn-corner-all"].join(""),N.setAttribute("role","img"),N.appendChild(i.createTextNode(a[q].innerHTML)),e(N).prependTo(D)}s._labels=e(".ui-slider-label",D)}b.addClass("ui-slider"),r.addClass(this.isToggleSwitch?"ui-slider-switch":"ui-slider-input"),this._on(r,{change:"_controlChange",keyup:"_controlKeyup",blur:"_controlBlur",vmouseup:"_controlVMouseUp"}),D.bind("vmousedown",e.proxy(this._sliderVMouseDown,this)).bind("vclick",!1),this._on(i,{vmousemove:"_preventDocumentDrag"}),this._on(D.add(i),{vmouseup:"_sliderVMouseUp"}),D.insertAfter(r),this.isToggleSwitch||u||(o=this.options.mini?"
    ":"
    ",r.add(D).wrapAll(o)),this.isToggleSwitch&&this.handle.bind({focus:function(){D.addClass(e.mobile.focusClass)},blur:function(){D.removeClass(e.mobile.focusClass)}}),this._on(this.handle,{vmousedown:"_handleVMouseDown",keydown:"_handleKeydown",keyup:"_handleKeyup"}),this.handle.bind("vclick",!1),this._handleFormReset(),this.refresh(n,n,!0)},_controlChange:function(e){return this._trigger("controlchange",e)===!1?!1:(this.mouseMoved||this.refresh(this._value(),!0),n)},_controlKeyup:function(){this.refresh(this._value(),!0,!0)},_controlBlur:function(){this.refresh(this._value(),!0)},_controlVMouseUp:function(){this._checkedRefresh()},_handleVMouseDown:function(){this.handle.focus()},_handleKeydown:function(t){var i=this._value();if(!this.options.disabled){switch(t.keyCode){case e.mobile.keyCode.HOME:case e.mobile.keyCode.END:case e.mobile.keyCode.PAGE_UP:case e.mobile.keyCode.PAGE_DOWN:case e.mobile.keyCode.UP:case e.mobile.keyCode.RIGHT:case e.mobile.keyCode.DOWN:case e.mobile.keyCode.LEFT:t.preventDefault(),this._keySliding||(this._keySliding=!0,this.handle.addClass("ui-state-active"))}switch(t.keyCode){case e.mobile.keyCode.HOME:this.refresh(this.min);break;case e.mobile.keyCode.END:this.refresh(this.max);break;case e.mobile.keyCode.PAGE_UP:case e.mobile.keyCode.UP:case e.mobile.keyCode.RIGHT:this.refresh(i+this.step);break;case e.mobile.keyCode.PAGE_DOWN:case e.mobile.keyCode.DOWN:case e.mobile.keyCode.LEFT:this.refresh(i-this.step)}}},_handleKeyup:function(){this._keySliding&&(this._keySliding=!1,this.handle.removeClass("ui-state-active"))},_sliderVMouseDown:function(e){return this.options.disabled||1!==e.which&&0!==e.which?!1:this._trigger("beforestart",e)===!1?!1:(this.dragging=!0,this.userModified=!1,this.mouseMoved=!1,this.isToggleSwitch&&(this.beforeStart=this.element[0].selectedIndex),this.refresh(e),this._trigger("start"),!1)},_sliderVMouseUp:function(){return this.dragging?(this.dragging=!1,this.isToggleSwitch&&(this.handle.addClass("ui-slider-handle-snapping"),this.mouseMoved?this.userModified?this.refresh(0===this.beforeStart?1:0):this.refresh(this.beforeStart):this.refresh(0===this.beforeStart?1:0)),this.mouseMoved=!1,this._trigger("stop"),!1):n},_preventDocumentDrag:function(e){return this._trigger("drag",e)===!1?!1:this.dragging&&!this.options.disabled?(this.mouseMoved=!0,this.isToggleSwitch&&this.handle.removeClass("ui-slider-handle-snapping"),this.refresh(e),this.userModified=this.beforeStart!==this.element[0].selectedIndex,!1):n},_checkedRefresh:function(){this.value!==this._value()&&this.refresh(this._value())},_value:function(){return this.isToggleSwitch?this.element[0].selectedIndex:parseFloat(this.element.val())},_reset:function(){this.refresh(n,!1,!0)},refresh:function(t,a,o){var s,r,l,d,c=this,h=e.mobile.getInheritedTheme(this.element,"c"),u=this.options.theme||h,p=this.options.trackTheme||h;c.slider[0].className=[this.isToggleSwitch?"ui-slider ui-slider-switch":"ui-slider-track"," ui-btn-down-"+p," ui-btn-corner-all",this.options.mini?" ui-mini":""].join(""),(this.options.disabled||this.element.attr("disabled"))&&this.disable(),this.value=this._value(),this.options.highlight&&!this.isToggleSwitch&&0===this.slider.find(".ui-slider-bg").length&&(this.valuebg=function(){var t=i.createElement("div");return t.className="ui-slider-bg "+e.mobile.activeBtnClass+" ui-btn-corner-all",e(t).prependTo(c.slider)}()),this.handle.buttonMarkup({corners:!0,theme:u,shadow:!0});var m,f,g=this.element,b=!this.isToggleSwitch,v=b?[]:g.find("option"),_=b?parseFloat(g.attr("min")):0,C=b?parseFloat(g.attr("max")):v.length-1,x=b&&parseFloat(g.attr("step"))>0?parseFloat(g.attr("step")):1;if("object"==typeof t){if(l=t,d=8,s=this.slider.offset().left,r=this.slider.width(),m=r/((C-_)/x),!this.dragging||s-d>l.pageX||l.pageX>s+r+d)return;f=m>1?100*((l.pageX-s)/r):Math.round(100*((l.pageX-s)/r))}else null==t&&(t=b?parseFloat(g.val()||0):g[0].selectedIndex),f=100*((parseFloat(t)-_)/(C-_));if(!isNaN(f)){var y=f/100*(C-_)+_,w=(y-_)%x,T=y-w;2*Math.abs(w)>=x&&(T+=w>0?x:-x);var D=100/((C-_)/x);if(y=parseFloat(T.toFixed(5)),m===n&&(m=r/((C-_)/x)),m>1&&b&&(f=(y-_)*D*(1/x)),0>f&&(f=0),f>100&&(f=100),_>y&&(y=_),y>C&&(y=C),this.handle.css("left",f+"%"),this.handle[0].setAttribute("aria-valuenow",b?y:v.eq(y).attr("value")),this.handle[0].setAttribute("aria-valuetext",b?y:v.eq(y).getEncodedText()),this.handle[0].setAttribute("title",b?y:v.eq(y).getEncodedText()),this.valuebg&&this.valuebg.css("width",f+"%"),this._labels){var P=100*(this.handle.width()/this.slider.width()),k=f&&P+(100-P)*f/100,E=100===f?0:Math.min(P+100-k,100);this._labels.each(function(){var t=e(this).is(".ui-slider-label-a");e(this).width((t?k:E)+"%")})}if(!o){var q=!1;if(b?(q=g.val()!==y,g.val(y)):(q=g[0].selectedIndex!==y,g[0].selectedIndex=y),this._trigger("beforechange",t)===!1)return!1;!a&&q&&g.trigger("change")}}},enable:function(){return this.element.attr("disabled",!1),this.slider.removeClass("ui-disabled").attr("aria-disabled",!1),this._setOption("disabled",!1)},disable:function(){return this.element.attr("disabled",!0),this.slider.addClass("ui-disabled").attr("aria-disabled",!0),this._setOption("disabled",!0)}},e.mobile.behaviors.formReset)),e.mobile.document.bind("pagecreate create",function(t){e.mobile.slider.prototype.enhanceWithin(t.target,!0)})}(e),function(e){e.widget("mobile.rangeslider",e.mobile.widget,{options:{theme:null,trackTheme:null,disabled:!1,initSelector:":jqmData(role='rangeslider')",mini:!1,highlight:!0},_create:function(){var t,i=this.element,n=this.options.mini?"ui-rangeslider ui-mini":"ui-rangeslider",a=i.find("input").first(),o=i.find("input").last(),s=i.find("label").first(),r=e.data(a.get(0),"mobileSlider").slider,l=e.data(o.get(0),"mobileSlider").slider,d=e.data(a.get(0),"mobileSlider").handle,c=e('
    ').appendTo(i);i.find("label").length>1&&(t=i.find("label").last().hide()),a.addClass("ui-rangeslider-first"),o.addClass("ui-rangeslider-last"),i.addClass(n),r.appendTo(c),l.appendTo(c),s.prependTo(i),d.prependTo(l),e.extend(this,{_inputFirst:a,_inputLast:o,_sliderFirst:r,_sliderLast:l,_targetVal:null,_sliderTarget:!1,_sliders:c,_proxy:!1}),this.refresh(),this._on(this.element.find("input.ui-slider-input"),{slidebeforestart:"_slidebeforestart",slidestop:"_slidestop",slidedrag:"_slidedrag",slidebeforechange:"_change",blur:"_change",keyup:"_change"}),this._on({mousedown:"_change"}),this._on(this.element.closest("form"),{reset:"_handleReset"}),this._on(d,{vmousedown:"_dragFirstHandle"})},_handleReset:function(){var e=this;setTimeout(function(){e._updateHighlight()},0)},_dragFirstHandle:function(t){return e.data(this._inputFirst.get(0),"mobileSlider").dragging=!0,e.data(this._inputFirst.get(0),"mobileSlider").refresh(t),!1},_slidedrag:function(t){var i=e(t.target).is(this._inputFirst),a=i?this._inputLast:this._inputFirst;return this._sliderTarget=!1,"first"===this._proxy&&i||"last"===this._proxy&&!i?(e.data(a.get(0),"mobileSlider").dragging=!0,e.data(a.get(0),"mobileSlider").refresh(t),!1):n},_slidestop:function(t){var i=e(t.target).is(this._inputFirst);this._proxy=!1,this.element.find("input").trigger("vmouseup"),this._sliderFirst.css("z-index",i?1:"")},_slidebeforestart:function(t){this._sliderTarget=!1,e(t.originalEvent.target).hasClass("ui-slider-track")&&(this._sliderTarget=!0,this._targetVal=e(t.target).val())},_setOption:function(e){this._superApply(e),this.refresh()},refresh:function(){var e=this.element,t=this.options;e.find("input").slider({theme:t.theme,trackTheme:t.trackTheme,disabled:t.disabled,mini:t.mini,highlight:t.highlight}).slider("refresh"),this._updateHighlight()},_change:function(t){if("keyup"===t.type)return this._updateHighlight(),!1;var i=this,a=parseFloat(this._inputFirst.val(),10),o=parseFloat(this._inputLast.val(),10),s=e(t.target).hasClass("ui-rangeslider-first"),r=s?this._inputFirst:this._inputLast,l=s?this._inputLast:this._inputFirst;if(this._inputFirst.val()>this._inputLast.val()&&"mousedown"===t.type&&!e(t.target).hasClass("ui-slider-handle"))r.blur();else if("mousedown"===t.type)return;return a>o&&!this._sliderTarget?(r.val(s?o:a).slider("refresh"),this._trigger("normalize")):a>o&&(r.val(this._targetVal).slider("refresh"),setTimeout(function(){l.val(s?a:o).slider("refresh"),e.data(l.get(0),"mobileSlider").handle.focus(),i._sliderFirst.css("z-index",s?"":1),i._trigger("normalize")},0),this._proxy=s?"first":"last"),a===o?(e.data(r.get(0),"mobileSlider").handle.css("z-index",1),e.data(l.get(0),"mobileSlider").handle.css("z-index",0)):(e.data(l.get(0),"mobileSlider").handle.css("z-index",""),e.data(r.get(0),"mobileSlider").handle.css("z-index","")),this._updateHighlight(),a>=o?!1:n},_updateHighlight:function(){var t=parseInt(e.data(this._inputFirst.get(0),"mobileSlider").handle.get(0).style.left,10),i=parseInt(e.data(this._inputLast.get(0),"mobileSlider").handle.get(0).style.left,10),n=i-t;this.element.find(".ui-slider-bg").css({"margin-left":t+"%",width:n+"%"})},_destroy:function(){this.element.removeClass("ui-rangeslider ui-mini").find("label").show(),this._inputFirst.after(this._sliderFirst),this._inputLast.after(this._sliderLast),this._sliders.remove(),this.element.find("input").removeClass("ui-rangeslider-first ui-rangeslider-last").slider("destroy")}}),e.widget("mobile.rangeslider",e.mobile.rangeslider,e.mobile.behaviors.formReset),e(i).bind("pagecreate create",function(t){e.mobile.rangeslider.prototype.enhanceWithin(t.target,!0)})}(e),function(e){e.widget("mobile.selectmenu",e.mobile.widget,e.extend({options:{theme:null,disabled:!1,icon:"arrow-d",iconpos:"right",inline:!1,corners:!0,shadow:!0,iconshadow:!0,overlayTheme:"a",dividerTheme:"b",hidePlaceholderMenuItems:!0,closeText:"Close",nativeMenu:!0,preventFocusZoom:/iPhone|iPad|iPod/.test(navigator.platform)&&navigator.userAgent.indexOf("AppleWebKit")>-1,initSelector:"select:not( :jqmData(role='slider') )",mini:!1},_button:function(){return e("
    ") },_setDisabled:function(e){return this.element.attr("disabled",e),this.button.attr("aria-disabled",e),this._setOption("disabled",e)},_focusButton:function(){var e=this;setTimeout(function(){e.button.focus()},40)},_selectOptions:function(){return this.select.find("option")},_preExtension:function(){var t="";~this.element[0].className.indexOf("ui-btn-left")&&(t=" ui-btn-left"),~this.element[0].className.indexOf("ui-btn-right")&&(t=" ui-btn-right"),this.select=this.element.removeClass("ui-btn-left ui-btn-right").wrap("
    "),this.selectID=this.select.attr("id"),this.label=e("label[for='"+this.selectID+"']").addClass("ui-select"),this.isMultiple=this.select[0].multiple,this.options.theme||(this.options.theme=e.mobile.getInheritedTheme(this.select,"c"))},_destroy:function(){var e=this.element.parents(".ui-select");e.length>0&&(e.is(".ui-btn-left, .ui-btn-right")&&this.element.addClass(e.is(".ui-btn-left")?"ui-btn-left":"ui-btn-right"),this.element.insertAfter(e),e.remove())},_create:function(){this._preExtension(),this._trigger("beforeCreate"),this.button=this._button();var i=this,n=this.options,a=n.inline||this.select.jqmData("inline"),o=n.mini||this.select.jqmData("mini"),s=n.icon?n.iconpos||this.select.jqmData("iconpos"):!1,r=(-1===this.select[0].selectedIndex?0:this.select[0].selectedIndex,this.button.insertBefore(this.select).buttonMarkup({theme:n.theme,icon:n.icon,iconpos:s,inline:a,corners:n.corners,shadow:n.shadow,iconshadow:n.iconshadow,mini:o}));this.setButtonText(),n.nativeMenu&&t.opera&&t.opera.version&&r.addClass("ui-select-nativeonly"),this.isMultiple&&(this.buttonCount=e("").addClass("ui-li-count ui-btn-up-c ui-btn-corner-all").hide().appendTo(r.addClass("ui-li-has-count"))),(n.disabled||this.element.attr("disabled"))&&this.disable(),this.select.change(function(){i.refresh(),n.nativeMenu&&this.blur()}),this._handleFormReset(),this.build()},build:function(){var t=this;this.select.appendTo(t.button).bind("vmousedown",function(){t.button.addClass(e.mobile.activeBtnClass)}).bind("focus",function(){t.button.addClass(e.mobile.focusClass)}).bind("blur",function(){t.button.removeClass(e.mobile.focusClass)}).bind("focus vmouseover",function(){t.button.trigger("vmouseover")}).bind("vmousemove",function(){t.button.removeClass(e.mobile.activeBtnClass)}).bind("change blur vmouseout",function(){t.button.trigger("vmouseout").removeClass(e.mobile.activeBtnClass)}).bind("change blur",function(){t.button.removeClass("ui-btn-down-"+t.options.theme)}),t.button.bind("vmousedown",function(){t.options.preventFocusZoom&&e.mobile.zoom.disable(!0)}),t.label.bind("click focus",function(){t.options.preventFocusZoom&&e.mobile.zoom.disable(!0)}),t.select.bind("focus",function(){t.options.preventFocusZoom&&e.mobile.zoom.disable(!0)}),t.button.bind("mouseup",function(){t.options.preventFocusZoom&&setTimeout(function(){e.mobile.zoom.enable(!0)},0)}),t.select.bind("blur",function(){t.options.preventFocusZoom&&e.mobile.zoom.enable(!0)})},selected:function(){return this._selectOptions().filter(":selected")},selectedIndices:function(){var e=this;return this.selected().map(function(){return e._selectOptions().index(this)}).get()},setButtonText:function(){var t=this,n=this.selected(),a=this.placeholder,o=e(i.createElement("span"));this.button.find(".ui-btn-text").html(function(){return a=n.length?n.map(function(){return e(this).text()}).get().join(", "):t.placeholder,o.text(a).addClass(t.select.attr("class")).addClass(n.attr("class"))})},setButtonCount:function(){var e=this.selected();this.isMultiple&&this.buttonCount[e.length>1?"show":"hide"]().text(e.length)},_reset:function(){this.refresh()},refresh:function(){this.setButtonText(),this.setButtonCount()},open:e.noop,close:e.noop,disable:function(){this._setDisabled(!0),this.button.addClass("ui-disabled")},enable:function(){this._setDisabled(!1),this.button.removeClass("ui-disabled")}},e.mobile.behaviors.formReset)),e.mobile.document.bind("pagecreate create",function(t){e.mobile.selectmenu.prototype.enhanceWithin(t.target,!0)})}(e),function(e,n){function a(e,t,i,n){var a=n;return a=t>e?i+(e-t)/2:Math.min(Math.max(i,n-t/2),i+e-t)}function o(){var i=e.mobile.window;return{x:i.scrollLeft(),y:i.scrollTop(),cx:t.innerWidth||i.width(),cy:t.innerHeight||i.height()}}e.widget("mobile.popup",e.mobile.widget,{options:{theme:null,overlayTheme:null,shadow:!0,corners:!0,transition:"none",positionTo:"origin",tolerance:null,initSelector:":jqmData(role='popup')",closeLinkSelector:"a:jqmData(rel='back')",closeLinkEvents:"click.popup",navigateEvents:"navigate.popup",closeEvents:"navigate.popup pagebeforechange.popup",dismissible:!0,history:!e.mobile.browser.oldIE},_eatEventAndClose:function(e){return e.preventDefault(),e.stopImmediatePropagation(),this.options.dismissible&&this.close(),!1},_resizeScreen:function(){var e=this._ui.container.outerHeight(!0);this._ui.screen.removeAttr("style"),e>this._ui.screen.height()&&this._ui.screen.height(e)},_handleWindowKeyUp:function(t){return this._isOpen&&t.keyCode===e.mobile.keyCode.ESCAPE?this._eatEventAndClose(t):n},_expectResizeEvent:function(){var t=o();if(this._resizeData){if(t.x===this._resizeData.winCoords.x&&t.y===this._resizeData.winCoords.y&&t.cx===this._resizeData.winCoords.cx&&t.cy===this._resizeData.winCoords.cy)return!1;clearTimeout(this._resizeData.timeoutId)}return this._resizeData={timeoutId:setTimeout(e.proxy(this,"_resizeTimeout"),200),winCoords:t},!0},_resizeTimeout:function(){this._isOpen?this._expectResizeEvent()||(this._ui.container.hasClass("ui-popup-hidden")&&(this._ui.container.removeClass("ui-popup-hidden"),this.reposition({positionTo:"window"}),this._ignoreResizeEvents()),this._resizeScreen(),this._resizeData=null,this._orientationchangeInProgress=!1):(this._resizeData=null,this._orientationchangeInProgress=!1)},_ignoreResizeEvents:function(){var e=this;this._ignoreResizeTo&&clearTimeout(this._ignoreResizeTo),this._ignoreResizeTo=setTimeout(function(){e._ignoreResizeTo=0},1e3)},_handleWindowResize:function(){this._isOpen&&0===this._ignoreResizeTo&&(!this._expectResizeEvent()&&!this._orientationchangeInProgress||this._ui.container.hasClass("ui-popup-hidden")||this._ui.container.addClass("ui-popup-hidden").removeAttr("style"))},_handleWindowOrientationchange:function(){!this._orientationchangeInProgress&&this._isOpen&&0===this._ignoreResizeTo&&(this._expectResizeEvent(),this._orientationchangeInProgress=!0)},_handleDocumentFocusIn:function(t){var n,a=t.target,o=this._ui;if(this._isOpen){if(a!==o.container[0]){if(n=e(t.target),0===n.parents().filter(o.container[0]).length)return e(i.activeElement).one("focus",function(){n.blur()}),o.focusElement.focus(),t.preventDefault(),t.stopImmediatePropagation(),!1;o.focusElement[0]===o.container[0]&&(o.focusElement=n)}this._ignoreResizeEvents()}},_create:function(){var t={screen:e("
    "),placeholder:e("
    "),container:e("
    ")},i=this.element.closest(".ui-page"),a=this.element.attr("id"),o=this;this.options.history=this.options.history&&e.mobile.ajaxEnabled&&e.mobile.hashListeningEnabled,0===i.length&&(i=e("body")),this.options.container=this.options.container||e.mobile.pageContainer,i.append(t.screen),t.container.insertAfter(t.screen),t.placeholder.insertAfter(this.element),a&&(t.screen.attr("id",a+"-screen"),t.container.attr("id",a+"-popup"),t.placeholder.html("")),t.container.append(this.element),t.focusElement=t.container,this.element.addClass("ui-popup"),e.extend(this,{_scrollTop:0,_page:i,_ui:t,_fallbackTransition:"",_currentTransition:!1,_prereqs:null,_isOpen:!1,_tolerance:null,_resizeData:null,_ignoreResizeTo:0,_orientationchangeInProgress:!1}),e.each(this.options,function(e,t){o.options[e]=n,o._setOption(e,t,!0)}),t.screen.bind("vclick",e.proxy(this,"_eatEventAndClose")),this._on(e.mobile.window,{orientationchange:e.proxy(this,"_handleWindowOrientationchange"),resize:e.proxy(this,"_handleWindowResize"),keyup:e.proxy(this,"_handleWindowKeyUp")}),this._on(e.mobile.document,{focusin:e.proxy(this,"_handleDocumentFocusIn")})},_applyTheme:function(e,t,i){for(var n,a=(e.attr("class")||"").split(" "),o=null,s=t+"";a.length>0;){if(o=a.pop(),n=RegExp("^ui-"+i+"-([a-z])$").exec(o),n&&n.length>1){o=n[1];break}o=null}t!==o&&(e.removeClass("ui-"+i+"-"+o),null!==t&&"none"!==t&&e.addClass("ui-"+i+"-"+s))},_setTheme:function(e){this._applyTheme(this.element,e,"body")},_setOverlayTheme:function(e){this._applyTheme(this._ui.screen,e,"overlay"),this._isOpen&&this._ui.screen.addClass("in")},_setShadow:function(e){this.element.toggleClass("ui-overlay-shadow",e)},_setCorners:function(e){this.element.toggleClass("ui-corner-all",e)},_applyTransition:function(t){this._ui.container.removeClass(this._fallbackTransition),t&&"none"!==t&&(this._fallbackTransition=e.mobile._maybeDegradeTransition(t),"none"===this._fallbackTransition&&(this._fallbackTransition=""),this._ui.container.addClass(this._fallbackTransition))},_setTransition:function(e){this._currentTransition||this._applyTransition(e)},_setTolerance:function(t){var i={t:30,r:15,b:30,l:15};if(t!==n){var a=(t+"").split(",");switch(e.each(a,function(e,t){a[e]=parseInt(t,10)}),a.length){case 1:isNaN(a[0])||(i.t=i.r=i.b=i.l=a[0]);break;case 2:isNaN(a[0])||(i.t=i.b=a[0]),isNaN(a[1])||(i.l=i.r=a[1]);break;case 4:isNaN(a[0])||(i.t=a[0]),isNaN(a[1])||(i.r=a[1]),isNaN(a[2])||(i.b=a[2]),isNaN(a[3])||(i.l=a[3]);break;default:}}this._tolerance=i},_setOption:function(t,i){var a,o="_set"+t.charAt(0).toUpperCase()+t.slice(1);this[o]!==n&&this[o](i),a=["initSelector","closeLinkSelector","closeLinkEvents","navigateEvents","closeEvents","history","container"],e.mobile.widget.prototype._setOption.apply(this,arguments),-1===e.inArray(t,a)&&this.element.attr("data-"+(e.mobile.ns||"")+t.replace(/([A-Z])/,"-$1").toLowerCase(),i)},_placementCoords:function(e){var t,n,s=o(),r={x:this._tolerance.l,y:s.y+this._tolerance.t,cx:s.cx-this._tolerance.l-this._tolerance.r,cy:s.cy-this._tolerance.t-this._tolerance.b};this._ui.container.css("max-width",r.cx),t={cx:this._ui.container.outerWidth(!0),cy:this._ui.container.outerHeight(!0)},n={x:a(r.cx,t.cx,r.x,e.x),y:a(r.cy,t.cy,r.y,e.y)},n.y=Math.max(0,n.y);var l=i.documentElement,d=i.body,c=Math.max(l.clientHeight,d.scrollHeight,d.offsetHeight,l.scrollHeight,l.offsetHeight);return n.y-=Math.min(n.y,Math.max(0,n.y+t.cy-c)),{left:n.x,top:n.y}},_createPrereqs:function(t,i,n){var a,o=this;a={screen:e.Deferred(),container:e.Deferred()},a.screen.then(function(){a===o._prereqs&&t()}),a.container.then(function(){a===o._prereqs&&i()}),e.when(a.screen,a.container).done(function(){a===o._prereqs&&(o._prereqs=null,n())}),o._prereqs=a},_animate:function(t){return this._ui.screen.removeClass(t.classToRemove).addClass(t.screenClassToAdd),t.prereqs.screen.resolve(),t.transition&&"none"!==t.transition&&(t.applyTransition&&this._applyTransition(t.transition),this._fallbackTransition)?(this._ui.container.animationComplete(e.proxy(t.prereqs.container,"resolve")).addClass(t.containerClassToAdd).removeClass(t.classToRemove),n):(this._ui.container.removeClass(t.classToRemove),t.prereqs.container.resolve(),n)},_desiredCoords:function(t){var i,n=null,a=o(),s=t.x,r=t.y,l=t.positionTo;if(l&&"origin"!==l)if("window"===l)s=a.cx/2+a.x,r=a.cy/2+a.y;else{try{n=e(l)}catch(d){n=null}n&&(n.filter(":visible"),0===n.length&&(n=null))}return n&&(i=n.offset(),s=i.left+n.outerWidth()/2,r=i.top+n.outerHeight()/2),("number"!==e.type(s)||isNaN(s))&&(s=a.cx/2+a.x),("number"!==e.type(r)||isNaN(r))&&(r=a.cy/2+a.y),{x:s,y:r}},_reposition:function(e){e={x:e.x,y:e.y,positionTo:e.positionTo},this._trigger("beforeposition",e),this._ui.container.offset(this._placementCoords(this._desiredCoords(e)))},reposition:function(e){this._isOpen&&this._reposition(e)},_openPrereqsComplete:function(){this._ui.container.addClass("ui-popup-active"),this._isOpen=!0,this._resizeScreen(),this._ui.container.attr("tabindex","0").focus(),this._ignoreResizeEvents(),this._trigger("afteropen")},_open:function(t){var i=e.extend({},this.options,t),n=function(){var e=navigator.userAgent,t=e.match(/AppleWebKit\/([0-9\.]+)/),i=!!t&&t[1],n=e.match(/Android (\d+(?:\.\d+))/),a=!!n&&n[1],o=e.indexOf("Chrome")>-1;return null!==n&&"4.0"===a&&i&&i>534.13&&!o?!0:!1}();this._createPrereqs(e.noop,e.noop,e.proxy(this,"_openPrereqsComplete")),this._currentTransition=i.transition,this._applyTransition(i.transition),this.options.theme||this._setTheme(this._page.jqmData("theme")||e.mobile.getInheritedTheme(this._page,"c")),this._ui.screen.removeClass("ui-screen-hidden"),this._ui.container.removeClass("ui-popup-hidden"),this._reposition(i),this.options.overlayTheme&&n&&this.element.closest(".ui-page").addClass("ui-popup-open"),this._animate({additionalCondition:!0,transition:i.transition,classToRemove:"",screenClassToAdd:"in",containerClassToAdd:"in",applyTransition:!1,prereqs:this._prereqs})},_closePrereqScreen:function(){this._ui.screen.removeClass("out").addClass("ui-screen-hidden")},_closePrereqContainer:function(){this._ui.container.removeClass("reverse out").addClass("ui-popup-hidden").removeAttr("style")},_closePrereqsDone:function(){this.options,this._ui.container.removeAttr("tabindex"),e.mobile.popup.active=n,this._trigger("afterclose")},_close:function(t){this._ui.container.removeClass("ui-popup-active"),this._page.removeClass("ui-popup-open"),this._isOpen=!1,this._createPrereqs(e.proxy(this,"_closePrereqScreen"),e.proxy(this,"_closePrereqContainer"),e.proxy(this,"_closePrereqsDone")),this._animate({additionalCondition:this._ui.screen.hasClass("in"),transition:t?"none":this._currentTransition,classToRemove:"in",screenClassToAdd:"out",containerClassToAdd:"reverse out",applyTransition:!0,prereqs:this._prereqs})},_unenhance:function(){this._setTheme("none"),this.element.detach().insertAfter(this._ui.placeholder).removeClass("ui-popup ui-overlay-shadow ui-corner-all"),this._ui.screen.remove(),this._ui.container.remove(),this._ui.placeholder.remove()},_destroy:function(){e.mobile.popup.active===this?(this.element.one("popupafterclose",e.proxy(this,"_unenhance")),this.close()):this._unenhance()},_closePopup:function(i,n){var a,o,s=this.options,r=!1;t.scrollTo(0,this._scrollTop),i&&"pagebeforechange"===i.type&&n&&(a="string"==typeof n.toPage?n.toPage:n.toPage.jqmData("url"),a=e.mobile.path.parseUrl(a),o=a.pathname+a.search+a.hash,this._myUrl!==e.mobile.path.makeUrlAbsolute(o)?r=!0:i.preventDefault()),s.container.unbind(s.closeEvents),this.element.undelegate(s.closeLinkSelector,s.closeLinkEvents),this._close(r)},_bindContainerClose:function(){this.options.container.one(this.options.closeEvents,e.proxy(this,"_closePopup"))},open:function(i){var a,o,s,r,l,d,c=this,h=this.options;if(!e.mobile.popup.active){if(e.mobile.popup.active=this,this._scrollTop=e.mobile.window.scrollTop(),!h.history)return c._open(i),c._bindContainerClose(),c.element.delegate(h.closeLinkSelector,h.closeLinkEvents,function(e){c.close(),e.preventDefault()}),n;if(d=e.mobile.urlHistory,o=e.mobile.dialogHashKey,s=e.mobile.activePage,r=s.is(".ui-dialog"),this._myUrl=a=d.getActive().url,l=a.indexOf(o)>-1&&!r&&d.activeIndex>0)return c._open(i),c._bindContainerClose(),n;-1!==a.indexOf(o)||r?a=e.mobile.path.parseLocation().hash+o:a+=a.indexOf("#")>-1?o:"#"+o,0===d.activeIndex&&a===d.initialDst&&(a+=o),e(t).one("beforenavigate",function(e){e.preventDefault(),c._open(i),c._bindContainerClose()}),this.urlAltered=!0,e.mobile.navigate(a,{role:"dialog"})}},close:function(){e.mobile.popup.active===this&&(this._scrollTop=e.mobile.window.scrollTop(),this.options.history&&this.urlAltered?(e.mobile.back(),this.urlAltered=!1):this._closePopup())}}),e.mobile.popup.handleLink=function(t){var i,n=t.closest(":jqmData(role='page')"),a=0===n.length?e("body"):n,o=e(e.mobile.path.parseUrl(t.attr("href")).hash,a[0]);o.data("mobile-popup")&&(i=t.offset(),o.popup("open",{x:i.left+t.outerWidth()/2,y:i.top+t.outerHeight()/2,transition:t.jqmData("transition"),positionTo:t.jqmData("position-to")})),setTimeout(function(){var i=t.parent().parent();i.hasClass("ui-li")&&(t=i.parent()),t.removeClass(e.mobile.activeBtnClass)},300)},e.mobile.document.bind("pagebeforechange",function(t,i){"popup"===i.options.role&&(e.mobile.popup.handleLink(i.options.link),t.preventDefault())}),e.mobile.document.bind("pagecreate create",function(t){e.mobile.popup.prototype.enhanceWithin(t.target,!0)})}(e),function(e,t){var n=function(n){var a,o,s,r=(n.select,n._destroy),l=n.selectID,d=l?l:(e.mobile.ns||"")+"uuid-"+n.uuid,c=d+"-listbox",h=d+"-dialog",u=n.label,p=n.select.closest(".ui-page"),m=n._selectOptions(),f=n.isMultiple=n.select[0].multiple,g=l+"-button",b=l+"-menu",v=e("
    "+"
    "+"
    "+u.getEncodedText()+"
    "+"
    "+"
    "+"
    "),_=e("
    ").insertAfter(n.select).popup({theme:n.options.overlayTheme}),C=e("

    #7>/=7Ⱦpy=7ؕkUfkW(Wl.].g ̶MjfO5=WfW^ɇy:^ᇳ:DM`]%y?3rTk/)zp3`D%% rxJɮfz8 DGJ7#I X%8[* $pmE@9ca"pD72LE6KQz` hd`a$)9:]쿌ئLVwu_pzvU |l?I 3|IvцfLsص/V2"g7گgJ=m$o\O=ο9\50ϵQS.t$o R/E:x ^`J\gGۡ+QZ ϋFak?%]}?ߛ.YbqcX+ $>$ki+"stTbwEٹ<=S9qg{`548ҢD$̙f3Luq C #cRR0"*N~ާwv:9̽{e=v Fo5GK*L?El><3^] K.t6ǀ/ˁ}xj  AQp%{y_&dqaDP'j杮z1',UW7.,ۛ3LNUX $y=h 'U/ŧmrqsTtBm-BI:M9 MS\WVfuNmm^ǘJo ua_7fXO 17!3Ay\ONCGP%s}۹Rɑ9 ^eކpMsۼ7'"ΰ".+{[%Nkz/Y0Oz?;m}o5Vzikgso3lk+"u2Z:sZdaҝJ*g;dĮ 0?yv-(!Ɏ.OZQTWYcZea9V =`P,#?XT~=RBQOϞ46D/HVn-+NDg88WoXKiSW -J H6H }[2ȷS/*˦-V?T߽G|/5B8 \q4x8\ .i#nYs7/l=-s{--6nT}{>8Z VCerp*Wv!JK~_{|=BYxگ\I.8RQoXJ?ս:z0_ɦ<RəPwKQQ]ͼk(4N=}Yv{V4+LxLz#X9\wJXsMn}[xC]zC粭-`:XpUh"+.Tv.=bg5jYz\Jq!L( [v ޘ,14',-i7!f-cgūyR%:Mp{%w66vMŔxZI6Q Rf-63 A02%'BF= y^Kds-Wȟ Rs4Y k ##NBPCKr"]ĚZmz!tUS|֥s?ڛ43.y F^ç^%r5 % 3%ݦi ymp7'ۆ m[O<&.Tz`!mE ^&N <<mؙlb{A K7h_\L\7n&Q`75vAAvZz>[7܈9[Ż AQ3Z'%c۔NmU1YWyVigO+T{z_NYήZ4ٕOK;͗l={0$ItLǿ0gvFoL+"X7W8w !IrL+02xY_pYH\I4ܓAD8J-m\CH!5PkO/ w7R1#e}InbN۽.SFuumv~Xn^?Uo'-v4-k\[(MU5Xv 6=V8n)Bf&QKO1IN|vJZ9C6}i (~Fԕ=jR2mJt+:hyT;K8Ǧ8+_SD[zX^iվfZ=aѧ);a֘ǏM׶Á^II{d2B,mvnčkw^bfbb`u=* }nC}qG;WMk';jFj/G=kdo$7YV'mi =>Cz?]\I>O#h==eK JZNLJmln9X$gÂS0GJZOD/)^vp! gx=svI 4D_x"aۊP7KwGI߼,G!ŰI|oxó||^]rJ<2ݬvDZ ?㏊ODpOg.Vީxw(!WZKY)dnB£TKO0%UZ,3Ϊ5 Q :4"3Y[ _e|rZ"n[wysn;ON<顎Xt&M/Pl;:?9+Z@ pSz(댰[ BA5ǫh::x;g!^qaxY`| `:^]ogn;j8Am@!bv?^z2B S%(rBٟBB+ PTAy}r|K7nE9t[lE#ɭt3kߟeM-wM~?d[rRα9QdrpLjL;!Bre){ydOܤ~+viN˩uk]&p橳Q!%2{a`ZϸvQʧby0V.D. y{|e}kY x[ 9>Phf^|Z}>+]yl\f:38/,k:-%n)5&gշ{}g^a]שsDc\1ۮw?oml*4B۩۲Fy)r_#̔ϲUu8&s:b0Kdg?u`sQl^6l 6 /y]18CH|Igzfܹ/f"*%^Wf/ >.ӌi56Ikr|F\$ ݾūTjZ/=wNAI. )_u*y[ο B:6Z帹S]|H+#I]8I=RajܡPa\r Q/Md0Juv]' z{Eji_ o"hшn<.lA1/.Y7'}!+e̓|ϙI1p@~r?iب!n}@F|MCp[ִVv_?$ʔ4I݈5pђr#Am0\ٟ}sH>|(uB5$?v]ܕyLnw)(. +>l+ZDcS|^;D;<9wbI+_5ZE)Vq$x:2p^r#=d*u|gr8g֧}n{1c9 ,ɶ kh ]o+~v"[{[]zbo7<էJ1[w9"MjSϥLy7? gSʶϯ:hw}M1_{IDZ 8 f$uאeUus7i+ptqǠ1xNpu뻶p#A[ϱstܧoԠqewwSwXKpf@p /ՍQׁoZxTGǏu& H;ń_A>?&z;V rjsL*Wz>P~$7OS#!kKu_€S_;~VkqmuХVz+O2V;~f9n9~'tjr.x B'[[U>~/}WVe}Q'܀[vB~"'/'Y_CmȘ.\qg2GK7;~ z躳&}8G OPCRnku+_ۓoF-7VG;fL*0 0j:u*υiH+7k{ᥛ4Yenuv& u3+ָ _"/埗5 BD`xo!&і(W"19~dyx:n~h!vvpu*&ΰXyLmöa&ʽ&$1 blXpr[r[u#۳g͵g49C1=W2z4AtišӖ(lZL960FA ĭ=j}$d&ͬ3<,Fÿ 0y-ߜ^29׌;l}\}޴́c]_{6P(U?V,G\`?_`;y]ͪy2`ɏ|٫:VF| A-Pqvſc. 8vr sZp>~]޾%^GZ zj%9f_\=wK]nߢ[ヷh޾_owĝkG}bвPz\38}v]+ou :-v1}7}VmWsCc3;!\)vjl}q~K'ޮHx=A\gWL|J竐lɩq(e;9bݑvT5hg>C?8Gf`/Z?< ?hjgH,}\E/As(B}<]|/7uhݽ3xJu X`4Shm4]4,W\~/nm ^ :A^[Ԁzb8.=]۽(?)*Cm(μ >fMtyc0W fjmo,R<iնvI%89_ߛWB]6ݶ14恉Ӎ5uM흌>K=4aozS'C&:=م&\{Foo;&x&5EՕGz6c݈6YCQecz}[4kި#ՏJvS?4JTtU5g53S^.j#WQ[m},{:7"wg;YWykTgWM1Y奟PO5^\YVRZ2n$~=.L?Bp/OW.[ 4}0Xz+E9Muw.&v˾7/v/ݤ/͈-yWx*¾;xݧ׼vy c|myҜmBB>;:ͭl_}ƑjJg/ȁ)d8JI~t|ޒo4>i឵mmw }Ɲ*o bU3`X.ri^}mwLuQswNo 0_EJY] m7hIvzs'm"і̙s/9/HHvf9:y< gC^w~ tk 8^7OߒrcswF \D rֿMMvt5`C]yξ4ߟO+:Ōb n>@{8}e+.f;~:c uu >:**((\')lOU&S6R΄jnfo>|\~!;!'J26wb4(^L LnN@C=sG88P[4pe%?0<8JqDb5K5m>OEl&tyě*/|_o'tX1:z~nPOPHF>DLg(i<Tl`bW\eE Pxx|ysS35=[<92/`,"h @7wp=h8znv}PUf@[U%`º^8<|Q7h)sf\8? Y8;jkaax3,WfR:=jIu)[7BezՇ|,ᏤpI6I>23o?k!!t/m{&ư3MJ<}6(= ik0md .8JrgeG@t/F5:P@$K0w&Ardʖ *&0s'ѐ.J"^Gj /[X'qX=wϸS*xQAΜZ-uSjbS}d딻a_ yy?.CAjT$Sjq.|GBzfNX V %#) Տ:vBx0eo$r%HDl#{ .UsG7tC>@;ʰP+՜67=3vHb&nQ֗x[n b>ګu-l_3]8,ͬғGcSd`rV|-y=YLx/b`JՕc#B \X@lrom|jlg-3X &f'g4\>wfA)u!gˡ2gڼ*'7n][yrC'K82ۆ[0/Ġs vT?Gb辏C>Hݪ X8E܀FXGXGaK'eDz9vXИ) ^[1%̨eٝ8(c)zTW҆DZX><iMǴV|R篣BJ||Yh!1)aؗ>2XiC6}"vzt60 5ࡐ 1i'jBT]MPkaCx^VOl{,%CVPto Z6 (1-CӚTw ji@jkudtt`3`T &V94@CO/UmaCzπN%h57$@sgZ8k'جj4l8!zU4߫bA`^ac4iXZwh8)dF@{Y)[ > Ӷ c ǖ,Sid(2kxoS,`pHڌ(DC'/ؠ7 `yDKsP qP*I7Q=8RR"s$űddȫ`+]85GхSiʕ3HD:ArҬPCBI /򽦞M׶aJ*"L!c)+qMQ HPHrjP?z]g[":H 0ɀEuQ ~d~̺de$8Y& EN(H=ڮ sIE/b^ pKX2vl*8ϱ1h tptJ#3P);$HPP0n|t !YtԄ4P`o d韊%D{QJidt_t"-UH`\`IGl$* di E9hmjP7(;lR S`s}Vp g/H!K8TA28Qt;%4yaEd>⧟k: d'E<RC`33* zwd'?f5ŶI\ ͡M5j30d0a0k 94\p8@ ]R(F#n^%3?0XXt;]"Xg(Ad]Bp1RK'ܠA_͂S:q8ob Y p S2B_ '+1 -DYRKvpMEڏ&'S,Rp"E5  r$V@rĊ$"ϧ4:}"/2$Q=>!j29qۆ.$͒`Q^9~a+2q? !.9): δB[ȢUJ=:!lBeIX ^;=’:._ )f 0j3#R9p:S4&ROW4<⚈"@pہ̺_$;;I\+(m(BS[CkTF^TH֖nzOUVC̀YDn%` fxQީDf-. W\WSpp€5єq퍐 8MA$qOE18%B?b.lC!HmG4H#VN M$ 4a nF.S;T#/RJ!\xMWjQ΅ܓ=7#-@+%}. ᜙%CgFX,7CHMۣ`u4 DC+䬐CO#&@u͇Aш1wq†~ yD((EQ(d$˅3&D\&jwd#暃K1au(H̏K7RIԀ-KaMDEQvY1q !k4F . %Ӂ_3d3S)U@UǗؒML!I~3.&[^HŐ:)ΰXX #W; /GI$ժmg\'W&ٿ8#L%EᲞ ,svųOT}hr6C$S%䑤c.6ܜH52l'q 鏴 ce-UD0^B"_S$H/y|S(v4I&@{~m} '!)شHNVIP4"胅@5@e*)${5J4VR}H4c:@'0)dE'-@C.%!Db q gLr*dUr`Nva}C2)1-M'X.Y.IAJNM~䞝~ŽN"CcC}JFeBlf S 6b5`R PSVE5Cbf!DcJ-,XHMre$+ާ7Ǧe~Є+> 4C}C!Bh'!ٌOK8' x s4NQԎ@ӥPr ;R=ޛ.A1\mfq!+֏ G[6dԅ>ON1'*䩤LJ&7<b*K&r]jv`A5Al(+t460> uh C)l[ۛSlp M.0hO?>XV HFRy#BGRM êR9 OV'MF` -Nl鏦&Yø+ƣq.~{1UEH s[X#UA}F-3BG !Ǫ҅ƮT XH <3ܟҒ!әDI;ed+g}T)_uiܧ;ˡ i$C12(945JM YJ"ʽ%7= a<dL>_ X5ꄣ.(k6X)տGFgD(hE+`Xl:V:D<=ZPT^UHh: I`yi⭶ʹSS˽?bj ~I +{#g= SVX f] 4Gzi*ꠓR ep]`w3,{PyaxhY3vSnP1U_Ug#T֩9x}J9`ʽ{쟪q:"#Gч"," [s/qi_mؼAm 8ZrQ)TR9ᇪb?cEJ0>l^{L*юZ:5eY et!!-9w8<1 % h_9SqT$\þt5R H‭wnxMQ ^ QZR$@2:12YJp5kRZcEv;>"3i D SgGD 4tYټUfKr5[9dZX6o52Ϟc&`a*%N',A3mw$KUe %t*Z@hL,\;%LtT,mA;ES;以3%z⫏{FKdjvDM #wRKL0t$40#JIdwYo̒Q`Lɰ6H;x_lt_A /!4>trL#SAd2V4mHB{}lqpcF-GH;u2?b 'az$Jl\xJU%`cq>ItT@U1a]n4^HQ1d @9 :6y9JKso_A EpŌ⣠$&\M鉧| VAH3pİe~R`5bFiAQZ>&][[ 9Aߞphj*O)*k(mL5$IհYF& R2LRMS oq]NAH & +xELU{G5wjPD:&EN5Fbj7 CHO=% xQ2QErrL;rjjASX 0֤4['DT@i֥,upIh/\L)*1bN Kn,Qђ3# `NaRNF\ݲ}slYA2I{v3X@h`ͨEJ >So>yK@S5pGf(2훜B7566lxW\eI=nUO+"H䌑e)A MroE mb Artz# S-t@ ږM_YUoU^/\JygD81(NWGt-r3Q0Ir6qӈq$̰$3h 2Ly&be-ŭ JqQ SX ʴB`x.$i"tAAN\/,эN@d%Ob)X3 s4UtI Ǩ<ʘ * =i + haNRSMOLc'tkI C'!qgk4؂ք/r⨘ f3Qgi4O;Rj"!Ϙ%tMP©nM@Z~YI $;5ܽ̇@59"_́W*>ѠFbT'=b0ao Ct8KM'$u^Bp.sq݁TTDFW i tDbJay`U$چp8 IlH?73.CwM|un&,\6ފ{Zݓq-,{dPS,x~ػ6oqJ!OƢ%i\}GMI>|/\xƵ: wT'7ag£ȍ;̅La_H3ⳊТJ\p=mػgN7wd5g,Z/#Nk|q #YkSD\nbɳڃ1\c=' $Y4}gKjqV6|^GȾ5g3W7ˇbXqdzmqu^F<鄀ח$ [a9kr9 6uޝD`Uc E؝>z1!^rBa}f`Te MIU./r7o>s`Ҟέ 6nk73 .{u7sׇ˅Nsf zdx{IܵitTCψ{pF~Y*<#0؊>벓%ˑ.wKSON%ښ8JƠts㰚u5Kyot"QI-k=4exnށwIB0FGY +eÿMsN(>]ؠxWG[7B.*l7Z@{Gl#тY)\忊(a6k̲%)ueQ.YETē 3~>{={5Y )ZesQ|j9nE4Ԝ"DoR5g1uNwz+knrZNw(s%LcW:ViGh_ǫG塖fI[4fLV"t, EM5:S-2~RٔcqX(쵶"^Fw eW^v6(})a7]AP3}5)yn~} 6+YT~nnS[ b+TիN*dރC+^'Kd3c"Ģ =y6{ك, SfsVKo[W{CY ZG6<z<~elC|R1(YDg8nl5]t~S]B*yLK;~}!X>"v6? w\XfWpb)[fKtKк'L3ޡ _["SNTbV3@Cao_Yf(hXg]W\TnnΜs[}`BrM1e ^Ƣ,U v I웷jDHCv7uGNE8 iӽ'UDeVd99[l0᧌ns*~X].ϪR"\o_P(YV d#hIpϭ{5%rb|ݥ(|DO9ڱsϮ]:}]&`}y7RI >\!?{d0΄HQIȯYGO jr CJ&r2{.S[nffP깊n;v PbwSQaL.3d,HS䴌62\CNy_5P[7=:G;q uKZɸpv˔PZ"f mKHyQ Ic`O=JNkj[2X=NLx.Z]`fWeoXVK~;Elȴ i2k5[a!Ӱ{g :B]~t/J~AmN\ۘ>en8*V{]CNǘA(k8gHfu oNhٗ9j{+~9G dݰd{>p\E$Rӽ)B.3kEDEN"nI &mvtMW B=x Z4i[j|RP,Sσ-hRX5cCîKJɿV:4W<զ s*nVF:*Dm4fe߿#NY~,t_(uܞ01zi_j[|g] -S:*CqVZ/YNm̈BG" =^*]Cݵ0o{{Uu9m4:~_Agֹ;EEŜ-\?;`\ZYOBRmnw[Kx歹Jdg9Izb -} H[h/ՔzGJaln{%EG~bg\eWc$Գ}֘$T'|7:\W ]%6t]ũj.rrw;O甔ީ?T#5ܻnyePdf?O=M<a;WZ"Yѝ3ak@̺A'%/9p]@SHGc AGE)acs<*A7Vlgau_K|jstD#|{L,cU v>s^yKI pxi-MWن7I$6KҤGC:@BiiśMS!K16+\9oKLZ2d'O:%PVLLMPπ~~:>-["g?@װwb,4&o ;UzU)Y7YYFZ\*Õ{_ʸ^`6OPԅ &ӈ =GmhXx^ \3'|sHսLQyYq|e[HzO3;R^b>|]'l04_}Dӹt3\:}VG^\åYj'ugQUVG_&خQxr E[ޡrJWMn9zaQdSZSuw37tY(/r֏~KȾ"2?T*јN';x7$ݬd0o5rxhΈ(We~7|Gd՝X_ڈ¾ʦ `ӫdԶxdݘ_ ȆRxi/m)n\ n{M]nRebwY5l x9#2{Sɯ7.#V:?2ǝX~*Ğzmo5"^C΀e䣏=.K~ Jfih> yofFc@ʽkju-(ݧ/ C8E1, q¹AD_cZ -r\g9”<,=\.<3؇A>%Ϭ*T~e_\Vb=N:Ŗ2)Ǔ"bH0'vit+iaUmG,2GUl_ 2ɫ,vQ1 [J!?m\ٛ>ɔ|JN9o/jy|1MWM:[_{4e޲l<(BL6LSq\SC(RE:Rgmina`'K3YFFtOˡ&2yn BIf5#jW߫uaߎmPD4鰻c ~Lf}"DeMVHAIbh ͘!X2(~ 1p60 $*PyNj7ϐf  JBٕ+ⒺV%հC]sUM]6=wIy'ͯMwe{זp^Ijf\4m aj=ERraiSAvAm\Ozq%?'ޢ5GQqhZ?l;=0' Z1F$ʕGѶӀ@\Iv◐ftD׾1s~6( U/[NeYFeCguPD~9FŖC$cw |c?J~ý,3t:DTaΙ /Q8tб{7i=x|w{AaƧ h7v_t{݆WaƄcS[$֔' [_*@# 5 !ݓO=#ID%Np) I:M[!X6_II%]R]11m>ˌj!C!,*IzIf:!F,.wwZKYmUY\&UfFl9r>@2OwѳYʿ"xiGy)9Bg+]5~:ztw!"dK dZM6T}m\L̼Y@{P^Y|9CʋODVO^38&9|}9sPy(Kk?a#2ϹOv% "/z4N*l@岓ǎcDMyiѳ4.EAql ?lsfn 矍?vsÃA$yϧ\?!?fDyJE'|ḡKUEB"eNk>2[Q/%qg̍1.>5aeHiVSWQ~/ B":տ,x5a6 '!AݏV*4Hcz+v{ =OHDW+a"+`@ɑᆪ;E4j"/Hg!O3biKN-9RϏW>oFBpu% .&Adn)؜ )CHH7jE l$ "MΎUMSԝe<)`hhݻd2Ɠ^f]?7|dnlgܸ'?ʩk)Ly̒qcSe-2> >~i-kQpoUN?~}}>Oh<"=Ȱm '|6Rx62|n&hHWLygJZݢMMHvj6Č; Pe%#H#Z01[h|)o3:AoϠx9][Ҽ(_qdyt>m(սNߦT(cR^7P,귫z)S(iVǯ1qLN{&Љ> NP[@m 2 ꪕrJT+9X~^U(DMT8]X6[wi4/ = r^ D @a~H$WKؔjW\ q½G29(:{i͏ D%j* q?:+bfRs~+XITv g@ٮRYR4I%OrȂwLv Y?Kp↼yiæX^=(֮K-q'3r2Yב'ByMf?0>O~] hN4͓ymM+u?G sBz\:c[;y͗=>I#5dp Ҕdu,ǂOC%d`g[ /зkμ 7" z20)KBzC^!חȓjԴā^1RuiLYr $XY˼HzN̅8ޢjT$n׳eڍ8Om&*8bKE d|"uE֗ ,A9l=/ǃITt@׫tDM)IA؏ޏlL&'l=Tr-&=N.|3|/6`QZ)к *.O'| 6ܒ"q2-:&A*A U>bR < *u{SJ{e9܄/֨5thvﰾ,tP(ϝC2hMwlᾳфjIu5'8uq3{V~ٴgUu,e~w>WsBжkAl,~HT|g" {5"(Bs:Qc:9OjGv̏u_^?=SEnQUZ\ #e B6c;<"-0c%͜R$Qt?҃R:ĭ<>zH*P(UA;ۛ~ ՛_3_:c`rOl~֬J^RqW֩A^ٜ)'[?\>~A5`F7ȍu'*"ZH+DZ|^~9IϷӹ=t1]tA; (KA5 ^x܂[TE\j@~kfZ:ԨL߆AZG%A!?.o峲1h < ZWϖ,j\FqL1䤴w萼 0SXPao+7'c4u>$)VP믣O3F 3}{o6~%*'o+ry@JjVT֊򳌭Ohs,yW_G>YR"5[aRaLp/ts')ՍJr BP2cV)6(uZnPY1{[a. mf|z(H{m(UWT p}dD&N8tlݣK\,4%V$+H_y}!9P]s묓곚p. ˮ׋q DVPH^<G?y̆ і U#) MkKPM3SQdAȓځz޻"B_} ,"w*(khM2~?i;k$fUdzt9Pޣu^(:~|j)HͯvܺV9Zըx/z6&M,j-x=8p.98DFѧ_x0+&mǜ_jiU{ O!M!Wᯆ㵶9\{29 I%/T"b^*]XbN&wPG*~*;'hl[6YҽCJܼԉ$D#;z\=^jrCUk8<$1H+yB%{7^|Ī>JS/ŻU@0WIRx).Ϯ)XNWխa7+Hay(aw&˼BBeorɟB "-[=&8JȆ&+|NrŖltل0esPb:x6 ԝ[2SC(Si(EԈ4'gOr|B15E): ^[4"w`/䋜9!W0}EscPLP\i2ac7z$fl۩:nO#@*'>BOʑuл<؊wSmKq,_A\q}vrR5һRi.[npjx-z$G>"_pÏrՠ.`f]\š"h?,;"PQ߯crWw !o֠WlC'LOx`uIۻr/Wh֎Oi {sg>pp\RwZQ=&\Wrw#'cVbgL ЍZjePPPFvl/xf-KO1< ENJd:z3A6DB!uPz?XJ;zg4Z~y6uP&rAfCg^s3t9[x`ͽ`-m6-R?.{DiWJWj 5rCf*?t|*t<ǎK@+; bƨt*_)\`_@fa|TTsoz4UqucoǙv7=e_ H-JeXo"[Jz񷒺f!%wcwq][wwq6W|nj o.'K)% A!Qi{x4k=lQT8b((҂?$W1$ODa-ct=6_v*8""9*p! ^.4zy|x?TŏNؽ!ހpt&EևpGp*:F6pz+.rC+mtJXq{h?G P*lWM@ѩC,h1Wf]Zu@!`t# |aHtçuF1!u&9@ `,; R)T KUxE-ѾĪ9O%KfXF(KȆX(F  M$$T!@@c zUN#d}ƄQD><[-2,i9\ )?=dSGS>x Q4\9=(-tS-,pꘃFtҐ&i; +>Py^NԈ8z#>Ķ`a-㦲֏謹> r_&mDoB:(in¯aʆ$0!UjmU&|d ~cyl 18UPTC,3^@Wv"bK SʁKЯ9T'l_;JtAso'MOK;4dc ` hEoQ+\x'#)"pN+&moF^ eGC [^.>BnT=o| X5$qa_I@)G0cZu~#D$awG@AK$_H`7"|RAX#N.?Y6[,,MwwjYkF/bŲ#<,.KiT?#Aj#G W s :)s_ (T7yꁿ̪AH)?}?!7 /-b@c`cSoٯ7+7ېL6JfWcMcQlxx v]?ko_[>!M&Wb 0kִkbfW4tw\+f 3@5cfhEW۫,C^mR,TBH=s~hҏ44DV{PKݹB#~~D *[Ik;φ AE+ UٔI{7JwkXj#)ƣ0mW vxl9_d=LJt({IՀY08Ɏl+84PcB< O@mw6OOumo*.cLj_ͦG)y$tn^h\XY\CWVކ{Va9Ѣz2 \ˊ1=tє/p DÖ@wPl1mo]JOH]nV^ud@N `aM.ZV)Wn@Qpd ) ڋ7O;4r #C|h?AV^`:o#G?C_%\jjK2f,2(c?q!5}!{qQku*ǟ}L6O?۲f)FѱFc`,G1'WxN}L̈́Vcҙ~:3Y/#feek" # #z/둽"A4/iH{DM2r9~=no"J P܅?8`A. /69Z %&zOq3v2UJ#N[wrco\"-s@6{F4vƁL%/Bo 8ov٦F6X/vH5Oe =q H,D`'X]~y>;9-wF>)to|\zErWBӉ8#7InS<PxJU1HӪ#ȧ>,)xY@酿[sot}s []m#UjC)8"C 0sӁ R,um=?t*"IХ9VZ{=ca 7a 8x"F{*jB=Zx뙩:X;HkZ"5 hـyOww(6?yGa.?jF[f\:TT80YI&q\899hXyNt:C7zY$9:p. U:SV3amyäfo&7>=颴>N,H7% [vNx8sdk` H&델ؖ ݋3vCy-8xVj?]dp$pڟ/|tŸRimT.-*bW} 18\n۠Q܈N6D=Zz=oi\U< p}ȳWl_XņA/pU} &WM|*`man z>uk_;ck5O9>BgeR0ٸOO3U'oSZ sKϻ^iCmƑbs<}2B?sVKBHF!87Js_:"DBLySv5 U`IX+;U()", s$7Ѐa2o4$o"K2ZZKnHGؐԏīY S'>W~pQA`c_JHgs,\y_^_jR~+WXl{/Li)`[vO}i7@=pHv$/:{ڟ~M[w+]f ʫ+n{*r7+Ψ%ϸaUɎq=2f7@sk(]Azo bplˇ(Up~|1>s"WD>Ў>R$jVbpU|-=Jсc6ߵ4Qna}.Iǚ}hc)|Fv%W#}ĻHێ{mo# [w[^#?"U]& mU.AsO"߲:$zz:Λ0rG7)^}ZawIn G.. (W1kSa[tL\׸a `D9 88 NQ#3RY>?wA޺Sk̲itM.*.wwwʽw5d" ]~%K{[L5XN]mIC\\ "5x‰ 29s&FB\Mvڨ9^QΧL O5f Nbyi$2^Ond^³5S a~߭'[k ׻䡐_C#OCa u Kin鷭j0E;qZſa)Dž9).EX+] l1MSCd++n# CE MHYsQY?X 羑"9KmfϣkOM* :1,!X9c0,?wD\XGu, T' @{>g[Aq甙"@-TB nl~\md[~Ǎϐw>Y<0ؤ`+;F|sz~ϱ2ˊUtǞ$;>yuɹ(H\<;֠`e!.y Wb$ mф|+2`@AA )GCN(Kw)e?k5QI[V݉ģ_QHMU3c̕P@7Xu&NhxZ7YOefu !E]n̻1}~ MA ҬiJraȪwz4ű@}xSiSpᨑE t";iִR9"zmVr'ؼ}rzO+Efeö]Yi#p PPjX؞Y:ŗ~@L|ꘓjd[ƸV T]H9#c*j˶f ޙ\O*k/cj}v]/̨̓]2kZp-M\*yJMGx[.Yi{}VǕLPd6\6Qf[g]ט8MEìfiL.غ/ 秣yS7cO(13|}P xfJG3:6xiۚ-*.^MLȎ >?z3t|LSQ{=hܗ\ѢƝE|^76/v[4uI/YR9fW.BRVdS5>WlT)I.]U40|9Z`g5CDϰ&?Ƨ+Qu_ ipy -ZhoaEW/dţ^#y[s~^x|VL7=zss]&0؍Mq.QDe[jPi)) A(*/To3e7ke2.amԤ?DMkB[-o~drK~}49Y=w yuivKw#-5HTbbC >C(|IRc{Zg`?*qyoxB`(!Ѧp_p9~'1b\ĿI ![Cj~# }f. 0 '(9^h=nF׳u9ox,+,mAys4;'[VEq UNƟ\*2YEbD}W0R#}qr@4r<+O7n*]:|@^S.-1 _7m -96SL 7:{Lb8IEd+FhSRj;+=R%h/ %rߖ9&oM{\/ST(:+['˲Jb;R8˄cssΫ ׎?ͿĎxJ6 OߞYOQ8qnVI%?8cF4A*Ư1j0k}(Uoӈlnv:ؘ(L=2(rwd;@'h&(!Pp تs0spI/ݳ¦;Hk 8qZ$:; }lx)pw׿l5v! ^bsH?%9R VR`3w239Ts6[ybOnʛE>|}M-^OHP^u!>^D]5̅Q'h WNEwtVgMZ "\m7/bIc PqkP4@c5AM' !qB55#_ұ~`=9EOdzpBBǐ1zq`_8 <;@Bȥt_GŬZZMBbz௢`=giWǝI3KHZ}G'%E19+O?:}tHa{RB]Kb˜.MΦ~Jgl{]#oն+a^Rნ[YF C).kNe7 ߐk; R>p4v_eNnJ\JAq)w1~Hi;_n?[C f97df$͘ Fr ,{ [Tk s=r͒mB~F iӧ\ߘ[- (|0ԩ4>H:taTįt~]lާ?|HTjpFsh00)L(yNMYQ*B$u2{\[q~_~Nb\8qэg1oB'MB=RϜKh#QA+;꙲pN +k2 WPN4ڞ<]04-;lSkz^_?VY s 9֕wFPN*M<䘀'\MOQ_$#.td&[V]<L[ɍ=1jJ$&WoPP$ˇqN(72TEhحA j$VkdG/F#aǿ^!$5 :c?3[H֦/Y౞WSv!hW'W=:Ǫ)3ay?k /k\n|UKg§P ½'\Irc>2Mz4B7!sVK5V$oRᶁ6XNV:f=Ԭ_ܿ=tK$ %3 %IŚ i%rǚA+pFq1@KCIˋ諝94@cWx/Sϳ܌mPo8+/.xe lQBAGH USV.DN>0 10{Ca*E 5mֵwE 'X[1{_ ;Ssda#xa<1&}P&ǘSqWsg(`tNc SQ=YW^ZBχ5р_#wJL\NF%H<7 Q􈱿Yeъ񈜧lٔh5[**:E^aPd 8Ρ0V6flKя1'W<7dǛ(Z };lUI V Lк`0V z` ƞ >F㭫l %,\6= MFÆ5դȋ-ojfӃ_t u}W~;(;#6'?whw\)\Zh{pQ 4 Q֗E⧡1Ҽx=r5NdBN=CG0#h{ vZ]}y0$9$((ͷ1As~şReanCcy $zYv7'.t \( ,^O* +>&SOA+/%}ok$Azͳd/TiZm{jSBVl,Qu#l5 l{8c&9J~Gh*\QP06TDcߚ2Da!COϞ`eP֟_ fMb@Ssi0#Un)kW3RnCJ -"W@9Xm] -8UpŒpʳfXO F .mzȮ#MPFc:R hSkQ@ ˣIKcQ/aN=޻ NSȩ:ADw ^Nx>]6̆$|j`d6w}kzY$ @@6&D5x<}vœ"}>(9HeS SY1I#&j%Z* >'zr--5iܿh`D1|h'5T_埁3K>x=k' (Ndz0`(i7N55D\3tⰚ<0ȧP 2%cԪM1[M*0v;0=+P (E JL~Ź6~a5IL175ʗM_8< |ֹKX͗(1Dݥ8M79ۇjN]RàާK&KЈ0dEĘ-2A CK±j׿ƯPfy/jrߣd95>ȒCncA4Kh?HL_ǚKUJ:macB9!v}gKw@cph#ոPKUIC٬>70b2A1񰇌h⠒O ¯_7=(G񄒈_RSYlb]}zOxmT)e^;߇>b Ĕzw5F@օK1lHum|u: P,-KE×A^b>X׶P_RLG;|aMh^dkTSzؑ'>&hF5EJMxY$np܄L u XEd\d|}HS4/PP`I qy GП*FkS_4็8}&1.H$W )Wtw>)*vknpO#8;!Avg) q|Q'X }jsi`M_aFNw[0Ò3^D55!̰ "@=  W)ċ>1k̇qsi* JwyPcӳn](Uh0GR4?cNNiWnrY-2[qNv0@`Tte_Eo]aY]aq/Y01-;阏݅:čB2'O|br̷/wfzXbو%hD|Un wG*^}F_|3)i\(C (He~ŧm?8ƝAVTڑ|e)@{Yi{|+ =cMU >#Q/LI}m#͊se)՘8Dď[$"c~bc6<#mdO:FK^W7IV4߱QAsh[h?8 J力8[hߵ! 2ܨל%"5tD W2cԊ)g懜,ZS9!){pĨ:ˁz$f1uuc/idP!9u̢%X(_trh+s1wu e1F2g0>ڙ;rژ |~$e3S8Gr':О͐;W8ɼw=Y>r >çyI u00#O9nfʜ > {K< p; x_Duf=1J`OqJnj pL*?v%!Vg23{(.l=63i+WԬP7_7ѡton^4ͺv5}O)0͔LqS.6(.JqѮ= gsX7> X- ru[="68{OK?4UÌiYQY?0^BK\Y7bʔ?0QpuZ"D=_BhggCj:_F0 jI4Hu.k|9pLyO!Z3949JODǗjŎz/чB x-FS;~wk P-gy⽦?{?g~b{*kW783lQPP^?csL7pjӎ1eO3YWPp2LCs)bŭX 1~`:"\ >"\txw=%TJz-H4\OQPproVw*#~ܿY^q"#~Ϥ uw%I8m*2c^p92zsEs`1:@N ! n`ֆC`qY|gGAyod!d !6[u9!=D詴EDž`]|x]U-RwG'?4fl yKG.W fS!RYwzzJEڄIMn1Y&^M1sP +b%#qgڵw)G#?cA9kEK\d8EG?9c"-&'tC:9Y~"h ?M.>z5/[50qrX"IVpXˋ+ᜰ55A8Lop[Azٍ;q[Bwdμkme SuoׂZ$=e֎Lq>nt/Yo1X= Jۢs?RR.&`n,-1mew~8֖(DµX&%˖9y_:5^^K-然UkC) gz++!|U?_D 啌9|sR7wY5~G#%l*ɱ`wƀ^ʣ{f,zե6xIyRK !u1"(~ AU:`sx '`AiA}IZb"O Q<e2"+4zڭU fo)ReF>BT_bO1Bmpō߶.OHy}I:P^_YI簌v'o%JNYmBlhⲞͦdNZl_ dkg3MT~IHM*)o4+:w[Y'Ү2:b*4))_EP<<_t(4Z? }rX4_WFONg-j[)V{MeW/5i/54=II꾦~z|JҨz4 P Kzjb5^^b[1y-rZɗ*[\ ,#+8s7q³4VzQכY䍼1BKZ#7TV*Ž')W@_4AD <|7Qʗ3az ,!U6¶ &|"7EyzR}=% 6WU,O뛰]+7}am5@׉쫝rcJ[VqZ& Jsn业LOEhUr$B( `M#`b\f _}^L%呭}詭ƲjEg[sBCjjC <+\4Q/Oi*@:]4R/.o~rU+hdYfޚ5n|x0L}qju)fYm9cy'\ _sq瞻Vd= '?Lu+a #>s ;eogmpHkM:D\[iVT#JEgǷI;=gD./I}O<#JM?YBzUa#&_Lůh$aAK7Q =iG6e*55/ǒqhupͤyllՕ4I떝ڝ8deKS͍P8BQ|*znB+91N?@mњ'n]Hwb fZ^]{wV:ɍ <.: QB.<5쑧"Y8 O|%y˱MQk-/HS~D#X}ۇm9&fY9~FC >t(SKΝG瞀o=|a<9;7K)6y1q@RSz4cM7}x7$)BVG6Ov:ſ/Poj⑇#OEa#5M^NKu a$RRwA{"uxF$>cMNQ~7aۊn=\i~ Ӛ_rPx;09(ʭ'#!Z' RwwA[ŏzҽc^#5=A24jPA)qo vY szti"f58=HYϯML"WP< 3sxJuOU73[^{^~z4$ο,X70FS2R}}W?4oý}ѹ6Kyq]e5!xpvJJ1'.Fokb˃m(!+l_ú{7_$~{Xbnߛm0JZgN]}vR%R=&YcJˣvQ/2Cmu:z)2ϯu|v&O7aa?9p;x g_[H H.si9Td.ѠR?~"xd>qFɡqߵf/ae ӊ"Qz."2Y~2K>_,Q})d9C܎=@V{b᧺!F0ǸO@aMgVqѡWb0b80E܇<*D$Qmt5΋ |X7<4&vCs4vULezjv2;u։y&INZ^ )·_U9T1RAu;SS݊dvwԅb@7kw4 GBkSJ.Zm&CHs ?[_ 3@Y؞ ;諲27cg4MpzYY,npE8Q(ƌ~6|K D+ 'n\lfyY/hN9OyUs|IRݔN!Zř%9DN+3evCrfMͱ 6r{@),¢G^¿ ]L_1/T&/e4c^d_},;'zT[V-wO$XrfƄ^G&|zw0?8`>U{qܫchC̚<xKY˴DO~u~ r{iZe `OS À|oД=fVn/^T%^+``oj4Ά8ȂE\Hd]<ΆF&<_4kPö N'3s|Q,SD|Ǵ Jվ߲ݔRx֙~mL/ ଦ#7ׂG!DhLRRZV RNj23 oaxpbxk>4ۨ;ʪ H~ILһ5:kYDh B)/J6Ȫr_m~Aİ]XC-#r,[uGu|/}e6 Zra<'%BD)ndnmkyUWVMyS{]OAm7 $RyuiWae5rzOšw>[b|}w#7X\{M+ UٷxŐk&P{_-O Y݇6WNT4㝕]4lFw!iY865<%Ԭ@CЭ 6Wv|Qv`&,ǬNwG{zw州Ux? #\#f)t Ov-:xTM%!@퀊^MX?.n[uoS6Gf^WubnsƸ,k5 dE蛕UaT/ry P愦NMjh|9@EƐe61'0g֪%L}Ԙu"rC˜*$t$'~xI\V6|el87A>i띐"jT^FV}?W3{ؔX/BKG3Py9dnZ׿W1J@FM/^]َQ$w6- b3ÕRx - Jxؔ;h[Pq'#{̨̞g9:/;eFw"&X:mr_ˍˇvo7E4]TX Vε6FfekXyU6:Q R:>^Uۨ neM7~ gy8%ofKN<4kɿO1:׶ +@K: i5BD&@+YV72\obIO3OVtC_F%Ӻ_J5~b6'&N1/ItT{4'Ƽ23|ͮ(;Sgj^_D͇t?Q]~Tsc&ܳ؟\vג)r>9TsH68qO8z c=0$ R}Bvw{wGw.t.͞ N8azmznzsB lE|sdUG$WCI/Z)PEĿTwwVM{:iDXA_N*<|.gn g)Vj߈iv3*.GW%o|qk[K^5yW{iы^C\a&C<!ad9% q7헁iu\3۠e!QWSO+6h*:L#m UMwfuCO: ovBZSN"Fy(^Jm˧Xr@ յY]{ηpUhRul>w߱{v⪸Λd,<Biq_ϓL;\pAU! `!GV ˇpNnFMqWY1`k⳽8CFjE S6zLd.CHKW<=&/VSD"w1Wԧq^CGܿ<~:8j)YrN/hI}Y.E W; @#Gp1/C:F`Aٽݼa%;3z6.8OѓS ď^?L}\1ܠNՒ'O~x0uyw%@, Q#'e}d ] [촼( lm\$#ZcfZO}D3H[y?"m:c~1MWׯ\,:|wҳ51}Bp9K$[K"ng1'o9-XGW[FgU[ -I@nK1Lgkݚh`(ʐ r2[ld{%e(%hRu[_-E\FmEm \i F3h,utVov XSj_zq [2dss-M+egLЎ\IUg[2< ? ʆubH#$:PoQýR/m(NlM P{uXrD$>qccmyIayɼ~I{QlZąIf..~nV"ܬ::b| ߇A}Z9@cG=!01KFrջ6#M/ՅGd_YӠK;PϖD!3Z삄'l^?ʡXZ'"/~d #6q|+}c |]6j{$׃0J/fME|mڃ0⎙<5Y;x &e|. NezES>LW9y{¢|Z^݅x#JmY)Ug*Ӗ.8Vȇe2)0Gm{!z/'qg-3eV`㡷<,0 SpR>9306 ŹKMsq ,UTӬ,HSف3уJlk:]ϭrwT =ܙ <[ 5mgk@<G 20Fw GT/lxĿ1*#S\imZxoZz털Fu:` r.bz\Ql?'DyT# of3+fgWeOܶW4l/s4\`w(`}71䉑 εWJt˩V~M0%\+!;Qe #*n6.\]Z|<+wTF1ιowkش`SAQ]m'mY{n9?MNB!m5~=@U] iȿI_hIarvI5q.O5># [`*|*L{B,7= [_y#z8؀sL L rSF$/ =xur,Ƥ 9; _}:F!W> B\7 Ѽ2'qvoUľ 3xr4Xj)v_IR ̎qoNV nF  ఉ?1&Qt#A[|#oLNsڢEL֙ggwqѐoRle.ȞR;/ y9@M@9aLkFZSS9? _Yl_HPp t c;tE9m,J1gنB`)oh)째03* -7 ~G~uu(s J۝*!KcǝnDqvo6#;dyϪV }*]X~cG턐4ʙ* HÛe[)&t|%lO~ܔ.{î)`q2+C6ղƯ*#k+]~I>ٴU{sq3.ڃ@(rͣ 8 탈>=DL"#2\LKڠwKEVڙbc,*=40UɊԅRΜS^O׷ʳQ/rlSՋUchHYM@JsAo-`\ef'%7e\~jhĞUY|~yߟr ᖆeiV^=5~xu:Y;4:i;D +fu"O048܇<[54ʔT0O"_ 1``pBlRoP22:G&tFsbLt6f4HhNŞ{z]5HOtS}=m%s[zFg~MId"uZeocۺUr;,?g |rb;gIZb/Zk8'`(ʗv3N$ `е8tݜuXFC@j."TM#FylӒM |wؾJ:Ţ@RCsys:pںI O^ Bxթ4ب[1^x}xX;H"նMȸ, YWRu? w&(@m)#q#άqNsUWW[=sa??/z;Ë o6OIZ lEg&t^#"9n/zk,YV,j ?Ө\̞ ۵oQ:FJ@%iJiinzs~y~k]pq>s㌑qjBc;7erBl[: j2@?;qJzіrXx(V SZ:FX4} Vܰ.Dmp-bcSn9UC9Ld".EaDS7?1b`pPSӧoMCk8YgeNҨ>Dǔ4WDǤ4Q111MXIN4j:}_Zf(X50.q={As rw{$-Ԇw1R2Wd͸ 4t8hPd?`=5k~&#i,VHHQ*0D΁.2IBl~DWYkQS1ʟؼOU!OOkc1%5\H&U~HxWmHpo 5d.朽mu$Ρ\"bt=%i76$dsaoxDq՗E7JNǏ1.t0\^2ڐ 9͹caqI:?>& \'j{qjIcPW.Ѕrq'=FKĥQ ͈d[/`ϥS ,-eG0P{NYuvpO`^LIx<7gvD1ЀF\ZrP1ĝSyR( B SlUoLbr bׯ"@D} [ eaâ TBWe%7*eczpȳWOmLN(> JPjta0MK*u1c`)w'8k v;nxHTy] YǬ˽HK/dO my;/##; ?rdUq=>#h hO}X7oztʞ,8@}\{pnه0-0Gi4}Ue_@؏m,2{m0LȾ ip3*eEdYWvl<-& 0):&ND󉓶bo۔IB9v@GY ΠZHaXYM  \N?IE*Z@yct?qIv wIEOG,K5n?w|&};~#^7t 4l\XURͦw>' WGϰ|1uJPsr!4@}[9UӴB5Q#Am\ R4ڟnhӜǴ:I,}yd|_|P,=Ɍ"d# ˧R O?Kv|o|g*]3=}=BwT:_.zM%ovVL-5_?Y,jpdƫܹS2n ƽr_MX)ϑO &OnFn'ˆtpT-ݍܝ}B2# ^~MdTo0M{B= _KvvI fWSVA,dfHt(8wlۖPF[ Y'ܼ֬KhŬCaAx&A\!,ćs/Brj%:cn<6]nȮ VRG|yX奕J1_ѪƑOpgŻjF"^Dbo.AH\UEB{3Yga[Vg㒯_.jŃn~.Z)UYSR?RD}eM Ra? yi0wvW]5t4Og EHȰ% 2c3ީ^ec>d,l0j , ChC5IBFÆPGacA zob'=X56>o.qo a%n *<,GCXK۳Qy:T : 38 i'4~Ϻm~A0>K0H/>)$fE1{EݶUb|Ze.ćXuqV`έKdn]F Gf3QēqЕĂEšZ=<$n5EwHO;!ԅ.i#GOX3<6e3}&ꇟC>~Eu]Èva.рw+wvb0LI':Q*NdjnLȊH̏Qy+zCp"eU>m"vP]/ES孧y7%kϚ/bǔUN>~at'9Of2][>a+8w+&NH_>S5tFHCdD=  n s2WlϯhGQZL!dk2d9a7Ln~f߄kǜfS "K"|㗅(Nj!&.CB5t>n2ocPl_ʳZ7g;f-^Gt}< aJ5W?{gB_-I3Fsb%4%dr9OF &9"_ )f叩drlD;Q<ي_縛UFNvgV/Rοsq}M+"X(ˬ\w Ms zpx_>aM> |#$k`@&]*+*GiT;׻۷!j#fܨP= ;i!2j{Έ(#f̣/)fɖ(JzbCF!i>>P>2e)uj^ âp6h*[pS66bӇYON؅Iy.G"jj3r:+NÆGdȥQIw1AOpx /Ѥe? S3G+Xk?Y D#1ӿӸ؀[f4=;tgBSfTVoԘOx/ 6Dr'0p}# SJ80fZ3PK͸:f6E.;Ge=_fv"dzT*N)T[@\CT^+I^0݄3' ԭI3h*BaB1ӪprBnBZD7U_H*(t%_u}D{?q4$.[d`i*\Ӻ~BߚLч&W ۭZ IlD=HL'Muࣰe[/[UA-5ؙ;^ÿbT$NT3r q*R葘{ڢo*ޥ]%O<)vq,}D#ަw?-2%)f?/pyE+U hՆ) @.ԭ:=\5rǴna"j{΄4~2';T#+?*J$IU0ޒ{ǃNUP!ENeK4 WbBD/-mlʐ r1Hz(~uxChqGf-FsL+#c\s‘mWњSު"GhB'Q&f3Hs.0c1P >|%D$Jհ^O `\(Gw`%}$Z:G;ajAڌ6]bN{Zz_ oʣrh{g pd%ڟRG(/-xk{O(UbJRp( |nd~ 2jo9B%#2cy92h]}λQmu=ݮuOoef7Xz]XPL|4ϛC6An|U%g'ֲhe֖N;o|sq"%c Z_'o_|6/Fes"%}?[]FpoMnt$TGuL|Y4WfˮTR #mHQ_Yen% ~[}ٜbkʮP-D UKaۧ K8cAߍWF* no?'Ys'M#⿴u*ʯVhًxG7<]I -(=I#c} r 39y(9|R+eA͹%;[F#Ge,|w<ՖE E{M\>ykR=DTQZie`u@WF9N6u:4+!kHWUurc9fml+__F=%q]-v"ɗh2jm$BA"Nw9"Vsh'MDĮvf;50hFnIڗJRJcpl!(t{L3ɷgRIN%ji9eIJE-Ik-lbʼI`?LfBr;Sͬayb.,{dl]S>!ʩJZNEX=+o~so:&l_XJXa֒_ht2K;vHʨUN5G~"=R2kA!6pt2ҸAJ_eԹ.nPv"NN2S̯}&)#SRާYW߾X_G\qfƒ‰@qT!Uۙ&/kϖ)p Gb3x=%rJ +]3S>YQrjzs_*E= s"λ)0]DOC={8g݉+6(>bMChfR#?NF=I/P@ne<\r"9w= =Egv޳`r֋ n~㣕f)Y޲Z?:{::XUV+%V[̅V DA~>mSs8.y=}3vɰ+S zx-XQdI\ qJ8u=4y.yB5wY6b!=}$lU)N•b.SK2z~lHZ>b3\'F 8ouP:O,yGh(f}iԊ~GzLRMIj܉rX4?Y6]a^˦fgswyײS >R6#E`$--:؏z``#ņ5|'l:%bN{ctV~n`)Yy"C .Xo¾H3Wzl F;}T㒂=eq`0f(jlՄ9[>`fR}{;G൭wp˵{ "5s\"w 9/|Z?GHlvA-tb8ʤ:5p/k[w0LjX-_B):.dGYS fgm:~*!+ܝ*SH Ȉ. G| @mG?Kv^6!m" Z5cHݖ3DR하(](X*[Ω?r ms$09}ǩ@}94&&TE2) ۻy+LԫDnP^YJ> ` 5=Jr!} a$\ZF0*~>BdZ0OS[w|g$ޤ5ps6~QHʧh-'qSըG#f/y9/KQ-A_Ԣ`)Z? 71'>򌰫Ȗ]|ݯφAm!S\.pŊmo#̋ m!ZUpToØɻ~EFxMֻޕt#&Z6Apd{m=Df>Y!E ?|cPv;u.׻ƗaIz0zGForBAqYmt ]giiOL Mm?Ñw! c]w&=^fT^RbMHGy Jkpq玮O"kѻ)-l*O/{frm-$/XlX}vPں-郟c&iGV* $tOf4<߱af/;.;9߼_<(F9ߙ@M{1c7SYQP3?zr: *z% ~ =uG4V*Kn$;ީ>36Nj_ɛo1`$%GqUu9?b\MGXܘhm 7q^Z ȼ1`+!kRΈx Z@,o5dϞ-<id(W`i4Pշ@u :P>ˁ >:dYnꇸ i -K \<ObbTV3h4y֦Pe IL/wmC&I4=N`=Wˤ}| T{V`!,; ՓE`kSw=F}qg,s+ާb 3 G.>KRQxN'; !򞗙}׋b3|>nyÓ*Tuڧ-oI^D yUD &촙Ce/Q➘}*%dFn=fd<~2'ggHmS|G ]$K+-Ҋhk39Ę;$#)pZ*8Dw!j\%^G`Iu1aʣ\%T7R0+$o o1ߢuJ{:QeHѽZm۟B3'A iz/$Y];zr9ag緥}*>;٥8j]bR:)\U\4&UG?U(5mo:S2CRDR_'H/uP*Վ" )_}AmXML&͗/o%|eTe/&<eL.Vk kGBG66ſ o˜ U?Y\[bK|;EJbЊptK%\wwxyTOp@Z?裶}G#Vϟ97d]aO/ZX}`"#@vl2^ɳ NJU) n4hJp|D$Xcz=?yMǵs_a FL';扪Hs*rz2{>ogG7V;E:CKsC(M^i ȩQJ hFG+rE+8:06|Kʧap(b/$$#&ÕAM4QYD4ZW\G4a 4\½,XzkY{5'X>M3wZ]x%C*)糁'J;E ;^e}1~G)jvizfVhz up}aռZh]xwa!WCbwxf*_zck:9$՛U#Z.¯ޅ瓄_eĘ*MbY'u?ԟ\R A;s@b^ "4L`t'-5CQǎ%"*]6>hEqF  5~o.:ύ5(N_ct^>=V#`Ҟ_ۼ߃rRc`g \eW |ff'ZBv7 "? <0:\ĺ7ʚ^n ,K+,aoTyꍔXTO*M؝j0uTǙJlWvׯlkE x]qN5UQٌ(^j \9NmxZ9X)yk޻7_ b;l>}zLilil-0kjtYT\"u5cBYc$TXq4Ӭ`^E=՟:A^vG:3iFYi[IXjϊH8-跧F0SђDsSխo%0aO{6Ac3C5 /cT7|ELs~ΐN >n/[MF}CTZ7&mO# Y >Ӟe%Ԙ5S|o ͍ nġ2&Viy}2QHJ +3=tqdUj٤]A_բ.k=!Nrwi$nܙG|kخ삨YyGaW~2zG uR[?=~kq/oכ7& QNXZ-9y]$jgkgɘ3UoL_9Wd:#*ԫH'\ڕ7c׊L2;\Fh*,N1Yųv+Cw;WudIݥg >hJ^}3eѤA'QL+TY j.ȭFqo|_TG}oH.Ga>7Yא%NtHG]pgsm)ЌJw8siB곑Xh̲Jyt">ɝ/Ohb$*ys]%S=ܘ3M/aR-͘YF/)pNL6[!(>됸 )d7ǘ}VYV5/ݍbf e\RES扬t w= " @ E 'ح(֓lXu`Z>i1g4_Gb_ݣxB#xתI־encGy'Cx Z*)v%Hv|I.U0,}=ޏguaUX{yڡ̹ Rw{2|R[UHBq=o/S*}bkHkl\'&EN + ҹb4'\R&(TKt#tPFA&>hI:b} Ҋ *=h;Ş[܅\ANjg>DN9Ga3p^0'ο#k (*m#-2I*̘[,DkbWh ?e+pCEv#6ev[_Ix͎{}DevhA"p5bgcv3Uk/c$9e7KnVSډ֌:$Gx q|f;*Cj_m#9jǝ ݕí]P58X" _yIsS|8yRbnfY䆞$cO4Rv{3DQzQ[[zmvsCu;媛^A㯾f{V4n;hkcFg`bUf`-Pfc:%3V^rsEL_TXgED* 0Z]nUK3! uxco?pFg%WRk. fzҩwDۘSdNAiIS;P خVչo[& 5=vz؜>1W $V%™Ձ?qG ݚ; g_ *H[iX= .1+6?C]wCRKr;1e*b#sQ L #zdB킏Et . \`$@Aa͐+4_6 Ȯ#8QuRxSnd +#J@$(Y~mB!D339y:wf*ZLe=z{0z&ie|Z}Q"D$dPF(C|4C4 4w7 2rU uDB{xX.:cY?JĞ *`|uk:޲vޛr^X4i "r&Li,v:!hͥыx$;рKs1Sx37,YjsT@@hߘ[zu4(Z.ǂV 3skS$BwJs 0]oF >tZ"7TT _,~eeHOa"T|ۓ nk)s:?2e} 4ÈK9ΌK1z4|7kBAFNgW&2N B"d^,laimK:w#b$ؕA%g*V_t;7Kd(O͵1/P*9jZ[9*k,40N6kmyg\4ʣogZsg4G!j؏U>\Z|̳WW~mW S'09Kgٯ_@eiN`AXOҜv)K?]ȅc5#?=?x13ؕ`?-#&2fmp{ .md1(z|çW'LwСR<\?50$ʟ X>e*xX bSRVww8N@_gϐ u !m΄Z%o0$k#,rI&ߕ/IL忡E @pC?rF:cGI5;.*SVaB" tp:Q(V|3빢GY7ۇOיI`BKeemUу6/^yfYq,nӆu484(zey5$ti_Mg&)kMi^Z #XaDVJa[H3Kka6A3:]4 mY \1!<>rEi~#dl,l돖m91\0$vߑ=˯z@4"  Gaonm}ghﴑAdo}'_mP<N?%[YCE&mRni 5@tw@ԩt.&V|nCL~ݺ4aZ/O'"P+F2w:ZoۂF)ށJdv^K_O7ZLxz jS`w J $8I18NZ?gG],w@i{q6 af$ ,jꞵ2;X!2TY.9="q̸͠KX3uvyܵHS8}ΖqO 8 b5.PG[f|;oIγiabdтm1PfNNl<@ؑ5D>ŵ8[RXj}*њ7Cvy|V+[ AЍ \#\#{%1f" h#RtPw<,8uRU§C| }G.m(s3ԏeF0D"|B|ciS볩OԮ<̢ɍS;1ʽSP4lAoڼwL%|gl!)W#LS`0mF's)7(MU~!xS[ [\q~$-}u+߳t[ 7'^R&U C6Tg w]K}?I4m27zJ/c^@Y߮N\~HqW62d=ejr+!wu׾&,@檆r^-^ 8yZd@6RUr`ZJZ XɌӹa[ (T34ƵRDW(P%zD~;1g/O2ٯV#oo Jo O+ spFV2F?E.F,r#jHPw "TSu<Һ[QASJbb-bcflXFHl HȱftpQ]gN8 P̽-m9*?{}_[nvTC!|A]%20@bBt`Aٝ:M'ZOi,M@XO F!}]vx6pW:`k>wյԂ>L j[Bq\u^wZ9(CRh@I{1Ɂ̒S Kp GJ7Jk2K$ĕSPFOE!ֺcB, }n>=p{"4w:A U v-pKnQ9 W2ɀ!u~(K "==[-R>^ҿCx O7lCSe9`5آcRqș}QG~*l=k]K"z]7Oʺ };O{} LZt _^ED^?ZIBQ74>w R}(:%J)p:v,Hys,[}]١}a[$E'ulc%D{.%5G";Xߟ!L!4 W7Wᴿi]3ht:C_!i&0/K;L]ݰU.8rJ=3uፒC=8Gua1F i, Sץ+o%k@ѬJnxv:.RĤk"ߍ4zn%{9_!xX5Hoο>ftr+gY8ǒҳ0'̡s7l3hnѥ׍Q`ĔU eO`/%O'ǩpJBT}eco՞~ igT ?ڵbHsgdAsq9JNJoIT}%~q.mA82S@̋^y6z1g?c>`RwW ,ORLexG/ Hl/e5r\5|@̹DA$4|Yz}:oaʞy'Ś"%gOzܖQp2sǒ؟6717oqG]+Q+-} "3e.ͅWh1w߼?2`/n").L-qn$|cA0'6 *%"' Ћ)fZ*M+u#X l`Cfi]r|a, i!,`_|WcA"&.kl5E7 5=c,w[AQ5LsOoۯYg07Bqo76}V?}r@%ChٗV u*־Yҗ"Eu]PfܼNMX|wW*e^G6HL Zp]k3Xfs@ݚ{.ᶌWձ{ |p#S*.) lnY_ p<2?iOPxl^3f~ddPjGF\Аz?ddоmnF{b Fga[f? 0ZNJnL#y\hC3&fefWPMPs.a;NQ"?ARhI4VÁ :]YV3(xz`$mR HyY ::\>Byt#l=iݣ'@{0fzOᤷHQYm -3c Oywҧv'(?&K@$ksm-DRR.$2΋lwx.8uznVw;Xq`""K:oCvյU4t )~YkBw|'2\ӡ*췪QV#ТKwV^WNv6wэgB=2-2ك_u3Ne2[ ΀EUK x]=z F 6g)$&1s6`:k/}{J꺽:Ey':{_VSVH;g1We%a73$$ ֻZb8Z.SVcI!PP5 2ѿ ȨCG\!dfh?Z{ jb?6TQ#g$Ws=3rBvˌ,֑ 8 !4L˻ 0U\Jo1vid$@QFGh=)=E9Gݳ"7Ϭe2MS<.Тz~Pzy> \ t<_K"9r[rx^Bu&pN0-x@|c,εPXyUhזBS;ăoiQmt˷[Ք "ǫlnxTqmx焐VNM 6pȄܙk%kk+tf(\Pr+x,'&hz2EV NCo~_lmefy]˨8𺸐b~a#$@EQ-\89}ffTt_-m$w? C.\9?+S#/Ѳ0ɰuqr$mV)JF- b Էz z,Ƈ\ p3bT]ut/)KS}u.PqsoSw9锩;֏f_4n ^S ~֮ET 8C̓8\ |f7"܍Фrd%թ3E`2>JhK/5!7 LҩnfݨljF-"4MMҍ8v PԹIS[žKuF2V Oת8õ3\Rm'$1y (_n^?_@W:7%l@PNCq2KIi\^iUd/5 XW(ઊonfnvIңG {, )`/{.r$*j)l X:]jW=x~ѽg Hǜrvg?Q2 M7a ($ `W7r쪱xmtk9o:2Bifv+(8 <QF1V .v`ġ:ʹ՛*&ODJ?4yGɀX?/G"'ʀngvN*| NO2p3XN< `5Lt,F3r-`56~<~{PJQM(Zأ46/Dñ)oڠ< j1k]24Z~'4 cv](g9NY)t)gm^Y"Gwkz:Y;h'K4ulSEq~=Vc HB'z`vf7سB 6^l@yEȗ3?hH`x):onIޛu͓UWF@c드X#WyBZvK);5d=i҉8^}|; O"wѭzI{ElK˃E ø^!Ďދ;W?>5BX_\:'mj!"< -_|~7o})8X$(Wlוi{CVrEڄU#d0"s]00ly詽pv6t6qtAI3 {+GV6NRNGR̺Bjj.VmܬX[Y2HK 8Zy=qtprb8S<쥘eYGMO^d#NȜa #oXylWlBSˋPR`˄l4i.6'˼"I-@ $зECzvIg'.E4BgS$.P}X9ˁdh! ͥ_[]YeA-LΈ~b/$-wg`N3|b"Gß؞siz),/ u{!ꅙpy{c9Z^5MCɟ,},Q^.p.DnoHQZy:s}?;6wOʍ-1pq~e$7I"Fٟ<8xqUZ_Ctz|R㒮J3M%1(p%7*iLGsd$d|}<.U*y?sն]ߌk5%yp}aT\SaAr i_;Fk]6sPG@4ě;/6?x)ȿ'wb(LX NLQeQg—aë WTcj~슕z!o~z"9NinLg-Ÿ빤_6R#a{2%-d![_/pפ*~ǸF%I䛩kQeME=-%r˱(UE~O.PxYۻW k4: q]xΫ6SEPGZ%t0qU`M4UJ${<^vz)`oEjG9b [2gLVlܖy-g&ݠ ]kBAWyl4pun>Fp_A5=u$ jvz9F\] ,^y_x-\ "0ĺTOEm.m9*U{N=<|jqXqQq;ru94tK D8E/"Yt=su-,rK[8gZ"Dm ʇ}Ykshqe)(cjZzzOEQuؠ_Nu;nFNIC1qiZv ciQ0JIs۩T&?ͼ9MQQEzYNFAvnM[T*rs<>> Iejk]Q>̵+U^QctkP Go1RcV>#oNJCfpY/mө5[/ƺS$""ێLA71g$gF%^A3a^5C#EЁVjMzeI/~O#|;})_޶m!>ѷ ?:l!|rb> EMȺj8٫Ѹ)L!!t,p$(jrtͲO7nm%w1gޔeNDeŋK}^w"\Ƹ|mjE{,K 0y|_{xsv.I+?pkF;=-}/R9vDZḩSTAgm\ o+pGв&gAEn_;OƜ|ּ~V~f-3ּlQr͊S a:2-++@:s,N*cRk8YĤ;wǠ[$R7J秏׹~ o%h._&Qy_!V[YB'bg*t;oÿ44FA@s|8"w>&nf Ĝn>f:":]ZS:oޙl7U(I]5%l%`~3Cܶὼ^~m=Ug.C9M~ ''txCŌCx2#b 'ݶl'N/6AH)cZ䣞0d]:%^W몁<]_Jx#Y؜.OI_ts,PIZ=˛ %fnr@;wwޑ)BeT€{^[[+tyXWFYBVgBzAy$ђp7'BiV6o_\PM_Ղrڗ'قW4մ# #x=z}9yԴn.yPQQ&9xU3{TH_뚾%zrޱTƉ@q 1Vw"DtL;ahؠ3B> ֳHip~2Or fLKIRFaˏWJb(r,ju ʡUtk vڼ5: V4<}%rxcUy{4mC<̼y9)oi;}@oe&lz$p>r)+e'yG̷qihS"2[pv/͕(2}v?{5W}npQ1Em{5Yk'mcsPH1l5u+Mhu/}]hIk*O#&113p]v n[`խ] Mo4H>vmJ9lj?3gaȍI+)|! >YXٙ}QKWV(ePǑ tvvbB57]%0/ t/qhls/W>U[G#hŰFt?IyY7'y3}ٱs cͣX,h%^3]&[&b[I>)XBhIoۉö~кUQW~ΝIHCX[X F3 о= Yy\BUw7}9EgV/@ag*/YFuakUEԱKϒnM&a#Ŕ=SR "Mt| XpXi~Xr(xx)Ť[!V[T_S+Ru&UCU3,LAb[)56֊WV`~%_\0u_C|2-Q_JGpTm-r 4Ey?`I W0P~8kߪOCD0jUB{TRN:#0㨜3.&i*zTsZT<[%h,$"$˚:?M#Rv)rï#I55@eBj@7ok90:`D[cتI/m2~c#! >#VB@LV5K  1a?l|F/zl=)zϦ ZWup" ݻwjKف@A(cL[㲛3n)FTb)F5`:n\jCQnV+\ 75]&'D~*&KJXZ\Σ6p xTƻ"4S0-v,iS aũ= rSosaF nK5(yV  4:?q]nL>5OЀf~Uӣć lrbOcU>m܍=8r%%J+/s:!TpǓ*G_ћe;yEA/[ѾOݿB@JZF|;v>iF6An$h荍(OIz *7<3?Ӈ&#)F]!lriMP9=^hӌpf65lÑ3L!( 3ڢj.POAdWi?Ŵ_Ŵl m19rLgݠXv !1qwиgg\D4pLQca6EVelbi؟;n߿KnmW1.yU) +[.AXOXz5IqS+6ڹew&!t³`׾\2(jNz֟/W7Oȍ_"J!s}w8A]Nï9G w݁8GڝE$aFi QVI';}TskWR`9Wb{<.5..kkny)wXqD;esC̛l%گ~G:]_*ˀM* 02 &JeЇ-gUWKMf\G# j,3:ڝIk W;ty (2!פWf;4KIuT>#@#=*.g].ҍ}J xϓ?9%:*N[<Ύ(uIX+uGBEL|'xN8ˍfK tzğ˶W)_%5zRB(ZG :@X29KB"b'GF"q$;beqtM.#vz`az1ͼٹiԌM{<喚N=oXf@`Ou?JNJX:4j)BpPL7s:n I9SӵX5c*ԅ H tՍ:,D|UkW,SU~ Jzٳx;'GQQv2ڷvttPm;lX.XV-N~o4CKS$k%k$Ɓ(t ̚eWqv%<ɪ*oKOMuOJ[U9BNpė⸭6TߴUqK&T+#@"\n)GvNKOBc~?g)SXSAW_ӓF^c PURvkt*6g^k^V8Ė:?&:xC#N J &Kὕ `+Bd>2_y\&$ڼE$e-TcbՉ6R!j5k +O?ϙW4j޾Zõrq X.eiN~N<~r:S leM H#h\'y%=ro˗ay/oӖ,g:F3eV| ){yZp(?yf_D|t``̡O-*| <;rΞ5?ѺZ")u5C{z@Qyg Z}l! .Б`2Ŵ:E??IL8,bԻLX~GAzo+[hK,C^JvootOK~5kǏ:i[ǗS߶}Xi?=8kXK#"i32%7GN@ofbEJl@ o~tYRw*Mºzs08{{(Z]&񳀠hu w%>z#eH}_iPE^JVu鯞&- gX!n3Gv_`cOG0\гS 's@jxS/.ؿwP;D{w3A%oZ=姟,%i-878SǬp0e[ADӢlCo078LP7$A>Ź'd߾ؼ5VQx"~6;tt?}fo=%Zao_bl㛝$-8<JJfgd[ =68.5z^\QkO6*})"M೜p>u%%+;)zESr:;wx8)GRZO\LL,GP;J!--aFFפn\TTDgY-h~pQR=u/):+#M+oZw.E9:$F]lKW)ɖA|Q H[UU[OoAb˻'r3B}絪}ÓI|xG|_ ]v 0J<n<>im÷Ϣ_YP\_XZXY~)^C~S2˒AKO 4+fYQxzstFpubw(d!~F"!g&Ȇ>!R9̼|krrl|OS*Yj]Pҗ_n6b7C2J^" ҆$G^K^!sr(ѮL^j{)LQ*S1>ѻi,h)\޹-'e}}<M;$p3Ҁv7o].GIG5(0e#67(WeeTo~9j gͿAlkko(ώho$.l l=li;V<ޫCMR8|{GϠRP_q< ͖ilBL/.,幋ܓVH 蘷p;`AߍV@Bɜv%6^ 8(ߗS6_浔x@[3$޽7ϼ곟+K;LOC!>a]7'|7s/ 鞘B7 tNĸ}h_8?ʒbuT+~irKYvkrQXI;9j{e3Ja괫k`Rs~iz3EK5VKMj)5JeƖ1Zŝ(I6ʢ$vrqN_˜wa3voՊڞ+O#BRWMt@M/j[p@QicAF_$(85E~~AL$=O7Oe>pP"͛_J9q:%68`,:Ь$"k?:6CN-v?yu vQs~kL,ui ZzFWxb[9O!1nVPzRd]np,*mٴÏgIbŕ>әc",Kg9O(vK٧%AŅZ P*GWS@*%3GV1\ţw mR?~,jZETQ%->i$kmz'k7&nj*ߠԤΫX9F;4p v&MY3ifT:Nz+2+R(^(^w"w/kq(Rݽhq H!pyo'2'{5edcq%viޗoF$ÁWOZ{؏ Ĭshk/i^jG<4sO-v/Dى4\ݖ]OzPcOj3K)+\.Z,WЌLXMa%ʼn|u&D@S z-K;A ElvabMyak!|n.+#/M i?2~$9>DnR:ڋ0U˲)렢 3ʢ簾Ӿg'-mbӝ2om_[41̄Ҁ9;̷^PR*YO#g3\].=U^>8fao-=J0iIP[:h3 Ӣ|?wVW`.QuOP{,L<0^|uuX4qv 3+&?O>+L۩ŘXTTFᕿq3)-5c/Sm z{'68 <ҢX޶TuŕRܴ Ӫ+ɇǮN;\%.Ç!?zo%*y33J?EpL5XvvI?_dI%#zx8|SRV=5Bf{U WF(S(`W~ϽjZC# 2/pjb|HʼnM.@5 j&`;ce%5a:egV?CX$^ۈCI({KAYwoѐTMUUDXyA"98l=ݐY=i,BfrohMah[pm ψt+RTopXA j f3Di , -#l/Au6Iy_4Iʥ =^__vr}vyN ?m\gfϪ!zӢAݲtEux|<^y *.$wMna1V i$aJyb.MS N63}WP0#bu,VMƑuj^;?OCmYca)k 5ҳl$OÓp/{*LUF0oYFQ֬92|Y9r P2R]0[׎((ds[>Qx/1XI{zWPGgyh{ -ׅH[$ >_rIXߓz%k)R-er3W8L>E [.})S+K1,bJn] <[\NKQ\A5L~ߩ*G `KXiKMq4VźQINǏ:~*x{|CF"!PLҲ'䃺^G^@)ÊխM_K#Qm"'9te*nsNA&u2c_d1OCQ<]ku)w )apq.7Vo~["ՠ."FAAb] pIP=Yz* + [XH#ʖBon*P7K@UwWUaZl/h2#+V*-hؾߛ3ơ*^30b\i(KS5PO 2\>Vs d91|;xNR{ ,SvFS7f_ݓ潔_mTFKQhկD^ ($}O=^B3; E Nnku) ~hs-12Ґ!g*$2HњJ݈8 XȜaٝЎZrKOΪ繹wMOvX3Z*'09N[{W7[l]ckHk y% '*;h|*(aV Ԛn&274S 5z/!pGKY &(#+%WxVaӋ$ /Z.!:ZB\<4X7}J/P6hYIth\D^P/Zov ܤw+[NW7O0eTn{轏2նq)| GGs13& qXu6 ͷF ]?ϼF?g2S^vh?3)FSÇ|iqݕO-:8{9>iu*>4DE>5 %!"`ҎL&ߐpe2:fl c/bz~ވA~UQjٶg~a:lis+A?а[Ȍ[ZQکeikE~=j/hƲQ6wk!2Lۚc8m)jzv-o)Cgō ]X5X"6þy*ř#jv/zW1y-Pە hfe 4G/Հm~rRP1Ii?)\J¦{h`Fl_ձqsQ=?\Jc{{Kؑ@JF_^--=1sCbӟDB5n:Au*:4ōKf%610&%RJB[kKzћHg驑4!wN wp%)<#[4Oc8زg.|W=*uXoB`]fÛKuӈGU| PT|3m!#L::qd{b:b`oY5w3޽rmfv]ϧmm~:n܎a)UKQC6F۞4mLs:W}HI-B8 ,TBhjŒof[' ŭHf,3xO Qw[DSw*%y p_R ihV"kVB&Q5B!#bH'xGvle^ %3Wd[q' [m,X$O>LaSoinDi<+?֡ zڜfZBVvhރ8<,'Y{W&V'fbY[ \+/F(O)~ROw<},?VZ٧j4pk[GGqo%Luwn2pTzd2?A Y#;̅RZ_~LZ`K$]BDpP}~OP/\Kue[|u1w$lm䰃VTVDڸWV&}o6aشlƷ;_r6X09Z|0]ַ-QDN|sR.z Ky.htwl ܱsV ; %/ &JifRA9C`M7Rl0ʊ5AFfs@FQb*?yO#j';s 3c{!L"c)0(klu"S=f[gYPP j8ͲdS}[a8DzψKpθQ1eȞ4,v ~ 25C,mM F>$cYLHHAE}N;[(9VJz5H&:.# Znc;kCwt \t~qGv%X%T!eZf,K/`rpE=xڧpm@S}ޡ˨e"w\!9 qKfj.͋~0OzJΦ>e-Fs㹄CsEr2]fb)n$ S w]{_/Ħr|̷+:ss|@8PWq`aAz̓L8O .~*$TE{sd ckXMCB4 p0AGk+[k=!0&0 ]/pPq 09qqC#+B򗕦у~vtRI1d|7MBܷdړ4w(vA{P:׶q &1.;$3*2k8 bK{)/^҇N0U#~( ǙjR}Dx|QLigͽ9nbO#!.W+|ްLa§XRNS] 1{ܡDC4T7I əs[K$RW=V5@ x xT2˔- SZNZܰhbmfrLCRr͞sFpqx6QKo,+fj_(6{]~o5uK0~3w2n u\, ׀૜1҆7e=tBϺ}I'H JUƌzolw ^=(#~=sjjRT~|~"V/YH$SaψR#GpNh;j7 T1FL@8QݎԟAdq D|DDJ,  E2FY$~ !vv ڦzd'PEq2 `N9ߴw\Lœ/52s?1CHo1Wzoi۟uچNVvޔCx/NC?_d ӕ@ EfXt럮];)]H&''Y]z[d;bwDb儧BQlj"G!;GeNZZQHIGW V[ah: ގ[52DD,;@ J^?`3uh~-p &GrJ"٤oդn-ˠ/Zp0n׌ˌj n_/X[. #L)g+蒔kc* ;,ZI{C9wedj21ZHh!ĮԽm<7>v(4Lȗ%qBpѻ粬MS"ELͻ@ 9O|/b?oNYrGUwƙ^yA>J#q/Œt3cr7>_{"oʥKđ%Uo'E?=ۡPf]}ʙ$(R!#x1]^U(c N7uE" PIys% ]9-/y7!r;K8T}9عi43L C %т 4e<"y T"IqTWJNP_EQ^ dVr=fh|ml޷P`c]mv^ru(Ie"*tO%mX=&`ZD]Fy~)1MxӺ^Zr1#~d\e{{;}Np?X俆˟pr/BAyᲧB†IXIgն?ǿ0;n -hXFkE(*\zLEJTSߟv,a#7g^}l}[<9PG Mpȿ9kPע( sC7dZ1y ^ @ %UE]Q*҄5P9')9K'ԣ;۝> v(. Q2d;ʼnLw*$V ~^Zvem5dk[M9+4(*Duq!nL\WeJ|D+%CmtӆLP}QIFcKΛxH JU>x{\q찼O|!OjR2K,+Q3#ĕHŞI!F W"# w O]g Լ$_f ѱ4uUiIh636 i$k:' a%bߘ(QeЇ<7wji֏Dq%Bp6<^:V- zfx]]ſHm yTFa+_sЅXyw^Ku\+j/A?f1=Qx_w@I9_^N{K_9Z $#phwi-^-kIm {5l4_y7CzJ#n2}#fɞò"Wd;]MJzϻ ooQ4y4o0a7~HoKOp{+0ul@WtŤZv6&>񕸯"(q\IHΆ a[URJtĘXe|ꛠwUZ<vhD3m+XtOv,Qm ׇ%%%?Bg = >\T;qkH#lM N^x >2CwwIqy^"e)DϷp.3!{nk^[J*RpLiǔ|{r\[f2n> 6LYWCfS^1w;po#^A^c{v8-}uQ,Rjch* S)vV |*G~ O |iGqC[-e?n7 $y2\:v*4Jöm4"]:z:|ו8kW/} Jan! Sy38e77ﴐ{N`tθu!y8hz}g8U|NoL]f&ICǗ||qNya75p@q{C+b.cr;fL[@e8EAtXtVMKM6_^CRne<)I;sB-I^:θi 6yTU&#OS 1l6-:{P r?aZ$|c{-3`i E EoHadj([u_l‚[fƺ\ " ΛII'5*xƍ\h, 3ا2Lq·3{1MFR{[`|uNpZ;H4ۄ{o'x|L ?t.} |祫|և`'<C ͝bkHpRgǿ6~-!mZC5؜ʆb$ sh[FgriAjmĝゾ lv*(QJ㇡:h'*uD N}S$E| S%l fs%&Mvͥ.Q^1Yf'R|5_h]4_@@̭Mv`Z. %)}Hd?+ТΔZ;Ӥ]qH7r)w% FILvxVQ#$KHݷH/N_wz){׀hi+JƬ S@Tc,/9Ӻ m!^ N]bXo@p&Pq rtkXOEBJE ADlԉ0_|::'NFo.(O͉}8B8bt X!Q#B zeʹxv۝ֺH2hO"/E8Wޗ'SLJ!A4Q[St3ZhO}u07W}ȚAM~&7VV'1~0AH-=fm{>O'÷Yor悌ds^roXU=O۶GN_ $K3)01m_F>Aq{YVMtMu o32ĿSWBT-3o_{&>M2{f8ϺS&A<3\oW)FȖăc_᳘o%߹#݃ds24qŪ_B]r5etRXH13QWpcauP(-tX:vH\6j"3xD?5⒏,km62lr#.BNb*UAzîEp-e2zG31IqotK!;ܖx5Y*}ԌG# ~##*0R]OPQ!TMLj˹ŵq q;4rvrR 4ЃS۽g{r9*]s_k= BJ_ĭj^+gŏYBRh~Wf,t!1#tvB9ݞqE1ϲP .2PgR[ҙ˜^'u@'?4Zd޴a]쥓ybw-]/%?|D:mn8?zrT9~ٗ sS`jH=^bK lhny%TFCfag[M'CYq6ኵns1z2ݕ-;Jܕ|⨙;=.y: Woƿ6$V9>'KmEiSqiY9F+ηLsld-d%ny8#&e ,Zmήc[&~fg#q7EYCJ=uR%?aV+YZ #bt-{d6yNNPm9 ǪE$yL%Ti mI)Q߮y-v :.T=2.۶#kb{ 4]\+(*CG/짫O]}.B75)Շϡ~q5 ҹˌmS}9 h>T{oSҏ\ &3bҗssjWh kQa~F{KXTH=(`QJg_YTN/6}}P9'-*bU z"H}iwI Qp7uqhx.oĩ%iK2L$_?y֠r`ƌG[Osb[Pn4QWF'W4Hz~UD 5e6a l|{O*b+ 4 "- >'95.%֛^v]7G\ t>yu6bpnFZn0"(Hv%kQ<76CGuoIJ<DAM7olr.6`BOn|fVo>@5_6gyh *y 9vDlX=K@m-P~qWQQ&ld TfFdئ$ܡvר扉mqGBitSiNt'@cZOWb.]j/#OcT#"}9qr"G<LF9m߉uVȘ*.TݾIFxL$uB@*1*jLSϯYGE+/1,ȟ  /J:+Rv6bҘkWM┡ TqAT1&P.tO wQj!־y.0_')iS}CC8*G1_rƬڝlL>B= SlwX.\$=o6ܢ!m$(z_q跮ƏEr:SjѹA !ȼUAZyGR|aU<Ji{0IJ-Y4mGO&Q5~Z8zrd|\2|ǂ95 ɓA誫[Co;SBĵGlqYo>o_ӵ&ޱY)Nu$t鸞\kHO)[9GA0q <"~dJI6x@߃r 6UPi{s'UxՂ2><JMJűV!+'PQbu$enhK-c%s&۹V6;$J A͘,YrBwL?I(i hQ b;}?tM$f ֎xi_lmT(vKR%vu@u^(i5oxoaeMȷZ}g΀k\L }#\ǟuTWz-Y3[D|B3F(l=&Y"! 7IӎU-ITې`~GA[Üʵ>{0(EϽqTdVcaJL;6mof,bVQ܎G7- *YvM DfU5•PͿ%ԧ8l!oG({dX/.7?3zH.CPbiXڤߜԴ"SK׵HD%'Oc:3{6ʸ *o`` +wǤ_sr#4) +ycӟڜN7W q+e=F4bXv;g2mtD~kb6ԑ|@E"8 LtgtS[-gl~j̬N]!7[_{nLcZDP Bsݝ-s ΅Y_~m]Wop: QfY1p~^ !ډ咖E -r΄dre#fsl,o${^YL[Iܚ>ڝbDl0BGp h8<<׹j0vUK7sAm'&!m>JӉ.xc]]Yߘ-Ϭ5+K8>,w!?P26ok Xv>$(8xN b]}%EOk0HFJ'Jcч_I&eE0la1*!|.?%&eXPG{=*> bZ=!rgniqre2')Olgy‚(q[B2z F󻁦~A<4/\ , dUo zg4om8R ß֭(:ط'Q*.#N%aeCoW}'[Yy/(b95VPj_:Ej'mk˯J:)p# նSNÂm> Tq{zf, 7\1C~6 %J(A;c^ +3{5cۮn+EXKvxeڮFlk!89N|-&,w2)l'+lo䲩* q!3u6Ɛ9weOtVrvKC.O2c|*XX lZq( d!}1F91bOg<,_6_MF#nkd()eYQAc%C7S=_iyhL4Tu#)  ۃbOG?Y[<\FJLLвf<Z+-~}~))@)c-n'(sAnSc*_>*ƛe|&i퓌LB 2\@I/c ٱ1ǽ W~4a?38K(΄7|V#EL6|$FAA HkjxT~?o&qh沅72կv RS Qb$ N1ʎF 1P O+`Vz-*!Ӝ<#9\A_]q{'}k#n dK`cge`4oY@Ї\3b~`u0a`tl Nnދ~ 'j?'p۽vG7xjR;k.+X_%귗{=Bo&Su\JJXA_ֆiHEL)*)hf?lJFvEfI4ܠxij(y\Gn$촣i!>_L}N*A?.?g R^$21àUFTx\DL3}W2h g}t+Xugbga0ʙZ'L+byLBw*m.4hv*g̃"uvOe@ak<d͇Gz,Vג2(r]UOXJWjz (!S!fBLfr-7yv 7_bT,2sO-Pө϶բ+uf%̑ܪd43P=${B-y ''=Gf{3j[V5RbA92:8'eYJx\\#+ȭO7a\=TcM`N2=r 24.7W}7 c=Y=릠 s/B=CO~DBb\7&g{2xW^cuNk]+Z. xs5}֝\e&;k5[t5^\\x/+\?NM-X>d|{JD}}`Z9c2=̌|k"'3P:>u:|]~IG ۳ќs: ;$fo'"eGB{0N;q]J_e}"Nu| rjb3"+L__RMn$iV`2ќٚ{ے2Ry!ŲhՆ*N<:[U2*q=%D7[MЛ\tjgbo\}C)cK>i {C֏JB'7(3'ѮIDЕ-_z#؞q>Gc? h6@ ڻx+l 2I5~AGs@L_̈wȊUϹH+?-onNJFpW[H([ $eYV:28Idp7|t٩e}pb. Lݻ q <6+j^w4 qA|~qJ4s󔨽 ~%H\{h;  D0i|~"3ub_26ΥG!R7$)τAףj񥴯N6|$1-3I5 =O:f+ gd}āT~Sxg|E/V54[U.܍SQr'u5iݗűU9!輿gHii4lL4" |hxH<7{΀,Uu8ZNF0?!#LpFjh؋>(|}?5ch,)%|߭A)m!4fɑ_"KOS5tEBzʐA4~)؎L0#("LrmzR HA8wMՖ`龫yd̬ъ>N2_OzX"nxCY%!7V)/ >F.#I-+D]>4)cɣr/c8%Y.[\3֮h<*(~I<ﻸBTۘtYA'`VGn5޲燒.VMxh| KM+a1B5rOU69CYw@|@YPaOAVѫ>x,i߰7!ϝ~'1@>#?q[ ȣ_ӷ :ݕOL w[GB'*G.O`dQ+?YY8Pqeڞ8l08o=JIjDziSw7Bie}j}P7amw.sK HѸh̆@ÍޏT.@Xľ׫}k4G[BuAҜW&w7aTnuZ,wh1U%qD?102"_ fiCbnB!~ؒԍxa&dJ;:Q1Y[wN!b:ܧS{DLF{t5M Fc~;!' wŶΣGuұ jN([r|`c6NJ@tCk10h.0q2Lj5h _-~J*e7oLwwbP}#Z7aMfb;^{II0=yJAmTgLkUPϔ/ u* mD%c=ީ%jiyIg+YjS{rP ʝ/vkL7ҖDr rlyl}ېЙk4tnG:)*'薸q@ ķ)Bchqۏ ~O|ui3tg&5{QG1sNB}d*o Hyia-)6#oy?Gc.km3eFu^>AxCԵN#ai2gCu6zR, 2vB]]\=vޑگiOvޱzj/ٹ[A? Hd xƸ։Y%*9lKKx3)JgeAE@i/fӄ9h yʁ3isVi?T.YL 0٦VB%v+@'RϘL "ީڴzފf&9W g'6@:6d1=#V}7ev{&#Q\S-Ʌ$d=6YAs-<.nKhckaeWb[5Z"m,(ݎI\A"L>04݄w`@r\ :iWo4FD/7rc.'2EV-W VoV,dk{ 6]d"H3Bv6T4{Z4 mz:IB]'$%qloγֶE7+ipEI?7NQ7Ғ!p uUmy=4X6O_sT .:𯵇\_D%V+gtҺɷ] m熈T:6"3 #:5cm rL@_3ʧDaGmYo|/܍,͞.'8P%FVJ苵v MUʷ!**UFUS'@dvVu7Йbymm>H\_ ljEVجg`#(L%S4uժ/rnד^G,ZS%MhYVruo 8AϬwzEjZhs-|pb_Ż]>Խ)L΅ha5[uM累WA/_?^Sȓ:'Z~&Rm+E( ap]`0 ot U M o 5qw9D#)Gt1p>=0JnT›W݌_1IWi_S6+A_y|;F+Qy+0[R8G?Wc/b;jjh_fZu(*nx^޶y@7 iU+̀=ޫ=y#8huT"񞿱}mhzfTmoOWw@^~Rٸ#@/xpR fg:c| ZTPzRq3ER6Kx,G8\Rjѝu$q ˯rh]yXM{n2?b mg}X.`jCJ}JS؊X6:Xl\$]ǖP: 1!gFlGǚ>W)0G1YEInjbdORwJV3(W$H3<ps"u+Ȧn\dF}xe\L u(M_t %jr?N<|VGcOB嬻oV8~"}.+uz?->8o>ӥT#Iyd ~ϙ:(d_v>'ʺr48 !M!OZ+J +Ph賉l=ʸE;XJ}YCjVs7 S(wF 5ׇ}Y-M?79e۫TkT.sH"Ò}Z;CW~gh8$}Ġ淌_P,voGry7O8+ZhC%>#6KRS6h+hJ_uѠ51Z6.,6A$f?)sD ~47cp65LnzrֱEɔu$D6R!&qW(+@Br;a;\}φ6jkJ[ d|D?@v=,?ڙtW٨ (n> EyɢSjw6vP|`|m"7]w\ lr?`=&B4ُOUP,t[^Aࡼsz>T6w/Nv#ڒőO̎= S( [,ض %mt]hn?4GOTg|3muRnw]C}Jj6/4|.X 7). yjr`- \Yn~=A!͸"qopV'ĽXqp ݶclїhҠN`e2톫n*DbQz_sn-L7NK#~KB%QX%K< # |.:cOݼ1Ɠ *,seޕ97ZUKT^T"y'>#ɓek55d[ >%j؟^7k`%#`.n#k?z,3 SQC@2˧ B(q7woD0maX6W!qZFgy,ZNJv Sǘq=X~VhJ oXo9hG[f h J4] {sA{?AesbYQNY=lw^%ӑrr_K5~ڨ f Øa {S`'gU{afcQ×#(l*X=BxyL{󘵚"j^B%ݽ+ah+}Zζ3bbG}#!#0]SL՝9ާc^}Z״IigUiˏ-ڬiDkP۴Yx7]^/?E!|<1S ϵ+DeGRY@/M CbB/& Xsi)<=eIP˞573eYEڸCe4iukYZJտogM1{ʈdf-$>Oϯ\) yO\)]ur,OL\]II>>iypD{XSD8 Ju60z[>P?Hlc[בϦ4Ea6P^ESn,Y/<$"֙r ; G:.Ti[XљؕɉU-49w^z^ .PLlU5%t%{`' aWq1{X_=^< %gPCHO; {nvIcʣc3T>ɓrC) %lU"ޛ4.;Wnl͝R8&Un~J 0<2b}-ț$9A.]xGj|@\7o+b쓯J S[^'+s>#>iYffޮXCu+ӱ9(MIIErLk?l( ō=S~ b'X$s4'=HJdI3%DSEk:|?_űg<߭wKj]@|9!\q_rFi1$mއPB+@*.w,KFHX!eȌ}ZRK}_%bwhӈ})~c՗0 sI㉏=xO~ >=5t!;ؐ#VwiE::CϦz%ӋIYRIi6Eso:QwN=iP <%Bw2 yNO,`^>Z F .FR]m1N߱~^bE|6 3]4(!w?6bpMN !7Uh?`i*[(umijefal;,BOٺVa R/rB&G!ܔΨUw䑋J(}0cYZ+4lԮ?mD\`sAɷ)&sC@.H-YqmW0]+ d)M~>QaOKMx !$t>ļlvoS6>O>ۘ j1K_Z>Uv|&k@/7CfhԌe٧DdVvÔk?j`:X:Xd\lUt]αbpe($yyNӚ, DpMub%.P U2~Mvv_~sHgȎ褖(F:2 rM9QdWK`#*{'RmilE >RjD"d?%")Lչ;IS~ t2K>c@&r2UtLkYW.lX%/i.d-P˦Po3aVEҙP'RZAm'/PDbf+l!+{i6= |ŶkҾB= t9BjzHJlg)_djN"@_h#aGhQ7ÊV%sP*̧[ t+-Z;;djFy2cPa ':O@pte =jvjNkux#>s5\R@?Uϭas~C\ȎB$ɦI>{pqm~ʁY2o1wb?dfrb:oz3ߚj8U!jqLH[DG~^]uiAo_}I%3M0Ӱd1TUE\4I;;VdFa/x !u 3yA^xpc[})5~,P<YE;qBmrl^kbd7ĠSç&؋Ƹq#VܙKvwT eri1~|Y(W 1N\wQJj? QJv]Y{e{gd|֝"g̚Uфz{o)qY30=` o2.7SnYA|ڑ|e-dq|kd0Z̻/ 0>`ȧ&;϶{3^BBQDŖr*D‹猸84|A{E*{n d g5[k@Kg߿sSe>)2oߓve⫀\_=]-5$mK H3PQx| 8Sx;5픬JBmTo[~.tF?e$[lęS3R h.S YY-7O_33o-Pۉш zB@Rk}RpWn}ʁ!_ݫ]0/Hc|xhhD4sX:*o iJ5T7HM$}5ž9 duW~/UsG֒Bt(J>CPG݀kltMi(J[_:5\*\9Eg_7C~^mb^V+9}4)@H'",D qa:釾>[HK= 6g[8ߢ ał{:e ^}_AK2epu9NNVh ڍ<(Wgi֮ "CЦ ou13J= e㟉f9'1/ѽw|pZؕ% ;;; U5_ՇbgDåV|BK*~jW(34zC|BW(GH{듹;<|9x/\ޠ9q4 [l>aMKuO<فpmrtz<ìȟ6ZBo +J A$,ߥpͧ逖A(v B*T.ف-RX|M>@u{)`|ˏ1]Ե.kWJh,f$k/V{Sv;/6O7k pI]!瑹)xE3%&TpߝS\YYD˛+=>lP~Gd;C?UmN0hۊpi)w%Aq$pJ[kQca<\^ uߐ_z[꘮£jEmaMg}ZBV^Zpu.*Đz!&^BJ.[Fke0*C;G$ZZC-ja{H6!0”_KEavm"enZYYBnRѲDϧ50qJ4αݗWC`D3 8e 4%7߷}kn mUG.i(W _YS >Ϫ)݄P#ِsFao: |kӓ 1ύ5]7>._YnL㫋N}UGu0 Y>2۹嬙sXEJlȗG~uן/'+:hr- G>9D|_в>%w)Wŀ`eoALQO.@1)eS?~B_U?Uq}ev_<}[|$^.m鿞uVi{7IWNjA*٬e{ : ]'pיϙ;Ϝ5%s&s*jjXג4WL!Q3snQI=~89.(r3tIq`;Zǧ#Ϛj& zFqZ}+"""vZ'߬Ԟ,C5ǭ1T դ!V3P/eq"ˤ;㭖3Qbf>9\Di` #z|ב϶χx#"_ Jdϱ?:K~fG΋n*oz{(PcDT ,˻o-^a'rWX_,Z PGAIǍtF }~W#L@]ͥhhO}p<"[/Y;<܁/,-ts_Gʕ[@ԄG1]$PjX2zlۜ~/L2IOc<fQB#ro=kjϵ.%5vF4w+vc̖3s `S|b̆%N91s]hkېГw}|Vfؑ0̖sNIwO})MM2pB1p[96޶?jvN\2O1.6AeN} -:ǸV̭ilXvgASHu \i>eZߙ<q .=PРv%c_-7xXȔ~Ί~#Ul?Wa/kd3lh(Ƨ衲8'/L"#uybվ1lwQ˨ :^ ֎æX3hs'̂ 3YNR]TX|4@1 $zs8><҆uUYi6x(RsJn(*kYwo;7U9gQUUiMHE1TS=A*c}ю<У? g~wBm|p|=bkIB_v*WKMFSΞP`iqҀ}<ϫZS7x5Nzp @o8tZ0U{$@N(訳A㲰]T csd%3s1|~$ft4&|cQJC1zR=VoT[I'YîR dRW:4̈TS[o"* HްWӽW>MMMWB9j-Z ).ݽ/.HqBprobp22N5Zuz6{i<ϝ1 MšPώ+:\0ߚ|_, N|tԝ[iuQ ZIT6Wm1nKЏD<"%'{qQ\X3b傇u6E;\koR tӑ5gˁݾ+ 6@&w]SPhשVyZev;mIkNażOi|D"'T0ԝqtΥ7%\dl=ǎ xM?R:B皉xnS^=2_6-suqkLRA!Nken{';@o" J4-´k+|#m#uyJ$0 @";tP =_s2~cDjEQ-NyL1t h>\N^M2ercGY606u]Xh .'`,/F4Wґ FQ.9jGQW$cP̸ͤNQr^6岦SzsZ>6}CFWJc/2y:Q2JKN$@hwB#zBYDCo8=@7oN:Ӡ3e+d4?\epAxPV|`pw v}f{5LZ[q4 4j. w_l].x6#.r2^_xioqÇvok3NǦ熄&śi3 7RB?5ָS>6"go P-nkgky3`XkQ,s{)ȧGE_cPޕ~gDmqPf(a*%wIfh啚|[* ET(5e::eN]gYe_VVY~={)2Y|yskEd"O}$jxϻ|.ʇh~ Z` LQП=8C|<| /Sgٶ̧kۘ~[6n~.iɉ/YL%u%C?+{*lƀwKcy^01HFMÃTB^ q zUŕzcB3ah?P`QsG' gM3\vuup6h: GJlZs>9o0q?)8V Güo^CDj[[LbANq~!PJI!ر):(Uc̡Dx1O~-S918=Q)5ѹ_}Ԃyw-p!Ez9fZv۱%딖 +}$y#rˊJ 296\<4.3򚑌ل̏?-7uvHoLkW6- ^m^;L9M5MW9}kI>U˥O,?Jv^,jPςHh__`1bMpL\N)"РQ-ȷ7'!(6ω%Nsoz>b-j4ϯB5ӹ#KTvO[K"0}oau'v|f^_T d/]̛>=%akrǼ2{+ nݢ?:Pt+,RKA>ےө1_kH[nn)9+Yxïut7/nF:حeYCOd>-- xӳ1,ti s؋7tݤ! g +:*~sPJڜ}eK/J=Xб5_͘1"0fWӗr*wqfԬ /*Dm!l KlD)z=ޞX`unXJE0k =>ZAx^~O協vН\o!3xoGґ^DG1 Z#;xzf{r}T A,ʊLOr(w_/#Dtg~Bt95o>WHW˿\&&c!wѬî%y5\F_:ǀbͯ^d!/*i7"4? _Ma_yh]zU:/ϰ+#?(,e[I]u ji%hVW7K;Jʅ>y^䋊 ,t4 ]bOzR\^a ^vky +:u 9܍^*&bfD2/C)Qu5PZ%i _5YOgf{kx6^v[m0$r>JjdXfd&k\2}Ri_txjH>pn *\79zӕol3,{ι5||7b(.% Bc:DbȔ]̑`2͎+ya\B\D`<f{=|L@@j5&f#S'b-}gNE>Re:N*3B;TWىasTK>j&2|dظN~UT߲Ef KʓZv;_.)X_ž4mqmǝJseQɯEE+^%0^#iQ-*SuT-|7uԐG` ~/xெ*"h?{ X/>P#ei؏/sسC6n",/n:ؽ؆N_έA#kɮ(rxsFI+(M}>C R6i*Y w. * +O= EY.|:mTBwPL;OV2IdW$\^#k%}=1oy}S+ (&b'U)STj.qxF[6Oe&ܣKjg8bē|߳ C7}X3KD,yw5kIwcV.nu, <7=N7;::\/3MӳQH~f-oss لd1^Q}fQS&X* q\ t&I XR5TSX&SotQiPz`+q3CI7=%T5)fQ0{];(NҪvOV3AG ިkOڿp.s>V z()}ud] 3ԿC<s[z^A}=Zgq߈\ӮҨFAl{n-UّG@Zkߙ(۔cu}EcsoTaS&M ,W%?_ث H)ޓLJ#(`5gD;S*'cbk:V@<S|hfV=Y#T` J Lj`R\/A{ ̬J$]_R_Y JBe?"M}tDN:L2LT?4V@ƕ Wz~47YW0{:e2&U9uOhysvB^Զx9楟+A߭qmz Y,eDn|N~W~1(i!ӪX7sK:iywqގZ#NcwA\_TոȜ9mŻ)XpH̵bPL~ 2Z|{nQV!piD?IJ&~kD94QT3ol9%_ 5{L%+M)) |iӇ[o_^Z#ru|us7o{^ZrGK"~.ted8 uh7M \#I;.K5IfcZK.>][T)K?W'm ΞNɿyYFTrwR؂<de?2P*ZI#4ce#-SbO.k0*(=MK 8 'Jk!T~#"8>U75_mtxQ?XbKbnm 6ot#]*#g vnިN_ v yB϶Re<3G [X뷭K غ&Ji#9t)/G>~6bL:9"\˛3>atij V+uo@ >wYS S3+għw>SֺZ8E^/+;1kB@8 oLw#lhjoe*ݏBq7C6H/v،%S}U/A:vAX(2í$%~yo~_qV{.I$aBsҫq-byI)vnc6HE4V'v=&Bcgs;s(5(OKW*.4-ijFE=H^3{H9!O fl7V>[mh@<}gݬYk'e@,Ex-ZPʨ{,P"X)nuOsVMrv=T M &iXo,w aU;1z‘줅eڪcEK5l;v03LqqVc w3ԗtk`%Һ ynoN*ou#8(U 49Y[̲3cr% -MQI]ʽ^ smJYdEDn8s@Yd 煔zX3|OIdr8C=_G:GHj@@ׂ4ϙ{17 {O<뿋PaJًPJ膓9owZ:p ?Mo`iVRj^Ė^cDdު-Bvg6D<9rvK{xquH+}˕C06Đ,EDOY/_lƿtk>֔/я!ݹ!sox2q Bua cFK<)#"sIȰt_." %|[L}Pw|_?T t3 C#ezm8#.RFЫyj dyalX/Ӓ-=er.ﲧ_[8&eŃmE>}tWL0_IӯWKi>d 7fnأ>'L k8"LԝUMYȌu7AjY8\ #U"D]K/ڗx6gFq{hzc-K&LLRAF'7m њ+)YMp6/9z+r'?!HEOm9]*g#.hןEqF@Ưޤ]")P2QkDVyI !\XOiNݳ{6wY, t6mr"?_q臌08i9>ʙXJW@5I.rV:XpPK}jL5fg8K,o$n|OFv7nMv6kU7jQb_qy* ئ"m2,A9HPpo+גC|7T1Cg×wkXKiudJ7Žg׫y[B3v8Q8ưT6DD ~f蜐,Aűʳ\p`0>u[YcKd1=mx֙& s v,UyY x(?0CAAͪpŪmKz~.BNBHL<C9dcd`41,>Fԝp}$JC1o~;V8½;˭SI0,Xli{)%ÑS_9l+ߨ,w-Wdh~ַǫь.md.ѸY|U}7G0n߃| ڊ;7>׍i~.#=s3b&agnHpąMӹ2Y.;~N唬A>QawÈ. *UϿ T8c&> \-6}S~B [g\|R3D+>m}#+7 fia{7XYzIWZ}[ELndjAן!\u3}|D?߸ݽc4TYG|MW)E[jM~){_vgji9l'ທj9-:oȝ➨rv d)w#.z?["f,(Tʠ6Wr-! 9:~ĞMnxQ6lvŽm^AQj158'(a;M_,o'by-xtmäh-9]HRC&cDoJx-d:ATbN>Q&꿅ןa]QK#CIwߨ/t+Ƞ=]˽6<1E$+\֋-fwD6_+7|w}Ȧ Ѡ-aMu ia9hCT.:-:,m !f՝=:4϶1 ~.3oH:/ײ͏ZC:ϥ~#4k4''L4,^̣FVf5#'Vc i<)KlJ_cF}hR01y/&zc2qZSH܇>@oB'VCI&#n餸hvQUφb7d<, s +:bjBLdɆ޿^0$س@"WwR0ŗY[& MEO1j.tup~KE讉>wHͥϐVƝY mw0($,E $uN.}jޅi0z-1ٶIC,,GM環G#N5z^V*0c?, krq=H,: :)rSfLY훑*vjZ7`Ҫ|>32[ץ@R`]uvU$fGN*2"nJG\܍2UZd>_ҽS(QcJTs}ހxp2yĤjU |\.ZeD L7(ZH63x(FN=hX{UN|ܙDdOM׸M7pMf- ҆ tPAHYK)~>KPLt߃g;mgp n8KifnTKEJm[Tz%[*!I}n!lm VENEz`;bȟ-mcT; &B5X:a )qA?ѠFN\*!堳א#:X9>ӹ=`0h1jޮּt˵4vP*Y!M`1Vߕf&%<_ip~bw,nPEvϕz$*AWӕ+Ր^ nSsv>=VZV!>c!tx^;iY#w5G(=%RM:ݞELywf&4:bÃj8 l&ːNf!Uv[#ĈN.b=()h|dk C1!;Q-z1)cŷ3ˎQ+/-w? '#Y4ܱlvT[lةNwqK8 [^!֓?ڼ1Lt TC¿%?AZL̈́Xt47oi{m36B&,.z\iZܬ 'P@$3ϚװMfIO^B){t_N3!feثV5*Ӷ7~ծrIߢeV?`- `bPGa^ ES~%cvkIR&-t{单D֟O}E4>gk/YJ{vhm0Fd53Emy]J4=*e{{+6!$C"@K}?LԸŪ8~VaǏ[ts(A9堷,G? |9E D]!9=VL&H6˝%?_şN̵PgP幙ia[-KIZ $+ٴR%Q Ѫ~9&6FVecֹKg*gbu9+u@m;v׹F`_:Ba|||[O;b=m 9ԙݘM 6 _[ckKJsC_z+nl>u@3XAQff@tTaV3bӻ#X0˧W\w6%ڴrL:gmԨۥX1cC\+svf!ۏ[".z8b n"C%*#ɺ@fYԿD/!=v7<'JG6NjwQXr!?{˗@o_*7  @!i/YE>4)%& r]MQY̻(@-bMm>ϟb Z>f[@y(UKUObJ [XN[t>eH(?`|w~4׺!ؾEi",UQ&QS1Ba o)hnj?Ah.> PM3m=o%Nuln$LIJ$joU$C|RFgӑn0j*g_1:=VDWB94;83t>Mdn`"TY3eLh%OOIqGna6̧oS~Ec@ urی^ג`\j쇦MAz-D=v(gdwR飅,?~{;)i;y8̶mU>C{l*r d(p7}]   Hn_e6푍%>kC Ew1_}b>rcV$|уrՈ)^ [ϼbSBE׏C-feq}?ڲ2Swі,g3aT,#E,z6nrHސ:`.!^Ɏ\KL{͂՚AB~:ҍRq;1wz+&0iN3"Ŭ]2aY7|yq%k 2ƘpEkuZ2%xA|b1(L! NŦDmn@xj|p" 5Y6DwdA6s A2Dүή&5TlD8[[ ;y3nr-<cP`_٣l%tťJB|F.f#nKa4wr h K +B^?/К^ B{2]; frn8DI 4= [Ң( .)uBC%yiғ$oܗs1KÄܽ$2T;e(IH픪g>MZiĉX_~AFngӿ_DX^hfs[Qik k4gYl|ll|G ž{Чg}#OF.NPSIi@Y  |Fv"prֲpK9ݢmQm?0&,7!oE_>7b uXTYpjs'yh\4&nS s#;OL#*J)@4OCrl.rwƃ,Ujqw>b%i.>4j*P^%ݥal1xDuX^yTDH?gݱ%؛_-Evb"5iSib Fmd0eG}pi?C1tZbM^٪a(fy(*Ypg1oPfp2šGY'-o;x#0=qCWҗpfzʗd *{ܓIMxE/a׉F5J$wurW7"oY3;)6>#<_5{({ĬVkgd]),?;dHIIALT_U%[:\n8 Ǥ0"XtӓcWZc1S2IdtӔDU`$*bg GY򪺍 Ή,gl57G='ԵPCZ U}pd'''0v%=TCz{>Vhw1QG iR-JQճz9CubNۛv.4!EOGp: PpQmB!lȑVUV|/(,qw/Bg ?.ŋNV/ZkFRYcnaw Co+ҭ~*=d )}R[fgB_bΊRF=r$M\Hץuu=qxX\M,yXL)=g_p?J hހ%a.=˰cr $@u]oY챦;OKv90jڣZTqW>C8Mã J^nMtq*7eJ 3o?U}RL^6*:C^bȑ[bG7.H)7yM Gi[LEpFQ#S G]j*)yE.#t=kx,2Qɷ,QV*_N u#C=e3w֑B*.P~u7`zҐ 9`AIf埘d!\Ys?yY}? sfgѻni.NW.Sn纀4eh$gF:7ϧ)/,[g#&ֹvWGnRJ0kOOQC ~iԢNϖ7_ W+<\єT^W"]Xm/?_lJ)JvzpF,Oqe$ O+:Yfk: {. <|iUI&NLd75>;tm{%mFxq^g">ܺ qp\-=3Up@$s~[^ m^A;bOW:?37hx4IJ:Vt;Y%z/C/l u㳘.Le|HDj}JoKxԽG2-lgc^$^$4cqh :_c0qgbn[}r m>Zh=nz`'lu5En}2f`a546@W.L֤FHRPbVs=>M-er#m/]@.CF˱NⶳsۨPu'n^ k1ooTH[#gH찳kf,>@E]eS%Yٍռ+,΍3޵m!R(U`J&Nʲ#fDKYʊ(e$2q[ |m&r2VfvSΫ '~cf=O LPj}Hzԩā!kB{rqqLawE$TơΚ3鼽:LŲ:{+X8y5M-FߚY rIW[_dҭQL%Lzn48 >D~*WOq9VMw"}ɾ\W bܒZfMTk'ŀ4w1qwr9OثyR.>_j4A[NA:JcjL$}VX{ snIysM_3FrGpkSLxƮVf%7GaˍƲWթc ٶ&s4,7Bzva˿Vp枿DaW&¤I.$r3{B. ,}LsyP{]9ǻ7g~HAueEיCljX> =@bވݹ$ T,?lq t"/Y,obM(Z=c GGM{=1 CJ,҃ϹM$~0>ž"~{4ܞt| 8껳O8!!yq셎@HZ Ju 1D;i_K_JMqQt\Tg 5P.g`HjT eB>w%֦xhvMdw'EOIjsoYA>'"o/V۫}Mj_' gg{Ƙ9XRoȾ7 1:SqOL l(0)`a#jm}.CUJc.ܲK$:FUυvcyEoT?T]Ӷ \~PT:M(Slh%XsFHNHx۬\;v$UgWx|mTz;T{FxrůsFXX=KI eUU= vuUFR4d &GiZ5??KwPv:-s1!,aDÛ^;5J:mfNw"HJ,x5LXn&P8sa  'd÷ΉQ]8\kG2XB4?# wRXkL p  EszN*6r'"_ <ñ^d欤[7dn~*}SJrf.tz2=lx8د Z:jS| $@Q@0ȳȰE'jW/6.QG/ ^=&EQr XE2;"ɂQ%OgM_٦׬T[/pR̚|{ '"Lp@:n-jc:rY{m$o]5( }C]yWGL%e]"s\z[X}]?& V@fHeʜ ;h<: cBlߎVA>Pvh|a#9O}6| QG Ir_K4$Zg WU]3R014r25)w->Idn (B7V3Fwm2#Q804[܂WRB8?#qVÃV6t*!(if\RqXE{i]ȴd<~yAr'?dbl d=+1d`эFL\C7a/P-+ aI P \{_'-7&o]l_yoEXĀ+ % ÈnM&&u] L"z09A|MF{O-L2od0p& 뗐n xHohw8[DbNCxa%6N'qR yT:DjmJ˷1$9.>&tKңz+sG=5mP8ĀK5;.P+gҴ ܙ_PeAO܈֡tP,'sOld/gWw.ͻ u7+7=Kޒ'"9R5$,wfW^1$iò4!S4`m%2eWbÕӦeܝ,yY{/.+HؽOmܢEd/j\ڈKyb6Ðb,udPzқY"]"fEy~ezOċ[}^$E,+`GF0%s.E@-Y?>._cpȿ \h߂/ g-)ج, RGб {S[1UXܒ R7)(mm_Շޛ3;vXvFh'*tUl !ko#{>0 #eN15Zc!sm vc='tiE Țx{6c_EL!2MY.&H޾١./Ԗe̶rlJ߶*#:2Jl[C!ڃe҃v Ul3^lڴU 4FsBNn;/z޶9%hpESal &^'G k6m'D^k{GO4Ӝf`J7jsp}iI'0^]vSDsZvncw|X 9HT4FTuݜT4zye*$vctf.y yR d lx?P,S~^^+T>2)ҞDN0ߟH7+^U&DNg &߼c.+DeDQ‡uk?1pd0鵞eO lLPՂ+k !L"||. Z#ymg{oN1M ;]=)_13sXb6ꖢQլZx#ok/\"3+<ȹX~(SɥENbn"EF䃨GdpJ'x7< s_in'E2޺.gb!zĈvEü%tx=FYP^vhPS+?7wUTC)?0vԷƀϸEi5r^jHa+,|-5YA8k$ot;E91vޘƵ}4co*klf s\z"mv;߶GX/YWoŸa~.MkN -"ZnZdQmسd}HeMa~g4.y3>)0в3j&׷ ;(Nmp{0S mzԫz<| ǵtPG_<Ikק-* @F %65m&n`Igw:Cm]*)Q9Q uy,z ΋N}m!0ߟY|UhH:86YZnbx7ۂC^$6'̐4BC;GfJi39q5J,F}Qk`O" O:e@4 VSqdɴ+MI΋8Q+ͱ<ӇpLJ/2uۍPNGtTOʟ@|Iev21NM~-ZH?KoAQ.$q4[MR-╧S~ 6i QG-˱%bG 9N|.(E*NQ<c)XY>59ʤ#IZ"ѩ,;EqM-4żKN"SygX%pq5NF ;[fZM3[sW E3^0N6mhG>v+CEsc;zљB0N1V_&D$qm |+?$ZNQ8M4S.4BjzJUe܌Myh~"&e;p4 Cvzo,E=oҰU|jz bɣs;Zk 3D&f35D|J)RVY[T00H~F>J`3dRpts`z55_4F|,2s33y _U(U8lve׀5Y.$QD!3$P{^ mxяNM$!vF)oct~:>=ߙX:04s s1x&DLujzS;&=ڭA[O\Q>7 ':eI](M_YLѥxG7'jOpsQOP2BVy2⏄_CLG;כ҉x۪6}zc<(eÅM/z&)x이`'(ɸ>|Ff*P j5LW,bwI؊y}_VNgǹ&SUA< O]jî; cݚWEBB.͹DYav0# {֫pN_u]jH^ mn SpԜ']1 Ӊ/5֣9\KᵅhOɠ~1D6Z]‡`2ېg&j!E(+ ]=z1|cAOd1Zba1I͎ 40j0\2V;TQadX@+73Y KG*~,]skȿBODY#q[Un MV;SPuz^H\Η"= ̛nIk}eNJ퇮gˀt !YL8Kbbmngaa 5u1b:O5>is}Ue^CRoF !ao5 57,Bno ~&d풩mUpW,7y͓ۼà|gjG5r/b\˂&yNէv3us["1{$ę%h٘B#J?niE~lp(B^f}ƈrCVVt%0u5$%ϋ78,fw"koT'~~xED5;#4"nSo@ʽnD&~ e(3(VZǶضƝLտK72pj9p+2ȹΔE] $}^em{=Vٻ)e?  ؉nk&:J!LPkG7QNAGVmϳNuUu Tnt:rBRnAL =·gG0k%';y7=ժn[#8^3dx/cNީ gb~Dd˯b3oqs2lQs2=IӼM`YGmW _ĕ˷ώW9|G'7.l9Szڛzd7awF +]tӷ1}:DlQGpSA80`t/~(rKߨ0Z*g6l o#f՞W[|4<ʀI,/ ҍz}xbS,R+7wG&CFs6խPMdi)%ɶ5o9ЙuH+:N 6M'TrSvv 1DL${ykVT w4%!܎-wB}0o,o6$x//bw~+坂 O dvU 4㟗B)ڬ'+ܓy'>U9Gow0Avͳ3j\ @v:@Zxn/ ##gzΌ "81aY3RY QQ{A&_:K(令ޏo8 D^(TJ_%f-t }KCK..] ๱a4j(p`dr =nS { q-icHH'18䡜6,lA1TWʗi 3%GdTEL_1=tc k-,7X(¼jp`-y,B:VΓ_=lEC G;У*'[nT &A !3gQ I{:7l!W)$o _S6ƼzD5?aA1BG,7+AHk`yúsrϘCަ--#%-kr2[*Ghp!_a VP+\厰~5b_IjUY#']R ~]C1-p'2/,/Y}@+Qިm qsMHˢSl[&%Kqc>6ۤ܉an_ypye: lome~ߪ^@MZBݬ1!sf8RFUU.G] N)N |ζpaOH9Bn0D ^L^`".Rg YN[ Ñ)=C?Lu0jE7Ewj|Qҧ9βqGt;-DԎCɲ_+dtcܬا2ysmJI>ugN.p!fڈ; {@ET 4H';\uI4/ݸ8ZxS"@Ɨɾj]ʇ`Ձ S*UxV fNq2Y!F;)薸g8q1`.鋋.OM$9A\1ֈSؾ=LἦӛqM+Nײ\ =;H#t @tpX0Qq @$/fPIOށ#3; BD߅ϭj:W\'Ng$ Oq[igR60D}餉8q AHk O$F_7y9%;Q>4NޝonzT7LfԬr?al!_w>RKzӚx&^흿B W`5ӝWc7ཞL}"kx"[sG݂Sr?g/p4XY1Vdg$+z lWd {@zF5 d^PF&F0 qtoI_FM0횢w֞UjϯCU`Xs7 "%)A8u# 7z)߯ni-?eܿxe \|ư.1~_|{knjw휶S4פym]OBDZ<;Bo Mj!mr7ߓ x`:P\<`X 0XvoXZ U7v~&fFZJ b6g>l9vF{_ԥ>Y, *`oxDׂjz\QPGC4{aV:s׮el4$C7Et߰O N4k+F` sOp+5hOyZ*3SҼ׬ʉ Of[o[:v!L\=L̿jdŸGŷłοOT>c6V7>O1G j&9\5+C@HCVXdfTwj|y+Y)\ ;tL:`eoHz<~.+$Y14%j%/%Jij6a7ǼsL銎Ao?1WbQZ>L}Ghgr4pϜٹ{-F:^of/w\FYL Cb?=M \NoU6%&2wYZD~;<玻:v}VNƠ6|5zbm ?ǥF# ts():0/Iv+jQ3&{B J~ɉn?W+n^R:5]#TmQn?aàx@۷ae:\pӤY8BZmV]  {<1] u螓 |I.!t!{NJ j^{hc殔c\><@yq7whej8-h`l's `.TCwJU'XYӟDf!!9ANbJG:G6-@>uρ8iqXn|gxNL#*y%jrm*$}r@ڑ Gn&TJJrr~wY14 )?,=FN~b -o/u}]BRnP\9nu|R(Ae4>f|uONh(s߷$~ۉfd|+8}eZtjyLs=ˇUA}}a`ˍ3Tq9*b ۾{z%ݲ;p3^a5SIdMDptK:a9JFꐓ?闧'~?@:+G)@{0Ngc;?kK`8{9K_=wi{}..ǜʤCQQgk3wt/wx:9٤9%-m:^g Ͽ߶m>$o_/[j yI|HOɰ/%7ɻLiB,_ Iu*eyQSڧ>Ah>)5qt7JCQ =, ~{e2b=*O2D%*䛖GcOp#"0g\{X d]y5W΅'t*?]E1w=HW;Ƌn^+LԤNҋXD>}|'=qG'z/Au8$9J@AppdڵviTrvh*xN[a'"j`ο .얾 zI77:-Ω\N[0 iƌ'c&hK MarKjFl%LYnf ?;]uN-쬰'1pb*dՃ$5N^cߪ^ MgִK)2"h/4K3a s-ؾ *nVҙժՎYXT.k%&㉋㎷>SSN iӯlDJt3 DkiEPrVob+))*a\=-J*nسrM\k3zTpr|MFfrKˤ9\Ǡ>ƶ<XiHcLiF{gQH k`.r+C۞Yh&n}?BZ'T>\f9QN_l@^r١1"! b@_D|MS\6z7 [t| &*FRVŋ. $֏cS9:يZxVO cĿ c𦧕J"KX oe BD%l_Ix- $Vt' j'0zOHv 34L?%N=k+q]L?l+X*+gx*^թRv(W@)L@^kH E8CreUkq=m4姗h\FKHl<^zg?n:2`]獴Kh=M0l  Etia] 5 Hzƀ&S WǒD]W"`z2SU^ٝ3Rx\uMU5iw.Ot]!WjD[{n&,(*HV\cӈb{]-sS(;2jBdhO:7|/2У̱X"[FռӧFJ5@FR]kEnb8fY|?hwgFH iϘ/ J};dBx/EͯgʒuyG p"z턄h <'vt2LBg2f*SBt|oٝ z3k6fK1㭃X[w sh@RW{]gH}<m;h- .$p~$\]go=_X0C|N֗`Qʵ/2i5}0!8rEXgۙϸ}Ճ tU~]Z%Lj5^?^o|ҕ'7F6hBo>˱&~>HxHGG+:Va_a%a7w5{$ӂ%/UJ!W&D9H{E.6O4]Cjc/'/tBb@OK@QTPuuxD#&JO95DZgVYP Au>@4'\d[ gm!axg8fP"Yj K,o|Wv)>ukRp!O>sh#`-+Fa8^NFaD!nPn ѷ9?wTfb5I  7NXF|wgRʄ.h+Py";WV&Iʤoս?49-<@Q b711'=t㭶h|@J`*PAq݊#ƞWV1mJ.wILU([KIpx_T,u/2Roȋ5PI]#֨.4l1B'@ł)gO hkSq DY 9AVk񏍜xCLW jYz>gܤsFnF>NaZb7iq5$%{ %m{sdfY]1 RV3rFtEӠ3=+o="?^6JDe)aEyGJUؤ5gD"5O]rGi:m H|EB@ҥʾA;`"Ag^~}HLN9'cYvy?U$!17\ y89q\A=ى:pR.?78#NgQ/嚄Lel7)󸕹ƈNSL1'B\.&f[BX[׈k ;X8*3?kVzTS8,Ы] s3Jauŝ p.>.?v'u{ X|X[H0uxzū9*)"Cj2}yQUÏaN{s% }2`fr#UP9+p>pуiY姿|SjaOunoNh)SڙRowLoC!tQ˄M63VeZ :aX#Rk0-TPK\yYkJ|pkHldTB@ OK5 V^ °$|0 Y3ZRw uw?> }}̷{BZJf:NqVܜdWDt}zևYW%<-|.2|&uxՓjyf4-|׼X:slUI ۓgQ)klyAKU>{E{[^ w _Q}OTnɡb7t3Τ0'=[k9V-ĭ43 Pn'S-[UOg%,`n 7+0=;g69kV'B(mouJt,' ZH'nU>"QK&(Ow(B-!aIǽ>O'OR'X\'ae,´>1&xwBē'R/ģ ?0lTƤ^A/9ᜎk&] x@#"x44l@‡GERh_.)U4mBˎ)s=X}e3fFؘi*Đ DE9չ矔~m%6u~yUăˑQ،(;/ ,r`]cA=qp~ Xa/JJ*6ܼe~>jJ}aEgrwkX '-<3/cfEX6D?Wڔ]*ɟ oUlYK%edY,dlYRz2©X-E-_F[bOcmf|<7iZَo'ެL=CW 5;i*g?7dD";fUG3eX~KqHmKԝ" y¨.^GkL 6<@H%(=E>Y6s^wԳm'+Λ/:l <=WgKZNFW89խrVDJOpe߫é#ka f9+_J_G P,* NO/uQ^LגsoNE8{H*龮Nf]bz+J vPROJ{OZSPX_ nӥOěm3<MUꩢSV쏇T{{>^J8 Wf|[KQL{g= ). `^=` P[)XHKQK8/;zz @-DzO'jc;θ(~$PTǖɬ,ffZgͤdj[9[q78wRlpԦ>]sI4TV珰*θ̀RGRAǗأPTv@.w)]gpIRoM6S6OrUݵ{!&BkR?Ѷc <ƒa ?iY{*x㛬[d@7e$5wg3OY)-bAC7^niJ_.T QˎЬyyzIvW\@NZE8gGD7Bާ45YD?!>z>&J 8Pk^ޙ#J&1dɈ)u9J8X(6(7K=knK8mӺ&[ &F M9[IFGŠ%qȦf% :ߝߗοevxP4kRBa >18..u)TongFhTZBD^d W0*=){jeZ m[df>d Dw(lluq/ƍ^# ZztF)0( Z%S `%?z3/?^ۋd)}ف6DJݘ _`sQTp->f8'#IN齢ܖJ`ٟsIbS-i^!էl{dY LTATCj{ Y,[D/e>:dK4JS>za9Zy[3t 5lfH˜\DLӲW:ݏ_tݎJ87H(Z:7etgdny– p)D ɫro^vhGnnE1M ՙ1Cf)<`Œ۹b|vȽskDɔn`=ʒ?=oaըe佟VxJdF?W U]P3E`g]LU,N\2j(l=Ťdw>>UCb{ėQuYyO#G.r疂nRPAmf;B"BKZ4 w1aEnWkgأԍo8GkC+R#1s8-fSEpGLksD`n4|ZA'*I6X<;<}W9YOu&!ma~ޗаX:s'W-j.o"j *8`kTC>җ\2 vB>J-Kn MBcQr7zEwqiWQ|_F !ƺE9FwVktȰRs*5rK]:;g?fij}Q`~NIS?^׾$FW' 9@pM2 l[L6d2E}aj1 H#d_` )6OU`IwpLB1-m\ߐ c ?[@d-Ѵ%6,+dQ.L$JD5u<_>{3Nc6PΌC\y[⑎,!n,zU+oRF1r8?檌X27sWCQP>T\݄?.H@w"l?v%kLqgr-QґBI@fab EA\9|7J B8&r-Zb1Z(g"*1 '#A9\3h§Ay:ޟ=KCJv 3؛%\E]Q@Ljg|-{I&LOZ^,cJ^^1|jC6ͻD(9KQ4*0rRqGu m\ԹGl93Rn?a0eye$m'ie';a1m~}nH_R?bo[?՛#N$ Dɜv#)>aR_B,ľws2(+vfj 1^(po:>]I6YGjY]F)'vg@y2ewbQ/gm4OK : *G*g>~ᓸMkNnZ!ym7ϕ~qs*ԙE2fo-ILg\'3?T CzǼ\7/hC7z%b cV͌TM^&1aM! uثzǬ]&+u[W#Zk듓 :_IRWZTށ  RnzR:wD-~@7 X膼pїwĽnζdOJPaEhW.cqIkOj+$*TS2w ;1fwc9ܓ L$~qh,9N* sе(=mXJ=\-4vƢ2{2~3ԻDfBb/ ш^xϦ!xnIQEf]Z .kSܙ^=I@,K, *$ao)lۍM KIѽN<Iƍ:TiUQbk8$fڭL_ wԞZ{ۼ܏f2Qe9J4X:EC1t&VG,}M9KP@>A^GApqMKLC"EA+C>7wp1"MA9K_m`|a Mg %ONUgTIyXV>״[Ѭ E72CjߔLArC)bK_j}5ŏ\bXj)!Č*~d)ǬL8|_nWw',& xE5]b][,[ 6@'T`vrpKf#PbwΥA,;e5Sz4rgBkVszx+EJvޜ.I"awhQzD\֐ ٮ.#um;? N+)9DkXm ~$^I"^&+߶6Mxtr;: 8,KewVf6^Шmi +=udLc\3]HBɮo|;66Dꋟ]k:ԃƈZ;akm>:j K[:ӡc % Mw?Dr+;&_!,KӗzbF&(@JXy|0,ʑR3fmRIUC6ܸm ^A-]t~x0 gg.:\1?y?߻2DI^9rE&0 emWqXnzzO]o!3~JƅAsa[D~Q/[8"pSbl !Й(yŽI n;*Nҥ2WƁ#FPaa+xO5ז[ U25SOunxbV?b1k%|BY~WOgm<@2X>v ^s:רV&y"=j]4fī=b]y% &c0ggG.߼ SlR %nM6"cp7z=⪳1RV5Bc,F %i Ff*FK]77k󀮷(wEZ njduȷ-8Y_DT"584IΖM: u~Xx2e-K^;T}Q&d4B*mO>`o,w\^W+(^i)8 J7ɽ J^HLy :BЛ†Vyc!.Ҝ\'h~nKv,]#ӧueduNo Vs/*&rGl* GY6칪~\u~Kz Iȕ6tvsUyW2~}ޅ7B D>'86JL&iF;'VK0)-N+ݯ҆ܧW j[$ JmVL@*E)cAb5p.;I?iKRI+b:tI&6! eņ_BKv+M.<5UʃѫY^Z gLj_GAP} 'Y䠞+]:ϴ+doi"ᓻcDͲq UGvs+Oh&[m^~S ] [c;d?ͿPֲ>F߰QA_q&X*U̡%g?_Dc Ͽc+U]]"[dcZ"{pOjػA~ՄׅX.&;56T m ?H*ZL&GWVCM[TJͲVD&w]VwQ̿l{2[$:ֳGݦ$^o&vc6y#+-z->-LD VШJy@Cy)OŨHV?Z.!z'@ОtsX'd)2wV!h~1^.E9†9cT7/B.tօX>x[y{7*B.[Y~?_̶7 Pޒhzpl֙ /$ncڞ*R7;w\ +IZ@ҮC%-O\+x m%V> {ݕ: CBCk!_}y W?{XUO r|λP(N8 ʭԓEډpp*kܥX}3;\ȸ O^$j*X;Ǣ'kB#ch -z&j["g 6LG!?0V;$*1hvEk|%UeIVB^*gP }@h0}%8wa5YLZM.Z72ˑDĤR$ؾEEa*W[`R.@#7>x!SNJGse7q>į ~` ,)]qwڏ髩"]}=c4/a֖[ΝݬEoFHow-{꒕M$y`Nߝ̏gc%&TJ H_x~dR= [7 ʻ^0\W>ȾS~?sWUҿG& t)LN򔓱|LZѐs,_6&s)YѮ4dÃq PȖZg"rr'gUD9u@T`&>EUPJXĴ;K{tTn# R6Rgk-1+c{^CXE1enkt?[%AmvȗN$yfn/&]Cȭ X員犧oz\`?[AYmvb BV}퐝YV$XNR7%PƦ0~ytbstP(jyu@k%~'V($,J6?_CmNM4h< S{6TE k_eMU~nT@VFz Es>) l I:2+rp"#X8AˮVL~'/-|"fH[ a¤/FU~z{2f+/<ֳ^UO$kzD)i%bZ'|to )q]̲#MV H\ r @}rp4Rqd@m@ܐ){'+ f1)LDP(2jaF> }^l̒[l0߫OMa.sg<rshe۷&KL/ҝO鳽N'y$10[gɲc`yI~9{\%<uѬ@x\'O죾# ;3𶖳ޓl>P`/&Ww-% QeZmiJe[lqɏ' m!{LF|1z>׍c*s(: n?7hkSln_ZBYu;ݯJ L >r~#W&nى( U@d7ŋ6g.ppz#6y^S20>`"*Eow",yjyS3eYOI.Z|Mײ>L|>'Nw)"awCC+Xˁg1݈6^?pSr {cV6Ę#ϋ=764Trx%߫wȤ]! o_0eS4A `PWbsȩ17p]2|WS$r&E6,]ʺ4*@KD9g>Rj49Lp@B|mxFLd^X8tkS H.GszEJ]_,7h^Z1mK>+1ךtK20\T`?v(LU՚ɜX\}7hXMVOCкBmRUjt;<ä%ݑnt5Vѫե ,T x.pUա%[EIdvAU^fY My%eL%>Bwc4>w-Uؗ}j+%v0#clvsikz֏VIcj_PEG5'8J/&(OUɿMu',e8',KjRG&qKxGY\'wthC4ux+ {Ajд' ra3ֵ* Crywl& +!|vtva>LVh\8ټ*.h8Vl;27W7XL$Fg9.U2e@W7~q6; by,L NY) 98Aj3;R ~E|@U \h:}(罰t5FVHб"VBovT prd6 䰳IS\\2%wdr!cyQlbs{4P]miA'ػx6IjCpVRYR#m$M ^7n #f}CQxFZUZ[ByvQOW"+ivp-4*N߉eRe@L>jX9y:Y%0ٯ+ 9҈3@uW8r[֙M'f]IWh旨n&D -G? o4W){txA63Y QxGpx Z"bCU>B!y|kmc=~xo1Ph l$~$tٹmO ƽ1m#2[| o,ti6T3Vʊ}ݳ]LjȽ9,mM.I!}`YjȅUW>hu}RZ$#t!Uc̣T=";sf<3Uե7IVfv#}f x)GUd["̮=ٓN9٭rtb\g+t]4dQ݊ЖTJoSǗRsXn[s0;Gd(OS xB9p/=dDb2)`j7Y2bV bHyJlcM1ږL\i{g:h ,I6zJ'AR>Bvd/K֩ZNm$ 7zEhsUN"hA"`rRlyͰ<^k=b[O7No2+*VJG#IkLbuX#kmtNoŦhg: piK c-VUάga^VP{^h-KqX7EWK^g{&6!w/ ea˜Ã7$b/sQ!蜎lm2gOF ُٱL:"Sв:=ȭ9jnx6+R"~G>,aY?Ty\7v xb%.e3fG"O@$E[EGn|þjMhqgߧYx/V)?N,Eog((Xgg6:v-՘ ـ] oR,[qdGYeAaSQ5S*m,ORx;#4W?Xt 3_e. 8$e+N C-k N2,u+r ӟeʤއkՙۑ3<뽇JEUV:9n9_X6ʯDyW"Xq|FKD"&+Vޤ6"d.")85Ht*}~>GѢ"uXܹ;}mK*0!G7qLUtUd锒+擖!L_&E֕:ےo'ٓmIOu"l*VPIk@E^]1"JC򅍅mS#xwzƠr\J8ީ^3ۄwc:dT]e\%9ĕhMg6~t樝^F?g\2" ;i铡H6SZ+- ӽV$[";o[2Hw_i(Bɬ\LO'FQ07{`T,8">a#.)=Q;>ik]m u" (?ܭ[Gk\6{ M^Dn pV8% )zʇKYtF P+<{a'.1RWEhbr2x|:^iJ!^<_xk99$aљD:0e%XřEu՝_]W%*o83ϔt2z7#ƈ$R^.;`%m7x/']ߏ',7@gƨYHMGhU#`W%z#|}^!ёL,`1| 7\MB>9y!pWSpZ>}x^\Ç2- }դƏf~BBtU5recFL %QMFL w°7]?AkF7IPjng~q+@Xr 6 նLW RD9KeB%5u:?dR?a)m?mLA`҃yӡ1D.?>5.|YP.WM{[/ȸ _ m?M1`cCw ߋ^ʎF0fԅt&<)PX BP9F'mX]Ʋu6v[BI|irkyMJ\J?iZ zj6 d @h7זws ڰlKǡ)Dt$O{0n$H1U^whoji b5YvA0 WTdSc%A|^{Wp){FE]}*+@ТlEz;YKU\P P~wK6zpƉ>:Y!uOa lT *zL 09!d9ڊ.wd͟׏cZu{K,LR)riO-RiIi}{ߟ1&^sslH3{up|0E` M9y,ծ=M"E\ҧ.)`f$Q$:b\Ā=mN|},FKJ|I\ӅDYa_I+yu1|Az;1ҿ^1E7GBBsgyؔO(&JGVU|'dѩ-VG$8/cduU-dJ B#COEHzs@hAc"[l",@Kأ՟PWCDyCPb Gǯq6=d: Si9__= cC@$d XW!^RlNZz ue;VݛE rجvNLxQmITЉ3rI /5L)--ݝ4l] ;a:(35jԭŚ#;RPQ~yX,m޹yQ 'DfZ2+NHҤF V+ҷ ހ8'Yj,*:}u9@Jc\Bޢ&cQ+ ,m-WBF$H\d4ؾߍ<$8!=ut&&VA*%1ϒ y?󜉯JERL5 +t@L H=$Dމ\tȨJlzH r?L1MVyM|[=a- cnnMwK:V[䵿T=qwv≰*T;$w_i|) =?!m; %Е1$ׅuWCAd&7Ɯ@B*N#[9t~DvNhv}MB$K٢Ps8M%ic8z0W wкɕsLɐ<{"S"}+K鰒re2:{V2=T.KKޔ>Kz+9aY COr'`:Xn?+,ȣcW¯)5 KZ3/Kk-dI+ AsOkxkڔ\M=?(2wl\m] ec-dnA>ng;|[scs[=wI(&.WVhqwV!Y)Eؖ]l.D/WROgSMmV76E0*arMQ6}U7hCȝMxE.9[M1Xa# g}N{M!h"j=wrJflN{||5J͉UG'1~uT \У $BpO#Z sL~WwH;mnJB|2ZGX?p{1o%/S[jԔ1ŢAILPkܽtA@ !ʁsLOrGXöD"PX35DVXaДėj~lM<*-%k3xhfeȉ>[%וTaL+]e#i~ca-vD:˧vŏe4-akzjty@BIP'*B tAcc/.:^js_ͭBMdI?&ymX| )蟆&5o3lsa2jsē_ϼUa]!LXn[1yzD_RVs诔o:4zZD8ɛչUVⱓSY.G&-#-1Qdk!- 76.]FqiQg0-c8 2R7yP6)5freІ{ ^>)򓗎,2 O~Xكքmp%ŕL\6l匞r5)Knrx|3|01T/̀!W#>#πEdX"aMZiabɹYEp-!̏합rEY:uϷo"9zYN&_xʹf$q'΄IW F&突P&`O$ƍ /+ $N C06e)*ƫ,(}od4wMG>w f(ٿ>QX/vJ` J4"cc޼/3_^Sm7-b I'$ ,3p\M?ȯCژ+uGPo\8ь𬼰G.Dylpm̭+ o.ISO\M^Z;݈i7:*9߹xj;Vd|B}"+pOnSrE͂"p Cin?fyLV]}Zw?+e4,h*SvϙΥ$*{,@M/ԋ}L?MtsE>nt\vK:$.E.=UKYnAOtW(!A{cMs{ޓrx%Gt\Roߥ|ysc $ׄWR.1Y ~0{j\s,@Ѳe4a}chCk{ص=MKzR ʙp}Xw2a|5@LjӴӄWU͇E׻1YOn6_.J^>wj\G]<~gPtx*-rLqzHߤEe(mr{ػW+uDF-/J–jA&Ѳ&(񆢛ɴWcx9m#hkɷc6?4-%"ԟ͘l< ?u/掕V;`mtQpE꿛i) R(Ee]ۧ{wtO{8kv]׀J`,e :D\5nauqY(Q Ng^w  _Fϒ_VwNm, 4?%[1Mh`[.RZTI$U^%PNm՜&Uu ?ߌtV\Hٍ*?SXT|qlϔSx -BvS%zquH/6{1} f p_Y 7,`aL1gz`nEylwMfVKB$B,d uMSw:_%yj3pWܟٯ ۷'gP|~a. pp@KZ&EOM+f lIWeOy$MXj 8r<:bܟHu-ub?nVbu&#VZˉMB&xe.ki87tg"A8l8/#7l8𱭛b⎢Tߋ@J,nRXWo|0x$rȨb@g1u':~#+#My|[?`)J2i5"GNCrfza]:mFh aƩ{ľu!$e%´zɼY M 4յ\Msh:1{5mk 9cN>%4v c"gy3r]L8-V\YvZ'nYk~I³!t{Uᕾ7H i&y2~EO+֍fdG ֏27GtSf꩔+`_0njCNOs +xdxg-'x^5@#N#VEm?^X{0X3;*Al  16qГ^CII4!`C$'ir?[X2",D1WTDz?i7k-(Dy|%JH,-l*hX:eprͷU>Uy-Lh^0&Q{= 99c.iz ]RBoQrJ[p.vд]z)K A_ sös ؋Z$0y) ]%c}8;E0Hs'|7(s+:ά4rEȹKm^0.= 860É(e0!΋uuG5ߢbDac>Z_r䣫\[rXVa98 &X1(s'hDϤm+M٦%ނN)oyt,GSФFx&#@kŵߧ i Lddt(&Jb>D]Apncn)[{ k.?!OvBCRQ?v p氤9K WDS7f˃u{eکgK7緷v7WRXhhM@l=u7ZO]wk>f[^ęS3d/7cT9V]>bL\Xmnz]2̘5\"Aqq]#链ysIRX$7 ذmtHg-H"K(%䵍>y3 I:z'Q(gi7jJ4)/PP8ej SU/uP4Еpu8 ƌ> BNvO8(/a-6tvN7x:x5y60G&:90zI{sOIPs7FGs/ Oxi`P(*@_۸^EU>)67vB^*´,( H{N9S|+ʆ7|ׂ{H2] }m剩KtPȉ<_g0{ϪuyQ+|el28!H o"(2 >ӏl:kVI=۰8ný-+֯wlzNuݑ%d-{+%Wxleߔ\@lp>j6gv+ÂM@!ƋҦUONIҍ2@g>m h<@tqȳ9hR/ۇX=k>R!w8x#B7:#c- ZPn|zs;ʗʏ|\H=؁PD>_qV7( oʺPX|$vi-f6|q ^kyg&6#-'!Fwж$ hNPٖm2Ծ-.ɅB`WpYNSxXNhݽ1f#MK9|vE<5<Ƨ@=Y!kSZÕaQh# #PGЧ%6/D'] }P/ X>v@Y2׹i&_]$!ԅ'\~\N1]~> s+[ww$/V1 .rb3lbFЌÝ=&P&%[Ben0㺸.4rۖzаB:@뭳+/b@"NMiAd+h.Spr̤Z7SyT ;e/=4-ئf[+zfDf}pleuxRo/ZUFH/CY^Jn,(гȺ\,xa4JY,ZpA4R pN}t6>ürss{Q&(qmZem5_mzO(޸Ȩ ńdGݬ(.U~[֧+9 HN}XQ!84(Jc+0T>rR8AZ=,~{>*k$ DHc֏c~{\<:Pƽw&CC)C9ʢPKv3/Sfݨx^>8X_=+yO,Vlgp̍~i9AWer.d %h,gPl9ZEum(VQo;}=_%{ oXWBV4l&hzmL)̺J5KVII'-<恨Dni6Y;LS~[.X"#:@"SݕV`fg\]߻McX [a@*id*D 寷Ad4_Bj C&n2Y,A=5I-tU[S};yTuEkݜ5zsC˄+!lqQ^6,xlQ,|*cB|I98*|fzs|ǣa~1T1z6b#鮜7Hޣb&bCoNf:Rckhx8ܙDZ)x9AsKy]#iʞ0AJzs~gm eRΫf#1|GN T(mD|0].\SnkvA[l]-m79rV l8e|URI{ 6_-1)_u 5[w);csq> :`ƗoWY0LAvs-#b>zS1}:3WP`/Ϳ_* O[d{f tv [&c._?BЌH8UwCZV[?{E߫.?-u;brc& AW,)^>Cw舸/fHǺ^yeAtlfs\MR #Tbݹoy4)aY9WK _e)c̈́?>fR'Uyª YgOF5ݭD%t<=-rJ*6S7Xp?T3[x`r[c5ֆ3&Wq.A bC^Y?DO.?t܍%u'Veی<⮉F3ɝ@`ܱ==$.E& .%*K!mWk,qOh0,.'FBQdh#ylPoi)`y@ƀFauAw$]wʩ><@Hl]3hFwYɧXqLb * r+dRiƯUu&[ܧH`<3Fgya%iX4&'S;b7Vְ'[cq;!ڝϲ>D<|O*546-wD@LIjN~m;</om[ e !rw&}sQ%Y{lGY &0~,_:I hf_{-$Ԯ6gOFE#lf1sJBH;0b 1GTQq_؜4WJ>DyNnmȟ1o 4oP4_Mda!sP-h]=?̙?hxA1xfDI)/o4R2;շk/ ~ SG"->l'OAeK4w+lŠr}Ok,!5lEa)&j-YΊ3.Q4ZnDf`˜rٛ"7F:EPԀ_ɂ^@FDеZ>KSGxbNr'Mnl<<@ΞH}ږ9)%˔qѲL^3ak_ SQs;Wf"ze?"*&&bC*^R;\{Y#ɏnx 1P}j=xf'ho\/E9Ύ!/XΑq8|TUŞ!%x9~s:}pz8#g+Od#[?2@) 3rc&IX f >omfQQ{h',w>2~*("ér\7 lOts*@" ~ mwt*_ @C; (n,ߩJ<:x][ 9M{sc[KݑJo;hZ;Ù,uaYBVr#J~)'=+b|Mh 20I3l];Rd3aD6eܯ(\ LJeΆ;P0͞wleiE9շ>ec=$=P|B?gGan ,@_7_% V) y;L8cuv;GH6\l\'brG높ϱ Jz4< ?ba_qV_ [͢g2ЇzfXh)Bc:okfغx؝Z`A,Pou@fŹ#͈ߝ}'\(jK^^neusۜo<!Rb )'Q4Snj/0nMS]?u+i݂+7?D$ ]cc֮@g]`!T3awL˥3Wauo5K&S*MCt*^k3l{W1f?B'i&'=UqGuoB{aG7̞ r9_c& Ah~K}N/5))BAJuW1/ovU g|F4a>LeEߎ <<*Y|;2e1بvll?\J!5ْe*`Q/>;"hKу5d*D[LJ)1NlB;F+v1/5 > jAy,&"WS<'[8.zꏌoϴn-}^ZiVGf U_EO|qo"xc.b.|2sO'%j2/d>7p.FJrw##$ke.iV<ndO7V O,᭾JgQh`>izBv/RRC#DیlW?,FbjBd irQhDAr]e[n no{h&ۤsKˍχ,tˬG1URaK?25eϤ}0S6l-/#K[1Sŋ | LӃ4BO;u]RSlƯc(79=TOhBէ~Br_w/,D)Iz)J4"B*1o:TLaS5ˊ±/9^]{QJSz>j7U88^c> zf?N!ǻfPi;W傞IIoAOu=t$ qͦGg=lPB|Kм3~yO'~\&Ve!wK#vS9]o%$k, 2aZ@٦b>;FV 9"Smʚz,1_]c&Fd?FW{;l⯠D'dDK]SYDv,巣&{[3)_ H6LP_O߁ ౟+,/j4Hˉ8CI =4;1K|^O?J]dZҥskI.{QQ-2wNQifɂ]h@>UMN()Ε˝[ym)d<G9d HjI~lo\+ӻϑ@\A<B\'MS]g6 ѶqҭZ .p3ڨ;Eu1;Kq:6$\DE2{|HMeF2NQ9^PhhS:+MGO8Z9S|7oؗlh&?*!}@iu"ǕfRnùm&].Z/Ґt e6 XȪ%x5,[]Ayt>z)PObQ5dy]_).rb=0}n^|C^Ghm6{Juw[Nq~F';4uu&ۊg}NM Zv+m~Szͮ({$Ğ:T V]s; ַL3%SX \/V *VlBr;NՌsw:( Z+}IaW)rF̪^auՓ]u> fa9Ę2(Rmv `%‹,v\Z[)vZӥ$p|I͗Hq"a}GDTƌfnԲޅOsQ 8:[z*y$v|)9#3Ko #mp[`/< wJ6T=z蟮[ pf^u!r?1'%jh{Z?|)yǰ%:q=488B[{ToΩn$lU<;T8͌ͨ#hJ0edމO6m$!-yJ"3,BJQmݵ0zhԶ֚,]@SZeEТnMj|2 *t9G>BW,z 2 *|VP~O$ [9r)A yCEdG>W ְ`l]2H٪O:CǸH shxhI" 82zm\{GhBX k2/bOk fxqU.)o!y~!uDZB^6jՠ!"kфgMHC>%ʲ IYU|x>$JvsRӼ 9 B6)WH&a5ؓ omF؈_G𒁄XOGi;K7n||}Ҹ.{ģNURR -ȧYL}Pvۆl FdǩY9 ܲHV̐{iyQP- |Aq}1}^Ƞ#f#O_Xb͊zx[w63c}qWkftP-MKY)v6px܄ J#kє_]DZ p *L}3g#TO=/fِGl(M̞UOp(3c̼Orb^utȿj X X.[MHU}lBHFTڲmoy6)E}F 1[UYGD~a NQ |[W_]@{kw㣀jV'r}DZiir3PwICC솜׮C> _<(h\\4/*ޢiȾ><]ixQ[N(q A5ͪD#-F7TBC^cwq[[Ydbla|Yg9Yx4lfY –((χөZm۠yS/dR 9J(/GE:b5 8aF3^=7Z h=yEeރAt |zN~)[ X236:k45VR+ 8E^D#} ?I|ߒ7h9b)rN2W9'Y [Vڀ KU.F-S͛󍝗(rkΝ,;xPɿەCA+,XdFLMvxYC- zǐGA:oe|25&n&@֠)̬utMlذؓ(~t2Ik};3p^gyԞ٦l (Q0 w_eY5 iVڶmgVmYi۶7m۶m75ӳfu{ĉ;cƉT Nצ>,kЬvX˼:4m˦e 5/6oO[tVՔSNy|E%{DX` zwPT6*1ה.x3/}' =. ߧ"" |cޢqni)p_X rފspݔn$Vy5RJן.ъ]::jvS[k(q\U¦B'u}'k? [>x4"\1eօƫD6;NclXR!;w[۳cwއ(.d>,Єdi{MgݢuQL_zK/qS7]6\Ќ_$v|5mAFk3Bpum wbIԓ_f^kY)8LV'.ɰʨՖ\2p2͋*'Үub84U2.ҳہ5cBaah!iZ|4IlkSU5'Y'eru8? wqU\疿9qfцﯜh4'Ntʎݯ‹'H3xC ?h?8gy}E`) ;ldаҁՉ ;}:kBy"讽\1z7YA)ʿśU{)\|rTʹo0Cj ç͹Yo;Fl~ur^rBYi̓kPF+'s>*=Q &;dzؒ8gzy!wr[El8.Qt):\V̓.[#!;WqWI)p[zO&8BUY:ÁOP9C&Q9]xƉ c^I0[\'[*9E1p_%ȁVNn^V.)M|+E׬W`-~I6QUnxJɽTin8 dYeSK.&2HW5ø:Bޒe-u;&)Cl8$\[|R3fMZ4pxm.)?^OfZ "`4y׎v]mWqׁ#{pLfG1}{#iVMGMwӞWuQ%wKމ~%&\j})Cs0 c*wxtL\C5N*xmNrTb<e\'GbUDU i`<=eyUHpM9'3lVV5 #p\9N ?k]TRbQM '5DCrSN~˙-ݰaͿu,o:}xLi9J5vn7)b,XaAl[{ɼut0v4磨ij"Kd:iz FtJbUQ@V4+uM+3@ G*?U@:Kˣ=4u{Ƞ37P֍diE#6FeS1#ɏ!!/Fۄ#a巻[wī^Z%׿1ii wnR]x&QO \ք :%;h-4vOor7s/.+pw_! t2L:q[SuTNjO!ZH$Y 223dR)Ƭ) qտ g,Yzhݸn(3ziupK ]׉wB^yii %J(RcϚy m*ccBdA- M1t\h|v̡qwm1RSP9 kcMk6r ">{m *aYKgN%KYFw\l(ILި{w`,f59Ħx| #5Ei3T˜}YvYzm8WtqZ+3P.Wy(nN:.ϥ5}G7ROSKc{~7bU8,Es:WbH3 v47 ~2[ +tL?/O;$'HY\wnձR\gW ]E c3'k bD1f./`O4&S9V%re!jisvsjZo*q$SD2+uktI.63+=oָhV0 tⴿ5. ǟ>麪yTlz?y2t[ s5) x%OUtaL\[3:=vÑ@9uy|Rs__]~zG'~ԀD9 눱: O*.\6M͘)&S`%>,ҨƷU4pryI߈Ȧ2:ax5bej[[Җ'E%=7=P#3;\M6?@=Oqt)ip[˝ O'٦qS.5]K6+)bMc[I.aJRT=t{mD ( [O*6Nz KMkR.tKOwmeԐ1~AhP} H]MK1[tWr?km ~%)T!,-}=J=f c:<-%jႜG?̬ksd!}H6NajQ';\*cOHNKf+u rGKq p/ik±k%fb޽/ ,m G 1)me*J"aJ'1,_W4Z )p6}* HzD( 㿶4WrlrЍR^j Ϋ,(Q#u-1~71s1%M%>TgDrh_SMNhd4}:~auno/8 )g94ޙI8|i䱢8 w]IF57x[$6_W͹zȔTj1Nl,ghe۹:֔H? DLw<~7fq:_1N}2RU]ǿTQ?E-鍶^دՀ Ռ"XWإ!RiI?ٹjV%9'M!ոK* 4aN{TS:|E39f\ҿlzliX^m1ôLIDLV;qW-z5ousǹ[",!Pz:YG,F|K-wDT|iH2BΆp+օŒeu}տIx &'|M 6C2kToYBDVZP/A؀]VȀ6vVO&6 .ΎN@6'po~ˊ`MI +A@b]QPB o2 m'<IDIMF֚^WN؉܆܈XMQN\XCVҐˈX׍/>#@L'K>_ d~ :323s0sq*;J2s232Y[ :p+699q30һ:20qqq102303stqwq$J{=ƎvN6 lao?qoKF L r0wuPዚ;[ȎB, +??3##ݿ¡?.ckdn'N0?bd`lelmlfL{r:X;[3o W_˖ /wU}#/3%?hk` K%sk㿊/P AE-KQy8Pf~М{<}ZFx5'PYf|4b)߈J`HJ?DQ>Z%֜^:}]l}<3}?rqejWLO=.` aʚߢPTJ3[uCGF/v0Y;Ik#4v-[(b BAkrI(A{k!jg(V඀<{o2{{en^?rzmwl)X`BO΀T@2Ym깮> `rML۱iu4qxQh@umw#QTȣ,?|LNfYP{F;48Ɍ}_F3̌;=Ȥ X#49ьR6y6Kt ;:z 3*O`3ڔ8t(.ժn>t4%7@peB%.m@OȄ!u"b!{29p¾{Wo,q@넖~5 GjM6V1W^jFyh Ϲe֊'o\֘)~~tօ=;[{ڄVsB 3;;7@x33[ >} 53?gvClC 5O>qgcCJ 5=={gg^UrvCJև;GK@cK ;RY(}.@R2㠢 cEg~.xe*>҆ɣ!H1-Jqjѡ,PaӐ3Qtÿ̎IB= F%2T!n&㶹V:06zy=;$!R:UjAyx(=+蘭%+|дV> W=Q,pqaE=^Lv$?_\_? -h!sae6`J% qGZX]x%R]"&MuFUl3l#vŞY_N?1Ew=mME.} C߉-F燐 ~~-2a@aA|WwWEYA;^cD08|9V ESul?e/dtd<7|n0a57nh/ nWdl"rd;V;-D"@*nH:4c>0700wo|-`m;JY6=`xУsd\N1|$cOG1ZixѴȲ:ɜ$3x<=$l4X5mU$&OGSOTġy[@Y?b:LC>V@ >jݓ|@o~AZFz֣'BH ŷ)Gf\$9#n?fԄ#Hkv[YYnha47_mQ"^WO!rrܮih }/^\.{@.|DpT:"$ܬL=_)FS*Ld+B"]D4n` 8_pCEeYsͨDb/?sWl~23hP~p+Rod; D;3v!3ʌW-A2y%~vW<`]Ë2TҿeOK)]3C% ֵ.! 3Bd3Ng%s/y3='5Hj#eY(`LSd)%F^kI#5Lp|Gg13eG̺ßV˼y[F)O5Vll? 9,TtE% =#_4/Neia0vb @3Tk0UEreR^R ggs X衇U8FMxI 8 f(Y`5ѼP#%3EdLݒ c,@p.I6zhφ\%$?MK3L1)~$ |u_%3|s-M x0?Ux"=d.TC {0Uf<Aǐ3O-z2=[H̞aZ?jhj5|:g箐=L-n*,sfc|EczFnjEh!70"+bh{6eoUX * Xbp mosZ흉.WIXsns,.+Xx+:3VwiҖ%/ʨ̶$ךA?v% G#7i*.WٜVQs3<0kwkgbJ4M)/.4ю>|_LxKLzvjHkD`W#Pbv<E[JZ`UEY:D '(Wg VtF~O1;Qâ˲؜fv3<@:11a>Q3jfcCy$w;K~.WI(\Clz`c z_#|0c&èq!ѧonDQ;`>= !-]sM͢'gOfͫwGꅿ+@fxoFn2vq#`XHYT䶻"L ]_6K&znXA,~q4IU]ˎc):8No! KN-ZSXhΨE͎ W΅a^^~(V`KՈx7Jգ5ͼ#&25a02Rݴ8c< _$!~j&k&s4$WoZR1tKv8(l^bƆ~@tPUZh`L4PQ҅sA?V``"%Pa*w,3Tu/Etٮ]%,?lEfa[TYbzw؍c2+`ʜDy .~zpYCutKyZ (" kNW?uH0nz_B{Gx:G^+wgӳ7×{f&{nk!gUumTb ~r8 򱿳vp 8!:6 #ߵiF] rTkBq;=j(`6=y ծ@W 4_c'h-ƠJm֮}9 DMpn = 7ە.9{,+9.B+ > @Tv'TJm$'F RЦ8u#{ ,B<+&/`LT<#|Ru)Hq@RW.TWBkp<Dh?"^Kwu$e";t kOj23g< q62K>Mgz R @}㜶r-1\ȏ =Ipڈz0bw-$`mEnY-~G%"Kl-YЍ&g@Z:YBV+īb?1j-7#3[eh qo;QQ 2YgY[ F F xs`@ђe 3ssupV Fņ Nszξ}c{+G ߆ AsO}H+ɆkgOo~%Ծp)~#4~>4~=>P 4FRr ;ҚH*Q(*ѩk Y-;> ;> ;>,2U BlE {" & YqG;cO;qfB#1/ A8=2"jT&<j{Iרnz0|0dP#*K2[KT+[2EC ̥XI>#C9UK(T\hi61CPU:׫_#H%{hԣA7^85L8߷I@lO76'H B] !g2l9* 6C>u+0{d y)ev b'D8n1+%E0&D ѷoE~-< UFeӀ d V `,Ҁq$o(ɟ3/_f٠v/^l5I+bMҘ.^ӛkҫw4!l\4\^O ;2#xy;fq6 I0)0x nuRd!b~((!qaOaUs/d}Ϋpr9G]~ |v>` {b] /_X[7I>r;w /^hA9c:%wX>9ӇǷ/>Hݩ} ;)h>h5˷p>(iA}cͷx_l>jۡWDV;ERi/h|/q)~OF:1Gj'E  $Q#웝%EQ#s@'Vc"ƥ'e&Τ ΤFEUBBf %$3dT l tT  +E܍ ";$&mkP~RZ=;iaW_ͨF\zˌM"а%gvB9 ֧+M[T2JI^<3%ǘh "* 9!%B [kRc s fϥE3/05l:Ht|Z}e:;N eOAK^7p@!(mԐ60p|S#L19u܀=tCvX7;{j{N`tXHncƈ޾؈adie~|+)+>+Λ]"e SlypԡW&y{qG+Ɩ(o~a~FԎZB_^U^^2wӇA=VLHsLb5>DA?i B19^c1*|ŒaVxYRBYQP#) 6jqޔ̮gh*16QlOvglCU`RT NFT(P9C#A+@5DGEAM@U/ w _FDD{GD ACwG; Ie%B| [٭-з CAsᾐ^)wSK P(VvQp/(RzRyRLUQ(k%V{i+V%ߥ6]'v6ɸߘN7k mwx tܐJEzkEQMa !#@J6 d!ɗ~5G'1Tþ5 MB$YK D!j5 EgFWwOJ$" 2f&c&IK"M**&IAA\:WΨ9V^_]Kb:V]]]^^Wn^~ZVXn]PX[QS^]ʯ]''ɧQVVr@PPQS^SVS۷K[Ӱ~< i^h{$.!Td*F A~-Y ?U3dZX'ߝd$ZLޢ\(ʼ]p^e^E>Ҥ^tabqbvrj|x5]QQQQQp3-$mKS.^ /&sQN9Fd!PY,$ɍLu,SlN4ٸFhtل$gnnnniyQ£ͣȣɣʣ]]=)IRlMjfm1Dz{+S= *bI,@S9cMdw@LLUt}A:ߛ-9_Nr;4,bvt 0ɜ)9c!Dljx*ӻn4#$ӱ!#בDS9ӳ!ZJL%fetӐ {d5ڻʇկLnٿ2gF,Fj =`U'c e +ɕFUK;w4F5Eh nVO[ovWo-Z 6UWpmmΦήNW'g_3e4:(ۼ]^1/:BBbB tt"}}D?^n\ѿ=>pnSq}پ4>_#tJQEm9x6߼:5usOOOul}eӿ?m>??5ߚ)smO|E~0Iّ cSʘe NCACΖ-FDɖQˬCޒn1S&ʰv&h1VN HNMI9 Jm}@N!˖Mx:" z+8 ыh>kPGW-)8,x4*).8*x2.*28+X;Op08XXLZddElrcI yӤʤQ) dt^s*Ukj $}*Q Hu0|y؞'H㚫dNu6ؘXXʴPMNΠH?NHH۲Y 676747=;5:r7<5?>5<522p_cP0ò22$jHWwkkhhii'%k46W6wXZ;uVvҌk-/,/Z"Z[* Z][_2,k8kR֤Р,QsNwns.v8W;w9;99=;KK--9/-E-M.-U-].e-i/m.-y/5W[GLX9h&t@2` pdSM+.@6` ~y~ .  0,8jR^ZZ'_#_/^Nn.XW[wY[Y`"ԅ\Xx& U7P$\/.d= ==a=iaMpU^;ֵ $nm)(5z)gש YL-2/;-6fΗVm.0D/l2CQQS a?ţZ_ ?-[8aqaHZȓ̏Mz"e~ȐT)+p)WYp`iYxg`U =SJY.#?V|=:QB6>x g8xu{xG1<={Ul. YǙ5lO.t۰W 2?[k݅Y )y^2ȳV),ͤ-R9TٽGx+? [q 4x{J;\ (n#n^s1)h=v~))ַhR|{Py%>wx:,Z-fնo`+uVp.)νv9BYxگL_N?PPiO[J9ֺ ?zt[ɤ<TȚ4UqNّsRYMk,0lJ;yYv~.eLvW/6K*]sJ3nz^J{CZxC0ᴪ*&g< XuҒl;W݌Vڰݽ( %(}4xݭNhlzalLiu>A`i.g:C/q>vu]\!g #Llp\Ҵ6ѹ<)Dw ƿv̞|uV08ިt&!CԌ4eEbDu4_%f֝UVr.,uiSWi%KBϙPfȖQ)W8aqw24f*qHg1v~? yx2&,I v>xwU֧7=6x3.9)jۏrULtbfd3鉍륱6;OXlN X*o=s;:~RjYwCh+uK8?rudc:ֵP)ٰq7!hq_.6RS o͢n}幵{3K7"!M.*7)e%{J݀٢h{5O}?-~bLEƝ}"uvvUPh].HL7-n:_˄-1:̔yjְA?I$o:\~t\й7(>-'x`($äΓjq5Jf6#z m4' O/NA~gU%H*d _gG'm`BK7 `J޽•ײae[e|~+Wn3g-`)|4%Y3ME1@j *M=JO돥4S9˙8um1\s<[cxcd9m6]I ~ZJ|*2MBTǜ:hyx;=/MdžqM*heX !/_jk z4vRY[cgENmA+z&S6 0\twlRנ?֞/ǷWEU{O7s^}x4ي޲7d|}֋>] &9^:+OFN̶ NSMI ֝N5^NuǮ[34m6W:l2 &U=+6;{7=W߷֊:{?nde>]מٽ_AՎW"t]K.KFr%]- tE!3lI8MXYtN'ؼ.d!֒>uoKnk/m_gEneww8hHZ-ڱ sl\EV`LJ^A՛ag7k҄G=0(Wjn*GiqonTMT=Ԃ9^gvSr3nw$꫑ְ.}&:Y7r$Su"ySη L26X ke(]Y|o ,k+#FU0F5Pad![aP|m _2wV \:;fV󨗌]z{Eli[ d෿icsylC44`#y7Ok/]Xwӑ߲PFer'e:`=o96jZD._~ߖ戙lyFjU(X^xӪ\47ox&un ~&a8a.Ժ<.8Sݪp|Sw#@0Oga~x:2p|Ł C=&ߠAτ?Z5YjǐCs)Axq6=`us\gYnGniw'Oa=q[F3e"6bHuc7}8dKUjewoZ&KΒ Y.GL!9ԝtv۝,{w~z!m%aU5~mgNs w3K7W#'І$1%;.V=iYu*“)gֆ#<L_c&zXw]l Kˋ ";,uKv+-щ}OݦP;Yﺂwx )Cb\ν[q&/6ʦ 7a//Hg-[A˵oȌ1)Wn\bl'ϲSOuj=~V ^aʿF #~3%T {4C S[C .h5G̬ڲV}Sc1{Xԯk$-t(oGDxWt-խ*gωK&ϘeUs//gWއ)xwg{ ]ÿo8}9̸3ۄGK7'7H8o'Ov‡;}!~@&~y4uC 99$un0R PaQ Xʨ+?_(e9cB W7:gUB=c._/嗢5rڸ5Y4ױ>L -+޳RVqm?,[ʹo7Q6U+?qJCêۥx?!ijE}W'CwEH)K(gc]GkSƃGSQd}. e^+/%3gX} eȖLM]spQOe3owfǬ-J흭 Fg'!(|sQϨ<ɷLs}=͜UY[C@OzS:uMNj򾅝Z ˋ9hAI*7m\z$SiqU3YHbn5wW Mk/aח:2Kg>]2aTo!'Q VQ}0T8`3\=dmi6UAC:8;Yf]'磷a0KbRF7L9f9OL}||l\҅35Lϕ >OGd%6OEAӥOg. Z&N6gy#AIzq[ŰkWk]kϽ^{͸yoM[[ڳ~G2vNr %68&ƹjߑ{NF͓~GM^ ^c9W*_` H';F^c۬+I={ וlA:uU ૧^"cEuZ ʪc_JpBz{%̽mW$@a"pOb<캖,Jv_zBbzG,on?bOIٟvNՀ86=ٲμ<`!y468[6rYm7Ő{w-Zizu/nb/2͘c?6vvbxq/ cz{ Cj._0~6z&zK^ɣp)6J2 7=,yͲa^G9myNU#R` |H)lpHte[R;:}3U](_?܋Xt/&BT{w7E4+ibV:]6.hT\~-no \h C\Ԁͺۿ.= ][ș?ܐiyxKy̘nr8a%DCd֫좴-mK"10ͱ[C鼍:g>t\]S/ hd|Znzt::_7H7le,h4?~{15kx-|G -rPݢ^~@Y~lm3 Z|KIQUsNY}~33uȠ4r _e|>'Gyf*{w]qLdDtÞm1VD}x|f~xE|aeȌq4ͨxjCn?P%}skbyZImI:)h{\"М[Z ~7E=|ꚮTu &98ZWX*K7,Yu/ݤ4,/W zߧ ׼vh նKe#|!|+}‘ΫN+1DpŮCxlY4b?=7\}?u}jfn!8S?tWpS,nj;a/-~طW>G\~]vtDޝa27ȩWuWw*K蘈cy&s9ҎL!kHLLTOfM*5q4,9-kfIDu {|<z dALږNN$O@zvTm:<8yACb43LGc0q MM]tgGC0\mze}qd4g%]lj;7j -qj|wЃu)>Nq jw?uςb~qKⷵ7jun{BrA*Wwӛ -;3QlpO{@ҵon;;tZ0\7/F"Ő34 3BrGO.|:˧ֻoj~<!=]WCZǐ~ȑ| ̉P9;F>A}b*A`Jے*ƽSGZVy-E%^NV0A4ɭ%(gl8BދӻcB'_I<7DS>v^K=Cr@ztRv0Ρ=q|"qsss7qz\M7S:!0'$,v *nԧzZP+?ukEL<(Pg]_}Tܗϖ[~!͌D9I-:(;G`qkUdV=.# {o)BMI Ӄ㾱+DYh6p OFrye2 Vϱ+wzG1bg6.J<2㴺źT,Z>#QMo&fh~J@O9+C2sB(dW$z\{ 4E 7jR-K'f%ue2enyN5s {jVVLE:;:yu]ed6ݣv>,ӛe X5/byՠ&'2u(AANtq94IXqf>˲dXm QT=DQQ^k/K|qMPAvpT»~o@%JH16XcpVsy F=8z\uFK#vidBcaMU-^kysS9 kl['İb$ ۂKi_8ᬬ#v-h+2xZBq6vu"=JJ2>:;/ ,t+tHy!4Q6rм&t %= zF8a|?1^Pj,P>eZ,I"`k墑;#c'.K\LP,)Lխ*ёT_?E.I RAH&L9(~6V@:lNȈKyF&除LYna9iX"$/L9%!>T0Z<*滙.!/T\SI* MῙ5@p}3E~UXL f̈2ɼ(ȲbؗHlԢz͛f*J$JFʃw09 Q"A~ЃOїpeW%*!.ů+=3uBV*2G!R ˈ8wڙ> 7:\$p/RRP,*2p+> *\FtOA#I=]Dd g *N8ϤBxdDTXͅ&ɃT45L(1TRHG# Vϴ$Ёҟ(2ǔIN[#z(0AA[Ri0~&5~(@EcRMΦiY2TJ՗B%IV?)j/DB^!Xi UpƁͬ7<;-V/1J_U?Xk"/j9S 5W0$OC&, #AIj@B3ÆίHGHC % Ŝ{N Ŋ![*>F:)JBh50w[fr&0<+V zG(Hrq 2L bJfAҩ;֎)_d 3k ˂N[rNv@6.^z 皌 D+z<̉R:}AR%Ew}@ kQu;@R5\8=g^D5=&Srh1xԾd;& *`8\ XPPO)1x]Q&4>uҜ cŤ~$7[)uzD;UXcY)ZO1m$4p,vIH)O8l5)^8ԯ';%`)9A[E'1r-Gz8쿌Y `u#廤GXH&?^~'6z 9XU%D ~#98 tMXu$։џ2: 4Xo9D0F (m=[܍Ms|4e[S2P)#QT^_X|SVM #KVͩvŒ>!Gs m'9B| %~S5"Hg ԓ*.gxckX*,S~4HI#t~jṝ4OU4S#8tѨ=;wC3`BS1]PGjϼ'ϫdò`z?]cQO05U-uG+-QgeQٶ`_BaC %G/bQIt!*Đ'D|%$fQBWl‡rE!R47;Q)̼A!7VBï*u&1 25-فg>%_/I1}ǫ+`iF0L|;SY7R~/ߞ\&WrI&* ԼV8K[x?3)B n7ޫ':,q"O>Xa<)==8 +} ^ښe}W8>vmTThjkpkmJ^^# SXϭ쥧뇂ڎ톐*_Bsz=P]1E"^Beÿȅ<7pqOc,54 ?4Mn Z LD4@ iCփCdp TY,t1]M9.=؋ߍAjgGc4UKx~ hF[4BC47w gbc˜.+l@*FV۵UOC'rMOw}[$QPEh?WSpnk؉UoٹYڿ^>-gid^op+*nM9}NGlыQ'6o֧8Am=&,)j#-Y4n8߲:+\$s,BddO(?Y!yVLr#,\ erPMEԡW)֬'ò,2̽%Fj S|!Uj I s*3zr]ņL ojo>sm9oX7f@ҍM3Zs\VJ.Uc*g-sl^!F"V|d^ש#G:cODS&:-$O7UѲob7X:".SF$;8; Xn.'D?qG*%eV3֊͓&;aS|IYhdJ/8f· kLQUʦ vvbKXm#VjOGu2CI%Jey53twuE^XTW7. zmCDLcN`'f5E٘6mTkkI4V(F:rbC)i/iJO8 6=g9 sžRJpN{/sȍP'*mA&ʜM/CYy7\h>PfA8lX% 2ꡣI!'F0Q*S,4\umUt 8G<brY2F^ˡY m3APIq[~# )7^Ljjpkнp%ZŒLYFpk|U=hFwOx|͚u{CF" \!wf&d" Vًi>BOϣ/ᖘ .y$V]y!9 eSZ$6 2iT2ud?eQKsZ! %l'#03ySbFR̓D"<У20eher94m8-d5o $얀g،FXqrb3o;>+۫#U޴=m{T׭TA@"MDzқHA";RH/H/)HHr\:Z9=9ל/X Į|J4V囹̆5rX#>5,d&_jݹ0eQ̦9߈N}ꆯYˋYߝcD66Gyy3F,\"RړB _tx}sIѨkREuc6'G~p6E~7۽li]H]pjHo5̲}k5EҾԞr{h -?#숏ւ :q5K<·g1tA3 -\А*!m/ ޷_ydZ _$(qbzӯ}LǼ^wfQT/O~- N"tqZ2d1p'9xۨ{'6P%>J"ܚ+U8/5CPh W[\H]dԣFupT'jD^bzꊏ_zؤy󇜒Jr1s!jqRw2✯{|h@{5)V *-:5$ڿ虝'%ruI#MN$߃O;t|mSVU+I3u'[$Kc1Sl)zJm#4rQ[oxt,$)?~v O~Rv1rDs|:lyҠ5 t+[B\Z+HjA-C<++:<5SN D՝p/VG$%iO~0ʷ3zccVc퉺`gַ_}SRw^`ɚ-w$K rsnPհ(Wzűb0|Uf+~|sXw1K6LwNm2C uӥx&sfׂ.Wrɛr|vtA)γu^*̧pβͦ=r9 /*r/M1y/QU Ĺ}f dwXLPRV3L6(-6̮? G-Fgr@Gx¨!cM-T~R>Z/Sy;R Z\6YȽTXY\0->s:i|&%pԱ>a/b.Ü- 3H'I%z“_jV=fC߳FGO>N/ػD4di&}ΣSKK(f^cf,?)h;:;ޜa_0:_OBqo9cvrԝD'NUJ gl oU&:4Y 8Yc+jy]D\B Gd}i?v~:<ٺ}3Y[toOΞ/  x8E1IQj[{L(@ƐYl19Di4d^*&-f_J}6idO>R- _\4/\D梍RDFGN*{LC {F,X?bH`-}/f5nK=/3O;P[E軸"ADc3U1m{( (2u Inj78vT/d­KfKE헶/-#BJ$Ap Pm>_ @r۹=#[Kq. a4ݍQٳ+,ī6v /9_!OPuz +u+\ܰO>;#A;K㥳An{c ݽѪQ5x~QmV.O. \͕ ul>m Z /JƁ=SV ߒ6]@l;0[ZwH3~=t[R;ڍܳ>߳*vݻu\U\xe p}[kc ëUMk53RѦͳD w{#&NaMv:玲{Z^#x`)#[YTgT4%yn3oG壕|٪s!z{w Vy%8TX'+d l걯KnZHY\5w~BYH?AUv:Q˔GmܯM,+cZ'<]׊!D0!y c͜g9u:Pt{Ēv{o-R`rӮ_o 1Xc@O/?x7mS=ڑR-42{hA>"uЯqaZ͖6\;=%4^Z̜0$k]`Or*bZ[+T j짧y 7ļ[w?ӺKSPyUjr ҫ"v[|q;Q6v2?3-:7%?i4sxdaS0Lˡ۴j`!b-t?>oc4iak4NFR9Zslo+!㶝e5B׳ƷWD#V]S7t8ίo.ξHC= a$)nR,WM#!I*<LHrxK.#{ݺ믋#n5ѥ˛p9'Qyقg< hMJ{T!yN&3y]ު5tv3XZ<^,5e3>T$V9nVQ&T1ŕ^CO?r]$S_ p@rH4%n2h\dr;J9Q3OS@ӥz׶QwayތMQ[d֛}5t5q1C1⠢enӴ9G]혛Fv>\qա[pxqn:jGh=VKv~Ѳtm\~؈\Wh M7ǟ?8;_[:WK&mΗrͻ\ 81M7 WxYRFZz.;(L-ի!2DZlnSM`ݺSYT ̱[{_CL(8ܧh#ʜLmY7r}cOI4¸k@Ly?p2y.4+%\cNsu:Yծ[`o2u>-gb*5~kTzx#́sMsLyY3yԬ$~?MGKw\\O5~wА22^3SԠ %L2a +G Vv;`!wXi~it$\1FmD!͝(W-9Tb<;d;њG^4 Yѐ  .Wx7<_NT4o|\Zϰ0= vMfg48a eİT7@}uO}ئ򁖲EfӶn^)X JՖ0`d ,\~h-X` hѸ!A~Q %1(-oRKz+93 ʪ#2~@..oϞ}=mlhoIpm?G_o2D;^Yp>knf| Z= Ǹ̆g "<ʫ-0`vwJ[ON.;"[;#eaou6BNrvAH!N}g/mIU׈=7lLd|hTr*Z@ik铧 @̴h]wqT~N]pRoWpF/FW6  C.>^y[_voLLٹuB~ ,m. $Li$n47Ɛ^ [w5-־3l&䈪ƾa- J `bƤod#D֟JZKjJL I{XԝXMxuYYF藯P#.n"C]0Ms7ݪ*Tj? (W%~<Ł޸:nO[^|+w\f-8/8ۜe=gtďwh8 tR4Btؙ z~|y9]Ww&Afw#<-q x]-#LC+y!z*pK2;K}и`4F |sn$`=:YDQH.]!PM!/oӌ7?rEsɨTUrp_ %&nlk R\7'A{QL7( HӼNJE?'qr#zW}@H2 *Iϑ1ף"nN2ӽd:I'dڼL;a$kp߮wX|\&ۘG]w>^?O7]άx"8 ~oPKKCX&I_ ygΖx-ͷ>}ײz+䑮b0Lͣḿ>曖iN]zc ,P1^hΦXkej׳R>s %9BڀhJ@T@XʞZM]K2/WxEuÂ<|nѼaVakU 2?WO_WUkdtZI={FgG=ϛ'^Z7*TpKT.QET^y%-w2'ޣ.s!r ޟefTjMnbRr^NNA&gZțS=tE'hF)Gkc?<HRN_ҠB IMI>EhWHH,H؝03.I°6ǹQ@QxĊ(c WU-eVdB +#K_ZH+YzOx#jFyuysPDΛ8OՙO#OӖcS LCty;FZH%?p*8}^Ι-O|3e>yu_+?(~qrov>{Y#F Ү2/],+%ٷ={$eo,zf}EJFVGRb7'"܄E{G3Zmk_a>}FJ`PYTryE$]?B&dn^mp+}J* ~XU72%5S^rtQSG xwgՂ Xu_Eq6tGzBMfȗ596k #JԻOuC_k+WF8 ˧p-תxEt'cy}~)jK\a);UIx̒z;ӣ)>~%ƕ%tFRJq{Kܗg< dJ_L&mπ ]ZGWb߸s_讓 퉕'ߏ{43|K2  Il-<|2M NVnbNIFzZ,['}ێ/"xA& y`ܡHC)7*_KwcEios;jkX.B*y5t5p־I|+K7EnNyq]eNa gjIofw^+1wR=)&GAV'[,f\!7YK8vCU+(0.FID3Yjj{x>(*ZAɲL Ѝ (Lpgх5iC!JjnvK~.olMipC5G5 :$r-P+/o5%Ƀ׻ߒ6y^Q^ /`N7} ;=GM$obf=)Sw_q~D?p ,2DO>v0sS wsMڐzJ6=@~5LG!>dHٴ%Sb-l*,.1T6w֯$-~6YR>FZ+'6Fw 'D;y߄^E5Gכ\&~}+2K)+V.%jn7h7rGM0W L7F#pK?#3}jd])lJAR  ZnZo7,٪`<[sR1ﰮ"jG8kaw%>$dY>`ȻJ#49UT!z D&DC.P+3bϨ J܆lj6\d ϹN//~9bα[a&^Wcucjh#QpGMLI.Ғ5]X<#~󋗻s_a 1wɦpvU~XHeXAyK%U@_=zұS]S_sڕ i|k3-bp)c}H<*T~zY_98&C^P/q ?s}B9+&ȱZ^ßmu<LhS6רqO?/cV&S4*~Z;#- >P(9@eri1Z(\0;Ǻ\ \K7ɩ^oջ;y *vIˇ~O2)=?XykqvyɣH[𱰒8/ur$ k>ow;U%ښ2СelA `SZ$&S'Oʺ& \[>q"O+X{IFB%]$nڦO9 c4c S<gNL~_ђY"hB!L_X¤{ҷנ]KTp]7~nR宠wI Gs/gϬփ$L̒PY}z.q{{.s7pc񋁸2? )p?:·sNGnbDs/ްBf)#&`2E5dq:8sK^:Vo.c{2V|; ï䎕 H㋴IlIWcQks70/REG`HW$*.>+ ! $&E۠ P]3C&=^ VF+Tc$9+Kk̢'<Ǐv=ج0#!iCVq?x!`*_p2ө^Őz\EM'؊Nؽeh)5qOt!#ڕBcM يI!o|/Z~*ELf9Xа˥2,caaz1> __>{iWZ&qI2_7m[ù.VMvT wn>h1"ҜS qo0sjn@^^Th6pkb%ގb56[\DZ^.aG{+tQzD@0kAzez,τ ns4no:W6&oxn۸(M!Rۛ[s$טH"tߙ7z #)_Rl[kyW;ḿU!pԛUsH 5Xiڎ1&&5{Ku܅^;X\dw P^KOG`W_6dkv6cVgZ!7>'Fwv?9\T-c k:q푾pCVTfkc-z"\*EΜE|/'szh;\@&WT5{S na?Hp8EH4^Y4nĠNA}qI!@ۓ' 9gƳwqjU9;ݩ'y/WHKRz:)LC//DёβZ m:^Ivb.o?o2E~.2e])}7MB5{^au~/(vGBl+ڄM£+Ⓟ!}/ZL@syt @)i^@6B@ gm LU$(>%XFNXX8uZSMHzN؅^Qq ψ~gN:s17n"\33ٟDM{QSL!4H6Cn7NIgzh'L*: jM\\Ӌ4(nwZ 7X$: 1dpF92oG/ZͦQ#0s;`0w\9-5p(B0*g<39 s ?uyXXo74RWb1**B~T(kKRdTA˝#|_\g-DF6#nJ+0u/پRfU!Bpؑa m`.*w2"8r,DŽ=@b \!I60/aD崎+'ZgU!]h 6XK9w%9WE 4[Kd#zZmqAy,=c#rޚr~a7fGOc% w30^cWYQ;G:ZƪgAC)c]|yZ1.E`c ޷|[[Ac?Znb%[oe^E٠7;o<Wƀ^GUH,6{ )q=#q"Yx:fYs͛oN[u3Rf o3>cA&[2+8_= g i3c\Wǵcv4Gʽ9A Z4g,Ei0zUmQ`cx ҂Rַ dmfY6H Imm[C9  |_m%-<o+PpXF81ni4X;l~ r#2 jT"Je9OUmU:+>;oƼOohhϹt,lw@ ;/a5랶R+L:zj&痘J@}M3>`#&k4*fsbp ☕[AxJQ$O{SDW6A,JH[R@iv+%)᧑)ob{ľb;s,u2%sDR1.蛍펑}e.o;sI7Vj2havSMR#Զjܶ.= %? }\ȲXy~$x1);ݡb@>7'.*$, 1^- E_UVsՅ3hH (udS6ׇHB21:& .kKS<#p0^ĝO %=ŚR* f!k`Ie WWU4ti*翌!؏a||ۨ9UV٫)R 9p.gGꬲqwa&?4B8!C7á(*טJNB`T~g& .*1ާx;71,C6=ɓCo]3im$Z/怿+ %QxObo{j>LzR TJ uKLuG Z/aw 6*!Bkv0yAu ֘՝GGB/w<+xhv|NEvG3q7!E;k+O}h9HVw%yW$K@vx`L6݀MކˉK”7인~2:nstc@MA:/?_{iZ 3"nx`'_ 4&)GyBTw3œswRq#G'}5cԕ¤-?,>P-D ;I'n>HDcKOvEVYiLVh>J݋}2Fu|s^QVZ7HDh%m4xt 9a,ns,u3ڠmDӈN(I&/ =6 uqzlG(Y^#IM0V:"j@軉1Lz"%Vqv6+;ȧ37 u`ZOu-AUs7"t9 +!dRйƌ;,۾0p2k_ps C(]us|bbnCdd]tbxֻF8gig. Tm^ K)< qb7!MvzFB _ܛܿ1gY?Ǚ˷ieپ"*51LP Wߥ 60y򝓛Wc~{Q`n49rg_Ze&YzZ7Lg-``uSL+yw՛St5 :PO缁\oIh (WЏon[g|AG)gp $@B &r1z{DŽɄ|fH GGZ{0;iLlPH:^N&[^[&ѪYL&Q %.231zOd0w|L#q"1/'i?UoчP?i.3[ex aA*G]ӐO >͵YQ*ĽK4?}Ԓ_DS֭@4oͼ EA_9*+}hxh@¨5-@"b{"RqxOuQՁCQ3"V! btD7 _̺T/D-OcS([/ΟR-h=?ΪzƂЫ"jF~$ߖeV5j;U޳Cw[F4gTӢC4kz "^3^&4aǀ3rDoi`G@6~ ,E=y[mwt8`]D,ʫ!כShZ&pm 0 9}mf^XXĸᕡ%&PX u?g$"' rVWzN0Hr$??4ݓkV~ >}n!{xw"$;%s;!n[Pp۵ ލڽB aШbͿ_]nAKqX%9RQ>;)[#44Bx$};\g9-3}aV8Ri}+ Ze qoweL'/EWy[^"s@4wg uu o-#`CgFP[)Q]xڰi*2ĀK1*s:UrEa$X+{nd"3싱3zyEork0Zϡ7@=Y.0=hXy@?;oB$ HBţR7 ub`} f!: q^`ŀsh<4&^ï-f7j\&}< m.1 *nOyRJޕ1fC=lю W>84v9Bvمn+.~v>܋./dXmɍXʏV 1x pԱ[9KRvAt{ 9Ωq=?+wÞ7Y?/=e5i1Wޚ$7+rq?mWۚABu =ogF|W|_&nTP?e5 |#Ӥf.bq}|'g蟇o q.Vh0c:9R?3uvC~ų#k- Į2 X .Kp=*[S8W*3QK TD+ X7ŗ =ǵGU~:VԕD W.g]Ӹ8-uU]}7'_8w./V-q9,=+_b%a*Jx6쌼 vl]JĀ2 t`4ܮ߁3%f*yβ .ҐZsAWZsLq%UMU#P#,xQt@2L$|cݩ)9ϑ]ze>91Xhf/Eŕj )^/glP=(&ԤttNՄg::uw%v |Yˈjg RWVM}lg/ҥ02Ą c؆d FM(.wZKD^m>H+k98qO7>*$)^q#\Xy?ƭp kh&9-;oڈ"ưpmzȌk46''~߃pMf9euzX.oxN#^U$%Q(b/EGOVʺ$t mzF gd> 2aߏɪ,/:ǒ]WY׊:%)6H7kh6hs(;0愦N FX|%PӄLk61C{OkU v:#*wTT$;>I4'U7v6Og לOf & +Q{""Ҿux`zZ3ou`S^+QqHՇʦZٓQOwU[>)xٖqP{|'eiCl0 Q,Z}$.W8S{7=vc8⧃GJA _mPbgK<`+ yh᣾~O2i#ـ~7ko:բ1r7Sw+iHB,f[Raa33_ 9ҫe4GS^5Mώtc*+ru4d+o@KP¦Ŝe\@-0y#AiWY)" &?K+Ҷ(± V@?3R ih9\"VKU=[bҍ3yq2z.I;W [w9Zg*%0Oquzv{%g< C5EY6W^ZUε4Fee՟s hn:bt⛈"_]Wjb"mSsne#MY΋pO"{{$;<6~QRڃi#=bV'Utg}ޑ2GyS^b^tǭ~IwTRF_!ּS^-%0z':WaLԒq/d--/-e(ޑUB=4r }~${ É%xx%s9R8mC@w%2zaW c6 k^]}^C9iwvK}>gqO-KX<| 1`crLeG[GKP)wg~0)Rp"A}O'®T7qũL8,bn6B w-Yfw:ݼ2#2_1жHWk \C\A 5y@pʓy/Ke&yͥrg%~CΒyXޥm'Ѕxr@-ۭNG6үp]hYud9wc)r u즶#Vs8 U/2\} '*VMߠQ&̇#[gM:6^)ҍ߈ݔB}V܃{є;iZYLzPH-SpOΔ+SҜDQTbԢwm睐F~pӽo#%/4 k~90 ;sɫ 7*b!V!?Em {f7='9Ρs@o] "{IG4􃧽 wq?x:F#Y,ug=[7li.Ex=V=?82:myܕ?\#{hhf5iil<8CLE1tn(z|6Bͨ4!.|/WG>S_MEVĦ˻1e[͟U$WNʅ;P+̒J ;+m2t UT-kxeI:X+J<ԀԆ[D&sIˌS]VMx0]jLC%;h:R+$q2&2BH~*}yA9o@ڽjsi =F_ZT·̙dj1ą1k0fѫ[}2靵'#i.'*d@Gl0Dx J$=oXgڡSN @ohBcMM^S9D1%jS8p:̳q}cF.i^mN=M4Vr3oIqu]w6_@ ذ܌G엱>b;6+g H v=2g%7[_!;1R=WTOE&[l7w 05 ƓE^ 6yd0uWu򘺙s$! 7)oG[Wgb m%Q`*/A1DtFg>{OF4id{Mێxg"'7]wjmm&>WzJv.[Dވ`'}8٫7(+LvxΊ>x< )nHEgLΈo{Zsr)Ŷ?gv$Q02R ¼wY]oG`TpbTyA?ϜcclBkPj:KXٓ51O H[9$/ 5<$ܠ µZBJ'<º"i%- Pr<;"R2bXȞً(;V<ڕ&?N/N c0/\:ri-%E_'[cgف}nggTG; |wDݜn/N9o@jL*5k zNBӒH/=H6> h"_٢<4qzU ߔ6umnIuKa ?X”5=a;ޛf2sܨQ!2)۽wUe.At_J}e0dŗ-s6mhz&1L{bsk$*')~tΛ;~O8^?|S+Ɯ9 OW&{B^#;JYɗmI_w6ܽ'oG &}Fe>ŪT ZOҺa.Fuztf6 q?/X~ 0cT*熦 uWei@7?D kzs9= _"2jkڣ;矗[Zi< fpڹ6:sq` 0/ȸYH^Ҿ15ԩwFuP{oznf wHB]<2fgր*@f~]cLʜs? y@uђ5io#n9߯PYP#h[.{? |t&  1Ś tȚG< ׾cF0|`|sIPxm Ю8W8ō&QrJɡqdžM/gH/U5&42\ 7j4k]p+~+GeCW8!Y7W7&: "?JN;apg?oC~8!'Lv# ö|r Kd'^@Bl`{`7['U-G )Bwc8mF)r^NwPQ!>G[qVg7-JszczZ#8 ُ>-Ad' or!u.s@t}9;0!__,UTlSIxA3ʱʀlXu{=(XJùv=[q=X i|dp j rω x>N͂̆]lLƥy!"NsH'8笮k0bL9E# fv6}PGUu?M&KCla%4Arԥ2 .F盵u559vĹu7/VL x3Kl \?اN^ tТeTlĞB)ZcYQA]y7.zgNbC^.4j.(d1nOW|ЫTt;AhrG?_S1͎R4\V>^%`R\_p@ O*MT"_إ~'N2UB=z|uh|X/)8e~hz]K0uh@,V )F VSiX9"|@ TH-Ay<nX'?5WvвXBu^+'*$7С:P:qT `F7 tgP" /}ǡ 5?U]OaD!U [{ >mrpN4.!401~ ̢ ďP׮'kMrYPg2:.ioK+]̊_XS-W0 (0m?W?NnQLkȶN9a ]EqX:iScמnʙ -*J;VK0M0ȞW9yGWy?"|?# *^=o;*>} - M)'r%"*3",0Xs=XXx o*s8{.IԻmwʺY_\&,i&קrsٿjEg3](T ۟ILˆ1dUԘu+hO,'Ӈ |Hrƽw]ewE'A¾E_CmOHwaRW n@G;}; q@% :x? dsTa @~H52۝a okCϭ"t|)dVs;$ {  2p Phbuk(*xq{;_3-|;nM®3{!jV*h&fdjU|LB|jߵ#!6(_/0B{wk-sڼ j3"G׫ )$J]lǀG͍, H0zS8'Tz p"0:t;)ѝhݰHmԬ9~e3&X=T>6:w%ϻeJns5gz!ey& iXԌ 8`3 }P ƞ*)XsXBf"Y1'w~涆ělș%<?[}H5̑2#A/f9S~|;A=Kݚk; 2@ `75p$ 8 _E,9?,zoNί7pE&س]MCoƗ w7?9#`:& Lqo/-n24zbgߢ `$tc7s<1[c*oNoڈn-7M\.*lYCj-ΐ>5cLmip,$6;nciԂ;8p7;cOA)u7gT)7\r7sOLx"I4^\AS$:D'UG&PZFResm]ץ7č <%H]u8 ƻQg ¦pld7a+2#xBB`f~F?$&=j?B-_,i q5 ' UW,lC]T"`1U3HE!շpJQ*QR۬Saai'E ,H;EKgGOuς1OLՒǟ y*G*//No7#̡VwM7DyCÈ"umH$;Kp|pQH%toszZXw*7I&}j,~y:ՖOߟ(r-/QyJvJ>4Y@ħv$䂴"ѩg[;Ï$I;d%+Rr`$׈ TUt[P*7fE%TwAo4KQ/Pu% z>oя>]S0r[a Tµ2\n3[uݟ@oqK0LV,W#uYOD [ghH#TB/H{?ZΟa]#oiQ %h=tM14Vו$~XG'.>L1]qh5! tqi܏X Dbgy-_Sdu NLጹ>u:%@DЖb6DgZݖ8{yl@`Zgn[>CsJTYEߘm V>ƟSm&d 6oqճ-9=6z~S>eB2('!F#](^iu4>5e6[#}*L&[TnW4Yv%]Z] C~;A7. oU-*ocC~m3owv~BDzEޚ7*T'vϼ:nԤ̅<rxQhK{YxrN`%wvQU/njo։_s[6EMT]hB(I{𷛫o@qVn{ DWGב#Ɖ4H|@M']sAMK`ߦ;oh5YksKⴽ'~뱍l*pJ 3¼E]Lc+cUP|"p;"iUЇ+B~|)`VaZuu_|TL֋F2$p-S҅f#WDGsr+n[E]01dk<9V{PlX[:$#]xy p$W(# AZĹXWc/>/0Nt-HE0=J`>if}s 7-a2Jwhivѕ(̤I\xOc`h݁_ %c&p3_(2Ÿk5>]Hwa QlP>:v1L}b^ ^k=@){em W-H0NFfgު.u"⊀v拷F7rq96-bfz({9eL' IyKN҅yj=u Jq$t[<У>S9XmD貺*taj-XaQ#} >XS-Fա]goPK+=34Hrݞ&QeRc6hJOgƕ2@'p?:Y9MF-t Fg@ &z06]D+csh'W( |´i CW19b P!ו!هYϗo}\YՖVX@rýBR'Ԭ:2n-;$n-IH= ô܈MS66־ף5yKۮdȵ'^z7+G_rrP֦?n`eyⷪU04nPb7@w?gڿ-AoA]2~a;,1OdbV-r1tNIi8'$sѦ q [gRkۧ똮zpipm.qzn!^W=Vd8OnGiZ֐dದ dsrFk @)L=zU- [2IƘEp#V"~!(i"Bk5g,E&/u {G߾YaFn b;4H_F|!eZ-!$E&n zlz"Hu+;XudWCRT@h~Z=m_BB^*K 3,ߨ0 Np=^k?obk_A&"$2mI`X{jʚ<89僌7O~kw y~M*b,!;B{fs~A~n{Tyꙃ@xYbTr`(Edr&yc6bQ; au5 ym htÀ,51 $|KG?;B1SGdZ/~f̛y]7e2/aʁ~/Ga;L{<9g8a-F^뙬:MuL]!vcD6y<Io?`jв֘,H%ZBjiR'W=@;w>aa=Ou|[^j>LP~'W%V*;Wևc|ÝBfeg^4rݕ#慵ن ec-}Sxߋdڇo ={ǰt D6kʷ1?כYGigN;MJ5WϏ-Zp‡o cp]MVf2v7ΒHI~.q)xk0\$x-;j.J58%y9]8e{.ѾCђ"uK_ULVi3!$!WUJm7bD^ee^92 ؘ7_}g!YDs_Ww=I6fDj%GGhij)0zOg#c˟<3/I#Ut֏7-nw15!n^2H`3  khͭ$}bOye4hlhm34DIo8ϊ݃t^/<=(ch6UXKj?U\_튓7ԋfpa##}ɿ$Hw.]_wg3| 0]Ijҫ?dZ+$*CMGJ{B7ݍWuU1yo6Ag;|L(Kɒ# %euĖB(=BYD2J5YgSlN_S8#d:$ ;REc4&N] +1tM}\Hx=IHE$E8 Ӄ3, |{/掃@ (bgHmR2ptgQ;Ad硬l__d7۟^~L;5X ,˦ @'o-͇m+#hMN4[#[QJO"Q>T]Ge/D㔫 eϞ':O#(p\ҝ5)Ak_+Lea\&uwIvrbV(m0hq0*W V2BK \q_LU~ߍb*kZ%%NnfA$+8C=kPIٜx(GF%I`Ei*wYn)~OuEe1}#{vƧ~msc'߬ ֈܯKN##o ]"< ;4 ^J_1.9*`5'{)qDVkTćss4I៍iŤ$_䋞pN;RbaK*QMiZ7wk[@Z$܄w m=RaBEI%)j11%*M1l+²,2wMNSK,6dl^ B52p4!7KP|D~hn߫[Ý&wOg`gw")!_dS 9[ټݶ2="{}ef)\;5MW9Efh_th,O¢cBu A!RRvvSv~~WhyR ic2Cq%k dYxl_LX>D3C*?&(79:(K]46EMWiA\)/O%_0p5~T?ejcݬLI-"[XZ4tN!`]ҭhEm_G>\4'rx*Eov3րYx1wu՗%[*#V4(fX"aNNDFa1BzE[U ?kBјVf *jlChS Ǻ^۪e|H]f)tG񮹓5o&ic\8Q>P*FhݥF2;m1ݳHK/Aw$96S /+/H"s =\K9 0FEEP.85|uHs>⸝.dq߶4H:5Ж8ڐ'$wCV6?9*-Y}m1L!;?LStS@켍4u.y} tG9)^g\3GS4]S<߿WNmDn&Ċt&cwgŧK{죰5{.{z|䔈lmW w|yI-plVZD$'릔NW-Uvq!~{}W|Cg"Mry xNS 1έ46+H~a록NqWڞŗgųW 3# \B_xCrbѽL} MȆ ߍ8a\ⵊ1ŬU-tإ'Tv ^6#.ˁ,! 9s֘A`_'dQ7yƺiPay4I^^Y Ñʳg-U-)G x˼׉+nu.M[c'Zߞu_<.{+υ*V<:?0C9Yt@#tHx?{/5"aõmqObɲ5<-~._5~7 l摎=efrba=8hZ>9ns?*}5?cW&_hY}vv]S|#Lnb[m܅9/h"n8p1xz-uN_eDQ&LuXN Ce{:-d\ӟ\:} m y*F+Owi{ $+ HVsh$HN"9I""3*Q$ɒs&7N{{sƽ7fg_ͪU5n7vS6N?]h?6I˻i '{Yn60bVidmR\R4Һ\@s et\.1qMu.…]&v!9ek/ncɲ\K򏷽m9H`w殽o5c}Gj }:a\~Ǻ{L7)>-Yb''DK,F6lݧ&}[ #fĄ}/qMZ>x%$ν5EQ^U[xv/]ݏN }bl76ߚ` 8(HUxKa?k'$ RAOs5r9 n"^Q1U18h~`:8HxF'fU+KHҨ.?q3Yp㈚w7lY'LVK|6I(.!|dO, N@U.px `Ƒ1Ǐ4a}Or]XyR>-/h+]aZJ.¾ =uvH[s+V@PͧQϵ)ٻo EؾΟG8G*G<=k2Olc'VRoh73介DC57[%(Zx}/z#< c縆o= 9"*t;S!_ݾ[S>NsB~¬ l^Drj]˛YDPmWz7vfu *:J ܣPzVJB'_*%I~L tԉyDp%iB4 x^ghٰHzQâ>nc 313@)^#*ا7|rBCY?sO~.t;coL;:s,ێvuSh%uUtfMnam!Uxٝ#tGbTjæ#1M,5:3 M+cGnɡ29$bCvGqT *g+߰{~8/0I_g䩅e|vglLiޞ3)ԛpA5.5,IzE.$Yi}g<4WM 8?2g|v,zqаƹOH<1ٗn,g33]R:on=S-N*ԞGo^>]_Yv~ е'<؎ghob7(_(|TuR{W)c`I18^"6¥|~g%3kL(^U?R^piX6cK5f{U)ȹtMGL b i^8?o;\^;q|pZ\i,6IfnNk/_=Oxj(wB@ѹ&.E74[Kb2:fYT*|vs"cA  `7 CQ+GöR-㈈N2ƍZyVȥ@Y^i@c@x=urJ@A?D3m!X⏶K8xR=[9cҟbPR<{R۾pgOb!<7oXd&0ZD8ϗ\FTyI n6b[XZZoro{< t:,ŲfF>"NƄZZ:Zj.Tl~YHЃ fNI&J!Weqy tG}ٍ 2RbTo-.F=V ]_z =+c$2M`d$aS&&k~>#^'lTnh r[&<ׂlל>p|W\N.]) &KL άGxpܫSy7gȥ5,25.v)}%N{ B /lߎdاA*2iK"LqyopFSyRE@'cf(]7)ﮅDxzVײ>-e `īKL2EGO&)w3Cm(ေyPpŤXO)=ʺ#_6T;4b RR+̒cف͝Sf uMgKɛڋb}f&=V_<ꀐ> qtCQЌROM-g$.c1:z.Y}ܘvvM&LJ桰sa_Bg ۯJw2 3n믑i6%B@ nXa[S,.pTF\cߣW>3((X$ʹK|vT)Zd^=qzsN :~^x o}Lܑ:AS!U`:íɖ6?NǟhzQw!szp*Y衏Xh4ZWܑطJxS_vTjKaG<+{mỬEʍb68tp]>2gP?~OaF#GX`Ϥ{q~az$6&}lfkiL`_yAb,A]lǫy)?")_Cn$$7 #x6}]l#HBDQz7vlBԛpv6Ã!eU&1seX&nfv}%0UvD*jya׋(>1FK" PIUcLAD:6tBe: 7I7–<ܬօNjZY3WBNLPS]xvtuw9d 6>gm|& PUmZx ;6Z5W Yk*$fWwO 3}E㖗2Y͋{lYR>!$;Mы*ׁRLAЉ/*s᳜U7w ^07˓r?r~px=tB~'ɂv]N-4iMUZޡ^S|`v!p p(afAy׻O7mMzۖWC)]qA?<>f+r졧#LǜhiD'w }t-9Ғ^|׃k#N{&b3oDȁP¦cwRh !Ric>RT*u">ܥ;&tm$;CT~[/S [> 'NtE`PYM?ybǦ.\#J=.;v)zE\H՛s[K[@:pʗ/I3Cy6 6StG~J?5|*;xRqBRq;@WVcahR=;=w'a6?1+|6LD^?=R-H!aVdQ`.a;]7$siys6őE[@4>s,r$ s ~H%U t!j]:ոP'5ΐPRm[BRo,[z[_Hw쌻hrYHdgA/#t k:#'/2ކ⥚g+D:>DԞ93J05/.ܚ-!U}/3W 83K-|V8LA8lP$>|f6{[4AꝾф r,z=p/d-Ov.{i! rP*|@.ڹvE6ۨ|Qwi1}Gaҷ p*cEwۗ?0;h.M%d3aQKXgzP 82Fu#ӓ8DrmR'I֟_ګιR#3dwgּ_%xYSrvk@,ǖczZ'f%;|1s6%C|^ҏni]Mӎcq&&ȇƼQ^=f鏞MHo S ,}pgyX'H&LXMSIe'QyW#sEO /O[qr*EjWf1GՎCOtkp[ܪ,SpS* m+ӣ$:)2+F;^SlT^ֆ{H듓(l\z#iY,^7'nD uIB?xn6TTbճRpxWF~AV-xAv5L<l0J. ^b'\eORʞ41HֺG~w+`$BaNÌHqm7mMG-)'3C'Y~X#qi K/ ɬn:܁zz׉4)׿v2͂BP"! t?UJW!N\<̎02| rO2΂}b݌e3ۯn)g؉NǗE(m\lF YA$|%OS֛^# wbbHL9(ߍyDŽ+JȤ ^X\(e!Y{6AQ&,UbmiOgڎˋ<'Gk>b2P~|x xi~O?,&fS\Lcw99۔6Ӷ Hc#+ Gǐ/C9w-ily.a&Y[Li*Յ. ghR|+ck0ͤ>>//5QjFqmexHG2Moqό7ʜoӅg߉5mh\P3R66ag;nHtdrRm1d,h{A~jъOj +e93tc|VCJyU4_&vG$SFq+%^;&J֚uw=MKI݄1ZY6Xl ŪO^7o喑!&,tga[_lOx\YQ4mW /I<X>Sa×DiPc8~JృɾEw?xN +Mi3F:ƅ٨(絥 w+8k9$Ȏ-YțwLV׊4C0ڕMI#w'S4O#Hhz}绱7ǀnTP84 [ 2`MTN2u O>_3G؁$ :?HbјWh. -:gi^H`C* JOCE_Y#[$2wWbР,$rF[< ͕wҭ2~N87eiˬVI%}V>p;wuIpw;p` nr[_ wTx; My'ÏEWDwWDz*\'ǘmH@+o_?UxJE 5"و_|R.g6,cqr:Y57~y!3VAV ō$nEʌ{&=n?j_- 8\' Pi"]:K&oށH;`i)QVcA͗3f!T2T:3ÉI d2%H^w̷֘~g Rnt]Z<06* }zZ/ϵ;o&B^+uNJrx';#h͈f©y7V X Xny.#Cf1X/Hm7˷1ိEӚ ۙgnO6`mEt)=%^q*?n&@YJar\x[2NRq;I2zNj{ DyФij;/o\7eRr"B6^}!vmŮ<\>ZaȢ~_/ TYP~Y TB~Syc G[Yڋ*O"4q 1:Y+LWMd1=.8'^!G.;U(կe~0a}c {*Q:aB*WvAN?E Kp$|{N7E?N;)Y+4m̒Z<dd `B3 gߑCS6˘&0;=VJw?Fָ< ϴ==D?ǦXOz1ut3'Wc[} g8BJ]ϙ}84[ v`Г ?t/#/d)M0|8yW٬JDGm!9r-6NȵDXTZCPB{\L͋I> `$HןN'qz[p+@FNG"*e{ e澖 ۱fp%6Rg_ylR?3E'YC{]1ͩe-1G[/Cھ-wَ=g9]+.Օm[EcDrI e@&<˻F0j3ϖa;obg]GK?IIIMH~Q3puaMm40F=lۉSQYM% 3lfV9P t9mma&qY8iojػ`ɹXL+]+Wa9 eZ(qT_-'ȭz9k}D^ÛJ[V_XaX\3OZ?V*^7ζkϩ\vU)Cl2#7{!?5^Q!*:{{pj@`t4K@,+&Gҕ/V%N?2+| 8C0OZ=<$y JOQ̩ A@}YҒpi7lj<3:*f.Ӕ ZZX7Is83ps(YnK@i>|>WܘE#5gBP8Ãqpa#8p$C?mx_3jpoCqy,N1])''<{gasN{G*yEޅQ Cjs$%J W9lJc.>#с7\7'Y{֘v1DFTMe?z1Mݔ$;;< l^(Yb~.jZ 'sg}FL"ڣ8v27gi_3;~h4UvԿPJA?B~6ʱܟj/K>}!Gg b]uza:lM ZTj^E, d$cA¢֡_%~uB38 9jB#A~o3 S9V3r9sg v[~BçXuYl?zjUQ^LM@)Qu胑k4.P ހ׽1"B.[@l~C?:!ɛp0Hu([aYpաhY4G0jϡuFm-} A剠@֥m$(5 80^:ð40Q  բ; @C:f$6ki**jG?1b :tQ< mx ](m7t,V2=exUBo}\ͺQ0uUP@CF/4P]'L!l~}4! ,V[֘K.\&z$ vq`ޮgE kg2?ʴmyJRm ?8#G9xþ.)3yFBw|.;_6޼_? ;ͅI#qV@-Ȗ"6T- w2&}A_7͂B?;E3>U,&[TVs#66dnqJc]GGi3 WLq?:=g2V7TrIFU0C3/8ΔH..Zb+R_^S n`ʻ _ \o-NrLjR/Fn2T$r`'޳F<JW ŴZN%u~"&c c̋a-QFӠ9|buj[6,Xqv'zoWaW1̒R@vͼ'*3ݟ)/q !d(7$C8 ,X Uj)"ij2) IyH nC8^MB`_r=eZj <)]`6 pWYCo cރ*t v\Mn$TuNHy՟Y)v-m[HUȉi5p L "~D[qGky_MP?uMy'<'W4CR1t1)n $!p E -SI"3 u(Ǹ_觼MPcHhY c]3K mh4DЦF~,ȓsEOB6?8~ 1|1OLupW3}Lur 6x߀DZ`oZ?kQoM0A'E "! q߳zy]@B&i;Fe;Q(gTr3[r `^_r=C0~\?<ZtB;b uB"s3ZE5s)-WK Yo7{;S0,\y/L7 {Sstkܮg/JWOح"l:cb"'z0 Qg-5ºA°C Zu♒01~oMvdb],u,cULȠ*$֞sAB8t36_4n?0d| w Aj[7s vP ;584h@i;/[ZF@.U&b}8K!i랑0tmʇR-m2ާcw o#SRvB;n^0V`9:{yKļ B,蘯kͻX ;69Q\yNtO_$=63j4rZ5Te [LijϾ8)>5#?KݸӃs-`TZ{'X*uoɟTzNbvBR:EhAx=+y.m\uXzѷ !EeBH*e6% Ykh^3q}b;OM(ƬqVQ^^R@(P7hW qA9jvꀡn1o}($pJ`ΑlЌ=\iO];~ &[+*5Ƶw~Ljc7cƬȼHsfI:.D[2's }/ 0-<~ )$ΩDp&,v ,1EXк A6)zߟO &1FDhBFi+cσb{ dMz懦/dpq;$x3%킟^_.Yw2/V}EAHB䫒 DXզɛg j_SW[xxXcoTioM !_nf Eꢔ;_.4C (ZYi`hVh{df}#{S+s)Y&H5]%$e XH'ْ[W-i%*sTgqU09l>1@CC™[@vnu,:On=$HEs2EOCD?}Jz3lv_h20P?#&.В6şkFDW߼9 8F_[zdOrWn7]p.(/1b3$8ZMz cQG>nl!ifS r'aO'g@~>8!x*2\p!lހV=@d`ncnm_Nk kaZZV=B9;;J{شz}OBP%N}&ų;eP{'&fPz*)@|y+f$/8Ȯ$'tc$w=h%3R~ds.Pՙ=֧]1tUD+K]B،W:@9&\0ǚ~;%{I+u^`٘vףW;x6}K]ҩ;Lr뫀G i>͌wkD+2b鴻~rMЇB|-Y;B5ʔЍ&mTf'P+}2~ON+f#c]G J,c.7tʳ'a6IWM1ފ;t3g'[I&3y s"THqwy5/P[EyGͯr9|4R^BiaB_znUKrIhow~M,mvvfO,F=͕tz5+'oԦ}Gbfx ӆR֨Y+fM9)Vtϋx>f =f6.GW'vv,86 b7RL.XaeGLqBq xۛC;qk:d;ػ.CһjlE}$!}LƻnN\~4kT*Ey*P9E4d^w^:Asu3ܪ~8ُ:N#efBM4d'JXۧIMj 䐢S6Ơјbu.Gr55޶WiQyG55 S 2U<V_U`kqܗqģ9bc Xh{>ZC_}~\=uen~i盞eG`m,X\@dB#XXV??CU>IC.ybR7$}nQj"JH3Jc| f*RiWRBU==r=cYku_A1ɢeBcWJ+;r.`JcWpw@AO-E@IwpC36cŃ"cϏ/ƅU@~EmshZ.MP1$ՕLS\>9s`o֤L;'6|Yþ$E^nֱF'?C1A^zm m.E|$Nrl}Gz.xړ{ kF3i\0ՈC{wc䜻X}xjިOwX(񽱹Q^Rg;+9:q *({Mt۳FKvqp@ëJQ-I앒Oێy=[!t= {sClYgzj'rxJ^]#mWb<#yi-z[ohMjcWd;Bpf݋Kۃ 77*">cBδ1qmobA#D#0O2{\2ˉnDN)kMk^wdv&VȌb#8)֏L\1Z10K7{pP! z ?G6Y X?f7')8D+pz\HR\j!ҲHun\oذjkwHxPcfCZVL(=9r͜7_vCW,ZQ2aHƔB?eޮ )Q8yU6`ls!Fʜ9?;Pcu#hN}ݳO߶@0ڥ9+??0mէ;BʵLhOJ yZ~]! 5-xOX%v<1~\Z,|9S*h/ yPBxp>oھj*ZgLwDX8bF# ?1P# UD#KN&{ᐒa(-F"&+ 箷Co$4J[>6[txMB+H £^b+x PEq-_l(JO'ץ@BG̴9UQ\33uEV]5* 5Xfos2~aM~ =QMƻa e $-*LץTz7>7 w =_VLcPCf|Q5[#WeM[Q($cF2^<5]GeuH'P|o  9dBlN aeҤL7#vהebn( &Cl :Yތ40ح4,LrtoZ . %R4>?S-kB wBM C'VAڹ)"n\@XFweMfPbh_46}Ǥ%oSBWχi%{g9u(-Tل]1^ڹESm^ʱd*݅<#r<|fZ _B5 GT`qc?snj΃lKu #B꺯*1ӕO҂"s~3'w/9!n`zWcQx蠰 33rKȐa@Y θzn5~(y)7֫=An LǞV֦ἥ_ENqreKU`̮R'o`́e"SեYz=u)ɶj+\#9O!&μ>,v_k6,(eߺ{}?bf66 _N8uYmg?g7ƄSBr{6v/%d ]qvj> 6ō*̄n$cQ=(}ɀ/V8yה4_h6|93**5vE*!$/IPLo5۴Ex2n dɌx0!<_*{Pd"ژ%^D8Y{ǩ2!Tʰ*i_tIB F L/H,I$v<= ٸR{~j>[.ߨ>yKrMNv`u'$&➠!Qrt͝~+=bJ4f)[\86~3>2oۼƺ :<Z $AVv -!oD{ FCT(rog(7X7S׶AA.w"*6itu:FW^\ (At~iսՃ}@ءwS=oL@vK*C?^PKu]_e),x#D8 c8 tף+NoE{ >癧 Dp=+v3 +7`Ax.Cӿm fWNzL7QAXPϧFq !'JbpʦU Mؘ]) !F sh,X~/6ÑHꔿʂ9/֡N#NO 1Ⰶad}Kt#: lQUV ͨSX0 0h?훈#Ћ<-łXse*3>x6`` Ȍg)~pIܳl+٪^XQO1L74ː,%zu=QXD.@AJ'1 HYdM#YSbfo2~0krmiŔcAv9owd$W:\K7ԁ/1ѥT[G93tV<%ˆMADŽi"[z.Au.┚I,#U=/rTʠq4exz;.'N`9nc6Psj:2˯kы06>0r76PMTRڴH4Og KX+ ׯ/M` bC5֋w(ޛ3BnUoqiUIbԼhx϶eC|#]jV"ЌZCcn h&qZ#r9x-T8|q=dR_Y;bAa Նo]5PAl{WDg7ZE{!I9r+A>V艅uT20y^|zU$> ~,q9O\ގHz"'u$ Eązc3̯2SgQOF3jQµh(v*jǰI3WWͰjkppȳSQ` 5Np' X>.>pCC1;B(8}z2u/wdw `Y’yF2߹+0cwxC=/!4[ᣲs%x.OkaHٮD$HS<8d_T#5(Jͨ=@jtr$YLUK6XAWFþޡ)Q /G7F]L﮲D#+@NėH՞ǐ{Fؗ+6ЖR X0f@&Ѯ@"u*pTwg)ř Wkkõst>x8ק rt0oWw+IhdauDЗfAzJk\\Fޞ,sv9M9m|r8M{ƹSu{E(4q=b7sQ"HEov΍ M% ;k2Qs[Ęu1:=F,ʷ^JSLڢ۞/q@ȋKEhڌ1)$!́٦W罀cuXu%a45ÄB6BV'F53We^٧fِ7ۗ3:Z܇me-id})[R̭gz4bDh+pL(}Yn_h(~UӀýxk;쵷h zdw/ q!o;[x`Lجng3ǡRSh-ذܾ2lА͸h>Z2϶c0%xܸ-eȨ^M UUMzxN$OWW62l?A.BtBmȊ(m$V%'z8v9TLWr5J (Ycb&%~o&`.dbI)]fH&H̲:laD"7w^UVh}CàSByddў% \)tҍҀ˯D\NދU"у kY%5d3p]p^ ^Qi F bui5w)3` Wb=YxQ,Uy0@O9p0Ky'FJYo'/ڠ'&:ʏ6lU%mZ‰Y. գśI|fV-X׶~Ź|/`C60Iz{8TL2fה(UJ!9tΤq‹Wu+ ĥ_#]=?}"̇qFd.Jy@Mp@l/Rw=5HW</L-KNX0253Tx;6=30 EsF眥Vn×ꦣo/;rG:Ț 0V(b.c`K...>D_..Z;5{$VLa/A0e~g>s"!sH;Y]gt3?}'L%(4}{ $ u!Ш0k~Y{BF0 FNP:\^ޞWo 0pFl{1Qxga@5vB{n ! yKn= 5  D\WKrtP|T.s|]bY|b+UlدZLyM{;d9x߀p0 f jF"У/]|mPs)#{ h NX ~Gw@ї&rcVTV8QDi#o8#B6@fC.`d+ !(V7E64 V~p ">71RCfٯC!0c](mZQ?4EXEVJV@w ׅE -هxD)y:O~kb\և% F;H ąŒ3G3oIؖg.I8t̪+fa7iWawr2'g|Cܻ\Ce$Uoe&vqAk˷|.]iA;E3k cs]\Zd$0qgvp]o4y8g"?n|۟"M v80rd\Ha!@V!ύ1U=Ief^ ˳G[}hej倴G.w?WX:qe6~? Mn;}y}5 1[5$ ullfė5(&lP.&/hoRObJ?܋Dm׍[{h筁 Ü ao+0yk 8,)uCټ&HkLY7רWZW7$wBG8ѳ{GgH"Ę@}9#u,H]q{=cof-gyk;ʓ_K̑N rHZUp3|֒ ,19?6yQ "hB`2F ZAG@-S1z[JpMɷzS9;(RU;x1p')C/\|XwvYv̋D++N1DǠ!IB؟ϘG^ \#:An~M78i>Zc=zbe6Q{7(ORhgQmgK;?\tߢ"ʮ;}ϘEzL {-JY/\t]x>c^`Y^mw`Km8З5fbC(v5(<8P/1c#D+-VE.Fu2*hjs؞O}PXp"a}F%iU6ʟD ʥ'EZ]:^Bbug˳]`@} M6fY,'7U2_R*'Ai Sa<>q)Yh Ϡ 3N$)\B;Mm&G>zǤ蝽֪HX*Zk!Qhdt,dcb*(֙_hQ> ձζMIl6P `|)_1Nvhf< g<sn[*AwO;e#`Cw: Я809MD䆄D qqU1uDH4tC@|!$+F7}fM$ȥPĮzs c¬~emhY,mQ/CVؐ但_A'lk.ָƾ쏉sU:UۚZ"ZiOxLs8be7$ďC'M }Tho6/H@Vb}pT8ͨJ7 @# q+ytEr!&$,pN]ӥ1Na _Qu⛉QWXX7aP NH~|K0VwmpM;isll2)яKygАtPM@E7+3ڄ4K?ߞt2"[YF]dsYcg_0? [B\6?aZc :]vECk~I m;p EjoIXS?#0im-);wW>g|؂ އM bcqz&f,-dI- P]36 ,t0_l, qeSbǢe"'k' ,""'$.$).b`âa"$"$ I J&Gx=sWV Se{!'/())/ /$ċc'lmnc#F_/bDɏ/F)%/{w'.r._ٛE@Xo''$ (%DP6AtmgNtQ)aq)ɿ6?[=[^^.7Ff]fܽ\m|\m=ei?VY`̒ool?/ȿ /ȿ /ȿ /ȿ /ȿ /ȿ /ȿ /ȿ /ȿ /ȿ /ȿ /ȿ a~aL͏ G  K]Y~_}u+0<~yد2z6?\aIg4aKvvGrDثx.일LIKSrZaia@ /-CVIwoلN[Z apI] }P<ټW.$tjV{GVKǴ7{aX VN;1H]g}|uRh|Tg `kn=o=ܕ71|$iI/_)lM[zm>|Io > 6N^FczNVExˏ'dqįQ(y9 )n&r ]4Ir1)D.xE'F q۝CFhKE2;Cf.Uʽɷ+7=ӦuQ=p[5`sPiuOpyzJĶٞ{3r>/+jKǜp.߬;}PӨG*#9}#gעlLT,d?wMeދ DFC,TQSZe^sJkŔć&~ɑ+` +jU>̔ qd!f=xWz8OmiqMC]LfcxXrv "R[cfsvVd|+cMI1+o-?%#V{,?"$Vyv]?V~~(8༷œ+eicn ypGDgJp2bpOz@؄Dp{ vʷhTb>` pDVLx }!F> k/ocUs ioK4b >?MʝeE˯nR\:Z͞FʋLnq i*BCOFй%'hp*'#`(a=Fa >1~`ug T^&0G, XsJ<ǜ6ffO}~g>g#k(pF;WZ<+HZ٨MCCCKA4dEᥢGe } E\ 7Y{IN{=E>ҙ E.M1-CHUcb\mv}s-}.=LJwkϭW;(+hZ\XlPS}nXb- !y?aTkg7^X@heESʳSvfca!x 0i#\}%s7z{*zKvu5]LȞo[PSq{Xa+sh.}dD $nD>l7׽^X<$ݫX!7ҏъrHVWϞ+ Y2nzPL#v2H!Q_J7G1-"d}6|k=g 7J!McUgƺxrT)N]<,yoQGEс kT0MVpW:󨍓Ӟfkf]Е1쒲A^D.&uo# 7|]w B-7&θ֢4T4NBV>Ꜫɍ_1V`MQ(p?en+`0X|`B?>50>~33lI/'kjB'1ԩ+7s@> "0nWkAyxsSsslh^(a7 ],t?hޘ OOtUeZphCx5k0(Ϡ7=Z`d L-]8ek~\)P6ư( lA[c42cGj,sd4$3w?-ce," ZAϏX\ol1o;,巾:|Q1Y5b6qƪ̑7~׼B3yym@Ns Gm*ʼn^=Uג|oKw qx9?(.F x$XʨyO{A+/(\CQ5k TUNwM:1k-vd/9nLl,x?*whނ/_P NBoH؊>?f!S!u7iݪmmt xAG{J8NGhcڥ?V꣦L{<鈯- #b5Xn5pX5g빽;7kiI 5|-Y{:esFzpv* 9$兯qƵ/0 G5&{CV%N$p*wUE'@٦hZ<#nMljxVW%?a-hE&ҥBGpls q7{N;NeO&vHӢ]K&d(}&lc?O48*wr{3E{$?(WfU>i&"\0x;zUa;MIa-JΜӰu1TPhls+mU.\H>Q7k|ޮmCC&;ޟ0:' ?̶ \l^('tVnz5ǥh@Ƴ ȃ )c.Tq:GS?LD/#w.,s9i,|AaO;Ŷ[)ҬXX3m,|z}~zտJ3fy#CžO=9sրUK} h{Q'Xdwv_iup0Bu]@=~Lrv[rt;5dswaFH!7Z#fd9(F NR.~xqH1g\?h''?brK?ӯʾiߤn-wɽrߙuj8 9ffYl B ׻ӻ|~/[̋lpSFS$C.լ6OO ;:hU tTi8V}+ ȃ"3Emh-mԻ[6[4,i9K\^>?bO:hnՓ2oj(;LeKc7'ZBܿKEy)˝պCE,zlx5g0NT]&,z3aMUyRqdLrqsKޅiSUcsٟ9'fpN!gHZ3~3&+H8.SfH뇋p8`ԝ)hݟt#oh*^T|nMZf=~[wNjQO¼¨$YI nͯl7V-Ƕ,P]{;~Y1VrvS.dZ8|?ս؟ S>)Ct"ێ.U6ykmsI nuͥJ|#upfEY6>Id3y,yanod/Ya]srK8LUiS %kFbҵ[J5?{ UXqycTHE(h;T|u`o"9ϣk<%/LXyX@h6t9#nD[]$91Ӆ:|[}6 ly9CAXN7:|aa,0fFF΢me[ ${՘՞ݘ}m8E.imLj@N|Q)ւёmtY,+oyϠÞ:jWϳsuT㵚1 ,jX h_iuB'$MfG6Nq k+:<ź[/fC| ]ID1ѩyaP/; FֺO>Z(i%n -MwD)L>xWs`|awx1,"KvetiHP JJF-B2";A\]30>:'9{Lc_ [أvI27JW c_.3*{da1n\CFӦ{y'Zi _[H{P J) ͱo-BK.S(N5CGGDT+Dxn YJjK)rOen|oѶ7bhĕ219$ZzmCwIx xj^n.`2iIͮ.6LOUpZbFF}J#@/]EM6JB (abIg00)U y&1*6V(||owz1 w5:<bk-mZcoXQb,Q!vۂ+;' 1Xݶ5aROf%c1eq07e9]V szQdv̸g]Au XrxHBT@kSc[Rj⫾In],Z4?IڭU`_X~# @x,F-3C,x쓁;1$3;yAH4&] '#3B ppfVȵ;-x(% 2T~l&(V  5Hv[2y䜞I/Z_s J/szG+Qa%njc^Qz ~xǚ([awas";D%EJ/[x%z",$]ʠd*8UtcK7#7w {z+a} 'I?#:e&Z^sZz\$*]ogbY]{Ũh$w݁cA+K}{/1IqbgE/9'Eؼx3D9V|Ou]+K93e{bӉ`TZ6RTRB >E|)vZJev`mW,jfYwVZuתKKc˭[qѱ|R#LH/9\h8OYY"gZSt՝\fiB}٨=:*b}9!Ot&ּɗ_$%smn~CAmUwZqkƒp}J/$a)M a^KNQGaƛ/ݩ#:q0\>˵ 8oYHN9 l|nhl4edžn\fAx#d\SЫ. mFw9M NnK v)Y~省h w4Iڕ1|;vk|]ؾ\KKWTb)K}޵3!-5;ƏYBpRc'tދC;c2;o\GRQvcwl !=hBUPlur&P^2&Wa+9긾vE#w`>wҨ*&R#8 jtyc[S@5I/|a:^၂u1/{J@٥$E~vL;]bfEmho}9bea@] &"b\l_nwk!U7mIl)q21+ɃX "M!QuM;1 ~j=.Da 3Q?^|4,: f|Y$B}}mz-^ȝVJ+vRS;RW,C /njǧu—۪K_ܥs%Ɓx8uHumǧFao("WڜۛJwC<-@@I>JٗҼ)ѱl%Xt[j;K:u|b{D:B7kCP`۾4gZA{~V=ٞ5)?w:cG, z_2@\Y5o4H!--!H3zhiF[Ri0:;F?/ ^l:?}]"'c˲7k /kR׾3WMӱC2;zǘC*wbU*XE9gZ@;҉ y)=+Eg̅gܦ}j mr,ٖm\N Z챀]>22} Hf+*oFiK.Rd7'<9ըheQ ERR0[ nm qzVWi9q:: P!:&5OKfe3 k+>}د*MbJ WƊ ܴGQ̖IK5֑Lv*Θ9n75閕.\(cHUM5 Hүw8*4_ZCN/n}i-,[ y8m7`G ?ZVZV?/Jt[MQ %fX [߱^_v{zZTP~ Fu?qPL_! *; zIVPs2X};Z;,9BEU, U悹Y ۷I ~P5_ Cs;iklh Bܹf=-L2 +FuSqUYBe.dBǼ MRJhvUv! &'="g0NA, ZT=Vu>"zS^ҳs+p#47[dj?]=C  nlZ,9^Lʇ Q-8ѲvK\:#ׂq|6WL>3@nL{^7.]rNEz Cti2yC5&ʊ=k1e/L=Qv&O6PVeomhq_bNI+z%U%+)8R ۾p98@0_~(e>^s'"8\EqLQKbXU3u4D;h$ƙl3]s/ u5ABF"@82LAE՘ꂮa.ڮuIkOnݴ!MmpIXMuXI;[̎ t=!.K B.f"NRg" zC ,2sYvZ@ځq5MŌ e }Q:M}Q?.4ExtϴqkWEd$+s]<~yqc DjoXf [k W}hEܑf ˡlEKM0YS_;#;]k {Usٳ1n'<3j-2͉QIaqg2G!. o1T{$~*3j5}]Rv*OPp/hS'Y9OS.STi3/As!ϻFZy &Y0 7(D?n Q%:IaX0ƖISs{j!]8ga3n~Y:{ە0BoKjiu۱oF3C$9cJSll ?ϲ3ӟ\ Ļzjo2r[*iIvoAl8~uՊk.̷/2K$1 "%bg&&_NN)ZeZ8֪ۯz <Yhm"gjggd;G$,'93ezN3JU#j`aM rSCҙP~bnF :-ɱvˈQ7T\FwmxF`$Gm٤ʜ\?(:%{W&allɶG0af!ՊߕPj\u+۳xi ֊zr[4@c@ t۟#o8+o nl/E{;Uaǣћ"S + =6H8.eS.)~T6yfc4V8{ؚU0egāq,Z՚Izw͢cOKmNb}ߔOYP`0`9Ls0隭9ضRl' oP14iٓY,7U<›P̺P^m245p~f wuQq*гS5g(_n`Cb TqLڽg6*j|wl%~m+%k֝ Ӳu2z{ǀn˞ƥj{%=۸fJ΅-YoA(`|.E#MQafqM-&Ч>>MK|PՈ\3rb953_֬=xc(_2Eѿ=8C6~gv3'(Guʍ)@FQѴ77K_o♏.˯jVEluWhQ'UyC[e{ h}ܕgV!_= ڶ%KL)h)<>3ҧ2EQ yGFg3 4g!d:Q^WK)+&J*A5 vz*" NG)qwq1f4w'$s)zI.5u: GbnIRT5kq0:^kAgрG,Tg7@VS_N?.iV_˜<%m_C;{+>?.v 5Y=<\I!7?li*7uP?NOG޿7{^oWG;T+Fx~Tܾr)d":ga($֩6uMA.t5iH`D/G|-\mDR')N ~Ej*+9TˬcF4ܨ*[3fo:,{˃6P>~cSek%56[>݌tzZe呓^vMDSX#;5KG9&0$,x\G& Qo:SdF`$yw_-d]w7(#2uz{0ADJt jE[Ƞp]qĖ3w >(DIDrש\q_PA+p]cnS=X,c ӛQv@EPoWJWş3ԔyMA;KԫUPZz*'g݋aaȵT-txʿ rS^ = 72}D QV+i|/]s8'۷fA $T@ylBLhm]E_kEa#C?5{g_)?Rm/^l7~MV  F *C)+SxcH)0Agfedg= U2kn-_t"^q6!4OUYkӌlvzvSi8tVQ'ݏU|SݢXczHΫ^Q[|ډ9>7W`^:I[yrqE٠RO'%Ck/'}eH'9db}40Jskp c}4/ߒr΁|aQaJK]bG^Vg,ԵVm{Y_<>;jy˔sUJ2fMTU!YUqgsk;3A: SV _5,H huwxn>3}1oizr l sXGBq~яГAڷo)m+=o'3,qrT2%K;@ lM6Uz\Fvs OZ25V}4TE%$Gk瀅 W B"Ft&84xR2+rܬn Saw" xo:V("ÏQ kArc(EQc}~c^6ØrJ’rm_qt%Fb$+d82$UcKΚ _{O/B\XIks< WV$3tHf޴4UC\ u+Oϖ/qWAC/ajuW_MAEaN^D?/$M htP9;1xK0rE~7w U]@|k&?J}>Aڒj9!u:b M%1_;4ޓnaO=vIƏu0#.Lzs !oś Z:+BƢ1ɟ>D9 c/P%~Qk={M<΂;Z۶[atڼ9DY'sL⻏ωx+ЍOkFuj$+<ER>!࣯*@wȃZ1mD,o6L?Vشl0XKrبaw }3۝K"Ԙ!LT'0B=co>^pI-td^ AɅ0*,V& v#b Udh #Aߚx+Эh>nT.UsG⌫[TC;}&(uv1s^ߣ/i/C=k^i43Xiv_ݚkjPQ56&[)#/ Bn9w}E4e%w֮o8_!s/FaMۍ'P=qN4n'tb*1r `7u }(7 yȔњEpJlSTgWχ$cc]~m}qi$Ak_q2~)7ZX3)lNi̎Jy?5 *~m]ĥLRӲ$jxWzW_s C8U9:@1m.Mw[YA)BW8N9S6wlKG.>0V'B>OC )_G-3r:>HQkiN::=]hw\{es˓Y)d@=] #Sa>3,[VΥ>[G7&<C 'Iwho|w) p~lszTb*0@O|_;e84&gB"\V_tF ,\E?'cXy7ѥEϔ 4U_hi/zV;{ʨ*p絾uʩ^ aZcpMP CNn/ 7]w{iK i/̓~9;Y,N< ޤH`I_3LIeϔ !!s#~jEVډ/SFԎqP{_K@Qڑe\EI:U0Oc(yp(bDf MQtC?\' bVC6ۭ!&8شO B&ћ.ԭk/kZj,?BvӤ);:GS4vf:zz[ǂ+AşU٬nEtI%tK[\'H>5cs'f t<:Vjwew+n +X@mAoA4$)?--;Vw*A5 ?l_ Q4~}:P8{jRf$~Q/s\8Yzbf~Ū] 7 ~hn 3A>x#*S1VFmڅ8">ξ%$3!l,1h@b6N"d5/#Ttȭ.A,1~"OwؾʌɖzqާHD;pW4oE)t#)܍!`PjҌj€PV'[6-CVAMKޖ K Gr*3O9@/cz$Q<͎~XǑh]Yəqտm \ҌbLa(g43nJIQ㷼0@*v.A4F$aXmW\R @r5 7 U [b'%6uD=jhfugnP:@Պ1 !I]C,H!"t STv5rSZ2bxȾ@X!J]#Fcr/E87*M$08JI4k"͖3$*(_uGg~B GI.E},foi3хR4!gqI=>J= 4 [&`۶.J0O*l2}ά05BBdMz@;hΨ3^^pOvq46Tꬊ]+z;a5]ܵ$Z!_%DSrw[M,7npEG_Sp{?T,${6{4! t׷Hw~] nȗLVN RxM<$]\G>8O`/iqsu.pHXf(< n#^1nS&lߡCc.Cg9/a>37Љv@֏l"g,=c[j[HJٕ%Ns2UQFeUQ6BH%_; PN.֣h~u>k-0 /T{Q)$ pϖ}`8ZW:1n95Xߚ`9{Cx8yo ѾV 9x7^pIռ7c!r@mf\W|gXEKf y5TBMkqz9f\'f]vgɡx,QU9A>!0IN3OS#t/m ,V-TTDXztB3.~e͗eƟ]fXe)K3=JyvR%6o*N1}{e1}vGJ>'j i1%H~uܞvM/JuIs$RģEM0z7iL(Z2^=bZh'1Uqqؾ1J> ͘RMUq*qNϾuھ)?"}mVDG{0DZ; 0K4a9hI3CL7_` +!6"+y:a:p(~r*D\ C7"ASHo[>ں ND;69œ1J>BbmQ]MB0\窆%uA|JÓ%bQ`j laq.r?I܍h꧚1wk,0Qyw. Uq \IFbU_y|$+9's mK ƣkˌqKBWUsO}R@pTOݔ,ŷHm_0QX%U_]-S8Bgڋ,Cbo]ٶK[vO@Ipy]^+ :@{;B1 ] :|q}:Zv?8{J'oO gܖZy材Ȼa{M{~o,bຠNb$H1Ο9danS)Vʹ-xs.cb`Ku~;8 =#=LJk6-~fj n2oQkžҭj+H @/Ű#M3qR XN@Fa!pMa,+ЙACj;<@%{Y(M9kO[}j66p=|REMUiМ*웍t&ppIꇑyȖKpF )NEırS=9+2 Ei9=fkgmBg8ޓ}}^/Q2N Xb匕pwTt)Q(pK[zlBkGi+Zy,$O~oiܴ_?ͦa7;w^M66<]Z›}Bsbn)~!'Ê1UAFoho;#"d~qB? , O끉}+ij ZO%7-lt 5ٛ*/7u?'(0XxDo ΍ ֪CxQZXrma&ϲg<͌yƊ, q+^Tw|6ϩQ9bzXS#u%Dh1iBoN|C[d`:CB攠%Oߦ'SFjᩧZ%թnVӗJ=dʡsۮ7-iSK1T47E,ž "mړ"rzPnpN nWE~#'s5i F.8yDqXЯ+4Ga3iݶɼFyIVg]rb (5YP(:@pIe/V`WDq]- gg8 }q^<]%:`_R{~nTM7U} 9۞l#~~_"ňP&ۣF /Yo0$ 0 ؞ex1">Ɉ-iظҐ+Ɣ㳙ؽEzYuOj6lcm]ӣ,m>s2Y?ug;63`͸)J 6;'U~#k [:"o,b+(~\fD=KjJDԉ7rˆߜ/J_ݖ78K\$d hj(^h$2U E$t &})o˞iMIK5mcΤn9@\@%9^75r-ygT.  E鍛(_s &군ޓ!"f `lY)#% vk{wn/( C=%N**k<w]DMvw-K>;yQ5E u] {I+|9Fcs$2^=r4мC"h"\SN^0 +5գqpa~K3ŋ~ԵPQs-r4_^]Q{E6*ês?.L9 EQ^V> cI(±.}~5w!}OoϦ%;M'[73B5/! }`6|ozhikH/U9FolF1&L $ b'@Z:&;W,Jdo .!2o??@!^o)#kgg?δLժW)[z!>AV򦃿:O_uOrW#< =ާ =% bΪvؽL6Yl7'ph5;H ٠Hpl+7<~{ʉw@qoyTP-p\p-xٺdIRPIJ:cAu#@j6NO+~zNb%c8vةv6*+k=!K#5ke5ev!R& J ~Mb=%8Muy9  ҼA?XD6MN0WNa74]"^lbG:bBKO3& 17 Cѩ9q$#T%t]VGٖ!oM/_f:~c2e V2ΥNXp۝ &e+?to!0 |Yw2I]X*ܰi=3wPm6@%TZ<IXT$U+6Ϥ1gĒdhesz*NcOu E!C(HbcIƅiC>r.ҋ٤7+ݟ|7%,(|YXqKInX#'2-DDJNlwe[Z7& \ӚCa ߙ`( ߜXրڢu"-B ,!?0l(A;+Qqgt3~ΟFQpKs-GY%J<' .i4pL[qh ^[ ش{X}Hj"+9rwߖ8jf]NT:!z|s1 ]zw7ykTKg׿J .v yƽ'$C݇Q3X|'B$6߾}sv;@S4Gړ)̅[r}A|$ 7} 8*|㞴RHiwoM7W٪1*û 2Kn-})u+gN&kCC8 8/ť " 9,VC}H'jV* mo߹ɧz\ssHͥCN瘭6:ƒb.|a'P=wƁ^-X>~?dn~]4#JՉ`ϝD_Q=uŷ oҚ2#h}w<Qz \LNTn_I6Z/&ԏOG,#~- q' a?G #Ϳ^E iֆI3Krp`^pΎ(fq'>}㴠{i{zXQ&;8-S`tH6)27ųu~1ko[[ÞjݒsԒ. Fe%.rh̷ZN~}YAxAc\SX<=1nCgWJN($ ǟ%CQVCiTĪI윪!QyhZvBkR!njNO+!` rTYae֑-05o%<Ϲ S5VFyP~'R$ԑ%K@GoꋱM60t{#׸Q9pɌa ?Ow; ZaGCͯ %%ii+;fSu*Ɗ_)LO"@"o_cPƳjQnտX%RC/gdcZf['1#{u.rpi79mYXF'x+=nyʂpCB0yM) շqM !&W/5PvkbLwLYƛ>҃zSw#eAKhq((B0>YjP&?>᫈E5r \FоDF; B ܑCAR?I<>jqWf̡}7#!Lؖ2xOu/-DoR (訡[Khrc #7PJY5҆ѺÂhw$u}kJ<~O,dtttlR@r~f'Bpy: uĀK5ܩ~@l4 $8gw3y=1}+!\2t/&:𞑛1T9X=X5P?aXS֘FioC]HH!Zlo);}>9iI.lJ8eob/]̃m UO'gަ|]Gs)|),(_5a&o5FsM Zo+}E$ 3KjskUF72/Ϥ<)+IX?(ޤ6>=z@Tݦ 5Uـ|{N ck$0ň q1Er w$z'nJ&VO 8IɘDt~7>3ftB~x` |A@sbL(1Ir+A¡SD|JLlg[*"H\2D\ylJ~?'@vqw;yQFVD-QfhI`sTX`vykZL0u iVʼnD׍$!O1WA>Go$?QvZݎ{zH6bToptfB.[+&ur (ǁخpGfcYͱIVx|k Q^tKc$W ew$4J~`;'R&[JR0 %k #|(DS:aHA}< ]d;ːl [R܂?06 !YxcmhHl^lKV|OBÓ7"tg8GJ e0#n: v LA "IDf>/aC|ccc84a&B~6o%D}~AG(Rʂvƹs59l/]?䗌`UGɨߍeBc fCR c'U_kuoDuY@Y :28>T ;AsȰW9#q 3d5?<~3V^H>Mv#igΟMkҏ%o!MVE 4~o`T𠷨{:~@+7O[ #6g4%Nr+9w4݄v%=$n7zά}|i2yb>Grq\d#mWؙlEA2I|CPXH~q*a]ځ_`yy#aTå:IWbGTӉs((@?,k6y7}I_ 5d;ʉG`ldec&qjb%rI|2Ăk, tAv:ު " 3P>&~ss|XW *u3 @,\sX gsLz052y˲)/Rkq.d t5R p˒gR 5%^ _cbV~CMQfU i[o#_qR>R@Sy Xv{7e% p5zTⲬ}^83]〟5i4ޕ^ܓMYO&D4-miMuJXnVkkY'>=bu LqCAn| ЙO0.\x: Pk-(CHW5%oYEv":γOVǬT& rBݝ*3t N(C{rﳰ|9\|PGH S>Kav\G26٤7益rf?;h4߽hl@]/G5us' #WT4g&w~;8L ! ] SI P> ~f^^%QG0}'S6bzKJtH\Af-73 Y+)l60gd~TL0 x͔oHR`Վ-TM0[#81e /"ߏ8uj1OI-Vyyy"DgzXpU̲dPIo}#ds|J^QT\8i?@u\f+$;m҉m-JlkSFi` A&'b~ʘ9S<mY "$q/rf:J:S?^TV B'~;csR/fof#~8#I_/\u»le'Kfi;ȷqƍO!Q<>Zڦ &(СϚʎ`"u~ʐߎuݠhU8+۾LٟƓ*YOm岖a(= s΄lMOKXe$f.dA>2wsc(X|!ܰ_7a32>fJ 4p&2|zep׬p~+8 aI p`[WYf./AIda_2:K[WN`</[ n\Wn&WM0+Q 3®y]<^J @1 Af\ X(%3r~*Eh&5W3ɂp /A d|D]^oQ>9)LgoqU]yEyG[Xֈ٭DEWFۍ8& !EtF_^_tқK$.ƀz?6q"*C[ a*H1 3ҪQB/R0;wPJwlT҃VGyezNeG }lZJ)Ys7( |(Hįh]`w=uQlodv+|^!nr -qAnanhSkUJr~أ3ƞ#p/Ί9,FC=ʙfTe/>ݗ?PY'%7 ͘LB#ܭLg$:V޲ל:- h,#9:s9O\+Sdp:+Sr{)hP(;~ZmKkyz{\%G@gadko3L~[Y׽jǥ"(Sjke6 x 6T)uB*[k&I"F2jOkVձn<;>lrBnVTJ!ȍk2* ̳Ͽ8g #J0 !!k#X>n9yn@,N6huP+Jn2QOn =%bk=g #gTf$hܽ #+TT$t| 0k#7) '&7i%jOׂ2.&yB[/%!Xg hRT/#* ,;L$I_ե:[{`n,7+zLCZ[%f T[Scz Rw\|4/}c^~GO̓;:>^>Q>)#鱿xU-@K|z}5WH$(Ǻħ& (+w!ł55Tǘc9%:W<.>&V s@-%W`*7_>⩾w?/z~ֱΤiT\ߋWeM&Q,5-9ƄuLR4 f0Zku{NwJ[*^it҈J3LgWшQ9ImxbB7濩L~ ,Ag}> x8vuBH<釬2iۛ!U+zp4,p,ɝ=ڷrƐnF课1~2 wBXexx˪o ch!RWW|hJJ_a݉G xPWq]M}7{Lv :^6Z%p*;eƚ8 {eJmuW>`-'W) f9M8?mrGQ[!TxB撨H8C]bns:% ݃ɡ8ƾqfT_' Dxj5-w;WR1!| %yXL? S:G^niY-nHd4Vb=GJ.oX?4RsݶBKwɎ¼xv"iX@~Vz -J]VE5}~`.xbM­xX [0r,i/w)D9[z&0R79 K o^uOjZ;G%觽a_W1ʊ60eqrM^_Sw3Qb!ʬ Yoͺz,p7Y{aK/%9{K <:,eFTVSLsػV5u6w>[u%#,:r:pnUQ?Pќ4$eJ#[m7UA[ü|s0>#rW|E5x+QspG~{-1t.x Z)&+M=]NF([;ƶ[KZ &[3N\Kws`<_}[%/;ʀ@RA8;yFGG_ Y^Ix* NsYL^8g2w} q4[y>lD~(^2Mc26@mӃC3XK%NЁu} 5Bҧ(N _n[}w-8 _(%}veG5\m&]ﳾ},:zsSvC77,dDnkyYhB%ɑ0?,ÅC6֗'s[dX}/+ PC_Q7wꙄ _|l凅gCV¸5@ֲio+7 8E )!Uie܈m VoP:W7ʊNu?-a*;נ/Ϛ`Cȁ5a9a\#)e9`d/s@(/zXgxPIPo|-Kf 49Il<fKNԄcQ] |-2on4Y{iCp4z9bJ:7#>JxPDCj䴔"R|T_+4rP@f 5=stܬ/Ο}c*F(z=9mlKУCE<wIv~&ڍl2D'fFܻgdO ZmTn6ahdtE~[DVـNvGnv_.D%ǒXW>˳I}T7:3sɏ9ߴmvEN(a3]X 9F7v+2/j=K\ZXLXl(}7* 7h\Drm\`$UU#DD!r"an* 93ݡON(~ DrvyTuWƗzx.\kGի]y`Hks|? 4f*bU6K㓃.5/v F{&25=*yKzs&0ӷ=ongՙh7+tu9 3Ӭ :l7 x"{1ZjI!%iu.<  ?4K>O>tX~#8+Fٜ뉵;Yds.\:1P(^2zv{Tn'W.ꩿW44P\p^K:xFz', ZǙd=&:BbxyzXMF)3۪ =oA~ps"*cz `l3w4~Ϛ/ڦG`*Y8*~VEi "ell:r+ޔ7HNb]vhRAV;1[ ]}3EMKý@=LW*̖a$^ڕ[c3<|[q\TBI'+0iu o3B*gע-V@a?q)52PU)~ݧ )24kSאȀhݕ P{#3ޱ 1@X)~c4.E\vXly l{ƂԷbGIMd,ME&,Ēp6oFL?ƻ e-}<!H9 prj7΍sj[̼$A!Ee3 p٫:-*wc-v;qw2rT>.P7\쵩:MȠv;ñ" gAcQ^5!3 y]o"~=[8)"[=XOn+J<DQqV@f=0:Ǡٺ~?<;g)bF&v,ne 2)W]}эĴԘUܞS'HIbo\[×)?Nzie׆ea[i1K&?,Yˎ 4?Xffb>d}lԅ{Ҕ)L_]2jz#uga=zPQ d6՛Gͱ ѷ=d'c%Zsbq٩),~ի8֍{ >A@ Ti$èjN|2P`SBLB[,&~E )zC҄/enG3ym,>z91fPXAT%g ٵZPtjI5_ wf4ک1C;/B(݊wJC#}B=i[ SSu1鳺x_2Qcjb\]gBz?uߒ 쑷MUNCb;;-F LCu:6Vϓ[&gF50IVոeW怭rSw 6QۯqIj*ثk.rҵ^\]8Z}-T5MhfUߟ N4 [ݻC&g24@D?4\p|CoPƅ?LW|+C*5rOE`D]$ "B Qջ*6]QqeA6>1m9{*W+*F硋(e{?} W'sSe;[hmZNt=.>^Y@?5|ͼ!rY H]#\*y`7Ј&_NsMmMpK f P6|i9L{<7*?.qUPl{qkbVC[F1[ZlEzaqdȄ8єh}Lq܉[k9|Z}s~ҧ!UdiV W[O"prЛ9O2Rt%d{5 ·)% _O Zr0Cb?zĊJ$ў^}".6Oz%,/To!\jcEԊG1\lKG}=فJ헕wMZB|~5lOg8ʏT}_2͂^eI Jڽk샯,&YKNl&`hR$4"x$} MIr~B J3uĴ v&WUBk} v:l jpi,,= ;?M/jjZ~y,s:Mq8v\K{n7+],8,X wD,V,3Zt4#'<48"=x2v y3zӉ0Dx0;}oł_9D=P̰Cn{F]PПָbkrWoHdslqkX7Ƥ1V_śɹP6\9f]@ !vy=Qޜ@D^$C/RPk,ۚ*g$4jF6\x?Q,ѥI)<eQ9=H N y?!);`gC ;;+r [SX,.69 @$d?" 4$-1/7]󂘫{ _sVRz- taBnVEĦ#&o T{#G&yF7/T8vwc5|4{"SM6OU{w{l+½ ODU5KviIF~1.t] »4j83 ޷}±-!n-vR™amzs0lS,d2 W%i|`![ @œ!qքi%?!xnG8lK^NSqQW-&*5I]<|{{ټm?Ջ 0yeԶtᛥ= .ȁauT { 0О\S}"zcT6#Bt%[JP" ~L,3OE-˝ sml<6^}SVSLF YtҢd;OHȩbF'(0׉cAk$ez[筒enV09ӽɳf(HdžohgQeSS}#S9GiYٶ܇ %ֽf,\HP5E83nFBg:@A'ȥ Re1c<& m:UC$a=b[fMLVX*6OV*e"0 r&Z/ѳhx!zۃf 7>!z Iɔᏹ-ggAh [[{3[nE4ֳWo5l[\{(Gbg%,V U~biC*; 8} J);{v } rf|g YEQm=V8)=ӳe+̉^`YrClg,E/[}1՝`t r}qy5W:_=n R,8Ӗ'Y<~qncK̼ȐzײuZ^#sùC9R_sLK9sb @ݴ'r4uC2 7lj B{Vce,k.JV@J)+`f&,.cq/ w-!9h|5?uӆa=B3?-Tw/eG!V0",6t9d+1t+#-ndtQ)#oT3_ְ N/ wuOb~nP,#{ QW*D|UbQlF{W6wsAkco*Kmp)0R; _"x )3r#*gKuZZF %W~+9ܸ:apƞdb-cfhFÄtҨ@h #+FFxɐ AtB0{wN:۸:ifm%w Fg{8um;lrlu C n_p hϘw۟N79 ]Uh@Vobyy5+W8w늊oźnƮlUܡbv7n˞R3Vj ,3? ;X;7@/8Q{o;hVΗUU>D92""{s~=U`:*w|1޾ʁ-55H쀉,H27DOܬ)ѿ[k[o;S&1g;{2^Aȇw ^4CBqggLxԈ]Ca7Wvg3fDޗe)Y[b7K{y-ƍs& زuM҇mxKy;gg]L}>ȣִkl; |ـUߖg[pM6 `R\,2*d \ A$x aۧˑ A. aY(X Y0va&~3 3)n0­ZCUDzAR5IT_ε9ߝ;<Ucis= $Q#9dK( O.-pf>2Xg nO n}w;A;Xؕo\7i^w$fSlC}؂o[P)6Ҟ3$[u0ϳ5;,7&#tf^.DT7XkX`OS33H=aY~BݲˋLh"+b62m^FJ$gw| U3aV/.H{4#}-0A:vOq,jFd׷ϙC\̃a]ʰ6"8Ɯe)) 3.Sa<(L|-J_ɿP20M ͥum2rA%㎎!̢vi9$TqUDlFn&iIRd9*Lѵj0װ~d?hSGosٵ%0M{RR˃e/%E&_i_]V%=3=O%iў?ll/J jS b4nAť %A"JÆe8&.3[r^ &tԹm>mnt'?Yd,!:P89)QGQ!7Qj0 g-A4M7f£UR<4GɼT/" $G_.q?n VI!<֠sw_{?XodqF"_j[zbXn],hE`2Z]N-"~X GOa L3A/4q0$Id ǥ e]*WA4Yu❟: ۇJou e?)bԗtK^4^j7fC7)52L[E{lJuo-_߷G-B¸&pܶdq8o3UE./>Vڸ\٠?G_E}o㰄 RR5t4H (*-9=ttw4 =4H0 0wy5yu{uk^̱ 0Q#p4K3$r.c6@}¢oq(DvljAk*ΡU1= z}x3@J{ߤXqAOygsE݊X9U{ܙvME!B~O<~ ce}#`X[j*rP7-Ⱦ7X 0Z8!ec}@AoV$``B_- ZU.x$ceIST芸׵9`q$ VuoW !>y犍k:wr9v@ J/Oo Ֆ4yZ-aS-݊l?$\8QP:LW{]T<?q1p5D3GOUMCP8X ^푷.+_@i)4p1cMU;(LZ)z<$j~?%H61Aޭj"IlyweɰgS9q5y8DS"f[` -Zv+tyě%x3:X܂l4ꮆ˝[i*;2߇kJj=opMjDl}E#]nծc~Nf-11*m `V{ɰ(5q0~c$Z]2܀~#cON}љEzk{'%{0:wqȷG`GJ~'+WrzZS30YضԎlOm5P+wn﨓tR*Z1 ]wL;nuYByUN3ŀߖ=bj7o,ײ?b*q`:TkuH*J=kJ[Y.3 ~0`6`JL"ݸzE3w$v[i}]a5e&g=Q;: Qo\.]:]}JFcge0EW'_0 82~h}2_һ15.&9D6߃Dhӫ.#So45"PD!,4.}c$?KuȀ4ڔخ^Z!$)a*?q} .n5c.>9oGMaM}RBa= #F4go [8 j^ζյ'=w~WKɠDYR3KH}jݥ9_$XhOYE"sYpXi'͗D,DZ_d^{uwa ݮҷǯ@b JHbs[j )T?z dWC&ߎafed9i) < nv k~ruBI7ZL YI0_63b۟*ޅB" ![݂ 3d ;ȹl|k\H-aװYPˬa9Kkrx(l`<ޕE7O/EM]G,=Epv ,۫# Ƒqk4J';tk"qѧN2bKu2vՑA[!q9ѲeRCLJL}ha/u=ȑ<`͔kLP*7cf/Vsu1}7Ӱ1\ɯQp[tt6-ۥ%=:_4eS-w̉"GKM/`o8fIteʐt"t >H7s>}AbhCַ9"/!L%rG|e)bꙸҭ \꓋m&\ zTGE @fix8hw/}'YKC$887ڝeVK }nk֟-6]'_a=BI)撮e +5!ڂr/.@(KDgIsycك^BRdʤ/tFhOckFHwA.,r6 A7\Τx*Y7 !/rV %u8LT!DiiiF[v7m./ KG)p.b2-r8CY*d 6'$ gũ)Wʘ0FNҗ Mr+#)g}Y2Ts9zd[,lx|[ck;:ZYu!'\?P L[tTA+:_ffOپ,&lmNjw]w.>&Eo{6/ c.E[B?N#K j ]a7SN<\h~wܡD_{c8yxPKg.a@Vv8^'FrzX\@VO 8v%z#9G:TyNf釪l>sG*]/b+8Pć 9cS2!5X\w(=mH42\)*ѭހlh~Tkp *YVPwi]Ɵ脝-7fZHmB^B\P/, "IG[\EIm W !7shdr#2ջ4b)z0 ȝG΢J/w?U2RzOV'_N\YA <+d` b坍 |MW^5eZ~X>\k |7WA >%OTSQzE%o[c1B : "/FMr-3+tMHHt)kuԷh+;寒LwHs}<ֿ2>HA>Fn1/e+Ϗ3QfWO2ѩ|f766ܺ!dʫOV=R.ɜ jvZ`-Nz |7j'M.<2HU-{IRG1鼊8.ܑ:$M ?f8ƒ;=Ʋט^lyTV kv_SwJr}>]Ύ\2B FLuZÿߙz=Ҝf:^tg'WúcTD9)gR-7 iχc?|8# $Qq-c®ud  V9;.ӛvMSnr3+eRᩅ Lh0c.PPULq6 pW;\g}'; ԏEF8|**쩟eogT;tժ ixk"h~Acz{hh2aVe?S$4@9456o+w l~Oo]w^5efp޹s P]TDx!{KMyóC}QN쐲hIb+Pl:Mպ w_,9 ,=Qț ̓kۚv ˦O lԢ bV{ \zTed3ōpL㒒PII+P Udm%̀+D}ITlԄR-9G&͝Vx#hJXkg0+yOYѦg?fh0ZU%ǢN}#'aٷ`gL;7C*k|—!2=8&v+A}Boo f װ)=csKƁXY *+w4Jz+%[ s*k{V؀j?zIlc-|G=!ֵֆuˡDFA_,l8/FF |Q5PȢ |Xᛳ[0b |}xB,/)4wi<,[@[a (ϾD_&TR!rwn8|xNpAqSn䧝Z-8YhuLL< CwTm9>y>Cl$;^l9-9BwI',jtҋ_fu!wx}`z_$4M`q`02tq7~H`Vmaȷ=CpyJy J:L^V_{@:b)*ٻ'Zdr:Is"WUAa۲.( q:+}nݸX="bWVW>6ҍ-9`u kN jTK:յq Y%"𽭦ߞڡ@[bBDWP2WQyԌk-QmhYywI31݁ff2ZBH|d#ʴrhS\ ެ{nڟ:2e%Uh)׍_h#`8Ǽ*][CyTU~˝ܛ'f6̓K_׼A P/RnB!~Q.YJi.֢D*3'/mkfhY(i1>;,T$ٴy@U Qu.}4쟦T[ڸ,$' @7uѓsGWK!8//cc_/A 篻P&KW3)v!#8 -)iٻ w/y1 28 6{,rt6N&m ~alWț\< _*wNhT CbgW3gr"^t( B t-q抟ڪlvT,N;\#k+~ȭ:$E 0OAoG"P(*o,ʭsTx%i:IT{=ӃO^kaL45mKo; b)ΌJUam뎯[*yC1-+fB1ɣfo" .FGnaL<$՗P*Ʃ?-OO~+UGGɮ2 *Ջ:"Of2s'#.ʖK.Lp A)w5i )JHN[ Lt-~^D.4-þRFsiM)Lؑd7u(6 b݉FX%W6y"sGS\?͈r6b;{-* UlFSx`n%)u`hT~:eP]7FJH<4> Z̫|e[-9O;*i7AԖ!g8hp7q&Vei @5 똬j %?J*ؒ}drno82fYg 7P-b\S+m:ЪLCB9-9 2WС @)XgθsK)]Qg[ -ZGjWDo RN:/BI3h^dod׵c,^ֽOقKC pRKÎF_Od ^Y624 s!rƬ6se[^D7gϸ/F;}҇Ža]ϔ/on'v$zgѽXz+TiSڇ\zeGOq:.Įh\{^'Oq'f`k@|Ϲ{ٸikﰖs@v4ŻJ?ģ%Z)"l7E܊E=9Y<<e@ e'‘޲z5괾ke ʶqU 䎗 &6“śWFM.,ps& buc; L}U{vx_"R)ۥ8"<sHCefe.Hk(% ++PM>Kﳩ[V7i/l(58B|3YZ(] ̝4͵#<]Rx2x"SfMqrW.iWT9ڪkN-J{k}\H%f)4.a=k5 ++%4#cWnaz3n)53dZKU2wyC(vqo!~l$XS)br|A"Ḓ̕KU q ^k(ZKQ 3lH^3mT \0}jBx.fJWJtn OHLh$TGnLpfߏttǠKoM?\_w$[XXRMtBOQ{ŏ7bs $jz\SWcGY#EoJ%} cX79z%6Ï O~l"ZQhL`{me|tE=Q͝fzsf FIҐs>5D֫ՉKs7u1(nk]qh 7-VuNdH+WXnv.lU m5vU6,w=)(/yNP1 l}DⰠwTA︩z&Q*>譋Ɖ<>zhLW۬վ1gtcz Y"Ne3r`N71 ?Xߨm=HFp_zJ By j]tLt8P:Th04T\FÉn[PoKx~O8dj32^yn XNG5[#{M K[;±']"d(z-#}ov}`-"~-svMzDx3VMݤGf ,^e&Sc 2'%җ%or:AcDCejh@7X;ϵMYدzۢT:[,4#Ym'avbipv|\Ogv@S%&\c`I v!v㞱ASQ:2߫8RNMyߊ֒ţ7uAH֠`'GuD*a=W>w n.A'" ZJh?I֤<ɚ'1ɯ2"6EdnaVi~o2_[ƛʿ4֚1 LG86O.`-9n#ϢZ9Éo A_Ć;rT$bI(K0QKU(&t]qeRgxhXx?Kv%/ .!Ht lK4S֎V*&e{hcL40)3L& t* p` "k m&1ݧxU9z~ZV:Thz9JG]fX"Ȉ`^o'wf!oV{biYw^'X vqh+vYf#1`.5t5:bLD#Z[Ǟ4דSBu2|@s۽g>ľEr%ԑy;B+Q:_Cv}o8_ GZHojчԽtw/XHS*19`ODF_qA]fGzZrxXӗ|Kaxc jӣ`i\V HJH ު;`otepn=XN =yw-ݨcbꯜ:DP}Xx_z|~9G;8L}X;'`=d^%¬Sh;ЮS4*IExg)+&FT5KV^P|x)rn'F|,TVwٹ;!wz]}֑-nf {.ƶ^ʜ9}UY/2%ՓUFl)<{}9Tw^2y/Yb E'NZvڅZGf;ZYۚ)0۪F!?#8)Tn,jUCQKG7Rvk7$sIy0/XjDL-Xj2joT4 f#`"oVxEqI]ε|AUy||kG ]%+%t<}ٺR J;ӯPe8v; 6.BQVgK gQO{Sj=!e؁瑪vaP;f*0ttI+WtP ȇY63x:=؛ ƿbeǑ'0ϪL02e+t`Z^Gg#±qtq3 uG9?"FP k mѣɤ:c*]DXf&--y;N*8Դy7'^ŘBVŸx8 Ÿ'}Rd奔sFP?ZlS@XR?crpGK# j|\{A~ib?RCw^Յ f%ZȏHMy}v~RlcC,-=ŽsfFk?>RJ_9D V$EFSL2ZcG#>Cd\I <:qU52tӧc)5g:;t;uORmվG\'YbDͱJޞJzPotZaCC7"L VDCt`~7+ \yX+G//A" &edt\H\qKvW~wl7:/*^!ū~D:kPr}?`}%ƩV%Fїq 8Qn˕v$R(Ҷ(lNXm4?B\`)ОKf/I!fXRXl Ra҅Y|XL<t Itd,\&2^9\{]a-ղC:H!)Z *dGE0Qk8) b]ě߽WL ([kM{Z )jũ&~L^`R"OrSzSi ,"!8(i>P^̉Jhٵӟk57}_zc+ՂQR 4y&92xhW6Fdp:Էv:LBb`b]5r Z2{77;ӗ.ʋ[ȷi#pI<6!O 9sdX;+H:DTowB⵭"G2anlb~s8_/jqWGRʡ wgo2e2?pG.%|wo(zd7lށ1^p A5ތg,^}0Ԕw%;\Ӓz&~+Wֹq ACf_]ee\07cDof(8 T8coBNC')qvhVc9r{yEݬYfEn[jxC&;r߉Ej]!]4ŏq\ a,﷨\[R hW0I2a=ʌXoJc4f͠z !ݡ6Z|0<+ #iWIiQA { 4W)/* UOA:\cv&lT}繎 H A-Blh_{+)G?}I@!v Kߵk߆h.Q Q0 -lǼ-] "=2_؅Ӫx]e$8'ѩ["~œ8 YBʢ?+E <'4UUQ4.e; i:|O 3-H//E=H%p35%B}_/ F8$8=]I>Y֬>Lh;Lί0;lYUv;>=g+[SXD!qr<ѿ[0cFʕAl'rD2}|<5l{"d4R\!c4Rz/kt4[M-kIO!# 1-p5c5AH*w^$"|ȗ~aA #&R粣 -`1n؞_'ܗ"S]XTd]>E~YbyZ` ޝVp yzZ H^I2-P\"wP`hZQTqA%pXEe. ?&-+C ..?/}Aᇪ.U@}?i*}j ~N-p;+#֑.ϕ/WQ|zrv{7ztsɕ#[.2{jĞ@ye. CH!S3zV &EQ9d'dUGh'jֵ,inp'YYcH7s3_dxJSh~\dVF2g~} G!Ƕ6)/n7>4ˑ0#tT;~p*e H'cU:{!7V\lm ެXB.1Ñd7ĵr-=/黆Q^4HȶD1Z|x}ʵw92"44I7ژdݻD]BJvڬ)DZCLV7EA WNꢍryrE5F} 8UFZ֚H5hRc*_sH-LLRkqLS:R>X?RY|F15N՝~aZ+Seڠ?Uլ>sUe T)Ab%!6D1Q`/ B v* ~hPº &NdI9hm3[Ҳw4k*C|yxv<ؘ Rg-ɏ`Y1ꖱ-m }6sY34#y#rϔ[r#giE#CzRg~ʄSBm'2WB|bʒ+mײ@ºPtƂ`E-Rl n}X9כ G][SL_&~Lߏ׳hu 1~>z//5RĐ { Glc(v)K=FF O6)'-U ) CDa S? \W7nڳ+d}bɃ'LIYS1]nK2@ލ"h@W4R^y~>n<&1ؘ}9dgixR!fQF3c>q[ߞw㖓-zk,_+ڀX9]o͑}tTW%K9nu_b0I燁zK-!xnmAk\~LJK\~IO1e!m_ ,Mȍe]0^\Q*A]DAը!Kfn}2Vz׈Z+{~á@wp`Úyn?zDպJ(<['2 C,tQEHbA[Ri"zhn㧷x:N 8lp,_qV-`XO\C@c8ؤHm Bt,b:1SBb}R}͏j+rP*wou}KY{.UX4VzSĶ >uCJ4ο/ .N!>&K>2וc7&?j2*d3UHP=7琫+LOByҔe5FL"iFR(5-"RieuX[S,o=jZ1T7l nSțQʼnl9pp~Sd:9 c1O>j]>sUM~+h:zvdGjpܲ ӣƱ6֦ܿ;xƃp/ݚ?]R Tgb,SE+kr5,ӵιAW'=yΘM2)t*y|$3t+Ykh鱓.5ۿQљ8(fee> [^^JGu!WC\7da̛u8S++nL(q)܃ B#at3_TWiR#7Rbkp _6;@, S[vӭ/Ӧzb6&6St1Q~5bjCż*^ww=cPdb ^+۬ODfюf"+069 )@_X4쥀%TJo @yN .H)]h~r"= }#C4aɳ sv6w@ee`j'J?a_tDGׯs5WuM2߳*g22}8 5r<9zYKEDWLuxĀI;agg΋x>yN_&R?ZfNPFSwSTɋR:TyC-e](]׽CR ku\o؃8'tGˮmܟd24C{"9YiwETd -=QR@rcKKFi=x@'{9ѐlݙãq#sܤc-[&ԝ$ET/\S@BVDI !20Qܐ"dʷx ˔{ .?hWAUa2OlO.U24(βi+Q$٪] P펙< EY ›d󺁬SYCm|pn:uJ!ICοtԦ ~{ꈈ8XBlVN[?3h΂B ݋0?Y4a?]ͫG\HUH0fAͪaFˣ'qڇݓ $]y u\°Suaρcpͮ:UYi.c~;@] n۷SGz~7eғ{ sSQO%XR9DKF ?f珞ʣ7<Я5lʐYd-aiA9_g[_;? }Sk;/_˦&`r{#*ru8YG|3XP?앝iZ7d1@ҵյQ-bMH{3h7`?NqÏ͔1V-|K{ WreP<G.򲶡ZLIÌ]x.ԕ֬ĨHE(~4hKVy$ŋZe?EbaxONOrŋ4'-a.#š| Wd|#`B3.+VNo"C<&d6?~_0|ޡs.یD#PX+mW}W|p/A\$6MٔhƵrp7,zJ Zb 0̲,L-nY7 q禖(8BrKtd2Ia{|ٸ]u+]~/}_ ƌ2htDf[&0!k;=ЮƭX?ȸ0Zelڽ=ƲpSn+{#*i7If SXA6ƕoswYVmjm%/Ş,~hWe-]4X%fJbqQWr,{I4OkdOfk9ep'a}w|Mk=\`܍!+Og.PiEL눵,ch-(vmG+Qj=_tNM݀:ϛkuzW ڽMr( ))=>nMQ  ϑ d1?KMI>qAG$SE<-ds^߫2szwI w{=G>#LFmk|h,^\S~+`JU!$+9<t[ӍL?DV(3 !H/PTHh9D@[|}F8M6&2"!߲ҕxM'ᷙIoyDăE^C"H[k̉{d;?c!Nۤ?>ij-ouHdM1nla{xw82K;@]]"3óDVr_?yj/蜟{a1bktjn2)}ɏ7SP} =`$ami7ґ-]<=obvXUhQM֜ D2W~P]>{uF!Ь1&52R(*p8RdBz,fМ$7eQl{p&њ^ՓE!GK15P713fhb?WFPmV۠TOq iŖ.e/p,{!@֚lCNآ)0Rlۓ;h0bfK~ aTE85ˤe0ڳbO(pN;. ~ TƊ vfr.Nj+RȒ}>B?Y@#'cpk%eUBX-ostMOxdJM wm|'m=}V᷄Sӽ}tk*l{0D]e09ޞ]{f+_vn8=8̿3ȭCi}nqqq-Ƒ J?ąc8~׃OݏC1NZ1" ?Z)ΥU6fcTƮb\;\=wvVlw7MpnJg%=ʊ+Ϻu(! E@P}.Rdn.-)HB@~T1 ;Uq*[Sj!/U#Z/+/Þ Z7_5&ķM3bR\4)`TMh3wBIK\Xa{D'G Rup!NJ n2cUlDKKTϐމ]I_~[=$|%3^I A]rpSc"63uDTM>_zw(3&`yZᔳ ?SziO^vunM ITBMԔrܖB=瓠#dx$$"ºf1rS+&e|tРnn//ZZ:D#mu;h˗kt}+Z*eeJ5I\/h%bMGtUO򞠫7}ہ{=˺-˸TcD,+KߕR~I[t-TOzUլYoSqrL^ ʠM@oYIUݞvtI)+wM_U$r=àI'_0|bA~xCt(`x6*2Zͮg{BB~ ,q158;#+˩[$~΄ ՑTjITZ//.=a7ܐ{qf$hh 7k0ٿUH¨X㷢'Oڼ(ƸKplF>ZWF9 ;7@Wvg~r.*bd߄NTյ&s[Y-Mn#+zi4wvYxH* ]c?v0x ʷ@\?k?P<|ɠ8Ҳ5pUBKLE\-"Re)ELE'a,W]KOZu/j_Umܓ\ 58 M@4G;Q?M~(ȭ_6z2fJ7];oEϱ/hn~0=yNKf"wiȂJwS`y^@l:1[KA?bMnQz#JO}.noXi=ޓ[eڽȪuoWI_pk}k}u 0,OLx!e7K9jyZx!jVp,_R~"QG`cc f&'I 9(Tb=ߪ1mhʓ0r䧝4|K1]ǯs(y\FCV:@-f乢xL)M6'0QoRw3d{Җ(_T-o57U w58wԑ])5)>⪝Ceͩ+iϲ0h0CmC1čBUU8`Ǣ I%]"v׻B 7G-1Զ9:@r@~V>B&]˦@kf\Pp1P`oʸB$K@V"^(~ts4oYX7|yi.`dZyI֘vAYjj5Ye<#XNZr6̑$O ?j>x!׌&rوھ͉ E S6C}7jԿZ1[Y^:Ԋ6w rq/ЩM9ŗ<'au;p\(]Jw2|R]OusNgz7 <0>_zt#Quf 9;:vW膽q4P)!"m&GSqK^E>ȂM=X}gCߐy fVv[Wn]K"-r ,+H*VPKJ]uslsTY+sQGF^KwkRijjīih``\ ajxR0wUQ6/DaI u0esE4tr=ڷ?3Ji[h9kn{7hv̞-^)$\Z@iw@MFP-̈́Tߒ{:Bvp˂Q\d %ntvѱSd ٥DR9Dc;4ȞVeyQ'z;z(%_u֟]oG> v dL(ZEfBś6.ZE|˲z8)+X7$hE$ <;vj|$*1$Z0C d#jinH\WG{aǃGp0|ర3s8U* 8>3n&* Gt$V}E|m+aui=Cz0, ɿ fڍ>PWCwM-+fg띴4uKLgyV`Kr#nS# F318{ \W\Lǿ%>;}doKYׄͯ7pl.ySDI<XߕOtrS᭔o!'# .Rk_}cppsr) c%mmR.Vv(%6Ei';X\K_J g4>emvflݟ"hÿ_<\=Ūhg)u"_IޮPy 7TUU?qZߌ kTX4/1(J5YF'yyYL{E_d"~yfYcmjbY؇vcoxw+V)} &ku!'ٞN!]qKV_IJ]3c$.XHa>lIv1fO>:bsd-Dχ`,Mq/Igfwa0"`93BI,e˨UD ݳGt;Q?U'l 11\ib?ygG/smKs]āHDx+d}(ڜPMSїeXv߃6INuyĀ>6e*yG+++s`a5Dv9aKN̂sYW욭?f"5GK=i ~WsPϘ>|n'Uẃ(.Z2*cWAJ|3CSW 4VMOr65*~'MV6*Oǂ8X2ĝQpק߿vLuY5G)?Jrmv<wK.V2P_HW(P--K\OaV'ֈJٻL7V"x+f?B 8*PR$ͶxG4F~Z`}4r:|wݶ33.GZGHG/+B!.PTe@/:-ul-à//U~όKq_ϝFP!>VWxP9.n5iEl}#?R(\mZ{nbg߾Ÿ(XAqh&qwMľw# qɰB60)NUaHa2bFF!ю-x[b^q1$Ѽz[[~!庣L2&9RDHu[i\qh8pGɸFH"[zhtE};XXLdb=:jfCp3dXᖝ"t7v@+6RS&SL6jg>Jc;G7bWli9R7Yp_2^ɷߙ8 reR'rqPW<)*F?P>.XoûZ7bFA(4mQ3WV 7l8G-wݜȝ89$)J)}LZQgd=vL?i;}#퇋0喲_5'IL+f&xC(%UZD5/R`<ֱ "M'2z'FVV|MSr/6b6ͭyb#":K4Kz$z ׁܣyN=<]`d3<囏ú(A|'8Z7JD(M,Y߇JǘGeкcs>^ޓӿ}nv4.e_|}KK8z6vx}w̻so ~n88vx3}wK`}0eRVG7U:mA' %C_i6iDPjl6*}5":}+tD*DYK0{| EV-BqyOp,Z jnuwŞkDivQl=Ɠn8~S[BVT$ts!çs8+ꎟ tK5@VU7 t~5S/,PoR7e胼'o".W>Ŋ*I/~B85;cFEq0le͗qM 4!JاZ ;~b/ꡨZA@k.Q+З$N汵v.XBiVyj0C /Mu\Dƶ`(y-f- Cj  I+H,z;Q@̺&nd%FA9rL΋nf<+!x )öO) R0Em)\wDzWFsap - NYczs!.>)C5!jo~d~He~ggk(a`^qB3ާy S_F,$>ꔡ:`E%S)2l\!6mcYFոJ[3Cr7m1?Im)wK)v=a9QњB 6U o!IeD!vަr%ZuؐMCc?Qvi5cga?^vym5 l/Y~g/oӸ\"VކD=Oϴ!59bUt6w4Y jYz୰+(TH*uNO3v<^bͥOt|&p7n-owJY暡!Wb~)vBט@TϷoO KRn XlޜMKN"苈t|R%QȪОE]egÜ׃l$]ٍF9B%;P_D ٩{4 \!cbA'{B}#]PIl!Y銈VεqWD\QgSȒ_t*@K_ܶk' _'&NvxG5oH!ccV]F椠7 X`^d 3 ktMLx'm޷u֢CcԌjA}Ŝ`1c^+]E㶓4KP/e(]`((|64+mm#ieJՎZ:F[| ;,s |>@mk_._+_nfCbY#ϳx]T-si.DFO25q <ԵKٸ\ԗj}S;,"5ÛYFZ{@%6'ʓ]"[_0k&AQy-C)>l2-ය%x* O2K@0uH0]Qrr<5$8{1^bm^V5tJ~+hRP[g?78556{WR7)ٮ6hoVh&uub(p+PM;>~OO~퓟:✬[?Wu(GQhNρFHwhݫãrkhDY\-X{Yp:Yɮ[{"Amq5 p9 Y9qCpmO4UzmtFE=96I")ZrZH@+4F.I,yS%jEvXabl={r]MXbiM-r]33z׭t︾$À^H!1ʼny6hOZy`|KQe䏡S牸w;`O]',0ZG K'd9S% &ELNo3('mCHYFA#)[ӋF$USLgSb+ׯm vov $Oήg ,pLql̿iMiBD@:x.淁@Zakggh߱r \x[h Q1:6!V_G$ٵBQRN>bQ<㛾q2RC@%JVPs Wt 7lSt^7а /ގA;ͳޞnrץ3BJX3.dVX暯)>9LR{$t7Nla0;:?y5ZkЯ.b 0RT+UmnqN]  e 7f.jg3Uh`++E-{B V -]@,ha$OTv+桃 E?o p8<4EQ Ud2cϻ%pӦT\\|QEAH,/ rP aijjFۜCCق[*ySqdTY 7¼oϡOن1"v2TF n k}>?{~=~CayIc .;Qf!6vBW" =XaWSR҉a`?Lec׊0Ox(-_Fkg[gqdzUtłd5CYͽ[p;u|g[Kڶ@$QG>Ȣ@z5 ® zw-O3v0:P G@Y֋0ey)iqLT=9X<;Nwldezuh$U]W`^29oo,1*C=f{5`pb@(yuu)pw{Jw_\m_j΀׌L#.1trzn O^OO B8'N՛_0N>1=Oٰ>cזӫ?7enLJϾr9Uj5SWܤ0 pgZ U>ՙk:%)?r* K7)}?[exFڦ$YO<]-u/hA!zd7:O2m5YŕS'~، 5@֩qqLsC;>Pg_fznQ 8nlv>1?Lknmhps1qvp_eIo:zeY}[4t~kNxG:}sxglԹIq;4nȺìQXy xf&t`Z0`PDh2mQpv]ZDD![]tAQ">`%!6z%uDݻ,:g+9!!gU9yr,2:Ğ<'|we|.J`ɗD?XYMldE男=!DH/?Lق1X//'%P895 Py[:U$b9L/,?b;7] +}s5Qߌ>,u(W7(&J_7,<_ڒ$Z; dK:Q*᳿Z!)G0ߚ<>p;Ve5KNI)j}7p<VbwJ%Cٻ$>!#q޾QBփc6&B "chq8voH~[7>r30*'6 MW >3?XDgikF]Kf[kOSAupo"W1'];x Wq70~yK4p. =7vk/:fO&ƶ]ʪp!?=o&A i2$K 1mñog:+#xsPQ? 21L0Ä?n C=s h{@zʥYSr!tw:OTq;e2=*uܢE':|M@&x4SŦT|*l%F*[hH!9'lor:_hw~,PTJS}BzNՅn!k:(֪piKTxC5n}tfUIɴ,et?Qzd)dn6=;{މ%`k{T |a%w]ҥ夹yf{S(O;Q XG8m4%y^᳚M{7o+&R֛ā!mWH`|([A<ظ3"ɴ -EU$Ms@IS?R^Wm3=6? Q'seqpx}` )vV'oOY ]6uAGS?rKBevgc]{h%9'猚#R_K̩'i.~%H<-ψ=1~>xrGd1[:Bxy $mbɤ4 u5OSu}9 Õf6|'RtJj=;t@L~6KRU [GKVT錿W$ uދfeu4f2)tyI 0h|K7E!n c4"6JlIWPnR0+ wSa$Oq-0`+h}GюɁzw9& vι7˨̧ЊCfGƚ[QDL+| 0fI2!ԮR-\R2d_{bghϨaNH~GV1QW;IA_}*J3N%@7uHy S\ى FY^}$(W] hm\1et:x}Ҏ/K82kN ir`zћ  ON| 6T*9_]ĨP~+#bSfeeMYo2A1WM<@[!@t3};* U3[}e:S7(z$\c0z'󼀱^^fdUmjwHG95}\{YZְ[aV2fdӑ&yw{V+6N[ٻ!=ϽA)֐P ۀ+.7xYǟM#tuCz}R^O碔uH+N,ӝ0QW5㏮/`ui+"3e:˹-'A׮BPtg:!WlL@ʯBC?UxGxhW ;'O3$HǯD;%& %MٯTͶїq7dUebbH+ÿ`W˝y5]e8:{7ʤXd8q'""1,ȘyS{,?bq+$YeUQP|P*|(s6ݩnOuV&_zw,t띪.HQz\6O/ͣV\x~׌1u(). >SiG" l}-%N_iH^֐NEoYadg;l *xnsx>Q_A^^^$z8v❰TpX|ϢQ8XԅlRN=ןm~vjecZ6yNL\ٹjѽFQtɟF%1N )kH'`nڙl'aV/ tI(.yXhx "9((mea(JɘСkjŠWv]jɮ)C::AX,NH~,~pCEܣ3wo[X< *t`sfXK8#,w:oy{ljo9nCJXVǑ:dzߡ7D  ֗A~ƒNVMES BN "pA p>99a1*$QZsG5ȡF32zLpxt퀏aX(V}fy˫CudбLqgpz^C>f䘠j2VC78sBxWs\ [*9?$y\tjƴ~v Y<~Q#zj*B3eSgtJրY8{"؊c"v)2s$=/݋w0pZ+gIm3!l?'Su^leS^V*ߜ9J?XG${e~Uqׇƾ`k1+*8OԊ3C7=W!U9UN0oNQ=`ĞZQO]̞A<20PCeyclSlq'ח=^̽kv+b\] ~QXym?/MYWQI#y#qqsylF>T>~ A0ƁO|n}ƿr%V6WW{j.Lei .T~i]Fuƀח WB ()4S{ªʿD8wǻar?*iV w1k_ED49%ğ32oߨ_H UJQ͙jsڹ =2eCl?<4L1*}ubɮgwRs `)'ZUnkn9P:_k}O W}Tn'daӫXҿ@@^so',J-K`^XG,̥},6$Ԯ9=i*4-nKHS}TƈJcr{Ux)Z@v~ &#I~H%'\ -ASn%jj}RRKFMQQQز0[#7,LkUA3x7Hs0u &{O@$VX¬&sf D dupҤ (r L\<Jo7$@-r'͙ʰ7v]3r ֺ*;78S je'qS8#TO@ޓk֪oeT[;brR[Ned-Y֮(ՀЩ$GOUIdqO}=w^8B\AOݪ/AA9=3˧Wdg؀+h+p!o`0=otFQ熅SA| wq0UqG8@hX|ח~]Oti]Ы{/C`<Ee b|zA@1{$wMYҷtg1n=vRTD#*B"5Է8Y % @wl"Js0 '߭yߟkVa`{1rkcr֜Ӽ6%~TRZߋgw$.XTsuV= @0-#:+klշB^VfGsZέg,mtޟ5OpDàa_',J^yvepS-*~R[7CiUw5WQL2@uZ`]v=71ʑ+⊐b#ˠnjI,D3p#]~oej`yKf o'^]ƖDYn^NJ'1W[[[=zDz1aȈNq唧1hhz6Ҁ8u a؛YĔ,lm~(8h`" %o0fh[Uc9kGQpl<@F(һ|7j,گ@&ԃgsCQ:f<7F=%LrC{N=,yv}%@h?Y`K^\Դ bt) ³׆`OUNzѣJh'0Y^‘Rq'OK{XRS7즸O:d, iBL{f]޾{bL7OJ%0j6.t 5V}M9_D oCvVƅܦFOLƅGLpMBۖneݬM5"RC,]b _- ]t{Kʆ t6jr~>k!*|}D~FɑObnFWFfXޑY sܱ< Fe j=+N܁K3n-1qM:i,ib<:_;{ +@VeBN^5:Z?iJ(ReiUP_<c8)u3z0$|,RY~Scy4{YX&s& %nHF2ҋGT~2揆8ӫpb&9WT/8#I>th}xGzHڤ-יRi\3Y* ?-߽*fI;cTx0k8+T(ط>uy-!!$,]Լ AEĩ>HyfrZ$T1h! &hy"ʴ,$&ƣ⣏Wq{l-Pq{ Va֣&hu]frS"ATڭ*kSqc >=XYZr-'U8|YG?K*"L92 ȫe k$c5 TMz7(Tτ/g"f/ڑ2:WO R)8V>]p .= yC58x:iu Ft0ZU=_{|V):=+Ey͊jk9#֧8%5;=:;r,mO 79h_+*[^ff;GSkØaWETWh ݋&|@~zwwk(@MB!@EpWтPQiQ/1@qi~Q8a>LIGF!4m֥!qGx~6 .J2PtұIoC6]mh{ XBF`p: A"Xܤu(°5g'WE:[MK.^Mmۛw=bTط%4İ[? (w%m+]8" 9Hw^(l}vNTx!c0M[/*6d泎]];H4S)=W 1)=7Z?V+v&&QeqRJ_}5B$VAt @ wz.-Ǡk5|la!&R/SKڑ/ZnD"ԏ⤑垥/)< |yӜވ~Uͻ~-c6ETrVY؟I,nJ:Nl8yvc|UCBi&6 RE*j}SRrXq3a #!Sz2zWGJlRukݕ9iXUx^yhEr=mH]S!w 6Qc+ hRXtqӗq.uNQ E2\:SVۣ~dmCd 7ōh6@?LΫ ^m{z,+p |3 :ފ B7LX>qz鶆BWdQ*']6 HQm'ϥsڰn utKZ%0" *'y!;<<)Tczw18A'2 V\hgEuDHmƓwgFe) 8oCb<`Dd+_d5Ӄ7tlcU*k~J@P"Y霯/8{k5,xs&F^kϪTI>OWK?\ \h{lJ·<ݷϱyP'?zVgjF2X~ƹ.11Z5s-K6T)s78<8djjf":WILyLIszAũD珧NfGm6TNJǨmK]ǤǓ6;Јb&owӠ-8 *JSYY_Ӟ)&zWYISf(˝]5Ѩa#!,vt!ճF!|/_ǣF7uԼlkN"W}1 TEc0Z|c&?M|޽Y6OJψO{KO$6ꈿ|'yL)~fH~ꚤ\ڞԷPtmhIU_Dwk1>+yD0ֳs>:P_bRX*@+RP#]b.8j٪[VUN='UbY<%ջJ=C(UdJLZmQFvnQvZV ^F*/ k¥UOȅr:od 2{NZҵ?g?1G*-*0lhƶBcФ<5Z_/5{H\d&c%ЧγR}ylX "0%ꀊr?.e $,y]E 1M'|RR;tdG}٪[.pPE@qr˿%k%qN\Bh,,IM翥~7q?|Z`Hh0Љ[ri b͔s^VA4cVO~,bT'Y50% 7˄#j]o#tDT,Z^GV~ ϝ@k$uBiZtğŤi;NgB kdK NոuZ~M z;^[ڌ}BVQI}RWqǁNx#8wVk> uy_"´K;\:w`Y Aա[OPճ'c]󞘡-e[c R../dM^ eAϽdmXaqyǬTPݎq,l|Pf>aqH)Uóɮn^攞#a* P4\g·xG-1w&w=Iu|Q/^'!FVo) nv+3'%~ <+umpyۊxO?j&1 >Xq.:546 p^}l=Qto1ZZ*h=da. -l wӧO/&PItoR,)miHScd>I1IK^nѫ?KR6F1%q.^/3;p)YRcg p|:*LvB[1Q sTYjIl{y:[5~!V$-l›=4\8|r((~IcrGT.׫YD1`KJmv@=^IyN솘3,Co! en:*<ՏSՇ3}77#|eTSR6D{FnQ(ТO4][^Ǚ'4^3`xU8(J'.=8| nP"M@wۍS 3 zΧHMһ4>3 m{eҿq>!#t Qpcyw7ЄhS dgV1dR猄Oi< c3vCp X#|J5^;@! xSì:E/͵82::@ p0l3G}{K%n"iuz#J;jx`W58Q_r8matT>]{nΉeNGh$hO=sCzq%f޶DR^y.3TgXݯ@@9jxX[ rO|F)J:y:{g>:h_VY?C5>_.V'Qo/3Ձ.eo9~99A9{d=@ܩ{C+_bVc3hX&r~^=;{3֘׫|lݕFI4~,l\ ":o/NO2N5aD7 ߟFAmϪ yHXtq0q4Ցlg0Q>=~l8^ a /TNuIV%@aDZi|Rt]Z"E,!ӧѕ?łS&BVV6d"Nλv,ɘ" z/Z.΃F놄AsH.孈&:mh?`b%бVp /5`񠕳E=[_7Л;S>?uX`oWHZl("+館c枦ɞ­[)A(p$~@[#*#},+ZzcyEܯzmwlXH/_zQ4"~K?dmQl%n`.B~Oog_?[sv)9zXgA=,}#S؆TtuO42?4ڢ#:<*~f0ųE8g| '`i;3]8bS8̓'Pxv79|$_Bd";:Q$K1(U8aF5͙zwدj1>0{-_g1h 7_클5΍jMgtMJLo*^#<5 ^zҜ0fX}|Vh u/FijW~,,N(S3N[\??M7γ4^ڤO $ZT/ x B# ߜ gh%ߨѤs_:?L=bDڷVaKrNtamhzU?Y^tuN= @wp~BL:~݄vj1cPAcX*N8É3ZK>Y<rƯr7^N@+nzDIBy?`7O _+vr {~6q9nJtuܓ#jM^ޞ糿O%%n56:Zo6ˏ$ ;/uf| kCЬ!Bfu"!frE1AwWA{ cbNܨYDos'!'Moba>.,k\(}U.Atݝ%ǫ̷t c`mph2J.S3sM`jdF O [m *֗&@J#֞[uAj[rtJibMz&_/ L99X=kYeJ^6i-پHF&N ޖ)!*Ƹc%ޭg |"rդ&.2q`c{A(docOT>ȧ.P:oĿےdLXz1Pi`9#) ҙNBdӵ$LWB/~J>c><^n G 2XhPrO:z}ln9;|pǢm c %rEXX4 ³E0ſ;YzX|EE*!~Ϊ!U s H:.Ԋxn [8I) raIL6!!NV>0/I«R, #\[ͯ^ISgQ%C\ca=-vν7uK?(핾6⎬]tcMc1솤:DN$Р:{tٸO;7D6$9ɳNg(aYD,co=JB)فr(DsUXc>JdC5(8`!;V|20/>Qd_|ELQ̀e@vRy\Öy}^]ݧ;,\HsN|tNָ_]ꃟ2c,K2TӕԘ#VM[DfV%qݽ&^MJqБ5I>vY[rrL<;c6mBƬ߃>F_4)яt<ä٣=: L R̄G2]0ǖQmK"h.,4pos 9R% ţ7Fg(2Lf|M9  r|%dɑ! uDUVyLҕ)a ƛr}ؽD /nT:fy"?'8T5t}3W.|7T 3bOZ_m T10e}'"--t,ջ!>d4eag05ξ v@v:q@W޲2aX2h T ̆e '\JwW2Ι.v;U fU2X4P38('/*s{erC8;YȽ=ki+~ϻFM!#Э:f`kG [ԍc8FC{5]]'= ͋ƕKdYPB9I|h?߻r6 Mi ,i~8.%2x9.Za$NlHUgf gq*_]<,*c@H7q 9:K2!뺠s r!xx_fZv\0 `<<洢unl`P`k֋v ߑ>c2&moFt:kB\Uk&+M:+ZՏ=dɋOKWQ jGFzuAF Y%.%( _<ѤwϚTdbZ9OZcSo(>UHSEw4̨r[<$DYދ^ ܗyKpYeeC"ܖ|s`t&#<;;,d=Ld6 6騯~]".NyL [xޢET*v5s|$j?~ߣ&߿1uO5#s/.84Z_i1Sà10MΘz-OYDXcVuGWY?OP+%RФob@Ʋ!L qPo )|*~9Lz2e%D>b!qlRG ʀf 1{M>rr6BpOɔWb&ܰʸqyxDb(=-I `ԍkjaE~7Wp܂Oa|`(W93*h>Vq $C"[ _VEdL1Z'֟ԷǦ ?o6u8lmI]WxPFwuݩMYcS''Dv~Elt'cH| ;^q]W5kIf4.Y¶'E02'wV[[QrWlx8xA+8hj'TI3'"\* v|Y15p jiLeȏ^4'd_Q2<,@q.j!Nؿ)-P}#@1( 2VީNFZpN0 E9͓ cOrǐ0'-P8x=gmv~btG_7\cL`y?n@htGhyq7 bm y,\]fe[rKn,f]2R];Frk\; *xrh fq-`黃Vc )\ v ƖWt<9V.yS3!+bt<F Bf, 0 # x0yDA}M0fV^!лF9"MP(Ywwrg&2&  Y 9)#fW*ٰ1m,+X;/D|OJNwKv>.l>+H:Nt^5D߶#藵++~ӂL oBI7H8)Ƹ^՟ BeD3P5 xMGA"GOݠ*z\"&>pt;U&Dk軙;mnyఢQU9Zy UĒc^O e~$t)=^z;t ! lc*gbb0[>զMO#Rҟ}>^ Nn%C^| XL}&(}ʹsn r vaJ"[Qh5ʲ=Lbs i2G.x /n+I߁{@}x#$ǔĉ q[5$ 5/氺^%2d33&V* 'lR ִb.V$a w8f>κzx8Yu_ol[Hc\GɷKzw7+Z]zV ~a/2pPށ/g┥&LW4j5crDezߎ% !d.gdB7^2U>f2u|Jt!~:)YazSm:2W_5MNX#HQC\է@n+;>>~)P>3O}M_P,5jTKsrnylo]p7ymG]s$kSR?Ռ۽mȒ@4]H'X7kP̓}L^ʝ7 9,#1 (|ln")XtCC\vަ4{T7=! WZT K&F2;[,gҎBlI>g(T.d^_9Y@}di,6I\^ *j&\vh!!k?)up(A'ujN4p`UeH8[Dc'j^h7Li'vkK(Z.6AU^wc^gճ,VPhX֎ŦW+XOT&fl w ~Qsq7ɀٸ@yHNvqJmB0t2LaԐKikȠ!Vʓ8 i [O': ,QBmGU܀(]W1"-ւ+[u~uT 2HЫML5 A aJW_@Ip@;SYKxp/s(W-mE k^XA%)O*(֢9JLń5fs=z+IEv~ N˔}/@zl [97CSpyǏwQ7âBNh-?Xwک%v:Yxf}r[)-B`G?5E o$Y)X6 8m ,[55ha @pGQ=-|EXNxA<T?=gĭkgMK¡Ow/CٺЅp]l@¿7 ?7t\B۱-BS¶LI#H) ; %,A!ĝ;/U;5%Ir5W(W8Q{^=ޟoci'[D 3leb"+\e*]_|4$*mFLKƲ.L%:\OƯ@qnljCTyG?o8wTfݱƍ窂G?0Z>-xKa[ͪGN梭)HXD /'Y #8(qs,>G Ӽ >_}ߐ|_46 Out3iHz?u=v^_S7qXgYRi/R`C#e.C0oInxQP+RP%.2['s^Kb赹.Oey<*ŠҚb,~h/fqU>\Z== %x0!a4px_ٮpov^ӱږ:'eRc&x$h;U/uAx4ʐs>ZŦ>űqXs1 ;XS/Bl U& vJTS}=6?˺JUDSsg`VR۷k)qiՉwv.E \!W g'ANܜO6rT"#r|Em|5vԌeV;]{`Uo:K[Q~r/ʥh*W]@{Ř4}4Xهs3ԀK/ WbG2aѠ)A9ԋix5烲튤JwAjdϊg '8}P`gzRe;+3.In$:6藮QNtj2Es)&:?RJ|EV"wQqe`?qgo (63'k6 XCWs |%W|4魢"c$񣞛fQ^}HXI{j:v? cX"Ir|Q߲͠qm,8/&n}bNIzBs@q*cg~13("VfћKV  )Ț7 \j^soK gG $$d䁚6B}u8'¹ηNn ϥ+8LNŲ٫1\sHOz:-CVCdkP'7^L&ŵ3/Y#7Arc~SV([c!͟FcV޻*=W$Ħ =|5#baID%[a4"(N0-ؠ/>ltz4a58{䱽tB>6+ `~BWgP8a/qoNqt[SKMFk#-=aWz"#r&f]-!s!`xQF}t7ע7 ;m戺ab:ʄŨn wMX$ J(-8)8Vj#j# @S e@g`h!r*RM+)ǚKw/ZDIM%SVJ;oYI#SZcHCԀ[MioA3gxWyV)ݿN^al$}bfM݈(AiD00:B/0;&Q X揝:v?7&W +}S1k{wRtjVݻ&lBApS^ſ.aPײuqJ-*-*vFxMq[/do~V @"CKd'sw0b]ywYH$Phf8ʭwzvv%yj2(hRxl-gB pG0GY*%Iڟ3ooq~^`J\*xRf>~PYCB8o =%i$r&5y.Sreje)05YڥO$^P>g%?*KnŴ8Yҭu#B h#ݞI$J"D٬r{_ ?_3by㚲ulOЮx1{YcMn?~zVM);cP!اeˁ}D(od+rv"W!(emI̙}Iή9| ~{NPGy%龅+{.S|"H2^lt/YNy|U}cO`;0f_1l[T ݗy@T O2:TaL6k[UU>WEgRaR )M2Jaν?!φJ.,ԤaI>'7V]Y ,+ˠ/=SDc1=Ln4.UFPC/ZX͆+*lr_k( ~«3|܆To|?$.}ri%H|yuܧlֹ 7Hn#I-|CP27x4"DxY߄ىBJPAO쳆>LTڣ7_Q_"H3|4/L6Ze eq5wtj]ߒVvv^Cb隉&voET$ j۰rT{btW*W mb*_aNq} Jco}xve9P`hܸz"Q.lHB}Ƕ<#2r۽$bD K˾xզ3L1и(Pi%&GYO az[n-]{[.\ =Z LV8~Pn* 4#>a_Zah;q"?J|@&jAƇ]n(АpEnݙ;J]"D!z"n@pL58=վϞcOCʹl1" ͹VwImZj.Pd S\\lFoZ)0kHl‰I1q)0?KkCWיPWzb.:-r}skAg/#?swP:Ut8r$^at^f yPNLe3XO7@X/|3Nxr? dçhjJĖ{{[[숡xCw;g1N\KVx.Ig\S\y$x|ϕIW.D"lʫ\޽+*W6'U>Nӕ$69?0I.q!7hvGAbCA NlKf;Ҳ&!H**$ Le@껷皪h^lUd p@̏\\?ƚYfK{&"00W_ɫ~zrfty ­"Ȃcqnd(n>Mq'= T˾zLY zQ¡ROosIl@ >>;mruLoIK1br(LgZ 0\w" K^ȩ%TҢIuU`Xx^ yk_vԇ;P}muN<~~нlzY_G F(8W>+*C?DlU+٬x>}WuˣH5"n%FKBGm\۵W-]@H&Ǹ&DVM" 0 -ǹ&~YX ;e.(* _+ɘ@ xvv]d-׉7)3[dkvx:Sɰ 5B=Se☕*ZaՁ6W“?Z Isoҹv~"7n;Tn,.(7z䯞2SPe%Ry2 nFBMhX-l潑R&_au(9/j,0ϝ> \7l&UG#Րq/8PWhEp\{l*$BS}/p/pznC ޿cpQ h`Na)\B뮛$%}QH'VWx`%qƄIGluBQχ{ *vwt U{C`[ ,Lj*3B.]= l-3\C65E,޴k>5x5*õ0WOWaXtxC"XV" ];]z8D-X 4uW_3hPP-XD~ADaaJ/4ى2{^/MPٔ^OP> ^O>eHB3M7PZll!3Tݻ߳>YMt:6"!u.ٮK > cWm ~ˣ{ۙN.KAga% oC,hC±V\2cpL0G/eI դMnfrNBqeIF6v /7gB{2$2 jȨez{\MȝmZU<#gS(U0U= `"~|ֺ5i^6r9aT.C? @1:* SmY14jk+ _f;}s)|ϲ2ڪWhjWcwB\Ù|CƘn`L(uƸtcryՆ k-}>IcF)m/nq?&Y1_b[քg`<!{:Wv%ɼ|3Q\x]Nr&{$ F!f3(oGجӏ!l`c xKvKwޘh..+vac计º6\~'˂2m[J8{9cdz}f09 nQo NأqZE]Ҝ-_y xߜ/?HPf :.6x'-@"diR"o0y4x 1m ;d?1xmZh)Kym;vBϒd.K2WH2 rnFXxϳ2F)H|"eblPQ뷊m3C NHHIS] ޿z;ZBa5F~aXWP"{< JwQ煐P o[l!B=(ԏ2`ǭBcVbVE0j,*RJ0m9uޱ@}!_9-<>Ɗ>6btoWW*[*ЄdEKag#n<ʧs큷D } +h{Y Ӿp"g}]O`T>t]#3ۜ=+AxM4Gs)S5[J|) %zJUipBFeYúnks똌K]-]5DMEΟ1CS ê|hwOk8|/Lt=|w:5m 3,Ʒ%qQ7\ aym~CEgieG@ KYoο|B up2 YQ連fE)1bi%ҦG^$T" 4֬dL8^ٍq'ÎFt\Sg 96B J#(i"=7$拓ӀEk*ձۦOt9dYQGWo[jݠGYN=v_z xM#ΐhuUld~9:G֦X,?Zr㩤g}YXڍid& kQGҖ͓́+9Y^,GL-u{cGX<:X]D٫scLod5wH5Xyhp]6?Y 7m:s$C[AP;vy'shimOb1s) Ҕ]u`|n]+#v:hmIK6t5{?+4f~k*k_uvn|%\-0}\r K5z>1Dm֤GSaJ3h%>qA-|bC #vtk>_@psR9^ ٲ]@$N}9ۏ4iI6W4]?`*ᅖOUֺAQ{Vt*fR4FH1ⶁv.>K^V3<-;iVTç~BHM\]Hxu8ŜKJD16܊ ^1+v7n[%w?*X鮧Ǣ$Q)D.KSyKeg(dc)QЀ+nGXbWP_уӺ{U3;hnU] DߟCǟi0w ΋/Цƹz=&eGs bKG/?X,9q}PiKC.Ł>u2o%d޲ ЯyNyF̭'!%8ZY"=oZ;n%X.NfkX&F̟28Ά>LA"545n {x`&iTi# 0>l)K.ͫG/ !P&$e+Is ۓrklwŠ|0ih͚bl r 'vkznJEqD!|1]s@կމ e&ŷ ͖ۨ=j(, n Id:#<[0W6"֖Yݪ6F}u1>.}Q4<,$wM9y9"@ a4אI.W HrEnZ wUpZ;p(ǾHa\|~p?y3Z4 2zc*dZ8;߇w!ۚT9/Cآ&.Q};u DfE ^U@Ѕkld#KZj<>-y%b8e{ ޫ-x$6PQ2zꇋ:Ϗ _{K?'1"mK :nW͉dt)y椮)OjM~H&p ruS~7kkJSOW9 Xd*]HJ(t ]81NMDþM8cb,f.X*)dt!%aն WLbNOFZٙ]Xb*gOƸm-S9@aN巾Ax%4(bSWMdg̜S $lD}%?a#Ypɩ%]&oZDIo.%Eg"(v 7eƬViї;3JlI)6#}Vm3j-*1"K^NVGQ,*YSǁgɕ1~(Z Eq[hI>uC\SL8w6%3)< a >ʽNg ԭUػwroL~0ԙtlv _4>SW]xwP[O'yzvxܤ?nԏeW;;;|-a7,])&q = B6^Z)oB`90=h[%CvK&"e?cfv6:/މ]&/ro3X}V*z 4yr6$w*s<8%nw)@v :q {{+mVwKO?m*_;80vb9J 8Sbj~$'ϫThxDrr^݆^ea[K:WvĶ[j-21*w 7 cF6n:y4ǟɾQu+ڦ*$Ea1{TB1h| ؙ=BS|SO'x^OC 8=d?!ߵ6Zw`,z TJ$2dvHy'xy6.Yu.稅W8u f6yt[7jqڠӲlDo,c5%xFYi.l5خ`espǹ, >yZ;_9D@PSMF҉1{K}5oN]qOk ܨ3ezA_0R`خ\$9MQ,5)x {F]UQ(# hmh~mSbx#?iE7gWz!`7Q . kxXΆq5-W= Eߦy{Btj>=)ゼnP?;s߃J6oTȭ!bzl9fSJEqұU+G!}3PmAgöuaݿf4a2@3#+`VQuTnTR71hdR;(a*՚پRz'G ;e?SU:AiaOyxhnxOπ|w9wTa5bؤYP oO2=Zol*gfF " @!8K%KwQ|mn1ˇkdܪV" ґϨnTXHӂ 0hZ'&}Ns`'|c-<'=սyE%L?QėK*g~«^^%c̔r:R4_OJœnWD";ܒ*OH #vYãE$6~H" ~M.q.xXߟgNĽ[FF+myޯeU%ьOLb wVjƦ'b8rFtON&#%=`F`Ywb恗lgyޏKIo]%$Vj-y>Պ+er͹h6|鱂w/ye\/\#'zvṔz8'3D*{Nzkħr"(x䯃_(|f2J,t]HVf0;Dk3~ *U`S&ª -9mW$Uz@Ͻ)@+TK2ls tlICW%߲5{'3S)[P X@v]gll$!;Mr˖.tVHPalaa]UU,;Y$a/Aɪgm3UA𢴪 C1ܭe ;zn-Hb7^tUs:z]!Hem{vd̜У:-r}pU>MNQ=qfQg] ڧ #[,w4(˞SrQ]?P5t`Frq`? ,.!!#.#glEVCŋbXc`uRԑ򿘏&sO5Eh[u$D[yvr=]vd;Bc0AH׍<~Λgps;sޝ5^ ĿQ:PqS9ցF]x ɽ[Ogb< eq.F$o@2|J.qc}I\T_V$\H"yԷ^ q. =-lzv?U3%Q8ӳ<&+GskR" N_3%Ɍ.E,3g6ћAjQW.1O8^E 4fAxϯYJy/E b<n&xeОy(cYNJ{lݭ@_!bV fƚxRVabz&çu ~RT΁*EyiG)i%ڛ?gbes/V9p-9 /i;R{кS[s0i!o[%r߿ 5H)0`3*B!ڸX+eֽٜu/~#^] QW.gvG\TM P@Ȗr֦ʳ@2֙[MN.y]m۟,e3ӣvaIdAS,gl2Bg֥&Ddq{K÷S&P(AΣʃH[c[G\6P{n5`w}к~P^e҂TOۊ`'Ċr o uL. SfQqi0QJ w1z0Vf,PK[Jdl[|Ѭ;wc^ߗb2{@il0>dO,pwZ}m=lSQ@W߱t9fUAM"y/U|!xM>"9t\Ly~g0sZW8txYJT}`z˜@"6)}#~"  EwO\QQY_Yo4a3Ӟ@ O; J5COMFϋ6MP2Es|,/ >?a}C\(2aʦH BHoK)8צ/%oh>[6TC νP,G?׆y=. g}bh{~q[aH "{uСV6n+&"/x(tdT {hºo4H-'_9]r|V8}W.ځ̋~vjr׿`V?pI>r\UfnW_wAKX^" wR/elM6iHmƒhˤ[[uܹxODZޜ/,\16iYsxL\q4QXo4'~&_m6㶗ZjIX??)Ӿ)wpHm펝4w=O~<_jţ +kMh}buەr=qi5G1h#w.N}ð9 &JߛܞlMQ2"0kEV6bųPީ^{zغ5ct]/T/Y2JSۜ kѡsLjoԒ|XB*)'ŘeryŅfK{ (l ~SPQ'Xt:׉W$?`7ПXIw:};ݸLrqqPr#͛6oU,W{L8Η;ӠE:v_zf^jg:-Iȭ;#P85i4kL&3kOr̊mN]Ro*7*fgh\.=)y*1RoOV>D5o1IM·϶}$npo{vOr65PF@q?Ȱ9uN^/"K&-69H\NOh+*7Ls7^K7g/I+gxYрGSíΕ5PKǙbEYeZA C=մ@9߀8l%j)b(vVlJ{܀f.>tfB"o?La..5_q,x~^vGR!n)W7od١8V1[涖K]L ,%#Ӫ=p $g$ƧpYcf>ZbFtDeai&c=H|)BO g=G&6θV 4ɛxu֦)^vS8&Z 6XKQE}VCY-Xu֚s̶$.q;?ůjKKUݍ9~pYMu[[%Ǹ:'W 壍{N7<^ \qB8w?evn&:mtSBAsT7b|Q~[߽,ln>%GVzDde={u5AzVTM򩘜J7I[,jm:5pܼ۠7*piDV5$<טDAr+*D mVإ/ß*s: +C9eO i0ħ%hWơ㿷1j%5J[FCƚ{ʾO_p}Yp@ ,Zt[3Kmφ2/~ȓ;/+ID`'ZĽ4?+F&2pC]F=aNMIfp;Ԍc9ˆr9$`_$b;͉lʼn/${OT{9TS40F\)lLe_f$XX&{w턉Ex\2OjF?-"$I-$E(ZEGĤhÎKdzCN'I2^D$k9]sR?fq~QON?Hw_6G\40HeZZ MHUBI FW.ҖN@}oj1ϖi}kNP6傁#HF :W-RZ9%ܴQg :ͧ)Av5j7Dݧ!ݽ4Tt|Y՗ ]Ľ  o۫E#꠿nR|屈83k<\\lqƒY[iAnK iLjR\xv[Nغ;'  ]tZjj[@V!)Fs3z}3:0̲Csao|';UQ'!gFg |,7~LŸ]uZɒ电j ~:f Ye ,6苋djzEXUc?axԷsI2_Ui;V%?TmFmZ`ˉŅߢ3H!`MopǤ~~mmFFə!!sD}XfYe XU&Zt"ɆИ%-8BW? y8kUAtM}@pMa٬Nҹdd7ȹwƮj<~PPT=+dC;gwHU0 0t|3dNI#Ck5$:_G'#kth Jv ]@EXWKv11GkчaG$ u_;gEH_jZ^pQH~QFkIX/._j:Q؃qVDkr_g`^흚IOY8VOgK?Ьmk:{t/k@{EDBHkR}fiĤĈ{ޞ1t# U#oJ=+*[*cˮhK&3,l RS3s9Nukǹ=$J#&Xzxk\ACvA^6. sz7*v: -}r'0fR5LfQ37@hvCBĬk(n&Q;'.g-)W4N,z͹w)o&5M+%ٽCfA].1R>abM>_rh|YHeS9cA 0MoK'ʑ،Yq+>ƸA$IjiS=XÝs7[_oIRۅ>eiȨ&u`8m&up, 8ϮAaJ׏{:bVG&;":n}Hsm.yݝ}zn 4*t],\[|I7v5PYe` Ϩ2v"7K2̅X̻ۗ={8~ YIQMolu׍tok4lˎHF]z9Esh"&_h[X@tIl[b@Ǟ. H+48rJIl0ď:T?yͶY Ʈ`KrS\Z5 Q}8;/%gE2M$$fO%^nILPk|?=sLUƻr-K`>7b`_2T2ej&*&3s*_5M 2dс>%Q|Nb:;m8s`YURPK=bh:~ g./g- X໡uرTPEeR ӆ`(s~Fm9Sb=Qau\.7 -j} !(rnVpEktU$eNR+yitDt9Bkzl~#wD *A^L10/d[>I_ {7o*SHfE1+f$v:JHJ㽉'^CW6y fEzYcs/ ?'LR`Mlݩr1 ~ɥ 8Q}6DR͝5-3,p*Xg{gE|04^V2KW ւ)Ƥy_u9U|jliA3oRΛLmZ70(*PjG,&nO%CȰvh*Ùԣ&7WjBVnњC7vS.!Ǔ'Nj"jÓMa{GɏdGPHwG~Zyo8z$WP)dY|dsyte$<Cr҆5?rjzQUPw{z& CH[&_̀^^D %K)ȟGH/k7M\,3i+m(K5p̸u?xq&kYʼnA0 PK}䵗59N!-FdͿ@)`IДvg}^*&$-Xͯ;[к3غXژZOaabwgeXYX陘X~YY_898;Yh ǣLvğ#"O7 a+pnQHQEFOrP`L]埜5ϻK?"^Y5Rcs^'AJC?rh zJ_|1p&K[RY;&x ʉX+.`"8 -;:)?"c=Nܠb, ?M 4ٙ3;  Ѵw?_Jh& eZxdVuUIkB߮xA Á]sK3w8z~E5ƸB';^zo_CC K,p%n'C_DyK:OIgbŐ &uݬiDXpOC$z.cFJƦ+ 3pIEC뚇NF ƍ qu6tJ2ęVjH xܿ"E{dޯrLf,qun;BXh.]Bj S;޺PwGN ԨMK  1a>׫7k{>m@O!nwq$ߴFy7Y5pG/QLfLϯ-*p\D є[9'S3~oýY}oS%Z>P8<AQ8_F$87& o >rxXMI*>mcA5`ua,7dLM馲UplT^D 1ݵX״.[5뮫ohT5 E8ќ-Z륖S+TX)]2 ۊ(MzsMx缏q벺}/zP~7d@:Z'MڽrÇlG luxzX7iv]]qɚ: j<2lev}iF̑Cw;rsy]2Zg ]j*BXzBHʑס^qgS)D8hz%N(KK??auCfyZ1i>drFsvly>ANOz#,qsH31HH69¹ӑBrK M}c5Nt &eBgCK/O$_hC0ITٵN UV9gD,߶ƾ膼1BQQti$l Ѭ KYר_# aQ AG9A=?T0# 7v6@+tL*{PwAx%p}}L5߼SI4M۳(}5j~tdh)ԄgЁ vbRRbC;u3yҵ<%vgq"5tt(],dӌō0.ը>5s2;X%|os<:-sB W9T7Ұ7ix=: frʁӔne!C,ITiu,{RlbVa4# a=p2?Gmv2r}e1bDc=Y'1mm{@\D擪> w׉#vN^ufc.ɥlY3飁/[U XUpbl=|rJgj_̿ _z;0o`&2iPV Bi1 N Gi!t׷.(gg^% 'Yr_ӼOUYz:^+ƘVqjR 8$SYNRN䃎V83 ?1XE^aRy?ڜLYOkui#l]OiLÀtzS v { A&g&G i~NEi4UA[GF.^.UOXni^?qD#&.oJ;) RfqiS|aG(5'ҹ n|{H3=< ~5 1sǿgGSjT|E`9zt&Qy+Gվ_8rpjg 6ع"Kd5ORqQIws&6uJSȴ7!◉9,FvZJb&aeVAmR.[D sbgݓ6I& +N%-1 %i1Nb3'b"4$kMJX2v2d}5A`x4 e6*Ffos^u;egby^; e[T% {^"9dr[!rw i"(|Vn n+bbA&Rڢ2sԒ3nKzlFgj8 Ee0dE^;H yߝFIstȊ8rOdtw7Gmsh5a"%m4G+gqIz)U7{L^:1GΒ&EG*d}Dt21" (hwZ$9JFʍ¬wں[3+B\! iR5D|8 R%5:fFt#)+@&sf! gJ}R:D^&Md?;y'+G|o/2!-'jA+XΤN#) f,6Th/] kLHγ~ff5O]^@4)CNl C,QU?7 lC͛ x6򔵌| if)4RHadؿjz *fv{ޥQE_r'Peie.Z@L1WjӾ-&nx}I ΐIH٫MT3eM&qG}b?fpWQlWe,::R_Z4B6\aw@/qKN52.G( ͔C !?Fo$YGYФLǷ<𫯒{ȇmq%mWGL3M5\I✗Z 6Wˤ?3\@Z뭦BEz0Z Ǝ2.xrhvI|פlsdS-#(a~= k?)& ]K*EXr^7XCs0 yM*Zf[;DGBkCf8IsɏF}wmeƷ hM! ڋ&{z=w, I:|uT05U7! x($ Y,vr4$x|/,"_Bz<3X7 ~Boa&dT_mdI[YAl1a Sm)yd&@Dh9,=5eSqdi#׈evX6ፄ$[gOKuYOXZW;Humo RO),@OuRxe4O,[QDЯ)㜆胰CЗoF*t}9Ma!9E b )~]sXs{ 0؃NÙ2 S_!\c0 ԑT|!콅q=ʐY٪|d,VZ:fK3{!ݞ*_YʵV[ci8Li$l0"$y/m leɏT{zjJ ?GDGjXw/omτVpw>|7 4S.V[!5/jW:766:gka']]׻VsDwloIk]e2`ZUgYVqɝGOz捇(Ziv>F@jAS_Th*dh0]dqoȭ47E|0 M}:#K+w.阪/L \~nlīa)"!ǙWn"3jAx7lg-ўx5Y|7u"].SߛI*_[<27?/F_jv%>(kC1T:ܮs¿Uh-ZR:!8솿 f OՄN/pKY=iLTtk1G¾GD/a~ >˖/Grb> WV59̤_N(`] kq sJ AKrn}~Lc& v`݆@K@5NNOT+%uӫsz /[*#.=d.!Kݚ6,j>Vksr^+FR,YxqoanY=SY0:_!" \gAuRy l.:bsM>P^pUePd#xE'U K`9ܛ>6ۆNA f"N3Z =/*zVՠ}5UD>U|a`k#k;Vx-Eۻ*w[2F| ֍#Plڦͫ譖`gц=m[;=wPs!(YG̋k@\FG_b\kJ^>}vi w蚟J\I.Wly&rl}ZZ9oNy?4^]wm]\[6im1wQg=4ejsb+ƪrI^^Qo{5m9#*ꀖXYdLE326N,8 i9pIyy:uD(pV2Na=~ȼŬj49Īw޺֎jouZ[j1ӺT{}IRb iv=F߾˯  .Mi.!s+oa?N ^^޼FϡcƧO;"x{}JЎıک4.]8ޙei[3ggqZHa Ҭ eWڪ;Ѭ*VtA6.U8=ϝuK`(;mߙ{{ Tc,c>=qbod XcqIZC#4as[e|5+ZI,[D~}K6my yEBiu\a"Ӵ4,Gǀk6$1ޫ*Wvo9|[4;,]gZ sE/Ko'\-^KӳYW|שGsǂ=cY{ 7^/IzKy6W H1,}<;6ŭ7{o^&}mW6# k*E!]5Kս-QoZ!S'C ml{٬z oo; X5] ՕG^*c:M1:-׏l<4z{6ȗ]Vo!:VS{rծ:.o:>-ˈ9Ya#WR0[z0 {7&:g; -W>lߏMrӋϫW[Ɩ*',zN.= 5wI&u۶>Z1o˷"NUٯ C翭ݫ?\V*q\G^ou<r Ujf˒i/1>d5wkuݯ3S:ɭ^A3f~v~_-:xPm࠸船!R-^^-{u1o&$=Wkl.O6729-})tWg|eױ&\/VW K3{vR[o=|7l^ιJW Wi*H ڸ2ݽvR~}7̮A9_-UNIX0=Ɏrbܒ_UHblh"o56C͢- `ph{cbvNnaϞ'GxK''+(G'rػyzA#3Ws%0jJ`j&TKl_)Yќ w+5=kN.Z5N.{N9":/K暋X!'{Ǵ8*ɱ̉tD]9@3'q0ahoBԗڌiOS#w(ڇpd-wδ؆N0X< F.3pa;=, p@{il7$?NA'MہG`}˷g-U6.4~njW/j{_F&xh>t3#D ׏gW{Кf6JֽC߇YzT)m]=0UK}j/}18=>ˍImE47FF"p XRL9T/ 1s9b9/ 9,0 _e{*X\cv/\Bـx91\|l=2n_tdU0TCi`ϗ.o;+EY}ߤOp z{`!< k۞HI`bnl61} ^fo n8pN7609lKXPh̰0y;av3{H*R%4B7،,Nvx>ҶMѵ,-0:6c'kLz]J.O׽W#]}t/P{;gWM|iEPĈ͚ڒ޼ai1)I@uWg&w&CX:.VvNOw]i|ijQsbBqҽSoOijT0 o+C[MUO~9r>n^y gEr=7|rt~-+ aqՔ6&t2CDtm,yd[M4mC^GkrH^L+DʙlhKq-0K,5hlQfؚ~x-+V3sW+Y`j7[;6jm%+fӼIͫ(ɛ'w4BgT,-[1]^)&W Zj"Vi..ȑ:82 E/U#i˲41zX>]0P bwK^u~ew8/(K%H^k߁FhtHZ]WuGm"_F2 ׍;ydX~ 3ʈJ3hnuц=mJòCҨA W*^ebȱ򳮢u_z(K!P:0ȴt_HhA-9 S9WP[# "),B,@+hڴu1B?% 4+ w8j<G.*<دq;4b_#}#),D`aRtFZV*&>\T$!XuK!iIHL\P7)Q_گ+HC_g5ۊ|;D1y/[ҝr=Bx'ٲqg8p`%r[˒Vd&kq hLWi?sDp9d}r:}eVwdw*%ʠ~цu&ѕ+&ks;/GO'Cآa$(!Eܐ!"ߗ'vH:Ff3Y(If3D4wR5Hpj5=N"/%(BٱE0Й`Pw9{4X6,*P!*[\Or鷡Ú)ɣXS/j`ih K8 'Rqᦚ5V :}v >bṞDƃNz+;ڛu+b%0DۙK4C0+tT8R,ي}4ΐ[P,:G#Ng]Ūx<# oJcNGJ7HzPcQ'Р13I=#LF&Ŧ0Р-Z&\HPf\H-TT(+?/@y;Q+D ).x j4 ҫ.$52tR"eD oL,w*?7_$Oʔ-tSH^T$ ~aX IivCCHtHTȜ3%(w$VO%nNT~!0.|cx7a-iI9# r8"dY+h9y0 +氨#xx\хߗXnD j8Ϥ[/PaÜc|I_|6@)6A ;^>del(_8g 5]_-Q@*l_LbS+c?2=ߙ _]4p3?;`| "kawv'0ufӐmF ^;ȫ*"瑲})m"s)yljD{W%%+HB+"53PwI +]A; QQׂ;o $V($&6ҔLkg+кSaC ,HC6OFb:/O9 ]$B.x( ;FB>Θ8"UUx5Ip H"y}<-'dPx5au:+wd)t3UlRHyj)J\x Y.p $Z<|y`I(LQry{z2&BdEɬyR:_6 $u+ʟvh*36ʎ6$ʿ?˅tTOLC4P<3/(<$W289}3b2"bimH>yGl((@M&0l32X<_',/wDߘ׫$ 3-эc='0  njTnhLNQ&3^ؙ(ġpo jmMM_vL#dj8.X\<b`UP MB$ۤ[n11T 2^-B+ן4yxG&Go2O43rB$1%a2ڛ9HN/X(qh1q$]"+w4Ԃ,n.$|^DCq8* N>̖Mf/ JQJ"U) ɎԶI^%o&fcI=rG3C$u{π Orګj%#8?S)RmZF4Al#WQ2ӕwa a.pM=͊n E;[ޭc_$)hp-u{g|h,&a ~KzpX~^UQN QJBx U_R*s% n3 /ʐ5| }J~ :tIv A2LHyF%rmb5h"ry#Jf3 C?sPTDKJN?P1x=wڴv$MA~!p*ƜGoL0D=!H pD4iA'RUU=𻵒5V AM>SP㧅 -{|k?X$ȴRGf|7AX2{Y_䒞od:3xdxW~ G$.rt=CAx"6$mŊȼ0kmtq}Z-[P+e"2`CR-grY&6bpq*Y)y_cTdJ|H} aua(sTRR &~PE)B@$ăl%y)q\܀f~$p3eph2x5f%ˉ$%@r  IM MM E MH $YsQwbaica>ِY ogqRP`UREU7-IgII?q@ph.Cɚ;JtuO$Qk% Vs lMTd.؂Q K.%%v$S)MqNs C̚RlO(QLC~&-5悧1#C#ѾH )%ԒTf 6FP;ݨ""%L G|zD+m Z^C%lBNƿ{63BfIJI3T7m2o/],B4/HZcȗu+U3 #BhqWȧvxxaji+w(a.~LϘKg+*G'L:F_J_9xUJU[12Tt,fvجk23 @:R(2x|{ C%`AM".e?]Z 7@YjF y9ւ$܊.}&a:NF5|1깆Bx:7@?R!DŽxR1 \NpsG(4&i|Ce,Et%=2 E P򜿱E΢٩q &bJsVƁ:䧯m='apz/ ->_w 4g'}\Pʻ~Jah4}xsJ=/b L*ܜO+݀]5OnzkܸcGZNg;̫&srwkpyh#}5M~kO䱠p|Xv˷ױkjAfrB>hÏ!t ׾q^>ƚP8U%x yeheM| ~]:Z=3"gǕ7+g&.Xooϔ|u 'r-haX>݂C!hqyXQ*п&D;}́_-lrrs8|zebzN)wKi_PeK)_WKM4x,<;3=\?J9O76JF]ffX}D{@o+Ez/ylHW9/MʲZsTEl>AC2gCEpݫF;vU9/79ys6CyjMh^VN C2VP!2!V/~m>[G-V͌(땢rJG(h_ki*u G=d9_ڴLWc=QZz9M0k*Ć~x.7VY9IQ`KЂai=/B~PTxn?9/ģ%?bܛv緫svs;?q+_&ƅ  (`hm7y'򔮓:'kgT A9JWGpٞ#Aaq劇̮MM(bU;]xCzv<}tp鵅nl,Ui~Ļpn}ԓ _:N>~ɹhӓYP޸z8O]-Hŕ>y0v GTі/xf߄+& P/L5JIH9m%YS-?\vHb>'vN-0RfQ~tFfR!}SaRœV@'Ǒ9픭ʼnV\Q R<.v[1r`, nV1;hO1]Durd ϔ9-\Pj!Rķf+6o.ll Z T^i_]:+$e3։3I~6{KNu„<`F6Xs<:vU ,Ww=Z!j<,Wm|z>Ul>u_Ņ㐊il/Kǃ&`9ʌebDL=Hc8ˀH==G*毧JP;@,szI\*L]V_ ǐ5*F6!r~ׅ@/Cj( ANdSdHɢͫ%Rc L6̩{ЫAȡ5wxb5c4Oeݏ_Ó8%ǒivq?x?F6b]/Ը<'4pg)jAw KcבK7U*C)c99YKh>/|g 3$xT(3 <Ȝ`:@Qd9pGdWmP [;Jq; u|dy^c-bp",O(';i饝Bv`3< w/K}7;pGxڼ#p0;ku}3ćѿMCm3k*]kĪgԫj7]brAn~A#&2&]*f 0(t|a?*ڣYoۚrk ~#rvB#fX"e|q<(!e﹇WzSi⩫I&>,s!ezI~[a azJ^}^bz;2xLA>;8 \QnұO]P w>alY|37.z;2\ӽv0mDۦм_Lbnb^^{ZϦ^z^iX`xң+P^h>re,*Ik#(U@*⶟aesLT q5hRf֧7IɱmS(kxUS c6 gwu_\Oб͎JW瘰P1p * qs4J^8Ybme>`%}yYnL9AKt7&hUnpKfF?РjCg9홣O8gmkhv<0A=)9ޝBE;+{KQn4_ӱ~j$fuFRy0iS1m'w4aGAuA8  )RdEZFo*yc;!? &6V xF98>)T >tVO͵_Q4D}ڂ ųaOmv2' LP§̔)x԰zDs=7hQK++|5A@ncXf:#QN3cpiM D"6r3(1hr$~f<|3rp 5k&TCipT$? 91 4){s^u=j8#˰")ArMuM?rsVu# Tu;'0vKa.kU3ߞb)\j"'i)n;=JlaUO.ss !aolx s+Q 5q1JO+rXyT1 {EdA]"Yw [ G +ʾTr!lëu{e]_K|4h϶%}@};l\7C-.#{)w$n>p86="  FѺ z)ccqF:EQHLE :pR;0389jH;=NsjHEOZ>ARR _y#=UV3*n-"'.yI.:rD bV޺=:Rr?r.Y Yأ<-8w _ & X*ߖ.blV}xfQ⮾JfTHOkB4נּwtq*h.ۇP՝[VoؒV [NwWYZxx %dU;85773Ү8/)?sc~v5|//9̲2̾Xg]UDI* xL .߇Hp/7~s"Ө|c;LK3ٷH "u)Ū@9lCEmݱxI%+R`Dq6xӆ1kwQBr:2Bvy}EO`r;8EۅrEGqgGiLvu=PcM9'{*Չr+S$SZ(Rc)#ro=.BGO5@ʮg/+Qbn}wXVF"$Opl V̼"g]yߛ`AlrʓL:!$oq΄/7Y~n{sͲ|Yt&GNN}}{(%~w$*ĩQE9aKWy#Bb #tb{Z]T6AYʱm ڪR4mj5%fi>h~mY.Er_YƱ%/cs@lԶ*X#WrY.O[WL$IiN;r9_<&$:š7M¼sZ_+<0v(hpǍx9ԖW$>h7?;ѼRlH>;~ܖ8|5A`W4uXz^fKT uFv{yὛ5s]rϧt۾]O}Ř o`+ɘ*>S~JMMgX],/gl/uߡ]/_zxoeC5ibh$=cnT?ft##kFKLpA#oZH|h~rCl 8ӒE*ua|4EM~ nЯq}V;[k {ev_+"417~x~al*$ܥ<4` 3h9GYZ1@$H 8)h\՘Xڇ\ȎкfTbq%ÖH`5ݽ~y[r^Ľ:;;ݶ[n"S^#[6rHpϮ^2$ PP#NokzH64"q/"rY~ŗۆlSceØ:8;^B$79zW8Kx7)qf,ݛ7f v0{SƬU%3˒C%s:0˸:yqj:Ń5jn|rl;mUs\:-"e6?5L5 I!$ՠXu/nS" 4sa d-|A$Vh>fr?2ۦ&5ȅlRr,4{ЇL!̇џա9AR5Sc4gZ*[Yxmqug5,u }`ќ[} >˖y'vmw^1a- Kuw(R#+$Gē4ꐇaDo>#7gd79 <1kgT5? qJ~1$\b Ǫn\qiqX:Ke/cΠ%Y1|}O㻛r[TY7T.Z^HC41n$9!NXD`;x_cRDH30޷;&s: _>^m Utr$J҈ُL%WT]Jbz׌ߪr^PJV^;r:"W֎)ూlrDkW6 xyx IrAs 6{sEiV| [ڂEBQdes0.ׅLŐbVkT-p1ǘh-AH./gm*GR˾K)ڏv38hZO')/:EUhWN{h,QnEqr: /~OKTbxuMڨikNjVo@h*{@pmbf& ժJ qc : E ,t*= <)n Q!Yܜ0B|ex maʹ\qgRRRxEV  BxžB=*f41xkq P1[BNQ B1\-DJ{rv xE =4$*p$/Y3JR늹Dl(>R urkB⨌?38s 3;LaDxcfDd֕DqέjD ]DP]\'H#ٮJ;1M֓C@U3h#e+A!.ztGRxBz1( ϴ.4ʨGʭGe*1CK C$quk,$:)Q}ժxxiTq'%r(+hƵNH؛䧝KM$tX/˟QGKU7Gu1aN۔TJ7&CB޴$VG߆$ %\0طF.*N{džV48A24ja>@Je극Ndx9OM914T1)~>]@g+Du_;nbb~)hߵDLU0CI 2vF#ã 1;ɺ f֔Ǿ6?KY I[f+E- ORS_9A~F%Ap[ mK9d;1e"gi[bzlH4V{L+"qJ=l#Qb: Q(1PMR+iN} LMzvi7E7CV^ Mt\їN$/kFAYM |pcP@IMxi͹%xP 4RDXP lc6}84PS T@/f ƼQ/eL簪Yք⃏ E2M;w`;ġaYE<&( O2p$̔h>^N^! ~X:PX"ƙu{M1X0q݈81izP_ h3?Xb $#%:iD!2%#dcl`fQiXݓ>")B>$eG=`?| ؎1~$Ʒfbwr| @ŬdždHHi!cIf>x~~4QGEwvA3.!jGJN7*Ԕ)˫IfrB12GSjWO/#/`'4W:..e KyGp_(ksptR _\ .&W!3,Vc\:nxCn J?JHΥJ8#ˤd D/~6wlOOkh%ѧ ~ceQFW^2ԁ.,(bɄ{DZaZD:Q106R`2jR%$=B>5@vᒺj =iޣVY# J]*~5!(`|?̰^L.qx}k^HJGز4akdST2+=e3z`e>|UQ5tx2K\[7|^>?Ĕhƌ:)ڵa`̒t=) +ºbӔ dvB;(% NR̥:ff)O+ K4%.媡SgC?`U^KgK)qTu-,QySLGie !KJ?JT.( A$(YT@@0$% d93dD$I (IrfHaC<0/y=]~[uojTuUӞk#Y5ꮡq6l3{|IBa?)i5F|i9yll#nS+Fw;'' LD69//vZ?~I}!t\qm^-Y_nVȭTҕ_?&#{@h:RePzGd8qE cfO ]OiPIT ܢ[΂>Q,3W,QdgCwﯷ%u{E{!#Tr7^$#y&┾w$]cvSJw6~,Ρi{_I"eOʫ]b?+ٓxYG-Pk򦋾vM=|kOAOwo RJ"go G"O}suF6Q2}ә)۹v&}X2&G ߝ-.}1KfG|9[OQ~ޔe駷5n^pRH0V"ֺ3٫g'ZT7 ~x\H+Oo5Th&np'5 ݺ'cj{R#\IMMTܛݞ&S!}x_;͉oiȷo$0iZ4 A=2AB<- ,4_Xq?㶢 frD}C[a۷:٧o&'FTiȨ*\߼TIP9w܌ )‚ q)?<&^;ǻ}b>[$>IEuS#m)rqRr:','dZ$5sI~ɍsMpf<.RAo?dq#?#?XeG7M*}WЅҏ$2 sV"|6uZ*@yԧ8}wmM<3LTқ;+>>HXMo!m]RZ5 ]ߠںfGfSzɿkuKyu_iLanC,['-Z>wΑoG%%MR+Zsºr#zZZN?ǫ}Jմpb͞&ら&Pcٸyhj&מX^؇Y~Sx& 26A9a4jq!{岭mۡs relX ѱWV[x;䨒D%% H83kij'E~$QKM/:Ծ?w7%5s˭OrboA?&t缉|BK|o8Yr[Bغ3l^|4o (Q h; ۷vkjSM;@`]K_߭:|q#֯8Trv!b-#;⧎|!>:ũtJJJ{ǼL*ۼ>[ 1ŷU7_JN¸Ғ44tԸNę4y.O~!Pk1wףi溉lpgˣ||`1יi^YNfڬ",T{rby稅HkMg`id !lDX1T6WgbѮ eϝXVK.h/PuU,lѕ[-)l0 $𷽙 K %~q3mޟZu2dek.y߾ø,a{27+Kx絭sTѨadxZYˍ`3:Ouz~G[? aw&zNJ0K,PO:7BGr~fVeԢƖ,F:_:dy&S Qja BNvI>:,ܸ[:8\`M #} ׫w&\Gcd% K`yuwJ, Sʶj" hUxi1H,@7 ?!i(1+!t]Ncja+5hC}5Y΄$EY8{s\?ܽ ?0۽g=_g)qKb86'nTÅl$*71Zv*_lBbK:M1p*I20mb1X𜀀P*3)eP|`4/3tOB7)c7iܐd$L _^TH,z Dy,VVeS0D詣&pTF%n`Lp_8$Gг+jюD{&-Xϖقڢe ڱl<_wh={uEm*`_9lYf1}HꪼIFN =FˬILvRl eb$}~e=a*?@ ൬T9mke1ϒt['f8Ћ2-j_{?p܅B 5D " G P0VatAo/?D/,Tf+?\ŭV*>&j{P(~wU<%E sgN΢ɉ+F]݋Xtt3e^l0e MVV6`>G{TH~xu ]8@+ׂ/66gz6|wlnk N~rla7pk#m>J۶+wuag^5 sel;AxlxvSb c Igk0G)(?|:}iGbD| :n#.+w2N[i/eq޸SGR%;˰G`1(oߑćmiR[s@aVQ=%׎n3k.`-I#lſZ*Mb i9˖̟q4=JL De8VՖ4ĖkPbG& I\IiA ۼۄ|U-`8L3;GL$oJ;mY(=) zǿbaԳة|=?[geKYe<p|Xls! |jEg^y[t*_i==&Kfy9H N %es;.b 'ڨ\Q`VWT T XࡍRΎC t.qUsDoօ0+6)l{ni?= < 0W4ǎ=_P@pt$ɐxLB>G1ҀNQmZdN!X]Y#Rb>0~|5S Bc;6-D$9d^޼mgzil?rmbu}G(΀Uc oŁBD{!̀vf (_ǀk :C'ktZPӍ& lG-J+r!NoF`_= Mf^ ot">7bn3533LeKYvMDb&fWnw1g&DR!1X뉂4iaL?z{ 8^d;`I9- Ye_mQ6OAu$vs6|1=& ܠk!@=ráPRfJPrSS90 "_Bt벴A$7^/V_ᄌ%g-(SQ%RݐyJ%I/sZ)HLw l&ʀg^l_sߊ3QJWsU^Ӣ)*YD,xP(\ajkW|C {LH[aPwvG> b@@b%!(bHW"$'Z:d1nƲ֥x4F;.tZ~[;Xb[/JoeDDNI0zCezch)$x&ZjAi"}IvUۡU"?ę;y'ݥZ.AX[=~&Է, Ea) QPԓM4ǫ+H 7 QYx x*#BK̑r>eS9%ٍfy7>b;ƋiO+?]w`QF[ tBB[¿VZ=uPlԀc_&˗WB#2&0 -9 V5Zb)[Y T8]wa=Z"&Ei`S9Cӥ- Oo]>yXۃGM\TCܠ,%IfEiLlї[-ux<lJ(cz/kB,]#ptArᔟNP\~g& QƄ~Sļ<.ZbMzeUk3 z5J3Ofw"!U I/A}2b2[xU/U͹ L|[W[,VqSH7kciOX=WG^y_0<@Zkb%;k׭n,y~A~ 5"ktQxbG9cƇD_d_6=T ?=2/Fl#8SQ|@)}7m il}s5^3k~gdl33]MmSƥYWtRG=RQtR[\5e}K)Ek&3pD.rx_<@ B PQ͜'fso,'eEnT兟5omBlԽ((a`a4yZ3{Re|r K56"m3< զڞ"9a f 7$KŊxU&~h+jƞI拯nO;f÷iy2 _ӗ'& FUSڟs7 컎1Oz.A#Wfd~,clb#i)_7-TƠdmپ8HY΋E~4|Lйk›umfS85#֛*:62z6|j5ȥ{4klpڻR0g~ ϻRxiDy#&|nglv=4N/M$C,UїbyZ$o>~ IlؿsNvq x=!GS3$KWOWA#@z3 1/5+Enmh0K!ZKu2P*Zԩ"fq>a5X ",_yMzz<\wo6}"i+4^fw:r]j7:zD4z}MU:5^i evg_!qڤZpgXLޞ݇mnO\ 0G@MGco~ȁa2%y \Uh ,:&`[8w 6AIe66 ;uI¹B)c. ]@H%vI%g|l;^}LBbf?|o>nBHf?Ű-8V4Ϸ'dsU|tR-EqȻ xy۸y(W 9˦8z- /t[  6 5+`\0QyUq0z l 8 +ע 4+?YŴW@.%%* !+^aQkӊقf4^e@O5JI H eY.aKJ5-qE+$ x%|ls^i15"/B^ԟ~B!IASJ@pUIB9j R>"a[wp `B_4e,{BUVLE8oJpW?_aS`wIZ`t5{TF.Dh- Babg*!┅/o9^x&n04lݑT$JL}&;frP(^'f;!))ȉC#YaghoU ZXJ`y/K.ׂ%]hjYzXoW7WX[TlZP_|RNgo~><04;mazZE8'L/eIxR6)N䬜)[ R~az~ cZuzhJY׍//$TDvVt)OY7 )yDdWGZ76zotD {b?2Yա:iSg2l@ᩨ>q6!NK@&U7K>7 |ɂR2cd0'}&"AO> 0ut( =﯑34vMx+ᾡ]tb\J4)d\^=KW@`wBjnl05=1K,heˣqDTȪuqYW ܝs3"Xm]%$I6@6JAC ^̅-vR[} 6~itD`:1CpܧjĈ0f}=˜tmK(z|Ro۫myMmj4(6tϛ9jP^1%7?ܺȜɢ%I!2}M/- k/pN)VsQQb>,\xb2W1ث8r#zr|9oKu6U&&Ww(8\ϒY8bۥqH9ɢ3RMxX+e KR!ʇ56t/ibV!ks)%LV\݊{s^ָ=ƹk=Kf̜ަkk|!L o?L#$9O#II⦢^kXY]fҧŝ&#hGUޫr}P]OkD 7Eܬ xi:Tڂ?'G%o r_"@~& :mAc-HijׯKQx9O. ʂ&T=u}#%L0'O sds'n AU@y!jwls@Vm;{ʺ;9GHqJXvwaeϽ Egl=/aٱT8*bq*B sR^wkOݴ<H jc/ */ʼs}K8I2){EQs~vV\tOs>OSJ(\)ysmS~‘Jy uC_[/u"Zig8sT\ƉVyeILDi^6#,p/*b7OV4##+zh̙kVX.7[cϗqnj˙oDs+Cp5 Sd~ĝ=Z28)c5ڄ8ܔGM%_ߍE`V1n;My̆1'gܕ5 ?c쁠?9}(9";(??sI@@8%nA?ĝtM|lƴ+A_>P3ٙ\D͞Wk*mees?4ںD'90o O-6_{1fG<⃧ zϯ*fL`9b!Gb(sw{v~! w˖iC-ejVǷ\H4rQ maxܞ7փQC|wyКZF?>2&8#rd6NyD/EP$Mr=x\\ǚymԕby})>OVl2d )=/;GUA_PVN1`a\_se\CvqjdXD!;u?+NQ.Y?y $&MLhk;F+ox$3.> gֳUί"0.@ݹ:DK8v!p_&n-?`X }y.GJۧv&j.eM&v ( [l28AWg <QA#噸 Qy4f]#WNjjVs% gڮj[ neh@{E˝Ox),s5Od}Z0c`)`8mRZ{k> 60kӐ@]^-:ݠH:~ة+a,&nz>?eFNyo;H*DRNvM}%gDOM#99"铝-RD$"Œ6-{: ng5`PpdP}ƈB}quSdž~Mh%Nu ?O=ԪIzIEB"]ãZ| B-=ƾҧ`́GX9*k35~! l &ucb[gNٯpcJ ̶B n0ǎPsib!7&RT|[Q3)-㌹2WYq_hò+G7ijYEYϥ~9|Gss0fwK@p?}"Ң_yr@ү_<%=Q@z;Aҕ!^/~ 07s^t9B~ 5fӕEޅ j&b9ʺ}e3S} ;pA09}m1 DΨ|Z9xehc`:Ui}5痼㱗03M1[lQWK7]YSTj^&ȳ6䀶*޵xX/ӞíM4yTϱ z ʿaE#?Rxbc$zV:iu|֜:Bgb½QmO[@8Zm=En͑C?_# xs)ZrQVWo#]"lZcB QCpn]؛M3D[A1_GzWR^!W继ߖwruDOJVXH.+׋isa 'VxQUug^&>ߓkfj3a]x=CU!yQ;i?6VP Mn)r8TY¢ 0JBdY@XۢZi].kk-PB)5h8(3 HZyČ2΀ezT {{kYg^u-|h":eRn tDd6Ě0#L 31/`?)(p{U hW8ʈt^0ZYl67l][Ѕ8Ϛ.^Xc j F tV.[mZBk!Y^ t97`g!imn8Ȯe-+i(_"w K H;mK?]Z;Rp?{ t[jl շL/;&̲)'`bl|zqQ{wdHX0҄8ֽ=q&hnֳ=Nʐ$,YŚAtl?ܲIIWN mΗU@+lSd!O!SElh5 C7Υ]Ƚs0-VRp<8֟.o#%sO]t^'9'G2i8f0,[71:Х xS烲"a}C)"MIBne{XߌXw^f|h,WY?Q]GJn`s! `YJmZ-SC x^s_pAK*]Bܑv;Vtʠ-`˵ޒSW,j ?+eiFK_1;N^:,Ɇ/_lŦX@TWyQw"[r(G{h`VdkΏ|B\??u{FRwAxs7Q!Brc&o҈!|V>>X'^nTG<3p5K1f%TtB?J}`,‡F\ݙ#Ci.#iXc?b$a.y/:ݯR(L)@T.z@jx ^xhyWO$Svjr ňV)F w<y4&+lŝ=h0PKg[ZDLRْZX f "9)' UMJ-de~9Ex.R %)J:95u֐_bݶn+cn`4pz;)ܜ&Q*B?CtRndYp0lƸ,10?E??eul\ Md}ʔ/'UK),X+ TN/ kHϮKcrhBu|x:t5!=hY>#B) !>CrRB|G6V_//'*dsWl¼֦\c!_ߔO!_8+ QSj@~ՉZ$庒q§Rck>Y<31ip&ESr}󏀕-f&X猪a7-nCNO㗤&<%)4>>DJyɻ3/a 7V$ ' "dؙ}m*Tf^r%. K4.nѽW{n^Z_AN.P':P- 2f-۷'r-'I23]ȁLY!@ᢘVE'<>D,Ov}|Ct~Q6c૽mM8#4:Iʇ!2x{ Xp&E{"Bx_У&Vܠ 7Sv^YM/A2_)V`\Y„_ _9GM3'CJ} ̑#"~bFMQ 1ѽߏq W _?I1XW~8sqgYGH8ęruFew(`& ]v}H$XzD l;&2È-_lz 25+Cc=|rρ7P $ ;u`!6xM{Phdu("TwvgFSo[KHfA ߄[B b+`Cf_+O:|ikFY ̯eNUC_t|1!͜b#+p5))WRפY F!(*bG_%s:!QecXgɈY1չ\5Dž.-mő suxo[0>mlh'm[^F {b(=eơꡯ =oJSW+.֫?nAv{URQ딈]V!Y;7h54PCŜf԰]Ì"<tOFp{>o! 2I 7onl9*?\B,H5Α5|r$p=Iݘ#5G@xL>H俳ƑL/cS[۬-RfE>I[f{ <eN.۞ S:8}u956 Fߤ޹֓0cp2_źB8 == { |ʟn$[Xv*_Vcɰbfk<. li}/(^7@;hTAXZ^C Rʫ'hԓT`hS*3vRT8%|Ȇs9<$ $iTC%ߢb<2KkR *[kn߻5'D{eKS*w=)e 3![[?:nQ).* }KM% bz;K<g w ΂0^Nq)l~?+G#?KeSz9EKPY_U4}*=6+tiQq#;@wkwAu4;"|h܍Jϕn\W'gy}J5%Zyjo 4)GP׆Ay17 N:AlHI_0J&~=gszZdo*/E:Sj,.AUӼ7&UGKGfW9Y G^1:%K(NBqQVMgq*}2einHp*S 3(#78$ߗM'㫜CGxait>4޾[# Rraq˺*ѧ}wt(@ ~v `La:ɡ+W'EWJ`duYJ>OY+G%NJѨsC?:BKfx7r$BJ$NpFLt*z{5~罘4}ٕp9厮/Ϯ[aԽhϕOsD.GM6Hu8[a=? 7~W,&ˡg]&qH~_F6^yΟb]!ilgP.%iuzD,̆"u!sքJf]K;n.T;C\,4eDY&Yil Dahx'M5^.k8K$٧נ{AWF~LFe-]IIu:{yzFΔ%NLv_ZY& P5dD%}C>'lnzFo'g^LԽxHu؞8✯ :vk*!S gձGyL.|tJ~\B(xC['L΁͎^h4]1mE1Og{5PBmt0ڷsL[tdKZ\1 &QJ#*|JoW \cUeey`{:ܺoqZZ!P \NEyׇʒ8Yf _yڵAyJWn\W͙ ?ؠ/>|96־Cyu˖&V/-!0잎{6)ş"sMȰȒ] +ӪÞۧ&@;+&0Þ_IuK< 9(c)9g73R#zWCzO1n"Pz0L 21Jq>u'O/!Wc5?/颓Ȇoij'$w}[vVkrJc{՟]rVTرZ!& 5<;~ GC6^Oɤ]Eġz}CZ&c"CVQd qd7)/fd}γ̧a|p` bᶒ[)vx9P=@{6TTs89dB&*ޚ *8TQ \!Q:7b |'竞;B9){@56/ç)-(S[V_`y?,b5ݙpT^3VHRhEN?FjXZ1 etu>yc{<(knaJb5p/+R",JQ [ v "뚓𰀮s[TuGvx.&Vv b 2y4i.{eɭpm 5VP7.-0& jp5ʚ_( rcO))y&m^xk<?KZqTo\VX]ɳؗ<]8σyeX?/Ӗ ~8ߤ{"*L%WaW vm,6~/b);nlO|]3Y,dt1g`4%d'wfp⮣e=cbrj礌pWu~fش~ynu! #},@FV"&f1wEcqJA 2[T设=zC $M  J,ړ" ?~B᳏ƐA% /V`߸d?RѵP&mw`z6usA/\v`?kܴɓҔۢE2|A_.1JdR%.,YD's3n"D_>r4N-U4cH=DoRB/qoVO`72|J&AY|4 ep`|%p7Y_uտHWz! 'QGpEq zw!+@T _dcDVXE_8JQ6< 2y܊&vP_Hc?tcVtկ6 IYM+H93್ϋ^AT*l_g雸׮N{ثl;Fդ[91}e5z՝ 0Hi VDIF mxwJn(aPq Lb$飠 ՒqZ U9/%]3֮~ԃP1t:[}a&h͍?r=#w7>Q'&Z{0L+&%U[ TcPYfryKf\DG1$GߓU{/qr wtᄳ1-aJQpCZvUD+AL{SތA[.|Q\Z51fTB= D_Es"G/iq-jΤ*rqA'ۀ`D f `%S;25 u{+a60[-#Fs^ณr3\;,!_L+N nz=#RsutZ <<"kkJ- ՟/q-O1`3xddy~b/!e6z̩q,CweG-%ܠLD"24UL |_Z?@Xuv<Mf]THr /cֺ)ts:pi ;HA%`aH YuKZB>DsnAlz&#yL}iQܛLw8|((ت?\Is9{*KcږG@iGogy/*OBD:geMO}֍-XH;ől,p"r"5cg%Șݰ!\5^_=7 +&h{5CþKrӝV%P8^5w~v6Q5e)ѵ鹓l|Yy"S}J4[L{SѬbxG憡3yBl^7Q -4 7Epm"MF =Y~Pubuo܄qrjQ@$"{si!* ο_l]lc4KqTuO Ҹw[ݘd(VI{Jt<[󨥲K4SaŦ&m*t( 80V9>G'7- C'f##Tg4>/-jqܞ`{ xFqX!gF%ulw>oP7/BbT3 j|~4SN8|7#jZJ󈢯aj U-ZH}YZxöL(I(_QgJ~Vm+ۮ$ҙOby_N91@eVZ]=auuMj?PI.3js 6owH?cy5RٔVhJbA8_wiϧXx״0.eǛU[EE/>yV}mzm"'|q|acsxc~HMr~q|Gvq}2m}͞a-y Kκ]g6E˳총v[t'ƮϾ'W;SI(>{JkR&~甝Cy<5|0|'n?OuSe8n9D~93@hc콐Nv|l/x,_)ξ@T \?=d,;~ltOpzFFȃJMm j%N]fp8>smu5(vE7J|-zbrT,ŸBo0]H)\fb C\=J=5xLڊtmpSp 602T:aWXf'CBBߠC&F 1NM̓ŌTgl-VD?&)Q?owoxAn[ndmHW~'vW-LpM^P 줊Q^PWR\{Aщ[}nC'2߬R2EX8Vw*L##bjME yQ!9*cglAz,.볓Ī{с^MLB-۟,%-hH[g\q~1p0,KyHpz SxaTレ^0.O's\ljILwS|O W 9,Ah-^~8Ia\17:2>yr}]x'ݔv(h D* .ju2T͏nƌ u?; .{뾄*WPܺ?~'xg7;0iWaWx{@:jSgԟݝ}}}XihC :1^Fn&͌X ^?O/&@!Sc"zM9Mϡ-7QYY5N~店{/^LuzVL;g G L爼{qlAGH_QgW4Š?"RubNLHlnN/\+Zo-#qCIP\qR)LZ²g+G/'E qFwY jJ,wl7RL|r=v@ $0k>i1y56hҬf]V׎0^Jεv9Y),[G"nݕ7ڭ^z"ԦKT:PMfuj)/\`&kG^N"pE< E < +|*`-eFRـ=&Ziy\?q!>f! HKR=ێgcG1r10IgCRۥзF5 ] nb졆j?il⸮"$Ѐˬæ\V]PUiEu5݈qc~{D\G(7 IuOTX,grL^$HDjf#*C;3r{/F-i~KkWߨhӺty F4oFkj}QM~LyipcP%Z.G9kEc‡wXE~:~F>=nǓ k򲎔[&?c˥pۅ!zju;vaw\7 |Dcg;D\qlLj@MtJ~gjλҸgޱ ~kvN!AZ7 e c[8n) }=,ol5`o휹buTk?R7/&S5ʹ= Vu"ey2 SorV$8ǖP2n\ITXSZZi}zuHm;[ {9]:JwLzĪqn5Yb|~38ٴ/7-oL[@ HTJ]*8bx CjM~0T+~A0({~X>h&@M`._ۏǬXA obLܺcQ\tÌawz1lCj~HtH:lE$Wc)K ]Vq:r kEpBq~7Cn;*gC lZڛ_mYy1z*e!C너Ǣ`,9U}ԝݖ| Sj3ZKYo=`a^91пVX``s`5ӱ'9;$91*:U4=6&NJIӽzrq%x>Y?0 wIuٖX{ =+K iȦEk@C2I/wo~P.J,Tm\^|w,S{f'tS>dhÌ;=8bGѓ6sX>*`=,EĕK/(i5Jwש/|U?HFf^UkIz>ɧe,M3P2<Ǿ¾݈9|eqӾxܜH}e,&إBO3ᷧ?M}bLq!}v뿇 1\,_jA-4H܇GV:g ,#gdy{ :,&C};uy/t $ T"ޥM0WSl>ѯ_*S*&c嶞b dDSK,k"ֵI^E[F)G$bW/i=AEg]߮(Eyɯf'&Ζ^_ȶs p͍ [7'42&5:&XX296FiM^{Em_:($01b5ۙsM F !'Pů&b%BL]K O:>*{}e^ZzVv xmdfE˒($#n)[$O1RM"+M.ϙNG2ޟ_8Ep6AP.8չ-&"~S,@yc_WUʉmy}]VPO-rj`ogJz岽j%լ4ɦ nyCr'r߃"M޿p/ +'܆zpk(bX,;#^qj)"Ύ-6E*oku7y{M>3dA2^.$CS0k×㷆"M#sze+PBk+&K4WIXW"_q'q4H6̳TG3(|+I-vLuc~ńfw ֽZV#U  Չ=z]&Na=#x lvω(Z#$ /9V*I|M7p{cٙuiZ+(m[|%y<2t%|cgq<]_aws.{/cheWLHe;iwKԔ_k[`zOLoޥ%fs6,|ѹI8 y|$QVWhUEqq+H%EYۡpWKh~m*wTD1ǗFkM3)&_ƨŵ"'-D н"\.4/x*:Y\yK KXx4u}׸?]D}}:*fes%]/kR`m᳒^w B»wcɃ-3*hqXs;{"3X2t ʦa0}l:۵h}J.*;4B)Es˔ޑw~-Cjɿn䑞&5@ A OS3|gA-?гNR&u^5Mdqqԩ EgAv +-lU"e̠ѓԗqYu?|J7"v,SVoXk_ 'Ly*KO-^?Ta7!ca _rh0:Y~r^E4kXh%V[R5:kՀm#G;[0Cyt\90iOsH_yy.}g'\1P<Ǚ+ݛ$𬥊Y^wrЁ/h./cЃ]e il5W0YgQ psaDQJ5-q[:-#BV oG~WV\"h 5} {OX^:uZH+'Q+HSnVuꛅ$r˲renkz>?TS1Df\KێŨP"#$zC&Wmr2HA_@F8:}FZ p qM#h4u'~F->CcPt}nv5ය9mW:Ͻ{g"VQ_8]K0G&YUkH6q 3-Fl"IhĎ=\}z}zVÆ75ZLS9%Sw fz_z,D#|Z8DE:d+ܔ`0G e3M隺8isg8CK:I2m6GG|l!H7 lQ0.?Fl_ɚx6pFSyφ;#RAKD;7ɧٺ@x*MܫU'Bwge*.ȏFt/-𰵃P]|=<$5Y6Yx(242у ˌQ_͖tWR2EN_~q4~""ߟ N]r3pNmֈL:6ON :+W{ԣXB1k" &G|mᖥ8^>{> |jAbwzt^,92}el (@ MWNa!^\ݚ5C`ڏ):/C[Gey=V4{Tm;PlzoxW:zECqQOoeijL=H8)H|~6/4󪧹;vVӰ N#6Xtmڝj!ݓ.<_xt{U+vHĪ:afX_}퇏jݕti 巇 Dygb/gXsoͅ.Q=O,[6IlQՉ(X\a( ģ@%ƾڋ}b užH,{jBbە֣?#' I5. vΊvKDm RI- e/o| Wd3:ANfRڔJkLz!Ƅ[(detkM‡oueUMTekw⟖wOɨx7ySç~Քy*oQ7B/r [ ]yp)4OaWkϑӉhYbG Fޅӫ )N$?d!FfzkXYnZљM!]mWZUk}%MmNWqgVFo 3 = _FH\x,~Hdwy{.ff*jU_yI: ;.{wAՅ&bBڅ&>]ߊH +Q\{vvU+<1vJOFf&CjL i/oQy,0H >\CG*vN5MIkBi*Q(f4 OOh'aϡp4g̹'B8K^W3y e3E]⤥6q3< eE@?FfZLf`)Yy1ߖ`~mqnTLk㛗z: E^]bWvS>x6=YI^tfFktEa NJ z1f~=6Còo:^_--}z{^WU;Ɣc ϋ-^FdV*rʋ߅vb1:~+tV0ɧrΏ;"+n&A$Oc%+v[(s(3Xsz(motz(qMދ|WZtuLust+ JF4L w%mX? hN5*lB)i iѷjZvh۲O^ozw%Icxnw哪!ֻ)d'es㙔bv6cuoD T6Ah;=OD:CL޽J }rulW:ti3KDݝ+A2YdSpm2/q,#&^hXҜWIфܡa˴I}c~fǑ"VZ_O{2-]F麝ШU5  y}LLo'TvN_&B=m !&RlKTijvWtp6MT 0cNnsȲӑVPIS8=ANxRebNYg#y[X~/w0xl>_wv2zӌR% y ԾcK~L=i7xL/tێ*?K,K" #S)GDob4ɷo:΋(3зsǥw|1QTLs)׫[n}{?L}_xkAZjEeOV܀5zg\sQ=Ae}%].dXYE!;+tj؋z/%Uievpi>8]ֵfk*VgF˯SV!0јRթء!!J%j]4׬(A5Ah֧6 k9F68O.,:]+8W:8+eqID*$gw\5[N)IsZ&Qe8W"5pe$Eg k_],i$n3 S08{_:M;SL\2Lԡh=EѸioʅ)Dss4pߦG- V%E߫NX~m;w3G0Exǵ[uBt|RX͏`5ӾO*n4ֆnYֳ)>yTgi;/"4 _`%D9kbG7E~"^fJs(yD̘?кoA}4Xu9Agzπ^?KG[K7Mplkah 5֯aנ2VXqɰu)֭oYvÈ[m\Gnß$7r(mwH?9if/S]d}V4Hh~ZNi#SI8O  b˿- P7Jǰh)f{i*=f| gJ^"]RS+ "q)w/n3&۰3h|]4R;*KGY8qA;P/[C}>k^nj}YG$sXګْ0̷zDtrflHTH PT 24rxlʫ \vGЛDZ*Vp3@ZVW$"i~vgGft6e6ߡtDR,tmP{'"?\q,3/ޣ,raӾ{&J󯅵t[gfG E?5%FZVv#۱l}.@Qe1OsFնsM* 4HӃhh'ˮy[wǜW3 )ِ 1PA*AJƥȚYM/qg3fon 60N+hPq~&f|׻ X:.ݯjP: ~Eam UB/{~j.5ШFޔ&K/V姻D[1٘._ˮ762)տ s(k\Vs"U) iwKS8Ξ3Rx)J7!8#h7?قvfI0xq@es7sJ"|G{2 ;?\9Xqf;ɭt&9n0cs5cdݍgk9yWӄ-1Q[ygJ(/H fOAz;x%HOs"R zJ̺/W4M~^0g(y~M톥!Y' ts#Vq1&)*g]S2te"2i"iWaZ4޵*2+@0=1Аr%^ 6Nof [!kN E%͓KAN1D<D=*I}.?!E4x[5@4u19m`O~/f$EdY_/? ck!.%޿nLl2û,|+-8A,A_\6.aE 2<(8qͨUdXXo hN?p67nhiUXc(ETQ5P-<3j*b#b(AHDD}~ߵ>guι"YzֺyfǓSNB܈6DH<%D|R"v,Ap1tK#dySxL%R&_>[wT1Y;k ;h*R1'RvG%L3"PAcY N -ȆJdZp]̲j˶.twpP)r |xhIm$)#CnnKY432G2(`;`BXԃيD/` "#7(fqh"EjyLml)*lh 9ABKtt!V򤕾mHL(ϭ _9B.#Y&>%(L(F[(H -roqϧu뛵P&'~+S[$RtỉxNKFu"Td{(Ѳ? +FU"l/pUN-v7G9"st=cr8i!A+R3%/V^+ҴzC²;zgv(atZ'GǠgн 2kV_䧋6j& Al:NzH3o,s]J%'rk|xͱ^WΠ,v?FINBb- 2UWҾ%Z,-9+ RoT&b>)?Odd |YO~IixOM_rnP=> %yLӝȗT5$cUs&2Io% I{9V'(uRDrp1_ю 9OfR1#\ieWҮR?8:w-㱎*w݋~oN2IќtS uJ&~ ,)qim&A) GVAwKuH@@C’`q(kQTO̐߿^#V0y|ʵ_;H)b)y"mѕh/9wʑvK;< yyD;>}~KTݹK<:8?nN"GMΒ-v'l*l{2* I_F䆝j5QKΒ.]9Rl|1A^f,~پ8`nƥT VM?W?'ZNfσM7ڽE=mE*N5;HhX@LGFCTB;p`d&[ޝLD3_`xCoG6PɤvBz `e4JPD5S385;iC׬ %gp86ߢk;N/yG͏:K=T?E|AwNݨ`}޹u[*S+07דݜ1GŏO Wu չw˄B>g%wgR= &'%_F 㤹T&þ_[Z6e95ۊKbdmd]AF(3[bӫ?+V؛6/ jDos-/WKǮ{L\X׉w%nPܵ}Ұ+OfִԇXߑ@ma4$-I!gs4GE%uj?U((OWÕ]SHv'2 R|8A{.'qCζ\bIo XHo.-(1)EESBu$NLC7B%Գ4;0Vİ{S8rDQ2MS iȎt_ר;AUAҥGאVQIB2"DOj2KA7ƥ*Leðog J&JSܾC!Fڤܤ  Siabe4n\4!L p=F0 &)M ]AK;zr.O3Pz[h"B |)ﺀT&+߯pRIS՟b~s_pC(t(M1}Pӝ4%shzNܤA_^ڥSF4In]qꎞicdm6ip`(-;qeNyϢhט,@BXeA7w9@YT\KuNZd;1Nj:)tVw1/-f"Tͪ7G+}|]遮?a0FOFjXI9#3b IS.KNA]7D {]GVeNbLKA-۷\%:!pw0lB=Tc m`Qɢi/_JRS?3YMqĜswI6ܻ+8+G̊{6t:i 1:zFε\;ː ڰ_ Y6g`. o}'z;@xǹ \>s}dր4 -G.G 6P~q4CpajZ} nz$9O o5_D?o혓hPZoh&Q Lؖ#2fGV*p @w ӺVA&Zftމ,qpU-g^f{ y~vB p+}Qt ~8K6%Δ$_pJ*pIU& 6wg8?s3oYsᳱ_o2sZ&3s2Jb*{¥\|m^/X+rZt祷nL$䮟MEZWSe+E;t tiA:Kƻ . xMn7 V8mE9לp5qY`Ѣ,]N,aWk!5e( *s_+9#53۬o Ch3I .6+efeC C)a/b'7ywdO8\ LrmE)Yd#O`X'w-)G~;044 %W{ȉvh7dzV;Q\L &|0*:)'G4ʤ⸝;E睠\+ 2IZi?nN7Ӳl9K씺 lhN~Z[SbB;򥔓k-lLTC}uH[H. }! Rc˾;Mya!dj @ 3,pܥM >+R@<(e4S$;X&.hAQeG.Z}d۟IftFyWa:6|btJfr-H{=,(u!A'9@e9J\<8.hi( A7 m6SEdl.H ]Ǽ&ǣ B= <5tA`6xnwL =kR K?~}=pZDZRW-IO[IOl^ZlMsٰ=ƻ}ۍ ^@wzg/.Y6fj&2q-/4${E,\[-?JKCܔׂ~yp7[I"J*r]g8DpKe97 ~jO&m?ZN1=Kr$)jKnf y ;,:@EEXTKveWN3TW*QI9< 4up#/;`-hQANp@{d.0>g{vC bi${z6%}9 JrlrT2b][n_/Fm]%quZ&7[qH%  {jCK% ?Tol hsHZ'Bn f$S}G F:j"cOR-vT!\+yB4USD`YZ$pc_~׫t);"4=CIE.ϐq_  #nl.:%Ђr%۔-+ך1<'_4QvE p öc0BxO L QA~ E#!DKbʡƚ3$C LS;afyad疰g+4L(NP6%*{׆+u9E)ZQ$~6Hx \<@b@;! Fo;_%wK -w #w 6X=Yk&l*ysd-V'H˪ͮۄaVs3xpV3ѻ+sݍ?wDW1;Wd*p;LS~WZeGHRP}Ǯ{=bζ,i1`ΕYhѣ^@ ٲTXlSGhI+µRH¨M39g*J,F@d01ŇXgIQPO+ X&]ILP<"Ja7O,`ΤՓ V% wd4 g>]2‹%`|?~byq3.s|yXmrtw6>1HۑEFc+ĝQƸ/4<^aۮ ݒ.%mHNBvݚNJqY"4ȏZ?4t#COC44ŝj^'wBE Ph>1*eͰ13kYT[˝s$Q"`RK m(+q@K2\4͌`Z긓qip`YxL€nu}h#\`ϯ{YjyO!بPp:kujuCO`bCQkPڋV={ЕdX 5 ]q0}KP n ӟ#(ITGPQ_)K*u \~/wTq?~¨O^T[Zݰya󠗎}Y>i\KN9݋!>+ -9 NJlݒD#f&OE'ɸ<ٷDuhF4 ÑXݓ4ATR=Mcs7b xreIqHcG_Uos-wD,`ۗA}_rA䴇#.lmPSdJO Sbc+h$SF[7Cii}k%`F6D'bGj_,%ݹ^kBbےKw ?!!w;ܬȘaIg`q^̧GK( P;! Ğ*J& .2)I/LDcyi M⸜6dv^a5A8}[875' 1rsB--e+ig˭d! 㷤26M+?wH\x*+cHSB&X6uXNp˸="yLJ*m|Q3g}wvpU#G("<34Ҥlc(_L:K^I Ws=uePv1|Cbe{ I7OfGs9K6*\x#Rg h(!X@jg0CԌ' MֳzzN4Kxq;|WلoOX4;i~b9~YzNe2))Wi3gep\K!Jm0LA5 onYZݶXڏxwt ETE4x#~}׎6 -ش /&'Ő wokXŧ؃jk@*׆ٺA(a|tg!+ uLi}Ja3bfη84gH}Y ( @\3݊B[8 sC*ilXpd"W9JC]- }%|<2;)NS9>(K 4W1<"p#F7d!nP!2&ON)֞&:zg]>)=ټ.ŪzJ$&8/>Fi蓅r#(ޙl S\5E&T>"!$7$>DLw McVVcZ%P,_T zO@q}.KZo}lZWckjxko:y }Y 'si#. fpb2fHWb~$weSX]iȡ=W|?+Ԕݪ7yA+tbj7k2CΣ[*߉`~gm} p9; R>](dju"F:olw".ˌ};Ѫ0!-M͏uKC̭fĉt}_ROh!JPʠL@B;BۗLSݼ<2n>yU"%堍lK }څV? ?t)zڭ4IƲ󛛏6h]`sj&P0cH޻Hh/KH^W`̛_}׏K p)g쨝ɋkC1cɾ.:y_էv_ ( qx rgMs ^38;(YZT(eiUn%T)ȩo\ARq}ήT;1JcKR^- giRdg*Cl1E.ȭG4RXǶ7KB$V /Q|hൊ4;l o /O7Q~1QGxO4_a(6YoСɛ Km;|о"nGZ ='Fee>PH<1.ZI|?F:?ʈ#kCzi8z1̛pqg/uOľki_TONɕ(m.Nx0}qFPȘW;x~uSy^\n{ N;2E|Ї #?LydG?*peF6d!s7՝%'Fue.v,I 2Lg*){!( t6J9v@- 61Jn51pP,fFK⸋O"j%>Yq 9.i+]k~SfL,sPLJIGvo=GmZnrjrU?unIXrH]Sr1 &!-kH+̤51K5q4TDtGZJ2>F52b^cûG}ywBD}3!,]^Ws/]Q ȇ N֥p s*ȊiL(&X63(rnbGꡨzW *׏XuT@1"IvBJJ ZAXy:k}sn[֋G.j?<%KqmpU9d5<.QF~b?8zoRj؎e~4߄@"BT\:3gf"#ͤGORwz+ fWO܍a}k)\] vApY1 tFQR}ys}Lv?'I"+)WФ*X㋊Qmqi2 1@fڙ&8Ңuȡ %WMFњ,wj1"5=qA.ůj=el[P솯6S-įK!vȣ`K˃DsꃞKd3MHµ =R[PُeHU/y\Ӷ.b btt1I&ډc.6A? 7Tsz@y:B,j ,mv-  shS]7'otQl~5SR"/rOYe qݱ'{b'w{{?/Z/Y2&eʑ)q1 7] KnK|XLM= dKN5bMa{ZNк脀/Nn,s5 YȟW$o&1lE]j(nycI:~bH] 3x' gF{i £7#k+bHH;Iy)=5w Ԇ2Qј>c΂#BV{G1;1kioBhġ:-v+'Te-M]:YXi,=\'qJ<Яipr_]ql[;#}k4G^\{H(6~hSJ*=]zGꕏuX71/sRjy~<m`3!%ef@I_ޭ.SsW]:er] K6\l|ZȨq ڰ [+qsQKbJp Oߗ"U{bc ƠRV2z0yA Xr㱟 X+𰳾xnZ!CZZAߋ fYxiؽ;v׳Q \۾ *.ץvtGE{|z_?}⾯ 퉰jˆF#y$]VmHRW\9jv2幠:,7+&<.c28ڗG4bHkxzi`W+7$Wȸ?8r%HF;,6u FX;ftE~_{+&A#PCeO(t^sLџ!w<&Wgt)]5?p5:sCF*c Q 4o_M!Ynl6]?UV>:tmV~L9 Au%|v.AG@ f (:!tSNa/}EKOsFvq؂J54tp?LĞHG#ԭRtyw&"O '׌}H2^ND_ G1+ 40{AR"/_>G Уv鶴X>dRU]}u9=u5۶Ɠ?-N!&'>bq淄;% l0}|fU9t1˅W\gnij?S(jS~jLJ W.?54XtWԀ%NaMz?c?+I=PH`SMâVv hIjrG 9}_$(?tAup+83.)"`i y۲Sb},rWi#%Fz~emQ…' GKަdv KDvKsrK|4LwCu5>e)8ץðU-/yI%1oq0}>H^G3E=(*jj&ŵJQnGb֕ {;_Iϖ4-}݌nιOh̛Kp^}*K^З48zF<|E$M9E㯓"$URQxA9-v*g?$[pΥW1IGQLzSLQÜ %9<᠔,cx ߒd |z޲8kėE_zfw_?{YUˎߒz9e^t0oF-hJ$4V}^oMwzԢno[gҧZad,8&=X:}cAaEN0'#hkP$t.AF'IIHح^۲p%ojQNߛצ9AZӛLdCmb쵑8D6R-nT+p :h`#G+]f&xDA@L9[d'EK W;7񮳝iZS Q\UU6|SW,gG*dj#¸<(} uXW#{ iN$\іd̙=L"CNA,~oJ:ٻK`**Vdp01DS@{@@63nN1Yj[բ8$ao IC/ I,իgyQm~aI\dV f9lk&iP8鰐=!$uX4Ei/OMG`:V\YĦ |'_ AZKw3=mu6,j] 1@q+cd,bko{">9V9+>@2.ߖ-ĝ.*kɣAA9)R56F5/3dNoF5 z- 7}ob Z^vщq.%omu@V줜M0=+A3Ҳ tj meJRǦy7Ō,MkZ}66.S|ftP 4#f2M_Y_U)Yt=wgVR5hd4׺xJjʯatAS* :R'_107Wzϔ]|Иxa #سLhMK(J}[tZ԰Bż^7G{Mf["<:N&fwݠ,8apU'Q8݌[tkz"AWk\I?䚤 Z$j? &"}F4dMf\!R[HLnׯQ[ !Yzod¤2jOh?د='UHUzc?b-b{W3*We9KT*Gvr%I`5ϣ% 4V,Fջh].8k@I<.u+ taE ӮXڃlt{UC~;ZXk]`)Yh8N~P!k( &\* sCT="?(7l@kSYOcHZchM)R7;L +$H!F74^jڶHV'4e` M.֪*eLe$Qers۟+ajQׄ*XPߘ<@hh9nBH!o#Hlq3e;ux> *꠩,eJjV~ٌA"gF's9@Yv1vr2ݰmjY+S6H8,Dtp(emf(|Ly7^M 7Ln]UghBx)u*DwM-WL( Nfyֽkg4E>]iZphY?@a1}4'|Q6WZÖm$utmKME].r )%!X.?TuPj!ȇ3YLKK QHNd%(ĉHCʓѨy] >$#(mi }=jW>FJqPS纒uqA+a1⒂RRu-ݯ?t.*u]TX$*#""#.r?n3g97W2ϔI9~FFHKKLVHDZZZHXTHTT2Bn- (޸۹8_?>|.}por@*('D|L)fcl\וtA6ʔQaa㇈oH?Mt{.!#"%#àER G_o<JHљVgV2\ܜ,,mm8 _?~a? @? @? @? @? @? @ r_z8[s{qN~}FEu= ߵN8` '1]?"YɖA'xN|̯ܧ']zv]\“Od$њ֏e{BbX̤z<o@Ѷ %_ȵ׭~eͧG" =neeT>m;$.$!/KϤ`Qw:W:^w3ڼ.eH=D_#thl-GeA_^Ż0X>Ze uPۄ9X4y^cH<[(P7N!iDJ['T 휞lI=5'WORMagIb~o`*%7y#/כ[s?oJwgh /2㵺1_Q'-.MB+}7̋'iM݀nƿۄ.? x]8\cPQ+z!G{ aBpPjxe(Чbec²@ӪRNo*ҵ5xిr@+I:'4+RQQk3H\U,gy2t}PTSv̞U= :ˣ~EfWj4`h79;~ث=֢kzB7G u.V luzp%#TcGaDk}ϼU+)%[L㐊R 9 >?;G[7:NiH6_?:B"<ӹ`+Inm_Jm |jucXNQ9M7T쥺l#b^Rn"u"^:rcquA>[|"}+ YoϾoH;x;jW 7zԵ'N^;Ye:2hTMw4E^4 x1(eaWke(R)a*7F5ٮN#`Mn# j.̃fٞ N\hMC.:+<llQWe_:s G8}U}oa[&cnV^#E(z㇣6DŽ<5>?k7o,ξ a n*giig Z+ay-3zir^T2ak2FϾ|~6j~,W'nll x2 RW>|>UˁLcR21` 0.٩ֆ@pa Dݳ`  6.ry{+-'^D;]n]K0wPmPfzW:`'hڜœ,Hm}dUt}^C8a6%w+R`ҜE^r)QQ[.p WŸ%_wI0]/CL3'fz n MŠDI%%to!/#Tao?|XcD)!LQ݉Wn_kȄ_JL-;s).{ 沨NPtyWHo'afHcf&|7 =^GE>yj{_ui,s`(|Z.٬)Du^k vcG0°weOxҗ3﬚o*ҼhafHcqvk 1"sӞ"!"Xl0Onix`鐇G䓣Rb *mx %oW@LFIz,}i+'[V+%U hܖ1ŋeSٯ< |5A"+ ;>|&^\dE$MU^[llnHtq?v/uE;^>կ߆WYf0-6*7j_D(>=xN1﷗"D٭950:9u|05+bv9G線^ߌO_ |БV&tg;kU1;jIKg̽^hG6Q]XwkIeBe)F×lGcpBq7`p]+p}Tnm?kL-7V>wlhpW„~ " 8+aV0}YUg*%uJ|7PzANvxӁ ;UIBV,Jct#Z[j קDY/>Z>hxPV|v¿Fu>_5i?O*j2̅agQQ;7CC'Sr";kq8AW7$k$e?6r~~pg>~LZ?,vN},Zj;]JL);ø׳Ut! Ξv'4̾ȴI  II)hJ1ѸdyOt}!0LYmln@KgN]#-.}sӍlW 7q q͙M-$cmI9WSaB_Mw"QiP-$0_ca!kN;xVg5딸xy_@\te@LR!@?0*G$ȜmOz|TN i0 %K)/ rEfk+h >!⋟e9Z6ͱ]hYf6`lPqlur縦>;dJx#}eQ%(Bz ig`יRXL4 ZiHL3c|wuTPp]U1]_ö];;'U ufCD!OҼszj37k6Α{iyye(XCY)*IziOt ne`acT#?kW#d{wU!n{-0dF.s6u(=%tTg|= %PwuQgM59}R+YTL[px\DYo%o6W흝G8HJ l@$ .Šj#_<{Wi6zx6WM4 ae"czͅ8щ٩TMViFQvfŶ$O5eM>O(6XmPQ#+suOw80q37dOx=Әsyvg+S_E \12r)yR8B^% s03X9q,oxo"_h `C69SӶxWuc,[4č z'F*վ+t{SvRF_oW~Rc5M;\"d<A'^|p6tM-a[&oA6< ^Wߜ%Y'-"1. >Yi);Qy^J_[o\([ \-3q=}V=Y럘0nV &M6GboZ9r[9Jgf-SȰdmGPhI\,R OG0b) a,9R6dj٥g\_ a>УZ4`*Iи.;3CZv_iD&.;ٌ ]%2M$viJ`rI>ΉIj#x/Р&JM/ 'xw|{=ho@HVBNѽoYÅ-h e@ǖkMI' ={ۯZ:ijb[ҵuзtp[g~P*q?&s9;])szz^}E/[[ *XJ7HˊpwD dMŏ=/"JܨXYJWهcYWric.NTsgoֆ4y1Z~P/QO]>t_@:& ){իVU<|z9$}Pe^C/棠 #eǹkȿ{ nYF՚* J6n!,` Mjufph?s>e௷ǢϲkD%qs%( Nh/-Da[aovL23Uc%ZLoMY&%">fMY6Pny~z,v#6R,|<z1g*,ϭF"e7~ơ-u:ˈMgmXQmdqCO9hrvkj㝞19 irLڧbsJY9]s'Z ם9 OPS3! S[ Ԕ#$(uS4AH&V1'߶}9wƌ3,a{9e֤>D!hk-B0$bcP#ڠ#Cӌ eWX'QG4"4q Hq^53޺!y^$#BVJnZ_ғ۱J̿A;O 8N_AVHZ7'>jqI+[HꚯNCj&V?xveqiK:Oyq;_OF减3 o9 Z J|V۩h 8sij0K~Pl7!=]un܏7 GE9b `:Q^xsFγv&ƧKs¯894y^OBP|}=[gFY8hW7OX4%w:M`l7}GD^QoA7l``#CbC&&:%>^Nǁ7}Kb/֩-#U_ITVlVxk>'٥?q])%- Te.R;!y%;ឆ|G].&ocB2W3||\@'ɭ͓;rp#/Wj;xg)%2"M~ [5xP"K[ڞ84V[=5Rĥc+*K#YtV!u-T.UHY%'Q,hl%\E0Y]mļOJMB#M(A㬯w07l>u"_B_9֙-U9miQ"2H'ϟrhW"L(9Ng|_1lʀ 8մ}>_5]%DBS V.%ݚIj|RnG.TqR?}%4x=GqL'gr -%&~|f/2jwy| ru Ѣ;q ҧTlֲ25v o܈+sfR#|Mpnw&+)Im䋖~wW;IS^)o[:PoSϴQY=pA@uZ? u 9YeC!l m.eyd}3΃NdrDzh^?+x*Q2AÝ`+ $1g=t* 3 ,TT0{cߢL$tL¿cDEe6j{Hw0qяsCڀsSyB74,YI+I>bW< &7 H:u3F !2wF=2.;X 2΄OM$@frYcP]+J8~5 {BASKQ]^9'ۿG3inncobgeF34Mm/2K.ʜlΝkA~}qȜJ*utCظkcr+s8X(5/bRBS䩚oCzP;5-7o.^Zj(UNҢbu 39ӛ?c)|Ҍ_v S,rm-̱Gw Jh :*/R><~ma6Pgfރܓqɦ —܆8PfUӮ6ѻ ]uo^S>H=95NIz;8:;KcP$|̽1l\鲍BIrU%Q4ziB+5wUgf[ F=.n΃ɔ!;C^Zeb4E yOcko~tW6) GjU x2PLxƫ_l6/?ᎈ[:]S7 >䞽}!ؿɘ $-4aA; ,eƵnHaMl^DMxړ.%wŕonTz16p{iDZYyqS ̷[LNӣ=PG1\ ֓q+OI3MA)eћ3)d\@.+xfT%SG"pCF%FG]DkPHhF"MFj2}K7Zm:Eh=ƨ}SF93]8@I55Jt{BzςOm?Lʞiîf#^*$P㭚e3|=x!nєqF_eoH' ͣկfre[ؙ!ӷ(GS%Qz_t+|!8[̎QwM)ײi*y|ǤL9_p_8lh8e (Pr_ hN|kȄ:m3G=-CA| o*|Ӷ Qkh)>~#(Y5̈JfCչ3`:5$),Vn|ӕDs}B D(&<Փ K5((?|=8'RHkmԶNRi4O~Rd7&\ډ4P~"Cún| _+>ƴ$ZZ,2YM};!/ ]*0}0/0b>VHvΜmqg%M %F3}︌TX2 }dtM>Rdh0=@]n?>6~+ C֛Hd^q}<`GgTglvSE^ %ʳv8F"r9/~yR@)K4]P• Yy)eRR:^3ĸWPK#jRKFOcOM[@Bq)~&]iɍB7Є&Os]c>ey٧Riwԇ>L\KN19JUbǥg>اA&4:dZ! c͙.9041!_Ȧ=^QJ_-v Je,Dx|f!b餎E Wm˽!}7Ie>7^lP\'ZVBz'G~+hԹ6/m;t|T,uVS fоjt2͵ghDᦗdxtKƓP^ziIB{s;iVrZź+TVJ}s*Q󊂧 t(mI2#˯ Knc. +>ӨMՑ1|y\~v_O,yV \!,ruZ5D}!TEc*8_'z:z^۱ϜN׺DŽ|Q27#lڇ}pIz ]0-*KU%]+38IVܜAG  !PQl8R`մ[QP5o^7 |YdZE];w>] XM/9y~FIj)-8z`~$ 6E*. FRmne>ST3;GY|(ۧRm#/r1XG=&ZWakmUsbƁ\ jD~|踠۾=:?x/~aD[G ;> 2^Ψu2͙Ms -gq:SĺM`АZ鮐O< >9E9C{/j.Su! % QQVS5r2(2<GaeҞkZxt\U4e"b,:D4evG Wjl@ {) E 0 3gl dpS<|>:HNBgp,` 3bkxq`Jޟ<=d2fJ!!rV ̳6vIn)>YB)ο&$#cxTYs,/`q㉑jsi2ʰ՝ևPh}滍=}3O7_''ettqoj $⫖֘&R%\F&$}7ze3ZTÞD-C.R𜒙~ /uWD֐`V6Ϻfi&1e)`nxW:iP0&J C Q/+0} l峺6T5&J+5xz[X<uS]X5xq?r*x:ا(ԷqM&xd/JQ7I.%hY{yٔ愶pɜkh`N * ӭnn6!gv&O*f 'lJJk.)!6^ߣPH='ZcNg+DePrr+"Ƀ!-|.݉ %Ț Pn 堽oNh%lG?7݃6=7-{W;x,-z>Gѳ&i[ ᥧ/z[%mczK [/sG? 5^skG{ d7/_'91 C寬^%M1$jáa ï+PT|ByMun[bƯ=-TIF Bn Pg Y6J:C0=p/F4rI~?jxSx:u5 jYߌyy=aSbp'ݾұ^]e\p+˻zYDF6NIos|`oa $ (ciN_ǁ5Q![gz:ܦHZK `PӖWwnT t?LQγ ).̱)PRRB;y"{.1&ȒF pr%Ftz'묓IzլS Hշn)دꃂzn,W?3G)@!97И WOh-}VF.eZLҭ"}X߸e+$اew˄VZ8.#'Ȟf`5.Pqb% F 2TciT›KžN"^iĎ8+"ݰD| x$&ojq[xPwxBhyͯ10+(Rw5 D*偲56.>ie e;EWgkKHJu:u5v}2 Vkpr*}G.;W_:DS)4u$` LN,^Z#4* P>˯fwB^KA'҂uucUbC+d-3Ϩ$ÿ8VzІO)e= zV]h=f\ EQ}jjkSV] )&ȺFp8^__ )26ZS;o4*@gMH솺dŇ_'}D^Gd5=\hh [r_뽹ɺ" IcR$-x1-*74)Bם_[5 /q4:=Bv56v?ZIuKEejYSS`GWP'XLMBDZ{*&.{yykÁ%&Qݍsp'qݫTiy=Ta)/[LY)0?wlq ,纼lxp":龍m1@$b#tY0{t_"h!E`DȜPi?([kQDrN/^@ox;)[}<$jy* M3&ʌ7dOgE酔Gf!"!g~/yCMk`0nm\u{r>r,0%oz&E#I? ٗFcvbNNO4$ZnŧIj?Dr =]!*W byE^RJH gt*v0:}1)/5z4-c:u1ǩA~O_#;LS` 0[Mi˚N5G *]'u0Վ'\Ӫʜ]mzSV׸nxRyr8qjωS^,~2J?~#Z7O#e W@XR|$kĵ w3aK(͍ލJr=TJ+Į\R.Aҏ][h=(li-WaE! ~4%K3ٕ_^2},$+,Y/H;〙 Ȱ6\CO4xrObnf9CUY-|&R]rذ ςÔY2SCS%J;)\vb8M+It?y߆I"p+!jo=&4Kt?ה[3IZc\T8j&ӵʏ;Aij#Tfc]g'd SV7nmUU6Sؤ mpRa۽Ty>hZᐎ;^M D<piK& ,kգq==-3d۲>t*q8# KWyaݗ֔Qշ e_F~4Am-xc9 [t7k<<΍sÎG١ E8, +=UqߦkYtPv+G!8U~lI.ʞ˩[ZsoQVGN ޽y؃,{~cVrO ïs#ME0 npg+]e6:zL(KK Ӭ$Хu ow-B _t=?NTs? Z έ"PPK7N Je캶;&?`PAU:z-&'+m}(Hqs3J47HUz{:g4^;":Ӹ]63QlOd~UoBtw^vXJ|탔BM["BsWQiAq9.B˧w,$gHO*hqjRvELwRn^|l8#S5^kIFFFvu);ڛI͓vLmڵgVM/ L8L*.iKۤBr0|_ اԓcRoڈQ6='\^w~>얿?=d K);0zhIMIѪY-#}M==gdڮ1qJm{ &&ƚ:dJ*,%ap/^y:5TXeƏF,[Ni}>*oKo?&z)ub%^u[h;j&HR@ UqJL㉌E%( /xytmfA76pa}f_f" $ů>ϬyT̟T5_ q5)7)b)RpJ᳘.JGGfOG5K5UsU' IiViN:??ť{~wNyښ|Yf Gnt}[IP-n(M>2C_غq"xFl@}{?Sʌ)u*+rx8 krn\[ OؕhWH8[sl2`-QFNOlI#]ݻUg `[#م)[zv]]X< {kػ?:<771><7&\@xuXΙ6J_+ʨW{p~F %7LdDi\(:NWr;dxO&:=Ey~RK[~Rl*ٌcSK7r`Rveg"=;8^b$ŌW%I/U2G{j pyf}TQ4}A#>k#h`FgOH3E<:l&]SPLcĜĆybcDXOP֜C8{ bk=jcٝjk$7BGŒ|NFT kᎢ FT4jWhQPn@L^g:k[R37]/܌1yi `moW{ mT{%ٚڈ*f 5K"yk_GP:u^m\裼lKLD.}GQL03ڟRJ  i^7{VOB]6(T鏰)K fӫ~x|ij)Z6RF="0{*RgMپ`ffÿܼqmPcVPaS26ƖQOfQX,@[jor8L5w>LVV,ԇ6}LJLIiʠ5Zb?mRSQIxE>CF_?HSD&7h7$)`q2+I԰\.7E+9 ۿ4/`?Ox]{r)?ͬh9kؾ+SNbv#rlP2rf@&= )Ps#i-@p%Jvv(7CrJ3g1QU a(NW5xsjdrR,̴]Y9d-,\ $w^%ǁ'RFZm2_v/̬*_LeX[Mw-Pݝ݊kpwJqwV]ww8{3?/;{Ϭu˚5;UTix*N`'r/1Rgsݏ#gG'$S>Ta`GV0Ü, fݘ/"-=\YXuqF+Fc>{>eOxX{-߬<3zjӨ8tY$xz[6~~eR/{˷/J.Y<)g|Sfp3;;XHTwÆ{J<Ib(Xc_"KPƴT@ rzU yR5<C?5wm9,H(dk(0{x3!s*MgJ}x;1쏡3a|> X;1 ZhMOq+O2RO˳{%a;,Ҟ$ӸWϬ5lfJ,'AYY10.Y)C$%5^xW x/Z8٦j dن(\t1 "]") ];fvN_&tI{G5oqXQ&&ʿ,n$ sF#>⮪=jaʧԡN["= Bi)s+ 1Д{3kIF|GAmAl3'[̫5 _T4+kbFuqΆwޣ*%$F1D۝KpA,3q!@bt^#g+V+r?,Uit"4e$FZ iuhc,:3|tvc[}dFb})_.^~03v$" )D(M|HR1'/ #Y%˝uo}BuǾH6:I\wHf.[`F)d#ͼ=ͼ!G|r÷gRG5Oגz5Qȕo콜uoRn`p&CV2g$ %rXF1e)X:Yw9oJI c(ʩuK]ʏEԃ.9j;Q72.!<}_^z"J[Թڸ[<eÖаs{۪㕥 f$u\K &OB'Z,;(e3|N(fS¯eսԶ_@y2󐫍%9ÛEI(^y wT!p! ۨޟ͢*wf c>b^_%tTa}Z/pc$rgNj#fclcbMm\&ArN4GmX 7zFNJvW\xera#캋b/ #_yoǘ#$#;mVo UIzL._.A=(7Er稞UAgi'DˍtIY<3pS+ 茛Occ~LL1yI\&Mοdk3fNwX 28/[Ky ~j175Oз);k闐GnvW!HJEG)]S>R\&C̄nE%[?{˹y[w]+\D~Zn>&i{E| zyHC=N+XgB_4yIz6sw:uep\+ mSRUJ"R+i^K#•?BCl b5agvmjn8ns񗐐8'(78 7.r2\lx^ ~d8 j@ͭaGa d䮋 MYmL+,^@n14{D pK1]il+Ek/Y<~gtIqf&8'x89y9gLwE'ffۍsw+l6l hR6ox-,كYcCKX -K ~[]ONZ%Zn`\BvRRo mlf߾vmB! pr }w&HWgmf@Z=;MY`NfvwXM~)+x3<s ZƮqJi%=ԛP*"&  O:OzN;uy&~8'X3mԤ(+%{=gy0v)ʺ|ݧlt ay b+H]1vY93)pVur]כ?=,?T\~s;І_Ԉ 4myq|'3"S6Ql jOomm =Y߆+W@ +$nilV x b8Rw_k.;UYwgA,tJ1g,ǫI@"}K'.Ű!b߯ǯcQM`%5H%9yA'|d^?CD PR4UGጊ?m*C'`|c,HM>V] :X-qlzcI_M-2-}9HOT5 %܍Mv\y/J"ysu L'"yɀ1S|a15r0 zۍay?;!. |gzcNW8)A!K hM *qr+Vʳm4t,.?#^)Y(akj*6Onj=&&&4% 59,]$p]U׾僓svHlRw3C$+DNAҀ@֤?8QoyVUp5d^X\XR_^^})謦f hCWS^Vb#!Vy"?&r*^cya f=B_#s*Yͫf9٨ `y;-s]dz-u;Rtz'eOꤢP(UXb(ެD^K='WCSu!P0&?TYKLLZG-}<&η'g@ }cUOI 6@8u.gOYU*z@ly Cҙ[=!Mm%/YYm|Rc ^0h<~ 0NC5[?&J.~s(V&$ܼIt~/D Cz}u5ٙ+>!]2w'T'ʰ@ʭE鳛Z7ʖ&Eo-8G14Xŵ0!.GH8w>F?+ZJaaã#K >)8RW)R'}h 8Ӭͮ/u~$1(o5(D?:QeLfƍ[TJOY)kEkqEueEp\u/&z%igϘľԆx-Hݭߥ?yHm<%M}H7ĚWv'A#6l{_"`\fKͣn+^,־QM-mHٽ͆W{% iqكsl6F rڛ-oϙ}_`z(Uq戈rQ6%3}O:U*x :z{K< ZMN`e)(̻l$gO  *QhJefDz~sKBPᨇAp$ <ߋ,"+avUs*ts=7%ƳY6|XIg]D|/>jff 9Lm.H_ri&r@*" ,+un=AـܲFF7fu+:띌oZ |nR2ix{*JѶ~yQԎ='A <4,eܻfPQj`hx26ipe.I' ABLpPtU#Ǹk!C˕ CR_隊gPk  KXK<ͱm7䥠i---,lVMiy^N8Otl͙Y(vl pKC"afgμĤi`t1vz6ٽk6 h;#ojP&A3ѧ9_{ w>4MaWAXUJdX.۴s`b:[ 6!O3n!`Y2G)ظ^>cm>w30qV#m0z OuA(>,^[o2zZ#Nޮݭaij~?e5 32|Sullo¹g@ټ _QoP\Ҹ;D \Yϥsj~*+O\:c%I֔:roV${'g\ʷY#1)<@`~.-$%CBc}e=LgOtHj/@ڏP`mBjfDSU=buM}< uЊ hnD'u8qAK3͜6ff~a8ל Lm=yf-`p|!&ֱ[1b`g˴K1Np⋪7Y]G^oM&2jfff:+2xL+%!^yS}.9'q+ ư:ݽc(_儖 8mu)= !B6~D@]?=Uh,\`2so=}8Y-6ŤyIӞ7F@qaR)rj * QIr3[ֻC!:SYnp0<>IeyhP‡K괕ixD!Nx{r0ca [㖣Wt<ܜBSv,ݗ ƨ6nۆ8IP ysm** 6\.]I%ʈ1@0)z^ m. 65+ace-1Xhp-#=m{gu1'4<׊lF"px,U/@$$ {ReAYz~>B@/Λ܋Yy)u"`-Q< ?ʖ2~0%cT2w$(+rrrqrp^L%,֙M>ZH9Pɇ0>]q-qRb5{^%@sRi2\RG''%M&W0bNȬu?XjڎY¹jq |,))YTbvrcZdf Yp"๾}dgW_Wv~re/’/__<{D%#1J *Vn pIo:-#a#ixi"h c rBu*ʛ\zO1/kx?ƶ^t!pwlߦUC|(cp(F 6F cLcr|<Z)u!yޗoK\ӛ܊TMW+ȉi)3i*ͥ&d贴te,|1)]C/#fS5hRrq-(Կ~UZB@",tЀHɑɓݴ%$X D0*=LʊbMQ}K\1.!^4dFdn0E/j\5u|u^P#|l:t{;,tք"'r\dv,-F Fju)WQkkQ\{ɏ`16Ib=Am"Pf Ipל[7O/]~G2Ü3Nh-5n5DV޺e^[0(v [y&H_p>_媪b&q' ^SDZ֛Z=; $v/ R lg7}:%)=0`iNZU7O[Z$m? )18y{?xg1nlt HgyγeuC4N?ZX';LJG'7f:>F)/I; *הPʎЊ0}~xD\OL-P$IREWaTӛz<*),[.S5OaH-57_v5^EDq*cD`V9QKm9hS,pNx]VX`ZsӧU~C﫛z+a961w/pa~sP-O}9 B-uM\p'o< $Scg5p'㝹OzbjMíN C kY;ec14o;_7`V=x;5CLznd d`j{PlUZ%WfeK7[q;G;TcdR.K"?zJղa7Sͺ˨cm8q߁նXMވ3v ~#2}y.zenak?sFWVV6NNNN@i;_p7בhK.A%2F7~-Y6xP %BonO~6d$BtA"~H LLԔUo<e9f ^.Y+_ϋ}~SXyq.= G2ƀGӃ㳼p*,Fp7GaD$`c ǩYX)7Y=K<wQ^MslTJFF7=H!9\Ú=UL'SgUl^'geE_8< bSO C'ǩ(b53<)6=aqmjUK6ds%LFl8ow,D@O ?!*2`j2d R|L?J]ߘ] /7T7+fJDv{򒻜E@S8f9N;Ї95g-B? TDY9U'?ɞ7eVE#8T92>k(+'iD"[Ǡ;:yᡞV?QOpUF0e?D5/h{ꆊ*yE.bPt/`cg!cgof?$UxPFJ͍b$=B1NϓB" 08ɏoՔ0ka݌Raz_QO4}fFz Yeʳ *&&&jf 5jlz"3InV1PPWc0$i y!E&`tt\ufJZ++j۩sIP$hb0v\i_*8,}V Sp3QoahE6W&1s\z3 }Ka#ۀ5Q1JzG)yA+f1wZ{V{! fl(N>br⬬ 1a+=4FW]R%-:KC:@&Β5q]e(!h /"vˣ%,N崑`ೃC-KU<^1~ u5b޳&BDwYٜۗ[M**.Fɧ/mxUxE:dbn;>eʿ # ũ@ I.+)Teђt)gy?_N}Goؗ:Y ]702zEWgvt" *HJ,6 '7or⤤6Awu~E| t: <.և~̫\'XAM?[{~dŽGNN:B5::tX#"&N!u;Sfc9uׅ _? E?j9ͭsg/;+Sw$v5/:zktWgHI:H,z7͈}:d?ɜi`z׌-ҫ//_)T!9cpYTI6'pFhjeE ם]ҧ`xգBS4 Q$Ȫ׹ֿ+~m!2'꿙" d=Sh"Ίb9geaV ypYp}4UuHM`ƪK&IɜffIon"˾(]we]H7 V9bOZ9ذh.bΏ?p3,[;x S, FG]; 9dw@ Nfx4:Jw/;o3-p]?O>&4%u4JET=)1 ' $::9388րjvt.=/6i49eeMNEkӸ j30.gDY dU___OK˦&[&P!4dB0d(JUeiҺ pq!aKq AUۛ}G?|}/Nb # Ũ}0ɸXm@f\M{\"ROtpP2t<38?U 9ke\U|v%*y$0/%Za/zIqXGƺc+xjo݋8ٻC*_wCUq&1ڲ._mh0MtL!L*LǰVFE SW{ܜe%@ L`>$B19XYu/ץhyh TACwQaq{z$Y Pcqnmܮ*L," 94^$`X`Mҟh]#g"@n4V+QQ _/Yq籐*lJƶ/C6ib }N՜L63J~N6!ms+ !{mb7.pCk>Jx[7XsI@ VyCG%_OrRPӌ!a)tzVG$ʴD!˹8Q#5].$mX3nq8mn$HEoZH&''8jSMڐ%F[a ;3ҝ"nx[j+2::檫{uMvaYak @J?=w`z~yy~iy )E(ߺ5^R<]SF圹>X3%Fj Rk{,?uڼk+z>'8C^UVFTEvf`Jaen ݪ8[![,**S ՌI; N!wU}&=G7<24ZPQ,Hbt:w SQQ1񰰔Y /21|>6C n2.E2΍׶pIDN㣢ڻ|)_Fqœ}41P8W$XP$G:Ș:+mKkl藩P99HX[˯lvcc#gd/f+PQqpH؆OEEao |/-` b C$ sVݸ2q56ꆆ6 EEE BT/-\o`{ v܂0ƯC"yQWρ$Zq?-Μ0pk )՘< "GuAʞ>LV*,+&2~5TF/Jj.ܵZZnW95ǖU,v'N }H qs⦎Y;k@R"G*.(kk H0X)6NR^N(Hk@!KԬmܐ^7:>9ۨ.ɐyڏ$  9BX|MSOON d:u2~tqqIKS<(j(t#42}i R]c!}av'-5/DuJ4.n!!7TYSPPqﯳnyC^)+71 sz֘ *JGcOth@m'k9,-> , S]$OZ،^I7 {Z"{(@ DE殇L8qYL=ˤ f٪f+M73bیJ[ƼK=,׈ļ?{N^--,V^ͺN8*fmll1;Q@~ $No^(J/Up)2 T<; E$Ρ җhLBaaLC_9>?rV+|p~"ofquvW/+aђ\d]Ӟ[vVŽfin^oww~ %b`Vi`!:kLE `jiCL|SPtRiXSST{UXw8:;1܋yu+* ~vFVGfߑ^RZg=}bFk\y=+e;Ε]8ҕ_  LTM4+~;'Tltظ"'I-Я_¥m3nP|1e v7^/]Ծ;? 71gЧe^nv3d}K+ľ udK.rʁDΰ6r5` }1*Ytq=mMh*jt[ޛI wEez¨ɴ35HEXC6[rC9 }ż5<ָ Tqpb{N[(56+Pn!ْU/B|t[9[,B_̿OS<>|'d2CиMf' >L}0\۴`EdMS 0/C-i<Z?11mC#E X7s {q~t'}[jϭ>18?#)-7Umg3?1jDPt\DZq\rp~;ѣ; (D:wGCY#= /\p3 %C~C/Yj2Hxӆcf:SB#cѓU+sDiw[g7[)S }.6M9&Poĕy~ai)-Dt")nggwW7Dю[ $.NuZXk25iFfp?Uq0بh/Q`CT#Q,UP8f<#=@Y~G&r6D Pl—eGd>CxnGvl+RR3 V'Nck!! 5Qd-NSW: bssHr$쿵q|ڡ\ /2"N60IS}1}M; lQho}37a%,t4{&lDn 3;!ʅZm.ޒ!GEU~@м`6h,i=dDi|R#u[iy)+1U5a [K Uc;.o}  in>C_h9c :+axooj{'(Eu*8':)wf}gǜ##|VCNgUy&,9 [SJ zDбa你K_[7J~STpU sM Sь1R+WZ֗PL'!| fVC2 nd66?KUK&e?[Ϯ'%%EEv d'^'9e %]Ie$dIZRS{Ra0'_"\#@klHxs0x۹q<8(6jUlV\qmk=ԙpc))2Gb}FO,QI}nk&Z6}lO_ Y54B9gteQ-tAƍ -T3w EKJ%Wi6ܟb G:t_ um;تj ;Z`[?{YOݼNb;O\ ;Q?UpSɲXyKD*󣗎n45U4-$ś&&&HdH{:Z<ֻi",7tptߞVďP*?xp=z3WGમTh-܀]AW#ޫt! x:AͻȭLjՐrp;-W\ʖȹ!U'= h(n[wTm oӞHM皯$dTV׫38g+]vjjj{v5myyT;QœS9mbNWIV9Y Zx'RB?3Wk`egFV6 W%\ /DE&!L}lo,|>i2nAzDL)?ʕ.\a7Xmi'7@T)H1g!Gɽ_j+ƨ`UI{Q -\(kvKDJڙ6:?M.yLĀJٍ-Ǘp n6f6T(QzbS2+etiLTʙj~c]ZqF`eRxXT my@&6QCU F%")Q%[칇tiMj5yvHh#8*Lь`N\gǧ 4!0[oTCeK%]EkBKMfg4?9VS_Ô֦{Z}C3=w;Enۨnm|ìF&௻|oxtQ⾦1uLv]8$`Wb'mX!,\Lߊ {90(pzp,Ǒ=4r^[K&t'nZOxہ.iYgyވz&j٘IVx[ykolI`&R+@NZ|Ê=mF1ߴg-6|w41IHi5WoҪl`[s+OZxiꘟ:BFy_uEIxOD(L\&Cq\VnFH&Ɂ<ے#zP6qcC5xzkle0[fsp˂!W9R4\/ȣaZ&P[K40UN0@+7ԕ|i]%"wG 1 dz%0[Mnǥ@Tii y0&v nv.WYE ɿ9+x~UL>IEvVc2l Q6@Bcm'&" Ř9>hòǙr<A*-/o;;i}g Ej0k{_NB"bB%6%p0IPwW݌V}QfD~-{ #֠R]&{?DoR kTW|8DlЪkjJ"o;p?5O{]I2vnvɋO#' >~ 4p8m_rLY,mt\swpW[P'o-,Pp)֓強^*(ij+wwoWuԧLʠ~X>uNAC <</si+)U>HRs |ym\~$95үZzK9I[wP~+V\ i yxJNueO yR o+wOXLn|q@iBP|ws&>Ac_[oxxe߱Q] M>Hw!Qb_yqZѯwĈra]N7ڢG߰yBI y]!ps(:GOOSO]e xrjg*i3)TIqpѓEV*WRsa-5%+Y[~@Uܚ_&^^R )~tN "Dބ\'41qzQ'q bѵe%eFfrt:fZֈV:ynWDz?>s LuKt)ҏB%?N;@?` 7^g Jm[ ]fd"J9Rp^B峘Ӿ 1ILcY!H5z$ck)|bbZCA 8ue:n4x  @ 08q?EF~YD  颰\lӌ),/VH-0JOV|:eas#RxrH((L䳓K>Ymx5]1!jaf-+7ozš90 '%k\N܌oG^i= a+f{XP䮈xKn|hOm\ve[|1X꩒Ƽ>F^ 攛 ߀1xoW׻l67dd `ꚩC9n$79 C=0ehbM te'&#)# z_P.NA^6ߞNdp]fuC]\E3gTPӔq(v94蘋HPECTYvqSѓ2`tS>%g-FV~82p^idYH-OMr2wjITO _75h5qyx\+ֱZ}bY߾(8NnLɍ̴ ~K=#n{[4 )CmrSG?`GfphSSڥ9#ch+cQY z4Sok4O/m('Wę&3gˊS: j%%-O3RՇ^c_nD "`qoפ)%&\)Ls3rJW.x n~:cA:w화嬗iɔ*ŚGܠE HY6_u @ ¤)T3Px膻ut-/ʫnnj%`n2WSﺃ:T++_p\?ߋʈQyMNඦg;.Z3>l A %N%ڤIMK@|#NmYAJp_%oYf4C\m/*lC{[7'תucqĘbRy([JVEbS6]e$j2A+%U*e(ZMݯ~/8<pUzjx]lXv*x$k 9tDAL6 fvU~aw݉j`!H-!d{KإtqC~xpCb鯛xH%_nnZ?gٓnj ]ZOQCPӅV+ u RK{IH5':"_iK6Kڪm/hKF >Y5w4*G\ҿQ @Ϊ~ȖE h:P!3o#zkX}~8V&Cy,n/h*⵨'f7'gyݼ@U sF'Q[ewE+&\&cwqU(2TGن5'v\5!&{C\鉹S@g8W$Cw~ԛI'$H5m=QbpKƅ/|_]?=T&3%!hsuqc䯟h#Pt8oԘYsjH*I+*X9TrױF1.YͿڭsۄclW8Gl802| (&(`/~xyen_/-"lkor ~CUknF/Th3[$РD{9d[%e>vmdv1 -siة w 8^'-шWl_x ۽{B~:T={gZ^^,$^0Յ+j`[m=m|M>]~z)B wx)Ś;hGȜ,$==[殘}>ƫ )NӶuoO->;; sn啌> jVUnd(ˤk e7 'XHP d|%=~O|^ nUU;3$Ĕy7eT'F+Ix)fD*wt 𨙘;-C1)5; I.5jVE<^$5vиş*.{J3hxFvM8V:~iP٧jRԣ5NG $KSD⊆.4E2mew%Yr9[B0a%I[=N r/ -atI%BWvR!QV[\mEj:4 Z5*i8Y'nsDHXnl zz5o"/} |srR.eխ0^-P .|kdBqk-;yMlBM)A+ߙ8F1OksSIk/7 F_?&ĽK @CRL)_!K;jD!8/#[90JN7Or$Ds*UҌn %a Dfvrz WaZ+qeeelRR+S k4%<\OHȃVg\HaNIR='ޖ޼8y߼Iy"k _5t5~mi{/k{bɉQYi,;==hVV&md@yWs&\H/yaMUy9ɶM).07.}3Ρreg$_ekN&p,LPO/ _ kƁjʺXsh34|hS&9Ǿ"+jV%hd]o?tWff>]y|Ο`FcFCr6ɰXM H (WZJSOrR)>Z]\14m*ݨYȁ<ΊWiQhҢ#Z~:DU޶to` Zw,ڻ:#%3.:L oxKEGdm*WCM=Ƒ}U(8gIW6 ?OP>S=H ?\UWGmp!plпgAhI~x5%%inqZUo8O"9 Up@QCTXM8SDy Mun=aY=+Y|frw- D5¸'Ks]j(.S\FOII/^9A,# m=ufopoƟEJ@@yκa%FkgCOqd UhYwp)GӕbGPSh99 q6BE_tS,Cr6BAB 2Ea.KTJb$Ԑ2Y&4>ushiiS`'b\ m6ݼH5̳ɒgKs&,֢dPY&6RxЮũ;Rm S 5Aqvvlwi7jr։D`/,:UӾ@K, \x5kVo6nҴuv?y.YsX/G+hlvrz̫36g[V[聏;%7͛"T)BS/vhG8ߏɭut4m>L}Bs<~]EMbg1ԐQvSF x!m?;&Izxx/L QF|P-MjB HfŧϷl,SD1y׳ivZ_jǣgaeeU~ S^-$wdk}7.QZSh)y\_y![z,|F4SdY=tGP2|$ɰ6$fH&BAX$[l>5t)tB9N'R\$jDDe~\JliK6turzRJ#j3 /ڍc NMʣKQ{Q\F&t?etg{{ n&+%{$1nms u:lm,.(2 0>HvU(l9 Pb/I"Z8IY?DXIr7{5-8"QD8,'Zc⯈{ a"Æ%q'.nָLD0Ѿ~@[*9Adc‹_G;(1s6 $YRZOjH LxBbcVfw`*0|o~0,5<c,pI)bJBiVHf#iIhۻ/A٪<-Ms+X̔QMf*Etṫu?1ʣAtZ|sc~*R;YYW.&˱*鳐) < wV68STMJj<0J Lcؿ>x6_E2 dC6nΉx3T`xK%4AAl7H+σ`][rSk[Cse+ȟCOseKlMtGh ´z/$9}s;X0)-fC@D>*eߓ 31ÿ,ZG\UL`  쎖vc{o5S )IEobP]]@`څ.$=g%5:}n%"`(ecFc3_oCCޡk2_͇\.su:aq[$3^?!.PCyZm0.un:yãZQ^^m>9qHDw#3Py,MH޽x5teS1 0?@򾼺Tl`"}o4l)i9;bZsBDE3REvbEoCRbǁ;Ն.>CɣʝD c~Csop`4_BVI3ͧU_0P Q(qja-IOIIi[kdjTCFD 0 㢩]Km}c-8r.9ht52Ja1㖃 W"@:\'\#QVd7}r>lXsJ nK7Do qnҁif͓B+?F7:q2;ڲ8.י)+3()ߩ!]]JejfPoۚ&o>3/9웅p Ẁ܊EBj h 7 q3Vm9f,t臣EӮI mu^|DQP9!F3cNX__-TE#Q}l >a#7v輑vG헽7DL71˶nP%FqF#=še 0%ȁR@9\'sKr4ǶcBWfマDpg3뎇գd8ښuMG4FL9MMM]W5=׽3+vXPgb =\Fp?hwN:헡ٕxfDc`D5{6yLvL0~IKP&6Atsԋtϛ;0P HfNS+xV7 ڮ_;,hh(K4SaDhE|"JFƆ*DMF^l͖$wO,A{0A G$owݚpPXSIXl?^PLZQKԄiDžJW=-A{>AhMЎKkZ :7PGQ73bU6 Љž]w\pU_8!Bs2fОr(l/J00aZ*kFp~[`Zmq Tcmk?p3@B`M>2_4C!v1Wo":|_p8TTfZyYM9ZtH6sɕd :τW}_7Ywivd41L{?ĵ<{aȕq'K!@f/P Wk%Pt}i\*C;R0]玊?j<:- khL[\\&]7mτ-ΉJ1 Ϗ':@[;&Il,@iם'U7~,S|2N :@Yg1L~%̇=(lC'/.s_9VןbeH _b .\3-A~Փ̛L<Eg-h2E0vnB|*[mf̓6;pQ8)B44ަ6T f5[Jxpő>b; ,!rބ$!&%w,CDwhsμpf\uwUlϴ""SC|^~*J&))/*Xr.(#375ڂAxvOy ЛĀJ%4Hȷ$xz]7&AzHCqȖ Y>1{ yZ۳5$B~kAYUu:JHE 7=iRwlk/&؞@*x[deCxEOѯFO"okcë+ ,&ڤX:}f)'x#,kYBr]=eD ԕ6.>@M#9:J eSDsMd%e1lX]۴Rp^seybc<-r<}hlR ^Uغ:],JnzK!.@+O3 GIڑ7k߫02U*8"Ჶ+L>.gpa$ ]})9Ǭ 5OXMV7敼!=DK5 x) G۪{vNM/U,IVjX-M ;: "`YnVmF9cs r 3pp983X/dIgWAkmz)g:*Ѿ=_nowe_ICUKǯeWDgމQɒ]~Ŝ_-3w,.,Ԥ&7cd]obP"$1$׏Sll C~g%bJ>BX[x9Qo4Ag^W1Ȭbuiwn6tdt;:eb{I^`?6-,l<EBkq ,hRr1}4SS >KP,VE(n>/O 40:@$+ݲ^o|}vyr}}/ea uY1H8Ih7}Z27;wƁD^ !J%iG;İ 8{-%A9mZ3+>n|9*,Ĵ"9tVU5rL"Gڰ5lWz_B!t#9s[ueTs |M`ŗszaaq K$%b43Ci4y/),vP0tTv.zۀPK1(,?dȣj{T)I?0v[N*q$9Yr3c)@{Ͱ0RD%FWk.E%0IB|OpkY(U敤WXo6^O^t/z66xeیU6 {~R@v029%%bFl[H&3'tiȑqN=~o%O5?q]IYΗȊrzJN+`=|Ỷ_fD5γ Xc=Ni"|I~VQĔ__n$T/ ;;ZMNDt?li-mڷE [@h*TTj'IuW:b"Xo4^SwSZ?':\/yQ&.9}¾$4R _[¶k|[w6 ॊLsȔ :;; ‘jAF!e@`M ++ֽ4=zg9{ 0蹏R硝ÐFt{ȇPs Nd'R1A z{|*E6nlnaogjYdLGhR[<,A}.>9f! K C]:)6ݖ!|-bGR,O(0L۹A16 <<uNs9MѨ_9~kS3J FF]YOWWkggO )=Aqmn誮PB;`/@J,<m_HT1p23`s|.gE.J-[pl<LT羫nhx (kCM2BU>J"xӳN!<*u+ɷ#CQGC!X&O.ݜ9{haaUrxwB֦_-$ʆ qB )dނAlw~#'tvNY\FMt\,,aSߥ7,.K@ާٸVtuU쁲 \ߗ$칃{,p/*_jgŁ[hZxQGg~rd ;j\scH y侽 ߽6U-1 Lщg67bJKPR׫Ĺ,C^Xdm0ˍ\s*AWC{1s&|* lJk7!Ӄ|a7سZn9bPr(X,,V򷃥lٰ/Rlċn'@c/jܫldx<ޏd? frh!9.Pn, i?s0:ER Nvɗ /xwVZ$ l'v"6Տ'7Lƅ65UP(J:Y|_RH; *978*m6gCIIm5r)2H!.(XZ4{iu}[ZX$뎿N y]t*~uꅔ͊nc/cprb t5@8wc3Q}8n@3uEh(Ȗ 7bSiQP)TIz/܉KcB?@bRoR>&?YMc*mf2m[6cmkGEFǙރ|EK/y "@(4Z>6js嗖~R؎)뮿T;0m=7[!9}U:El^0o.SP<|b)"9 ,>){(|Pog~:`}^y %˺8Q}\<3uSsCYnzpIpw4Kwwww\www\'E1]e=k{lЧ2E3\e)>?ȣ+_-))E)o1]sK@W^a&G1oH'7/sX1OATJ!rrk|J>Z:k#rjipqקp8AZځAtBA^Ζ2cZbƝ(+]25Q))Z M~\1$tax;;wvQ,|>j~QV3>Vn&ԝgyy&+egXhɑߏM|ʘ4#1vPğ^Y_zʙ.l$|A6Ԇk1RQ6D0rPi*9%1Z\W^*;TO+}{'~6Ӯe6îȊT4ș4K }Uhk1VⓅx.PoN;b_3uD1`?PQ@z$ ܀OGDJ abTW?*k8Լ܎kӜki-,{  t,8CX䪃Y8+(SQPl!m _FdPJ0Kc,·ck3[l_7 *,үv;ˋL{87uI4`S:9-M2zOޗOf}GMQL.T$_DY{v7̰W];h %X%R]f7Hp&q'q8J7췧,_`/KM,S\^ ,/2_<,c৩%۵7JRfVo.TQ⒝I|SaKYo}WcT᪇ӕgs,)vuS~I] EE7eJ; "gJ"L^+N]^_^]Zc\lAL@I#kEGy11uX84dFTvw670$7%:nIMbKP%Iӂ7*4ʫj+Hl&4FR9Qym[S3t[5A 5rvlll#W7=ͬ@Yj|f-g~d)bެ"_=H@C$/b,a 184HӧFOYײ#8jSrpJl;R:G&,ZPP,{( _]|jG] s2+кnź_Bω nbGocRJ 1nVs3 @f#Ct@g㈾oڿ=|?ϯnK@Xk>H3i($o*}ؓI?,5}kJJe򱏻A]ZOe(FnjdQ 8x%ݧtcUPQ•|eϞ Oqn;}`CŜ>a`/9* K~ u{IЌ05F -u[0 uS Z?QUcz~@y.Upm5#ah՟?6sfxBVpT] ^I^zA.t͂4l)Sg1sP{~QQJv_P>= 4EsO nK=;'E8{zz=djlġTPdIܯ a` h9(y|~0'1eC` zB"baعB .1D^EooET2"C)J11R0_"C>-e[WF7oUC&hX#PU\vvе{"25eڍ=mAoJ'pu 'GO$ 9xZbeZZS߸ {7l=_2}" X_t04e2` e> ߯uy9>) ]=DƋC+ 2ÓSi_t >1oלz8xxqT_ԛ 2xHv$%P#6崄㎊9;2{_r -6 <Y.P(В8G>X`Cw4IeŊV޵3 ~zd;6::}PPh q&w { BT/쫹0k L6 4&B27˝ʼn>6cpBjP(| 9E>Hiߍ XcRʩЀAw!EHo;S]]? &W;ؖy3JMOB*$%Jj iH.wYn DP;C?~w4X.aq_ ZP()r'm8܉mP5:n㲋ded4Ch+I2J(lU\Ѷ_{qrUf]:s8 >%s,UUJ:yRy_cbxC?à\xrxxzxxƏ@2˨罠s 57 hA&iiEzLkR)N[ޗ95u/a~4V]KDd`]Drpd T-~ :~<>k{n4 OSBՒWHGǣ{gWLVB0D~ThPSBi4\_7yr[z#E,:e7 W-LqHdHe/>hw1 -)xq+S4'yPM@?΍?T}l|/D.*3Zz:iD 5VE"$O~O^*:iC'5`̚]g~K4h&fz3E''P@&`Un8rQcfݼ|>jg9mH!-'k 162*Ib+-}A`-iKvb9»+S\Bc4+4 bbv6 H5UC]SUҚi AQN0U*B/Y(J" HaEZ1 jKF[= \4[ PK5򆋨(2.`pA@OuG -mZ|vru-18a Yd6:bUխ6? `m`_Gӱ!"|1H%ӸVwݱM`x;H::.av 8l{,"u#R{*:_v3_UY@dͦߥȂUdB<.>U/"!(׼YVw>#xT@cשK~̊ER!O*'GG Ŝ%sA`D>ngwNmq;"W!%SHdz_cכ6[2;XXRK bBbT7c`_FwE)i6k򥄀.{;HwynLNN.@-3DxG&Q>+;%D;Fr P A(K2̔);GΦ7*I)K>SYgD:ҥwIYiыm ݦM??29=O۩~300N[8_rқ&7 _]9tUl?VVVkFշܣ2 iFQ kbuxT5wx5WoE]E0AZ̶81ʩ pR=f*y.37斟gpn.7Ϗ}o[h U`'08*Q9w|:])V88~,,}JN}$VѲfбG{[ X65orDmeTMTk8Is V m E@ )"uuGcä̕L W;+A+AhpX-X؁V7e7B 4c*a9 =~S+HyIv>MT6-ŨA0}()2&e :>2`M2ۊZ. DZA JTV%e5 |Ն { IKWҾKԀ3*-Ə0LS{ه Jg2&IX̖8g! FH{*uEksӭUB)M.ak3D(\;CxgGUYYiiU}@HO)+!/jchˇDnjiE'%ztijU:U0B)[]iG7n9.qۤ'YusBql%B'`Rlđ <{&u>u(J{(>b9"9u6 ͫ)6w'qM,ҶEX8$~Gvɸ3E~ǐO@xc_]| &7*de%/'d8A,_ &(R&3SY MM|0 =!pqɑFf`<43u#92,G'+ Җ;1c<ws5A]o($x%$5!cCv1I++3I͐U?r}֠^,u$f@sLLL{Z{cRGR7U;aTuu*_o.0t.*Pc?GMuf))4J/q"ȝ)P4^a'ei^iA"QDE}VQ"Σv>/Q']7],}Rՠ(XKf"Uecۺ[46ź6&94kƭmx`}Qp:H+vl|fNNL2deW b K}SM&=6.@R) Ȃ("%I$ z.ò(Djt 6kĥKWUˡkO$mWXKvÿeļ"6>>sLEEg6DsGen,cM][f馳퍑'.^6M/l4g 1czۊtҦDe;=5n=t4>4:>Y>ep-Xh]1[A{dCqɒze2Uщ*H{(?`Zø_LHIl gQvA6D=;N[ _1k1En{tKt NGA{(tr]sh:CY;7aT&% n3 jU&RvD2E=vC\ir`(i{J6+#hGU2kb}@1q<|oۓ8+`qx5\R$rh8 (SD|G، W~zlGp{AA/ެM=șM WQQ 0btg2d}}0m:MMw+ iE6vˋHS@WjB,+mlMa% ~4i|Vw/1r8/0hz:[GE1eFt*ݺw}vc4w |=`]"a<7IoalԄ{ _FI@**6 fIz:&aLgedsTt}'Ŕya6s5U oE/~}7:JŒ{!5Fbt8uzS͑U"9y"# C)ѫPz"ГDŽ~(awi(x_(ʹ{RwG# $-J[YM0__(Ksu.sKqNWllYEW;,aS=?=ڻo^"_wS01C5㸒VK'7rrp$nԋVH­^!r!Ƥ*+ypr3CIWś Wo߶Fa5FzdxGV.Vd:9l /[7@؀(Ҵ,K$kkJJ9y8ަΎInn<"kv1\C5^"餩*akz%ul+"brC$sߖL\(3J8)RQ4Ps g=gD1W!/Dge9w QsS~~W3%έ~Α<#d6;_<ٙn;d fk6ݖ5:D X H]Z1kF:qQ׵fN j>ӉcV7{ךK~0coeu_Z}=UBw~d˸ԗ1"qFBNaxިKx#Ť@}Q}}p*i&sCI_ G<LWТ86TPJH_}DuPdVCyc J#j/|ʊ3^D߀)Va~Q ĕ7iY"~GAK>4,#Kd}I #PE˹T7Z'#?[fȈˈZ#hUb]L>O2eQݲXpŪ yZ(~83kݮxv>찴oAL-Ӏ} LMlՠxY `Q !BԻS8Э?@#=a+l cRS<bj Ƽ!\ֶKƕ%F,~ F/f)PKXV}[|DEdLLZX$8H1d|]]GGA?/)mŁN'3w!HhYxzgy+HՠsjNSVuR)EfiJa$|^vfQ)1I OڍҸyrM2<:8\p1$."zqySRQH qP"hx;|%Ȭv:%O}ɭɢULAND] V]2*}tq]hjʖ[;`l_֤>}zfMm5#Q`{).H$87L"=叵f5 Mb77,v.>-r{1fuXR_X!K)v'#\j zaR=r4 T@~)ּ$yM;b$>I0!> R8gYNoD;&hKj"z2s-1JyUﺾ~o5زD?g!z3@g8†ը;.Pl譵ƄߤlP~ cbۧd.Az,AKhۉl;#^L i*, ^槳~nUǾ%$MEI\ *!/~nffdWn-\\ovz0>7ǫ+eHΘEKNZS9NXP_xq|.c(>Li:Q ?U^x7-OA +wT.:3LS[$< HI'N?nN|z3wU`fZG0ja-D/u.}ȻකˣY٧8rwW*as|Ѻ0|8cdS~0 }4!UL$~ٶ 55aVz]cPJ`DytW晹3G_̣uWTƹ6q G`Eږ"K_5"@;'w)d"j)VrcQ}_ݑ(^O[+ ҌʥBt9^L;8HB*>*t+k4qU6ۆ5m l[.@v#Lp J[P>QV_D|((r'gƐ:3XCa*yGg- r)!) {@d ȇ,ܧ<ݿ$yG3+60COw*:6I9h#VϦjEVXa<]?dX^H[B `b0bd' ՓpdƵ*_i+#Y60 L=nlڛV)jFFfYN?,jdS J,%J(9˷$hhFl9)3_.6"}UCՙ_fQɘܦ6킦 >u5HspZ#R\?A#ש/'hoppLD_Yqkss(zG+;!j^ - 2mmO.k^ך|ݹp?ɉ<΢ݨS,q\0=okNXZyDHX\?JELX~ l|uH4ݿ8*\QZZ[v`5,70I& h'ᅐ9ΚyzpRr3[">%K v ~X!ޏ3k7(;L)/,IAqέ9ScT/z]PeZ3`}!Y*@imm 9_[p>WA"*ᓫSu7NBWw,‹[A\slv }t" 9NLʆAܦSϭF| f&Y0yCtr9i0pID,ӪǬd|p;8 U` WNߝ0%>&G͘xo%[ ax<42Vzޡ-yj;G+"0FG\\^%,%UevcO(hE *˲GpfAr6y!?yL vW|U;%KقIIA_?dQʊ~$S^,U պ9БS&%[UZnB4zS6o56$.OMqY}{16))&t,^|{#^0mFl`QD2n[G<I%Gg\|ҟa,ւ 6H/|7̝rIJP,91"ATbD ? Joli^|,Q8rP-q8 )ԄͯdQ0\oj"e ֜Lj$aIdvW*曔Sni*z=J*]ڑsmn,\v?bzǟ>hu_eQ\vK+K63*&m] x"AY<8M(C_Qqޏ'-M4h+#`PK-Aw,xRQB$C[ecs"B[ ܉c\9 f rʩj88F9Ks~ ]`g8n2hV .K^"Y3D(CCa`ʈ1O%hng`C֡aeC5&SY@ѧ ,(! +"sA8k*%Ox.g[w vh:3']?5W4^Ɂ+5xdB{k#cD`T[)\\FZ ߢ\p` /uFFt**~G8^Ừrfr^scd4$VdV̚qO-FM=AL Ԥ4yg :Z _?E`ͳJcSC.8yyyzwav}&%`DeV. {8~%/(cǎ8m҇-6=hBr<\?`u"F>OWtisa#byvĮUo;R6k/4[$u>_9앒!N1U]Z ֵнt½^5::VXe|v\ g%6 s+u3 Fˍ d_Al !5Uc_DWE70Io싐U!Wc- C1ܫc%!)IOQarEۤxrO%…gh'7nITMD`Nf:" 4֪G]z0*Pck"^F\~&IVrp)sǵmJ,ҷTrELCK>-y )" P-}=JPђtv`wW꒨M#j5xׇ"DԱTfa[$ZSs;pHe6L~3 sI8Ige~Lsu\zM.,j6vrth;źp=rߚEC-DY) Hb^ǠcW*KpI7lo9zdEgN뵤DB'hί$9)jkQ\py_3LveAi'q &B݉Z"HTdtĶIK?}L>{3cbDde8o*ɄoHoTd8"[QO.w5V ý- yɃe#fXKVl}ЄMt yo<|>hӗ$u1Uumٺ d!d-sa_`4i3!U;'ůJ{ƚOsk%Y7 s\PtP_]]gTzߊ/r[S_:R1K]ׂYtN7:nts{owAhmeC/ u%axխ=:nDSo6X; /;krsI#%gZr$GHot{o}@,9Mw5۔j|#aGO!%_Wʳ I'޲M)-Y&(ԗ&vgҋ&9 7_2'uJek0WՑ9S/:b~=8l22~mD 5Ss ?2΍_siums>qw`ֲnT2MFA#*[$쵽L1p-g'mXz3@LFKb &{ ĥŝ5mͶXPxa6I&ZCNIUZ#%%K2N75 (1%/m4(K-WLGs ޗ+SKW >zWۉ$<6|֥%%d"Xݍ^@bLW+_|7X\n0öG1ePFO-5}ViŞS##rU <; muC n#K(^M|*}1T`\zQȬS+_JZrÆ6Wy%Qru"/c:f4WGo?t^?!9|Vr; qLfcv\LJ6Ue"I,ast-[҈YO_6\"Rxp((+]&?JM23dn.⾙Ũ?j"{JjViL@anx UucA~z119X=r]\\T9 ϘOYhI2QqCpvҲJ52dHgmJi]h$YY>1ul N7-)uҟttHHtत]پQÓðr*k@:h_)8v3_8}G Rp!+R7zm1*;$?C1ӆz;! ^BC. uR?¦r*:믧:::6V„9EF>f=6uyŐ/㩘 . :-( LR%|P(NL[v@d~?ћhC׈ݾffHI= H]Oz=2ɩddy5QcI wY!D1i.kzI-7Mv^j>?y;?=3p1N^ QDtP) G^'PWE4RUb}ą@`WŃ#&Gl1˃ "hpagk{eܽP,>3kQnF'cu s!\KEV79wCY*s,=P"ǂ)pՂKkk #. Nۄ)5~ ́/X3ҒQSYu,-WP\(Eg9>ta;^8 כ s+umg>0A%4`e41-py) ӯ|ӘUA[G"e)Tc]SŻ7}j$BrL}Y_Ч +ўu0Ñ+RB k"AzwYz pr\fڨ~r#WK+ ~(]C|9eGp=>"eFs[R$F>jQ㻝0Cu<Acm$^.߷;GT9 e D<ǒM15>hdR !KYE>48OafJM}غ/pJH}h FK] QP,M$JպnY!2q55TP$An@h֘cz6VyN>5|IP \hб,֔)07FezgٳEuPyj܄8&~_`$q1oi<> Vi Om fBLEZv(25>ƨ- ؞Kܦe{&r!nS0b <|yKC|_EL.omHct䁲+v(Ozjyr~$xDhbҠMmLLca^%3=uլ.8|`NćtX43Cld36EZb/LӺKXPD` ,6&A[^ I.:MhrwM} YߝwEXYa2e]^tP|~O6(((=E*"(f? g5#53ߣۂx_aW d"eғ<&y<"f"|/ 6)|Zӟe4rj8RQR4rߙI &ϥ4\`&Pgq9f/m8ikvExKhBxkER.`!R_>{Ra|uizcTΨrIWz/C<A-mH:S c>? [IrO Qyx]4&Ė$| ;o6L׮)+$>Ӷc>-4pw7t}1v:E^^}q!(er~@>?#┍>%{:d E1S ȴp@؀o`jn]?J~9 qjB\-qVC-S57_F+C8Q\0a0YUme oŜLH *Q";gm$[m5KVt^si9YDG-l_H˶ߕ.1ؼ E;64D8&JLђKb5հwD5u]{Gvn1B'T8]$ ×GAWa_s8\62ڍ6ErV=-:uul]F\ᠠ ~Lx FTo.ٶ=4O9)j͑k9$jԜ"@YݮhǪcjEX O3$f: wv6q U0OگhO@6&)v6?;L aD t˓0Ov1VFHkBcRVƵmYnW 9Į[J'O),]]:};!)CW2W"$ˉ{`!++ IvB}Y1p FbPRXL&jJn>P>9+%+-A_(^N.:⭣eGI&ݚfS(B ^g^< Lfx Bz8kɘG 3{4'`pnyIY bV5N:,3EZrMsǤ@4^U~15^Bӝ3|bM_gfpXJ`؝p> ,v},E >qϬ!_R׎X$omV./3<4@ )s]v a>R+K]ߗ,Bf nd)@NgXL9yHWK_a`%?>EI[U lH:OE{eHo|6~A;-*WWm`&-/1'Is!ofpG`h9X9 O C'RLxxOj}`O^ SOeS3(KB"" \q̺=t-#,e+S( GZ7򻰅Of 4,^FHò$I-U(IHx^Xy5VU{r* gj{m>&RHf9 X:d00I>U>>~Zt{RRnƥPא:͑icM.bTvgkt؏$B_ O_ӛAwt5%ew[F|L.5R"O4_z㟟:j #TKQ?UAЫ*Jzϥ 3ViIʙ%! Т<̓Mf>7l^z!*bct NJFDirh4EX--Ϳ嗊Qw10ԓ"<"i]'{qc8 v ڹϋ<@@Zh~WG$qnd jdiگ_w&Fi)t(Wm!cμ kiIhvAVaO!n@c٭ XܕPNIaD Cm59 އsx9Pcjd-_£)kʽNkM0 Z55:)dL :k~NhFEhփ*@ BFa kґp q幊ݢcm5N Sm\iIg,XlOiՄ[עC-1::Il1>b6aRt`mkeyz|(3B-Fmt7lm\hS\@ѧXe<R xPP6~[Pg9gI81žӺsXo5L%]Ӣ_MX<f9/sgrvi@g&[2Dny e⢆<{Egg%%xyYW? d-fo!ynJI8x 8̎4U_g)4 :j(x}vm.]9/μVح )Ao~[X`K}Ipx I^L@V*?ag^C b nn;/|i,V+455SBCC=[ oD*׻b{6M;ŗ¦3pESo `mm[c~KXl  :@,7SW¢RW(`]PIz)Oʉkf&S:;=S7::!+I@:KBɽr7jȱa o q#6Yiu;b+i=eoVP(i{/ň0>8m7?\D@tӐEܢcWDk؎ݖ{ˀ|VOBېpkcaM?eۮtl!0E]aDmI޲u(Ɓ69u;s6S)b``90pN&6~sZA@"ckYp(!CQ31KG D Y}X)zppIԀ7"N(I|fWa)^K&J}}$n:Χ"w<Ē_鑺 +/?gKC 9Rwk,e51ˀGfz5 ]nH<evVz\+!~ϧI(Dt ޅy̸uT}8V6^Nc93̵n-mO}< X7N)JqYGwZr̮Vp^r߲BE\qo<݉o 1y(Rc^mF 8*Me%e69c{~ 1Ampo=$$[y_ 0d>2225<">mD=ܭ 6inlIeL[kUl9.)6, jӸ_I^m[hnbU5/3\w08e\91^L"I}*C2b.E>w 3ya.sh jg 6mQ+ߥA^+\ӈAzpp>j#t{#Jom@5|u>Z|p) 㼞l؉ `keO9 V wAo2V{-|5N9?A <ߘڪ5`޵v'KZO) eڲz5S+ DϞB6 ޖX] +Ui^A0yivm;t݃QEB`Jw~$r#eFs-NBLv֨g!Bܽm!ߺUhfǞ?o;^"81?F!iɌ+?:.N,u]jq붪hjfcgOI%fzz/pn]'WL[{'$|yuInf\э7{뜒xF1E ǰ+I*)L]4W3zgDB0^p A6oykؒWn!G)B.?%Ĉ5" I@yi:iPptJ: M/h=taLcG7WZ,9>#ഈaXR* 0$pljW&ςHaƼ A$ ($/bV?q cB<,x訧iUFU oywT@{O3p]'W ~VHES?uۜ ?(.)hѩqr6VV8g&2"͞m7N4d՗UL;;81U􅔽  Ύ,(?eits}E\0$nO+m 8<BF}Hn٤Tzi22&Qh#hԕTO{.L3pn GVDOAAc"k"f'ϻF~(لj6 |5W{SL"F1p4vS@ԤO4T?i-G @{Mm>UؑJp3RV5/c[ksmE7 YB<$PP6;h^3W7I>FPq1!8 ћ҅P?_J-](h~ToC9I\{Q:˺ջco=ih׵2JݖQ2Q em]o2XB^ϫngOw~@<$},sg_tZMMKKiwp,% O)@}`Sgn8?n~Q 3!w+"|Ц&S '旭^R燩(y7xG<^?C5l)3,ر.% ؒ./djr-ZxUFb(=3?!i+l)VH9ϡ2*;.3S"~z$7jE)aL-x^Ӵju筼H۸*2I]'Gv.~F 33b`~sQ`NZVj ӫٷkTOi Ծ3MVGRT^_YFM_F=йŗ˩:!ݿt.7~2i`J-4{*$Y2d EVRs!ۨFhEyRN+%^«'~ΛZ'K,RqZJk!X-#6M$%3 ZKcnfjKˡآ 1ey9ѷɿJ__ .ڲ.;0ݔ4 74J̘0luʭ*EȨjEZZOQ0A5maa>4Sᙈ> fVX:oۡ_k(K%+=X5ʽ4.lRK퓎#5?xIW]I*tÈzxUZd}('| lEv៪3%3ȨAVaq"%sÙ/rR*K RoezIr܎)1B,׬lo% Y)oً񿽒 Zao~df[7PC]X/fO{orl{o\i Os;s !xB&U3ɀHG!DXz1#]1F5P[kvODpD G5S8OCv㗣ܢFWpǵ.0WЋJ~Y#k䟗;]N23=-7ȸ8ivuaBƣ& 4R 1[Ջu-j (HvQ?xW-y7qK~w޸3eֽ\]\\N)>;>Yᕊh<%S[ H58C] |8* (_ `ʀ!o<cU*XBwyAdV7ߋq Xa&Z,q+"nPCc$UUUW ۻe D &i [)ǣ{zs5gD:)l 22D(lI(t?端hefq}(ph_ڈ{c<֩r<*ElHR&!j&Z㖹X2G)JYk6ƥϗ!mM^rs8\:@??m-^ ѢW'`WS1#0 Bunʁ9}$ :ȎQ+f1oa$FUՉ/6"jJbqn0aF[9yABDj;M-@@rƋry|J>$|A͜ Za>s eyI݁mC-XSRs`j9#Ò-ߢ"Y1+ƚ'VP9=J,+;$Ϯa7/2e%DErN6mHuyԟ1L= Gr2l-X-fѭ ,・KW$B壃.5Ֆ=u$g+&`ԋD`2iAW]5tZ#E%9yy0_#5q6CD9"-rCj8_Fĺ&&{ Ej?DJ(% }Z (׋AeUcי}{C’]3и hv&U6)ЯoջbPw~0}ULAd f67w\zXwFY׏|;Ƽ( ʋNGAŘ^ AKw`ibdO*KWLx?t@P6ncyĺ3l򑠆1NinaxW~څ 6Ȝ7UuXkɆ`pgH7G"4@1ض+DԚʼ=oBCZCjfsF*\o"3fX^rHggc3?jR].&`IAp@X[ j#w@- Cfb2Z%)=wa}gĨ.&&qmޯk`y_wJ%{P?㎉SH7ѤpOAr7C}=)kB彆:N N.{z)ёN$W7mĽ )$i92F A[娠{vPn\\&L訒Q`*߆+r.4CEwYO>[:t@#甀A`8``f%'iuJJԧc~ #1 :-h"Out+r$ '˺o(J:oU4r;BT`?/ߙ18NJ=+Ykx4m"B03+VڅzsŸ L!.>cHAN q2ϟƯd6C$Vh4POFk "j1+9sO`0]ݦ[-oLW7)BO]ڟ0 = mdʭW^~3zUH:Z-JO5[56,%AsV !_0(zLL̄Yp#)E]=3mD6X|'xh^*s̫inn7E̔!Y8% dO-Ka P6K2!6S݃ -۹qg64S=#~:Ky?HNm&u`/=;4$="Q` 7[hl|OgǕH }:th*F~x_~)[ywz H 7؅m;5ˆ YLh*iy,#RC> WlƯ}fNn[j;wj-~ <7jvʾ9|h|DoSΔ)<^-q]Osb'.TUdkNb{TU[w3gi$[%ξo~hQoCWķUJ)j^ۦK ]]$?H'dϬF֋=QlbuuIh7|19k}hɸ! GqG^g^oۂ 8h{եsYI l1@p RZe{ 5Pv~L]}Xn??*|D9LH9~ky+gXDP<)n2؜{h$r΀/+An &r*X b&kbs'>yǻaDZS?A[A ֨QūW4YR;&l!5/+7W9o R*:.b heLl̮:<\V>U׻mv;e^d&5T_PIbfn}J+îƼ~Au{ΩGJtDIF&y,!7,1cxCYGFM[\S'JO 0:[1fH\YwYk u&Y&Mmh$3ټn|/iZ9/!?QLpO@^\"!Obl슳Yi:w9*~o?³k ATԣgu=1I*g(bB#IL*aXgH['^xrmR*_g|(-PWD E˴2쌙u݀a_X"UJڑY9A;Ym{JjzwPXY޶p eẩ?mUN%Bqinё@JD( O ''аaeEK{Uwdpi ݀Ӭ8V/rCs(`:#P@'3%nY=uSB@اI`i,yKfc?tZkZ5k=>m!_q&өG#: d*\kxf0 21F(I&䬨:dLLn8M]~c7TA>gTa9@5HxM|X0%9A6jOkMj\\XoB9jbx1R_ŭܿ(I#{G2"?O-99;ļDꗖ!|>hbQRvQn;*`*?vWŇ`wjw kɇ?9ѹMI%MT|6*#6_jUQ1\KNS{$ϺI 1[?<o,,4*pRַ!οBV{f6X@4.Lp96a@.\݈!.Dړ\nPЍ3Ƀ-&sCCs\~KE3Q| ((ys|}BT/Ng÷Ez?PPhS<Te4D4l5")܍nuFSY7m ڴB82Y&R&.lKO1pRjV,ŧ ve{5>g0clEFeg=t@ڿe3u_eP|R+j{տ2.7cwEd ݝxE`pI ?e.]n4?Rڒ`=@jA^8XL+3q[ЎL_YwO'%W[%<έ]$|}ƫ[s2#]jt+O mi.Ѫ#2m߰=M6d$P4}bFДL#fqq#i;VWMB _חAFWyn>yWO0t:wNEX㈥lݨ?,d%d%DM,N (|@HʼnVR>sf1UfUy˪vCH'8*g3 %{ /ȅIa iwpY%g6TVl/O&lPP<A 'XX^=Ma#!W\E$xtvfyWu|;$jh1+O`zwc$~YCU_B.E':6l^ަ+y/f{IqC\\90TVP5t>A#=yE[-ϋ]/0esGI=ηpvϪϟWLe1uYe}ЧڒVXH``TDO b"+_(:K[&L1;mIY_v5@n~^B_I_R ?-j*<ܖF@%PſI}3Kt@2Wrvt\?jFVq7P>#r%Œ-mG ` ᘕ5d3]hu߫R0H%WFU]U6$yGxQ^SAbxX̏ @߿GF8VL&Rr[Z,f7%&pXf=2Zr'!+,Fii%Φ4u=myUbݲ5<_"V RZIK?]LJIa l*g"ɺ!}d,1h4 I@|RoB 1)SiDogfۦAIfuAZ~s1gWUNL 3wEޯ/A`}f[E{$Cp. ]wwww! \w{UTQ4>WNF{˃C@o-815Su#֜$8 JIYղ QV#Tgax9Ш~;NdfZrVm=2~Y[rF%G:}x-_9U.r;S (j zA./L _H-ZۉߐH**bO?w4boq>#l|Wuhrac@qxudA7a=Lhi#~w\W%ywH@$ngG?е`gX;seĎp%st33뼀h0gQwZyCe *79픯¶:$aM_K #O*A.O{usI[T ׬"X7Ѽ[oh k@u>B 53.ձ(Y :|T@MϺ>J Nyd "D wflݏ"70}^86JeIHK"B=J)F/ċ}>$^CYP:h+%D'ţ)V0 B"fhݱw鲈(puE, CFt#ZB[4n58:B/|n[W $L8kWac<*˶N}>wCF4(C-9QƍZރۨx׶n3gu7[X"0˾_[0U9+0+C .ߞz-LB]) %n# -:#R@/ Ϗ\pg! :;*ܽ/4t=HBۏxLUwRVU_%/D̹ &ec> ~%1>+h% I7npf= }rRc΅͖¯~A@I$6- 0#sV/=|~GYЃ/b~k 0_Pa"X _ݒ әNވ:+i]ECMdM[sh97"7ֹ(Y X㭺B,y@ר)/Oj/$b^dw[6ۅV 0r*uVk@C00zy # 0ߐ0ԯG A3 EXJ:5/+;J|>az@cU2|Y.Ri*̼X|6f[O{ZQ1+hdWLa޲la 8jnE~>5be#@bY&i@AΌqE x k$aan4O7qʷs d OJ }iiFȦD1;C I+bcԸ):5[ع|G_~[WxygizHY[s> y8AJ^1] -